8 #include <chainparams.h> 18 #include <boost/test/unit_test.hpp> 32 return std::clamp<int32_t>(node_ctx.
args->
GetIntArg(
"-checkaddrman", 100), 0, 1000000);
37 const std::optional<CNetAddr> addr{
LookupHost(
ip,
false)};
38 BOOST_CHECK_MESSAGE(addr.has_value(),
strprintf(
"failed to resolve: %s",
ip));
44 const std::optional<CService> serv{
Lookup(
ip, port,
false)};
45 BOOST_CHECK_MESSAGE(serv.has_value(),
strprintf(
"failed to resolve: %s:%i",
ip, port));
52 std::vector<bool> result(vector_size);
53 for (
int byte_i = 0; byte_i < vector_size / 8; ++byte_i) {
54 unsigned char cur_byte =
source[byte_i];
55 for (
int bit_i = 0; bit_i < 8; ++bit_i) {
56 result[byte_i * 8 + bit_i] = (cur_byte >> bit_i) & 1;
72 auto addr_null = addrman->Select().first;
79 auto addr_ret1 = addrman->Select().first;
101 std::vector<CAddress> vAddr;
124 auto addr_ret2 = addrman->Select().first;
125 BOOST_CHECK(addr_ret2.ToStringAddrPort() ==
"250.1.1.1:8333" || addr_ret2.ToStringAddrPort() ==
"250.1.1.1:8334");
131 bool new_only =
true;
132 auto addr_ret3 = addrman->Select(new_only).first;
139 BOOST_CHECK(!addrman->Select(
false).first.IsValid());
140 BOOST_CHECK(!addrman->Select(
true).first.IsValid());
156 BOOST_CHECK(!addrman->Select(
true).first.IsValid());
177 BOOST_CHECK(addrman->Add({CAddress(addr5, NODE_NONE)}, addr3));
179 BOOST_CHECK(addrman->Add({CAddress(addr6, NODE_NONE)}, addr3));
188 std::set<uint16_t> ports;
189 for (
int i = 0; i < 20; ++i) {
190 ports.insert(addrman->Select().first.GetPort());
217 i2p_addr.
SetSpecial(
"udhdrtrcetjm5sxzskjyr5ztpeszydbh4dpl3pl4utgqqw2v4jna.b32.i2p");
235 i2p_addr2.
SetSpecial(
"c4gfnttsuwqomiygupdqqqyy5y5emnk5c73hrfvatri67prd7vyq.b32.i2p");
241 bool new_selected{
false};
242 bool tried_selected{
false};
245 while (--counter > 0 && (!new_selected || !tried_selected)) {
247 BOOST_REQUIRE(selected == i2p_addr || selected == i2p_addr2);
248 if (selected == i2p_addr) {
249 tried_selected =
true;
268 i2p_addr.
SetSpecial(
"udhdrtrcetjm5sxzskjyr5ztpeszydbh4dpl3pl4utgqqw2v4jna.b32.i2p");
288 uint32_t num_addrs{0};
292 while (num_addrs < 22) {
302 uint32_t collisions{1};
315 const auto start_time{Now<NodeSeconds>()};
316 addr.
nTime = start_time;
319 for (
unsigned int i = 1; i < 20; ++i) {
320 std::string addr_ip{
ToString(i % 256) +
"." +
ToString(i >> 8 % 256) +
".1.1"};
322 addrman->Add({addr},
source);
331 for (
unsigned int i = 1; i < 400; ++i) {
332 std::string addr_ip{
ToString(i % 256) +
"." +
ToString(i >> 8 % 256) +
".1.1"};
334 addr.nTime = start_time + std::chrono::seconds{i};
335 addrman->Add({addr},
source);
337 AddressPosition addr_pos_multi = addrman->FindAddressEntry(addr).value();
349 uint32_t num_addrs{0};
353 while (num_addrs < 35) {
381 std::vector<CAddress> vAddr1 = addrman->GetAddr(0, 0, std::nullopt);
385 addr1.nTime = Now<NodeSeconds>();
387 addr2.nTime = Now<NodeSeconds>();
389 addr3.nTime = Now<NodeSeconds>();
391 addr4.nTime = Now<NodeSeconds>();
393 addr5.nTime = Now<NodeSeconds>();
398 BOOST_CHECK(addrman->Add({addr1, addr3, addr5}, source1));
399 BOOST_CHECK(addrman->Add({addr2, addr4}, source2));
412 for (
unsigned int i = 1; i < (8 * 256); i++) {
413 int octet1 = i % 256;
414 int octet2 = i >> 8 % 256;
419 addr.
nTime = Now<NodeSeconds>();
420 addrman->Add({addr},
ResolveIP(strAddr));
424 std::vector<CAddress> vAddr = addrman->GetAddr(2500, 23, std::nullopt);
426 size_t percent23 = (addrman->Size() * 23) / 100;
439 addr1.nTime = Now<NodeSeconds>();
478 std::set<int> buckets;
479 for (
int i = 0; i < 255; i++) {
484 buckets.insert(bucket);
491 for (
int j = 0; j < 255; j++) {
496 buckets.insert(bucket);
528 std::set<int> buckets;
529 for (
int i = 0; i < 255; i++) {
534 buckets.insert(bucket);
541 for (
int j = 0; j < 4 * 255; j++) {
547 buckets.insert(bucket);
554 for (
int p = 0; p < 255; p++) {
559 buckets.insert(bucket);
606 std::set<int> buckets;
607 for (
int j = 0; j < 255; j++) {
612 buckets.insert(bucket);
619 for (
int j = 0; j < 255; j++) {
624 buckets.insert(bucket);
659 std::set<int> buckets;
660 for (
int i = 0; i < 255; i++) {
665 buckets.insert(bucket);
672 for (
int j = 0; j < 4 * 255; j++) {
678 buckets.insert(bucket);
685 for (
int p = 0; p < 255; p++) {
690 buckets.insert(bucket);
697 for (
int p = 0; p < 255; p++) {
702 buckets.insert(bucket);
715 auto addrman_asmap1 = std::make_unique<AddrMan>(netgroupman,
DETERMINISTIC, ratio);
716 auto addrman_asmap1_dup = std::make_unique<AddrMan>(netgroupman,
DETERMINISTIC, ratio);
724 addrman_asmap1->Add({addr}, default_source);
726 stream << *addrman_asmap1;
728 stream >> *addrman_asmap1_dup;
730 AddressPosition addr_pos1 = addrman_asmap1->FindAddressEntry(addr).value();
731 AddressPosition addr_pos2 = addrman_asmap1_dup->FindAddressEntry(addr).value();
738 stream << *addrman_asmap1;
739 stream >> *addrman_noasmap;
740 AddressPosition addr_pos3 = addrman_noasmap->FindAddressEntry(addr).value();
746 addrman_asmap1 = std::make_unique<AddrMan>(netgroupman,
DETERMINISTIC, ratio);
748 addrman_noasmap->Add({addr}, default_source);
749 stream << *addrman_noasmap;
750 stream >> *addrman_asmap1;
752 AddressPosition addr_pos4 = addrman_asmap1->FindAddressEntry(addr).value();
758 addrman_asmap1 = std::make_unique<AddrMan>(netgroupman,
DETERMINISTIC, ratio);
762 addrman_noasmap->Add({addr,
addr2}, default_source);
766 stream << *addrman_noasmap;
767 stream >> *addrman_asmap1;
786 addrman->Add({new1, tried1, new2, tried2},
CNetAddr{});
787 addrman->Good(tried1);
788 addrman->Good(tried2);
789 BOOST_REQUIRE_EQUAL(addrman->Size(), 4);
793 const std::string str{stream.str()};
796 const char new2_raw[]{6, 6, 6, 6};
797 const uint8_t new2_raw_replacement[]{0, 0, 0, 0};
798 pos = str.find(new2_raw, 0,
sizeof(new2_raw));
799 BOOST_REQUIRE(pos != std::string::npos);
800 BOOST_REQUIRE(pos +
sizeof(new2_raw_replacement) <= stream.size());
801 memcpy(stream.data() + pos, new2_raw_replacement,
sizeof(new2_raw_replacement));
803 const char tried2_raw[]{8, 8, 8, 8};
804 const uint8_t tried2_raw_replacement[]{255, 255, 255, 255};
805 pos = str.find(tried2_raw, 0,
sizeof(tried2_raw));
806 BOOST_REQUIRE(pos != std::string::npos);
807 BOOST_REQUIRE(pos +
sizeof(tried2_raw_replacement) <= stream.size());
808 memcpy(stream.data() + pos, tried2_raw_replacement,
sizeof(tried2_raw_replacement));
822 BOOST_CHECK(addrman->SelectTriedCollision().first.ToStringAddrPort() ==
"[::]:0");
826 for (
unsigned int i = 1; i < 23; i++) {
832 BOOST_CHECK(addrman->SelectTriedCollision().first.ToStringAddrPort() ==
"[::]:0");
837 for (
unsigned int i = 1; i < 23; i++) {
844 BOOST_CHECK(addrman->SelectTriedCollision().first.ToStringAddrPort() ==
"[::]:0");
854 for (
unsigned int i = 1; i < 36; i++) {
866 BOOST_CHECK_EQUAL(addrman->SelectTriedCollision().first.ToStringAddrPort(),
"250.1.1.19:0");
871 addrman->ResolveCollisions();
872 BOOST_CHECK(addrman->SelectTriedCollision().first.ToStringAddrPort() ==
"[::]:0");
875 for (
unsigned int i = 37; i < 59; i++) {
886 BOOST_CHECK_EQUAL(addrman->SelectTriedCollision().first.ToStringAddrPort(),
"250.1.1.10:0");
893 BOOST_CHECK(addrman->SelectTriedCollision().first.ToStringAddrPort() !=
"[::]:0");
896 addrman->ResolveCollisions();
897 BOOST_CHECK(addrman->SelectTriedCollision().first.ToStringAddrPort() ==
"[::]:0");
907 BOOST_CHECK(addrman->SelectTriedCollision().first.ToStringAddrPort() ==
"[::]:0");
911 for (
unsigned int i = 1; i < 36; i++) {
924 auto info = addrman->SelectTriedCollision().first;
930 addrman->Attempt(info,
false, Now<NodeSeconds>() - 61s);
933 addrman->ResolveCollisions();
934 BOOST_CHECK(addrman->SelectTriedCollision().first.ToStringAddrPort() ==
"[::]:0");
943 BOOST_CHECK(addrman->SelectTriedCollision().first.ToStringAddrPort() ==
"[::]:0");
949 BOOST_CHECK_EQUAL(addrman->SelectTriedCollision().first.ToStringAddrPort(),
"250.1.1.36:0");
953 addrman->ResolveCollisions();
954 BOOST_CHECK(addrman->SelectTriedCollision().first.ToStringAddrPort() ==
"[::]:0");
966 ssPeersIn << addrman;
974 std::optional<CService>
addr1,
addr2, addr3, addr4;
979 addr3 =
Lookup(
"250.7.3.3", 9999,
false);
981 addr3 =
Lookup(
"250.7.3.3"s, 9999,
false);
983 addr4 =
Lookup(
"250.7.3.3\0example.com"s, 9999,
false);
987 const std::optional<CService>
source{
Lookup(
"252.5.1.1", 8333,
false)};
995 bool exceptionThrown =
false;
1000 unsigned char pchMsgTmp[4];
1001 ssPeers1 >> pchMsgTmp;
1002 ssPeers1 >> addrman1;
1003 }
catch (
const std::exception&) {
1004 exceptionThrown =
true;
1025 unsigned char nVersion = 1;
1027 s << ((
unsigned char)32);
1035 const std::optional<CService> serv{
Lookup(
"252.1.1.1", 7777,
false)};
1036 BOOST_REQUIRE(serv.has_value());
1038 std::optional<CNetAddr> resolved{
LookupHost(
"252.2.2.2",
false)};
1039 BOOST_REQUIRE(resolved.has_value());
1050 bool exceptionThrown =
false;
1054 unsigned char pchMsgTmp[4];
1055 ssPeers1 >> pchMsgTmp;
1056 ssPeers1 >> addrman1;
1057 }
catch (
const std::exception&) {
1058 exceptionThrown =
true;
1077 const auto start_time{Now<NodeSeconds>() - 10000s};
1078 addr.
nTime = start_time;
1084 addr_diff_port.
nTime = start_time;
1085 addrman->Connected(addr_diff_port);
1087 std::vector<CAddress> vAddr1{addrman->GetAddr(0, 0, std::nullopt)};
1093 addrman->Connected(addr);
1095 std::vector<CAddress> vAddr2 = addrman->GetAddr(0, 0, std::nullopt);
1097 BOOST_CHECK(vAddr2.at(0).nTime >= start_time + 10000s);
1102 addr_v2.
nTime = start_time;
1104 std::vector<CAddress> vAddr3{addrman->GetAddr(0, 0, std::nullopt)};
1110 std::vector<CAddress> vAddr4{addrman->GetAddr(0, 0, std::nullopt)};
1116 std::vector<CAddress> vAddr5{addrman->GetAddr(0, 0, std::nullopt)};
1122 std::vector<CAddress> vAddr6{addrman->GetAddr(0, 0, std::nullopt)};
1154 i2p_addr.
SetSpecial(
"UDHDrtrcetjm5sxzskjyr5ztpeszydbh4dpl3pl4utgqqw2v4jna.b32.I2P");
static auto AddrmanToStream(const AddrMan &addrman)
#define BOOST_CHECK_THROW(stmt, excMatch)
static const bool DETERMINISTIC
static constexpr SerParams V1_DISK
bool SetSpecial(const std::string &addr)
Parse a Tor or I2P address and set this object to it.
static CService ResolveService(const std::string &ip, uint16_t port=0)
BOOST_AUTO_TEST_CASE(addrman_simple)
Stochastic address manager.
std::chrono::time_point< NodeClock, std::chrono::seconds > NodeSeconds
void SetMockTime(int64_t nMockTimeIn)
DEPRECATED Use SetMockTime with chrono type.
NodeContext struct containing references to chain state and connection state.
static const std::string addr2
static unsigned const char asmap_raw[]
static const std::string addr1
static NetGroupManager EMPTY_NETGROUPMAN
std::vector< CNetAddr > LookupHost(const std::string &name, unsigned int nMaxSolutions, bool fAllowLookup, DNSLookupFn dns_lookup_function)
Resolve a host string to its corresponding network addresses.
Double ended buffer combining vector and stream-like interfaces.
A writer stream (for serialization) that computes a 256-bit hash.
A combination of a network address (CNetAddr) and a (TCP) port.
BOOST_AUTO_TEST_SUITE_END()
Extended statistics about a CAddress.
A CService with information about it as peer.
std::vector< unsigned char > GetKey() const
static CService ip(uint32_t i)
int GetNewBucket(const uint256 &nKey, const CNetAddr &src, const NetGroupManager &netgroupman) const
Calculate in which "new" bucket this entry belongs, given a certain source.
NodeSeconds nTime
Always included in serialization. The behavior is unspecified if the value is not representable as ui...
void ReadFromStream(AddrMan &addr, DataStream &ssPeers)
Only used by tests.
std::vector< CService > Lookup(const std::string &name, uint16_t portDefault, bool fAllowLookup, unsigned int nMaxSolutions, DNSLookupFn dns_lookup_function)
Resolve a service string to its corresponding service.
static auto MakeCorruptPeersDat()
static constexpr int ADDRMAN_NEW_BUCKET_COUNT
#define BOOST_CHECK_EQUAL(v1, v2)
const CChainParams & Params()
Return the currently selected parameters.
int64_t GetIntArg(const std::string &strArg, int64_t nDefault) const
Return integer argument or default value.
const MessageStartChars & MessageStart() const
static int32_t GetCheckRatio(const NodeContext &node_ctx)
Location information for an address in AddrMan.
static std::vector< bool > FromBytes(const unsigned char *source, int vector_size)
int64_t GetTime()
DEPRECATED, see GetTime.
int GetTriedBucket(const uint256 &nKey, const NetGroupManager &netgroupman) const
Calculate in which "tried" bucket this entry belongs.
static CNetAddr ResolveIP(const std::string &ip)
std::string ToString(const T &t)
Locale-independent version of std::to_string.
#define BOOST_CHECK(expr)