blob: 643d742e4ccce0e5e02aec45201dcd0f9fd2911b [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]
590 objects = v4_objects + v6_objects
591
592 def test_foreign_type_equality(self):
593 # __eq__ should never raise TypeError directly
594 other = object()
595 for obj in self.objects:
596 self.assertNotEqual(obj, other)
597 self.assertFalse(obj == other)
598 self.assertEqual(obj.__eq__(other), NotImplemented)
599 self.assertEqual(obj.__ne__(other), NotImplemented)
600
601 def test_mixed_type_equality(self):
602 # Ensure none of the internal objects accidentally
603 # expose the right set of attributes to become "equal"
604 for lhs in self.objects:
605 for rhs in self.objects:
606 if lhs is rhs:
607 continue
608 self.assertNotEqual(lhs, rhs)
609
610 def test_containment(self):
611 for obj in self.v4_addresses:
612 self.assertIn(obj, self.v4net)
613 for obj in self.v6_addresses:
614 self.assertIn(obj, self.v6net)
615 for obj in self.v4_objects + [self.v6net]:
616 self.assertNotIn(obj, self.v6net)
617 for obj in self.v6_objects + [self.v4net]:
618 self.assertNotIn(obj, self.v4net)
619
620 def test_mixed_type_ordering(self):
621 for lhs in self.objects:
622 for rhs in self.objects:
623 if isinstance(lhs, type(rhs)) or isinstance(rhs, type(lhs)):
624 continue
625 self.assertRaises(TypeError, lambda: lhs < rhs)
626 self.assertRaises(TypeError, lambda: lhs > rhs)
627 self.assertRaises(TypeError, lambda: lhs <= rhs)
628 self.assertRaises(TypeError, lambda: lhs >= rhs)
629
Serhiy Storchakaf186e122015-01-26 10:11:16 +0200630 def test_foreign_type_ordering(self):
631 other = object()
632 smallest = SmallestObject()
633 largest = LargestObject()
634 for obj in self.objects:
635 with self.assertRaises(TypeError):
636 obj < other
637 with self.assertRaises(TypeError):
638 obj > other
639 with self.assertRaises(TypeError):
640 obj <= other
641 with self.assertRaises(TypeError):
642 obj >= other
643 self.assertTrue(obj < largest)
644 self.assertFalse(obj > largest)
645 self.assertTrue(obj <= largest)
646 self.assertFalse(obj >= largest)
647 self.assertFalse(obj < smallest)
648 self.assertTrue(obj > smallest)
649 self.assertFalse(obj <= smallest)
650 self.assertTrue(obj >= smallest)
651
Nick Coghlan3008ec02012-07-08 00:45:33 +1000652 def test_mixed_type_key(self):
653 # with get_mixed_type_key, you can sort addresses and network.
654 v4_ordered = [self.v4addr, self.v4net, self.v4intf]
655 v6_ordered = [self.v6addr, self.v6net, self.v6intf]
656 self.assertEqual(v4_ordered,
657 sorted(self.v4_objects,
658 key=ipaddress.get_mixed_type_key))
659 self.assertEqual(v6_ordered,
660 sorted(self.v6_objects,
661 key=ipaddress.get_mixed_type_key))
662 self.assertEqual(v4_ordered + v6_ordered,
663 sorted(self.objects,
664 key=ipaddress.get_mixed_type_key))
665 self.assertEqual(NotImplemented, ipaddress.get_mixed_type_key(object))
666
667 def test_incompatible_versions(self):
668 # These should always raise TypeError
669 v4addr = ipaddress.ip_address('1.1.1.1')
670 v4net = ipaddress.ip_network('1.1.1.1')
671 v6addr = ipaddress.ip_address('::1')
Serhiy Storchakaf186e122015-01-26 10:11:16 +0200672 v6net = ipaddress.ip_network('::1')
Nick Coghlan3008ec02012-07-08 00:45:33 +1000673
674 self.assertRaises(TypeError, v4addr.__lt__, v6addr)
675 self.assertRaises(TypeError, v4addr.__gt__, v6addr)
676 self.assertRaises(TypeError, v4net.__lt__, v6net)
677 self.assertRaises(TypeError, v4net.__gt__, v6net)
678
679 self.assertRaises(TypeError, v6addr.__lt__, v4addr)
680 self.assertRaises(TypeError, v6addr.__gt__, v4addr)
681 self.assertRaises(TypeError, v6net.__lt__, v4net)
682 self.assertRaises(TypeError, v6net.__gt__, v4net)
683
684
Nick Coghlandc9b2552012-05-20 21:01:57 +1000685class IpaddrUnitTest(unittest.TestCase):
686
687 def setUp(self):
688 self.ipv4_address = ipaddress.IPv4Address('1.2.3.4')
689 self.ipv4_interface = ipaddress.IPv4Interface('1.2.3.4/24')
690 self.ipv4_network = ipaddress.IPv4Network('1.2.3.0/24')
691 #self.ipv4_hostmask = ipaddress.IPv4Interface('10.0.0.1/0.255.255.255')
692 self.ipv6_address = ipaddress.IPv6Interface(
693 '2001:658:22a:cafe:200:0:0:1')
694 self.ipv6_interface = ipaddress.IPv6Interface(
695 '2001:658:22a:cafe:200:0:0:1/64')
696 self.ipv6_network = ipaddress.IPv6Network('2001:658:22a:cafe::/64')
697
698 def testRepr(self):
699 self.assertEqual("IPv4Interface('1.2.3.4/32')",
700 repr(ipaddress.IPv4Interface('1.2.3.4')))
701 self.assertEqual("IPv6Interface('::1/128')",
702 repr(ipaddress.IPv6Interface('::1')))
703
Antoine Pitrou5fb195f2014-05-12 20:36:46 +0200704 # issue #16531: constructing IPv4Network from a (address, mask) tuple
705 def testIPv4Tuple(self):
706 # /32
707 ip = ipaddress.IPv4Address('192.0.2.1')
708 net = ipaddress.IPv4Network('192.0.2.1/32')
709 self.assertEqual(ipaddress.IPv4Network(('192.0.2.1', 32)), net)
710 self.assertEqual(ipaddress.IPv4Network((ip, 32)), net)
711 self.assertEqual(ipaddress.IPv4Network((3221225985, 32)), net)
712 self.assertEqual(ipaddress.IPv4Network(('192.0.2.1',
713 '255.255.255.255')), net)
714 self.assertEqual(ipaddress.IPv4Network((ip,
715 '255.255.255.255')), net)
716 self.assertEqual(ipaddress.IPv4Network((3221225985,
717 '255.255.255.255')), net)
718 # strict=True and host bits set
719 with self.assertRaises(ValueError):
720 ipaddress.IPv4Network(('192.0.2.1', 24))
721 with self.assertRaises(ValueError):
722 ipaddress.IPv4Network((ip, 24))
723 with self.assertRaises(ValueError):
724 ipaddress.IPv4Network((3221225985, 24))
725 with self.assertRaises(ValueError):
726 ipaddress.IPv4Network(('192.0.2.1', '255.255.255.0'))
727 with self.assertRaises(ValueError):
728 ipaddress.IPv4Network((ip, '255.255.255.0'))
729 with self.assertRaises(ValueError):
730 ipaddress.IPv4Network((3221225985, '255.255.255.0'))
731 # strict=False and host bits set
732 net = ipaddress.IPv4Network('192.0.2.0/24')
733 self.assertEqual(ipaddress.IPv4Network(('192.0.2.1', 24),
734 strict=False), net)
735 self.assertEqual(ipaddress.IPv4Network((ip, 24),
736 strict=False), net)
737 self.assertEqual(ipaddress.IPv4Network((3221225985, 24),
738 strict=False), net)
739 self.assertEqual(ipaddress.IPv4Network(('192.0.2.1',
740 '255.255.255.0'),
741 strict=False), net)
742 self.assertEqual(ipaddress.IPv4Network((ip,
743 '255.255.255.0'),
744 strict=False), net)
745 self.assertEqual(ipaddress.IPv4Network((3221225985,
746 '255.255.255.0'),
747 strict=False), net)
748
749 # /24
750 ip = ipaddress.IPv4Address('192.0.2.0')
751 net = ipaddress.IPv4Network('192.0.2.0/24')
752 self.assertEqual(ipaddress.IPv4Network(('192.0.2.0',
753 '255.255.255.0')), net)
754 self.assertEqual(ipaddress.IPv4Network((ip,
755 '255.255.255.0')), net)
756 self.assertEqual(ipaddress.IPv4Network((3221225984,
757 '255.255.255.0')), net)
758 self.assertEqual(ipaddress.IPv4Network(('192.0.2.0', 24)), net)
759 self.assertEqual(ipaddress.IPv4Network((ip, 24)), net)
760 self.assertEqual(ipaddress.IPv4Network((3221225984, 24)), net)
761
762 self.assertEqual(ipaddress.IPv4Interface(('192.0.2.1', 24)),
763 ipaddress.IPv4Interface('192.0.2.1/24'))
764 self.assertEqual(ipaddress.IPv4Interface((3221225985, 24)),
765 ipaddress.IPv4Interface('192.0.2.1/24'))
766
767 # issue #16531: constructing IPv6Network from a (address, mask) tuple
768 def testIPv6Tuple(self):
769 # /128
770 ip = ipaddress.IPv6Address('2001:db8::')
771 net = ipaddress.IPv6Network('2001:db8::/128')
772 self.assertEqual(ipaddress.IPv6Network(('2001:db8::', '128')),
773 net)
774 self.assertEqual(ipaddress.IPv6Network(
775 (42540766411282592856903984951653826560, 128)),
776 net)
777 self.assertEqual(ipaddress.IPv6Network((ip, '128')),
778 net)
779 ip = ipaddress.IPv6Address('2001:db8::')
780 net = ipaddress.IPv6Network('2001:db8::/96')
781 self.assertEqual(ipaddress.IPv6Network(('2001:db8::', '96')),
782 net)
783 self.assertEqual(ipaddress.IPv6Network(
784 (42540766411282592856903984951653826560, 96)),
785 net)
786 self.assertEqual(ipaddress.IPv6Network((ip, '96')),
787 net)
788
789 # strict=True and host bits set
790 ip = ipaddress.IPv6Address('2001:db8::1')
791 with self.assertRaises(ValueError):
792 ipaddress.IPv6Network(('2001:db8::1', 96))
793 with self.assertRaises(ValueError):
794 ipaddress.IPv6Network((
795 42540766411282592856903984951653826561, 96))
796 with self.assertRaises(ValueError):
797 ipaddress.IPv6Network((ip, 96))
798 # strict=False and host bits set
799 net = ipaddress.IPv6Network('2001:db8::/96')
800 self.assertEqual(ipaddress.IPv6Network(('2001:db8::1', 96),
801 strict=False),
802 net)
803 self.assertEqual(ipaddress.IPv6Network(
804 (42540766411282592856903984951653826561, 96),
805 strict=False),
806 net)
807 self.assertEqual(ipaddress.IPv6Network((ip, 96), strict=False),
808 net)
809
810 # /96
811 self.assertEqual(ipaddress.IPv6Interface(('2001:db8::1', '96')),
812 ipaddress.IPv6Interface('2001:db8::1/96'))
813 self.assertEqual(ipaddress.IPv6Interface(
814 (42540766411282592856903984951653826561, '96')),
815 ipaddress.IPv6Interface('2001:db8::1/96'))
816
Nick Coghlandc9b2552012-05-20 21:01:57 +1000817 # issue57
818 def testAddressIntMath(self):
819 self.assertEqual(ipaddress.IPv4Address('1.1.1.1') + 255,
820 ipaddress.IPv4Address('1.1.2.0'))
821 self.assertEqual(ipaddress.IPv4Address('1.1.1.1') - 256,
822 ipaddress.IPv4Address('1.1.0.1'))
823 self.assertEqual(ipaddress.IPv6Address('::1') + (2**16 - 2),
824 ipaddress.IPv6Address('::ffff'))
825 self.assertEqual(ipaddress.IPv6Address('::ffff') - (2**16 - 2),
826 ipaddress.IPv6Address('::1'))
827
Nick Coghlan3c2570c2012-07-07 01:13:55 +1000828 def testInvalidIntToBytes(self):
829 self.assertRaises(ValueError, ipaddress.v4_int_to_packed, -1)
830 self.assertRaises(ValueError, ipaddress.v4_int_to_packed,
831 2 ** ipaddress.IPV4LENGTH)
832 self.assertRaises(ValueError, ipaddress.v6_int_to_packed, -1)
833 self.assertRaises(ValueError, ipaddress.v6_int_to_packed,
834 2 ** ipaddress.IPV6LENGTH)
835
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200836 def testInternals(self):
Serhiy Storchakab53f0fb2015-01-19 00:41:32 +0200837 ip1 = ipaddress.IPv4Address('10.10.10.10')
838 ip2 = ipaddress.IPv4Address('10.10.10.11')
839 ip3 = ipaddress.IPv4Address('10.10.10.12')
840 self.assertEqual(list(ipaddress._find_address_range([ip1])),
841 [(ip1, ip1)])
842 self.assertEqual(list(ipaddress._find_address_range([ip1, ip3])),
843 [(ip1, ip1), (ip3, ip3)])
844 self.assertEqual(list(ipaddress._find_address_range([ip1, ip2, ip3])),
845 [(ip1, ip3)])
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200846 self.assertEqual(128, ipaddress._count_righthand_zero_bits(0, 128))
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200847 self.assertEqual("IPv4Network('1.2.3.0/24')", repr(self.ipv4_network))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000848
Nick Coghland9722652012-06-17 16:33:00 +1000849 def testMissingNetworkVersion(self):
850 class Broken(ipaddress._BaseNetwork):
851 pass
852 broken = Broken('127.0.0.1')
853 with self.assertRaisesRegex(NotImplementedError, "Broken.*version"):
854 broken.version
855
856 def testMissingAddressClass(self):
857 class Broken(ipaddress._BaseNetwork):
858 pass
859 broken = Broken('127.0.0.1')
860 with self.assertRaisesRegex(NotImplementedError, "Broken.*address"):
861 broken._address_class
862
Nick Coghlandc9b2552012-05-20 21:01:57 +1000863 def testGetNetwork(self):
864 self.assertEqual(int(self.ipv4_network.network_address), 16909056)
865 self.assertEqual(str(self.ipv4_network.network_address), '1.2.3.0')
866
867 self.assertEqual(int(self.ipv6_network.network_address),
868 42540616829182469433403647294022090752)
869 self.assertEqual(str(self.ipv6_network.network_address),
870 '2001:658:22a:cafe::')
871 self.assertEqual(str(self.ipv6_network.hostmask),
872 '::ffff:ffff:ffff:ffff')
873
Nick Coghlandc9b2552012-05-20 21:01:57 +1000874 def testIpFromInt(self):
875 self.assertEqual(self.ipv4_interface._ip,
876 ipaddress.IPv4Interface(16909060)._ip)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000877
878 ipv4 = ipaddress.ip_network('1.2.3.4')
879 ipv6 = ipaddress.ip_network('2001:658:22a:cafe:200:0:0:1')
Nick Coghlan730f67f2012-08-05 22:02:18 +1000880 self.assertEqual(ipv4, ipaddress.ip_network(int(ipv4.network_address)))
881 self.assertEqual(ipv6, ipaddress.ip_network(int(ipv6.network_address)))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000882
883 v6_int = 42540616829182469433547762482097946625
884 self.assertEqual(self.ipv6_interface._ip,
885 ipaddress.IPv6Interface(v6_int)._ip)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000886
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200887 self.assertEqual(ipaddress.ip_network(self.ipv4_address._ip).version,
888 4)
889 self.assertEqual(ipaddress.ip_network(self.ipv6_address._ip).version,
890 6)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000891
892 def testIpFromPacked(self):
Nick Coghlan5cf896f2012-07-07 01:43:31 +1000893 address = ipaddress.ip_address
Nick Coghlandc9b2552012-05-20 21:01:57 +1000894 self.assertEqual(self.ipv4_interface._ip,
Nick Coghlan5cf896f2012-07-07 01:43:31 +1000895 ipaddress.ip_interface(b'\x01\x02\x03\x04')._ip)
896 self.assertEqual(address('255.254.253.252'),
897 address(b'\xff\xfe\xfd\xfc'))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000898 self.assertEqual(self.ipv6_interface.ip,
899 ipaddress.ip_interface(
Nick Coghlan5cf896f2012-07-07 01:43:31 +1000900 b'\x20\x01\x06\x58\x02\x2a\xca\xfe'
901 b'\x02\x00\x00\x00\x00\x00\x00\x01').ip)
902 self.assertEqual(address('ffff:2:3:4:ffff::'),
903 address(b'\xff\xff\x00\x02\x00\x03\x00\x04' +
904 b'\xff\xff' + b'\x00' * 6))
905 self.assertEqual(address('::'),
906 address(b'\x00' * 16))
907
Nick Coghlandc9b2552012-05-20 21:01:57 +1000908 def testGetIp(self):
909 self.assertEqual(int(self.ipv4_interface.ip), 16909060)
910 self.assertEqual(str(self.ipv4_interface.ip), '1.2.3.4')
911
912 self.assertEqual(int(self.ipv6_interface.ip),
913 42540616829182469433547762482097946625)
914 self.assertEqual(str(self.ipv6_interface.ip),
915 '2001:658:22a:cafe:200::1')
916
917 def testGetNetmask(self):
918 self.assertEqual(int(self.ipv4_network.netmask), 4294967040)
919 self.assertEqual(str(self.ipv4_network.netmask), '255.255.255.0')
920 self.assertEqual(int(self.ipv6_network.netmask),
921 340282366920938463444927863358058659840)
922 self.assertEqual(self.ipv6_network.prefixlen, 64)
923
924 def testZeroNetmask(self):
925 ipv4_zero_netmask = ipaddress.IPv4Interface('1.2.3.4/0')
926 self.assertEqual(int(ipv4_zero_netmask.network.netmask), 0)
Nick Coghlan932346f2014-02-08 23:17:36 +1000927 self.assertEqual(ipv4_zero_netmask._prefix_from_prefix_string('0'), 0)
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200928 self.assertTrue(ipv4_zero_netmask._is_valid_netmask('0'))
929 self.assertTrue(ipv4_zero_netmask._is_valid_netmask('0.0.0.0'))
930 self.assertFalse(ipv4_zero_netmask._is_valid_netmask('invalid'))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000931
932 ipv6_zero_netmask = ipaddress.IPv6Interface('::1/0')
933 self.assertEqual(int(ipv6_zero_netmask.network.netmask), 0)
Nick Coghlan932346f2014-02-08 23:17:36 +1000934 self.assertEqual(ipv6_zero_netmask._prefix_from_prefix_string('0'), 0)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000935
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200936 def testIPv4NetAndHostmasks(self):
937 net = self.ipv4_network
938 self.assertFalse(net._is_valid_netmask('invalid'))
939 self.assertTrue(net._is_valid_netmask('128.128.128.128'))
940 self.assertFalse(net._is_valid_netmask('128.128.128.127'))
941 self.assertFalse(net._is_valid_netmask('128.128.128.255'))
942 self.assertTrue(net._is_valid_netmask('255.128.128.128'))
943
944 self.assertFalse(net._is_hostmask('invalid'))
945 self.assertTrue(net._is_hostmask('128.255.255.255'))
946 self.assertFalse(net._is_hostmask('255.255.255.255'))
947 self.assertFalse(net._is_hostmask('1.2.3.4'))
948
949 net = ipaddress.IPv4Network('127.0.0.0/0.0.0.255')
Nick Coghlan932346f2014-02-08 23:17:36 +1000950 self.assertEqual(net.prefixlen, 24)
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200951
Nick Coghlandc9b2552012-05-20 21:01:57 +1000952 def testGetBroadcast(self):
953 self.assertEqual(int(self.ipv4_network.broadcast_address), 16909311)
954 self.assertEqual(str(self.ipv4_network.broadcast_address), '1.2.3.255')
955
956 self.assertEqual(int(self.ipv6_network.broadcast_address),
957 42540616829182469451850391367731642367)
958 self.assertEqual(str(self.ipv6_network.broadcast_address),
959 '2001:658:22a:cafe:ffff:ffff:ffff:ffff')
960
961 def testGetPrefixlen(self):
Nick Coghlane3ded952012-08-05 22:45:22 +1000962 self.assertEqual(self.ipv4_interface.network.prefixlen, 24)
963 self.assertEqual(self.ipv6_interface.network.prefixlen, 64)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000964
965 def testGetSupernet(self):
966 self.assertEqual(self.ipv4_network.supernet().prefixlen, 23)
967 self.assertEqual(str(self.ipv4_network.supernet().network_address),
968 '1.2.2.0')
969 self.assertEqual(
970 ipaddress.IPv4Interface('0.0.0.0/0').network.supernet(),
971 ipaddress.IPv4Network('0.0.0.0/0'))
972
973 self.assertEqual(self.ipv6_network.supernet().prefixlen, 63)
974 self.assertEqual(str(self.ipv6_network.supernet().network_address),
975 '2001:658:22a:cafe::')
976 self.assertEqual(ipaddress.IPv6Interface('::0/0').network.supernet(),
977 ipaddress.IPv6Network('::0/0'))
978
979 def testGetSupernet3(self):
980 self.assertEqual(self.ipv4_network.supernet(3).prefixlen, 21)
981 self.assertEqual(str(self.ipv4_network.supernet(3).network_address),
982 '1.2.0.0')
983
984 self.assertEqual(self.ipv6_network.supernet(3).prefixlen, 61)
985 self.assertEqual(str(self.ipv6_network.supernet(3).network_address),
986 '2001:658:22a:caf8::')
987
988 def testGetSupernet4(self):
989 self.assertRaises(ValueError, self.ipv4_network.supernet,
990 prefixlen_diff=2, new_prefix=1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200991 self.assertRaises(ValueError, self.ipv4_network.supernet,
992 new_prefix=25)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000993 self.assertEqual(self.ipv4_network.supernet(prefixlen_diff=2),
994 self.ipv4_network.supernet(new_prefix=22))
995
996 self.assertRaises(ValueError, self.ipv6_network.supernet,
997 prefixlen_diff=2, new_prefix=1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200998 self.assertRaises(ValueError, self.ipv6_network.supernet,
999 new_prefix=65)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001000 self.assertEqual(self.ipv6_network.supernet(prefixlen_diff=2),
1001 self.ipv6_network.supernet(new_prefix=62))
1002
1003 def testHosts(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001004 hosts = list(self.ipv4_network.hosts())
1005 self.assertEqual(254, len(hosts))
1006 self.assertEqual(ipaddress.IPv4Address('1.2.3.1'), hosts[0])
1007 self.assertEqual(ipaddress.IPv4Address('1.2.3.254'), hosts[-1])
1008
1009 # special case where only 1 bit is left for address
Nick Coghlandc9b2552012-05-20 21:01:57 +10001010 self.assertEqual([ipaddress.IPv4Address('2.0.0.0'),
1011 ipaddress.IPv4Address('2.0.0.1')],
1012 list(ipaddress.ip_network('2.0.0.0/31').hosts()))
1013
1014 def testFancySubnetting(self):
1015 self.assertEqual(sorted(self.ipv4_network.subnets(prefixlen_diff=3)),
1016 sorted(self.ipv4_network.subnets(new_prefix=27)))
1017 self.assertRaises(ValueError, list,
1018 self.ipv4_network.subnets(new_prefix=23))
1019 self.assertRaises(ValueError, list,
1020 self.ipv4_network.subnets(prefixlen_diff=3,
1021 new_prefix=27))
1022 self.assertEqual(sorted(self.ipv6_network.subnets(prefixlen_diff=4)),
1023 sorted(self.ipv6_network.subnets(new_prefix=68)))
1024 self.assertRaises(ValueError, list,
1025 self.ipv6_network.subnets(new_prefix=63))
1026 self.assertRaises(ValueError, list,
1027 self.ipv6_network.subnets(prefixlen_diff=4,
1028 new_prefix=68))
1029
1030 def testGetSubnets(self):
1031 self.assertEqual(list(self.ipv4_network.subnets())[0].prefixlen, 25)
1032 self.assertEqual(str(list(
1033 self.ipv4_network.subnets())[0].network_address),
1034 '1.2.3.0')
1035 self.assertEqual(str(list(
1036 self.ipv4_network.subnets())[1].network_address),
1037 '1.2.3.128')
1038
1039 self.assertEqual(list(self.ipv6_network.subnets())[0].prefixlen, 65)
1040
1041 def testGetSubnetForSingle32(self):
1042 ip = ipaddress.IPv4Network('1.2.3.4/32')
1043 subnets1 = [str(x) for x in ip.subnets()]
1044 subnets2 = [str(x) for x in ip.subnets(2)]
1045 self.assertEqual(subnets1, ['1.2.3.4/32'])
1046 self.assertEqual(subnets1, subnets2)
1047
1048 def testGetSubnetForSingle128(self):
1049 ip = ipaddress.IPv6Network('::1/128')
1050 subnets1 = [str(x) for x in ip.subnets()]
1051 subnets2 = [str(x) for x in ip.subnets(2)]
1052 self.assertEqual(subnets1, ['::1/128'])
1053 self.assertEqual(subnets1, subnets2)
1054
1055 def testSubnet2(self):
1056 ips = [str(x) for x in self.ipv4_network.subnets(2)]
1057 self.assertEqual(
1058 ips,
1059 ['1.2.3.0/26', '1.2.3.64/26', '1.2.3.128/26', '1.2.3.192/26'])
1060
1061 ipsv6 = [str(x) for x in self.ipv6_network.subnets(2)]
1062 self.assertEqual(
1063 ipsv6,
1064 ['2001:658:22a:cafe::/66',
1065 '2001:658:22a:cafe:4000::/66',
1066 '2001:658:22a:cafe:8000::/66',
1067 '2001:658:22a:cafe:c000::/66'])
1068
Serhiy Storchakabb0dbd52016-03-01 10:25:45 +02001069 def testGetSubnets3(self):
1070 subnets = [str(x) for x in self.ipv4_network.subnets(8)]
1071 self.assertEqual(subnets[:3],
1072 ['1.2.3.0/32', '1.2.3.1/32', '1.2.3.2/32'])
1073 self.assertEqual(subnets[-3:],
1074 ['1.2.3.253/32', '1.2.3.254/32', '1.2.3.255/32'])
1075 self.assertEqual(len(subnets), 256)
1076
1077 ipv6_network = ipaddress.IPv6Network('2001:658:22a:cafe::/120')
1078 subnets = [str(x) for x in ipv6_network.subnets(8)]
1079 self.assertEqual(subnets[:3],
1080 ['2001:658:22a:cafe::/128',
1081 '2001:658:22a:cafe::1/128',
1082 '2001:658:22a:cafe::2/128'])
1083 self.assertEqual(subnets[-3:],
1084 ['2001:658:22a:cafe::fd/128',
1085 '2001:658:22a:cafe::fe/128',
1086 '2001:658:22a:cafe::ff/128'])
1087 self.assertEqual(len(subnets), 256)
1088
Nick Coghlandc9b2552012-05-20 21:01:57 +10001089 def testSubnetFailsForLargeCidrDiff(self):
1090 self.assertRaises(ValueError, list,
1091 self.ipv4_interface.network.subnets(9))
1092 self.assertRaises(ValueError, list,
1093 self.ipv4_network.subnets(9))
1094 self.assertRaises(ValueError, list,
1095 self.ipv6_interface.network.subnets(65))
1096 self.assertRaises(ValueError, list,
1097 self.ipv6_network.subnets(65))
1098
1099 def testSupernetFailsForLargeCidrDiff(self):
1100 self.assertRaises(ValueError,
1101 self.ipv4_interface.network.supernet, 25)
1102 self.assertRaises(ValueError,
1103 self.ipv6_interface.network.supernet, 65)
1104
1105 def testSubnetFailsForNegativeCidrDiff(self):
1106 self.assertRaises(ValueError, list,
1107 self.ipv4_interface.network.subnets(-1))
1108 self.assertRaises(ValueError, list,
Nick Coghlan2c589102012-05-27 01:03:25 +10001109 self.ipv4_network.subnets(-1))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001110 self.assertRaises(ValueError, list,
1111 self.ipv6_interface.network.subnets(-1))
1112 self.assertRaises(ValueError, list,
1113 self.ipv6_network.subnets(-1))
1114
1115 def testGetNum_Addresses(self):
1116 self.assertEqual(self.ipv4_network.num_addresses, 256)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001117 self.assertEqual(list(self.ipv4_network.subnets())[0].num_addresses,
1118 128)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001119 self.assertEqual(self.ipv4_network.supernet().num_addresses, 512)
1120
1121 self.assertEqual(self.ipv6_network.num_addresses, 18446744073709551616)
1122 self.assertEqual(list(self.ipv6_network.subnets())[0].num_addresses,
1123 9223372036854775808)
1124 self.assertEqual(self.ipv6_network.supernet().num_addresses,
1125 36893488147419103232)
1126
1127 def testContains(self):
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001128 self.assertIn(ipaddress.IPv4Interface('1.2.3.128/25'),
1129 self.ipv4_network)
1130 self.assertNotIn(ipaddress.IPv4Interface('1.2.4.1/24'),
Nick Coghlandc9b2552012-05-20 21:01:57 +10001131 self.ipv4_network)
1132 # We can test addresses and string as well.
1133 addr1 = ipaddress.IPv4Address('1.2.3.37')
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001134 self.assertIn(addr1, self.ipv4_network)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001135 # issue 61, bad network comparison on like-ip'd network objects
1136 # with identical broadcast addresses.
1137 self.assertFalse(ipaddress.IPv4Network('1.1.0.0/16').__contains__(
1138 ipaddress.IPv4Network('1.0.0.0/15')))
1139
Nick Coghlandc9b2552012-05-20 21:01:57 +10001140 def testNth(self):
1141 self.assertEqual(str(self.ipv4_network[5]), '1.2.3.5')
1142 self.assertRaises(IndexError, self.ipv4_network.__getitem__, 256)
1143
1144 self.assertEqual(str(self.ipv6_network[5]),
1145 '2001:658:22a:cafe::5')
1146
1147 def testGetitem(self):
1148 # http://code.google.com/p/ipaddr-py/issues/detail?id=15
1149 addr = ipaddress.IPv4Network('172.31.255.128/255.255.255.240')
1150 self.assertEqual(28, addr.prefixlen)
1151 addr_list = list(addr)
1152 self.assertEqual('172.31.255.128', str(addr_list[0]))
1153 self.assertEqual('172.31.255.128', str(addr[0]))
1154 self.assertEqual('172.31.255.143', str(addr_list[-1]))
1155 self.assertEqual('172.31.255.143', str(addr[-1]))
1156 self.assertEqual(addr_list[-1], addr[-1])
1157
1158 def testEqual(self):
1159 self.assertTrue(self.ipv4_interface ==
1160 ipaddress.IPv4Interface('1.2.3.4/24'))
1161 self.assertFalse(self.ipv4_interface ==
1162 ipaddress.IPv4Interface('1.2.3.4/23'))
1163 self.assertFalse(self.ipv4_interface ==
1164 ipaddress.IPv6Interface('::1.2.3.4/24'))
1165 self.assertFalse(self.ipv4_interface == '')
1166 self.assertFalse(self.ipv4_interface == [])
1167 self.assertFalse(self.ipv4_interface == 2)
1168
1169 self.assertTrue(self.ipv6_interface ==
1170 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/64'))
1171 self.assertFalse(self.ipv6_interface ==
1172 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/63'))
1173 self.assertFalse(self.ipv6_interface ==
1174 ipaddress.IPv4Interface('1.2.3.4/23'))
1175 self.assertFalse(self.ipv6_interface == '')
1176 self.assertFalse(self.ipv6_interface == [])
1177 self.assertFalse(self.ipv6_interface == 2)
1178
1179 def testNotEqual(self):
1180 self.assertFalse(self.ipv4_interface !=
1181 ipaddress.IPv4Interface('1.2.3.4/24'))
1182 self.assertTrue(self.ipv4_interface !=
1183 ipaddress.IPv4Interface('1.2.3.4/23'))
1184 self.assertTrue(self.ipv4_interface !=
1185 ipaddress.IPv6Interface('::1.2.3.4/24'))
1186 self.assertTrue(self.ipv4_interface != '')
1187 self.assertTrue(self.ipv4_interface != [])
1188 self.assertTrue(self.ipv4_interface != 2)
1189
1190 self.assertTrue(self.ipv4_address !=
1191 ipaddress.IPv4Address('1.2.3.5'))
1192 self.assertTrue(self.ipv4_address != '')
1193 self.assertTrue(self.ipv4_address != [])
1194 self.assertTrue(self.ipv4_address != 2)
1195
1196 self.assertFalse(self.ipv6_interface !=
1197 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/64'))
1198 self.assertTrue(self.ipv6_interface !=
1199 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/63'))
1200 self.assertTrue(self.ipv6_interface !=
1201 ipaddress.IPv4Interface('1.2.3.4/23'))
1202 self.assertTrue(self.ipv6_interface != '')
1203 self.assertTrue(self.ipv6_interface != [])
1204 self.assertTrue(self.ipv6_interface != 2)
1205
1206 self.assertTrue(self.ipv6_address !=
1207 ipaddress.IPv4Address('1.2.3.4'))
1208 self.assertTrue(self.ipv6_address != '')
1209 self.assertTrue(self.ipv6_address != [])
1210 self.assertTrue(self.ipv6_address != 2)
1211
1212 def testSlash32Constructor(self):
1213 self.assertEqual(str(ipaddress.IPv4Interface(
1214 '1.2.3.4/255.255.255.255')), '1.2.3.4/32')
1215
1216 def testSlash128Constructor(self):
1217 self.assertEqual(str(ipaddress.IPv6Interface('::1/128')),
1218 '::1/128')
1219
1220 def testSlash0Constructor(self):
1221 self.assertEqual(str(ipaddress.IPv4Interface('1.2.3.4/0.0.0.0')),
1222 '1.2.3.4/0')
1223
1224 def testCollapsing(self):
1225 # test only IP addresses including some duplicates
1226 ip1 = ipaddress.IPv4Address('1.1.1.0')
1227 ip2 = ipaddress.IPv4Address('1.1.1.1')
1228 ip3 = ipaddress.IPv4Address('1.1.1.2')
1229 ip4 = ipaddress.IPv4Address('1.1.1.3')
1230 ip5 = ipaddress.IPv4Address('1.1.1.4')
1231 ip6 = ipaddress.IPv4Address('1.1.1.0')
1232 # check that addreses are subsumed properly.
1233 collapsed = ipaddress.collapse_addresses(
1234 [ip1, ip2, ip3, ip4, ip5, ip6])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001235 self.assertEqual(list(collapsed),
1236 [ipaddress.IPv4Network('1.1.1.0/30'),
1237 ipaddress.IPv4Network('1.1.1.4/32')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001238
1239 # test a mix of IP addresses and networks including some duplicates
1240 ip1 = ipaddress.IPv4Address('1.1.1.0')
1241 ip2 = ipaddress.IPv4Address('1.1.1.1')
1242 ip3 = ipaddress.IPv4Address('1.1.1.2')
1243 ip4 = ipaddress.IPv4Address('1.1.1.3')
1244 #ip5 = ipaddress.IPv4Interface('1.1.1.4/30')
1245 #ip6 = ipaddress.IPv4Interface('1.1.1.4/30')
1246 # check that addreses are subsumed properly.
1247 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3, ip4])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001248 self.assertEqual(list(collapsed),
1249 [ipaddress.IPv4Network('1.1.1.0/30')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001250
1251 # test only IP networks
1252 ip1 = ipaddress.IPv4Network('1.1.0.0/24')
1253 ip2 = ipaddress.IPv4Network('1.1.1.0/24')
1254 ip3 = ipaddress.IPv4Network('1.1.2.0/24')
1255 ip4 = ipaddress.IPv4Network('1.1.3.0/24')
1256 ip5 = ipaddress.IPv4Network('1.1.4.0/24')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001257 # stored in no particular order b/c we want CollapseAddr to call
1258 # [].sort
Nick Coghlandc9b2552012-05-20 21:01:57 +10001259 ip6 = ipaddress.IPv4Network('1.1.0.0/22')
1260 # check that addreses are subsumed properly.
1261 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3, ip4, ip5,
1262 ip6])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001263 self.assertEqual(list(collapsed),
1264 [ipaddress.IPv4Network('1.1.0.0/22'),
1265 ipaddress.IPv4Network('1.1.4.0/24')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001266
1267 # test that two addresses are supernet'ed properly
1268 collapsed = ipaddress.collapse_addresses([ip1, ip2])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001269 self.assertEqual(list(collapsed),
1270 [ipaddress.IPv4Network('1.1.0.0/23')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001271
1272 # test same IP networks
1273 ip_same1 = ip_same2 = ipaddress.IPv4Network('1.1.1.1/32')
1274 self.assertEqual(list(ipaddress.collapse_addresses(
1275 [ip_same1, ip_same2])),
1276 [ip_same1])
1277
1278 # test same IP addresses
1279 ip_same1 = ip_same2 = ipaddress.IPv4Address('1.1.1.1')
1280 self.assertEqual(list(ipaddress.collapse_addresses(
1281 [ip_same1, ip_same2])),
1282 [ipaddress.ip_network('1.1.1.1/32')])
1283 ip1 = ipaddress.IPv6Network('2001::/100')
1284 ip2 = ipaddress.IPv6Network('2001::/120')
1285 ip3 = ipaddress.IPv6Network('2001::/96')
1286 # test that ipv6 addresses are subsumed properly.
1287 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3])
1288 self.assertEqual(list(collapsed), [ip3])
1289
1290 # the toejam test
Hynek Schlawack35db5132012-06-01 20:12:17 +02001291 addr_tuples = [
1292 (ipaddress.ip_address('1.1.1.1'),
1293 ipaddress.ip_address('::1')),
1294 (ipaddress.IPv4Network('1.1.0.0/24'),
1295 ipaddress.IPv6Network('2001::/120')),
1296 (ipaddress.IPv4Network('1.1.0.0/32'),
1297 ipaddress.IPv6Network('2001::/128')),
1298 ]
1299 for ip1, ip2 in addr_tuples:
1300 self.assertRaises(TypeError, ipaddress.collapse_addresses,
1301 [ip1, ip2])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001302
1303 def testSummarizing(self):
1304 #ip = ipaddress.ip_address
1305 #ipnet = ipaddress.ip_network
1306 summarize = ipaddress.summarize_address_range
1307 ip1 = ipaddress.ip_address('1.1.1.0')
1308 ip2 = ipaddress.ip_address('1.1.1.255')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001309
1310 # summarize works only for IPv4 & IPv6
1311 class IPv7Address(ipaddress.IPv6Address):
1312 @property
1313 def version(self):
1314 return 7
1315 ip_invalid1 = IPv7Address('::1')
1316 ip_invalid2 = IPv7Address('::1')
1317 self.assertRaises(ValueError, list,
1318 summarize(ip_invalid1, ip_invalid2))
1319 # test that a summary over ip4 & ip6 fails
1320 self.assertRaises(TypeError, list,
1321 summarize(ip1, ipaddress.IPv6Address('::1')))
1322 # test a /24 is summarized properly
Nick Coghlandc9b2552012-05-20 21:01:57 +10001323 self.assertEqual(list(summarize(ip1, ip2))[0],
1324 ipaddress.ip_network('1.1.1.0/24'))
Martin Panter7462b6492015-11-02 03:37:02 +00001325 # test an IPv4 range that isn't on a network byte boundary
Nick Coghlandc9b2552012-05-20 21:01:57 +10001326 ip2 = ipaddress.ip_address('1.1.1.8')
1327 self.assertEqual(list(summarize(ip1, ip2)),
1328 [ipaddress.ip_network('1.1.1.0/29'),
1329 ipaddress.ip_network('1.1.1.8')])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001330 # all!
1331 ip1 = ipaddress.IPv4Address(0)
1332 ip2 = ipaddress.IPv4Address(ipaddress.IPv4Address._ALL_ONES)
1333 self.assertEqual([ipaddress.IPv4Network('0.0.0.0/0')],
1334 list(summarize(ip1, ip2)))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001335
1336 ip1 = ipaddress.ip_address('1::')
1337 ip2 = ipaddress.ip_address('1:ffff:ffff:ffff:ffff:ffff:ffff:ffff')
Martin Panter7462b6492015-11-02 03:37:02 +00001338 # test an IPv6 is summarized properly
Nick Coghlandc9b2552012-05-20 21:01:57 +10001339 self.assertEqual(list(summarize(ip1, ip2))[0],
1340 ipaddress.ip_network('1::/16'))
1341 # test an IPv6 range that isn't on a network byte boundary
1342 ip2 = ipaddress.ip_address('2::')
1343 self.assertEqual(list(summarize(ip1, ip2)),
1344 [ipaddress.ip_network('1::/16'),
1345 ipaddress.ip_network('2::/128')])
1346
1347 # test exception raised when first is greater than last
1348 self.assertRaises(ValueError, list,
1349 summarize(ipaddress.ip_address('1.1.1.0'),
1350 ipaddress.ip_address('1.1.0.0')))
1351 # test exception raised when first and last aren't IP addresses
1352 self.assertRaises(TypeError, list,
1353 summarize(ipaddress.ip_network('1.1.1.0'),
1354 ipaddress.ip_network('1.1.0.0')))
1355 self.assertRaises(TypeError, list,
1356 summarize(ipaddress.ip_network('1.1.1.0'),
1357 ipaddress.ip_network('1.1.0.0')))
1358 # test exception raised when first and last are not same version
1359 self.assertRaises(TypeError, list,
1360 summarize(ipaddress.ip_address('::'),
1361 ipaddress.ip_network('1.1.0.0')))
1362
1363 def testAddressComparison(self):
1364 self.assertTrue(ipaddress.ip_address('1.1.1.1') <=
1365 ipaddress.ip_address('1.1.1.1'))
1366 self.assertTrue(ipaddress.ip_address('1.1.1.1') <=
1367 ipaddress.ip_address('1.1.1.2'))
1368 self.assertTrue(ipaddress.ip_address('::1') <=
1369 ipaddress.ip_address('::1'))
1370 self.assertTrue(ipaddress.ip_address('::1') <=
1371 ipaddress.ip_address('::2'))
1372
Nick Coghlan3008ec02012-07-08 00:45:33 +10001373 def testInterfaceComparison(self):
1374 self.assertTrue(ipaddress.ip_interface('1.1.1.1') <=
1375 ipaddress.ip_interface('1.1.1.1'))
1376 self.assertTrue(ipaddress.ip_interface('1.1.1.1') <=
1377 ipaddress.ip_interface('1.1.1.2'))
1378 self.assertTrue(ipaddress.ip_interface('::1') <=
1379 ipaddress.ip_interface('::1'))
1380 self.assertTrue(ipaddress.ip_interface('::1') <=
1381 ipaddress.ip_interface('::2'))
1382
Nick Coghlandc9b2552012-05-20 21:01:57 +10001383 def testNetworkComparison(self):
1384 # ip1 and ip2 have the same network address
1385 ip1 = ipaddress.IPv4Network('1.1.1.0/24')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001386 ip2 = ipaddress.IPv4Network('1.1.1.0/32')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001387 ip3 = ipaddress.IPv4Network('1.1.2.0/24')
1388
1389 self.assertTrue(ip1 < ip3)
1390 self.assertTrue(ip3 > ip2)
1391
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001392 self.assertEqual(ip1.compare_networks(ip1), 0)
1393
1394 # if addresses are the same, sort by netmask
1395 self.assertEqual(ip1.compare_networks(ip2), -1)
1396 self.assertEqual(ip2.compare_networks(ip1), 1)
1397
Nick Coghlandc9b2552012-05-20 21:01:57 +10001398 self.assertEqual(ip1.compare_networks(ip3), -1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001399 self.assertEqual(ip3.compare_networks(ip1), 1)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001400 self.assertTrue(ip1._get_networks_key() < ip3._get_networks_key())
1401
1402 ip1 = ipaddress.IPv6Network('2001:2000::/96')
1403 ip2 = ipaddress.IPv6Network('2001:2001::/96')
1404 ip3 = ipaddress.IPv6Network('2001:ffff:2000::/96')
1405
1406 self.assertTrue(ip1 < ip3)
1407 self.assertTrue(ip3 > ip2)
1408 self.assertEqual(ip1.compare_networks(ip3), -1)
1409 self.assertTrue(ip1._get_networks_key() < ip3._get_networks_key())
1410
1411 # Test comparing different protocols.
1412 # Should always raise a TypeError.
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001413 self.assertRaises(TypeError,
1414 self.ipv4_network.compare_networks,
1415 self.ipv6_network)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001416 ipv6 = ipaddress.IPv6Interface('::/0')
1417 ipv4 = ipaddress.IPv4Interface('0.0.0.0/0')
1418 self.assertRaises(TypeError, ipv4.__lt__, ipv6)
1419 self.assertRaises(TypeError, ipv4.__gt__, ipv6)
1420 self.assertRaises(TypeError, ipv6.__lt__, ipv4)
1421 self.assertRaises(TypeError, ipv6.__gt__, ipv4)
1422
1423 # Regression test for issue 19.
1424 ip1 = ipaddress.ip_network('10.1.2.128/25')
1425 self.assertFalse(ip1 < ip1)
1426 self.assertFalse(ip1 > ip1)
1427 ip2 = ipaddress.ip_network('10.1.3.0/24')
1428 self.assertTrue(ip1 < ip2)
1429 self.assertFalse(ip2 < ip1)
1430 self.assertFalse(ip1 > ip2)
1431 self.assertTrue(ip2 > ip1)
1432 ip3 = ipaddress.ip_network('10.1.3.0/25')
1433 self.assertTrue(ip2 < ip3)
1434 self.assertFalse(ip3 < ip2)
1435 self.assertFalse(ip2 > ip3)
1436 self.assertTrue(ip3 > ip2)
1437
1438 # Regression test for issue 28.
1439 ip1 = ipaddress.ip_network('10.10.10.0/31')
1440 ip2 = ipaddress.ip_network('10.10.10.0')
1441 ip3 = ipaddress.ip_network('10.10.10.2/31')
1442 ip4 = ipaddress.ip_network('10.10.10.2')
1443 sorted = [ip1, ip2, ip3, ip4]
1444 unsorted = [ip2, ip4, ip1, ip3]
1445 unsorted.sort()
1446 self.assertEqual(sorted, unsorted)
1447 unsorted = [ip4, ip1, ip3, ip2]
1448 unsorted.sort()
1449 self.assertEqual(sorted, unsorted)
Serhiy Storchakaf186e122015-01-26 10:11:16 +02001450 self.assertIs(ip1.__lt__(ipaddress.ip_address('10.10.10.0')),
1451 NotImplemented)
1452 self.assertIs(ip2.__lt__(ipaddress.ip_address('10.10.10.0')),
1453 NotImplemented)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001454
1455 # <=, >=
1456 self.assertTrue(ipaddress.ip_network('1.1.1.1') <=
1457 ipaddress.ip_network('1.1.1.1'))
1458 self.assertTrue(ipaddress.ip_network('1.1.1.1') <=
1459 ipaddress.ip_network('1.1.1.2'))
1460 self.assertFalse(ipaddress.ip_network('1.1.1.2') <=
1461 ipaddress.ip_network('1.1.1.1'))
1462 self.assertTrue(ipaddress.ip_network('::1') <=
1463 ipaddress.ip_network('::1'))
1464 self.assertTrue(ipaddress.ip_network('::1') <=
1465 ipaddress.ip_network('::2'))
1466 self.assertFalse(ipaddress.ip_network('::2') <=
1467 ipaddress.ip_network('::1'))
1468
1469 def testStrictNetworks(self):
1470 self.assertRaises(ValueError, ipaddress.ip_network, '192.168.1.1/24')
1471 self.assertRaises(ValueError, ipaddress.ip_network, '::1/120')
1472
1473 def testOverlaps(self):
1474 other = ipaddress.IPv4Network('1.2.3.0/30')
1475 other2 = ipaddress.IPv4Network('1.2.2.0/24')
1476 other3 = ipaddress.IPv4Network('1.2.2.64/26')
1477 self.assertTrue(self.ipv4_network.overlaps(other))
1478 self.assertFalse(self.ipv4_network.overlaps(other2))
1479 self.assertTrue(other2.overlaps(other3))
1480
1481 def testEmbeddedIpv4(self):
1482 ipv4_string = '192.168.0.1'
1483 ipv4 = ipaddress.IPv4Interface(ipv4_string)
1484 v4compat_ipv6 = ipaddress.IPv6Interface('::%s' % ipv4_string)
1485 self.assertEqual(int(v4compat_ipv6.ip), int(ipv4.ip))
1486 v4mapped_ipv6 = ipaddress.IPv6Interface('::ffff:%s' % ipv4_string)
1487 self.assertNotEqual(v4mapped_ipv6.ip, ipv4.ip)
1488 self.assertRaises(ipaddress.AddressValueError, ipaddress.IPv6Interface,
1489 '2001:1.1.1.1:1.1.1.1')
1490
1491 # Issue 67: IPv6 with embedded IPv4 address not recognized.
1492 def testIPv6AddressTooLarge(self):
1493 # RFC4291 2.5.5.2
1494 self.assertEqual(ipaddress.ip_address('::FFFF:192.0.2.1'),
1495 ipaddress.ip_address('::FFFF:c000:201'))
1496 # RFC4291 2.2 (part 3) x::d.d.d.d
1497 self.assertEqual(ipaddress.ip_address('FFFF::192.0.2.1'),
1498 ipaddress.ip_address('FFFF::c000:201'))
1499
1500 def testIPVersion(self):
1501 self.assertEqual(self.ipv4_address.version, 4)
1502 self.assertEqual(self.ipv6_address.version, 6)
1503
1504 def testMaxPrefixLength(self):
1505 self.assertEqual(self.ipv4_interface.max_prefixlen, 32)
1506 self.assertEqual(self.ipv6_interface.max_prefixlen, 128)
1507
1508 def testPacked(self):
1509 self.assertEqual(self.ipv4_address.packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001510 b'\x01\x02\x03\x04')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001511 self.assertEqual(ipaddress.IPv4Interface('255.254.253.252').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001512 b'\xff\xfe\xfd\xfc')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001513 self.assertEqual(self.ipv6_address.packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001514 b'\x20\x01\x06\x58\x02\x2a\xca\xfe'
1515 b'\x02\x00\x00\x00\x00\x00\x00\x01')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001516 self.assertEqual(ipaddress.IPv6Interface('ffff:2:3:4:ffff::').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001517 b'\xff\xff\x00\x02\x00\x03\x00\x04\xff\xff'
1518 + b'\x00' * 6)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001519 self.assertEqual(ipaddress.IPv6Interface('::1:0:0:0:0').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001520 b'\x00' * 6 + b'\x00\x01' + b'\x00' * 8)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001521
Nick Coghlandc9b2552012-05-20 21:01:57 +10001522 def testIpType(self):
1523 ipv4net = ipaddress.ip_network('1.2.3.4')
1524 ipv4addr = ipaddress.ip_address('1.2.3.4')
1525 ipv6net = ipaddress.ip_network('::1.2.3.4')
1526 ipv6addr = ipaddress.ip_address('::1.2.3.4')
1527 self.assertEqual(ipaddress.IPv4Network, type(ipv4net))
1528 self.assertEqual(ipaddress.IPv4Address, type(ipv4addr))
1529 self.assertEqual(ipaddress.IPv6Network, type(ipv6net))
1530 self.assertEqual(ipaddress.IPv6Address, type(ipv6addr))
1531
1532 def testReservedIpv4(self):
1533 # test networks
1534 self.assertEqual(True, ipaddress.ip_interface(
1535 '224.1.1.1/31').is_multicast)
1536 self.assertEqual(False, ipaddress.ip_network('240.0.0.0').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001537 self.assertEqual(True, ipaddress.ip_network('240.0.0.0').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001538
1539 self.assertEqual(True, ipaddress.ip_interface(
1540 '192.168.1.1/17').is_private)
1541 self.assertEqual(False, ipaddress.ip_network('192.169.0.0').is_private)
1542 self.assertEqual(True, ipaddress.ip_network(
1543 '10.255.255.255').is_private)
1544 self.assertEqual(False, ipaddress.ip_network('11.0.0.0').is_private)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001545 self.assertEqual(False, ipaddress.ip_network('11.0.0.0').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001546 self.assertEqual(True, ipaddress.ip_network(
1547 '172.31.255.255').is_private)
1548 self.assertEqual(False, ipaddress.ip_network('172.32.0.0').is_private)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001549 self.assertEqual(True,
1550 ipaddress.ip_network('169.254.1.0/24').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001551
1552 self.assertEqual(True,
1553 ipaddress.ip_interface(
1554 '169.254.100.200/24').is_link_local)
1555 self.assertEqual(False,
1556 ipaddress.ip_interface(
1557 '169.255.100.200/24').is_link_local)
1558
1559 self.assertEqual(True,
1560 ipaddress.ip_network(
1561 '127.100.200.254/32').is_loopback)
1562 self.assertEqual(True, ipaddress.ip_network(
1563 '127.42.0.0/16').is_loopback)
1564 self.assertEqual(False, ipaddress.ip_network('128.0.0.0').is_loopback)
Peter Moodye5019d52013-10-24 09:47:10 -07001565 self.assertEqual(False,
1566 ipaddress.ip_network('100.64.0.0/10').is_private)
Peter Moodybe9c1b12013-10-22 12:36:21 -07001567 self.assertEqual(False, ipaddress.ip_network('100.64.0.0/10').is_global)
Peter Moodye5019d52013-10-24 09:47:10 -07001568
Peter Moody22c31762013-10-21 13:58:06 -07001569 self.assertEqual(True,
1570 ipaddress.ip_network('192.0.2.128/25').is_private)
1571 self.assertEqual(True,
1572 ipaddress.ip_network('192.0.3.0/24').is_global)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001573
1574 # test addresses
Hynek Schlawackbcd30442012-06-04 14:19:39 +02001575 self.assertEqual(True, ipaddress.ip_address('0.0.0.0').is_unspecified)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001576 self.assertEqual(True, ipaddress.ip_address('224.1.1.1').is_multicast)
1577 self.assertEqual(False, ipaddress.ip_address('240.0.0.0').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001578 self.assertEqual(True, ipaddress.ip_address('240.0.0.1').is_reserved)
1579 self.assertEqual(False,
1580 ipaddress.ip_address('239.255.255.255').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001581
1582 self.assertEqual(True, ipaddress.ip_address('192.168.1.1').is_private)
1583 self.assertEqual(False, ipaddress.ip_address('192.169.0.0').is_private)
1584 self.assertEqual(True, ipaddress.ip_address(
1585 '10.255.255.255').is_private)
1586 self.assertEqual(False, ipaddress.ip_address('11.0.0.0').is_private)
1587 self.assertEqual(True, ipaddress.ip_address(
1588 '172.31.255.255').is_private)
1589 self.assertEqual(False, ipaddress.ip_address('172.32.0.0').is_private)
1590
1591 self.assertEqual(True,
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001592 ipaddress.ip_address('169.254.100.200').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001593 self.assertEqual(False,
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001594 ipaddress.ip_address('169.255.100.200').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001595
1596 self.assertEqual(True,
1597 ipaddress.ip_address('127.100.200.254').is_loopback)
1598 self.assertEqual(True, ipaddress.ip_address('127.42.0.0').is_loopback)
1599 self.assertEqual(False, ipaddress.ip_address('128.0.0.0').is_loopback)
1600 self.assertEqual(True, ipaddress.ip_network('0.0.0.0').is_unspecified)
1601
1602 def testReservedIpv6(self):
1603
1604 self.assertEqual(True, ipaddress.ip_network('ffff::').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001605 self.assertEqual(True, ipaddress.ip_network(2**128 - 1).is_multicast)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001606 self.assertEqual(True, ipaddress.ip_network('ff00::').is_multicast)
1607 self.assertEqual(False, ipaddress.ip_network('fdff::').is_multicast)
1608
1609 self.assertEqual(True, ipaddress.ip_network('fecf::').is_site_local)
1610 self.assertEqual(True, ipaddress.ip_network(
1611 'feff:ffff:ffff:ffff::').is_site_local)
1612 self.assertEqual(False, ipaddress.ip_network(
1613 'fbf:ffff::').is_site_local)
1614 self.assertEqual(False, ipaddress.ip_network('ff00::').is_site_local)
1615
1616 self.assertEqual(True, ipaddress.ip_network('fc00::').is_private)
1617 self.assertEqual(True, ipaddress.ip_network(
1618 'fc00:ffff:ffff:ffff::').is_private)
1619 self.assertEqual(False, ipaddress.ip_network('fbff:ffff::').is_private)
1620 self.assertEqual(False, ipaddress.ip_network('fe00::').is_private)
1621
1622 self.assertEqual(True, ipaddress.ip_network('fea0::').is_link_local)
1623 self.assertEqual(True, ipaddress.ip_network(
1624 'febf:ffff::').is_link_local)
1625 self.assertEqual(False, ipaddress.ip_network(
1626 'fe7f:ffff::').is_link_local)
1627 self.assertEqual(False, ipaddress.ip_network('fec0::').is_link_local)
1628
1629 self.assertEqual(True, ipaddress.ip_interface('0:0::0:01').is_loopback)
1630 self.assertEqual(False, ipaddress.ip_interface('::1/127').is_loopback)
1631 self.assertEqual(False, ipaddress.ip_network('::').is_loopback)
1632 self.assertEqual(False, ipaddress.ip_network('::2').is_loopback)
1633
1634 self.assertEqual(True, ipaddress.ip_network('0::0').is_unspecified)
1635 self.assertEqual(False, ipaddress.ip_network('::1').is_unspecified)
1636 self.assertEqual(False, ipaddress.ip_network('::/127').is_unspecified)
1637
Peter Moody22c31762013-10-21 13:58:06 -07001638 self.assertEqual(True,
1639 ipaddress.ip_network('2001::1/128').is_private)
1640 self.assertEqual(True,
1641 ipaddress.ip_network('200::1/128').is_global)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001642 # test addresses
1643 self.assertEqual(True, ipaddress.ip_address('ffff::').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001644 self.assertEqual(True, ipaddress.ip_address(2**128 - 1).is_multicast)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001645 self.assertEqual(True, ipaddress.ip_address('ff00::').is_multicast)
1646 self.assertEqual(False, ipaddress.ip_address('fdff::').is_multicast)
1647
1648 self.assertEqual(True, ipaddress.ip_address('fecf::').is_site_local)
1649 self.assertEqual(True, ipaddress.ip_address(
1650 'feff:ffff:ffff:ffff::').is_site_local)
1651 self.assertEqual(False, ipaddress.ip_address(
1652 'fbf:ffff::').is_site_local)
1653 self.assertEqual(False, ipaddress.ip_address('ff00::').is_site_local)
1654
1655 self.assertEqual(True, ipaddress.ip_address('fc00::').is_private)
1656 self.assertEqual(True, ipaddress.ip_address(
1657 'fc00:ffff:ffff:ffff::').is_private)
1658 self.assertEqual(False, ipaddress.ip_address('fbff:ffff::').is_private)
1659 self.assertEqual(False, ipaddress.ip_address('fe00::').is_private)
1660
1661 self.assertEqual(True, ipaddress.ip_address('fea0::').is_link_local)
1662 self.assertEqual(True, ipaddress.ip_address(
1663 'febf:ffff::').is_link_local)
1664 self.assertEqual(False, ipaddress.ip_address(
1665 'fe7f:ffff::').is_link_local)
1666 self.assertEqual(False, ipaddress.ip_address('fec0::').is_link_local)
1667
1668 self.assertEqual(True, ipaddress.ip_address('0:0::0:01').is_loopback)
1669 self.assertEqual(True, ipaddress.ip_address('::1').is_loopback)
1670 self.assertEqual(False, ipaddress.ip_address('::2').is_loopback)
1671
1672 self.assertEqual(True, ipaddress.ip_address('0::0').is_unspecified)
1673 self.assertEqual(False, ipaddress.ip_address('::1').is_unspecified)
1674
1675 # some generic IETF reserved addresses
1676 self.assertEqual(True, ipaddress.ip_address('100::').is_reserved)
1677 self.assertEqual(True, ipaddress.ip_network('4000::1/128').is_reserved)
1678
1679 def testIpv4Mapped(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001680 self.assertEqual(
1681 ipaddress.ip_address('::ffff:192.168.1.1').ipv4_mapped,
1682 ipaddress.ip_address('192.168.1.1'))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001683 self.assertEqual(ipaddress.ip_address('::c0a8:101').ipv4_mapped, None)
1684 self.assertEqual(ipaddress.ip_address('::ffff:c0a8:101').ipv4_mapped,
1685 ipaddress.ip_address('192.168.1.1'))
1686
1687 def testAddrExclude(self):
1688 addr1 = ipaddress.ip_network('10.1.1.0/24')
1689 addr2 = ipaddress.ip_network('10.1.1.0/26')
1690 addr3 = ipaddress.ip_network('10.2.1.0/24')
1691 addr4 = ipaddress.ip_address('10.1.1.0')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001692 addr5 = ipaddress.ip_network('2001:db8::0/32')
Serhiy Storchakabb0dbd52016-03-01 10:25:45 +02001693 addr6 = ipaddress.ip_network('10.1.1.5/32')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001694 self.assertEqual(sorted(list(addr1.address_exclude(addr2))),
1695 [ipaddress.ip_network('10.1.1.64/26'),
1696 ipaddress.ip_network('10.1.1.128/25')])
1697 self.assertRaises(ValueError, list, addr1.address_exclude(addr3))
1698 self.assertRaises(TypeError, list, addr1.address_exclude(addr4))
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001699 self.assertRaises(TypeError, list, addr1.address_exclude(addr5))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001700 self.assertEqual(list(addr1.address_exclude(addr1)), [])
Serhiy Storchakabb0dbd52016-03-01 10:25:45 +02001701 self.assertEqual(sorted(list(addr1.address_exclude(addr6))),
1702 [ipaddress.ip_network('10.1.1.0/30'),
1703 ipaddress.ip_network('10.1.1.4/32'),
1704 ipaddress.ip_network('10.1.1.6/31'),
1705 ipaddress.ip_network('10.1.1.8/29'),
1706 ipaddress.ip_network('10.1.1.16/28'),
1707 ipaddress.ip_network('10.1.1.32/27'),
1708 ipaddress.ip_network('10.1.1.64/26'),
1709 ipaddress.ip_network('10.1.1.128/25')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001710
1711 def testHash(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001712 self.assertEqual(hash(ipaddress.ip_interface('10.1.1.0/24')),
1713 hash(ipaddress.ip_interface('10.1.1.0/24')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001714 self.assertEqual(hash(ipaddress.ip_network('10.1.1.0/24')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001715 hash(ipaddress.ip_network('10.1.1.0/24')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001716 self.assertEqual(hash(ipaddress.ip_address('10.1.1.0')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001717 hash(ipaddress.ip_address('10.1.1.0')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001718 # i70
1719 self.assertEqual(hash(ipaddress.ip_address('1.2.3.4')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001720 hash(ipaddress.ip_address(
Nick Coghlandc9b2552012-05-20 21:01:57 +10001721 int(ipaddress.ip_address('1.2.3.4')._ip))))
1722 ip1 = ipaddress.ip_address('10.1.1.0')
1723 ip2 = ipaddress.ip_address('1::')
1724 dummy = {}
1725 dummy[self.ipv4_address] = None
1726 dummy[self.ipv6_address] = None
1727 dummy[ip1] = None
1728 dummy[ip2] = None
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001729 self.assertIn(self.ipv4_address, dummy)
1730 self.assertIn(ip2, dummy)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001731
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001732 def testIPBases(self):
1733 net = self.ipv4_network
1734 self.assertEqual('1.2.3.0/24', net.compressed)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001735 net = self.ipv6_network
1736 self.assertRaises(ValueError, net._string_from_ip_int, 2**128 + 1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001737
Hynek Schlawack454a74d2012-06-04 18:14:02 +02001738 def testIPv6NetworkHelpers(self):
1739 net = self.ipv6_network
1740 self.assertEqual('2001:658:22a:cafe::/64', net.with_prefixlen)
1741 self.assertEqual('2001:658:22a:cafe::/ffff:ffff:ffff:ffff::',
1742 net.with_netmask)
1743 self.assertEqual('2001:658:22a:cafe::/::ffff:ffff:ffff:ffff',
1744 net.with_hostmask)
1745 self.assertEqual('2001:658:22a:cafe::/64', str(net))
1746
1747 def testIPv4NetworkHelpers(self):
1748 net = self.ipv4_network
1749 self.assertEqual('1.2.3.0/24', net.with_prefixlen)
1750 self.assertEqual('1.2.3.0/255.255.255.0', net.with_netmask)
1751 self.assertEqual('1.2.3.0/0.0.0.255', net.with_hostmask)
1752 self.assertEqual('1.2.3.0/24', str(net))
1753
Nick Coghlandc9b2552012-05-20 21:01:57 +10001754 def testCopyConstructor(self):
1755 addr1 = ipaddress.ip_network('10.1.1.0/24')
1756 addr2 = ipaddress.ip_network(addr1)
1757 addr3 = ipaddress.ip_interface('2001:658:22a:cafe:200::1/64')
1758 addr4 = ipaddress.ip_interface(addr3)
1759 addr5 = ipaddress.IPv4Address('1.1.1.1')
1760 addr6 = ipaddress.IPv6Address('2001:658:22a:cafe:200::1')
1761
1762 self.assertEqual(addr1, addr2)
1763 self.assertEqual(addr3, addr4)
1764 self.assertEqual(addr5, ipaddress.IPv4Address(addr5))
1765 self.assertEqual(addr6, ipaddress.IPv6Address(addr6))
1766
1767 def testCompressIPv6Address(self):
1768 test_addresses = {
1769 '1:2:3:4:5:6:7:8': '1:2:3:4:5:6:7:8/128',
1770 '2001:0:0:4:0:0:0:8': '2001:0:0:4::8/128',
1771 '2001:0:0:4:5:6:7:8': '2001::4:5:6:7:8/128',
1772 '2001:0:3:4:5:6:7:8': '2001:0:3:4:5:6:7:8/128',
Nick Coghlandc9b2552012-05-20 21:01:57 +10001773 '0:0:3:0:0:0:0:ffff': '0:0:3::ffff/128',
1774 '0:0:0:4:0:0:0:ffff': '::4:0:0:0:ffff/128',
1775 '0:0:0:0:5:0:0:ffff': '::5:0:0:ffff/128',
1776 '1:0:0:4:0:0:7:8': '1::4:0:0:7:8/128',
1777 '0:0:0:0:0:0:0:0': '::/128',
1778 '0:0:0:0:0:0:0:0/0': '::/0',
1779 '0:0:0:0:0:0:0:1': '::1/128',
1780 '2001:0658:022a:cafe:0000:0000:0000:0000/66':
1781 '2001:658:22a:cafe::/66',
1782 '::1.2.3.4': '::102:304/128',
1783 '1:2:3:4:5:ffff:1.2.3.4': '1:2:3:4:5:ffff:102:304/128',
1784 '::7:6:5:4:3:2:1': '0:7:6:5:4:3:2:1/128',
1785 '::7:6:5:4:3:2:0': '0:7:6:5:4:3:2:0/128',
1786 '7:6:5:4:3:2:1::': '7:6:5:4:3:2:1:0/128',
1787 '0:6:5:4:3:2:1::': '0:6:5:4:3:2:1:0/128',
1788 }
1789 for uncompressed, compressed in list(test_addresses.items()):
1790 self.assertEqual(compressed, str(ipaddress.IPv6Interface(
1791 uncompressed)))
1792
1793 def testExplodeShortHandIpStr(self):
1794 addr1 = ipaddress.IPv6Interface('2001::1')
1795 addr2 = ipaddress.IPv6Address('2001:0:5ef5:79fd:0:59d:a0e5:ba1')
1796 addr3 = ipaddress.IPv6Network('2001::/96')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001797 addr4 = ipaddress.IPv4Address('192.168.178.1')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001798 self.assertEqual('2001:0000:0000:0000:0000:0000:0000:0001/128',
1799 addr1.exploded)
1800 self.assertEqual('0000:0000:0000:0000:0000:0000:0000:0001/128',
1801 ipaddress.IPv6Interface('::1/128').exploded)
1802 # issue 77
1803 self.assertEqual('2001:0000:5ef5:79fd:0000:059d:a0e5:0ba1',
1804 addr2.exploded)
1805 self.assertEqual('2001:0000:0000:0000:0000:0000:0000:0000/96',
1806 addr3.exploded)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001807 self.assertEqual('192.168.178.1', addr4.exploded)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001808
Eric V. Smithebdaaf42014-04-14 12:58:07 -04001809 def testReversePointer(self):
1810 addr1 = ipaddress.IPv4Address('127.0.0.1')
1811 addr2 = ipaddress.IPv6Address('2001:db8::1')
1812 self.assertEqual('1.0.0.127.in-addr.arpa', addr1.reverse_pointer)
1813 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.' +
1814 'b.d.0.1.0.0.2.ip6.arpa',
1815 addr2.reverse_pointer)
1816
Nick Coghlandc9b2552012-05-20 21:01:57 +10001817 def testIntRepresentation(self):
1818 self.assertEqual(16909060, int(self.ipv4_address))
1819 self.assertEqual(42540616829182469433547762482097946625,
1820 int(self.ipv6_address))
1821
Nick Coghlandc9b2552012-05-20 21:01:57 +10001822 def testForceVersion(self):
1823 self.assertEqual(ipaddress.ip_network(1).version, 4)
Nick Coghlan51c30672012-05-27 00:25:58 +10001824 self.assertEqual(ipaddress.IPv6Network(1).version, 6)
Sandro Tosi876ecad2012-05-23 22:26:55 +02001825
Nick Coghlandc9b2552012-05-20 21:01:57 +10001826 def testWithStar(self):
Nick Coghlana8517ad2012-08-20 10:04:26 +10001827 self.assertEqual(self.ipv4_interface.with_prefixlen, "1.2.3.4/24")
1828 self.assertEqual(self.ipv4_interface.with_netmask,
Nick Coghlandc9b2552012-05-20 21:01:57 +10001829 "1.2.3.4/255.255.255.0")
Nick Coghlana8517ad2012-08-20 10:04:26 +10001830 self.assertEqual(self.ipv4_interface.with_hostmask,
Nick Coghlandc9b2552012-05-20 21:01:57 +10001831 "1.2.3.4/0.0.0.255")
1832
Nick Coghlana8517ad2012-08-20 10:04:26 +10001833 self.assertEqual(self.ipv6_interface.with_prefixlen,
Nick Coghlandc9b2552012-05-20 21:01:57 +10001834 '2001:658:22a:cafe:200::1/64')
Nick Coghlana8517ad2012-08-20 10:04:26 +10001835 self.assertEqual(self.ipv6_interface.with_netmask,
1836 '2001:658:22a:cafe:200::1/ffff:ffff:ffff:ffff::')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001837 # this probably don't make much sense, but it's included for
1838 # compatibility with ipv4
Nick Coghlana8517ad2012-08-20 10:04:26 +10001839 self.assertEqual(self.ipv6_interface.with_hostmask,
Nick Coghlandc9b2552012-05-20 21:01:57 +10001840 '2001:658:22a:cafe:200::1/::ffff:ffff:ffff:ffff')
1841
1842 def testNetworkElementCaching(self):
1843 # V4 - make sure we're empty
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001844 self.assertNotIn('network_address', self.ipv4_network._cache)
1845 self.assertNotIn('broadcast_address', self.ipv4_network._cache)
1846 self.assertNotIn('hostmask', self.ipv4_network._cache)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001847
1848 # V4 - populate and test
1849 self.assertEqual(self.ipv4_network.network_address,
1850 ipaddress.IPv4Address('1.2.3.0'))
1851 self.assertEqual(self.ipv4_network.broadcast_address,
1852 ipaddress.IPv4Address('1.2.3.255'))
1853 self.assertEqual(self.ipv4_network.hostmask,
1854 ipaddress.IPv4Address('0.0.0.255'))
1855
1856 # V4 - check we're cached
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001857 self.assertIn('broadcast_address', self.ipv4_network._cache)
1858 self.assertIn('hostmask', self.ipv4_network._cache)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001859
1860 # V6 - make sure we're empty
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001861 self.assertNotIn('broadcast_address', self.ipv6_network._cache)
1862 self.assertNotIn('hostmask', self.ipv6_network._cache)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001863
1864 # V6 - populate and test
1865 self.assertEqual(self.ipv6_network.network_address,
1866 ipaddress.IPv6Address('2001:658:22a:cafe::'))
1867 self.assertEqual(self.ipv6_interface.network.network_address,
1868 ipaddress.IPv6Address('2001:658:22a:cafe::'))
1869
1870 self.assertEqual(
1871 self.ipv6_network.broadcast_address,
1872 ipaddress.IPv6Address('2001:658:22a:cafe:ffff:ffff:ffff:ffff'))
1873 self.assertEqual(self.ipv6_network.hostmask,
1874 ipaddress.IPv6Address('::ffff:ffff:ffff:ffff'))
1875 self.assertEqual(
1876 self.ipv6_interface.network.broadcast_address,
1877 ipaddress.IPv6Address('2001:658:22a:cafe:ffff:ffff:ffff:ffff'))
1878 self.assertEqual(self.ipv6_interface.network.hostmask,
1879 ipaddress.IPv6Address('::ffff:ffff:ffff:ffff'))
1880
1881 # V6 - check we're cached
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001882 self.assertIn('broadcast_address', self.ipv6_network._cache)
1883 self.assertIn('hostmask', self.ipv6_network._cache)
1884 self.assertIn('broadcast_address', self.ipv6_interface.network._cache)
1885 self.assertIn('hostmask', self.ipv6_interface.network._cache)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001886
1887 def testTeredo(self):
1888 # stolen from wikipedia
1889 server = ipaddress.IPv4Address('65.54.227.120')
1890 client = ipaddress.IPv4Address('192.0.2.45')
1891 teredo_addr = '2001:0000:4136:e378:8000:63bf:3fff:fdd2'
1892 self.assertEqual((server, client),
1893 ipaddress.ip_address(teredo_addr).teredo)
1894 bad_addr = '2000::4136:e378:8000:63bf:3fff:fdd2'
1895 self.assertFalse(ipaddress.ip_address(bad_addr).teredo)
1896 bad_addr = '2001:0001:4136:e378:8000:63bf:3fff:fdd2'
1897 self.assertFalse(ipaddress.ip_address(bad_addr).teredo)
1898
1899 # i77
1900 teredo_addr = ipaddress.IPv6Address('2001:0:5ef5:79fd:0:59d:a0e5:ba1')
1901 self.assertEqual((ipaddress.IPv4Address('94.245.121.253'),
1902 ipaddress.IPv4Address('95.26.244.94')),
1903 teredo_addr.teredo)
1904
Nick Coghlandc9b2552012-05-20 21:01:57 +10001905 def testsixtofour(self):
1906 sixtofouraddr = ipaddress.ip_address('2002:ac1d:2d64::1')
1907 bad_addr = ipaddress.ip_address('2000:ac1d:2d64::1')
1908 self.assertEqual(ipaddress.IPv4Address('172.29.45.100'),
1909 sixtofouraddr.sixtofour)
1910 self.assertFalse(bad_addr.sixtofour)
1911
Nick Coghlandc9b2552012-05-20 21:01:57 +10001912
1913if __name__ == '__main__':
1914 unittest.main()