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  }