github.com/microsoft/moc@v0.17.1/pkg/net/net_test.go (about)

     1  // Copyright (c) Microsoft Corporation. All rights reserved.
     2  // Licensed under the Apache v2.0 license.
     3  package net
     4  
     5  import (
     6  	"net"
     7  	"testing"
     8  
     9  	"github.com/stretchr/testify/require"
    10  )
    11  
    12  func Test_Or(t *testing.T) {
    13  	var ip1, ip2, ip3 net.IP
    14  
    15  	ip1 = net.ParseIP("255.255.0.0")
    16  	ip2 = net.ParseIP("0.0.255.255")
    17  	ip3 = Or(ip1, ip2)
    18  	require.Equal(t, net.ParseIP("255.255.255.255"), ip3)
    19  
    20  	ip1 = net.ParseIP("0.0.0.0")
    21  	ip2 = net.ParseIP("0.0.0.0")
    22  	ip3 = Or(ip1, ip2)
    23  	require.Equal(t, net.ParseIP("0.0.0.0"), ip3)
    24  
    25  	ip1 = net.ParseIP("255.255.255.255")
    26  	ip2 = net.ParseIP("255.255.255.255")
    27  	ip3 = Or(ip1, ip2)
    28  	require.Equal(t, net.ParseIP("255.255.255.255"), ip3)
    29  
    30  	ip1 = net.ParseIP("170.170.170.170")
    31  	ip2 = net.ParseIP("85.85.85.85")
    32  	ip3 = Or(ip1, ip2)
    33  	require.Equal(t, net.ParseIP("255.255.255.255"), ip3)
    34  }
    35  
    36  func Test_Not(t *testing.T) {
    37  	var ip1, ip2 net.IP
    38  
    39  	ip1 = net.ParseIP("0.0.0.0").To4()
    40  	ip2 = Not(ip1)
    41  	require.Equal(t, net.ParseIP("255.255.255.255").To4(), ip2)
    42  
    43  	ip1 = net.ParseIP("255.255.255.255").To4()
    44  	ip2 = Not(ip1)
    45  	require.Equal(t, net.ParseIP("0.0.0.0").To4(), ip2)
    46  
    47  	ip1 = net.ParseIP("170.170.170.170").To4()
    48  	ip2 = Not(ip1)
    49  	require.Equal(t, net.ParseIP("85.85.85.85").To4(), ip2)
    50  
    51  }
    52  
    53  func Test_Increment(t *testing.T) {
    54  	var ip1, ip2 net.IP
    55  
    56  	ip1 = net.ParseIP("0.0.0.0")
    57  	ip2 = Increment(ip1)
    58  	require.Equal(t, net.ParseIP("0.0.0.1"), ip2)
    59  
    60  	ip1 = net.ParseIP("0.0.0.255")
    61  	ip2 = Increment(ip1)
    62  	require.Equal(t, net.ParseIP("0.0.1.0"), ip2)
    63  
    64  	ip1 = net.ParseIP("0.0.255.255")
    65  	ip2 = Increment(ip1)
    66  	require.Equal(t, net.ParseIP("0.1.0.0"), ip2)
    67  
    68  	ip1 = net.ParseIP("0.255.255.255")
    69  	ip2 = Increment(ip1)
    70  	require.Equal(t, net.ParseIP("1.0.0.0"), ip2)
    71  
    72  	ip1 = net.ParseIP("255.255.255.255").To4()
    73  	ip2 = Increment(ip1)
    74  	require.Equal(t, net.ParseIP("0.0.0.0").To4(), ip2)
    75  
    76  }
    77  func Test_Decrement(t *testing.T) {
    78  	var ip1, ip2 net.IP
    79  
    80  	ip1 = net.ParseIP("0.0.0.1")
    81  	ip2 = Decrement(ip1)
    82  	require.Equal(t, net.ParseIP("0.0.0.1"), ip1)
    83  	require.Equal(t, net.ParseIP("0.0.0.0"), ip2)
    84  
    85  	ip1 = net.ParseIP("255.255.255.255")
    86  	ip2 = Decrement(ip1)
    87  	require.Equal(t, net.ParseIP("255.255.255.254"), ip2)
    88  
    89  	ip1 = net.ParseIP("255.255.255.0")
    90  	ip2 = Decrement(ip1)
    91  	require.Equal(t, net.ParseIP("255.255.254.255"), ip2)
    92  
    93  	ip1 = net.ParseIP("255.255.0.0")
    94  	ip2 = Decrement(ip1)
    95  	require.Equal(t, net.ParseIP("255.254.255.255"), ip2)
    96  
    97  	ip1 = net.ParseIP("255.0.0.0")
    98  	ip2 = Decrement(ip1)
    99  	require.Equal(t, net.ParseIP("254.255.255.255"), ip2)
   100  
   101  	ip1 = net.ParseIP("0.0.0.0").To4()
   102  	ip2 = Decrement(ip1)
   103  	require.Equal(t, net.ParseIP("255.255.255.255").To4(), ip2)
   104  }
   105  
   106  func Test_PrefixesOverlap(t *testing.T) {
   107  	_, cidr1, _ := net.ParseCIDR("192.10.0.0/16")
   108  	_, cidr2, _ := net.ParseCIDR("192.10.0.0/16")
   109  	require.True(t, PrefixesOverlap(*cidr1, *cidr2))
   110  	require.True(t, PrefixesOverlap(*cidr2, *cidr1))
   111  
   112  	_, cidr2, _ = net.ParseCIDR("192.10.0.0/32")
   113  	require.True(t, PrefixesOverlap(*cidr1, *cidr2))
   114  	require.True(t, PrefixesOverlap(*cidr2, *cidr1))
   115  
   116  	_, cidr2, _ = net.ParseCIDR("192.10.1.0/24")
   117  	require.True(t, PrefixesOverlap(*cidr1, *cidr2))
   118  	require.True(t, PrefixesOverlap(*cidr2, *cidr1))
   119  
   120  	_, cidr2, _ = net.ParseCIDR("192.10.255.255/32")
   121  	require.True(t, PrefixesOverlap(*cidr1, *cidr2))
   122  	require.True(t, PrefixesOverlap(*cidr2, *cidr1))
   123  
   124  	_, cidr2, _ = net.ParseCIDR("192.11.0.0/24")
   125  	require.False(t, PrefixesOverlap(*cidr1, *cidr2))
   126  	require.False(t, PrefixesOverlap(*cidr2, *cidr1))
   127  }
   128  
   129  func Test_GetCIDR(t *testing.T) {
   130  	var startip, endip net.IP
   131  	var cidr *net.IPNet
   132  	var err error
   133  	var prefixlen int
   134  
   135  	startip = net.ParseIP("192.168.0.0").To4()
   136  	endip = net.ParseIP("192.168.0.255").To4()
   137  	cidr, err = GetCIDR(startip, endip)
   138  	require.NoError(t, err)
   139  	require.Equal(t, net.ParseIP("192.168.0.0").To4(), cidr.IP)
   140  	prefixlen, _ = cidr.Mask.Size()
   141  	require.Equal(t, 24, prefixlen)
   142  
   143  	startip = net.ParseIP("192.168.0.0").To4()
   144  	endip = net.ParseIP("192.168.255.255").To4()
   145  	cidr, err = GetCIDR(startip, endip)
   146  	require.NoError(t, err)
   147  	require.Equal(t, net.ParseIP("192.168.0.0").To4(), cidr.IP)
   148  	prefixlen, _ = cidr.Mask.Size()
   149  	require.Equal(t, 16, prefixlen)
   150  
   151  	startip = net.ParseIP("192.168.0.5").To4()
   152  	endip = net.ParseIP("192.168.0.5").To4()
   153  	cidr, err = GetCIDR(startip, endip)
   154  	require.NoError(t, err)
   155  	require.Equal(t, net.ParseIP("192.168.0.5").To4(), cidr.IP)
   156  	prefixlen, _ = cidr.Mask.Size()
   157  	require.Equal(t, 32, prefixlen)
   158  
   159  	startip = net.ParseIP("192.168.0.0").To4()
   160  	endip = net.ParseIP("192.168.0.1").To4()
   161  	cidr, err = GetCIDR(startip, endip)
   162  	require.NoError(t, err)
   163  	require.Equal(t, net.ParseIP("192.168.0.0").To4(), cidr.IP)
   164  	prefixlen, _ = cidr.Mask.Size()
   165  	require.Equal(t, 31, prefixlen)
   166  
   167  	startip = net.ParseIP("192.168.0.0").To4()
   168  	endip = net.ParseIP("192.168.0.15").To4()
   169  	cidr, err = GetCIDR(startip, endip)
   170  	require.NoError(t, err)
   171  	require.Equal(t, net.ParseIP("192.168.0.0").To4(), cidr.IP)
   172  	prefixlen, _ = cidr.Mask.Size()
   173  	require.Equal(t, 28, prefixlen)
   174  
   175  	startip = net.ParseIP("192.168.0.5").To4()
   176  	endip = net.ParseIP("192.168.0.15").To4()
   177  	cidr, err = GetCIDR(startip, endip)
   178  	require.NoError(t, err)
   179  	require.Equal(t, net.ParseIP("192.168.0.0").To4(), cidr.IP)
   180  	prefixlen, _ = cidr.Mask.Size()
   181  	require.Equal(t, 28, prefixlen)
   182  
   183  	startip = net.ParseIP("192.168.0.1").To4()
   184  	endip = net.ParseIP("192.168.0.14").To4()
   185  	cidr, err = GetCIDR(startip, endip)
   186  	require.NoError(t, err)
   187  	require.Equal(t, net.ParseIP("192.168.0.0").To4(), cidr.IP)
   188  	prefixlen, _ = cidr.Mask.Size()
   189  	require.Equal(t, 28, prefixlen)
   190  
   191  	startip = net.ParseIP("192.168.0.1").To4()
   192  	endip = net.ParseIP("255.168.0.14").To4()
   193  	cidr, err = GetCIDR(startip, endip)
   194  	require.NoError(t, err)
   195  	require.Equal(t, net.ParseIP("192.0.0.0").To4(), cidr.IP)
   196  	prefixlen, _ = cidr.Mask.Size()
   197  	require.Equal(t, 2, prefixlen)
   198  
   199  	startip = net.ParseIP("128.168.0.1").To4()
   200  	endip = net.ParseIP("255.168.0.14").To4()
   201  	cidr, err = GetCIDR(startip, endip)
   202  	require.NoError(t, err)
   203  	require.Equal(t, net.ParseIP("128.0.0.0").To4(), cidr.IP)
   204  	prefixlen, _ = cidr.Mask.Size()
   205  	require.Equal(t, 1, prefixlen)
   206  
   207  	startip = net.ParseIP("ffe0::")
   208  	endip = net.ParseIP("fff0::")
   209  	cidr, err = GetCIDR(startip, endip)
   210  	require.NoError(t, err)
   211  	require.Equal(t, net.ParseIP("ffe0::"), cidr.IP)
   212  	prefixlen, _ = cidr.Mask.Size()
   213  	require.Equal(t, 11, prefixlen)
   214  }
   215  
   216  func Test_GetBroadcastAddress(t *testing.T) {
   217  	_, s1, _ := net.ParseCIDR("10.0.0.0/24")
   218  	b1 := GetBroadcastAddress(*s1)
   219  	require.Equal(t, b1, net.ParseIP("10.0.0.255"))
   220  
   221  	_, s2, _ := net.ParseCIDR("2001::/64")
   222  	b2 := GetBroadcastAddress(*s2)
   223  	require.Equal(t, b2, net.ParseIP("2001::ffff:ffff:ffff:ffff"))
   224  }
   225  
   226  func Test_RangesOverlap(t *testing.T) {
   227  	//exact overlap
   228  	require.True(t, RangesOverlap(net.ParseIP("1.0.0.0"), net.ParseIP("1.0.0.255"), net.ParseIP("1.0.0.0"), net.ParseIP("1.0.0.255")))
   229  
   230  	//same start address different ending address
   231  	require.True(t, RangesOverlap(net.ParseIP("1.0.0.0"), net.ParseIP("1.0.0.255"), net.ParseIP("1.0.0.0"), net.ParseIP("1.0.255.255")))
   232  	require.True(t, RangesOverlap(net.ParseIP("1.0.0.0"), net.ParseIP("1.0.0.255"), net.ParseIP("1.0.0.0"), net.ParseIP("1.0.0.128")))
   233  
   234  	//same ending address different starting address
   235  	require.True(t, RangesOverlap(net.ParseIP("1.0.0.0"), net.ParseIP("1.0.0.255"), net.ParseIP("1.0.0.128"), net.ParseIP("1.0.0.255")))
   236  	require.True(t, RangesOverlap(net.ParseIP("1.0.0.0"), net.ParseIP("1.0.0.255"), net.ParseIP("0.0.0.128"), net.ParseIP("1.0.0.255")))
   237  
   238  	//ranges are side by side
   239  	require.True(t, RangesOverlap(net.ParseIP("1.0.0.0"), net.ParseIP("1.0.0.255"), net.ParseIP("1.0.0.255"), net.ParseIP("2.0.0.0")))
   240  	require.True(t, RangesOverlap(net.ParseIP("1.0.0.0"), net.ParseIP("1.0.0.255"), net.ParseIP("0.0.0.255"), net.ParseIP("1.0.0.0")))
   241  
   242  	//range 1 overlaps with the left side  of range 2
   243  	require.True(t, RangesOverlap(net.ParseIP("1.0.0.0"), net.ParseIP("1.0.0.255"), net.ParseIP("1.0.0.128"), net.ParseIP("2.0.0.0")))
   244  
   245  	//range 1 overlaps with the right side  of range 2
   246  	require.True(t, RangesOverlap(net.ParseIP("1.0.0.0"), net.ParseIP("1.0.0.255"), net.ParseIP("0.0.0.128"), net.ParseIP("1.0.0.128")))
   247  
   248  	//no overlap: range 1 is to the left of range 2
   249  	require.False(t, RangesOverlap(net.ParseIP("1.0.0.0"), net.ParseIP("1.0.0.255"), net.ParseIP("2.0.0.0"), net.ParseIP("2.0.0.255")))
   250  
   251  	//no overlap: range 1 is to the right of range 2
   252  	require.False(t, RangesOverlap(net.ParseIP("1.0.0.0"), net.ParseIP("1.0.0.255"), net.ParseIP("0.0.0.0"), net.ParseIP("0.0.0.255")))
   253  }
   254  
   255  func Test_IsRangeInCIDR(t *testing.T) {
   256  	_, cidr, _ := net.ParseCIDR("10.0.0.0/24")
   257  	require.True(t, IsRangeInCIDR(net.ParseIP("10.0.0.0"), net.ParseIP("10.0.0.5"), cidr))
   258  	require.True(t, IsRangeInCIDR(net.ParseIP("10.0.0.250"), net.ParseIP("10.0.0.255"), cidr))
   259  	require.True(t, IsRangeInCIDR(net.ParseIP("10.0.0.0"), net.ParseIP("10.0.0.255"), cidr))
   260  
   261  	require.False(t, IsRangeInCIDR(net.ParseIP("9.0.0.0"), net.ParseIP("10.0.0.1"), cidr))
   262  	require.False(t, IsRangeInCIDR(net.ParseIP("10.0.0.254"), net.ParseIP("11.0.0.0"), cidr))
   263  
   264  	require.False(t, IsRangeInCIDR(net.ParseIP("9.0.0.0"), net.ParseIP("9.255.255.255"), cidr))
   265  	require.False(t, IsRangeInCIDR(net.ParseIP("10.0.1.0"), net.ParseIP("10.0.1.255"), cidr))
   266  }
   267  
   268  func Test_RangeContains(t *testing.T) {
   269  	require.True(t, RangeContains(net.ParseIP("10.0.0.0"), net.ParseIP("10.0.0.255"), net.ParseIP("10.0.0.0")))
   270  	require.True(t, RangeContains(net.ParseIP("10.0.0.0"), net.ParseIP("10.0.0.255"), net.ParseIP("10.0.0.255")))
   271  	require.True(t, RangeContains(net.ParseIP("10.0.0.0"), net.ParseIP("10.0.0.255"), net.ParseIP("10.0.0.1")))
   272  	require.True(t, RangeContains(net.ParseIP("10.0.0.0"), net.ParseIP("10.0.0.255"), net.ParseIP("10.0.0.254")))
   273  
   274  	require.False(t, RangeContains(net.ParseIP("10.0.0.0"), net.ParseIP("10.0.0.255"), net.ParseIP("9.255.255.255")))
   275  	require.False(t, RangeContains(net.ParseIP("10.0.0.0"), net.ParseIP("10.0.0.255"), net.ParseIP("10.0.1.0")))
   276  }