| package tools | 
 |  | 
 | import ( | 
 | 	"crypto/rand" | 
 | 	"encoding/json" | 
 | 	"errors" | 
 | 	mrand "math/rand" | 
 | 	"testing" | 
 | 	"time" | 
 | ) | 
 |  | 
 | // ErrTimeout is returned if WaitFor takes longer than 300 second to happen. | 
 | var ErrTimeout = errors.New("Timed out") | 
 |  | 
 | // WaitFor polls a predicate function once per second to wait for a certain state to arrive. | 
 | func WaitFor(predicate func() (bool, error)) error { | 
 | 	for i := 0; i < 300; i++ { | 
 | 		time.Sleep(1 * time.Second) | 
 |  | 
 | 		satisfied, err := predicate() | 
 | 		if err != nil { | 
 | 			return err | 
 | 		} | 
 | 		if satisfied { | 
 | 			return nil | 
 | 		} | 
 | 	} | 
 | 	return ErrTimeout | 
 | } | 
 |  | 
 | // MakeNewPassword generates a new string that's guaranteed to be different than the given one. | 
 | func MakeNewPassword(oldPass string) string { | 
 | 	randomPassword := RandomString("", 16) | 
 | 	for randomPassword == oldPass { | 
 | 		randomPassword = RandomString("", 16) | 
 | 	} | 
 | 	return randomPassword | 
 | } | 
 |  | 
 | // RandomString generates a string of given length, but random content. | 
 | // All content will be within the ASCII graphic character set. | 
 | // (Implementation from Even Shaw's contribution on | 
 | // http://stackoverflow.com/questions/12771930/what-is-the-fastest-way-to-generate-a-long-random-string-in-go). | 
 | func RandomString(prefix string, n int) string { | 
 | 	const alphanum = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" | 
 | 	var bytes = make([]byte, n) | 
 | 	rand.Read(bytes) | 
 | 	for i, b := range bytes { | 
 | 		bytes[i] = alphanum[b%byte(len(alphanum))] | 
 | 	} | 
 | 	return prefix + string(bytes) | 
 | } | 
 |  | 
 | // RandomInt will return a random integer between a specified range. | 
 | func RandomInt(min, max int) int { | 
 | 	mrand.Seed(time.Now().Unix()) | 
 | 	return mrand.Intn(max-min) + min | 
 | } | 
 |  | 
 | // Elide returns the first bit of its input string with a suffix of "..." if it's longer than | 
 | // a comfortable 40 characters. | 
 | func Elide(value string) string { | 
 | 	if len(value) > 40 { | 
 | 		return value[0:37] + "..." | 
 | 	} | 
 | 	return value | 
 | } | 
 |  | 
 | // PrintResource returns a resource as a readable structure | 
 | func PrintResource(t *testing.T, resource interface{}) { | 
 | 	b, _ := json.MarshalIndent(resource, "", "  ") | 
 | 	t.Logf(string(b)) | 
 | } |