| Serge Bazanski | 1f78954 | 2024-05-22 14:01:50 +0200 | [diff] [blame] | 1 | package node |
| 2 | |
| 3 | import ( |
| 4 | "errors" |
| 5 | "testing" |
| Serge Bazanski | dd2b80f | 2024-09-24 13:06:27 +0000 | [diff] [blame] | 6 | |
| 7 | "k8s.io/apimachinery/pkg/util/validation" |
| Serge Bazanski | 1f78954 | 2024-05-22 14:01:50 +0200 | [diff] [blame] | 8 | ) |
| 9 | |
| Serge Bazanski | dd2b80f | 2024-09-24 13:06:27 +0000 | [diff] [blame] | 10 | func TestValidateLabelKey(t *testing.T) { |
| 11 | for i, te := range []struct { |
| 12 | in string |
| 13 | want error |
| 14 | }{ |
| 15 | {"foo", nil}, |
| 16 | {"example.com/", ErrLabelEmpty}, |
| 17 | {"foo-bar.baz_barfoo", nil}, |
| 18 | {"-", ErrLabelInvalidFirstCharacter}, |
| 19 | {"-invalid", ErrLabelInvalidFirstCharacter}, |
| 20 | {"invalid-", ErrLabelInvalidLastCharacter}, |
| 21 | {"", ErrLabelEmpty}, |
| 22 | {"accordingtoallknownlawsofaviationthereisnowaythatabeeshouldbeabletofly", ErrLabelTooLong}, |
| 23 | {"example.com/annotation", nil}, |
| 24 | {"/annotation", ErrLabelEmptyPrefix}, |
| Jan Schär | 690c42d | 2024-11-21 12:10:53 +0100 | [diff] [blame^] | 25 | {"_internal.example.com/annotation", errDomainNameInvalid}, |
| 26 | {"./annotation", errDomainNameInvalid}, |
| 27 | {"../annotation", errDomainNameInvalid}, |
| 28 | {"tcp:80.example.com/annotation", errDomainNameInvalid}, |
| 29 | {"80/annotation", errDomainNameEndsInNumber}, |
| Serge Bazanski | dd2b80f | 2024-09-24 13:06:27 +0000 | [diff] [blame] | 30 | {"github.com/monogon-dev/monogon/annotation", ErrLabelInvalidPrefix}, |
| 31 | } { |
| 32 | if got := ValidateLabelKey(te.in); !errors.Is(got, te.want) { |
| 33 | t.Errorf("%d (%q): wanted %v, got %v", i, te.in, te.want, got) |
| 34 | } |
| Jan Schär | 690c42d | 2024-11-21 12:10:53 +0100 | [diff] [blame^] | 35 | if ValidateLabelKey(te.in) == nil { |
| 36 | if errs := validation.IsQualifiedName(te.in); len(errs) != 0 { |
| 37 | t.Errorf("%d (%q): is not a valid Kubernetes qualified name: %v", i, te.in, errs) |
| 38 | } |
| 39 | } |
| Serge Bazanski | dd2b80f | 2024-09-24 13:06:27 +0000 | [diff] [blame] | 40 | } |
| 41 | } |
| 42 | |
| 43 | func TestValidateLabelValue(t *testing.T) { |
| Serge Bazanski | 1f78954 | 2024-05-22 14:01:50 +0200 | [diff] [blame] | 44 | for i, te := range []struct { |
| 45 | in string |
| 46 | want error |
| 47 | }{ |
| 48 | {"foo", nil}, |
| 49 | {"foo-bar.baz_barfoo", nil}, |
| 50 | {"-", ErrLabelInvalidFirstCharacter}, |
| 51 | {"-invalid", ErrLabelInvalidFirstCharacter}, |
| 52 | {"invalid-", ErrLabelInvalidLastCharacter}, |
| Serge Bazanski | dd2b80f | 2024-09-24 13:06:27 +0000 | [diff] [blame] | 53 | {"", nil}, |
| Serge Bazanski | 1f78954 | 2024-05-22 14:01:50 +0200 | [diff] [blame] | 54 | {"accordingtoallknownlawsofaviationthereisnowaythatabeeshouldbeabletofly", ErrLabelTooLong}, |
| 55 | {"example.com/annotation", ErrLabelInvalidCharacter}, |
| Serge Bazanski | dd2b80f | 2024-09-24 13:06:27 +0000 | [diff] [blame] | 56 | {"/annotation", ErrLabelInvalidFirstCharacter}, |
| 57 | {"_internal.example.com/annotation", ErrLabelInvalidFirstCharacter}, |
| 58 | {"./annotation", ErrLabelInvalidFirstCharacter}, |
| 59 | {"../annotation", ErrLabelInvalidFirstCharacter}, |
| 60 | {"tcp:80.example.com/annotation", ErrLabelInvalidCharacter}, |
| 61 | {"github.com/monogon-dev/monogon/annotation", ErrLabelInvalidCharacter}, |
| Serge Bazanski | 1f78954 | 2024-05-22 14:01:50 +0200 | [diff] [blame] | 62 | } { |
| Serge Bazanski | dd2b80f | 2024-09-24 13:06:27 +0000 | [diff] [blame] | 63 | // Test our implementation against test cases. |
| 64 | if got := ValidateLabelValue(te.in); !errors.Is(got, te.want) { |
| 65 | t.Errorf("%d (%q): wanted %v, got %v", i, te.in, te.want, got) |
| 66 | } |
| 67 | // Validate test cases against Kubernetes. |
| 68 | if errs := validation.IsValidLabelValue(te.in); (te.want == nil) != (len(errs) == 0) { |
| 69 | t.Errorf("%d (%q): wanted %v, kubernetes implementation returned %v", i, te.in, te.want, errs) |
| Serge Bazanski | 1f78954 | 2024-05-22 14:01:50 +0200 | [diff] [blame] | 70 | } |
| 71 | } |
| 72 | } |