blob: cdd9880c3c17fafa7d140508e23a7915bf1ae147 [file] [log] [blame]
Nick Coghlandc9b2552012-05-20 21:01:57 +10001# Copyright 2007 Google Inc.
2# Licensed to PSF under a Contributor Agreement.
Nick Coghlandc9b2552012-05-20 21:01:57 +10003
Nick Coghlanaff73f92012-05-27 00:57:25 +10004"""Unittest for ipaddress module."""
Nick Coghlandc9b2552012-05-20 21:01:57 +10005
6
7import unittest
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10008import re
9import contextlib
Nick Coghlane0c3f5e2012-08-05 18:20:17 +100010import operator
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +020011import pickle
Nick Coghlandc9b2552012-05-20 21:01:57 +100012import ipaddress
Serhiy Storchaka88f64f32015-03-07 20:08:34 +020013import weakref
Serhiy Storchaka17e52642019-08-04 12:38:46 +030014from test.support import LARGEST, SMALLEST
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):
Christian Heimes60ce8f02021-05-02 14:00:35 +020099 # bpo-36384: no leading zeros to avoid ambiguity with octal notation
100 msg = "Leading zeros are not permitted in '\d+'"
101 addresses = [
102 "000.000.000.000",
103 "192.168.000.001",
104 "016.016.016.016",
105 "192.168.000.001",
106 "001.000.008.016",
107 "01.2.3.40",
108 "1.02.3.40",
109 "1.2.03.40",
110 "1.2.3.040",
111 ]
112 for address in addresses:
113 with self.subTest(address=address):
114 with self.assertAddressError(msg):
115 self.factory(address)
Nick Coghlan07c4e332012-07-08 23:06:45 +1000116
117 def test_int(self):
118 self.assertInstancesEqual(0, "0.0.0.0")
119 self.assertInstancesEqual(3232235521, "192.168.0.1")
120
121 def test_packed(self):
122 self.assertInstancesEqual(bytes.fromhex("00000000"), "0.0.0.0")
123 self.assertInstancesEqual(bytes.fromhex("c0a80001"), "192.168.0.1")
Nick Coghlan297b1432012-07-08 17:11:04 +1000124
125 def test_negative_ints_rejected(self):
126 msg = "-1 (< 0) is not permitted as an IPv4 address"
127 with self.assertAddressError(re.escape(msg)):
128 self.factory(-1)
129
130 def test_large_ints_rejected(self):
131 msg = "%d (>= 2**32) is not permitted as an IPv4 address"
132 with self.assertAddressError(re.escape(msg % 2**32)):
133 self.factory(2**32)
134
135 def test_bad_packed_length(self):
136 def assertBadLength(length):
Serhiy Storchaka5f1a5182016-09-11 14:41:02 +0300137 addr = b'\0' * length
Nick Coghlan297b1432012-07-08 17:11:04 +1000138 msg = "%r (len %d != 4) is not permitted as an IPv4 address"
139 with self.assertAddressError(re.escape(msg % (addr, length))):
140 self.factory(addr)
141
142 assertBadLength(3)
143 assertBadLength(5)
144
R David Murray75678652014-10-12 15:17:22 -0400145
Nick Coghlan07c4e332012-07-08 23:06:45 +1000146class CommonTestMixin_v6(CommonTestMixin):
147
148 def test_leading_zeros(self):
149 self.assertInstancesEqual("0000::0000", "::")
150 self.assertInstancesEqual("000::c0a8:0001", "::c0a8:1")
151
152 def test_int(self):
153 self.assertInstancesEqual(0, "::")
154 self.assertInstancesEqual(3232235521, "::c0a8:1")
155
156 def test_packed(self):
Serhiy Storchaka5f1a5182016-09-11 14:41:02 +0300157 addr = b'\0'*12 + bytes.fromhex("00000000")
Nick Coghlan07c4e332012-07-08 23:06:45 +1000158 self.assertInstancesEqual(addr, "::")
Serhiy Storchaka5f1a5182016-09-11 14:41:02 +0300159 addr = b'\0'*12 + bytes.fromhex("c0a80001")
Nick Coghlan07c4e332012-07-08 23:06:45 +1000160 self.assertInstancesEqual(addr, "::c0a8:1")
Serhiy Storchaka5f1a5182016-09-11 14:41:02 +0300161 addr = bytes.fromhex("c0a80001") + b'\0'*12
Nick Coghlan07c4e332012-07-08 23:06:45 +1000162 self.assertInstancesEqual(addr, "c0a8:1::")
Nick Coghlan297b1432012-07-08 17:11:04 +1000163
164 def test_negative_ints_rejected(self):
165 msg = "-1 (< 0) is not permitted as an IPv6 address"
166 with self.assertAddressError(re.escape(msg)):
167 self.factory(-1)
168
169 def test_large_ints_rejected(self):
170 msg = "%d (>= 2**128) is not permitted as an IPv6 address"
171 with self.assertAddressError(re.escape(msg % 2**128)):
172 self.factory(2**128)
173
174 def test_bad_packed_length(self):
175 def assertBadLength(length):
Serhiy Storchaka5f1a5182016-09-11 14:41:02 +0300176 addr = b'\0' * length
Nick Coghlan297b1432012-07-08 17:11:04 +1000177 msg = "%r (len %d != 16) is not permitted as an IPv6 address"
178 with self.assertAddressError(re.escape(msg % (addr, length))):
179 self.factory(addr)
180 self.factory(addr)
181
182 assertBadLength(15)
183 assertBadLength(17)
184
opavlyuk21da76d2020-02-26 16:33:57 +0200185 def test_blank_scope_id(self):
186 address = ('::1%')
187 with self.assertAddressError('Invalid IPv6 address: "%r"', address):
188 self.factory(address)
189
190 def test_invalid_scope_id_with_percent(self):
191 address = ('::1%scope%')
192 with self.assertAddressError('Invalid IPv6 address: "%r"', address):
193 self.factory(address)
Nick Coghlan297b1432012-07-08 17:11:04 +1000194
Nick Coghlan07c4e332012-07-08 23:06:45 +1000195class AddressTestCase_v4(BaseTestCase, CommonTestMixin_v4):
Nick Coghlan297b1432012-07-08 17:11:04 +1000196 factory = ipaddress.IPv4Address
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000197
ewosbornef9c95a42019-09-12 05:03:31 -0400198 def test_format(self):
199 v4 = ipaddress.IPv4Address("1.2.3.42")
200 v4_pairs = [
201 ("b" ,"00000001000000100000001100101010"),
202 ("n" ,"00000001000000100000001100101010"),
203 ("x" ,"0102032a"),
204 ("X" ,"0102032A"),
205 ("_b" ,"0000_0001_0000_0010_0000_0011_0010_1010"),
206 ("_n" ,"0000_0001_0000_0010_0000_0011_0010_1010"),
207 ("_x" ,"0102_032a"),
208 ("_X" ,"0102_032A"),
209 ("#b" ,"0b00000001000000100000001100101010"),
210 ("#n" ,"0b00000001000000100000001100101010"),
211 ("#x" ,"0x0102032a"),
212 ("#X" ,"0X0102032A"),
213 ("#_b" ,"0b0000_0001_0000_0010_0000_0011_0010_1010"),
214 ("#_n" ,"0b0000_0001_0000_0010_0000_0011_0010_1010"),
215 ("#_x" ,"0x0102_032a"),
216 ("#_X" ,"0X0102_032A"),
217 ("s" ,"1.2.3.42"),
218 ("" ,"1.2.3.42"),
219 ]
220 for (fmt, txt) in v4_pairs:
221 self.assertEqual(txt, format(v4, fmt))
222
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000223 def test_network_passed_as_address(self):
224 addr = "127.0.0.1/24"
225 with self.assertAddressError("Unexpected '/' in %r", addr):
226 ipaddress.IPv4Address(addr)
227
228 def test_bad_address_split(self):
229 def assertBadSplit(addr):
230 with self.assertAddressError("Expected 4 octets in %r", addr):
231 ipaddress.IPv4Address(addr)
232
233 assertBadSplit("127.0.1")
234 assertBadSplit("42.42.42.42.42")
235 assertBadSplit("42.42.42")
236 assertBadSplit("42.42")
237 assertBadSplit("42")
238 assertBadSplit("42..42.42.42")
239 assertBadSplit("42.42.42.42.")
240 assertBadSplit("42.42.42.42...")
241 assertBadSplit(".42.42.42.42")
242 assertBadSplit("...42.42.42.42")
243 assertBadSplit("016.016.016")
244 assertBadSplit("016.016")
245 assertBadSplit("016")
246 assertBadSplit("000")
247 assertBadSplit("0x0a.0x0a.0x0a")
248 assertBadSplit("0x0a.0x0a")
249 assertBadSplit("0x0a")
250 assertBadSplit(".")
251 assertBadSplit("bogus")
252 assertBadSplit("bogus.com")
253 assertBadSplit("1000")
254 assertBadSplit("1000000000000000")
255 assertBadSplit("192.168.0.1.com")
256
257 def test_empty_octet(self):
258 def assertBadOctet(addr):
259 with self.assertAddressError("Empty octet not permitted in %r",
R David Murray75678652014-10-12 15:17:22 -0400260 addr):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000261 ipaddress.IPv4Address(addr)
262
263 assertBadOctet("42..42.42")
264 assertBadOctet("...")
265
266 def test_invalid_characters(self):
267 def assertBadOctet(addr, octet):
268 msg = "Only decimal digits permitted in %r in %r" % (octet, addr)
269 with self.assertAddressError(re.escape(msg)):
270 ipaddress.IPv4Address(addr)
271
272 assertBadOctet("0x0a.0x0a.0x0a.0x0a", "0x0a")
Nick Coghlan07c4e332012-07-08 23:06:45 +1000273 assertBadOctet("0xa.0x0a.0x0a.0x0a", "0xa")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000274 assertBadOctet("42.42.42.-0", "-0")
275 assertBadOctet("42.42.42.+0", "+0")
276 assertBadOctet("42.42.42.-42", "-42")
277 assertBadOctet("+1.+2.+3.4", "+1")
278 assertBadOctet("1.2.3.4e0", "4e0")
279 assertBadOctet("1.2.3.4::", "4::")
280 assertBadOctet("1.a.2.3", "a")
281
Nick Coghlan07c4e332012-07-08 23:06:45 +1000282 def test_octet_length(self):
283 def assertBadOctet(addr, octet):
284 msg = "At most 3 characters permitted in %r in %r"
285 with self.assertAddressError(re.escape(msg % (octet, addr))):
286 ipaddress.IPv4Address(addr)
287
288 assertBadOctet("0000.000.000.000", "0000")
289 assertBadOctet("12345.67899.-54321.-98765", "12345")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000290
291 def test_octet_limit(self):
292 def assertBadOctet(addr, octet):
Nick Coghlanb582ecc2012-07-07 22:15:22 +1000293 msg = "Octet %d (> 255) not permitted in %r" % (octet, addr)
294 with self.assertAddressError(re.escape(msg)):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000295 ipaddress.IPv4Address(addr)
296
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000297 assertBadOctet("257.0.0.0", 257)
Nick Coghlan07c4e332012-07-08 23:06:45 +1000298 assertBadOctet("192.168.0.999", 999)
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000299
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +0200300 def test_pickle(self):
301 self.pickle_test('192.0.2.1')
302
Serhiy Storchaka88f64f32015-03-07 20:08:34 +0200303 def test_weakref(self):
304 weakref.ref(self.factory('192.0.2.1'))
305
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000306
Nick Coghlan07c4e332012-07-08 23:06:45 +1000307class AddressTestCase_v6(BaseTestCase, CommonTestMixin_v6):
Nick Coghlan297b1432012-07-08 17:11:04 +1000308 factory = ipaddress.IPv6Address
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000309
ewosbornef9c95a42019-09-12 05:03:31 -0400310 def test_format(self):
311
312 v6 = ipaddress.IPv6Address("::1.2.3.42")
313 v6_pairs = [
314 ("b",
315 "000000000000000000000000000000000000000000000000000000"
316 "000000000000000000000000000000000000000000000000010000"
317 "00100000001100101010"),
318 ("n", "0000000000000000000000000102032a"),
319 ("x", "0000000000000000000000000102032a"),
320 ("X", "0000000000000000000000000102032A"),
321 ("_b",
322 "0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000"
323 "_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000"
324 "_0000_0000_0000_0000_0001_0000_0010_0000_0011_0010"
325 "_1010"),
326 ("_n", "0000_0000_0000_0000_0000_0000_0102_032a"),
327 ("_x", "0000_0000_0000_0000_0000_0000_0102_032a"),
328 ("_X", "0000_0000_0000_0000_0000_0000_0102_032A"),
329 ("#b",
330 "0b0000000000000000000000000000000000000000000000000000"
331 "000000000000000000000000000000000000000000000000000100"
332 "0000100000001100101010"),
333 ("#n", "0x0000000000000000000000000102032a"),
334 ("#x", "0x0000000000000000000000000102032a"),
335 ("#X", "0X0000000000000000000000000102032A"),
336 ("#_b",
337 "0b0000_0000_0000_0000_0000_0000_0000_0000_0000_0000"
338 "_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000"
339 "_0000_0000_0000_0000_0000_0001_0000_0010_0000_0011"
340 "_0010_1010"),
341 ("#_n", "0x0000_0000_0000_0000_0000_0000_0102_032a"),
342 ("#_x", "0x0000_0000_0000_0000_0000_0000_0102_032a"),
343 ("#_X", "0X0000_0000_0000_0000_0000_0000_0102_032A"),
344 ("s", "::102:32a"),
345 ("", "::102:32a"),
346 ]
347
348 for (fmt, txt) in v6_pairs:
349 self.assertEqual(txt, format(v6, fmt))
350
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000351 def test_network_passed_as_address(self):
opavlyuk21da76d2020-02-26 16:33:57 +0200352 def assertBadSplit(addr):
353 msg = "Unexpected '/' in %r"
354 with self.assertAddressError(msg, addr):
355 ipaddress.IPv6Address(addr)
356 assertBadSplit("::1/24")
357 assertBadSplit("::1%scope_id/24")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000358
359 def test_bad_address_split_v6_not_enough_parts(self):
360 def assertBadSplit(addr):
361 msg = "At least 3 parts expected in %r"
opavlyuk21da76d2020-02-26 16:33:57 +0200362 with self.assertAddressError(msg, addr.split('%')[0]):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000363 ipaddress.IPv6Address(addr)
364
365 assertBadSplit(":")
366 assertBadSplit(":1")
367 assertBadSplit("FEDC:9878")
opavlyuk21da76d2020-02-26 16:33:57 +0200368 assertBadSplit(":%scope")
369 assertBadSplit(":1%scope")
370 assertBadSplit("FEDC:9878%scope")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000371
372 def test_bad_address_split_v6_too_many_colons(self):
373 def assertBadSplit(addr):
374 msg = "At most 8 colons permitted in %r"
opavlyuk21da76d2020-02-26 16:33:57 +0200375 with self.assertAddressError(msg, addr.split('%')[0]):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000376 ipaddress.IPv6Address(addr)
377
378 assertBadSplit("9:8:7:6:5:4:3::2:1")
379 assertBadSplit("10:9:8:7:6:5:4:3:2:1")
380 assertBadSplit("::8:7:6:5:4:3:2:1")
381 assertBadSplit("8:7:6:5:4:3:2:1::")
382 # A trailing IPv4 address is two parts
383 assertBadSplit("10:9:8:7:6:5:4:3:42.42.42.42")
384
opavlyuk21da76d2020-02-26 16:33:57 +0200385 assertBadSplit("9:8:7:6:5:4:3::2:1%scope")
386 assertBadSplit("10:9:8:7:6:5:4:3:2:1%scope")
387 assertBadSplit("::8:7:6:5:4:3:2:1%scope")
388 assertBadSplit("8:7:6:5:4:3:2:1::%scope")
389 # A trailing IPv4 address is two parts
390 assertBadSplit("10:9:8:7:6:5:4:3:42.42.42.42%scope")
391
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000392 def test_bad_address_split_v6_too_many_parts(self):
393 def assertBadSplit(addr):
394 msg = "Exactly 8 parts expected without '::' in %r"
opavlyuk21da76d2020-02-26 16:33:57 +0200395 with self.assertAddressError(msg, addr.split('%')[0]):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000396 ipaddress.IPv6Address(addr)
397
398 assertBadSplit("3ffe:0:0:0:0:0:0:0:1")
399 assertBadSplit("9:8:7:6:5:4:3:2:1")
400 assertBadSplit("7:6:5:4:3:2:1")
401 # A trailing IPv4 address is two parts
402 assertBadSplit("9:8:7:6:5:4:3:42.42.42.42")
403 assertBadSplit("7:6:5:4:3:42.42.42.42")
404
opavlyuk21da76d2020-02-26 16:33:57 +0200405 assertBadSplit("3ffe:0:0:0:0:0:0:0:1%scope")
406 assertBadSplit("9:8:7:6:5:4:3:2:1%scope")
407 assertBadSplit("7:6:5:4:3:2:1%scope")
408 # A trailing IPv4 address is two parts
409 assertBadSplit("9:8:7:6:5:4:3:42.42.42.42%scope")
410 assertBadSplit("7:6:5:4:3:42.42.42.42%scope")
411
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000412 def test_bad_address_split_v6_too_many_parts_with_double_colon(self):
413 def assertBadSplit(addr):
414 msg = "Expected at most 7 other parts with '::' in %r"
opavlyuk21da76d2020-02-26 16:33:57 +0200415 with self.assertAddressError(msg, addr.split('%')[0]):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000416 ipaddress.IPv6Address(addr)
417
418 assertBadSplit("1:2:3:4::5:6:7:8")
opavlyuk21da76d2020-02-26 16:33:57 +0200419 assertBadSplit("1:2:3:4::5:6:7:8%scope")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000420
421 def test_bad_address_split_v6_repeated_double_colon(self):
422 def assertBadSplit(addr):
423 msg = "At most one '::' permitted in %r"
opavlyuk21da76d2020-02-26 16:33:57 +0200424 with self.assertAddressError(msg, addr.split('%')[0]):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000425 ipaddress.IPv6Address(addr)
426
427 assertBadSplit("3ffe::1::1")
428 assertBadSplit("1::2::3::4:5")
429 assertBadSplit("2001::db:::1")
430 assertBadSplit("3ffe::1::")
431 assertBadSplit("::3ffe::1")
432 assertBadSplit(":3ffe::1::1")
433 assertBadSplit("3ffe::1::1:")
434 assertBadSplit(":3ffe::1::1:")
435 assertBadSplit(":::")
436 assertBadSplit('2001:db8:::1')
437
opavlyuk21da76d2020-02-26 16:33:57 +0200438 assertBadSplit("3ffe::1::1%scope")
439 assertBadSplit("1::2::3::4:5%scope")
440 assertBadSplit("2001::db:::1%scope")
441 assertBadSplit("3ffe::1::%scope")
442 assertBadSplit("::3ffe::1%scope")
443 assertBadSplit(":3ffe::1::1%scope")
444 assertBadSplit("3ffe::1::1:%scope")
445 assertBadSplit(":3ffe::1::1:%scope")
446 assertBadSplit(":::%scope")
447 assertBadSplit('2001:db8:::1%scope')
448
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000449 def test_bad_address_split_v6_leading_colon(self):
450 def assertBadSplit(addr):
451 msg = "Leading ':' only permitted as part of '::' in %r"
opavlyuk21da76d2020-02-26 16:33:57 +0200452 with self.assertAddressError(msg, addr.split('%')[0]):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000453 ipaddress.IPv6Address(addr)
454
455 assertBadSplit(":2001:db8::1")
456 assertBadSplit(":1:2:3:4:5:6:7")
457 assertBadSplit(":1:2:3:4:5:6:")
458 assertBadSplit(":6:5:4:3:2:1::")
459
opavlyuk21da76d2020-02-26 16:33:57 +0200460 assertBadSplit(":2001:db8::1%scope")
461 assertBadSplit(":1:2:3:4:5:6:7%scope")
462 assertBadSplit(":1:2:3:4:5:6:%scope")
463 assertBadSplit(":6:5:4:3:2:1::%scope")
464
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000465 def test_bad_address_split_v6_trailing_colon(self):
466 def assertBadSplit(addr):
467 msg = "Trailing ':' only permitted as part of '::' in %r"
opavlyuk21da76d2020-02-26 16:33:57 +0200468 with self.assertAddressError(msg, addr.split('%')[0]):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000469 ipaddress.IPv6Address(addr)
470
471 assertBadSplit("2001:db8::1:")
472 assertBadSplit("1:2:3:4:5:6:7:")
473 assertBadSplit("::1.2.3.4:")
474 assertBadSplit("::7:6:5:4:3:2:")
475
opavlyuk21da76d2020-02-26 16:33:57 +0200476 assertBadSplit("2001:db8::1:%scope")
477 assertBadSplit("1:2:3:4:5:6:7:%scope")
478 assertBadSplit("::1.2.3.4:%scope")
479 assertBadSplit("::7:6:5:4:3:2:%scope")
480
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000481 def test_bad_v4_part_in(self):
482 def assertBadAddressPart(addr, v4_error):
opavlyuk21da76d2020-02-26 16:33:57 +0200483 with self.assertAddressError("%s in %r", v4_error, addr.split('%')[0]):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000484 ipaddress.IPv6Address(addr)
485
486 assertBadAddressPart("3ffe::1.net", "Expected 4 octets in '1.net'")
487 assertBadAddressPart("3ffe::127.0.1",
488 "Expected 4 octets in '127.0.1'")
489 assertBadAddressPart("::1.2.3",
490 "Expected 4 octets in '1.2.3'")
491 assertBadAddressPart("::1.2.3.4.5",
492 "Expected 4 octets in '1.2.3.4.5'")
493 assertBadAddressPart("3ffe::1.1.1.net",
494 "Only decimal digits permitted in 'net' "
495 "in '1.1.1.net'")
496
opavlyuk21da76d2020-02-26 16:33:57 +0200497 assertBadAddressPart("3ffe::1.net%scope", "Expected 4 octets in '1.net'")
498 assertBadAddressPart("3ffe::127.0.1%scope",
499 "Expected 4 octets in '127.0.1'")
500 assertBadAddressPart("::1.2.3%scope",
501 "Expected 4 octets in '1.2.3'")
502 assertBadAddressPart("::1.2.3.4.5%scope",
503 "Expected 4 octets in '1.2.3.4.5'")
504 assertBadAddressPart("3ffe::1.1.1.net%scope",
505 "Only decimal digits permitted in 'net' "
506 "in '1.1.1.net'")
507
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000508 def test_invalid_characters(self):
509 def assertBadPart(addr, part):
opavlyuk21da76d2020-02-26 16:33:57 +0200510 msg = "Only hex digits permitted in %r in %r" % (part, addr.split('%')[0])
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000511 with self.assertAddressError(re.escape(msg)):
512 ipaddress.IPv6Address(addr)
513
514 assertBadPart("3ffe::goog", "goog")
515 assertBadPart("3ffe::-0", "-0")
516 assertBadPart("3ffe::+0", "+0")
517 assertBadPart("3ffe::-1", "-1")
518 assertBadPart("1.2.3.4::", "1.2.3.4")
519 assertBadPart('1234:axy::b', "axy")
520
opavlyuk21da76d2020-02-26 16:33:57 +0200521 assertBadPart("3ffe::goog%scope", "goog")
522 assertBadPart("3ffe::-0%scope", "-0")
523 assertBadPart("3ffe::+0%scope", "+0")
524 assertBadPart("3ffe::-1%scope", "-1")
525 assertBadPart("1.2.3.4::%scope", "1.2.3.4")
526 assertBadPart('1234:axy::b%scope', "axy")
527
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000528 def test_part_length(self):
529 def assertBadPart(addr, part):
530 msg = "At most 4 characters permitted in %r in %r"
opavlyuk21da76d2020-02-26 16:33:57 +0200531 with self.assertAddressError(msg, part, addr.split('%')[0]):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000532 ipaddress.IPv6Address(addr)
533
Nick Coghlan07c4e332012-07-08 23:06:45 +1000534 assertBadPart("::00000", "00000")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000535 assertBadPart("3ffe::10000", "10000")
536 assertBadPart("02001:db8::", "02001")
537 assertBadPart('2001:888888::1', "888888")
538
opavlyuk21da76d2020-02-26 16:33:57 +0200539 assertBadPart("::00000%scope", "00000")
540 assertBadPart("3ffe::10000%scope", "10000")
541 assertBadPart("02001:db8::%scope", "02001")
542 assertBadPart('2001:888888::1%scope', "888888")
543
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +0200544 def test_pickle(self):
545 self.pickle_test('2001:db8::')
546
Serhiy Storchaka88f64f32015-03-07 20:08:34 +0200547 def test_weakref(self):
548 weakref.ref(self.factory('2001:db8::'))
opavlyuk21da76d2020-02-26 16:33:57 +0200549 weakref.ref(self.factory('2001:db8::%scope'))
Serhiy Storchaka88f64f32015-03-07 20:08:34 +0200550
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000551
Nick Coghlan07c4e332012-07-08 23:06:45 +1000552class NetmaskTestMixin_v4(CommonTestMixin_v4):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000553 """Input validation on interfaces and networks is very similar"""
554
Cheryl Sabella5609b782018-03-20 20:09:15 -0400555 def test_no_mask(self):
Inada Naoki6fa84bd2019-04-16 08:32:28 +0900556 for address in ('1.2.3.4', 0x01020304, b'\x01\x02\x03\x04'):
557 net = self.factory(address)
558 self.assertEqual(str(net), '1.2.3.4/32')
559 self.assertEqual(str(net.netmask), '255.255.255.255')
560 self.assertEqual(str(net.hostmask), '0.0.0.0')
561 # IPv4Network has prefixlen, but IPv4Interface doesn't.
562 # Should we add it to IPv4Interface too? (bpo-36392)
Cheryl Sabella5609b782018-03-20 20:09:15 -0400563
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000564 def test_split_netmask(self):
565 addr = "1.2.3.4/32/24"
566 with self.assertAddressError("Only one '/' permitted in %r" % addr):
567 self.factory(addr)
568
569 def test_address_errors(self):
570 def assertBadAddress(addr, details):
571 with self.assertAddressError(details):
572 self.factory(addr)
573
Nick Coghlan297b1432012-07-08 17:11:04 +1000574 assertBadAddress("/", "Address cannot be empty")
575 assertBadAddress("/8", "Address cannot be empty")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000576 assertBadAddress("bogus", "Expected 4 octets")
577 assertBadAddress("google.com", "Expected 4 octets")
578 assertBadAddress("10/8", "Expected 4 octets")
579 assertBadAddress("::1.2.3.4", "Only decimal digits")
Nick Coghlanb582ecc2012-07-07 22:15:22 +1000580 assertBadAddress("1.2.3.256", re.escape("256 (> 255)"))
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000581
Nick Coghlan932346f2014-02-08 23:17:36 +1000582 def test_valid_netmask(self):
583 self.assertEqual(str(self.factory('192.0.2.0/255.255.255.0')),
584 '192.0.2.0/24')
585 for i in range(0, 33):
586 # Generate and re-parse the CIDR format (trivial).
587 net_str = '0.0.0.0/%d' % i
588 net = self.factory(net_str)
589 self.assertEqual(str(net), net_str)
590 # Generate and re-parse the expanded netmask.
591 self.assertEqual(
592 str(self.factory('0.0.0.0/%s' % net.netmask)), net_str)
593 # Zero prefix is treated as decimal.
594 self.assertEqual(str(self.factory('0.0.0.0/0%d' % i)), net_str)
595 # Generate and re-parse the expanded hostmask. The ambiguous
596 # cases (/0 and /32) are treated as netmasks.
597 if i in (32, 0):
598 net_str = '0.0.0.0/%d' % (32 - i)
599 self.assertEqual(
600 str(self.factory('0.0.0.0/%s' % net.hostmask)), net_str)
601
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000602 def test_netmask_errors(self):
603 def assertBadNetmask(addr, netmask):
Nick Coghlan932346f2014-02-08 23:17:36 +1000604 msg = "%r is not a valid netmask" % netmask
605 with self.assertNetmaskError(re.escape(msg)):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000606 self.factory("%s/%s" % (addr, netmask))
607
608 assertBadNetmask("1.2.3.4", "")
Nick Coghlan932346f2014-02-08 23:17:36 +1000609 assertBadNetmask("1.2.3.4", "-1")
610 assertBadNetmask("1.2.3.4", "+1")
611 assertBadNetmask("1.2.3.4", " 1 ")
612 assertBadNetmask("1.2.3.4", "0x1")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000613 assertBadNetmask("1.2.3.4", "33")
614 assertBadNetmask("1.2.3.4", "254.254.255.256")
Nick Coghlan932346f2014-02-08 23:17:36 +1000615 assertBadNetmask("1.2.3.4", "1.a.2.3")
Nick Coghlan07c4e332012-07-08 23:06:45 +1000616 assertBadNetmask("1.1.1.1", "254.xyz.2.3")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000617 assertBadNetmask("1.1.1.1", "240.255.0.0")
Nick Coghlan932346f2014-02-08 23:17:36 +1000618 assertBadNetmask("1.1.1.1", "255.254.128.0")
619 assertBadNetmask("1.1.1.1", "0.1.127.255")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000620 assertBadNetmask("1.1.1.1", "pudding")
Nick Coghlan932346f2014-02-08 23:17:36 +1000621 assertBadNetmask("1.1.1.1", "::")
622
Nicolai Moore5e48e3d2019-05-14 20:32:59 +1000623 def test_netmask_in_tuple_errors(self):
624 def assertBadNetmask(addr, netmask):
625 msg = "%r is not a valid netmask" % netmask
626 with self.assertNetmaskError(re.escape(msg)):
627 self.factory((addr, netmask))
628 assertBadNetmask("1.1.1.1", -1)
629 assertBadNetmask("1.1.1.1", 33)
630
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +0200631 def test_pickle(self):
632 self.pickle_test('192.0.2.0/27')
633 self.pickle_test('192.0.2.0/31') # IPV4LENGTH - 1
634 self.pickle_test('192.0.2.0') # IPV4LENGTH
635
R David Murray75678652014-10-12 15:17:22 -0400636
Serhiy Storchakaa556af72015-01-18 22:56:47 +0200637class InterfaceTestCase_v4(BaseTestCase, NetmaskTestMixin_v4):
638 factory = ipaddress.IPv4Interface
639
640
Nick Coghlan07c4e332012-07-08 23:06:45 +1000641class NetworkTestCase_v4(BaseTestCase, NetmaskTestMixin_v4):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000642 factory = ipaddress.IPv4Network
643
Cheryl Sabella91dc64b2017-10-22 17:39:49 -0400644 def test_subnet_of(self):
645 # containee left of container
646 self.assertFalse(
647 self.factory('10.0.0.0/30').subnet_of(
648 self.factory('10.0.1.0/24')))
649 # containee inside container
650 self.assertTrue(
651 self.factory('10.0.0.0/30').subnet_of(
652 self.factory('10.0.0.0/24')))
653 # containee right of container
654 self.assertFalse(
655 self.factory('10.0.0.0/30').subnet_of(
656 self.factory('10.0.1.0/24')))
657 # containee larger than container
658 self.assertFalse(
659 self.factory('10.0.1.0/24').subnet_of(
660 self.factory('10.0.0.0/30')))
661
662 def test_supernet_of(self):
663 # containee left of container
664 self.assertFalse(
665 self.factory('10.0.0.0/30').supernet_of(
666 self.factory('10.0.1.0/24')))
667 # containee inside container
668 self.assertFalse(
669 self.factory('10.0.0.0/30').supernet_of(
670 self.factory('10.0.0.0/24')))
671 # containee right of container
672 self.assertFalse(
673 self.factory('10.0.0.0/30').supernet_of(
674 self.factory('10.0.1.0/24')))
675 # containee larger than container
676 self.assertTrue(
677 self.factory('10.0.0.0/24').supernet_of(
678 self.factory('10.0.0.0/30')))
679
680 def test_subnet_of_mixed_types(self):
681 with self.assertRaises(TypeError):
682 ipaddress.IPv4Network('10.0.0.0/30').supernet_of(
683 ipaddress.IPv6Network('::1/128'))
684 with self.assertRaises(TypeError):
685 ipaddress.IPv6Network('::1/128').supernet_of(
686 ipaddress.IPv4Network('10.0.0.0/30'))
687 with self.assertRaises(TypeError):
688 ipaddress.IPv4Network('10.0.0.0/30').subnet_of(
689 ipaddress.IPv6Network('::1/128'))
690 with self.assertRaises(TypeError):
691 ipaddress.IPv6Network('::1/128').subnet_of(
692 ipaddress.IPv4Network('10.0.0.0/30'))
693
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000694
Nick Coghlan07c4e332012-07-08 23:06:45 +1000695class NetmaskTestMixin_v6(CommonTestMixin_v6):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000696 """Input validation on interfaces and networks is very similar"""
697
Inada Naoki6fa84bd2019-04-16 08:32:28 +0900698 def test_no_mask(self):
699 for address in ('::1', 1, b'\x00'*15 + b'\x01'):
700 net = self.factory(address)
701 self.assertEqual(str(net), '::1/128')
702 self.assertEqual(str(net.netmask), 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff')
703 self.assertEqual(str(net.hostmask), '::')
704 # IPv6Network has prefixlen, but IPv6Interface doesn't.
705 # Should we add it to IPv4Interface too? (bpo-36392)
706
opavlyuk21da76d2020-02-26 16:33:57 +0200707 scoped_net = self.factory('::1%scope')
708 self.assertEqual(str(scoped_net), '::1%scope/128')
709 self.assertEqual(str(scoped_net.netmask), 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff')
710 self.assertEqual(str(scoped_net.hostmask), '::')
711
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000712 def test_split_netmask(self):
713 addr = "cafe:cafe::/128/190"
714 with self.assertAddressError("Only one '/' permitted in %r" % addr):
715 self.factory(addr)
716
opavlyuk21da76d2020-02-26 16:33:57 +0200717 scoped_addr = "cafe:cafe::%scope/128/190"
718 with self.assertAddressError("Only one '/' permitted in %r" % scoped_addr):
719 self.factory(scoped_addr)
720
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000721 def test_address_errors(self):
722 def assertBadAddress(addr, details):
723 with self.assertAddressError(details):
724 self.factory(addr)
725
Nick Coghlan297b1432012-07-08 17:11:04 +1000726 assertBadAddress("/", "Address cannot be empty")
727 assertBadAddress("/8", "Address cannot be empty")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000728 assertBadAddress("google.com", "At least 3 parts")
729 assertBadAddress("1.2.3.4", "At least 3 parts")
730 assertBadAddress("10/8", "At least 3 parts")
731 assertBadAddress("1234:axy::b", "Only hex digits")
732
opavlyuk21da76d2020-02-26 16:33:57 +0200733 assertBadAddress("/%scope", "Address cannot be empty")
734 assertBadAddress("/%scope8", "Address cannot be empty")
735 assertBadAddress("google.com%scope", "At least 3 parts")
736 assertBadAddress("1.2.3.4%scope", "At least 3 parts")
737 assertBadAddress("10%scope/8", "At least 3 parts")
738 assertBadAddress("1234:axy::b%scope", "Only hex digits")
739
Nick Coghlan932346f2014-02-08 23:17:36 +1000740 def test_valid_netmask(self):
741 # We only support CIDR for IPv6, because expanded netmasks are not
742 # standard notation.
743 self.assertEqual(str(self.factory('2001:db8::/32')), '2001:db8::/32')
744 for i in range(0, 129):
745 # Generate and re-parse the CIDR format (trivial).
746 net_str = '::/%d' % i
747 self.assertEqual(str(self.factory(net_str)), net_str)
748 # Zero prefix is treated as decimal.
749 self.assertEqual(str(self.factory('::/0%d' % i)), net_str)
750
opavlyuk21da76d2020-02-26 16:33:57 +0200751 self.assertEqual(str(self.factory('2001:db8::%scope/32')), '2001:db8::%scope/32')
752 for i in range(0, 129):
753 # Generate and re-parse the CIDR format (trivial).
754 net_str = '::/%d' % i
755 self.assertEqual(str(self.factory(net_str)), net_str)
756 # Zero prefix is treated as decimal.
757 self.assertEqual(str(self.factory('::/0%d' % i)), net_str)
758
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000759 def test_netmask_errors(self):
760 def assertBadNetmask(addr, netmask):
Nick Coghlan932346f2014-02-08 23:17:36 +1000761 msg = "%r is not a valid netmask" % netmask
762 with self.assertNetmaskError(re.escape(msg)):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000763 self.factory("%s/%s" % (addr, netmask))
764
765 assertBadNetmask("::1", "")
766 assertBadNetmask("::1", "::1")
767 assertBadNetmask("::1", "1::")
Nick Coghlan932346f2014-02-08 23:17:36 +1000768 assertBadNetmask("::1", "-1")
769 assertBadNetmask("::1", "+1")
770 assertBadNetmask("::1", " 1 ")
771 assertBadNetmask("::1", "0x1")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000772 assertBadNetmask("::1", "129")
Nick Coghlan932346f2014-02-08 23:17:36 +1000773 assertBadNetmask("::1", "1.2.3.4")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000774 assertBadNetmask("::1", "pudding")
Nick Coghlan932346f2014-02-08 23:17:36 +1000775 assertBadNetmask("::", "::")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000776
opavlyuk21da76d2020-02-26 16:33:57 +0200777 assertBadNetmask("::1%scope", "pudding")
778
Nicolai Moore5e48e3d2019-05-14 20:32:59 +1000779 def test_netmask_in_tuple_errors(self):
780 def assertBadNetmask(addr, netmask):
781 msg = "%r is not a valid netmask" % netmask
782 with self.assertNetmaskError(re.escape(msg)):
783 self.factory((addr, netmask))
784 assertBadNetmask("::1", -1)
785 assertBadNetmask("::1", 129)
opavlyuk21da76d2020-02-26 16:33:57 +0200786 assertBadNetmask("::1%scope", 129)
Nicolai Moore5e48e3d2019-05-14 20:32:59 +1000787
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +0200788 def test_pickle(self):
789 self.pickle_test('2001:db8::1000/124')
790 self.pickle_test('2001:db8::1000/127') # IPV6LENGTH - 1
791 self.pickle_test('2001:db8::1000') # IPV6LENGTH
792
opavlyuk21da76d2020-02-26 16:33:57 +0200793 self.pickle_test('2001:db8::1000%scope') # IPV6LENGTH
794
R David Murray75678652014-10-12 15:17:22 -0400795
Nick Coghlan07c4e332012-07-08 23:06:45 +1000796class InterfaceTestCase_v6(BaseTestCase, NetmaskTestMixin_v6):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000797 factory = ipaddress.IPv6Interface
798
R David Murray75678652014-10-12 15:17:22 -0400799
Nick Coghlan07c4e332012-07-08 23:06:45 +1000800class NetworkTestCase_v6(BaseTestCase, NetmaskTestMixin_v6):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000801 factory = ipaddress.IPv6Network
802
Cheryl Sabella91dc64b2017-10-22 17:39:49 -0400803 def test_subnet_of(self):
804 # containee left of container
805 self.assertFalse(
806 self.factory('2000:999::/56').subnet_of(
807 self.factory('2000:aaa::/48')))
808 # containee inside container
809 self.assertTrue(
810 self.factory('2000:aaa::/56').subnet_of(
811 self.factory('2000:aaa::/48')))
812 # containee right of container
813 self.assertFalse(
814 self.factory('2000:bbb::/56').subnet_of(
815 self.factory('2000:aaa::/48')))
816 # containee larger than container
817 self.assertFalse(
818 self.factory('2000:aaa::/48').subnet_of(
819 self.factory('2000:aaa::/56')))
820
opavlyuk21da76d2020-02-26 16:33:57 +0200821 self.assertFalse(
822 self.factory('2000:999::%scope/56').subnet_of(
823 self.factory('2000:aaa::%scope/48')))
824 self.assertTrue(
825 self.factory('2000:aaa::%scope/56').subnet_of(
826 self.factory('2000:aaa::%scope/48')))
827
Cheryl Sabella91dc64b2017-10-22 17:39:49 -0400828 def test_supernet_of(self):
829 # containee left of container
830 self.assertFalse(
831 self.factory('2000:999::/56').supernet_of(
832 self.factory('2000:aaa::/48')))
833 # containee inside container
834 self.assertFalse(
835 self.factory('2000:aaa::/56').supernet_of(
836 self.factory('2000:aaa::/48')))
837 # containee right of container
838 self.assertFalse(
839 self.factory('2000:bbb::/56').supernet_of(
840 self.factory('2000:aaa::/48')))
841 # containee larger than container
842 self.assertTrue(
843 self.factory('2000:aaa::/48').supernet_of(
844 self.factory('2000:aaa::/56')))
845
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000846
Nick Coghlan07c4e332012-07-08 23:06:45 +1000847class FactoryFunctionErrors(BaseTestCase):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000848
849 def assertFactoryError(self, factory, kind):
850 """Ensure a clean ValueError with the expected message"""
851 addr = "camelot"
852 msg = '%r does not appear to be an IPv4 or IPv6 %s'
853 with self.assertCleanError(ValueError, msg, addr, kind):
854 factory(addr)
855
856 def test_ip_address(self):
857 self.assertFactoryError(ipaddress.ip_address, "address")
858
859 def test_ip_interface(self):
860 self.assertFactoryError(ipaddress.ip_interface, "interface")
861
862 def test_ip_network(self):
863 self.assertFactoryError(ipaddress.ip_network, "network")
864
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200865
Nick Coghlan3008ec02012-07-08 00:45:33 +1000866class ComparisonTests(unittest.TestCase):
867
868 v4addr = ipaddress.IPv4Address(1)
869 v4net = ipaddress.IPv4Network(1)
870 v4intf = ipaddress.IPv4Interface(1)
871 v6addr = ipaddress.IPv6Address(1)
872 v6net = ipaddress.IPv6Network(1)
873 v6intf = ipaddress.IPv6Interface(1)
opavlyuk21da76d2020-02-26 16:33:57 +0200874 v6addr_scoped = ipaddress.IPv6Address('::1%scope')
875 v6net_scoped= ipaddress.IPv6Network('::1%scope')
876 v6intf_scoped= ipaddress.IPv6Interface('::1%scope')
Nick Coghlan3008ec02012-07-08 00:45:33 +1000877
878 v4_addresses = [v4addr, v4intf]
879 v4_objects = v4_addresses + [v4net]
880 v6_addresses = [v6addr, v6intf]
881 v6_objects = v6_addresses + [v6net]
opavlyuk21da76d2020-02-26 16:33:57 +0200882 v6_scoped_addresses = [v6addr_scoped, v6intf_scoped]
883 v6_scoped_objects = v6_scoped_addresses + [v6net_scoped]
R David Murray947ff382016-06-02 15:46:04 -0400884
Nick Coghlan3008ec02012-07-08 00:45:33 +1000885 objects = v4_objects + v6_objects
opavlyuk21da76d2020-02-26 16:33:57 +0200886 objects_with_scoped = objects + v6_scoped_objects
Nick Coghlan3008ec02012-07-08 00:45:33 +1000887
R David Murray947ff382016-06-02 15:46:04 -0400888 v4addr2 = ipaddress.IPv4Address(2)
889 v4net2 = ipaddress.IPv4Network(2)
890 v4intf2 = ipaddress.IPv4Interface(2)
891 v6addr2 = ipaddress.IPv6Address(2)
892 v6net2 = ipaddress.IPv6Network(2)
893 v6intf2 = ipaddress.IPv6Interface(2)
opavlyuk21da76d2020-02-26 16:33:57 +0200894 v6addr2_scoped = ipaddress.IPv6Address('::2%scope')
895 v6net2_scoped = ipaddress.IPv6Network('::2%scope')
896 v6intf2_scoped = ipaddress.IPv6Interface('::2%scope')
R David Murray947ff382016-06-02 15:46:04 -0400897
Nick Coghlan3008ec02012-07-08 00:45:33 +1000898 def test_foreign_type_equality(self):
899 # __eq__ should never raise TypeError directly
900 other = object()
opavlyuk21da76d2020-02-26 16:33:57 +0200901 for obj in self.objects_with_scoped:
Nick Coghlan3008ec02012-07-08 00:45:33 +1000902 self.assertNotEqual(obj, other)
903 self.assertFalse(obj == other)
904 self.assertEqual(obj.__eq__(other), NotImplemented)
905 self.assertEqual(obj.__ne__(other), NotImplemented)
906
907 def test_mixed_type_equality(self):
908 # Ensure none of the internal objects accidentally
909 # expose the right set of attributes to become "equal"
910 for lhs in self.objects:
911 for rhs in self.objects:
912 if lhs is rhs:
913 continue
914 self.assertNotEqual(lhs, rhs)
915
opavlyuk21da76d2020-02-26 16:33:57 +0200916 def test_scoped_ipv6_equality(self):
917 for lhs, rhs in zip(self.v6_objects, self.v6_scoped_objects):
918 self.assertNotEqual(lhs, rhs)
919
920 def test_v4_with_v6_scoped_equality(self):
921 for lhs in self.v4_objects:
922 for rhs in self.v6_scoped_objects:
923 self.assertNotEqual(lhs, rhs)
924
R David Murray947ff382016-06-02 15:46:04 -0400925 def test_same_type_equality(self):
opavlyuk21da76d2020-02-26 16:33:57 +0200926 for obj in self.objects_with_scoped:
R David Murray947ff382016-06-02 15:46:04 -0400927 self.assertEqual(obj, obj)
928 self.assertLessEqual(obj, obj)
929 self.assertGreaterEqual(obj, obj)
930
931 def test_same_type_ordering(self):
932 for lhs, rhs in (
933 (self.v4addr, self.v4addr2),
934 (self.v4net, self.v4net2),
935 (self.v4intf, self.v4intf2),
936 (self.v6addr, self.v6addr2),
937 (self.v6net, self.v6net2),
938 (self.v6intf, self.v6intf2),
opavlyuk21da76d2020-02-26 16:33:57 +0200939 (self.v6addr_scoped, self.v6addr2_scoped),
940 (self.v6net_scoped, self.v6net2_scoped),
941 (self.v6intf_scoped, self.v6intf2_scoped),
R David Murray947ff382016-06-02 15:46:04 -0400942 ):
943 self.assertNotEqual(lhs, rhs)
944 self.assertLess(lhs, rhs)
945 self.assertLessEqual(lhs, rhs)
946 self.assertGreater(rhs, lhs)
947 self.assertGreaterEqual(rhs, lhs)
948 self.assertFalse(lhs > rhs)
949 self.assertFalse(rhs < lhs)
950 self.assertFalse(lhs >= rhs)
951 self.assertFalse(rhs <= lhs)
952
Nick Coghlan3008ec02012-07-08 00:45:33 +1000953 def test_containment(self):
954 for obj in self.v4_addresses:
955 self.assertIn(obj, self.v4net)
opavlyuk21da76d2020-02-26 16:33:57 +0200956 for obj in self.v6_addresses + self.v6_scoped_addresses:
Nick Coghlan3008ec02012-07-08 00:45:33 +1000957 self.assertIn(obj, self.v6net)
opavlyuk21da76d2020-02-26 16:33:57 +0200958 for obj in self.v6_addresses + self.v6_scoped_addresses:
959 self.assertIn(obj, self.v6net_scoped)
960
961 for obj in self.v4_objects + [self.v6net, self.v6net_scoped]:
Nick Coghlan3008ec02012-07-08 00:45:33 +1000962 self.assertNotIn(obj, self.v6net)
opavlyuk21da76d2020-02-26 16:33:57 +0200963 for obj in self.v4_objects + [self.v6net, self.v6net_scoped]:
964 self.assertNotIn(obj, self.v6net_scoped)
965 for obj in self.v6_objects + self.v6_scoped_objects + [self.v4net]:
Nick Coghlan3008ec02012-07-08 00:45:33 +1000966 self.assertNotIn(obj, self.v4net)
967
968 def test_mixed_type_ordering(self):
opavlyuk21da76d2020-02-26 16:33:57 +0200969 for lhs in self.objects_with_scoped:
970 for rhs in self.objects_with_scoped:
Nick Coghlan3008ec02012-07-08 00:45:33 +1000971 if isinstance(lhs, type(rhs)) or isinstance(rhs, type(lhs)):
972 continue
973 self.assertRaises(TypeError, lambda: lhs < rhs)
974 self.assertRaises(TypeError, lambda: lhs > rhs)
975 self.assertRaises(TypeError, lambda: lhs <= rhs)
976 self.assertRaises(TypeError, lambda: lhs >= rhs)
977
Serhiy Storchakaf186e122015-01-26 10:11:16 +0200978 def test_foreign_type_ordering(self):
979 other = object()
opavlyuk21da76d2020-02-26 16:33:57 +0200980 for obj in self.objects_with_scoped:
Serhiy Storchakaf186e122015-01-26 10:11:16 +0200981 with self.assertRaises(TypeError):
982 obj < other
983 with self.assertRaises(TypeError):
984 obj > other
985 with self.assertRaises(TypeError):
986 obj <= other
987 with self.assertRaises(TypeError):
988 obj >= other
Serhiy Storchaka17e52642019-08-04 12:38:46 +0300989 self.assertTrue(obj < LARGEST)
990 self.assertFalse(obj > LARGEST)
991 self.assertTrue(obj <= LARGEST)
992 self.assertFalse(obj >= LARGEST)
993 self.assertFalse(obj < SMALLEST)
994 self.assertTrue(obj > SMALLEST)
995 self.assertFalse(obj <= SMALLEST)
996 self.assertTrue(obj >= SMALLEST)
Serhiy Storchakaf186e122015-01-26 10:11:16 +0200997
Nick Coghlan3008ec02012-07-08 00:45:33 +1000998 def test_mixed_type_key(self):
999 # with get_mixed_type_key, you can sort addresses and network.
1000 v4_ordered = [self.v4addr, self.v4net, self.v4intf]
1001 v6_ordered = [self.v6addr, self.v6net, self.v6intf]
opavlyuk21da76d2020-02-26 16:33:57 +02001002 v6_scoped_ordered = [self.v6addr_scoped, self.v6net_scoped, self.v6intf_scoped]
Nick Coghlan3008ec02012-07-08 00:45:33 +10001003 self.assertEqual(v4_ordered,
1004 sorted(self.v4_objects,
1005 key=ipaddress.get_mixed_type_key))
1006 self.assertEqual(v6_ordered,
1007 sorted(self.v6_objects,
1008 key=ipaddress.get_mixed_type_key))
opavlyuk21da76d2020-02-26 16:33:57 +02001009 self.assertEqual(v6_scoped_ordered,
1010 sorted(self.v6_scoped_objects,
1011 key=ipaddress.get_mixed_type_key))
1012 self.assertEqual(v4_ordered + v6_scoped_ordered,
1013 sorted(self.v4_objects + self.v6_scoped_objects,
Nick Coghlan3008ec02012-07-08 00:45:33 +10001014 key=ipaddress.get_mixed_type_key))
1015 self.assertEqual(NotImplemented, ipaddress.get_mixed_type_key(object))
1016
1017 def test_incompatible_versions(self):
1018 # These should always raise TypeError
1019 v4addr = ipaddress.ip_address('1.1.1.1')
1020 v4net = ipaddress.ip_network('1.1.1.1')
1021 v6addr = ipaddress.ip_address('::1')
Serhiy Storchakaf186e122015-01-26 10:11:16 +02001022 v6net = ipaddress.ip_network('::1')
opavlyuk21da76d2020-02-26 16:33:57 +02001023 v6addr_scoped = ipaddress.ip_address('::1%scope')
1024 v6net_scoped = ipaddress.ip_network('::1%scope')
Nick Coghlan3008ec02012-07-08 00:45:33 +10001025
1026 self.assertRaises(TypeError, v4addr.__lt__, v6addr)
1027 self.assertRaises(TypeError, v4addr.__gt__, v6addr)
1028 self.assertRaises(TypeError, v4net.__lt__, v6net)
1029 self.assertRaises(TypeError, v4net.__gt__, v6net)
1030
1031 self.assertRaises(TypeError, v6addr.__lt__, v4addr)
1032 self.assertRaises(TypeError, v6addr.__gt__, v4addr)
1033 self.assertRaises(TypeError, v6net.__lt__, v4net)
1034 self.assertRaises(TypeError, v6net.__gt__, v4net)
1035
opavlyuk21da76d2020-02-26 16:33:57 +02001036 self.assertRaises(TypeError, v4addr.__lt__, v6addr_scoped)
1037 self.assertRaises(TypeError, v4addr.__gt__, v6addr_scoped)
1038 self.assertRaises(TypeError, v4net.__lt__, v6net_scoped)
1039 self.assertRaises(TypeError, v4net.__gt__, v6net_scoped)
1040
1041 self.assertRaises(TypeError, v6addr_scoped.__lt__, v4addr)
1042 self.assertRaises(TypeError, v6addr_scoped.__gt__, v4addr)
1043 self.assertRaises(TypeError, v6net_scoped.__lt__, v4net)
1044 self.assertRaises(TypeError, v6net_scoped.__gt__, v4net)
1045
Nick Coghlan3008ec02012-07-08 00:45:33 +10001046
Nick Coghlandc9b2552012-05-20 21:01:57 +10001047class IpaddrUnitTest(unittest.TestCase):
1048
1049 def setUp(self):
1050 self.ipv4_address = ipaddress.IPv4Address('1.2.3.4')
1051 self.ipv4_interface = ipaddress.IPv4Interface('1.2.3.4/24')
1052 self.ipv4_network = ipaddress.IPv4Network('1.2.3.0/24')
1053 #self.ipv4_hostmask = ipaddress.IPv4Interface('10.0.0.1/0.255.255.255')
1054 self.ipv6_address = ipaddress.IPv6Interface(
1055 '2001:658:22a:cafe:200:0:0:1')
1056 self.ipv6_interface = ipaddress.IPv6Interface(
1057 '2001:658:22a:cafe:200:0:0:1/64')
1058 self.ipv6_network = ipaddress.IPv6Network('2001:658:22a:cafe::/64')
opavlyuk21da76d2020-02-26 16:33:57 +02001059 self.ipv6_scoped_address = ipaddress.IPv6Interface(
1060 '2001:658:22a:cafe:200:0:0:1%scope')
1061 self.ipv6_scoped_interface = ipaddress.IPv6Interface(
1062 '2001:658:22a:cafe:200:0:0:1%scope/64')
1063 self.ipv6_scoped_network = ipaddress.IPv6Network('2001:658:22a:cafe::%scope/64')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001064
1065 def testRepr(self):
1066 self.assertEqual("IPv4Interface('1.2.3.4/32')",
1067 repr(ipaddress.IPv4Interface('1.2.3.4')))
1068 self.assertEqual("IPv6Interface('::1/128')",
1069 repr(ipaddress.IPv6Interface('::1')))
opavlyuk21da76d2020-02-26 16:33:57 +02001070 self.assertEqual("IPv6Interface('::1%scope/128')",
1071 repr(ipaddress.IPv6Interface('::1%scope')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001072
Martin Panter204bf0b2016-07-11 07:51:37 +00001073 # issue #16531: constructing IPv4Network from an (address, mask) tuple
Antoine Pitrou5fb195f2014-05-12 20:36:46 +02001074 def testIPv4Tuple(self):
1075 # /32
1076 ip = ipaddress.IPv4Address('192.0.2.1')
1077 net = ipaddress.IPv4Network('192.0.2.1/32')
1078 self.assertEqual(ipaddress.IPv4Network(('192.0.2.1', 32)), net)
1079 self.assertEqual(ipaddress.IPv4Network((ip, 32)), net)
1080 self.assertEqual(ipaddress.IPv4Network((3221225985, 32)), net)
1081 self.assertEqual(ipaddress.IPv4Network(('192.0.2.1',
1082 '255.255.255.255')), net)
1083 self.assertEqual(ipaddress.IPv4Network((ip,
1084 '255.255.255.255')), net)
1085 self.assertEqual(ipaddress.IPv4Network((3221225985,
1086 '255.255.255.255')), net)
1087 # strict=True and host bits set
1088 with self.assertRaises(ValueError):
1089 ipaddress.IPv4Network(('192.0.2.1', 24))
1090 with self.assertRaises(ValueError):
1091 ipaddress.IPv4Network((ip, 24))
1092 with self.assertRaises(ValueError):
1093 ipaddress.IPv4Network((3221225985, 24))
1094 with self.assertRaises(ValueError):
1095 ipaddress.IPv4Network(('192.0.2.1', '255.255.255.0'))
1096 with self.assertRaises(ValueError):
1097 ipaddress.IPv4Network((ip, '255.255.255.0'))
1098 with self.assertRaises(ValueError):
1099 ipaddress.IPv4Network((3221225985, '255.255.255.0'))
1100 # strict=False and host bits set
1101 net = ipaddress.IPv4Network('192.0.2.0/24')
1102 self.assertEqual(ipaddress.IPv4Network(('192.0.2.1', 24),
1103 strict=False), net)
1104 self.assertEqual(ipaddress.IPv4Network((ip, 24),
1105 strict=False), net)
1106 self.assertEqual(ipaddress.IPv4Network((3221225985, 24),
1107 strict=False), net)
1108 self.assertEqual(ipaddress.IPv4Network(('192.0.2.1',
1109 '255.255.255.0'),
1110 strict=False), net)
1111 self.assertEqual(ipaddress.IPv4Network((ip,
1112 '255.255.255.0'),
1113 strict=False), net)
1114 self.assertEqual(ipaddress.IPv4Network((3221225985,
1115 '255.255.255.0'),
1116 strict=False), net)
1117
1118 # /24
1119 ip = ipaddress.IPv4Address('192.0.2.0')
1120 net = ipaddress.IPv4Network('192.0.2.0/24')
1121 self.assertEqual(ipaddress.IPv4Network(('192.0.2.0',
1122 '255.255.255.0')), net)
1123 self.assertEqual(ipaddress.IPv4Network((ip,
1124 '255.255.255.0')), net)
1125 self.assertEqual(ipaddress.IPv4Network((3221225984,
1126 '255.255.255.0')), net)
1127 self.assertEqual(ipaddress.IPv4Network(('192.0.2.0', 24)), net)
1128 self.assertEqual(ipaddress.IPv4Network((ip, 24)), net)
1129 self.assertEqual(ipaddress.IPv4Network((3221225984, 24)), net)
1130
1131 self.assertEqual(ipaddress.IPv4Interface(('192.0.2.1', 24)),
1132 ipaddress.IPv4Interface('192.0.2.1/24'))
1133 self.assertEqual(ipaddress.IPv4Interface((3221225985, 24)),
1134 ipaddress.IPv4Interface('192.0.2.1/24'))
1135
Martin Panter204bf0b2016-07-11 07:51:37 +00001136 # issue #16531: constructing IPv6Network from an (address, mask) tuple
Antoine Pitrou5fb195f2014-05-12 20:36:46 +02001137 def testIPv6Tuple(self):
1138 # /128
1139 ip = ipaddress.IPv6Address('2001:db8::')
1140 net = ipaddress.IPv6Network('2001:db8::/128')
1141 self.assertEqual(ipaddress.IPv6Network(('2001:db8::', '128')),
1142 net)
1143 self.assertEqual(ipaddress.IPv6Network(
1144 (42540766411282592856903984951653826560, 128)),
1145 net)
1146 self.assertEqual(ipaddress.IPv6Network((ip, '128')),
1147 net)
1148 ip = ipaddress.IPv6Address('2001:db8::')
1149 net = ipaddress.IPv6Network('2001:db8::/96')
1150 self.assertEqual(ipaddress.IPv6Network(('2001:db8::', '96')),
1151 net)
1152 self.assertEqual(ipaddress.IPv6Network(
1153 (42540766411282592856903984951653826560, 96)),
1154 net)
1155 self.assertEqual(ipaddress.IPv6Network((ip, '96')),
1156 net)
1157
opavlyuk21da76d2020-02-26 16:33:57 +02001158 ip_scoped = ipaddress.IPv6Address('2001:db8::%scope')
1159
Antoine Pitrou5fb195f2014-05-12 20:36:46 +02001160 # strict=True and host bits set
1161 ip = ipaddress.IPv6Address('2001:db8::1')
1162 with self.assertRaises(ValueError):
1163 ipaddress.IPv6Network(('2001:db8::1', 96))
1164 with self.assertRaises(ValueError):
1165 ipaddress.IPv6Network((
1166 42540766411282592856903984951653826561, 96))
1167 with self.assertRaises(ValueError):
1168 ipaddress.IPv6Network((ip, 96))
1169 # strict=False and host bits set
1170 net = ipaddress.IPv6Network('2001:db8::/96')
1171 self.assertEqual(ipaddress.IPv6Network(('2001:db8::1', 96),
1172 strict=False),
1173 net)
1174 self.assertEqual(ipaddress.IPv6Network(
1175 (42540766411282592856903984951653826561, 96),
1176 strict=False),
1177 net)
1178 self.assertEqual(ipaddress.IPv6Network((ip, 96), strict=False),
1179 net)
1180
1181 # /96
1182 self.assertEqual(ipaddress.IPv6Interface(('2001:db8::1', '96')),
1183 ipaddress.IPv6Interface('2001:db8::1/96'))
1184 self.assertEqual(ipaddress.IPv6Interface(
1185 (42540766411282592856903984951653826561, '96')),
1186 ipaddress.IPv6Interface('2001:db8::1/96'))
1187
opavlyuk21da76d2020-02-26 16:33:57 +02001188 ip_scoped = ipaddress.IPv6Address('2001:db8::1%scope')
1189 with self.assertRaises(ValueError):
1190 ipaddress.IPv6Network(('2001:db8::1%scope', 96))
1191 with self.assertRaises(ValueError):
1192 ipaddress.IPv6Network((ip_scoped, 96))
1193 # strict=False and host bits set
1194
Nick Coghlandc9b2552012-05-20 21:01:57 +10001195 # issue57
1196 def testAddressIntMath(self):
1197 self.assertEqual(ipaddress.IPv4Address('1.1.1.1') + 255,
1198 ipaddress.IPv4Address('1.1.2.0'))
1199 self.assertEqual(ipaddress.IPv4Address('1.1.1.1') - 256,
1200 ipaddress.IPv4Address('1.1.0.1'))
1201 self.assertEqual(ipaddress.IPv6Address('::1') + (2**16 - 2),
1202 ipaddress.IPv6Address('::ffff'))
1203 self.assertEqual(ipaddress.IPv6Address('::ffff') - (2**16 - 2),
1204 ipaddress.IPv6Address('::1'))
opavlyuk21da76d2020-02-26 16:33:57 +02001205 self.assertNotEqual(ipaddress.IPv6Address('::1%scope') + (2**16 - 2),
1206 ipaddress.IPv6Address('::ffff%scope'))
1207 self.assertNotEqual(ipaddress.IPv6Address('::ffff%scope') - (2**16 - 2),
1208 ipaddress.IPv6Address('::1%scope'))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001209
Nick Coghlan3c2570c2012-07-07 01:13:55 +10001210 def testInvalidIntToBytes(self):
1211 self.assertRaises(ValueError, ipaddress.v4_int_to_packed, -1)
1212 self.assertRaises(ValueError, ipaddress.v4_int_to_packed,
1213 2 ** ipaddress.IPV4LENGTH)
1214 self.assertRaises(ValueError, ipaddress.v6_int_to_packed, -1)
1215 self.assertRaises(ValueError, ipaddress.v6_int_to_packed,
1216 2 ** ipaddress.IPV6LENGTH)
1217
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001218 def testInternals(self):
Serhiy Storchakab53f0fb2015-01-19 00:41:32 +02001219 ip1 = ipaddress.IPv4Address('10.10.10.10')
1220 ip2 = ipaddress.IPv4Address('10.10.10.11')
1221 ip3 = ipaddress.IPv4Address('10.10.10.12')
1222 self.assertEqual(list(ipaddress._find_address_range([ip1])),
1223 [(ip1, ip1)])
1224 self.assertEqual(list(ipaddress._find_address_range([ip1, ip3])),
1225 [(ip1, ip1), (ip3, ip3)])
1226 self.assertEqual(list(ipaddress._find_address_range([ip1, ip2, ip3])),
1227 [(ip1, ip3)])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001228 self.assertEqual(128, ipaddress._count_righthand_zero_bits(0, 128))
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001229 self.assertEqual("IPv4Network('1.2.3.0/24')", repr(self.ipv4_network))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001230
1231 def testGetNetwork(self):
1232 self.assertEqual(int(self.ipv4_network.network_address), 16909056)
1233 self.assertEqual(str(self.ipv4_network.network_address), '1.2.3.0')
1234
1235 self.assertEqual(int(self.ipv6_network.network_address),
1236 42540616829182469433403647294022090752)
1237 self.assertEqual(str(self.ipv6_network.network_address),
1238 '2001:658:22a:cafe::')
1239 self.assertEqual(str(self.ipv6_network.hostmask),
1240 '::ffff:ffff:ffff:ffff')
opavlyuk21da76d2020-02-26 16:33:57 +02001241 self.assertEqual(int(self.ipv6_scoped_network.network_address),
1242 42540616829182469433403647294022090752)
1243 self.assertEqual(str(self.ipv6_scoped_network.network_address),
1244 '2001:658:22a:cafe::%scope')
1245 self.assertEqual(str(self.ipv6_scoped_network.hostmask),
1246 '::ffff:ffff:ffff:ffff')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001247
Nick Coghlandc9b2552012-05-20 21:01:57 +10001248 def testIpFromInt(self):
1249 self.assertEqual(self.ipv4_interface._ip,
1250 ipaddress.IPv4Interface(16909060)._ip)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001251
1252 ipv4 = ipaddress.ip_network('1.2.3.4')
1253 ipv6 = ipaddress.ip_network('2001:658:22a:cafe:200:0:0:1')
opavlyuk21da76d2020-02-26 16:33:57 +02001254 ipv6_scoped = ipaddress.ip_network('2001:658:22a:cafe:200:0:0:1%scope')
Nick Coghlan730f67f2012-08-05 22:02:18 +10001255 self.assertEqual(ipv4, ipaddress.ip_network(int(ipv4.network_address)))
1256 self.assertEqual(ipv6, ipaddress.ip_network(int(ipv6.network_address)))
opavlyuk21da76d2020-02-26 16:33:57 +02001257 self.assertNotEqual(ipv6_scoped, ipaddress.ip_network(int(ipv6_scoped.network_address)))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001258
1259 v6_int = 42540616829182469433547762482097946625
1260 self.assertEqual(self.ipv6_interface._ip,
1261 ipaddress.IPv6Interface(v6_int)._ip)
opavlyuk21da76d2020-02-26 16:33:57 +02001262 self.assertEqual(self.ipv6_scoped_interface._ip,
1263 ipaddress.IPv6Interface(v6_int)._ip)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001264
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001265 self.assertEqual(ipaddress.ip_network(self.ipv4_address._ip).version,
1266 4)
1267 self.assertEqual(ipaddress.ip_network(self.ipv6_address._ip).version,
1268 6)
opavlyuk21da76d2020-02-26 16:33:57 +02001269 self.assertEqual(ipaddress.ip_network(self.ipv6_scoped_address._ip).version,
1270 6)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001271
1272 def testIpFromPacked(self):
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001273 address = ipaddress.ip_address
Nick Coghlandc9b2552012-05-20 21:01:57 +10001274 self.assertEqual(self.ipv4_interface._ip,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001275 ipaddress.ip_interface(b'\x01\x02\x03\x04')._ip)
1276 self.assertEqual(address('255.254.253.252'),
1277 address(b'\xff\xfe\xfd\xfc'))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001278 self.assertEqual(self.ipv6_interface.ip,
1279 ipaddress.ip_interface(
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001280 b'\x20\x01\x06\x58\x02\x2a\xca\xfe'
1281 b'\x02\x00\x00\x00\x00\x00\x00\x01').ip)
1282 self.assertEqual(address('ffff:2:3:4:ffff::'),
1283 address(b'\xff\xff\x00\x02\x00\x03\x00\x04' +
1284 b'\xff\xff' + b'\x00' * 6))
1285 self.assertEqual(address('::'),
1286 address(b'\x00' * 16))
1287
Nick Coghlandc9b2552012-05-20 21:01:57 +10001288 def testGetIp(self):
1289 self.assertEqual(int(self.ipv4_interface.ip), 16909060)
1290 self.assertEqual(str(self.ipv4_interface.ip), '1.2.3.4')
1291
1292 self.assertEqual(int(self.ipv6_interface.ip),
1293 42540616829182469433547762482097946625)
1294 self.assertEqual(str(self.ipv6_interface.ip),
1295 '2001:658:22a:cafe:200::1')
opavlyuk21da76d2020-02-26 16:33:57 +02001296 self.assertEqual(int(self.ipv6_scoped_interface.ip),
1297 42540616829182469433547762482097946625)
1298 self.assertEqual(str(self.ipv6_scoped_interface.ip),
1299 '2001:658:22a:cafe:200::1')
1300
1301 def testGetScopeId(self):
1302 self.assertEqual(self.ipv6_address.scope_id,
1303 None)
1304 self.assertEqual(str(self.ipv6_scoped_address.scope_id),
1305 'scope')
1306 self.assertEqual(self.ipv6_interface.scope_id,
1307 None)
1308 self.assertEqual(str(self.ipv6_scoped_interface.scope_id),
1309 'scope')
1310 self.assertEqual(self.ipv6_network.network_address.scope_id,
1311 None)
1312 self.assertEqual(str(self.ipv6_scoped_network.network_address.scope_id),
1313 'scope')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001314
1315 def testGetNetmask(self):
1316 self.assertEqual(int(self.ipv4_network.netmask), 4294967040)
1317 self.assertEqual(str(self.ipv4_network.netmask), '255.255.255.0')
1318 self.assertEqual(int(self.ipv6_network.netmask),
1319 340282366920938463444927863358058659840)
1320 self.assertEqual(self.ipv6_network.prefixlen, 64)
opavlyuk21da76d2020-02-26 16:33:57 +02001321 self.assertEqual(int(self.ipv6_scoped_network.netmask),
1322 340282366920938463444927863358058659840)
1323 self.assertEqual(self.ipv6_scoped_network.prefixlen, 64)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001324
1325 def testZeroNetmask(self):
1326 ipv4_zero_netmask = ipaddress.IPv4Interface('1.2.3.4/0')
1327 self.assertEqual(int(ipv4_zero_netmask.network.netmask), 0)
Nick Coghlan932346f2014-02-08 23:17:36 +10001328 self.assertEqual(ipv4_zero_netmask._prefix_from_prefix_string('0'), 0)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001329
1330 ipv6_zero_netmask = ipaddress.IPv6Interface('::1/0')
1331 self.assertEqual(int(ipv6_zero_netmask.network.netmask), 0)
Nick Coghlan932346f2014-02-08 23:17:36 +10001332 self.assertEqual(ipv6_zero_netmask._prefix_from_prefix_string('0'), 0)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001333
opavlyuk21da76d2020-02-26 16:33:57 +02001334 ipv6_scoped_zero_netmask = ipaddress.IPv6Interface('::1%scope/0')
1335 self.assertEqual(int(ipv6_scoped_zero_netmask.network.netmask), 0)
1336 self.assertEqual(ipv6_scoped_zero_netmask._prefix_from_prefix_string('0'), 0)
1337
Rémi Lapeyree59ec1b2019-04-13 10:49:34 +02001338 def testIPv4Net(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001339 net = ipaddress.IPv4Network('127.0.0.0/0.0.0.255')
Nick Coghlan932346f2014-02-08 23:17:36 +10001340 self.assertEqual(net.prefixlen, 24)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001341
Nick Coghlandc9b2552012-05-20 21:01:57 +10001342 def testGetBroadcast(self):
1343 self.assertEqual(int(self.ipv4_network.broadcast_address), 16909311)
1344 self.assertEqual(str(self.ipv4_network.broadcast_address), '1.2.3.255')
1345
1346 self.assertEqual(int(self.ipv6_network.broadcast_address),
1347 42540616829182469451850391367731642367)
1348 self.assertEqual(str(self.ipv6_network.broadcast_address),
1349 '2001:658:22a:cafe:ffff:ffff:ffff:ffff')
1350
opavlyuk21da76d2020-02-26 16:33:57 +02001351 self.assertEqual(int(self.ipv6_scoped_network.broadcast_address),
1352 42540616829182469451850391367731642367)
1353 self.assertEqual(str(self.ipv6_scoped_network.broadcast_address),
1354 '2001:658:22a:cafe:ffff:ffff:ffff:ffff')
1355
Nick Coghlandc9b2552012-05-20 21:01:57 +10001356 def testGetPrefixlen(self):
Nick Coghlane3ded952012-08-05 22:45:22 +10001357 self.assertEqual(self.ipv4_interface.network.prefixlen, 24)
1358 self.assertEqual(self.ipv6_interface.network.prefixlen, 64)
opavlyuk21da76d2020-02-26 16:33:57 +02001359 self.assertEqual(self.ipv6_scoped_interface.network.prefixlen, 64)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001360
1361 def testGetSupernet(self):
1362 self.assertEqual(self.ipv4_network.supernet().prefixlen, 23)
1363 self.assertEqual(str(self.ipv4_network.supernet().network_address),
1364 '1.2.2.0')
1365 self.assertEqual(
1366 ipaddress.IPv4Interface('0.0.0.0/0').network.supernet(),
1367 ipaddress.IPv4Network('0.0.0.0/0'))
1368
1369 self.assertEqual(self.ipv6_network.supernet().prefixlen, 63)
1370 self.assertEqual(str(self.ipv6_network.supernet().network_address),
1371 '2001:658:22a:cafe::')
1372 self.assertEqual(ipaddress.IPv6Interface('::0/0').network.supernet(),
1373 ipaddress.IPv6Network('::0/0'))
opavlyuk21da76d2020-02-26 16:33:57 +02001374 self.assertEqual(self.ipv6_scoped_network.supernet().prefixlen, 63)
1375 self.assertEqual(str(self.ipv6_scoped_network.supernet().network_address),
1376 '2001:658:22a:cafe::')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001377
1378 def testGetSupernet3(self):
1379 self.assertEqual(self.ipv4_network.supernet(3).prefixlen, 21)
1380 self.assertEqual(str(self.ipv4_network.supernet(3).network_address),
1381 '1.2.0.0')
1382
1383 self.assertEqual(self.ipv6_network.supernet(3).prefixlen, 61)
1384 self.assertEqual(str(self.ipv6_network.supernet(3).network_address),
1385 '2001:658:22a:caf8::')
opavlyuk21da76d2020-02-26 16:33:57 +02001386 self.assertEqual(self.ipv6_scoped_network.supernet(3).prefixlen, 61)
1387 self.assertEqual(str(self.ipv6_scoped_network.supernet(3).network_address),
1388 '2001:658:22a:caf8::')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001389
1390 def testGetSupernet4(self):
1391 self.assertRaises(ValueError, self.ipv4_network.supernet,
1392 prefixlen_diff=2, new_prefix=1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001393 self.assertRaises(ValueError, self.ipv4_network.supernet,
1394 new_prefix=25)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001395 self.assertEqual(self.ipv4_network.supernet(prefixlen_diff=2),
1396 self.ipv4_network.supernet(new_prefix=22))
1397
1398 self.assertRaises(ValueError, self.ipv6_network.supernet,
1399 prefixlen_diff=2, new_prefix=1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001400 self.assertRaises(ValueError, self.ipv6_network.supernet,
1401 new_prefix=65)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001402 self.assertEqual(self.ipv6_network.supernet(prefixlen_diff=2),
1403 self.ipv6_network.supernet(new_prefix=62))
opavlyuk21da76d2020-02-26 16:33:57 +02001404 self.assertRaises(ValueError, self.ipv6_scoped_network.supernet,
1405 prefixlen_diff=2, new_prefix=1)
1406 self.assertRaises(ValueError, self.ipv6_scoped_network.supernet,
1407 new_prefix=65)
1408 self.assertEqual(self.ipv6_scoped_network.supernet(prefixlen_diff=2),
1409 self.ipv6_scoped_network.supernet(new_prefix=62))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001410
1411 def testHosts(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001412 hosts = list(self.ipv4_network.hosts())
1413 self.assertEqual(254, len(hosts))
1414 self.assertEqual(ipaddress.IPv4Address('1.2.3.1'), hosts[0])
1415 self.assertEqual(ipaddress.IPv4Address('1.2.3.254'), hosts[-1])
1416
Xiang Zhang10b134a2018-03-21 08:25:13 +08001417 ipv6_network = ipaddress.IPv6Network('2001:658:22a:cafe::/120')
1418 hosts = list(ipv6_network.hosts())
1419 self.assertEqual(255, len(hosts))
1420 self.assertEqual(ipaddress.IPv6Address('2001:658:22a:cafe::1'), hosts[0])
1421 self.assertEqual(ipaddress.IPv6Address('2001:658:22a:cafe::ff'), hosts[-1])
1422
opavlyuk21da76d2020-02-26 16:33:57 +02001423 ipv6_scoped_network = ipaddress.IPv6Network('2001:658:22a:cafe::%scope/120')
1424 hosts = list(ipv6_scoped_network.hosts())
1425 self.assertEqual(255, len(hosts))
1426 self.assertEqual(ipaddress.IPv6Address('2001:658:22a:cafe::1'), hosts[0])
1427 self.assertEqual(ipaddress.IPv6Address('2001:658:22a:cafe::ff'), hosts[-1])
1428
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001429 # special case where only 1 bit is left for address
Xiang Zhang10b134a2018-03-21 08:25:13 +08001430 addrs = [ipaddress.IPv4Address('2.0.0.0'),
1431 ipaddress.IPv4Address('2.0.0.1')]
1432 str_args = '2.0.0.0/31'
1433 tpl_args = ('2.0.0.0', 31)
1434 self.assertEqual(addrs, list(ipaddress.ip_network(str_args).hosts()))
1435 self.assertEqual(addrs, list(ipaddress.ip_network(tpl_args).hosts()))
1436 self.assertEqual(list(ipaddress.ip_network(str_args).hosts()),
1437 list(ipaddress.ip_network(tpl_args).hosts()))
1438
Pete Wicken8e9c47a2020-03-09 22:33:45 +00001439 # special case where the network is a /32
1440 addrs = [ipaddress.IPv4Address('1.2.3.4')]
1441 str_args = '1.2.3.4/32'
1442 tpl_args = ('1.2.3.4', 32)
1443 self.assertEqual(addrs, list(ipaddress.ip_network(str_args).hosts()))
1444 self.assertEqual(addrs, list(ipaddress.ip_network(tpl_args).hosts()))
1445 self.assertEqual(list(ipaddress.ip_network(str_args).hosts()),
1446 list(ipaddress.ip_network(tpl_args).hosts()))
1447
Xiang Zhang10b134a2018-03-21 08:25:13 +08001448 addrs = [ipaddress.IPv6Address('2001:658:22a:cafe::'),
1449 ipaddress.IPv6Address('2001:658:22a:cafe::1')]
1450 str_args = '2001:658:22a:cafe::/127'
1451 tpl_args = ('2001:658:22a:cafe::', 127)
1452 self.assertEqual(addrs, list(ipaddress.ip_network(str_args).hosts()))
1453 self.assertEqual(addrs, list(ipaddress.ip_network(tpl_args).hosts()))
1454 self.assertEqual(list(ipaddress.ip_network(str_args).hosts()),
1455 list(ipaddress.ip_network(tpl_args).hosts()))
Pete Wicken8e9c47a2020-03-09 22:33:45 +00001456
1457 addrs = [ipaddress.IPv6Address('2001:658:22a:cafe::1'), ]
1458 str_args = '2001:658:22a:cafe::1/128'
1459 tpl_args = ('2001:658:22a:cafe::1', 128)
opavlyuk21da76d2020-02-26 16:33:57 +02001460 self.assertEqual(addrs, list(ipaddress.ip_network(str_args).hosts()))
1461 self.assertEqual(addrs, list(ipaddress.ip_network(tpl_args).hosts()))
1462 self.assertEqual(list(ipaddress.ip_network(str_args).hosts()),
1463 list(ipaddress.ip_network(tpl_args).hosts()))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001464
1465 def testFancySubnetting(self):
1466 self.assertEqual(sorted(self.ipv4_network.subnets(prefixlen_diff=3)),
1467 sorted(self.ipv4_network.subnets(new_prefix=27)))
1468 self.assertRaises(ValueError, list,
1469 self.ipv4_network.subnets(new_prefix=23))
1470 self.assertRaises(ValueError, list,
1471 self.ipv4_network.subnets(prefixlen_diff=3,
1472 new_prefix=27))
1473 self.assertEqual(sorted(self.ipv6_network.subnets(prefixlen_diff=4)),
1474 sorted(self.ipv6_network.subnets(new_prefix=68)))
1475 self.assertRaises(ValueError, list,
1476 self.ipv6_network.subnets(new_prefix=63))
1477 self.assertRaises(ValueError, list,
1478 self.ipv6_network.subnets(prefixlen_diff=4,
1479 new_prefix=68))
opavlyuk21da76d2020-02-26 16:33:57 +02001480 self.assertEqual(sorted(self.ipv6_scoped_network.subnets(prefixlen_diff=4)),
1481 sorted(self.ipv6_scoped_network.subnets(new_prefix=68)))
1482 self.assertRaises(ValueError, list,
1483 self.ipv6_scoped_network.subnets(new_prefix=63))
1484 self.assertRaises(ValueError, list,
1485 self.ipv6_scoped_network.subnets(prefixlen_diff=4,
1486 new_prefix=68))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001487
1488 def testGetSubnets(self):
1489 self.assertEqual(list(self.ipv4_network.subnets())[0].prefixlen, 25)
1490 self.assertEqual(str(list(
1491 self.ipv4_network.subnets())[0].network_address),
1492 '1.2.3.0')
1493 self.assertEqual(str(list(
1494 self.ipv4_network.subnets())[1].network_address),
1495 '1.2.3.128')
1496
1497 self.assertEqual(list(self.ipv6_network.subnets())[0].prefixlen, 65)
opavlyuk21da76d2020-02-26 16:33:57 +02001498 self.assertEqual(list(self.ipv6_scoped_network.subnets())[0].prefixlen, 65)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001499
1500 def testGetSubnetForSingle32(self):
1501 ip = ipaddress.IPv4Network('1.2.3.4/32')
1502 subnets1 = [str(x) for x in ip.subnets()]
1503 subnets2 = [str(x) for x in ip.subnets(2)]
1504 self.assertEqual(subnets1, ['1.2.3.4/32'])
1505 self.assertEqual(subnets1, subnets2)
1506
1507 def testGetSubnetForSingle128(self):
1508 ip = ipaddress.IPv6Network('::1/128')
1509 subnets1 = [str(x) for x in ip.subnets()]
1510 subnets2 = [str(x) for x in ip.subnets(2)]
1511 self.assertEqual(subnets1, ['::1/128'])
1512 self.assertEqual(subnets1, subnets2)
1513
opavlyuk21da76d2020-02-26 16:33:57 +02001514 ip_scoped = ipaddress.IPv6Network('::1%scope/128')
1515 subnets1 = [str(x) for x in ip_scoped.subnets()]
1516 subnets2 = [str(x) for x in ip_scoped.subnets(2)]
1517 self.assertEqual(subnets1, ['::1%scope/128'])
1518 self.assertEqual(subnets1, subnets2)
1519
Nick Coghlandc9b2552012-05-20 21:01:57 +10001520 def testSubnet2(self):
1521 ips = [str(x) for x in self.ipv4_network.subnets(2)]
1522 self.assertEqual(
1523 ips,
1524 ['1.2.3.0/26', '1.2.3.64/26', '1.2.3.128/26', '1.2.3.192/26'])
1525
1526 ipsv6 = [str(x) for x in self.ipv6_network.subnets(2)]
1527 self.assertEqual(
1528 ipsv6,
1529 ['2001:658:22a:cafe::/66',
1530 '2001:658:22a:cafe:4000::/66',
1531 '2001:658:22a:cafe:8000::/66',
1532 '2001:658:22a:cafe:c000::/66'])
1533
Serhiy Storchakabb0dbd52016-03-01 10:25:45 +02001534 def testGetSubnets3(self):
1535 subnets = [str(x) for x in self.ipv4_network.subnets(8)]
1536 self.assertEqual(subnets[:3],
1537 ['1.2.3.0/32', '1.2.3.1/32', '1.2.3.2/32'])
1538 self.assertEqual(subnets[-3:],
1539 ['1.2.3.253/32', '1.2.3.254/32', '1.2.3.255/32'])
1540 self.assertEqual(len(subnets), 256)
1541
1542 ipv6_network = ipaddress.IPv6Network('2001:658:22a:cafe::/120')
1543 subnets = [str(x) for x in ipv6_network.subnets(8)]
1544 self.assertEqual(subnets[:3],
1545 ['2001:658:22a:cafe::/128',
1546 '2001:658:22a:cafe::1/128',
1547 '2001:658:22a:cafe::2/128'])
1548 self.assertEqual(subnets[-3:],
1549 ['2001:658:22a:cafe::fd/128',
1550 '2001:658:22a:cafe::fe/128',
1551 '2001:658:22a:cafe::ff/128'])
1552 self.assertEqual(len(subnets), 256)
1553
Nick Coghlandc9b2552012-05-20 21:01:57 +10001554 def testSubnetFailsForLargeCidrDiff(self):
1555 self.assertRaises(ValueError, list,
1556 self.ipv4_interface.network.subnets(9))
1557 self.assertRaises(ValueError, list,
1558 self.ipv4_network.subnets(9))
1559 self.assertRaises(ValueError, list,
1560 self.ipv6_interface.network.subnets(65))
1561 self.assertRaises(ValueError, list,
1562 self.ipv6_network.subnets(65))
opavlyuk21da76d2020-02-26 16:33:57 +02001563 self.assertRaises(ValueError, list,
1564 self.ipv6_scoped_interface.network.subnets(65))
1565 self.assertRaises(ValueError, list,
1566 self.ipv6_scoped_network.subnets(65))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001567
1568 def testSupernetFailsForLargeCidrDiff(self):
1569 self.assertRaises(ValueError,
1570 self.ipv4_interface.network.supernet, 25)
1571 self.assertRaises(ValueError,
1572 self.ipv6_interface.network.supernet, 65)
opavlyuk21da76d2020-02-26 16:33:57 +02001573 self.assertRaises(ValueError,
1574 self.ipv6_scoped_interface.network.supernet, 65)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001575
1576 def testSubnetFailsForNegativeCidrDiff(self):
1577 self.assertRaises(ValueError, list,
1578 self.ipv4_interface.network.subnets(-1))
1579 self.assertRaises(ValueError, list,
Nick Coghlan2c589102012-05-27 01:03:25 +10001580 self.ipv4_network.subnets(-1))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001581 self.assertRaises(ValueError, list,
1582 self.ipv6_interface.network.subnets(-1))
1583 self.assertRaises(ValueError, list,
1584 self.ipv6_network.subnets(-1))
opavlyuk21da76d2020-02-26 16:33:57 +02001585 self.assertRaises(ValueError, list,
1586 self.ipv6_scoped_interface.network.subnets(-1))
1587 self.assertRaises(ValueError, list,
1588 self.ipv6_scoped_network.subnets(-1))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001589
1590 def testGetNum_Addresses(self):
1591 self.assertEqual(self.ipv4_network.num_addresses, 256)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001592 self.assertEqual(list(self.ipv4_network.subnets())[0].num_addresses,
1593 128)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001594 self.assertEqual(self.ipv4_network.supernet().num_addresses, 512)
1595
1596 self.assertEqual(self.ipv6_network.num_addresses, 18446744073709551616)
1597 self.assertEqual(list(self.ipv6_network.subnets())[0].num_addresses,
1598 9223372036854775808)
1599 self.assertEqual(self.ipv6_network.supernet().num_addresses,
1600 36893488147419103232)
opavlyuk21da76d2020-02-26 16:33:57 +02001601 self.assertEqual(self.ipv6_scoped_network.num_addresses, 18446744073709551616)
1602 self.assertEqual(list(self.ipv6_scoped_network.subnets())[0].num_addresses,
1603 9223372036854775808)
1604 self.assertEqual(self.ipv6_scoped_network.supernet().num_addresses,
1605 36893488147419103232)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001606
1607 def testContains(self):
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001608 self.assertIn(ipaddress.IPv4Interface('1.2.3.128/25'),
1609 self.ipv4_network)
1610 self.assertNotIn(ipaddress.IPv4Interface('1.2.4.1/24'),
Nick Coghlandc9b2552012-05-20 21:01:57 +10001611 self.ipv4_network)
1612 # We can test addresses and string as well.
1613 addr1 = ipaddress.IPv4Address('1.2.3.37')
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001614 self.assertIn(addr1, self.ipv4_network)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001615 # issue 61, bad network comparison on like-ip'd network objects
1616 # with identical broadcast addresses.
1617 self.assertFalse(ipaddress.IPv4Network('1.1.0.0/16').__contains__(
1618 ipaddress.IPv4Network('1.0.0.0/15')))
1619
Nick Coghlandc9b2552012-05-20 21:01:57 +10001620 def testNth(self):
1621 self.assertEqual(str(self.ipv4_network[5]), '1.2.3.5')
1622 self.assertRaises(IndexError, self.ipv4_network.__getitem__, 256)
1623
1624 self.assertEqual(str(self.ipv6_network[5]),
1625 '2001:658:22a:cafe::5')
Berker Peksag28dc1182016-06-11 22:30:05 +03001626 self.assertRaises(IndexError, self.ipv6_network.__getitem__, 1 << 64)
opavlyuk21da76d2020-02-26 16:33:57 +02001627 self.assertEqual(str(self.ipv6_scoped_network[5]),
1628 '2001:658:22a:cafe::5')
1629 self.assertRaises(IndexError, self.ipv6_scoped_network.__getitem__, 1 << 64)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001630
1631 def testGetitem(self):
1632 # http://code.google.com/p/ipaddr-py/issues/detail?id=15
1633 addr = ipaddress.IPv4Network('172.31.255.128/255.255.255.240')
1634 self.assertEqual(28, addr.prefixlen)
1635 addr_list = list(addr)
1636 self.assertEqual('172.31.255.128', str(addr_list[0]))
1637 self.assertEqual('172.31.255.128', str(addr[0]))
1638 self.assertEqual('172.31.255.143', str(addr_list[-1]))
1639 self.assertEqual('172.31.255.143', str(addr[-1]))
1640 self.assertEqual(addr_list[-1], addr[-1])
1641
1642 def testEqual(self):
1643 self.assertTrue(self.ipv4_interface ==
1644 ipaddress.IPv4Interface('1.2.3.4/24'))
1645 self.assertFalse(self.ipv4_interface ==
1646 ipaddress.IPv4Interface('1.2.3.4/23'))
1647 self.assertFalse(self.ipv4_interface ==
1648 ipaddress.IPv6Interface('::1.2.3.4/24'))
opavlyuk21da76d2020-02-26 16:33:57 +02001649 self.assertFalse(self.ipv4_interface ==
1650 ipaddress.IPv6Interface('::1.2.3.4%scope/24'))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001651 self.assertFalse(self.ipv4_interface == '')
1652 self.assertFalse(self.ipv4_interface == [])
1653 self.assertFalse(self.ipv4_interface == 2)
1654
1655 self.assertTrue(self.ipv6_interface ==
1656 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/64'))
1657 self.assertFalse(self.ipv6_interface ==
1658 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/63'))
1659 self.assertFalse(self.ipv6_interface ==
1660 ipaddress.IPv4Interface('1.2.3.4/23'))
1661 self.assertFalse(self.ipv6_interface == '')
1662 self.assertFalse(self.ipv6_interface == [])
1663 self.assertFalse(self.ipv6_interface == 2)
1664
opavlyuk21da76d2020-02-26 16:33:57 +02001665 self.assertTrue(self.ipv6_scoped_interface ==
1666 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1%scope/64'))
1667 self.assertFalse(self.ipv6_scoped_interface ==
1668 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1%scope/63'))
1669 self.assertFalse(self.ipv6_scoped_interface ==
1670 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/64'))
1671 self.assertFalse(self.ipv6_scoped_interface ==
1672 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/63'))
1673 self.assertFalse(self.ipv6_scoped_interface ==
1674 ipaddress.IPv4Interface('1.2.3.4/23'))
1675 self.assertFalse(self.ipv6_scoped_interface == '')
1676 self.assertFalse(self.ipv6_scoped_interface == [])
1677 self.assertFalse(self.ipv6_scoped_interface == 2)
1678
Nick Coghlandc9b2552012-05-20 21:01:57 +10001679 def testNotEqual(self):
1680 self.assertFalse(self.ipv4_interface !=
1681 ipaddress.IPv4Interface('1.2.3.4/24'))
1682 self.assertTrue(self.ipv4_interface !=
1683 ipaddress.IPv4Interface('1.2.3.4/23'))
1684 self.assertTrue(self.ipv4_interface !=
1685 ipaddress.IPv6Interface('::1.2.3.4/24'))
opavlyuk21da76d2020-02-26 16:33:57 +02001686 self.assertTrue(self.ipv4_interface !=
1687 ipaddress.IPv6Interface('::1.2.3.4%scope/24'))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001688 self.assertTrue(self.ipv4_interface != '')
1689 self.assertTrue(self.ipv4_interface != [])
1690 self.assertTrue(self.ipv4_interface != 2)
1691
1692 self.assertTrue(self.ipv4_address !=
1693 ipaddress.IPv4Address('1.2.3.5'))
1694 self.assertTrue(self.ipv4_address != '')
1695 self.assertTrue(self.ipv4_address != [])
1696 self.assertTrue(self.ipv4_address != 2)
1697
1698 self.assertFalse(self.ipv6_interface !=
1699 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/64'))
1700 self.assertTrue(self.ipv6_interface !=
1701 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/63'))
1702 self.assertTrue(self.ipv6_interface !=
1703 ipaddress.IPv4Interface('1.2.3.4/23'))
1704 self.assertTrue(self.ipv6_interface != '')
1705 self.assertTrue(self.ipv6_interface != [])
1706 self.assertTrue(self.ipv6_interface != 2)
1707
1708 self.assertTrue(self.ipv6_address !=
1709 ipaddress.IPv4Address('1.2.3.4'))
1710 self.assertTrue(self.ipv6_address != '')
1711 self.assertTrue(self.ipv6_address != [])
1712 self.assertTrue(self.ipv6_address != 2)
1713
opavlyuk21da76d2020-02-26 16:33:57 +02001714 self.assertFalse(self.ipv6_scoped_interface !=
1715 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1%scope/64'))
1716 self.assertTrue(self.ipv6_scoped_interface !=
1717 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1%scope/63'))
1718 self.assertTrue(self.ipv6_scoped_interface !=
1719 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/64'))
1720 self.assertTrue(self.ipv6_scoped_interface !=
1721 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/63'))
1722 self.assertTrue(self.ipv6_scoped_interface !=
1723 ipaddress.IPv4Interface('1.2.3.4/23'))
1724 self.assertTrue(self.ipv6_scoped_interface != '')
1725 self.assertTrue(self.ipv6_scoped_interface != [])
1726 self.assertTrue(self.ipv6_scoped_interface != 2)
1727
1728 self.assertTrue(self.ipv6_scoped_address !=
1729 ipaddress.IPv4Address('1.2.3.4'))
1730 self.assertTrue(self.ipv6_scoped_address != '')
1731 self.assertTrue(self.ipv6_scoped_address != [])
1732 self.assertTrue(self.ipv6_scoped_address != 2)
1733
Nick Coghlandc9b2552012-05-20 21:01:57 +10001734 def testSlash32Constructor(self):
1735 self.assertEqual(str(ipaddress.IPv4Interface(
1736 '1.2.3.4/255.255.255.255')), '1.2.3.4/32')
1737
1738 def testSlash128Constructor(self):
1739 self.assertEqual(str(ipaddress.IPv6Interface('::1/128')),
1740 '::1/128')
opavlyuk21da76d2020-02-26 16:33:57 +02001741 self.assertEqual(str(ipaddress.IPv6Interface('::1%scope/128')),
1742 '::1%scope/128')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001743
1744 def testSlash0Constructor(self):
1745 self.assertEqual(str(ipaddress.IPv4Interface('1.2.3.4/0.0.0.0')),
1746 '1.2.3.4/0')
1747
1748 def testCollapsing(self):
1749 # test only IP addresses including some duplicates
1750 ip1 = ipaddress.IPv4Address('1.1.1.0')
1751 ip2 = ipaddress.IPv4Address('1.1.1.1')
1752 ip3 = ipaddress.IPv4Address('1.1.1.2')
1753 ip4 = ipaddress.IPv4Address('1.1.1.3')
1754 ip5 = ipaddress.IPv4Address('1.1.1.4')
1755 ip6 = ipaddress.IPv4Address('1.1.1.0')
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07001756 # check that addresses are subsumed properly.
Nick Coghlandc9b2552012-05-20 21:01:57 +10001757 collapsed = ipaddress.collapse_addresses(
1758 [ip1, ip2, ip3, ip4, ip5, ip6])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001759 self.assertEqual(list(collapsed),
1760 [ipaddress.IPv4Network('1.1.1.0/30'),
1761 ipaddress.IPv4Network('1.1.1.4/32')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001762
1763 # test a mix of IP addresses and networks including some duplicates
1764 ip1 = ipaddress.IPv4Address('1.1.1.0')
1765 ip2 = ipaddress.IPv4Address('1.1.1.1')
1766 ip3 = ipaddress.IPv4Address('1.1.1.2')
1767 ip4 = ipaddress.IPv4Address('1.1.1.3')
1768 #ip5 = ipaddress.IPv4Interface('1.1.1.4/30')
1769 #ip6 = ipaddress.IPv4Interface('1.1.1.4/30')
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07001770 # check that addresses are subsumed properly.
Nick Coghlandc9b2552012-05-20 21:01:57 +10001771 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3, ip4])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001772 self.assertEqual(list(collapsed),
1773 [ipaddress.IPv4Network('1.1.1.0/30')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001774
1775 # test only IP networks
1776 ip1 = ipaddress.IPv4Network('1.1.0.0/24')
1777 ip2 = ipaddress.IPv4Network('1.1.1.0/24')
1778 ip3 = ipaddress.IPv4Network('1.1.2.0/24')
1779 ip4 = ipaddress.IPv4Network('1.1.3.0/24')
1780 ip5 = ipaddress.IPv4Network('1.1.4.0/24')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001781 # stored in no particular order b/c we want CollapseAddr to call
1782 # [].sort
Nick Coghlandc9b2552012-05-20 21:01:57 +10001783 ip6 = ipaddress.IPv4Network('1.1.0.0/22')
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07001784 # check that addresses are subsumed properly.
Nick Coghlandc9b2552012-05-20 21:01:57 +10001785 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3, ip4, ip5,
1786 ip6])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001787 self.assertEqual(list(collapsed),
1788 [ipaddress.IPv4Network('1.1.0.0/22'),
1789 ipaddress.IPv4Network('1.1.4.0/24')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001790
1791 # test that two addresses are supernet'ed properly
1792 collapsed = ipaddress.collapse_addresses([ip1, ip2])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001793 self.assertEqual(list(collapsed),
1794 [ipaddress.IPv4Network('1.1.0.0/23')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001795
1796 # test same IP networks
1797 ip_same1 = ip_same2 = ipaddress.IPv4Network('1.1.1.1/32')
1798 self.assertEqual(list(ipaddress.collapse_addresses(
1799 [ip_same1, ip_same2])),
1800 [ip_same1])
1801
1802 # test same IP addresses
1803 ip_same1 = ip_same2 = ipaddress.IPv4Address('1.1.1.1')
1804 self.assertEqual(list(ipaddress.collapse_addresses(
1805 [ip_same1, ip_same2])),
1806 [ipaddress.ip_network('1.1.1.1/32')])
1807 ip1 = ipaddress.IPv6Network('2001::/100')
1808 ip2 = ipaddress.IPv6Network('2001::/120')
1809 ip3 = ipaddress.IPv6Network('2001::/96')
1810 # test that ipv6 addresses are subsumed properly.
1811 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3])
1812 self.assertEqual(list(collapsed), [ip3])
1813
opavlyuk21da76d2020-02-26 16:33:57 +02001814 ip1 = ipaddress.IPv6Network('2001::%scope/100')
1815 ip2 = ipaddress.IPv6Network('2001::%scope/120')
1816 ip3 = ipaddress.IPv6Network('2001::%scope/96')
1817 # test that ipv6 addresses are subsumed properly.
1818 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3])
1819 self.assertEqual(list(collapsed), [ip3])
1820
Nick Coghlandc9b2552012-05-20 21:01:57 +10001821 # the toejam test
Hynek Schlawack35db5132012-06-01 20:12:17 +02001822 addr_tuples = [
1823 (ipaddress.ip_address('1.1.1.1'),
1824 ipaddress.ip_address('::1')),
1825 (ipaddress.IPv4Network('1.1.0.0/24'),
1826 ipaddress.IPv6Network('2001::/120')),
1827 (ipaddress.IPv4Network('1.1.0.0/32'),
1828 ipaddress.IPv6Network('2001::/128')),
1829 ]
1830 for ip1, ip2 in addr_tuples:
1831 self.assertRaises(TypeError, ipaddress.collapse_addresses,
1832 [ip1, ip2])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001833
opavlyuk21da76d2020-02-26 16:33:57 +02001834 addr_tuples = [
1835 (ipaddress.ip_address('1.1.1.1'),
1836 ipaddress.ip_address('::1%scope')),
1837 (ipaddress.IPv4Network('1.1.0.0/24'),
1838 ipaddress.IPv6Network('2001::%scope/120')),
1839 (ipaddress.IPv4Network('1.1.0.0/32'),
1840 ipaddress.IPv6Network('2001::%scope/128')),
1841 ]
1842 for ip1, ip2 in addr_tuples:
1843 self.assertRaises(TypeError, ipaddress.collapse_addresses,
1844 [ip1, ip2])
1845
Nick Coghlandc9b2552012-05-20 21:01:57 +10001846 def testSummarizing(self):
1847 #ip = ipaddress.ip_address
1848 #ipnet = ipaddress.ip_network
1849 summarize = ipaddress.summarize_address_range
1850 ip1 = ipaddress.ip_address('1.1.1.0')
1851 ip2 = ipaddress.ip_address('1.1.1.255')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001852
1853 # summarize works only for IPv4 & IPv6
1854 class IPv7Address(ipaddress.IPv6Address):
1855 @property
1856 def version(self):
1857 return 7
1858 ip_invalid1 = IPv7Address('::1')
1859 ip_invalid2 = IPv7Address('::1')
1860 self.assertRaises(ValueError, list,
1861 summarize(ip_invalid1, ip_invalid2))
1862 # test that a summary over ip4 & ip6 fails
1863 self.assertRaises(TypeError, list,
1864 summarize(ip1, ipaddress.IPv6Address('::1')))
opavlyuk21da76d2020-02-26 16:33:57 +02001865 self.assertRaises(TypeError, list,
1866 summarize(ip1, ipaddress.IPv6Address('::1%scope')))
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001867 # test a /24 is summarized properly
Nick Coghlandc9b2552012-05-20 21:01:57 +10001868 self.assertEqual(list(summarize(ip1, ip2))[0],
1869 ipaddress.ip_network('1.1.1.0/24'))
Martin Panter7462b6492015-11-02 03:37:02 +00001870 # test an IPv4 range that isn't on a network byte boundary
Nick Coghlandc9b2552012-05-20 21:01:57 +10001871 ip2 = ipaddress.ip_address('1.1.1.8')
1872 self.assertEqual(list(summarize(ip1, ip2)),
1873 [ipaddress.ip_network('1.1.1.0/29'),
1874 ipaddress.ip_network('1.1.1.8')])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001875 # all!
1876 ip1 = ipaddress.IPv4Address(0)
1877 ip2 = ipaddress.IPv4Address(ipaddress.IPv4Address._ALL_ONES)
1878 self.assertEqual([ipaddress.IPv4Network('0.0.0.0/0')],
1879 list(summarize(ip1, ip2)))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001880
1881 ip1 = ipaddress.ip_address('1::')
1882 ip2 = ipaddress.ip_address('1:ffff:ffff:ffff:ffff:ffff:ffff:ffff')
Martin Panter7462b6492015-11-02 03:37:02 +00001883 # test an IPv6 is summarized properly
Nick Coghlandc9b2552012-05-20 21:01:57 +10001884 self.assertEqual(list(summarize(ip1, ip2))[0],
1885 ipaddress.ip_network('1::/16'))
1886 # test an IPv6 range that isn't on a network byte boundary
1887 ip2 = ipaddress.ip_address('2::')
1888 self.assertEqual(list(summarize(ip1, ip2)),
1889 [ipaddress.ip_network('1::/16'),
1890 ipaddress.ip_network('2::/128')])
1891
opavlyuk21da76d2020-02-26 16:33:57 +02001892 ip1 = ipaddress.ip_address('1::%scope')
1893 ip2 = ipaddress.ip_address('1:ffff:ffff:ffff:ffff:ffff:ffff:ffff%scope')
1894 # test an IPv6 is summarized properly
1895 self.assertEqual(list(summarize(ip1, ip2))[0],
1896 ipaddress.ip_network('1::/16'))
1897 # test an IPv6 range that isn't on a network byte boundary
1898 ip2 = ipaddress.ip_address('2::%scope')
1899 self.assertEqual(list(summarize(ip1, ip2)),
1900 [ipaddress.ip_network('1::/16'),
1901 ipaddress.ip_network('2::/128')])
1902
Nick Coghlandc9b2552012-05-20 21:01:57 +10001903 # test exception raised when first is greater than last
1904 self.assertRaises(ValueError, list,
1905 summarize(ipaddress.ip_address('1.1.1.0'),
1906 ipaddress.ip_address('1.1.0.0')))
1907 # test exception raised when first and last aren't IP addresses
1908 self.assertRaises(TypeError, list,
1909 summarize(ipaddress.ip_network('1.1.1.0'),
1910 ipaddress.ip_network('1.1.0.0')))
1911 self.assertRaises(TypeError, list,
1912 summarize(ipaddress.ip_network('1.1.1.0'),
1913 ipaddress.ip_network('1.1.0.0')))
1914 # test exception raised when first and last are not same version
1915 self.assertRaises(TypeError, list,
1916 summarize(ipaddress.ip_address('::'),
1917 ipaddress.ip_network('1.1.0.0')))
1918
1919 def testAddressComparison(self):
1920 self.assertTrue(ipaddress.ip_address('1.1.1.1') <=
1921 ipaddress.ip_address('1.1.1.1'))
1922 self.assertTrue(ipaddress.ip_address('1.1.1.1') <=
1923 ipaddress.ip_address('1.1.1.2'))
1924 self.assertTrue(ipaddress.ip_address('::1') <=
1925 ipaddress.ip_address('::1'))
1926 self.assertTrue(ipaddress.ip_address('::1') <=
1927 ipaddress.ip_address('::2'))
opavlyuk21da76d2020-02-26 16:33:57 +02001928 self.assertTrue(ipaddress.ip_address('::1%scope') <=
1929 ipaddress.ip_address('::1%scope'))
1930 self.assertTrue(ipaddress.ip_address('::1%scope') <=
1931 ipaddress.ip_address('::2%scope'))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001932
Nick Coghlan3008ec02012-07-08 00:45:33 +10001933 def testInterfaceComparison(self):
s-sanjay7bd8d3e2017-03-31 23:09:53 -07001934 self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') ==
1935 ipaddress.ip_interface('1.1.1.1/24'))
1936 self.assertTrue(ipaddress.ip_interface('1.1.1.1/16') <
1937 ipaddress.ip_interface('1.1.1.1/24'))
1938 self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') <
1939 ipaddress.ip_interface('1.1.1.2/24'))
1940 self.assertTrue(ipaddress.ip_interface('1.1.1.2/16') <
1941 ipaddress.ip_interface('1.1.1.1/24'))
1942 self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') >
1943 ipaddress.ip_interface('1.1.1.1/16'))
1944 self.assertTrue(ipaddress.ip_interface('1.1.1.2/24') >
1945 ipaddress.ip_interface('1.1.1.1/24'))
1946 self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') >
1947 ipaddress.ip_interface('1.1.1.2/16'))
1948
1949 self.assertTrue(ipaddress.ip_interface('::1/64') ==
1950 ipaddress.ip_interface('::1/64'))
1951 self.assertTrue(ipaddress.ip_interface('::1/64') <
1952 ipaddress.ip_interface('::1/80'))
1953 self.assertTrue(ipaddress.ip_interface('::1/64') <
1954 ipaddress.ip_interface('::2/64'))
1955 self.assertTrue(ipaddress.ip_interface('::2/48') <
1956 ipaddress.ip_interface('::1/64'))
1957 self.assertTrue(ipaddress.ip_interface('::1/80') >
1958 ipaddress.ip_interface('::1/64'))
1959 self.assertTrue(ipaddress.ip_interface('::2/64') >
1960 ipaddress.ip_interface('::1/64'))
1961 self.assertTrue(ipaddress.ip_interface('::1/64') >
1962 ipaddress.ip_interface('::2/48'))
Nick Coghlan3008ec02012-07-08 00:45:33 +10001963
opavlyuk21da76d2020-02-26 16:33:57 +02001964 self.assertTrue(ipaddress.ip_interface('::1%scope/64') ==
1965 ipaddress.ip_interface('::1%scope/64'))
1966 self.assertTrue(ipaddress.ip_interface('::1%scope/64') <
1967 ipaddress.ip_interface('::1%scope/80'))
1968 self.assertTrue(ipaddress.ip_interface('::1%scope/64') <
1969 ipaddress.ip_interface('::2%scope/64'))
1970 self.assertTrue(ipaddress.ip_interface('::2%scope/48') <
1971 ipaddress.ip_interface('::1%scope/64'))
1972 self.assertTrue(ipaddress.ip_interface('::1%scope/80') >
1973 ipaddress.ip_interface('::1%scope/64'))
1974 self.assertTrue(ipaddress.ip_interface('::2%scope/64') >
1975 ipaddress.ip_interface('::1%scope/64'))
1976 self.assertTrue(ipaddress.ip_interface('::1%scope/64') >
1977 ipaddress.ip_interface('::2%scope/48'))
1978
1979
1980 self.assertFalse(ipaddress.ip_interface('::1%scope/64') ==
1981 ipaddress.ip_interface('::1/64'))
1982 self.assertTrue(ipaddress.ip_interface('::1%scope/64') <
1983 ipaddress.ip_interface('::1/80'))
1984 self.assertTrue(ipaddress.ip_interface('::1%scope/64') <
1985 ipaddress.ip_interface('::2/64'))
1986 self.assertTrue(ipaddress.ip_interface('::2%scope/48') <
1987 ipaddress.ip_interface('::1/64'))
1988 self.assertTrue(ipaddress.ip_interface('::1%scope/80') >
1989 ipaddress.ip_interface('::1/64'))
1990 self.assertTrue(ipaddress.ip_interface('::2%scope/64') >
1991 ipaddress.ip_interface('::1/64'))
1992 self.assertTrue(ipaddress.ip_interface('::1%scope/64') >
1993 ipaddress.ip_interface('::2/48'))
1994
1995 self.assertFalse(ipaddress.ip_interface('::1/64') ==
1996 ipaddress.ip_interface('::1%scope/64'))
1997 self.assertTrue(ipaddress.ip_interface('::1/64') <
1998 ipaddress.ip_interface('::1%scope/80'))
1999 self.assertTrue(ipaddress.ip_interface('::1/64') <
2000 ipaddress.ip_interface('::2%scope/64'))
2001 self.assertTrue(ipaddress.ip_interface('::2/48') <
2002 ipaddress.ip_interface('::1%scope/64'))
2003 self.assertTrue(ipaddress.ip_interface('::1/80') >
2004 ipaddress.ip_interface('::1%scope/64'))
2005 self.assertTrue(ipaddress.ip_interface('::2/64') >
2006 ipaddress.ip_interface('::1%scope/64'))
2007 self.assertTrue(ipaddress.ip_interface('::1/64') >
2008 ipaddress.ip_interface('::2%scope/48'))
2009
Nick Coghlandc9b2552012-05-20 21:01:57 +10002010 def testNetworkComparison(self):
2011 # ip1 and ip2 have the same network address
2012 ip1 = ipaddress.IPv4Network('1.1.1.0/24')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002013 ip2 = ipaddress.IPv4Network('1.1.1.0/32')
Nick Coghlandc9b2552012-05-20 21:01:57 +10002014 ip3 = ipaddress.IPv4Network('1.1.2.0/24')
2015
2016 self.assertTrue(ip1 < ip3)
2017 self.assertTrue(ip3 > ip2)
2018
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002019 self.assertEqual(ip1.compare_networks(ip1), 0)
2020
2021 # if addresses are the same, sort by netmask
2022 self.assertEqual(ip1.compare_networks(ip2), -1)
2023 self.assertEqual(ip2.compare_networks(ip1), 1)
2024
Nick Coghlandc9b2552012-05-20 21:01:57 +10002025 self.assertEqual(ip1.compare_networks(ip3), -1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002026 self.assertEqual(ip3.compare_networks(ip1), 1)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002027 self.assertTrue(ip1._get_networks_key() < ip3._get_networks_key())
2028
2029 ip1 = ipaddress.IPv6Network('2001:2000::/96')
2030 ip2 = ipaddress.IPv6Network('2001:2001::/96')
2031 ip3 = ipaddress.IPv6Network('2001:ffff:2000::/96')
2032
2033 self.assertTrue(ip1 < ip3)
2034 self.assertTrue(ip3 > ip2)
2035 self.assertEqual(ip1.compare_networks(ip3), -1)
2036 self.assertTrue(ip1._get_networks_key() < ip3._get_networks_key())
2037
2038 # Test comparing different protocols.
2039 # Should always raise a TypeError.
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002040 self.assertRaises(TypeError,
2041 self.ipv4_network.compare_networks,
2042 self.ipv6_network)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002043 ipv6 = ipaddress.IPv6Interface('::/0')
2044 ipv4 = ipaddress.IPv4Interface('0.0.0.0/0')
2045 self.assertRaises(TypeError, ipv4.__lt__, ipv6)
2046 self.assertRaises(TypeError, ipv4.__gt__, ipv6)
2047 self.assertRaises(TypeError, ipv6.__lt__, ipv4)
2048 self.assertRaises(TypeError, ipv6.__gt__, ipv4)
2049
2050 # Regression test for issue 19.
2051 ip1 = ipaddress.ip_network('10.1.2.128/25')
2052 self.assertFalse(ip1 < ip1)
2053 self.assertFalse(ip1 > ip1)
2054 ip2 = ipaddress.ip_network('10.1.3.0/24')
2055 self.assertTrue(ip1 < ip2)
2056 self.assertFalse(ip2 < ip1)
2057 self.assertFalse(ip1 > ip2)
2058 self.assertTrue(ip2 > ip1)
2059 ip3 = ipaddress.ip_network('10.1.3.0/25')
2060 self.assertTrue(ip2 < ip3)
2061 self.assertFalse(ip3 < ip2)
2062 self.assertFalse(ip2 > ip3)
2063 self.assertTrue(ip3 > ip2)
2064
2065 # Regression test for issue 28.
2066 ip1 = ipaddress.ip_network('10.10.10.0/31')
2067 ip2 = ipaddress.ip_network('10.10.10.0')
2068 ip3 = ipaddress.ip_network('10.10.10.2/31')
2069 ip4 = ipaddress.ip_network('10.10.10.2')
2070 sorted = [ip1, ip2, ip3, ip4]
2071 unsorted = [ip2, ip4, ip1, ip3]
2072 unsorted.sort()
2073 self.assertEqual(sorted, unsorted)
2074 unsorted = [ip4, ip1, ip3, ip2]
2075 unsorted.sort()
2076 self.assertEqual(sorted, unsorted)
Serhiy Storchakaf186e122015-01-26 10:11:16 +02002077 self.assertIs(ip1.__lt__(ipaddress.ip_address('10.10.10.0')),
2078 NotImplemented)
2079 self.assertIs(ip2.__lt__(ipaddress.ip_address('10.10.10.0')),
2080 NotImplemented)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002081
2082 # <=, >=
2083 self.assertTrue(ipaddress.ip_network('1.1.1.1') <=
2084 ipaddress.ip_network('1.1.1.1'))
2085 self.assertTrue(ipaddress.ip_network('1.1.1.1') <=
2086 ipaddress.ip_network('1.1.1.2'))
2087 self.assertFalse(ipaddress.ip_network('1.1.1.2') <=
2088 ipaddress.ip_network('1.1.1.1'))
opavlyuk21da76d2020-02-26 16:33:57 +02002089
Nick Coghlandc9b2552012-05-20 21:01:57 +10002090 self.assertTrue(ipaddress.ip_network('::1') <=
2091 ipaddress.ip_network('::1'))
2092 self.assertTrue(ipaddress.ip_network('::1') <=
2093 ipaddress.ip_network('::2'))
2094 self.assertFalse(ipaddress.ip_network('::2') <=
2095 ipaddress.ip_network('::1'))
2096
2097 def testStrictNetworks(self):
2098 self.assertRaises(ValueError, ipaddress.ip_network, '192.168.1.1/24')
2099 self.assertRaises(ValueError, ipaddress.ip_network, '::1/120')
opavlyuk21da76d2020-02-26 16:33:57 +02002100 self.assertRaises(ValueError, ipaddress.ip_network, '::1%scope/120')
Nick Coghlandc9b2552012-05-20 21:01:57 +10002101
2102 def testOverlaps(self):
2103 other = ipaddress.IPv4Network('1.2.3.0/30')
2104 other2 = ipaddress.IPv4Network('1.2.2.0/24')
2105 other3 = ipaddress.IPv4Network('1.2.2.64/26')
2106 self.assertTrue(self.ipv4_network.overlaps(other))
2107 self.assertFalse(self.ipv4_network.overlaps(other2))
2108 self.assertTrue(other2.overlaps(other3))
2109
2110 def testEmbeddedIpv4(self):
2111 ipv4_string = '192.168.0.1'
2112 ipv4 = ipaddress.IPv4Interface(ipv4_string)
2113 v4compat_ipv6 = ipaddress.IPv6Interface('::%s' % ipv4_string)
2114 self.assertEqual(int(v4compat_ipv6.ip), int(ipv4.ip))
2115 v4mapped_ipv6 = ipaddress.IPv6Interface('::ffff:%s' % ipv4_string)
2116 self.assertNotEqual(v4mapped_ipv6.ip, ipv4.ip)
2117 self.assertRaises(ipaddress.AddressValueError, ipaddress.IPv6Interface,
2118 '2001:1.1.1.1:1.1.1.1')
2119
2120 # Issue 67: IPv6 with embedded IPv4 address not recognized.
2121 def testIPv6AddressTooLarge(self):
2122 # RFC4291 2.5.5.2
2123 self.assertEqual(ipaddress.ip_address('::FFFF:192.0.2.1'),
2124 ipaddress.ip_address('::FFFF:c000:201'))
2125 # RFC4291 2.2 (part 3) x::d.d.d.d
2126 self.assertEqual(ipaddress.ip_address('FFFF::192.0.2.1'),
2127 ipaddress.ip_address('FFFF::c000:201'))
2128
opavlyuk21da76d2020-02-26 16:33:57 +02002129 self.assertEqual(ipaddress.ip_address('::FFFF:192.0.2.1%scope'),
2130 ipaddress.ip_address('::FFFF:c000:201%scope'))
2131 self.assertEqual(ipaddress.ip_address('FFFF::192.0.2.1%scope'),
2132 ipaddress.ip_address('FFFF::c000:201%scope'))
2133 self.assertNotEqual(ipaddress.ip_address('::FFFF:192.0.2.1%scope'),
2134 ipaddress.ip_address('::FFFF:c000:201'))
2135 self.assertNotEqual(ipaddress.ip_address('FFFF::192.0.2.1%scope'),
2136 ipaddress.ip_address('FFFF::c000:201'))
2137 self.assertNotEqual(ipaddress.ip_address('::FFFF:192.0.2.1'),
2138 ipaddress.ip_address('::FFFF:c000:201%scope'))
2139 self.assertNotEqual(ipaddress.ip_address('FFFF::192.0.2.1'),
2140 ipaddress.ip_address('FFFF::c000:201%scope'))
2141
Nick Coghlandc9b2552012-05-20 21:01:57 +10002142 def testIPVersion(self):
2143 self.assertEqual(self.ipv4_address.version, 4)
2144 self.assertEqual(self.ipv6_address.version, 6)
opavlyuk21da76d2020-02-26 16:33:57 +02002145 self.assertEqual(self.ipv6_scoped_address.version, 6)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002146
2147 def testMaxPrefixLength(self):
2148 self.assertEqual(self.ipv4_interface.max_prefixlen, 32)
2149 self.assertEqual(self.ipv6_interface.max_prefixlen, 128)
opavlyuk21da76d2020-02-26 16:33:57 +02002150 self.assertEqual(self.ipv6_scoped_interface.max_prefixlen, 128)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002151
2152 def testPacked(self):
2153 self.assertEqual(self.ipv4_address.packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10002154 b'\x01\x02\x03\x04')
Nick Coghlandc9b2552012-05-20 21:01:57 +10002155 self.assertEqual(ipaddress.IPv4Interface('255.254.253.252').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10002156 b'\xff\xfe\xfd\xfc')
Nick Coghlandc9b2552012-05-20 21:01:57 +10002157 self.assertEqual(self.ipv6_address.packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10002158 b'\x20\x01\x06\x58\x02\x2a\xca\xfe'
2159 b'\x02\x00\x00\x00\x00\x00\x00\x01')
Nick Coghlandc9b2552012-05-20 21:01:57 +10002160 self.assertEqual(ipaddress.IPv6Interface('ffff:2:3:4:ffff::').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10002161 b'\xff\xff\x00\x02\x00\x03\x00\x04\xff\xff'
2162 + b'\x00' * 6)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002163 self.assertEqual(ipaddress.IPv6Interface('::1:0:0:0:0').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10002164 b'\x00' * 6 + b'\x00\x01' + b'\x00' * 8)
opavlyuk21da76d2020-02-26 16:33:57 +02002165 self.assertEqual(self.ipv6_scoped_address.packed,
2166 b'\x20\x01\x06\x58\x02\x2a\xca\xfe'
2167 b'\x02\x00\x00\x00\x00\x00\x00\x01')
2168 self.assertEqual(ipaddress.IPv6Interface('ffff:2:3:4:ffff::%scope').packed,
2169 b'\xff\xff\x00\x02\x00\x03\x00\x04\xff\xff'
2170 + b'\x00' * 6)
2171 self.assertEqual(ipaddress.IPv6Interface('::1:0:0:0:0%scope').packed,
2172 b'\x00' * 6 + b'\x00\x01' + b'\x00' * 8)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002173
Nick Coghlandc9b2552012-05-20 21:01:57 +10002174 def testIpType(self):
2175 ipv4net = ipaddress.ip_network('1.2.3.4')
2176 ipv4addr = ipaddress.ip_address('1.2.3.4')
2177 ipv6net = ipaddress.ip_network('::1.2.3.4')
2178 ipv6addr = ipaddress.ip_address('::1.2.3.4')
2179 self.assertEqual(ipaddress.IPv4Network, type(ipv4net))
2180 self.assertEqual(ipaddress.IPv4Address, type(ipv4addr))
2181 self.assertEqual(ipaddress.IPv6Network, type(ipv6net))
2182 self.assertEqual(ipaddress.IPv6Address, type(ipv6addr))
2183
2184 def testReservedIpv4(self):
2185 # test networks
2186 self.assertEqual(True, ipaddress.ip_interface(
2187 '224.1.1.1/31').is_multicast)
2188 self.assertEqual(False, ipaddress.ip_network('240.0.0.0').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002189 self.assertEqual(True, ipaddress.ip_network('240.0.0.0').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002190
2191 self.assertEqual(True, ipaddress.ip_interface(
2192 '192.168.1.1/17').is_private)
2193 self.assertEqual(False, ipaddress.ip_network('192.169.0.0').is_private)
2194 self.assertEqual(True, ipaddress.ip_network(
2195 '10.255.255.255').is_private)
2196 self.assertEqual(False, ipaddress.ip_network('11.0.0.0').is_private)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002197 self.assertEqual(False, ipaddress.ip_network('11.0.0.0').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002198 self.assertEqual(True, ipaddress.ip_network(
2199 '172.31.255.255').is_private)
2200 self.assertEqual(False, ipaddress.ip_network('172.32.0.0').is_private)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002201 self.assertEqual(True,
2202 ipaddress.ip_network('169.254.1.0/24').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002203
2204 self.assertEqual(True,
2205 ipaddress.ip_interface(
2206 '169.254.100.200/24').is_link_local)
2207 self.assertEqual(False,
2208 ipaddress.ip_interface(
2209 '169.255.100.200/24').is_link_local)
2210
2211 self.assertEqual(True,
2212 ipaddress.ip_network(
2213 '127.100.200.254/32').is_loopback)
2214 self.assertEqual(True, ipaddress.ip_network(
2215 '127.42.0.0/16').is_loopback)
2216 self.assertEqual(False, ipaddress.ip_network('128.0.0.0').is_loopback)
Peter Moodye5019d52013-10-24 09:47:10 -07002217 self.assertEqual(False,
2218 ipaddress.ip_network('100.64.0.0/10').is_private)
Peter Moodybe9c1b12013-10-22 12:36:21 -07002219 self.assertEqual(False, ipaddress.ip_network('100.64.0.0/10').is_global)
Peter Moodye5019d52013-10-24 09:47:10 -07002220
Peter Moody22c31762013-10-21 13:58:06 -07002221 self.assertEqual(True,
2222 ipaddress.ip_network('192.0.2.128/25').is_private)
2223 self.assertEqual(True,
2224 ipaddress.ip_network('192.0.3.0/24').is_global)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002225
2226 # test addresses
Hynek Schlawackbcd30442012-06-04 14:19:39 +02002227 self.assertEqual(True, ipaddress.ip_address('0.0.0.0').is_unspecified)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002228 self.assertEqual(True, ipaddress.ip_address('224.1.1.1').is_multicast)
2229 self.assertEqual(False, ipaddress.ip_address('240.0.0.0').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002230 self.assertEqual(True, ipaddress.ip_address('240.0.0.1').is_reserved)
2231 self.assertEqual(False,
2232 ipaddress.ip_address('239.255.255.255').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002233
2234 self.assertEqual(True, ipaddress.ip_address('192.168.1.1').is_private)
2235 self.assertEqual(False, ipaddress.ip_address('192.169.0.0').is_private)
2236 self.assertEqual(True, ipaddress.ip_address(
2237 '10.255.255.255').is_private)
2238 self.assertEqual(False, ipaddress.ip_address('11.0.0.0').is_private)
2239 self.assertEqual(True, ipaddress.ip_address(
2240 '172.31.255.255').is_private)
2241 self.assertEqual(False, ipaddress.ip_address('172.32.0.0').is_private)
2242
2243 self.assertEqual(True,
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002244 ipaddress.ip_address('169.254.100.200').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002245 self.assertEqual(False,
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002246 ipaddress.ip_address('169.255.100.200').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002247
Berker Peksag742192a2016-06-11 22:11:47 +03002248 self.assertTrue(ipaddress.ip_address('192.0.7.1').is_global)
2249 self.assertFalse(ipaddress.ip_address('203.0.113.1').is_global)
2250
Nick Coghlandc9b2552012-05-20 21:01:57 +10002251 self.assertEqual(True,
2252 ipaddress.ip_address('127.100.200.254').is_loopback)
2253 self.assertEqual(True, ipaddress.ip_address('127.42.0.0').is_loopback)
2254 self.assertEqual(False, ipaddress.ip_address('128.0.0.0').is_loopback)
2255 self.assertEqual(True, ipaddress.ip_network('0.0.0.0').is_unspecified)
2256
2257 def testReservedIpv6(self):
2258
2259 self.assertEqual(True, ipaddress.ip_network('ffff::').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002260 self.assertEqual(True, ipaddress.ip_network(2**128 - 1).is_multicast)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002261 self.assertEqual(True, ipaddress.ip_network('ff00::').is_multicast)
2262 self.assertEqual(False, ipaddress.ip_network('fdff::').is_multicast)
2263
2264 self.assertEqual(True, ipaddress.ip_network('fecf::').is_site_local)
2265 self.assertEqual(True, ipaddress.ip_network(
2266 'feff:ffff:ffff:ffff::').is_site_local)
2267 self.assertEqual(False, ipaddress.ip_network(
2268 'fbf:ffff::').is_site_local)
2269 self.assertEqual(False, ipaddress.ip_network('ff00::').is_site_local)
2270
2271 self.assertEqual(True, ipaddress.ip_network('fc00::').is_private)
2272 self.assertEqual(True, ipaddress.ip_network(
2273 'fc00:ffff:ffff:ffff::').is_private)
2274 self.assertEqual(False, ipaddress.ip_network('fbff:ffff::').is_private)
2275 self.assertEqual(False, ipaddress.ip_network('fe00::').is_private)
2276
2277 self.assertEqual(True, ipaddress.ip_network('fea0::').is_link_local)
2278 self.assertEqual(True, ipaddress.ip_network(
2279 'febf:ffff::').is_link_local)
2280 self.assertEqual(False, ipaddress.ip_network(
2281 'fe7f:ffff::').is_link_local)
2282 self.assertEqual(False, ipaddress.ip_network('fec0::').is_link_local)
2283
2284 self.assertEqual(True, ipaddress.ip_interface('0:0::0:01').is_loopback)
2285 self.assertEqual(False, ipaddress.ip_interface('::1/127').is_loopback)
2286 self.assertEqual(False, ipaddress.ip_network('::').is_loopback)
2287 self.assertEqual(False, ipaddress.ip_network('::2').is_loopback)
2288
2289 self.assertEqual(True, ipaddress.ip_network('0::0').is_unspecified)
2290 self.assertEqual(False, ipaddress.ip_network('::1').is_unspecified)
2291 self.assertEqual(False, ipaddress.ip_network('::/127').is_unspecified)
2292
Peter Moody22c31762013-10-21 13:58:06 -07002293 self.assertEqual(True,
2294 ipaddress.ip_network('2001::1/128').is_private)
2295 self.assertEqual(True,
2296 ipaddress.ip_network('200::1/128').is_global)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002297 # test addresses
2298 self.assertEqual(True, ipaddress.ip_address('ffff::').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002299 self.assertEqual(True, ipaddress.ip_address(2**128 - 1).is_multicast)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002300 self.assertEqual(True, ipaddress.ip_address('ff00::').is_multicast)
2301 self.assertEqual(False, ipaddress.ip_address('fdff::').is_multicast)
2302
2303 self.assertEqual(True, ipaddress.ip_address('fecf::').is_site_local)
2304 self.assertEqual(True, ipaddress.ip_address(
2305 'feff:ffff:ffff:ffff::').is_site_local)
2306 self.assertEqual(False, ipaddress.ip_address(
2307 'fbf:ffff::').is_site_local)
2308 self.assertEqual(False, ipaddress.ip_address('ff00::').is_site_local)
2309
2310 self.assertEqual(True, ipaddress.ip_address('fc00::').is_private)
2311 self.assertEqual(True, ipaddress.ip_address(
2312 'fc00:ffff:ffff:ffff::').is_private)
2313 self.assertEqual(False, ipaddress.ip_address('fbff:ffff::').is_private)
2314 self.assertEqual(False, ipaddress.ip_address('fe00::').is_private)
2315
2316 self.assertEqual(True, ipaddress.ip_address('fea0::').is_link_local)
2317 self.assertEqual(True, ipaddress.ip_address(
2318 'febf:ffff::').is_link_local)
2319 self.assertEqual(False, ipaddress.ip_address(
2320 'fe7f:ffff::').is_link_local)
2321 self.assertEqual(False, ipaddress.ip_address('fec0::').is_link_local)
2322
2323 self.assertEqual(True, ipaddress.ip_address('0:0::0:01').is_loopback)
2324 self.assertEqual(True, ipaddress.ip_address('::1').is_loopback)
2325 self.assertEqual(False, ipaddress.ip_address('::2').is_loopback)
2326
2327 self.assertEqual(True, ipaddress.ip_address('0::0').is_unspecified)
2328 self.assertEqual(False, ipaddress.ip_address('::1').is_unspecified)
2329
2330 # some generic IETF reserved addresses
2331 self.assertEqual(True, ipaddress.ip_address('100::').is_reserved)
2332 self.assertEqual(True, ipaddress.ip_network('4000::1/128').is_reserved)
2333
2334 def testIpv4Mapped(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002335 self.assertEqual(
2336 ipaddress.ip_address('::ffff:192.168.1.1').ipv4_mapped,
2337 ipaddress.ip_address('192.168.1.1'))
Nick Coghlandc9b2552012-05-20 21:01:57 +10002338 self.assertEqual(ipaddress.ip_address('::c0a8:101').ipv4_mapped, None)
2339 self.assertEqual(ipaddress.ip_address('::ffff:c0a8:101').ipv4_mapped,
2340 ipaddress.ip_address('192.168.1.1'))
2341
2342 def testAddrExclude(self):
2343 addr1 = ipaddress.ip_network('10.1.1.0/24')
2344 addr2 = ipaddress.ip_network('10.1.1.0/26')
2345 addr3 = ipaddress.ip_network('10.2.1.0/24')
2346 addr4 = ipaddress.ip_address('10.1.1.0')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002347 addr5 = ipaddress.ip_network('2001:db8::0/32')
Serhiy Storchakabb0dbd52016-03-01 10:25:45 +02002348 addr6 = ipaddress.ip_network('10.1.1.5/32')
Nick Coghlandc9b2552012-05-20 21:01:57 +10002349 self.assertEqual(sorted(list(addr1.address_exclude(addr2))),
2350 [ipaddress.ip_network('10.1.1.64/26'),
2351 ipaddress.ip_network('10.1.1.128/25')])
2352 self.assertRaises(ValueError, list, addr1.address_exclude(addr3))
2353 self.assertRaises(TypeError, list, addr1.address_exclude(addr4))
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002354 self.assertRaises(TypeError, list, addr1.address_exclude(addr5))
Nick Coghlandc9b2552012-05-20 21:01:57 +10002355 self.assertEqual(list(addr1.address_exclude(addr1)), [])
Serhiy Storchakabb0dbd52016-03-01 10:25:45 +02002356 self.assertEqual(sorted(list(addr1.address_exclude(addr6))),
2357 [ipaddress.ip_network('10.1.1.0/30'),
2358 ipaddress.ip_network('10.1.1.4/32'),
2359 ipaddress.ip_network('10.1.1.6/31'),
2360 ipaddress.ip_network('10.1.1.8/29'),
2361 ipaddress.ip_network('10.1.1.16/28'),
2362 ipaddress.ip_network('10.1.1.32/27'),
2363 ipaddress.ip_network('10.1.1.64/26'),
2364 ipaddress.ip_network('10.1.1.128/25')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10002365
2366 def testHash(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002367 self.assertEqual(hash(ipaddress.ip_interface('10.1.1.0/24')),
2368 hash(ipaddress.ip_interface('10.1.1.0/24')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10002369 self.assertEqual(hash(ipaddress.ip_network('10.1.1.0/24')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002370 hash(ipaddress.ip_network('10.1.1.0/24')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10002371 self.assertEqual(hash(ipaddress.ip_address('10.1.1.0')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002372 hash(ipaddress.ip_address('10.1.1.0')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10002373 # i70
2374 self.assertEqual(hash(ipaddress.ip_address('1.2.3.4')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002375 hash(ipaddress.ip_address(
Nick Coghlandc9b2552012-05-20 21:01:57 +10002376 int(ipaddress.ip_address('1.2.3.4')._ip))))
2377 ip1 = ipaddress.ip_address('10.1.1.0')
2378 ip2 = ipaddress.ip_address('1::')
2379 dummy = {}
2380 dummy[self.ipv4_address] = None
2381 dummy[self.ipv6_address] = None
2382 dummy[ip1] = None
2383 dummy[ip2] = None
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02002384 self.assertIn(self.ipv4_address, dummy)
2385 self.assertIn(ip2, dummy)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002386
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002387 def testIPBases(self):
2388 net = self.ipv4_network
2389 self.assertEqual('1.2.3.0/24', net.compressed)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002390 net = self.ipv6_network
2391 self.assertRaises(ValueError, net._string_from_ip_int, 2**128 + 1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002392
Hynek Schlawack454a74d2012-06-04 18:14:02 +02002393 def testIPv6NetworkHelpers(self):
2394 net = self.ipv6_network
2395 self.assertEqual('2001:658:22a:cafe::/64', net.with_prefixlen)
2396 self.assertEqual('2001:658:22a:cafe::/ffff:ffff:ffff:ffff::',
2397 net.with_netmask)
2398 self.assertEqual('2001:658:22a:cafe::/::ffff:ffff:ffff:ffff',
2399 net.with_hostmask)
2400 self.assertEqual('2001:658:22a:cafe::/64', str(net))
2401
2402 def testIPv4NetworkHelpers(self):
2403 net = self.ipv4_network
2404 self.assertEqual('1.2.3.0/24', net.with_prefixlen)
2405 self.assertEqual('1.2.3.0/255.255.255.0', net.with_netmask)
2406 self.assertEqual('1.2.3.0/0.0.0.255', net.with_hostmask)
2407 self.assertEqual('1.2.3.0/24', str(net))
2408
Nick Coghlandc9b2552012-05-20 21:01:57 +10002409 def testCopyConstructor(self):
2410 addr1 = ipaddress.ip_network('10.1.1.0/24')
2411 addr2 = ipaddress.ip_network(addr1)
2412 addr3 = ipaddress.ip_interface('2001:658:22a:cafe:200::1/64')
2413 addr4 = ipaddress.ip_interface(addr3)
2414 addr5 = ipaddress.IPv4Address('1.1.1.1')
2415 addr6 = ipaddress.IPv6Address('2001:658:22a:cafe:200::1')
2416
2417 self.assertEqual(addr1, addr2)
2418 self.assertEqual(addr3, addr4)
2419 self.assertEqual(addr5, ipaddress.IPv4Address(addr5))
2420 self.assertEqual(addr6, ipaddress.IPv6Address(addr6))
2421
2422 def testCompressIPv6Address(self):
2423 test_addresses = {
2424 '1:2:3:4:5:6:7:8': '1:2:3:4:5:6:7:8/128',
2425 '2001:0:0:4:0:0:0:8': '2001:0:0:4::8/128',
2426 '2001:0:0:4:5:6:7:8': '2001::4:5:6:7:8/128',
2427 '2001:0:3:4:5:6:7:8': '2001:0:3:4:5:6:7:8/128',
Nick Coghlandc9b2552012-05-20 21:01:57 +10002428 '0:0:3:0:0:0:0:ffff': '0:0:3::ffff/128',
2429 '0:0:0:4:0:0:0:ffff': '::4:0:0:0:ffff/128',
2430 '0:0:0:0:5:0:0:ffff': '::5:0:0:ffff/128',
2431 '1:0:0:4:0:0:7:8': '1::4:0:0:7:8/128',
2432 '0:0:0:0:0:0:0:0': '::/128',
2433 '0:0:0:0:0:0:0:0/0': '::/0',
2434 '0:0:0:0:0:0:0:1': '::1/128',
2435 '2001:0658:022a:cafe:0000:0000:0000:0000/66':
2436 '2001:658:22a:cafe::/66',
2437 '::1.2.3.4': '::102:304/128',
2438 '1:2:3:4:5:ffff:1.2.3.4': '1:2:3:4:5:ffff:102:304/128',
2439 '::7:6:5:4:3:2:1': '0:7:6:5:4:3:2:1/128',
2440 '::7:6:5:4:3:2:0': '0:7:6:5:4:3:2:0/128',
2441 '7:6:5:4:3:2:1::': '7:6:5:4:3:2:1:0/128',
2442 '0:6:5:4:3:2:1::': '0:6:5:4:3:2:1:0/128',
2443 }
2444 for uncompressed, compressed in list(test_addresses.items()):
2445 self.assertEqual(compressed, str(ipaddress.IPv6Interface(
2446 uncompressed)))
2447
2448 def testExplodeShortHandIpStr(self):
2449 addr1 = ipaddress.IPv6Interface('2001::1')
2450 addr2 = ipaddress.IPv6Address('2001:0:5ef5:79fd:0:59d:a0e5:ba1')
2451 addr3 = ipaddress.IPv6Network('2001::/96')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002452 addr4 = ipaddress.IPv4Address('192.168.178.1')
Nick Coghlandc9b2552012-05-20 21:01:57 +10002453 self.assertEqual('2001:0000:0000:0000:0000:0000:0000:0001/128',
2454 addr1.exploded)
2455 self.assertEqual('0000:0000:0000:0000:0000:0000:0000:0001/128',
2456 ipaddress.IPv6Interface('::1/128').exploded)
2457 # issue 77
2458 self.assertEqual('2001:0000:5ef5:79fd:0000:059d:a0e5:0ba1',
2459 addr2.exploded)
2460 self.assertEqual('2001:0000:0000:0000:0000:0000:0000:0000/96',
2461 addr3.exploded)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002462 self.assertEqual('192.168.178.1', addr4.exploded)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002463
Eric V. Smithebdaaf42014-04-14 12:58:07 -04002464 def testReversePointer(self):
2465 addr1 = ipaddress.IPv4Address('127.0.0.1')
2466 addr2 = ipaddress.IPv6Address('2001:db8::1')
2467 self.assertEqual('1.0.0.127.in-addr.arpa', addr1.reverse_pointer)
2468 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.' +
2469 'b.d.0.1.0.0.2.ip6.arpa',
2470 addr2.reverse_pointer)
2471
Nick Coghlandc9b2552012-05-20 21:01:57 +10002472 def testIntRepresentation(self):
2473 self.assertEqual(16909060, int(self.ipv4_address))
2474 self.assertEqual(42540616829182469433547762482097946625,
2475 int(self.ipv6_address))
2476
Nick Coghlandc9b2552012-05-20 21:01:57 +10002477 def testForceVersion(self):
2478 self.assertEqual(ipaddress.ip_network(1).version, 4)
Nick Coghlan51c30672012-05-27 00:25:58 +10002479 self.assertEqual(ipaddress.IPv6Network(1).version, 6)
Sandro Tosi876ecad2012-05-23 22:26:55 +02002480
Nick Coghlandc9b2552012-05-20 21:01:57 +10002481 def testWithStar(self):
Nick Coghlana8517ad2012-08-20 10:04:26 +10002482 self.assertEqual(self.ipv4_interface.with_prefixlen, "1.2.3.4/24")
2483 self.assertEqual(self.ipv4_interface.with_netmask,
Nick Coghlandc9b2552012-05-20 21:01:57 +10002484 "1.2.3.4/255.255.255.0")
Nick Coghlana8517ad2012-08-20 10:04:26 +10002485 self.assertEqual(self.ipv4_interface.with_hostmask,
Nick Coghlandc9b2552012-05-20 21:01:57 +10002486 "1.2.3.4/0.0.0.255")
2487
Nick Coghlana8517ad2012-08-20 10:04:26 +10002488 self.assertEqual(self.ipv6_interface.with_prefixlen,
Nick Coghlandc9b2552012-05-20 21:01:57 +10002489 '2001:658:22a:cafe:200::1/64')
Nick Coghlana8517ad2012-08-20 10:04:26 +10002490 self.assertEqual(self.ipv6_interface.with_netmask,
2491 '2001:658:22a:cafe:200::1/ffff:ffff:ffff:ffff::')
Nick Coghlandc9b2552012-05-20 21:01:57 +10002492 # this probably don't make much sense, but it's included for
2493 # compatibility with ipv4
Nick Coghlana8517ad2012-08-20 10:04:26 +10002494 self.assertEqual(self.ipv6_interface.with_hostmask,
Nick Coghlandc9b2552012-05-20 21:01:57 +10002495 '2001:658:22a:cafe:200::1/::ffff:ffff:ffff:ffff')
2496
2497 def testNetworkElementCaching(self):
2498 # V4 - make sure we're empty
Inada Naoki2430d532019-04-15 16:01:00 +09002499 self.assertNotIn('broadcast_address', self.ipv4_network.__dict__)
2500 self.assertNotIn('hostmask', self.ipv4_network.__dict__)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002501
2502 # V4 - populate and test
Nick Coghlandc9b2552012-05-20 21:01:57 +10002503 self.assertEqual(self.ipv4_network.broadcast_address,
2504 ipaddress.IPv4Address('1.2.3.255'))
2505 self.assertEqual(self.ipv4_network.hostmask,
2506 ipaddress.IPv4Address('0.0.0.255'))
2507
2508 # V4 - check we're cached
Inada Naoki2430d532019-04-15 16:01:00 +09002509 self.assertIn('broadcast_address', self.ipv4_network.__dict__)
2510 self.assertIn('hostmask', self.ipv4_network.__dict__)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002511
2512 # V6 - make sure we're empty
Inada Naoki2430d532019-04-15 16:01:00 +09002513 self.assertNotIn('broadcast_address', self.ipv6_network.__dict__)
2514 self.assertNotIn('hostmask', self.ipv6_network.__dict__)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002515
2516 # V6 - populate and test
2517 self.assertEqual(self.ipv6_network.network_address,
2518 ipaddress.IPv6Address('2001:658:22a:cafe::'))
2519 self.assertEqual(self.ipv6_interface.network.network_address,
2520 ipaddress.IPv6Address('2001:658:22a:cafe::'))
2521
2522 self.assertEqual(
2523 self.ipv6_network.broadcast_address,
2524 ipaddress.IPv6Address('2001:658:22a:cafe:ffff:ffff:ffff:ffff'))
2525 self.assertEqual(self.ipv6_network.hostmask,
2526 ipaddress.IPv6Address('::ffff:ffff:ffff:ffff'))
2527 self.assertEqual(
2528 self.ipv6_interface.network.broadcast_address,
2529 ipaddress.IPv6Address('2001:658:22a:cafe:ffff:ffff:ffff:ffff'))
2530 self.assertEqual(self.ipv6_interface.network.hostmask,
2531 ipaddress.IPv6Address('::ffff:ffff:ffff:ffff'))
2532
2533 # V6 - check we're cached
Inada Naoki2430d532019-04-15 16:01:00 +09002534 self.assertIn('broadcast_address', self.ipv6_network.__dict__)
2535 self.assertIn('hostmask', self.ipv6_network.__dict__)
2536 self.assertIn('broadcast_address', self.ipv6_interface.network.__dict__)
2537 self.assertIn('hostmask', self.ipv6_interface.network.__dict__)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002538
2539 def testTeredo(self):
2540 # stolen from wikipedia
2541 server = ipaddress.IPv4Address('65.54.227.120')
2542 client = ipaddress.IPv4Address('192.0.2.45')
2543 teredo_addr = '2001:0000:4136:e378:8000:63bf:3fff:fdd2'
2544 self.assertEqual((server, client),
2545 ipaddress.ip_address(teredo_addr).teredo)
2546 bad_addr = '2000::4136:e378:8000:63bf:3fff:fdd2'
2547 self.assertFalse(ipaddress.ip_address(bad_addr).teredo)
2548 bad_addr = '2001:0001:4136:e378:8000:63bf:3fff:fdd2'
2549 self.assertFalse(ipaddress.ip_address(bad_addr).teredo)
2550
2551 # i77
2552 teredo_addr = ipaddress.IPv6Address('2001:0:5ef5:79fd:0:59d:a0e5:ba1')
2553 self.assertEqual((ipaddress.IPv4Address('94.245.121.253'),
2554 ipaddress.IPv4Address('95.26.244.94')),
2555 teredo_addr.teredo)
2556
Nick Coghlandc9b2552012-05-20 21:01:57 +10002557 def testsixtofour(self):
2558 sixtofouraddr = ipaddress.ip_address('2002:ac1d:2d64::1')
2559 bad_addr = ipaddress.ip_address('2000:ac1d:2d64::1')
2560 self.assertEqual(ipaddress.IPv4Address('172.29.45.100'),
2561 sixtofouraddr.sixtofour)
2562 self.assertFalse(bad_addr.sixtofour)
2563
Ravi Teja Pb30ee262020-06-29 23:09:29 +05302564 # issue41004 Hash collisions in IPv4Interface and IPv6Interface
2565 def testV4HashIsNotConstant(self):
2566 ipv4_address1 = ipaddress.IPv4Interface("1.2.3.4")
2567 ipv4_address2 = ipaddress.IPv4Interface("2.3.4.5")
2568 self.assertNotEqual(ipv4_address1.__hash__(), ipv4_address2.__hash__())
2569
2570 # issue41004 Hash collisions in IPv4Interface and IPv6Interface
2571 def testV6HashIsNotConstant(self):
2572 ipv6_address1 = ipaddress.IPv6Interface("2001:658:22a:cafe:200:0:0:1")
2573 ipv6_address2 = ipaddress.IPv6Interface("2001:658:22a:cafe:200:0:0:2")
2574 self.assertNotEqual(ipv6_address1.__hash__(), ipv6_address2.__hash__())
2575
Nick Coghlandc9b2552012-05-20 21:01:57 +10002576
2577if __name__ == '__main__':
2578 unittest.main()