// Copyright 2014 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. 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) } // 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() }() }