blob: c45e142f92039971559c693a824d66525086bbdd [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 Coghlane0c3f5e2012-08-05 18:20:17 +100010import operator
Nick Coghlandc9b2552012-05-20 21:01:57 +100011import ipaddress
12
R David Murray75678652014-10-12 15:17:22 -040013
Nick Coghlan07c4e332012-07-08 23:06:45 +100014class BaseTestCase(unittest.TestCase):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +100015 # One big change in ipaddress over the original ipaddr module is
16 # error reporting that tries to assume users *don't know the rules*
17 # for what constitutes an RFC compliant IP address
18
Nick Coghlan07c4e332012-07-08 23:06:45 +100019 # Ensuring these errors are emitted correctly in all relevant cases
20 # meant moving to a more systematic test structure that allows the
21 # test structure to map more directly to the module structure
22
Nick Coghlan36f8dcd2012-07-07 19:23:53 +100023 # Note that if the constructors are refactored so that addresses with
24 # multiple problems get classified differently, that's OK - just
25 # move the affected examples to the newly appropriate test case.
26
Nick Coghlan07c4e332012-07-08 23:06:45 +100027 # There is some duplication between the original relatively ad hoc
28 # test suite and the new systematic tests. While some redundancy in
29 # testing is considered preferable to accidentally deleting a valid
30 # test, the original test suite will likely be reduced over time as
31 # redundant tests are identified.
Nick Coghlan36f8dcd2012-07-07 19:23:53 +100032
Nick Coghlan297b1432012-07-08 17:11:04 +100033 @property
34 def factory(self):
35 raise NotImplementedError
36
Nick Coghlan36f8dcd2012-07-07 19:23:53 +100037 @contextlib.contextmanager
38 def assertCleanError(self, exc_type, details, *args):
39 """
40 Ensure exception does not display a context by default
41
42 Wraps unittest.TestCase.assertRaisesRegex
43 """
44 if args:
45 details = details % args
46 cm = self.assertRaisesRegex(exc_type, details)
47 with cm as exc:
48 yield exc
49 # Ensure we produce clean tracebacks on failure
50 if exc.exception.__context__ is not None:
51 self.assertTrue(exc.exception.__suppress_context__)
52
53 def assertAddressError(self, details, *args):
54 """Ensure a clean AddressValueError"""
55 return self.assertCleanError(ipaddress.AddressValueError,
R David Murray75678652014-10-12 15:17:22 -040056 details, *args)
Nick Coghlan36f8dcd2012-07-07 19:23:53 +100057
58 def assertNetmaskError(self, details, *args):
59 """Ensure a clean NetmaskValueError"""
60 return self.assertCleanError(ipaddress.NetmaskValueError,
R David Murray75678652014-10-12 15:17:22 -040061 details, *args)
Nick Coghlan36f8dcd2012-07-07 19:23:53 +100062
Nick Coghlan07c4e332012-07-08 23:06:45 +100063 def assertInstancesEqual(self, lhs, rhs):
64 """Check constructor arguments produce equivalent instances"""
65 self.assertEqual(self.factory(lhs), self.factory(rhs))
66
R David Murray75678652014-10-12 15:17:22 -040067
Nick Coghlan07c4e332012-07-08 23:06:45 +100068class CommonTestMixin:
Nick Coghlan36f8dcd2012-07-07 19:23:53 +100069
70 def test_empty_address(self):
71 with self.assertAddressError("Address cannot be empty"):
Nick Coghlan297b1432012-07-08 17:11:04 +100072 self.factory("")
73
74 def test_floats_rejected(self):
75 with self.assertAddressError(re.escape(repr("1.0"))):
76 self.factory(1.0)
77
Nick Coghlane0c3f5e2012-08-05 18:20:17 +100078 def test_not_an_index_issue15559(self):
79 # Implementing __index__ makes for a very nasty interaction with the
80 # bytes constructor. Thus, we disallow implicit use as an integer
81 self.assertRaises(TypeError, operator.index, self.factory(1))
82 self.assertRaises(TypeError, hex, self.factory(1))
83 self.assertRaises(TypeError, bytes, self.factory(1))
84
85
Nick Coghlan07c4e332012-07-08 23:06:45 +100086class CommonTestMixin_v4(CommonTestMixin):
87
88 def test_leading_zeros(self):
89 self.assertInstancesEqual("000.000.000.000", "0.0.0.0")
90 self.assertInstancesEqual("192.168.000.001", "192.168.0.1")
91
92 def test_int(self):
93 self.assertInstancesEqual(0, "0.0.0.0")
94 self.assertInstancesEqual(3232235521, "192.168.0.1")
95
96 def test_packed(self):
97 self.assertInstancesEqual(bytes.fromhex("00000000"), "0.0.0.0")
98 self.assertInstancesEqual(bytes.fromhex("c0a80001"), "192.168.0.1")
Nick Coghlan297b1432012-07-08 17:11:04 +100099
100 def test_negative_ints_rejected(self):
101 msg = "-1 (< 0) is not permitted as an IPv4 address"
102 with self.assertAddressError(re.escape(msg)):
103 self.factory(-1)
104
105 def test_large_ints_rejected(self):
106 msg = "%d (>= 2**32) is not permitted as an IPv4 address"
107 with self.assertAddressError(re.escape(msg % 2**32)):
108 self.factory(2**32)
109
110 def test_bad_packed_length(self):
111 def assertBadLength(length):
Nick Coghlan07c4e332012-07-08 23:06:45 +1000112 addr = bytes(length)
Nick Coghlan297b1432012-07-08 17:11:04 +1000113 msg = "%r (len %d != 4) is not permitted as an IPv4 address"
114 with self.assertAddressError(re.escape(msg % (addr, length))):
115 self.factory(addr)
116
117 assertBadLength(3)
118 assertBadLength(5)
119
R David Murray75678652014-10-12 15:17:22 -0400120
Nick Coghlan07c4e332012-07-08 23:06:45 +1000121class CommonTestMixin_v6(CommonTestMixin):
122
123 def test_leading_zeros(self):
124 self.assertInstancesEqual("0000::0000", "::")
125 self.assertInstancesEqual("000::c0a8:0001", "::c0a8:1")
126
127 def test_int(self):
128 self.assertInstancesEqual(0, "::")
129 self.assertInstancesEqual(3232235521, "::c0a8:1")
130
131 def test_packed(self):
132 addr = bytes(12) + bytes.fromhex("00000000")
133 self.assertInstancesEqual(addr, "::")
134 addr = bytes(12) + bytes.fromhex("c0a80001")
135 self.assertInstancesEqual(addr, "::c0a8:1")
136 addr = bytes.fromhex("c0a80001") + bytes(12)
137 self.assertInstancesEqual(addr, "c0a8:1::")
Nick Coghlan297b1432012-07-08 17:11:04 +1000138
139 def test_negative_ints_rejected(self):
140 msg = "-1 (< 0) is not permitted as an IPv6 address"
141 with self.assertAddressError(re.escape(msg)):
142 self.factory(-1)
143
144 def test_large_ints_rejected(self):
145 msg = "%d (>= 2**128) is not permitted as an IPv6 address"
146 with self.assertAddressError(re.escape(msg % 2**128)):
147 self.factory(2**128)
148
149 def test_bad_packed_length(self):
150 def assertBadLength(length):
Nick Coghlan07c4e332012-07-08 23:06:45 +1000151 addr = bytes(length)
Nick Coghlan297b1432012-07-08 17:11:04 +1000152 msg = "%r (len %d != 16) is not permitted as an IPv6 address"
153 with self.assertAddressError(re.escape(msg % (addr, length))):
154 self.factory(addr)
155 self.factory(addr)
156
157 assertBadLength(15)
158 assertBadLength(17)
159
160
Nick Coghlan07c4e332012-07-08 23:06:45 +1000161class AddressTestCase_v4(BaseTestCase, CommonTestMixin_v4):
Nick Coghlan297b1432012-07-08 17:11:04 +1000162 factory = ipaddress.IPv4Address
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000163
164 def test_network_passed_as_address(self):
165 addr = "127.0.0.1/24"
166 with self.assertAddressError("Unexpected '/' in %r", addr):
167 ipaddress.IPv4Address(addr)
168
169 def test_bad_address_split(self):
170 def assertBadSplit(addr):
171 with self.assertAddressError("Expected 4 octets in %r", addr):
172 ipaddress.IPv4Address(addr)
173
174 assertBadSplit("127.0.1")
175 assertBadSplit("42.42.42.42.42")
176 assertBadSplit("42.42.42")
177 assertBadSplit("42.42")
178 assertBadSplit("42")
179 assertBadSplit("42..42.42.42")
180 assertBadSplit("42.42.42.42.")
181 assertBadSplit("42.42.42.42...")
182 assertBadSplit(".42.42.42.42")
183 assertBadSplit("...42.42.42.42")
184 assertBadSplit("016.016.016")
185 assertBadSplit("016.016")
186 assertBadSplit("016")
187 assertBadSplit("000")
188 assertBadSplit("0x0a.0x0a.0x0a")
189 assertBadSplit("0x0a.0x0a")
190 assertBadSplit("0x0a")
191 assertBadSplit(".")
192 assertBadSplit("bogus")
193 assertBadSplit("bogus.com")
194 assertBadSplit("1000")
195 assertBadSplit("1000000000000000")
196 assertBadSplit("192.168.0.1.com")
197
198 def test_empty_octet(self):
199 def assertBadOctet(addr):
200 with self.assertAddressError("Empty octet not permitted in %r",
R David Murray75678652014-10-12 15:17:22 -0400201 addr):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000202 ipaddress.IPv4Address(addr)
203
204 assertBadOctet("42..42.42")
205 assertBadOctet("...")
206
207 def test_invalid_characters(self):
208 def assertBadOctet(addr, octet):
209 msg = "Only decimal digits permitted in %r in %r" % (octet, addr)
210 with self.assertAddressError(re.escape(msg)):
211 ipaddress.IPv4Address(addr)
212
213 assertBadOctet("0x0a.0x0a.0x0a.0x0a", "0x0a")
Nick Coghlan07c4e332012-07-08 23:06:45 +1000214 assertBadOctet("0xa.0x0a.0x0a.0x0a", "0xa")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000215 assertBadOctet("42.42.42.-0", "-0")
216 assertBadOctet("42.42.42.+0", "+0")
217 assertBadOctet("42.42.42.-42", "-42")
218 assertBadOctet("+1.+2.+3.4", "+1")
219 assertBadOctet("1.2.3.4e0", "4e0")
220 assertBadOctet("1.2.3.4::", "4::")
221 assertBadOctet("1.a.2.3", "a")
222
Nick Coghlan07c4e332012-07-08 23:06:45 +1000223 def test_octal_decimal_ambiguity(self):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000224 def assertBadOctet(addr, octet):
Nick Coghlan07c4e332012-07-08 23:06:45 +1000225 msg = "Ambiguous (octal/decimal) value in %r not permitted in %r"
226 with self.assertAddressError(re.escape(msg % (octet, addr))):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000227 ipaddress.IPv4Address(addr)
228
229 assertBadOctet("016.016.016.016", "016")
230 assertBadOctet("001.000.008.016", "008")
Nick Coghlan07c4e332012-07-08 23:06:45 +1000231
232 def test_octet_length(self):
233 def assertBadOctet(addr, octet):
234 msg = "At most 3 characters permitted in %r in %r"
235 with self.assertAddressError(re.escape(msg % (octet, addr))):
236 ipaddress.IPv4Address(addr)
237
238 assertBadOctet("0000.000.000.000", "0000")
239 assertBadOctet("12345.67899.-54321.-98765", "12345")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000240
241 def test_octet_limit(self):
242 def assertBadOctet(addr, octet):
Nick Coghlanb582ecc2012-07-07 22:15:22 +1000243 msg = "Octet %d (> 255) not permitted in %r" % (octet, addr)
244 with self.assertAddressError(re.escape(msg)):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000245 ipaddress.IPv4Address(addr)
246
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000247 assertBadOctet("257.0.0.0", 257)
Nick Coghlan07c4e332012-07-08 23:06:45 +1000248 assertBadOctet("192.168.0.999", 999)
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000249
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000250
Nick Coghlan07c4e332012-07-08 23:06:45 +1000251class AddressTestCase_v6(BaseTestCase, CommonTestMixin_v6):
Nick Coghlan297b1432012-07-08 17:11:04 +1000252 factory = ipaddress.IPv6Address
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000253
254 def test_network_passed_as_address(self):
255 addr = "::1/24"
256 with self.assertAddressError("Unexpected '/' in %r", addr):
257 ipaddress.IPv6Address(addr)
258
259 def test_bad_address_split_v6_not_enough_parts(self):
260 def assertBadSplit(addr):
261 msg = "At least 3 parts expected in %r"
262 with self.assertAddressError(msg, addr):
263 ipaddress.IPv6Address(addr)
264
265 assertBadSplit(":")
266 assertBadSplit(":1")
267 assertBadSplit("FEDC:9878")
268
269 def test_bad_address_split_v6_too_many_colons(self):
270 def assertBadSplit(addr):
271 msg = "At most 8 colons permitted in %r"
272 with self.assertAddressError(msg, addr):
273 ipaddress.IPv6Address(addr)
274
275 assertBadSplit("9:8:7:6:5:4:3::2:1")
276 assertBadSplit("10:9:8:7:6:5:4:3:2:1")
277 assertBadSplit("::8:7:6:5:4:3:2:1")
278 assertBadSplit("8:7:6:5:4:3:2:1::")
279 # A trailing IPv4 address is two parts
280 assertBadSplit("10:9:8:7:6:5:4:3:42.42.42.42")
281
282 def test_bad_address_split_v6_too_many_parts(self):
283 def assertBadSplit(addr):
284 msg = "Exactly 8 parts expected without '::' in %r"
285 with self.assertAddressError(msg, addr):
286 ipaddress.IPv6Address(addr)
287
288 assertBadSplit("3ffe:0:0:0:0:0:0:0:1")
289 assertBadSplit("9:8:7:6:5:4:3:2:1")
290 assertBadSplit("7:6:5:4:3:2:1")
291 # A trailing IPv4 address is two parts
292 assertBadSplit("9:8:7:6:5:4:3:42.42.42.42")
293 assertBadSplit("7:6:5:4:3:42.42.42.42")
294
295 def test_bad_address_split_v6_too_many_parts_with_double_colon(self):
296 def assertBadSplit(addr):
297 msg = "Expected at most 7 other parts with '::' in %r"
298 with self.assertAddressError(msg, addr):
299 ipaddress.IPv6Address(addr)
300
301 assertBadSplit("1:2:3:4::5:6:7:8")
302
303 def test_bad_address_split_v6_repeated_double_colon(self):
304 def assertBadSplit(addr):
305 msg = "At most one '::' permitted in %r"
306 with self.assertAddressError(msg, addr):
307 ipaddress.IPv6Address(addr)
308
309 assertBadSplit("3ffe::1::1")
310 assertBadSplit("1::2::3::4:5")
311 assertBadSplit("2001::db:::1")
312 assertBadSplit("3ffe::1::")
313 assertBadSplit("::3ffe::1")
314 assertBadSplit(":3ffe::1::1")
315 assertBadSplit("3ffe::1::1:")
316 assertBadSplit(":3ffe::1::1:")
317 assertBadSplit(":::")
318 assertBadSplit('2001:db8:::1')
319
320 def test_bad_address_split_v6_leading_colon(self):
321 def assertBadSplit(addr):
322 msg = "Leading ':' only permitted as part of '::' in %r"
323 with self.assertAddressError(msg, addr):
324 ipaddress.IPv6Address(addr)
325
326 assertBadSplit(":2001:db8::1")
327 assertBadSplit(":1:2:3:4:5:6:7")
328 assertBadSplit(":1:2:3:4:5:6:")
329 assertBadSplit(":6:5:4:3:2:1::")
330
331 def test_bad_address_split_v6_trailing_colon(self):
332 def assertBadSplit(addr):
333 msg = "Trailing ':' only permitted as part of '::' in %r"
334 with self.assertAddressError(msg, addr):
335 ipaddress.IPv6Address(addr)
336
337 assertBadSplit("2001:db8::1:")
338 assertBadSplit("1:2:3:4:5:6:7:")
339 assertBadSplit("::1.2.3.4:")
340 assertBadSplit("::7:6:5:4:3:2:")
341
342 def test_bad_v4_part_in(self):
343 def assertBadAddressPart(addr, v4_error):
344 with self.assertAddressError("%s in %r", v4_error, addr):
345 ipaddress.IPv6Address(addr)
346
347 assertBadAddressPart("3ffe::1.net", "Expected 4 octets in '1.net'")
348 assertBadAddressPart("3ffe::127.0.1",
349 "Expected 4 octets in '127.0.1'")
350 assertBadAddressPart("::1.2.3",
351 "Expected 4 octets in '1.2.3'")
352 assertBadAddressPart("::1.2.3.4.5",
353 "Expected 4 octets in '1.2.3.4.5'")
354 assertBadAddressPart("3ffe::1.1.1.net",
355 "Only decimal digits permitted in 'net' "
356 "in '1.1.1.net'")
357
358 def test_invalid_characters(self):
359 def assertBadPart(addr, part):
360 msg = "Only hex digits permitted in %r in %r" % (part, addr)
361 with self.assertAddressError(re.escape(msg)):
362 ipaddress.IPv6Address(addr)
363
364 assertBadPart("3ffe::goog", "goog")
365 assertBadPart("3ffe::-0", "-0")
366 assertBadPart("3ffe::+0", "+0")
367 assertBadPart("3ffe::-1", "-1")
368 assertBadPart("1.2.3.4::", "1.2.3.4")
369 assertBadPart('1234:axy::b', "axy")
370
371 def test_part_length(self):
372 def assertBadPart(addr, part):
373 msg = "At most 4 characters permitted in %r in %r"
374 with self.assertAddressError(msg, part, addr):
375 ipaddress.IPv6Address(addr)
376
Nick Coghlan07c4e332012-07-08 23:06:45 +1000377 assertBadPart("::00000", "00000")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000378 assertBadPart("3ffe::10000", "10000")
379 assertBadPart("02001:db8::", "02001")
380 assertBadPart('2001:888888::1', "888888")
381
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000382
Nick Coghlan07c4e332012-07-08 23:06:45 +1000383class NetmaskTestMixin_v4(CommonTestMixin_v4):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000384 """Input validation on interfaces and networks is very similar"""
385
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000386 def test_split_netmask(self):
387 addr = "1.2.3.4/32/24"
388 with self.assertAddressError("Only one '/' permitted in %r" % addr):
389 self.factory(addr)
390
391 def test_address_errors(self):
392 def assertBadAddress(addr, details):
393 with self.assertAddressError(details):
394 self.factory(addr)
395
Nick Coghlan297b1432012-07-08 17:11:04 +1000396 assertBadAddress("/", "Address cannot be empty")
397 assertBadAddress("/8", "Address cannot be empty")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000398 assertBadAddress("bogus", "Expected 4 octets")
399 assertBadAddress("google.com", "Expected 4 octets")
400 assertBadAddress("10/8", "Expected 4 octets")
401 assertBadAddress("::1.2.3.4", "Only decimal digits")
Nick Coghlanb582ecc2012-07-07 22:15:22 +1000402 assertBadAddress("1.2.3.256", re.escape("256 (> 255)"))
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000403
Nick Coghlan932346f2014-02-08 23:17:36 +1000404 def test_valid_netmask(self):
405 self.assertEqual(str(self.factory('192.0.2.0/255.255.255.0')),
406 '192.0.2.0/24')
407 for i in range(0, 33):
408 # Generate and re-parse the CIDR format (trivial).
409 net_str = '0.0.0.0/%d' % i
410 net = self.factory(net_str)
411 self.assertEqual(str(net), net_str)
412 # Generate and re-parse the expanded netmask.
413 self.assertEqual(
414 str(self.factory('0.0.0.0/%s' % net.netmask)), net_str)
415 # Zero prefix is treated as decimal.
416 self.assertEqual(str(self.factory('0.0.0.0/0%d' % i)), net_str)
417 # Generate and re-parse the expanded hostmask. The ambiguous
418 # cases (/0 and /32) are treated as netmasks.
419 if i in (32, 0):
420 net_str = '0.0.0.0/%d' % (32 - i)
421 self.assertEqual(
422 str(self.factory('0.0.0.0/%s' % net.hostmask)), net_str)
423
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000424 def test_netmask_errors(self):
425 def assertBadNetmask(addr, netmask):
Nick Coghlan932346f2014-02-08 23:17:36 +1000426 msg = "%r is not a valid netmask" % netmask
427 with self.assertNetmaskError(re.escape(msg)):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000428 self.factory("%s/%s" % (addr, netmask))
429
430 assertBadNetmask("1.2.3.4", "")
Nick Coghlan932346f2014-02-08 23:17:36 +1000431 assertBadNetmask("1.2.3.4", "-1")
432 assertBadNetmask("1.2.3.4", "+1")
433 assertBadNetmask("1.2.3.4", " 1 ")
434 assertBadNetmask("1.2.3.4", "0x1")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000435 assertBadNetmask("1.2.3.4", "33")
436 assertBadNetmask("1.2.3.4", "254.254.255.256")
Nick Coghlan932346f2014-02-08 23:17:36 +1000437 assertBadNetmask("1.2.3.4", "1.a.2.3")
Nick Coghlan07c4e332012-07-08 23:06:45 +1000438 assertBadNetmask("1.1.1.1", "254.xyz.2.3")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000439 assertBadNetmask("1.1.1.1", "240.255.0.0")
Nick Coghlan932346f2014-02-08 23:17:36 +1000440 assertBadNetmask("1.1.1.1", "255.254.128.0")
441 assertBadNetmask("1.1.1.1", "0.1.127.255")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000442 assertBadNetmask("1.1.1.1", "pudding")
Nick Coghlan932346f2014-02-08 23:17:36 +1000443 assertBadNetmask("1.1.1.1", "::")
444
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000445
Nick Coghlan07c4e332012-07-08 23:06:45 +1000446class InterfaceTestCase_v4(BaseTestCase, NetmaskTestMixin_v4):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000447 factory = ipaddress.IPv4Interface
448
R David Murray75678652014-10-12 15:17:22 -0400449
Nick Coghlan07c4e332012-07-08 23:06:45 +1000450class NetworkTestCase_v4(BaseTestCase, NetmaskTestMixin_v4):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000451 factory = ipaddress.IPv4Network
452
453
Nick Coghlan07c4e332012-07-08 23:06:45 +1000454class NetmaskTestMixin_v6(CommonTestMixin_v6):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000455 """Input validation on interfaces and networks is very similar"""
456
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000457 def test_split_netmask(self):
458 addr = "cafe:cafe::/128/190"
459 with self.assertAddressError("Only one '/' permitted in %r" % addr):
460 self.factory(addr)
461
462 def test_address_errors(self):
463 def assertBadAddress(addr, details):
464 with self.assertAddressError(details):
465 self.factory(addr)
466
Nick Coghlan297b1432012-07-08 17:11:04 +1000467 assertBadAddress("/", "Address cannot be empty")
468 assertBadAddress("/8", "Address cannot be empty")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000469 assertBadAddress("google.com", "At least 3 parts")
470 assertBadAddress("1.2.3.4", "At least 3 parts")
471 assertBadAddress("10/8", "At least 3 parts")
472 assertBadAddress("1234:axy::b", "Only hex digits")
473
Nick Coghlan932346f2014-02-08 23:17:36 +1000474 def test_valid_netmask(self):
475 # We only support CIDR for IPv6, because expanded netmasks are not
476 # standard notation.
477 self.assertEqual(str(self.factory('2001:db8::/32')), '2001:db8::/32')
478 for i in range(0, 129):
479 # Generate and re-parse the CIDR format (trivial).
480 net_str = '::/%d' % i
481 self.assertEqual(str(self.factory(net_str)), net_str)
482 # Zero prefix is treated as decimal.
483 self.assertEqual(str(self.factory('::/0%d' % i)), net_str)
484
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000485 def test_netmask_errors(self):
486 def assertBadNetmask(addr, netmask):
Nick Coghlan932346f2014-02-08 23:17:36 +1000487 msg = "%r is not a valid netmask" % netmask
488 with self.assertNetmaskError(re.escape(msg)):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000489 self.factory("%s/%s" % (addr, netmask))
490
491 assertBadNetmask("::1", "")
492 assertBadNetmask("::1", "::1")
493 assertBadNetmask("::1", "1::")
Nick Coghlan932346f2014-02-08 23:17:36 +1000494 assertBadNetmask("::1", "-1")
495 assertBadNetmask("::1", "+1")
496 assertBadNetmask("::1", " 1 ")
497 assertBadNetmask("::1", "0x1")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000498 assertBadNetmask("::1", "129")
Nick Coghlan932346f2014-02-08 23:17:36 +1000499 assertBadNetmask("::1", "1.2.3.4")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000500 assertBadNetmask("::1", "pudding")
Nick Coghlan932346f2014-02-08 23:17:36 +1000501 assertBadNetmask("::", "::")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000502
R David Murray75678652014-10-12 15:17:22 -0400503
Nick Coghlan07c4e332012-07-08 23:06:45 +1000504class InterfaceTestCase_v6(BaseTestCase, NetmaskTestMixin_v6):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000505 factory = ipaddress.IPv6Interface
506
R David Murray75678652014-10-12 15:17:22 -0400507
Nick Coghlan07c4e332012-07-08 23:06:45 +1000508class NetworkTestCase_v6(BaseTestCase, NetmaskTestMixin_v6):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000509 factory = ipaddress.IPv6Network
510
511
Nick Coghlan07c4e332012-07-08 23:06:45 +1000512class FactoryFunctionErrors(BaseTestCase):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000513
514 def assertFactoryError(self, factory, kind):
515 """Ensure a clean ValueError with the expected message"""
516 addr = "camelot"
517 msg = '%r does not appear to be an IPv4 or IPv6 %s'
518 with self.assertCleanError(ValueError, msg, addr, kind):
519 factory(addr)
520
521 def test_ip_address(self):
522 self.assertFactoryError(ipaddress.ip_address, "address")
523
524 def test_ip_interface(self):
525 self.assertFactoryError(ipaddress.ip_interface, "interface")
526
527 def test_ip_network(self):
528 self.assertFactoryError(ipaddress.ip_network, "network")
529
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200530
Nick Coghlan3008ec02012-07-08 00:45:33 +1000531class ComparisonTests(unittest.TestCase):
532
533 v4addr = ipaddress.IPv4Address(1)
534 v4net = ipaddress.IPv4Network(1)
535 v4intf = ipaddress.IPv4Interface(1)
536 v6addr = ipaddress.IPv6Address(1)
537 v6net = ipaddress.IPv6Network(1)
538 v6intf = ipaddress.IPv6Interface(1)
539
540 v4_addresses = [v4addr, v4intf]
541 v4_objects = v4_addresses + [v4net]
542 v6_addresses = [v6addr, v6intf]
543 v6_objects = v6_addresses + [v6net]
544 objects = v4_objects + v6_objects
545
546 def test_foreign_type_equality(self):
547 # __eq__ should never raise TypeError directly
548 other = object()
549 for obj in self.objects:
550 self.assertNotEqual(obj, other)
551 self.assertFalse(obj == other)
552 self.assertEqual(obj.__eq__(other), NotImplemented)
553 self.assertEqual(obj.__ne__(other), NotImplemented)
554
555 def test_mixed_type_equality(self):
556 # Ensure none of the internal objects accidentally
557 # expose the right set of attributes to become "equal"
558 for lhs in self.objects:
559 for rhs in self.objects:
560 if lhs is rhs:
561 continue
562 self.assertNotEqual(lhs, rhs)
563
564 def test_containment(self):
565 for obj in self.v4_addresses:
566 self.assertIn(obj, self.v4net)
567 for obj in self.v6_addresses:
568 self.assertIn(obj, self.v6net)
569 for obj in self.v4_objects + [self.v6net]:
570 self.assertNotIn(obj, self.v6net)
571 for obj in self.v6_objects + [self.v4net]:
572 self.assertNotIn(obj, self.v4net)
573
574 def test_mixed_type_ordering(self):
575 for lhs in self.objects:
576 for rhs in self.objects:
577 if isinstance(lhs, type(rhs)) or isinstance(rhs, type(lhs)):
578 continue
579 self.assertRaises(TypeError, lambda: lhs < rhs)
580 self.assertRaises(TypeError, lambda: lhs > rhs)
581 self.assertRaises(TypeError, lambda: lhs <= rhs)
582 self.assertRaises(TypeError, lambda: lhs >= rhs)
583
584 def test_mixed_type_key(self):
585 # with get_mixed_type_key, you can sort addresses and network.
586 v4_ordered = [self.v4addr, self.v4net, self.v4intf]
587 v6_ordered = [self.v6addr, self.v6net, self.v6intf]
588 self.assertEqual(v4_ordered,
589 sorted(self.v4_objects,
590 key=ipaddress.get_mixed_type_key))
591 self.assertEqual(v6_ordered,
592 sorted(self.v6_objects,
593 key=ipaddress.get_mixed_type_key))
594 self.assertEqual(v4_ordered + v6_ordered,
595 sorted(self.objects,
596 key=ipaddress.get_mixed_type_key))
597 self.assertEqual(NotImplemented, ipaddress.get_mixed_type_key(object))
598
599 def test_incompatible_versions(self):
600 # These should always raise TypeError
601 v4addr = ipaddress.ip_address('1.1.1.1')
602 v4net = ipaddress.ip_network('1.1.1.1')
603 v6addr = ipaddress.ip_address('::1')
604 v6net = ipaddress.ip_address('::1')
605
606 self.assertRaises(TypeError, v4addr.__lt__, v6addr)
607 self.assertRaises(TypeError, v4addr.__gt__, v6addr)
608 self.assertRaises(TypeError, v4net.__lt__, v6net)
609 self.assertRaises(TypeError, v4net.__gt__, v6net)
610
611 self.assertRaises(TypeError, v6addr.__lt__, v4addr)
612 self.assertRaises(TypeError, v6addr.__gt__, v4addr)
613 self.assertRaises(TypeError, v6net.__lt__, v4net)
614 self.assertRaises(TypeError, v6net.__gt__, v4net)
615
616
Nick Coghlandc9b2552012-05-20 21:01:57 +1000617class IpaddrUnitTest(unittest.TestCase):
618
619 def setUp(self):
620 self.ipv4_address = ipaddress.IPv4Address('1.2.3.4')
621 self.ipv4_interface = ipaddress.IPv4Interface('1.2.3.4/24')
622 self.ipv4_network = ipaddress.IPv4Network('1.2.3.0/24')
623 #self.ipv4_hostmask = ipaddress.IPv4Interface('10.0.0.1/0.255.255.255')
624 self.ipv6_address = ipaddress.IPv6Interface(
625 '2001:658:22a:cafe:200:0:0:1')
626 self.ipv6_interface = ipaddress.IPv6Interface(
627 '2001:658:22a:cafe:200:0:0:1/64')
628 self.ipv6_network = ipaddress.IPv6Network('2001:658:22a:cafe::/64')
629
630 def testRepr(self):
631 self.assertEqual("IPv4Interface('1.2.3.4/32')",
632 repr(ipaddress.IPv4Interface('1.2.3.4')))
633 self.assertEqual("IPv6Interface('::1/128')",
634 repr(ipaddress.IPv6Interface('::1')))
635
Antoine Pitrou5fb195f2014-05-12 20:36:46 +0200636 # issue #16531: constructing IPv4Network from a (address, mask) tuple
637 def testIPv4Tuple(self):
638 # /32
639 ip = ipaddress.IPv4Address('192.0.2.1')
640 net = ipaddress.IPv4Network('192.0.2.1/32')
641 self.assertEqual(ipaddress.IPv4Network(('192.0.2.1', 32)), net)
642 self.assertEqual(ipaddress.IPv4Network((ip, 32)), net)
643 self.assertEqual(ipaddress.IPv4Network((3221225985, 32)), net)
644 self.assertEqual(ipaddress.IPv4Network(('192.0.2.1',
645 '255.255.255.255')), net)
646 self.assertEqual(ipaddress.IPv4Network((ip,
647 '255.255.255.255')), net)
648 self.assertEqual(ipaddress.IPv4Network((3221225985,
649 '255.255.255.255')), net)
650 # strict=True and host bits set
651 with self.assertRaises(ValueError):
652 ipaddress.IPv4Network(('192.0.2.1', 24))
653 with self.assertRaises(ValueError):
654 ipaddress.IPv4Network((ip, 24))
655 with self.assertRaises(ValueError):
656 ipaddress.IPv4Network((3221225985, 24))
657 with self.assertRaises(ValueError):
658 ipaddress.IPv4Network(('192.0.2.1', '255.255.255.0'))
659 with self.assertRaises(ValueError):
660 ipaddress.IPv4Network((ip, '255.255.255.0'))
661 with self.assertRaises(ValueError):
662 ipaddress.IPv4Network((3221225985, '255.255.255.0'))
663 # strict=False and host bits set
664 net = ipaddress.IPv4Network('192.0.2.0/24')
665 self.assertEqual(ipaddress.IPv4Network(('192.0.2.1', 24),
666 strict=False), net)
667 self.assertEqual(ipaddress.IPv4Network((ip, 24),
668 strict=False), net)
669 self.assertEqual(ipaddress.IPv4Network((3221225985, 24),
670 strict=False), net)
671 self.assertEqual(ipaddress.IPv4Network(('192.0.2.1',
672 '255.255.255.0'),
673 strict=False), net)
674 self.assertEqual(ipaddress.IPv4Network((ip,
675 '255.255.255.0'),
676 strict=False), net)
677 self.assertEqual(ipaddress.IPv4Network((3221225985,
678 '255.255.255.0'),
679 strict=False), net)
680
681 # /24
682 ip = ipaddress.IPv4Address('192.0.2.0')
683 net = ipaddress.IPv4Network('192.0.2.0/24')
684 self.assertEqual(ipaddress.IPv4Network(('192.0.2.0',
685 '255.255.255.0')), net)
686 self.assertEqual(ipaddress.IPv4Network((ip,
687 '255.255.255.0')), net)
688 self.assertEqual(ipaddress.IPv4Network((3221225984,
689 '255.255.255.0')), net)
690 self.assertEqual(ipaddress.IPv4Network(('192.0.2.0', 24)), net)
691 self.assertEqual(ipaddress.IPv4Network((ip, 24)), net)
692 self.assertEqual(ipaddress.IPv4Network((3221225984, 24)), net)
693
694 self.assertEqual(ipaddress.IPv4Interface(('192.0.2.1', 24)),
695 ipaddress.IPv4Interface('192.0.2.1/24'))
696 self.assertEqual(ipaddress.IPv4Interface((3221225985, 24)),
697 ipaddress.IPv4Interface('192.0.2.1/24'))
698
699 # issue #16531: constructing IPv6Network from a (address, mask) tuple
700 def testIPv6Tuple(self):
701 # /128
702 ip = ipaddress.IPv6Address('2001:db8::')
703 net = ipaddress.IPv6Network('2001:db8::/128')
704 self.assertEqual(ipaddress.IPv6Network(('2001:db8::', '128')),
705 net)
706 self.assertEqual(ipaddress.IPv6Network(
707 (42540766411282592856903984951653826560, 128)),
708 net)
709 self.assertEqual(ipaddress.IPv6Network((ip, '128')),
710 net)
711 ip = ipaddress.IPv6Address('2001:db8::')
712 net = ipaddress.IPv6Network('2001:db8::/96')
713 self.assertEqual(ipaddress.IPv6Network(('2001:db8::', '96')),
714 net)
715 self.assertEqual(ipaddress.IPv6Network(
716 (42540766411282592856903984951653826560, 96)),
717 net)
718 self.assertEqual(ipaddress.IPv6Network((ip, '96')),
719 net)
720
721 # strict=True and host bits set
722 ip = ipaddress.IPv6Address('2001:db8::1')
723 with self.assertRaises(ValueError):
724 ipaddress.IPv6Network(('2001:db8::1', 96))
725 with self.assertRaises(ValueError):
726 ipaddress.IPv6Network((
727 42540766411282592856903984951653826561, 96))
728 with self.assertRaises(ValueError):
729 ipaddress.IPv6Network((ip, 96))
730 # strict=False and host bits set
731 net = ipaddress.IPv6Network('2001:db8::/96')
732 self.assertEqual(ipaddress.IPv6Network(('2001:db8::1', 96),
733 strict=False),
734 net)
735 self.assertEqual(ipaddress.IPv6Network(
736 (42540766411282592856903984951653826561, 96),
737 strict=False),
738 net)
739 self.assertEqual(ipaddress.IPv6Network((ip, 96), strict=False),
740 net)
741
742 # /96
743 self.assertEqual(ipaddress.IPv6Interface(('2001:db8::1', '96')),
744 ipaddress.IPv6Interface('2001:db8::1/96'))
745 self.assertEqual(ipaddress.IPv6Interface(
746 (42540766411282592856903984951653826561, '96')),
747 ipaddress.IPv6Interface('2001:db8::1/96'))
748
Nick Coghlandc9b2552012-05-20 21:01:57 +1000749 # issue57
750 def testAddressIntMath(self):
751 self.assertEqual(ipaddress.IPv4Address('1.1.1.1') + 255,
752 ipaddress.IPv4Address('1.1.2.0'))
753 self.assertEqual(ipaddress.IPv4Address('1.1.1.1') - 256,
754 ipaddress.IPv4Address('1.1.0.1'))
755 self.assertEqual(ipaddress.IPv6Address('::1') + (2**16 - 2),
756 ipaddress.IPv6Address('::ffff'))
757 self.assertEqual(ipaddress.IPv6Address('::ffff') - (2**16 - 2),
758 ipaddress.IPv6Address('::1'))
759
Nick Coghlan3c2570c2012-07-07 01:13:55 +1000760 def testInvalidIntToBytes(self):
761 self.assertRaises(ValueError, ipaddress.v4_int_to_packed, -1)
762 self.assertRaises(ValueError, ipaddress.v4_int_to_packed,
763 2 ** ipaddress.IPV4LENGTH)
764 self.assertRaises(ValueError, ipaddress.v6_int_to_packed, -1)
765 self.assertRaises(ValueError, ipaddress.v6_int_to_packed,
766 2 ** ipaddress.IPV6LENGTH)
767
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200768 def testInternals(self):
769 first, last = ipaddress._find_address_range([
770 ipaddress.IPv4Address('10.10.10.10'),
771 ipaddress.IPv4Address('10.10.10.12')])
772 self.assertEqual(first, last)
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200773 self.assertEqual(128, ipaddress._count_righthand_zero_bits(0, 128))
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200774 self.assertEqual("IPv4Network('1.2.3.0/24')", repr(self.ipv4_network))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000775
Nick Coghland9722652012-06-17 16:33:00 +1000776 def testMissingAddressVersion(self):
777 class Broken(ipaddress._BaseAddress):
778 pass
779 broken = Broken('127.0.0.1')
780 with self.assertRaisesRegex(NotImplementedError, "Broken.*version"):
781 broken.version
782
783 def testMissingNetworkVersion(self):
784 class Broken(ipaddress._BaseNetwork):
785 pass
786 broken = Broken('127.0.0.1')
787 with self.assertRaisesRegex(NotImplementedError, "Broken.*version"):
788 broken.version
789
790 def testMissingAddressClass(self):
791 class Broken(ipaddress._BaseNetwork):
792 pass
793 broken = Broken('127.0.0.1')
794 with self.assertRaisesRegex(NotImplementedError, "Broken.*address"):
795 broken._address_class
796
Nick Coghlandc9b2552012-05-20 21:01:57 +1000797 def testGetNetwork(self):
798 self.assertEqual(int(self.ipv4_network.network_address), 16909056)
799 self.assertEqual(str(self.ipv4_network.network_address), '1.2.3.0')
800
801 self.assertEqual(int(self.ipv6_network.network_address),
802 42540616829182469433403647294022090752)
803 self.assertEqual(str(self.ipv6_network.network_address),
804 '2001:658:22a:cafe::')
805 self.assertEqual(str(self.ipv6_network.hostmask),
806 '::ffff:ffff:ffff:ffff')
807
Nick Coghlandc9b2552012-05-20 21:01:57 +1000808 def testIpFromInt(self):
809 self.assertEqual(self.ipv4_interface._ip,
810 ipaddress.IPv4Interface(16909060)._ip)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000811
812 ipv4 = ipaddress.ip_network('1.2.3.4')
813 ipv6 = ipaddress.ip_network('2001:658:22a:cafe:200:0:0:1')
Nick Coghlan730f67f2012-08-05 22:02:18 +1000814 self.assertEqual(ipv4, ipaddress.ip_network(int(ipv4.network_address)))
815 self.assertEqual(ipv6, ipaddress.ip_network(int(ipv6.network_address)))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000816
817 v6_int = 42540616829182469433547762482097946625
818 self.assertEqual(self.ipv6_interface._ip,
819 ipaddress.IPv6Interface(v6_int)._ip)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000820
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200821 self.assertEqual(ipaddress.ip_network(self.ipv4_address._ip).version,
822 4)
823 self.assertEqual(ipaddress.ip_network(self.ipv6_address._ip).version,
824 6)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000825
826 def testIpFromPacked(self):
Nick Coghlan5cf896f2012-07-07 01:43:31 +1000827 address = ipaddress.ip_address
Nick Coghlandc9b2552012-05-20 21:01:57 +1000828 self.assertEqual(self.ipv4_interface._ip,
Nick Coghlan5cf896f2012-07-07 01:43:31 +1000829 ipaddress.ip_interface(b'\x01\x02\x03\x04')._ip)
830 self.assertEqual(address('255.254.253.252'),
831 address(b'\xff\xfe\xfd\xfc'))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000832 self.assertEqual(self.ipv6_interface.ip,
833 ipaddress.ip_interface(
Nick Coghlan5cf896f2012-07-07 01:43:31 +1000834 b'\x20\x01\x06\x58\x02\x2a\xca\xfe'
835 b'\x02\x00\x00\x00\x00\x00\x00\x01').ip)
836 self.assertEqual(address('ffff:2:3:4:ffff::'),
837 address(b'\xff\xff\x00\x02\x00\x03\x00\x04' +
838 b'\xff\xff' + b'\x00' * 6))
839 self.assertEqual(address('::'),
840 address(b'\x00' * 16))
841
Nick Coghlandc9b2552012-05-20 21:01:57 +1000842 def testGetIp(self):
843 self.assertEqual(int(self.ipv4_interface.ip), 16909060)
844 self.assertEqual(str(self.ipv4_interface.ip), '1.2.3.4')
845
846 self.assertEqual(int(self.ipv6_interface.ip),
847 42540616829182469433547762482097946625)
848 self.assertEqual(str(self.ipv6_interface.ip),
849 '2001:658:22a:cafe:200::1')
850
851 def testGetNetmask(self):
852 self.assertEqual(int(self.ipv4_network.netmask), 4294967040)
853 self.assertEqual(str(self.ipv4_network.netmask), '255.255.255.0')
854 self.assertEqual(int(self.ipv6_network.netmask),
855 340282366920938463444927863358058659840)
856 self.assertEqual(self.ipv6_network.prefixlen, 64)
857
858 def testZeroNetmask(self):
859 ipv4_zero_netmask = ipaddress.IPv4Interface('1.2.3.4/0')
860 self.assertEqual(int(ipv4_zero_netmask.network.netmask), 0)
Nick Coghlan932346f2014-02-08 23:17:36 +1000861 self.assertEqual(ipv4_zero_netmask._prefix_from_prefix_string('0'), 0)
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200862 self.assertTrue(ipv4_zero_netmask._is_valid_netmask('0'))
863 self.assertTrue(ipv4_zero_netmask._is_valid_netmask('0.0.0.0'))
864 self.assertFalse(ipv4_zero_netmask._is_valid_netmask('invalid'))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000865
866 ipv6_zero_netmask = ipaddress.IPv6Interface('::1/0')
867 self.assertEqual(int(ipv6_zero_netmask.network.netmask), 0)
Nick Coghlan932346f2014-02-08 23:17:36 +1000868 self.assertEqual(ipv6_zero_netmask._prefix_from_prefix_string('0'), 0)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000869
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200870 def testIPv4NetAndHostmasks(self):
871 net = self.ipv4_network
872 self.assertFalse(net._is_valid_netmask('invalid'))
873 self.assertTrue(net._is_valid_netmask('128.128.128.128'))
874 self.assertFalse(net._is_valid_netmask('128.128.128.127'))
875 self.assertFalse(net._is_valid_netmask('128.128.128.255'))
876 self.assertTrue(net._is_valid_netmask('255.128.128.128'))
877
878 self.assertFalse(net._is_hostmask('invalid'))
879 self.assertTrue(net._is_hostmask('128.255.255.255'))
880 self.assertFalse(net._is_hostmask('255.255.255.255'))
881 self.assertFalse(net._is_hostmask('1.2.3.4'))
882
883 net = ipaddress.IPv4Network('127.0.0.0/0.0.0.255')
Nick Coghlan932346f2014-02-08 23:17:36 +1000884 self.assertEqual(net.prefixlen, 24)
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200885
Nick Coghlandc9b2552012-05-20 21:01:57 +1000886 def testGetBroadcast(self):
887 self.assertEqual(int(self.ipv4_network.broadcast_address), 16909311)
888 self.assertEqual(str(self.ipv4_network.broadcast_address), '1.2.3.255')
889
890 self.assertEqual(int(self.ipv6_network.broadcast_address),
891 42540616829182469451850391367731642367)
892 self.assertEqual(str(self.ipv6_network.broadcast_address),
893 '2001:658:22a:cafe:ffff:ffff:ffff:ffff')
894
895 def testGetPrefixlen(self):
Nick Coghlane3ded952012-08-05 22:45:22 +1000896 self.assertEqual(self.ipv4_interface.network.prefixlen, 24)
897 self.assertEqual(self.ipv6_interface.network.prefixlen, 64)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000898
899 def testGetSupernet(self):
900 self.assertEqual(self.ipv4_network.supernet().prefixlen, 23)
901 self.assertEqual(str(self.ipv4_network.supernet().network_address),
902 '1.2.2.0')
903 self.assertEqual(
904 ipaddress.IPv4Interface('0.0.0.0/0').network.supernet(),
905 ipaddress.IPv4Network('0.0.0.0/0'))
906
907 self.assertEqual(self.ipv6_network.supernet().prefixlen, 63)
908 self.assertEqual(str(self.ipv6_network.supernet().network_address),
909 '2001:658:22a:cafe::')
910 self.assertEqual(ipaddress.IPv6Interface('::0/0').network.supernet(),
911 ipaddress.IPv6Network('::0/0'))
912
913 def testGetSupernet3(self):
914 self.assertEqual(self.ipv4_network.supernet(3).prefixlen, 21)
915 self.assertEqual(str(self.ipv4_network.supernet(3).network_address),
916 '1.2.0.0')
917
918 self.assertEqual(self.ipv6_network.supernet(3).prefixlen, 61)
919 self.assertEqual(str(self.ipv6_network.supernet(3).network_address),
920 '2001:658:22a:caf8::')
921
922 def testGetSupernet4(self):
923 self.assertRaises(ValueError, self.ipv4_network.supernet,
924 prefixlen_diff=2, new_prefix=1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200925 self.assertRaises(ValueError, self.ipv4_network.supernet,
926 new_prefix=25)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000927 self.assertEqual(self.ipv4_network.supernet(prefixlen_diff=2),
928 self.ipv4_network.supernet(new_prefix=22))
929
930 self.assertRaises(ValueError, self.ipv6_network.supernet,
931 prefixlen_diff=2, new_prefix=1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200932 self.assertRaises(ValueError, self.ipv6_network.supernet,
933 new_prefix=65)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000934 self.assertEqual(self.ipv6_network.supernet(prefixlen_diff=2),
935 self.ipv6_network.supernet(new_prefix=62))
936
937 def testHosts(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200938 hosts = list(self.ipv4_network.hosts())
939 self.assertEqual(254, len(hosts))
940 self.assertEqual(ipaddress.IPv4Address('1.2.3.1'), hosts[0])
941 self.assertEqual(ipaddress.IPv4Address('1.2.3.254'), hosts[-1])
942
943 # special case where only 1 bit is left for address
Nick Coghlandc9b2552012-05-20 21:01:57 +1000944 self.assertEqual([ipaddress.IPv4Address('2.0.0.0'),
945 ipaddress.IPv4Address('2.0.0.1')],
946 list(ipaddress.ip_network('2.0.0.0/31').hosts()))
947
948 def testFancySubnetting(self):
949 self.assertEqual(sorted(self.ipv4_network.subnets(prefixlen_diff=3)),
950 sorted(self.ipv4_network.subnets(new_prefix=27)))
951 self.assertRaises(ValueError, list,
952 self.ipv4_network.subnets(new_prefix=23))
953 self.assertRaises(ValueError, list,
954 self.ipv4_network.subnets(prefixlen_diff=3,
955 new_prefix=27))
956 self.assertEqual(sorted(self.ipv6_network.subnets(prefixlen_diff=4)),
957 sorted(self.ipv6_network.subnets(new_prefix=68)))
958 self.assertRaises(ValueError, list,
959 self.ipv6_network.subnets(new_prefix=63))
960 self.assertRaises(ValueError, list,
961 self.ipv6_network.subnets(prefixlen_diff=4,
962 new_prefix=68))
963
964 def testGetSubnets(self):
965 self.assertEqual(list(self.ipv4_network.subnets())[0].prefixlen, 25)
966 self.assertEqual(str(list(
967 self.ipv4_network.subnets())[0].network_address),
968 '1.2.3.0')
969 self.assertEqual(str(list(
970 self.ipv4_network.subnets())[1].network_address),
971 '1.2.3.128')
972
973 self.assertEqual(list(self.ipv6_network.subnets())[0].prefixlen, 65)
974
975 def testGetSubnetForSingle32(self):
976 ip = ipaddress.IPv4Network('1.2.3.4/32')
977 subnets1 = [str(x) for x in ip.subnets()]
978 subnets2 = [str(x) for x in ip.subnets(2)]
979 self.assertEqual(subnets1, ['1.2.3.4/32'])
980 self.assertEqual(subnets1, subnets2)
981
982 def testGetSubnetForSingle128(self):
983 ip = ipaddress.IPv6Network('::1/128')
984 subnets1 = [str(x) for x in ip.subnets()]
985 subnets2 = [str(x) for x in ip.subnets(2)]
986 self.assertEqual(subnets1, ['::1/128'])
987 self.assertEqual(subnets1, subnets2)
988
989 def testSubnet2(self):
990 ips = [str(x) for x in self.ipv4_network.subnets(2)]
991 self.assertEqual(
992 ips,
993 ['1.2.3.0/26', '1.2.3.64/26', '1.2.3.128/26', '1.2.3.192/26'])
994
995 ipsv6 = [str(x) for x in self.ipv6_network.subnets(2)]
996 self.assertEqual(
997 ipsv6,
998 ['2001:658:22a:cafe::/66',
999 '2001:658:22a:cafe:4000::/66',
1000 '2001:658:22a:cafe:8000::/66',
1001 '2001:658:22a:cafe:c000::/66'])
1002
1003 def testSubnetFailsForLargeCidrDiff(self):
1004 self.assertRaises(ValueError, list,
1005 self.ipv4_interface.network.subnets(9))
1006 self.assertRaises(ValueError, list,
1007 self.ipv4_network.subnets(9))
1008 self.assertRaises(ValueError, list,
1009 self.ipv6_interface.network.subnets(65))
1010 self.assertRaises(ValueError, list,
1011 self.ipv6_network.subnets(65))
1012
1013 def testSupernetFailsForLargeCidrDiff(self):
1014 self.assertRaises(ValueError,
1015 self.ipv4_interface.network.supernet, 25)
1016 self.assertRaises(ValueError,
1017 self.ipv6_interface.network.supernet, 65)
1018
1019 def testSubnetFailsForNegativeCidrDiff(self):
1020 self.assertRaises(ValueError, list,
1021 self.ipv4_interface.network.subnets(-1))
1022 self.assertRaises(ValueError, list,
Nick Coghlan2c589102012-05-27 01:03:25 +10001023 self.ipv4_network.subnets(-1))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001024 self.assertRaises(ValueError, list,
1025 self.ipv6_interface.network.subnets(-1))
1026 self.assertRaises(ValueError, list,
1027 self.ipv6_network.subnets(-1))
1028
1029 def testGetNum_Addresses(self):
1030 self.assertEqual(self.ipv4_network.num_addresses, 256)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001031 self.assertEqual(list(self.ipv4_network.subnets())[0].num_addresses,
1032 128)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001033 self.assertEqual(self.ipv4_network.supernet().num_addresses, 512)
1034
1035 self.assertEqual(self.ipv6_network.num_addresses, 18446744073709551616)
1036 self.assertEqual(list(self.ipv6_network.subnets())[0].num_addresses,
1037 9223372036854775808)
1038 self.assertEqual(self.ipv6_network.supernet().num_addresses,
1039 36893488147419103232)
1040
1041 def testContains(self):
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001042 self.assertIn(ipaddress.IPv4Interface('1.2.3.128/25'),
1043 self.ipv4_network)
1044 self.assertNotIn(ipaddress.IPv4Interface('1.2.4.1/24'),
Nick Coghlandc9b2552012-05-20 21:01:57 +10001045 self.ipv4_network)
1046 # We can test addresses and string as well.
1047 addr1 = ipaddress.IPv4Address('1.2.3.37')
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001048 self.assertIn(addr1, self.ipv4_network)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001049 # issue 61, bad network comparison on like-ip'd network objects
1050 # with identical broadcast addresses.
1051 self.assertFalse(ipaddress.IPv4Network('1.1.0.0/16').__contains__(
1052 ipaddress.IPv4Network('1.0.0.0/15')))
1053
Nick Coghlandc9b2552012-05-20 21:01:57 +10001054 def testNth(self):
1055 self.assertEqual(str(self.ipv4_network[5]), '1.2.3.5')
1056 self.assertRaises(IndexError, self.ipv4_network.__getitem__, 256)
1057
1058 self.assertEqual(str(self.ipv6_network[5]),
1059 '2001:658:22a:cafe::5')
1060
1061 def testGetitem(self):
1062 # http://code.google.com/p/ipaddr-py/issues/detail?id=15
1063 addr = ipaddress.IPv4Network('172.31.255.128/255.255.255.240')
1064 self.assertEqual(28, addr.prefixlen)
1065 addr_list = list(addr)
1066 self.assertEqual('172.31.255.128', str(addr_list[0]))
1067 self.assertEqual('172.31.255.128', str(addr[0]))
1068 self.assertEqual('172.31.255.143', str(addr_list[-1]))
1069 self.assertEqual('172.31.255.143', str(addr[-1]))
1070 self.assertEqual(addr_list[-1], addr[-1])
1071
1072 def testEqual(self):
1073 self.assertTrue(self.ipv4_interface ==
1074 ipaddress.IPv4Interface('1.2.3.4/24'))
1075 self.assertFalse(self.ipv4_interface ==
1076 ipaddress.IPv4Interface('1.2.3.4/23'))
1077 self.assertFalse(self.ipv4_interface ==
1078 ipaddress.IPv6Interface('::1.2.3.4/24'))
1079 self.assertFalse(self.ipv4_interface == '')
1080 self.assertFalse(self.ipv4_interface == [])
1081 self.assertFalse(self.ipv4_interface == 2)
1082
1083 self.assertTrue(self.ipv6_interface ==
1084 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/64'))
1085 self.assertFalse(self.ipv6_interface ==
1086 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/63'))
1087 self.assertFalse(self.ipv6_interface ==
1088 ipaddress.IPv4Interface('1.2.3.4/23'))
1089 self.assertFalse(self.ipv6_interface == '')
1090 self.assertFalse(self.ipv6_interface == [])
1091 self.assertFalse(self.ipv6_interface == 2)
1092
1093 def testNotEqual(self):
1094 self.assertFalse(self.ipv4_interface !=
1095 ipaddress.IPv4Interface('1.2.3.4/24'))
1096 self.assertTrue(self.ipv4_interface !=
1097 ipaddress.IPv4Interface('1.2.3.4/23'))
1098 self.assertTrue(self.ipv4_interface !=
1099 ipaddress.IPv6Interface('::1.2.3.4/24'))
1100 self.assertTrue(self.ipv4_interface != '')
1101 self.assertTrue(self.ipv4_interface != [])
1102 self.assertTrue(self.ipv4_interface != 2)
1103
1104 self.assertTrue(self.ipv4_address !=
1105 ipaddress.IPv4Address('1.2.3.5'))
1106 self.assertTrue(self.ipv4_address != '')
1107 self.assertTrue(self.ipv4_address != [])
1108 self.assertTrue(self.ipv4_address != 2)
1109
1110 self.assertFalse(self.ipv6_interface !=
1111 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/64'))
1112 self.assertTrue(self.ipv6_interface !=
1113 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/63'))
1114 self.assertTrue(self.ipv6_interface !=
1115 ipaddress.IPv4Interface('1.2.3.4/23'))
1116 self.assertTrue(self.ipv6_interface != '')
1117 self.assertTrue(self.ipv6_interface != [])
1118 self.assertTrue(self.ipv6_interface != 2)
1119
1120 self.assertTrue(self.ipv6_address !=
1121 ipaddress.IPv4Address('1.2.3.4'))
1122 self.assertTrue(self.ipv6_address != '')
1123 self.assertTrue(self.ipv6_address != [])
1124 self.assertTrue(self.ipv6_address != 2)
1125
1126 def testSlash32Constructor(self):
1127 self.assertEqual(str(ipaddress.IPv4Interface(
1128 '1.2.3.4/255.255.255.255')), '1.2.3.4/32')
1129
1130 def testSlash128Constructor(self):
1131 self.assertEqual(str(ipaddress.IPv6Interface('::1/128')),
1132 '::1/128')
1133
1134 def testSlash0Constructor(self):
1135 self.assertEqual(str(ipaddress.IPv4Interface('1.2.3.4/0.0.0.0')),
1136 '1.2.3.4/0')
1137
1138 def testCollapsing(self):
1139 # test only IP addresses including some duplicates
1140 ip1 = ipaddress.IPv4Address('1.1.1.0')
1141 ip2 = ipaddress.IPv4Address('1.1.1.1')
1142 ip3 = ipaddress.IPv4Address('1.1.1.2')
1143 ip4 = ipaddress.IPv4Address('1.1.1.3')
1144 ip5 = ipaddress.IPv4Address('1.1.1.4')
1145 ip6 = ipaddress.IPv4Address('1.1.1.0')
1146 # check that addreses are subsumed properly.
1147 collapsed = ipaddress.collapse_addresses(
1148 [ip1, ip2, ip3, ip4, ip5, ip6])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001149 self.assertEqual(list(collapsed),
1150 [ipaddress.IPv4Network('1.1.1.0/30'),
1151 ipaddress.IPv4Network('1.1.1.4/32')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001152
1153 # test a mix of IP addresses and networks including some duplicates
1154 ip1 = ipaddress.IPv4Address('1.1.1.0')
1155 ip2 = ipaddress.IPv4Address('1.1.1.1')
1156 ip3 = ipaddress.IPv4Address('1.1.1.2')
1157 ip4 = ipaddress.IPv4Address('1.1.1.3')
1158 #ip5 = ipaddress.IPv4Interface('1.1.1.4/30')
1159 #ip6 = ipaddress.IPv4Interface('1.1.1.4/30')
1160 # check that addreses are subsumed properly.
1161 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3, ip4])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001162 self.assertEqual(list(collapsed),
1163 [ipaddress.IPv4Network('1.1.1.0/30')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001164
1165 # test only IP networks
1166 ip1 = ipaddress.IPv4Network('1.1.0.0/24')
1167 ip2 = ipaddress.IPv4Network('1.1.1.0/24')
1168 ip3 = ipaddress.IPv4Network('1.1.2.0/24')
1169 ip4 = ipaddress.IPv4Network('1.1.3.0/24')
1170 ip5 = ipaddress.IPv4Network('1.1.4.0/24')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001171 # stored in no particular order b/c we want CollapseAddr to call
1172 # [].sort
Nick Coghlandc9b2552012-05-20 21:01:57 +10001173 ip6 = ipaddress.IPv4Network('1.1.0.0/22')
1174 # check that addreses are subsumed properly.
1175 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3, ip4, ip5,
1176 ip6])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001177 self.assertEqual(list(collapsed),
1178 [ipaddress.IPv4Network('1.1.0.0/22'),
1179 ipaddress.IPv4Network('1.1.4.0/24')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001180
1181 # test that two addresses are supernet'ed properly
1182 collapsed = ipaddress.collapse_addresses([ip1, ip2])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001183 self.assertEqual(list(collapsed),
1184 [ipaddress.IPv4Network('1.1.0.0/23')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001185
1186 # test same IP networks
1187 ip_same1 = ip_same2 = ipaddress.IPv4Network('1.1.1.1/32')
1188 self.assertEqual(list(ipaddress.collapse_addresses(
1189 [ip_same1, ip_same2])),
1190 [ip_same1])
1191
1192 # test same IP addresses
1193 ip_same1 = ip_same2 = ipaddress.IPv4Address('1.1.1.1')
1194 self.assertEqual(list(ipaddress.collapse_addresses(
1195 [ip_same1, ip_same2])),
1196 [ipaddress.ip_network('1.1.1.1/32')])
1197 ip1 = ipaddress.IPv6Network('2001::/100')
1198 ip2 = ipaddress.IPv6Network('2001::/120')
1199 ip3 = ipaddress.IPv6Network('2001::/96')
1200 # test that ipv6 addresses are subsumed properly.
1201 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3])
1202 self.assertEqual(list(collapsed), [ip3])
1203
1204 # the toejam test
Hynek Schlawack35db5132012-06-01 20:12:17 +02001205 addr_tuples = [
1206 (ipaddress.ip_address('1.1.1.1'),
1207 ipaddress.ip_address('::1')),
1208 (ipaddress.IPv4Network('1.1.0.0/24'),
1209 ipaddress.IPv6Network('2001::/120')),
1210 (ipaddress.IPv4Network('1.1.0.0/32'),
1211 ipaddress.IPv6Network('2001::/128')),
1212 ]
1213 for ip1, ip2 in addr_tuples:
1214 self.assertRaises(TypeError, ipaddress.collapse_addresses,
1215 [ip1, ip2])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001216
1217 def testSummarizing(self):
1218 #ip = ipaddress.ip_address
1219 #ipnet = ipaddress.ip_network
1220 summarize = ipaddress.summarize_address_range
1221 ip1 = ipaddress.ip_address('1.1.1.0')
1222 ip2 = ipaddress.ip_address('1.1.1.255')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001223
1224 # summarize works only for IPv4 & IPv6
1225 class IPv7Address(ipaddress.IPv6Address):
1226 @property
1227 def version(self):
1228 return 7
1229 ip_invalid1 = IPv7Address('::1')
1230 ip_invalid2 = IPv7Address('::1')
1231 self.assertRaises(ValueError, list,
1232 summarize(ip_invalid1, ip_invalid2))
1233 # test that a summary over ip4 & ip6 fails
1234 self.assertRaises(TypeError, list,
1235 summarize(ip1, ipaddress.IPv6Address('::1')))
1236 # test a /24 is summarized properly
Nick Coghlandc9b2552012-05-20 21:01:57 +10001237 self.assertEqual(list(summarize(ip1, ip2))[0],
1238 ipaddress.ip_network('1.1.1.0/24'))
1239 # test an IPv4 range that isn't on a network byte boundary
1240 ip2 = ipaddress.ip_address('1.1.1.8')
1241 self.assertEqual(list(summarize(ip1, ip2)),
1242 [ipaddress.ip_network('1.1.1.0/29'),
1243 ipaddress.ip_network('1.1.1.8')])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001244 # all!
1245 ip1 = ipaddress.IPv4Address(0)
1246 ip2 = ipaddress.IPv4Address(ipaddress.IPv4Address._ALL_ONES)
1247 self.assertEqual([ipaddress.IPv4Network('0.0.0.0/0')],
1248 list(summarize(ip1, ip2)))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001249
1250 ip1 = ipaddress.ip_address('1::')
1251 ip2 = ipaddress.ip_address('1:ffff:ffff:ffff:ffff:ffff:ffff:ffff')
1252 # test a IPv6 is sumamrized properly
1253 self.assertEqual(list(summarize(ip1, ip2))[0],
1254 ipaddress.ip_network('1::/16'))
1255 # test an IPv6 range that isn't on a network byte boundary
1256 ip2 = ipaddress.ip_address('2::')
1257 self.assertEqual(list(summarize(ip1, ip2)),
1258 [ipaddress.ip_network('1::/16'),
1259 ipaddress.ip_network('2::/128')])
1260
1261 # test exception raised when first is greater than last
1262 self.assertRaises(ValueError, list,
1263 summarize(ipaddress.ip_address('1.1.1.0'),
1264 ipaddress.ip_address('1.1.0.0')))
1265 # test exception raised when first and last aren't IP addresses
1266 self.assertRaises(TypeError, list,
1267 summarize(ipaddress.ip_network('1.1.1.0'),
1268 ipaddress.ip_network('1.1.0.0')))
1269 self.assertRaises(TypeError, list,
1270 summarize(ipaddress.ip_network('1.1.1.0'),
1271 ipaddress.ip_network('1.1.0.0')))
1272 # test exception raised when first and last are not same version
1273 self.assertRaises(TypeError, list,
1274 summarize(ipaddress.ip_address('::'),
1275 ipaddress.ip_network('1.1.0.0')))
1276
1277 def testAddressComparison(self):
1278 self.assertTrue(ipaddress.ip_address('1.1.1.1') <=
1279 ipaddress.ip_address('1.1.1.1'))
1280 self.assertTrue(ipaddress.ip_address('1.1.1.1') <=
1281 ipaddress.ip_address('1.1.1.2'))
1282 self.assertTrue(ipaddress.ip_address('::1') <=
1283 ipaddress.ip_address('::1'))
1284 self.assertTrue(ipaddress.ip_address('::1') <=
1285 ipaddress.ip_address('::2'))
1286
Nick Coghlan3008ec02012-07-08 00:45:33 +10001287 def testInterfaceComparison(self):
1288 self.assertTrue(ipaddress.ip_interface('1.1.1.1') <=
1289 ipaddress.ip_interface('1.1.1.1'))
1290 self.assertTrue(ipaddress.ip_interface('1.1.1.1') <=
1291 ipaddress.ip_interface('1.1.1.2'))
1292 self.assertTrue(ipaddress.ip_interface('::1') <=
1293 ipaddress.ip_interface('::1'))
1294 self.assertTrue(ipaddress.ip_interface('::1') <=
1295 ipaddress.ip_interface('::2'))
1296
Nick Coghlandc9b2552012-05-20 21:01:57 +10001297 def testNetworkComparison(self):
1298 # ip1 and ip2 have the same network address
1299 ip1 = ipaddress.IPv4Network('1.1.1.0/24')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001300 ip2 = ipaddress.IPv4Network('1.1.1.0/32')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001301 ip3 = ipaddress.IPv4Network('1.1.2.0/24')
1302
1303 self.assertTrue(ip1 < ip3)
1304 self.assertTrue(ip3 > ip2)
1305
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001306 self.assertEqual(ip1.compare_networks(ip1), 0)
1307
1308 # if addresses are the same, sort by netmask
1309 self.assertEqual(ip1.compare_networks(ip2), -1)
1310 self.assertEqual(ip2.compare_networks(ip1), 1)
1311
Nick Coghlandc9b2552012-05-20 21:01:57 +10001312 self.assertEqual(ip1.compare_networks(ip3), -1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001313 self.assertEqual(ip3.compare_networks(ip1), 1)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001314 self.assertTrue(ip1._get_networks_key() < ip3._get_networks_key())
1315
1316 ip1 = ipaddress.IPv6Network('2001:2000::/96')
1317 ip2 = ipaddress.IPv6Network('2001:2001::/96')
1318 ip3 = ipaddress.IPv6Network('2001:ffff:2000::/96')
1319
1320 self.assertTrue(ip1 < ip3)
1321 self.assertTrue(ip3 > ip2)
1322 self.assertEqual(ip1.compare_networks(ip3), -1)
1323 self.assertTrue(ip1._get_networks_key() < ip3._get_networks_key())
1324
1325 # Test comparing different protocols.
1326 # Should always raise a TypeError.
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001327 self.assertRaises(TypeError,
1328 self.ipv4_network.compare_networks,
1329 self.ipv6_network)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001330 ipv6 = ipaddress.IPv6Interface('::/0')
1331 ipv4 = ipaddress.IPv4Interface('0.0.0.0/0')
1332 self.assertRaises(TypeError, ipv4.__lt__, ipv6)
1333 self.assertRaises(TypeError, ipv4.__gt__, ipv6)
1334 self.assertRaises(TypeError, ipv6.__lt__, ipv4)
1335 self.assertRaises(TypeError, ipv6.__gt__, ipv4)
1336
1337 # Regression test for issue 19.
1338 ip1 = ipaddress.ip_network('10.1.2.128/25')
1339 self.assertFalse(ip1 < ip1)
1340 self.assertFalse(ip1 > ip1)
1341 ip2 = ipaddress.ip_network('10.1.3.0/24')
1342 self.assertTrue(ip1 < ip2)
1343 self.assertFalse(ip2 < ip1)
1344 self.assertFalse(ip1 > ip2)
1345 self.assertTrue(ip2 > ip1)
1346 ip3 = ipaddress.ip_network('10.1.3.0/25')
1347 self.assertTrue(ip2 < ip3)
1348 self.assertFalse(ip3 < ip2)
1349 self.assertFalse(ip2 > ip3)
1350 self.assertTrue(ip3 > ip2)
1351
1352 # Regression test for issue 28.
1353 ip1 = ipaddress.ip_network('10.10.10.0/31')
1354 ip2 = ipaddress.ip_network('10.10.10.0')
1355 ip3 = ipaddress.ip_network('10.10.10.2/31')
1356 ip4 = ipaddress.ip_network('10.10.10.2')
1357 sorted = [ip1, ip2, ip3, ip4]
1358 unsorted = [ip2, ip4, ip1, ip3]
1359 unsorted.sort()
1360 self.assertEqual(sorted, unsorted)
1361 unsorted = [ip4, ip1, ip3, ip2]
1362 unsorted.sort()
1363 self.assertEqual(sorted, unsorted)
1364 self.assertRaises(TypeError, ip1.__lt__,
1365 ipaddress.ip_address('10.10.10.0'))
1366 self.assertRaises(TypeError, ip2.__lt__,
1367 ipaddress.ip_address('10.10.10.0'))
1368
1369 # <=, >=
1370 self.assertTrue(ipaddress.ip_network('1.1.1.1') <=
1371 ipaddress.ip_network('1.1.1.1'))
1372 self.assertTrue(ipaddress.ip_network('1.1.1.1') <=
1373 ipaddress.ip_network('1.1.1.2'))
1374 self.assertFalse(ipaddress.ip_network('1.1.1.2') <=
1375 ipaddress.ip_network('1.1.1.1'))
1376 self.assertTrue(ipaddress.ip_network('::1') <=
1377 ipaddress.ip_network('::1'))
1378 self.assertTrue(ipaddress.ip_network('::1') <=
1379 ipaddress.ip_network('::2'))
1380 self.assertFalse(ipaddress.ip_network('::2') <=
1381 ipaddress.ip_network('::1'))
1382
1383 def testStrictNetworks(self):
1384 self.assertRaises(ValueError, ipaddress.ip_network, '192.168.1.1/24')
1385 self.assertRaises(ValueError, ipaddress.ip_network, '::1/120')
1386
1387 def testOverlaps(self):
1388 other = ipaddress.IPv4Network('1.2.3.0/30')
1389 other2 = ipaddress.IPv4Network('1.2.2.0/24')
1390 other3 = ipaddress.IPv4Network('1.2.2.64/26')
1391 self.assertTrue(self.ipv4_network.overlaps(other))
1392 self.assertFalse(self.ipv4_network.overlaps(other2))
1393 self.assertTrue(other2.overlaps(other3))
1394
1395 def testEmbeddedIpv4(self):
1396 ipv4_string = '192.168.0.1'
1397 ipv4 = ipaddress.IPv4Interface(ipv4_string)
1398 v4compat_ipv6 = ipaddress.IPv6Interface('::%s' % ipv4_string)
1399 self.assertEqual(int(v4compat_ipv6.ip), int(ipv4.ip))
1400 v4mapped_ipv6 = ipaddress.IPv6Interface('::ffff:%s' % ipv4_string)
1401 self.assertNotEqual(v4mapped_ipv6.ip, ipv4.ip)
1402 self.assertRaises(ipaddress.AddressValueError, ipaddress.IPv6Interface,
1403 '2001:1.1.1.1:1.1.1.1')
1404
1405 # Issue 67: IPv6 with embedded IPv4 address not recognized.
1406 def testIPv6AddressTooLarge(self):
1407 # RFC4291 2.5.5.2
1408 self.assertEqual(ipaddress.ip_address('::FFFF:192.0.2.1'),
1409 ipaddress.ip_address('::FFFF:c000:201'))
1410 # RFC4291 2.2 (part 3) x::d.d.d.d
1411 self.assertEqual(ipaddress.ip_address('FFFF::192.0.2.1'),
1412 ipaddress.ip_address('FFFF::c000:201'))
1413
1414 def testIPVersion(self):
1415 self.assertEqual(self.ipv4_address.version, 4)
1416 self.assertEqual(self.ipv6_address.version, 6)
1417
1418 def testMaxPrefixLength(self):
1419 self.assertEqual(self.ipv4_interface.max_prefixlen, 32)
1420 self.assertEqual(self.ipv6_interface.max_prefixlen, 128)
1421
1422 def testPacked(self):
1423 self.assertEqual(self.ipv4_address.packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001424 b'\x01\x02\x03\x04')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001425 self.assertEqual(ipaddress.IPv4Interface('255.254.253.252').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001426 b'\xff\xfe\xfd\xfc')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001427 self.assertEqual(self.ipv6_address.packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001428 b'\x20\x01\x06\x58\x02\x2a\xca\xfe'
1429 b'\x02\x00\x00\x00\x00\x00\x00\x01')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001430 self.assertEqual(ipaddress.IPv6Interface('ffff:2:3:4:ffff::').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001431 b'\xff\xff\x00\x02\x00\x03\x00\x04\xff\xff'
1432 + b'\x00' * 6)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001433 self.assertEqual(ipaddress.IPv6Interface('::1:0:0:0:0').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001434 b'\x00' * 6 + b'\x00\x01' + b'\x00' * 8)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001435
Nick Coghlandc9b2552012-05-20 21:01:57 +10001436 def testIpType(self):
1437 ipv4net = ipaddress.ip_network('1.2.3.4')
1438 ipv4addr = ipaddress.ip_address('1.2.3.4')
1439 ipv6net = ipaddress.ip_network('::1.2.3.4')
1440 ipv6addr = ipaddress.ip_address('::1.2.3.4')
1441 self.assertEqual(ipaddress.IPv4Network, type(ipv4net))
1442 self.assertEqual(ipaddress.IPv4Address, type(ipv4addr))
1443 self.assertEqual(ipaddress.IPv6Network, type(ipv6net))
1444 self.assertEqual(ipaddress.IPv6Address, type(ipv6addr))
1445
1446 def testReservedIpv4(self):
1447 # test networks
1448 self.assertEqual(True, ipaddress.ip_interface(
1449 '224.1.1.1/31').is_multicast)
1450 self.assertEqual(False, ipaddress.ip_network('240.0.0.0').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001451 self.assertEqual(True, ipaddress.ip_network('240.0.0.0').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001452
1453 self.assertEqual(True, ipaddress.ip_interface(
1454 '192.168.1.1/17').is_private)
1455 self.assertEqual(False, ipaddress.ip_network('192.169.0.0').is_private)
1456 self.assertEqual(True, ipaddress.ip_network(
1457 '10.255.255.255').is_private)
1458 self.assertEqual(False, ipaddress.ip_network('11.0.0.0').is_private)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001459 self.assertEqual(False, ipaddress.ip_network('11.0.0.0').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001460 self.assertEqual(True, ipaddress.ip_network(
1461 '172.31.255.255').is_private)
1462 self.assertEqual(False, ipaddress.ip_network('172.32.0.0').is_private)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001463 self.assertEqual(True,
1464 ipaddress.ip_network('169.254.1.0/24').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001465
1466 self.assertEqual(True,
1467 ipaddress.ip_interface(
1468 '169.254.100.200/24').is_link_local)
1469 self.assertEqual(False,
1470 ipaddress.ip_interface(
1471 '169.255.100.200/24').is_link_local)
1472
1473 self.assertEqual(True,
1474 ipaddress.ip_network(
1475 '127.100.200.254/32').is_loopback)
1476 self.assertEqual(True, ipaddress.ip_network(
1477 '127.42.0.0/16').is_loopback)
1478 self.assertEqual(False, ipaddress.ip_network('128.0.0.0').is_loopback)
Peter Moodye5019d52013-10-24 09:47:10 -07001479 self.assertEqual(False,
1480 ipaddress.ip_network('100.64.0.0/10').is_private)
Peter Moodybe9c1b12013-10-22 12:36:21 -07001481 self.assertEqual(False, ipaddress.ip_network('100.64.0.0/10').is_global)
Peter Moodye5019d52013-10-24 09:47:10 -07001482
Peter Moody22c31762013-10-21 13:58:06 -07001483 self.assertEqual(True,
1484 ipaddress.ip_network('192.0.2.128/25').is_private)
1485 self.assertEqual(True,
1486 ipaddress.ip_network('192.0.3.0/24').is_global)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001487
1488 # test addresses
Hynek Schlawackbcd30442012-06-04 14:19:39 +02001489 self.assertEqual(True, ipaddress.ip_address('0.0.0.0').is_unspecified)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001490 self.assertEqual(True, ipaddress.ip_address('224.1.1.1').is_multicast)
1491 self.assertEqual(False, ipaddress.ip_address('240.0.0.0').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001492 self.assertEqual(True, ipaddress.ip_address('240.0.0.1').is_reserved)
1493 self.assertEqual(False,
1494 ipaddress.ip_address('239.255.255.255').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001495
1496 self.assertEqual(True, ipaddress.ip_address('192.168.1.1').is_private)
1497 self.assertEqual(False, ipaddress.ip_address('192.169.0.0').is_private)
1498 self.assertEqual(True, ipaddress.ip_address(
1499 '10.255.255.255').is_private)
1500 self.assertEqual(False, ipaddress.ip_address('11.0.0.0').is_private)
1501 self.assertEqual(True, ipaddress.ip_address(
1502 '172.31.255.255').is_private)
1503 self.assertEqual(False, ipaddress.ip_address('172.32.0.0').is_private)
1504
1505 self.assertEqual(True,
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001506 ipaddress.ip_address('169.254.100.200').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001507 self.assertEqual(False,
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001508 ipaddress.ip_address('169.255.100.200').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001509
1510 self.assertEqual(True,
1511 ipaddress.ip_address('127.100.200.254').is_loopback)
1512 self.assertEqual(True, ipaddress.ip_address('127.42.0.0').is_loopback)
1513 self.assertEqual(False, ipaddress.ip_address('128.0.0.0').is_loopback)
1514 self.assertEqual(True, ipaddress.ip_network('0.0.0.0').is_unspecified)
1515
1516 def testReservedIpv6(self):
1517
1518 self.assertEqual(True, ipaddress.ip_network('ffff::').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001519 self.assertEqual(True, ipaddress.ip_network(2**128 - 1).is_multicast)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001520 self.assertEqual(True, ipaddress.ip_network('ff00::').is_multicast)
1521 self.assertEqual(False, ipaddress.ip_network('fdff::').is_multicast)
1522
1523 self.assertEqual(True, ipaddress.ip_network('fecf::').is_site_local)
1524 self.assertEqual(True, ipaddress.ip_network(
1525 'feff:ffff:ffff:ffff::').is_site_local)
1526 self.assertEqual(False, ipaddress.ip_network(
1527 'fbf:ffff::').is_site_local)
1528 self.assertEqual(False, ipaddress.ip_network('ff00::').is_site_local)
1529
1530 self.assertEqual(True, ipaddress.ip_network('fc00::').is_private)
1531 self.assertEqual(True, ipaddress.ip_network(
1532 'fc00:ffff:ffff:ffff::').is_private)
1533 self.assertEqual(False, ipaddress.ip_network('fbff:ffff::').is_private)
1534 self.assertEqual(False, ipaddress.ip_network('fe00::').is_private)
1535
1536 self.assertEqual(True, ipaddress.ip_network('fea0::').is_link_local)
1537 self.assertEqual(True, ipaddress.ip_network(
1538 'febf:ffff::').is_link_local)
1539 self.assertEqual(False, ipaddress.ip_network(
1540 'fe7f:ffff::').is_link_local)
1541 self.assertEqual(False, ipaddress.ip_network('fec0::').is_link_local)
1542
1543 self.assertEqual(True, ipaddress.ip_interface('0:0::0:01').is_loopback)
1544 self.assertEqual(False, ipaddress.ip_interface('::1/127').is_loopback)
1545 self.assertEqual(False, ipaddress.ip_network('::').is_loopback)
1546 self.assertEqual(False, ipaddress.ip_network('::2').is_loopback)
1547
1548 self.assertEqual(True, ipaddress.ip_network('0::0').is_unspecified)
1549 self.assertEqual(False, ipaddress.ip_network('::1').is_unspecified)
1550 self.assertEqual(False, ipaddress.ip_network('::/127').is_unspecified)
1551
Peter Moody22c31762013-10-21 13:58:06 -07001552 self.assertEqual(True,
1553 ipaddress.ip_network('2001::1/128').is_private)
1554 self.assertEqual(True,
1555 ipaddress.ip_network('200::1/128').is_global)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001556 # test addresses
1557 self.assertEqual(True, ipaddress.ip_address('ffff::').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001558 self.assertEqual(True, ipaddress.ip_address(2**128 - 1).is_multicast)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001559 self.assertEqual(True, ipaddress.ip_address('ff00::').is_multicast)
1560 self.assertEqual(False, ipaddress.ip_address('fdff::').is_multicast)
1561
1562 self.assertEqual(True, ipaddress.ip_address('fecf::').is_site_local)
1563 self.assertEqual(True, ipaddress.ip_address(
1564 'feff:ffff:ffff:ffff::').is_site_local)
1565 self.assertEqual(False, ipaddress.ip_address(
1566 'fbf:ffff::').is_site_local)
1567 self.assertEqual(False, ipaddress.ip_address('ff00::').is_site_local)
1568
1569 self.assertEqual(True, ipaddress.ip_address('fc00::').is_private)
1570 self.assertEqual(True, ipaddress.ip_address(
1571 'fc00:ffff:ffff:ffff::').is_private)
1572 self.assertEqual(False, ipaddress.ip_address('fbff:ffff::').is_private)
1573 self.assertEqual(False, ipaddress.ip_address('fe00::').is_private)
1574
1575 self.assertEqual(True, ipaddress.ip_address('fea0::').is_link_local)
1576 self.assertEqual(True, ipaddress.ip_address(
1577 'febf:ffff::').is_link_local)
1578 self.assertEqual(False, ipaddress.ip_address(
1579 'fe7f:ffff::').is_link_local)
1580 self.assertEqual(False, ipaddress.ip_address('fec0::').is_link_local)
1581
1582 self.assertEqual(True, ipaddress.ip_address('0:0::0:01').is_loopback)
1583 self.assertEqual(True, ipaddress.ip_address('::1').is_loopback)
1584 self.assertEqual(False, ipaddress.ip_address('::2').is_loopback)
1585
1586 self.assertEqual(True, ipaddress.ip_address('0::0').is_unspecified)
1587 self.assertEqual(False, ipaddress.ip_address('::1').is_unspecified)
1588
1589 # some generic IETF reserved addresses
1590 self.assertEqual(True, ipaddress.ip_address('100::').is_reserved)
1591 self.assertEqual(True, ipaddress.ip_network('4000::1/128').is_reserved)
1592
1593 def testIpv4Mapped(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001594 self.assertEqual(
1595 ipaddress.ip_address('::ffff:192.168.1.1').ipv4_mapped,
1596 ipaddress.ip_address('192.168.1.1'))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001597 self.assertEqual(ipaddress.ip_address('::c0a8:101').ipv4_mapped, None)
1598 self.assertEqual(ipaddress.ip_address('::ffff:c0a8:101').ipv4_mapped,
1599 ipaddress.ip_address('192.168.1.1'))
1600
1601 def testAddrExclude(self):
1602 addr1 = ipaddress.ip_network('10.1.1.0/24')
1603 addr2 = ipaddress.ip_network('10.1.1.0/26')
1604 addr3 = ipaddress.ip_network('10.2.1.0/24')
1605 addr4 = ipaddress.ip_address('10.1.1.0')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001606 addr5 = ipaddress.ip_network('2001:db8::0/32')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001607 self.assertEqual(sorted(list(addr1.address_exclude(addr2))),
1608 [ipaddress.ip_network('10.1.1.64/26'),
1609 ipaddress.ip_network('10.1.1.128/25')])
1610 self.assertRaises(ValueError, list, addr1.address_exclude(addr3))
1611 self.assertRaises(TypeError, list, addr1.address_exclude(addr4))
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001612 self.assertRaises(TypeError, list, addr1.address_exclude(addr5))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001613 self.assertEqual(list(addr1.address_exclude(addr1)), [])
1614
1615 def testHash(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001616 self.assertEqual(hash(ipaddress.ip_interface('10.1.1.0/24')),
1617 hash(ipaddress.ip_interface('10.1.1.0/24')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001618 self.assertEqual(hash(ipaddress.ip_network('10.1.1.0/24')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001619 hash(ipaddress.ip_network('10.1.1.0/24')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001620 self.assertEqual(hash(ipaddress.ip_address('10.1.1.0')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001621 hash(ipaddress.ip_address('10.1.1.0')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001622 # i70
1623 self.assertEqual(hash(ipaddress.ip_address('1.2.3.4')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001624 hash(ipaddress.ip_address(
Nick Coghlandc9b2552012-05-20 21:01:57 +10001625 int(ipaddress.ip_address('1.2.3.4')._ip))))
1626 ip1 = ipaddress.ip_address('10.1.1.0')
1627 ip2 = ipaddress.ip_address('1::')
1628 dummy = {}
1629 dummy[self.ipv4_address] = None
1630 dummy[self.ipv6_address] = None
1631 dummy[ip1] = None
1632 dummy[ip2] = None
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001633 self.assertIn(self.ipv4_address, dummy)
1634 self.assertIn(ip2, dummy)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001635
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001636 def testIPBases(self):
1637 net = self.ipv4_network
1638 self.assertEqual('1.2.3.0/24', net.compressed)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001639 net = self.ipv6_network
1640 self.assertRaises(ValueError, net._string_from_ip_int, 2**128 + 1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001641
Hynek Schlawack454a74d2012-06-04 18:14:02 +02001642 def testIPv6NetworkHelpers(self):
1643 net = self.ipv6_network
1644 self.assertEqual('2001:658:22a:cafe::/64', net.with_prefixlen)
1645 self.assertEqual('2001:658:22a:cafe::/ffff:ffff:ffff:ffff::',
1646 net.with_netmask)
1647 self.assertEqual('2001:658:22a:cafe::/::ffff:ffff:ffff:ffff',
1648 net.with_hostmask)
1649 self.assertEqual('2001:658:22a:cafe::/64', str(net))
1650
1651 def testIPv4NetworkHelpers(self):
1652 net = self.ipv4_network
1653 self.assertEqual('1.2.3.0/24', net.with_prefixlen)
1654 self.assertEqual('1.2.3.0/255.255.255.0', net.with_netmask)
1655 self.assertEqual('1.2.3.0/0.0.0.255', net.with_hostmask)
1656 self.assertEqual('1.2.3.0/24', str(net))
1657
Nick Coghlandc9b2552012-05-20 21:01:57 +10001658 def testCopyConstructor(self):
1659 addr1 = ipaddress.ip_network('10.1.1.0/24')
1660 addr2 = ipaddress.ip_network(addr1)
1661 addr3 = ipaddress.ip_interface('2001:658:22a:cafe:200::1/64')
1662 addr4 = ipaddress.ip_interface(addr3)
1663 addr5 = ipaddress.IPv4Address('1.1.1.1')
1664 addr6 = ipaddress.IPv6Address('2001:658:22a:cafe:200::1')
1665
1666 self.assertEqual(addr1, addr2)
1667 self.assertEqual(addr3, addr4)
1668 self.assertEqual(addr5, ipaddress.IPv4Address(addr5))
1669 self.assertEqual(addr6, ipaddress.IPv6Address(addr6))
1670
1671 def testCompressIPv6Address(self):
1672 test_addresses = {
1673 '1:2:3:4:5:6:7:8': '1:2:3:4:5:6:7:8/128',
1674 '2001:0:0:4:0:0:0:8': '2001:0:0:4::8/128',
1675 '2001:0:0:4:5:6:7:8': '2001::4:5:6:7:8/128',
1676 '2001:0:3:4:5:6:7:8': '2001:0:3:4:5:6:7:8/128',
1677 '2001:0:3:4:5:6:7:8': '2001:0:3:4:5:6:7:8/128',
1678 '0:0:3:0:0:0:0:ffff': '0:0:3::ffff/128',
1679 '0:0:0:4:0:0:0:ffff': '::4:0:0:0:ffff/128',
1680 '0:0:0:0:5:0:0:ffff': '::5:0:0:ffff/128',
1681 '1:0:0:4:0:0:7:8': '1::4:0:0:7:8/128',
1682 '0:0:0:0:0:0:0:0': '::/128',
1683 '0:0:0:0:0:0:0:0/0': '::/0',
1684 '0:0:0:0:0:0:0:1': '::1/128',
1685 '2001:0658:022a:cafe:0000:0000:0000:0000/66':
1686 '2001:658:22a:cafe::/66',
1687 '::1.2.3.4': '::102:304/128',
1688 '1:2:3:4:5:ffff:1.2.3.4': '1:2:3:4:5:ffff:102:304/128',
1689 '::7:6:5:4:3:2:1': '0:7:6:5:4:3:2:1/128',
1690 '::7:6:5:4:3:2:0': '0:7:6:5:4:3:2:0/128',
1691 '7:6:5:4:3:2:1::': '7:6:5:4:3:2:1:0/128',
1692 '0:6:5:4:3:2:1::': '0:6:5:4:3:2:1:0/128',
1693 }
1694 for uncompressed, compressed in list(test_addresses.items()):
1695 self.assertEqual(compressed, str(ipaddress.IPv6Interface(
1696 uncompressed)))
1697
1698 def testExplodeShortHandIpStr(self):
1699 addr1 = ipaddress.IPv6Interface('2001::1')
1700 addr2 = ipaddress.IPv6Address('2001:0:5ef5:79fd:0:59d:a0e5:ba1')
1701 addr3 = ipaddress.IPv6Network('2001::/96')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001702 addr4 = ipaddress.IPv4Address('192.168.178.1')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001703 self.assertEqual('2001:0000:0000:0000:0000:0000:0000:0001/128',
1704 addr1.exploded)
1705 self.assertEqual('0000:0000:0000:0000:0000:0000:0000:0001/128',
1706 ipaddress.IPv6Interface('::1/128').exploded)
1707 # issue 77
1708 self.assertEqual('2001:0000:5ef5:79fd:0000:059d:a0e5:0ba1',
1709 addr2.exploded)
1710 self.assertEqual('2001:0000:0000:0000:0000:0000:0000:0000/96',
1711 addr3.exploded)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001712 self.assertEqual('192.168.178.1', addr4.exploded)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001713
Eric V. Smithebdaaf42014-04-14 12:58:07 -04001714 def testReversePointer(self):
1715 addr1 = ipaddress.IPv4Address('127.0.0.1')
1716 addr2 = ipaddress.IPv6Address('2001:db8::1')
1717 self.assertEqual('1.0.0.127.in-addr.arpa', addr1.reverse_pointer)
1718 self.assertEqual('1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.' +
1719 'b.d.0.1.0.0.2.ip6.arpa',
1720 addr2.reverse_pointer)
1721
Nick Coghlandc9b2552012-05-20 21:01:57 +10001722 def testIntRepresentation(self):
1723 self.assertEqual(16909060, int(self.ipv4_address))
1724 self.assertEqual(42540616829182469433547762482097946625,
1725 int(self.ipv6_address))
1726
Nick Coghlandc9b2552012-05-20 21:01:57 +10001727 def testForceVersion(self):
1728 self.assertEqual(ipaddress.ip_network(1).version, 4)
Nick Coghlan51c30672012-05-27 00:25:58 +10001729 self.assertEqual(ipaddress.IPv6Network(1).version, 6)
Sandro Tosi876ecad2012-05-23 22:26:55 +02001730
Nick Coghlandc9b2552012-05-20 21:01:57 +10001731 def testWithStar(self):
Nick Coghlana8517ad2012-08-20 10:04:26 +10001732 self.assertEqual(self.ipv4_interface.with_prefixlen, "1.2.3.4/24")
1733 self.assertEqual(self.ipv4_interface.with_netmask,
Nick Coghlandc9b2552012-05-20 21:01:57 +10001734 "1.2.3.4/255.255.255.0")
Nick Coghlana8517ad2012-08-20 10:04:26 +10001735 self.assertEqual(self.ipv4_interface.with_hostmask,
Nick Coghlandc9b2552012-05-20 21:01:57 +10001736 "1.2.3.4/0.0.0.255")
1737
Nick Coghlana8517ad2012-08-20 10:04:26 +10001738 self.assertEqual(self.ipv6_interface.with_prefixlen,
Nick Coghlandc9b2552012-05-20 21:01:57 +10001739 '2001:658:22a:cafe:200::1/64')
Nick Coghlana8517ad2012-08-20 10:04:26 +10001740 self.assertEqual(self.ipv6_interface.with_netmask,
1741 '2001:658:22a:cafe:200::1/ffff:ffff:ffff:ffff::')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001742 # this probably don't make much sense, but it's included for
1743 # compatibility with ipv4
Nick Coghlana8517ad2012-08-20 10:04:26 +10001744 self.assertEqual(self.ipv6_interface.with_hostmask,
Nick Coghlandc9b2552012-05-20 21:01:57 +10001745 '2001:658:22a:cafe:200::1/::ffff:ffff:ffff:ffff')
1746
1747 def testNetworkElementCaching(self):
1748 # V4 - make sure we're empty
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001749 self.assertNotIn('network_address', self.ipv4_network._cache)
1750 self.assertNotIn('broadcast_address', self.ipv4_network._cache)
1751 self.assertNotIn('hostmask', self.ipv4_network._cache)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001752
1753 # V4 - populate and test
1754 self.assertEqual(self.ipv4_network.network_address,
1755 ipaddress.IPv4Address('1.2.3.0'))
1756 self.assertEqual(self.ipv4_network.broadcast_address,
1757 ipaddress.IPv4Address('1.2.3.255'))
1758 self.assertEqual(self.ipv4_network.hostmask,
1759 ipaddress.IPv4Address('0.0.0.255'))
1760
1761 # V4 - check we're cached
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001762 self.assertIn('broadcast_address', self.ipv4_network._cache)
1763 self.assertIn('hostmask', self.ipv4_network._cache)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001764
1765 # V6 - make sure we're empty
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001766 self.assertNotIn('broadcast_address', self.ipv6_network._cache)
1767 self.assertNotIn('hostmask', self.ipv6_network._cache)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001768
1769 # V6 - populate and test
1770 self.assertEqual(self.ipv6_network.network_address,
1771 ipaddress.IPv6Address('2001:658:22a:cafe::'))
1772 self.assertEqual(self.ipv6_interface.network.network_address,
1773 ipaddress.IPv6Address('2001:658:22a:cafe::'))
1774
1775 self.assertEqual(
1776 self.ipv6_network.broadcast_address,
1777 ipaddress.IPv6Address('2001:658:22a:cafe:ffff:ffff:ffff:ffff'))
1778 self.assertEqual(self.ipv6_network.hostmask,
1779 ipaddress.IPv6Address('::ffff:ffff:ffff:ffff'))
1780 self.assertEqual(
1781 self.ipv6_interface.network.broadcast_address,
1782 ipaddress.IPv6Address('2001:658:22a:cafe:ffff:ffff:ffff:ffff'))
1783 self.assertEqual(self.ipv6_interface.network.hostmask,
1784 ipaddress.IPv6Address('::ffff:ffff:ffff:ffff'))
1785
1786 # V6 - check we're cached
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001787 self.assertIn('broadcast_address', self.ipv6_network._cache)
1788 self.assertIn('hostmask', self.ipv6_network._cache)
1789 self.assertIn('broadcast_address', self.ipv6_interface.network._cache)
1790 self.assertIn('hostmask', self.ipv6_interface.network._cache)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001791
1792 def testTeredo(self):
1793 # stolen from wikipedia
1794 server = ipaddress.IPv4Address('65.54.227.120')
1795 client = ipaddress.IPv4Address('192.0.2.45')
1796 teredo_addr = '2001:0000:4136:e378:8000:63bf:3fff:fdd2'
1797 self.assertEqual((server, client),
1798 ipaddress.ip_address(teredo_addr).teredo)
1799 bad_addr = '2000::4136:e378:8000:63bf:3fff:fdd2'
1800 self.assertFalse(ipaddress.ip_address(bad_addr).teredo)
1801 bad_addr = '2001:0001:4136:e378:8000:63bf:3fff:fdd2'
1802 self.assertFalse(ipaddress.ip_address(bad_addr).teredo)
1803
1804 # i77
1805 teredo_addr = ipaddress.IPv6Address('2001:0:5ef5:79fd:0:59d:a0e5:ba1')
1806 self.assertEqual((ipaddress.IPv4Address('94.245.121.253'),
1807 ipaddress.IPv4Address('95.26.244.94')),
1808 teredo_addr.teredo)
1809
Nick Coghlandc9b2552012-05-20 21:01:57 +10001810 def testsixtofour(self):
1811 sixtofouraddr = ipaddress.ip_address('2002:ac1d:2d64::1')
1812 bad_addr = ipaddress.ip_address('2000:ac1d:2d64::1')
1813 self.assertEqual(ipaddress.IPv4Address('172.29.45.100'),
1814 sixtofouraddr.sixtofour)
1815 self.assertFalse(bad_addr.sixtofour)
1816
Nick Coghlandc9b2552012-05-20 21:01:57 +10001817
1818if __name__ == '__main__':
1819 unittest.main()