aboutsummaryrefslogtreecommitdiffstats
path: root/cmd/gdex/consolecmd_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/gdex/consolecmd_test.go')
-rw-r--r--cmd/gdex/consolecmd_test.go163
1 files changed, 163 insertions, 0 deletions
diff --git a/cmd/gdex/consolecmd_test.go b/cmd/gdex/consolecmd_test.go
new file mode 100644
index 000000000..9a79dcd90
--- /dev/null
+++ b/cmd/gdex/consolecmd_test.go
@@ -0,0 +1,163 @@
+// 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/dexon-foundation/dexon/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 gdex console, make sure it's cleaned up and terminate the console
+ gdex := runGeth(t,
+ "--port", "0", "--maxpeers", "0", "--nodiscover", "--nat", "none",
+ "--etherbase", coinbase, "--shh",
+ "console")
+
+ // Gather all the infos the welcome message needs to contain
+ gdex.SetTemplateFunc("goos", func() string { return runtime.GOOS })
+ gdex.SetTemplateFunc("goarch", func() string { return runtime.GOARCH })
+ gdex.SetTemplateFunc("gover", runtime.Version)
+ gdex.SetTemplateFunc("gethver", func() string { return params.VersionWithMeta })
+ gdex.SetTemplateFunc("niltime", func() string { return time.Unix(0, 0).Format(time.RFC1123) })
+ gdex.SetTemplateFunc("apis", func() string { return ipcAPIs })
+
+ // Verify the actual welcome message to the required template
+ gdex.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"}}
+`)
+ gdex.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\gdex` + strconv.Itoa(trulyRandInt(100000, 999999))
+ } else {
+ ws := tmpdir(t)
+ defer os.RemoveAll(ws)
+ ipc = filepath.Join(ws, "gdex.ipc")
+ }
+ // Note: we need --shh because testAttachWelcome checks for default
+ // list of ipc modules and shh is included there.
+ gdex := runGeth(t,
+ "--port", "0", "--maxpeers", "0", "--nodiscover", "--nat", "none",
+ "--etherbase", coinbase, "--shh", "--ipcpath", ipc)
+
+ time.Sleep(2 * time.Second) // Simple way to wait for the RPC endpoint to open
+ testAttachWelcome(t, gdex, "ipc:"+ipc, ipcAPIs)
+
+ gdex.Interrupt()
+ gdex.ExpectExit()
+}
+
+func TestHTTPAttachWelcome(t *testing.T) {
+ coinbase := "0x8605cdbbdb6d264aa742e77020dcbc58fcdce182"
+ port := strconv.Itoa(trulyRandInt(1024, 65536)) // Yeah, sometimes this will fail, sorry :P
+ gdex := runGeth(t,
+ "--port", "0", "--maxpeers", "0", "--nodiscover", "--nat", "none",
+ "--etherbase", coinbase, "--rpc", "--rpcport", port)
+
+ time.Sleep(2 * time.Second) // Simple way to wait for the RPC endpoint to open
+ testAttachWelcome(t, gdex, "http://localhost:"+port, httpAPIs)
+
+ gdex.Interrupt()
+ gdex.ExpectExit()
+}
+
+func TestWSAttachWelcome(t *testing.T) {
+ coinbase := "0x8605cdbbdb6d264aa742e77020dcbc58fcdce182"
+ port := strconv.Itoa(trulyRandInt(1024, 65536)) // Yeah, sometimes this will fail, sorry :P
+
+ gdex := runGeth(t,
+ "--port", "0", "--maxpeers", "0", "--nodiscover", "--nat", "none",
+ "--etherbase", coinbase, "--ws", "--wsport", port)
+
+ time.Sleep(2 * time.Second) // Simple way to wait for the RPC endpoint to open
+ testAttachWelcome(t, gdex, "ws://localhost:"+port, httpAPIs)
+
+ gdex.Interrupt()
+ gdex.ExpectExit()
+}
+
+func testAttachWelcome(t *testing.T, gdex *testgdex, endpoint, apis string) {
+ // Attach to a running gdex 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.VersionWithMeta })
+ attach.SetTemplateFunc("etherbase", func() string { return gdex.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 gdex.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
+}