blob: 0b71bf81b4cebfd1c845330dc8fa2fd8c4144c8a [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
Nick Coghlan07c4e332012-07-08 23:06:45 +100013class BaseTestCase(unittest.TestCase):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +100014 # One big change in ipaddress over the original ipaddr module is
15 # error reporting that tries to assume users *don't know the rules*
16 # for what constitutes an RFC compliant IP address
17
Nick Coghlan07c4e332012-07-08 23:06:45 +100018 # Ensuring these errors are emitted correctly in all relevant cases
19 # meant moving to a more systematic test structure that allows the
20 # test structure to map more directly to the module structure
21
Nick Coghlan36f8dcd2012-07-07 19:23:53 +100022 # Note that if the constructors are refactored so that addresses with
23 # multiple problems get classified differently, that's OK - just
24 # move the affected examples to the newly appropriate test case.
25
Nick Coghlan07c4e332012-07-08 23:06:45 +100026 # There is some duplication between the original relatively ad hoc
27 # test suite and the new systematic tests. While some redundancy in
28 # testing is considered preferable to accidentally deleting a valid
29 # test, the original test suite will likely be reduced over time as
30 # redundant tests are identified.
Nick Coghlan36f8dcd2012-07-07 19:23:53 +100031
Nick Coghlan297b1432012-07-08 17:11:04 +100032 @property
33 def factory(self):
34 raise NotImplementedError
35
Nick Coghlan36f8dcd2012-07-07 19:23:53 +100036 @contextlib.contextmanager
37 def assertCleanError(self, exc_type, details, *args):
38 """
39 Ensure exception does not display a context by default
40
41 Wraps unittest.TestCase.assertRaisesRegex
42 """
43 if args:
44 details = details % args
45 cm = self.assertRaisesRegex(exc_type, details)
46 with cm as exc:
47 yield exc
48 # Ensure we produce clean tracebacks on failure
49 if exc.exception.__context__ is not None:
50 self.assertTrue(exc.exception.__suppress_context__)
51
52 def assertAddressError(self, details, *args):
53 """Ensure a clean AddressValueError"""
54 return self.assertCleanError(ipaddress.AddressValueError,
55 details, *args)
56
57 def assertNetmaskError(self, details, *args):
58 """Ensure a clean NetmaskValueError"""
59 return self.assertCleanError(ipaddress.NetmaskValueError,
60 details, *args)
61
Nick Coghlan07c4e332012-07-08 23:06:45 +100062 def assertInstancesEqual(self, lhs, rhs):
63 """Check constructor arguments produce equivalent instances"""
64 self.assertEqual(self.factory(lhs), self.factory(rhs))
65
66class CommonTestMixin:
Nick Coghlan36f8dcd2012-07-07 19:23:53 +100067
68 def test_empty_address(self):
69 with self.assertAddressError("Address cannot be empty"):
Nick Coghlan297b1432012-07-08 17:11:04 +100070 self.factory("")
71
72 def test_floats_rejected(self):
73 with self.assertAddressError(re.escape(repr("1.0"))):
74 self.factory(1.0)
75
Nick Coghlane0c3f5e2012-08-05 18:20:17 +100076 def test_not_an_index_issue15559(self):
77 # Implementing __index__ makes for a very nasty interaction with the
78 # bytes constructor. Thus, we disallow implicit use as an integer
79 self.assertRaises(TypeError, operator.index, self.factory(1))
80 self.assertRaises(TypeError, hex, self.factory(1))
81 self.assertRaises(TypeError, bytes, self.factory(1))
82
83
Nick Coghlan07c4e332012-07-08 23:06:45 +100084class CommonTestMixin_v4(CommonTestMixin):
85
86 def test_leading_zeros(self):
87 self.assertInstancesEqual("000.000.000.000", "0.0.0.0")
88 self.assertInstancesEqual("192.168.000.001", "192.168.0.1")
89
90 def test_int(self):
91 self.assertInstancesEqual(0, "0.0.0.0")
92 self.assertInstancesEqual(3232235521, "192.168.0.1")
93
94 def test_packed(self):
95 self.assertInstancesEqual(bytes.fromhex("00000000"), "0.0.0.0")
96 self.assertInstancesEqual(bytes.fromhex("c0a80001"), "192.168.0.1")
Nick Coghlan297b1432012-07-08 17:11:04 +100097
98 def test_negative_ints_rejected(self):
99 msg = "-1 (< 0) is not permitted as an IPv4 address"
100 with self.assertAddressError(re.escape(msg)):
101 self.factory(-1)
102
103 def test_large_ints_rejected(self):
104 msg = "%d (>= 2**32) is not permitted as an IPv4 address"
105 with self.assertAddressError(re.escape(msg % 2**32)):
106 self.factory(2**32)
107
108 def test_bad_packed_length(self):
109 def assertBadLength(length):
Nick Coghlan07c4e332012-07-08 23:06:45 +1000110 addr = bytes(length)
Nick Coghlan297b1432012-07-08 17:11:04 +1000111 msg = "%r (len %d != 4) is not permitted as an IPv4 address"
112 with self.assertAddressError(re.escape(msg % (addr, length))):
113 self.factory(addr)
114
115 assertBadLength(3)
116 assertBadLength(5)
117
Nick Coghlan07c4e332012-07-08 23:06:45 +1000118class CommonTestMixin_v6(CommonTestMixin):
119
120 def test_leading_zeros(self):
121 self.assertInstancesEqual("0000::0000", "::")
122 self.assertInstancesEqual("000::c0a8:0001", "::c0a8:1")
123
124 def test_int(self):
125 self.assertInstancesEqual(0, "::")
126 self.assertInstancesEqual(3232235521, "::c0a8:1")
127
128 def test_packed(self):
129 addr = bytes(12) + bytes.fromhex("00000000")
130 self.assertInstancesEqual(addr, "::")
131 addr = bytes(12) + bytes.fromhex("c0a80001")
132 self.assertInstancesEqual(addr, "::c0a8:1")
133 addr = bytes.fromhex("c0a80001") + bytes(12)
134 self.assertInstancesEqual(addr, "c0a8:1::")
Nick Coghlan297b1432012-07-08 17:11:04 +1000135
136 def test_negative_ints_rejected(self):
137 msg = "-1 (< 0) is not permitted as an IPv6 address"
138 with self.assertAddressError(re.escape(msg)):
139 self.factory(-1)
140
141 def test_large_ints_rejected(self):
142 msg = "%d (>= 2**128) is not permitted as an IPv6 address"
143 with self.assertAddressError(re.escape(msg % 2**128)):
144 self.factory(2**128)
145
146 def test_bad_packed_length(self):
147 def assertBadLength(length):
Nick Coghlan07c4e332012-07-08 23:06:45 +1000148 addr = bytes(length)
Nick Coghlan297b1432012-07-08 17:11:04 +1000149 msg = "%r (len %d != 16) is not permitted as an IPv6 address"
150 with self.assertAddressError(re.escape(msg % (addr, length))):
151 self.factory(addr)
152 self.factory(addr)
153
154 assertBadLength(15)
155 assertBadLength(17)
156
157
Nick Coghlan07c4e332012-07-08 23:06:45 +1000158class AddressTestCase_v4(BaseTestCase, CommonTestMixin_v4):
Nick Coghlan297b1432012-07-08 17:11:04 +1000159 factory = ipaddress.IPv4Address
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000160
161 def test_network_passed_as_address(self):
162 addr = "127.0.0.1/24"
163 with self.assertAddressError("Unexpected '/' in %r", addr):
164 ipaddress.IPv4Address(addr)
165
166 def test_bad_address_split(self):
167 def assertBadSplit(addr):
168 with self.assertAddressError("Expected 4 octets in %r", addr):
169 ipaddress.IPv4Address(addr)
170
171 assertBadSplit("127.0.1")
172 assertBadSplit("42.42.42.42.42")
173 assertBadSplit("42.42.42")
174 assertBadSplit("42.42")
175 assertBadSplit("42")
176 assertBadSplit("42..42.42.42")
177 assertBadSplit("42.42.42.42.")
178 assertBadSplit("42.42.42.42...")
179 assertBadSplit(".42.42.42.42")
180 assertBadSplit("...42.42.42.42")
181 assertBadSplit("016.016.016")
182 assertBadSplit("016.016")
183 assertBadSplit("016")
184 assertBadSplit("000")
185 assertBadSplit("0x0a.0x0a.0x0a")
186 assertBadSplit("0x0a.0x0a")
187 assertBadSplit("0x0a")
188 assertBadSplit(".")
189 assertBadSplit("bogus")
190 assertBadSplit("bogus.com")
191 assertBadSplit("1000")
192 assertBadSplit("1000000000000000")
193 assertBadSplit("192.168.0.1.com")
194
195 def test_empty_octet(self):
196 def assertBadOctet(addr):
197 with self.assertAddressError("Empty octet not permitted in %r",
198 addr):
199 ipaddress.IPv4Address(addr)
200
201 assertBadOctet("42..42.42")
202 assertBadOctet("...")
203
204 def test_invalid_characters(self):
205 def assertBadOctet(addr, octet):
206 msg = "Only decimal digits permitted in %r in %r" % (octet, addr)
207 with self.assertAddressError(re.escape(msg)):
208 ipaddress.IPv4Address(addr)
209
210 assertBadOctet("0x0a.0x0a.0x0a.0x0a", "0x0a")
Nick Coghlan07c4e332012-07-08 23:06:45 +1000211 assertBadOctet("0xa.0x0a.0x0a.0x0a", "0xa")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000212 assertBadOctet("42.42.42.-0", "-0")
213 assertBadOctet("42.42.42.+0", "+0")
214 assertBadOctet("42.42.42.-42", "-42")
215 assertBadOctet("+1.+2.+3.4", "+1")
216 assertBadOctet("1.2.3.4e0", "4e0")
217 assertBadOctet("1.2.3.4::", "4::")
218 assertBadOctet("1.a.2.3", "a")
219
Nick Coghlan07c4e332012-07-08 23:06:45 +1000220 def test_octal_decimal_ambiguity(self):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000221 def assertBadOctet(addr, octet):
Nick Coghlan07c4e332012-07-08 23:06:45 +1000222 msg = "Ambiguous (octal/decimal) value in %r not permitted in %r"
223 with self.assertAddressError(re.escape(msg % (octet, addr))):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000224 ipaddress.IPv4Address(addr)
225
226 assertBadOctet("016.016.016.016", "016")
227 assertBadOctet("001.000.008.016", "008")
Nick Coghlan07c4e332012-07-08 23:06:45 +1000228
229 def test_octet_length(self):
230 def assertBadOctet(addr, octet):
231 msg = "At most 3 characters permitted in %r in %r"
232 with self.assertAddressError(re.escape(msg % (octet, addr))):
233 ipaddress.IPv4Address(addr)
234
235 assertBadOctet("0000.000.000.000", "0000")
236 assertBadOctet("12345.67899.-54321.-98765", "12345")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000237
238 def test_octet_limit(self):
239 def assertBadOctet(addr, octet):
Nick Coghlanb582ecc2012-07-07 22:15:22 +1000240 msg = "Octet %d (> 255) not permitted in %r" % (octet, addr)
241 with self.assertAddressError(re.escape(msg)):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000242 ipaddress.IPv4Address(addr)
243
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000244 assertBadOctet("257.0.0.0", 257)
Nick Coghlan07c4e332012-07-08 23:06:45 +1000245 assertBadOctet("192.168.0.999", 999)
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000246
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000247
Nick Coghlan07c4e332012-07-08 23:06:45 +1000248class AddressTestCase_v6(BaseTestCase, CommonTestMixin_v6):
Nick Coghlan297b1432012-07-08 17:11:04 +1000249 factory = ipaddress.IPv6Address
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000250
251 def test_network_passed_as_address(self):
252 addr = "::1/24"
253 with self.assertAddressError("Unexpected '/' in %r", addr):
254 ipaddress.IPv6Address(addr)
255
256 def test_bad_address_split_v6_not_enough_parts(self):
257 def assertBadSplit(addr):
258 msg = "At least 3 parts expected in %r"
259 with self.assertAddressError(msg, addr):
260 ipaddress.IPv6Address(addr)
261
262 assertBadSplit(":")
263 assertBadSplit(":1")
264 assertBadSplit("FEDC:9878")
265
266 def test_bad_address_split_v6_too_many_colons(self):
267 def assertBadSplit(addr):
268 msg = "At most 8 colons permitted in %r"
269 with self.assertAddressError(msg, addr):
270 ipaddress.IPv6Address(addr)
271
272 assertBadSplit("9:8:7:6:5:4:3::2:1")
273 assertBadSplit("10:9:8:7:6:5:4:3:2:1")
274 assertBadSplit("::8:7:6:5:4:3:2:1")
275 assertBadSplit("8:7:6:5:4:3:2:1::")
276 # A trailing IPv4 address is two parts
277 assertBadSplit("10:9:8:7:6:5:4:3:42.42.42.42")
278
279 def test_bad_address_split_v6_too_many_parts(self):
280 def assertBadSplit(addr):
281 msg = "Exactly 8 parts expected without '::' in %r"
282 with self.assertAddressError(msg, addr):
283 ipaddress.IPv6Address(addr)
284
285 assertBadSplit("3ffe:0:0:0:0:0:0:0:1")
286 assertBadSplit("9:8:7:6:5:4:3:2:1")
287 assertBadSplit("7:6:5:4:3:2:1")
288 # A trailing IPv4 address is two parts
289 assertBadSplit("9:8:7:6:5:4:3:42.42.42.42")
290 assertBadSplit("7:6:5:4:3:42.42.42.42")
291
292 def test_bad_address_split_v6_too_many_parts_with_double_colon(self):
293 def assertBadSplit(addr):
294 msg = "Expected at most 7 other parts with '::' in %r"
295 with self.assertAddressError(msg, addr):
296 ipaddress.IPv6Address(addr)
297
298 assertBadSplit("1:2:3:4::5:6:7:8")
299
300 def test_bad_address_split_v6_repeated_double_colon(self):
301 def assertBadSplit(addr):
302 msg = "At most one '::' permitted in %r"
303 with self.assertAddressError(msg, addr):
304 ipaddress.IPv6Address(addr)
305
306 assertBadSplit("3ffe::1::1")
307 assertBadSplit("1::2::3::4:5")
308 assertBadSplit("2001::db:::1")
309 assertBadSplit("3ffe::1::")
310 assertBadSplit("::3ffe::1")
311 assertBadSplit(":3ffe::1::1")
312 assertBadSplit("3ffe::1::1:")
313 assertBadSplit(":3ffe::1::1:")
314 assertBadSplit(":::")
315 assertBadSplit('2001:db8:::1')
316
317 def test_bad_address_split_v6_leading_colon(self):
318 def assertBadSplit(addr):
319 msg = "Leading ':' only permitted as part of '::' in %r"
320 with self.assertAddressError(msg, addr):
321 ipaddress.IPv6Address(addr)
322
323 assertBadSplit(":2001:db8::1")
324 assertBadSplit(":1:2:3:4:5:6:7")
325 assertBadSplit(":1:2:3:4:5:6:")
326 assertBadSplit(":6:5:4:3:2:1::")
327
328 def test_bad_address_split_v6_trailing_colon(self):
329 def assertBadSplit(addr):
330 msg = "Trailing ':' only permitted as part of '::' in %r"
331 with self.assertAddressError(msg, addr):
332 ipaddress.IPv6Address(addr)
333
334 assertBadSplit("2001:db8::1:")
335 assertBadSplit("1:2:3:4:5:6:7:")
336 assertBadSplit("::1.2.3.4:")
337 assertBadSplit("::7:6:5:4:3:2:")
338
339 def test_bad_v4_part_in(self):
340 def assertBadAddressPart(addr, v4_error):
341 with self.assertAddressError("%s in %r", v4_error, addr):
342 ipaddress.IPv6Address(addr)
343
344 assertBadAddressPart("3ffe::1.net", "Expected 4 octets in '1.net'")
345 assertBadAddressPart("3ffe::127.0.1",
346 "Expected 4 octets in '127.0.1'")
347 assertBadAddressPart("::1.2.3",
348 "Expected 4 octets in '1.2.3'")
349 assertBadAddressPart("::1.2.3.4.5",
350 "Expected 4 octets in '1.2.3.4.5'")
351 assertBadAddressPart("3ffe::1.1.1.net",
352 "Only decimal digits permitted in 'net' "
353 "in '1.1.1.net'")
354
355 def test_invalid_characters(self):
356 def assertBadPart(addr, part):
357 msg = "Only hex digits permitted in %r in %r" % (part, addr)
358 with self.assertAddressError(re.escape(msg)):
359 ipaddress.IPv6Address(addr)
360
361 assertBadPart("3ffe::goog", "goog")
362 assertBadPart("3ffe::-0", "-0")
363 assertBadPart("3ffe::+0", "+0")
364 assertBadPart("3ffe::-1", "-1")
365 assertBadPart("1.2.3.4::", "1.2.3.4")
366 assertBadPart('1234:axy::b', "axy")
367
368 def test_part_length(self):
369 def assertBadPart(addr, part):
370 msg = "At most 4 characters permitted in %r in %r"
371 with self.assertAddressError(msg, part, addr):
372 ipaddress.IPv6Address(addr)
373
Nick Coghlan07c4e332012-07-08 23:06:45 +1000374 assertBadPart("::00000", "00000")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000375 assertBadPart("3ffe::10000", "10000")
376 assertBadPart("02001:db8::", "02001")
377 assertBadPart('2001:888888::1', "888888")
378
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000379
Nick Coghlan07c4e332012-07-08 23:06:45 +1000380class NetmaskTestMixin_v4(CommonTestMixin_v4):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000381 """Input validation on interfaces and networks is very similar"""
382
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000383 def test_split_netmask(self):
384 addr = "1.2.3.4/32/24"
385 with self.assertAddressError("Only one '/' permitted in %r" % addr):
386 self.factory(addr)
387
388 def test_address_errors(self):
389 def assertBadAddress(addr, details):
390 with self.assertAddressError(details):
391 self.factory(addr)
392
Nick Coghlan297b1432012-07-08 17:11:04 +1000393 assertBadAddress("/", "Address cannot be empty")
394 assertBadAddress("/8", "Address cannot be empty")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000395 assertBadAddress("bogus", "Expected 4 octets")
396 assertBadAddress("google.com", "Expected 4 octets")
397 assertBadAddress("10/8", "Expected 4 octets")
398 assertBadAddress("::1.2.3.4", "Only decimal digits")
Nick Coghlanb582ecc2012-07-07 22:15:22 +1000399 assertBadAddress("1.2.3.256", re.escape("256 (> 255)"))
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000400
Nick Coghlan932346f2014-02-08 23:17:36 +1000401 def test_valid_netmask(self):
402 self.assertEqual(str(self.factory('192.0.2.0/255.255.255.0')),
403 '192.0.2.0/24')
404 for i in range(0, 33):
405 # Generate and re-parse the CIDR format (trivial).
406 net_str = '0.0.0.0/%d' % i
407 net = self.factory(net_str)
408 self.assertEqual(str(net), net_str)
409 # Generate and re-parse the expanded netmask.
410 self.assertEqual(
411 str(self.factory('0.0.0.0/%s' % net.netmask)), net_str)
412 # Zero prefix is treated as decimal.
413 self.assertEqual(str(self.factory('0.0.0.0/0%d' % i)), net_str)
414 # Generate and re-parse the expanded hostmask. The ambiguous
415 # cases (/0 and /32) are treated as netmasks.
416 if i in (32, 0):
417 net_str = '0.0.0.0/%d' % (32 - i)
418 self.assertEqual(
419 str(self.factory('0.0.0.0/%s' % net.hostmask)), net_str)
420
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000421 def test_netmask_errors(self):
422 def assertBadNetmask(addr, netmask):
Nick Coghlan932346f2014-02-08 23:17:36 +1000423 msg = "%r is not a valid netmask" % netmask
424 with self.assertNetmaskError(re.escape(msg)):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000425 self.factory("%s/%s" % (addr, netmask))
426
427 assertBadNetmask("1.2.3.4", "")
Nick Coghlan932346f2014-02-08 23:17:36 +1000428 assertBadNetmask("1.2.3.4", "-1")
429 assertBadNetmask("1.2.3.4", "+1")
430 assertBadNetmask("1.2.3.4", " 1 ")
431 assertBadNetmask("1.2.3.4", "0x1")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000432 assertBadNetmask("1.2.3.4", "33")
433 assertBadNetmask("1.2.3.4", "254.254.255.256")
Nick Coghlan932346f2014-02-08 23:17:36 +1000434 assertBadNetmask("1.2.3.4", "1.a.2.3")
Nick Coghlan07c4e332012-07-08 23:06:45 +1000435 assertBadNetmask("1.1.1.1", "254.xyz.2.3")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000436 assertBadNetmask("1.1.1.1", "240.255.0.0")
Nick Coghlan932346f2014-02-08 23:17:36 +1000437 assertBadNetmask("1.1.1.1", "255.254.128.0")
438 assertBadNetmask("1.1.1.1", "0.1.127.255")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000439 assertBadNetmask("1.1.1.1", "pudding")
Nick Coghlan932346f2014-02-08 23:17:36 +1000440 assertBadNetmask("1.1.1.1", "::")
441
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000442
Nick Coghlan07c4e332012-07-08 23:06:45 +1000443class InterfaceTestCase_v4(BaseTestCase, NetmaskTestMixin_v4):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000444 factory = ipaddress.IPv4Interface
445
Nick Coghlan07c4e332012-07-08 23:06:45 +1000446class NetworkTestCase_v4(BaseTestCase, NetmaskTestMixin_v4):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000447 factory = ipaddress.IPv4Network
448
449
Nick Coghlan07c4e332012-07-08 23:06:45 +1000450class NetmaskTestMixin_v6(CommonTestMixin_v6):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000451 """Input validation on interfaces and networks is very similar"""
452
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000453 def test_split_netmask(self):
454 addr = "cafe:cafe::/128/190"
455 with self.assertAddressError("Only one '/' permitted in %r" % addr):
456 self.factory(addr)
457
458 def test_address_errors(self):
459 def assertBadAddress(addr, details):
460 with self.assertAddressError(details):
461 self.factory(addr)
462
Nick Coghlan297b1432012-07-08 17:11:04 +1000463 assertBadAddress("/", "Address cannot be empty")
464 assertBadAddress("/8", "Address cannot be empty")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000465 assertBadAddress("google.com", "At least 3 parts")
466 assertBadAddress("1.2.3.4", "At least 3 parts")
467 assertBadAddress("10/8", "At least 3 parts")
468 assertBadAddress("1234:axy::b", "Only hex digits")
469
Nick Coghlan932346f2014-02-08 23:17:36 +1000470 def test_valid_netmask(self):
471 # We only support CIDR for IPv6, because expanded netmasks are not
472 # standard notation.
473 self.assertEqual(str(self.factory('2001:db8::/32')), '2001:db8::/32')
474 for i in range(0, 129):
475 # Generate and re-parse the CIDR format (trivial).
476 net_str = '::/%d' % i
477 self.assertEqual(str(self.factory(net_str)), net_str)
478 # Zero prefix is treated as decimal.
479 self.assertEqual(str(self.factory('::/0%d' % i)), net_str)
480
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000481 def test_netmask_errors(self):
482 def assertBadNetmask(addr, netmask):
Nick Coghlan932346f2014-02-08 23:17:36 +1000483 msg = "%r is not a valid netmask" % netmask
484 with self.assertNetmaskError(re.escape(msg)):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000485 self.factory("%s/%s" % (addr, netmask))
486
487 assertBadNetmask("::1", "")
488 assertBadNetmask("::1", "::1")
489 assertBadNetmask("::1", "1::")
Nick Coghlan932346f2014-02-08 23:17:36 +1000490 assertBadNetmask("::1", "-1")
491 assertBadNetmask("::1", "+1")
492 assertBadNetmask("::1", " 1 ")
493 assertBadNetmask("::1", "0x1")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000494 assertBadNetmask("::1", "129")
Nick Coghlan932346f2014-02-08 23:17:36 +1000495 assertBadNetmask("::1", "1.2.3.4")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000496 assertBadNetmask("::1", "pudding")
Nick Coghlan932346f2014-02-08 23:17:36 +1000497 assertBadNetmask("::", "::")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000498
Nick Coghlan07c4e332012-07-08 23:06:45 +1000499class InterfaceTestCase_v6(BaseTestCase, NetmaskTestMixin_v6):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000500 factory = ipaddress.IPv6Interface
501
Nick Coghlan07c4e332012-07-08 23:06:45 +1000502class NetworkTestCase_v6(BaseTestCase, NetmaskTestMixin_v6):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000503 factory = ipaddress.IPv6Network
504
505
Nick Coghlan07c4e332012-07-08 23:06:45 +1000506class FactoryFunctionErrors(BaseTestCase):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000507
508 def assertFactoryError(self, factory, kind):
509 """Ensure a clean ValueError with the expected message"""
510 addr = "camelot"
511 msg = '%r does not appear to be an IPv4 or IPv6 %s'
512 with self.assertCleanError(ValueError, msg, addr, kind):
513 factory(addr)
514
515 def test_ip_address(self):
516 self.assertFactoryError(ipaddress.ip_address, "address")
517
518 def test_ip_interface(self):
519 self.assertFactoryError(ipaddress.ip_interface, "interface")
520
521 def test_ip_network(self):
522 self.assertFactoryError(ipaddress.ip_network, "network")
523
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200524
Nick Coghlan3008ec02012-07-08 00:45:33 +1000525class ComparisonTests(unittest.TestCase):
526
527 v4addr = ipaddress.IPv4Address(1)
528 v4net = ipaddress.IPv4Network(1)
529 v4intf = ipaddress.IPv4Interface(1)
530 v6addr = ipaddress.IPv6Address(1)
531 v6net = ipaddress.IPv6Network(1)
532 v6intf = ipaddress.IPv6Interface(1)
533
534 v4_addresses = [v4addr, v4intf]
535 v4_objects = v4_addresses + [v4net]
536 v6_addresses = [v6addr, v6intf]
537 v6_objects = v6_addresses + [v6net]
538 objects = v4_objects + v6_objects
539
540 def test_foreign_type_equality(self):
541 # __eq__ should never raise TypeError directly
542 other = object()
543 for obj in self.objects:
544 self.assertNotEqual(obj, other)
545 self.assertFalse(obj == other)
546 self.assertEqual(obj.__eq__(other), NotImplemented)
547 self.assertEqual(obj.__ne__(other), NotImplemented)
548
549 def test_mixed_type_equality(self):
550 # Ensure none of the internal objects accidentally
551 # expose the right set of attributes to become "equal"
552 for lhs in self.objects:
553 for rhs in self.objects:
554 if lhs is rhs:
555 continue
556 self.assertNotEqual(lhs, rhs)
557
558 def test_containment(self):
559 for obj in self.v4_addresses:
560 self.assertIn(obj, self.v4net)
561 for obj in self.v6_addresses:
562 self.assertIn(obj, self.v6net)
563 for obj in self.v4_objects + [self.v6net]:
564 self.assertNotIn(obj, self.v6net)
565 for obj in self.v6_objects + [self.v4net]:
566 self.assertNotIn(obj, self.v4net)
567
568 def test_mixed_type_ordering(self):
569 for lhs in self.objects:
570 for rhs in self.objects:
571 if isinstance(lhs, type(rhs)) or isinstance(rhs, type(lhs)):
572 continue
573 self.assertRaises(TypeError, lambda: lhs < rhs)
574 self.assertRaises(TypeError, lambda: lhs > rhs)
575 self.assertRaises(TypeError, lambda: lhs <= rhs)
576 self.assertRaises(TypeError, lambda: lhs >= rhs)
577
578 def test_mixed_type_key(self):
579 # with get_mixed_type_key, you can sort addresses and network.
580 v4_ordered = [self.v4addr, self.v4net, self.v4intf]
581 v6_ordered = [self.v6addr, self.v6net, self.v6intf]
582 self.assertEqual(v4_ordered,
583 sorted(self.v4_objects,
584 key=ipaddress.get_mixed_type_key))
585 self.assertEqual(v6_ordered,
586 sorted(self.v6_objects,
587 key=ipaddress.get_mixed_type_key))
588 self.assertEqual(v4_ordered + v6_ordered,
589 sorted(self.objects,
590 key=ipaddress.get_mixed_type_key))
591 self.assertEqual(NotImplemented, ipaddress.get_mixed_type_key(object))
592
593 def test_incompatible_versions(self):
594 # These should always raise TypeError
595 v4addr = ipaddress.ip_address('1.1.1.1')
596 v4net = ipaddress.ip_network('1.1.1.1')
597 v6addr = ipaddress.ip_address('::1')
598 v6net = ipaddress.ip_address('::1')
599
600 self.assertRaises(TypeError, v4addr.__lt__, v6addr)
601 self.assertRaises(TypeError, v4addr.__gt__, v6addr)
602 self.assertRaises(TypeError, v4net.__lt__, v6net)
603 self.assertRaises(TypeError, v4net.__gt__, v6net)
604
605 self.assertRaises(TypeError, v6addr.__lt__, v4addr)
606 self.assertRaises(TypeError, v6addr.__gt__, v4addr)
607 self.assertRaises(TypeError, v6net.__lt__, v4net)
608 self.assertRaises(TypeError, v6net.__gt__, v4net)
609
610
611
Nick Coghlandc9b2552012-05-20 21:01:57 +1000612class IpaddrUnitTest(unittest.TestCase):
613
614 def setUp(self):
615 self.ipv4_address = ipaddress.IPv4Address('1.2.3.4')
616 self.ipv4_interface = ipaddress.IPv4Interface('1.2.3.4/24')
617 self.ipv4_network = ipaddress.IPv4Network('1.2.3.0/24')
618 #self.ipv4_hostmask = ipaddress.IPv4Interface('10.0.0.1/0.255.255.255')
619 self.ipv6_address = ipaddress.IPv6Interface(
620 '2001:658:22a:cafe:200:0:0:1')
621 self.ipv6_interface = ipaddress.IPv6Interface(
622 '2001:658:22a:cafe:200:0:0:1/64')
623 self.ipv6_network = ipaddress.IPv6Network('2001:658:22a:cafe::/64')
624
625 def testRepr(self):
626 self.assertEqual("IPv4Interface('1.2.3.4/32')",
627 repr(ipaddress.IPv4Interface('1.2.3.4')))
628 self.assertEqual("IPv6Interface('::1/128')",
629 repr(ipaddress.IPv6Interface('::1')))
630
Antoine Pitrou5fb195f2014-05-12 20:36:46 +0200631 # issue #16531: constructing IPv4Network from a (address, mask) tuple
632 def testIPv4Tuple(self):
633 # /32
634 ip = ipaddress.IPv4Address('192.0.2.1')
635 net = ipaddress.IPv4Network('192.0.2.1/32')
636 self.assertEqual(ipaddress.IPv4Network(('192.0.2.1', 32)), net)
637 self.assertEqual(ipaddress.IPv4Network((ip, 32)), net)
638 self.assertEqual(ipaddress.IPv4Network((3221225985, 32)), net)
639 self.assertEqual(ipaddress.IPv4Network(('192.0.2.1',
640 '255.255.255.255')), net)
641 self.assertEqual(ipaddress.IPv4Network((ip,
642 '255.255.255.255')), net)
643 self.assertEqual(ipaddress.IPv4Network((3221225985,
644 '255.255.255.255')), net)
645 # strict=True and host bits set
646 with self.assertRaises(ValueError):
647 ipaddress.IPv4Network(('192.0.2.1', 24))
648 with self.assertRaises(ValueError):
649 ipaddress.IPv4Network((ip, 24))
650 with self.assertRaises(ValueError):
651 ipaddress.IPv4Network((3221225985, 24))
652 with self.assertRaises(ValueError):
653 ipaddress.IPv4Network(('192.0.2.1', '255.255.255.0'))
654 with self.assertRaises(ValueError):
655 ipaddress.IPv4Network((ip, '255.255.255.0'))
656 with self.assertRaises(ValueError):
657 ipaddress.IPv4Network((3221225985, '255.255.255.0'))
658 # strict=False and host bits set
659 net = ipaddress.IPv4Network('192.0.2.0/24')
660 self.assertEqual(ipaddress.IPv4Network(('192.0.2.1', 24),
661 strict=False), net)
662 self.assertEqual(ipaddress.IPv4Network((ip, 24),
663 strict=False), net)
664 self.assertEqual(ipaddress.IPv4Network((3221225985, 24),
665 strict=False), net)
666 self.assertEqual(ipaddress.IPv4Network(('192.0.2.1',
667 '255.255.255.0'),
668 strict=False), net)
669 self.assertEqual(ipaddress.IPv4Network((ip,
670 '255.255.255.0'),
671 strict=False), net)
672 self.assertEqual(ipaddress.IPv4Network((3221225985,
673 '255.255.255.0'),
674 strict=False), net)
675
676 # /24
677 ip = ipaddress.IPv4Address('192.0.2.0')
678 net = ipaddress.IPv4Network('192.0.2.0/24')
679 self.assertEqual(ipaddress.IPv4Network(('192.0.2.0',
680 '255.255.255.0')), net)
681 self.assertEqual(ipaddress.IPv4Network((ip,
682 '255.255.255.0')), net)
683 self.assertEqual(ipaddress.IPv4Network((3221225984,
684 '255.255.255.0')), net)
685 self.assertEqual(ipaddress.IPv4Network(('192.0.2.0', 24)), net)
686 self.assertEqual(ipaddress.IPv4Network((ip, 24)), net)
687 self.assertEqual(ipaddress.IPv4Network((3221225984, 24)), net)
688
689 self.assertEqual(ipaddress.IPv4Interface(('192.0.2.1', 24)),
690 ipaddress.IPv4Interface('192.0.2.1/24'))
691 self.assertEqual(ipaddress.IPv4Interface((3221225985, 24)),
692 ipaddress.IPv4Interface('192.0.2.1/24'))
693
694 # issue #16531: constructing IPv6Network from a (address, mask) tuple
695 def testIPv6Tuple(self):
696 # /128
697 ip = ipaddress.IPv6Address('2001:db8::')
698 net = ipaddress.IPv6Network('2001:db8::/128')
699 self.assertEqual(ipaddress.IPv6Network(('2001:db8::', '128')),
700 net)
701 self.assertEqual(ipaddress.IPv6Network(
702 (42540766411282592856903984951653826560, 128)),
703 net)
704 self.assertEqual(ipaddress.IPv6Network((ip, '128')),
705 net)
706 ip = ipaddress.IPv6Address('2001:db8::')
707 net = ipaddress.IPv6Network('2001:db8::/96')
708 self.assertEqual(ipaddress.IPv6Network(('2001:db8::', '96')),
709 net)
710 self.assertEqual(ipaddress.IPv6Network(
711 (42540766411282592856903984951653826560, 96)),
712 net)
713 self.assertEqual(ipaddress.IPv6Network((ip, '96')),
714 net)
715
716 # strict=True and host bits set
717 ip = ipaddress.IPv6Address('2001:db8::1')
718 with self.assertRaises(ValueError):
719 ipaddress.IPv6Network(('2001:db8::1', 96))
720 with self.assertRaises(ValueError):
721 ipaddress.IPv6Network((
722 42540766411282592856903984951653826561, 96))
723 with self.assertRaises(ValueError):
724 ipaddress.IPv6Network((ip, 96))
725 # strict=False and host bits set
726 net = ipaddress.IPv6Network('2001:db8::/96')
727 self.assertEqual(ipaddress.IPv6Network(('2001:db8::1', 96),
728 strict=False),
729 net)
730 self.assertEqual(ipaddress.IPv6Network(
731 (42540766411282592856903984951653826561, 96),
732 strict=False),
733 net)
734 self.assertEqual(ipaddress.IPv6Network((ip, 96), strict=False),
735 net)
736
737 # /96
738 self.assertEqual(ipaddress.IPv6Interface(('2001:db8::1', '96')),
739 ipaddress.IPv6Interface('2001:db8::1/96'))
740 self.assertEqual(ipaddress.IPv6Interface(
741 (42540766411282592856903984951653826561, '96')),
742 ipaddress.IPv6Interface('2001:db8::1/96'))
743
Nick Coghlandc9b2552012-05-20 21:01:57 +1000744 # issue57
745 def testAddressIntMath(self):
746 self.assertEqual(ipaddress.IPv4Address('1.1.1.1') + 255,
747 ipaddress.IPv4Address('1.1.2.0'))
748 self.assertEqual(ipaddress.IPv4Address('1.1.1.1') - 256,
749 ipaddress.IPv4Address('1.1.0.1'))
750 self.assertEqual(ipaddress.IPv6Address('::1') + (2**16 - 2),
751 ipaddress.IPv6Address('::ffff'))
752 self.assertEqual(ipaddress.IPv6Address('::ffff') - (2**16 - 2),
753 ipaddress.IPv6Address('::1'))
754
Nick Coghlan3c2570c2012-07-07 01:13:55 +1000755 def testInvalidIntToBytes(self):
756 self.assertRaises(ValueError, ipaddress.v4_int_to_packed, -1)
757 self.assertRaises(ValueError, ipaddress.v4_int_to_packed,
758 2 ** ipaddress.IPV4LENGTH)
759 self.assertRaises(ValueError, ipaddress.v6_int_to_packed, -1)
760 self.assertRaises(ValueError, ipaddress.v6_int_to_packed,
761 2 ** ipaddress.IPV6LENGTH)
762
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200763 def testInternals(self):
764 first, last = ipaddress._find_address_range([
765 ipaddress.IPv4Address('10.10.10.10'),
766 ipaddress.IPv4Address('10.10.10.12')])
767 self.assertEqual(first, last)
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200768 self.assertEqual(128, ipaddress._count_righthand_zero_bits(0, 128))
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200769 self.assertEqual("IPv4Network('1.2.3.0/24')", repr(self.ipv4_network))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000770
Nick Coghland9722652012-06-17 16:33:00 +1000771 def testMissingAddressVersion(self):
772 class Broken(ipaddress._BaseAddress):
773 pass
774 broken = Broken('127.0.0.1')
775 with self.assertRaisesRegex(NotImplementedError, "Broken.*version"):
776 broken.version
777
778 def testMissingNetworkVersion(self):
779 class Broken(ipaddress._BaseNetwork):
780 pass
781 broken = Broken('127.0.0.1')
782 with self.assertRaisesRegex(NotImplementedError, "Broken.*version"):
783 broken.version
784
785 def testMissingAddressClass(self):
786 class Broken(ipaddress._BaseNetwork):
787 pass
788 broken = Broken('127.0.0.1')
789 with self.assertRaisesRegex(NotImplementedError, "Broken.*address"):
790 broken._address_class
791
Nick Coghlandc9b2552012-05-20 21:01:57 +1000792 def testGetNetwork(self):
793 self.assertEqual(int(self.ipv4_network.network_address), 16909056)
794 self.assertEqual(str(self.ipv4_network.network_address), '1.2.3.0')
795
796 self.assertEqual(int(self.ipv6_network.network_address),
797 42540616829182469433403647294022090752)
798 self.assertEqual(str(self.ipv6_network.network_address),
799 '2001:658:22a:cafe::')
800 self.assertEqual(str(self.ipv6_network.hostmask),
801 '::ffff:ffff:ffff:ffff')
802
Nick Coghlandc9b2552012-05-20 21:01:57 +1000803 def testIpFromInt(self):
804 self.assertEqual(self.ipv4_interface._ip,
805 ipaddress.IPv4Interface(16909060)._ip)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000806
807 ipv4 = ipaddress.ip_network('1.2.3.4')
808 ipv6 = ipaddress.ip_network('2001:658:22a:cafe:200:0:0:1')
Nick Coghlan730f67f2012-08-05 22:02:18 +1000809 self.assertEqual(ipv4, ipaddress.ip_network(int(ipv4.network_address)))
810 self.assertEqual(ipv6, ipaddress.ip_network(int(ipv6.network_address)))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000811
812 v6_int = 42540616829182469433547762482097946625
813 self.assertEqual(self.ipv6_interface._ip,
814 ipaddress.IPv6Interface(v6_int)._ip)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000815
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200816 self.assertEqual(ipaddress.ip_network(self.ipv4_address._ip).version,
817 4)
818 self.assertEqual(ipaddress.ip_network(self.ipv6_address._ip).version,
819 6)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000820
821 def testIpFromPacked(self):
Nick Coghlan5cf896f2012-07-07 01:43:31 +1000822 address = ipaddress.ip_address
Nick Coghlandc9b2552012-05-20 21:01:57 +1000823 self.assertEqual(self.ipv4_interface._ip,
Nick Coghlan5cf896f2012-07-07 01:43:31 +1000824 ipaddress.ip_interface(b'\x01\x02\x03\x04')._ip)
825 self.assertEqual(address('255.254.253.252'),
826 address(b'\xff\xfe\xfd\xfc'))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000827 self.assertEqual(self.ipv6_interface.ip,
828 ipaddress.ip_interface(
Nick Coghlan5cf896f2012-07-07 01:43:31 +1000829 b'\x20\x01\x06\x58\x02\x2a\xca\xfe'
830 b'\x02\x00\x00\x00\x00\x00\x00\x01').ip)
831 self.assertEqual(address('ffff:2:3:4:ffff::'),
832 address(b'\xff\xff\x00\x02\x00\x03\x00\x04' +
833 b'\xff\xff' + b'\x00' * 6))
834 self.assertEqual(address('::'),
835 address(b'\x00' * 16))
836
Nick Coghlandc9b2552012-05-20 21:01:57 +1000837 def testGetIp(self):
838 self.assertEqual(int(self.ipv4_interface.ip), 16909060)
839 self.assertEqual(str(self.ipv4_interface.ip), '1.2.3.4')
840
841 self.assertEqual(int(self.ipv6_interface.ip),
842 42540616829182469433547762482097946625)
843 self.assertEqual(str(self.ipv6_interface.ip),
844 '2001:658:22a:cafe:200::1')
845
846 def testGetNetmask(self):
847 self.assertEqual(int(self.ipv4_network.netmask), 4294967040)
848 self.assertEqual(str(self.ipv4_network.netmask), '255.255.255.0')
849 self.assertEqual(int(self.ipv6_network.netmask),
850 340282366920938463444927863358058659840)
851 self.assertEqual(self.ipv6_network.prefixlen, 64)
852
853 def testZeroNetmask(self):
854 ipv4_zero_netmask = ipaddress.IPv4Interface('1.2.3.4/0')
855 self.assertEqual(int(ipv4_zero_netmask.network.netmask), 0)
Nick Coghlan932346f2014-02-08 23:17:36 +1000856 self.assertEqual(ipv4_zero_netmask._prefix_from_prefix_string('0'), 0)
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200857 self.assertTrue(ipv4_zero_netmask._is_valid_netmask('0'))
858 self.assertTrue(ipv4_zero_netmask._is_valid_netmask('0.0.0.0'))
859 self.assertFalse(ipv4_zero_netmask._is_valid_netmask('invalid'))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000860
861 ipv6_zero_netmask = ipaddress.IPv6Interface('::1/0')
862 self.assertEqual(int(ipv6_zero_netmask.network.netmask), 0)
Nick Coghlan932346f2014-02-08 23:17:36 +1000863 self.assertEqual(ipv6_zero_netmask._prefix_from_prefix_string('0'), 0)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000864
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200865 def testIPv4NetAndHostmasks(self):
866 net = self.ipv4_network
867 self.assertFalse(net._is_valid_netmask('invalid'))
868 self.assertTrue(net._is_valid_netmask('128.128.128.128'))
869 self.assertFalse(net._is_valid_netmask('128.128.128.127'))
870 self.assertFalse(net._is_valid_netmask('128.128.128.255'))
871 self.assertTrue(net._is_valid_netmask('255.128.128.128'))
872
873 self.assertFalse(net._is_hostmask('invalid'))
874 self.assertTrue(net._is_hostmask('128.255.255.255'))
875 self.assertFalse(net._is_hostmask('255.255.255.255'))
876 self.assertFalse(net._is_hostmask('1.2.3.4'))
877
878 net = ipaddress.IPv4Network('127.0.0.0/0.0.0.255')
Nick Coghlan932346f2014-02-08 23:17:36 +1000879 self.assertEqual(net.prefixlen, 24)
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200880
Nick Coghlandc9b2552012-05-20 21:01:57 +1000881 def testGetBroadcast(self):
882 self.assertEqual(int(self.ipv4_network.broadcast_address), 16909311)
883 self.assertEqual(str(self.ipv4_network.broadcast_address), '1.2.3.255')
884
885 self.assertEqual(int(self.ipv6_network.broadcast_address),
886 42540616829182469451850391367731642367)
887 self.assertEqual(str(self.ipv6_network.broadcast_address),
888 '2001:658:22a:cafe:ffff:ffff:ffff:ffff')
889
890 def testGetPrefixlen(self):
Nick Coghlane3ded952012-08-05 22:45:22 +1000891 self.assertEqual(self.ipv4_interface.network.prefixlen, 24)
892 self.assertEqual(self.ipv6_interface.network.prefixlen, 64)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000893
894 def testGetSupernet(self):
895 self.assertEqual(self.ipv4_network.supernet().prefixlen, 23)
896 self.assertEqual(str(self.ipv4_network.supernet().network_address),
897 '1.2.2.0')
898 self.assertEqual(
899 ipaddress.IPv4Interface('0.0.0.0/0').network.supernet(),
900 ipaddress.IPv4Network('0.0.0.0/0'))
901
902 self.assertEqual(self.ipv6_network.supernet().prefixlen, 63)
903 self.assertEqual(str(self.ipv6_network.supernet().network_address),
904 '2001:658:22a:cafe::')
905 self.assertEqual(ipaddress.IPv6Interface('::0/0').network.supernet(),
906 ipaddress.IPv6Network('::0/0'))
907
908 def testGetSupernet3(self):
909 self.assertEqual(self.ipv4_network.supernet(3).prefixlen, 21)
910 self.assertEqual(str(self.ipv4_network.supernet(3).network_address),
911 '1.2.0.0')
912
913 self.assertEqual(self.ipv6_network.supernet(3).prefixlen, 61)
914 self.assertEqual(str(self.ipv6_network.supernet(3).network_address),
915 '2001:658:22a:caf8::')
916
917 def testGetSupernet4(self):
918 self.assertRaises(ValueError, self.ipv4_network.supernet,
919 prefixlen_diff=2, new_prefix=1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200920 self.assertRaises(ValueError, self.ipv4_network.supernet,
921 new_prefix=25)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000922 self.assertEqual(self.ipv4_network.supernet(prefixlen_diff=2),
923 self.ipv4_network.supernet(new_prefix=22))
924
925 self.assertRaises(ValueError, self.ipv6_network.supernet,
926 prefixlen_diff=2, new_prefix=1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200927 self.assertRaises(ValueError, self.ipv6_network.supernet,
928 new_prefix=65)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000929 self.assertEqual(self.ipv6_network.supernet(prefixlen_diff=2),
930 self.ipv6_network.supernet(new_prefix=62))
931
932 def testHosts(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200933 hosts = list(self.ipv4_network.hosts())
934 self.assertEqual(254, len(hosts))
935 self.assertEqual(ipaddress.IPv4Address('1.2.3.1'), hosts[0])
936 self.assertEqual(ipaddress.IPv4Address('1.2.3.254'), hosts[-1])
937
938 # special case where only 1 bit is left for address
Nick Coghlandc9b2552012-05-20 21:01:57 +1000939 self.assertEqual([ipaddress.IPv4Address('2.0.0.0'),
940 ipaddress.IPv4Address('2.0.0.1')],
941 list(ipaddress.ip_network('2.0.0.0/31').hosts()))
942
943 def testFancySubnetting(self):
944 self.assertEqual(sorted(self.ipv4_network.subnets(prefixlen_diff=3)),
945 sorted(self.ipv4_network.subnets(new_prefix=27)))
946 self.assertRaises(ValueError, list,
947 self.ipv4_network.subnets(new_prefix=23))
948 self.assertRaises(ValueError, list,
949 self.ipv4_network.subnets(prefixlen_diff=3,
950 new_prefix=27))
951 self.assertEqual(sorted(self.ipv6_network.subnets(prefixlen_diff=4)),
952 sorted(self.ipv6_network.subnets(new_prefix=68)))
953 self.assertRaises(ValueError, list,
954 self.ipv6_network.subnets(new_prefix=63))
955 self.assertRaises(ValueError, list,
956 self.ipv6_network.subnets(prefixlen_diff=4,
957 new_prefix=68))
958
959 def testGetSubnets(self):
960 self.assertEqual(list(self.ipv4_network.subnets())[0].prefixlen, 25)
961 self.assertEqual(str(list(
962 self.ipv4_network.subnets())[0].network_address),
963 '1.2.3.0')
964 self.assertEqual(str(list(
965 self.ipv4_network.subnets())[1].network_address),
966 '1.2.3.128')
967
968 self.assertEqual(list(self.ipv6_network.subnets())[0].prefixlen, 65)
969
970 def testGetSubnetForSingle32(self):
971 ip = ipaddress.IPv4Network('1.2.3.4/32')
972 subnets1 = [str(x) for x in ip.subnets()]
973 subnets2 = [str(x) for x in ip.subnets(2)]
974 self.assertEqual(subnets1, ['1.2.3.4/32'])
975 self.assertEqual(subnets1, subnets2)
976
977 def testGetSubnetForSingle128(self):
978 ip = ipaddress.IPv6Network('::1/128')
979 subnets1 = [str(x) for x in ip.subnets()]
980 subnets2 = [str(x) for x in ip.subnets(2)]
981 self.assertEqual(subnets1, ['::1/128'])
982 self.assertEqual(subnets1, subnets2)
983
984 def testSubnet2(self):
985 ips = [str(x) for x in self.ipv4_network.subnets(2)]
986 self.assertEqual(
987 ips,
988 ['1.2.3.0/26', '1.2.3.64/26', '1.2.3.128/26', '1.2.3.192/26'])
989
990 ipsv6 = [str(x) for x in self.ipv6_network.subnets(2)]
991 self.assertEqual(
992 ipsv6,
993 ['2001:658:22a:cafe::/66',
994 '2001:658:22a:cafe:4000::/66',
995 '2001:658:22a:cafe:8000::/66',
996 '2001:658:22a:cafe:c000::/66'])
997
998 def testSubnetFailsForLargeCidrDiff(self):
999 self.assertRaises(ValueError, list,
1000 self.ipv4_interface.network.subnets(9))
1001 self.assertRaises(ValueError, list,
1002 self.ipv4_network.subnets(9))
1003 self.assertRaises(ValueError, list,
1004 self.ipv6_interface.network.subnets(65))
1005 self.assertRaises(ValueError, list,
1006 self.ipv6_network.subnets(65))
1007
1008 def testSupernetFailsForLargeCidrDiff(self):
1009 self.assertRaises(ValueError,
1010 self.ipv4_interface.network.supernet, 25)
1011 self.assertRaises(ValueError,
1012 self.ipv6_interface.network.supernet, 65)
1013
1014 def testSubnetFailsForNegativeCidrDiff(self):
1015 self.assertRaises(ValueError, list,
1016 self.ipv4_interface.network.subnets(-1))
1017 self.assertRaises(ValueError, list,
Nick Coghlan2c589102012-05-27 01:03:25 +10001018 self.ipv4_network.subnets(-1))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001019 self.assertRaises(ValueError, list,
1020 self.ipv6_interface.network.subnets(-1))
1021 self.assertRaises(ValueError, list,
1022 self.ipv6_network.subnets(-1))
1023
1024 def testGetNum_Addresses(self):
1025 self.assertEqual(self.ipv4_network.num_addresses, 256)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001026 self.assertEqual(list(self.ipv4_network.subnets())[0].num_addresses,
1027 128)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001028 self.assertEqual(self.ipv4_network.supernet().num_addresses, 512)
1029
1030 self.assertEqual(self.ipv6_network.num_addresses, 18446744073709551616)
1031 self.assertEqual(list(self.ipv6_network.subnets())[0].num_addresses,
1032 9223372036854775808)
1033 self.assertEqual(self.ipv6_network.supernet().num_addresses,
1034 36893488147419103232)
1035
1036 def testContains(self):
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001037 self.assertIn(ipaddress.IPv4Interface('1.2.3.128/25'),
1038 self.ipv4_network)
1039 self.assertNotIn(ipaddress.IPv4Interface('1.2.4.1/24'),
Nick Coghlandc9b2552012-05-20 21:01:57 +10001040 self.ipv4_network)
1041 # We can test addresses and string as well.
1042 addr1 = ipaddress.IPv4Address('1.2.3.37')
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001043 self.assertIn(addr1, self.ipv4_network)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001044 # issue 61, bad network comparison on like-ip'd network objects
1045 # with identical broadcast addresses.
1046 self.assertFalse(ipaddress.IPv4Network('1.1.0.0/16').__contains__(
1047 ipaddress.IPv4Network('1.0.0.0/15')))
1048
Nick Coghlandc9b2552012-05-20 21:01:57 +10001049 def testNth(self):
1050 self.assertEqual(str(self.ipv4_network[5]), '1.2.3.5')
1051 self.assertRaises(IndexError, self.ipv4_network.__getitem__, 256)
1052
1053 self.assertEqual(str(self.ipv6_network[5]),
1054 '2001:658:22a:cafe::5')
1055
1056 def testGetitem(self):
1057 # http://code.google.com/p/ipaddr-py/issues/detail?id=15
1058 addr = ipaddress.IPv4Network('172.31.255.128/255.255.255.240')
1059 self.assertEqual(28, addr.prefixlen)
1060 addr_list = list(addr)
1061 self.assertEqual('172.31.255.128', str(addr_list[0]))
1062 self.assertEqual('172.31.255.128', str(addr[0]))
1063 self.assertEqual('172.31.255.143', str(addr_list[-1]))
1064 self.assertEqual('172.31.255.143', str(addr[-1]))
1065 self.assertEqual(addr_list[-1], addr[-1])
1066
1067 def testEqual(self):
1068 self.assertTrue(self.ipv4_interface ==
1069 ipaddress.IPv4Interface('1.2.3.4/24'))
1070 self.assertFalse(self.ipv4_interface ==
1071 ipaddress.IPv4Interface('1.2.3.4/23'))
1072 self.assertFalse(self.ipv4_interface ==
1073 ipaddress.IPv6Interface('::1.2.3.4/24'))
1074 self.assertFalse(self.ipv4_interface == '')
1075 self.assertFalse(self.ipv4_interface == [])
1076 self.assertFalse(self.ipv4_interface == 2)
1077
1078 self.assertTrue(self.ipv6_interface ==
1079 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/64'))
1080 self.assertFalse(self.ipv6_interface ==
1081 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/63'))
1082 self.assertFalse(self.ipv6_interface ==
1083 ipaddress.IPv4Interface('1.2.3.4/23'))
1084 self.assertFalse(self.ipv6_interface == '')
1085 self.assertFalse(self.ipv6_interface == [])
1086 self.assertFalse(self.ipv6_interface == 2)
1087
1088 def testNotEqual(self):
1089 self.assertFalse(self.ipv4_interface !=
1090 ipaddress.IPv4Interface('1.2.3.4/24'))
1091 self.assertTrue(self.ipv4_interface !=
1092 ipaddress.IPv4Interface('1.2.3.4/23'))
1093 self.assertTrue(self.ipv4_interface !=
1094 ipaddress.IPv6Interface('::1.2.3.4/24'))
1095 self.assertTrue(self.ipv4_interface != '')
1096 self.assertTrue(self.ipv4_interface != [])
1097 self.assertTrue(self.ipv4_interface != 2)
1098
1099 self.assertTrue(self.ipv4_address !=
1100 ipaddress.IPv4Address('1.2.3.5'))
1101 self.assertTrue(self.ipv4_address != '')
1102 self.assertTrue(self.ipv4_address != [])
1103 self.assertTrue(self.ipv4_address != 2)
1104
1105 self.assertFalse(self.ipv6_interface !=
1106 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/64'))
1107 self.assertTrue(self.ipv6_interface !=
1108 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/63'))
1109 self.assertTrue(self.ipv6_interface !=
1110 ipaddress.IPv4Interface('1.2.3.4/23'))
1111 self.assertTrue(self.ipv6_interface != '')
1112 self.assertTrue(self.ipv6_interface != [])
1113 self.assertTrue(self.ipv6_interface != 2)
1114
1115 self.assertTrue(self.ipv6_address !=
1116 ipaddress.IPv4Address('1.2.3.4'))
1117 self.assertTrue(self.ipv6_address != '')
1118 self.assertTrue(self.ipv6_address != [])
1119 self.assertTrue(self.ipv6_address != 2)
1120
1121 def testSlash32Constructor(self):
1122 self.assertEqual(str(ipaddress.IPv4Interface(
1123 '1.2.3.4/255.255.255.255')), '1.2.3.4/32')
1124
1125 def testSlash128Constructor(self):
1126 self.assertEqual(str(ipaddress.IPv6Interface('::1/128')),
1127 '::1/128')
1128
1129 def testSlash0Constructor(self):
1130 self.assertEqual(str(ipaddress.IPv4Interface('1.2.3.4/0.0.0.0')),
1131 '1.2.3.4/0')
1132
1133 def testCollapsing(self):
1134 # test only IP addresses including some duplicates
1135 ip1 = ipaddress.IPv4Address('1.1.1.0')
1136 ip2 = ipaddress.IPv4Address('1.1.1.1')
1137 ip3 = ipaddress.IPv4Address('1.1.1.2')
1138 ip4 = ipaddress.IPv4Address('1.1.1.3')
1139 ip5 = ipaddress.IPv4Address('1.1.1.4')
1140 ip6 = ipaddress.IPv4Address('1.1.1.0')
1141 # check that addreses are subsumed properly.
1142 collapsed = ipaddress.collapse_addresses(
1143 [ip1, ip2, ip3, ip4, ip5, ip6])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001144 self.assertEqual(list(collapsed),
1145 [ipaddress.IPv4Network('1.1.1.0/30'),
1146 ipaddress.IPv4Network('1.1.1.4/32')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001147
1148 # test a mix of IP addresses and networks including some duplicates
1149 ip1 = ipaddress.IPv4Address('1.1.1.0')
1150 ip2 = ipaddress.IPv4Address('1.1.1.1')
1151 ip3 = ipaddress.IPv4Address('1.1.1.2')
1152 ip4 = ipaddress.IPv4Address('1.1.1.3')
1153 #ip5 = ipaddress.IPv4Interface('1.1.1.4/30')
1154 #ip6 = ipaddress.IPv4Interface('1.1.1.4/30')
1155 # check that addreses are subsumed properly.
1156 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3, ip4])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001157 self.assertEqual(list(collapsed),
1158 [ipaddress.IPv4Network('1.1.1.0/30')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001159
1160 # test only IP networks
1161 ip1 = ipaddress.IPv4Network('1.1.0.0/24')
1162 ip2 = ipaddress.IPv4Network('1.1.1.0/24')
1163 ip3 = ipaddress.IPv4Network('1.1.2.0/24')
1164 ip4 = ipaddress.IPv4Network('1.1.3.0/24')
1165 ip5 = ipaddress.IPv4Network('1.1.4.0/24')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001166 # stored in no particular order b/c we want CollapseAddr to call
1167 # [].sort
Nick Coghlandc9b2552012-05-20 21:01:57 +10001168 ip6 = ipaddress.IPv4Network('1.1.0.0/22')
1169 # check that addreses are subsumed properly.
1170 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3, ip4, ip5,
1171 ip6])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001172 self.assertEqual(list(collapsed),
1173 [ipaddress.IPv4Network('1.1.0.0/22'),
1174 ipaddress.IPv4Network('1.1.4.0/24')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001175
1176 # test that two addresses are supernet'ed properly
1177 collapsed = ipaddress.collapse_addresses([ip1, ip2])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001178 self.assertEqual(list(collapsed),
1179 [ipaddress.IPv4Network('1.1.0.0/23')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001180
1181 # test same IP networks
1182 ip_same1 = ip_same2 = ipaddress.IPv4Network('1.1.1.1/32')
1183 self.assertEqual(list(ipaddress.collapse_addresses(
1184 [ip_same1, ip_same2])),
1185 [ip_same1])
1186
1187 # test same IP addresses
1188 ip_same1 = ip_same2 = ipaddress.IPv4Address('1.1.1.1')
1189 self.assertEqual(list(ipaddress.collapse_addresses(
1190 [ip_same1, ip_same2])),
1191 [ipaddress.ip_network('1.1.1.1/32')])
1192 ip1 = ipaddress.IPv6Network('2001::/100')
1193 ip2 = ipaddress.IPv6Network('2001::/120')
1194 ip3 = ipaddress.IPv6Network('2001::/96')
1195 # test that ipv6 addresses are subsumed properly.
1196 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3])
1197 self.assertEqual(list(collapsed), [ip3])
1198
1199 # the toejam test
Hynek Schlawack35db5132012-06-01 20:12:17 +02001200 addr_tuples = [
1201 (ipaddress.ip_address('1.1.1.1'),
1202 ipaddress.ip_address('::1')),
1203 (ipaddress.IPv4Network('1.1.0.0/24'),
1204 ipaddress.IPv6Network('2001::/120')),
1205 (ipaddress.IPv4Network('1.1.0.0/32'),
1206 ipaddress.IPv6Network('2001::/128')),
1207 ]
1208 for ip1, ip2 in addr_tuples:
1209 self.assertRaises(TypeError, ipaddress.collapse_addresses,
1210 [ip1, ip2])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001211
1212 def testSummarizing(self):
1213 #ip = ipaddress.ip_address
1214 #ipnet = ipaddress.ip_network
1215 summarize = ipaddress.summarize_address_range
1216 ip1 = ipaddress.ip_address('1.1.1.0')
1217 ip2 = ipaddress.ip_address('1.1.1.255')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001218
1219 # summarize works only for IPv4 & IPv6
1220 class IPv7Address(ipaddress.IPv6Address):
1221 @property
1222 def version(self):
1223 return 7
1224 ip_invalid1 = IPv7Address('::1')
1225 ip_invalid2 = IPv7Address('::1')
1226 self.assertRaises(ValueError, list,
1227 summarize(ip_invalid1, ip_invalid2))
1228 # test that a summary over ip4 & ip6 fails
1229 self.assertRaises(TypeError, list,
1230 summarize(ip1, ipaddress.IPv6Address('::1')))
1231 # test a /24 is summarized properly
Nick Coghlandc9b2552012-05-20 21:01:57 +10001232 self.assertEqual(list(summarize(ip1, ip2))[0],
1233 ipaddress.ip_network('1.1.1.0/24'))
1234 # test an IPv4 range that isn't on a network byte boundary
1235 ip2 = ipaddress.ip_address('1.1.1.8')
1236 self.assertEqual(list(summarize(ip1, ip2)),
1237 [ipaddress.ip_network('1.1.1.0/29'),
1238 ipaddress.ip_network('1.1.1.8')])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001239 # all!
1240 ip1 = ipaddress.IPv4Address(0)
1241 ip2 = ipaddress.IPv4Address(ipaddress.IPv4Address._ALL_ONES)
1242 self.assertEqual([ipaddress.IPv4Network('0.0.0.0/0')],
1243 list(summarize(ip1, ip2)))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001244
1245 ip1 = ipaddress.ip_address('1::')
1246 ip2 = ipaddress.ip_address('1:ffff:ffff:ffff:ffff:ffff:ffff:ffff')
1247 # test a IPv6 is sumamrized properly
1248 self.assertEqual(list(summarize(ip1, ip2))[0],
1249 ipaddress.ip_network('1::/16'))
1250 # test an IPv6 range that isn't on a network byte boundary
1251 ip2 = ipaddress.ip_address('2::')
1252 self.assertEqual(list(summarize(ip1, ip2)),
1253 [ipaddress.ip_network('1::/16'),
1254 ipaddress.ip_network('2::/128')])
1255
1256 # test exception raised when first is greater than last
1257 self.assertRaises(ValueError, list,
1258 summarize(ipaddress.ip_address('1.1.1.0'),
1259 ipaddress.ip_address('1.1.0.0')))
1260 # test exception raised when first and last aren't IP addresses
1261 self.assertRaises(TypeError, list,
1262 summarize(ipaddress.ip_network('1.1.1.0'),
1263 ipaddress.ip_network('1.1.0.0')))
1264 self.assertRaises(TypeError, list,
1265 summarize(ipaddress.ip_network('1.1.1.0'),
1266 ipaddress.ip_network('1.1.0.0')))
1267 # test exception raised when first and last are not same version
1268 self.assertRaises(TypeError, list,
1269 summarize(ipaddress.ip_address('::'),
1270 ipaddress.ip_network('1.1.0.0')))
1271
1272 def testAddressComparison(self):
1273 self.assertTrue(ipaddress.ip_address('1.1.1.1') <=
1274 ipaddress.ip_address('1.1.1.1'))
1275 self.assertTrue(ipaddress.ip_address('1.1.1.1') <=
1276 ipaddress.ip_address('1.1.1.2'))
1277 self.assertTrue(ipaddress.ip_address('::1') <=
1278 ipaddress.ip_address('::1'))
1279 self.assertTrue(ipaddress.ip_address('::1') <=
1280 ipaddress.ip_address('::2'))
1281
Nick Coghlan3008ec02012-07-08 00:45:33 +10001282 def testInterfaceComparison(self):
1283 self.assertTrue(ipaddress.ip_interface('1.1.1.1') <=
1284 ipaddress.ip_interface('1.1.1.1'))
1285 self.assertTrue(ipaddress.ip_interface('1.1.1.1') <=
1286 ipaddress.ip_interface('1.1.1.2'))
1287 self.assertTrue(ipaddress.ip_interface('::1') <=
1288 ipaddress.ip_interface('::1'))
1289 self.assertTrue(ipaddress.ip_interface('::1') <=
1290 ipaddress.ip_interface('::2'))
1291
Nick Coghlandc9b2552012-05-20 21:01:57 +10001292 def testNetworkComparison(self):
1293 # ip1 and ip2 have the same network address
1294 ip1 = ipaddress.IPv4Network('1.1.1.0/24')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001295 ip2 = ipaddress.IPv4Network('1.1.1.0/32')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001296 ip3 = ipaddress.IPv4Network('1.1.2.0/24')
1297
1298 self.assertTrue(ip1 < ip3)
1299 self.assertTrue(ip3 > ip2)
1300
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001301 self.assertEqual(ip1.compare_networks(ip1), 0)
1302
1303 # if addresses are the same, sort by netmask
1304 self.assertEqual(ip1.compare_networks(ip2), -1)
1305 self.assertEqual(ip2.compare_networks(ip1), 1)
1306
Nick Coghlandc9b2552012-05-20 21:01:57 +10001307 self.assertEqual(ip1.compare_networks(ip3), -1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001308 self.assertEqual(ip3.compare_networks(ip1), 1)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001309 self.assertTrue(ip1._get_networks_key() < ip3._get_networks_key())
1310
1311 ip1 = ipaddress.IPv6Network('2001:2000::/96')
1312 ip2 = ipaddress.IPv6Network('2001:2001::/96')
1313 ip3 = ipaddress.IPv6Network('2001:ffff:2000::/96')
1314
1315 self.assertTrue(ip1 < ip3)
1316 self.assertTrue(ip3 > ip2)
1317 self.assertEqual(ip1.compare_networks(ip3), -1)
1318 self.assertTrue(ip1._get_networks_key() < ip3._get_networks_key())
1319
1320 # Test comparing different protocols.
1321 # Should always raise a TypeError.
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001322 self.assertRaises(TypeError,
1323 self.ipv4_network.compare_networks,
1324 self.ipv6_network)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001325 ipv6 = ipaddress.IPv6Interface('::/0')
1326 ipv4 = ipaddress.IPv4Interface('0.0.0.0/0')
1327 self.assertRaises(TypeError, ipv4.__lt__, ipv6)
1328 self.assertRaises(TypeError, ipv4.__gt__, ipv6)
1329 self.assertRaises(TypeError, ipv6.__lt__, ipv4)
1330 self.assertRaises(TypeError, ipv6.__gt__, ipv4)
1331
1332 # Regression test for issue 19.
1333 ip1 = ipaddress.ip_network('10.1.2.128/25')
1334 self.assertFalse(ip1 < ip1)
1335 self.assertFalse(ip1 > ip1)
1336 ip2 = ipaddress.ip_network('10.1.3.0/24')
1337 self.assertTrue(ip1 < ip2)
1338 self.assertFalse(ip2 < ip1)
1339 self.assertFalse(ip1 > ip2)
1340 self.assertTrue(ip2 > ip1)
1341 ip3 = ipaddress.ip_network('10.1.3.0/25')
1342 self.assertTrue(ip2 < ip3)
1343 self.assertFalse(ip3 < ip2)
1344 self.assertFalse(ip2 > ip3)
1345 self.assertTrue(ip3 > ip2)
1346
1347 # Regression test for issue 28.
1348 ip1 = ipaddress.ip_network('10.10.10.0/31')
1349 ip2 = ipaddress.ip_network('10.10.10.0')
1350 ip3 = ipaddress.ip_network('10.10.10.2/31')
1351 ip4 = ipaddress.ip_network('10.10.10.2')
1352 sorted = [ip1, ip2, ip3, ip4]
1353 unsorted = [ip2, ip4, ip1, ip3]
1354 unsorted.sort()
1355 self.assertEqual(sorted, unsorted)
1356 unsorted = [ip4, ip1, ip3, ip2]
1357 unsorted.sort()
1358 self.assertEqual(sorted, unsorted)
1359 self.assertRaises(TypeError, ip1.__lt__,
1360 ipaddress.ip_address('10.10.10.0'))
1361 self.assertRaises(TypeError, ip2.__lt__,
1362 ipaddress.ip_address('10.10.10.0'))
1363
1364 # <=, >=
1365 self.assertTrue(ipaddress.ip_network('1.1.1.1') <=
1366 ipaddress.ip_network('1.1.1.1'))
1367 self.assertTrue(ipaddress.ip_network('1.1.1.1') <=
1368 ipaddress.ip_network('1.1.1.2'))
1369 self.assertFalse(ipaddress.ip_network('1.1.1.2') <=
1370 ipaddress.ip_network('1.1.1.1'))
1371 self.assertTrue(ipaddress.ip_network('::1') <=
1372 ipaddress.ip_network('::1'))
1373 self.assertTrue(ipaddress.ip_network('::1') <=
1374 ipaddress.ip_network('::2'))
1375 self.assertFalse(ipaddress.ip_network('::2') <=
1376 ipaddress.ip_network('::1'))
1377
1378 def testStrictNetworks(self):
1379 self.assertRaises(ValueError, ipaddress.ip_network, '192.168.1.1/24')
1380 self.assertRaises(ValueError, ipaddress.ip_network, '::1/120')
1381
1382 def testOverlaps(self):
1383 other = ipaddress.IPv4Network('1.2.3.0/30')
1384 other2 = ipaddress.IPv4Network('1.2.2.0/24')
1385 other3 = ipaddress.IPv4Network('1.2.2.64/26')
1386 self.assertTrue(self.ipv4_network.overlaps(other))
1387 self.assertFalse(self.ipv4_network.overlaps(other2))
1388 self.assertTrue(other2.overlaps(other3))
1389
1390 def testEmbeddedIpv4(self):
1391 ipv4_string = '192.168.0.1'
1392 ipv4 = ipaddress.IPv4Interface(ipv4_string)
1393 v4compat_ipv6 = ipaddress.IPv6Interface('::%s' % ipv4_string)
1394 self.assertEqual(int(v4compat_ipv6.ip), int(ipv4.ip))
1395 v4mapped_ipv6 = ipaddress.IPv6Interface('::ffff:%s' % ipv4_string)
1396 self.assertNotEqual(v4mapped_ipv6.ip, ipv4.ip)
1397 self.assertRaises(ipaddress.AddressValueError, ipaddress.IPv6Interface,
1398 '2001:1.1.1.1:1.1.1.1')
1399
1400 # Issue 67: IPv6 with embedded IPv4 address not recognized.
1401 def testIPv6AddressTooLarge(self):
1402 # RFC4291 2.5.5.2
1403 self.assertEqual(ipaddress.ip_address('::FFFF:192.0.2.1'),
1404 ipaddress.ip_address('::FFFF:c000:201'))
1405 # RFC4291 2.2 (part 3) x::d.d.d.d
1406 self.assertEqual(ipaddress.ip_address('FFFF::192.0.2.1'),
1407 ipaddress.ip_address('FFFF::c000:201'))
1408
1409 def testIPVersion(self):
1410 self.assertEqual(self.ipv4_address.version, 4)
1411 self.assertEqual(self.ipv6_address.version, 6)
1412
1413 def testMaxPrefixLength(self):
1414 self.assertEqual(self.ipv4_interface.max_prefixlen, 32)
1415 self.assertEqual(self.ipv6_interface.max_prefixlen, 128)
1416
1417 def testPacked(self):
1418 self.assertEqual(self.ipv4_address.packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001419 b'\x01\x02\x03\x04')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001420 self.assertEqual(ipaddress.IPv4Interface('255.254.253.252').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001421 b'\xff\xfe\xfd\xfc')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001422 self.assertEqual(self.ipv6_address.packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001423 b'\x20\x01\x06\x58\x02\x2a\xca\xfe'
1424 b'\x02\x00\x00\x00\x00\x00\x00\x01')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001425 self.assertEqual(ipaddress.IPv6Interface('ffff:2:3:4:ffff::').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001426 b'\xff\xff\x00\x02\x00\x03\x00\x04\xff\xff'
1427 + b'\x00' * 6)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001428 self.assertEqual(ipaddress.IPv6Interface('::1:0:0:0:0').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001429 b'\x00' * 6 + b'\x00\x01' + b'\x00' * 8)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001430
Nick Coghlandc9b2552012-05-20 21:01:57 +10001431 def testIpType(self):
1432 ipv4net = ipaddress.ip_network('1.2.3.4')
1433 ipv4addr = ipaddress.ip_address('1.2.3.4')
1434 ipv6net = ipaddress.ip_network('::1.2.3.4')
1435 ipv6addr = ipaddress.ip_address('::1.2.3.4')
1436 self.assertEqual(ipaddress.IPv4Network, type(ipv4net))
1437 self.assertEqual(ipaddress.IPv4Address, type(ipv4addr))
1438 self.assertEqual(ipaddress.IPv6Network, type(ipv6net))
1439 self.assertEqual(ipaddress.IPv6Address, type(ipv6addr))
1440
1441 def testReservedIpv4(self):
1442 # test networks
1443 self.assertEqual(True, ipaddress.ip_interface(
1444 '224.1.1.1/31').is_multicast)
1445 self.assertEqual(False, ipaddress.ip_network('240.0.0.0').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001446 self.assertEqual(True, ipaddress.ip_network('240.0.0.0').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001447
1448 self.assertEqual(True, ipaddress.ip_interface(
1449 '192.168.1.1/17').is_private)
1450 self.assertEqual(False, ipaddress.ip_network('192.169.0.0').is_private)
1451 self.assertEqual(True, ipaddress.ip_network(
1452 '10.255.255.255').is_private)
1453 self.assertEqual(False, ipaddress.ip_network('11.0.0.0').is_private)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001454 self.assertEqual(False, ipaddress.ip_network('11.0.0.0').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001455 self.assertEqual(True, ipaddress.ip_network(
1456 '172.31.255.255').is_private)
1457 self.assertEqual(False, ipaddress.ip_network('172.32.0.0').is_private)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001458 self.assertEqual(True,
1459 ipaddress.ip_network('169.254.1.0/24').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001460
1461 self.assertEqual(True,
1462 ipaddress.ip_interface(
1463 '169.254.100.200/24').is_link_local)
1464 self.assertEqual(False,
1465 ipaddress.ip_interface(
1466 '169.255.100.200/24').is_link_local)
1467
1468 self.assertEqual(True,
1469 ipaddress.ip_network(
1470 '127.100.200.254/32').is_loopback)
1471 self.assertEqual(True, ipaddress.ip_network(
1472 '127.42.0.0/16').is_loopback)
1473 self.assertEqual(False, ipaddress.ip_network('128.0.0.0').is_loopback)
Peter Moodye5019d52013-10-24 09:47:10 -07001474 self.assertEqual(False,
1475 ipaddress.ip_network('100.64.0.0/10').is_private)
Peter Moodybe9c1b12013-10-22 12:36:21 -07001476 self.assertEqual(False, ipaddress.ip_network('100.64.0.0/10').is_global)
Peter Moodye5019d52013-10-24 09:47:10 -07001477
Peter Moody22c31762013-10-21 13:58:06 -07001478 self.assertEqual(True,
1479 ipaddress.ip_network('192.0.2.128/25').is_private)
1480 self.assertEqual(True,
1481 ipaddress.ip_network('192.0.3.0/24').is_global)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001482
1483 # test addresses
Hynek Schlawackbcd30442012-06-04 14:19:39 +02001484 self.assertEqual(True, ipaddress.ip_address('0.0.0.0').is_unspecified)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001485 self.assertEqual(True, ipaddress.ip_address('224.1.1.1').is_multicast)
1486 self.assertEqual(False, ipaddress.ip_address('240.0.0.0').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001487 self.assertEqual(True, ipaddress.ip_address('240.0.0.1').is_reserved)
1488 self.assertEqual(False,
1489 ipaddress.ip_address('239.255.255.255').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001490
1491 self.assertEqual(True, ipaddress.ip_address('192.168.1.1').is_private)
1492 self.assertEqual(False, ipaddress.ip_address('192.169.0.0').is_private)
1493 self.assertEqual(True, ipaddress.ip_address(
1494 '10.255.255.255').is_private)
1495 self.assertEqual(False, ipaddress.ip_address('11.0.0.0').is_private)
1496 self.assertEqual(True, ipaddress.ip_address(
1497 '172.31.255.255').is_private)
1498 self.assertEqual(False, ipaddress.ip_address('172.32.0.0').is_private)
1499
1500 self.assertEqual(True,
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001501 ipaddress.ip_address('169.254.100.200').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001502 self.assertEqual(False,
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001503 ipaddress.ip_address('169.255.100.200').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001504
1505 self.assertEqual(True,
1506 ipaddress.ip_address('127.100.200.254').is_loopback)
1507 self.assertEqual(True, ipaddress.ip_address('127.42.0.0').is_loopback)
1508 self.assertEqual(False, ipaddress.ip_address('128.0.0.0').is_loopback)
1509 self.assertEqual(True, ipaddress.ip_network('0.0.0.0').is_unspecified)
1510
1511 def testReservedIpv6(self):
1512
1513 self.assertEqual(True, ipaddress.ip_network('ffff::').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001514 self.assertEqual(True, ipaddress.ip_network(2**128 - 1).is_multicast)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001515 self.assertEqual(True, ipaddress.ip_network('ff00::').is_multicast)
1516 self.assertEqual(False, ipaddress.ip_network('fdff::').is_multicast)
1517
1518 self.assertEqual(True, ipaddress.ip_network('fecf::').is_site_local)
1519 self.assertEqual(True, ipaddress.ip_network(
1520 'feff:ffff:ffff:ffff::').is_site_local)
1521 self.assertEqual(False, ipaddress.ip_network(
1522 'fbf:ffff::').is_site_local)
1523 self.assertEqual(False, ipaddress.ip_network('ff00::').is_site_local)
1524
1525 self.assertEqual(True, ipaddress.ip_network('fc00::').is_private)
1526 self.assertEqual(True, ipaddress.ip_network(
1527 'fc00:ffff:ffff:ffff::').is_private)
1528 self.assertEqual(False, ipaddress.ip_network('fbff:ffff::').is_private)
1529 self.assertEqual(False, ipaddress.ip_network('fe00::').is_private)
1530
1531 self.assertEqual(True, ipaddress.ip_network('fea0::').is_link_local)
1532 self.assertEqual(True, ipaddress.ip_network(
1533 'febf:ffff::').is_link_local)
1534 self.assertEqual(False, ipaddress.ip_network(
1535 'fe7f:ffff::').is_link_local)
1536 self.assertEqual(False, ipaddress.ip_network('fec0::').is_link_local)
1537
1538 self.assertEqual(True, ipaddress.ip_interface('0:0::0:01').is_loopback)
1539 self.assertEqual(False, ipaddress.ip_interface('::1/127').is_loopback)
1540 self.assertEqual(False, ipaddress.ip_network('::').is_loopback)
1541 self.assertEqual(False, ipaddress.ip_network('::2').is_loopback)
1542
1543 self.assertEqual(True, ipaddress.ip_network('0::0').is_unspecified)
1544 self.assertEqual(False, ipaddress.ip_network('::1').is_unspecified)
1545 self.assertEqual(False, ipaddress.ip_network('::/127').is_unspecified)
1546
Peter Moody22c31762013-10-21 13:58:06 -07001547 self.assertEqual(True,
1548 ipaddress.ip_network('2001::1/128').is_private)
1549 self.assertEqual(True,
1550 ipaddress.ip_network('200::1/128').is_global)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001551 # test addresses
1552 self.assertEqual(True, ipaddress.ip_address('ffff::').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001553 self.assertEqual(True, ipaddress.ip_address(2**128 - 1).is_multicast)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001554 self.assertEqual(True, ipaddress.ip_address('ff00::').is_multicast)
1555 self.assertEqual(False, ipaddress.ip_address('fdff::').is_multicast)
1556
1557 self.assertEqual(True, ipaddress.ip_address('fecf::').is_site_local)
1558 self.assertEqual(True, ipaddress.ip_address(
1559 'feff:ffff:ffff:ffff::').is_site_local)
1560 self.assertEqual(False, ipaddress.ip_address(
1561 'fbf:ffff::').is_site_local)
1562 self.assertEqual(False, ipaddress.ip_address('ff00::').is_site_local)
1563
1564 self.assertEqual(True, ipaddress.ip_address('fc00::').is_private)
1565 self.assertEqual(True, ipaddress.ip_address(
1566 'fc00:ffff:ffff:ffff::').is_private)
1567 self.assertEqual(False, ipaddress.ip_address('fbff:ffff::').is_private)
1568 self.assertEqual(False, ipaddress.ip_address('fe00::').is_private)
1569
1570 self.assertEqual(True, ipaddress.ip_address('fea0::').is_link_local)
1571 self.assertEqual(True, ipaddress.ip_address(
1572 'febf:ffff::').is_link_local)
1573 self.assertEqual(False, ipaddress.ip_address(
1574 'fe7f:ffff::').is_link_local)
1575 self.assertEqual(False, ipaddress.ip_address('fec0::').is_link_local)
1576
1577 self.assertEqual(True, ipaddress.ip_address('0:0::0:01').is_loopback)
1578 self.assertEqual(True, ipaddress.ip_address('::1').is_loopback)
1579 self.assertEqual(False, ipaddress.ip_address('::2').is_loopback)
1580
1581 self.assertEqual(True, ipaddress.ip_address('0::0').is_unspecified)
1582 self.assertEqual(False, ipaddress.ip_address('::1').is_unspecified)
1583
1584 # some generic IETF reserved addresses
1585 self.assertEqual(True, ipaddress.ip_address('100::').is_reserved)
1586 self.assertEqual(True, ipaddress.ip_network('4000::1/128').is_reserved)
1587
1588 def testIpv4Mapped(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001589 self.assertEqual(
1590 ipaddress.ip_address('::ffff:192.168.1.1').ipv4_mapped,
1591 ipaddress.ip_address('192.168.1.1'))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001592 self.assertEqual(ipaddress.ip_address('::c0a8:101').ipv4_mapped, None)
1593 self.assertEqual(ipaddress.ip_address('::ffff:c0a8:101').ipv4_mapped,
1594 ipaddress.ip_address('192.168.1.1'))
1595
1596 def testAddrExclude(self):
1597 addr1 = ipaddress.ip_network('10.1.1.0/24')
1598 addr2 = ipaddress.ip_network('10.1.1.0/26')
1599 addr3 = ipaddress.ip_network('10.2.1.0/24')
1600 addr4 = ipaddress.ip_address('10.1.1.0')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001601 addr5 = ipaddress.ip_network('2001:db8::0/32')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001602 self.assertEqual(sorted(list(addr1.address_exclude(addr2))),
1603 [ipaddress.ip_network('10.1.1.64/26'),
1604 ipaddress.ip_network('10.1.1.128/25')])
1605 self.assertRaises(ValueError, list, addr1.address_exclude(addr3))
1606 self.assertRaises(TypeError, list, addr1.address_exclude(addr4))
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001607 self.assertRaises(TypeError, list, addr1.address_exclude(addr5))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001608 self.assertEqual(list(addr1.address_exclude(addr1)), [])
1609
1610 def testHash(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001611 self.assertEqual(hash(ipaddress.ip_interface('10.1.1.0/24')),
1612 hash(ipaddress.ip_interface('10.1.1.0/24')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001613 self.assertEqual(hash(ipaddress.ip_network('10.1.1.0/24')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001614 hash(ipaddress.ip_network('10.1.1.0/24')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001615 self.assertEqual(hash(ipaddress.ip_address('10.1.1.0')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001616 hash(ipaddress.ip_address('10.1.1.0')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001617 # i70
1618 self.assertEqual(hash(ipaddress.ip_address('1.2.3.4')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001619 hash(ipaddress.ip_address(
Nick Coghlandc9b2552012-05-20 21:01:57 +10001620 int(ipaddress.ip_address('1.2.3.4')._ip))))
1621 ip1 = ipaddress.ip_address('10.1.1.0')
1622 ip2 = ipaddress.ip_address('1::')
1623 dummy = {}
1624 dummy[self.ipv4_address] = None
1625 dummy[self.ipv6_address] = None
1626 dummy[ip1] = None
1627 dummy[ip2] = None
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001628 self.assertIn(self.ipv4_address, dummy)
1629 self.assertIn(ip2, dummy)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001630
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001631 def testIPBases(self):
1632 net = self.ipv4_network
1633 self.assertEqual('1.2.3.0/24', net.compressed)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001634 net = self.ipv6_network
1635 self.assertRaises(ValueError, net._string_from_ip_int, 2**128 + 1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001636
Hynek Schlawack454a74d2012-06-04 18:14:02 +02001637 def testIPv6NetworkHelpers(self):
1638 net = self.ipv6_network
1639 self.assertEqual('2001:658:22a:cafe::/64', net.with_prefixlen)
1640 self.assertEqual('2001:658:22a:cafe::/ffff:ffff:ffff:ffff::',
1641 net.with_netmask)
1642 self.assertEqual('2001:658:22a:cafe::/::ffff:ffff:ffff:ffff',
1643 net.with_hostmask)
1644 self.assertEqual('2001:658:22a:cafe::/64', str(net))
1645
1646 def testIPv4NetworkHelpers(self):
1647 net = self.ipv4_network
1648 self.assertEqual('1.2.3.0/24', net.with_prefixlen)
1649 self.assertEqual('1.2.3.0/255.255.255.0', net.with_netmask)
1650 self.assertEqual('1.2.3.0/0.0.0.255', net.with_hostmask)
1651 self.assertEqual('1.2.3.0/24', str(net))
1652
Nick Coghlandc9b2552012-05-20 21:01:57 +10001653 def testCopyConstructor(self):
1654 addr1 = ipaddress.ip_network('10.1.1.0/24')
1655 addr2 = ipaddress.ip_network(addr1)
1656 addr3 = ipaddress.ip_interface('2001:658:22a:cafe:200::1/64')
1657 addr4 = ipaddress.ip_interface(addr3)
1658 addr5 = ipaddress.IPv4Address('1.1.1.1')
1659 addr6 = ipaddress.IPv6Address('2001:658:22a:cafe:200::1')
1660
1661 self.assertEqual(addr1, addr2)
1662 self.assertEqual(addr3, addr4)
1663 self.assertEqual(addr5, ipaddress.IPv4Address(addr5))
1664 self.assertEqual(addr6, ipaddress.IPv6Address(addr6))
1665
1666 def testCompressIPv6Address(self):
1667 test_addresses = {
1668 '1:2:3:4:5:6:7:8': '1:2:3:4:5:6:7:8/128',
1669 '2001:0:0:4:0:0:0:8': '2001:0:0:4::8/128',
1670 '2001:0:0:4:5:6:7:8': '2001::4:5:6:7:8/128',
1671 '2001:0:3:4:5:6:7:8': '2001:0:3:4:5:6:7:8/128',
1672 '2001:0:3:4:5:6:7:8': '2001:0:3:4:5:6:7:8/128',
1673 '0:0:3:0:0:0:0:ffff': '0:0:3::ffff/128',
1674 '0:0:0:4:0:0:0:ffff': '::4:0:0:0:ffff/128',
1675 '0:0:0:0:5:0:0:ffff': '::5:0:0:ffff/128',
1676 '1:0:0:4:0:0:7:8': '1::4:0:0:7:8/128',
1677 '0:0:0:0:0:0:0:0': '::/128',
1678 '0:0:0:0:0:0:0:0/0': '::/0',
1679 '0:0:0:0:0:0:0:1': '::1/128',
1680 '2001:0658:022a:cafe:0000:0000:0000:0000/66':
1681 '2001:658:22a:cafe::/66',
1682 '::1.2.3.4': '::102:304/128',
1683 '1:2:3:4:5:ffff:1.2.3.4': '1:2:3:4:5:ffff:102:304/128',
1684 '::7:6:5:4:3:2:1': '0:7:6:5:4:3:2:1/128',
1685 '::7:6:5:4:3:2:0': '0:7:6:5:4:3:2:0/128',
1686 '7:6:5:4:3:2:1::': '7:6:5:4:3:2:1:0/128',
1687 '0:6:5:4:3:2:1::': '0:6:5:4:3:2:1:0/128',
1688 }
1689 for uncompressed, compressed in list(test_addresses.items()):
1690 self.assertEqual(compressed, str(ipaddress.IPv6Interface(
1691 uncompressed)))
1692
1693 def testExplodeShortHandIpStr(self):
1694 addr1 = ipaddress.IPv6Interface('2001::1')
1695 addr2 = ipaddress.IPv6Address('2001:0:5ef5:79fd:0:59d:a0e5:ba1')
1696 addr3 = ipaddress.IPv6Network('2001::/96')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001697 addr4 = ipaddress.IPv4Address('192.168.178.1')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001698 self.assertEqual('2001:0000:0000:0000:0000:0000:0000:0001/128',
1699 addr1.exploded)
1700 self.assertEqual('0000:0000:0000:0000:0000:0000:0000:0001/128',
1701 ipaddress.IPv6Interface('::1/128').exploded)
1702 # issue 77
1703 self.assertEqual('2001:0000:5ef5:79fd:0000:059d:a0e5:0ba1',
1704 addr2.exploded)
1705 self.assertEqual('2001:0000:0000:0000:0000:0000:0000:0000/96',
1706 addr3.exploded)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001707 self.assertEqual('192.168.178.1', addr4.exploded)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001708
Eric V. Smithebdaaf42014-04-14 12:58:07 -04001709 def testReversePointer(self):
1710 addr1 = ipaddress.IPv4Address('127.0.0.1')
1711 addr2 = ipaddress.IPv6Address('2001:db8::1')
1712 self.assertEqual('1.0.0.127.in-addr.arpa', addr1.reverse_pointer)
1713 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.' +
1714 'b.d.0.1.0.0.2.ip6.arpa',
1715 addr2.reverse_pointer)
1716
Nick Coghlandc9b2552012-05-20 21:01:57 +10001717 def testIntRepresentation(self):
1718 self.assertEqual(16909060, int(self.ipv4_address))
1719 self.assertEqual(42540616829182469433547762482097946625,
1720 int(self.ipv6_address))
1721
Nick Coghlandc9b2552012-05-20 21:01:57 +10001722 def testForceVersion(self):
1723 self.assertEqual(ipaddress.ip_network(1).version, 4)
Nick Coghlan51c30672012-05-27 00:25:58 +10001724 self.assertEqual(ipaddress.IPv6Network(1).version, 6)
Sandro Tosi876ecad2012-05-23 22:26:55 +02001725
Nick Coghlandc9b2552012-05-20 21:01:57 +10001726 def testWithStar(self):
Nick Coghlana8517ad2012-08-20 10:04:26 +10001727 self.assertEqual(self.ipv4_interface.with_prefixlen, "1.2.3.4/24")
1728 self.assertEqual(self.ipv4_interface.with_netmask,
Nick Coghlandc9b2552012-05-20 21:01:57 +10001729 "1.2.3.4/255.255.255.0")
Nick Coghlana8517ad2012-08-20 10:04:26 +10001730 self.assertEqual(self.ipv4_interface.with_hostmask,
Nick Coghlandc9b2552012-05-20 21:01:57 +10001731 "1.2.3.4/0.0.0.255")
1732
Nick Coghlana8517ad2012-08-20 10:04:26 +10001733 self.assertEqual(self.ipv6_interface.with_prefixlen,
Nick Coghlandc9b2552012-05-20 21:01:57 +10001734 '2001:658:22a:cafe:200::1/64')
Nick Coghlana8517ad2012-08-20 10:04:26 +10001735 self.assertEqual(self.ipv6_interface.with_netmask,
1736 '2001:658:22a:cafe:200::1/ffff:ffff:ffff:ffff::')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001737 # this probably don't make much sense, but it's included for
1738 # compatibility with ipv4
Nick Coghlana8517ad2012-08-20 10:04:26 +10001739 self.assertEqual(self.ipv6_interface.with_hostmask,
Nick Coghlandc9b2552012-05-20 21:01:57 +10001740 '2001:658:22a:cafe:200::1/::ffff:ffff:ffff:ffff')
1741
1742 def testNetworkElementCaching(self):
1743 # V4 - make sure we're empty
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001744 self.assertNotIn('network_address', self.ipv4_network._cache)
1745 self.assertNotIn('broadcast_address', self.ipv4_network._cache)
1746 self.assertNotIn('hostmask', self.ipv4_network._cache)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001747
1748 # V4 - populate and test
1749 self.assertEqual(self.ipv4_network.network_address,
1750 ipaddress.IPv4Address('1.2.3.0'))
1751 self.assertEqual(self.ipv4_network.broadcast_address,
1752 ipaddress.IPv4Address('1.2.3.255'))
1753 self.assertEqual(self.ipv4_network.hostmask,
1754 ipaddress.IPv4Address('0.0.0.255'))
1755
1756 # V4 - check we're cached
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001757 self.assertIn('broadcast_address', self.ipv4_network._cache)
1758 self.assertIn('hostmask', self.ipv4_network._cache)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001759
1760 # V6 - make sure we're empty
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001761 self.assertNotIn('broadcast_address', self.ipv6_network._cache)
1762 self.assertNotIn('hostmask', self.ipv6_network._cache)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001763
1764 # V6 - populate and test
1765 self.assertEqual(self.ipv6_network.network_address,
1766 ipaddress.IPv6Address('2001:658:22a:cafe::'))
1767 self.assertEqual(self.ipv6_interface.network.network_address,
1768 ipaddress.IPv6Address('2001:658:22a:cafe::'))
1769
1770 self.assertEqual(
1771 self.ipv6_network.broadcast_address,
1772 ipaddress.IPv6Address('2001:658:22a:cafe:ffff:ffff:ffff:ffff'))
1773 self.assertEqual(self.ipv6_network.hostmask,
1774 ipaddress.IPv6Address('::ffff:ffff:ffff:ffff'))
1775 self.assertEqual(
1776 self.ipv6_interface.network.broadcast_address,
1777 ipaddress.IPv6Address('2001:658:22a:cafe:ffff:ffff:ffff:ffff'))
1778 self.assertEqual(self.ipv6_interface.network.hostmask,
1779 ipaddress.IPv6Address('::ffff:ffff:ffff:ffff'))
1780
1781 # V6 - check we're cached
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001782 self.assertIn('broadcast_address', self.ipv6_network._cache)
1783 self.assertIn('hostmask', self.ipv6_network._cache)
1784 self.assertIn('broadcast_address', self.ipv6_interface.network._cache)
1785 self.assertIn('hostmask', self.ipv6_interface.network._cache)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001786
1787 def testTeredo(self):
1788 # stolen from wikipedia
1789 server = ipaddress.IPv4Address('65.54.227.120')
1790 client = ipaddress.IPv4Address('192.0.2.45')
1791 teredo_addr = '2001:0000:4136:e378:8000:63bf:3fff:fdd2'
1792 self.assertEqual((server, client),
1793 ipaddress.ip_address(teredo_addr).teredo)
1794 bad_addr = '2000::4136:e378:8000:63bf:3fff:fdd2'
1795 self.assertFalse(ipaddress.ip_address(bad_addr).teredo)
1796 bad_addr = '2001:0001:4136:e378:8000:63bf:3fff:fdd2'
1797 self.assertFalse(ipaddress.ip_address(bad_addr).teredo)
1798
1799 # i77
1800 teredo_addr = ipaddress.IPv6Address('2001:0:5ef5:79fd:0:59d:a0e5:ba1')
1801 self.assertEqual((ipaddress.IPv4Address('94.245.121.253'),
1802 ipaddress.IPv4Address('95.26.244.94')),
1803 teredo_addr.teredo)
1804
Nick Coghlandc9b2552012-05-20 21:01:57 +10001805 def testsixtofour(self):
1806 sixtofouraddr = ipaddress.ip_address('2002:ac1d:2d64::1')
1807 bad_addr = ipaddress.ip_address('2000:ac1d:2d64::1')
1808 self.assertEqual(ipaddress.IPv4Address('172.29.45.100'),
1809 sixtofouraddr.sixtofour)
1810 self.assertFalse(bad_addr.sixtofour)
1811
Nick Coghlandc9b2552012-05-20 21:01:57 +10001812
1813if __name__ == '__main__':
1814 unittest.main()