Changeset View
Changeset View
Standalone View
Standalone View
src/test/addrman_tests.cpp
Show All 31 Lines | public: | ||||
} | } | ||||
CAddrInfo *Create(const CAddress &addr, const CNetAddr &addrSource, | CAddrInfo *Create(const CAddress &addr, const CNetAddr &addrSource, | ||||
int *pnId = nullptr) { | int *pnId = nullptr) { | ||||
return CAddrMan::Create(addr, addrSource, pnId); | return CAddrMan::Create(addr, addrSource, pnId); | ||||
} | } | ||||
void Delete(int nId) { CAddrMan::Delete(nId); } | void Delete(int nId) { CAddrMan::Delete(nId); } | ||||
// Simulates connection failure so that we can test eviction of offline | |||||
// nodes | |||||
void SimConnFail(CService &addr) { | |||||
int64_t nLastSuccess = 1; | |||||
// Set last good connection in the deep past. | |||||
Good_(addr, true, nLastSuccess); | |||||
bool count_failure = false; | |||||
int64_t nLastTry = GetAdjustedTime() - 61; | |||||
Attempt(addr, count_failure, nLastTry); | |||||
} | |||||
}; | }; | ||||
static CNetAddr ResolveIP(const char *ip) { | static CNetAddr ResolveIP(const char *ip) { | ||||
CNetAddr addr; | CNetAddr addr; | ||||
BOOST_CHECK_MESSAGE(LookupHost(ip, addr, false), | BOOST_CHECK_MESSAGE(LookupHost(ip, addr, false), | ||||
strprintf("failed to resolve: %s", ip)); | strprintf("failed to resolve: %s", ip)); | ||||
return addr; | return addr; | ||||
} | } | ||||
▲ Show 20 Lines • Show All 326 Lines • ▼ Show 20 Lines | BOOST_AUTO_TEST_CASE(addrman_getaddr) { | ||||
addrman.Good(CAddress(addr2, NODE_NONE)); | addrman.Good(CAddress(addr2, NODE_NONE)); | ||||
BOOST_CHECK(addrman.GetAddr().size() == 1); | BOOST_CHECK(addrman.GetAddr().size() == 1); | ||||
// Test 25: Ensure GetAddr still returns 23% when addrman has many addrs. | // Test 25: Ensure GetAddr still returns 23% when addrman has many addrs. | ||||
for (unsigned int i = 1; i < (8 * 256); i++) { | for (unsigned int i = 1; i < (8 * 256); i++) { | ||||
int octet1 = i % 256; | int octet1 = i % 256; | ||||
int octet2 = i >> 8 % 256; | int octet2 = i >> 8 % 256; | ||||
std::string strAddr = | std::string strAddr = | ||||
boost::to_string(octet1) + "." + boost::to_string(octet2) + ".1.23"; | std::to_string(octet1) + "." + std::to_string(octet2) + ".1.23"; | ||||
CAddress addr = CAddress(ResolveService(strAddr), NODE_NONE); | CAddress addr = CAddress(ResolveService(strAddr), NODE_NONE); | ||||
// Ensure that for all addrs in addrman, isTerrible == false. | // Ensure that for all addrs in addrman, isTerrible == false. | ||||
addr.nTime = GetAdjustedTime(); | addr.nTime = GetAdjustedTime(); | ||||
addrman.Add(addr, ResolveIP(strAddr)); | addrman.Add(addr, ResolveIP(strAddr)); | ||||
if (i % 8 == 0) addrman.Good(addr); | if (i % 8 == 0) addrman.Good(addr); | ||||
} | } | ||||
std::vector<CAddress> vAddr = addrman.GetAddr(); | std::vector<CAddress> vAddr = addrman.GetAddr(); | ||||
▲ Show 20 Lines • Show All 122 Lines • ▼ Show 20 Lines | for (int p = 0; p < 255; p++) { | ||||
ResolveIP("250." + std::to_string(p) + ".1.1")); | ResolveIP("250." + std::to_string(p) + ".1.1")); | ||||
int bucket = infoj.GetNewBucket(nKey1); | int bucket = infoj.GetNewBucket(nKey1); | ||||
buckets.insert(bucket); | buckets.insert(bucket); | ||||
} | } | ||||
// Test 34: IP addresses in the different source groups should map to more | // Test 34: IP addresses in the different source groups should map to more | ||||
// 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() |