17
17
package main
18
18
19
19
import (
20
+ "bufio"
20
21
"encoding/json"
21
- "errors"
22
22
"fmt"
23
23
"os"
24
24
@@ -34,7 +34,7 @@ import (
34
34
var stateTestCommand = & cli.Command {
35
35
Action : stateTestCmd ,
36
36
Name : "statetest" ,
37
- Usage : "executes the given state tests" ,
37
+ Usage : "Executes the given state tests. Filenames can be fed via standard input (batch mode) or as an argument (one-off execution). " ,
38
38
ArgsUsage : "<file>" ,
39
39
}
40
40
@@ -50,9 +50,6 @@ type StatetestResult struct {
50
50
}
51
51
52
52
func stateTestCmd (ctx * cli.Context ) error {
53
- if len (ctx .Args ().First ()) == 0 {
54
- return errors .New ("path-to-test argument required" )
55
- }
56
53
// Configure the go-ethereum logger
57
54
glogger := log .NewGlogHandler (log .StreamHandler (os .Stderr , log .TerminalFormat (false )))
58
55
glogger .Verbosity (log .Lvl (ctx .Int (VerbosityFlag .Name )))
@@ -65,34 +62,43 @@ func stateTestCmd(ctx *cli.Context) error {
65
62
DisableStorage : ctx .Bool (DisableStorageFlag .Name ),
66
63
EnableReturnData : ! ctx .Bool (DisableReturnDataFlag .Name ),
67
64
}
68
- var (
69
- tracer vm.EVMLogger
70
- debugger * logger.StructLogger
71
- )
65
+ var cfg vm.Config
72
66
switch {
73
67
case ctx .Bool (MachineFlag .Name ):
74
- tracer = logger .NewJSONLogger (config , os .Stderr )
68
+ cfg . Tracer = logger .NewJSONLogger (config , os .Stderr )
75
69
76
70
case ctx .Bool (DebugFlag .Name ):
77
- debugger = logger .NewStructLogger (config )
78
- tracer = debugger
79
-
80
- default :
81
- debugger = logger .NewStructLogger (config )
71
+ cfg .Tracer = logger .NewStructLogger (config )
82
72
}
83
73
// Load the test content from the input file
84
- src , err := os .ReadFile (ctx .Args ().First ())
74
+ if len (ctx .Args ().First ()) != 0 {
75
+ return runStateTest (ctx .Args ().First (), cfg , ctx .Bool (MachineFlag .Name ), ctx .Bool (DumpFlag .Name ))
76
+ }
77
+ // Read filenames from stdin and execute back-to-back
78
+ scanner := bufio .NewScanner (os .Stdin )
79
+ for scanner .Scan () {
80
+ fname := scanner .Text ()
81
+ if len (fname ) == 0 {
82
+ return nil
83
+ }
84
+ if err := runStateTest (fname , cfg , ctx .Bool (MachineFlag .Name ), ctx .Bool (DumpFlag .Name )); err != nil {
85
+ return err
86
+ }
87
+ }
88
+ return nil
89
+ }
90
+
91
+ // runStateTest loads the state-test given by fname, and executes the test.
92
+ func runStateTest (fname string , cfg vm.Config , jsonOut , dump bool ) error {
93
+ src , err := os .ReadFile (fname )
85
94
if err != nil {
86
95
return err
87
96
}
88
97
var tests map [string ]tests.StateTest
89
- if err = json .Unmarshal (src , & tests ); err != nil {
98
+ if err : = json .Unmarshal (src , & tests ); err != nil {
90
99
return err
91
100
}
92
101
// Iterate over all the tests, run them and aggregate the results
93
- cfg := vm.Config {
94
- Tracer : tracer ,
95
- }
96
102
results := make ([]StatetestResult , 0 , len (tests ))
97
103
for key , test := range tests {
98
104
for _ , st := range test .Subtests () {
@@ -103,28 +109,20 @@ func stateTestCmd(ctx *cli.Context) error {
103
109
if s != nil {
104
110
root := s .IntermediateRoot (false )
105
111
result .Root = & root
106
- if ctx . Bool ( MachineFlag . Name ) {
112
+ if jsonOut {
107
113
fmt .Fprintf (os .Stderr , "{\" stateRoot\" : \" %#x\" }\n " , root )
108
114
}
109
115
}
110
116
if err != nil {
111
117
// Test failed, mark as so and dump any state to aid debugging
112
118
result .Pass , result .Error = false , err .Error ()
113
- if ctx . Bool ( DumpFlag . Name ) && s != nil {
119
+ if dump && s != nil {
114
120
dump := s .RawDump (nil )
115
121
result .State = & dump
116
122
}
117
123
}
118
124
119
125
results = append (results , * result )
120
-
121
- // Print any structured logs collected
122
- if ctx .Bool (DebugFlag .Name ) {
123
- if debugger != nil {
124
- fmt .Fprintln (os .Stderr , "#### TRACE ####" )
125
- logger .WriteTrace (os .Stderr , debugger .StructLogs ())
126
- }
127
- }
128
126
}
129
127
}
130
128
out , _ := json .MarshalIndent (results , "" , " " )
0 commit comments