liyujie
2025-08-28 d9927380ed7c8366f762049be9f3fee225860833
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
// Copyright 2017 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
 
import "sync"
 
// The line numbering of this file is important for TestTBHelper.
 
func notHelper(t *T, msg string) {
   t.Error(msg)
}
 
func helper(t *T, msg string) {
   t.Helper()
   t.Error(msg)
}
 
func notHelperCallingHelper(t *T, msg string) {
   helper(t, msg)
}
 
func helperCallingHelper(t *T, msg string) {
   t.Helper()
   helper(t, msg)
}
 
func testHelper(t *T) {
   // Check combinations of directly and indirectly
   // calling helper functions.
   notHelper(t, "0")
   helper(t, "1")
   notHelperCallingHelper(t, "2")
   helperCallingHelper(t, "3")
 
   // Check a function literal closing over t that uses Helper.
   fn := func(msg string) {
       t.Helper()
       t.Error(msg)
   }
   fn("4")
 
   t.Run("sub", func(t *T) {
       helper(t, "5")
       notHelperCallingHelper(t, "6")
       // Check that calling Helper from inside a subtest entry function
       // works as if it were in an ordinary function call.
       t.Helper()
       t.Error("7")
   })
 
   // Check that calling Helper from inside a top-level test function
   // has no effect.
   t.Helper()
   t.Error("8")
}
 
func parallelTestHelper(t *T) {
   var wg sync.WaitGroup
   for i := 0; i < 5; i++ {
       wg.Add(1)
       go func() {
           notHelperCallingHelper(t, "parallel")
           wg.Done()
       }()
   }
   wg.Wait()
}