From fc979d9a510b052d9d79e03daf284c2f709b0626 Mon Sep 17 00:00:00 2001 From: vipocenka <172144472+vipocenka@users.noreply.github.com> Date: Wed, 20 Aug 2025 20:03:33 +0300 Subject: [PATCH] tests: adjust snap timeout, add v5 negative cases --- eth/protocols/snap/sync_test.go | 2 +- p2p/discover/v5_udp_test.go | 62 +++++++++++++++++++++++++++++++-- 2 files changed, 61 insertions(+), 3 deletions(-) diff --git a/eth/protocols/snap/sync_test.go b/eth/protocols/snap/sync_test.go index d599e7ecc3..875259ac4e 100644 --- a/eth/protocols/snap/sync_test.go +++ b/eth/protocols/snap/sync_test.go @@ -948,7 +948,7 @@ func checkStall(t *testing.T, term func()) chan struct{} { testDone := make(chan struct{}) go func() { select { - case <-time.After(time.Minute): // TODO(karalabe): Make tests smaller, this is too much + case <-time.After(10 * time.Second): // shortened to reduce test runtime t.Log("Sync stalled") term() case <-testDone: diff --git a/p2p/discover/v5_udp_test.go b/p2p/discover/v5_udp_test.go index 3a384aab12..8552871449 100644 --- a/p2p/discover/v5_udp_test.go +++ b/p2p/discover/v5_udp_test.go @@ -379,8 +379,66 @@ func TestUDPv5_findnodeCall(t *testing.T) { t.Fatalf("wrong nodes in response") } - // TODO: check invalid IPs - // TODO: check invalid/unsigned record + // Negative cases for invalid responses: + // 1) Invalid IP: deliver a Nodes packet where one record has an unspecified IP, expect it to be ignored. + { + var ( + distances = []uint{230} + remote = test.getNode(test.remotekey, test.remoteaddr).Node() + nodes = nodesAtDistance(remote.ID(), int(distances[0]), 1) + done = make(chan error, 1) + respNodes []*enode.Node + ) + go func() { + var err error + respNodes, err = test.udp.Findnode(remote, distances) + done <- err + }() + test.waitPacketOut(func(p *v5wire.Findnode, addr netip.AddrPort, _ v5wire.Nonce) { + // Craft a record with unspecified IP (invalid according to netutil.CheckRelayAddr). + r := new(enr.Record) + r.Set(enr.IP(net.IPv4zero)) + r.Set(enr.UDP(30303)) + bad := enode.SignNull(r, nodes[0].ID()) + test.packetIn(&v5wire.Nodes{ReqID: p.ReqID, RespCount: 1, Nodes: []*enr.Record{bad.Record()}}) + }) + if err := <-done; err != nil { + t.Fatalf("unexpected error: %v", err) + } + if len(respNodes) != 0 { + t.Fatalf("expected 0 nodes for invalid IP, got %d", len(respNodes)) + } + } + + // 2) Invalid UDP port (<=1024): deliver a record with low port, expect it to be ignored. + { + var ( + distances = []uint{230} + remote = test.getNode(test.remotekey, test.remoteaddr).Node() + nodes = nodesAtDistance(remote.ID(), int(distances[0]), 1) + done = make(chan error, 1) + respNodes []*enode.Node + ) + go func() { + var err error + respNodes, err = test.udp.Findnode(remote, distances) + done <- err + }() + test.waitPacketOut(func(p *v5wire.Findnode, addr netip.AddrPort, _ v5wire.Nonce) { + r := new(enr.Record) + r.Set(enr.IP(nodes[0].IP())) + r.Set(enr.UDP(1024)) // invalid low port + bad := enode.SignNull(r, nodes[0].ID()) + test.packetIn(&v5wire.Nodes{ReqID: p.ReqID, RespCount: 1, Nodes: []*enr.Record{bad.Record()}}) + }) + if err := <-done; err != nil { + t.Fatalf("unexpected error: %v", err) + } + if len(respNodes) != 0 { + t.Fatalf("expected 0 nodes for low UDP port, got %d", len(respNodes)) + } + } + } // This test checks that pending calls are re-sent when a handshake happens.