| /* |
| Copyright 2018 The Kubernetes Authors. |
| |
| Licensed under the Apache License, Version 2.0 (the "License"); |
| you may not use this file except in compliance with the License. |
| You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| */ |
| |
| package net |
| |
| import ( |
| "net" |
| "reflect" |
| "testing" |
| ) |
| |
| func TestIsIPv6String(t *testing.T) { |
| testCases := []struct { |
| ip string |
| expectIPv6 bool |
| }{ |
| { |
| ip: "127.0.0.1", |
| expectIPv6: false, |
| }, |
| { |
| ip: "192.168.0.0", |
| expectIPv6: false, |
| }, |
| { |
| ip: "1.2.3.4", |
| expectIPv6: false, |
| }, |
| { |
| ip: "bad ip", |
| expectIPv6: false, |
| }, |
| { |
| ip: "::1", |
| expectIPv6: true, |
| }, |
| { |
| ip: "fd00::600d:f00d", |
| expectIPv6: true, |
| }, |
| { |
| ip: "2001:db8::5", |
| expectIPv6: true, |
| }, |
| } |
| for i := range testCases { |
| isIPv6 := IsIPv6String(testCases[i].ip) |
| if isIPv6 != testCases[i].expectIPv6 { |
| t.Errorf("[%d] Expect ipv6 %v, got %v", i+1, testCases[i].expectIPv6, isIPv6) |
| } |
| } |
| } |
| |
| func TestIsIPv6(t *testing.T) { |
| testCases := []struct { |
| ip net.IP |
| expectIPv6 bool |
| }{ |
| { |
| ip: net.IPv4zero, |
| expectIPv6: false, |
| }, |
| { |
| ip: net.IPv4bcast, |
| expectIPv6: false, |
| }, |
| { |
| ip: net.ParseIP("127.0.0.1"), |
| expectIPv6: false, |
| }, |
| { |
| ip: net.ParseIP("10.20.40.40"), |
| expectIPv6: false, |
| }, |
| { |
| ip: net.ParseIP("172.17.3.0"), |
| expectIPv6: false, |
| }, |
| { |
| ip: nil, |
| expectIPv6: false, |
| }, |
| { |
| ip: net.IPv6loopback, |
| expectIPv6: true, |
| }, |
| { |
| ip: net.IPv6zero, |
| expectIPv6: true, |
| }, |
| { |
| ip: net.ParseIP("fd00::600d:f00d"), |
| expectIPv6: true, |
| }, |
| { |
| ip: net.ParseIP("2001:db8::5"), |
| expectIPv6: true, |
| }, |
| } |
| for i := range testCases { |
| isIPv6 := IsIPv6(testCases[i].ip) |
| if isIPv6 != testCases[i].expectIPv6 { |
| t.Errorf("[%d] Expect ipv6 %v, got %v", i+1, testCases[i].expectIPv6, isIPv6) |
| } |
| } |
| } |
| |
| func TestIsIPv6CIDR(t *testing.T) { |
| testCases := []struct { |
| desc string |
| cidr string |
| expectResult bool |
| }{ |
| { |
| desc: "ipv4 CIDR 1", |
| cidr: "10.0.0.0/8", |
| expectResult: false, |
| }, |
| { |
| desc: "ipv4 CIDR 2", |
| cidr: "192.168.0.0/16", |
| expectResult: false, |
| }, |
| { |
| desc: "ipv6 CIDR 1", |
| cidr: "::/1", |
| expectResult: true, |
| }, |
| { |
| desc: "ipv6 CIDR 2", |
| cidr: "2000::/10", |
| expectResult: true, |
| }, |
| { |
| desc: "ipv6 CIDR 3", |
| cidr: "2001:db8::/32", |
| expectResult: true, |
| }, |
| } |
| |
| for _, tc := range testCases { |
| res := IsIPv6CIDR(tc.cidr) |
| if res != tc.expectResult { |
| t.Errorf("%v: want IsIPv6CIDR=%v, got %v", tc.desc, tc.expectResult, res) |
| } |
| } |
| } |
| |
| func TestFilterIncorrectIPVersion(t *testing.T) { |
| testCases := []struct { |
| desc string |
| isIPv6 bool |
| ipStrings []string |
| expectCorrects []string |
| expectIncorrects []string |
| }{ |
| { |
| desc: "all ipv4 strings in ipv4 mode", |
| isIPv6: false, |
| ipStrings: []string{"10.0.0.1", "192.168.0.1", "127.0.0.1"}, |
| expectCorrects: []string{"10.0.0.1", "192.168.0.1", "127.0.0.1"}, |
| expectIncorrects: nil, |
| }, |
| { |
| desc: "all ipv6 strings in ipv4 mode", |
| isIPv6: false, |
| ipStrings: []string{"::1", "fd00::600d:f00d", "2001:db8::5"}, |
| expectCorrects: nil, |
| expectIncorrects: []string{"::1", "fd00::600d:f00d", "2001:db8::5"}, |
| }, |
| { |
| desc: "mixed versions in ipv4 mode", |
| isIPv6: false, |
| ipStrings: []string{"10.0.0.1", "192.168.0.1", "127.0.0.1", "::1", "fd00::600d:f00d", "2001:db8::5"}, |
| expectCorrects: []string{"10.0.0.1", "192.168.0.1", "127.0.0.1"}, |
| expectIncorrects: []string{"::1", "fd00::600d:f00d", "2001:db8::5"}, |
| }, |
| { |
| desc: "all ipv4 strings in ipv6 mode", |
| isIPv6: true, |
| ipStrings: []string{"10.0.0.1", "192.168.0.1", "127.0.0.1"}, |
| expectCorrects: nil, |
| expectIncorrects: []string{"10.0.0.1", "192.168.0.1", "127.0.0.1"}, |
| }, |
| { |
| desc: "all ipv6 strings in ipv6 mode", |
| isIPv6: true, |
| ipStrings: []string{"::1", "fd00::600d:f00d", "2001:db8::5"}, |
| expectCorrects: []string{"::1", "fd00::600d:f00d", "2001:db8::5"}, |
| expectIncorrects: nil, |
| }, |
| { |
| desc: "mixed versions in ipv6 mode", |
| isIPv6: true, |
| ipStrings: []string{"10.0.0.1", "192.168.0.1", "127.0.0.1", "::1", "fd00::600d:f00d", "2001:db8::5"}, |
| expectCorrects: []string{"::1", "fd00::600d:f00d", "2001:db8::5"}, |
| expectIncorrects: []string{"10.0.0.1", "192.168.0.1", "127.0.0.1"}, |
| }, |
| } |
| |
| for _, tc := range testCases { |
| corrects, incorrects := FilterIncorrectIPVersion(tc.ipStrings, tc.isIPv6) |
| if !reflect.DeepEqual(tc.expectCorrects, corrects) { |
| t.Errorf("%v: want corrects=%v, got %v", tc.desc, tc.expectCorrects, corrects) |
| } |
| if !reflect.DeepEqual(tc.expectIncorrects, incorrects) { |
| t.Errorf("%v: want incorrects=%v, got %v", tc.desc, tc.expectIncorrects, incorrects) |
| } |
| } |
| } |
| |
| func TestFilterIncorrectCIDRVersion(t *testing.T) { |
| testCases := []struct { |
| desc string |
| isIPv6 bool |
| cidrStrings []string |
| expectCorrects []string |
| expectIncorrects []string |
| }{ |
| { |
| desc: "all ipv4 strings in ipv4 mode", |
| isIPv6: false, |
| cidrStrings: []string{"0.0.0.0/1", "1.0.0.0/1"}, |
| expectCorrects: []string{"0.0.0.0/1", "1.0.0.0/1"}, |
| expectIncorrects: nil, |
| }, |
| { |
| desc: "all ipv6 strings in ipv4 mode", |
| isIPv6: false, |
| cidrStrings: []string{"2001:db8::/32", "2001:0db8:0123:4567::/64"}, |
| expectCorrects: nil, |
| expectIncorrects: []string{"2001:db8::/32", "2001:0db8:0123:4567::/64"}, |
| }, |
| { |
| desc: "mixed versions in ipv4 mode", |
| isIPv6: false, |
| cidrStrings: []string{"0.0.0.0/1", "1.0.0.0/1", "2001:db8::/32", "2001:0db8:0123:4567::/64"}, |
| expectCorrects: []string{"0.0.0.0/1", "1.0.0.0/1"}, |
| expectIncorrects: []string{"2001:db8::/32", "2001:0db8:0123:4567::/64"}, |
| }, |
| { |
| desc: "all ipv4 strings in ipv6 mode", |
| isIPv6: true, |
| cidrStrings: []string{"0.0.0.0/1", "1.0.0.0/1"}, |
| expectCorrects: nil, |
| expectIncorrects: []string{"0.0.0.0/1", "1.0.0.0/1"}, |
| }, |
| { |
| desc: "all ipv6 strings in ipv6 mode", |
| isIPv6: true, |
| cidrStrings: []string{"2001:db8::/32", "2001:0db8:0123:4567::/64"}, |
| expectCorrects: []string{"2001:db8::/32", "2001:0db8:0123:4567::/64"}, |
| expectIncorrects: nil, |
| }, |
| { |
| desc: "mixed versions in ipv6 mode", |
| isIPv6: true, |
| cidrStrings: []string{"0.0.0.0/1", "1.0.0.0/1", "2001:db8::/32", "2001:0db8:0123:4567::/64"}, |
| expectCorrects: []string{"2001:db8::/32", "2001:0db8:0123:4567::/64"}, |
| expectIncorrects: []string{"0.0.0.0/1", "1.0.0.0/1"}, |
| }, |
| } |
| |
| for _, tc := range testCases { |
| corrects, incorrects := FilterIncorrectCIDRVersion(tc.cidrStrings, tc.isIPv6) |
| if !reflect.DeepEqual(tc.expectCorrects, corrects) { |
| t.Errorf("%v: want corrects=%v, got %v", tc.desc, tc.expectCorrects, corrects) |
| } |
| if !reflect.DeepEqual(tc.expectIncorrects, incorrects) { |
| t.Errorf("%v: want incorrects=%v, got %v", tc.desc, tc.expectIncorrects, incorrects) |
| } |
| } |
| } |