// 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 . package main import ( "crypto/rand" "math/big" "os" "path/filepath" "runtime" "strconv" "strings" "testing" "time" "github.com/tangerine-network/go-tangerine/params" ) const ( ipcAPIs = "admin:1.0 debug:1.0 eth: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 gtan console, make sure it's cleaned up and terminate the console gtan := runGeth(t, "--port", "0", "--maxpeers", "0", "--nodiscover", "--nat", "none", "--etherbase", coinbase, "--shh", "console") // Gather all the infos the welcome message needs to contain gtan.SetTemplateFunc("goos", func() string { return runtime.GOOS }) gtan.SetTemplateFunc("goarch", func() string { return runtime.GOARCH }) gtan.SetTemplateFunc("gover", runtime.Version) gtan.SetTemplateFunc("gethver", func() string { return params.VersionWithMeta }) gtan.SetTemplateFunc("dextime", func() string { return time.Unix(int64(params.MainnetChainConfig.DMoment), 0).Format(time.RFC1123) }) gtan.SetTemplateFunc("apis", func() string { return ipcAPIs }) // Verify the actual welcome message to the required template gtan.Expect(` Welcome to the Geth JavaScript console! instance: gtan/v{{gethver}}/{{goos}}-{{goarch}}/{{gover}} at block: 0 ({{dextime}}) datadir: {{.Datadir}} modules: {{apis}} > {{.InputLine "exit"}} `) gtan.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\gtan` + strconv.Itoa(trulyRandInt(100000, 999999)) } else { ws := tmpdir(t) defer os.RemoveAll(ws) ipc = filepath.Join(ws, "gtan.ipc") } // Note: we need --shh because testAttachWelcome checks for default // list of ipc modules and shh is included there. gtan := 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, gtan, "ipc:"+ipc, ipcAPIs) gtan.Interrupt() gtan.ExpectExit() } func TestHTTPAttachWelcome(t *testing.T) { coinbase := "0x8605cdbbdb6d264aa742e77020dcbc58fcdce182" port := strconv.Itoa(trulyRandInt(1024, 65536)) // Yeah, sometimes this will fail, sorry :P gtan := 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, gtan, "http://localhost:"+port, httpAPIs) gtan.Interrupt() gtan.ExpectExit() } func TestWSAttachWelcome(t *testing.T) { coinbase := "0x8605cdbbdb6d264aa742e77020dcbc58fcdce182" port := strconv.Itoa(trulyRandInt(1024, 65536)) // Yeah, sometimes this will fail, sorry :P gtan := 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, gtan, "ws://localhost:"+port, httpAPIs) gtan.Interrupt() gtan.ExpectExit() } func testAttachWelcome(t *testing.T, gtan *testgtan, endpoint, apis string) { // Attach to a running gtan 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 gtan.Etherbase }) attach.SetTemplateFunc("dextime", func() string { return time.Unix(int64(params.MainnetChainConfig.DMoment), 0).Format(time.RFC1123) }) attach.SetTemplateFunc("ipc", func() bool { return strings.HasPrefix(endpoint, "ipc") }) attach.SetTemplateFunc("datadir", func() string { return gtan.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: gtan/v{{gethver}}/{{goos}}-{{goarch}}/{{gover}} at block: 0 ({{dextime}}){{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 }