blob: 3a59a6102f4c503039dbbfe9a7b29cf5dc07688b [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
173
Nick Coghlan07c4e332012-07-08 23:06:45 +1000174class AddressTestCase_v4(BaseTestCase, CommonTestMixin_v4):
Nick Coghlan297b1432012-07-08 17:11:04 +1000175 factory = ipaddress.IPv4Address
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000176
ewosbornef9c95a42019-09-12 05:03:31 -0400177 def test_format(self):
178 v4 = ipaddress.IPv4Address("1.2.3.42")
179 v4_pairs = [
180 ("b" ,"00000001000000100000001100101010"),
181 ("n" ,"00000001000000100000001100101010"),
182 ("x" ,"0102032a"),
183 ("X" ,"0102032A"),
184 ("_b" ,"0000_0001_0000_0010_0000_0011_0010_1010"),
185 ("_n" ,"0000_0001_0000_0010_0000_0011_0010_1010"),
186 ("_x" ,"0102_032a"),
187 ("_X" ,"0102_032A"),
188 ("#b" ,"0b00000001000000100000001100101010"),
189 ("#n" ,"0b00000001000000100000001100101010"),
190 ("#x" ,"0x0102032a"),
191 ("#X" ,"0X0102032A"),
192 ("#_b" ,"0b0000_0001_0000_0010_0000_0011_0010_1010"),
193 ("#_n" ,"0b0000_0001_0000_0010_0000_0011_0010_1010"),
194 ("#_x" ,"0x0102_032a"),
195 ("#_X" ,"0X0102_032A"),
196 ("s" ,"1.2.3.42"),
197 ("" ,"1.2.3.42"),
198 ]
199 for (fmt, txt) in v4_pairs:
200 self.assertEqual(txt, format(v4, fmt))
201
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000202 def test_network_passed_as_address(self):
203 addr = "127.0.0.1/24"
204 with self.assertAddressError("Unexpected '/' in %r", addr):
205 ipaddress.IPv4Address(addr)
206
207 def test_bad_address_split(self):
208 def assertBadSplit(addr):
209 with self.assertAddressError("Expected 4 octets in %r", addr):
210 ipaddress.IPv4Address(addr)
211
212 assertBadSplit("127.0.1")
213 assertBadSplit("42.42.42.42.42")
214 assertBadSplit("42.42.42")
215 assertBadSplit("42.42")
216 assertBadSplit("42")
217 assertBadSplit("42..42.42.42")
218 assertBadSplit("42.42.42.42.")
219 assertBadSplit("42.42.42.42...")
220 assertBadSplit(".42.42.42.42")
221 assertBadSplit("...42.42.42.42")
222 assertBadSplit("016.016.016")
223 assertBadSplit("016.016")
224 assertBadSplit("016")
225 assertBadSplit("000")
226 assertBadSplit("0x0a.0x0a.0x0a")
227 assertBadSplit("0x0a.0x0a")
228 assertBadSplit("0x0a")
229 assertBadSplit(".")
230 assertBadSplit("bogus")
231 assertBadSplit("bogus.com")
232 assertBadSplit("1000")
233 assertBadSplit("1000000000000000")
234 assertBadSplit("192.168.0.1.com")
235
236 def test_empty_octet(self):
237 def assertBadOctet(addr):
238 with self.assertAddressError("Empty octet not permitted in %r",
R David Murray75678652014-10-12 15:17:22 -0400239 addr):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000240 ipaddress.IPv4Address(addr)
241
242 assertBadOctet("42..42.42")
243 assertBadOctet("...")
244
245 def test_invalid_characters(self):
246 def assertBadOctet(addr, octet):
247 msg = "Only decimal digits permitted in %r in %r" % (octet, addr)
248 with self.assertAddressError(re.escape(msg)):
249 ipaddress.IPv4Address(addr)
250
251 assertBadOctet("0x0a.0x0a.0x0a.0x0a", "0x0a")
Nick Coghlan07c4e332012-07-08 23:06:45 +1000252 assertBadOctet("0xa.0x0a.0x0a.0x0a", "0xa")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000253 assertBadOctet("42.42.42.-0", "-0")
254 assertBadOctet("42.42.42.+0", "+0")
255 assertBadOctet("42.42.42.-42", "-42")
256 assertBadOctet("+1.+2.+3.4", "+1")
257 assertBadOctet("1.2.3.4e0", "4e0")
258 assertBadOctet("1.2.3.4::", "4::")
259 assertBadOctet("1.a.2.3", "a")
260
Nick Coghlan07c4e332012-07-08 23:06:45 +1000261 def test_octet_length(self):
262 def assertBadOctet(addr, octet):
263 msg = "At most 3 characters permitted in %r in %r"
264 with self.assertAddressError(re.escape(msg % (octet, addr))):
265 ipaddress.IPv4Address(addr)
266
267 assertBadOctet("0000.000.000.000", "0000")
268 assertBadOctet("12345.67899.-54321.-98765", "12345")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000269
270 def test_octet_limit(self):
271 def assertBadOctet(addr, octet):
Nick Coghlanb582ecc2012-07-07 22:15:22 +1000272 msg = "Octet %d (> 255) not permitted in %r" % (octet, addr)
273 with self.assertAddressError(re.escape(msg)):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000274 ipaddress.IPv4Address(addr)
275
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000276 assertBadOctet("257.0.0.0", 257)
Nick Coghlan07c4e332012-07-08 23:06:45 +1000277 assertBadOctet("192.168.0.999", 999)
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000278
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +0200279 def test_pickle(self):
280 self.pickle_test('192.0.2.1')
281
Serhiy Storchaka88f64f32015-03-07 20:08:34 +0200282 def test_weakref(self):
283 weakref.ref(self.factory('192.0.2.1'))
284
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000285
Nick Coghlan07c4e332012-07-08 23:06:45 +1000286class AddressTestCase_v6(BaseTestCase, CommonTestMixin_v6):
Nick Coghlan297b1432012-07-08 17:11:04 +1000287 factory = ipaddress.IPv6Address
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000288
ewosbornef9c95a42019-09-12 05:03:31 -0400289 def test_format(self):
290
291 v6 = ipaddress.IPv6Address("::1.2.3.42")
292 v6_pairs = [
293 ("b",
294 "000000000000000000000000000000000000000000000000000000"
295 "000000000000000000000000000000000000000000000000010000"
296 "00100000001100101010"),
297 ("n", "0000000000000000000000000102032a"),
298 ("x", "0000000000000000000000000102032a"),
299 ("X", "0000000000000000000000000102032A"),
300 ("_b",
301 "0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000"
302 "_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000"
303 "_0000_0000_0000_0000_0001_0000_0010_0000_0011_0010"
304 "_1010"),
305 ("_n", "0000_0000_0000_0000_0000_0000_0102_032a"),
306 ("_x", "0000_0000_0000_0000_0000_0000_0102_032a"),
307 ("_X", "0000_0000_0000_0000_0000_0000_0102_032A"),
308 ("#b",
309 "0b0000000000000000000000000000000000000000000000000000"
310 "000000000000000000000000000000000000000000000000000100"
311 "0000100000001100101010"),
312 ("#n", "0x0000000000000000000000000102032a"),
313 ("#x", "0x0000000000000000000000000102032a"),
314 ("#X", "0X0000000000000000000000000102032A"),
315 ("#_b",
316 "0b0000_0000_0000_0000_0000_0000_0000_0000_0000_0000"
317 "_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000"
318 "_0000_0000_0000_0000_0000_0001_0000_0010_0000_0011"
319 "_0010_1010"),
320 ("#_n", "0x0000_0000_0000_0000_0000_0000_0102_032a"),
321 ("#_x", "0x0000_0000_0000_0000_0000_0000_0102_032a"),
322 ("#_X", "0X0000_0000_0000_0000_0000_0000_0102_032A"),
323 ("s", "::102:32a"),
324 ("", "::102:32a"),
325 ]
326
327 for (fmt, txt) in v6_pairs:
328 self.assertEqual(txt, format(v6, fmt))
329
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000330 def test_network_passed_as_address(self):
331 addr = "::1/24"
332 with self.assertAddressError("Unexpected '/' in %r", addr):
333 ipaddress.IPv6Address(addr)
334
335 def test_bad_address_split_v6_not_enough_parts(self):
336 def assertBadSplit(addr):
337 msg = "At least 3 parts expected in %r"
338 with self.assertAddressError(msg, addr):
339 ipaddress.IPv6Address(addr)
340
341 assertBadSplit(":")
342 assertBadSplit(":1")
343 assertBadSplit("FEDC:9878")
344
345 def test_bad_address_split_v6_too_many_colons(self):
346 def assertBadSplit(addr):
347 msg = "At most 8 colons permitted in %r"
348 with self.assertAddressError(msg, addr):
349 ipaddress.IPv6Address(addr)
350
351 assertBadSplit("9:8:7:6:5:4:3::2:1")
352 assertBadSplit("10:9:8:7:6:5:4:3:2:1")
353 assertBadSplit("::8:7:6:5:4:3:2:1")
354 assertBadSplit("8:7:6:5:4:3:2:1::")
355 # A trailing IPv4 address is two parts
356 assertBadSplit("10:9:8:7:6:5:4:3:42.42.42.42")
357
358 def test_bad_address_split_v6_too_many_parts(self):
359 def assertBadSplit(addr):
360 msg = "Exactly 8 parts expected without '::' in %r"
361 with self.assertAddressError(msg, addr):
362 ipaddress.IPv6Address(addr)
363
364 assertBadSplit("3ffe:0:0:0:0:0:0:0:1")
365 assertBadSplit("9:8:7:6:5:4:3:2:1")
366 assertBadSplit("7:6:5:4:3:2:1")
367 # A trailing IPv4 address is two parts
368 assertBadSplit("9:8:7:6:5:4:3:42.42.42.42")
369 assertBadSplit("7:6:5:4:3:42.42.42.42")
370
371 def test_bad_address_split_v6_too_many_parts_with_double_colon(self):
372 def assertBadSplit(addr):
373 msg = "Expected at most 7 other parts with '::' in %r"
374 with self.assertAddressError(msg, addr):
375 ipaddress.IPv6Address(addr)
376
377 assertBadSplit("1:2:3:4::5:6:7:8")
378
379 def test_bad_address_split_v6_repeated_double_colon(self):
380 def assertBadSplit(addr):
381 msg = "At most one '::' permitted in %r"
382 with self.assertAddressError(msg, addr):
383 ipaddress.IPv6Address(addr)
384
385 assertBadSplit("3ffe::1::1")
386 assertBadSplit("1::2::3::4:5")
387 assertBadSplit("2001::db:::1")
388 assertBadSplit("3ffe::1::")
389 assertBadSplit("::3ffe::1")
390 assertBadSplit(":3ffe::1::1")
391 assertBadSplit("3ffe::1::1:")
392 assertBadSplit(":3ffe::1::1:")
393 assertBadSplit(":::")
394 assertBadSplit('2001:db8:::1')
395
396 def test_bad_address_split_v6_leading_colon(self):
397 def assertBadSplit(addr):
398 msg = "Leading ':' only permitted as part of '::' in %r"
399 with self.assertAddressError(msg, addr):
400 ipaddress.IPv6Address(addr)
401
402 assertBadSplit(":2001:db8::1")
403 assertBadSplit(":1:2:3:4:5:6:7")
404 assertBadSplit(":1:2:3:4:5:6:")
405 assertBadSplit(":6:5:4:3:2:1::")
406
407 def test_bad_address_split_v6_trailing_colon(self):
408 def assertBadSplit(addr):
409 msg = "Trailing ':' only permitted as part of '::' in %r"
410 with self.assertAddressError(msg, addr):
411 ipaddress.IPv6Address(addr)
412
413 assertBadSplit("2001:db8::1:")
414 assertBadSplit("1:2:3:4:5:6:7:")
415 assertBadSplit("::1.2.3.4:")
416 assertBadSplit("::7:6:5:4:3:2:")
417
418 def test_bad_v4_part_in(self):
419 def assertBadAddressPart(addr, v4_error):
420 with self.assertAddressError("%s in %r", v4_error, addr):
421 ipaddress.IPv6Address(addr)
422
423 assertBadAddressPart("3ffe::1.net", "Expected 4 octets in '1.net'")
424 assertBadAddressPart("3ffe::127.0.1",
425 "Expected 4 octets in '127.0.1'")
426 assertBadAddressPart("::1.2.3",
427 "Expected 4 octets in '1.2.3'")
428 assertBadAddressPart("::1.2.3.4.5",
429 "Expected 4 octets in '1.2.3.4.5'")
430 assertBadAddressPart("3ffe::1.1.1.net",
431 "Only decimal digits permitted in 'net' "
432 "in '1.1.1.net'")
433
434 def test_invalid_characters(self):
435 def assertBadPart(addr, part):
436 msg = "Only hex digits permitted in %r in %r" % (part, addr)
437 with self.assertAddressError(re.escape(msg)):
438 ipaddress.IPv6Address(addr)
439
440 assertBadPart("3ffe::goog", "goog")
441 assertBadPart("3ffe::-0", "-0")
442 assertBadPart("3ffe::+0", "+0")
443 assertBadPart("3ffe::-1", "-1")
444 assertBadPart("1.2.3.4::", "1.2.3.4")
445 assertBadPart('1234:axy::b', "axy")
446
447 def test_part_length(self):
448 def assertBadPart(addr, part):
449 msg = "At most 4 characters permitted in %r in %r"
450 with self.assertAddressError(msg, part, addr):
451 ipaddress.IPv6Address(addr)
452
Nick Coghlan07c4e332012-07-08 23:06:45 +1000453 assertBadPart("::00000", "00000")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000454 assertBadPart("3ffe::10000", "10000")
455 assertBadPart("02001:db8::", "02001")
456 assertBadPart('2001:888888::1', "888888")
457
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +0200458 def test_pickle(self):
459 self.pickle_test('2001:db8::')
460
Serhiy Storchaka88f64f32015-03-07 20:08:34 +0200461 def test_weakref(self):
462 weakref.ref(self.factory('2001:db8::'))
463
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000464
Nick Coghlan07c4e332012-07-08 23:06:45 +1000465class NetmaskTestMixin_v4(CommonTestMixin_v4):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000466 """Input validation on interfaces and networks is very similar"""
467
Cheryl Sabella5609b782018-03-20 20:09:15 -0400468 def test_no_mask(self):
Inada Naoki6fa84bd2019-04-16 08:32:28 +0900469 for address in ('1.2.3.4', 0x01020304, b'\x01\x02\x03\x04'):
470 net = self.factory(address)
471 self.assertEqual(str(net), '1.2.3.4/32')
472 self.assertEqual(str(net.netmask), '255.255.255.255')
473 self.assertEqual(str(net.hostmask), '0.0.0.0')
474 # IPv4Network has prefixlen, but IPv4Interface doesn't.
475 # Should we add it to IPv4Interface too? (bpo-36392)
Cheryl Sabella5609b782018-03-20 20:09:15 -0400476
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000477 def test_split_netmask(self):
478 addr = "1.2.3.4/32/24"
479 with self.assertAddressError("Only one '/' permitted in %r" % addr):
480 self.factory(addr)
481
482 def test_address_errors(self):
483 def assertBadAddress(addr, details):
484 with self.assertAddressError(details):
485 self.factory(addr)
486
Nick Coghlan297b1432012-07-08 17:11:04 +1000487 assertBadAddress("/", "Address cannot be empty")
488 assertBadAddress("/8", "Address cannot be empty")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000489 assertBadAddress("bogus", "Expected 4 octets")
490 assertBadAddress("google.com", "Expected 4 octets")
491 assertBadAddress("10/8", "Expected 4 octets")
492 assertBadAddress("::1.2.3.4", "Only decimal digits")
Nick Coghlanb582ecc2012-07-07 22:15:22 +1000493 assertBadAddress("1.2.3.256", re.escape("256 (> 255)"))
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000494
Nick Coghlan932346f2014-02-08 23:17:36 +1000495 def test_valid_netmask(self):
496 self.assertEqual(str(self.factory('192.0.2.0/255.255.255.0')),
497 '192.0.2.0/24')
498 for i in range(0, 33):
499 # Generate and re-parse the CIDR format (trivial).
500 net_str = '0.0.0.0/%d' % i
501 net = self.factory(net_str)
502 self.assertEqual(str(net), net_str)
503 # Generate and re-parse the expanded netmask.
504 self.assertEqual(
505 str(self.factory('0.0.0.0/%s' % net.netmask)), net_str)
506 # Zero prefix is treated as decimal.
507 self.assertEqual(str(self.factory('0.0.0.0/0%d' % i)), net_str)
508 # Generate and re-parse the expanded hostmask. The ambiguous
509 # cases (/0 and /32) are treated as netmasks.
510 if i in (32, 0):
511 net_str = '0.0.0.0/%d' % (32 - i)
512 self.assertEqual(
513 str(self.factory('0.0.0.0/%s' % net.hostmask)), net_str)
514
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000515 def test_netmask_errors(self):
516 def assertBadNetmask(addr, netmask):
Nick Coghlan932346f2014-02-08 23:17:36 +1000517 msg = "%r is not a valid netmask" % netmask
518 with self.assertNetmaskError(re.escape(msg)):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000519 self.factory("%s/%s" % (addr, netmask))
520
521 assertBadNetmask("1.2.3.4", "")
Nick Coghlan932346f2014-02-08 23:17:36 +1000522 assertBadNetmask("1.2.3.4", "-1")
523 assertBadNetmask("1.2.3.4", "+1")
524 assertBadNetmask("1.2.3.4", " 1 ")
525 assertBadNetmask("1.2.3.4", "0x1")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000526 assertBadNetmask("1.2.3.4", "33")
527 assertBadNetmask("1.2.3.4", "254.254.255.256")
Nick Coghlan932346f2014-02-08 23:17:36 +1000528 assertBadNetmask("1.2.3.4", "1.a.2.3")
Nick Coghlan07c4e332012-07-08 23:06:45 +1000529 assertBadNetmask("1.1.1.1", "254.xyz.2.3")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000530 assertBadNetmask("1.1.1.1", "240.255.0.0")
Nick Coghlan932346f2014-02-08 23:17:36 +1000531 assertBadNetmask("1.1.1.1", "255.254.128.0")
532 assertBadNetmask("1.1.1.1", "0.1.127.255")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000533 assertBadNetmask("1.1.1.1", "pudding")
Nick Coghlan932346f2014-02-08 23:17:36 +1000534 assertBadNetmask("1.1.1.1", "::")
535
Nicolai Moore5e48e3d2019-05-14 20:32:59 +1000536 def test_netmask_in_tuple_errors(self):
537 def assertBadNetmask(addr, netmask):
538 msg = "%r is not a valid netmask" % netmask
539 with self.assertNetmaskError(re.escape(msg)):
540 self.factory((addr, netmask))
541 assertBadNetmask("1.1.1.1", -1)
542 assertBadNetmask("1.1.1.1", 33)
543
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +0200544 def test_pickle(self):
545 self.pickle_test('192.0.2.0/27')
546 self.pickle_test('192.0.2.0/31') # IPV4LENGTH - 1
547 self.pickle_test('192.0.2.0') # IPV4LENGTH
548
R David Murray75678652014-10-12 15:17:22 -0400549
Serhiy Storchakaa556af72015-01-18 22:56:47 +0200550class InterfaceTestCase_v4(BaseTestCase, NetmaskTestMixin_v4):
551 factory = ipaddress.IPv4Interface
552
553
Nick Coghlan07c4e332012-07-08 23:06:45 +1000554class NetworkTestCase_v4(BaseTestCase, NetmaskTestMixin_v4):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000555 factory = ipaddress.IPv4Network
556
Cheryl Sabella91dc64b2017-10-22 17:39:49 -0400557 def test_subnet_of(self):
558 # containee left of container
559 self.assertFalse(
560 self.factory('10.0.0.0/30').subnet_of(
561 self.factory('10.0.1.0/24')))
562 # containee inside container
563 self.assertTrue(
564 self.factory('10.0.0.0/30').subnet_of(
565 self.factory('10.0.0.0/24')))
566 # containee right of container
567 self.assertFalse(
568 self.factory('10.0.0.0/30').subnet_of(
569 self.factory('10.0.1.0/24')))
570 # containee larger than container
571 self.assertFalse(
572 self.factory('10.0.1.0/24').subnet_of(
573 self.factory('10.0.0.0/30')))
574
575 def test_supernet_of(self):
576 # containee left of container
577 self.assertFalse(
578 self.factory('10.0.0.0/30').supernet_of(
579 self.factory('10.0.1.0/24')))
580 # containee inside container
581 self.assertFalse(
582 self.factory('10.0.0.0/30').supernet_of(
583 self.factory('10.0.0.0/24')))
584 # containee right of container
585 self.assertFalse(
586 self.factory('10.0.0.0/30').supernet_of(
587 self.factory('10.0.1.0/24')))
588 # containee larger than container
589 self.assertTrue(
590 self.factory('10.0.0.0/24').supernet_of(
591 self.factory('10.0.0.0/30')))
592
593 def test_subnet_of_mixed_types(self):
594 with self.assertRaises(TypeError):
595 ipaddress.IPv4Network('10.0.0.0/30').supernet_of(
596 ipaddress.IPv6Network('::1/128'))
597 with self.assertRaises(TypeError):
598 ipaddress.IPv6Network('::1/128').supernet_of(
599 ipaddress.IPv4Network('10.0.0.0/30'))
600 with self.assertRaises(TypeError):
601 ipaddress.IPv4Network('10.0.0.0/30').subnet_of(
602 ipaddress.IPv6Network('::1/128'))
603 with self.assertRaises(TypeError):
604 ipaddress.IPv6Network('::1/128').subnet_of(
605 ipaddress.IPv4Network('10.0.0.0/30'))
606
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000607
Nick Coghlan07c4e332012-07-08 23:06:45 +1000608class NetmaskTestMixin_v6(CommonTestMixin_v6):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000609 """Input validation on interfaces and networks is very similar"""
610
Inada Naoki6fa84bd2019-04-16 08:32:28 +0900611 def test_no_mask(self):
612 for address in ('::1', 1, b'\x00'*15 + b'\x01'):
613 net = self.factory(address)
614 self.assertEqual(str(net), '::1/128')
615 self.assertEqual(str(net.netmask), 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff')
616 self.assertEqual(str(net.hostmask), '::')
617 # IPv6Network has prefixlen, but IPv6Interface doesn't.
618 # Should we add it to IPv4Interface too? (bpo-36392)
619
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000620 def test_split_netmask(self):
621 addr = "cafe:cafe::/128/190"
622 with self.assertAddressError("Only one '/' permitted in %r" % addr):
623 self.factory(addr)
624
625 def test_address_errors(self):
626 def assertBadAddress(addr, details):
627 with self.assertAddressError(details):
628 self.factory(addr)
629
Nick Coghlan297b1432012-07-08 17:11:04 +1000630 assertBadAddress("/", "Address cannot be empty")
631 assertBadAddress("/8", "Address cannot be empty")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000632 assertBadAddress("google.com", "At least 3 parts")
633 assertBadAddress("1.2.3.4", "At least 3 parts")
634 assertBadAddress("10/8", "At least 3 parts")
635 assertBadAddress("1234:axy::b", "Only hex digits")
636
Nick Coghlan932346f2014-02-08 23:17:36 +1000637 def test_valid_netmask(self):
638 # We only support CIDR for IPv6, because expanded netmasks are not
639 # standard notation.
640 self.assertEqual(str(self.factory('2001:db8::/32')), '2001:db8::/32')
641 for i in range(0, 129):
642 # Generate and re-parse the CIDR format (trivial).
643 net_str = '::/%d' % i
644 self.assertEqual(str(self.factory(net_str)), net_str)
645 # Zero prefix is treated as decimal.
646 self.assertEqual(str(self.factory('::/0%d' % i)), net_str)
647
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000648 def test_netmask_errors(self):
649 def assertBadNetmask(addr, netmask):
Nick Coghlan932346f2014-02-08 23:17:36 +1000650 msg = "%r is not a valid netmask" % netmask
651 with self.assertNetmaskError(re.escape(msg)):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000652 self.factory("%s/%s" % (addr, netmask))
653
654 assertBadNetmask("::1", "")
655 assertBadNetmask("::1", "::1")
656 assertBadNetmask("::1", "1::")
Nick Coghlan932346f2014-02-08 23:17:36 +1000657 assertBadNetmask("::1", "-1")
658 assertBadNetmask("::1", "+1")
659 assertBadNetmask("::1", " 1 ")
660 assertBadNetmask("::1", "0x1")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000661 assertBadNetmask("::1", "129")
Nick Coghlan932346f2014-02-08 23:17:36 +1000662 assertBadNetmask("::1", "1.2.3.4")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000663 assertBadNetmask("::1", "pudding")
Nick Coghlan932346f2014-02-08 23:17:36 +1000664 assertBadNetmask("::", "::")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000665
Nicolai Moore5e48e3d2019-05-14 20:32:59 +1000666 def test_netmask_in_tuple_errors(self):
667 def assertBadNetmask(addr, netmask):
668 msg = "%r is not a valid netmask" % netmask
669 with self.assertNetmaskError(re.escape(msg)):
670 self.factory((addr, netmask))
671 assertBadNetmask("::1", -1)
672 assertBadNetmask("::1", 129)
673
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +0200674 def test_pickle(self):
675 self.pickle_test('2001:db8::1000/124')
676 self.pickle_test('2001:db8::1000/127') # IPV6LENGTH - 1
677 self.pickle_test('2001:db8::1000') # IPV6LENGTH
678
R David Murray75678652014-10-12 15:17:22 -0400679
Nick Coghlan07c4e332012-07-08 23:06:45 +1000680class InterfaceTestCase_v6(BaseTestCase, NetmaskTestMixin_v6):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000681 factory = ipaddress.IPv6Interface
682
R David Murray75678652014-10-12 15:17:22 -0400683
Nick Coghlan07c4e332012-07-08 23:06:45 +1000684class NetworkTestCase_v6(BaseTestCase, NetmaskTestMixin_v6):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000685 factory = ipaddress.IPv6Network
686
Cheryl Sabella91dc64b2017-10-22 17:39:49 -0400687 def test_subnet_of(self):
688 # containee left of container
689 self.assertFalse(
690 self.factory('2000:999::/56').subnet_of(
691 self.factory('2000:aaa::/48')))
692 # containee inside container
693 self.assertTrue(
694 self.factory('2000:aaa::/56').subnet_of(
695 self.factory('2000:aaa::/48')))
696 # containee right of container
697 self.assertFalse(
698 self.factory('2000:bbb::/56').subnet_of(
699 self.factory('2000:aaa::/48')))
700 # containee larger than container
701 self.assertFalse(
702 self.factory('2000:aaa::/48').subnet_of(
703 self.factory('2000:aaa::/56')))
704
705 def test_supernet_of(self):
706 # containee left of container
707 self.assertFalse(
708 self.factory('2000:999::/56').supernet_of(
709 self.factory('2000:aaa::/48')))
710 # containee inside container
711 self.assertFalse(
712 self.factory('2000:aaa::/56').supernet_of(
713 self.factory('2000:aaa::/48')))
714 # containee right of container
715 self.assertFalse(
716 self.factory('2000:bbb::/56').supernet_of(
717 self.factory('2000:aaa::/48')))
718 # containee larger than container
719 self.assertTrue(
720 self.factory('2000:aaa::/48').supernet_of(
721 self.factory('2000:aaa::/56')))
722
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000723
Nick Coghlan07c4e332012-07-08 23:06:45 +1000724class FactoryFunctionErrors(BaseTestCase):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000725
726 def assertFactoryError(self, factory, kind):
727 """Ensure a clean ValueError with the expected message"""
728 addr = "camelot"
729 msg = '%r does not appear to be an IPv4 or IPv6 %s'
730 with self.assertCleanError(ValueError, msg, addr, kind):
731 factory(addr)
732
733 def test_ip_address(self):
734 self.assertFactoryError(ipaddress.ip_address, "address")
735
736 def test_ip_interface(self):
737 self.assertFactoryError(ipaddress.ip_interface, "interface")
738
739 def test_ip_network(self):
740 self.assertFactoryError(ipaddress.ip_network, "network")
741
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200742
Nick Coghlan3008ec02012-07-08 00:45:33 +1000743class ComparisonTests(unittest.TestCase):
744
745 v4addr = ipaddress.IPv4Address(1)
746 v4net = ipaddress.IPv4Network(1)
747 v4intf = ipaddress.IPv4Interface(1)
748 v6addr = ipaddress.IPv6Address(1)
749 v6net = ipaddress.IPv6Network(1)
750 v6intf = ipaddress.IPv6Interface(1)
751
752 v4_addresses = [v4addr, v4intf]
753 v4_objects = v4_addresses + [v4net]
754 v6_addresses = [v6addr, v6intf]
755 v6_objects = v6_addresses + [v6net]
R David Murray947ff382016-06-02 15:46:04 -0400756
Nick Coghlan3008ec02012-07-08 00:45:33 +1000757 objects = v4_objects + v6_objects
758
R David Murray947ff382016-06-02 15:46:04 -0400759 v4addr2 = ipaddress.IPv4Address(2)
760 v4net2 = ipaddress.IPv4Network(2)
761 v4intf2 = ipaddress.IPv4Interface(2)
762 v6addr2 = ipaddress.IPv6Address(2)
763 v6net2 = ipaddress.IPv6Network(2)
764 v6intf2 = ipaddress.IPv6Interface(2)
765
Nick Coghlan3008ec02012-07-08 00:45:33 +1000766 def test_foreign_type_equality(self):
767 # __eq__ should never raise TypeError directly
768 other = object()
769 for obj in self.objects:
770 self.assertNotEqual(obj, other)
771 self.assertFalse(obj == other)
772 self.assertEqual(obj.__eq__(other), NotImplemented)
773 self.assertEqual(obj.__ne__(other), NotImplemented)
774
775 def test_mixed_type_equality(self):
776 # Ensure none of the internal objects accidentally
777 # expose the right set of attributes to become "equal"
778 for lhs in self.objects:
779 for rhs in self.objects:
780 if lhs is rhs:
781 continue
782 self.assertNotEqual(lhs, rhs)
783
R David Murray947ff382016-06-02 15:46:04 -0400784 def test_same_type_equality(self):
785 for obj in self.objects:
786 self.assertEqual(obj, obj)
787 self.assertLessEqual(obj, obj)
788 self.assertGreaterEqual(obj, obj)
789
790 def test_same_type_ordering(self):
791 for lhs, rhs in (
792 (self.v4addr, self.v4addr2),
793 (self.v4net, self.v4net2),
794 (self.v4intf, self.v4intf2),
795 (self.v6addr, self.v6addr2),
796 (self.v6net, self.v6net2),
797 (self.v6intf, self.v6intf2),
798 ):
799 self.assertNotEqual(lhs, rhs)
800 self.assertLess(lhs, rhs)
801 self.assertLessEqual(lhs, rhs)
802 self.assertGreater(rhs, lhs)
803 self.assertGreaterEqual(rhs, lhs)
804 self.assertFalse(lhs > rhs)
805 self.assertFalse(rhs < lhs)
806 self.assertFalse(lhs >= rhs)
807 self.assertFalse(rhs <= lhs)
808
Nick Coghlan3008ec02012-07-08 00:45:33 +1000809 def test_containment(self):
810 for obj in self.v4_addresses:
811 self.assertIn(obj, self.v4net)
812 for obj in self.v6_addresses:
813 self.assertIn(obj, self.v6net)
814 for obj in self.v4_objects + [self.v6net]:
815 self.assertNotIn(obj, self.v6net)
816 for obj in self.v6_objects + [self.v4net]:
817 self.assertNotIn(obj, self.v4net)
818
819 def test_mixed_type_ordering(self):
820 for lhs in self.objects:
821 for rhs in self.objects:
822 if isinstance(lhs, type(rhs)) or isinstance(rhs, type(lhs)):
823 continue
824 self.assertRaises(TypeError, lambda: lhs < rhs)
825 self.assertRaises(TypeError, lambda: lhs > rhs)
826 self.assertRaises(TypeError, lambda: lhs <= rhs)
827 self.assertRaises(TypeError, lambda: lhs >= rhs)
828
Serhiy Storchakaf186e122015-01-26 10:11:16 +0200829 def test_foreign_type_ordering(self):
830 other = object()
Serhiy Storchakaf186e122015-01-26 10:11:16 +0200831 for obj in self.objects:
832 with self.assertRaises(TypeError):
833 obj < other
834 with self.assertRaises(TypeError):
835 obj > other
836 with self.assertRaises(TypeError):
837 obj <= other
838 with self.assertRaises(TypeError):
839 obj >= other
Serhiy Storchaka17e52642019-08-04 12:38:46 +0300840 self.assertTrue(obj < LARGEST)
841 self.assertFalse(obj > LARGEST)
842 self.assertTrue(obj <= LARGEST)
843 self.assertFalse(obj >= LARGEST)
844 self.assertFalse(obj < SMALLEST)
845 self.assertTrue(obj > SMALLEST)
846 self.assertFalse(obj <= SMALLEST)
847 self.assertTrue(obj >= SMALLEST)
Serhiy Storchakaf186e122015-01-26 10:11:16 +0200848
Nick Coghlan3008ec02012-07-08 00:45:33 +1000849 def test_mixed_type_key(self):
850 # with get_mixed_type_key, you can sort addresses and network.
851 v4_ordered = [self.v4addr, self.v4net, self.v4intf]
852 v6_ordered = [self.v6addr, self.v6net, self.v6intf]
853 self.assertEqual(v4_ordered,
854 sorted(self.v4_objects,
855 key=ipaddress.get_mixed_type_key))
856 self.assertEqual(v6_ordered,
857 sorted(self.v6_objects,
858 key=ipaddress.get_mixed_type_key))
859 self.assertEqual(v4_ordered + v6_ordered,
860 sorted(self.objects,
861 key=ipaddress.get_mixed_type_key))
862 self.assertEqual(NotImplemented, ipaddress.get_mixed_type_key(object))
863
864 def test_incompatible_versions(self):
865 # These should always raise TypeError
866 v4addr = ipaddress.ip_address('1.1.1.1')
867 v4net = ipaddress.ip_network('1.1.1.1')
868 v6addr = ipaddress.ip_address('::1')
Serhiy Storchakaf186e122015-01-26 10:11:16 +0200869 v6net = ipaddress.ip_network('::1')
Nick Coghlan3008ec02012-07-08 00:45:33 +1000870
871 self.assertRaises(TypeError, v4addr.__lt__, v6addr)
872 self.assertRaises(TypeError, v4addr.__gt__, v6addr)
873 self.assertRaises(TypeError, v4net.__lt__, v6net)
874 self.assertRaises(TypeError, v4net.__gt__, v6net)
875
876 self.assertRaises(TypeError, v6addr.__lt__, v4addr)
877 self.assertRaises(TypeError, v6addr.__gt__, v4addr)
878 self.assertRaises(TypeError, v6net.__lt__, v4net)
879 self.assertRaises(TypeError, v6net.__gt__, v4net)
880
881
Nick Coghlandc9b2552012-05-20 21:01:57 +1000882class IpaddrUnitTest(unittest.TestCase):
883
884 def setUp(self):
885 self.ipv4_address = ipaddress.IPv4Address('1.2.3.4')
886 self.ipv4_interface = ipaddress.IPv4Interface('1.2.3.4/24')
887 self.ipv4_network = ipaddress.IPv4Network('1.2.3.0/24')
888 #self.ipv4_hostmask = ipaddress.IPv4Interface('10.0.0.1/0.255.255.255')
889 self.ipv6_address = ipaddress.IPv6Interface(
890 '2001:658:22a:cafe:200:0:0:1')
891 self.ipv6_interface = ipaddress.IPv6Interface(
892 '2001:658:22a:cafe:200:0:0:1/64')
893 self.ipv6_network = ipaddress.IPv6Network('2001:658:22a:cafe::/64')
894
895 def testRepr(self):
896 self.assertEqual("IPv4Interface('1.2.3.4/32')",
897 repr(ipaddress.IPv4Interface('1.2.3.4')))
898 self.assertEqual("IPv6Interface('::1/128')",
899 repr(ipaddress.IPv6Interface('::1')))
900
Martin Panter204bf0b2016-07-11 07:51:37 +0000901 # issue #16531: constructing IPv4Network from an (address, mask) tuple
Antoine Pitrou5fb195f2014-05-12 20:36:46 +0200902 def testIPv4Tuple(self):
903 # /32
904 ip = ipaddress.IPv4Address('192.0.2.1')
905 net = ipaddress.IPv4Network('192.0.2.1/32')
906 self.assertEqual(ipaddress.IPv4Network(('192.0.2.1', 32)), net)
907 self.assertEqual(ipaddress.IPv4Network((ip, 32)), net)
908 self.assertEqual(ipaddress.IPv4Network((3221225985, 32)), net)
909 self.assertEqual(ipaddress.IPv4Network(('192.0.2.1',
910 '255.255.255.255')), net)
911 self.assertEqual(ipaddress.IPv4Network((ip,
912 '255.255.255.255')), net)
913 self.assertEqual(ipaddress.IPv4Network((3221225985,
914 '255.255.255.255')), net)
915 # strict=True and host bits set
916 with self.assertRaises(ValueError):
917 ipaddress.IPv4Network(('192.0.2.1', 24))
918 with self.assertRaises(ValueError):
919 ipaddress.IPv4Network((ip, 24))
920 with self.assertRaises(ValueError):
921 ipaddress.IPv4Network((3221225985, 24))
922 with self.assertRaises(ValueError):
923 ipaddress.IPv4Network(('192.0.2.1', '255.255.255.0'))
924 with self.assertRaises(ValueError):
925 ipaddress.IPv4Network((ip, '255.255.255.0'))
926 with self.assertRaises(ValueError):
927 ipaddress.IPv4Network((3221225985, '255.255.255.0'))
928 # strict=False and host bits set
929 net = ipaddress.IPv4Network('192.0.2.0/24')
930 self.assertEqual(ipaddress.IPv4Network(('192.0.2.1', 24),
931 strict=False), net)
932 self.assertEqual(ipaddress.IPv4Network((ip, 24),
933 strict=False), net)
934 self.assertEqual(ipaddress.IPv4Network((3221225985, 24),
935 strict=False), net)
936 self.assertEqual(ipaddress.IPv4Network(('192.0.2.1',
937 '255.255.255.0'),
938 strict=False), net)
939 self.assertEqual(ipaddress.IPv4Network((ip,
940 '255.255.255.0'),
941 strict=False), net)
942 self.assertEqual(ipaddress.IPv4Network((3221225985,
943 '255.255.255.0'),
944 strict=False), net)
945
946 # /24
947 ip = ipaddress.IPv4Address('192.0.2.0')
948 net = ipaddress.IPv4Network('192.0.2.0/24')
949 self.assertEqual(ipaddress.IPv4Network(('192.0.2.0',
950 '255.255.255.0')), net)
951 self.assertEqual(ipaddress.IPv4Network((ip,
952 '255.255.255.0')), net)
953 self.assertEqual(ipaddress.IPv4Network((3221225984,
954 '255.255.255.0')), net)
955 self.assertEqual(ipaddress.IPv4Network(('192.0.2.0', 24)), net)
956 self.assertEqual(ipaddress.IPv4Network((ip, 24)), net)
957 self.assertEqual(ipaddress.IPv4Network((3221225984, 24)), net)
958
959 self.assertEqual(ipaddress.IPv4Interface(('192.0.2.1', 24)),
960 ipaddress.IPv4Interface('192.0.2.1/24'))
961 self.assertEqual(ipaddress.IPv4Interface((3221225985, 24)),
962 ipaddress.IPv4Interface('192.0.2.1/24'))
963
Martin Panter204bf0b2016-07-11 07:51:37 +0000964 # issue #16531: constructing IPv6Network from an (address, mask) tuple
Antoine Pitrou5fb195f2014-05-12 20:36:46 +0200965 def testIPv6Tuple(self):
966 # /128
967 ip = ipaddress.IPv6Address('2001:db8::')
968 net = ipaddress.IPv6Network('2001:db8::/128')
969 self.assertEqual(ipaddress.IPv6Network(('2001:db8::', '128')),
970 net)
971 self.assertEqual(ipaddress.IPv6Network(
972 (42540766411282592856903984951653826560, 128)),
973 net)
974 self.assertEqual(ipaddress.IPv6Network((ip, '128')),
975 net)
976 ip = ipaddress.IPv6Address('2001:db8::')
977 net = ipaddress.IPv6Network('2001:db8::/96')
978 self.assertEqual(ipaddress.IPv6Network(('2001:db8::', '96')),
979 net)
980 self.assertEqual(ipaddress.IPv6Network(
981 (42540766411282592856903984951653826560, 96)),
982 net)
983 self.assertEqual(ipaddress.IPv6Network((ip, '96')),
984 net)
985
986 # strict=True and host bits set
987 ip = ipaddress.IPv6Address('2001:db8::1')
988 with self.assertRaises(ValueError):
989 ipaddress.IPv6Network(('2001:db8::1', 96))
990 with self.assertRaises(ValueError):
991 ipaddress.IPv6Network((
992 42540766411282592856903984951653826561, 96))
993 with self.assertRaises(ValueError):
994 ipaddress.IPv6Network((ip, 96))
995 # strict=False and host bits set
996 net = ipaddress.IPv6Network('2001:db8::/96')
997 self.assertEqual(ipaddress.IPv6Network(('2001:db8::1', 96),
998 strict=False),
999 net)
1000 self.assertEqual(ipaddress.IPv6Network(
1001 (42540766411282592856903984951653826561, 96),
1002 strict=False),
1003 net)
1004 self.assertEqual(ipaddress.IPv6Network((ip, 96), strict=False),
1005 net)
1006
1007 # /96
1008 self.assertEqual(ipaddress.IPv6Interface(('2001:db8::1', '96')),
1009 ipaddress.IPv6Interface('2001:db8::1/96'))
1010 self.assertEqual(ipaddress.IPv6Interface(
1011 (42540766411282592856903984951653826561, '96')),
1012 ipaddress.IPv6Interface('2001:db8::1/96'))
1013
Nick Coghlandc9b2552012-05-20 21:01:57 +10001014 # issue57
1015 def testAddressIntMath(self):
1016 self.assertEqual(ipaddress.IPv4Address('1.1.1.1') + 255,
1017 ipaddress.IPv4Address('1.1.2.0'))
1018 self.assertEqual(ipaddress.IPv4Address('1.1.1.1') - 256,
1019 ipaddress.IPv4Address('1.1.0.1'))
1020 self.assertEqual(ipaddress.IPv6Address('::1') + (2**16 - 2),
1021 ipaddress.IPv6Address('::ffff'))
1022 self.assertEqual(ipaddress.IPv6Address('::ffff') - (2**16 - 2),
1023 ipaddress.IPv6Address('::1'))
1024
Nick Coghlan3c2570c2012-07-07 01:13:55 +10001025 def testInvalidIntToBytes(self):
1026 self.assertRaises(ValueError, ipaddress.v4_int_to_packed, -1)
1027 self.assertRaises(ValueError, ipaddress.v4_int_to_packed,
1028 2 ** ipaddress.IPV4LENGTH)
1029 self.assertRaises(ValueError, ipaddress.v6_int_to_packed, -1)
1030 self.assertRaises(ValueError, ipaddress.v6_int_to_packed,
1031 2 ** ipaddress.IPV6LENGTH)
1032
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001033 def testInternals(self):
Serhiy Storchakab53f0fb2015-01-19 00:41:32 +02001034 ip1 = ipaddress.IPv4Address('10.10.10.10')
1035 ip2 = ipaddress.IPv4Address('10.10.10.11')
1036 ip3 = ipaddress.IPv4Address('10.10.10.12')
1037 self.assertEqual(list(ipaddress._find_address_range([ip1])),
1038 [(ip1, ip1)])
1039 self.assertEqual(list(ipaddress._find_address_range([ip1, ip3])),
1040 [(ip1, ip1), (ip3, ip3)])
1041 self.assertEqual(list(ipaddress._find_address_range([ip1, ip2, ip3])),
1042 [(ip1, ip3)])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001043 self.assertEqual(128, ipaddress._count_righthand_zero_bits(0, 128))
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001044 self.assertEqual("IPv4Network('1.2.3.0/24')", repr(self.ipv4_network))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001045
1046 def testGetNetwork(self):
1047 self.assertEqual(int(self.ipv4_network.network_address), 16909056)
1048 self.assertEqual(str(self.ipv4_network.network_address), '1.2.3.0')
1049
1050 self.assertEqual(int(self.ipv6_network.network_address),
1051 42540616829182469433403647294022090752)
1052 self.assertEqual(str(self.ipv6_network.network_address),
1053 '2001:658:22a:cafe::')
1054 self.assertEqual(str(self.ipv6_network.hostmask),
1055 '::ffff:ffff:ffff:ffff')
1056
Nick Coghlandc9b2552012-05-20 21:01:57 +10001057 def testIpFromInt(self):
1058 self.assertEqual(self.ipv4_interface._ip,
1059 ipaddress.IPv4Interface(16909060)._ip)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001060
1061 ipv4 = ipaddress.ip_network('1.2.3.4')
1062 ipv6 = ipaddress.ip_network('2001:658:22a:cafe:200:0:0:1')
Nick Coghlan730f67f2012-08-05 22:02:18 +10001063 self.assertEqual(ipv4, ipaddress.ip_network(int(ipv4.network_address)))
1064 self.assertEqual(ipv6, ipaddress.ip_network(int(ipv6.network_address)))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001065
1066 v6_int = 42540616829182469433547762482097946625
1067 self.assertEqual(self.ipv6_interface._ip,
1068 ipaddress.IPv6Interface(v6_int)._ip)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001069
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001070 self.assertEqual(ipaddress.ip_network(self.ipv4_address._ip).version,
1071 4)
1072 self.assertEqual(ipaddress.ip_network(self.ipv6_address._ip).version,
1073 6)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001074
1075 def testIpFromPacked(self):
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001076 address = ipaddress.ip_address
Nick Coghlandc9b2552012-05-20 21:01:57 +10001077 self.assertEqual(self.ipv4_interface._ip,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001078 ipaddress.ip_interface(b'\x01\x02\x03\x04')._ip)
1079 self.assertEqual(address('255.254.253.252'),
1080 address(b'\xff\xfe\xfd\xfc'))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001081 self.assertEqual(self.ipv6_interface.ip,
1082 ipaddress.ip_interface(
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001083 b'\x20\x01\x06\x58\x02\x2a\xca\xfe'
1084 b'\x02\x00\x00\x00\x00\x00\x00\x01').ip)
1085 self.assertEqual(address('ffff:2:3:4:ffff::'),
1086 address(b'\xff\xff\x00\x02\x00\x03\x00\x04' +
1087 b'\xff\xff' + b'\x00' * 6))
1088 self.assertEqual(address('::'),
1089 address(b'\x00' * 16))
1090
Nick Coghlandc9b2552012-05-20 21:01:57 +10001091 def testGetIp(self):
1092 self.assertEqual(int(self.ipv4_interface.ip), 16909060)
1093 self.assertEqual(str(self.ipv4_interface.ip), '1.2.3.4')
1094
1095 self.assertEqual(int(self.ipv6_interface.ip),
1096 42540616829182469433547762482097946625)
1097 self.assertEqual(str(self.ipv6_interface.ip),
1098 '2001:658:22a:cafe:200::1')
1099
1100 def testGetNetmask(self):
1101 self.assertEqual(int(self.ipv4_network.netmask), 4294967040)
1102 self.assertEqual(str(self.ipv4_network.netmask), '255.255.255.0')
1103 self.assertEqual(int(self.ipv6_network.netmask),
1104 340282366920938463444927863358058659840)
1105 self.assertEqual(self.ipv6_network.prefixlen, 64)
1106
1107 def testZeroNetmask(self):
1108 ipv4_zero_netmask = ipaddress.IPv4Interface('1.2.3.4/0')
1109 self.assertEqual(int(ipv4_zero_netmask.network.netmask), 0)
Nick Coghlan932346f2014-02-08 23:17:36 +10001110 self.assertEqual(ipv4_zero_netmask._prefix_from_prefix_string('0'), 0)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001111
1112 ipv6_zero_netmask = ipaddress.IPv6Interface('::1/0')
1113 self.assertEqual(int(ipv6_zero_netmask.network.netmask), 0)
Nick Coghlan932346f2014-02-08 23:17:36 +10001114 self.assertEqual(ipv6_zero_netmask._prefix_from_prefix_string('0'), 0)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001115
Rémi Lapeyree59ec1b2019-04-13 10:49:34 +02001116 def testIPv4Net(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001117 net = ipaddress.IPv4Network('127.0.0.0/0.0.0.255')
Nick Coghlan932346f2014-02-08 23:17:36 +10001118 self.assertEqual(net.prefixlen, 24)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001119
Nick Coghlandc9b2552012-05-20 21:01:57 +10001120 def testGetBroadcast(self):
1121 self.assertEqual(int(self.ipv4_network.broadcast_address), 16909311)
1122 self.assertEqual(str(self.ipv4_network.broadcast_address), '1.2.3.255')
1123
1124 self.assertEqual(int(self.ipv6_network.broadcast_address),
1125 42540616829182469451850391367731642367)
1126 self.assertEqual(str(self.ipv6_network.broadcast_address),
1127 '2001:658:22a:cafe:ffff:ffff:ffff:ffff')
1128
1129 def testGetPrefixlen(self):
Nick Coghlane3ded952012-08-05 22:45:22 +10001130 self.assertEqual(self.ipv4_interface.network.prefixlen, 24)
1131 self.assertEqual(self.ipv6_interface.network.prefixlen, 64)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001132
1133 def testGetSupernet(self):
1134 self.assertEqual(self.ipv4_network.supernet().prefixlen, 23)
1135 self.assertEqual(str(self.ipv4_network.supernet().network_address),
1136 '1.2.2.0')
1137 self.assertEqual(
1138 ipaddress.IPv4Interface('0.0.0.0/0').network.supernet(),
1139 ipaddress.IPv4Network('0.0.0.0/0'))
1140
1141 self.assertEqual(self.ipv6_network.supernet().prefixlen, 63)
1142 self.assertEqual(str(self.ipv6_network.supernet().network_address),
1143 '2001:658:22a:cafe::')
1144 self.assertEqual(ipaddress.IPv6Interface('::0/0').network.supernet(),
1145 ipaddress.IPv6Network('::0/0'))
1146
1147 def testGetSupernet3(self):
1148 self.assertEqual(self.ipv4_network.supernet(3).prefixlen, 21)
1149 self.assertEqual(str(self.ipv4_network.supernet(3).network_address),
1150 '1.2.0.0')
1151
1152 self.assertEqual(self.ipv6_network.supernet(3).prefixlen, 61)
1153 self.assertEqual(str(self.ipv6_network.supernet(3).network_address),
1154 '2001:658:22a:caf8::')
1155
1156 def testGetSupernet4(self):
1157 self.assertRaises(ValueError, self.ipv4_network.supernet,
1158 prefixlen_diff=2, new_prefix=1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001159 self.assertRaises(ValueError, self.ipv4_network.supernet,
1160 new_prefix=25)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001161 self.assertEqual(self.ipv4_network.supernet(prefixlen_diff=2),
1162 self.ipv4_network.supernet(new_prefix=22))
1163
1164 self.assertRaises(ValueError, self.ipv6_network.supernet,
1165 prefixlen_diff=2, new_prefix=1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001166 self.assertRaises(ValueError, self.ipv6_network.supernet,
1167 new_prefix=65)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001168 self.assertEqual(self.ipv6_network.supernet(prefixlen_diff=2),
1169 self.ipv6_network.supernet(new_prefix=62))
1170
1171 def testHosts(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001172 hosts = list(self.ipv4_network.hosts())
1173 self.assertEqual(254, len(hosts))
1174 self.assertEqual(ipaddress.IPv4Address('1.2.3.1'), hosts[0])
1175 self.assertEqual(ipaddress.IPv4Address('1.2.3.254'), hosts[-1])
1176
Xiang Zhang10b134a2018-03-21 08:25:13 +08001177 ipv6_network = ipaddress.IPv6Network('2001:658:22a:cafe::/120')
1178 hosts = list(ipv6_network.hosts())
1179 self.assertEqual(255, len(hosts))
1180 self.assertEqual(ipaddress.IPv6Address('2001:658:22a:cafe::1'), hosts[0])
1181 self.assertEqual(ipaddress.IPv6Address('2001:658:22a:cafe::ff'), hosts[-1])
1182
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001183 # special case where only 1 bit is left for address
Xiang Zhang10b134a2018-03-21 08:25:13 +08001184 addrs = [ipaddress.IPv4Address('2.0.0.0'),
1185 ipaddress.IPv4Address('2.0.0.1')]
1186 str_args = '2.0.0.0/31'
1187 tpl_args = ('2.0.0.0', 31)
1188 self.assertEqual(addrs, list(ipaddress.ip_network(str_args).hosts()))
1189 self.assertEqual(addrs, list(ipaddress.ip_network(tpl_args).hosts()))
1190 self.assertEqual(list(ipaddress.ip_network(str_args).hosts()),
1191 list(ipaddress.ip_network(tpl_args).hosts()))
1192
1193 addrs = [ipaddress.IPv6Address('2001:658:22a:cafe::'),
1194 ipaddress.IPv6Address('2001:658:22a:cafe::1')]
1195 str_args = '2001:658:22a:cafe::/127'
1196 tpl_args = ('2001:658:22a:cafe::', 127)
1197 self.assertEqual(addrs, list(ipaddress.ip_network(str_args).hosts()))
1198 self.assertEqual(addrs, list(ipaddress.ip_network(tpl_args).hosts()))
1199 self.assertEqual(list(ipaddress.ip_network(str_args).hosts()),
1200 list(ipaddress.ip_network(tpl_args).hosts()))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001201
1202 def testFancySubnetting(self):
1203 self.assertEqual(sorted(self.ipv4_network.subnets(prefixlen_diff=3)),
1204 sorted(self.ipv4_network.subnets(new_prefix=27)))
1205 self.assertRaises(ValueError, list,
1206 self.ipv4_network.subnets(new_prefix=23))
1207 self.assertRaises(ValueError, list,
1208 self.ipv4_network.subnets(prefixlen_diff=3,
1209 new_prefix=27))
1210 self.assertEqual(sorted(self.ipv6_network.subnets(prefixlen_diff=4)),
1211 sorted(self.ipv6_network.subnets(new_prefix=68)))
1212 self.assertRaises(ValueError, list,
1213 self.ipv6_network.subnets(new_prefix=63))
1214 self.assertRaises(ValueError, list,
1215 self.ipv6_network.subnets(prefixlen_diff=4,
1216 new_prefix=68))
1217
1218 def testGetSubnets(self):
1219 self.assertEqual(list(self.ipv4_network.subnets())[0].prefixlen, 25)
1220 self.assertEqual(str(list(
1221 self.ipv4_network.subnets())[0].network_address),
1222 '1.2.3.0')
1223 self.assertEqual(str(list(
1224 self.ipv4_network.subnets())[1].network_address),
1225 '1.2.3.128')
1226
1227 self.assertEqual(list(self.ipv6_network.subnets())[0].prefixlen, 65)
1228
1229 def testGetSubnetForSingle32(self):
1230 ip = ipaddress.IPv4Network('1.2.3.4/32')
1231 subnets1 = [str(x) for x in ip.subnets()]
1232 subnets2 = [str(x) for x in ip.subnets(2)]
1233 self.assertEqual(subnets1, ['1.2.3.4/32'])
1234 self.assertEqual(subnets1, subnets2)
1235
1236 def testGetSubnetForSingle128(self):
1237 ip = ipaddress.IPv6Network('::1/128')
1238 subnets1 = [str(x) for x in ip.subnets()]
1239 subnets2 = [str(x) for x in ip.subnets(2)]
1240 self.assertEqual(subnets1, ['::1/128'])
1241 self.assertEqual(subnets1, subnets2)
1242
1243 def testSubnet2(self):
1244 ips = [str(x) for x in self.ipv4_network.subnets(2)]
1245 self.assertEqual(
1246 ips,
1247 ['1.2.3.0/26', '1.2.3.64/26', '1.2.3.128/26', '1.2.3.192/26'])
1248
1249 ipsv6 = [str(x) for x in self.ipv6_network.subnets(2)]
1250 self.assertEqual(
1251 ipsv6,
1252 ['2001:658:22a:cafe::/66',
1253 '2001:658:22a:cafe:4000::/66',
1254 '2001:658:22a:cafe:8000::/66',
1255 '2001:658:22a:cafe:c000::/66'])
1256
Serhiy Storchakabb0dbd52016-03-01 10:25:45 +02001257 def testGetSubnets3(self):
1258 subnets = [str(x) for x in self.ipv4_network.subnets(8)]
1259 self.assertEqual(subnets[:3],
1260 ['1.2.3.0/32', '1.2.3.1/32', '1.2.3.2/32'])
1261 self.assertEqual(subnets[-3:],
1262 ['1.2.3.253/32', '1.2.3.254/32', '1.2.3.255/32'])
1263 self.assertEqual(len(subnets), 256)
1264
1265 ipv6_network = ipaddress.IPv6Network('2001:658:22a:cafe::/120')
1266 subnets = [str(x) for x in ipv6_network.subnets(8)]
1267 self.assertEqual(subnets[:3],
1268 ['2001:658:22a:cafe::/128',
1269 '2001:658:22a:cafe::1/128',
1270 '2001:658:22a:cafe::2/128'])
1271 self.assertEqual(subnets[-3:],
1272 ['2001:658:22a:cafe::fd/128',
1273 '2001:658:22a:cafe::fe/128',
1274 '2001:658:22a:cafe::ff/128'])
1275 self.assertEqual(len(subnets), 256)
1276
Nick Coghlandc9b2552012-05-20 21:01:57 +10001277 def testSubnetFailsForLargeCidrDiff(self):
1278 self.assertRaises(ValueError, list,
1279 self.ipv4_interface.network.subnets(9))
1280 self.assertRaises(ValueError, list,
1281 self.ipv4_network.subnets(9))
1282 self.assertRaises(ValueError, list,
1283 self.ipv6_interface.network.subnets(65))
1284 self.assertRaises(ValueError, list,
1285 self.ipv6_network.subnets(65))
1286
1287 def testSupernetFailsForLargeCidrDiff(self):
1288 self.assertRaises(ValueError,
1289 self.ipv4_interface.network.supernet, 25)
1290 self.assertRaises(ValueError,
1291 self.ipv6_interface.network.supernet, 65)
1292
1293 def testSubnetFailsForNegativeCidrDiff(self):
1294 self.assertRaises(ValueError, list,
1295 self.ipv4_interface.network.subnets(-1))
1296 self.assertRaises(ValueError, list,
Nick Coghlan2c589102012-05-27 01:03:25 +10001297 self.ipv4_network.subnets(-1))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001298 self.assertRaises(ValueError, list,
1299 self.ipv6_interface.network.subnets(-1))
1300 self.assertRaises(ValueError, list,
1301 self.ipv6_network.subnets(-1))
1302
1303 def testGetNum_Addresses(self):
1304 self.assertEqual(self.ipv4_network.num_addresses, 256)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001305 self.assertEqual(list(self.ipv4_network.subnets())[0].num_addresses,
1306 128)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001307 self.assertEqual(self.ipv4_network.supernet().num_addresses, 512)
1308
1309 self.assertEqual(self.ipv6_network.num_addresses, 18446744073709551616)
1310 self.assertEqual(list(self.ipv6_network.subnets())[0].num_addresses,
1311 9223372036854775808)
1312 self.assertEqual(self.ipv6_network.supernet().num_addresses,
1313 36893488147419103232)
1314
1315 def testContains(self):
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001316 self.assertIn(ipaddress.IPv4Interface('1.2.3.128/25'),
1317 self.ipv4_network)
1318 self.assertNotIn(ipaddress.IPv4Interface('1.2.4.1/24'),
Nick Coghlandc9b2552012-05-20 21:01:57 +10001319 self.ipv4_network)
1320 # We can test addresses and string as well.
1321 addr1 = ipaddress.IPv4Address('1.2.3.37')
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001322 self.assertIn(addr1, self.ipv4_network)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001323 # issue 61, bad network comparison on like-ip'd network objects
1324 # with identical broadcast addresses.
1325 self.assertFalse(ipaddress.IPv4Network('1.1.0.0/16').__contains__(
1326 ipaddress.IPv4Network('1.0.0.0/15')))
1327
Nick Coghlandc9b2552012-05-20 21:01:57 +10001328 def testNth(self):
1329 self.assertEqual(str(self.ipv4_network[5]), '1.2.3.5')
1330 self.assertRaises(IndexError, self.ipv4_network.__getitem__, 256)
1331
1332 self.assertEqual(str(self.ipv6_network[5]),
1333 '2001:658:22a:cafe::5')
Berker Peksag28dc1182016-06-11 22:30:05 +03001334 self.assertRaises(IndexError, self.ipv6_network.__getitem__, 1 << 64)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001335
1336 def testGetitem(self):
1337 # http://code.google.com/p/ipaddr-py/issues/detail?id=15
1338 addr = ipaddress.IPv4Network('172.31.255.128/255.255.255.240')
1339 self.assertEqual(28, addr.prefixlen)
1340 addr_list = list(addr)
1341 self.assertEqual('172.31.255.128', str(addr_list[0]))
1342 self.assertEqual('172.31.255.128', str(addr[0]))
1343 self.assertEqual('172.31.255.143', str(addr_list[-1]))
1344 self.assertEqual('172.31.255.143', str(addr[-1]))
1345 self.assertEqual(addr_list[-1], addr[-1])
1346
1347 def testEqual(self):
1348 self.assertTrue(self.ipv4_interface ==
1349 ipaddress.IPv4Interface('1.2.3.4/24'))
1350 self.assertFalse(self.ipv4_interface ==
1351 ipaddress.IPv4Interface('1.2.3.4/23'))
1352 self.assertFalse(self.ipv4_interface ==
1353 ipaddress.IPv6Interface('::1.2.3.4/24'))
1354 self.assertFalse(self.ipv4_interface == '')
1355 self.assertFalse(self.ipv4_interface == [])
1356 self.assertFalse(self.ipv4_interface == 2)
1357
1358 self.assertTrue(self.ipv6_interface ==
1359 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/64'))
1360 self.assertFalse(self.ipv6_interface ==
1361 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/63'))
1362 self.assertFalse(self.ipv6_interface ==
1363 ipaddress.IPv4Interface('1.2.3.4/23'))
1364 self.assertFalse(self.ipv6_interface == '')
1365 self.assertFalse(self.ipv6_interface == [])
1366 self.assertFalse(self.ipv6_interface == 2)
1367
1368 def testNotEqual(self):
1369 self.assertFalse(self.ipv4_interface !=
1370 ipaddress.IPv4Interface('1.2.3.4/24'))
1371 self.assertTrue(self.ipv4_interface !=
1372 ipaddress.IPv4Interface('1.2.3.4/23'))
1373 self.assertTrue(self.ipv4_interface !=
1374 ipaddress.IPv6Interface('::1.2.3.4/24'))
1375 self.assertTrue(self.ipv4_interface != '')
1376 self.assertTrue(self.ipv4_interface != [])
1377 self.assertTrue(self.ipv4_interface != 2)
1378
1379 self.assertTrue(self.ipv4_address !=
1380 ipaddress.IPv4Address('1.2.3.5'))
1381 self.assertTrue(self.ipv4_address != '')
1382 self.assertTrue(self.ipv4_address != [])
1383 self.assertTrue(self.ipv4_address != 2)
1384
1385 self.assertFalse(self.ipv6_interface !=
1386 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/64'))
1387 self.assertTrue(self.ipv6_interface !=
1388 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/63'))
1389 self.assertTrue(self.ipv6_interface !=
1390 ipaddress.IPv4Interface('1.2.3.4/23'))
1391 self.assertTrue(self.ipv6_interface != '')
1392 self.assertTrue(self.ipv6_interface != [])
1393 self.assertTrue(self.ipv6_interface != 2)
1394
1395 self.assertTrue(self.ipv6_address !=
1396 ipaddress.IPv4Address('1.2.3.4'))
1397 self.assertTrue(self.ipv6_address != '')
1398 self.assertTrue(self.ipv6_address != [])
1399 self.assertTrue(self.ipv6_address != 2)
1400
1401 def testSlash32Constructor(self):
1402 self.assertEqual(str(ipaddress.IPv4Interface(
1403 '1.2.3.4/255.255.255.255')), '1.2.3.4/32')
1404
1405 def testSlash128Constructor(self):
1406 self.assertEqual(str(ipaddress.IPv6Interface('::1/128')),
1407 '::1/128')
1408
1409 def testSlash0Constructor(self):
1410 self.assertEqual(str(ipaddress.IPv4Interface('1.2.3.4/0.0.0.0')),
1411 '1.2.3.4/0')
1412
1413 def testCollapsing(self):
1414 # test only IP addresses including some duplicates
1415 ip1 = ipaddress.IPv4Address('1.1.1.0')
1416 ip2 = ipaddress.IPv4Address('1.1.1.1')
1417 ip3 = ipaddress.IPv4Address('1.1.1.2')
1418 ip4 = ipaddress.IPv4Address('1.1.1.3')
1419 ip5 = ipaddress.IPv4Address('1.1.1.4')
1420 ip6 = ipaddress.IPv4Address('1.1.1.0')
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07001421 # check that addresses are subsumed properly.
Nick Coghlandc9b2552012-05-20 21:01:57 +10001422 collapsed = ipaddress.collapse_addresses(
1423 [ip1, ip2, ip3, ip4, ip5, ip6])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001424 self.assertEqual(list(collapsed),
1425 [ipaddress.IPv4Network('1.1.1.0/30'),
1426 ipaddress.IPv4Network('1.1.1.4/32')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001427
1428 # test a mix of IP addresses and networks including some duplicates
1429 ip1 = ipaddress.IPv4Address('1.1.1.0')
1430 ip2 = ipaddress.IPv4Address('1.1.1.1')
1431 ip3 = ipaddress.IPv4Address('1.1.1.2')
1432 ip4 = ipaddress.IPv4Address('1.1.1.3')
1433 #ip5 = ipaddress.IPv4Interface('1.1.1.4/30')
1434 #ip6 = ipaddress.IPv4Interface('1.1.1.4/30')
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07001435 # check that addresses are subsumed properly.
Nick Coghlandc9b2552012-05-20 21:01:57 +10001436 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3, ip4])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001437 self.assertEqual(list(collapsed),
1438 [ipaddress.IPv4Network('1.1.1.0/30')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001439
1440 # test only IP networks
1441 ip1 = ipaddress.IPv4Network('1.1.0.0/24')
1442 ip2 = ipaddress.IPv4Network('1.1.1.0/24')
1443 ip3 = ipaddress.IPv4Network('1.1.2.0/24')
1444 ip4 = ipaddress.IPv4Network('1.1.3.0/24')
1445 ip5 = ipaddress.IPv4Network('1.1.4.0/24')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001446 # stored in no particular order b/c we want CollapseAddr to call
1447 # [].sort
Nick Coghlandc9b2552012-05-20 21:01:57 +10001448 ip6 = ipaddress.IPv4Network('1.1.0.0/22')
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07001449 # check that addresses are subsumed properly.
Nick Coghlandc9b2552012-05-20 21:01:57 +10001450 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3, ip4, ip5,
1451 ip6])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001452 self.assertEqual(list(collapsed),
1453 [ipaddress.IPv4Network('1.1.0.0/22'),
1454 ipaddress.IPv4Network('1.1.4.0/24')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001455
1456 # test that two addresses are supernet'ed properly
1457 collapsed = ipaddress.collapse_addresses([ip1, ip2])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001458 self.assertEqual(list(collapsed),
1459 [ipaddress.IPv4Network('1.1.0.0/23')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001460
1461 # test same IP networks
1462 ip_same1 = ip_same2 = ipaddress.IPv4Network('1.1.1.1/32')
1463 self.assertEqual(list(ipaddress.collapse_addresses(
1464 [ip_same1, ip_same2])),
1465 [ip_same1])
1466
1467 # test same IP addresses
1468 ip_same1 = ip_same2 = ipaddress.IPv4Address('1.1.1.1')
1469 self.assertEqual(list(ipaddress.collapse_addresses(
1470 [ip_same1, ip_same2])),
1471 [ipaddress.ip_network('1.1.1.1/32')])
1472 ip1 = ipaddress.IPv6Network('2001::/100')
1473 ip2 = ipaddress.IPv6Network('2001::/120')
1474 ip3 = ipaddress.IPv6Network('2001::/96')
1475 # test that ipv6 addresses are subsumed properly.
1476 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3])
1477 self.assertEqual(list(collapsed), [ip3])
1478
1479 # the toejam test
Hynek Schlawack35db5132012-06-01 20:12:17 +02001480 addr_tuples = [
1481 (ipaddress.ip_address('1.1.1.1'),
1482 ipaddress.ip_address('::1')),
1483 (ipaddress.IPv4Network('1.1.0.0/24'),
1484 ipaddress.IPv6Network('2001::/120')),
1485 (ipaddress.IPv4Network('1.1.0.0/32'),
1486 ipaddress.IPv6Network('2001::/128')),
1487 ]
1488 for ip1, ip2 in addr_tuples:
1489 self.assertRaises(TypeError, ipaddress.collapse_addresses,
1490 [ip1, ip2])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001491
1492 def testSummarizing(self):
1493 #ip = ipaddress.ip_address
1494 #ipnet = ipaddress.ip_network
1495 summarize = ipaddress.summarize_address_range
1496 ip1 = ipaddress.ip_address('1.1.1.0')
1497 ip2 = ipaddress.ip_address('1.1.1.255')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001498
1499 # summarize works only for IPv4 & IPv6
1500 class IPv7Address(ipaddress.IPv6Address):
1501 @property
1502 def version(self):
1503 return 7
1504 ip_invalid1 = IPv7Address('::1')
1505 ip_invalid2 = IPv7Address('::1')
1506 self.assertRaises(ValueError, list,
1507 summarize(ip_invalid1, ip_invalid2))
1508 # test that a summary over ip4 & ip6 fails
1509 self.assertRaises(TypeError, list,
1510 summarize(ip1, ipaddress.IPv6Address('::1')))
1511 # test a /24 is summarized properly
Nick Coghlandc9b2552012-05-20 21:01:57 +10001512 self.assertEqual(list(summarize(ip1, ip2))[0],
1513 ipaddress.ip_network('1.1.1.0/24'))
Martin Panter7462b6492015-11-02 03:37:02 +00001514 # test an IPv4 range that isn't on a network byte boundary
Nick Coghlandc9b2552012-05-20 21:01:57 +10001515 ip2 = ipaddress.ip_address('1.1.1.8')
1516 self.assertEqual(list(summarize(ip1, ip2)),
1517 [ipaddress.ip_network('1.1.1.0/29'),
1518 ipaddress.ip_network('1.1.1.8')])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001519 # all!
1520 ip1 = ipaddress.IPv4Address(0)
1521 ip2 = ipaddress.IPv4Address(ipaddress.IPv4Address._ALL_ONES)
1522 self.assertEqual([ipaddress.IPv4Network('0.0.0.0/0')],
1523 list(summarize(ip1, ip2)))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001524
1525 ip1 = ipaddress.ip_address('1::')
1526 ip2 = ipaddress.ip_address('1:ffff:ffff:ffff:ffff:ffff:ffff:ffff')
Martin Panter7462b6492015-11-02 03:37:02 +00001527 # test an IPv6 is summarized properly
Nick Coghlandc9b2552012-05-20 21:01:57 +10001528 self.assertEqual(list(summarize(ip1, ip2))[0],
1529 ipaddress.ip_network('1::/16'))
1530 # test an IPv6 range that isn't on a network byte boundary
1531 ip2 = ipaddress.ip_address('2::')
1532 self.assertEqual(list(summarize(ip1, ip2)),
1533 [ipaddress.ip_network('1::/16'),
1534 ipaddress.ip_network('2::/128')])
1535
1536 # test exception raised when first is greater than last
1537 self.assertRaises(ValueError, list,
1538 summarize(ipaddress.ip_address('1.1.1.0'),
1539 ipaddress.ip_address('1.1.0.0')))
1540 # test exception raised when first and last aren't IP addresses
1541 self.assertRaises(TypeError, list,
1542 summarize(ipaddress.ip_network('1.1.1.0'),
1543 ipaddress.ip_network('1.1.0.0')))
1544 self.assertRaises(TypeError, list,
1545 summarize(ipaddress.ip_network('1.1.1.0'),
1546 ipaddress.ip_network('1.1.0.0')))
1547 # test exception raised when first and last are not same version
1548 self.assertRaises(TypeError, list,
1549 summarize(ipaddress.ip_address('::'),
1550 ipaddress.ip_network('1.1.0.0')))
1551
1552 def testAddressComparison(self):
1553 self.assertTrue(ipaddress.ip_address('1.1.1.1') <=
1554 ipaddress.ip_address('1.1.1.1'))
1555 self.assertTrue(ipaddress.ip_address('1.1.1.1') <=
1556 ipaddress.ip_address('1.1.1.2'))
1557 self.assertTrue(ipaddress.ip_address('::1') <=
1558 ipaddress.ip_address('::1'))
1559 self.assertTrue(ipaddress.ip_address('::1') <=
1560 ipaddress.ip_address('::2'))
1561
Nick Coghlan3008ec02012-07-08 00:45:33 +10001562 def testInterfaceComparison(self):
s-sanjay7bd8d3e2017-03-31 23:09:53 -07001563 self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') ==
1564 ipaddress.ip_interface('1.1.1.1/24'))
1565 self.assertTrue(ipaddress.ip_interface('1.1.1.1/16') <
1566 ipaddress.ip_interface('1.1.1.1/24'))
1567 self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') <
1568 ipaddress.ip_interface('1.1.1.2/24'))
1569 self.assertTrue(ipaddress.ip_interface('1.1.1.2/16') <
1570 ipaddress.ip_interface('1.1.1.1/24'))
1571 self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') >
1572 ipaddress.ip_interface('1.1.1.1/16'))
1573 self.assertTrue(ipaddress.ip_interface('1.1.1.2/24') >
1574 ipaddress.ip_interface('1.1.1.1/24'))
1575 self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') >
1576 ipaddress.ip_interface('1.1.1.2/16'))
1577
1578 self.assertTrue(ipaddress.ip_interface('::1/64') ==
1579 ipaddress.ip_interface('::1/64'))
1580 self.assertTrue(ipaddress.ip_interface('::1/64') <
1581 ipaddress.ip_interface('::1/80'))
1582 self.assertTrue(ipaddress.ip_interface('::1/64') <
1583 ipaddress.ip_interface('::2/64'))
1584 self.assertTrue(ipaddress.ip_interface('::2/48') <
1585 ipaddress.ip_interface('::1/64'))
1586 self.assertTrue(ipaddress.ip_interface('::1/80') >
1587 ipaddress.ip_interface('::1/64'))
1588 self.assertTrue(ipaddress.ip_interface('::2/64') >
1589 ipaddress.ip_interface('::1/64'))
1590 self.assertTrue(ipaddress.ip_interface('::1/64') >
1591 ipaddress.ip_interface('::2/48'))
Nick Coghlan3008ec02012-07-08 00:45:33 +10001592
Nick Coghlandc9b2552012-05-20 21:01:57 +10001593 def testNetworkComparison(self):
1594 # ip1 and ip2 have the same network address
1595 ip1 = ipaddress.IPv4Network('1.1.1.0/24')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001596 ip2 = ipaddress.IPv4Network('1.1.1.0/32')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001597 ip3 = ipaddress.IPv4Network('1.1.2.0/24')
1598
1599 self.assertTrue(ip1 < ip3)
1600 self.assertTrue(ip3 > ip2)
1601
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001602 self.assertEqual(ip1.compare_networks(ip1), 0)
1603
1604 # if addresses are the same, sort by netmask
1605 self.assertEqual(ip1.compare_networks(ip2), -1)
1606 self.assertEqual(ip2.compare_networks(ip1), 1)
1607
Nick Coghlandc9b2552012-05-20 21:01:57 +10001608 self.assertEqual(ip1.compare_networks(ip3), -1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001609 self.assertEqual(ip3.compare_networks(ip1), 1)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001610 self.assertTrue(ip1._get_networks_key() < ip3._get_networks_key())
1611
1612 ip1 = ipaddress.IPv6Network('2001:2000::/96')
1613 ip2 = ipaddress.IPv6Network('2001:2001::/96')
1614 ip3 = ipaddress.IPv6Network('2001:ffff:2000::/96')
1615
1616 self.assertTrue(ip1 < ip3)
1617 self.assertTrue(ip3 > ip2)
1618 self.assertEqual(ip1.compare_networks(ip3), -1)
1619 self.assertTrue(ip1._get_networks_key() < ip3._get_networks_key())
1620
1621 # Test comparing different protocols.
1622 # Should always raise a TypeError.
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001623 self.assertRaises(TypeError,
1624 self.ipv4_network.compare_networks,
1625 self.ipv6_network)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001626 ipv6 = ipaddress.IPv6Interface('::/0')
1627 ipv4 = ipaddress.IPv4Interface('0.0.0.0/0')
1628 self.assertRaises(TypeError, ipv4.__lt__, ipv6)
1629 self.assertRaises(TypeError, ipv4.__gt__, ipv6)
1630 self.assertRaises(TypeError, ipv6.__lt__, ipv4)
1631 self.assertRaises(TypeError, ipv6.__gt__, ipv4)
1632
1633 # Regression test for issue 19.
1634 ip1 = ipaddress.ip_network('10.1.2.128/25')
1635 self.assertFalse(ip1 < ip1)
1636 self.assertFalse(ip1 > ip1)
1637 ip2 = ipaddress.ip_network('10.1.3.0/24')
1638 self.assertTrue(ip1 < ip2)
1639 self.assertFalse(ip2 < ip1)
1640 self.assertFalse(ip1 > ip2)
1641 self.assertTrue(ip2 > ip1)
1642 ip3 = ipaddress.ip_network('10.1.3.0/25')
1643 self.assertTrue(ip2 < ip3)
1644 self.assertFalse(ip3 < ip2)
1645 self.assertFalse(ip2 > ip3)
1646 self.assertTrue(ip3 > ip2)
1647
1648 # Regression test for issue 28.
1649 ip1 = ipaddress.ip_network('10.10.10.0/31')
1650 ip2 = ipaddress.ip_network('10.10.10.0')
1651 ip3 = ipaddress.ip_network('10.10.10.2/31')
1652 ip4 = ipaddress.ip_network('10.10.10.2')
1653 sorted = [ip1, ip2, ip3, ip4]
1654 unsorted = [ip2, ip4, ip1, ip3]
1655 unsorted.sort()
1656 self.assertEqual(sorted, unsorted)
1657 unsorted = [ip4, ip1, ip3, ip2]
1658 unsorted.sort()
1659 self.assertEqual(sorted, unsorted)
Serhiy Storchakaf186e122015-01-26 10:11:16 +02001660 self.assertIs(ip1.__lt__(ipaddress.ip_address('10.10.10.0')),
1661 NotImplemented)
1662 self.assertIs(ip2.__lt__(ipaddress.ip_address('10.10.10.0')),
1663 NotImplemented)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001664
1665 # <=, >=
1666 self.assertTrue(ipaddress.ip_network('1.1.1.1') <=
1667 ipaddress.ip_network('1.1.1.1'))
1668 self.assertTrue(ipaddress.ip_network('1.1.1.1') <=
1669 ipaddress.ip_network('1.1.1.2'))
1670 self.assertFalse(ipaddress.ip_network('1.1.1.2') <=
1671 ipaddress.ip_network('1.1.1.1'))
1672 self.assertTrue(ipaddress.ip_network('::1') <=
1673 ipaddress.ip_network('::1'))
1674 self.assertTrue(ipaddress.ip_network('::1') <=
1675 ipaddress.ip_network('::2'))
1676 self.assertFalse(ipaddress.ip_network('::2') <=
1677 ipaddress.ip_network('::1'))
1678
1679 def testStrictNetworks(self):
1680 self.assertRaises(ValueError, ipaddress.ip_network, '192.168.1.1/24')
1681 self.assertRaises(ValueError, ipaddress.ip_network, '::1/120')
1682
1683 def testOverlaps(self):
1684 other = ipaddress.IPv4Network('1.2.3.0/30')
1685 other2 = ipaddress.IPv4Network('1.2.2.0/24')
1686 other3 = ipaddress.IPv4Network('1.2.2.64/26')
1687 self.assertTrue(self.ipv4_network.overlaps(other))
1688 self.assertFalse(self.ipv4_network.overlaps(other2))
1689 self.assertTrue(other2.overlaps(other3))
1690
1691 def testEmbeddedIpv4(self):
1692 ipv4_string = '192.168.0.1'
1693 ipv4 = ipaddress.IPv4Interface(ipv4_string)
1694 v4compat_ipv6 = ipaddress.IPv6Interface('::%s' % ipv4_string)
1695 self.assertEqual(int(v4compat_ipv6.ip), int(ipv4.ip))
1696 v4mapped_ipv6 = ipaddress.IPv6Interface('::ffff:%s' % ipv4_string)
1697 self.assertNotEqual(v4mapped_ipv6.ip, ipv4.ip)
1698 self.assertRaises(ipaddress.AddressValueError, ipaddress.IPv6Interface,
1699 '2001:1.1.1.1:1.1.1.1')
1700
1701 # Issue 67: IPv6 with embedded IPv4 address not recognized.
1702 def testIPv6AddressTooLarge(self):
1703 # RFC4291 2.5.5.2
1704 self.assertEqual(ipaddress.ip_address('::FFFF:192.0.2.1'),
1705 ipaddress.ip_address('::FFFF:c000:201'))
1706 # RFC4291 2.2 (part 3) x::d.d.d.d
1707 self.assertEqual(ipaddress.ip_address('FFFF::192.0.2.1'),
1708 ipaddress.ip_address('FFFF::c000:201'))
1709
1710 def testIPVersion(self):
1711 self.assertEqual(self.ipv4_address.version, 4)
1712 self.assertEqual(self.ipv6_address.version, 6)
1713
1714 def testMaxPrefixLength(self):
1715 self.assertEqual(self.ipv4_interface.max_prefixlen, 32)
1716 self.assertEqual(self.ipv6_interface.max_prefixlen, 128)
1717
1718 def testPacked(self):
1719 self.assertEqual(self.ipv4_address.packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001720 b'\x01\x02\x03\x04')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001721 self.assertEqual(ipaddress.IPv4Interface('255.254.253.252').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001722 b'\xff\xfe\xfd\xfc')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001723 self.assertEqual(self.ipv6_address.packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001724 b'\x20\x01\x06\x58\x02\x2a\xca\xfe'
1725 b'\x02\x00\x00\x00\x00\x00\x00\x01')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001726 self.assertEqual(ipaddress.IPv6Interface('ffff:2:3:4:ffff::').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001727 b'\xff\xff\x00\x02\x00\x03\x00\x04\xff\xff'
1728 + b'\x00' * 6)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001729 self.assertEqual(ipaddress.IPv6Interface('::1:0:0:0:0').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001730 b'\x00' * 6 + b'\x00\x01' + b'\x00' * 8)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001731
Nick Coghlandc9b2552012-05-20 21:01:57 +10001732 def testIpType(self):
1733 ipv4net = ipaddress.ip_network('1.2.3.4')
1734 ipv4addr = ipaddress.ip_address('1.2.3.4')
1735 ipv6net = ipaddress.ip_network('::1.2.3.4')
1736 ipv6addr = ipaddress.ip_address('::1.2.3.4')
1737 self.assertEqual(ipaddress.IPv4Network, type(ipv4net))
1738 self.assertEqual(ipaddress.IPv4Address, type(ipv4addr))
1739 self.assertEqual(ipaddress.IPv6Network, type(ipv6net))
1740 self.assertEqual(ipaddress.IPv6Address, type(ipv6addr))
1741
1742 def testReservedIpv4(self):
1743 # test networks
1744 self.assertEqual(True, ipaddress.ip_interface(
1745 '224.1.1.1/31').is_multicast)
1746 self.assertEqual(False, ipaddress.ip_network('240.0.0.0').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001747 self.assertEqual(True, ipaddress.ip_network('240.0.0.0').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001748
1749 self.assertEqual(True, ipaddress.ip_interface(
1750 '192.168.1.1/17').is_private)
1751 self.assertEqual(False, ipaddress.ip_network('192.169.0.0').is_private)
1752 self.assertEqual(True, ipaddress.ip_network(
1753 '10.255.255.255').is_private)
1754 self.assertEqual(False, ipaddress.ip_network('11.0.0.0').is_private)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001755 self.assertEqual(False, ipaddress.ip_network('11.0.0.0').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001756 self.assertEqual(True, ipaddress.ip_network(
1757 '172.31.255.255').is_private)
1758 self.assertEqual(False, ipaddress.ip_network('172.32.0.0').is_private)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001759 self.assertEqual(True,
1760 ipaddress.ip_network('169.254.1.0/24').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001761
1762 self.assertEqual(True,
1763 ipaddress.ip_interface(
1764 '169.254.100.200/24').is_link_local)
1765 self.assertEqual(False,
1766 ipaddress.ip_interface(
1767 '169.255.100.200/24').is_link_local)
1768
1769 self.assertEqual(True,
1770 ipaddress.ip_network(
1771 '127.100.200.254/32').is_loopback)
1772 self.assertEqual(True, ipaddress.ip_network(
1773 '127.42.0.0/16').is_loopback)
1774 self.assertEqual(False, ipaddress.ip_network('128.0.0.0').is_loopback)
Peter Moodye5019d52013-10-24 09:47:10 -07001775 self.assertEqual(False,
1776 ipaddress.ip_network('100.64.0.0/10').is_private)
Peter Moodybe9c1b12013-10-22 12:36:21 -07001777 self.assertEqual(False, ipaddress.ip_network('100.64.0.0/10').is_global)
Peter Moodye5019d52013-10-24 09:47:10 -07001778
Peter Moody22c31762013-10-21 13:58:06 -07001779 self.assertEqual(True,
1780 ipaddress.ip_network('192.0.2.128/25').is_private)
1781 self.assertEqual(True,
1782 ipaddress.ip_network('192.0.3.0/24').is_global)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001783
1784 # test addresses
Hynek Schlawackbcd30442012-06-04 14:19:39 +02001785 self.assertEqual(True, ipaddress.ip_address('0.0.0.0').is_unspecified)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001786 self.assertEqual(True, ipaddress.ip_address('224.1.1.1').is_multicast)
1787 self.assertEqual(False, ipaddress.ip_address('240.0.0.0').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001788 self.assertEqual(True, ipaddress.ip_address('240.0.0.1').is_reserved)
1789 self.assertEqual(False,
1790 ipaddress.ip_address('239.255.255.255').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001791
1792 self.assertEqual(True, ipaddress.ip_address('192.168.1.1').is_private)
1793 self.assertEqual(False, ipaddress.ip_address('192.169.0.0').is_private)
1794 self.assertEqual(True, ipaddress.ip_address(
1795 '10.255.255.255').is_private)
1796 self.assertEqual(False, ipaddress.ip_address('11.0.0.0').is_private)
1797 self.assertEqual(True, ipaddress.ip_address(
1798 '172.31.255.255').is_private)
1799 self.assertEqual(False, ipaddress.ip_address('172.32.0.0').is_private)
1800
1801 self.assertEqual(True,
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001802 ipaddress.ip_address('169.254.100.200').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001803 self.assertEqual(False,
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001804 ipaddress.ip_address('169.255.100.200').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001805
Berker Peksag742192a2016-06-11 22:11:47 +03001806 self.assertTrue(ipaddress.ip_address('192.0.7.1').is_global)
1807 self.assertFalse(ipaddress.ip_address('203.0.113.1').is_global)
1808
Nick Coghlandc9b2552012-05-20 21:01:57 +10001809 self.assertEqual(True,
1810 ipaddress.ip_address('127.100.200.254').is_loopback)
1811 self.assertEqual(True, ipaddress.ip_address('127.42.0.0').is_loopback)
1812 self.assertEqual(False, ipaddress.ip_address('128.0.0.0').is_loopback)
1813 self.assertEqual(True, ipaddress.ip_network('0.0.0.0').is_unspecified)
1814
1815 def testReservedIpv6(self):
1816
1817 self.assertEqual(True, ipaddress.ip_network('ffff::').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001818 self.assertEqual(True, ipaddress.ip_network(2**128 - 1).is_multicast)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001819 self.assertEqual(True, ipaddress.ip_network('ff00::').is_multicast)
1820 self.assertEqual(False, ipaddress.ip_network('fdff::').is_multicast)
1821
1822 self.assertEqual(True, ipaddress.ip_network('fecf::').is_site_local)
1823 self.assertEqual(True, ipaddress.ip_network(
1824 'feff:ffff:ffff:ffff::').is_site_local)
1825 self.assertEqual(False, ipaddress.ip_network(
1826 'fbf:ffff::').is_site_local)
1827 self.assertEqual(False, ipaddress.ip_network('ff00::').is_site_local)
1828
1829 self.assertEqual(True, ipaddress.ip_network('fc00::').is_private)
1830 self.assertEqual(True, ipaddress.ip_network(
1831 'fc00:ffff:ffff:ffff::').is_private)
1832 self.assertEqual(False, ipaddress.ip_network('fbff:ffff::').is_private)
1833 self.assertEqual(False, ipaddress.ip_network('fe00::').is_private)
1834
1835 self.assertEqual(True, ipaddress.ip_network('fea0::').is_link_local)
1836 self.assertEqual(True, ipaddress.ip_network(
1837 'febf:ffff::').is_link_local)
1838 self.assertEqual(False, ipaddress.ip_network(
1839 'fe7f:ffff::').is_link_local)
1840 self.assertEqual(False, ipaddress.ip_network('fec0::').is_link_local)
1841
1842 self.assertEqual(True, ipaddress.ip_interface('0:0::0:01').is_loopback)
1843 self.assertEqual(False, ipaddress.ip_interface('::1/127').is_loopback)
1844 self.assertEqual(False, ipaddress.ip_network('::').is_loopback)
1845 self.assertEqual(False, ipaddress.ip_network('::2').is_loopback)
1846
1847 self.assertEqual(True, ipaddress.ip_network('0::0').is_unspecified)
1848 self.assertEqual(False, ipaddress.ip_network('::1').is_unspecified)
1849 self.assertEqual(False, ipaddress.ip_network('::/127').is_unspecified)
1850
Peter Moody22c31762013-10-21 13:58:06 -07001851 self.assertEqual(True,
1852 ipaddress.ip_network('2001::1/128').is_private)
1853 self.assertEqual(True,
1854 ipaddress.ip_network('200::1/128').is_global)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001855 # test addresses
1856 self.assertEqual(True, ipaddress.ip_address('ffff::').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001857 self.assertEqual(True, ipaddress.ip_address(2**128 - 1).is_multicast)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001858 self.assertEqual(True, ipaddress.ip_address('ff00::').is_multicast)
1859 self.assertEqual(False, ipaddress.ip_address('fdff::').is_multicast)
1860
1861 self.assertEqual(True, ipaddress.ip_address('fecf::').is_site_local)
1862 self.assertEqual(True, ipaddress.ip_address(
1863 'feff:ffff:ffff:ffff::').is_site_local)
1864 self.assertEqual(False, ipaddress.ip_address(
1865 'fbf:ffff::').is_site_local)
1866 self.assertEqual(False, ipaddress.ip_address('ff00::').is_site_local)
1867
1868 self.assertEqual(True, ipaddress.ip_address('fc00::').is_private)
1869 self.assertEqual(True, ipaddress.ip_address(
1870 'fc00:ffff:ffff:ffff::').is_private)
1871 self.assertEqual(False, ipaddress.ip_address('fbff:ffff::').is_private)
1872 self.assertEqual(False, ipaddress.ip_address('fe00::').is_private)
1873
1874 self.assertEqual(True, ipaddress.ip_address('fea0::').is_link_local)
1875 self.assertEqual(True, ipaddress.ip_address(
1876 'febf:ffff::').is_link_local)
1877 self.assertEqual(False, ipaddress.ip_address(
1878 'fe7f:ffff::').is_link_local)
1879 self.assertEqual(False, ipaddress.ip_address('fec0::').is_link_local)
1880
1881 self.assertEqual(True, ipaddress.ip_address('0:0::0:01').is_loopback)
1882 self.assertEqual(True, ipaddress.ip_address('::1').is_loopback)
1883 self.assertEqual(False, ipaddress.ip_address('::2').is_loopback)
1884
1885 self.assertEqual(True, ipaddress.ip_address('0::0').is_unspecified)
1886 self.assertEqual(False, ipaddress.ip_address('::1').is_unspecified)
1887
1888 # some generic IETF reserved addresses
1889 self.assertEqual(True, ipaddress.ip_address('100::').is_reserved)
1890 self.assertEqual(True, ipaddress.ip_network('4000::1/128').is_reserved)
1891
1892 def testIpv4Mapped(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001893 self.assertEqual(
1894 ipaddress.ip_address('::ffff:192.168.1.1').ipv4_mapped,
1895 ipaddress.ip_address('192.168.1.1'))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001896 self.assertEqual(ipaddress.ip_address('::c0a8:101').ipv4_mapped, None)
1897 self.assertEqual(ipaddress.ip_address('::ffff:c0a8:101').ipv4_mapped,
1898 ipaddress.ip_address('192.168.1.1'))
1899
1900 def testAddrExclude(self):
1901 addr1 = ipaddress.ip_network('10.1.1.0/24')
1902 addr2 = ipaddress.ip_network('10.1.1.0/26')
1903 addr3 = ipaddress.ip_network('10.2.1.0/24')
1904 addr4 = ipaddress.ip_address('10.1.1.0')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001905 addr5 = ipaddress.ip_network('2001:db8::0/32')
Serhiy Storchakabb0dbd52016-03-01 10:25:45 +02001906 addr6 = ipaddress.ip_network('10.1.1.5/32')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001907 self.assertEqual(sorted(list(addr1.address_exclude(addr2))),
1908 [ipaddress.ip_network('10.1.1.64/26'),
1909 ipaddress.ip_network('10.1.1.128/25')])
1910 self.assertRaises(ValueError, list, addr1.address_exclude(addr3))
1911 self.assertRaises(TypeError, list, addr1.address_exclude(addr4))
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001912 self.assertRaises(TypeError, list, addr1.address_exclude(addr5))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001913 self.assertEqual(list(addr1.address_exclude(addr1)), [])
Serhiy Storchakabb0dbd52016-03-01 10:25:45 +02001914 self.assertEqual(sorted(list(addr1.address_exclude(addr6))),
1915 [ipaddress.ip_network('10.1.1.0/30'),
1916 ipaddress.ip_network('10.1.1.4/32'),
1917 ipaddress.ip_network('10.1.1.6/31'),
1918 ipaddress.ip_network('10.1.1.8/29'),
1919 ipaddress.ip_network('10.1.1.16/28'),
1920 ipaddress.ip_network('10.1.1.32/27'),
1921 ipaddress.ip_network('10.1.1.64/26'),
1922 ipaddress.ip_network('10.1.1.128/25')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001923
1924 def testHash(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001925 self.assertEqual(hash(ipaddress.ip_interface('10.1.1.0/24')),
1926 hash(ipaddress.ip_interface('10.1.1.0/24')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001927 self.assertEqual(hash(ipaddress.ip_network('10.1.1.0/24')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001928 hash(ipaddress.ip_network('10.1.1.0/24')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001929 self.assertEqual(hash(ipaddress.ip_address('10.1.1.0')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001930 hash(ipaddress.ip_address('10.1.1.0')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001931 # i70
1932 self.assertEqual(hash(ipaddress.ip_address('1.2.3.4')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001933 hash(ipaddress.ip_address(
Nick Coghlandc9b2552012-05-20 21:01:57 +10001934 int(ipaddress.ip_address('1.2.3.4')._ip))))
1935 ip1 = ipaddress.ip_address('10.1.1.0')
1936 ip2 = ipaddress.ip_address('1::')
1937 dummy = {}
1938 dummy[self.ipv4_address] = None
1939 dummy[self.ipv6_address] = None
1940 dummy[ip1] = None
1941 dummy[ip2] = None
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001942 self.assertIn(self.ipv4_address, dummy)
1943 self.assertIn(ip2, dummy)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001944
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001945 def testIPBases(self):
1946 net = self.ipv4_network
1947 self.assertEqual('1.2.3.0/24', net.compressed)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001948 net = self.ipv6_network
1949 self.assertRaises(ValueError, net._string_from_ip_int, 2**128 + 1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001950
Hynek Schlawack454a74d2012-06-04 18:14:02 +02001951 def testIPv6NetworkHelpers(self):
1952 net = self.ipv6_network
1953 self.assertEqual('2001:658:22a:cafe::/64', net.with_prefixlen)
1954 self.assertEqual('2001:658:22a:cafe::/ffff:ffff:ffff:ffff::',
1955 net.with_netmask)
1956 self.assertEqual('2001:658:22a:cafe::/::ffff:ffff:ffff:ffff',
1957 net.with_hostmask)
1958 self.assertEqual('2001:658:22a:cafe::/64', str(net))
1959
1960 def testIPv4NetworkHelpers(self):
1961 net = self.ipv4_network
1962 self.assertEqual('1.2.3.0/24', net.with_prefixlen)
1963 self.assertEqual('1.2.3.0/255.255.255.0', net.with_netmask)
1964 self.assertEqual('1.2.3.0/0.0.0.255', net.with_hostmask)
1965 self.assertEqual('1.2.3.0/24', str(net))
1966
Nick Coghlandc9b2552012-05-20 21:01:57 +10001967 def testCopyConstructor(self):
1968 addr1 = ipaddress.ip_network('10.1.1.0/24')
1969 addr2 = ipaddress.ip_network(addr1)
1970 addr3 = ipaddress.ip_interface('2001:658:22a:cafe:200::1/64')
1971 addr4 = ipaddress.ip_interface(addr3)
1972 addr5 = ipaddress.IPv4Address('1.1.1.1')
1973 addr6 = ipaddress.IPv6Address('2001:658:22a:cafe:200::1')
1974
1975 self.assertEqual(addr1, addr2)
1976 self.assertEqual(addr3, addr4)
1977 self.assertEqual(addr5, ipaddress.IPv4Address(addr5))
1978 self.assertEqual(addr6, ipaddress.IPv6Address(addr6))
1979
1980 def testCompressIPv6Address(self):
1981 test_addresses = {
1982 '1:2:3:4:5:6:7:8': '1:2:3:4:5:6:7:8/128',
1983 '2001:0:0:4:0:0:0:8': '2001:0:0:4::8/128',
1984 '2001:0:0:4:5:6:7:8': '2001::4:5:6:7:8/128',
1985 '2001:0:3:4:5:6:7:8': '2001:0:3:4:5:6:7:8/128',
Nick Coghlandc9b2552012-05-20 21:01:57 +10001986 '0:0:3:0:0:0:0:ffff': '0:0:3::ffff/128',
1987 '0:0:0:4:0:0:0:ffff': '::4:0:0:0:ffff/128',
1988 '0:0:0:0:5:0:0:ffff': '::5:0:0:ffff/128',
1989 '1:0:0:4:0:0:7:8': '1::4:0:0:7:8/128',
1990 '0:0:0:0:0:0:0:0': '::/128',
1991 '0:0:0:0:0:0:0:0/0': '::/0',
1992 '0:0:0:0:0:0:0:1': '::1/128',
1993 '2001:0658:022a:cafe:0000:0000:0000:0000/66':
1994 '2001:658:22a:cafe::/66',
1995 '::1.2.3.4': '::102:304/128',
1996 '1:2:3:4:5:ffff:1.2.3.4': '1:2:3:4:5:ffff:102:304/128',
1997 '::7:6:5:4:3:2:1': '0:7:6:5:4:3:2:1/128',
1998 '::7:6:5:4:3:2:0': '0:7:6:5:4:3:2:0/128',
1999 '7:6:5:4:3:2:1::': '7:6:5:4:3:2:1:0/128',
2000 '0:6:5:4:3:2:1::': '0:6:5:4:3:2:1:0/128',
2001 }
2002 for uncompressed, compressed in list(test_addresses.items()):
2003 self.assertEqual(compressed, str(ipaddress.IPv6Interface(
2004 uncompressed)))
2005
2006 def testExplodeShortHandIpStr(self):
2007 addr1 = ipaddress.IPv6Interface('2001::1')
2008 addr2 = ipaddress.IPv6Address('2001:0:5ef5:79fd:0:59d:a0e5:ba1')
2009 addr3 = ipaddress.IPv6Network('2001::/96')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002010 addr4 = ipaddress.IPv4Address('192.168.178.1')
Nick Coghlandc9b2552012-05-20 21:01:57 +10002011 self.assertEqual('2001:0000:0000:0000:0000:0000:0000:0001/128',
2012 addr1.exploded)
2013 self.assertEqual('0000:0000:0000:0000:0000:0000:0000:0001/128',
2014 ipaddress.IPv6Interface('::1/128').exploded)
2015 # issue 77
2016 self.assertEqual('2001:0000:5ef5:79fd:0000:059d:a0e5:0ba1',
2017 addr2.exploded)
2018 self.assertEqual('2001:0000:0000:0000:0000:0000:0000:0000/96',
2019 addr3.exploded)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02002020 self.assertEqual('192.168.178.1', addr4.exploded)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002021
Eric V. Smithebdaaf42014-04-14 12:58:07 -04002022 def testReversePointer(self):
2023 addr1 = ipaddress.IPv4Address('127.0.0.1')
2024 addr2 = ipaddress.IPv6Address('2001:db8::1')
2025 self.assertEqual('1.0.0.127.in-addr.arpa', addr1.reverse_pointer)
2026 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.' +
2027 'b.d.0.1.0.0.2.ip6.arpa',
2028 addr2.reverse_pointer)
2029
Nick Coghlandc9b2552012-05-20 21:01:57 +10002030 def testIntRepresentation(self):
2031 self.assertEqual(16909060, int(self.ipv4_address))
2032 self.assertEqual(42540616829182469433547762482097946625,
2033 int(self.ipv6_address))
2034
Nick Coghlandc9b2552012-05-20 21:01:57 +10002035 def testForceVersion(self):
2036 self.assertEqual(ipaddress.ip_network(1).version, 4)
Nick Coghlan51c30672012-05-27 00:25:58 +10002037 self.assertEqual(ipaddress.IPv6Network(1).version, 6)
Sandro Tosi876ecad2012-05-23 22:26:55 +02002038
Nick Coghlandc9b2552012-05-20 21:01:57 +10002039 def testWithStar(self):
Nick Coghlana8517ad2012-08-20 10:04:26 +10002040 self.assertEqual(self.ipv4_interface.with_prefixlen, "1.2.3.4/24")
2041 self.assertEqual(self.ipv4_interface.with_netmask,
Nick Coghlandc9b2552012-05-20 21:01:57 +10002042 "1.2.3.4/255.255.255.0")
Nick Coghlana8517ad2012-08-20 10:04:26 +10002043 self.assertEqual(self.ipv4_interface.with_hostmask,
Nick Coghlandc9b2552012-05-20 21:01:57 +10002044 "1.2.3.4/0.0.0.255")
2045
Nick Coghlana8517ad2012-08-20 10:04:26 +10002046 self.assertEqual(self.ipv6_interface.with_prefixlen,
Nick Coghlandc9b2552012-05-20 21:01:57 +10002047 '2001:658:22a:cafe:200::1/64')
Nick Coghlana8517ad2012-08-20 10:04:26 +10002048 self.assertEqual(self.ipv6_interface.with_netmask,
2049 '2001:658:22a:cafe:200::1/ffff:ffff:ffff:ffff::')
Nick Coghlandc9b2552012-05-20 21:01:57 +10002050 # this probably don't make much sense, but it's included for
2051 # compatibility with ipv4
Nick Coghlana8517ad2012-08-20 10:04:26 +10002052 self.assertEqual(self.ipv6_interface.with_hostmask,
Nick Coghlandc9b2552012-05-20 21:01:57 +10002053 '2001:658:22a:cafe:200::1/::ffff:ffff:ffff:ffff')
2054
2055 def testNetworkElementCaching(self):
2056 # V4 - make sure we're empty
Inada Naoki2430d532019-04-15 16:01:00 +09002057 self.assertNotIn('broadcast_address', self.ipv4_network.__dict__)
2058 self.assertNotIn('hostmask', self.ipv4_network.__dict__)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002059
2060 # V4 - populate and test
Nick Coghlandc9b2552012-05-20 21:01:57 +10002061 self.assertEqual(self.ipv4_network.broadcast_address,
2062 ipaddress.IPv4Address('1.2.3.255'))
2063 self.assertEqual(self.ipv4_network.hostmask,
2064 ipaddress.IPv4Address('0.0.0.255'))
2065
2066 # V4 - check we're cached
Inada Naoki2430d532019-04-15 16:01:00 +09002067 self.assertIn('broadcast_address', self.ipv4_network.__dict__)
2068 self.assertIn('hostmask', self.ipv4_network.__dict__)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002069
2070 # V6 - make sure we're empty
Inada Naoki2430d532019-04-15 16:01:00 +09002071 self.assertNotIn('broadcast_address', self.ipv6_network.__dict__)
2072 self.assertNotIn('hostmask', self.ipv6_network.__dict__)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002073
2074 # V6 - populate and test
2075 self.assertEqual(self.ipv6_network.network_address,
2076 ipaddress.IPv6Address('2001:658:22a:cafe::'))
2077 self.assertEqual(self.ipv6_interface.network.network_address,
2078 ipaddress.IPv6Address('2001:658:22a:cafe::'))
2079
2080 self.assertEqual(
2081 self.ipv6_network.broadcast_address,
2082 ipaddress.IPv6Address('2001:658:22a:cafe:ffff:ffff:ffff:ffff'))
2083 self.assertEqual(self.ipv6_network.hostmask,
2084 ipaddress.IPv6Address('::ffff:ffff:ffff:ffff'))
2085 self.assertEqual(
2086 self.ipv6_interface.network.broadcast_address,
2087 ipaddress.IPv6Address('2001:658:22a:cafe:ffff:ffff:ffff:ffff'))
2088 self.assertEqual(self.ipv6_interface.network.hostmask,
2089 ipaddress.IPv6Address('::ffff:ffff:ffff:ffff'))
2090
2091 # V6 - check we're cached
Inada Naoki2430d532019-04-15 16:01:00 +09002092 self.assertIn('broadcast_address', self.ipv6_network.__dict__)
2093 self.assertIn('hostmask', self.ipv6_network.__dict__)
2094 self.assertIn('broadcast_address', self.ipv6_interface.network.__dict__)
2095 self.assertIn('hostmask', self.ipv6_interface.network.__dict__)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002096
2097 def testTeredo(self):
2098 # stolen from wikipedia
2099 server = ipaddress.IPv4Address('65.54.227.120')
2100 client = ipaddress.IPv4Address('192.0.2.45')
2101 teredo_addr = '2001:0000:4136:e378:8000:63bf:3fff:fdd2'
2102 self.assertEqual((server, client),
2103 ipaddress.ip_address(teredo_addr).teredo)
2104 bad_addr = '2000::4136:e378:8000:63bf:3fff:fdd2'
2105 self.assertFalse(ipaddress.ip_address(bad_addr).teredo)
2106 bad_addr = '2001:0001:4136:e378:8000:63bf:3fff:fdd2'
2107 self.assertFalse(ipaddress.ip_address(bad_addr).teredo)
2108
2109 # i77
2110 teredo_addr = ipaddress.IPv6Address('2001:0:5ef5:79fd:0:59d:a0e5:ba1')
2111 self.assertEqual((ipaddress.IPv4Address('94.245.121.253'),
2112 ipaddress.IPv4Address('95.26.244.94')),
2113 teredo_addr.teredo)
2114
Nick Coghlandc9b2552012-05-20 21:01:57 +10002115 def testsixtofour(self):
2116 sixtofouraddr = ipaddress.ip_address('2002:ac1d:2d64::1')
2117 bad_addr = ipaddress.ip_address('2000:ac1d:2d64::1')
2118 self.assertEqual(ipaddress.IPv4Address('172.29.45.100'),
2119 sixtofouraddr.sixtofour)
2120 self.assertFalse(bad_addr.sixtofour)
2121
Nick Coghlandc9b2552012-05-20 21:01:57 +10002122
2123if __name__ == '__main__':
2124 unittest.main()