1 ipaddr = require '../lib/ipaddr'
4 'should define main classes': (test) ->
5 test.ok(ipaddr.IPv4?, 'defines IPv4 class')
6 test.ok(ipaddr.IPv6?, 'defines IPv6 class')
9 'can construct IPv4 from octets': (test) ->
11 new ipaddr.IPv4([192, 168, 1, 2])
14 'refuses to construct invalid IPv4': (test) ->
16 new ipaddr.IPv4([300, 1, 2, 3])
18 new ipaddr.IPv4([8, 8, 8])
21 'converts IPv4 to string correctly': (test) ->
22 addr = new ipaddr.IPv4([192, 168, 1, 1])
23 test.equal(addr.toString(), '192.168.1.1')
26 'returns correct kind for IPv4': (test) ->
27 addr = new ipaddr.IPv4([1, 2, 3, 4])
28 test.equal(addr.kind(), 'ipv4')
31 'allows to access IPv4 octets': (test) ->
32 addr = new ipaddr.IPv4([42, 0, 0, 0])
33 test.equal(addr.octets[0], 42)
36 'checks IPv4 address format': (test) ->
37 test.equal(ipaddr.IPv4.isIPv4('192.168.007.0xa'), true)
38 test.equal(ipaddr.IPv4.isIPv4('1024.0.0.1'), true)
39 test.equal(ipaddr.IPv4.isIPv4('8.0xa.wtf.6'), false)
42 'validates IPv4 addresses': (test) ->
43 test.equal(ipaddr.IPv4.isValid('192.168.007.0xa'), true)
44 test.equal(ipaddr.IPv4.isValid('1024.0.0.1'), false)
45 test.equal(ipaddr.IPv4.isValid('8.0xa.wtf.6'), false)
48 'parses IPv4 in several weird formats': (test) ->
49 test.deepEqual(ipaddr.IPv4.parse('192.168.1.1').octets, [192, 168, 1, 1])
50 test.deepEqual(ipaddr.IPv4.parse('0xc0.168.1.1').octets, [192, 168, 1, 1])
51 test.deepEqual(ipaddr.IPv4.parse('192.0250.1.1').octets, [192, 168, 1, 1])
52 test.deepEqual(ipaddr.IPv4.parse('0xc0a80101').octets, [192, 168, 1, 1])
53 test.deepEqual(ipaddr.IPv4.parse('030052000401').octets, [192, 168, 1, 1])
54 test.deepEqual(ipaddr.IPv4.parse('3232235777').octets, [192, 168, 1, 1])
57 'barfs at invalid IPv4': (test) ->
59 ipaddr.IPv4.parse('10.0.0.wtf')
62 'matches IPv4 CIDR correctly': (test) ->
63 addr = new ipaddr.IPv4([10, 5, 0, 1])
64 test.equal(addr.match(ipaddr.IPv4.parse('0.0.0.0'), 0), true)
65 test.equal(addr.match(ipaddr.IPv4.parse('11.0.0.0'), 8), false)
66 test.equal(addr.match(ipaddr.IPv4.parse('10.0.0.0'), 8), true)
67 test.equal(addr.match(ipaddr.IPv4.parse('10.0.0.1'), 8), true)
68 test.equal(addr.match(ipaddr.IPv4.parse('10.0.0.10'), 8), true)
69 test.equal(addr.match(ipaddr.IPv4.parse('10.5.5.0'), 16), true)
70 test.equal(addr.match(ipaddr.IPv4.parse('10.4.5.0'), 16), false)
71 test.equal(addr.match(ipaddr.IPv4.parse('10.4.5.0'), 15), true)
72 test.equal(addr.match(ipaddr.IPv4.parse('10.5.0.2'), 32), false)
73 test.equal(addr.match(addr, 32), true)
76 'parses IPv4 CIDR correctly': (test) ->
77 addr = new ipaddr.IPv4([10, 5, 0, 1])
78 test.equal(addr.match(ipaddr.IPv4.parseCIDR('0.0.0.0/0')), true)
79 test.equal(addr.match(ipaddr.IPv4.parseCIDR('11.0.0.0/8')), false)
80 test.equal(addr.match(ipaddr.IPv4.parseCIDR('10.0.0.0/8')), true)
81 test.equal(addr.match(ipaddr.IPv4.parseCIDR('10.0.0.1/8')), true)
82 test.equal(addr.match(ipaddr.IPv4.parseCIDR('10.0.0.10/8')), true)
83 test.equal(addr.match(ipaddr.IPv4.parseCIDR('10.5.5.0/16')), true)
84 test.equal(addr.match(ipaddr.IPv4.parseCIDR('10.4.5.0/16')), false)
85 test.equal(addr.match(ipaddr.IPv4.parseCIDR('10.4.5.0/15')), true)
86 test.equal(addr.match(ipaddr.IPv4.parseCIDR('10.5.0.2/32')), false)
87 test.equal(addr.match(ipaddr.IPv4.parseCIDR('10.5.0.1/32')), true)
89 ipaddr.IPv4.parseCIDR('10.5.0.1')
91 ipaddr.IPv4.parseCIDR('0.0.0.0/-1')
93 ipaddr.IPv4.parseCIDR('0.0.0.0/33')
96 'detects reserved IPv4 networks': (test) ->
97 test.equal(ipaddr.IPv4.parse('0.0.0.0').range(), 'unspecified')
98 test.equal(ipaddr.IPv4.parse('0.1.0.0').range(), 'unspecified')
99 test.equal(ipaddr.IPv4.parse('10.1.0.1').range(), 'private')
100 test.equal(ipaddr.IPv4.parse('192.168.2.1').range(), 'private')
101 test.equal(ipaddr.IPv4.parse('224.100.0.1').range(), 'multicast')
102 test.equal(ipaddr.IPv4.parse('169.254.15.0').range(), 'linkLocal')
103 test.equal(ipaddr.IPv4.parse('127.1.1.1').range(), 'loopback')
104 test.equal(ipaddr.IPv4.parse('255.255.255.255').range(), 'broadcast')
105 test.equal(ipaddr.IPv4.parse('240.1.2.3').range(), 'reserved')
106 test.equal(ipaddr.IPv4.parse('8.8.8.8').range(), 'unicast')
109 'can construct IPv6 from 16bit parts': (test) ->
111 new ipaddr.IPv6([0x2001, 0xdb8, 0xf53a, 0, 0, 0, 0, 1])
114 'can construct IPv6 from 8bit parts': (test) ->
116 new ipaddr.IPv6([0x20, 0x01, 0xd, 0xb8, 0xf5, 0x3a, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1])
117 test.deepEqual(new ipaddr.IPv6([0x20, 0x01, 0xd, 0xb8, 0xf5, 0x3a, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]),
118 new ipaddr.IPv6([0x2001, 0xdb8, 0xf53a, 0, 0, 0, 0, 1]))
121 'refuses to construct invalid IPv6': (test) ->
123 new ipaddr.IPv6([0xfffff, 0, 0, 0, 0, 0, 0, 1])
125 new ipaddr.IPv6([0xfffff, 0, 0, 0, 0, 0, 1])
127 new ipaddr.IPv6([0xffff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1])
130 'converts IPv6 to string correctly': (test) ->
131 addr = new ipaddr.IPv6([0x2001, 0xdb8, 0xf53a, 0, 0, 0, 0, 1])
132 test.equal(addr.toNormalizedString(), '2001:db8:f53a:0:0:0:0:1')
133 test.equal(addr.toString(), '2001:db8:f53a::1')
134 test.equal(new ipaddr.IPv6([0, 0, 0, 0, 0, 0, 0, 1]).toString(), '::1')
135 test.equal(new ipaddr.IPv6([0x2001, 0xdb8, 0, 0, 0, 0, 0, 0]).toString(), '2001:db8::')
138 'returns correct kind for IPv6': (test) ->
139 addr = new ipaddr.IPv6([0x2001, 0xdb8, 0xf53a, 0, 0, 0, 0, 1])
140 test.equal(addr.kind(), 'ipv6')
143 'allows to access IPv6 address parts': (test) ->
144 addr = new ipaddr.IPv6([0x2001, 0xdb8, 0xf53a, 0, 0, 42, 0, 1])
145 test.equal(addr.parts[5], 42)
148 'checks IPv6 address format': (test) ->
149 test.equal(ipaddr.IPv6.isIPv6('2001:db8:F53A::1'), true)
150 test.equal(ipaddr.IPv6.isIPv6('200001::1'), true)
151 test.equal(ipaddr.IPv6.isIPv6('::ffff:192.168.1.1'), true)
152 test.equal(ipaddr.IPv6.isIPv6('::ffff:300.168.1.1'), false)
153 test.equal(ipaddr.IPv6.isIPv6('::ffff:300.168.1.1:0'), false)
154 test.equal(ipaddr.IPv6.isIPv6('fe80::wtf'), false)
157 'validates IPv6 addresses': (test) ->
158 test.equal(ipaddr.IPv6.isValid('2001:db8:F53A::1'), true)
159 test.equal(ipaddr.IPv6.isValid('200001::1'), false)
160 test.equal(ipaddr.IPv6.isValid('::ffff:192.168.1.1'), true)
161 test.equal(ipaddr.IPv6.isValid('::ffff:300.168.1.1'), false)
162 test.equal(ipaddr.IPv6.isValid('::ffff:300.168.1.1:0'), false)
163 test.equal(ipaddr.IPv6.isValid('::ffff:222.1.41.9000'), false)
164 test.equal(ipaddr.IPv6.isValid('2001:db8::F53A::1'), false)
165 test.equal(ipaddr.IPv6.isValid('fe80::wtf'), false)
166 test.equal(ipaddr.IPv6.isValid('2002::2:'), false)
167 test.equal(ipaddr.IPv6.isValid(undefined), false)
170 'parses IPv6 in different formats': (test) ->
171 test.deepEqual(ipaddr.IPv6.parse('2001:db8:F53A:0:0:0:0:1').parts, [0x2001, 0xdb8, 0xf53a, 0, 0, 0, 0, 1])
172 test.deepEqual(ipaddr.IPv6.parse('fe80::10').parts, [0xfe80, 0, 0, 0, 0, 0, 0, 0x10])
173 test.deepEqual(ipaddr.IPv6.parse('2001:db8:F53A::').parts, [0x2001, 0xdb8, 0xf53a, 0, 0, 0, 0, 0])
174 test.deepEqual(ipaddr.IPv6.parse('::1').parts, [0, 0, 0, 0, 0, 0, 0, 1])
175 test.deepEqual(ipaddr.IPv6.parse('::').parts, [0, 0, 0, 0, 0, 0, 0, 0])
178 'barfs at invalid IPv6': (test) ->
180 ipaddr.IPv6.parse('fe80::0::1')
183 'matches IPv6 CIDR correctly': (test) ->
184 addr = ipaddr.IPv6.parse('2001:db8:f53a::1')
185 test.equal(addr.match(ipaddr.IPv6.parse('::'), 0), true)
186 test.equal(addr.match(ipaddr.IPv6.parse('2001:db8:f53a::1:1'), 64), true)
187 test.equal(addr.match(ipaddr.IPv6.parse('2001:db8:f53b::1:1'), 48), false)
188 test.equal(addr.match(ipaddr.IPv6.parse('2001:db8:f531::1:1'), 44), true)
189 test.equal(addr.match(ipaddr.IPv6.parse('2001:db8:f500::1'), 40), true)
190 test.equal(addr.match(ipaddr.IPv6.parse('2001:db9:f500::1'), 40), false)
191 test.equal(addr.match(addr, 128), true)
194 'parses IPv6 CIDR correctly': (test) ->
195 addr = ipaddr.IPv6.parse('2001:db8:f53a::1')
196 test.equal(addr.match(ipaddr.IPv6.parseCIDR('::/0')), true)
197 test.equal(addr.match(ipaddr.IPv6.parseCIDR('2001:db8:f53a::1:1/64')), true)
198 test.equal(addr.match(ipaddr.IPv6.parseCIDR('2001:db8:f53b::1:1/48')), false)
199 test.equal(addr.match(ipaddr.IPv6.parseCIDR('2001:db8:f531::1:1/44')), true)
200 test.equal(addr.match(ipaddr.IPv6.parseCIDR('2001:db8:f500::1/40')), true)
201 test.equal(addr.match(ipaddr.IPv6.parseCIDR('2001:db9:f500::1/40')), false)
202 test.equal(addr.match(ipaddr.IPv6.parseCIDR('2001:db8:f53a::1/128')), true)
204 ipaddr.IPv6.parseCIDR('2001:db8:f53a::1')
206 ipaddr.IPv6.parseCIDR('2001:db8:f53a::1/-1')
208 ipaddr.IPv6.parseCIDR('2001:db8:f53a::1/129')
211 'converts between IPv4-mapped IPv6 addresses and IPv4 addresses': (test) ->
212 addr = ipaddr.IPv4.parse('77.88.21.11')
213 mapped = addr.toIPv4MappedAddress()
214 test.deepEqual(mapped.parts, [0, 0, 0, 0, 0, 0xffff, 0x4d58, 0x150b])
215 test.deepEqual(mapped.toIPv4Address().octets, addr.octets)
218 'refuses to convert non-IPv4-mapped IPv6 address to IPv4 address': (test) ->
220 ipaddr.IPv6.parse('2001:db8::1').toIPv4Address()
223 'detects reserved IPv6 networks': (test) ->
224 test.equal(ipaddr.IPv6.parse('::').range(), 'unspecified')
225 test.equal(ipaddr.IPv6.parse('fe80::1234:5678:abcd:0123').range(), 'linkLocal')
226 test.equal(ipaddr.IPv6.parse('ff00::1234').range(), 'multicast')
227 test.equal(ipaddr.IPv6.parse('::1').range(), 'loopback')
228 test.equal(ipaddr.IPv6.parse('fc00::').range(), 'uniqueLocal')
229 test.equal(ipaddr.IPv6.parse('::ffff:192.168.1.10').range(), 'ipv4Mapped')
230 test.equal(ipaddr.IPv6.parse('::ffff:0:192.168.1.10').range(), 'rfc6145')
231 test.equal(ipaddr.IPv6.parse('64:ff9b::1234').range(), 'rfc6052')
232 test.equal(ipaddr.IPv6.parse('2002:1f63:45e8::1').range(), '6to4')
233 test.equal(ipaddr.IPv6.parse('2001::4242').range(), 'teredo')
234 test.equal(ipaddr.IPv6.parse('2001:db8::3210').range(), 'reserved')
235 test.equal(ipaddr.IPv6.parse('2001:470:8:66::1').range(), 'unicast')
238 'is able to determine IP address type': (test) ->
239 test.equal(ipaddr.parse('8.8.8.8').kind(), 'ipv4')
240 test.equal(ipaddr.parse('2001:db8:3312::1').kind(), 'ipv6')
243 'throws an error if tried to parse an invalid address': (test) ->
245 ipaddr.parse('::some.nonsense')
248 'correctly processes IPv4-mapped addresses': (test) ->
249 test.equal(ipaddr.process('8.8.8.8').kind(), 'ipv4')
250 test.equal(ipaddr.process('2001:db8:3312::1').kind(), 'ipv6')
251 test.equal(ipaddr.process('::ffff:192.168.1.1').kind(), 'ipv4')
254 'correctly converts IPv6 and IPv4 addresses to byte arrays': (test) ->
255 test.deepEqual(ipaddr.parse('1.2.3.4').toByteArray(),
256 [0x1, 0x2, 0x3, 0x4]);
257 # Fuck yeah. The first byte of Google's IPv6 address is 42. 42!
258 test.deepEqual(ipaddr.parse('2a00:1450:8007::68').toByteArray(),
259 [42, 0x00, 0x14, 0x50, 0x80, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68 ])
262 'correctly parses 1 as an IPv4 address': (test) ->
263 test.equal(ipaddr.IPv6.isValid('1'), false)
264 test.equal(ipaddr.IPv4.isValid('1'), true)
265 test.deepEqual(new ipaddr.IPv4([0, 0, 0, 1]), ipaddr.parse('1'))
268 'correctly detects IPv4 and IPv6 CIDR addresses': (test) ->
269 test.deepEqual([ipaddr.IPv6.parse('fc00::'), 64],
270 ipaddr.parseCIDR('fc00::/64'))
271 test.deepEqual([ipaddr.IPv4.parse('1.2.3.4'), 5],
272 ipaddr.parseCIDR('1.2.3.4/5'))
275 'does not consider a very large or very small number a valid IP address': (test) ->
276 test.equal(ipaddr.isValid('4999999999'), false)
277 test.equal(ipaddr.isValid('-1'), false)
280 'does not hang on ::8:8:8:8:8:8:8:8:8': (test) ->
281 test.equal(ipaddr.IPv6.isValid('::8:8:8:8:8:8:8:8:8'), false)
284 'subnetMatch does not fail on empty range': (test) ->
285 ipaddr.subnetMatch(new ipaddr.IPv4([1,2,3,4]), {}, false)
286 ipaddr.subnetMatch(new ipaddr.IPv4([1,2,3,4]), {subnet: []}, false)
289 'subnetMatch returns default subnet on empty range': (test) ->
290 test.equal(ipaddr.subnetMatch(new ipaddr.IPv4([1,2,3,4]), {}, false), false)
291 test.equal(ipaddr.subnetMatch(new ipaddr.IPv4([1,2,3,4]), {subnet: []}, false), false)
294 'is able to determine IP address type from byte array input': (test) ->
295 test.equal(ipaddr.fromByteArray([0x7f, 0, 0, 1]).kind(), 'ipv4')
296 test.equal(ipaddr.fromByteArray([0x20, 0x01, 0xd, 0xb8, 0xf5, 0x3a, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]).kind(), 'ipv6')
298 ipaddr.fromByteArray([1])
301 'prefixLengthFromSubnetMask returns proper CIDR notation for standard IPv4 masks': (test) ->
302 test.equal(ipaddr.IPv4.parse('255.255.255.255').prefixLengthFromSubnetMask(), 32)
303 test.equal(ipaddr.IPv4.parse('255.255.255.254').prefixLengthFromSubnetMask(), 31)
304 test.equal(ipaddr.IPv4.parse('255.255.255.252').prefixLengthFromSubnetMask(), 30)
305 test.equal(ipaddr.IPv4.parse('255.255.255.248').prefixLengthFromSubnetMask(), 29)
306 test.equal(ipaddr.IPv4.parse('255.255.255.240').prefixLengthFromSubnetMask(), 28)
307 test.equal(ipaddr.IPv4.parse('255.255.255.224').prefixLengthFromSubnetMask(), 27)
308 test.equal(ipaddr.IPv4.parse('255.255.255.192').prefixLengthFromSubnetMask(), 26)
309 test.equal(ipaddr.IPv4.parse('255.255.255.128').prefixLengthFromSubnetMask(), 25)
310 test.equal(ipaddr.IPv4.parse('255.255.255.0').prefixLengthFromSubnetMask(), 24)
311 test.equal(ipaddr.IPv4.parse('255.255.254.0').prefixLengthFromSubnetMask(), 23)
312 test.equal(ipaddr.IPv4.parse('255.255.252.0').prefixLengthFromSubnetMask(), 22)
313 test.equal(ipaddr.IPv4.parse('255.255.248.0').prefixLengthFromSubnetMask(), 21)
314 test.equal(ipaddr.IPv4.parse('255.255.240.0').prefixLengthFromSubnetMask(), 20)
315 test.equal(ipaddr.IPv4.parse('255.255.224.0').prefixLengthFromSubnetMask(), 19)
316 test.equal(ipaddr.IPv4.parse('255.255.192.0').prefixLengthFromSubnetMask(), 18)
317 test.equal(ipaddr.IPv4.parse('255.255.128.0').prefixLengthFromSubnetMask(), 17)
318 test.equal(ipaddr.IPv4.parse('255.255.0.0').prefixLengthFromSubnetMask(), 16)
319 test.equal(ipaddr.IPv4.parse('255.254.0.0').prefixLengthFromSubnetMask(), 15)
320 test.equal(ipaddr.IPv4.parse('255.252.0.0').prefixLengthFromSubnetMask(), 14)
321 test.equal(ipaddr.IPv4.parse('255.248.0.0').prefixLengthFromSubnetMask(), 13)
322 test.equal(ipaddr.IPv4.parse('255.240.0.0').prefixLengthFromSubnetMask(), 12)
323 test.equal(ipaddr.IPv4.parse('255.224.0.0').prefixLengthFromSubnetMask(), 11)
324 test.equal(ipaddr.IPv4.parse('255.192.0.0').prefixLengthFromSubnetMask(), 10)
325 test.equal(ipaddr.IPv4.parse('255.128.0.0').prefixLengthFromSubnetMask(), 9)
326 test.equal(ipaddr.IPv4.parse('255.0.0.0').prefixLengthFromSubnetMask(), 8)
327 test.equal(ipaddr.IPv4.parse('254.0.0.0').prefixLengthFromSubnetMask(), 7)
328 test.equal(ipaddr.IPv4.parse('252.0.0.0').prefixLengthFromSubnetMask(), 6)
329 test.equal(ipaddr.IPv4.parse('248.0.0.0').prefixLengthFromSubnetMask(), 5)
330 test.equal(ipaddr.IPv4.parse('240.0.0.0').prefixLengthFromSubnetMask(), 4)
331 test.equal(ipaddr.IPv4.parse('224.0.0.0').prefixLengthFromSubnetMask(), 3)
332 test.equal(ipaddr.IPv4.parse('192.0.0.0').prefixLengthFromSubnetMask(), 2)
333 test.equal(ipaddr.IPv4.parse('128.0.0.0').prefixLengthFromSubnetMask(), 1)
334 test.equal(ipaddr.IPv4.parse('0.0.0.0').prefixLengthFromSubnetMask(), 0)
336 test.equal(ipaddr.IPv4.parse('192.168.255.0').prefixLengthFromSubnetMask(), null)
337 test.equal(ipaddr.IPv4.parse('255.0.255.0').prefixLengthFromSubnetMask(), null)