2121#include < string>
2222
2323using namespace std ::literals;
24+ using node::NodeContext;
25+
26+ static const std::vector<bool > EMPTY_ASMAP;
27+ static const bool DETERMINISTIC{true };
28+
29+ static int32_t GetCheckRatio (const NodeContext& node_ctx)
30+ {
31+ return std::clamp<int32_t >(node_ctx.args ->GetIntArg (" -checkaddrman" , 100 ), 0 , 1000000 );
32+ }
2433
2534static CNetAddr ResolveIP (const std::string& ip)
2635{
@@ -49,17 +58,11 @@ static std::vector<bool> FromBytes(const unsigned char* source, int vector_size)
4958 return result;
5059}
5160
52- /* Utility function to create a deterministic addrman, as used in most tests */
53- static std::unique_ptr<AddrMan> TestAddrMan (std::vector<bool > asmap = std::vector<bool >())
54- {
55- return std::make_unique<AddrMan>(asmap, /* deterministic=*/ true , /* consistency_check_ratio=*/ 100 );
56- }
57-
5861BOOST_FIXTURE_TEST_SUITE (addrman_tests, BasicTestingSetup)
5962
6063BOOST_AUTO_TEST_CASE(addrman_simple)
6164{
62- auto addrman = TestAddrMan ( );
65+ auto addrman = std::make_unique<AddrMan>(EMPTY_ASMAP, DETERMINISTIC, GetCheckRatio (m_node) );
6366
6467 CNetAddr source = ResolveIP (" 252.2.2.2" );
6568
@@ -93,7 +96,7 @@ BOOST_AUTO_TEST_CASE(addrman_simple)
9396 BOOST_CHECK (addrman->size () >= 1 );
9497
9598 // Test: reset addrman and test AddrMan::Add multiple addresses works as expected
96- addrman = TestAddrMan ( );
99+ addrman = std::make_unique<AddrMan>(EMPTY_ASMAP, DETERMINISTIC, GetCheckRatio (m_node) );
97100 std::vector<CAddress> vAddr;
98101 vAddr.push_back (CAddress (ResolveService (" 250.1.1.3" , 8333 ), NODE_NONE));
99102 vAddr.push_back (CAddress (ResolveService (" 250.1.1.4" , 8333 ), NODE_NONE));
@@ -103,7 +106,7 @@ BOOST_AUTO_TEST_CASE(addrman_simple)
103106
104107BOOST_AUTO_TEST_CASE (addrman_ports)
105108{
106- auto addrman = TestAddrMan ( );
109+ auto addrman = std::make_unique<AddrMan>(EMPTY_ASMAP, DETERMINISTIC, GetCheckRatio (m_node) );
107110
108111 CNetAddr source = ResolveIP (" 252.2.2.2" );
109112
@@ -132,7 +135,7 @@ BOOST_AUTO_TEST_CASE(addrman_ports)
132135
133136BOOST_AUTO_TEST_CASE (addrman_select)
134137{
135- auto addrman = TestAddrMan ( );
138+ auto addrman = std::make_unique<AddrMan>(EMPTY_ASMAP, DETERMINISTIC, GetCheckRatio (m_node) );
136139
137140 CNetAddr source = ResolveIP (" 252.2.2.2" );
138141
@@ -191,7 +194,7 @@ BOOST_AUTO_TEST_CASE(addrman_select)
191194
192195BOOST_AUTO_TEST_CASE (addrman_new_collisions)
193196{
194- auto addrman = TestAddrMan ( );
197+ auto addrman = std::make_unique<AddrMan>(EMPTY_ASMAP, DETERMINISTIC, GetCheckRatio (m_node) );
195198
196199 CNetAddr source = ResolveIP (" 252.2.2.2" );
197200
@@ -220,7 +223,7 @@ BOOST_AUTO_TEST_CASE(addrman_new_collisions)
220223
221224BOOST_AUTO_TEST_CASE (addrman_new_multiplicity)
222225{
223- auto addrman = TestAddrMan ( );
226+ auto addrman = std::make_unique<AddrMan>(EMPTY_ASMAP, DETERMINISTIC, GetCheckRatio (m_node) );
224227 CAddress addr{CAddress (ResolveService (" 253.3.3.3" , 8333 ), NODE_NONE)};
225228 int64_t start_time{GetAdjustedTime ()};
226229 addr.nTime = start_time;
@@ -252,7 +255,7 @@ BOOST_AUTO_TEST_CASE(addrman_new_multiplicity)
252255
253256BOOST_AUTO_TEST_CASE (addrman_tried_collisions)
254257{
255- auto addrman = TestAddrMan ( );
258+ auto addrman = std::make_unique<AddrMan>(EMPTY_ASMAP, DETERMINISTIC, GetCheckRatio (m_node) );
256259
257260 CNetAddr source = ResolveIP (" 252.2.2.2" );
258261
@@ -283,7 +286,7 @@ BOOST_AUTO_TEST_CASE(addrman_tried_collisions)
283286
284287BOOST_AUTO_TEST_CASE (addrman_getaddr)
285288{
286- auto addrman = TestAddrMan ( );
289+ auto addrman = std::make_unique<AddrMan>(EMPTY_ASMAP, DETERMINISTIC, GetCheckRatio (m_node) );
287290
288291 // Test: Sanity check, GetAddr should never return anything if addrman
289292 // is empty.
@@ -604,9 +607,11 @@ BOOST_AUTO_TEST_CASE(addrman_serialization)
604607{
605608 std::vector<bool > asmap1 = FromBytes (asmap_raw, sizeof (asmap_raw) * 8 );
606609
607- auto addrman_asmap1 = TestAddrMan (asmap1);
608- auto addrman_asmap1_dup = TestAddrMan (asmap1);
609- auto addrman_noasmap = TestAddrMan ();
610+ const auto ratio = GetCheckRatio (m_node);
611+ auto addrman_asmap1 = std::make_unique<AddrMan>(asmap1, DETERMINISTIC, ratio);
612+ auto addrman_asmap1_dup = std::make_unique<AddrMan>(asmap1, DETERMINISTIC, ratio);
613+ auto addrman_noasmap = std::make_unique<AddrMan>(EMPTY_ASMAP, DETERMINISTIC, ratio);
614+
610615 CDataStream stream (SER_NETWORK, PROTOCOL_VERSION);
611616
612617 CAddress addr = CAddress (ResolveService (" 250.1.1.1" ), NODE_NONE);
@@ -634,8 +639,8 @@ BOOST_AUTO_TEST_CASE(addrman_serialization)
634639 BOOST_CHECK (addr_pos1.position != addr_pos3.position );
635640
636641 // deserializing non-asmaped peers.dat to asmaped addrman
637- addrman_asmap1 = TestAddrMan (asmap1);
638- addrman_noasmap = TestAddrMan ( );
642+ addrman_asmap1 = std::make_unique<AddrMan> (asmap1, DETERMINISTIC, ratio );
643+ addrman_noasmap = std::make_unique<AddrMan>(EMPTY_ASMAP, DETERMINISTIC, ratio );
639644 addrman_noasmap->Add ({addr}, default_source);
640645 stream << *addrman_noasmap;
641646 stream >> *addrman_asmap1;
@@ -646,8 +651,8 @@ BOOST_AUTO_TEST_CASE(addrman_serialization)
646651 BOOST_CHECK (addr_pos4 == addr_pos2);
647652
648653 // used to map to different buckets, now maps to the same bucket.
649- addrman_asmap1 = TestAddrMan (asmap1);
650- addrman_noasmap = TestAddrMan ( );
654+ addrman_asmap1 = std::make_unique<AddrMan> (asmap1, DETERMINISTIC, ratio );
655+ addrman_noasmap = std::make_unique<AddrMan>(EMPTY_ASMAP, DETERMINISTIC, ratio );
651656 CAddress addr1 = CAddress (ResolveService (" 250.1.1.1" ), NODE_NONE);
652657 CAddress addr2 = CAddress (ResolveService (" 250.2.1.1" ), NODE_NONE);
653658 addrman_noasmap->Add ({addr, addr2}, default_source);
@@ -666,7 +671,7 @@ BOOST_AUTO_TEST_CASE(remove_invalid)
666671{
667672 // Confirm that invalid addresses are ignored in unserialization.
668673
669- auto addrman = TestAddrMan ( );
674+ auto addrman = std::make_unique<AddrMan>(EMPTY_ASMAP, DETERMINISTIC, GetCheckRatio (m_node) );
670675 CDataStream stream (SER_NETWORK, PROTOCOL_VERSION);
671676
672677 const CAddress new1{ResolveService (" 5.5.5.5" ), NODE_NONE};
@@ -698,14 +703,14 @@ BOOST_AUTO_TEST_CASE(remove_invalid)
698703 BOOST_REQUIRE (pos + sizeof (tried2_raw_replacement) <= stream.size ());
699704 memcpy (stream.data () + pos, tried2_raw_replacement, sizeof (tried2_raw_replacement));
700705
701- addrman = TestAddrMan ( );
706+ addrman = std::make_unique<AddrMan>(EMPTY_ASMAP, DETERMINISTIC, GetCheckRatio (m_node) );
702707 stream >> *addrman;
703708 BOOST_CHECK_EQUAL (addrman->size (), 2 );
704709}
705710
706711BOOST_AUTO_TEST_CASE (addrman_selecttriedcollision)
707712{
708- auto addrman = TestAddrMan ( );
713+ auto addrman = std::make_unique<AddrMan>(EMPTY_ASMAP, DETERMINISTIC, GetCheckRatio (m_node) );
709714
710715 BOOST_CHECK (addrman->size () == 0 );
711716
@@ -738,7 +743,7 @@ BOOST_AUTO_TEST_CASE(addrman_selecttriedcollision)
738743
739744BOOST_AUTO_TEST_CASE (addrman_noevict)
740745{
741- auto addrman = TestAddrMan ( );
746+ auto addrman = std::make_unique<AddrMan>(EMPTY_ASMAP, DETERMINISTIC, GetCheckRatio (m_node) );
742747
743748 // Add 35 addresses.
744749 CNetAddr source = ResolveIP (" 252.2.2.2" );
@@ -790,7 +795,7 @@ BOOST_AUTO_TEST_CASE(addrman_noevict)
790795
791796BOOST_AUTO_TEST_CASE (addrman_evictionworks)
792797{
793- auto addrman = TestAddrMan ( );
798+ auto addrman = std::make_unique<AddrMan>(EMPTY_ASMAP, DETERMINISTIC, GetCheckRatio (m_node) );
794799
795800 BOOST_CHECK (addrman->size () == 0 );
796801
@@ -860,8 +865,7 @@ static CDataStream AddrmanToStream(const AddrMan& addrman)
860865
861866BOOST_AUTO_TEST_CASE (load_addrman)
862867{
863- AddrMan addrman{/* asmap=*/ std::vector<bool >(), /* deterministic=*/ true ,
864- /* consistency_check_ratio=*/ 100 };
868+ AddrMan addrman{EMPTY_ASMAP, DETERMINISTIC, GetCheckRatio (m_node)};
865869
866870 CService addr1, addr2, addr3;
867871 BOOST_CHECK (Lookup (" 250.7.1.1" , addr1, 8333 , false ));
@@ -880,7 +884,7 @@ BOOST_AUTO_TEST_CASE(load_addrman)
880884 // Test that the de-serialization does not throw an exception.
881885 CDataStream ssPeers1 = AddrmanToStream (addrman);
882886 bool exceptionThrown = false ;
883- AddrMan addrman1 ( /* asmap= */ std::vector< bool >(), /* deterministic= */ false , /* consistency_check_ratio= */ 100 ) ;
887+ AddrMan addrman1{EMPTY_ASMAP, !DETERMINISTIC, GetCheckRatio (m_node)} ;
884888
885889 BOOST_CHECK (addrman1.size () == 0 );
886890 try {
@@ -897,7 +901,7 @@ BOOST_AUTO_TEST_CASE(load_addrman)
897901 // Test that ReadFromStream creates an addrman with the correct number of addrs.
898902 CDataStream ssPeers2 = AddrmanToStream (addrman);
899903
900- AddrMan addrman2 ( /* asmap= */ std::vector< bool >(), /* deterministic= */ false , /* consistency_check_ratio= */ 100 ) ;
904+ AddrMan addrman2{EMPTY_ASMAP, !DETERMINISTIC, GetCheckRatio (m_node)} ;
901905 BOOST_CHECK (addrman2.size () == 0 );
902906 ReadFromStream (addrman2, ssPeers2);
903907 BOOST_CHECK (addrman2.size () == 3 );
@@ -935,7 +939,7 @@ BOOST_AUTO_TEST_CASE(load_addrman_corrupted)
935939 // Test that the de-serialization of corrupted peers.dat throws an exception.
936940 CDataStream ssPeers1 = MakeCorruptPeersDat ();
937941 bool exceptionThrown = false ;
938- AddrMan addrman1 ( /* asmap= */ std::vector< bool >(), /* deterministic= */ false , /* consistency_check_ratio= */ 100 ) ;
942+ AddrMan addrman1{EMPTY_ASMAP, !DETERMINISTIC, GetCheckRatio (m_node)} ;
939943 BOOST_CHECK (addrman1.size () == 0 );
940944 try {
941945 unsigned char pchMsgTmp[4 ];
@@ -951,15 +955,15 @@ BOOST_AUTO_TEST_CASE(load_addrman_corrupted)
951955 // Test that ReadFromStream fails if peers.dat is corrupt
952956 CDataStream ssPeers2 = MakeCorruptPeersDat ();
953957
954- AddrMan addrman2 ( /* asmap= */ std::vector< bool >(), /* deterministic= */ false , /* consistency_check_ratio= */ 100 ) ;
958+ AddrMan addrman2{EMPTY_ASMAP, !DETERMINISTIC, GetCheckRatio (m_node)} ;
955959 BOOST_CHECK (addrman2.size () == 0 );
956960 BOOST_CHECK_THROW (ReadFromStream (addrman2, ssPeers2), std::ios_base::failure);
957961}
958962
959963BOOST_AUTO_TEST_CASE (addrman_update_address)
960964{
961965 // Tests updating nTime via Connected() and nServices via SetServices()
962- auto addrman = TestAddrMan ( );
966+ auto addrman = std::make_unique<AddrMan>(EMPTY_ASMAP, DETERMINISTIC, GetCheckRatio (m_node) );
963967 CNetAddr source{ResolveIP (" 252.2.2.2" )};
964968 CAddress addr{CAddress (ResolveService (" 250.1.1.1" , 8333 ), NODE_NONE)};
965969
0 commit comments