blob: 9e17ea0c7aac855d98abdee5c533c53c98a1a16c [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):
Inada Naoki6fa84bd2019-04-16 08:32:28 +0900402 for address in ('1.2.3.4', 0x01020304, b'\x01\x02\x03\x04'):
403 net = self.factory(address)
404 self.assertEqual(str(net), '1.2.3.4/32')
405 self.assertEqual(str(net.netmask), '255.255.255.255')
406 self.assertEqual(str(net.hostmask), '0.0.0.0')
407 # IPv4Network has prefixlen, but IPv4Interface doesn't.
408 # Should we add it to IPv4Interface too? (bpo-36392)
Cheryl Sabella5609b782018-03-20 20:09:15 -0400409
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000410 def test_split_netmask(self):
411 addr = "1.2.3.4/32/24"
412 with self.assertAddressError("Only one '/' permitted in %r" % addr):
413 self.factory(addr)
414
415 def test_address_errors(self):
416 def assertBadAddress(addr, details):
417 with self.assertAddressError(details):
418 self.factory(addr)
419
Nick Coghlan297b1432012-07-08 17:11:04 +1000420 assertBadAddress("/", "Address cannot be empty")
421 assertBadAddress("/8", "Address cannot be empty")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000422 assertBadAddress("bogus", "Expected 4 octets")
423 assertBadAddress("google.com", "Expected 4 octets")
424 assertBadAddress("10/8", "Expected 4 octets")
425 assertBadAddress("::1.2.3.4", "Only decimal digits")
Nick Coghlanb582ecc2012-07-07 22:15:22 +1000426 assertBadAddress("1.2.3.256", re.escape("256 (> 255)"))
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000427
Nick Coghlan932346f2014-02-08 23:17:36 +1000428 def test_valid_netmask(self):
429 self.assertEqual(str(self.factory('192.0.2.0/255.255.255.0')),
430 '192.0.2.0/24')
431 for i in range(0, 33):
432 # Generate and re-parse the CIDR format (trivial).
433 net_str = '0.0.0.0/%d' % i
434 net = self.factory(net_str)
435 self.assertEqual(str(net), net_str)
436 # Generate and re-parse the expanded netmask.
437 self.assertEqual(
438 str(self.factory('0.0.0.0/%s' % net.netmask)), net_str)
439 # Zero prefix is treated as decimal.
440 self.assertEqual(str(self.factory('0.0.0.0/0%d' % i)), net_str)
441 # Generate and re-parse the expanded hostmask. The ambiguous
442 # cases (/0 and /32) are treated as netmasks.
443 if i in (32, 0):
444 net_str = '0.0.0.0/%d' % (32 - i)
445 self.assertEqual(
446 str(self.factory('0.0.0.0/%s' % net.hostmask)), net_str)
447
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000448 def test_netmask_errors(self):
449 def assertBadNetmask(addr, netmask):
Nick Coghlan932346f2014-02-08 23:17:36 +1000450 msg = "%r is not a valid netmask" % netmask
451 with self.assertNetmaskError(re.escape(msg)):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000452 self.factory("%s/%s" % (addr, netmask))
453
454 assertBadNetmask("1.2.3.4", "")
Nick Coghlan932346f2014-02-08 23:17:36 +1000455 assertBadNetmask("1.2.3.4", "-1")
456 assertBadNetmask("1.2.3.4", "+1")
457 assertBadNetmask("1.2.3.4", " 1 ")
458 assertBadNetmask("1.2.3.4", "0x1")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000459 assertBadNetmask("1.2.3.4", "33")
460 assertBadNetmask("1.2.3.4", "254.254.255.256")
Nick Coghlan932346f2014-02-08 23:17:36 +1000461 assertBadNetmask("1.2.3.4", "1.a.2.3")
Nick Coghlan07c4e332012-07-08 23:06:45 +1000462 assertBadNetmask("1.1.1.1", "254.xyz.2.3")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000463 assertBadNetmask("1.1.1.1", "240.255.0.0")
Nick Coghlan932346f2014-02-08 23:17:36 +1000464 assertBadNetmask("1.1.1.1", "255.254.128.0")
465 assertBadNetmask("1.1.1.1", "0.1.127.255")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000466 assertBadNetmask("1.1.1.1", "pudding")
Nick Coghlan932346f2014-02-08 23:17:36 +1000467 assertBadNetmask("1.1.1.1", "::")
468
Nicolai Moore5e48e3d2019-05-14 20:32:59 +1000469 def test_netmask_in_tuple_errors(self):
470 def assertBadNetmask(addr, netmask):
471 msg = "%r is not a valid netmask" % netmask
472 with self.assertNetmaskError(re.escape(msg)):
473 self.factory((addr, netmask))
474 assertBadNetmask("1.1.1.1", -1)
475 assertBadNetmask("1.1.1.1", 33)
476
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +0200477 def test_pickle(self):
478 self.pickle_test('192.0.2.0/27')
479 self.pickle_test('192.0.2.0/31') # IPV4LENGTH - 1
480 self.pickle_test('192.0.2.0') # IPV4LENGTH
481
R David Murray75678652014-10-12 15:17:22 -0400482
Serhiy Storchakaa556af72015-01-18 22:56:47 +0200483class InterfaceTestCase_v4(BaseTestCase, NetmaskTestMixin_v4):
484 factory = ipaddress.IPv4Interface
485
486
Nick Coghlan07c4e332012-07-08 23:06:45 +1000487class NetworkTestCase_v4(BaseTestCase, NetmaskTestMixin_v4):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000488 factory = ipaddress.IPv4Network
489
Cheryl Sabella91dc64b2017-10-22 17:39:49 -0400490 def test_subnet_of(self):
491 # containee left of container
492 self.assertFalse(
493 self.factory('10.0.0.0/30').subnet_of(
494 self.factory('10.0.1.0/24')))
495 # containee inside container
496 self.assertTrue(
497 self.factory('10.0.0.0/30').subnet_of(
498 self.factory('10.0.0.0/24')))
499 # containee right of container
500 self.assertFalse(
501 self.factory('10.0.0.0/30').subnet_of(
502 self.factory('10.0.1.0/24')))
503 # containee larger than container
504 self.assertFalse(
505 self.factory('10.0.1.0/24').subnet_of(
506 self.factory('10.0.0.0/30')))
507
508 def test_supernet_of(self):
509 # containee left of container
510 self.assertFalse(
511 self.factory('10.0.0.0/30').supernet_of(
512 self.factory('10.0.1.0/24')))
513 # containee inside container
514 self.assertFalse(
515 self.factory('10.0.0.0/30').supernet_of(
516 self.factory('10.0.0.0/24')))
517 # containee right of container
518 self.assertFalse(
519 self.factory('10.0.0.0/30').supernet_of(
520 self.factory('10.0.1.0/24')))
521 # containee larger than container
522 self.assertTrue(
523 self.factory('10.0.0.0/24').supernet_of(
524 self.factory('10.0.0.0/30')))
525
526 def test_subnet_of_mixed_types(self):
527 with self.assertRaises(TypeError):
528 ipaddress.IPv4Network('10.0.0.0/30').supernet_of(
529 ipaddress.IPv6Network('::1/128'))
530 with self.assertRaises(TypeError):
531 ipaddress.IPv6Network('::1/128').supernet_of(
532 ipaddress.IPv4Network('10.0.0.0/30'))
533 with self.assertRaises(TypeError):
534 ipaddress.IPv4Network('10.0.0.0/30').subnet_of(
535 ipaddress.IPv6Network('::1/128'))
536 with self.assertRaises(TypeError):
537 ipaddress.IPv6Network('::1/128').subnet_of(
538 ipaddress.IPv4Network('10.0.0.0/30'))
539
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000540
Nick Coghlan07c4e332012-07-08 23:06:45 +1000541class NetmaskTestMixin_v6(CommonTestMixin_v6):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000542 """Input validation on interfaces and networks is very similar"""
543
Inada Naoki6fa84bd2019-04-16 08:32:28 +0900544 def test_no_mask(self):
545 for address in ('::1', 1, b'\x00'*15 + b'\x01'):
546 net = self.factory(address)
547 self.assertEqual(str(net), '::1/128')
548 self.assertEqual(str(net.netmask), 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff')
549 self.assertEqual(str(net.hostmask), '::')
550 # IPv6Network has prefixlen, but IPv6Interface doesn't.
551 # Should we add it to IPv4Interface too? (bpo-36392)
552
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000553 def test_split_netmask(self):
554 addr = "cafe:cafe::/128/190"
555 with self.assertAddressError("Only one '/' permitted in %r" % addr):
556 self.factory(addr)
557
558 def test_address_errors(self):
559 def assertBadAddress(addr, details):
560 with self.assertAddressError(details):
561 self.factory(addr)
562
Nick Coghlan297b1432012-07-08 17:11:04 +1000563 assertBadAddress("/", "Address cannot be empty")
564 assertBadAddress("/8", "Address cannot be empty")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000565 assertBadAddress("google.com", "At least 3 parts")
566 assertBadAddress("1.2.3.4", "At least 3 parts")
567 assertBadAddress("10/8", "At least 3 parts")
568 assertBadAddress("1234:axy::b", "Only hex digits")
569
Nick Coghlan932346f2014-02-08 23:17:36 +1000570 def test_valid_netmask(self):
571 # We only support CIDR for IPv6, because expanded netmasks are not
572 # standard notation.
573 self.assertEqual(str(self.factory('2001:db8::/32')), '2001:db8::/32')
574 for i in range(0, 129):
575 # Generate and re-parse the CIDR format (trivial).
576 net_str = '::/%d' % i
577 self.assertEqual(str(self.factory(net_str)), net_str)
578 # Zero prefix is treated as decimal.
579 self.assertEqual(str(self.factory('::/0%d' % i)), net_str)
580
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000581 def test_netmask_errors(self):
582 def assertBadNetmask(addr, netmask):
Nick Coghlan932346f2014-02-08 23:17:36 +1000583 msg = "%r is not a valid netmask" % netmask
584 with self.assertNetmaskError(re.escape(msg)):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000585 self.factory("%s/%s" % (addr, netmask))
586
587 assertBadNetmask("::1", "")
588 assertBadNetmask("::1", "::1")
589 assertBadNetmask("::1", "1::")
Nick Coghlan932346f2014-02-08 23:17:36 +1000590 assertBadNetmask("::1", "-1")
591 assertBadNetmask("::1", "+1")
592 assertBadNetmask("::1", " 1 ")
593 assertBadNetmask("::1", "0x1")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000594 assertBadNetmask("::1", "129")
Nick Coghlan932346f2014-02-08 23:17:36 +1000595 assertBadNetmask("::1", "1.2.3.4")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000596 assertBadNetmask("::1", "pudding")
Nick Coghlan932346f2014-02-08 23:17:36 +1000597 assertBadNetmask("::", "::")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000598
Nicolai Moore5e48e3d2019-05-14 20:32:59 +1000599 def test_netmask_in_tuple_errors(self):
600 def assertBadNetmask(addr, netmask):
601 msg = "%r is not a valid netmask" % netmask
602 with self.assertNetmaskError(re.escape(msg)):
603 self.factory((addr, netmask))
604 assertBadNetmask("::1", -1)
605 assertBadNetmask("::1", 129)
606
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +0200607 def test_pickle(self):
608 self.pickle_test('2001:db8::1000/124')
609 self.pickle_test('2001:db8::1000/127') # IPV6LENGTH - 1
610 self.pickle_test('2001:db8::1000') # IPV6LENGTH
611
R David Murray75678652014-10-12 15:17:22 -0400612
Nick Coghlan07c4e332012-07-08 23:06:45 +1000613class InterfaceTestCase_v6(BaseTestCase, NetmaskTestMixin_v6):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000614 factory = ipaddress.IPv6Interface
615
R David Murray75678652014-10-12 15:17:22 -0400616
Nick Coghlan07c4e332012-07-08 23:06:45 +1000617class NetworkTestCase_v6(BaseTestCase, NetmaskTestMixin_v6):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000618 factory = ipaddress.IPv6Network
619
Cheryl Sabella91dc64b2017-10-22 17:39:49 -0400620 def test_subnet_of(self):
621 # containee left of container
622 self.assertFalse(
623 self.factory('2000:999::/56').subnet_of(
624 self.factory('2000:aaa::/48')))
625 # containee inside container
626 self.assertTrue(
627 self.factory('2000:aaa::/56').subnet_of(
628 self.factory('2000:aaa::/48')))
629 # containee right of container
630 self.assertFalse(
631 self.factory('2000:bbb::/56').subnet_of(
632 self.factory('2000:aaa::/48')))
633 # containee larger than container
634 self.assertFalse(
635 self.factory('2000:aaa::/48').subnet_of(
636 self.factory('2000:aaa::/56')))
637
638 def test_supernet_of(self):
639 # containee left of container
640 self.assertFalse(
641 self.factory('2000:999::/56').supernet_of(
642 self.factory('2000:aaa::/48')))
643 # containee inside container
644 self.assertFalse(
645 self.factory('2000:aaa::/56').supernet_of(
646 self.factory('2000:aaa::/48')))
647 # containee right of container
648 self.assertFalse(
649 self.factory('2000:bbb::/56').supernet_of(
650 self.factory('2000:aaa::/48')))
651 # containee larger than container
652 self.assertTrue(
653 self.factory('2000:aaa::/48').supernet_of(
654 self.factory('2000:aaa::/56')))
655
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000656
Nick Coghlan07c4e332012-07-08 23:06:45 +1000657class FactoryFunctionErrors(BaseTestCase):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000658
659 def assertFactoryError(self, factory, kind):
660 """Ensure a clean ValueError with the expected message"""
661 addr = "camelot"
662 msg = '%r does not appear to be an IPv4 or IPv6 %s'
663 with self.assertCleanError(ValueError, msg, addr, kind):
664 factory(addr)
665
666 def test_ip_address(self):
667 self.assertFactoryError(ipaddress.ip_address, "address")
668
669 def test_ip_interface(self):
670 self.assertFactoryError(ipaddress.ip_interface, "interface")
671
672 def test_ip_network(self):
673 self.assertFactoryError(ipaddress.ip_network, "network")
674
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200675
Serhiy Storchakaf186e122015-01-26 10:11:16 +0200676@functools.total_ordering
677class LargestObject:
678 def __eq__(self, other):
679 return isinstance(other, LargestObject)
680 def __lt__(self, other):
681 return False
682
683@functools.total_ordering
684class SmallestObject:
685 def __eq__(self, other):
686 return isinstance(other, SmallestObject)
687 def __gt__(self, other):
688 return False
689
Nick Coghlan3008ec02012-07-08 00:45:33 +1000690class ComparisonTests(unittest.TestCase):
691
692 v4addr = ipaddress.IPv4Address(1)
693 v4net = ipaddress.IPv4Network(1)
694 v4intf = ipaddress.IPv4Interface(1)
695 v6addr = ipaddress.IPv6Address(1)
696 v6net = ipaddress.IPv6Network(1)
697 v6intf = ipaddress.IPv6Interface(1)
698
699 v4_addresses = [v4addr, v4intf]
700 v4_objects = v4_addresses + [v4net]
701 v6_addresses = [v6addr, v6intf]
702 v6_objects = v6_addresses + [v6net]
R David Murray947ff382016-06-02 15:46:04 -0400703
Nick Coghlan3008ec02012-07-08 00:45:33 +1000704 objects = v4_objects + v6_objects
705
R David Murray947ff382016-06-02 15:46:04 -0400706 v4addr2 = ipaddress.IPv4Address(2)
707 v4net2 = ipaddress.IPv4Network(2)
708 v4intf2 = ipaddress.IPv4Interface(2)
709 v6addr2 = ipaddress.IPv6Address(2)
710 v6net2 = ipaddress.IPv6Network(2)
711 v6intf2 = ipaddress.IPv6Interface(2)
712
Nick Coghlan3008ec02012-07-08 00:45:33 +1000713 def test_foreign_type_equality(self):
714 # __eq__ should never raise TypeError directly
715 other = object()
716 for obj in self.objects:
717 self.assertNotEqual(obj, other)
718 self.assertFalse(obj == other)
719 self.assertEqual(obj.__eq__(other), NotImplemented)
720 self.assertEqual(obj.__ne__(other), NotImplemented)
721
722 def test_mixed_type_equality(self):
723 # Ensure none of the internal objects accidentally
724 # expose the right set of attributes to become "equal"
725 for lhs in self.objects:
726 for rhs in self.objects:
727 if lhs is rhs:
728 continue
729 self.assertNotEqual(lhs, rhs)
730
R David Murray947ff382016-06-02 15:46:04 -0400731 def test_same_type_equality(self):
732 for obj in self.objects:
733 self.assertEqual(obj, obj)
734 self.assertLessEqual(obj, obj)
735 self.assertGreaterEqual(obj, obj)
736
737 def test_same_type_ordering(self):
738 for lhs, rhs in (
739 (self.v4addr, self.v4addr2),
740 (self.v4net, self.v4net2),
741 (self.v4intf, self.v4intf2),
742 (self.v6addr, self.v6addr2),
743 (self.v6net, self.v6net2),
744 (self.v6intf, self.v6intf2),
745 ):
746 self.assertNotEqual(lhs, rhs)
747 self.assertLess(lhs, rhs)
748 self.assertLessEqual(lhs, rhs)
749 self.assertGreater(rhs, lhs)
750 self.assertGreaterEqual(rhs, lhs)
751 self.assertFalse(lhs > rhs)
752 self.assertFalse(rhs < lhs)
753 self.assertFalse(lhs >= rhs)
754 self.assertFalse(rhs <= lhs)
755
Nick Coghlan3008ec02012-07-08 00:45:33 +1000756 def test_containment(self):
757 for obj in self.v4_addresses:
758 self.assertIn(obj, self.v4net)
759 for obj in self.v6_addresses:
760 self.assertIn(obj, self.v6net)
761 for obj in self.v4_objects + [self.v6net]:
762 self.assertNotIn(obj, self.v6net)
763 for obj in self.v6_objects + [self.v4net]:
764 self.assertNotIn(obj, self.v4net)
765
766 def test_mixed_type_ordering(self):
767 for lhs in self.objects:
768 for rhs in self.objects:
769 if isinstance(lhs, type(rhs)) or isinstance(rhs, type(lhs)):
770 continue
771 self.assertRaises(TypeError, lambda: lhs < rhs)
772 self.assertRaises(TypeError, lambda: lhs > rhs)
773 self.assertRaises(TypeError, lambda: lhs <= rhs)
774 self.assertRaises(TypeError, lambda: lhs >= rhs)
775
Serhiy Storchakaf186e122015-01-26 10:11:16 +0200776 def test_foreign_type_ordering(self):
777 other = object()
778 smallest = SmallestObject()
779 largest = LargestObject()
780 for obj in self.objects:
781 with self.assertRaises(TypeError):
782 obj < other
783 with self.assertRaises(TypeError):
784 obj > other
785 with self.assertRaises(TypeError):
786 obj <= other
787 with self.assertRaises(TypeError):
788 obj >= other
789 self.assertTrue(obj < largest)
790 self.assertFalse(obj > largest)
791 self.assertTrue(obj <= largest)
792 self.assertFalse(obj >= largest)
793 self.assertFalse(obj < smallest)
794 self.assertTrue(obj > smallest)
795 self.assertFalse(obj <= smallest)
796 self.assertTrue(obj >= smallest)
797
Nick Coghlan3008ec02012-07-08 00:45:33 +1000798 def test_mixed_type_key(self):
799 # with get_mixed_type_key, you can sort addresses and network.
800 v4_ordered = [self.v4addr, self.v4net, self.v4intf]
801 v6_ordered = [self.v6addr, self.v6net, self.v6intf]
802 self.assertEqual(v4_ordered,
803 sorted(self.v4_objects,
804 key=ipaddress.get_mixed_type_key))
805 self.assertEqual(v6_ordered,
806 sorted(self.v6_objects,
807 key=ipaddress.get_mixed_type_key))
808 self.assertEqual(v4_ordered + v6_ordered,
809 sorted(self.objects,
810 key=ipaddress.get_mixed_type_key))
811 self.assertEqual(NotImplemented, ipaddress.get_mixed_type_key(object))
812
813 def test_incompatible_versions(self):
814 # These should always raise TypeError
815 v4addr = ipaddress.ip_address('1.1.1.1')
816 v4net = ipaddress.ip_network('1.1.1.1')
817 v6addr = ipaddress.ip_address('::1')
Serhiy Storchakaf186e122015-01-26 10:11:16 +0200818 v6net = ipaddress.ip_network('::1')
Nick Coghlan3008ec02012-07-08 00:45:33 +1000819
820 self.assertRaises(TypeError, v4addr.__lt__, v6addr)
821 self.assertRaises(TypeError, v4addr.__gt__, v6addr)
822 self.assertRaises(TypeError, v4net.__lt__, v6net)
823 self.assertRaises(TypeError, v4net.__gt__, v6net)
824
825 self.assertRaises(TypeError, v6addr.__lt__, v4addr)
826 self.assertRaises(TypeError, v6addr.__gt__, v4addr)
827 self.assertRaises(TypeError, v6net.__lt__, v4net)
828 self.assertRaises(TypeError, v6net.__gt__, v4net)
829
830
Nick Coghlandc9b2552012-05-20 21:01:57 +1000831class IpaddrUnitTest(unittest.TestCase):
832
833 def setUp(self):
834 self.ipv4_address = ipaddress.IPv4Address('1.2.3.4')
835 self.ipv4_interface = ipaddress.IPv4Interface('1.2.3.4/24')
836 self.ipv4_network = ipaddress.IPv4Network('1.2.3.0/24')
837 #self.ipv4_hostmask = ipaddress.IPv4Interface('10.0.0.1/0.255.255.255')
838 self.ipv6_address = ipaddress.IPv6Interface(
839 '2001:658:22a:cafe:200:0:0:1')
840 self.ipv6_interface = ipaddress.IPv6Interface(
841 '2001:658:22a:cafe:200:0:0:1/64')
842 self.ipv6_network = ipaddress.IPv6Network('2001:658:22a:cafe::/64')
843
844 def testRepr(self):
845 self.assertEqual("IPv4Interface('1.2.3.4/32')",
846 repr(ipaddress.IPv4Interface('1.2.3.4')))
847 self.assertEqual("IPv6Interface('::1/128')",
848 repr(ipaddress.IPv6Interface('::1')))
849
Martin Panter204bf0b2016-07-11 07:51:37 +0000850 # issue #16531: constructing IPv4Network from an (address, mask) tuple
Antoine Pitrou5fb195f2014-05-12 20:36:46 +0200851 def testIPv4Tuple(self):
852 # /32
853 ip = ipaddress.IPv4Address('192.0.2.1')
854 net = ipaddress.IPv4Network('192.0.2.1/32')
855 self.assertEqual(ipaddress.IPv4Network(('192.0.2.1', 32)), net)
856 self.assertEqual(ipaddress.IPv4Network((ip, 32)), net)
857 self.assertEqual(ipaddress.IPv4Network((3221225985, 32)), net)
858 self.assertEqual(ipaddress.IPv4Network(('192.0.2.1',
859 '255.255.255.255')), net)
860 self.assertEqual(ipaddress.IPv4Network((ip,
861 '255.255.255.255')), net)
862 self.assertEqual(ipaddress.IPv4Network((3221225985,
863 '255.255.255.255')), net)
864 # strict=True and host bits set
865 with self.assertRaises(ValueError):
866 ipaddress.IPv4Network(('192.0.2.1', 24))
867 with self.assertRaises(ValueError):
868 ipaddress.IPv4Network((ip, 24))
869 with self.assertRaises(ValueError):
870 ipaddress.IPv4Network((3221225985, 24))
871 with self.assertRaises(ValueError):
872 ipaddress.IPv4Network(('192.0.2.1', '255.255.255.0'))
873 with self.assertRaises(ValueError):
874 ipaddress.IPv4Network((ip, '255.255.255.0'))
875 with self.assertRaises(ValueError):
876 ipaddress.IPv4Network((3221225985, '255.255.255.0'))
877 # strict=False and host bits set
878 net = ipaddress.IPv4Network('192.0.2.0/24')
879 self.assertEqual(ipaddress.IPv4Network(('192.0.2.1', 24),
880 strict=False), net)
881 self.assertEqual(ipaddress.IPv4Network((ip, 24),
882 strict=False), net)
883 self.assertEqual(ipaddress.IPv4Network((3221225985, 24),
884 strict=False), net)
885 self.assertEqual(ipaddress.IPv4Network(('192.0.2.1',
886 '255.255.255.0'),
887 strict=False), net)
888 self.assertEqual(ipaddress.IPv4Network((ip,
889 '255.255.255.0'),
890 strict=False), net)
891 self.assertEqual(ipaddress.IPv4Network((3221225985,
892 '255.255.255.0'),
893 strict=False), net)
894
895 # /24
896 ip = ipaddress.IPv4Address('192.0.2.0')
897 net = ipaddress.IPv4Network('192.0.2.0/24')
898 self.assertEqual(ipaddress.IPv4Network(('192.0.2.0',
899 '255.255.255.0')), net)
900 self.assertEqual(ipaddress.IPv4Network((ip,
901 '255.255.255.0')), net)
902 self.assertEqual(ipaddress.IPv4Network((3221225984,
903 '255.255.255.0')), net)
904 self.assertEqual(ipaddress.IPv4Network(('192.0.2.0', 24)), net)
905 self.assertEqual(ipaddress.IPv4Network((ip, 24)), net)
906 self.assertEqual(ipaddress.IPv4Network((3221225984, 24)), net)
907
908 self.assertEqual(ipaddress.IPv4Interface(('192.0.2.1', 24)),
909 ipaddress.IPv4Interface('192.0.2.1/24'))
910 self.assertEqual(ipaddress.IPv4Interface((3221225985, 24)),
911 ipaddress.IPv4Interface('192.0.2.1/24'))
912
Martin Panter204bf0b2016-07-11 07:51:37 +0000913 # issue #16531: constructing IPv6Network from an (address, mask) tuple
Antoine Pitrou5fb195f2014-05-12 20:36:46 +0200914 def testIPv6Tuple(self):
915 # /128
916 ip = ipaddress.IPv6Address('2001:db8::')
917 net = ipaddress.IPv6Network('2001:db8::/128')
918 self.assertEqual(ipaddress.IPv6Network(('2001:db8::', '128')),
919 net)
920 self.assertEqual(ipaddress.IPv6Network(
921 (42540766411282592856903984951653826560, 128)),
922 net)
923 self.assertEqual(ipaddress.IPv6Network((ip, '128')),
924 net)
925 ip = ipaddress.IPv6Address('2001:db8::')
926 net = ipaddress.IPv6Network('2001:db8::/96')
927 self.assertEqual(ipaddress.IPv6Network(('2001:db8::', '96')),
928 net)
929 self.assertEqual(ipaddress.IPv6Network(
930 (42540766411282592856903984951653826560, 96)),
931 net)
932 self.assertEqual(ipaddress.IPv6Network((ip, '96')),
933 net)
934
935 # strict=True and host bits set
936 ip = ipaddress.IPv6Address('2001:db8::1')
937 with self.assertRaises(ValueError):
938 ipaddress.IPv6Network(('2001:db8::1', 96))
939 with self.assertRaises(ValueError):
940 ipaddress.IPv6Network((
941 42540766411282592856903984951653826561, 96))
942 with self.assertRaises(ValueError):
943 ipaddress.IPv6Network((ip, 96))
944 # strict=False and host bits set
945 net = ipaddress.IPv6Network('2001:db8::/96')
946 self.assertEqual(ipaddress.IPv6Network(('2001:db8::1', 96),
947 strict=False),
948 net)
949 self.assertEqual(ipaddress.IPv6Network(
950 (42540766411282592856903984951653826561, 96),
951 strict=False),
952 net)
953 self.assertEqual(ipaddress.IPv6Network((ip, 96), strict=False),
954 net)
955
956 # /96
957 self.assertEqual(ipaddress.IPv6Interface(('2001:db8::1', '96')),
958 ipaddress.IPv6Interface('2001:db8::1/96'))
959 self.assertEqual(ipaddress.IPv6Interface(
960 (42540766411282592856903984951653826561, '96')),
961 ipaddress.IPv6Interface('2001:db8::1/96'))
962
Nick Coghlandc9b2552012-05-20 21:01:57 +1000963 # issue57
964 def testAddressIntMath(self):
965 self.assertEqual(ipaddress.IPv4Address('1.1.1.1') + 255,
966 ipaddress.IPv4Address('1.1.2.0'))
967 self.assertEqual(ipaddress.IPv4Address('1.1.1.1') - 256,
968 ipaddress.IPv4Address('1.1.0.1'))
969 self.assertEqual(ipaddress.IPv6Address('::1') + (2**16 - 2),
970 ipaddress.IPv6Address('::ffff'))
971 self.assertEqual(ipaddress.IPv6Address('::ffff') - (2**16 - 2),
972 ipaddress.IPv6Address('::1'))
973
Nick Coghlan3c2570c2012-07-07 01:13:55 +1000974 def testInvalidIntToBytes(self):
975 self.assertRaises(ValueError, ipaddress.v4_int_to_packed, -1)
976 self.assertRaises(ValueError, ipaddress.v4_int_to_packed,
977 2 ** ipaddress.IPV4LENGTH)
978 self.assertRaises(ValueError, ipaddress.v6_int_to_packed, -1)
979 self.assertRaises(ValueError, ipaddress.v6_int_to_packed,
980 2 ** ipaddress.IPV6LENGTH)
981
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200982 def testInternals(self):
Serhiy Storchakab53f0fb2015-01-19 00:41:32 +0200983 ip1 = ipaddress.IPv4Address('10.10.10.10')
984 ip2 = ipaddress.IPv4Address('10.10.10.11')
985 ip3 = ipaddress.IPv4Address('10.10.10.12')
986 self.assertEqual(list(ipaddress._find_address_range([ip1])),
987 [(ip1, ip1)])
988 self.assertEqual(list(ipaddress._find_address_range([ip1, ip3])),
989 [(ip1, ip1), (ip3, ip3)])
990 self.assertEqual(list(ipaddress._find_address_range([ip1, ip2, ip3])),
991 [(ip1, ip3)])
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200992 self.assertEqual(128, ipaddress._count_righthand_zero_bits(0, 128))
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200993 self.assertEqual("IPv4Network('1.2.3.0/24')", repr(self.ipv4_network))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000994
995 def testGetNetwork(self):
996 self.assertEqual(int(self.ipv4_network.network_address), 16909056)
997 self.assertEqual(str(self.ipv4_network.network_address), '1.2.3.0')
998
999 self.assertEqual(int(self.ipv6_network.network_address),
1000 42540616829182469433403647294022090752)
1001 self.assertEqual(str(self.ipv6_network.network_address),
1002 '2001:658:22a:cafe::')
1003 self.assertEqual(str(self.ipv6_network.hostmask),
1004 '::ffff:ffff:ffff:ffff')
1005
Nick Coghlandc9b2552012-05-20 21:01:57 +10001006 def testIpFromInt(self):
1007 self.assertEqual(self.ipv4_interface._ip,
1008 ipaddress.IPv4Interface(16909060)._ip)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001009
1010 ipv4 = ipaddress.ip_network('1.2.3.4')
1011 ipv6 = ipaddress.ip_network('2001:658:22a:cafe:200:0:0:1')
Nick Coghlan730f67f2012-08-05 22:02:18 +10001012 self.assertEqual(ipv4, ipaddress.ip_network(int(ipv4.network_address)))
1013 self.assertEqual(ipv6, ipaddress.ip_network(int(ipv6.network_address)))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001014
1015 v6_int = 42540616829182469433547762482097946625
1016 self.assertEqual(self.ipv6_interface._ip,
1017 ipaddress.IPv6Interface(v6_int)._ip)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001018
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001019 self.assertEqual(ipaddress.ip_network(self.ipv4_address._ip).version,
1020 4)
1021 self.assertEqual(ipaddress.ip_network(self.ipv6_address._ip).version,
1022 6)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001023
1024 def testIpFromPacked(self):
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001025 address = ipaddress.ip_address
Nick Coghlandc9b2552012-05-20 21:01:57 +10001026 self.assertEqual(self.ipv4_interface._ip,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001027 ipaddress.ip_interface(b'\x01\x02\x03\x04')._ip)
1028 self.assertEqual(address('255.254.253.252'),
1029 address(b'\xff\xfe\xfd\xfc'))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001030 self.assertEqual(self.ipv6_interface.ip,
1031 ipaddress.ip_interface(
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001032 b'\x20\x01\x06\x58\x02\x2a\xca\xfe'
1033 b'\x02\x00\x00\x00\x00\x00\x00\x01').ip)
1034 self.assertEqual(address('ffff:2:3:4:ffff::'),
1035 address(b'\xff\xff\x00\x02\x00\x03\x00\x04' +
1036 b'\xff\xff' + b'\x00' * 6))
1037 self.assertEqual(address('::'),
1038 address(b'\x00' * 16))
1039
Nick Coghlandc9b2552012-05-20 21:01:57 +10001040 def testGetIp(self):
1041 self.assertEqual(int(self.ipv4_interface.ip), 16909060)
1042 self.assertEqual(str(self.ipv4_interface.ip), '1.2.3.4')
1043
1044 self.assertEqual(int(self.ipv6_interface.ip),
1045 42540616829182469433547762482097946625)
1046 self.assertEqual(str(self.ipv6_interface.ip),
1047 '2001:658:22a:cafe:200::1')
1048
1049 def testGetNetmask(self):
1050 self.assertEqual(int(self.ipv4_network.netmask), 4294967040)
1051 self.assertEqual(str(self.ipv4_network.netmask), '255.255.255.0')
1052 self.assertEqual(int(self.ipv6_network.netmask),
1053 340282366920938463444927863358058659840)
1054 self.assertEqual(self.ipv6_network.prefixlen, 64)
1055
1056 def testZeroNetmask(self):
1057 ipv4_zero_netmask = ipaddress.IPv4Interface('1.2.3.4/0')
1058 self.assertEqual(int(ipv4_zero_netmask.network.netmask), 0)
Nick Coghlan932346f2014-02-08 23:17:36 +10001059 self.assertEqual(ipv4_zero_netmask._prefix_from_prefix_string('0'), 0)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001060
1061 ipv6_zero_netmask = ipaddress.IPv6Interface('::1/0')
1062 self.assertEqual(int(ipv6_zero_netmask.network.netmask), 0)
Nick Coghlan932346f2014-02-08 23:17:36 +10001063 self.assertEqual(ipv6_zero_netmask._prefix_from_prefix_string('0'), 0)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001064
Rémi Lapeyree59ec1b2019-04-13 10:49:34 +02001065 def testIPv4Net(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001066 net = ipaddress.IPv4Network('127.0.0.0/0.0.0.255')
Nick Coghlan932346f2014-02-08 23:17:36 +10001067 self.assertEqual(net.prefixlen, 24)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001068
Nick Coghlandc9b2552012-05-20 21:01:57 +10001069 def testGetBroadcast(self):
1070 self.assertEqual(int(self.ipv4_network.broadcast_address), 16909311)
1071 self.assertEqual(str(self.ipv4_network.broadcast_address), '1.2.3.255')
1072
1073 self.assertEqual(int(self.ipv6_network.broadcast_address),
1074 42540616829182469451850391367731642367)
1075 self.assertEqual(str(self.ipv6_network.broadcast_address),
1076 '2001:658:22a:cafe:ffff:ffff:ffff:ffff')
1077
1078 def testGetPrefixlen(self):
Nick Coghlane3ded952012-08-05 22:45:22 +10001079 self.assertEqual(self.ipv4_interface.network.prefixlen, 24)
1080 self.assertEqual(self.ipv6_interface.network.prefixlen, 64)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001081
1082 def testGetSupernet(self):
1083 self.assertEqual(self.ipv4_network.supernet().prefixlen, 23)
1084 self.assertEqual(str(self.ipv4_network.supernet().network_address),
1085 '1.2.2.0')
1086 self.assertEqual(
1087 ipaddress.IPv4Interface('0.0.0.0/0').network.supernet(),
1088 ipaddress.IPv4Network('0.0.0.0/0'))
1089
1090 self.assertEqual(self.ipv6_network.supernet().prefixlen, 63)
1091 self.assertEqual(str(self.ipv6_network.supernet().network_address),
1092 '2001:658:22a:cafe::')
1093 self.assertEqual(ipaddress.IPv6Interface('::0/0').network.supernet(),
1094 ipaddress.IPv6Network('::0/0'))
1095
1096 def testGetSupernet3(self):
1097 self.assertEqual(self.ipv4_network.supernet(3).prefixlen, 21)
1098 self.assertEqual(str(self.ipv4_network.supernet(3).network_address),
1099 '1.2.0.0')
1100
1101 self.assertEqual(self.ipv6_network.supernet(3).prefixlen, 61)
1102 self.assertEqual(str(self.ipv6_network.supernet(3).network_address),
1103 '2001:658:22a:caf8::')
1104
1105 def testGetSupernet4(self):
1106 self.assertRaises(ValueError, self.ipv4_network.supernet,
1107 prefixlen_diff=2, new_prefix=1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001108 self.assertRaises(ValueError, self.ipv4_network.supernet,
1109 new_prefix=25)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001110 self.assertEqual(self.ipv4_network.supernet(prefixlen_diff=2),
1111 self.ipv4_network.supernet(new_prefix=22))
1112
1113 self.assertRaises(ValueError, self.ipv6_network.supernet,
1114 prefixlen_diff=2, new_prefix=1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001115 self.assertRaises(ValueError, self.ipv6_network.supernet,
1116 new_prefix=65)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001117 self.assertEqual(self.ipv6_network.supernet(prefixlen_diff=2),
1118 self.ipv6_network.supernet(new_prefix=62))
1119
1120 def testHosts(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001121 hosts = list(self.ipv4_network.hosts())
1122 self.assertEqual(254, len(hosts))
1123 self.assertEqual(ipaddress.IPv4Address('1.2.3.1'), hosts[0])
1124 self.assertEqual(ipaddress.IPv4Address('1.2.3.254'), hosts[-1])
1125
Xiang Zhang10b134a2018-03-21 08:25:13 +08001126 ipv6_network = ipaddress.IPv6Network('2001:658:22a:cafe::/120')
1127 hosts = list(ipv6_network.hosts())
1128 self.assertEqual(255, len(hosts))
1129 self.assertEqual(ipaddress.IPv6Address('2001:658:22a:cafe::1'), hosts[0])
1130 self.assertEqual(ipaddress.IPv6Address('2001:658:22a:cafe::ff'), hosts[-1])
1131
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001132 # special case where only 1 bit is left for address
Xiang Zhang10b134a2018-03-21 08:25:13 +08001133 addrs = [ipaddress.IPv4Address('2.0.0.0'),
1134 ipaddress.IPv4Address('2.0.0.1')]
1135 str_args = '2.0.0.0/31'
1136 tpl_args = ('2.0.0.0', 31)
1137 self.assertEqual(addrs, list(ipaddress.ip_network(str_args).hosts()))
1138 self.assertEqual(addrs, list(ipaddress.ip_network(tpl_args).hosts()))
1139 self.assertEqual(list(ipaddress.ip_network(str_args).hosts()),
1140 list(ipaddress.ip_network(tpl_args).hosts()))
1141
1142 addrs = [ipaddress.IPv6Address('2001:658:22a:cafe::'),
1143 ipaddress.IPv6Address('2001:658:22a:cafe::1')]
1144 str_args = '2001:658:22a:cafe::/127'
1145 tpl_args = ('2001:658:22a:cafe::', 127)
1146 self.assertEqual(addrs, list(ipaddress.ip_network(str_args).hosts()))
1147 self.assertEqual(addrs, list(ipaddress.ip_network(tpl_args).hosts()))
1148 self.assertEqual(list(ipaddress.ip_network(str_args).hosts()),
1149 list(ipaddress.ip_network(tpl_args).hosts()))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001150
1151 def testFancySubnetting(self):
1152 self.assertEqual(sorted(self.ipv4_network.subnets(prefixlen_diff=3)),
1153 sorted(self.ipv4_network.subnets(new_prefix=27)))
1154 self.assertRaises(ValueError, list,
1155 self.ipv4_network.subnets(new_prefix=23))
1156 self.assertRaises(ValueError, list,
1157 self.ipv4_network.subnets(prefixlen_diff=3,
1158 new_prefix=27))
1159 self.assertEqual(sorted(self.ipv6_network.subnets(prefixlen_diff=4)),
1160 sorted(self.ipv6_network.subnets(new_prefix=68)))
1161 self.assertRaises(ValueError, list,
1162 self.ipv6_network.subnets(new_prefix=63))
1163 self.assertRaises(ValueError, list,
1164 self.ipv6_network.subnets(prefixlen_diff=4,
1165 new_prefix=68))
1166
1167 def testGetSubnets(self):
1168 self.assertEqual(list(self.ipv4_network.subnets())[0].prefixlen, 25)
1169 self.assertEqual(str(list(
1170 self.ipv4_network.subnets())[0].network_address),
1171 '1.2.3.0')
1172 self.assertEqual(str(list(
1173 self.ipv4_network.subnets())[1].network_address),
1174 '1.2.3.128')
1175
1176 self.assertEqual(list(self.ipv6_network.subnets())[0].prefixlen, 65)
1177
1178 def testGetSubnetForSingle32(self):
1179 ip = ipaddress.IPv4Network('1.2.3.4/32')
1180 subnets1 = [str(x) for x in ip.subnets()]
1181 subnets2 = [str(x) for x in ip.subnets(2)]
1182 self.assertEqual(subnets1, ['1.2.3.4/32'])
1183 self.assertEqual(subnets1, subnets2)
1184
1185 def testGetSubnetForSingle128(self):
1186 ip = ipaddress.IPv6Network('::1/128')
1187 subnets1 = [str(x) for x in ip.subnets()]
1188 subnets2 = [str(x) for x in ip.subnets(2)]
1189 self.assertEqual(subnets1, ['::1/128'])
1190 self.assertEqual(subnets1, subnets2)
1191
1192 def testSubnet2(self):
1193 ips = [str(x) for x in self.ipv4_network.subnets(2)]
1194 self.assertEqual(
1195 ips,
1196 ['1.2.3.0/26', '1.2.3.64/26', '1.2.3.128/26', '1.2.3.192/26'])
1197
1198 ipsv6 = [str(x) for x in self.ipv6_network.subnets(2)]
1199 self.assertEqual(
1200 ipsv6,
1201 ['2001:658:22a:cafe::/66',
1202 '2001:658:22a:cafe:4000::/66',
1203 '2001:658:22a:cafe:8000::/66',
1204 '2001:658:22a:cafe:c000::/66'])
1205
Serhiy Storchakabb0dbd52016-03-01 10:25:45 +02001206 def testGetSubnets3(self):
1207 subnets = [str(x) for x in self.ipv4_network.subnets(8)]
1208 self.assertEqual(subnets[:3],
1209 ['1.2.3.0/32', '1.2.3.1/32', '1.2.3.2/32'])
1210 self.assertEqual(subnets[-3:],
1211 ['1.2.3.253/32', '1.2.3.254/32', '1.2.3.255/32'])
1212 self.assertEqual(len(subnets), 256)
1213
1214 ipv6_network = ipaddress.IPv6Network('2001:658:22a:cafe::/120')
1215 subnets = [str(x) for x in ipv6_network.subnets(8)]
1216 self.assertEqual(subnets[:3],
1217 ['2001:658:22a:cafe::/128',
1218 '2001:658:22a:cafe::1/128',
1219 '2001:658:22a:cafe::2/128'])
1220 self.assertEqual(subnets[-3:],
1221 ['2001:658:22a:cafe::fd/128',
1222 '2001:658:22a:cafe::fe/128',
1223 '2001:658:22a:cafe::ff/128'])
1224 self.assertEqual(len(subnets), 256)
1225
Nick Coghlandc9b2552012-05-20 21:01:57 +10001226 def testSubnetFailsForLargeCidrDiff(self):
1227 self.assertRaises(ValueError, list,
1228 self.ipv4_interface.network.subnets(9))
1229 self.assertRaises(ValueError, list,
1230 self.ipv4_network.subnets(9))
1231 self.assertRaises(ValueError, list,
1232 self.ipv6_interface.network.subnets(65))
1233 self.assertRaises(ValueError, list,
1234 self.ipv6_network.subnets(65))
1235
1236 def testSupernetFailsForLargeCidrDiff(self):
1237 self.assertRaises(ValueError,
1238 self.ipv4_interface.network.supernet, 25)
1239 self.assertRaises(ValueError,
1240 self.ipv6_interface.network.supernet, 65)
1241
1242 def testSubnetFailsForNegativeCidrDiff(self):
1243 self.assertRaises(ValueError, list,
1244 self.ipv4_interface.network.subnets(-1))
1245 self.assertRaises(ValueError, list,
Nick Coghlan2c589102012-05-27 01:03:25 +10001246 self.ipv4_network.subnets(-1))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001247 self.assertRaises(ValueError, list,
1248 self.ipv6_interface.network.subnets(-1))
1249 self.assertRaises(ValueError, list,
1250 self.ipv6_network.subnets(-1))
1251
1252 def testGetNum_Addresses(self):
1253 self.assertEqual(self.ipv4_network.num_addresses, 256)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001254 self.assertEqual(list(self.ipv4_network.subnets())[0].num_addresses,
1255 128)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001256 self.assertEqual(self.ipv4_network.supernet().num_addresses, 512)
1257
1258 self.assertEqual(self.ipv6_network.num_addresses, 18446744073709551616)
1259 self.assertEqual(list(self.ipv6_network.subnets())[0].num_addresses,
1260 9223372036854775808)
1261 self.assertEqual(self.ipv6_network.supernet().num_addresses,
1262 36893488147419103232)
1263
1264 def testContains(self):
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001265 self.assertIn(ipaddress.IPv4Interface('1.2.3.128/25'),
1266 self.ipv4_network)
1267 self.assertNotIn(ipaddress.IPv4Interface('1.2.4.1/24'),
Nick Coghlandc9b2552012-05-20 21:01:57 +10001268 self.ipv4_network)
1269 # We can test addresses and string as well.
1270 addr1 = ipaddress.IPv4Address('1.2.3.37')
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001271 self.assertIn(addr1, self.ipv4_network)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001272 # issue 61, bad network comparison on like-ip'd network objects
1273 # with identical broadcast addresses.
1274 self.assertFalse(ipaddress.IPv4Network('1.1.0.0/16').__contains__(
1275 ipaddress.IPv4Network('1.0.0.0/15')))
1276
Nick Coghlandc9b2552012-05-20 21:01:57 +10001277 def testNth(self):
1278 self.assertEqual(str(self.ipv4_network[5]), '1.2.3.5')
1279 self.assertRaises(IndexError, self.ipv4_network.__getitem__, 256)
1280
1281 self.assertEqual(str(self.ipv6_network[5]),
1282 '2001:658:22a:cafe::5')
Berker Peksag28dc1182016-06-11 22:30:05 +03001283 self.assertRaises(IndexError, self.ipv6_network.__getitem__, 1 << 64)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001284
1285 def testGetitem(self):
1286 # http://code.google.com/p/ipaddr-py/issues/detail?id=15
1287 addr = ipaddress.IPv4Network('172.31.255.128/255.255.255.240')
1288 self.assertEqual(28, addr.prefixlen)
1289 addr_list = list(addr)
1290 self.assertEqual('172.31.255.128', str(addr_list[0]))
1291 self.assertEqual('172.31.255.128', str(addr[0]))
1292 self.assertEqual('172.31.255.143', str(addr_list[-1]))
1293 self.assertEqual('172.31.255.143', str(addr[-1]))
1294 self.assertEqual(addr_list[-1], addr[-1])
1295
1296 def testEqual(self):
1297 self.assertTrue(self.ipv4_interface ==
1298 ipaddress.IPv4Interface('1.2.3.4/24'))
1299 self.assertFalse(self.ipv4_interface ==
1300 ipaddress.IPv4Interface('1.2.3.4/23'))
1301 self.assertFalse(self.ipv4_interface ==
1302 ipaddress.IPv6Interface('::1.2.3.4/24'))
1303 self.assertFalse(self.ipv4_interface == '')
1304 self.assertFalse(self.ipv4_interface == [])
1305 self.assertFalse(self.ipv4_interface == 2)
1306
1307 self.assertTrue(self.ipv6_interface ==
1308 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/64'))
1309 self.assertFalse(self.ipv6_interface ==
1310 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/63'))
1311 self.assertFalse(self.ipv6_interface ==
1312 ipaddress.IPv4Interface('1.2.3.4/23'))
1313 self.assertFalse(self.ipv6_interface == '')
1314 self.assertFalse(self.ipv6_interface == [])
1315 self.assertFalse(self.ipv6_interface == 2)
1316
1317 def testNotEqual(self):
1318 self.assertFalse(self.ipv4_interface !=
1319 ipaddress.IPv4Interface('1.2.3.4/24'))
1320 self.assertTrue(self.ipv4_interface !=
1321 ipaddress.IPv4Interface('1.2.3.4/23'))
1322 self.assertTrue(self.ipv4_interface !=
1323 ipaddress.IPv6Interface('::1.2.3.4/24'))
1324 self.assertTrue(self.ipv4_interface != '')
1325 self.assertTrue(self.ipv4_interface != [])
1326 self.assertTrue(self.ipv4_interface != 2)
1327
1328 self.assertTrue(self.ipv4_address !=
1329 ipaddress.IPv4Address('1.2.3.5'))
1330 self.assertTrue(self.ipv4_address != '')
1331 self.assertTrue(self.ipv4_address != [])
1332 self.assertTrue(self.ipv4_address != 2)
1333
1334 self.assertFalse(self.ipv6_interface !=
1335 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/64'))
1336 self.assertTrue(self.ipv6_interface !=
1337 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/63'))
1338 self.assertTrue(self.ipv6_interface !=
1339 ipaddress.IPv4Interface('1.2.3.4/23'))
1340 self.assertTrue(self.ipv6_interface != '')
1341 self.assertTrue(self.ipv6_interface != [])
1342 self.assertTrue(self.ipv6_interface != 2)
1343
1344 self.assertTrue(self.ipv6_address !=
1345 ipaddress.IPv4Address('1.2.3.4'))
1346 self.assertTrue(self.ipv6_address != '')
1347 self.assertTrue(self.ipv6_address != [])
1348 self.assertTrue(self.ipv6_address != 2)
1349
1350 def testSlash32Constructor(self):
1351 self.assertEqual(str(ipaddress.IPv4Interface(
1352 '1.2.3.4/255.255.255.255')), '1.2.3.4/32')
1353
1354 def testSlash128Constructor(self):
1355 self.assertEqual(str(ipaddress.IPv6Interface('::1/128')),
1356 '::1/128')
1357
1358 def testSlash0Constructor(self):
1359 self.assertEqual(str(ipaddress.IPv4Interface('1.2.3.4/0.0.0.0')),
1360 '1.2.3.4/0')
1361
1362 def testCollapsing(self):
1363 # test only IP addresses including some duplicates
1364 ip1 = ipaddress.IPv4Address('1.1.1.0')
1365 ip2 = ipaddress.IPv4Address('1.1.1.1')
1366 ip3 = ipaddress.IPv4Address('1.1.1.2')
1367 ip4 = ipaddress.IPv4Address('1.1.1.3')
1368 ip5 = ipaddress.IPv4Address('1.1.1.4')
1369 ip6 = ipaddress.IPv4Address('1.1.1.0')
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07001370 # check that addresses are subsumed properly.
Nick Coghlandc9b2552012-05-20 21:01:57 +10001371 collapsed = ipaddress.collapse_addresses(
1372 [ip1, ip2, ip3, ip4, ip5, ip6])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001373 self.assertEqual(list(collapsed),
1374 [ipaddress.IPv4Network('1.1.1.0/30'),
1375 ipaddress.IPv4Network('1.1.1.4/32')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001376
1377 # test a mix of IP addresses and networks including some duplicates
1378 ip1 = ipaddress.IPv4Address('1.1.1.0')
1379 ip2 = ipaddress.IPv4Address('1.1.1.1')
1380 ip3 = ipaddress.IPv4Address('1.1.1.2')
1381 ip4 = ipaddress.IPv4Address('1.1.1.3')
1382 #ip5 = ipaddress.IPv4Interface('1.1.1.4/30')
1383 #ip6 = ipaddress.IPv4Interface('1.1.1.4/30')
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07001384 # check that addresses are subsumed properly.
Nick Coghlandc9b2552012-05-20 21:01:57 +10001385 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3, ip4])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001386 self.assertEqual(list(collapsed),
1387 [ipaddress.IPv4Network('1.1.1.0/30')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001388
1389 # test only IP networks
1390 ip1 = ipaddress.IPv4Network('1.1.0.0/24')
1391 ip2 = ipaddress.IPv4Network('1.1.1.0/24')
1392 ip3 = ipaddress.IPv4Network('1.1.2.0/24')
1393 ip4 = ipaddress.IPv4Network('1.1.3.0/24')
1394 ip5 = ipaddress.IPv4Network('1.1.4.0/24')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001395 # stored in no particular order b/c we want CollapseAddr to call
1396 # [].sort
Nick Coghlandc9b2552012-05-20 21:01:57 +10001397 ip6 = ipaddress.IPv4Network('1.1.0.0/22')
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07001398 # check that addresses are subsumed properly.
Nick Coghlandc9b2552012-05-20 21:01:57 +10001399 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3, ip4, ip5,
1400 ip6])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001401 self.assertEqual(list(collapsed),
1402 [ipaddress.IPv4Network('1.1.0.0/22'),
1403 ipaddress.IPv4Network('1.1.4.0/24')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001404
1405 # test that two addresses are supernet'ed properly
1406 collapsed = ipaddress.collapse_addresses([ip1, ip2])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001407 self.assertEqual(list(collapsed),
1408 [ipaddress.IPv4Network('1.1.0.0/23')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001409
1410 # test same IP networks
1411 ip_same1 = ip_same2 = ipaddress.IPv4Network('1.1.1.1/32')
1412 self.assertEqual(list(ipaddress.collapse_addresses(
1413 [ip_same1, ip_same2])),
1414 [ip_same1])
1415
1416 # test same IP addresses
1417 ip_same1 = ip_same2 = ipaddress.IPv4Address('1.1.1.1')
1418 self.assertEqual(list(ipaddress.collapse_addresses(
1419 [ip_same1, ip_same2])),
1420 [ipaddress.ip_network('1.1.1.1/32')])
1421 ip1 = ipaddress.IPv6Network('2001::/100')
1422 ip2 = ipaddress.IPv6Network('2001::/120')
1423 ip3 = ipaddress.IPv6Network('2001::/96')
1424 # test that ipv6 addresses are subsumed properly.
1425 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3])
1426 self.assertEqual(list(collapsed), [ip3])
1427
1428 # the toejam test
Hynek Schlawack35db5132012-06-01 20:12:17 +02001429 addr_tuples = [
1430 (ipaddress.ip_address('1.1.1.1'),
1431 ipaddress.ip_address('::1')),
1432 (ipaddress.IPv4Network('1.1.0.0/24'),
1433 ipaddress.IPv6Network('2001::/120')),
1434 (ipaddress.IPv4Network('1.1.0.0/32'),
1435 ipaddress.IPv6Network('2001::/128')),
1436 ]
1437 for ip1, ip2 in addr_tuples:
1438 self.assertRaises(TypeError, ipaddress.collapse_addresses,
1439 [ip1, ip2])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001440
1441 def testSummarizing(self):
1442 #ip = ipaddress.ip_address
1443 #ipnet = ipaddress.ip_network
1444 summarize = ipaddress.summarize_address_range
1445 ip1 = ipaddress.ip_address('1.1.1.0')
1446 ip2 = ipaddress.ip_address('1.1.1.255')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001447
1448 # summarize works only for IPv4 & IPv6
1449 class IPv7Address(ipaddress.IPv6Address):
1450 @property
1451 def version(self):
1452 return 7
1453 ip_invalid1 = IPv7Address('::1')
1454 ip_invalid2 = IPv7Address('::1')
1455 self.assertRaises(ValueError, list,
1456 summarize(ip_invalid1, ip_invalid2))
1457 # test that a summary over ip4 & ip6 fails
1458 self.assertRaises(TypeError, list,
1459 summarize(ip1, ipaddress.IPv6Address('::1')))
1460 # test a /24 is summarized properly
Nick Coghlandc9b2552012-05-20 21:01:57 +10001461 self.assertEqual(list(summarize(ip1, ip2))[0],
1462 ipaddress.ip_network('1.1.1.0/24'))
Martin Panter7462b6492015-11-02 03:37:02 +00001463 # test an IPv4 range that isn't on a network byte boundary
Nick Coghlandc9b2552012-05-20 21:01:57 +10001464 ip2 = ipaddress.ip_address('1.1.1.8')
1465 self.assertEqual(list(summarize(ip1, ip2)),
1466 [ipaddress.ip_network('1.1.1.0/29'),
1467 ipaddress.ip_network('1.1.1.8')])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001468 # all!
1469 ip1 = ipaddress.IPv4Address(0)
1470 ip2 = ipaddress.IPv4Address(ipaddress.IPv4Address._ALL_ONES)
1471 self.assertEqual([ipaddress.IPv4Network('0.0.0.0/0')],
1472 list(summarize(ip1, ip2)))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001473
1474 ip1 = ipaddress.ip_address('1::')
1475 ip2 = ipaddress.ip_address('1:ffff:ffff:ffff:ffff:ffff:ffff:ffff')
Martin Panter7462b6492015-11-02 03:37:02 +00001476 # test an IPv6 is summarized properly
Nick Coghlandc9b2552012-05-20 21:01:57 +10001477 self.assertEqual(list(summarize(ip1, ip2))[0],
1478 ipaddress.ip_network('1::/16'))
1479 # test an IPv6 range that isn't on a network byte boundary
1480 ip2 = ipaddress.ip_address('2::')
1481 self.assertEqual(list(summarize(ip1, ip2)),
1482 [ipaddress.ip_network('1::/16'),
1483 ipaddress.ip_network('2::/128')])
1484
1485 # test exception raised when first is greater than last
1486 self.assertRaises(ValueError, list,
1487 summarize(ipaddress.ip_address('1.1.1.0'),
1488 ipaddress.ip_address('1.1.0.0')))
1489 # test exception raised when first and last aren't IP addresses
1490 self.assertRaises(TypeError, list,
1491 summarize(ipaddress.ip_network('1.1.1.0'),
1492 ipaddress.ip_network('1.1.0.0')))
1493 self.assertRaises(TypeError, list,
1494 summarize(ipaddress.ip_network('1.1.1.0'),
1495 ipaddress.ip_network('1.1.0.0')))
1496 # test exception raised when first and last are not same version
1497 self.assertRaises(TypeError, list,
1498 summarize(ipaddress.ip_address('::'),
1499 ipaddress.ip_network('1.1.0.0')))
1500
1501 def testAddressComparison(self):
1502 self.assertTrue(ipaddress.ip_address('1.1.1.1') <=
1503 ipaddress.ip_address('1.1.1.1'))
1504 self.assertTrue(ipaddress.ip_address('1.1.1.1') <=
1505 ipaddress.ip_address('1.1.1.2'))
1506 self.assertTrue(ipaddress.ip_address('::1') <=
1507 ipaddress.ip_address('::1'))
1508 self.assertTrue(ipaddress.ip_address('::1') <=
1509 ipaddress.ip_address('::2'))
1510
Nick Coghlan3008ec02012-07-08 00:45:33 +10001511 def testInterfaceComparison(self):
s-sanjay7bd8d3e2017-03-31 23:09:53 -07001512 self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') ==
1513 ipaddress.ip_interface('1.1.1.1/24'))
1514 self.assertTrue(ipaddress.ip_interface('1.1.1.1/16') <
1515 ipaddress.ip_interface('1.1.1.1/24'))
1516 self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') <
1517 ipaddress.ip_interface('1.1.1.2/24'))
1518 self.assertTrue(ipaddress.ip_interface('1.1.1.2/16') <
1519 ipaddress.ip_interface('1.1.1.1/24'))
1520 self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') >
1521 ipaddress.ip_interface('1.1.1.1/16'))
1522 self.assertTrue(ipaddress.ip_interface('1.1.1.2/24') >
1523 ipaddress.ip_interface('1.1.1.1/24'))
1524 self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') >
1525 ipaddress.ip_interface('1.1.1.2/16'))
1526
1527 self.assertTrue(ipaddress.ip_interface('::1/64') ==
1528 ipaddress.ip_interface('::1/64'))
1529 self.assertTrue(ipaddress.ip_interface('::1/64') <
1530 ipaddress.ip_interface('::1/80'))
1531 self.assertTrue(ipaddress.ip_interface('::1/64') <
1532 ipaddress.ip_interface('::2/64'))
1533 self.assertTrue(ipaddress.ip_interface('::2/48') <
1534 ipaddress.ip_interface('::1/64'))
1535 self.assertTrue(ipaddress.ip_interface('::1/80') >
1536 ipaddress.ip_interface('::1/64'))
1537 self.assertTrue(ipaddress.ip_interface('::2/64') >
1538 ipaddress.ip_interface('::1/64'))
1539 self.assertTrue(ipaddress.ip_interface('::1/64') >
1540 ipaddress.ip_interface('::2/48'))
Nick Coghlan3008ec02012-07-08 00:45:33 +10001541
Nick Coghlandc9b2552012-05-20 21:01:57 +10001542 def testNetworkComparison(self):
1543 # ip1 and ip2 have the same network address
1544 ip1 = ipaddress.IPv4Network('1.1.1.0/24')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001545 ip2 = ipaddress.IPv4Network('1.1.1.0/32')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001546 ip3 = ipaddress.IPv4Network('1.1.2.0/24')
1547
1548 self.assertTrue(ip1 < ip3)
1549 self.assertTrue(ip3 > ip2)
1550
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001551 self.assertEqual(ip1.compare_networks(ip1), 0)
1552
1553 # if addresses are the same, sort by netmask
1554 self.assertEqual(ip1.compare_networks(ip2), -1)
1555 self.assertEqual(ip2.compare_networks(ip1), 1)
1556
Nick Coghlandc9b2552012-05-20 21:01:57 +10001557 self.assertEqual(ip1.compare_networks(ip3), -1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001558 self.assertEqual(ip3.compare_networks(ip1), 1)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001559 self.assertTrue(ip1._get_networks_key() < ip3._get_networks_key())
1560
1561 ip1 = ipaddress.IPv6Network('2001:2000::/96')
1562 ip2 = ipaddress.IPv6Network('2001:2001::/96')
1563 ip3 = ipaddress.IPv6Network('2001:ffff:2000::/96')
1564
1565 self.assertTrue(ip1 < ip3)
1566 self.assertTrue(ip3 > ip2)
1567 self.assertEqual(ip1.compare_networks(ip3), -1)
1568 self.assertTrue(ip1._get_networks_key() < ip3._get_networks_key())
1569
1570 # Test comparing different protocols.
1571 # Should always raise a TypeError.
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001572 self.assertRaises(TypeError,
1573 self.ipv4_network.compare_networks,
1574 self.ipv6_network)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001575 ipv6 = ipaddress.IPv6Interface('::/0')
1576 ipv4 = ipaddress.IPv4Interface('0.0.0.0/0')
1577 self.assertRaises(TypeError, ipv4.__lt__, ipv6)
1578 self.assertRaises(TypeError, ipv4.__gt__, ipv6)
1579 self.assertRaises(TypeError, ipv6.__lt__, ipv4)
1580 self.assertRaises(TypeError, ipv6.__gt__, ipv4)
1581
1582 # Regression test for issue 19.
1583 ip1 = ipaddress.ip_network('10.1.2.128/25')
1584 self.assertFalse(ip1 < ip1)
1585 self.assertFalse(ip1 > ip1)
1586 ip2 = ipaddress.ip_network('10.1.3.0/24')
1587 self.assertTrue(ip1 < ip2)
1588 self.assertFalse(ip2 < ip1)
1589 self.assertFalse(ip1 > ip2)
1590 self.assertTrue(ip2 > ip1)
1591 ip3 = ipaddress.ip_network('10.1.3.0/25')
1592 self.assertTrue(ip2 < ip3)
1593 self.assertFalse(ip3 < ip2)
1594 self.assertFalse(ip2 > ip3)
1595 self.assertTrue(ip3 > ip2)
1596
1597 # Regression test for issue 28.
1598 ip1 = ipaddress.ip_network('10.10.10.0/31')
1599 ip2 = ipaddress.ip_network('10.10.10.0')
1600 ip3 = ipaddress.ip_network('10.10.10.2/31')
1601 ip4 = ipaddress.ip_network('10.10.10.2')
1602 sorted = [ip1, ip2, ip3, ip4]
1603 unsorted = [ip2, ip4, ip1, ip3]
1604 unsorted.sort()
1605 self.assertEqual(sorted, unsorted)
1606 unsorted = [ip4, ip1, ip3, ip2]
1607 unsorted.sort()
1608 self.assertEqual(sorted, unsorted)
Serhiy Storchakaf186e122015-01-26 10:11:16 +02001609 self.assertIs(ip1.__lt__(ipaddress.ip_address('10.10.10.0')),
1610 NotImplemented)
1611 self.assertIs(ip2.__lt__(ipaddress.ip_address('10.10.10.0')),
1612 NotImplemented)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001613
1614 # <=, >=
1615 self.assertTrue(ipaddress.ip_network('1.1.1.1') <=
1616 ipaddress.ip_network('1.1.1.1'))
1617 self.assertTrue(ipaddress.ip_network('1.1.1.1') <=
1618 ipaddress.ip_network('1.1.1.2'))
1619 self.assertFalse(ipaddress.ip_network('1.1.1.2') <=
1620 ipaddress.ip_network('1.1.1.1'))
1621 self.assertTrue(ipaddress.ip_network('::1') <=
1622 ipaddress.ip_network('::1'))
1623 self.assertTrue(ipaddress.ip_network('::1') <=
1624 ipaddress.ip_network('::2'))
1625 self.assertFalse(ipaddress.ip_network('::2') <=
1626 ipaddress.ip_network('::1'))
1627
1628 def testStrictNetworks(self):
1629 self.assertRaises(ValueError, ipaddress.ip_network, '192.168.1.1/24')
1630 self.assertRaises(ValueError, ipaddress.ip_network, '::1/120')
1631
1632 def testOverlaps(self):
1633 other = ipaddress.IPv4Network('1.2.3.0/30')
1634 other2 = ipaddress.IPv4Network('1.2.2.0/24')
1635 other3 = ipaddress.IPv4Network('1.2.2.64/26')
1636 self.assertTrue(self.ipv4_network.overlaps(other))
1637 self.assertFalse(self.ipv4_network.overlaps(other2))
1638 self.assertTrue(other2.overlaps(other3))
1639
1640 def testEmbeddedIpv4(self):
1641 ipv4_string = '192.168.0.1'
1642 ipv4 = ipaddress.IPv4Interface(ipv4_string)
1643 v4compat_ipv6 = ipaddress.IPv6Interface('::%s' % ipv4_string)
1644 self.assertEqual(int(v4compat_ipv6.ip), int(ipv4.ip))
1645 v4mapped_ipv6 = ipaddress.IPv6Interface('::ffff:%s' % ipv4_string)
1646 self.assertNotEqual(v4mapped_ipv6.ip, ipv4.ip)
1647 self.assertRaises(ipaddress.AddressValueError, ipaddress.IPv6Interface,
1648 '2001:1.1.1.1:1.1.1.1')
1649
1650 # Issue 67: IPv6 with embedded IPv4 address not recognized.
1651 def testIPv6AddressTooLarge(self):
1652 # RFC4291 2.5.5.2
1653 self.assertEqual(ipaddress.ip_address('::FFFF:192.0.2.1'),
1654 ipaddress.ip_address('::FFFF:c000:201'))
1655 # RFC4291 2.2 (part 3) x::d.d.d.d
1656 self.assertEqual(ipaddress.ip_address('FFFF::192.0.2.1'),
1657 ipaddress.ip_address('FFFF::c000:201'))
1658
1659 def testIPVersion(self):
1660 self.assertEqual(self.ipv4_address.version, 4)
1661 self.assertEqual(self.ipv6_address.version, 6)
1662
1663 def testMaxPrefixLength(self):
1664 self.assertEqual(self.ipv4_interface.max_prefixlen, 32)
1665 self.assertEqual(self.ipv6_interface.max_prefixlen, 128)
1666
1667 def testPacked(self):
1668 self.assertEqual(self.ipv4_address.packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001669 b'\x01\x02\x03\x04')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001670 self.assertEqual(ipaddress.IPv4Interface('255.254.253.252').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001671 b'\xff\xfe\xfd\xfc')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001672 self.assertEqual(self.ipv6_address.packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001673 b'\x20\x01\x06\x58\x02\x2a\xca\xfe'
1674 b'\x02\x00\x00\x00\x00\x00\x00\x01')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001675 self.assertEqual(ipaddress.IPv6Interface('ffff:2:3:4:ffff::').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001676 b'\xff\xff\x00\x02\x00\x03\x00\x04\xff\xff'
1677 + b'\x00' * 6)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001678 self.assertEqual(ipaddress.IPv6Interface('::1:0:0:0:0').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001679 b'\x00' * 6 + b'\x00\x01' + b'\x00' * 8)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001680
Nick Coghlandc9b2552012-05-20 21:01:57 +10001681 def testIpType(self):
1682 ipv4net = ipaddress.ip_network('1.2.3.4')
1683 ipv4addr = ipaddress.ip_address('1.2.3.4')
1684 ipv6net = ipaddress.ip_network('::1.2.3.4')
1685 ipv6addr = ipaddress.ip_address('::1.2.3.4')
1686 self.assertEqual(ipaddress.IPv4Network, type(ipv4net))
1687 self.assertEqual(ipaddress.IPv4Address, type(ipv4addr))
1688 self.assertEqual(ipaddress.IPv6Network, type(ipv6net))
1689 self.assertEqual(ipaddress.IPv6Address, type(ipv6addr))
1690
1691 def testReservedIpv4(self):
1692 # test networks
1693 self.assertEqual(True, ipaddress.ip_interface(
1694 '224.1.1.1/31').is_multicast)
1695 self.assertEqual(False, ipaddress.ip_network('240.0.0.0').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001696 self.assertEqual(True, ipaddress.ip_network('240.0.0.0').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001697
1698 self.assertEqual(True, ipaddress.ip_interface(
1699 '192.168.1.1/17').is_private)
1700 self.assertEqual(False, ipaddress.ip_network('192.169.0.0').is_private)
1701 self.assertEqual(True, ipaddress.ip_network(
1702 '10.255.255.255').is_private)
1703 self.assertEqual(False, ipaddress.ip_network('11.0.0.0').is_private)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001704 self.assertEqual(False, ipaddress.ip_network('11.0.0.0').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001705 self.assertEqual(True, ipaddress.ip_network(
1706 '172.31.255.255').is_private)
1707 self.assertEqual(False, ipaddress.ip_network('172.32.0.0').is_private)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001708 self.assertEqual(True,
1709 ipaddress.ip_network('169.254.1.0/24').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001710
1711 self.assertEqual(True,
1712 ipaddress.ip_interface(
1713 '169.254.100.200/24').is_link_local)
1714 self.assertEqual(False,
1715 ipaddress.ip_interface(
1716 '169.255.100.200/24').is_link_local)
1717
1718 self.assertEqual(True,
1719 ipaddress.ip_network(
1720 '127.100.200.254/32').is_loopback)
1721 self.assertEqual(True, ipaddress.ip_network(
1722 '127.42.0.0/16').is_loopback)
1723 self.assertEqual(False, ipaddress.ip_network('128.0.0.0').is_loopback)
Peter Moodye5019d52013-10-24 09:47:10 -07001724 self.assertEqual(False,
1725 ipaddress.ip_network('100.64.0.0/10').is_private)
Peter Moodybe9c1b12013-10-22 12:36:21 -07001726 self.assertEqual(False, ipaddress.ip_network('100.64.0.0/10').is_global)
Peter Moodye5019d52013-10-24 09:47:10 -07001727
Peter Moody22c31762013-10-21 13:58:06 -07001728 self.assertEqual(True,
1729 ipaddress.ip_network('192.0.2.128/25').is_private)
1730 self.assertEqual(True,
1731 ipaddress.ip_network('192.0.3.0/24').is_global)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001732
1733 # test addresses
Hynek Schlawackbcd30442012-06-04 14:19:39 +02001734 self.assertEqual(True, ipaddress.ip_address('0.0.0.0').is_unspecified)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001735 self.assertEqual(True, ipaddress.ip_address('224.1.1.1').is_multicast)
1736 self.assertEqual(False, ipaddress.ip_address('240.0.0.0').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001737 self.assertEqual(True, ipaddress.ip_address('240.0.0.1').is_reserved)
1738 self.assertEqual(False,
1739 ipaddress.ip_address('239.255.255.255').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001740
1741 self.assertEqual(True, ipaddress.ip_address('192.168.1.1').is_private)
1742 self.assertEqual(False, ipaddress.ip_address('192.169.0.0').is_private)
1743 self.assertEqual(True, ipaddress.ip_address(
1744 '10.255.255.255').is_private)
1745 self.assertEqual(False, ipaddress.ip_address('11.0.0.0').is_private)
1746 self.assertEqual(True, ipaddress.ip_address(
1747 '172.31.255.255').is_private)
1748 self.assertEqual(False, ipaddress.ip_address('172.32.0.0').is_private)
1749
1750 self.assertEqual(True,
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001751 ipaddress.ip_address('169.254.100.200').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001752 self.assertEqual(False,
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001753 ipaddress.ip_address('169.255.100.200').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001754
Berker Peksag742192a2016-06-11 22:11:47 +03001755 self.assertTrue(ipaddress.ip_address('192.0.7.1').is_global)
1756 self.assertFalse(ipaddress.ip_address('203.0.113.1').is_global)
1757
Nick Coghlandc9b2552012-05-20 21:01:57 +10001758 self.assertEqual(True,
1759 ipaddress.ip_address('127.100.200.254').is_loopback)
1760 self.assertEqual(True, ipaddress.ip_address('127.42.0.0').is_loopback)
1761 self.assertEqual(False, ipaddress.ip_address('128.0.0.0').is_loopback)
1762 self.assertEqual(True, ipaddress.ip_network('0.0.0.0').is_unspecified)
1763
1764 def testReservedIpv6(self):
1765
1766 self.assertEqual(True, ipaddress.ip_network('ffff::').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001767 self.assertEqual(True, ipaddress.ip_network(2**128 - 1).is_multicast)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001768 self.assertEqual(True, ipaddress.ip_network('ff00::').is_multicast)
1769 self.assertEqual(False, ipaddress.ip_network('fdff::').is_multicast)
1770
1771 self.assertEqual(True, ipaddress.ip_network('fecf::').is_site_local)
1772 self.assertEqual(True, ipaddress.ip_network(
1773 'feff:ffff:ffff:ffff::').is_site_local)
1774 self.assertEqual(False, ipaddress.ip_network(
1775 'fbf:ffff::').is_site_local)
1776 self.assertEqual(False, ipaddress.ip_network('ff00::').is_site_local)
1777
1778 self.assertEqual(True, ipaddress.ip_network('fc00::').is_private)
1779 self.assertEqual(True, ipaddress.ip_network(
1780 'fc00:ffff:ffff:ffff::').is_private)
1781 self.assertEqual(False, ipaddress.ip_network('fbff:ffff::').is_private)
1782 self.assertEqual(False, ipaddress.ip_network('fe00::').is_private)
1783
1784 self.assertEqual(True, ipaddress.ip_network('fea0::').is_link_local)
1785 self.assertEqual(True, ipaddress.ip_network(
1786 'febf:ffff::').is_link_local)
1787 self.assertEqual(False, ipaddress.ip_network(
1788 'fe7f:ffff::').is_link_local)
1789 self.assertEqual(False, ipaddress.ip_network('fec0::').is_link_local)
1790
1791 self.assertEqual(True, ipaddress.ip_interface('0:0::0:01').is_loopback)
1792 self.assertEqual(False, ipaddress.ip_interface('::1/127').is_loopback)
1793 self.assertEqual(False, ipaddress.ip_network('::').is_loopback)
1794 self.assertEqual(False, ipaddress.ip_network('::2').is_loopback)
1795
1796 self.assertEqual(True, ipaddress.ip_network('0::0').is_unspecified)
1797 self.assertEqual(False, ipaddress.ip_network('::1').is_unspecified)
1798 self.assertEqual(False, ipaddress.ip_network('::/127').is_unspecified)
1799
Peter Moody22c31762013-10-21 13:58:06 -07001800 self.assertEqual(True,
1801 ipaddress.ip_network('2001::1/128').is_private)
1802 self.assertEqual(True,
1803 ipaddress.ip_network('200::1/128').is_global)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001804 # test addresses
1805 self.assertEqual(True, ipaddress.ip_address('ffff::').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001806 self.assertEqual(True, ipaddress.ip_address(2**128 - 1).is_multicast)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001807 self.assertEqual(True, ipaddress.ip_address('ff00::').is_multicast)
1808 self.assertEqual(False, ipaddress.ip_address('fdff::').is_multicast)
1809
1810 self.assertEqual(True, ipaddress.ip_address('fecf::').is_site_local)
1811 self.assertEqual(True, ipaddress.ip_address(
1812 'feff:ffff:ffff:ffff::').is_site_local)
1813 self.assertEqual(False, ipaddress.ip_address(
1814 'fbf:ffff::').is_site_local)
1815 self.assertEqual(False, ipaddress.ip_address('ff00::').is_site_local)
1816
1817 self.assertEqual(True, ipaddress.ip_address('fc00::').is_private)
1818 self.assertEqual(True, ipaddress.ip_address(
1819 'fc00:ffff:ffff:ffff::').is_private)
1820 self.assertEqual(False, ipaddress.ip_address('fbff:ffff::').is_private)
1821 self.assertEqual(False, ipaddress.ip_address('fe00::').is_private)
1822
1823 self.assertEqual(True, ipaddress.ip_address('fea0::').is_link_local)
1824 self.assertEqual(True, ipaddress.ip_address(
1825 'febf:ffff::').is_link_local)
1826 self.assertEqual(False, ipaddress.ip_address(
1827 'fe7f:ffff::').is_link_local)
1828 self.assertEqual(False, ipaddress.ip_address('fec0::').is_link_local)
1829
1830 self.assertEqual(True, ipaddress.ip_address('0:0::0:01').is_loopback)
1831 self.assertEqual(True, ipaddress.ip_address('::1').is_loopback)
1832 self.assertEqual(False, ipaddress.ip_address('::2').is_loopback)
1833
1834 self.assertEqual(True, ipaddress.ip_address('0::0').is_unspecified)
1835 self.assertEqual(False, ipaddress.ip_address('::1').is_unspecified)
1836
1837 # some generic IETF reserved addresses
1838 self.assertEqual(True, ipaddress.ip_address('100::').is_reserved)
1839 self.assertEqual(True, ipaddress.ip_network('4000::1/128').is_reserved)
1840
1841 def testIpv4Mapped(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001842 self.assertEqual(
1843 ipaddress.ip_address('::ffff:192.168.1.1').ipv4_mapped,
1844 ipaddress.ip_address('192.168.1.1'))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001845 self.assertEqual(ipaddress.ip_address('::c0a8:101').ipv4_mapped, None)
1846 self.assertEqual(ipaddress.ip_address('::ffff:c0a8:101').ipv4_mapped,
1847 ipaddress.ip_address('192.168.1.1'))
1848
1849 def testAddrExclude(self):
1850 addr1 = ipaddress.ip_network('10.1.1.0/24')
1851 addr2 = ipaddress.ip_network('10.1.1.0/26')
1852 addr3 = ipaddress.ip_network('10.2.1.0/24')
1853 addr4 = ipaddress.ip_address('10.1.1.0')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001854 addr5 = ipaddress.ip_network('2001:db8::0/32')
Serhiy Storchakabb0dbd52016-03-01 10:25:45 +02001855 addr6 = ipaddress.ip_network('10.1.1.5/32')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001856 self.assertEqual(sorted(list(addr1.address_exclude(addr2))),
1857 [ipaddress.ip_network('10.1.1.64/26'),
1858 ipaddress.ip_network('10.1.1.128/25')])
1859 self.assertRaises(ValueError, list, addr1.address_exclude(addr3))
1860 self.assertRaises(TypeError, list, addr1.address_exclude(addr4))
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001861 self.assertRaises(TypeError, list, addr1.address_exclude(addr5))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001862 self.assertEqual(list(addr1.address_exclude(addr1)), [])
Serhiy Storchakabb0dbd52016-03-01 10:25:45 +02001863 self.assertEqual(sorted(list(addr1.address_exclude(addr6))),
1864 [ipaddress.ip_network('10.1.1.0/30'),
1865 ipaddress.ip_network('10.1.1.4/32'),
1866 ipaddress.ip_network('10.1.1.6/31'),
1867 ipaddress.ip_network('10.1.1.8/29'),
1868 ipaddress.ip_network('10.1.1.16/28'),
1869 ipaddress.ip_network('10.1.1.32/27'),
1870 ipaddress.ip_network('10.1.1.64/26'),
1871 ipaddress.ip_network('10.1.1.128/25')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001872
1873 def testHash(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001874 self.assertEqual(hash(ipaddress.ip_interface('10.1.1.0/24')),
1875 hash(ipaddress.ip_interface('10.1.1.0/24')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001876 self.assertEqual(hash(ipaddress.ip_network('10.1.1.0/24')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001877 hash(ipaddress.ip_network('10.1.1.0/24')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001878 self.assertEqual(hash(ipaddress.ip_address('10.1.1.0')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001879 hash(ipaddress.ip_address('10.1.1.0')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001880 # i70
1881 self.assertEqual(hash(ipaddress.ip_address('1.2.3.4')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001882 hash(ipaddress.ip_address(
Nick Coghlandc9b2552012-05-20 21:01:57 +10001883 int(ipaddress.ip_address('1.2.3.4')._ip))))
1884 ip1 = ipaddress.ip_address('10.1.1.0')
1885 ip2 = ipaddress.ip_address('1::')
1886 dummy = {}
1887 dummy[self.ipv4_address] = None
1888 dummy[self.ipv6_address] = None
1889 dummy[ip1] = None
1890 dummy[ip2] = None
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001891 self.assertIn(self.ipv4_address, dummy)
1892 self.assertIn(ip2, dummy)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001893
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001894 def testIPBases(self):
1895 net = self.ipv4_network
1896 self.assertEqual('1.2.3.0/24', net.compressed)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001897 net = self.ipv6_network
1898 self.assertRaises(ValueError, net._string_from_ip_int, 2**128 + 1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001899
Hynek Schlawack454a74d2012-06-04 18:14:02 +02001900 def testIPv6NetworkHelpers(self):
1901 net = self.ipv6_network
1902 self.assertEqual('2001:658:22a:cafe::/64', net.with_prefixlen)
1903 self.assertEqual('2001:658:22a:cafe::/ffff:ffff:ffff:ffff::',
1904 net.with_netmask)
1905 self.assertEqual('2001:658:22a:cafe::/::ffff:ffff:ffff:ffff',
1906 net.with_hostmask)
1907 self.assertEqual('2001:658:22a:cafe::/64', str(net))
1908
1909 def testIPv4NetworkHelpers(self):
1910 net = self.ipv4_network
1911 self.assertEqual('1.2.3.0/24', net.with_prefixlen)
1912 self.assertEqual('1.2.3.0/255.255.255.0', net.with_netmask)
1913 self.assertEqual('1.2.3.0/0.0.0.255', net.with_hostmask)
1914 self.assertEqual('1.2.3.0/24', str(net))
1915
Nick Coghlandc9b2552012-05-20 21:01:57 +10001916 def testCopyConstructor(self):
1917 addr1 = ipaddress.ip_network('10.1.1.0/24')
1918 addr2 = ipaddress.ip_network(addr1)
1919 addr3 = ipaddress.ip_interface('2001:658:22a:cafe:200::1/64')
1920 addr4 = ipaddress.ip_interface(addr3)
1921 addr5 = ipaddress.IPv4Address('1.1.1.1')
1922 addr6 = ipaddress.IPv6Address('2001:658:22a:cafe:200::1')
1923
1924 self.assertEqual(addr1, addr2)
1925 self.assertEqual(addr3, addr4)
1926 self.assertEqual(addr5, ipaddress.IPv4Address(addr5))
1927 self.assertEqual(addr6, ipaddress.IPv6Address(addr6))
1928
1929 def testCompressIPv6Address(self):
1930 test_addresses = {
1931 '1:2:3:4:5:6:7:8': '1:2:3:4:5:6:7:8/128',
1932 '2001:0:0:4:0:0:0:8': '2001:0:0:4::8/128',
1933 '2001:0:0:4:5:6:7:8': '2001::4:5:6:7:8/128',
1934 '2001:0:3:4:5:6:7:8': '2001:0:3:4:5:6:7:8/128',
Nick Coghlandc9b2552012-05-20 21:01:57 +10001935 '0:0:3:0:0:0:0:ffff': '0:0:3::ffff/128',
1936 '0:0:0:4:0:0:0:ffff': '::4:0:0:0:ffff/128',
1937 '0:0:0:0:5:0:0:ffff': '::5:0:0:ffff/128',
1938 '1:0:0:4:0:0:7:8': '1::4:0:0:7:8/128',
1939 '0:0:0:0:0:0:0:0': '::/128',
1940 '0:0:0:0:0:0:0:0/0': '::/0',
1941 '0:0:0:0:0:0:0:1': '::1/128',
1942 '2001:0658:022a:cafe:0000:0000:0000:0000/66':
1943 '2001:658:22a:cafe::/66',
1944 '::1.2.3.4': '::102:304/128',
1945 '1:2:3:4:5:ffff:1.2.3.4': '1:2:3:4:5:ffff:102:304/128',
1946 '::7:6:5:4:3:2:1': '0:7:6:5:4:3:2:1/128',
1947 '::7:6:5:4:3:2:0': '0:7:6:5:4:3:2:0/128',
1948 '7:6:5:4:3:2:1::': '7:6:5:4:3:2:1:0/128',
1949 '0:6:5:4:3:2:1::': '0:6:5:4:3:2:1:0/128',
1950 }
1951 for uncompressed, compressed in list(test_addresses.items()):
1952 self.assertEqual(compressed, str(ipaddress.IPv6Interface(
1953 uncompressed)))
1954
1955 def testExplodeShortHandIpStr(self):
1956 addr1 = ipaddress.IPv6Interface('2001::1')
1957 addr2 = ipaddress.IPv6Address('2001:0:5ef5:79fd:0:59d:a0e5:ba1')
1958 addr3 = ipaddress.IPv6Network('2001::/96')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001959 addr4 = ipaddress.IPv4Address('192.168.178.1')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001960 self.assertEqual('2001:0000:0000:0000:0000:0000:0000:0001/128',
1961 addr1.exploded)
1962 self.assertEqual('0000:0000:0000:0000:0000:0000:0000:0001/128',
1963 ipaddress.IPv6Interface('::1/128').exploded)
1964 # issue 77
1965 self.assertEqual('2001:0000:5ef5:79fd:0000:059d:a0e5:0ba1',
1966 addr2.exploded)
1967 self.assertEqual('2001:0000:0000:0000:0000:0000:0000:0000/96',
1968 addr3.exploded)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001969 self.assertEqual('192.168.178.1', addr4.exploded)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001970
Eric V. Smithebdaaf42014-04-14 12:58:07 -04001971 def testReversePointer(self):
1972 addr1 = ipaddress.IPv4Address('127.0.0.1')
1973 addr2 = ipaddress.IPv6Address('2001:db8::1')
1974 self.assertEqual('1.0.0.127.in-addr.arpa', addr1.reverse_pointer)
1975 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.' +
1976 'b.d.0.1.0.0.2.ip6.arpa',
1977 addr2.reverse_pointer)
1978
Nick Coghlandc9b2552012-05-20 21:01:57 +10001979 def testIntRepresentation(self):
1980 self.assertEqual(16909060, int(self.ipv4_address))
1981 self.assertEqual(42540616829182469433547762482097946625,
1982 int(self.ipv6_address))
1983
Nick Coghlandc9b2552012-05-20 21:01:57 +10001984 def testForceVersion(self):
1985 self.assertEqual(ipaddress.ip_network(1).version, 4)
Nick Coghlan51c30672012-05-27 00:25:58 +10001986 self.assertEqual(ipaddress.IPv6Network(1).version, 6)
Sandro Tosi876ecad2012-05-23 22:26:55 +02001987
Nick Coghlandc9b2552012-05-20 21:01:57 +10001988 def testWithStar(self):
Nick Coghlana8517ad2012-08-20 10:04:26 +10001989 self.assertEqual(self.ipv4_interface.with_prefixlen, "1.2.3.4/24")
1990 self.assertEqual(self.ipv4_interface.with_netmask,
Nick Coghlandc9b2552012-05-20 21:01:57 +10001991 "1.2.3.4/255.255.255.0")
Nick Coghlana8517ad2012-08-20 10:04:26 +10001992 self.assertEqual(self.ipv4_interface.with_hostmask,
Nick Coghlandc9b2552012-05-20 21:01:57 +10001993 "1.2.3.4/0.0.0.255")
1994
Nick Coghlana8517ad2012-08-20 10:04:26 +10001995 self.assertEqual(self.ipv6_interface.with_prefixlen,
Nick Coghlandc9b2552012-05-20 21:01:57 +10001996 '2001:658:22a:cafe:200::1/64')
Nick Coghlana8517ad2012-08-20 10:04:26 +10001997 self.assertEqual(self.ipv6_interface.with_netmask,
1998 '2001:658:22a:cafe:200::1/ffff:ffff:ffff:ffff::')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001999 # this probably don't make much sense, but it's included for
2000 # compatibility with ipv4
Nick Coghlana8517ad2012-08-20 10:04:26 +10002001 self.assertEqual(self.ipv6_interface.with_hostmask,
Nick Coghlandc9b2552012-05-20 21:01:57 +10002002 '2001:658:22a:cafe:200::1/::ffff:ffff:ffff:ffff')
2003
2004 def testNetworkElementCaching(self):
2005 # V4 - make sure we're empty
Inada Naoki2430d532019-04-15 16:01:00 +09002006 self.assertNotIn('broadcast_address', self.ipv4_network.__dict__)
2007 self.assertNotIn('hostmask', self.ipv4_network.__dict__)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002008
2009 # V4 - populate and test
Nick Coghlandc9b2552012-05-20 21:01:57 +10002010 self.assertEqual(self.ipv4_network.broadcast_address,
2011 ipaddress.IPv4Address('1.2.3.255'))
2012 self.assertEqual(self.ipv4_network.hostmask,
2013 ipaddress.IPv4Address('0.0.0.255'))
2014
2015 # V4 - check we're cached
Inada Naoki2430d532019-04-15 16:01:00 +09002016 self.assertIn('broadcast_address', self.ipv4_network.__dict__)
2017 self.assertIn('hostmask', self.ipv4_network.__dict__)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002018
2019 # V6 - make sure we're empty
Inada Naoki2430d532019-04-15 16:01:00 +09002020 self.assertNotIn('broadcast_address', self.ipv6_network.__dict__)
2021 self.assertNotIn('hostmask', self.ipv6_network.__dict__)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002022
2023 # V6 - populate and test
2024 self.assertEqual(self.ipv6_network.network_address,
2025 ipaddress.IPv6Address('2001:658:22a:cafe::'))
2026 self.assertEqual(self.ipv6_interface.network.network_address,
2027 ipaddress.IPv6Address('2001:658:22a:cafe::'))
2028
2029 self.assertEqual(
2030 self.ipv6_network.broadcast_address,
2031 ipaddress.IPv6Address('2001:658:22a:cafe:ffff:ffff:ffff:ffff'))
2032 self.assertEqual(self.ipv6_network.hostmask,
2033 ipaddress.IPv6Address('::ffff:ffff:ffff:ffff'))
2034 self.assertEqual(
2035 self.ipv6_interface.network.broadcast_address,
2036 ipaddress.IPv6Address('2001:658:22a:cafe:ffff:ffff:ffff:ffff'))
2037 self.assertEqual(self.ipv6_interface.network.hostmask,
2038 ipaddress.IPv6Address('::ffff:ffff:ffff:ffff'))
2039
2040 # V6 - check we're cached
Inada Naoki2430d532019-04-15 16:01:00 +09002041 self.assertIn('broadcast_address', self.ipv6_network.__dict__)
2042 self.assertIn('hostmask', self.ipv6_network.__dict__)
2043 self.assertIn('broadcast_address', self.ipv6_interface.network.__dict__)
2044 self.assertIn('hostmask', self.ipv6_interface.network.__dict__)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002045
2046 def testTeredo(self):
2047 # stolen from wikipedia
2048 server = ipaddress.IPv4Address('65.54.227.120')
2049 client = ipaddress.IPv4Address('192.0.2.45')
2050 teredo_addr = '2001:0000:4136:e378:8000:63bf:3fff:fdd2'
2051 self.assertEqual((server, client),
2052 ipaddress.ip_address(teredo_addr).teredo)
2053 bad_addr = '2000::4136:e378:8000:63bf:3fff:fdd2'
2054 self.assertFalse(ipaddress.ip_address(bad_addr).teredo)
2055 bad_addr = '2001:0001:4136:e378:8000:63bf:3fff:fdd2'
2056 self.assertFalse(ipaddress.ip_address(bad_addr).teredo)
2057
2058 # i77
2059 teredo_addr = ipaddress.IPv6Address('2001:0:5ef5:79fd:0:59d:a0e5:ba1')
2060 self.assertEqual((ipaddress.IPv4Address('94.245.121.253'),
2061 ipaddress.IPv4Address('95.26.244.94')),
2062 teredo_addr.teredo)
2063
Nick Coghlandc9b2552012-05-20 21:01:57 +10002064 def testsixtofour(self):
2065 sixtofouraddr = ipaddress.ip_address('2002:ac1d:2d64::1')
2066 bad_addr = ipaddress.ip_address('2000:ac1d:2d64::1')
2067 self.assertEqual(ipaddress.IPv4Address('172.29.45.100'),
2068 sixtofouraddr.sixtofour)
2069 self.assertFalse(bad_addr.sixtofour)
2070
Nick Coghlandc9b2552012-05-20 21:01:57 +10002071
2072if __name__ == '__main__':
2073 unittest.main()