1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
|
discard """
matrix: "--mm:refc; --mm:orc"
outputsub: ""
"""
import net, nativesockets
import unittest
import std/assertions
block: # isIpAddress tests
block: # 127.0.0.1 is valid
check isIpAddress("127.0.0.1") == true
block: # ipv6 localhost is valid
check isIpAddress("::1") == true
block: # fqdn is not an ip address
check isIpAddress("example.com") == false
block: # random string is not an ipaddress
check isIpAddress("foo bar") == false
block: # 5127.0.0.1 is invalid
check isIpAddress("5127.0.0.1") == false
block: # ipv6 is valid
check isIpAddress("2001:cdba:0000:0000:0000:0000:3257:9652") == true
block: # invalid ipv6
check isIpAddress("gggg:cdba:0000:0000:0000:0000:3257:9652") == false
block: # parseIpAddress tests
block: # 127.0.0.1 is valid
discard parseIpAddress("127.0.0.1")
block: # ipv6 localhost is valid
discard parseIpAddress("::1")
block: # fqdn is not an ip address
expect(ValueError):
discard parseIpAddress("example.com")
block: # random string is not an ipaddress
expect(ValueError):
discard parseIpAddress("foo bar")
block: # ipv6 is valid
discard parseIpAddress("2001:cdba:0000:0000:0000:0000:3257:9652")
block: # invalid ipv6
expect(ValueError):
discard parseIpAddress("gggg:cdba:0000:0000:0000:0000:3257:9652")
block: # ipv4-compatible ipv6 address (embedded ipv4 address)
check parseIpAddress("::ffff:10.0.0.23") == parseIpAddress("::ffff:0a00:0017")
block: # octal number in ipv4 address
expect(ValueError):
discard parseIpAddress("010.8.8.8")
expect(ValueError):
discard parseIpAddress("8.010.8.8")
block: # hexadecimal number in ipv4 address
expect(ValueError):
discard parseIpAddress("0xc0.168.0.1")
expect(ValueError):
discard parseIpAddress("192.0xa8.0.1")
block: # less than 4 numbers in ipv4 address
expect(ValueError):
discard parseIpAddress("127.0.1")
block: # octal number in embedded ipv4 address
expect(ValueError):
discard parseIpAddress("::ffff:010.8.8.8")
expect(ValueError):
discard parseIpAddress("::ffff:8.010.8.8")
block: # hexadecimal number in embedded ipv4 address
expect(ValueError):
discard parseIpAddress("::ffff:0xc0.168.0.1")
expect(ValueError):
discard parseIpAddress("::ffff:192.0xa8.0.1")
block: # less than 4 numbers in embedded ipv4 address
expect(ValueError):
discard parseIpAddress("::ffff:127.0.1")
block: # "IpAddress/Sockaddr conversion"
proc test(ipaddrstr: string) =
var ipaddr_1 = parseIpAddress(ipaddrstr)
# echo ipaddrstr, " ", $ipaddr_1
doAssert($ipaddrstr == $ipaddr_1)
var sockaddr: Sockaddr_storage
var socklen: SockLen
var ipaddr_2: IpAddress
var port_2: Port
toSockAddr(ipaddr_1, Port(0), sockaddr, socklen)
fromSockAddr(sockaddr, socklen, ipaddr_2, port_2)
doAssert(ipaddrstr == $ipaddr_1)
doAssert(ipaddr_1 == ipaddr_2)
doAssert($ipaddr_1 == $ipaddr_2)
if sockaddr.ss_family.cint == AF_INET.toInt:
var sockaddr4: Sockaddr_in
copyMem(addr sockaddr4, addr sockaddr, sizeof(sockaddr4))
fromSockAddr(sockaddr4, socklen, ipaddr_2, port_2)
elif sockaddr.ss_family.cint == AF_INET6.toInt:
var sockaddr6: Sockaddr_in6
copyMem(addr sockaddr6, addr sockaddr, sizeof(sockaddr6))
fromSockAddr(sockaddr6, socklen, ipaddr_2, port_2)
doAssert(ipaddr_1 == ipaddr_2)
doAssert($ipaddr_1 == $ipaddr_2)
# ipv6 address of example.com
test("2606:2800:220:1:248:1893:25c8:1946")
# ipv6 address of localhost
test("::1")
# ipv4 address of example.com
test("93.184.216.34")
# ipv4 address of localhost
test("127.0.0.1")
|