aboutsummaryrefslogtreecommitdiff
path: root/src/test/addrman_tests.cpp
diff options
context:
space:
mode:
authorAmiti Uttarwar <amiti@uttarwar.org>2023-02-18 18:34:06 -0700
committerAmiti Uttarwar <amiti@uttarwar.org>2023-03-17 18:02:40 -0700
commita98e542e0c18f7cb2340179631806f14b07430c3 (patch)
treec673581d01096307173461b348fa88f4fe22c24b /src/test/addrman_tests.cpp
parent5c8b4baff27e0ccd27fda6e915b956d1e8dd7ce2 (diff)
downloadbitcoin-a98e542e0c18f7cb2340179631806f14b07430c3.tar.xz
test: add addrman test for special case
if an addr matching the network requirements is only on the new table and select is invoked with new_only = false, ensure that the code selects the new table. in order to test this case, we use a non deterministic addrman. this means we cannot have more than one address in any addrman table, or risk sporadic failures when the second address happens to conflict. if the code chose a table at random, the test would fail 50% of the time Co-authored-by: Martin Zumsande <mzumsande@gmail.com>
Diffstat (limited to 'src/test/addrman_tests.cpp')
-rw-r--r--src/test/addrman_tests.cpp22
1 files changed, 22 insertions, 0 deletions
diff --git a/src/test/addrman_tests.cpp b/src/test/addrman_tests.cpp
index 1acdb02c9a..c97a29eb1e 100644
--- a/src/test/addrman_tests.cpp
+++ b/src/test/addrman_tests.cpp
@@ -252,6 +252,28 @@ BOOST_AUTO_TEST_CASE(addrman_select_by_network)
}
}
+BOOST_AUTO_TEST_CASE(addrman_select_special)
+{
+ // use a non-deterministic addrman to ensure a passing test isn't due to setup
+ auto addrman = std::make_unique<AddrMan>(EMPTY_NETGROUPMAN, /*deterministic=*/false, GetCheckRatio(m_node));
+
+ // add ipv4 address to the new table
+ CNetAddr source = ResolveIP("252.2.2.2");
+ CService addr1 = ResolveService("250.1.1.3", 8333);
+ BOOST_CHECK(addrman->Add({CAddress(addr1, NODE_NONE)}, source));
+
+ // add I2P address to the tried table
+ CAddress i2p_addr;
+ i2p_addr.SetSpecial("udhdrtrcetjm5sxzskjyr5ztpeszydbh4dpl3pl4utgqqw2v4jna.b32.i2p");
+ BOOST_CHECK(addrman->Add({i2p_addr}, source));
+ BOOST_CHECK(addrman->Good(i2p_addr));
+
+ // since the only ipv4 address is on the new table, ensure that the new
+ // table gets selected even if new_only is false. if the table was being
+ // selected at random, this test will sporadically fail
+ BOOST_CHECK(addrman->Select(/*new_only=*/false, NET_IPV4).first == addr1);
+}
+
BOOST_AUTO_TEST_CASE(addrman_new_collisions)
{
auto addrman = std::make_unique<AddrMan>(EMPTY_NETGROUPMAN, DETERMINISTIC, GetCheckRatio(m_node));