]> Cypherpunks repositories - gostls13.git/commitdiff
testing, testing/synctest: write bubble errors to parent test log
authorDamien Neil <dneil@google.com>
Wed, 28 May 2025 17:55:26 +0000 (10:55 -0700)
committerGopher Robot <gobot@golang.org>
Thu, 29 May 2025 19:46:41 +0000 (12:46 -0700)
Ensure that log messages written to the testing.T created by
synctest.Test appear in the test output when a test fails.

Fixes #73902

Change-Id: Ie97f5efe54eb003e6c0a5394c2def4cac1520ecb
Reviewed-on: https://go-review.googlesource.com/c/go/+/676995
Reviewed-by: Alan Donovan <adonovan@google.com>
Auto-Submit: Damien Neil <dneil@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>

src/testing/synctest/synctest_test.go
src/testing/testing.go

index 4897df999e29d228b06922ebc8b3384a6d1cf24f..822fd6fe1c72c42aa7458b63a403ccb99140c724 100644 (file)
@@ -22,37 +22,56 @@ func TestSuccess(t *testing.T) {
 }
 
 func TestFatal(t *testing.T) {
-       runTest(t, func() {
+       runTest(t, nil, func() {
                synctest.Test(t, func(t *testing.T) {
                        t.Fatal("fatal")
                })
-       }, `^=== RUN   TestFatal
+       }, `^--- FAIL: TestFatal.*
     synctest_test.go:.* fatal
---- FAIL: TestFatal.*
 FAIL
 $`)
 }
 
 func TestError(t *testing.T) {
-       runTest(t, func() {
+       runTest(t, nil, func() {
                synctest.Test(t, func(t *testing.T) {
                        t.Error("error")
                })
-       }, `^=== RUN   TestError
+       }, `^--- FAIL: TestError.*
     synctest_test.go:.* error
---- FAIL: TestError.*
+FAIL
+$`)
+}
+
+func TestVerboseError(t *testing.T) {
+       runTest(t, []string{"-test.v"}, func() {
+               synctest.Test(t, func(t *testing.T) {
+                       t.Error("error")
+               })
+       }, `^=== RUN   TestVerboseError
+    synctest_test.go:.* error
+--- FAIL: TestVerboseError.*
 FAIL
 $`)
 }
 
 func TestSkip(t *testing.T) {
-       runTest(t, func() {
+       runTest(t, nil, func() {
+               synctest.Test(t, func(t *testing.T) {
+                       t.Skip("skip")
+               })
+       }, `^PASS
+$`)
+}
+
+func TestVerboseSkip(t *testing.T) {
+       runTest(t, []string{"-test.v"}, func() {
                synctest.Test(t, func(t *testing.T) {
                        t.Skip("skip")
                })
-       }, `^=== RUN   TestSkip
+       }, `^=== RUN   TestVerboseSkip
     synctest_test.go:.* skip
---- PASS: TestSkip.*
+--- PASS: TestVerboseSkip.*
 PASS
 $`)
 }
@@ -131,7 +150,7 @@ func wantPanic(t *testing.T, want string) {
        }
 }
 
-func runTest(t *testing.T, f func(), pattern string) {
+func runTest(t *testing.T, args []string, f func(), pattern string) {
        if os.Getenv("GO_WANT_HELPER_PROCESS") == "1" {
                f()
                return
@@ -139,7 +158,8 @@ func runTest(t *testing.T, f func(), pattern string) {
        t.Helper()
        re := regexp.MustCompile(pattern)
        testenv.MustHaveExec(t)
-       cmd := testenv.Command(t, testenv.Executable(t), "-test.run=^"+t.Name()+"$", "-test.v", "-test.count=1")
+       cmd := testenv.Command(t, testenv.Executable(t), "-test.run=^"+regexp.QuoteMeta(t.Name())+"$", "-test.count=1")
+       cmd.Args = append(cmd.Args, args...)
        cmd = testenv.CleanCmdEnv(cmd)
        cmd.Env = append(cmd.Env, "GO_WANT_HELPER_PROCESS=1")
        out, _ := cmd.CombinedOutput()
index 85ac1aeb329e6c1c8b216fc4c508d751f31461c1..43ef9eef09b92555783cf6d5ea26cc6d61a267e3 100644 (file)
@@ -1045,7 +1045,7 @@ func (c *common) destination() *common {
        c.mu.Lock()
        defer c.mu.Unlock()
 
-       if !c.done {
+       if !c.done && !c.isSynctest {
                return c
        }
        for parent := c.parent; parent != nil; parent = parent.parent {
@@ -2037,7 +2037,6 @@ func testingSynctestTest(t *T, f func(*T)) {
                },
                tstate: t.tstate,
        }
-       t2.setOutputWriter()
 
        go tRunner(t2, f)
        if !<-t2.signal {