aboutsummaryrefslogtreecommitdiff
path: root/src/testing/testing.go
diff options
context:
space:
mode:
authorNobuki Fujii <scofni@gmail.com>2022-09-18 11:52:07 +0900
committerGopher Robot <gobot@golang.org>2022-09-28 17:18:17 +0000
commitd6ca24477afa85a3ab559935faa4fed917911e4f (patch)
tree0e988ed0c2132fcb1fb47fed3150863090c08996 /src/testing/testing.go
parent7f7f27f992850a06551c2798a3b874f5d5356ae9 (diff)
downloadgo-d6ca24477afa85a3ab559935faa4fed917911e4f.tar.xz
testing: fail if T.Setenv is called via T.Run in a parallel test
The existing implementation can call to T.Setenv in T.Run even after calling to T.Parallel, so I changed it to cause a panic in that case. Fixes #55128 Change-Id: Ib89d998ff56f00f96a5ca218af071bd35fdae53a Reviewed-on: https://go-review.googlesource.com/c/go/+/431101 Run-TryBot: Bryan Mills <bcmills@google.com> Reviewed-by: Ian Lance Taylor <iant@google.com> Reviewed-by: Bryan Mills <bcmills@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Auto-Submit: Bryan Mills <bcmills@google.com>
Diffstat (limited to 'src/testing/testing.go')
-rw-r--r--src/testing/testing.go20
1 files changed, 16 insertions, 4 deletions
diff --git a/src/testing/testing.go b/src/testing/testing.go
index 7e86faf950..b64286c005 100644
--- a/src/testing/testing.go
+++ b/src/testing/testing.go
@@ -547,6 +547,7 @@ type common struct {
hasSub atomic.Bool // whether there are sub-benchmarks.
raceErrors int // Number of races detected during test.
runner string // Function name of tRunner running the test.
+ isParallel bool // Whether the test is parallel.
parent *common
level int // Nesting depth of test or benchmark.
@@ -823,9 +824,8 @@ var _ TB = (*B)(nil)
// may be called simultaneously from multiple goroutines.
type T struct {
common
- isParallel bool
- isEnvSet bool
- context *testContext // For running tests and subtests.
+ isEnvSet bool
+ context *testContext // For running tests and subtests.
}
func (c *common) private() {}
@@ -1326,7 +1326,19 @@ func (t *T) Parallel() {
//
// This cannot be used in parallel tests.
func (t *T) Setenv(key, value string) {
- if t.isParallel {
+ // Non-parallel subtests that have parallel ancestors may still
+ // run in parallel with other tests: they are only non-parallel
+ // with respect to the other subtests of the same parent.
+ // Since SetEnv affects the whole process, we need to disallow it
+ // if the current test or any parent is parallel.
+ isParallel := false
+ for c := &t.common; c != nil; c = c.parent {
+ if c.isParallel {
+ isParallel = true
+ break
+ }
+ }
+ if isParallel {
panic("testing: t.Setenv called after t.Parallel; cannot set environment variables in parallel tests")
}