Skip to content

Commit fa108d6

Browse files
committed
test: update tests for peer discouragement
1 parent 1a9f462 commit fa108d6

File tree

2 files changed

+15
-57
lines changed

2 files changed

+15
-57
lines changed

src/test/denialofservice_tests.cpp

Lines changed: 5 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ BOOST_AUTO_TEST_CASE(stale_tip_peer_management)
217217
connman->ClearNodes();
218218
}
219219

220-
BOOST_AUTO_TEST_CASE(DoS_banning)
220+
BOOST_AUTO_TEST_CASE(peer_discouragement)
221221
{
222222
auto banman = MakeUnique<BanMan>(GetDataDir() / "banlist.dat", nullptr, DEFAULT_MISBEHAVING_BANTIME);
223223
auto connman = MakeUnique<CConnman>(0x1337, 0x1337);
@@ -249,7 +249,7 @@ BOOST_AUTO_TEST_CASE(DoS_banning)
249249
dummyNode2.fSuccessfullyConnected = true;
250250
{
251251
LOCK(cs_main);
252-
Misbehaving(dummyNode2.GetId(), 50);
252+
Misbehaving(dummyNode2.GetId(), DISCOURAGEMENT_THRESHOLD - 1);
253253
}
254254
{
255255
LOCK2(cs_main, dummyNode2.cs_sendProcessing);
@@ -259,64 +259,20 @@ BOOST_AUTO_TEST_CASE(DoS_banning)
259259
BOOST_CHECK(banman->IsDiscouraged(addr1)); // ... but 1 still should be
260260
{
261261
LOCK(cs_main);
262-
Misbehaving(dummyNode2.GetId(), 50);
262+
Misbehaving(dummyNode2.GetId(), 1); // 2 reaches discouragement threshold
263263
}
264264
{
265265
LOCK2(cs_main, dummyNode2.cs_sendProcessing);
266266
BOOST_CHECK(peerLogic->SendMessages(&dummyNode2));
267267
}
268-
BOOST_CHECK(banman->IsDiscouraged(addr2));
268+
BOOST_CHECK(banman->IsDiscouraged(addr1)); // Expect both 1 and 2
269+
BOOST_CHECK(banman->IsDiscouraged(addr2)); // to be discouraged now
269270

270271
bool dummy;
271272
peerLogic->FinalizeNode(dummyNode1.GetId(), dummy);
272273
peerLogic->FinalizeNode(dummyNode2.GetId(), dummy);
273274
}
274275

275-
BOOST_AUTO_TEST_CASE(DoS_banscore)
276-
{
277-
auto banman = MakeUnique<BanMan>(GetDataDir() / "banlist.dat", nullptr, DEFAULT_MISBEHAVING_BANTIME);
278-
auto connman = MakeUnique<CConnman>(0x1337, 0x1337);
279-
auto peerLogic = MakeUnique<PeerLogicValidation>(connman.get(), banman.get(), *m_node.scheduler, *m_node.chainman, *m_node.mempool);
280-
281-
banman->ClearBanned();
282-
CAddress addr1(ip(0xa0b0c001), NODE_NONE);
283-
CNode dummyNode1(id++, NODE_NETWORK, 0, INVALID_SOCKET, addr1, 3, 1, CAddress(), "", true);
284-
dummyNode1.SetSendVersion(PROTOCOL_VERSION);
285-
peerLogic->InitializeNode(&dummyNode1);
286-
dummyNode1.nVersion = 1;
287-
dummyNode1.fSuccessfullyConnected = true;
288-
{
289-
LOCK(cs_main);
290-
Misbehaving(dummyNode1.GetId(), DISCOURAGEMENT_THRESHOLD - 11);
291-
}
292-
{
293-
LOCK2(cs_main, dummyNode1.cs_sendProcessing);
294-
BOOST_CHECK(peerLogic->SendMessages(&dummyNode1));
295-
}
296-
BOOST_CHECK(!banman->IsDiscouraged(addr1));
297-
{
298-
LOCK(cs_main);
299-
Misbehaving(dummyNode1.GetId(), 10);
300-
}
301-
{
302-
LOCK2(cs_main, dummyNode1.cs_sendProcessing);
303-
BOOST_CHECK(peerLogic->SendMessages(&dummyNode1));
304-
}
305-
BOOST_CHECK(!banman->IsDiscouraged(addr1));
306-
{
307-
LOCK(cs_main);
308-
Misbehaving(dummyNode1.GetId(), 1);
309-
}
310-
{
311-
LOCK2(cs_main, dummyNode1.cs_sendProcessing);
312-
BOOST_CHECK(peerLogic->SendMessages(&dummyNode1));
313-
}
314-
BOOST_CHECK(banman->IsDiscouraged(addr1));
315-
316-
bool dummy;
317-
peerLogic->FinalizeNode(dummyNode1.GetId(), dummy);
318-
}
319-
320276
BOOST_AUTO_TEST_CASE(DoS_bantime)
321277
{
322278
auto banman = MakeUnique<BanMan>(GetDataDir() / "banlist.dat", nullptr, DEFAULT_MISBEHAVING_BANTIME);

test/functional/p2p_leak.py

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,10 @@ def on_blocktxn(self, message): self.bad_message(message)
6565

6666
# Node that never sends a version. We'll use this to send a bunch of messages
6767
# anyway, and eventually get disconnected.
68-
class CNodeNoVersionBan(CLazyNode):
69-
# send a bunch of veracks without sending a message. This should get us disconnected.
70-
# NOTE: implementation-specific check here. Remove if bitcoind ban behavior changes
68+
class CNodeNoVersionMisbehavior(CLazyNode):
69+
# Send enough veracks without a message to reach the peer discouragement
70+
# threshold. This should get us disconnected. NOTE: implementation-specific
71+
# test; update if our discouragement policy for peer misbehavior changes.
7172
def on_open(self):
7273
super().on_open()
7374
for _ in range(DISCOURAGEMENT_THRESHOLD):
@@ -108,15 +109,16 @@ def set_test_params(self):
108109
self.num_nodes = 1
109110

110111
def run_test(self):
111-
no_version_bannode = self.nodes[0].add_p2p_connection(CNodeNoVersionBan(), send_version=False, wait_for_verack=False)
112+
no_version_disconnect_node = self.nodes[0].add_p2p_connection(
113+
CNodeNoVersionMisbehavior(), send_version=False, wait_for_verack=False)
112114
no_version_idlenode = self.nodes[0].add_p2p_connection(CNodeNoVersionIdle(), send_version=False, wait_for_verack=False)
113115
no_verack_idlenode = self.nodes[0].add_p2p_connection(CNodeNoVerackIdle(), wait_for_verack=False)
114116

115117
# Wait until we got the verack in response to the version. Though, don't wait for the other node to receive the
116118
# verack, since we never sent one
117119
no_verack_idlenode.wait_for_verack()
118120

119-
wait_until(lambda: no_version_bannode.ever_connected, timeout=10, lock=mininode_lock)
121+
wait_until(lambda: no_version_disconnect_node.ever_connected, timeout=10, lock=mininode_lock)
120122
wait_until(lambda: no_version_idlenode.ever_connected, timeout=10, lock=mininode_lock)
121123
wait_until(lambda: no_verack_idlenode.version_received, timeout=10, lock=mininode_lock)
122124

@@ -126,13 +128,13 @@ def run_test(self):
126128
#Give the node enough time to possibly leak out a message
127129
time.sleep(5)
128130

129-
#This node should have been banned
130-
assert not no_version_bannode.is_connected
131+
# Expect this node to be disconnected for misbehavior
132+
assert not no_version_disconnect_node.is_connected
131133

132134
self.nodes[0].disconnect_p2ps()
133135

134136
# Make sure no unexpected messages came in
135-
assert no_version_bannode.unexpected_msg == False
137+
assert no_version_disconnect_node.unexpected_msg == False
136138
assert no_version_idlenode.unexpected_msg == False
137139
assert no_verack_idlenode.unexpected_msg == False
138140

0 commit comments

Comments
 (0)