def test_bucket_index_multiple_buckets(self): """ Ensures the expected index is returned when multiple buckets exist. """ parent_node_id = 'abc' r = RoutingTable(parent_node_id) r._split_bucket(0) split_point = (2 ** 512) / 2 lower_key = split_point - 1 higher_key = split_point + 1 expected_lower_index = 0 expected_higher_index = 1 actual_lower_index = r._bucket_index(lower_key) actual_higher_index = r._bucket_index(higher_key) self.assertEqual(expected_lower_index, actual_lower_index) self.assertEqual(expected_higher_index, actual_higher_index)
def test_split_bucket(self): """ Ensures that the correct bucket is split in two and that the contacts are found in the right place. """ parent_node_id = 'abc' r = RoutingTable(parent_node_id) bucket = Bucket(0, 10) contact1 = PeerNode(2, '192.168.0.1', 9999, 0) bucket.add_contact(contact1) contact2 = PeerNode(4, '192.168.0.2', 8888, 0) bucket.add_contact(contact2) contact3 = PeerNode(6, '192.168.0.3', 8888, 0) bucket.add_contact(contact3) contact4 = PeerNode(8, '192.168.0.4', 8888, 0) bucket.add_contact(contact4) r._buckets[0] = bucket # Sanity check self.assertEqual(1, len(r._buckets)) r._split_bucket(0) # Two buckets! self.assertEqual(2, len(r._buckets)) bucket1 = r._buckets[0] bucket2 = r._buckets[1] # Ensure the right number of contacts are in each bucket in the correct # order (most recently added at the head of the list). self.assertEqual(2, len(bucket1._contacts)) self.assertEqual(2, len(bucket2._contacts)) self.assertEqual(contact1, bucket1._contacts[0]) self.assertEqual(contact2, bucket1._contacts[1]) self.assertEqual(contact3, bucket2._contacts[0]) self.assertEqual(contact4, bucket2._contacts[1]) # Split the new bucket again, ensuring that only the target bucket is # modified. r._split_bucket(1) self.assertEqual(3, len(r._buckets)) bucket3 = r._buckets[2] # bucket1 remains un-changed self.assertEqual(2, len(bucket1._contacts)) # bucket2 only contains the lower half of its original contacts. self.assertEqual(1, len(bucket2._contacts)) self.assertEqual(contact3, bucket2._contacts[0]) # bucket3 now contains the upper half of the original contacts. self.assertEqual(1, len(bucket3._contacts)) self.assertEqual(contact4, bucket3._contacts[0]) # Split the bucket at position 0 and ensure the resulting buckets are # in the correct position with the correct content. r._split_bucket(0) self.assertEqual(4, len(r._buckets)) bucket1, bucket2, bucket3, bucket4 = r._buckets self.assertEqual(1, len(bucket1._contacts)) self.assertEqual(contact1, bucket1._contacts[0]) self.assertEqual(1, len(bucket2._contacts)) self.assertEqual(contact2, bucket2._contacts[0]) self.assertEqual(1, len(bucket3._contacts)) self.assertEqual(contact3, bucket3._contacts[0]) self.assertEqual(1, len(bucket4._contacts)) self.assertEqual(contact4, bucket4._contacts[0])