docker/swarmkit

View on GitHub
testutils/poll.go

Summary

Maintainability
A
0 mins
Test Coverage
package testutils

import (
    "time"

    "code.cloudfoundry.org/clock/fakeclock"
    "github.com/pkg/errors"
)

// PollFuncWithTimeout is used to periodically execute a check function, it
// returns error after timeout.
func PollFuncWithTimeout(clockSource *fakeclock.FakeClock, f func() error, timeout time.Duration) error {
    if f() == nil {
        return nil
    }
    timer := time.NewTimer(timeout)
    defer timer.Stop()
    for i := 0; ; i++ {
        if i%5 == 0 && clockSource != nil {
            clockSource.Increment(time.Second)
        }
        err := f()
        if err == nil {
            return nil
        }
        select {
        case <-timer.C:
            return errors.Wrap(err, "polling failed")
        case <-time.After(50 * time.Millisecond):
        }
    }
}

// PollFunc is like PollFuncWithTimeout with timeout=10s.
func PollFunc(clockSource *fakeclock.FakeClock, f func() error) error {
    return PollFuncWithTimeout(clockSource, f, 10*time.Second)
}