p2p/simulations: fix staticcheck warnings (#20322)

This commit is contained in:
Felix Lange 2019-11-19 17:16:42 +01:00 committed by GitHub
parent 9e8cc00b73
commit df206d2513
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 128 additions and 190 deletions

View File

@ -19,7 +19,6 @@ package adapters
import ( import (
"bytes" "bytes"
"context" "context"
"crypto/ecdsa"
"encoding/json" "encoding/json"
"errors" "errors"
"fmt" "fmt"
@ -146,7 +145,6 @@ type ExecNode struct {
client *rpc.Client client *rpc.Client
wsAddr string wsAddr string
newCmd func() *exec.Cmd newCmd func() *exec.Cmd
key *ecdsa.PrivateKey
} }
// Addr returns the node's enode URL // Addr returns the node's enode URL

View File

@ -20,8 +20,8 @@ import (
"bytes" "bytes"
"encoding/binary" "encoding/binary"
"fmt" "fmt"
"sync"
"testing" "testing"
"time"
"github.com/ethereum/go-ethereum/p2p/simulations/pipes" "github.com/ethereum/go-ethereum/p2p/simulations/pipes"
) )
@ -32,42 +32,26 @@ func TestTCPPipe(t *testing.T) {
t.Fatal(err) t.Fatal(err)
} }
done := make(chan struct{}) msgs := 50
size := 1024
go func() { for i := 0; i < msgs; i++ {
msgs := 50 msg := make([]byte, size)
size := 1024 binary.PutUvarint(msg, uint64(i))
for i := 0; i < msgs; i++ { if _, err := c1.Write(msg); err != nil {
msg := make([]byte, size) t.Fatal(err)
_ = binary.PutUvarint(msg, uint64(i))
_, err := c1.Write(msg)
if err != nil {
t.Fatal(err)
}
} }
}
for i := 0; i < msgs; i++ { for i := 0; i < msgs; i++ {
msg := make([]byte, size) msg := make([]byte, size)
_ = binary.PutUvarint(msg, uint64(i)) binary.PutUvarint(msg, uint64(i))
out := make([]byte, size)
out := make([]byte, size) if _, err := c2.Read(out); err != nil {
_, err := c2.Read(out) t.Fatal(err)
if err != nil { }
t.Fatal(err) if !bytes.Equal(msg, out) {
} t.Fatalf("expected %#v, got %#v", msg, out)
if !bytes.Equal(msg, out) {
t.Fatalf("expected %#v, got %#v", msg, out)
}
} }
done <- struct{}{}
}()
select {
case <-done:
case <-time.After(5 * time.Second):
t.Fatal("test timeout")
} }
} }
@ -77,60 +61,41 @@ func TestTCPPipeBidirections(t *testing.T) {
t.Fatal(err) t.Fatal(err)
} }
done := make(chan struct{}) msgs := 50
size := 7
for i := 0; i < msgs; i++ {
msg := []byte(fmt.Sprintf("ping %02d", i))
if _, err := c1.Write(msg); err != nil {
t.Fatal(err)
}
}
go func() { for i := 0; i < msgs; i++ {
msgs := 50 expected := []byte(fmt.Sprintf("ping %02d", i))
size := 7 out := make([]byte, size)
for i := 0; i < msgs; i++ { if _, err := c2.Read(out); err != nil {
msg := []byte(fmt.Sprintf("ping %02d", i)) t.Fatal(err)
}
_, err := c1.Write(msg) if !bytes.Equal(expected, out) {
if err != nil { t.Fatalf("expected %#v, got %#v", out, expected)
} else {
msg := []byte(fmt.Sprintf("pong %02d", i))
if _, err := c2.Write(msg); err != nil {
t.Fatal(err) t.Fatal(err)
} }
} }
}
for i := 0; i < msgs; i++ { for i := 0; i < msgs; i++ {
expected := []byte(fmt.Sprintf("ping %02d", i)) expected := []byte(fmt.Sprintf("pong %02d", i))
out := make([]byte, size)
out := make([]byte, size) if _, err := c1.Read(out); err != nil {
_, err := c2.Read(out) t.Fatal(err)
if err != nil {
t.Fatal(err)
}
if !bytes.Equal(expected, out) {
t.Fatalf("expected %#v, got %#v", out, expected)
} else {
msg := []byte(fmt.Sprintf("pong %02d", i))
_, err := c2.Write(msg)
if err != nil {
t.Fatal(err)
}
}
} }
if !bytes.Equal(expected, out) {
for i := 0; i < msgs; i++ { t.Fatalf("expected %#v, got %#v", out, expected)
expected := []byte(fmt.Sprintf("pong %02d", i))
out := make([]byte, size)
_, err := c1.Read(out)
if err != nil {
t.Fatal(err)
}
if !bytes.Equal(expected, out) {
t.Fatalf("expected %#v, got %#v", out, expected)
}
} }
done <- struct{}{}
}()
select {
case <-done:
case <-time.After(5 * time.Second):
t.Fatal("test timeout")
} }
} }
@ -140,46 +105,35 @@ func TestNetPipe(t *testing.T) {
t.Fatal(err) t.Fatal(err)
} }
done := make(chan struct{}) msgs := 50
size := 1024
var wg sync.WaitGroup
defer wg.Wait()
// netPipe is blocking, so writes are emitted asynchronously
wg.Add(1)
go func() { go func() {
msgs := 50 defer wg.Done()
size := 1024
// netPipe is blocking, so writes are emitted asynchronously
go func() {
for i := 0; i < msgs; i++ {
msg := make([]byte, size)
_ = binary.PutUvarint(msg, uint64(i))
_, err := c1.Write(msg)
if err != nil {
t.Fatal(err)
}
}
}()
for i := 0; i < msgs; i++ { for i := 0; i < msgs; i++ {
msg := make([]byte, size) msg := make([]byte, size)
_ = binary.PutUvarint(msg, uint64(i)) binary.PutUvarint(msg, uint64(i))
if _, err := c1.Write(msg); err != nil {
out := make([]byte, size) t.Error(err)
_, err := c2.Read(out)
if err != nil {
t.Fatal(err)
}
if !bytes.Equal(msg, out) {
t.Fatalf("expected %#v, got %#v", msg, out)
} }
} }
done <- struct{}{}
}() }()
select { for i := 0; i < msgs; i++ {
case <-done: msg := make([]byte, size)
case <-time.After(5 * time.Second): binary.PutUvarint(msg, uint64(i))
t.Fatal("test timeout") out := make([]byte, size)
if _, err := c2.Read(out); err != nil {
t.Error(err)
}
if !bytes.Equal(msg, out) {
t.Errorf("expected %#v, got %#v", msg, out)
}
} }
} }
@ -189,71 +143,60 @@ func TestNetPipeBidirections(t *testing.T) {
t.Fatal(err) t.Fatal(err)
} }
done := make(chan struct{}) msgs := 1000
size := 8
pingTemplate := "ping %03d"
pongTemplate := "pong %03d"
var wg sync.WaitGroup
defer wg.Wait()
// netPipe is blocking, so writes are emitted asynchronously
wg.Add(1)
go func() { go func() {
msgs := 1000 defer wg.Done()
size := 8
pingTemplate := "ping %03d"
pongTemplate := "pong %03d"
// netPipe is blocking, so writes are emitted asynchronously
go func() {
for i := 0; i < msgs; i++ {
msg := []byte(fmt.Sprintf(pingTemplate, i))
_, err := c1.Write(msg)
if err != nil {
t.Fatal(err)
}
}
}()
// netPipe is blocking, so reads for pong are emitted asynchronously
go func() {
for i := 0; i < msgs; i++ {
expected := []byte(fmt.Sprintf(pongTemplate, i))
out := make([]byte, size)
_, err := c1.Read(out)
if err != nil {
t.Fatal(err)
}
if !bytes.Equal(expected, out) {
t.Fatalf("expected %#v, got %#v", expected, out)
}
}
done <- struct{}{}
}()
// expect to read pings, and respond with pongs to the alternate connection
for i := 0; i < msgs; i++ { for i := 0; i < msgs; i++ {
expected := []byte(fmt.Sprintf(pingTemplate, i)) msg := []byte(fmt.Sprintf(pingTemplate, i))
if _, err := c1.Write(msg); err != nil {
out := make([]byte, size) t.Error(err)
_, err := c2.Read(out)
if err != nil {
t.Fatal(err)
}
if !bytes.Equal(expected, out) {
t.Fatalf("expected %#v, got %#v", expected, out)
} else {
msg := []byte(fmt.Sprintf(pongTemplate, i))
_, err := c2.Write(msg)
if err != nil {
t.Fatal(err)
}
} }
} }
}() }()
select { // netPipe is blocking, so reads for pong are emitted asynchronously
case <-done: wg.Add(1)
case <-time.After(5 * time.Second): go func() {
t.Fatal("test timeout") defer wg.Done()
for i := 0; i < msgs; i++ {
expected := []byte(fmt.Sprintf(pongTemplate, i))
out := make([]byte, size)
if _, err := c1.Read(out); err != nil {
t.Error(err)
}
if !bytes.Equal(expected, out) {
t.Errorf("expected %#v, got %#v", expected, out)
}
}
}()
// expect to read pings, and respond with pongs to the alternate connection
for i := 0; i < msgs; i++ {
expected := []byte(fmt.Sprintf(pingTemplate, i))
out := make([]byte, size)
_, err := c2.Read(out)
if err != nil {
t.Fatal(err)
}
if !bytes.Equal(expected, out) {
t.Errorf("expected %#v, got %#v", expected, out)
} else {
msg := []byte(fmt.Sprintf(pongTemplate, i))
if _, err := c2.Write(msg); err != nil {
t.Fatal(err)
}
}
} }
} }

