Update sdk/platform-tools to version 26.0.0.
[android_tools.git] / sdk / platform-tools / systrace / catapult / telemetry / third_party / web-page-replay / third_party / ipaddr / ipaddr_test.py
blob9446889e56213104689ea2c102990fe1246e5b2f
1 #!/usr/bin/python
3 # Copyright 2007 Google Inc.
4 # Licensed to PSF under a Contributor Agreement.
6 # Licensed under the Apache License, Version 2.0 (the "License");
7 # you may not use this file except in compliance with the License.
8 # You may obtain a copy of the License at
10 # http://www.apache.org/licenses/LICENSE-2.0
12 # Unless required by applicable law or agreed to in writing, software
13 # distributed under the License is distributed on an "AS IS" BASIS,
14 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 # See the License for the specific language governing permissions and
16 # limitations under the License.
18 """Unittest for ipaddr module."""
21 import unittest
22 import time
23 import ipaddr
25 # Compatibility function to cast str to bytes objects
26 if issubclass(ipaddr.Bytes, str):
27 _cb = ipaddr.Bytes
28 else:
29 _cb = lambda bytestr: bytes(bytestr, 'charmap')
31 class IpaddrUnitTest(unittest.TestCase):
33 def setUp(self):
34 self.ipv4 = ipaddr.IPv4Network('1.2.3.4/24')
35 self.ipv4_hostmask = ipaddr.IPv4Network('10.0.0.1/0.255.255.255')
36 self.ipv6 = ipaddr.IPv6Network('2001:658:22a:cafe:200:0:0:1/64')
38 def tearDown(self):
39 del(self.ipv4)
40 del(self.ipv4_hostmask)
41 del(self.ipv6)
42 del(self)
44 def testRepr(self):
45 self.assertEqual("IPv4Network('1.2.3.4/32')",
46 repr(ipaddr.IPv4Network('1.2.3.4')))
47 self.assertEqual("IPv6Network('::1/128')",
48 repr(ipaddr.IPv6Network('::1')))
50 def testAutoMasking(self):
51 addr1 = ipaddr.IPv4Network('1.1.1.255/24')
52 addr1_masked = ipaddr.IPv4Network('1.1.1.0/24')
53 self.assertEqual(addr1_masked, addr1.masked())
55 addr2 = ipaddr.IPv6Network('2000:cafe::efac:100/96')
56 addr2_masked = ipaddr.IPv6Network('2000:cafe::/96')
57 self.assertEqual(addr2_masked, addr2.masked())
59 # issue57
60 def testAddressIntMath(self):
61 self.assertEqual(ipaddr.IPv4Address('1.1.1.1') + 255,
62 ipaddr.IPv4Address('1.1.2.0'))
63 self.assertEqual(ipaddr.IPv4Address('1.1.1.1') - 256,
64 ipaddr.IPv4Address('1.1.0.1'))
65 self.assertEqual(ipaddr.IPv6Address('::1') + (2**16 - 2),
66 ipaddr.IPv6Address('::ffff'))
67 self.assertEqual(ipaddr.IPv6Address('::ffff') - (2**16 - 2),
68 ipaddr.IPv6Address('::1'))
70 def testInvalidStrings(self):
71 def AssertInvalidIP(ip_str):
72 self.assertRaises(ValueError, ipaddr.IPAddress, ip_str)
73 AssertInvalidIP("")
74 AssertInvalidIP("016.016.016.016")
75 AssertInvalidIP("016.016.016")
76 AssertInvalidIP("016.016")
77 AssertInvalidIP("016")
78 AssertInvalidIP("000.000.000.000")
79 AssertInvalidIP("000")
80 AssertInvalidIP("0x0a.0x0a.0x0a.0x0a")
81 AssertInvalidIP("0x0a.0x0a.0x0a")
82 AssertInvalidIP("0x0a.0x0a")
83 AssertInvalidIP("0x0a")
84 AssertInvalidIP("42.42.42.42.42")
85 AssertInvalidIP("42.42.42")
86 AssertInvalidIP("42.42")
87 AssertInvalidIP("42")
88 AssertInvalidIP("42..42.42")
89 AssertInvalidIP("42..42.42.42")
90 AssertInvalidIP("42.42.42.42.")
91 AssertInvalidIP("42.42.42.42...")
92 AssertInvalidIP(".42.42.42.42")
93 AssertInvalidIP("...42.42.42.42")
94 AssertInvalidIP("42.42.42.-0")
95 AssertInvalidIP("42.42.42.+0")
96 AssertInvalidIP(".")
97 AssertInvalidIP("...")
98 AssertInvalidIP("bogus")
99 AssertInvalidIP("bogus.com")
100 AssertInvalidIP("192.168.0.1.com")
101 AssertInvalidIP("12345.67899.-54321.-98765")
102 AssertInvalidIP("257.0.0.0")
103 AssertInvalidIP("42.42.42.-42")
104 AssertInvalidIP("3ffe::1.net")
105 AssertInvalidIP("3ffe::1::1")
106 AssertInvalidIP("1::2::3::4:5")
107 AssertInvalidIP("::7:6:5:4:3:2:")
108 AssertInvalidIP(":6:5:4:3:2:1::")
109 AssertInvalidIP("2001::db:::1")
110 AssertInvalidIP("FEDC:9878")
111 AssertInvalidIP("+1.+2.+3.4")
112 AssertInvalidIP("1.2.3.4e0")
113 AssertInvalidIP("::7:6:5:4:3:2:1:0")
114 AssertInvalidIP("7:6:5:4:3:2:1:0::")
115 AssertInvalidIP("9:8:7:6:5:4:3::2:1")
116 AssertInvalidIP("0:1:2:3::4:5:6:7")
117 AssertInvalidIP("3ffe:0:0:0:0:0:0:0:1")
118 AssertInvalidIP("3ffe::10000")
119 AssertInvalidIP("3ffe::goog")
120 AssertInvalidIP("3ffe::-0")
121 AssertInvalidIP("3ffe::+0")
122 AssertInvalidIP("3ffe::-1")
123 AssertInvalidIP(":")
124 AssertInvalidIP(":::")
125 AssertInvalidIP("::1.2.3")
126 AssertInvalidIP("::1.2.3.4.5")
127 AssertInvalidIP("::1.2.3.4:")
128 AssertInvalidIP("1.2.3.4::")
129 AssertInvalidIP("2001:db8::1:")
130 AssertInvalidIP(":2001:db8::1")
131 AssertInvalidIP(":1:2:3:4:5:6:7")
132 AssertInvalidIP("1:2:3:4:5:6:7:")
133 AssertInvalidIP(":1:2:3:4:5:6:")
134 AssertInvalidIP("192.0.2.1/32")
135 AssertInvalidIP("2001:db8::1/128")
137 self.assertRaises(ipaddr.AddressValueError, ipaddr.IPv4Network, '')
138 self.assertRaises(ipaddr.AddressValueError, ipaddr.IPv4Network,
139 'google.com')
140 self.assertRaises(ipaddr.AddressValueError, ipaddr.IPv4Network,
141 '::1.2.3.4')
142 self.assertRaises(ipaddr.AddressValueError, ipaddr.IPv6Network, '')
143 self.assertRaises(ipaddr.AddressValueError, ipaddr.IPv6Network,
144 'google.com')
145 self.assertRaises(ipaddr.AddressValueError, ipaddr.IPv6Network,
146 '1.2.3.4')
147 self.assertRaises(ipaddr.AddressValueError, ipaddr.IPv6Network,
148 'cafe:cafe::/128/190')
149 self.assertRaises(ipaddr.AddressValueError, ipaddr.IPv6Network,
150 '1234:axy::b')
151 self.assertRaises(ipaddr.AddressValueError, ipaddr.IPv6Address,
152 '1234:axy::b')
153 self.assertRaises(ipaddr.AddressValueError, ipaddr.IPv6Address,
154 '2001:db8:::1')
155 self.assertRaises(ipaddr.AddressValueError, ipaddr.IPv6Address,
156 '2001:888888::1')
157 self.assertRaises(ipaddr.AddressValueError,
158 ipaddr.IPv4Address(1)._ip_int_from_string,
159 '1.a.2.3')
160 self.assertEqual(False, ipaddr.IPv4Network(1)._is_hostmask('1.a.2.3'))
162 def testGetNetwork(self):
163 self.assertEqual(int(self.ipv4.network), 16909056)
164 self.assertEqual(str(self.ipv4.network), '1.2.3.0')
165 self.assertEqual(str(self.ipv4_hostmask.network), '10.0.0.0')
167 self.assertEqual(int(self.ipv6.network),
168 42540616829182469433403647294022090752)
169 self.assertEqual(str(self.ipv6.network),
170 '2001:658:22a:cafe::')
171 self.assertEqual(str(self.ipv6.hostmask),
172 '::ffff:ffff:ffff:ffff')
174 def testBadVersionComparison(self):
175 # These should always raise TypeError
176 v4addr = ipaddr.IPAddress('1.1.1.1')
177 v4net = ipaddr.IPNetwork('1.1.1.1')
178 v6addr = ipaddr.IPAddress('::1')
179 v6net = ipaddr.IPAddress('::1')
181 self.assertRaises(TypeError, v4addr.__lt__, v6addr)
182 self.assertRaises(TypeError, v4addr.__gt__, v6addr)
183 self.assertRaises(TypeError, v4net.__lt__, v6net)
184 self.assertRaises(TypeError, v4net.__gt__, v6net)
186 self.assertRaises(TypeError, v6addr.__lt__, v4addr)
187 self.assertRaises(TypeError, v6addr.__gt__, v4addr)
188 self.assertRaises(TypeError, v6net.__lt__, v4net)
189 self.assertRaises(TypeError, v6net.__gt__, v4net)
191 def testMixedTypeComparison(self):
192 v4addr = ipaddr.IPAddress('1.1.1.1')
193 v4net = ipaddr.IPNetwork('1.1.1.1/32')
194 v6addr = ipaddr.IPAddress('::1')
195 v6net = ipaddr.IPNetwork('::1/128')
197 self.assertFalse(v4net.__contains__(v6net))
198 self.assertFalse(v6net.__contains__(v4net))
200 self.assertRaises(TypeError, lambda: v4addr < v4net)
201 self.assertRaises(TypeError, lambda: v4addr > v4net)
202 self.assertRaises(TypeError, lambda: v4net < v4addr)
203 self.assertRaises(TypeError, lambda: v4net > v4addr)
205 self.assertRaises(TypeError, lambda: v6addr < v6net)
206 self.assertRaises(TypeError, lambda: v6addr > v6net)
207 self.assertRaises(TypeError, lambda: v6net < v6addr)
208 self.assertRaises(TypeError, lambda: v6net > v6addr)
210 # with get_mixed_type_key, you can sort addresses and network.
211 self.assertEqual([v4addr, v4net], sorted([v4net, v4addr],
212 key=ipaddr.get_mixed_type_key))
213 self.assertEqual([v6addr, v6net], sorted([v6net, v6addr],
214 key=ipaddr.get_mixed_type_key))
216 def testIpFromInt(self):
217 self.assertEqual(self.ipv4.ip, ipaddr.IPv4Network(16909060).ip)
218 self.assertRaises(ipaddr.AddressValueError,
219 ipaddr.IPv4Network, 2**32)
220 self.assertRaises(ipaddr.AddressValueError,
221 ipaddr.IPv4Network, -1)
223 ipv4 = ipaddr.IPNetwork('1.2.3.4')
224 ipv6 = ipaddr.IPNetwork('2001:658:22a:cafe:200:0:0:1')
225 self.assertEqual(ipv4, ipaddr.IPNetwork(int(ipv4)))
226 self.assertEqual(ipv6, ipaddr.IPNetwork(int(ipv6)))
228 v6_int = 42540616829182469433547762482097946625
229 self.assertEqual(self.ipv6.ip, ipaddr.IPv6Network(v6_int).ip)
230 self.assertRaises(ipaddr.AddressValueError,
231 ipaddr.IPv6Network, 2**128)
232 self.assertRaises(ipaddr.AddressValueError,
233 ipaddr.IPv6Network, -1)
235 self.assertEqual(ipaddr.IPNetwork(self.ipv4.ip).version, 4)
236 self.assertEqual(ipaddr.IPNetwork(self.ipv6.ip).version, 6)
238 def testIpFromPacked(self):
239 ip = ipaddr.IPNetwork
241 self.assertEqual(self.ipv4.ip,
242 ip(_cb('\x01\x02\x03\x04')).ip)
243 self.assertEqual(ip('255.254.253.252'),
244 ip(_cb('\xff\xfe\xfd\xfc')))
245 self.assertRaises(ValueError, ipaddr.IPNetwork, _cb('\x00' * 3))
246 self.assertRaises(ValueError, ipaddr.IPNetwork, _cb('\x00' * 5))
247 self.assertEqual(self.ipv6.ip,
248 ip(_cb('\x20\x01\x06\x58\x02\x2a\xca\xfe'
249 '\x02\x00\x00\x00\x00\x00\x00\x01')).ip)
250 self.assertEqual(ip('ffff:2:3:4:ffff::'),
251 ip(_cb('\xff\xff\x00\x02\x00\x03\x00\x04' +
252 '\xff\xff' + '\x00' * 6)))
253 self.assertEqual(ip('::'),
254 ip(_cb('\x00' * 16)))
255 self.assertRaises(ValueError, ip, _cb('\x00' * 15))
256 self.assertRaises(ValueError, ip, _cb('\x00' * 17))
258 def testGetIp(self):
259 self.assertEqual(int(self.ipv4.ip), 16909060)
260 self.assertEqual(str(self.ipv4.ip), '1.2.3.4')
261 self.assertEqual(str(self.ipv4_hostmask.ip), '10.0.0.1')
263 self.assertEqual(int(self.ipv6.ip),
264 42540616829182469433547762482097946625)
265 self.assertEqual(str(self.ipv6.ip),
266 '2001:658:22a:cafe:200::1')
268 def testGetNetmask(self):
269 self.assertEqual(int(self.ipv4.netmask), 4294967040L)
270 self.assertEqual(str(self.ipv4.netmask), '255.255.255.0')
271 self.assertEqual(str(self.ipv4_hostmask.netmask), '255.0.0.0')
272 self.assertEqual(int(self.ipv6.netmask),
273 340282366920938463444927863358058659840)
274 self.assertEqual(self.ipv6.prefixlen, 64)
276 def testZeroNetmask(self):
277 ipv4_zero_netmask = ipaddr.IPv4Network('1.2.3.4/0')
278 self.assertEqual(int(ipv4_zero_netmask.netmask), 0)
279 self.assertTrue(ipv4_zero_netmask._is_valid_netmask(str(0)))
281 ipv6_zero_netmask = ipaddr.IPv6Network('::1/0')
282 self.assertEqual(int(ipv6_zero_netmask.netmask), 0)
283 self.assertTrue(ipv6_zero_netmask._is_valid_netmask(str(0)))
285 def testGetBroadcast(self):
286 self.assertEqual(int(self.ipv4.broadcast), 16909311L)
287 self.assertEqual(str(self.ipv4.broadcast), '1.2.3.255')
289 self.assertEqual(int(self.ipv6.broadcast),
290 42540616829182469451850391367731642367)
291 self.assertEqual(str(self.ipv6.broadcast),
292 '2001:658:22a:cafe:ffff:ffff:ffff:ffff')
294 def testGetPrefixlen(self):
295 self.assertEqual(self.ipv4.prefixlen, 24)
297 self.assertEqual(self.ipv6.prefixlen, 64)
299 def testGetSupernet(self):
300 self.assertEqual(self.ipv4.supernet().prefixlen, 23)
301 self.assertEqual(str(self.ipv4.supernet().network), '1.2.2.0')
302 self.assertEqual(ipaddr.IPv4Network('0.0.0.0/0').supernet(),
303 ipaddr.IPv4Network('0.0.0.0/0'))
305 self.assertEqual(self.ipv6.supernet().prefixlen, 63)
306 self.assertEqual(str(self.ipv6.supernet().network),
307 '2001:658:22a:cafe::')
308 self.assertEqual(ipaddr.IPv6Network('::0/0').supernet(),
309 ipaddr.IPv6Network('::0/0'))
311 def testGetSupernet3(self):
312 self.assertEqual(self.ipv4.supernet(3).prefixlen, 21)
313 self.assertEqual(str(self.ipv4.supernet(3).network), '1.2.0.0')
315 self.assertEqual(self.ipv6.supernet(3).prefixlen, 61)
316 self.assertEqual(str(self.ipv6.supernet(3).network),
317 '2001:658:22a:caf8::')
319 def testGetSupernet4(self):
320 self.assertRaises(ValueError, self.ipv4.supernet, prefixlen_diff=2,
321 new_prefix=1)
322 self.assertRaises(ValueError, self.ipv4.supernet, new_prefix=25)
323 self.assertEqual(self.ipv4.supernet(prefixlen_diff=2),
324 self.ipv4.supernet(new_prefix=22))
326 self.assertRaises(ValueError, self.ipv6.supernet, prefixlen_diff=2,
327 new_prefix=1)
328 self.assertRaises(ValueError, self.ipv6.supernet, new_prefix=65)
329 self.assertEqual(self.ipv6.supernet(prefixlen_diff=2),
330 self.ipv6.supernet(new_prefix=62))
332 def testIterSubnets(self):
333 self.assertEqual(self.ipv4.subnet(), list(self.ipv4.iter_subnets()))
334 self.assertEqual(self.ipv6.subnet(), list(self.ipv6.iter_subnets()))
336 def testIterHosts(self):
337 self.assertEqual([ipaddr.IPv4Address('2.0.0.0'),
338 ipaddr.IPv4Address('2.0.0.1')],
339 list(ipaddr.IPNetwork('2.0.0.0/31').iterhosts()))
341 def testFancySubnetting(self):
342 self.assertEqual(sorted(self.ipv4.subnet(prefixlen_diff=3)),
343 sorted(self.ipv4.subnet(new_prefix=27)))
344 self.assertRaises(ValueError, self.ipv4.subnet, new_prefix=23)
345 self.assertRaises(ValueError, self.ipv4.subnet,
346 prefixlen_diff=3, new_prefix=27)
347 self.assertEqual(sorted(self.ipv6.subnet(prefixlen_diff=4)),
348 sorted(self.ipv6.subnet(new_prefix=68)))
349 self.assertRaises(ValueError, self.ipv6.subnet, new_prefix=63)
350 self.assertRaises(ValueError, self.ipv6.subnet,
351 prefixlen_diff=4, new_prefix=68)
353 def testGetSubnet(self):
354 self.assertEqual(self.ipv4.subnet()[0].prefixlen, 25)
355 self.assertEqual(str(self.ipv4.subnet()[0].network), '1.2.3.0')
356 self.assertEqual(str(self.ipv4.subnet()[1].network), '1.2.3.128')
358 self.assertEqual(self.ipv6.subnet()[0].prefixlen, 65)
360 def testGetSubnetForSingle32(self):
361 ip = ipaddr.IPv4Network('1.2.3.4/32')
362 subnets1 = [str(x) for x in ip.subnet()]
363 subnets2 = [str(x) for x in ip.subnet(2)]
364 self.assertEqual(subnets1, ['1.2.3.4/32'])
365 self.assertEqual(subnets1, subnets2)
367 def testGetSubnetForSingle128(self):
368 ip = ipaddr.IPv6Network('::1/128')
369 subnets1 = [str(x) for x in ip.subnet()]
370 subnets2 = [str(x) for x in ip.subnet(2)]
371 self.assertEqual(subnets1, ['::1/128'])
372 self.assertEqual(subnets1, subnets2)
374 def testSubnet2(self):
375 ips = [str(x) for x in self.ipv4.subnet(2)]
376 self.assertEqual(
377 ips,
378 ['1.2.3.0/26', '1.2.3.64/26', '1.2.3.128/26', '1.2.3.192/26'])
380 ipsv6 = [str(x) for x in self.ipv6.subnet(2)]
381 self.assertEqual(
382 ipsv6,
383 ['2001:658:22a:cafe::/66',
384 '2001:658:22a:cafe:4000::/66',
385 '2001:658:22a:cafe:8000::/66',
386 '2001:658:22a:cafe:c000::/66'])
388 def testSubnetFailsForLargeCidrDiff(self):
389 self.assertRaises(ValueError, self.ipv4.subnet, 9)
390 self.assertRaises(ValueError, self.ipv6.subnet, 65)
392 def testSupernetFailsForLargeCidrDiff(self):
393 self.assertRaises(ValueError, self.ipv4.supernet, 25)
394 self.assertRaises(ValueError, self.ipv6.supernet, 65)
396 def testSubnetFailsForNegativeCidrDiff(self):
397 self.assertRaises(ValueError, self.ipv4.subnet, -1)
398 self.assertRaises(ValueError, self.ipv6.subnet, -1)
400 def testGetNumHosts(self):
401 self.assertEqual(self.ipv4.numhosts, 256)
402 self.assertEqual(self.ipv4.subnet()[0].numhosts, 128)
403 self.assertEqual(self.ipv4.supernet().numhosts, 512)
405 self.assertEqual(self.ipv6.numhosts, 18446744073709551616)
406 self.assertEqual(self.ipv6.subnet()[0].numhosts, 9223372036854775808)
407 self.assertEqual(self.ipv6.supernet().numhosts, 36893488147419103232)
409 def testContains(self):
410 self.assertTrue(ipaddr.IPv4Network('1.2.3.128/25') in self.ipv4)
411 self.assertFalse(ipaddr.IPv4Network('1.2.4.1/24') in self.ipv4)
412 self.assertTrue(self.ipv4 in self.ipv4)
413 self.assertTrue(self.ipv6 in self.ipv6)
414 # We can test addresses and string as well.
415 addr1 = ipaddr.IPv4Address('1.2.3.37')
416 self.assertTrue(addr1 in self.ipv4)
417 # issue 61, bad network comparison on like-ip'd network objects
418 # with identical broadcast addresses.
419 self.assertFalse(ipaddr.IPv4Network('1.1.0.0/16').__contains__(
420 ipaddr.IPv4Network('1.0.0.0/15')))
422 def testBadAddress(self):
423 self.assertRaises(ipaddr.AddressValueError, ipaddr.IPv4Network,
424 'poop')
425 self.assertRaises(ipaddr.AddressValueError,
426 ipaddr.IPv4Network, '1.2.3.256')
428 self.assertRaises(ipaddr.AddressValueError, ipaddr.IPv6Network,
429 'poopv6')
430 self.assertRaises(ipaddr.AddressValueError,
431 ipaddr.IPv4Network, '1.2.3.4/32/24')
432 self.assertRaises(ipaddr.AddressValueError,
433 ipaddr.IPv4Network, '10/8')
434 self.assertRaises(ipaddr.AddressValueError,
435 ipaddr.IPv6Network, '10/8')
438 def testBadNetMask(self):
439 self.assertRaises(ipaddr.NetmaskValueError,
440 ipaddr.IPv4Network, '1.2.3.4/')
441 self.assertRaises(ipaddr.NetmaskValueError,
442 ipaddr.IPv4Network, '1.2.3.4/33')
443 self.assertRaises(ipaddr.NetmaskValueError,
444 ipaddr.IPv4Network, '1.2.3.4/254.254.255.256')
445 self.assertRaises(ipaddr.NetmaskValueError,
446 ipaddr.IPv4Network, '1.1.1.1/240.255.0.0')
447 self.assertRaises(ipaddr.NetmaskValueError,
448 ipaddr.IPv6Network, '::1/')
449 self.assertRaises(ipaddr.NetmaskValueError,
450 ipaddr.IPv6Network, '::1/129')
452 def testNth(self):
453 self.assertEqual(str(self.ipv4[5]), '1.2.3.5')
454 self.assertRaises(IndexError, self.ipv4.__getitem__, 256)
456 self.assertEqual(str(self.ipv6[5]),
457 '2001:658:22a:cafe::5')
459 def testGetitem(self):
460 # http://code.google.com/p/ipaddr-py/issues/detail?id=15
461 addr = ipaddr.IPv4Network('172.31.255.128/255.255.255.240')
462 self.assertEqual(28, addr.prefixlen)
463 addr_list = list(addr)
464 self.assertEqual('172.31.255.128', str(addr_list[0]))
465 self.assertEqual('172.31.255.128', str(addr[0]))
466 self.assertEqual('172.31.255.143', str(addr_list[-1]))
467 self.assertEqual('172.31.255.143', str(addr[-1]))
468 self.assertEqual(addr_list[-1], addr[-1])
470 def testEqual(self):
471 self.assertTrue(self.ipv4 == ipaddr.IPv4Network('1.2.3.4/24'))
472 self.assertFalse(self.ipv4 == ipaddr.IPv4Network('1.2.3.4/23'))
473 self.assertFalse(self.ipv4 == ipaddr.IPv6Network('::1.2.3.4/24'))
474 self.assertFalse(self.ipv4 == '')
475 self.assertFalse(self.ipv4 == [])
476 self.assertFalse(self.ipv4 == 2)
477 self.assertTrue(ipaddr.IPNetwork('1.1.1.1/32') ==
478 ipaddr.IPAddress('1.1.1.1'))
479 self.assertTrue(ipaddr.IPNetwork('1.1.1.1/24') ==
480 ipaddr.IPAddress('1.1.1.1'))
481 self.assertFalse(ipaddr.IPNetwork('1.1.1.0/24') ==
482 ipaddr.IPAddress('1.1.1.1'))
484 self.assertTrue(self.ipv6 ==
485 ipaddr.IPv6Network('2001:658:22a:cafe:200::1/64'))
486 self.assertTrue(ipaddr.IPNetwork('::1/128') ==
487 ipaddr.IPAddress('::1'))
488 self.assertTrue(ipaddr.IPNetwork('::1/127') ==
489 ipaddr.IPAddress('::1'))
490 self.assertFalse(ipaddr.IPNetwork('::0/127') ==
491 ipaddr.IPAddress('::1'))
492 self.assertFalse(self.ipv6 ==
493 ipaddr.IPv6Network('2001:658:22a:cafe:200::1/63'))
494 self.assertFalse(self.ipv6 == ipaddr.IPv4Network('1.2.3.4/23'))
495 self.assertFalse(self.ipv6 == '')
496 self.assertFalse(self.ipv6 == [])
497 self.assertFalse(self.ipv6 == 2)
499 def testNotEqual(self):
500 self.assertFalse(self.ipv4 != ipaddr.IPv4Network('1.2.3.4/24'))
501 self.assertTrue(self.ipv4 != ipaddr.IPv4Network('1.2.3.4/23'))
502 self.assertTrue(self.ipv4 != ipaddr.IPv6Network('::1.2.3.4/24'))
503 self.assertTrue(self.ipv4 != '')
504 self.assertTrue(self.ipv4 != [])
505 self.assertTrue(self.ipv4 != 2)
507 addr2 = ipaddr.IPAddress('2001:658:22a:cafe:200::1')
508 self.assertFalse(self.ipv6 !=
509 ipaddr.IPv6Network('2001:658:22a:cafe:200::1/64'))
510 self.assertTrue(self.ipv6 !=
511 ipaddr.IPv6Network('2001:658:22a:cafe:200::1/63'))
512 self.assertTrue(self.ipv6 != ipaddr.IPv4Network('1.2.3.4/23'))
513 self.assertTrue(self.ipv6 != '')
514 self.assertTrue(self.ipv6 != [])
515 self.assertTrue(self.ipv6 != 2)
517 def testSlash32Constructor(self):
518 self.assertEqual(str(ipaddr.IPv4Network('1.2.3.4/255.255.255.255')),
519 '1.2.3.4/32')
521 def testSlash128Constructor(self):
522 self.assertEqual(str(ipaddr.IPv6Network('::1/128')),
523 '::1/128')
525 def testSlash0Constructor(self):
526 self.assertEqual(str(ipaddr.IPv4Network('1.2.3.4/0.0.0.0')),
527 '1.2.3.4/0')
529 def testCollapsing(self):
530 # test only IP addresses including some duplicates
531 ip1 = ipaddr.IPv4Address('1.1.1.0')
532 ip2 = ipaddr.IPv4Address('1.1.1.1')
533 ip3 = ipaddr.IPv4Address('1.1.1.2')
534 ip4 = ipaddr.IPv4Address('1.1.1.3')
535 ip5 = ipaddr.IPv4Address('1.1.1.4')
536 ip6 = ipaddr.IPv4Address('1.1.1.0')
537 # check that addreses are subsumed properly.
538 collapsed = ipaddr.collapse_address_list([ip1, ip2, ip3, ip4, ip5, ip6])
539 self.assertEqual(collapsed, [ipaddr.IPv4Network('1.1.1.0/30'),
540 ipaddr.IPv4Network('1.1.1.4/32')])
542 # test a mix of IP addresses and networks including some duplicates
543 ip1 = ipaddr.IPv4Address('1.1.1.0')
544 ip2 = ipaddr.IPv4Address('1.1.1.1')
545 ip3 = ipaddr.IPv4Address('1.1.1.2')
546 ip4 = ipaddr.IPv4Address('1.1.1.3')
547 ip5 = ipaddr.IPv4Network('1.1.1.4/30')
548 ip6 = ipaddr.IPv4Network('1.1.1.4/30')
549 # check that addreses are subsumed properly.
550 collapsed = ipaddr.collapse_address_list([ip5, ip1, ip2, ip3, ip4, ip6])
551 self.assertEqual(collapsed, [ipaddr.IPv4Network('1.1.1.0/29')])
553 # test only IP networks
554 ip1 = ipaddr.IPv4Network('1.1.0.0/24')
555 ip2 = ipaddr.IPv4Network('1.1.1.0/24')
556 ip3 = ipaddr.IPv4Network('1.1.2.0/24')
557 ip4 = ipaddr.IPv4Network('1.1.3.0/24')
558 ip5 = ipaddr.IPv4Network('1.1.4.0/24')
559 # stored in no particular order b/c we want CollapseAddr to call [].sort
560 ip6 = ipaddr.IPv4Network('1.1.0.0/22')
561 # check that addreses are subsumed properly.
562 collapsed = ipaddr.collapse_address_list([ip1, ip2, ip3, ip4, ip5, ip6])
563 self.assertEqual(collapsed, [ipaddr.IPv4Network('1.1.0.0/22'),
564 ipaddr.IPv4Network('1.1.4.0/24')])
566 # test that two addresses are supernet'ed properly
567 collapsed = ipaddr.collapse_address_list([ip1, ip2])
568 self.assertEqual(collapsed, [ipaddr.IPv4Network('1.1.0.0/23')])
570 # test same IP networks
571 ip_same1 = ip_same2 = ipaddr.IPv4Network('1.1.1.1/32')
572 self.assertEqual(ipaddr.collapse_address_list([ip_same1, ip_same2]),
573 [ip_same1])
575 # test same IP addresses
576 ip_same1 = ip_same2 = ipaddr.IPv4Address('1.1.1.1')
577 self.assertEqual(ipaddr.collapse_address_list([ip_same1, ip_same2]),
578 [ipaddr.IPNetwork('1.1.1.1/32')])
579 ip1 = ipaddr.IPv6Network('::2001:1/100')
580 ip2 = ipaddr.IPv6Network('::2002:1/120')
581 ip3 = ipaddr.IPv6Network('::2001:1/96')
582 # test that ipv6 addresses are subsumed properly.
583 collapsed = ipaddr.collapse_address_list([ip1, ip2, ip3])
584 self.assertEqual(collapsed, [ip3])
586 # the toejam test
587 ip1 = ipaddr.IPAddress('1.1.1.1')
588 ip2 = ipaddr.IPAddress('::1')
589 self.assertRaises(TypeError, ipaddr.collapse_address_list,
590 [ip1, ip2])
592 def testSummarizing(self):
593 #ip = ipaddr.IPAddress
594 #ipnet = ipaddr.IPNetwork
595 summarize = ipaddr.summarize_address_range
596 ip1 = ipaddr.IPAddress('1.1.1.0')
597 ip2 = ipaddr.IPAddress('1.1.1.255')
598 # test a /24 is sumamrized properly
599 self.assertEqual(summarize(ip1, ip2)[0], ipaddr.IPNetwork('1.1.1.0/24'))
600 # test an IPv4 range that isn't on a network byte boundary
601 ip2 = ipaddr.IPAddress('1.1.1.8')
602 self.assertEqual(summarize(ip1, ip2), [ipaddr.IPNetwork('1.1.1.0/29'),
603 ipaddr.IPNetwork('1.1.1.8')])
605 ip1 = ipaddr.IPAddress('1::')
606 ip2 = ipaddr.IPAddress('1:ffff:ffff:ffff:ffff:ffff:ffff:ffff')
607 # test a IPv6 is sumamrized properly
608 self.assertEqual(summarize(ip1, ip2)[0], ipaddr.IPNetwork('1::/16'))
609 # test an IPv6 range that isn't on a network byte boundary
610 ip2 = ipaddr.IPAddress('2::')
611 self.assertEqual(summarize(ip1, ip2), [ipaddr.IPNetwork('1::/16'),
612 ipaddr.IPNetwork('2::/128')])
614 # test exception raised when first is greater than last
615 self.assertRaises(ValueError, summarize, ipaddr.IPAddress('1.1.1.0'),
616 ipaddr.IPAddress('1.1.0.0'))
617 # test exception raised when first and last aren't IP addresses
618 self.assertRaises(TypeError, summarize,
619 ipaddr.IPNetwork('1.1.1.0'),
620 ipaddr.IPNetwork('1.1.0.0'))
621 self.assertRaises(TypeError, summarize,
622 ipaddr.IPNetwork('1.1.1.0'), ipaddr.IPNetwork('1.1.0.0'))
623 # test exception raised when first and last are not same version
624 self.assertRaises(TypeError, summarize, ipaddr.IPAddress('::'),
625 ipaddr.IPNetwork('1.1.0.0'))
627 def testAddressComparison(self):
628 self.assertTrue(ipaddr.IPAddress('1.1.1.1') <=
629 ipaddr.IPAddress('1.1.1.1'))
630 self.assertTrue(ipaddr.IPAddress('1.1.1.1') <=
631 ipaddr.IPAddress('1.1.1.2'))
632 self.assertTrue(ipaddr.IPAddress('::1') <= ipaddr.IPAddress('::1'))
633 self.assertTrue(ipaddr.IPAddress('::1') <= ipaddr.IPAddress('::2'))
635 def testNetworkComparison(self):
636 # ip1 and ip2 have the same network address
637 ip1 = ipaddr.IPv4Network('1.1.1.0/24')
638 ip2 = ipaddr.IPv4Network('1.1.1.1/24')
639 ip3 = ipaddr.IPv4Network('1.1.2.0/24')
641 self.assertTrue(ip1 < ip3)
642 self.assertTrue(ip3 > ip2)
644 self.assertEqual(ip1.compare_networks(ip2), 0)
645 self.assertTrue(ip1._get_networks_key() == ip2._get_networks_key())
646 self.assertEqual(ip1.compare_networks(ip3), -1)
647 self.assertTrue(ip1._get_networks_key() < ip3._get_networks_key())
649 ip1 = ipaddr.IPv6Network('2001::2000/96')
650 ip2 = ipaddr.IPv6Network('2001::2001/96')
651 ip3 = ipaddr.IPv6Network('2001:ffff::2000/96')
653 self.assertTrue(ip1 < ip3)
654 self.assertTrue(ip3 > ip2)
655 self.assertEqual(ip1.compare_networks(ip2), 0)
656 self.assertTrue(ip1._get_networks_key() == ip2._get_networks_key())
657 self.assertEqual(ip1.compare_networks(ip3), -1)
658 self.assertTrue(ip1._get_networks_key() < ip3._get_networks_key())
660 # Test comparing different protocols.
661 # Should always raise a TypeError.
662 ipv6 = ipaddr.IPv6Network('::/0')
663 ipv4 = ipaddr.IPv4Network('0.0.0.0/0')
664 self.assertRaises(TypeError, ipv4.__lt__, ipv6)
665 self.assertRaises(TypeError, ipv4.__gt__, ipv6)
666 self.assertRaises(TypeError, ipv6.__lt__, ipv4)
667 self.assertRaises(TypeError, ipv6.__gt__, ipv4)
669 # Regression test for issue 19.
670 ip1 = ipaddr.IPNetwork('10.1.2.128/25')
671 self.assertFalse(ip1 < ip1)
672 self.assertFalse(ip1 > ip1)
673 ip2 = ipaddr.IPNetwork('10.1.3.0/24')
674 self.assertTrue(ip1 < ip2)
675 self.assertFalse(ip2 < ip1)
676 self.assertFalse(ip1 > ip2)
677 self.assertTrue(ip2 > ip1)
678 ip3 = ipaddr.IPNetwork('10.1.3.0/25')
679 self.assertTrue(ip2 < ip3)
680 self.assertFalse(ip3 < ip2)
681 self.assertFalse(ip2 > ip3)
682 self.assertTrue(ip3 > ip2)
684 # Regression test for issue 28.
685 ip1 = ipaddr.IPNetwork('10.10.10.0/31')
686 ip2 = ipaddr.IPNetwork('10.10.10.0')
687 ip3 = ipaddr.IPNetwork('10.10.10.2/31')
688 ip4 = ipaddr.IPNetwork('10.10.10.2')
689 sorted = [ip1, ip2, ip3, ip4]
690 unsorted = [ip2, ip4, ip1, ip3]
691 unsorted.sort()
692 self.assertEqual(sorted, unsorted)
693 unsorted = [ip4, ip1, ip3, ip2]
694 unsorted.sort()
695 self.assertEqual(sorted, unsorted)
696 self.assertRaises(TypeError, ip1.__lt__, ipaddr.IPAddress('10.10.10.0'))
697 self.assertRaises(TypeError, ip2.__lt__, ipaddr.IPAddress('10.10.10.0'))
699 # <=, >=
700 self.assertTrue(ipaddr.IPNetwork('1.1.1.1') <=
701 ipaddr.IPNetwork('1.1.1.1'))
702 self.assertTrue(ipaddr.IPNetwork('1.1.1.1') <=
703 ipaddr.IPNetwork('1.1.1.2'))
704 self.assertFalse(ipaddr.IPNetwork('1.1.1.2') <=
705 ipaddr.IPNetwork('1.1.1.1'))
706 self.assertTrue(ipaddr.IPNetwork('::1') <= ipaddr.IPNetwork('::1'))
707 self.assertTrue(ipaddr.IPNetwork('::1') <= ipaddr.IPNetwork('::2'))
708 self.assertFalse(ipaddr.IPNetwork('::2') <= ipaddr.IPNetwork('::1'))
710 def testStrictNetworks(self):
711 self.assertRaises(ValueError, ipaddr.IPNetwork, '192.168.1.1/24',
712 strict=True)
713 self.assertRaises(ValueError, ipaddr.IPNetwork, '::1/120', strict=True)
715 def testOverlaps(self):
716 other = ipaddr.IPv4Network('1.2.3.0/30')
717 other2 = ipaddr.IPv4Network('1.2.2.0/24')
718 other3 = ipaddr.IPv4Network('1.2.2.64/26')
719 self.assertTrue(self.ipv4.overlaps(other))
720 self.assertFalse(self.ipv4.overlaps(other2))
721 self.assertTrue(other2.overlaps(other3))
723 def testEmbeddedIpv4(self):
724 ipv4_string = '192.168.0.1'
725 ipv4 = ipaddr.IPv4Network(ipv4_string)
726 v4compat_ipv6 = ipaddr.IPv6Network('::%s' % ipv4_string)
727 self.assertEqual(int(v4compat_ipv6.ip), int(ipv4.ip))
728 v4mapped_ipv6 = ipaddr.IPv6Network('::ffff:%s' % ipv4_string)
729 self.assertNotEqual(v4mapped_ipv6.ip, ipv4.ip)
730 self.assertRaises(ipaddr.AddressValueError, ipaddr.IPv6Network,
731 '2001:1.1.1.1:1.1.1.1')
733 # Issue 67: IPv6 with embedded IPv4 address not recognized.
734 def testIPv6AddressTooLarge(self):
735 # RFC4291 2.5.5.2
736 self.assertEqual(ipaddr.IPAddress('::FFFF:192.0.2.1'),
737 ipaddr.IPAddress('::FFFF:c000:201'))
738 # RFC4291 2.2 (part 3) x::d.d.d.d
739 self.assertEqual(ipaddr.IPAddress('FFFF::192.0.2.1'),
740 ipaddr.IPAddress('FFFF::c000:201'))
742 def testIPVersion(self):
743 self.assertEqual(self.ipv4.version, 4)
744 self.assertEqual(self.ipv6.version, 6)
746 def testMaxPrefixLength(self):
747 self.assertEqual(self.ipv4.max_prefixlen, 32)
748 self.assertEqual(self.ipv6.max_prefixlen, 128)
750 def testPacked(self):
751 self.assertEqual(self.ipv4.packed,
752 _cb('\x01\x02\x03\x04'))
753 self.assertEqual(ipaddr.IPv4Network('255.254.253.252').packed,
754 _cb('\xff\xfe\xfd\xfc'))
755 self.assertEqual(self.ipv6.packed,
756 _cb('\x20\x01\x06\x58\x02\x2a\xca\xfe'
757 '\x02\x00\x00\x00\x00\x00\x00\x01'))
758 self.assertEqual(ipaddr.IPv6Network('ffff:2:3:4:ffff::').packed,
759 _cb('\xff\xff\x00\x02\x00\x03\x00\x04\xff\xff'
760 + '\x00' * 6))
761 self.assertEqual(ipaddr.IPv6Network('::1:0:0:0:0').packed,
762 _cb('\x00' * 6 + '\x00\x01' + '\x00' * 8))
764 def testIpStrFromPrefixlen(self):
765 ipv4 = ipaddr.IPv4Network('1.2.3.4/24')
766 self.assertEqual(ipv4._ip_string_from_prefix(), '255.255.255.0')
767 self.assertEqual(ipv4._ip_string_from_prefix(28), '255.255.255.240')
769 def testIpType(self):
770 ipv4net = ipaddr.IPNetwork('1.2.3.4')
771 ipv4addr = ipaddr.IPAddress('1.2.3.4')
772 ipv6net = ipaddr.IPNetwork('::1.2.3.4')
773 ipv6addr = ipaddr.IPAddress('::1.2.3.4')
774 self.assertEqual(ipaddr.IPv4Network, type(ipv4net))
775 self.assertEqual(ipaddr.IPv4Address, type(ipv4addr))
776 self.assertEqual(ipaddr.IPv6Network, type(ipv6net))
777 self.assertEqual(ipaddr.IPv6Address, type(ipv6addr))
779 def testReservedIpv4(self):
780 # test networks
781 self.assertEqual(True, ipaddr.IPNetwork('224.1.1.1/31').is_multicast)
782 self.assertEqual(False, ipaddr.IPNetwork('240.0.0.0').is_multicast)
784 self.assertEqual(True, ipaddr.IPNetwork('192.168.1.1/17').is_private)
785 self.assertEqual(False, ipaddr.IPNetwork('192.169.0.0').is_private)
786 self.assertEqual(True, ipaddr.IPNetwork('10.255.255.255').is_private)
787 self.assertEqual(False, ipaddr.IPNetwork('11.0.0.0').is_private)
788 self.assertEqual(True, ipaddr.IPNetwork('172.31.255.255').is_private)
789 self.assertEqual(False, ipaddr.IPNetwork('172.32.0.0').is_private)
791 self.assertEqual(True,
792 ipaddr.IPNetwork('169.254.100.200/24').is_link_local)
793 self.assertEqual(False,
794 ipaddr.IPNetwork('169.255.100.200/24').is_link_local)
796 self.assertEqual(True,
797 ipaddr.IPNetwork('127.100.200.254/32').is_loopback)
798 self.assertEqual(True, ipaddr.IPNetwork('127.42.0.0/16').is_loopback)
799 self.assertEqual(False, ipaddr.IPNetwork('128.0.0.0').is_loopback)
801 # test addresses
802 self.assertEqual(True, ipaddr.IPAddress('224.1.1.1').is_multicast)
803 self.assertEqual(False, ipaddr.IPAddress('240.0.0.0').is_multicast)
805 self.assertEqual(True, ipaddr.IPAddress('192.168.1.1').is_private)
806 self.assertEqual(False, ipaddr.IPAddress('192.169.0.0').is_private)
807 self.assertEqual(True, ipaddr.IPAddress('10.255.255.255').is_private)
808 self.assertEqual(False, ipaddr.IPAddress('11.0.0.0').is_private)
809 self.assertEqual(True, ipaddr.IPAddress('172.31.255.255').is_private)
810 self.assertEqual(False, ipaddr.IPAddress('172.32.0.0').is_private)
812 self.assertEqual(True,
813 ipaddr.IPAddress('169.254.100.200').is_link_local)
814 self.assertEqual(False,
815 ipaddr.IPAddress('169.255.100.200').is_link_local)
817 self.assertEqual(True,
818 ipaddr.IPAddress('127.100.200.254').is_loopback)
819 self.assertEqual(True, ipaddr.IPAddress('127.42.0.0').is_loopback)
820 self.assertEqual(False, ipaddr.IPAddress('128.0.0.0').is_loopback)
821 self.assertEqual(True, ipaddr.IPNetwork('0.0.0.0').is_unspecified)
823 def testReservedIpv6(self):
825 self.assertEqual(True, ipaddr.IPNetwork('ffff::').is_multicast)
826 self.assertEqual(True, ipaddr.IPNetwork(2**128-1).is_multicast)
827 self.assertEqual(True, ipaddr.IPNetwork('ff00::').is_multicast)
828 self.assertEqual(False, ipaddr.IPNetwork('fdff::').is_multicast)
830 self.assertEqual(True, ipaddr.IPNetwork('fecf::').is_site_local)
831 self.assertEqual(True, ipaddr.IPNetwork(
832 'feff:ffff:ffff:ffff::').is_site_local)
833 self.assertEqual(False, ipaddr.IPNetwork('fbf:ffff::').is_site_local)
834 self.assertEqual(False, ipaddr.IPNetwork('ff00::').is_site_local)
836 self.assertEqual(True, ipaddr.IPNetwork('fc00::').is_private)
837 self.assertEqual(True, ipaddr.IPNetwork(
838 'fc00:ffff:ffff:ffff::').is_private)
839 self.assertEqual(False, ipaddr.IPNetwork('fbff:ffff::').is_private)
840 self.assertEqual(False, ipaddr.IPNetwork('fe00::').is_private)
842 self.assertEqual(True, ipaddr.IPNetwork('fea0::').is_link_local)
843 self.assertEqual(True, ipaddr.IPNetwork('febf:ffff::').is_link_local)
844 self.assertEqual(False, ipaddr.IPNetwork('fe7f:ffff::').is_link_local)
845 self.assertEqual(False, ipaddr.IPNetwork('fec0::').is_link_local)
847 self.assertEqual(True, ipaddr.IPNetwork('0:0::0:01').is_loopback)
848 self.assertEqual(False, ipaddr.IPNetwork('::1/127').is_loopback)
849 self.assertEqual(False, ipaddr.IPNetwork('::').is_loopback)
850 self.assertEqual(False, ipaddr.IPNetwork('::2').is_loopback)
852 self.assertEqual(True, ipaddr.IPNetwork('0::0').is_unspecified)
853 self.assertEqual(False, ipaddr.IPNetwork('::1').is_unspecified)
854 self.assertEqual(False, ipaddr.IPNetwork('::/127').is_unspecified)
856 # test addresses
857 self.assertEqual(True, ipaddr.IPAddress('ffff::').is_multicast)
858 self.assertEqual(True, ipaddr.IPAddress(2**128-1).is_multicast)
859 self.assertEqual(True, ipaddr.IPAddress('ff00::').is_multicast)
860 self.assertEqual(False, ipaddr.IPAddress('fdff::').is_multicast)
862 self.assertEqual(True, ipaddr.IPAddress('fecf::').is_site_local)
863 self.assertEqual(True, ipaddr.IPAddress(
864 'feff:ffff:ffff:ffff::').is_site_local)
865 self.assertEqual(False, ipaddr.IPAddress('fbf:ffff::').is_site_local)
866 self.assertEqual(False, ipaddr.IPAddress('ff00::').is_site_local)
868 self.assertEqual(True, ipaddr.IPAddress('fc00::').is_private)
869 self.assertEqual(True, ipaddr.IPAddress(
870 'fc00:ffff:ffff:ffff::').is_private)
871 self.assertEqual(False, ipaddr.IPAddress('fbff:ffff::').is_private)
872 self.assertEqual(False, ipaddr.IPAddress('fe00::').is_private)
874 self.assertEqual(True, ipaddr.IPAddress('fea0::').is_link_local)
875 self.assertEqual(True, ipaddr.IPAddress('febf:ffff::').is_link_local)
876 self.assertEqual(False, ipaddr.IPAddress('fe7f:ffff::').is_link_local)
877 self.assertEqual(False, ipaddr.IPAddress('fec0::').is_link_local)
879 self.assertEqual(True, ipaddr.IPAddress('0:0::0:01').is_loopback)
880 self.assertEqual(True, ipaddr.IPAddress('::1').is_loopback)
881 self.assertEqual(False, ipaddr.IPAddress('::2').is_loopback)
883 self.assertEqual(True, ipaddr.IPAddress('0::0').is_unspecified)
884 self.assertEqual(False, ipaddr.IPAddress('::1').is_unspecified)
886 # some generic IETF reserved addresses
887 self.assertEqual(True, ipaddr.IPAddress('100::').is_reserved)
888 self.assertEqual(True, ipaddr.IPNetwork('4000::1/128').is_reserved)
890 def testIpv4Mapped(self):
891 self.assertEqual(ipaddr.IPAddress('::ffff:192.168.1.1').ipv4_mapped,
892 ipaddr.IPAddress('192.168.1.1'))
893 self.assertEqual(ipaddr.IPAddress('::c0a8:101').ipv4_mapped, None)
894 self.assertEqual(ipaddr.IPAddress('::ffff:c0a8:101').ipv4_mapped,
895 ipaddr.IPAddress('192.168.1.1'))
897 def testAddrExclude(self):
898 addr1 = ipaddr.IPNetwork('10.1.1.0/24')
899 addr2 = ipaddr.IPNetwork('10.1.1.0/26')
900 addr3 = ipaddr.IPNetwork('10.2.1.0/24')
901 addr4 = ipaddr.IPAddress('10.1.1.0')
902 self.assertEqual(addr1.address_exclude(addr2),
903 [ipaddr.IPNetwork('10.1.1.64/26'),
904 ipaddr.IPNetwork('10.1.1.128/25')])
905 self.assertRaises(ValueError, addr1.address_exclude, addr3)
906 self.assertRaises(TypeError, addr1.address_exclude, addr4)
907 self.assertEqual(addr1.address_exclude(addr1), [])
909 def testHash(self):
910 self.assertEqual(hash(ipaddr.IPNetwork('10.1.1.0/24')),
911 hash(ipaddr.IPNetwork('10.1.1.0/24')))
912 self.assertEqual(hash(ipaddr.IPAddress('10.1.1.0')),
913 hash(ipaddr.IPAddress('10.1.1.0')))
914 # i70
915 self.assertEqual(hash(ipaddr.IPAddress('1.2.3.4')),
916 hash(ipaddr.IPAddress(
917 long(ipaddr.IPAddress('1.2.3.4')._ip))))
918 ip1 = ipaddr.IPAddress('10.1.1.0')
919 ip2 = ipaddr.IPAddress('1::')
920 dummy = {}
921 dummy[self.ipv4] = None
922 dummy[self.ipv6] = None
923 dummy[ip1] = None
924 dummy[ip2] = None
925 self.assertTrue(self.ipv4 in dummy)
926 self.assertTrue(ip2 in dummy)
928 def testCopyConstructor(self):
929 addr1 = ipaddr.IPNetwork('10.1.1.0/24')
930 addr2 = ipaddr.IPNetwork(addr1)
931 addr3 = ipaddr.IPNetwork('2001:658:22a:cafe:200::1/64')
932 addr4 = ipaddr.IPNetwork(addr3)
933 addr5 = ipaddr.IPv4Address('1.1.1.1')
934 addr6 = ipaddr.IPv6Address('2001:658:22a:cafe:200::1')
936 self.assertEqual(addr1, addr2)
937 self.assertEqual(addr3, addr4)
938 self.assertEqual(addr5, ipaddr.IPv4Address(addr5))
939 self.assertEqual(addr6, ipaddr.IPv6Address(addr6))
941 def testCompressIPv6Address(self):
942 test_addresses = {
943 '1:2:3:4:5:6:7:8': '1:2:3:4:5:6:7:8/128',
944 '2001:0:0:4:0:0:0:8': '2001:0:0:4::8/128',
945 '2001:0:0:4:5:6:7:8': '2001::4:5:6:7:8/128',
946 '2001:0:3:4:5:6:7:8': '2001:0:3:4:5:6:7:8/128',
947 '2001:0:3:4:5:6:7:8': '2001:0:3:4:5:6:7:8/128',
948 '0:0:3:0:0:0:0:ffff': '0:0:3::ffff/128',
949 '0:0:0:4:0:0:0:ffff': '::4:0:0:0:ffff/128',
950 '0:0:0:0:5:0:0:ffff': '::5:0:0:ffff/128',
951 '1:0:0:4:0:0:7:8': '1::4:0:0:7:8/128',
952 '0:0:0:0:0:0:0:0': '::/128',
953 '0:0:0:0:0:0:0:0/0': '::/0',
954 '0:0:0:0:0:0:0:1': '::1/128',
955 '2001:0658:022a:cafe:0000:0000:0000:0000/66':
956 '2001:658:22a:cafe::/66',
957 '::1.2.3.4': '::102:304/128',
958 '1:2:3:4:5:ffff:1.2.3.4': '1:2:3:4:5:ffff:102:304/128',
959 '::7:6:5:4:3:2:1': '0:7:6:5:4:3:2:1/128',
960 '::7:6:5:4:3:2:0': '0:7:6:5:4:3:2:0/128',
961 '7:6:5:4:3:2:1::': '7:6:5:4:3:2:1:0/128',
962 '0:6:5:4:3:2:1::': '0:6:5:4:3:2:1:0/128',
964 for uncompressed, compressed in test_addresses.items():
965 self.assertEqual(compressed, str(ipaddr.IPv6Network(uncompressed)))
967 def testExplodeShortHandIpStr(self):
968 addr1 = ipaddr.IPv6Network('2001::1')
969 addr2 = ipaddr.IPv6Address('2001:0:5ef5:79fd:0:59d:a0e5:ba1')
970 self.assertEqual('2001:0000:0000:0000:0000:0000:0000:0001/128',
971 addr1.exploded)
972 self.assertEqual('0000:0000:0000:0000:0000:0000:0000:0001/128',
973 ipaddr.IPv6Network('::1/128').exploded)
974 # issue 77
975 self.assertEqual('2001:0000:5ef5:79fd:0000:059d:a0e5:0ba1',
976 addr2.exploded)
978 def testIntRepresentation(self):
979 self.assertEqual(16909060, int(self.ipv4))
980 self.assertEqual(42540616829182469433547762482097946625, int(self.ipv6))
982 def testHexRepresentation(self):
983 self.assertEqual(hex(0x1020304),
984 hex(self.ipv4))
986 self.assertEqual(hex(0x20010658022ACAFE0200000000000001),
987 hex(self.ipv6))
989 # backwards compatibility
990 def testBackwardsCompability(self):
991 self.assertEqual(ipaddr.CollapseAddrList(
992 [ipaddr.IPNetwork('1.1.0.0/24'), ipaddr.IPNetwork('1.1.1.0/24')]),
993 [ipaddr.IPNetwork('1.1.0.0/23')])
995 self.assertEqual(ipaddr.IPNetwork('::42:0/112').AddressExclude(
996 ipaddr.IPNetwork('::42:8000/113')),
997 [ipaddr.IPNetwork('::42:0/113')])
999 self.assertTrue(ipaddr.IPNetwork('1::/8').CompareNetworks(
1000 ipaddr.IPNetwork('2::/9')) < 0)
1002 self.assertEqual(ipaddr.IPNetwork('1::/16').Contains(
1003 ipaddr.IPNetwork('2::/16')), False)
1005 self.assertEqual(ipaddr.IPNetwork('0.0.0.0/0').Subnet(),
1006 [ipaddr.IPNetwork('0.0.0.0/1'),
1007 ipaddr.IPNetwork('128.0.0.0/1')])
1008 self.assertEqual(ipaddr.IPNetwork('::/127').Subnet(),
1009 [ipaddr.IPNetwork('::/128'),
1010 ipaddr.IPNetwork('::1/128')])
1012 self.assertEqual(ipaddr.IPNetwork('1.0.0.0/32').Supernet(),
1013 ipaddr.IPNetwork('1.0.0.0/31'))
1014 self.assertEqual(ipaddr.IPNetwork('::/121').Supernet(),
1015 ipaddr.IPNetwork('::/120'))
1017 self.assertEqual(ipaddr.IPNetwork('10.0.0.2').IsRFC1918(), True)
1018 self.assertEqual(ipaddr.IPNetwork('10.0.0.0').IsMulticast(), False)
1019 self.assertEqual(ipaddr.IPNetwork('127.255.255.255').IsLoopback(), True)
1020 self.assertEqual(ipaddr.IPNetwork('169.255.255.255').IsLinkLocal(),
1021 False)
1023 def testForceVersion(self):
1024 self.assertEqual(ipaddr.IPNetwork(1).version, 4)
1025 self.assertEqual(ipaddr.IPNetwork(1, version=6).version, 6)
1027 def testWithStar(self):
1028 self.assertEqual(str(self.ipv4.with_prefixlen), "1.2.3.4/24")
1029 self.assertEqual(str(self.ipv4.with_netmask), "1.2.3.4/255.255.255.0")
1030 self.assertEqual(str(self.ipv4.with_hostmask), "1.2.3.4/0.0.0.255")
1032 self.assertEqual(str(self.ipv6.with_prefixlen),
1033 '2001:658:22a:cafe:200::1/64')
1034 # rfc3513 sec 2.3 says that ipv6 only uses cidr notation for
1035 # subnets
1036 self.assertEqual(str(self.ipv6.with_netmask),
1037 '2001:658:22a:cafe:200::1/64')
1038 # this probably don't make much sense, but it's included for
1039 # compatibility with ipv4
1040 self.assertEqual(str(self.ipv6.with_hostmask),
1041 '2001:658:22a:cafe:200::1/::ffff:ffff:ffff:ffff')
1043 def testNetworkElementCaching(self):
1044 # V4 - make sure we're empty
1045 self.assertFalse(self.ipv4._cache.has_key('network'))
1046 self.assertFalse(self.ipv4._cache.has_key('broadcast'))
1047 self.assertFalse(self.ipv4._cache.has_key('hostmask'))
1049 # V4 - populate and test
1050 self.assertEqual(self.ipv4.network, ipaddr.IPv4Address('1.2.3.0'))
1051 self.assertEqual(self.ipv4.broadcast, ipaddr.IPv4Address('1.2.3.255'))
1052 self.assertEqual(self.ipv4.hostmask, ipaddr.IPv4Address('0.0.0.255'))
1054 # V4 - check we're cached
1055 self.assertTrue(self.ipv4._cache.has_key('network'))
1056 self.assertTrue(self.ipv4._cache.has_key('broadcast'))
1057 self.assertTrue(self.ipv4._cache.has_key('hostmask'))
1059 # V6 - make sure we're empty
1060 self.assertFalse(self.ipv6._cache.has_key('network'))
1061 self.assertFalse(self.ipv6._cache.has_key('broadcast'))
1062 self.assertFalse(self.ipv6._cache.has_key('hostmask'))
1064 # V6 - populate and test
1065 self.assertEqual(self.ipv6.network,
1066 ipaddr.IPv6Address('2001:658:22a:cafe::'))
1067 self.assertEqual(self.ipv6.broadcast, ipaddr.IPv6Address(
1068 '2001:658:22a:cafe:ffff:ffff:ffff:ffff'))
1069 self.assertEqual(self.ipv6.hostmask,
1070 ipaddr.IPv6Address('::ffff:ffff:ffff:ffff'))
1072 # V6 - check we're cached
1073 self.assertTrue(self.ipv6._cache.has_key('network'))
1074 self.assertTrue(self.ipv6._cache.has_key('broadcast'))
1075 self.assertTrue(self.ipv6._cache.has_key('hostmask'))
1077 def testTeredo(self):
1078 # stolen from wikipedia
1079 server = ipaddr.IPv4Address('65.54.227.120')
1080 client = ipaddr.IPv4Address('192.0.2.45')
1081 teredo_addr = '2001:0000:4136:e378:8000:63bf:3fff:fdd2'
1082 self.assertEqual((server, client),
1083 ipaddr.IPAddress(teredo_addr).teredo)
1084 bad_addr = '2000::4136:e378:8000:63bf:3fff:fdd2'
1085 self.assertFalse(ipaddr.IPAddress(bad_addr).teredo)
1086 bad_addr = '2001:0001:4136:e378:8000:63bf:3fff:fdd2'
1087 self.assertFalse(ipaddr.IPAddress(bad_addr).teredo)
1089 # i77
1090 teredo_addr = ipaddr.IPv6Address('2001:0:5ef5:79fd:0:59d:a0e5:ba1')
1091 self.assertEqual((ipaddr.IPv4Address('94.245.121.253'),
1092 ipaddr.IPv4Address('95.26.244.94')),
1093 teredo_addr.teredo)
1096 def testsixtofour(self):
1097 sixtofouraddr = ipaddr.IPAddress('2002:ac1d:2d64::1')
1098 bad_addr = ipaddr.IPAddress('2000:ac1d:2d64::1')
1099 self.assertEqual(ipaddr.IPv4Address('172.29.45.100'),
1100 sixtofouraddr.sixtofour)
1101 self.assertFalse(bad_addr.sixtofour)
1104 if __name__ == '__main__':
1105 unittest.main()