]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go: always build _test.go files and link into test
authorRuss Cox <rsc@golang.org>
Fri, 26 Sep 2014 21:09:11 +0000 (17:09 -0400)
committerRuss Cox <rsc@golang.org>
Fri, 26 Sep 2014 21:09:11 +0000 (17:09 -0400)
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 #8337.

LGTM=iant
R=golang-codereviews, iant
CC=adg, golang-codereviews, r
https://golang.org/cl/150980043

src/cmd/go/test.bash
src/cmd/go/test.go
src/cmd/go/testdata/src/badtest/badexec/x_test.go [new file with mode: 0644]
src/cmd/go/testdata/src/badtest/badsyntax/x.go [new file with mode: 0644]
src/cmd/go/testdata/src/badtest/badsyntax/x_test.go [new file with mode: 0644]
src/cmd/go/testdata/src/badtest/badvar/x.go [new file with mode: 0644]
src/cmd/go/testdata/src/badtest/badvar/x_test.go [new file with mode: 0644]

index 1284876193f31f7edad429021713a712d4666770..6a72bcde076c2d7649d608e8ea3138dce6996706 100755 (executable)
@@ -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)
index 100ef5fa82d83039c6b8f5c0154ff9dfbb3d7405..0962e5bb50514ee1b41b0b87b5df30f601b52bc3 100644 (file)
@@ -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 (file)
index 0000000..12f5051
--- /dev/null
@@ -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 (file)
index 0000000..c8a5407
--- /dev/null
@@ -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 (file)
index 0000000..5be1074
--- /dev/null
@@ -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 (file)
index 0000000..fdd46c4
--- /dev/null
@@ -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 (file)
index 0000000..c67df01
--- /dev/null
@@ -0,0 +1,5 @@
+package badvar_test
+
+func f() {
+       _ = notdefined
+}