blob: 6c08f805da51bd4415d8589663ea3e5cf1a509dc [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
Nick Coghlandc9b2552012-05-20 21:01:57 +100015
R David Murray75678652014-10-12 15:17:22 -040016
Nick Coghlan07c4e332012-07-08 23:06:45 +100017class BaseTestCase(unittest.TestCase):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +100018 # One big change in ipaddress over the original ipaddr module is
19 # error reporting that tries to assume users *don't know the rules*
20 # for what constitutes an RFC compliant IP address
21
Nick Coghlan07c4e332012-07-08 23:06:45 +100022 # Ensuring these errors are emitted correctly in all relevant cases
23 # meant moving to a more systematic test structure that allows the
24 # test structure to map more directly to the module structure
25
Nick Coghlan36f8dcd2012-07-07 19:23:53 +100026 # Note that if the constructors are refactored so that addresses with
27 # multiple problems get classified differently, that's OK - just
28 # move the affected examples to the newly appropriate test case.
29
Nick Coghlan07c4e332012-07-08 23:06:45 +100030 # There is some duplication between the original relatively ad hoc
31 # test suite and the new systematic tests. While some redundancy in
32 # testing is considered preferable to accidentally deleting a valid
33 # test, the original test suite will likely be reduced over time as
34 # redundant tests are identified.
Nick Coghlan36f8dcd2012-07-07 19:23:53 +100035
Nick Coghlan297b1432012-07-08 17:11:04 +100036 @property
37 def factory(self):
38 raise NotImplementedError
39
Nick Coghlan36f8dcd2012-07-07 19:23:53 +100040 @contextlib.contextmanager
41 def assertCleanError(self, exc_type, details, *args):
42 """
43 Ensure exception does not display a context by default
44
45 Wraps unittest.TestCase.assertRaisesRegex
46 """
47 if args:
48 details = details % args
49 cm = self.assertRaisesRegex(exc_type, details)
50 with cm as exc:
51 yield exc
52 # Ensure we produce clean tracebacks on failure
53 if exc.exception.__context__ is not None:
54 self.assertTrue(exc.exception.__suppress_context__)
55
56 def assertAddressError(self, details, *args):
57 """Ensure a clean AddressValueError"""
58 return self.assertCleanError(ipaddress.AddressValueError,
R David Murray75678652014-10-12 15:17:22 -040059 details, *args)
Nick Coghlan36f8dcd2012-07-07 19:23:53 +100060
61 def assertNetmaskError(self, details, *args):
62 """Ensure a clean NetmaskValueError"""
63 return self.assertCleanError(ipaddress.NetmaskValueError,
R David Murray75678652014-10-12 15:17:22 -040064 details, *args)
Nick Coghlan36f8dcd2012-07-07 19:23:53 +100065
Nick Coghlan07c4e332012-07-08 23:06:45 +100066 def assertInstancesEqual(self, lhs, rhs):
67 """Check constructor arguments produce equivalent instances"""
68 self.assertEqual(self.factory(lhs), self.factory(rhs))
69
R David Murray75678652014-10-12 15:17:22 -040070
Nick Coghlan07c4e332012-07-08 23:06:45 +100071class CommonTestMixin:
Nick Coghlan36f8dcd2012-07-07 19:23:53 +100072
73 def test_empty_address(self):
74 with self.assertAddressError("Address cannot be empty"):
Nick Coghlan297b1432012-07-08 17:11:04 +100075 self.factory("")
76
77 def test_floats_rejected(self):
78 with self.assertAddressError(re.escape(repr("1.0"))):
79 self.factory(1.0)
80
Nick Coghlane0c3f5e2012-08-05 18:20:17 +100081 def test_not_an_index_issue15559(self):
82 # Implementing __index__ makes for a very nasty interaction with the
83 # bytes constructor. Thus, we disallow implicit use as an integer
84 self.assertRaises(TypeError, operator.index, self.factory(1))
85 self.assertRaises(TypeError, hex, self.factory(1))
86 self.assertRaises(TypeError, bytes, self.factory(1))
87
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +020088 def pickle_test(self, addr):
89 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
90 with self.subTest(proto=proto):
91 x = self.factory(addr)
92 y = pickle.loads(pickle.dumps(x, proto))
93 self.assertEqual(y, x)
94
Nick Coghlane0c3f5e2012-08-05 18:20:17 +100095
Nick Coghlan07c4e332012-07-08 23:06:45 +100096class CommonTestMixin_v4(CommonTestMixin):
97
98 def test_leading_zeros(self):
99 self.assertInstancesEqual("000.000.000.000", "0.0.0.0")
100 self.assertInstancesEqual("192.168.000.001", "192.168.0.1")
101
102 def test_int(self):
103 self.assertInstancesEqual(0, "0.0.0.0")
104 self.assertInstancesEqual(3232235521, "192.168.0.1")
105
106 def test_packed(self):
107 self.assertInstancesEqual(bytes.fromhex("00000000"), "0.0.0.0")
108 self.assertInstancesEqual(bytes.fromhex("c0a80001"), "192.168.0.1")
Nick Coghlan297b1432012-07-08 17:11:04 +1000109
110 def test_negative_ints_rejected(self):
111 msg = "-1 (< 0) is not permitted as an IPv4 address"
112 with self.assertAddressError(re.escape(msg)):
113 self.factory(-1)
114
115 def test_large_ints_rejected(self):
116 msg = "%d (>= 2**32) is not permitted as an IPv4 address"
117 with self.assertAddressError(re.escape(msg % 2**32)):
118 self.factory(2**32)
119
120 def test_bad_packed_length(self):
121 def assertBadLength(length):
Nick Coghlan07c4e332012-07-08 23:06:45 +1000122 addr = bytes(length)
Nick Coghlan297b1432012-07-08 17:11:04 +1000123 msg = "%r (len %d != 4) is not permitted as an IPv4 address"
124 with self.assertAddressError(re.escape(msg % (addr, length))):
125 self.factory(addr)
126
127 assertBadLength(3)
128 assertBadLength(5)
129
R David Murray75678652014-10-12 15:17:22 -0400130
Nick Coghlan07c4e332012-07-08 23:06:45 +1000131class CommonTestMixin_v6(CommonTestMixin):
132
133 def test_leading_zeros(self):
134 self.assertInstancesEqual("0000::0000", "::")
135 self.assertInstancesEqual("000::c0a8:0001", "::c0a8:1")
136
137 def test_int(self):
138 self.assertInstancesEqual(0, "::")
139 self.assertInstancesEqual(3232235521, "::c0a8:1")
140
141 def test_packed(self):
142 addr = bytes(12) + bytes.fromhex("00000000")
143 self.assertInstancesEqual(addr, "::")
144 addr = bytes(12) + bytes.fromhex("c0a80001")
145 self.assertInstancesEqual(addr, "::c0a8:1")
146 addr = bytes.fromhex("c0a80001") + bytes(12)
147 self.assertInstancesEqual(addr, "c0a8:1::")
Nick Coghlan297b1432012-07-08 17:11:04 +1000148
149 def test_negative_ints_rejected(self):
150 msg = "-1 (< 0) is not permitted as an IPv6 address"
151 with self.assertAddressError(re.escape(msg)):
152 self.factory(-1)
153
154 def test_large_ints_rejected(self):
155 msg = "%d (>= 2**128) is not permitted as an IPv6 address"
156 with self.assertAddressError(re.escape(msg % 2**128)):
157 self.factory(2**128)
158
159 def test_bad_packed_length(self):
160 def assertBadLength(length):
Nick Coghlan07c4e332012-07-08 23:06:45 +1000161 addr = bytes(length)
Nick Coghlan297b1432012-07-08 17:11:04 +1000162 msg = "%r (len %d != 16) is not permitted as an IPv6 address"
163 with self.assertAddressError(re.escape(msg % (addr, length))):
164 self.factory(addr)
165 self.factory(addr)
166
167 assertBadLength(15)
168 assertBadLength(17)
169
170
Nick Coghlan07c4e332012-07-08 23:06:45 +1000171class AddressTestCase_v4(BaseTestCase, CommonTestMixin_v4):
Nick Coghlan297b1432012-07-08 17:11:04 +1000172 factory = ipaddress.IPv4Address
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000173
174 def test_network_passed_as_address(self):
175 addr = "127.0.0.1/24"
176 with self.assertAddressError("Unexpected '/' in %r", addr):
177 ipaddress.IPv4Address(addr)
178
179 def test_bad_address_split(self):
180 def assertBadSplit(addr):
181 with self.assertAddressError("Expected 4 octets in %r", addr):
182 ipaddress.IPv4Address(addr)
183
184 assertBadSplit("127.0.1")
185 assertBadSplit("42.42.42.42.42")
186 assertBadSplit("42.42.42")
187 assertBadSplit("42.42")
188 assertBadSplit("42")
189 assertBadSplit("42..42.42.42")
190 assertBadSplit("42.42.42.42.")
191 assertBadSplit("42.42.42.42...")
192 assertBadSplit(".42.42.42.42")
193 assertBadSplit("...42.42.42.42")
194 assertBadSplit("016.016.016")
195 assertBadSplit("016.016")
196 assertBadSplit("016")
197 assertBadSplit("000")
198 assertBadSplit("0x0a.0x0a.0x0a")
199 assertBadSplit("0x0a.0x0a")
200 assertBadSplit("0x0a")
201 assertBadSplit(".")
202 assertBadSplit("bogus")
203 assertBadSplit("bogus.com")
204 assertBadSplit("1000")
205 assertBadSplit("1000000000000000")
206 assertBadSplit("192.168.0.1.com")
207
208 def test_empty_octet(self):
209 def assertBadOctet(addr):
210 with self.assertAddressError("Empty octet not permitted in %r",
R David Murray75678652014-10-12 15:17:22 -0400211 addr):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000212 ipaddress.IPv4Address(addr)
213
214 assertBadOctet("42..42.42")
215 assertBadOctet("...")
216
217 def test_invalid_characters(self):
218 def assertBadOctet(addr, octet):
219 msg = "Only decimal digits permitted in %r in %r" % (octet, addr)
220 with self.assertAddressError(re.escape(msg)):
221 ipaddress.IPv4Address(addr)
222
223 assertBadOctet("0x0a.0x0a.0x0a.0x0a", "0x0a")
Nick Coghlan07c4e332012-07-08 23:06:45 +1000224 assertBadOctet("0xa.0x0a.0x0a.0x0a", "0xa")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000225 assertBadOctet("42.42.42.-0", "-0")
226 assertBadOctet("42.42.42.+0", "+0")
227 assertBadOctet("42.42.42.-42", "-42")
228 assertBadOctet("+1.+2.+3.4", "+1")
229 assertBadOctet("1.2.3.4e0", "4e0")
230 assertBadOctet("1.2.3.4::", "4::")
231 assertBadOctet("1.a.2.3", "a")
232
Nick Coghlan07c4e332012-07-08 23:06:45 +1000233 def test_octal_decimal_ambiguity(self):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000234 def assertBadOctet(addr, octet):
Nick Coghlan07c4e332012-07-08 23:06:45 +1000235 msg = "Ambiguous (octal/decimal) value in %r not permitted in %r"
236 with self.assertAddressError(re.escape(msg % (octet, addr))):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000237 ipaddress.IPv4Address(addr)
238
239 assertBadOctet("016.016.016.016", "016")
240 assertBadOctet("001.000.008.016", "008")
Nick Coghlan07c4e332012-07-08 23:06:45 +1000241
242 def test_octet_length(self):
243 def assertBadOctet(addr, octet):
244 msg = "At most 3 characters permitted in %r in %r"
245 with self.assertAddressError(re.escape(msg % (octet, addr))):
246 ipaddress.IPv4Address(addr)
247
248 assertBadOctet("0000.000.000.000", "0000")
249 assertBadOctet("12345.67899.-54321.-98765", "12345")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000250
251 def test_octet_limit(self):
252 def assertBadOctet(addr, octet):
Nick Coghlanb582ecc2012-07-07 22:15:22 +1000253 msg = "Octet %d (> 255) not permitted in %r" % (octet, addr)
254 with self.assertAddressError(re.escape(msg)):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000255 ipaddress.IPv4Address(addr)
256
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000257 assertBadOctet("257.0.0.0", 257)
Nick Coghlan07c4e332012-07-08 23:06:45 +1000258 assertBadOctet("192.168.0.999", 999)
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000259
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +0200260 def test_pickle(self):
261 self.pickle_test('192.0.2.1')
262
Serhiy Storchaka88f64f32015-03-07 20:08:34 +0200263 def test_weakref(self):
264 weakref.ref(self.factory('192.0.2.1'))
265
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000266
Nick Coghlan07c4e332012-07-08 23:06:45 +1000267class AddressTestCase_v6(BaseTestCase, CommonTestMixin_v6):
Nick Coghlan297b1432012-07-08 17:11:04 +1000268 factory = ipaddress.IPv6Address
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000269
270 def test_network_passed_as_address(self):
271 addr = "::1/24"
272 with self.assertAddressError("Unexpected '/' in %r", addr):
273 ipaddress.IPv6Address(addr)
274
275 def test_bad_address_split_v6_not_enough_parts(self):
276 def assertBadSplit(addr):
277 msg = "At least 3 parts expected in %r"
278 with self.assertAddressError(msg, addr):
279 ipaddress.IPv6Address(addr)
280
281 assertBadSplit(":")
282 assertBadSplit(":1")
283 assertBadSplit("FEDC:9878")
284
285 def test_bad_address_split_v6_too_many_colons(self):
286 def assertBadSplit(addr):
287 msg = "At most 8 colons permitted in %r"
288 with self.assertAddressError(msg, addr):
289 ipaddress.IPv6Address(addr)
290
291 assertBadSplit("9:8:7:6:5:4:3::2:1")
292 assertBadSplit("10:9:8:7:6:5:4:3:2:1")
293 assertBadSplit("::8:7:6:5:4:3:2:1")
294 assertBadSplit("8:7:6:5:4:3:2:1::")
295 # A trailing IPv4 address is two parts
296 assertBadSplit("10:9:8:7:6:5:4:3:42.42.42.42")
297
298 def test_bad_address_split_v6_too_many_parts(self):
299 def assertBadSplit(addr):
300 msg = "Exactly 8 parts expected without '::' in %r"
301 with self.assertAddressError(msg, addr):
302 ipaddress.IPv6Address(addr)
303
304 assertBadSplit("3ffe:0:0:0:0:0:0:0:1")
305 assertBadSplit("9:8:7:6:5:4:3:2:1")
306 assertBadSplit("7:6:5:4:3:2:1")
307 # A trailing IPv4 address is two parts
308 assertBadSplit("9:8:7:6:5:4:3:42.42.42.42")
309 assertBadSplit("7:6:5:4:3:42.42.42.42")
310
311 def test_bad_address_split_v6_too_many_parts_with_double_colon(self):
312 def assertBadSplit(addr):
313 msg = "Expected at most 7 other parts with '::' in %r"
314 with self.assertAddressError(msg, addr):
315 ipaddress.IPv6Address(addr)
316
317 assertBadSplit("1:2:3:4::5:6:7:8")
318
319 def test_bad_address_split_v6_repeated_double_colon(self):
320 def assertBadSplit(addr):
321 msg = "At most one '::' permitted in %r"
322 with self.assertAddressError(msg, addr):
323 ipaddress.IPv6Address(addr)
324
325 assertBadSplit("3ffe::1::1")
326 assertBadSplit("1::2::3::4:5")
327 assertBadSplit("2001::db:::1")
328 assertBadSplit("3ffe::1::")
329 assertBadSplit("::3ffe::1")
330 assertBadSplit(":3ffe::1::1")
331 assertBadSplit("3ffe::1::1:")
332 assertBadSplit(":3ffe::1::1:")
333 assertBadSplit(":::")
334 assertBadSplit('2001:db8:::1')
335
336 def test_bad_address_split_v6_leading_colon(self):
337 def assertBadSplit(addr):
338 msg = "Leading ':' only permitted as part of '::' in %r"
339 with self.assertAddressError(msg, addr):
340 ipaddress.IPv6Address(addr)
341
342 assertBadSplit(":2001:db8::1")
343 assertBadSplit(":1:2:3:4:5:6:7")
344 assertBadSplit(":1:2:3:4:5:6:")
345 assertBadSplit(":6:5:4:3:2:1::")
346
347 def test_bad_address_split_v6_trailing_colon(self):
348 def assertBadSplit(addr):
349 msg = "Trailing ':' only permitted as part of '::' in %r"
350 with self.assertAddressError(msg, addr):
351 ipaddress.IPv6Address(addr)
352
353 assertBadSplit("2001:db8::1:")
354 assertBadSplit("1:2:3:4:5:6:7:")
355 assertBadSplit("::1.2.3.4:")
356 assertBadSplit("::7:6:5:4:3:2:")
357
358 def test_bad_v4_part_in(self):
359 def assertBadAddressPart(addr, v4_error):
360 with self.assertAddressError("%s in %r", v4_error, addr):
361 ipaddress.IPv6Address(addr)
362
363 assertBadAddressPart("3ffe::1.net", "Expected 4 octets in '1.net'")
364 assertBadAddressPart("3ffe::127.0.1",
365 "Expected 4 octets in '127.0.1'")
366 assertBadAddressPart("::1.2.3",
367 "Expected 4 octets in '1.2.3'")
368 assertBadAddressPart("::1.2.3.4.5",
369 "Expected 4 octets in '1.2.3.4.5'")
370 assertBadAddressPart("3ffe::1.1.1.net",
371 "Only decimal digits permitted in 'net' "
372 "in '1.1.1.net'")
373
374 def test_invalid_characters(self):
375 def assertBadPart(addr, part):
376 msg = "Only hex digits permitted in %r in %r" % (part, addr)
377 with self.assertAddressError(re.escape(msg)):
378 ipaddress.IPv6Address(addr)
379
380 assertBadPart("3ffe::goog", "goog")
381 assertBadPart("3ffe::-0", "-0")
382 assertBadPart("3ffe::+0", "+0")
383 assertBadPart("3ffe::-1", "-1")
384 assertBadPart("1.2.3.4::", "1.2.3.4")
385 assertBadPart('1234:axy::b', "axy")
386
387 def test_part_length(self):
388 def assertBadPart(addr, part):
389 msg = "At most 4 characters permitted in %r in %r"
390 with self.assertAddressError(msg, part, addr):
391 ipaddress.IPv6Address(addr)
392
Nick Coghlan07c4e332012-07-08 23:06:45 +1000393 assertBadPart("::00000", "00000")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000394 assertBadPart("3ffe::10000", "10000")
395 assertBadPart("02001:db8::", "02001")
396 assertBadPart('2001:888888::1', "888888")
397
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +0200398 def test_pickle(self):
399 self.pickle_test('2001:db8::')
400
Serhiy Storchaka88f64f32015-03-07 20:08:34 +0200401 def test_weakref(self):
402 weakref.ref(self.factory('2001:db8::'))
403
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000404
Nick Coghlan07c4e332012-07-08 23:06:45 +1000405class NetmaskTestMixin_v4(CommonTestMixin_v4):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000406 """Input validation on interfaces and networks is very similar"""
407
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000408 def test_split_netmask(self):
409 addr = "1.2.3.4/32/24"
410 with self.assertAddressError("Only one '/' permitted in %r" % addr):
411 self.factory(addr)
412
413 def test_address_errors(self):
414 def assertBadAddress(addr, details):
415 with self.assertAddressError(details):
416 self.factory(addr)
417
Nick Coghlan297b1432012-07-08 17:11:04 +1000418 assertBadAddress("/", "Address cannot be empty")
419 assertBadAddress("/8", "Address cannot be empty")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000420 assertBadAddress("bogus", "Expected 4 octets")
421 assertBadAddress("google.com", "Expected 4 octets")
422 assertBadAddress("10/8", "Expected 4 octets")
423 assertBadAddress("::1.2.3.4", "Only decimal digits")
Nick Coghlanb582ecc2012-07-07 22:15:22 +1000424 assertBadAddress("1.2.3.256", re.escape("256 (> 255)"))
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000425
Nick Coghlan932346f2014-02-08 23:17:36 +1000426 def test_valid_netmask(self):
427 self.assertEqual(str(self.factory('192.0.2.0/255.255.255.0')),
428 '192.0.2.0/24')
429 for i in range(0, 33):
430 # Generate and re-parse the CIDR format (trivial).
431 net_str = '0.0.0.0/%d' % i
432 net = self.factory(net_str)
433 self.assertEqual(str(net), net_str)
434 # Generate and re-parse the expanded netmask.
435 self.assertEqual(
436 str(self.factory('0.0.0.0/%s' % net.netmask)), net_str)
437 # Zero prefix is treated as decimal.
438 self.assertEqual(str(self.factory('0.0.0.0/0%d' % i)), net_str)
439 # Generate and re-parse the expanded hostmask. The ambiguous
440 # cases (/0 and /32) are treated as netmasks.
441 if i in (32, 0):
442 net_str = '0.0.0.0/%d' % (32 - i)
443 self.assertEqual(
444 str(self.factory('0.0.0.0/%s' % net.hostmask)), net_str)
445
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000446 def test_netmask_errors(self):
447 def assertBadNetmask(addr, netmask):
Nick Coghlan932346f2014-02-08 23:17:36 +1000448 msg = "%r is not a valid netmask" % netmask
449 with self.assertNetmaskError(re.escape(msg)):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000450 self.factory("%s/%s" % (addr, netmask))
451
452 assertBadNetmask("1.2.3.4", "")
Nick Coghlan932346f2014-02-08 23:17:36 +1000453 assertBadNetmask("1.2.3.4", "-1")
454 assertBadNetmask("1.2.3.4", "+1")
455 assertBadNetmask("1.2.3.4", " 1 ")
456 assertBadNetmask("1.2.3.4", "0x1")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000457 assertBadNetmask("1.2.3.4", "33")
458 assertBadNetmask("1.2.3.4", "254.254.255.256")
Nick Coghlan932346f2014-02-08 23:17:36 +1000459 assertBadNetmask("1.2.3.4", "1.a.2.3")
Nick Coghlan07c4e332012-07-08 23:06:45 +1000460 assertBadNetmask("1.1.1.1", "254.xyz.2.3")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000461 assertBadNetmask("1.1.1.1", "240.255.0.0")
Nick Coghlan932346f2014-02-08 23:17:36 +1000462 assertBadNetmask("1.1.1.1", "255.254.128.0")
463 assertBadNetmask("1.1.1.1", "0.1.127.255")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000464 assertBadNetmask("1.1.1.1", "pudding")
Nick Coghlan932346f2014-02-08 23:17:36 +1000465 assertBadNetmask("1.1.1.1", "::")
466
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +0200467 def test_pickle(self):
468 self.pickle_test('192.0.2.0/27')
469 self.pickle_test('192.0.2.0/31') # IPV4LENGTH - 1
470 self.pickle_test('192.0.2.0') # IPV4LENGTH
471
R David Murray75678652014-10-12 15:17:22 -0400472
Serhiy Storchakaa556af72015-01-18 22:56:47 +0200473class InterfaceTestCase_v4(BaseTestCase, NetmaskTestMixin_v4):
474 factory = ipaddress.IPv4Interface
475
476
Nick Coghlan07c4e332012-07-08 23:06:45 +1000477class NetworkTestCase_v4(BaseTestCase, NetmaskTestMixin_v4):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000478 factory = ipaddress.IPv4Network
479
480
Nick Coghlan07c4e332012-07-08 23:06:45 +1000481class NetmaskTestMixin_v6(CommonTestMixin_v6):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000482 """Input validation on interfaces and networks is very similar"""
483
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000484 def test_split_netmask(self):
485 addr = "cafe:cafe::/128/190"
486 with self.assertAddressError("Only one '/' permitted in %r" % addr):
487 self.factory(addr)
488
489 def test_address_errors(self):
490 def assertBadAddress(addr, details):
491 with self.assertAddressError(details):
492 self.factory(addr)
493
Nick Coghlan297b1432012-07-08 17:11:04 +1000494 assertBadAddress("/", "Address cannot be empty")
495 assertBadAddress("/8", "Address cannot be empty")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000496 assertBadAddress("google.com", "At least 3 parts")
497 assertBadAddress("1.2.3.4", "At least 3 parts")
498 assertBadAddress("10/8", "At least 3 parts")
499 assertBadAddress("1234:axy::b", "Only hex digits")
500
Nick Coghlan932346f2014-02-08 23:17:36 +1000501 def test_valid_netmask(self):
502 # We only support CIDR for IPv6, because expanded netmasks are not
503 # standard notation.
504 self.assertEqual(str(self.factory('2001:db8::/32')), '2001:db8::/32')
505 for i in range(0, 129):
506 # Generate and re-parse the CIDR format (trivial).
507 net_str = '::/%d' % i
508 self.assertEqual(str(self.factory(net_str)), net_str)
509 # Zero prefix is treated as decimal.
510 self.assertEqual(str(self.factory('::/0%d' % i)), net_str)
511
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000512 def test_netmask_errors(self):
513 def assertBadNetmask(addr, netmask):
Nick Coghlan932346f2014-02-08 23:17:36 +1000514 msg = "%r is not a valid netmask" % netmask
515 with self.assertNetmaskError(re.escape(msg)):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000516 self.factory("%s/%s" % (addr, netmask))
517
518 assertBadNetmask("::1", "")
519 assertBadNetmask("::1", "::1")
520 assertBadNetmask("::1", "1::")
Nick Coghlan932346f2014-02-08 23:17:36 +1000521 assertBadNetmask("::1", "-1")
522 assertBadNetmask("::1", "+1")
523 assertBadNetmask("::1", " 1 ")
524 assertBadNetmask("::1", "0x1")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000525 assertBadNetmask("::1", "129")
Nick Coghlan932346f2014-02-08 23:17:36 +1000526 assertBadNetmask("::1", "1.2.3.4")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000527 assertBadNetmask("::1", "pudding")
Nick Coghlan932346f2014-02-08 23:17:36 +1000528 assertBadNetmask("::", "::")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000529
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +0200530 def test_pickle(self):
531 self.pickle_test('2001:db8::1000/124')
532 self.pickle_test('2001:db8::1000/127') # IPV6LENGTH - 1
533 self.pickle_test('2001:db8::1000') # IPV6LENGTH
534
R David Murray75678652014-10-12 15:17:22 -0400535
Nick Coghlan07c4e332012-07-08 23:06:45 +1000536class InterfaceTestCase_v6(BaseTestCase, NetmaskTestMixin_v6):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000537 factory = ipaddress.IPv6Interface
538
R David Murray75678652014-10-12 15:17:22 -0400539
Nick Coghlan07c4e332012-07-08 23:06:45 +1000540class NetworkTestCase_v6(BaseTestCase, NetmaskTestMixin_v6):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000541 factory = ipaddress.IPv6Network
542
543
Nick Coghlan07c4e332012-07-08 23:06:45 +1000544class FactoryFunctionErrors(BaseTestCase):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000545
546 def assertFactoryError(self, factory, kind):
547 """Ensure a clean ValueError with the expected message"""
548 addr = "camelot"
549 msg = '%r does not appear to be an IPv4 or IPv6 %s'
550 with self.assertCleanError(ValueError, msg, addr, kind):
551 factory(addr)
552
553 def test_ip_address(self):
554 self.assertFactoryError(ipaddress.ip_address, "address")
555
556 def test_ip_interface(self):
557 self.assertFactoryError(ipaddress.ip_interface, "interface")
558
559 def test_ip_network(self):
560 self.assertFactoryError(ipaddress.ip_network, "network")
561
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200562
Serhiy Storchakaf186e122015-01-26 10:11:16 +0200563@functools.total_ordering
564class LargestObject:
565 def __eq__(self, other):
566 return isinstance(other, LargestObject)
567 def __lt__(self, other):
568 return False
569
570@functools.total_ordering
571class SmallestObject:
572 def __eq__(self, other):
573 return isinstance(other, SmallestObject)
574 def __gt__(self, other):
575 return False
576
Nick Coghlan3008ec02012-07-08 00:45:33 +1000577class ComparisonTests(unittest.TestCase):
578
579 v4addr = ipaddress.IPv4Address(1)
580 v4net = ipaddress.IPv4Network(1)
581 v4intf = ipaddress.IPv4Interface(1)
582 v6addr = ipaddress.IPv6Address(1)
583 v6net = ipaddress.IPv6Network(1)
584 v6intf = ipaddress.IPv6Interface(1)
585
586 v4_addresses = [v4addr, v4intf]
587 v4_objects = v4_addresses + [v4net]
588 v6_addresses = [v6addr, v6intf]
589 v6_objects = v6_addresses + [v6net]
R David Murray947ff382016-06-02 15:46:04 -0400590
Nick Coghlan3008ec02012-07-08 00:45:33 +1000591 objects = v4_objects + v6_objects
592
R David Murray947ff382016-06-02 15:46:04 -0400593 v4addr2 = ipaddress.IPv4Address(2)
594 v4net2 = ipaddress.IPv4Network(2)
595 v4intf2 = ipaddress.IPv4Interface(2)
596 v6addr2 = ipaddress.IPv6Address(2)
597 v6net2 = ipaddress.IPv6Network(2)
598 v6intf2 = ipaddress.IPv6Interface(2)
599
Nick Coghlan3008ec02012-07-08 00:45:33 +1000600 def test_foreign_type_equality(self):
601 # __eq__ should never raise TypeError directly
602 other = object()
603 for obj in self.objects:
604 self.assertNotEqual(obj, other)
605 self.assertFalse(obj == other)
606 self.assertEqual(obj.__eq__(other), NotImplemented)
607 self.assertEqual(obj.__ne__(other), NotImplemented)
608
609 def test_mixed_type_equality(self):
610 # Ensure none of the internal objects accidentally
611 # expose the right set of attributes to become "equal"
612 for lhs in self.objects:
613 for rhs in self.objects:
614 if lhs is rhs:
615 continue
616 self.assertNotEqual(lhs, rhs)
617
R David Murray947ff382016-06-02 15:46:04 -0400618 def test_same_type_equality(self):
619 for obj in self.objects:
620 self.assertEqual(obj, obj)
621 self.assertLessEqual(obj, obj)
622 self.assertGreaterEqual(obj, obj)
623
624 def test_same_type_ordering(self):
625 for lhs, rhs in (
626 (self.v4addr, self.v4addr2),
627 (self.v4net, self.v4net2),
628 (self.v4intf, self.v4intf2),
629 (self.v6addr, self.v6addr2),
630 (self.v6net, self.v6net2),
631 (self.v6intf, self.v6intf2),
632 ):
633 self.assertNotEqual(lhs, rhs)
634 self.assertLess(lhs, rhs)
635 self.assertLessEqual(lhs, rhs)
636 self.assertGreater(rhs, lhs)
637 self.assertGreaterEqual(rhs, lhs)
638 self.assertFalse(lhs > rhs)
639 self.assertFalse(rhs < lhs)
640 self.assertFalse(lhs >= rhs)
641 self.assertFalse(rhs <= lhs)
642
Nick Coghlan3008ec02012-07-08 00:45:33 +1000643 def test_containment(self):
644 for obj in self.v4_addresses:
645 self.assertIn(obj, self.v4net)
646 for obj in self.v6_addresses:
647 self.assertIn(obj, self.v6net)
648 for obj in self.v4_objects + [self.v6net]:
649 self.assertNotIn(obj, self.v6net)
650 for obj in self.v6_objects + [self.v4net]:
651 self.assertNotIn(obj, self.v4net)
652
653 def test_mixed_type_ordering(self):
654 for lhs in self.objects:
655 for rhs in self.objects:
656 if isinstance(lhs, type(rhs)) or isinstance(rhs, type(lhs)):
657 continue
658 self.assertRaises(TypeError, lambda: lhs < rhs)
659 self.assertRaises(TypeError, lambda: lhs > rhs)
660 self.assertRaises(TypeError, lambda: lhs <= rhs)
661 self.assertRaises(TypeError, lambda: lhs >= rhs)
662
Serhiy Storchakaf186e122015-01-26 10:11:16 +0200663 def test_foreign_type_ordering(self):
664 other = object()
665 smallest = SmallestObject()
666 largest = LargestObject()
667 for obj in self.objects:
668 with self.assertRaises(TypeError):
669 obj < other
670 with self.assertRaises(TypeError):
671 obj > other
672 with self.assertRaises(TypeError):
673 obj <= other
674 with self.assertRaises(TypeError):
675 obj >= other
676 self.assertTrue(obj < largest)
677 self.assertFalse(obj > largest)
678 self.assertTrue(obj <= largest)
679 self.assertFalse(obj >= largest)
680 self.assertFalse(obj < smallest)
681 self.assertTrue(obj > smallest)
682 self.assertFalse(obj <= smallest)
683 self.assertTrue(obj >= smallest)
684
Nick Coghlan3008ec02012-07-08 00:45:33 +1000685 def test_mixed_type_key(self):
686 # with get_mixed_type_key, you can sort addresses and network.
687 v4_ordered = [self.v4addr, self.v4net, self.v4intf]
688 v6_ordered = [self.v6addr, self.v6net, self.v6intf]
689 self.assertEqual(v4_ordered,
690 sorted(self.v4_objects,
691 key=ipaddress.get_mixed_type_key))
692 self.assertEqual(v6_ordered,
693 sorted(self.v6_objects,
694 key=ipaddress.get_mixed_type_key))
695 self.assertEqual(v4_ordered + v6_ordered,
696 sorted(self.objects,
697 key=ipaddress.get_mixed_type_key))
698 self.assertEqual(NotImplemented, ipaddress.get_mixed_type_key(object))
699
700 def test_incompatible_versions(self):
701 # These should always raise TypeError
702 v4addr = ipaddress.ip_address('1.1.1.1')
703 v4net = ipaddress.ip_network('1.1.1.1')
704 v6addr = ipaddress.ip_address('::1')
Serhiy Storchakaf186e122015-01-26 10:11:16 +0200705 v6net = ipaddress.ip_network('::1')
Nick Coghlan3008ec02012-07-08 00:45:33 +1000706
707 self.assertRaises(TypeError, v4addr.__lt__, v6addr)
708 self.assertRaises(TypeError, v4addr.__gt__, v6addr)
709 self.assertRaises(TypeError, v4net.__lt__, v6net)
710 self.assertRaises(TypeError, v4net.__gt__, v6net)
711
712 self.assertRaises(TypeError, v6addr.__lt__, v4addr)
713 self.assertRaises(TypeError, v6addr.__gt__, v4addr)
714 self.assertRaises(TypeError, v6net.__lt__, v4net)
715 self.assertRaises(TypeError, v6net.__gt__, v4net)
716
717
Nick Coghlandc9b2552012-05-20 21:01:57 +1000718class IpaddrUnitTest(unittest.TestCase):
719
720 def setUp(self):
721 self.ipv4_address = ipaddress.IPv4Address('1.2.3.4')
722 self.ipv4_interface = ipaddress.IPv4Interface('1.2.3.4/24')
723 self.ipv4_network = ipaddress.IPv4Network('1.2.3.0/24')
724 #self.ipv4_hostmask = ipaddress.IPv4Interface('10.0.0.1/0.255.255.255')
725 self.ipv6_address = ipaddress.IPv6Interface(
726 '2001:658:22a:cafe:200:0:0:1')
727 self.ipv6_interface = ipaddress.IPv6Interface(
728 '2001:658:22a:cafe:200:0:0:1/64')
729 self.ipv6_network = ipaddress.IPv6Network('2001:658:22a:cafe::/64')
730
731 def testRepr(self):
732 self.assertEqual("IPv4Interface('1.2.3.4/32')",
733 repr(ipaddress.IPv4Interface('1.2.3.4')))
734 self.assertEqual("IPv6Interface('::1/128')",
735 repr(ipaddress.IPv6Interface('::1')))
736
Antoine Pitrou5fb195f2014-05-12 20:36:46 +0200737 # issue #16531: constructing IPv4Network from a (address, mask) tuple
738 def testIPv4Tuple(self):
739 # /32
740 ip = ipaddress.IPv4Address('192.0.2.1')
741 net = ipaddress.IPv4Network('192.0.2.1/32')
742 self.assertEqual(ipaddress.IPv4Network(('192.0.2.1', 32)), net)
743 self.assertEqual(ipaddress.IPv4Network((ip, 32)), net)
744 self.assertEqual(ipaddress.IPv4Network((3221225985, 32)), net)
745 self.assertEqual(ipaddress.IPv4Network(('192.0.2.1',
746 '255.255.255.255')), net)
747 self.assertEqual(ipaddress.IPv4Network((ip,
748 '255.255.255.255')), net)
749 self.assertEqual(ipaddress.IPv4Network((3221225985,
750 '255.255.255.255')), net)
751 # strict=True and host bits set
752 with self.assertRaises(ValueError):
753 ipaddress.IPv4Network(('192.0.2.1', 24))
754 with self.assertRaises(ValueError):
755 ipaddress.IPv4Network((ip, 24))
756 with self.assertRaises(ValueError):
757 ipaddress.IPv4Network((3221225985, 24))
758 with self.assertRaises(ValueError):
759 ipaddress.IPv4Network(('192.0.2.1', '255.255.255.0'))
760 with self.assertRaises(ValueError):
761 ipaddress.IPv4Network((ip, '255.255.255.0'))
762 with self.assertRaises(ValueError):
763 ipaddress.IPv4Network((3221225985, '255.255.255.0'))
764 # strict=False and host bits set
765 net = ipaddress.IPv4Network('192.0.2.0/24')
766 self.assertEqual(ipaddress.IPv4Network(('192.0.2.1', 24),
767 strict=False), net)
768 self.assertEqual(ipaddress.IPv4Network((ip, 24),
769 strict=False), net)
770 self.assertEqual(ipaddress.IPv4Network((3221225985, 24),
771 strict=False), net)
772 self.assertEqual(ipaddress.IPv4Network(('192.0.2.1',
773 '255.255.255.0'),
774 strict=False), net)
775 self.assertEqual(ipaddress.IPv4Network((ip,
776 '255.255.255.0'),
777 strict=False), net)
778 self.assertEqual(ipaddress.IPv4Network((3221225985,
779 '255.255.255.0'),
780 strict=False), net)
781
782 # /24
783 ip = ipaddress.IPv4Address('192.0.2.0')
784 net = ipaddress.IPv4Network('192.0.2.0/24')
785 self.assertEqual(ipaddress.IPv4Network(('192.0.2.0',
786 '255.255.255.0')), net)
787 self.assertEqual(ipaddress.IPv4Network((ip,
788 '255.255.255.0')), net)
789 self.assertEqual(ipaddress.IPv4Network((3221225984,
790 '255.255.255.0')), net)
791 self.assertEqual(ipaddress.IPv4Network(('192.0.2.0', 24)), net)
792 self.assertEqual(ipaddress.IPv4Network((ip, 24)), net)
793 self.assertEqual(ipaddress.IPv4Network((3221225984, 24)), net)
794
795 self.assertEqual(ipaddress.IPv4Interface(('192.0.2.1', 24)),
796 ipaddress.IPv4Interface('192.0.2.1/24'))
797 self.assertEqual(ipaddress.IPv4Interface((3221225985, 24)),
798 ipaddress.IPv4Interface('192.0.2.1/24'))
799
800 # issue #16531: constructing IPv6Network from a (address, mask) tuple
801 def testIPv6Tuple(self):
802 # /128
803 ip = ipaddress.IPv6Address('2001:db8::')
804 net = ipaddress.IPv6Network('2001:db8::/128')
805 self.assertEqual(ipaddress.IPv6Network(('2001:db8::', '128')),
806 net)
807 self.assertEqual(ipaddress.IPv6Network(
808 (42540766411282592856903984951653826560, 128)),
809 net)
810 self.assertEqual(ipaddress.IPv6Network((ip, '128')),
811 net)
812 ip = ipaddress.IPv6Address('2001:db8::')
813 net = ipaddress.IPv6Network('2001:db8::/96')
814 self.assertEqual(ipaddress.IPv6Network(('2001:db8::', '96')),
815 net)
816 self.assertEqual(ipaddress.IPv6Network(
817 (42540766411282592856903984951653826560, 96)),
818 net)
819 self.assertEqual(ipaddress.IPv6Network((ip, '96')),
820 net)
821
822 # strict=True and host bits set
823 ip = ipaddress.IPv6Address('2001:db8::1')
824 with self.assertRaises(ValueError):
825 ipaddress.IPv6Network(('2001:db8::1', 96))
826 with self.assertRaises(ValueError):
827 ipaddress.IPv6Network((
828 42540766411282592856903984951653826561, 96))
829 with self.assertRaises(ValueError):
830 ipaddress.IPv6Network((ip, 96))
831 # strict=False and host bits set
832 net = ipaddress.IPv6Network('2001:db8::/96')
833 self.assertEqual(ipaddress.IPv6Network(('2001:db8::1', 96),
834 strict=False),
835 net)
836 self.assertEqual(ipaddress.IPv6Network(
837 (42540766411282592856903984951653826561, 96),
838 strict=False),
839 net)
840 self.assertEqual(ipaddress.IPv6Network((ip, 96), strict=False),
841 net)
842
843 # /96
844 self.assertEqual(ipaddress.IPv6Interface(('2001:db8::1', '96')),
845 ipaddress.IPv6Interface('2001:db8::1/96'))
846 self.assertEqual(ipaddress.IPv6Interface(
847 (42540766411282592856903984951653826561, '96')),
848 ipaddress.IPv6Interface('2001:db8::1/96'))
849
Nick Coghlandc9b2552012-05-20 21:01:57 +1000850 # issue57
851 def testAddressIntMath(self):
852 self.assertEqual(ipaddress.IPv4Address('1.1.1.1') + 255,
853 ipaddress.IPv4Address('1.1.2.0'))
854 self.assertEqual(ipaddress.IPv4Address('1.1.1.1') - 256,
855 ipaddress.IPv4Address('1.1.0.1'))
856 self.assertEqual(ipaddress.IPv6Address('::1') + (2**16 - 2),
857 ipaddress.IPv6Address('::ffff'))
858 self.assertEqual(ipaddress.IPv6Address('::ffff') - (2**16 - 2),
859 ipaddress.IPv6Address('::1'))
860
Nick Coghlan3c2570c2012-07-07 01:13:55 +1000861 def testInvalidIntToBytes(self):
862 self.assertRaises(ValueError, ipaddress.v4_int_to_packed, -1)
863 self.assertRaises(ValueError, ipaddress.v4_int_to_packed,
864 2 ** ipaddress.IPV4LENGTH)
865 self.assertRaises(ValueError, ipaddress.v6_int_to_packed, -1)
866 self.assertRaises(ValueError, ipaddress.v6_int_to_packed,
867 2 ** ipaddress.IPV6LENGTH)
868
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200869 def testInternals(self):
Serhiy Storchakab53f0fb2015-01-19 00:41:32 +0200870 ip1 = ipaddress.IPv4Address('10.10.10.10')
871 ip2 = ipaddress.IPv4Address('10.10.10.11')
872 ip3 = ipaddress.IPv4Address('10.10.10.12')
873 self.assertEqual(list(ipaddress._find_address_range([ip1])),
874 [(ip1, ip1)])
875 self.assertEqual(list(ipaddress._find_address_range([ip1, ip3])),
876 [(ip1, ip1), (ip3, ip3)])
877 self.assertEqual(list(ipaddress._find_address_range([ip1, ip2, ip3])),
878 [(ip1, ip3)])
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200879 self.assertEqual(128, ipaddress._count_righthand_zero_bits(0, 128))
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200880 self.assertEqual("IPv4Network('1.2.3.0/24')", repr(self.ipv4_network))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000881
Nick Coghland9722652012-06-17 16:33:00 +1000882 def testMissingNetworkVersion(self):
883 class Broken(ipaddress._BaseNetwork):
884 pass
885 broken = Broken('127.0.0.1')
886 with self.assertRaisesRegex(NotImplementedError, "Broken.*version"):
887 broken.version
888
889 def testMissingAddressClass(self):
890 class Broken(ipaddress._BaseNetwork):
891 pass
892 broken = Broken('127.0.0.1')
893 with self.assertRaisesRegex(NotImplementedError, "Broken.*address"):
894 broken._address_class
895
Nick Coghlandc9b2552012-05-20 21:01:57 +1000896 def testGetNetwork(self):
897 self.assertEqual(int(self.ipv4_network.network_address), 16909056)
898 self.assertEqual(str(self.ipv4_network.network_address), '1.2.3.0')
899
900 self.assertEqual(int(self.ipv6_network.network_address),
901 42540616829182469433403647294022090752)
902 self.assertEqual(str(self.ipv6_network.network_address),
903 '2001:658:22a:cafe::')
904 self.assertEqual(str(self.ipv6_network.hostmask),
905 '::ffff:ffff:ffff:ffff')
906
Nick Coghlandc9b2552012-05-20 21:01:57 +1000907 def testIpFromInt(self):
908 self.assertEqual(self.ipv4_interface._ip,
909 ipaddress.IPv4Interface(16909060)._ip)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000910
911 ipv4 = ipaddress.ip_network('1.2.3.4')
912 ipv6 = ipaddress.ip_network('2001:658:22a:cafe:200:0:0:1')
Nick Coghlan730f67f2012-08-05 22:02:18 +1000913 self.assertEqual(ipv4, ipaddress.ip_network(int(ipv4.network_address)))
914 self.assertEqual(ipv6, ipaddress.ip_network(int(ipv6.network_address)))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000915
916 v6_int = 42540616829182469433547762482097946625
917 self.assertEqual(self.ipv6_interface._ip,
918 ipaddress.IPv6Interface(v6_int)._ip)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000919
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200920 self.assertEqual(ipaddress.ip_network(self.ipv4_address._ip).version,
921 4)
922 self.assertEqual(ipaddress.ip_network(self.ipv6_address._ip).version,
923 6)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000924
925 def testIpFromPacked(self):
Nick Coghlan5cf896f2012-07-07 01:43:31 +1000926 address = ipaddress.ip_address
Nick Coghlandc9b2552012-05-20 21:01:57 +1000927 self.assertEqual(self.ipv4_interface._ip,
Nick Coghlan5cf896f2012-07-07 01:43:31 +1000928 ipaddress.ip_interface(b'\x01\x02\x03\x04')._ip)
929 self.assertEqual(address('255.254.253.252'),
930 address(b'\xff\xfe\xfd\xfc'))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000931 self.assertEqual(self.ipv6_interface.ip,
932 ipaddress.ip_interface(
Nick Coghlan5cf896f2012-07-07 01:43:31 +1000933 b'\x20\x01\x06\x58\x02\x2a\xca\xfe'
934 b'\x02\x00\x00\x00\x00\x00\x00\x01').ip)
935 self.assertEqual(address('ffff:2:3:4:ffff::'),
936 address(b'\xff\xff\x00\x02\x00\x03\x00\x04' +
937 b'\xff\xff' + b'\x00' * 6))
938 self.assertEqual(address('::'),
939 address(b'\x00' * 16))
940
Nick Coghlandc9b2552012-05-20 21:01:57 +1000941 def testGetIp(self):
942 self.assertEqual(int(self.ipv4_interface.ip), 16909060)
943 self.assertEqual(str(self.ipv4_interface.ip), '1.2.3.4')
944
945 self.assertEqual(int(self.ipv6_interface.ip),
946 42540616829182469433547762482097946625)
947 self.assertEqual(str(self.ipv6_interface.ip),
948 '2001:658:22a:cafe:200::1')
949
950 def testGetNetmask(self):
951 self.assertEqual(int(self.ipv4_network.netmask), 4294967040)
952 self.assertEqual(str(self.ipv4_network.netmask), '255.255.255.0')
953 self.assertEqual(int(self.ipv6_network.netmask),
954 340282366920938463444927863358058659840)
955 self.assertEqual(self.ipv6_network.prefixlen, 64)
956
957 def testZeroNetmask(self):
958 ipv4_zero_netmask = ipaddress.IPv4Interface('1.2.3.4/0')
959 self.assertEqual(int(ipv4_zero_netmask.network.netmask), 0)
Nick Coghlan932346f2014-02-08 23:17:36 +1000960 self.assertEqual(ipv4_zero_netmask._prefix_from_prefix_string('0'), 0)
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200961 self.assertTrue(ipv4_zero_netmask._is_valid_netmask('0'))
962 self.assertTrue(ipv4_zero_netmask._is_valid_netmask('0.0.0.0'))
963 self.assertFalse(ipv4_zero_netmask._is_valid_netmask('invalid'))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000964
965 ipv6_zero_netmask = ipaddress.IPv6Interface('::1/0')
966 self.assertEqual(int(ipv6_zero_netmask.network.netmask), 0)
Nick Coghlan932346f2014-02-08 23:17:36 +1000967 self.assertEqual(ipv6_zero_netmask._prefix_from_prefix_string('0'), 0)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000968
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200969 def testIPv4NetAndHostmasks(self):
970 net = self.ipv4_network
971 self.assertFalse(net._is_valid_netmask('invalid'))
972 self.assertTrue(net._is_valid_netmask('128.128.128.128'))
973 self.assertFalse(net._is_valid_netmask('128.128.128.127'))
974 self.assertFalse(net._is_valid_netmask('128.128.128.255'))
975 self.assertTrue(net._is_valid_netmask('255.128.128.128'))
976
977 self.assertFalse(net._is_hostmask('invalid'))
978 self.assertTrue(net._is_hostmask('128.255.255.255'))
979 self.assertFalse(net._is_hostmask('255.255.255.255'))
980 self.assertFalse(net._is_hostmask('1.2.3.4'))
981
982 net = ipaddress.IPv4Network('127.0.0.0/0.0.0.255')
Nick Coghlan932346f2014-02-08 23:17:36 +1000983 self.assertEqual(net.prefixlen, 24)
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200984
Nick Coghlandc9b2552012-05-20 21:01:57 +1000985 def testGetBroadcast(self):
986 self.assertEqual(int(self.ipv4_network.broadcast_address), 16909311)
987 self.assertEqual(str(self.ipv4_network.broadcast_address), '1.2.3.255')
988
989 self.assertEqual(int(self.ipv6_network.broadcast_address),
990 42540616829182469451850391367731642367)
991 self.assertEqual(str(self.ipv6_network.broadcast_address),
992 '2001:658:22a:cafe:ffff:ffff:ffff:ffff')
993
994 def testGetPrefixlen(self):
Nick Coghlane3ded952012-08-05 22:45:22 +1000995 self.assertEqual(self.ipv4_interface.network.prefixlen, 24)
996 self.assertEqual(self.ipv6_interface.network.prefixlen, 64)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000997
998 def testGetSupernet(self):
999 self.assertEqual(self.ipv4_network.supernet().prefixlen, 23)
1000 self.assertEqual(str(self.ipv4_network.supernet().network_address),
1001 '1.2.2.0')
1002 self.assertEqual(
1003 ipaddress.IPv4Interface('0.0.0.0/0').network.supernet(),
1004 ipaddress.IPv4Network('0.0.0.0/0'))
1005
1006 self.assertEqual(self.ipv6_network.supernet().prefixlen, 63)
1007 self.assertEqual(str(self.ipv6_network.supernet().network_address),
1008 '2001:658:22a:cafe::')
1009 self.assertEqual(ipaddress.IPv6Interface('::0/0').network.supernet(),
1010 ipaddress.IPv6Network('::0/0'))
1011
1012 def testGetSupernet3(self):
1013 self.assertEqual(self.ipv4_network.supernet(3).prefixlen, 21)
1014 self.assertEqual(str(self.ipv4_network.supernet(3).network_address),
1015 '1.2.0.0')
1016
1017 self.assertEqual(self.ipv6_network.supernet(3).prefixlen, 61)
1018 self.assertEqual(str(self.ipv6_network.supernet(3).network_address),
1019 '2001:658:22a:caf8::')
1020
1021 def testGetSupernet4(self):
1022 self.assertRaises(ValueError, self.ipv4_network.supernet,
1023 prefixlen_diff=2, new_prefix=1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001024 self.assertRaises(ValueError, self.ipv4_network.supernet,
1025 new_prefix=25)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001026 self.assertEqual(self.ipv4_network.supernet(prefixlen_diff=2),
1027 self.ipv4_network.supernet(new_prefix=22))
1028
1029 self.assertRaises(ValueError, self.ipv6_network.supernet,
1030 prefixlen_diff=2, new_prefix=1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001031 self.assertRaises(ValueError, self.ipv6_network.supernet,
1032 new_prefix=65)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001033 self.assertEqual(self.ipv6_network.supernet(prefixlen_diff=2),
1034 self.ipv6_network.supernet(new_prefix=62))
1035
1036 def testHosts(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001037 hosts = list(self.ipv4_network.hosts())
1038 self.assertEqual(254, len(hosts))
1039 self.assertEqual(ipaddress.IPv4Address('1.2.3.1'), hosts[0])
1040 self.assertEqual(ipaddress.IPv4Address('1.2.3.254'), hosts[-1])
1041
1042 # special case where only 1 bit is left for address
Nick Coghlandc9b2552012-05-20 21:01:57 +10001043 self.assertEqual([ipaddress.IPv4Address('2.0.0.0'),
1044 ipaddress.IPv4Address('2.0.0.1')],
1045 list(ipaddress.ip_network('2.0.0.0/31').hosts()))
1046
1047 def testFancySubnetting(self):
1048 self.assertEqual(sorted(self.ipv4_network.subnets(prefixlen_diff=3)),
1049 sorted(self.ipv4_network.subnets(new_prefix=27)))
1050 self.assertRaises(ValueError, list,
1051 self.ipv4_network.subnets(new_prefix=23))
1052 self.assertRaises(ValueError, list,
1053 self.ipv4_network.subnets(prefixlen_diff=3,
1054 new_prefix=27))
1055 self.assertEqual(sorted(self.ipv6_network.subnets(prefixlen_diff=4)),
1056 sorted(self.ipv6_network.subnets(new_prefix=68)))
1057 self.assertRaises(ValueError, list,
1058 self.ipv6_network.subnets(new_prefix=63))
1059 self.assertRaises(ValueError, list,
1060 self.ipv6_network.subnets(prefixlen_diff=4,
1061 new_prefix=68))
1062
1063 def testGetSubnets(self):
1064 self.assertEqual(list(self.ipv4_network.subnets())[0].prefixlen, 25)
1065 self.assertEqual(str(list(
1066 self.ipv4_network.subnets())[0].network_address),
1067 '1.2.3.0')
1068 self.assertEqual(str(list(
1069 self.ipv4_network.subnets())[1].network_address),
1070 '1.2.3.128')
1071
1072 self.assertEqual(list(self.ipv6_network.subnets())[0].prefixlen, 65)
1073
1074 def testGetSubnetForSingle32(self):
1075 ip = ipaddress.IPv4Network('1.2.3.4/32')
1076 subnets1 = [str(x) for x in ip.subnets()]
1077 subnets2 = [str(x) for x in ip.subnets(2)]
1078 self.assertEqual(subnets1, ['1.2.3.4/32'])
1079 self.assertEqual(subnets1, subnets2)
1080
1081 def testGetSubnetForSingle128(self):
1082 ip = ipaddress.IPv6Network('::1/128')
1083 subnets1 = [str(x) for x in ip.subnets()]
1084 subnets2 = [str(x) for x in ip.subnets(2)]
1085 self.assertEqual(subnets1, ['::1/128'])
1086 self.assertEqual(subnets1, subnets2)
1087
1088 def testSubnet2(self):
1089 ips = [str(x) for x in self.ipv4_network.subnets(2)]
1090 self.assertEqual(
1091 ips,
1092 ['1.2.3.0/26', '1.2.3.64/26', '1.2.3.128/26', '1.2.3.192/26'])
1093
1094 ipsv6 = [str(x) for x in self.ipv6_network.subnets(2)]
1095 self.assertEqual(
1096 ipsv6,
1097 ['2001:658:22a:cafe::/66',
1098 '2001:658:22a:cafe:4000::/66',
1099 '2001:658:22a:cafe:8000::/66',
1100 '2001:658:22a:cafe:c000::/66'])
1101
Serhiy Storchakabb0dbd52016-03-01 10:25:45 +02001102 def testGetSubnets3(self):
1103 subnets = [str(x) for x in self.ipv4_network.subnets(8)]
1104 self.assertEqual(subnets[:3],
1105 ['1.2.3.0/32', '1.2.3.1/32', '1.2.3.2/32'])
1106 self.assertEqual(subnets[-3:],
1107 ['1.2.3.253/32', '1.2.3.254/32', '1.2.3.255/32'])
1108 self.assertEqual(len(subnets), 256)
1109
1110 ipv6_network = ipaddress.IPv6Network('2001:658:22a:cafe::/120')
1111 subnets = [str(x) for x in ipv6_network.subnets(8)]
1112 self.assertEqual(subnets[:3],
1113 ['2001:658:22a:cafe::/128',
1114 '2001:658:22a:cafe::1/128',
1115 '2001:658:22a:cafe::2/128'])
1116 self.assertEqual(subnets[-3:],
1117 ['2001:658:22a:cafe::fd/128',
1118 '2001:658:22a:cafe::fe/128',
1119 '2001:658:22a:cafe::ff/128'])
1120 self.assertEqual(len(subnets), 256)
1121
Nick Coghlandc9b2552012-05-20 21:01:57 +10001122 def testSubnetFailsForLargeCidrDiff(self):
1123 self.assertRaises(ValueError, list,
1124 self.ipv4_interface.network.subnets(9))
1125 self.assertRaises(ValueError, list,
1126 self.ipv4_network.subnets(9))
1127 self.assertRaises(ValueError, list,
1128 self.ipv6_interface.network.subnets(65))
1129 self.assertRaises(ValueError, list,
1130 self.ipv6_network.subnets(65))
1131
1132 def testSupernetFailsForLargeCidrDiff(self):
1133 self.assertRaises(ValueError,
1134 self.ipv4_interface.network.supernet, 25)
1135 self.assertRaises(ValueError,
1136 self.ipv6_interface.network.supernet, 65)
1137
1138 def testSubnetFailsForNegativeCidrDiff(self):
1139 self.assertRaises(ValueError, list,
1140 self.ipv4_interface.network.subnets(-1))
1141 self.assertRaises(ValueError, list,
Nick Coghlan2c589102012-05-27 01:03:25 +10001142 self.ipv4_network.subnets(-1))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001143 self.assertRaises(ValueError, list,
1144 self.ipv6_interface.network.subnets(-1))
1145 self.assertRaises(ValueError, list,
1146 self.ipv6_network.subnets(-1))
1147
1148 def testGetNum_Addresses(self):
1149 self.assertEqual(self.ipv4_network.num_addresses, 256)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001150 self.assertEqual(list(self.ipv4_network.subnets())[0].num_addresses,
1151 128)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001152 self.assertEqual(self.ipv4_network.supernet().num_addresses, 512)
1153
1154 self.assertEqual(self.ipv6_network.num_addresses, 18446744073709551616)
1155 self.assertEqual(list(self.ipv6_network.subnets())[0].num_addresses,
1156 9223372036854775808)
1157 self.assertEqual(self.ipv6_network.supernet().num_addresses,
1158 36893488147419103232)
1159
1160 def testContains(self):
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001161 self.assertIn(ipaddress.IPv4Interface('1.2.3.128/25'),
1162 self.ipv4_network)
1163 self.assertNotIn(ipaddress.IPv4Interface('1.2.4.1/24'),
Nick Coghlandc9b2552012-05-20 21:01:57 +10001164 self.ipv4_network)
1165 # We can test addresses and string as well.
1166 addr1 = ipaddress.IPv4Address('1.2.3.37')
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001167 self.assertIn(addr1, self.ipv4_network)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001168 # issue 61, bad network comparison on like-ip'd network objects
1169 # with identical broadcast addresses.
1170 self.assertFalse(ipaddress.IPv4Network('1.1.0.0/16').__contains__(
1171 ipaddress.IPv4Network('1.0.0.0/15')))
1172
Nick Coghlandc9b2552012-05-20 21:01:57 +10001173 def testNth(self):
1174 self.assertEqual(str(self.ipv4_network[5]), '1.2.3.5')
1175 self.assertRaises(IndexError, self.ipv4_network.__getitem__, 256)
1176
1177 self.assertEqual(str(self.ipv6_network[5]),
1178 '2001:658:22a:cafe::5')
Berker Peksag28dc1182016-06-11 22:30:05 +03001179 self.assertRaises(IndexError, self.ipv6_network.__getitem__, 1 << 64)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001180
1181 def testGetitem(self):
1182 # http://code.google.com/p/ipaddr-py/issues/detail?id=15
1183 addr = ipaddress.IPv4Network('172.31.255.128/255.255.255.240')
1184 self.assertEqual(28, addr.prefixlen)
1185 addr_list = list(addr)
1186 self.assertEqual('172.31.255.128', str(addr_list[0]))
1187 self.assertEqual('172.31.255.128', str(addr[0]))
1188 self.assertEqual('172.31.255.143', str(addr_list[-1]))
1189 self.assertEqual('172.31.255.143', str(addr[-1]))
1190 self.assertEqual(addr_list[-1], addr[-1])
1191
1192 def testEqual(self):
1193 self.assertTrue(self.ipv4_interface ==
1194 ipaddress.IPv4Interface('1.2.3.4/24'))
1195 self.assertFalse(self.ipv4_interface ==
1196 ipaddress.IPv4Interface('1.2.3.4/23'))
1197 self.assertFalse(self.ipv4_interface ==
1198 ipaddress.IPv6Interface('::1.2.3.4/24'))
1199 self.assertFalse(self.ipv4_interface == '')
1200 self.assertFalse(self.ipv4_interface == [])
1201 self.assertFalse(self.ipv4_interface == 2)
1202
1203 self.assertTrue(self.ipv6_interface ==
1204 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/64'))
1205 self.assertFalse(self.ipv6_interface ==
1206 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/63'))
1207 self.assertFalse(self.ipv6_interface ==
1208 ipaddress.IPv4Interface('1.2.3.4/23'))
1209 self.assertFalse(self.ipv6_interface == '')
1210 self.assertFalse(self.ipv6_interface == [])
1211 self.assertFalse(self.ipv6_interface == 2)
1212
1213 def testNotEqual(self):
1214 self.assertFalse(self.ipv4_interface !=
1215 ipaddress.IPv4Interface('1.2.3.4/24'))
1216 self.assertTrue(self.ipv4_interface !=
1217 ipaddress.IPv4Interface('1.2.3.4/23'))
1218 self.assertTrue(self.ipv4_interface !=
1219 ipaddress.IPv6Interface('::1.2.3.4/24'))
1220 self.assertTrue(self.ipv4_interface != '')
1221 self.assertTrue(self.ipv4_interface != [])
1222 self.assertTrue(self.ipv4_interface != 2)
1223
1224 self.assertTrue(self.ipv4_address !=
1225 ipaddress.IPv4Address('1.2.3.5'))
1226 self.assertTrue(self.ipv4_address != '')
1227 self.assertTrue(self.ipv4_address != [])
1228 self.assertTrue(self.ipv4_address != 2)
1229
1230 self.assertFalse(self.ipv6_interface !=
1231 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/64'))
1232 self.assertTrue(self.ipv6_interface !=
1233 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/63'))
1234 self.assertTrue(self.ipv6_interface !=
1235 ipaddress.IPv4Interface('1.2.3.4/23'))
1236 self.assertTrue(self.ipv6_interface != '')
1237 self.assertTrue(self.ipv6_interface != [])
1238 self.assertTrue(self.ipv6_interface != 2)
1239
1240 self.assertTrue(self.ipv6_address !=
1241 ipaddress.IPv4Address('1.2.3.4'))
1242 self.assertTrue(self.ipv6_address != '')
1243 self.assertTrue(self.ipv6_address != [])
1244 self.assertTrue(self.ipv6_address != 2)
1245
1246 def testSlash32Constructor(self):
1247 self.assertEqual(str(ipaddress.IPv4Interface(
1248 '1.2.3.4/255.255.255.255')), '1.2.3.4/32')
1249
1250 def testSlash128Constructor(self):
1251 self.assertEqual(str(ipaddress.IPv6Interface('::1/128')),
1252 '::1/128')
1253
1254 def testSlash0Constructor(self):
1255 self.assertEqual(str(ipaddress.IPv4Interface('1.2.3.4/0.0.0.0')),
1256 '1.2.3.4/0')
1257
1258 def testCollapsing(self):
1259 # test only IP addresses including some duplicates
1260 ip1 = ipaddress.IPv4Address('1.1.1.0')
1261 ip2 = ipaddress.IPv4Address('1.1.1.1')
1262 ip3 = ipaddress.IPv4Address('1.1.1.2')
1263 ip4 = ipaddress.IPv4Address('1.1.1.3')
1264 ip5 = ipaddress.IPv4Address('1.1.1.4')
1265 ip6 = ipaddress.IPv4Address('1.1.1.0')
1266 # check that addreses are subsumed properly.
1267 collapsed = ipaddress.collapse_addresses(
1268 [ip1, ip2, ip3, ip4, ip5, ip6])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001269 self.assertEqual(list(collapsed),
1270 [ipaddress.IPv4Network('1.1.1.0/30'),
1271 ipaddress.IPv4Network('1.1.1.4/32')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001272
1273 # test a mix of IP addresses and networks including some duplicates
1274 ip1 = ipaddress.IPv4Address('1.1.1.0')
1275 ip2 = ipaddress.IPv4Address('1.1.1.1')
1276 ip3 = ipaddress.IPv4Address('1.1.1.2')
1277 ip4 = ipaddress.IPv4Address('1.1.1.3')
1278 #ip5 = ipaddress.IPv4Interface('1.1.1.4/30')
1279 #ip6 = ipaddress.IPv4Interface('1.1.1.4/30')
1280 # check that addreses are subsumed properly.
1281 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3, ip4])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001282 self.assertEqual(list(collapsed),
1283 [ipaddress.IPv4Network('1.1.1.0/30')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001284
1285 # test only IP networks
1286 ip1 = ipaddress.IPv4Network('1.1.0.0/24')
1287 ip2 = ipaddress.IPv4Network('1.1.1.0/24')
1288 ip3 = ipaddress.IPv4Network('1.1.2.0/24')
1289 ip4 = ipaddress.IPv4Network('1.1.3.0/24')
1290 ip5 = ipaddress.IPv4Network('1.1.4.0/24')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001291 # stored in no particular order b/c we want CollapseAddr to call
1292 # [].sort
Nick Coghlandc9b2552012-05-20 21:01:57 +10001293 ip6 = ipaddress.IPv4Network('1.1.0.0/22')
1294 # check that addreses are subsumed properly.
1295 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3, ip4, ip5,
1296 ip6])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001297 self.assertEqual(list(collapsed),
1298 [ipaddress.IPv4Network('1.1.0.0/22'),
1299 ipaddress.IPv4Network('1.1.4.0/24')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001300
1301 # test that two addresses are supernet'ed properly
1302 collapsed = ipaddress.collapse_addresses([ip1, ip2])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001303 self.assertEqual(list(collapsed),
1304 [ipaddress.IPv4Network('1.1.0.0/23')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001305
1306 # test same IP networks
1307 ip_same1 = ip_same2 = ipaddress.IPv4Network('1.1.1.1/32')
1308 self.assertEqual(list(ipaddress.collapse_addresses(
1309 [ip_same1, ip_same2])),
1310 [ip_same1])
1311
1312 # test same IP addresses
1313 ip_same1 = ip_same2 = ipaddress.IPv4Address('1.1.1.1')
1314 self.assertEqual(list(ipaddress.collapse_addresses(
1315 [ip_same1, ip_same2])),
1316 [ipaddress.ip_network('1.1.1.1/32')])
1317 ip1 = ipaddress.IPv6Network('2001::/100')
1318 ip2 = ipaddress.IPv6Network('2001::/120')
1319 ip3 = ipaddress.IPv6Network('2001::/96')
1320 # test that ipv6 addresses are subsumed properly.
1321 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3])
1322 self.assertEqual(list(collapsed), [ip3])
1323
1324 # the toejam test
Hynek Schlawack35db5132012-06-01 20:12:17 +02001325 addr_tuples = [
1326 (ipaddress.ip_address('1.1.1.1'),
1327 ipaddress.ip_address('::1')),
1328 (ipaddress.IPv4Network('1.1.0.0/24'),
1329 ipaddress.IPv6Network('2001::/120')),
1330 (ipaddress.IPv4Network('1.1.0.0/32'),
1331 ipaddress.IPv6Network('2001::/128')),
1332 ]
1333 for ip1, ip2 in addr_tuples:
1334 self.assertRaises(TypeError, ipaddress.collapse_addresses,
1335 [ip1, ip2])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001336
1337 def testSummarizing(self):
1338 #ip = ipaddress.ip_address
1339 #ipnet = ipaddress.ip_network
1340 summarize = ipaddress.summarize_address_range
1341 ip1 = ipaddress.ip_address('1.1.1.0')
1342 ip2 = ipaddress.ip_address('1.1.1.255')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001343
1344 # summarize works only for IPv4 & IPv6
1345 class IPv7Address(ipaddress.IPv6Address):
1346 @property
1347 def version(self):
1348 return 7
1349 ip_invalid1 = IPv7Address('::1')
1350 ip_invalid2 = IPv7Address('::1')
1351 self.assertRaises(ValueError, list,
1352 summarize(ip_invalid1, ip_invalid2))
1353 # test that a summary over ip4 & ip6 fails
1354 self.assertRaises(TypeError, list,
1355 summarize(ip1, ipaddress.IPv6Address('::1')))
1356 # test a /24 is summarized properly
Nick Coghlandc9b2552012-05-20 21:01:57 +10001357 self.assertEqual(list(summarize(ip1, ip2))[0],
1358 ipaddress.ip_network('1.1.1.0/24'))
Martin Panter7462b6492015-11-02 03:37:02 +00001359 # test an IPv4 range that isn't on a network byte boundary
Nick Coghlandc9b2552012-05-20 21:01:57 +10001360 ip2 = ipaddress.ip_address('1.1.1.8')
1361 self.assertEqual(list(summarize(ip1, ip2)),
1362 [ipaddress.ip_network('1.1.1.0/29'),
1363 ipaddress.ip_network('1.1.1.8')])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001364 # all!
1365 ip1 = ipaddress.IPv4Address(0)
1366 ip2 = ipaddress.IPv4Address(ipaddress.IPv4Address._ALL_ONES)
1367 self.assertEqual([ipaddress.IPv4Network('0.0.0.0/0')],
1368 list(summarize(ip1, ip2)))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001369
1370 ip1 = ipaddress.ip_address('1::')
1371 ip2 = ipaddress.ip_address('1:ffff:ffff:ffff:ffff:ffff:ffff:ffff')
Martin Panter7462b6492015-11-02 03:37:02 +00001372 # test an IPv6 is summarized properly
Nick Coghlandc9b2552012-05-20 21:01:57 +10001373 self.assertEqual(list(summarize(ip1, ip2))[0],
1374 ipaddress.ip_network('1::/16'))
1375 # test an IPv6 range that isn't on a network byte boundary
1376 ip2 = ipaddress.ip_address('2::')
1377 self.assertEqual(list(summarize(ip1, ip2)),
1378 [ipaddress.ip_network('1::/16'),
1379 ipaddress.ip_network('2::/128')])
1380
1381 # test exception raised when first is greater than last
1382 self.assertRaises(ValueError, list,
1383 summarize(ipaddress.ip_address('1.1.1.0'),
1384 ipaddress.ip_address('1.1.0.0')))
1385 # test exception raised when first and last aren't IP addresses
1386 self.assertRaises(TypeError, list,
1387 summarize(ipaddress.ip_network('1.1.1.0'),
1388 ipaddress.ip_network('1.1.0.0')))
1389 self.assertRaises(TypeError, list,
1390 summarize(ipaddress.ip_network('1.1.1.0'),
1391 ipaddress.ip_network('1.1.0.0')))
1392 # test exception raised when first and last are not same version
1393 self.assertRaises(TypeError, list,
1394 summarize(ipaddress.ip_address('::'),
1395 ipaddress.ip_network('1.1.0.0')))
1396
1397 def testAddressComparison(self):
1398 self.assertTrue(ipaddress.ip_address('1.1.1.1') <=
1399 ipaddress.ip_address('1.1.1.1'))
1400 self.assertTrue(ipaddress.ip_address('1.1.1.1') <=
1401 ipaddress.ip_address('1.1.1.2'))
1402 self.assertTrue(ipaddress.ip_address('::1') <=
1403 ipaddress.ip_address('::1'))
1404 self.assertTrue(ipaddress.ip_address('::1') <=
1405 ipaddress.ip_address('::2'))
1406
Nick Coghlan3008ec02012-07-08 00:45:33 +10001407 def testInterfaceComparison(self):
1408 self.assertTrue(ipaddress.ip_interface('1.1.1.1') <=
1409 ipaddress.ip_interface('1.1.1.1'))
1410 self.assertTrue(ipaddress.ip_interface('1.1.1.1') <=
1411 ipaddress.ip_interface('1.1.1.2'))
1412 self.assertTrue(ipaddress.ip_interface('::1') <=
1413 ipaddress.ip_interface('::1'))
1414 self.assertTrue(ipaddress.ip_interface('::1') <=
1415 ipaddress.ip_interface('::2'))
1416
Nick Coghlandc9b2552012-05-20 21:01:57 +10001417 def testNetworkComparison(self):
1418 # ip1 and ip2 have the same network address
1419 ip1 = ipaddress.IPv4Network('1.1.1.0/24')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001420 ip2 = ipaddress.IPv4Network('1.1.1.0/32')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001421 ip3 = ipaddress.IPv4Network('1.1.2.0/24')
1422
1423 self.assertTrue(ip1 < ip3)
1424 self.assertTrue(ip3 > ip2)
1425
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001426 self.assertEqual(ip1.compare_networks(ip1), 0)
1427
1428 # if addresses are the same, sort by netmask
1429 self.assertEqual(ip1.compare_networks(ip2), -1)
1430 self.assertEqual(ip2.compare_networks(ip1), 1)
1431
Nick Coghlandc9b2552012-05-20 21:01:57 +10001432 self.assertEqual(ip1.compare_networks(ip3), -1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001433 self.assertEqual(ip3.compare_networks(ip1), 1)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001434 self.assertTrue(ip1._get_networks_key() < ip3._get_networks_key())
1435
1436 ip1 = ipaddress.IPv6Network('2001:2000::/96')
1437 ip2 = ipaddress.IPv6Network('2001:2001::/96')
1438 ip3 = ipaddress.IPv6Network('2001:ffff:2000::/96')
1439
1440 self.assertTrue(ip1 < ip3)
1441 self.assertTrue(ip3 > ip2)
1442 self.assertEqual(ip1.compare_networks(ip3), -1)
1443 self.assertTrue(ip1._get_networks_key() < ip3._get_networks_key())
1444
1445 # Test comparing different protocols.
1446 # Should always raise a TypeError.
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001447 self.assertRaises(TypeError,
1448 self.ipv4_network.compare_networks,
1449 self.ipv6_network)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001450 ipv6 = ipaddress.IPv6Interface('::/0')
1451 ipv4 = ipaddress.IPv4Interface('0.0.0.0/0')
1452 self.assertRaises(TypeError, ipv4.__lt__, ipv6)
1453 self.assertRaises(TypeError, ipv4.__gt__, ipv6)
1454 self.assertRaises(TypeError, ipv6.__lt__, ipv4)
1455 self.assertRaises(TypeError, ipv6.__gt__, ipv4)
1456
1457 # Regression test for issue 19.
1458 ip1 = ipaddress.ip_network('10.1.2.128/25')
1459 self.assertFalse(ip1 < ip1)
1460 self.assertFalse(ip1 > ip1)
1461 ip2 = ipaddress.ip_network('10.1.3.0/24')
1462 self.assertTrue(ip1 < ip2)
1463 self.assertFalse(ip2 < ip1)
1464 self.assertFalse(ip1 > ip2)
1465 self.assertTrue(ip2 > ip1)
1466 ip3 = ipaddress.ip_network('10.1.3.0/25')
1467 self.assertTrue(ip2 < ip3)
1468 self.assertFalse(ip3 < ip2)
1469 self.assertFalse(ip2 > ip3)
1470 self.assertTrue(ip3 > ip2)
1471
1472 # Regression test for issue 28.
1473 ip1 = ipaddress.ip_network('10.10.10.0/31')
1474 ip2 = ipaddress.ip_network('10.10.10.0')
1475 ip3 = ipaddress.ip_network('10.10.10.2/31')
1476 ip4 = ipaddress.ip_network('10.10.10.2')
1477 sorted = [ip1, ip2, ip3, ip4]
1478 unsorted = [ip2, ip4, ip1, ip3]
1479 unsorted.sort()
1480 self.assertEqual(sorted, unsorted)
1481 unsorted = [ip4, ip1, ip3, ip2]
1482 unsorted.sort()
1483 self.assertEqual(sorted, unsorted)
Serhiy Storchakaf186e122015-01-26 10:11:16 +02001484 self.assertIs(ip1.__lt__(ipaddress.ip_address('10.10.10.0')),
1485 NotImplemented)
1486 self.assertIs(ip2.__lt__(ipaddress.ip_address('10.10.10.0')),
1487 NotImplemented)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001488
1489 # <=, >=
1490 self.assertTrue(ipaddress.ip_network('1.1.1.1') <=
1491 ipaddress.ip_network('1.1.1.1'))
1492 self.assertTrue(ipaddress.ip_network('1.1.1.1') <=
1493 ipaddress.ip_network('1.1.1.2'))
1494 self.assertFalse(ipaddress.ip_network('1.1.1.2') <=
1495 ipaddress.ip_network('1.1.1.1'))
1496 self.assertTrue(ipaddress.ip_network('::1') <=
1497 ipaddress.ip_network('::1'))
1498 self.assertTrue(ipaddress.ip_network('::1') <=
1499 ipaddress.ip_network('::2'))
1500 self.assertFalse(ipaddress.ip_network('::2') <=
1501 ipaddress.ip_network('::1'))
1502
1503 def testStrictNetworks(self):
1504 self.assertRaises(ValueError, ipaddress.ip_network, '192.168.1.1/24')
1505 self.assertRaises(ValueError, ipaddress.ip_network, '::1/120')
1506
1507 def testOverlaps(self):
1508 other = ipaddress.IPv4Network('1.2.3.0/30')
1509 other2 = ipaddress.IPv4Network('1.2.2.0/24')
1510 other3 = ipaddress.IPv4Network('1.2.2.64/26')
1511 self.assertTrue(self.ipv4_network.overlaps(other))
1512 self.assertFalse(self.ipv4_network.overlaps(other2))
1513 self.assertTrue(other2.overlaps(other3))
1514
1515 def testEmbeddedIpv4(self):
1516 ipv4_string = '192.168.0.1'
1517 ipv4 = ipaddress.IPv4Interface(ipv4_string)
1518 v4compat_ipv6 = ipaddress.IPv6Interface('::%s' % ipv4_string)
1519 self.assertEqual(int(v4compat_ipv6.ip), int(ipv4.ip))
1520 v4mapped_ipv6 = ipaddress.IPv6Interface('::ffff:%s' % ipv4_string)
1521 self.assertNotEqual(v4mapped_ipv6.ip, ipv4.ip)
1522 self.assertRaises(ipaddress.AddressValueError, ipaddress.IPv6Interface,
1523 '2001:1.1.1.1:1.1.1.1')
1524
1525 # Issue 67: IPv6 with embedded IPv4 address not recognized.
1526 def testIPv6AddressTooLarge(self):
1527 # RFC4291 2.5.5.2
1528 self.assertEqual(ipaddress.ip_address('::FFFF:192.0.2.1'),
1529 ipaddress.ip_address('::FFFF:c000:201'))
1530 # RFC4291 2.2 (part 3) x::d.d.d.d
1531 self.assertEqual(ipaddress.ip_address('FFFF::192.0.2.1'),
1532 ipaddress.ip_address('FFFF::c000:201'))
1533
1534 def testIPVersion(self):
1535 self.assertEqual(self.ipv4_address.version, 4)
1536 self.assertEqual(self.ipv6_address.version, 6)
1537
1538 def testMaxPrefixLength(self):
1539 self.assertEqual(self.ipv4_interface.max_prefixlen, 32)
1540 self.assertEqual(self.ipv6_interface.max_prefixlen, 128)
1541
1542 def testPacked(self):
1543 self.assertEqual(self.ipv4_address.packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001544 b'\x01\x02\x03\x04')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001545 self.assertEqual(ipaddress.IPv4Interface('255.254.253.252').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001546 b'\xff\xfe\xfd\xfc')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001547 self.assertEqual(self.ipv6_address.packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001548 b'\x20\x01\x06\x58\x02\x2a\xca\xfe'
1549 b'\x02\x00\x00\x00\x00\x00\x00\x01')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001550 self.assertEqual(ipaddress.IPv6Interface('ffff:2:3:4:ffff::').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001551 b'\xff\xff\x00\x02\x00\x03\x00\x04\xff\xff'
1552 + b'\x00' * 6)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001553 self.assertEqual(ipaddress.IPv6Interface('::1:0:0:0:0').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001554 b'\x00' * 6 + b'\x00\x01' + b'\x00' * 8)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001555
Nick Coghlandc9b2552012-05-20 21:01:57 +10001556 def testIpType(self):
1557 ipv4net = ipaddress.ip_network('1.2.3.4')
1558 ipv4addr = ipaddress.ip_address('1.2.3.4')
1559 ipv6net = ipaddress.ip_network('::1.2.3.4')
1560 ipv6addr = ipaddress.ip_address('::1.2.3.4')
1561 self.assertEqual(ipaddress.IPv4Network, type(ipv4net))
1562 self.assertEqual(ipaddress.IPv4Address, type(ipv4addr))
1563 self.assertEqual(ipaddress.IPv6Network, type(ipv6net))
1564 self.assertEqual(ipaddress.IPv6Address, type(ipv6addr))
1565
1566 def testReservedIpv4(self):
1567 # test networks
1568 self.assertEqual(True, ipaddress.ip_interface(
1569 '224.1.1.1/31').is_multicast)
1570 self.assertEqual(False, ipaddress.ip_network('240.0.0.0').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001571 self.assertEqual(True, ipaddress.ip_network('240.0.0.0').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001572
1573 self.assertEqual(True, ipaddress.ip_interface(
1574 '192.168.1.1/17').is_private)
1575 self.assertEqual(False, ipaddress.ip_network('192.169.0.0').is_private)
1576 self.assertEqual(True, ipaddress.ip_network(
1577 '10.255.255.255').is_private)
1578 self.assertEqual(False, ipaddress.ip_network('11.0.0.0').is_private)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001579 self.assertEqual(False, ipaddress.ip_network('11.0.0.0').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001580 self.assertEqual(True, ipaddress.ip_network(
1581 '172.31.255.255').is_private)
1582 self.assertEqual(False, ipaddress.ip_network('172.32.0.0').is_private)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001583 self.assertEqual(True,
1584 ipaddress.ip_network('169.254.1.0/24').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001585
1586 self.assertEqual(True,
1587 ipaddress.ip_interface(
1588 '169.254.100.200/24').is_link_local)
1589 self.assertEqual(False,
1590 ipaddress.ip_interface(
1591 '169.255.100.200/24').is_link_local)
1592
1593 self.assertEqual(True,
1594 ipaddress.ip_network(
1595 '127.100.200.254/32').is_loopback)
1596 self.assertEqual(True, ipaddress.ip_network(
1597 '127.42.0.0/16').is_loopback)
1598 self.assertEqual(False, ipaddress.ip_network('128.0.0.0').is_loopback)
Peter Moodye5019d52013-10-24 09:47:10 -07001599 self.assertEqual(False,
1600 ipaddress.ip_network('100.64.0.0/10').is_private)
Peter Moodybe9c1b12013-10-22 12:36:21 -07001601 self.assertEqual(False, ipaddress.ip_network('100.64.0.0/10').is_global)
Peter Moodye5019d52013-10-24 09:47:10 -07001602
Peter Moody22c31762013-10-21 13:58:06 -07001603 self.assertEqual(True,
1604 ipaddress.ip_network('192.0.2.128/25').is_private)
1605 self.assertEqual(True,
1606 ipaddress.ip_network('192.0.3.0/24').is_global)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001607
1608 # test addresses
Hynek Schlawackbcd30442012-06-04 14:19:39 +02001609 self.assertEqual(True, ipaddress.ip_address('0.0.0.0').is_unspecified)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001610 self.assertEqual(True, ipaddress.ip_address('224.1.1.1').is_multicast)
1611 self.assertEqual(False, ipaddress.ip_address('240.0.0.0').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001612 self.assertEqual(True, ipaddress.ip_address('240.0.0.1').is_reserved)
1613 self.assertEqual(False,
1614 ipaddress.ip_address('239.255.255.255').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001615
1616 self.assertEqual(True, ipaddress.ip_address('192.168.1.1').is_private)
1617 self.assertEqual(False, ipaddress.ip_address('192.169.0.0').is_private)
1618 self.assertEqual(True, ipaddress.ip_address(
1619 '10.255.255.255').is_private)
1620 self.assertEqual(False, ipaddress.ip_address('11.0.0.0').is_private)
1621 self.assertEqual(True, ipaddress.ip_address(
1622 '172.31.255.255').is_private)
1623 self.assertEqual(False, ipaddress.ip_address('172.32.0.0').is_private)
1624
1625 self.assertEqual(True,
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001626 ipaddress.ip_address('169.254.100.200').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001627 self.assertEqual(False,
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001628 ipaddress.ip_address('169.255.100.200').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001629
Berker Peksag742192a2016-06-11 22:11:47 +03001630 self.assertTrue(ipaddress.ip_address('192.0.7.1').is_global)
1631 self.assertFalse(ipaddress.ip_address('203.0.113.1').is_global)
1632
Nick Coghlandc9b2552012-05-20 21:01:57 +10001633 self.assertEqual(True,
1634 ipaddress.ip_address('127.100.200.254').is_loopback)
1635 self.assertEqual(True, ipaddress.ip_address('127.42.0.0').is_loopback)
1636 self.assertEqual(False, ipaddress.ip_address('128.0.0.0').is_loopback)
1637 self.assertEqual(True, ipaddress.ip_network('0.0.0.0').is_unspecified)
1638
1639 def testReservedIpv6(self):
1640
1641 self.assertEqual(True, ipaddress.ip_network('ffff::').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001642 self.assertEqual(True, ipaddress.ip_network(2**128 - 1).is_multicast)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001643 self.assertEqual(True, ipaddress.ip_network('ff00::').is_multicast)
1644 self.assertEqual(False, ipaddress.ip_network('fdff::').is_multicast)
1645
1646 self.assertEqual(True, ipaddress.ip_network('fecf::').is_site_local)
1647 self.assertEqual(True, ipaddress.ip_network(
1648 'feff:ffff:ffff:ffff::').is_site_local)
1649 self.assertEqual(False, ipaddress.ip_network(
1650 'fbf:ffff::').is_site_local)
1651 self.assertEqual(False, ipaddress.ip_network('ff00::').is_site_local)
1652
1653 self.assertEqual(True, ipaddress.ip_network('fc00::').is_private)
1654 self.assertEqual(True, ipaddress.ip_network(
1655 'fc00:ffff:ffff:ffff::').is_private)
1656 self.assertEqual(False, ipaddress.ip_network('fbff:ffff::').is_private)
1657 self.assertEqual(False, ipaddress.ip_network('fe00::').is_private)
1658
1659 self.assertEqual(True, ipaddress.ip_network('fea0::').is_link_local)
1660 self.assertEqual(True, ipaddress.ip_network(
1661 'febf:ffff::').is_link_local)
1662 self.assertEqual(False, ipaddress.ip_network(
1663 'fe7f:ffff::').is_link_local)
1664 self.assertEqual(False, ipaddress.ip_network('fec0::').is_link_local)
1665
1666 self.assertEqual(True, ipaddress.ip_interface('0:0::0:01').is_loopback)
1667 self.assertEqual(False, ipaddress.ip_interface('::1/127').is_loopback)
1668 self.assertEqual(False, ipaddress.ip_network('::').is_loopback)
1669 self.assertEqual(False, ipaddress.ip_network('::2').is_loopback)
1670
1671 self.assertEqual(True, ipaddress.ip_network('0::0').is_unspecified)
1672 self.assertEqual(False, ipaddress.ip_network('::1').is_unspecified)
1673 self.assertEqual(False, ipaddress.ip_network('::/127').is_unspecified)
1674
Peter Moody22c31762013-10-21 13:58:06 -07001675 self.assertEqual(True,
1676 ipaddress.ip_network('2001::1/128').is_private)
1677 self.assertEqual(True,
1678 ipaddress.ip_network('200::1/128').is_global)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001679 # test addresses
1680 self.assertEqual(True, ipaddress.ip_address('ffff::').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001681 self.assertEqual(True, ipaddress.ip_address(2**128 - 1).is_multicast)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001682 self.assertEqual(True, ipaddress.ip_address('ff00::').is_multicast)
1683 self.assertEqual(False, ipaddress.ip_address('fdff::').is_multicast)
1684
1685 self.assertEqual(True, ipaddress.ip_address('fecf::').is_site_local)
1686 self.assertEqual(True, ipaddress.ip_address(
1687 'feff:ffff:ffff:ffff::').is_site_local)
1688 self.assertEqual(False, ipaddress.ip_address(
1689 'fbf:ffff::').is_site_local)
1690 self.assertEqual(False, ipaddress.ip_address('ff00::').is_site_local)
1691
1692 self.assertEqual(True, ipaddress.ip_address('fc00::').is_private)
1693 self.assertEqual(True, ipaddress.ip_address(
1694 'fc00:ffff:ffff:ffff::').is_private)
1695 self.assertEqual(False, ipaddress.ip_address('fbff:ffff::').is_private)
1696 self.assertEqual(False, ipaddress.ip_address('fe00::').is_private)
1697
1698 self.assertEqual(True, ipaddress.ip_address('fea0::').is_link_local)
1699 self.assertEqual(True, ipaddress.ip_address(
1700 'febf:ffff::').is_link_local)
1701 self.assertEqual(False, ipaddress.ip_address(
1702 'fe7f:ffff::').is_link_local)
1703 self.assertEqual(False, ipaddress.ip_address('fec0::').is_link_local)
1704
1705 self.assertEqual(True, ipaddress.ip_address('0:0::0:01').is_loopback)
1706 self.assertEqual(True, ipaddress.ip_address('::1').is_loopback)
1707 self.assertEqual(False, ipaddress.ip_address('::2').is_loopback)
1708
1709 self.assertEqual(True, ipaddress.ip_address('0::0').is_unspecified)
1710 self.assertEqual(False, ipaddress.ip_address('::1').is_unspecified)
1711
1712 # some generic IETF reserved addresses
1713 self.assertEqual(True, ipaddress.ip_address('100::').is_reserved)
1714 self.assertEqual(True, ipaddress.ip_network('4000::1/128').is_reserved)
1715
1716 def testIpv4Mapped(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001717 self.assertEqual(
1718 ipaddress.ip_address('::ffff:192.168.1.1').ipv4_mapped,
1719 ipaddress.ip_address('192.168.1.1'))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001720 self.assertEqual(ipaddress.ip_address('::c0a8:101').ipv4_mapped, None)
1721 self.assertEqual(ipaddress.ip_address('::ffff:c0a8:101').ipv4_mapped,
1722 ipaddress.ip_address('192.168.1.1'))
1723
1724 def testAddrExclude(self):
1725 addr1 = ipaddress.ip_network('10.1.1.0/24')
1726 addr2 = ipaddress.ip_network('10.1.1.0/26')
1727 addr3 = ipaddress.ip_network('10.2.1.0/24')
1728 addr4 = ipaddress.ip_address('10.1.1.0')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001729 addr5 = ipaddress.ip_network('2001:db8::0/32')
Serhiy Storchakabb0dbd52016-03-01 10:25:45 +02001730 addr6 = ipaddress.ip_network('10.1.1.5/32')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001731 self.assertEqual(sorted(list(addr1.address_exclude(addr2))),
1732 [ipaddress.ip_network('10.1.1.64/26'),
1733 ipaddress.ip_network('10.1.1.128/25')])
1734 self.assertRaises(ValueError, list, addr1.address_exclude(addr3))
1735 self.assertRaises(TypeError, list, addr1.address_exclude(addr4))
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001736 self.assertRaises(TypeError, list, addr1.address_exclude(addr5))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001737 self.assertEqual(list(addr1.address_exclude(addr1)), [])
Serhiy Storchakabb0dbd52016-03-01 10:25:45 +02001738 self.assertEqual(sorted(list(addr1.address_exclude(addr6))),
1739 [ipaddress.ip_network('10.1.1.0/30'),
1740 ipaddress.ip_network('10.1.1.4/32'),
1741 ipaddress.ip_network('10.1.1.6/31'),
1742 ipaddress.ip_network('10.1.1.8/29'),
1743 ipaddress.ip_network('10.1.1.16/28'),
1744 ipaddress.ip_network('10.1.1.32/27'),
1745 ipaddress.ip_network('10.1.1.64/26'),
1746 ipaddress.ip_network('10.1.1.128/25')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001747
1748 def testHash(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001749 self.assertEqual(hash(ipaddress.ip_interface('10.1.1.0/24')),
1750 hash(ipaddress.ip_interface('10.1.1.0/24')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001751 self.assertEqual(hash(ipaddress.ip_network('10.1.1.0/24')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001752 hash(ipaddress.ip_network('10.1.1.0/24')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001753 self.assertEqual(hash(ipaddress.ip_address('10.1.1.0')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001754 hash(ipaddress.ip_address('10.1.1.0')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001755 # i70
1756 self.assertEqual(hash(ipaddress.ip_address('1.2.3.4')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001757 hash(ipaddress.ip_address(
Nick Coghlandc9b2552012-05-20 21:01:57 +10001758 int(ipaddress.ip_address('1.2.3.4')._ip))))
1759 ip1 = ipaddress.ip_address('10.1.1.0')
1760 ip2 = ipaddress.ip_address('1::')
1761 dummy = {}
1762 dummy[self.ipv4_address] = None
1763 dummy[self.ipv6_address] = None
1764 dummy[ip1] = None
1765 dummy[ip2] = None
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001766 self.assertIn(self.ipv4_address, dummy)
1767 self.assertIn(ip2, dummy)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001768
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001769 def testIPBases(self):
1770 net = self.ipv4_network
1771 self.assertEqual('1.2.3.0/24', net.compressed)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001772 net = self.ipv6_network
1773 self.assertRaises(ValueError, net._string_from_ip_int, 2**128 + 1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001774
Hynek Schlawack454a74d2012-06-04 18:14:02 +02001775 def testIPv6NetworkHelpers(self):
1776 net = self.ipv6_network
1777 self.assertEqual('2001:658:22a:cafe::/64', net.with_prefixlen)
1778 self.assertEqual('2001:658:22a:cafe::/ffff:ffff:ffff:ffff::',
1779 net.with_netmask)
1780 self.assertEqual('2001:658:22a:cafe::/::ffff:ffff:ffff:ffff',
1781 net.with_hostmask)
1782 self.assertEqual('2001:658:22a:cafe::/64', str(net))
1783
1784 def testIPv4NetworkHelpers(self):
1785 net = self.ipv4_network
1786 self.assertEqual('1.2.3.0/24', net.with_prefixlen)
1787 self.assertEqual('1.2.3.0/255.255.255.0', net.with_netmask)
1788 self.assertEqual('1.2.3.0/0.0.0.255', net.with_hostmask)
1789 self.assertEqual('1.2.3.0/24', str(net))
1790
Nick Coghlandc9b2552012-05-20 21:01:57 +10001791 def testCopyConstructor(self):
1792 addr1 = ipaddress.ip_network('10.1.1.0/24')
1793 addr2 = ipaddress.ip_network(addr1)
1794 addr3 = ipaddress.ip_interface('2001:658:22a:cafe:200::1/64')
1795 addr4 = ipaddress.ip_interface(addr3)
1796 addr5 = ipaddress.IPv4Address('1.1.1.1')
1797 addr6 = ipaddress.IPv6Address('2001:658:22a:cafe:200::1')
1798
1799 self.assertEqual(addr1, addr2)
1800 self.assertEqual(addr3, addr4)
1801 self.assertEqual(addr5, ipaddress.IPv4Address(addr5))
1802 self.assertEqual(addr6, ipaddress.IPv6Address(addr6))
1803
1804 def testCompressIPv6Address(self):
1805 test_addresses = {
1806 '1:2:3:4:5:6:7:8': '1:2:3:4:5:6:7:8/128',
1807 '2001:0:0:4:0:0:0:8': '2001:0:0:4::8/128',
1808 '2001:0:0:4:5:6:7:8': '2001::4:5:6:7:8/128',
1809 '2001:0:3:4:5:6:7:8': '2001:0:3:4:5:6:7:8/128',
Nick Coghlandc9b2552012-05-20 21:01:57 +10001810 '0:0:3:0:0:0:0:ffff': '0:0:3::ffff/128',
1811 '0:0:0:4:0:0:0:ffff': '::4:0:0:0:ffff/128',
1812 '0:0:0:0:5:0:0:ffff': '::5:0:0:ffff/128',
1813 '1:0:0:4:0:0:7:8': '1::4:0:0:7:8/128',
1814 '0:0:0:0:0:0:0:0': '::/128',
1815 '0:0:0:0:0:0:0:0/0': '::/0',
1816 '0:0:0:0:0:0:0:1': '::1/128',
1817 '2001:0658:022a:cafe:0000:0000:0000:0000/66':
1818 '2001:658:22a:cafe::/66',
1819 '::1.2.3.4': '::102:304/128',
1820 '1:2:3:4:5:ffff:1.2.3.4': '1:2:3:4:5:ffff:102:304/128',
1821 '::7:6:5:4:3:2:1': '0:7:6:5:4:3:2:1/128',
1822 '::7:6:5:4:3:2:0': '0:7:6:5:4:3:2:0/128',
1823 '7:6:5:4:3:2:1::': '7:6:5:4:3:2:1:0/128',
1824 '0:6:5:4:3:2:1::': '0:6:5:4:3:2:1:0/128',
1825 }
1826 for uncompressed, compressed in list(test_addresses.items()):
1827 self.assertEqual(compressed, str(ipaddress.IPv6Interface(
1828 uncompressed)))
1829
1830 def testExplodeShortHandIpStr(self):
1831 addr1 = ipaddress.IPv6Interface('2001::1')
1832 addr2 = ipaddress.IPv6Address('2001:0:5ef5:79fd:0:59d:a0e5:ba1')
1833 addr3 = ipaddress.IPv6Network('2001::/96')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001834 addr4 = ipaddress.IPv4Address('192.168.178.1')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001835 self.assertEqual('2001:0000:0000:0000:0000:0000:0000:0001/128',
1836 addr1.exploded)
1837 self.assertEqual('0000:0000:0000:0000:0000:0000:0000:0001/128',
1838 ipaddress.IPv6Interface('::1/128').exploded)
1839 # issue 77
1840 self.assertEqual('2001:0000:5ef5:79fd:0000:059d:a0e5:0ba1',
1841 addr2.exploded)
1842 self.assertEqual('2001:0000:0000:0000:0000:0000:0000:0000/96',
1843 addr3.exploded)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001844 self.assertEqual('192.168.178.1', addr4.exploded)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001845
Eric V. Smithebdaaf42014-04-14 12:58:07 -04001846 def testReversePointer(self):
1847 addr1 = ipaddress.IPv4Address('127.0.0.1')
1848 addr2 = ipaddress.IPv6Address('2001:db8::1')
1849 self.assertEqual('1.0.0.127.in-addr.arpa', addr1.reverse_pointer)
1850 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.' +
1851 'b.d.0.1.0.0.2.ip6.arpa',
1852 addr2.reverse_pointer)
1853
Nick Coghlandc9b2552012-05-20 21:01:57 +10001854 def testIntRepresentation(self):
1855 self.assertEqual(16909060, int(self.ipv4_address))
1856 self.assertEqual(42540616829182469433547762482097946625,
1857 int(self.ipv6_address))
1858
Nick Coghlandc9b2552012-05-20 21:01:57 +10001859 def testForceVersion(self):
1860 self.assertEqual(ipaddress.ip_network(1).version, 4)
Nick Coghlan51c30672012-05-27 00:25:58 +10001861 self.assertEqual(ipaddress.IPv6Network(1).version, 6)
Sandro Tosi876ecad2012-05-23 22:26:55 +02001862
Nick Coghlandc9b2552012-05-20 21:01:57 +10001863 def testWithStar(self):
Nick Coghlana8517ad2012-08-20 10:04:26 +10001864 self.assertEqual(self.ipv4_interface.with_prefixlen, "1.2.3.4/24")
1865 self.assertEqual(self.ipv4_interface.with_netmask,
Nick Coghlandc9b2552012-05-20 21:01:57 +10001866 "1.2.3.4/255.255.255.0")
Nick Coghlana8517ad2012-08-20 10:04:26 +10001867 self.assertEqual(self.ipv4_interface.with_hostmask,
Nick Coghlandc9b2552012-05-20 21:01:57 +10001868 "1.2.3.4/0.0.0.255")
1869
Nick Coghlana8517ad2012-08-20 10:04:26 +10001870 self.assertEqual(self.ipv6_interface.with_prefixlen,
Nick Coghlandc9b2552012-05-20 21:01:57 +10001871 '2001:658:22a:cafe:200::1/64')
Nick Coghlana8517ad2012-08-20 10:04:26 +10001872 self.assertEqual(self.ipv6_interface.with_netmask,
1873 '2001:658:22a:cafe:200::1/ffff:ffff:ffff:ffff::')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001874 # this probably don't make much sense, but it's included for
1875 # compatibility with ipv4
Nick Coghlana8517ad2012-08-20 10:04:26 +10001876 self.assertEqual(self.ipv6_interface.with_hostmask,
Nick Coghlandc9b2552012-05-20 21:01:57 +10001877 '2001:658:22a:cafe:200::1/::ffff:ffff:ffff:ffff')
1878
1879 def testNetworkElementCaching(self):
1880 # V4 - make sure we're empty
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001881 self.assertNotIn('network_address', self.ipv4_network._cache)
1882 self.assertNotIn('broadcast_address', self.ipv4_network._cache)
1883 self.assertNotIn('hostmask', self.ipv4_network._cache)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001884
1885 # V4 - populate and test
1886 self.assertEqual(self.ipv4_network.network_address,
1887 ipaddress.IPv4Address('1.2.3.0'))
1888 self.assertEqual(self.ipv4_network.broadcast_address,
1889 ipaddress.IPv4Address('1.2.3.255'))
1890 self.assertEqual(self.ipv4_network.hostmask,
1891 ipaddress.IPv4Address('0.0.0.255'))
1892
1893 # V4 - check we're cached
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001894 self.assertIn('broadcast_address', self.ipv4_network._cache)
1895 self.assertIn('hostmask', self.ipv4_network._cache)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001896
1897 # V6 - make sure we're empty
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001898 self.assertNotIn('broadcast_address', self.ipv6_network._cache)
1899 self.assertNotIn('hostmask', self.ipv6_network._cache)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001900
1901 # V6 - populate and test
1902 self.assertEqual(self.ipv6_network.network_address,
1903 ipaddress.IPv6Address('2001:658:22a:cafe::'))
1904 self.assertEqual(self.ipv6_interface.network.network_address,
1905 ipaddress.IPv6Address('2001:658:22a:cafe::'))
1906
1907 self.assertEqual(
1908 self.ipv6_network.broadcast_address,
1909 ipaddress.IPv6Address('2001:658:22a:cafe:ffff:ffff:ffff:ffff'))
1910 self.assertEqual(self.ipv6_network.hostmask,
1911 ipaddress.IPv6Address('::ffff:ffff:ffff:ffff'))
1912 self.assertEqual(
1913 self.ipv6_interface.network.broadcast_address,
1914 ipaddress.IPv6Address('2001:658:22a:cafe:ffff:ffff:ffff:ffff'))
1915 self.assertEqual(self.ipv6_interface.network.hostmask,
1916 ipaddress.IPv6Address('::ffff:ffff:ffff:ffff'))
1917
1918 # V6 - check we're cached
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001919 self.assertIn('broadcast_address', self.ipv6_network._cache)
1920 self.assertIn('hostmask', self.ipv6_network._cache)
1921 self.assertIn('broadcast_address', self.ipv6_interface.network._cache)
1922 self.assertIn('hostmask', self.ipv6_interface.network._cache)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001923
1924 def testTeredo(self):
1925 # stolen from wikipedia
1926 server = ipaddress.IPv4Address('65.54.227.120')
1927 client = ipaddress.IPv4Address('192.0.2.45')
1928 teredo_addr = '2001:0000:4136:e378:8000:63bf:3fff:fdd2'
1929 self.assertEqual((server, client),
1930 ipaddress.ip_address(teredo_addr).teredo)
1931 bad_addr = '2000::4136:e378:8000:63bf:3fff:fdd2'
1932 self.assertFalse(ipaddress.ip_address(bad_addr).teredo)
1933 bad_addr = '2001:0001:4136:e378:8000:63bf:3fff:fdd2'
1934 self.assertFalse(ipaddress.ip_address(bad_addr).teredo)
1935
1936 # i77
1937 teredo_addr = ipaddress.IPv6Address('2001:0:5ef5:79fd:0:59d:a0e5:ba1')
1938 self.assertEqual((ipaddress.IPv4Address('94.245.121.253'),
1939 ipaddress.IPv4Address('95.26.244.94')),
1940 teredo_addr.teredo)
1941
Nick Coghlandc9b2552012-05-20 21:01:57 +10001942 def testsixtofour(self):
1943 sixtofouraddr = ipaddress.ip_address('2002:ac1d:2d64::1')
1944 bad_addr = ipaddress.ip_address('2000:ac1d:2d64::1')
1945 self.assertEqual(ipaddress.IPv4Address('172.29.45.100'),
1946 sixtofouraddr.sixtofour)
1947 self.assertFalse(bad_addr.sixtofour)
1948
Nick Coghlandc9b2552012-05-20 21:01:57 +10001949
1950if __name__ == '__main__':
1951 unittest.main()