github.com/mattyr/nomad@v0.3.3-0.20160919021406-3485a065154a/testutil/wait.go (about)

     1  package testutil
     2  
     3  import (
     4  	"os"
     5  	"testing"
     6  	"time"
     7  
     8  	"github.com/hashicorp/nomad/nomad/structs"
     9  )
    10  
    11  const (
    12  	// TravisRunEnv is an environment variable that is set if being run by
    13  	// Travis.
    14  	TravisRunEnv = "CI"
    15  )
    16  
    17  type testFn func() (bool, error)
    18  type errorFn func(error)
    19  
    20  func WaitForResult(test testFn, error errorFn) {
    21  	WaitForResultRetries(2000*TestMultiplier(), test, error)
    22  }
    23  
    24  func WaitForResultRetries(retries int64, test testFn, error errorFn) {
    25  	for retries > 0 {
    26  		time.Sleep(10 * time.Millisecond)
    27  		retries--
    28  
    29  		success, err := test()
    30  		if success {
    31  			return
    32  		}
    33  
    34  		if retries == 0 {
    35  			error(err)
    36  		}
    37  	}
    38  }
    39  
    40  // TestMultiplier returns a multiplier for retries and waits given environment
    41  // the tests are being run under.
    42  func TestMultiplier() int64 {
    43  	if IsTravis() {
    44  		return 3
    45  	}
    46  
    47  	return 1
    48  }
    49  
    50  func IsTravis() bool {
    51  	_, ok := os.LookupEnv(TravisRunEnv)
    52  	return ok
    53  }
    54  
    55  type rpcFn func(string, interface{}, interface{}) error
    56  
    57  func WaitForLeader(t *testing.T, rpc rpcFn) {
    58  	WaitForResult(func() (bool, error) {
    59  		args := &structs.GenericRequest{}
    60  		var leader string
    61  		err := rpc("Status.Leader", args, &leader)
    62  		return leader != "", err
    63  	}, func(err error) {
    64  		t.Fatalf("failed to find leader: %v", err)
    65  	})
    66  }