github.com/derat/nup@v0.0.0-20230418113745-15592ba7c620/test/web/util.go (about)

     1  // Copyright 2021 Daniel Erat.
     2  // All rights reserved.
     3  
     4  package web
     5  
     6  import (
     7  	"fmt"
     8  	"time"
     9  )
    10  
    11  const (
    12  	waitTimeout = 10 * time.Second
    13  	waitSleep   = 10 * time.Millisecond
    14  )
    15  
    16  // wait calls waitFull with reasonable defaults.
    17  func wait(f func() error) error {
    18  	return waitFull(f, waitTimeout, waitSleep)
    19  }
    20  
    21  // waitFull waits up to timeout for f to return nil, sleeping sleep between attempts.
    22  func waitFull(f func() error, timeout time.Duration, sleep time.Duration) error {
    23  	start := time.Now()
    24  	for {
    25  		err := f()
    26  		if err == nil {
    27  			return nil
    28  		}
    29  		if time.Now().Sub(start) >= timeout {
    30  			return fmt.Errorf("timed out: %v", err)
    31  		}
    32  		time.Sleep(sleep)
    33  	}
    34  }