mirror of
https://github.com/opentffoundation/opentf.git
synced 2026-05-23 22:00:54 -04:00
helper/resource: RetryError for quitting quickly
This commit is contained in:
@@ -18,14 +18,29 @@ func Retry(timeout time.Duration, f RetryFunc) error {
|
||||
MinTimeout: 500 * time.Millisecond,
|
||||
Refresh: func() (interface{}, string, error) {
|
||||
err = f()
|
||||
if err != nil {
|
||||
return 42, "error", nil
|
||||
if err == nil {
|
||||
return 42, "success", nil
|
||||
}
|
||||
|
||||
return 42, "success", nil
|
||||
if rerr, ok := err.(RetryError); ok {
|
||||
err = rerr.Err
|
||||
return nil, "quit", err
|
||||
}
|
||||
|
||||
return 42, "error", nil
|
||||
},
|
||||
}
|
||||
|
||||
c.WaitForState()
|
||||
return err
|
||||
}
|
||||
|
||||
// RetryError, if returned, will quit the retry immediately with the
|
||||
// Err.
|
||||
type RetryError struct {
|
||||
Err error
|
||||
}
|
||||
|
||||
func (e RetryError) Error() string {
|
||||
return e.Err.Error()
|
||||
}
|
||||
|
||||
@@ -37,3 +37,26 @@ func TestRetry_timeout(t *testing.T) {
|
||||
t.Fatal("should error")
|
||||
}
|
||||
}
|
||||
|
||||
func TestRetry_error(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
expected := fmt.Errorf("nope")
|
||||
f := func() error {
|
||||
return RetryError{expected}
|
||||
}
|
||||
|
||||
errCh := make(chan error)
|
||||
go func() {
|
||||
errCh <- Retry(1*time.Second, f)
|
||||
}()
|
||||
|
||||
select {
|
||||
case err := <-errCh:
|
||||
if err != expected {
|
||||
t.Fatalf("bad: %#v", err)
|
||||
}
|
||||
case <-time.After(5 * time.Second):
|
||||
t.Fatal("timeout")
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user