diff --git a/cmd/devp2p/internal/v5test/discv5tests.go b/cmd/devp2p/internal/v5test/discv5tests.go index ec10db6ba4..9bd390d4ad 100644 --- a/cmd/devp2p/internal/v5test/discv5tests.go +++ b/cmd/devp2p/internal/v5test/discv5tests.go @@ -55,6 +55,7 @@ func (s *Suite) AllTests() []utesting.Test { {Name: "HandshakeResend", Fn: s.TestHandshakeResend}, {Name: "TalkRequest", Fn: s.TestTalkRequest}, {Name: "FindnodeWrongIP", Fn: s.TestFindnodeWrongIP}, + {Name: "FindnodeHandshake", Fn: s.TestFindnodeHandshake}, {Name: "FindnodeZeroDistance", Fn: s.TestFindnodeZeroDistance}, {Name: "FindnodeResults", Fn: s.TestFindnodeResults}, } @@ -257,6 +258,34 @@ The remote node should challenge the second endpoint with WHOAREYOU instead of r } } +func (s *Suite) TestFindnodeHandshake(t *utesting.T) { + conn, l1 := s.listen1(t) + defer conn.close() + + req := &v5wire.Findnode{ReqID: conn.nextReqID(), Distances: []uint{0}} + nonce := conn.write(l1, req, nil) + + challenge, ok := conn.read(l1).(*v5wire.Whoareyou) + if !ok { + t.Fatal("expected WHOAREYOU before NODES") + } + if challenge.Nonce != nonce { + t.Fatalf("wrong nonce %x in WHOAREYOU (want %x)", challenge.Nonce[:], nonce[:]) + } + + challenge.Node = conn.remote + conn.write(l1, req, challenge) + + resp := conn.read(l1) + nodes, ok := resp.(*v5wire.Nodes) + if !ok { + t.Fatal("expected NODES after completing handshake, got", resp) + } + if !bytes.Equal(nodes.ReqID, req.ReqID) { + t.Fatalf("wrong request ID %x in NODES, want %x", nodes.ReqID, req.ReqID) + } +} + func (s *Suite) TestFindnodeZeroDistance(t *utesting.T) { t.Log(`This test checks that the remote node returns itself for FINDNODE with distance zero.`)