blob: 417c98677f00d45c7cf9d244b6dcd4fd01347fa4 [file] [log] [blame]
Nick Coghlandc9b2552012-05-20 21:01:57 +10001# Copyright 2007 Google Inc.
2# Licensed to PSF under a Contributor Agreement.
Nick Coghlandc9b2552012-05-20 21:01:57 +10003
Nick Coghlanaff73f92012-05-27 00:57:25 +10004"""Unittest for ipaddress module."""
Nick Coghlandc9b2552012-05-20 21:01:57 +10005
6
7import unittest
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10008import re
9import contextlib
Nick Coghlandc9b2552012-05-20 21:01:57 +100010import ipaddress
11
Nick Coghlan36f8dcd2012-07-07 19:23:53 +100012class ErrorReporting(unittest.TestCase):
13 # One big change in ipaddress over the original ipaddr module is
14 # error reporting that tries to assume users *don't know the rules*
15 # for what constitutes an RFC compliant IP address
16
17 # Note that if the constructors are refactored so that addresses with
18 # multiple problems get classified differently, that's OK - just
19 # move the affected examples to the newly appropriate test case.
20
21 # The error reporting tests also cover a few corner cases that
22 # specifically *aren't* errors (such as leading zeroes in v6
23 # address parts) that don't have an obvious home in the main test
24 # suite
25
26 @contextlib.contextmanager
27 def assertCleanError(self, exc_type, details, *args):
28 """
29 Ensure exception does not display a context by default
30
31 Wraps unittest.TestCase.assertRaisesRegex
32 """
33 if args:
34 details = details % args
35 cm = self.assertRaisesRegex(exc_type, details)
36 with cm as exc:
37 yield exc
38 # Ensure we produce clean tracebacks on failure
39 if exc.exception.__context__ is not None:
40 self.assertTrue(exc.exception.__suppress_context__)
41
42 def assertAddressError(self, details, *args):
43 """Ensure a clean AddressValueError"""
44 return self.assertCleanError(ipaddress.AddressValueError,
45 details, *args)
46
47 def assertNetmaskError(self, details, *args):
48 """Ensure a clean NetmaskValueError"""
49 return self.assertCleanError(ipaddress.NetmaskValueError,
50 details, *args)
51
52class AddressErrors_v4(ErrorReporting):
53
54 def test_empty_address(self):
55 with self.assertAddressError("Address cannot be empty"):
56 ipaddress.IPv4Address("")
57
58 def test_network_passed_as_address(self):
59 addr = "127.0.0.1/24"
60 with self.assertAddressError("Unexpected '/' in %r", addr):
61 ipaddress.IPv4Address(addr)
62
63 def test_bad_address_split(self):
64 def assertBadSplit(addr):
65 with self.assertAddressError("Expected 4 octets in %r", addr):
66 ipaddress.IPv4Address(addr)
67
68 assertBadSplit("127.0.1")
69 assertBadSplit("42.42.42.42.42")
70 assertBadSplit("42.42.42")
71 assertBadSplit("42.42")
72 assertBadSplit("42")
73 assertBadSplit("42..42.42.42")
74 assertBadSplit("42.42.42.42.")
75 assertBadSplit("42.42.42.42...")
76 assertBadSplit(".42.42.42.42")
77 assertBadSplit("...42.42.42.42")
78 assertBadSplit("016.016.016")
79 assertBadSplit("016.016")
80 assertBadSplit("016")
81 assertBadSplit("000")
82 assertBadSplit("0x0a.0x0a.0x0a")
83 assertBadSplit("0x0a.0x0a")
84 assertBadSplit("0x0a")
85 assertBadSplit(".")
86 assertBadSplit("bogus")
87 assertBadSplit("bogus.com")
88 assertBadSplit("1000")
89 assertBadSplit("1000000000000000")
90 assertBadSplit("192.168.0.1.com")
91
92 def test_empty_octet(self):
93 def assertBadOctet(addr):
94 with self.assertAddressError("Empty octet not permitted in %r",
95 addr):
96 ipaddress.IPv4Address(addr)
97
98 assertBadOctet("42..42.42")
99 assertBadOctet("...")
100
101 def test_invalid_characters(self):
102 def assertBadOctet(addr, octet):
103 msg = "Only decimal digits permitted in %r in %r" % (octet, addr)
104 with self.assertAddressError(re.escape(msg)):
105 ipaddress.IPv4Address(addr)
106
107 assertBadOctet("0x0a.0x0a.0x0a.0x0a", "0x0a")
108 assertBadOctet("42.42.42.-0", "-0")
109 assertBadOctet("42.42.42.+0", "+0")
110 assertBadOctet("42.42.42.-42", "-42")
111 assertBadOctet("+1.+2.+3.4", "+1")
112 assertBadOctet("1.2.3.4e0", "4e0")
113 assertBadOctet("1.2.3.4::", "4::")
114 assertBadOctet("1.a.2.3", "a")
115
116 def test_leading_zeros(self):
117 def assertBadOctet(addr, octet):
118 msg = "Ambiguous leading zero in %r not permitted in %r"
119 with self.assertAddressError(msg, octet, addr):
120 ipaddress.IPv4Address(addr)
121
122 assertBadOctet("016.016.016.016", "016")
123 assertBadOctet("001.000.008.016", "008")
124 self.assertEqual(ipaddress.IPv4Address("192.168.000.001"),
125 ipaddress.IPv4Address("192.168.0.1"))
126
127 def test_octet_limit(self):
128 def assertBadOctet(addr, octet):
Nick Coghlanb582ecc2012-07-07 22:15:22 +1000129 msg = "Octet %d (> 255) not permitted in %r" % (octet, addr)
130 with self.assertAddressError(re.escape(msg)):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000131 ipaddress.IPv4Address(addr)
132
133 assertBadOctet("12345.67899.-54321.-98765", 12345)
134 assertBadOctet("257.0.0.0", 257)
135
136 def test_bad_packed_length(self):
137 def assertBadLength(length):
138 addr = b'\x00' * length
139 msg = "Packed address %r must be exactly 4 bytes" % addr
140 with self.assertAddressError(re.escape(msg)):
141 ipaddress.IPv4Address(addr)
142
143 assertBadLength(3)
144 assertBadLength(5)
145
146
147class AddressErrors_v6(ErrorReporting):
148
149 def test_empty_address(self):
150 with self.assertAddressError("Address cannot be empty"):
151 ipaddress.IPv6Address("")
152
153 def test_network_passed_as_address(self):
154 addr = "::1/24"
155 with self.assertAddressError("Unexpected '/' in %r", addr):
156 ipaddress.IPv6Address(addr)
157
158 def test_bad_address_split_v6_not_enough_parts(self):
159 def assertBadSplit(addr):
160 msg = "At least 3 parts expected in %r"
161 with self.assertAddressError(msg, addr):
162 ipaddress.IPv6Address(addr)
163
164 assertBadSplit(":")
165 assertBadSplit(":1")
166 assertBadSplit("FEDC:9878")
167
168 def test_bad_address_split_v6_too_many_colons(self):
169 def assertBadSplit(addr):
170 msg = "At most 8 colons permitted in %r"
171 with self.assertAddressError(msg, addr):
172 ipaddress.IPv6Address(addr)
173
174 assertBadSplit("9:8:7:6:5:4:3::2:1")
175 assertBadSplit("10:9:8:7:6:5:4:3:2:1")
176 assertBadSplit("::8:7:6:5:4:3:2:1")
177 assertBadSplit("8:7:6:5:4:3:2:1::")
178 # A trailing IPv4 address is two parts
179 assertBadSplit("10:9:8:7:6:5:4:3:42.42.42.42")
180
181 def test_bad_address_split_v6_too_many_parts(self):
182 def assertBadSplit(addr):
183 msg = "Exactly 8 parts expected without '::' in %r"
184 with self.assertAddressError(msg, addr):
185 ipaddress.IPv6Address(addr)
186
187 assertBadSplit("3ffe:0:0:0:0:0:0:0:1")
188 assertBadSplit("9:8:7:6:5:4:3:2:1")
189 assertBadSplit("7:6:5:4:3:2:1")
190 # A trailing IPv4 address is two parts
191 assertBadSplit("9:8:7:6:5:4:3:42.42.42.42")
192 assertBadSplit("7:6:5:4:3:42.42.42.42")
193
194 def test_bad_address_split_v6_too_many_parts_with_double_colon(self):
195 def assertBadSplit(addr):
196 msg = "Expected at most 7 other parts with '::' in %r"
197 with self.assertAddressError(msg, addr):
198 ipaddress.IPv6Address(addr)
199
200 assertBadSplit("1:2:3:4::5:6:7:8")
201
202 def test_bad_address_split_v6_repeated_double_colon(self):
203 def assertBadSplit(addr):
204 msg = "At most one '::' permitted in %r"
205 with self.assertAddressError(msg, addr):
206 ipaddress.IPv6Address(addr)
207
208 assertBadSplit("3ffe::1::1")
209 assertBadSplit("1::2::3::4:5")
210 assertBadSplit("2001::db:::1")
211 assertBadSplit("3ffe::1::")
212 assertBadSplit("::3ffe::1")
213 assertBadSplit(":3ffe::1::1")
214 assertBadSplit("3ffe::1::1:")
215 assertBadSplit(":3ffe::1::1:")
216 assertBadSplit(":::")
217 assertBadSplit('2001:db8:::1')
218
219 def test_bad_address_split_v6_leading_colon(self):
220 def assertBadSplit(addr):
221 msg = "Leading ':' only permitted as part of '::' in %r"
222 with self.assertAddressError(msg, addr):
223 ipaddress.IPv6Address(addr)
224
225 assertBadSplit(":2001:db8::1")
226 assertBadSplit(":1:2:3:4:5:6:7")
227 assertBadSplit(":1:2:3:4:5:6:")
228 assertBadSplit(":6:5:4:3:2:1::")
229
230 def test_bad_address_split_v6_trailing_colon(self):
231 def assertBadSplit(addr):
232 msg = "Trailing ':' only permitted as part of '::' in %r"
233 with self.assertAddressError(msg, addr):
234 ipaddress.IPv6Address(addr)
235
236 assertBadSplit("2001:db8::1:")
237 assertBadSplit("1:2:3:4:5:6:7:")
238 assertBadSplit("::1.2.3.4:")
239 assertBadSplit("::7:6:5:4:3:2:")
240
241 def test_bad_v4_part_in(self):
242 def assertBadAddressPart(addr, v4_error):
243 with self.assertAddressError("%s in %r", v4_error, addr):
244 ipaddress.IPv6Address(addr)
245
246 assertBadAddressPart("3ffe::1.net", "Expected 4 octets in '1.net'")
247 assertBadAddressPart("3ffe::127.0.1",
248 "Expected 4 octets in '127.0.1'")
249 assertBadAddressPart("::1.2.3",
250 "Expected 4 octets in '1.2.3'")
251 assertBadAddressPart("::1.2.3.4.5",
252 "Expected 4 octets in '1.2.3.4.5'")
253 assertBadAddressPart("3ffe::1.1.1.net",
254 "Only decimal digits permitted in 'net' "
255 "in '1.1.1.net'")
256
257 def test_invalid_characters(self):
258 def assertBadPart(addr, part):
259 msg = "Only hex digits permitted in %r in %r" % (part, addr)
260 with self.assertAddressError(re.escape(msg)):
261 ipaddress.IPv6Address(addr)
262
263 assertBadPart("3ffe::goog", "goog")
264 assertBadPart("3ffe::-0", "-0")
265 assertBadPart("3ffe::+0", "+0")
266 assertBadPart("3ffe::-1", "-1")
267 assertBadPart("1.2.3.4::", "1.2.3.4")
268 assertBadPart('1234:axy::b', "axy")
269
270 def test_part_length(self):
271 def assertBadPart(addr, part):
272 msg = "At most 4 characters permitted in %r in %r"
273 with self.assertAddressError(msg, part, addr):
274 ipaddress.IPv6Address(addr)
275
276 assertBadPart("3ffe::10000", "10000")
277 assertBadPart("02001:db8::", "02001")
278 assertBadPart('2001:888888::1', "888888")
279
280 def test_bad_packed_length(self):
281 def assertBadLength(length):
282 addr = b'\x00' * length
283 msg = "Packed address %r must be exactly 16 bytes" % addr
284 with self.assertAddressError(re.escape(msg)):
285 ipaddress.IPv6Address(addr)
286
287 assertBadLength(15)
288 assertBadLength(17)
289
290
291class NetmaskErrorsMixin_v4:
292 """Input validation on interfaces and networks is very similar"""
293
294 @property
295 def factory(self):
296 raise NotImplementedError
297
298 def test_split_netmask(self):
299 addr = "1.2.3.4/32/24"
300 with self.assertAddressError("Only one '/' permitted in %r" % addr):
301 self.factory(addr)
302
303 def test_address_errors(self):
304 def assertBadAddress(addr, details):
305 with self.assertAddressError(details):
306 self.factory(addr)
307
308 assertBadAddress("", "Address cannot be empty")
309 assertBadAddress("bogus", "Expected 4 octets")
310 assertBadAddress("google.com", "Expected 4 octets")
311 assertBadAddress("10/8", "Expected 4 octets")
312 assertBadAddress("::1.2.3.4", "Only decimal digits")
Nick Coghlanb582ecc2012-07-07 22:15:22 +1000313 assertBadAddress("1.2.3.256", re.escape("256 (> 255)"))
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000314
315 def test_netmask_errors(self):
316 def assertBadNetmask(addr, netmask):
317 msg = "%r is not a valid netmask"
318 with self.assertNetmaskError(msg % netmask):
319 self.factory("%s/%s" % (addr, netmask))
320
321 assertBadNetmask("1.2.3.4", "")
322 assertBadNetmask("1.2.3.4", "33")
323 assertBadNetmask("1.2.3.4", "254.254.255.256")
324 assertBadNetmask("1.1.1.1", "240.255.0.0")
325 assertBadNetmask("1.1.1.1", "1.a.2.3")
326 assertBadNetmask("1.1.1.1", "pudding")
327
328 def test_bad_packed_length(self):
329 def assertBadLength(length):
330 addr = b'\x00' * length
331 msg = "Packed address %r must be exactly 4 bytes" % addr
332 with self.assertAddressError(re.escape(msg)):
333 self.factory(addr)
334
335 assertBadLength(3)
336 assertBadLength(5)
337
338
339class InterfaceErrors_v4(ErrorReporting, NetmaskErrorsMixin_v4):
340 factory = ipaddress.IPv4Interface
341
342class NetworkErrors_v4(ErrorReporting, NetmaskErrorsMixin_v4):
343 factory = ipaddress.IPv4Network
344
345
346class NetmaskErrorsMixin_v6:
347 """Input validation on interfaces and networks is very similar"""
348
349 @property
350 def factory(self):
351 raise NotImplementedError
352
353 def test_split_netmask(self):
354 addr = "cafe:cafe::/128/190"
355 with self.assertAddressError("Only one '/' permitted in %r" % addr):
356 self.factory(addr)
357
358 def test_address_errors(self):
359 def assertBadAddress(addr, details):
360 with self.assertAddressError(details):
361 self.factory(addr)
362
363 assertBadAddress("", "Address cannot be empty")
364 assertBadAddress("google.com", "At least 3 parts")
365 assertBadAddress("1.2.3.4", "At least 3 parts")
366 assertBadAddress("10/8", "At least 3 parts")
367 assertBadAddress("1234:axy::b", "Only hex digits")
368
369 def test_netmask_errors(self):
370 def assertBadNetmask(addr, netmask):
371 msg = "%r is not a valid netmask"
372 with self.assertNetmaskError(msg % netmask):
373 self.factory("%s/%s" % (addr, netmask))
374
375 assertBadNetmask("::1", "")
376 assertBadNetmask("::1", "::1")
377 assertBadNetmask("::1", "1::")
378 assertBadNetmask("::1", "129")
379 assertBadNetmask("::1", "pudding")
380
381 def test_bad_packed_length(self):
382 def assertBadLength(length):
383 addr = b'\x00' * length
384 msg = "Packed address %r must be exactly 16 bytes" % addr
385 with self.assertAddressError(re.escape(msg)):
386 self.factory(addr)
387
388 assertBadLength(15)
389 assertBadLength(17)
390
391
392class InterfaceErrors_v6(ErrorReporting, NetmaskErrorsMixin_v6):
393 factory = ipaddress.IPv6Interface
394
395class NetworkErrors_v6(ErrorReporting, NetmaskErrorsMixin_v6):
396 factory = ipaddress.IPv6Network
397
398
399class FactoryFunctionErrors(ErrorReporting):
400
401 def assertFactoryError(self, factory, kind):
402 """Ensure a clean ValueError with the expected message"""
403 addr = "camelot"
404 msg = '%r does not appear to be an IPv4 or IPv6 %s'
405 with self.assertCleanError(ValueError, msg, addr, kind):
406 factory(addr)
407
408 def test_ip_address(self):
409 self.assertFactoryError(ipaddress.ip_address, "address")
410
411 def test_ip_interface(self):
412 self.assertFactoryError(ipaddress.ip_interface, "interface")
413
414 def test_ip_network(self):
415 self.assertFactoryError(ipaddress.ip_network, "network")
416
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200417
Nick Coghlandc9b2552012-05-20 21:01:57 +1000418class IpaddrUnitTest(unittest.TestCase):
419
420 def setUp(self):
421 self.ipv4_address = ipaddress.IPv4Address('1.2.3.4')
422 self.ipv4_interface = ipaddress.IPv4Interface('1.2.3.4/24')
423 self.ipv4_network = ipaddress.IPv4Network('1.2.3.0/24')
424 #self.ipv4_hostmask = ipaddress.IPv4Interface('10.0.0.1/0.255.255.255')
425 self.ipv6_address = ipaddress.IPv6Interface(
426 '2001:658:22a:cafe:200:0:0:1')
427 self.ipv6_interface = ipaddress.IPv6Interface(
428 '2001:658:22a:cafe:200:0:0:1/64')
429 self.ipv6_network = ipaddress.IPv6Network('2001:658:22a:cafe::/64')
430
431 def testRepr(self):
432 self.assertEqual("IPv4Interface('1.2.3.4/32')",
433 repr(ipaddress.IPv4Interface('1.2.3.4')))
434 self.assertEqual("IPv6Interface('::1/128')",
435 repr(ipaddress.IPv6Interface('::1')))
436
437 # issue57
438 def testAddressIntMath(self):
439 self.assertEqual(ipaddress.IPv4Address('1.1.1.1') + 255,
440 ipaddress.IPv4Address('1.1.2.0'))
441 self.assertEqual(ipaddress.IPv4Address('1.1.1.1') - 256,
442 ipaddress.IPv4Address('1.1.0.1'))
443 self.assertEqual(ipaddress.IPv6Address('::1') + (2**16 - 2),
444 ipaddress.IPv6Address('::ffff'))
445 self.assertEqual(ipaddress.IPv6Address('::ffff') - (2**16 - 2),
446 ipaddress.IPv6Address('::1'))
447
Nick Coghlan3c2570c2012-07-07 01:13:55 +1000448 def testInvalidIntToBytes(self):
449 self.assertRaises(ValueError, ipaddress.v4_int_to_packed, -1)
450 self.assertRaises(ValueError, ipaddress.v4_int_to_packed,
451 2 ** ipaddress.IPV4LENGTH)
452 self.assertRaises(ValueError, ipaddress.v6_int_to_packed, -1)
453 self.assertRaises(ValueError, ipaddress.v6_int_to_packed,
454 2 ** ipaddress.IPV6LENGTH)
455
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200456 def testInternals(self):
457 first, last = ipaddress._find_address_range([
458 ipaddress.IPv4Address('10.10.10.10'),
459 ipaddress.IPv4Address('10.10.10.12')])
460 self.assertEqual(first, last)
461 self.assertEqual(0, ipaddress._get_prefix_length(2**32, 0, 32))
462 self.assertEqual(128, ipaddress._count_righthand_zero_bits(0, 128))
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200463 self.assertEqual("IPv4Network('1.2.3.0/24')", repr(self.ipv4_network))
464 self.assertEqual('0x1020318', hex(self.ipv4_network))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000465
Nick Coghland9722652012-06-17 16:33:00 +1000466 def testMissingAddressVersion(self):
467 class Broken(ipaddress._BaseAddress):
468 pass
469 broken = Broken('127.0.0.1')
470 with self.assertRaisesRegex(NotImplementedError, "Broken.*version"):
471 broken.version
472
473 def testMissingNetworkVersion(self):
474 class Broken(ipaddress._BaseNetwork):
475 pass
476 broken = Broken('127.0.0.1')
477 with self.assertRaisesRegex(NotImplementedError, "Broken.*version"):
478 broken.version
479
480 def testMissingAddressClass(self):
481 class Broken(ipaddress._BaseNetwork):
482 pass
483 broken = Broken('127.0.0.1')
484 with self.assertRaisesRegex(NotImplementedError, "Broken.*address"):
485 broken._address_class
486
Nick Coghlandc9b2552012-05-20 21:01:57 +1000487 def testGetNetwork(self):
488 self.assertEqual(int(self.ipv4_network.network_address), 16909056)
489 self.assertEqual(str(self.ipv4_network.network_address), '1.2.3.0')
490
491 self.assertEqual(int(self.ipv6_network.network_address),
492 42540616829182469433403647294022090752)
493 self.assertEqual(str(self.ipv6_network.network_address),
494 '2001:658:22a:cafe::')
495 self.assertEqual(str(self.ipv6_network.hostmask),
496 '::ffff:ffff:ffff:ffff')
497
Nick Coghlan9a9c28c2012-07-07 23:05:59 +1000498 def testEqualityChecks(self):
499 # __eq__ should never raise TypeError directly
500 other = object()
501 def assertEqualityNotImplemented(instance):
502 self.assertEqual(instance.__eq__(other), NotImplemented)
503 self.assertEqual(instance.__ne__(other), NotImplemented)
504 self.assertFalse(instance == other)
505 self.assertTrue(instance != other)
506
507 assertEqualityNotImplemented(self.ipv4_address)
508 assertEqualityNotImplemented(self.ipv4_network)
509 assertEqualityNotImplemented(self.ipv4_interface)
510 assertEqualityNotImplemented(self.ipv6_address)
511 assertEqualityNotImplemented(self.ipv6_network)
512 assertEqualityNotImplemented(self.ipv6_interface)
513
Nick Coghlandc9b2552012-05-20 21:01:57 +1000514 def testBadVersionComparison(self):
515 # These should always raise TypeError
516 v4addr = ipaddress.ip_address('1.1.1.1')
517 v4net = ipaddress.ip_network('1.1.1.1')
518 v6addr = ipaddress.ip_address('::1')
519 v6net = ipaddress.ip_address('::1')
520
521 self.assertRaises(TypeError, v4addr.__lt__, v6addr)
522 self.assertRaises(TypeError, v4addr.__gt__, v6addr)
523 self.assertRaises(TypeError, v4net.__lt__, v6net)
524 self.assertRaises(TypeError, v4net.__gt__, v6net)
525
526 self.assertRaises(TypeError, v6addr.__lt__, v4addr)
527 self.assertRaises(TypeError, v6addr.__gt__, v4addr)
528 self.assertRaises(TypeError, v6net.__lt__, v4net)
529 self.assertRaises(TypeError, v6net.__gt__, v4net)
530
531 def testMixedTypeComparison(self):
532 v4addr = ipaddress.ip_address('1.1.1.1')
533 v4net = ipaddress.ip_network('1.1.1.1/32')
534 v6addr = ipaddress.ip_address('::1')
535 v6net = ipaddress.ip_network('::1/128')
536
537 self.assertFalse(v4net.__contains__(v6net))
538 self.assertFalse(v6net.__contains__(v4net))
539
540 self.assertRaises(TypeError, lambda: v4addr < v4net)
541 self.assertRaises(TypeError, lambda: v4addr > v4net)
542 self.assertRaises(TypeError, lambda: v4net < v4addr)
543 self.assertRaises(TypeError, lambda: v4net > v4addr)
544
545 self.assertRaises(TypeError, lambda: v6addr < v6net)
546 self.assertRaises(TypeError, lambda: v6addr > v6net)
547 self.assertRaises(TypeError, lambda: v6net < v6addr)
548 self.assertRaises(TypeError, lambda: v6net > v6addr)
549
550 # with get_mixed_type_key, you can sort addresses and network.
551 self.assertEqual([v4addr, v4net],
552 sorted([v4net, v4addr],
553 key=ipaddress.get_mixed_type_key))
554 self.assertEqual([v6addr, v6net],
555 sorted([v6net, v6addr],
556 key=ipaddress.get_mixed_type_key))
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200557 self.assertEqual(NotImplemented, ipaddress.get_mixed_type_key(object))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000558
559 def testIpFromInt(self):
560 self.assertEqual(self.ipv4_interface._ip,
561 ipaddress.IPv4Interface(16909060)._ip)
562 self.assertRaises(ipaddress.AddressValueError,
563 ipaddress.IPv4Interface, 2**32)
564 self.assertRaises(ipaddress.AddressValueError,
565 ipaddress.IPv4Interface, -1)
566
567 ipv4 = ipaddress.ip_network('1.2.3.4')
568 ipv6 = ipaddress.ip_network('2001:658:22a:cafe:200:0:0:1')
569 self.assertEqual(ipv4, ipaddress.ip_network(int(ipv4)))
570 self.assertEqual(ipv6, ipaddress.ip_network(int(ipv6)))
571
572 v6_int = 42540616829182469433547762482097946625
573 self.assertEqual(self.ipv6_interface._ip,
574 ipaddress.IPv6Interface(v6_int)._ip)
575 self.assertRaises(ipaddress.AddressValueError,
576 ipaddress.IPv6Interface, 2**128)
577 self.assertRaises(ipaddress.AddressValueError,
578 ipaddress.IPv6Interface, -1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200579 self.assertRaises(ipaddress.AddressValueError,
580 ipaddress.IPv6Network, 2**128)
581 self.assertRaises(ipaddress.AddressValueError,
582 ipaddress.IPv6Network, -1)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000583
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200584 self.assertEqual(ipaddress.ip_network(self.ipv4_address._ip).version,
585 4)
586 self.assertEqual(ipaddress.ip_network(self.ipv6_address._ip).version,
587 6)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000588
589 def testIpFromPacked(self):
Nick Coghlan5cf896f2012-07-07 01:43:31 +1000590 address = ipaddress.ip_address
Nick Coghlandc9b2552012-05-20 21:01:57 +1000591 self.assertEqual(self.ipv4_interface._ip,
Nick Coghlan5cf896f2012-07-07 01:43:31 +1000592 ipaddress.ip_interface(b'\x01\x02\x03\x04')._ip)
593 self.assertEqual(address('255.254.253.252'),
594 address(b'\xff\xfe\xfd\xfc'))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000595 self.assertEqual(self.ipv6_interface.ip,
596 ipaddress.ip_interface(
Nick Coghlan5cf896f2012-07-07 01:43:31 +1000597 b'\x20\x01\x06\x58\x02\x2a\xca\xfe'
598 b'\x02\x00\x00\x00\x00\x00\x00\x01').ip)
599 self.assertEqual(address('ffff:2:3:4:ffff::'),
600 address(b'\xff\xff\x00\x02\x00\x03\x00\x04' +
601 b'\xff\xff' + b'\x00' * 6))
602 self.assertEqual(address('::'),
603 address(b'\x00' * 16))
604
Nick Coghlandc9b2552012-05-20 21:01:57 +1000605 def testGetIp(self):
606 self.assertEqual(int(self.ipv4_interface.ip), 16909060)
607 self.assertEqual(str(self.ipv4_interface.ip), '1.2.3.4')
608
609 self.assertEqual(int(self.ipv6_interface.ip),
610 42540616829182469433547762482097946625)
611 self.assertEqual(str(self.ipv6_interface.ip),
612 '2001:658:22a:cafe:200::1')
613
614 def testGetNetmask(self):
615 self.assertEqual(int(self.ipv4_network.netmask), 4294967040)
616 self.assertEqual(str(self.ipv4_network.netmask), '255.255.255.0')
617 self.assertEqual(int(self.ipv6_network.netmask),
618 340282366920938463444927863358058659840)
619 self.assertEqual(self.ipv6_network.prefixlen, 64)
620
621 def testZeroNetmask(self):
622 ipv4_zero_netmask = ipaddress.IPv4Interface('1.2.3.4/0')
623 self.assertEqual(int(ipv4_zero_netmask.network.netmask), 0)
624 self.assertTrue(ipv4_zero_netmask.network._is_valid_netmask(
625 str(0)))
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200626 self.assertTrue(ipv4_zero_netmask._is_valid_netmask('0'))
627 self.assertTrue(ipv4_zero_netmask._is_valid_netmask('0.0.0.0'))
628 self.assertFalse(ipv4_zero_netmask._is_valid_netmask('invalid'))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000629
630 ipv6_zero_netmask = ipaddress.IPv6Interface('::1/0')
631 self.assertEqual(int(ipv6_zero_netmask.network.netmask), 0)
632 self.assertTrue(ipv6_zero_netmask.network._is_valid_netmask(
633 str(0)))
634
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200635 def testIPv4NetAndHostmasks(self):
636 net = self.ipv4_network
637 self.assertFalse(net._is_valid_netmask('invalid'))
638 self.assertTrue(net._is_valid_netmask('128.128.128.128'))
639 self.assertFalse(net._is_valid_netmask('128.128.128.127'))
640 self.assertFalse(net._is_valid_netmask('128.128.128.255'))
641 self.assertTrue(net._is_valid_netmask('255.128.128.128'))
642
643 self.assertFalse(net._is_hostmask('invalid'))
644 self.assertTrue(net._is_hostmask('128.255.255.255'))
645 self.assertFalse(net._is_hostmask('255.255.255.255'))
646 self.assertFalse(net._is_hostmask('1.2.3.4'))
647
648 net = ipaddress.IPv4Network('127.0.0.0/0.0.0.255')
649 self.assertEqual(24, net.prefixlen)
650
Nick Coghlandc9b2552012-05-20 21:01:57 +1000651 def testGetBroadcast(self):
652 self.assertEqual(int(self.ipv4_network.broadcast_address), 16909311)
653 self.assertEqual(str(self.ipv4_network.broadcast_address), '1.2.3.255')
654
655 self.assertEqual(int(self.ipv6_network.broadcast_address),
656 42540616829182469451850391367731642367)
657 self.assertEqual(str(self.ipv6_network.broadcast_address),
658 '2001:658:22a:cafe:ffff:ffff:ffff:ffff')
659
660 def testGetPrefixlen(self):
661 self.assertEqual(self.ipv4_interface.prefixlen, 24)
662 self.assertEqual(self.ipv6_interface.prefixlen, 64)
663
664 def testGetSupernet(self):
665 self.assertEqual(self.ipv4_network.supernet().prefixlen, 23)
666 self.assertEqual(str(self.ipv4_network.supernet().network_address),
667 '1.2.2.0')
668 self.assertEqual(
669 ipaddress.IPv4Interface('0.0.0.0/0').network.supernet(),
670 ipaddress.IPv4Network('0.0.0.0/0'))
671
672 self.assertEqual(self.ipv6_network.supernet().prefixlen, 63)
673 self.assertEqual(str(self.ipv6_network.supernet().network_address),
674 '2001:658:22a:cafe::')
675 self.assertEqual(ipaddress.IPv6Interface('::0/0').network.supernet(),
676 ipaddress.IPv6Network('::0/0'))
677
678 def testGetSupernet3(self):
679 self.assertEqual(self.ipv4_network.supernet(3).prefixlen, 21)
680 self.assertEqual(str(self.ipv4_network.supernet(3).network_address),
681 '1.2.0.0')
682
683 self.assertEqual(self.ipv6_network.supernet(3).prefixlen, 61)
684 self.assertEqual(str(self.ipv6_network.supernet(3).network_address),
685 '2001:658:22a:caf8::')
686
687 def testGetSupernet4(self):
688 self.assertRaises(ValueError, self.ipv4_network.supernet,
689 prefixlen_diff=2, new_prefix=1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200690 self.assertRaises(ValueError, self.ipv4_network.supernet,
691 new_prefix=25)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000692 self.assertEqual(self.ipv4_network.supernet(prefixlen_diff=2),
693 self.ipv4_network.supernet(new_prefix=22))
694
695 self.assertRaises(ValueError, self.ipv6_network.supernet,
696 prefixlen_diff=2, new_prefix=1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200697 self.assertRaises(ValueError, self.ipv6_network.supernet,
698 new_prefix=65)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000699 self.assertEqual(self.ipv6_network.supernet(prefixlen_diff=2),
700 self.ipv6_network.supernet(new_prefix=62))
701
702 def testHosts(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200703 hosts = list(self.ipv4_network.hosts())
704 self.assertEqual(254, len(hosts))
705 self.assertEqual(ipaddress.IPv4Address('1.2.3.1'), hosts[0])
706 self.assertEqual(ipaddress.IPv4Address('1.2.3.254'), hosts[-1])
707
708 # special case where only 1 bit is left for address
Nick Coghlandc9b2552012-05-20 21:01:57 +1000709 self.assertEqual([ipaddress.IPv4Address('2.0.0.0'),
710 ipaddress.IPv4Address('2.0.0.1')],
711 list(ipaddress.ip_network('2.0.0.0/31').hosts()))
712
713 def testFancySubnetting(self):
714 self.assertEqual(sorted(self.ipv4_network.subnets(prefixlen_diff=3)),
715 sorted(self.ipv4_network.subnets(new_prefix=27)))
716 self.assertRaises(ValueError, list,
717 self.ipv4_network.subnets(new_prefix=23))
718 self.assertRaises(ValueError, list,
719 self.ipv4_network.subnets(prefixlen_diff=3,
720 new_prefix=27))
721 self.assertEqual(sorted(self.ipv6_network.subnets(prefixlen_diff=4)),
722 sorted(self.ipv6_network.subnets(new_prefix=68)))
723 self.assertRaises(ValueError, list,
724 self.ipv6_network.subnets(new_prefix=63))
725 self.assertRaises(ValueError, list,
726 self.ipv6_network.subnets(prefixlen_diff=4,
727 new_prefix=68))
728
729 def testGetSubnets(self):
730 self.assertEqual(list(self.ipv4_network.subnets())[0].prefixlen, 25)
731 self.assertEqual(str(list(
732 self.ipv4_network.subnets())[0].network_address),
733 '1.2.3.0')
734 self.assertEqual(str(list(
735 self.ipv4_network.subnets())[1].network_address),
736 '1.2.3.128')
737
738 self.assertEqual(list(self.ipv6_network.subnets())[0].prefixlen, 65)
739
740 def testGetSubnetForSingle32(self):
741 ip = ipaddress.IPv4Network('1.2.3.4/32')
742 subnets1 = [str(x) for x in ip.subnets()]
743 subnets2 = [str(x) for x in ip.subnets(2)]
744 self.assertEqual(subnets1, ['1.2.3.4/32'])
745 self.assertEqual(subnets1, subnets2)
746
747 def testGetSubnetForSingle128(self):
748 ip = ipaddress.IPv6Network('::1/128')
749 subnets1 = [str(x) for x in ip.subnets()]
750 subnets2 = [str(x) for x in ip.subnets(2)]
751 self.assertEqual(subnets1, ['::1/128'])
752 self.assertEqual(subnets1, subnets2)
753
754 def testSubnet2(self):
755 ips = [str(x) for x in self.ipv4_network.subnets(2)]
756 self.assertEqual(
757 ips,
758 ['1.2.3.0/26', '1.2.3.64/26', '1.2.3.128/26', '1.2.3.192/26'])
759
760 ipsv6 = [str(x) for x in self.ipv6_network.subnets(2)]
761 self.assertEqual(
762 ipsv6,
763 ['2001:658:22a:cafe::/66',
764 '2001:658:22a:cafe:4000::/66',
765 '2001:658:22a:cafe:8000::/66',
766 '2001:658:22a:cafe:c000::/66'])
767
768 def testSubnetFailsForLargeCidrDiff(self):
769 self.assertRaises(ValueError, list,
770 self.ipv4_interface.network.subnets(9))
771 self.assertRaises(ValueError, list,
772 self.ipv4_network.subnets(9))
773 self.assertRaises(ValueError, list,
774 self.ipv6_interface.network.subnets(65))
775 self.assertRaises(ValueError, list,
776 self.ipv6_network.subnets(65))
777
778 def testSupernetFailsForLargeCidrDiff(self):
779 self.assertRaises(ValueError,
780 self.ipv4_interface.network.supernet, 25)
781 self.assertRaises(ValueError,
782 self.ipv6_interface.network.supernet, 65)
783
784 def testSubnetFailsForNegativeCidrDiff(self):
785 self.assertRaises(ValueError, list,
786 self.ipv4_interface.network.subnets(-1))
787 self.assertRaises(ValueError, list,
Nick Coghlan2c589102012-05-27 01:03:25 +1000788 self.ipv4_network.subnets(-1))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000789 self.assertRaises(ValueError, list,
790 self.ipv6_interface.network.subnets(-1))
791 self.assertRaises(ValueError, list,
792 self.ipv6_network.subnets(-1))
793
794 def testGetNum_Addresses(self):
795 self.assertEqual(self.ipv4_network.num_addresses, 256)
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200796 self.assertEqual(list(self.ipv4_network.subnets())[0].num_addresses,
797 128)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000798 self.assertEqual(self.ipv4_network.supernet().num_addresses, 512)
799
800 self.assertEqual(self.ipv6_network.num_addresses, 18446744073709551616)
801 self.assertEqual(list(self.ipv6_network.subnets())[0].num_addresses,
802 9223372036854775808)
803 self.assertEqual(self.ipv6_network.supernet().num_addresses,
804 36893488147419103232)
805
806 def testContains(self):
807 self.assertTrue(ipaddress.IPv4Interface('1.2.3.128/25') in
808 self.ipv4_network)
809 self.assertFalse(ipaddress.IPv4Interface('1.2.4.1/24') in
810 self.ipv4_network)
811 # We can test addresses and string as well.
812 addr1 = ipaddress.IPv4Address('1.2.3.37')
813 self.assertTrue(addr1 in self.ipv4_network)
814 # issue 61, bad network comparison on like-ip'd network objects
815 # with identical broadcast addresses.
816 self.assertFalse(ipaddress.IPv4Network('1.1.0.0/16').__contains__(
817 ipaddress.IPv4Network('1.0.0.0/15')))
818
Nick Coghlandc9b2552012-05-20 21:01:57 +1000819 def testNth(self):
820 self.assertEqual(str(self.ipv4_network[5]), '1.2.3.5')
821 self.assertRaises(IndexError, self.ipv4_network.__getitem__, 256)
822
823 self.assertEqual(str(self.ipv6_network[5]),
824 '2001:658:22a:cafe::5')
825
826 def testGetitem(self):
827 # http://code.google.com/p/ipaddr-py/issues/detail?id=15
828 addr = ipaddress.IPv4Network('172.31.255.128/255.255.255.240')
829 self.assertEqual(28, addr.prefixlen)
830 addr_list = list(addr)
831 self.assertEqual('172.31.255.128', str(addr_list[0]))
832 self.assertEqual('172.31.255.128', str(addr[0]))
833 self.assertEqual('172.31.255.143', str(addr_list[-1]))
834 self.assertEqual('172.31.255.143', str(addr[-1]))
835 self.assertEqual(addr_list[-1], addr[-1])
836
837 def testEqual(self):
838 self.assertTrue(self.ipv4_interface ==
839 ipaddress.IPv4Interface('1.2.3.4/24'))
840 self.assertFalse(self.ipv4_interface ==
841 ipaddress.IPv4Interface('1.2.3.4/23'))
842 self.assertFalse(self.ipv4_interface ==
843 ipaddress.IPv6Interface('::1.2.3.4/24'))
844 self.assertFalse(self.ipv4_interface == '')
845 self.assertFalse(self.ipv4_interface == [])
846 self.assertFalse(self.ipv4_interface == 2)
847
848 self.assertTrue(self.ipv6_interface ==
849 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/64'))
850 self.assertFalse(self.ipv6_interface ==
851 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/63'))
852 self.assertFalse(self.ipv6_interface ==
853 ipaddress.IPv4Interface('1.2.3.4/23'))
854 self.assertFalse(self.ipv6_interface == '')
855 self.assertFalse(self.ipv6_interface == [])
856 self.assertFalse(self.ipv6_interface == 2)
857
858 def testNotEqual(self):
859 self.assertFalse(self.ipv4_interface !=
860 ipaddress.IPv4Interface('1.2.3.4/24'))
861 self.assertTrue(self.ipv4_interface !=
862 ipaddress.IPv4Interface('1.2.3.4/23'))
863 self.assertTrue(self.ipv4_interface !=
864 ipaddress.IPv6Interface('::1.2.3.4/24'))
865 self.assertTrue(self.ipv4_interface != '')
866 self.assertTrue(self.ipv4_interface != [])
867 self.assertTrue(self.ipv4_interface != 2)
868
869 self.assertTrue(self.ipv4_address !=
870 ipaddress.IPv4Address('1.2.3.5'))
871 self.assertTrue(self.ipv4_address != '')
872 self.assertTrue(self.ipv4_address != [])
873 self.assertTrue(self.ipv4_address != 2)
874
875 self.assertFalse(self.ipv6_interface !=
876 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/64'))
877 self.assertTrue(self.ipv6_interface !=
878 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/63'))
879 self.assertTrue(self.ipv6_interface !=
880 ipaddress.IPv4Interface('1.2.3.4/23'))
881 self.assertTrue(self.ipv6_interface != '')
882 self.assertTrue(self.ipv6_interface != [])
883 self.assertTrue(self.ipv6_interface != 2)
884
885 self.assertTrue(self.ipv6_address !=
886 ipaddress.IPv4Address('1.2.3.4'))
887 self.assertTrue(self.ipv6_address != '')
888 self.assertTrue(self.ipv6_address != [])
889 self.assertTrue(self.ipv6_address != 2)
890
891 def testSlash32Constructor(self):
892 self.assertEqual(str(ipaddress.IPv4Interface(
893 '1.2.3.4/255.255.255.255')), '1.2.3.4/32')
894
895 def testSlash128Constructor(self):
896 self.assertEqual(str(ipaddress.IPv6Interface('::1/128')),
897 '::1/128')
898
899 def testSlash0Constructor(self):
900 self.assertEqual(str(ipaddress.IPv4Interface('1.2.3.4/0.0.0.0')),
901 '1.2.3.4/0')
902
903 def testCollapsing(self):
904 # test only IP addresses including some duplicates
905 ip1 = ipaddress.IPv4Address('1.1.1.0')
906 ip2 = ipaddress.IPv4Address('1.1.1.1')
907 ip3 = ipaddress.IPv4Address('1.1.1.2')
908 ip4 = ipaddress.IPv4Address('1.1.1.3')
909 ip5 = ipaddress.IPv4Address('1.1.1.4')
910 ip6 = ipaddress.IPv4Address('1.1.1.0')
911 # check that addreses are subsumed properly.
912 collapsed = ipaddress.collapse_addresses(
913 [ip1, ip2, ip3, ip4, ip5, ip6])
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200914 self.assertEqual(list(collapsed),
915 [ipaddress.IPv4Network('1.1.1.0/30'),
916 ipaddress.IPv4Network('1.1.1.4/32')])
Nick Coghlandc9b2552012-05-20 21:01:57 +1000917
918 # test a mix of IP addresses and networks including some duplicates
919 ip1 = ipaddress.IPv4Address('1.1.1.0')
920 ip2 = ipaddress.IPv4Address('1.1.1.1')
921 ip3 = ipaddress.IPv4Address('1.1.1.2')
922 ip4 = ipaddress.IPv4Address('1.1.1.3')
923 #ip5 = ipaddress.IPv4Interface('1.1.1.4/30')
924 #ip6 = ipaddress.IPv4Interface('1.1.1.4/30')
925 # check that addreses are subsumed properly.
926 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3, ip4])
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200927 self.assertEqual(list(collapsed),
928 [ipaddress.IPv4Network('1.1.1.0/30')])
Nick Coghlandc9b2552012-05-20 21:01:57 +1000929
930 # test only IP networks
931 ip1 = ipaddress.IPv4Network('1.1.0.0/24')
932 ip2 = ipaddress.IPv4Network('1.1.1.0/24')
933 ip3 = ipaddress.IPv4Network('1.1.2.0/24')
934 ip4 = ipaddress.IPv4Network('1.1.3.0/24')
935 ip5 = ipaddress.IPv4Network('1.1.4.0/24')
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200936 # stored in no particular order b/c we want CollapseAddr to call
937 # [].sort
Nick Coghlandc9b2552012-05-20 21:01:57 +1000938 ip6 = ipaddress.IPv4Network('1.1.0.0/22')
939 # check that addreses are subsumed properly.
940 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3, ip4, ip5,
941 ip6])
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200942 self.assertEqual(list(collapsed),
943 [ipaddress.IPv4Network('1.1.0.0/22'),
944 ipaddress.IPv4Network('1.1.4.0/24')])
Nick Coghlandc9b2552012-05-20 21:01:57 +1000945
946 # test that two addresses are supernet'ed properly
947 collapsed = ipaddress.collapse_addresses([ip1, ip2])
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200948 self.assertEqual(list(collapsed),
949 [ipaddress.IPv4Network('1.1.0.0/23')])
Nick Coghlandc9b2552012-05-20 21:01:57 +1000950
951 # test same IP networks
952 ip_same1 = ip_same2 = ipaddress.IPv4Network('1.1.1.1/32')
953 self.assertEqual(list(ipaddress.collapse_addresses(
954 [ip_same1, ip_same2])),
955 [ip_same1])
956
957 # test same IP addresses
958 ip_same1 = ip_same2 = ipaddress.IPv4Address('1.1.1.1')
959 self.assertEqual(list(ipaddress.collapse_addresses(
960 [ip_same1, ip_same2])),
961 [ipaddress.ip_network('1.1.1.1/32')])
962 ip1 = ipaddress.IPv6Network('2001::/100')
963 ip2 = ipaddress.IPv6Network('2001::/120')
964 ip3 = ipaddress.IPv6Network('2001::/96')
965 # test that ipv6 addresses are subsumed properly.
966 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3])
967 self.assertEqual(list(collapsed), [ip3])
968
969 # the toejam test
Hynek Schlawack35db5132012-06-01 20:12:17 +0200970 addr_tuples = [
971 (ipaddress.ip_address('1.1.1.1'),
972 ipaddress.ip_address('::1')),
973 (ipaddress.IPv4Network('1.1.0.0/24'),
974 ipaddress.IPv6Network('2001::/120')),
975 (ipaddress.IPv4Network('1.1.0.0/32'),
976 ipaddress.IPv6Network('2001::/128')),
977 ]
978 for ip1, ip2 in addr_tuples:
979 self.assertRaises(TypeError, ipaddress.collapse_addresses,
980 [ip1, ip2])
Nick Coghlandc9b2552012-05-20 21:01:57 +1000981
982 def testSummarizing(self):
983 #ip = ipaddress.ip_address
984 #ipnet = ipaddress.ip_network
985 summarize = ipaddress.summarize_address_range
986 ip1 = ipaddress.ip_address('1.1.1.0')
987 ip2 = ipaddress.ip_address('1.1.1.255')
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200988
989 # summarize works only for IPv4 & IPv6
990 class IPv7Address(ipaddress.IPv6Address):
991 @property
992 def version(self):
993 return 7
994 ip_invalid1 = IPv7Address('::1')
995 ip_invalid2 = IPv7Address('::1')
996 self.assertRaises(ValueError, list,
997 summarize(ip_invalid1, ip_invalid2))
998 # test that a summary over ip4 & ip6 fails
999 self.assertRaises(TypeError, list,
1000 summarize(ip1, ipaddress.IPv6Address('::1')))
1001 # test a /24 is summarized properly
Nick Coghlandc9b2552012-05-20 21:01:57 +10001002 self.assertEqual(list(summarize(ip1, ip2))[0],
1003 ipaddress.ip_network('1.1.1.0/24'))
1004 # test an IPv4 range that isn't on a network byte boundary
1005 ip2 = ipaddress.ip_address('1.1.1.8')
1006 self.assertEqual(list(summarize(ip1, ip2)),
1007 [ipaddress.ip_network('1.1.1.0/29'),
1008 ipaddress.ip_network('1.1.1.8')])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001009 # all!
1010 ip1 = ipaddress.IPv4Address(0)
1011 ip2 = ipaddress.IPv4Address(ipaddress.IPv4Address._ALL_ONES)
1012 self.assertEqual([ipaddress.IPv4Network('0.0.0.0/0')],
1013 list(summarize(ip1, ip2)))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001014
1015 ip1 = ipaddress.ip_address('1::')
1016 ip2 = ipaddress.ip_address('1:ffff:ffff:ffff:ffff:ffff:ffff:ffff')
1017 # test a IPv6 is sumamrized properly
1018 self.assertEqual(list(summarize(ip1, ip2))[0],
1019 ipaddress.ip_network('1::/16'))
1020 # test an IPv6 range that isn't on a network byte boundary
1021 ip2 = ipaddress.ip_address('2::')
1022 self.assertEqual(list(summarize(ip1, ip2)),
1023 [ipaddress.ip_network('1::/16'),
1024 ipaddress.ip_network('2::/128')])
1025
1026 # test exception raised when first is greater than last
1027 self.assertRaises(ValueError, list,
1028 summarize(ipaddress.ip_address('1.1.1.0'),
1029 ipaddress.ip_address('1.1.0.0')))
1030 # test exception raised when first and last aren't IP addresses
1031 self.assertRaises(TypeError, list,
1032 summarize(ipaddress.ip_network('1.1.1.0'),
1033 ipaddress.ip_network('1.1.0.0')))
1034 self.assertRaises(TypeError, list,
1035 summarize(ipaddress.ip_network('1.1.1.0'),
1036 ipaddress.ip_network('1.1.0.0')))
1037 # test exception raised when first and last are not same version
1038 self.assertRaises(TypeError, list,
1039 summarize(ipaddress.ip_address('::'),
1040 ipaddress.ip_network('1.1.0.0')))
1041
1042 def testAddressComparison(self):
1043 self.assertTrue(ipaddress.ip_address('1.1.1.1') <=
1044 ipaddress.ip_address('1.1.1.1'))
1045 self.assertTrue(ipaddress.ip_address('1.1.1.1') <=
1046 ipaddress.ip_address('1.1.1.2'))
1047 self.assertTrue(ipaddress.ip_address('::1') <=
1048 ipaddress.ip_address('::1'))
1049 self.assertTrue(ipaddress.ip_address('::1') <=
1050 ipaddress.ip_address('::2'))
1051
1052 def testNetworkComparison(self):
1053 # ip1 and ip2 have the same network address
1054 ip1 = ipaddress.IPv4Network('1.1.1.0/24')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001055 ip2 = ipaddress.IPv4Network('1.1.1.0/32')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001056 ip3 = ipaddress.IPv4Network('1.1.2.0/24')
1057
1058 self.assertTrue(ip1 < ip3)
1059 self.assertTrue(ip3 > ip2)
1060
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001061 self.assertEqual(ip1.compare_networks(ip1), 0)
1062
1063 # if addresses are the same, sort by netmask
1064 self.assertEqual(ip1.compare_networks(ip2), -1)
1065 self.assertEqual(ip2.compare_networks(ip1), 1)
1066
Nick Coghlandc9b2552012-05-20 21:01:57 +10001067 self.assertEqual(ip1.compare_networks(ip3), -1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001068 self.assertEqual(ip3.compare_networks(ip1), 1)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001069 self.assertTrue(ip1._get_networks_key() < ip3._get_networks_key())
1070
1071 ip1 = ipaddress.IPv6Network('2001:2000::/96')
1072 ip2 = ipaddress.IPv6Network('2001:2001::/96')
1073 ip3 = ipaddress.IPv6Network('2001:ffff:2000::/96')
1074
1075 self.assertTrue(ip1 < ip3)
1076 self.assertTrue(ip3 > ip2)
1077 self.assertEqual(ip1.compare_networks(ip3), -1)
1078 self.assertTrue(ip1._get_networks_key() < ip3._get_networks_key())
1079
1080 # Test comparing different protocols.
1081 # Should always raise a TypeError.
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001082 self.assertRaises(TypeError,
1083 self.ipv4_network.compare_networks,
1084 self.ipv6_network)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001085 ipv6 = ipaddress.IPv6Interface('::/0')
1086 ipv4 = ipaddress.IPv4Interface('0.0.0.0/0')
1087 self.assertRaises(TypeError, ipv4.__lt__, ipv6)
1088 self.assertRaises(TypeError, ipv4.__gt__, ipv6)
1089 self.assertRaises(TypeError, ipv6.__lt__, ipv4)
1090 self.assertRaises(TypeError, ipv6.__gt__, ipv4)
1091
1092 # Regression test for issue 19.
1093 ip1 = ipaddress.ip_network('10.1.2.128/25')
1094 self.assertFalse(ip1 < ip1)
1095 self.assertFalse(ip1 > ip1)
1096 ip2 = ipaddress.ip_network('10.1.3.0/24')
1097 self.assertTrue(ip1 < ip2)
1098 self.assertFalse(ip2 < ip1)
1099 self.assertFalse(ip1 > ip2)
1100 self.assertTrue(ip2 > ip1)
1101 ip3 = ipaddress.ip_network('10.1.3.0/25')
1102 self.assertTrue(ip2 < ip3)
1103 self.assertFalse(ip3 < ip2)
1104 self.assertFalse(ip2 > ip3)
1105 self.assertTrue(ip3 > ip2)
1106
1107 # Regression test for issue 28.
1108 ip1 = ipaddress.ip_network('10.10.10.0/31')
1109 ip2 = ipaddress.ip_network('10.10.10.0')
1110 ip3 = ipaddress.ip_network('10.10.10.2/31')
1111 ip4 = ipaddress.ip_network('10.10.10.2')
1112 sorted = [ip1, ip2, ip3, ip4]
1113 unsorted = [ip2, ip4, ip1, ip3]
1114 unsorted.sort()
1115 self.assertEqual(sorted, unsorted)
1116 unsorted = [ip4, ip1, ip3, ip2]
1117 unsorted.sort()
1118 self.assertEqual(sorted, unsorted)
1119 self.assertRaises(TypeError, ip1.__lt__,
1120 ipaddress.ip_address('10.10.10.0'))
1121 self.assertRaises(TypeError, ip2.__lt__,
1122 ipaddress.ip_address('10.10.10.0'))
1123
1124 # <=, >=
1125 self.assertTrue(ipaddress.ip_network('1.1.1.1') <=
1126 ipaddress.ip_network('1.1.1.1'))
1127 self.assertTrue(ipaddress.ip_network('1.1.1.1') <=
1128 ipaddress.ip_network('1.1.1.2'))
1129 self.assertFalse(ipaddress.ip_network('1.1.1.2') <=
1130 ipaddress.ip_network('1.1.1.1'))
1131 self.assertTrue(ipaddress.ip_network('::1') <=
1132 ipaddress.ip_network('::1'))
1133 self.assertTrue(ipaddress.ip_network('::1') <=
1134 ipaddress.ip_network('::2'))
1135 self.assertFalse(ipaddress.ip_network('::2') <=
1136 ipaddress.ip_network('::1'))
1137
1138 def testStrictNetworks(self):
1139 self.assertRaises(ValueError, ipaddress.ip_network, '192.168.1.1/24')
1140 self.assertRaises(ValueError, ipaddress.ip_network, '::1/120')
1141
1142 def testOverlaps(self):
1143 other = ipaddress.IPv4Network('1.2.3.0/30')
1144 other2 = ipaddress.IPv4Network('1.2.2.0/24')
1145 other3 = ipaddress.IPv4Network('1.2.2.64/26')
1146 self.assertTrue(self.ipv4_network.overlaps(other))
1147 self.assertFalse(self.ipv4_network.overlaps(other2))
1148 self.assertTrue(other2.overlaps(other3))
1149
1150 def testEmbeddedIpv4(self):
1151 ipv4_string = '192.168.0.1'
1152 ipv4 = ipaddress.IPv4Interface(ipv4_string)
1153 v4compat_ipv6 = ipaddress.IPv6Interface('::%s' % ipv4_string)
1154 self.assertEqual(int(v4compat_ipv6.ip), int(ipv4.ip))
1155 v4mapped_ipv6 = ipaddress.IPv6Interface('::ffff:%s' % ipv4_string)
1156 self.assertNotEqual(v4mapped_ipv6.ip, ipv4.ip)
1157 self.assertRaises(ipaddress.AddressValueError, ipaddress.IPv6Interface,
1158 '2001:1.1.1.1:1.1.1.1')
1159
1160 # Issue 67: IPv6 with embedded IPv4 address not recognized.
1161 def testIPv6AddressTooLarge(self):
1162 # RFC4291 2.5.5.2
1163 self.assertEqual(ipaddress.ip_address('::FFFF:192.0.2.1'),
1164 ipaddress.ip_address('::FFFF:c000:201'))
1165 # RFC4291 2.2 (part 3) x::d.d.d.d
1166 self.assertEqual(ipaddress.ip_address('FFFF::192.0.2.1'),
1167 ipaddress.ip_address('FFFF::c000:201'))
1168
1169 def testIPVersion(self):
1170 self.assertEqual(self.ipv4_address.version, 4)
1171 self.assertEqual(self.ipv6_address.version, 6)
1172
1173 def testMaxPrefixLength(self):
1174 self.assertEqual(self.ipv4_interface.max_prefixlen, 32)
1175 self.assertEqual(self.ipv6_interface.max_prefixlen, 128)
1176
1177 def testPacked(self):
1178 self.assertEqual(self.ipv4_address.packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001179 b'\x01\x02\x03\x04')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001180 self.assertEqual(ipaddress.IPv4Interface('255.254.253.252').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001181 b'\xff\xfe\xfd\xfc')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001182 self.assertEqual(self.ipv6_address.packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001183 b'\x20\x01\x06\x58\x02\x2a\xca\xfe'
1184 b'\x02\x00\x00\x00\x00\x00\x00\x01')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001185 self.assertEqual(ipaddress.IPv6Interface('ffff:2:3:4:ffff::').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001186 b'\xff\xff\x00\x02\x00\x03\x00\x04\xff\xff'
1187 + b'\x00' * 6)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001188 self.assertEqual(ipaddress.IPv6Interface('::1:0:0:0:0').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001189 b'\x00' * 6 + b'\x00\x01' + b'\x00' * 8)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001190
1191 def testIpStrFromPrefixlen(self):
1192 ipv4 = ipaddress.IPv4Interface('1.2.3.4/24')
1193 self.assertEqual(ipv4._ip_string_from_prefix(), '255.255.255.0')
1194 self.assertEqual(ipv4._ip_string_from_prefix(28), '255.255.255.240')
1195
1196 def testIpType(self):
1197 ipv4net = ipaddress.ip_network('1.2.3.4')
1198 ipv4addr = ipaddress.ip_address('1.2.3.4')
1199 ipv6net = ipaddress.ip_network('::1.2.3.4')
1200 ipv6addr = ipaddress.ip_address('::1.2.3.4')
1201 self.assertEqual(ipaddress.IPv4Network, type(ipv4net))
1202 self.assertEqual(ipaddress.IPv4Address, type(ipv4addr))
1203 self.assertEqual(ipaddress.IPv6Network, type(ipv6net))
1204 self.assertEqual(ipaddress.IPv6Address, type(ipv6addr))
1205
1206 def testReservedIpv4(self):
1207 # test networks
1208 self.assertEqual(True, ipaddress.ip_interface(
1209 '224.1.1.1/31').is_multicast)
1210 self.assertEqual(False, ipaddress.ip_network('240.0.0.0').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001211 self.assertEqual(True, ipaddress.ip_network('240.0.0.0').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001212
1213 self.assertEqual(True, ipaddress.ip_interface(
1214 '192.168.1.1/17').is_private)
1215 self.assertEqual(False, ipaddress.ip_network('192.169.0.0').is_private)
1216 self.assertEqual(True, ipaddress.ip_network(
1217 '10.255.255.255').is_private)
1218 self.assertEqual(False, ipaddress.ip_network('11.0.0.0').is_private)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001219 self.assertEqual(False, ipaddress.ip_network('11.0.0.0').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001220 self.assertEqual(True, ipaddress.ip_network(
1221 '172.31.255.255').is_private)
1222 self.assertEqual(False, ipaddress.ip_network('172.32.0.0').is_private)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001223 self.assertEqual(True,
1224 ipaddress.ip_network('169.254.1.0/24').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001225
1226 self.assertEqual(True,
1227 ipaddress.ip_interface(
1228 '169.254.100.200/24').is_link_local)
1229 self.assertEqual(False,
1230 ipaddress.ip_interface(
1231 '169.255.100.200/24').is_link_local)
1232
1233 self.assertEqual(True,
1234 ipaddress.ip_network(
1235 '127.100.200.254/32').is_loopback)
1236 self.assertEqual(True, ipaddress.ip_network(
1237 '127.42.0.0/16').is_loopback)
1238 self.assertEqual(False, ipaddress.ip_network('128.0.0.0').is_loopback)
1239
1240 # test addresses
Hynek Schlawackbcd30442012-06-04 14:19:39 +02001241 self.assertEqual(True, ipaddress.ip_address('0.0.0.0').is_unspecified)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001242 self.assertEqual(True, ipaddress.ip_address('224.1.1.1').is_multicast)
1243 self.assertEqual(False, ipaddress.ip_address('240.0.0.0').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001244 self.assertEqual(True, ipaddress.ip_address('240.0.0.1').is_reserved)
1245 self.assertEqual(False,
1246 ipaddress.ip_address('239.255.255.255').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001247
1248 self.assertEqual(True, ipaddress.ip_address('192.168.1.1').is_private)
1249 self.assertEqual(False, ipaddress.ip_address('192.169.0.0').is_private)
1250 self.assertEqual(True, ipaddress.ip_address(
1251 '10.255.255.255').is_private)
1252 self.assertEqual(False, ipaddress.ip_address('11.0.0.0').is_private)
1253 self.assertEqual(True, ipaddress.ip_address(
1254 '172.31.255.255').is_private)
1255 self.assertEqual(False, ipaddress.ip_address('172.32.0.0').is_private)
1256
1257 self.assertEqual(True,
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001258 ipaddress.ip_address('169.254.100.200').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001259 self.assertEqual(False,
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001260 ipaddress.ip_address('169.255.100.200').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001261
1262 self.assertEqual(True,
1263 ipaddress.ip_address('127.100.200.254').is_loopback)
1264 self.assertEqual(True, ipaddress.ip_address('127.42.0.0').is_loopback)
1265 self.assertEqual(False, ipaddress.ip_address('128.0.0.0').is_loopback)
1266 self.assertEqual(True, ipaddress.ip_network('0.0.0.0').is_unspecified)
1267
1268 def testReservedIpv6(self):
1269
1270 self.assertEqual(True, ipaddress.ip_network('ffff::').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001271 self.assertEqual(True, ipaddress.ip_network(2**128 - 1).is_multicast)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001272 self.assertEqual(True, ipaddress.ip_network('ff00::').is_multicast)
1273 self.assertEqual(False, ipaddress.ip_network('fdff::').is_multicast)
1274
1275 self.assertEqual(True, ipaddress.ip_network('fecf::').is_site_local)
1276 self.assertEqual(True, ipaddress.ip_network(
1277 'feff:ffff:ffff:ffff::').is_site_local)
1278 self.assertEqual(False, ipaddress.ip_network(
1279 'fbf:ffff::').is_site_local)
1280 self.assertEqual(False, ipaddress.ip_network('ff00::').is_site_local)
1281
1282 self.assertEqual(True, ipaddress.ip_network('fc00::').is_private)
1283 self.assertEqual(True, ipaddress.ip_network(
1284 'fc00:ffff:ffff:ffff::').is_private)
1285 self.assertEqual(False, ipaddress.ip_network('fbff:ffff::').is_private)
1286 self.assertEqual(False, ipaddress.ip_network('fe00::').is_private)
1287
1288 self.assertEqual(True, ipaddress.ip_network('fea0::').is_link_local)
1289 self.assertEqual(True, ipaddress.ip_network(
1290 'febf:ffff::').is_link_local)
1291 self.assertEqual(False, ipaddress.ip_network(
1292 'fe7f:ffff::').is_link_local)
1293 self.assertEqual(False, ipaddress.ip_network('fec0::').is_link_local)
1294
1295 self.assertEqual(True, ipaddress.ip_interface('0:0::0:01').is_loopback)
1296 self.assertEqual(False, ipaddress.ip_interface('::1/127').is_loopback)
1297 self.assertEqual(False, ipaddress.ip_network('::').is_loopback)
1298 self.assertEqual(False, ipaddress.ip_network('::2').is_loopback)
1299
1300 self.assertEqual(True, ipaddress.ip_network('0::0').is_unspecified)
1301 self.assertEqual(False, ipaddress.ip_network('::1').is_unspecified)
1302 self.assertEqual(False, ipaddress.ip_network('::/127').is_unspecified)
1303
1304 # test addresses
1305 self.assertEqual(True, ipaddress.ip_address('ffff::').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001306 self.assertEqual(True, ipaddress.ip_address(2**128 - 1).is_multicast)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001307 self.assertEqual(True, ipaddress.ip_address('ff00::').is_multicast)
1308 self.assertEqual(False, ipaddress.ip_address('fdff::').is_multicast)
1309
1310 self.assertEqual(True, ipaddress.ip_address('fecf::').is_site_local)
1311 self.assertEqual(True, ipaddress.ip_address(
1312 'feff:ffff:ffff:ffff::').is_site_local)
1313 self.assertEqual(False, ipaddress.ip_address(
1314 'fbf:ffff::').is_site_local)
1315 self.assertEqual(False, ipaddress.ip_address('ff00::').is_site_local)
1316
1317 self.assertEqual(True, ipaddress.ip_address('fc00::').is_private)
1318 self.assertEqual(True, ipaddress.ip_address(
1319 'fc00:ffff:ffff:ffff::').is_private)
1320 self.assertEqual(False, ipaddress.ip_address('fbff:ffff::').is_private)
1321 self.assertEqual(False, ipaddress.ip_address('fe00::').is_private)
1322
1323 self.assertEqual(True, ipaddress.ip_address('fea0::').is_link_local)
1324 self.assertEqual(True, ipaddress.ip_address(
1325 'febf:ffff::').is_link_local)
1326 self.assertEqual(False, ipaddress.ip_address(
1327 'fe7f:ffff::').is_link_local)
1328 self.assertEqual(False, ipaddress.ip_address('fec0::').is_link_local)
1329
1330 self.assertEqual(True, ipaddress.ip_address('0:0::0:01').is_loopback)
1331 self.assertEqual(True, ipaddress.ip_address('::1').is_loopback)
1332 self.assertEqual(False, ipaddress.ip_address('::2').is_loopback)
1333
1334 self.assertEqual(True, ipaddress.ip_address('0::0').is_unspecified)
1335 self.assertEqual(False, ipaddress.ip_address('::1').is_unspecified)
1336
1337 # some generic IETF reserved addresses
1338 self.assertEqual(True, ipaddress.ip_address('100::').is_reserved)
1339 self.assertEqual(True, ipaddress.ip_network('4000::1/128').is_reserved)
1340
1341 def testIpv4Mapped(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001342 self.assertEqual(
1343 ipaddress.ip_address('::ffff:192.168.1.1').ipv4_mapped,
1344 ipaddress.ip_address('192.168.1.1'))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001345 self.assertEqual(ipaddress.ip_address('::c0a8:101').ipv4_mapped, None)
1346 self.assertEqual(ipaddress.ip_address('::ffff:c0a8:101').ipv4_mapped,
1347 ipaddress.ip_address('192.168.1.1'))
1348
1349 def testAddrExclude(self):
1350 addr1 = ipaddress.ip_network('10.1.1.0/24')
1351 addr2 = ipaddress.ip_network('10.1.1.0/26')
1352 addr3 = ipaddress.ip_network('10.2.1.0/24')
1353 addr4 = ipaddress.ip_address('10.1.1.0')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001354 addr5 = ipaddress.ip_network('2001:db8::0/32')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001355 self.assertEqual(sorted(list(addr1.address_exclude(addr2))),
1356 [ipaddress.ip_network('10.1.1.64/26'),
1357 ipaddress.ip_network('10.1.1.128/25')])
1358 self.assertRaises(ValueError, list, addr1.address_exclude(addr3))
1359 self.assertRaises(TypeError, list, addr1.address_exclude(addr4))
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001360 self.assertRaises(TypeError, list, addr1.address_exclude(addr5))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001361 self.assertEqual(list(addr1.address_exclude(addr1)), [])
1362
1363 def testHash(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001364 self.assertEqual(hash(ipaddress.ip_interface('10.1.1.0/24')),
1365 hash(ipaddress.ip_interface('10.1.1.0/24')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001366 self.assertEqual(hash(ipaddress.ip_network('10.1.1.0/24')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001367 hash(ipaddress.ip_network('10.1.1.0/24')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001368 self.assertEqual(hash(ipaddress.ip_address('10.1.1.0')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001369 hash(ipaddress.ip_address('10.1.1.0')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001370 # i70
1371 self.assertEqual(hash(ipaddress.ip_address('1.2.3.4')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001372 hash(ipaddress.ip_address(
Nick Coghlandc9b2552012-05-20 21:01:57 +10001373 int(ipaddress.ip_address('1.2.3.4')._ip))))
1374 ip1 = ipaddress.ip_address('10.1.1.0')
1375 ip2 = ipaddress.ip_address('1::')
1376 dummy = {}
1377 dummy[self.ipv4_address] = None
1378 dummy[self.ipv6_address] = None
1379 dummy[ip1] = None
1380 dummy[ip2] = None
1381 self.assertTrue(self.ipv4_address in dummy)
1382 self.assertTrue(ip2 in dummy)
1383
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001384 def testIPBases(self):
1385 net = self.ipv4_network
1386 self.assertEqual('1.2.3.0/24', net.compressed)
1387 self.assertEqual(
1388 net._ip_int_from_prefix(24),
1389 net._ip_int_from_prefix(None))
1390 net = self.ipv6_network
1391 self.assertRaises(ValueError, net._string_from_ip_int, 2**128 + 1)
1392 self.assertEqual(
1393 self.ipv6_address._string_from_ip_int(self.ipv6_address._ip),
1394 self.ipv6_address._string_from_ip_int(None))
1395
Hynek Schlawack454a74d2012-06-04 18:14:02 +02001396 def testIPv6NetworkHelpers(self):
1397 net = self.ipv6_network
1398 self.assertEqual('2001:658:22a:cafe::/64', net.with_prefixlen)
1399 self.assertEqual('2001:658:22a:cafe::/ffff:ffff:ffff:ffff::',
1400 net.with_netmask)
1401 self.assertEqual('2001:658:22a:cafe::/::ffff:ffff:ffff:ffff',
1402 net.with_hostmask)
1403 self.assertEqual('2001:658:22a:cafe::/64', str(net))
1404
1405 def testIPv4NetworkHelpers(self):
1406 net = self.ipv4_network
1407 self.assertEqual('1.2.3.0/24', net.with_prefixlen)
1408 self.assertEqual('1.2.3.0/255.255.255.0', net.with_netmask)
1409 self.assertEqual('1.2.3.0/0.0.0.255', net.with_hostmask)
1410 self.assertEqual('1.2.3.0/24', str(net))
1411
Nick Coghlandc9b2552012-05-20 21:01:57 +10001412 def testCopyConstructor(self):
1413 addr1 = ipaddress.ip_network('10.1.1.0/24')
1414 addr2 = ipaddress.ip_network(addr1)
1415 addr3 = ipaddress.ip_interface('2001:658:22a:cafe:200::1/64')
1416 addr4 = ipaddress.ip_interface(addr3)
1417 addr5 = ipaddress.IPv4Address('1.1.1.1')
1418 addr6 = ipaddress.IPv6Address('2001:658:22a:cafe:200::1')
1419
1420 self.assertEqual(addr1, addr2)
1421 self.assertEqual(addr3, addr4)
1422 self.assertEqual(addr5, ipaddress.IPv4Address(addr5))
1423 self.assertEqual(addr6, ipaddress.IPv6Address(addr6))
1424
1425 def testCompressIPv6Address(self):
1426 test_addresses = {
1427 '1:2:3:4:5:6:7:8': '1:2:3:4:5:6:7:8/128',
1428 '2001:0:0:4:0:0:0:8': '2001:0:0:4::8/128',
1429 '2001:0:0:4:5:6:7:8': '2001::4:5:6:7:8/128',
1430 '2001:0:3:4:5:6:7:8': '2001:0:3:4:5:6:7:8/128',
1431 '2001:0:3:4:5:6:7:8': '2001:0:3:4:5:6:7:8/128',
1432 '0:0:3:0:0:0:0:ffff': '0:0:3::ffff/128',
1433 '0:0:0:4:0:0:0:ffff': '::4:0:0:0:ffff/128',
1434 '0:0:0:0:5:0:0:ffff': '::5:0:0:ffff/128',
1435 '1:0:0:4:0:0:7:8': '1::4:0:0:7:8/128',
1436 '0:0:0:0:0:0:0:0': '::/128',
1437 '0:0:0:0:0:0:0:0/0': '::/0',
1438 '0:0:0:0:0:0:0:1': '::1/128',
1439 '2001:0658:022a:cafe:0000:0000:0000:0000/66':
1440 '2001:658:22a:cafe::/66',
1441 '::1.2.3.4': '::102:304/128',
1442 '1:2:3:4:5:ffff:1.2.3.4': '1:2:3:4:5:ffff:102:304/128',
1443 '::7:6:5:4:3:2:1': '0:7:6:5:4:3:2:1/128',
1444 '::7:6:5:4:3:2:0': '0:7:6:5:4:3:2:0/128',
1445 '7:6:5:4:3:2:1::': '7:6:5:4:3:2:1:0/128',
1446 '0:6:5:4:3:2:1::': '0:6:5:4:3:2:1:0/128',
1447 }
1448 for uncompressed, compressed in list(test_addresses.items()):
1449 self.assertEqual(compressed, str(ipaddress.IPv6Interface(
1450 uncompressed)))
1451
1452 def testExplodeShortHandIpStr(self):
1453 addr1 = ipaddress.IPv6Interface('2001::1')
1454 addr2 = ipaddress.IPv6Address('2001:0:5ef5:79fd:0:59d:a0e5:ba1')
1455 addr3 = ipaddress.IPv6Network('2001::/96')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001456 addr4 = ipaddress.IPv4Address('192.168.178.1')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001457 self.assertEqual('2001:0000:0000:0000:0000:0000:0000:0001/128',
1458 addr1.exploded)
1459 self.assertEqual('0000:0000:0000:0000:0000:0000:0000:0001/128',
1460 ipaddress.IPv6Interface('::1/128').exploded)
1461 # issue 77
1462 self.assertEqual('2001:0000:5ef5:79fd:0000:059d:a0e5:0ba1',
1463 addr2.exploded)
1464 self.assertEqual('2001:0000:0000:0000:0000:0000:0000:0000/96',
1465 addr3.exploded)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001466 self.assertEqual('192.168.178.1', addr4.exploded)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001467
1468 def testIntRepresentation(self):
1469 self.assertEqual(16909060, int(self.ipv4_address))
1470 self.assertEqual(42540616829182469433547762482097946625,
1471 int(self.ipv6_address))
1472
1473 def testHexRepresentation(self):
1474 self.assertEqual(hex(0x1020304),
1475 hex(self.ipv4_address))
1476
1477 self.assertEqual(hex(0x20010658022ACAFE0200000000000001),
1478 hex(self.ipv6_address))
1479
1480 def testForceVersion(self):
1481 self.assertEqual(ipaddress.ip_network(1).version, 4)
Nick Coghlan51c30672012-05-27 00:25:58 +10001482 self.assertEqual(ipaddress.IPv6Network(1).version, 6)
Sandro Tosi876ecad2012-05-23 22:26:55 +02001483
Nick Coghlandc9b2552012-05-20 21:01:57 +10001484 def testWithStar(self):
1485 self.assertEqual(str(self.ipv4_interface.with_prefixlen), "1.2.3.4/24")
1486 self.assertEqual(str(self.ipv4_interface.with_netmask),
1487 "1.2.3.4/255.255.255.0")
1488 self.assertEqual(str(self.ipv4_interface.with_hostmask),
1489 "1.2.3.4/0.0.0.255")
1490
1491 self.assertEqual(str(self.ipv6_interface.with_prefixlen),
1492 '2001:658:22a:cafe:200::1/64')
1493 # rfc3513 sec 2.3 says that ipv6 only uses cidr notation for
1494 # subnets
1495 self.assertEqual(str(self.ipv6_interface.with_netmask),
1496 '2001:658:22a:cafe:200::1/64')
1497 # this probably don't make much sense, but it's included for
1498 # compatibility with ipv4
1499 self.assertEqual(str(self.ipv6_interface.with_hostmask),
1500 '2001:658:22a:cafe:200::1/::ffff:ffff:ffff:ffff')
1501
1502 def testNetworkElementCaching(self):
1503 # V4 - make sure we're empty
1504 self.assertFalse('network_address' in self.ipv4_network._cache)
1505 self.assertFalse('broadcast_address' in self.ipv4_network._cache)
1506 self.assertFalse('hostmask' in self.ipv4_network._cache)
1507
1508 # V4 - populate and test
1509 self.assertEqual(self.ipv4_network.network_address,
1510 ipaddress.IPv4Address('1.2.3.0'))
1511 self.assertEqual(self.ipv4_network.broadcast_address,
1512 ipaddress.IPv4Address('1.2.3.255'))
1513 self.assertEqual(self.ipv4_network.hostmask,
1514 ipaddress.IPv4Address('0.0.0.255'))
1515
1516 # V4 - check we're cached
1517 self.assertTrue('broadcast_address' in self.ipv4_network._cache)
1518 self.assertTrue('hostmask' in self.ipv4_network._cache)
1519
1520 # V6 - make sure we're empty
1521 self.assertFalse('broadcast_address' in self.ipv6_network._cache)
1522 self.assertFalse('hostmask' in self.ipv6_network._cache)
1523
1524 # V6 - populate and test
1525 self.assertEqual(self.ipv6_network.network_address,
1526 ipaddress.IPv6Address('2001:658:22a:cafe::'))
1527 self.assertEqual(self.ipv6_interface.network.network_address,
1528 ipaddress.IPv6Address('2001:658:22a:cafe::'))
1529
1530 self.assertEqual(
1531 self.ipv6_network.broadcast_address,
1532 ipaddress.IPv6Address('2001:658:22a:cafe:ffff:ffff:ffff:ffff'))
1533 self.assertEqual(self.ipv6_network.hostmask,
1534 ipaddress.IPv6Address('::ffff:ffff:ffff:ffff'))
1535 self.assertEqual(
1536 self.ipv6_interface.network.broadcast_address,
1537 ipaddress.IPv6Address('2001:658:22a:cafe:ffff:ffff:ffff:ffff'))
1538 self.assertEqual(self.ipv6_interface.network.hostmask,
1539 ipaddress.IPv6Address('::ffff:ffff:ffff:ffff'))
1540
1541 # V6 - check we're cached
1542 self.assertTrue('broadcast_address' in self.ipv6_network._cache)
1543 self.assertTrue('hostmask' in self.ipv6_network._cache)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001544 self.assertTrue(
1545 'broadcast_address' in self.ipv6_interface.network._cache)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001546 self.assertTrue('hostmask' in self.ipv6_interface.network._cache)
1547
1548 def testTeredo(self):
1549 # stolen from wikipedia
1550 server = ipaddress.IPv4Address('65.54.227.120')
1551 client = ipaddress.IPv4Address('192.0.2.45')
1552 teredo_addr = '2001:0000:4136:e378:8000:63bf:3fff:fdd2'
1553 self.assertEqual((server, client),
1554 ipaddress.ip_address(teredo_addr).teredo)
1555 bad_addr = '2000::4136:e378:8000:63bf:3fff:fdd2'
1556 self.assertFalse(ipaddress.ip_address(bad_addr).teredo)
1557 bad_addr = '2001:0001:4136:e378:8000:63bf:3fff:fdd2'
1558 self.assertFalse(ipaddress.ip_address(bad_addr).teredo)
1559
1560 # i77
1561 teredo_addr = ipaddress.IPv6Address('2001:0:5ef5:79fd:0:59d:a0e5:ba1')
1562 self.assertEqual((ipaddress.IPv4Address('94.245.121.253'),
1563 ipaddress.IPv4Address('95.26.244.94')),
1564 teredo_addr.teredo)
1565
Nick Coghlandc9b2552012-05-20 21:01:57 +10001566 def testsixtofour(self):
1567 sixtofouraddr = ipaddress.ip_address('2002:ac1d:2d64::1')
1568 bad_addr = ipaddress.ip_address('2000:ac1d:2d64::1')
1569 self.assertEqual(ipaddress.IPv4Address('172.29.45.100'),
1570 sixtofouraddr.sixtofour)
1571 self.assertFalse(bad_addr.sixtofour)
1572
Nick Coghlandc9b2552012-05-20 21:01:57 +10001573
1574if __name__ == '__main__':
1575 unittest.main()