]> Cypherpunks repositories - gostls13.git/commitdiff
test: deflake chan/select3.go
authorJosh Bleecher Snyder <josharian@gmail.com>
Fri, 7 Jul 2017 23:09:20 +0000 (13:09 -1000)
committerJosh Bleecher Snyder <josharian@gmail.com>
Sat, 8 Jul 2017 02:10:12 +0000 (02:10 +0000)
On a slow or distracted machine, 0.1s is sometimes
not long enough for a non-blocking function call to complete.
This causes rare test flakes.
They can be easily reproduced by reducing the wait time to (say) 100ns.

For non-blocking functions, increase the window from 100ms to 10s.
Using different windows for block and non-blocking functions,
allows us to reduce the time for blocking functions.
The risk here is false negatives, but that risk is low;
this test is run repeatedly on many fast machines,
for which 10ms is ample time.
This reduces the time required to run the test by a factor of 10,
from ~1s to ~100ms.

Fixes #20299

Change-Id: Ice9a641a66c6c101d738a2ebe1bcb144ae3c9916
Reviewed-on: https://go-review.googlesource.com/47812
Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

test/chan/select3.go

index e9391f55c7463a4523344c0f89f6a7b402eaa1b3..dd14c7381eae70c6974cf837b93028ca5d123363 100644 (file)
@@ -40,8 +40,15 @@ func testBlock(signal string, f func()) {
                c <- never // f didn't block
        }()
        go func() {
-               time.Sleep(1e8) // 0.1s seems plenty long
-               c <- always     // f blocked always
+               if signal == never {
+                       // Wait a long time to make sure that we don't miss our window by accident on a slow machine.
+                       time.Sleep(10 * time.Second)
+               } else {
+                       // Wait as short a time as we can without false negatives.
+                       // 10ms should be long enough to catch most failures.
+                       time.Sleep(10 * time.Millisecond)
+               }
+               c <- always // f blocked always
        }()
        if <-c != signal {
                panic(signal + " block")