Skip to content

Commit f86cf27

Browse files
committed
test: addrman: test self-announcement time penalty handling
Verify that addresses announcing themselves (addr == source) are exempt from time penalties, while addresses announced by others receive the expected penalty.
1 parent 0ffb20d commit f86cf27

1 file changed

Lines changed: 41 additions & 0 deletions

File tree

src/test/addrman_tests.cpp

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
#include <boost/test/unit_test.hpp>
1919

20+
#include <cstdint>
2021
#include <optional>
2122
#include <string>
2223

@@ -106,6 +107,46 @@ BOOST_AUTO_TEST_CASE(addrman_simple)
106107
BOOST_CHECK(addrman->Size() >= 1);
107108
}
108109

110+
BOOST_AUTO_TEST_CASE(addrman_penalty_self_announcement)
111+
{
112+
SetMockTime(12345678);
113+
auto addrman = std::make_unique<AddrMan>(EMPTY_NETGROUPMAN, DETERMINISTIC, GetCheckRatio(m_node));
114+
115+
const auto base_time{Now<NodeSeconds>() - 10000s};
116+
CService addr1 = ResolveService("250.1.1.1", 8333);
117+
CNetAddr source1 = ResolveIP("250.1.1.1"); // Same as addr1 - self announcement
118+
119+
CAddress caddr1(addr1, NODE_NONE);
120+
caddr1.nTime = base_time;
121+
122+
const auto time_penalty{3600s};
123+
124+
BOOST_CHECK(addrman->Add({caddr1}, source1, time_penalty));
125+
126+
auto addr_pos1{addrman->FindAddressEntry(caddr1)};
127+
BOOST_REQUIRE(addr_pos1.has_value());
128+
129+
std::vector<CAddress> addresses{addrman->GetAddr(/*max_addresses=*/0, /*max_pct=*/0, /*network=*/std::nullopt)};
130+
BOOST_REQUIRE_EQUAL(addresses.size(), 1U);
131+
132+
BOOST_CHECK(addresses[0].nTime == base_time);
133+
134+
CService addr2{ResolveService("250.1.1.2", 8333)};
135+
CNetAddr source2{ResolveIP("250.1.1.3")}; // Different from addr2 - not self announcement
136+
137+
CAddress caddr2(addr2, NODE_NONE);
138+
caddr2.nTime = base_time;
139+
140+
BOOST_CHECK(addrman->Add({caddr2}, source2, time_penalty));
141+
142+
addresses = addrman->GetAddr(/*max_addresses=*/0, /*max_pct=*/0, /*network=*/std::nullopt);
143+
BOOST_REQUIRE_EQUAL(addresses.size(), 2U);
144+
145+
CAddress retrieved_addr2{addresses[0]};
146+
BOOST_CHECK(base_time.time_since_epoch() == 12335678s);
147+
BOOST_CHECK(retrieved_addr2.nTime == base_time - time_penalty);
148+
}
149+
109150
BOOST_AUTO_TEST_CASE(addrman_ports)
110151
{
111152
auto addrman = std::make_unique<AddrMan>(EMPTY_NETGROUPMAN, DETERMINISTIC, GetCheckRatio(m_node));

0 commit comments

Comments
 (0)