Skip to content

Commit 65cff00

Browse files
test: Add test for outbound protection by network
Co-authored-by: Amiti Uttarwar <[email protected]>
1 parent 034f61f commit 65cff00

File tree

1 file changed

+36
-2
lines changed

1 file changed

+36
-2
lines changed

src/test/denialofservice_tests.cpp

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,9 +106,19 @@ BOOST_AUTO_TEST_CASE(outbound_slow_chain_eviction)
106106
peerman.FinalizeNode(dummyNode1);
107107
}
108108

109-
static void AddRandomOutboundPeer(NodeId& id, std::vector<CNode*>& vNodes, PeerManager& peerLogic, ConnmanTestMsg& connman, ConnectionType connType)
109+
static void AddRandomOutboundPeer(NodeId& id, std::vector<CNode*>& vNodes, PeerManager& peerLogic, ConnmanTestMsg& connman, ConnectionType connType, bool onion_peer = false)
110110
{
111-
CAddress addr(ip(g_insecure_rand_ctx.randbits(32)), NODE_NONE);
111+
CAddress addr;
112+
113+
if (onion_peer) {
114+
auto tor_addr{g_insecure_rand_ctx.randbytes(ADDR_TORV3_SIZE)};
115+
BOOST_REQUIRE(addr.SetSpecial(OnionToString(tor_addr)));
116+
}
117+
118+
while (!addr.IsRoutable()) {
119+
addr = CAddress(ip(g_insecure_rand_ctx.randbits(32)), NODE_NONE);
120+
}
121+
112122
vNodes.emplace_back(new CNode{id++,
113123
/*sock=*/nullptr,
114124
addr,
@@ -197,6 +207,30 @@ BOOST_AUTO_TEST_CASE(stale_tip_peer_management)
197207
BOOST_CHECK(vNodes[max_outbound_full_relay-1]->fDisconnect == true);
198208
BOOST_CHECK(vNodes.back()->fDisconnect == false);
199209

210+
vNodes[max_outbound_full_relay - 1]->fDisconnect = false;
211+
212+
// Add an onion peer, that will be protected because it is the only one for
213+
// its network, so another peer gets disconnected instead.
214+
SetMockTime(time_init);
215+
AddRandomOutboundPeer(id, vNodes, *peerLogic, *connman, ConnectionType::OUTBOUND_FULL_RELAY, /*onion_peer=*/true);
216+
SetMockTime(time_later);
217+
peerLogic->CheckForStaleTipAndEvictPeers();
218+
219+
for (int i = 0; i < max_outbound_full_relay - 2; ++i) {
220+
BOOST_CHECK(vNodes[i]->fDisconnect == false);
221+
}
222+
BOOST_CHECK(vNodes[max_outbound_full_relay - 2]->fDisconnect == false);
223+
BOOST_CHECK(vNodes[max_outbound_full_relay - 1]->fDisconnect == true);
224+
BOOST_CHECK(vNodes[max_outbound_full_relay]->fDisconnect == false);
225+
226+
// Add a second onion peer which won't be protected
227+
SetMockTime(time_init);
228+
AddRandomOutboundPeer(id, vNodes, *peerLogic, *connman, ConnectionType::OUTBOUND_FULL_RELAY, /*onion_peer=*/true);
229+
SetMockTime(time_later);
230+
peerLogic->CheckForStaleTipAndEvictPeers();
231+
232+
BOOST_CHECK(vNodes.back()->fDisconnect == true);
233+
200234
for (const CNode *node : vNodes) {
201235
peerLogic->FinalizeNode(*node);
202236
}

0 commit comments

Comments
 (0)