Skip to content

Commit e4f223c

Browse files
committed
Add a test for testsource formatter
1 parent b6a2a74 commit e4f223c

7 files changed

+586
-6
lines changed

testjson/format_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ type fakeHandler struct {
2222
}
2323

2424
func (s *fakeHandler) Config(t *testing.T) ScanConfig {
25+
t.Helper()
2526
return ScanConfig{
2627
Stdout: bytes.NewReader(golden.Get(t, s.inputName+".out")),
2728
Stderr: bytes.NewReader(golden.Get(t, s.inputName+".err")),
@@ -76,7 +77,6 @@ func TestScanTestOutput_WithTestNameFormat(t *testing.T) {
7677
golden.Assert(t, shim.out.String(), "short-verbose-format.out")
7778
golden.Assert(t, shim.err.String(), "short-verbose-format.err")
7879
assert.DeepEqual(t, exec, expectedExecution, cmpExecutionShallow)
79-
t.Fail()
8080
}
8181

8282
var expectedExecution = &Execution{

testjson/testdata/go-test-json-v2.err

Whitespace-only changes.

testjson/testdata/go-test-json-v2.out

+331
Large diffs are not rendered by default.

testjson/testdata/testsource-format.err

Whitespace-only changes.
+211
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,211 @@
1+
PASS gotest.tools/gotestsum/testjson/internal/good.TestPassed (0.00s)
2+
PASS gotest.tools/gotestsum/testjson/internal/good.TestPassedWithLog (0.00s)
3+
PASS gotest.tools/gotestsum/testjson/internal/good.TestPassedWithStdout (0.00s)
4+
PASS gotest.tools/gotestsum/testjson/internal/good.TestWithStderr (0.00s)
5+
PASS gotest.tools/gotestsum/testjson/internal/good.TestNestedSuccess/a/sub (0.00s)
6+
PASS gotest.tools/gotestsum/testjson/internal/good.TestNestedSuccess/a (0.00s)
7+
PASS gotest.tools/gotestsum/testjson/internal/good.TestNestedSuccess/b/sub (0.00s)
8+
PASS gotest.tools/gotestsum/testjson/internal/good.TestNestedSuccess/b (0.00s)
9+
PASS gotest.tools/gotestsum/testjson/internal/good.TestNestedSuccess/c/sub (0.00s)
10+
PASS gotest.tools/gotestsum/testjson/internal/good.TestNestedSuccess/c (0.00s)
11+
PASS gotest.tools/gotestsum/testjson/internal/good.TestNestedSuccess/d/sub (0.00s)
12+
PASS gotest.tools/gotestsum/testjson/internal/good.TestNestedSuccess/d (0.00s)
13+
PASS gotest.tools/gotestsum/testjson/internal/good.TestNestedSuccess (0.00s)
14+
PASS gotest.tools/gotestsum/testjson/internal/good.TestParallelTheThird (0.00s)
15+
PASS gotest.tools/gotestsum/testjson/internal/good.TestParallelTheSecond (0.01s)
16+
PASS gotest.tools/gotestsum/testjson/internal/good.TestParallelTheFirst (0.01s)
17+
PASS gotest.tools/gotestsum/testjson/internal/good (cached)
18+
PASS gotest.tools/gotestsum/testjson/internal/withfails.TestPassed (0.00s)
19+
PASS gotest.tools/gotestsum/testjson/internal/withfails.TestPassedWithLog (0.00s)
20+
PASS gotest.tools/gotestsum/testjson/internal/withfails.TestPassedWithStdout (0.00s)
21+
22+
func TestFailed(t *testing.T) {
23+
t.Fatal("this failed")
24+
}
25+
=== RUN TestFailed
26+
fails_test.go:34: this failed
27+
--- FAIL: TestFailed (0.00s)
28+
FAIL gotest.tools/gotestsum/testjson/internal/withfails.TestFailed (0.00s)
29+
PASS gotest.tools/gotestsum/testjson/internal/withfails.TestWithStderr (0.00s)
30+
31+
func TestFailedWithStderr(t *testing.T) {
32+
fmt.Fprintln(os.Stderr, "this is stderr")
33+
t.Fatal("also failed")
34+
}
35+
=== RUN TestFailedWithStderr
36+
this is stderr
37+
fails_test.go:43: also failed
38+
--- FAIL: TestFailedWithStderr (0.00s)
39+
FAIL gotest.tools/gotestsum/testjson/internal/withfails.TestFailedWithStderr (0.00s)
40+
PASS gotest.tools/gotestsum/testjson/internal/withfails.TestNestedWithFailure/a/sub (0.00s)
41+
PASS gotest.tools/gotestsum/testjson/internal/withfails.TestNestedWithFailure/a (0.00s)
42+
PASS gotest.tools/gotestsum/testjson/internal/withfails.TestNestedWithFailure/b/sub (0.00s)
43+
PASS gotest.tools/gotestsum/testjson/internal/withfails.TestNestedWithFailure/b (0.00s)
44+
45+
func TestNestedWithFailure(t *testing.T) {
46+
for _, name := range []string{"a", "b", "c", "d"} {
47+
t.Run(name, func(t *testing.T) {
48+
if strings.HasSuffix(t.Name(), "c") {
49+
t.Fatal("failed")
50+
}
51+
t.Run("sub", func(t *testing.T) {})
52+
})
53+
}
54+
}
55+
=== RUN TestNestedWithFailure/c
56+
fails_test.go:65: failed
57+
--- FAIL: TestNestedWithFailure/c (0.00s)
58+
FAIL gotest.tools/gotestsum/testjson/internal/withfails.TestNestedWithFailure/c (0.00s)
59+
PASS gotest.tools/gotestsum/testjson/internal/withfails.TestNestedWithFailure/d/sub (0.00s)
60+
PASS gotest.tools/gotestsum/testjson/internal/withfails.TestNestedWithFailure/d (0.00s)
61+
62+
func TestNestedWithFailure(t *testing.T) {
63+
for _, name := range []string{"a", "b", "c", "d"} {
64+
t.Run(name, func(t *testing.T) {
65+
if strings.HasSuffix(t.Name(), "c") {
66+
t.Fatal("failed")
67+
}
68+
t.Run("sub", func(t *testing.T) {})
69+
})
70+
}
71+
}
72+
=== RUN TestNestedWithFailure
73+
--- FAIL: TestNestedWithFailure (0.00s)
74+
FAIL gotest.tools/gotestsum/testjson/internal/withfails.TestNestedWithFailure (0.00s)
75+
PASS gotest.tools/gotestsum/testjson/internal/withfails.TestNestedSuccess/a/sub (0.00s)
76+
PASS gotest.tools/gotestsum/testjson/internal/withfails.TestNestedSuccess/a (0.00s)
77+
PASS gotest.tools/gotestsum/testjson/internal/withfails.TestNestedSuccess/b/sub (0.00s)
78+
PASS gotest.tools/gotestsum/testjson/internal/withfails.TestNestedSuccess/b (0.00s)
79+
PASS gotest.tools/gotestsum/testjson/internal/withfails.TestNestedSuccess/c/sub (0.00s)
80+
PASS gotest.tools/gotestsum/testjson/internal/withfails.TestNestedSuccess/c (0.00s)
81+
PASS gotest.tools/gotestsum/testjson/internal/withfails.TestNestedSuccess/d/sub (0.00s)
82+
PASS gotest.tools/gotestsum/testjson/internal/withfails.TestNestedSuccess/d (0.00s)
83+
PASS gotest.tools/gotestsum/testjson/internal/withfails.TestNestedSuccess (0.00s)
84+
PASS gotest.tools/gotestsum/testjson/internal/withfails.TestParallelTheThird (0.00s)
85+
sometimes main can exit 2
86+
FAIL gotest.tools/gotestsum/testjson/internal/badmain
87+
PASS gotest.tools/gotestsum/testjson/internal/withfails.TestParallelTheSecond (0.01s)
88+
PASS gotest.tools/gotestsum/testjson/internal/withfails.TestParallelTheFirst (0.01s)
89+
FAIL gotest.tools/gotestsum/testjson/internal/withfails
90+
PASS gotest.tools/gotestsum/testjson/internal/parallelfails.TestPassed (0.00s)
91+
PASS gotest.tools/gotestsum/testjson/internal/parallelfails.TestPassedWithLog (0.00s)
92+
PASS gotest.tools/gotestsum/testjson/internal/parallelfails.TestPassedWithStdout (0.00s)
93+
PASS gotest.tools/gotestsum/testjson/internal/parallelfails.TestWithStderr (0.00s)
94+
95+
func TestNestedParallelFailures(t *testing.T) {
96+
for _, name := range []string{"a", "b", "c", "d"} {
97+
name := name
98+
t.Run(name, func(t *testing.T) {
99+
t.Parallel()
100+
t.Fatal("failed sub " + name)
101+
})
102+
}
103+
}
104+
=== RUN TestNestedParallelFailures/a
105+
=== PAUSE TestNestedParallelFailures/a
106+
=== CONT TestNestedParallelFailures/a
107+
fails_test.go:50: failed sub a
108+
--- FAIL: TestNestedParallelFailures/a (0.00s)
109+
FAIL gotest.tools/gotestsum/testjson/internal/parallelfails.TestNestedParallelFailures/a (0.00s)
110+
111+
func TestNestedParallelFailures(t *testing.T) {
112+
for _, name := range []string{"a", "b", "c", "d"} {
113+
name := name
114+
t.Run(name, func(t *testing.T) {
115+
t.Parallel()
116+
t.Fatal("failed sub " + name)
117+
})
118+
}
119+
}
120+
=== RUN TestNestedParallelFailures/d
121+
=== PAUSE TestNestedParallelFailures/d
122+
=== CONT TestNestedParallelFailures/d
123+
fails_test.go:50: failed sub d
124+
--- FAIL: TestNestedParallelFailures/d (0.00s)
125+
FAIL gotest.tools/gotestsum/testjson/internal/parallelfails.TestNestedParallelFailures/d (0.00s)
126+
127+
func TestNestedParallelFailures(t *testing.T) {
128+
for _, name := range []string{"a", "b", "c", "d"} {
129+
name := name
130+
t.Run(name, func(t *testing.T) {
131+
t.Parallel()
132+
t.Fatal("failed sub " + name)
133+
})
134+
}
135+
}
136+
=== RUN TestNestedParallelFailures/b
137+
=== PAUSE TestNestedParallelFailures/b
138+
=== CONT TestNestedParallelFailures/b
139+
fails_test.go:50: failed sub b
140+
--- FAIL: TestNestedParallelFailures/b (0.00s)
141+
FAIL gotest.tools/gotestsum/testjson/internal/parallelfails.TestNestedParallelFailures/b (0.00s)
142+
143+
func TestNestedParallelFailures(t *testing.T) {
144+
for _, name := range []string{"a", "b", "c", "d"} {
145+
name := name
146+
t.Run(name, func(t *testing.T) {
147+
t.Parallel()
148+
t.Fatal("failed sub " + name)
149+
})
150+
}
151+
}
152+
=== RUN TestNestedParallelFailures/c
153+
=== PAUSE TestNestedParallelFailures/c
154+
=== CONT TestNestedParallelFailures/c
155+
fails_test.go:50: failed sub c
156+
--- FAIL: TestNestedParallelFailures/c (0.00s)
157+
FAIL gotest.tools/gotestsum/testjson/internal/parallelfails.TestNestedParallelFailures/c (0.00s)
158+
159+
func TestNestedParallelFailures(t *testing.T) {
160+
for _, name := range []string{"a", "b", "c", "d"} {
161+
name := name
162+
t.Run(name, func(t *testing.T) {
163+
t.Parallel()
164+
t.Fatal("failed sub " + name)
165+
})
166+
}
167+
}
168+
=== RUN TestNestedParallelFailures
169+
--- FAIL: TestNestedParallelFailures (0.00s)
170+
FAIL gotest.tools/gotestsum/testjson/internal/parallelfails.TestNestedParallelFailures (0.00s)
171+
172+
func TestParallelTheThird(t *testing.T) {
173+
t.Parallel()
174+
time.Sleep(2 * time.Millisecond)
175+
t.Fatal("failed the third")
176+
177+
}
178+
=== RUN TestParallelTheThird
179+
=== PAUSE TestParallelTheThird
180+
=== CONT TestParallelTheThird
181+
=== CONT TestParallelTheThird
182+
fails_test.go:41: failed the third
183+
--- FAIL: TestParallelTheThird (0.00s)
184+
FAIL gotest.tools/gotestsum/testjson/internal/parallelfails.TestParallelTheThird (0.00s)
185+
186+
func TestParallelTheSecond(t *testing.T) {
187+
t.Parallel()
188+
time.Sleep(6 * time.Millisecond)
189+
t.Fatal("failed the second")
190+
}
191+
=== RUN TestParallelTheSecond
192+
=== PAUSE TestParallelTheSecond
193+
=== CONT TestParallelTheSecond
194+
=== CONT TestParallelTheSecond
195+
fails_test.go:35: failed the second
196+
--- FAIL: TestParallelTheSecond (0.01s)
197+
FAIL gotest.tools/gotestsum/testjson/internal/parallelfails.TestParallelTheSecond (0.01s)
198+
199+
func TestParallelTheFirst(t *testing.T) {
200+
t.Parallel()
201+
time.Sleep(10 * time.Millisecond)
202+
t.Fatal("failed the first")
203+
}
204+
=== RUN TestParallelTheFirst
205+
=== PAUSE TestParallelTheFirst
206+
=== CONT TestParallelTheFirst
207+
=== CONT TestParallelTheFirst
208+
fails_test.go:29: failed the first
209+
--- FAIL: TestParallelTheFirst (0.01s)
210+
FAIL gotest.tools/gotestsum/testjson/internal/parallelfails.TestParallelTheFirst (0.01s)
211+
FAIL gotest.tools/gotestsum/testjson/internal/parallelfails

testjson/testsourceformat.go

+20-5
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"go/printer"
77
"go/token"
88
"io"
9+
"os"
910
"strings"
1011

1112
"golang.org/x/tools/go/packages"
@@ -44,8 +45,12 @@ func (t *testSourceFormatter) write(v string) error {
4445
return err
4546
}
4647

48+
// TODO: test with source that is not gofmt formatted
4749
func (t *testSourceFormatter) writeSource(src pkgSource, event TestEvent) error {
48-
decl, ok := src.tests[event.Test]
50+
root, _ := SplitTestName(event.Test)
51+
// TODO: make it work with subtests
52+
53+
decl, ok := src.tests[root]
4954
if !ok {
5055
return fmt.Errorf("failed to locate source for %v", event.Test)
5156
}
@@ -62,16 +67,18 @@ func (t *testSourceFormatter) writeSource(src pkgSource, event TestEvent) error
6267
return t.write("\n")
6368
}
6469

65-
// TODO: test with external test package.
70+
// TODO: test with external test package
71+
// TODO: document how build tags need to be specified
6672
func (t *testSourceFormatter) loadSource(name string) (pkgSource, error) {
6773
src, ok := t.astCache[name]
6874
if ok {
6975
return src, nil
7076
}
7177
cfg := &packages.Config{
72-
Mode: modeAll(),
73-
Tests: true,
74-
Fset: token.NewFileSet(),
78+
Mode: modeAll(),
79+
Tests: true,
80+
Fset: token.NewFileSet(),
81+
BuildFlags: buildFlags(),
7582
}
7683
pkgs, err := packages.Load(cfg, name)
7784
if err != nil {
@@ -129,3 +136,11 @@ func modeAll() packages.LoadMode {
129136
mode = mode | packages.NeedSyntax | packages.NeedTypesInfo
130137
return mode
131138
}
139+
140+
func buildFlags() []string {
141+
flags := os.Getenv("GOFLAGS")
142+
if len(flags) == 0 {
143+
return nil
144+
}
145+
return strings.Split(os.Getenv("GOFLAGS"), " ")
146+
}

testjson/testsourceformat_test.go

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package testjson
2+
3+
import (
4+
"bytes"
5+
"testing"
6+
7+
"gotest.tools/v3/assert"
8+
"gotest.tools/v3/env"
9+
"gotest.tools/v3/golden"
10+
)
11+
12+
func TestTestSourceFormatter(t *testing.T) {
13+
defer patchPkgPathPrefix("github.com/gotestyourself/gotestyourself")()
14+
defer env.Patch(t, "GOFLAGS", "-tags=stubpkg")()
15+
16+
out := new(bytes.Buffer)
17+
shim := newFakeHandler(newTestSourceFormatter(out), "go-test-json-v2")
18+
_, err := ScanTestOutput(shim.Config(t))
19+
20+
assert.NilError(t, err)
21+
golden.Assert(t, out.String(), "testsource-format.out")
22+
golden.Assert(t, shim.err.String(), "testsource-format.err")
23+
}

0 commit comments

Comments
 (0)