diff options
author | Joe Tsai <thebrokentoaster@gmail.com> | 2016-12-08 07:13:50 +0000 |
---|---|---|
committer | Brad Fitzpatrick <bradfitz@golang.org> | 2016-12-09 04:04:11 +0000 |
commit | 4bf7d1e722e852f4a28d1898cbe5d0a0d505763b (patch) | |
tree | 02cc41940ec538b2990fce2411f118153cf2b8c2 /src/testing | |
parent | e12ce1e4005fcefd7a3537c433e6a60044160086 (diff) | |
download | go-git-4bf7d1e722e852f4a28d1898cbe5d0a0d505763b.tar.gz |
Revert "testing: add T.Context method"
This reverts commit 26827bc2fe4c80dc68b3793631d24975425c9467.
Fixes #18199
Change-Id: I42e292cb4e3d740a4fbb5d0380c6ee15ac742092
Reviewed-on: https://go-review.googlesource.com/34141
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Diffstat (limited to 'src/testing')
-rw-r--r-- | src/testing/benchmark.go | 4 | ||||
-rw-r--r-- | src/testing/sub_test.go | 51 | ||||
-rw-r--r-- | src/testing/testing.go | 35 | ||||
-rw-r--r-- | src/testing/testing_test.go | 38 |
4 files changed, 33 insertions, 95 deletions
diff --git a/src/testing/benchmark.go b/src/testing/benchmark.go index b1c6d2eff0..c033ce5fec 100644 --- a/src/testing/benchmark.go +++ b/src/testing/benchmark.go @@ -5,7 +5,6 @@ package testing import ( - "context" "flag" "fmt" "internal/race" @@ -128,9 +127,6 @@ func (b *B) nsPerOp() int64 { // runN runs a single benchmark for the specified number of iterations. func (b *B) runN(n int) { - b.ctx, b.cancel = context.WithCancel(b.parentContext()) - defer b.cancel() - benchmarkLock.Lock() defer benchmarkLock.Unlock() // Try to get a comparable environment for each run diff --git a/src/testing/sub_test.go b/src/testing/sub_test.go index 563e8656c6..2a24aaacfd 100644 --- a/src/testing/sub_test.go +++ b/src/testing/sub_test.go @@ -6,7 +6,6 @@ package testing import ( "bytes" - "context" "regexp" "strings" "sync/atomic" @@ -278,33 +277,28 @@ func TestTRun(t *T) { ok: true, maxPar: 4, f: func(t *T) { - // t.Parallel doesn't work in the pseudo-T we start with: - // it leaks a goroutine. - // Call t.Run to get a real one. - t.Run("X", func(t *T) { - t.Parallel() - for i := 0; i < 12; i++ { - t.Run("a", func(t *T) { - t.Parallel() - time.Sleep(time.Nanosecond) - for i := 0; i < 12; i++ { - t.Run("b", func(t *T) { - time.Sleep(time.Nanosecond) - for i := 0; i < 12; i++ { - t.Run("c", func(t *T) { - t.Parallel() - time.Sleep(time.Nanosecond) - t.Run("d1", func(t *T) {}) - t.Run("d2", func(t *T) {}) - t.Run("d3", func(t *T) {}) - t.Run("d4", func(t *T) {}) - }) - } - }) - } - }) - } - }) + t.Parallel() + for i := 0; i < 12; i++ { + t.Run("a", func(t *T) { + t.Parallel() + time.Sleep(time.Nanosecond) + for i := 0; i < 12; i++ { + t.Run("b", func(t *T) { + time.Sleep(time.Nanosecond) + for i := 0; i < 12; i++ { + t.Run("c", func(t *T) { + t.Parallel() + time.Sleep(time.Nanosecond) + t.Run("d1", func(t *T) {}) + t.Run("d2", func(t *T) {}) + t.Run("d3", func(t *T) {}) + t.Run("d4", func(t *T) {}) + }) + } + }) + } + }) + } }, }, { desc: "skip output", @@ -347,7 +341,6 @@ func TestTRun(t *T) { }, context: ctx, } - root.ctx, root.cancel = context.WithCancel(context.Background()) ok := root.Run(tc.desc, tc.f) ctx.release() diff --git a/src/testing/testing.go b/src/testing/testing.go index f08c5c6b8e..8fb6d8373e 100644 --- a/src/testing/testing.go +++ b/src/testing/testing.go @@ -204,7 +204,6 @@ package testing import ( "bytes" - "context" "errors" "flag" "fmt" @@ -262,14 +261,12 @@ type common struct { mu sync.RWMutex // guards output, failed, and done. output []byte // Output generated by test or benchmark. w io.Writer // For flushToParent. - ctx context.Context - cancel context.CancelFunc - chatty bool // A copy of the chatty flag. - ran bool // Test or benchmark (or one of its subtests) was executed. - failed bool // Test or benchmark has failed. - skipped bool // Test of benchmark has been skipped. - finished bool // Test function has completed. - done bool // Test is finished and all subtests have completed. + chatty bool // A copy of the chatty flag. + ran bool // Test or benchmark (or one of its subtests) was executed. + failed bool // Test or benchmark has failed. + skipped bool // Test of benchmark has been skipped. + finished bool // Test function has completed. + done bool // Test is finished and all subtests have completed. hasSub bool raceErrors int // number of races detected during test @@ -283,13 +280,6 @@ type common struct { sub []*T // Queue of subtests to be run in parallel. } -func (c *common) parentContext() context.Context { - if c == nil || c.parent == nil || c.parent.ctx == nil { - return context.Background() - } - return c.parent.ctx -} - // Short reports whether the -test.short flag is set. func Short() bool { return *short @@ -386,7 +376,6 @@ func fmtDuration(d time.Duration) string { // TB is the interface common to T and B. type TB interface { - Context() context.Context Error(args ...interface{}) Errorf(format string, args ...interface{}) Fail() @@ -434,15 +423,6 @@ func (c *common) Name() string { return c.name } -// Context returns the context for the current test or benchmark. -// The context is cancelled when the test or benchmark finishes. -// A goroutine started during a test or benchmark can wait for the -// context's Done channel to become readable as a signal that the -// test or benchmark is over, so that the goroutine can exit. -func (c *common) Context() context.Context { - return c.ctx -} - func (c *common) setRan() { if c.parent != nil { c.parent.setRan() @@ -619,9 +599,6 @@ type InternalTest struct { } func tRunner(t *T, fn func(t *T)) { - t.ctx, t.cancel = context.WithCancel(t.parentContext()) - defer t.cancel() - // When this goroutine is done, either because fn(t) // returned normally or because a test failure triggered // a call to runtime.Goexit, record the duration and send diff --git a/src/testing/testing_test.go b/src/testing/testing_test.go index 9954f9af8c..45e44683b4 100644 --- a/src/testing/testing_test.go +++ b/src/testing/testing_test.go @@ -5,42 +5,14 @@ package testing_test import ( - "fmt" "os" - "runtime" "testing" - "time" ) -func TestMain(m *testing.M) { - g0 := runtime.NumGoroutine() - - code := m.Run() - if code != 0 { - os.Exit(code) - } +// This is exactly what a test would do without a TestMain. +// It's here only so that there is at least one package in the +// standard library with a TestMain, so that code is executed. - // Check that there are no goroutines left behind. - t0 := time.Now() - stacks := make([]byte, 1<<20) - for { - g1 := runtime.NumGoroutine() - if g1 == g0 { - return - } - stacks = stacks[:runtime.Stack(stacks, true)] - time.Sleep(50 * time.Millisecond) - if time.Since(t0) > 2*time.Second { - fmt.Fprintf(os.Stderr, "Unexpected leftover goroutines detected: %v -> %v\n%s\n", g0, g1, stacks) - os.Exit(1) - } - } -} - -func TestContextCancel(t *testing.T) { - ctx := t.Context() - // Tests we don't leak this goroutine: - go func() { - <-ctx.Done() - }() +func TestMain(m *testing.M) { + os.Exit(m.Run()) } |