8#include <chainparams.h>
21#include <validation.h>
26#include <boost/test/unit_test.hpp>
57 CNode dummyNode1{
id++,
87 LOCK(dummyNode1.cs_vSend);
88 const auto& [to_send, _more, _msg_type] = dummyNode1.m_transport->GetBytesToSend(
false);
98 LOCK(dummyNode1.cs_vSend);
99 const auto& [to_send, _more, _msg_type] = dummyNode1.m_transport->GetBytesToSend(
false);
124 vNodes.emplace_back(
new CNode{
id++,
138 node.fSuccessfullyConnected =
true;
154 const auto time_init{GetTime<std::chrono::seconds>()};
156 const auto time_later{time_init + 3 * std::chrono::seconds{
m_node.
chainman->GetConsensus().nPowTargetSpacing} + 1
s};
157 connman->Init(options);
158 std::vector<CNode *> vNodes;
161 for (
int i = 0; i < max_outbound_full_relay; ++i) {
165 peerLogic->CheckForStaleTipAndEvictPeers();
176 peerLogic->CheckForStaleTipAndEvictPeers();
191 peerLogic->CheckForStaleTipAndEvictPeers();
192 for (
int i = 0; i < max_outbound_full_relay; ++i) {
198 vNodes.back()->fDisconnect =
false;
202 peerLogic->UpdateLastBlockAnnounceTime(vNodes.back()->GetId(),
GetTime());
204 peerLogic->CheckForStaleTipAndEvictPeers();
205 for (
int i = 0; i < max_outbound_full_relay - 1; ++i) {
208 BOOST_CHECK(vNodes[max_outbound_full_relay-1]->fDisconnect ==
true);
211 vNodes[max_outbound_full_relay - 1]->fDisconnect =
false;
218 peerLogic->CheckForStaleTipAndEvictPeers();
220 for (
int i = 0; i < max_outbound_full_relay - 2; ++i) {
223 BOOST_CHECK(vNodes[max_outbound_full_relay - 2]->fDisconnect ==
false);
224 BOOST_CHECK(vNodes[max_outbound_full_relay - 1]->fDisconnect ==
true);
225 BOOST_CHECK(vNodes[max_outbound_full_relay]->fDisconnect ==
false);
231 peerLogic->CheckForStaleTipAndEvictPeers();
236 peerLogic->FinalizeNode(*
node);
239 connman->ClearTestNodes();
253 connman->Init(options);
254 std::vector<CNode*> vNodes;
257 for (
int i = 0; i < max_outbound_block_relay; ++i) {
260 peerLogic->CheckForStaleTipAndEvictPeers();
262 for (
int i = 0; i < max_outbound_block_relay; ++i) {
268 peerLogic->CheckForStaleTipAndEvictPeers();
271 for (
int i = 0; i < max_outbound_block_relay; ++i) {
277 peerLogic->CheckForStaleTipAndEvictPeers();
278 for (
int i = 0; i < max_outbound_block_relay; ++i) {
285 vNodes.back()->fDisconnect =
false;
286 vNodes.back()->m_last_block_time = GetTime<std::chrono::seconds>();
288 peerLogic->CheckForStaleTipAndEvictPeers();
289 for (
int i = 0; i < max_outbound_block_relay - 1; ++i) {
292 BOOST_CHECK(vNodes[max_outbound_block_relay - 1]->fDisconnect ==
true);
296 peerLogic->FinalizeNode(*
node);
298 connman->ClearTestNodes();
311 tor_netaddr.
SetSpecial(
"pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd.onion"));
320 std::array<CNode*, 3> nodes;
322 banman->ClearBanned();
324 nodes[0] =
new CNode{
id++,
336 nodes[0]->fSuccessfullyConnected =
true;
337 connman->AddTestNode(*nodes[0]);
338 peerLogic->UnitTestMisbehaving(nodes[0]->GetId());
345 nodes[1] =
new CNode{
id++,
357 nodes[1]->fSuccessfullyConnected =
true;
358 connman->AddTestNode(*nodes[1]);
366 peerLogic->UnitTestMisbehaving(nodes[1]->GetId());
376 nodes[2] =
new CNode{
id++,
388 nodes[2]->fSuccessfullyConnected =
true;
389 connman->AddTestNode(*nodes[2]);
390 peerLogic->UnitTestMisbehaving(nodes[2]->GetId());
400 peerLogic->FinalizeNode(*
node);
402 connman->ClearTestNodes();
413 banman->ClearBanned();
414 int64_t nStartTime =
GetTime();
419 CNode dummyNode{
id++,
431 dummyNode.fSuccessfullyConnected =
true;
433 peerLogic->UnitTestMisbehaving(dummyNode.GetId());
437 peerLogic->FinalizeNode(dummyNode);
static constexpr unsigned int DEFAULT_MISBEHAVING_BANTIME
const CChainParams & Params()
Return the currently selected parameters.
A CService with information about it as peer.
uint16_t GetDefaultPort() const
bool SetSpecial(const std::string &addr)
Parse a Tor or I2P address and set this object to it.
Information about a peer.
A combination of a network address (CNetAddr) and a (TCP) port.
static Mutex g_msgproc_mutex
Mutex for anything that is only accessed via the msg processing thread.
virtual bool SendMessages(CNode *pnode) EXCLUSIVE_LOCKS_REQUIRED(g_msgproc_mutex)=0
Send queued protocol messages to a given node.
virtual void FinalizeNode(const CNode &node)=0
Handle removal of a peer (clear state)
virtual void InitializeNode(const CNode &node, ServiceFlags our_services)=0
Initialize a peer (setup state)
static std::unique_ptr< PeerManager > make(CConnman &connman, AddrMan &addrman, BanMan *banman, ChainstateManager &chainman, CTxMemPool &pool, node::Warnings &warnings, Options opts)
std::vector< B > randbytes(size_t len) noexcept
Generate random bytes.
uint64_t randbits(int bits) noexcept
Generate a random (bits)-bit integer.
ConnectionType
Different types of connections to a peer.
@ BLOCK_RELAY
We use block-relay-only connections to help prevent against partition attacks.
@ OUTBOUND_FULL_RELAY
These are the default connections that we use to connect with the network.
@ INBOUND
Inbound connections are those initiated by a peer.
RecursiveMutex cs_main
Mutex to guard access to validation specific variables, such as reading or changing the chainstate.
BOOST_FIXTURE_TEST_SUITE(cuckoocache_tests, BasicTestingSetup)
Test Suite for CuckooCache.
BOOST_AUTO_TEST_SUITE_END()
BOOST_FIXTURE_TEST_CASE(stale_tip_peer_management, OutboundTest)
BOOST_AUTO_TEST_CASE(outbound_slow_chain_eviction)
static CService ip(uint32_t i)
static const std::string addr1
static const unsigned int DEFAULT_MAX_PEER_CONNECTIONS
The maximum number of peer connections to maintain.
static const int MAX_OUTBOUND_FULL_RELAY_CONNECTIONS
Maximum number of automatic outgoing nodes over which we'll relay everything (blocks,...
static const int MAX_BLOCK_RELAY_ONLY_CONNECTIONS
Maximum number of block-relay-only outgoing connections.
static constexpr auto MINIMUM_CONNECT_TIME
Minimum time an outbound-peer-eviction candidate must be connected for, in order to evict.
std::string OnionToString(std::span< const uint8_t > addr)
static constexpr size_t ADDR_TORV3_SIZE
Size of TORv3 address (in bytes).
#define BOOST_CHECK(expr)
ServiceFlags
nServices flags
static const int PROTOCOL_VERSION
network protocol versioning
int m_max_automatic_connections
void AddTestNode(CNode &node)
void FlushSendBuffer(CNode &node) const
void SetPeerConnectTimeout(std::chrono::seconds timeout)
void AddRandomOutboundPeer(NodeId &id, std::vector< CNode * > &vNodes, PeerManager &peerLogic, ConnmanTestMsg &connman, ConnectionType connType, bool onion_peer=false)
Testing setup that configures a complete environment.
std::unique_ptr< CConnman > connman
std::unique_ptr< CTxMemPool > mempool
std::unique_ptr< AddrMan > addrman
std::unique_ptr< ChainstateManager > chainman
std::unique_ptr< node::Warnings > warnings
Manages all the node warnings.
std::unique_ptr< PeerManager > peerman
std::unique_ptr< const NetGroupManager > netgroupman
int64_t GetTime()
DEPRECATED Use either ClockType::now() or Now<TimePointType>() if a cast is needed.
void SetMockTime(int64_t nMockTimeIn)
DEPRECATED Use SetMockTime with chrono type.