lego/platform/wait/wait_test.go
2025-10-30 13:02:35 +01:00

121 lines
2.1 KiB
Go

package wait
import (
"errors"
"sync/atomic"
"testing"
"time"
"github.com/stretchr/testify/require"
)
// TODO(ldez): rewrite those tests when upgrading to go1.25 as minimum Go version.
func TestFor_timeout(t *testing.T) {
var io atomic.Int64
c := make(chan error)
go func() {
c <- For("test", 3*time.Second, 1*time.Second, func() (bool, error) {
io.Add(1)
if io.Load() == 1 {
return false, nil
}
return false, nil
})
}()
timeout := time.After(6 * time.Second)
select {
case <-timeout:
t.Fatal("timeout exceeded")
case err := <-c:
require.EqualError(t, err, "test: time limit exceeded")
}
require.EqualValues(t, 3, io.Load())
}
func TestFor_timeout_with_error(t *testing.T) {
var io atomic.Int64
c := make(chan error)
go func() {
c <- For("test", 3*time.Second, 1*time.Second, func() (bool, error) {
io.Add(1)
// This allows be sure that the latest previous error is returned.
if io.Load() == 1 {
return false, errors.New("oops")
}
return false, nil
})
}()
timeout := time.After(6 * time.Second)
select {
case <-timeout:
t.Fatal("timeout exceeded")
case err := <-c:
require.EqualError(t, err, "test: time limit exceeded: last error: oops")
}
require.EqualValues(t, 3, io.Load())
}
func TestFor_stop(t *testing.T) {
var io atomic.Int64
c := make(chan error)
go func() {
c <- For("test", 3*time.Second, 1*time.Second, func() (bool, error) {
io.Add(1)
return true, nil
})
}()
timeout := time.After(6 * time.Second)
select {
case <-timeout:
t.Fatal("timeout exceeded")
case err := <-c:
require.NoError(t, err)
}
require.EqualValues(t, 1, io.Load())
}
func TestFor_stop_with_error(t *testing.T) {
var io atomic.Int64
c := make(chan error)
go func() {
c <- For("test", 3*time.Second, 1*time.Second, func() (bool, error) {
io.Add(1)
return true, errors.New("oops")
})
}()
timeout := time.After(6 * time.Second)
select {
case <-timeout:
t.Fatal("timeout exceeded")
case err := <-c:
require.EqualError(t, err, "oops")
}
require.EqualValues(t, 1, io.Load())
}