aboutsummaryrefslogtreecommitdiff
path: root/src/testing/testing_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/testing/testing_test.go')
-rw-r--r--src/testing/testing_test.go38
1 files changed, 33 insertions, 5 deletions
diff --git a/src/testing/testing_test.go b/src/testing/testing_test.go
index 45e44683b4..9954f9af8c 100644
--- a/src/testing/testing_test.go
+++ b/src/testing/testing_test.go
@@ -5,14 +5,42 @@
package testing_test
import (
+ "fmt"
"os"
+ "runtime"
"testing"
+ "time"
)
-// 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.
-
func TestMain(m *testing.M) {
- os.Exit(m.Run())
+ g0 := runtime.NumGoroutine()
+
+ code := m.Run()
+ if code != 0 {
+ os.Exit(code)
+ }
+
+ // 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()
+ }()
}