blob: a5aeb790faeb5f314905040c9b446728ea65ca2c [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
Miss Islington (bot)a323eee2018-03-20 17:30:43 -0700407 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
1130 # special case where only 1 bit is left for address
Nick Coghlandc9b2552012-05-20 21:01:57 +10001131 self.assertEqual([ipaddress.IPv4Address('2.0.0.0'),
1132 ipaddress.IPv4Address('2.0.0.1')],
1133 list(ipaddress.ip_network('2.0.0.0/31').hosts()))
1134
1135 def testFancySubnetting(self):
1136 self.assertEqual(sorted(self.ipv4_network.subnets(prefixlen_diff=3)),
1137 sorted(self.ipv4_network.subnets(new_prefix=27)))
1138 self.assertRaises(ValueError, list,
1139 self.ipv4_network.subnets(new_prefix=23))
1140 self.assertRaises(ValueError, list,
1141 self.ipv4_network.subnets(prefixlen_diff=3,
1142 new_prefix=27))
1143 self.assertEqual(sorted(self.ipv6_network.subnets(prefixlen_diff=4)),
1144 sorted(self.ipv6_network.subnets(new_prefix=68)))
1145 self.assertRaises(ValueError, list,
1146 self.ipv6_network.subnets(new_prefix=63))
1147 self.assertRaises(ValueError, list,
1148 self.ipv6_network.subnets(prefixlen_diff=4,
1149 new_prefix=68))
1150
1151 def testGetSubnets(self):
1152 self.assertEqual(list(self.ipv4_network.subnets())[0].prefixlen, 25)
1153 self.assertEqual(str(list(
1154 self.ipv4_network.subnets())[0].network_address),
1155 '1.2.3.0')
1156 self.assertEqual(str(list(
1157 self.ipv4_network.subnets())[1].network_address),
1158 '1.2.3.128')
1159
1160 self.assertEqual(list(self.ipv6_network.subnets())[0].prefixlen, 65)
1161
1162 def testGetSubnetForSingle32(self):
1163 ip = ipaddress.IPv4Network('1.2.3.4/32')
1164 subnets1 = [str(x) for x in ip.subnets()]
1165 subnets2 = [str(x) for x in ip.subnets(2)]
1166 self.assertEqual(subnets1, ['1.2.3.4/32'])
1167 self.assertEqual(subnets1, subnets2)
1168
1169 def testGetSubnetForSingle128(self):
1170 ip = ipaddress.IPv6Network('::1/128')
1171 subnets1 = [str(x) for x in ip.subnets()]
1172 subnets2 = [str(x) for x in ip.subnets(2)]
1173 self.assertEqual(subnets1, ['::1/128'])
1174 self.assertEqual(subnets1, subnets2)
1175
1176 def testSubnet2(self):
1177 ips = [str(x) for x in self.ipv4_network.subnets(2)]
1178 self.assertEqual(
1179 ips,
1180 ['1.2.3.0/26', '1.2.3.64/26', '1.2.3.128/26', '1.2.3.192/26'])
1181
1182 ipsv6 = [str(x) for x in self.ipv6_network.subnets(2)]
1183 self.assertEqual(
1184 ipsv6,
1185 ['2001:658:22a:cafe::/66',
1186 '2001:658:22a:cafe:4000::/66',
1187 '2001:658:22a:cafe:8000::/66',
1188 '2001:658:22a:cafe:c000::/66'])
1189
Serhiy Storchakabb0dbd52016-03-01 10:25:45 +02001190 def testGetSubnets3(self):
1191 subnets = [str(x) for x in self.ipv4_network.subnets(8)]
1192 self.assertEqual(subnets[:3],
1193 ['1.2.3.0/32', '1.2.3.1/32', '1.2.3.2/32'])
1194 self.assertEqual(subnets[-3:],
1195 ['1.2.3.253/32', '1.2.3.254/32', '1.2.3.255/32'])
1196 self.assertEqual(len(subnets), 256)
1197
1198 ipv6_network = ipaddress.IPv6Network('2001:658:22a:cafe::/120')
1199 subnets = [str(x) for x in ipv6_network.subnets(8)]
1200 self.assertEqual(subnets[:3],
1201 ['2001:658:22a:cafe::/128',
1202 '2001:658:22a:cafe::1/128',
1203 '2001:658:22a:cafe::2/128'])
1204 self.assertEqual(subnets[-3:],
1205 ['2001:658:22a:cafe::fd/128',
1206 '2001:658:22a:cafe::fe/128',
1207 '2001:658:22a:cafe::ff/128'])
1208 self.assertEqual(len(subnets), 256)
1209
Nick Coghlandc9b2552012-05-20 21:01:57 +10001210 def testSubnetFailsForLargeCidrDiff(self):
1211 self.assertRaises(ValueError, list,
1212 self.ipv4_interface.network.subnets(9))
1213 self.assertRaises(ValueError, list,
1214 self.ipv4_network.subnets(9))
1215 self.assertRaises(ValueError, list,
1216 self.ipv6_interface.network.subnets(65))
1217 self.assertRaises(ValueError, list,
1218 self.ipv6_network.subnets(65))
1219
1220 def testSupernetFailsForLargeCidrDiff(self):
1221 self.assertRaises(ValueError,
1222 self.ipv4_interface.network.supernet, 25)
1223 self.assertRaises(ValueError,
1224 self.ipv6_interface.network.supernet, 65)
1225
1226 def testSubnetFailsForNegativeCidrDiff(self):
1227 self.assertRaises(ValueError, list,
1228 self.ipv4_interface.network.subnets(-1))
1229 self.assertRaises(ValueError, list,
Nick Coghlan2c589102012-05-27 01:03:25 +10001230 self.ipv4_network.subnets(-1))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001231 self.assertRaises(ValueError, list,
1232 self.ipv6_interface.network.subnets(-1))
1233 self.assertRaises(ValueError, list,
1234 self.ipv6_network.subnets(-1))
1235
1236 def testGetNum_Addresses(self):
1237 self.assertEqual(self.ipv4_network.num_addresses, 256)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001238 self.assertEqual(list(self.ipv4_network.subnets())[0].num_addresses,
1239 128)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001240 self.assertEqual(self.ipv4_network.supernet().num_addresses, 512)
1241
1242 self.assertEqual(self.ipv6_network.num_addresses, 18446744073709551616)
1243 self.assertEqual(list(self.ipv6_network.subnets())[0].num_addresses,
1244 9223372036854775808)
1245 self.assertEqual(self.ipv6_network.supernet().num_addresses,
1246 36893488147419103232)
1247
1248 def testContains(self):
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001249 self.assertIn(ipaddress.IPv4Interface('1.2.3.128/25'),
1250 self.ipv4_network)
1251 self.assertNotIn(ipaddress.IPv4Interface('1.2.4.1/24'),
Nick Coghlandc9b2552012-05-20 21:01:57 +10001252 self.ipv4_network)
1253 # We can test addresses and string as well.
1254 addr1 = ipaddress.IPv4Address('1.2.3.37')
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001255 self.assertIn(addr1, self.ipv4_network)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001256 # issue 61, bad network comparison on like-ip'd network objects
1257 # with identical broadcast addresses.
1258 self.assertFalse(ipaddress.IPv4Network('1.1.0.0/16').__contains__(
1259 ipaddress.IPv4Network('1.0.0.0/15')))
1260
Nick Coghlandc9b2552012-05-20 21:01:57 +10001261 def testNth(self):
1262 self.assertEqual(str(self.ipv4_network[5]), '1.2.3.5')
1263 self.assertRaises(IndexError, self.ipv4_network.__getitem__, 256)
1264
1265 self.assertEqual(str(self.ipv6_network[5]),
1266 '2001:658:22a:cafe::5')
Berker Peksag28dc1182016-06-11 22:30:05 +03001267 self.assertRaises(IndexError, self.ipv6_network.__getitem__, 1 << 64)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001268
1269 def testGetitem(self):
1270 # http://code.google.com/p/ipaddr-py/issues/detail?id=15
1271 addr = ipaddress.IPv4Network('172.31.255.128/255.255.255.240')
1272 self.assertEqual(28, addr.prefixlen)
1273 addr_list = list(addr)
1274 self.assertEqual('172.31.255.128', str(addr_list[0]))
1275 self.assertEqual('172.31.255.128', str(addr[0]))
1276 self.assertEqual('172.31.255.143', str(addr_list[-1]))
1277 self.assertEqual('172.31.255.143', str(addr[-1]))
1278 self.assertEqual(addr_list[-1], addr[-1])
1279
1280 def testEqual(self):
1281 self.assertTrue(self.ipv4_interface ==
1282 ipaddress.IPv4Interface('1.2.3.4/24'))
1283 self.assertFalse(self.ipv4_interface ==
1284 ipaddress.IPv4Interface('1.2.3.4/23'))
1285 self.assertFalse(self.ipv4_interface ==
1286 ipaddress.IPv6Interface('::1.2.3.4/24'))
1287 self.assertFalse(self.ipv4_interface == '')
1288 self.assertFalse(self.ipv4_interface == [])
1289 self.assertFalse(self.ipv4_interface == 2)
1290
1291 self.assertTrue(self.ipv6_interface ==
1292 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/64'))
1293 self.assertFalse(self.ipv6_interface ==
1294 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/63'))
1295 self.assertFalse(self.ipv6_interface ==
1296 ipaddress.IPv4Interface('1.2.3.4/23'))
1297 self.assertFalse(self.ipv6_interface == '')
1298 self.assertFalse(self.ipv6_interface == [])
1299 self.assertFalse(self.ipv6_interface == 2)
1300
1301 def testNotEqual(self):
1302 self.assertFalse(self.ipv4_interface !=
1303 ipaddress.IPv4Interface('1.2.3.4/24'))
1304 self.assertTrue(self.ipv4_interface !=
1305 ipaddress.IPv4Interface('1.2.3.4/23'))
1306 self.assertTrue(self.ipv4_interface !=
1307 ipaddress.IPv6Interface('::1.2.3.4/24'))
1308 self.assertTrue(self.ipv4_interface != '')
1309 self.assertTrue(self.ipv4_interface != [])
1310 self.assertTrue(self.ipv4_interface != 2)
1311
1312 self.assertTrue(self.ipv4_address !=
1313 ipaddress.IPv4Address('1.2.3.5'))
1314 self.assertTrue(self.ipv4_address != '')
1315 self.assertTrue(self.ipv4_address != [])
1316 self.assertTrue(self.ipv4_address != 2)
1317
1318 self.assertFalse(self.ipv6_interface !=
1319 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/64'))
1320 self.assertTrue(self.ipv6_interface !=
1321 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/63'))
1322 self.assertTrue(self.ipv6_interface !=
1323 ipaddress.IPv4Interface('1.2.3.4/23'))
1324 self.assertTrue(self.ipv6_interface != '')
1325 self.assertTrue(self.ipv6_interface != [])
1326 self.assertTrue(self.ipv6_interface != 2)
1327
1328 self.assertTrue(self.ipv6_address !=
1329 ipaddress.IPv4Address('1.2.3.4'))
1330 self.assertTrue(self.ipv6_address != '')
1331 self.assertTrue(self.ipv6_address != [])
1332 self.assertTrue(self.ipv6_address != 2)
1333
1334 def testSlash32Constructor(self):
1335 self.assertEqual(str(ipaddress.IPv4Interface(
1336 '1.2.3.4/255.255.255.255')), '1.2.3.4/32')
1337
1338 def testSlash128Constructor(self):
1339 self.assertEqual(str(ipaddress.IPv6Interface('::1/128')),
1340 '::1/128')
1341
1342 def testSlash0Constructor(self):
1343 self.assertEqual(str(ipaddress.IPv4Interface('1.2.3.4/0.0.0.0')),
1344 '1.2.3.4/0')
1345
1346 def testCollapsing(self):
1347 # test only IP addresses including some duplicates
1348 ip1 = ipaddress.IPv4Address('1.1.1.0')
1349 ip2 = ipaddress.IPv4Address('1.1.1.1')
1350 ip3 = ipaddress.IPv4Address('1.1.1.2')
1351 ip4 = ipaddress.IPv4Address('1.1.1.3')
1352 ip5 = ipaddress.IPv4Address('1.1.1.4')
1353 ip6 = ipaddress.IPv4Address('1.1.1.0')
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07001354 # check that addresses are subsumed properly.
Nick Coghlandc9b2552012-05-20 21:01:57 +10001355 collapsed = ipaddress.collapse_addresses(
1356 [ip1, ip2, ip3, ip4, ip5, ip6])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001357 self.assertEqual(list(collapsed),
1358 [ipaddress.IPv4Network('1.1.1.0/30'),
1359 ipaddress.IPv4Network('1.1.1.4/32')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001360
1361 # test a mix of IP addresses and networks including some duplicates
1362 ip1 = ipaddress.IPv4Address('1.1.1.0')
1363 ip2 = ipaddress.IPv4Address('1.1.1.1')
1364 ip3 = ipaddress.IPv4Address('1.1.1.2')
1365 ip4 = ipaddress.IPv4Address('1.1.1.3')
1366 #ip5 = ipaddress.IPv4Interface('1.1.1.4/30')
1367 #ip6 = ipaddress.IPv4Interface('1.1.1.4/30')
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07001368 # check that addresses are subsumed properly.
Nick Coghlandc9b2552012-05-20 21:01:57 +10001369 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3, ip4])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001370 self.assertEqual(list(collapsed),
1371 [ipaddress.IPv4Network('1.1.1.0/30')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001372
1373 # test only IP networks
1374 ip1 = ipaddress.IPv4Network('1.1.0.0/24')
1375 ip2 = ipaddress.IPv4Network('1.1.1.0/24')
1376 ip3 = ipaddress.IPv4Network('1.1.2.0/24')
1377 ip4 = ipaddress.IPv4Network('1.1.3.0/24')
1378 ip5 = ipaddress.IPv4Network('1.1.4.0/24')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001379 # stored in no particular order b/c we want CollapseAddr to call
1380 # [].sort
Nick Coghlandc9b2552012-05-20 21:01:57 +10001381 ip6 = ipaddress.IPv4Network('1.1.0.0/22')
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07001382 # check that addresses are subsumed properly.
Nick Coghlandc9b2552012-05-20 21:01:57 +10001383 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3, ip4, ip5,
1384 ip6])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001385 self.assertEqual(list(collapsed),
1386 [ipaddress.IPv4Network('1.1.0.0/22'),
1387 ipaddress.IPv4Network('1.1.4.0/24')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001388
1389 # test that two addresses are supernet'ed properly
1390 collapsed = ipaddress.collapse_addresses([ip1, ip2])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001391 self.assertEqual(list(collapsed),
1392 [ipaddress.IPv4Network('1.1.0.0/23')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001393
1394 # test same IP networks
1395 ip_same1 = ip_same2 = ipaddress.IPv4Network('1.1.1.1/32')
1396 self.assertEqual(list(ipaddress.collapse_addresses(
1397 [ip_same1, ip_same2])),
1398 [ip_same1])
1399
1400 # test same IP addresses
1401 ip_same1 = ip_same2 = ipaddress.IPv4Address('1.1.1.1')
1402 self.assertEqual(list(ipaddress.collapse_addresses(
1403 [ip_same1, ip_same2])),
1404 [ipaddress.ip_network('1.1.1.1/32')])
1405 ip1 = ipaddress.IPv6Network('2001::/100')
1406 ip2 = ipaddress.IPv6Network('2001::/120')
1407 ip3 = ipaddress.IPv6Network('2001::/96')
1408 # test that ipv6 addresses are subsumed properly.
1409 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3])
1410 self.assertEqual(list(collapsed), [ip3])
1411
1412 # the toejam test
Hynek Schlawack35db5132012-06-01 20:12:17 +02001413 addr_tuples = [
1414 (ipaddress.ip_address('1.1.1.1'),
1415 ipaddress.ip_address('::1')),
1416 (ipaddress.IPv4Network('1.1.0.0/24'),
1417 ipaddress.IPv6Network('2001::/120')),
1418 (ipaddress.IPv4Network('1.1.0.0/32'),
1419 ipaddress.IPv6Network('2001::/128')),
1420 ]
1421 for ip1, ip2 in addr_tuples:
1422 self.assertRaises(TypeError, ipaddress.collapse_addresses,
1423 [ip1, ip2])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001424
1425 def testSummarizing(self):
1426 #ip = ipaddress.ip_address
1427 #ipnet = ipaddress.ip_network
1428 summarize = ipaddress.summarize_address_range
1429 ip1 = ipaddress.ip_address('1.1.1.0')
1430 ip2 = ipaddress.ip_address('1.1.1.255')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001431
1432 # summarize works only for IPv4 & IPv6
1433 class IPv7Address(ipaddress.IPv6Address):
1434 @property
1435 def version(self):
1436 return 7
1437 ip_invalid1 = IPv7Address('::1')
1438 ip_invalid2 = IPv7Address('::1')
1439 self.assertRaises(ValueError, list,
1440 summarize(ip_invalid1, ip_invalid2))
1441 # test that a summary over ip4 & ip6 fails
1442 self.assertRaises(TypeError, list,
1443 summarize(ip1, ipaddress.IPv6Address('::1')))
1444 # test a /24 is summarized properly
Nick Coghlandc9b2552012-05-20 21:01:57 +10001445 self.assertEqual(list(summarize(ip1, ip2))[0],
1446 ipaddress.ip_network('1.1.1.0/24'))
Martin Panter7462b6492015-11-02 03:37:02 +00001447 # test an IPv4 range that isn't on a network byte boundary
Nick Coghlandc9b2552012-05-20 21:01:57 +10001448 ip2 = ipaddress.ip_address('1.1.1.8')
1449 self.assertEqual(list(summarize(ip1, ip2)),
1450 [ipaddress.ip_network('1.1.1.0/29'),
1451 ipaddress.ip_network('1.1.1.8')])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001452 # all!
1453 ip1 = ipaddress.IPv4Address(0)
1454 ip2 = ipaddress.IPv4Address(ipaddress.IPv4Address._ALL_ONES)
1455 self.assertEqual([ipaddress.IPv4Network('0.0.0.0/0')],
1456 list(summarize(ip1, ip2)))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001457
1458 ip1 = ipaddress.ip_address('1::')
1459 ip2 = ipaddress.ip_address('1:ffff:ffff:ffff:ffff:ffff:ffff:ffff')
Martin Panter7462b6492015-11-02 03:37:02 +00001460 # test an IPv6 is summarized properly
Nick Coghlandc9b2552012-05-20 21:01:57 +10001461 self.assertEqual(list(summarize(ip1, ip2))[0],
1462 ipaddress.ip_network('1::/16'))
1463 # test an IPv6 range that isn't on a network byte boundary
1464 ip2 = ipaddress.ip_address('2::')
1465 self.assertEqual(list(summarize(ip1, ip2)),
1466 [ipaddress.ip_network('1::/16'),
1467 ipaddress.ip_network('2::/128')])
1468
1469 # test exception raised when first is greater than last
1470 self.assertRaises(ValueError, list,
1471 summarize(ipaddress.ip_address('1.1.1.0'),
1472 ipaddress.ip_address('1.1.0.0')))
1473 # test exception raised when first and last aren't IP addresses
1474 self.assertRaises(TypeError, list,
1475 summarize(ipaddress.ip_network('1.1.1.0'),
1476 ipaddress.ip_network('1.1.0.0')))
1477 self.assertRaises(TypeError, list,
1478 summarize(ipaddress.ip_network('1.1.1.0'),
1479 ipaddress.ip_network('1.1.0.0')))
1480 # test exception raised when first and last are not same version
1481 self.assertRaises(TypeError, list,
1482 summarize(ipaddress.ip_address('::'),
1483 ipaddress.ip_network('1.1.0.0')))
1484
1485 def testAddressComparison(self):
1486 self.assertTrue(ipaddress.ip_address('1.1.1.1') <=
1487 ipaddress.ip_address('1.1.1.1'))
1488 self.assertTrue(ipaddress.ip_address('1.1.1.1') <=
1489 ipaddress.ip_address('1.1.1.2'))
1490 self.assertTrue(ipaddress.ip_address('::1') <=
1491 ipaddress.ip_address('::1'))
1492 self.assertTrue(ipaddress.ip_address('::1') <=
1493 ipaddress.ip_address('::2'))
1494
Nick Coghlan3008ec02012-07-08 00:45:33 +10001495 def testInterfaceComparison(self):
s-sanjay7bd8d3e2017-03-31 23:09:53 -07001496 self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') ==
1497 ipaddress.ip_interface('1.1.1.1/24'))
1498 self.assertTrue(ipaddress.ip_interface('1.1.1.1/16') <
1499 ipaddress.ip_interface('1.1.1.1/24'))
1500 self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') <
1501 ipaddress.ip_interface('1.1.1.2/24'))
1502 self.assertTrue(ipaddress.ip_interface('1.1.1.2/16') <
1503 ipaddress.ip_interface('1.1.1.1/24'))
1504 self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') >
1505 ipaddress.ip_interface('1.1.1.1/16'))
1506 self.assertTrue(ipaddress.ip_interface('1.1.1.2/24') >
1507 ipaddress.ip_interface('1.1.1.1/24'))
1508 self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') >
1509 ipaddress.ip_interface('1.1.1.2/16'))
1510
1511 self.assertTrue(ipaddress.ip_interface('::1/64') ==
1512 ipaddress.ip_interface('::1/64'))
1513 self.assertTrue(ipaddress.ip_interface('::1/64') <
1514 ipaddress.ip_interface('::1/80'))
1515 self.assertTrue(ipaddress.ip_interface('::1/64') <
1516 ipaddress.ip_interface('::2/64'))
1517 self.assertTrue(ipaddress.ip_interface('::2/48') <
1518 ipaddress.ip_interface('::1/64'))
1519 self.assertTrue(ipaddress.ip_interface('::1/80') >
1520 ipaddress.ip_interface('::1/64'))
1521 self.assertTrue(ipaddress.ip_interface('::2/64') >
1522 ipaddress.ip_interface('::1/64'))
1523 self.assertTrue(ipaddress.ip_interface('::1/64') >
1524 ipaddress.ip_interface('::2/48'))
Nick Coghlan3008ec02012-07-08 00:45:33 +10001525
Nick Coghlandc9b2552012-05-20 21:01:57 +10001526 def testNetworkComparison(self):
1527 # ip1 and ip2 have the same network address
1528 ip1 = ipaddress.IPv4Network('1.1.1.0/24')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001529 ip2 = ipaddress.IPv4Network('1.1.1.0/32')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001530 ip3 = ipaddress.IPv4Network('1.1.2.0/24')
1531
1532 self.assertTrue(ip1 < ip3)
1533 self.assertTrue(ip3 > ip2)
1534
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001535 self.assertEqual(ip1.compare_networks(ip1), 0)
1536
1537 # if addresses are the same, sort by netmask
1538 self.assertEqual(ip1.compare_networks(ip2), -1)
1539 self.assertEqual(ip2.compare_networks(ip1), 1)
1540
Nick Coghlandc9b2552012-05-20 21:01:57 +10001541 self.assertEqual(ip1.compare_networks(ip3), -1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001542 self.assertEqual(ip3.compare_networks(ip1), 1)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001543 self.assertTrue(ip1._get_networks_key() < ip3._get_networks_key())
1544
1545 ip1 = ipaddress.IPv6Network('2001:2000::/96')
1546 ip2 = ipaddress.IPv6Network('2001:2001::/96')
1547 ip3 = ipaddress.IPv6Network('2001:ffff:2000::/96')
1548
1549 self.assertTrue(ip1 < ip3)
1550 self.assertTrue(ip3 > ip2)
1551 self.assertEqual(ip1.compare_networks(ip3), -1)
1552 self.assertTrue(ip1._get_networks_key() < ip3._get_networks_key())
1553
1554 # Test comparing different protocols.
1555 # Should always raise a TypeError.
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001556 self.assertRaises(TypeError,
1557 self.ipv4_network.compare_networks,
1558 self.ipv6_network)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001559 ipv6 = ipaddress.IPv6Interface('::/0')
1560 ipv4 = ipaddress.IPv4Interface('0.0.0.0/0')
1561 self.assertRaises(TypeError, ipv4.__lt__, ipv6)
1562 self.assertRaises(TypeError, ipv4.__gt__, ipv6)
1563 self.assertRaises(TypeError, ipv6.__lt__, ipv4)
1564 self.assertRaises(TypeError, ipv6.__gt__, ipv4)
1565
1566 # Regression test for issue 19.
1567 ip1 = ipaddress.ip_network('10.1.2.128/25')
1568 self.assertFalse(ip1 < ip1)
1569 self.assertFalse(ip1 > ip1)
1570 ip2 = ipaddress.ip_network('10.1.3.0/24')
1571 self.assertTrue(ip1 < ip2)
1572 self.assertFalse(ip2 < ip1)
1573 self.assertFalse(ip1 > ip2)
1574 self.assertTrue(ip2 > ip1)
1575 ip3 = ipaddress.ip_network('10.1.3.0/25')
1576 self.assertTrue(ip2 < ip3)
1577 self.assertFalse(ip3 < ip2)
1578 self.assertFalse(ip2 > ip3)
1579 self.assertTrue(ip3 > ip2)
1580
1581 # Regression test for issue 28.
1582 ip1 = ipaddress.ip_network('10.10.10.0/31')
1583 ip2 = ipaddress.ip_network('10.10.10.0')
1584 ip3 = ipaddress.ip_network('10.10.10.2/31')
1585 ip4 = ipaddress.ip_network('10.10.10.2')
1586 sorted = [ip1, ip2, ip3, ip4]
1587 unsorted = [ip2, ip4, ip1, ip3]
1588 unsorted.sort()
1589 self.assertEqual(sorted, unsorted)
1590 unsorted = [ip4, ip1, ip3, ip2]
1591 unsorted.sort()
1592 self.assertEqual(sorted, unsorted)
Serhiy Storchakaf186e122015-01-26 10:11:16 +02001593 self.assertIs(ip1.__lt__(ipaddress.ip_address('10.10.10.0')),
1594 NotImplemented)
1595 self.assertIs(ip2.__lt__(ipaddress.ip_address('10.10.10.0')),
1596 NotImplemented)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001597
1598 # <=, >=
1599 self.assertTrue(ipaddress.ip_network('1.1.1.1') <=
1600 ipaddress.ip_network('1.1.1.1'))
1601 self.assertTrue(ipaddress.ip_network('1.1.1.1') <=
1602 ipaddress.ip_network('1.1.1.2'))
1603 self.assertFalse(ipaddress.ip_network('1.1.1.2') <=
1604 ipaddress.ip_network('1.1.1.1'))
1605 self.assertTrue(ipaddress.ip_network('::1') <=
1606 ipaddress.ip_network('::1'))
1607 self.assertTrue(ipaddress.ip_network('::1') <=
1608 ipaddress.ip_network('::2'))
1609 self.assertFalse(ipaddress.ip_network('::2') <=
1610 ipaddress.ip_network('::1'))
1611
1612 def testStrictNetworks(self):
1613 self.assertRaises(ValueError, ipaddress.ip_network, '192.168.1.1/24')
1614 self.assertRaises(ValueError, ipaddress.ip_network, '::1/120')
1615
1616 def testOverlaps(self):
1617 other = ipaddress.IPv4Network('1.2.3.0/30')
1618 other2 = ipaddress.IPv4Network('1.2.2.0/24')
1619 other3 = ipaddress.IPv4Network('1.2.2.64/26')
1620 self.assertTrue(self.ipv4_network.overlaps(other))
1621 self.assertFalse(self.ipv4_network.overlaps(other2))
1622 self.assertTrue(other2.overlaps(other3))
1623
1624 def testEmbeddedIpv4(self):
1625 ipv4_string = '192.168.0.1'
1626 ipv4 = ipaddress.IPv4Interface(ipv4_string)
1627 v4compat_ipv6 = ipaddress.IPv6Interface('::%s' % ipv4_string)
1628 self.assertEqual(int(v4compat_ipv6.ip), int(ipv4.ip))
1629 v4mapped_ipv6 = ipaddress.IPv6Interface('::ffff:%s' % ipv4_string)
1630 self.assertNotEqual(v4mapped_ipv6.ip, ipv4.ip)
1631 self.assertRaises(ipaddress.AddressValueError, ipaddress.IPv6Interface,
1632 '2001:1.1.1.1:1.1.1.1')
1633
1634 # Issue 67: IPv6 with embedded IPv4 address not recognized.
1635 def testIPv6AddressTooLarge(self):
1636 # RFC4291 2.5.5.2
1637 self.assertEqual(ipaddress.ip_address('::FFFF:192.0.2.1'),
1638 ipaddress.ip_address('::FFFF:c000:201'))
1639 # RFC4291 2.2 (part 3) x::d.d.d.d
1640 self.assertEqual(ipaddress.ip_address('FFFF::192.0.2.1'),
1641 ipaddress.ip_address('FFFF::c000:201'))
1642
1643 def testIPVersion(self):
1644 self.assertEqual(self.ipv4_address.version, 4)
1645 self.assertEqual(self.ipv6_address.version, 6)
1646
1647 def testMaxPrefixLength(self):
1648 self.assertEqual(self.ipv4_interface.max_prefixlen, 32)
1649 self.assertEqual(self.ipv6_interface.max_prefixlen, 128)
1650
1651 def testPacked(self):
1652 self.assertEqual(self.ipv4_address.packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001653 b'\x01\x02\x03\x04')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001654 self.assertEqual(ipaddress.IPv4Interface('255.254.253.252').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001655 b'\xff\xfe\xfd\xfc')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001656 self.assertEqual(self.ipv6_address.packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001657 b'\x20\x01\x06\x58\x02\x2a\xca\xfe'
1658 b'\x02\x00\x00\x00\x00\x00\x00\x01')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001659 self.assertEqual(ipaddress.IPv6Interface('ffff:2:3:4:ffff::').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001660 b'\xff\xff\x00\x02\x00\x03\x00\x04\xff\xff'
1661 + b'\x00' * 6)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001662 self.assertEqual(ipaddress.IPv6Interface('::1:0:0:0:0').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001663 b'\x00' * 6 + b'\x00\x01' + b'\x00' * 8)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001664
Nick Coghlandc9b2552012-05-20 21:01:57 +10001665 def testIpType(self):
1666 ipv4net = ipaddress.ip_network('1.2.3.4')
1667 ipv4addr = ipaddress.ip_address('1.2.3.4')
1668 ipv6net = ipaddress.ip_network('::1.2.3.4')
1669 ipv6addr = ipaddress.ip_address('::1.2.3.4')
1670 self.assertEqual(ipaddress.IPv4Network, type(ipv4net))
1671 self.assertEqual(ipaddress.IPv4Address, type(ipv4addr))
1672 self.assertEqual(ipaddress.IPv6Network, type(ipv6net))
1673 self.assertEqual(ipaddress.IPv6Address, type(ipv6addr))
1674
1675 def testReservedIpv4(self):
1676 # test networks
1677 self.assertEqual(True, ipaddress.ip_interface(
1678 '224.1.1.1/31').is_multicast)
1679 self.assertEqual(False, ipaddress.ip_network('240.0.0.0').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001680 self.assertEqual(True, ipaddress.ip_network('240.0.0.0').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001681
1682 self.assertEqual(True, ipaddress.ip_interface(
1683 '192.168.1.1/17').is_private)
1684 self.assertEqual(False, ipaddress.ip_network('192.169.0.0').is_private)
1685 self.assertEqual(True, ipaddress.ip_network(
1686 '10.255.255.255').is_private)
1687 self.assertEqual(False, ipaddress.ip_network('11.0.0.0').is_private)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001688 self.assertEqual(False, ipaddress.ip_network('11.0.0.0').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001689 self.assertEqual(True, ipaddress.ip_network(
1690 '172.31.255.255').is_private)
1691 self.assertEqual(False, ipaddress.ip_network('172.32.0.0').is_private)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001692 self.assertEqual(True,
1693 ipaddress.ip_network('169.254.1.0/24').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001694
1695 self.assertEqual(True,
1696 ipaddress.ip_interface(
1697 '169.254.100.200/24').is_link_local)
1698 self.assertEqual(False,
1699 ipaddress.ip_interface(
1700 '169.255.100.200/24').is_link_local)
1701
1702 self.assertEqual(True,
1703 ipaddress.ip_network(
1704 '127.100.200.254/32').is_loopback)
1705 self.assertEqual(True, ipaddress.ip_network(
1706 '127.42.0.0/16').is_loopback)
1707 self.assertEqual(False, ipaddress.ip_network('128.0.0.0').is_loopback)
Peter Moodye5019d52013-10-24 09:47:10 -07001708 self.assertEqual(False,
1709 ipaddress.ip_network('100.64.0.0/10').is_private)
Peter Moodybe9c1b12013-10-22 12:36:21 -07001710 self.assertEqual(False, ipaddress.ip_network('100.64.0.0/10').is_global)
Peter Moodye5019d52013-10-24 09:47:10 -07001711
Peter Moody22c31762013-10-21 13:58:06 -07001712 self.assertEqual(True,
1713 ipaddress.ip_network('192.0.2.128/25').is_private)
1714 self.assertEqual(True,
1715 ipaddress.ip_network('192.0.3.0/24').is_global)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001716
1717 # test addresses
Hynek Schlawackbcd30442012-06-04 14:19:39 +02001718 self.assertEqual(True, ipaddress.ip_address('0.0.0.0').is_unspecified)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001719 self.assertEqual(True, ipaddress.ip_address('224.1.1.1').is_multicast)
1720 self.assertEqual(False, ipaddress.ip_address('240.0.0.0').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001721 self.assertEqual(True, ipaddress.ip_address('240.0.0.1').is_reserved)
1722 self.assertEqual(False,
1723 ipaddress.ip_address('239.255.255.255').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001724
1725 self.assertEqual(True, ipaddress.ip_address('192.168.1.1').is_private)
1726 self.assertEqual(False, ipaddress.ip_address('192.169.0.0').is_private)
1727 self.assertEqual(True, ipaddress.ip_address(
1728 '10.255.255.255').is_private)
1729 self.assertEqual(False, ipaddress.ip_address('11.0.0.0').is_private)
1730 self.assertEqual(True, ipaddress.ip_address(
1731 '172.31.255.255').is_private)
1732 self.assertEqual(False, ipaddress.ip_address('172.32.0.0').is_private)
1733
1734 self.assertEqual(True,
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001735 ipaddress.ip_address('169.254.100.200').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001736 self.assertEqual(False,
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001737 ipaddress.ip_address('169.255.100.200').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001738
Berker Peksag742192a2016-06-11 22:11:47 +03001739 self.assertTrue(ipaddress.ip_address('192.0.7.1').is_global)
1740 self.assertFalse(ipaddress.ip_address('203.0.113.1').is_global)
1741
Nick Coghlandc9b2552012-05-20 21:01:57 +10001742 self.assertEqual(True,
1743 ipaddress.ip_address('127.100.200.254').is_loopback)
1744 self.assertEqual(True, ipaddress.ip_address('127.42.0.0').is_loopback)
1745 self.assertEqual(False, ipaddress.ip_address('128.0.0.0').is_loopback)
1746 self.assertEqual(True, ipaddress.ip_network('0.0.0.0').is_unspecified)
1747
1748 def testReservedIpv6(self):
1749
1750 self.assertEqual(True, ipaddress.ip_network('ffff::').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001751 self.assertEqual(True, ipaddress.ip_network(2**128 - 1).is_multicast)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001752 self.assertEqual(True, ipaddress.ip_network('ff00::').is_multicast)
1753 self.assertEqual(False, ipaddress.ip_network('fdff::').is_multicast)
1754
1755 self.assertEqual(True, ipaddress.ip_network('fecf::').is_site_local)
1756 self.assertEqual(True, ipaddress.ip_network(
1757 'feff:ffff:ffff:ffff::').is_site_local)
1758 self.assertEqual(False, ipaddress.ip_network(
1759 'fbf:ffff::').is_site_local)
1760 self.assertEqual(False, ipaddress.ip_network('ff00::').is_site_local)
1761
1762 self.assertEqual(True, ipaddress.ip_network('fc00::').is_private)
1763 self.assertEqual(True, ipaddress.ip_network(
1764 'fc00:ffff:ffff:ffff::').is_private)
1765 self.assertEqual(False, ipaddress.ip_network('fbff:ffff::').is_private)
1766 self.assertEqual(False, ipaddress.ip_network('fe00::').is_private)
1767
1768 self.assertEqual(True, ipaddress.ip_network('fea0::').is_link_local)
1769 self.assertEqual(True, ipaddress.ip_network(
1770 'febf:ffff::').is_link_local)
1771 self.assertEqual(False, ipaddress.ip_network(
1772 'fe7f:ffff::').is_link_local)
1773 self.assertEqual(False, ipaddress.ip_network('fec0::').is_link_local)
1774
1775 self.assertEqual(True, ipaddress.ip_interface('0:0::0:01').is_loopback)
1776 self.assertEqual(False, ipaddress.ip_interface('::1/127').is_loopback)
1777 self.assertEqual(False, ipaddress.ip_network('::').is_loopback)
1778 self.assertEqual(False, ipaddress.ip_network('::2').is_loopback)
1779
1780 self.assertEqual(True, ipaddress.ip_network('0::0').is_unspecified)
1781 self.assertEqual(False, ipaddress.ip_network('::1').is_unspecified)
1782 self.assertEqual(False, ipaddress.ip_network('::/127').is_unspecified)
1783
Peter Moody22c31762013-10-21 13:58:06 -07001784 self.assertEqual(True,
1785 ipaddress.ip_network('2001::1/128').is_private)
1786 self.assertEqual(True,
1787 ipaddress.ip_network('200::1/128').is_global)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001788 # test addresses
1789 self.assertEqual(True, ipaddress.ip_address('ffff::').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001790 self.assertEqual(True, ipaddress.ip_address(2**128 - 1).is_multicast)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001791 self.assertEqual(True, ipaddress.ip_address('ff00::').is_multicast)
1792 self.assertEqual(False, ipaddress.ip_address('fdff::').is_multicast)
1793
1794 self.assertEqual(True, ipaddress.ip_address('fecf::').is_site_local)
1795 self.assertEqual(True, ipaddress.ip_address(
1796 'feff:ffff:ffff:ffff::').is_site_local)
1797 self.assertEqual(False, ipaddress.ip_address(
1798 'fbf:ffff::').is_site_local)
1799 self.assertEqual(False, ipaddress.ip_address('ff00::').is_site_local)
1800
1801 self.assertEqual(True, ipaddress.ip_address('fc00::').is_private)
1802 self.assertEqual(True, ipaddress.ip_address(
1803 'fc00:ffff:ffff:ffff::').is_private)
1804 self.assertEqual(False, ipaddress.ip_address('fbff:ffff::').is_private)
1805 self.assertEqual(False, ipaddress.ip_address('fe00::').is_private)
1806
1807 self.assertEqual(True, ipaddress.ip_address('fea0::').is_link_local)
1808 self.assertEqual(True, ipaddress.ip_address(
1809 'febf:ffff::').is_link_local)
1810 self.assertEqual(False, ipaddress.ip_address(
1811 'fe7f:ffff::').is_link_local)
1812 self.assertEqual(False, ipaddress.ip_address('fec0::').is_link_local)
1813
1814 self.assertEqual(True, ipaddress.ip_address('0:0::0:01').is_loopback)
1815 self.assertEqual(True, ipaddress.ip_address('::1').is_loopback)
1816 self.assertEqual(False, ipaddress.ip_address('::2').is_loopback)
1817
1818 self.assertEqual(True, ipaddress.ip_address('0::0').is_unspecified)
1819 self.assertEqual(False, ipaddress.ip_address('::1').is_unspecified)
1820
1821 # some generic IETF reserved addresses
1822 self.assertEqual(True, ipaddress.ip_address('100::').is_reserved)
1823 self.assertEqual(True, ipaddress.ip_network('4000::1/128').is_reserved)
1824
1825 def testIpv4Mapped(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001826 self.assertEqual(
1827 ipaddress.ip_address('::ffff:192.168.1.1').ipv4_mapped,
1828 ipaddress.ip_address('192.168.1.1'))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001829 self.assertEqual(ipaddress.ip_address('::c0a8:101').ipv4_mapped, None)
1830 self.assertEqual(ipaddress.ip_address('::ffff:c0a8:101').ipv4_mapped,
1831 ipaddress.ip_address('192.168.1.1'))
1832
1833 def testAddrExclude(self):
1834 addr1 = ipaddress.ip_network('10.1.1.0/24')
1835 addr2 = ipaddress.ip_network('10.1.1.0/26')
1836 addr3 = ipaddress.ip_network('10.2.1.0/24')
1837 addr4 = ipaddress.ip_address('10.1.1.0')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001838 addr5 = ipaddress.ip_network('2001:db8::0/32')
Serhiy Storchakabb0dbd52016-03-01 10:25:45 +02001839 addr6 = ipaddress.ip_network('10.1.1.5/32')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001840 self.assertEqual(sorted(list(addr1.address_exclude(addr2))),
1841 [ipaddress.ip_network('10.1.1.64/26'),
1842 ipaddress.ip_network('10.1.1.128/25')])
1843 self.assertRaises(ValueError, list, addr1.address_exclude(addr3))
1844 self.assertRaises(TypeError, list, addr1.address_exclude(addr4))
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001845 self.assertRaises(TypeError, list, addr1.address_exclude(addr5))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001846 self.assertEqual(list(addr1.address_exclude(addr1)), [])
Serhiy Storchakabb0dbd52016-03-01 10:25:45 +02001847 self.assertEqual(sorted(list(addr1.address_exclude(addr6))),
1848 [ipaddress.ip_network('10.1.1.0/30'),
1849 ipaddress.ip_network('10.1.1.4/32'),
1850 ipaddress.ip_network('10.1.1.6/31'),
1851 ipaddress.ip_network('10.1.1.8/29'),
1852 ipaddress.ip_network('10.1.1.16/28'),
1853 ipaddress.ip_network('10.1.1.32/27'),
1854 ipaddress.ip_network('10.1.1.64/26'),
1855 ipaddress.ip_network('10.1.1.128/25')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001856
1857 def testHash(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001858 self.assertEqual(hash(ipaddress.ip_interface('10.1.1.0/24')),
1859 hash(ipaddress.ip_interface('10.1.1.0/24')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001860 self.assertEqual(hash(ipaddress.ip_network('10.1.1.0/24')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001861 hash(ipaddress.ip_network('10.1.1.0/24')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001862 self.assertEqual(hash(ipaddress.ip_address('10.1.1.0')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001863 hash(ipaddress.ip_address('10.1.1.0')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001864 # i70
1865 self.assertEqual(hash(ipaddress.ip_address('1.2.3.4')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001866 hash(ipaddress.ip_address(
Nick Coghlandc9b2552012-05-20 21:01:57 +10001867 int(ipaddress.ip_address('1.2.3.4')._ip))))
1868 ip1 = ipaddress.ip_address('10.1.1.0')
1869 ip2 = ipaddress.ip_address('1::')
1870 dummy = {}
1871 dummy[self.ipv4_address] = None
1872 dummy[self.ipv6_address] = None
1873 dummy[ip1] = None
1874 dummy[ip2] = None
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001875 self.assertIn(self.ipv4_address, dummy)
1876 self.assertIn(ip2, dummy)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001877
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001878 def testIPBases(self):
1879 net = self.ipv4_network
1880 self.assertEqual('1.2.3.0/24', net.compressed)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001881 net = self.ipv6_network
1882 self.assertRaises(ValueError, net._string_from_ip_int, 2**128 + 1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001883
Hynek Schlawack454a74d2012-06-04 18:14:02 +02001884 def testIPv6NetworkHelpers(self):
1885 net = self.ipv6_network
1886 self.assertEqual('2001:658:22a:cafe::/64', net.with_prefixlen)
1887 self.assertEqual('2001:658:22a:cafe::/ffff:ffff:ffff:ffff::',
1888 net.with_netmask)
1889 self.assertEqual('2001:658:22a:cafe::/::ffff:ffff:ffff:ffff',
1890 net.with_hostmask)
1891 self.assertEqual('2001:658:22a:cafe::/64', str(net))
1892
1893 def testIPv4NetworkHelpers(self):
1894 net = self.ipv4_network
1895 self.assertEqual('1.2.3.0/24', net.with_prefixlen)
1896 self.assertEqual('1.2.3.0/255.255.255.0', net.with_netmask)
1897 self.assertEqual('1.2.3.0/0.0.0.255', net.with_hostmask)
1898 self.assertEqual('1.2.3.0/24', str(net))
1899
Nick Coghlandc9b2552012-05-20 21:01:57 +10001900 def testCopyConstructor(self):
1901 addr1 = ipaddress.ip_network('10.1.1.0/24')
1902 addr2 = ipaddress.ip_network(addr1)
1903 addr3 = ipaddress.ip_interface('2001:658:22a:cafe:200::1/64')
1904 addr4 = ipaddress.ip_interface(addr3)
1905 addr5 = ipaddress.IPv4Address('1.1.1.1')
1906 addr6 = ipaddress.IPv6Address('2001:658:22a:cafe:200::1')
1907
1908 self.assertEqual(addr1, addr2)
1909 self.assertEqual(addr3, addr4)
1910 self.assertEqual(addr5, ipaddress.IPv4Address(addr5))
1911 self.assertEqual(addr6, ipaddress.IPv6Address(addr6))
1912
1913 def testCompressIPv6Address(self):
1914 test_addresses = {
1915 '1:2:3:4:5:6:7:8': '1:2:3:4:5:6:7:8/128',
1916 '2001:0:0:4:0:0:0:8': '2001:0:0:4::8/128',
1917 '2001:0:0:4:5:6:7:8': '2001::4:5:6:7:8/128',
1918 '2001:0:3:4:5:6:7:8': '2001:0:3:4:5:6:7:8/128',
Nick Coghlandc9b2552012-05-20 21:01:57 +10001919 '0:0:3:0:0:0:0:ffff': '0:0:3::ffff/128',
1920 '0:0:0:4:0:0:0:ffff': '::4:0:0:0:ffff/128',
1921 '0:0:0:0:5:0:0:ffff': '::5:0:0:ffff/128',
1922 '1:0:0:4:0:0:7:8': '1::4:0:0:7:8/128',
1923 '0:0:0:0:0:0:0:0': '::/128',
1924 '0:0:0:0:0:0:0:0/0': '::/0',
1925 '0:0:0:0:0:0:0:1': '::1/128',
1926 '2001:0658:022a:cafe:0000:0000:0000:0000/66':
1927 '2001:658:22a:cafe::/66',
1928 '::1.2.3.4': '::102:304/128',
1929 '1:2:3:4:5:ffff:1.2.3.4': '1:2:3:4:5:ffff:102:304/128',
1930 '::7:6:5:4:3:2:1': '0:7:6:5:4:3:2:1/128',
1931 '::7:6:5:4:3:2:0': '0:7:6:5:4:3:2:0/128',
1932 '7:6:5:4:3:2:1::': '7:6:5:4:3:2:1:0/128',
1933 '0:6:5:4:3:2:1::': '0:6:5:4:3:2:1:0/128',
1934 }
1935 for uncompressed, compressed in list(test_addresses.items()):
1936 self.assertEqual(compressed, str(ipaddress.IPv6Interface(
1937 uncompressed)))
1938
1939 def testExplodeShortHandIpStr(self):
1940 addr1 = ipaddress.IPv6Interface('2001::1')
1941 addr2 = ipaddress.IPv6Address('2001:0:5ef5:79fd:0:59d:a0e5:ba1')
1942 addr3 = ipaddress.IPv6Network('2001::/96')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001943 addr4 = ipaddress.IPv4Address('192.168.178.1')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001944 self.assertEqual('2001:0000:0000:0000:0000:0000:0000:0001/128',
1945 addr1.exploded)
1946 self.assertEqual('0000:0000:0000:0000:0000:0000:0000:0001/128',
1947 ipaddress.IPv6Interface('::1/128').exploded)
1948 # issue 77
1949 self.assertEqual('2001:0000:5ef5:79fd:0000:059d:a0e5:0ba1',
1950 addr2.exploded)
1951 self.assertEqual('2001:0000:0000:0000:0000:0000:0000:0000/96',
1952 addr3.exploded)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001953 self.assertEqual('192.168.178.1', addr4.exploded)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001954
Eric V. Smithebdaaf42014-04-14 12:58:07 -04001955 def testReversePointer(self):
1956 addr1 = ipaddress.IPv4Address('127.0.0.1')
1957 addr2 = ipaddress.IPv6Address('2001:db8::1')
1958 self.assertEqual('1.0.0.127.in-addr.arpa', addr1.reverse_pointer)
1959 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.' +
1960 'b.d.0.1.0.0.2.ip6.arpa',
1961 addr2.reverse_pointer)
1962
Nick Coghlandc9b2552012-05-20 21:01:57 +10001963 def testIntRepresentation(self):
1964 self.assertEqual(16909060, int(self.ipv4_address))
1965 self.assertEqual(42540616829182469433547762482097946625,
1966 int(self.ipv6_address))
1967
Nick Coghlandc9b2552012-05-20 21:01:57 +10001968 def testForceVersion(self):
1969 self.assertEqual(ipaddress.ip_network(1).version, 4)
Nick Coghlan51c30672012-05-27 00:25:58 +10001970 self.assertEqual(ipaddress.IPv6Network(1).version, 6)
Sandro Tosi876ecad2012-05-23 22:26:55 +02001971
Nick Coghlandc9b2552012-05-20 21:01:57 +10001972 def testWithStar(self):
Nick Coghlana8517ad2012-08-20 10:04:26 +10001973 self.assertEqual(self.ipv4_interface.with_prefixlen, "1.2.3.4/24")
1974 self.assertEqual(self.ipv4_interface.with_netmask,
Nick Coghlandc9b2552012-05-20 21:01:57 +10001975 "1.2.3.4/255.255.255.0")
Nick Coghlana8517ad2012-08-20 10:04:26 +10001976 self.assertEqual(self.ipv4_interface.with_hostmask,
Nick Coghlandc9b2552012-05-20 21:01:57 +10001977 "1.2.3.4/0.0.0.255")
1978
Nick Coghlana8517ad2012-08-20 10:04:26 +10001979 self.assertEqual(self.ipv6_interface.with_prefixlen,
Nick Coghlandc9b2552012-05-20 21:01:57 +10001980 '2001:658:22a:cafe:200::1/64')
Nick Coghlana8517ad2012-08-20 10:04:26 +10001981 self.assertEqual(self.ipv6_interface.with_netmask,
1982 '2001:658:22a:cafe:200::1/ffff:ffff:ffff:ffff::')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001983 # this probably don't make much sense, but it's included for
1984 # compatibility with ipv4
Nick Coghlana8517ad2012-08-20 10:04:26 +10001985 self.assertEqual(self.ipv6_interface.with_hostmask,
Nick Coghlandc9b2552012-05-20 21:01:57 +10001986 '2001:658:22a:cafe:200::1/::ffff:ffff:ffff:ffff')
1987
1988 def testNetworkElementCaching(self):
1989 # V4 - make sure we're empty
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001990 self.assertNotIn('network_address', self.ipv4_network._cache)
1991 self.assertNotIn('broadcast_address', self.ipv4_network._cache)
1992 self.assertNotIn('hostmask', self.ipv4_network._cache)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001993
1994 # V4 - populate and test
1995 self.assertEqual(self.ipv4_network.network_address,
1996 ipaddress.IPv4Address('1.2.3.0'))
1997 self.assertEqual(self.ipv4_network.broadcast_address,
1998 ipaddress.IPv4Address('1.2.3.255'))
1999 self.assertEqual(self.ipv4_network.hostmask,
2000 ipaddress.IPv4Address('0.0.0.255'))
2001
2002 # V4 - check we're cached
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02002003 self.assertIn('broadcast_address', self.ipv4_network._cache)
2004 self.assertIn('hostmask', self.ipv4_network._cache)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002005
2006 # V6 - make sure we're empty
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02002007 self.assertNotIn('broadcast_address', self.ipv6_network._cache)
2008 self.assertNotIn('hostmask', self.ipv6_network._cache)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002009
2010 # V6 - populate and test
2011 self.assertEqual(self.ipv6_network.network_address,
2012 ipaddress.IPv6Address('2001:658:22a:cafe::'))
2013 self.assertEqual(self.ipv6_interface.network.network_address,
2014 ipaddress.IPv6Address('2001:658:22a:cafe::'))
2015
2016 self.assertEqual(
2017 self.ipv6_network.broadcast_address,
2018 ipaddress.IPv6Address('2001:658:22a:cafe:ffff:ffff:ffff:ffff'))
2019 self.assertEqual(self.ipv6_network.hostmask,
2020 ipaddress.IPv6Address('::ffff:ffff:ffff:ffff'))
2021 self.assertEqual(
2022 self.ipv6_interface.network.broadcast_address,
2023 ipaddress.IPv6Address('2001:658:22a:cafe:ffff:ffff:ffff:ffff'))
2024 self.assertEqual(self.ipv6_interface.network.hostmask,
2025 ipaddress.IPv6Address('::ffff:ffff:ffff:ffff'))
2026
2027 # V6 - check we're cached
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02002028 self.assertIn('broadcast_address', self.ipv6_network._cache)
2029 self.assertIn('hostmask', self.ipv6_network._cache)
2030 self.assertIn('broadcast_address', self.ipv6_interface.network._cache)
2031 self.assertIn('hostmask', self.ipv6_interface.network._cache)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002032
2033 def testTeredo(self):
2034 # stolen from wikipedia
2035 server = ipaddress.IPv4Address('65.54.227.120')
2036 client = ipaddress.IPv4Address('192.0.2.45')
2037 teredo_addr = '2001:0000:4136:e378:8000:63bf:3fff:fdd2'
2038 self.assertEqual((server, client),
2039 ipaddress.ip_address(teredo_addr).teredo)
2040 bad_addr = '2000::4136:e378:8000:63bf:3fff:fdd2'
2041 self.assertFalse(ipaddress.ip_address(bad_addr).teredo)
2042 bad_addr = '2001:0001:4136:e378:8000:63bf:3fff:fdd2'
2043 self.assertFalse(ipaddress.ip_address(bad_addr).teredo)
2044
2045 # i77
2046 teredo_addr = ipaddress.IPv6Address('2001:0:5ef5:79fd:0:59d:a0e5:ba1')
2047 self.assertEqual((ipaddress.IPv4Address('94.245.121.253'),
2048 ipaddress.IPv4Address('95.26.244.94')),
2049 teredo_addr.teredo)
2050
Nick Coghlandc9b2552012-05-20 21:01:57 +10002051 def testsixtofour(self):
2052 sixtofouraddr = ipaddress.ip_address('2002:ac1d:2d64::1')
2053 bad_addr = ipaddress.ip_address('2000:ac1d:2d64::1')
2054 self.assertEqual(ipaddress.IPv4Address('172.29.45.100'),
2055 sixtofouraddr.sixtofour)
2056 self.assertFalse(bad_addr.sixtofour)
2057
Nick Coghlandc9b2552012-05-20 21:01:57 +10002058
2059if __name__ == '__main__':
2060 unittest.main()