blob: f4a4afba76a99dc42985a8e9fe5f9f94bcb0d574 [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
1427 addrs = [ipaddress.IPv6Address('2001:658:22a:cafe::'),
1428 ipaddress.IPv6Address('2001:658:22a:cafe::1')]
1429 str_args = '2001:658:22a:cafe::/127'
1430 tpl_args = ('2001:658:22a:cafe::', 127)
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()))
opavlyuk21da76d2020-02-26 16:33:57 +02001435 addrs = [ipaddress.IPv6Address('2001:658:22a:cafe::'),
1436 ipaddress.IPv6Address('2001:658:22a:cafe::1')]
1437 str_args = '2001:658:22a:cafe::/127'
1438 tpl_args = ('2001:658:22a:cafe::', 127)
1439 self.assertEqual(addrs, list(ipaddress.ip_network(str_args).hosts()))
1440 self.assertEqual(addrs, list(ipaddress.ip_network(tpl_args).hosts()))
1441 self.assertEqual(list(ipaddress.ip_network(str_args).hosts()),
1442 list(ipaddress.ip_network(tpl_args).hosts()))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001443
1444 def testFancySubnetting(self):
1445 self.assertEqual(sorted(self.ipv4_network.subnets(prefixlen_diff=3)),
1446 sorted(self.ipv4_network.subnets(new_prefix=27)))
1447 self.assertRaises(ValueError, list,
1448 self.ipv4_network.subnets(new_prefix=23))
1449 self.assertRaises(ValueError, list,
1450 self.ipv4_network.subnets(prefixlen_diff=3,
1451 new_prefix=27))
1452 self.assertEqual(sorted(self.ipv6_network.subnets(prefixlen_diff=4)),
1453 sorted(self.ipv6_network.subnets(new_prefix=68)))
1454 self.assertRaises(ValueError, list,
1455 self.ipv6_network.subnets(new_prefix=63))
1456 self.assertRaises(ValueError, list,
1457 self.ipv6_network.subnets(prefixlen_diff=4,
1458 new_prefix=68))
opavlyuk21da76d2020-02-26 16:33:57 +02001459 self.assertEqual(sorted(self.ipv6_scoped_network.subnets(prefixlen_diff=4)),
1460 sorted(self.ipv6_scoped_network.subnets(new_prefix=68)))
1461 self.assertRaises(ValueError, list,
1462 self.ipv6_scoped_network.subnets(new_prefix=63))
1463 self.assertRaises(ValueError, list,
1464 self.ipv6_scoped_network.subnets(prefixlen_diff=4,
1465 new_prefix=68))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001466
1467 def testGetSubnets(self):
1468 self.assertEqual(list(self.ipv4_network.subnets())[0].prefixlen, 25)
1469 self.assertEqual(str(list(
1470 self.ipv4_network.subnets())[0].network_address),
1471 '1.2.3.0')
1472 self.assertEqual(str(list(
1473 self.ipv4_network.subnets())[1].network_address),
1474 '1.2.3.128')
1475
1476 self.assertEqual(list(self.ipv6_network.subnets())[0].prefixlen, 65)
opavlyuk21da76d2020-02-26 16:33:57 +02001477 self.assertEqual(list(self.ipv6_scoped_network.subnets())[0].prefixlen, 65)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001478
1479 def testGetSubnetForSingle32(self):
1480 ip = ipaddress.IPv4Network('1.2.3.4/32')
1481 subnets1 = [str(x) for x in ip.subnets()]
1482 subnets2 = [str(x) for x in ip.subnets(2)]
1483 self.assertEqual(subnets1, ['1.2.3.4/32'])
1484 self.assertEqual(subnets1, subnets2)
1485
1486 def testGetSubnetForSingle128(self):
1487 ip = ipaddress.IPv6Network('::1/128')
1488 subnets1 = [str(x) for x in ip.subnets()]
1489 subnets2 = [str(x) for x in ip.subnets(2)]
1490 self.assertEqual(subnets1, ['::1/128'])
1491 self.assertEqual(subnets1, subnets2)
1492
opavlyuk21da76d2020-02-26 16:33:57 +02001493 ip_scoped = ipaddress.IPv6Network('::1%scope/128')
1494 subnets1 = [str(x) for x in ip_scoped.subnets()]
1495 subnets2 = [str(x) for x in ip_scoped.subnets(2)]
1496 self.assertEqual(subnets1, ['::1%scope/128'])
1497 self.assertEqual(subnets1, subnets2)
1498
Nick Coghlandc9b2552012-05-20 21:01:57 +10001499 def testSubnet2(self):
1500 ips = [str(x) for x in self.ipv4_network.subnets(2)]
1501 self.assertEqual(
1502 ips,
1503 ['1.2.3.0/26', '1.2.3.64/26', '1.2.3.128/26', '1.2.3.192/26'])
1504
1505 ipsv6 = [str(x) for x in self.ipv6_network.subnets(2)]
1506 self.assertEqual(
1507 ipsv6,
1508 ['2001:658:22a:cafe::/66',
1509 '2001:658:22a:cafe:4000::/66',
1510 '2001:658:22a:cafe:8000::/66',
1511 '2001:658:22a:cafe:c000::/66'])
1512
Serhiy Storchakabb0dbd52016-03-01 10:25:45 +02001513 def testGetSubnets3(self):
1514 subnets = [str(x) for x in self.ipv4_network.subnets(8)]
1515 self.assertEqual(subnets[:3],
1516 ['1.2.3.0/32', '1.2.3.1/32', '1.2.3.2/32'])
1517 self.assertEqual(subnets[-3:],
1518 ['1.2.3.253/32', '1.2.3.254/32', '1.2.3.255/32'])
1519 self.assertEqual(len(subnets), 256)
1520
1521 ipv6_network = ipaddress.IPv6Network('2001:658:22a:cafe::/120')
1522 subnets = [str(x) for x in ipv6_network.subnets(8)]
1523 self.assertEqual(subnets[:3],
1524 ['2001:658:22a:cafe::/128',
1525 '2001:658:22a:cafe::1/128',
1526 '2001:658:22a:cafe::2/128'])
1527 self.assertEqual(subnets[-3:],
1528 ['2001:658:22a:cafe::fd/128',
1529 '2001:658:22a:cafe::fe/128',
1530 '2001:658:22a:cafe::ff/128'])
1531 self.assertEqual(len(subnets), 256)
1532
Nick Coghlandc9b2552012-05-20 21:01:57 +10001533 def testSubnetFailsForLargeCidrDiff(self):
1534 self.assertRaises(ValueError, list,
1535 self.ipv4_interface.network.subnets(9))
1536 self.assertRaises(ValueError, list,
1537 self.ipv4_network.subnets(9))
1538 self.assertRaises(ValueError, list,
1539 self.ipv6_interface.network.subnets(65))
1540 self.assertRaises(ValueError, list,
1541 self.ipv6_network.subnets(65))
opavlyuk21da76d2020-02-26 16:33:57 +02001542 self.assertRaises(ValueError, list,
1543 self.ipv6_scoped_interface.network.subnets(65))
1544 self.assertRaises(ValueError, list,
1545 self.ipv6_scoped_network.subnets(65))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001546
1547 def testSupernetFailsForLargeCidrDiff(self):
1548 self.assertRaises(ValueError,
1549 self.ipv4_interface.network.supernet, 25)
1550 self.assertRaises(ValueError,
1551 self.ipv6_interface.network.supernet, 65)
opavlyuk21da76d2020-02-26 16:33:57 +02001552 self.assertRaises(ValueError,
1553 self.ipv6_scoped_interface.network.supernet, 65)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001554
1555 def testSubnetFailsForNegativeCidrDiff(self):
1556 self.assertRaises(ValueError, list,
1557 self.ipv4_interface.network.subnets(-1))
1558 self.assertRaises(ValueError, list,
Nick Coghlan2c589102012-05-27 01:03:25 +10001559 self.ipv4_network.subnets(-1))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001560 self.assertRaises(ValueError, list,
1561 self.ipv6_interface.network.subnets(-1))
1562 self.assertRaises(ValueError, list,
1563 self.ipv6_network.subnets(-1))
opavlyuk21da76d2020-02-26 16:33:57 +02001564 self.assertRaises(ValueError, list,
1565 self.ipv6_scoped_interface.network.subnets(-1))
1566 self.assertRaises(ValueError, list,
1567 self.ipv6_scoped_network.subnets(-1))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001568
1569 def testGetNum_Addresses(self):
1570 self.assertEqual(self.ipv4_network.num_addresses, 256)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001571 self.assertEqual(list(self.ipv4_network.subnets())[0].num_addresses,
1572 128)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001573 self.assertEqual(self.ipv4_network.supernet().num_addresses, 512)
1574
1575 self.assertEqual(self.ipv6_network.num_addresses, 18446744073709551616)
1576 self.assertEqual(list(self.ipv6_network.subnets())[0].num_addresses,
1577 9223372036854775808)
1578 self.assertEqual(self.ipv6_network.supernet().num_addresses,
1579 36893488147419103232)
opavlyuk21da76d2020-02-26 16:33:57 +02001580 self.assertEqual(self.ipv6_scoped_network.num_addresses, 18446744073709551616)
1581 self.assertEqual(list(self.ipv6_scoped_network.subnets())[0].num_addresses,
1582 9223372036854775808)
1583 self.assertEqual(self.ipv6_scoped_network.supernet().num_addresses,
1584 36893488147419103232)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001585
1586 def testContains(self):
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001587 self.assertIn(ipaddress.IPv4Interface('1.2.3.128/25'),
1588 self.ipv4_network)
1589 self.assertNotIn(ipaddress.IPv4Interface('1.2.4.1/24'),
Nick Coghlandc9b2552012-05-20 21:01:57 +10001590 self.ipv4_network)
1591 # We can test addresses and string as well.
1592 addr1 = ipaddress.IPv4Address('1.2.3.37')
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001593 self.assertIn(addr1, self.ipv4_network)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001594 # issue 61, bad network comparison on like-ip'd network objects
1595 # with identical broadcast addresses.
1596 self.assertFalse(ipaddress.IPv4Network('1.1.0.0/16').__contains__(
1597 ipaddress.IPv4Network('1.0.0.0/15')))
1598
Nick Coghlandc9b2552012-05-20 21:01:57 +10001599 def testNth(self):
1600 self.assertEqual(str(self.ipv4_network[5]), '1.2.3.5')
1601 self.assertRaises(IndexError, self.ipv4_network.__getitem__, 256)
1602
1603 self.assertEqual(str(self.ipv6_network[5]),
1604 '2001:658:22a:cafe::5')
Berker Peksag28dc1182016-06-11 22:30:05 +03001605 self.assertRaises(IndexError, self.ipv6_network.__getitem__, 1 << 64)
opavlyuk21da76d2020-02-26 16:33:57 +02001606 self.assertEqual(str(self.ipv6_scoped_network[5]),
1607 '2001:658:22a:cafe::5')
1608 self.assertRaises(IndexError, self.ipv6_scoped_network.__getitem__, 1 << 64)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001609
1610 def testGetitem(self):
1611 # http://code.google.com/p/ipaddr-py/issues/detail?id=15
1612 addr = ipaddress.IPv4Network('172.31.255.128/255.255.255.240')
1613 self.assertEqual(28, addr.prefixlen)
1614 addr_list = list(addr)
1615 self.assertEqual('172.31.255.128', str(addr_list[0]))
1616 self.assertEqual('172.31.255.128', str(addr[0]))
1617 self.assertEqual('172.31.255.143', str(addr_list[-1]))
1618 self.assertEqual('172.31.255.143', str(addr[-1]))
1619 self.assertEqual(addr_list[-1], addr[-1])
1620
1621 def testEqual(self):
1622 self.assertTrue(self.ipv4_interface ==
1623 ipaddress.IPv4Interface('1.2.3.4/24'))
1624 self.assertFalse(self.ipv4_interface ==
1625 ipaddress.IPv4Interface('1.2.3.4/23'))
1626 self.assertFalse(self.ipv4_interface ==
1627 ipaddress.IPv6Interface('::1.2.3.4/24'))
opavlyuk21da76d2020-02-26 16:33:57 +02001628 self.assertFalse(self.ipv4_interface ==
1629 ipaddress.IPv6Interface('::1.2.3.4%scope/24'))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001630 self.assertFalse(self.ipv4_interface == '')
1631 self.assertFalse(self.ipv4_interface == [])
1632 self.assertFalse(self.ipv4_interface == 2)
1633
1634 self.assertTrue(self.ipv6_interface ==
1635 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/64'))
1636 self.assertFalse(self.ipv6_interface ==
1637 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/63'))
1638 self.assertFalse(self.ipv6_interface ==
1639 ipaddress.IPv4Interface('1.2.3.4/23'))
1640 self.assertFalse(self.ipv6_interface == '')
1641 self.assertFalse(self.ipv6_interface == [])
1642 self.assertFalse(self.ipv6_interface == 2)
1643
opavlyuk21da76d2020-02-26 16:33:57 +02001644 self.assertTrue(self.ipv6_scoped_interface ==
1645 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1%scope/64'))
1646 self.assertFalse(self.ipv6_scoped_interface ==
1647 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1%scope/63'))
1648 self.assertFalse(self.ipv6_scoped_interface ==
1649 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/64'))
1650 self.assertFalse(self.ipv6_scoped_interface ==
1651 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/63'))
1652 self.assertFalse(self.ipv6_scoped_interface ==
1653 ipaddress.IPv4Interface('1.2.3.4/23'))
1654 self.assertFalse(self.ipv6_scoped_interface == '')
1655 self.assertFalse(self.ipv6_scoped_interface == [])
1656 self.assertFalse(self.ipv6_scoped_interface == 2)
1657
Nick Coghlandc9b2552012-05-20 21:01:57 +10001658 def testNotEqual(self):
1659 self.assertFalse(self.ipv4_interface !=
1660 ipaddress.IPv4Interface('1.2.3.4/24'))
1661 self.assertTrue(self.ipv4_interface !=
1662 ipaddress.IPv4Interface('1.2.3.4/23'))
1663 self.assertTrue(self.ipv4_interface !=
1664 ipaddress.IPv6Interface('::1.2.3.4/24'))
opavlyuk21da76d2020-02-26 16:33:57 +02001665 self.assertTrue(self.ipv4_interface !=
1666 ipaddress.IPv6Interface('::1.2.3.4%scope/24'))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001667 self.assertTrue(self.ipv4_interface != '')
1668 self.assertTrue(self.ipv4_interface != [])
1669 self.assertTrue(self.ipv4_interface != 2)
1670
1671 self.assertTrue(self.ipv4_address !=
1672 ipaddress.IPv4Address('1.2.3.5'))
1673 self.assertTrue(self.ipv4_address != '')
1674 self.assertTrue(self.ipv4_address != [])
1675 self.assertTrue(self.ipv4_address != 2)
1676
1677 self.assertFalse(self.ipv6_interface !=
1678 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/64'))
1679 self.assertTrue(self.ipv6_interface !=
1680 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/63'))
1681 self.assertTrue(self.ipv6_interface !=
1682 ipaddress.IPv4Interface('1.2.3.4/23'))
1683 self.assertTrue(self.ipv6_interface != '')
1684 self.assertTrue(self.ipv6_interface != [])
1685 self.assertTrue(self.ipv6_interface != 2)
1686
1687 self.assertTrue(self.ipv6_address !=
1688 ipaddress.IPv4Address('1.2.3.4'))
1689 self.assertTrue(self.ipv6_address != '')
1690 self.assertTrue(self.ipv6_address != [])
1691 self.assertTrue(self.ipv6_address != 2)
1692
opavlyuk21da76d2020-02-26 16:33:57 +02001693 self.assertFalse(self.ipv6_scoped_interface !=
1694 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1%scope/64'))
1695 self.assertTrue(self.ipv6_scoped_interface !=
1696 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1%scope/63'))
1697 self.assertTrue(self.ipv6_scoped_interface !=
1698 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/64'))
1699 self.assertTrue(self.ipv6_scoped_interface !=
1700 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/63'))
1701 self.assertTrue(self.ipv6_scoped_interface !=
1702 ipaddress.IPv4Interface('1.2.3.4/23'))
1703 self.assertTrue(self.ipv6_scoped_interface != '')
1704 self.assertTrue(self.ipv6_scoped_interface != [])
1705 self.assertTrue(self.ipv6_scoped_interface != 2)
1706
1707 self.assertTrue(self.ipv6_scoped_address !=
1708 ipaddress.IPv4Address('1.2.3.4'))
1709 self.assertTrue(self.ipv6_scoped_address != '')
1710 self.assertTrue(self.ipv6_scoped_address != [])
1711 self.assertTrue(self.ipv6_scoped_address != 2)
1712
Nick Coghlandc9b2552012-05-20 21:01:57 +10001713 def testSlash32Constructor(self):
1714 self.assertEqual(str(ipaddress.IPv4Interface(
1715 '1.2.3.4/255.255.255.255')), '1.2.3.4/32')
1716
1717 def testSlash128Constructor(self):
1718 self.assertEqual(str(ipaddress.IPv6Interface('::1/128')),
1719 '::1/128')
opavlyuk21da76d2020-02-26 16:33:57 +02001720 self.assertEqual(str(ipaddress.IPv6Interface('::1%scope/128')),
1721 '::1%scope/128')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001722
1723 def testSlash0Constructor(self):
1724 self.assertEqual(str(ipaddress.IPv4Interface('1.2.3.4/0.0.0.0')),
1725 '1.2.3.4/0')
1726
1727 def testCollapsing(self):
1728 # test only IP addresses including some duplicates
1729 ip1 = ipaddress.IPv4Address('1.1.1.0')
1730 ip2 = ipaddress.IPv4Address('1.1.1.1')
1731 ip3 = ipaddress.IPv4Address('1.1.1.2')
1732 ip4 = ipaddress.IPv4Address('1.1.1.3')
1733 ip5 = ipaddress.IPv4Address('1.1.1.4')
1734 ip6 = ipaddress.IPv4Address('1.1.1.0')
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07001735 # check that addresses are subsumed properly.
Nick Coghlandc9b2552012-05-20 21:01:57 +10001736 collapsed = ipaddress.collapse_addresses(
1737 [ip1, ip2, ip3, ip4, ip5, ip6])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001738 self.assertEqual(list(collapsed),
1739 [ipaddress.IPv4Network('1.1.1.0/30'),
1740 ipaddress.IPv4Network('1.1.1.4/32')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001741
1742 # test a mix of IP addresses and networks including some duplicates
1743 ip1 = ipaddress.IPv4Address('1.1.1.0')
1744 ip2 = ipaddress.IPv4Address('1.1.1.1')
1745 ip3 = ipaddress.IPv4Address('1.1.1.2')
1746 ip4 = ipaddress.IPv4Address('1.1.1.3')
1747 #ip5 = ipaddress.IPv4Interface('1.1.1.4/30')
1748 #ip6 = ipaddress.IPv4Interface('1.1.1.4/30')
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07001749 # check that addresses are subsumed properly.
Nick Coghlandc9b2552012-05-20 21:01:57 +10001750 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3, ip4])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001751 self.assertEqual(list(collapsed),
1752 [ipaddress.IPv4Network('1.1.1.0/30')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001753
1754 # test only IP networks
1755 ip1 = ipaddress.IPv4Network('1.1.0.0/24')
1756 ip2 = ipaddress.IPv4Network('1.1.1.0/24')
1757 ip3 = ipaddress.IPv4Network('1.1.2.0/24')
1758 ip4 = ipaddress.IPv4Network('1.1.3.0/24')
1759 ip5 = ipaddress.IPv4Network('1.1.4.0/24')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001760 # stored in no particular order b/c we want CollapseAddr to call
1761 # [].sort
Nick Coghlandc9b2552012-05-20 21:01:57 +10001762 ip6 = ipaddress.IPv4Network('1.1.0.0/22')
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07001763 # check that addresses are subsumed properly.
Nick Coghlandc9b2552012-05-20 21:01:57 +10001764 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3, ip4, ip5,
1765 ip6])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001766 self.assertEqual(list(collapsed),
1767 [ipaddress.IPv4Network('1.1.0.0/22'),
1768 ipaddress.IPv4Network('1.1.4.0/24')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001769
1770 # test that two addresses are supernet'ed properly
1771 collapsed = ipaddress.collapse_addresses([ip1, ip2])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001772 self.assertEqual(list(collapsed),
1773 [ipaddress.IPv4Network('1.1.0.0/23')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001774
1775 # test same IP networks
1776 ip_same1 = ip_same2 = ipaddress.IPv4Network('1.1.1.1/32')
1777 self.assertEqual(list(ipaddress.collapse_addresses(
1778 [ip_same1, ip_same2])),
1779 [ip_same1])
1780
1781 # test same IP addresses
1782 ip_same1 = ip_same2 = ipaddress.IPv4Address('1.1.1.1')
1783 self.assertEqual(list(ipaddress.collapse_addresses(
1784 [ip_same1, ip_same2])),
1785 [ipaddress.ip_network('1.1.1.1/32')])
1786 ip1 = ipaddress.IPv6Network('2001::/100')
1787 ip2 = ipaddress.IPv6Network('2001::/120')
1788 ip3 = ipaddress.IPv6Network('2001::/96')
1789 # test that ipv6 addresses are subsumed properly.
1790 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3])
1791 self.assertEqual(list(collapsed), [ip3])
1792
opavlyuk21da76d2020-02-26 16:33:57 +02001793 ip1 = ipaddress.IPv6Network('2001::%scope/100')
1794 ip2 = ipaddress.IPv6Network('2001::%scope/120')
1795 ip3 = ipaddress.IPv6Network('2001::%scope/96')
1796 # test that ipv6 addresses are subsumed properly.
1797 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3])
1798 self.assertEqual(list(collapsed), [ip3])
1799
Nick Coghlandc9b2552012-05-20 21:01:57 +10001800 # the toejam test
Hynek Schlawack35db5132012-06-01 20:12:17 +02001801 addr_tuples = [
1802 (ipaddress.ip_address('1.1.1.1'),
1803 ipaddress.ip_address('::1')),
1804 (ipaddress.IPv4Network('1.1.0.0/24'),
1805 ipaddress.IPv6Network('2001::/120')),
1806 (ipaddress.IPv4Network('1.1.0.0/32'),
1807 ipaddress.IPv6Network('2001::/128')),
1808 ]
1809 for ip1, ip2 in addr_tuples:
1810 self.assertRaises(TypeError, ipaddress.collapse_addresses,
1811 [ip1, ip2])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001812
opavlyuk21da76d2020-02-26 16:33:57 +02001813 addr_tuples = [
1814 (ipaddress.ip_address('1.1.1.1'),
1815 ipaddress.ip_address('::1%scope')),
1816 (ipaddress.IPv4Network('1.1.0.0/24'),
1817 ipaddress.IPv6Network('2001::%scope/120')),
1818 (ipaddress.IPv4Network('1.1.0.0/32'),
1819 ipaddress.IPv6Network('2001::%scope/128')),
1820 ]
1821 for ip1, ip2 in addr_tuples:
1822 self.assertRaises(TypeError, ipaddress.collapse_addresses,
1823 [ip1, ip2])
1824
Nick Coghlandc9b2552012-05-20 21:01:57 +10001825 def testSummarizing(self):
1826 #ip = ipaddress.ip_address
1827 #ipnet = ipaddress.ip_network
1828 summarize = ipaddress.summarize_address_range
1829 ip1 = ipaddress.ip_address('1.1.1.0')
1830 ip2 = ipaddress.ip_address('1.1.1.255')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001831
1832 # summarize works only for IPv4 & IPv6
1833 class IPv7Address(ipaddress.IPv6Address):
1834 @property
1835 def version(self):
1836 return 7
1837 ip_invalid1 = IPv7Address('::1')
1838 ip_invalid2 = IPv7Address('::1')
1839 self.assertRaises(ValueError, list,
1840 summarize(ip_invalid1, ip_invalid2))
1841 # test that a summary over ip4 & ip6 fails
1842 self.assertRaises(TypeError, list,
1843 summarize(ip1, ipaddress.IPv6Address('::1')))
opavlyuk21da76d2020-02-26 16:33:57 +02001844 self.assertRaises(TypeError, list,
1845 summarize(ip1, ipaddress.IPv6Address('::1%scope')))
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001846 # test a /24 is summarized properly
Nick Coghlandc9b2552012-05-20 21:01:57 +10001847 self.assertEqual(list(summarize(ip1, ip2))[0],
1848 ipaddress.ip_network('1.1.1.0/24'))
Martin Panter7462b6492015-11-02 03:37:02 +00001849 # test an IPv4 range that isn't on a network byte boundary
Nick Coghlandc9b2552012-05-20 21:01:57 +10001850 ip2 = ipaddress.ip_address('1.1.1.8')
1851 self.assertEqual(list(summarize(ip1, ip2)),
1852 [ipaddress.ip_network('1.1.1.0/29'),
1853 ipaddress.ip_network('1.1.1.8')])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001854 # all!
1855 ip1 = ipaddress.IPv4Address(0)
1856 ip2 = ipaddress.IPv4Address(ipaddress.IPv4Address._ALL_ONES)
1857 self.assertEqual([ipaddress.IPv4Network('0.0.0.0/0')],
1858 list(summarize(ip1, ip2)))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001859
1860 ip1 = ipaddress.ip_address('1::')
1861 ip2 = ipaddress.ip_address('1:ffff:ffff:ffff:ffff:ffff:ffff:ffff')
Martin Panter7462b6492015-11-02 03:37:02 +00001862 # test an IPv6 is summarized properly
Nick Coghlandc9b2552012-05-20 21:01:57 +10001863 self.assertEqual(list(summarize(ip1, ip2))[0],
1864 ipaddress.ip_network('1::/16'))
1865 # test an IPv6 range that isn't on a network byte boundary
1866 ip2 = ipaddress.ip_address('2::')
1867 self.assertEqual(list(summarize(ip1, ip2)),
1868 [ipaddress.ip_network('1::/16'),
1869 ipaddress.ip_network('2::/128')])
1870
opavlyuk21da76d2020-02-26 16:33:57 +02001871 ip1 = ipaddress.ip_address('1::%scope')
1872 ip2 = ipaddress.ip_address('1:ffff:ffff:ffff:ffff:ffff:ffff:ffff%scope')
1873 # test an IPv6 is summarized properly
1874 self.assertEqual(list(summarize(ip1, ip2))[0],
1875 ipaddress.ip_network('1::/16'))
1876 # test an IPv6 range that isn't on a network byte boundary
1877 ip2 = ipaddress.ip_address('2::%scope')
1878 self.assertEqual(list(summarize(ip1, ip2)),
1879 [ipaddress.ip_network('1::/16'),
1880 ipaddress.ip_network('2::/128')])
1881
Nick Coghlandc9b2552012-05-20 21:01:57 +10001882 # test exception raised when first is greater than last
1883 self.assertRaises(ValueError, list,
1884 summarize(ipaddress.ip_address('1.1.1.0'),
1885 ipaddress.ip_address('1.1.0.0')))
1886 # test exception raised when first and last aren't IP addresses
1887 self.assertRaises(TypeError, list,
1888 summarize(ipaddress.ip_network('1.1.1.0'),
1889 ipaddress.ip_network('1.1.0.0')))
1890 self.assertRaises(TypeError, list,
1891 summarize(ipaddress.ip_network('1.1.1.0'),
1892 ipaddress.ip_network('1.1.0.0')))
1893 # test exception raised when first and last are not same version
1894 self.assertRaises(TypeError, list,
1895 summarize(ipaddress.ip_address('::'),
1896 ipaddress.ip_network('1.1.0.0')))
1897
1898 def testAddressComparison(self):
1899 self.assertTrue(ipaddress.ip_address('1.1.1.1') <=
1900 ipaddress.ip_address('1.1.1.1'))
1901 self.assertTrue(ipaddress.ip_address('1.1.1.1') <=
1902 ipaddress.ip_address('1.1.1.2'))
1903 self.assertTrue(ipaddress.ip_address('::1') <=
1904 ipaddress.ip_address('::1'))
1905 self.assertTrue(ipaddress.ip_address('::1') <=
1906 ipaddress.ip_address('::2'))
opavlyuk21da76d2020-02-26 16:33:57 +02001907 self.assertTrue(ipaddress.ip_address('::1%scope') <=
1908 ipaddress.ip_address('::1%scope'))
1909 self.assertTrue(ipaddress.ip_address('::1%scope') <=
1910 ipaddress.ip_address('::2%scope'))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001911
Nick Coghlan3008ec02012-07-08 00:45:33 +10001912 def testInterfaceComparison(self):
s-sanjay7bd8d3e2017-03-31 23:09:53 -07001913 self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') ==
1914 ipaddress.ip_interface('1.1.1.1/24'))
1915 self.assertTrue(ipaddress.ip_interface('1.1.1.1/16') <
1916 ipaddress.ip_interface('1.1.1.1/24'))
1917 self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') <
1918 ipaddress.ip_interface('1.1.1.2/24'))
1919 self.assertTrue(ipaddress.ip_interface('1.1.1.2/16') <
1920 ipaddress.ip_interface('1.1.1.1/24'))
1921 self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') >
1922 ipaddress.ip_interface('1.1.1.1/16'))
1923 self.assertTrue(ipaddress.ip_interface('1.1.1.2/24') >
1924 ipaddress.ip_interface('1.1.1.1/24'))
1925 self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') >
1926 ipaddress.ip_interface('1.1.1.2/16'))
1927
1928 self.assertTrue(ipaddress.ip_interface('::1/64') ==
1929 ipaddress.ip_interface('::1/64'))
1930 self.assertTrue(ipaddress.ip_interface('::1/64') <
1931 ipaddress.ip_interface('::1/80'))
1932 self.assertTrue(ipaddress.ip_interface('::1/64') <
1933 ipaddress.ip_interface('::2/64'))
1934 self.assertTrue(ipaddress.ip_interface('::2/48') <
1935 ipaddress.ip_interface('::1/64'))
1936 self.assertTrue(ipaddress.ip_interface('::1/80') >
1937 ipaddress.ip_interface('::1/64'))
1938 self.assertTrue(ipaddress.ip_interface('::2/64') >
1939 ipaddress.ip_interface('::1/64'))
1940 self.assertTrue(ipaddress.ip_interface('::1/64') >
1941 ipaddress.ip_interface('::2/48'))
Nick Coghlan3008ec02012-07-08 00:45:33 +10001942
opavlyuk21da76d2020-02-26 16:33:57 +02001943 self.assertTrue(ipaddress.ip_interface('::1%scope/64') ==
1944 ipaddress.ip_interface('::1%scope/64'))
1945 self.assertTrue(ipaddress.ip_interface('::1%scope/64') <
1946 ipaddress.ip_interface('::1%scope/80'))
1947 self.assertTrue(ipaddress.ip_interface('::1%scope/64') <
1948 ipaddress.ip_interface('::2%scope/64'))
1949 self.assertTrue(ipaddress.ip_interface('::2%scope/48') <
1950 ipaddress.ip_interface('::1%scope/64'))
1951 self.assertTrue(ipaddress.ip_interface('::1%scope/80') >
1952 ipaddress.ip_interface('::1%scope/64'))
1953 self.assertTrue(ipaddress.ip_interface('::2%scope/64') >
1954 ipaddress.ip_interface('::1%scope/64'))
1955 self.assertTrue(ipaddress.ip_interface('::1%scope/64') >
1956 ipaddress.ip_interface('::2%scope/48'))
1957
1958
1959 self.assertFalse(ipaddress.ip_interface('::1%scope/64') ==
1960 ipaddress.ip_interface('::1/64'))
1961 self.assertTrue(ipaddress.ip_interface('::1%scope/64') <
1962 ipaddress.ip_interface('::1/80'))
1963 self.assertTrue(ipaddress.ip_interface('::1%scope/64') <
1964 ipaddress.ip_interface('::2/64'))
1965 self.assertTrue(ipaddress.ip_interface('::2%scope/48') <
1966 ipaddress.ip_interface('::1/64'))
1967 self.assertTrue(ipaddress.ip_interface('::1%scope/80') >
1968 ipaddress.ip_interface('::1/64'))
1969 self.assertTrue(ipaddress.ip_interface('::2%scope/64') >
1970 ipaddress.ip_interface('::1/64'))
1971 self.assertTrue(ipaddress.ip_interface('::1%scope/64') >
1972 ipaddress.ip_interface('::2/48'))
1973
1974 self.assertFalse(ipaddress.ip_interface('::1/64') ==
1975 ipaddress.ip_interface('::1%scope/64'))
1976 self.assertTrue(ipaddress.ip_interface('::1/64') <
1977 ipaddress.ip_interface('::1%scope/80'))
1978 self.assertTrue(ipaddress.ip_interface('::1/64') <
1979 ipaddress.ip_interface('::2%scope/64'))
1980 self.assertTrue(ipaddress.ip_interface('::2/48') <
1981 ipaddress.ip_interface('::1%scope/64'))
1982 self.assertTrue(ipaddress.ip_interface('::1/80') >
1983 ipaddress.ip_interface('::1%scope/64'))
1984 self.assertTrue(ipaddress.ip_interface('::2/64') >
1985 ipaddress.ip_interface('::1%scope/64'))
1986 self.assertTrue(ipaddress.ip_interface('::1/64') >
1987 ipaddress.ip_interface('::2%scope/48'))
1988
Nick Coghlandc9b2552012-05-20 21:01:57 +10001989 def testNetworkComparison(self):
1990 # ip1 and ip2 have the same network address
1991 ip1 = ipaddress.IPv4Network('1.1.1.0/24')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001992 ip2 = ipaddress.IPv4Network('1.1.1.0/32')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001993 ip3 = ipaddress.IPv4Network('1.1.2.0/24')
1994
1995 self.assertTrue(ip1 < ip3)
1996 self.assertTrue(ip3 > ip2)
1997
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001998 self.assertEqual(ip1.compare_networks(ip1), 0)
1999
2000 # if addresses are the same, sort by netmask
2001 self.assertEqual(ip1.compare_networks(ip2), -1)
2002 self.assertEqual(ip2.compare_networks(ip1), 1)
2003
Nick Coghlandc9b2552012-05-20 21:01:57 +10002004 self.assertEqual(ip1.compare_networks(ip3), -1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002005 self.assertEqual(ip3.compare_networks(ip1), 1)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002006 self.assertTrue(ip1._get_networks_key() < ip3._get_networks_key())
2007
2008 ip1 = ipaddress.IPv6Network('2001:2000::/96')
2009 ip2 = ipaddress.IPv6Network('2001:2001::/96')
2010 ip3 = ipaddress.IPv6Network('2001:ffff:2000::/96')
2011
2012 self.assertTrue(ip1 < ip3)
2013 self.assertTrue(ip3 > ip2)
2014 self.assertEqual(ip1.compare_networks(ip3), -1)
2015 self.assertTrue(ip1._get_networks_key() < ip3._get_networks_key())
2016
2017 # Test comparing different protocols.
2018 # Should always raise a TypeError.
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002019 self.assertRaises(TypeError,
2020 self.ipv4_network.compare_networks,
2021 self.ipv6_network)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002022 ipv6 = ipaddress.IPv6Interface('::/0')
2023 ipv4 = ipaddress.IPv4Interface('0.0.0.0/0')
2024 self.assertRaises(TypeError, ipv4.__lt__, ipv6)
2025 self.assertRaises(TypeError, ipv4.__gt__, ipv6)
2026 self.assertRaises(TypeError, ipv6.__lt__, ipv4)
2027 self.assertRaises(TypeError, ipv6.__gt__, ipv4)
2028
2029 # Regression test for issue 19.
2030 ip1 = ipaddress.ip_network('10.1.2.128/25')
2031 self.assertFalse(ip1 < ip1)
2032 self.assertFalse(ip1 > ip1)
2033 ip2 = ipaddress.ip_network('10.1.3.0/24')
2034 self.assertTrue(ip1 < ip2)
2035 self.assertFalse(ip2 < ip1)
2036 self.assertFalse(ip1 > ip2)
2037 self.assertTrue(ip2 > ip1)
2038 ip3 = ipaddress.ip_network('10.1.3.0/25')
2039 self.assertTrue(ip2 < ip3)
2040 self.assertFalse(ip3 < ip2)
2041 self.assertFalse(ip2 > ip3)
2042 self.assertTrue(ip3 > ip2)
2043
2044 # Regression test for issue 28.
2045 ip1 = ipaddress.ip_network('10.10.10.0/31')
2046 ip2 = ipaddress.ip_network('10.10.10.0')
2047 ip3 = ipaddress.ip_network('10.10.10.2/31')
2048 ip4 = ipaddress.ip_network('10.10.10.2')
2049 sorted = [ip1, ip2, ip3, ip4]
2050 unsorted = [ip2, ip4, ip1, ip3]
2051 unsorted.sort()
2052 self.assertEqual(sorted, unsorted)
2053 unsorted = [ip4, ip1, ip3, ip2]
2054 unsorted.sort()
2055 self.assertEqual(sorted, unsorted)
Serhiy Storchakaf186e122015-01-26 10:11:16 +02002056 self.assertIs(ip1.__lt__(ipaddress.ip_address('10.10.10.0')),
2057 NotImplemented)
2058 self.assertIs(ip2.__lt__(ipaddress.ip_address('10.10.10.0')),
2059 NotImplemented)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002060
2061 # <=, >=
2062 self.assertTrue(ipaddress.ip_network('1.1.1.1') <=
2063 ipaddress.ip_network('1.1.1.1'))
2064 self.assertTrue(ipaddress.ip_network('1.1.1.1') <=
2065 ipaddress.ip_network('1.1.1.2'))
2066 self.assertFalse(ipaddress.ip_network('1.1.1.2') <=
2067 ipaddress.ip_network('1.1.1.1'))
opavlyuk21da76d2020-02-26 16:33:57 +02002068
Nick Coghlandc9b2552012-05-20 21:01:57 +10002069 self.assertTrue(ipaddress.ip_network('::1') <=
2070 ipaddress.ip_network('::1'))
2071 self.assertTrue(ipaddress.ip_network('::1') <=
2072 ipaddress.ip_network('::2'))
2073 self.assertFalse(ipaddress.ip_network('::2') <=
2074 ipaddress.ip_network('::1'))
2075
2076 def testStrictNetworks(self):
2077 self.assertRaises(ValueError, ipaddress.ip_network, '192.168.1.1/24')
2078 self.assertRaises(ValueError, ipaddress.ip_network, '::1/120')
opavlyuk21da76d2020-02-26 16:33:57 +02002079 self.assertRaises(ValueError, ipaddress.ip_network, '::1%scope/120')
Nick Coghlandc9b2552012-05-20 21:01:57 +10002080
2081 def testOverlaps(self):
2082 other = ipaddress.IPv4Network('1.2.3.0/30')
2083 other2 = ipaddress.IPv4Network('1.2.2.0/24')
2084 other3 = ipaddress.IPv4Network('1.2.2.64/26')
2085 self.assertTrue(self.ipv4_network.overlaps(other))
2086 self.assertFalse(self.ipv4_network.overlaps(other2))
2087 self.assertTrue(other2.overlaps(other3))
2088
2089 def testEmbeddedIpv4(self):
2090 ipv4_string = '192.168.0.1'
2091 ipv4 = ipaddress.IPv4Interface(ipv4_string)
2092 v4compat_ipv6 = ipaddress.IPv6Interface('::%s' % ipv4_string)
2093 self.assertEqual(int(v4compat_ipv6.ip), int(ipv4.ip))
2094 v4mapped_ipv6 = ipaddress.IPv6Interface('::ffff:%s' % ipv4_string)
2095 self.assertNotEqual(v4mapped_ipv6.ip, ipv4.ip)
2096 self.assertRaises(ipaddress.AddressValueError, ipaddress.IPv6Interface,
2097 '2001:1.1.1.1:1.1.1.1')
2098
2099 # Issue 67: IPv6 with embedded IPv4 address not recognized.
2100 def testIPv6AddressTooLarge(self):
2101 # RFC4291 2.5.5.2
2102 self.assertEqual(ipaddress.ip_address('::FFFF:192.0.2.1'),
2103 ipaddress.ip_address('::FFFF:c000:201'))
2104 # RFC4291 2.2 (part 3) x::d.d.d.d
2105 self.assertEqual(ipaddress.ip_address('FFFF::192.0.2.1'),
2106 ipaddress.ip_address('FFFF::c000:201'))
2107
opavlyuk21da76d2020-02-26 16:33:57 +02002108 self.assertEqual(ipaddress.ip_address('::FFFF:192.0.2.1%scope'),
2109 ipaddress.ip_address('::FFFF:c000:201%scope'))
2110 self.assertEqual(ipaddress.ip_address('FFFF::192.0.2.1%scope'),
2111 ipaddress.ip_address('FFFF::c000:201%scope'))
2112 self.assertNotEqual(ipaddress.ip_address('::FFFF:192.0.2.1%scope'),
2113 ipaddress.ip_address('::FFFF:c000:201'))
2114 self.assertNotEqual(ipaddress.ip_address('FFFF::192.0.2.1%scope'),
2115 ipaddress.ip_address('FFFF::c000:201'))
2116 self.assertNotEqual(ipaddress.ip_address('::FFFF:192.0.2.1'),
2117 ipaddress.ip_address('::FFFF:c000:201%scope'))
2118 self.assertNotEqual(ipaddress.ip_address('FFFF::192.0.2.1'),
2119 ipaddress.ip_address('FFFF::c000:201%scope'))
2120
Nick Coghlandc9b2552012-05-20 21:01:57 +10002121 def testIPVersion(self):
2122 self.assertEqual(self.ipv4_address.version, 4)
2123 self.assertEqual(self.ipv6_address.version, 6)
opavlyuk21da76d2020-02-26 16:33:57 +02002124 self.assertEqual(self.ipv6_scoped_address.version, 6)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002125
2126 def testMaxPrefixLength(self):
2127 self.assertEqual(self.ipv4_interface.max_prefixlen, 32)
2128 self.assertEqual(self.ipv6_interface.max_prefixlen, 128)
opavlyuk21da76d2020-02-26 16:33:57 +02002129 self.assertEqual(self.ipv6_scoped_interface.max_prefixlen, 128)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002130
2131 def testPacked(self):
2132 self.assertEqual(self.ipv4_address.packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10002133 b'\x01\x02\x03\x04')
Nick Coghlandc9b2552012-05-20 21:01:57 +10002134 self.assertEqual(ipaddress.IPv4Interface('255.254.253.252').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10002135 b'\xff\xfe\xfd\xfc')
Nick Coghlandc9b2552012-05-20 21:01:57 +10002136 self.assertEqual(self.ipv6_address.packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10002137 b'\x20\x01\x06\x58\x02\x2a\xca\xfe'
2138 b'\x02\x00\x00\x00\x00\x00\x00\x01')
Nick Coghlandc9b2552012-05-20 21:01:57 +10002139 self.assertEqual(ipaddress.IPv6Interface('ffff:2:3:4:ffff::').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10002140 b'\xff\xff\x00\x02\x00\x03\x00\x04\xff\xff'
2141 + b'\x00' * 6)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002142 self.assertEqual(ipaddress.IPv6Interface('::1:0:0:0:0').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10002143 b'\x00' * 6 + b'\x00\x01' + b'\x00' * 8)
opavlyuk21da76d2020-02-26 16:33:57 +02002144 self.assertEqual(self.ipv6_scoped_address.packed,
2145 b'\x20\x01\x06\x58\x02\x2a\xca\xfe'
2146 b'\x02\x00\x00\x00\x00\x00\x00\x01')
2147 self.assertEqual(ipaddress.IPv6Interface('ffff:2:3:4:ffff::%scope').packed,
2148 b'\xff\xff\x00\x02\x00\x03\x00\x04\xff\xff'
2149 + b'\x00' * 6)
2150 self.assertEqual(ipaddress.IPv6Interface('::1:0:0:0:0%scope').packed,
2151 b'\x00' * 6 + b'\x00\x01' + b'\x00' * 8)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002152
Nick Coghlandc9b2552012-05-20 21:01:57 +10002153 def testIpType(self):
2154 ipv4net = ipaddress.ip_network('1.2.3.4')
2155 ipv4addr = ipaddress.ip_address('1.2.3.4')
2156 ipv6net = ipaddress.ip_network('::1.2.3.4')
2157 ipv6addr = ipaddress.ip_address('::1.2.3.4')
2158 self.assertEqual(ipaddress.IPv4Network, type(ipv4net))
2159 self.assertEqual(ipaddress.IPv4Address, type(ipv4addr))
2160 self.assertEqual(ipaddress.IPv6Network, type(ipv6net))
2161 self.assertEqual(ipaddress.IPv6Address, type(ipv6addr))
2162
2163 def testReservedIpv4(self):
2164 # test networks
2165 self.assertEqual(True, ipaddress.ip_interface(
2166 '224.1.1.1/31').is_multicast)
2167 self.assertEqual(False, ipaddress.ip_network('240.0.0.0').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002168 self.assertEqual(True, ipaddress.ip_network('240.0.0.0').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002169
2170 self.assertEqual(True, ipaddress.ip_interface(
2171 '192.168.1.1/17').is_private)
2172 self.assertEqual(False, ipaddress.ip_network('192.169.0.0').is_private)
2173 self.assertEqual(True, ipaddress.ip_network(
2174 '10.255.255.255').is_private)
2175 self.assertEqual(False, ipaddress.ip_network('11.0.0.0').is_private)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002176 self.assertEqual(False, ipaddress.ip_network('11.0.0.0').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002177 self.assertEqual(True, ipaddress.ip_network(
2178 '172.31.255.255').is_private)
2179 self.assertEqual(False, ipaddress.ip_network('172.32.0.0').is_private)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002180 self.assertEqual(True,
2181 ipaddress.ip_network('169.254.1.0/24').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002182
2183 self.assertEqual(True,
2184 ipaddress.ip_interface(
2185 '169.254.100.200/24').is_link_local)
2186 self.assertEqual(False,
2187 ipaddress.ip_interface(
2188 '169.255.100.200/24').is_link_local)
2189
2190 self.assertEqual(True,
2191 ipaddress.ip_network(
2192 '127.100.200.254/32').is_loopback)
2193 self.assertEqual(True, ipaddress.ip_network(
2194 '127.42.0.0/16').is_loopback)
2195 self.assertEqual(False, ipaddress.ip_network('128.0.0.0').is_loopback)
Peter Moodye5019d52013-10-24 09:47:10 -07002196 self.assertEqual(False,
2197 ipaddress.ip_network('100.64.0.0/10').is_private)
Peter Moodybe9c1b12013-10-22 12:36:21 -07002198 self.assertEqual(False, ipaddress.ip_network('100.64.0.0/10').is_global)
Peter Moodye5019d52013-10-24 09:47:10 -07002199
Peter Moody22c31762013-10-21 13:58:06 -07002200 self.assertEqual(True,
2201 ipaddress.ip_network('192.0.2.128/25').is_private)
2202 self.assertEqual(True,
2203 ipaddress.ip_network('192.0.3.0/24').is_global)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002204
2205 # test addresses
Hynek Schlawackbcd30442012-06-04 14:19:39 +02002206 self.assertEqual(True, ipaddress.ip_address('0.0.0.0').is_unspecified)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002207 self.assertEqual(True, ipaddress.ip_address('224.1.1.1').is_multicast)
2208 self.assertEqual(False, ipaddress.ip_address('240.0.0.0').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002209 self.assertEqual(True, ipaddress.ip_address('240.0.0.1').is_reserved)
2210 self.assertEqual(False,
2211 ipaddress.ip_address('239.255.255.255').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002212
2213 self.assertEqual(True, ipaddress.ip_address('192.168.1.1').is_private)
2214 self.assertEqual(False, ipaddress.ip_address('192.169.0.0').is_private)
2215 self.assertEqual(True, ipaddress.ip_address(
2216 '10.255.255.255').is_private)
2217 self.assertEqual(False, ipaddress.ip_address('11.0.0.0').is_private)
2218 self.assertEqual(True, ipaddress.ip_address(
2219 '172.31.255.255').is_private)
2220 self.assertEqual(False, ipaddress.ip_address('172.32.0.0').is_private)
2221
2222 self.assertEqual(True,
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002223 ipaddress.ip_address('169.254.100.200').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002224 self.assertEqual(False,
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002225 ipaddress.ip_address('169.255.100.200').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002226
Berker Peksag742192a2016-06-11 22:11:47 +03002227 self.assertTrue(ipaddress.ip_address('192.0.7.1').is_global)
2228 self.assertFalse(ipaddress.ip_address('203.0.113.1').is_global)
2229
Nick Coghlandc9b2552012-05-20 21:01:57 +10002230 self.assertEqual(True,
2231 ipaddress.ip_address('127.100.200.254').is_loopback)
2232 self.assertEqual(True, ipaddress.ip_address('127.42.0.0').is_loopback)
2233 self.assertEqual(False, ipaddress.ip_address('128.0.0.0').is_loopback)
2234 self.assertEqual(True, ipaddress.ip_network('0.0.0.0').is_unspecified)
2235
2236 def testReservedIpv6(self):
2237
2238 self.assertEqual(True, ipaddress.ip_network('ffff::').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002239 self.assertEqual(True, ipaddress.ip_network(2**128 - 1).is_multicast)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002240 self.assertEqual(True, ipaddress.ip_network('ff00::').is_multicast)
2241 self.assertEqual(False, ipaddress.ip_network('fdff::').is_multicast)
2242
2243 self.assertEqual(True, ipaddress.ip_network('fecf::').is_site_local)
2244 self.assertEqual(True, ipaddress.ip_network(
2245 'feff:ffff:ffff:ffff::').is_site_local)
2246 self.assertEqual(False, ipaddress.ip_network(
2247 'fbf:ffff::').is_site_local)
2248 self.assertEqual(False, ipaddress.ip_network('ff00::').is_site_local)
2249
2250 self.assertEqual(True, ipaddress.ip_network('fc00::').is_private)
2251 self.assertEqual(True, ipaddress.ip_network(
2252 'fc00:ffff:ffff:ffff::').is_private)
2253 self.assertEqual(False, ipaddress.ip_network('fbff:ffff::').is_private)
2254 self.assertEqual(False, ipaddress.ip_network('fe00::').is_private)
2255
2256 self.assertEqual(True, ipaddress.ip_network('fea0::').is_link_local)
2257 self.assertEqual(True, ipaddress.ip_network(
2258 'febf:ffff::').is_link_local)
2259 self.assertEqual(False, ipaddress.ip_network(
2260 'fe7f:ffff::').is_link_local)
2261 self.assertEqual(False, ipaddress.ip_network('fec0::').is_link_local)
2262
2263 self.assertEqual(True, ipaddress.ip_interface('0:0::0:01').is_loopback)
2264 self.assertEqual(False, ipaddress.ip_interface('::1/127').is_loopback)
2265 self.assertEqual(False, ipaddress.ip_network('::').is_loopback)
2266 self.assertEqual(False, ipaddress.ip_network('::2').is_loopback)
2267
2268 self.assertEqual(True, ipaddress.ip_network('0::0').is_unspecified)
2269 self.assertEqual(False, ipaddress.ip_network('::1').is_unspecified)
2270 self.assertEqual(False, ipaddress.ip_network('::/127').is_unspecified)
2271
Peter Moody22c31762013-10-21 13:58:06 -07002272 self.assertEqual(True,
2273 ipaddress.ip_network('2001::1/128').is_private)
2274 self.assertEqual(True,
2275 ipaddress.ip_network('200::1/128').is_global)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002276 # test addresses
2277 self.assertEqual(True, ipaddress.ip_address('ffff::').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002278 self.assertEqual(True, ipaddress.ip_address(2**128 - 1).is_multicast)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002279 self.assertEqual(True, ipaddress.ip_address('ff00::').is_multicast)
2280 self.assertEqual(False, ipaddress.ip_address('fdff::').is_multicast)
2281
2282 self.assertEqual(True, ipaddress.ip_address('fecf::').is_site_local)
2283 self.assertEqual(True, ipaddress.ip_address(
2284 'feff:ffff:ffff:ffff::').is_site_local)
2285 self.assertEqual(False, ipaddress.ip_address(
2286 'fbf:ffff::').is_site_local)
2287 self.assertEqual(False, ipaddress.ip_address('ff00::').is_site_local)
2288
2289 self.assertEqual(True, ipaddress.ip_address('fc00::').is_private)
2290 self.assertEqual(True, ipaddress.ip_address(
2291 'fc00:ffff:ffff:ffff::').is_private)
2292 self.assertEqual(False, ipaddress.ip_address('fbff:ffff::').is_private)
2293 self.assertEqual(False, ipaddress.ip_address('fe00::').is_private)
2294
2295 self.assertEqual(True, ipaddress.ip_address('fea0::').is_link_local)
2296 self.assertEqual(True, ipaddress.ip_address(
2297 'febf:ffff::').is_link_local)
2298 self.assertEqual(False, ipaddress.ip_address(
2299 'fe7f:ffff::').is_link_local)
2300 self.assertEqual(False, ipaddress.ip_address('fec0::').is_link_local)
2301
2302 self.assertEqual(True, ipaddress.ip_address('0:0::0:01').is_loopback)
2303 self.assertEqual(True, ipaddress.ip_address('::1').is_loopback)
2304 self.assertEqual(False, ipaddress.ip_address('::2').is_loopback)
2305
2306 self.assertEqual(True, ipaddress.ip_address('0::0').is_unspecified)
2307 self.assertEqual(False, ipaddress.ip_address('::1').is_unspecified)
2308
2309 # some generic IETF reserved addresses
2310 self.assertEqual(True, ipaddress.ip_address('100::').is_reserved)
2311 self.assertEqual(True, ipaddress.ip_network('4000::1/128').is_reserved)
2312
2313 def testIpv4Mapped(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002314 self.assertEqual(
2315 ipaddress.ip_address('::ffff:192.168.1.1').ipv4_mapped,
2316 ipaddress.ip_address('192.168.1.1'))
Nick Coghlandc9b2552012-05-20 21:01:57 +10002317 self.assertEqual(ipaddress.ip_address('::c0a8:101').ipv4_mapped, None)
2318 self.assertEqual(ipaddress.ip_address('::ffff:c0a8:101').ipv4_mapped,
2319 ipaddress.ip_address('192.168.1.1'))
2320
2321 def testAddrExclude(self):
2322 addr1 = ipaddress.ip_network('10.1.1.0/24')
2323 addr2 = ipaddress.ip_network('10.1.1.0/26')
2324 addr3 = ipaddress.ip_network('10.2.1.0/24')
2325 addr4 = ipaddress.ip_address('10.1.1.0')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002326 addr5 = ipaddress.ip_network('2001:db8::0/32')
Serhiy Storchakabb0dbd52016-03-01 10:25:45 +02002327 addr6 = ipaddress.ip_network('10.1.1.5/32')
Nick Coghlandc9b2552012-05-20 21:01:57 +10002328 self.assertEqual(sorted(list(addr1.address_exclude(addr2))),
2329 [ipaddress.ip_network('10.1.1.64/26'),
2330 ipaddress.ip_network('10.1.1.128/25')])
2331 self.assertRaises(ValueError, list, addr1.address_exclude(addr3))
2332 self.assertRaises(TypeError, list, addr1.address_exclude(addr4))
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002333 self.assertRaises(TypeError, list, addr1.address_exclude(addr5))
Nick Coghlandc9b2552012-05-20 21:01:57 +10002334 self.assertEqual(list(addr1.address_exclude(addr1)), [])
Serhiy Storchakabb0dbd52016-03-01 10:25:45 +02002335 self.assertEqual(sorted(list(addr1.address_exclude(addr6))),
2336 [ipaddress.ip_network('10.1.1.0/30'),
2337 ipaddress.ip_network('10.1.1.4/32'),
2338 ipaddress.ip_network('10.1.1.6/31'),
2339 ipaddress.ip_network('10.1.1.8/29'),
2340 ipaddress.ip_network('10.1.1.16/28'),
2341 ipaddress.ip_network('10.1.1.32/27'),
2342 ipaddress.ip_network('10.1.1.64/26'),
2343 ipaddress.ip_network('10.1.1.128/25')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10002344
2345 def testHash(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002346 self.assertEqual(hash(ipaddress.ip_interface('10.1.1.0/24')),
2347 hash(ipaddress.ip_interface('10.1.1.0/24')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10002348 self.assertEqual(hash(ipaddress.ip_network('10.1.1.0/24')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002349 hash(ipaddress.ip_network('10.1.1.0/24')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10002350 self.assertEqual(hash(ipaddress.ip_address('10.1.1.0')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002351 hash(ipaddress.ip_address('10.1.1.0')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10002352 # i70
2353 self.assertEqual(hash(ipaddress.ip_address('1.2.3.4')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002354 hash(ipaddress.ip_address(
Nick Coghlandc9b2552012-05-20 21:01:57 +10002355 int(ipaddress.ip_address('1.2.3.4')._ip))))
2356 ip1 = ipaddress.ip_address('10.1.1.0')
2357 ip2 = ipaddress.ip_address('1::')
2358 dummy = {}
2359 dummy[self.ipv4_address] = None
2360 dummy[self.ipv6_address] = None
2361 dummy[ip1] = None
2362 dummy[ip2] = None
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02002363 self.assertIn(self.ipv4_address, dummy)
2364 self.assertIn(ip2, dummy)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002365
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002366 def testIPBases(self):
2367 net = self.ipv4_network
2368 self.assertEqual('1.2.3.0/24', net.compressed)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002369 net = self.ipv6_network
2370 self.assertRaises(ValueError, net._string_from_ip_int, 2**128 + 1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002371
Hynek Schlawack454a74d2012-06-04 18:14:02 +02002372 def testIPv6NetworkHelpers(self):
2373 net = self.ipv6_network
2374 self.assertEqual('2001:658:22a:cafe::/64', net.with_prefixlen)
2375 self.assertEqual('2001:658:22a:cafe::/ffff:ffff:ffff:ffff::',
2376 net.with_netmask)
2377 self.assertEqual('2001:658:22a:cafe::/::ffff:ffff:ffff:ffff',
2378 net.with_hostmask)
2379 self.assertEqual('2001:658:22a:cafe::/64', str(net))
2380
2381 def testIPv4NetworkHelpers(self):
2382 net = self.ipv4_network
2383 self.assertEqual('1.2.3.0/24', net.with_prefixlen)
2384 self.assertEqual('1.2.3.0/255.255.255.0', net.with_netmask)
2385 self.assertEqual('1.2.3.0/0.0.0.255', net.with_hostmask)
2386 self.assertEqual('1.2.3.0/24', str(net))
2387
Nick Coghlandc9b2552012-05-20 21:01:57 +10002388 def testCopyConstructor(self):
2389 addr1 = ipaddress.ip_network('10.1.1.0/24')
2390 addr2 = ipaddress.ip_network(addr1)
2391 addr3 = ipaddress.ip_interface('2001:658:22a:cafe:200::1/64')
2392 addr4 = ipaddress.ip_interface(addr3)
2393 addr5 = ipaddress.IPv4Address('1.1.1.1')
2394 addr6 = ipaddress.IPv6Address('2001:658:22a:cafe:200::1')
2395
2396 self.assertEqual(addr1, addr2)
2397 self.assertEqual(addr3, addr4)
2398 self.assertEqual(addr5, ipaddress.IPv4Address(addr5))
2399 self.assertEqual(addr6, ipaddress.IPv6Address(addr6))
2400
2401 def testCompressIPv6Address(self):
2402 test_addresses = {
2403 '1:2:3:4:5:6:7:8': '1:2:3:4:5:6:7:8/128',
2404 '2001:0:0:4:0:0:0:8': '2001:0:0:4::8/128',
2405 '2001:0:0:4:5:6:7:8': '2001::4:5:6:7:8/128',
2406 '2001:0:3:4:5:6:7:8': '2001:0:3:4:5:6:7:8/128',
Nick Coghlandc9b2552012-05-20 21:01:57 +10002407 '0:0:3:0:0:0:0:ffff': '0:0:3::ffff/128',
2408 '0:0:0:4:0:0:0:ffff': '::4:0:0:0:ffff/128',
2409 '0:0:0:0:5:0:0:ffff': '::5:0:0:ffff/128',
2410 '1:0:0:4:0:0:7:8': '1::4:0:0:7:8/128',
2411 '0:0:0:0:0:0:0:0': '::/128',
2412 '0:0:0:0:0:0:0:0/0': '::/0',
2413 '0:0:0:0:0:0:0:1': '::1/128',
2414 '2001:0658:022a:cafe:0000:0000:0000:0000/66':
2415 '2001:658:22a:cafe::/66',
2416 '::1.2.3.4': '::102:304/128',
2417 '1:2:3:4:5:ffff:1.2.3.4': '1:2:3:4:5:ffff:102:304/128',
2418 '::7:6:5:4:3:2:1': '0:7:6:5:4:3:2:1/128',
2419 '::7:6:5:4:3:2:0': '0:7:6:5:4:3:2:0/128',
2420 '7:6:5:4:3:2:1::': '7:6:5:4:3:2:1:0/128',
2421 '0:6:5:4:3:2:1::': '0:6:5:4:3:2:1:0/128',
2422 }
2423 for uncompressed, compressed in list(test_addresses.items()):
2424 self.assertEqual(compressed, str(ipaddress.IPv6Interface(
2425 uncompressed)))
2426
2427 def testExplodeShortHandIpStr(self):
2428 addr1 = ipaddress.IPv6Interface('2001::1')
2429 addr2 = ipaddress.IPv6Address('2001:0:5ef5:79fd:0:59d:a0e5:ba1')
2430 addr3 = ipaddress.IPv6Network('2001::/96')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002431 addr4 = ipaddress.IPv4Address('192.168.178.1')
Nick Coghlandc9b2552012-05-20 21:01:57 +10002432 self.assertEqual('2001:0000:0000:0000:0000:0000:0000:0001/128',
2433 addr1.exploded)
2434 self.assertEqual('0000:0000:0000:0000:0000:0000:0000:0001/128',
2435 ipaddress.IPv6Interface('::1/128').exploded)
2436 # issue 77
2437 self.assertEqual('2001:0000:5ef5:79fd:0000:059d:a0e5:0ba1',
2438 addr2.exploded)
2439 self.assertEqual('2001:0000:0000:0000:0000:0000:0000:0000/96',
2440 addr3.exploded)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002441 self.assertEqual('192.168.178.1', addr4.exploded)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002442
Eric V. Smithebdaaf42014-04-14 12:58:07 -04002443 def testReversePointer(self):
2444 addr1 = ipaddress.IPv4Address('127.0.0.1')
2445 addr2 = ipaddress.IPv6Address('2001:db8::1')
2446 self.assertEqual('1.0.0.127.in-addr.arpa', addr1.reverse_pointer)
2447 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.' +
2448 'b.d.0.1.0.0.2.ip6.arpa',
2449 addr2.reverse_pointer)
2450
Nick Coghlandc9b2552012-05-20 21:01:57 +10002451 def testIntRepresentation(self):
2452 self.assertEqual(16909060, int(self.ipv4_address))
2453 self.assertEqual(42540616829182469433547762482097946625,
2454 int(self.ipv6_address))
2455
Nick Coghlandc9b2552012-05-20 21:01:57 +10002456 def testForceVersion(self):
2457 self.assertEqual(ipaddress.ip_network(1).version, 4)
Nick Coghlan51c30672012-05-27 00:25:58 +10002458 self.assertEqual(ipaddress.IPv6Network(1).version, 6)
Sandro Tosi876ecad2012-05-23 22:26:55 +02002459
Nick Coghlandc9b2552012-05-20 21:01:57 +10002460 def testWithStar(self):
Nick Coghlana8517ad2012-08-20 10:04:26 +10002461 self.assertEqual(self.ipv4_interface.with_prefixlen, "1.2.3.4/24")
2462 self.assertEqual(self.ipv4_interface.with_netmask,
Nick Coghlandc9b2552012-05-20 21:01:57 +10002463 "1.2.3.4/255.255.255.0")
Nick Coghlana8517ad2012-08-20 10:04:26 +10002464 self.assertEqual(self.ipv4_interface.with_hostmask,
Nick Coghlandc9b2552012-05-20 21:01:57 +10002465 "1.2.3.4/0.0.0.255")
2466
Nick Coghlana8517ad2012-08-20 10:04:26 +10002467 self.assertEqual(self.ipv6_interface.with_prefixlen,
Nick Coghlandc9b2552012-05-20 21:01:57 +10002468 '2001:658:22a:cafe:200::1/64')
Nick Coghlana8517ad2012-08-20 10:04:26 +10002469 self.assertEqual(self.ipv6_interface.with_netmask,
2470 '2001:658:22a:cafe:200::1/ffff:ffff:ffff:ffff::')
Nick Coghlandc9b2552012-05-20 21:01:57 +10002471 # this probably don't make much sense, but it's included for
2472 # compatibility with ipv4
Nick Coghlana8517ad2012-08-20 10:04:26 +10002473 self.assertEqual(self.ipv6_interface.with_hostmask,
Nick Coghlandc9b2552012-05-20 21:01:57 +10002474 '2001:658:22a:cafe:200::1/::ffff:ffff:ffff:ffff')
2475
2476 def testNetworkElementCaching(self):
2477 # V4 - make sure we're empty
Inada Naoki2430d532019-04-15 16:01:00 +09002478 self.assertNotIn('broadcast_address', self.ipv4_network.__dict__)
2479 self.assertNotIn('hostmask', self.ipv4_network.__dict__)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002480
2481 # V4 - populate and test
Nick Coghlandc9b2552012-05-20 21:01:57 +10002482 self.assertEqual(self.ipv4_network.broadcast_address,
2483 ipaddress.IPv4Address('1.2.3.255'))
2484 self.assertEqual(self.ipv4_network.hostmask,
2485 ipaddress.IPv4Address('0.0.0.255'))
2486
2487 # V4 - check we're cached
Inada Naoki2430d532019-04-15 16:01:00 +09002488 self.assertIn('broadcast_address', self.ipv4_network.__dict__)
2489 self.assertIn('hostmask', self.ipv4_network.__dict__)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002490
2491 # V6 - make sure we're empty
Inada Naoki2430d532019-04-15 16:01:00 +09002492 self.assertNotIn('broadcast_address', self.ipv6_network.__dict__)
2493 self.assertNotIn('hostmask', self.ipv6_network.__dict__)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002494
2495 # V6 - populate and test
2496 self.assertEqual(self.ipv6_network.network_address,
2497 ipaddress.IPv6Address('2001:658:22a:cafe::'))
2498 self.assertEqual(self.ipv6_interface.network.network_address,
2499 ipaddress.IPv6Address('2001:658:22a:cafe::'))
2500
2501 self.assertEqual(
2502 self.ipv6_network.broadcast_address,
2503 ipaddress.IPv6Address('2001:658:22a:cafe:ffff:ffff:ffff:ffff'))
2504 self.assertEqual(self.ipv6_network.hostmask,
2505 ipaddress.IPv6Address('::ffff:ffff:ffff:ffff'))
2506 self.assertEqual(
2507 self.ipv6_interface.network.broadcast_address,
2508 ipaddress.IPv6Address('2001:658:22a:cafe:ffff:ffff:ffff:ffff'))
2509 self.assertEqual(self.ipv6_interface.network.hostmask,
2510 ipaddress.IPv6Address('::ffff:ffff:ffff:ffff'))
2511
2512 # V6 - check we're cached
Inada Naoki2430d532019-04-15 16:01:00 +09002513 self.assertIn('broadcast_address', self.ipv6_network.__dict__)
2514 self.assertIn('hostmask', self.ipv6_network.__dict__)
2515 self.assertIn('broadcast_address', self.ipv6_interface.network.__dict__)
2516 self.assertIn('hostmask', self.ipv6_interface.network.__dict__)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002517
2518 def testTeredo(self):
2519 # stolen from wikipedia
2520 server = ipaddress.IPv4Address('65.54.227.120')
2521 client = ipaddress.IPv4Address('192.0.2.45')
2522 teredo_addr = '2001:0000:4136:e378:8000:63bf:3fff:fdd2'
2523 self.assertEqual((server, client),
2524 ipaddress.ip_address(teredo_addr).teredo)
2525 bad_addr = '2000::4136:e378:8000:63bf:3fff:fdd2'
2526 self.assertFalse(ipaddress.ip_address(bad_addr).teredo)
2527 bad_addr = '2001:0001:4136:e378:8000:63bf:3fff:fdd2'
2528 self.assertFalse(ipaddress.ip_address(bad_addr).teredo)
2529
2530 # i77
2531 teredo_addr = ipaddress.IPv6Address('2001:0:5ef5:79fd:0:59d:a0e5:ba1')
2532 self.assertEqual((ipaddress.IPv4Address('94.245.121.253'),
2533 ipaddress.IPv4Address('95.26.244.94')),
2534 teredo_addr.teredo)
2535
Nick Coghlandc9b2552012-05-20 21:01:57 +10002536 def testsixtofour(self):
2537 sixtofouraddr = ipaddress.ip_address('2002:ac1d:2d64::1')
2538 bad_addr = ipaddress.ip_address('2000:ac1d:2d64::1')
2539 self.assertEqual(ipaddress.IPv4Address('172.29.45.100'),
2540 sixtofouraddr.sixtofour)
2541 self.assertFalse(bad_addr.sixtofour)
2542
Nick Coghlandc9b2552012-05-20 21:01:57 +10002543
2544if __name__ == '__main__':
2545 unittest.main()