Skip to content

Commit 406be5f

Browse files
committed
[addrman] Remove all public uses of CAddrMan.Clear() from the tests
Just use unique_ptr<CAddrMan>s and reset the pointer if a frest addrman is required. Also make CAddrMan::Clear() private to ensure that no call sites are missed.
1 parent ed9ba8a commit 406be5f

File tree

4 files changed

+56
-73
lines changed

4 files changed

+56
-73
lines changed

src/addrman.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -471,6 +471,7 @@ class CAddrMan
471471
Check();
472472
}
473473

474+
private:
474475
void Clear()
475476
EXCLUSIVE_LOCKS_REQUIRED(!cs)
476477
{
@@ -496,6 +497,7 @@ class CAddrMan
496497
mapAddr.clear();
497498
}
498499

500+
public:
499501
explicit CAddrMan(bool deterministic, int32_t consistency_check_ratio)
500502
: insecure_rand{deterministic},
501503
m_consistency_check_ratio{consistency_check_ratio}

src/bench/addrman.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,11 +72,9 @@ static void AddrManAdd(benchmark::Bench& bench)
7272
{
7373
CreateAddresses();
7474

75-
CAddrMan addrman(/* deterministic */ false, /* consistency_check_ratio */ 0);
76-
7775
bench.run([&] {
76+
CAddrMan addrman{/* deterministic */ false, /* consistency_check_ratio */ 0};
7877
AddAddressesToAddrMan(addrman);
79-
addrman.Clear();
8078
});
8179
}
8280

src/test/addrman_tests.cpp

Lines changed: 49 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -132,16 +132,6 @@ class CAddrManTest : public CAddrMan
132132
int64_t nLastTry = GetAdjustedTime()-61;
133133
Attempt(addr, count_failure, nLastTry);
134134
}
135-
136-
void Clear()
137-
{
138-
CAddrMan::Clear();
139-
if (deterministic) {
140-
LOCK(cs);
141-
nKey = uint256{1};
142-
insecure_rand = FastRandomContext(true);
143-
}
144-
}
145135
};
146136

147137
static CNetAddr ResolveIP(const std::string& ip)
@@ -175,27 +165,27 @@ BOOST_FIXTURE_TEST_SUITE(addrman_tests, BasicTestingSetup)
175165

176166
BOOST_AUTO_TEST_CASE(addrman_simple)
177167
{
178-
CAddrManTest addrman;
168+
auto addrman = std::make_unique<CAddrManTest>();
179169

180170
CNetAddr source = ResolveIP("252.2.2.2");
181171

182172
// Test: Does Addrman respond correctly when empty.
183-
BOOST_CHECK_EQUAL(addrman.size(), 0U);
184-
CAddrInfo addr_null = addrman.Select();
173+
BOOST_CHECK_EQUAL(addrman->size(), 0U);
174+
CAddrInfo addr_null = addrman->Select();
185175
BOOST_CHECK_EQUAL(addr_null.ToString(), "[::]:0");
186176

187177
// Test: Does Addrman::Add work as expected.
188178
CService addr1 = ResolveService("250.1.1.1", 8333);
189-
BOOST_CHECK(addrman.Add({CAddress(addr1, NODE_NONE)}, source));
190-
BOOST_CHECK_EQUAL(addrman.size(), 1U);
191-
CAddrInfo addr_ret1 = addrman.Select();
179+
BOOST_CHECK(addrman->Add({CAddress(addr1, NODE_NONE)}, source));
180+
BOOST_CHECK_EQUAL(addrman->size(), 1U);
181+
CAddrInfo addr_ret1 = addrman->Select();
192182
BOOST_CHECK_EQUAL(addr_ret1.ToString(), "250.1.1.1:8333");
193183

194184
// Test: Does IP address deduplication work correctly.
195185
// Expected dup IP should not be added.
196186
CService addr1_dup = ResolveService("250.1.1.1", 8333);
197-
BOOST_CHECK(!addrman.Add({CAddress(addr1_dup, NODE_NONE)}, source));
198-
BOOST_CHECK_EQUAL(addrman.size(), 1U);
187+
BOOST_CHECK(!addrman->Add({CAddress(addr1_dup, NODE_NONE)}, source));
188+
BOOST_CHECK_EQUAL(addrman->size(), 1U);
199189

200190

201191
// Test: New table has one addr and we add a diff addr we should
@@ -205,21 +195,16 @@ BOOST_AUTO_TEST_CASE(addrman_simple)
205195
// success.
206196

207197
CService addr2 = ResolveService("250.1.1.2", 8333);
208-
BOOST_CHECK(addrman.Add({CAddress(addr2, NODE_NONE)}, source));
209-
BOOST_CHECK(addrman.size() >= 1);
198+
BOOST_CHECK(addrman->Add({CAddress(addr2, NODE_NONE)}, source));
199+
BOOST_CHECK(addrman->size() >= 1);
210200

211-
// Test: AddrMan::Clear() should empty the new table.
212-
addrman.Clear();
213-
BOOST_CHECK_EQUAL(addrman.size(), 0U);
214-
CAddrInfo addr_null2 = addrman.Select();
215-
BOOST_CHECK_EQUAL(addr_null2.ToString(), "[::]:0");
216-
217-
// Test: AddrMan::Add multiple addresses works as expected
201+
// Test: reset addrman and test AddrMan::Add multiple addresses works as expected
202+
addrman = std::make_unique<CAddrManTest>();
218203
std::vector<CAddress> vAddr;
219204
vAddr.push_back(CAddress(ResolveService("250.1.1.3", 8333), NODE_NONE));
220205
vAddr.push_back(CAddress(ResolveService("250.1.1.4", 8333), NODE_NONE));
221-
BOOST_CHECK(addrman.Add(vAddr, source));
222-
BOOST_CHECK(addrman.size() >= 1);
206+
BOOST_CHECK(addrman->Add(vAddr, source));
207+
BOOST_CHECK(addrman->size() >= 1);
223208
}
224209

