Changeset View
Changeset View
Standalone View
Standalone View
src/test/addrman_tests.cpp
// Copyright (c) 2012-2019 The Bitcoin Core developers | // Copyright (c) 2012-2019 The Bitcoin Core developers | ||||
// Distributed under the MIT software license, see the accompanying | // Distributed under the MIT software license, see the accompanying | ||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php. | // file COPYING or http://www.opensource.org/licenses/mit-license.php. | ||||
#include <addrman.h> | #include <addrman.h> | ||||
#include <hash.h> | #include <hash.h> | ||||
#include <netbase.h> | #include <netbase.h> | ||||
#include <random.h> | #include <random.h> | ||||
#include <util/asmap.h> | #include <util/asmap.h> | ||||
#include <util/string.h> | |||||
#include <test/data/asmap.raw.h> | #include <test/data/asmap.raw.h> | ||||
#include <test/util/setup_common.h> | #include <test/util/setup_common.h> | ||||
#include <boost/test/unit_test.hpp> | #include <boost/test/unit_test.hpp> | ||||
#include <string> | #include <string> | ||||
▲ Show 20 Lines • Show All 236 Lines • ▼ Show 20 Lines | |||||
BOOST_AUTO_TEST_CASE(addrman_new_collisions) { | BOOST_AUTO_TEST_CASE(addrman_new_collisions) { | ||||
CAddrManTest addrman; | CAddrManTest addrman; | ||||
CNetAddr source = ResolveIP("252.2.2.2"); | CNetAddr source = ResolveIP("252.2.2.2"); | ||||
BOOST_CHECK_EQUAL(addrman.size(), 0U); | BOOST_CHECK_EQUAL(addrman.size(), 0U); | ||||
for (unsigned int i = 1; i < 18; i++) { | for (unsigned int i = 1; i < 18; i++) { | ||||
CService addr = ResolveService("250.1.1." + std::to_string(i)); | CService addr = ResolveService("250.1.1." + ToString(i)); | ||||
BOOST_CHECK(addrman.Add(CAddress(addr, NODE_NONE), source)); | BOOST_CHECK(addrman.Add(CAddress(addr, NODE_NONE), source)); | ||||
// Test: No collision in new table yet. | // Test: No collision in new table yet. | ||||
BOOST_CHECK_EQUAL(addrman.size(), i); | BOOST_CHECK_EQUAL(addrman.size(), i); | ||||
} | } | ||||
// Test: new table collision! | // Test: new table collision! | ||||
CService addr1 = ResolveService("250.1.1.18"); | CService addr1 = ResolveService("250.1.1.18"); | ||||
BOOST_CHECK(addrman.Add(CAddress(addr1, NODE_NONE), source)); | BOOST_CHECK(addrman.Add(CAddress(addr1, NODE_NONE), source)); | ||||
BOOST_CHECK_EQUAL(addrman.size(), 17U); | BOOST_CHECK_EQUAL(addrman.size(), 17U); | ||||
CService addr2 = ResolveService("250.1.1.19"); | CService addr2 = ResolveService("250.1.1.19"); | ||||
BOOST_CHECK(addrman.Add(CAddress(addr2, NODE_NONE), source)); | BOOST_CHECK(addrman.Add(CAddress(addr2, NODE_NONE), source)); | ||||
BOOST_CHECK_EQUAL(addrman.size(), 18U); | BOOST_CHECK_EQUAL(addrman.size(), 18U); | ||||
} | } | ||||
BOOST_AUTO_TEST_CASE(addrman_tried_collisions) { | BOOST_AUTO_TEST_CASE(addrman_tried_collisions) { | ||||
CAddrManTest addrman; | CAddrManTest addrman; | ||||
CNetAddr source = ResolveIP("252.2.2.2"); | CNetAddr source = ResolveIP("252.2.2.2"); | ||||
BOOST_CHECK_EQUAL(addrman.size(), 0U); | BOOST_CHECK_EQUAL(addrman.size(), 0U); | ||||
for (unsigned int i = 1; i < 80; i++) { | for (unsigned int i = 1; i < 80; i++) { | ||||
CService addr = ResolveService("250.1.1." + std::to_string(i)); | CService addr = ResolveService("250.1.1." + ToString(i)); | ||||
BOOST_CHECK(addrman.Add(CAddress(addr, NODE_NONE), source)); | BOOST_CHECK(addrman.Add(CAddress(addr, NODE_NONE), source)); | ||||
addrman.Good(CAddress(addr, NODE_NONE)); | addrman.Good(CAddress(addr, NODE_NONE)); | ||||
// Test: No collision in tried table yet. | // Test: No collision in tried table yet. | ||||
BOOST_CHECK_EQUAL(addrman.size(), i); | BOOST_CHECK_EQUAL(addrman.size(), i); | ||||
} | } | ||||
// Test: tried table collision! | // Test: tried table collision! | ||||
▲ Show 20 Lines • Show All 112 Lines • ▼ Show 20 Lines | BOOST_AUTO_TEST_CASE(addrman_getaddr) { | ||||
addrman.Good(CAddress(addr2, NODE_NONE)); | addrman.Good(CAddress(addr2, NODE_NONE)); | ||||
BOOST_CHECK_EQUAL(addrman.GetAddr().size(), 1U); | BOOST_CHECK_EQUAL(addrman.GetAddr().size(), 1U); | ||||
// Test: Ensure GetAddr still returns 23% when addrman has many addrs. | // Test: 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 = | ||||
std::to_string(octet1) + "." + std::to_string(octet2) + ".1.23"; | ToString(octet1) + "." + ToString(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) { | if (i % 8 == 0) { | ||||
addrman.Good(addr); | addrman.Good(addr); | ||||
} | } | ||||
Show All 36 Lines | BOOST_AUTO_TEST_CASE(caddrinfo_get_tried_bucket_legacy) { | ||||
BOOST_CHECK(info1.GetKey() != info2.GetKey()); | BOOST_CHECK(info1.GetKey() != info2.GetKey()); | ||||
BOOST_CHECK(info1.GetTriedBucket(nKey1, asmap) != | BOOST_CHECK(info1.GetTriedBucket(nKey1, asmap) != | ||||
info2.GetTriedBucket(nKey1, asmap)); | info2.GetTriedBucket(nKey1, asmap)); | ||||
std::set<int> buckets; | std::set<int> buckets; | ||||
for (int i = 0; i < 255; i++) { | for (int i = 0; i < 255; i++) { | ||||
CAddrInfo infoi = CAddrInfo( | CAddrInfo infoi = CAddrInfo( | ||||
CAddress(ResolveService("250.1.1." + std::to_string(i)), NODE_NONE), | CAddress(ResolveService("250.1.1." + ToString(i)), NODE_NONE), | ||||
ResolveIP("250.1.1." + std::to_string(i))); | ResolveIP("250.1.1." + ToString(i))); | ||||
int bucket = infoi.GetTriedBucket(nKey1, asmap); | int bucket = infoi.GetTriedBucket(nKey1, asmap); | ||||
buckets.insert(bucket); | buckets.insert(bucket); | ||||
} | } | ||||
// Test: IP addresses in the same /16 prefix should never get more than 8 | // Test: IP addresses in the same /16 prefix should never get more than 8 | ||||
// buckets with legacy grouping | // buckets with legacy grouping | ||||
BOOST_CHECK_EQUAL(buckets.size(), 8U); | BOOST_CHECK_EQUAL(buckets.size(), 8U); | ||||
buckets.clear(); | buckets.clear(); | ||||
for (int j = 0; j < 255; j++) { | for (int j = 0; j < 255; j++) { | ||||
CAddrInfo infoj = CAddrInfo( | CAddrInfo infoj = CAddrInfo( | ||||
CAddress(ResolveService("250." + std::to_string(j) + ".1.1"), | CAddress(ResolveService("250." + ToString(j) + ".1.1"), NODE_NONE), | ||||
NODE_NONE), | ResolveIP("250." + ToString(j) + ".1.1")); | ||||
ResolveIP("250." + std::to_string(j) + ".1.1")); | |||||
int bucket = infoj.GetTriedBucket(nKey1, asmap); | int bucket = infoj.GetTriedBucket(nKey1, asmap); | ||||
buckets.insert(bucket); | buckets.insert(bucket); | ||||
} | } | ||||
// Test: IP addresses in the different /16 prefix should map to more than 8 | // Test: IP addresses in the different /16 prefix should map to more than 8 | ||||
// buckets with legacy grouping | // buckets with legacy grouping | ||||
BOOST_CHECK_EQUAL(buckets.size(), 160U); | BOOST_CHECK_EQUAL(buckets.size(), 160U); | ||||
} | } | ||||
Show All 26 Lines | BOOST_AUTO_TEST_CASE(caddrinfo_get_new_bucket_legacy) { | ||||
CAddrInfo info2 = CAddrInfo(addr2, source1); | CAddrInfo info2 = CAddrInfo(addr2, source1); | ||||
BOOST_CHECK(info1.GetKey() != info2.GetKey()); | BOOST_CHECK(info1.GetKey() != info2.GetKey()); | ||||
BOOST_CHECK_EQUAL(info1.GetNewBucket(nKey1, asmap), | BOOST_CHECK_EQUAL(info1.GetNewBucket(nKey1, asmap), | ||||
info2.GetNewBucket(nKey1, asmap)); | info2.GetNewBucket(nKey1, asmap)); | ||||
std::set<int> buckets; | std::set<int> buckets; | ||||
for (int i = 0; i < 255; i++) { | for (int i = 0; i < 255; i++) { | ||||
CAddrInfo infoi = CAddrInfo( | CAddrInfo infoi = CAddrInfo( | ||||
CAddress(ResolveService("250.1.1." + std::to_string(i)), NODE_NONE), | CAddress(ResolveService("250.1.1." + ToString(i)), NODE_NONE), | ||||
ResolveIP("250.1.1." + std::to_string(i))); | ResolveIP("250.1.1." + ToString(i))); | ||||
int bucket = infoi.GetNewBucket(nKey1, asmap); | int bucket = infoi.GetNewBucket(nKey1, asmap); | ||||
buckets.insert(bucket); | buckets.insert(bucket); | ||||
} | } | ||||
// Test: IP addresses in the same group (\16 prefix for IPv4) should | // Test: IP addresses in the same group (\16 prefix for IPv4) should | ||||
// always map to the same bucket. | // always map to the same bucket. | ||||
BOOST_CHECK_EQUAL(buckets.size(), 1U); | BOOST_CHECK_EQUAL(buckets.size(), 1U); | ||||
buckets.clear(); | buckets.clear(); | ||||
for (int j = 0; j < 4 * 255; j++) { | for (int j = 0; j < 4 * 255; j++) { | ||||
CAddrInfo infoj = CAddrInfo( | CAddrInfo infoj = | ||||
CAddress(ResolveService(std::to_string(250 + (j / 255)) + "." + | CAddrInfo(CAddress(ResolveService(ToString(250 + (j / 255)) + "." + | ||||
std::to_string(j % 256) + ".1.1"), | ToString(j % 256) + ".1.1"), | ||||
NODE_NONE), | NODE_NONE), | ||||
ResolveIP("251.4.1.1")); | ResolveIP("251.4.1.1")); | ||||
int bucket = infoj.GetNewBucket(nKey1, asmap); | int bucket = infoj.GetNewBucket(nKey1, asmap); | ||||
buckets.insert(bucket); | buckets.insert(bucket); | ||||
} | } | ||||
// Test: IP addresses in the same source groups should map to NO MORE | // Test: IP addresses in the same source groups should map to NO MORE | ||||
// than 64 buckets. | // than 64 buckets. | ||||
BOOST_CHECK(buckets.size() <= 64); | BOOST_CHECK(buckets.size() <= 64); | ||||
buckets.clear(); | buckets.clear(); | ||||
for (int p = 0; p < 255; p++) { | for (int p = 0; p < 255; p++) { | ||||
CAddrInfo infoj = | CAddrInfo infoj = | ||||
CAddrInfo(CAddress(ResolveService("250.1.1.1"), NODE_NONE), | CAddrInfo(CAddress(ResolveService("250.1.1.1"), NODE_NONE), | ||||
ResolveIP("250." + std::to_string(p) + ".1.1")); | ResolveIP("250." + ToString(p) + ".1.1")); | ||||
int bucket = infoj.GetNewBucket(nKey1, asmap); | int bucket = infoj.GetNewBucket(nKey1, asmap); | ||||
buckets.insert(bucket); | buckets.insert(bucket); | ||||
} | } | ||||
// Test: IP addresses in the different source groups should map to more | // Test: 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); | ||||
} | } | ||||
Show All 36 Lines | BOOST_AUTO_TEST_CASE(caddrinfo_get_tried_bucket) { | ||||
BOOST_CHECK(info1.GetKey() != info2.GetKey()); | BOOST_CHECK(info1.GetKey() != info2.GetKey()); | ||||
BOOST_CHECK(info1.GetTriedBucket(nKey1, asmap) != | BOOST_CHECK(info1.GetTriedBucket(nKey1, asmap) != | ||||
info2.GetTriedBucket(nKey1, asmap)); | info2.GetTriedBucket(nKey1, asmap)); | ||||
std::set<int> buckets; | std::set<int> buckets; | ||||
for (int j = 0; j < 255; j++) { | for (int j = 0; j < 255; j++) { | ||||
CAddrInfo infoj = CAddrInfo( | CAddrInfo infoj = CAddrInfo( | ||||
CAddress(ResolveService("101." + std::to_string(j) + ".1.1"), | CAddress(ResolveService("101." + ToString(j) + ".1.1"), NODE_NONE), | ||||
NODE_NONE), | ResolveIP("101." + ToString(j) + ".1.1")); | ||||
ResolveIP("101." + std::to_string(j) + ".1.1")); | |||||
int bucket = infoj.GetTriedBucket(nKey1, asmap); | int bucket = infoj.GetTriedBucket(nKey1, asmap); | ||||
buckets.insert(bucket); | buckets.insert(bucket); | ||||
} | } | ||||
// Test: IP addresses in the different /16 prefix MAY map to more than | // Test: IP addresses in the different /16 prefix MAY map to more than | ||||
// 8 buckets. | // 8 buckets. | ||||
BOOST_CHECK(buckets.size() > 8); | BOOST_CHECK(buckets.size() > 8); | ||||
buckets.clear(); | buckets.clear(); | ||||
for (int j = 0; j < 255; j++) { | for (int j = 0; j < 255; j++) { | ||||
CAddrInfo infoj = CAddrInfo( | CAddrInfo infoj = CAddrInfo( | ||||
CAddress(ResolveService("250." + std::to_string(j) + ".1.1"), | CAddress(ResolveService("250." + ToString(j) + ".1.1"), NODE_NONE), | ||||
NODE_NONE), | ResolveIP("250." + ToString(j) + ".1.1")); | ||||
ResolveIP("250." + std::to_string(j) + ".1.1")); | |||||
int bucket = infoj.GetTriedBucket(nKey1, asmap); | int bucket = infoj.GetTriedBucket(nKey1, asmap); | ||||
buckets.insert(bucket); | buckets.insert(bucket); | ||||
} | } | ||||
// Test: IP addresses in the different /16 prefix MAY NOT map to more than | // Test: IP addresses in the different /16 prefix MAY NOT map to more than | ||||
// 8 buckets. | // 8 buckets. | ||||
BOOST_CHECK(buckets.size() == 8); | BOOST_CHECK(buckets.size() == 8); | ||||
} | } | ||||
Show All 25 Lines | BOOST_AUTO_TEST_CASE(caddrinfo_get_new_bucket) { | ||||
CAddrInfo info2 = CAddrInfo(addr2, source1); | CAddrInfo info2 = CAddrInfo(addr2, source1); | ||||
BOOST_CHECK(info1.GetKey() != info2.GetKey()); | BOOST_CHECK(info1.GetKey() != info2.GetKey()); | ||||
BOOST_CHECK_EQUAL(info1.GetNewBucket(nKey1, asmap), | BOOST_CHECK_EQUAL(info1.GetNewBucket(nKey1, asmap), | ||||
info2.GetNewBucket(nKey1, asmap)); | info2.GetNewBucket(nKey1, asmap)); | ||||
std::set<int> buckets; | std::set<int> buckets; | ||||
for (int i = 0; i < 255; i++) { | for (int i = 0; i < 255; i++) { | ||||
CAddrInfo infoi = CAddrInfo( | CAddrInfo infoi = CAddrInfo( | ||||
CAddress(ResolveService("250.1.1." + std::to_string(i)), NODE_NONE), | CAddress(ResolveService("250.1.1." + ToString(i)), NODE_NONE), | ||||
ResolveIP("250.1.1." + std::to_string(i))); | ResolveIP("250.1.1." + ToString(i))); | ||||
int bucket = infoi.GetNewBucket(nKey1, asmap); | int bucket = infoi.GetNewBucket(nKey1, asmap); | ||||
buckets.insert(bucket); | buckets.insert(bucket); | ||||
} | } | ||||
// Test: IP addresses in the same /16 prefix | // Test: IP addresses in the same /16 prefix | ||||
// usually map to the same bucket. | // usually map to the same bucket. | ||||
BOOST_CHECK_EQUAL(buckets.size(), 1U); | BOOST_CHECK_EQUAL(buckets.size(), 1U); | ||||
buckets.clear(); | buckets.clear(); | ||||
for (int j = 0; j < 4 * 255; j++) { | for (int j = 0; j < 4 * 255; j++) { | ||||
CAddrInfo infoj = CAddrInfo( | CAddrInfo infoj = | ||||
CAddress(ResolveService(std::to_string(250 + (j / 255)) + "." + | CAddrInfo(CAddress(ResolveService(ToString(250 + (j / 255)) + "." + | ||||
std::to_string(j % 256) + ".1.1"), | ToString(j % 256) + ".1.1"), | ||||
NODE_NONE), | NODE_NONE), | ||||
ResolveIP("251.4.1.1")); | ResolveIP("251.4.1.1")); | ||||
int bucket = infoj.GetNewBucket(nKey1, asmap); | int bucket = infoj.GetNewBucket(nKey1, asmap); | ||||
buckets.insert(bucket); | buckets.insert(bucket); | ||||
} | } | ||||
// Test: IP addresses in the same source /16 prefix should not map to more | // Test: IP addresses in the same source /16 prefix should not map to more | ||||
// than 64 buckets. | // than 64 buckets. | ||||
BOOST_CHECK(buckets.size() <= 64); | BOOST_CHECK(buckets.size() <= 64); | ||||
buckets.clear(); | buckets.clear(); | ||||
for (int p = 0; p < 255; p++) { | for (int p = 0; p < 255; p++) { | ||||
CAddrInfo infoj = | CAddrInfo infoj = | ||||
CAddrInfo(CAddress(ResolveService("250.1.1.1"), NODE_NONE), | CAddrInfo(CAddress(ResolveService("250.1.1.1"), NODE_NONE), | ||||
ResolveIP("101." + std::to_string(p) + ".1.1")); | ResolveIP("101." + ToString(p) + ".1.1")); | ||||
int bucket = infoj.GetNewBucket(nKey1, asmap); | int bucket = infoj.GetNewBucket(nKey1, asmap); | ||||
buckets.insert(bucket); | buckets.insert(bucket); | ||||
} | } | ||||
// Test: IP addresses in the different source /16 prefixes usually map to | // Test: IP addresses in the different source /16 prefixes usually map to | ||||
// MORE than 1 bucket. | // MORE than 1 bucket. | ||||
BOOST_CHECK(buckets.size() > 1); | BOOST_CHECK(buckets.size() > 1); | ||||
buckets.clear(); | buckets.clear(); | ||||
for (int p = 0; p < 255; p++) { | for (int p = 0; p < 255; p++) { | ||||
CAddrInfo infoj = | CAddrInfo infoj = | ||||
CAddrInfo(CAddress(ResolveService("250.1.1.1"), NODE_NONE), | CAddrInfo(CAddress(ResolveService("250.1.1.1"), NODE_NONE), | ||||
ResolveIP("250." + std::to_string(p) + ".1.1")); | ResolveIP("250." + ToString(p) + ".1.1")); | ||||
int bucket = infoj.GetNewBucket(nKey1, asmap); | int bucket = infoj.GetNewBucket(nKey1, asmap); | ||||
buckets.insert(bucket); | buckets.insert(bucket); | ||||
} | } | ||||
// Test: IP addresses in the different source /16 prefixes sometimes map to | // Test: IP addresses in the different source /16 prefixes sometimes map to | ||||
// NO MORE than 1 bucket. | // NO MORE than 1 bucket. | ||||
BOOST_CHECK(buckets.size() == 1); | BOOST_CHECK(buckets.size() == 1); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 83 Lines • ▼ Show 20 Lines | BOOST_AUTO_TEST_CASE(addrman_selecttriedcollision) { | ||||
BOOST_CHECK(addrman.size() == 0); | BOOST_CHECK(addrman.size() == 0); | ||||
// Empty addrman should return blank addrman info. | // Empty addrman should return blank addrman info. | ||||
BOOST_CHECK(addrman.SelectTriedCollision().ToString() == "[::]:0"); | BOOST_CHECK(addrman.SelectTriedCollision().ToString() == "[::]:0"); | ||||
// Add twenty two addresses. | // Add twenty two addresses. | ||||
CNetAddr source = ResolveIP("252.2.2.2"); | CNetAddr source = ResolveIP("252.2.2.2"); | ||||
for (unsigned int i = 1; i < 23; i++) { | for (unsigned int i = 1; i < 23; i++) { | ||||
CService addr = ResolveService("250.1.1." + std::to_string(i)); | CService addr = ResolveService("250.1.1." + ToString(i)); | ||||
BOOST_CHECK(addrman.Add(CAddress(addr, NODE_NONE), source)); | BOOST_CHECK(addrman.Add(CAddress(addr, NODE_NONE), source)); | ||||
addrman.Good(addr); | addrman.Good(addr); | ||||
// No collisions yet. | // No collisions yet. | ||||
BOOST_CHECK(addrman.size() == i); | BOOST_CHECK(addrman.size() == i); | ||||
BOOST_CHECK(addrman.SelectTriedCollision().ToString() == "[::]:0"); | BOOST_CHECK(addrman.SelectTriedCollision().ToString() == "[::]:0"); | ||||
} | } | ||||
// Ensure Good handles duplicates well. | // Ensure Good handles duplicates well. | ||||
for (unsigned int i = 1; i < 23; i++) { | for (unsigned int i = 1; i < 23; i++) { | ||||
CService addr = ResolveService("250.1.1." + std::to_string(i)); | CService addr = ResolveService("250.1.1." + ToString(i)); | ||||
addrman.Good(addr); | addrman.Good(addr); | ||||
BOOST_CHECK(addrman.size() == 22); | BOOST_CHECK(addrman.size() == 22); | ||||
BOOST_CHECK(addrman.SelectTriedCollision().ToString() == "[::]:0"); | BOOST_CHECK(addrman.SelectTriedCollision().ToString() == "[::]:0"); | ||||
} | } | ||||
} | } | ||||
BOOST_AUTO_TEST_CASE(addrman_noevict) { | BOOST_AUTO_TEST_CASE(addrman_noevict) { | ||||
CAddrManTest addrman; | CAddrManTest addrman; | ||||
// Add twenty two addresses. | // Add twenty two addresses. | ||||
CNetAddr source = ResolveIP("252.2.2.2"); | CNetAddr source = ResolveIP("252.2.2.2"); | ||||
for (unsigned int i = 1; i < 23; i++) { | for (unsigned int i = 1; i < 23; i++) { | ||||
CService addr = ResolveService("250.1.1." + std::to_string(i)); | CService addr = ResolveService("250.1.1." + ToString(i)); | ||||
BOOST_CHECK(addrman.Add(CAddress(addr, NODE_NONE), source)); | BOOST_CHECK(addrman.Add(CAddress(addr, NODE_NONE), source)); | ||||
addrman.Good(addr); | addrman.Good(addr); | ||||
// No collision yet. | // No collision yet. | ||||
BOOST_CHECK(addrman.size() == i); | BOOST_CHECK(addrman.size() == i); | ||||
BOOST_CHECK(addrman.SelectTriedCollision().ToString() == "[::]:0"); | BOOST_CHECK(addrman.SelectTriedCollision().ToString() == "[::]:0"); | ||||
} | } | ||||
// Collision between 23 and 19. | // Collision between 23 and 19. | ||||
CService addr23 = ResolveService("250.1.1.23"); | CService addr23 = ResolveService("250.1.1.23"); | ||||
BOOST_CHECK(addrman.Add(CAddress(addr23, NODE_NONE), source)); | BOOST_CHECK(addrman.Add(CAddress(addr23, NODE_NONE), source)); | ||||
addrman.Good(addr23); | addrman.Good(addr23); | ||||
BOOST_CHECK(addrman.size() == 23); | BOOST_CHECK(addrman.size() == 23); | ||||
BOOST_CHECK(addrman.SelectTriedCollision().ToString() == "250.1.1.19:0"); | BOOST_CHECK(addrman.SelectTriedCollision().ToString() == "250.1.1.19:0"); | ||||
// 23 should be discarded and 19 not evicted. | // 23 should be discarded and 19 not evicted. | ||||
addrman.ResolveCollisions(); | addrman.ResolveCollisions(); | ||||
BOOST_CHECK(addrman.SelectTriedCollision().ToString() == "[::]:0"); | BOOST_CHECK(addrman.SelectTriedCollision().ToString() == "[::]:0"); | ||||
// Lets create two collisions. | // Lets create two collisions. | ||||
for (unsigned int i = 24; i < 33; i++) { | for (unsigned int i = 24; i < 33; i++) { | ||||
CService addr = ResolveService("250.1.1." + std::to_string(i)); | CService addr = ResolveService("250.1.1." + ToString(i)); | ||||
BOOST_CHECK(addrman.Add(CAddress(addr, NODE_NONE), source)); | BOOST_CHECK(addrman.Add(CAddress(addr, NODE_NONE), source)); | ||||
addrman.Good(addr); | addrman.Good(addr); | ||||
BOOST_CHECK(addrman.size() == i); | BOOST_CHECK(addrman.size() == i); | ||||
BOOST_CHECK(addrman.SelectTriedCollision().ToString() == "[::]:0"); | BOOST_CHECK(addrman.SelectTriedCollision().ToString() == "[::]:0"); | ||||
} | } | ||||
// Cause a collision. | // Cause a collision. | ||||
Show All 20 Lines | BOOST_AUTO_TEST_CASE(addrman_evictionworks) { | ||||
BOOST_CHECK(addrman.size() == 0); | BOOST_CHECK(addrman.size() == 0); | ||||
// Empty addrman should return blank addrman info. | // Empty addrman should return blank addrman info. | ||||
BOOST_CHECK(addrman.SelectTriedCollision().ToString() == "[::]:0"); | BOOST_CHECK(addrman.SelectTriedCollision().ToString() == "[::]:0"); | ||||
// Add twenty two addresses. | // Add twenty two addresses. | ||||
CNetAddr source = ResolveIP("252.2.2.2"); | CNetAddr source = ResolveIP("252.2.2.2"); | ||||
for (unsigned int i = 1; i < 23; i++) { | for (unsigned int i = 1; i < 23; i++) { | ||||
CService addr = ResolveService("250.1.1." + std::to_string(i)); | CService addr = ResolveService("250.1.1." + ToString(i)); | ||||
BOOST_CHECK(addrman.Add(CAddress(addr, NODE_NONE), source)); | BOOST_CHECK(addrman.Add(CAddress(addr, NODE_NONE), source)); | ||||
addrman.Good(addr); | addrman.Good(addr); | ||||
// No collision yet. | // No collision yet. | ||||
BOOST_CHECK(addrman.size() == i); | BOOST_CHECK(addrman.size() == i); | ||||
BOOST_CHECK(addrman.SelectTriedCollision().ToString() == "[::]:0"); | BOOST_CHECK(addrman.SelectTriedCollision().ToString() == "[::]:0"); | ||||
} | } | ||||
Show All 34 Lines |