blob: 5d9633024f7064e67579107fba716b3278c373bd [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):
Serhiy Storchaka5f1a5182016-09-11 14:41:02 +0300122 addr = b'\0' * 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):
Serhiy Storchaka5f1a5182016-09-11 14:41:02 +0300142 addr = b'\0'*12 + bytes.fromhex("00000000")
Nick Coghlan07c4e332012-07-08 23:06:45 +1000143 self.assertInstancesEqual(addr, "::")
Serhiy Storchaka5f1a5182016-09-11 14:41:02 +0300144 addr = b'\0'*12 + bytes.fromhex("c0a80001")
Nick Coghlan07c4e332012-07-08 23:06:45 +1000145 self.assertInstancesEqual(addr, "::c0a8:1")
Serhiy Storchaka5f1a5182016-09-11 14:41:02 +0300146 addr = bytes.fromhex("c0a80001") + b'\0'*12
Nick Coghlan07c4e332012-07-08 23:06:45 +1000147 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):
Serhiy Storchaka5f1a5182016-09-11 14:41:02 +0300161 addr = b'\0' * 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
Martin Panter204bf0b2016-07-11 07:51:37 +0000737 # issue #16531: constructing IPv4Network from an (address, mask) tuple
Antoine Pitrou5fb195f2014-05-12 20:36:46 +0200738 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
Martin Panter204bf0b2016-07-11 07:51:37 +0000800 # issue #16531: constructing IPv6Network from an (address, mask) tuple
Antoine Pitrou5fb195f2014-05-12 20:36:46 +0200801 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')
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07001266 # check that addresses are subsumed properly.
Nick Coghlandc9b2552012-05-20 21:01:57 +10001267 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')
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07001280 # check that addresses are subsumed properly.
Nick Coghlandc9b2552012-05-20 21:01:57 +10001281 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')
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07001294 # check that addresses are subsumed properly.
Nick Coghlandc9b2552012-05-20 21:01:57 +10001295 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):
s-sanjay7bd8d3e2017-03-31 23:09:53 -07001408 self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') ==
1409 ipaddress.ip_interface('1.1.1.1/24'))
1410 self.assertTrue(ipaddress.ip_interface('1.1.1.1/16') <
1411 ipaddress.ip_interface('1.1.1.1/24'))
1412 self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') <
1413 ipaddress.ip_interface('1.1.1.2/24'))
1414 self.assertTrue(ipaddress.ip_interface('1.1.1.2/16') <
1415 ipaddress.ip_interface('1.1.1.1/24'))
1416 self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') >
1417 ipaddress.ip_interface('1.1.1.1/16'))
1418 self.assertTrue(ipaddress.ip_interface('1.1.1.2/24') >
1419 ipaddress.ip_interface('1.1.1.1/24'))
1420 self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') >
1421 ipaddress.ip_interface('1.1.1.2/16'))
1422
1423 self.assertTrue(ipaddress.ip_interface('::1/64') ==
1424 ipaddress.ip_interface('::1/64'))
1425 self.assertTrue(ipaddress.ip_interface('::1/64') <
1426 ipaddress.ip_interface('::1/80'))
1427 self.assertTrue(ipaddress.ip_interface('::1/64') <
1428 ipaddress.ip_interface('::2/64'))
1429 self.assertTrue(ipaddress.ip_interface('::2/48') <
1430 ipaddress.ip_interface('::1/64'))
1431 self.assertTrue(ipaddress.ip_interface('::1/80') >
1432 ipaddress.ip_interface('::1/64'))
1433 self.assertTrue(ipaddress.ip_interface('::2/64') >
1434 ipaddress.ip_interface('::1/64'))
1435 self.assertTrue(ipaddress.ip_interface('::1/64') >
1436 ipaddress.ip_interface('::2/48'))
Nick Coghlan3008ec02012-07-08 00:45:33 +10001437
Nick Coghlandc9b2552012-05-20 21:01:57 +10001438 def testNetworkComparison(self):
1439 # ip1 and ip2 have the same network address
1440 ip1 = ipaddress.IPv4Network('1.1.1.0/24')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001441 ip2 = ipaddress.IPv4Network('1.1.1.0/32')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001442 ip3 = ipaddress.IPv4Network('1.1.2.0/24')
1443
1444 self.assertTrue(ip1 < ip3)
1445 self.assertTrue(ip3 > ip2)
1446
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001447 self.assertEqual(ip1.compare_networks(ip1), 0)
1448
1449 # if addresses are the same, sort by netmask
1450 self.assertEqual(ip1.compare_networks(ip2), -1)
1451 self.assertEqual(ip2.compare_networks(ip1), 1)
1452
Nick Coghlandc9b2552012-05-20 21:01:57 +10001453 self.assertEqual(ip1.compare_networks(ip3), -1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001454 self.assertEqual(ip3.compare_networks(ip1), 1)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001455 self.assertTrue(ip1._get_networks_key() < ip3._get_networks_key())
1456
1457 ip1 = ipaddress.IPv6Network('2001:2000::/96')
1458 ip2 = ipaddress.IPv6Network('2001:2001::/96')
1459 ip3 = ipaddress.IPv6Network('2001:ffff:2000::/96')
1460
1461 self.assertTrue(ip1 < ip3)
1462 self.assertTrue(ip3 > ip2)
1463 self.assertEqual(ip1.compare_networks(ip3), -1)
1464 self.assertTrue(ip1._get_networks_key() < ip3._get_networks_key())
1465
1466 # Test comparing different protocols.
1467 # Should always raise a TypeError.
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001468 self.assertRaises(TypeError,
1469 self.ipv4_network.compare_networks,
1470 self.ipv6_network)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001471 ipv6 = ipaddress.IPv6Interface('::/0')
1472 ipv4 = ipaddress.IPv4Interface('0.0.0.0/0')
1473 self.assertRaises(TypeError, ipv4.__lt__, ipv6)
1474 self.assertRaises(TypeError, ipv4.__gt__, ipv6)
1475 self.assertRaises(TypeError, ipv6.__lt__, ipv4)
1476 self.assertRaises(TypeError, ipv6.__gt__, ipv4)
1477
1478 # Regression test for issue 19.
1479 ip1 = ipaddress.ip_network('10.1.2.128/25')
1480 self.assertFalse(ip1 < ip1)
1481 self.assertFalse(ip1 > ip1)
1482 ip2 = ipaddress.ip_network('10.1.3.0/24')
1483 self.assertTrue(ip1 < ip2)
1484 self.assertFalse(ip2 < ip1)
1485 self.assertFalse(ip1 > ip2)
1486 self.assertTrue(ip2 > ip1)
1487 ip3 = ipaddress.ip_network('10.1.3.0/25')
1488 self.assertTrue(ip2 < ip3)
1489 self.assertFalse(ip3 < ip2)
1490 self.assertFalse(ip2 > ip3)
1491 self.assertTrue(ip3 > ip2)
1492
1493 # Regression test for issue 28.
1494 ip1 = ipaddress.ip_network('10.10.10.0/31')
1495 ip2 = ipaddress.ip_network('10.10.10.0')
1496 ip3 = ipaddress.ip_network('10.10.10.2/31')
1497 ip4 = ipaddress.ip_network('10.10.10.2')
1498 sorted = [ip1, ip2, ip3, ip4]
1499 unsorted = [ip2, ip4, ip1, ip3]
1500 unsorted.sort()
1501 self.assertEqual(sorted, unsorted)
1502 unsorted = [ip4, ip1, ip3, ip2]
1503 unsorted.sort()
1504 self.assertEqual(sorted, unsorted)
Serhiy Storchakaf186e122015-01-26 10:11:16 +02001505 self.assertIs(ip1.__lt__(ipaddress.ip_address('10.10.10.0')),
1506 NotImplemented)
1507 self.assertIs(ip2.__lt__(ipaddress.ip_address('10.10.10.0')),
1508 NotImplemented)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001509
1510 # <=, >=
1511 self.assertTrue(ipaddress.ip_network('1.1.1.1') <=
1512 ipaddress.ip_network('1.1.1.1'))
1513 self.assertTrue(ipaddress.ip_network('1.1.1.1') <=
1514 ipaddress.ip_network('1.1.1.2'))
1515 self.assertFalse(ipaddress.ip_network('1.1.1.2') <=
1516 ipaddress.ip_network('1.1.1.1'))
1517 self.assertTrue(ipaddress.ip_network('::1') <=
1518 ipaddress.ip_network('::1'))
1519 self.assertTrue(ipaddress.ip_network('::1') <=
1520 ipaddress.ip_network('::2'))
1521 self.assertFalse(ipaddress.ip_network('::2') <=
1522 ipaddress.ip_network('::1'))
1523
1524 def testStrictNetworks(self):
1525 self.assertRaises(ValueError, ipaddress.ip_network, '192.168.1.1/24')
1526 self.assertRaises(ValueError, ipaddress.ip_network, '::1/120')
1527
1528 def testOverlaps(self):
1529 other = ipaddress.IPv4Network('1.2.3.0/30')
1530 other2 = ipaddress.IPv4Network('1.2.2.0/24')
1531 other3 = ipaddress.IPv4Network('1.2.2.64/26')
1532 self.assertTrue(self.ipv4_network.overlaps(other))
1533 self.assertFalse(self.ipv4_network.overlaps(other2))
1534 self.assertTrue(other2.overlaps(other3))
1535
1536 def testEmbeddedIpv4(self):
1537 ipv4_string = '192.168.0.1'
1538 ipv4 = ipaddress.IPv4Interface(ipv4_string)
1539 v4compat_ipv6 = ipaddress.IPv6Interface('::%s' % ipv4_string)
1540 self.assertEqual(int(v4compat_ipv6.ip), int(ipv4.ip))
1541 v4mapped_ipv6 = ipaddress.IPv6Interface('::ffff:%s' % ipv4_string)
1542 self.assertNotEqual(v4mapped_ipv6.ip, ipv4.ip)
1543 self.assertRaises(ipaddress.AddressValueError, ipaddress.IPv6Interface,
1544 '2001:1.1.1.1:1.1.1.1')
1545
1546 # Issue 67: IPv6 with embedded IPv4 address not recognized.
1547 def testIPv6AddressTooLarge(self):
1548 # RFC4291 2.5.5.2
1549 self.assertEqual(ipaddress.ip_address('::FFFF:192.0.2.1'),
1550 ipaddress.ip_address('::FFFF:c000:201'))
1551 # RFC4291 2.2 (part 3) x::d.d.d.d
1552 self.assertEqual(ipaddress.ip_address('FFFF::192.0.2.1'),
1553 ipaddress.ip_address('FFFF::c000:201'))
1554
1555 def testIPVersion(self):
1556 self.assertEqual(self.ipv4_address.version, 4)
1557 self.assertEqual(self.ipv6_address.version, 6)
1558
1559 def testMaxPrefixLength(self):
1560 self.assertEqual(self.ipv4_interface.max_prefixlen, 32)
1561 self.assertEqual(self.ipv6_interface.max_prefixlen, 128)
1562
1563 def testPacked(self):
1564 self.assertEqual(self.ipv4_address.packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001565 b'\x01\x02\x03\x04')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001566 self.assertEqual(ipaddress.IPv4Interface('255.254.253.252').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001567 b'\xff\xfe\xfd\xfc')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001568 self.assertEqual(self.ipv6_address.packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001569 b'\x20\x01\x06\x58\x02\x2a\xca\xfe'
1570 b'\x02\x00\x00\x00\x00\x00\x00\x01')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001571 self.assertEqual(ipaddress.IPv6Interface('ffff:2:3:4:ffff::').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001572 b'\xff\xff\x00\x02\x00\x03\x00\x04\xff\xff'
1573 + b'\x00' * 6)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001574 self.assertEqual(ipaddress.IPv6Interface('::1:0:0:0:0').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001575 b'\x00' * 6 + b'\x00\x01' + b'\x00' * 8)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001576
Nick Coghlandc9b2552012-05-20 21:01:57 +10001577 def testIpType(self):
1578 ipv4net = ipaddress.ip_network('1.2.3.4')
1579 ipv4addr = ipaddress.ip_address('1.2.3.4')
1580 ipv6net = ipaddress.ip_network('::1.2.3.4')
1581 ipv6addr = ipaddress.ip_address('::1.2.3.4')
1582 self.assertEqual(ipaddress.IPv4Network, type(ipv4net))
1583 self.assertEqual(ipaddress.IPv4Address, type(ipv4addr))
1584 self.assertEqual(ipaddress.IPv6Network, type(ipv6net))
1585 self.assertEqual(ipaddress.IPv6Address, type(ipv6addr))
1586
1587 def testReservedIpv4(self):
1588 # test networks
1589 self.assertEqual(True, ipaddress.ip_interface(
1590 '224.1.1.1/31').is_multicast)
1591 self.assertEqual(False, ipaddress.ip_network('240.0.0.0').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001592 self.assertEqual(True, ipaddress.ip_network('240.0.0.0').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001593
1594 self.assertEqual(True, ipaddress.ip_interface(
1595 '192.168.1.1/17').is_private)
1596 self.assertEqual(False, ipaddress.ip_network('192.169.0.0').is_private)
1597 self.assertEqual(True, ipaddress.ip_network(
1598 '10.255.255.255').is_private)
1599 self.assertEqual(False, ipaddress.ip_network('11.0.0.0').is_private)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001600 self.assertEqual(False, ipaddress.ip_network('11.0.0.0').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001601 self.assertEqual(True, ipaddress.ip_network(
1602 '172.31.255.255').is_private)
1603 self.assertEqual(False, ipaddress.ip_network('172.32.0.0').is_private)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001604 self.assertEqual(True,
1605 ipaddress.ip_network('169.254.1.0/24').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001606
1607 self.assertEqual(True,
1608 ipaddress.ip_interface(
1609 '169.254.100.200/24').is_link_local)
1610 self.assertEqual(False,
1611 ipaddress.ip_interface(
1612 '169.255.100.200/24').is_link_local)
1613
1614 self.assertEqual(True,
1615 ipaddress.ip_network(
1616 '127.100.200.254/32').is_loopback)
1617 self.assertEqual(True, ipaddress.ip_network(
1618 '127.42.0.0/16').is_loopback)
1619 self.assertEqual(False, ipaddress.ip_network('128.0.0.0').is_loopback)
Peter Moodye5019d52013-10-24 09:47:10 -07001620 self.assertEqual(False,
1621 ipaddress.ip_network('100.64.0.0/10').is_private)
Peter Moodybe9c1b12013-10-22 12:36:21 -07001622 self.assertEqual(False, ipaddress.ip_network('100.64.0.0/10').is_global)
Peter Moodye5019d52013-10-24 09:47:10 -07001623
Peter Moody22c31762013-10-21 13:58:06 -07001624 self.assertEqual(True,
1625 ipaddress.ip_network('192.0.2.128/25').is_private)
1626 self.assertEqual(True,
1627 ipaddress.ip_network('192.0.3.0/24').is_global)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001628
1629 # test addresses
Hynek Schlawackbcd30442012-06-04 14:19:39 +02001630 self.assertEqual(True, ipaddress.ip_address('0.0.0.0').is_unspecified)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001631 self.assertEqual(True, ipaddress.ip_address('224.1.1.1').is_multicast)
1632 self.assertEqual(False, ipaddress.ip_address('240.0.0.0').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001633 self.assertEqual(True, ipaddress.ip_address('240.0.0.1').is_reserved)
1634 self.assertEqual(False,
1635 ipaddress.ip_address('239.255.255.255').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001636
1637 self.assertEqual(True, ipaddress.ip_address('192.168.1.1').is_private)
1638 self.assertEqual(False, ipaddress.ip_address('192.169.0.0').is_private)
1639 self.assertEqual(True, ipaddress.ip_address(
1640 '10.255.255.255').is_private)
1641 self.assertEqual(False, ipaddress.ip_address('11.0.0.0').is_private)
1642 self.assertEqual(True, ipaddress.ip_address(
1643 '172.31.255.255').is_private)
1644 self.assertEqual(False, ipaddress.ip_address('172.32.0.0').is_private)
1645
1646 self.assertEqual(True,
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001647 ipaddress.ip_address('169.254.100.200').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001648 self.assertEqual(False,
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001649 ipaddress.ip_address('169.255.100.200').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001650
Berker Peksag742192a2016-06-11 22:11:47 +03001651 self.assertTrue(ipaddress.ip_address('192.0.7.1').is_global)
1652 self.assertFalse(ipaddress.ip_address('203.0.113.1').is_global)
1653
Nick Coghlandc9b2552012-05-20 21:01:57 +10001654 self.assertEqual(True,
1655 ipaddress.ip_address('127.100.200.254').is_loopback)
1656 self.assertEqual(True, ipaddress.ip_address('127.42.0.0').is_loopback)
1657 self.assertEqual(False, ipaddress.ip_address('128.0.0.0').is_loopback)
1658 self.assertEqual(True, ipaddress.ip_network('0.0.0.0').is_unspecified)
1659
1660 def testReservedIpv6(self):
1661
1662 self.assertEqual(True, ipaddress.ip_network('ffff::').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001663 self.assertEqual(True, ipaddress.ip_network(2**128 - 1).is_multicast)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001664 self.assertEqual(True, ipaddress.ip_network('ff00::').is_multicast)
1665 self.assertEqual(False, ipaddress.ip_network('fdff::').is_multicast)
1666
1667 self.assertEqual(True, ipaddress.ip_network('fecf::').is_site_local)
1668 self.assertEqual(True, ipaddress.ip_network(
1669 'feff:ffff:ffff:ffff::').is_site_local)
1670 self.assertEqual(False, ipaddress.ip_network(
1671 'fbf:ffff::').is_site_local)
1672 self.assertEqual(False, ipaddress.ip_network('ff00::').is_site_local)
1673
1674 self.assertEqual(True, ipaddress.ip_network('fc00::').is_private)
1675 self.assertEqual(True, ipaddress.ip_network(
1676 'fc00:ffff:ffff:ffff::').is_private)
1677 self.assertEqual(False, ipaddress.ip_network('fbff:ffff::').is_private)
1678 self.assertEqual(False, ipaddress.ip_network('fe00::').is_private)
1679
1680 self.assertEqual(True, ipaddress.ip_network('fea0::').is_link_local)
1681 self.assertEqual(True, ipaddress.ip_network(
1682 'febf:ffff::').is_link_local)
1683 self.assertEqual(False, ipaddress.ip_network(
1684 'fe7f:ffff::').is_link_local)
1685 self.assertEqual(False, ipaddress.ip_network('fec0::').is_link_local)
1686
1687 self.assertEqual(True, ipaddress.ip_interface('0:0::0:01').is_loopback)
1688 self.assertEqual(False, ipaddress.ip_interface('::1/127').is_loopback)
1689 self.assertEqual(False, ipaddress.ip_network('::').is_loopback)
1690 self.assertEqual(False, ipaddress.ip_network('::2').is_loopback)
1691
1692 self.assertEqual(True, ipaddress.ip_network('0::0').is_unspecified)
1693 self.assertEqual(False, ipaddress.ip_network('::1').is_unspecified)
1694 self.assertEqual(False, ipaddress.ip_network('::/127').is_unspecified)
1695
Peter Moody22c31762013-10-21 13:58:06 -07001696 self.assertEqual(True,
1697 ipaddress.ip_network('2001::1/128').is_private)
1698 self.assertEqual(True,
1699 ipaddress.ip_network('200::1/128').is_global)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001700 # test addresses
1701 self.assertEqual(True, ipaddress.ip_address('ffff::').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001702 self.assertEqual(True, ipaddress.ip_address(2**128 - 1).is_multicast)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001703 self.assertEqual(True, ipaddress.ip_address('ff00::').is_multicast)
1704 self.assertEqual(False, ipaddress.ip_address('fdff::').is_multicast)
1705
1706 self.assertEqual(True, ipaddress.ip_address('fecf::').is_site_local)
1707 self.assertEqual(True, ipaddress.ip_address(
1708 'feff:ffff:ffff:ffff::').is_site_local)
1709 self.assertEqual(False, ipaddress.ip_address(
1710 'fbf:ffff::').is_site_local)
1711 self.assertEqual(False, ipaddress.ip_address('ff00::').is_site_local)
1712
1713 self.assertEqual(True, ipaddress.ip_address('fc00::').is_private)
1714 self.assertEqual(True, ipaddress.ip_address(
1715 'fc00:ffff:ffff:ffff::').is_private)
1716 self.assertEqual(False, ipaddress.ip_address('fbff:ffff::').is_private)
1717 self.assertEqual(False, ipaddress.ip_address('fe00::').is_private)
1718
1719 self.assertEqual(True, ipaddress.ip_address('fea0::').is_link_local)
1720 self.assertEqual(True, ipaddress.ip_address(
1721 'febf:ffff::').is_link_local)
1722 self.assertEqual(False, ipaddress.ip_address(
1723 'fe7f:ffff::').is_link_local)
1724 self.assertEqual(False, ipaddress.ip_address('fec0::').is_link_local)
1725
1726 self.assertEqual(True, ipaddress.ip_address('0:0::0:01').is_loopback)
1727 self.assertEqual(True, ipaddress.ip_address('::1').is_loopback)
1728 self.assertEqual(False, ipaddress.ip_address('::2').is_loopback)
1729
1730 self.assertEqual(True, ipaddress.ip_address('0::0').is_unspecified)
1731 self.assertEqual(False, ipaddress.ip_address('::1').is_unspecified)
1732
1733 # some generic IETF reserved addresses
1734 self.assertEqual(True, ipaddress.ip_address('100::').is_reserved)
1735 self.assertEqual(True, ipaddress.ip_network('4000::1/128').is_reserved)
1736
1737 def testIpv4Mapped(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001738 self.assertEqual(
1739 ipaddress.ip_address('::ffff:192.168.1.1').ipv4_mapped,
1740 ipaddress.ip_address('192.168.1.1'))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001741 self.assertEqual(ipaddress.ip_address('::c0a8:101').ipv4_mapped, None)
1742 self.assertEqual(ipaddress.ip_address('::ffff:c0a8:101').ipv4_mapped,
1743 ipaddress.ip_address('192.168.1.1'))
1744
1745 def testAddrExclude(self):
1746 addr1 = ipaddress.ip_network('10.1.1.0/24')
1747 addr2 = ipaddress.ip_network('10.1.1.0/26')
1748 addr3 = ipaddress.ip_network('10.2.1.0/24')
1749 addr4 = ipaddress.ip_address('10.1.1.0')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001750 addr5 = ipaddress.ip_network('2001:db8::0/32')
Serhiy Storchakabb0dbd52016-03-01 10:25:45 +02001751 addr6 = ipaddress.ip_network('10.1.1.5/32')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001752 self.assertEqual(sorted(list(addr1.address_exclude(addr2))),
1753 [ipaddress.ip_network('10.1.1.64/26'),
1754 ipaddress.ip_network('10.1.1.128/25')])
1755 self.assertRaises(ValueError, list, addr1.address_exclude(addr3))
1756 self.assertRaises(TypeError, list, addr1.address_exclude(addr4))
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001757 self.assertRaises(TypeError, list, addr1.address_exclude(addr5))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001758 self.assertEqual(list(addr1.address_exclude(addr1)), [])
Serhiy Storchakabb0dbd52016-03-01 10:25:45 +02001759 self.assertEqual(sorted(list(addr1.address_exclude(addr6))),
1760 [ipaddress.ip_network('10.1.1.0/30'),
1761 ipaddress.ip_network('10.1.1.4/32'),
1762 ipaddress.ip_network('10.1.1.6/31'),
1763 ipaddress.ip_network('10.1.1.8/29'),
1764 ipaddress.ip_network('10.1.1.16/28'),
1765 ipaddress.ip_network('10.1.1.32/27'),
1766 ipaddress.ip_network('10.1.1.64/26'),
1767 ipaddress.ip_network('10.1.1.128/25')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001768
1769 def testHash(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001770 self.assertEqual(hash(ipaddress.ip_interface('10.1.1.0/24')),
1771 hash(ipaddress.ip_interface('10.1.1.0/24')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001772 self.assertEqual(hash(ipaddress.ip_network('10.1.1.0/24')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001773 hash(ipaddress.ip_network('10.1.1.0/24')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001774 self.assertEqual(hash(ipaddress.ip_address('10.1.1.0')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001775 hash(ipaddress.ip_address('10.1.1.0')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001776 # i70
1777 self.assertEqual(hash(ipaddress.ip_address('1.2.3.4')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001778 hash(ipaddress.ip_address(
Nick Coghlandc9b2552012-05-20 21:01:57 +10001779 int(ipaddress.ip_address('1.2.3.4')._ip))))
1780 ip1 = ipaddress.ip_address('10.1.1.0')
1781 ip2 = ipaddress.ip_address('1::')
1782 dummy = {}
1783 dummy[self.ipv4_address] = None
1784 dummy[self.ipv6_address] = None
1785 dummy[ip1] = None
1786 dummy[ip2] = None
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001787 self.assertIn(self.ipv4_address, dummy)
1788 self.assertIn(ip2, dummy)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001789
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001790 def testIPBases(self):
1791 net = self.ipv4_network
1792 self.assertEqual('1.2.3.0/24', net.compressed)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001793 net = self.ipv6_network
1794 self.assertRaises(ValueError, net._string_from_ip_int, 2**128 + 1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001795
Hynek Schlawack454a74d2012-06-04 18:14:02 +02001796 def testIPv6NetworkHelpers(self):
1797 net = self.ipv6_network
1798 self.assertEqual('2001:658:22a:cafe::/64', net.with_prefixlen)
1799 self.assertEqual('2001:658:22a:cafe::/ffff:ffff:ffff:ffff::',
1800 net.with_netmask)
1801 self.assertEqual('2001:658:22a:cafe::/::ffff:ffff:ffff:ffff',
1802 net.with_hostmask)
1803 self.assertEqual('2001:658:22a:cafe::/64', str(net))
1804
1805 def testIPv4NetworkHelpers(self):
1806 net = self.ipv4_network
1807 self.assertEqual('1.2.3.0/24', net.with_prefixlen)
1808 self.assertEqual('1.2.3.0/255.255.255.0', net.with_netmask)
1809 self.assertEqual('1.2.3.0/0.0.0.255', net.with_hostmask)
1810 self.assertEqual('1.2.3.0/24', str(net))
1811
Nick Coghlandc9b2552012-05-20 21:01:57 +10001812 def testCopyConstructor(self):
1813 addr1 = ipaddress.ip_network('10.1.1.0/24')
1814 addr2 = ipaddress.ip_network(addr1)
1815 addr3 = ipaddress.ip_interface('2001:658:22a:cafe:200::1/64')
1816 addr4 = ipaddress.ip_interface(addr3)
1817 addr5 = ipaddress.IPv4Address('1.1.1.1')
1818 addr6 = ipaddress.IPv6Address('2001:658:22a:cafe:200::1')
1819
1820 self.assertEqual(addr1, addr2)
1821 self.assertEqual(addr3, addr4)
1822 self.assertEqual(addr5, ipaddress.IPv4Address(addr5))
1823 self.assertEqual(addr6, ipaddress.IPv6Address(addr6))
1824
1825 def testCompressIPv6Address(self):
1826 test_addresses = {
1827 '1:2:3:4:5:6:7:8': '1:2:3:4:5:6:7:8/128',
1828 '2001:0:0:4:0:0:0:8': '2001:0:0:4::8/128',
1829 '2001:0:0:4:5:6:7:8': '2001::4:5:6:7:8/128',
1830 '2001:0:3:4:5:6:7:8': '2001:0:3:4:5:6:7:8/128',
Nick Coghlandc9b2552012-05-20 21:01:57 +10001831 '0:0:3:0:0:0:0:ffff': '0:0:3::ffff/128',
1832 '0:0:0:4:0:0:0:ffff': '::4:0:0:0:ffff/128',
1833 '0:0:0:0:5:0:0:ffff': '::5:0:0:ffff/128',
1834 '1:0:0:4:0:0:7:8': '1::4:0:0:7:8/128',
1835 '0:0:0:0:0:0:0:0': '::/128',
1836 '0:0:0:0:0:0:0:0/0': '::/0',
1837 '0:0:0:0:0:0:0:1': '::1/128',
1838 '2001:0658:022a:cafe:0000:0000:0000:0000/66':
1839 '2001:658:22a:cafe::/66',
1840 '::1.2.3.4': '::102:304/128',
1841 '1:2:3:4:5:ffff:1.2.3.4': '1:2:3:4:5:ffff:102:304/128',
1842 '::7:6:5:4:3:2:1': '0:7:6:5:4:3:2:1/128',
1843 '::7:6:5:4:3:2:0': '0:7:6:5:4:3:2:0/128',
1844 '7:6:5:4:3:2:1::': '7:6:5:4:3:2:1:0/128',
1845 '0:6:5:4:3:2:1::': '0:6:5:4:3:2:1:0/128',
1846 }
1847 for uncompressed, compressed in list(test_addresses.items()):
1848 self.assertEqual(compressed, str(ipaddress.IPv6Interface(
1849 uncompressed)))
1850
1851 def testExplodeShortHandIpStr(self):
1852 addr1 = ipaddress.IPv6Interface('2001::1')
1853 addr2 = ipaddress.IPv6Address('2001:0:5ef5:79fd:0:59d:a0e5:ba1')
1854 addr3 = ipaddress.IPv6Network('2001::/96')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001855 addr4 = ipaddress.IPv4Address('192.168.178.1')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001856 self.assertEqual('2001:0000:0000:0000:0000:0000:0000:0001/128',
1857 addr1.exploded)
1858 self.assertEqual('0000:0000:0000:0000:0000:0000:0000:0001/128',
1859 ipaddress.IPv6Interface('::1/128').exploded)
1860 # issue 77
1861 self.assertEqual('2001:0000:5ef5:79fd:0000:059d:a0e5:0ba1',
1862 addr2.exploded)
1863 self.assertEqual('2001:0000:0000:0000:0000:0000:0000:0000/96',
1864 addr3.exploded)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001865 self.assertEqual('192.168.178.1', addr4.exploded)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001866
Eric V. Smithebdaaf42014-04-14 12:58:07 -04001867 def testReversePointer(self):
1868 addr1 = ipaddress.IPv4Address('127.0.0.1')
1869 addr2 = ipaddress.IPv6Address('2001:db8::1')
1870 self.assertEqual('1.0.0.127.in-addr.arpa', addr1.reverse_pointer)
1871 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.' +
1872 'b.d.0.1.0.0.2.ip6.arpa',
1873 addr2.reverse_pointer)
1874
Nick Coghlandc9b2552012-05-20 21:01:57 +10001875 def testIntRepresentation(self):
1876 self.assertEqual(16909060, int(self.ipv4_address))
1877 self.assertEqual(42540616829182469433547762482097946625,
1878 int(self.ipv6_address))
1879
Nick Coghlandc9b2552012-05-20 21:01:57 +10001880 def testForceVersion(self):
1881 self.assertEqual(ipaddress.ip_network(1).version, 4)
Nick Coghlan51c30672012-05-27 00:25:58 +10001882 self.assertEqual(ipaddress.IPv6Network(1).version, 6)
Sandro Tosi876ecad2012-05-23 22:26:55 +02001883
Nick Coghlandc9b2552012-05-20 21:01:57 +10001884 def testWithStar(self):
Nick Coghlana8517ad2012-08-20 10:04:26 +10001885 self.assertEqual(self.ipv4_interface.with_prefixlen, "1.2.3.4/24")
1886 self.assertEqual(self.ipv4_interface.with_netmask,
Nick Coghlandc9b2552012-05-20 21:01:57 +10001887 "1.2.3.4/255.255.255.0")
Nick Coghlana8517ad2012-08-20 10:04:26 +10001888 self.assertEqual(self.ipv4_interface.with_hostmask,
Nick Coghlandc9b2552012-05-20 21:01:57 +10001889 "1.2.3.4/0.0.0.255")
1890
Nick Coghlana8517ad2012-08-20 10:04:26 +10001891 self.assertEqual(self.ipv6_interface.with_prefixlen,
Nick Coghlandc9b2552012-05-20 21:01:57 +10001892 '2001:658:22a:cafe:200::1/64')
Nick Coghlana8517ad2012-08-20 10:04:26 +10001893 self.assertEqual(self.ipv6_interface.with_netmask,
1894 '2001:658:22a:cafe:200::1/ffff:ffff:ffff:ffff::')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001895 # this probably don't make much sense, but it's included for
1896 # compatibility with ipv4
Nick Coghlana8517ad2012-08-20 10:04:26 +10001897 self.assertEqual(self.ipv6_interface.with_hostmask,
Nick Coghlandc9b2552012-05-20 21:01:57 +10001898 '2001:658:22a:cafe:200::1/::ffff:ffff:ffff:ffff')
1899
1900 def testNetworkElementCaching(self):
1901 # V4 - make sure we're empty
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001902 self.assertNotIn('network_address', self.ipv4_network._cache)
1903 self.assertNotIn('broadcast_address', self.ipv4_network._cache)
1904 self.assertNotIn('hostmask', self.ipv4_network._cache)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001905
1906 # V4 - populate and test
1907 self.assertEqual(self.ipv4_network.network_address,
1908 ipaddress.IPv4Address('1.2.3.0'))
1909 self.assertEqual(self.ipv4_network.broadcast_address,
1910 ipaddress.IPv4Address('1.2.3.255'))
1911 self.assertEqual(self.ipv4_network.hostmask,
1912 ipaddress.IPv4Address('0.0.0.255'))
1913
1914 # V4 - check we're cached
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001915 self.assertIn('broadcast_address', self.ipv4_network._cache)
1916 self.assertIn('hostmask', self.ipv4_network._cache)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001917
1918 # V6 - make sure we're empty
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001919 self.assertNotIn('broadcast_address', self.ipv6_network._cache)
1920 self.assertNotIn('hostmask', self.ipv6_network._cache)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001921
1922 # V6 - populate and test
1923 self.assertEqual(self.ipv6_network.network_address,
1924 ipaddress.IPv6Address('2001:658:22a:cafe::'))
1925 self.assertEqual(self.ipv6_interface.network.network_address,
1926 ipaddress.IPv6Address('2001:658:22a:cafe::'))
1927
1928 self.assertEqual(
1929 self.ipv6_network.broadcast_address,
1930 ipaddress.IPv6Address('2001:658:22a:cafe:ffff:ffff:ffff:ffff'))
1931 self.assertEqual(self.ipv6_network.hostmask,
1932 ipaddress.IPv6Address('::ffff:ffff:ffff:ffff'))
1933 self.assertEqual(
1934 self.ipv6_interface.network.broadcast_address,
1935 ipaddress.IPv6Address('2001:658:22a:cafe:ffff:ffff:ffff:ffff'))
1936 self.assertEqual(self.ipv6_interface.network.hostmask,
1937 ipaddress.IPv6Address('::ffff:ffff:ffff:ffff'))
1938
1939 # V6 - check we're cached
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001940 self.assertIn('broadcast_address', self.ipv6_network._cache)
1941 self.assertIn('hostmask', self.ipv6_network._cache)
1942 self.assertIn('broadcast_address', self.ipv6_interface.network._cache)
1943 self.assertIn('hostmask', self.ipv6_interface.network._cache)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001944
1945 def testTeredo(self):
1946 # stolen from wikipedia
1947 server = ipaddress.IPv4Address('65.54.227.120')
1948 client = ipaddress.IPv4Address('192.0.2.45')
1949 teredo_addr = '2001:0000:4136:e378:8000:63bf:3fff:fdd2'
1950 self.assertEqual((server, client),
1951 ipaddress.ip_address(teredo_addr).teredo)
1952 bad_addr = '2000::4136:e378:8000:63bf:3fff:fdd2'
1953 self.assertFalse(ipaddress.ip_address(bad_addr).teredo)
1954 bad_addr = '2001:0001:4136:e378:8000:63bf:3fff:fdd2'
1955 self.assertFalse(ipaddress.ip_address(bad_addr).teredo)
1956
1957 # i77
1958 teredo_addr = ipaddress.IPv6Address('2001:0:5ef5:79fd:0:59d:a0e5:ba1')
1959 self.assertEqual((ipaddress.IPv4Address('94.245.121.253'),
1960 ipaddress.IPv4Address('95.26.244.94')),
1961 teredo_addr.teredo)
1962
Nick Coghlandc9b2552012-05-20 21:01:57 +10001963 def testsixtofour(self):
1964 sixtofouraddr = ipaddress.ip_address('2002:ac1d:2d64::1')
1965 bad_addr = ipaddress.ip_address('2000:ac1d:2d64::1')
1966 self.assertEqual(ipaddress.IPv4Address('172.29.45.100'),
1967 sixtofouraddr.sixtofour)
1968 self.assertFalse(bad_addr.sixtofour)
1969
Nick Coghlandc9b2552012-05-20 21:01:57 +10001970
1971if __name__ == '__main__':
1972 unittest.main()