...

Source file src/k8s.io/utils/internal/third_party/forked/golang/net/ip_test.go

Documentation: k8s.io/utils/internal/third_party/forked/golang/net

     1  // Copyright 2009 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package net
     6  
     7  ///////////////////////////////////////////////////////////////////////////////
     8  // NOTE: This file was forked because we need to maintain backwards-compatible
     9  // IP parsing logic, which was changed in a correct but incompatible way in
    10  // go-1.17.
    11  //
    12  // See https://issue.k8s.io/100895
    13  ///////////////////////////////////////////////////////////////////////////////
    14  
    15  import (
    16  	stdnet "net"
    17  	"reflect"
    18  	"testing"
    19  )
    20  
    21  //
    22  // Lean on the standard net lib as much as possible.
    23  //
    24  type IPMask = stdnet.IPMask
    25  
    26  var IPv4Mask = stdnet.IPv4Mask
    27  
    28  var parseIPTests = []struct {
    29  	in  string
    30  	out IP
    31  }{
    32  	{"127.0.1.2", IPv4(127, 0, 1, 2)},
    33  	{"127.0.0.1", IPv4(127, 0, 0, 1)},
    34  	{"127.001.002.003", IPv4(127, 1, 2, 3)},    // see https://issue.k8s.io/100895
    35  	{"127.007.008.009", IPv4(127, 7, 8, 9)},    // see https://issue.k8s.io/100895
    36  	{"127.010.020.030", IPv4(127, 10, 20, 30)}, // see https://issue.k8s.io/100895
    37  	{"::ffff:127.1.2.3", IPv4(127, 1, 2, 3)},
    38  	{"::ffff:127.001.002.003", IPv4(127, 1, 2, 3)},    // see https://issue.k8s.io/100895
    39  	{"::ffff:127.007.008.009", IPv4(127, 7, 8, 9)},    // see https://issue.k8s.io/100895
    40  	{"::ffff:127.010.020.030", IPv4(127, 10, 20, 30)}, // see https://issue.k8s.io/100895
    41  	{"::ffff:7f01:0203", IPv4(127, 1, 2, 3)},
    42  	{"0:0:0:0:0000:ffff:127.1.2.3", IPv4(127, 1, 2, 3)},
    43  	{"0:0:0:0:000000:ffff:127.1.2.3", IPv4(127, 1, 2, 3)},
    44  	{"0:0:0:0::ffff:127.1.2.3", IPv4(127, 1, 2, 3)},
    45  
    46  	{"2001:4860:0:2001::68", IP{0x20, 0x01, 0x48, 0x60, 0, 0, 0x20, 0x01, 0, 0, 0, 0, 0, 0, 0x00, 0x68}},
    47  	{"2001:4860:0000:2001:0000:0000:0000:0068", IP{0x20, 0x01, 0x48, 0x60, 0, 0, 0x20, 0x01, 0, 0, 0, 0, 0, 0, 0x00, 0x68}},
    48  
    49  	{"-0.0.0.0", nil},
    50  	{"0.-1.0.0", nil},
    51  	{"0.0.-2.0", nil},
    52  	{"0.0.0.-3", nil},
    53  	{"127.0.0.256", nil},
    54  	{"abc", nil},
    55  	{"123:", nil},
    56  	{"fe80::1%lo0", nil},
    57  	{"fe80::1%911", nil},
    58  	{"", nil},
    59  	{"a1:a2:a3:a4::b1:b2:b3:b4", nil}, // Issue 6628
    60  	//
    61  	// NOTE: These correct failures were added for go-1.17, but are a
    62  	// backwards-incompatible change for kubernetes users, who might have
    63  	// stored data which uses these leading zeroes already.
    64  	//
    65  	// See https://github.com/kubernetes/kubernetes/issues/100895
    66  	//
    67  	//{"127.001.002.003", nil},
    68  	//{"::ffff:127.001.002.003", nil},
    69  	//{"123.000.000.000", nil},
    70  	//{"1.2..4", nil},
    71  	//{"0123.0.0.1", nil},
    72  }
    73  
    74  func TestParseIP(t *testing.T) {
    75  	for _, tt := range parseIPTests {
    76  		if out := ParseIP(tt.in); !reflect.DeepEqual(out, tt.out) {
    77  			t.Errorf("ParseIP(%q) = %v, want %v", tt.in, out, tt.out)
    78  		}
    79  	}
    80  }
    81  
    82  var parseCIDRTests = []struct {
    83  	in  string
    84  	ip  IP
    85  	net *IPNet
    86  	err error
    87  }{
    88  	{"135.104.0.0/32", IPv4(135, 104, 0, 0), &IPNet{IP: IPv4(135, 104, 0, 0), Mask: IPv4Mask(255, 255, 255, 255)}, nil},
    89  	{"0.0.0.0/24", IPv4(0, 0, 0, 0), &IPNet{IP: IPv4(0, 0, 0, 0), Mask: IPv4Mask(255, 255, 255, 0)}, nil},
    90  	{"135.104.0.0/24", IPv4(135, 104, 0, 0), &IPNet{IP: IPv4(135, 104, 0, 0), Mask: IPv4Mask(255, 255, 255, 0)}, nil},
    91  	{"135.104.0.1/32", IPv4(135, 104, 0, 1), &IPNet{IP: IPv4(135, 104, 0, 1), Mask: IPv4Mask(255, 255, 255, 255)}, nil},
    92  	{"135.104.0.1/24", IPv4(135, 104, 0, 1), &IPNet{IP: IPv4(135, 104, 0, 0), Mask: IPv4Mask(255, 255, 255, 0)}, nil},
    93  	// see https://issue.k8s.io/100895
    94  	{"127.000.000.001/32", IPv4(127, 0, 0, 1), &IPNet{IP: IPv4(127, 0, 0, 1), Mask: IPv4Mask(255, 255, 255, 255)}, nil},
    95  	{"127.007.008.009/32", IPv4(127, 7, 8, 9), &IPNet{IP: IPv4(127, 7, 8, 9), Mask: IPv4Mask(255, 255, 255, 255)}, nil},
    96  	{"127.010.020.030/32", IPv4(127, 10, 20, 30), &IPNet{IP: IPv4(127, 10, 20, 30), Mask: IPv4Mask(255, 255, 255, 255)}, nil},
    97  	{"::1/128", ParseIP("::1"), &IPNet{IP: ParseIP("::1"), Mask: IPMask(ParseIP("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"))}, nil},
    98  	{"abcd:2345::/127", ParseIP("abcd:2345::"), &IPNet{IP: ParseIP("abcd:2345::"), Mask: IPMask(ParseIP("ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffe"))}, nil},
    99  	{"abcd:2345::/65", ParseIP("abcd:2345::"), &IPNet{IP: ParseIP("abcd:2345::"), Mask: IPMask(ParseIP("ffff:ffff:ffff:ffff:8000::"))}, nil},
   100  	{"abcd:2345::/64", ParseIP("abcd:2345::"), &IPNet{IP: ParseIP("abcd:2345::"), Mask: IPMask(ParseIP("ffff:ffff:ffff:ffff::"))}, nil},
   101  	{"abcd:2345::/63", ParseIP("abcd:2345::"), &IPNet{IP: ParseIP("abcd:2345::"), Mask: IPMask(ParseIP("ffff:ffff:ffff:fffe::"))}, nil},
   102  	{"abcd:2345::/33", ParseIP("abcd:2345::"), &IPNet{IP: ParseIP("abcd:2345::"), Mask: IPMask(ParseIP("ffff:ffff:8000::"))}, nil},
   103  	{"abcd:2345::/32", ParseIP("abcd:2345::"), &IPNet{IP: ParseIP("abcd:2345::"), Mask: IPMask(ParseIP("ffff:ffff::"))}, nil},
   104  	{"abcd:2344::/31", ParseIP("abcd:2344::"), &IPNet{IP: ParseIP("abcd:2344::"), Mask: IPMask(ParseIP("ffff:fffe::"))}, nil},
   105  	{"abcd:2300::/24", ParseIP("abcd:2300::"), &IPNet{IP: ParseIP("abcd:2300::"), Mask: IPMask(ParseIP("ffff:ff00::"))}, nil},
   106  	{"abcd:2345::/24", ParseIP("abcd:2345::"), &IPNet{IP: ParseIP("abcd:2300::"), Mask: IPMask(ParseIP("ffff:ff00::"))}, nil},
   107  	{"2001:DB8::/48", ParseIP("2001:DB8::"), &IPNet{IP: ParseIP("2001:DB8::"), Mask: IPMask(ParseIP("ffff:ffff:ffff::"))}, nil},
   108  	{"2001:DB8::1/48", ParseIP("2001:DB8::1"), &IPNet{IP: ParseIP("2001:DB8::"), Mask: IPMask(ParseIP("ffff:ffff:ffff::"))}, nil},
   109  	{"192.168.1.1/255.255.255.0", nil, nil, &ParseError{Type: "CIDR address", Text: "192.168.1.1/255.255.255.0"}},
   110  	{"192.168.1.1/35", nil, nil, &ParseError{Type: "CIDR address", Text: "192.168.1.1/35"}},
   111  	{"2001:db8::1/-1", nil, nil, &ParseError{Type: "CIDR address", Text: "2001:db8::1/-1"}},
   112  	{"2001:db8::1/-0", nil, nil, &ParseError{Type: "CIDR address", Text: "2001:db8::1/-0"}},
   113  	{"-0.0.0.0/32", nil, nil, &ParseError{Type: "CIDR address", Text: "-0.0.0.0/32"}},
   114  	{"0.-1.0.0/32", nil, nil, &ParseError{Type: "CIDR address", Text: "0.-1.0.0/32"}},
   115  	{"0.0.-2.0/32", nil, nil, &ParseError{Type: "CIDR address", Text: "0.0.-2.0/32"}},
   116  	{"0.0.0.-3/32", nil, nil, &ParseError{Type: "CIDR address", Text: "0.0.0.-3/32"}},
   117  	{"0.0.0.0/-0", nil, nil, &ParseError{Type: "CIDR address", Text: "0.0.0.0/-0"}},
   118  	// see https://issue.k8s.io/100895
   119  	//{"127.000.000.001/32", nil, nil, &ParseError{Type: "CIDR address", Text: "127.000.000.001/32"}},
   120  	{"", nil, nil, &ParseError{Type: "CIDR address", Text: ""}},
   121  }
   122  
   123  func TestParseCIDR(t *testing.T) {
   124  	for _, tt := range parseCIDRTests {
   125  		ip, net, err := ParseCIDR(tt.in)
   126  		if !reflect.DeepEqual(err, tt.err) {
   127  			t.Errorf("ParseCIDR(%q) = %v, %v; want %v, %v", tt.in, ip, net, tt.ip, tt.net)
   128  		}
   129  		if err == nil && (!tt.ip.Equal(ip) || !tt.net.IP.Equal(net.IP) || !reflect.DeepEqual(net.Mask, tt.net.Mask)) {
   130  			t.Errorf("ParseCIDR(%q) = %v, {%v, %v}; want %v, {%v, %v}", tt.in, ip, net.IP, net.Mask, tt.ip, tt.net.IP, tt.net.Mask)
   131  		}
   132  	}
   133  }
   134  

View as plain text