aboutsummaryrefslogtreecommitdiff
path: root/src/testing/example.go
diff options
context:
space:
mode:
authorEmmanuel T Odeke <emmanuel@orijtech.com>2019-03-05 03:58:37 -0800
committerBrad Fitzpatrick <bradfitz@golang.org>2019-03-11 18:59:53 +0000
commitac56baa09f789ab93dd97b31c4f033da7c85a6a4 (patch)
tree586a92620ea83e7d5d2b78d3122d4cd33759ed56 /src/testing/example.go
parent48d3c32ba9c2cbe4cfded44a150540f15fdf517c (diff)
downloadgo-ac56baa09f789ab93dd97b31c4f033da7c85a6a4.tar.xz
testing: enable examples on js/wasm with non os.Pipe runExample
os.Pipe is not implemented on wasm/js so for that purpose use a temporary file for js/wasm. This change creates two versions of runExample: * runExample verbatim that still uses os.Pipe for non js/wasm * runExample that uses a temporary file Also added a TODO to re-unify these function versions back into example.go wasm/js gets an os.Pipe implementation. Change-Id: I9f418a49b2c397e1667724c7442b7bbe8942225e Reviewed-on: https://go-review.googlesource.com/c/go/+/165357 Run-TryBot: Emmanuel Odeke <emm.odeke@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Diffstat (limited to 'src/testing/example.go')
-rw-r--r--src/testing/example.go90
1 files changed, 30 insertions, 60 deletions
diff --git a/src/testing/example.go b/src/testing/example.go
index f4beb76f5f..c122121289 100644
--- a/src/testing/example.go
+++ b/src/testing/example.go
@@ -6,7 +6,6 @@ package testing
import (
"fmt"
- "io"
"os"
"sort"
"strings"
@@ -56,68 +55,39 @@ func sortLines(output string) string {
return strings.Join(lines, "\n")
}
-func runExample(eg InternalExample) (ok bool) {
- if *chatty {
- fmt.Printf("=== RUN %s\n", eg.Name)
- }
-
- // Capture stdout.
- stdout := os.Stdout
- r, w, err := os.Pipe()
- if err != nil {
- fmt.Fprintln(os.Stderr, err)
- os.Exit(1)
- }
- os.Stdout = w
- outC := make(chan string)
- go func() {
- var buf strings.Builder
- _, err := io.Copy(&buf, r)
- r.Close()
- if err != nil {
- fmt.Fprintf(os.Stderr, "testing: copying pipe: %v\n", err)
- os.Exit(1)
- }
- outC <- buf.String()
- }()
-
- start := time.Now()
- ok = true
+// processRunResult computes a summary and status of the result of running an example test.
+// stdout is the captured output from stdout of the test.
+// recovered is the result of invoking recover after running the test, in case it panicked.
+//
+// If stdout doesn't match the expected output or if recovered is non-nil, it'll print the cause of failure to stdout.
+// If the test is chatty/verbose, it'll print a success message to stdout.
+// If recovered is non-nil, it'll panic with that value.
+func (eg *InternalExample) processRunResult(stdout string, timeSpent time.Duration, recovered interface{}) (passed bool) {
+ passed = true
- // Clean up in a deferred call so we can recover if the example panics.
- defer func() {
- dstr := fmtDuration(time.Since(start))
-
- // Close pipe, restore stdout, get output.
- w.Close()
- os.Stdout = stdout
- out := <-outC
-
- var fail string
- err := recover()
- got := strings.TrimSpace(out)
- want := strings.TrimSpace(eg.Output)
- if eg.Unordered {
- if sortLines(got) != sortLines(want) && err == nil {
- fail = fmt.Sprintf("got:\n%s\nwant (unordered):\n%s\n", out, eg.Output)
- }
- } else {
- if got != want && err == nil {
- fail = fmt.Sprintf("got:\n%s\nwant:\n%s\n", got, want)
- }
- }
- if fail != "" || err != nil {
- fmt.Printf("--- FAIL: %s (%s)\n%s", eg.Name, dstr, fail)
- ok = false
- } else if *chatty {
- fmt.Printf("--- PASS: %s (%s)\n", eg.Name, dstr)
+ dstr := fmtDuration(timeSpent)
+ var fail string
+ got := strings.TrimSpace(stdout)
+ want := strings.TrimSpace(eg.Output)
+ if eg.Unordered {
+ if sortLines(got) != sortLines(want) && recovered == nil {
+ fail = fmt.Sprintf("got:\n%s\nwant (unordered):\n%s\n", stdout, eg.Output)
}
- if err != nil {
- panic(err)
+ } else {
+ if got != want && recovered == nil {
+ fail = fmt.Sprintf("got:\n%s\nwant:\n%s\n", got, want)
}
- }()
+ }
+ if fail != "" || recovered != nil {
+ fmt.Printf("--- FAIL: %s (%s)\n%s", eg.Name, dstr, fail)
+ passed = false
+ } else if *chatty {
+ fmt.Printf("--- PASS: %s (%s)\n", eg.Name, dstr)
+ }
+ if recovered != nil {
+ // Propagate the previously recovered result, by panicking.
+ panic(recovered)
+ }
- // Run example.
- eg.F()
return
}