blob: 530bbfa6e4210cfceeb1ed436784abf984c13672 [file] [log] [blame]
Tim Windelschmidt6d33a432025-02-04 14:34:25 +01001// Copyright The Monogon Project Authors.
2// SPDX-License-Identifier: Apache-2.0
3
Serge Bazanski1f789542024-05-22 14:01:50 +02004package node
5
6import (
7 "errors"
8 "testing"
Serge Bazanskidd2b80f2024-09-24 13:06:27 +00009
10 "k8s.io/apimachinery/pkg/util/validation"
Serge Bazanski1f789542024-05-22 14:01:50 +020011)
12
Serge Bazanskidd2b80f2024-09-24 13:06:27 +000013func TestValidateLabelKey(t *testing.T) {
14 for i, te := range []struct {
15 in string
16 want error
17 }{
18 {"foo", nil},
19 {"example.com/", ErrLabelEmpty},
20 {"foo-bar.baz_barfoo", nil},
21 {"-", ErrLabelInvalidFirstCharacter},
22 {"-invalid", ErrLabelInvalidFirstCharacter},
23 {"invalid-", ErrLabelInvalidLastCharacter},
24 {"", ErrLabelEmpty},
25 {"accordingtoallknownlawsofaviationthereisnowaythatabeeshouldbeabletofly", ErrLabelTooLong},
26 {"example.com/annotation", nil},
27 {"/annotation", ErrLabelEmptyPrefix},
Jan Schär690c42d2024-11-21 12:10:53 +010028 {"_internal.example.com/annotation", errDomainNameInvalid},
29 {"./annotation", errDomainNameInvalid},
30 {"../annotation", errDomainNameInvalid},
31 {"tcp:80.example.com/annotation", errDomainNameInvalid},
32 {"80/annotation", errDomainNameEndsInNumber},
Leopold Schabel77bf7542025-06-23 11:26:31 +020033 {"github.com/monogon/monogon/annotation", ErrLabelInvalidPrefix},
Serge Bazanskidd2b80f2024-09-24 13:06:27 +000034 } {
35 if got := ValidateLabelKey(te.in); !errors.Is(got, te.want) {
36 t.Errorf("%d (%q): wanted %v, got %v", i, te.in, te.want, got)
37 }
Jan Schär690c42d2024-11-21 12:10:53 +010038 if ValidateLabelKey(te.in) == nil {
39 if errs := validation.IsQualifiedName(te.in); len(errs) != 0 {
40 t.Errorf("%d (%q): is not a valid Kubernetes qualified name: %v", i, te.in, errs)
41 }
42 }
Serge Bazanskidd2b80f2024-09-24 13:06:27 +000043 }
44}
45
46func TestValidateLabelValue(t *testing.T) {
Serge Bazanski1f789542024-05-22 14:01:50 +020047 for i, te := range []struct {
48 in string
49 want error
50 }{
51 {"foo", nil},
52 {"foo-bar.baz_barfoo", nil},
53 {"-", ErrLabelInvalidFirstCharacter},
54 {"-invalid", ErrLabelInvalidFirstCharacter},
55 {"invalid-", ErrLabelInvalidLastCharacter},
Serge Bazanskidd2b80f2024-09-24 13:06:27 +000056 {"", nil},
Serge Bazanski1f789542024-05-22 14:01:50 +020057 {"accordingtoallknownlawsofaviationthereisnowaythatabeeshouldbeabletofly", ErrLabelTooLong},
58 {"example.com/annotation", ErrLabelInvalidCharacter},
Serge Bazanskidd2b80f2024-09-24 13:06:27 +000059 {"/annotation", ErrLabelInvalidFirstCharacter},
60 {"_internal.example.com/annotation", ErrLabelInvalidFirstCharacter},
61 {"./annotation", ErrLabelInvalidFirstCharacter},
62 {"../annotation", ErrLabelInvalidFirstCharacter},
63 {"tcp:80.example.com/annotation", ErrLabelInvalidCharacter},
Leopold Schabel77bf7542025-06-23 11:26:31 +020064 {"github.com/monogon/monogon/annotation", ErrLabelInvalidCharacter},
Serge Bazanski1f789542024-05-22 14:01:50 +020065 } {
Serge Bazanskidd2b80f2024-09-24 13:06:27 +000066 // Test our implementation against test cases.
67 if got := ValidateLabelValue(te.in); !errors.Is(got, te.want) {
68 t.Errorf("%d (%q): wanted %v, got %v", i, te.in, te.want, got)
69 }
70 // Validate test cases against Kubernetes.
71 if errs := validation.IsValidLabelValue(te.in); (te.want == nil) != (len(errs) == 0) {
72 t.Errorf("%d (%q): wanted %v, kubernetes implementation returned %v", i, te.in, te.want, errs)
Serge Bazanski1f789542024-05-22 14:01:50 +020073 }
74 }
75}