def test_remove_contact_with_cached_replacement(self): """ Ensures that the removed contact is replaced by the most up-to-date contact in the affected k-bucket's cache. """ parent_node_id = 'abc' r = RoutingTable(parent_node_id) contact1 = Contact('a', '192.168.0.1', 9999, self.version, 0) contact2 = Contact('b', '192.168.0.2', 9999, self.version, 0) r.add_contact(contact1) # Contact 2 will have the wrong number of failedRPCs r.add_contact(contact2) contact2.failed_RPCs = constants.ALLOWED_RPC_FAILS # Add something into the cache. contact3 = Contact('c', '192.168.0.3', 9999, self.version, 0) r._replacement_cache[0] = [contact3, ] # Sanity check self.assertEqual(len(r._buckets[0]), 2) self.assertEqual(len(r._replacement_cache[0]), 1) r.remove_contact('b') self.assertEqual(len(r._buckets[0]), 2) self.assertEqual(contact1, r._buckets[0]._contacts[0]) self.assertEqual(contact3, r._buckets[0]._contacts[1]) self.assertEqual(len(r._replacement_cache[0]), 0)
def test_remove_contact(self): """ Ensures that a contact is removed, given that it's failedRPCs counter exceeds or is equal to constants.ALLOWED_RPC_FAILS """ parent_node_id = 'abc' r = RoutingTable(parent_node_id) contact1 = Contact('a', '192.168.0.1', 9999, self.version, 0) contact2 = Contact('b', '192.168.0.2', 9999, self.version, 0) r.add_contact(contact1) # Contact 2 will have the wrong number of failedRPCs r.add_contact(contact2) contact2.failed_RPCs = constants.ALLOWED_RPC_FAILS # Sanity check self.assertEqual(len(r._buckets[0]), 2) r.remove_contact('b') self.assertEqual(len(r._buckets[0]), 1) self.assertEqual(contact1, r._buckets[0]._contacts[0])