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