|
@ -6,7 +6,6 @@ |
|
|
#include "test/test_bitcoin.h" |
|
|
#include "test/test_bitcoin.h" |
|
|
#include <string> |
|
|
#include <string> |
|
|
#include <boost/test/unit_test.hpp> |
|
|
#include <boost/test/unit_test.hpp> |
|
|
|
|
|
|
|
|
#include "hash.h" |
|
|
#include "hash.h" |
|
|
#include "random.h" |
|
|
#include "random.h" |
|
|
|
|
|
|
|
@ -49,6 +48,17 @@ public: |
|
|
{ |
|
|
{ |
|
|
CAddrMan::Delete(nId); |
|
|
CAddrMan::Delete(nId); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Simulates connection failure so that we can test eviction of offline nodes
|
|
|
|
|
|
void SimConnFail(CService& addr) |
|
|
|
|
|
{ |
|
|
|
|
|
int64_t nLastSuccess = 1; |
|
|
|
|
|
Good_(addr, true, nLastSuccess); // Set last good connection in the deep past.
|
|
|
|
|
|
|
|
|
|
|
|
bool count_failure = false; |
|
|
|
|
|
int64_t nLastTry = GetAdjustedTime()-61; |
|
|
|
|
|
Attempt(addr, count_failure, nLastTry); |
|
|
|
|
|
} |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
BOOST_FIXTURE_TEST_SUITE(addrman_tests, BasicTestingSetup) |
|
|
BOOST_FIXTURE_TEST_SUITE(addrman_tests, BasicTestingSetup) |
|
@ -519,4 +529,155 @@ BOOST_AUTO_TEST_CASE(caddrinfo_get_new_bucket) |
|
|
// than 64 buckets.
|
|
|
// than 64 buckets.
|
|
|
BOOST_CHECK(buckets.size() > 64); |
|
|
BOOST_CHECK(buckets.size() > 64); |
|
|
} |
|
|
} |
|
|
|
|
|
BOOST_AUTO_TEST_CASE(addrman_selecttriedcollision) |
|
|
|
|
|
{ |
|
|
|
|
|
CAddrManTest addrman; |
|
|
|
|
|
|
|
|
|
|
|
// Set addrman addr placement to be deterministic.
|
|
|
|
|
|
addrman.MakeDeterministic(); |
|
|
|
|
|
|
|
|
|
|
|
BOOST_CHECK(addrman.size() == 0); |
|
|
|
|
|
|
|
|
|
|
|
// Empty addrman should return blank addrman info.
|
|
|
|
|
|
BOOST_CHECK(addrman.SelectTriedCollision().ToString() == "[::]:0"); |
|
|
|
|
|
|
|
|
|
|
|
// Add twenty two addresses.
|
|
|
|
|
|
CNetAddr source = ResolveIP("252.2.2.2"); |
|
|
|
|
|
for (unsigned int i = 1; i < 23; i++) { |
|
|
|
|
|
CService addr = ResolveService("250.1.1."+std::to_string(i)); |
|
|
|
|
|
addrman.Add(CAddress(addr, NODE_NONE), source); |
|
|
|
|
|
addrman.Good(addr); |
|
|
|
|
|
|
|
|
|
|
|
// No collisions yet.
|
|
|
|
|
|
BOOST_CHECK(addrman.size() == i); |
|
|
|
|
|
BOOST_CHECK(addrman.SelectTriedCollision().ToString() == "[::]:0"); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Ensure Good handles duplicates well.
|
|
|
|
|
|
for (unsigned int i = 1; i < 23; i++) { |
|
|
|
|
|
CService addr = ResolveService("250.1.1."+std::to_string(i)); |
|
|
|
|
|
addrman.Good(addr); |
|
|
|
|
|
|
|
|
|
|
|
BOOST_CHECK(addrman.size() == 22); |
|
|
|
|
|
BOOST_CHECK(addrman.SelectTriedCollision().ToString() == "[::]:0"); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
BOOST_AUTO_TEST_CASE(addrman_noevict) |
|
|
|
|
|
{ |
|
|
|
|
|
CAddrManTest addrman; |
|
|
|
|
|
|
|
|
|
|
|
// Set addrman addr placement to be deterministic.
|
|
|
|
|
|
addrman.MakeDeterministic(); |
|
|
|
|
|
|
|
|
|
|
|
// Add twenty two addresses.
|
|
|
|
|
|
CNetAddr source = ResolveIP("252.2.2.2"); |
|
|
|
|
|
for (unsigned int i = 1; i < 23; i++) { |
|
|
|
|
|
CService addr = ResolveService("250.1.1."+std::to_string(i)); |
|
|
|
|
|
addrman.Add(CAddress(addr, NODE_NONE), source); |
|
|
|
|
|
addrman.Good(addr); |
|
|
|
|
|
|
|
|
|
|
|
// No collision yet.
|
|
|
|
|
|
BOOST_CHECK(addrman.size() == i); |
|
|
|
|
|
BOOST_CHECK(addrman.SelectTriedCollision().ToString() == "[::]:0"); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Collision between 23 and 19.
|
|
|
|
|
|
CService addr23 = ResolveService("250.1.1.23"); |
|
|
|
|
|
addrman.Add(CAddress(addr23, NODE_NONE), source); |
|
|
|
|
|
addrman.Good(addr23); |
|
|
|
|
|
|
|
|
|
|
|
BOOST_CHECK(addrman.size() == 23); |
|
|
|
|
|
BOOST_CHECK(addrman.SelectTriedCollision().ToString() == "250.1.1.19:0"); |
|
|
|
|
|
|
|
|
|
|
|
// 23 should be discarded and 19 not evicted.
|
|
|
|
|
|
addrman.ResolveCollisions(); |
|
|
|
|
|
BOOST_CHECK(addrman.SelectTriedCollision().ToString() == "[::]:0"); |
|
|
|
|
|
|
|
|
|
|
|
// Lets create two collisions.
|
|
|
|
|
|
for (unsigned int i = 24; i < 33; i++) { |
|
|
|
|
|
CService addr = ResolveService("250.1.1."+std::to_string(i)); |
|
|
|
|
|
addrman.Add(CAddress(addr, NODE_NONE), source); |
|
|
|
|
|
addrman.Good(addr); |
|
|
|
|
|
|
|
|
|
|
|
BOOST_CHECK(addrman.size() == i); |
|
|
|
|
|
BOOST_CHECK(addrman.SelectTriedCollision().ToString() == "[::]:0"); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Cause a collision.
|
|
|
|
|
|
CService addr33 = ResolveService("250.1.1.33"); |
|
|
|
|
|
addrman.Add(CAddress(addr33, NODE_NONE), source); |
|
|
|
|
|
addrman.Good(addr33); |
|
|
|
|
|
BOOST_CHECK(addrman.size() == 33); |
|
|
|
|
|
|
|
|
|
|
|
BOOST_CHECK(addrman.SelectTriedCollision().ToString() == "250.1.1.27:0"); |
|
|
|
|
|
|
|
|
|
|
|
// Cause a second collision.
|
|
|
|
|
|
addrman.Add(CAddress(addr23, NODE_NONE), source); |
|
|
|
|
|
addrman.Good(addr23); |
|
|
|
|
|
BOOST_CHECK(addrman.size() == 33); |
|
|
|
|
|
|
|
|
|
|
|
BOOST_CHECK(addrman.SelectTriedCollision().ToString() != "[::]:0"); |
|
|
|
|
|
addrman.ResolveCollisions(); |
|
|
|
|
|
BOOST_CHECK(addrman.SelectTriedCollision().ToString() == "[::]:0"); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
BOOST_AUTO_TEST_CASE(addrman_evictionworks) |
|
|
|
|
|
{ |
|
|
|
|
|
CAddrManTest addrman; |
|
|
|
|
|
|
|
|
|
|
|
// Set addrman addr placement to be deterministic.
|
|
|
|
|
|
addrman.MakeDeterministic(); |
|
|
|
|
|
|
|
|
|
|
|
BOOST_CHECK(addrman.size() == 0); |
|
|
|
|
|
|
|
|
|
|
|
// Empty addrman should return blank addrman info.
|
|
|
|
|
|
BOOST_CHECK(addrman.SelectTriedCollision().ToString() == "[::]:0"); |
|
|
|
|
|
|
|
|
|
|
|
// Add twenty two addresses.
|
|
|
|
|
|
CNetAddr source = ResolveIP("252.2.2.2"); |
|
|
|
|
|
for (unsigned int i = 1; i < 23; i++) { |
|
|
|
|
|
CService addr = ResolveService("250.1.1."+std::to_string(i)); |
|
|
|
|
|
addrman.Add(CAddress(addr, NODE_NONE), source); |
|
|
|
|
|
addrman.Good(addr); |
|
|
|
|
|
|
|
|
|
|
|
// No collision yet.
|
|
|
|
|
|
BOOST_CHECK(addrman.size() == i); |
|
|
|
|
|
BOOST_CHECK(addrman.SelectTriedCollision().ToString() == "[::]:0"); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Collision between 23 and 19.
|
|
|
|
|
|
CService addr = ResolveService("250.1.1.23"); |
|
|
|
|
|
addrman.Add(CAddress(addr, NODE_NONE), source); |
|
|
|
|
|
addrman.Good(addr); |
|
|
|
|
|
|
|
|
|
|
|
BOOST_CHECK(addrman.size() == 23); |
|
|
|
|
|
CAddrInfo info = addrman.SelectTriedCollision(); |
|
|
|
|
|
BOOST_CHECK(info.ToString() == "250.1.1.19:0"); |
|
|
|
|
|
|
|
|
|
|
|
// Ensure test of address fails, so that it is evicted.
|
|
|
|
|
|
addrman.SimConnFail(info); |
|
|
|
|
|
|
|
|
|
|
|
// Should swap 23 for 19.
|
|
|
|
|
|
addrman.ResolveCollisions(); |
|
|
|
|
|
BOOST_CHECK(addrman.SelectTriedCollision().ToString() == "[::]:0"); |
|
|
|
|
|
|
|
|
|
|
|
// If 23 was swapped for 19, then this should cause no collisions.
|
|
|
|
|
|
addrman.Add(CAddress(addr, NODE_NONE), source); |
|
|
|
|
|
addrman.Good(addr); |
|
|
|
|
|
|
|
|
|
|
|
BOOST_CHECK(addrman.SelectTriedCollision().ToString() == "[::]:0"); |
|
|
|
|
|
|
|
|
|
|
|
// If we insert 19 is should collide with 23.
|
|
|
|
|
|
CService addr19 = ResolveService("250.1.1.19"); |
|
|
|
|
|
addrman.Add(CAddress(addr19, NODE_NONE), source); |
|
|
|
|
|
addrman.Good(addr19); |
|
|
|
|
|
|
|
|
|
|
|
BOOST_CHECK(addrman.SelectTriedCollision().ToString() == "250.1.1.23:0"); |
|
|
|
|
|
|
|
|
|
|
|
addrman.ResolveCollisions(); |
|
|
|
|
|
BOOST_CHECK(addrman.SelectTriedCollision().ToString() == "[::]:0"); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
BOOST_AUTO_TEST_SUITE_END() |
|
|
BOOST_AUTO_TEST_SUITE_END() |
|
|