github.com/spotmaxtech/k8s-apimachinery-v0260@v0.0.1/pkg/util/validation/validation_test.go (about)

     1  /*
     2  Copyright 2014 The Kubernetes Authors.
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8      http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    16  
    17  package validation
    18  
    19  import (
    20  	"strings"
    21  	"testing"
    22  
    23  	"github.com/spotmaxtech/k8s-apimachinery-v0260/pkg/util/validation/field"
    24  )
    25  
    26  func TestIsDNS1123Label(t *testing.T) {
    27  	goodValues := []string{
    28  		"a", "ab", "abc", "a1", "a-1", "a--1--2--b",
    29  		"0", "01", "012", "1a", "1-a", "1--a--b--2",
    30  		strings.Repeat("a", 63),
    31  	}
    32  	for _, val := range goodValues {
    33  		if msgs := IsDNS1123Label(val); len(msgs) != 0 {
    34  			t.Errorf("expected true for '%s': %v", val, msgs)
    35  		}
    36  	}
    37  
    38  	badValues := []string{
    39  		"", "A", "ABC", "aBc", "A1", "A-1", "1-A",
    40  		"-", "a-", "-a", "1-", "-1",
    41  		"_", "a_", "_a", "a_b", "1_", "_1", "1_2",
    42  		".", "a.", ".a", "a.b", "1.", ".1", "1.2",
    43  		" ", "a ", " a", "a b", "1 ", " 1", "1 2",
    44  		strings.Repeat("a", 64),
    45  	}
    46  	for _, val := range badValues {
    47  		if msgs := IsDNS1123Label(val); len(msgs) == 0 {
    48  			t.Errorf("expected false for '%s'", val)
    49  		}
    50  	}
    51  }
    52  
    53  func TestIsDNS1123Subdomain(t *testing.T) {
    54  	goodValues := []string{
    55  		"a", "ab", "abc", "a1", "a-1", "a--1--2--b",
    56  		"0", "01", "012", "1a", "1-a", "1--a--b--2",
    57  		"a.a", "ab.a", "abc.a", "a1.a", "a-1.a", "a--1--2--b.a",
    58  		"a.1", "ab.1", "abc.1", "a1.1", "a-1.1", "a--1--2--b.1",
    59  		"0.a", "01.a", "012.a", "1a.a", "1-a.a", "1--a--b--2",
    60  		"0.1", "01.1", "012.1", "1a.1", "1-a.1", "1--a--b--2.1",
    61  		"a.b.c.d.e", "aa.bb.cc.dd.ee", "1.2.3.4.5", "11.22.33.44.55",
    62  		strings.Repeat("a", 253),
    63  	}
    64  	for _, val := range goodValues {
    65  		if msgs := IsDNS1123Subdomain(val); len(msgs) != 0 {
    66  			t.Errorf("expected true for '%s': %v", val, msgs)
    67  		}
    68  	}
    69  
    70  	badValues := []string{
    71  		"", "A", "ABC", "aBc", "A1", "A-1", "1-A",
    72  		"-", "a-", "-a", "1-", "-1",
    73  		"_", "a_", "_a", "a_b", "1_", "_1", "1_2",
    74  		".", "a.", ".a", "a..b", "1.", ".1", "1..2",
    75  		" ", "a ", " a", "a b", "1 ", " 1", "1 2",
    76  		"A.a", "aB.a", "ab.A", "A1.a", "a1.A",
    77  		"A.1", "aB.1", "A1.1", "1A.1",
    78  		"0.A", "01.A", "012.A", "1A.a", "1a.A",
    79  		"A.B.C.D.E", "AA.BB.CC.DD.EE", "a.B.c.d.e", "aa.bB.cc.dd.ee",
    80  		"a@b", "a,b", "a_b", "a;b",
    81  		"a:b", "a%b", "a?b", "a$b",
    82  		strings.Repeat("a", 254),
    83  	}
    84  	for _, val := range badValues {
    85  		if msgs := IsDNS1123Subdomain(val); len(msgs) == 0 {
    86  			t.Errorf("expected false for '%s'", val)
    87  		}
    88  	}
    89  }
    90  
    91  func TestIsDNS1035Label(t *testing.T) {
    92  	goodValues := []string{
    93  		"a", "ab", "abc", "a1", "a-1", "a--1--2--b",
    94  		strings.Repeat("a", 63),
    95  	}
    96  	for _, val := range goodValues {
    97  		if msgs := IsDNS1035Label(val); len(msgs) != 0 {
    98  			t.Errorf("expected true for '%s': %v", val, msgs)
    99  		}
   100  	}
   101  
   102  	badValues := []string{
   103  		"0", "01", "012", "1a", "1-a", "1--a--b--2",
   104  		"", "A", "ABC", "aBc", "A1", "A-1", "1-A",
   105  		"-", "a-", "-a", "1-", "-1",
   106  		"_", "a_", "_a", "a_b", "1_", "_1", "1_2",
   107  		".", "a.", ".a", "a.b", "1.", ".1", "1.2",
   108  		" ", "a ", " a", "a b", "1 ", " 1", "1 2",
   109  		strings.Repeat("a", 64),
   110  	}
   111  	for _, val := range badValues {
   112  		if msgs := IsDNS1035Label(val); len(msgs) == 0 {
   113  			t.Errorf("expected false for '%s'", val)
   114  		}
   115  	}
   116  }
   117  
   118  func TestIsCIdentifier(t *testing.T) {
   119  	goodValues := []string{
   120  		"a", "ab", "abc", "a1", "_a", "a_", "a_b", "a_1", "a__1__2__b", "__abc_123",
   121  		"A", "AB", "AbC", "A1", "_A", "A_", "A_B", "A_1", "A__1__2__B", "__123_ABC",
   122  	}
   123  	for _, val := range goodValues {
   124  		if msgs := IsCIdentifier(val); len(msgs) != 0 {
   125  			t.Errorf("expected true for '%s': %v", val, msgs)
   126  		}
   127  	}
   128  
   129  	badValues := []string{
   130  		"", "1", "123", "1a",
   131  		"-", "a-", "-a", "1-", "-1", "1_", "1_2",
   132  		".", "a.", ".a", "a.b", "1.", ".1", "1.2",
   133  		" ", "a ", " a", "a b", "1 ", " 1", "1 2",
   134  		"#a#",
   135  	}
   136  	for _, val := range badValues {
   137  		if msgs := IsCIdentifier(val); len(msgs) == 0 {
   138  			t.Errorf("expected false for '%s'", val)
   139  		}
   140  	}
   141  }
   142  
   143  func TestIsValidPortNum(t *testing.T) {
   144  	goodValues := []int{1, 2, 1000, 16384, 32768, 65535}
   145  	for _, val := range goodValues {
   146  		if msgs := IsValidPortNum(val); len(msgs) != 0 {
   147  			t.Errorf("expected true for %d, got %v", val, msgs)
   148  		}
   149  	}
   150  
   151  	badValues := []int{0, -1, 65536, 100000}
   152  	for _, val := range badValues {
   153  		if msgs := IsValidPortNum(val); len(msgs) == 0 {
   154  			t.Errorf("expected false for %d", val)
   155  		}
   156  	}
   157  }
   158  
   159  func TestIsInRange(t *testing.T) {
   160  	goodValues := []struct {
   161  		value int
   162  		min   int
   163  		max   int
   164  	}{{1, 0, 10}, {5, 5, 20}, {25, 10, 25}}
   165  	for _, val := range goodValues {
   166  		if msgs := IsInRange(val.value, val.min, val.max); len(msgs) > 0 {
   167  			t.Errorf("expected no errors for %#v, but got %v", val, msgs)
   168  		}
   169  	}
   170  
   171  	badValues := []struct {
   172  		value int
   173  		min   int
   174  		max   int
   175  	}{{1, 2, 10}, {5, -4, 2}, {25, 100, 120}}
   176  	for _, val := range badValues {
   177  		if msgs := IsInRange(val.value, val.min, val.max); len(msgs) == 0 {
   178  			t.Errorf("expected errors for %#v", val)
   179  		}
   180  	}
   181  }
   182  
   183  func createGroupIDs(ids ...int64) []int64 {
   184  	var output []int64
   185  	for _, id := range ids {
   186  		output = append(output, int64(id))
   187  	}
   188  	return output
   189  }
   190  
   191  func createUserIDs(ids ...int64) []int64 {
   192  	var output []int64
   193  	for _, id := range ids {
   194  		output = append(output, int64(id))
   195  	}
   196  	return output
   197  }
   198  
   199  func TestIsValidGroupID(t *testing.T) {
   200  	goodValues := createGroupIDs(0, 1, 1000, 65535, 2147483647)
   201  	for _, val := range goodValues {
   202  		if msgs := IsValidGroupID(val); len(msgs) != 0 {
   203  			t.Errorf("expected true for '%d': %v", val, msgs)
   204  		}
   205  	}
   206  
   207  	badValues := createGroupIDs(-1, -1003, 2147483648, 4147483647)
   208  	for _, val := range badValues {
   209  		if msgs := IsValidGroupID(val); len(msgs) == 0 {
   210  			t.Errorf("expected false for '%d'", val)
   211  		}
   212  	}
   213  }
   214  
   215  func TestIsValidUserID(t *testing.T) {
   216  	goodValues := createUserIDs(0, 1, 1000, 65535, 2147483647)
   217  	for _, val := range goodValues {
   218  		if msgs := IsValidUserID(val); len(msgs) != 0 {
   219  			t.Errorf("expected true for '%d': %v", val, msgs)
   220  		}
   221  	}
   222  
   223  	badValues := createUserIDs(-1, -1003, 2147483648, 4147483647)
   224  	for _, val := range badValues {
   225  		if msgs := IsValidUserID(val); len(msgs) == 0 {
   226  			t.Errorf("expected false for '%d'", val)
   227  		}
   228  	}
   229  }
   230  
   231  func TestIsValidPortName(t *testing.T) {
   232  	goodValues := []string{"telnet", "re-mail-ck", "pop3", "a", "a-1", "1-a", "a-1-b-2-c", "1-a-2-b-3"}
   233  	for _, val := range goodValues {
   234  		if msgs := IsValidPortName(val); len(msgs) != 0 {
   235  			t.Errorf("expected true for %q: %v", val, msgs)
   236  		}
   237  	}
   238  
   239  	badValues := []string{"longerthan15characters", "", strings.Repeat("a", 16), "12345", "1-2-3-4", "-begin", "end-", "two--hyphens", "whois++"}
   240  	for _, val := range badValues {
   241  		if msgs := IsValidPortName(val); len(msgs) == 0 {
   242  			t.Errorf("expected false for %q", val)
   243  		}
   244  	}
   245  }
   246  
   247  func TestIsQualifiedName(t *testing.T) {
   248  	successCases := []string{
   249  		"simple",
   250  		"now-with-dashes",
   251  		"1-starts-with-num",
   252  		"1234",
   253  		"simple/simple",
   254  		"now-with-dashes/simple",
   255  		"now-with-dashes/now-with-dashes",
   256  		"now.with.dots/simple",
   257  		"now-with.dashes-and.dots/simple",
   258  		"1-num.2-num/3-num",
   259  		"1234/5678",
   260  		"1.2.3.4/5678",
   261  		"Uppercase_Is_OK_123",
   262  		"example.com/Uppercase_Is_OK_123",
   263  		"requests.storage-foo",
   264  		strings.Repeat("a", 63),
   265  		strings.Repeat("a", 253) + "/" + strings.Repeat("b", 63),
   266  	}
   267  	for i := range successCases {
   268  		if errs := IsQualifiedName(successCases[i]); len(errs) != 0 {
   269  			t.Errorf("case[%d]: %q: expected success: %v", i, successCases[i], errs)
   270  		}
   271  	}
   272  
   273  	errorCases := []string{
   274  		"nospecialchars%^=@",
   275  		"cantendwithadash-",
   276  		"-cantstartwithadash-",
   277  		"only/one/slash",
   278  		"Example.com/abc",
   279  		"example_com/abc",
   280  		"example.com/",
   281  		"/simple",
   282  		strings.Repeat("a", 64),
   283  		strings.Repeat("a", 254) + "/abc",
   284  	}
   285  	for i := range errorCases {
   286  		if errs := IsQualifiedName(errorCases[i]); len(errs) == 0 {
   287  			t.Errorf("case[%d]: %q: expected failure", i, errorCases[i])
   288  		}
   289  	}
   290  }
   291  
   292  func TestIsValidLabelValue(t *testing.T) {
   293  	successCases := []string{
   294  		"simple",
   295  		"now-with-dashes",
   296  		"1-starts-with-num",
   297  		"end-with-num-1",
   298  		"1234",                  // only num
   299  		strings.Repeat("a", 63), // to the limit
   300  		"",                      // empty value
   301  	}
   302  	for i := range successCases {
   303  		if errs := IsValidLabelValue(successCases[i]); len(errs) != 0 {
   304  			t.Errorf("case %s expected success: %v", successCases[i], errs)
   305  		}
   306  	}
   307  
   308  	errorCases := []string{
   309  		"nospecialchars%^=@",
   310  		"Tama-nui-te-rā.is.Māori.sun",
   311  		"\\backslashes\\are\\bad",
   312  		"-starts-with-dash",
   313  		"ends-with-dash-",
   314  		".starts.with.dot",
   315  		"ends.with.dot.",
   316  		strings.Repeat("a", 64), // over the limit
   317  	}
   318  	for i := range errorCases {
   319  		if errs := IsValidLabelValue(errorCases[i]); len(errs) == 0 {
   320  			t.Errorf("case[%d] expected failure", i)
   321  		}
   322  	}
   323  }
   324  
   325  func TestIsValidIP(t *testing.T) {
   326  	goodValues := []string{
   327  		"::1",
   328  		"2a00:79e0:2:0:f1c3:e797:93c1:df80",
   329  		"::",
   330  		"2001:4860:4860::8888",
   331  		"::fff:1.1.1.1",
   332  		"1.1.1.1",
   333  		"1.1.1.01",
   334  		"255.0.0.1",
   335  		"1.0.0.0",
   336  		"0.0.0.0",
   337  	}
   338  	for _, val := range goodValues {
   339  		if msgs := IsValidIP(val); len(msgs) != 0 {
   340  			t.Errorf("expected true for %q: %v", val, msgs)
   341  		}
   342  	}
   343  
   344  	badValues := []string{
   345  		"[2001:db8:0:1]:80",
   346  		"myhost.mydomain",
   347  		"-1.0.0.0",
   348  		"[2001:db8:0:1]",
   349  		"a",
   350  	}
   351  	for _, val := range badValues {
   352  		if msgs := IsValidIP(val); len(msgs) == 0 {
   353  			t.Errorf("expected false for %q", val)
   354  		}
   355  	}
   356  }
   357  
   358  func TestIsValidIPv4Address(t *testing.T) {
   359  	goodValues := []string{
   360  		"1.1.1.1",
   361  		"1.1.1.01",
   362  		"255.0.0.1",
   363  		"1.0.0.0",
   364  		"0.0.0.0",
   365  	}
   366  	for _, val := range goodValues {
   367  		if msgs := IsValidIPv4Address(field.NewPath(""), val); len(msgs) != 0 {
   368  			t.Errorf("expected %q to be valid IPv4 address: %v", val, msgs)
   369  		}
   370  	}
   371  
   372  	badValues := []string{
   373  		"[2001:db8:0:1]:80",
   374  		"myhost.mydomain",
   375  		"-1.0.0.0",
   376  		"[2001:db8:0:1]",
   377  		"a",
   378  		"2001:4860:4860::8888",
   379  		"::fff:1.1.1.1",
   380  		"::1",
   381  		"2a00:79e0:2:0:f1c3:e797:93c1:df80",
   382  		"::",
   383  	}
   384  	for _, val := range badValues {
   385  		if msgs := IsValidIPv4Address(field.NewPath(""), val); len(msgs) == 0 {
   386  			t.Errorf("expected %q to be invalid IPv4 address", val)
   387  		}
   388  	}
   389  }
   390  
   391  func TestIsValidIPv6Address(t *testing.T) {
   392  	goodValues := []string{
   393  		"2001:4860:4860::8888",
   394  		"2a00:79e0:2:0:f1c3:e797:93c1:df80",
   395  		"2001:0db8:85a3:0000:0000:8a2e:0370:7334",
   396  		"::fff:1.1.1.1",
   397  		"::1",
   398  		"::",
   399  	}
   400  
   401  	for _, val := range goodValues {
   402  		if msgs := IsValidIPv6Address(field.NewPath(""), val); len(msgs) != 0 {
   403  			t.Errorf("expected %q to be valid IPv6 address: %v", val, msgs)
   404  		}
   405  	}
   406  
   407  	badValues := []string{
   408  		"1.1.1.1",
   409  		"1.1.1.01",
   410  		"255.0.0.1",
   411  		"1.0.0.0",
   412  		"0.0.0.0",
   413  		"[2001:db8:0:1]:80",
   414  		"myhost.mydomain",
   415  		"2001:0db8:85a3:0000:0000:8a2e:0370:7334:2001:0db8:85a3:0000:0000:8a2e:0370:7334",
   416  		"-1.0.0.0",
   417  		"[2001:db8:0:1]",
   418  		"a",
   419  	}
   420  	for _, val := range badValues {
   421  		if msgs := IsValidIPv6Address(field.NewPath(""), val); len(msgs) == 0 {
   422  			t.Errorf("expected %q to be invalid IPv6 address", val)
   423  		}
   424  	}
   425  }
   426  
   427  func TestIsHTTPHeaderName(t *testing.T) {
   428  	goodValues := []string{
   429  		// Common ones
   430  		"Accept-Encoding", "Host", "If-Modified-Since", "X-Forwarded-For",
   431  		// Weirdo, but still conforming names
   432  		"a", "ab", "abc", "a1", "-a", "a-", "a-b", "a-1", "a--1--2--b", "--abc-123",
   433  		"A", "AB", "AbC", "A1", "-A", "A-", "A-B", "A-1", "A--1--2--B", "--123-ABC",
   434  	}
   435  	for _, val := range goodValues {
   436  		if msgs := IsHTTPHeaderName(val); len(msgs) != 0 {
   437  			t.Errorf("expected true for '%s': %v", val, msgs)
   438  		}
   439  	}
   440  
   441  	badValues := []string{
   442  		"Host:", "X-Forwarded-For:", "X-@Home",
   443  		"", "_", "a_", "_a", "1_", "1_2", ".", "a.", ".a", "a.b", "1.", ".1", "1.2",
   444  		" ", "a ", " a", "a b", "1 ", " 1", "1 2", "#a#", "^", ",", ";", "=", "<",
   445  		"?", "@", "{",
   446  	}
   447  	for _, val := range badValues {
   448  		if msgs := IsHTTPHeaderName(val); len(msgs) == 0 {
   449  			t.Errorf("expected false for '%s'", val)
   450  		}
   451  	}
   452  }
   453  
   454  func TestIsValidPercent(t *testing.T) {
   455  	goodValues := []string{
   456  		"0%",
   457  		"00000%",
   458  		"1%",
   459  		"01%",
   460  		"99%",
   461  		"100%",
   462  		"101%",
   463  	}
   464  	for _, val := range goodValues {
   465  		if msgs := IsValidPercent(val); len(msgs) != 0 {
   466  			t.Errorf("expected true for %q: %v", val, msgs)
   467  		}
   468  	}
   469  
   470  	badValues := []string{
   471  		"",
   472  		"0",
   473  		"100",
   474  		"0.0%",
   475  		"99.9%",
   476  		"hundred",
   477  		" 1%",
   478  		"1% ",
   479  		"-0%",
   480  		"-1%",
   481  		"+1%",
   482  	}
   483  	for _, val := range badValues {
   484  		if msgs := IsValidPercent(val); len(msgs) == 0 {
   485  			t.Errorf("expected false for %q", val)
   486  		}
   487  	}
   488  }
   489  
   490  func TestIsConfigMapKey(t *testing.T) {
   491  	successCases := []string{
   492  		"a",
   493  		"good",
   494  		"good-good",
   495  		"still.good",
   496  		"this.is.also.good",
   497  		".so.is.this",
   498  		"THIS_IS_GOOD",
   499  		"so_is_this_17",
   500  	}
   501  
   502  	for i := range successCases {
   503  		if errs := IsConfigMapKey(successCases[i]); len(errs) != 0 {
   504  			t.Errorf("[%d] expected success: %v", i, errs)
   505  		}
   506  	}
   507  
   508  	failureCases := []string{
   509  		".",
   510  		"..",
   511  		"..bad",
   512  		"b*d",
   513  		"bad!&bad",
   514  	}
   515  
   516  	for i := range failureCases {
   517  		if errs := IsConfigMapKey(failureCases[i]); len(errs) == 0 {
   518  			t.Errorf("[%d] expected failure", i)
   519  		}
   520  	}
   521  }
   522  
   523  func TestIsWildcardDNS1123Subdomain(t *testing.T) {
   524  	goodValues := []string{
   525  		"*.example.com",
   526  		"*.bar.com",
   527  		"*.foo.bar.com",
   528  	}
   529  	for _, val := range goodValues {
   530  		if errs := IsWildcardDNS1123Subdomain(val); len(errs) != 0 {
   531  			t.Errorf("expected no errors for %q: %v", val, errs)
   532  		}
   533  	}
   534  
   535  	badValues := []string{
   536  		"*.*.bar.com",
   537  		"*.foo.*.com",
   538  		"*bar.com",
   539  		"f*.bar.com",
   540  		"*",
   541  	}
   542  	for _, val := range badValues {
   543  		if errs := IsWildcardDNS1123Subdomain(val); len(errs) == 0 {
   544  			t.Errorf("expected errors for %q", val)
   545  		}
   546  	}
   547  }
   548  
   549  func TestIsFullyQualifiedDomainName(t *testing.T) {
   550  	goodValues := []string{
   551  		"a.com",
   552  		"k8s.io",
   553  		"dev.k8s.io",
   554  		"dev.k8s.io.",
   555  		"foo.example.com",
   556  		"this.is.a.really.long.fqdn",
   557  		"bbc.co.uk",
   558  		"10.0.0.1", // DNS labels can start with numbers and there is no requirement for letters.
   559  		"hyphens-are-good.k8s.io",
   560  		strings.Repeat("a", 63) + ".k8s.io",
   561  		strings.Repeat("a", 63) + "." + strings.Repeat("b", 63) + "." + strings.Repeat("c", 63) + "." + strings.Repeat("d", 54) + ".k8s.io",
   562  	}
   563  	for _, val := range goodValues {
   564  		if err := IsFullyQualifiedDomainName(field.NewPath(""), val).ToAggregate(); err != nil {
   565  			t.Errorf("expected no errors for %q: %v", val, err)
   566  		}
   567  	}
   568  
   569  	badValues := []string{
   570  		".",
   571  		"...",
   572  		".io",
   573  		"com",
   574  		".com",
   575  		"Dev.k8s.io",
   576  		".foo.example.com",
   577  		"*.example.com",
   578  		"*.bar.com",
   579  		"*.foo.bar.com",
   580  		"underscores_are_bad.k8s.io",
   581  		"foo@bar.example.com",
   582  		"http://foo.example.com",
   583  		strings.Repeat("a", 64) + ".k8s.io",
   584  		strings.Repeat("a", 63) + "." + strings.Repeat("b", 63) + "." + strings.Repeat("c", 63) + "." + strings.Repeat("d", 55) + ".k8s.io",
   585  	}
   586  	for _, val := range badValues {
   587  		if err := IsFullyQualifiedDomainName(field.NewPath(""), val).ToAggregate(); err == nil {
   588  			t.Errorf("expected errors for %q", val)
   589  		}
   590  	}
   591  }
   592  
   593  func TestIsFullyQualifiedName(t *testing.T) {
   594  	goodValues := []string{
   595  		"dev.k8s.io",
   596  		"foo.example.com",
   597  		"this.is.a.really.long.fqdn",
   598  		"bbc.co.uk",
   599  		"10.0.0.1", // DNS labels can start with numbers and there is no requirement for letters.
   600  		"hyphens-are-good.k8s.io",
   601  		strings.Repeat("a", 246) + ".k8s.io",
   602  	}
   603  	for _, val := range goodValues {
   604  		if err := IsFullyQualifiedName(field.NewPath(""), val).ToAggregate(); err != nil {
   605  			t.Errorf("expected no errors for %q: %v", val, err)
   606  		}
   607  	}
   608  
   609  	badValues := []string{
   610  		"...",
   611  		"dev.k8s.io.",
   612  		".io",
   613  		"Dev.k8s.io",
   614  		"k8s.io",
   615  		"*.example.com",
   616  		"*.bar.com",
   617  		"*.foo.bar.com",
   618  		"underscores_are_bad.k8s.io",
   619  		"foo@bar.example.com",
   620  		"http://foo.example.com",
   621  		strings.Repeat("a", 247) + ".k8s.io",
   622  	}
   623  	for _, val := range badValues {
   624  		if err := IsFullyQualifiedName(field.NewPath(""), val).ToAggregate(); err == nil {
   625  			t.Errorf("expected errors for %q", val)
   626  		}
   627  	}
   628  
   629  	messageTests := []struct {
   630  		name       string
   631  		targetName string
   632  		err        string
   633  	}{
   634  		{
   635  			name:       "name needs to be fully qualified, i.e., contains at least 2 dots",
   636  			targetName: "k8s.io",
   637  			err:        "should be a domain with at least three segments separated by dots",
   638  		},
   639  		{
   640  			name:       "name should not include scheme",
   641  			targetName: "http://foo.k8s.io",
   642  			err:        "a lowercase RFC 1123 subdomain must consist of lower case alphanumeric characters",
   643  		},
   644  		{
   645  			name:       "email should be invalid",
   646  			targetName: "example@foo.k8s.io",
   647  			err:        "a lowercase RFC 1123 subdomain must consist of lower case alphanumeric characters",
   648  		},
   649  		{
   650  			name:       "name cannot be empty",
   651  			targetName: "",
   652  			err:        "Required value",
   653  		},
   654  		{
   655  			name:       "name must conform to RFC 1123",
   656  			targetName: "A.B.C",
   657  			err:        "a lowercase RFC 1123 subdomain must consist of lower case alphanumeric characters",
   658  		},
   659  	}
   660  	for _, tc := range messageTests {
   661  		err := IsFullyQualifiedName(field.NewPath(""), tc.targetName).ToAggregate()
   662  		switch {
   663  		case tc.err == "" && err != nil:
   664  			t.Errorf("%q: unexpected error: %v", tc.name, err)
   665  		case tc.err != "" && err == nil:
   666  			t.Errorf("%q: unexpected no error, expected %s", tc.name, tc.err)
   667  		case tc.err != "" && err != nil && !strings.Contains(err.Error(), tc.err):
   668  			t.Errorf("%q: expected %s, got %v", tc.name, tc.err, err)
   669  		}
   670  	}
   671  }
   672  
   673  func TestIsDomainPrefixedPath(t *testing.T) {
   674  	goodValues := []string{
   675  		"a/b",
   676  		"a/b/c/d",
   677  		"a.com/foo",
   678  		"a.b.c.d/foo",
   679  		"k8s.io/foo/bar",
   680  		"k8s.io/FOO/BAR",
   681  		"dev.k8s.io/more/path",
   682  		"this.is.a.really.long.fqdn/even/longer/path/just/because",
   683  		"bbc.co.uk/path/goes/here",
   684  		"10.0.0.1/foo",
   685  		"hyphens-are-good.k8s.io/and-in-paths-too",
   686  		strings.Repeat("a", 240) + ".k8s.io/a",
   687  		"k8s.io/" + strings.Repeat("a", 240),
   688  	}
   689  	for _, val := range goodValues {
   690  		if err := IsDomainPrefixedPath(field.NewPath(""), val).ToAggregate(); err != nil {
   691  			t.Errorf("expected no errors for %q: %v", val, err)
   692  		}
   693  	}
   694  
   695  	badValues := []string{
   696  		".",
   697  		"...",
   698  		"/b",
   699  		"com",
   700  		".com",
   701  		"a.b.c.d/foo?a=b",
   702  		"a.b.c.d/foo#a",
   703  		"Dev.k8s.io",
   704  		".foo.example.com",
   705  		"*.example.com",
   706  		"example.com/foo{}[]@^`",
   707  		"underscores_are_bad.k8s.io",
   708  		"underscores_are_bad.k8s.io/foo",
   709  		"foo@bar.example.com",
   710  		"foo@bar.example.com/foo",
   711  		strings.Repeat("a", 247) + ".k8s.io",
   712  	}
   713  	for _, val := range badValues {
   714  		if err := IsDomainPrefixedPath(field.NewPath(""), val).ToAggregate(); err == nil {
   715  			t.Errorf("expected errors for %q", val)
   716  		}
   717  	}
   718  }
   719  
   720  func TestIsValidSocketAddr(t *testing.T) {
   721  	goodValues := []string{
   722  		"0.0.0.0:10254",
   723  		"127.0.0.1:8888",
   724  		"[2001:db8:1f70::999:de8:7648:6e8]:10254",
   725  		"[::]:10254",
   726  	}
   727  	for _, val := range goodValues {
   728  		if errs := IsValidSocketAddr(val); len(errs) != 0 {
   729  			t.Errorf("expected no errors for %q: %v", val, errs)
   730  		}
   731  	}
   732  
   733  	badValues := []string{
   734  		"0.0.0.0.0:2020",
   735  		"0.0.0.0",
   736  		"6.6.6.6:909090",
   737  		"2001:db8:1f70::999:de8:7648:6e8:87567:102545",
   738  		"",
   739  		"*",
   740  	}
   741  	for _, val := range badValues {
   742  		if errs := IsValidSocketAddr(val); len(errs) == 0 {
   743  			t.Errorf("expected errors for %q", val)
   744  		}
   745  	}
   746  }