|
|
@@ -18,6 +18,7 @@ package simulations
|
|
|
|
|
|
import (
|
|
|
"context"
|
|
|
+ "flag"
|
|
|
"fmt"
|
|
|
"math/rand"
|
|
|
"net/http/httptest"
|
|
|
@@ -28,13 +29,26 @@ import (
|
|
|
"time"
|
|
|
|
|
|
"github.com/ethereum/go-ethereum/event"
|
|
|
+ "github.com/ethereum/go-ethereum/log"
|
|
|
"github.com/ethereum/go-ethereum/node"
|
|
|
"github.com/ethereum/go-ethereum/p2p"
|
|
|
"github.com/ethereum/go-ethereum/p2p/enode"
|
|
|
"github.com/ethereum/go-ethereum/p2p/simulations/adapters"
|
|
|
"github.com/ethereum/go-ethereum/rpc"
|
|
|
+ colorable "github.com/mattn/go-colorable"
|
|
|
)
|
|
|
|
|
|
+var (
|
|
|
+ loglevel = flag.Int("loglevel", 2, "verbosity of logs")
|
|
|
+)
|
|
|
+
|
|
|
+func init() {
|
|
|
+ flag.Parse()
|
|
|
+
|
|
|
+ log.PrintOrigins(true)
|
|
|
+ log.Root().SetHandler(log.LvlFilterHandler(log.Lvl(*loglevel), log.StreamHandler(colorable.NewColorableStderr(), log.TerminalFormat(true))))
|
|
|
+}
|
|
|
+
|
|
|
// testService implements the node.Service interface and provides protocols
|
|
|
// and APIs which are useful for testing nodes in a simulation network
|
|
|
type testService struct {
|
|
|
@@ -584,9 +598,26 @@ func TestHTTPNodeRPC(t *testing.T) {
|
|
|
// TestHTTPSnapshot tests creating and loading network snapshots
|
|
|
func TestHTTPSnapshot(t *testing.T) {
|
|
|
// start the server
|
|
|
- _, s := testHTTPServer(t)
|
|
|
+ network, s := testHTTPServer(t)
|
|
|
defer s.Close()
|
|
|
|
|
|
+ var eventsDone = make(chan struct{})
|
|
|
+ count := 1
|
|
|
+ eventsDoneChan := make(chan *Event)
|
|
|
+ eventSub := network.Events().Subscribe(eventsDoneChan)
|
|
|
+ go func() {
|
|
|
+ defer eventSub.Unsubscribe()
|
|
|
+ for event := range eventsDoneChan {
|
|
|
+ if event.Type == EventTypeConn && !event.Control {
|
|
|
+ count--
|
|
|
+ if count == 0 {
|
|
|
+ eventsDone <- struct{}{}
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }()
|
|
|
+
|
|
|
// create a two-node network
|
|
|
client := NewClient(s.URL)
|
|
|
nodeCount := 2
|
|
|
@@ -620,7 +651,7 @@ func TestHTTPSnapshot(t *testing.T) {
|
|
|
}
|
|
|
states[i] = state
|
|
|
}
|
|
|
-
|
|
|
+ <-eventsDone
|
|
|
// create a snapshot
|
|
|
snap, err := client.CreateSnapshot()
|
|
|
if err != nil {
|
|
|
@@ -634,9 +665,23 @@ func TestHTTPSnapshot(t *testing.T) {
|
|
|
}
|
|
|
|
|
|
// create another network
|
|
|
- _, s = testHTTPServer(t)
|
|
|
+ network2, s := testHTTPServer(t)
|
|
|
defer s.Close()
|
|
|
client = NewClient(s.URL)
|
|
|
+ count = 1
|
|
|
+ eventSub = network2.Events().Subscribe(eventsDoneChan)
|
|
|
+ go func() {
|
|
|
+ defer eventSub.Unsubscribe()
|
|
|
+ for event := range eventsDoneChan {
|
|
|
+ if event.Type == EventTypeConn && !event.Control {
|
|
|
+ count--
|
|
|
+ if count == 0 {
|
|
|
+ eventsDone <- struct{}{}
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }()
|
|
|
|
|
|
// subscribe to events so we can check them later
|
|
|
events := make(chan *Event, 100)
|
|
|
@@ -651,6 +696,7 @@ func TestHTTPSnapshot(t *testing.T) {
|
|
|
if err := client.LoadSnapshot(snap); err != nil {
|
|
|
t.Fatalf("error loading snapshot: %s", err)
|
|
|
}
|
|
|
+ <-eventsDone
|
|
|
|
|
|
// check the nodes and connection exists
|
|
|
net, err := client.GetNetwork()
|
|
|
@@ -676,6 +722,9 @@ func TestHTTPSnapshot(t *testing.T) {
|
|
|
if conn.Other.String() != nodes[1].ID {
|
|
|
t.Fatalf("expected connection to have other=%q, got other=%q", nodes[1].ID, conn.Other)
|
|
|
}
|
|
|
+ if !conn.Up {
|
|
|
+ t.Fatal("should be up")
|
|
|
+ }
|
|
|
|
|
|
// check the node states were restored
|
|
|
for i, node := range nodes {
|