| 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)) |
| } |