aboutsummaryrefslogtreecommitdiff
path: root/src/testing
diff options
context:
space:
mode:
authorMarcel van Lohuizen <mpvl@golang.org>2016-03-18 19:11:19 +0100
committerMarcel van Lohuizen <mpvl@golang.org>2016-03-21 16:52:04 +0000
commit5fb6aa3e096bc61f5a602109ebdb8e3edb0f66ca (patch)
tree69dfd332cee34fae98e2b230324b0dbfe9c53492 /src/testing
parentbea2008b83424b9693c0e38940ffd53a5e1e80a3 (diff)
downloadgo-5fb6aa3e096bc61f5a602109ebdb8e3edb0f66ca.tar.xz
testing: add test for not exceeding maximum parallism
Fixed bug that slipped probably slipped in after rebasing and explain why it failed on nacl/netbsd/plan9, which set default maxparallelism to 1. Change-Id: I4d59682fb2843d138b320334189f53fcdda5b2f6 Reviewed-on: https://go-review.googlesource.com/20980 Run-TryBot: Russ Cox <rsc@golang.org> Reviewed-by: Russ Cox <rsc@golang.org>
Diffstat (limited to 'src/testing')
-rw-r--r--src/testing/sub_test.go51
-rw-r--r--src/testing/testing.go2
2 files changed, 52 insertions, 1 deletions
diff --git a/src/testing/sub_test.go b/src/testing/sub_test.go
index 6455540498..07f6785c13 100644
--- a/src/testing/sub_test.go
+++ b/src/testing/sub_test.go
@@ -179,6 +179,57 @@ func TestTRun(t *T) {
}
},
}, {
+ desc: "run no more than *parallel tests concurrently",
+ ok: true,
+ maxPar: 4,
+ f: func(t *T) {
+ max := 0
+ in := make(chan int)
+ out := make(chan int)
+ ctx := t.context
+ t.Run("wait", func(t *T) {
+ t.Run("controller", func(t *T) {
+ // Verify sequential tests don't skew counts.
+ t.Run("seq1", func(t *T) {})
+ t.Run("seq2", func(t *T) {})
+ t.Run("seq3", func(t *T) {})
+ t.Parallel()
+ for i := 0; i < 80; i++ {
+ ctx.mu.Lock()
+ if ctx.running > max {
+ max = ctx.running
+ }
+ ctx.mu.Unlock()
+ <-in
+ // force a minimum to avoid a race, although it works
+ // without it.
+ if i >= ctx.maxParallel-2 { // max - this - 1
+ out <- i
+ }
+ }
+ close(out)
+ })
+ // Ensure we don't exceed the maximum even with nested parallelism.
+ for i := 0; i < 2; i++ {
+ t.Run("", func(t *T) {
+ t.Parallel()
+ for j := 0; j < 40; j++ {
+ t.Run("", func(t *T) {
+ t.Run("seq1", func(t *T) {})
+ t.Run("seq2", func(t *T) {})
+ t.Parallel()
+ in <- j
+ <-out
+ })
+ }
+ })
+ }
+ })
+ if max != ctx.maxParallel {
+ realTest.Errorf("max: got %d; want: %d", max, ctx.maxParallel)
+ }
+ },
+ }, {
desc: "alternate sequential and parallel",
// Sequential tests should partake in the counting of running threads.
// Otherwise, if one runs parallel subtests in sequential tests that are
diff --git a/src/testing/testing.go b/src/testing/testing.go
index 0aa60d9ddc..03a7fbfddd 100644
--- a/src/testing/testing.go
+++ b/src/testing/testing.go
@@ -602,7 +602,7 @@ type testContext struct {
func newTestContext(maxParallel int) *testContext {
return &testContext{
startParallel: make(chan bool),
- maxParallel: *parallel,
+ maxParallel: maxParallel,
running: 1, // Set the count to 1 for the main (sequential) test.
}
}