| # Regression test for https://golang.org/issue/45127: |
| # Goroutines for completed parallel subtests should exit immediately, |
| # not block until earlier subtests have finished. |
| |
| [short] skip |
| |
| ! go test . |
| stdout 'panic: slow failure' |
| ! stdout '\[chan send' |
| |
| -- go.mod -- |
| module golang.org/issue45127 |
| |
| go 1.16 |
| -- issue45127_test.go -- |
| package main |
| |
| import ( |
| "fmt" |
| "runtime" |
| "runtime/debug" |
| "sync" |
| "testing" |
| ) |
| |
| func TestTestingGoroutineLeak(t *testing.T) { |
| debug.SetTraceback("all") |
| |
| var wg sync.WaitGroup |
| const nFast = 10 |
| |
| t.Run("slow", func(t *testing.T) { |
| t.Parallel() |
| wg.Wait() |
| for i := 0; i < nFast; i++ { |
| // If the subtest goroutines are going to park on the channel |
| // send, allow them to park now. If they're not going to park, |
| // make sure they have had a chance to run to completion so |
| // that they aren't spuriously parked when we panic. |
| runtime.Gosched() |
| } |
| panic("slow failure") |
| }) |
| |
| wg.Add(nFast) |
| for i := 0; i < nFast; i++ { |
| t.Run(fmt.Sprintf("leaky%d", i), func(t *testing.T) { |
| t.Parallel() |
| wg.Done() |
| }) |
| } |
| } |