@@ -90,7 +90,7 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
90
90
// Test protection of onion, localhost, and I2P peers...
91
91
92
92
// Expect 1/4 onion peers to be protected from eviction,
93
- // if no localhost or I2P peers.
93
+ // if no localhost, I2P, or CJDNS peers.
94
94
BOOST_CHECK (IsProtected (
95
95
num_peers, [](NodeEvictionCandidate& c) {
96
96
c.m_is_local = false ;
@@ -101,7 +101,7 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
101
101
random_context));
102
102
103
103
// Expect 1/4 onion peers and 1/4 of the other peers to be protected,
104
- // sorted by longest uptime (lowest m_connected), if no localhost or I2P peers.
104
+ // sorted by longest uptime (lowest m_connected), if no localhost, I2P or CJDNS peers.
105
105
BOOST_CHECK (IsProtected (
106
106
num_peers, [](NodeEvictionCandidate& c) {
107
107
c.m_connected = std::chrono::seconds{c.id };
@@ -113,7 +113,7 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
113
113
random_context));
114
114
115
115
// Expect 1/4 localhost peers to be protected from eviction,
116
- // if no onion or I2P peers.
116
+ // if no onion, I2P, or CJDNS peers.
117
117
BOOST_CHECK (IsProtected (
118
118
num_peers, [](NodeEvictionCandidate& c) {
119
119
c.m_is_local = (c.id == 1 || c.id == 9 || c.id == 11 );
@@ -124,7 +124,7 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
124
124
random_context));
125
125
126
126
// Expect 1/4 localhost peers and 1/4 of the other peers to be protected,
127
- // sorted by longest uptime (lowest m_connected), if no onion or I2P peers.
127
+ // sorted by longest uptime (lowest m_connected), if no onion, I2P, or CJDNS peers.
128
128
BOOST_CHECK (IsProtected (
129
129
num_peers, [](NodeEvictionCandidate& c) {
130
130
c.m_connected = std::chrono::seconds{c.id };
@@ -136,7 +136,7 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
136
136
random_context));
137
137
138
138
// Expect 1/4 I2P peers to be protected from eviction,
139
- // if no onion or localhost peers.
139
+ // if no onion, localhost, or CJDNS peers.
140
140
BOOST_CHECK (IsProtected (
141
141
num_peers, [](NodeEvictionCandidate& c) {
142
142
c.m_is_local = false ;
@@ -146,8 +146,8 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
146
146
/* unprotected_peer_ids=*/ {},
147
147
random_context));
148
148
149
- // Expect 1/4 I2P peers and 1/4 of the other peers to be protected,
150
- // sorted by longest uptime (lowest m_connected), if no onion or localhost peers.
149
+ // Expect 1/4 I2P peers and 1/4 of the other peers to be protected, sorted
150
+ // by longest uptime (lowest m_connected), if no onion, localhost, or CJDNS peers.
151
151
BOOST_CHECK (IsProtected (
152
152
num_peers, [](NodeEvictionCandidate& c) {
153
153
c.m_connected = std::chrono::seconds{c.id };
@@ -158,6 +158,29 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
158
158
/* unprotected_peer_ids=*/ {3 , 5 , 6 , 7 , 8 , 11 },
159
159
random_context));
160
160
161
+ // Expect 1/4 CJDNS peers to be protected from eviction,
162
+ // if no onion, localhost, or I2P peers.
163
+ BOOST_CHECK (IsProtected (
164
+ num_peers, [](NodeEvictionCandidate& c) {
165
+ c.m_is_local = false ;
166
+ c.m_network = (c.id == 2 || c.id == 7 || c.id == 10 ) ? NET_CJDNS : NET_IPV4;
167
+ },
168
+ /* protected_peer_ids=*/ {2 , 7 , 10 },
169
+ /* unprotected_peer_ids=*/ {},
170
+ random_context));
171
+
172
+ // Expect 1/4 CJDNS peers and 1/4 of the other peers to be protected, sorted
173
+ // by longest uptime (lowest m_connected), if no onion, localhost, or I2P peers.
174
+ BOOST_CHECK (IsProtected (
175
+ num_peers, [](NodeEvictionCandidate& c) {
176
+ c.m_connected = std::chrono::seconds{c.id };
177
+ c.m_is_local = false ;
178
+ c.m_network = (c.id == 4 || c.id > 8 ) ? NET_CJDNS : NET_IPV6;
179
+ },
180
+ /* protected_peer_ids=*/ {0 , 1 , 2 , 4 , 9 , 10 },
181
+ /* unprotected_peer_ids=*/ {3 , 5 , 6 , 7 , 8 , 11 },
182
+ random_context));
183
+
161
184
// Tests with 2 networks...
162
185
163
186
// Combined test: expect having 1 localhost and 1 onion peer out of 4 to
@@ -289,16 +312,16 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
289
312
BOOST_CHECK (IsProtected (
290
313
4 , [](NodeEvictionCandidate& c) {
291
314
c.m_connected = std::chrono::seconds{c.id };
292
- c.m_is_local = (c.id == 3 );
293
- if (c.id == 4 ) {
315
+ c.m_is_local = (c.id == 2 );
316
+ if (c.id == 3 ) {
294
317
c.m_network = NET_I2P;
295
- } else if (c.id == 2 ) {
318
+ } else if (c.id == 1 ) {
296
319
c.m_network = NET_ONION;
297
320
} else {
298
321
c.m_network = NET_IPV6;
299
322
}
300
323
},
301
- /* protected_peer_ids=*/ {0 , 4 },
324
+ /* protected_peer_ids=*/ {0 , 3 },
302
325
/* unprotected_peer_ids=*/ {1 , 2 },
303
326
random_context));
304
327
@@ -416,15 +439,15 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
416
439
/* unprotected_peer_ids=*/ {6 , 7 , 8 , 9 , 10 , 11 , 16 , 19 , 20 , 21 , 22 , 23 },
417
440
random_context));
418
441
419
- // Combined test: expect having 8 localhost, 4 I2P , and 3 onion peers out of
420
- // 24 to protect 2 of each (6 total), plus 6 others for 12/24 total, sorted
421
- // by longest uptime.
442
+ // Combined test: expect having 8 localhost, 4 CJDNS , and 3 onion peers out
443
+ // of 24 to protect 2 of each (6 total), plus 6 others for 12/24 total,
444
+ // sorted by longest uptime.
422
445
BOOST_CHECK (IsProtected (
423
446
24 , [](NodeEvictionCandidate& c) {
424
447
c.m_connected = std::chrono::seconds{c.id };
425
448
c.m_is_local = (c.id > 15 );
426
449
if (c.id > 10 && c.id < 15 ) {
427
- c.m_network = NET_I2P ;
450
+ c.m_network = NET_CJDNS ;
428
451
} else if (c.id > 6 && c.id < 10 ) {
429
452
c.m_network = NET_ONION;
430
453
} else {
@@ -434,6 +457,116 @@ BOOST_AUTO_TEST_CASE(peer_protection_test)
434
457
/* protected_peer_ids=*/ {0 , 1 , 2 , 3 , 4 , 5 , 7 , 8 , 11 , 12 , 16 , 17 },
435
458
/* unprotected_peer_ids=*/ {6 , 9 , 10 , 13 , 14 , 15 , 18 , 19 , 20 , 21 , 22 , 23 },
436
459
random_context));
460
+
461
+ // Tests with 4 networks...
462
+
463
+ // Combined test: expect having 1 CJDNS, 1 I2P, 1 localhost and 1 onion peer
464
+ // out of 5 to protect 1 CJDNS, 0 I2P, 0 localhost, 0 onion and 1 other peer
465
+ // (2 total), sorted by longest uptime; stable sort breaks tie with array
466
+ // order of CJDNS first.
467
+ BOOST_CHECK (IsProtected (
468
+ 5 , [](NodeEvictionCandidate& c) {
469
+ c.m_connected = std::chrono::seconds{c.id };
470
+ c.m_is_local = (c.id == 3 );
471
+ if (c.id == 4 ) {
472
+ c.m_network = NET_CJDNS;
473
+ } else if (c.id == 1 ) {
474
+ c.m_network = NET_I2P;
475
+ } else if (c.id == 2 ) {
476
+ c.m_network = NET_ONION;
477
+ } else {
478
+ c.m_network = NET_IPV6;
479
+ }
480
+ },
481
+ /* protected_peer_ids */ {0 , 4 },
482
+ /* unprotected_peer_ids */ {1 , 2 , 3 },
483
+ random_context));
484
+
485
+ // Combined test: expect having 1 CJDNS, 1 I2P, 1 localhost and 1 onion peer
486
+ // out of 7 to protect 1 CJDNS, 0, I2P, 0 localhost, 0 onion and 2 other
487
+ // peers (3 total) sorted by longest uptime; stable sort breaks tie with
488
+ // array order of CJDNS first.
489
+ BOOST_CHECK (IsProtected (
490
+ 7 , [](NodeEvictionCandidate& c) {
491
+ c.m_connected = std::chrono::seconds{c.id };
492
+ c.m_is_local = (c.id == 4 );
493
+ if (c.id == 6 ) {
494
+ c.m_network = NET_CJDNS;
495
+ } else if (c.id == 5 ) {
496
+ c.m_network = NET_I2P;
497
+ } else if (c.id == 3 ) {
498
+ c.m_network = NET_ONION;
499
+ } else {
500
+ c.m_network = NET_IPV4;
501
+ }
502
+ },
503
+ /* protected_peer_ids=*/ {0 , 1 , 6 },
504
+ /* unprotected_peer_ids=*/ {2 , 3 , 4 , 5 },
505
+ random_context));
506
+
507
+ // Combined test: expect having 1 CJDNS, 1 I2P, 1 localhost and 1 onion peer
508
+ // out of 8 to protect 1 CJDNS, 1 I2P, 0 localhost, 0 onion and 2 other
509
+ // peers (4 total) sorted by longest uptime; stable sort breaks tie with
510
+ // array order of CJDNS first.
511
+ BOOST_CHECK (IsProtected (
512
+ 8 , [](NodeEvictionCandidate& c) {
513
+ c.m_connected = std::chrono::seconds{c.id };
514
+ c.m_is_local = (c.id == 3 );
515
+ if (c.id == 5 ) {
516
+ c.m_network = NET_CJDNS;
517
+ } else if (c.id == 6 ) {
518
+ c.m_network = NET_I2P;
519
+ } else if (c.id == 3 ) {
520
+ c.m_network = NET_ONION;
521
+ } else {
522
+ c.m_network = NET_IPV6;
523
+ }
524
+ },
525
+ /* protected_peer_ids=*/ {0 , 1 , 5 , 6 },
526
+ /* unprotected_peer_ids=*/ {2 , 3 , 4 , 7 },
527
+ random_context));
528
+
529
+ // Combined test: expect having 2 CJDNS, 2 I2P, 4 localhost, and 2 onion
530
+ // peers out of 16 to protect 1 CJDNS, 1 I2P, 1 localhost, 1 onion (4/16
531
+ // total), plus 4 others for 8 total, sorted by longest uptime.
532
+ BOOST_CHECK (IsProtected (
533
+ 16 , [](NodeEvictionCandidate& c) {
534
+ c.m_connected = std::chrono::seconds{c.id };
535
+ c.m_is_local = (c.id > 5 );
536
+ if (c.id == 11 || c.id == 15 ) {
537
+ c.m_network = NET_CJDNS;
538
+ } else if (c.id == 10 || c.id == 14 ) {
539
+ c.m_network = NET_I2P;
540
+ } else if (c.id == 8 || c.id == 9 ) {
541
+ c.m_network = NET_ONION;
542
+ } else {
543
+ c.m_network = NET_IPV4;
544
+ }
545
+ },
546
+ /* protected_peer_ids=*/ {0 , 1 , 2 , 3 , 6 , 8 , 10 , 11 },
547
+ /* unprotected_peer_ids=*/ {4 , 5 , 7 , 9 , 12 , 13 , 14 , 15 },
548
+ random_context));
549
+
550
+ // Combined test: expect having 6 CJDNS, 1 I2P, 1 localhost, and 4 onion
551
+ // peers out of 24 to protect 2 CJDNS, 1 I2P, 1 localhost, and 2 onions (6
552
+ // total), plus 6 others for 12/24 total, sorted by longest uptime.
553
+ BOOST_CHECK (IsProtected (
554
+ 24 , [](NodeEvictionCandidate& c) {
555
+ c.m_connected = std::chrono::seconds{c.id };
556
+ c.m_is_local = (c.id == 13 );
557
+ if (c.id > 17 ) {
558
+ c.m_network = NET_CJDNS;
559
+ } else if (c.id == 17 ) {
560
+ c.m_network = NET_I2P;
561
+ } else if (c.id == 12 || c.id == 14 || c.id == 15 || c.id == 16 ) {
562
+ c.m_network = NET_ONION;
563
+ } else {
564
+ c.m_network = NET_IPV6;
565
+ }
566
+ },
567
+ /* protected_peer_ids=*/ {0 , 1 , 2 , 3 , 4 , 5 , 12 , 13 , 14 , 17 , 18 , 19 },
568
+ /* unprotected_peer_ids=*/ {6 , 7 , 8 , 9 , 10 , 11 , 15 , 16 , 20 , 21 , 22 , 23 },
569
+ random_context));
437
570
}
438
571
439
572
// Returns true if any of the node ids in node_ids are selected for eviction.
0 commit comments