@@ -427,6 +427,99 @@ func TestValidateConditions(t *testing.T) {
427427 }
428428}
429429
430+ func TestLabelSelectorMatchExpression (t * testing.T ) {
431+ // Success case
432+ testCases := []struct {
433+ name string
434+ labelSelector * metav1.LabelSelector
435+ wantErrorNumber int
436+ validateErrs func (t * testing.T , errs field.ErrorList )
437+ }{
438+ {
439+ name : "Valid LabelSelector" ,
440+ labelSelector : & metav1.LabelSelector {
441+ MatchExpressions : []metav1.LabelSelectorRequirement {
442+ {
443+ Key : "key" ,
444+ Operator : metav1 .LabelSelectorOpIn ,
445+ Values : []string {"value" },
446+ },
447+ },
448+ },
449+ wantErrorNumber : 0 ,
450+ validateErrs : nil ,
451+ },
452+ {
453+ name : "MatchExpression's key name isn't valid" ,
454+ labelSelector : & metav1.LabelSelector {
455+ MatchExpressions : []metav1.LabelSelectorRequirement {
456+ {
457+ Key : "-key" ,
458+ Operator : metav1 .LabelSelectorOpIn ,
459+ Values : []string {"value" },
460+ },
461+ },
462+ },
463+ wantErrorNumber : 1 ,
464+ validateErrs : func (t * testing.T , errs field.ErrorList ) {
465+ errMessage := "name part must consist of alphanumeric characters"
466+ if ! partStringInErrorMessage (errs , errMessage ) {
467+ t .Errorf ("missing %q in\n %v" , errMessage , errorsAsString (errs ))
468+ }
469+ },
470+ },
471+ {
472+ name : "MatchExpression's operator isn't valid" ,
473+ labelSelector : & metav1.LabelSelector {
474+ MatchExpressions : []metav1.LabelSelectorRequirement {
475+ {
476+ Key : "key" ,
477+ Operator : "abc" ,
478+ Values : []string {"value" },
479+ },
480+ },
481+ },
482+ wantErrorNumber : 1 ,
483+ validateErrs : func (t * testing.T , errs field.ErrorList ) {
484+ errMessage := "not a valid selector operator"
485+ if ! partStringInErrorMessage (errs , errMessage ) {
486+ t .Errorf ("missing %q in\n %v" , errMessage , errorsAsString (errs ))
487+ }
488+ },
489+ },
490+ {
491+ name : "MatchExpression's value name isn't valid" ,
492+ labelSelector : & metav1.LabelSelector {
493+ MatchExpressions : []metav1.LabelSelectorRequirement {
494+ {
495+ Key : "key" ,
496+ Operator : metav1 .LabelSelectorOpIn ,
497+ Values : []string {"-value" },
498+ },
499+ },
500+ },
501+ wantErrorNumber : 1 ,
502+ validateErrs : func (t * testing.T , errs field.ErrorList ) {
503+ errMessage := "a valid label must be an empty string or consist of"
504+ if ! partStringInErrorMessage (errs , errMessage ) {
505+ t .Errorf ("missing %q in\n %v" , errMessage , errorsAsString (errs ))
506+ }
507+ },
508+ },
509+ }
510+ for index , testCase := range testCases {
511+ t .Run (testCase .name , func (t * testing.T ) {
512+ allErrs := ValidateLabelSelector (testCase .labelSelector , LabelSelectorValidationOptions {false }, field .NewPath ("labelSelector" ))
513+ if len (allErrs ) != testCase .wantErrorNumber {
514+ t .Errorf ("case[%d]: expected failure" , index )
515+ }
516+ if len (allErrs ) >= 1 && testCase .validateErrs != nil {
517+ testCase .validateErrs (t , allErrs )
518+ }
519+ })
520+ }
521+ }
522+
430523func hasError (errs field.ErrorList , needle string ) bool {
431524 for _ , curr := range errs {
432525 if curr .Error () == needle {
@@ -445,6 +538,15 @@ func hasPrefixError(errs field.ErrorList, prefix string) bool {
445538 return false
446539}
447540
541+ func partStringInErrorMessage (errs field.ErrorList , prefix string ) bool {
542+ for _ , curr := range errs {
543+ if strings .Contains (curr .Error (), prefix ) {
544+ return true
545+ }
546+ }
547+ return false
548+ }
549+
448550func errorsAsString (errs field.ErrorList ) string {
449551 messages := []string {}
450552 for _ , curr := range errs {
0 commit comments