// 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_test import ( "internal/testenv" "os" "regexp" "strings" "testing" ) func TestTBHelper(t *testing.T) { if os.Getenv("GO_WANT_HELPER_PROCESS") == "1" { testTestHelper(t) // Check that calling Helper from inside a top-level test function // has no effect. t.Helper() t.Error("8") return } t.Parallel() cmd := testenv.Command(t, testenv.Executable(t), "-test.run=^TestTBHelper$") cmd = testenv.CleanCmdEnv(cmd) cmd.Env = append(cmd.Env, "GO_WANT_HELPER_PROCESS=1") out, _ := cmd.CombinedOutput() want := `--- FAIL: TestTBHelper \([^)]+\) helperfuncs_test.go:15: 0 helperfuncs_test.go:47: 1 helperfuncs_test.go:24: 2 helperfuncs_test.go:49: 3 helperfuncs_test.go:56: 4 --- FAIL: TestTBHelper/sub \([^)]+\) helperfuncs_test.go:59: 5 helperfuncs_test.go:24: 6 helperfuncs_test.go:58: 7 --- FAIL: TestTBHelper/sub2 \([^)]+\) helperfuncs_test.go:80: 11 helperfuncs_test.go:84: recover 12 helperfuncs_test.go:86: GenericFloat64 helperfuncs_test.go:87: GenericInt helper_test.go:22: 8 helperfuncs_test.go:73: 9 helperfuncs_test.go:69: 10 ` if !regexp.MustCompile(want).Match(out) { t.Errorf("got output:\n\n%s\nwant matching:\n\n%s", out, want) } } func TestTBHelperParallel(t *testing.T) { if os.Getenv("GO_WANT_HELPER_PROCESS") == "1" { parallelTestHelper(t) return } t.Parallel() cmd := testenv.Command(t, testenv.Executable(t), "-test.run=^TestTBHelperParallel$") cmd = testenv.CleanCmdEnv(cmd) cmd.Env = append(cmd.Env, "GO_WANT_HELPER_PROCESS=1") out, _ := cmd.CombinedOutput() t.Logf("output:\n%s", out) lines := strings.Split(strings.TrimSpace(string(out)), "\n") // We expect to see one "--- FAIL" line at the start // of the log, five lines of "parallel" logging, // and a final "FAIL" line at the end of the test. const wantLines = 7 if len(lines) != wantLines { t.Fatalf("parallelTestHelper gave %d lines of output; want %d", len(lines), wantLines) } want := "helperfuncs_test.go:24: parallel" if got := strings.TrimSpace(lines[1]); got != want { t.Errorf("got second output line %q; want %q", got, want) } } func BenchmarkTBHelper(b *testing.B) { f1 := func() { b.Helper() } f2 := func() { b.Helper() } b.ResetTimer() b.ReportAllocs() for i := 0; i < b.N; i++ { if i&1 == 0 { f1() } else { f2() } } }