// Copyright (c) Tailscale Inc & contributors // SPDX-License-Identifier: BSD-3-Clause //go:build !plan9 package kube import ( "strings" "testing" ) func TestTruncateLabelValue(t *testing.T) { tests := []struct { name string input string want string // empty means expect input unchanged }{ { name: "short-value-unchanged", input: "my-service", }, { name: "exactly-63-chars-unchanged", input: strings.Repeat("a", 63), }, { name: "64-chars-gets-truncated", input: strings.Repeat("a", 64), }, { name: "very-long-value-gets-truncated", input: "tailscale-nginx-clickhouse-o11y-server-https-with-extra-long-suffix-that-exceeds-limit", }, { name: "253-chars-max-k8s-resource-name", input: strings.Repeat("x", 253), }, { name: "empty-string-unchanged", input: "", }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { got := TruncateLabelValue(tt.input) if len(got) > 63 { t.Errorf("TruncateLabelValue(%q) = %q (len %d), exceeds 63 chars", tt.input, got, len(got)) } if len(tt.input) <= 63 && got != tt.input { t.Errorf("TruncateLabelValue(%q) = %q, want unchanged input", tt.input, got) } if len(tt.input) > 63 && got == tt.input { t.Errorf("TruncateLabelValue(%q) was not truncated", tt.input) } }) } } func TestTruncateLabelValueDeterministic(t *testing.T) { input := strings.Repeat("a", 100) first := TruncateLabelValue(input) for i := 0; i < 10; i++ { got := TruncateLabelValue(input) if got != first { t.Fatalf("non-deterministic: got %q, want %q", got, first) } } } func TestTruncateLabelValueUniqueness(t *testing.T) { // Two inputs sharing a long prefix but differing at the end should produce different outputs. a := strings.Repeat("a", 100) + "-one" b := strings.Repeat("a", 100) + "-two" if TruncateLabelValue(a) == TruncateLabelValue(b) { t.Errorf("collision: %q and %q produce the same truncated label", a, b) } }