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 }