diff --git a/cmd/evm/blockrunner.go b/cmd/evm/blockrunner.go index f338af822e..e17183ab5e 100644 --- a/cmd/evm/blockrunner.go +++ b/cmd/evm/blockrunner.go @@ -42,6 +42,7 @@ var blockTestCommand = &cli.Command{ Flags: slices.Concat([]cli.Flag{ DumpFlag, HumanReadableFlag, + NDJSONFlag, RunFlag, WitnessCrossCheckFlag, FuzzFlag, diff --git a/cmd/evm/enginerunner.go b/cmd/evm/enginerunner.go index 67b28625c4..356d5a84bc 100644 --- a/cmd/evm/enginerunner.go +++ b/cmd/evm/enginerunner.go @@ -51,6 +51,7 @@ var engineTestCommand = &cli.Command{ Flags: slices.Concat([]cli.Flag{ DumpFlag, HumanReadableFlag, + NDJSONFlag, RunFlag, FuzzFlag, WorkersFlag, diff --git a/cmd/evm/main.go b/cmd/evm/main.go index e0f3feff93..f9c4dcd77d 100644 --- a/cmd/evm/main.go +++ b/cmd/evm/main.go @@ -75,6 +75,10 @@ var ( Name: "human", Usage: "\"Human-readable\" output", } + NDJSONFlag = &cli.BoolFlag{ + Name: "ndjson", + Usage: "Output one JSON result per line as tests complete (streaming)", + } StatDumpFlag = &cli.BoolFlag{ Name: "statdump", Usage: "displays stack and heap memory information", diff --git a/cmd/evm/reporter.go b/cmd/evm/reporter.go index d1e327932c..a69c2669bd 100644 --- a/cmd/evm/reporter.go +++ b/cmd/evm/reporter.go @@ -85,3 +85,9 @@ func report(ctx *cli.Context, results []testResult) { out, _ := json.MarshalIndent(results, "", " ") fmt.Println(string(out)) } + +// reportNDJSON prints one JSON object per result as it completes. +func reportNDJSON(r testResult) { + out, _ := json.Marshal(r) + fmt.Println(string(out)) +} diff --git a/cmd/evm/staterunner.go b/cmd/evm/staterunner.go index e30a61f014..c66b54d362 100644 --- a/cmd/evm/staterunner.go +++ b/cmd/evm/staterunner.go @@ -56,6 +56,7 @@ var stateTestCommand = &cli.Command{ DumpFlag, forkFlag, HumanReadableFlag, + NDJSONFlag, idxFlag, RunFlag, WorkersFlag, @@ -76,7 +77,9 @@ func stateTestCmd(ctx *cli.Context) error { if err != nil { return err } - report(ctx, results) + if !ctx.Bool(NDJSONFlag.Name) { + report(ctx, results) + } return nil } // Otherwise, read filenames from stdin and execute back-to-back. @@ -211,6 +214,9 @@ func runStateTest(ctx *cli.Context, fname string) ([]testResult, error) { return } }) + if ctx.Bool(NDJSONFlag.Name) { + reportNDJSON(*result) + } results = append(results, *result) } }