39b0b1a1a6
Most of these changes are related to the Go 1.13 changes to test binary flag handling. * cmd/geth: make attach tests more reliable This makes the test wait for the endpoint to come up by polling it instead of waiting for two seconds. * tests: fix test binary flags for Go 1.13 Calling flag.Parse during package initialization is prohibited as of Go 1.13 and causes test failures. Call it in TestMain instead. * crypto/ecies: remove useless -dump flag in tests * p2p/simulations: fix test binary flags for Go 1.13 Calling flag.Parse during package initialization is prohibited as of Go 1.13 and causes test failures. Call it in TestMain instead. * build: remove workaround for ./... vendor matching This workaround was necessary for Go 1.8. The Go 1.9 release changed the expansion rules to exclude vendored packages. * Makefile: use relative path for GOBIN This makes the "Run ./build/bin/..." line look nicer. * les: fix test binary flags for Go 1.13 Calling flag.Parse during package initialization is prohibited as of Go 1.13 and causes test failures. Call it in TestMain instead.
127 lines
3.0 KiB
Go
127 lines
3.0 KiB
Go
// Copyright 2016 The go-ethereum Authors
|
|
// This file is part of go-ethereum.
|
|
//
|
|
// go-ethereum is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
//
|
|
// go-ethereum is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with go-ethereum. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
package main
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"io/ioutil"
|
|
"os"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/docker/docker/pkg/reexec"
|
|
"github.com/ethereum/go-ethereum/internal/cmdtest"
|
|
"github.com/ethereum/go-ethereum/rpc"
|
|
)
|
|
|
|
func tmpdir(t *testing.T) string {
|
|
dir, err := ioutil.TempDir("", "geth-test")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
return dir
|
|
}
|
|
|
|
type testgeth struct {
|
|
*cmdtest.TestCmd
|
|
|
|
// template variables for expect
|
|
Datadir string
|
|
Etherbase string
|
|
}
|
|
|
|
func init() {
|
|
// Run the app if we've been exec'd as "geth-test" in runGeth.
|
|
reexec.Register("geth-test", func() {
|
|
if err := app.Run(os.Args); err != nil {
|
|
fmt.Fprintln(os.Stderr, err)
|
|
os.Exit(1)
|
|
}
|
|
os.Exit(0)
|
|
})
|
|
}
|
|
|
|
func TestMain(m *testing.M) {
|
|
// check if we have been reexec'd
|
|
if reexec.Init() {
|
|
return
|
|
}
|
|
os.Exit(m.Run())
|
|
}
|
|
|
|
// spawns geth with the given command line args. If the args don't set --datadir, the
|
|
// child g gets a temporary data directory.
|
|
func runGeth(t *testing.T, args ...string) *testgeth {
|
|
tt := &testgeth{}
|
|
tt.TestCmd = cmdtest.NewTestCmd(t, tt)
|
|
for i, arg := range args {
|
|
switch {
|
|
case arg == "-datadir" || arg == "--datadir":
|
|
if i < len(args)-1 {
|
|
tt.Datadir = args[i+1]
|
|
}
|
|
case arg == "-etherbase" || arg == "--etherbase":
|
|
if i < len(args)-1 {
|
|
tt.Etherbase = args[i+1]
|
|
}
|
|
}
|
|
}
|
|
if tt.Datadir == "" {
|
|
tt.Datadir = tmpdir(t)
|
|
tt.Cleanup = func() { os.RemoveAll(tt.Datadir) }
|
|
args = append([]string{"-datadir", tt.Datadir}, args...)
|
|
// Remove the temporary datadir if something fails below.
|
|
defer func() {
|
|
if t.Failed() {
|
|
tt.Cleanup()
|
|
}
|
|
}()
|
|
}
|
|
|
|
// Boot "geth". This actually runs the test binary but the TestMain
|
|
// function will prevent any tests from running.
|
|
tt.Run("geth-test", args...)
|
|
|
|
return tt
|
|
}
|
|
|
|
// waitForEndpoint attempts to connect to an RPC endpoint until it succeeds.
|
|
func waitForEndpoint(t *testing.T, endpoint string, timeout time.Duration) {
|
|
probe := func() bool {
|
|
ctx, cancel := context.WithTimeout(context.Background(), timeout)
|
|
defer cancel()
|
|
c, err := rpc.DialContext(ctx, endpoint)
|
|
if c != nil {
|
|
_, err = c.SupportedModules()
|
|
c.Close()
|
|
}
|
|
return err == nil
|
|
}
|
|
|
|
start := time.Now()
|
|
for {
|
|
if probe() {
|
|
return
|
|
}
|
|
if time.Since(start) > timeout {
|
|
t.Fatal("endpoint", endpoint, "did not open within", timeout)
|
|
}
|
|
time.Sleep(200 * time.Millisecond)
|
|
}
|
|
}
|