blob: da5622f85f6bbdef99138af912bee97517be35cd [file] [log] [blame]
// 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
}
testenv.MustHaveExec(t)
t.Parallel()
exe, err := os.Executable()
if err != nil {
t.Fatal(err)
}
cmd := testenv.Command(t, exe, "-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
}
testenv.MustHaveExec(t)
t.Parallel()
exe, err := os.Executable()
if err != nil {
t.Fatal(err)
}
cmd := testenv.Command(t, exe, "-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()
}
}
}