]> Cypherpunks repositories - gostls13.git/commitdiff
context: eliminate arbitrary timeouts in examples
authorBryan C. Mills <bcmills@google.com>
Tue, 10 Jan 2023 16:49:37 +0000 (11:49 -0500)
committerGopher Robot <gobot@golang.org>
Wed, 25 Jan 2023 21:12:45 +0000 (21:12 +0000)
ExampleWithDeadline and ExampleWithTimeout used an arbitrary 1-second
timeout for a “blocked” select case, which could fail if the test
goroutine happens to be descheduled for over a second, or perhaps if
an NTP synchronization happens to jump by a second at just the right
time.

Either case is plausible, especially on a heavily-loaded or slow
machine (as is often the case for builders for unusual ports).

Instead of an arbitrary timeout, use a “ready” channel that is never
actually ready.

Fixes #57594.

Change-Id: I9ff68f50b041a3382e7b267c28c5259e886a9d23
Reviewed-on: https://go-review.googlesource.com/c/go/+/460999
TryBot-Result: Gopher Robot <gobot@golang.org>
Auto-Submit: Bryan Mills <bcmills@google.com>
Reviewed-by: Ian Lance Taylor <iant@google.com>
Reviewed-by: Sameer Ajmani <sameer@golang.org>
Run-TryBot: Bryan Mills <bcmills@google.com>

src/context/example_test.go

index 72ac5d2e49c16cffa8d7c3ec18132a03a80677d1..7779f5f1b356565a1662023059df2f502f980197 100644 (file)
@@ -12,6 +12,8 @@ import (
 
 const shortDuration = 1 * time.Millisecond // a reasonable duration to block in an example
 
+var neverReady = make(chan struct{}) // never closed
+
 // This example demonstrates the use of a cancelable context to prevent a
 // goroutine leak. By the end of the example function, the goroutine started
 // by gen will return without leaking.
@@ -66,8 +68,8 @@ func ExampleWithDeadline() {
        defer cancel()
 
        select {
-       case <-time.After(1 * time.Second):
-               fmt.Println("overslept")
+       case <-neverReady:
+               fmt.Println("ready")
        case <-ctx.Done():
                fmt.Println(ctx.Err())
        }
@@ -85,8 +87,8 @@ func ExampleWithTimeout() {
        defer cancel()
 
        select {
-       case <-time.After(1 * time.Second):
-               fmt.Println("overslept")
+       case <-neverReady:
+               fmt.Println("ready")
        case <-ctx.Done():
                fmt.Println(ctx.Err()) // prints "context deadline exceeded"
        }