]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: deflake TestPanicRace
authorIan Lance Taylor <iant@golang.org>
Wed, 7 Jun 2017 00:31:57 +0000 (17:31 -0700)
committerIan Lance Taylor <iant@golang.org>
Wed, 7 Jun 2017 00:55:56 +0000 (00:55 +0000)
The test is inherently racy, and for me fails about 0.05% of the time.
So only fail the test if it fails ten times in a row.

Fixes #20594

Change-Id: I3b3f7598f2196f7406f1a3937f38f21ff0c0e4b5
Reviewed-on: https://go-review.googlesource.com/45020
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
src/runtime/crash_test.go

index b08dd87d9b1e90f2500d5e7eebc1c02ee1f8d934..7753809d45f51d2662093bd4e72610b3de7217da 100644 (file)
@@ -579,21 +579,38 @@ func TestPanicRace(t *testing.T) {
                t.Fatal(err)
        }
 
-       got, err := testEnv(exec.Command(exe, "PanicRace")).CombinedOutput()
-       if err == nil {
-               t.Error("program exited successfully, should have failed")
-       }
+       // The test is intentionally racy, and in my testing does not
+       // produce the expected output about 0.05% of the time.
+       // So run the program in a loop and only fail the test if we
+       // get the wrong output ten times in a row.
+       const tries = 10
+retry:
+       for i := 0; i < tries; i++ {
+               got, err := testEnv(exec.Command(exe, "PanicRace")).CombinedOutput()
+               if err == nil {
+                       t.Logf("try %d: program exited successfully, should have failed", i+1)
+                       continue
+               }
 
-       t.Logf("%s\n", got)
+               if i > 0 {
+                       t.Logf("try %d:\n", i+1)
+               }
+               t.Logf("%s\n", got)
 
-       wants := []string{
-               "panic: crash",
-               "PanicRace",
-               "created by ",
-       }
-       for _, want := range wants {
-               if !bytes.Contains(got, []byte(want)) {
-                       t.Errorf("did not find expected string %q", want)
+               wants := []string{
+                       "panic: crash",
+                       "PanicRace",
+                       "created by ",
+               }
+               for _, want := range wants {
+                       if !bytes.Contains(got, []byte(want)) {
+                               t.Logf("did not find expected string %q", want)
+                               continue retry
+                       }
                }
+
+               // Test generated expected output.
+               return
        }
+       t.Errorf("test ran %d times without producing expected output", tries)
 }