@@ -171,6 +171,148 @@ func TestRef_Invalid(t *testing.T) {
171171 }
172172}
173173
174+ func TestStepOnError (t * testing.T ) {
175+ tests := []struct {
176+ name string
177+ params []v1.ParamSpec
178+ step v1.Step
179+ expectedError * apis.FieldError
180+ }{{
181+ name : "valid step - valid onError usage - set to continue" ,
182+ step : v1.Step {
183+ OnError : v1 .Continue ,
184+ Image : "image" ,
185+ Args : []string {"arg" },
186+ },
187+ }, {
188+ name : "valid step - valid onError usage - set to stopAndFail" ,
189+ step : v1.Step {
190+ OnError : v1 .StopAndFail ,
191+ Image : "image" ,
192+ Args : []string {"arg" },
193+ },
194+ }, {
195+ name : "valid step - valid onError usage - set to a task parameter" ,
196+ params : []v1.ParamSpec {{
197+ Name : "CONTINUE" ,
198+ Default : & v1.ParamValue {Type : v1 .ParamTypeString , StringVal : string (v1 .Continue )},
199+ }},
200+ step : v1.Step {
201+ OnError : "$(params.CONTINUE)" ,
202+ Image : "image" ,
203+ Args : []string {"arg" },
204+ },
205+ }, {
206+ name : "invalid step - onError set to invalid value" ,
207+ step : v1.Step {
208+ OnError : "onError" ,
209+ Image : "image" ,
210+ Args : []string {"arg" },
211+ },
212+ expectedError : & apis.FieldError {
213+ Message : `invalid value: "onError"` ,
214+ Paths : []string {"onError" },
215+ Details : `Task step onError must be either "continue" or "stopAndFail"` ,
216+ },
217+ }}
218+ for _ , st := range tests {
219+ t .Run (st .name , func (t * testing.T ) {
220+ ctx := context .Background ()
221+ err := st .step .Validate (ctx )
222+ if st .expectedError == nil && err != nil {
223+ t .Errorf ("No error expected from Step.Validate() but got = %v" , err )
224+ } else if st .expectedError != nil {
225+ if err == nil {
226+ t .Errorf ("Expected error from Step.Validate() = %v, but got none" , st .expectedError )
227+ } else if d := cmp .Diff (st .expectedError .Error (), err .Error ()); d != "" {
228+ t .Errorf ("returned error from Step.Validate() does not match with the expected error: %s" , diff .PrintWantGot (d ))
229+ }
230+ }
231+ })
232+ }
233+ }
234+
235+ // TestStepIncompatibleAPIVersions exercises validation of fields in a Step
236+ // that require a specific feature gate version in order to work.
237+ func TestStepIncompatibleAPIVersions (t * testing.T ) {
238+ versions := []string {"alpha" , "beta" , "stable" }
239+ isStricterThen := func (first , second string ) bool {
240+ // assume values are in order alpha (less strict), beta, stable (strictest)
241+ // return true if first is stricter then second
242+ switch first {
243+ case second , "alpha" :
244+ return false
245+ case "stable" :
246+ return true
247+ default :
248+ // first is beta, true is second is alpha, false is second is stable
249+ return second == "alpha"
250+ }
251+ }
252+
253+ for _ , st := range []struct {
254+ name string
255+ requiredVersion string
256+ step v1.Step
257+ }{
258+ {
259+ name : "windows script support requires alpha" ,
260+ requiredVersion : "alpha" ,
261+ step : v1.Step {
262+ Image : "my-image" ,
263+ Script : `
264+ #!win powershell -File
265+ script-1` ,
266+ },
267+ }, {
268+ name : "stdout stream support requires alpha" ,
269+ requiredVersion : "alpha" ,
270+ step : v1.Step {
271+ Image : "foo" ,
272+ StdoutConfig : & v1.StepOutputConfig {
273+ Path : "/tmp/stdout.txt" ,
274+ },
275+ },
276+ }, {
277+ name : "stderr stream support requires alpha" ,
278+ requiredVersion : "alpha" ,
279+ step : v1.Step {
280+ Image : "foo" ,
281+ StderrConfig : & v1.StepOutputConfig {
282+ Path : "/tmp/stderr.txt" ,
283+ },
284+ },
285+ },
286+ } {
287+ for _ , version := range versions {
288+ testName := fmt .Sprintf ("(using %s) %s" , version , st .name )
289+ t .Run (testName , func (t * testing.T ) {
290+ ctx := context .Background ()
291+ if version == "alpha" {
292+ ctx = cfgtesting .EnableAlphaAPIFields (ctx )
293+ }
294+ if version == "beta" {
295+ ctx = cfgtesting .EnableBetaAPIFields (ctx )
296+ }
297+ if version == "stable" {
298+ ctx = cfgtesting .EnableStableAPIFields (ctx )
299+ }
300+ err := st .step .Validate (ctx )
301+
302+ // If the configured version is stricter than the required one, we expect an error
303+ if isStricterThen (version , st .requiredVersion ) && err == nil {
304+ t .Fatalf ("no error received even though version required is %q while feature gate is %q" , st .requiredVersion , version )
305+ }
306+
307+ // If the configured version is more permissive than the required one, we expect no error
308+ if isStricterThen (st .requiredVersion , version ) && err != nil {
309+ t .Fatalf ("error received despite required version and feature gate matching %q: %v" , version , err )
310+ }
311+ })
312+ }
313+ }
314+ }
315+
174316func TestSidecarValidate (t * testing.T ) {
175317 tests := []struct {
176318 name string
0 commit comments