func TestEnsureValidUniqueName(t *testing.T) { chars := []byte("abcdefghijk") longBytes := []byte{} for i := 0; i < (util.DNS1123SubdomainMaxLength + 20); i++ { longBytes = append(longBytes, chars[i%len(chars)]) } longName := string(longBytes) tests := []struct { name string input []string expected []string expectError bool }{ { name: "duplicate names", input: []string{"one", "two", "three", "one", "one", "two"}, expected: []string{"one", "two", "three", "one-1", "one-2", "two-1"}, }, { name: "mixed case names", input: []string{"One", "ONE", "tWo"}, expected: []string{"one", "one-1", "two"}, }, { name: "short name", input: []string{"t"}, expectError: true, }, { name: "long name", input: []string{longName, longName, longName}, expected: []string{longName[:util.DNS1123SubdomainMaxLength], namer.GetName(longName[:util.DNS1123SubdomainMaxLength], "1", util.DNS1123SubdomainMaxLength), namer.GetName(longName[:util.DNS1123SubdomainMaxLength], "2", util.DNS1123SubdomainMaxLength), }, }, } tests: for _, test := range tests { result := []string{} names := make(map[string]int) for _, i := range test.input { name, err := ensureValidUniqueName(names, i) if err != nil && !test.expectError { t.Errorf("%s: unexpected error: %v", test.name, err) } if err == nil && test.expectError { t.Errorf("%s: did not get an error.", test.name) } if err != nil { continue tests } result = append(result, name) } if !reflect.DeepEqual(result, test.expected) { t.Errorf("%s: unexpected output. Expected: %#v, Got: %#v", test.name, test.expected, result) } } }
func ensureValidUniqueName(names map[string]int, name string) (string, error) { // Ensure that name meets length requirements if len(name) < 2 { return "", fmt.Errorf("invalid name: %s", name) } if len(name) > util.DNS1123SubdomainMaxLength { glog.V(4).Infof("Trimming %s to maximum allowable length (%d)\n", name, util.DNS1123SubdomainMaxLength) name = name[:util.DNS1123SubdomainMaxLength] } // Make all names lowercase name = strings.ToLower(name) count, existing := names[name] if !existing { names[name] = 0 return name, nil } count++ names[name] = count newName := namer.GetName(name, strconv.Itoa(count), util.DNS1123SubdomainMaxLength) return newName, nil }