225210
BOOST_AUTO_TEST_CASE(addrman_ports)
@@ -774,63 +759,63 @@ BOOST_AUTO_TEST_CASE(addrman_serialization)
774759
{
775760
std::vector<bool> asmap1 = FromBytes(asmap_raw, sizeof(asmap_raw) * 8);
776761

777-
CAddrManTest addrman_asmap1(true, asmap1);
778-
CAddrManTest addrman_asmap1_dup(true, asmap1);
779-
CAddrManTest addrman_noasmap;
762+
auto addrman_asmap1 = std::make_unique<CAddrManTest>(true, asmap1);
763+
auto addrman_asmap1_dup = std::make_unique<CAddrManTest>(true, asmap1);
764+
auto addrman_noasmap = std::make_unique<CAddrManTest>();
780765
CDataStream stream(SER_NETWORK, PROTOCOL_VERSION);
781766

782767
CAddress addr = CAddress(ResolveService("250.1.1.1"), NODE_NONE);
783768
CNetAddr default_source;
784769

785770

786-
addrman_asmap1.Add({addr}, default_source);
771+
addrman_asmap1->Add({addr}, default_source);
787772

788-
stream << addrman_asmap1;
773+
stream << *addrman_asmap1;
789774
// serizalizing/deserializing addrman with the same asmap
790-
stream >> addrman_asmap1_dup;
775+
stream >> *addrman_asmap1_dup;
791776

792-
std::pair<int, int> bucketAndEntry_asmap1 = addrman_asmap1.GetBucketAndEntry(addr);
793-
std::pair<int, int> bucketAndEntry_asmap1_dup = addrman_asmap1_dup.GetBucketAndEntry(addr);
777+
std::pair<int, int> bucketAndEntry_asmap1 = addrman_asmap1->GetBucketAndEntry(addr);
778+
std::pair<int, int> bucketAndEntry_asmap1_dup = addrman_asmap1_dup->GetBucketAndEntry(addr);
794779
BOOST_CHECK(bucketAndEntry_asmap1.second != -1);
795780
BOOST_CHECK(bucketAndEntry_asmap1_dup.second != -1);
796781

797782
BOOST_CHECK(bucketAndEntry_asmap1.first == bucketAndEntry_asmap1_dup.first);
798783
BOOST_CHECK(bucketAndEntry_asmap1.second == bucketAndEntry_asmap1_dup.second);
799784

800785
// deserializing asmaped peers.dat to non-asmaped addrman
801-
stream << addrman_asmap1;
802-
stream >> addrman_noasmap;
803-
std::pair<int, int> bucketAndEntry_noasmap = addrman_noasmap.GetBucketAndEntry(addr);
786+
stream << *addrman_asmap1;
787+
stream >> *addrman_noasmap;
788+
std::pair<int, int> bucketAndEntry_noasmap = addrman_noasmap->GetBucketAndEntry(addr);
804789
BOOST_CHECK(bucketAndEntry_noasmap.second != -1);
805790
BOOST_CHECK(bucketAndEntry_asmap1.first != bucketAndEntry_noasmap.first);
806791
BOOST_CHECK(bucketAndEntry_asmap1.second != bucketAndEntry_noasmap.second);
807792

808793
// deserializing non-asmaped peers.dat to asmaped addrman
809-
addrman_asmap1.Clear();
810-
addrman_noasmap.Clear();
811-
addrman_noasmap.Add({addr}, default_source);
812-
stream << addrman_noasmap;
813-
stream >> addrman_asmap1;
814-
std::pair<int, int> bucketAndEntry_asmap1_deser = addrman_asmap1.GetBucketAndEntry(addr);
794+
addrman_asmap1 = std::make_unique<CAddrManTest>(true, asmap1);
795+
addrman_noasmap = std::make_unique<CAddrManTest>();
796+
addrman_noasmap->Add({addr}, default_source);
797+
stream << *addrman_noasmap;
798+
stream >> *addrman_asmap1;
799+
std::pair<int, int> bucketAndEntry_asmap1_deser = addrman_asmap1->GetBucketAndEntry(addr);
815800
BOOST_CHECK(bucketAndEntry_asmap1_deser.second != -1);
816801
BOOST_CHECK(bucketAndEntry_asmap1_deser.first != bucketAndEntry_noasmap.first);
817802
BOOST_CHECK(bucketAndEntry_asmap1_deser.first == bucketAndEntry_asmap1_dup.first);
818803
BOOST_CHECK(bucketAndEntry_asmap1_deser.second == bucketAndEntry_asmap1_dup.second);
819804

820805
// used to map to different buckets, now maps to the same bucket.
821-
addrman_asmap1.Clear();
822-
addrman_noasmap.Clear();
806+
addrman_asmap1 = std::make_unique<CAddrManTest>(true, asmap1);
807+
addrman_noasmap = std::make_unique<CAddrManTest>();
823808
CAddress addr1 = CAddress(ResolveService("250.1.1.1"), NODE_NONE);
824809
CAddress addr2 = CAddress(ResolveService("250.2.1.1"), NODE_NONE);
825-
addrman_noasmap.Add({addr, addr2}, default_source);
826-
std::pair<int, int> bucketAndEntry_noasmap_addr1 = addrman_noasmap.GetBucketAndEntry(addr1);
827-
std::pair<int, int> bucketAndEntry_noasmap_addr2 = addrman_noasmap.GetBucketAndEntry(addr2);
810+
addrman_noasmap->Add({addr, addr2}, default_source);
811+
std::pair<int, int> bucketAndEntry_noasmap_addr1 = addrman_noasmap->GetBucketAndEntry(addr1);
812+
std::pair<int, int> bucketAndEntry_noasmap_addr2 = addrman_noasmap->GetBucketAndEntry(addr2);
828813
BOOST_CHECK(bucketAndEntry_noasmap_addr1.first != bucketAndEntry_noasmap_addr2.first);
829814
BOOST_CHECK(bucketAndEntry_noasmap_addr1.second != bucketAndEntry_noasmap_addr2.second);
830-
stream << addrman_noasmap;
831-
stream >> addrman_asmap1;
832-
std::pair<int, int> bucketAndEntry_asmap1_deser_addr1 = addrman_asmap1.GetBucketAndEntry(addr1);
833-
std::pair<int, int> bucketAndEntry_asmap1_deser_addr2 = addrman_asmap1.GetBucketAndEntry(addr2);
815+
stream << *addrman_noasmap;
816+
stream >> *addrman_asmap1;
817+
std::pair<int, int> bucketAndEntry_asmap1_deser_addr1 = addrman_asmap1->GetBucketAndEntry(addr1);
818+
std::pair<int, int> bucketAndEntry_asmap1_deser_addr2 = addrman_asmap1->GetBucketAndEntry(addr2);
834819
BOOST_CHECK(bucketAndEntry_asmap1_deser_addr1.first == bucketAndEntry_asmap1_deser_addr2.first);
835820
BOOST_CHECK(bucketAndEntry_asmap1_deser_addr1.second != bucketAndEntry_asmap1_deser_addr2.second);
836821
}
@@ -839,20 +824,20 @@ BOOST_AUTO_TEST_CASE(remove_invalid)
839824
{
840825
// Confirm that invalid addresses are ignored in unserialization.
841826

842-
CAddrManTest addrman;
827+
auto addrman = std::make_unique<CAddrManTest>();
843828
CDataStream stream(SER_NETWORK, PROTOCOL_VERSION);
844829

845830
const CAddress new1{ResolveService("5.5.5.5"), NODE_NONE};
846831
const CAddress new2{ResolveService("6.6.6.6"), NODE_NONE};
847832
const CAddress tried1{ResolveService("7.7.7.7"), NODE_NONE};
848833
const CAddress tried2{ResolveService("8.8.8.8"), NODE_NONE};
849834

850-
addrman.Add({new1, tried1, new2, tried2}, CNetAddr{});
851-
addrman.Good(tried1);
852-
addrman.Good(tried2);
853-
BOOST_REQUIRE_EQUAL(addrman.size(), 4);
835+
addrman->Add({new1, tried1, new2, tried2}, CNetAddr{});
836+
addrman->Good(tried1);
837+
addrman->Good(tried2);
838+
BOOST_REQUIRE_EQUAL(addrman->size(), 4);
854839

855-
stream << addrman;
840+
stream << *addrman;
856841

857842
const std::string str{stream.str()};
858843
size_t pos;
@@ -871,9 +856,9 @@ BOOST_AUTO_TEST_CASE(remove_invalid)
871856
BOOST_REQUIRE(pos + sizeof(tried2_raw_replacement) <= stream.size());
872857
memcpy(stream.data() + pos, tried2_raw_replacement, sizeof(tried2_raw_replacement));
873858

874-
addrman.Clear();
875-
stream >> addrman;
876-
BOOST_CHECK_EQUAL(addrman.size(), 2);
859+
addrman = std::make_unique<CAddrManTest>();
860+
stream >> *addrman;
861+
BOOST_CHECK_EQUAL(addrman->size(), 2);
877862
}
878863

