tg.grepStdout("File with non-runnable example was built.", "file with non-runnable example was not built")
}
+// issue 24570
+func TestGoTestCoverMultiPackage(t *testing.T) {
+ tg := testgo(t)
+ defer tg.cleanup()
+ tg.run("test", "-cover", "./testdata/testcover/...")
+ tg.grepStdout(`\?.*testdata/testcover/pkg1.*\d\.\d\d\ds.*coverage:.*0\.0% of statements \[no test files\]`, "expected [no test files] for pkg1")
+ tg.grepStdout(`ok.*testdata/testcover/pkg2.*\d\.\d\d\ds.*coverage:.*0\.0% of statements \[no tests to run\]`, "expected [no tests to run] for pkg2")
+ tg.grepStdout(`ok.*testdata/testcover/pkg3.*\d\.\d\d\ds.*coverage:.*100\.0% of statements`, "expected 100% coverage for pkg3")
+}
+
+// issue 24570
+func TestGoTestCoverprofileMultiPackage(t *testing.T) {
+ tg := testgo(t)
+ defer tg.cleanup()
+ tg.creatingTemp("testdata/cover.out")
+ tg.run("test", "-coverprofile=testdata/cover.out", "./testdata/testcover/...")
+ tg.grepStdout(`\?.*testdata/testcover/pkg1.*\d\.\d\d\ds.*coverage:.*0\.0% of statements \[no test files\]`, "expected [no test files] for pkg1")
+ tg.grepStdout(`ok.*testdata/testcover/pkg2.*\d\.\d\d\ds.*coverage:.*0\.0% of statements \[no tests to run\]`, "expected [no tests to run] for pkg2")
+ tg.grepStdout(`ok.*testdata/testcover/pkg3.*\d\.\d\d\ds.*coverage:.*100\.0% of statements`, "expected 100% coverage for pkg3")
+ if out, err := ioutil.ReadFile("testdata/cover.out"); err != nil {
+ t.Error(err)
+ } else {
+ if !bytes.Contains(out, []byte("mode: set")) {
+ t.Errorf(`missing "mode: set" in %s`, out)
+ }
+ if !bytes.Contains(out, []byte(`pkg1/a.go:5.10,7.2 1 0`)) && !bytes.Contains(out, []byte(`pkg1\a.go:5.10,7.2 1 0`)) {
+ t.Errorf(`missing "pkg1/a.go:5.10,7.2 1 0" in %s`, out)
+ }
+ if !bytes.Contains(out, []byte(`pkg2/a.go:5.10,7.2 1 0`)) && !bytes.Contains(out, []byte(`pkg2\a.go:5.10,7.2 1 0`)) {
+ t.Errorf(`missing "pkg2/a.go:5.10,7.2 1 0" in %s`, out)
+ }
+ if !bytes.Contains(out, []byte(`pkg3/a.go:5.10,7.2 1 1`)) && !bytes.Contains(out, []byte(`pkg3\a.go:5.10,7.2 1 1`)) {
+ t.Errorf(`missing "pkg3/a.go:5.10,7.2 1 1" in %s`, out)
+ }
+ }
+}
+
func TestGoGenerateHandlesSimpleCommand(t *testing.T) {
if runtime.GOOS == "windows" {
t.Skip("skipping because windows has no echo command")
// (for example, if there are no "package p" test files and
// package p need not be instrumented for coverage or any other reason),
// then the returned ptest == p.
-//
-// The caller is expected to have checked that len(p.TestGoFiles)+len(p.XTestGoFiles) > 0,
-// or else there's no point in any of this.
func TestPackagesFor(p *Package, cover *TestCover) (pmain, ptest, pxtest *Package, err error) {
var imports, ximports []*Package
var stk ImportStack
}
func builderTest(b *work.Builder, p *load.Package) (buildAction, runAction, printAction *work.Action, err error) {
- if len(p.TestGoFiles)+len(p.XTestGoFiles) == 0 {
- build := b.CompileAction(work.ModeBuild, work.ModeBuild, p)
- run := &work.Action{Mode: "test run", Package: p, Deps: []*work.Action{build}}
- addTestVet(b, p, run, nil)
- print := &work.Action{Mode: "test print", Func: builderNoTest, Package: p, Deps: []*work.Action{run}}
- return build, run, print, nil
- }
-
// Build Package structs describing:
// pmain - pkg.test binary
// ptest - package + test files
if err == nil {
norun := ""
+ res := "ok"
if !testShowPass && !testJSON {
buf.Reset()
}
- if bytes.HasPrefix(out, noTestsToRun[1:]) || bytes.Contains(out, noTestsToRun) {
+ if len(a.Package.TestGoFiles)+len(a.Package.XTestGoFiles) == 0 {
+ res = "? "
+ norun = " [no test files]"
+ } else if bytes.HasPrefix(out, noTestsToRun[1:]) || bytes.Contains(out, noTestsToRun) {
norun = " [no tests to run]"
}
- fmt.Fprintf(cmd.Stdout, "ok \t%s\t%s%s%s\n", a.Package.ImportPath, t, coveragePercentage(out), norun)
+ fmt.Fprintf(cmd.Stdout, "%s \t%s\t%s%s%s\n", res, a.Package.ImportPath, t, coveragePercentage(out), norun)
c.saveOutput(a)
} else {
base.SetExitStatus(1)
}
return nil
}
-
-// builderNoTest is the action for testing a package with no test files.
-func builderNoTest(b *work.Builder, a *work.Action) error {
- var stdout io.Writer = os.Stdout
- if testJSON {
- json := test2json.NewConverter(lockedStdout{}, a.Package.ImportPath, test2json.Timestamp)
- defer json.Close()
- stdout = json
- }
- fmt.Fprintf(stdout, "? \t%s\t[no test files]\n", a.Package.ImportPath)
- return nil
-}
--- /dev/null
+package pkg1
+
+import "fmt"
+
+func F() {
+ fmt.Println("pkg1")
+}
--- /dev/null
+package pkg2
+
+import "fmt"
+
+func F() {
+ fmt.Println("pkg2")
+}
--- /dev/null
+package pkg2
--- /dev/null
+package pkg3
+
+import "fmt"
+
+func F() {
+ fmt.Println("pkg3")
+}
--- /dev/null
+package pkg3
+
+import "testing"
+
+func TestF(t *testing.T) {
+ F()
+}
fourSpace = []byte(" ")
skipLinePrefix = []byte("? \t")
- skipLineSuffix = []byte("\t[no test files]\n")
+ skipLineSuffix = []byte(" [no test files]\n")
)
// handleInputLine handles a single whole test output line.
return
}
- // Special case for entirely skipped test binary: "? \tpkgname\t[no test files]\n" is only line.
+ // Special case for entirely skipped test binary: "? \tpkgname\t0.001s [no test files]\n" is only line.
// Report it as plain output but remember to say skip in the final summary.
if bytes.HasPrefix(line, skipLinePrefix) && bytes.HasSuffix(line, skipLineSuffix) && len(c.report) == 0 {
c.result = "skip"