blob: 0e0753f34c490543fe522fcce54dcd9b77bd23f6 [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
Serhiy Storchakaf186e122015-01-26 10:11:16 +020010import functools
Nick Coghlane0c3f5e2012-08-05 18:20:17 +100011import operator
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +020012import pickle
Nick Coghlandc9b2552012-05-20 21:01:57 +100013import ipaddress
Serhiy Storchaka88f64f32015-03-07 20:08:34 +020014import weakref
Nick Coghlandc9b2552012-05-20 21:01:57 +100015
R David Murray75678652014-10-12 15:17:22 -040016
Nick Coghlan07c4e332012-07-08 23:06:45 +100017class BaseTestCase(unittest.TestCase):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +100018 # One big change in ipaddress over the original ipaddr module is
19 # error reporting that tries to assume users *don't know the rules*
20 # for what constitutes an RFC compliant IP address
21
Nick Coghlan07c4e332012-07-08 23:06:45 +100022 # Ensuring these errors are emitted correctly in all relevant cases
23 # meant moving to a more systematic test structure that allows the
24 # test structure to map more directly to the module structure
25
Nick Coghlan36f8dcd2012-07-07 19:23:53 +100026 # Note that if the constructors are refactored so that addresses with
27 # multiple problems get classified differently, that's OK - just
28 # move the affected examples to the newly appropriate test case.
29
Nick Coghlan07c4e332012-07-08 23:06:45 +100030 # There is some duplication between the original relatively ad hoc
31 # test suite and the new systematic tests. While some redundancy in
32 # testing is considered preferable to accidentally deleting a valid
33 # test, the original test suite will likely be reduced over time as
34 # redundant tests are identified.
Nick Coghlan36f8dcd2012-07-07 19:23:53 +100035
Nick Coghlan297b1432012-07-08 17:11:04 +100036 @property
37 def factory(self):
38 raise NotImplementedError
39
Nick Coghlan36f8dcd2012-07-07 19:23:53 +100040 @contextlib.contextmanager
41 def assertCleanError(self, exc_type, details, *args):
42 """
43 Ensure exception does not display a context by default
44
45 Wraps unittest.TestCase.assertRaisesRegex
46 """
47 if args:
48 details = details % args
49 cm = self.assertRaisesRegex(exc_type, details)
50 with cm as exc:
51 yield exc
52 # Ensure we produce clean tracebacks on failure
53 if exc.exception.__context__ is not None:
54 self.assertTrue(exc.exception.__suppress_context__)
55
56 def assertAddressError(self, details, *args):
57 """Ensure a clean AddressValueError"""
58 return self.assertCleanError(ipaddress.AddressValueError,
R David Murray75678652014-10-12 15:17:22 -040059 details, *args)
Nick Coghlan36f8dcd2012-07-07 19:23:53 +100060
61 def assertNetmaskError(self, details, *args):
62 """Ensure a clean NetmaskValueError"""
63 return self.assertCleanError(ipaddress.NetmaskValueError,
R David Murray75678652014-10-12 15:17:22 -040064 details, *args)
Nick Coghlan36f8dcd2012-07-07 19:23:53 +100065
Nick Coghlan07c4e332012-07-08 23:06:45 +100066 def assertInstancesEqual(self, lhs, rhs):
67 """Check constructor arguments produce equivalent instances"""
68 self.assertEqual(self.factory(lhs), self.factory(rhs))
69
R David Murray75678652014-10-12 15:17:22 -040070
Nick Coghlan07c4e332012-07-08 23:06:45 +100071class CommonTestMixin:
Nick Coghlan36f8dcd2012-07-07 19:23:53 +100072
73 def test_empty_address(self):
74 with self.assertAddressError("Address cannot be empty"):
Nick Coghlan297b1432012-07-08 17:11:04 +100075 self.factory("")
76
77 def test_floats_rejected(self):
78 with self.assertAddressError(re.escape(repr("1.0"))):
79 self.factory(1.0)
80
Nick Coghlane0c3f5e2012-08-05 18:20:17 +100081 def test_not_an_index_issue15559(self):
82 # Implementing __index__ makes for a very nasty interaction with the
83 # bytes constructor. Thus, we disallow implicit use as an integer
84 self.assertRaises(TypeError, operator.index, self.factory(1))
85 self.assertRaises(TypeError, hex, self.factory(1))
86 self.assertRaises(TypeError, bytes, self.factory(1))
87
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +020088 def pickle_test(self, addr):
89 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
90 with self.subTest(proto=proto):
91 x = self.factory(addr)
92 y = pickle.loads(pickle.dumps(x, proto))
93 self.assertEqual(y, x)
94
Nick Coghlan07c4e332012-07-08 23:06:45 +100095class CommonTestMixin_v4(CommonTestMixin):
96
97 def test_leading_zeros(self):
98 self.assertInstancesEqual("000.000.000.000", "0.0.0.0")
99 self.assertInstancesEqual("192.168.000.001", "192.168.0.1")
100
101 def test_int(self):
102 self.assertInstancesEqual(0, "0.0.0.0")
103 self.assertInstancesEqual(3232235521, "192.168.0.1")
104
105 def test_packed(self):
106 self.assertInstancesEqual(bytes.fromhex("00000000"), "0.0.0.0")
107 self.assertInstancesEqual(bytes.fromhex("c0a80001"), "192.168.0.1")
Nick Coghlan297b1432012-07-08 17:11:04 +1000108
109 def test_negative_ints_rejected(self):
110 msg = "-1 (< 0) is not permitted as an IPv4 address"
111 with self.assertAddressError(re.escape(msg)):
112 self.factory(-1)
113
114 def test_large_ints_rejected(self):
115 msg = "%d (>= 2**32) is not permitted as an IPv4 address"
116 with self.assertAddressError(re.escape(msg % 2**32)):
117 self.factory(2**32)
118
119 def test_bad_packed_length(self):
120 def assertBadLength(length):
Serhiy Storchaka5f1a5182016-09-11 14:41:02 +0300121 addr = b'\0' * length
Nick Coghlan297b1432012-07-08 17:11:04 +1000122 msg = "%r (len %d != 4) is not permitted as an IPv4 address"
123 with self.assertAddressError(re.escape(msg % (addr, length))):
124 self.factory(addr)
125
126 assertBadLength(3)
127 assertBadLength(5)
128
R David Murray75678652014-10-12 15:17:22 -0400129
Nick Coghlan07c4e332012-07-08 23:06:45 +1000130class CommonTestMixin_v6(CommonTestMixin):
131
132 def test_leading_zeros(self):
133 self.assertInstancesEqual("0000::0000", "::")
134 self.assertInstancesEqual("000::c0a8:0001", "::c0a8:1")
135
136 def test_int(self):
137 self.assertInstancesEqual(0, "::")
138 self.assertInstancesEqual(3232235521, "::c0a8:1")
139
140 def test_packed(self):
Serhiy Storchaka5f1a5182016-09-11 14:41:02 +0300141 addr = b'\0'*12 + bytes.fromhex("00000000")
Nick Coghlan07c4e332012-07-08 23:06:45 +1000142 self.assertInstancesEqual(addr, "::")
Serhiy Storchaka5f1a5182016-09-11 14:41:02 +0300143 addr = b'\0'*12 + bytes.fromhex("c0a80001")
Nick Coghlan07c4e332012-07-08 23:06:45 +1000144 self.assertInstancesEqual(addr, "::c0a8:1")
Serhiy Storchaka5f1a5182016-09-11 14:41:02 +0300145 addr = bytes.fromhex("c0a80001") + b'\0'*12
Nick Coghlan07c4e332012-07-08 23:06:45 +1000146 self.assertInstancesEqual(addr, "c0a8:1::")
Nick Coghlan297b1432012-07-08 17:11:04 +1000147
148 def test_negative_ints_rejected(self):
149 msg = "-1 (< 0) is not permitted as an IPv6 address"
150 with self.assertAddressError(re.escape(msg)):
151 self.factory(-1)
152
153 def test_large_ints_rejected(self):
154 msg = "%d (>= 2**128) is not permitted as an IPv6 address"
155 with self.assertAddressError(re.escape(msg % 2**128)):
156 self.factory(2**128)
157
158 def test_bad_packed_length(self):
159 def assertBadLength(length):
Serhiy Storchaka5f1a5182016-09-11 14:41:02 +0300160 addr = b'\0' * length
Nick Coghlan297b1432012-07-08 17:11:04 +1000161 msg = "%r (len %d != 16) is not permitted as an IPv6 address"
162 with self.assertAddressError(re.escape(msg % (addr, length))):
163 self.factory(addr)
164 self.factory(addr)
165
166 assertBadLength(15)
167 assertBadLength(17)
168
169
Nick Coghlan07c4e332012-07-08 23:06:45 +1000170class AddressTestCase_v4(BaseTestCase, CommonTestMixin_v4):
Nick Coghlan297b1432012-07-08 17:11:04 +1000171 factory = ipaddress.IPv4Address
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000172
173 def test_network_passed_as_address(self):
174 addr = "127.0.0.1/24"
175 with self.assertAddressError("Unexpected '/' in %r", addr):
176 ipaddress.IPv4Address(addr)
177
178 def test_bad_address_split(self):
179 def assertBadSplit(addr):
180 with self.assertAddressError("Expected 4 octets in %r", addr):
181 ipaddress.IPv4Address(addr)
182
183 assertBadSplit("127.0.1")
184 assertBadSplit("42.42.42.42.42")
185 assertBadSplit("42.42.42")
186 assertBadSplit("42.42")
187 assertBadSplit("42")
188 assertBadSplit("42..42.42.42")
189 assertBadSplit("42.42.42.42.")
190 assertBadSplit("42.42.42.42...")
191 assertBadSplit(".42.42.42.42")
192 assertBadSplit("...42.42.42.42")
193 assertBadSplit("016.016.016")
194 assertBadSplit("016.016")
195 assertBadSplit("016")
196 assertBadSplit("000")
197 assertBadSplit("0x0a.0x0a.0x0a")
198 assertBadSplit("0x0a.0x0a")
199 assertBadSplit("0x0a")
200 assertBadSplit(".")
201 assertBadSplit("bogus")
202 assertBadSplit("bogus.com")
203 assertBadSplit("1000")
204 assertBadSplit("1000000000000000")
205 assertBadSplit("192.168.0.1.com")
206
207 def test_empty_octet(self):
208 def assertBadOctet(addr):
209 with self.assertAddressError("Empty octet not permitted in %r",
R David Murray75678652014-10-12 15:17:22 -0400210 addr):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000211 ipaddress.IPv4Address(addr)
212
213 assertBadOctet("42..42.42")
214 assertBadOctet("...")
215
216 def test_invalid_characters(self):
217 def assertBadOctet(addr, octet):
218 msg = "Only decimal digits permitted in %r in %r" % (octet, addr)
219 with self.assertAddressError(re.escape(msg)):
220 ipaddress.IPv4Address(addr)
221
222 assertBadOctet("0x0a.0x0a.0x0a.0x0a", "0x0a")
Nick Coghlan07c4e332012-07-08 23:06:45 +1000223 assertBadOctet("0xa.0x0a.0x0a.0x0a", "0xa")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000224 assertBadOctet("42.42.42.-0", "-0")
225 assertBadOctet("42.42.42.+0", "+0")
226 assertBadOctet("42.42.42.-42", "-42")
227 assertBadOctet("+1.+2.+3.4", "+1")
228 assertBadOctet("1.2.3.4e0", "4e0")
229 assertBadOctet("1.2.3.4::", "4::")
230 assertBadOctet("1.a.2.3", "a")
231
Nick Coghlan07c4e332012-07-08 23:06:45 +1000232 def test_octal_decimal_ambiguity(self):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000233 def assertBadOctet(addr, octet):
Nick Coghlan07c4e332012-07-08 23:06:45 +1000234 msg = "Ambiguous (octal/decimal) value in %r not permitted in %r"
235 with self.assertAddressError(re.escape(msg % (octet, addr))):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000236 ipaddress.IPv4Address(addr)
237
238 assertBadOctet("016.016.016.016", "016")
239 assertBadOctet("001.000.008.016", "008")
Nick Coghlan07c4e332012-07-08 23:06:45 +1000240
241 def test_octet_length(self):
242 def assertBadOctet(addr, octet):
243 msg = "At most 3 characters permitted in %r in %r"
244 with self.assertAddressError(re.escape(msg % (octet, addr))):
245 ipaddress.IPv4Address(addr)
246
247 assertBadOctet("0000.000.000.000", "0000")
248 assertBadOctet("12345.67899.-54321.-98765", "12345")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000249
250 def test_octet_limit(self):
251 def assertBadOctet(addr, octet):
Nick Coghlanb582ecc2012-07-07 22:15:22 +1000252 msg = "Octet %d (> 255) not permitted in %r" % (octet, addr)
253 with self.assertAddressError(re.escape(msg)):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000254 ipaddress.IPv4Address(addr)
255
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000256 assertBadOctet("257.0.0.0", 257)
Nick Coghlan07c4e332012-07-08 23:06:45 +1000257 assertBadOctet("192.168.0.999", 999)
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000258
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +0200259 def test_pickle(self):
260 self.pickle_test('192.0.2.1')
261
Serhiy Storchaka88f64f32015-03-07 20:08:34 +0200262 def test_weakref(self):
263 weakref.ref(self.factory('192.0.2.1'))
264
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000265
Nick Coghlan07c4e332012-07-08 23:06:45 +1000266class AddressTestCase_v6(BaseTestCase, CommonTestMixin_v6):
Nick Coghlan297b1432012-07-08 17:11:04 +1000267 factory = ipaddress.IPv6Address
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000268
269 def test_network_passed_as_address(self):
270 addr = "::1/24"
271 with self.assertAddressError("Unexpected '/' in %r", addr):
272 ipaddress.IPv6Address(addr)
273
274 def test_bad_address_split_v6_not_enough_parts(self):
275 def assertBadSplit(addr):
276 msg = "At least 3 parts expected in %r"
277 with self.assertAddressError(msg, addr):
278 ipaddress.IPv6Address(addr)
279
280 assertBadSplit(":")
281 assertBadSplit(":1")
282 assertBadSplit("FEDC:9878")
283
284 def test_bad_address_split_v6_too_many_colons(self):
285 def assertBadSplit(addr):
286 msg = "At most 8 colons permitted in %r"
287 with self.assertAddressError(msg, addr):
288 ipaddress.IPv6Address(addr)
289
290 assertBadSplit("9:8:7:6:5:4:3::2:1")
291 assertBadSplit("10:9:8:7:6:5:4:3:2:1")
292 assertBadSplit("::8:7:6:5:4:3:2:1")
293 assertBadSplit("8:7:6:5:4:3:2:1::")
294 # A trailing IPv4 address is two parts
295 assertBadSplit("10:9:8:7:6:5:4:3:42.42.42.42")
296
297 def test_bad_address_split_v6_too_many_parts(self):
298 def assertBadSplit(addr):
299 msg = "Exactly 8 parts expected without '::' in %r"
300 with self.assertAddressError(msg, addr):
301 ipaddress.IPv6Address(addr)
302
303 assertBadSplit("3ffe:0:0:0:0:0:0:0:1")
304 assertBadSplit("9:8:7:6:5:4:3:2:1")
305 assertBadSplit("7:6:5:4:3:2:1")
306 # A trailing IPv4 address is two parts
307 assertBadSplit("9:8:7:6:5:4:3:42.42.42.42")
308 assertBadSplit("7:6:5:4:3:42.42.42.42")
309
310 def test_bad_address_split_v6_too_many_parts_with_double_colon(self):
311 def assertBadSplit(addr):
312 msg = "Expected at most 7 other parts with '::' in %r"
313 with self.assertAddressError(msg, addr):
314 ipaddress.IPv6Address(addr)
315
316 assertBadSplit("1:2:3:4::5:6:7:8")
317
318 def test_bad_address_split_v6_repeated_double_colon(self):
319 def assertBadSplit(addr):
320 msg = "At most one '::' permitted in %r"
321 with self.assertAddressError(msg, addr):
322 ipaddress.IPv6Address(addr)
323
324 assertBadSplit("3ffe::1::1")
325 assertBadSplit("1::2::3::4:5")
326 assertBadSplit("2001::db:::1")
327 assertBadSplit("3ffe::1::")
328 assertBadSplit("::3ffe::1")
329 assertBadSplit(":3ffe::1::1")
330 assertBadSplit("3ffe::1::1:")
331 assertBadSplit(":3ffe::1::1:")
332 assertBadSplit(":::")
333 assertBadSplit('2001:db8:::1')
334
335 def test_bad_address_split_v6_leading_colon(self):
336 def assertBadSplit(addr):
337 msg = "Leading ':' only permitted as part of '::' in %r"
338 with self.assertAddressError(msg, addr):
339 ipaddress.IPv6Address(addr)
340
341 assertBadSplit(":2001:db8::1")
342 assertBadSplit(":1:2:3:4:5:6:7")
343 assertBadSplit(":1:2:3:4:5:6:")
344 assertBadSplit(":6:5:4:3:2:1::")
345
346 def test_bad_address_split_v6_trailing_colon(self):
347 def assertBadSplit(addr):
348 msg = "Trailing ':' only permitted as part of '::' in %r"
349 with self.assertAddressError(msg, addr):
350 ipaddress.IPv6Address(addr)
351
352 assertBadSplit("2001:db8::1:")
353 assertBadSplit("1:2:3:4:5:6:7:")
354 assertBadSplit("::1.2.3.4:")
355 assertBadSplit("::7:6:5:4:3:2:")
356
357 def test_bad_v4_part_in(self):
358 def assertBadAddressPart(addr, v4_error):
359 with self.assertAddressError("%s in %r", v4_error, addr):
360 ipaddress.IPv6Address(addr)
361
362 assertBadAddressPart("3ffe::1.net", "Expected 4 octets in '1.net'")
363 assertBadAddressPart("3ffe::127.0.1",
364 "Expected 4 octets in '127.0.1'")
365 assertBadAddressPart("::1.2.3",
366 "Expected 4 octets in '1.2.3'")
367 assertBadAddressPart("::1.2.3.4.5",
368 "Expected 4 octets in '1.2.3.4.5'")
369 assertBadAddressPart("3ffe::1.1.1.net",
370 "Only decimal digits permitted in 'net' "
371 "in '1.1.1.net'")
372
373 def test_invalid_characters(self):
374 def assertBadPart(addr, part):
375 msg = "Only hex digits permitted in %r in %r" % (part, addr)
376 with self.assertAddressError(re.escape(msg)):
377 ipaddress.IPv6Address(addr)
378
379 assertBadPart("3ffe::goog", "goog")
380 assertBadPart("3ffe::-0", "-0")
381 assertBadPart("3ffe::+0", "+0")
382 assertBadPart("3ffe::-1", "-1")
383 assertBadPart("1.2.3.4::", "1.2.3.4")
384 assertBadPart('1234:axy::b', "axy")
385
386 def test_part_length(self):
387 def assertBadPart(addr, part):
388 msg = "At most 4 characters permitted in %r in %r"
389 with self.assertAddressError(msg, part, addr):
390 ipaddress.IPv6Address(addr)
391
Nick Coghlan07c4e332012-07-08 23:06:45 +1000392 assertBadPart("::00000", "00000")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000393 assertBadPart("3ffe::10000", "10000")
394 assertBadPart("02001:db8::", "02001")
395 assertBadPart('2001:888888::1', "888888")
396
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +0200397 def test_pickle(self):
398 self.pickle_test('2001:db8::')
399
Serhiy Storchaka88f64f32015-03-07 20:08:34 +0200400 def test_weakref(self):
401 weakref.ref(self.factory('2001:db8::'))
402
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000403
Nick Coghlan07c4e332012-07-08 23:06:45 +1000404class NetmaskTestMixin_v4(CommonTestMixin_v4):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000405 """Input validation on interfaces and networks is very similar"""
406
Cheryl Sabella5609b782018-03-20 20:09:15 -0400407 def test_no_mask(self):
408 self.assertEqual(str(self.factory('1.2.3.4')), '1.2.3.4/32')
409
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000410 def test_split_netmask(self):
411 addr = "1.2.3.4/32/24"
412 with self.assertAddressError("Only one '/' permitted in %r" % addr):
413 self.factory(addr)
414
415 def test_address_errors(self):
416 def assertBadAddress(addr, details):
417 with self.assertAddressError(details):
418 self.factory(addr)
419
Nick Coghlan297b1432012-07-08 17:11:04 +1000420 assertBadAddress("/", "Address cannot be empty")
421 assertBadAddress("/8", "Address cannot be empty")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000422 assertBadAddress("bogus", "Expected 4 octets")
423 assertBadAddress("google.com", "Expected 4 octets")
424 assertBadAddress("10/8", "Expected 4 octets")
425 assertBadAddress("::1.2.3.4", "Only decimal digits")
Nick Coghlanb582ecc2012-07-07 22:15:22 +1000426 assertBadAddress("1.2.3.256", re.escape("256 (> 255)"))
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000427
Nick Coghlan932346f2014-02-08 23:17:36 +1000428 def test_valid_netmask(self):
429 self.assertEqual(str(self.factory('192.0.2.0/255.255.255.0')),
430 '192.0.2.0/24')
431 for i in range(0, 33):
432 # Generate and re-parse the CIDR format (trivial).
433 net_str = '0.0.0.0/%d' % i
434 net = self.factory(net_str)
435 self.assertEqual(str(net), net_str)
436 # Generate and re-parse the expanded netmask.
437 self.assertEqual(
438 str(self.factory('0.0.0.0/%s' % net.netmask)), net_str)
439 # Zero prefix is treated as decimal.
440 self.assertEqual(str(self.factory('0.0.0.0/0%d' % i)), net_str)
441 # Generate and re-parse the expanded hostmask. The ambiguous
442 # cases (/0 and /32) are treated as netmasks.
443 if i in (32, 0):
444 net_str = '0.0.0.0/%d' % (32 - i)
445 self.assertEqual(
446 str(self.factory('0.0.0.0/%s' % net.hostmask)), net_str)
447
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000448 def test_netmask_errors(self):
449 def assertBadNetmask(addr, netmask):
Nick Coghlan932346f2014-02-08 23:17:36 +1000450 msg = "%r is not a valid netmask" % netmask
451 with self.assertNetmaskError(re.escape(msg)):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000452 self.factory("%s/%s" % (addr, netmask))
453
454 assertBadNetmask("1.2.3.4", "")
Nick Coghlan932346f2014-02-08 23:17:36 +1000455 assertBadNetmask("1.2.3.4", "-1")
456 assertBadNetmask("1.2.3.4", "+1")
457 assertBadNetmask("1.2.3.4", " 1 ")
458 assertBadNetmask("1.2.3.4", "0x1")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000459 assertBadNetmask("1.2.3.4", "33")
460 assertBadNetmask("1.2.3.4", "254.254.255.256")
Nick Coghlan932346f2014-02-08 23:17:36 +1000461 assertBadNetmask("1.2.3.4", "1.a.2.3")
Nick Coghlan07c4e332012-07-08 23:06:45 +1000462 assertBadNetmask("1.1.1.1", "254.xyz.2.3")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000463 assertBadNetmask("1.1.1.1", "240.255.0.0")
Nick Coghlan932346f2014-02-08 23:17:36 +1000464 assertBadNetmask("1.1.1.1", "255.254.128.0")
465 assertBadNetmask("1.1.1.1", "0.1.127.255")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000466 assertBadNetmask("1.1.1.1", "pudding")
Nick Coghlan932346f2014-02-08 23:17:36 +1000467 assertBadNetmask("1.1.1.1", "::")
468
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +0200469 def test_pickle(self):
470 self.pickle_test('192.0.2.0/27')
471 self.pickle_test('192.0.2.0/31') # IPV4LENGTH - 1
472 self.pickle_test('192.0.2.0') # IPV4LENGTH
473
R David Murray75678652014-10-12 15:17:22 -0400474
Serhiy Storchakaa556af72015-01-18 22:56:47 +0200475class InterfaceTestCase_v4(BaseTestCase, NetmaskTestMixin_v4):
476 factory = ipaddress.IPv4Interface
477
478
Nick Coghlan07c4e332012-07-08 23:06:45 +1000479class NetworkTestCase_v4(BaseTestCase, NetmaskTestMixin_v4):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000480 factory = ipaddress.IPv4Network
481
Cheryl Sabella91dc64b2017-10-22 17:39:49 -0400482 def test_subnet_of(self):
483 # containee left of container
484 self.assertFalse(
485 self.factory('10.0.0.0/30').subnet_of(
486 self.factory('10.0.1.0/24')))
487 # containee inside container
488 self.assertTrue(
489 self.factory('10.0.0.0/30').subnet_of(
490 self.factory('10.0.0.0/24')))
491 # containee right of container
492 self.assertFalse(
493 self.factory('10.0.0.0/30').subnet_of(
494 self.factory('10.0.1.0/24')))
495 # containee larger than container
496 self.assertFalse(
497 self.factory('10.0.1.0/24').subnet_of(
498 self.factory('10.0.0.0/30')))
499
500 def test_supernet_of(self):
501 # containee left of container
502 self.assertFalse(
503 self.factory('10.0.0.0/30').supernet_of(
504 self.factory('10.0.1.0/24')))
505 # containee inside container
506 self.assertFalse(
507 self.factory('10.0.0.0/30').supernet_of(
508 self.factory('10.0.0.0/24')))
509 # containee right of container
510 self.assertFalse(
511 self.factory('10.0.0.0/30').supernet_of(
512 self.factory('10.0.1.0/24')))
513 # containee larger than container
514 self.assertTrue(
515 self.factory('10.0.0.0/24').supernet_of(
516 self.factory('10.0.0.0/30')))
517
518 def test_subnet_of_mixed_types(self):
519 with self.assertRaises(TypeError):
520 ipaddress.IPv4Network('10.0.0.0/30').supernet_of(
521 ipaddress.IPv6Network('::1/128'))
522 with self.assertRaises(TypeError):
523 ipaddress.IPv6Network('::1/128').supernet_of(
524 ipaddress.IPv4Network('10.0.0.0/30'))
525 with self.assertRaises(TypeError):
526 ipaddress.IPv4Network('10.0.0.0/30').subnet_of(
527 ipaddress.IPv6Network('::1/128'))
528 with self.assertRaises(TypeError):
529 ipaddress.IPv6Network('::1/128').subnet_of(
530 ipaddress.IPv4Network('10.0.0.0/30'))
531
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000532
Nick Coghlan07c4e332012-07-08 23:06:45 +1000533class NetmaskTestMixin_v6(CommonTestMixin_v6):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000534 """Input validation on interfaces and networks is very similar"""
535
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000536 def test_split_netmask(self):
537 addr = "cafe:cafe::/128/190"
538 with self.assertAddressError("Only one '/' permitted in %r" % addr):
539 self.factory(addr)
540
541 def test_address_errors(self):
542 def assertBadAddress(addr, details):
543 with self.assertAddressError(details):
544 self.factory(addr)
545
Nick Coghlan297b1432012-07-08 17:11:04 +1000546 assertBadAddress("/", "Address cannot be empty")
547 assertBadAddress("/8", "Address cannot be empty")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000548 assertBadAddress("google.com", "At least 3 parts")
549 assertBadAddress("1.2.3.4", "At least 3 parts")
550 assertBadAddress("10/8", "At least 3 parts")
551 assertBadAddress("1234:axy::b", "Only hex digits")
552
Nick Coghlan932346f2014-02-08 23:17:36 +1000553 def test_valid_netmask(self):
554 # We only support CIDR for IPv6, because expanded netmasks are not
555 # standard notation.
556 self.assertEqual(str(self.factory('2001:db8::/32')), '2001:db8::/32')
557 for i in range(0, 129):
558 # Generate and re-parse the CIDR format (trivial).
559 net_str = '::/%d' % i
560 self.assertEqual(str(self.factory(net_str)), net_str)
561 # Zero prefix is treated as decimal.
562 self.assertEqual(str(self.factory('::/0%d' % i)), net_str)
563
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000564 def test_netmask_errors(self):
565 def assertBadNetmask(addr, netmask):
Nick Coghlan932346f2014-02-08 23:17:36 +1000566 msg = "%r is not a valid netmask" % netmask
567 with self.assertNetmaskError(re.escape(msg)):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000568 self.factory("%s/%s" % (addr, netmask))
569
570 assertBadNetmask("::1", "")
571 assertBadNetmask("::1", "::1")
572 assertBadNetmask("::1", "1::")
Nick Coghlan932346f2014-02-08 23:17:36 +1000573 assertBadNetmask("::1", "-1")
574 assertBadNetmask("::1", "+1")
575 assertBadNetmask("::1", " 1 ")
576 assertBadNetmask("::1", "0x1")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000577 assertBadNetmask("::1", "129")
Nick Coghlan932346f2014-02-08 23:17:36 +1000578 assertBadNetmask("::1", "1.2.3.4")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000579 assertBadNetmask("::1", "pudding")
Nick Coghlan932346f2014-02-08 23:17:36 +1000580 assertBadNetmask("::", "::")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000581
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +0200582 def test_pickle(self):
583 self.pickle_test('2001:db8::1000/124')
584 self.pickle_test('2001:db8::1000/127') # IPV6LENGTH - 1
585 self.pickle_test('2001:db8::1000') # IPV6LENGTH
586
R David Murray75678652014-10-12 15:17:22 -0400587
Nick Coghlan07c4e332012-07-08 23:06:45 +1000588class InterfaceTestCase_v6(BaseTestCase, NetmaskTestMixin_v6):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000589 factory = ipaddress.IPv6Interface
590
R David Murray75678652014-10-12 15:17:22 -0400591
Nick Coghlan07c4e332012-07-08 23:06:45 +1000592class NetworkTestCase_v6(BaseTestCase, NetmaskTestMixin_v6):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000593 factory = ipaddress.IPv6Network
594
Cheryl Sabella91dc64b2017-10-22 17:39:49 -0400595 def test_subnet_of(self):
596 # containee left of container
597 self.assertFalse(
598 self.factory('2000:999::/56').subnet_of(
599 self.factory('2000:aaa::/48')))
600 # containee inside container
601 self.assertTrue(
602 self.factory('2000:aaa::/56').subnet_of(
603 self.factory('2000:aaa::/48')))
604 # containee right of container
605 self.assertFalse(
606 self.factory('2000:bbb::/56').subnet_of(
607 self.factory('2000:aaa::/48')))
608 # containee larger than container
609 self.assertFalse(
610 self.factory('2000:aaa::/48').subnet_of(
611 self.factory('2000:aaa::/56')))
612
613 def test_supernet_of(self):
614 # containee left of container
615 self.assertFalse(
616 self.factory('2000:999::/56').supernet_of(
617 self.factory('2000:aaa::/48')))
618 # containee inside container
619 self.assertFalse(
620 self.factory('2000:aaa::/56').supernet_of(
621 self.factory('2000:aaa::/48')))
622 # containee right of container
623 self.assertFalse(
624 self.factory('2000:bbb::/56').supernet_of(
625 self.factory('2000:aaa::/48')))
626 # containee larger than container
627 self.assertTrue(
628 self.factory('2000:aaa::/48').supernet_of(
629 self.factory('2000:aaa::/56')))
630
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000631
Nick Coghlan07c4e332012-07-08 23:06:45 +1000632class FactoryFunctionErrors(BaseTestCase):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000633
634 def assertFactoryError(self, factory, kind):
635 """Ensure a clean ValueError with the expected message"""
636 addr = "camelot"
637 msg = '%r does not appear to be an IPv4 or IPv6 %s'
638 with self.assertCleanError(ValueError, msg, addr, kind):
639 factory(addr)
640
641 def test_ip_address(self):
642 self.assertFactoryError(ipaddress.ip_address, "address")
643
644 def test_ip_interface(self):
645 self.assertFactoryError(ipaddress.ip_interface, "interface")
646
647 def test_ip_network(self):
648 self.assertFactoryError(ipaddress.ip_network, "network")
649
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200650
Serhiy Storchakaf186e122015-01-26 10:11:16 +0200651@functools.total_ordering
652class LargestObject:
653 def __eq__(self, other):
654 return isinstance(other, LargestObject)
655 def __lt__(self, other):
656 return False
657
658@functools.total_ordering
659class SmallestObject:
660 def __eq__(self, other):
661 return isinstance(other, SmallestObject)
662 def __gt__(self, other):
663 return False
664
Nick Coghlan3008ec02012-07-08 00:45:33 +1000665class ComparisonTests(unittest.TestCase):
666
667 v4addr = ipaddress.IPv4Address(1)
668 v4net = ipaddress.IPv4Network(1)
669 v4intf = ipaddress.IPv4Interface(1)
670 v6addr = ipaddress.IPv6Address(1)
671 v6net = ipaddress.IPv6Network(1)
672 v6intf = ipaddress.IPv6Interface(1)
673
674 v4_addresses = [v4addr, v4intf]
675 v4_objects = v4_addresses + [v4net]
676 v6_addresses = [v6addr, v6intf]
677 v6_objects = v6_addresses + [v6net]
R David Murray947ff382016-06-02 15:46:04 -0400678
Nick Coghlan3008ec02012-07-08 00:45:33 +1000679 objects = v4_objects + v6_objects
680
R David Murray947ff382016-06-02 15:46:04 -0400681 v4addr2 = ipaddress.IPv4Address(2)
682 v4net2 = ipaddress.IPv4Network(2)
683 v4intf2 = ipaddress.IPv4Interface(2)
684 v6addr2 = ipaddress.IPv6Address(2)
685 v6net2 = ipaddress.IPv6Network(2)
686 v6intf2 = ipaddress.IPv6Interface(2)
687
Nick Coghlan3008ec02012-07-08 00:45:33 +1000688 def test_foreign_type_equality(self):
689 # __eq__ should never raise TypeError directly
690 other = object()
691 for obj in self.objects:
692 self.assertNotEqual(obj, other)
693 self.assertFalse(obj == other)
694 self.assertEqual(obj.__eq__(other), NotImplemented)
695 self.assertEqual(obj.__ne__(other), NotImplemented)
696
697 def test_mixed_type_equality(self):
698 # Ensure none of the internal objects accidentally
699 # expose the right set of attributes to become "equal"
700 for lhs in self.objects:
701 for rhs in self.objects:
702 if lhs is rhs:
703 continue
704 self.assertNotEqual(lhs, rhs)
705
R David Murray947ff382016-06-02 15:46:04 -0400706 def test_same_type_equality(self):
707 for obj in self.objects:
708 self.assertEqual(obj, obj)
709 self.assertLessEqual(obj, obj)
710 self.assertGreaterEqual(obj, obj)
711
712 def test_same_type_ordering(self):
713 for lhs, rhs in (
714 (self.v4addr, self.v4addr2),
715 (self.v4net, self.v4net2),
716 (self.v4intf, self.v4intf2),
717 (self.v6addr, self.v6addr2),
718 (self.v6net, self.v6net2),
719 (self.v6intf, self.v6intf2),
720 ):
721 self.assertNotEqual(lhs, rhs)
722 self.assertLess(lhs, rhs)
723 self.assertLessEqual(lhs, rhs)
724 self.assertGreater(rhs, lhs)
725 self.assertGreaterEqual(rhs, lhs)
726 self.assertFalse(lhs > rhs)
727 self.assertFalse(rhs < lhs)
728 self.assertFalse(lhs >= rhs)
729 self.assertFalse(rhs <= lhs)
730
Nick Coghlan3008ec02012-07-08 00:45:33 +1000731 def test_containment(self):
732 for obj in self.v4_addresses:
733 self.assertIn(obj, self.v4net)
734 for obj in self.v6_addresses:
735 self.assertIn(obj, self.v6net)
736 for obj in self.v4_objects + [self.v6net]:
737 self.assertNotIn(obj, self.v6net)
738 for obj in self.v6_objects + [self.v4net]:
739 self.assertNotIn(obj, self.v4net)
740
741 def test_mixed_type_ordering(self):
742 for lhs in self.objects:
743 for rhs in self.objects:
744 if isinstance(lhs, type(rhs)) or isinstance(rhs, type(lhs)):
745 continue
746 self.assertRaises(TypeError, lambda: lhs < rhs)
747 self.assertRaises(TypeError, lambda: lhs > rhs)
748 self.assertRaises(TypeError, lambda: lhs <= rhs)
749 self.assertRaises(TypeError, lambda: lhs >= rhs)
750
Serhiy Storchakaf186e122015-01-26 10:11:16 +0200751 def test_foreign_type_ordering(self):
752 other = object()
753 smallest = SmallestObject()
754 largest = LargestObject()
755 for obj in self.objects:
756 with self.assertRaises(TypeError):
757 obj < other
758 with self.assertRaises(TypeError):
759 obj > other
760 with self.assertRaises(TypeError):
761 obj <= other
762 with self.assertRaises(TypeError):
763 obj >= other
764 self.assertTrue(obj < largest)
765 self.assertFalse(obj > largest)
766 self.assertTrue(obj <= largest)
767 self.assertFalse(obj >= largest)
768 self.assertFalse(obj < smallest)
769 self.assertTrue(obj > smallest)
770 self.assertFalse(obj <= smallest)
771 self.assertTrue(obj >= smallest)
772
Nick Coghlan3008ec02012-07-08 00:45:33 +1000773 def test_mixed_type_key(self):
774 # with get_mixed_type_key, you can sort addresses and network.
775 v4_ordered = [self.v4addr, self.v4net, self.v4intf]
776 v6_ordered = [self.v6addr, self.v6net, self.v6intf]
777 self.assertEqual(v4_ordered,
778 sorted(self.v4_objects,
779 key=ipaddress.get_mixed_type_key))
780 self.assertEqual(v6_ordered,
781 sorted(self.v6_objects,
782 key=ipaddress.get_mixed_type_key))
783 self.assertEqual(v4_ordered + v6_ordered,
784 sorted(self.objects,
785 key=ipaddress.get_mixed_type_key))
786 self.assertEqual(NotImplemented, ipaddress.get_mixed_type_key(object))
787
788 def test_incompatible_versions(self):
789 # These should always raise TypeError
790 v4addr = ipaddress.ip_address('1.1.1.1')
791 v4net = ipaddress.ip_network('1.1.1.1')
792 v6addr = ipaddress.ip_address('::1')
Serhiy Storchakaf186e122015-01-26 10:11:16 +0200793 v6net = ipaddress.ip_network('::1')
Nick Coghlan3008ec02012-07-08 00:45:33 +1000794
795 self.assertRaises(TypeError, v4addr.__lt__, v6addr)
796 self.assertRaises(TypeError, v4addr.__gt__, v6addr)
797 self.assertRaises(TypeError, v4net.__lt__, v6net)
798 self.assertRaises(TypeError, v4net.__gt__, v6net)
799
800 self.assertRaises(TypeError, v6addr.__lt__, v4addr)
801 self.assertRaises(TypeError, v6addr.__gt__, v4addr)
802 self.assertRaises(TypeError, v6net.__lt__, v4net)
803 self.assertRaises(TypeError, v6net.__gt__, v4net)
804
805
Nick Coghlandc9b2552012-05-20 21:01:57 +1000806class IpaddrUnitTest(unittest.TestCase):
807
808 def setUp(self):
809 self.ipv4_address = ipaddress.IPv4Address('1.2.3.4')
810 self.ipv4_interface = ipaddress.IPv4Interface('1.2.3.4/24')
811 self.ipv4_network = ipaddress.IPv4Network('1.2.3.0/24')
812 #self.ipv4_hostmask = ipaddress.IPv4Interface('10.0.0.1/0.255.255.255')
813 self.ipv6_address = ipaddress.IPv6Interface(
814 '2001:658:22a:cafe:200:0:0:1')
815 self.ipv6_interface = ipaddress.IPv6Interface(
816 '2001:658:22a:cafe:200:0:0:1/64')
817 self.ipv6_network = ipaddress.IPv6Network('2001:658:22a:cafe::/64')
818
819 def testRepr(self):
820 self.assertEqual("IPv4Interface('1.2.3.4/32')",
821 repr(ipaddress.IPv4Interface('1.2.3.4')))
822 self.assertEqual("IPv6Interface('::1/128')",
823 repr(ipaddress.IPv6Interface('::1')))
824
Martin Panter204bf0b2016-07-11 07:51:37 +0000825 # issue #16531: constructing IPv4Network from an (address, mask) tuple
Antoine Pitrou5fb195f2014-05-12 20:36:46 +0200826 def testIPv4Tuple(self):
827 # /32
828 ip = ipaddress.IPv4Address('192.0.2.1')
829 net = ipaddress.IPv4Network('192.0.2.1/32')
830 self.assertEqual(ipaddress.IPv4Network(('192.0.2.1', 32)), net)
831 self.assertEqual(ipaddress.IPv4Network((ip, 32)), net)
832 self.assertEqual(ipaddress.IPv4Network((3221225985, 32)), net)
833 self.assertEqual(ipaddress.IPv4Network(('192.0.2.1',
834 '255.255.255.255')), net)
835 self.assertEqual(ipaddress.IPv4Network((ip,
836 '255.255.255.255')), net)
837 self.assertEqual(ipaddress.IPv4Network((3221225985,
838 '255.255.255.255')), net)
839 # strict=True and host bits set
840 with self.assertRaises(ValueError):
841 ipaddress.IPv4Network(('192.0.2.1', 24))
842 with self.assertRaises(ValueError):
843 ipaddress.IPv4Network((ip, 24))
844 with self.assertRaises(ValueError):
845 ipaddress.IPv4Network((3221225985, 24))
846 with self.assertRaises(ValueError):
847 ipaddress.IPv4Network(('192.0.2.1', '255.255.255.0'))
848 with self.assertRaises(ValueError):
849 ipaddress.IPv4Network((ip, '255.255.255.0'))
850 with self.assertRaises(ValueError):
851 ipaddress.IPv4Network((3221225985, '255.255.255.0'))
852 # strict=False and host bits set
853 net = ipaddress.IPv4Network('192.0.2.0/24')
854 self.assertEqual(ipaddress.IPv4Network(('192.0.2.1', 24),
855 strict=False), net)
856 self.assertEqual(ipaddress.IPv4Network((ip, 24),
857 strict=False), net)
858 self.assertEqual(ipaddress.IPv4Network((3221225985, 24),
859 strict=False), net)
860 self.assertEqual(ipaddress.IPv4Network(('192.0.2.1',
861 '255.255.255.0'),
862 strict=False), net)
863 self.assertEqual(ipaddress.IPv4Network((ip,
864 '255.255.255.0'),
865 strict=False), net)
866 self.assertEqual(ipaddress.IPv4Network((3221225985,
867 '255.255.255.0'),
868 strict=False), net)
869
870 # /24
871 ip = ipaddress.IPv4Address('192.0.2.0')
872 net = ipaddress.IPv4Network('192.0.2.0/24')
873 self.assertEqual(ipaddress.IPv4Network(('192.0.2.0',
874 '255.255.255.0')), net)
875 self.assertEqual(ipaddress.IPv4Network((ip,
876 '255.255.255.0')), net)
877 self.assertEqual(ipaddress.IPv4Network((3221225984,
878 '255.255.255.0')), net)
879 self.assertEqual(ipaddress.IPv4Network(('192.0.2.0', 24)), net)
880 self.assertEqual(ipaddress.IPv4Network((ip, 24)), net)
881 self.assertEqual(ipaddress.IPv4Network((3221225984, 24)), net)
882
883 self.assertEqual(ipaddress.IPv4Interface(('192.0.2.1', 24)),
884 ipaddress.IPv4Interface('192.0.2.1/24'))
885 self.assertEqual(ipaddress.IPv4Interface((3221225985, 24)),
886 ipaddress.IPv4Interface('192.0.2.1/24'))
887
Martin Panter204bf0b2016-07-11 07:51:37 +0000888 # issue #16531: constructing IPv6Network from an (address, mask) tuple
Antoine Pitrou5fb195f2014-05-12 20:36:46 +0200889 def testIPv6Tuple(self):
890 # /128
891 ip = ipaddress.IPv6Address('2001:db8::')
892 net = ipaddress.IPv6Network('2001:db8::/128')
893 self.assertEqual(ipaddress.IPv6Network(('2001:db8::', '128')),
894 net)
895 self.assertEqual(ipaddress.IPv6Network(
896 (42540766411282592856903984951653826560, 128)),
897 net)
898 self.assertEqual(ipaddress.IPv6Network((ip, '128')),
899 net)
900 ip = ipaddress.IPv6Address('2001:db8::')
901 net = ipaddress.IPv6Network('2001:db8::/96')
902 self.assertEqual(ipaddress.IPv6Network(('2001:db8::', '96')),
903 net)
904 self.assertEqual(ipaddress.IPv6Network(
905 (42540766411282592856903984951653826560, 96)),
906 net)
907 self.assertEqual(ipaddress.IPv6Network((ip, '96')),
908 net)
909
910 # strict=True and host bits set
911 ip = ipaddress.IPv6Address('2001:db8::1')
912 with self.assertRaises(ValueError):
913 ipaddress.IPv6Network(('2001:db8::1', 96))
914 with self.assertRaises(ValueError):
915 ipaddress.IPv6Network((
916 42540766411282592856903984951653826561, 96))
917 with self.assertRaises(ValueError):
918 ipaddress.IPv6Network((ip, 96))
919 # strict=False and host bits set
920 net = ipaddress.IPv6Network('2001:db8::/96')
921 self.assertEqual(ipaddress.IPv6Network(('2001:db8::1', 96),
922 strict=False),
923 net)
924 self.assertEqual(ipaddress.IPv6Network(
925 (42540766411282592856903984951653826561, 96),
926 strict=False),
927 net)
928 self.assertEqual(ipaddress.IPv6Network((ip, 96), strict=False),
929 net)
930
931 # /96
932 self.assertEqual(ipaddress.IPv6Interface(('2001:db8::1', '96')),
933 ipaddress.IPv6Interface('2001:db8::1/96'))
934 self.assertEqual(ipaddress.IPv6Interface(
935 (42540766411282592856903984951653826561, '96')),
936 ipaddress.IPv6Interface('2001:db8::1/96'))
937
Nick Coghlandc9b2552012-05-20 21:01:57 +1000938 # issue57
939 def testAddressIntMath(self):
940 self.assertEqual(ipaddress.IPv4Address('1.1.1.1') + 255,
941 ipaddress.IPv4Address('1.1.2.0'))
942 self.assertEqual(ipaddress.IPv4Address('1.1.1.1') - 256,
943 ipaddress.IPv4Address('1.1.0.1'))
944 self.assertEqual(ipaddress.IPv6Address('::1') + (2**16 - 2),
945 ipaddress.IPv6Address('::ffff'))
946 self.assertEqual(ipaddress.IPv6Address('::ffff') - (2**16 - 2),
947 ipaddress.IPv6Address('::1'))
948
Nick Coghlan3c2570c2012-07-07 01:13:55 +1000949 def testInvalidIntToBytes(self):
950 self.assertRaises(ValueError, ipaddress.v4_int_to_packed, -1)
951 self.assertRaises(ValueError, ipaddress.v4_int_to_packed,
952 2 ** ipaddress.IPV4LENGTH)
953 self.assertRaises(ValueError, ipaddress.v6_int_to_packed, -1)
954 self.assertRaises(ValueError, ipaddress.v6_int_to_packed,
955 2 ** ipaddress.IPV6LENGTH)
956
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200957 def testInternals(self):
Serhiy Storchakab53f0fb2015-01-19 00:41:32 +0200958 ip1 = ipaddress.IPv4Address('10.10.10.10')
959 ip2 = ipaddress.IPv4Address('10.10.10.11')
960 ip3 = ipaddress.IPv4Address('10.10.10.12')
961 self.assertEqual(list(ipaddress._find_address_range([ip1])),
962 [(ip1, ip1)])
963 self.assertEqual(list(ipaddress._find_address_range([ip1, ip3])),
964 [(ip1, ip1), (ip3, ip3)])
965 self.assertEqual(list(ipaddress._find_address_range([ip1, ip2, ip3])),
966 [(ip1, ip3)])
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200967 self.assertEqual(128, ipaddress._count_righthand_zero_bits(0, 128))
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200968 self.assertEqual("IPv4Network('1.2.3.0/24')", repr(self.ipv4_network))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000969
Nick Coghland9722652012-06-17 16:33:00 +1000970 def testMissingNetworkVersion(self):
971 class Broken(ipaddress._BaseNetwork):
972 pass
973 broken = Broken('127.0.0.1')
974 with self.assertRaisesRegex(NotImplementedError, "Broken.*version"):
975 broken.version
976
977 def testMissingAddressClass(self):
978 class Broken(ipaddress._BaseNetwork):
979 pass
980 broken = Broken('127.0.0.1')
981 with self.assertRaisesRegex(NotImplementedError, "Broken.*address"):
982 broken._address_class
983
Nick Coghlandc9b2552012-05-20 21:01:57 +1000984 def testGetNetwork(self):
985 self.assertEqual(int(self.ipv4_network.network_address), 16909056)
986 self.assertEqual(str(self.ipv4_network.network_address), '1.2.3.0')
987
988 self.assertEqual(int(self.ipv6_network.network_address),
989 42540616829182469433403647294022090752)
990 self.assertEqual(str(self.ipv6_network.network_address),
991 '2001:658:22a:cafe::')
992 self.assertEqual(str(self.ipv6_network.hostmask),
993 '::ffff:ffff:ffff:ffff')
994
Nick Coghlandc9b2552012-05-20 21:01:57 +1000995 def testIpFromInt(self):
996 self.assertEqual(self.ipv4_interface._ip,
997 ipaddress.IPv4Interface(16909060)._ip)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000998
999 ipv4 = ipaddress.ip_network('1.2.3.4')
1000 ipv6 = ipaddress.ip_network('2001:658:22a:cafe:200:0:0:1')
Nick Coghlan730f67f2012-08-05 22:02:18 +10001001 self.assertEqual(ipv4, ipaddress.ip_network(int(ipv4.network_address)))
1002 self.assertEqual(ipv6, ipaddress.ip_network(int(ipv6.network_address)))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001003
1004 v6_int = 42540616829182469433547762482097946625
1005 self.assertEqual(self.ipv6_interface._ip,
1006 ipaddress.IPv6Interface(v6_int)._ip)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001007
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001008 self.assertEqual(ipaddress.ip_network(self.ipv4_address._ip).version,
1009 4)
1010 self.assertEqual(ipaddress.ip_network(self.ipv6_address._ip).version,
1011 6)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001012
1013 def testIpFromPacked(self):
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001014 address = ipaddress.ip_address
Nick Coghlandc9b2552012-05-20 21:01:57 +10001015 self.assertEqual(self.ipv4_interface._ip,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001016 ipaddress.ip_interface(b'\x01\x02\x03\x04')._ip)
1017 self.assertEqual(address('255.254.253.252'),
1018 address(b'\xff\xfe\xfd\xfc'))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001019 self.assertEqual(self.ipv6_interface.ip,
1020 ipaddress.ip_interface(
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001021 b'\x20\x01\x06\x58\x02\x2a\xca\xfe'
1022 b'\x02\x00\x00\x00\x00\x00\x00\x01').ip)
1023 self.assertEqual(address('ffff:2:3:4:ffff::'),
1024 address(b'\xff\xff\x00\x02\x00\x03\x00\x04' +
1025 b'\xff\xff' + b'\x00' * 6))
1026 self.assertEqual(address('::'),
1027 address(b'\x00' * 16))
1028
Nick Coghlandc9b2552012-05-20 21:01:57 +10001029 def testGetIp(self):
1030 self.assertEqual(int(self.ipv4_interface.ip), 16909060)
1031 self.assertEqual(str(self.ipv4_interface.ip), '1.2.3.4')
1032
1033 self.assertEqual(int(self.ipv6_interface.ip),
1034 42540616829182469433547762482097946625)
1035 self.assertEqual(str(self.ipv6_interface.ip),
1036 '2001:658:22a:cafe:200::1')
1037
1038 def testGetNetmask(self):
1039 self.assertEqual(int(self.ipv4_network.netmask), 4294967040)
1040 self.assertEqual(str(self.ipv4_network.netmask), '255.255.255.0')
1041 self.assertEqual(int(self.ipv6_network.netmask),
1042 340282366920938463444927863358058659840)
1043 self.assertEqual(self.ipv6_network.prefixlen, 64)
1044
1045 def testZeroNetmask(self):
1046 ipv4_zero_netmask = ipaddress.IPv4Interface('1.2.3.4/0')
1047 self.assertEqual(int(ipv4_zero_netmask.network.netmask), 0)
Nick Coghlan932346f2014-02-08 23:17:36 +10001048 self.assertEqual(ipv4_zero_netmask._prefix_from_prefix_string('0'), 0)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001049 self.assertTrue(ipv4_zero_netmask._is_valid_netmask('0'))
1050 self.assertTrue(ipv4_zero_netmask._is_valid_netmask('0.0.0.0'))
1051 self.assertFalse(ipv4_zero_netmask._is_valid_netmask('invalid'))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001052
1053 ipv6_zero_netmask = ipaddress.IPv6Interface('::1/0')
1054 self.assertEqual(int(ipv6_zero_netmask.network.netmask), 0)
Nick Coghlan932346f2014-02-08 23:17:36 +10001055 self.assertEqual(ipv6_zero_netmask._prefix_from_prefix_string('0'), 0)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001056
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001057 def testIPv4NetAndHostmasks(self):
1058 net = self.ipv4_network
1059 self.assertFalse(net._is_valid_netmask('invalid'))
1060 self.assertTrue(net._is_valid_netmask('128.128.128.128'))
1061 self.assertFalse(net._is_valid_netmask('128.128.128.127'))
1062 self.assertFalse(net._is_valid_netmask('128.128.128.255'))
1063 self.assertTrue(net._is_valid_netmask('255.128.128.128'))
1064
1065 self.assertFalse(net._is_hostmask('invalid'))
1066 self.assertTrue(net._is_hostmask('128.255.255.255'))
1067 self.assertFalse(net._is_hostmask('255.255.255.255'))
1068 self.assertFalse(net._is_hostmask('1.2.3.4'))
1069
1070 net = ipaddress.IPv4Network('127.0.0.0/0.0.0.255')
Nick Coghlan932346f2014-02-08 23:17:36 +10001071 self.assertEqual(net.prefixlen, 24)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001072
Nick Coghlandc9b2552012-05-20 21:01:57 +10001073 def testGetBroadcast(self):
1074 self.assertEqual(int(self.ipv4_network.broadcast_address), 16909311)
1075 self.assertEqual(str(self.ipv4_network.broadcast_address), '1.2.3.255')
1076
1077 self.assertEqual(int(self.ipv6_network.broadcast_address),
1078 42540616829182469451850391367731642367)
1079 self.assertEqual(str(self.ipv6_network.broadcast_address),
1080 '2001:658:22a:cafe:ffff:ffff:ffff:ffff')
1081
1082 def testGetPrefixlen(self):
Nick Coghlane3ded952012-08-05 22:45:22 +10001083 self.assertEqual(self.ipv4_interface.network.prefixlen, 24)
1084 self.assertEqual(self.ipv6_interface.network.prefixlen, 64)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001085
1086 def testGetSupernet(self):
1087 self.assertEqual(self.ipv4_network.supernet().prefixlen, 23)
1088 self.assertEqual(str(self.ipv4_network.supernet().network_address),
1089 '1.2.2.0')
1090 self.assertEqual(
1091 ipaddress.IPv4Interface('0.0.0.0/0').network.supernet(),
1092 ipaddress.IPv4Network('0.0.0.0/0'))
1093
1094 self.assertEqual(self.ipv6_network.supernet().prefixlen, 63)
1095 self.assertEqual(str(self.ipv6_network.supernet().network_address),
1096 '2001:658:22a:cafe::')
1097 self.assertEqual(ipaddress.IPv6Interface('::0/0').network.supernet(),
1098 ipaddress.IPv6Network('::0/0'))
1099
1100 def testGetSupernet3(self):
1101 self.assertEqual(self.ipv4_network.supernet(3).prefixlen, 21)
1102 self.assertEqual(str(self.ipv4_network.supernet(3).network_address),
1103 '1.2.0.0')
1104
1105 self.assertEqual(self.ipv6_network.supernet(3).prefixlen, 61)
1106 self.assertEqual(str(self.ipv6_network.supernet(3).network_address),
1107 '2001:658:22a:caf8::')
1108
1109 def testGetSupernet4(self):
1110 self.assertRaises(ValueError, self.ipv4_network.supernet,
1111 prefixlen_diff=2, new_prefix=1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001112 self.assertRaises(ValueError, self.ipv4_network.supernet,
1113 new_prefix=25)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001114 self.assertEqual(self.ipv4_network.supernet(prefixlen_diff=2),
1115 self.ipv4_network.supernet(new_prefix=22))
1116
1117 self.assertRaises(ValueError, self.ipv6_network.supernet,
1118 prefixlen_diff=2, new_prefix=1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001119 self.assertRaises(ValueError, self.ipv6_network.supernet,
1120 new_prefix=65)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001121 self.assertEqual(self.ipv6_network.supernet(prefixlen_diff=2),
1122 self.ipv6_network.supernet(new_prefix=62))
1123
1124 def testHosts(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001125 hosts = list(self.ipv4_network.hosts())
1126 self.assertEqual(254, len(hosts))
1127 self.assertEqual(ipaddress.IPv4Address('1.2.3.1'), hosts[0])
1128 self.assertEqual(ipaddress.IPv4Address('1.2.3.254'), hosts[-1])
1129
Xiang Zhang10b134a2018-03-21 08:25:13 +08001130 ipv6_network = ipaddress.IPv6Network('2001:658:22a:cafe::/120')
1131 hosts = list(ipv6_network.hosts())
1132 self.assertEqual(255, len(hosts))
1133 self.assertEqual(ipaddress.IPv6Address('2001:658:22a:cafe::1'), hosts[0])
1134 self.assertEqual(ipaddress.IPv6Address('2001:658:22a:cafe::ff'), hosts[-1])
1135
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001136 # special case where only 1 bit is left for address
Xiang Zhang10b134a2018-03-21 08:25:13 +08001137 addrs = [ipaddress.IPv4Address('2.0.0.0'),
1138 ipaddress.IPv4Address('2.0.0.1')]
1139 str_args = '2.0.0.0/31'
1140 tpl_args = ('2.0.0.0', 31)
1141 self.assertEqual(addrs, list(ipaddress.ip_network(str_args).hosts()))
1142 self.assertEqual(addrs, list(ipaddress.ip_network(tpl_args).hosts()))
1143 self.assertEqual(list(ipaddress.ip_network(str_args).hosts()),
1144 list(ipaddress.ip_network(tpl_args).hosts()))
1145
1146 addrs = [ipaddress.IPv6Address('2001:658:22a:cafe::'),
1147 ipaddress.IPv6Address('2001:658:22a:cafe::1')]
1148 str_args = '2001:658:22a:cafe::/127'
1149 tpl_args = ('2001:658:22a:cafe::', 127)
1150 self.assertEqual(addrs, list(ipaddress.ip_network(str_args).hosts()))
1151 self.assertEqual(addrs, list(ipaddress.ip_network(tpl_args).hosts()))
1152 self.assertEqual(list(ipaddress.ip_network(str_args).hosts()),
1153 list(ipaddress.ip_network(tpl_args).hosts()))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001154
1155 def testFancySubnetting(self):
1156 self.assertEqual(sorted(self.ipv4_network.subnets(prefixlen_diff=3)),
1157 sorted(self.ipv4_network.subnets(new_prefix=27)))
1158 self.assertRaises(ValueError, list,
1159 self.ipv4_network.subnets(new_prefix=23))
1160 self.assertRaises(ValueError, list,
1161 self.ipv4_network.subnets(prefixlen_diff=3,
1162 new_prefix=27))
1163 self.assertEqual(sorted(self.ipv6_network.subnets(prefixlen_diff=4)),
1164 sorted(self.ipv6_network.subnets(new_prefix=68)))
1165 self.assertRaises(ValueError, list,
1166 self.ipv6_network.subnets(new_prefix=63))
1167 self.assertRaises(ValueError, list,
1168 self.ipv6_network.subnets(prefixlen_diff=4,
1169 new_prefix=68))
1170
1171 def testGetSubnets(self):
1172 self.assertEqual(list(self.ipv4_network.subnets())[0].prefixlen, 25)
1173 self.assertEqual(str(list(
1174 self.ipv4_network.subnets())[0].network_address),
1175 '1.2.3.0')
1176 self.assertEqual(str(list(
1177 self.ipv4_network.subnets())[1].network_address),
1178 '1.2.3.128')
1179
1180 self.assertEqual(list(self.ipv6_network.subnets())[0].prefixlen, 65)
1181
1182 def testGetSubnetForSingle32(self):
1183 ip = ipaddress.IPv4Network('1.2.3.4/32')
1184 subnets1 = [str(x) for x in ip.subnets()]
1185 subnets2 = [str(x) for x in ip.subnets(2)]
1186 self.assertEqual(subnets1, ['1.2.3.4/32'])
1187 self.assertEqual(subnets1, subnets2)
1188
1189 def testGetSubnetForSingle128(self):
1190 ip = ipaddress.IPv6Network('::1/128')
1191 subnets1 = [str(x) for x in ip.subnets()]
1192 subnets2 = [str(x) for x in ip.subnets(2)]
1193 self.assertEqual(subnets1, ['::1/128'])
1194 self.assertEqual(subnets1, subnets2)
1195
1196 def testSubnet2(self):
1197 ips = [str(x) for x in self.ipv4_network.subnets(2)]
1198 self.assertEqual(
1199 ips,
1200 ['1.2.3.0/26', '1.2.3.64/26', '1.2.3.128/26', '1.2.3.192/26'])
1201
1202 ipsv6 = [str(x) for x in self.ipv6_network.subnets(2)]
1203 self.assertEqual(
1204 ipsv6,
1205 ['2001:658:22a:cafe::/66',
1206 '2001:658:22a:cafe:4000::/66',
1207 '2001:658:22a:cafe:8000::/66',
1208 '2001:658:22a:cafe:c000::/66'])
1209
Serhiy Storchakabb0dbd52016-03-01 10:25:45 +02001210 def testGetSubnets3(self):
1211 subnets = [str(x) for x in self.ipv4_network.subnets(8)]
1212 self.assertEqual(subnets[:3],
1213 ['1.2.3.0/32', '1.2.3.1/32', '1.2.3.2/32'])
1214 self.assertEqual(subnets[-3:],
1215 ['1.2.3.253/32', '1.2.3.254/32', '1.2.3.255/32'])
1216 self.assertEqual(len(subnets), 256)
1217
1218 ipv6_network = ipaddress.IPv6Network('2001:658:22a:cafe::/120')
1219 subnets = [str(x) for x in ipv6_network.subnets(8)]
1220 self.assertEqual(subnets[:3],
1221 ['2001:658:22a:cafe::/128',
1222 '2001:658:22a:cafe::1/128',
1223 '2001:658:22a:cafe::2/128'])
1224 self.assertEqual(subnets[-3:],
1225 ['2001:658:22a:cafe::fd/128',
1226 '2001:658:22a:cafe::fe/128',
1227 '2001:658:22a:cafe::ff/128'])
1228 self.assertEqual(len(subnets), 256)
1229
Nick Coghlandc9b2552012-05-20 21:01:57 +10001230 def testSubnetFailsForLargeCidrDiff(self):
1231 self.assertRaises(ValueError, list,
1232 self.ipv4_interface.network.subnets(9))
1233 self.assertRaises(ValueError, list,
1234 self.ipv4_network.subnets(9))
1235 self.assertRaises(ValueError, list,
1236 self.ipv6_interface.network.subnets(65))
1237 self.assertRaises(ValueError, list,
1238 self.ipv6_network.subnets(65))
1239
1240 def testSupernetFailsForLargeCidrDiff(self):
1241 self.assertRaises(ValueError,
1242 self.ipv4_interface.network.supernet, 25)
1243 self.assertRaises(ValueError,
1244 self.ipv6_interface.network.supernet, 65)
1245
1246 def testSubnetFailsForNegativeCidrDiff(self):
1247 self.assertRaises(ValueError, list,
1248 self.ipv4_interface.network.subnets(-1))
1249 self.assertRaises(ValueError, list,
Nick Coghlan2c589102012-05-27 01:03:25 +10001250 self.ipv4_network.subnets(-1))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001251 self.assertRaises(ValueError, list,
1252 self.ipv6_interface.network.subnets(-1))
1253 self.assertRaises(ValueError, list,
1254 self.ipv6_network.subnets(-1))
1255
1256 def testGetNum_Addresses(self):
1257 self.assertEqual(self.ipv4_network.num_addresses, 256)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001258 self.assertEqual(list(self.ipv4_network.subnets())[0].num_addresses,
1259 128)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001260 self.assertEqual(self.ipv4_network.supernet().num_addresses, 512)
1261
1262 self.assertEqual(self.ipv6_network.num_addresses, 18446744073709551616)
1263 self.assertEqual(list(self.ipv6_network.subnets())[0].num_addresses,
1264 9223372036854775808)
1265 self.assertEqual(self.ipv6_network.supernet().num_addresses,
1266 36893488147419103232)
1267
1268 def testContains(self):
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001269 self.assertIn(ipaddress.IPv4Interface('1.2.3.128/25'),
1270 self.ipv4_network)
1271 self.assertNotIn(ipaddress.IPv4Interface('1.2.4.1/24'),
Nick Coghlandc9b2552012-05-20 21:01:57 +10001272 self.ipv4_network)
1273 # We can test addresses and string as well.
1274 addr1 = ipaddress.IPv4Address('1.2.3.37')
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001275 self.assertIn(addr1, self.ipv4_network)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001276 # issue 61, bad network comparison on like-ip'd network objects
1277 # with identical broadcast addresses.
1278 self.assertFalse(ipaddress.IPv4Network('1.1.0.0/16').__contains__(
1279 ipaddress.IPv4Network('1.0.0.0/15')))
1280
Nick Coghlandc9b2552012-05-20 21:01:57 +10001281 def testNth(self):
1282 self.assertEqual(str(self.ipv4_network[5]), '1.2.3.5')
1283 self.assertRaises(IndexError, self.ipv4_network.__getitem__, 256)
1284
1285 self.assertEqual(str(self.ipv6_network[5]),
1286 '2001:658:22a:cafe::5')
Berker Peksag28dc1182016-06-11 22:30:05 +03001287 self.assertRaises(IndexError, self.ipv6_network.__getitem__, 1 << 64)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001288
1289 def testGetitem(self):
1290 # http://code.google.com/p/ipaddr-py/issues/detail?id=15
1291 addr = ipaddress.IPv4Network('172.31.255.128/255.255.255.240')
1292 self.assertEqual(28, addr.prefixlen)
1293 addr_list = list(addr)
1294 self.assertEqual('172.31.255.128', str(addr_list[0]))
1295 self.assertEqual('172.31.255.128', str(addr[0]))
1296 self.assertEqual('172.31.255.143', str(addr_list[-1]))
1297 self.assertEqual('172.31.255.143', str(addr[-1]))
1298 self.assertEqual(addr_list[-1], addr[-1])
1299
1300 def testEqual(self):
1301 self.assertTrue(self.ipv4_interface ==
1302 ipaddress.IPv4Interface('1.2.3.4/24'))
1303 self.assertFalse(self.ipv4_interface ==
1304 ipaddress.IPv4Interface('1.2.3.4/23'))
1305 self.assertFalse(self.ipv4_interface ==
1306 ipaddress.IPv6Interface('::1.2.3.4/24'))
1307 self.assertFalse(self.ipv4_interface == '')
1308 self.assertFalse(self.ipv4_interface == [])
1309 self.assertFalse(self.ipv4_interface == 2)
1310
1311 self.assertTrue(self.ipv6_interface ==
1312 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/64'))
1313 self.assertFalse(self.ipv6_interface ==
1314 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/63'))
1315 self.assertFalse(self.ipv6_interface ==
1316 ipaddress.IPv4Interface('1.2.3.4/23'))
1317 self.assertFalse(self.ipv6_interface == '')
1318 self.assertFalse(self.ipv6_interface == [])
1319 self.assertFalse(self.ipv6_interface == 2)
1320
1321 def testNotEqual(self):
1322 self.assertFalse(self.ipv4_interface !=
1323 ipaddress.IPv4Interface('1.2.3.4/24'))
1324 self.assertTrue(self.ipv4_interface !=
1325 ipaddress.IPv4Interface('1.2.3.4/23'))
1326 self.assertTrue(self.ipv4_interface !=
1327 ipaddress.IPv6Interface('::1.2.3.4/24'))
1328 self.assertTrue(self.ipv4_interface != '')
1329 self.assertTrue(self.ipv4_interface != [])
1330 self.assertTrue(self.ipv4_interface != 2)
1331
1332 self.assertTrue(self.ipv4_address !=
1333 ipaddress.IPv4Address('1.2.3.5'))
1334 self.assertTrue(self.ipv4_address != '')
1335 self.assertTrue(self.ipv4_address != [])
1336 self.assertTrue(self.ipv4_address != 2)
1337
1338 self.assertFalse(self.ipv6_interface !=
1339 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/64'))
1340 self.assertTrue(self.ipv6_interface !=
1341 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/63'))
1342 self.assertTrue(self.ipv6_interface !=
1343 ipaddress.IPv4Interface('1.2.3.4/23'))
1344 self.assertTrue(self.ipv6_interface != '')
1345 self.assertTrue(self.ipv6_interface != [])
1346 self.assertTrue(self.ipv6_interface != 2)
1347
1348 self.assertTrue(self.ipv6_address !=
1349 ipaddress.IPv4Address('1.2.3.4'))
1350 self.assertTrue(self.ipv6_address != '')
1351 self.assertTrue(self.ipv6_address != [])
1352 self.assertTrue(self.ipv6_address != 2)
1353
1354 def testSlash32Constructor(self):
1355 self.assertEqual(str(ipaddress.IPv4Interface(
1356 '1.2.3.4/255.255.255.255')), '1.2.3.4/32')
1357
1358 def testSlash128Constructor(self):
1359 self.assertEqual(str(ipaddress.IPv6Interface('::1/128')),
1360 '::1/128')
1361
1362 def testSlash0Constructor(self):
1363 self.assertEqual(str(ipaddress.IPv4Interface('1.2.3.4/0.0.0.0')),
1364 '1.2.3.4/0')
1365
1366 def testCollapsing(self):
1367 # test only IP addresses including some duplicates
1368 ip1 = ipaddress.IPv4Address('1.1.1.0')
1369 ip2 = ipaddress.IPv4Address('1.1.1.1')
1370 ip3 = ipaddress.IPv4Address('1.1.1.2')
1371 ip4 = ipaddress.IPv4Address('1.1.1.3')
1372 ip5 = ipaddress.IPv4Address('1.1.1.4')
1373 ip6 = ipaddress.IPv4Address('1.1.1.0')
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07001374 # check that addresses are subsumed properly.
Nick Coghlandc9b2552012-05-20 21:01:57 +10001375 collapsed = ipaddress.collapse_addresses(
1376 [ip1, ip2, ip3, ip4, ip5, ip6])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001377 self.assertEqual(list(collapsed),
1378 [ipaddress.IPv4Network('1.1.1.0/30'),
1379 ipaddress.IPv4Network('1.1.1.4/32')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001380
1381 # test a mix of IP addresses and networks including some duplicates
1382 ip1 = ipaddress.IPv4Address('1.1.1.0')
1383 ip2 = ipaddress.IPv4Address('1.1.1.1')
1384 ip3 = ipaddress.IPv4Address('1.1.1.2')
1385 ip4 = ipaddress.IPv4Address('1.1.1.3')
1386 #ip5 = ipaddress.IPv4Interface('1.1.1.4/30')
1387 #ip6 = ipaddress.IPv4Interface('1.1.1.4/30')
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07001388 # check that addresses are subsumed properly.
Nick Coghlandc9b2552012-05-20 21:01:57 +10001389 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3, ip4])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001390 self.assertEqual(list(collapsed),
1391 [ipaddress.IPv4Network('1.1.1.0/30')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001392
1393 # test only IP networks
1394 ip1 = ipaddress.IPv4Network('1.1.0.0/24')
1395 ip2 = ipaddress.IPv4Network('1.1.1.0/24')
1396 ip3 = ipaddress.IPv4Network('1.1.2.0/24')
1397 ip4 = ipaddress.IPv4Network('1.1.3.0/24')
1398 ip5 = ipaddress.IPv4Network('1.1.4.0/24')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001399 # stored in no particular order b/c we want CollapseAddr to call
1400 # [].sort
Nick Coghlandc9b2552012-05-20 21:01:57 +10001401 ip6 = ipaddress.IPv4Network('1.1.0.0/22')
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07001402 # check that addresses are subsumed properly.
Nick Coghlandc9b2552012-05-20 21:01:57 +10001403 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3, ip4, ip5,
1404 ip6])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001405 self.assertEqual(list(collapsed),
1406 [ipaddress.IPv4Network('1.1.0.0/22'),
1407 ipaddress.IPv4Network('1.1.4.0/24')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001408
1409 # test that two addresses are supernet'ed properly
1410 collapsed = ipaddress.collapse_addresses([ip1, ip2])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001411 self.assertEqual(list(collapsed),
1412 [ipaddress.IPv4Network('1.1.0.0/23')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001413
1414 # test same IP networks
1415 ip_same1 = ip_same2 = ipaddress.IPv4Network('1.1.1.1/32')
1416 self.assertEqual(list(ipaddress.collapse_addresses(
1417 [ip_same1, ip_same2])),
1418 [ip_same1])
1419
1420 # test same IP addresses
1421 ip_same1 = ip_same2 = ipaddress.IPv4Address('1.1.1.1')
1422 self.assertEqual(list(ipaddress.collapse_addresses(
1423 [ip_same1, ip_same2])),
1424 [ipaddress.ip_network('1.1.1.1/32')])
1425 ip1 = ipaddress.IPv6Network('2001::/100')
1426 ip2 = ipaddress.IPv6Network('2001::/120')
1427 ip3 = ipaddress.IPv6Network('2001::/96')
1428 # test that ipv6 addresses are subsumed properly.
1429 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3])
1430 self.assertEqual(list(collapsed), [ip3])
1431
1432 # the toejam test
Hynek Schlawack35db5132012-06-01 20:12:17 +02001433 addr_tuples = [
1434 (ipaddress.ip_address('1.1.1.1'),
1435 ipaddress.ip_address('::1')),
1436 (ipaddress.IPv4Network('1.1.0.0/24'),
1437 ipaddress.IPv6Network('2001::/120')),
1438 (ipaddress.IPv4Network('1.1.0.0/32'),
1439 ipaddress.IPv6Network('2001::/128')),
1440 ]
1441 for ip1, ip2 in addr_tuples:
1442 self.assertRaises(TypeError, ipaddress.collapse_addresses,
1443 [ip1, ip2])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001444
1445 def testSummarizing(self):
1446 #ip = ipaddress.ip_address
1447 #ipnet = ipaddress.ip_network
1448 summarize = ipaddress.summarize_address_range
1449 ip1 = ipaddress.ip_address('1.1.1.0')
1450 ip2 = ipaddress.ip_address('1.1.1.255')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001451
1452 # summarize works only for IPv4 & IPv6
1453 class IPv7Address(ipaddress.IPv6Address):
1454 @property
1455 def version(self):
1456 return 7
1457 ip_invalid1 = IPv7Address('::1')
1458 ip_invalid2 = IPv7Address('::1')
1459 self.assertRaises(ValueError, list,
1460 summarize(ip_invalid1, ip_invalid2))
1461 # test that a summary over ip4 & ip6 fails
1462 self.assertRaises(TypeError, list,
1463 summarize(ip1, ipaddress.IPv6Address('::1')))
1464 # test a /24 is summarized properly
Nick Coghlandc9b2552012-05-20 21:01:57 +10001465 self.assertEqual(list(summarize(ip1, ip2))[0],
1466 ipaddress.ip_network('1.1.1.0/24'))
Martin Panter7462b6492015-11-02 03:37:02 +00001467 # test an IPv4 range that isn't on a network byte boundary
Nick Coghlandc9b2552012-05-20 21:01:57 +10001468 ip2 = ipaddress.ip_address('1.1.1.8')
1469 self.assertEqual(list(summarize(ip1, ip2)),
1470 [ipaddress.ip_network('1.1.1.0/29'),
1471 ipaddress.ip_network('1.1.1.8')])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001472 # all!
1473 ip1 = ipaddress.IPv4Address(0)
1474 ip2 = ipaddress.IPv4Address(ipaddress.IPv4Address._ALL_ONES)
1475 self.assertEqual([ipaddress.IPv4Network('0.0.0.0/0')],
1476 list(summarize(ip1, ip2)))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001477
1478 ip1 = ipaddress.ip_address('1::')
1479 ip2 = ipaddress.ip_address('1:ffff:ffff:ffff:ffff:ffff:ffff:ffff')
Martin Panter7462b6492015-11-02 03:37:02 +00001480 # test an IPv6 is summarized properly
Nick Coghlandc9b2552012-05-20 21:01:57 +10001481 self.assertEqual(list(summarize(ip1, ip2))[0],
1482 ipaddress.ip_network('1::/16'))
1483 # test an IPv6 range that isn't on a network byte boundary
1484 ip2 = ipaddress.ip_address('2::')
1485 self.assertEqual(list(summarize(ip1, ip2)),
1486 [ipaddress.ip_network('1::/16'),
1487 ipaddress.ip_network('2::/128')])
1488
1489 # test exception raised when first is greater than last
1490 self.assertRaises(ValueError, list,
1491 summarize(ipaddress.ip_address('1.1.1.0'),
1492 ipaddress.ip_address('1.1.0.0')))
1493 # test exception raised when first and last aren't IP addresses
1494 self.assertRaises(TypeError, list,
1495 summarize(ipaddress.ip_network('1.1.1.0'),
1496 ipaddress.ip_network('1.1.0.0')))
1497 self.assertRaises(TypeError, list,
1498 summarize(ipaddress.ip_network('1.1.1.0'),
1499 ipaddress.ip_network('1.1.0.0')))
1500 # test exception raised when first and last are not same version
1501 self.assertRaises(TypeError, list,
1502 summarize(ipaddress.ip_address('::'),
1503 ipaddress.ip_network('1.1.0.0')))
1504
1505 def testAddressComparison(self):
1506 self.assertTrue(ipaddress.ip_address('1.1.1.1') <=
1507 ipaddress.ip_address('1.1.1.1'))
1508 self.assertTrue(ipaddress.ip_address('1.1.1.1') <=
1509 ipaddress.ip_address('1.1.1.2'))
1510 self.assertTrue(ipaddress.ip_address('::1') <=
1511 ipaddress.ip_address('::1'))
1512 self.assertTrue(ipaddress.ip_address('::1') <=
1513 ipaddress.ip_address('::2'))
1514
Nick Coghlan3008ec02012-07-08 00:45:33 +10001515 def testInterfaceComparison(self):
s-sanjay7bd8d3e2017-03-31 23:09:53 -07001516 self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') ==
1517 ipaddress.ip_interface('1.1.1.1/24'))
1518 self.assertTrue(ipaddress.ip_interface('1.1.1.1/16') <
1519 ipaddress.ip_interface('1.1.1.1/24'))
1520 self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') <
1521 ipaddress.ip_interface('1.1.1.2/24'))
1522 self.assertTrue(ipaddress.ip_interface('1.1.1.2/16') <
1523 ipaddress.ip_interface('1.1.1.1/24'))
1524 self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') >
1525 ipaddress.ip_interface('1.1.1.1/16'))
1526 self.assertTrue(ipaddress.ip_interface('1.1.1.2/24') >
1527 ipaddress.ip_interface('1.1.1.1/24'))
1528 self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') >
1529 ipaddress.ip_interface('1.1.1.2/16'))
1530
1531 self.assertTrue(ipaddress.ip_interface('::1/64') ==
1532 ipaddress.ip_interface('::1/64'))
1533 self.assertTrue(ipaddress.ip_interface('::1/64') <
1534 ipaddress.ip_interface('::1/80'))
1535 self.assertTrue(ipaddress.ip_interface('::1/64') <
1536 ipaddress.ip_interface('::2/64'))
1537 self.assertTrue(ipaddress.ip_interface('::2/48') <
1538 ipaddress.ip_interface('::1/64'))
1539 self.assertTrue(ipaddress.ip_interface('::1/80') >
1540 ipaddress.ip_interface('::1/64'))
1541 self.assertTrue(ipaddress.ip_interface('::2/64') >
1542 ipaddress.ip_interface('::1/64'))
1543 self.assertTrue(ipaddress.ip_interface('::1/64') >
1544 ipaddress.ip_interface('::2/48'))
Nick Coghlan3008ec02012-07-08 00:45:33 +10001545
Nick Coghlandc9b2552012-05-20 21:01:57 +10001546 def testNetworkComparison(self):
1547 # ip1 and ip2 have the same network address
1548 ip1 = ipaddress.IPv4Network('1.1.1.0/24')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001549 ip2 = ipaddress.IPv4Network('1.1.1.0/32')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001550 ip3 = ipaddress.IPv4Network('1.1.2.0/24')
1551
1552 self.assertTrue(ip1 < ip3)
1553 self.assertTrue(ip3 > ip2)
1554
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001555 self.assertEqual(ip1.compare_networks(ip1), 0)
1556
1557 # if addresses are the same, sort by netmask
1558 self.assertEqual(ip1.compare_networks(ip2), -1)
1559 self.assertEqual(ip2.compare_networks(ip1), 1)
1560
Nick Coghlandc9b2552012-05-20 21:01:57 +10001561 self.assertEqual(ip1.compare_networks(ip3), -1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001562 self.assertEqual(ip3.compare_networks(ip1), 1)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001563 self.assertTrue(ip1._get_networks_key() < ip3._get_networks_key())
1564
1565 ip1 = ipaddress.IPv6Network('2001:2000::/96')
1566 ip2 = ipaddress.IPv6Network('2001:2001::/96')
1567 ip3 = ipaddress.IPv6Network('2001:ffff:2000::/96')
1568
1569 self.assertTrue(ip1 < ip3)
1570 self.assertTrue(ip3 > ip2)
1571 self.assertEqual(ip1.compare_networks(ip3), -1)
1572 self.assertTrue(ip1._get_networks_key() < ip3._get_networks_key())
1573
1574 # Test comparing different protocols.
1575 # Should always raise a TypeError.
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001576 self.assertRaises(TypeError,
1577 self.ipv4_network.compare_networks,
1578 self.ipv6_network)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001579 ipv6 = ipaddress.IPv6Interface('::/0')
1580 ipv4 = ipaddress.IPv4Interface('0.0.0.0/0')
1581 self.assertRaises(TypeError, ipv4.__lt__, ipv6)
1582 self.assertRaises(TypeError, ipv4.__gt__, ipv6)
1583 self.assertRaises(TypeError, ipv6.__lt__, ipv4)
1584 self.assertRaises(TypeError, ipv6.__gt__, ipv4)
1585
1586 # Regression test for issue 19.
1587 ip1 = ipaddress.ip_network('10.1.2.128/25')
1588 self.assertFalse(ip1 < ip1)
1589 self.assertFalse(ip1 > ip1)
1590 ip2 = ipaddress.ip_network('10.1.3.0/24')
1591 self.assertTrue(ip1 < ip2)
1592 self.assertFalse(ip2 < ip1)
1593 self.assertFalse(ip1 > ip2)
1594 self.assertTrue(ip2 > ip1)
1595 ip3 = ipaddress.ip_network('10.1.3.0/25')
1596 self.assertTrue(ip2 < ip3)
1597 self.assertFalse(ip3 < ip2)
1598 self.assertFalse(ip2 > ip3)
1599 self.assertTrue(ip3 > ip2)
1600
1601 # Regression test for issue 28.
1602 ip1 = ipaddress.ip_network('10.10.10.0/31')
1603 ip2 = ipaddress.ip_network('10.10.10.0')
1604 ip3 = ipaddress.ip_network('10.10.10.2/31')
1605 ip4 = ipaddress.ip_network('10.10.10.2')
1606 sorted = [ip1, ip2, ip3, ip4]
1607 unsorted = [ip2, ip4, ip1, ip3]
1608 unsorted.sort()
1609 self.assertEqual(sorted, unsorted)
1610 unsorted = [ip4, ip1, ip3, ip2]
1611 unsorted.sort()
1612 self.assertEqual(sorted, unsorted)
Serhiy Storchakaf186e122015-01-26 10:11:16 +02001613 self.assertIs(ip1.__lt__(ipaddress.ip_address('10.10.10.0')),
1614 NotImplemented)
1615 self.assertIs(ip2.__lt__(ipaddress.ip_address('10.10.10.0')),
1616 NotImplemented)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001617
1618 # <=, >=
1619 self.assertTrue(ipaddress.ip_network('1.1.1.1') <=
1620 ipaddress.ip_network('1.1.1.1'))
1621 self.assertTrue(ipaddress.ip_network('1.1.1.1') <=
1622 ipaddress.ip_network('1.1.1.2'))
1623 self.assertFalse(ipaddress.ip_network('1.1.1.2') <=
1624 ipaddress.ip_network('1.1.1.1'))
1625 self.assertTrue(ipaddress.ip_network('::1') <=
1626 ipaddress.ip_network('::1'))
1627 self.assertTrue(ipaddress.ip_network('::1') <=
1628 ipaddress.ip_network('::2'))
1629 self.assertFalse(ipaddress.ip_network('::2') <=
1630 ipaddress.ip_network('::1'))
1631
1632 def testStrictNetworks(self):
1633 self.assertRaises(ValueError, ipaddress.ip_network, '192.168.1.1/24')
1634 self.assertRaises(ValueError, ipaddress.ip_network, '::1/120')
1635
1636 def testOverlaps(self):
1637 other = ipaddress.IPv4Network('1.2.3.0/30')
1638 other2 = ipaddress.IPv4Network('1.2.2.0/24')
1639 other3 = ipaddress.IPv4Network('1.2.2.64/26')
1640 self.assertTrue(self.ipv4_network.overlaps(other))
1641 self.assertFalse(self.ipv4_network.overlaps(other2))
1642 self.assertTrue(other2.overlaps(other3))
1643
1644 def testEmbeddedIpv4(self):
1645 ipv4_string = '192.168.0.1'
1646 ipv4 = ipaddress.IPv4Interface(ipv4_string)
1647 v4compat_ipv6 = ipaddress.IPv6Interface('::%s' % ipv4_string)
1648 self.assertEqual(int(v4compat_ipv6.ip), int(ipv4.ip))
1649 v4mapped_ipv6 = ipaddress.IPv6Interface('::ffff:%s' % ipv4_string)
1650 self.assertNotEqual(v4mapped_ipv6.ip, ipv4.ip)
1651 self.assertRaises(ipaddress.AddressValueError, ipaddress.IPv6Interface,
1652 '2001:1.1.1.1:1.1.1.1')
1653
1654 # Issue 67: IPv6 with embedded IPv4 address not recognized.
1655 def testIPv6AddressTooLarge(self):
1656 # RFC4291 2.5.5.2
1657 self.assertEqual(ipaddress.ip_address('::FFFF:192.0.2.1'),
1658 ipaddress.ip_address('::FFFF:c000:201'))
1659 # RFC4291 2.2 (part 3) x::d.d.d.d
1660 self.assertEqual(ipaddress.ip_address('FFFF::192.0.2.1'),
1661 ipaddress.ip_address('FFFF::c000:201'))
1662
1663 def testIPVersion(self):
1664 self.assertEqual(self.ipv4_address.version, 4)
1665 self.assertEqual(self.ipv6_address.version, 6)
1666
1667 def testMaxPrefixLength(self):
1668 self.assertEqual(self.ipv4_interface.max_prefixlen, 32)
1669 self.assertEqual(self.ipv6_interface.max_prefixlen, 128)
1670
1671 def testPacked(self):
1672 self.assertEqual(self.ipv4_address.packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001673 b'\x01\x02\x03\x04')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001674 self.assertEqual(ipaddress.IPv4Interface('255.254.253.252').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001675 b'\xff\xfe\xfd\xfc')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001676 self.assertEqual(self.ipv6_address.packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001677 b'\x20\x01\x06\x58\x02\x2a\xca\xfe'
1678 b'\x02\x00\x00\x00\x00\x00\x00\x01')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001679 self.assertEqual(ipaddress.IPv6Interface('ffff:2:3:4:ffff::').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001680 b'\xff\xff\x00\x02\x00\x03\x00\x04\xff\xff'
1681 + b'\x00' * 6)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001682 self.assertEqual(ipaddress.IPv6Interface('::1:0:0:0:0').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001683 b'\x00' * 6 + b'\x00\x01' + b'\x00' * 8)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001684
Nick Coghlandc9b2552012-05-20 21:01:57 +10001685 def testIpType(self):
1686 ipv4net = ipaddress.ip_network('1.2.3.4')
1687 ipv4addr = ipaddress.ip_address('1.2.3.4')
1688 ipv6net = ipaddress.ip_network('::1.2.3.4')
1689 ipv6addr = ipaddress.ip_address('::1.2.3.4')
1690 self.assertEqual(ipaddress.IPv4Network, type(ipv4net))
1691 self.assertEqual(ipaddress.IPv4Address, type(ipv4addr))
1692 self.assertEqual(ipaddress.IPv6Network, type(ipv6net))
1693 self.assertEqual(ipaddress.IPv6Address, type(ipv6addr))
1694
1695 def testReservedIpv4(self):
1696 # test networks
1697 self.assertEqual(True, ipaddress.ip_interface(
1698 '224.1.1.1/31').is_multicast)
1699 self.assertEqual(False, ipaddress.ip_network('240.0.0.0').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001700 self.assertEqual(True, ipaddress.ip_network('240.0.0.0').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001701
1702 self.assertEqual(True, ipaddress.ip_interface(
1703 '192.168.1.1/17').is_private)
1704 self.assertEqual(False, ipaddress.ip_network('192.169.0.0').is_private)
1705 self.assertEqual(True, ipaddress.ip_network(
1706 '10.255.255.255').is_private)
1707 self.assertEqual(False, ipaddress.ip_network('11.0.0.0').is_private)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001708 self.assertEqual(False, ipaddress.ip_network('11.0.0.0').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001709 self.assertEqual(True, ipaddress.ip_network(
1710 '172.31.255.255').is_private)
1711 self.assertEqual(False, ipaddress.ip_network('172.32.0.0').is_private)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001712 self.assertEqual(True,
1713 ipaddress.ip_network('169.254.1.0/24').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001714
1715 self.assertEqual(True,
1716 ipaddress.ip_interface(
1717 '169.254.100.200/24').is_link_local)
1718 self.assertEqual(False,
1719 ipaddress.ip_interface(
1720 '169.255.100.200/24').is_link_local)
1721
1722 self.assertEqual(True,
1723 ipaddress.ip_network(
1724 '127.100.200.254/32').is_loopback)
1725 self.assertEqual(True, ipaddress.ip_network(
1726 '127.42.0.0/16').is_loopback)
1727 self.assertEqual(False, ipaddress.ip_network('128.0.0.0').is_loopback)
Peter Moodye5019d52013-10-24 09:47:10 -07001728 self.assertEqual(False,
1729 ipaddress.ip_network('100.64.0.0/10').is_private)
Peter Moodybe9c1b12013-10-22 12:36:21 -07001730 self.assertEqual(False, ipaddress.ip_network('100.64.0.0/10').is_global)
Peter Moodye5019d52013-10-24 09:47:10 -07001731
Peter Moody22c31762013-10-21 13:58:06 -07001732 self.assertEqual(True,
1733 ipaddress.ip_network('192.0.2.128/25').is_private)
1734 self.assertEqual(True,
1735 ipaddress.ip_network('192.0.3.0/24').is_global)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001736
1737 # test addresses
Hynek Schlawackbcd30442012-06-04 14:19:39 +02001738 self.assertEqual(True, ipaddress.ip_address('0.0.0.0').is_unspecified)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001739 self.assertEqual(True, ipaddress.ip_address('224.1.1.1').is_multicast)
1740 self.assertEqual(False, ipaddress.ip_address('240.0.0.0').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001741 self.assertEqual(True, ipaddress.ip_address('240.0.0.1').is_reserved)
1742 self.assertEqual(False,
1743 ipaddress.ip_address('239.255.255.255').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001744
1745 self.assertEqual(True, ipaddress.ip_address('192.168.1.1').is_private)
1746 self.assertEqual(False, ipaddress.ip_address('192.169.0.0').is_private)
1747 self.assertEqual(True, ipaddress.ip_address(
1748 '10.255.255.255').is_private)
1749 self.assertEqual(False, ipaddress.ip_address('11.0.0.0').is_private)
1750 self.assertEqual(True, ipaddress.ip_address(
1751 '172.31.255.255').is_private)
1752 self.assertEqual(False, ipaddress.ip_address('172.32.0.0').is_private)
1753
1754 self.assertEqual(True,
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001755 ipaddress.ip_address('169.254.100.200').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001756 self.assertEqual(False,
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001757 ipaddress.ip_address('169.255.100.200').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001758
Berker Peksag742192a2016-06-11 22:11:47 +03001759 self.assertTrue(ipaddress.ip_address('192.0.7.1').is_global)
1760 self.assertFalse(ipaddress.ip_address('203.0.113.1').is_global)
1761
Nick Coghlandc9b2552012-05-20 21:01:57 +10001762 self.assertEqual(True,
1763 ipaddress.ip_address('127.100.200.254').is_loopback)
1764 self.assertEqual(True, ipaddress.ip_address('127.42.0.0').is_loopback)
1765 self.assertEqual(False, ipaddress.ip_address('128.0.0.0').is_loopback)
1766 self.assertEqual(True, ipaddress.ip_network('0.0.0.0').is_unspecified)
1767
1768 def testReservedIpv6(self):
1769
1770 self.assertEqual(True, ipaddress.ip_network('ffff::').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001771 self.assertEqual(True, ipaddress.ip_network(2**128 - 1).is_multicast)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001772 self.assertEqual(True, ipaddress.ip_network('ff00::').is_multicast)
1773 self.assertEqual(False, ipaddress.ip_network('fdff::').is_multicast)
1774
1775 self.assertEqual(True, ipaddress.ip_network('fecf::').is_site_local)
1776 self.assertEqual(True, ipaddress.ip_network(
1777 'feff:ffff:ffff:ffff::').is_site_local)
1778 self.assertEqual(False, ipaddress.ip_network(
1779 'fbf:ffff::').is_site_local)
1780 self.assertEqual(False, ipaddress.ip_network('ff00::').is_site_local)
1781
1782 self.assertEqual(True, ipaddress.ip_network('fc00::').is_private)
1783 self.assertEqual(True, ipaddress.ip_network(
1784 'fc00:ffff:ffff:ffff::').is_private)
1785 self.assertEqual(False, ipaddress.ip_network('fbff:ffff::').is_private)
1786 self.assertEqual(False, ipaddress.ip_network('fe00::').is_private)
1787
1788 self.assertEqual(True, ipaddress.ip_network('fea0::').is_link_local)
1789 self.assertEqual(True, ipaddress.ip_network(
1790 'febf:ffff::').is_link_local)
1791 self.assertEqual(False, ipaddress.ip_network(
1792 'fe7f:ffff::').is_link_local)
1793 self.assertEqual(False, ipaddress.ip_network('fec0::').is_link_local)
1794
1795 self.assertEqual(True, ipaddress.ip_interface('0:0::0:01').is_loopback)
1796 self.assertEqual(False, ipaddress.ip_interface('::1/127').is_loopback)
1797 self.assertEqual(False, ipaddress.ip_network('::').is_loopback)
1798 self.assertEqual(False, ipaddress.ip_network('::2').is_loopback)
1799
1800 self.assertEqual(True, ipaddress.ip_network('0::0').is_unspecified)
1801 self.assertEqual(False, ipaddress.ip_network('::1').is_unspecified)
1802 self.assertEqual(False, ipaddress.ip_network('::/127').is_unspecified)
1803
Peter Moody22c31762013-10-21 13:58:06 -07001804 self.assertEqual(True,
1805 ipaddress.ip_network('2001::1/128').is_private)
1806 self.assertEqual(True,
1807 ipaddress.ip_network('200::1/128').is_global)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001808 # test addresses
1809 self.assertEqual(True, ipaddress.ip_address('ffff::').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001810 self.assertEqual(True, ipaddress.ip_address(2**128 - 1).is_multicast)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001811 self.assertEqual(True, ipaddress.ip_address('ff00::').is_multicast)
1812 self.assertEqual(False, ipaddress.ip_address('fdff::').is_multicast)
1813
1814 self.assertEqual(True, ipaddress.ip_address('fecf::').is_site_local)
1815 self.assertEqual(True, ipaddress.ip_address(
1816 'feff:ffff:ffff:ffff::').is_site_local)
1817 self.assertEqual(False, ipaddress.ip_address(
1818 'fbf:ffff::').is_site_local)
1819 self.assertEqual(False, ipaddress.ip_address('ff00::').is_site_local)
1820
1821 self.assertEqual(True, ipaddress.ip_address('fc00::').is_private)
1822 self.assertEqual(True, ipaddress.ip_address(
1823 'fc00:ffff:ffff:ffff::').is_private)
1824 self.assertEqual(False, ipaddress.ip_address('fbff:ffff::').is_private)
1825 self.assertEqual(False, ipaddress.ip_address('fe00::').is_private)
1826
1827 self.assertEqual(True, ipaddress.ip_address('fea0::').is_link_local)
1828 self.assertEqual(True, ipaddress.ip_address(
1829 'febf:ffff::').is_link_local)
1830 self.assertEqual(False, ipaddress.ip_address(
1831 'fe7f:ffff::').is_link_local)
1832 self.assertEqual(False, ipaddress.ip_address('fec0::').is_link_local)
1833
1834 self.assertEqual(True, ipaddress.ip_address('0:0::0:01').is_loopback)
1835 self.assertEqual(True, ipaddress.ip_address('::1').is_loopback)
1836 self.assertEqual(False, ipaddress.ip_address('::2').is_loopback)
1837
1838 self.assertEqual(True, ipaddress.ip_address('0::0').is_unspecified)
1839 self.assertEqual(False, ipaddress.ip_address('::1').is_unspecified)
1840
1841 # some generic IETF reserved addresses
1842 self.assertEqual(True, ipaddress.ip_address('100::').is_reserved)
1843 self.assertEqual(True, ipaddress.ip_network('4000::1/128').is_reserved)
1844
1845 def testIpv4Mapped(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001846 self.assertEqual(
1847 ipaddress.ip_address('::ffff:192.168.1.1').ipv4_mapped,
1848 ipaddress.ip_address('192.168.1.1'))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001849 self.assertEqual(ipaddress.ip_address('::c0a8:101').ipv4_mapped, None)
1850 self.assertEqual(ipaddress.ip_address('::ffff:c0a8:101').ipv4_mapped,
1851 ipaddress.ip_address('192.168.1.1'))
1852
1853 def testAddrExclude(self):
1854 addr1 = ipaddress.ip_network('10.1.1.0/24')
1855 addr2 = ipaddress.ip_network('10.1.1.0/26')
1856 addr3 = ipaddress.ip_network('10.2.1.0/24')
1857 addr4 = ipaddress.ip_address('10.1.1.0')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001858 addr5 = ipaddress.ip_network('2001:db8::0/32')
Serhiy Storchakabb0dbd52016-03-01 10:25:45 +02001859 addr6 = ipaddress.ip_network('10.1.1.5/32')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001860 self.assertEqual(sorted(list(addr1.address_exclude(addr2))),
1861 [ipaddress.ip_network('10.1.1.64/26'),
1862 ipaddress.ip_network('10.1.1.128/25')])
1863 self.assertRaises(ValueError, list, addr1.address_exclude(addr3))
1864 self.assertRaises(TypeError, list, addr1.address_exclude(addr4))
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001865 self.assertRaises(TypeError, list, addr1.address_exclude(addr5))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001866 self.assertEqual(list(addr1.address_exclude(addr1)), [])
Serhiy Storchakabb0dbd52016-03-01 10:25:45 +02001867 self.assertEqual(sorted(list(addr1.address_exclude(addr6))),
1868 [ipaddress.ip_network('10.1.1.0/30'),
1869 ipaddress.ip_network('10.1.1.4/32'),
1870 ipaddress.ip_network('10.1.1.6/31'),
1871 ipaddress.ip_network('10.1.1.8/29'),
1872 ipaddress.ip_network('10.1.1.16/28'),
1873 ipaddress.ip_network('10.1.1.32/27'),
1874 ipaddress.ip_network('10.1.1.64/26'),
1875 ipaddress.ip_network('10.1.1.128/25')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001876
1877 def testHash(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001878 self.assertEqual(hash(ipaddress.ip_interface('10.1.1.0/24')),
1879 hash(ipaddress.ip_interface('10.1.1.0/24')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001880 self.assertEqual(hash(ipaddress.ip_network('10.1.1.0/24')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001881 hash(ipaddress.ip_network('10.1.1.0/24')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001882 self.assertEqual(hash(ipaddress.ip_address('10.1.1.0')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001883 hash(ipaddress.ip_address('10.1.1.0')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001884 # i70
1885 self.assertEqual(hash(ipaddress.ip_address('1.2.3.4')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001886 hash(ipaddress.ip_address(
Nick Coghlandc9b2552012-05-20 21:01:57 +10001887 int(ipaddress.ip_address('1.2.3.4')._ip))))
1888 ip1 = ipaddress.ip_address('10.1.1.0')
1889 ip2 = ipaddress.ip_address('1::')
1890 dummy = {}
1891 dummy[self.ipv4_address] = None
1892 dummy[self.ipv6_address] = None
1893 dummy[ip1] = None
1894 dummy[ip2] = None
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001895 self.assertIn(self.ipv4_address, dummy)
1896 self.assertIn(ip2, dummy)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001897
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001898 def testIPBases(self):
1899 net = self.ipv4_network
1900 self.assertEqual('1.2.3.0/24', net.compressed)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001901 net = self.ipv6_network
1902 self.assertRaises(ValueError, net._string_from_ip_int, 2**128 + 1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001903
Hynek Schlawack454a74d2012-06-04 18:14:02 +02001904 def testIPv6NetworkHelpers(self):
1905 net = self.ipv6_network
1906 self.assertEqual('2001:658:22a:cafe::/64', net.with_prefixlen)
1907 self.assertEqual('2001:658:22a:cafe::/ffff:ffff:ffff:ffff::',
1908 net.with_netmask)
1909 self.assertEqual('2001:658:22a:cafe::/::ffff:ffff:ffff:ffff',
1910 net.with_hostmask)
1911 self.assertEqual('2001:658:22a:cafe::/64', str(net))
1912
1913 def testIPv4NetworkHelpers(self):
1914 net = self.ipv4_network
1915 self.assertEqual('1.2.3.0/24', net.with_prefixlen)
1916 self.assertEqual('1.2.3.0/255.255.255.0', net.with_netmask)
1917 self.assertEqual('1.2.3.0/0.0.0.255', net.with_hostmask)
1918 self.assertEqual('1.2.3.0/24', str(net))
1919
Nick Coghlandc9b2552012-05-20 21:01:57 +10001920 def testCopyConstructor(self):
1921 addr1 = ipaddress.ip_network('10.1.1.0/24')
1922 addr2 = ipaddress.ip_network(addr1)
1923 addr3 = ipaddress.ip_interface('2001:658:22a:cafe:200::1/64')
1924 addr4 = ipaddress.ip_interface(addr3)
1925 addr5 = ipaddress.IPv4Address('1.1.1.1')
1926 addr6 = ipaddress.IPv6Address('2001:658:22a:cafe:200::1')
1927
1928 self.assertEqual(addr1, addr2)
1929 self.assertEqual(addr3, addr4)
1930 self.assertEqual(addr5, ipaddress.IPv4Address(addr5))
1931 self.assertEqual(addr6, ipaddress.IPv6Address(addr6))
1932
1933 def testCompressIPv6Address(self):
1934 test_addresses = {
1935 '1:2:3:4:5:6:7:8': '1:2:3:4:5:6:7:8/128',
1936 '2001:0:0:4:0:0:0:8': '2001:0:0:4::8/128',
1937 '2001:0:0:4:5:6:7:8': '2001::4:5:6:7:8/128',
1938 '2001:0:3:4:5:6:7:8': '2001:0:3:4:5:6:7:8/128',
Nick Coghlandc9b2552012-05-20 21:01:57 +10001939 '0:0:3:0:0:0:0:ffff': '0:0:3::ffff/128',
1940 '0:0:0:4:0:0:0:ffff': '::4:0:0:0:ffff/128',
1941 '0:0:0:0:5:0:0:ffff': '::5:0:0:ffff/128',
1942 '1:0:0:4:0:0:7:8': '1::4:0:0:7:8/128',
1943 '0:0:0:0:0:0:0:0': '::/128',
1944 '0:0:0:0:0:0:0:0/0': '::/0',
1945 '0:0:0:0:0:0:0:1': '::1/128',
1946 '2001:0658:022a:cafe:0000:0000:0000:0000/66':
1947 '2001:658:22a:cafe::/66',
1948 '::1.2.3.4': '::102:304/128',
1949 '1:2:3:4:5:ffff:1.2.3.4': '1:2:3:4:5:ffff:102:304/128',
1950 '::7:6:5:4:3:2:1': '0:7:6:5:4:3:2:1/128',
1951 '::7:6:5:4:3:2:0': '0:7:6:5:4:3:2:0/128',
1952 '7:6:5:4:3:2:1::': '7:6:5:4:3:2:1:0/128',
1953 '0:6:5:4:3:2:1::': '0:6:5:4:3:2:1:0/128',
1954 }
1955 for uncompressed, compressed in list(test_addresses.items()):
1956 self.assertEqual(compressed, str(ipaddress.IPv6Interface(
1957 uncompressed)))
1958
1959 def testExplodeShortHandIpStr(self):
1960 addr1 = ipaddress.IPv6Interface('2001::1')
1961 addr2 = ipaddress.IPv6Address('2001:0:5ef5:79fd:0:59d:a0e5:ba1')
1962 addr3 = ipaddress.IPv6Network('2001::/96')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001963 addr4 = ipaddress.IPv4Address('192.168.178.1')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001964 self.assertEqual('2001:0000:0000:0000:0000:0000:0000:0001/128',
1965 addr1.exploded)
1966 self.assertEqual('0000:0000:0000:0000:0000:0000:0000:0001/128',
1967 ipaddress.IPv6Interface('::1/128').exploded)
1968 # issue 77
1969 self.assertEqual('2001:0000:5ef5:79fd:0000:059d:a0e5:0ba1',
1970 addr2.exploded)
1971 self.assertEqual('2001:0000:0000:0000:0000:0000:0000:0000/96',
1972 addr3.exploded)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001973 self.assertEqual('192.168.178.1', addr4.exploded)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001974
Eric V. Smithebdaaf42014-04-14 12:58:07 -04001975 def testReversePointer(self):
1976 addr1 = ipaddress.IPv4Address('127.0.0.1')
1977 addr2 = ipaddress.IPv6Address('2001:db8::1')
1978 self.assertEqual('1.0.0.127.in-addr.arpa', addr1.reverse_pointer)
1979 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.' +
1980 'b.d.0.1.0.0.2.ip6.arpa',
1981 addr2.reverse_pointer)
1982
Nick Coghlandc9b2552012-05-20 21:01:57 +10001983 def testIntRepresentation(self):
1984 self.assertEqual(16909060, int(self.ipv4_address))
1985 self.assertEqual(42540616829182469433547762482097946625,
1986 int(self.ipv6_address))
1987
Nick Coghlandc9b2552012-05-20 21:01:57 +10001988 def testForceVersion(self):
1989 self.assertEqual(ipaddress.ip_network(1).version, 4)
Nick Coghlan51c30672012-05-27 00:25:58 +10001990 self.assertEqual(ipaddress.IPv6Network(1).version, 6)
Sandro Tosi876ecad2012-05-23 22:26:55 +02001991
Nick Coghlandc9b2552012-05-20 21:01:57 +10001992 def testWithStar(self):
Nick Coghlana8517ad2012-08-20 10:04:26 +10001993 self.assertEqual(self.ipv4_interface.with_prefixlen, "1.2.3.4/24")
1994 self.assertEqual(self.ipv4_interface.with_netmask,
Nick Coghlandc9b2552012-05-20 21:01:57 +10001995 "1.2.3.4/255.255.255.0")
Nick Coghlana8517ad2012-08-20 10:04:26 +10001996 self.assertEqual(self.ipv4_interface.with_hostmask,
Nick Coghlandc9b2552012-05-20 21:01:57 +10001997 "1.2.3.4/0.0.0.255")
1998
Nick Coghlana8517ad2012-08-20 10:04:26 +10001999 self.assertEqual(self.ipv6_interface.with_prefixlen,
Nick Coghlandc9b2552012-05-20 21:01:57 +10002000 '2001:658:22a:cafe:200::1/64')
Nick Coghlana8517ad2012-08-20 10:04:26 +10002001 self.assertEqual(self.ipv6_interface.with_netmask,
2002 '2001:658:22a:cafe:200::1/ffff:ffff:ffff:ffff::')
Nick Coghlandc9b2552012-05-20 21:01:57 +10002003 # this probably don't make much sense, but it's included for
2004 # compatibility with ipv4
Nick Coghlana8517ad2012-08-20 10:04:26 +10002005 self.assertEqual(self.ipv6_interface.with_hostmask,
Nick Coghlandc9b2552012-05-20 21:01:57 +10002006 '2001:658:22a:cafe:200::1/::ffff:ffff:ffff:ffff')
2007
2008 def testNetworkElementCaching(self):
2009 # V4 - make sure we're empty
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02002010 self.assertNotIn('network_address', self.ipv4_network._cache)
2011 self.assertNotIn('broadcast_address', self.ipv4_network._cache)
2012 self.assertNotIn('hostmask', self.ipv4_network._cache)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002013
2014 # V4 - populate and test
2015 self.assertEqual(self.ipv4_network.network_address,
2016 ipaddress.IPv4Address('1.2.3.0'))
2017 self.assertEqual(self.ipv4_network.broadcast_address,
2018 ipaddress.IPv4Address('1.2.3.255'))
2019 self.assertEqual(self.ipv4_network.hostmask,
2020 ipaddress.IPv4Address('0.0.0.255'))
2021
2022 # V4 - check we're cached
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02002023 self.assertIn('broadcast_address', self.ipv4_network._cache)
2024 self.assertIn('hostmask', self.ipv4_network._cache)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002025
2026 # V6 - make sure we're empty
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02002027 self.assertNotIn('broadcast_address', self.ipv6_network._cache)
2028 self.assertNotIn('hostmask', self.ipv6_network._cache)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002029
2030 # V6 - populate and test
2031 self.assertEqual(self.ipv6_network.network_address,
2032 ipaddress.IPv6Address('2001:658:22a:cafe::'))
2033 self.assertEqual(self.ipv6_interface.network.network_address,
2034 ipaddress.IPv6Address('2001:658:22a:cafe::'))
2035
2036 self.assertEqual(
2037 self.ipv6_network.broadcast_address,
2038 ipaddress.IPv6Address('2001:658:22a:cafe:ffff:ffff:ffff:ffff'))
2039 self.assertEqual(self.ipv6_network.hostmask,
2040 ipaddress.IPv6Address('::ffff:ffff:ffff:ffff'))
2041 self.assertEqual(
2042 self.ipv6_interface.network.broadcast_address,
2043 ipaddress.IPv6Address('2001:658:22a:cafe:ffff:ffff:ffff:ffff'))
2044 self.assertEqual(self.ipv6_interface.network.hostmask,
2045 ipaddress.IPv6Address('::ffff:ffff:ffff:ffff'))
2046
2047 # V6 - check we're cached
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02002048 self.assertIn('broadcast_address', self.ipv6_network._cache)
2049 self.assertIn('hostmask', self.ipv6_network._cache)
2050 self.assertIn('broadcast_address', self.ipv6_interface.network._cache)
2051 self.assertIn('hostmask', self.ipv6_interface.network._cache)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002052
2053 def testTeredo(self):
2054 # stolen from wikipedia
2055 server = ipaddress.IPv4Address('65.54.227.120')
2056 client = ipaddress.IPv4Address('192.0.2.45')
2057 teredo_addr = '2001:0000:4136:e378:8000:63bf:3fff:fdd2'
2058 self.assertEqual((server, client),
2059 ipaddress.ip_address(teredo_addr).teredo)
2060 bad_addr = '2000::4136:e378:8000:63bf:3fff:fdd2'
2061 self.assertFalse(ipaddress.ip_address(bad_addr).teredo)
2062 bad_addr = '2001:0001:4136:e378:8000:63bf:3fff:fdd2'
2063 self.assertFalse(ipaddress.ip_address(bad_addr).teredo)
2064
2065 # i77
2066 teredo_addr = ipaddress.IPv6Address('2001:0:5ef5:79fd:0:59d:a0e5:ba1')
2067 self.assertEqual((ipaddress.IPv4Address('94.245.121.253'),
2068 ipaddress.IPv4Address('95.26.244.94')),
2069 teredo_addr.teredo)
2070
Nick Coghlandc9b2552012-05-20 21:01:57 +10002071 def testsixtofour(self):
2072 sixtofouraddr = ipaddress.ip_address('2002:ac1d:2d64::1')
2073 bad_addr = ipaddress.ip_address('2000:ac1d:2d64::1')
2074 self.assertEqual(ipaddress.IPv4Address('172.29.45.100'),
2075 sixtofouraddr.sixtofour)
2076 self.assertFalse(bad_addr.sixtofour)
2077
Nick Coghlandc9b2552012-05-20 21:01:57 +10002078
2079if __name__ == '__main__':
2080 unittest.main()