]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go: fix missing conversions in -json output
authorRuss Cox <rsc@golang.org>
Fri, 1 Dec 2017 18:42:53 +0000 (13:42 -0500)
committerRuss Cox <rsc@golang.org>
Fri, 1 Dec 2017 21:06:23 +0000 (21:06 +0000)
1. Apply JSON conversion when -bench is in use.
2. Apply JSON conversion to "no test files" result.
3. Apply JSON conversion to test case-ending SKIP status.

Fixes #22769.
Fixes #22790.

Change-Id: I67ad656fc58bacae8c51d23b1e6d543cad190f08
Reviewed-on: https://go-review.googlesource.com/81535
Run-TryBot: Russ Cox <rsc@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/cmd/go/go_test.go
src/cmd/go/internal/test/test.go
src/cmd/go/testdata/src/skipper/skip_test.go [new file with mode: 0644]
src/cmd/internal/test2json/test2json.go
src/cmd/test2json/main.go

index c2fe8b09b4815750b823c7fb9678d0e7d6b06848..4551193b88bb32cf7e2c89bdb92774e8dbf288be 100644 (file)
@@ -5237,13 +5237,20 @@ func TestGoTestJSON(t *testing.T) {
        // It would be nice to test that the output is interlaced
        // but it seems to be impossible to do that in a short test
        // that isn't also flaky. Just check that we get JSON output.
-       tg.run("test", "-json", "-short", "-v", "errors")
-       for _, line := range strings.Split(tg.getStdout(), "\n") {
-               if strings.Contains(line, `"Package":"errors"`) {
-                       return
-               }
-       }
-       t.Fatalf("did not see JSON output")
+       tg.run("test", "-json", "-short", "-v", "errors", "empty/pkg", "skipper")
+       tg.grepStdout(`"Package":"errors"`, "did not see JSON output")
+       tg.grepStdout(`"Action":"run"`, "did not see JSON output")
+
+       tg.grepStdout(`"Action":"output","Package":"empty/pkg","Output":".*no test files`, "did not see no test files print")
+       tg.grepStdout(`"Action":"skip","Package":"empty/pkg"`, "did not see skip")
+
+       tg.grepStdout(`"Action":"output","Package":"skipper","Test":"Test","Output":"--- SKIP:`, "did not see SKIP output")
+       tg.grepStdout(`"Action":"skip","Package":"skipper","Test":"Test"`, "did not see skip result for Test")
+
+       tg.run("test", "-json", "-bench=NONE", "-short", "-v", "errors")
+       tg.grepStdout(`"Package":"errors"`, "did not see JSON output")
+       tg.grepStdout(`"Action":"run"`, "did not see JSON output")
+
 }
 
 func TestFailFast(t *testing.T) {
index a14a3f443807a7fd3151f2cdc4673d74d1b64b68..e06d7dbbcacf0102069c2857f2cfe65fde1b40ff 100644 (file)
@@ -1283,7 +1283,7 @@ func (c *runCache) builderRunTest(b *work.Builder, a *work.Action) error {
                // Stream test output (no buffering) when no package has
                // been given on the command line (implicit current directory)
                // or when benchmarking.
-               cmd.Stdout = os.Stdout
+               cmd.Stdout = stdout
        } else {
                // If we're only running a single package under test or if parallelism is
                // set to 1, and if we're displaying all output (testShowPass), we can
@@ -1547,7 +1547,13 @@ func builderPrintTest(b *work.Builder, a *work.Action) error {
 
 // builderNoTest is the action for testing a package with no test files.
 func builderNoTest(b *work.Builder, a *work.Action) error {
-       fmt.Printf("?   \t%s\t[no test files]\n", a.Package.ImportPath)
+       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
 }
 
diff --git a/src/cmd/go/testdata/src/skipper/skip_test.go b/src/cmd/go/testdata/src/skipper/skip_test.go
new file mode 100644 (file)
index 0000000..58e6dc5
--- /dev/null
@@ -0,0 +1,7 @@
+package skipper
+
+import "testing"
+
+func Test(t *testing.T) {
+       t.Skip("skipping")
+}
index fa08e34a98d57c043b2ef2c6bf838d2dc702a274..3e09c8d91517f9e6bffc58fa2523bb3350e78ba1 100644 (file)
@@ -54,7 +54,7 @@ type converter struct {
        start    time.Time  // time converter started
        testName string     // name of current test, for output attribution
        report   []*event   // pending test result reports (nested for subtests)
-       passed   bool       // whether we've seen the final whole-package PASS line
+       result   string     // overall test result if seen
        input    lineBuffer // input buffer
        output   lineBuffer // output buffer
 }
@@ -139,9 +139,13 @@ var (
        reports = [][]byte{
                []byte("--- PASS: "),
                []byte("--- FAIL: "),
+               []byte("--- SKIP: "),
        }
 
        fourSpace = []byte("    ")
+
+       skipLinePrefix = []byte("?   \t")
+       skipLineSuffix = []byte("\t[no test files]\n")
 )
 
 // handleInputLine handles a single whole test output line.
@@ -152,10 +156,20 @@ func (c *converter) handleInputLine(line []byte) {
        if bytes.Equal(line, bigPass) || bytes.Equal(line, bigFail) {
                c.flushReport(0)
                c.output.write(line)
-               c.passed = bytes.Equal(line, bigPass)
+               if bytes.Equal(line, bigPass) {
+                       c.result = "pass"
+               } else {
+                       c.result = "fail"
+               }
                return
        }
 
+       // Special case for entirely skipped test binary: "?   \tpkgname\t[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"
+       }
+
        // "=== RUN   "
        // "=== PAUSE "
        // "=== CONT  "
@@ -171,6 +185,7 @@ func (c *converter) handleInputLine(line []byte) {
        if !ok {
                // "--- PASS: "
                // "--- FAIL: "
+               // "--- SKIP: "
                // but possibly indented.
                for bytes.HasPrefix(line, fourSpace) {
                        line = line[4:]
@@ -257,8 +272,8 @@ func (c *converter) Close() error {
        c.input.flush()
        c.output.flush()
        e := &event{Action: "fail"}
-       if c.passed {
-               e.Action = "pass"
+       if c.result != "" {
+               e.Action = c.result
        }
        if c.mode&Timestamp != 0 {
                dt := time.Since(c.start).Round(1 * time.Millisecond).Seconds()
index 3d7c5601a3e5ad5b2129d4f66b05584708f575cb..14004977f5568b2d5c871b8e0c396215328c4be8 100644 (file)
@@ -25,7 +25,7 @@
 //
 //     type TestEvent struct {
 //             Time    time.Time // encodes as an RFC3339-format string
-//             Event   string
+//             Action  string
 //             Package string
 //             Test    string
 //             Elapsed float64 // seconds
@@ -35,7 +35,7 @@
 // The Time field holds the time the event happened.
 // It is conventionally omitted for cached test results.
 //
-// The Event field is one of a fixed set of event descriptions:
+// The Action field is one of a fixed set of action descriptions:
 //
 //     run    - the test has started running
 //     pause  - the test has been paused