From e770392084aa52e5568cf001da4d537fda1d71b3 Mon Sep 17 00:00:00 2001 From: Bruno Garcia Date: Wed, 14 Jan 2026 22:10:18 -0300 Subject: [PATCH] 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. --- src/test/addrman_tests.cpp | 40 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/src/test/addrman_tests.cpp b/src/test/addrman_tests.cpp index 4debdc16a33..49a9e202250 100644 --- a/src/test/addrman_tests.cpp +++ b/src/test/addrman_tests.cpp @@ -17,6 +17,7 @@ #include +#include #include #include @@ -106,6 +107,45 @@ BOOST_AUTO_TEST_CASE(addrman_simple) BOOST_CHECK(addrman->Size() >= 1); } +BOOST_AUTO_TEST_CASE(addrman_penalty_self_announcement) +{ + SetMockTime(Now()); + auto addrman = std::make_unique(EMPTY_NETGROUPMAN, DETERMINISTIC, GetCheckRatio(m_node)); + + const auto base_time{Now() - 10000s}; + CService addr1 = ResolveService("250.1.1.1", 8333); + CNetAddr source1 = ResolveIP("250.1.1.1"); // Same as addr1 - self announcement + + CAddress caddr1(addr1, NODE_NONE); + caddr1.nTime = base_time; + + const auto time_penalty{3600s}; + + BOOST_CHECK(addrman->Add({caddr1}, source1, time_penalty)); + + auto addr_pos1{addrman->FindAddressEntry(caddr1)}; + BOOST_REQUIRE(addr_pos1.has_value()); + + std::vector addresses{addrman->GetAddr(/*max_addresses=*/0, /*max_pct=*/0, /*network=*/std::nullopt)}; + BOOST_REQUIRE_EQUAL(addresses.size(), 1U); + + BOOST_CHECK(addresses[0].nTime == base_time); + + CService addr2{ResolveService("250.1.1.2", 8333)}; + CNetAddr source2{ResolveIP("250.1.1.3")}; // Different from addr2 - not self announcement + + CAddress caddr2(addr2, NODE_NONE); + caddr2.nTime = base_time; + + BOOST_CHECK(addrman->Add({caddr2}, source2, time_penalty)); + + addresses = addrman->GetAddr(/*max_addresses=*/0, /*max_pct=*/0, /*network=*/std::nullopt); + BOOST_REQUIRE_EQUAL(addresses.size(), 2U); + + CAddress retrieved_addr2{addresses[0]}; + BOOST_CHECK(retrieved_addr2.nTime == base_time - time_penalty); +} + BOOST_AUTO_TEST_CASE(addrman_ports) { auto addrman = std::make_unique(EMPTY_NETGROUPMAN, DETERMINISTIC, GetCheckRatio(m_node));