blob: bbb3fc89da653355a7d607eda2dc77cd1b707798 [file] [log] [blame]
Nick Coghlandc9b2552012-05-20 21:01:57 +10001# Copyright 2007 Google Inc.
2# Licensed to PSF under a Contributor Agreement.
Nick Coghlandc9b2552012-05-20 21:01:57 +10003
Nick Coghlanaff73f92012-05-27 00:57:25 +10004"""Unittest for ipaddress module."""
Nick Coghlandc9b2552012-05-20 21:01:57 +10005
6
7import unittest
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10008import re
9import contextlib
Serhiy Storchakaf186e122015-01-26 10:11:16 +020010import functools
Nick Coghlane0c3f5e2012-08-05 18:20:17 +100011import operator
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +020012import pickle
Nick Coghlandc9b2552012-05-20 21:01:57 +100013import ipaddress
Serhiy Storchaka88f64f32015-03-07 20:08:34 +020014import weakref
Serhiy Storchaka17e52642019-08-04 12:38:46 +030015from test.support import LARGEST, SMALLEST
Nick Coghlandc9b2552012-05-20 21:01:57 +100016
R David Murray75678652014-10-12 15:17:22 -040017
Nick Coghlan07c4e332012-07-08 23:06:45 +100018class BaseTestCase(unittest.TestCase):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +100019 # One big change in ipaddress over the original ipaddr module is
20 # error reporting that tries to assume users *don't know the rules*
21 # for what constitutes an RFC compliant IP address
22
Nick Coghlan07c4e332012-07-08 23:06:45 +100023 # Ensuring these errors are emitted correctly in all relevant cases
24 # meant moving to a more systematic test structure that allows the
25 # test structure to map more directly to the module structure
26
Nick Coghlan36f8dcd2012-07-07 19:23:53 +100027 # Note that if the constructors are refactored so that addresses with
28 # multiple problems get classified differently, that's OK - just
29 # move the affected examples to the newly appropriate test case.
30
Nick Coghlan07c4e332012-07-08 23:06:45 +100031 # There is some duplication between the original relatively ad hoc
32 # test suite and the new systematic tests. While some redundancy in
33 # testing is considered preferable to accidentally deleting a valid
34 # test, the original test suite will likely be reduced over time as
35 # redundant tests are identified.
Nick Coghlan36f8dcd2012-07-07 19:23:53 +100036
Nick Coghlan297b1432012-07-08 17:11:04 +100037 @property
38 def factory(self):
39 raise NotImplementedError
40
Nick Coghlan36f8dcd2012-07-07 19:23:53 +100041 @contextlib.contextmanager
42 def assertCleanError(self, exc_type, details, *args):
43 """
44 Ensure exception does not display a context by default
45
46 Wraps unittest.TestCase.assertRaisesRegex
47 """
48 if args:
49 details = details % args
50 cm = self.assertRaisesRegex(exc_type, details)
51 with cm as exc:
52 yield exc
53 # Ensure we produce clean tracebacks on failure
54 if exc.exception.__context__ is not None:
55 self.assertTrue(exc.exception.__suppress_context__)
56
57 def assertAddressError(self, details, *args):
58 """Ensure a clean AddressValueError"""
59 return self.assertCleanError(ipaddress.AddressValueError,
R David Murray75678652014-10-12 15:17:22 -040060 details, *args)
Nick Coghlan36f8dcd2012-07-07 19:23:53 +100061
62 def assertNetmaskError(self, details, *args):
63 """Ensure a clean NetmaskValueError"""
64 return self.assertCleanError(ipaddress.NetmaskValueError,
R David Murray75678652014-10-12 15:17:22 -040065 details, *args)
Nick Coghlan36f8dcd2012-07-07 19:23:53 +100066
Nick Coghlan07c4e332012-07-08 23:06:45 +100067 def assertInstancesEqual(self, lhs, rhs):
68 """Check constructor arguments produce equivalent instances"""
69 self.assertEqual(self.factory(lhs), self.factory(rhs))
70
R David Murray75678652014-10-12 15:17:22 -040071
Nick Coghlan07c4e332012-07-08 23:06:45 +100072class CommonTestMixin:
Nick Coghlan36f8dcd2012-07-07 19:23:53 +100073
74 def test_empty_address(self):
75 with self.assertAddressError("Address cannot be empty"):
Nick Coghlan297b1432012-07-08 17:11:04 +100076 self.factory("")
77
78 def test_floats_rejected(self):
79 with self.assertAddressError(re.escape(repr("1.0"))):
80 self.factory(1.0)
81
Nick Coghlane0c3f5e2012-08-05 18:20:17 +100082 def test_not_an_index_issue15559(self):
83 # Implementing __index__ makes for a very nasty interaction with the
84 # bytes constructor. Thus, we disallow implicit use as an integer
85 self.assertRaises(TypeError, operator.index, self.factory(1))
86 self.assertRaises(TypeError, hex, self.factory(1))
87 self.assertRaises(TypeError, bytes, self.factory(1))
88
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +020089 def pickle_test(self, addr):
90 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
91 with self.subTest(proto=proto):
92 x = self.factory(addr)
93 y = pickle.loads(pickle.dumps(x, proto))
94 self.assertEqual(y, x)
95
Joel Croteaue653d4d2019-03-30 07:53:48 -070096
Nick Coghlan07c4e332012-07-08 23:06:45 +100097class CommonTestMixin_v4(CommonTestMixin):
98
99 def test_leading_zeros(self):
100 self.assertInstancesEqual("000.000.000.000", "0.0.0.0")
101 self.assertInstancesEqual("192.168.000.001", "192.168.0.1")
Joel Croteaue653d4d2019-03-30 07:53:48 -0700102 self.assertInstancesEqual("016.016.016.016", "16.16.16.16")
103 self.assertInstancesEqual("001.000.008.016", "1.0.8.16")
Nick Coghlan07c4e332012-07-08 23:06:45 +1000104
105 def test_int(self):
106 self.assertInstancesEqual(0, "0.0.0.0")
107 self.assertInstancesEqual(3232235521, "192.168.0.1")
108
109 def test_packed(self):
110 self.assertInstancesEqual(bytes.fromhex("00000000"), "0.0.0.0")
111 self.assertInstancesEqual(bytes.fromhex("c0a80001"), "192.168.0.1")
Nick Coghlan297b1432012-07-08 17:11:04 +1000112
113 def test_negative_ints_rejected(self):
114 msg = "-1 (< 0) is not permitted as an IPv4 address"
115 with self.assertAddressError(re.escape(msg)):
116 self.factory(-1)
117
118 def test_large_ints_rejected(self):
119 msg = "%d (>= 2**32) is not permitted as an IPv4 address"
120 with self.assertAddressError(re.escape(msg % 2**32)):
121 self.factory(2**32)
122
123 def test_bad_packed_length(self):
124 def assertBadLength(length):
Serhiy Storchaka5f1a5182016-09-11 14:41:02 +0300125 addr = b'\0' * length
Nick Coghlan297b1432012-07-08 17:11:04 +1000126 msg = "%r (len %d != 4) is not permitted as an IPv4 address"
127 with self.assertAddressError(re.escape(msg % (addr, length))):
128 self.factory(addr)
129
130 assertBadLength(3)
131 assertBadLength(5)
132
R David Murray75678652014-10-12 15:17:22 -0400133
Nick Coghlan07c4e332012-07-08 23:06:45 +1000134class CommonTestMixin_v6(CommonTestMixin):
135
136 def test_leading_zeros(self):
137 self.assertInstancesEqual("0000::0000", "::")
138 self.assertInstancesEqual("000::c0a8:0001", "::c0a8:1")
139
140 def test_int(self):
141 self.assertInstancesEqual(0, "::")
142 self.assertInstancesEqual(3232235521, "::c0a8:1")
143
144 def test_packed(self):
Serhiy Storchaka5f1a5182016-09-11 14:41:02 +0300145 addr = b'\0'*12 + bytes.fromhex("00000000")
Nick Coghlan07c4e332012-07-08 23:06:45 +1000146 self.assertInstancesEqual(addr, "::")
Serhiy Storchaka5f1a5182016-09-11 14:41:02 +0300147 addr = b'\0'*12 + bytes.fromhex("c0a80001")
Nick Coghlan07c4e332012-07-08 23:06:45 +1000148 self.assertInstancesEqual(addr, "::c0a8:1")
Serhiy Storchaka5f1a5182016-09-11 14:41:02 +0300149 addr = bytes.fromhex("c0a80001") + b'\0'*12
Nick Coghlan07c4e332012-07-08 23:06:45 +1000150 self.assertInstancesEqual(addr, "c0a8:1::")
Nick Coghlan297b1432012-07-08 17:11:04 +1000151
152 def test_negative_ints_rejected(self):
153 msg = "-1 (< 0) is not permitted as an IPv6 address"
154 with self.assertAddressError(re.escape(msg)):
155 self.factory(-1)
156
157 def test_large_ints_rejected(self):
158 msg = "%d (>= 2**128) is not permitted as an IPv6 address"
159 with self.assertAddressError(re.escape(msg % 2**128)):
160 self.factory(2**128)
161
162 def test_bad_packed_length(self):
163 def assertBadLength(length):
Serhiy Storchaka5f1a5182016-09-11 14:41:02 +0300164 addr = b'\0' * length
Nick Coghlan297b1432012-07-08 17:11:04 +1000165 msg = "%r (len %d != 16) is not permitted as an IPv6 address"
166 with self.assertAddressError(re.escape(msg % (addr, length))):
167 self.factory(addr)
168 self.factory(addr)
169
170 assertBadLength(15)
171 assertBadLength(17)
172
opavlyuk21da76d2020-02-26 16:33:57 +0200173 def test_blank_scope_id(self):
174 address = ('::1%')
175 with self.assertAddressError('Invalid IPv6 address: "%r"', address):
176 self.factory(address)
177
178 def test_invalid_scope_id_with_percent(self):
179 address = ('::1%scope%')
180 with self.assertAddressError('Invalid IPv6 address: "%r"', address):
181 self.factory(address)
Nick Coghlan297b1432012-07-08 17:11:04 +1000182
Nick Coghlan07c4e332012-07-08 23:06:45 +1000183class AddressTestCase_v4(BaseTestCase, CommonTestMixin_v4):
Nick Coghlan297b1432012-07-08 17:11:04 +1000184 factory = ipaddress.IPv4Address
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000185
ewosbornef9c95a42019-09-12 05:03:31 -0400186 def test_format(self):
187 v4 = ipaddress.IPv4Address("1.2.3.42")
188 v4_pairs = [
189 ("b" ,"00000001000000100000001100101010"),
190 ("n" ,"00000001000000100000001100101010"),
191 ("x" ,"0102032a"),
192 ("X" ,"0102032A"),
193 ("_b" ,"0000_0001_0000_0010_0000_0011_0010_1010"),
194 ("_n" ,"0000_0001_0000_0010_0000_0011_0010_1010"),
195 ("_x" ,"0102_032a"),
196 ("_X" ,"0102_032A"),
197 ("#b" ,"0b00000001000000100000001100101010"),
198 ("#n" ,"0b00000001000000100000001100101010"),
199 ("#x" ,"0x0102032a"),
200 ("#X" ,"0X0102032A"),
201 ("#_b" ,"0b0000_0001_0000_0010_0000_0011_0010_1010"),
202 ("#_n" ,"0b0000_0001_0000_0010_0000_0011_0010_1010"),
203 ("#_x" ,"0x0102_032a"),
204 ("#_X" ,"0X0102_032A"),
205 ("s" ,"1.2.3.42"),
206 ("" ,"1.2.3.42"),
207 ]
208 for (fmt, txt) in v4_pairs:
209 self.assertEqual(txt, format(v4, fmt))
210
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000211 def test_network_passed_as_address(self):
212 addr = "127.0.0.1/24"
213 with self.assertAddressError("Unexpected '/' in %r", addr):
214 ipaddress.IPv4Address(addr)
215
216 def test_bad_address_split(self):
217 def assertBadSplit(addr):
218 with self.assertAddressError("Expected 4 octets in %r", addr):
219 ipaddress.IPv4Address(addr)
220
221 assertBadSplit("127.0.1")
222 assertBadSplit("42.42.42.42.42")
223 assertBadSplit("42.42.42")
224 assertBadSplit("42.42")
225 assertBadSplit("42")
226 assertBadSplit("42..42.42.42")
227 assertBadSplit("42.42.42.42.")
228 assertBadSplit("42.42.42.42...")
229 assertBadSplit(".42.42.42.42")
230 assertBadSplit("...42.42.42.42")
231 assertBadSplit("016.016.016")
232 assertBadSplit("016.016")
233 assertBadSplit("016")
234 assertBadSplit("000")
235 assertBadSplit("0x0a.0x0a.0x0a")
236 assertBadSplit("0x0a.0x0a")
237 assertBadSplit("0x0a")
238 assertBadSplit(".")
239 assertBadSplit("bogus")
240 assertBadSplit("bogus.com")
241 assertBadSplit("1000")
242 assertBadSplit("1000000000000000")
243 assertBadSplit("192.168.0.1.com")
244
245 def test_empty_octet(self):
246 def assertBadOctet(addr):
247 with self.assertAddressError("Empty octet not permitted in %r",
R David Murray75678652014-10-12 15:17:22 -0400248 addr):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000249 ipaddress.IPv4Address(addr)
250
251 assertBadOctet("42..42.42")
252 assertBadOctet("...")
253
254 def test_invalid_characters(self):
255 def assertBadOctet(addr, octet):
256 msg = "Only decimal digits permitted in %r in %r" % (octet, addr)
257 with self.assertAddressError(re.escape(msg)):
258 ipaddress.IPv4Address(addr)
259
260 assertBadOctet("0x0a.0x0a.0x0a.0x0a", "0x0a")
Nick Coghlan07c4e332012-07-08 23:06:45 +1000261 assertBadOctet("0xa.0x0a.0x0a.0x0a", "0xa")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000262 assertBadOctet("42.42.42.-0", "-0")
263 assertBadOctet("42.42.42.+0", "+0")
264 assertBadOctet("42.42.42.-42", "-42")
265 assertBadOctet("+1.+2.+3.4", "+1")
266 assertBadOctet("1.2.3.4e0", "4e0")
267 assertBadOctet("1.2.3.4::", "4::")
268 assertBadOctet("1.a.2.3", "a")
269
Nick Coghlan07c4e332012-07-08 23:06:45 +1000270 def test_octet_length(self):
271 def assertBadOctet(addr, octet):
272 msg = "At most 3 characters permitted in %r in %r"
273 with self.assertAddressError(re.escape(msg % (octet, addr))):
274 ipaddress.IPv4Address(addr)
275
276 assertBadOctet("0000.000.000.000", "0000")
277 assertBadOctet("12345.67899.-54321.-98765", "12345")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000278
279 def test_octet_limit(self):
280 def assertBadOctet(addr, octet):
Nick Coghlanb582ecc2012-07-07 22:15:22 +1000281 msg = "Octet %d (> 255) not permitted in %r" % (octet, addr)
282 with self.assertAddressError(re.escape(msg)):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000283 ipaddress.IPv4Address(addr)
284
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000285 assertBadOctet("257.0.0.0", 257)
Nick Coghlan07c4e332012-07-08 23:06:45 +1000286 assertBadOctet("192.168.0.999", 999)
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000287
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +0200288 def test_pickle(self):
289 self.pickle_test('192.0.2.1')
290
Serhiy Storchaka88f64f32015-03-07 20:08:34 +0200291 def test_weakref(self):
292 weakref.ref(self.factory('192.0.2.1'))
293
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000294
Nick Coghlan07c4e332012-07-08 23:06:45 +1000295class AddressTestCase_v6(BaseTestCase, CommonTestMixin_v6):
Nick Coghlan297b1432012-07-08 17:11:04 +1000296 factory = ipaddress.IPv6Address
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000297
ewosbornef9c95a42019-09-12 05:03:31 -0400298 def test_format(self):
299
300 v6 = ipaddress.IPv6Address("::1.2.3.42")
301 v6_pairs = [
302 ("b",
303 "000000000000000000000000000000000000000000000000000000"
304 "000000000000000000000000000000000000000000000000010000"
305 "00100000001100101010"),
306 ("n", "0000000000000000000000000102032a"),
307 ("x", "0000000000000000000000000102032a"),
308 ("X", "0000000000000000000000000102032A"),
309 ("_b",
310 "0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000"
311 "_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000"
312 "_0000_0000_0000_0000_0001_0000_0010_0000_0011_0010"
313 "_1010"),
314 ("_n", "0000_0000_0000_0000_0000_0000_0102_032a"),
315 ("_x", "0000_0000_0000_0000_0000_0000_0102_032a"),
316 ("_X", "0000_0000_0000_0000_0000_0000_0102_032A"),
317 ("#b",
318 "0b0000000000000000000000000000000000000000000000000000"
319 "000000000000000000000000000000000000000000000000000100"
320 "0000100000001100101010"),
321 ("#n", "0x0000000000000000000000000102032a"),
322 ("#x", "0x0000000000000000000000000102032a"),
323 ("#X", "0X0000000000000000000000000102032A"),
324 ("#_b",
325 "0b0000_0000_0000_0000_0000_0000_0000_0000_0000_0000"
326 "_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000"
327 "_0000_0000_0000_0000_0000_0001_0000_0010_0000_0011"
328 "_0010_1010"),
329 ("#_n", "0x0000_0000_0000_0000_0000_0000_0102_032a"),
330 ("#_x", "0x0000_0000_0000_0000_0000_0000_0102_032a"),
331 ("#_X", "0X0000_0000_0000_0000_0000_0000_0102_032A"),
332 ("s", "::102:32a"),
333 ("", "::102:32a"),
334 ]
335
336 for (fmt, txt) in v6_pairs:
337 self.assertEqual(txt, format(v6, fmt))
338
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000339 def test_network_passed_as_address(self):
opavlyuk21da76d2020-02-26 16:33:57 +0200340 def assertBadSplit(addr):
341 msg = "Unexpected '/' in %r"
342 with self.assertAddressError(msg, addr):
343 ipaddress.IPv6Address(addr)
344 assertBadSplit("::1/24")
345 assertBadSplit("::1%scope_id/24")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000346
347 def test_bad_address_split_v6_not_enough_parts(self):
348 def assertBadSplit(addr):
349 msg = "At least 3 parts expected in %r"
opavlyuk21da76d2020-02-26 16:33:57 +0200350 with self.assertAddressError(msg, addr.split('%')[0]):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000351 ipaddress.IPv6Address(addr)
352
353 assertBadSplit(":")
354 assertBadSplit(":1")
355 assertBadSplit("FEDC:9878")
opavlyuk21da76d2020-02-26 16:33:57 +0200356 assertBadSplit(":%scope")
357 assertBadSplit(":1%scope")
358 assertBadSplit("FEDC:9878%scope")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000359
360 def test_bad_address_split_v6_too_many_colons(self):
361 def assertBadSplit(addr):
362 msg = "At most 8 colons permitted in %r"
opavlyuk21da76d2020-02-26 16:33:57 +0200363 with self.assertAddressError(msg, addr.split('%')[0]):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000364 ipaddress.IPv6Address(addr)
365
366 assertBadSplit("9:8:7:6:5:4:3::2:1")
367 assertBadSplit("10:9:8:7:6:5:4:3:2:1")
368 assertBadSplit("::8:7:6:5:4:3:2:1")
369 assertBadSplit("8:7:6:5:4:3:2:1::")
370 # A trailing IPv4 address is two parts
371 assertBadSplit("10:9:8:7:6:5:4:3:42.42.42.42")
372
opavlyuk21da76d2020-02-26 16:33:57 +0200373 assertBadSplit("9:8:7:6:5:4:3::2:1%scope")
374 assertBadSplit("10:9:8:7:6:5:4:3:2:1%scope")
375 assertBadSplit("::8:7:6:5:4:3:2:1%scope")
376 assertBadSplit("8:7:6:5:4:3:2:1::%scope")
377 # A trailing IPv4 address is two parts
378 assertBadSplit("10:9:8:7:6:5:4:3:42.42.42.42%scope")
379
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000380 def test_bad_address_split_v6_too_many_parts(self):
381 def assertBadSplit(addr):
382 msg = "Exactly 8 parts expected without '::' in %r"
opavlyuk21da76d2020-02-26 16:33:57 +0200383 with self.assertAddressError(msg, addr.split('%')[0]):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000384 ipaddress.IPv6Address(addr)
385
386 assertBadSplit("3ffe:0:0:0:0:0:0:0:1")
387 assertBadSplit("9:8:7:6:5:4:3:2:1")
388 assertBadSplit("7:6:5:4:3:2:1")
389 # A trailing IPv4 address is two parts
390 assertBadSplit("9:8:7:6:5:4:3:42.42.42.42")
391 assertBadSplit("7:6:5:4:3:42.42.42.42")
392
opavlyuk21da76d2020-02-26 16:33:57 +0200393 assertBadSplit("3ffe:0:0:0:0:0:0:0:1%scope")
394 assertBadSplit("9:8:7:6:5:4:3:2:1%scope")
395 assertBadSplit("7:6:5:4:3:2:1%scope")
396 # A trailing IPv4 address is two parts
397 assertBadSplit("9:8:7:6:5:4:3:42.42.42.42%scope")
398 assertBadSplit("7:6:5:4:3:42.42.42.42%scope")
399
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000400 def test_bad_address_split_v6_too_many_parts_with_double_colon(self):
401 def assertBadSplit(addr):
402 msg = "Expected at most 7 other parts with '::' in %r"
opavlyuk21da76d2020-02-26 16:33:57 +0200403 with self.assertAddressError(msg, addr.split('%')[0]):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000404 ipaddress.IPv6Address(addr)
405
406 assertBadSplit("1:2:3:4::5:6:7:8")
opavlyuk21da76d2020-02-26 16:33:57 +0200407 assertBadSplit("1:2:3:4::5:6:7:8%scope")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000408
409 def test_bad_address_split_v6_repeated_double_colon(self):
410 def assertBadSplit(addr):
411 msg = "At most one '::' permitted in %r"
opavlyuk21da76d2020-02-26 16:33:57 +0200412 with self.assertAddressError(msg, addr.split('%')[0]):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000413 ipaddress.IPv6Address(addr)
414
415 assertBadSplit("3ffe::1::1")
416 assertBadSplit("1::2::3::4:5")
417 assertBadSplit("2001::db:::1")
418 assertBadSplit("3ffe::1::")
419 assertBadSplit("::3ffe::1")
420 assertBadSplit(":3ffe::1::1")
421 assertBadSplit("3ffe::1::1:")
422 assertBadSplit(":3ffe::1::1:")
423 assertBadSplit(":::")
424 assertBadSplit('2001:db8:::1')
425
opavlyuk21da76d2020-02-26 16:33:57 +0200426 assertBadSplit("3ffe::1::1%scope")
427 assertBadSplit("1::2::3::4:5%scope")
428 assertBadSplit("2001::db:::1%scope")
429 assertBadSplit("3ffe::1::%scope")
430 assertBadSplit("::3ffe::1%scope")
431 assertBadSplit(":3ffe::1::1%scope")
432 assertBadSplit("3ffe::1::1:%scope")
433 assertBadSplit(":3ffe::1::1:%scope")
434 assertBadSplit(":::%scope")
435 assertBadSplit('2001:db8:::1%scope')
436
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000437 def test_bad_address_split_v6_leading_colon(self):
438 def assertBadSplit(addr):
439 msg = "Leading ':' only permitted as part of '::' in %r"
opavlyuk21da76d2020-02-26 16:33:57 +0200440 with self.assertAddressError(msg, addr.split('%')[0]):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000441 ipaddress.IPv6Address(addr)
442
443 assertBadSplit(":2001:db8::1")
444 assertBadSplit(":1:2:3:4:5:6:7")
445 assertBadSplit(":1:2:3:4:5:6:")
446 assertBadSplit(":6:5:4:3:2:1::")
447
opavlyuk21da76d2020-02-26 16:33:57 +0200448 assertBadSplit(":2001:db8::1%scope")
449 assertBadSplit(":1:2:3:4:5:6:7%scope")
450 assertBadSplit(":1:2:3:4:5:6:%scope")
451 assertBadSplit(":6:5:4:3:2:1::%scope")
452
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000453 def test_bad_address_split_v6_trailing_colon(self):
454 def assertBadSplit(addr):
455 msg = "Trailing ':' only permitted as part of '::' in %r"
opavlyuk21da76d2020-02-26 16:33:57 +0200456 with self.assertAddressError(msg, addr.split('%')[0]):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000457 ipaddress.IPv6Address(addr)
458
459 assertBadSplit("2001:db8::1:")
460 assertBadSplit("1:2:3:4:5:6:7:")
461 assertBadSplit("::1.2.3.4:")
462 assertBadSplit("::7:6:5:4:3:2:")
463
opavlyuk21da76d2020-02-26 16:33:57 +0200464 assertBadSplit("2001:db8::1:%scope")
465 assertBadSplit("1:2:3:4:5:6:7:%scope")
466 assertBadSplit("::1.2.3.4:%scope")
467 assertBadSplit("::7:6:5:4:3:2:%scope")
468
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000469 def test_bad_v4_part_in(self):
470 def assertBadAddressPart(addr, v4_error):
opavlyuk21da76d2020-02-26 16:33:57 +0200471 with self.assertAddressError("%s in %r", v4_error, addr.split('%')[0]):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000472 ipaddress.IPv6Address(addr)
473
474 assertBadAddressPart("3ffe::1.net", "Expected 4 octets in '1.net'")
475 assertBadAddressPart("3ffe::127.0.1",
476 "Expected 4 octets in '127.0.1'")
477 assertBadAddressPart("::1.2.3",
478 "Expected 4 octets in '1.2.3'")
479 assertBadAddressPart("::1.2.3.4.5",
480 "Expected 4 octets in '1.2.3.4.5'")
481 assertBadAddressPart("3ffe::1.1.1.net",
482 "Only decimal digits permitted in 'net' "
483 "in '1.1.1.net'")
484
opavlyuk21da76d2020-02-26 16:33:57 +0200485 assertBadAddressPart("3ffe::1.net%scope", "Expected 4 octets in '1.net'")
486 assertBadAddressPart("3ffe::127.0.1%scope",
487 "Expected 4 octets in '127.0.1'")
488 assertBadAddressPart("::1.2.3%scope",
489 "Expected 4 octets in '1.2.3'")
490 assertBadAddressPart("::1.2.3.4.5%scope",
491 "Expected 4 octets in '1.2.3.4.5'")
492 assertBadAddressPart("3ffe::1.1.1.net%scope",
493 "Only decimal digits permitted in 'net' "
494 "in '1.1.1.net'")
495
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000496 def test_invalid_characters(self):
497 def assertBadPart(addr, part):
opavlyuk21da76d2020-02-26 16:33:57 +0200498 msg = "Only hex digits permitted in %r in %r" % (part, addr.split('%')[0])
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000499 with self.assertAddressError(re.escape(msg)):
500 ipaddress.IPv6Address(addr)
501
502 assertBadPart("3ffe::goog", "goog")
503 assertBadPart("3ffe::-0", "-0")
504 assertBadPart("3ffe::+0", "+0")
505 assertBadPart("3ffe::-1", "-1")
506 assertBadPart("1.2.3.4::", "1.2.3.4")
507 assertBadPart('1234:axy::b', "axy")
508
opavlyuk21da76d2020-02-26 16:33:57 +0200509 assertBadPart("3ffe::goog%scope", "goog")
510 assertBadPart("3ffe::-0%scope", "-0")
511 assertBadPart("3ffe::+0%scope", "+0")
512 assertBadPart("3ffe::-1%scope", "-1")
513 assertBadPart("1.2.3.4::%scope", "1.2.3.4")
514 assertBadPart('1234:axy::b%scope', "axy")
515
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000516 def test_part_length(self):
517 def assertBadPart(addr, part):
518 msg = "At most 4 characters permitted in %r in %r"
opavlyuk21da76d2020-02-26 16:33:57 +0200519 with self.assertAddressError(msg, part, addr.split('%')[0]):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000520 ipaddress.IPv6Address(addr)
521
Nick Coghlan07c4e332012-07-08 23:06:45 +1000522 assertBadPart("::00000", "00000")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000523 assertBadPart("3ffe::10000", "10000")
524 assertBadPart("02001:db8::", "02001")
525 assertBadPart('2001:888888::1', "888888")
526
opavlyuk21da76d2020-02-26 16:33:57 +0200527 assertBadPart("::00000%scope", "00000")
528 assertBadPart("3ffe::10000%scope", "10000")
529 assertBadPart("02001:db8::%scope", "02001")
530 assertBadPart('2001:888888::1%scope', "888888")
531
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +0200532 def test_pickle(self):
533 self.pickle_test('2001:db8::')
534
Serhiy Storchaka88f64f32015-03-07 20:08:34 +0200535 def test_weakref(self):
536 weakref.ref(self.factory('2001:db8::'))
opavlyuk21da76d2020-02-26 16:33:57 +0200537 weakref.ref(self.factory('2001:db8::%scope'))
Serhiy Storchaka88f64f32015-03-07 20:08:34 +0200538
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000539
Nick Coghlan07c4e332012-07-08 23:06:45 +1000540class NetmaskTestMixin_v4(CommonTestMixin_v4):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000541 """Input validation on interfaces and networks is very similar"""
542
Cheryl Sabella5609b782018-03-20 20:09:15 -0400543 def test_no_mask(self):
Inada Naoki6fa84bd2019-04-16 08:32:28 +0900544 for address in ('1.2.3.4', 0x01020304, b'\x01\x02\x03\x04'):
545 net = self.factory(address)
546 self.assertEqual(str(net), '1.2.3.4/32')
547 self.assertEqual(str(net.netmask), '255.255.255.255')
548 self.assertEqual(str(net.hostmask), '0.0.0.0')
549 # IPv4Network has prefixlen, but IPv4Interface doesn't.
550 # Should we add it to IPv4Interface too? (bpo-36392)
Cheryl Sabella5609b782018-03-20 20:09:15 -0400551
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000552 def test_split_netmask(self):
553 addr = "1.2.3.4/32/24"
554 with self.assertAddressError("Only one '/' permitted in %r" % addr):
555 self.factory(addr)
556
557 def test_address_errors(self):
558 def assertBadAddress(addr, details):
559 with self.assertAddressError(details):
560 self.factory(addr)
561
Nick Coghlan297b1432012-07-08 17:11:04 +1000562 assertBadAddress("/", "Address cannot be empty")
563 assertBadAddress("/8", "Address cannot be empty")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000564 assertBadAddress("bogus", "Expected 4 octets")
565 assertBadAddress("google.com", "Expected 4 octets")
566 assertBadAddress("10/8", "Expected 4 octets")
567 assertBadAddress("::1.2.3.4", "Only decimal digits")
Nick Coghlanb582ecc2012-07-07 22:15:22 +1000568 assertBadAddress("1.2.3.256", re.escape("256 (> 255)"))
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000569
Nick Coghlan932346f2014-02-08 23:17:36 +1000570 def test_valid_netmask(self):
571 self.assertEqual(str(self.factory('192.0.2.0/255.255.255.0')),
572 '192.0.2.0/24')
573 for i in range(0, 33):
574 # Generate and re-parse the CIDR format (trivial).
575 net_str = '0.0.0.0/%d' % i
576 net = self.factory(net_str)
577 self.assertEqual(str(net), net_str)
578 # Generate and re-parse the expanded netmask.
579 self.assertEqual(
580 str(self.factory('0.0.0.0/%s' % net.netmask)), net_str)
581 # Zero prefix is treated as decimal.
582 self.assertEqual(str(self.factory('0.0.0.0/0%d' % i)), net_str)
583 # Generate and re-parse the expanded hostmask. The ambiguous
584 # cases (/0 and /32) are treated as netmasks.
585 if i in (32, 0):
586 net_str = '0.0.0.0/%d' % (32 - i)
587 self.assertEqual(
588 str(self.factory('0.0.0.0/%s' % net.hostmask)), net_str)
589
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000590 def test_netmask_errors(self):
591 def assertBadNetmask(addr, netmask):
Nick Coghlan932346f2014-02-08 23:17:36 +1000592 msg = "%r is not a valid netmask" % netmask
593 with self.assertNetmaskError(re.escape(msg)):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000594 self.factory("%s/%s" % (addr, netmask))
595
596 assertBadNetmask("1.2.3.4", "")
Nick Coghlan932346f2014-02-08 23:17:36 +1000597 assertBadNetmask("1.2.3.4", "-1")
598 assertBadNetmask("1.2.3.4", "+1")
599 assertBadNetmask("1.2.3.4", " 1 ")
600 assertBadNetmask("1.2.3.4", "0x1")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000601 assertBadNetmask("1.2.3.4", "33")
602 assertBadNetmask("1.2.3.4", "254.254.255.256")
Nick Coghlan932346f2014-02-08 23:17:36 +1000603 assertBadNetmask("1.2.3.4", "1.a.2.3")
Nick Coghlan07c4e332012-07-08 23:06:45 +1000604 assertBadNetmask("1.1.1.1", "254.xyz.2.3")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000605 assertBadNetmask("1.1.1.1", "240.255.0.0")
Nick Coghlan932346f2014-02-08 23:17:36 +1000606 assertBadNetmask("1.1.1.1", "255.254.128.0")
607 assertBadNetmask("1.1.1.1", "0.1.127.255")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000608 assertBadNetmask("1.1.1.1", "pudding")
Nick Coghlan932346f2014-02-08 23:17:36 +1000609 assertBadNetmask("1.1.1.1", "::")
610
Nicolai Moore5e48e3d2019-05-14 20:32:59 +1000611 def test_netmask_in_tuple_errors(self):
612 def assertBadNetmask(addr, netmask):
613 msg = "%r is not a valid netmask" % netmask
614 with self.assertNetmaskError(re.escape(msg)):
615 self.factory((addr, netmask))
616 assertBadNetmask("1.1.1.1", -1)
617 assertBadNetmask("1.1.1.1", 33)
618
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +0200619 def test_pickle(self):
620 self.pickle_test('192.0.2.0/27')
621 self.pickle_test('192.0.2.0/31') # IPV4LENGTH - 1
622 self.pickle_test('192.0.2.0') # IPV4LENGTH
623
R David Murray75678652014-10-12 15:17:22 -0400624
Serhiy Storchakaa556af72015-01-18 22:56:47 +0200625class InterfaceTestCase_v4(BaseTestCase, NetmaskTestMixin_v4):
626 factory = ipaddress.IPv4Interface
627
628
Nick Coghlan07c4e332012-07-08 23:06:45 +1000629class NetworkTestCase_v4(BaseTestCase, NetmaskTestMixin_v4):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000630 factory = ipaddress.IPv4Network
631
Cheryl Sabella91dc64b2017-10-22 17:39:49 -0400632 def test_subnet_of(self):
633 # containee left of container
634 self.assertFalse(
635 self.factory('10.0.0.0/30').subnet_of(
636 self.factory('10.0.1.0/24')))
637 # containee inside container
638 self.assertTrue(
639 self.factory('10.0.0.0/30').subnet_of(
640 self.factory('10.0.0.0/24')))
641 # containee right of container
642 self.assertFalse(
643 self.factory('10.0.0.0/30').subnet_of(
644 self.factory('10.0.1.0/24')))
645 # containee larger than container
646 self.assertFalse(
647 self.factory('10.0.1.0/24').subnet_of(
648 self.factory('10.0.0.0/30')))
649
650 def test_supernet_of(self):
651 # containee left of container
652 self.assertFalse(
653 self.factory('10.0.0.0/30').supernet_of(
654 self.factory('10.0.1.0/24')))
655 # containee inside container
656 self.assertFalse(
657 self.factory('10.0.0.0/30').supernet_of(
658 self.factory('10.0.0.0/24')))
659 # containee right of container
660 self.assertFalse(
661 self.factory('10.0.0.0/30').supernet_of(
662 self.factory('10.0.1.0/24')))
663 # containee larger than container
664 self.assertTrue(
665 self.factory('10.0.0.0/24').supernet_of(
666 self.factory('10.0.0.0/30')))
667
668 def test_subnet_of_mixed_types(self):
669 with self.assertRaises(TypeError):
670 ipaddress.IPv4Network('10.0.0.0/30').supernet_of(
671 ipaddress.IPv6Network('::1/128'))
672 with self.assertRaises(TypeError):
673 ipaddress.IPv6Network('::1/128').supernet_of(
674 ipaddress.IPv4Network('10.0.0.0/30'))
675 with self.assertRaises(TypeError):
676 ipaddress.IPv4Network('10.0.0.0/30').subnet_of(
677 ipaddress.IPv6Network('::1/128'))
678 with self.assertRaises(TypeError):
679 ipaddress.IPv6Network('::1/128').subnet_of(
680 ipaddress.IPv4Network('10.0.0.0/30'))
681
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000682
Nick Coghlan07c4e332012-07-08 23:06:45 +1000683class NetmaskTestMixin_v6(CommonTestMixin_v6):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000684 """Input validation on interfaces and networks is very similar"""
685
Inada Naoki6fa84bd2019-04-16 08:32:28 +0900686 def test_no_mask(self):
687 for address in ('::1', 1, b'\x00'*15 + b'\x01'):
688 net = self.factory(address)
689 self.assertEqual(str(net), '::1/128')
690 self.assertEqual(str(net.netmask), 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff')
691 self.assertEqual(str(net.hostmask), '::')
692 # IPv6Network has prefixlen, but IPv6Interface doesn't.
693 # Should we add it to IPv4Interface too? (bpo-36392)
694
opavlyuk21da76d2020-02-26 16:33:57 +0200695 scoped_net = self.factory('::1%scope')
696 self.assertEqual(str(scoped_net), '::1%scope/128')
697 self.assertEqual(str(scoped_net.netmask), 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff')
698 self.assertEqual(str(scoped_net.hostmask), '::')
699
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000700 def test_split_netmask(self):
701 addr = "cafe:cafe::/128/190"
702 with self.assertAddressError("Only one '/' permitted in %r" % addr):
703 self.factory(addr)
704
opavlyuk21da76d2020-02-26 16:33:57 +0200705 scoped_addr = "cafe:cafe::%scope/128/190"
706 with self.assertAddressError("Only one '/' permitted in %r" % scoped_addr):
707 self.factory(scoped_addr)
708
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000709 def test_address_errors(self):
710 def assertBadAddress(addr, details):
711 with self.assertAddressError(details):
712 self.factory(addr)
713
Nick Coghlan297b1432012-07-08 17:11:04 +1000714 assertBadAddress("/", "Address cannot be empty")
715 assertBadAddress("/8", "Address cannot be empty")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000716 assertBadAddress("google.com", "At least 3 parts")
717 assertBadAddress("1.2.3.4", "At least 3 parts")
718 assertBadAddress("10/8", "At least 3 parts")
719 assertBadAddress("1234:axy::b", "Only hex digits")
720
opavlyuk21da76d2020-02-26 16:33:57 +0200721 assertBadAddress("/%scope", "Address cannot be empty")
722 assertBadAddress("/%scope8", "Address cannot be empty")
723 assertBadAddress("google.com%scope", "At least 3 parts")
724 assertBadAddress("1.2.3.4%scope", "At least 3 parts")
725 assertBadAddress("10%scope/8", "At least 3 parts")
726 assertBadAddress("1234:axy::b%scope", "Only hex digits")
727
Nick Coghlan932346f2014-02-08 23:17:36 +1000728 def test_valid_netmask(self):
729 # We only support CIDR for IPv6, because expanded netmasks are not
730 # standard notation.
731 self.assertEqual(str(self.factory('2001:db8::/32')), '2001:db8::/32')
732 for i in range(0, 129):
733 # Generate and re-parse the CIDR format (trivial).
734 net_str = '::/%d' % i
735 self.assertEqual(str(self.factory(net_str)), net_str)
736 # Zero prefix is treated as decimal.
737 self.assertEqual(str(self.factory('::/0%d' % i)), net_str)
738
opavlyuk21da76d2020-02-26 16:33:57 +0200739 self.assertEqual(str(self.factory('2001:db8::%scope/32')), '2001:db8::%scope/32')
740 for i in range(0, 129):
741 # Generate and re-parse the CIDR format (trivial).
742 net_str = '::/%d' % i
743 self.assertEqual(str(self.factory(net_str)), net_str)
744 # Zero prefix is treated as decimal.
745 self.assertEqual(str(self.factory('::/0%d' % i)), net_str)
746
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000747 def test_netmask_errors(self):
748 def assertBadNetmask(addr, netmask):
Nick Coghlan932346f2014-02-08 23:17:36 +1000749 msg = "%r is not a valid netmask" % netmask
750 with self.assertNetmaskError(re.escape(msg)):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000751 self.factory("%s/%s" % (addr, netmask))
752
753 assertBadNetmask("::1", "")
754 assertBadNetmask("::1", "::1")
755 assertBadNetmask("::1", "1::")
Nick Coghlan932346f2014-02-08 23:17:36 +1000756 assertBadNetmask("::1", "-1")
757 assertBadNetmask("::1", "+1")
758 assertBadNetmask("::1", " 1 ")
759 assertBadNetmask("::1", "0x1")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000760 assertBadNetmask("::1", "129")
Nick Coghlan932346f2014-02-08 23:17:36 +1000761 assertBadNetmask("::1", "1.2.3.4")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000762 assertBadNetmask("::1", "pudding")
Nick Coghlan932346f2014-02-08 23:17:36 +1000763 assertBadNetmask("::", "::")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000764
opavlyuk21da76d2020-02-26 16:33:57 +0200765 assertBadNetmask("::1%scope", "pudding")
766
Nicolai Moore5e48e3d2019-05-14 20:32:59 +1000767 def test_netmask_in_tuple_errors(self):
768 def assertBadNetmask(addr, netmask):
769 msg = "%r is not a valid netmask" % netmask
770 with self.assertNetmaskError(re.escape(msg)):
771 self.factory((addr, netmask))
772 assertBadNetmask("::1", -1)
773 assertBadNetmask("::1", 129)
opavlyuk21da76d2020-02-26 16:33:57 +0200774 assertBadNetmask("::1%scope", 129)
Nicolai Moore5e48e3d2019-05-14 20:32:59 +1000775
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +0200776 def test_pickle(self):
777 self.pickle_test('2001:db8::1000/124')
778 self.pickle_test('2001:db8::1000/127') # IPV6LENGTH - 1
779 self.pickle_test('2001:db8::1000') # IPV6LENGTH
780
opavlyuk21da76d2020-02-26 16:33:57 +0200781 self.pickle_test('2001:db8::1000%scope') # IPV6LENGTH
782
R David Murray75678652014-10-12 15:17:22 -0400783
Nick Coghlan07c4e332012-07-08 23:06:45 +1000784class InterfaceTestCase_v6(BaseTestCase, NetmaskTestMixin_v6):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000785 factory = ipaddress.IPv6Interface
786
R David Murray75678652014-10-12 15:17:22 -0400787
Nick Coghlan07c4e332012-07-08 23:06:45 +1000788class NetworkTestCase_v6(BaseTestCase, NetmaskTestMixin_v6):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000789 factory = ipaddress.IPv6Network
790
Cheryl Sabella91dc64b2017-10-22 17:39:49 -0400791 def test_subnet_of(self):
792 # containee left of container
793 self.assertFalse(
794 self.factory('2000:999::/56').subnet_of(
795 self.factory('2000:aaa::/48')))
796 # containee inside container
797 self.assertTrue(
798 self.factory('2000:aaa::/56').subnet_of(
799 self.factory('2000:aaa::/48')))
800 # containee right of container
801 self.assertFalse(
802 self.factory('2000:bbb::/56').subnet_of(
803 self.factory('2000:aaa::/48')))
804 # containee larger than container
805 self.assertFalse(
806 self.factory('2000:aaa::/48').subnet_of(
807 self.factory('2000:aaa::/56')))
808
opavlyuk21da76d2020-02-26 16:33:57 +0200809 self.assertFalse(
810 self.factory('2000:999::%scope/56').subnet_of(
811 self.factory('2000:aaa::%scope/48')))
812 self.assertTrue(
813 self.factory('2000:aaa::%scope/56').subnet_of(
814 self.factory('2000:aaa::%scope/48')))
815
Cheryl Sabella91dc64b2017-10-22 17:39:49 -0400816 def test_supernet_of(self):
817 # containee left of container
818 self.assertFalse(
819 self.factory('2000:999::/56').supernet_of(
820 self.factory('2000:aaa::/48')))
821 # containee inside container
822 self.assertFalse(
823 self.factory('2000:aaa::/56').supernet_of(
824 self.factory('2000:aaa::/48')))
825 # containee right of container
826 self.assertFalse(
827 self.factory('2000:bbb::/56').supernet_of(
828 self.factory('2000:aaa::/48')))
829 # containee larger than container
830 self.assertTrue(
831 self.factory('2000:aaa::/48').supernet_of(
832 self.factory('2000:aaa::/56')))
833
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000834
Nick Coghlan07c4e332012-07-08 23:06:45 +1000835class FactoryFunctionErrors(BaseTestCase):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000836
837 def assertFactoryError(self, factory, kind):
838 """Ensure a clean ValueError with the expected message"""
839 addr = "camelot"
840 msg = '%r does not appear to be an IPv4 or IPv6 %s'
841 with self.assertCleanError(ValueError, msg, addr, kind):
842 factory(addr)
843
844 def test_ip_address(self):
845 self.assertFactoryError(ipaddress.ip_address, "address")
846
847 def test_ip_interface(self):
848 self.assertFactoryError(ipaddress.ip_interface, "interface")
849
850 def test_ip_network(self):
851 self.assertFactoryError(ipaddress.ip_network, "network")
852
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200853
Nick Coghlan3008ec02012-07-08 00:45:33 +1000854class ComparisonTests(unittest.TestCase):
855
856 v4addr = ipaddress.IPv4Address(1)
857 v4net = ipaddress.IPv4Network(1)
858 v4intf = ipaddress.IPv4Interface(1)
859 v6addr = ipaddress.IPv6Address(1)
860 v6net = ipaddress.IPv6Network(1)
861 v6intf = ipaddress.IPv6Interface(1)
opavlyuk21da76d2020-02-26 16:33:57 +0200862 v6addr_scoped = ipaddress.IPv6Address('::1%scope')
863 v6net_scoped= ipaddress.IPv6Network('::1%scope')
864 v6intf_scoped= ipaddress.IPv6Interface('::1%scope')
Nick Coghlan3008ec02012-07-08 00:45:33 +1000865
866 v4_addresses = [v4addr, v4intf]
867 v4_objects = v4_addresses + [v4net]
868 v6_addresses = [v6addr, v6intf]
869 v6_objects = v6_addresses + [v6net]
opavlyuk21da76d2020-02-26 16:33:57 +0200870 v6_scoped_addresses = [v6addr_scoped, v6intf_scoped]
871 v6_scoped_objects = v6_scoped_addresses + [v6net_scoped]
R David Murray947ff382016-06-02 15:46:04 -0400872
Nick Coghlan3008ec02012-07-08 00:45:33 +1000873 objects = v4_objects + v6_objects
opavlyuk21da76d2020-02-26 16:33:57 +0200874 objects_with_scoped = objects + v6_scoped_objects
Nick Coghlan3008ec02012-07-08 00:45:33 +1000875
R David Murray947ff382016-06-02 15:46:04 -0400876 v4addr2 = ipaddress.IPv4Address(2)
877 v4net2 = ipaddress.IPv4Network(2)
878 v4intf2 = ipaddress.IPv4Interface(2)
879 v6addr2 = ipaddress.IPv6Address(2)
880 v6net2 = ipaddress.IPv6Network(2)
881 v6intf2 = ipaddress.IPv6Interface(2)
opavlyuk21da76d2020-02-26 16:33:57 +0200882 v6addr2_scoped = ipaddress.IPv6Address('::2%scope')
883 v6net2_scoped = ipaddress.IPv6Network('::2%scope')
884 v6intf2_scoped = ipaddress.IPv6Interface('::2%scope')
R David Murray947ff382016-06-02 15:46:04 -0400885
Nick Coghlan3008ec02012-07-08 00:45:33 +1000886 def test_foreign_type_equality(self):
887 # __eq__ should never raise TypeError directly
888 other = object()
opavlyuk21da76d2020-02-26 16:33:57 +0200889 for obj in self.objects_with_scoped:
Nick Coghlan3008ec02012-07-08 00:45:33 +1000890 self.assertNotEqual(obj, other)
891 self.assertFalse(obj == other)
892 self.assertEqual(obj.__eq__(other), NotImplemented)
893 self.assertEqual(obj.__ne__(other), NotImplemented)
894
895 def test_mixed_type_equality(self):
896 # Ensure none of the internal objects accidentally
897 # expose the right set of attributes to become "equal"
898 for lhs in self.objects:
899 for rhs in self.objects:
900 if lhs is rhs:
901 continue
902 self.assertNotEqual(lhs, rhs)
903
opavlyuk21da76d2020-02-26 16:33:57 +0200904 def test_scoped_ipv6_equality(self):
905 for lhs, rhs in zip(self.v6_objects, self.v6_scoped_objects):
906 self.assertNotEqual(lhs, rhs)
907
908 def test_v4_with_v6_scoped_equality(self):
909 for lhs in self.v4_objects:
910 for rhs in self.v6_scoped_objects:
911 self.assertNotEqual(lhs, rhs)
912
R David Murray947ff382016-06-02 15:46:04 -0400913 def test_same_type_equality(self):
opavlyuk21da76d2020-02-26 16:33:57 +0200914 for obj in self.objects_with_scoped:
R David Murray947ff382016-06-02 15:46:04 -0400915 self.assertEqual(obj, obj)
916 self.assertLessEqual(obj, obj)
917 self.assertGreaterEqual(obj, obj)
918
919 def test_same_type_ordering(self):
920 for lhs, rhs in (
921 (self.v4addr, self.v4addr2),
922 (self.v4net, self.v4net2),
923 (self.v4intf, self.v4intf2),
924 (self.v6addr, self.v6addr2),
925 (self.v6net, self.v6net2),
926 (self.v6intf, self.v6intf2),
opavlyuk21da76d2020-02-26 16:33:57 +0200927 (self.v6addr_scoped, self.v6addr2_scoped),
928 (self.v6net_scoped, self.v6net2_scoped),
929 (self.v6intf_scoped, self.v6intf2_scoped),
R David Murray947ff382016-06-02 15:46:04 -0400930 ):
931 self.assertNotEqual(lhs, rhs)
932 self.assertLess(lhs, rhs)
933 self.assertLessEqual(lhs, rhs)
934 self.assertGreater(rhs, lhs)
935 self.assertGreaterEqual(rhs, lhs)
936 self.assertFalse(lhs > rhs)
937 self.assertFalse(rhs < lhs)
938 self.assertFalse(lhs >= rhs)
939 self.assertFalse(rhs <= lhs)
940
Nick Coghlan3008ec02012-07-08 00:45:33 +1000941 def test_containment(self):
942 for obj in self.v4_addresses:
943 self.assertIn(obj, self.v4net)
opavlyuk21da76d2020-02-26 16:33:57 +0200944 for obj in self.v6_addresses + self.v6_scoped_addresses:
Nick Coghlan3008ec02012-07-08 00:45:33 +1000945 self.assertIn(obj, self.v6net)
opavlyuk21da76d2020-02-26 16:33:57 +0200946 for obj in self.v6_addresses + self.v6_scoped_addresses:
947 self.assertIn(obj, self.v6net_scoped)
948
949 for obj in self.v4_objects + [self.v6net, self.v6net_scoped]:
Nick Coghlan3008ec02012-07-08 00:45:33 +1000950 self.assertNotIn(obj, self.v6net)
opavlyuk21da76d2020-02-26 16:33:57 +0200951 for obj in self.v4_objects + [self.v6net, self.v6net_scoped]:
952 self.assertNotIn(obj, self.v6net_scoped)
953 for obj in self.v6_objects + self.v6_scoped_objects + [self.v4net]:
Nick Coghlan3008ec02012-07-08 00:45:33 +1000954 self.assertNotIn(obj, self.v4net)
955
956 def test_mixed_type_ordering(self):
opavlyuk21da76d2020-02-26 16:33:57 +0200957 for lhs in self.objects_with_scoped:
958 for rhs in self.objects_with_scoped:
Nick Coghlan3008ec02012-07-08 00:45:33 +1000959 if isinstance(lhs, type(rhs)) or isinstance(rhs, type(lhs)):
960 continue
961 self.assertRaises(TypeError, lambda: lhs < rhs)
962 self.assertRaises(TypeError, lambda: lhs > rhs)
963 self.assertRaises(TypeError, lambda: lhs <= rhs)
964 self.assertRaises(TypeError, lambda: lhs >= rhs)
965
Serhiy Storchakaf186e122015-01-26 10:11:16 +0200966 def test_foreign_type_ordering(self):
967 other = object()
opavlyuk21da76d2020-02-26 16:33:57 +0200968 for obj in self.objects_with_scoped:
Serhiy Storchakaf186e122015-01-26 10:11:16 +0200969 with self.assertRaises(TypeError):
970 obj < other
971 with self.assertRaises(TypeError):
972 obj > other
973 with self.assertRaises(TypeError):
974 obj <= other
975 with self.assertRaises(TypeError):
976 obj >= other
Serhiy Storchaka17e52642019-08-04 12:38:46 +0300977 self.assertTrue(obj < LARGEST)
978 self.assertFalse(obj > LARGEST)
979 self.assertTrue(obj <= LARGEST)
980 self.assertFalse(obj >= LARGEST)
981 self.assertFalse(obj < SMALLEST)
982 self.assertTrue(obj > SMALLEST)
983 self.assertFalse(obj <= SMALLEST)
984 self.assertTrue(obj >= SMALLEST)
Serhiy Storchakaf186e122015-01-26 10:11:16 +0200985
Nick Coghlan3008ec02012-07-08 00:45:33 +1000986 def test_mixed_type_key(self):
987 # with get_mixed_type_key, you can sort addresses and network.
988 v4_ordered = [self.v4addr, self.v4net, self.v4intf]
989 v6_ordered = [self.v6addr, self.v6net, self.v6intf]
opavlyuk21da76d2020-02-26 16:33:57 +0200990 v6_scoped_ordered = [self.v6addr_scoped, self.v6net_scoped, self.v6intf_scoped]
Nick Coghlan3008ec02012-07-08 00:45:33 +1000991 self.assertEqual(v4_ordered,
992 sorted(self.v4_objects,
993 key=ipaddress.get_mixed_type_key))
994 self.assertEqual(v6_ordered,
995 sorted(self.v6_objects,
996 key=ipaddress.get_mixed_type_key))
opavlyuk21da76d2020-02-26 16:33:57 +0200997 self.assertEqual(v6_scoped_ordered,
998 sorted(self.v6_scoped_objects,
999 key=ipaddress.get_mixed_type_key))
1000 self.assertEqual(v4_ordered + v6_scoped_ordered,
1001 sorted(self.v4_objects + self.v6_scoped_objects,
Nick Coghlan3008ec02012-07-08 00:45:33 +10001002 key=ipaddress.get_mixed_type_key))
1003 self.assertEqual(NotImplemented, ipaddress.get_mixed_type_key(object))
1004
1005 def test_incompatible_versions(self):
1006 # These should always raise TypeError
1007 v4addr = ipaddress.ip_address('1.1.1.1')
1008 v4net = ipaddress.ip_network('1.1.1.1')
1009 v6addr = ipaddress.ip_address('::1')
Serhiy Storchakaf186e122015-01-26 10:11:16 +02001010 v6net = ipaddress.ip_network('::1')
opavlyuk21da76d2020-02-26 16:33:57 +02001011 v6addr_scoped = ipaddress.ip_address('::1%scope')
1012 v6net_scoped = ipaddress.ip_network('::1%scope')
Nick Coghlan3008ec02012-07-08 00:45:33 +10001013
1014 self.assertRaises(TypeError, v4addr.__lt__, v6addr)
1015 self.assertRaises(TypeError, v4addr.__gt__, v6addr)
1016 self.assertRaises(TypeError, v4net.__lt__, v6net)
1017 self.assertRaises(TypeError, v4net.__gt__, v6net)
1018
1019 self.assertRaises(TypeError, v6addr.__lt__, v4addr)
1020 self.assertRaises(TypeError, v6addr.__gt__, v4addr)
1021 self.assertRaises(TypeError, v6net.__lt__, v4net)
1022 self.assertRaises(TypeError, v6net.__gt__, v4net)
1023
opavlyuk21da76d2020-02-26 16:33:57 +02001024 self.assertRaises(TypeError, v4addr.__lt__, v6addr_scoped)
1025 self.assertRaises(TypeError, v4addr.__gt__, v6addr_scoped)
1026 self.assertRaises(TypeError, v4net.__lt__, v6net_scoped)
1027 self.assertRaises(TypeError, v4net.__gt__, v6net_scoped)
1028
1029 self.assertRaises(TypeError, v6addr_scoped.__lt__, v4addr)
1030 self.assertRaises(TypeError, v6addr_scoped.__gt__, v4addr)
1031 self.assertRaises(TypeError, v6net_scoped.__lt__, v4net)
1032 self.assertRaises(TypeError, v6net_scoped.__gt__, v4net)
1033
Nick Coghlan3008ec02012-07-08 00:45:33 +10001034
Nick Coghlandc9b2552012-05-20 21:01:57 +10001035class IpaddrUnitTest(unittest.TestCase):
1036
1037 def setUp(self):
1038 self.ipv4_address = ipaddress.IPv4Address('1.2.3.4')
1039 self.ipv4_interface = ipaddress.IPv4Interface('1.2.3.4/24')
1040 self.ipv4_network = ipaddress.IPv4Network('1.2.3.0/24')
1041 #self.ipv4_hostmask = ipaddress.IPv4Interface('10.0.0.1/0.255.255.255')
1042 self.ipv6_address = ipaddress.IPv6Interface(
1043 '2001:658:22a:cafe:200:0:0:1')
1044 self.ipv6_interface = ipaddress.IPv6Interface(
1045 '2001:658:22a:cafe:200:0:0:1/64')
1046 self.ipv6_network = ipaddress.IPv6Network('2001:658:22a:cafe::/64')
opavlyuk21da76d2020-02-26 16:33:57 +02001047 self.ipv6_scoped_address = ipaddress.IPv6Interface(
1048 '2001:658:22a:cafe:200:0:0:1%scope')
1049 self.ipv6_scoped_interface = ipaddress.IPv6Interface(
1050 '2001:658:22a:cafe:200:0:0:1%scope/64')
1051 self.ipv6_scoped_network = ipaddress.IPv6Network('2001:658:22a:cafe::%scope/64')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001052
1053 def testRepr(self):
1054 self.assertEqual("IPv4Interface('1.2.3.4/32')",
1055 repr(ipaddress.IPv4Interface('1.2.3.4')))
1056 self.assertEqual("IPv6Interface('::1/128')",
1057 repr(ipaddress.IPv6Interface('::1')))
opavlyuk21da76d2020-02-26 16:33:57 +02001058 self.assertEqual("IPv6Interface('::1%scope/128')",
1059 repr(ipaddress.IPv6Interface('::1%scope')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001060
Martin Panter204bf0b2016-07-11 07:51:37 +00001061 # issue #16531: constructing IPv4Network from an (address, mask) tuple
Antoine Pitrou5fb195f2014-05-12 20:36:46 +02001062 def testIPv4Tuple(self):
1063 # /32
1064 ip = ipaddress.IPv4Address('192.0.2.1')
1065 net = ipaddress.IPv4Network('192.0.2.1/32')
1066 self.assertEqual(ipaddress.IPv4Network(('192.0.2.1', 32)), net)
1067 self.assertEqual(ipaddress.IPv4Network((ip, 32)), net)
1068 self.assertEqual(ipaddress.IPv4Network((3221225985, 32)), net)
1069 self.assertEqual(ipaddress.IPv4Network(('192.0.2.1',
1070 '255.255.255.255')), net)
1071 self.assertEqual(ipaddress.IPv4Network((ip,
1072 '255.255.255.255')), net)
1073 self.assertEqual(ipaddress.IPv4Network((3221225985,
1074 '255.255.255.255')), net)
1075 # strict=True and host bits set
1076 with self.assertRaises(ValueError):
1077 ipaddress.IPv4Network(('192.0.2.1', 24))
1078 with self.assertRaises(ValueError):
1079 ipaddress.IPv4Network((ip, 24))
1080 with self.assertRaises(ValueError):
1081 ipaddress.IPv4Network((3221225985, 24))
1082 with self.assertRaises(ValueError):
1083 ipaddress.IPv4Network(('192.0.2.1', '255.255.255.0'))
1084 with self.assertRaises(ValueError):
1085 ipaddress.IPv4Network((ip, '255.255.255.0'))
1086 with self.assertRaises(ValueError):
1087 ipaddress.IPv4Network((3221225985, '255.255.255.0'))
1088 # strict=False and host bits set
1089 net = ipaddress.IPv4Network('192.0.2.0/24')
1090 self.assertEqual(ipaddress.IPv4Network(('192.0.2.1', 24),
1091 strict=False), net)
1092 self.assertEqual(ipaddress.IPv4Network((ip, 24),
1093 strict=False), net)
1094 self.assertEqual(ipaddress.IPv4Network((3221225985, 24),
1095 strict=False), net)
1096 self.assertEqual(ipaddress.IPv4Network(('192.0.2.1',
1097 '255.255.255.0'),
1098 strict=False), net)
1099 self.assertEqual(ipaddress.IPv4Network((ip,
1100 '255.255.255.0'),
1101 strict=False), net)
1102 self.assertEqual(ipaddress.IPv4Network((3221225985,
1103 '255.255.255.0'),
1104 strict=False), net)
1105
1106 # /24
1107 ip = ipaddress.IPv4Address('192.0.2.0')
1108 net = ipaddress.IPv4Network('192.0.2.0/24')
1109 self.assertEqual(ipaddress.IPv4Network(('192.0.2.0',
1110 '255.255.255.0')), net)
1111 self.assertEqual(ipaddress.IPv4Network((ip,
1112 '255.255.255.0')), net)
1113 self.assertEqual(ipaddress.IPv4Network((3221225984,
1114 '255.255.255.0')), net)
1115 self.assertEqual(ipaddress.IPv4Network(('192.0.2.0', 24)), net)
1116 self.assertEqual(ipaddress.IPv4Network((ip, 24)), net)
1117 self.assertEqual(ipaddress.IPv4Network((3221225984, 24)), net)
1118
1119 self.assertEqual(ipaddress.IPv4Interface(('192.0.2.1', 24)),
1120 ipaddress.IPv4Interface('192.0.2.1/24'))
1121 self.assertEqual(ipaddress.IPv4Interface((3221225985, 24)),
1122 ipaddress.IPv4Interface('192.0.2.1/24'))
1123
Martin Panter204bf0b2016-07-11 07:51:37 +00001124 # issue #16531: constructing IPv6Network from an (address, mask) tuple
Antoine Pitrou5fb195f2014-05-12 20:36:46 +02001125 def testIPv6Tuple(self):
1126 # /128
1127 ip = ipaddress.IPv6Address('2001:db8::')
1128 net = ipaddress.IPv6Network('2001:db8::/128')
1129 self.assertEqual(ipaddress.IPv6Network(('2001:db8::', '128')),
1130 net)
1131 self.assertEqual(ipaddress.IPv6Network(
1132 (42540766411282592856903984951653826560, 128)),
1133 net)
1134 self.assertEqual(ipaddress.IPv6Network((ip, '128')),
1135 net)
1136 ip = ipaddress.IPv6Address('2001:db8::')
1137 net = ipaddress.IPv6Network('2001:db8::/96')
1138 self.assertEqual(ipaddress.IPv6Network(('2001:db8::', '96')),
1139 net)
1140 self.assertEqual(ipaddress.IPv6Network(
1141 (42540766411282592856903984951653826560, 96)),
1142 net)
1143 self.assertEqual(ipaddress.IPv6Network((ip, '96')),
1144 net)
1145
opavlyuk21da76d2020-02-26 16:33:57 +02001146 ip_scoped = ipaddress.IPv6Address('2001:db8::%scope')
1147
Antoine Pitrou5fb195f2014-05-12 20:36:46 +02001148 # strict=True and host bits set
1149 ip = ipaddress.IPv6Address('2001:db8::1')
1150 with self.assertRaises(ValueError):
1151 ipaddress.IPv6Network(('2001:db8::1', 96))
1152 with self.assertRaises(ValueError):
1153 ipaddress.IPv6Network((
1154 42540766411282592856903984951653826561, 96))
1155 with self.assertRaises(ValueError):
1156 ipaddress.IPv6Network((ip, 96))
1157 # strict=False and host bits set
1158 net = ipaddress.IPv6Network('2001:db8::/96')
1159 self.assertEqual(ipaddress.IPv6Network(('2001:db8::1', 96),
1160 strict=False),
1161 net)
1162 self.assertEqual(ipaddress.IPv6Network(
1163 (42540766411282592856903984951653826561, 96),
1164 strict=False),
1165 net)
1166 self.assertEqual(ipaddress.IPv6Network((ip, 96), strict=False),
1167 net)
1168
1169 # /96
1170 self.assertEqual(ipaddress.IPv6Interface(('2001:db8::1', '96')),
1171 ipaddress.IPv6Interface('2001:db8::1/96'))
1172 self.assertEqual(ipaddress.IPv6Interface(
1173 (42540766411282592856903984951653826561, '96')),
1174 ipaddress.IPv6Interface('2001:db8::1/96'))
1175
opavlyuk21da76d2020-02-26 16:33:57 +02001176 ip_scoped = ipaddress.IPv6Address('2001:db8::1%scope')
1177 with self.assertRaises(ValueError):
1178 ipaddress.IPv6Network(('2001:db8::1%scope', 96))
1179 with self.assertRaises(ValueError):
1180 ipaddress.IPv6Network((ip_scoped, 96))
1181 # strict=False and host bits set
1182
Nick Coghlandc9b2552012-05-20 21:01:57 +10001183 # issue57
1184 def testAddressIntMath(self):
1185 self.assertEqual(ipaddress.IPv4Address('1.1.1.1') + 255,
1186 ipaddress.IPv4Address('1.1.2.0'))
1187 self.assertEqual(ipaddress.IPv4Address('1.1.1.1') - 256,
1188 ipaddress.IPv4Address('1.1.0.1'))
1189 self.assertEqual(ipaddress.IPv6Address('::1') + (2**16 - 2),
1190 ipaddress.IPv6Address('::ffff'))
1191 self.assertEqual(ipaddress.IPv6Address('::ffff') - (2**16 - 2),
1192 ipaddress.IPv6Address('::1'))
opavlyuk21da76d2020-02-26 16:33:57 +02001193 self.assertNotEqual(ipaddress.IPv6Address('::1%scope') + (2**16 - 2),
1194 ipaddress.IPv6Address('::ffff%scope'))
1195 self.assertNotEqual(ipaddress.IPv6Address('::ffff%scope') - (2**16 - 2),
1196 ipaddress.IPv6Address('::1%scope'))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001197
Nick Coghlan3c2570c2012-07-07 01:13:55 +10001198 def testInvalidIntToBytes(self):
1199 self.assertRaises(ValueError, ipaddress.v4_int_to_packed, -1)
1200 self.assertRaises(ValueError, ipaddress.v4_int_to_packed,
1201 2 ** ipaddress.IPV4LENGTH)
1202 self.assertRaises(ValueError, ipaddress.v6_int_to_packed, -1)
1203 self.assertRaises(ValueError, ipaddress.v6_int_to_packed,
1204 2 ** ipaddress.IPV6LENGTH)
1205
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001206 def testInternals(self):
Serhiy Storchakab53f0fb2015-01-19 00:41:32 +02001207 ip1 = ipaddress.IPv4Address('10.10.10.10')
1208 ip2 = ipaddress.IPv4Address('10.10.10.11')
1209 ip3 = ipaddress.IPv4Address('10.10.10.12')
1210 self.assertEqual(list(ipaddress._find_address_range([ip1])),
1211 [(ip1, ip1)])
1212 self.assertEqual(list(ipaddress._find_address_range([ip1, ip3])),
1213 [(ip1, ip1), (ip3, ip3)])
1214 self.assertEqual(list(ipaddress._find_address_range([ip1, ip2, ip3])),
1215 [(ip1, ip3)])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001216 self.assertEqual(128, ipaddress._count_righthand_zero_bits(0, 128))
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001217 self.assertEqual("IPv4Network('1.2.3.0/24')", repr(self.ipv4_network))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001218
1219 def testGetNetwork(self):
1220 self.assertEqual(int(self.ipv4_network.network_address), 16909056)
1221 self.assertEqual(str(self.ipv4_network.network_address), '1.2.3.0')
1222
1223 self.assertEqual(int(self.ipv6_network.network_address),
1224 42540616829182469433403647294022090752)
1225 self.assertEqual(str(self.ipv6_network.network_address),
1226 '2001:658:22a:cafe::')
1227 self.assertEqual(str(self.ipv6_network.hostmask),
1228 '::ffff:ffff:ffff:ffff')
opavlyuk21da76d2020-02-26 16:33:57 +02001229 self.assertEqual(int(self.ipv6_scoped_network.network_address),
1230 42540616829182469433403647294022090752)
1231 self.assertEqual(str(self.ipv6_scoped_network.network_address),
1232 '2001:658:22a:cafe::%scope')
1233 self.assertEqual(str(self.ipv6_scoped_network.hostmask),
1234 '::ffff:ffff:ffff:ffff')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001235
Nick Coghlandc9b2552012-05-20 21:01:57 +10001236 def testIpFromInt(self):
1237 self.assertEqual(self.ipv4_interface._ip,
1238 ipaddress.IPv4Interface(16909060)._ip)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001239
1240 ipv4 = ipaddress.ip_network('1.2.3.4')
1241 ipv6 = ipaddress.ip_network('2001:658:22a:cafe:200:0:0:1')
opavlyuk21da76d2020-02-26 16:33:57 +02001242 ipv6_scoped = ipaddress.ip_network('2001:658:22a:cafe:200:0:0:1%scope')
Nick Coghlan730f67f2012-08-05 22:02:18 +10001243 self.assertEqual(ipv4, ipaddress.ip_network(int(ipv4.network_address)))
1244 self.assertEqual(ipv6, ipaddress.ip_network(int(ipv6.network_address)))
opavlyuk21da76d2020-02-26 16:33:57 +02001245 self.assertNotEqual(ipv6_scoped, ipaddress.ip_network(int(ipv6_scoped.network_address)))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001246
1247 v6_int = 42540616829182469433547762482097946625
1248 self.assertEqual(self.ipv6_interface._ip,
1249 ipaddress.IPv6Interface(v6_int)._ip)
opavlyuk21da76d2020-02-26 16:33:57 +02001250 self.assertEqual(self.ipv6_scoped_interface._ip,
1251 ipaddress.IPv6Interface(v6_int)._ip)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001252
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001253 self.assertEqual(ipaddress.ip_network(self.ipv4_address._ip).version,
1254 4)
1255 self.assertEqual(ipaddress.ip_network(self.ipv6_address._ip).version,
1256 6)
opavlyuk21da76d2020-02-26 16:33:57 +02001257 self.assertEqual(ipaddress.ip_network(self.ipv6_scoped_address._ip).version,
1258 6)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001259
1260 def testIpFromPacked(self):
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001261 address = ipaddress.ip_address
Nick Coghlandc9b2552012-05-20 21:01:57 +10001262 self.assertEqual(self.ipv4_interface._ip,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001263 ipaddress.ip_interface(b'\x01\x02\x03\x04')._ip)
1264 self.assertEqual(address('255.254.253.252'),
1265 address(b'\xff\xfe\xfd\xfc'))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001266 self.assertEqual(self.ipv6_interface.ip,
1267 ipaddress.ip_interface(
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001268 b'\x20\x01\x06\x58\x02\x2a\xca\xfe'
1269 b'\x02\x00\x00\x00\x00\x00\x00\x01').ip)
1270 self.assertEqual(address('ffff:2:3:4:ffff::'),
1271 address(b'\xff\xff\x00\x02\x00\x03\x00\x04' +
1272 b'\xff\xff' + b'\x00' * 6))
1273 self.assertEqual(address('::'),
1274 address(b'\x00' * 16))
1275
Nick Coghlandc9b2552012-05-20 21:01:57 +10001276 def testGetIp(self):
1277 self.assertEqual(int(self.ipv4_interface.ip), 16909060)
1278 self.assertEqual(str(self.ipv4_interface.ip), '1.2.3.4')
1279
1280 self.assertEqual(int(self.ipv6_interface.ip),
1281 42540616829182469433547762482097946625)
1282 self.assertEqual(str(self.ipv6_interface.ip),
1283 '2001:658:22a:cafe:200::1')
opavlyuk21da76d2020-02-26 16:33:57 +02001284 self.assertEqual(int(self.ipv6_scoped_interface.ip),
1285 42540616829182469433547762482097946625)
1286 self.assertEqual(str(self.ipv6_scoped_interface.ip),
1287 '2001:658:22a:cafe:200::1')
1288
1289 def testGetScopeId(self):
1290 self.assertEqual(self.ipv6_address.scope_id,
1291 None)
1292 self.assertEqual(str(self.ipv6_scoped_address.scope_id),
1293 'scope')
1294 self.assertEqual(self.ipv6_interface.scope_id,
1295 None)
1296 self.assertEqual(str(self.ipv6_scoped_interface.scope_id),
1297 'scope')
1298 self.assertEqual(self.ipv6_network.network_address.scope_id,
1299 None)
1300 self.assertEqual(str(self.ipv6_scoped_network.network_address.scope_id),
1301 'scope')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001302
1303 def testGetNetmask(self):
1304 self.assertEqual(int(self.ipv4_network.netmask), 4294967040)
1305 self.assertEqual(str(self.ipv4_network.netmask), '255.255.255.0')
1306 self.assertEqual(int(self.ipv6_network.netmask),
1307 340282366920938463444927863358058659840)
1308 self.assertEqual(self.ipv6_network.prefixlen, 64)
opavlyuk21da76d2020-02-26 16:33:57 +02001309 self.assertEqual(int(self.ipv6_scoped_network.netmask),
1310 340282366920938463444927863358058659840)
1311 self.assertEqual(self.ipv6_scoped_network.prefixlen, 64)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001312
1313 def testZeroNetmask(self):
1314 ipv4_zero_netmask = ipaddress.IPv4Interface('1.2.3.4/0')
1315 self.assertEqual(int(ipv4_zero_netmask.network.netmask), 0)
Nick Coghlan932346f2014-02-08 23:17:36 +10001316 self.assertEqual(ipv4_zero_netmask._prefix_from_prefix_string('0'), 0)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001317
1318 ipv6_zero_netmask = ipaddress.IPv6Interface('::1/0')
1319 self.assertEqual(int(ipv6_zero_netmask.network.netmask), 0)
Nick Coghlan932346f2014-02-08 23:17:36 +10001320 self.assertEqual(ipv6_zero_netmask._prefix_from_prefix_string('0'), 0)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001321
opavlyuk21da76d2020-02-26 16:33:57 +02001322 ipv6_scoped_zero_netmask = ipaddress.IPv6Interface('::1%scope/0')
1323 self.assertEqual(int(ipv6_scoped_zero_netmask.network.netmask), 0)
1324 self.assertEqual(ipv6_scoped_zero_netmask._prefix_from_prefix_string('0'), 0)
1325
Rémi Lapeyree59ec1b2019-04-13 10:49:34 +02001326 def testIPv4Net(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001327 net = ipaddress.IPv4Network('127.0.0.0/0.0.0.255')
Nick Coghlan932346f2014-02-08 23:17:36 +10001328 self.assertEqual(net.prefixlen, 24)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001329
Nick Coghlandc9b2552012-05-20 21:01:57 +10001330 def testGetBroadcast(self):
1331 self.assertEqual(int(self.ipv4_network.broadcast_address), 16909311)
1332 self.assertEqual(str(self.ipv4_network.broadcast_address), '1.2.3.255')
1333
1334 self.assertEqual(int(self.ipv6_network.broadcast_address),
1335 42540616829182469451850391367731642367)
1336 self.assertEqual(str(self.ipv6_network.broadcast_address),
1337 '2001:658:22a:cafe:ffff:ffff:ffff:ffff')
1338
opavlyuk21da76d2020-02-26 16:33:57 +02001339 self.assertEqual(int(self.ipv6_scoped_network.broadcast_address),
1340 42540616829182469451850391367731642367)
1341 self.assertEqual(str(self.ipv6_scoped_network.broadcast_address),
1342 '2001:658:22a:cafe:ffff:ffff:ffff:ffff')
1343
Nick Coghlandc9b2552012-05-20 21:01:57 +10001344 def testGetPrefixlen(self):
Nick Coghlane3ded952012-08-05 22:45:22 +10001345 self.assertEqual(self.ipv4_interface.network.prefixlen, 24)
1346 self.assertEqual(self.ipv6_interface.network.prefixlen, 64)
opavlyuk21da76d2020-02-26 16:33:57 +02001347 self.assertEqual(self.ipv6_scoped_interface.network.prefixlen, 64)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001348
1349 def testGetSupernet(self):
1350 self.assertEqual(self.ipv4_network.supernet().prefixlen, 23)
1351 self.assertEqual(str(self.ipv4_network.supernet().network_address),
1352 '1.2.2.0')
1353 self.assertEqual(
1354 ipaddress.IPv4Interface('0.0.0.0/0').network.supernet(),
1355 ipaddress.IPv4Network('0.0.0.0/0'))
1356
1357 self.assertEqual(self.ipv6_network.supernet().prefixlen, 63)
1358 self.assertEqual(str(self.ipv6_network.supernet().network_address),
1359 '2001:658:22a:cafe::')
1360 self.assertEqual(ipaddress.IPv6Interface('::0/0').network.supernet(),
1361 ipaddress.IPv6Network('::0/0'))
opavlyuk21da76d2020-02-26 16:33:57 +02001362 self.assertEqual(self.ipv6_scoped_network.supernet().prefixlen, 63)
1363 self.assertEqual(str(self.ipv6_scoped_network.supernet().network_address),
1364 '2001:658:22a:cafe::')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001365
1366 def testGetSupernet3(self):
1367 self.assertEqual(self.ipv4_network.supernet(3).prefixlen, 21)
1368 self.assertEqual(str(self.ipv4_network.supernet(3).network_address),
1369 '1.2.0.0')
1370
1371 self.assertEqual(self.ipv6_network.supernet(3).prefixlen, 61)
1372 self.assertEqual(str(self.ipv6_network.supernet(3).network_address),
1373 '2001:658:22a:caf8::')
opavlyuk21da76d2020-02-26 16:33:57 +02001374 self.assertEqual(self.ipv6_scoped_network.supernet(3).prefixlen, 61)
1375 self.assertEqual(str(self.ipv6_scoped_network.supernet(3).network_address),
1376 '2001:658:22a:caf8::')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001377
1378 def testGetSupernet4(self):
1379 self.assertRaises(ValueError, self.ipv4_network.supernet,
1380 prefixlen_diff=2, new_prefix=1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001381 self.assertRaises(ValueError, self.ipv4_network.supernet,
1382 new_prefix=25)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001383 self.assertEqual(self.ipv4_network.supernet(prefixlen_diff=2),
1384 self.ipv4_network.supernet(new_prefix=22))
1385
1386 self.assertRaises(ValueError, self.ipv6_network.supernet,
1387 prefixlen_diff=2, new_prefix=1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001388 self.assertRaises(ValueError, self.ipv6_network.supernet,
1389 new_prefix=65)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001390 self.assertEqual(self.ipv6_network.supernet(prefixlen_diff=2),
1391 self.ipv6_network.supernet(new_prefix=62))
opavlyuk21da76d2020-02-26 16:33:57 +02001392 self.assertRaises(ValueError, self.ipv6_scoped_network.supernet,
1393 prefixlen_diff=2, new_prefix=1)
1394 self.assertRaises(ValueError, self.ipv6_scoped_network.supernet,
1395 new_prefix=65)
1396 self.assertEqual(self.ipv6_scoped_network.supernet(prefixlen_diff=2),
1397 self.ipv6_scoped_network.supernet(new_prefix=62))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001398
1399 def testHosts(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001400 hosts = list(self.ipv4_network.hosts())
1401 self.assertEqual(254, len(hosts))
1402 self.assertEqual(ipaddress.IPv4Address('1.2.3.1'), hosts[0])
1403 self.assertEqual(ipaddress.IPv4Address('1.2.3.254'), hosts[-1])
1404
Xiang Zhang10b134a2018-03-21 08:25:13 +08001405 ipv6_network = ipaddress.IPv6Network('2001:658:22a:cafe::/120')
1406 hosts = list(ipv6_network.hosts())
1407 self.assertEqual(255, len(hosts))
1408 self.assertEqual(ipaddress.IPv6Address('2001:658:22a:cafe::1'), hosts[0])
1409 self.assertEqual(ipaddress.IPv6Address('2001:658:22a:cafe::ff'), hosts[-1])
1410
opavlyuk21da76d2020-02-26 16:33:57 +02001411 ipv6_scoped_network = ipaddress.IPv6Network('2001:658:22a:cafe::%scope/120')
1412 hosts = list(ipv6_scoped_network.hosts())
1413 self.assertEqual(255, len(hosts))
1414 self.assertEqual(ipaddress.IPv6Address('2001:658:22a:cafe::1'), hosts[0])
1415 self.assertEqual(ipaddress.IPv6Address('2001:658:22a:cafe::ff'), hosts[-1])
1416
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001417 # special case where only 1 bit is left for address
Xiang Zhang10b134a2018-03-21 08:25:13 +08001418 addrs = [ipaddress.IPv4Address('2.0.0.0'),
1419 ipaddress.IPv4Address('2.0.0.1')]
1420 str_args = '2.0.0.0/31'
1421 tpl_args = ('2.0.0.0', 31)
1422 self.assertEqual(addrs, list(ipaddress.ip_network(str_args).hosts()))
1423 self.assertEqual(addrs, list(ipaddress.ip_network(tpl_args).hosts()))
1424 self.assertEqual(list(ipaddress.ip_network(str_args).hosts()),
1425 list(ipaddress.ip_network(tpl_args).hosts()))
1426
Pete Wicken8e9c47a2020-03-09 22:33:45 +00001427 # special case where the network is a /32
1428 addrs = [ipaddress.IPv4Address('1.2.3.4')]
1429 str_args = '1.2.3.4/32'
1430 tpl_args = ('1.2.3.4', 32)
1431 self.assertEqual(addrs, list(ipaddress.ip_network(str_args).hosts()))
1432 self.assertEqual(addrs, list(ipaddress.ip_network(tpl_args).hosts()))
1433 self.assertEqual(list(ipaddress.ip_network(str_args).hosts()),
1434 list(ipaddress.ip_network(tpl_args).hosts()))
1435
Xiang Zhang10b134a2018-03-21 08:25:13 +08001436 addrs = [ipaddress.IPv6Address('2001:658:22a:cafe::'),
1437 ipaddress.IPv6Address('2001:658:22a:cafe::1')]
1438 str_args = '2001:658:22a:cafe::/127'
1439 tpl_args = ('2001:658:22a:cafe::', 127)
1440 self.assertEqual(addrs, list(ipaddress.ip_network(str_args).hosts()))
1441 self.assertEqual(addrs, list(ipaddress.ip_network(tpl_args).hosts()))
1442 self.assertEqual(list(ipaddress.ip_network(str_args).hosts()),
1443 list(ipaddress.ip_network(tpl_args).hosts()))
Pete Wicken8e9c47a2020-03-09 22:33:45 +00001444
1445 addrs = [ipaddress.IPv6Address('2001:658:22a:cafe::1'), ]
1446 str_args = '2001:658:22a:cafe::1/128'
1447 tpl_args = ('2001:658:22a:cafe::1', 128)
opavlyuk21da76d2020-02-26 16:33:57 +02001448 self.assertEqual(addrs, list(ipaddress.ip_network(str_args).hosts()))
1449 self.assertEqual(addrs, list(ipaddress.ip_network(tpl_args).hosts()))
1450 self.assertEqual(list(ipaddress.ip_network(str_args).hosts()),
1451 list(ipaddress.ip_network(tpl_args).hosts()))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001452
1453 def testFancySubnetting(self):
1454 self.assertEqual(sorted(self.ipv4_network.subnets(prefixlen_diff=3)),
1455 sorted(self.ipv4_network.subnets(new_prefix=27)))
1456 self.assertRaises(ValueError, list,
1457 self.ipv4_network.subnets(new_prefix=23))
1458 self.assertRaises(ValueError, list,
1459 self.ipv4_network.subnets(prefixlen_diff=3,
1460 new_prefix=27))
1461 self.assertEqual(sorted(self.ipv6_network.subnets(prefixlen_diff=4)),
1462 sorted(self.ipv6_network.subnets(new_prefix=68)))
1463 self.assertRaises(ValueError, list,
1464 self.ipv6_network.subnets(new_prefix=63))
1465 self.assertRaises(ValueError, list,
1466 self.ipv6_network.subnets(prefixlen_diff=4,
1467 new_prefix=68))
opavlyuk21da76d2020-02-26 16:33:57 +02001468 self.assertEqual(sorted(self.ipv6_scoped_network.subnets(prefixlen_diff=4)),
1469 sorted(self.ipv6_scoped_network.subnets(new_prefix=68)))
1470 self.assertRaises(ValueError, list,
1471 self.ipv6_scoped_network.subnets(new_prefix=63))
1472 self.assertRaises(ValueError, list,
1473 self.ipv6_scoped_network.subnets(prefixlen_diff=4,
1474 new_prefix=68))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001475
1476 def testGetSubnets(self):
1477 self.assertEqual(list(self.ipv4_network.subnets())[0].prefixlen, 25)
1478 self.assertEqual(str(list(
1479 self.ipv4_network.subnets())[0].network_address),
1480 '1.2.3.0')
1481 self.assertEqual(str(list(
1482 self.ipv4_network.subnets())[1].network_address),
1483 '1.2.3.128')
1484
1485 self.assertEqual(list(self.ipv6_network.subnets())[0].prefixlen, 65)
opavlyuk21da76d2020-02-26 16:33:57 +02001486 self.assertEqual(list(self.ipv6_scoped_network.subnets())[0].prefixlen, 65)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001487
1488 def testGetSubnetForSingle32(self):
1489 ip = ipaddress.IPv4Network('1.2.3.4/32')
1490 subnets1 = [str(x) for x in ip.subnets()]
1491 subnets2 = [str(x) for x in ip.subnets(2)]
1492 self.assertEqual(subnets1, ['1.2.3.4/32'])
1493 self.assertEqual(subnets1, subnets2)
1494
1495 def testGetSubnetForSingle128(self):
1496 ip = ipaddress.IPv6Network('::1/128')
1497 subnets1 = [str(x) for x in ip.subnets()]
1498 subnets2 = [str(x) for x in ip.subnets(2)]
1499 self.assertEqual(subnets1, ['::1/128'])
1500 self.assertEqual(subnets1, subnets2)
1501
opavlyuk21da76d2020-02-26 16:33:57 +02001502 ip_scoped = ipaddress.IPv6Network('::1%scope/128')
1503 subnets1 = [str(x) for x in ip_scoped.subnets()]
1504 subnets2 = [str(x) for x in ip_scoped.subnets(2)]
1505 self.assertEqual(subnets1, ['::1%scope/128'])
1506 self.assertEqual(subnets1, subnets2)
1507
Nick Coghlandc9b2552012-05-20 21:01:57 +10001508 def testSubnet2(self):
1509 ips = [str(x) for x in self.ipv4_network.subnets(2)]
1510 self.assertEqual(
1511 ips,
1512 ['1.2.3.0/26', '1.2.3.64/26', '1.2.3.128/26', '1.2.3.192/26'])
1513
1514 ipsv6 = [str(x) for x in self.ipv6_network.subnets(2)]
1515 self.assertEqual(
1516 ipsv6,
1517 ['2001:658:22a:cafe::/66',
1518 '2001:658:22a:cafe:4000::/66',
1519 '2001:658:22a:cafe:8000::/66',
1520 '2001:658:22a:cafe:c000::/66'])
1521
Serhiy Storchakabb0dbd52016-03-01 10:25:45 +02001522 def testGetSubnets3(self):
1523 subnets = [str(x) for x in self.ipv4_network.subnets(8)]
1524 self.assertEqual(subnets[:3],
1525 ['1.2.3.0/32', '1.2.3.1/32', '1.2.3.2/32'])
1526 self.assertEqual(subnets[-3:],
1527 ['1.2.3.253/32', '1.2.3.254/32', '1.2.3.255/32'])
1528 self.assertEqual(len(subnets), 256)
1529
1530 ipv6_network = ipaddress.IPv6Network('2001:658:22a:cafe::/120')
1531 subnets = [str(x) for x in ipv6_network.subnets(8)]
1532 self.assertEqual(subnets[:3],
1533 ['2001:658:22a:cafe::/128',
1534 '2001:658:22a:cafe::1/128',
1535 '2001:658:22a:cafe::2/128'])
1536 self.assertEqual(subnets[-3:],
1537 ['2001:658:22a:cafe::fd/128',
1538 '2001:658:22a:cafe::fe/128',
1539 '2001:658:22a:cafe::ff/128'])
1540 self.assertEqual(len(subnets), 256)
1541
Nick Coghlandc9b2552012-05-20 21:01:57 +10001542 def testSubnetFailsForLargeCidrDiff(self):
1543 self.assertRaises(ValueError, list,
1544 self.ipv4_interface.network.subnets(9))
1545 self.assertRaises(ValueError, list,
1546 self.ipv4_network.subnets(9))
1547 self.assertRaises(ValueError, list,
1548 self.ipv6_interface.network.subnets(65))
1549 self.assertRaises(ValueError, list,
1550 self.ipv6_network.subnets(65))
opavlyuk21da76d2020-02-26 16:33:57 +02001551 self.assertRaises(ValueError, list,
1552 self.ipv6_scoped_interface.network.subnets(65))
1553 self.assertRaises(ValueError, list,
1554 self.ipv6_scoped_network.subnets(65))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001555
1556 def testSupernetFailsForLargeCidrDiff(self):
1557 self.assertRaises(ValueError,
1558 self.ipv4_interface.network.supernet, 25)
1559 self.assertRaises(ValueError,
1560 self.ipv6_interface.network.supernet, 65)
opavlyuk21da76d2020-02-26 16:33:57 +02001561 self.assertRaises(ValueError,
1562 self.ipv6_scoped_interface.network.supernet, 65)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001563
1564 def testSubnetFailsForNegativeCidrDiff(self):
1565 self.assertRaises(ValueError, list,
1566 self.ipv4_interface.network.subnets(-1))
1567 self.assertRaises(ValueError, list,
Nick Coghlan2c589102012-05-27 01:03:25 +10001568 self.ipv4_network.subnets(-1))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001569 self.assertRaises(ValueError, list,
1570 self.ipv6_interface.network.subnets(-1))
1571 self.assertRaises(ValueError, list,
1572 self.ipv6_network.subnets(-1))
opavlyuk21da76d2020-02-26 16:33:57 +02001573 self.assertRaises(ValueError, list,
1574 self.ipv6_scoped_interface.network.subnets(-1))
1575 self.assertRaises(ValueError, list,
1576 self.ipv6_scoped_network.subnets(-1))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001577
1578 def testGetNum_Addresses(self):
1579 self.assertEqual(self.ipv4_network.num_addresses, 256)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001580 self.assertEqual(list(self.ipv4_network.subnets())[0].num_addresses,
1581 128)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001582 self.assertEqual(self.ipv4_network.supernet().num_addresses, 512)
1583
1584 self.assertEqual(self.ipv6_network.num_addresses, 18446744073709551616)
1585 self.assertEqual(list(self.ipv6_network.subnets())[0].num_addresses,
1586 9223372036854775808)
1587 self.assertEqual(self.ipv6_network.supernet().num_addresses,
1588 36893488147419103232)
opavlyuk21da76d2020-02-26 16:33:57 +02001589 self.assertEqual(self.ipv6_scoped_network.num_addresses, 18446744073709551616)
1590 self.assertEqual(list(self.ipv6_scoped_network.subnets())[0].num_addresses,
1591 9223372036854775808)
1592 self.assertEqual(self.ipv6_scoped_network.supernet().num_addresses,
1593 36893488147419103232)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001594
1595 def testContains(self):
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001596 self.assertIn(ipaddress.IPv4Interface('1.2.3.128/25'),
1597 self.ipv4_network)
1598 self.assertNotIn(ipaddress.IPv4Interface('1.2.4.1/24'),
Nick Coghlandc9b2552012-05-20 21:01:57 +10001599 self.ipv4_network)
1600 # We can test addresses and string as well.
1601 addr1 = ipaddress.IPv4Address('1.2.3.37')
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001602 self.assertIn(addr1, self.ipv4_network)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001603 # issue 61, bad network comparison on like-ip'd network objects
1604 # with identical broadcast addresses.
1605 self.assertFalse(ipaddress.IPv4Network('1.1.0.0/16').__contains__(
1606 ipaddress.IPv4Network('1.0.0.0/15')))
1607
Nick Coghlandc9b2552012-05-20 21:01:57 +10001608 def testNth(self):
1609 self.assertEqual(str(self.ipv4_network[5]), '1.2.3.5')
1610 self.assertRaises(IndexError, self.ipv4_network.__getitem__, 256)
1611
1612 self.assertEqual(str(self.ipv6_network[5]),
1613 '2001:658:22a:cafe::5')
Berker Peksag28dc1182016-06-11 22:30:05 +03001614 self.assertRaises(IndexError, self.ipv6_network.__getitem__, 1 << 64)
opavlyuk21da76d2020-02-26 16:33:57 +02001615 self.assertEqual(str(self.ipv6_scoped_network[5]),
1616 '2001:658:22a:cafe::5')
1617 self.assertRaises(IndexError, self.ipv6_scoped_network.__getitem__, 1 << 64)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001618
1619 def testGetitem(self):
1620 # http://code.google.com/p/ipaddr-py/issues/detail?id=15
1621 addr = ipaddress.IPv4Network('172.31.255.128/255.255.255.240')
1622 self.assertEqual(28, addr.prefixlen)
1623 addr_list = list(addr)
1624 self.assertEqual('172.31.255.128', str(addr_list[0]))
1625 self.assertEqual('172.31.255.128', str(addr[0]))
1626 self.assertEqual('172.31.255.143', str(addr_list[-1]))
1627 self.assertEqual('172.31.255.143', str(addr[-1]))
1628 self.assertEqual(addr_list[-1], addr[-1])
1629
1630 def testEqual(self):
1631 self.assertTrue(self.ipv4_interface ==
1632 ipaddress.IPv4Interface('1.2.3.4/24'))
1633 self.assertFalse(self.ipv4_interface ==
1634 ipaddress.IPv4Interface('1.2.3.4/23'))
1635 self.assertFalse(self.ipv4_interface ==
1636 ipaddress.IPv6Interface('::1.2.3.4/24'))
opavlyuk21da76d2020-02-26 16:33:57 +02001637 self.assertFalse(self.ipv4_interface ==
1638 ipaddress.IPv6Interface('::1.2.3.4%scope/24'))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001639 self.assertFalse(self.ipv4_interface == '')
1640 self.assertFalse(self.ipv4_interface == [])
1641 self.assertFalse(self.ipv4_interface == 2)
1642
1643 self.assertTrue(self.ipv6_interface ==
1644 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/64'))
1645 self.assertFalse(self.ipv6_interface ==
1646 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/63'))
1647 self.assertFalse(self.ipv6_interface ==
1648 ipaddress.IPv4Interface('1.2.3.4/23'))
1649 self.assertFalse(self.ipv6_interface == '')
1650 self.assertFalse(self.ipv6_interface == [])
1651 self.assertFalse(self.ipv6_interface == 2)
1652
opavlyuk21da76d2020-02-26 16:33:57 +02001653 self.assertTrue(self.ipv6_scoped_interface ==
1654 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1%scope/64'))
1655 self.assertFalse(self.ipv6_scoped_interface ==
1656 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1%scope/63'))
1657 self.assertFalse(self.ipv6_scoped_interface ==
1658 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/64'))
1659 self.assertFalse(self.ipv6_scoped_interface ==
1660 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/63'))
1661 self.assertFalse(self.ipv6_scoped_interface ==
1662 ipaddress.IPv4Interface('1.2.3.4/23'))
1663 self.assertFalse(self.ipv6_scoped_interface == '')
1664 self.assertFalse(self.ipv6_scoped_interface == [])
1665 self.assertFalse(self.ipv6_scoped_interface == 2)
1666
Nick Coghlandc9b2552012-05-20 21:01:57 +10001667 def testNotEqual(self):
1668 self.assertFalse(self.ipv4_interface !=
1669 ipaddress.IPv4Interface('1.2.3.4/24'))
1670 self.assertTrue(self.ipv4_interface !=
1671 ipaddress.IPv4Interface('1.2.3.4/23'))
1672 self.assertTrue(self.ipv4_interface !=
1673 ipaddress.IPv6Interface('::1.2.3.4/24'))
opavlyuk21da76d2020-02-26 16:33:57 +02001674 self.assertTrue(self.ipv4_interface !=
1675 ipaddress.IPv6Interface('::1.2.3.4%scope/24'))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001676 self.assertTrue(self.ipv4_interface != '')
1677 self.assertTrue(self.ipv4_interface != [])
1678 self.assertTrue(self.ipv4_interface != 2)
1679
1680 self.assertTrue(self.ipv4_address !=
1681 ipaddress.IPv4Address('1.2.3.5'))
1682 self.assertTrue(self.ipv4_address != '')
1683 self.assertTrue(self.ipv4_address != [])
1684 self.assertTrue(self.ipv4_address != 2)
1685
1686 self.assertFalse(self.ipv6_interface !=
1687 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/64'))
1688 self.assertTrue(self.ipv6_interface !=
1689 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/63'))
1690 self.assertTrue(self.ipv6_interface !=
1691 ipaddress.IPv4Interface('1.2.3.4/23'))
1692 self.assertTrue(self.ipv6_interface != '')
1693 self.assertTrue(self.ipv6_interface != [])
1694 self.assertTrue(self.ipv6_interface != 2)
1695
1696 self.assertTrue(self.ipv6_address !=
1697 ipaddress.IPv4Address('1.2.3.4'))
1698 self.assertTrue(self.ipv6_address != '')
1699 self.assertTrue(self.ipv6_address != [])
1700 self.assertTrue(self.ipv6_address != 2)
1701
opavlyuk21da76d2020-02-26 16:33:57 +02001702 self.assertFalse(self.ipv6_scoped_interface !=
1703 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1%scope/64'))
1704 self.assertTrue(self.ipv6_scoped_interface !=
1705 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1%scope/63'))
1706 self.assertTrue(self.ipv6_scoped_interface !=
1707 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/64'))
1708 self.assertTrue(self.ipv6_scoped_interface !=
1709 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/63'))
1710 self.assertTrue(self.ipv6_scoped_interface !=
1711 ipaddress.IPv4Interface('1.2.3.4/23'))
1712 self.assertTrue(self.ipv6_scoped_interface != '')
1713 self.assertTrue(self.ipv6_scoped_interface != [])
1714 self.assertTrue(self.ipv6_scoped_interface != 2)
1715
1716 self.assertTrue(self.ipv6_scoped_address !=
1717 ipaddress.IPv4Address('1.2.3.4'))
1718 self.assertTrue(self.ipv6_scoped_address != '')
1719 self.assertTrue(self.ipv6_scoped_address != [])
1720 self.assertTrue(self.ipv6_scoped_address != 2)
1721
Nick Coghlandc9b2552012-05-20 21:01:57 +10001722 def testSlash32Constructor(self):
1723 self.assertEqual(str(ipaddress.IPv4Interface(
1724 '1.2.3.4/255.255.255.255')), '1.2.3.4/32')
1725
1726 def testSlash128Constructor(self):
1727 self.assertEqual(str(ipaddress.IPv6Interface('::1/128')),
1728 '::1/128')
opavlyuk21da76d2020-02-26 16:33:57 +02001729 self.assertEqual(str(ipaddress.IPv6Interface('::1%scope/128')),
1730 '::1%scope/128')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001731
1732 def testSlash0Constructor(self):
1733 self.assertEqual(str(ipaddress.IPv4Interface('1.2.3.4/0.0.0.0')),
1734 '1.2.3.4/0')
1735
1736 def testCollapsing(self):
1737 # test only IP addresses including some duplicates
1738 ip1 = ipaddress.IPv4Address('1.1.1.0')
1739 ip2 = ipaddress.IPv4Address('1.1.1.1')
1740 ip3 = ipaddress.IPv4Address('1.1.1.2')
1741 ip4 = ipaddress.IPv4Address('1.1.1.3')
1742 ip5 = ipaddress.IPv4Address('1.1.1.4')
1743 ip6 = ipaddress.IPv4Address('1.1.1.0')
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07001744 # check that addresses are subsumed properly.
Nick Coghlandc9b2552012-05-20 21:01:57 +10001745 collapsed = ipaddress.collapse_addresses(
1746 [ip1, ip2, ip3, ip4, ip5, ip6])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001747 self.assertEqual(list(collapsed),
1748 [ipaddress.IPv4Network('1.1.1.0/30'),
1749 ipaddress.IPv4Network('1.1.1.4/32')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001750
1751 # test a mix of IP addresses and networks including some duplicates
1752 ip1 = ipaddress.IPv4Address('1.1.1.0')
1753 ip2 = ipaddress.IPv4Address('1.1.1.1')
1754 ip3 = ipaddress.IPv4Address('1.1.1.2')
1755 ip4 = ipaddress.IPv4Address('1.1.1.3')
1756 #ip5 = ipaddress.IPv4Interface('1.1.1.4/30')
1757 #ip6 = ipaddress.IPv4Interface('1.1.1.4/30')
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07001758 # check that addresses are subsumed properly.
Nick Coghlandc9b2552012-05-20 21:01:57 +10001759 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3, ip4])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001760 self.assertEqual(list(collapsed),
1761 [ipaddress.IPv4Network('1.1.1.0/30')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001762
1763 # test only IP networks
1764 ip1 = ipaddress.IPv4Network('1.1.0.0/24')
1765 ip2 = ipaddress.IPv4Network('1.1.1.0/24')
1766 ip3 = ipaddress.IPv4Network('1.1.2.0/24')
1767 ip4 = ipaddress.IPv4Network('1.1.3.0/24')
1768 ip5 = ipaddress.IPv4Network('1.1.4.0/24')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001769 # stored in no particular order b/c we want CollapseAddr to call
1770 # [].sort
Nick Coghlandc9b2552012-05-20 21:01:57 +10001771 ip6 = ipaddress.IPv4Network('1.1.0.0/22')
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07001772 # check that addresses are subsumed properly.
Nick Coghlandc9b2552012-05-20 21:01:57 +10001773 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3, ip4, ip5,
1774 ip6])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001775 self.assertEqual(list(collapsed),
1776 [ipaddress.IPv4Network('1.1.0.0/22'),
1777 ipaddress.IPv4Network('1.1.4.0/24')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001778
1779 # test that two addresses are supernet'ed properly
1780 collapsed = ipaddress.collapse_addresses([ip1, ip2])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001781 self.assertEqual(list(collapsed),
1782 [ipaddress.IPv4Network('1.1.0.0/23')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001783
1784 # test same IP networks
1785 ip_same1 = ip_same2 = ipaddress.IPv4Network('1.1.1.1/32')
1786 self.assertEqual(list(ipaddress.collapse_addresses(
1787 [ip_same1, ip_same2])),
1788 [ip_same1])
1789
1790 # test same IP addresses
1791 ip_same1 = ip_same2 = ipaddress.IPv4Address('1.1.1.1')
1792 self.assertEqual(list(ipaddress.collapse_addresses(
1793 [ip_same1, ip_same2])),
1794 [ipaddress.ip_network('1.1.1.1/32')])
1795 ip1 = ipaddress.IPv6Network('2001::/100')
1796 ip2 = ipaddress.IPv6Network('2001::/120')
1797 ip3 = ipaddress.IPv6Network('2001::/96')
1798 # test that ipv6 addresses are subsumed properly.
1799 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3])
1800 self.assertEqual(list(collapsed), [ip3])
1801
opavlyuk21da76d2020-02-26 16:33:57 +02001802 ip1 = ipaddress.IPv6Network('2001::%scope/100')
1803 ip2 = ipaddress.IPv6Network('2001::%scope/120')
1804 ip3 = ipaddress.IPv6Network('2001::%scope/96')
1805 # test that ipv6 addresses are subsumed properly.
1806 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3])
1807 self.assertEqual(list(collapsed), [ip3])
1808
Nick Coghlandc9b2552012-05-20 21:01:57 +10001809 # the toejam test
Hynek Schlawack35db5132012-06-01 20:12:17 +02001810 addr_tuples = [
1811 (ipaddress.ip_address('1.1.1.1'),
1812 ipaddress.ip_address('::1')),
1813 (ipaddress.IPv4Network('1.1.0.0/24'),
1814 ipaddress.IPv6Network('2001::/120')),
1815 (ipaddress.IPv4Network('1.1.0.0/32'),
1816 ipaddress.IPv6Network('2001::/128')),
1817 ]
1818 for ip1, ip2 in addr_tuples:
1819 self.assertRaises(TypeError, ipaddress.collapse_addresses,
1820 [ip1, ip2])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001821
opavlyuk21da76d2020-02-26 16:33:57 +02001822 addr_tuples = [
1823 (ipaddress.ip_address('1.1.1.1'),
1824 ipaddress.ip_address('::1%scope')),
1825 (ipaddress.IPv4Network('1.1.0.0/24'),
1826 ipaddress.IPv6Network('2001::%scope/120')),
1827 (ipaddress.IPv4Network('1.1.0.0/32'),
1828 ipaddress.IPv6Network('2001::%scope/128')),
1829 ]
1830 for ip1, ip2 in addr_tuples:
1831 self.assertRaises(TypeError, ipaddress.collapse_addresses,
1832 [ip1, ip2])
1833
Nick Coghlandc9b2552012-05-20 21:01:57 +10001834 def testSummarizing(self):
1835 #ip = ipaddress.ip_address
1836 #ipnet = ipaddress.ip_network
1837 summarize = ipaddress.summarize_address_range
1838 ip1 = ipaddress.ip_address('1.1.1.0')
1839 ip2 = ipaddress.ip_address('1.1.1.255')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001840
1841 # summarize works only for IPv4 & IPv6
1842 class IPv7Address(ipaddress.IPv6Address):
1843 @property
1844 def version(self):
1845 return 7
1846 ip_invalid1 = IPv7Address('::1')
1847 ip_invalid2 = IPv7Address('::1')
1848 self.assertRaises(ValueError, list,
1849 summarize(ip_invalid1, ip_invalid2))
1850 # test that a summary over ip4 & ip6 fails
1851 self.assertRaises(TypeError, list,
1852 summarize(ip1, ipaddress.IPv6Address('::1')))
opavlyuk21da76d2020-02-26 16:33:57 +02001853 self.assertRaises(TypeError, list,
1854 summarize(ip1, ipaddress.IPv6Address('::1%scope')))
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001855 # test a /24 is summarized properly
Nick Coghlandc9b2552012-05-20 21:01:57 +10001856 self.assertEqual(list(summarize(ip1, ip2))[0],
1857 ipaddress.ip_network('1.1.1.0/24'))
Martin Panter7462b6492015-11-02 03:37:02 +00001858 # test an IPv4 range that isn't on a network byte boundary
Nick Coghlandc9b2552012-05-20 21:01:57 +10001859 ip2 = ipaddress.ip_address('1.1.1.8')
1860 self.assertEqual(list(summarize(ip1, ip2)),
1861 [ipaddress.ip_network('1.1.1.0/29'),
1862 ipaddress.ip_network('1.1.1.8')])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001863 # all!
1864 ip1 = ipaddress.IPv4Address(0)
1865 ip2 = ipaddress.IPv4Address(ipaddress.IPv4Address._ALL_ONES)
1866 self.assertEqual([ipaddress.IPv4Network('0.0.0.0/0')],
1867 list(summarize(ip1, ip2)))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001868
1869 ip1 = ipaddress.ip_address('1::')
1870 ip2 = ipaddress.ip_address('1:ffff:ffff:ffff:ffff:ffff:ffff:ffff')
Martin Panter7462b6492015-11-02 03:37:02 +00001871 # test an IPv6 is summarized properly
Nick Coghlandc9b2552012-05-20 21:01:57 +10001872 self.assertEqual(list(summarize(ip1, ip2))[0],
1873 ipaddress.ip_network('1::/16'))
1874 # test an IPv6 range that isn't on a network byte boundary
1875 ip2 = ipaddress.ip_address('2::')
1876 self.assertEqual(list(summarize(ip1, ip2)),
1877 [ipaddress.ip_network('1::/16'),
1878 ipaddress.ip_network('2::/128')])
1879
opavlyuk21da76d2020-02-26 16:33:57 +02001880 ip1 = ipaddress.ip_address('1::%scope')
1881 ip2 = ipaddress.ip_address('1:ffff:ffff:ffff:ffff:ffff:ffff:ffff%scope')
1882 # test an IPv6 is summarized properly
1883 self.assertEqual(list(summarize(ip1, ip2))[0],
1884 ipaddress.ip_network('1::/16'))
1885 # test an IPv6 range that isn't on a network byte boundary
1886 ip2 = ipaddress.ip_address('2::%scope')
1887 self.assertEqual(list(summarize(ip1, ip2)),
1888 [ipaddress.ip_network('1::/16'),
1889 ipaddress.ip_network('2::/128')])
1890
Nick Coghlandc9b2552012-05-20 21:01:57 +10001891 # test exception raised when first is greater than last
1892 self.assertRaises(ValueError, list,
1893 summarize(ipaddress.ip_address('1.1.1.0'),
1894 ipaddress.ip_address('1.1.0.0')))
1895 # test exception raised when first and last aren't IP addresses
1896 self.assertRaises(TypeError, list,
1897 summarize(ipaddress.ip_network('1.1.1.0'),
1898 ipaddress.ip_network('1.1.0.0')))
1899 self.assertRaises(TypeError, list,
1900 summarize(ipaddress.ip_network('1.1.1.0'),
1901 ipaddress.ip_network('1.1.0.0')))
1902 # test exception raised when first and last are not same version
1903 self.assertRaises(TypeError, list,
1904 summarize(ipaddress.ip_address('::'),
1905 ipaddress.ip_network('1.1.0.0')))
1906
1907 def testAddressComparison(self):
1908 self.assertTrue(ipaddress.ip_address('1.1.1.1') <=
1909 ipaddress.ip_address('1.1.1.1'))
1910 self.assertTrue(ipaddress.ip_address('1.1.1.1') <=
1911 ipaddress.ip_address('1.1.1.2'))
1912 self.assertTrue(ipaddress.ip_address('::1') <=
1913 ipaddress.ip_address('::1'))
1914 self.assertTrue(ipaddress.ip_address('::1') <=
1915 ipaddress.ip_address('::2'))
opavlyuk21da76d2020-02-26 16:33:57 +02001916 self.assertTrue(ipaddress.ip_address('::1%scope') <=
1917 ipaddress.ip_address('::1%scope'))
1918 self.assertTrue(ipaddress.ip_address('::1%scope') <=
1919 ipaddress.ip_address('::2%scope'))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001920
Nick Coghlan3008ec02012-07-08 00:45:33 +10001921 def testInterfaceComparison(self):
s-sanjay7bd8d3e2017-03-31 23:09:53 -07001922 self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') ==
1923 ipaddress.ip_interface('1.1.1.1/24'))
1924 self.assertTrue(ipaddress.ip_interface('1.1.1.1/16') <
1925 ipaddress.ip_interface('1.1.1.1/24'))
1926 self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') <
1927 ipaddress.ip_interface('1.1.1.2/24'))
1928 self.assertTrue(ipaddress.ip_interface('1.1.1.2/16') <
1929 ipaddress.ip_interface('1.1.1.1/24'))
1930 self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') >
1931 ipaddress.ip_interface('1.1.1.1/16'))
1932 self.assertTrue(ipaddress.ip_interface('1.1.1.2/24') >
1933 ipaddress.ip_interface('1.1.1.1/24'))
1934 self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') >
1935 ipaddress.ip_interface('1.1.1.2/16'))
1936
1937 self.assertTrue(ipaddress.ip_interface('::1/64') ==
1938 ipaddress.ip_interface('::1/64'))
1939 self.assertTrue(ipaddress.ip_interface('::1/64') <
1940 ipaddress.ip_interface('::1/80'))
1941 self.assertTrue(ipaddress.ip_interface('::1/64') <
1942 ipaddress.ip_interface('::2/64'))
1943 self.assertTrue(ipaddress.ip_interface('::2/48') <
1944 ipaddress.ip_interface('::1/64'))
1945 self.assertTrue(ipaddress.ip_interface('::1/80') >
1946 ipaddress.ip_interface('::1/64'))
1947 self.assertTrue(ipaddress.ip_interface('::2/64') >
1948 ipaddress.ip_interface('::1/64'))
1949 self.assertTrue(ipaddress.ip_interface('::1/64') >
1950 ipaddress.ip_interface('::2/48'))
Nick Coghlan3008ec02012-07-08 00:45:33 +10001951
opavlyuk21da76d2020-02-26 16:33:57 +02001952 self.assertTrue(ipaddress.ip_interface('::1%scope/64') ==
1953 ipaddress.ip_interface('::1%scope/64'))
1954 self.assertTrue(ipaddress.ip_interface('::1%scope/64') <
1955 ipaddress.ip_interface('::1%scope/80'))
1956 self.assertTrue(ipaddress.ip_interface('::1%scope/64') <
1957 ipaddress.ip_interface('::2%scope/64'))
1958 self.assertTrue(ipaddress.ip_interface('::2%scope/48') <
1959 ipaddress.ip_interface('::1%scope/64'))
1960 self.assertTrue(ipaddress.ip_interface('::1%scope/80') >
1961 ipaddress.ip_interface('::1%scope/64'))
1962 self.assertTrue(ipaddress.ip_interface('::2%scope/64') >
1963 ipaddress.ip_interface('::1%scope/64'))
1964 self.assertTrue(ipaddress.ip_interface('::1%scope/64') >
1965 ipaddress.ip_interface('::2%scope/48'))
1966
1967
1968 self.assertFalse(ipaddress.ip_interface('::1%scope/64') ==
1969 ipaddress.ip_interface('::1/64'))
1970 self.assertTrue(ipaddress.ip_interface('::1%scope/64') <
1971 ipaddress.ip_interface('::1/80'))
1972 self.assertTrue(ipaddress.ip_interface('::1%scope/64') <
1973 ipaddress.ip_interface('::2/64'))
1974 self.assertTrue(ipaddress.ip_interface('::2%scope/48') <
1975 ipaddress.ip_interface('::1/64'))
1976 self.assertTrue(ipaddress.ip_interface('::1%scope/80') >
1977 ipaddress.ip_interface('::1/64'))
1978 self.assertTrue(ipaddress.ip_interface('::2%scope/64') >
1979 ipaddress.ip_interface('::1/64'))
1980 self.assertTrue(ipaddress.ip_interface('::1%scope/64') >
1981 ipaddress.ip_interface('::2/48'))
1982
1983 self.assertFalse(ipaddress.ip_interface('::1/64') ==
1984 ipaddress.ip_interface('::1%scope/64'))
1985 self.assertTrue(ipaddress.ip_interface('::1/64') <
1986 ipaddress.ip_interface('::1%scope/80'))
1987 self.assertTrue(ipaddress.ip_interface('::1/64') <
1988 ipaddress.ip_interface('::2%scope/64'))
1989 self.assertTrue(ipaddress.ip_interface('::2/48') <
1990 ipaddress.ip_interface('::1%scope/64'))
1991 self.assertTrue(ipaddress.ip_interface('::1/80') >
1992 ipaddress.ip_interface('::1%scope/64'))
1993 self.assertTrue(ipaddress.ip_interface('::2/64') >
1994 ipaddress.ip_interface('::1%scope/64'))
1995 self.assertTrue(ipaddress.ip_interface('::1/64') >
1996 ipaddress.ip_interface('::2%scope/48'))
1997
Nick Coghlandc9b2552012-05-20 21:01:57 +10001998 def testNetworkComparison(self):
1999 # ip1 and ip2 have the same network address
2000 ip1 = ipaddress.IPv4Network('1.1.1.0/24')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002001 ip2 = ipaddress.IPv4Network('1.1.1.0/32')
Nick Coghlandc9b2552012-05-20 21:01:57 +10002002 ip3 = ipaddress.IPv4Network('1.1.2.0/24')
2003
2004 self.assertTrue(ip1 < ip3)
2005 self.assertTrue(ip3 > ip2)
2006
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002007 self.assertEqual(ip1.compare_networks(ip1), 0)
2008
2009 # if addresses are the same, sort by netmask
2010 self.assertEqual(ip1.compare_networks(ip2), -1)
2011 self.assertEqual(ip2.compare_networks(ip1), 1)
2012
Nick Coghlandc9b2552012-05-20 21:01:57 +10002013 self.assertEqual(ip1.compare_networks(ip3), -1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002014 self.assertEqual(ip3.compare_networks(ip1), 1)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002015 self.assertTrue(ip1._get_networks_key() < ip3._get_networks_key())
2016
2017 ip1 = ipaddress.IPv6Network('2001:2000::/96')
2018 ip2 = ipaddress.IPv6Network('2001:2001::/96')
2019 ip3 = ipaddress.IPv6Network('2001:ffff:2000::/96')
2020
2021 self.assertTrue(ip1 < ip3)
2022 self.assertTrue(ip3 > ip2)
2023 self.assertEqual(ip1.compare_networks(ip3), -1)
2024 self.assertTrue(ip1._get_networks_key() < ip3._get_networks_key())
2025
2026 # Test comparing different protocols.
2027 # Should always raise a TypeError.
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002028 self.assertRaises(TypeError,
2029 self.ipv4_network.compare_networks,
2030 self.ipv6_network)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002031 ipv6 = ipaddress.IPv6Interface('::/0')
2032 ipv4 = ipaddress.IPv4Interface('0.0.0.0/0')
2033 self.assertRaises(TypeError, ipv4.__lt__, ipv6)
2034 self.assertRaises(TypeError, ipv4.__gt__, ipv6)
2035 self.assertRaises(TypeError, ipv6.__lt__, ipv4)
2036 self.assertRaises(TypeError, ipv6.__gt__, ipv4)
2037
2038 # Regression test for issue 19.
2039 ip1 = ipaddress.ip_network('10.1.2.128/25')
2040 self.assertFalse(ip1 < ip1)
2041 self.assertFalse(ip1 > ip1)
2042 ip2 = ipaddress.ip_network('10.1.3.0/24')
2043 self.assertTrue(ip1 < ip2)
2044 self.assertFalse(ip2 < ip1)
2045 self.assertFalse(ip1 > ip2)
2046 self.assertTrue(ip2 > ip1)
2047 ip3 = ipaddress.ip_network('10.1.3.0/25')
2048 self.assertTrue(ip2 < ip3)
2049 self.assertFalse(ip3 < ip2)
2050 self.assertFalse(ip2 > ip3)
2051 self.assertTrue(ip3 > ip2)
2052
2053 # Regression test for issue 28.
2054 ip1 = ipaddress.ip_network('10.10.10.0/31')
2055 ip2 = ipaddress.ip_network('10.10.10.0')
2056 ip3 = ipaddress.ip_network('10.10.10.2/31')
2057 ip4 = ipaddress.ip_network('10.10.10.2')
2058 sorted = [ip1, ip2, ip3, ip4]
2059 unsorted = [ip2, ip4, ip1, ip3]
2060 unsorted.sort()
2061 self.assertEqual(sorted, unsorted)
2062 unsorted = [ip4, ip1, ip3, ip2]
2063 unsorted.sort()
2064 self.assertEqual(sorted, unsorted)
Serhiy Storchakaf186e122015-01-26 10:11:16 +02002065 self.assertIs(ip1.__lt__(ipaddress.ip_address('10.10.10.0')),
2066 NotImplemented)
2067 self.assertIs(ip2.__lt__(ipaddress.ip_address('10.10.10.0')),
2068 NotImplemented)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002069
2070 # <=, >=
2071 self.assertTrue(ipaddress.ip_network('1.1.1.1') <=
2072 ipaddress.ip_network('1.1.1.1'))
2073 self.assertTrue(ipaddress.ip_network('1.1.1.1') <=
2074 ipaddress.ip_network('1.1.1.2'))
2075 self.assertFalse(ipaddress.ip_network('1.1.1.2') <=
2076 ipaddress.ip_network('1.1.1.1'))
opavlyuk21da76d2020-02-26 16:33:57 +02002077
Nick Coghlandc9b2552012-05-20 21:01:57 +10002078 self.assertTrue(ipaddress.ip_network('::1') <=
2079 ipaddress.ip_network('::1'))
2080 self.assertTrue(ipaddress.ip_network('::1') <=
2081 ipaddress.ip_network('::2'))
2082 self.assertFalse(ipaddress.ip_network('::2') <=
2083 ipaddress.ip_network('::1'))
2084
2085 def testStrictNetworks(self):
2086 self.assertRaises(ValueError, ipaddress.ip_network, '192.168.1.1/24')
2087 self.assertRaises(ValueError, ipaddress.ip_network, '::1/120')
opavlyuk21da76d2020-02-26 16:33:57 +02002088 self.assertRaises(ValueError, ipaddress.ip_network, '::1%scope/120')
Nick Coghlandc9b2552012-05-20 21:01:57 +10002089
2090 def testOverlaps(self):
2091 other = ipaddress.IPv4Network('1.2.3.0/30')
2092 other2 = ipaddress.IPv4Network('1.2.2.0/24')
2093 other3 = ipaddress.IPv4Network('1.2.2.64/26')
2094 self.assertTrue(self.ipv4_network.overlaps(other))
2095 self.assertFalse(self.ipv4_network.overlaps(other2))
2096 self.assertTrue(other2.overlaps(other3))
2097
2098 def testEmbeddedIpv4(self):
2099 ipv4_string = '192.168.0.1'
2100 ipv4 = ipaddress.IPv4Interface(ipv4_string)
2101 v4compat_ipv6 = ipaddress.IPv6Interface('::%s' % ipv4_string)
2102 self.assertEqual(int(v4compat_ipv6.ip), int(ipv4.ip))
2103 v4mapped_ipv6 = ipaddress.IPv6Interface('::ffff:%s' % ipv4_string)
2104 self.assertNotEqual(v4mapped_ipv6.ip, ipv4.ip)
2105 self.assertRaises(ipaddress.AddressValueError, ipaddress.IPv6Interface,
2106 '2001:1.1.1.1:1.1.1.1')
2107
2108 # Issue 67: IPv6 with embedded IPv4 address not recognized.
2109 def testIPv6AddressTooLarge(self):
2110 # RFC4291 2.5.5.2
2111 self.assertEqual(ipaddress.ip_address('::FFFF:192.0.2.1'),
2112 ipaddress.ip_address('::FFFF:c000:201'))
2113 # RFC4291 2.2 (part 3) x::d.d.d.d
2114 self.assertEqual(ipaddress.ip_address('FFFF::192.0.2.1'),
2115 ipaddress.ip_address('FFFF::c000:201'))
2116
opavlyuk21da76d2020-02-26 16:33:57 +02002117 self.assertEqual(ipaddress.ip_address('::FFFF:192.0.2.1%scope'),
2118 ipaddress.ip_address('::FFFF:c000:201%scope'))
2119 self.assertEqual(ipaddress.ip_address('FFFF::192.0.2.1%scope'),
2120 ipaddress.ip_address('FFFF::c000:201%scope'))
2121 self.assertNotEqual(ipaddress.ip_address('::FFFF:192.0.2.1%scope'),
2122 ipaddress.ip_address('::FFFF:c000:201'))
2123 self.assertNotEqual(ipaddress.ip_address('FFFF::192.0.2.1%scope'),
2124 ipaddress.ip_address('FFFF::c000:201'))
2125 self.assertNotEqual(ipaddress.ip_address('::FFFF:192.0.2.1'),
2126 ipaddress.ip_address('::FFFF:c000:201%scope'))
2127 self.assertNotEqual(ipaddress.ip_address('FFFF::192.0.2.1'),
2128 ipaddress.ip_address('FFFF::c000:201%scope'))
2129
Nick Coghlandc9b2552012-05-20 21:01:57 +10002130 def testIPVersion(self):
2131 self.assertEqual(self.ipv4_address.version, 4)
2132 self.assertEqual(self.ipv6_address.version, 6)
opavlyuk21da76d2020-02-26 16:33:57 +02002133 self.assertEqual(self.ipv6_scoped_address.version, 6)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002134
2135 def testMaxPrefixLength(self):
2136 self.assertEqual(self.ipv4_interface.max_prefixlen, 32)
2137 self.assertEqual(self.ipv6_interface.max_prefixlen, 128)
opavlyuk21da76d2020-02-26 16:33:57 +02002138 self.assertEqual(self.ipv6_scoped_interface.max_prefixlen, 128)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002139
2140 def testPacked(self):
2141 self.assertEqual(self.ipv4_address.packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10002142 b'\x01\x02\x03\x04')
Nick Coghlandc9b2552012-05-20 21:01:57 +10002143 self.assertEqual(ipaddress.IPv4Interface('255.254.253.252').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10002144 b'\xff\xfe\xfd\xfc')
Nick Coghlandc9b2552012-05-20 21:01:57 +10002145 self.assertEqual(self.ipv6_address.packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10002146 b'\x20\x01\x06\x58\x02\x2a\xca\xfe'
2147 b'\x02\x00\x00\x00\x00\x00\x00\x01')
Nick Coghlandc9b2552012-05-20 21:01:57 +10002148 self.assertEqual(ipaddress.IPv6Interface('ffff:2:3:4:ffff::').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10002149 b'\xff\xff\x00\x02\x00\x03\x00\x04\xff\xff'
2150 + b'\x00' * 6)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002151 self.assertEqual(ipaddress.IPv6Interface('::1:0:0:0:0').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10002152 b'\x00' * 6 + b'\x00\x01' + b'\x00' * 8)
opavlyuk21da76d2020-02-26 16:33:57 +02002153 self.assertEqual(self.ipv6_scoped_address.packed,
2154 b'\x20\x01\x06\x58\x02\x2a\xca\xfe'
2155 b'\x02\x00\x00\x00\x00\x00\x00\x01')
2156 self.assertEqual(ipaddress.IPv6Interface('ffff:2:3:4:ffff::%scope').packed,
2157 b'\xff\xff\x00\x02\x00\x03\x00\x04\xff\xff'
2158 + b'\x00' * 6)
2159 self.assertEqual(ipaddress.IPv6Interface('::1:0:0:0:0%scope').packed,
2160 b'\x00' * 6 + b'\x00\x01' + b'\x00' * 8)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002161
Nick Coghlandc9b2552012-05-20 21:01:57 +10002162 def testIpType(self):
2163 ipv4net = ipaddress.ip_network('1.2.3.4')
2164 ipv4addr = ipaddress.ip_address('1.2.3.4')
2165 ipv6net = ipaddress.ip_network('::1.2.3.4')
2166 ipv6addr = ipaddress.ip_address('::1.2.3.4')
2167 self.assertEqual(ipaddress.IPv4Network, type(ipv4net))
2168 self.assertEqual(ipaddress.IPv4Address, type(ipv4addr))
2169 self.assertEqual(ipaddress.IPv6Network, type(ipv6net))
2170 self.assertEqual(ipaddress.IPv6Address, type(ipv6addr))
2171
2172 def testReservedIpv4(self):
2173 # test networks
2174 self.assertEqual(True, ipaddress.ip_interface(
2175 '224.1.1.1/31').is_multicast)
2176 self.assertEqual(False, ipaddress.ip_network('240.0.0.0').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002177 self.assertEqual(True, ipaddress.ip_network('240.0.0.0').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002178
2179 self.assertEqual(True, ipaddress.ip_interface(
2180 '192.168.1.1/17').is_private)
2181 self.assertEqual(False, ipaddress.ip_network('192.169.0.0').is_private)
2182 self.assertEqual(True, ipaddress.ip_network(
2183 '10.255.255.255').is_private)
2184 self.assertEqual(False, ipaddress.ip_network('11.0.0.0').is_private)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002185 self.assertEqual(False, ipaddress.ip_network('11.0.0.0').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002186 self.assertEqual(True, ipaddress.ip_network(
2187 '172.31.255.255').is_private)
2188 self.assertEqual(False, ipaddress.ip_network('172.32.0.0').is_private)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002189 self.assertEqual(True,
2190 ipaddress.ip_network('169.254.1.0/24').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002191
2192 self.assertEqual(True,
2193 ipaddress.ip_interface(
2194 '169.254.100.200/24').is_link_local)
2195 self.assertEqual(False,
2196 ipaddress.ip_interface(
2197 '169.255.100.200/24').is_link_local)
2198
2199 self.assertEqual(True,
2200 ipaddress.ip_network(
2201 '127.100.200.254/32').is_loopback)
2202 self.assertEqual(True, ipaddress.ip_network(
2203 '127.42.0.0/16').is_loopback)
2204 self.assertEqual(False, ipaddress.ip_network('128.0.0.0').is_loopback)
Peter Moodye5019d52013-10-24 09:47:10 -07002205 self.assertEqual(False,
2206 ipaddress.ip_network('100.64.0.0/10').is_private)
Peter Moodybe9c1b12013-10-22 12:36:21 -07002207 self.assertEqual(False, ipaddress.ip_network('100.64.0.0/10').is_global)
Peter Moodye5019d52013-10-24 09:47:10 -07002208
Peter Moody22c31762013-10-21 13:58:06 -07002209 self.assertEqual(True,
2210 ipaddress.ip_network('192.0.2.128/25').is_private)
2211 self.assertEqual(True,
2212 ipaddress.ip_network('192.0.3.0/24').is_global)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002213
2214 # test addresses
Hynek Schlawackbcd30442012-06-04 14:19:39 +02002215 self.assertEqual(True, ipaddress.ip_address('0.0.0.0').is_unspecified)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002216 self.assertEqual(True, ipaddress.ip_address('224.1.1.1').is_multicast)
2217 self.assertEqual(False, ipaddress.ip_address('240.0.0.0').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002218 self.assertEqual(True, ipaddress.ip_address('240.0.0.1').is_reserved)
2219 self.assertEqual(False,
2220 ipaddress.ip_address('239.255.255.255').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002221
2222 self.assertEqual(True, ipaddress.ip_address('192.168.1.1').is_private)
2223 self.assertEqual(False, ipaddress.ip_address('192.169.0.0').is_private)
2224 self.assertEqual(True, ipaddress.ip_address(
2225 '10.255.255.255').is_private)
2226 self.assertEqual(False, ipaddress.ip_address('11.0.0.0').is_private)
2227 self.assertEqual(True, ipaddress.ip_address(
2228 '172.31.255.255').is_private)
2229 self.assertEqual(False, ipaddress.ip_address('172.32.0.0').is_private)
2230
2231 self.assertEqual(True,
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002232 ipaddress.ip_address('169.254.100.200').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002233 self.assertEqual(False,
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002234 ipaddress.ip_address('169.255.100.200').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002235
Berker Peksag742192a2016-06-11 22:11:47 +03002236 self.assertTrue(ipaddress.ip_address('192.0.7.1').is_global)
2237 self.assertFalse(ipaddress.ip_address('203.0.113.1').is_global)
2238
Nick Coghlandc9b2552012-05-20 21:01:57 +10002239 self.assertEqual(True,
2240 ipaddress.ip_address('127.100.200.254').is_loopback)
2241 self.assertEqual(True, ipaddress.ip_address('127.42.0.0').is_loopback)
2242 self.assertEqual(False, ipaddress.ip_address('128.0.0.0').is_loopback)
2243 self.assertEqual(True, ipaddress.ip_network('0.0.0.0').is_unspecified)
2244
2245 def testReservedIpv6(self):
2246
2247 self.assertEqual(True, ipaddress.ip_network('ffff::').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002248 self.assertEqual(True, ipaddress.ip_network(2**128 - 1).is_multicast)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002249 self.assertEqual(True, ipaddress.ip_network('ff00::').is_multicast)
2250 self.assertEqual(False, ipaddress.ip_network('fdff::').is_multicast)
2251
2252 self.assertEqual(True, ipaddress.ip_network('fecf::').is_site_local)
2253 self.assertEqual(True, ipaddress.ip_network(
2254 'feff:ffff:ffff:ffff::').is_site_local)
2255 self.assertEqual(False, ipaddress.ip_network(
2256 'fbf:ffff::').is_site_local)
2257 self.assertEqual(False, ipaddress.ip_network('ff00::').is_site_local)
2258
2259 self.assertEqual(True, ipaddress.ip_network('fc00::').is_private)
2260 self.assertEqual(True, ipaddress.ip_network(
2261 'fc00:ffff:ffff:ffff::').is_private)
2262 self.assertEqual(False, ipaddress.ip_network('fbff:ffff::').is_private)
2263 self.assertEqual(False, ipaddress.ip_network('fe00::').is_private)
2264
2265 self.assertEqual(True, ipaddress.ip_network('fea0::').is_link_local)
2266 self.assertEqual(True, ipaddress.ip_network(
2267 'febf:ffff::').is_link_local)
2268 self.assertEqual(False, ipaddress.ip_network(
2269 'fe7f:ffff::').is_link_local)
2270 self.assertEqual(False, ipaddress.ip_network('fec0::').is_link_local)
2271
2272 self.assertEqual(True, ipaddress.ip_interface('0:0::0:01').is_loopback)
2273 self.assertEqual(False, ipaddress.ip_interface('::1/127').is_loopback)
2274 self.assertEqual(False, ipaddress.ip_network('::').is_loopback)
2275 self.assertEqual(False, ipaddress.ip_network('::2').is_loopback)
2276
2277 self.assertEqual(True, ipaddress.ip_network('0::0').is_unspecified)
2278 self.assertEqual(False, ipaddress.ip_network('::1').is_unspecified)
2279 self.assertEqual(False, ipaddress.ip_network('::/127').is_unspecified)
2280
Peter Moody22c31762013-10-21 13:58:06 -07002281 self.assertEqual(True,
2282 ipaddress.ip_network('2001::1/128').is_private)
2283 self.assertEqual(True,
2284 ipaddress.ip_network('200::1/128').is_global)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002285 # test addresses
2286 self.assertEqual(True, ipaddress.ip_address('ffff::').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002287 self.assertEqual(True, ipaddress.ip_address(2**128 - 1).is_multicast)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002288 self.assertEqual(True, ipaddress.ip_address('ff00::').is_multicast)
2289 self.assertEqual(False, ipaddress.ip_address('fdff::').is_multicast)
2290
2291 self.assertEqual(True, ipaddress.ip_address('fecf::').is_site_local)
2292 self.assertEqual(True, ipaddress.ip_address(
2293 'feff:ffff:ffff:ffff::').is_site_local)
2294 self.assertEqual(False, ipaddress.ip_address(
2295 'fbf:ffff::').is_site_local)
2296 self.assertEqual(False, ipaddress.ip_address('ff00::').is_site_local)
2297
2298 self.assertEqual(True, ipaddress.ip_address('fc00::').is_private)
2299 self.assertEqual(True, ipaddress.ip_address(
2300 'fc00:ffff:ffff:ffff::').is_private)
2301 self.assertEqual(False, ipaddress.ip_address('fbff:ffff::').is_private)
2302 self.assertEqual(False, ipaddress.ip_address('fe00::').is_private)
2303
2304 self.assertEqual(True, ipaddress.ip_address('fea0::').is_link_local)
2305 self.assertEqual(True, ipaddress.ip_address(
2306 'febf:ffff::').is_link_local)
2307 self.assertEqual(False, ipaddress.ip_address(
2308 'fe7f:ffff::').is_link_local)
2309 self.assertEqual(False, ipaddress.ip_address('fec0::').is_link_local)
2310
2311 self.assertEqual(True, ipaddress.ip_address('0:0::0:01').is_loopback)
2312 self.assertEqual(True, ipaddress.ip_address('::1').is_loopback)
2313 self.assertEqual(False, ipaddress.ip_address('::2').is_loopback)
2314
2315 self.assertEqual(True, ipaddress.ip_address('0::0').is_unspecified)
2316 self.assertEqual(False, ipaddress.ip_address('::1').is_unspecified)
2317
2318 # some generic IETF reserved addresses
2319 self.assertEqual(True, ipaddress.ip_address('100::').is_reserved)
2320 self.assertEqual(True, ipaddress.ip_network('4000::1/128').is_reserved)
2321
2322 def testIpv4Mapped(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002323 self.assertEqual(
2324 ipaddress.ip_address('::ffff:192.168.1.1').ipv4_mapped,
2325 ipaddress.ip_address('192.168.1.1'))
Nick Coghlandc9b2552012-05-20 21:01:57 +10002326 self.assertEqual(ipaddress.ip_address('::c0a8:101').ipv4_mapped, None)
2327 self.assertEqual(ipaddress.ip_address('::ffff:c0a8:101').ipv4_mapped,
2328 ipaddress.ip_address('192.168.1.1'))
2329
2330 def testAddrExclude(self):
2331 addr1 = ipaddress.ip_network('10.1.1.0/24')
2332 addr2 = ipaddress.ip_network('10.1.1.0/26')
2333 addr3 = ipaddress.ip_network('10.2.1.0/24')
2334 addr4 = ipaddress.ip_address('10.1.1.0')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002335 addr5 = ipaddress.ip_network('2001:db8::0/32')
Serhiy Storchakabb0dbd52016-03-01 10:25:45 +02002336 addr6 = ipaddress.ip_network('10.1.1.5/32')
Nick Coghlandc9b2552012-05-20 21:01:57 +10002337 self.assertEqual(sorted(list(addr1.address_exclude(addr2))),
2338 [ipaddress.ip_network('10.1.1.64/26'),
2339 ipaddress.ip_network('10.1.1.128/25')])
2340 self.assertRaises(ValueError, list, addr1.address_exclude(addr3))
2341 self.assertRaises(TypeError, list, addr1.address_exclude(addr4))
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002342 self.assertRaises(TypeError, list, addr1.address_exclude(addr5))
Nick Coghlandc9b2552012-05-20 21:01:57 +10002343 self.assertEqual(list(addr1.address_exclude(addr1)), [])
Serhiy Storchakabb0dbd52016-03-01 10:25:45 +02002344 self.assertEqual(sorted(list(addr1.address_exclude(addr6))),
2345 [ipaddress.ip_network('10.1.1.0/30'),
2346 ipaddress.ip_network('10.1.1.4/32'),
2347 ipaddress.ip_network('10.1.1.6/31'),
2348 ipaddress.ip_network('10.1.1.8/29'),
2349 ipaddress.ip_network('10.1.1.16/28'),
2350 ipaddress.ip_network('10.1.1.32/27'),
2351 ipaddress.ip_network('10.1.1.64/26'),
2352 ipaddress.ip_network('10.1.1.128/25')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10002353
2354 def testHash(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002355 self.assertEqual(hash(ipaddress.ip_interface('10.1.1.0/24')),
2356 hash(ipaddress.ip_interface('10.1.1.0/24')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10002357 self.assertEqual(hash(ipaddress.ip_network('10.1.1.0/24')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002358 hash(ipaddress.ip_network('10.1.1.0/24')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10002359 self.assertEqual(hash(ipaddress.ip_address('10.1.1.0')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002360 hash(ipaddress.ip_address('10.1.1.0')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10002361 # i70
2362 self.assertEqual(hash(ipaddress.ip_address('1.2.3.4')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002363 hash(ipaddress.ip_address(
Nick Coghlandc9b2552012-05-20 21:01:57 +10002364 int(ipaddress.ip_address('1.2.3.4')._ip))))
2365 ip1 = ipaddress.ip_address('10.1.1.0')
2366 ip2 = ipaddress.ip_address('1::')
2367 dummy = {}
2368 dummy[self.ipv4_address] = None
2369 dummy[self.ipv6_address] = None
2370 dummy[ip1] = None
2371 dummy[ip2] = None
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02002372 self.assertIn(self.ipv4_address, dummy)
2373 self.assertIn(ip2, dummy)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002374
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002375 def testIPBases(self):
2376 net = self.ipv4_network
2377 self.assertEqual('1.2.3.0/24', net.compressed)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002378 net = self.ipv6_network
2379 self.assertRaises(ValueError, net._string_from_ip_int, 2**128 + 1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002380
Hynek Schlawack454a74d2012-06-04 18:14:02 +02002381 def testIPv6NetworkHelpers(self):
2382 net = self.ipv6_network
2383 self.assertEqual('2001:658:22a:cafe::/64', net.with_prefixlen)
2384 self.assertEqual('2001:658:22a:cafe::/ffff:ffff:ffff:ffff::',
2385 net.with_netmask)
2386 self.assertEqual('2001:658:22a:cafe::/::ffff:ffff:ffff:ffff',
2387 net.with_hostmask)
2388 self.assertEqual('2001:658:22a:cafe::/64', str(net))
2389
2390 def testIPv4NetworkHelpers(self):
2391 net = self.ipv4_network
2392 self.assertEqual('1.2.3.0/24', net.with_prefixlen)
2393 self.assertEqual('1.2.3.0/255.255.255.0', net.with_netmask)
2394 self.assertEqual('1.2.3.0/0.0.0.255', net.with_hostmask)
2395 self.assertEqual('1.2.3.0/24', str(net))
2396
Nick Coghlandc9b2552012-05-20 21:01:57 +10002397 def testCopyConstructor(self):
2398 addr1 = ipaddress.ip_network('10.1.1.0/24')
2399 addr2 = ipaddress.ip_network(addr1)
2400 addr3 = ipaddress.ip_interface('2001:658:22a:cafe:200::1/64')
2401 addr4 = ipaddress.ip_interface(addr3)
2402 addr5 = ipaddress.IPv4Address('1.1.1.1')
2403 addr6 = ipaddress.IPv6Address('2001:658:22a:cafe:200::1')
2404
2405 self.assertEqual(addr1, addr2)
2406 self.assertEqual(addr3, addr4)
2407 self.assertEqual(addr5, ipaddress.IPv4Address(addr5))
2408 self.assertEqual(addr6, ipaddress.IPv6Address(addr6))
2409
2410 def testCompressIPv6Address(self):
2411 test_addresses = {
2412 '1:2:3:4:5:6:7:8': '1:2:3:4:5:6:7:8/128',
2413 '2001:0:0:4:0:0:0:8': '2001:0:0:4::8/128',
2414 '2001:0:0:4:5:6:7:8': '2001::4:5:6:7:8/128',
2415 '2001:0:3:4:5:6:7:8': '2001:0:3:4:5:6:7:8/128',
Nick Coghlandc9b2552012-05-20 21:01:57 +10002416 '0:0:3:0:0:0:0:ffff': '0:0:3::ffff/128',
2417 '0:0:0:4:0:0:0:ffff': '::4:0:0:0:ffff/128',
2418 '0:0:0:0:5:0:0:ffff': '::5:0:0:ffff/128',
2419 '1:0:0:4:0:0:7:8': '1::4:0:0:7:8/128',
2420 '0:0:0:0:0:0:0:0': '::/128',
2421 '0:0:0:0:0:0:0:0/0': '::/0',
2422 '0:0:0:0:0:0:0:1': '::1/128',
2423 '2001:0658:022a:cafe:0000:0000:0000:0000/66':
2424 '2001:658:22a:cafe::/66',
2425 '::1.2.3.4': '::102:304/128',
2426 '1:2:3:4:5:ffff:1.2.3.4': '1:2:3:4:5:ffff:102:304/128',
2427 '::7:6:5:4:3:2:1': '0:7:6:5:4:3:2:1/128',
2428 '::7:6:5:4:3:2:0': '0:7:6:5:4:3:2:0/128',
2429 '7:6:5:4:3:2:1::': '7:6:5:4:3:2:1:0/128',
2430 '0:6:5:4:3:2:1::': '0:6:5:4:3:2:1:0/128',
2431 }
2432 for uncompressed, compressed in list(test_addresses.items()):
2433 self.assertEqual(compressed, str(ipaddress.IPv6Interface(
2434 uncompressed)))
2435
2436 def testExplodeShortHandIpStr(self):
2437 addr1 = ipaddress.IPv6Interface('2001::1')
2438 addr2 = ipaddress.IPv6Address('2001:0:5ef5:79fd:0:59d:a0e5:ba1')
2439 addr3 = ipaddress.IPv6Network('2001::/96')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002440 addr4 = ipaddress.IPv4Address('192.168.178.1')
Nick Coghlandc9b2552012-05-20 21:01:57 +10002441 self.assertEqual('2001:0000:0000:0000:0000:0000:0000:0001/128',
2442 addr1.exploded)
2443 self.assertEqual('0000:0000:0000:0000:0000:0000:0000:0001/128',
2444 ipaddress.IPv6Interface('::1/128').exploded)
2445 # issue 77
2446 self.assertEqual('2001:0000:5ef5:79fd:0000:059d:a0e5:0ba1',
2447 addr2.exploded)
2448 self.assertEqual('2001:0000:0000:0000:0000:0000:0000:0000/96',
2449 addr3.exploded)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002450 self.assertEqual('192.168.178.1', addr4.exploded)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002451
Eric V. Smithebdaaf42014-04-14 12:58:07 -04002452 def testReversePointer(self):
2453 addr1 = ipaddress.IPv4Address('127.0.0.1')
2454 addr2 = ipaddress.IPv6Address('2001:db8::1')
2455 self.assertEqual('1.0.0.127.in-addr.arpa', addr1.reverse_pointer)
2456 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.' +
2457 'b.d.0.1.0.0.2.ip6.arpa',
2458 addr2.reverse_pointer)
2459
Nick Coghlandc9b2552012-05-20 21:01:57 +10002460 def testIntRepresentation(self):
2461 self.assertEqual(16909060, int(self.ipv4_address))
2462 self.assertEqual(42540616829182469433547762482097946625,
2463 int(self.ipv6_address))
2464
Nick Coghlandc9b2552012-05-20 21:01:57 +10002465 def testForceVersion(self):
2466 self.assertEqual(ipaddress.ip_network(1).version, 4)
Nick Coghlan51c30672012-05-27 00:25:58 +10002467 self.assertEqual(ipaddress.IPv6Network(1).version, 6)
Sandro Tosi876ecad2012-05-23 22:26:55 +02002468
Nick Coghlandc9b2552012-05-20 21:01:57 +10002469 def testWithStar(self):
Nick Coghlana8517ad2012-08-20 10:04:26 +10002470 self.assertEqual(self.ipv4_interface.with_prefixlen, "1.2.3.4/24")
2471 self.assertEqual(self.ipv4_interface.with_netmask,
Nick Coghlandc9b2552012-05-20 21:01:57 +10002472 "1.2.3.4/255.255.255.0")
Nick Coghlana8517ad2012-08-20 10:04:26 +10002473 self.assertEqual(self.ipv4_interface.with_hostmask,
Nick Coghlandc9b2552012-05-20 21:01:57 +10002474 "1.2.3.4/0.0.0.255")
2475
Nick Coghlana8517ad2012-08-20 10:04:26 +10002476 self.assertEqual(self.ipv6_interface.with_prefixlen,
Nick Coghlandc9b2552012-05-20 21:01:57 +10002477 '2001:658:22a:cafe:200::1/64')
Nick Coghlana8517ad2012-08-20 10:04:26 +10002478 self.assertEqual(self.ipv6_interface.with_netmask,
2479 '2001:658:22a:cafe:200::1/ffff:ffff:ffff:ffff::')
Nick Coghlandc9b2552012-05-20 21:01:57 +10002480 # this probably don't make much sense, but it's included for
2481 # compatibility with ipv4
Nick Coghlana8517ad2012-08-20 10:04:26 +10002482 self.assertEqual(self.ipv6_interface.with_hostmask,
Nick Coghlandc9b2552012-05-20 21:01:57 +10002483 '2001:658:22a:cafe:200::1/::ffff:ffff:ffff:ffff')
2484
2485 def testNetworkElementCaching(self):
2486 # V4 - make sure we're empty
Inada Naoki2430d532019-04-15 16:01:00 +09002487 self.assertNotIn('broadcast_address', self.ipv4_network.__dict__)
2488 self.assertNotIn('hostmask', self.ipv4_network.__dict__)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002489
2490 # V4 - populate and test
Nick Coghlandc9b2552012-05-20 21:01:57 +10002491 self.assertEqual(self.ipv4_network.broadcast_address,
2492 ipaddress.IPv4Address('1.2.3.255'))
2493 self.assertEqual(self.ipv4_network.hostmask,
2494 ipaddress.IPv4Address('0.0.0.255'))
2495
2496 # V4 - check we're cached
Inada Naoki2430d532019-04-15 16:01:00 +09002497 self.assertIn('broadcast_address', self.ipv4_network.__dict__)
2498 self.assertIn('hostmask', self.ipv4_network.__dict__)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002499
2500 # V6 - make sure we're empty
Inada Naoki2430d532019-04-15 16:01:00 +09002501 self.assertNotIn('broadcast_address', self.ipv6_network.__dict__)
2502 self.assertNotIn('hostmask', self.ipv6_network.__dict__)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002503
2504 # V6 - populate and test
2505 self.assertEqual(self.ipv6_network.network_address,
2506 ipaddress.IPv6Address('2001:658:22a:cafe::'))
2507 self.assertEqual(self.ipv6_interface.network.network_address,
2508 ipaddress.IPv6Address('2001:658:22a:cafe::'))
2509
2510 self.assertEqual(
2511 self.ipv6_network.broadcast_address,
2512 ipaddress.IPv6Address('2001:658:22a:cafe:ffff:ffff:ffff:ffff'))
2513 self.assertEqual(self.ipv6_network.hostmask,
2514 ipaddress.IPv6Address('::ffff:ffff:ffff:ffff'))
2515 self.assertEqual(
2516 self.ipv6_interface.network.broadcast_address,
2517 ipaddress.IPv6Address('2001:658:22a:cafe:ffff:ffff:ffff:ffff'))
2518 self.assertEqual(self.ipv6_interface.network.hostmask,
2519 ipaddress.IPv6Address('::ffff:ffff:ffff:ffff'))
2520
2521 # V6 - check we're cached
Inada Naoki2430d532019-04-15 16:01:00 +09002522 self.assertIn('broadcast_address', self.ipv6_network.__dict__)
2523 self.assertIn('hostmask', self.ipv6_network.__dict__)
2524 self.assertIn('broadcast_address', self.ipv6_interface.network.__dict__)
2525 self.assertIn('hostmask', self.ipv6_interface.network.__dict__)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002526
2527 def testTeredo(self):
2528 # stolen from wikipedia
2529 server = ipaddress.IPv4Address('65.54.227.120')
2530 client = ipaddress.IPv4Address('192.0.2.45')
2531 teredo_addr = '2001:0000:4136:e378:8000:63bf:3fff:fdd2'
2532 self.assertEqual((server, client),
2533 ipaddress.ip_address(teredo_addr).teredo)
2534 bad_addr = '2000::4136:e378:8000:63bf:3fff:fdd2'
2535 self.assertFalse(ipaddress.ip_address(bad_addr).teredo)
2536 bad_addr = '2001:0001:4136:e378:8000:63bf:3fff:fdd2'
2537 self.assertFalse(ipaddress.ip_address(bad_addr).teredo)
2538
2539 # i77
2540 teredo_addr = ipaddress.IPv6Address('2001:0:5ef5:79fd:0:59d:a0e5:ba1')
2541 self.assertEqual((ipaddress.IPv4Address('94.245.121.253'),
2542 ipaddress.IPv4Address('95.26.244.94')),
2543 teredo_addr.teredo)
2544
Nick Coghlandc9b2552012-05-20 21:01:57 +10002545 def testsixtofour(self):
2546 sixtofouraddr = ipaddress.ip_address('2002:ac1d:2d64::1')
2547 bad_addr = ipaddress.ip_address('2000:ac1d:2d64::1')
2548 self.assertEqual(ipaddress.IPv4Address('172.29.45.100'),
2549 sixtofouraddr.sixtofour)
2550 self.assertFalse(bad_addr.sixtofour)
2551
Nick Coghlandc9b2552012-05-20 21:01:57 +10002552
2553if __name__ == '__main__':
2554 unittest.main()