blob: 82daaff4d77521e61a22a09fe437ca1174c19479 [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
Joel Croteaue653d4d2019-03-30 07:53:48 -070095
Nick Coghlan07c4e332012-07-08 23:06:45 +100096class CommonTestMixin_v4(CommonTestMixin):
97
98 def test_leading_zeros(self):
99 self.assertInstancesEqual("000.000.000.000", "0.0.0.0")
100 self.assertInstancesEqual("192.168.000.001", "192.168.0.1")
Joel Croteaue653d4d2019-03-30 07:53:48 -0700101 self.assertInstancesEqual("016.016.016.016", "16.16.16.16")
102 self.assertInstancesEqual("001.000.008.016", "1.0.8.16")
Nick Coghlan07c4e332012-07-08 23:06:45 +1000103
104 def test_int(self):
105 self.assertInstancesEqual(0, "0.0.0.0")
106 self.assertInstancesEqual(3232235521, "192.168.0.1")
107
108 def test_packed(self):
109 self.assertInstancesEqual(bytes.fromhex("00000000"), "0.0.0.0")
110 self.assertInstancesEqual(bytes.fromhex("c0a80001"), "192.168.0.1")
Nick Coghlan297b1432012-07-08 17:11:04 +1000111
112 def test_negative_ints_rejected(self):
113 msg = "-1 (< 0) is not permitted as an IPv4 address"
114 with self.assertAddressError(re.escape(msg)):
115 self.factory(-1)
116
117 def test_large_ints_rejected(self):
118 msg = "%d (>= 2**32) is not permitted as an IPv4 address"
119 with self.assertAddressError(re.escape(msg % 2**32)):
120 self.factory(2**32)
121
122 def test_bad_packed_length(self):
123 def assertBadLength(length):
Serhiy Storchaka5f1a5182016-09-11 14:41:02 +0300124 addr = b'\0' * length
Nick Coghlan297b1432012-07-08 17:11:04 +1000125 msg = "%r (len %d != 4) is not permitted as an IPv4 address"
126 with self.assertAddressError(re.escape(msg % (addr, length))):
127 self.factory(addr)
128
129 assertBadLength(3)
130 assertBadLength(5)
131
R David Murray75678652014-10-12 15:17:22 -0400132
Nick Coghlan07c4e332012-07-08 23:06:45 +1000133class CommonTestMixin_v6(CommonTestMixin):
134
135 def test_leading_zeros(self):
136 self.assertInstancesEqual("0000::0000", "::")
137 self.assertInstancesEqual("000::c0a8:0001", "::c0a8:1")
138
139 def test_int(self):
140 self.assertInstancesEqual(0, "::")
141 self.assertInstancesEqual(3232235521, "::c0a8:1")
142
143 def test_packed(self):
Serhiy Storchaka5f1a5182016-09-11 14:41:02 +0300144 addr = b'\0'*12 + bytes.fromhex("00000000")
Nick Coghlan07c4e332012-07-08 23:06:45 +1000145 self.assertInstancesEqual(addr, "::")
Serhiy Storchaka5f1a5182016-09-11 14:41:02 +0300146 addr = b'\0'*12 + bytes.fromhex("c0a80001")
Nick Coghlan07c4e332012-07-08 23:06:45 +1000147 self.assertInstancesEqual(addr, "::c0a8:1")
Serhiy Storchaka5f1a5182016-09-11 14:41:02 +0300148 addr = bytes.fromhex("c0a80001") + b'\0'*12
Nick Coghlan07c4e332012-07-08 23:06:45 +1000149 self.assertInstancesEqual(addr, "c0a8:1::")
Nick Coghlan297b1432012-07-08 17:11:04 +1000150
151 def test_negative_ints_rejected(self):
152 msg = "-1 (< 0) is not permitted as an IPv6 address"
153 with self.assertAddressError(re.escape(msg)):
154 self.factory(-1)
155
156 def test_large_ints_rejected(self):
157 msg = "%d (>= 2**128) is not permitted as an IPv6 address"
158 with self.assertAddressError(re.escape(msg % 2**128)):
159 self.factory(2**128)
160
161 def test_bad_packed_length(self):
162 def assertBadLength(length):
Serhiy Storchaka5f1a5182016-09-11 14:41:02 +0300163 addr = b'\0' * length
Nick Coghlan297b1432012-07-08 17:11:04 +1000164 msg = "%r (len %d != 16) is not permitted as an IPv6 address"
165 with self.assertAddressError(re.escape(msg % (addr, length))):
166 self.factory(addr)
167 self.factory(addr)
168
169 assertBadLength(15)
170 assertBadLength(17)
171
172
Nick Coghlan07c4e332012-07-08 23:06:45 +1000173class AddressTestCase_v4(BaseTestCase, CommonTestMixin_v4):
Nick Coghlan297b1432012-07-08 17:11:04 +1000174 factory = ipaddress.IPv4Address
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000175
176 def test_network_passed_as_address(self):
177 addr = "127.0.0.1/24"
178 with self.assertAddressError("Unexpected '/' in %r", addr):
179 ipaddress.IPv4Address(addr)
180
181 def test_bad_address_split(self):
182 def assertBadSplit(addr):
183 with self.assertAddressError("Expected 4 octets in %r", addr):
184 ipaddress.IPv4Address(addr)
185
186 assertBadSplit("127.0.1")
187 assertBadSplit("42.42.42.42.42")
188 assertBadSplit("42.42.42")
189 assertBadSplit("42.42")
190 assertBadSplit("42")
191 assertBadSplit("42..42.42.42")
192 assertBadSplit("42.42.42.42.")
193 assertBadSplit("42.42.42.42...")
194 assertBadSplit(".42.42.42.42")
195 assertBadSplit("...42.42.42.42")
196 assertBadSplit("016.016.016")
197 assertBadSplit("016.016")
198 assertBadSplit("016")
199 assertBadSplit("000")
200 assertBadSplit("0x0a.0x0a.0x0a")
201 assertBadSplit("0x0a.0x0a")
202 assertBadSplit("0x0a")
203 assertBadSplit(".")
204 assertBadSplit("bogus")
205 assertBadSplit("bogus.com")
206 assertBadSplit("1000")
207 assertBadSplit("1000000000000000")
208 assertBadSplit("192.168.0.1.com")
209
210 def test_empty_octet(self):
211 def assertBadOctet(addr):
212 with self.assertAddressError("Empty octet not permitted in %r",
R David Murray75678652014-10-12 15:17:22 -0400213 addr):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000214 ipaddress.IPv4Address(addr)
215
216 assertBadOctet("42..42.42")
217 assertBadOctet("...")
218
219 def test_invalid_characters(self):
220 def assertBadOctet(addr, octet):
221 msg = "Only decimal digits permitted in %r in %r" % (octet, addr)
222 with self.assertAddressError(re.escape(msg)):
223 ipaddress.IPv4Address(addr)
224
225 assertBadOctet("0x0a.0x0a.0x0a.0x0a", "0x0a")
Nick Coghlan07c4e332012-07-08 23:06:45 +1000226 assertBadOctet("0xa.0x0a.0x0a.0x0a", "0xa")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000227 assertBadOctet("42.42.42.-0", "-0")
228 assertBadOctet("42.42.42.+0", "+0")
229 assertBadOctet("42.42.42.-42", "-42")
230 assertBadOctet("+1.+2.+3.4", "+1")
231 assertBadOctet("1.2.3.4e0", "4e0")
232 assertBadOctet("1.2.3.4::", "4::")
233 assertBadOctet("1.a.2.3", "a")
234
Nick Coghlan07c4e332012-07-08 23:06:45 +1000235 def test_octet_length(self):
236 def assertBadOctet(addr, octet):
237 msg = "At most 3 characters permitted in %r in %r"
238 with self.assertAddressError(re.escape(msg % (octet, addr))):
239 ipaddress.IPv4Address(addr)
240
241 assertBadOctet("0000.000.000.000", "0000")
242 assertBadOctet("12345.67899.-54321.-98765", "12345")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000243
244 def test_octet_limit(self):
245 def assertBadOctet(addr, octet):
Nick Coghlanb582ecc2012-07-07 22:15:22 +1000246 msg = "Octet %d (> 255) not permitted in %r" % (octet, addr)
247 with self.assertAddressError(re.escape(msg)):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000248 ipaddress.IPv4Address(addr)
249
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000250 assertBadOctet("257.0.0.0", 257)
Nick Coghlan07c4e332012-07-08 23:06:45 +1000251 assertBadOctet("192.168.0.999", 999)
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000252
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +0200253 def test_pickle(self):
254 self.pickle_test('192.0.2.1')
255
Serhiy Storchaka88f64f32015-03-07 20:08:34 +0200256 def test_weakref(self):
257 weakref.ref(self.factory('192.0.2.1'))
258
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000259
Nick Coghlan07c4e332012-07-08 23:06:45 +1000260class AddressTestCase_v6(BaseTestCase, CommonTestMixin_v6):
Nick Coghlan297b1432012-07-08 17:11:04 +1000261 factory = ipaddress.IPv6Address
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000262
263 def test_network_passed_as_address(self):
264 addr = "::1/24"
265 with self.assertAddressError("Unexpected '/' in %r", addr):
266 ipaddress.IPv6Address(addr)
267
268 def test_bad_address_split_v6_not_enough_parts(self):
269 def assertBadSplit(addr):
270 msg = "At least 3 parts expected in %r"
271 with self.assertAddressError(msg, addr):
272 ipaddress.IPv6Address(addr)
273
274 assertBadSplit(":")
275 assertBadSplit(":1")
276 assertBadSplit("FEDC:9878")
277
278 def test_bad_address_split_v6_too_many_colons(self):
279 def assertBadSplit(addr):
280 msg = "At most 8 colons permitted in %r"
281 with self.assertAddressError(msg, addr):
282 ipaddress.IPv6Address(addr)
283
284 assertBadSplit("9:8:7:6:5:4:3::2:1")
285 assertBadSplit("10:9:8:7:6:5:4:3:2:1")
286 assertBadSplit("::8:7:6:5:4:3:2:1")
287 assertBadSplit("8:7:6:5:4:3:2:1::")
288 # A trailing IPv4 address is two parts
289 assertBadSplit("10:9:8:7:6:5:4:3:42.42.42.42")
290
291 def test_bad_address_split_v6_too_many_parts(self):
292 def assertBadSplit(addr):
293 msg = "Exactly 8 parts expected without '::' in %r"
294 with self.assertAddressError(msg, addr):
295 ipaddress.IPv6Address(addr)
296
297 assertBadSplit("3ffe:0:0:0:0:0:0:0:1")
298 assertBadSplit("9:8:7:6:5:4:3:2:1")
299 assertBadSplit("7:6:5:4:3:2:1")
300 # A trailing IPv4 address is two parts
301 assertBadSplit("9:8:7:6:5:4:3:42.42.42.42")
302 assertBadSplit("7:6:5:4:3:42.42.42.42")
303
304 def test_bad_address_split_v6_too_many_parts_with_double_colon(self):
305 def assertBadSplit(addr):
306 msg = "Expected at most 7 other parts with '::' in %r"
307 with self.assertAddressError(msg, addr):
308 ipaddress.IPv6Address(addr)
309
310 assertBadSplit("1:2:3:4::5:6:7:8")
311
312 def test_bad_address_split_v6_repeated_double_colon(self):
313 def assertBadSplit(addr):
314 msg = "At most one '::' permitted in %r"
315 with self.assertAddressError(msg, addr):
316 ipaddress.IPv6Address(addr)
317
318 assertBadSplit("3ffe::1::1")
319 assertBadSplit("1::2::3::4:5")
320 assertBadSplit("2001::db:::1")
321 assertBadSplit("3ffe::1::")
322 assertBadSplit("::3ffe::1")
323 assertBadSplit(":3ffe::1::1")
324 assertBadSplit("3ffe::1::1:")
325 assertBadSplit(":3ffe::1::1:")
326 assertBadSplit(":::")
327 assertBadSplit('2001:db8:::1')
328
329 def test_bad_address_split_v6_leading_colon(self):
330 def assertBadSplit(addr):
331 msg = "Leading ':' only permitted as part of '::' in %r"
332 with self.assertAddressError(msg, addr):
333 ipaddress.IPv6Address(addr)
334
335 assertBadSplit(":2001:db8::1")
336 assertBadSplit(":1:2:3:4:5:6:7")
337 assertBadSplit(":1:2:3:4:5:6:")
338 assertBadSplit(":6:5:4:3:2:1::")
339
340 def test_bad_address_split_v6_trailing_colon(self):
341 def assertBadSplit(addr):
342 msg = "Trailing ':' only permitted as part of '::' in %r"
343 with self.assertAddressError(msg, addr):
344 ipaddress.IPv6Address(addr)
345
346 assertBadSplit("2001:db8::1:")
347 assertBadSplit("1:2:3:4:5:6:7:")
348 assertBadSplit("::1.2.3.4:")
349 assertBadSplit("::7:6:5:4:3:2:")
350
351 def test_bad_v4_part_in(self):
352 def assertBadAddressPart(addr, v4_error):
353 with self.assertAddressError("%s in %r", v4_error, addr):
354 ipaddress.IPv6Address(addr)
355
356 assertBadAddressPart("3ffe::1.net", "Expected 4 octets in '1.net'")
357 assertBadAddressPart("3ffe::127.0.1",
358 "Expected 4 octets in '127.0.1'")
359 assertBadAddressPart("::1.2.3",
360 "Expected 4 octets in '1.2.3'")
361 assertBadAddressPart("::1.2.3.4.5",
362 "Expected 4 octets in '1.2.3.4.5'")
363 assertBadAddressPart("3ffe::1.1.1.net",
364 "Only decimal digits permitted in 'net' "
365 "in '1.1.1.net'")
366
367 def test_invalid_characters(self):
368 def assertBadPart(addr, part):
369 msg = "Only hex digits permitted in %r in %r" % (part, addr)
370 with self.assertAddressError(re.escape(msg)):
371 ipaddress.IPv6Address(addr)
372
373 assertBadPart("3ffe::goog", "goog")
374 assertBadPart("3ffe::-0", "-0")
375 assertBadPart("3ffe::+0", "+0")
376 assertBadPart("3ffe::-1", "-1")
377 assertBadPart("1.2.3.4::", "1.2.3.4")
378 assertBadPart('1234:axy::b', "axy")
379
380 def test_part_length(self):
381 def assertBadPart(addr, part):
382 msg = "At most 4 characters permitted in %r in %r"
383 with self.assertAddressError(msg, part, addr):
384 ipaddress.IPv6Address(addr)
385
Nick Coghlan07c4e332012-07-08 23:06:45 +1000386 assertBadPart("::00000", "00000")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000387 assertBadPart("3ffe::10000", "10000")
388 assertBadPart("02001:db8::", "02001")
389 assertBadPart('2001:888888::1', "888888")
390
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +0200391 def test_pickle(self):
392 self.pickle_test('2001:db8::')
393
Serhiy Storchaka88f64f32015-03-07 20:08:34 +0200394 def test_weakref(self):
395 weakref.ref(self.factory('2001:db8::'))
396
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000397
Nick Coghlan07c4e332012-07-08 23:06:45 +1000398class NetmaskTestMixin_v4(CommonTestMixin_v4):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000399 """Input validation on interfaces and networks is very similar"""
400
Cheryl Sabella5609b782018-03-20 20:09:15 -0400401 def test_no_mask(self):
402 self.assertEqual(str(self.factory('1.2.3.4')), '1.2.3.4/32')
403
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000404 def test_split_netmask(self):
405 addr = "1.2.3.4/32/24"
406 with self.assertAddressError("Only one '/' permitted in %r" % addr):
407 self.factory(addr)
408
409 def test_address_errors(self):
410 def assertBadAddress(addr, details):
411 with self.assertAddressError(details):
412 self.factory(addr)
413
Nick Coghlan297b1432012-07-08 17:11:04 +1000414 assertBadAddress("/", "Address cannot be empty")
415 assertBadAddress("/8", "Address cannot be empty")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000416 assertBadAddress("bogus", "Expected 4 octets")
417 assertBadAddress("google.com", "Expected 4 octets")
418 assertBadAddress("10/8", "Expected 4 octets")
419 assertBadAddress("::1.2.3.4", "Only decimal digits")
Nick Coghlanb582ecc2012-07-07 22:15:22 +1000420 assertBadAddress("1.2.3.256", re.escape("256 (> 255)"))
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000421
Nick Coghlan932346f2014-02-08 23:17:36 +1000422 def test_valid_netmask(self):
423 self.assertEqual(str(self.factory('192.0.2.0/255.255.255.0')),
424 '192.0.2.0/24')
425 for i in range(0, 33):
426 # Generate and re-parse the CIDR format (trivial).
427 net_str = '0.0.0.0/%d' % i
428 net = self.factory(net_str)
429 self.assertEqual(str(net), net_str)
430 # Generate and re-parse the expanded netmask.
431 self.assertEqual(
432 str(self.factory('0.0.0.0/%s' % net.netmask)), net_str)
433 # Zero prefix is treated as decimal.
434 self.assertEqual(str(self.factory('0.0.0.0/0%d' % i)), net_str)
435 # Generate and re-parse the expanded hostmask. The ambiguous
436 # cases (/0 and /32) are treated as netmasks.
437 if i in (32, 0):
438 net_str = '0.0.0.0/%d' % (32 - i)
439 self.assertEqual(
440 str(self.factory('0.0.0.0/%s' % net.hostmask)), net_str)
441
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000442 def test_netmask_errors(self):
443 def assertBadNetmask(addr, netmask):
Nick Coghlan932346f2014-02-08 23:17:36 +1000444 msg = "%r is not a valid netmask" % netmask
445 with self.assertNetmaskError(re.escape(msg)):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000446 self.factory("%s/%s" % (addr, netmask))
447
448 assertBadNetmask("1.2.3.4", "")
Nick Coghlan932346f2014-02-08 23:17:36 +1000449 assertBadNetmask("1.2.3.4", "-1")
450 assertBadNetmask("1.2.3.4", "+1")
451 assertBadNetmask("1.2.3.4", " 1 ")
452 assertBadNetmask("1.2.3.4", "0x1")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000453 assertBadNetmask("1.2.3.4", "33")
454 assertBadNetmask("1.2.3.4", "254.254.255.256")
Nick Coghlan932346f2014-02-08 23:17:36 +1000455 assertBadNetmask("1.2.3.4", "1.a.2.3")
Nick Coghlan07c4e332012-07-08 23:06:45 +1000456 assertBadNetmask("1.1.1.1", "254.xyz.2.3")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000457 assertBadNetmask("1.1.1.1", "240.255.0.0")
Nick Coghlan932346f2014-02-08 23:17:36 +1000458 assertBadNetmask("1.1.1.1", "255.254.128.0")
459 assertBadNetmask("1.1.1.1", "0.1.127.255")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000460 assertBadNetmask("1.1.1.1", "pudding")
Nick Coghlan932346f2014-02-08 23:17:36 +1000461 assertBadNetmask("1.1.1.1", "::")
462
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +0200463 def test_pickle(self):
464 self.pickle_test('192.0.2.0/27')
465 self.pickle_test('192.0.2.0/31') # IPV4LENGTH - 1
466 self.pickle_test('192.0.2.0') # IPV4LENGTH
467
R David Murray75678652014-10-12 15:17:22 -0400468
Serhiy Storchakaa556af72015-01-18 22:56:47 +0200469class InterfaceTestCase_v4(BaseTestCase, NetmaskTestMixin_v4):
470 factory = ipaddress.IPv4Interface
471
472
Nick Coghlan07c4e332012-07-08 23:06:45 +1000473class NetworkTestCase_v4(BaseTestCase, NetmaskTestMixin_v4):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000474 factory = ipaddress.IPv4Network
475
Cheryl Sabella91dc64b2017-10-22 17:39:49 -0400476 def test_subnet_of(self):
477 # containee left of container
478 self.assertFalse(
479 self.factory('10.0.0.0/30').subnet_of(
480 self.factory('10.0.1.0/24')))
481 # containee inside container
482 self.assertTrue(
483 self.factory('10.0.0.0/30').subnet_of(
484 self.factory('10.0.0.0/24')))
485 # containee right of container
486 self.assertFalse(
487 self.factory('10.0.0.0/30').subnet_of(
488 self.factory('10.0.1.0/24')))
489 # containee larger than container
490 self.assertFalse(
491 self.factory('10.0.1.0/24').subnet_of(
492 self.factory('10.0.0.0/30')))
493
494 def test_supernet_of(self):
495 # containee left of container
496 self.assertFalse(
497 self.factory('10.0.0.0/30').supernet_of(
498 self.factory('10.0.1.0/24')))
499 # containee inside container
500 self.assertFalse(
501 self.factory('10.0.0.0/30').supernet_of(
502 self.factory('10.0.0.0/24')))
503 # containee right of container
504 self.assertFalse(
505 self.factory('10.0.0.0/30').supernet_of(
506 self.factory('10.0.1.0/24')))
507 # containee larger than container
508 self.assertTrue(
509 self.factory('10.0.0.0/24').supernet_of(
510 self.factory('10.0.0.0/30')))
511
512 def test_subnet_of_mixed_types(self):
513 with self.assertRaises(TypeError):
514 ipaddress.IPv4Network('10.0.0.0/30').supernet_of(
515 ipaddress.IPv6Network('::1/128'))
516 with self.assertRaises(TypeError):
517 ipaddress.IPv6Network('::1/128').supernet_of(
518 ipaddress.IPv4Network('10.0.0.0/30'))
519 with self.assertRaises(TypeError):
520 ipaddress.IPv4Network('10.0.0.0/30').subnet_of(
521 ipaddress.IPv6Network('::1/128'))
522 with self.assertRaises(TypeError):
523 ipaddress.IPv6Network('::1/128').subnet_of(
524 ipaddress.IPv4Network('10.0.0.0/30'))
525
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000526
Nick Coghlan07c4e332012-07-08 23:06:45 +1000527class NetmaskTestMixin_v6(CommonTestMixin_v6):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000528 """Input validation on interfaces and networks is very similar"""
529
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000530 def test_split_netmask(self):
531 addr = "cafe:cafe::/128/190"
532 with self.assertAddressError("Only one '/' permitted in %r" % addr):
533 self.factory(addr)
534
535 def test_address_errors(self):
536 def assertBadAddress(addr, details):
537 with self.assertAddressError(details):
538 self.factory(addr)
539
Nick Coghlan297b1432012-07-08 17:11:04 +1000540 assertBadAddress("/", "Address cannot be empty")
541 assertBadAddress("/8", "Address cannot be empty")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000542 assertBadAddress("google.com", "At least 3 parts")
543 assertBadAddress("1.2.3.4", "At least 3 parts")
544 assertBadAddress("10/8", "At least 3 parts")
545 assertBadAddress("1234:axy::b", "Only hex digits")
546
Nick Coghlan932346f2014-02-08 23:17:36 +1000547 def test_valid_netmask(self):
548 # We only support CIDR for IPv6, because expanded netmasks are not
549 # standard notation.
550 self.assertEqual(str(self.factory('2001:db8::/32')), '2001:db8::/32')
551 for i in range(0, 129):
552 # Generate and re-parse the CIDR format (trivial).
553 net_str = '::/%d' % i
554 self.assertEqual(str(self.factory(net_str)), net_str)
555 # Zero prefix is treated as decimal.
556 self.assertEqual(str(self.factory('::/0%d' % i)), net_str)
557
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000558 def test_netmask_errors(self):
559 def assertBadNetmask(addr, netmask):
Nick Coghlan932346f2014-02-08 23:17:36 +1000560 msg = "%r is not a valid netmask" % netmask
561 with self.assertNetmaskError(re.escape(msg)):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000562 self.factory("%s/%s" % (addr, netmask))
563
564 assertBadNetmask("::1", "")
565 assertBadNetmask("::1", "::1")
566 assertBadNetmask("::1", "1::")
Nick Coghlan932346f2014-02-08 23:17:36 +1000567 assertBadNetmask("::1", "-1")
568 assertBadNetmask("::1", "+1")
569 assertBadNetmask("::1", " 1 ")
570 assertBadNetmask("::1", "0x1")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000571 assertBadNetmask("::1", "129")
Nick Coghlan932346f2014-02-08 23:17:36 +1000572 assertBadNetmask("::1", "1.2.3.4")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000573 assertBadNetmask("::1", "pudding")
Nick Coghlan932346f2014-02-08 23:17:36 +1000574 assertBadNetmask("::", "::")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000575
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +0200576 def test_pickle(self):
577 self.pickle_test('2001:db8::1000/124')
578 self.pickle_test('2001:db8::1000/127') # IPV6LENGTH - 1
579 self.pickle_test('2001:db8::1000') # IPV6LENGTH
580
R David Murray75678652014-10-12 15:17:22 -0400581
Nick Coghlan07c4e332012-07-08 23:06:45 +1000582class InterfaceTestCase_v6(BaseTestCase, NetmaskTestMixin_v6):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000583 factory = ipaddress.IPv6Interface
584
R David Murray75678652014-10-12 15:17:22 -0400585
Nick Coghlan07c4e332012-07-08 23:06:45 +1000586class NetworkTestCase_v6(BaseTestCase, NetmaskTestMixin_v6):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000587 factory = ipaddress.IPv6Network
588
Cheryl Sabella91dc64b2017-10-22 17:39:49 -0400589 def test_subnet_of(self):
590 # containee left of container
591 self.assertFalse(
592 self.factory('2000:999::/56').subnet_of(
593 self.factory('2000:aaa::/48')))
594 # containee inside container
595 self.assertTrue(
596 self.factory('2000:aaa::/56').subnet_of(
597 self.factory('2000:aaa::/48')))
598 # containee right of container
599 self.assertFalse(
600 self.factory('2000:bbb::/56').subnet_of(
601 self.factory('2000:aaa::/48')))
602 # containee larger than container
603 self.assertFalse(
604 self.factory('2000:aaa::/48').subnet_of(
605 self.factory('2000:aaa::/56')))
606
607 def test_supernet_of(self):
608 # containee left of container
609 self.assertFalse(
610 self.factory('2000:999::/56').supernet_of(
611 self.factory('2000:aaa::/48')))
612 # containee inside container
613 self.assertFalse(
614 self.factory('2000:aaa::/56').supernet_of(
615 self.factory('2000:aaa::/48')))
616 # containee right of container
617 self.assertFalse(
618 self.factory('2000:bbb::/56').supernet_of(
619 self.factory('2000:aaa::/48')))
620 # containee larger than container
621 self.assertTrue(
622 self.factory('2000:aaa::/48').supernet_of(
623 self.factory('2000:aaa::/56')))
624
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000625
Nick Coghlan07c4e332012-07-08 23:06:45 +1000626class FactoryFunctionErrors(BaseTestCase):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000627
628 def assertFactoryError(self, factory, kind):
629 """Ensure a clean ValueError with the expected message"""
630 addr = "camelot"
631 msg = '%r does not appear to be an IPv4 or IPv6 %s'
632 with self.assertCleanError(ValueError, msg, addr, kind):
633 factory(addr)
634
635 def test_ip_address(self):
636 self.assertFactoryError(ipaddress.ip_address, "address")
637
638 def test_ip_interface(self):
639 self.assertFactoryError(ipaddress.ip_interface, "interface")
640
641 def test_ip_network(self):
642 self.assertFactoryError(ipaddress.ip_network, "network")
643
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200644
Serhiy Storchakaf186e122015-01-26 10:11:16 +0200645@functools.total_ordering
646class LargestObject:
647 def __eq__(self, other):
648 return isinstance(other, LargestObject)
649 def __lt__(self, other):
650 return False
651
652@functools.total_ordering
653class SmallestObject:
654 def __eq__(self, other):
655 return isinstance(other, SmallestObject)
656 def __gt__(self, other):
657 return False
658
Nick Coghlan3008ec02012-07-08 00:45:33 +1000659class ComparisonTests(unittest.TestCase):
660
661 v4addr = ipaddress.IPv4Address(1)
662 v4net = ipaddress.IPv4Network(1)
663 v4intf = ipaddress.IPv4Interface(1)
664 v6addr = ipaddress.IPv6Address(1)
665 v6net = ipaddress.IPv6Network(1)
666 v6intf = ipaddress.IPv6Interface(1)
667
668 v4_addresses = [v4addr, v4intf]
669 v4_objects = v4_addresses + [v4net]
670 v6_addresses = [v6addr, v6intf]
671 v6_objects = v6_addresses + [v6net]
R David Murray947ff382016-06-02 15:46:04 -0400672
Nick Coghlan3008ec02012-07-08 00:45:33 +1000673 objects = v4_objects + v6_objects
674
R David Murray947ff382016-06-02 15:46:04 -0400675 v4addr2 = ipaddress.IPv4Address(2)
676 v4net2 = ipaddress.IPv4Network(2)
677 v4intf2 = ipaddress.IPv4Interface(2)
678 v6addr2 = ipaddress.IPv6Address(2)
679 v6net2 = ipaddress.IPv6Network(2)
680 v6intf2 = ipaddress.IPv6Interface(2)
681
Nick Coghlan3008ec02012-07-08 00:45:33 +1000682 def test_foreign_type_equality(self):
683 # __eq__ should never raise TypeError directly
684 other = object()
685 for obj in self.objects:
686 self.assertNotEqual(obj, other)
687 self.assertFalse(obj == other)
688 self.assertEqual(obj.__eq__(other), NotImplemented)
689 self.assertEqual(obj.__ne__(other), NotImplemented)
690
691 def test_mixed_type_equality(self):
692 # Ensure none of the internal objects accidentally
693 # expose the right set of attributes to become "equal"
694 for lhs in self.objects:
695 for rhs in self.objects:
696 if lhs is rhs:
697 continue
698 self.assertNotEqual(lhs, rhs)
699
R David Murray947ff382016-06-02 15:46:04 -0400700 def test_same_type_equality(self):
701 for obj in self.objects:
702 self.assertEqual(obj, obj)
703 self.assertLessEqual(obj, obj)
704 self.assertGreaterEqual(obj, obj)
705
706 def test_same_type_ordering(self):
707 for lhs, rhs in (
708 (self.v4addr, self.v4addr2),
709 (self.v4net, self.v4net2),
710 (self.v4intf, self.v4intf2),
711 (self.v6addr, self.v6addr2),
712 (self.v6net, self.v6net2),
713 (self.v6intf, self.v6intf2),
714 ):
715 self.assertNotEqual(lhs, rhs)
716 self.assertLess(lhs, rhs)
717 self.assertLessEqual(lhs, rhs)
718 self.assertGreater(rhs, lhs)
719 self.assertGreaterEqual(rhs, lhs)
720 self.assertFalse(lhs > rhs)
721 self.assertFalse(rhs < lhs)
722 self.assertFalse(lhs >= rhs)
723 self.assertFalse(rhs <= lhs)
724
Nick Coghlan3008ec02012-07-08 00:45:33 +1000725 def test_containment(self):
726 for obj in self.v4_addresses:
727 self.assertIn(obj, self.v4net)
728 for obj in self.v6_addresses:
729 self.assertIn(obj, self.v6net)
730 for obj in self.v4_objects + [self.v6net]:
731 self.assertNotIn(obj, self.v6net)
732 for obj in self.v6_objects + [self.v4net]:
733 self.assertNotIn(obj, self.v4net)
734
735 def test_mixed_type_ordering(self):
736 for lhs in self.objects:
737 for rhs in self.objects:
738 if isinstance(lhs, type(rhs)) or isinstance(rhs, type(lhs)):
739 continue
740 self.assertRaises(TypeError, lambda: lhs < rhs)
741 self.assertRaises(TypeError, lambda: lhs > rhs)
742 self.assertRaises(TypeError, lambda: lhs <= rhs)
743 self.assertRaises(TypeError, lambda: lhs >= rhs)
744
Serhiy Storchakaf186e122015-01-26 10:11:16 +0200745 def test_foreign_type_ordering(self):
746 other = object()
747 smallest = SmallestObject()
748 largest = LargestObject()
749 for obj in self.objects:
750 with self.assertRaises(TypeError):
751 obj < other
752 with self.assertRaises(TypeError):
753 obj > other
754 with self.assertRaises(TypeError):
755 obj <= other
756 with self.assertRaises(TypeError):
757 obj >= other
758 self.assertTrue(obj < largest)
759 self.assertFalse(obj > largest)
760 self.assertTrue(obj <= largest)
761 self.assertFalse(obj >= largest)
762 self.assertFalse(obj < smallest)
763 self.assertTrue(obj > smallest)
764 self.assertFalse(obj <= smallest)
765 self.assertTrue(obj >= smallest)
766
Nick Coghlan3008ec02012-07-08 00:45:33 +1000767 def test_mixed_type_key(self):
768 # with get_mixed_type_key, you can sort addresses and network.
769 v4_ordered = [self.v4addr, self.v4net, self.v4intf]
770 v6_ordered = [self.v6addr, self.v6net, self.v6intf]
771 self.assertEqual(v4_ordered,
772 sorted(self.v4_objects,
773 key=ipaddress.get_mixed_type_key))
774 self.assertEqual(v6_ordered,
775 sorted(self.v6_objects,
776 key=ipaddress.get_mixed_type_key))
777 self.assertEqual(v4_ordered + v6_ordered,
778 sorted(self.objects,
779 key=ipaddress.get_mixed_type_key))
780 self.assertEqual(NotImplemented, ipaddress.get_mixed_type_key(object))
781
782 def test_incompatible_versions(self):
783 # These should always raise TypeError
784 v4addr = ipaddress.ip_address('1.1.1.1')
785 v4net = ipaddress.ip_network('1.1.1.1')
786 v6addr = ipaddress.ip_address('::1')
Serhiy Storchakaf186e122015-01-26 10:11:16 +0200787 v6net = ipaddress.ip_network('::1')
Nick Coghlan3008ec02012-07-08 00:45:33 +1000788
789 self.assertRaises(TypeError, v4addr.__lt__, v6addr)
790 self.assertRaises(TypeError, v4addr.__gt__, v6addr)
791 self.assertRaises(TypeError, v4net.__lt__, v6net)
792 self.assertRaises(TypeError, v4net.__gt__, v6net)
793
794 self.assertRaises(TypeError, v6addr.__lt__, v4addr)
795 self.assertRaises(TypeError, v6addr.__gt__, v4addr)
796 self.assertRaises(TypeError, v6net.__lt__, v4net)
797 self.assertRaises(TypeError, v6net.__gt__, v4net)
798
799
Nick Coghlandc9b2552012-05-20 21:01:57 +1000800class IpaddrUnitTest(unittest.TestCase):
801
802 def setUp(self):
803 self.ipv4_address = ipaddress.IPv4Address('1.2.3.4')
804 self.ipv4_interface = ipaddress.IPv4Interface('1.2.3.4/24')
805 self.ipv4_network = ipaddress.IPv4Network('1.2.3.0/24')
806 #self.ipv4_hostmask = ipaddress.IPv4Interface('10.0.0.1/0.255.255.255')
807 self.ipv6_address = ipaddress.IPv6Interface(
808 '2001:658:22a:cafe:200:0:0:1')
809 self.ipv6_interface = ipaddress.IPv6Interface(
810 '2001:658:22a:cafe:200:0:0:1/64')
811 self.ipv6_network = ipaddress.IPv6Network('2001:658:22a:cafe::/64')
812
813 def testRepr(self):
814 self.assertEqual("IPv4Interface('1.2.3.4/32')",
815 repr(ipaddress.IPv4Interface('1.2.3.4')))
816 self.assertEqual("IPv6Interface('::1/128')",
817 repr(ipaddress.IPv6Interface('::1')))
818
Martin Panter204bf0b2016-07-11 07:51:37 +0000819 # issue #16531: constructing IPv4Network from an (address, mask) tuple
Antoine Pitrou5fb195f2014-05-12 20:36:46 +0200820 def testIPv4Tuple(self):
821 # /32
822 ip = ipaddress.IPv4Address('192.0.2.1')
823 net = ipaddress.IPv4Network('192.0.2.1/32')
824 self.assertEqual(ipaddress.IPv4Network(('192.0.2.1', 32)), net)
825 self.assertEqual(ipaddress.IPv4Network((ip, 32)), net)
826 self.assertEqual(ipaddress.IPv4Network((3221225985, 32)), net)
827 self.assertEqual(ipaddress.IPv4Network(('192.0.2.1',
828 '255.255.255.255')), net)
829 self.assertEqual(ipaddress.IPv4Network((ip,
830 '255.255.255.255')), net)
831 self.assertEqual(ipaddress.IPv4Network((3221225985,
832 '255.255.255.255')), net)
833 # strict=True and host bits set
834 with self.assertRaises(ValueError):
835 ipaddress.IPv4Network(('192.0.2.1', 24))
836 with self.assertRaises(ValueError):
837 ipaddress.IPv4Network((ip, 24))
838 with self.assertRaises(ValueError):
839 ipaddress.IPv4Network((3221225985, 24))
840 with self.assertRaises(ValueError):
841 ipaddress.IPv4Network(('192.0.2.1', '255.255.255.0'))
842 with self.assertRaises(ValueError):
843 ipaddress.IPv4Network((ip, '255.255.255.0'))
844 with self.assertRaises(ValueError):
845 ipaddress.IPv4Network((3221225985, '255.255.255.0'))
846 # strict=False and host bits set
847 net = ipaddress.IPv4Network('192.0.2.0/24')
848 self.assertEqual(ipaddress.IPv4Network(('192.0.2.1', 24),
849 strict=False), net)
850 self.assertEqual(ipaddress.IPv4Network((ip, 24),
851 strict=False), net)
852 self.assertEqual(ipaddress.IPv4Network((3221225985, 24),
853 strict=False), net)
854 self.assertEqual(ipaddress.IPv4Network(('192.0.2.1',
855 '255.255.255.0'),
856 strict=False), net)
857 self.assertEqual(ipaddress.IPv4Network((ip,
858 '255.255.255.0'),
859 strict=False), net)
860 self.assertEqual(ipaddress.IPv4Network((3221225985,
861 '255.255.255.0'),
862 strict=False), net)
863
864 # /24
865 ip = ipaddress.IPv4Address('192.0.2.0')
866 net = ipaddress.IPv4Network('192.0.2.0/24')
867 self.assertEqual(ipaddress.IPv4Network(('192.0.2.0',
868 '255.255.255.0')), net)
869 self.assertEqual(ipaddress.IPv4Network((ip,
870 '255.255.255.0')), net)
871 self.assertEqual(ipaddress.IPv4Network((3221225984,
872 '255.255.255.0')), net)
873 self.assertEqual(ipaddress.IPv4Network(('192.0.2.0', 24)), net)
874 self.assertEqual(ipaddress.IPv4Network((ip, 24)), net)
875 self.assertEqual(ipaddress.IPv4Network((3221225984, 24)), net)
876
877 self.assertEqual(ipaddress.IPv4Interface(('192.0.2.1', 24)),
878 ipaddress.IPv4Interface('192.0.2.1/24'))
879 self.assertEqual(ipaddress.IPv4Interface((3221225985, 24)),
880 ipaddress.IPv4Interface('192.0.2.1/24'))
881
Martin Panter204bf0b2016-07-11 07:51:37 +0000882 # issue #16531: constructing IPv6Network from an (address, mask) tuple
Antoine Pitrou5fb195f2014-05-12 20:36:46 +0200883 def testIPv6Tuple(self):
884 # /128
885 ip = ipaddress.IPv6Address('2001:db8::')
886 net = ipaddress.IPv6Network('2001:db8::/128')
887 self.assertEqual(ipaddress.IPv6Network(('2001:db8::', '128')),
888 net)
889 self.assertEqual(ipaddress.IPv6Network(
890 (42540766411282592856903984951653826560, 128)),
891 net)
892 self.assertEqual(ipaddress.IPv6Network((ip, '128')),
893 net)
894 ip = ipaddress.IPv6Address('2001:db8::')
895 net = ipaddress.IPv6Network('2001:db8::/96')
896 self.assertEqual(ipaddress.IPv6Network(('2001:db8::', '96')),
897 net)
898 self.assertEqual(ipaddress.IPv6Network(
899 (42540766411282592856903984951653826560, 96)),
900 net)
901 self.assertEqual(ipaddress.IPv6Network((ip, '96')),
902 net)
903
904 # strict=True and host bits set
905 ip = ipaddress.IPv6Address('2001:db8::1')
906 with self.assertRaises(ValueError):
907 ipaddress.IPv6Network(('2001:db8::1', 96))
908 with self.assertRaises(ValueError):
909 ipaddress.IPv6Network((
910 42540766411282592856903984951653826561, 96))
911 with self.assertRaises(ValueError):
912 ipaddress.IPv6Network((ip, 96))
913 # strict=False and host bits set
914 net = ipaddress.IPv6Network('2001:db8::/96')
915 self.assertEqual(ipaddress.IPv6Network(('2001:db8::1', 96),
916 strict=False),
917 net)
918 self.assertEqual(ipaddress.IPv6Network(
919 (42540766411282592856903984951653826561, 96),
920 strict=False),
921 net)
922 self.assertEqual(ipaddress.IPv6Network((ip, 96), strict=False),
923 net)
924
925 # /96
926 self.assertEqual(ipaddress.IPv6Interface(('2001:db8::1', '96')),
927 ipaddress.IPv6Interface('2001:db8::1/96'))
928 self.assertEqual(ipaddress.IPv6Interface(
929 (42540766411282592856903984951653826561, '96')),
930 ipaddress.IPv6Interface('2001:db8::1/96'))
931
Nick Coghlandc9b2552012-05-20 21:01:57 +1000932 # issue57
933 def testAddressIntMath(self):
934 self.assertEqual(ipaddress.IPv4Address('1.1.1.1') + 255,
935 ipaddress.IPv4Address('1.1.2.0'))
936 self.assertEqual(ipaddress.IPv4Address('1.1.1.1') - 256,
937 ipaddress.IPv4Address('1.1.0.1'))
938 self.assertEqual(ipaddress.IPv6Address('::1') + (2**16 - 2),
939 ipaddress.IPv6Address('::ffff'))
940 self.assertEqual(ipaddress.IPv6Address('::ffff') - (2**16 - 2),
941 ipaddress.IPv6Address('::1'))
942
Nick Coghlan3c2570c2012-07-07 01:13:55 +1000943 def testInvalidIntToBytes(self):
944 self.assertRaises(ValueError, ipaddress.v4_int_to_packed, -1)
945 self.assertRaises(ValueError, ipaddress.v4_int_to_packed,
946 2 ** ipaddress.IPV4LENGTH)
947 self.assertRaises(ValueError, ipaddress.v6_int_to_packed, -1)
948 self.assertRaises(ValueError, ipaddress.v6_int_to_packed,
949 2 ** ipaddress.IPV6LENGTH)
950
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200951 def testInternals(self):
Serhiy Storchakab53f0fb2015-01-19 00:41:32 +0200952 ip1 = ipaddress.IPv4Address('10.10.10.10')
953 ip2 = ipaddress.IPv4Address('10.10.10.11')
954 ip3 = ipaddress.IPv4Address('10.10.10.12')
955 self.assertEqual(list(ipaddress._find_address_range([ip1])),
956 [(ip1, ip1)])
957 self.assertEqual(list(ipaddress._find_address_range([ip1, ip3])),
958 [(ip1, ip1), (ip3, ip3)])
959 self.assertEqual(list(ipaddress._find_address_range([ip1, ip2, ip3])),
960 [(ip1, ip3)])
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200961 self.assertEqual(128, ipaddress._count_righthand_zero_bits(0, 128))
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200962 self.assertEqual("IPv4Network('1.2.3.0/24')", repr(self.ipv4_network))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000963
Nick Coghland9722652012-06-17 16:33:00 +1000964 def testMissingNetworkVersion(self):
965 class Broken(ipaddress._BaseNetwork):
966 pass
967 broken = Broken('127.0.0.1')
968 with self.assertRaisesRegex(NotImplementedError, "Broken.*version"):
969 broken.version
970
971 def testMissingAddressClass(self):
972 class Broken(ipaddress._BaseNetwork):
973 pass
974 broken = Broken('127.0.0.1')
975 with self.assertRaisesRegex(NotImplementedError, "Broken.*address"):
976 broken._address_class
977
Nick Coghlandc9b2552012-05-20 21:01:57 +1000978 def testGetNetwork(self):
979 self.assertEqual(int(self.ipv4_network.network_address), 16909056)
980 self.assertEqual(str(self.ipv4_network.network_address), '1.2.3.0')
981
982 self.assertEqual(int(self.ipv6_network.network_address),
983 42540616829182469433403647294022090752)
984 self.assertEqual(str(self.ipv6_network.network_address),
985 '2001:658:22a:cafe::')
986 self.assertEqual(str(self.ipv6_network.hostmask),
987 '::ffff:ffff:ffff:ffff')
988
Nick Coghlandc9b2552012-05-20 21:01:57 +1000989 def testIpFromInt(self):
990 self.assertEqual(self.ipv4_interface._ip,
991 ipaddress.IPv4Interface(16909060)._ip)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000992
993 ipv4 = ipaddress.ip_network('1.2.3.4')
994 ipv6 = ipaddress.ip_network('2001:658:22a:cafe:200:0:0:1')
Nick Coghlan730f67f2012-08-05 22:02:18 +1000995 self.assertEqual(ipv4, ipaddress.ip_network(int(ipv4.network_address)))
996 self.assertEqual(ipv6, ipaddress.ip_network(int(ipv6.network_address)))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000997
998 v6_int = 42540616829182469433547762482097946625
999 self.assertEqual(self.ipv6_interface._ip,
1000 ipaddress.IPv6Interface(v6_int)._ip)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001001
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001002 self.assertEqual(ipaddress.ip_network(self.ipv4_address._ip).version,
1003 4)
1004 self.assertEqual(ipaddress.ip_network(self.ipv6_address._ip).version,
1005 6)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001006
1007 def testIpFromPacked(self):
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001008 address = ipaddress.ip_address
Nick Coghlandc9b2552012-05-20 21:01:57 +10001009 self.assertEqual(self.ipv4_interface._ip,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001010 ipaddress.ip_interface(b'\x01\x02\x03\x04')._ip)
1011 self.assertEqual(address('255.254.253.252'),
1012 address(b'\xff\xfe\xfd\xfc'))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001013 self.assertEqual(self.ipv6_interface.ip,
1014 ipaddress.ip_interface(
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001015 b'\x20\x01\x06\x58\x02\x2a\xca\xfe'
1016 b'\x02\x00\x00\x00\x00\x00\x00\x01').ip)
1017 self.assertEqual(address('ffff:2:3:4:ffff::'),
1018 address(b'\xff\xff\x00\x02\x00\x03\x00\x04' +
1019 b'\xff\xff' + b'\x00' * 6))
1020 self.assertEqual(address('::'),
1021 address(b'\x00' * 16))
1022
Nick Coghlandc9b2552012-05-20 21:01:57 +10001023 def testGetIp(self):
1024 self.assertEqual(int(self.ipv4_interface.ip), 16909060)
1025 self.assertEqual(str(self.ipv4_interface.ip), '1.2.3.4')
1026
1027 self.assertEqual(int(self.ipv6_interface.ip),
1028 42540616829182469433547762482097946625)
1029 self.assertEqual(str(self.ipv6_interface.ip),
1030 '2001:658:22a:cafe:200::1')
1031
1032 def testGetNetmask(self):
1033 self.assertEqual(int(self.ipv4_network.netmask), 4294967040)
1034 self.assertEqual(str(self.ipv4_network.netmask), '255.255.255.0')
1035 self.assertEqual(int(self.ipv6_network.netmask),
1036 340282366920938463444927863358058659840)
1037 self.assertEqual(self.ipv6_network.prefixlen, 64)
1038
1039 def testZeroNetmask(self):
1040 ipv4_zero_netmask = ipaddress.IPv4Interface('1.2.3.4/0')
1041 self.assertEqual(int(ipv4_zero_netmask.network.netmask), 0)
Nick Coghlan932346f2014-02-08 23:17:36 +10001042 self.assertEqual(ipv4_zero_netmask._prefix_from_prefix_string('0'), 0)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001043
1044 ipv6_zero_netmask = ipaddress.IPv6Interface('::1/0')
1045 self.assertEqual(int(ipv6_zero_netmask.network.netmask), 0)
Nick Coghlan932346f2014-02-08 23:17:36 +10001046 self.assertEqual(ipv6_zero_netmask._prefix_from_prefix_string('0'), 0)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001047
Rémi Lapeyree59ec1b2019-04-13 10:49:34 +02001048 def testIPv4Net(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001049 net = ipaddress.IPv4Network('127.0.0.0/0.0.0.255')
Nick Coghlan932346f2014-02-08 23:17:36 +10001050 self.assertEqual(net.prefixlen, 24)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001051
Nick Coghlandc9b2552012-05-20 21:01:57 +10001052 def testGetBroadcast(self):
1053 self.assertEqual(int(self.ipv4_network.broadcast_address), 16909311)
1054 self.assertEqual(str(self.ipv4_network.broadcast_address), '1.2.3.255')
1055
1056 self.assertEqual(int(self.ipv6_network.broadcast_address),
1057 42540616829182469451850391367731642367)
1058 self.assertEqual(str(self.ipv6_network.broadcast_address),
1059 '2001:658:22a:cafe:ffff:ffff:ffff:ffff')
1060
1061 def testGetPrefixlen(self):
Nick Coghlane3ded952012-08-05 22:45:22 +10001062 self.assertEqual(self.ipv4_interface.network.prefixlen, 24)
1063 self.assertEqual(self.ipv6_interface.network.prefixlen, 64)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001064
1065 def testGetSupernet(self):
1066 self.assertEqual(self.ipv4_network.supernet().prefixlen, 23)
1067 self.assertEqual(str(self.ipv4_network.supernet().network_address),
1068 '1.2.2.0')
1069 self.assertEqual(
1070 ipaddress.IPv4Interface('0.0.0.0/0').network.supernet(),
1071 ipaddress.IPv4Network('0.0.0.0/0'))
1072
1073 self.assertEqual(self.ipv6_network.supernet().prefixlen, 63)
1074 self.assertEqual(str(self.ipv6_network.supernet().network_address),
1075 '2001:658:22a:cafe::')
1076 self.assertEqual(ipaddress.IPv6Interface('::0/0').network.supernet(),
1077 ipaddress.IPv6Network('::0/0'))
1078
1079 def testGetSupernet3(self):
1080 self.assertEqual(self.ipv4_network.supernet(3).prefixlen, 21)
1081 self.assertEqual(str(self.ipv4_network.supernet(3).network_address),
1082 '1.2.0.0')
1083
1084 self.assertEqual(self.ipv6_network.supernet(3).prefixlen, 61)
1085 self.assertEqual(str(self.ipv6_network.supernet(3).network_address),
1086 '2001:658:22a:caf8::')
1087
1088 def testGetSupernet4(self):
1089 self.assertRaises(ValueError, self.ipv4_network.supernet,
1090 prefixlen_diff=2, new_prefix=1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001091 self.assertRaises(ValueError, self.ipv4_network.supernet,
1092 new_prefix=25)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001093 self.assertEqual(self.ipv4_network.supernet(prefixlen_diff=2),
1094 self.ipv4_network.supernet(new_prefix=22))
1095
1096 self.assertRaises(ValueError, self.ipv6_network.supernet,
1097 prefixlen_diff=2, new_prefix=1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001098 self.assertRaises(ValueError, self.ipv6_network.supernet,
1099 new_prefix=65)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001100 self.assertEqual(self.ipv6_network.supernet(prefixlen_diff=2),
1101 self.ipv6_network.supernet(new_prefix=62))
1102
1103 def testHosts(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001104 hosts = list(self.ipv4_network.hosts())
1105 self.assertEqual(254, len(hosts))
1106 self.assertEqual(ipaddress.IPv4Address('1.2.3.1'), hosts[0])
1107 self.assertEqual(ipaddress.IPv4Address('1.2.3.254'), hosts[-1])
1108
Xiang Zhang10b134a2018-03-21 08:25:13 +08001109 ipv6_network = ipaddress.IPv6Network('2001:658:22a:cafe::/120')
1110 hosts = list(ipv6_network.hosts())
1111 self.assertEqual(255, len(hosts))
1112 self.assertEqual(ipaddress.IPv6Address('2001:658:22a:cafe::1'), hosts[0])
1113 self.assertEqual(ipaddress.IPv6Address('2001:658:22a:cafe::ff'), hosts[-1])
1114
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001115 # special case where only 1 bit is left for address
Xiang Zhang10b134a2018-03-21 08:25:13 +08001116 addrs = [ipaddress.IPv4Address('2.0.0.0'),
1117 ipaddress.IPv4Address('2.0.0.1')]
1118 str_args = '2.0.0.0/31'
1119 tpl_args = ('2.0.0.0', 31)
1120 self.assertEqual(addrs, list(ipaddress.ip_network(str_args).hosts()))
1121 self.assertEqual(addrs, list(ipaddress.ip_network(tpl_args).hosts()))
1122 self.assertEqual(list(ipaddress.ip_network(str_args).hosts()),
1123 list(ipaddress.ip_network(tpl_args).hosts()))
1124
1125 addrs = [ipaddress.IPv6Address('2001:658:22a:cafe::'),
1126 ipaddress.IPv6Address('2001:658:22a:cafe::1')]
1127 str_args = '2001:658:22a:cafe::/127'
1128 tpl_args = ('2001:658:22a:cafe::', 127)
1129 self.assertEqual(addrs, list(ipaddress.ip_network(str_args).hosts()))
1130 self.assertEqual(addrs, list(ipaddress.ip_network(tpl_args).hosts()))
1131 self.assertEqual(list(ipaddress.ip_network(str_args).hosts()),
1132 list(ipaddress.ip_network(tpl_args).hosts()))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001133
1134 def testFancySubnetting(self):
1135 self.assertEqual(sorted(self.ipv4_network.subnets(prefixlen_diff=3)),
1136 sorted(self.ipv4_network.subnets(new_prefix=27)))
1137 self.assertRaises(ValueError, list,
1138 self.ipv4_network.subnets(new_prefix=23))
1139 self.assertRaises(ValueError, list,
1140 self.ipv4_network.subnets(prefixlen_diff=3,
1141 new_prefix=27))
1142 self.assertEqual(sorted(self.ipv6_network.subnets(prefixlen_diff=4)),
1143 sorted(self.ipv6_network.subnets(new_prefix=68)))
1144 self.assertRaises(ValueError, list,
1145 self.ipv6_network.subnets(new_prefix=63))
1146 self.assertRaises(ValueError, list,
1147 self.ipv6_network.subnets(prefixlen_diff=4,
1148 new_prefix=68))
1149
1150 def testGetSubnets(self):
1151 self.assertEqual(list(self.ipv4_network.subnets())[0].prefixlen, 25)
1152 self.assertEqual(str(list(
1153 self.ipv4_network.subnets())[0].network_address),
1154 '1.2.3.0')
1155 self.assertEqual(str(list(
1156 self.ipv4_network.subnets())[1].network_address),
1157 '1.2.3.128')
1158
1159 self.assertEqual(list(self.ipv6_network.subnets())[0].prefixlen, 65)
1160
1161 def testGetSubnetForSingle32(self):
1162 ip = ipaddress.IPv4Network('1.2.3.4/32')
1163 subnets1 = [str(x) for x in ip.subnets()]
1164 subnets2 = [str(x) for x in ip.subnets(2)]
1165 self.assertEqual(subnets1, ['1.2.3.4/32'])
1166 self.assertEqual(subnets1, subnets2)
1167
1168 def testGetSubnetForSingle128(self):
1169 ip = ipaddress.IPv6Network('::1/128')
1170 subnets1 = [str(x) for x in ip.subnets()]
1171 subnets2 = [str(x) for x in ip.subnets(2)]
1172 self.assertEqual(subnets1, ['::1/128'])
1173 self.assertEqual(subnets1, subnets2)
1174
1175 def testSubnet2(self):
1176 ips = [str(x) for x in self.ipv4_network.subnets(2)]
1177 self.assertEqual(
1178 ips,
1179 ['1.2.3.0/26', '1.2.3.64/26', '1.2.3.128/26', '1.2.3.192/26'])
1180
1181 ipsv6 = [str(x) for x in self.ipv6_network.subnets(2)]
1182 self.assertEqual(
1183 ipsv6,
1184 ['2001:658:22a:cafe::/66',
1185 '2001:658:22a:cafe:4000::/66',
1186 '2001:658:22a:cafe:8000::/66',
1187 '2001:658:22a:cafe:c000::/66'])
1188
Serhiy Storchakabb0dbd52016-03-01 10:25:45 +02001189 def testGetSubnets3(self):
1190 subnets = [str(x) for x in self.ipv4_network.subnets(8)]
1191 self.assertEqual(subnets[:3],
1192 ['1.2.3.0/32', '1.2.3.1/32', '1.2.3.2/32'])
1193 self.assertEqual(subnets[-3:],
1194 ['1.2.3.253/32', '1.2.3.254/32', '1.2.3.255/32'])
1195 self.assertEqual(len(subnets), 256)
1196
1197 ipv6_network = ipaddress.IPv6Network('2001:658:22a:cafe::/120')
1198 subnets = [str(x) for x in ipv6_network.subnets(8)]
1199 self.assertEqual(subnets[:3],
1200 ['2001:658:22a:cafe::/128',
1201 '2001:658:22a:cafe::1/128',
1202 '2001:658:22a:cafe::2/128'])
1203 self.assertEqual(subnets[-3:],
1204 ['2001:658:22a:cafe::fd/128',
1205 '2001:658:22a:cafe::fe/128',
1206 '2001:658:22a:cafe::ff/128'])
1207 self.assertEqual(len(subnets), 256)
1208
Nick Coghlandc9b2552012-05-20 21:01:57 +10001209 def testSubnetFailsForLargeCidrDiff(self):
1210 self.assertRaises(ValueError, list,
1211 self.ipv4_interface.network.subnets(9))
1212 self.assertRaises(ValueError, list,
1213 self.ipv4_network.subnets(9))
1214 self.assertRaises(ValueError, list,
1215 self.ipv6_interface.network.subnets(65))
1216 self.assertRaises(ValueError, list,
1217 self.ipv6_network.subnets(65))
1218
1219 def testSupernetFailsForLargeCidrDiff(self):
1220 self.assertRaises(ValueError,
1221 self.ipv4_interface.network.supernet, 25)
1222 self.assertRaises(ValueError,
1223 self.ipv6_interface.network.supernet, 65)
1224
1225 def testSubnetFailsForNegativeCidrDiff(self):
1226 self.assertRaises(ValueError, list,
1227 self.ipv4_interface.network.subnets(-1))
1228 self.assertRaises(ValueError, list,
Nick Coghlan2c589102012-05-27 01:03:25 +10001229 self.ipv4_network.subnets(-1))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001230 self.assertRaises(ValueError, list,
1231 self.ipv6_interface.network.subnets(-1))
1232 self.assertRaises(ValueError, list,
1233 self.ipv6_network.subnets(-1))
1234
1235 def testGetNum_Addresses(self):
1236 self.assertEqual(self.ipv4_network.num_addresses, 256)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001237 self.assertEqual(list(self.ipv4_network.subnets())[0].num_addresses,
1238 128)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001239 self.assertEqual(self.ipv4_network.supernet().num_addresses, 512)
1240
1241 self.assertEqual(self.ipv6_network.num_addresses, 18446744073709551616)
1242 self.assertEqual(list(self.ipv6_network.subnets())[0].num_addresses,
1243 9223372036854775808)
1244 self.assertEqual(self.ipv6_network.supernet().num_addresses,
1245 36893488147419103232)
1246
1247 def testContains(self):
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001248 self.assertIn(ipaddress.IPv4Interface('1.2.3.128/25'),
1249 self.ipv4_network)
1250 self.assertNotIn(ipaddress.IPv4Interface('1.2.4.1/24'),
Nick Coghlandc9b2552012-05-20 21:01:57 +10001251 self.ipv4_network)
1252 # We can test addresses and string as well.
1253 addr1 = ipaddress.IPv4Address('1.2.3.37')
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001254 self.assertIn(addr1, self.ipv4_network)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001255 # issue 61, bad network comparison on like-ip'd network objects
1256 # with identical broadcast addresses.
1257 self.assertFalse(ipaddress.IPv4Network('1.1.0.0/16').__contains__(
1258 ipaddress.IPv4Network('1.0.0.0/15')))
1259
Nick Coghlandc9b2552012-05-20 21:01:57 +10001260 def testNth(self):
1261 self.assertEqual(str(self.ipv4_network[5]), '1.2.3.5')
1262 self.assertRaises(IndexError, self.ipv4_network.__getitem__, 256)
1263
1264 self.assertEqual(str(self.ipv6_network[5]),
1265 '2001:658:22a:cafe::5')
Berker Peksag28dc1182016-06-11 22:30:05 +03001266 self.assertRaises(IndexError, self.ipv6_network.__getitem__, 1 << 64)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001267
1268 def testGetitem(self):
1269 # http://code.google.com/p/ipaddr-py/issues/detail?id=15
1270 addr = ipaddress.IPv4Network('172.31.255.128/255.255.255.240')
1271 self.assertEqual(28, addr.prefixlen)
1272 addr_list = list(addr)
1273 self.assertEqual('172.31.255.128', str(addr_list[0]))
1274 self.assertEqual('172.31.255.128', str(addr[0]))
1275 self.assertEqual('172.31.255.143', str(addr_list[-1]))
1276 self.assertEqual('172.31.255.143', str(addr[-1]))
1277 self.assertEqual(addr_list[-1], addr[-1])
1278
1279 def testEqual(self):
1280 self.assertTrue(self.ipv4_interface ==
1281 ipaddress.IPv4Interface('1.2.3.4/24'))
1282 self.assertFalse(self.ipv4_interface ==
1283 ipaddress.IPv4Interface('1.2.3.4/23'))
1284 self.assertFalse(self.ipv4_interface ==
1285 ipaddress.IPv6Interface('::1.2.3.4/24'))
1286 self.assertFalse(self.ipv4_interface == '')
1287 self.assertFalse(self.ipv4_interface == [])
1288 self.assertFalse(self.ipv4_interface == 2)
1289
1290 self.assertTrue(self.ipv6_interface ==
1291 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/64'))
1292 self.assertFalse(self.ipv6_interface ==
1293 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/63'))
1294 self.assertFalse(self.ipv6_interface ==
1295 ipaddress.IPv4Interface('1.2.3.4/23'))
1296 self.assertFalse(self.ipv6_interface == '')
1297 self.assertFalse(self.ipv6_interface == [])
1298 self.assertFalse(self.ipv6_interface == 2)
1299
1300 def testNotEqual(self):
1301 self.assertFalse(self.ipv4_interface !=
1302 ipaddress.IPv4Interface('1.2.3.4/24'))
1303 self.assertTrue(self.ipv4_interface !=
1304 ipaddress.IPv4Interface('1.2.3.4/23'))
1305 self.assertTrue(self.ipv4_interface !=
1306 ipaddress.IPv6Interface('::1.2.3.4/24'))
1307 self.assertTrue(self.ipv4_interface != '')
1308 self.assertTrue(self.ipv4_interface != [])
1309 self.assertTrue(self.ipv4_interface != 2)
1310
1311 self.assertTrue(self.ipv4_address !=
1312 ipaddress.IPv4Address('1.2.3.5'))
1313 self.assertTrue(self.ipv4_address != '')
1314 self.assertTrue(self.ipv4_address != [])
1315 self.assertTrue(self.ipv4_address != 2)
1316
1317 self.assertFalse(self.ipv6_interface !=
1318 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/64'))
1319 self.assertTrue(self.ipv6_interface !=
1320 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/63'))
1321 self.assertTrue(self.ipv6_interface !=
1322 ipaddress.IPv4Interface('1.2.3.4/23'))
1323 self.assertTrue(self.ipv6_interface != '')
1324 self.assertTrue(self.ipv6_interface != [])
1325 self.assertTrue(self.ipv6_interface != 2)
1326
1327 self.assertTrue(self.ipv6_address !=
1328 ipaddress.IPv4Address('1.2.3.4'))
1329 self.assertTrue(self.ipv6_address != '')
1330 self.assertTrue(self.ipv6_address != [])
1331 self.assertTrue(self.ipv6_address != 2)
1332
1333 def testSlash32Constructor(self):
1334 self.assertEqual(str(ipaddress.IPv4Interface(
1335 '1.2.3.4/255.255.255.255')), '1.2.3.4/32')
1336
1337 def testSlash128Constructor(self):
1338 self.assertEqual(str(ipaddress.IPv6Interface('::1/128')),
1339 '::1/128')
1340
1341 def testSlash0Constructor(self):
1342 self.assertEqual(str(ipaddress.IPv4Interface('1.2.3.4/0.0.0.0')),
1343 '1.2.3.4/0')
1344
1345 def testCollapsing(self):
1346 # test only IP addresses including some duplicates
1347 ip1 = ipaddress.IPv4Address('1.1.1.0')
1348 ip2 = ipaddress.IPv4Address('1.1.1.1')
1349 ip3 = ipaddress.IPv4Address('1.1.1.2')
1350 ip4 = ipaddress.IPv4Address('1.1.1.3')
1351 ip5 = ipaddress.IPv4Address('1.1.1.4')
1352 ip6 = ipaddress.IPv4Address('1.1.1.0')
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07001353 # check that addresses are subsumed properly.
Nick Coghlandc9b2552012-05-20 21:01:57 +10001354 collapsed = ipaddress.collapse_addresses(
1355 [ip1, ip2, ip3, ip4, ip5, ip6])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001356 self.assertEqual(list(collapsed),
1357 [ipaddress.IPv4Network('1.1.1.0/30'),
1358 ipaddress.IPv4Network('1.1.1.4/32')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001359
1360 # test a mix of IP addresses and networks including some duplicates
1361 ip1 = ipaddress.IPv4Address('1.1.1.0')
1362 ip2 = ipaddress.IPv4Address('1.1.1.1')
1363 ip3 = ipaddress.IPv4Address('1.1.1.2')
1364 ip4 = ipaddress.IPv4Address('1.1.1.3')
1365 #ip5 = ipaddress.IPv4Interface('1.1.1.4/30')
1366 #ip6 = ipaddress.IPv4Interface('1.1.1.4/30')
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07001367 # check that addresses are subsumed properly.
Nick Coghlandc9b2552012-05-20 21:01:57 +10001368 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3, ip4])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001369 self.assertEqual(list(collapsed),
1370 [ipaddress.IPv4Network('1.1.1.0/30')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001371
1372 # test only IP networks
1373 ip1 = ipaddress.IPv4Network('1.1.0.0/24')
1374 ip2 = ipaddress.IPv4Network('1.1.1.0/24')
1375 ip3 = ipaddress.IPv4Network('1.1.2.0/24')
1376 ip4 = ipaddress.IPv4Network('1.1.3.0/24')
1377 ip5 = ipaddress.IPv4Network('1.1.4.0/24')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001378 # stored in no particular order b/c we want CollapseAddr to call
1379 # [].sort
Nick Coghlandc9b2552012-05-20 21:01:57 +10001380 ip6 = ipaddress.IPv4Network('1.1.0.0/22')
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07001381 # check that addresses are subsumed properly.
Nick Coghlandc9b2552012-05-20 21:01:57 +10001382 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3, ip4, ip5,
1383 ip6])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001384 self.assertEqual(list(collapsed),
1385 [ipaddress.IPv4Network('1.1.0.0/22'),
1386 ipaddress.IPv4Network('1.1.4.0/24')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001387
1388 # test that two addresses are supernet'ed properly
1389 collapsed = ipaddress.collapse_addresses([ip1, ip2])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001390 self.assertEqual(list(collapsed),
1391 [ipaddress.IPv4Network('1.1.0.0/23')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001392
1393 # test same IP networks
1394 ip_same1 = ip_same2 = ipaddress.IPv4Network('1.1.1.1/32')
1395 self.assertEqual(list(ipaddress.collapse_addresses(
1396 [ip_same1, ip_same2])),
1397 [ip_same1])
1398
1399 # test same IP addresses
1400 ip_same1 = ip_same2 = ipaddress.IPv4Address('1.1.1.1')
1401 self.assertEqual(list(ipaddress.collapse_addresses(
1402 [ip_same1, ip_same2])),
1403 [ipaddress.ip_network('1.1.1.1/32')])
1404 ip1 = ipaddress.IPv6Network('2001::/100')
1405 ip2 = ipaddress.IPv6Network('2001::/120')
1406 ip3 = ipaddress.IPv6Network('2001::/96')
1407 # test that ipv6 addresses are subsumed properly.
1408 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3])
1409 self.assertEqual(list(collapsed), [ip3])
1410
1411 # the toejam test
Hynek Schlawack35db5132012-06-01 20:12:17 +02001412 addr_tuples = [
1413 (ipaddress.ip_address('1.1.1.1'),
1414 ipaddress.ip_address('::1')),
1415 (ipaddress.IPv4Network('1.1.0.0/24'),
1416 ipaddress.IPv6Network('2001::/120')),
1417 (ipaddress.IPv4Network('1.1.0.0/32'),
1418 ipaddress.IPv6Network('2001::/128')),
1419 ]
1420 for ip1, ip2 in addr_tuples:
1421 self.assertRaises(TypeError, ipaddress.collapse_addresses,
1422 [ip1, ip2])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001423
1424 def testSummarizing(self):
1425 #ip = ipaddress.ip_address
1426 #ipnet = ipaddress.ip_network
1427 summarize = ipaddress.summarize_address_range
1428 ip1 = ipaddress.ip_address('1.1.1.0')
1429 ip2 = ipaddress.ip_address('1.1.1.255')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001430
1431 # summarize works only for IPv4 & IPv6
1432 class IPv7Address(ipaddress.IPv6Address):
1433 @property
1434 def version(self):
1435 return 7
1436 ip_invalid1 = IPv7Address('::1')
1437 ip_invalid2 = IPv7Address('::1')
1438 self.assertRaises(ValueError, list,
1439 summarize(ip_invalid1, ip_invalid2))
1440 # test that a summary over ip4 & ip6 fails
1441 self.assertRaises(TypeError, list,
1442 summarize(ip1, ipaddress.IPv6Address('::1')))
1443 # test a /24 is summarized properly
Nick Coghlandc9b2552012-05-20 21:01:57 +10001444 self.assertEqual(list(summarize(ip1, ip2))[0],
1445 ipaddress.ip_network('1.1.1.0/24'))
Martin Panter7462b6492015-11-02 03:37:02 +00001446 # test an IPv4 range that isn't on a network byte boundary
Nick Coghlandc9b2552012-05-20 21:01:57 +10001447 ip2 = ipaddress.ip_address('1.1.1.8')
1448 self.assertEqual(list(summarize(ip1, ip2)),
1449 [ipaddress.ip_network('1.1.1.0/29'),
1450 ipaddress.ip_network('1.1.1.8')])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001451 # all!
1452 ip1 = ipaddress.IPv4Address(0)
1453 ip2 = ipaddress.IPv4Address(ipaddress.IPv4Address._ALL_ONES)
1454 self.assertEqual([ipaddress.IPv4Network('0.0.0.0/0')],
1455 list(summarize(ip1, ip2)))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001456
1457 ip1 = ipaddress.ip_address('1::')
1458 ip2 = ipaddress.ip_address('1:ffff:ffff:ffff:ffff:ffff:ffff:ffff')
Martin Panter7462b6492015-11-02 03:37:02 +00001459 # test an IPv6 is summarized properly
Nick Coghlandc9b2552012-05-20 21:01:57 +10001460 self.assertEqual(list(summarize(ip1, ip2))[0],
1461 ipaddress.ip_network('1::/16'))
1462 # test an IPv6 range that isn't on a network byte boundary
1463 ip2 = ipaddress.ip_address('2::')
1464 self.assertEqual(list(summarize(ip1, ip2)),
1465 [ipaddress.ip_network('1::/16'),
1466 ipaddress.ip_network('2::/128')])
1467
1468 # test exception raised when first is greater than last
1469 self.assertRaises(ValueError, list,
1470 summarize(ipaddress.ip_address('1.1.1.0'),
1471 ipaddress.ip_address('1.1.0.0')))
1472 # test exception raised when first and last aren't IP addresses
1473 self.assertRaises(TypeError, list,
1474 summarize(ipaddress.ip_network('1.1.1.0'),
1475 ipaddress.ip_network('1.1.0.0')))
1476 self.assertRaises(TypeError, list,
1477 summarize(ipaddress.ip_network('1.1.1.0'),
1478 ipaddress.ip_network('1.1.0.0')))
1479 # test exception raised when first and last are not same version
1480 self.assertRaises(TypeError, list,
1481 summarize(ipaddress.ip_address('::'),
1482 ipaddress.ip_network('1.1.0.0')))
1483
1484 def testAddressComparison(self):
1485 self.assertTrue(ipaddress.ip_address('1.1.1.1') <=
1486 ipaddress.ip_address('1.1.1.1'))
1487 self.assertTrue(ipaddress.ip_address('1.1.1.1') <=
1488 ipaddress.ip_address('1.1.1.2'))
1489 self.assertTrue(ipaddress.ip_address('::1') <=
1490 ipaddress.ip_address('::1'))
1491 self.assertTrue(ipaddress.ip_address('::1') <=
1492 ipaddress.ip_address('::2'))
1493
Nick Coghlan3008ec02012-07-08 00:45:33 +10001494 def testInterfaceComparison(self):
s-sanjay7bd8d3e2017-03-31 23:09:53 -07001495 self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') ==
1496 ipaddress.ip_interface('1.1.1.1/24'))
1497 self.assertTrue(ipaddress.ip_interface('1.1.1.1/16') <
1498 ipaddress.ip_interface('1.1.1.1/24'))
1499 self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') <
1500 ipaddress.ip_interface('1.1.1.2/24'))
1501 self.assertTrue(ipaddress.ip_interface('1.1.1.2/16') <
1502 ipaddress.ip_interface('1.1.1.1/24'))
1503 self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') >
1504 ipaddress.ip_interface('1.1.1.1/16'))
1505 self.assertTrue(ipaddress.ip_interface('1.1.1.2/24') >
1506 ipaddress.ip_interface('1.1.1.1/24'))
1507 self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') >
1508 ipaddress.ip_interface('1.1.1.2/16'))
1509
1510 self.assertTrue(ipaddress.ip_interface('::1/64') ==
1511 ipaddress.ip_interface('::1/64'))
1512 self.assertTrue(ipaddress.ip_interface('::1/64') <
1513 ipaddress.ip_interface('::1/80'))
1514 self.assertTrue(ipaddress.ip_interface('::1/64') <
1515 ipaddress.ip_interface('::2/64'))
1516 self.assertTrue(ipaddress.ip_interface('::2/48') <
1517 ipaddress.ip_interface('::1/64'))
1518 self.assertTrue(ipaddress.ip_interface('::1/80') >
1519 ipaddress.ip_interface('::1/64'))
1520 self.assertTrue(ipaddress.ip_interface('::2/64') >
1521 ipaddress.ip_interface('::1/64'))
1522 self.assertTrue(ipaddress.ip_interface('::1/64') >
1523 ipaddress.ip_interface('::2/48'))
Nick Coghlan3008ec02012-07-08 00:45:33 +10001524
Nick Coghlandc9b2552012-05-20 21:01:57 +10001525 def testNetworkComparison(self):
1526 # ip1 and ip2 have the same network address
1527 ip1 = ipaddress.IPv4Network('1.1.1.0/24')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001528 ip2 = ipaddress.IPv4Network('1.1.1.0/32')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001529 ip3 = ipaddress.IPv4Network('1.1.2.0/24')
1530
1531 self.assertTrue(ip1 < ip3)
1532 self.assertTrue(ip3 > ip2)
1533
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001534 self.assertEqual(ip1.compare_networks(ip1), 0)
1535
1536 # if addresses are the same, sort by netmask
1537 self.assertEqual(ip1.compare_networks(ip2), -1)
1538 self.assertEqual(ip2.compare_networks(ip1), 1)
1539
Nick Coghlandc9b2552012-05-20 21:01:57 +10001540 self.assertEqual(ip1.compare_networks(ip3), -1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001541 self.assertEqual(ip3.compare_networks(ip1), 1)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001542 self.assertTrue(ip1._get_networks_key() < ip3._get_networks_key())
1543
1544 ip1 = ipaddress.IPv6Network('2001:2000::/96')
1545 ip2 = ipaddress.IPv6Network('2001:2001::/96')
1546 ip3 = ipaddress.IPv6Network('2001:ffff:2000::/96')
1547
1548 self.assertTrue(ip1 < ip3)
1549 self.assertTrue(ip3 > ip2)
1550 self.assertEqual(ip1.compare_networks(ip3), -1)
1551 self.assertTrue(ip1._get_networks_key() < ip3._get_networks_key())
1552
1553 # Test comparing different protocols.
1554 # Should always raise a TypeError.
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001555 self.assertRaises(TypeError,
1556 self.ipv4_network.compare_networks,
1557 self.ipv6_network)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001558 ipv6 = ipaddress.IPv6Interface('::/0')
1559 ipv4 = ipaddress.IPv4Interface('0.0.0.0/0')
1560 self.assertRaises(TypeError, ipv4.__lt__, ipv6)
1561 self.assertRaises(TypeError, ipv4.__gt__, ipv6)
1562 self.assertRaises(TypeError, ipv6.__lt__, ipv4)
1563 self.assertRaises(TypeError, ipv6.__gt__, ipv4)
1564
1565 # Regression test for issue 19.
1566 ip1 = ipaddress.ip_network('10.1.2.128/25')
1567 self.assertFalse(ip1 < ip1)
1568 self.assertFalse(ip1 > ip1)
1569 ip2 = ipaddress.ip_network('10.1.3.0/24')
1570 self.assertTrue(ip1 < ip2)
1571 self.assertFalse(ip2 < ip1)
1572 self.assertFalse(ip1 > ip2)
1573 self.assertTrue(ip2 > ip1)
1574 ip3 = ipaddress.ip_network('10.1.3.0/25')
1575 self.assertTrue(ip2 < ip3)
1576 self.assertFalse(ip3 < ip2)
1577 self.assertFalse(ip2 > ip3)
1578 self.assertTrue(ip3 > ip2)
1579
1580 # Regression test for issue 28.
1581 ip1 = ipaddress.ip_network('10.10.10.0/31')
1582 ip2 = ipaddress.ip_network('10.10.10.0')
1583 ip3 = ipaddress.ip_network('10.10.10.2/31')
1584 ip4 = ipaddress.ip_network('10.10.10.2')
1585 sorted = [ip1, ip2, ip3, ip4]
1586 unsorted = [ip2, ip4, ip1, ip3]
1587 unsorted.sort()
1588 self.assertEqual(sorted, unsorted)
1589 unsorted = [ip4, ip1, ip3, ip2]
1590 unsorted.sort()
1591 self.assertEqual(sorted, unsorted)
Serhiy Storchakaf186e122015-01-26 10:11:16 +02001592 self.assertIs(ip1.__lt__(ipaddress.ip_address('10.10.10.0')),
1593 NotImplemented)
1594 self.assertIs(ip2.__lt__(ipaddress.ip_address('10.10.10.0')),
1595 NotImplemented)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001596
1597 # <=, >=
1598 self.assertTrue(ipaddress.ip_network('1.1.1.1') <=
1599 ipaddress.ip_network('1.1.1.1'))
1600 self.assertTrue(ipaddress.ip_network('1.1.1.1') <=
1601 ipaddress.ip_network('1.1.1.2'))
1602 self.assertFalse(ipaddress.ip_network('1.1.1.2') <=
1603 ipaddress.ip_network('1.1.1.1'))
1604 self.assertTrue(ipaddress.ip_network('::1') <=
1605 ipaddress.ip_network('::1'))
1606 self.assertTrue(ipaddress.ip_network('::1') <=
1607 ipaddress.ip_network('::2'))
1608 self.assertFalse(ipaddress.ip_network('::2') <=
1609 ipaddress.ip_network('::1'))
1610
1611 def testStrictNetworks(self):
1612 self.assertRaises(ValueError, ipaddress.ip_network, '192.168.1.1/24')
1613 self.assertRaises(ValueError, ipaddress.ip_network, '::1/120')
1614
1615 def testOverlaps(self):
1616 other = ipaddress.IPv4Network('1.2.3.0/30')
1617 other2 = ipaddress.IPv4Network('1.2.2.0/24')
1618 other3 = ipaddress.IPv4Network('1.2.2.64/26')
1619 self.assertTrue(self.ipv4_network.overlaps(other))
1620 self.assertFalse(self.ipv4_network.overlaps(other2))
1621 self.assertTrue(other2.overlaps(other3))
1622
1623 def testEmbeddedIpv4(self):
1624 ipv4_string = '192.168.0.1'
1625 ipv4 = ipaddress.IPv4Interface(ipv4_string)
1626 v4compat_ipv6 = ipaddress.IPv6Interface('::%s' % ipv4_string)
1627 self.assertEqual(int(v4compat_ipv6.ip), int(ipv4.ip))
1628 v4mapped_ipv6 = ipaddress.IPv6Interface('::ffff:%s' % ipv4_string)
1629 self.assertNotEqual(v4mapped_ipv6.ip, ipv4.ip)
1630 self.assertRaises(ipaddress.AddressValueError, ipaddress.IPv6Interface,
1631 '2001:1.1.1.1:1.1.1.1')
1632
1633 # Issue 67: IPv6 with embedded IPv4 address not recognized.
1634 def testIPv6AddressTooLarge(self):
1635 # RFC4291 2.5.5.2
1636 self.assertEqual(ipaddress.ip_address('::FFFF:192.0.2.1'),
1637 ipaddress.ip_address('::FFFF:c000:201'))
1638 # RFC4291 2.2 (part 3) x::d.d.d.d
1639 self.assertEqual(ipaddress.ip_address('FFFF::192.0.2.1'),
1640 ipaddress.ip_address('FFFF::c000:201'))
1641
1642 def testIPVersion(self):
1643 self.assertEqual(self.ipv4_address.version, 4)
1644 self.assertEqual(self.ipv6_address.version, 6)
1645
1646 def testMaxPrefixLength(self):
1647 self.assertEqual(self.ipv4_interface.max_prefixlen, 32)
1648 self.assertEqual(self.ipv6_interface.max_prefixlen, 128)
1649
1650 def testPacked(self):
1651 self.assertEqual(self.ipv4_address.packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001652 b'\x01\x02\x03\x04')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001653 self.assertEqual(ipaddress.IPv4Interface('255.254.253.252').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001654 b'\xff\xfe\xfd\xfc')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001655 self.assertEqual(self.ipv6_address.packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001656 b'\x20\x01\x06\x58\x02\x2a\xca\xfe'
1657 b'\x02\x00\x00\x00\x00\x00\x00\x01')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001658 self.assertEqual(ipaddress.IPv6Interface('ffff:2:3:4:ffff::').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001659 b'\xff\xff\x00\x02\x00\x03\x00\x04\xff\xff'
1660 + b'\x00' * 6)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001661 self.assertEqual(ipaddress.IPv6Interface('::1:0:0:0:0').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001662 b'\x00' * 6 + b'\x00\x01' + b'\x00' * 8)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001663
Nick Coghlandc9b2552012-05-20 21:01:57 +10001664 def testIpType(self):
1665 ipv4net = ipaddress.ip_network('1.2.3.4')
1666 ipv4addr = ipaddress.ip_address('1.2.3.4')
1667 ipv6net = ipaddress.ip_network('::1.2.3.4')
1668 ipv6addr = ipaddress.ip_address('::1.2.3.4')
1669 self.assertEqual(ipaddress.IPv4Network, type(ipv4net))
1670 self.assertEqual(ipaddress.IPv4Address, type(ipv4addr))
1671 self.assertEqual(ipaddress.IPv6Network, type(ipv6net))
1672 self.assertEqual(ipaddress.IPv6Address, type(ipv6addr))
1673
1674 def testReservedIpv4(self):
1675 # test networks
1676 self.assertEqual(True, ipaddress.ip_interface(
1677 '224.1.1.1/31').is_multicast)
1678 self.assertEqual(False, ipaddress.ip_network('240.0.0.0').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001679 self.assertEqual(True, ipaddress.ip_network('240.0.0.0').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001680
1681 self.assertEqual(True, ipaddress.ip_interface(
1682 '192.168.1.1/17').is_private)
1683 self.assertEqual(False, ipaddress.ip_network('192.169.0.0').is_private)
1684 self.assertEqual(True, ipaddress.ip_network(
1685 '10.255.255.255').is_private)
1686 self.assertEqual(False, ipaddress.ip_network('11.0.0.0').is_private)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001687 self.assertEqual(False, ipaddress.ip_network('11.0.0.0').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001688 self.assertEqual(True, ipaddress.ip_network(
1689 '172.31.255.255').is_private)
1690 self.assertEqual(False, ipaddress.ip_network('172.32.0.0').is_private)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001691 self.assertEqual(True,
1692 ipaddress.ip_network('169.254.1.0/24').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001693
1694 self.assertEqual(True,
1695 ipaddress.ip_interface(
1696 '169.254.100.200/24').is_link_local)
1697 self.assertEqual(False,
1698 ipaddress.ip_interface(
1699 '169.255.100.200/24').is_link_local)
1700
1701 self.assertEqual(True,
1702 ipaddress.ip_network(
1703 '127.100.200.254/32').is_loopback)
1704 self.assertEqual(True, ipaddress.ip_network(
1705 '127.42.0.0/16').is_loopback)
1706 self.assertEqual(False, ipaddress.ip_network('128.0.0.0').is_loopback)
Peter Moodye5019d52013-10-24 09:47:10 -07001707 self.assertEqual(False,
1708 ipaddress.ip_network('100.64.0.0/10').is_private)
Peter Moodybe9c1b12013-10-22 12:36:21 -07001709 self.assertEqual(False, ipaddress.ip_network('100.64.0.0/10').is_global)
Peter Moodye5019d52013-10-24 09:47:10 -07001710
Peter Moody22c31762013-10-21 13:58:06 -07001711 self.assertEqual(True,
1712 ipaddress.ip_network('192.0.2.128/25').is_private)
1713 self.assertEqual(True,
1714 ipaddress.ip_network('192.0.3.0/24').is_global)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001715
1716 # test addresses
Hynek Schlawackbcd30442012-06-04 14:19:39 +02001717 self.assertEqual(True, ipaddress.ip_address('0.0.0.0').is_unspecified)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001718 self.assertEqual(True, ipaddress.ip_address('224.1.1.1').is_multicast)
1719 self.assertEqual(False, ipaddress.ip_address('240.0.0.0').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001720 self.assertEqual(True, ipaddress.ip_address('240.0.0.1').is_reserved)
1721 self.assertEqual(False,
1722 ipaddress.ip_address('239.255.255.255').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001723
1724 self.assertEqual(True, ipaddress.ip_address('192.168.1.1').is_private)
1725 self.assertEqual(False, ipaddress.ip_address('192.169.0.0').is_private)
1726 self.assertEqual(True, ipaddress.ip_address(
1727 '10.255.255.255').is_private)
1728 self.assertEqual(False, ipaddress.ip_address('11.0.0.0').is_private)
1729 self.assertEqual(True, ipaddress.ip_address(
1730 '172.31.255.255').is_private)
1731 self.assertEqual(False, ipaddress.ip_address('172.32.0.0').is_private)
1732
1733 self.assertEqual(True,
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001734 ipaddress.ip_address('169.254.100.200').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001735 self.assertEqual(False,
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001736 ipaddress.ip_address('169.255.100.200').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001737
Berker Peksag742192a2016-06-11 22:11:47 +03001738 self.assertTrue(ipaddress.ip_address('192.0.7.1').is_global)
1739 self.assertFalse(ipaddress.ip_address('203.0.113.1').is_global)
1740
Nick Coghlandc9b2552012-05-20 21:01:57 +10001741 self.assertEqual(True,
1742 ipaddress.ip_address('127.100.200.254').is_loopback)
1743 self.assertEqual(True, ipaddress.ip_address('127.42.0.0').is_loopback)
1744 self.assertEqual(False, ipaddress.ip_address('128.0.0.0').is_loopback)
1745 self.assertEqual(True, ipaddress.ip_network('0.0.0.0').is_unspecified)
1746
1747 def testReservedIpv6(self):
1748
1749 self.assertEqual(True, ipaddress.ip_network('ffff::').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001750 self.assertEqual(True, ipaddress.ip_network(2**128 - 1).is_multicast)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001751 self.assertEqual(True, ipaddress.ip_network('ff00::').is_multicast)
1752 self.assertEqual(False, ipaddress.ip_network('fdff::').is_multicast)
1753
1754 self.assertEqual(True, ipaddress.ip_network('fecf::').is_site_local)
1755 self.assertEqual(True, ipaddress.ip_network(
1756 'feff:ffff:ffff:ffff::').is_site_local)
1757 self.assertEqual(False, ipaddress.ip_network(
1758 'fbf:ffff::').is_site_local)
1759 self.assertEqual(False, ipaddress.ip_network('ff00::').is_site_local)
1760
1761 self.assertEqual(True, ipaddress.ip_network('fc00::').is_private)
1762 self.assertEqual(True, ipaddress.ip_network(
1763 'fc00:ffff:ffff:ffff::').is_private)
1764 self.assertEqual(False, ipaddress.ip_network('fbff:ffff::').is_private)
1765 self.assertEqual(False, ipaddress.ip_network('fe00::').is_private)
1766
1767 self.assertEqual(True, ipaddress.ip_network('fea0::').is_link_local)
1768 self.assertEqual(True, ipaddress.ip_network(
1769 'febf:ffff::').is_link_local)
1770 self.assertEqual(False, ipaddress.ip_network(
1771 'fe7f:ffff::').is_link_local)
1772 self.assertEqual(False, ipaddress.ip_network('fec0::').is_link_local)
1773
1774 self.assertEqual(True, ipaddress.ip_interface('0:0::0:01').is_loopback)
1775 self.assertEqual(False, ipaddress.ip_interface('::1/127').is_loopback)
1776 self.assertEqual(False, ipaddress.ip_network('::').is_loopback)
1777 self.assertEqual(False, ipaddress.ip_network('::2').is_loopback)
1778
1779 self.assertEqual(True, ipaddress.ip_network('0::0').is_unspecified)
1780 self.assertEqual(False, ipaddress.ip_network('::1').is_unspecified)
1781 self.assertEqual(False, ipaddress.ip_network('::/127').is_unspecified)
1782
Peter Moody22c31762013-10-21 13:58:06 -07001783 self.assertEqual(True,
1784 ipaddress.ip_network('2001::1/128').is_private)
1785 self.assertEqual(True,
1786 ipaddress.ip_network('200::1/128').is_global)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001787 # test addresses
1788 self.assertEqual(True, ipaddress.ip_address('ffff::').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001789 self.assertEqual(True, ipaddress.ip_address(2**128 - 1).is_multicast)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001790 self.assertEqual(True, ipaddress.ip_address('ff00::').is_multicast)
1791 self.assertEqual(False, ipaddress.ip_address('fdff::').is_multicast)
1792
1793 self.assertEqual(True, ipaddress.ip_address('fecf::').is_site_local)
1794 self.assertEqual(True, ipaddress.ip_address(
1795 'feff:ffff:ffff:ffff::').is_site_local)
1796 self.assertEqual(False, ipaddress.ip_address(
1797 'fbf:ffff::').is_site_local)
1798 self.assertEqual(False, ipaddress.ip_address('ff00::').is_site_local)
1799
1800 self.assertEqual(True, ipaddress.ip_address('fc00::').is_private)
1801 self.assertEqual(True, ipaddress.ip_address(
1802 'fc00:ffff:ffff:ffff::').is_private)
1803 self.assertEqual(False, ipaddress.ip_address('fbff:ffff::').is_private)
1804 self.assertEqual(False, ipaddress.ip_address('fe00::').is_private)
1805
1806 self.assertEqual(True, ipaddress.ip_address('fea0::').is_link_local)
1807 self.assertEqual(True, ipaddress.ip_address(
1808 'febf:ffff::').is_link_local)
1809 self.assertEqual(False, ipaddress.ip_address(
1810 'fe7f:ffff::').is_link_local)
1811 self.assertEqual(False, ipaddress.ip_address('fec0::').is_link_local)
1812
1813 self.assertEqual(True, ipaddress.ip_address('0:0::0:01').is_loopback)
1814 self.assertEqual(True, ipaddress.ip_address('::1').is_loopback)
1815 self.assertEqual(False, ipaddress.ip_address('::2').is_loopback)
1816
1817 self.assertEqual(True, ipaddress.ip_address('0::0').is_unspecified)
1818 self.assertEqual(False, ipaddress.ip_address('::1').is_unspecified)
1819
1820 # some generic IETF reserved addresses
1821 self.assertEqual(True, ipaddress.ip_address('100::').is_reserved)
1822 self.assertEqual(True, ipaddress.ip_network('4000::1/128').is_reserved)
1823
1824 def testIpv4Mapped(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001825 self.assertEqual(
1826 ipaddress.ip_address('::ffff:192.168.1.1').ipv4_mapped,
1827 ipaddress.ip_address('192.168.1.1'))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001828 self.assertEqual(ipaddress.ip_address('::c0a8:101').ipv4_mapped, None)
1829 self.assertEqual(ipaddress.ip_address('::ffff:c0a8:101').ipv4_mapped,
1830 ipaddress.ip_address('192.168.1.1'))
1831
1832 def testAddrExclude(self):
1833 addr1 = ipaddress.ip_network('10.1.1.0/24')
1834 addr2 = ipaddress.ip_network('10.1.1.0/26')
1835 addr3 = ipaddress.ip_network('10.2.1.0/24')
1836 addr4 = ipaddress.ip_address('10.1.1.0')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001837 addr5 = ipaddress.ip_network('2001:db8::0/32')
Serhiy Storchakabb0dbd52016-03-01 10:25:45 +02001838 addr6 = ipaddress.ip_network('10.1.1.5/32')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001839 self.assertEqual(sorted(list(addr1.address_exclude(addr2))),
1840 [ipaddress.ip_network('10.1.1.64/26'),
1841 ipaddress.ip_network('10.1.1.128/25')])
1842 self.assertRaises(ValueError, list, addr1.address_exclude(addr3))
1843 self.assertRaises(TypeError, list, addr1.address_exclude(addr4))
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001844 self.assertRaises(TypeError, list, addr1.address_exclude(addr5))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001845 self.assertEqual(list(addr1.address_exclude(addr1)), [])
Serhiy Storchakabb0dbd52016-03-01 10:25:45 +02001846 self.assertEqual(sorted(list(addr1.address_exclude(addr6))),
1847 [ipaddress.ip_network('10.1.1.0/30'),
1848 ipaddress.ip_network('10.1.1.4/32'),
1849 ipaddress.ip_network('10.1.1.6/31'),
1850 ipaddress.ip_network('10.1.1.8/29'),
1851 ipaddress.ip_network('10.1.1.16/28'),
1852 ipaddress.ip_network('10.1.1.32/27'),
1853 ipaddress.ip_network('10.1.1.64/26'),
1854 ipaddress.ip_network('10.1.1.128/25')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001855
1856 def testHash(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001857 self.assertEqual(hash(ipaddress.ip_interface('10.1.1.0/24')),
1858 hash(ipaddress.ip_interface('10.1.1.0/24')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001859 self.assertEqual(hash(ipaddress.ip_network('10.1.1.0/24')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001860 hash(ipaddress.ip_network('10.1.1.0/24')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001861 self.assertEqual(hash(ipaddress.ip_address('10.1.1.0')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001862 hash(ipaddress.ip_address('10.1.1.0')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001863 # i70
1864 self.assertEqual(hash(ipaddress.ip_address('1.2.3.4')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001865 hash(ipaddress.ip_address(
Nick Coghlandc9b2552012-05-20 21:01:57 +10001866 int(ipaddress.ip_address('1.2.3.4')._ip))))
1867 ip1 = ipaddress.ip_address('10.1.1.0')
1868 ip2 = ipaddress.ip_address('1::')
1869 dummy = {}
1870 dummy[self.ipv4_address] = None
1871 dummy[self.ipv6_address] = None
1872 dummy[ip1] = None
1873 dummy[ip2] = None
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001874 self.assertIn(self.ipv4_address, dummy)
1875 self.assertIn(ip2, dummy)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001876
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001877 def testIPBases(self):
1878 net = self.ipv4_network
1879 self.assertEqual('1.2.3.0/24', net.compressed)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001880 net = self.ipv6_network
1881 self.assertRaises(ValueError, net._string_from_ip_int, 2**128 + 1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001882
Hynek Schlawack454a74d2012-06-04 18:14:02 +02001883 def testIPv6NetworkHelpers(self):
1884 net = self.ipv6_network
1885 self.assertEqual('2001:658:22a:cafe::/64', net.with_prefixlen)
1886 self.assertEqual('2001:658:22a:cafe::/ffff:ffff:ffff:ffff::',
1887 net.with_netmask)
1888 self.assertEqual('2001:658:22a:cafe::/::ffff:ffff:ffff:ffff',
1889 net.with_hostmask)
1890 self.assertEqual('2001:658:22a:cafe::/64', str(net))
1891
1892 def testIPv4NetworkHelpers(self):
1893 net = self.ipv4_network
1894 self.assertEqual('1.2.3.0/24', net.with_prefixlen)
1895 self.assertEqual('1.2.3.0/255.255.255.0', net.with_netmask)
1896 self.assertEqual('1.2.3.0/0.0.0.255', net.with_hostmask)
1897 self.assertEqual('1.2.3.0/24', str(net))
1898
Nick Coghlandc9b2552012-05-20 21:01:57 +10001899 def testCopyConstructor(self):
1900 addr1 = ipaddress.ip_network('10.1.1.0/24')
1901 addr2 = ipaddress.ip_network(addr1)
1902 addr3 = ipaddress.ip_interface('2001:658:22a:cafe:200::1/64')
1903 addr4 = ipaddress.ip_interface(addr3)
1904 addr5 = ipaddress.IPv4Address('1.1.1.1')
1905 addr6 = ipaddress.IPv6Address('2001:658:22a:cafe:200::1')
1906
1907 self.assertEqual(addr1, addr2)
1908 self.assertEqual(addr3, addr4)
1909 self.assertEqual(addr5, ipaddress.IPv4Address(addr5))
1910 self.assertEqual(addr6, ipaddress.IPv6Address(addr6))
1911
1912 def testCompressIPv6Address(self):
1913 test_addresses = {
1914 '1:2:3:4:5:6:7:8': '1:2:3:4:5:6:7:8/128',
1915 '2001:0:0:4:0:0:0:8': '2001:0:0:4::8/128',
1916 '2001:0:0:4:5:6:7:8': '2001::4:5:6:7:8/128',
1917 '2001:0:3:4:5:6:7:8': '2001:0:3:4:5:6:7:8/128',
Nick Coghlandc9b2552012-05-20 21:01:57 +10001918 '0:0:3:0:0:0:0:ffff': '0:0:3::ffff/128',
1919 '0:0:0:4:0:0:0:ffff': '::4:0:0:0:ffff/128',
1920 '0:0:0:0:5:0:0:ffff': '::5:0:0:ffff/128',
1921 '1:0:0:4:0:0:7:8': '1::4:0:0:7:8/128',
1922 '0:0:0:0:0:0:0:0': '::/128',
1923 '0:0:0:0:0:0:0:0/0': '::/0',
1924 '0:0:0:0:0:0:0:1': '::1/128',
1925 '2001:0658:022a:cafe:0000:0000:0000:0000/66':
1926 '2001:658:22a:cafe::/66',
1927 '::1.2.3.4': '::102:304/128',
1928 '1:2:3:4:5:ffff:1.2.3.4': '1:2:3:4:5:ffff:102:304/128',
1929 '::7:6:5:4:3:2:1': '0:7:6:5:4:3:2:1/128',
1930 '::7:6:5:4:3:2:0': '0:7:6:5:4:3:2:0/128',
1931 '7:6:5:4:3:2:1::': '7:6:5:4:3:2:1:0/128',
1932 '0:6:5:4:3:2:1::': '0:6:5:4:3:2:1:0/128',
1933 }
1934 for uncompressed, compressed in list(test_addresses.items()):
1935 self.assertEqual(compressed, str(ipaddress.IPv6Interface(
1936 uncompressed)))
1937
1938 def testExplodeShortHandIpStr(self):
1939 addr1 = ipaddress.IPv6Interface('2001::1')
1940 addr2 = ipaddress.IPv6Address('2001:0:5ef5:79fd:0:59d:a0e5:ba1')
1941 addr3 = ipaddress.IPv6Network('2001::/96')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001942 addr4 = ipaddress.IPv4Address('192.168.178.1')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001943 self.assertEqual('2001:0000:0000:0000:0000:0000:0000:0001/128',
1944 addr1.exploded)
1945 self.assertEqual('0000:0000:0000:0000:0000:0000:0000:0001/128',
1946 ipaddress.IPv6Interface('::1/128').exploded)
1947 # issue 77
1948 self.assertEqual('2001:0000:5ef5:79fd:0000:059d:a0e5:0ba1',
1949 addr2.exploded)
1950 self.assertEqual('2001:0000:0000:0000:0000:0000:0000:0000/96',
1951 addr3.exploded)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001952 self.assertEqual('192.168.178.1', addr4.exploded)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001953
Eric V. Smithebdaaf42014-04-14 12:58:07 -04001954 def testReversePointer(self):
1955 addr1 = ipaddress.IPv4Address('127.0.0.1')
1956 addr2 = ipaddress.IPv6Address('2001:db8::1')
1957 self.assertEqual('1.0.0.127.in-addr.arpa', addr1.reverse_pointer)
1958 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.' +
1959 'b.d.0.1.0.0.2.ip6.arpa',
1960 addr2.reverse_pointer)
1961
Nick Coghlandc9b2552012-05-20 21:01:57 +10001962 def testIntRepresentation(self):
1963 self.assertEqual(16909060, int(self.ipv4_address))
1964 self.assertEqual(42540616829182469433547762482097946625,
1965 int(self.ipv6_address))
1966
Nick Coghlandc9b2552012-05-20 21:01:57 +10001967 def testForceVersion(self):
1968 self.assertEqual(ipaddress.ip_network(1).version, 4)
Nick Coghlan51c30672012-05-27 00:25:58 +10001969 self.assertEqual(ipaddress.IPv6Network(1).version, 6)
Sandro Tosi876ecad2012-05-23 22:26:55 +02001970
Nick Coghlandc9b2552012-05-20 21:01:57 +10001971 def testWithStar(self):
Nick Coghlana8517ad2012-08-20 10:04:26 +10001972 self.assertEqual(self.ipv4_interface.with_prefixlen, "1.2.3.4/24")
1973 self.assertEqual(self.ipv4_interface.with_netmask,
Nick Coghlandc9b2552012-05-20 21:01:57 +10001974 "1.2.3.4/255.255.255.0")
Nick Coghlana8517ad2012-08-20 10:04:26 +10001975 self.assertEqual(self.ipv4_interface.with_hostmask,
Nick Coghlandc9b2552012-05-20 21:01:57 +10001976 "1.2.3.4/0.0.0.255")
1977
Nick Coghlana8517ad2012-08-20 10:04:26 +10001978 self.assertEqual(self.ipv6_interface.with_prefixlen,
Nick Coghlandc9b2552012-05-20 21:01:57 +10001979 '2001:658:22a:cafe:200::1/64')
Nick Coghlana8517ad2012-08-20 10:04:26 +10001980 self.assertEqual(self.ipv6_interface.with_netmask,
1981 '2001:658:22a:cafe:200::1/ffff:ffff:ffff:ffff::')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001982 # this probably don't make much sense, but it's included for
1983 # compatibility with ipv4
Nick Coghlana8517ad2012-08-20 10:04:26 +10001984 self.assertEqual(self.ipv6_interface.with_hostmask,
Nick Coghlandc9b2552012-05-20 21:01:57 +10001985 '2001:658:22a:cafe:200::1/::ffff:ffff:ffff:ffff')
1986
1987 def testNetworkElementCaching(self):
1988 # V4 - make sure we're empty
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001989 self.assertNotIn('network_address', self.ipv4_network._cache)
1990 self.assertNotIn('broadcast_address', self.ipv4_network._cache)
1991 self.assertNotIn('hostmask', self.ipv4_network._cache)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001992
1993 # V4 - populate and test
1994 self.assertEqual(self.ipv4_network.network_address,
1995 ipaddress.IPv4Address('1.2.3.0'))
1996 self.assertEqual(self.ipv4_network.broadcast_address,
1997 ipaddress.IPv4Address('1.2.3.255'))
1998 self.assertEqual(self.ipv4_network.hostmask,
1999 ipaddress.IPv4Address('0.0.0.255'))
2000
2001 # V4 - check we're cached
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02002002 self.assertIn('broadcast_address', self.ipv4_network._cache)
2003 self.assertIn('hostmask', self.ipv4_network._cache)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002004
2005 # V6 - make sure we're empty
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02002006 self.assertNotIn('broadcast_address', self.ipv6_network._cache)
2007 self.assertNotIn('hostmask', self.ipv6_network._cache)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002008
2009 # V6 - populate and test
2010 self.assertEqual(self.ipv6_network.network_address,
2011 ipaddress.IPv6Address('2001:658:22a:cafe::'))
2012 self.assertEqual(self.ipv6_interface.network.network_address,
2013 ipaddress.IPv6Address('2001:658:22a:cafe::'))
2014
2015 self.assertEqual(
2016 self.ipv6_network.broadcast_address,
2017 ipaddress.IPv6Address('2001:658:22a:cafe:ffff:ffff:ffff:ffff'))
2018 self.assertEqual(self.ipv6_network.hostmask,
2019 ipaddress.IPv6Address('::ffff:ffff:ffff:ffff'))
2020 self.assertEqual(
2021 self.ipv6_interface.network.broadcast_address,
2022 ipaddress.IPv6Address('2001:658:22a:cafe:ffff:ffff:ffff:ffff'))
2023 self.assertEqual(self.ipv6_interface.network.hostmask,
2024 ipaddress.IPv6Address('::ffff:ffff:ffff:ffff'))
2025
2026 # V6 - check we're cached
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02002027 self.assertIn('broadcast_address', self.ipv6_network._cache)
2028 self.assertIn('hostmask', self.ipv6_network._cache)
2029 self.assertIn('broadcast_address', self.ipv6_interface.network._cache)
2030 self.assertIn('hostmask', self.ipv6_interface.network._cache)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002031
2032 def testTeredo(self):
2033 # stolen from wikipedia
2034 server = ipaddress.IPv4Address('65.54.227.120')
2035 client = ipaddress.IPv4Address('192.0.2.45')
2036 teredo_addr = '2001:0000:4136:e378:8000:63bf:3fff:fdd2'
2037 self.assertEqual((server, client),
2038 ipaddress.ip_address(teredo_addr).teredo)
2039 bad_addr = '2000::4136:e378:8000:63bf:3fff:fdd2'
2040 self.assertFalse(ipaddress.ip_address(bad_addr).teredo)
2041 bad_addr = '2001:0001:4136:e378:8000:63bf:3fff:fdd2'
2042 self.assertFalse(ipaddress.ip_address(bad_addr).teredo)
2043
2044 # i77
2045 teredo_addr = ipaddress.IPv6Address('2001:0:5ef5:79fd:0:59d:a0e5:ba1')
2046 self.assertEqual((ipaddress.IPv4Address('94.245.121.253'),
2047 ipaddress.IPv4Address('95.26.244.94')),
2048 teredo_addr.teredo)
2049
Nick Coghlandc9b2552012-05-20 21:01:57 +10002050 def testsixtofour(self):
2051 sixtofouraddr = ipaddress.ip_address('2002:ac1d:2d64::1')
2052 bad_addr = ipaddress.ip_address('2000:ac1d:2d64::1')
2053 self.assertEqual(ipaddress.IPv4Address('172.29.45.100'),
2054 sixtofouraddr.sixtofour)
2055 self.assertFalse(bad_addr.sixtofour)
2056
Nick Coghlandc9b2552012-05-20 21:01:57 +10002057
2058if __name__ == '__main__':
2059 unittest.main()