github.com/containers/podman/v2@v2.2.2-0.20210501105131-c1e07d070c4c/libpod/network/create_test.go (about) 1 package network 2 3 import ( 4 "net" 5 "testing" 6 7 "github.com/containers/podman/v2/pkg/domain/entities" 8 ) 9 10 func Test_validateBridgeOptions(t *testing.T) { 11 12 tests := []struct { 13 name string 14 subnet net.IPNet 15 ipRange net.IPNet 16 gateway net.IP 17 isIPv6 bool 18 wantErr bool 19 }{ 20 { 21 name: "IPv4 subnet only", 22 subnet: net.IPNet{IP: net.IPv4(192, 168, 0, 0), Mask: net.IPv4Mask(255, 255, 255, 0)}, 23 }, 24 { 25 name: "IPv4 subnet and range", 26 subnet: net.IPNet{IP: net.IPv4(192, 168, 0, 0), Mask: net.IPv4Mask(255, 255, 255, 0)}, 27 ipRange: net.IPNet{IP: net.IPv4(192, 168, 0, 128), Mask: net.IPv4Mask(255, 255, 255, 128)}, 28 }, 29 { 30 name: "IPv4 subnet and gateway", 31 subnet: net.IPNet{IP: net.IPv4(192, 168, 0, 0), Mask: net.IPv4Mask(255, 255, 255, 0)}, 32 gateway: net.ParseIP("192.168.0.10"), 33 }, 34 { 35 name: "IPv4 subnet, range and gateway", 36 subnet: net.IPNet{IP: net.IPv4(192, 168, 0, 0), Mask: net.IPv4Mask(255, 255, 255, 0)}, 37 ipRange: net.IPNet{IP: net.IPv4(192, 168, 0, 128), Mask: net.IPv4Mask(255, 255, 255, 128)}, 38 gateway: net.ParseIP("192.168.0.10"), 39 }, 40 { 41 name: "IPv6 subnet only", 42 subnet: net.IPNet{IP: net.ParseIP("2001:DB8::"), Mask: net.IPMask(net.ParseIP("ffff:ffff:ffff::"))}, 43 }, 44 { 45 name: "IPv6 subnet and range", 46 subnet: net.IPNet{IP: net.ParseIP("2001:DB8::"), Mask: net.IPMask(net.ParseIP("ffff:ffff:ffff::"))}, 47 ipRange: net.IPNet{IP: net.ParseIP("2001:DB8:0:0:1::"), Mask: net.IPMask(net.ParseIP("ffff:ffff:ffff:ffff::"))}, 48 isIPv6: true, 49 }, 50 { 51 name: "IPv6 subnet and gateway", 52 subnet: net.IPNet{IP: net.ParseIP("2001:DB8::"), Mask: net.IPMask(net.ParseIP("ffff:ffff:ffff::"))}, 53 gateway: net.ParseIP("2001:DB8::2"), 54 isIPv6: true, 55 }, 56 { 57 name: "IPv6 subnet, range and gateway", 58 subnet: net.IPNet{IP: net.ParseIP("2001:DB8::"), Mask: net.IPMask(net.ParseIP("ffff:ffff:ffff::"))}, 59 ipRange: net.IPNet{IP: net.ParseIP("2001:DB8:0:0:1::"), Mask: net.IPMask(net.ParseIP("ffff:ffff:ffff:ffff::"))}, 60 gateway: net.ParseIP("2001:DB8::2"), 61 isIPv6: true, 62 }, 63 { 64 name: "IPv6 subnet, range and gateway without IPv6 option (PODMAN SUPPORTS IT UNLIKE DOCKEr)", 65 subnet: net.IPNet{IP: net.ParseIP("2001:DB8::"), Mask: net.IPMask(net.ParseIP("ffff:ffff:ffff::"))}, 66 ipRange: net.IPNet{IP: net.ParseIP("2001:DB8:0:0:1::"), Mask: net.IPMask(net.ParseIP("ffff:ffff:ffff:ffff::"))}, 67 gateway: net.ParseIP("2001:DB8::2"), 68 isIPv6: false, 69 }, 70 { 71 name: "range provided but not subnet", 72 ipRange: net.IPNet{IP: net.IPv4(192, 168, 0, 128), Mask: net.IPv4Mask(255, 255, 255, 128)}, 73 wantErr: true, 74 }, 75 { 76 name: "gateway provided but not subnet", 77 gateway: net.ParseIP("192.168.0.10"), 78 wantErr: true, 79 }, 80 { 81 name: "IPv4 subnet but IPv6 required", 82 subnet: net.IPNet{IP: net.IPv4(192, 168, 0, 0), Mask: net.IPv4Mask(255, 255, 255, 0)}, 83 ipRange: net.IPNet{IP: net.IPv4(192, 168, 0, 128), Mask: net.IPv4Mask(255, 255, 255, 128)}, 84 gateway: net.ParseIP("192.168.0.10"), 85 isIPv6: true, 86 wantErr: true, 87 }, 88 { 89 name: "IPv6 required but IPv4 options used", 90 subnet: net.IPNet{IP: net.IPv4(192, 168, 0, 0), Mask: net.IPv4Mask(255, 255, 255, 0)}, 91 ipRange: net.IPNet{IP: net.IPv4(192, 168, 0, 128), Mask: net.IPv4Mask(255, 255, 255, 128)}, 92 gateway: net.ParseIP("192.168.0.10"), 93 isIPv6: true, 94 wantErr: true, 95 }, 96 { 97 name: "IPv6 required but not subnet provided", 98 isIPv6: true, 99 wantErr: true, 100 }, 101 { 102 name: "range out of the subnet", 103 subnet: net.IPNet{IP: net.ParseIP("2001:DB8::"), Mask: net.IPMask(net.ParseIP("ffff:ffff:ffff::"))}, 104 ipRange: net.IPNet{IP: net.ParseIP("2001:1:1::"), Mask: net.IPMask(net.ParseIP("ffff:ffff:ffff:ffff::"))}, 105 gateway: net.ParseIP("2001:DB8::2"), 106 isIPv6: true, 107 wantErr: true, 108 }, 109 { 110 name: "gateway out of the subnet", 111 subnet: net.IPNet{IP: net.ParseIP("2001:DB8::"), Mask: net.IPMask(net.ParseIP("ffff:ffff:ffff::"))}, 112 gateway: net.ParseIP("2001::2"), 113 isIPv6: true, 114 wantErr: true, 115 }, 116 } 117 for _, tt := range tests { 118 tt := tt 119 t.Run(tt.name, func(t *testing.T) { 120 options := entities.NetworkCreateOptions{ 121 Subnet: tt.subnet, 122 Range: tt.ipRange, 123 Gateway: tt.gateway, 124 IPv6: tt.isIPv6, 125 } 126 if err := validateBridgeOptions(options); (err != nil) != tt.wantErr { 127 t.Errorf("validateBridgeOptions() error = %v, wantErr %v", err, tt.wantErr) 128 } 129 }) 130 } 131 }