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.
166 lines
5.7 KiB
Go
166 lines
5.7 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 (
|
|
"crypto/rand"
|
|
"math/big"
|
|
"os"
|
|
"path/filepath"
|
|
"runtime"
|
|
"strconv"
|
|
"strings"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/ethereum/go-ethereum/params"
|
|
)
|
|
|
|
const (
|
|
ipcAPIs = "admin:1.0 debug:1.0 eth:1.0 ethash:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 shh:1.0 txpool:1.0 web3:1.0"
|
|
httpAPIs = "eth:1.0 net:1.0 rpc:1.0 web3:1.0"
|
|
)
|
|
|
|
// Tests that a node embedded within a console can be started up properly and
|
|
// then terminated by closing the input stream.
|
|
func TestConsoleWelcome(t *testing.T) {
|
|
coinbase := "0x8605cdbbdb6d264aa742e77020dcbc58fcdce182"
|
|
|
|
// Start a geth console, make sure it's cleaned up and terminate the console
|
|
geth := runGeth(t,
|
|
"--port", "0", "--maxpeers", "0", "--nodiscover", "--nat", "none",
|
|
"--etherbase", coinbase, "--shh",
|
|
"console")
|
|
|
|
// Gather all the infos the welcome message needs to contain
|
|
geth.SetTemplateFunc("goos", func() string { return runtime.GOOS })
|
|
geth.SetTemplateFunc("goarch", func() string { return runtime.GOARCH })
|
|
geth.SetTemplateFunc("gover", runtime.Version)
|
|
geth.SetTemplateFunc("gethver", func() string { return params.VersionWithCommit("", "") })
|
|
geth.SetTemplateFunc("niltime", func() string { return time.Unix(0, 0).Format(time.RFC1123) })
|
|
geth.SetTemplateFunc("apis", func() string { return ipcAPIs })
|
|
|
|
// Verify the actual welcome message to the required template
|
|
geth.Expect(`
|
|
Welcome to the Geth JavaScript console!
|
|
|
|
instance: Geth/v{{gethver}}/{{goos}}-{{goarch}}/{{gover}}
|
|
coinbase: {{.Etherbase}}
|
|
at block: 0 ({{niltime}})
|
|
datadir: {{.Datadir}}
|
|
modules: {{apis}}
|
|
|
|
> {{.InputLine "exit"}}
|
|
`)
|
|
geth.ExpectExit()
|
|
}
|
|
|
|
// Tests that a console can be attached to a running node via various means.
|
|
func TestIPCAttachWelcome(t *testing.T) {
|
|
// Configure the instance for IPC attachement
|
|
coinbase := "0x8605cdbbdb6d264aa742e77020dcbc58fcdce182"
|
|
var ipc string
|
|
if runtime.GOOS == "windows" {
|
|
ipc = `\\.\pipe\geth` + strconv.Itoa(trulyRandInt(100000, 999999))
|
|
} else {
|
|
ws := tmpdir(t)
|
|
defer os.RemoveAll(ws)
|
|
ipc = filepath.Join(ws, "geth.ipc")
|
|
}
|
|
// Note: we need --shh because testAttachWelcome checks for default
|
|
// list of ipc modules and shh is included there.
|
|
geth := runGeth(t,
|
|
"--port", "0", "--maxpeers", "0", "--nodiscover", "--nat", "none",
|
|
"--etherbase", coinbase, "--shh", "--ipcpath", ipc)
|
|
|
|
waitForEndpoint(t, ipc, 3*time.Second)
|
|
testAttachWelcome(t, geth, "ipc:"+ipc, ipcAPIs)
|
|
|
|
geth.Interrupt()
|
|
geth.ExpectExit()
|
|
}
|
|
|
|
func TestHTTPAttachWelcome(t *testing.T) {
|
|
coinbase := "0x8605cdbbdb6d264aa742e77020dcbc58fcdce182"
|
|
port := strconv.Itoa(trulyRandInt(1024, 65536)) // Yeah, sometimes this will fail, sorry :P
|
|
geth := runGeth(t,
|
|
"--port", "0", "--maxpeers", "0", "--nodiscover", "--nat", "none",
|
|
"--etherbase", coinbase, "--rpc", "--rpcport", port)
|
|
|
|
endpoint := "http://127.0.0.1:" + port
|
|
waitForEndpoint(t, endpoint, 3*time.Second)
|
|
testAttachWelcome(t, geth, endpoint, httpAPIs)
|
|
|
|
geth.Interrupt()
|
|
geth.ExpectExit()
|
|
}
|
|
|
|
func TestWSAttachWelcome(t *testing.T) {
|
|
coinbase := "0x8605cdbbdb6d264aa742e77020dcbc58fcdce182"
|
|
port := strconv.Itoa(trulyRandInt(1024, 65536)) // Yeah, sometimes this will fail, sorry :P
|
|
|
|
geth := runGeth(t,
|
|
"--port", "0", "--maxpeers", "0", "--nodiscover", "--nat", "none",
|
|
"--etherbase", coinbase, "--ws", "--wsport", port)
|
|
|
|
endpoint := "ws://127.0.0.1:" + port
|
|
waitForEndpoint(t, endpoint, 3*time.Second)
|
|
testAttachWelcome(t, geth, endpoint, httpAPIs)
|
|
|
|
geth.Interrupt()
|
|
geth.ExpectExit()
|
|
}
|
|
|
|
func testAttachWelcome(t *testing.T, geth *testgeth, endpoint, apis string) {
|
|
// Attach to a running geth note and terminate immediately
|
|
attach := runGeth(t, "attach", endpoint)
|
|
defer attach.ExpectExit()
|
|
attach.CloseStdin()
|
|
|
|
// Gather all the infos the welcome message needs to contain
|
|
attach.SetTemplateFunc("goos", func() string { return runtime.GOOS })
|
|
attach.SetTemplateFunc("goarch", func() string { return runtime.GOARCH })
|
|
attach.SetTemplateFunc("gover", runtime.Version)
|
|
attach.SetTemplateFunc("gethver", func() string { return params.VersionWithCommit("", "") })
|
|
attach.SetTemplateFunc("etherbase", func() string { return geth.Etherbase })
|
|
attach.SetTemplateFunc("niltime", func() string { return time.Unix(0, 0).Format(time.RFC1123) })
|
|
attach.SetTemplateFunc("ipc", func() bool { return strings.HasPrefix(endpoint, "ipc") })
|
|
attach.SetTemplateFunc("datadir", func() string { return geth.Datadir })
|
|
attach.SetTemplateFunc("apis", func() string { return apis })
|
|
|
|
// Verify the actual welcome message to the required template
|
|
attach.Expect(`
|
|
Welcome to the Geth JavaScript console!
|
|
|
|
instance: Geth/v{{gethver}}/{{goos}}-{{goarch}}/{{gover}}
|
|
coinbase: {{etherbase}}
|
|
at block: 0 ({{niltime}}){{if ipc}}
|
|
datadir: {{datadir}}{{end}}
|
|
modules: {{apis}}
|
|
|
|
> {{.InputLine "exit" }}
|
|
`)
|
|
attach.ExpectExit()
|
|
}
|
|
|
|
// trulyRandInt generates a crypto random integer used by the console tests to
|
|
// not clash network ports with other tests running cocurrently.
|
|
func trulyRandInt(lo, hi int) int {
|
|
num, _ := rand.Int(rand.Reader, big.NewInt(int64(hi-lo)))
|
|
return int(num.Int64()) + lo
|
|
}
|