Skip to content

Commit

Permalink
assert: fix TestEventuallyTimeout
Browse files Browse the repository at this point in the history
Fix TestEventuallyIssue805 which was flaky because of the use of a timer
that has exactly the same duration as the Eventually timout. But time is
not a synchronization primitive.

Now we use channels to ensure that the condition is still running and
Eventually times out before checking its return value.

The test is also renamed to TestEventuallyTimeout to more clearly show
its purpose.
  • Loading branch information
dolmen committed Oct 16, 2023
1 parent 4ae48e9 commit e8837d5
Showing 1 changed file with 21 additions and 2 deletions.
23 changes: 21 additions & 2 deletions assert/assertions_test.go
Expand Up @@ -2870,12 +2870,31 @@ func TestNeverTrue(t *testing.T) {
False(t, Never(mockT, condition, 100*time.Millisecond, 20*time.Millisecond))
}

func TestEventuallyIssue805(t *testing.T) {
// Check that a long running condition doesn't block Eventually.
// See issue 805 (and its long tail of following issues)
func TestEventuallyTimeout(t *testing.T) {
mockT := new(testing.T)

NotPanics(t, func() {
condition := func() bool { <-time.After(time.Millisecond); return true }
t.Log("start")
done, done2 := make(chan struct{}), make(chan struct{})

// A condition function that returns after the Eventually timeout
condition := func() bool {
t.Log("ok1")
// Wait until Eventually times out and terminates
<-done
close(done2)
t.Log("ok2")
return true
}

False(t, Eventually(mockT, condition, time.Millisecond, time.Microsecond))

t.Log("Eventually done")
close(done)
<-done2
t.Log("Test done")
})
}

Expand Down

0 comments on commit e8837d5

Please sign in to comment.