@@ -106,9 +106,19 @@ BOOST_AUTO_TEST_CASE(outbound_slow_chain_eviction)
106
106
peerman.FinalizeNode (dummyNode1);
107
107
}
108
108
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 )
110
110
{
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
+
112
122
vNodes.emplace_back (new CNode{id++,
113
123
/* sock=*/ nullptr ,
114
124
addr,
@@ -197,6 +207,30 @@ BOOST_AUTO_TEST_CASE(stale_tip_peer_management)
197
207
BOOST_CHECK (vNodes[max_outbound_full_relay-1 ]->fDisconnect == true );
198
208
BOOST_CHECK (vNodes.back ()->fDisconnect == false );
199
209
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
+
200
234
for (const CNode *node : vNodes) {
201
235
peerLogic->FinalizeNode (*node);
202
236
}
0 commit comments