Skip to content

Commit 1ff265a

Browse files
author
MarcoFalke
committed
Merge bitcoin/bitcoin#23477: addrman: tidy up unit tests
36d3510 [addrman] [tests] Remove AddrManUncorrupted subclass (John Newbery) dfbd3a6 [addrman] [tests] Remove AddrManCorrupted subclass (John Newbery) d02098d [addrman] [tests] Tidy up unused arguments in addrman test functions (John Newbery) 7784a9a [addrman] [tests] Remove deterministic argument and member from AddrManTest (John Newbery) a749fa5 [addrman] Remove AddrMan friends (John Newbery) Pull request description: Various tidy-ups to the addrman tests. ACKs for top commit: shaavan: crACK 36d3510 promag: Code review ACK 36d3510. theStack: Code-review ACK 36d3510 Tree-SHA512: bbdb9d70863c15b023714ba3c73e816c635204f949c39678dd932a6e9a2e57b51b5d50332ec6843cf1b98a2fcbbdd5e6779f2e9c7e9cf90f4a6b3b4a7a1abe2f
2 parents c1fb306 + 36d3510 commit 1ff265a

File tree

2 files changed

+58
-83
lines changed

2 files changed

+58
-83
lines changed

Diff for: src/addrman.h

+1-3
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ static constexpr int32_t DEFAULT_ADDRMAN_CONSISTENCY_CHECKS{0};
5353
*/
5454
class AddrMan
5555
{
56+
protected:
5657
const std::unique_ptr<AddrManImpl> m_impl;
5758

5859
public:
@@ -135,9 +136,6 @@ class AddrMan
135136
void SetServices(const CService& addr, ServiceFlags nServices);
136137

137138
const std::vector<bool>& GetAsmap() const;
138-
139-
friend class AddrManTest;
140-
friend class AddrManDeterministic;
141139
};
142140

143141
#endif // BITCOIN_ADDRMAN_H

Diff for: src/test/addrman_tests.cpp

+57-80
Original file line numberDiff line numberDiff line change
@@ -22,80 +22,20 @@
2222

2323
using namespace std::literals;
2424

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-
8025
class AddrManTest : public AddrMan
8126
{
82-
private:
83-
bool deterministic;
8427
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+
{}
9131

92-
AddrInfo* Find(const CService& addr, int* pnId = nullptr)
32+
AddrInfo* Find(const CService& addr)
9333
{
9434
LOCK(m_impl->cs);
95-
return m_impl->Find(addr, pnId);
35+
return m_impl->Find(addr);
9636
}
9737

98-
AddrInfo* Create(const CAddress& addr, const CNetAddr& addrSource, int* pnId = nullptr)
38+
AddrInfo* Create(const CAddress& addr, const CNetAddr& addrSource, int* pnId)
9939
{
10040
LOCK(m_impl->cs);
10141
return m_impl->Create(addr, addrSource, pnId);
@@ -760,8 +700,8 @@ BOOST_AUTO_TEST_CASE(addrman_serialization)
760700
{
761701
std::vector<bool> asmap1 = FromBytes(asmap_raw, sizeof(asmap_raw) * 8);
762702

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);
765705
auto addrman_noasmap = std::make_unique<AddrManTest>();
766706
CDataStream stream(SER_NETWORK, PROTOCOL_VERSION);
767707

@@ -792,7 +732,7 @@ BOOST_AUTO_TEST_CASE(addrman_serialization)
792732
BOOST_CHECK(bucketAndEntry_asmap1.second != bucketAndEntry_noasmap.second);
793733

794734
// 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);
796736
addrman_noasmap = std::make_unique<AddrManTest>();
797737
addrman_noasmap->Add({addr}, default_source);
798738
stream << *addrman_noasmap;
@@ -804,7 +744,7 @@ BOOST_AUTO_TEST_CASE(addrman_serialization)
804744
BOOST_CHECK(bucketAndEntry_asmap1_deser.second == bucketAndEntry_asmap1_dup.second);
805745

806746
// 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);
808748
addrman_noasmap = std::make_unique<AddrManTest>();
809749
CAddress addr1 = CAddress(ResolveService("250.1.1.1"), NODE_NONE);
810750
CAddress addr2 = CAddress(ResolveService("250.2.1.1"), NODE_NONE);
@@ -1004,9 +944,20 @@ BOOST_AUTO_TEST_CASE(addrman_evictionworks)
1004944
BOOST_CHECK(addrman.SelectTriedCollision().first.ToString() == "[::]:0");
1005945
}
1006946

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+
1007957
BOOST_AUTO_TEST_CASE(load_addrman)
1008958
{
1009-
AddrManUncorrupted addrmanUncorrupted;
959+
AddrMan addrman{/*asmap=*/ std::vector<bool>(), /*deterministic=*/ true,
960+
/*consistency_check_ratio=*/ 100};
1010961

1011962
CService addr1, addr2, addr3;
1012963
BOOST_CHECK(Lookup("250.7.1.1", addr1, 8333, false));
@@ -1019,11 +970,11 @@ BOOST_AUTO_TEST_CASE(load_addrman)
1019970
CService source;
1020971
BOOST_CHECK(Lookup("252.5.1.1", source, 8333, false));
1021972
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);
1024975

1025976
// Test that the de-serialization does not throw an exception.
1026-
CDataStream ssPeers1 = AddrmanToStream(addrmanUncorrupted);
977+
CDataStream ssPeers1 = AddrmanToStream(addrman);
1027978
bool exceptionThrown = false;
1028979
AddrMan addrman1(/* asmap */ std::vector<bool>(), /* deterministic */ false, /* consistency_check_ratio */ 100);
1029980

@@ -1040,21 +991,47 @@ BOOST_AUTO_TEST_CASE(load_addrman)
1040991
BOOST_CHECK(exceptionThrown == false);
1041992

1042993
// Test that ReadFromStream creates an addrman with the correct number of addrs.
1043-
CDataStream ssPeers2 = AddrmanToStream(addrmanUncorrupted);
994+
CDataStream ssPeers2 = AddrmanToStream(addrman);
1044995

1045996
AddrMan addrman2(/* asmap */ std::vector<bool>(), /* deterministic */ false, /* consistency_check_ratio */ 100);
1046997
BOOST_CHECK(addrman2.size() == 0);
1047998
ReadFromStream(addrman2, ssPeers2);
1048999
BOOST_CHECK(addrman2.size() == 3);
10491000
}
10501001

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+
}
10511030

10521031
BOOST_AUTO_TEST_CASE(load_addrman_corrupted)
10531032
{
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();
10581035
bool exceptionThrown = false;
10591036
AddrMan addrman1(/* asmap */ std::vector<bool>(), /* deterministic */ false, /* consistency_check_ratio */ 100);
10601037
BOOST_CHECK(addrman1.size() == 0);
@@ -1070,7 +1047,7 @@ BOOST_AUTO_TEST_CASE(load_addrman_corrupted)
10701047
BOOST_CHECK(exceptionThrown);
10711048

10721049
// Test that ReadFromStream fails if peers.dat is corrupt
1073-
CDataStream ssPeers2 = AddrmanToStream(addrmanCorrupted);
1050+
CDataStream ssPeers2 = MakeCorruptPeersDat();
10741051

10751052
AddrMan addrman2(/* asmap */ std::vector<bool>(), /* deterministic */ false, /* consistency_check_ratio */ 100);
10761053
BOOST_CHECK(addrman2.size() == 0);

0 commit comments

Comments
 (0)