Changeset View
Changeset View
Standalone View
Standalone View
src/test/denialofservice_tests.cpp
Show First 20 Lines • Show All 95 Lines • ▼ Show 20 Lines | BOOST_AUTO_TEST_CASE(outbound_slow_chain_eviction) { | ||||
{ | { | ||||
LOCK(cs_main); | LOCK(cs_main); | ||||
BOOST_CHECK(::ChainActive().Tip() != nullptr); | BOOST_CHECK(::ChainActive().Tip() != nullptr); | ||||
BOOST_CHECK(::ChainActive().Tip()->nChainWork > 0); | BOOST_CHECK(::ChainActive().Tip()->nChainWork > 0); | ||||
} | } | ||||
// Test starts here | // Test starts here | ||||
{ | { | ||||
LOCK2(cs_main, dummyNode1.cs_sendProcessing); | LOCK(dummyNode1.cs_sendProcessing); | ||||
// should result in getheaders | // should result in getheaders | ||||
BOOST_CHECK( | BOOST_CHECK( | ||||
peerLogic->SendMessages(config, &dummyNode1, interruptDummy)); | peerLogic->SendMessages(config, &dummyNode1, interruptDummy)); | ||||
} | } | ||||
{ | { | ||||
LOCK2(cs_main, dummyNode1.cs_vSend); | LOCK(dummyNode1.cs_vSend); | ||||
BOOST_CHECK(dummyNode1.vSendMsg.size() > 0); | BOOST_CHECK(dummyNode1.vSendMsg.size() > 0); | ||||
dummyNode1.vSendMsg.clear(); | dummyNode1.vSendMsg.clear(); | ||||
} | } | ||||
int64_t nStartTime = GetTime(); | int64_t nStartTime = GetTime(); | ||||
// Wait 21 minutes | // Wait 21 minutes | ||||
SetMockTime(nStartTime + 21 * 60); | SetMockTime(nStartTime + 21 * 60); | ||||
{ | { | ||||
LOCK2(cs_main, dummyNode1.cs_sendProcessing); | LOCK(dummyNode1.cs_sendProcessing); | ||||
// should result in getheaders | // should result in getheaders | ||||
BOOST_CHECK( | BOOST_CHECK( | ||||
peerLogic->SendMessages(config, &dummyNode1, interruptDummy)); | peerLogic->SendMessages(config, &dummyNode1, interruptDummy)); | ||||
} | } | ||||
{ | { | ||||
LOCK2(cs_main, dummyNode1.cs_vSend); | LOCK(dummyNode1.cs_vSend); | ||||
BOOST_CHECK(dummyNode1.vSendMsg.size() > 0); | BOOST_CHECK(dummyNode1.vSendMsg.size() > 0); | ||||
} | } | ||||
// Wait 3 more minutes | // Wait 3 more minutes | ||||
SetMockTime(nStartTime + 24 * 60); | SetMockTime(nStartTime + 24 * 60); | ||||
{ | { | ||||
LOCK2(cs_main, dummyNode1.cs_sendProcessing); | LOCK(dummyNode1.cs_sendProcessing); | ||||
// should result in disconnect | // should result in disconnect | ||||
BOOST_CHECK( | BOOST_CHECK( | ||||
peerLogic->SendMessages(config, &dummyNode1, interruptDummy)); | peerLogic->SendMessages(config, &dummyNode1, interruptDummy)); | ||||
} | } | ||||
BOOST_CHECK(dummyNode1.fDisconnect == true); | BOOST_CHECK(dummyNode1.fDisconnect == true); | ||||
SetMockTime(0); | SetMockTime(0); | ||||
bool dummy; | bool dummy; | ||||
▲ Show 20 Lines • Show All 113 Lines • ▼ Show 20 Lines | BOOST_AUTO_TEST_CASE(peer_discouragement) { | ||||
dummyNode1.SetCommonVersion(PROTOCOL_VERSION); | dummyNode1.SetCommonVersion(PROTOCOL_VERSION); | ||||
peerLogic->InitializeNode(config, &dummyNode1); | peerLogic->InitializeNode(config, &dummyNode1); | ||||
dummyNode1.nVersion = 1; | dummyNode1.nVersion = 1; | ||||
dummyNode1.fSuccessfullyConnected = true; | dummyNode1.fSuccessfullyConnected = true; | ||||
// Should be discouraged | // Should be discouraged | ||||
peerLogic->Misbehaving(dummyNode1.GetId(), DISCOURAGEMENT_THRESHOLD, | peerLogic->Misbehaving(dummyNode1.GetId(), DISCOURAGEMENT_THRESHOLD, | ||||
/* message */ ""); | /* message */ ""); | ||||
{ | { | ||||
LOCK2(cs_main, dummyNode1.cs_sendProcessing); | LOCK(dummyNode1.cs_sendProcessing); | ||||
BOOST_CHECK( | BOOST_CHECK( | ||||
peerLogic->SendMessages(config, &dummyNode1, interruptDummy)); | peerLogic->SendMessages(config, &dummyNode1, interruptDummy)); | ||||
} | } | ||||
BOOST_CHECK(banman->IsDiscouraged(addr1)); | BOOST_CHECK(banman->IsDiscouraged(addr1)); | ||||
// Different IP, not discouraged | // Different IP, not discouraged | ||||
BOOST_CHECK(!banman->IsDiscouraged(ip(0xa0b0c001 | 0x0000ff00))); | BOOST_CHECK(!banman->IsDiscouraged(ip(0xa0b0c001 | 0x0000ff00))); | ||||
CAddress addr2(ip(0xa0b0c002), NODE_NONE); | CAddress addr2(ip(0xa0b0c002), NODE_NONE); | ||||
CNode dummyNode2(id++, NODE_NETWORK, 0, INVALID_SOCKET, addr2, 1, 1, 1, | CNode dummyNode2(id++, NODE_NETWORK, 0, INVALID_SOCKET, addr2, 1, 1, 1, | ||||
CAddress(), "", ConnectionType::INBOUND); | CAddress(), "", ConnectionType::INBOUND); | ||||
dummyNode2.SetCommonVersion(PROTOCOL_VERSION); | dummyNode2.SetCommonVersion(PROTOCOL_VERSION); | ||||
peerLogic->InitializeNode(config, &dummyNode2); | peerLogic->InitializeNode(config, &dummyNode2); | ||||
dummyNode2.nVersion = 1; | dummyNode2.nVersion = 1; | ||||
dummyNode2.fSuccessfullyConnected = true; | dummyNode2.fSuccessfullyConnected = true; | ||||
peerLogic->Misbehaving(dummyNode2.GetId(), DISCOURAGEMENT_THRESHOLD - 1, | peerLogic->Misbehaving(dummyNode2.GetId(), DISCOURAGEMENT_THRESHOLD - 1, | ||||
/* message */ ""); | /* message */ ""); | ||||
{ | { | ||||
LOCK2(cs_main, dummyNode2.cs_sendProcessing); | LOCK(dummyNode2.cs_sendProcessing); | ||||
BOOST_CHECK( | BOOST_CHECK( | ||||
peerLogic->SendMessages(config, &dummyNode2, interruptDummy)); | peerLogic->SendMessages(config, &dummyNode2, interruptDummy)); | ||||
} | } | ||||
// 2 not discouraged yet... | // 2 not discouraged yet... | ||||
BOOST_CHECK(!banman->IsDiscouraged(addr2)); | BOOST_CHECK(!banman->IsDiscouraged(addr2)); | ||||
// ... but 1 still should be | // ... but 1 still should be | ||||
BOOST_CHECK(banman->IsDiscouraged(addr1)); | BOOST_CHECK(banman->IsDiscouraged(addr1)); | ||||
// 2 reaches discouragement threshold | // 2 reaches discouragement threshold | ||||
peerLogic->Misbehaving(dummyNode2.GetId(), 1, /* message */ ""); | peerLogic->Misbehaving(dummyNode2.GetId(), 1, /* message */ ""); | ||||
{ | { | ||||
LOCK2(cs_main, dummyNode2.cs_sendProcessing); | LOCK(dummyNode2.cs_sendProcessing); | ||||
BOOST_CHECK( | BOOST_CHECK( | ||||
peerLogic->SendMessages(config, &dummyNode2, interruptDummy)); | peerLogic->SendMessages(config, &dummyNode2, interruptDummy)); | ||||
} | } | ||||
BOOST_CHECK(banman->IsDiscouraged(addr1)); // Expect both 1 and 2 | BOOST_CHECK(banman->IsDiscouraged(addr1)); // Expect both 1 and 2 | ||||
BOOST_CHECK(banman->IsDiscouraged(addr2)); // to be discouraged now | BOOST_CHECK(banman->IsDiscouraged(addr2)); // to be discouraged now | ||||
bool dummy; | bool dummy; | ||||
peerLogic->FinalizeNode(config, dummyNode1.GetId(), dummy); | peerLogic->FinalizeNode(config, dummyNode1.GetId(), dummy); | ||||
Show All 23 Lines | BOOST_AUTO_TEST_CASE(DoS_bantime) { | ||||
dummyNode.SetCommonVersion(PROTOCOL_VERSION); | dummyNode.SetCommonVersion(PROTOCOL_VERSION); | ||||
peerLogic->InitializeNode(config, &dummyNode); | peerLogic->InitializeNode(config, &dummyNode); | ||||
dummyNode.nVersion = 1; | dummyNode.nVersion = 1; | ||||
dummyNode.fSuccessfullyConnected = true; | dummyNode.fSuccessfullyConnected = true; | ||||
peerLogic->Misbehaving(dummyNode.GetId(), DISCOURAGEMENT_THRESHOLD, | peerLogic->Misbehaving(dummyNode.GetId(), DISCOURAGEMENT_THRESHOLD, | ||||
/* message */ ""); | /* message */ ""); | ||||
{ | { | ||||
LOCK2(cs_main, dummyNode.cs_sendProcessing); | LOCK(dummyNode.cs_sendProcessing); | ||||
BOOST_CHECK( | BOOST_CHECK( | ||||
peerLogic->SendMessages(config, &dummyNode, interruptDummy)); | peerLogic->SendMessages(config, &dummyNode, interruptDummy)); | ||||
} | } | ||||
BOOST_CHECK(banman->IsDiscouraged(addr)); | BOOST_CHECK(banman->IsDiscouraged(addr)); | ||||
bool dummy; | bool dummy; | ||||
peerLogic->FinalizeNode(config, dummyNode.GetId(), dummy); | peerLogic->FinalizeNode(config, dummyNode.GetId(), dummy); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 90 Lines • Show Last 20 Lines |