diff --git a/test/e2e/Makefile b/test/e2e/Makefile index 858335e3f..5fbbed91a 100644 --- a/test/e2e/Makefile +++ b/test/e2e/Makefile @@ -1,9 +1,8 @@ +all: docker runner + docker: docker build --tag tendermint/e2e-node -f docker/Dockerfile ../.. -ci: runner - ./build/runner -f networks/ci.toml - # We need to build support for database backends into the app in # order to build a binary with a Tendermint node in it (for built-in # ABCI testing). @@ -13,4 +12,4 @@ app: runner: go build -o build/runner ./runner -.PHONY: app ci docker runner +.PHONY: app docker runner diff --git a/test/e2e/networks/ci.toml b/test/e2e/networks/ci.toml index 94ddecb02..e366bb6c5 100644 --- a/test/e2e/networks/ci.toml +++ b/test/e2e/networks/ci.toml @@ -26,6 +26,11 @@ validator05 = 50 [node.seed01] mode = "seed" +persistent_peers = ["seed02"] + +[node.seed02] +mode = "seed" +persistent_peers = ["seed01"] [node.validator01] seeds = ["seed01"] @@ -33,7 +38,7 @@ snapshot_interval = 5 perturb = ["disconnect"] [node.validator02] -seeds = ["seed01"] +seeds = ["seed02"] database = "boltdb" abci_protocol = "tcp" privval_protocol = "tcp" @@ -64,7 +69,7 @@ perturb = ["pause"] [node.validator05] start_at = 1005 # Becomes part of the validator set at 1010 -seeds = ["seed01"] +seeds = ["seed02"] database = "cleveldb" fast_sync = "v0" # FIXME Should use grpc, but it has race conditions diff --git a/test/e2e/runner/main.go b/test/e2e/runner/main.go index d58305c9b..ab14349d0 100644 --- a/test/e2e/runner/main.go +++ b/test/e2e/runner/main.go @@ -68,7 +68,7 @@ func NewCLI() *CLI { if err := Perturb(cli.testnet); err != nil { return err } - if err := Wait(cli.testnet, 5); err != nil { // wait for network to settle + if err := Wait(cli.testnet, 5); err != nil { // allow some txs to go through return err } @@ -76,7 +76,7 @@ func NewCLI() *CLI { if err := <-chLoadResult; err != nil { return err } - if err := Wait(cli.testnet, 3); err != nil { // wait for last txs to commit + if err := Wait(cli.testnet, 10); err != nil { // wait for network to settle before tests return err } if err := Test(cli.testnet); err != nil { diff --git a/test/e2e/tests/net_test.go b/test/e2e/tests/net_test.go new file mode 100644 index 000000000..43d155236 --- /dev/null +++ b/test/e2e/tests/net_test.go @@ -0,0 +1,42 @@ +package e2e_test + +import ( + "testing" + + "github.com/stretchr/testify/require" + e2e "github.com/tendermint/tendermint/test/e2e/pkg" +) + +// Tests that all nodes have peered with each other, regardless of discovery method. +func TestNet_Peers(t *testing.T) { + testNode(t, func(t *testing.T, node e2e.Node) { + // Seed nodes shouldn't necessarily mesh with the entire network. + if node.Mode == e2e.ModeSeed { + return + } + + client, err := node.Client() + require.NoError(t, err) + netInfo, err := client.NetInfo(ctx) + require.NoError(t, err) + + require.Equal(t, len(node.Testnet.Nodes)-1, netInfo.NPeers, + "node is not fully meshed with peers") + + seen := map[string]bool{} + for _, n := range node.Testnet.Nodes { + seen[n.Name] = (n.Name == node.Name) // we've clearly seen ourself + } + for _, peerInfo := range netInfo.Peers { + peer := node.Testnet.LookupNode(peerInfo.NodeInfo.Moniker) + require.NotNil(t, peer, "unknown node %v", peerInfo.NodeInfo.Moniker) + require.Equal(t, peer.IP.String(), peerInfo.RemoteIP, + "unexpected IP address for peer %v", peer.Name) + seen[peerInfo.NodeInfo.Moniker] = true + } + + for name := range seen { + require.True(t, seen[name], "node %v not peered with %v", node.Name, name) + } + }) +}