github.com/clusterize-io/tusk@v0.6.3-0.20211001020217-cfe8a8cd0d4a/runner/utils_test.go (about) 1 package runner 2 3 import ( 4 "fmt" 5 "math/rand" 6 "os" 7 "runtime" 8 9 "github.com/clusterize-io/tusk/marshal" 10 ) 11 12 // createOption creates a custom option for testing purposes. 13 func createOption(operators ...func(o *Option)) Option { 14 o := Option{} 15 16 for _, f := range operators { 17 f(&o) 18 } 19 20 return o 21 } 22 23 // withOptionName returns an operator that adds a name to an option. 24 func withOptionName(name string) func(o *Option) { 25 return func(o *Option) { 26 o.Name = name 27 } 28 } 29 30 // withOptionDependency returns an operator that adds a dependency to an option. 31 func withOptionDependency(name string) func(o *Option) { 32 return func(o *Option) { 33 o.DefaultValues = append( 34 o.DefaultValues, 35 Value{ 36 Value: fmt.Sprintf("${%s}", name), 37 }, 38 ) 39 } 40 } 41 42 // withOptionWhenDependency returns an operator that adds a when dependency to an option. 43 func withOptionWhenDependency(name string) func(o *Option) { 44 return func(o *Option) { 45 o.DefaultValues = append( 46 o.DefaultValues, 47 Value{When: WhenList{createWhen(withWhenEqual(name, "true"))}}, 48 ) 49 } 50 } 51 52 // whenTrue is a When that always evaluates to true. 53 var whenTrue = When{} 54 55 // whenFalse is a When that always evaluates to false. 56 var whenFalse = When{OS: marshal.StringList{"fake"}} 57 58 // createWhen creates a custom when for testing purposes. 59 func createWhen(operators ...func(w *When)) When { 60 w := When{} 61 62 for _, f := range operators { 63 f(&w) 64 } 65 66 return w 67 } 68 69 // withWhenCommand returns an operator that runs a given command 70 func withWhenCommand(command string) func(w *When) { 71 return func(w *When) { 72 w.Command = append(w.Command, command) 73 } 74 } 75 76 // withWhenCommandSuccess is an operator that includes a successful command. 77 var withWhenCommandSuccess = func(w *When) { 78 w.Command = append(w.Command, "test 1 = 1") 79 } 80 81 // withWhenCommandFailure is an operator that includes a failed command. 82 var withWhenCommandFailure = func(w *When) { 83 w.Command = append(w.Command, "test 0 = 1") 84 } 85 86 // withWhenExists returns an operator that requires a file to exist. 87 func withWhenExists(filename string) func(w *When) { 88 return func(w *When) { 89 w.Exists = append(w.Exists, filename) 90 } 91 } 92 93 // withWhenNotExists returns an operator that requires a file to not exist. 94 func withWhenNotExists(filename string) func(w *When) { 95 return func(w *When) { 96 w.NotExists = append(w.NotExists, filename) 97 } 98 } 99 100 // withWhenOS returns an operator that requires an arbitrary OS. 101 func withWhenOS(name string) func(w *When) { 102 return func(w *When) { 103 w.OS = append(w.OS, name) 104 } 105 } 106 107 // withWhenOSSuccess is an operator that requires the current OS. 108 var withWhenOSSuccess = func(w *When) { 109 w.OS = append(w.OS, runtime.GOOS) 110 } 111 112 // withWhenOSFailure is an operator that requires the wrong OS. 113 var withWhenOSFailure = func(w *When) { 114 w.OS = append(w.OS, "fake") 115 } 116 117 // withWhenEnv returns an operator that requires an env var to be set. 118 func withWhenEnv(key, value string) func(w *When) { 119 return func(w *When) { 120 ensureEnv(w) 121 w.Environment[key] = append(w.Environment[key], &value) 122 } 123 } 124 125 // withoutWhenEnv returns an operator that requires an env var to be unset. 126 func withoutWhenEnv(key string) func(w *When) { 127 return func(w *When) { 128 ensureEnv(w) 129 w.Environment[key] = append(w.Environment[key], nil) 130 } 131 } 132 133 // withWhenEnvSuccess is an operator that requires a set environment variable. 134 var withWhenEnvSuccess = func(w *When) { 135 ensureEnv(w) 136 key := randomString() 137 value := randomString() 138 os.Setenv(key, value) // nolint: errcheck 139 w.Environment[key] = append(w.Environment[key], &value) 140 } 141 142 // withWhenEnvFailure is an operator that requires a set environment variable. 143 var withWhenEnvFailure = func(w *When) { 144 ensureEnv(w) 145 key := randomString() 146 value := randomString() 147 w.Environment[key] = append(w.Environment[key], &value) 148 } 149 150 // withoutWhenEnvSuccess is an operator that requires an unset environment variable. 151 var withoutWhenEnvSuccess = func(w *When) { 152 ensureEnv(w) 153 key := randomString() 154 w.Environment[key] = append(w.Environment[key], nil) 155 } 156 157 // withoutWhenEnvFailure is an operator that requires an unset environment variable. 158 var withoutWhenEnvFailure = func(w *When) { 159 ensureEnv(w) 160 key := randomString() 161 value := randomString() 162 os.Setenv(key, value) // nolint: errcheck 163 w.Environment[key] = append(w.Environment[key], nil) 164 } 165 166 func randomString() string { 167 letters := []rune("ABCDEFGHIJKLMNOPQRSTUVWXYZ_") 168 a := make([]rune, 20) 169 for i := range a { 170 a[i] = letters[rand.Intn(len(letters))] 171 } 172 return string(a) 173 } 174 175 func ensureEnv(w *When) { 176 if w.Environment == nil { 177 w.Environment = make(map[string]marshal.NullableStringList) 178 } 179 } 180 181 // withWhenEqual returns an operator that requires the key to equal the value. 182 func withWhenEqual(key, value string) func(w *When) { 183 return func(w *When) { 184 if w.Equal == nil { 185 w.Equal = make(map[string]marshal.StringList) 186 } 187 188 w.Equal[key] = append(w.Equal[key], value) 189 } 190 } 191 192 // withWhenNotEqual returns an operator that requires the key to not equal the value. 193 func withWhenNotEqual(key, value string) func(w *When) { 194 return func(w *When) { 195 if w.NotEqual == nil { 196 w.NotEqual = make(map[string]marshal.StringList) 197 } 198 w.NotEqual[key] = append(w.NotEqual[key], value) 199 } 200 }