github.com/database64128/shadowsocks-go@v1.7.0/conn/addr_test.go (about) 1 package conn 2 3 import ( 4 "bytes" 5 "crypto/rand" 6 "net/netip" 7 "strings" 8 "testing" 9 ) 10 11 // Test zero value. 12 var ( 13 addrZero Addr 14 addrZeroPort uint16 15 addrZeroString string 16 ) 17 18 // Test IP address. 19 var ( 20 addrIP = AddrFromIPPort(addrIPAddrPort) 21 addrIPAddr = netip.AddrFrom16([16]byte{0x20, 0x01, 0x0d, 0xb8, 0xfa, 0xd6, 0x05, 0x72, 0xac, 0xbe, 0x71, 0x43, 0x14, 0xe5, 0x7a, 0x6e}) 22 addrIPPort uint16 = 1080 23 addrIPAddrPort = netip.AddrPortFrom(addrIPAddr, addrIPPort) 24 addrIPHost = "2001:db8:fad6:572:acbe:7143:14e5:7a6e" 25 addrIPString = "[2001:db8:fad6:572:acbe:7143:14e5:7a6e]:1080" 26 ) 27 28 // Test domain name. 29 var ( 30 addrDomain = MustAddrFromDomainPort(addrDomainHost, addrDomainPort) 31 addrDomainHost = "example.com" 32 addrDomainPort uint16 = 443 33 addrDomainString = "example.com:443" 34 ) 35 36 func TestAddrEquals(t *testing.T) { 37 if !addrZero.Equals(addrZero) { 38 t.Error("addrZero.Equals(addrZero) returned false.") 39 } 40 if !addrIP.Equals(addrIP) { 41 t.Error("addrIP.Equals(addrIP) returned false.") 42 } 43 if !addrDomain.Equals(addrDomain) { 44 t.Error("addrDomain.Equals(addrDomain) returned false.") 45 } 46 47 if addrZero.Equals(addrIP) { 48 t.Error("addrZero.Equals(addrIP) returned true.") 49 } 50 if addrZero.Equals(addrDomain) { 51 t.Error("addrZero.Equals(addrDomain) returned true.") 52 } 53 if addrIP.Equals(addrDomain) { 54 t.Error("addrIP.Equals(addrDomain) returned true.") 55 } 56 57 if addrIP443 := AddrFromIPPort(netip.AddrPortFrom(addrIPAddr, 443)); addrIP443.Equals(addrIP) { 58 t.Error("addrIP443.Equals(addrIP) returned true.") 59 } 60 } 61 62 func TestAddrIs(t *testing.T) { 63 if addrZero.IsValid() { 64 t.Error("addrZero.IsValid() returned true.") 65 } 66 if addrZero.IsIP() { 67 t.Error("addrZero.IsIP() returned true.") 68 } 69 if addrZero.IsDomain() { 70 t.Error("addrZero.IsDomain() returned true.") 71 } 72 73 if !addrIP.IsValid() { 74 t.Error("addrIP.IsValid() returned false.") 75 } 76 if !addrIP.IsIP() { 77 t.Error("addrIP.IsIP() returned false.") 78 } 79 if addrIP.IsDomain() { 80 t.Error("addrIP.IsDomain() returned true.") 81 } 82 83 if !addrDomain.IsValid() { 84 t.Error("addrDomain.IsValid() returned false.") 85 } 86 if addrDomain.IsIP() { 87 t.Error("addrDomain.IsIP() returned true.") 88 } 89 if !addrDomain.IsDomain() { 90 t.Error("addrDomain.IsDomain() returned false.") 91 } 92 } 93 94 func assertPanic(t *testing.T, f func()) { 95 t.Helper() 96 defer func() { 97 if r := recover(); r == nil { 98 t.Error("Expected panic, got none.") 99 } 100 }() 101 f() 102 } 103 104 func TestAddrIP(t *testing.T) { 105 if ip := addrIP.IP(); ip != addrIPAddr { 106 t.Errorf("addrIP.IP() returned %s, expected %s.", ip, addrIPAddr) 107 } 108 109 assertPanic(t, func() { addrZero.IP() }) 110 assertPanic(t, func() { addrDomain.IP() }) 111 } 112 113 func TestAddrDomain(t *testing.T) { 114 if domain := addrDomain.Domain(); domain != addrDomainHost { 115 t.Errorf("addrDomain.Domain() returned %s, expected %s.", domain, addrDomainHost) 116 } 117 118 assertPanic(t, func() { addrZero.Domain() }) 119 assertPanic(t, func() { addrIP.Domain() }) 120 } 121 122 func TestAddrPort(t *testing.T) { 123 if port := addrZero.Port(); port != addrZeroPort { 124 t.Errorf("addrZero.Port() returned %d, expected %d.", port, addrZeroPort) 125 } 126 127 if port := addrIP.Port(); port != addrIPPort { 128 t.Errorf("addrIP.Port() returned %d, expected %d.", port, addrIPPort) 129 } 130 131 if port := addrDomain.Port(); port != addrDomainPort { 132 t.Errorf("addrDomain.Port() returned %d, expected %d.", port, addrDomainPort) 133 } 134 } 135 136 func TestAddrIPPort(t *testing.T) { 137 if ap := addrIP.IPPort(); ap != addrIPAddrPort { 138 t.Errorf("addrIP.IPPort() returned %s, expected %s.", ap, addrIPAddrPort) 139 } 140 141 assertPanic(t, func() { addrZero.IPPort() }) 142 assertPanic(t, func() { addrDomain.IPPort() }) 143 } 144 145 func TestAddrResolveIP(t *testing.T) { 146 ip, err := addrIP.ResolveIP() 147 if err != nil { 148 t.Fatal(err) 149 } 150 if ip != addrIPAddr { 151 t.Errorf("addrIP.ResolveIP() returned %s, expected %s.", ip, addrIPAddr) 152 } 153 154 ip, err = addrDomain.ResolveIP() 155 if err != nil { 156 t.Fatal(err) 157 } 158 if !ip.IsValid() { 159 t.Error("addrDomain.ResolveIP() returned invalid IP address.") 160 } 161 162 assertPanic(t, func() { addrZero.ResolveIP() }) 163 } 164 165 func TestAddrResolveIPPort(t *testing.T) { 166 ipPort, err := addrIP.ResolveIPPort() 167 if err != nil { 168 t.Fatal(err) 169 } 170 if ipPort != addrIPAddrPort { 171 t.Errorf("addrIP.ResolveIPPort() returned %s, expected %s.", ipPort, addrIPAddrPort) 172 } 173 174 ipPort, err = addrDomain.ResolveIPPort() 175 if err != nil { 176 t.Fatal(err) 177 } 178 if !ipPort.Addr().IsValid() { 179 t.Error("addrDomain.ResolveIPPort() returned invalid IP address.") 180 } 181 if ipPort.Port() != addrDomainPort { 182 t.Errorf("addrDomain.ResolveIPPort(false) returned %s, expected port %d.", ipPort, addrDomainPort) 183 } 184 185 assertPanic(t, func() { addrZero.ResolveIPPort() }) 186 } 187 188 func TestAddrHost(t *testing.T) { 189 if host := addrIP.Host(); host != addrIPHost { 190 t.Errorf("addrIP.Host() returned %s, expected %s.", host, addrIPHost) 191 } 192 193 if host := addrDomain.Host(); host != addrDomainHost { 194 t.Errorf("addrDomain.Host() returned %s, expected %s.", host, addrDomainHost) 195 } 196 197 assertPanic(t, func() { addrZero.Host() }) 198 } 199 200 func TestAddrString(t *testing.T) { 201 if s := addrZero.String(); s != addrZeroString { 202 t.Errorf("addrZero.String() returned %s, expected %s.", s, addrZeroString) 203 } 204 205 if s := addrIP.String(); s != addrIPString { 206 t.Errorf("addrIP.String() returned %s, expected %s.", s, addrIPString) 207 } 208 209 if s := addrDomain.String(); s != addrDomainString { 210 t.Errorf("addrDomain.String() returned %s, expected %s.", s, addrDomainString) 211 } 212 } 213 214 func TestAddrAppendTo(t *testing.T) { 215 head := make([]byte, 64) 216 _, err := rand.Read(head) 217 if err != nil { 218 t.Fatal(err) 219 } 220 221 b := make([]byte, 0, 128) 222 b = append(b, head...) 223 bHead := b 224 225 b = addrZero.AppendTo(b) 226 if !bytes.Equal(bHead, head) { 227 t.Error("addrIP.AppendTo() returned modified head.") 228 } 229 if string(b[64:]) != addrZeroString { 230 t.Errorf("addrZero.AppendTo() returned %s, expected %s.", b[64:], addrZeroString) 231 } 232 233 b = addrIP.AppendTo(bHead) 234 if !bytes.Equal(bHead, head) { 235 t.Error("addrIP.AppendTo() returned modified head.") 236 } 237 if string(b[64:]) != addrIPString { 238 t.Errorf("addrIP.AppendTo() returned %s, expected %s.", b[64:], addrIPString) 239 } 240 241 b = addrDomain.AppendTo(bHead) 242 if !bytes.Equal(bHead, head) { 243 t.Error("addrDomain.AppendTo() returned modified head.") 244 } 245 if string(b[64:]) != addrDomainString { 246 t.Errorf("addrDomain.AppendTo() returned %s, expected %s.", b[64:], addrDomainString) 247 } 248 } 249 250 func TestAddrMarshalAndUnmarshalText(t *testing.T) { 251 text, err := addrZero.MarshalText() 252 if err != nil { 253 t.Fatal(err) 254 } 255 if string(text) != addrZeroString { 256 t.Errorf("addrZero.MarshalText() returned %s, expected %s.", text, addrZeroString) 257 } 258 259 text, err = addrIP.MarshalText() 260 if err != nil { 261 t.Fatal(err) 262 } 263 if string(text) != addrIPString { 264 t.Errorf("addrIP.MarshalText() returned %s, expected %s.", text, addrIPString) 265 } 266 267 var addrUnmarshaled Addr 268 err = addrUnmarshaled.UnmarshalText(text) 269 if err != nil { 270 t.Fatal(err) 271 } 272 if !addrUnmarshaled.Equals(addrIP) { 273 t.Errorf("addrIP.UnmarshalText() returned %s, expected %s.", addrUnmarshaled, addrIP) 274 } 275 276 text, err = addrDomain.MarshalText() 277 if err != nil { 278 t.Fatal(err) 279 } 280 if string(text) != addrDomainString { 281 t.Errorf("addrDomain.MarshalText() returned %s, expected %s.", text, addrDomainString) 282 } 283 284 err = addrUnmarshaled.UnmarshalText(text) 285 if err != nil { 286 t.Fatal(err) 287 } 288 if !addrUnmarshaled.Equals(addrDomain) { 289 t.Errorf("addrDomain.UnmarshalText() returned %s, expected %s.", addrUnmarshaled, addrDomain) 290 } 291 } 292 293 func TestAddrFromDomainPort(t *testing.T) { 294 if _, err := AddrFromDomainPort("", 443); err == nil { 295 t.Error("AddrFromDomainPort(\"\", 443) did not return error.") 296 } 297 s := strings.Repeat(" ", 256) 298 if _, err := AddrFromDomainPort(s, 443); err == nil { 299 t.Error("AddrFromDomainPort(s, 443) did not return error.") 300 } 301 } 302 303 func TestAddrFromHostPort(t *testing.T) { 304 addrFromHostPort, err := AddrFromHostPort(addrIPHost, addrIPPort) 305 if err != nil { 306 t.Fatal(err) 307 } 308 if !addrFromHostPort.Equals(addrIP) { 309 t.Errorf("AddrFromHostPort() returned %s, expected %s.", addrFromHostPort, addrIP) 310 } 311 312 addrFromHostPort, err = AddrFromHostPort(addrDomainHost, addrDomainPort) 313 if err != nil { 314 t.Fatal(err) 315 } 316 if !addrFromHostPort.Equals(addrDomain) { 317 t.Errorf("AddrFromHostPort() returned %s, expected %s.", addrFromHostPort, addrDomain) 318 } 319 } 320 321 func TestAddrParsing(t *testing.T) { 322 addrParsed, err := ParseAddr(addrIPString) 323 if err != nil { 324 t.Fatal(err) 325 } 326 if !addrParsed.Equals(addrIP) { 327 t.Errorf("ParseAddr() returned %s, expected %s.", addrParsed, addrIP) 328 } 329 330 addrParsed, err = ParseAddr(addrDomainString) 331 if err != nil { 332 t.Fatal(err) 333 } 334 if !addrParsed.Equals(addrDomain) { 335 t.Errorf("ParseAddr() returned %s, expected %s.", addrParsed, addrDomain) 336 } 337 } 338 339 var ( 340 addrPort4 = netip.AddrPortFrom(netip.AddrFrom4([4]byte{127, 0, 0, 1}), 1080) 341 addrPort4in6 = netip.AddrPortFrom(netip.AddrFrom16([16]byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff, 127, 0, 0, 1}), 1080) 342 ) 343 344 func TestAddrPortMappedEqual(t *testing.T) { 345 if !AddrPortMappedEqual(addrPort4, addrPort4) { 346 t.Error("AddrPortMappedEqual(addrPort4, addrPort4) returned false.") 347 } 348 349 if !AddrPortMappedEqual(addrPort4, addrPort4in6) { 350 t.Error("AddrPortMappedEqual(addrPort4, addrPort4in6) returned false.") 351 } 352 353 if !AddrPortMappedEqual(addrPort4in6, addrPort4in6) { 354 t.Error("AddrPortMappedEqual(addrPort4in6, addrPort4in6) returned false.") 355 } 356 357 if AddrPortMappedEqual(addrPort4, addrIPAddrPort) { 358 t.Error("AddrPortMappedEqual(addrPort4, addrIPAddrPort) returned true.") 359 } 360 361 if AddrPortMappedEqual(addrPort4in6, addrIPAddrPort) { 362 t.Error("AddrPortMappedEqual(addrPort4in6, addrIPAddrPort) returned true.") 363 } 364 }