blob: de77111705b6945133f0a747592dc169c6438427 [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
Miss Islington (bot)dde944f2019-08-04 03:01:55 -070015from 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
177 def test_network_passed_as_address(self):
178 addr = "127.0.0.1/24"
179 with self.assertAddressError("Unexpected '/' in %r", addr):
180 ipaddress.IPv4Address(addr)
181
182 def test_bad_address_split(self):
183 def assertBadSplit(addr):
184 with self.assertAddressError("Expected 4 octets in %r", addr):
185 ipaddress.IPv4Address(addr)
186
187 assertBadSplit("127.0.1")
188 assertBadSplit("42.42.42.42.42")
189 assertBadSplit("42.42.42")
190 assertBadSplit("42.42")
191 assertBadSplit("42")
192 assertBadSplit("42..42.42.42")
193 assertBadSplit("42.42.42.42.")
194 assertBadSplit("42.42.42.42...")
195 assertBadSplit(".42.42.42.42")
196 assertBadSplit("...42.42.42.42")
197 assertBadSplit("016.016.016")
198 assertBadSplit("016.016")
199 assertBadSplit("016")
200 assertBadSplit("000")
201 assertBadSplit("0x0a.0x0a.0x0a")
202 assertBadSplit("0x0a.0x0a")
203 assertBadSplit("0x0a")
204 assertBadSplit(".")
205 assertBadSplit("bogus")
206 assertBadSplit("bogus.com")
207 assertBadSplit("1000")
208 assertBadSplit("1000000000000000")
209 assertBadSplit("192.168.0.1.com")
210
211 def test_empty_octet(self):
212 def assertBadOctet(addr):
213 with self.assertAddressError("Empty octet not permitted in %r",
R David Murray75678652014-10-12 15:17:22 -0400214 addr):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000215 ipaddress.IPv4Address(addr)
216
217 assertBadOctet("42..42.42")
218 assertBadOctet("...")
219
220 def test_invalid_characters(self):
221 def assertBadOctet(addr, octet):
222 msg = "Only decimal digits permitted in %r in %r" % (octet, addr)
223 with self.assertAddressError(re.escape(msg)):
224 ipaddress.IPv4Address(addr)
225
226 assertBadOctet("0x0a.0x0a.0x0a.0x0a", "0x0a")
Nick Coghlan07c4e332012-07-08 23:06:45 +1000227 assertBadOctet("0xa.0x0a.0x0a.0x0a", "0xa")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000228 assertBadOctet("42.42.42.-0", "-0")
229 assertBadOctet("42.42.42.+0", "+0")
230 assertBadOctet("42.42.42.-42", "-42")
231 assertBadOctet("+1.+2.+3.4", "+1")
232 assertBadOctet("1.2.3.4e0", "4e0")
233 assertBadOctet("1.2.3.4::", "4::")
234 assertBadOctet("1.a.2.3", "a")
235
Nick Coghlan07c4e332012-07-08 23:06:45 +1000236 def test_octet_length(self):
237 def assertBadOctet(addr, octet):
238 msg = "At most 3 characters permitted in %r in %r"
239 with self.assertAddressError(re.escape(msg % (octet, addr))):
240 ipaddress.IPv4Address(addr)
241
242 assertBadOctet("0000.000.000.000", "0000")
243 assertBadOctet("12345.67899.-54321.-98765", "12345")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000244
245 def test_octet_limit(self):
246 def assertBadOctet(addr, octet):
Nick Coghlanb582ecc2012-07-07 22:15:22 +1000247 msg = "Octet %d (> 255) not permitted in %r" % (octet, addr)
248 with self.assertAddressError(re.escape(msg)):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000249 ipaddress.IPv4Address(addr)
250
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000251 assertBadOctet("257.0.0.0", 257)
Nick Coghlan07c4e332012-07-08 23:06:45 +1000252 assertBadOctet("192.168.0.999", 999)
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000253
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +0200254 def test_pickle(self):
255 self.pickle_test('192.0.2.1')
256
Serhiy Storchaka88f64f32015-03-07 20:08:34 +0200257 def test_weakref(self):
258 weakref.ref(self.factory('192.0.2.1'))
259
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000260
Nick Coghlan07c4e332012-07-08 23:06:45 +1000261class AddressTestCase_v6(BaseTestCase, CommonTestMixin_v6):
Nick Coghlan297b1432012-07-08 17:11:04 +1000262 factory = ipaddress.IPv6Address
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000263
264 def test_network_passed_as_address(self):
265 addr = "::1/24"
266 with self.assertAddressError("Unexpected '/' in %r", addr):
267 ipaddress.IPv6Address(addr)
268
269 def test_bad_address_split_v6_not_enough_parts(self):
270 def assertBadSplit(addr):
271 msg = "At least 3 parts expected in %r"
272 with self.assertAddressError(msg, addr):
273 ipaddress.IPv6Address(addr)
274
275 assertBadSplit(":")
276 assertBadSplit(":1")
277 assertBadSplit("FEDC:9878")
278
279 def test_bad_address_split_v6_too_many_colons(self):
280 def assertBadSplit(addr):
281 msg = "At most 8 colons permitted in %r"
282 with self.assertAddressError(msg, addr):
283 ipaddress.IPv6Address(addr)
284
285 assertBadSplit("9:8:7:6:5:4:3::2:1")
286 assertBadSplit("10:9:8:7:6:5:4:3:2:1")
287 assertBadSplit("::8:7:6:5:4:3:2:1")
288 assertBadSplit("8:7:6:5:4:3:2:1::")
289 # A trailing IPv4 address is two parts
290 assertBadSplit("10:9:8:7:6:5:4:3:42.42.42.42")
291
292 def test_bad_address_split_v6_too_many_parts(self):
293 def assertBadSplit(addr):
294 msg = "Exactly 8 parts expected without '::' in %r"
295 with self.assertAddressError(msg, addr):
296 ipaddress.IPv6Address(addr)
297
298 assertBadSplit("3ffe:0:0:0:0:0:0:0:1")
299 assertBadSplit("9:8:7:6:5:4:3:2:1")
300 assertBadSplit("7:6:5:4:3:2:1")
301 # A trailing IPv4 address is two parts
302 assertBadSplit("9:8:7:6:5:4:3:42.42.42.42")
303 assertBadSplit("7:6:5:4:3:42.42.42.42")
304
305 def test_bad_address_split_v6_too_many_parts_with_double_colon(self):
306 def assertBadSplit(addr):
307 msg = "Expected at most 7 other parts with '::' in %r"
308 with self.assertAddressError(msg, addr):
309 ipaddress.IPv6Address(addr)
310
311 assertBadSplit("1:2:3:4::5:6:7:8")
312
313 def test_bad_address_split_v6_repeated_double_colon(self):
314 def assertBadSplit(addr):
315 msg = "At most one '::' permitted in %r"
316 with self.assertAddressError(msg, addr):
317 ipaddress.IPv6Address(addr)
318
319 assertBadSplit("3ffe::1::1")
320 assertBadSplit("1::2::3::4:5")
321 assertBadSplit("2001::db:::1")
322 assertBadSplit("3ffe::1::")
323 assertBadSplit("::3ffe::1")
324 assertBadSplit(":3ffe::1::1")
325 assertBadSplit("3ffe::1::1:")
326 assertBadSplit(":3ffe::1::1:")
327 assertBadSplit(":::")
328 assertBadSplit('2001:db8:::1')
329
330 def test_bad_address_split_v6_leading_colon(self):
331 def assertBadSplit(addr):
332 msg = "Leading ':' only permitted as part of '::' in %r"
333 with self.assertAddressError(msg, addr):
334 ipaddress.IPv6Address(addr)
335
336 assertBadSplit(":2001:db8::1")
337 assertBadSplit(":1:2:3:4:5:6:7")
338 assertBadSplit(":1:2:3:4:5:6:")
339 assertBadSplit(":6:5:4:3:2:1::")
340
341 def test_bad_address_split_v6_trailing_colon(self):
342 def assertBadSplit(addr):
343 msg = "Trailing ':' only permitted as part of '::' in %r"
344 with self.assertAddressError(msg, addr):
345 ipaddress.IPv6Address(addr)
346
347 assertBadSplit("2001:db8::1:")
348 assertBadSplit("1:2:3:4:5:6:7:")
349 assertBadSplit("::1.2.3.4:")
350 assertBadSplit("::7:6:5:4:3:2:")
351
352 def test_bad_v4_part_in(self):
353 def assertBadAddressPart(addr, v4_error):
354 with self.assertAddressError("%s in %r", v4_error, addr):
355 ipaddress.IPv6Address(addr)
356
357 assertBadAddressPart("3ffe::1.net", "Expected 4 octets in '1.net'")
358 assertBadAddressPart("3ffe::127.0.1",
359 "Expected 4 octets in '127.0.1'")
360 assertBadAddressPart("::1.2.3",
361 "Expected 4 octets in '1.2.3'")
362 assertBadAddressPart("::1.2.3.4.5",
363 "Expected 4 octets in '1.2.3.4.5'")
364 assertBadAddressPart("3ffe::1.1.1.net",
365 "Only decimal digits permitted in 'net' "
366 "in '1.1.1.net'")
367
368 def test_invalid_characters(self):
369 def assertBadPart(addr, part):
370 msg = "Only hex digits permitted in %r in %r" % (part, addr)
371 with self.assertAddressError(re.escape(msg)):
372 ipaddress.IPv6Address(addr)
373
374 assertBadPart("3ffe::goog", "goog")
375 assertBadPart("3ffe::-0", "-0")
376 assertBadPart("3ffe::+0", "+0")
377 assertBadPart("3ffe::-1", "-1")
378 assertBadPart("1.2.3.4::", "1.2.3.4")
379 assertBadPart('1234:axy::b', "axy")
380
381 def test_part_length(self):
382 def assertBadPart(addr, part):
383 msg = "At most 4 characters permitted in %r in %r"
384 with self.assertAddressError(msg, part, addr):
385 ipaddress.IPv6Address(addr)
386
Nick Coghlan07c4e332012-07-08 23:06:45 +1000387 assertBadPart("::00000", "00000")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000388 assertBadPart("3ffe::10000", "10000")
389 assertBadPart("02001:db8::", "02001")
390 assertBadPart('2001:888888::1', "888888")
391
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +0200392 def test_pickle(self):
393 self.pickle_test('2001:db8::')
394
Serhiy Storchaka88f64f32015-03-07 20:08:34 +0200395 def test_weakref(self):
396 weakref.ref(self.factory('2001:db8::'))
397
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000398
Nick Coghlan07c4e332012-07-08 23:06:45 +1000399class NetmaskTestMixin_v4(CommonTestMixin_v4):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000400 """Input validation on interfaces and networks is very similar"""
401
Cheryl Sabella5609b782018-03-20 20:09:15 -0400402 def test_no_mask(self):
Inada Naoki6fa84bd2019-04-16 08:32:28 +0900403 for address in ('1.2.3.4', 0x01020304, b'\x01\x02\x03\x04'):
404 net = self.factory(address)
405 self.assertEqual(str(net), '1.2.3.4/32')
406 self.assertEqual(str(net.netmask), '255.255.255.255')
407 self.assertEqual(str(net.hostmask), '0.0.0.0')
408 # IPv4Network has prefixlen, but IPv4Interface doesn't.
409 # Should we add it to IPv4Interface too? (bpo-36392)
Cheryl Sabella5609b782018-03-20 20:09:15 -0400410
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000411 def test_split_netmask(self):
412 addr = "1.2.3.4/32/24"
413 with self.assertAddressError("Only one '/' permitted in %r" % addr):
414 self.factory(addr)
415
416 def test_address_errors(self):
417 def assertBadAddress(addr, details):
418 with self.assertAddressError(details):
419 self.factory(addr)
420
Nick Coghlan297b1432012-07-08 17:11:04 +1000421 assertBadAddress("/", "Address cannot be empty")
422 assertBadAddress("/8", "Address cannot be empty")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000423 assertBadAddress("bogus", "Expected 4 octets")
424 assertBadAddress("google.com", "Expected 4 octets")
425 assertBadAddress("10/8", "Expected 4 octets")
426 assertBadAddress("::1.2.3.4", "Only decimal digits")
Nick Coghlanb582ecc2012-07-07 22:15:22 +1000427 assertBadAddress("1.2.3.256", re.escape("256 (> 255)"))
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000428
Nick Coghlan932346f2014-02-08 23:17:36 +1000429 def test_valid_netmask(self):
430 self.assertEqual(str(self.factory('192.0.2.0/255.255.255.0')),
431 '192.0.2.0/24')
432 for i in range(0, 33):
433 # Generate and re-parse the CIDR format (trivial).
434 net_str = '0.0.0.0/%d' % i
435 net = self.factory(net_str)
436 self.assertEqual(str(net), net_str)
437 # Generate and re-parse the expanded netmask.
438 self.assertEqual(
439 str(self.factory('0.0.0.0/%s' % net.netmask)), net_str)
440 # Zero prefix is treated as decimal.
441 self.assertEqual(str(self.factory('0.0.0.0/0%d' % i)), net_str)
442 # Generate and re-parse the expanded hostmask. The ambiguous
443 # cases (/0 and /32) are treated as netmasks.
444 if i in (32, 0):
445 net_str = '0.0.0.0/%d' % (32 - i)
446 self.assertEqual(
447 str(self.factory('0.0.0.0/%s' % net.hostmask)), net_str)
448
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000449 def test_netmask_errors(self):
450 def assertBadNetmask(addr, netmask):
Nick Coghlan932346f2014-02-08 23:17:36 +1000451 msg = "%r is not a valid netmask" % netmask
452 with self.assertNetmaskError(re.escape(msg)):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000453 self.factory("%s/%s" % (addr, netmask))
454
455 assertBadNetmask("1.2.3.4", "")
Nick Coghlan932346f2014-02-08 23:17:36 +1000456 assertBadNetmask("1.2.3.4", "-1")
457 assertBadNetmask("1.2.3.4", "+1")
458 assertBadNetmask("1.2.3.4", " 1 ")
459 assertBadNetmask("1.2.3.4", "0x1")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000460 assertBadNetmask("1.2.3.4", "33")
461 assertBadNetmask("1.2.3.4", "254.254.255.256")
Nick Coghlan932346f2014-02-08 23:17:36 +1000462 assertBadNetmask("1.2.3.4", "1.a.2.3")
Nick Coghlan07c4e332012-07-08 23:06:45 +1000463 assertBadNetmask("1.1.1.1", "254.xyz.2.3")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000464 assertBadNetmask("1.1.1.1", "240.255.0.0")
Nick Coghlan932346f2014-02-08 23:17:36 +1000465 assertBadNetmask("1.1.1.1", "255.254.128.0")
466 assertBadNetmask("1.1.1.1", "0.1.127.255")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000467 assertBadNetmask("1.1.1.1", "pudding")
Nick Coghlan932346f2014-02-08 23:17:36 +1000468 assertBadNetmask("1.1.1.1", "::")
469
Nicolai Moore5e48e3d2019-05-14 20:32:59 +1000470 def test_netmask_in_tuple_errors(self):
471 def assertBadNetmask(addr, netmask):
472 msg = "%r is not a valid netmask" % netmask
473 with self.assertNetmaskError(re.escape(msg)):
474 self.factory((addr, netmask))
475 assertBadNetmask("1.1.1.1", -1)
476 assertBadNetmask("1.1.1.1", 33)
477
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +0200478 def test_pickle(self):
479 self.pickle_test('192.0.2.0/27')
480 self.pickle_test('192.0.2.0/31') # IPV4LENGTH - 1
481 self.pickle_test('192.0.2.0') # IPV4LENGTH
482
R David Murray75678652014-10-12 15:17:22 -0400483
Serhiy Storchakaa556af72015-01-18 22:56:47 +0200484class InterfaceTestCase_v4(BaseTestCase, NetmaskTestMixin_v4):
485 factory = ipaddress.IPv4Interface
486
487
Nick Coghlan07c4e332012-07-08 23:06:45 +1000488class NetworkTestCase_v4(BaseTestCase, NetmaskTestMixin_v4):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000489 factory = ipaddress.IPv4Network
490
Cheryl Sabella91dc64b2017-10-22 17:39:49 -0400491 def test_subnet_of(self):
492 # containee left of container
493 self.assertFalse(
494 self.factory('10.0.0.0/30').subnet_of(
495 self.factory('10.0.1.0/24')))
496 # containee inside container
497 self.assertTrue(
498 self.factory('10.0.0.0/30').subnet_of(
499 self.factory('10.0.0.0/24')))
500 # containee right of container
501 self.assertFalse(
502 self.factory('10.0.0.0/30').subnet_of(
503 self.factory('10.0.1.0/24')))
504 # containee larger than container
505 self.assertFalse(
506 self.factory('10.0.1.0/24').subnet_of(
507 self.factory('10.0.0.0/30')))
508
509 def test_supernet_of(self):
510 # containee left of container
511 self.assertFalse(
512 self.factory('10.0.0.0/30').supernet_of(
513 self.factory('10.0.1.0/24')))
514 # containee inside container
515 self.assertFalse(
516 self.factory('10.0.0.0/30').supernet_of(
517 self.factory('10.0.0.0/24')))
518 # containee right of container
519 self.assertFalse(
520 self.factory('10.0.0.0/30').supernet_of(
521 self.factory('10.0.1.0/24')))
522 # containee larger than container
523 self.assertTrue(
524 self.factory('10.0.0.0/24').supernet_of(
525 self.factory('10.0.0.0/30')))
526
527 def test_subnet_of_mixed_types(self):
528 with self.assertRaises(TypeError):
529 ipaddress.IPv4Network('10.0.0.0/30').supernet_of(
530 ipaddress.IPv6Network('::1/128'))
531 with self.assertRaises(TypeError):
532 ipaddress.IPv6Network('::1/128').supernet_of(
533 ipaddress.IPv4Network('10.0.0.0/30'))
534 with self.assertRaises(TypeError):
535 ipaddress.IPv4Network('10.0.0.0/30').subnet_of(
536 ipaddress.IPv6Network('::1/128'))
537 with self.assertRaises(TypeError):
538 ipaddress.IPv6Network('::1/128').subnet_of(
539 ipaddress.IPv4Network('10.0.0.0/30'))
540
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000541
Nick Coghlan07c4e332012-07-08 23:06:45 +1000542class NetmaskTestMixin_v6(CommonTestMixin_v6):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000543 """Input validation on interfaces and networks is very similar"""
544
Inada Naoki6fa84bd2019-04-16 08:32:28 +0900545 def test_no_mask(self):
546 for address in ('::1', 1, b'\x00'*15 + b'\x01'):
547 net = self.factory(address)
548 self.assertEqual(str(net), '::1/128')
549 self.assertEqual(str(net.netmask), 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff')
550 self.assertEqual(str(net.hostmask), '::')
551 # IPv6Network has prefixlen, but IPv6Interface doesn't.
552 # Should we add it to IPv4Interface too? (bpo-36392)
553
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000554 def test_split_netmask(self):
555 addr = "cafe:cafe::/128/190"
556 with self.assertAddressError("Only one '/' permitted in %r" % addr):
557 self.factory(addr)
558
559 def test_address_errors(self):
560 def assertBadAddress(addr, details):
561 with self.assertAddressError(details):
562 self.factory(addr)
563
Nick Coghlan297b1432012-07-08 17:11:04 +1000564 assertBadAddress("/", "Address cannot be empty")
565 assertBadAddress("/8", "Address cannot be empty")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000566 assertBadAddress("google.com", "At least 3 parts")
567 assertBadAddress("1.2.3.4", "At least 3 parts")
568 assertBadAddress("10/8", "At least 3 parts")
569 assertBadAddress("1234:axy::b", "Only hex digits")
570
Nick Coghlan932346f2014-02-08 23:17:36 +1000571 def test_valid_netmask(self):
572 # We only support CIDR for IPv6, because expanded netmasks are not
573 # standard notation.
574 self.assertEqual(str(self.factory('2001:db8::/32')), '2001:db8::/32')
575 for i in range(0, 129):
576 # Generate and re-parse the CIDR format (trivial).
577 net_str = '::/%d' % i
578 self.assertEqual(str(self.factory(net_str)), net_str)
579 # Zero prefix is treated as decimal.
580 self.assertEqual(str(self.factory('::/0%d' % i)), net_str)
581
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000582 def test_netmask_errors(self):
583 def assertBadNetmask(addr, netmask):
Nick Coghlan932346f2014-02-08 23:17:36 +1000584 msg = "%r is not a valid netmask" % netmask
585 with self.assertNetmaskError(re.escape(msg)):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000586 self.factory("%s/%s" % (addr, netmask))
587
588 assertBadNetmask("::1", "")
589 assertBadNetmask("::1", "::1")
590 assertBadNetmask("::1", "1::")
Nick Coghlan932346f2014-02-08 23:17:36 +1000591 assertBadNetmask("::1", "-1")
592 assertBadNetmask("::1", "+1")
593 assertBadNetmask("::1", " 1 ")
594 assertBadNetmask("::1", "0x1")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000595 assertBadNetmask("::1", "129")
Nick Coghlan932346f2014-02-08 23:17:36 +1000596 assertBadNetmask("::1", "1.2.3.4")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000597 assertBadNetmask("::1", "pudding")
Nick Coghlan932346f2014-02-08 23:17:36 +1000598 assertBadNetmask("::", "::")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000599
Nicolai Moore5e48e3d2019-05-14 20:32:59 +1000600 def test_netmask_in_tuple_errors(self):
601 def assertBadNetmask(addr, netmask):
602 msg = "%r is not a valid netmask" % netmask
603 with self.assertNetmaskError(re.escape(msg)):
604 self.factory((addr, netmask))
605 assertBadNetmask("::1", -1)
606 assertBadNetmask("::1", 129)
607
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +0200608 def test_pickle(self):
609 self.pickle_test('2001:db8::1000/124')
610 self.pickle_test('2001:db8::1000/127') # IPV6LENGTH - 1
611 self.pickle_test('2001:db8::1000') # IPV6LENGTH
612
R David Murray75678652014-10-12 15:17:22 -0400613
Nick Coghlan07c4e332012-07-08 23:06:45 +1000614class InterfaceTestCase_v6(BaseTestCase, NetmaskTestMixin_v6):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000615 factory = ipaddress.IPv6Interface
616
R David Murray75678652014-10-12 15:17:22 -0400617
Nick Coghlan07c4e332012-07-08 23:06:45 +1000618class NetworkTestCase_v6(BaseTestCase, NetmaskTestMixin_v6):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000619 factory = ipaddress.IPv6Network
620
Cheryl Sabella91dc64b2017-10-22 17:39:49 -0400621 def test_subnet_of(self):
622 # containee left of container
623 self.assertFalse(
624 self.factory('2000:999::/56').subnet_of(
625 self.factory('2000:aaa::/48')))
626 # containee inside container
627 self.assertTrue(
628 self.factory('2000:aaa::/56').subnet_of(
629 self.factory('2000:aaa::/48')))
630 # containee right of container
631 self.assertFalse(
632 self.factory('2000:bbb::/56').subnet_of(
633 self.factory('2000:aaa::/48')))
634 # containee larger than container
635 self.assertFalse(
636 self.factory('2000:aaa::/48').subnet_of(
637 self.factory('2000:aaa::/56')))
638
639 def test_supernet_of(self):
640 # containee left of container
641 self.assertFalse(
642 self.factory('2000:999::/56').supernet_of(
643 self.factory('2000:aaa::/48')))
644 # containee inside container
645 self.assertFalse(
646 self.factory('2000:aaa::/56').supernet_of(
647 self.factory('2000:aaa::/48')))
648 # containee right of container
649 self.assertFalse(
650 self.factory('2000:bbb::/56').supernet_of(
651 self.factory('2000:aaa::/48')))
652 # containee larger than container
653 self.assertTrue(
654 self.factory('2000:aaa::/48').supernet_of(
655 self.factory('2000:aaa::/56')))
656
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000657
Nick Coghlan07c4e332012-07-08 23:06:45 +1000658class FactoryFunctionErrors(BaseTestCase):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000659
660 def assertFactoryError(self, factory, kind):
661 """Ensure a clean ValueError with the expected message"""
662 addr = "camelot"
663 msg = '%r does not appear to be an IPv4 or IPv6 %s'
664 with self.assertCleanError(ValueError, msg, addr, kind):
665 factory(addr)
666
667 def test_ip_address(self):
668 self.assertFactoryError(ipaddress.ip_address, "address")
669
670 def test_ip_interface(self):
671 self.assertFactoryError(ipaddress.ip_interface, "interface")
672
673 def test_ip_network(self):
674 self.assertFactoryError(ipaddress.ip_network, "network")
675
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200676
Nick Coghlan3008ec02012-07-08 00:45:33 +1000677class ComparisonTests(unittest.TestCase):
678
679 v4addr = ipaddress.IPv4Address(1)
680 v4net = ipaddress.IPv4Network(1)
681 v4intf = ipaddress.IPv4Interface(1)
682 v6addr = ipaddress.IPv6Address(1)
683 v6net = ipaddress.IPv6Network(1)
684 v6intf = ipaddress.IPv6Interface(1)
685
686 v4_addresses = [v4addr, v4intf]
687 v4_objects = v4_addresses + [v4net]
688 v6_addresses = [v6addr, v6intf]
689 v6_objects = v6_addresses + [v6net]
R David Murray947ff382016-06-02 15:46:04 -0400690
Nick Coghlan3008ec02012-07-08 00:45:33 +1000691 objects = v4_objects + v6_objects
692
R David Murray947ff382016-06-02 15:46:04 -0400693 v4addr2 = ipaddress.IPv4Address(2)
694 v4net2 = ipaddress.IPv4Network(2)
695 v4intf2 = ipaddress.IPv4Interface(2)
696 v6addr2 = ipaddress.IPv6Address(2)
697 v6net2 = ipaddress.IPv6Network(2)
698 v6intf2 = ipaddress.IPv6Interface(2)
699
Nick Coghlan3008ec02012-07-08 00:45:33 +1000700 def test_foreign_type_equality(self):
701 # __eq__ should never raise TypeError directly
702 other = object()
703 for obj in self.objects:
704 self.assertNotEqual(obj, other)
705 self.assertFalse(obj == other)
706 self.assertEqual(obj.__eq__(other), NotImplemented)
707 self.assertEqual(obj.__ne__(other), NotImplemented)
708
709 def test_mixed_type_equality(self):
710 # Ensure none of the internal objects accidentally
711 # expose the right set of attributes to become "equal"
712 for lhs in self.objects:
713 for rhs in self.objects:
714 if lhs is rhs:
715 continue
716 self.assertNotEqual(lhs, rhs)
717
R David Murray947ff382016-06-02 15:46:04 -0400718 def test_same_type_equality(self):
719 for obj in self.objects:
720 self.assertEqual(obj, obj)
721 self.assertLessEqual(obj, obj)
722 self.assertGreaterEqual(obj, obj)
723
724 def test_same_type_ordering(self):
725 for lhs, rhs in (
726 (self.v4addr, self.v4addr2),
727 (self.v4net, self.v4net2),
728 (self.v4intf, self.v4intf2),
729 (self.v6addr, self.v6addr2),
730 (self.v6net, self.v6net2),
731 (self.v6intf, self.v6intf2),
732 ):
733 self.assertNotEqual(lhs, rhs)
734 self.assertLess(lhs, rhs)
735 self.assertLessEqual(lhs, rhs)
736 self.assertGreater(rhs, lhs)
737 self.assertGreaterEqual(rhs, lhs)
738 self.assertFalse(lhs > rhs)
739 self.assertFalse(rhs < lhs)
740 self.assertFalse(lhs >= rhs)
741 self.assertFalse(rhs <= lhs)
742
Nick Coghlan3008ec02012-07-08 00:45:33 +1000743 def test_containment(self):
744 for obj in self.v4_addresses:
745 self.assertIn(obj, self.v4net)
746 for obj in self.v6_addresses:
747 self.assertIn(obj, self.v6net)
748 for obj in self.v4_objects + [self.v6net]:
749 self.assertNotIn(obj, self.v6net)
750 for obj in self.v6_objects + [self.v4net]:
751 self.assertNotIn(obj, self.v4net)
752
753 def test_mixed_type_ordering(self):
754 for lhs in self.objects:
755 for rhs in self.objects:
756 if isinstance(lhs, type(rhs)) or isinstance(rhs, type(lhs)):
757 continue
758 self.assertRaises(TypeError, lambda: lhs < rhs)
759 self.assertRaises(TypeError, lambda: lhs > rhs)
760 self.assertRaises(TypeError, lambda: lhs <= rhs)
761 self.assertRaises(TypeError, lambda: lhs >= rhs)
762
Serhiy Storchakaf186e122015-01-26 10:11:16 +0200763 def test_foreign_type_ordering(self):
764 other = object()
Serhiy Storchakaf186e122015-01-26 10:11:16 +0200765 for obj in self.objects:
766 with self.assertRaises(TypeError):
767 obj < other
768 with self.assertRaises(TypeError):
769 obj > other
770 with self.assertRaises(TypeError):
771 obj <= other
772 with self.assertRaises(TypeError):
773 obj >= other
Miss Islington (bot)dde944f2019-08-04 03:01:55 -0700774 self.assertTrue(obj < LARGEST)
775 self.assertFalse(obj > LARGEST)
776 self.assertTrue(obj <= LARGEST)
777 self.assertFalse(obj >= LARGEST)
778 self.assertFalse(obj < SMALLEST)
779 self.assertTrue(obj > SMALLEST)
780 self.assertFalse(obj <= SMALLEST)
781 self.assertTrue(obj >= SMALLEST)
Serhiy Storchakaf186e122015-01-26 10:11:16 +0200782
Nick Coghlan3008ec02012-07-08 00:45:33 +1000783 def test_mixed_type_key(self):
784 # with get_mixed_type_key, you can sort addresses and network.
785 v4_ordered = [self.v4addr, self.v4net, self.v4intf]
786 v6_ordered = [self.v6addr, self.v6net, self.v6intf]
787 self.assertEqual(v4_ordered,
788 sorted(self.v4_objects,
789 key=ipaddress.get_mixed_type_key))
790 self.assertEqual(v6_ordered,
791 sorted(self.v6_objects,
792 key=ipaddress.get_mixed_type_key))
793 self.assertEqual(v4_ordered + v6_ordered,
794 sorted(self.objects,
795 key=ipaddress.get_mixed_type_key))
796 self.assertEqual(NotImplemented, ipaddress.get_mixed_type_key(object))
797
798 def test_incompatible_versions(self):
799 # These should always raise TypeError
800 v4addr = ipaddress.ip_address('1.1.1.1')
801 v4net = ipaddress.ip_network('1.1.1.1')
802 v6addr = ipaddress.ip_address('::1')
Serhiy Storchakaf186e122015-01-26 10:11:16 +0200803 v6net = ipaddress.ip_network('::1')
Nick Coghlan3008ec02012-07-08 00:45:33 +1000804
805 self.assertRaises(TypeError, v4addr.__lt__, v6addr)
806 self.assertRaises(TypeError, v4addr.__gt__, v6addr)
807 self.assertRaises(TypeError, v4net.__lt__, v6net)
808 self.assertRaises(TypeError, v4net.__gt__, v6net)
809
810 self.assertRaises(TypeError, v6addr.__lt__, v4addr)
811 self.assertRaises(TypeError, v6addr.__gt__, v4addr)
812 self.assertRaises(TypeError, v6net.__lt__, v4net)
813 self.assertRaises(TypeError, v6net.__gt__, v4net)
814
815
Nick Coghlandc9b2552012-05-20 21:01:57 +1000816class IpaddrUnitTest(unittest.TestCase):
817
818 def setUp(self):
819 self.ipv4_address = ipaddress.IPv4Address('1.2.3.4')
820 self.ipv4_interface = ipaddress.IPv4Interface('1.2.3.4/24')
821 self.ipv4_network = ipaddress.IPv4Network('1.2.3.0/24')
822 #self.ipv4_hostmask = ipaddress.IPv4Interface('10.0.0.1/0.255.255.255')
823 self.ipv6_address = ipaddress.IPv6Interface(
824 '2001:658:22a:cafe:200:0:0:1')
825 self.ipv6_interface = ipaddress.IPv6Interface(
826 '2001:658:22a:cafe:200:0:0:1/64')
827 self.ipv6_network = ipaddress.IPv6Network('2001:658:22a:cafe::/64')
828
829 def testRepr(self):
830 self.assertEqual("IPv4Interface('1.2.3.4/32')",
831 repr(ipaddress.IPv4Interface('1.2.3.4')))
832 self.assertEqual("IPv6Interface('::1/128')",
833 repr(ipaddress.IPv6Interface('::1')))
834
Martin Panter204bf0b2016-07-11 07:51:37 +0000835 # issue #16531: constructing IPv4Network from an (address, mask) tuple
Antoine Pitrou5fb195f2014-05-12 20:36:46 +0200836 def testIPv4Tuple(self):
837 # /32
838 ip = ipaddress.IPv4Address('192.0.2.1')
839 net = ipaddress.IPv4Network('192.0.2.1/32')
840 self.assertEqual(ipaddress.IPv4Network(('192.0.2.1', 32)), net)
841 self.assertEqual(ipaddress.IPv4Network((ip, 32)), net)
842 self.assertEqual(ipaddress.IPv4Network((3221225985, 32)), net)
843 self.assertEqual(ipaddress.IPv4Network(('192.0.2.1',
844 '255.255.255.255')), net)
845 self.assertEqual(ipaddress.IPv4Network((ip,
846 '255.255.255.255')), net)
847 self.assertEqual(ipaddress.IPv4Network((3221225985,
848 '255.255.255.255')), net)
849 # strict=True and host bits set
850 with self.assertRaises(ValueError):
851 ipaddress.IPv4Network(('192.0.2.1', 24))
852 with self.assertRaises(ValueError):
853 ipaddress.IPv4Network((ip, 24))
854 with self.assertRaises(ValueError):
855 ipaddress.IPv4Network((3221225985, 24))
856 with self.assertRaises(ValueError):
857 ipaddress.IPv4Network(('192.0.2.1', '255.255.255.0'))
858 with self.assertRaises(ValueError):
859 ipaddress.IPv4Network((ip, '255.255.255.0'))
860 with self.assertRaises(ValueError):
861 ipaddress.IPv4Network((3221225985, '255.255.255.0'))
862 # strict=False and host bits set
863 net = ipaddress.IPv4Network('192.0.2.0/24')
864 self.assertEqual(ipaddress.IPv4Network(('192.0.2.1', 24),
865 strict=False), net)
866 self.assertEqual(ipaddress.IPv4Network((ip, 24),
867 strict=False), net)
868 self.assertEqual(ipaddress.IPv4Network((3221225985, 24),
869 strict=False), net)
870 self.assertEqual(ipaddress.IPv4Network(('192.0.2.1',
871 '255.255.255.0'),
872 strict=False), net)
873 self.assertEqual(ipaddress.IPv4Network((ip,
874 '255.255.255.0'),
875 strict=False), net)
876 self.assertEqual(ipaddress.IPv4Network((3221225985,
877 '255.255.255.0'),
878 strict=False), net)
879
880 # /24
881 ip = ipaddress.IPv4Address('192.0.2.0')
882 net = ipaddress.IPv4Network('192.0.2.0/24')
883 self.assertEqual(ipaddress.IPv4Network(('192.0.2.0',
884 '255.255.255.0')), net)
885 self.assertEqual(ipaddress.IPv4Network((ip,
886 '255.255.255.0')), net)
887 self.assertEqual(ipaddress.IPv4Network((3221225984,
888 '255.255.255.0')), net)
889 self.assertEqual(ipaddress.IPv4Network(('192.0.2.0', 24)), net)
890 self.assertEqual(ipaddress.IPv4Network((ip, 24)), net)
891 self.assertEqual(ipaddress.IPv4Network((3221225984, 24)), net)
892
893 self.assertEqual(ipaddress.IPv4Interface(('192.0.2.1', 24)),
894 ipaddress.IPv4Interface('192.0.2.1/24'))
895 self.assertEqual(ipaddress.IPv4Interface((3221225985, 24)),
896 ipaddress.IPv4Interface('192.0.2.1/24'))
897
Martin Panter204bf0b2016-07-11 07:51:37 +0000898 # issue #16531: constructing IPv6Network from an (address, mask) tuple
Antoine Pitrou5fb195f2014-05-12 20:36:46 +0200899 def testIPv6Tuple(self):
900 # /128
901 ip = ipaddress.IPv6Address('2001:db8::')
902 net = ipaddress.IPv6Network('2001:db8::/128')
903 self.assertEqual(ipaddress.IPv6Network(('2001:db8::', '128')),
904 net)
905 self.assertEqual(ipaddress.IPv6Network(
906 (42540766411282592856903984951653826560, 128)),
907 net)
908 self.assertEqual(ipaddress.IPv6Network((ip, '128')),
909 net)
910 ip = ipaddress.IPv6Address('2001:db8::')
911 net = ipaddress.IPv6Network('2001:db8::/96')
912 self.assertEqual(ipaddress.IPv6Network(('2001:db8::', '96')),
913 net)
914 self.assertEqual(ipaddress.IPv6Network(
915 (42540766411282592856903984951653826560, 96)),
916 net)
917 self.assertEqual(ipaddress.IPv6Network((ip, '96')),
918 net)
919
920 # strict=True and host bits set
921 ip = ipaddress.IPv6Address('2001:db8::1')
922 with self.assertRaises(ValueError):
923 ipaddress.IPv6Network(('2001:db8::1', 96))
924 with self.assertRaises(ValueError):
925 ipaddress.IPv6Network((
926 42540766411282592856903984951653826561, 96))
927 with self.assertRaises(ValueError):
928 ipaddress.IPv6Network((ip, 96))
929 # strict=False and host bits set
930 net = ipaddress.IPv6Network('2001:db8::/96')
931 self.assertEqual(ipaddress.IPv6Network(('2001:db8::1', 96),
932 strict=False),
933 net)
934 self.assertEqual(ipaddress.IPv6Network(
935 (42540766411282592856903984951653826561, 96),
936 strict=False),
937 net)
938 self.assertEqual(ipaddress.IPv6Network((ip, 96), strict=False),
939 net)
940
941 # /96
942 self.assertEqual(ipaddress.IPv6Interface(('2001:db8::1', '96')),
943 ipaddress.IPv6Interface('2001:db8::1/96'))
944 self.assertEqual(ipaddress.IPv6Interface(
945 (42540766411282592856903984951653826561, '96')),
946 ipaddress.IPv6Interface('2001:db8::1/96'))
947
Nick Coghlandc9b2552012-05-20 21:01:57 +1000948 # issue57
949 def testAddressIntMath(self):
950 self.assertEqual(ipaddress.IPv4Address('1.1.1.1') + 255,
951 ipaddress.IPv4Address('1.1.2.0'))
952 self.assertEqual(ipaddress.IPv4Address('1.1.1.1') - 256,
953 ipaddress.IPv4Address('1.1.0.1'))
954 self.assertEqual(ipaddress.IPv6Address('::1') + (2**16 - 2),
955 ipaddress.IPv6Address('::ffff'))
956 self.assertEqual(ipaddress.IPv6Address('::ffff') - (2**16 - 2),
957 ipaddress.IPv6Address('::1'))
958
Nick Coghlan3c2570c2012-07-07 01:13:55 +1000959 def testInvalidIntToBytes(self):
960 self.assertRaises(ValueError, ipaddress.v4_int_to_packed, -1)
961 self.assertRaises(ValueError, ipaddress.v4_int_to_packed,
962 2 ** ipaddress.IPV4LENGTH)
963 self.assertRaises(ValueError, ipaddress.v6_int_to_packed, -1)
964 self.assertRaises(ValueError, ipaddress.v6_int_to_packed,
965 2 ** ipaddress.IPV6LENGTH)
966
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200967 def testInternals(self):
Serhiy Storchakab53f0fb2015-01-19 00:41:32 +0200968 ip1 = ipaddress.IPv4Address('10.10.10.10')
969 ip2 = ipaddress.IPv4Address('10.10.10.11')
970 ip3 = ipaddress.IPv4Address('10.10.10.12')
971 self.assertEqual(list(ipaddress._find_address_range([ip1])),
972 [(ip1, ip1)])
973 self.assertEqual(list(ipaddress._find_address_range([ip1, ip3])),
974 [(ip1, ip1), (ip3, ip3)])
975 self.assertEqual(list(ipaddress._find_address_range([ip1, ip2, ip3])),
976 [(ip1, ip3)])
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200977 self.assertEqual(128, ipaddress._count_righthand_zero_bits(0, 128))
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200978 self.assertEqual("IPv4Network('1.2.3.0/24')", repr(self.ipv4_network))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000979
980 def testGetNetwork(self):
981 self.assertEqual(int(self.ipv4_network.network_address), 16909056)
982 self.assertEqual(str(self.ipv4_network.network_address), '1.2.3.0')
983
984 self.assertEqual(int(self.ipv6_network.network_address),
985 42540616829182469433403647294022090752)
986 self.assertEqual(str(self.ipv6_network.network_address),
987 '2001:658:22a:cafe::')
988 self.assertEqual(str(self.ipv6_network.hostmask),
989 '::ffff:ffff:ffff:ffff')
990
Nick Coghlandc9b2552012-05-20 21:01:57 +1000991 def testIpFromInt(self):
992 self.assertEqual(self.ipv4_interface._ip,
993 ipaddress.IPv4Interface(16909060)._ip)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000994
995 ipv4 = ipaddress.ip_network('1.2.3.4')
996 ipv6 = ipaddress.ip_network('2001:658:22a:cafe:200:0:0:1')
Nick Coghlan730f67f2012-08-05 22:02:18 +1000997 self.assertEqual(ipv4, ipaddress.ip_network(int(ipv4.network_address)))
998 self.assertEqual(ipv6, ipaddress.ip_network(int(ipv6.network_address)))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000999
1000 v6_int = 42540616829182469433547762482097946625
1001 self.assertEqual(self.ipv6_interface._ip,
1002 ipaddress.IPv6Interface(v6_int)._ip)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001003
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001004 self.assertEqual(ipaddress.ip_network(self.ipv4_address._ip).version,
1005 4)
1006 self.assertEqual(ipaddress.ip_network(self.ipv6_address._ip).version,
1007 6)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001008
1009 def testIpFromPacked(self):
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001010 address = ipaddress.ip_address
Nick Coghlandc9b2552012-05-20 21:01:57 +10001011 self.assertEqual(self.ipv4_interface._ip,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001012 ipaddress.ip_interface(b'\x01\x02\x03\x04')._ip)
1013 self.assertEqual(address('255.254.253.252'),
1014 address(b'\xff\xfe\xfd\xfc'))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001015 self.assertEqual(self.ipv6_interface.ip,
1016 ipaddress.ip_interface(
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001017 b'\x20\x01\x06\x58\x02\x2a\xca\xfe'
1018 b'\x02\x00\x00\x00\x00\x00\x00\x01').ip)
1019 self.assertEqual(address('ffff:2:3:4:ffff::'),
1020 address(b'\xff\xff\x00\x02\x00\x03\x00\x04' +
1021 b'\xff\xff' + b'\x00' * 6))
1022 self.assertEqual(address('::'),
1023 address(b'\x00' * 16))
1024
Nick Coghlandc9b2552012-05-20 21:01:57 +10001025 def testGetIp(self):
1026 self.assertEqual(int(self.ipv4_interface.ip), 16909060)
1027 self.assertEqual(str(self.ipv4_interface.ip), '1.2.3.4')
1028
1029 self.assertEqual(int(self.ipv6_interface.ip),
1030 42540616829182469433547762482097946625)
1031 self.assertEqual(str(self.ipv6_interface.ip),
1032 '2001:658:22a:cafe:200::1')
1033
1034 def testGetNetmask(self):
1035 self.assertEqual(int(self.ipv4_network.netmask), 4294967040)
1036 self.assertEqual(str(self.ipv4_network.netmask), '255.255.255.0')
1037 self.assertEqual(int(self.ipv6_network.netmask),
1038 340282366920938463444927863358058659840)
1039 self.assertEqual(self.ipv6_network.prefixlen, 64)
1040
1041 def testZeroNetmask(self):
1042 ipv4_zero_netmask = ipaddress.IPv4Interface('1.2.3.4/0')
1043 self.assertEqual(int(ipv4_zero_netmask.network.netmask), 0)
Nick Coghlan932346f2014-02-08 23:17:36 +10001044 self.assertEqual(ipv4_zero_netmask._prefix_from_prefix_string('0'), 0)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001045
1046 ipv6_zero_netmask = ipaddress.IPv6Interface('::1/0')
1047 self.assertEqual(int(ipv6_zero_netmask.network.netmask), 0)
Nick Coghlan932346f2014-02-08 23:17:36 +10001048 self.assertEqual(ipv6_zero_netmask._prefix_from_prefix_string('0'), 0)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001049
Rémi Lapeyree59ec1b2019-04-13 10:49:34 +02001050 def testIPv4Net(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001051 net = ipaddress.IPv4Network('127.0.0.0/0.0.0.255')
Nick Coghlan932346f2014-02-08 23:17:36 +10001052 self.assertEqual(net.prefixlen, 24)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001053
Nick Coghlandc9b2552012-05-20 21:01:57 +10001054 def testGetBroadcast(self):
1055 self.assertEqual(int(self.ipv4_network.broadcast_address), 16909311)
1056 self.assertEqual(str(self.ipv4_network.broadcast_address), '1.2.3.255')
1057
1058 self.assertEqual(int(self.ipv6_network.broadcast_address),
1059 42540616829182469451850391367731642367)
1060 self.assertEqual(str(self.ipv6_network.broadcast_address),
1061 '2001:658:22a:cafe:ffff:ffff:ffff:ffff')
1062
1063 def testGetPrefixlen(self):
Nick Coghlane3ded952012-08-05 22:45:22 +10001064 self.assertEqual(self.ipv4_interface.network.prefixlen, 24)
1065 self.assertEqual(self.ipv6_interface.network.prefixlen, 64)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001066
1067 def testGetSupernet(self):
1068 self.assertEqual(self.ipv4_network.supernet().prefixlen, 23)
1069 self.assertEqual(str(self.ipv4_network.supernet().network_address),
1070 '1.2.2.0')
1071 self.assertEqual(
1072 ipaddress.IPv4Interface('0.0.0.0/0').network.supernet(),
1073 ipaddress.IPv4Network('0.0.0.0/0'))
1074
1075 self.assertEqual(self.ipv6_network.supernet().prefixlen, 63)
1076 self.assertEqual(str(self.ipv6_network.supernet().network_address),
1077 '2001:658:22a:cafe::')
1078 self.assertEqual(ipaddress.IPv6Interface('::0/0').network.supernet(),
1079 ipaddress.IPv6Network('::0/0'))
1080
1081 def testGetSupernet3(self):
1082 self.assertEqual(self.ipv4_network.supernet(3).prefixlen, 21)
1083 self.assertEqual(str(self.ipv4_network.supernet(3).network_address),
1084 '1.2.0.0')
1085
1086 self.assertEqual(self.ipv6_network.supernet(3).prefixlen, 61)
1087 self.assertEqual(str(self.ipv6_network.supernet(3).network_address),
1088 '2001:658:22a:caf8::')
1089
1090 def testGetSupernet4(self):
1091 self.assertRaises(ValueError, self.ipv4_network.supernet,
1092 prefixlen_diff=2, new_prefix=1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001093 self.assertRaises(ValueError, self.ipv4_network.supernet,
1094 new_prefix=25)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001095 self.assertEqual(self.ipv4_network.supernet(prefixlen_diff=2),
1096 self.ipv4_network.supernet(new_prefix=22))
1097
1098 self.assertRaises(ValueError, self.ipv6_network.supernet,
1099 prefixlen_diff=2, new_prefix=1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001100 self.assertRaises(ValueError, self.ipv6_network.supernet,
1101 new_prefix=65)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001102 self.assertEqual(self.ipv6_network.supernet(prefixlen_diff=2),
1103 self.ipv6_network.supernet(new_prefix=62))
1104
1105 def testHosts(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001106 hosts = list(self.ipv4_network.hosts())
1107 self.assertEqual(254, len(hosts))
1108 self.assertEqual(ipaddress.IPv4Address('1.2.3.1'), hosts[0])
1109 self.assertEqual(ipaddress.IPv4Address('1.2.3.254'), hosts[-1])
1110
Xiang Zhang10b134a2018-03-21 08:25:13 +08001111 ipv6_network = ipaddress.IPv6Network('2001:658:22a:cafe::/120')
1112 hosts = list(ipv6_network.hosts())
1113 self.assertEqual(255, len(hosts))
1114 self.assertEqual(ipaddress.IPv6Address('2001:658:22a:cafe::1'), hosts[0])
1115 self.assertEqual(ipaddress.IPv6Address('2001:658:22a:cafe::ff'), hosts[-1])
1116
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001117 # special case where only 1 bit is left for address
Xiang Zhang10b134a2018-03-21 08:25:13 +08001118 addrs = [ipaddress.IPv4Address('2.0.0.0'),
1119 ipaddress.IPv4Address('2.0.0.1')]
1120 str_args = '2.0.0.0/31'
1121 tpl_args = ('2.0.0.0', 31)
1122 self.assertEqual(addrs, list(ipaddress.ip_network(str_args).hosts()))
1123 self.assertEqual(addrs, list(ipaddress.ip_network(tpl_args).hosts()))
1124 self.assertEqual(list(ipaddress.ip_network(str_args).hosts()),
1125 list(ipaddress.ip_network(tpl_args).hosts()))
1126
1127 addrs = [ipaddress.IPv6Address('2001:658:22a:cafe::'),
1128 ipaddress.IPv6Address('2001:658:22a:cafe::1')]
1129 str_args = '2001:658:22a:cafe::/127'
1130 tpl_args = ('2001:658:22a:cafe::', 127)
1131 self.assertEqual(addrs, list(ipaddress.ip_network(str_args).hosts()))
1132 self.assertEqual(addrs, list(ipaddress.ip_network(tpl_args).hosts()))
1133 self.assertEqual(list(ipaddress.ip_network(str_args).hosts()),
1134 list(ipaddress.ip_network(tpl_args).hosts()))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001135
1136 def testFancySubnetting(self):
1137 self.assertEqual(sorted(self.ipv4_network.subnets(prefixlen_diff=3)),
1138 sorted(self.ipv4_network.subnets(new_prefix=27)))
1139 self.assertRaises(ValueError, list,
1140 self.ipv4_network.subnets(new_prefix=23))
1141 self.assertRaises(ValueError, list,
1142 self.ipv4_network.subnets(prefixlen_diff=3,
1143 new_prefix=27))
1144 self.assertEqual(sorted(self.ipv6_network.subnets(prefixlen_diff=4)),
1145 sorted(self.ipv6_network.subnets(new_prefix=68)))
1146 self.assertRaises(ValueError, list,
1147 self.ipv6_network.subnets(new_prefix=63))
1148 self.assertRaises(ValueError, list,
1149 self.ipv6_network.subnets(prefixlen_diff=4,
1150 new_prefix=68))
1151
1152 def testGetSubnets(self):
1153 self.assertEqual(list(self.ipv4_network.subnets())[0].prefixlen, 25)
1154 self.assertEqual(str(list(
1155 self.ipv4_network.subnets())[0].network_address),
1156 '1.2.3.0')
1157 self.assertEqual(str(list(
1158 self.ipv4_network.subnets())[1].network_address),
1159 '1.2.3.128')
1160
1161 self.assertEqual(list(self.ipv6_network.subnets())[0].prefixlen, 65)
1162
1163 def testGetSubnetForSingle32(self):
1164 ip = ipaddress.IPv4Network('1.2.3.4/32')
1165 subnets1 = [str(x) for x in ip.subnets()]
1166 subnets2 = [str(x) for x in ip.subnets(2)]
1167 self.assertEqual(subnets1, ['1.2.3.4/32'])
1168 self.assertEqual(subnets1, subnets2)
1169
1170 def testGetSubnetForSingle128(self):
1171 ip = ipaddress.IPv6Network('::1/128')
1172 subnets1 = [str(x) for x in ip.subnets()]
1173 subnets2 = [str(x) for x in ip.subnets(2)]
1174 self.assertEqual(subnets1, ['::1/128'])
1175 self.assertEqual(subnets1, subnets2)
1176
1177 def testSubnet2(self):
1178 ips = [str(x) for x in self.ipv4_network.subnets(2)]
1179 self.assertEqual(
1180 ips,
1181 ['1.2.3.0/26', '1.2.3.64/26', '1.2.3.128/26', '1.2.3.192/26'])
1182
1183 ipsv6 = [str(x) for x in self.ipv6_network.subnets(2)]
1184 self.assertEqual(
1185 ipsv6,
1186 ['2001:658:22a:cafe::/66',
1187 '2001:658:22a:cafe:4000::/66',
1188 '2001:658:22a:cafe:8000::/66',
1189 '2001:658:22a:cafe:c000::/66'])
1190
Serhiy Storchakabb0dbd52016-03-01 10:25:45 +02001191 def testGetSubnets3(self):
1192 subnets = [str(x) for x in self.ipv4_network.subnets(8)]
1193 self.assertEqual(subnets[:3],
1194 ['1.2.3.0/32', '1.2.3.1/32', '1.2.3.2/32'])
1195 self.assertEqual(subnets[-3:],
1196 ['1.2.3.253/32', '1.2.3.254/32', '1.2.3.255/32'])
1197 self.assertEqual(len(subnets), 256)
1198
1199 ipv6_network = ipaddress.IPv6Network('2001:658:22a:cafe::/120')
1200 subnets = [str(x) for x in ipv6_network.subnets(8)]
1201 self.assertEqual(subnets[:3],
1202 ['2001:658:22a:cafe::/128',
1203 '2001:658:22a:cafe::1/128',
1204 '2001:658:22a:cafe::2/128'])
1205 self.assertEqual(subnets[-3:],
1206 ['2001:658:22a:cafe::fd/128',
1207 '2001:658:22a:cafe::fe/128',
1208 '2001:658:22a:cafe::ff/128'])
1209 self.assertEqual(len(subnets), 256)
1210
Nick Coghlandc9b2552012-05-20 21:01:57 +10001211 def testSubnetFailsForLargeCidrDiff(self):
1212 self.assertRaises(ValueError, list,
1213 self.ipv4_interface.network.subnets(9))
1214 self.assertRaises(ValueError, list,
1215 self.ipv4_network.subnets(9))
1216 self.assertRaises(ValueError, list,
1217 self.ipv6_interface.network.subnets(65))
1218 self.assertRaises(ValueError, list,
1219 self.ipv6_network.subnets(65))
1220
1221 def testSupernetFailsForLargeCidrDiff(self):
1222 self.assertRaises(ValueError,
1223 self.ipv4_interface.network.supernet, 25)
1224 self.assertRaises(ValueError,
1225 self.ipv6_interface.network.supernet, 65)
1226
1227 def testSubnetFailsForNegativeCidrDiff(self):
1228 self.assertRaises(ValueError, list,
1229 self.ipv4_interface.network.subnets(-1))
1230 self.assertRaises(ValueError, list,
Nick Coghlan2c589102012-05-27 01:03:25 +10001231 self.ipv4_network.subnets(-1))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001232 self.assertRaises(ValueError, list,
1233 self.ipv6_interface.network.subnets(-1))
1234 self.assertRaises(ValueError, list,
1235 self.ipv6_network.subnets(-1))
1236
1237 def testGetNum_Addresses(self):
1238 self.assertEqual(self.ipv4_network.num_addresses, 256)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001239 self.assertEqual(list(self.ipv4_network.subnets())[0].num_addresses,
1240 128)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001241 self.assertEqual(self.ipv4_network.supernet().num_addresses, 512)
1242
1243 self.assertEqual(self.ipv6_network.num_addresses, 18446744073709551616)
1244 self.assertEqual(list(self.ipv6_network.subnets())[0].num_addresses,
1245 9223372036854775808)
1246 self.assertEqual(self.ipv6_network.supernet().num_addresses,
1247 36893488147419103232)
1248
1249 def testContains(self):
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001250 self.assertIn(ipaddress.IPv4Interface('1.2.3.128/25'),
1251 self.ipv4_network)
1252 self.assertNotIn(ipaddress.IPv4Interface('1.2.4.1/24'),
Nick Coghlandc9b2552012-05-20 21:01:57 +10001253 self.ipv4_network)
1254 # We can test addresses and string as well.
1255 addr1 = ipaddress.IPv4Address('1.2.3.37')
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001256 self.assertIn(addr1, self.ipv4_network)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001257 # issue 61, bad network comparison on like-ip'd network objects
1258 # with identical broadcast addresses.
1259 self.assertFalse(ipaddress.IPv4Network('1.1.0.0/16').__contains__(
1260 ipaddress.IPv4Network('1.0.0.0/15')))
1261
Nick Coghlandc9b2552012-05-20 21:01:57 +10001262 def testNth(self):
1263 self.assertEqual(str(self.ipv4_network[5]), '1.2.3.5')
1264 self.assertRaises(IndexError, self.ipv4_network.__getitem__, 256)
1265
1266 self.assertEqual(str(self.ipv6_network[5]),
1267 '2001:658:22a:cafe::5')
Berker Peksag28dc1182016-06-11 22:30:05 +03001268 self.assertRaises(IndexError, self.ipv6_network.__getitem__, 1 << 64)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001269
1270 def testGetitem(self):
1271 # http://code.google.com/p/ipaddr-py/issues/detail?id=15
1272 addr = ipaddress.IPv4Network('172.31.255.128/255.255.255.240')
1273 self.assertEqual(28, addr.prefixlen)
1274 addr_list = list(addr)
1275 self.assertEqual('172.31.255.128', str(addr_list[0]))
1276 self.assertEqual('172.31.255.128', str(addr[0]))
1277 self.assertEqual('172.31.255.143', str(addr_list[-1]))
1278 self.assertEqual('172.31.255.143', str(addr[-1]))
1279 self.assertEqual(addr_list[-1], addr[-1])
1280
1281 def testEqual(self):
1282 self.assertTrue(self.ipv4_interface ==
1283 ipaddress.IPv4Interface('1.2.3.4/24'))
1284 self.assertFalse(self.ipv4_interface ==
1285 ipaddress.IPv4Interface('1.2.3.4/23'))
1286 self.assertFalse(self.ipv4_interface ==
1287 ipaddress.IPv6Interface('::1.2.3.4/24'))
1288 self.assertFalse(self.ipv4_interface == '')
1289 self.assertFalse(self.ipv4_interface == [])
1290 self.assertFalse(self.ipv4_interface == 2)
1291
1292 self.assertTrue(self.ipv6_interface ==
1293 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/64'))
1294 self.assertFalse(self.ipv6_interface ==
1295 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/63'))
1296 self.assertFalse(self.ipv6_interface ==
1297 ipaddress.IPv4Interface('1.2.3.4/23'))
1298 self.assertFalse(self.ipv6_interface == '')
1299 self.assertFalse(self.ipv6_interface == [])
1300 self.assertFalse(self.ipv6_interface == 2)
1301
1302 def testNotEqual(self):
1303 self.assertFalse(self.ipv4_interface !=
1304 ipaddress.IPv4Interface('1.2.3.4/24'))
1305 self.assertTrue(self.ipv4_interface !=
1306 ipaddress.IPv4Interface('1.2.3.4/23'))
1307 self.assertTrue(self.ipv4_interface !=
1308 ipaddress.IPv6Interface('::1.2.3.4/24'))
1309 self.assertTrue(self.ipv4_interface != '')
1310 self.assertTrue(self.ipv4_interface != [])
1311 self.assertTrue(self.ipv4_interface != 2)
1312
1313 self.assertTrue(self.ipv4_address !=
1314 ipaddress.IPv4Address('1.2.3.5'))
1315 self.assertTrue(self.ipv4_address != '')
1316 self.assertTrue(self.ipv4_address != [])
1317 self.assertTrue(self.ipv4_address != 2)
1318
1319 self.assertFalse(self.ipv6_interface !=
1320 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/64'))
1321 self.assertTrue(self.ipv6_interface !=
1322 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/63'))
1323 self.assertTrue(self.ipv6_interface !=
1324 ipaddress.IPv4Interface('1.2.3.4/23'))
1325 self.assertTrue(self.ipv6_interface != '')
1326 self.assertTrue(self.ipv6_interface != [])
1327 self.assertTrue(self.ipv6_interface != 2)
1328
1329 self.assertTrue(self.ipv6_address !=
1330 ipaddress.IPv4Address('1.2.3.4'))
1331 self.assertTrue(self.ipv6_address != '')
1332 self.assertTrue(self.ipv6_address != [])
1333 self.assertTrue(self.ipv6_address != 2)
1334
1335 def testSlash32Constructor(self):
1336 self.assertEqual(str(ipaddress.IPv4Interface(
1337 '1.2.3.4/255.255.255.255')), '1.2.3.4/32')
1338
1339 def testSlash128Constructor(self):
1340 self.assertEqual(str(ipaddress.IPv6Interface('::1/128')),
1341 '::1/128')
1342
1343 def testSlash0Constructor(self):
1344 self.assertEqual(str(ipaddress.IPv4Interface('1.2.3.4/0.0.0.0')),
1345 '1.2.3.4/0')
1346
1347 def testCollapsing(self):
1348 # test only IP addresses including some duplicates
1349 ip1 = ipaddress.IPv4Address('1.1.1.0')
1350 ip2 = ipaddress.IPv4Address('1.1.1.1')
1351 ip3 = ipaddress.IPv4Address('1.1.1.2')
1352 ip4 = ipaddress.IPv4Address('1.1.1.3')
1353 ip5 = ipaddress.IPv4Address('1.1.1.4')
1354 ip6 = ipaddress.IPv4Address('1.1.1.0')
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07001355 # check that addresses are subsumed properly.
Nick Coghlandc9b2552012-05-20 21:01:57 +10001356 collapsed = ipaddress.collapse_addresses(
1357 [ip1, ip2, ip3, ip4, ip5, ip6])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001358 self.assertEqual(list(collapsed),
1359 [ipaddress.IPv4Network('1.1.1.0/30'),
1360 ipaddress.IPv4Network('1.1.1.4/32')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001361
1362 # test a mix of IP addresses and networks including some duplicates
1363 ip1 = ipaddress.IPv4Address('1.1.1.0')
1364 ip2 = ipaddress.IPv4Address('1.1.1.1')
1365 ip3 = ipaddress.IPv4Address('1.1.1.2')
1366 ip4 = ipaddress.IPv4Address('1.1.1.3')
1367 #ip5 = ipaddress.IPv4Interface('1.1.1.4/30')
1368 #ip6 = ipaddress.IPv4Interface('1.1.1.4/30')
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07001369 # check that addresses are subsumed properly.
Nick Coghlandc9b2552012-05-20 21:01:57 +10001370 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3, ip4])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001371 self.assertEqual(list(collapsed),
1372 [ipaddress.IPv4Network('1.1.1.0/30')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001373
1374 # test only IP networks
1375 ip1 = ipaddress.IPv4Network('1.1.0.0/24')
1376 ip2 = ipaddress.IPv4Network('1.1.1.0/24')
1377 ip3 = ipaddress.IPv4Network('1.1.2.0/24')
1378 ip4 = ipaddress.IPv4Network('1.1.3.0/24')
1379 ip5 = ipaddress.IPv4Network('1.1.4.0/24')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001380 # stored in no particular order b/c we want CollapseAddr to call
1381 # [].sort
Nick Coghlandc9b2552012-05-20 21:01:57 +10001382 ip6 = ipaddress.IPv4Network('1.1.0.0/22')
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07001383 # check that addresses are subsumed properly.
Nick Coghlandc9b2552012-05-20 21:01:57 +10001384 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3, ip4, ip5,
1385 ip6])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001386 self.assertEqual(list(collapsed),
1387 [ipaddress.IPv4Network('1.1.0.0/22'),
1388 ipaddress.IPv4Network('1.1.4.0/24')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001389
1390 # test that two addresses are supernet'ed properly
1391 collapsed = ipaddress.collapse_addresses([ip1, ip2])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001392 self.assertEqual(list(collapsed),
1393 [ipaddress.IPv4Network('1.1.0.0/23')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001394
1395 # test same IP networks
1396 ip_same1 = ip_same2 = ipaddress.IPv4Network('1.1.1.1/32')
1397 self.assertEqual(list(ipaddress.collapse_addresses(
1398 [ip_same1, ip_same2])),
1399 [ip_same1])
1400
1401 # test same IP addresses
1402 ip_same1 = ip_same2 = ipaddress.IPv4Address('1.1.1.1')
1403 self.assertEqual(list(ipaddress.collapse_addresses(
1404 [ip_same1, ip_same2])),
1405 [ipaddress.ip_network('1.1.1.1/32')])
1406 ip1 = ipaddress.IPv6Network('2001::/100')
1407 ip2 = ipaddress.IPv6Network('2001::/120')
1408 ip3 = ipaddress.IPv6Network('2001::/96')
1409 # test that ipv6 addresses are subsumed properly.
1410 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3])
1411 self.assertEqual(list(collapsed), [ip3])
1412
1413 # the toejam test
Hynek Schlawack35db5132012-06-01 20:12:17 +02001414 addr_tuples = [
1415 (ipaddress.ip_address('1.1.1.1'),
1416 ipaddress.ip_address('::1')),
1417 (ipaddress.IPv4Network('1.1.0.0/24'),
1418 ipaddress.IPv6Network('2001::/120')),
1419 (ipaddress.IPv4Network('1.1.0.0/32'),
1420 ipaddress.IPv6Network('2001::/128')),
1421 ]
1422 for ip1, ip2 in addr_tuples:
1423 self.assertRaises(TypeError, ipaddress.collapse_addresses,
1424 [ip1, ip2])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001425
1426 def testSummarizing(self):
1427 #ip = ipaddress.ip_address
1428 #ipnet = ipaddress.ip_network
1429 summarize = ipaddress.summarize_address_range
1430 ip1 = ipaddress.ip_address('1.1.1.0')
1431 ip2 = ipaddress.ip_address('1.1.1.255')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001432
1433 # summarize works only for IPv4 & IPv6
1434 class IPv7Address(ipaddress.IPv6Address):
1435 @property
1436 def version(self):
1437 return 7
1438 ip_invalid1 = IPv7Address('::1')
1439 ip_invalid2 = IPv7Address('::1')
1440 self.assertRaises(ValueError, list,
1441 summarize(ip_invalid1, ip_invalid2))
1442 # test that a summary over ip4 & ip6 fails
1443 self.assertRaises(TypeError, list,
1444 summarize(ip1, ipaddress.IPv6Address('::1')))
1445 # test a /24 is summarized properly
Nick Coghlandc9b2552012-05-20 21:01:57 +10001446 self.assertEqual(list(summarize(ip1, ip2))[0],
1447 ipaddress.ip_network('1.1.1.0/24'))
Martin Panter7462b6492015-11-02 03:37:02 +00001448 # test an IPv4 range that isn't on a network byte boundary
Nick Coghlandc9b2552012-05-20 21:01:57 +10001449 ip2 = ipaddress.ip_address('1.1.1.8')
1450 self.assertEqual(list(summarize(ip1, ip2)),
1451 [ipaddress.ip_network('1.1.1.0/29'),
1452 ipaddress.ip_network('1.1.1.8')])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001453 # all!
1454 ip1 = ipaddress.IPv4Address(0)
1455 ip2 = ipaddress.IPv4Address(ipaddress.IPv4Address._ALL_ONES)
1456 self.assertEqual([ipaddress.IPv4Network('0.0.0.0/0')],
1457 list(summarize(ip1, ip2)))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001458
1459 ip1 = ipaddress.ip_address('1::')
1460 ip2 = ipaddress.ip_address('1:ffff:ffff:ffff:ffff:ffff:ffff:ffff')
Martin Panter7462b6492015-11-02 03:37:02 +00001461 # test an IPv6 is summarized properly
Nick Coghlandc9b2552012-05-20 21:01:57 +10001462 self.assertEqual(list(summarize(ip1, ip2))[0],
1463 ipaddress.ip_network('1::/16'))
1464 # test an IPv6 range that isn't on a network byte boundary
1465 ip2 = ipaddress.ip_address('2::')
1466 self.assertEqual(list(summarize(ip1, ip2)),
1467 [ipaddress.ip_network('1::/16'),
1468 ipaddress.ip_network('2::/128')])
1469
1470 # test exception raised when first is greater than last
1471 self.assertRaises(ValueError, list,
1472 summarize(ipaddress.ip_address('1.1.1.0'),
1473 ipaddress.ip_address('1.1.0.0')))
1474 # test exception raised when first and last aren't IP addresses
1475 self.assertRaises(TypeError, list,
1476 summarize(ipaddress.ip_network('1.1.1.0'),
1477 ipaddress.ip_network('1.1.0.0')))
1478 self.assertRaises(TypeError, list,
1479 summarize(ipaddress.ip_network('1.1.1.0'),
1480 ipaddress.ip_network('1.1.0.0')))
1481 # test exception raised when first and last are not same version
1482 self.assertRaises(TypeError, list,
1483 summarize(ipaddress.ip_address('::'),
1484 ipaddress.ip_network('1.1.0.0')))
1485
1486 def testAddressComparison(self):
1487 self.assertTrue(ipaddress.ip_address('1.1.1.1') <=
1488 ipaddress.ip_address('1.1.1.1'))
1489 self.assertTrue(ipaddress.ip_address('1.1.1.1') <=
1490 ipaddress.ip_address('1.1.1.2'))
1491 self.assertTrue(ipaddress.ip_address('::1') <=
1492 ipaddress.ip_address('::1'))
1493 self.assertTrue(ipaddress.ip_address('::1') <=
1494 ipaddress.ip_address('::2'))
1495
Nick Coghlan3008ec02012-07-08 00:45:33 +10001496 def testInterfaceComparison(self):
s-sanjay7bd8d3e2017-03-31 23:09:53 -07001497 self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') ==
1498 ipaddress.ip_interface('1.1.1.1/24'))
1499 self.assertTrue(ipaddress.ip_interface('1.1.1.1/16') <
1500 ipaddress.ip_interface('1.1.1.1/24'))
1501 self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') <
1502 ipaddress.ip_interface('1.1.1.2/24'))
1503 self.assertTrue(ipaddress.ip_interface('1.1.1.2/16') <
1504 ipaddress.ip_interface('1.1.1.1/24'))
1505 self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') >
1506 ipaddress.ip_interface('1.1.1.1/16'))
1507 self.assertTrue(ipaddress.ip_interface('1.1.1.2/24') >
1508 ipaddress.ip_interface('1.1.1.1/24'))
1509 self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') >
1510 ipaddress.ip_interface('1.1.1.2/16'))
1511
1512 self.assertTrue(ipaddress.ip_interface('::1/64') ==
1513 ipaddress.ip_interface('::1/64'))
1514 self.assertTrue(ipaddress.ip_interface('::1/64') <
1515 ipaddress.ip_interface('::1/80'))
1516 self.assertTrue(ipaddress.ip_interface('::1/64') <
1517 ipaddress.ip_interface('::2/64'))
1518 self.assertTrue(ipaddress.ip_interface('::2/48') <
1519 ipaddress.ip_interface('::1/64'))
1520 self.assertTrue(ipaddress.ip_interface('::1/80') >
1521 ipaddress.ip_interface('::1/64'))
1522 self.assertTrue(ipaddress.ip_interface('::2/64') >
1523 ipaddress.ip_interface('::1/64'))
1524 self.assertTrue(ipaddress.ip_interface('::1/64') >
1525 ipaddress.ip_interface('::2/48'))
Nick Coghlan3008ec02012-07-08 00:45:33 +10001526
Nick Coghlandc9b2552012-05-20 21:01:57 +10001527 def testNetworkComparison(self):
1528 # ip1 and ip2 have the same network address
1529 ip1 = ipaddress.IPv4Network('1.1.1.0/24')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001530 ip2 = ipaddress.IPv4Network('1.1.1.0/32')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001531 ip3 = ipaddress.IPv4Network('1.1.2.0/24')
1532
1533 self.assertTrue(ip1 < ip3)
1534 self.assertTrue(ip3 > ip2)
1535
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001536 self.assertEqual(ip1.compare_networks(ip1), 0)
1537
1538 # if addresses are the same, sort by netmask
1539 self.assertEqual(ip1.compare_networks(ip2), -1)
1540 self.assertEqual(ip2.compare_networks(ip1), 1)
1541
Nick Coghlandc9b2552012-05-20 21:01:57 +10001542 self.assertEqual(ip1.compare_networks(ip3), -1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001543 self.assertEqual(ip3.compare_networks(ip1), 1)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001544 self.assertTrue(ip1._get_networks_key() < ip3._get_networks_key())
1545
1546 ip1 = ipaddress.IPv6Network('2001:2000::/96')
1547 ip2 = ipaddress.IPv6Network('2001:2001::/96')
1548 ip3 = ipaddress.IPv6Network('2001:ffff:2000::/96')
1549
1550 self.assertTrue(ip1 < ip3)
1551 self.assertTrue(ip3 > ip2)
1552 self.assertEqual(ip1.compare_networks(ip3), -1)
1553 self.assertTrue(ip1._get_networks_key() < ip3._get_networks_key())
1554
1555 # Test comparing different protocols.
1556 # Should always raise a TypeError.
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001557 self.assertRaises(TypeError,
1558 self.ipv4_network.compare_networks,
1559 self.ipv6_network)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001560 ipv6 = ipaddress.IPv6Interface('::/0')
1561 ipv4 = ipaddress.IPv4Interface('0.0.0.0/0')
1562 self.assertRaises(TypeError, ipv4.__lt__, ipv6)
1563 self.assertRaises(TypeError, ipv4.__gt__, ipv6)
1564 self.assertRaises(TypeError, ipv6.__lt__, ipv4)
1565 self.assertRaises(TypeError, ipv6.__gt__, ipv4)
1566
1567 # Regression test for issue 19.
1568 ip1 = ipaddress.ip_network('10.1.2.128/25')
1569 self.assertFalse(ip1 < ip1)
1570 self.assertFalse(ip1 > ip1)
1571 ip2 = ipaddress.ip_network('10.1.3.0/24')
1572 self.assertTrue(ip1 < ip2)
1573 self.assertFalse(ip2 < ip1)
1574 self.assertFalse(ip1 > ip2)
1575 self.assertTrue(ip2 > ip1)
1576 ip3 = ipaddress.ip_network('10.1.3.0/25')
1577 self.assertTrue(ip2 < ip3)
1578 self.assertFalse(ip3 < ip2)
1579 self.assertFalse(ip2 > ip3)
1580 self.assertTrue(ip3 > ip2)
1581
1582 # Regression test for issue 28.
1583 ip1 = ipaddress.ip_network('10.10.10.0/31')
1584 ip2 = ipaddress.ip_network('10.10.10.0')
1585 ip3 = ipaddress.ip_network('10.10.10.2/31')
1586 ip4 = ipaddress.ip_network('10.10.10.2')
1587 sorted = [ip1, ip2, ip3, ip4]
1588 unsorted = [ip2, ip4, ip1, ip3]
1589 unsorted.sort()
1590 self.assertEqual(sorted, unsorted)
1591 unsorted = [ip4, ip1, ip3, ip2]
1592 unsorted.sort()
1593 self.assertEqual(sorted, unsorted)
Serhiy Storchakaf186e122015-01-26 10:11:16 +02001594 self.assertIs(ip1.__lt__(ipaddress.ip_address('10.10.10.0')),
1595 NotImplemented)
1596 self.assertIs(ip2.__lt__(ipaddress.ip_address('10.10.10.0')),
1597 NotImplemented)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001598
1599 # <=, >=
1600 self.assertTrue(ipaddress.ip_network('1.1.1.1') <=
1601 ipaddress.ip_network('1.1.1.1'))
1602 self.assertTrue(ipaddress.ip_network('1.1.1.1') <=
1603 ipaddress.ip_network('1.1.1.2'))
1604 self.assertFalse(ipaddress.ip_network('1.1.1.2') <=
1605 ipaddress.ip_network('1.1.1.1'))
1606 self.assertTrue(ipaddress.ip_network('::1') <=
1607 ipaddress.ip_network('::1'))
1608 self.assertTrue(ipaddress.ip_network('::1') <=
1609 ipaddress.ip_network('::2'))
1610 self.assertFalse(ipaddress.ip_network('::2') <=
1611 ipaddress.ip_network('::1'))
1612
1613 def testStrictNetworks(self):
1614 self.assertRaises(ValueError, ipaddress.ip_network, '192.168.1.1/24')
1615 self.assertRaises(ValueError, ipaddress.ip_network, '::1/120')
1616
1617 def testOverlaps(self):
1618 other = ipaddress.IPv4Network('1.2.3.0/30')
1619 other2 = ipaddress.IPv4Network('1.2.2.0/24')
1620 other3 = ipaddress.IPv4Network('1.2.2.64/26')
1621 self.assertTrue(self.ipv4_network.overlaps(other))
1622 self.assertFalse(self.ipv4_network.overlaps(other2))
1623 self.assertTrue(other2.overlaps(other3))
1624
1625 def testEmbeddedIpv4(self):
1626 ipv4_string = '192.168.0.1'
1627 ipv4 = ipaddress.IPv4Interface(ipv4_string)
1628 v4compat_ipv6 = ipaddress.IPv6Interface('::%s' % ipv4_string)
1629 self.assertEqual(int(v4compat_ipv6.ip), int(ipv4.ip))
1630 v4mapped_ipv6 = ipaddress.IPv6Interface('::ffff:%s' % ipv4_string)
1631 self.assertNotEqual(v4mapped_ipv6.ip, ipv4.ip)
1632 self.assertRaises(ipaddress.AddressValueError, ipaddress.IPv6Interface,
1633 '2001:1.1.1.1:1.1.1.1')
1634
1635 # Issue 67: IPv6 with embedded IPv4 address not recognized.
1636 def testIPv6AddressTooLarge(self):
1637 # RFC4291 2.5.5.2
1638 self.assertEqual(ipaddress.ip_address('::FFFF:192.0.2.1'),
1639 ipaddress.ip_address('::FFFF:c000:201'))
1640 # RFC4291 2.2 (part 3) x::d.d.d.d
1641 self.assertEqual(ipaddress.ip_address('FFFF::192.0.2.1'),
1642 ipaddress.ip_address('FFFF::c000:201'))
1643
1644 def testIPVersion(self):
1645 self.assertEqual(self.ipv4_address.version, 4)
1646 self.assertEqual(self.ipv6_address.version, 6)
1647
1648 def testMaxPrefixLength(self):
1649 self.assertEqual(self.ipv4_interface.max_prefixlen, 32)
1650 self.assertEqual(self.ipv6_interface.max_prefixlen, 128)
1651
1652 def testPacked(self):
1653 self.assertEqual(self.ipv4_address.packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001654 b'\x01\x02\x03\x04')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001655 self.assertEqual(ipaddress.IPv4Interface('255.254.253.252').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001656 b'\xff\xfe\xfd\xfc')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001657 self.assertEqual(self.ipv6_address.packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001658 b'\x20\x01\x06\x58\x02\x2a\xca\xfe'
1659 b'\x02\x00\x00\x00\x00\x00\x00\x01')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001660 self.assertEqual(ipaddress.IPv6Interface('ffff:2:3:4:ffff::').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001661 b'\xff\xff\x00\x02\x00\x03\x00\x04\xff\xff'
1662 + b'\x00' * 6)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001663 self.assertEqual(ipaddress.IPv6Interface('::1:0:0:0:0').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001664 b'\x00' * 6 + b'\x00\x01' + b'\x00' * 8)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001665
Nick Coghlandc9b2552012-05-20 21:01:57 +10001666 def testIpType(self):
1667 ipv4net = ipaddress.ip_network('1.2.3.4')
1668 ipv4addr = ipaddress.ip_address('1.2.3.4')
1669 ipv6net = ipaddress.ip_network('::1.2.3.4')
1670 ipv6addr = ipaddress.ip_address('::1.2.3.4')
1671 self.assertEqual(ipaddress.IPv4Network, type(ipv4net))
1672 self.assertEqual(ipaddress.IPv4Address, type(ipv4addr))
1673 self.assertEqual(ipaddress.IPv6Network, type(ipv6net))
1674 self.assertEqual(ipaddress.IPv6Address, type(ipv6addr))
1675
1676 def testReservedIpv4(self):
1677 # test networks
1678 self.assertEqual(True, ipaddress.ip_interface(
1679 '224.1.1.1/31').is_multicast)
1680 self.assertEqual(False, ipaddress.ip_network('240.0.0.0').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001681 self.assertEqual(True, ipaddress.ip_network('240.0.0.0').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001682
1683 self.assertEqual(True, ipaddress.ip_interface(
1684 '192.168.1.1/17').is_private)
1685 self.assertEqual(False, ipaddress.ip_network('192.169.0.0').is_private)
1686 self.assertEqual(True, ipaddress.ip_network(
1687 '10.255.255.255').is_private)
1688 self.assertEqual(False, ipaddress.ip_network('11.0.0.0').is_private)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001689 self.assertEqual(False, ipaddress.ip_network('11.0.0.0').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001690 self.assertEqual(True, ipaddress.ip_network(
1691 '172.31.255.255').is_private)
1692 self.assertEqual(False, ipaddress.ip_network('172.32.0.0').is_private)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001693 self.assertEqual(True,
1694 ipaddress.ip_network('169.254.1.0/24').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001695
1696 self.assertEqual(True,
1697 ipaddress.ip_interface(
1698 '169.254.100.200/24').is_link_local)
1699 self.assertEqual(False,
1700 ipaddress.ip_interface(
1701 '169.255.100.200/24').is_link_local)
1702
1703 self.assertEqual(True,
1704 ipaddress.ip_network(
1705 '127.100.200.254/32').is_loopback)
1706 self.assertEqual(True, ipaddress.ip_network(
1707 '127.42.0.0/16').is_loopback)
1708 self.assertEqual(False, ipaddress.ip_network('128.0.0.0').is_loopback)
Peter Moodye5019d52013-10-24 09:47:10 -07001709 self.assertEqual(False,
1710 ipaddress.ip_network('100.64.0.0/10').is_private)
Peter Moodybe9c1b12013-10-22 12:36:21 -07001711 self.assertEqual(False, ipaddress.ip_network('100.64.0.0/10').is_global)
Peter Moodye5019d52013-10-24 09:47:10 -07001712
Peter Moody22c31762013-10-21 13:58:06 -07001713 self.assertEqual(True,
1714 ipaddress.ip_network('192.0.2.128/25').is_private)
1715 self.assertEqual(True,
1716 ipaddress.ip_network('192.0.3.0/24').is_global)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001717
1718 # test addresses
Hynek Schlawackbcd30442012-06-04 14:19:39 +02001719 self.assertEqual(True, ipaddress.ip_address('0.0.0.0').is_unspecified)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001720 self.assertEqual(True, ipaddress.ip_address('224.1.1.1').is_multicast)
1721 self.assertEqual(False, ipaddress.ip_address('240.0.0.0').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001722 self.assertEqual(True, ipaddress.ip_address('240.0.0.1').is_reserved)
1723 self.assertEqual(False,
1724 ipaddress.ip_address('239.255.255.255').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001725
1726 self.assertEqual(True, ipaddress.ip_address('192.168.1.1').is_private)
1727 self.assertEqual(False, ipaddress.ip_address('192.169.0.0').is_private)
1728 self.assertEqual(True, ipaddress.ip_address(
1729 '10.255.255.255').is_private)
1730 self.assertEqual(False, ipaddress.ip_address('11.0.0.0').is_private)
1731 self.assertEqual(True, ipaddress.ip_address(
1732 '172.31.255.255').is_private)
1733 self.assertEqual(False, ipaddress.ip_address('172.32.0.0').is_private)
1734
1735 self.assertEqual(True,
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001736 ipaddress.ip_address('169.254.100.200').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001737 self.assertEqual(False,
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001738 ipaddress.ip_address('169.255.100.200').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001739
Berker Peksag742192a2016-06-11 22:11:47 +03001740 self.assertTrue(ipaddress.ip_address('192.0.7.1').is_global)
1741 self.assertFalse(ipaddress.ip_address('203.0.113.1').is_global)
1742
Nick Coghlandc9b2552012-05-20 21:01:57 +10001743 self.assertEqual(True,
1744 ipaddress.ip_address('127.100.200.254').is_loopback)
1745 self.assertEqual(True, ipaddress.ip_address('127.42.0.0').is_loopback)
1746 self.assertEqual(False, ipaddress.ip_address('128.0.0.0').is_loopback)
1747 self.assertEqual(True, ipaddress.ip_network('0.0.0.0').is_unspecified)
1748
1749 def testReservedIpv6(self):
1750
1751 self.assertEqual(True, ipaddress.ip_network('ffff::').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001752 self.assertEqual(True, ipaddress.ip_network(2**128 - 1).is_multicast)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001753 self.assertEqual(True, ipaddress.ip_network('ff00::').is_multicast)
1754 self.assertEqual(False, ipaddress.ip_network('fdff::').is_multicast)
1755
1756 self.assertEqual(True, ipaddress.ip_network('fecf::').is_site_local)
1757 self.assertEqual(True, ipaddress.ip_network(
1758 'feff:ffff:ffff:ffff::').is_site_local)
1759 self.assertEqual(False, ipaddress.ip_network(
1760 'fbf:ffff::').is_site_local)
1761 self.assertEqual(False, ipaddress.ip_network('ff00::').is_site_local)
1762
1763 self.assertEqual(True, ipaddress.ip_network('fc00::').is_private)
1764 self.assertEqual(True, ipaddress.ip_network(
1765 'fc00:ffff:ffff:ffff::').is_private)
1766 self.assertEqual(False, ipaddress.ip_network('fbff:ffff::').is_private)
1767 self.assertEqual(False, ipaddress.ip_network('fe00::').is_private)
1768
1769 self.assertEqual(True, ipaddress.ip_network('fea0::').is_link_local)
1770 self.assertEqual(True, ipaddress.ip_network(
1771 'febf:ffff::').is_link_local)
1772 self.assertEqual(False, ipaddress.ip_network(
1773 'fe7f:ffff::').is_link_local)
1774 self.assertEqual(False, ipaddress.ip_network('fec0::').is_link_local)
1775
1776 self.assertEqual(True, ipaddress.ip_interface('0:0::0:01').is_loopback)
1777 self.assertEqual(False, ipaddress.ip_interface('::1/127').is_loopback)
1778 self.assertEqual(False, ipaddress.ip_network('::').is_loopback)
1779 self.assertEqual(False, ipaddress.ip_network('::2').is_loopback)
1780
1781 self.assertEqual(True, ipaddress.ip_network('0::0').is_unspecified)
1782 self.assertEqual(False, ipaddress.ip_network('::1').is_unspecified)
1783 self.assertEqual(False, ipaddress.ip_network('::/127').is_unspecified)
1784
Peter Moody22c31762013-10-21 13:58:06 -07001785 self.assertEqual(True,
1786 ipaddress.ip_network('2001::1/128').is_private)
1787 self.assertEqual(True,
1788 ipaddress.ip_network('200::1/128').is_global)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001789 # test addresses
1790 self.assertEqual(True, ipaddress.ip_address('ffff::').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001791 self.assertEqual(True, ipaddress.ip_address(2**128 - 1).is_multicast)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001792 self.assertEqual(True, ipaddress.ip_address('ff00::').is_multicast)
1793 self.assertEqual(False, ipaddress.ip_address('fdff::').is_multicast)
1794
1795 self.assertEqual(True, ipaddress.ip_address('fecf::').is_site_local)
1796 self.assertEqual(True, ipaddress.ip_address(
1797 'feff:ffff:ffff:ffff::').is_site_local)
1798 self.assertEqual(False, ipaddress.ip_address(
1799 'fbf:ffff::').is_site_local)
1800 self.assertEqual(False, ipaddress.ip_address('ff00::').is_site_local)
1801
1802 self.assertEqual(True, ipaddress.ip_address('fc00::').is_private)
1803 self.assertEqual(True, ipaddress.ip_address(
1804 'fc00:ffff:ffff:ffff::').is_private)
1805 self.assertEqual(False, ipaddress.ip_address('fbff:ffff::').is_private)
1806 self.assertEqual(False, ipaddress.ip_address('fe00::').is_private)
1807
1808 self.assertEqual(True, ipaddress.ip_address('fea0::').is_link_local)
1809 self.assertEqual(True, ipaddress.ip_address(
1810 'febf:ffff::').is_link_local)
1811 self.assertEqual(False, ipaddress.ip_address(
1812 'fe7f:ffff::').is_link_local)
1813 self.assertEqual(False, ipaddress.ip_address('fec0::').is_link_local)
1814
1815 self.assertEqual(True, ipaddress.ip_address('0:0::0:01').is_loopback)
1816 self.assertEqual(True, ipaddress.ip_address('::1').is_loopback)
1817 self.assertEqual(False, ipaddress.ip_address('::2').is_loopback)
1818
1819 self.assertEqual(True, ipaddress.ip_address('0::0').is_unspecified)
1820 self.assertEqual(False, ipaddress.ip_address('::1').is_unspecified)
1821
1822 # some generic IETF reserved addresses
1823 self.assertEqual(True, ipaddress.ip_address('100::').is_reserved)
1824 self.assertEqual(True, ipaddress.ip_network('4000::1/128').is_reserved)
1825
1826 def testIpv4Mapped(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001827 self.assertEqual(
1828 ipaddress.ip_address('::ffff:192.168.1.1').ipv4_mapped,
1829 ipaddress.ip_address('192.168.1.1'))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001830 self.assertEqual(ipaddress.ip_address('::c0a8:101').ipv4_mapped, None)
1831 self.assertEqual(ipaddress.ip_address('::ffff:c0a8:101').ipv4_mapped,
1832 ipaddress.ip_address('192.168.1.1'))
1833
1834 def testAddrExclude(self):
1835 addr1 = ipaddress.ip_network('10.1.1.0/24')
1836 addr2 = ipaddress.ip_network('10.1.1.0/26')
1837 addr3 = ipaddress.ip_network('10.2.1.0/24')
1838 addr4 = ipaddress.ip_address('10.1.1.0')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001839 addr5 = ipaddress.ip_network('2001:db8::0/32')
Serhiy Storchakabb0dbd52016-03-01 10:25:45 +02001840 addr6 = ipaddress.ip_network('10.1.1.5/32')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001841 self.assertEqual(sorted(list(addr1.address_exclude(addr2))),
1842 [ipaddress.ip_network('10.1.1.64/26'),
1843 ipaddress.ip_network('10.1.1.128/25')])
1844 self.assertRaises(ValueError, list, addr1.address_exclude(addr3))
1845 self.assertRaises(TypeError, list, addr1.address_exclude(addr4))
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001846 self.assertRaises(TypeError, list, addr1.address_exclude(addr5))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001847 self.assertEqual(list(addr1.address_exclude(addr1)), [])
Serhiy Storchakabb0dbd52016-03-01 10:25:45 +02001848 self.assertEqual(sorted(list(addr1.address_exclude(addr6))),
1849 [ipaddress.ip_network('10.1.1.0/30'),
1850 ipaddress.ip_network('10.1.1.4/32'),
1851 ipaddress.ip_network('10.1.1.6/31'),
1852 ipaddress.ip_network('10.1.1.8/29'),
1853 ipaddress.ip_network('10.1.1.16/28'),
1854 ipaddress.ip_network('10.1.1.32/27'),
1855 ipaddress.ip_network('10.1.1.64/26'),
1856 ipaddress.ip_network('10.1.1.128/25')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001857
1858 def testHash(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001859 self.assertEqual(hash(ipaddress.ip_interface('10.1.1.0/24')),
1860 hash(ipaddress.ip_interface('10.1.1.0/24')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001861 self.assertEqual(hash(ipaddress.ip_network('10.1.1.0/24')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001862 hash(ipaddress.ip_network('10.1.1.0/24')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001863 self.assertEqual(hash(ipaddress.ip_address('10.1.1.0')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001864 hash(ipaddress.ip_address('10.1.1.0')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001865 # i70
1866 self.assertEqual(hash(ipaddress.ip_address('1.2.3.4')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001867 hash(ipaddress.ip_address(
Nick Coghlandc9b2552012-05-20 21:01:57 +10001868 int(ipaddress.ip_address('1.2.3.4')._ip))))
1869 ip1 = ipaddress.ip_address('10.1.1.0')
1870 ip2 = ipaddress.ip_address('1::')
1871 dummy = {}
1872 dummy[self.ipv4_address] = None
1873 dummy[self.ipv6_address] = None
1874 dummy[ip1] = None
1875 dummy[ip2] = None
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001876 self.assertIn(self.ipv4_address, dummy)
1877 self.assertIn(ip2, dummy)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001878
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001879 def testIPBases(self):
1880 net = self.ipv4_network
1881 self.assertEqual('1.2.3.0/24', net.compressed)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001882 net = self.ipv6_network
1883 self.assertRaises(ValueError, net._string_from_ip_int, 2**128 + 1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001884
Hynek Schlawack454a74d2012-06-04 18:14:02 +02001885 def testIPv6NetworkHelpers(self):
1886 net = self.ipv6_network
1887 self.assertEqual('2001:658:22a:cafe::/64', net.with_prefixlen)
1888 self.assertEqual('2001:658:22a:cafe::/ffff:ffff:ffff:ffff::',
1889 net.with_netmask)
1890 self.assertEqual('2001:658:22a:cafe::/::ffff:ffff:ffff:ffff',
1891 net.with_hostmask)
1892 self.assertEqual('2001:658:22a:cafe::/64', str(net))
1893
1894 def testIPv4NetworkHelpers(self):
1895 net = self.ipv4_network
1896 self.assertEqual('1.2.3.0/24', net.with_prefixlen)
1897 self.assertEqual('1.2.3.0/255.255.255.0', net.with_netmask)
1898 self.assertEqual('1.2.3.0/0.0.0.255', net.with_hostmask)
1899 self.assertEqual('1.2.3.0/24', str(net))
1900
Nick Coghlandc9b2552012-05-20 21:01:57 +10001901 def testCopyConstructor(self):
1902 addr1 = ipaddress.ip_network('10.1.1.0/24')
1903 addr2 = ipaddress.ip_network(addr1)
1904 addr3 = ipaddress.ip_interface('2001:658:22a:cafe:200::1/64')
1905 addr4 = ipaddress.ip_interface(addr3)
1906 addr5 = ipaddress.IPv4Address('1.1.1.1')
1907 addr6 = ipaddress.IPv6Address('2001:658:22a:cafe:200::1')
1908
1909 self.assertEqual(addr1, addr2)
1910 self.assertEqual(addr3, addr4)
1911 self.assertEqual(addr5, ipaddress.IPv4Address(addr5))
1912 self.assertEqual(addr6, ipaddress.IPv6Address(addr6))
1913
1914 def testCompressIPv6Address(self):
1915 test_addresses = {
1916 '1:2:3:4:5:6:7:8': '1:2:3:4:5:6:7:8/128',
1917 '2001:0:0:4:0:0:0:8': '2001:0:0:4::8/128',
1918 '2001:0:0:4:5:6:7:8': '2001::4:5:6:7:8/128',
1919 '2001:0:3:4:5:6:7:8': '2001:0:3:4:5:6:7:8/128',
Nick Coghlandc9b2552012-05-20 21:01:57 +10001920 '0:0:3:0:0:0:0:ffff': '0:0:3::ffff/128',
1921 '0:0:0:4:0:0:0:ffff': '::4:0:0:0:ffff/128',
1922 '0:0:0:0:5:0:0:ffff': '::5:0:0:ffff/128',
1923 '1:0:0:4:0:0:7:8': '1::4:0:0:7:8/128',
1924 '0:0:0:0:0:0:0:0': '::/128',
1925 '0:0:0:0:0:0:0:0/0': '::/0',
1926 '0:0:0:0:0:0:0:1': '::1/128',
1927 '2001:0658:022a:cafe:0000:0000:0000:0000/66':
1928 '2001:658:22a:cafe::/66',
1929 '::1.2.3.4': '::102:304/128',
1930 '1:2:3:4:5:ffff:1.2.3.4': '1:2:3:4:5:ffff:102:304/128',
1931 '::7:6:5:4:3:2:1': '0:7:6:5:4:3:2:1/128',
1932 '::7:6:5:4:3:2:0': '0:7:6:5:4:3:2:0/128',
1933 '7:6:5:4:3:2:1::': '7:6:5:4:3:2:1:0/128',
1934 '0:6:5:4:3:2:1::': '0:6:5:4:3:2:1:0/128',
1935 }
1936 for uncompressed, compressed in list(test_addresses.items()):
1937 self.assertEqual(compressed, str(ipaddress.IPv6Interface(
1938 uncompressed)))
1939
1940 def testExplodeShortHandIpStr(self):
1941 addr1 = ipaddress.IPv6Interface('2001::1')
1942 addr2 = ipaddress.IPv6Address('2001:0:5ef5:79fd:0:59d:a0e5:ba1')
1943 addr3 = ipaddress.IPv6Network('2001::/96')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001944 addr4 = ipaddress.IPv4Address('192.168.178.1')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001945 self.assertEqual('2001:0000:0000:0000:0000:0000:0000:0001/128',
1946 addr1.exploded)
1947 self.assertEqual('0000:0000:0000:0000:0000:0000:0000:0001/128',
1948 ipaddress.IPv6Interface('::1/128').exploded)
1949 # issue 77
1950 self.assertEqual('2001:0000:5ef5:79fd:0000:059d:a0e5:0ba1',
1951 addr2.exploded)
1952 self.assertEqual('2001:0000:0000:0000:0000:0000:0000:0000/96',
1953 addr3.exploded)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001954 self.assertEqual('192.168.178.1', addr4.exploded)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001955
Eric V. Smithebdaaf42014-04-14 12:58:07 -04001956 def testReversePointer(self):
1957 addr1 = ipaddress.IPv4Address('127.0.0.1')
1958 addr2 = ipaddress.IPv6Address('2001:db8::1')
1959 self.assertEqual('1.0.0.127.in-addr.arpa', addr1.reverse_pointer)
1960 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.' +
1961 'b.d.0.1.0.0.2.ip6.arpa',
1962 addr2.reverse_pointer)
1963
Nick Coghlandc9b2552012-05-20 21:01:57 +10001964 def testIntRepresentation(self):
1965 self.assertEqual(16909060, int(self.ipv4_address))
1966 self.assertEqual(42540616829182469433547762482097946625,
1967 int(self.ipv6_address))
1968
Nick Coghlandc9b2552012-05-20 21:01:57 +10001969 def testForceVersion(self):
1970 self.assertEqual(ipaddress.ip_network(1).version, 4)
Nick Coghlan51c30672012-05-27 00:25:58 +10001971 self.assertEqual(ipaddress.IPv6Network(1).version, 6)
Sandro Tosi876ecad2012-05-23 22:26:55 +02001972
Nick Coghlandc9b2552012-05-20 21:01:57 +10001973 def testWithStar(self):
Nick Coghlana8517ad2012-08-20 10:04:26 +10001974 self.assertEqual(self.ipv4_interface.with_prefixlen, "1.2.3.4/24")
1975 self.assertEqual(self.ipv4_interface.with_netmask,
Nick Coghlandc9b2552012-05-20 21:01:57 +10001976 "1.2.3.4/255.255.255.0")
Nick Coghlana8517ad2012-08-20 10:04:26 +10001977 self.assertEqual(self.ipv4_interface.with_hostmask,
Nick Coghlandc9b2552012-05-20 21:01:57 +10001978 "1.2.3.4/0.0.0.255")
1979
Nick Coghlana8517ad2012-08-20 10:04:26 +10001980 self.assertEqual(self.ipv6_interface.with_prefixlen,
Nick Coghlandc9b2552012-05-20 21:01:57 +10001981 '2001:658:22a:cafe:200::1/64')
Nick Coghlana8517ad2012-08-20 10:04:26 +10001982 self.assertEqual(self.ipv6_interface.with_netmask,
1983 '2001:658:22a:cafe:200::1/ffff:ffff:ffff:ffff::')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001984 # this probably don't make much sense, but it's included for
1985 # compatibility with ipv4
Nick Coghlana8517ad2012-08-20 10:04:26 +10001986 self.assertEqual(self.ipv6_interface.with_hostmask,
Nick Coghlandc9b2552012-05-20 21:01:57 +10001987 '2001:658:22a:cafe:200::1/::ffff:ffff:ffff:ffff')
1988
1989 def testNetworkElementCaching(self):
1990 # V4 - make sure we're empty
Inada Naoki2430d532019-04-15 16:01:00 +09001991 self.assertNotIn('broadcast_address', self.ipv4_network.__dict__)
1992 self.assertNotIn('hostmask', self.ipv4_network.__dict__)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001993
1994 # V4 - populate and test
Nick Coghlandc9b2552012-05-20 21:01:57 +10001995 self.assertEqual(self.ipv4_network.broadcast_address,
1996 ipaddress.IPv4Address('1.2.3.255'))
1997 self.assertEqual(self.ipv4_network.hostmask,
1998 ipaddress.IPv4Address('0.0.0.255'))
1999
2000 # V4 - check we're cached
Inada Naoki2430d532019-04-15 16:01:00 +09002001 self.assertIn('broadcast_address', self.ipv4_network.__dict__)
2002 self.assertIn('hostmask', self.ipv4_network.__dict__)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002003
2004 # V6 - make sure we're empty
Inada Naoki2430d532019-04-15 16:01:00 +09002005 self.assertNotIn('broadcast_address', self.ipv6_network.__dict__)
2006 self.assertNotIn('hostmask', self.ipv6_network.__dict__)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002007
2008 # V6 - populate and test
2009 self.assertEqual(self.ipv6_network.network_address,
2010 ipaddress.IPv6Address('2001:658:22a:cafe::'))
2011 self.assertEqual(self.ipv6_interface.network.network_address,
2012 ipaddress.IPv6Address('2001:658:22a:cafe::'))
2013
2014 self.assertEqual(
2015 self.ipv6_network.broadcast_address,
2016 ipaddress.IPv6Address('2001:658:22a:cafe:ffff:ffff:ffff:ffff'))
2017 self.assertEqual(self.ipv6_network.hostmask,
2018 ipaddress.IPv6Address('::ffff:ffff:ffff:ffff'))
2019 self.assertEqual(
2020 self.ipv6_interface.network.broadcast_address,
2021 ipaddress.IPv6Address('2001:658:22a:cafe:ffff:ffff:ffff:ffff'))
2022 self.assertEqual(self.ipv6_interface.network.hostmask,
2023 ipaddress.IPv6Address('::ffff:ffff:ffff:ffff'))
2024
2025 # V6 - check we're cached
Inada Naoki2430d532019-04-15 16:01:00 +09002026 self.assertIn('broadcast_address', self.ipv6_network.__dict__)
2027 self.assertIn('hostmask', self.ipv6_network.__dict__)
2028 self.assertIn('broadcast_address', self.ipv6_interface.network.__dict__)
2029 self.assertIn('hostmask', self.ipv6_interface.network.__dict__)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002030
2031 def testTeredo(self):
2032 # stolen from wikipedia
2033 server = ipaddress.IPv4Address('65.54.227.120')
2034 client = ipaddress.IPv4Address('192.0.2.45')
2035 teredo_addr = '2001:0000:4136:e378:8000:63bf:3fff:fdd2'
2036 self.assertEqual((server, client),
2037 ipaddress.ip_address(teredo_addr).teredo)
2038 bad_addr = '2000::4136:e378:8000:63bf:3fff:fdd2'
2039 self.assertFalse(ipaddress.ip_address(bad_addr).teredo)
2040 bad_addr = '2001:0001:4136:e378:8000:63bf:3fff:fdd2'
2041 self.assertFalse(ipaddress.ip_address(bad_addr).teredo)
2042
2043 # i77
2044 teredo_addr = ipaddress.IPv6Address('2001:0:5ef5:79fd:0:59d:a0e5:ba1')
2045 self.assertEqual((ipaddress.IPv4Address('94.245.121.253'),
2046 ipaddress.IPv4Address('95.26.244.94')),
2047 teredo_addr.teredo)
2048
Nick Coghlandc9b2552012-05-20 21:01:57 +10002049 def testsixtofour(self):
2050 sixtofouraddr = ipaddress.ip_address('2002:ac1d:2d64::1')
2051 bad_addr = ipaddress.ip_address('2000:ac1d:2d64::1')
2052 self.assertEqual(ipaddress.IPv4Address('172.29.45.100'),
2053 sixtofouraddr.sixtofour)
2054 self.assertFalse(bad_addr.sixtofour)
2055
Nick Coghlandc9b2552012-05-20 21:01:57 +10002056
2057if __name__ == '__main__':
2058 unittest.main()