瀏覽代碼

cmd/devp2p: add old block announcement test to eth test suite (#22474)

Add old block announcement test to eth test suite, checks to make sure old block announcement isn't propagated
rene 4 年之前
父節點
當前提交
36b51b8156
共有 2 個文件被更改,包括 37 次插入0 次删除
  1. 4 0
      cmd/devp2p/internal/ethtest/eth66_suite.go
  2. 33 0
      cmd/devp2p/internal/ethtest/suite.go

+ 4 - 0
cmd/devp2p/internal/ethtest/eth66_suite.go

@@ -215,6 +215,10 @@ func (s *Suite) TestLargeAnnounce_66(t *utesting.T) {
 	}
 }
 
+func (s *Suite) TestOldAnnounce_66(t *utesting.T) {
+	s.oldAnnounce(t, s.setupConnection66(t), s.setupConnection66(t))
+}
+
 // TestMaliciousHandshake_66 tries to send malicious data during the handshake.
 func (s *Suite) TestMaliciousHandshake_66(t *utesting.T) {
 	conn := s.dial66(t)

+ 33 - 0
cmd/devp2p/internal/ethtest/suite.go

@@ -19,6 +19,7 @@ package ethtest
 import (
 	"fmt"
 	"net"
+	"strings"
 	"time"
 
 	"github.com/davecgh/go-spew/spew"
@@ -84,6 +85,8 @@ func (s *Suite) AllEthTests() []utesting.Test {
 		{Name: "Broadcast_66", Fn: s.TestBroadcast_66},
 		{Name: "TestLargeAnnounce", Fn: s.TestLargeAnnounce},
 		{Name: "TestLargeAnnounce_66", Fn: s.TestLargeAnnounce_66},
+		{Name: "TestOldAnnounce", Fn: s.TestOldAnnounce},
+		{Name: "TestOldAnnounce_66", Fn: s.TestOldAnnounce_66},
 		// malicious handshakes + status
 		{Name: "TestMaliciousHandshake", Fn: s.TestMaliciousHandshake},
 		{Name: "TestMaliciousStatus", Fn: s.TestMaliciousStatus},
@@ -389,6 +392,36 @@ func (s *Suite) TestLargeAnnounce(t *utesting.T) {
 	}
 }
 
+func (s *Suite) TestOldAnnounce(t *utesting.T) {
+	s.oldAnnounce(t, s.setupConnection(t), s.setupConnection(t))
+}
+
+func (s *Suite) oldAnnounce(t *utesting.T, sendConn, receiveConn *Conn) {
+	oldBlockAnnounce := &NewBlock{
+		Block: s.chain.blocks[len(s.chain.blocks)/2],
+		TD:    s.chain.blocks[len(s.chain.blocks)/2].Difficulty(),
+	}
+
+	if err := sendConn.Write(oldBlockAnnounce); err != nil {
+		t.Fatalf("could not write to connection: %v", err)
+	}
+
+	switch msg := receiveConn.ReadAndServe(s.chain, timeout*2).(type) {
+	case *NewBlock:
+		t.Fatalf("unexpected: block propagated: %s", pretty.Sdump(msg))
+	case *NewBlockHashes:
+		t.Fatalf("unexpected: block announced: %s", pretty.Sdump(msg))
+	case *Error:
+		errMsg := *msg
+		// check to make sure error is timeout (propagation didn't come through == test successful)
+		if !strings.Contains(errMsg.String(), "timeout") {
+			t.Fatalf("unexpected error: %v", pretty.Sdump(msg))
+		}
+	default:
+		t.Fatalf("unexpected: %s", pretty.Sdump(msg))
+	}
+}
+
 func (s *Suite) testAnnounce(t *utesting.T, sendConn, receiveConn *Conn, blockAnnouncement *NewBlock) {
 	// Announce the block.
 	if err := sendConn.Write(blockAnnouncement); err != nil {