22
22
23
23
using namespace std ::literals;
24
24
25
- class AddrManSerializationMock : public AddrMan
26
- {
27
- public:
28
- virtual void Serialize (CDataStream& s) const = 0;
29
-
30
- AddrManSerializationMock ()
31
- : AddrMan(/* asmap */ std::vector<bool >(), /* deterministic */ true , /* consistency_check_ratio */ 100 )
32
- {}
33
- };
34
-
35
- class AddrManUncorrupted : public AddrManSerializationMock
36
- {
37
- public:
38
- void Serialize (CDataStream& s) const override
39
- {
40
- AddrMan::Serialize (s);
41
- }
42
- };
43
-
44
- class AddrManCorrupted : public AddrManSerializationMock
45
- {
46
- public:
47
- void Serialize (CDataStream& s) const override
48
- {
49
- // Produces corrupt output that claims addrman has 20 addrs when it only has one addr.
50
- unsigned char nVersion = 1 ;
51
- s << nVersion;
52
- s << ((unsigned char )32 );
53
- s << uint256::ONE;
54
- s << 10 ; // nNew
55
- s << 10 ; // nTried
56
-
57
- int nUBuckets = ADDRMAN_NEW_BUCKET_COUNT ^ (1 << 30 );
58
- s << nUBuckets;
59
-
60
- CService serv;
61
- BOOST_CHECK (Lookup (" 252.1.1.1" , serv, 7777 , false ));
62
- CAddress addr = CAddress (serv, NODE_NONE);
63
- CNetAddr resolved;
64
- BOOST_CHECK (LookupHost (" 252.2.2.2" , resolved, false ));
65
- AddrInfo info = AddrInfo (addr, resolved);
66
- s << info;
67
- }
68
- };
69
-
70
- static CDataStream AddrmanToStream (const AddrManSerializationMock& _addrman)
71
- {
72
- CDataStream ssPeersIn (SER_DISK, CLIENT_VERSION);
73
- ssPeersIn << Params ().MessageStart ();
74
- ssPeersIn << _addrman;
75
- std::string str = ssPeersIn.str ();
76
- std::vector<unsigned char > vchData (str.begin (), str.end ());
77
- return CDataStream (vchData, SER_DISK, CLIENT_VERSION);
78
- }
79
-
80
25
class AddrManTest : public AddrMan
81
26
{
82
- private:
83
- bool deterministic;
84
27
public:
85
- explicit AddrManTest (bool makeDeterministic = true ,
86
- std::vector<bool > asmap = std::vector<bool >())
87
- : AddrMan(asmap, makeDeterministic, /* consistency_check_ratio */ 100 )
88
- {
89
- deterministic = makeDeterministic;
90
- }
28
+ explicit AddrManTest (std::vector<bool > asmap = std::vector<bool >())
29
+ : AddrMan(asmap, /* deterministic=*/ true , /* consistency_check_ratio */ 100 )
30
+ {}
91
31
92
- AddrInfo* Find (const CService& addr, int * pnId = nullptr )
32
+ AddrInfo* Find (const CService& addr)
93
33
{
94
34
LOCK (m_impl->cs );
95
- return m_impl->Find (addr, pnId );
35
+ return m_impl->Find (addr);
96
36
}
97
37
98
- AddrInfo* Create (const CAddress& addr, const CNetAddr& addrSource, int * pnId = nullptr )
38
+ AddrInfo* Create (const CAddress& addr, const CNetAddr& addrSource, int * pnId)
99
39
{
100
40
LOCK (m_impl->cs );
101
41
return m_impl->Create (addr, addrSource, pnId);
@@ -760,8 +700,8 @@ BOOST_AUTO_TEST_CASE(addrman_serialization)
760
700
{
761
701
std::vector<bool > asmap1 = FromBytes (asmap_raw, sizeof (asmap_raw) * 8 );
762
702
763
- auto addrman_asmap1 = std::make_unique<AddrManTest>(true , asmap1);
764
- auto addrman_asmap1_dup = std::make_unique<AddrManTest>(true , asmap1);
703
+ auto addrman_asmap1 = std::make_unique<AddrManTest>(asmap1);
704
+ auto addrman_asmap1_dup = std::make_unique<AddrManTest>(asmap1);
765
705
auto addrman_noasmap = std::make_unique<AddrManTest>();
766
706
CDataStream stream (SER_NETWORK, PROTOCOL_VERSION);
767
707
@@ -792,7 +732,7 @@ BOOST_AUTO_TEST_CASE(addrman_serialization)
792
732
BOOST_CHECK (bucketAndEntry_asmap1.second != bucketAndEntry_noasmap.second );
793
733
794
734
// deserializing non-asmaped peers.dat to asmaped addrman
795
- addrman_asmap1 = std::make_unique<AddrManTest>(true , asmap1);
735
+ addrman_asmap1 = std::make_unique<AddrManTest>(asmap1);
796
736
addrman_noasmap = std::make_unique<AddrManTest>();
797
737
addrman_noasmap->Add ({addr}, default_source);
798
738
stream << *addrman_noasmap;
@@ -804,7 +744,7 @@ BOOST_AUTO_TEST_CASE(addrman_serialization)
804
744
BOOST_CHECK (bucketAndEntry_asmap1_deser.second == bucketAndEntry_asmap1_dup.second );
805
745
806
746
// used to map to different buckets, now maps to the same bucket.
807
- addrman_asmap1 = std::make_unique<AddrManTest>(true , asmap1);
747
+ addrman_asmap1 = std::make_unique<AddrManTest>(asmap1);
808
748
addrman_noasmap = std::make_unique<AddrManTest>();
809
749
CAddress addr1 = CAddress (ResolveService (" 250.1.1.1" ), NODE_NONE);
810
750
CAddress addr2 = CAddress (ResolveService (" 250.2.1.1" ), NODE_NONE);
@@ -1004,9 +944,20 @@ BOOST_AUTO_TEST_CASE(addrman_evictionworks)
1004
944
BOOST_CHECK (addrman.SelectTriedCollision ().first .ToString () == " [::]:0" );
1005
945
}
1006
946
947
+ static CDataStream AddrmanToStream (const AddrMan& addrman)
948
+ {
949
+ CDataStream ssPeersIn (SER_DISK, CLIENT_VERSION);
950
+ ssPeersIn << Params ().MessageStart ();
951
+ ssPeersIn << addrman;
952
+ std::string str = ssPeersIn.str ();
953
+ std::vector<unsigned char > vchData (str.begin (), str.end ());
954
+ return CDataStream (vchData, SER_DISK, CLIENT_VERSION);
955
+ }
956
+
1007
957
BOOST_AUTO_TEST_CASE (load_addrman)
1008
958
{
1009
- AddrManUncorrupted addrmanUncorrupted;
959
+ AddrMan addrman{/* asmap=*/ std::vector<bool >(), /* deterministic=*/ true ,
960
+ /* consistency_check_ratio=*/ 100 };
1010
961
1011
962
CService addr1, addr2, addr3;
1012
963
BOOST_CHECK (Lookup (" 250.7.1.1" , addr1, 8333 , false ));
@@ -1019,11 +970,11 @@ BOOST_AUTO_TEST_CASE(load_addrman)
1019
970
CService source;
1020
971
BOOST_CHECK (Lookup (" 252.5.1.1" , source, 8333 , false ));
1021
972
std::vector<CAddress> addresses{CAddress (addr1, NODE_NONE), CAddress (addr2, NODE_NONE), CAddress (addr3, NODE_NONE)};
1022
- BOOST_CHECK (addrmanUncorrupted .Add (addresses, source));
1023
- BOOST_CHECK (addrmanUncorrupted .size () == 3 );
973
+ BOOST_CHECK (addrman .Add (addresses, source));
974
+ BOOST_CHECK (addrman .size () == 3 );
1024
975
1025
976
// Test that the de-serialization does not throw an exception.
1026
- CDataStream ssPeers1 = AddrmanToStream (addrmanUncorrupted );
977
+ CDataStream ssPeers1 = AddrmanToStream (addrman );
1027
978
bool exceptionThrown = false ;
1028
979
AddrMan addrman1 (/* asmap */ std::vector<bool >(), /* deterministic */ false , /* consistency_check_ratio */ 100 );
1029
980
@@ -1040,21 +991,47 @@ BOOST_AUTO_TEST_CASE(load_addrman)
1040
991
BOOST_CHECK (exceptionThrown == false );
1041
992
1042
993
// Test that ReadFromStream creates an addrman with the correct number of addrs.
1043
- CDataStream ssPeers2 = AddrmanToStream (addrmanUncorrupted );
994
+ CDataStream ssPeers2 = AddrmanToStream (addrman );
1044
995
1045
996
AddrMan addrman2 (/* asmap */ std::vector<bool >(), /* deterministic */ false , /* consistency_check_ratio */ 100 );
1046
997
BOOST_CHECK (addrman2.size () == 0 );
1047
998
ReadFromStream (addrman2, ssPeers2);
1048
999
BOOST_CHECK (addrman2.size () == 3 );
1049
1000
}
1050
1001
1002
+ // Produce a corrupt peers.dat that claims 20 addrs when it only has one addr.
1003
+ static CDataStream MakeCorruptPeersDat ()
1004
+ {
1005
+ CDataStream s (SER_DISK, CLIENT_VERSION);
1006
+ s << ::Params ().MessageStart ();
1007
+
1008
+ unsigned char nVersion = 1 ;
1009
+ s << nVersion;
1010
+ s << ((unsigned char )32 );
1011
+ s << uint256::ONE;
1012
+ s << 10 ; // nNew
1013
+ s << 10 ; // nTried
1014
+
1015
+ int nUBuckets = ADDRMAN_NEW_BUCKET_COUNT ^ (1 << 30 );
1016
+ s << nUBuckets;
1017
+
1018
+ CService serv;
1019
+ BOOST_CHECK (Lookup (" 252.1.1.1" , serv, 7777 , false ));
1020
+ CAddress addr = CAddress (serv, NODE_NONE);
1021
+ CNetAddr resolved;
1022
+ BOOST_CHECK (LookupHost (" 252.2.2.2" , resolved, false ));
1023
+ AddrInfo info = AddrInfo (addr, resolved);
1024
+ s << info;
1025
+
1026
+ std::string str = s.str ();
1027
+ std::vector<unsigned char > vchData (str.begin (), str.end ());
1028
+ return CDataStream (vchData, SER_DISK, CLIENT_VERSION);
1029
+ }
1051
1030
1052
1031
BOOST_AUTO_TEST_CASE (load_addrman_corrupted)
1053
1032
{
1054
- AddrManCorrupted addrmanCorrupted;
1055
-
1056
- // Test that the de-serialization of corrupted addrman throws an exception.
1057
- CDataStream ssPeers1 = AddrmanToStream (addrmanCorrupted);
1033
+ // Test that the de-serialization of corrupted peers.dat throws an exception.
1034
+ CDataStream ssPeers1 = MakeCorruptPeersDat ();
1058
1035
bool exceptionThrown = false ;
1059
1036
AddrMan addrman1 (/* asmap */ std::vector<bool >(), /* deterministic */ false , /* consistency_check_ratio */ 100 );
1060
1037
BOOST_CHECK (addrman1.size () == 0 );
@@ -1070,7 +1047,7 @@ BOOST_AUTO_TEST_CASE(load_addrman_corrupted)
1070
1047
BOOST_CHECK (exceptionThrown);
1071
1048
1072
1049
// Test that ReadFromStream fails if peers.dat is corrupt
1073
- CDataStream ssPeers2 = AddrmanToStream (addrmanCorrupted );
1050
+ CDataStream ssPeers2 = MakeCorruptPeersDat ( );
1074
1051
1075
1052
AddrMan addrman2 (/* asmap */ std::vector<bool >(), /* deterministic */ false , /* consistency_check_ratio */ 100 );
1076
1053
BOOST_CHECK (addrman2.size () == 0 );
0 commit comments