blob: 0457b1e8eb80aa60b0b86e7e29e9b7db084f1f37 [file] [log] [blame]
Serge Bazanski1f789542024-05-22 14:01:50 +02001package node
2
3import (
4 "errors"
5 "testing"
Serge Bazanskidd2b80f2024-09-24 13:06:27 +00006
7 "k8s.io/apimachinery/pkg/util/validation"
Serge Bazanski1f789542024-05-22 14:01:50 +02008)
9
Serge Bazanskidd2b80f2024-09-24 13:06:27 +000010func 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är690c42d2024-11-21 12:10:53 +010025 {"_internal.example.com/annotation", errDomainNameInvalid},
26 {"./annotation", errDomainNameInvalid},
27 {"../annotation", errDomainNameInvalid},
28 {"tcp:80.example.com/annotation", errDomainNameInvalid},
29 {"80/annotation", errDomainNameEndsInNumber},
Serge Bazanskidd2b80f2024-09-24 13:06:27 +000030 {"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är690c42d2024-11-21 12:10:53 +010035 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 Bazanskidd2b80f2024-09-24 13:06:27 +000040 }
41}
42
43func TestValidateLabelValue(t *testing.T) {
Serge Bazanski1f789542024-05-22 14:01:50 +020044 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 Bazanskidd2b80f2024-09-24 13:06:27 +000053 {"", nil},
Serge Bazanski1f789542024-05-22 14:01:50 +020054 {"accordingtoallknownlawsofaviationthereisnowaythatabeeshouldbeabletofly", ErrLabelTooLong},
55 {"example.com/annotation", ErrLabelInvalidCharacter},
Serge Bazanskidd2b80f2024-09-24 13:06:27 +000056 {"/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 Bazanski1f789542024-05-22 14:01:50 +020062 } {
Serge Bazanskidd2b80f2024-09-24 13:06:27 +000063 // 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 Bazanski1f789542024-05-22 14:01:50 +020070 }
71 }
72}