aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Zumsande <mzumsande@gmail.com>2023-02-08 17:42:12 -0500
committerAmiti Uttarwar <amiti@uttarwar.org>2023-08-03 19:27:23 -0600
commit65cff00ceea48ac8a887ffea79aedb4251aa097f (patch)
tree7d714f188121512f7d6d035d59003e8326e43740
parent034f61f83b9348664d868933dbbfd8f9f8882168 (diff)
test: Add test for outbound protection by network
Co-authored-by: Amiti Uttarwar <amiti@uttarwar.org>
-rw-r--r--src/test/denialofservice_tests.cpp38
1 files changed, 36 insertions, 2 deletions
diff --git a/src/test/denialofservice_tests.cpp b/src/test/denialofservice_tests.cpp
index 1a06f16155..2873d35eb0 100644
--- a/src/test/denialofservice_tests.cpp
+++ b/src/test/denialofservice_tests.cpp
@@ -106,9 +106,19 @@ BOOST_AUTO_TEST_CASE(outbound_slow_chain_eviction)
peerman.FinalizeNode(dummyNode1);
}
-static void AddRandomOutboundPeer(NodeId& id, std::vector<CNode*>& vNodes, PeerManager& peerLogic, ConnmanTestMsg& connman, ConnectionType connType)
+static void AddRandomOutboundPeer(NodeId& id, std::vector<CNode*>& vNodes, PeerManager& peerLogic, ConnmanTestMsg& connman, ConnectionType connType, bool onion_peer = false)
{
- CAddress addr(ip(g_insecure_rand_ctx.randbits(32)), NODE_NONE);
+ CAddress addr;
+
+ if (onion_peer) {
+ auto tor_addr{g_insecure_rand_ctx.randbytes(ADDR_TORV3_SIZE)};
+ BOOST_REQUIRE(addr.SetSpecial(OnionToString(tor_addr)));
+ }
+
+ while (!addr.IsRoutable()) {
+ addr = CAddress(ip(g_insecure_rand_ctx.randbits(32)), NODE_NONE);
+ }
+
vNodes.emplace_back(new CNode{id++,
/*sock=*/nullptr,
addr,
@@ -197,6 +207,30 @@ BOOST_AUTO_TEST_CASE(stale_tip_peer_management)
BOOST_CHECK(vNodes[max_outbound_full_relay-1]->fDisconnect == true);
BOOST_CHECK(vNodes.back()->fDisconnect == false);
+ vNodes[max_outbound_full_relay - 1]->fDisconnect = false;
+
+ // Add an onion peer, that will be protected because it is the only one for
+ // its network, so another peer gets disconnected instead.
+ SetMockTime(time_init);
+ AddRandomOutboundPeer(id, vNodes, *peerLogic, *connman, ConnectionType::OUTBOUND_FULL_RELAY, /*onion_peer=*/true);
+ SetMockTime(time_later);
+ peerLogic->CheckForStaleTipAndEvictPeers();
+
+ for (int i = 0; i < max_outbound_full_relay - 2; ++i) {
+ BOOST_CHECK(vNodes[i]->fDisconnect == false);
+ }
+ BOOST_CHECK(vNodes[max_outbound_full_relay - 2]->fDisconnect == false);
+ BOOST_CHECK(vNodes[max_outbound_full_relay - 1]->fDisconnect == true);
+ BOOST_CHECK(vNodes[max_outbound_full_relay]->fDisconnect == false);
+
+ // Add a second onion peer which won't be protected
+ SetMockTime(time_init);
+ AddRandomOutboundPeer(id, vNodes, *peerLogic, *connman, ConnectionType::OUTBOUND_FULL_RELAY, /*onion_peer=*/true);
+ SetMockTime(time_later);
+ peerLogic->CheckForStaleTipAndEvictPeers();
+
+ BOOST_CHECK(vNodes.back()->fDisconnect == true);
+
for (const CNode *node : vNodes) {
peerLogic->FinalizeNode(*node);
}