chore: add testutil.Eventually and friends (#3389)

This PR adds a `testutil` function aimed to replace `require.Eventually`.

Before:
```go
require.Eventually(t, func() bool { ... }, testutil.WaitShort, testutil.IntervalFast)
```

After:
```go
require.True(t, testutil.EventuallyShort(t, func(ctx context.Context) bool { ... }))

// or the full incantation if you need more control
ctx, cancel := context.WithTimeout(ctx.Background(), testutil.WaitLong)
require.True(t, testutil.Eventually(t, ctx, func(ctx context.Context) bool { ... }, testutil.IntervalSlow))
```

Co-authored-by: Mathias Fredriksson <mafredri@gmail.com>
This commit is contained in:
Cian Johnston
2022-08-05 16:34:44 +01:00
committed by GitHub
parent 46d64c624a
commit 01fe5e668e
5 changed files with 150 additions and 12 deletions

View File

@ -0,0 +1,70 @@
package testutil_test
import (
"context"
"testing"
"github.com/stretchr/testify/assert"
"go.uber.org/goleak"
"github.com/coder/coder/testutil"
)
func TestMain(m *testing.M) {
goleak.VerifyTestMain(m)
}
func TestEventually(t *testing.T) {
t.Parallel()
t.Run("OK", func(t *testing.T) {
t.Parallel()
state := 0
condition := func(_ context.Context) bool {
defer func() {
state++
}()
return state > 2
}
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitShort)
defer cancel()
testutil.Eventually(ctx, t, condition, testutil.IntervalFast)
})
t.Run("Timeout", func(t *testing.T) {
t.Parallel()
condition := func(_ context.Context) bool {
return false
}
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitShort)
defer cancel()
mockT := new(testing.T)
testutil.Eventually(ctx, mockT, condition, testutil.IntervalFast)
assert.True(t, mockT.Failed())
})
t.Run("Panic", func(t *testing.T) {
t.Parallel()
panicky := func() {
mockT := new(testing.T)
condition := func(_ context.Context) bool { return true }
testutil.Eventually(context.Background(), mockT, condition, testutil.IntervalFast)
}
assert.Panics(t, panicky)
})
t.Run("Short", func(t *testing.T) {
t.Parallel()
testutil.EventuallyShort(t, func(_ context.Context) bool { return true })
})
t.Run("Medium", func(t *testing.T) {
t.Parallel()
testutil.EventuallyMedium(t, func(_ context.Context) bool { return true })
})
t.Run("Long", func(t *testing.T) {
t.Parallel()
testutil.EventuallyLong(t, func(_ context.Context) bool { return true })
})
}