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 }