From b21a692612c00974d777af4552e182994508e2bc Mon Sep 17 00:00:00 2001 From: Madhav Jivrajani Date: Fri, 30 Apr 2021 01:56:25 +0530 Subject: [PATCH] Add validation for names like '-' - Added unit tests for new implementation - Updated godoc Signed-off-by: Madhav Jivrajani --- .../pkg/api/validation/generic.go | 6 +- .../pkg/api/validation/generic_test.go | 65 +++++++++++++++++++ 2 files changed, 69 insertions(+), 2 deletions(-) create mode 100644 staging/src/k8s.io/apimachinery/pkg/api/validation/generic_test.go diff --git a/staging/src/k8s.io/apimachinery/pkg/api/validation/generic.go b/staging/src/k8s.io/apimachinery/pkg/api/validation/generic.go index 947c96f4348..e0b5b14900d 100644 --- a/staging/src/k8s.io/apimachinery/pkg/api/validation/generic.go +++ b/staging/src/k8s.io/apimachinery/pkg/api/validation/generic.go @@ -68,9 +68,11 @@ var ValidateNamespaceName = NameIsDNSLabel var ValidateServiceAccountName = NameIsDNSSubdomain // maskTrailingDash replaces the final character of a string with a subdomain safe -// value if is a dash. +// value if it is a dash and if the length of this string is greater than 1. Note that +// this is used when a value could be appended to the string, see ValidateNameFunc +// for more info. func maskTrailingDash(name string) string { - if strings.HasSuffix(name, "-") { + if len(name) > 1 && strings.HasSuffix(name, "-") { return name[:len(name)-2] + "a" } return name diff --git a/staging/src/k8s.io/apimachinery/pkg/api/validation/generic_test.go b/staging/src/k8s.io/apimachinery/pkg/api/validation/generic_test.go new file mode 100644 index 00000000000..a753cc2b221 --- /dev/null +++ b/staging/src/k8s.io/apimachinery/pkg/api/validation/generic_test.go @@ -0,0 +1,65 @@ +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package validation + +import "testing" + +func TestMaskTrailingDash(t *testing.T) { + testCases := []struct { + beforeMasking string + expectedAfterMasking string + description string + }{ + { + beforeMasking: "", + expectedAfterMasking: "", + description: "empty string", + }, + { + beforeMasking: "-", + expectedAfterMasking: "-", + description: "only a single dash", + }, + { + beforeMasking: "-foo", + expectedAfterMasking: "-foo", + description: "has leading dash", + }, + { + beforeMasking: "-foo-", + expectedAfterMasking: "-foa", + description: "has both leading and trailing dashes", + }, + { + beforeMasking: "b-", + expectedAfterMasking: "a", + description: "has trailing dash", + }, + { + beforeMasking: "ab", + expectedAfterMasking: "ab", + description: "has neither leading nor trailing dashes", + }, + } + + for _, tc := range testCases { + afterMasking := maskTrailingDash(tc.beforeMasking) + if afterMasking != tc.expectedAfterMasking { + t.Errorf("error in test case: %s. expected: %s, actual: %s", tc.description, tc.expectedAfterMasking, afterMasking) + } + } +}