| // Copyright 2020 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 a |
| |
| import ( |
| "log" |
| "sync" |
| "testing" |
| ) |
| |
| func TestBadFatalf(t *testing.T) { |
| var wg sync.WaitGroup |
| defer wg.Wait() |
| |
| for i := 0; i < 2; i++ { |
| wg.Add(1) |
| go func(id int) { |
| defer wg.Done() |
| t.Fatalf("TestFailed: id = %v\n", id) // want "call to .+T.+Fatalf from a non-test goroutine" |
| }(i) |
| } |
| } |
| |
| func TestOKErrorf(t *testing.T) { |
| var wg sync.WaitGroup |
| defer wg.Wait() |
| |
| for i := 0; i < 2; i++ { |
| wg.Add(1) |
| go func(id int) { |
| defer wg.Done() |
| t.Errorf("TestFailed: id = %v\n", id) |
| }(i) |
| } |
| } |
| |
| func TestBadFatal(t *testing.T) { |
| var wg sync.WaitGroup |
| defer wg.Wait() |
| |
| for i := 0; i < 2; i++ { |
| wg.Add(1) |
| go func(id int) { |
| defer wg.Done() |
| t.Fatal("TestFailed") // want "call to .+T.+Fatal from a non-test goroutine" |
| }(i) |
| } |
| } |
| |
| func f(t *testing.T, _ string) { |
| t.Fatal("TestFailed") |
| } |
| |
| func g() {} |
| |
| func TestBadFatalIssue47470(t *testing.T) { |
| go f(t, "failed test 1") // want "call to .+T.+Fatal from a non-test goroutine" |
| |
| g := func(t *testing.T, _ string) { |
| t.Fatal("TestFailed") |
| } |
| go g(t, "failed test 2") // want "call to .+T.+Fatal from a non-test goroutine" |
| } |
| |
| func BenchmarkBadFatalf(b *testing.B) { |
| var wg sync.WaitGroup |
| defer wg.Wait() |
| |
| for i := 0; i < b.N; i++ { |
| wg.Add(1) |
| go func(id int) { |
| defer wg.Done() |
| b.Fatalf("TestFailed: id = %v\n", id) // want "call to .+B.+Fatalf from a non-test goroutine" |
| }(i) |
| } |
| } |
| |
| func BenchmarkBadFatal(b *testing.B) { |
| var wg sync.WaitGroup |
| defer wg.Wait() |
| |
| for i := 0; i < b.N; i++ { |
| wg.Add(1) |
| go func(id int) { |
| defer wg.Done() |
| b.Fatal("TestFailed") // want "call to .+B.+Fatal from a non-test goroutine" |
| }(i) |
| } |
| } |
| |
| func BenchmarkOKErrorf(b *testing.B) { |
| var wg sync.WaitGroup |
| defer wg.Wait() |
| |
| for i := 0; i < b.N; i++ { |
| wg.Add(1) |
| go func(id int) { |
| defer wg.Done() |
| b.Errorf("TestFailed: %d", i) |
| }(i) |
| } |
| } |
| |
| func BenchmarkBadFatalGoGo(b *testing.B) { |
| var wg sync.WaitGroup |
| defer wg.Wait() |
| |
| for i := 0; i < b.N; i++ { |
| wg.Add(1) |
| go func(id int) { |
| go func() { |
| defer wg.Done() |
| b.Fatal("TestFailed") // want "call to .+B.+Fatal from a non-test goroutine" |
| }() |
| }(i) |
| } |
| |
| if false { |
| defer b.Fatal("here") |
| } |
| |
| if true { |
| go func() { |
| b.Fatal("in here") // want "call to .+B.+Fatal from a non-test goroutine" |
| }() |
| } |
| |
| func() { |
| func() { |
| func() { |
| func() { |
| go func() { |
| b.Fatal("Here") // want "call to .+B.+Fatal from a non-test goroutine" |
| }() |
| }() |
| }() |
| }() |
| }() |
| |
| _ = 10 * 10 |
| _ = func() bool { |
| go b.Fatal("Failed") // want "call to .+B.+Fatal from a non-test goroutine" |
| return true |
| } |
| |
| defer func() { |
| go b.Fatal("Here") // want "call to .+B.+Fatal from a non-test goroutine" |
| }() |
| } |
| |
| func BenchmarkBadSkip(b *testing.B) { |
| for i := 0; i < b.N; i++ { |
| if i == 100 { |
| go b.Skip("Skipping") // want "call to .+B.+Skip from a non-test goroutine" |
| } |
| if i == 22 { |
| go func() { |
| go func() { |
| b.Skip("Skipping now") // want "call to .+B.+Skip from a non-test goroutine" |
| }() |
| }() |
| } |
| } |
| } |
| |
| func TestBadSkip(t *testing.T) { |
| for i := 0; i < 1000; i++ { |
| if i == 100 { |
| go t.Skip("Skipping") // want "call to .+T.+Skip from a non-test goroutine" |
| } |
| if i == 22 { |
| go func() { |
| go func() { |
| t.Skip("Skipping now") // want "call to .+T.+Skip from a non-test goroutine" |
| }() |
| }() |
| } |
| } |
| } |
| |
| func BenchmarkBadFailNow(b *testing.B) { |
| for i := 0; i < b.N; i++ { |
| if i == 100 { |
| go b.FailNow() // want "call to .+B.+FailNow from a non-test goroutine" |
| } |
| if i == 22 { |
| go func() { |
| go func() { |
| b.FailNow() // want "call to .+B.+FailNow from a non-test goroutine" |
| }() |
| }() |
| } |
| } |
| } |
| |
| func TestBadFailNow(t *testing.T) { |
| for i := 0; i < 1000; i++ { |
| if i == 100 { |
| go t.FailNow() // want "call to .+T.+FailNow from a non-test goroutine" |
| } |
| if i == 22 { |
| go func() { |
| go func() { |
| t.FailNow() // want "call to .+T.+FailNow from a non-test goroutine" |
| }() |
| }() |
| } |
| } |
| } |
| |
| func TestBadWithLoopCond(ty *testing.T) { |
| var wg sync.WaitGroup |
| defer wg.Wait() |
| |
| for i := 0; i < 10; i++ { |
| wg.Add(1) |
| go func(id int) { |
| defer ty.Fatalf("Why") // want "call to .+T.+Fatalf from a non-test goroutine" |
| go func() { |
| for j := 0; j < 2; ty.FailNow() { // want "call to .+T.+FailNow from" |
| j++ |
| ty.Errorf("Done here") |
| } |
| }() |
| }(i) |
| } |
| } |
| |
| type customType int |
| |
| func (ct *customType) Fatalf(fmtSpec string, args ...interface{}) { |
| if fmtSpec == "" { |
| panic("empty format specifier") |
| } |
| } |
| |
| func (ct *customType) FailNow() {} |
| func (ct *customType) Skip() {} |
| |
| func TestWithLogFatalf(t *testing.T) { |
| var wg sync.WaitGroup |
| defer wg.Wait() |
| |
| for i := 0; i < 10; i++ { |
| wg.Add(1) |
| go func(id int) { |
| go func() { |
| for j := 0; j < 2; j++ { |
| log.Fatal("Done here") |
| } |
| }() |
| }(i) |
| } |
| } |
| |
| func TestWithCustomType(t *testing.T) { |
| var wg sync.WaitGroup |
| defer wg.Wait() |
| |
| ct := new(customType) |
| defer ct.FailNow() |
| defer ct.Skip() |
| |
| for i := 0; i < 10; i++ { |
| wg.Add(1) |
| go func(id int) { |
| go func() { |
| for j := 0; j < 2; j++ { |
| ct.Fatalf("Done here: %d", i) |
| } |
| }() |
| }(i) |
| } |
| } |
| |
| func TestIssue48124(t *testing.T) { |
| go h() |
| } |