blob: c217d36922d849ce7a01a0464c7c79b2b87d3dc4 [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
1069 def testSubnetFailsForLargeCidrDiff(self):
1070 self.assertRaises(ValueError, list,
1071 self.ipv4_interface.network.subnets(9))
1072 self.assertRaises(ValueError, list,
1073 self.ipv4_network.subnets(9))
1074 self.assertRaises(ValueError, list,
1075 self.ipv6_interface.network.subnets(65))
1076 self.assertRaises(ValueError, list,
1077 self.ipv6_network.subnets(65))
1078
1079 def testSupernetFailsForLargeCidrDiff(self):
1080 self.assertRaises(ValueError,
1081 self.ipv4_interface.network.supernet, 25)
1082 self.assertRaises(ValueError,
1083 self.ipv6_interface.network.supernet, 65)
1084
1085 def testSubnetFailsForNegativeCidrDiff(self):
1086 self.assertRaises(ValueError, list,
1087 self.ipv4_interface.network.subnets(-1))
1088 self.assertRaises(ValueError, list,
Nick Coghlan2c589102012-05-27 01:03:25 +10001089 self.ipv4_network.subnets(-1))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001090 self.assertRaises(ValueError, list,
1091 self.ipv6_interface.network.subnets(-1))
1092 self.assertRaises(ValueError, list,
1093 self.ipv6_network.subnets(-1))
1094
1095 def testGetNum_Addresses(self):
1096 self.assertEqual(self.ipv4_network.num_addresses, 256)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001097 self.assertEqual(list(self.ipv4_network.subnets())[0].num_addresses,
1098 128)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001099 self.assertEqual(self.ipv4_network.supernet().num_addresses, 512)
1100
1101 self.assertEqual(self.ipv6_network.num_addresses, 18446744073709551616)
1102 self.assertEqual(list(self.ipv6_network.subnets())[0].num_addresses,
1103 9223372036854775808)
1104 self.assertEqual(self.ipv6_network.supernet().num_addresses,
1105 36893488147419103232)
1106
1107 def testContains(self):
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001108 self.assertIn(ipaddress.IPv4Interface('1.2.3.128/25'),
1109 self.ipv4_network)
1110 self.assertNotIn(ipaddress.IPv4Interface('1.2.4.1/24'),
Nick Coghlandc9b2552012-05-20 21:01:57 +10001111 self.ipv4_network)
1112 # We can test addresses and string as well.
1113 addr1 = ipaddress.IPv4Address('1.2.3.37')
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001114 self.assertIn(addr1, self.ipv4_network)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001115 # issue 61, bad network comparison on like-ip'd network objects
1116 # with identical broadcast addresses.
1117 self.assertFalse(ipaddress.IPv4Network('1.1.0.0/16').__contains__(
1118 ipaddress.IPv4Network('1.0.0.0/15')))
1119
Nick Coghlandc9b2552012-05-20 21:01:57 +10001120 def testNth(self):
1121 self.assertEqual(str(self.ipv4_network[5]), '1.2.3.5')
1122 self.assertRaises(IndexError, self.ipv4_network.__getitem__, 256)
1123
1124 self.assertEqual(str(self.ipv6_network[5]),
1125 '2001:658:22a:cafe::5')
1126
1127 def testGetitem(self):
1128 # http://code.google.com/p/ipaddr-py/issues/detail?id=15
1129 addr = ipaddress.IPv4Network('172.31.255.128/255.255.255.240')
1130 self.assertEqual(28, addr.prefixlen)
1131 addr_list = list(addr)
1132 self.assertEqual('172.31.255.128', str(addr_list[0]))
1133 self.assertEqual('172.31.255.128', str(addr[0]))
1134 self.assertEqual('172.31.255.143', str(addr_list[-1]))
1135 self.assertEqual('172.31.255.143', str(addr[-1]))
1136 self.assertEqual(addr_list[-1], addr[-1])
1137
1138 def testEqual(self):
1139 self.assertTrue(self.ipv4_interface ==
1140 ipaddress.IPv4Interface('1.2.3.4/24'))
1141 self.assertFalse(self.ipv4_interface ==
1142 ipaddress.IPv4Interface('1.2.3.4/23'))
1143 self.assertFalse(self.ipv4_interface ==
1144 ipaddress.IPv6Interface('::1.2.3.4/24'))
1145 self.assertFalse(self.ipv4_interface == '')
1146 self.assertFalse(self.ipv4_interface == [])
1147 self.assertFalse(self.ipv4_interface == 2)
1148
1149 self.assertTrue(self.ipv6_interface ==
1150 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/64'))
1151 self.assertFalse(self.ipv6_interface ==
1152 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/63'))
1153 self.assertFalse(self.ipv6_interface ==
1154 ipaddress.IPv4Interface('1.2.3.4/23'))
1155 self.assertFalse(self.ipv6_interface == '')
1156 self.assertFalse(self.ipv6_interface == [])
1157 self.assertFalse(self.ipv6_interface == 2)
1158
1159 def testNotEqual(self):
1160 self.assertFalse(self.ipv4_interface !=
1161 ipaddress.IPv4Interface('1.2.3.4/24'))
1162 self.assertTrue(self.ipv4_interface !=
1163 ipaddress.IPv4Interface('1.2.3.4/23'))
1164 self.assertTrue(self.ipv4_interface !=
1165 ipaddress.IPv6Interface('::1.2.3.4/24'))
1166 self.assertTrue(self.ipv4_interface != '')
1167 self.assertTrue(self.ipv4_interface != [])
1168 self.assertTrue(self.ipv4_interface != 2)
1169
1170 self.assertTrue(self.ipv4_address !=
1171 ipaddress.IPv4Address('1.2.3.5'))
1172 self.assertTrue(self.ipv4_address != '')
1173 self.assertTrue(self.ipv4_address != [])
1174 self.assertTrue(self.ipv4_address != 2)
1175
1176 self.assertFalse(self.ipv6_interface !=
1177 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/64'))
1178 self.assertTrue(self.ipv6_interface !=
1179 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/63'))
1180 self.assertTrue(self.ipv6_interface !=
1181 ipaddress.IPv4Interface('1.2.3.4/23'))
1182 self.assertTrue(self.ipv6_interface != '')
1183 self.assertTrue(self.ipv6_interface != [])
1184 self.assertTrue(self.ipv6_interface != 2)
1185
1186 self.assertTrue(self.ipv6_address !=
1187 ipaddress.IPv4Address('1.2.3.4'))
1188 self.assertTrue(self.ipv6_address != '')
1189 self.assertTrue(self.ipv6_address != [])
1190 self.assertTrue(self.ipv6_address != 2)
1191
1192 def testSlash32Constructor(self):
1193 self.assertEqual(str(ipaddress.IPv4Interface(
1194 '1.2.3.4/255.255.255.255')), '1.2.3.4/32')
1195
1196 def testSlash128Constructor(self):
1197 self.assertEqual(str(ipaddress.IPv6Interface('::1/128')),
1198 '::1/128')
1199
1200 def testSlash0Constructor(self):
1201 self.assertEqual(str(ipaddress.IPv4Interface('1.2.3.4/0.0.0.0')),
1202 '1.2.3.4/0')
1203
1204 def testCollapsing(self):
1205 # test only IP addresses including some duplicates
1206 ip1 = ipaddress.IPv4Address('1.1.1.0')
1207 ip2 = ipaddress.IPv4Address('1.1.1.1')
1208 ip3 = ipaddress.IPv4Address('1.1.1.2')
1209 ip4 = ipaddress.IPv4Address('1.1.1.3')
1210 ip5 = ipaddress.IPv4Address('1.1.1.4')
1211 ip6 = ipaddress.IPv4Address('1.1.1.0')
1212 # check that addreses are subsumed properly.
1213 collapsed = ipaddress.collapse_addresses(
1214 [ip1, ip2, ip3, ip4, ip5, ip6])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001215 self.assertEqual(list(collapsed),
1216 [ipaddress.IPv4Network('1.1.1.0/30'),
1217 ipaddress.IPv4Network('1.1.1.4/32')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001218
1219 # test a mix of IP addresses and networks including some duplicates
1220 ip1 = ipaddress.IPv4Address('1.1.1.0')
1221 ip2 = ipaddress.IPv4Address('1.1.1.1')
1222 ip3 = ipaddress.IPv4Address('1.1.1.2')
1223 ip4 = ipaddress.IPv4Address('1.1.1.3')
1224 #ip5 = ipaddress.IPv4Interface('1.1.1.4/30')
1225 #ip6 = ipaddress.IPv4Interface('1.1.1.4/30')
1226 # check that addreses are subsumed properly.
1227 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3, ip4])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001228 self.assertEqual(list(collapsed),
1229 [ipaddress.IPv4Network('1.1.1.0/30')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001230
1231 # test only IP networks
1232 ip1 = ipaddress.IPv4Network('1.1.0.0/24')
1233 ip2 = ipaddress.IPv4Network('1.1.1.0/24')
1234 ip3 = ipaddress.IPv4Network('1.1.2.0/24')
1235 ip4 = ipaddress.IPv4Network('1.1.3.0/24')
1236 ip5 = ipaddress.IPv4Network('1.1.4.0/24')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001237 # stored in no particular order b/c we want CollapseAddr to call
1238 # [].sort
Nick Coghlandc9b2552012-05-20 21:01:57 +10001239 ip6 = ipaddress.IPv4Network('1.1.0.0/22')
1240 # check that addreses are subsumed properly.
1241 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3, ip4, ip5,
1242 ip6])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001243 self.assertEqual(list(collapsed),
1244 [ipaddress.IPv4Network('1.1.0.0/22'),
1245 ipaddress.IPv4Network('1.1.4.0/24')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001246
1247 # test that two addresses are supernet'ed properly
1248 collapsed = ipaddress.collapse_addresses([ip1, ip2])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001249 self.assertEqual(list(collapsed),
1250 [ipaddress.IPv4Network('1.1.0.0/23')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001251
1252 # test same IP networks
1253 ip_same1 = ip_same2 = ipaddress.IPv4Network('1.1.1.1/32')
1254 self.assertEqual(list(ipaddress.collapse_addresses(
1255 [ip_same1, ip_same2])),
1256 [ip_same1])
1257
1258 # test same IP addresses
1259 ip_same1 = ip_same2 = ipaddress.IPv4Address('1.1.1.1')
1260 self.assertEqual(list(ipaddress.collapse_addresses(
1261 [ip_same1, ip_same2])),
1262 [ipaddress.ip_network('1.1.1.1/32')])
1263 ip1 = ipaddress.IPv6Network('2001::/100')
1264 ip2 = ipaddress.IPv6Network('2001::/120')
1265 ip3 = ipaddress.IPv6Network('2001::/96')
1266 # test that ipv6 addresses are subsumed properly.
1267 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3])
1268 self.assertEqual(list(collapsed), [ip3])
1269
1270 # the toejam test
Hynek Schlawack35db5132012-06-01 20:12:17 +02001271 addr_tuples = [
1272 (ipaddress.ip_address('1.1.1.1'),
1273 ipaddress.ip_address('::1')),
1274 (ipaddress.IPv4Network('1.1.0.0/24'),
1275 ipaddress.IPv6Network('2001::/120')),
1276 (ipaddress.IPv4Network('1.1.0.0/32'),
1277 ipaddress.IPv6Network('2001::/128')),
1278 ]
1279 for ip1, ip2 in addr_tuples:
1280 self.assertRaises(TypeError, ipaddress.collapse_addresses,
1281 [ip1, ip2])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001282
1283 def testSummarizing(self):
1284 #ip = ipaddress.ip_address
1285 #ipnet = ipaddress.ip_network
1286 summarize = ipaddress.summarize_address_range
1287 ip1 = ipaddress.ip_address('1.1.1.0')
1288 ip2 = ipaddress.ip_address('1.1.1.255')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001289
1290 # summarize works only for IPv4 & IPv6
1291 class IPv7Address(ipaddress.IPv6Address):
1292 @property
1293 def version(self):
1294 return 7
1295 ip_invalid1 = IPv7Address('::1')
1296 ip_invalid2 = IPv7Address('::1')
1297 self.assertRaises(ValueError, list,
1298 summarize(ip_invalid1, ip_invalid2))
1299 # test that a summary over ip4 & ip6 fails
1300 self.assertRaises(TypeError, list,
1301 summarize(ip1, ipaddress.IPv6Address('::1')))
1302 # test a /24 is summarized properly
Nick Coghlandc9b2552012-05-20 21:01:57 +10001303 self.assertEqual(list(summarize(ip1, ip2))[0],
1304 ipaddress.ip_network('1.1.1.0/24'))
1305 # test an IPv4 range that isn't on a network byte boundary
1306 ip2 = ipaddress.ip_address('1.1.1.8')
1307 self.assertEqual(list(summarize(ip1, ip2)),
1308 [ipaddress.ip_network('1.1.1.0/29'),
1309 ipaddress.ip_network('1.1.1.8')])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001310 # all!
1311 ip1 = ipaddress.IPv4Address(0)
1312 ip2 = ipaddress.IPv4Address(ipaddress.IPv4Address._ALL_ONES)
1313 self.assertEqual([ipaddress.IPv4Network('0.0.0.0/0')],
1314 list(summarize(ip1, ip2)))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001315
1316 ip1 = ipaddress.ip_address('1::')
1317 ip2 = ipaddress.ip_address('1:ffff:ffff:ffff:ffff:ffff:ffff:ffff')
1318 # test a IPv6 is sumamrized properly
1319 self.assertEqual(list(summarize(ip1, ip2))[0],
1320 ipaddress.ip_network('1::/16'))
1321 # test an IPv6 range that isn't on a network byte boundary
1322 ip2 = ipaddress.ip_address('2::')
1323 self.assertEqual(list(summarize(ip1, ip2)),
1324 [ipaddress.ip_network('1::/16'),
1325 ipaddress.ip_network('2::/128')])
1326
1327 # test exception raised when first is greater than last
1328 self.assertRaises(ValueError, list,
1329 summarize(ipaddress.ip_address('1.1.1.0'),
1330 ipaddress.ip_address('1.1.0.0')))
1331 # test exception raised when first and last aren't IP addresses
1332 self.assertRaises(TypeError, list,
1333 summarize(ipaddress.ip_network('1.1.1.0'),
1334 ipaddress.ip_network('1.1.0.0')))
1335 self.assertRaises(TypeError, list,
1336 summarize(ipaddress.ip_network('1.1.1.0'),
1337 ipaddress.ip_network('1.1.0.0')))
1338 # test exception raised when first and last are not same version
1339 self.assertRaises(TypeError, list,
1340 summarize(ipaddress.ip_address('::'),
1341 ipaddress.ip_network('1.1.0.0')))
1342
1343 def testAddressComparison(self):
1344 self.assertTrue(ipaddress.ip_address('1.1.1.1') <=
1345 ipaddress.ip_address('1.1.1.1'))
1346 self.assertTrue(ipaddress.ip_address('1.1.1.1') <=
1347 ipaddress.ip_address('1.1.1.2'))
1348 self.assertTrue(ipaddress.ip_address('::1') <=
1349 ipaddress.ip_address('::1'))
1350 self.assertTrue(ipaddress.ip_address('::1') <=
1351 ipaddress.ip_address('::2'))
1352
Nick Coghlan3008ec02012-07-08 00:45:33 +10001353 def testInterfaceComparison(self):
1354 self.assertTrue(ipaddress.ip_interface('1.1.1.1') <=
1355 ipaddress.ip_interface('1.1.1.1'))
1356 self.assertTrue(ipaddress.ip_interface('1.1.1.1') <=
1357 ipaddress.ip_interface('1.1.1.2'))
1358 self.assertTrue(ipaddress.ip_interface('::1') <=
1359 ipaddress.ip_interface('::1'))
1360 self.assertTrue(ipaddress.ip_interface('::1') <=
1361 ipaddress.ip_interface('::2'))
1362
Nick Coghlandc9b2552012-05-20 21:01:57 +10001363 def testNetworkComparison(self):
1364 # ip1 and ip2 have the same network address
1365 ip1 = ipaddress.IPv4Network('1.1.1.0/24')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001366 ip2 = ipaddress.IPv4Network('1.1.1.0/32')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001367 ip3 = ipaddress.IPv4Network('1.1.2.0/24')
1368
1369 self.assertTrue(ip1 < ip3)
1370 self.assertTrue(ip3 > ip2)
1371
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001372 self.assertEqual(ip1.compare_networks(ip1), 0)
1373
1374 # if addresses are the same, sort by netmask
1375 self.assertEqual(ip1.compare_networks(ip2), -1)
1376 self.assertEqual(ip2.compare_networks(ip1), 1)
1377
Nick Coghlandc9b2552012-05-20 21:01:57 +10001378 self.assertEqual(ip1.compare_networks(ip3), -1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001379 self.assertEqual(ip3.compare_networks(ip1), 1)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001380 self.assertTrue(ip1._get_networks_key() < ip3._get_networks_key())
1381
1382 ip1 = ipaddress.IPv6Network('2001:2000::/96')
1383 ip2 = ipaddress.IPv6Network('2001:2001::/96')
1384 ip3 = ipaddress.IPv6Network('2001:ffff:2000::/96')
1385
1386 self.assertTrue(ip1 < ip3)
1387 self.assertTrue(ip3 > ip2)
1388 self.assertEqual(ip1.compare_networks(ip3), -1)
1389 self.assertTrue(ip1._get_networks_key() < ip3._get_networks_key())
1390
1391 # Test comparing different protocols.
1392 # Should always raise a TypeError.
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001393 self.assertRaises(TypeError,
1394 self.ipv4_network.compare_networks,
1395 self.ipv6_network)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001396 ipv6 = ipaddress.IPv6Interface('::/0')
1397 ipv4 = ipaddress.IPv4Interface('0.0.0.0/0')
1398 self.assertRaises(TypeError, ipv4.__lt__, ipv6)
1399 self.assertRaises(TypeError, ipv4.__gt__, ipv6)
1400 self.assertRaises(TypeError, ipv6.__lt__, ipv4)
1401 self.assertRaises(TypeError, ipv6.__gt__, ipv4)
1402
1403 # Regression test for issue 19.
1404 ip1 = ipaddress.ip_network('10.1.2.128/25')
1405 self.assertFalse(ip1 < ip1)
1406 self.assertFalse(ip1 > ip1)
1407 ip2 = ipaddress.ip_network('10.1.3.0/24')
1408 self.assertTrue(ip1 < ip2)
1409 self.assertFalse(ip2 < ip1)
1410 self.assertFalse(ip1 > ip2)
1411 self.assertTrue(ip2 > ip1)
1412 ip3 = ipaddress.ip_network('10.1.3.0/25')
1413 self.assertTrue(ip2 < ip3)
1414 self.assertFalse(ip3 < ip2)
1415 self.assertFalse(ip2 > ip3)
1416 self.assertTrue(ip3 > ip2)
1417
1418 # Regression test for issue 28.
1419 ip1 = ipaddress.ip_network('10.10.10.0/31')
1420 ip2 = ipaddress.ip_network('10.10.10.0')
1421 ip3 = ipaddress.ip_network('10.10.10.2/31')
1422 ip4 = ipaddress.ip_network('10.10.10.2')
1423 sorted = [ip1, ip2, ip3, ip4]
1424 unsorted = [ip2, ip4, ip1, ip3]
1425 unsorted.sort()
1426 self.assertEqual(sorted, unsorted)
1427 unsorted = [ip4, ip1, ip3, ip2]
1428 unsorted.sort()
1429 self.assertEqual(sorted, unsorted)
Serhiy Storchakaf186e122015-01-26 10:11:16 +02001430 self.assertIs(ip1.__lt__(ipaddress.ip_address('10.10.10.0')),
1431 NotImplemented)
1432 self.assertIs(ip2.__lt__(ipaddress.ip_address('10.10.10.0')),
1433 NotImplemented)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001434
1435 # <=, >=
1436 self.assertTrue(ipaddress.ip_network('1.1.1.1') <=
1437 ipaddress.ip_network('1.1.1.1'))
1438 self.assertTrue(ipaddress.ip_network('1.1.1.1') <=
1439 ipaddress.ip_network('1.1.1.2'))
1440 self.assertFalse(ipaddress.ip_network('1.1.1.2') <=
1441 ipaddress.ip_network('1.1.1.1'))
1442 self.assertTrue(ipaddress.ip_network('::1') <=
1443 ipaddress.ip_network('::1'))
1444 self.assertTrue(ipaddress.ip_network('::1') <=
1445 ipaddress.ip_network('::2'))
1446 self.assertFalse(ipaddress.ip_network('::2') <=
1447 ipaddress.ip_network('::1'))
1448
1449 def testStrictNetworks(self):
1450 self.assertRaises(ValueError, ipaddress.ip_network, '192.168.1.1/24')
1451 self.assertRaises(ValueError, ipaddress.ip_network, '::1/120')
1452
1453 def testOverlaps(self):
1454 other = ipaddress.IPv4Network('1.2.3.0/30')
1455 other2 = ipaddress.IPv4Network('1.2.2.0/24')
1456 other3 = ipaddress.IPv4Network('1.2.2.64/26')
1457 self.assertTrue(self.ipv4_network.overlaps(other))
1458 self.assertFalse(self.ipv4_network.overlaps(other2))
1459 self.assertTrue(other2.overlaps(other3))
1460
1461 def testEmbeddedIpv4(self):
1462 ipv4_string = '192.168.0.1'
1463 ipv4 = ipaddress.IPv4Interface(ipv4_string)
1464 v4compat_ipv6 = ipaddress.IPv6Interface('::%s' % ipv4_string)
1465 self.assertEqual(int(v4compat_ipv6.ip), int(ipv4.ip))
1466 v4mapped_ipv6 = ipaddress.IPv6Interface('::ffff:%s' % ipv4_string)
1467 self.assertNotEqual(v4mapped_ipv6.ip, ipv4.ip)
1468 self.assertRaises(ipaddress.AddressValueError, ipaddress.IPv6Interface,
1469 '2001:1.1.1.1:1.1.1.1')
1470
1471 # Issue 67: IPv6 with embedded IPv4 address not recognized.
1472 def testIPv6AddressTooLarge(self):
1473 # RFC4291 2.5.5.2
1474 self.assertEqual(ipaddress.ip_address('::FFFF:192.0.2.1'),
1475 ipaddress.ip_address('::FFFF:c000:201'))
1476 # RFC4291 2.2 (part 3) x::d.d.d.d
1477 self.assertEqual(ipaddress.ip_address('FFFF::192.0.2.1'),
1478 ipaddress.ip_address('FFFF::c000:201'))
1479
1480 def testIPVersion(self):
1481 self.assertEqual(self.ipv4_address.version, 4)
1482 self.assertEqual(self.ipv6_address.version, 6)
1483
1484 def testMaxPrefixLength(self):
1485 self.assertEqual(self.ipv4_interface.max_prefixlen, 32)
1486 self.assertEqual(self.ipv6_interface.max_prefixlen, 128)
1487
1488 def testPacked(self):
1489 self.assertEqual(self.ipv4_address.packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001490 b'\x01\x02\x03\x04')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001491 self.assertEqual(ipaddress.IPv4Interface('255.254.253.252').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001492 b'\xff\xfe\xfd\xfc')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001493 self.assertEqual(self.ipv6_address.packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001494 b'\x20\x01\x06\x58\x02\x2a\xca\xfe'
1495 b'\x02\x00\x00\x00\x00\x00\x00\x01')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001496 self.assertEqual(ipaddress.IPv6Interface('ffff:2:3:4:ffff::').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001497 b'\xff\xff\x00\x02\x00\x03\x00\x04\xff\xff'
1498 + b'\x00' * 6)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001499 self.assertEqual(ipaddress.IPv6Interface('::1:0:0:0:0').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001500 b'\x00' * 6 + b'\x00\x01' + b'\x00' * 8)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001501
Nick Coghlandc9b2552012-05-20 21:01:57 +10001502 def testIpType(self):
1503 ipv4net = ipaddress.ip_network('1.2.3.4')
1504 ipv4addr = ipaddress.ip_address('1.2.3.4')
1505 ipv6net = ipaddress.ip_network('::1.2.3.4')
1506 ipv6addr = ipaddress.ip_address('::1.2.3.4')
1507 self.assertEqual(ipaddress.IPv4Network, type(ipv4net))
1508 self.assertEqual(ipaddress.IPv4Address, type(ipv4addr))
1509 self.assertEqual(ipaddress.IPv6Network, type(ipv6net))
1510 self.assertEqual(ipaddress.IPv6Address, type(ipv6addr))
1511
1512 def testReservedIpv4(self):
1513 # test networks
1514 self.assertEqual(True, ipaddress.ip_interface(
1515 '224.1.1.1/31').is_multicast)
1516 self.assertEqual(False, ipaddress.ip_network('240.0.0.0').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001517 self.assertEqual(True, ipaddress.ip_network('240.0.0.0').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001518
1519 self.assertEqual(True, ipaddress.ip_interface(
1520 '192.168.1.1/17').is_private)
1521 self.assertEqual(False, ipaddress.ip_network('192.169.0.0').is_private)
1522 self.assertEqual(True, ipaddress.ip_network(
1523 '10.255.255.255').is_private)
1524 self.assertEqual(False, ipaddress.ip_network('11.0.0.0').is_private)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001525 self.assertEqual(False, ipaddress.ip_network('11.0.0.0').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001526 self.assertEqual(True, ipaddress.ip_network(
1527 '172.31.255.255').is_private)
1528 self.assertEqual(False, ipaddress.ip_network('172.32.0.0').is_private)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001529 self.assertEqual(True,
1530 ipaddress.ip_network('169.254.1.0/24').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001531
1532 self.assertEqual(True,
1533 ipaddress.ip_interface(
1534 '169.254.100.200/24').is_link_local)
1535 self.assertEqual(False,
1536 ipaddress.ip_interface(
1537 '169.255.100.200/24').is_link_local)
1538
1539 self.assertEqual(True,
1540 ipaddress.ip_network(
1541 '127.100.200.254/32').is_loopback)
1542 self.assertEqual(True, ipaddress.ip_network(
1543 '127.42.0.0/16').is_loopback)
1544 self.assertEqual(False, ipaddress.ip_network('128.0.0.0').is_loopback)
Peter Moodye5019d52013-10-24 09:47:10 -07001545 self.assertEqual(False,
1546 ipaddress.ip_network('100.64.0.0/10').is_private)
Peter Moodybe9c1b12013-10-22 12:36:21 -07001547 self.assertEqual(False, ipaddress.ip_network('100.64.0.0/10').is_global)
Peter Moodye5019d52013-10-24 09:47:10 -07001548
Peter Moody22c31762013-10-21 13:58:06 -07001549 self.assertEqual(True,
1550 ipaddress.ip_network('192.0.2.128/25').is_private)
1551 self.assertEqual(True,
1552 ipaddress.ip_network('192.0.3.0/24').is_global)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001553
1554 # test addresses
Hynek Schlawackbcd30442012-06-04 14:19:39 +02001555 self.assertEqual(True, ipaddress.ip_address('0.0.0.0').is_unspecified)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001556 self.assertEqual(True, ipaddress.ip_address('224.1.1.1').is_multicast)
1557 self.assertEqual(False, ipaddress.ip_address('240.0.0.0').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001558 self.assertEqual(True, ipaddress.ip_address('240.0.0.1').is_reserved)
1559 self.assertEqual(False,
1560 ipaddress.ip_address('239.255.255.255').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001561
1562 self.assertEqual(True, ipaddress.ip_address('192.168.1.1').is_private)
1563 self.assertEqual(False, ipaddress.ip_address('192.169.0.0').is_private)
1564 self.assertEqual(True, ipaddress.ip_address(
1565 '10.255.255.255').is_private)
1566 self.assertEqual(False, ipaddress.ip_address('11.0.0.0').is_private)
1567 self.assertEqual(True, ipaddress.ip_address(
1568 '172.31.255.255').is_private)
1569 self.assertEqual(False, ipaddress.ip_address('172.32.0.0').is_private)
1570
1571 self.assertEqual(True,
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001572 ipaddress.ip_address('169.254.100.200').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001573 self.assertEqual(False,
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001574 ipaddress.ip_address('169.255.100.200').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001575
1576 self.assertEqual(True,
1577 ipaddress.ip_address('127.100.200.254').is_loopback)
1578 self.assertEqual(True, ipaddress.ip_address('127.42.0.0').is_loopback)
1579 self.assertEqual(False, ipaddress.ip_address('128.0.0.0').is_loopback)
1580 self.assertEqual(True, ipaddress.ip_network('0.0.0.0').is_unspecified)
1581
1582 def testReservedIpv6(self):
1583
1584 self.assertEqual(True, ipaddress.ip_network('ffff::').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001585 self.assertEqual(True, ipaddress.ip_network(2**128 - 1).is_multicast)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001586 self.assertEqual(True, ipaddress.ip_network('ff00::').is_multicast)
1587 self.assertEqual(False, ipaddress.ip_network('fdff::').is_multicast)
1588
1589 self.assertEqual(True, ipaddress.ip_network('fecf::').is_site_local)
1590 self.assertEqual(True, ipaddress.ip_network(
1591 'feff:ffff:ffff:ffff::').is_site_local)
1592 self.assertEqual(False, ipaddress.ip_network(
1593 'fbf:ffff::').is_site_local)
1594 self.assertEqual(False, ipaddress.ip_network('ff00::').is_site_local)
1595
1596 self.assertEqual(True, ipaddress.ip_network('fc00::').is_private)
1597 self.assertEqual(True, ipaddress.ip_network(
1598 'fc00:ffff:ffff:ffff::').is_private)
1599 self.assertEqual(False, ipaddress.ip_network('fbff:ffff::').is_private)
1600 self.assertEqual(False, ipaddress.ip_network('fe00::').is_private)
1601
1602 self.assertEqual(True, ipaddress.ip_network('fea0::').is_link_local)
1603 self.assertEqual(True, ipaddress.ip_network(
1604 'febf:ffff::').is_link_local)
1605 self.assertEqual(False, ipaddress.ip_network(
1606 'fe7f:ffff::').is_link_local)
1607 self.assertEqual(False, ipaddress.ip_network('fec0::').is_link_local)
1608
1609 self.assertEqual(True, ipaddress.ip_interface('0:0::0:01').is_loopback)
1610 self.assertEqual(False, ipaddress.ip_interface('::1/127').is_loopback)
1611 self.assertEqual(False, ipaddress.ip_network('::').is_loopback)
1612 self.assertEqual(False, ipaddress.ip_network('::2').is_loopback)
1613
1614 self.assertEqual(True, ipaddress.ip_network('0::0').is_unspecified)
1615 self.assertEqual(False, ipaddress.ip_network('::1').is_unspecified)
1616 self.assertEqual(False, ipaddress.ip_network('::/127').is_unspecified)
1617
Peter Moody22c31762013-10-21 13:58:06 -07001618 self.assertEqual(True,
1619 ipaddress.ip_network('2001::1/128').is_private)
1620 self.assertEqual(True,
1621 ipaddress.ip_network('200::1/128').is_global)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001622 # test addresses
1623 self.assertEqual(True, ipaddress.ip_address('ffff::').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001624 self.assertEqual(True, ipaddress.ip_address(2**128 - 1).is_multicast)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001625 self.assertEqual(True, ipaddress.ip_address('ff00::').is_multicast)
1626 self.assertEqual(False, ipaddress.ip_address('fdff::').is_multicast)
1627
1628 self.assertEqual(True, ipaddress.ip_address('fecf::').is_site_local)
1629 self.assertEqual(True, ipaddress.ip_address(
1630 'feff:ffff:ffff:ffff::').is_site_local)
1631 self.assertEqual(False, ipaddress.ip_address(
1632 'fbf:ffff::').is_site_local)
1633 self.assertEqual(False, ipaddress.ip_address('ff00::').is_site_local)
1634
1635 self.assertEqual(True, ipaddress.ip_address('fc00::').is_private)
1636 self.assertEqual(True, ipaddress.ip_address(
1637 'fc00:ffff:ffff:ffff::').is_private)
1638 self.assertEqual(False, ipaddress.ip_address('fbff:ffff::').is_private)
1639 self.assertEqual(False, ipaddress.ip_address('fe00::').is_private)
1640
1641 self.assertEqual(True, ipaddress.ip_address('fea0::').is_link_local)
1642 self.assertEqual(True, ipaddress.ip_address(
1643 'febf:ffff::').is_link_local)
1644 self.assertEqual(False, ipaddress.ip_address(
1645 'fe7f:ffff::').is_link_local)
1646 self.assertEqual(False, ipaddress.ip_address('fec0::').is_link_local)
1647
1648 self.assertEqual(True, ipaddress.ip_address('0:0::0:01').is_loopback)
1649 self.assertEqual(True, ipaddress.ip_address('::1').is_loopback)
1650 self.assertEqual(False, ipaddress.ip_address('::2').is_loopback)
1651
1652 self.assertEqual(True, ipaddress.ip_address('0::0').is_unspecified)
1653 self.assertEqual(False, ipaddress.ip_address('::1').is_unspecified)
1654
1655 # some generic IETF reserved addresses
1656 self.assertEqual(True, ipaddress.ip_address('100::').is_reserved)
1657 self.assertEqual(True, ipaddress.ip_network('4000::1/128').is_reserved)
1658
1659 def testIpv4Mapped(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001660 self.assertEqual(
1661 ipaddress.ip_address('::ffff:192.168.1.1').ipv4_mapped,
1662 ipaddress.ip_address('192.168.1.1'))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001663 self.assertEqual(ipaddress.ip_address('::c0a8:101').ipv4_mapped, None)
1664 self.assertEqual(ipaddress.ip_address('::ffff:c0a8:101').ipv4_mapped,
1665 ipaddress.ip_address('192.168.1.1'))
1666
1667 def testAddrExclude(self):
1668 addr1 = ipaddress.ip_network('10.1.1.0/24')
1669 addr2 = ipaddress.ip_network('10.1.1.0/26')
1670 addr3 = ipaddress.ip_network('10.2.1.0/24')
1671 addr4 = ipaddress.ip_address('10.1.1.0')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001672 addr5 = ipaddress.ip_network('2001:db8::0/32')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001673 self.assertEqual(sorted(list(addr1.address_exclude(addr2))),
1674 [ipaddress.ip_network('10.1.1.64/26'),
1675 ipaddress.ip_network('10.1.1.128/25')])
1676 self.assertRaises(ValueError, list, addr1.address_exclude(addr3))
1677 self.assertRaises(TypeError, list, addr1.address_exclude(addr4))
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001678 self.assertRaises(TypeError, list, addr1.address_exclude(addr5))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001679 self.assertEqual(list(addr1.address_exclude(addr1)), [])
1680
1681 def testHash(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001682 self.assertEqual(hash(ipaddress.ip_interface('10.1.1.0/24')),
1683 hash(ipaddress.ip_interface('10.1.1.0/24')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001684 self.assertEqual(hash(ipaddress.ip_network('10.1.1.0/24')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001685 hash(ipaddress.ip_network('10.1.1.0/24')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001686 self.assertEqual(hash(ipaddress.ip_address('10.1.1.0')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001687 hash(ipaddress.ip_address('10.1.1.0')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001688 # i70
1689 self.assertEqual(hash(ipaddress.ip_address('1.2.3.4')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001690 hash(ipaddress.ip_address(
Nick Coghlandc9b2552012-05-20 21:01:57 +10001691 int(ipaddress.ip_address('1.2.3.4')._ip))))
1692 ip1 = ipaddress.ip_address('10.1.1.0')
1693 ip2 = ipaddress.ip_address('1::')
1694 dummy = {}
1695 dummy[self.ipv4_address] = None
1696 dummy[self.ipv6_address] = None
1697 dummy[ip1] = None
1698 dummy[ip2] = None
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001699 self.assertIn(self.ipv4_address, dummy)
1700 self.assertIn(ip2, dummy)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001701
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001702 def testIPBases(self):
1703 net = self.ipv4_network
1704 self.assertEqual('1.2.3.0/24', net.compressed)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001705 net = self.ipv6_network
1706 self.assertRaises(ValueError, net._string_from_ip_int, 2**128 + 1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001707
Hynek Schlawack454a74d2012-06-04 18:14:02 +02001708 def testIPv6NetworkHelpers(self):
1709 net = self.ipv6_network
1710 self.assertEqual('2001:658:22a:cafe::/64', net.with_prefixlen)
1711 self.assertEqual('2001:658:22a:cafe::/ffff:ffff:ffff:ffff::',
1712 net.with_netmask)
1713 self.assertEqual('2001:658:22a:cafe::/::ffff:ffff:ffff:ffff',
1714 net.with_hostmask)
1715 self.assertEqual('2001:658:22a:cafe::/64', str(net))
1716
1717 def testIPv4NetworkHelpers(self):
1718 net = self.ipv4_network
1719 self.assertEqual('1.2.3.0/24', net.with_prefixlen)
1720 self.assertEqual('1.2.3.0/255.255.255.0', net.with_netmask)
1721 self.assertEqual('1.2.3.0/0.0.0.255', net.with_hostmask)
1722 self.assertEqual('1.2.3.0/24', str(net))
1723
Nick Coghlandc9b2552012-05-20 21:01:57 +10001724 def testCopyConstructor(self):
1725 addr1 = ipaddress.ip_network('10.1.1.0/24')
1726 addr2 = ipaddress.ip_network(addr1)
1727 addr3 = ipaddress.ip_interface('2001:658:22a:cafe:200::1/64')
1728 addr4 = ipaddress.ip_interface(addr3)
1729 addr5 = ipaddress.IPv4Address('1.1.1.1')
1730 addr6 = ipaddress.IPv6Address('2001:658:22a:cafe:200::1')
1731
1732 self.assertEqual(addr1, addr2)
1733 self.assertEqual(addr3, addr4)
1734 self.assertEqual(addr5, ipaddress.IPv4Address(addr5))
1735 self.assertEqual(addr6, ipaddress.IPv6Address(addr6))
1736
1737 def testCompressIPv6Address(self):
1738 test_addresses = {
1739 '1:2:3:4:5:6:7:8': '1:2:3:4:5:6:7:8/128',
1740 '2001:0:0:4:0:0:0:8': '2001:0:0:4::8/128',
1741 '2001:0:0:4:5:6:7:8': '2001::4:5:6:7:8/128',
1742 '2001:0:3:4:5:6:7:8': '2001:0:3:4:5:6:7:8/128',
1743 '2001:0:3:4:5:6:7:8': '2001:0:3:4:5:6:7:8/128',
1744 '0:0:3:0:0:0:0:ffff': '0:0:3::ffff/128',
1745 '0:0:0:4:0:0:0:ffff': '::4:0:0:0:ffff/128',
1746 '0:0:0:0:5:0:0:ffff': '::5:0:0:ffff/128',
1747 '1:0:0:4:0:0:7:8': '1::4:0:0:7:8/128',
1748 '0:0:0:0:0:0:0:0': '::/128',
1749 '0:0:0:0:0:0:0:0/0': '::/0',
1750 '0:0:0:0:0:0:0:1': '::1/128',
1751 '2001:0658:022a:cafe:0000:0000:0000:0000/66':
1752 '2001:658:22a:cafe::/66',
1753 '::1.2.3.4': '::102:304/128',
1754 '1:2:3:4:5:ffff:1.2.3.4': '1:2:3:4:5:ffff:102:304/128',
1755 '::7:6:5:4:3:2:1': '0:7:6:5:4:3:2:1/128',
1756 '::7:6:5:4:3:2:0': '0:7:6:5:4:3:2:0/128',
1757 '7:6:5:4:3:2:1::': '7:6:5:4:3:2:1:0/128',
1758 '0:6:5:4:3:2:1::': '0:6:5:4:3:2:1:0/128',
1759 }
1760 for uncompressed, compressed in list(test_addresses.items()):
1761 self.assertEqual(compressed, str(ipaddress.IPv6Interface(
1762 uncompressed)))
1763
1764 def testExplodeShortHandIpStr(self):
1765 addr1 = ipaddress.IPv6Interface('2001::1')
1766 addr2 = ipaddress.IPv6Address('2001:0:5ef5:79fd:0:59d:a0e5:ba1')
1767 addr3 = ipaddress.IPv6Network('2001::/96')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001768 addr4 = ipaddress.IPv4Address('192.168.178.1')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001769 self.assertEqual('2001:0000:0000:0000:0000:0000:0000:0001/128',
1770 addr1.exploded)
1771 self.assertEqual('0000:0000:0000:0000:0000:0000:0000:0001/128',
1772 ipaddress.IPv6Interface('::1/128').exploded)
1773 # issue 77
1774 self.assertEqual('2001:0000:5ef5:79fd:0000:059d:a0e5:0ba1',
1775 addr2.exploded)
1776 self.assertEqual('2001:0000:0000:0000:0000:0000:0000:0000/96',
1777 addr3.exploded)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001778 self.assertEqual('192.168.178.1', addr4.exploded)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001779
Eric V. Smithebdaaf42014-04-14 12:58:07 -04001780 def testReversePointer(self):
1781 addr1 = ipaddress.IPv4Address('127.0.0.1')
1782 addr2 = ipaddress.IPv6Address('2001:db8::1')
1783 self.assertEqual('1.0.0.127.in-addr.arpa', addr1.reverse_pointer)
1784 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.' +
1785 'b.d.0.1.0.0.2.ip6.arpa',
1786 addr2.reverse_pointer)
1787
Nick Coghlandc9b2552012-05-20 21:01:57 +10001788 def testIntRepresentation(self):
1789 self.assertEqual(16909060, int(self.ipv4_address))
1790 self.assertEqual(42540616829182469433547762482097946625,
1791 int(self.ipv6_address))
1792
Nick Coghlandc9b2552012-05-20 21:01:57 +10001793 def testForceVersion(self):
1794 self.assertEqual(ipaddress.ip_network(1).version, 4)
Nick Coghlan51c30672012-05-27 00:25:58 +10001795 self.assertEqual(ipaddress.IPv6Network(1).version, 6)
Sandro Tosi876ecad2012-05-23 22:26:55 +02001796
Nick Coghlandc9b2552012-05-20 21:01:57 +10001797 def testWithStar(self):
Nick Coghlana8517ad2012-08-20 10:04:26 +10001798 self.assertEqual(self.ipv4_interface.with_prefixlen, "1.2.3.4/24")
1799 self.assertEqual(self.ipv4_interface.with_netmask,
Nick Coghlandc9b2552012-05-20 21:01:57 +10001800 "1.2.3.4/255.255.255.0")
Nick Coghlana8517ad2012-08-20 10:04:26 +10001801 self.assertEqual(self.ipv4_interface.with_hostmask,
Nick Coghlandc9b2552012-05-20 21:01:57 +10001802 "1.2.3.4/0.0.0.255")
1803
Nick Coghlana8517ad2012-08-20 10:04:26 +10001804 self.assertEqual(self.ipv6_interface.with_prefixlen,
Nick Coghlandc9b2552012-05-20 21:01:57 +10001805 '2001:658:22a:cafe:200::1/64')
Nick Coghlana8517ad2012-08-20 10:04:26 +10001806 self.assertEqual(self.ipv6_interface.with_netmask,
1807 '2001:658:22a:cafe:200::1/ffff:ffff:ffff:ffff::')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001808 # this probably don't make much sense, but it's included for
1809 # compatibility with ipv4
Nick Coghlana8517ad2012-08-20 10:04:26 +10001810 self.assertEqual(self.ipv6_interface.with_hostmask,
Nick Coghlandc9b2552012-05-20 21:01:57 +10001811 '2001:658:22a:cafe:200::1/::ffff:ffff:ffff:ffff')
1812
1813 def testNetworkElementCaching(self):
1814 # V4 - make sure we're empty
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001815 self.assertNotIn('network_address', self.ipv4_network._cache)
1816 self.assertNotIn('broadcast_address', self.ipv4_network._cache)
1817 self.assertNotIn('hostmask', self.ipv4_network._cache)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001818
1819 # V4 - populate and test
1820 self.assertEqual(self.ipv4_network.network_address,
1821 ipaddress.IPv4Address('1.2.3.0'))
1822 self.assertEqual(self.ipv4_network.broadcast_address,
1823 ipaddress.IPv4Address('1.2.3.255'))
1824 self.assertEqual(self.ipv4_network.hostmask,
1825 ipaddress.IPv4Address('0.0.0.255'))
1826
1827 # V4 - check we're cached
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001828 self.assertIn('broadcast_address', self.ipv4_network._cache)
1829 self.assertIn('hostmask', self.ipv4_network._cache)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001830
1831 # V6 - make sure we're empty
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001832 self.assertNotIn('broadcast_address', self.ipv6_network._cache)
1833 self.assertNotIn('hostmask', self.ipv6_network._cache)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001834
1835 # V6 - populate and test
1836 self.assertEqual(self.ipv6_network.network_address,
1837 ipaddress.IPv6Address('2001:658:22a:cafe::'))
1838 self.assertEqual(self.ipv6_interface.network.network_address,
1839 ipaddress.IPv6Address('2001:658:22a:cafe::'))
1840
1841 self.assertEqual(
1842 self.ipv6_network.broadcast_address,
1843 ipaddress.IPv6Address('2001:658:22a:cafe:ffff:ffff:ffff:ffff'))
1844 self.assertEqual(self.ipv6_network.hostmask,
1845 ipaddress.IPv6Address('::ffff:ffff:ffff:ffff'))
1846 self.assertEqual(
1847 self.ipv6_interface.network.broadcast_address,
1848 ipaddress.IPv6Address('2001:658:22a:cafe:ffff:ffff:ffff:ffff'))
1849 self.assertEqual(self.ipv6_interface.network.hostmask,
1850 ipaddress.IPv6Address('::ffff:ffff:ffff:ffff'))
1851
1852 # V6 - check we're cached
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001853 self.assertIn('broadcast_address', self.ipv6_network._cache)
1854 self.assertIn('hostmask', self.ipv6_network._cache)
1855 self.assertIn('broadcast_address', self.ipv6_interface.network._cache)
1856 self.assertIn('hostmask', self.ipv6_interface.network._cache)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001857
1858 def testTeredo(self):
1859 # stolen from wikipedia
1860 server = ipaddress.IPv4Address('65.54.227.120')
1861 client = ipaddress.IPv4Address('192.0.2.45')
1862 teredo_addr = '2001:0000:4136:e378:8000:63bf:3fff:fdd2'
1863 self.assertEqual((server, client),
1864 ipaddress.ip_address(teredo_addr).teredo)
1865 bad_addr = '2000::4136:e378:8000:63bf:3fff:fdd2'
1866 self.assertFalse(ipaddress.ip_address(bad_addr).teredo)
1867 bad_addr = '2001:0001:4136:e378:8000:63bf:3fff:fdd2'
1868 self.assertFalse(ipaddress.ip_address(bad_addr).teredo)
1869
1870 # i77
1871 teredo_addr = ipaddress.IPv6Address('2001:0:5ef5:79fd:0:59d:a0e5:ba1')
1872 self.assertEqual((ipaddress.IPv4Address('94.245.121.253'),
1873 ipaddress.IPv4Address('95.26.244.94')),
1874 teredo_addr.teredo)
1875
Nick Coghlandc9b2552012-05-20 21:01:57 +10001876 def testsixtofour(self):
1877 sixtofouraddr = ipaddress.ip_address('2002:ac1d:2d64::1')
1878 bad_addr = ipaddress.ip_address('2000:ac1d:2d64::1')
1879 self.assertEqual(ipaddress.IPv4Address('172.29.45.100'),
1880 sixtofouraddr.sixtofour)
1881 self.assertFalse(bad_addr.sixtofour)
1882
Nick Coghlandc9b2552012-05-20 21:01:57 +10001883
1884if __name__ == '__main__':
1885 unittest.main()