github.com/AbhinandanKurakure/podman/v3@v3.4.10/libpod/network/util/ip_test.go (about) 1 package util 2 3 import ( 4 "fmt" 5 "net" 6 "reflect" 7 "testing" 8 ) 9 10 func parseCIDR(n string) *net.IPNet { 11 _, parsedNet, _ := net.ParseCIDR(n) 12 return parsedNet 13 } 14 15 func TestNextSubnet(t *testing.T) { 16 type args struct { 17 subnet *net.IPNet 18 } 19 tests := []struct { 20 name string 21 args args 22 want *net.IPNet 23 wantErr bool 24 }{ 25 {"class b", args{subnet: parseCIDR("192.168.0.0/16")}, parseCIDR("192.169.0.0/16"), false}, 26 {"class c", args{subnet: parseCIDR("192.168.1.0/24")}, parseCIDR("192.168.2.0/24"), false}, 27 } 28 for _, tt := range tests { 29 test := tt 30 t.Run(test.name, func(t *testing.T) { 31 got, err := NextSubnet(test.args.subnet) 32 if (err != nil) != test.wantErr { 33 t.Errorf("NextSubnet() error = %v, wantErr %v", err, test.wantErr) 34 return 35 } 36 if !reflect.DeepEqual(got, test.want) { 37 t.Errorf("NextSubnet() got = %v, want %v", got, test.want) 38 } 39 }) 40 } 41 } 42 43 func TestFirstIPInSubnet(t *testing.T) { 44 tests := []struct { 45 name string 46 args *net.IPNet 47 want net.IP 48 wantErr bool 49 }{ 50 {"class b", parseCIDR("192.168.0.0/16"), net.ParseIP("192.168.0.1"), false}, 51 {"class c", parseCIDR("192.168.1.0/24"), net.ParseIP("192.168.1.1"), false}, 52 {"cidr /23", parseCIDR("192.168.0.0/23"), net.ParseIP("192.168.0.1"), false}, 53 {"cidr /25", parseCIDR("192.168.1.0/25"), net.ParseIP("192.168.1.1"), false}, 54 {"cidr /26", parseCIDR("172.16.1.128/26"), net.ParseIP("172.16.1.129"), false}, 55 {"class a", parseCIDR("10.0.0.0/8"), net.ParseIP("10.0.0.1"), false}, 56 {"cidr /32", parseCIDR("192.168.255.4/32"), net.ParseIP("192.168.255.4"), false}, 57 {"cidr /31", parseCIDR("192.168.255.4/31"), net.ParseIP("192.168.255.5"), false}, 58 } 59 for _, tt := range tests { 60 test := tt 61 t.Run(test.name, func(t *testing.T) { 62 got, err := FirstIPInSubnet(test.args) 63 if (err != nil) != test.wantErr { 64 t.Errorf("FirstIPInSubnet() error = %v, wantErr %v", err, test.wantErr) 65 return 66 } 67 if !got.Equal(test.want) { 68 t.Errorf("FirstIPInSubnet() got = %v, want %v", got, test.want) 69 } 70 }) 71 } 72 } 73 74 func TestLastIPInSubnet(t *testing.T) { 75 tests := []struct { 76 name string 77 args *net.IPNet 78 want net.IP 79 wantErr bool 80 }{ 81 {"class b", parseCIDR("192.168.0.0/16"), net.ParseIP("192.168.255.255"), false}, 82 {"class c", parseCIDR("192.168.1.0/24"), net.ParseIP("192.168.1.255"), false}, 83 {"cidr /23", parseCIDR("192.168.0.0/23"), net.ParseIP("192.168.1.255"), false}, 84 {"cidr /25", parseCIDR("192.168.1.0/25"), net.ParseIP("192.168.1.127"), false}, 85 {"cidr /26", parseCIDR("172.16.1.128/26"), net.ParseIP("172.16.1.191"), false}, 86 {"class a", parseCIDR("10.0.0.0/8"), net.ParseIP("10.255.255.255"), false}, 87 {"cidr /32", parseCIDR("192.168.255.4/32"), net.ParseIP("192.168.255.4"), false}, 88 {"cidr /31", parseCIDR("192.168.255.4/31"), net.ParseIP("192.168.255.5"), false}, 89 } 90 for _, tt := range tests { 91 test := tt 92 t.Run(test.name, func(t *testing.T) { 93 got, err := LastIPInSubnet(test.args) 94 if (err != nil) != test.wantErr { 95 t.Errorf("LastIPInSubnet() error = %v, wantErr %v", err, test.wantErr) 96 return 97 } 98 if !got.Equal(test.want) { 99 t.Errorf("LastIPInSubnet() got = %v, want %v", got, test.want) 100 } 101 }) 102 } 103 } 104 105 func TestGetRandomIPv6Subnet(t *testing.T) { 106 for i := 0; i < 1000; i++ { 107 t.Run(fmt.Sprintf("GetRandomIPv6Subnet %d", i), func(t *testing.T) { 108 sub, err := GetRandomIPv6Subnet() 109 if err != nil { 110 t.Errorf("GetRandomIPv6Subnet() error should be nil: %v", err) 111 return 112 } 113 if sub.IP.To4() != nil { 114 t.Errorf("ip %s is not an ipv6 address", sub.IP) 115 } 116 if sub.IP[0] != 0xfd { 117 t.Errorf("ipv6 %s does not start with fd", sub.IP) 118 } 119 ones, bytes := sub.Mask.Size() 120 if ones != 64 || bytes != 128 { 121 t.Errorf("wrong network mask %v, it should be /64", sub.Mask) 122 } 123 }) 124 } 125 }