View File

@ -384,12 +384,6 @@ func (s *Server) StreamNetworkEvents(w http.ResponseWriter, req *http.Request) {
sub := s.network.events.Subscribe(events) sub := s.network.events.Subscribe(events)
defer sub.Unsubscribe() defer sub.Unsubscribe()
// stop the stream if the client goes away
var clientGone <-chan bool
if cn, ok := w.(http.CloseNotifier); ok {
clientGone = cn.CloseNotify()
}
// write writes the given event and data to the stream like: // write writes the given event and data to the stream like:
// //
// event: <event> // event: <event>
@ -455,6 +449,7 @@ func (s *Server) StreamNetworkEvents(w http.ResponseWriter, req *http.Request) {
} }
} }
clientGone := req.Context().Done()
for { for {
select { select {
case event := <-events: case event := <-events:
@ -710,7 +705,7 @@ func (s *Server) wrapHandler(handler http.HandlerFunc) httprouter.Handle {
w.Header().Set("Access-Control-Allow-Origin", "*") w.Header().Set("Access-Control-Allow-Origin", "*")
w.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS") w.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS")
ctx := context.Background() ctx := req.Context()
if id := params.ByName("nodeid"); id != "" { if id := params.ByName("nodeid"); id != "" {
var nodeID enode.ID var nodeID enode.ID

View File

@ -80,14 +80,17 @@ func TestMocker(t *testing.T) {
var opts SubscribeOpts var opts SubscribeOpts
sub, err := client.SubscribeNetwork(events, opts) sub, err := client.SubscribeNetwork(events, opts)
defer sub.Unsubscribe() defer sub.Unsubscribe()
//wait until all nodes are started and connected
//store every node up event in a map (value is irrelevant, mimic Set datatype) // wait until all nodes are started and connected
// store every node up event in a map (value is irrelevant, mimic Set datatype)
nodemap := make(map[enode.ID]bool) nodemap := make(map[enode.ID]bool)
wg.Add(1)
nodesComplete := false nodesComplete := false
connCount := 0 connCount := 0
wg.Add(1)
go func() { go func() {
for { defer wg.Done()
for connCount < (nodeCount-1)*2 {
select { select {
case event := <-events: case event := <-events:
if isNodeUp(event) { if isNodeUp(event) {
@ -99,14 +102,10 @@ func TestMocker(t *testing.T) {
} }
} else if event.Conn != nil && nodesComplete { } else if event.Conn != nil && nodesComplete {
connCount += 1 connCount += 1
if connCount == (nodeCount-1)*2 {
wg.Done()
return
}
} }
case <-time.After(30 * time.Second): case <-time.After(30 * time.Second):
wg.Done() t.Errorf("Timeout waiting for nodes being started up!")
t.Fatalf("Timeout waiting for nodes being started up!") return
} }
} }
}() }()

View File

@ -81,11 +81,13 @@ func TestSnapshot(t *testing.T) {
// connect nodes in a ring // connect nodes in a ring
// spawn separate thread to avoid deadlock in the event listeners // spawn separate thread to avoid deadlock in the event listeners
connectErr := make(chan error, 1)
go func() { go func() {
for i, id := range ids { for i, id := range ids {
peerID := ids[(i+1)%len(ids)] peerID := ids[(i+1)%len(ids)]
if err := network.Connect(id, peerID); err != nil { if err := network.Connect(id, peerID); err != nil {
t.Fatal(err) connectErr <- err
return
} }
} }
}() }()
@ -100,9 +102,10 @@ OUTER:
select { select {
case <-ctx.Done(): case <-ctx.Done():
t.Fatal(ctx.Err()) t.Fatal(ctx.Err())
case err := <-connectErr:
t.Fatal(err)
case ev := <-evC: case ev := <-evC:
if ev.Type == EventTypeConn && !ev.Control { if ev.Type == EventTypeConn && !ev.Control {
// fail on any disconnect // fail on any disconnect
if !ev.Conn.Up { if !ev.Conn.Up {
t.Fatalf("unexpected disconnect: %v -> %v", ev.Conn.One, ev.Conn.Other) t.Fatalf("unexpected disconnect: %v -> %v", ev.Conn.One, ev.Conn.Other)