Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
whqwjb
go-ethereum
提交
89ba380b
G
go-ethereum
项目概览
whqwjb
/
go-ethereum
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
G
go-ethereum
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
89ba380b
编写于
6月 03, 2016
作者:
F
Felix Lange
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #2656 from fjl/console-test
cmd/geth: make console tests more robust
上级
16a23ff7
b57b6e34
变更
3
显示空白变更内容
内联
并排
Showing
3 changed file
with
45 addition
and
35 deletion
+45
-35
cmd/geth/consolecmd_test.go
cmd/geth/consolecmd_test.go
+28
-18
console/console.go
console/console.go
+8
-10
internal/jsre/jsre.go
internal/jsre/jsre.go
+9
-7
未找到文件。
cmd/geth/consolecmd_test.go
浏览文件 @
89ba380b
...
...
@@ -27,7 +27,6 @@ import (
"testing"
"time"
"github.com/ethereum/go-ethereum/console"
"github.com/ethereum/go-ethereum/rpc"
)
...
...
@@ -37,9 +36,10 @@ func TestConsoleWelcome(t *testing.T) {
coinbase
:=
"0x8605cdbbdb6d264aa742e77020dcbc58fcdce182"
// Start a geth console, make sure it's cleaned up and terminate the console
geth
:=
runGeth
(
t
,
"--nat"
,
"none"
,
"--nodiscover"
,
"--etherbase"
,
coinbase
,
"-shh"
,
"console"
)
defer
geth
.
expectExit
()
geth
.
stdin
.
Close
()
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
})
...
...
@@ -51,7 +51,6 @@ func TestConsoleWelcome(t *testing.T) {
sort
.
Strings
(
apis
)
return
apis
})
geth
.
setTemplateFunc
(
"prompt"
,
func
()
string
{
return
console
.
DefaultPrompt
})
// Verify the actual welcome message to the required template
geth
.
expect
(
`
...
...
@@ -63,52 +62,63 @@ at block: 0 ({{niltime}})
datadir: {{.Datadir}}
modules:{{range apis}} {{.}}:1.0{{end}}
{{prompt
}}
> {{.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
(
rand
.
Int
())
}
else
{
ws
:=
tmpdir
(
t
)
defer
os
.
RemoveAll
(
ws
)
ipc
=
filepath
.
Join
(
ws
,
"geth.ipc"
)
}
// Run the parent geth and attach with a child console
geth
:=
runGeth
(
t
,
"--nat"
,
"none"
,
"--nodiscover"
,
"--etherbase"
,
coinbase
,
"-shh"
,
"--ipcpath"
,
ipc
)
defer
geth
.
interrupt
()
// 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
)
time
.
Sleep
(
2
*
time
.
Second
)
// Simple way to wait for the RPC endpoint to open
testAttachWelcome
(
t
,
geth
,
"ipc:"
+
ipc
)
geth
.
interrupt
()
geth
.
expectExit
()
}
func
TestHTTPAttachWelcome
(
t
*
testing
.
T
)
{
coinbase
:=
"0x8605cdbbdb6d264aa742e77020dcbc58fcdce182"
port
:=
strconv
.
Itoa
(
rand
.
Intn
(
65535
-
1024
)
+
1024
)
// Yeah, sometimes this will fail, sorry :P
geth
:=
runGeth
(
t
,
"--nat"
,
"none"
,
"--nodiscover"
,
"--etherbase"
,
coinbase
,
"--rpc"
,
"--rpcport"
,
port
)
defer
geth
.
interrupt
(
)
geth
:=
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
,
geth
,
"http://localhost:"
+
port
)
geth
.
interrupt
()
geth
.
expectExit
()
}
func
TestWSAttachWelcome
(
t
*
testing
.
T
)
{
coinbase
:=
"0x8605cdbbdb6d264aa742e77020dcbc58fcdce182"
port
:=
strconv
.
Itoa
(
rand
.
Intn
(
65535
-
1024
)
+
1024
)
// Yeah, sometimes this will fail, sorry :P
geth
:=
runGeth
(
t
,
"--nat"
,
"none"
,
"--nodiscover"
,
"--etherbase"
,
coinbase
,
"--ws"
,
"--wsport"
,
port
)
defer
geth
.
interrupt
()
geth
:=
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
,
geth
,
"ws://localhost:"
+
port
)
geth
.
interrupt
()
geth
.
expectExit
()
}
func
testAttachWelcome
(
t
*
testing
.
T
,
geth
*
testgeth
,
endpoint
string
)
{
...
...
@@ -135,7 +145,6 @@ func testAttachWelcome(t *testing.T, geth *testgeth, endpoint string) {
sort
.
Strings
(
apis
)
return
apis
})
attach
.
setTemplateFunc
(
"prompt"
,
func
()
string
{
return
console
.
DefaultPrompt
})
// Verify the actual welcome message to the required template
attach
.
expect
(
`
...
...
@@ -147,6 +156,7 @@ at block: 0 ({{niltime}}){{if ipc}}
datadir: {{datadir}}{{end}}
modules:{{range apis}} {{.}}:1.0{{end}}
{{prompt
}}
> {{.InputLine "exit"
}}
`
)
attach
.
expectExit
()
}
console/console.go
浏览文件 @
89ba380b
...
...
@@ -244,14 +244,12 @@ func (c *Console) AutoCompleteInput(line string, pos int) (string, []string, str
// console's available modules.
func
(
c
*
Console
)
Welcome
()
{
// Print some generic Geth metadata
fmt
.
Fprintf
(
c
.
printer
,
"Welcome to the Geth JavaScript console!
\n\n
"
)
c
.
jsre
.
Run
(
`
(function () {
console.log("Welcome to the Geth JavaScript console!\n");
console.log("instance: " + web3.version.node);
console.log("coinbase: " + eth.coinbase);
console.log("at block: " + eth.blockNumber + " (" + new Date(1000 * eth.getBlock(eth.blockNumber).timestamp) + ")");
console.log(" datadir: " + admin.datadir);
})();
`
)
// List all the supported modules for the user to call
if
apis
,
err
:=
c
.
client
.
SupportedModules
();
err
==
nil
{
...
...
@@ -260,9 +258,9 @@ func (c *Console) Welcome() {
modules
=
append
(
modules
,
fmt
.
Sprintf
(
"%s:%s"
,
api
,
version
))
}
sort
.
Strings
(
modules
)
c
.
jsre
.
Run
(
"(function () { console.log(' modules: "
+
strings
.
Join
(
modules
,
" "
)
+
"'); })();"
)
fmt
.
Fprintln
(
c
.
printer
,
" modules:"
,
strings
.
Join
(
modules
,
" "
)
)
}
c
.
jsre
.
Run
(
"(function () { console.log(); })();"
)
fmt
.
Fprintln
(
c
.
printer
)
}
// Evaluate executes code and pretty prints the result to the specified output
...
...
internal/jsre/jsre.go
浏览文件 @
89ba380b
...
...
@@ -24,7 +24,6 @@ import (
"io"
"io/ioutil"
"math/rand"
"sync"
"time"
"github.com/ethereum/go-ethereum/common"
...
...
@@ -44,7 +43,7 @@ type JSRE struct {
output
io
.
Writer
evalQueue
chan
*
evalReq
stopEventLoop
chan
bool
loopWg
sync
.
WaitGroup
closed
chan
struct
{}
}
// jsTimer is a single timer instance with a callback function
...
...
@@ -66,10 +65,10 @@ func New(assetPath string, output io.Writer) *JSRE {
re
:=
&
JSRE
{
assetPath
:
assetPath
,
output
:
output
,
closed
:
make
(
chan
struct
{}),
evalQueue
:
make
(
chan
*
evalReq
),
stopEventLoop
:
make
(
chan
bool
),
}
re
.
loopWg
.
Add
(
1
)
go
re
.
runEventLoop
()
re
.
Set
(
"loadScript"
,
re
.
loadScript
)
re
.
Set
(
"inspect"
,
prettyPrintJS
)
...
...
@@ -98,6 +97,8 @@ func randomSource() *rand.Rand {
// functions should be used if and only if running a routine that was already
// called from JS through an RPC call.
func
(
self
*
JSRE
)
runEventLoop
()
{
defer
close
(
self
.
closed
)
vm
:=
otto
.
New
()
r
:=
randomSource
()
vm
.
SetRandomSource
(
r
.
Float64
)
...
...
@@ -213,8 +214,6 @@ loop:
timer
.
timer
.
Stop
()
delete
(
registry
,
timer
)
}
self
.
loopWg
.
Done
()
}
// Do executes the given function on the JS event loop.
...
...
@@ -227,8 +226,11 @@ func (self *JSRE) Do(fn func(*otto.Otto)) {
// stops the event loop before exit, optionally waits for all timers to expire
func
(
self
*
JSRE
)
Stop
(
waitForCallbacks
bool
)
{
self
.
stopEventLoop
<-
waitForCallbacks
self
.
loopWg
.
Wait
()
select
{
case
<-
self
.
closed
:
case
self
.
stopEventLoop
<-
waitForCallbacks
:
<-
self
.
closed
}
}
// Exec(file) loads and runs the contents of a file
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录