13
13
import time
14
14
15
15
import test_framework .messages
16
- from test_framework .netutil import ADDRMAN_NEW_BUCKET_COUNT , ADDRMAN_TRIED_BUCKET_COUNT , ADDRMAN_BUCKET_SIZE
17
16
from test_framework .p2p import (
18
17
P2PInterface ,
19
18
P2P_SERVICES ,
@@ -42,6 +41,20 @@ def assert_net_servicesnames(servicesflag, servicenames):
42
41
assert servicesflag_generated == servicesflag
43
42
44
43
44
+ def seed_addrman (node ):
45
+ """ Populate the addrman with addresses from different networks.
46
+ Here 2 ipv4, 2 ipv6, 1 cjdns, 2 onion and 1 i2p addresses are added.
47
+ """
48
+ node .addpeeraddress (address = "1.2.3.4" , tried = True , port = 8333 )
49
+ node .addpeeraddress (address = "2.0.0.0" , port = 8333 )
50
+ node .addpeeraddress (address = "1233:3432:2434:2343:3234:2345:6546:4534" , tried = True , port = 8333 )
51
+ node .addpeeraddress (address = "2803:0:1234:abcd::1" , port = 45324 )
52
+ node .addpeeraddress (address = "fc00:1:2:3:4:5:6:7" , port = 8333 )
53
+ node .addpeeraddress (address = "pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd.onion" , tried = True , port = 8333 )
54
+ node .addpeeraddress (address = "nrfj6inpyf73gpkyool35hcmne5zwfmse3jl3aw23vk7chdemalyaqad.onion" , port = 45324 , tried = True )
55
+ node .addpeeraddress (address = "c4gfnttsuwqomiygupdqqqyy5y5emnk5c73hrfvatri67prd7vyq.b32.i2p" , port = 8333 )
56
+
57
+
45
58
class NetTest (BitcoinTestFramework ):
46
59
def set_test_params (self ):
47
60
self .num_nodes = 2
@@ -376,25 +389,33 @@ def test_sendmsgtopeer(self):
376
389
377
390
def test_getaddrmaninfo (self ):
378
391
self .log .info ("Test getaddrmaninfo" )
392
+ self .restart_node (1 , extra_args = ["-cjdnsreachable" , "-test=addrman" ], clear_addrman = True )
379
393
node = self .nodes [1 ]
394
+ seed_addrman (node )
395
+
396
+ expected_network_count = {
397
+ 'all_networks' : {'new' : 4 , 'tried' : 4 , 'total' : 8 },
398
+ 'ipv4' : {'new' : 1 , 'tried' : 1 , 'total' : 2 },
399
+ 'ipv6' : {'new' : 1 , 'tried' : 1 , 'total' : 2 },
400
+ 'onion' : {'new' : 0 , 'tried' : 2 , 'total' : 2 },
401
+ 'i2p' : {'new' : 1 , 'tried' : 0 , 'total' : 1 },
402
+ 'cjdns' : {'new' : 1 , 'tried' : 0 , 'total' : 1 },
403
+ }
380
404
381
- # current count of ipv4 addresses in addrman is {'new':1, 'tried':1}
382
- self .log .info ("Test that count of addresses in addrman match expected values" )
405
+ self .log .debug ("Test that count of addresses in addrman match expected values" )
383
406
res = node .getaddrmaninfo ()
384
- assert_equal (res ["ipv4" ]["new" ], 1 )
385
- assert_equal (res ["ipv4" ]["tried" ], 1 )
386
- assert_equal (res ["ipv4" ]["total" ], 2 )
387
- assert_equal (res ["all_networks" ]["new" ], 1 )
388
- assert_equal (res ["all_networks" ]["tried" ], 1 )
389
- assert_equal (res ["all_networks" ]["total" ], 2 )
390
- for net in ["ipv6" , "onion" , "i2p" , "cjdns" ]:
391
- assert_equal (res [net ]["new" ], 0 )
392
- assert_equal (res [net ]["tried" ], 0 )
393
- assert_equal (res [net ]["total" ], 0 )
407
+ for network , count in expected_network_count .items ():
408
+ assert_equal (res [network ]['new' ], count ['new' ])
409
+ assert_equal (res [network ]['tried' ], count ['tried' ])
410
+ assert_equal (res [network ]['total' ], count ['total' ])
394
411
395
412
def test_getrawaddrman (self ):
396
413
self .log .info ("Test getrawaddrman" )
414
+ self .restart_node (1 , extra_args = ["-cjdnsreachable" , "-test=addrman" ], clear_addrman = True )
397
415
node = self .nodes [1 ]
416
+ self .addr_time = int (time .time ())
417
+ node .setmocktime (self .addr_time )
418
+ seed_addrman (node )
398
419
399
420
self .log .debug ("Test that getrawaddrman is a hidden RPC" )
400
421
# It is hidden from general help, but its detailed help may be called directly.
@@ -416,88 +437,96 @@ def check_getrawaddrman_entries(expected):
416
437
getrawaddrman = node .getrawaddrman ()
417
438
getaddrmaninfo = node .getaddrmaninfo ()
418
439
for (table_name , table_info ) in expected .items ():
419
- assert_equal (len (getrawaddrman [table_name ]), len (table_info [ "entries" ] ))
440
+ assert_equal (len (getrawaddrman [table_name ]), len (table_info ))
420
441
assert_equal (len (getrawaddrman [table_name ]), getaddrmaninfo ["all_networks" ][table_name ])
421
442
422
443
for bucket_position in getrawaddrman [table_name ].keys ():
423
- bucket = int (bucket_position .split ("/" )[0 ])
424
- position = int (bucket_position .split ("/" )[1 ])
425
-
426
- # bucket and position only be sanity checked here as the
427
- # test-addrman isn't deterministic
428
- assert 0 <= int (bucket ) < table_info ["bucket_count" ]
429
- assert 0 <= int (position ) < ADDRMAN_BUCKET_SIZE
430
-
431
444
entry = getrawaddrman [table_name ][bucket_position ]
432
- expected_entry = list (filter (lambda e : e ["address" ] == entry ["address" ], table_info ["entries" ]))[0 ]
445
+ expected_entry = list (filter (lambda e : e ["address" ] == entry ["address" ], table_info ))[0 ]
446
+ assert bucket_position == expected_entry ["bucket_position" ]
433
447
check_addr_information (entry , expected_entry )
434
448
435
- # we expect one addrman new and tried table entry, which were added in a previous test
449
+ # we expect 4 new and 4 tried table entries in the addrman which were added using seed_addrman()
436
450
expected = {
437
- "new" : {
438
- "bucket_count" : ADDRMAN_NEW_BUCKET_COUNT ,
439
- "entries" : [
451
+ "new" : [
440
452
{
453
+ "bucket_position" : "82/8" ,
441
454
"address" : "2.0.0.0" ,
442
455
"port" : 8333 ,
443
456
"services" : 9 ,
444
457
"network" : "ipv4" ,
445
458
"source" : "2.0.0.0" ,
446
459
"source_network" : "ipv4" ,
460
+ },
461
+ {
462
+ "bucket_position" : "336/24" ,
463
+ "address" : "fc00:1:2:3:4:5:6:7" ,
464
+ "port" : 8333 ,
465
+ "services" : 9 ,
466
+ "network" : "cjdns" ,
467
+ "source" : "fc00:1:2:3:4:5:6:7" ,
468
+ "source_network" : "cjdns" ,
469
+ },
470
+ {
471
+ "bucket_position" : "963/46" ,
472
+ "address" : "c4gfnttsuwqomiygupdqqqyy5y5emnk5c73hrfvatri67prd7vyq.b32.i2p" ,
473
+ "port" : 8333 ,
474
+ "services" : 9 ,
475
+ "network" : "i2p" ,
476
+ "source" : "c4gfnttsuwqomiygupdqqqyy5y5emnk5c73hrfvatri67prd7vyq.b32.i2p" ,
477
+ "source_network" : "i2p" ,
478
+ },
479
+ {
480
+ "bucket_position" : "613/6" ,
481
+ "address" : "2803:0:1234:abcd::1" ,
482
+ "services" : 9 ,
483
+ "network" : "ipv6" ,
484
+ "source" : "2803:0:1234:abcd::1" ,
485
+ "source_network" : "ipv6" ,
486
+ "port" : 45324 ,
447
487
}
448
- ]
449
- },
450
- "tried" : {
451
- "bucket_count" : ADDRMAN_TRIED_BUCKET_COUNT ,
452
- "entries" : [
488
+ ],
489
+ "tried" : [
453
490
{
491
+ "bucket_position" : "6/33" ,
454
492
"address" : "1.2.3.4" ,
455
493
"port" : 8333 ,
456
494
"services" : 9 ,
457
495
"network" : "ipv4" ,
458
496
"source" : "1.2.3.4" ,
459
497
"source_network" : "ipv4" ,
498
+ },
499
+ {
500
+ "bucket_position" : "197/34" ,
501
+ "address" : "1233:3432:2434:2343:3234:2345:6546:4534" ,
502
+ "port" : 8333 ,
503
+ "services" : 9 ,
504
+ "network" : "ipv6" ,
505
+ "source" : "1233:3432:2434:2343:3234:2345:6546:4534" ,
506
+ "source_network" : "ipv6" ,
507
+ },
508
+ {
509
+ "bucket_position" : "72/61" ,
510
+ "address" : "pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd.onion" ,
511
+ "port" : 8333 ,
512
+ "services" : 9 ,
513
+ "network" : "onion" ,
514
+ "source" : "pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd.onion" ,
515
+ "source_network" : "onion"
516
+ },
517
+ {
518
+ "bucket_position" : "139/46" ,
519
+ "address" : "nrfj6inpyf73gpkyool35hcmne5zwfmse3jl3aw23vk7chdemalyaqad.onion" ,
520
+ "services" : 9 ,
521
+ "network" : "onion" ,
522
+ "source" : "nrfj6inpyf73gpkyool35hcmne5zwfmse3jl3aw23vk7chdemalyaqad.onion" ,
523
+ "source_network" : "onion" ,
524
+ "port" : 45324 ,
460
525
}
461
- ]
462
- }
526
+ ]
463
527
}
464
528
465
- self .log .debug ("Test that the getrawaddrman contains information about the addresses added in a previous test" )
466
- check_getrawaddrman_entries (expected )
467
-
468
- self .log .debug ("Add one new address to each addrman table" )
469
- expected ["new" ]["entries" ].append ({
470
- "address" : "2803:0:1234:abcd::1" ,
471
- "services" : 9 ,
472
- "network" : "ipv6" ,
473
- "source" : "2803:0:1234:abcd::1" ,
474
- "source_network" : "ipv6" ,
475
- "port" : - 1 , # set once addpeeraddress is successful
476
- })
477
- expected ["tried" ]["entries" ].append ({
478
- "address" : "nrfj6inpyf73gpkyool35hcmne5zwfmse3jl3aw23vk7chdemalyaqad.onion" ,
479
- "services" : 9 ,
480
- "network" : "onion" ,
481
- "source" : "nrfj6inpyf73gpkyool35hcmne5zwfmse3jl3aw23vk7chdemalyaqad.onion" ,
482
- "source_network" : "onion" ,
483
- "port" : - 1 , # set once addpeeraddress is successful
484
- })
485
-
486
- port = 0
487
- for (table_name , table_info ) in expected .items ():
488
- # There's a slight chance that the to-be-added address collides with an already
489
- # present table entry. To avoid this, we increment the port until an address has been
490
- # added. Incrementing the port changes the position in the new table bucket (bucket
491
- # stays the same) and changes both the bucket and the position in the tried table.
492
- while True :
493
- if node .addpeeraddress (address = table_info ["entries" ][1 ]["address" ], port = port , tried = table_name == "tried" )["success" ]:
494
- table_info ["entries" ][1 ]["port" ] = port
495
- self .log .debug (f"Added { table_info ['entries' ][1 ]['address' ]} to { table_name } table" )
496
- break
497
- else :
498
- port += 1
499
-
500
- self .log .debug ("Test that the newly added addresses appear in getrawaddrman" )
529
+ self .log .debug ("Test that getrawaddrman contains information about newly added addresses in each addrman table" )
501
530
check_getrawaddrman_entries (expected )
502
531
503
532
0 commit comments