github.com/zhuohuang-hust/src-cbuild@v0.0.0-20230105071821-c7aab3e7c840/mergeCode/libnetwork/netutils/utils_test.go (about) 1 // +build !solaris 2 3 package netutils 4 5 import ( 6 "bytes" 7 "net" 8 "testing" 9 10 "github.com/docker/libnetwork/ipamutils" 11 "github.com/docker/libnetwork/testutils" 12 "github.com/docker/libnetwork/types" 13 "github.com/vishvananda/netlink" 14 ) 15 16 func TestNonOverlapingNameservers(t *testing.T) { 17 network := &net.IPNet{ 18 IP: []byte{192, 168, 0, 1}, 19 Mask: []byte{255, 255, 255, 0}, 20 } 21 nameservers := []string{ 22 "127.0.0.1/32", 23 } 24 25 if err := CheckNameserverOverlaps(nameservers, network); err != nil { 26 t.Fatal(err) 27 } 28 } 29 30 func TestOverlapingNameservers(t *testing.T) { 31 network := &net.IPNet{ 32 IP: []byte{192, 168, 0, 1}, 33 Mask: []byte{255, 255, 255, 0}, 34 } 35 nameservers := []string{ 36 "192.168.0.1/32", 37 } 38 39 if err := CheckNameserverOverlaps(nameservers, network); err == nil { 40 t.Fatalf("Expected error %s got %s", ErrNetworkOverlapsWithNameservers, err) 41 } 42 } 43 44 func TestCheckRouteOverlaps(t *testing.T) { 45 networkGetRoutesFct = func(netlink.Link, int) ([]netlink.Route, error) { 46 routesData := []string{"10.0.2.0/32", "10.0.3.0/24", "10.0.42.0/24", "172.16.42.0/24", "192.168.142.0/24"} 47 routes := []netlink.Route{} 48 for _, addr := range routesData { 49 _, netX, _ := net.ParseCIDR(addr) 50 routes = append(routes, netlink.Route{Dst: netX}) 51 } 52 return routes, nil 53 } 54 defer func() { networkGetRoutesFct = nil }() 55 56 _, netX, _ := net.ParseCIDR("172.16.0.1/24") 57 if err := CheckRouteOverlaps(netX); err != nil { 58 t.Fatal(err) 59 } 60 61 _, netX, _ = net.ParseCIDR("10.0.2.0/24") 62 if err := CheckRouteOverlaps(netX); err == nil { 63 t.Fatalf("10.0.2.0/24 and 10.0.2.0 should overlap but it doesn't") 64 } 65 } 66 67 func TestCheckNameserverOverlaps(t *testing.T) { 68 nameservers := []string{"10.0.2.3/32", "192.168.102.1/32"} 69 70 _, netX, _ := net.ParseCIDR("10.0.2.3/32") 71 72 if err := CheckNameserverOverlaps(nameservers, netX); err == nil { 73 t.Fatalf("%s should overlap 10.0.2.3/32 but doesn't", netX) 74 } 75 76 _, netX, _ = net.ParseCIDR("192.168.102.2/32") 77 78 if err := CheckNameserverOverlaps(nameservers, netX); err != nil { 79 t.Fatalf("%s should not overlap %v but it does", netX, nameservers) 80 } 81 } 82 83 func AssertOverlap(CIDRx string, CIDRy string, t *testing.T) { 84 _, netX, _ := net.ParseCIDR(CIDRx) 85 _, netY, _ := net.ParseCIDR(CIDRy) 86 if !NetworkOverlaps(netX, netY) { 87 t.Errorf("%v and %v should overlap", netX, netY) 88 } 89 } 90 91 func AssertNoOverlap(CIDRx string, CIDRy string, t *testing.T) { 92 _, netX, _ := net.ParseCIDR(CIDRx) 93 _, netY, _ := net.ParseCIDR(CIDRy) 94 if NetworkOverlaps(netX, netY) { 95 t.Errorf("%v and %v should not overlap", netX, netY) 96 } 97 } 98 99 func TestNetworkOverlaps(t *testing.T) { 100 //netY starts at same IP and ends within netX 101 AssertOverlap("172.16.0.1/24", "172.16.0.1/25", t) 102 //netY starts within netX and ends at same IP 103 AssertOverlap("172.16.0.1/24", "172.16.0.128/25", t) 104 //netY starts and ends within netX 105 AssertOverlap("172.16.0.1/24", "172.16.0.64/25", t) 106 //netY starts at same IP and ends outside of netX 107 AssertOverlap("172.16.0.1/24", "172.16.0.1/23", t) 108 //netY starts before and ends at same IP of netX 109 AssertOverlap("172.16.1.1/24", "172.16.0.1/23", t) 110 //netY starts before and ends outside of netX 111 AssertOverlap("172.16.1.1/24", "172.16.0.1/22", t) 112 //netY starts and ends before netX 113 AssertNoOverlap("172.16.1.1/25", "172.16.0.1/24", t) 114 //netX starts and ends before netY 115 AssertNoOverlap("172.16.1.1/25", "172.16.2.1/24", t) 116 } 117 118 func TestNetworkRange(t *testing.T) { 119 // Simple class C test 120 _, network, _ := net.ParseCIDR("192.168.0.1/24") 121 first, last := NetworkRange(network) 122 if !first.Equal(net.ParseIP("192.168.0.0")) { 123 t.Error(first.String()) 124 } 125 if !last.Equal(net.ParseIP("192.168.0.255")) { 126 t.Error(last.String()) 127 } 128 129 // Class A test 130 _, network, _ = net.ParseCIDR("10.0.0.1/8") 131 first, last = NetworkRange(network) 132 if !first.Equal(net.ParseIP("10.0.0.0")) { 133 t.Error(first.String()) 134 } 135 if !last.Equal(net.ParseIP("10.255.255.255")) { 136 t.Error(last.String()) 137 } 138 139 // Class A, random IP address 140 _, network, _ = net.ParseCIDR("10.1.2.3/8") 141 first, last = NetworkRange(network) 142 if !first.Equal(net.ParseIP("10.0.0.0")) { 143 t.Error(first.String()) 144 } 145 if !last.Equal(net.ParseIP("10.255.255.255")) { 146 t.Error(last.String()) 147 } 148 149 // 32bit mask 150 _, network, _ = net.ParseCIDR("10.1.2.3/32") 151 first, last = NetworkRange(network) 152 if !first.Equal(net.ParseIP("10.1.2.3")) { 153 t.Error(first.String()) 154 } 155 if !last.Equal(net.ParseIP("10.1.2.3")) { 156 t.Error(last.String()) 157 } 158 159 // 31bit mask 160 _, network, _ = net.ParseCIDR("10.1.2.3/31") 161 first, last = NetworkRange(network) 162 if !first.Equal(net.ParseIP("10.1.2.2")) { 163 t.Error(first.String()) 164 } 165 if !last.Equal(net.ParseIP("10.1.2.3")) { 166 t.Error(last.String()) 167 } 168 169 // 26bit mask 170 _, network, _ = net.ParseCIDR("10.1.2.3/26") 171 first, last = NetworkRange(network) 172 if !first.Equal(net.ParseIP("10.1.2.0")) { 173 t.Error(first.String()) 174 } 175 if !last.Equal(net.ParseIP("10.1.2.63")) { 176 t.Error(last.String()) 177 } 178 } 179 180 // Test veth name generation "veth"+rand (e.g.veth0f60e2c) 181 func TestGenerateRandomName(t *testing.T) { 182 name1, err := GenerateRandomName("veth", 7) 183 if err != nil { 184 t.Fatal(err) 185 } 186 // veth plus generated append equals a len of 11 187 if len(name1) != 11 { 188 t.Fatalf("Expected 11 characters, instead received %d characters", len(name1)) 189 } 190 name2, err := GenerateRandomName("veth", 7) 191 if err != nil { 192 t.Fatal(err) 193 } 194 // Fail if the random generated names equal one another 195 if name1 == name2 { 196 t.Fatalf("Expected differing values but received %s and %s", name1, name2) 197 } 198 } 199 200 // Test mac generation. 201 func TestUtilGenerateRandomMAC(t *testing.T) { 202 mac1 := GenerateRandomMAC() 203 mac2 := GenerateRandomMAC() 204 // ensure bytes are unique 205 if bytes.Equal(mac1, mac2) { 206 t.Fatalf("mac1 %s should not equal mac2 %s", mac1, mac2) 207 } 208 // existing tests check string functionality so keeping the pattern 209 if mac1.String() == mac2.String() { 210 t.Fatalf("mac1 %s should not equal mac2 %s", mac1, mac2) 211 } 212 } 213 214 func TestNetworkRequest(t *testing.T) { 215 defer testutils.SetupTestOSContext(t)() 216 ipamutils.InitNetworks() 217 218 nw, err := FindAvailableNetwork(ipamutils.PredefinedBroadNetworks) 219 if err != nil { 220 t.Fatal(err) 221 } 222 223 var found bool 224 for _, exp := range ipamutils.PredefinedBroadNetworks { 225 if types.CompareIPNet(exp, nw) { 226 found = true 227 break 228 } 229 } 230 231 if !found { 232 t.Fatalf("Found unexpected broad network %s", nw) 233 } 234 235 nw, err = FindAvailableNetwork(ipamutils.PredefinedGranularNetworks) 236 if err != nil { 237 t.Fatal(err) 238 } 239 240 found = false 241 for _, exp := range ipamutils.PredefinedGranularNetworks { 242 if types.CompareIPNet(exp, nw) { 243 found = true 244 break 245 } 246 } 247 248 if !found { 249 t.Fatalf("Found unexpected granular network %s", nw) 250 } 251 252 // Add iface and ssert returned address on request 253 createInterface(t, "test", "172.17.42.1/16") 254 255 _, exp, err := net.ParseCIDR("172.18.0.0/16") 256 if err != nil { 257 t.Fatal(err) 258 } 259 nw, err = FindAvailableNetwork(ipamutils.PredefinedBroadNetworks) 260 if err != nil { 261 t.Fatal(err) 262 } 263 if !types.CompareIPNet(exp, nw) { 264 t.Fatalf("exected %s. got %s", exp, nw) 265 } 266 } 267 268 func TestElectInterfaceAddress(t *testing.T) { 269 defer testutils.SetupTestOSContext(t)() 270 ipamutils.InitNetworks() 271 272 nws := "172.101.202.254/16" 273 createInterface(t, "test", nws) 274 275 ipv4Nw, ipv6Nw, err := ElectInterfaceAddresses("test") 276 if err != nil { 277 t.Fatal(err) 278 } 279 280 if ipv4Nw == nil { 281 t.Fatalf("unexpected empty ipv4 network addresses") 282 } 283 284 if len(ipv6Nw) == 0 { 285 t.Fatalf("unexpected empty ipv4 network addresses") 286 } 287 288 if nws != ipv4Nw.String() { 289 t.Fatalf("expected %s. got %s", nws, ipv4Nw) 290 } 291 } 292 293 func createInterface(t *testing.T, name, nw string) { 294 // Add interface 295 link := &netlink.Bridge{ 296 LinkAttrs: netlink.LinkAttrs{ 297 Name: "test", 298 }, 299 } 300 bip, err := types.ParseCIDR(nw) 301 if err != nil { 302 t.Fatal(err) 303 } 304 if err = netlink.LinkAdd(link); err != nil { 305 t.Fatalf("Failed to create interface via netlink: %v", err) 306 } 307 if err := netlink.AddrAdd(link, &netlink.Addr{IPNet: bip}); err != nil { 308 t.Fatal(err) 309 } 310 if err = netlink.LinkSetUp(link); err != nil { 311 t.Fatal(err) 312 } 313 }