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  }