github.com/powerman/golang-tools@v0.1.11-0.20220410185822-5ad214d8d803/go/analysis/passes/testinggoroutine/testdata/src/a/a.go (about)

     1  // Copyright 2020 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package a
     6  
     7  import (
     8  	"log"
     9  	"sync"
    10  	"testing"
    11  )
    12  
    13  func TestBadFatalf(t *testing.T) {
    14  	var wg sync.WaitGroup
    15  	defer wg.Wait()
    16  
    17  	for i := 0; i < 2; i++ {
    18  		wg.Add(1)
    19  		go func(id int) {
    20  			defer wg.Done()
    21  			t.Fatalf("TestFailed: id = %v\n", id) // want "call to .+T.+Fatalf from a non-test goroutine"
    22  		}(i)
    23  	}
    24  }
    25  
    26  func TestOKErrorf(t *testing.T) {
    27  	var wg sync.WaitGroup
    28  	defer wg.Wait()
    29  
    30  	for i := 0; i < 2; i++ {
    31  		wg.Add(1)
    32  		go func(id int) {
    33  			defer wg.Done()
    34  			t.Errorf("TestFailed: id = %v\n", id)
    35  		}(i)
    36  	}
    37  }
    38  
    39  func TestBadFatal(t *testing.T) {
    40  	var wg sync.WaitGroup
    41  	defer wg.Wait()
    42  
    43  	for i := 0; i < 2; i++ {
    44  		wg.Add(1)
    45  		go func(id int) {
    46  			defer wg.Done()
    47  			t.Fatal("TestFailed") // want "call to .+T.+Fatal from a non-test goroutine"
    48  		}(i)
    49  	}
    50  }
    51  
    52  func f(t *testing.T, _ string) {
    53  	t.Fatal("TestFailed")
    54  }
    55  
    56  func g() {}
    57  
    58  func TestBadFatalIssue47470(t *testing.T) {
    59  	go f(t, "failed test 1") // want "call to .+T.+Fatal from a non-test goroutine"
    60  
    61  	g := func(t *testing.T, _ string) {
    62  		t.Fatal("TestFailed")
    63  	}
    64  	go g(t, "failed test 2") // want "call to .+T.+Fatal from a non-test goroutine"
    65  }
    66  
    67  func BenchmarkBadFatalf(b *testing.B) {
    68  	var wg sync.WaitGroup
    69  	defer wg.Wait()
    70  
    71  	for i := 0; i < b.N; i++ {
    72  		wg.Add(1)
    73  		go func(id int) {
    74  			defer wg.Done()
    75  			b.Fatalf("TestFailed: id = %v\n", id) // want "call to .+B.+Fatalf from a non-test goroutine"
    76  		}(i)
    77  	}
    78  }
    79  
    80  func BenchmarkBadFatal(b *testing.B) {
    81  	var wg sync.WaitGroup
    82  	defer wg.Wait()
    83  
    84  	for i := 0; i < b.N; i++ {
    85  		wg.Add(1)
    86  		go func(id int) {
    87  			defer wg.Done()
    88  			b.Fatal("TestFailed") // want "call to .+B.+Fatal from a non-test goroutine"
    89  		}(i)
    90  	}
    91  }
    92  
    93  func BenchmarkOKErrorf(b *testing.B) {
    94  	var wg sync.WaitGroup
    95  	defer wg.Wait()
    96  
    97  	for i := 0; i < b.N; i++ {
    98  		wg.Add(1)
    99  		go func(id int) {
   100  			defer wg.Done()
   101  			b.Errorf("TestFailed: %d", i)
   102  		}(i)
   103  	}
   104  }
   105  
   106  func BenchmarkBadFatalGoGo(b *testing.B) {
   107  	var wg sync.WaitGroup
   108  	defer wg.Wait()
   109  
   110  	for i := 0; i < b.N; i++ {
   111  		wg.Add(1)
   112  		go func(id int) {
   113  			go func() {
   114  				defer wg.Done()
   115  				b.Fatal("TestFailed") // want "call to .+B.+Fatal from a non-test goroutine"
   116  			}()
   117  		}(i)
   118  	}
   119  
   120  	if false {
   121  		defer b.Fatal("here")
   122  	}
   123  
   124  	if true {
   125  		go func() {
   126  			b.Fatal("in here") // want "call to .+B.+Fatal from a non-test goroutine"
   127  		}()
   128  	}
   129  
   130  	func() {
   131  		func() {
   132  			func() {
   133  				func() {
   134  					go func() {
   135  						b.Fatal("Here") // want "call to .+B.+Fatal from a non-test goroutine"
   136  					}()
   137  				}()
   138  			}()
   139  		}()
   140  	}()
   141  
   142  	_ = 10 * 10
   143  	_ = func() bool {
   144  		go b.Fatal("Failed") // want "call to .+B.+Fatal from a non-test goroutine"
   145  		return true
   146  	}
   147  
   148  	defer func() {
   149  		go b.Fatal("Here") // want "call to .+B.+Fatal from a non-test goroutine"
   150  	}()
   151  }
   152  
   153  func BenchmarkBadSkip(b *testing.B) {
   154  	for i := 0; i < b.N; i++ {
   155  		if i == 100 {
   156  			go b.Skip("Skipping") // want "call to .+B.+Skip from a non-test goroutine"
   157  		}
   158  		if i == 22 {
   159  			go func() {
   160  				go func() {
   161  					b.Skip("Skipping now") // want "call to .+B.+Skip from a non-test goroutine"
   162  				}()
   163  			}()
   164  		}
   165  	}
   166  }
   167  
   168  func TestBadSkip(t *testing.T) {
   169  	for i := 0; i < 1000; i++ {
   170  		if i == 100 {
   171  			go t.Skip("Skipping") // want "call to .+T.+Skip from a non-test goroutine"
   172  		}
   173  		if i == 22 {
   174  			go func() {
   175  				go func() {
   176  					t.Skip("Skipping now") // want "call to .+T.+Skip from a non-test goroutine"
   177  				}()
   178  			}()
   179  		}
   180  	}
   181  }
   182  
   183  func BenchmarkBadFailNow(b *testing.B) {
   184  	for i := 0; i < b.N; i++ {
   185  		if i == 100 {
   186  			go b.FailNow() // want "call to .+B.+FailNow from a non-test goroutine"
   187  		}
   188  		if i == 22 {
   189  			go func() {
   190  				go func() {
   191  					b.FailNow() // want "call to .+B.+FailNow from a non-test goroutine"
   192  				}()
   193  			}()
   194  		}
   195  	}
   196  }
   197  
   198  func TestBadFailNow(t *testing.T) {
   199  	for i := 0; i < 1000; i++ {
   200  		if i == 100 {
   201  			go t.FailNow() // want "call to .+T.+FailNow from a non-test goroutine"
   202  		}
   203  		if i == 22 {
   204  			go func() {
   205  				go func() {
   206  					t.FailNow() // want "call to .+T.+FailNow from a non-test goroutine"
   207  				}()
   208  			}()
   209  		}
   210  	}
   211  }
   212  
   213  func TestBadWithLoopCond(ty *testing.T) {
   214  	var wg sync.WaitGroup
   215  	defer wg.Wait()
   216  
   217  	for i := 0; i < 10; i++ {
   218  		wg.Add(1)
   219  		go func(id int) {
   220  			defer ty.Fatalf("Why") // want "call to .+T.+Fatalf from a non-test goroutine"
   221  			go func() {
   222  				for j := 0; j < 2; ty.FailNow() { // want "call to .+T.+FailNow from"
   223  					j++
   224  					ty.Errorf("Done here")
   225  				}
   226  			}()
   227  		}(i)
   228  	}
   229  }
   230  
   231  type customType int
   232  
   233  func (ct *customType) Fatalf(fmtSpec string, args ...interface{}) {
   234  	if fmtSpec == "" {
   235  		panic("empty format specifier")
   236  	}
   237  }
   238  
   239  func (ct *customType) FailNow() {}
   240  func (ct *customType) Skip()    {}
   241  
   242  func TestWithLogFatalf(t *testing.T) {
   243  	var wg sync.WaitGroup
   244  	defer wg.Wait()
   245  
   246  	for i := 0; i < 10; i++ {
   247  		wg.Add(1)
   248  		go func(id int) {
   249  			go func() {
   250  				for j := 0; j < 2; j++ {
   251  					log.Fatal("Done here")
   252  				}
   253  			}()
   254  		}(i)
   255  	}
   256  }
   257  
   258  func TestWithCustomType(t *testing.T) {
   259  	var wg sync.WaitGroup
   260  	defer wg.Wait()
   261  
   262  	ct := new(customType)
   263  	defer ct.FailNow()
   264  	defer ct.Skip()
   265  
   266  	for i := 0; i < 10; i++ {
   267  		wg.Add(1)
   268  		go func(id int) {
   269  			go func() {
   270  				for j := 0; j < 2; j++ {
   271  					ct.Fatalf("Done here: %d", i)
   272  				}
   273  			}()
   274  		}(i)
   275  	}
   276  }
   277  
   278  func TestIssue48124(t *testing.T) {
   279  	go h()
   280  }