cmd/devp2p/internal/ethtest: update

This commit is contained in:
Felix Lange 2025-10-08 13:41:16 +02:00
parent fc2e51dced
commit 37df3fc12b

View file

@ -196,6 +196,7 @@ to check if the node disconnects after receiving multiple invalid requests.`)
func (s *Suite) TestSimultaneousRequests(t *utesting.T) { func (s *Suite) TestSimultaneousRequests(t *utesting.T) {
t.Log(`This test requests blocks headers from the node, performing two requests t.Log(`This test requests blocks headers from the node, performing two requests
concurrently, with different request IDs.`) concurrently, with different request IDs.`)
conn, err := s.dialAndPeer(nil) conn, err := s.dialAndPeer(nil)
if err != nil { if err != nil {
t.Fatalf("peering failed: %v", err) t.Fatalf("peering failed: %v", err)
@ -235,44 +236,47 @@ concurrently, with different request IDs.`)
} }
// Wait for responses. // Wait for responses.
headers1 := new(eth.BlockHeadersPacket) // Note they can arrive in either order.
if err := conn.ReadMsg(ethProto, eth.BlockHeadersMsg, &headers1); err != nil { var resp1 *eth.BlockHeadersPacket
t.Fatalf("error reading block headers msg: %v", err) var resp2 *eth.BlockHeadersPacket
for range 2 {
r := new(eth.BlockHeadersPacket)
if err := conn.ReadMsg(ethProto, eth.BlockHeadersMsg, &r); err != nil {
t.Fatalf("error reading BlockHeaders msg: %v", err)
} }
if got, want := headers1.RequestId, req1.RequestId; got != want { switch r.RequestId {
t.Fatalf("unexpected request id in response: got %d, want %d", got, want) case req1.RequestId:
if resp1 != nil {
t.Fatalf("duplicate response for request with ID %v", req1.RequestId)
} }
headers2 := new(eth.BlockHeadersPacket) resp1 = r
if err := conn.ReadMsg(ethProto, eth.BlockHeadersMsg, &headers2); err != nil { case req2.RequestId:
t.Fatalf("error reading block headers msg: %v", err) if resp2 != nil {
t.Fatalf("duplicate response for request with ID %v", req2.RequestId)
}
resp2 = r
default:
t.Fatalf("unknown request ID in response: %v", r.RequestId)
} }
if got, want := headers2.RequestId, req2.RequestId; got != want {
t.Fatalf("unexpected request id in response: got %d, want %d", got, want)
} }
// Check if headers match. // Check if headers match.
if got, err := s.chain.GetHeaders(req1); err != nil { if expected, err := s.chain.GetHeaders(req1); err != nil {
t.Fatalf("failed to get expected block headers: %v", err) t.Fatalf("failed to get expected headers for request 1: %v", err)
} else if !headersMatch(headers1.BlockHeadersRequest, got) && !headersMatch(headers2.BlockHeadersRequest, got) { } else if !headersMatch(expected, resp1.BlockHeadersRequest) {
t.Fatalf("header mismatch: \nexpected %v or %v \ngot %v", headers2, headers2, got) t.Fatalf("header mismatch: \nexpected %v \ngot %v", expected, resp1)
} else if headersMatch(headers1.BlockHeadersRequest, got) {
if got2, err := s.chain.GetHeaders(req2); err != nil {
t.Fatalf("failed to get expected block headers: %v", err)
} else if !headersMatch(headers2.BlockHeadersRequest, got2) {
t.Fatalf("header mismatch: \nexpected %v \ngot %v", headers2, got2)
}
} else {
if got2, err := s.chain.GetHeaders(req2); err != nil {
t.Fatalf("failed to get expected block headers: %v", err)
} else if !headersMatch(headers1.BlockHeadersRequest, got2) {
t.Fatalf("header mismatch: \nexpected %v \ngot %v", headers1, got2)
} }
if expected, err := s.chain.GetHeaders(req2); err != nil {
t.Fatalf("failed to get expected headers for request 2: %v", err)
} else if !headersMatch(expected, resp2.BlockHeadersRequest) {
t.Fatalf("header mismatch: \nexpected %v \ngot %v", expected, resp2)
} }
} }
func (s *Suite) TestSameRequestID(t *utesting.T) { func (s *Suite) TestSameRequestID(t *utesting.T) {
t.Log(`This test requests block headers, performing two concurrent requests with the t.Log(`This test requests block headers, performing two concurrent requests with the
same request ID. The node should handle the request by responding to both requests.`) same request ID. The node should handle the request by responding to both requests.`)
conn, err := s.dialAndPeer(nil) conn, err := s.dialAndPeer(nil)
if err != nil { if err != nil {
t.Fatalf("peering failed: %v", err) t.Fatalf("peering failed: %v", err)
@ -296,7 +300,7 @@ same request ID. The node should handle the request by responding to both reques
Origin: eth.HashOrNumber{ Origin: eth.HashOrNumber{
Number: 33, Number: 33,
}, },
Amount: 2, Amount: 3,
}, },
} }
@ -308,39 +312,41 @@ same request ID. The node should handle the request by responding to both reques
t.Fatalf("failed to write to connection: %v", err) t.Fatalf("failed to write to connection: %v", err)
} }
// Wait for the responses. // Wait for the responses. They can arrive in either order, and we can't tell them
headers1 := new(eth.BlockHeadersPacket) // apart by their request ID, so use the number of headers instead.
if err := conn.ReadMsg(ethProto, eth.BlockHeadersMsg, &headers1); err != nil { var resp1 *eth.BlockHeadersPacket
t.Fatalf("error reading from connection: %v", err) var resp2 *eth.BlockHeadersPacket
for range 2 {
r := new(eth.BlockHeadersPacket)
if err := conn.ReadMsg(ethProto, eth.BlockHeadersMsg, &r); err != nil {
t.Fatalf("error reading BlockHeaders msg: %v", err)
} }
if got, want := headers1.RequestId, request1.RequestId; got != want { switch uint64(len(r.BlockHeadersRequest)) {
t.Fatalf("unexpected request id: got %d, want %d", got, want) case request1.GetBlockHeadersRequest.Amount:
if resp1 != nil {
t.Fatalf("duplicate response with %d headers", request1.GetBlockHeadersRequest.Amount)
} }
headers2 := new(eth.BlockHeadersPacket) resp1 = r
if err := conn.ReadMsg(ethProto, eth.BlockHeadersMsg, &headers2); err != nil { case request2.GetBlockHeadersRequest.Amount:
t.Fatalf("error reading from connection: %v", err) if resp2 != nil {
t.Fatalf("duplicate response with %d headers", request2.GetBlockHeadersRequest.Amount)
}
resp2 = r
default:
t.Fatalf("invalid number of items in response: %d", len(r.BlockHeadersRequest))
} }
if got, want := headers2.RequestId, request2.RequestId; got != want {
t.Fatalf("unexpected request id: got %d, want %d", got, want)
} }
// Check if headers match. // Check if headers match.
if got, err := s.chain.GetHeaders(request1); err != nil { if expected, err := s.chain.GetHeaders(request1); err != nil {
t.Fatalf("failed to get expected block headers: %v", err) t.Fatalf("failed to get expected headers for request 1: %v", err)
} else if !headersMatch(headers1.BlockHeadersRequest, got) && !headersMatch(headers2.BlockHeadersRequest, got) { } else if !headersMatch(expected, resp1.BlockHeadersRequest) {
t.Fatalf("header mismatch: \nexpected %v or %v \ngot %v", headers2, headers2, got) t.Fatalf("header mismatch: \nexpected %v \ngot %v", expected, resp1)
} else if headersMatch(headers1.BlockHeadersRequest, got) {
if got2, err := s.chain.GetHeaders(request2); err != nil {
t.Fatalf("failed to get expected block headers: %v", err)
} else if !headersMatch(headers2.BlockHeadersRequest, got2) {
t.Fatalf("header mismatch: \nexpected %v \ngot %v", headers2, got2)
}
} else {
if got2, err := s.chain.GetHeaders(request2); err != nil {
t.Fatalf("failed to get expected block headers: %v", err)
} else if !headersMatch(headers1.BlockHeadersRequest, got2) {
t.Fatalf("header mismatch: \nexpected %v \ngot %v", headers1, got2)
} }
if expected, err := s.chain.GetHeaders(request2); err != nil {
t.Fatalf("failed to get expected headers for request 2: %v", err)
} else if !headersMatch(expected, resp2.BlockHeadersRequest) {
t.Fatalf("header mismatch: \nexpected %v \ngot %v", expected, resp2)
} }
} }