@@ -14,6 +14,7 @@ import (
1414 "github.com/prysmaticlabs/go-bitfield"
1515 "golang.org/x/exp/slices"
1616
17+ "github.com/ethereum/go-ethereum/common/hexutil"
1718 "github.com/ethereum/go-ethereum/internal/testlog"
1819 "github.com/ethereum/go-ethereum/log"
1920 "github.com/ethereum/go-ethereum/p2p/discover/portalwire"
@@ -410,3 +411,72 @@ func TestContentLookup(t *testing.T) {
410411 assert .Equal (t , ContentNotFound , err )
411412 assert .Nil (t , res )
412413}
414+
415+ func TestTraceContentLookup (t * testing.T ) {
416+ node1 , err := setupLocalPortalNode (":17787" , nil )
417+ assert .NoError (t , err )
418+ node1 .log = testlog .Logger (t , log .LvlTrace )
419+ err = node1 .Start ()
420+ assert .NoError (t , err )
421+
422+ node2 , err := setupLocalPortalNode (":17788" , []* enode.Node {node1 .localNode .Node ()})
423+ assert .NoError (t , err )
424+ node2 .log = testlog .Logger (t , log .LvlTrace )
425+ err = node2 .Start ()
426+ assert .NoError (t , err )
427+
428+ node3 , err := setupLocalPortalNode (":17789" , []* enode.Node {node2 .localNode .Node ()})
429+ assert .NoError (t , err )
430+ node3 .log = testlog .Logger (t , log .LvlTrace )
431+ err = node3 .Start ()
432+ assert .NoError (t , err )
433+
434+ contentKey := []byte {0x3 , 0x4 }
435+ content := []byte {0x1 , 0x2 }
436+ contentId := node1 .toContentId (contentKey )
437+
438+ err = node1 .storage .Put (contentId , content )
439+ assert .NoError (t , err )
440+
441+ node1Id := hexutil .Encode (node1 .Self ().ID ().Bytes ())
442+ node2Id := hexutil .Encode (node2 .Self ().ID ().Bytes ())
443+ node3Id := hexutil .Encode (node3 .Self ().ID ().Bytes ())
444+
445+ res , err := node3 .TraceContentLookup (contentKey )
446+ assert .NoError (t , err )
447+ assert .Equal (t , res .Content , hexutil .Encode (content ))
448+ assert .Equal (t , res .UtpTransfer , false )
449+ assert .Equal (t , res .Trace .Origin , node3Id )
450+ assert .Equal (t , res .Trace .TargetId , hexutil .Encode (contentId ))
451+ assert .Equal (t , res .Trace .ReceivedFrom , node1Id )
452+
453+ // check nodeMeta
454+ node1Meta := res .Trace .Metadata [node1Id ]
455+ assert .Equal (t , node1Meta .Enr , node1 .Self ().String ())
456+ dis := node1 .Distance (node1 .Self ().ID (), enode .ID (contentId ))
457+ assert .Equal (t , node1Meta .Distance , hexutil .Encode (dis [:]))
458+
459+ node2Meta := res .Trace .Metadata [node2Id ]
460+ assert .Equal (t , node2Meta .Enr , node2 .Self ().String ())
461+ dis = node2 .Distance (node2 .Self ().ID (), enode .ID (contentId ))
462+ assert .Equal (t , node2Meta .Distance , hexutil .Encode (dis [:]))
463+
464+ node3Meta := res .Trace .Metadata [node3Id ]
465+ assert .Equal (t , node3Meta .Enr , node3 .Self ().String ())
466+ dis = node3 .Distance (node3 .Self ().ID (), enode .ID (contentId ))
467+ assert .Equal (t , node3Meta .Distance , hexutil .Encode (dis [:]))
468+
469+ // check response
470+ node3Response := res .Trace .Responses [node3Id ]
471+ assert .Equal (t , node3Response , []string {node2Id })
472+
473+ node2Response := res .Trace .Responses [node2Id ]
474+ assert .Equal (t , node2Response , []string {node1Id })
475+
476+ node1Response := res .Trace .Responses [node1Id ]
477+ assert .Equal (t , node1Response , []string {})
478+
479+ // res, _, err = node1.ContentLookup([]byte{0x2, 0x4})
480+ // assert.Equal(t, ContentNotFound, err)
481+ // assert.Nil(t, res)
482+ }
0 commit comments