blob: a0fe55c99f9edf6dea4ad6dedde1c24891186213 [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
636 # issue57
637 def testAddressIntMath(self):
638 self.assertEqual(ipaddress.IPv4Address('1.1.1.1') + 255,
639 ipaddress.IPv4Address('1.1.2.0'))
640 self.assertEqual(ipaddress.IPv4Address('1.1.1.1') - 256,
641 ipaddress.IPv4Address('1.1.0.1'))
642 self.assertEqual(ipaddress.IPv6Address('::1') + (2**16 - 2),
643 ipaddress.IPv6Address('::ffff'))
644 self.assertEqual(ipaddress.IPv6Address('::ffff') - (2**16 - 2),
645 ipaddress.IPv6Address('::1'))
646
Nick Coghlan3c2570c2012-07-07 01:13:55 +1000647 def testInvalidIntToBytes(self):
648 self.assertRaises(ValueError, ipaddress.v4_int_to_packed, -1)
649 self.assertRaises(ValueError, ipaddress.v4_int_to_packed,
650 2 ** ipaddress.IPV4LENGTH)
651 self.assertRaises(ValueError, ipaddress.v6_int_to_packed, -1)
652 self.assertRaises(ValueError, ipaddress.v6_int_to_packed,
653 2 ** ipaddress.IPV6LENGTH)
654
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200655 def testInternals(self):
656 first, last = ipaddress._find_address_range([
657 ipaddress.IPv4Address('10.10.10.10'),
658 ipaddress.IPv4Address('10.10.10.12')])
659 self.assertEqual(first, last)
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200660 self.assertEqual(128, ipaddress._count_righthand_zero_bits(0, 128))
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200661 self.assertEqual("IPv4Network('1.2.3.0/24')", repr(self.ipv4_network))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000662
Nick Coghland9722652012-06-17 16:33:00 +1000663 def testMissingAddressVersion(self):
664 class Broken(ipaddress._BaseAddress):
665 pass
666 broken = Broken('127.0.0.1')
667 with self.assertRaisesRegex(NotImplementedError, "Broken.*version"):
668 broken.version
669
670 def testMissingNetworkVersion(self):
671 class Broken(ipaddress._BaseNetwork):
672 pass
673 broken = Broken('127.0.0.1')
674 with self.assertRaisesRegex(NotImplementedError, "Broken.*version"):
675 broken.version
676
677 def testMissingAddressClass(self):
678 class Broken(ipaddress._BaseNetwork):
679 pass
680 broken = Broken('127.0.0.1')
681 with self.assertRaisesRegex(NotImplementedError, "Broken.*address"):
682 broken._address_class
683
Nick Coghlandc9b2552012-05-20 21:01:57 +1000684 def testGetNetwork(self):
685 self.assertEqual(int(self.ipv4_network.network_address), 16909056)
686 self.assertEqual(str(self.ipv4_network.network_address), '1.2.3.0')
687
688 self.assertEqual(int(self.ipv6_network.network_address),
689 42540616829182469433403647294022090752)
690 self.assertEqual(str(self.ipv6_network.network_address),
691 '2001:658:22a:cafe::')
692 self.assertEqual(str(self.ipv6_network.hostmask),
693 '::ffff:ffff:ffff:ffff')
694
Nick Coghlandc9b2552012-05-20 21:01:57 +1000695 def testIpFromInt(self):
696 self.assertEqual(self.ipv4_interface._ip,
697 ipaddress.IPv4Interface(16909060)._ip)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000698
699 ipv4 = ipaddress.ip_network('1.2.3.4')
700 ipv6 = ipaddress.ip_network('2001:658:22a:cafe:200:0:0:1')
Nick Coghlan730f67f2012-08-05 22:02:18 +1000701 self.assertEqual(ipv4, ipaddress.ip_network(int(ipv4.network_address)))
702 self.assertEqual(ipv6, ipaddress.ip_network(int(ipv6.network_address)))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000703
704 v6_int = 42540616829182469433547762482097946625
705 self.assertEqual(self.ipv6_interface._ip,
706 ipaddress.IPv6Interface(v6_int)._ip)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000707
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200708 self.assertEqual(ipaddress.ip_network(self.ipv4_address._ip).version,
709 4)
710 self.assertEqual(ipaddress.ip_network(self.ipv6_address._ip).version,
711 6)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000712
713 def testIpFromPacked(self):
Nick Coghlan5cf896f2012-07-07 01:43:31 +1000714 address = ipaddress.ip_address
Nick Coghlandc9b2552012-05-20 21:01:57 +1000715 self.assertEqual(self.ipv4_interface._ip,
Nick Coghlan5cf896f2012-07-07 01:43:31 +1000716 ipaddress.ip_interface(b'\x01\x02\x03\x04')._ip)
717 self.assertEqual(address('255.254.253.252'),
718 address(b'\xff\xfe\xfd\xfc'))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000719 self.assertEqual(self.ipv6_interface.ip,
720 ipaddress.ip_interface(
Nick Coghlan5cf896f2012-07-07 01:43:31 +1000721 b'\x20\x01\x06\x58\x02\x2a\xca\xfe'
722 b'\x02\x00\x00\x00\x00\x00\x00\x01').ip)
723 self.assertEqual(address('ffff:2:3:4:ffff::'),
724 address(b'\xff\xff\x00\x02\x00\x03\x00\x04' +
725 b'\xff\xff' + b'\x00' * 6))
726 self.assertEqual(address('::'),
727 address(b'\x00' * 16))
728
Nick Coghlandc9b2552012-05-20 21:01:57 +1000729 def testGetIp(self):
730 self.assertEqual(int(self.ipv4_interface.ip), 16909060)
731 self.assertEqual(str(self.ipv4_interface.ip), '1.2.3.4')
732
733 self.assertEqual(int(self.ipv6_interface.ip),
734 42540616829182469433547762482097946625)
735 self.assertEqual(str(self.ipv6_interface.ip),
736 '2001:658:22a:cafe:200::1')
737
738 def testGetNetmask(self):
739 self.assertEqual(int(self.ipv4_network.netmask), 4294967040)
740 self.assertEqual(str(self.ipv4_network.netmask), '255.255.255.0')
741 self.assertEqual(int(self.ipv6_network.netmask),
742 340282366920938463444927863358058659840)
743 self.assertEqual(self.ipv6_network.prefixlen, 64)
744
745 def testZeroNetmask(self):
746 ipv4_zero_netmask = ipaddress.IPv4Interface('1.2.3.4/0')
747 self.assertEqual(int(ipv4_zero_netmask.network.netmask), 0)
Nick Coghlan932346f2014-02-08 23:17:36 +1000748 self.assertEqual(ipv4_zero_netmask._prefix_from_prefix_string('0'), 0)
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200749 self.assertTrue(ipv4_zero_netmask._is_valid_netmask('0'))
750 self.assertTrue(ipv4_zero_netmask._is_valid_netmask('0.0.0.0'))
751 self.assertFalse(ipv4_zero_netmask._is_valid_netmask('invalid'))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000752
753 ipv6_zero_netmask = ipaddress.IPv6Interface('::1/0')
754 self.assertEqual(int(ipv6_zero_netmask.network.netmask), 0)
Nick Coghlan932346f2014-02-08 23:17:36 +1000755 self.assertEqual(ipv6_zero_netmask._prefix_from_prefix_string('0'), 0)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000756
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200757 def testIPv4NetAndHostmasks(self):
758 net = self.ipv4_network
759 self.assertFalse(net._is_valid_netmask('invalid'))
760 self.assertTrue(net._is_valid_netmask('128.128.128.128'))
761 self.assertFalse(net._is_valid_netmask('128.128.128.127'))
762 self.assertFalse(net._is_valid_netmask('128.128.128.255'))
763 self.assertTrue(net._is_valid_netmask('255.128.128.128'))
764
765 self.assertFalse(net._is_hostmask('invalid'))
766 self.assertTrue(net._is_hostmask('128.255.255.255'))
767 self.assertFalse(net._is_hostmask('255.255.255.255'))
768 self.assertFalse(net._is_hostmask('1.2.3.4'))
769
770 net = ipaddress.IPv4Network('127.0.0.0/0.0.0.255')
Nick Coghlan932346f2014-02-08 23:17:36 +1000771 self.assertEqual(net.prefixlen, 24)
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200772
Nick Coghlandc9b2552012-05-20 21:01:57 +1000773 def testGetBroadcast(self):
774 self.assertEqual(int(self.ipv4_network.broadcast_address), 16909311)
775 self.assertEqual(str(self.ipv4_network.broadcast_address), '1.2.3.255')
776
777 self.assertEqual(int(self.ipv6_network.broadcast_address),
778 42540616829182469451850391367731642367)
779 self.assertEqual(str(self.ipv6_network.broadcast_address),
780 '2001:658:22a:cafe:ffff:ffff:ffff:ffff')
781
782 def testGetPrefixlen(self):
Nick Coghlane3ded952012-08-05 22:45:22 +1000783 self.assertEqual(self.ipv4_interface.network.prefixlen, 24)
784 self.assertEqual(self.ipv6_interface.network.prefixlen, 64)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000785
786 def testGetSupernet(self):
787 self.assertEqual(self.ipv4_network.supernet().prefixlen, 23)
788 self.assertEqual(str(self.ipv4_network.supernet().network_address),
789 '1.2.2.0')
790 self.assertEqual(
791 ipaddress.IPv4Interface('0.0.0.0/0').network.supernet(),
792 ipaddress.IPv4Network('0.0.0.0/0'))
793
794 self.assertEqual(self.ipv6_network.supernet().prefixlen, 63)
795 self.assertEqual(str(self.ipv6_network.supernet().network_address),
796 '2001:658:22a:cafe::')
797 self.assertEqual(ipaddress.IPv6Interface('::0/0').network.supernet(),
798 ipaddress.IPv6Network('::0/0'))
799
800 def testGetSupernet3(self):
801 self.assertEqual(self.ipv4_network.supernet(3).prefixlen, 21)
802 self.assertEqual(str(self.ipv4_network.supernet(3).network_address),
803 '1.2.0.0')
804
805 self.assertEqual(self.ipv6_network.supernet(3).prefixlen, 61)
806 self.assertEqual(str(self.ipv6_network.supernet(3).network_address),
807 '2001:658:22a:caf8::')
808
809 def testGetSupernet4(self):
810 self.assertRaises(ValueError, self.ipv4_network.supernet,
811 prefixlen_diff=2, new_prefix=1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200812 self.assertRaises(ValueError, self.ipv4_network.supernet,
813 new_prefix=25)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000814 self.assertEqual(self.ipv4_network.supernet(prefixlen_diff=2),
815 self.ipv4_network.supernet(new_prefix=22))
816
817 self.assertRaises(ValueError, self.ipv6_network.supernet,
818 prefixlen_diff=2, new_prefix=1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200819 self.assertRaises(ValueError, self.ipv6_network.supernet,
820 new_prefix=65)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000821 self.assertEqual(self.ipv6_network.supernet(prefixlen_diff=2),
822 self.ipv6_network.supernet(new_prefix=62))
823
824 def testHosts(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200825 hosts = list(self.ipv4_network.hosts())
826 self.assertEqual(254, len(hosts))
827 self.assertEqual(ipaddress.IPv4Address('1.2.3.1'), hosts[0])
828 self.assertEqual(ipaddress.IPv4Address('1.2.3.254'), hosts[-1])
829
830 # special case where only 1 bit is left for address
Nick Coghlandc9b2552012-05-20 21:01:57 +1000831 self.assertEqual([ipaddress.IPv4Address('2.0.0.0'),
832 ipaddress.IPv4Address('2.0.0.1')],
833 list(ipaddress.ip_network('2.0.0.0/31').hosts()))
834
835 def testFancySubnetting(self):
836 self.assertEqual(sorted(self.ipv4_network.subnets(prefixlen_diff=3)),
837 sorted(self.ipv4_network.subnets(new_prefix=27)))
838 self.assertRaises(ValueError, list,
839 self.ipv4_network.subnets(new_prefix=23))
840 self.assertRaises(ValueError, list,
841 self.ipv4_network.subnets(prefixlen_diff=3,
842 new_prefix=27))
843 self.assertEqual(sorted(self.ipv6_network.subnets(prefixlen_diff=4)),
844 sorted(self.ipv6_network.subnets(new_prefix=68)))
845 self.assertRaises(ValueError, list,
846 self.ipv6_network.subnets(new_prefix=63))
847 self.assertRaises(ValueError, list,
848 self.ipv6_network.subnets(prefixlen_diff=4,
849 new_prefix=68))
850
851 def testGetSubnets(self):
852 self.assertEqual(list(self.ipv4_network.subnets())[0].prefixlen, 25)
853 self.assertEqual(str(list(
854 self.ipv4_network.subnets())[0].network_address),
855 '1.2.3.0')
856 self.assertEqual(str(list(
857 self.ipv4_network.subnets())[1].network_address),
858 '1.2.3.128')
859
860 self.assertEqual(list(self.ipv6_network.subnets())[0].prefixlen, 65)
861
862 def testGetSubnetForSingle32(self):
863 ip = ipaddress.IPv4Network('1.2.3.4/32')
864 subnets1 = [str(x) for x in ip.subnets()]
865 subnets2 = [str(x) for x in ip.subnets(2)]
866 self.assertEqual(subnets1, ['1.2.3.4/32'])
867 self.assertEqual(subnets1, subnets2)
868
869 def testGetSubnetForSingle128(self):
870 ip = ipaddress.IPv6Network('::1/128')
871 subnets1 = [str(x) for x in ip.subnets()]
872 subnets2 = [str(x) for x in ip.subnets(2)]
873 self.assertEqual(subnets1, ['::1/128'])
874 self.assertEqual(subnets1, subnets2)
875
876 def testSubnet2(self):
877 ips = [str(x) for x in self.ipv4_network.subnets(2)]
878 self.assertEqual(
879 ips,
880 ['1.2.3.0/26', '1.2.3.64/26', '1.2.3.128/26', '1.2.3.192/26'])
881
882 ipsv6 = [str(x) for x in self.ipv6_network.subnets(2)]
883 self.assertEqual(
884 ipsv6,
885 ['2001:658:22a:cafe::/66',
886 '2001:658:22a:cafe:4000::/66',
887 '2001:658:22a:cafe:8000::/66',
888 '2001:658:22a:cafe:c000::/66'])
889
890 def testSubnetFailsForLargeCidrDiff(self):
891 self.assertRaises(ValueError, list,
892 self.ipv4_interface.network.subnets(9))
893 self.assertRaises(ValueError, list,
894 self.ipv4_network.subnets(9))
895 self.assertRaises(ValueError, list,
896 self.ipv6_interface.network.subnets(65))
897 self.assertRaises(ValueError, list,
898 self.ipv6_network.subnets(65))
899
900 def testSupernetFailsForLargeCidrDiff(self):
901 self.assertRaises(ValueError,
902 self.ipv4_interface.network.supernet, 25)
903 self.assertRaises(ValueError,
904 self.ipv6_interface.network.supernet, 65)
905
906 def testSubnetFailsForNegativeCidrDiff(self):
907 self.assertRaises(ValueError, list,
908 self.ipv4_interface.network.subnets(-1))
909 self.assertRaises(ValueError, list,
Nick Coghlan2c589102012-05-27 01:03:25 +1000910 self.ipv4_network.subnets(-1))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000911 self.assertRaises(ValueError, list,
912 self.ipv6_interface.network.subnets(-1))
913 self.assertRaises(ValueError, list,
914 self.ipv6_network.subnets(-1))
915
916 def testGetNum_Addresses(self):
917 self.assertEqual(self.ipv4_network.num_addresses, 256)
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200918 self.assertEqual(list(self.ipv4_network.subnets())[0].num_addresses,
919 128)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000920 self.assertEqual(self.ipv4_network.supernet().num_addresses, 512)
921
922 self.assertEqual(self.ipv6_network.num_addresses, 18446744073709551616)
923 self.assertEqual(list(self.ipv6_network.subnets())[0].num_addresses,
924 9223372036854775808)
925 self.assertEqual(self.ipv6_network.supernet().num_addresses,
926 36893488147419103232)
927
928 def testContains(self):
Serhiy Storchaka7c389e22014-02-08 16:38:35 +0200929 self.assertIn(ipaddress.IPv4Interface('1.2.3.128/25'),
930 self.ipv4_network)
931 self.assertNotIn(ipaddress.IPv4Interface('1.2.4.1/24'),
Nick Coghlandc9b2552012-05-20 21:01:57 +1000932 self.ipv4_network)
933 # We can test addresses and string as well.
934 addr1 = ipaddress.IPv4Address('1.2.3.37')
Serhiy Storchaka7c389e22014-02-08 16:38:35 +0200935 self.assertIn(addr1, self.ipv4_network)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000936 # issue 61, bad network comparison on like-ip'd network objects
937 # with identical broadcast addresses.
938 self.assertFalse(ipaddress.IPv4Network('1.1.0.0/16').__contains__(
939 ipaddress.IPv4Network('1.0.0.0/15')))
940
Nick Coghlandc9b2552012-05-20 21:01:57 +1000941 def testNth(self):
942 self.assertEqual(str(self.ipv4_network[5]), '1.2.3.5')
943 self.assertRaises(IndexError, self.ipv4_network.__getitem__, 256)
944
945 self.assertEqual(str(self.ipv6_network[5]),
946 '2001:658:22a:cafe::5')
947
948 def testGetitem(self):
949 # http://code.google.com/p/ipaddr-py/issues/detail?id=15
950 addr = ipaddress.IPv4Network('172.31.255.128/255.255.255.240')
951 self.assertEqual(28, addr.prefixlen)
952 addr_list = list(addr)
953 self.assertEqual('172.31.255.128', str(addr_list[0]))
954 self.assertEqual('172.31.255.128', str(addr[0]))
955 self.assertEqual('172.31.255.143', str(addr_list[-1]))
956 self.assertEqual('172.31.255.143', str(addr[-1]))
957 self.assertEqual(addr_list[-1], addr[-1])
958
959 def testEqual(self):
960 self.assertTrue(self.ipv4_interface ==
961 ipaddress.IPv4Interface('1.2.3.4/24'))
962 self.assertFalse(self.ipv4_interface ==
963 ipaddress.IPv4Interface('1.2.3.4/23'))
964 self.assertFalse(self.ipv4_interface ==
965 ipaddress.IPv6Interface('::1.2.3.4/24'))
966 self.assertFalse(self.ipv4_interface == '')
967 self.assertFalse(self.ipv4_interface == [])
968 self.assertFalse(self.ipv4_interface == 2)
969
970 self.assertTrue(self.ipv6_interface ==
971 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/64'))
972 self.assertFalse(self.ipv6_interface ==
973 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/63'))
974 self.assertFalse(self.ipv6_interface ==
975 ipaddress.IPv4Interface('1.2.3.4/23'))
976 self.assertFalse(self.ipv6_interface == '')
977 self.assertFalse(self.ipv6_interface == [])
978 self.assertFalse(self.ipv6_interface == 2)
979
980 def testNotEqual(self):
981 self.assertFalse(self.ipv4_interface !=
982 ipaddress.IPv4Interface('1.2.3.4/24'))
983 self.assertTrue(self.ipv4_interface !=
984 ipaddress.IPv4Interface('1.2.3.4/23'))
985 self.assertTrue(self.ipv4_interface !=
986 ipaddress.IPv6Interface('::1.2.3.4/24'))
987 self.assertTrue(self.ipv4_interface != '')
988 self.assertTrue(self.ipv4_interface != [])
989 self.assertTrue(self.ipv4_interface != 2)
990
991 self.assertTrue(self.ipv4_address !=
992 ipaddress.IPv4Address('1.2.3.5'))
993 self.assertTrue(self.ipv4_address != '')
994 self.assertTrue(self.ipv4_address != [])
995 self.assertTrue(self.ipv4_address != 2)
996
997 self.assertFalse(self.ipv6_interface !=
998 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/64'))
999 self.assertTrue(self.ipv6_interface !=
1000 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/63'))
1001 self.assertTrue(self.ipv6_interface !=
1002 ipaddress.IPv4Interface('1.2.3.4/23'))
1003 self.assertTrue(self.ipv6_interface != '')
1004 self.assertTrue(self.ipv6_interface != [])
1005 self.assertTrue(self.ipv6_interface != 2)
1006
1007 self.assertTrue(self.ipv6_address !=
1008 ipaddress.IPv4Address('1.2.3.4'))
1009 self.assertTrue(self.ipv6_address != '')
1010 self.assertTrue(self.ipv6_address != [])
1011 self.assertTrue(self.ipv6_address != 2)
1012
1013 def testSlash32Constructor(self):
1014 self.assertEqual(str(ipaddress.IPv4Interface(
1015 '1.2.3.4/255.255.255.255')), '1.2.3.4/32')
1016
1017 def testSlash128Constructor(self):
1018 self.assertEqual(str(ipaddress.IPv6Interface('::1/128')),
1019 '::1/128')
1020
1021 def testSlash0Constructor(self):
1022 self.assertEqual(str(ipaddress.IPv4Interface('1.2.3.4/0.0.0.0')),
1023 '1.2.3.4/0')
1024
1025 def testCollapsing(self):
1026 # test only IP addresses including some duplicates
1027 ip1 = ipaddress.IPv4Address('1.1.1.0')
1028 ip2 = ipaddress.IPv4Address('1.1.1.1')
1029 ip3 = ipaddress.IPv4Address('1.1.1.2')
1030 ip4 = ipaddress.IPv4Address('1.1.1.3')
1031 ip5 = ipaddress.IPv4Address('1.1.1.4')
1032 ip6 = ipaddress.IPv4Address('1.1.1.0')
1033 # check that addreses are subsumed properly.
1034 collapsed = ipaddress.collapse_addresses(
1035 [ip1, ip2, ip3, ip4, ip5, ip6])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001036 self.assertEqual(list(collapsed),
1037 [ipaddress.IPv4Network('1.1.1.0/30'),
1038 ipaddress.IPv4Network('1.1.1.4/32')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001039
1040 # test a mix of IP addresses and networks including some duplicates
1041 ip1 = ipaddress.IPv4Address('1.1.1.0')
1042 ip2 = ipaddress.IPv4Address('1.1.1.1')
1043 ip3 = ipaddress.IPv4Address('1.1.1.2')
1044 ip4 = ipaddress.IPv4Address('1.1.1.3')
1045 #ip5 = ipaddress.IPv4Interface('1.1.1.4/30')
1046 #ip6 = ipaddress.IPv4Interface('1.1.1.4/30')
1047 # check that addreses are subsumed properly.
1048 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3, ip4])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001049 self.assertEqual(list(collapsed),
1050 [ipaddress.IPv4Network('1.1.1.0/30')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001051
1052 # test only IP networks
1053 ip1 = ipaddress.IPv4Network('1.1.0.0/24')
1054 ip2 = ipaddress.IPv4Network('1.1.1.0/24')
1055 ip3 = ipaddress.IPv4Network('1.1.2.0/24')
1056 ip4 = ipaddress.IPv4Network('1.1.3.0/24')
1057 ip5 = ipaddress.IPv4Network('1.1.4.0/24')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001058 # stored in no particular order b/c we want CollapseAddr to call
1059 # [].sort
Nick Coghlandc9b2552012-05-20 21:01:57 +10001060 ip6 = ipaddress.IPv4Network('1.1.0.0/22')
1061 # check that addreses are subsumed properly.
1062 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3, ip4, ip5,
1063 ip6])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001064 self.assertEqual(list(collapsed),
1065 [ipaddress.IPv4Network('1.1.0.0/22'),
1066 ipaddress.IPv4Network('1.1.4.0/24')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001067
1068 # test that two addresses are supernet'ed properly
1069 collapsed = ipaddress.collapse_addresses([ip1, ip2])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001070 self.assertEqual(list(collapsed),
1071 [ipaddress.IPv4Network('1.1.0.0/23')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001072
1073 # test same IP networks
1074 ip_same1 = ip_same2 = ipaddress.IPv4Network('1.1.1.1/32')
1075 self.assertEqual(list(ipaddress.collapse_addresses(
1076 [ip_same1, ip_same2])),
1077 [ip_same1])
1078
1079 # test same IP addresses
1080 ip_same1 = ip_same2 = ipaddress.IPv4Address('1.1.1.1')
1081 self.assertEqual(list(ipaddress.collapse_addresses(
1082 [ip_same1, ip_same2])),
1083 [ipaddress.ip_network('1.1.1.1/32')])
1084 ip1 = ipaddress.IPv6Network('2001::/100')
1085 ip2 = ipaddress.IPv6Network('2001::/120')
1086 ip3 = ipaddress.IPv6Network('2001::/96')
1087 # test that ipv6 addresses are subsumed properly.
1088 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3])
1089 self.assertEqual(list(collapsed), [ip3])
1090
1091 # the toejam test
Hynek Schlawack35db5132012-06-01 20:12:17 +02001092 addr_tuples = [
1093 (ipaddress.ip_address('1.1.1.1'),
1094 ipaddress.ip_address('::1')),
1095 (ipaddress.IPv4Network('1.1.0.0/24'),
1096 ipaddress.IPv6Network('2001::/120')),
1097 (ipaddress.IPv4Network('1.1.0.0/32'),
1098 ipaddress.IPv6Network('2001::/128')),
1099 ]
1100 for ip1, ip2 in addr_tuples:
1101 self.assertRaises(TypeError, ipaddress.collapse_addresses,
1102 [ip1, ip2])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001103
1104 def testSummarizing(self):
1105 #ip = ipaddress.ip_address
1106 #ipnet = ipaddress.ip_network
1107 summarize = ipaddress.summarize_address_range
1108 ip1 = ipaddress.ip_address('1.1.1.0')
1109 ip2 = ipaddress.ip_address('1.1.1.255')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001110
1111 # summarize works only for IPv4 & IPv6
1112 class IPv7Address(ipaddress.IPv6Address):
1113 @property
1114 def version(self):
1115 return 7
1116 ip_invalid1 = IPv7Address('::1')
1117 ip_invalid2 = IPv7Address('::1')
1118 self.assertRaises(ValueError, list,
1119 summarize(ip_invalid1, ip_invalid2))
1120 # test that a summary over ip4 & ip6 fails
1121 self.assertRaises(TypeError, list,
1122 summarize(ip1, ipaddress.IPv6Address('::1')))
1123 # test a /24 is summarized properly
Nick Coghlandc9b2552012-05-20 21:01:57 +10001124 self.assertEqual(list(summarize(ip1, ip2))[0],
1125 ipaddress.ip_network('1.1.1.0/24'))
1126 # test an IPv4 range that isn't on a network byte boundary
1127 ip2 = ipaddress.ip_address('1.1.1.8')
1128 self.assertEqual(list(summarize(ip1, ip2)),
1129 [ipaddress.ip_network('1.1.1.0/29'),
1130 ipaddress.ip_network('1.1.1.8')])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001131 # all!
1132 ip1 = ipaddress.IPv4Address(0)
1133 ip2 = ipaddress.IPv4Address(ipaddress.IPv4Address._ALL_ONES)
1134 self.assertEqual([ipaddress.IPv4Network('0.0.0.0/0')],
1135 list(summarize(ip1, ip2)))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001136
1137 ip1 = ipaddress.ip_address('1::')
1138 ip2 = ipaddress.ip_address('1:ffff:ffff:ffff:ffff:ffff:ffff:ffff')
1139 # test a IPv6 is sumamrized properly
1140 self.assertEqual(list(summarize(ip1, ip2))[0],
1141 ipaddress.ip_network('1::/16'))
1142 # test an IPv6 range that isn't on a network byte boundary
1143 ip2 = ipaddress.ip_address('2::')
1144 self.assertEqual(list(summarize(ip1, ip2)),
1145 [ipaddress.ip_network('1::/16'),
1146 ipaddress.ip_network('2::/128')])
1147
1148 # test exception raised when first is greater than last
1149 self.assertRaises(ValueError, list,
1150 summarize(ipaddress.ip_address('1.1.1.0'),
1151 ipaddress.ip_address('1.1.0.0')))
1152 # test exception raised when first and last aren't IP addresses
1153 self.assertRaises(TypeError, list,
1154 summarize(ipaddress.ip_network('1.1.1.0'),
1155 ipaddress.ip_network('1.1.0.0')))
1156 self.assertRaises(TypeError, list,
1157 summarize(ipaddress.ip_network('1.1.1.0'),
1158 ipaddress.ip_network('1.1.0.0')))
1159 # test exception raised when first and last are not same version
1160 self.assertRaises(TypeError, list,
1161 summarize(ipaddress.ip_address('::'),
1162 ipaddress.ip_network('1.1.0.0')))
1163
1164 def testAddressComparison(self):
1165 self.assertTrue(ipaddress.ip_address('1.1.1.1') <=
1166 ipaddress.ip_address('1.1.1.1'))
1167 self.assertTrue(ipaddress.ip_address('1.1.1.1') <=
1168 ipaddress.ip_address('1.1.1.2'))
1169 self.assertTrue(ipaddress.ip_address('::1') <=
1170 ipaddress.ip_address('::1'))
1171 self.assertTrue(ipaddress.ip_address('::1') <=
1172 ipaddress.ip_address('::2'))
1173
Nick Coghlan3008ec02012-07-08 00:45:33 +10001174 def testInterfaceComparison(self):
1175 self.assertTrue(ipaddress.ip_interface('1.1.1.1') <=
1176 ipaddress.ip_interface('1.1.1.1'))
1177 self.assertTrue(ipaddress.ip_interface('1.1.1.1') <=
1178 ipaddress.ip_interface('1.1.1.2'))
1179 self.assertTrue(ipaddress.ip_interface('::1') <=
1180 ipaddress.ip_interface('::1'))
1181 self.assertTrue(ipaddress.ip_interface('::1') <=
1182 ipaddress.ip_interface('::2'))
1183
Nick Coghlandc9b2552012-05-20 21:01:57 +10001184 def testNetworkComparison(self):
1185 # ip1 and ip2 have the same network address
1186 ip1 = ipaddress.IPv4Network('1.1.1.0/24')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001187 ip2 = ipaddress.IPv4Network('1.1.1.0/32')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001188 ip3 = ipaddress.IPv4Network('1.1.2.0/24')
1189
1190 self.assertTrue(ip1 < ip3)
1191 self.assertTrue(ip3 > ip2)
1192
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001193 self.assertEqual(ip1.compare_networks(ip1), 0)
1194
1195 # if addresses are the same, sort by netmask
1196 self.assertEqual(ip1.compare_networks(ip2), -1)
1197 self.assertEqual(ip2.compare_networks(ip1), 1)
1198
Nick Coghlandc9b2552012-05-20 21:01:57 +10001199 self.assertEqual(ip1.compare_networks(ip3), -1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001200 self.assertEqual(ip3.compare_networks(ip1), 1)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001201 self.assertTrue(ip1._get_networks_key() < ip3._get_networks_key())
1202
1203 ip1 = ipaddress.IPv6Network('2001:2000::/96')
1204 ip2 = ipaddress.IPv6Network('2001:2001::/96')
1205 ip3 = ipaddress.IPv6Network('2001:ffff:2000::/96')
1206
1207 self.assertTrue(ip1 < ip3)
1208 self.assertTrue(ip3 > ip2)
1209 self.assertEqual(ip1.compare_networks(ip3), -1)
1210 self.assertTrue(ip1._get_networks_key() < ip3._get_networks_key())
1211
1212 # Test comparing different protocols.
1213 # Should always raise a TypeError.
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001214 self.assertRaises(TypeError,
1215 self.ipv4_network.compare_networks,
1216 self.ipv6_network)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001217 ipv6 = ipaddress.IPv6Interface('::/0')
1218 ipv4 = ipaddress.IPv4Interface('0.0.0.0/0')
1219 self.assertRaises(TypeError, ipv4.__lt__, ipv6)
1220 self.assertRaises(TypeError, ipv4.__gt__, ipv6)
1221 self.assertRaises(TypeError, ipv6.__lt__, ipv4)
1222 self.assertRaises(TypeError, ipv6.__gt__, ipv4)
1223
1224 # Regression test for issue 19.
1225 ip1 = ipaddress.ip_network('10.1.2.128/25')
1226 self.assertFalse(ip1 < ip1)
1227 self.assertFalse(ip1 > ip1)
1228 ip2 = ipaddress.ip_network('10.1.3.0/24')
1229 self.assertTrue(ip1 < ip2)
1230 self.assertFalse(ip2 < ip1)
1231 self.assertFalse(ip1 > ip2)
1232 self.assertTrue(ip2 > ip1)
1233 ip3 = ipaddress.ip_network('10.1.3.0/25')
1234 self.assertTrue(ip2 < ip3)
1235 self.assertFalse(ip3 < ip2)
1236 self.assertFalse(ip2 > ip3)
1237 self.assertTrue(ip3 > ip2)
1238
1239 # Regression test for issue 28.
1240 ip1 = ipaddress.ip_network('10.10.10.0/31')
1241 ip2 = ipaddress.ip_network('10.10.10.0')
1242 ip3 = ipaddress.ip_network('10.10.10.2/31')
1243 ip4 = ipaddress.ip_network('10.10.10.2')
1244 sorted = [ip1, ip2, ip3, ip4]
1245 unsorted = [ip2, ip4, ip1, ip3]
1246 unsorted.sort()
1247 self.assertEqual(sorted, unsorted)
1248 unsorted = [ip4, ip1, ip3, ip2]
1249 unsorted.sort()
1250 self.assertEqual(sorted, unsorted)
1251 self.assertRaises(TypeError, ip1.__lt__,
1252 ipaddress.ip_address('10.10.10.0'))
1253 self.assertRaises(TypeError, ip2.__lt__,
1254 ipaddress.ip_address('10.10.10.0'))
1255
1256 # <=, >=
1257 self.assertTrue(ipaddress.ip_network('1.1.1.1') <=
1258 ipaddress.ip_network('1.1.1.1'))
1259 self.assertTrue(ipaddress.ip_network('1.1.1.1') <=
1260 ipaddress.ip_network('1.1.1.2'))
1261 self.assertFalse(ipaddress.ip_network('1.1.1.2') <=
1262 ipaddress.ip_network('1.1.1.1'))
1263 self.assertTrue(ipaddress.ip_network('::1') <=
1264 ipaddress.ip_network('::1'))
1265 self.assertTrue(ipaddress.ip_network('::1') <=
1266 ipaddress.ip_network('::2'))
1267 self.assertFalse(ipaddress.ip_network('::2') <=
1268 ipaddress.ip_network('::1'))
1269
1270 def testStrictNetworks(self):
1271 self.assertRaises(ValueError, ipaddress.ip_network, '192.168.1.1/24')
1272 self.assertRaises(ValueError, ipaddress.ip_network, '::1/120')
1273
1274 def testOverlaps(self):
1275 other = ipaddress.IPv4Network('1.2.3.0/30')
1276 other2 = ipaddress.IPv4Network('1.2.2.0/24')
1277 other3 = ipaddress.IPv4Network('1.2.2.64/26')
1278 self.assertTrue(self.ipv4_network.overlaps(other))
1279 self.assertFalse(self.ipv4_network.overlaps(other2))
1280 self.assertTrue(other2.overlaps(other3))
1281
1282 def testEmbeddedIpv4(self):
1283 ipv4_string = '192.168.0.1'
1284 ipv4 = ipaddress.IPv4Interface(ipv4_string)
1285 v4compat_ipv6 = ipaddress.IPv6Interface('::%s' % ipv4_string)
1286 self.assertEqual(int(v4compat_ipv6.ip), int(ipv4.ip))
1287 v4mapped_ipv6 = ipaddress.IPv6Interface('::ffff:%s' % ipv4_string)
1288 self.assertNotEqual(v4mapped_ipv6.ip, ipv4.ip)
1289 self.assertRaises(ipaddress.AddressValueError, ipaddress.IPv6Interface,
1290 '2001:1.1.1.1:1.1.1.1')
1291
1292 # Issue 67: IPv6 with embedded IPv4 address not recognized.
1293 def testIPv6AddressTooLarge(self):
1294 # RFC4291 2.5.5.2
1295 self.assertEqual(ipaddress.ip_address('::FFFF:192.0.2.1'),
1296 ipaddress.ip_address('::FFFF:c000:201'))
1297 # RFC4291 2.2 (part 3) x::d.d.d.d
1298 self.assertEqual(ipaddress.ip_address('FFFF::192.0.2.1'),
1299 ipaddress.ip_address('FFFF::c000:201'))
1300
1301 def testIPVersion(self):
1302 self.assertEqual(self.ipv4_address.version, 4)
1303 self.assertEqual(self.ipv6_address.version, 6)
1304
1305 def testMaxPrefixLength(self):
1306 self.assertEqual(self.ipv4_interface.max_prefixlen, 32)
1307 self.assertEqual(self.ipv6_interface.max_prefixlen, 128)
1308
1309 def testPacked(self):
1310 self.assertEqual(self.ipv4_address.packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001311 b'\x01\x02\x03\x04')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001312 self.assertEqual(ipaddress.IPv4Interface('255.254.253.252').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001313 b'\xff\xfe\xfd\xfc')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001314 self.assertEqual(self.ipv6_address.packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001315 b'\x20\x01\x06\x58\x02\x2a\xca\xfe'
1316 b'\x02\x00\x00\x00\x00\x00\x00\x01')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001317 self.assertEqual(ipaddress.IPv6Interface('ffff:2:3:4:ffff::').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001318 b'\xff\xff\x00\x02\x00\x03\x00\x04\xff\xff'
1319 + b'\x00' * 6)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001320 self.assertEqual(ipaddress.IPv6Interface('::1:0:0:0:0').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001321 b'\x00' * 6 + b'\x00\x01' + b'\x00' * 8)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001322
Nick Coghlandc9b2552012-05-20 21:01:57 +10001323 def testIpType(self):
1324 ipv4net = ipaddress.ip_network('1.2.3.4')
1325 ipv4addr = ipaddress.ip_address('1.2.3.4')
1326 ipv6net = ipaddress.ip_network('::1.2.3.4')
1327 ipv6addr = ipaddress.ip_address('::1.2.3.4')
1328 self.assertEqual(ipaddress.IPv4Network, type(ipv4net))
1329 self.assertEqual(ipaddress.IPv4Address, type(ipv4addr))
1330 self.assertEqual(ipaddress.IPv6Network, type(ipv6net))
1331 self.assertEqual(ipaddress.IPv6Address, type(ipv6addr))
1332
1333 def testReservedIpv4(self):
1334 # test networks
1335 self.assertEqual(True, ipaddress.ip_interface(
1336 '224.1.1.1/31').is_multicast)
1337 self.assertEqual(False, ipaddress.ip_network('240.0.0.0').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001338 self.assertEqual(True, ipaddress.ip_network('240.0.0.0').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001339
1340 self.assertEqual(True, ipaddress.ip_interface(
1341 '192.168.1.1/17').is_private)
1342 self.assertEqual(False, ipaddress.ip_network('192.169.0.0').is_private)
1343 self.assertEqual(True, ipaddress.ip_network(
1344 '10.255.255.255').is_private)
1345 self.assertEqual(False, ipaddress.ip_network('11.0.0.0').is_private)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001346 self.assertEqual(False, ipaddress.ip_network('11.0.0.0').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001347 self.assertEqual(True, ipaddress.ip_network(
1348 '172.31.255.255').is_private)
1349 self.assertEqual(False, ipaddress.ip_network('172.32.0.0').is_private)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001350 self.assertEqual(True,
1351 ipaddress.ip_network('169.254.1.0/24').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001352
1353 self.assertEqual(True,
1354 ipaddress.ip_interface(
1355 '169.254.100.200/24').is_link_local)
1356 self.assertEqual(False,
1357 ipaddress.ip_interface(
1358 '169.255.100.200/24').is_link_local)
1359
1360 self.assertEqual(True,
1361 ipaddress.ip_network(
1362 '127.100.200.254/32').is_loopback)
1363 self.assertEqual(True, ipaddress.ip_network(
1364 '127.42.0.0/16').is_loopback)
1365 self.assertEqual(False, ipaddress.ip_network('128.0.0.0').is_loopback)
Peter Moodye5019d52013-10-24 09:47:10 -07001366 self.assertEqual(False,
1367 ipaddress.ip_network('100.64.0.0/10').is_private)
Peter Moodybe9c1b12013-10-22 12:36:21 -07001368 self.assertEqual(False, ipaddress.ip_network('100.64.0.0/10').is_global)
Peter Moodye5019d52013-10-24 09:47:10 -07001369
Peter Moody22c31762013-10-21 13:58:06 -07001370 self.assertEqual(True,
1371 ipaddress.ip_network('192.0.2.128/25').is_private)
1372 self.assertEqual(True,
1373 ipaddress.ip_network('192.0.3.0/24').is_global)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001374
1375 # test addresses
Hynek Schlawackbcd30442012-06-04 14:19:39 +02001376 self.assertEqual(True, ipaddress.ip_address('0.0.0.0').is_unspecified)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001377 self.assertEqual(True, ipaddress.ip_address('224.1.1.1').is_multicast)
1378 self.assertEqual(False, ipaddress.ip_address('240.0.0.0').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001379 self.assertEqual(True, ipaddress.ip_address('240.0.0.1').is_reserved)
1380 self.assertEqual(False,
1381 ipaddress.ip_address('239.255.255.255').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001382
1383 self.assertEqual(True, ipaddress.ip_address('192.168.1.1').is_private)
1384 self.assertEqual(False, ipaddress.ip_address('192.169.0.0').is_private)
1385 self.assertEqual(True, ipaddress.ip_address(
1386 '10.255.255.255').is_private)
1387 self.assertEqual(False, ipaddress.ip_address('11.0.0.0').is_private)
1388 self.assertEqual(True, ipaddress.ip_address(
1389 '172.31.255.255').is_private)
1390 self.assertEqual(False, ipaddress.ip_address('172.32.0.0').is_private)
1391
1392 self.assertEqual(True,
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001393 ipaddress.ip_address('169.254.100.200').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001394 self.assertEqual(False,
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001395 ipaddress.ip_address('169.255.100.200').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001396
1397 self.assertEqual(True,
1398 ipaddress.ip_address('127.100.200.254').is_loopback)
1399 self.assertEqual(True, ipaddress.ip_address('127.42.0.0').is_loopback)
1400 self.assertEqual(False, ipaddress.ip_address('128.0.0.0').is_loopback)
1401 self.assertEqual(True, ipaddress.ip_network('0.0.0.0').is_unspecified)
1402
1403 def testReservedIpv6(self):
1404
1405 self.assertEqual(True, ipaddress.ip_network('ffff::').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001406 self.assertEqual(True, ipaddress.ip_network(2**128 - 1).is_multicast)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001407 self.assertEqual(True, ipaddress.ip_network('ff00::').is_multicast)
1408 self.assertEqual(False, ipaddress.ip_network('fdff::').is_multicast)
1409
1410 self.assertEqual(True, ipaddress.ip_network('fecf::').is_site_local)
1411 self.assertEqual(True, ipaddress.ip_network(
1412 'feff:ffff:ffff:ffff::').is_site_local)
1413 self.assertEqual(False, ipaddress.ip_network(
1414 'fbf:ffff::').is_site_local)
1415 self.assertEqual(False, ipaddress.ip_network('ff00::').is_site_local)
1416
1417 self.assertEqual(True, ipaddress.ip_network('fc00::').is_private)
1418 self.assertEqual(True, ipaddress.ip_network(
1419 'fc00:ffff:ffff:ffff::').is_private)
1420 self.assertEqual(False, ipaddress.ip_network('fbff:ffff::').is_private)
1421 self.assertEqual(False, ipaddress.ip_network('fe00::').is_private)
1422
1423 self.assertEqual(True, ipaddress.ip_network('fea0::').is_link_local)
1424 self.assertEqual(True, ipaddress.ip_network(
1425 'febf:ffff::').is_link_local)
1426 self.assertEqual(False, ipaddress.ip_network(
1427 'fe7f:ffff::').is_link_local)
1428 self.assertEqual(False, ipaddress.ip_network('fec0::').is_link_local)
1429
1430 self.assertEqual(True, ipaddress.ip_interface('0:0::0:01').is_loopback)
1431 self.assertEqual(False, ipaddress.ip_interface('::1/127').is_loopback)
1432 self.assertEqual(False, ipaddress.ip_network('::').is_loopback)
1433 self.assertEqual(False, ipaddress.ip_network('::2').is_loopback)
1434
1435 self.assertEqual(True, ipaddress.ip_network('0::0').is_unspecified)
1436 self.assertEqual(False, ipaddress.ip_network('::1').is_unspecified)
1437 self.assertEqual(False, ipaddress.ip_network('::/127').is_unspecified)
1438
Peter Moody22c31762013-10-21 13:58:06 -07001439 self.assertEqual(True,
1440 ipaddress.ip_network('2001::1/128').is_private)
1441 self.assertEqual(True,
1442 ipaddress.ip_network('200::1/128').is_global)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001443 # test addresses
1444 self.assertEqual(True, ipaddress.ip_address('ffff::').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001445 self.assertEqual(True, ipaddress.ip_address(2**128 - 1).is_multicast)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001446 self.assertEqual(True, ipaddress.ip_address('ff00::').is_multicast)
1447 self.assertEqual(False, ipaddress.ip_address('fdff::').is_multicast)
1448
1449 self.assertEqual(True, ipaddress.ip_address('fecf::').is_site_local)
1450 self.assertEqual(True, ipaddress.ip_address(
1451 'feff:ffff:ffff:ffff::').is_site_local)
1452 self.assertEqual(False, ipaddress.ip_address(
1453 'fbf:ffff::').is_site_local)
1454 self.assertEqual(False, ipaddress.ip_address('ff00::').is_site_local)
1455
1456 self.assertEqual(True, ipaddress.ip_address('fc00::').is_private)
1457 self.assertEqual(True, ipaddress.ip_address(
1458 'fc00:ffff:ffff:ffff::').is_private)
1459 self.assertEqual(False, ipaddress.ip_address('fbff:ffff::').is_private)
1460 self.assertEqual(False, ipaddress.ip_address('fe00::').is_private)
1461
1462 self.assertEqual(True, ipaddress.ip_address('fea0::').is_link_local)
1463 self.assertEqual(True, ipaddress.ip_address(
1464 'febf:ffff::').is_link_local)
1465 self.assertEqual(False, ipaddress.ip_address(
1466 'fe7f:ffff::').is_link_local)
1467 self.assertEqual(False, ipaddress.ip_address('fec0::').is_link_local)
1468
1469 self.assertEqual(True, ipaddress.ip_address('0:0::0:01').is_loopback)
1470 self.assertEqual(True, ipaddress.ip_address('::1').is_loopback)
1471 self.assertEqual(False, ipaddress.ip_address('::2').is_loopback)
1472
1473 self.assertEqual(True, ipaddress.ip_address('0::0').is_unspecified)
1474 self.assertEqual(False, ipaddress.ip_address('::1').is_unspecified)
1475
1476 # some generic IETF reserved addresses
1477 self.assertEqual(True, ipaddress.ip_address('100::').is_reserved)
1478 self.assertEqual(True, ipaddress.ip_network('4000::1/128').is_reserved)
1479
1480 def testIpv4Mapped(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001481 self.assertEqual(
1482 ipaddress.ip_address('::ffff:192.168.1.1').ipv4_mapped,
1483 ipaddress.ip_address('192.168.1.1'))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001484 self.assertEqual(ipaddress.ip_address('::c0a8:101').ipv4_mapped, None)
1485 self.assertEqual(ipaddress.ip_address('::ffff:c0a8:101').ipv4_mapped,
1486 ipaddress.ip_address('192.168.1.1'))
1487
1488 def testAddrExclude(self):
1489 addr1 = ipaddress.ip_network('10.1.1.0/24')
1490 addr2 = ipaddress.ip_network('10.1.1.0/26')
1491 addr3 = ipaddress.ip_network('10.2.1.0/24')
1492 addr4 = ipaddress.ip_address('10.1.1.0')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001493 addr5 = ipaddress.ip_network('2001:db8::0/32')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001494 self.assertEqual(sorted(list(addr1.address_exclude(addr2))),
1495 [ipaddress.ip_network('10.1.1.64/26'),
1496 ipaddress.ip_network('10.1.1.128/25')])
1497 self.assertRaises(ValueError, list, addr1.address_exclude(addr3))
1498 self.assertRaises(TypeError, list, addr1.address_exclude(addr4))
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001499 self.assertRaises(TypeError, list, addr1.address_exclude(addr5))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001500 self.assertEqual(list(addr1.address_exclude(addr1)), [])
1501
1502 def testHash(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001503 self.assertEqual(hash(ipaddress.ip_interface('10.1.1.0/24')),
1504 hash(ipaddress.ip_interface('10.1.1.0/24')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001505 self.assertEqual(hash(ipaddress.ip_network('10.1.1.0/24')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001506 hash(ipaddress.ip_network('10.1.1.0/24')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001507 self.assertEqual(hash(ipaddress.ip_address('10.1.1.0')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001508 hash(ipaddress.ip_address('10.1.1.0')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001509 # i70
1510 self.assertEqual(hash(ipaddress.ip_address('1.2.3.4')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001511 hash(ipaddress.ip_address(
Nick Coghlandc9b2552012-05-20 21:01:57 +10001512 int(ipaddress.ip_address('1.2.3.4')._ip))))
1513 ip1 = ipaddress.ip_address('10.1.1.0')
1514 ip2 = ipaddress.ip_address('1::')
1515 dummy = {}
1516 dummy[self.ipv4_address] = None
1517 dummy[self.ipv6_address] = None
1518 dummy[ip1] = None
1519 dummy[ip2] = None
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001520 self.assertIn(self.ipv4_address, dummy)
1521 self.assertIn(ip2, dummy)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001522
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001523 def testIPBases(self):
1524 net = self.ipv4_network
1525 self.assertEqual('1.2.3.0/24', net.compressed)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001526 net = self.ipv6_network
1527 self.assertRaises(ValueError, net._string_from_ip_int, 2**128 + 1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001528
Hynek Schlawack454a74d2012-06-04 18:14:02 +02001529 def testIPv6NetworkHelpers(self):
1530 net = self.ipv6_network
1531 self.assertEqual('2001:658:22a:cafe::/64', net.with_prefixlen)
1532 self.assertEqual('2001:658:22a:cafe::/ffff:ffff:ffff:ffff::',
1533 net.with_netmask)
1534 self.assertEqual('2001:658:22a:cafe::/::ffff:ffff:ffff:ffff',
1535 net.with_hostmask)
1536 self.assertEqual('2001:658:22a:cafe::/64', str(net))
1537
1538 def testIPv4NetworkHelpers(self):
1539 net = self.ipv4_network
1540 self.assertEqual('1.2.3.0/24', net.with_prefixlen)
1541 self.assertEqual('1.2.3.0/255.255.255.0', net.with_netmask)
1542 self.assertEqual('1.2.3.0/0.0.0.255', net.with_hostmask)
1543 self.assertEqual('1.2.3.0/24', str(net))
1544
Nick Coghlandc9b2552012-05-20 21:01:57 +10001545 def testCopyConstructor(self):
1546 addr1 = ipaddress.ip_network('10.1.1.0/24')
1547 addr2 = ipaddress.ip_network(addr1)
1548 addr3 = ipaddress.ip_interface('2001:658:22a:cafe:200::1/64')
1549 addr4 = ipaddress.ip_interface(addr3)
1550 addr5 = ipaddress.IPv4Address('1.1.1.1')
1551 addr6 = ipaddress.IPv6Address('2001:658:22a:cafe:200::1')
1552
1553 self.assertEqual(addr1, addr2)
1554 self.assertEqual(addr3, addr4)
1555 self.assertEqual(addr5, ipaddress.IPv4Address(addr5))
1556 self.assertEqual(addr6, ipaddress.IPv6Address(addr6))
1557
1558 def testCompressIPv6Address(self):
1559 test_addresses = {
1560 '1:2:3:4:5:6:7:8': '1:2:3:4:5:6:7:8/128',
1561 '2001:0:0:4:0:0:0:8': '2001:0:0:4::8/128',
1562 '2001:0:0:4:5:6:7:8': '2001::4:5:6:7:8/128',
1563 '2001:0:3:4:5:6:7:8': '2001:0:3:4:5:6:7:8/128',
1564 '2001:0:3:4:5:6:7:8': '2001:0:3:4:5:6:7:8/128',
1565 '0:0:3:0:0:0:0:ffff': '0:0:3::ffff/128',
1566 '0:0:0:4:0:0:0:ffff': '::4:0:0:0:ffff/128',
1567 '0:0:0:0:5:0:0:ffff': '::5:0:0:ffff/128',
1568 '1:0:0:4:0:0:7:8': '1::4:0:0:7:8/128',
1569 '0:0:0:0:0:0:0:0': '::/128',
1570 '0:0:0:0:0:0:0:0/0': '::/0',
1571 '0:0:0:0:0:0:0:1': '::1/128',
1572 '2001:0658:022a:cafe:0000:0000:0000:0000/66':
1573 '2001:658:22a:cafe::/66',
1574 '::1.2.3.4': '::102:304/128',
1575 '1:2:3:4:5:ffff:1.2.3.4': '1:2:3:4:5:ffff:102:304/128',
1576 '::7:6:5:4:3:2:1': '0:7:6:5:4:3:2:1/128',
1577 '::7:6:5:4:3:2:0': '0:7:6:5:4:3:2:0/128',
1578 '7:6:5:4:3:2:1::': '7:6:5:4:3:2:1:0/128',
1579 '0:6:5:4:3:2:1::': '0:6:5:4:3:2:1:0/128',
1580 }
1581 for uncompressed, compressed in list(test_addresses.items()):
1582 self.assertEqual(compressed, str(ipaddress.IPv6Interface(
1583 uncompressed)))
1584
1585 def testExplodeShortHandIpStr(self):
1586 addr1 = ipaddress.IPv6Interface('2001::1')
1587 addr2 = ipaddress.IPv6Address('2001:0:5ef5:79fd:0:59d:a0e5:ba1')
1588 addr3 = ipaddress.IPv6Network('2001::/96')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001589 addr4 = ipaddress.IPv4Address('192.168.178.1')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001590 self.assertEqual('2001:0000:0000:0000:0000:0000:0000:0001/128',
1591 addr1.exploded)
1592 self.assertEqual('0000:0000:0000:0000:0000:0000:0000:0001/128',
1593 ipaddress.IPv6Interface('::1/128').exploded)
1594 # issue 77
1595 self.assertEqual('2001:0000:5ef5:79fd:0000:059d:a0e5:0ba1',
1596 addr2.exploded)
1597 self.assertEqual('2001:0000:0000:0000:0000:0000:0000:0000/96',
1598 addr3.exploded)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001599 self.assertEqual('192.168.178.1', addr4.exploded)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001600
1601 def testIntRepresentation(self):
1602 self.assertEqual(16909060, int(self.ipv4_address))
1603 self.assertEqual(42540616829182469433547762482097946625,
1604 int(self.ipv6_address))
1605
Nick Coghlandc9b2552012-05-20 21:01:57 +10001606 def testForceVersion(self):
1607 self.assertEqual(ipaddress.ip_network(1).version, 4)
Nick Coghlan51c30672012-05-27 00:25:58 +10001608 self.assertEqual(ipaddress.IPv6Network(1).version, 6)
Sandro Tosi876ecad2012-05-23 22:26:55 +02001609
Nick Coghlandc9b2552012-05-20 21:01:57 +10001610 def testWithStar(self):
Nick Coghlana8517ad2012-08-20 10:04:26 +10001611 self.assertEqual(self.ipv4_interface.with_prefixlen, "1.2.3.4/24")
1612 self.assertEqual(self.ipv4_interface.with_netmask,
Nick Coghlandc9b2552012-05-20 21:01:57 +10001613 "1.2.3.4/255.255.255.0")
Nick Coghlana8517ad2012-08-20 10:04:26 +10001614 self.assertEqual(self.ipv4_interface.with_hostmask,
Nick Coghlandc9b2552012-05-20 21:01:57 +10001615 "1.2.3.4/0.0.0.255")
1616
Nick Coghlana8517ad2012-08-20 10:04:26 +10001617 self.assertEqual(self.ipv6_interface.with_prefixlen,
Nick Coghlandc9b2552012-05-20 21:01:57 +10001618 '2001:658:22a:cafe:200::1/64')
Nick Coghlana8517ad2012-08-20 10:04:26 +10001619 self.assertEqual(self.ipv6_interface.with_netmask,
1620 '2001:658:22a:cafe:200::1/ffff:ffff:ffff:ffff::')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001621 # this probably don't make much sense, but it's included for
1622 # compatibility with ipv4
Nick Coghlana8517ad2012-08-20 10:04:26 +10001623 self.assertEqual(self.ipv6_interface.with_hostmask,
Nick Coghlandc9b2552012-05-20 21:01:57 +10001624 '2001:658:22a:cafe:200::1/::ffff:ffff:ffff:ffff')
1625
1626 def testNetworkElementCaching(self):
1627 # V4 - make sure we're empty
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001628 self.assertNotIn('network_address', self.ipv4_network._cache)
1629 self.assertNotIn('broadcast_address', self.ipv4_network._cache)
1630 self.assertNotIn('hostmask', self.ipv4_network._cache)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001631
1632 # V4 - populate and test
1633 self.assertEqual(self.ipv4_network.network_address,
1634 ipaddress.IPv4Address('1.2.3.0'))
1635 self.assertEqual(self.ipv4_network.broadcast_address,
1636 ipaddress.IPv4Address('1.2.3.255'))
1637 self.assertEqual(self.ipv4_network.hostmask,
1638 ipaddress.IPv4Address('0.0.0.255'))
1639
1640 # V4 - check we're cached
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001641 self.assertIn('broadcast_address', self.ipv4_network._cache)
1642 self.assertIn('hostmask', self.ipv4_network._cache)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001643
1644 # V6 - make sure we're empty
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001645 self.assertNotIn('broadcast_address', self.ipv6_network._cache)
1646 self.assertNotIn('hostmask', self.ipv6_network._cache)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001647
1648 # V6 - populate and test
1649 self.assertEqual(self.ipv6_network.network_address,
1650 ipaddress.IPv6Address('2001:658:22a:cafe::'))
1651 self.assertEqual(self.ipv6_interface.network.network_address,
1652 ipaddress.IPv6Address('2001:658:22a:cafe::'))
1653
1654 self.assertEqual(
1655 self.ipv6_network.broadcast_address,
1656 ipaddress.IPv6Address('2001:658:22a:cafe:ffff:ffff:ffff:ffff'))
1657 self.assertEqual(self.ipv6_network.hostmask,
1658 ipaddress.IPv6Address('::ffff:ffff:ffff:ffff'))
1659 self.assertEqual(
1660 self.ipv6_interface.network.broadcast_address,
1661 ipaddress.IPv6Address('2001:658:22a:cafe:ffff:ffff:ffff:ffff'))
1662 self.assertEqual(self.ipv6_interface.network.hostmask,
1663 ipaddress.IPv6Address('::ffff:ffff:ffff:ffff'))
1664
1665 # V6 - check we're cached
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001666 self.assertIn('broadcast_address', self.ipv6_network._cache)
1667 self.assertIn('hostmask', self.ipv6_network._cache)
1668 self.assertIn('broadcast_address', self.ipv6_interface.network._cache)
1669 self.assertIn('hostmask', self.ipv6_interface.network._cache)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001670
1671 def testTeredo(self):
1672 # stolen from wikipedia
1673 server = ipaddress.IPv4Address('65.54.227.120')
1674 client = ipaddress.IPv4Address('192.0.2.45')
1675 teredo_addr = '2001:0000:4136:e378:8000:63bf:3fff:fdd2'
1676 self.assertEqual((server, client),
1677 ipaddress.ip_address(teredo_addr).teredo)
1678 bad_addr = '2000::4136:e378:8000:63bf:3fff:fdd2'
1679 self.assertFalse(ipaddress.ip_address(bad_addr).teredo)
1680 bad_addr = '2001:0001:4136:e378:8000:63bf:3fff:fdd2'
1681 self.assertFalse(ipaddress.ip_address(bad_addr).teredo)
1682
1683 # i77
1684 teredo_addr = ipaddress.IPv6Address('2001:0:5ef5:79fd:0:59d:a0e5:ba1')
1685 self.assertEqual((ipaddress.IPv4Address('94.245.121.253'),
1686 ipaddress.IPv4Address('95.26.244.94')),
1687 teredo_addr.teredo)
1688
Nick Coghlandc9b2552012-05-20 21:01:57 +10001689 def testsixtofour(self):
1690 sixtofouraddr = ipaddress.ip_address('2002:ac1d:2d64::1')
1691 bad_addr = ipaddress.ip_address('2000:ac1d:2d64::1')
1692 self.assertEqual(ipaddress.IPv4Address('172.29.45.100'),
1693 sixtofouraddr.sixtofour)
1694 self.assertFalse(bad_addr.sixtofour)
1695
Nick Coghlandc9b2552012-05-20 21:01:57 +10001696
1697if __name__ == '__main__':
1698 unittest.main()