|
17 | 17 |
|
18 | 18 | #include <boost/test/unit_test.hpp> |
19 | 19 |
|
| 20 | +#include <cstdint> |
20 | 21 | #include <optional> |
21 | 22 | #include <string> |
22 | 23 |
|
@@ -106,6 +107,46 @@ BOOST_AUTO_TEST_CASE(addrman_simple) |
106 | 107 | BOOST_CHECK(addrman->Size() >= 1); |
107 | 108 | } |
108 | 109 |
|
| 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 | + |
109 | 150 | BOOST_AUTO_TEST_CASE(addrman_ports) |
110 | 151 | { |
111 | 152 | auto addrman = std::make_unique<AddrMan>(EMPTY_NETGROUPMAN, DETERMINISTIC, GetCheckRatio(m_node)); |
|
0 commit comments