879864
BOOST_AUTO_TEST_CASE(addrman_selecttriedcollision)

src/test/fuzz/addrman.cpp

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -228,24 +228,22 @@ FUZZ_TARGET_INIT(addrman, initialize_addrman)
228228
{
229229
FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
230230
SetMockTime(ConsumeTime(fuzzed_data_provider));
231-
CAddrManDeterministic addr_man{fuzzed_data_provider};
231+
auto addr_man_ptr = std::make_unique<CAddrManDeterministic>(fuzzed_data_provider);
232232
if (fuzzed_data_provider.ConsumeBool()) {
233233
const std::vector<uint8_t> serialized_data{ConsumeRandomLengthByteVector(fuzzed_data_provider)};
234234
CDataStream ds(serialized_data, SER_DISK, INIT_PROTO_VERSION);
235235
const auto ser_version{fuzzed_data_provider.ConsumeIntegral<int32_t>()};
236236
ds.SetVersion(ser_version);
237237
try {
238-
ds >> addr_man;
238+
ds >> *addr_man_ptr;
239239
} catch (const std::ios_base::failure&) {
240-
addr_man.Clear();
240+
addr_man_ptr = std::make_unique<CAddrManDeterministic>(fuzzed_data_provider);
241241
}
242242
}
243+
CAddrManDeterministic& addr_man = *addr_man_ptr;
243244
while (fuzzed_data_provider.ConsumeBool()) {
244245
CallOneOf(
245246
fuzzed_data_provider,
246-
[&] {
247-
addr_man.Clear();
248-
},
249247
[&] {
250248
addr_man.ResolveCollisions();
251249
},

0 commit comments

Comments
 (0)