@@ -242,9 +242,11 @@ def assert_value_for_proto(multi, proto, expected):
242
242
@pytest .mark .parametrize (
243
243
"addr_str,proto,expected" ,
244
244
[
245
- ("/ip4/127.0.0.1/tcp/4001/p2p/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSupNKC" ,
246
- "p2p" ,
247
- "QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSupNKC" ),
245
+ (
246
+ "/ip4/127.0.0.1/tcp/4001/p2p/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSupNKC" ,
247
+ "p2p" ,
248
+ "QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSupNKC" ,
249
+ ),
248
250
("/ip4/127.0.0.1/tcp/4001" , "tcp" , "4001" ),
249
251
("/ip4/127.0.0.1/tcp/4001" , "ip4" , "127.0.0.1" ),
250
252
("/ip4/127.0.0.1/tcp/4001" , "udp" , None ),
@@ -264,8 +266,7 @@ def test_get_value(addr_str, proto, expected):
264
266
265
267
def test_get_value_original ():
266
268
ma = Multiaddr (
267
- "/ip4/127.0.0.1/tcp/5555/udp/1234/"
268
- "p2p/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSupNKC"
269
+ "/ip4/127.0.0.1/tcp/5555/udp/1234/p2p/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSupNKC"
269
270
)
270
271
271
272
assert_value_for_proto (ma , P_IP4 , "127.0.0.1" )
@@ -436,3 +437,153 @@ def test_sequence_behavior():
436
437
list (ma .items ())[len (ma )]
437
438
with pytest .raises (IndexError ):
438
439
list (ma .values ())[len (ma )]
440
+
441
+
442
+ def test_circuit_peer_id_extraction ():
443
+ """Test that get_peer_id() returns the correct peer ID for circuit addresses."""
444
+
445
+ # Basic circuit address - should return target peer ID
446
+ ma = Multiaddr ("/p2p-circuit/p2p/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSupNKC" )
447
+ assert ma .get_peer_id () == "QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSupNKC"
448
+
449
+ # Circuit with relay - should return target peer ID, not relay peer ID
450
+ ma = Multiaddr (
451
+ "/ip4/0.0.0.0/tcp/8080/p2p/QmZR5a9AAXGqQF2ADqoDdGS8zvqv8n3Pag6TDDnTNMcFW6/p2p-circuit/p2p/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSupNKC"
452
+ )
453
+ assert ma .get_peer_id () == "QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSupNKC"
454
+
455
+ # Circuit without target peer ID - should return None
456
+ ma = Multiaddr (
457
+ "/ip4/127.0.0.1/tcp/123/p2p/QmZR5a9AAXGqQF2ADqoDdGS8zvqv8n3Pag6TDDnTNMcFW6/p2p-circuit"
458
+ )
459
+ assert ma .get_peer_id () is None
460
+
461
+ # Input: bafzbeigweq4zr4x4ky2dvv7nanbkw6egutvrrvzw6g3h2rftp7gidyhtt4 (CIDv1 Base32)
462
+ # Expected: QmckZzdVd72h9QUFuJJpQqhsZqGLwjhh81qSvZ9BhB2FQi (CIDv0 Base58btc)
463
+ ma = Multiaddr ("/p2p-circuit/p2p/bafzbeigweq4zr4x4ky2dvv7nanbkw6egutvrrvzw6g3h2rftp7gidyhtt4" )
464
+ assert ma .get_peer_id () == "QmckZzdVd72h9QUFuJJpQqhsZqGLwjhh81qSvZ9BhB2FQi"
465
+
466
+ # Base58btc encoded identity multihash (no conversion needed)
467
+ ma = Multiaddr ("/p2p-circuit/p2p/12D3KooWNvSZnPi3RrhrTwEY4LuuBeB6K6facKUCJcyWG1aoDd2p" )
468
+ assert ma .get_peer_id () == "12D3KooWNvSZnPi3RrhrTwEY4LuuBeB6K6facKUCJcyWG1aoDd2p"
469
+
470
+
471
+ def test_circuit_peer_id_edge_cases ():
472
+ """Test edge cases for circuit peer ID extraction."""
473
+
474
+ # Multiple circuits - should return the target peer ID after the last circuit
475
+ # Input: bafzbeigweq4zr4x4ky2dvv7nanbkw6egutvrrvzw6g3h2rftp7gidyhtt4 (CIDv1 Base32)
476
+ # Expected: QmckZzdVd72h9QUFuJJpQqhsZqGLwjhh81qSvZ9BhB2FQi (CIDv0 Base58btc)
477
+ ma = Multiaddr (
478
+ "/ip4/1.2.3.4/tcp/1234/p2p/QmZR5a9AAXGqQF2ADqoDdGS8zvqv8n3Pag6TDDnTNMcFW6/p2p-circuit/p2p/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSupNKC/p2p-circuit/p2p/bafzbeigweq4zr4x4ky2dvv7nanbkw6egutvrrvzw6g3h2rftp7gidyhtt4"
479
+ )
480
+ assert ma .get_peer_id () == "QmckZzdVd72h9QUFuJJpQqhsZqGLwjhh81qSvZ9BhB2FQi"
481
+
482
+ # Circuit with multiple p2p components after it
483
+ # Input: bafzbeigweq4zr4x4ky2dvv7nanbkw6egutvrrvzw6g3h2rftp7gidyhtt4 (CIDv1 Base32)
484
+ # Expected: QmckZzdVd72h9QUFuJJpQqhsZqGLwjhh81qSvZ9BhB2FQi (CIDv0 Base58btc)
485
+ ma = Multiaddr (
486
+ "/ip4/1.2.3.4/tcp/1234/p2p/QmZR5a9AAXGqQF2ADqoDdGS8zvqv8n3Pag6TDDnTNMcFW6/p2p-circuit/p2p/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSupNKC/p2p/bafzbeigweq4zr4x4ky2dvv7nanbkw6egutvrrvzw6g3h2rftp7gidyhtt4"
487
+ )
488
+ assert ma .get_peer_id () == "QmckZzdVd72h9QUFuJJpQqhsZqGLwjhh81qSvZ9BhB2FQi"
489
+
490
+ # Circuit at the beginning (invalid but should handle gracefully)
491
+ ma = Multiaddr ("/p2p-circuit/p2p/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSupNKC" )
492
+ assert ma .get_peer_id () == "QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSupNKC"
493
+
494
+ # No p2p components at all
495
+ ma = Multiaddr ("/ip4/127.0.0.1/tcp/1234" )
496
+ assert ma .get_peer_id () is None
497
+
498
+ # Only relay peer ID, no target
499
+ ma = Multiaddr (
500
+ "/ip4/127.0.0.1/tcp/1234/p2p/QmZR5a9AAXGqQF2ADqoDdGS8zvqv8n3Pag6TDDnTNMcFW6/p2p-circuit"
501
+ )
502
+ assert ma .get_peer_id () is None
503
+
504
+
505
+ def test_circuit_address_parsing ():
506
+ """Test that circuit addresses can be parsed correctly."""
507
+
508
+ # Basic circuit address
509
+ ma = Multiaddr ("/p2p-circuit/p2p/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSupNKC" )
510
+ assert str (ma ) == "/p2p-circuit/p2p/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSupNKC"
511
+
512
+ # Circuit with relay
513
+ ma = Multiaddr (
514
+ "/ip4/0.0.0.0/tcp/8080/p2p/QmZR5a9AAXGqQF2ADqoDdGS8zvqv8n3Pag6TDDnTNMcFW6/p2p-circuit/p2p/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSupNKC"
515
+ )
516
+ assert "p2p-circuit" in str (ma )
517
+ assert "QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSupNKC" in str (ma )
518
+
519
+ # Input: bafzbeigweq4zr4x4ky2dvv7nanbkw6egutvrrvzw6g3h2rftp7gidyhtt4 (CIDv1 Base32)
520
+ # Expected: QmckZzdVd72h9QUFuJJpQqhsZqGLwjhh81qSvZ9BhB2FQi (CIDv0 Base58btc)
521
+ ma = Multiaddr (
522
+ "/ip4/127.0.0.1/tcp/1234/tls/p2p/QmZR5a9AAXGqQF2ADqoDdGS8zvqv8n3Pag6TDDnTNMcFW6/p2p-circuit/p2p/bafzbeigweq4zr4x4ky2dvv7nanbkw6egutvrrvzw6g3h2rftp7gidyhtt4"
523
+ )
524
+ assert (
525
+ str (ma )
526
+ == "/ip4/127.0.0.1/tcp/1234/tls/p2p/QmZR5a9AAXGqQF2ADqoDdGS8zvqv8n3Pag6TDDnTNMcFW6/p2p-circuit/p2p/QmckZzdVd72h9QUFuJJpQqhsZqGLwjhh81qSvZ9BhB2FQi"
527
+ )
528
+
529
+
530
+ def test_circuit_address_manipulation ():
531
+ """Test circuit address manipulation (encapsulate/decapsulate)."""
532
+
533
+ # Input: bafzbeigweq4zr4x4ky2dvv7nanbkw6egutvrrvzw6g3h2rftp7gidyhtt4 (CIDv1 Base32)
534
+ # Expected: QmckZzdVd72h9QUFuJJpQqhsZqGLwjhh81qSvZ9BhB2FQi (CIDv0 Base58btc)
535
+ relay = Multiaddr ("/ip4/127.0.0.1/tcp/1234/p2p/QmZR5a9AAXGqQF2ADqoDdGS8zvqv8n3Pag6TDDnTNMcFW6" )
536
+ circuit = Multiaddr (
537
+ "/p2p-circuit/p2p/bafzbeigweq4zr4x4ky2dvv7nanbkw6egutvrrvzw6g3h2rftp7gidyhtt4"
538
+ )
539
+ combined = relay .encapsulate (circuit )
540
+ assert (
541
+ str (combined )
542
+ == "/ip4/127.0.0.1/tcp/1234/p2p/QmZR5a9AAXGqQF2ADqoDdGS8zvqv8n3Pag6TDDnTNMcFW6/p2p-circuit/p2p/QmckZzdVd72h9QUFuJJpQqhsZqGLwjhh81qSvZ9BhB2FQi"
543
+ )
544
+ assert combined .get_peer_id () == "QmckZzdVd72h9QUFuJJpQqhsZqGLwjhh81qSvZ9BhB2FQi"
545
+
546
+ # Decapsulate circuit
547
+ decapsulated = combined .decapsulate ("/p2p-circuit" )
548
+ assert (
549
+ str (decapsulated )
550
+ == "/ip4/127.0.0.1/tcp/1234/p2p/QmZR5a9AAXGqQF2ADqoDdGS8zvqv8n3Pag6TDDnTNMcFW6"
551
+ )
552
+ assert decapsulated .get_peer_id () == "QmZR5a9AAXGqQF2ADqoDdGS8zvqv8n3Pag6TDDnTNMcFW6"
553
+
554
+
555
+ def test_circuit_with_consistent_cid_format ():
556
+ """Test circuit functionality using consistent CIDv0 format for easier comparison."""
557
+
558
+ # All peer IDs in CIDv0 Base58btc format for easy visual comparison
559
+ relay_peer_id = "QmZR5a9AAXGqQF2ADqoDdGS8zvqv8n3Pag6TDDnTNMcFW6"
560
+ target_peer_id = "QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSupNKC"
561
+
562
+ # Basic circuit with consistent format
563
+ ma = Multiaddr (f"/p2p-circuit/p2p/{ target_peer_id } " )
564
+ assert ma .get_peer_id () == target_peer_id
565
+
566
+ # Circuit with relay using consistent format
567
+ ma = Multiaddr (f"/ip4/127.0.0.1/tcp/1234/p2p/{ relay_peer_id } /p2p-circuit/p2p/{ target_peer_id } " )
568
+ assert ma .get_peer_id () == target_peer_id
569
+
570
+ # Test string representation preserves format
571
+ assert (
572
+ str (ma ) == f"/ip4/127.0.0.1/tcp/1234/p2p/{ relay_peer_id } /p2p-circuit/p2p/{ target_peer_id } "
573
+ )
574
+
575
+ # Test encapsulate/decapsulate with consistent format
576
+ relay = Multiaddr (f"/ip4/127.0.0.1/tcp/1234/p2p/{ relay_peer_id } " )
577
+ circuit = Multiaddr (f"/p2p-circuit/p2p/{ target_peer_id } " )
578
+ combined = relay .encapsulate (circuit )
579
+
580
+ assert (
581
+ str (combined )
582
+ == f"/ip4/127.0.0.1/tcp/1234/p2p/{ relay_peer_id } /p2p-circuit/p2p/{ target_peer_id } "
583
+ )
584
+ assert combined .get_peer_id () == target_peer_id
585
+
586
+ # Decapsulate should return relay address
587
+ decapsulated = combined .decapsulate ("/p2p-circuit" )
588
+ assert str (decapsulated ) == f"/ip4/127.0.0.1/tcp/1234/p2p/{ relay_peer_id } "
589
+ assert decapsulated .get_peer_id () == relay_peer_id
0 commit comments