Skip to content

Commit 4371dba

Browse files
metatesting: forward stderr logs for races
Make sure stderr logs show up to help debug races (or other problems that are printed to stderr.) Prefix all log lines to distinguish logs from the metatesting binary. Test that logs show up when there is a problem and otherwise are quiet.
1 parent 00516d7 commit 4371dba

File tree

3 files changed

+83
-17
lines changed

3 files changed

+83
-17
lines changed

gosimruntime/testmain.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package gosimruntime
33
import (
44
"encoding/json"
55
"flag"
6+
"io"
67
"log"
78
"maps"
89
"os"
@@ -167,7 +168,7 @@ func TestMain(rt Runtime) {
167168
if !ok {
168169
SetAbortError(ErrTestFailed)
169170
}
170-
}, seed, enableTracer, captureLog, logLevelOverride, makeConsoleLogger(os.Stderr), req.ExtraEnv)
171+
}, seed, enableTracer, captureLog, logLevelOverride, io.Discard, req.ExtraEnv)
171172

172173
metaResult := runResult{
173174
Seed: result.Seed,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
# metatest forwards logs
2+
3+
# normally we do not see prefixed forwarded logs
4+
exec go test -run=Ok -race -count=1 -v .
5+
stdout hello
6+
! stdout 'metatest binary'
7+
8+
# races do show up
9+
! exec go test -run=Bad -race -count=1 -v .
10+
stdout 'metatest binary: WARNING: DATA RACE'
11+
12+
-- race_meta_test.go --
13+
//go:build !sim
14+
package behavior_test
15+
16+
import (
17+
"testing"
18+
19+
"github.com/jellevandenhooff/gosim/metatesting"
20+
)
21+
22+
func TestOk(t *testing.T) {
23+
mt := metatesting.ForCurrentPackage(t)
24+
_, err := mt.Run(t, &metatesting.RunConfig{
25+
Test: "TestOk",
26+
Seed: 1,
27+
})
28+
if err != nil {
29+
t.Fatal(err)
30+
}
31+
}
32+
33+
func TestBad(t *testing.T) {
34+
mt := metatesting.ForCurrentPackage(t)
35+
res, err := mt.Run(t, &metatesting.RunConfig{
36+
Test: "TestBad",
37+
Seed: 1,
38+
})
39+
if err != nil {
40+
t.Fatal(err)
41+
}
42+
if res.Failed {
43+
t.Fatal(res.Err)
44+
}
45+
}
46+
47+
-- race_test.go --
48+
//go:build sim
49+
package behavior_test
50+
51+
import (
52+
"testing"
53+
)
54+
55+
func TestOk(t *testing.T) {
56+
t.Log("hello")
57+
}
58+
59+
func TestBad(t *testing.T) {
60+
// simple data race
61+
var x int
62+
done := make(chan struct{})
63+
go func() {
64+
x = 1
65+
close(done)
66+
}()
67+
x = 2
68+
<-done
69+
_ = x
70+
}

metatesting/metatest.go

+11-16
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"bytes"
55
"encoding/json"
66
"fmt"
7-
"io"
87
"log"
98
"log/slog"
109
"os"
@@ -54,10 +53,12 @@ type MetaT struct {
5453
r *json.Decoder
5554
}
5655

57-
/*
58-
type indenter struct{}
56+
type prefixer struct {
57+
out *os.File
58+
prefix string
59+
}
5960

60-
func (w indenter) Write(b []byte) (n int, err error) {
61+
func (w prefixer) Write(b []byte) (n int, err error) {
6162
n = len(b)
6263
for len(b) > 0 {
6364
end := bytes.IndexByte(b, '\n')
@@ -66,22 +67,16 @@ func (w indenter) Write(b []byte) (n int, err error) {
6667
} else {
6768
end++
6869
}
69-
// An indent of 4 spaces will neatly align the dashes with the status
70-
// indicator of the parent.
7170
line := b[:end]
72-
// if line[0] == marker {
73-
// w.c.output = append(w.c.output, marker)
74-
// line = line[1:]
75-
// }
76-
const indent = " "
77-
fmt.Fprintf(os.Stderr, "%s%s", indent, line)
78-
// w.c.output = append(w.c.output, indent...)
79-
// w.c.output = append(w.c.output, line...)
71+
w.out.WriteString(w.prefix)
72+
w.out.Write(line)
73+
if line[len(line)-1] != '\n' {
74+
w.out.WriteString("\n")
75+
}
8076
b = b[end:]
8177
}
8278
return
8379
}
84-
*/
8580

8681
func newRunner(path string) (*MetaT, error) {
8782
cmd := exec.Command(path, "-metatest")
@@ -96,7 +91,7 @@ func newRunner(path string) (*MetaT, error) {
9691

9792
// TODO: Do not discard, and disable the formatted output print in gosimruntime instead
9893
// TODO: Prefix output to help identify stray logging?
99-
cmd.Stderr = io.Discard // os.Stderr
94+
cmd.Stderr = &prefixer{out: os.Stderr, prefix: "metatest binary: "}
10095

10196
if err := cmd.Start(); err != nil {
10297
return nil, err

0 commit comments

Comments
 (0)