| // 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") |
| |
| // Check that right caller is reported for func passed to Cleanup when |
| // multiple cleanup functions have been registered. |
| t.Cleanup(func() { |
| t.Helper() |
| t.Error("10") |
| }) |
| t.Cleanup(func() { |
| t.Helper() |
| t.Error("9") |
| }) |
| } |
| |
| 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() |
| } |