diff options
author | Russ Cox <rsc@golang.org> | 2014-09-26 17:09:11 -0400 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2014-09-26 17:09:11 -0400 |
commit | cd095410f3dbccb0e1f8e0477340b4bceb52a8af (patch) | |
tree | ce0d8cafb15f615733ae2655850a1cd625670c35 | |
parent | e6c761db0debeb8baa6f29927c68a061bbee8410 (diff) | |
download | go-cd095410f3dbccb0e1f8e0477340b4bceb52a8af.tar.gz |
cmd/go: always build _test.go files and link into test
go test's handling of _test.go files when the entire
package's set of files has no Test functions has varied
over the past few releases. There are a few interesting
cases (all contain no Test functions):
(1) x_test.go has syntax errors
(2) x_test.go has type errors
(3) x_test.go has runtime errors (say, a func init that panics)
In Go 1.1, tests with (1) or (2) failed; (3) passed.
In Go 1.2, tests with (1) or (2) failed; (3) passed.
In Go 1.3, tests with (1) failed; (2) or (3) passed.
After this CL, tests with (1), (2), or (3) all fail.
This is clearly a corner case, but it seems to me that
the behavior of the test should not change if you
add or remove a line like
func TestAlwaysPasses(t *testing.T) {}
That implies that the _test.go files must always
be built and always be imported into the test binary.
Doing so means that (1), (2), and (3) must all fail.
Fixes issue 8337.
LGTM=iant
R=golang-codereviews, iant
CC=adg, golang-codereviews, r
https://codereview.appspot.com/150980043
-rwxr-xr-x | src/cmd/go/test.bash | 14 | ||||
-rw-r--r-- | src/cmd/go/test.go | 6 | ||||
-rw-r--r-- | src/cmd/go/testdata/src/badtest/badexec/x_test.go | 5 | ||||
-rw-r--r-- | src/cmd/go/testdata/src/badtest/badsyntax/x.go | 1 | ||||
-rw-r--r-- | src/cmd/go/testdata/src/badtest/badsyntax/x_test.go | 3 | ||||
-rw-r--r-- | src/cmd/go/testdata/src/badtest/badvar/x.go | 1 | ||||
-rw-r--r-- | src/cmd/go/testdata/src/badtest/badvar/x_test.go | 5 |
7 files changed, 33 insertions, 2 deletions
diff --git a/src/cmd/go/test.bash b/src/cmd/go/test.bash index 128487619..6a72bcde0 100755 --- a/src/cmd/go/test.bash +++ b/src/cmd/go/test.bash @@ -71,6 +71,20 @@ if ! grep -q "/tool/.*/$linker" $d/err.out; then fi rm -r $d +TEST broken tests without Test functions all fail +d=$(mktemp -d -t testgoXXX) +./testgo test ./testdata/src/badtest/... >$d/err 2>&1 || true +if grep -q '^ok' $d/err; then + echo test passed unexpectedly: + grep '^ok' $d/err + ok=false +elif ! grep -q 'FAIL.*badtest/badexec' $d/err || ! grep -q 'FAIL.*badtest/badsyntax' $d/err || ! grep -q 'FAIL.*badtest/badvar' $d/err; then + echo test did not run everything + cat $d/err + ok=false +fi +rm -rf $d + TEST 'go build -a in dev branch' ./testgo install math || ok=false # should be up to date already but just in case d=$(TMPDIR=/var/tmp mktemp -d -t testgoXXX) diff --git a/src/cmd/go/test.go b/src/cmd/go/test.go index 100ef5fa8..0962e5bb5 100644 --- a/src/cmd/go/test.go +++ b/src/cmd/go/test.go @@ -736,11 +736,13 @@ func (b *builder) test(p *Package) (buildAction, runAction, printAction *action, if err != nil { return nil, nil, nil, err } - if t.ImportTest || ptest.coverMode != "" { + if len(ptest.GoFiles) > 0 { pmain.imports = append(pmain.imports, ptest) + t.ImportTest = true } - if t.ImportXtest { + if pxtest != nil { pmain.imports = append(pmain.imports, pxtest) + t.ImportXtest = true } if ptest != p && localCover { diff --git a/src/cmd/go/testdata/src/badtest/badexec/x_test.go b/src/cmd/go/testdata/src/badtest/badexec/x_test.go new file mode 100644 index 000000000..12f505171 --- /dev/null +++ b/src/cmd/go/testdata/src/badtest/badexec/x_test.go @@ -0,0 +1,5 @@ +package badexec + +func init() { + panic("badexec") +} diff --git a/src/cmd/go/testdata/src/badtest/badsyntax/x.go b/src/cmd/go/testdata/src/badtest/badsyntax/x.go new file mode 100644 index 000000000..c8a5407a5 --- /dev/null +++ b/src/cmd/go/testdata/src/badtest/badsyntax/x.go @@ -0,0 +1 @@ +package badsyntax diff --git a/src/cmd/go/testdata/src/badtest/badsyntax/x_test.go b/src/cmd/go/testdata/src/badtest/badsyntax/x_test.go new file mode 100644 index 000000000..5be10745d --- /dev/null +++ b/src/cmd/go/testdata/src/badtest/badsyntax/x_test.go @@ -0,0 +1,3 @@ +package badsyntax + +func func func func func! diff --git a/src/cmd/go/testdata/src/badtest/badvar/x.go b/src/cmd/go/testdata/src/badtest/badvar/x.go new file mode 100644 index 000000000..fdd46c4c7 --- /dev/null +++ b/src/cmd/go/testdata/src/badtest/badvar/x.go @@ -0,0 +1 @@ +package badvar diff --git a/src/cmd/go/testdata/src/badtest/badvar/x_test.go b/src/cmd/go/testdata/src/badtest/badvar/x_test.go new file mode 100644 index 000000000..c67df01c5 --- /dev/null +++ b/src/cmd/go/testdata/src/badtest/badvar/x_test.go @@ -0,0 +1,5 @@ +package badvar_test + +func f() { + _ = notdefined +} |