blob: e985329117f7acdee8d399f4824b00992024af71 [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
14
R David Murray75678652014-10-12 15:17:22 -040015
Nick Coghlan07c4e332012-07-08 23:06:45 +100016class BaseTestCase(unittest.TestCase):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +100017 # One big change in ipaddress over the original ipaddr module is
18 # error reporting that tries to assume users *don't know the rules*
19 # for what constitutes an RFC compliant IP address
20
Nick Coghlan07c4e332012-07-08 23:06:45 +100021 # Ensuring these errors are emitted correctly in all relevant cases
22 # meant moving to a more systematic test structure that allows the
23 # test structure to map more directly to the module structure
24
Nick Coghlan36f8dcd2012-07-07 19:23:53 +100025 # Note that if the constructors are refactored so that addresses with
26 # multiple problems get classified differently, that's OK - just
27 # move the affected examples to the newly appropriate test case.
28
Nick Coghlan07c4e332012-07-08 23:06:45 +100029 # There is some duplication between the original relatively ad hoc
30 # test suite and the new systematic tests. While some redundancy in
31 # testing is considered preferable to accidentally deleting a valid
32 # test, the original test suite will likely be reduced over time as
33 # redundant tests are identified.
Nick Coghlan36f8dcd2012-07-07 19:23:53 +100034
Nick Coghlan297b1432012-07-08 17:11:04 +100035 @property
36 def factory(self):
37 raise NotImplementedError
38
Nick Coghlan36f8dcd2012-07-07 19:23:53 +100039 @contextlib.contextmanager
40 def assertCleanError(self, exc_type, details, *args):
41 """
42 Ensure exception does not display a context by default
43
44 Wraps unittest.TestCase.assertRaisesRegex
45 """
46 if args:
47 details = details % args
48 cm = self.assertRaisesRegex(exc_type, details)
49 with cm as exc:
50 yield exc
51 # Ensure we produce clean tracebacks on failure
52 if exc.exception.__context__ is not None:
53 self.assertTrue(exc.exception.__suppress_context__)
54
55 def assertAddressError(self, details, *args):
56 """Ensure a clean AddressValueError"""
57 return self.assertCleanError(ipaddress.AddressValueError,
R David Murray75678652014-10-12 15:17:22 -040058 details, *args)
Nick Coghlan36f8dcd2012-07-07 19:23:53 +100059
60 def assertNetmaskError(self, details, *args):
61 """Ensure a clean NetmaskValueError"""
62 return self.assertCleanError(ipaddress.NetmaskValueError,
R David Murray75678652014-10-12 15:17:22 -040063 details, *args)
Nick Coghlan36f8dcd2012-07-07 19:23:53 +100064
Nick Coghlan07c4e332012-07-08 23:06:45 +100065 def assertInstancesEqual(self, lhs, rhs):
66 """Check constructor arguments produce equivalent instances"""
67 self.assertEqual(self.factory(lhs), self.factory(rhs))
68
R David Murray75678652014-10-12 15:17:22 -040069
Nick Coghlan07c4e332012-07-08 23:06:45 +100070class CommonTestMixin:
Nick Coghlan36f8dcd2012-07-07 19:23:53 +100071
72 def test_empty_address(self):
73 with self.assertAddressError("Address cannot be empty"):
Nick Coghlan297b1432012-07-08 17:11:04 +100074 self.factory("")
75
76 def test_floats_rejected(self):
77 with self.assertAddressError(re.escape(repr("1.0"))):
78 self.factory(1.0)
79
Nick Coghlane0c3f5e2012-08-05 18:20:17 +100080 def test_not_an_index_issue15559(self):
81 # Implementing __index__ makes for a very nasty interaction with the
82 # bytes constructor. Thus, we disallow implicit use as an integer
83 self.assertRaises(TypeError, operator.index, self.factory(1))
84 self.assertRaises(TypeError, hex, self.factory(1))
85 self.assertRaises(TypeError, bytes, self.factory(1))
86
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +020087 def pickle_test(self, addr):
88 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
89 with self.subTest(proto=proto):
90 x = self.factory(addr)
91 y = pickle.loads(pickle.dumps(x, proto))
92 self.assertEqual(y, x)
93
Nick Coghlane0c3f5e2012-08-05 18:20:17 +100094
Nick Coghlan07c4e332012-07-08 23:06:45 +100095class CommonTestMixin_v4(CommonTestMixin):
96
97 def test_leading_zeros(self):
98 self.assertInstancesEqual("000.000.000.000", "0.0.0.0")
99 self.assertInstancesEqual("192.168.000.001", "192.168.0.1")
100
101 def test_int(self):
102 self.assertInstancesEqual(0, "0.0.0.0")
103 self.assertInstancesEqual(3232235521, "192.168.0.1")
104
105 def test_packed(self):
106 self.assertInstancesEqual(bytes.fromhex("00000000"), "0.0.0.0")
107 self.assertInstancesEqual(bytes.fromhex("c0a80001"), "192.168.0.1")
Nick Coghlan297b1432012-07-08 17:11:04 +1000108
109 def test_negative_ints_rejected(self):
110 msg = "-1 (< 0) is not permitted as an IPv4 address"
111 with self.assertAddressError(re.escape(msg)):
112 self.factory(-1)
113
114 def test_large_ints_rejected(self):
115 msg = "%d (>= 2**32) is not permitted as an IPv4 address"
116 with self.assertAddressError(re.escape(msg % 2**32)):
117 self.factory(2**32)
118
119 def test_bad_packed_length(self):
120 def assertBadLength(length):
Nick Coghlan07c4e332012-07-08 23:06:45 +1000121 addr = bytes(length)
Nick Coghlan297b1432012-07-08 17:11:04 +1000122 msg = "%r (len %d != 4) is not permitted as an IPv4 address"
123 with self.assertAddressError(re.escape(msg % (addr, length))):
124 self.factory(addr)
125
126 assertBadLength(3)
127 assertBadLength(5)
128
R David Murray75678652014-10-12 15:17:22 -0400129
Nick Coghlan07c4e332012-07-08 23:06:45 +1000130class CommonTestMixin_v6(CommonTestMixin):
131
132 def test_leading_zeros(self):
133 self.assertInstancesEqual("0000::0000", "::")
134 self.assertInstancesEqual("000::c0a8:0001", "::c0a8:1")
135
136 def test_int(self):
137 self.assertInstancesEqual(0, "::")
138 self.assertInstancesEqual(3232235521, "::c0a8:1")
139
140 def test_packed(self):
141 addr = bytes(12) + bytes.fromhex("00000000")
142 self.assertInstancesEqual(addr, "::")
143 addr = bytes(12) + bytes.fromhex("c0a80001")
144 self.assertInstancesEqual(addr, "::c0a8:1")
145 addr = bytes.fromhex("c0a80001") + bytes(12)
146 self.assertInstancesEqual(addr, "c0a8:1::")
Nick Coghlan297b1432012-07-08 17:11:04 +1000147
148 def test_negative_ints_rejected(self):
149 msg = "-1 (< 0) is not permitted as an IPv6 address"
150 with self.assertAddressError(re.escape(msg)):
151 self.factory(-1)
152
153 def test_large_ints_rejected(self):
154 msg = "%d (>= 2**128) is not permitted as an IPv6 address"
155 with self.assertAddressError(re.escape(msg % 2**128)):
156 self.factory(2**128)
157
158 def test_bad_packed_length(self):
159 def assertBadLength(length):
Nick Coghlan07c4e332012-07-08 23:06:45 +1000160 addr = bytes(length)
Nick Coghlan297b1432012-07-08 17:11:04 +1000161 msg = "%r (len %d != 16) is not permitted as an IPv6 address"
162 with self.assertAddressError(re.escape(msg % (addr, length))):
163 self.factory(addr)
164 self.factory(addr)
165
166 assertBadLength(15)
167 assertBadLength(17)
168
169
Nick Coghlan07c4e332012-07-08 23:06:45 +1000170class AddressTestCase_v4(BaseTestCase, CommonTestMixin_v4):
Nick Coghlan297b1432012-07-08 17:11:04 +1000171 factory = ipaddress.IPv4Address
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000172
173 def test_network_passed_as_address(self):
174 addr = "127.0.0.1/24"
175 with self.assertAddressError("Unexpected '/' in %r", addr):
176 ipaddress.IPv4Address(addr)
177
178 def test_bad_address_split(self):
179 def assertBadSplit(addr):
180 with self.assertAddressError("Expected 4 octets in %r", addr):
181 ipaddress.IPv4Address(addr)
182
183 assertBadSplit("127.0.1")
184 assertBadSplit("42.42.42.42.42")
185 assertBadSplit("42.42.42")
186 assertBadSplit("42.42")
187 assertBadSplit("42")
188 assertBadSplit("42..42.42.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("016.016.016")
194 assertBadSplit("016.016")
195 assertBadSplit("016")
196 assertBadSplit("000")
197 assertBadSplit("0x0a.0x0a.0x0a")
198 assertBadSplit("0x0a.0x0a")
199 assertBadSplit("0x0a")
200 assertBadSplit(".")
201 assertBadSplit("bogus")
202 assertBadSplit("bogus.com")
203 assertBadSplit("1000")
204 assertBadSplit("1000000000000000")
205 assertBadSplit("192.168.0.1.com")
206
207 def test_empty_octet(self):
208 def assertBadOctet(addr):
209 with self.assertAddressError("Empty octet not permitted in %r",
R David Murray75678652014-10-12 15:17:22 -0400210 addr):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000211 ipaddress.IPv4Address(addr)
212
213 assertBadOctet("42..42.42")
214 assertBadOctet("...")
215
216 def test_invalid_characters(self):
217 def assertBadOctet(addr, octet):
218 msg = "Only decimal digits permitted in %r in %r" % (octet, addr)
219 with self.assertAddressError(re.escape(msg)):
220 ipaddress.IPv4Address(addr)
221
222 assertBadOctet("0x0a.0x0a.0x0a.0x0a", "0x0a")
Nick Coghlan07c4e332012-07-08 23:06:45 +1000223 assertBadOctet("0xa.0x0a.0x0a.0x0a", "0xa")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000224 assertBadOctet("42.42.42.-0", "-0")
225 assertBadOctet("42.42.42.+0", "+0")
226 assertBadOctet("42.42.42.-42", "-42")
227 assertBadOctet("+1.+2.+3.4", "+1")
228 assertBadOctet("1.2.3.4e0", "4e0")
229 assertBadOctet("1.2.3.4::", "4::")
230 assertBadOctet("1.a.2.3", "a")
231
Nick Coghlan07c4e332012-07-08 23:06:45 +1000232 def test_octal_decimal_ambiguity(self):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000233 def assertBadOctet(addr, octet):
Nick Coghlan07c4e332012-07-08 23:06:45 +1000234 msg = "Ambiguous (octal/decimal) value in %r not permitted in %r"
235 with self.assertAddressError(re.escape(msg % (octet, addr))):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000236 ipaddress.IPv4Address(addr)
237
238 assertBadOctet("016.016.016.016", "016")
239 assertBadOctet("001.000.008.016", "008")
Nick Coghlan07c4e332012-07-08 23:06:45 +1000240
241 def test_octet_length(self):
242 def assertBadOctet(addr, octet):
243 msg = "At most 3 characters permitted in %r in %r"
244 with self.assertAddressError(re.escape(msg % (octet, addr))):
245 ipaddress.IPv4Address(addr)
246
247 assertBadOctet("0000.000.000.000", "0000")
248 assertBadOctet("12345.67899.-54321.-98765", "12345")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000249
250 def test_octet_limit(self):
251 def assertBadOctet(addr, octet):
Nick Coghlanb582ecc2012-07-07 22:15:22 +1000252 msg = "Octet %d (> 255) not permitted in %r" % (octet, addr)
253 with self.assertAddressError(re.escape(msg)):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000254 ipaddress.IPv4Address(addr)
255
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000256 assertBadOctet("257.0.0.0", 257)
Nick Coghlan07c4e332012-07-08 23:06:45 +1000257 assertBadOctet("192.168.0.999", 999)
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000258
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +0200259 def test_pickle(self):
260 self.pickle_test('192.0.2.1')
261
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000262
Nick Coghlan07c4e332012-07-08 23:06:45 +1000263class AddressTestCase_v6(BaseTestCase, CommonTestMixin_v6):
Nick Coghlan297b1432012-07-08 17:11:04 +1000264 factory = ipaddress.IPv6Address
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000265
266 def test_network_passed_as_address(self):
267 addr = "::1/24"
268 with self.assertAddressError("Unexpected '/' in %r", addr):
269 ipaddress.IPv6Address(addr)
270
271 def test_bad_address_split_v6_not_enough_parts(self):
272 def assertBadSplit(addr):
273 msg = "At least 3 parts expected in %r"
274 with self.assertAddressError(msg, addr):
275 ipaddress.IPv6Address(addr)
276
277 assertBadSplit(":")
278 assertBadSplit(":1")
279 assertBadSplit("FEDC:9878")
280
281 def test_bad_address_split_v6_too_many_colons(self):
282 def assertBadSplit(addr):
283 msg = "At most 8 colons permitted in %r"
284 with self.assertAddressError(msg, addr):
285 ipaddress.IPv6Address(addr)
286
287 assertBadSplit("9:8:7:6:5:4:3::2:1")
288 assertBadSplit("10:9:8:7:6:5:4:3:2:1")
289 assertBadSplit("::8:7:6:5:4:3:2:1")
290 assertBadSplit("8:7:6:5:4:3:2:1::")
291 # A trailing IPv4 address is two parts
292 assertBadSplit("10:9:8:7:6:5:4:3:42.42.42.42")
293
294 def test_bad_address_split_v6_too_many_parts(self):
295 def assertBadSplit(addr):
296 msg = "Exactly 8 parts expected without '::' in %r"
297 with self.assertAddressError(msg, addr):
298 ipaddress.IPv6Address(addr)
299
300 assertBadSplit("3ffe:0:0:0:0:0:0:0:1")
301 assertBadSplit("9:8:7:6:5:4:3:2:1")
302 assertBadSplit("7:6:5:4:3:2:1")
303 # A trailing IPv4 address is two parts
304 assertBadSplit("9:8:7:6:5:4:3:42.42.42.42")
305 assertBadSplit("7:6:5:4:3:42.42.42.42")
306
307 def test_bad_address_split_v6_too_many_parts_with_double_colon(self):
308 def assertBadSplit(addr):
309 msg = "Expected at most 7 other parts with '::' in %r"
310 with self.assertAddressError(msg, addr):
311 ipaddress.IPv6Address(addr)
312
313 assertBadSplit("1:2:3:4::5:6:7:8")
314
315 def test_bad_address_split_v6_repeated_double_colon(self):
316 def assertBadSplit(addr):
317 msg = "At most one '::' permitted in %r"
318 with self.assertAddressError(msg, addr):
319 ipaddress.IPv6Address(addr)
320
321 assertBadSplit("3ffe::1::1")
322 assertBadSplit("1::2::3::4:5")
323 assertBadSplit("2001::db:::1")
324 assertBadSplit("3ffe::1::")
325 assertBadSplit("::3ffe::1")
326 assertBadSplit(":3ffe::1::1")
327 assertBadSplit("3ffe::1::1:")
328 assertBadSplit(":3ffe::1::1:")
329 assertBadSplit(":::")
330 assertBadSplit('2001:db8:::1')
331
332 def test_bad_address_split_v6_leading_colon(self):
333 def assertBadSplit(addr):
334 msg = "Leading ':' only permitted as part of '::' in %r"
335 with self.assertAddressError(msg, addr):
336 ipaddress.IPv6Address(addr)
337
338 assertBadSplit(":2001:db8::1")
339 assertBadSplit(":1:2:3:4:5:6:7")
340 assertBadSplit(":1:2:3:4:5:6:")
341 assertBadSplit(":6:5:4:3:2:1::")
342
343 def test_bad_address_split_v6_trailing_colon(self):
344 def assertBadSplit(addr):
345 msg = "Trailing ':' only permitted as part of '::' in %r"
346 with self.assertAddressError(msg, addr):
347 ipaddress.IPv6Address(addr)
348
349 assertBadSplit("2001:db8::1:")
350 assertBadSplit("1:2:3:4:5:6:7:")
351 assertBadSplit("::1.2.3.4:")
352 assertBadSplit("::7:6:5:4:3:2:")
353
354 def test_bad_v4_part_in(self):
355 def assertBadAddressPart(addr, v4_error):
356 with self.assertAddressError("%s in %r", v4_error, addr):
357 ipaddress.IPv6Address(addr)
358
359 assertBadAddressPart("3ffe::1.net", "Expected 4 octets in '1.net'")
360 assertBadAddressPart("3ffe::127.0.1",
361 "Expected 4 octets in '127.0.1'")
362 assertBadAddressPart("::1.2.3",
363 "Expected 4 octets in '1.2.3'")
364 assertBadAddressPart("::1.2.3.4.5",
365 "Expected 4 octets in '1.2.3.4.5'")
366 assertBadAddressPart("3ffe::1.1.1.net",
367 "Only decimal digits permitted in 'net' "
368 "in '1.1.1.net'")
369
370 def test_invalid_characters(self):
371 def assertBadPart(addr, part):
372 msg = "Only hex digits permitted in %r in %r" % (part, addr)
373 with self.assertAddressError(re.escape(msg)):
374 ipaddress.IPv6Address(addr)
375
376 assertBadPart("3ffe::goog", "goog")
377 assertBadPart("3ffe::-0", "-0")
378 assertBadPart("3ffe::+0", "+0")
379 assertBadPart("3ffe::-1", "-1")
380 assertBadPart("1.2.3.4::", "1.2.3.4")
381 assertBadPart('1234:axy::b', "axy")
382
383 def test_part_length(self):
384 def assertBadPart(addr, part):
385 msg = "At most 4 characters permitted in %r in %r"
386 with self.assertAddressError(msg, part, addr):
387 ipaddress.IPv6Address(addr)
388
Nick Coghlan07c4e332012-07-08 23:06:45 +1000389 assertBadPart("::00000", "00000")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000390 assertBadPart("3ffe::10000", "10000")
391 assertBadPart("02001:db8::", "02001")
392 assertBadPart('2001:888888::1', "888888")
393
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +0200394 def test_pickle(self):
395 self.pickle_test('2001:db8::')
396
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000397
Nick Coghlan07c4e332012-07-08 23:06:45 +1000398class NetmaskTestMixin_v4(CommonTestMixin_v4):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000399 """Input validation on interfaces and networks is very similar"""
400
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000401 def test_split_netmask(self):
402 addr = "1.2.3.4/32/24"
403 with self.assertAddressError("Only one '/' permitted in %r" % addr):
404 self.factory(addr)
405
406 def test_address_errors(self):
407 def assertBadAddress(addr, details):
408 with self.assertAddressError(details):
409 self.factory(addr)
410
Nick Coghlan297b1432012-07-08 17:11:04 +1000411 assertBadAddress("/", "Address cannot be empty")
412 assertBadAddress("/8", "Address cannot be empty")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000413 assertBadAddress("bogus", "Expected 4 octets")
414 assertBadAddress("google.com", "Expected 4 octets")
415 assertBadAddress("10/8", "Expected 4 octets")
416 assertBadAddress("::1.2.3.4", "Only decimal digits")
Nick Coghlanb582ecc2012-07-07 22:15:22 +1000417 assertBadAddress("1.2.3.256", re.escape("256 (> 255)"))
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000418
Nick Coghlan932346f2014-02-08 23:17:36 +1000419 def test_valid_netmask(self):
420 self.assertEqual(str(self.factory('192.0.2.0/255.255.255.0')),
421 '192.0.2.0/24')
422 for i in range(0, 33):
423 # Generate and re-parse the CIDR format (trivial).
424 net_str = '0.0.0.0/%d' % i
425 net = self.factory(net_str)
426 self.assertEqual(str(net), net_str)
427 # Generate and re-parse the expanded netmask.
428 self.assertEqual(
429 str(self.factory('0.0.0.0/%s' % net.netmask)), net_str)
430 # Zero prefix is treated as decimal.
431 self.assertEqual(str(self.factory('0.0.0.0/0%d' % i)), net_str)
432 # Generate and re-parse the expanded hostmask. The ambiguous
433 # cases (/0 and /32) are treated as netmasks.
434 if i in (32, 0):
435 net_str = '0.0.0.0/%d' % (32 - i)
436 self.assertEqual(
437 str(self.factory('0.0.0.0/%s' % net.hostmask)), net_str)
438
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000439 def test_netmask_errors(self):
440 def assertBadNetmask(addr, netmask):
Nick Coghlan932346f2014-02-08 23:17:36 +1000441 msg = "%r is not a valid netmask" % netmask
442 with self.assertNetmaskError(re.escape(msg)):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000443 self.factory("%s/%s" % (addr, netmask))
444
445 assertBadNetmask("1.2.3.4", "")
Nick Coghlan932346f2014-02-08 23:17:36 +1000446 assertBadNetmask("1.2.3.4", "-1")
447 assertBadNetmask("1.2.3.4", "+1")
448 assertBadNetmask("1.2.3.4", " 1 ")
449 assertBadNetmask("1.2.3.4", "0x1")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000450 assertBadNetmask("1.2.3.4", "33")
451 assertBadNetmask("1.2.3.4", "254.254.255.256")
Nick Coghlan932346f2014-02-08 23:17:36 +1000452 assertBadNetmask("1.2.3.4", "1.a.2.3")
Nick Coghlan07c4e332012-07-08 23:06:45 +1000453 assertBadNetmask("1.1.1.1", "254.xyz.2.3")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000454 assertBadNetmask("1.1.1.1", "240.255.0.0")
Nick Coghlan932346f2014-02-08 23:17:36 +1000455 assertBadNetmask("1.1.1.1", "255.254.128.0")
456 assertBadNetmask("1.1.1.1", "0.1.127.255")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000457 assertBadNetmask("1.1.1.1", "pudding")
Nick Coghlan932346f2014-02-08 23:17:36 +1000458 assertBadNetmask("1.1.1.1", "::")
459
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +0200460 def test_pickle(self):
461 self.pickle_test('192.0.2.0/27')
462 self.pickle_test('192.0.2.0/31') # IPV4LENGTH - 1
463 self.pickle_test('192.0.2.0') # IPV4LENGTH
464
R David Murray75678652014-10-12 15:17:22 -0400465
Serhiy Storchakaa556af72015-01-18 22:56:47 +0200466class InterfaceTestCase_v4(BaseTestCase, NetmaskTestMixin_v4):
467 factory = ipaddress.IPv4Interface
468
469
Nick Coghlan07c4e332012-07-08 23:06:45 +1000470class NetworkTestCase_v4(BaseTestCase, NetmaskTestMixin_v4):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000471 factory = ipaddress.IPv4Network
472
473
Nick Coghlan07c4e332012-07-08 23:06:45 +1000474class NetmaskTestMixin_v6(CommonTestMixin_v6):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000475 """Input validation on interfaces and networks is very similar"""
476
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000477 def test_split_netmask(self):
478 addr = "cafe:cafe::/128/190"
479 with self.assertAddressError("Only one '/' permitted in %r" % addr):
480 self.factory(addr)
481
482 def test_address_errors(self):
483 def assertBadAddress(addr, details):
484 with self.assertAddressError(details):
485 self.factory(addr)
486
Nick Coghlan297b1432012-07-08 17:11:04 +1000487 assertBadAddress("/", "Address cannot be empty")
488 assertBadAddress("/8", "Address cannot be empty")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000489 assertBadAddress("google.com", "At least 3 parts")
490 assertBadAddress("1.2.3.4", "At least 3 parts")
491 assertBadAddress("10/8", "At least 3 parts")
492 assertBadAddress("1234:axy::b", "Only hex digits")
493
Nick Coghlan932346f2014-02-08 23:17:36 +1000494 def test_valid_netmask(self):
495 # We only support CIDR for IPv6, because expanded netmasks are not
496 # standard notation.
497 self.assertEqual(str(self.factory('2001:db8::/32')), '2001:db8::/32')
498 for i in range(0, 129):
499 # Generate and re-parse the CIDR format (trivial).
500 net_str = '::/%d' % i
501 self.assertEqual(str(self.factory(net_str)), net_str)
502 # Zero prefix is treated as decimal.
503 self.assertEqual(str(self.factory('::/0%d' % i)), net_str)
504
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000505 def test_netmask_errors(self):
506 def assertBadNetmask(addr, netmask):
Nick Coghlan932346f2014-02-08 23:17:36 +1000507 msg = "%r is not a valid netmask" % netmask
508 with self.assertNetmaskError(re.escape(msg)):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000509 self.factory("%s/%s" % (addr, netmask))
510
511 assertBadNetmask("::1", "")
512 assertBadNetmask("::1", "::1")
513 assertBadNetmask("::1", "1::")
Nick Coghlan932346f2014-02-08 23:17:36 +1000514 assertBadNetmask("::1", "-1")
515 assertBadNetmask("::1", "+1")
516 assertBadNetmask("::1", " 1 ")
517 assertBadNetmask("::1", "0x1")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000518 assertBadNetmask("::1", "129")
Nick Coghlan932346f2014-02-08 23:17:36 +1000519 assertBadNetmask("::1", "1.2.3.4")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000520 assertBadNetmask("::1", "pudding")
Nick Coghlan932346f2014-02-08 23:17:36 +1000521 assertBadNetmask("::", "::")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000522
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +0200523 def test_pickle(self):
524 self.pickle_test('2001:db8::1000/124')
525 self.pickle_test('2001:db8::1000/127') # IPV6LENGTH - 1
526 self.pickle_test('2001:db8::1000') # IPV6LENGTH
527
R David Murray75678652014-10-12 15:17:22 -0400528
Nick Coghlan07c4e332012-07-08 23:06:45 +1000529class InterfaceTestCase_v6(BaseTestCase, NetmaskTestMixin_v6):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000530 factory = ipaddress.IPv6Interface
531
R David Murray75678652014-10-12 15:17:22 -0400532
Nick Coghlan07c4e332012-07-08 23:06:45 +1000533class NetworkTestCase_v6(BaseTestCase, NetmaskTestMixin_v6):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000534 factory = ipaddress.IPv6Network
535
536
Nick Coghlan07c4e332012-07-08 23:06:45 +1000537class FactoryFunctionErrors(BaseTestCase):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000538
539 def assertFactoryError(self, factory, kind):
540 """Ensure a clean ValueError with the expected message"""
541 addr = "camelot"
542 msg = '%r does not appear to be an IPv4 or IPv6 %s'
543 with self.assertCleanError(ValueError, msg, addr, kind):
544 factory(addr)
545
546 def test_ip_address(self):
547 self.assertFactoryError(ipaddress.ip_address, "address")
548
549 def test_ip_interface(self):
550 self.assertFactoryError(ipaddress.ip_interface, "interface")
551
552 def test_ip_network(self):
553 self.assertFactoryError(ipaddress.ip_network, "network")
554
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200555
Serhiy Storchakaf186e122015-01-26 10:11:16 +0200556@functools.total_ordering
557class LargestObject:
558 def __eq__(self, other):
559 return isinstance(other, LargestObject)
560 def __lt__(self, other):
561 return False
562
563@functools.total_ordering
564class SmallestObject:
565 def __eq__(self, other):
566 return isinstance(other, SmallestObject)
567 def __gt__(self, other):
568 return False
569
Nick Coghlan3008ec02012-07-08 00:45:33 +1000570class ComparisonTests(unittest.TestCase):
571
572 v4addr = ipaddress.IPv4Address(1)
573 v4net = ipaddress.IPv4Network(1)
574 v4intf = ipaddress.IPv4Interface(1)
575 v6addr = ipaddress.IPv6Address(1)
576 v6net = ipaddress.IPv6Network(1)
577 v6intf = ipaddress.IPv6Interface(1)
578
579 v4_addresses = [v4addr, v4intf]
580 v4_objects = v4_addresses + [v4net]
581 v6_addresses = [v6addr, v6intf]
582 v6_objects = v6_addresses + [v6net]
583 objects = v4_objects + v6_objects
584
585 def test_foreign_type_equality(self):
586 # __eq__ should never raise TypeError directly
587 other = object()
588 for obj in self.objects:
589 self.assertNotEqual(obj, other)
590 self.assertFalse(obj == other)
591 self.assertEqual(obj.__eq__(other), NotImplemented)
592 self.assertEqual(obj.__ne__(other), NotImplemented)
593
594 def test_mixed_type_equality(self):
595 # Ensure none of the internal objects accidentally
596 # expose the right set of attributes to become "equal"
597 for lhs in self.objects:
598 for rhs in self.objects:
599 if lhs is rhs:
600 continue
601 self.assertNotEqual(lhs, rhs)
602
603 def test_containment(self):
604 for obj in self.v4_addresses:
605 self.assertIn(obj, self.v4net)
606 for obj in self.v6_addresses:
607 self.assertIn(obj, self.v6net)
608 for obj in self.v4_objects + [self.v6net]:
609 self.assertNotIn(obj, self.v6net)
610 for obj in self.v6_objects + [self.v4net]:
611 self.assertNotIn(obj, self.v4net)
612
613 def test_mixed_type_ordering(self):
614 for lhs in self.objects:
615 for rhs in self.objects:
616 if isinstance(lhs, type(rhs)) or isinstance(rhs, type(lhs)):
617 continue
618 self.assertRaises(TypeError, lambda: lhs < rhs)
619 self.assertRaises(TypeError, lambda: lhs > rhs)
620 self.assertRaises(TypeError, lambda: lhs <= rhs)
621 self.assertRaises(TypeError, lambda: lhs >= rhs)
622
Serhiy Storchakaf186e122015-01-26 10:11:16 +0200623 def test_foreign_type_ordering(self):
624 other = object()
625 smallest = SmallestObject()
626 largest = LargestObject()
627 for obj in self.objects:
628 with self.assertRaises(TypeError):
629 obj < other
630 with self.assertRaises(TypeError):
631 obj > other
632 with self.assertRaises(TypeError):
633 obj <= other
634 with self.assertRaises(TypeError):
635 obj >= other
636 self.assertTrue(obj < largest)
637 self.assertFalse(obj > largest)
638 self.assertTrue(obj <= largest)
639 self.assertFalse(obj >= largest)
640 self.assertFalse(obj < smallest)
641 self.assertTrue(obj > smallest)
642 self.assertFalse(obj <= smallest)
643 self.assertTrue(obj >= smallest)
644
Nick Coghlan3008ec02012-07-08 00:45:33 +1000645 def test_mixed_type_key(self):
646 # with get_mixed_type_key, you can sort addresses and network.
647 v4_ordered = [self.v4addr, self.v4net, self.v4intf]
648 v6_ordered = [self.v6addr, self.v6net, self.v6intf]
649 self.assertEqual(v4_ordered,
650 sorted(self.v4_objects,
651 key=ipaddress.get_mixed_type_key))
652 self.assertEqual(v6_ordered,
653 sorted(self.v6_objects,
654 key=ipaddress.get_mixed_type_key))
655 self.assertEqual(v4_ordered + v6_ordered,
656 sorted(self.objects,
657 key=ipaddress.get_mixed_type_key))
658 self.assertEqual(NotImplemented, ipaddress.get_mixed_type_key(object))
659
660 def test_incompatible_versions(self):
661 # These should always raise TypeError
662 v4addr = ipaddress.ip_address('1.1.1.1')
663 v4net = ipaddress.ip_network('1.1.1.1')
664 v6addr = ipaddress.ip_address('::1')
Serhiy Storchakaf186e122015-01-26 10:11:16 +0200665 v6net = ipaddress.ip_network('::1')
Nick Coghlan3008ec02012-07-08 00:45:33 +1000666
667 self.assertRaises(TypeError, v4addr.__lt__, v6addr)
668 self.assertRaises(TypeError, v4addr.__gt__, v6addr)
669 self.assertRaises(TypeError, v4net.__lt__, v6net)
670 self.assertRaises(TypeError, v4net.__gt__, v6net)
671
672 self.assertRaises(TypeError, v6addr.__lt__, v4addr)
673 self.assertRaises(TypeError, v6addr.__gt__, v4addr)
674 self.assertRaises(TypeError, v6net.__lt__, v4net)
675 self.assertRaises(TypeError, v6net.__gt__, v4net)
676
677
Nick Coghlandc9b2552012-05-20 21:01:57 +1000678class IpaddrUnitTest(unittest.TestCase):
679
680 def setUp(self):
681 self.ipv4_address = ipaddress.IPv4Address('1.2.3.4')
682 self.ipv4_interface = ipaddress.IPv4Interface('1.2.3.4/24')
683 self.ipv4_network = ipaddress.IPv4Network('1.2.3.0/24')
684 #self.ipv4_hostmask = ipaddress.IPv4Interface('10.0.0.1/0.255.255.255')
685 self.ipv6_address = ipaddress.IPv6Interface(
686 '2001:658:22a:cafe:200:0:0:1')
687 self.ipv6_interface = ipaddress.IPv6Interface(
688 '2001:658:22a:cafe:200:0:0:1/64')
689 self.ipv6_network = ipaddress.IPv6Network('2001:658:22a:cafe::/64')
690
691 def testRepr(self):
692 self.assertEqual("IPv4Interface('1.2.3.4/32')",
693 repr(ipaddress.IPv4Interface('1.2.3.4')))
694 self.assertEqual("IPv6Interface('::1/128')",
695 repr(ipaddress.IPv6Interface('::1')))
696
Antoine Pitrou5fb195f2014-05-12 20:36:46 +0200697 # issue #16531: constructing IPv4Network from a (address, mask) tuple
698 def testIPv4Tuple(self):
699 # /32
700 ip = ipaddress.IPv4Address('192.0.2.1')
701 net = ipaddress.IPv4Network('192.0.2.1/32')
702 self.assertEqual(ipaddress.IPv4Network(('192.0.2.1', 32)), net)
703 self.assertEqual(ipaddress.IPv4Network((ip, 32)), net)
704 self.assertEqual(ipaddress.IPv4Network((3221225985, 32)), net)
705 self.assertEqual(ipaddress.IPv4Network(('192.0.2.1',
706 '255.255.255.255')), net)
707 self.assertEqual(ipaddress.IPv4Network((ip,
708 '255.255.255.255')), net)
709 self.assertEqual(ipaddress.IPv4Network((3221225985,
710 '255.255.255.255')), net)
711 # strict=True and host bits set
712 with self.assertRaises(ValueError):
713 ipaddress.IPv4Network(('192.0.2.1', 24))
714 with self.assertRaises(ValueError):
715 ipaddress.IPv4Network((ip, 24))
716 with self.assertRaises(ValueError):
717 ipaddress.IPv4Network((3221225985, 24))
718 with self.assertRaises(ValueError):
719 ipaddress.IPv4Network(('192.0.2.1', '255.255.255.0'))
720 with self.assertRaises(ValueError):
721 ipaddress.IPv4Network((ip, '255.255.255.0'))
722 with self.assertRaises(ValueError):
723 ipaddress.IPv4Network((3221225985, '255.255.255.0'))
724 # strict=False and host bits set
725 net = ipaddress.IPv4Network('192.0.2.0/24')
726 self.assertEqual(ipaddress.IPv4Network(('192.0.2.1', 24),
727 strict=False), net)
728 self.assertEqual(ipaddress.IPv4Network((ip, 24),
729 strict=False), net)
730 self.assertEqual(ipaddress.IPv4Network((3221225985, 24),
731 strict=False), net)
732 self.assertEqual(ipaddress.IPv4Network(('192.0.2.1',
733 '255.255.255.0'),
734 strict=False), net)
735 self.assertEqual(ipaddress.IPv4Network((ip,
736 '255.255.255.0'),
737 strict=False), net)
738 self.assertEqual(ipaddress.IPv4Network((3221225985,
739 '255.255.255.0'),
740 strict=False), net)
741
742 # /24
743 ip = ipaddress.IPv4Address('192.0.2.0')
744 net = ipaddress.IPv4Network('192.0.2.0/24')
745 self.assertEqual(ipaddress.IPv4Network(('192.0.2.0',
746 '255.255.255.0')), net)
747 self.assertEqual(ipaddress.IPv4Network((ip,
748 '255.255.255.0')), net)
749 self.assertEqual(ipaddress.IPv4Network((3221225984,
750 '255.255.255.0')), net)
751 self.assertEqual(ipaddress.IPv4Network(('192.0.2.0', 24)), net)
752 self.assertEqual(ipaddress.IPv4Network((ip, 24)), net)
753 self.assertEqual(ipaddress.IPv4Network((3221225984, 24)), net)
754
755 self.assertEqual(ipaddress.IPv4Interface(('192.0.2.1', 24)),
756 ipaddress.IPv4Interface('192.0.2.1/24'))
757 self.assertEqual(ipaddress.IPv4Interface((3221225985, 24)),
758 ipaddress.IPv4Interface('192.0.2.1/24'))
759
760 # issue #16531: constructing IPv6Network from a (address, mask) tuple
761 def testIPv6Tuple(self):
762 # /128
763 ip = ipaddress.IPv6Address('2001:db8::')
764 net = ipaddress.IPv6Network('2001:db8::/128')
765 self.assertEqual(ipaddress.IPv6Network(('2001:db8::', '128')),
766 net)
767 self.assertEqual(ipaddress.IPv6Network(
768 (42540766411282592856903984951653826560, 128)),
769 net)
770 self.assertEqual(ipaddress.IPv6Network((ip, '128')),
771 net)
772 ip = ipaddress.IPv6Address('2001:db8::')
773 net = ipaddress.IPv6Network('2001:db8::/96')
774 self.assertEqual(ipaddress.IPv6Network(('2001:db8::', '96')),
775 net)
776 self.assertEqual(ipaddress.IPv6Network(
777 (42540766411282592856903984951653826560, 96)),
778 net)
779 self.assertEqual(ipaddress.IPv6Network((ip, '96')),
780 net)
781
782 # strict=True and host bits set
783 ip = ipaddress.IPv6Address('2001:db8::1')
784 with self.assertRaises(ValueError):
785 ipaddress.IPv6Network(('2001:db8::1', 96))
786 with self.assertRaises(ValueError):
787 ipaddress.IPv6Network((
788 42540766411282592856903984951653826561, 96))
789 with self.assertRaises(ValueError):
790 ipaddress.IPv6Network((ip, 96))
791 # strict=False and host bits set
792 net = ipaddress.IPv6Network('2001:db8::/96')
793 self.assertEqual(ipaddress.IPv6Network(('2001:db8::1', 96),
794 strict=False),
795 net)
796 self.assertEqual(ipaddress.IPv6Network(
797 (42540766411282592856903984951653826561, 96),
798 strict=False),
799 net)
800 self.assertEqual(ipaddress.IPv6Network((ip, 96), strict=False),
801 net)
802
803 # /96
804 self.assertEqual(ipaddress.IPv6Interface(('2001:db8::1', '96')),
805 ipaddress.IPv6Interface('2001:db8::1/96'))
806 self.assertEqual(ipaddress.IPv6Interface(
807 (42540766411282592856903984951653826561, '96')),
808 ipaddress.IPv6Interface('2001:db8::1/96'))
809
Nick Coghlandc9b2552012-05-20 21:01:57 +1000810 # issue57
811 def testAddressIntMath(self):
812 self.assertEqual(ipaddress.IPv4Address('1.1.1.1') + 255,
813 ipaddress.IPv4Address('1.1.2.0'))
814 self.assertEqual(ipaddress.IPv4Address('1.1.1.1') - 256,
815 ipaddress.IPv4Address('1.1.0.1'))
816 self.assertEqual(ipaddress.IPv6Address('::1') + (2**16 - 2),
817 ipaddress.IPv6Address('::ffff'))
818 self.assertEqual(ipaddress.IPv6Address('::ffff') - (2**16 - 2),
819 ipaddress.IPv6Address('::1'))
820
Nick Coghlan3c2570c2012-07-07 01:13:55 +1000821 def testInvalidIntToBytes(self):
822 self.assertRaises(ValueError, ipaddress.v4_int_to_packed, -1)
823 self.assertRaises(ValueError, ipaddress.v4_int_to_packed,
824 2 ** ipaddress.IPV4LENGTH)
825 self.assertRaises(ValueError, ipaddress.v6_int_to_packed, -1)
826 self.assertRaises(ValueError, ipaddress.v6_int_to_packed,
827 2 ** ipaddress.IPV6LENGTH)
828
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200829 def testInternals(self):
Serhiy Storchakab53f0fb2015-01-19 00:41:32 +0200830 ip1 = ipaddress.IPv4Address('10.10.10.10')
831 ip2 = ipaddress.IPv4Address('10.10.10.11')
832 ip3 = ipaddress.IPv4Address('10.10.10.12')
833 self.assertEqual(list(ipaddress._find_address_range([ip1])),
834 [(ip1, ip1)])
835 self.assertEqual(list(ipaddress._find_address_range([ip1, ip3])),
836 [(ip1, ip1), (ip3, ip3)])
837 self.assertEqual(list(ipaddress._find_address_range([ip1, ip2, ip3])),
838 [(ip1, ip3)])
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200839 self.assertEqual(128, ipaddress._count_righthand_zero_bits(0, 128))
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200840 self.assertEqual("IPv4Network('1.2.3.0/24')", repr(self.ipv4_network))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000841
Nick Coghland9722652012-06-17 16:33:00 +1000842 def testMissingNetworkVersion(self):
843 class Broken(ipaddress._BaseNetwork):
844 pass
845 broken = Broken('127.0.0.1')
846 with self.assertRaisesRegex(NotImplementedError, "Broken.*version"):
847 broken.version
848
849 def testMissingAddressClass(self):
850 class Broken(ipaddress._BaseNetwork):
851 pass
852 broken = Broken('127.0.0.1')
853 with self.assertRaisesRegex(NotImplementedError, "Broken.*address"):
854 broken._address_class
855
Nick Coghlandc9b2552012-05-20 21:01:57 +1000856 def testGetNetwork(self):
857 self.assertEqual(int(self.ipv4_network.network_address), 16909056)
858 self.assertEqual(str(self.ipv4_network.network_address), '1.2.3.0')
859
860 self.assertEqual(int(self.ipv6_network.network_address),
861 42540616829182469433403647294022090752)
862 self.assertEqual(str(self.ipv6_network.network_address),
863 '2001:658:22a:cafe::')
864 self.assertEqual(str(self.ipv6_network.hostmask),
865 '::ffff:ffff:ffff:ffff')
866
Nick Coghlandc9b2552012-05-20 21:01:57 +1000867 def testIpFromInt(self):
868 self.assertEqual(self.ipv4_interface._ip,
869 ipaddress.IPv4Interface(16909060)._ip)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000870
871 ipv4 = ipaddress.ip_network('1.2.3.4')
872 ipv6 = ipaddress.ip_network('2001:658:22a:cafe:200:0:0:1')
Nick Coghlan730f67f2012-08-05 22:02:18 +1000873 self.assertEqual(ipv4, ipaddress.ip_network(int(ipv4.network_address)))
874 self.assertEqual(ipv6, ipaddress.ip_network(int(ipv6.network_address)))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000875
876 v6_int = 42540616829182469433547762482097946625
877 self.assertEqual(self.ipv6_interface._ip,
878 ipaddress.IPv6Interface(v6_int)._ip)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000879
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200880 self.assertEqual(ipaddress.ip_network(self.ipv4_address._ip).version,
881 4)
882 self.assertEqual(ipaddress.ip_network(self.ipv6_address._ip).version,
883 6)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000884
885 def testIpFromPacked(self):
Nick Coghlan5cf896f2012-07-07 01:43:31 +1000886 address = ipaddress.ip_address
Nick Coghlandc9b2552012-05-20 21:01:57 +1000887 self.assertEqual(self.ipv4_interface._ip,
Nick Coghlan5cf896f2012-07-07 01:43:31 +1000888 ipaddress.ip_interface(b'\x01\x02\x03\x04')._ip)
889 self.assertEqual(address('255.254.253.252'),
890 address(b'\xff\xfe\xfd\xfc'))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000891 self.assertEqual(self.ipv6_interface.ip,
892 ipaddress.ip_interface(
Nick Coghlan5cf896f2012-07-07 01:43:31 +1000893 b'\x20\x01\x06\x58\x02\x2a\xca\xfe'
894 b'\x02\x00\x00\x00\x00\x00\x00\x01').ip)
895 self.assertEqual(address('ffff:2:3:4:ffff::'),
896 address(b'\xff\xff\x00\x02\x00\x03\x00\x04' +
897 b'\xff\xff' + b'\x00' * 6))
898 self.assertEqual(address('::'),
899 address(b'\x00' * 16))
900
Nick Coghlandc9b2552012-05-20 21:01:57 +1000901 def testGetIp(self):
902 self.assertEqual(int(self.ipv4_interface.ip), 16909060)
903 self.assertEqual(str(self.ipv4_interface.ip), '1.2.3.4')
904
905 self.assertEqual(int(self.ipv6_interface.ip),
906 42540616829182469433547762482097946625)
907 self.assertEqual(str(self.ipv6_interface.ip),
908 '2001:658:22a:cafe:200::1')
909
910 def testGetNetmask(self):
911 self.assertEqual(int(self.ipv4_network.netmask), 4294967040)
912 self.assertEqual(str(self.ipv4_network.netmask), '255.255.255.0')
913 self.assertEqual(int(self.ipv6_network.netmask),
914 340282366920938463444927863358058659840)
915 self.assertEqual(self.ipv6_network.prefixlen, 64)
916
917 def testZeroNetmask(self):
918 ipv4_zero_netmask = ipaddress.IPv4Interface('1.2.3.4/0')
919 self.assertEqual(int(ipv4_zero_netmask.network.netmask), 0)
Nick Coghlan932346f2014-02-08 23:17:36 +1000920 self.assertEqual(ipv4_zero_netmask._prefix_from_prefix_string('0'), 0)
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200921 self.assertTrue(ipv4_zero_netmask._is_valid_netmask('0'))
922 self.assertTrue(ipv4_zero_netmask._is_valid_netmask('0.0.0.0'))
923 self.assertFalse(ipv4_zero_netmask._is_valid_netmask('invalid'))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000924
925 ipv6_zero_netmask = ipaddress.IPv6Interface('::1/0')
926 self.assertEqual(int(ipv6_zero_netmask.network.netmask), 0)
Nick Coghlan932346f2014-02-08 23:17:36 +1000927 self.assertEqual(ipv6_zero_netmask._prefix_from_prefix_string('0'), 0)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000928
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200929 def testIPv4NetAndHostmasks(self):
930 net = self.ipv4_network
931 self.assertFalse(net._is_valid_netmask('invalid'))
932 self.assertTrue(net._is_valid_netmask('128.128.128.128'))
933 self.assertFalse(net._is_valid_netmask('128.128.128.127'))
934 self.assertFalse(net._is_valid_netmask('128.128.128.255'))
935 self.assertTrue(net._is_valid_netmask('255.128.128.128'))
936
937 self.assertFalse(net._is_hostmask('invalid'))
938 self.assertTrue(net._is_hostmask('128.255.255.255'))
939 self.assertFalse(net._is_hostmask('255.255.255.255'))
940 self.assertFalse(net._is_hostmask('1.2.3.4'))
941
942 net = ipaddress.IPv4Network('127.0.0.0/0.0.0.255')
Nick Coghlan932346f2014-02-08 23:17:36 +1000943 self.assertEqual(net.prefixlen, 24)
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200944
Nick Coghlandc9b2552012-05-20 21:01:57 +1000945 def testGetBroadcast(self):
946 self.assertEqual(int(self.ipv4_network.broadcast_address), 16909311)
947 self.assertEqual(str(self.ipv4_network.broadcast_address), '1.2.3.255')
948
949 self.assertEqual(int(self.ipv6_network.broadcast_address),
950 42540616829182469451850391367731642367)
951 self.assertEqual(str(self.ipv6_network.broadcast_address),
952 '2001:658:22a:cafe:ffff:ffff:ffff:ffff')
953
954 def testGetPrefixlen(self):
Nick Coghlane3ded952012-08-05 22:45:22 +1000955 self.assertEqual(self.ipv4_interface.network.prefixlen, 24)
956 self.assertEqual(self.ipv6_interface.network.prefixlen, 64)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000957
958 def testGetSupernet(self):
959 self.assertEqual(self.ipv4_network.supernet().prefixlen, 23)
960 self.assertEqual(str(self.ipv4_network.supernet().network_address),
961 '1.2.2.0')
962 self.assertEqual(
963 ipaddress.IPv4Interface('0.0.0.0/0').network.supernet(),
964 ipaddress.IPv4Network('0.0.0.0/0'))
965
966 self.assertEqual(self.ipv6_network.supernet().prefixlen, 63)
967 self.assertEqual(str(self.ipv6_network.supernet().network_address),
968 '2001:658:22a:cafe::')
969 self.assertEqual(ipaddress.IPv6Interface('::0/0').network.supernet(),
970 ipaddress.IPv6Network('::0/0'))
971
972 def testGetSupernet3(self):
973 self.assertEqual(self.ipv4_network.supernet(3).prefixlen, 21)
974 self.assertEqual(str(self.ipv4_network.supernet(3).network_address),
975 '1.2.0.0')
976
977 self.assertEqual(self.ipv6_network.supernet(3).prefixlen, 61)
978 self.assertEqual(str(self.ipv6_network.supernet(3).network_address),
979 '2001:658:22a:caf8::')
980
981 def testGetSupernet4(self):
982 self.assertRaises(ValueError, self.ipv4_network.supernet,
983 prefixlen_diff=2, new_prefix=1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200984 self.assertRaises(ValueError, self.ipv4_network.supernet,
985 new_prefix=25)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000986 self.assertEqual(self.ipv4_network.supernet(prefixlen_diff=2),
987 self.ipv4_network.supernet(new_prefix=22))
988
989 self.assertRaises(ValueError, self.ipv6_network.supernet,
990 prefixlen_diff=2, new_prefix=1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200991 self.assertRaises(ValueError, self.ipv6_network.supernet,
992 new_prefix=65)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000993 self.assertEqual(self.ipv6_network.supernet(prefixlen_diff=2),
994 self.ipv6_network.supernet(new_prefix=62))
995
996 def testHosts(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200997 hosts = list(self.ipv4_network.hosts())
998 self.assertEqual(254, len(hosts))
999 self.assertEqual(ipaddress.IPv4Address('1.2.3.1'), hosts[0])
1000 self.assertEqual(ipaddress.IPv4Address('1.2.3.254'), hosts[-1])
1001
1002 # special case where only 1 bit is left for address
Nick Coghlandc9b2552012-05-20 21:01:57 +10001003 self.assertEqual([ipaddress.IPv4Address('2.0.0.0'),
1004 ipaddress.IPv4Address('2.0.0.1')],
1005 list(ipaddress.ip_network('2.0.0.0/31').hosts()))
1006
1007 def testFancySubnetting(self):
1008 self.assertEqual(sorted(self.ipv4_network.subnets(prefixlen_diff=3)),
1009 sorted(self.ipv4_network.subnets(new_prefix=27)))
1010 self.assertRaises(ValueError, list,
1011 self.ipv4_network.subnets(new_prefix=23))
1012 self.assertRaises(ValueError, list,
1013 self.ipv4_network.subnets(prefixlen_diff=3,
1014 new_prefix=27))
1015 self.assertEqual(sorted(self.ipv6_network.subnets(prefixlen_diff=4)),
1016 sorted(self.ipv6_network.subnets(new_prefix=68)))
1017 self.assertRaises(ValueError, list,
1018 self.ipv6_network.subnets(new_prefix=63))
1019 self.assertRaises(ValueError, list,
1020 self.ipv6_network.subnets(prefixlen_diff=4,
1021 new_prefix=68))
1022
1023 def testGetSubnets(self):
1024 self.assertEqual(list(self.ipv4_network.subnets())[0].prefixlen, 25)
1025 self.assertEqual(str(list(
1026 self.ipv4_network.subnets())[0].network_address),
1027 '1.2.3.0')
1028 self.assertEqual(str(list(
1029 self.ipv4_network.subnets())[1].network_address),
1030 '1.2.3.128')
1031
1032 self.assertEqual(list(self.ipv6_network.subnets())[0].prefixlen, 65)
1033
1034 def testGetSubnetForSingle32(self):
1035 ip = ipaddress.IPv4Network('1.2.3.4/32')
1036 subnets1 = [str(x) for x in ip.subnets()]
1037 subnets2 = [str(x) for x in ip.subnets(2)]
1038 self.assertEqual(subnets1, ['1.2.3.4/32'])
1039 self.assertEqual(subnets1, subnets2)
1040
1041 def testGetSubnetForSingle128(self):
1042 ip = ipaddress.IPv6Network('::1/128')
1043 subnets1 = [str(x) for x in ip.subnets()]
1044 subnets2 = [str(x) for x in ip.subnets(2)]
1045 self.assertEqual(subnets1, ['::1/128'])
1046 self.assertEqual(subnets1, subnets2)
1047
1048 def testSubnet2(self):
1049 ips = [str(x) for x in self.ipv4_network.subnets(2)]
1050 self.assertEqual(
1051 ips,
1052 ['1.2.3.0/26', '1.2.3.64/26', '1.2.3.128/26', '1.2.3.192/26'])
1053
1054 ipsv6 = [str(x) for x in self.ipv6_network.subnets(2)]
1055 self.assertEqual(
1056 ipsv6,
1057 ['2001:658:22a:cafe::/66',
1058 '2001:658:22a:cafe:4000::/66',
1059 '2001:658:22a:cafe:8000::/66',
1060 '2001:658:22a:cafe:c000::/66'])
1061
1062 def testSubnetFailsForLargeCidrDiff(self):
1063 self.assertRaises(ValueError, list,
1064 self.ipv4_interface.network.subnets(9))
1065 self.assertRaises(ValueError, list,
1066 self.ipv4_network.subnets(9))
1067 self.assertRaises(ValueError, list,
1068 self.ipv6_interface.network.subnets(65))
1069 self.assertRaises(ValueError, list,
1070 self.ipv6_network.subnets(65))
1071
1072 def testSupernetFailsForLargeCidrDiff(self):
1073 self.assertRaises(ValueError,
1074 self.ipv4_interface.network.supernet, 25)
1075 self.assertRaises(ValueError,
1076 self.ipv6_interface.network.supernet, 65)
1077
1078 def testSubnetFailsForNegativeCidrDiff(self):
1079 self.assertRaises(ValueError, list,
1080 self.ipv4_interface.network.subnets(-1))
1081 self.assertRaises(ValueError, list,
Nick Coghlan2c589102012-05-27 01:03:25 +10001082 self.ipv4_network.subnets(-1))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001083 self.assertRaises(ValueError, list,
1084 self.ipv6_interface.network.subnets(-1))
1085 self.assertRaises(ValueError, list,
1086 self.ipv6_network.subnets(-1))
1087
1088 def testGetNum_Addresses(self):
1089 self.assertEqual(self.ipv4_network.num_addresses, 256)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001090 self.assertEqual(list(self.ipv4_network.subnets())[0].num_addresses,
1091 128)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001092 self.assertEqual(self.ipv4_network.supernet().num_addresses, 512)
1093
1094 self.assertEqual(self.ipv6_network.num_addresses, 18446744073709551616)
1095 self.assertEqual(list(self.ipv6_network.subnets())[0].num_addresses,
1096 9223372036854775808)
1097 self.assertEqual(self.ipv6_network.supernet().num_addresses,
1098 36893488147419103232)
1099
1100 def testContains(self):
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001101 self.assertIn(ipaddress.IPv4Interface('1.2.3.128/25'),
1102 self.ipv4_network)
1103 self.assertNotIn(ipaddress.IPv4Interface('1.2.4.1/24'),
Nick Coghlandc9b2552012-05-20 21:01:57 +10001104 self.ipv4_network)
1105 # We can test addresses and string as well.
1106 addr1 = ipaddress.IPv4Address('1.2.3.37')
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001107 self.assertIn(addr1, self.ipv4_network)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001108 # issue 61, bad network comparison on like-ip'd network objects
1109 # with identical broadcast addresses.
1110 self.assertFalse(ipaddress.IPv4Network('1.1.0.0/16').__contains__(
1111 ipaddress.IPv4Network('1.0.0.0/15')))
1112
Nick Coghlandc9b2552012-05-20 21:01:57 +10001113 def testNth(self):
1114 self.assertEqual(str(self.ipv4_network[5]), '1.2.3.5')
1115 self.assertRaises(IndexError, self.ipv4_network.__getitem__, 256)
1116
1117 self.assertEqual(str(self.ipv6_network[5]),
1118 '2001:658:22a:cafe::5')
1119
1120 def testGetitem(self):
1121 # http://code.google.com/p/ipaddr-py/issues/detail?id=15
1122 addr = ipaddress.IPv4Network('172.31.255.128/255.255.255.240')
1123 self.assertEqual(28, addr.prefixlen)
1124 addr_list = list(addr)
1125 self.assertEqual('172.31.255.128', str(addr_list[0]))
1126 self.assertEqual('172.31.255.128', str(addr[0]))
1127 self.assertEqual('172.31.255.143', str(addr_list[-1]))
1128 self.assertEqual('172.31.255.143', str(addr[-1]))
1129 self.assertEqual(addr_list[-1], addr[-1])
1130
1131 def testEqual(self):
1132 self.assertTrue(self.ipv4_interface ==
1133 ipaddress.IPv4Interface('1.2.3.4/24'))
1134 self.assertFalse(self.ipv4_interface ==
1135 ipaddress.IPv4Interface('1.2.3.4/23'))
1136 self.assertFalse(self.ipv4_interface ==
1137 ipaddress.IPv6Interface('::1.2.3.4/24'))
1138 self.assertFalse(self.ipv4_interface == '')
1139 self.assertFalse(self.ipv4_interface == [])
1140 self.assertFalse(self.ipv4_interface == 2)
1141
1142 self.assertTrue(self.ipv6_interface ==
1143 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/64'))
1144 self.assertFalse(self.ipv6_interface ==
1145 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/63'))
1146 self.assertFalse(self.ipv6_interface ==
1147 ipaddress.IPv4Interface('1.2.3.4/23'))
1148 self.assertFalse(self.ipv6_interface == '')
1149 self.assertFalse(self.ipv6_interface == [])
1150 self.assertFalse(self.ipv6_interface == 2)
1151
1152 def testNotEqual(self):
1153 self.assertFalse(self.ipv4_interface !=
1154 ipaddress.IPv4Interface('1.2.3.4/24'))
1155 self.assertTrue(self.ipv4_interface !=
1156 ipaddress.IPv4Interface('1.2.3.4/23'))
1157 self.assertTrue(self.ipv4_interface !=
1158 ipaddress.IPv6Interface('::1.2.3.4/24'))
1159 self.assertTrue(self.ipv4_interface != '')
1160 self.assertTrue(self.ipv4_interface != [])
1161 self.assertTrue(self.ipv4_interface != 2)
1162
1163 self.assertTrue(self.ipv4_address !=
1164 ipaddress.IPv4Address('1.2.3.5'))
1165 self.assertTrue(self.ipv4_address != '')
1166 self.assertTrue(self.ipv4_address != [])
1167 self.assertTrue(self.ipv4_address != 2)
1168
1169 self.assertFalse(self.ipv6_interface !=
1170 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/64'))
1171 self.assertTrue(self.ipv6_interface !=
1172 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/63'))
1173 self.assertTrue(self.ipv6_interface !=
1174 ipaddress.IPv4Interface('1.2.3.4/23'))
1175 self.assertTrue(self.ipv6_interface != '')
1176 self.assertTrue(self.ipv6_interface != [])
1177 self.assertTrue(self.ipv6_interface != 2)
1178
1179 self.assertTrue(self.ipv6_address !=
1180 ipaddress.IPv4Address('1.2.3.4'))
1181 self.assertTrue(self.ipv6_address != '')
1182 self.assertTrue(self.ipv6_address != [])
1183 self.assertTrue(self.ipv6_address != 2)
1184
1185 def testSlash32Constructor(self):
1186 self.assertEqual(str(ipaddress.IPv4Interface(
1187 '1.2.3.4/255.255.255.255')), '1.2.3.4/32')
1188
1189 def testSlash128Constructor(self):
1190 self.assertEqual(str(ipaddress.IPv6Interface('::1/128')),
1191 '::1/128')
1192
1193 def testSlash0Constructor(self):
1194 self.assertEqual(str(ipaddress.IPv4Interface('1.2.3.4/0.0.0.0')),
1195 '1.2.3.4/0')
1196
1197 def testCollapsing(self):
1198 # test only IP addresses including some duplicates
1199 ip1 = ipaddress.IPv4Address('1.1.1.0')
1200 ip2 = ipaddress.IPv4Address('1.1.1.1')
1201 ip3 = ipaddress.IPv4Address('1.1.1.2')
1202 ip4 = ipaddress.IPv4Address('1.1.1.3')
1203 ip5 = ipaddress.IPv4Address('1.1.1.4')
1204 ip6 = ipaddress.IPv4Address('1.1.1.0')
1205 # check that addreses are subsumed properly.
1206 collapsed = ipaddress.collapse_addresses(
1207 [ip1, ip2, ip3, ip4, ip5, ip6])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001208 self.assertEqual(list(collapsed),
1209 [ipaddress.IPv4Network('1.1.1.0/30'),
1210 ipaddress.IPv4Network('1.1.1.4/32')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001211
1212 # test a mix of IP addresses and networks including some duplicates
1213 ip1 = ipaddress.IPv4Address('1.1.1.0')
1214 ip2 = ipaddress.IPv4Address('1.1.1.1')
1215 ip3 = ipaddress.IPv4Address('1.1.1.2')
1216 ip4 = ipaddress.IPv4Address('1.1.1.3')
1217 #ip5 = ipaddress.IPv4Interface('1.1.1.4/30')
1218 #ip6 = ipaddress.IPv4Interface('1.1.1.4/30')
1219 # check that addreses are subsumed properly.
1220 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3, ip4])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001221 self.assertEqual(list(collapsed),
1222 [ipaddress.IPv4Network('1.1.1.0/30')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001223
1224 # test only IP networks
1225 ip1 = ipaddress.IPv4Network('1.1.0.0/24')
1226 ip2 = ipaddress.IPv4Network('1.1.1.0/24')
1227 ip3 = ipaddress.IPv4Network('1.1.2.0/24')
1228 ip4 = ipaddress.IPv4Network('1.1.3.0/24')
1229 ip5 = ipaddress.IPv4Network('1.1.4.0/24')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001230 # stored in no particular order b/c we want CollapseAddr to call
1231 # [].sort
Nick Coghlandc9b2552012-05-20 21:01:57 +10001232 ip6 = ipaddress.IPv4Network('1.1.0.0/22')
1233 # check that addreses are subsumed properly.
1234 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3, ip4, ip5,
1235 ip6])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001236 self.assertEqual(list(collapsed),
1237 [ipaddress.IPv4Network('1.1.0.0/22'),
1238 ipaddress.IPv4Network('1.1.4.0/24')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001239
1240 # test that two addresses are supernet'ed properly
1241 collapsed = ipaddress.collapse_addresses([ip1, ip2])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001242 self.assertEqual(list(collapsed),
1243 [ipaddress.IPv4Network('1.1.0.0/23')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001244
1245 # test same IP networks
1246 ip_same1 = ip_same2 = ipaddress.IPv4Network('1.1.1.1/32')
1247 self.assertEqual(list(ipaddress.collapse_addresses(
1248 [ip_same1, ip_same2])),
1249 [ip_same1])
1250
1251 # test same IP addresses
1252 ip_same1 = ip_same2 = ipaddress.IPv4Address('1.1.1.1')
1253 self.assertEqual(list(ipaddress.collapse_addresses(
1254 [ip_same1, ip_same2])),
1255 [ipaddress.ip_network('1.1.1.1/32')])
1256 ip1 = ipaddress.IPv6Network('2001::/100')
1257 ip2 = ipaddress.IPv6Network('2001::/120')
1258 ip3 = ipaddress.IPv6Network('2001::/96')
1259 # test that ipv6 addresses are subsumed properly.
1260 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3])
1261 self.assertEqual(list(collapsed), [ip3])
1262
1263 # the toejam test
Hynek Schlawack35db5132012-06-01 20:12:17 +02001264 addr_tuples = [
1265 (ipaddress.ip_address('1.1.1.1'),
1266 ipaddress.ip_address('::1')),
1267 (ipaddress.IPv4Network('1.1.0.0/24'),
1268 ipaddress.IPv6Network('2001::/120')),
1269 (ipaddress.IPv4Network('1.1.0.0/32'),
1270 ipaddress.IPv6Network('2001::/128')),
1271 ]
1272 for ip1, ip2 in addr_tuples:
1273 self.assertRaises(TypeError, ipaddress.collapse_addresses,
1274 [ip1, ip2])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001275
1276 def testSummarizing(self):
1277 #ip = ipaddress.ip_address
1278 #ipnet = ipaddress.ip_network
1279 summarize = ipaddress.summarize_address_range
1280 ip1 = ipaddress.ip_address('1.1.1.0')
1281 ip2 = ipaddress.ip_address('1.1.1.255')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001282
1283 # summarize works only for IPv4 & IPv6
1284 class IPv7Address(ipaddress.IPv6Address):
1285 @property
1286 def version(self):
1287 return 7
1288 ip_invalid1 = IPv7Address('::1')
1289 ip_invalid2 = IPv7Address('::1')
1290 self.assertRaises(ValueError, list,
1291 summarize(ip_invalid1, ip_invalid2))
1292 # test that a summary over ip4 & ip6 fails
1293 self.assertRaises(TypeError, list,
1294 summarize(ip1, ipaddress.IPv6Address('::1')))
1295 # test a /24 is summarized properly
Nick Coghlandc9b2552012-05-20 21:01:57 +10001296 self.assertEqual(list(summarize(ip1, ip2))[0],
1297 ipaddress.ip_network('1.1.1.0/24'))
1298 # test an IPv4 range that isn't on a network byte boundary
1299 ip2 = ipaddress.ip_address('1.1.1.8')
1300 self.assertEqual(list(summarize(ip1, ip2)),
1301 [ipaddress.ip_network('1.1.1.0/29'),
1302 ipaddress.ip_network('1.1.1.8')])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001303 # all!
1304 ip1 = ipaddress.IPv4Address(0)
1305 ip2 = ipaddress.IPv4Address(ipaddress.IPv4Address._ALL_ONES)
1306 self.assertEqual([ipaddress.IPv4Network('0.0.0.0/0')],
1307 list(summarize(ip1, ip2)))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001308
1309 ip1 = ipaddress.ip_address('1::')
1310 ip2 = ipaddress.ip_address('1:ffff:ffff:ffff:ffff:ffff:ffff:ffff')
1311 # test a IPv6 is sumamrized properly
1312 self.assertEqual(list(summarize(ip1, ip2))[0],
1313 ipaddress.ip_network('1::/16'))
1314 # test an IPv6 range that isn't on a network byte boundary
1315 ip2 = ipaddress.ip_address('2::')
1316 self.assertEqual(list(summarize(ip1, ip2)),
1317 [ipaddress.ip_network('1::/16'),
1318 ipaddress.ip_network('2::/128')])
1319
1320 # test exception raised when first is greater than last
1321 self.assertRaises(ValueError, list,
1322 summarize(ipaddress.ip_address('1.1.1.0'),
1323 ipaddress.ip_address('1.1.0.0')))
1324 # test exception raised when first and last aren't IP addresses
1325 self.assertRaises(TypeError, list,
1326 summarize(ipaddress.ip_network('1.1.1.0'),
1327 ipaddress.ip_network('1.1.0.0')))
1328 self.assertRaises(TypeError, list,
1329 summarize(ipaddress.ip_network('1.1.1.0'),
1330 ipaddress.ip_network('1.1.0.0')))
1331 # test exception raised when first and last are not same version
1332 self.assertRaises(TypeError, list,
1333 summarize(ipaddress.ip_address('::'),
1334 ipaddress.ip_network('1.1.0.0')))
1335
1336 def testAddressComparison(self):
1337 self.assertTrue(ipaddress.ip_address('1.1.1.1') <=
1338 ipaddress.ip_address('1.1.1.1'))
1339 self.assertTrue(ipaddress.ip_address('1.1.1.1') <=
1340 ipaddress.ip_address('1.1.1.2'))
1341 self.assertTrue(ipaddress.ip_address('::1') <=
1342 ipaddress.ip_address('::1'))
1343 self.assertTrue(ipaddress.ip_address('::1') <=
1344 ipaddress.ip_address('::2'))
1345
Nick Coghlan3008ec02012-07-08 00:45:33 +10001346 def testInterfaceComparison(self):
1347 self.assertTrue(ipaddress.ip_interface('1.1.1.1') <=
1348 ipaddress.ip_interface('1.1.1.1'))
1349 self.assertTrue(ipaddress.ip_interface('1.1.1.1') <=
1350 ipaddress.ip_interface('1.1.1.2'))
1351 self.assertTrue(ipaddress.ip_interface('::1') <=
1352 ipaddress.ip_interface('::1'))
1353 self.assertTrue(ipaddress.ip_interface('::1') <=
1354 ipaddress.ip_interface('::2'))
1355
Nick Coghlandc9b2552012-05-20 21:01:57 +10001356 def testNetworkComparison(self):
1357 # ip1 and ip2 have the same network address
1358 ip1 = ipaddress.IPv4Network('1.1.1.0/24')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001359 ip2 = ipaddress.IPv4Network('1.1.1.0/32')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001360 ip3 = ipaddress.IPv4Network('1.1.2.0/24')
1361
1362 self.assertTrue(ip1 < ip3)
1363 self.assertTrue(ip3 > ip2)
1364
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001365 self.assertEqual(ip1.compare_networks(ip1), 0)
1366
1367 # if addresses are the same, sort by netmask
1368 self.assertEqual(ip1.compare_networks(ip2), -1)
1369 self.assertEqual(ip2.compare_networks(ip1), 1)
1370
Nick Coghlandc9b2552012-05-20 21:01:57 +10001371 self.assertEqual(ip1.compare_networks(ip3), -1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001372 self.assertEqual(ip3.compare_networks(ip1), 1)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001373 self.assertTrue(ip1._get_networks_key() < ip3._get_networks_key())
1374
1375 ip1 = ipaddress.IPv6Network('2001:2000::/96')
1376 ip2 = ipaddress.IPv6Network('2001:2001::/96')
1377 ip3 = ipaddress.IPv6Network('2001:ffff:2000::/96')
1378
1379 self.assertTrue(ip1 < ip3)
1380 self.assertTrue(ip3 > ip2)
1381 self.assertEqual(ip1.compare_networks(ip3), -1)
1382 self.assertTrue(ip1._get_networks_key() < ip3._get_networks_key())
1383
1384 # Test comparing different protocols.
1385 # Should always raise a TypeError.
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001386 self.assertRaises(TypeError,
1387 self.ipv4_network.compare_networks,
1388 self.ipv6_network)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001389 ipv6 = ipaddress.IPv6Interface('::/0')
1390 ipv4 = ipaddress.IPv4Interface('0.0.0.0/0')
1391 self.assertRaises(TypeError, ipv4.__lt__, ipv6)
1392 self.assertRaises(TypeError, ipv4.__gt__, ipv6)
1393 self.assertRaises(TypeError, ipv6.__lt__, ipv4)
1394 self.assertRaises(TypeError, ipv6.__gt__, ipv4)
1395
1396 # Regression test for issue 19.
1397 ip1 = ipaddress.ip_network('10.1.2.128/25')
1398 self.assertFalse(ip1 < ip1)
1399 self.assertFalse(ip1 > ip1)
1400 ip2 = ipaddress.ip_network('10.1.3.0/24')
1401 self.assertTrue(ip1 < ip2)
1402 self.assertFalse(ip2 < ip1)
1403 self.assertFalse(ip1 > ip2)
1404 self.assertTrue(ip2 > ip1)
1405 ip3 = ipaddress.ip_network('10.1.3.0/25')
1406 self.assertTrue(ip2 < ip3)
1407 self.assertFalse(ip3 < ip2)
1408 self.assertFalse(ip2 > ip3)
1409 self.assertTrue(ip3 > ip2)
1410
1411 # Regression test for issue 28.
1412 ip1 = ipaddress.ip_network('10.10.10.0/31')
1413 ip2 = ipaddress.ip_network('10.10.10.0')
1414 ip3 = ipaddress.ip_network('10.10.10.2/31')
1415 ip4 = ipaddress.ip_network('10.10.10.2')
1416 sorted = [ip1, ip2, ip3, ip4]
1417 unsorted = [ip2, ip4, ip1, ip3]
1418 unsorted.sort()
1419 self.assertEqual(sorted, unsorted)
1420 unsorted = [ip4, ip1, ip3, ip2]
1421 unsorted.sort()
1422 self.assertEqual(sorted, unsorted)
Serhiy Storchakaf186e122015-01-26 10:11:16 +02001423 self.assertIs(ip1.__lt__(ipaddress.ip_address('10.10.10.0')),
1424 NotImplemented)
1425 self.assertIs(ip2.__lt__(ipaddress.ip_address('10.10.10.0')),
1426 NotImplemented)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001427
1428 # <=, >=
1429 self.assertTrue(ipaddress.ip_network('1.1.1.1') <=
1430 ipaddress.ip_network('1.1.1.1'))
1431 self.assertTrue(ipaddress.ip_network('1.1.1.1') <=
1432 ipaddress.ip_network('1.1.1.2'))
1433 self.assertFalse(ipaddress.ip_network('1.1.1.2') <=
1434 ipaddress.ip_network('1.1.1.1'))
1435 self.assertTrue(ipaddress.ip_network('::1') <=
1436 ipaddress.ip_network('::1'))
1437 self.assertTrue(ipaddress.ip_network('::1') <=
1438 ipaddress.ip_network('::2'))
1439 self.assertFalse(ipaddress.ip_network('::2') <=
1440 ipaddress.ip_network('::1'))
1441
1442 def testStrictNetworks(self):
1443 self.assertRaises(ValueError, ipaddress.ip_network, '192.168.1.1/24')
1444 self.assertRaises(ValueError, ipaddress.ip_network, '::1/120')
1445
1446 def testOverlaps(self):
1447 other = ipaddress.IPv4Network('1.2.3.0/30')
1448 other2 = ipaddress.IPv4Network('1.2.2.0/24')
1449 other3 = ipaddress.IPv4Network('1.2.2.64/26')
1450 self.assertTrue(self.ipv4_network.overlaps(other))
1451 self.assertFalse(self.ipv4_network.overlaps(other2))
1452 self.assertTrue(other2.overlaps(other3))
1453
1454 def testEmbeddedIpv4(self):
1455 ipv4_string = '192.168.0.1'
1456 ipv4 = ipaddress.IPv4Interface(ipv4_string)
1457 v4compat_ipv6 = ipaddress.IPv6Interface('::%s' % ipv4_string)
1458 self.assertEqual(int(v4compat_ipv6.ip), int(ipv4.ip))
1459 v4mapped_ipv6 = ipaddress.IPv6Interface('::ffff:%s' % ipv4_string)
1460 self.assertNotEqual(v4mapped_ipv6.ip, ipv4.ip)
1461 self.assertRaises(ipaddress.AddressValueError, ipaddress.IPv6Interface,
1462 '2001:1.1.1.1:1.1.1.1')
1463
1464 # Issue 67: IPv6 with embedded IPv4 address not recognized.
1465 def testIPv6AddressTooLarge(self):
1466 # RFC4291 2.5.5.2
1467 self.assertEqual(ipaddress.ip_address('::FFFF:192.0.2.1'),
1468 ipaddress.ip_address('::FFFF:c000:201'))
1469 # RFC4291 2.2 (part 3) x::d.d.d.d
1470 self.assertEqual(ipaddress.ip_address('FFFF::192.0.2.1'),
1471 ipaddress.ip_address('FFFF::c000:201'))
1472
1473 def testIPVersion(self):
1474 self.assertEqual(self.ipv4_address.version, 4)
1475 self.assertEqual(self.ipv6_address.version, 6)
1476
1477 def testMaxPrefixLength(self):
1478 self.assertEqual(self.ipv4_interface.max_prefixlen, 32)
1479 self.assertEqual(self.ipv6_interface.max_prefixlen, 128)
1480
1481 def testPacked(self):
1482 self.assertEqual(self.ipv4_address.packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001483 b'\x01\x02\x03\x04')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001484 self.assertEqual(ipaddress.IPv4Interface('255.254.253.252').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001485 b'\xff\xfe\xfd\xfc')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001486 self.assertEqual(self.ipv6_address.packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001487 b'\x20\x01\x06\x58\x02\x2a\xca\xfe'
1488 b'\x02\x00\x00\x00\x00\x00\x00\x01')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001489 self.assertEqual(ipaddress.IPv6Interface('ffff:2:3:4:ffff::').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001490 b'\xff\xff\x00\x02\x00\x03\x00\x04\xff\xff'
1491 + b'\x00' * 6)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001492 self.assertEqual(ipaddress.IPv6Interface('::1:0:0:0:0').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001493 b'\x00' * 6 + b'\x00\x01' + b'\x00' * 8)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001494
Nick Coghlandc9b2552012-05-20 21:01:57 +10001495 def testIpType(self):
1496 ipv4net = ipaddress.ip_network('1.2.3.4')
1497 ipv4addr = ipaddress.ip_address('1.2.3.4')
1498 ipv6net = ipaddress.ip_network('::1.2.3.4')
1499 ipv6addr = ipaddress.ip_address('::1.2.3.4')
1500 self.assertEqual(ipaddress.IPv4Network, type(ipv4net))
1501 self.assertEqual(ipaddress.IPv4Address, type(ipv4addr))
1502 self.assertEqual(ipaddress.IPv6Network, type(ipv6net))
1503 self.assertEqual(ipaddress.IPv6Address, type(ipv6addr))
1504
1505 def testReservedIpv4(self):
1506 # test networks
1507 self.assertEqual(True, ipaddress.ip_interface(
1508 '224.1.1.1/31').is_multicast)
1509 self.assertEqual(False, ipaddress.ip_network('240.0.0.0').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001510 self.assertEqual(True, ipaddress.ip_network('240.0.0.0').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001511
1512 self.assertEqual(True, ipaddress.ip_interface(
1513 '192.168.1.1/17').is_private)
1514 self.assertEqual(False, ipaddress.ip_network('192.169.0.0').is_private)
1515 self.assertEqual(True, ipaddress.ip_network(
1516 '10.255.255.255').is_private)
1517 self.assertEqual(False, ipaddress.ip_network('11.0.0.0').is_private)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001518 self.assertEqual(False, ipaddress.ip_network('11.0.0.0').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001519 self.assertEqual(True, ipaddress.ip_network(
1520 '172.31.255.255').is_private)
1521 self.assertEqual(False, ipaddress.ip_network('172.32.0.0').is_private)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001522 self.assertEqual(True,
1523 ipaddress.ip_network('169.254.1.0/24').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001524
1525 self.assertEqual(True,
1526 ipaddress.ip_interface(
1527 '169.254.100.200/24').is_link_local)
1528 self.assertEqual(False,
1529 ipaddress.ip_interface(
1530 '169.255.100.200/24').is_link_local)
1531
1532 self.assertEqual(True,
1533 ipaddress.ip_network(
1534 '127.100.200.254/32').is_loopback)
1535 self.assertEqual(True, ipaddress.ip_network(
1536 '127.42.0.0/16').is_loopback)
1537 self.assertEqual(False, ipaddress.ip_network('128.0.0.0').is_loopback)
Peter Moodye5019d52013-10-24 09:47:10 -07001538 self.assertEqual(False,
1539 ipaddress.ip_network('100.64.0.0/10').is_private)
Peter Moodybe9c1b12013-10-22 12:36:21 -07001540 self.assertEqual(False, ipaddress.ip_network('100.64.0.0/10').is_global)
Peter Moodye5019d52013-10-24 09:47:10 -07001541
Peter Moody22c31762013-10-21 13:58:06 -07001542 self.assertEqual(True,
1543 ipaddress.ip_network('192.0.2.128/25').is_private)
1544 self.assertEqual(True,
1545 ipaddress.ip_network('192.0.3.0/24').is_global)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001546
1547 # test addresses
Hynek Schlawackbcd30442012-06-04 14:19:39 +02001548 self.assertEqual(True, ipaddress.ip_address('0.0.0.0').is_unspecified)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001549 self.assertEqual(True, ipaddress.ip_address('224.1.1.1').is_multicast)
1550 self.assertEqual(False, ipaddress.ip_address('240.0.0.0').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001551 self.assertEqual(True, ipaddress.ip_address('240.0.0.1').is_reserved)
1552 self.assertEqual(False,
1553 ipaddress.ip_address('239.255.255.255').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001554
1555 self.assertEqual(True, ipaddress.ip_address('192.168.1.1').is_private)
1556 self.assertEqual(False, ipaddress.ip_address('192.169.0.0').is_private)
1557 self.assertEqual(True, ipaddress.ip_address(
1558 '10.255.255.255').is_private)
1559 self.assertEqual(False, ipaddress.ip_address('11.0.0.0').is_private)
1560 self.assertEqual(True, ipaddress.ip_address(
1561 '172.31.255.255').is_private)
1562 self.assertEqual(False, ipaddress.ip_address('172.32.0.0').is_private)
1563
1564 self.assertEqual(True,
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001565 ipaddress.ip_address('169.254.100.200').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001566 self.assertEqual(False,
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001567 ipaddress.ip_address('169.255.100.200').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001568
1569 self.assertEqual(True,
1570 ipaddress.ip_address('127.100.200.254').is_loopback)
1571 self.assertEqual(True, ipaddress.ip_address('127.42.0.0').is_loopback)
1572 self.assertEqual(False, ipaddress.ip_address('128.0.0.0').is_loopback)
1573 self.assertEqual(True, ipaddress.ip_network('0.0.0.0').is_unspecified)
1574
1575 def testReservedIpv6(self):
1576
1577 self.assertEqual(True, ipaddress.ip_network('ffff::').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001578 self.assertEqual(True, ipaddress.ip_network(2**128 - 1).is_multicast)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001579 self.assertEqual(True, ipaddress.ip_network('ff00::').is_multicast)
1580 self.assertEqual(False, ipaddress.ip_network('fdff::').is_multicast)
1581
1582 self.assertEqual(True, ipaddress.ip_network('fecf::').is_site_local)
1583 self.assertEqual(True, ipaddress.ip_network(
1584 'feff:ffff:ffff:ffff::').is_site_local)
1585 self.assertEqual(False, ipaddress.ip_network(
1586 'fbf:ffff::').is_site_local)
1587 self.assertEqual(False, ipaddress.ip_network('ff00::').is_site_local)
1588
1589 self.assertEqual(True, ipaddress.ip_network('fc00::').is_private)
1590 self.assertEqual(True, ipaddress.ip_network(
1591 'fc00:ffff:ffff:ffff::').is_private)
1592 self.assertEqual(False, ipaddress.ip_network('fbff:ffff::').is_private)
1593 self.assertEqual(False, ipaddress.ip_network('fe00::').is_private)
1594
1595 self.assertEqual(True, ipaddress.ip_network('fea0::').is_link_local)
1596 self.assertEqual(True, ipaddress.ip_network(
1597 'febf:ffff::').is_link_local)
1598 self.assertEqual(False, ipaddress.ip_network(
1599 'fe7f:ffff::').is_link_local)
1600 self.assertEqual(False, ipaddress.ip_network('fec0::').is_link_local)
1601
1602 self.assertEqual(True, ipaddress.ip_interface('0:0::0:01').is_loopback)
1603 self.assertEqual(False, ipaddress.ip_interface('::1/127').is_loopback)
1604 self.assertEqual(False, ipaddress.ip_network('::').is_loopback)
1605 self.assertEqual(False, ipaddress.ip_network('::2').is_loopback)
1606
1607 self.assertEqual(True, ipaddress.ip_network('0::0').is_unspecified)
1608 self.assertEqual(False, ipaddress.ip_network('::1').is_unspecified)
1609 self.assertEqual(False, ipaddress.ip_network('::/127').is_unspecified)
1610
Peter Moody22c31762013-10-21 13:58:06 -07001611 self.assertEqual(True,
1612 ipaddress.ip_network('2001::1/128').is_private)
1613 self.assertEqual(True,
1614 ipaddress.ip_network('200::1/128').is_global)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001615 # test addresses
1616 self.assertEqual(True, ipaddress.ip_address('ffff::').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001617 self.assertEqual(True, ipaddress.ip_address(2**128 - 1).is_multicast)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001618 self.assertEqual(True, ipaddress.ip_address('ff00::').is_multicast)
1619 self.assertEqual(False, ipaddress.ip_address('fdff::').is_multicast)
1620
1621 self.assertEqual(True, ipaddress.ip_address('fecf::').is_site_local)
1622 self.assertEqual(True, ipaddress.ip_address(
1623 'feff:ffff:ffff:ffff::').is_site_local)
1624 self.assertEqual(False, ipaddress.ip_address(
1625 'fbf:ffff::').is_site_local)
1626 self.assertEqual(False, ipaddress.ip_address('ff00::').is_site_local)
1627
1628 self.assertEqual(True, ipaddress.ip_address('fc00::').is_private)
1629 self.assertEqual(True, ipaddress.ip_address(
1630 'fc00:ffff:ffff:ffff::').is_private)
1631 self.assertEqual(False, ipaddress.ip_address('fbff:ffff::').is_private)
1632 self.assertEqual(False, ipaddress.ip_address('fe00::').is_private)
1633
1634 self.assertEqual(True, ipaddress.ip_address('fea0::').is_link_local)
1635 self.assertEqual(True, ipaddress.ip_address(
1636 'febf:ffff::').is_link_local)
1637 self.assertEqual(False, ipaddress.ip_address(
1638 'fe7f:ffff::').is_link_local)
1639 self.assertEqual(False, ipaddress.ip_address('fec0::').is_link_local)
1640
1641 self.assertEqual(True, ipaddress.ip_address('0:0::0:01').is_loopback)
1642 self.assertEqual(True, ipaddress.ip_address('::1').is_loopback)
1643 self.assertEqual(False, ipaddress.ip_address('::2').is_loopback)
1644
1645 self.assertEqual(True, ipaddress.ip_address('0::0').is_unspecified)
1646 self.assertEqual(False, ipaddress.ip_address('::1').is_unspecified)
1647
1648 # some generic IETF reserved addresses
1649 self.assertEqual(True, ipaddress.ip_address('100::').is_reserved)
1650 self.assertEqual(True, ipaddress.ip_network('4000::1/128').is_reserved)
1651
1652 def testIpv4Mapped(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001653 self.assertEqual(
1654 ipaddress.ip_address('::ffff:192.168.1.1').ipv4_mapped,
1655 ipaddress.ip_address('192.168.1.1'))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001656 self.assertEqual(ipaddress.ip_address('::c0a8:101').ipv4_mapped, None)
1657 self.assertEqual(ipaddress.ip_address('::ffff:c0a8:101').ipv4_mapped,
1658 ipaddress.ip_address('192.168.1.1'))
1659
1660 def testAddrExclude(self):
1661 addr1 = ipaddress.ip_network('10.1.1.0/24')
1662 addr2 = ipaddress.ip_network('10.1.1.0/26')
1663 addr3 = ipaddress.ip_network('10.2.1.0/24')
1664 addr4 = ipaddress.ip_address('10.1.1.0')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001665 addr5 = ipaddress.ip_network('2001:db8::0/32')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001666 self.assertEqual(sorted(list(addr1.address_exclude(addr2))),
1667 [ipaddress.ip_network('10.1.1.64/26'),
1668 ipaddress.ip_network('10.1.1.128/25')])
1669 self.assertRaises(ValueError, list, addr1.address_exclude(addr3))
1670 self.assertRaises(TypeError, list, addr1.address_exclude(addr4))
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001671 self.assertRaises(TypeError, list, addr1.address_exclude(addr5))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001672 self.assertEqual(list(addr1.address_exclude(addr1)), [])
1673
1674 def testHash(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001675 self.assertEqual(hash(ipaddress.ip_interface('10.1.1.0/24')),
1676 hash(ipaddress.ip_interface('10.1.1.0/24')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001677 self.assertEqual(hash(ipaddress.ip_network('10.1.1.0/24')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001678 hash(ipaddress.ip_network('10.1.1.0/24')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001679 self.assertEqual(hash(ipaddress.ip_address('10.1.1.0')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001680 hash(ipaddress.ip_address('10.1.1.0')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001681 # i70
1682 self.assertEqual(hash(ipaddress.ip_address('1.2.3.4')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001683 hash(ipaddress.ip_address(
Nick Coghlandc9b2552012-05-20 21:01:57 +10001684 int(ipaddress.ip_address('1.2.3.4')._ip))))
1685 ip1 = ipaddress.ip_address('10.1.1.0')
1686 ip2 = ipaddress.ip_address('1::')
1687 dummy = {}
1688 dummy[self.ipv4_address] = None
1689 dummy[self.ipv6_address] = None
1690 dummy[ip1] = None
1691 dummy[ip2] = None
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001692 self.assertIn(self.ipv4_address, dummy)
1693 self.assertIn(ip2, dummy)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001694
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001695 def testIPBases(self):
1696 net = self.ipv4_network
1697 self.assertEqual('1.2.3.0/24', net.compressed)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001698 net = self.ipv6_network
1699 self.assertRaises(ValueError, net._string_from_ip_int, 2**128 + 1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001700
Hynek Schlawack454a74d2012-06-04 18:14:02 +02001701 def testIPv6NetworkHelpers(self):
1702 net = self.ipv6_network
1703 self.assertEqual('2001:658:22a:cafe::/64', net.with_prefixlen)
1704 self.assertEqual('2001:658:22a:cafe::/ffff:ffff:ffff:ffff::',
1705 net.with_netmask)
1706 self.assertEqual('2001:658:22a:cafe::/::ffff:ffff:ffff:ffff',
1707 net.with_hostmask)
1708 self.assertEqual('2001:658:22a:cafe::/64', str(net))
1709
1710 def testIPv4NetworkHelpers(self):
1711 net = self.ipv4_network
1712 self.assertEqual('1.2.3.0/24', net.with_prefixlen)
1713 self.assertEqual('1.2.3.0/255.255.255.0', net.with_netmask)
1714 self.assertEqual('1.2.3.0/0.0.0.255', net.with_hostmask)
1715 self.assertEqual('1.2.3.0/24', str(net))
1716
Nick Coghlandc9b2552012-05-20 21:01:57 +10001717 def testCopyConstructor(self):
1718 addr1 = ipaddress.ip_network('10.1.1.0/24')
1719 addr2 = ipaddress.ip_network(addr1)
1720 addr3 = ipaddress.ip_interface('2001:658:22a:cafe:200::1/64')
1721 addr4 = ipaddress.ip_interface(addr3)
1722 addr5 = ipaddress.IPv4Address('1.1.1.1')
1723 addr6 = ipaddress.IPv6Address('2001:658:22a:cafe:200::1')
1724
1725 self.assertEqual(addr1, addr2)
1726 self.assertEqual(addr3, addr4)
1727 self.assertEqual(addr5, ipaddress.IPv4Address(addr5))
1728 self.assertEqual(addr6, ipaddress.IPv6Address(addr6))
1729
1730 def testCompressIPv6Address(self):
1731 test_addresses = {
1732 '1:2:3:4:5:6:7:8': '1:2:3:4:5:6:7:8/128',
1733 '2001:0:0:4:0:0:0:8': '2001:0:0:4::8/128',
1734 '2001:0:0:4:5:6:7:8': '2001::4:5:6:7:8/128',
1735 '2001:0:3:4:5:6:7:8': '2001:0:3:4:5:6:7:8/128',
1736 '2001:0:3:4:5:6:7:8': '2001:0:3:4:5:6:7:8/128',
1737 '0:0:3:0:0:0:0:ffff': '0:0:3::ffff/128',
1738 '0:0:0:4:0:0:0:ffff': '::4:0:0:0:ffff/128',
1739 '0:0:0:0:5:0:0:ffff': '::5:0:0:ffff/128',
1740 '1:0:0:4:0:0:7:8': '1::4:0:0:7:8/128',
1741 '0:0:0:0:0:0:0:0': '::/128',
1742 '0:0:0:0:0:0:0:0/0': '::/0',
1743 '0:0:0:0:0:0:0:1': '::1/128',
1744 '2001:0658:022a:cafe:0000:0000:0000:0000/66':
1745 '2001:658:22a:cafe::/66',
1746 '::1.2.3.4': '::102:304/128',
1747 '1:2:3:4:5:ffff:1.2.3.4': '1:2:3:4:5:ffff:102:304/128',
1748 '::7:6:5:4:3:2:1': '0:7:6:5:4:3:2:1/128',
1749 '::7:6:5:4:3:2:0': '0:7:6:5:4:3:2:0/128',
1750 '7:6:5:4:3:2:1::': '7:6:5:4:3:2:1:0/128',
1751 '0:6:5:4:3:2:1::': '0:6:5:4:3:2:1:0/128',
1752 }
1753 for uncompressed, compressed in list(test_addresses.items()):
1754 self.assertEqual(compressed, str(ipaddress.IPv6Interface(
1755 uncompressed)))
1756
1757 def testExplodeShortHandIpStr(self):
1758 addr1 = ipaddress.IPv6Interface('2001::1')
1759 addr2 = ipaddress.IPv6Address('2001:0:5ef5:79fd:0:59d:a0e5:ba1')
1760 addr3 = ipaddress.IPv6Network('2001::/96')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001761 addr4 = ipaddress.IPv4Address('192.168.178.1')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001762 self.assertEqual('2001:0000:0000:0000:0000:0000:0000:0001/128',
1763 addr1.exploded)
1764 self.assertEqual('0000:0000:0000:0000:0000:0000:0000:0001/128',
1765 ipaddress.IPv6Interface('::1/128').exploded)
1766 # issue 77
1767 self.assertEqual('2001:0000:5ef5:79fd:0000:059d:a0e5:0ba1',
1768 addr2.exploded)
1769 self.assertEqual('2001:0000:0000:0000:0000:0000:0000:0000/96',
1770 addr3.exploded)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001771 self.assertEqual('192.168.178.1', addr4.exploded)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001772
Eric V. Smithebdaaf42014-04-14 12:58:07 -04001773 def testReversePointer(self):
1774 addr1 = ipaddress.IPv4Address('127.0.0.1')
1775 addr2 = ipaddress.IPv6Address('2001:db8::1')
1776 self.assertEqual('1.0.0.127.in-addr.arpa', addr1.reverse_pointer)
1777 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.' +
1778 'b.d.0.1.0.0.2.ip6.arpa',
1779 addr2.reverse_pointer)
1780
Nick Coghlandc9b2552012-05-20 21:01:57 +10001781 def testIntRepresentation(self):
1782 self.assertEqual(16909060, int(self.ipv4_address))
1783 self.assertEqual(42540616829182469433547762482097946625,
1784 int(self.ipv6_address))
1785
Nick Coghlandc9b2552012-05-20 21:01:57 +10001786 def testForceVersion(self):
1787 self.assertEqual(ipaddress.ip_network(1).version, 4)
Nick Coghlan51c30672012-05-27 00:25:58 +10001788 self.assertEqual(ipaddress.IPv6Network(1).version, 6)
Sandro Tosi876ecad2012-05-23 22:26:55 +02001789
Nick Coghlandc9b2552012-05-20 21:01:57 +10001790 def testWithStar(self):
Nick Coghlana8517ad2012-08-20 10:04:26 +10001791 self.assertEqual(self.ipv4_interface.with_prefixlen, "1.2.3.4/24")
1792 self.assertEqual(self.ipv4_interface.with_netmask,
Nick Coghlandc9b2552012-05-20 21:01:57 +10001793 "1.2.3.4/255.255.255.0")
Nick Coghlana8517ad2012-08-20 10:04:26 +10001794 self.assertEqual(self.ipv4_interface.with_hostmask,
Nick Coghlandc9b2552012-05-20 21:01:57 +10001795 "1.2.3.4/0.0.0.255")
1796
Nick Coghlana8517ad2012-08-20 10:04:26 +10001797 self.assertEqual(self.ipv6_interface.with_prefixlen,
Nick Coghlandc9b2552012-05-20 21:01:57 +10001798 '2001:658:22a:cafe:200::1/64')
Nick Coghlana8517ad2012-08-20 10:04:26 +10001799 self.assertEqual(self.ipv6_interface.with_netmask,
1800 '2001:658:22a:cafe:200::1/ffff:ffff:ffff:ffff::')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001801 # this probably don't make much sense, but it's included for
1802 # compatibility with ipv4
Nick Coghlana8517ad2012-08-20 10:04:26 +10001803 self.assertEqual(self.ipv6_interface.with_hostmask,
Nick Coghlandc9b2552012-05-20 21:01:57 +10001804 '2001:658:22a:cafe:200::1/::ffff:ffff:ffff:ffff')
1805
1806 def testNetworkElementCaching(self):
1807 # V4 - make sure we're empty
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001808 self.assertNotIn('network_address', self.ipv4_network._cache)
1809 self.assertNotIn('broadcast_address', self.ipv4_network._cache)
1810 self.assertNotIn('hostmask', self.ipv4_network._cache)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001811
1812 # V4 - populate and test
1813 self.assertEqual(self.ipv4_network.network_address,
1814 ipaddress.IPv4Address('1.2.3.0'))
1815 self.assertEqual(self.ipv4_network.broadcast_address,
1816 ipaddress.IPv4Address('1.2.3.255'))
1817 self.assertEqual(self.ipv4_network.hostmask,
1818 ipaddress.IPv4Address('0.0.0.255'))
1819
1820 # V4 - check we're cached
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001821 self.assertIn('broadcast_address', self.ipv4_network._cache)
1822 self.assertIn('hostmask', self.ipv4_network._cache)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001823
1824 # V6 - make sure we're empty
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001825 self.assertNotIn('broadcast_address', self.ipv6_network._cache)
1826 self.assertNotIn('hostmask', self.ipv6_network._cache)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001827
1828 # V6 - populate and test
1829 self.assertEqual(self.ipv6_network.network_address,
1830 ipaddress.IPv6Address('2001:658:22a:cafe::'))
1831 self.assertEqual(self.ipv6_interface.network.network_address,
1832 ipaddress.IPv6Address('2001:658:22a:cafe::'))
1833
1834 self.assertEqual(
1835 self.ipv6_network.broadcast_address,
1836 ipaddress.IPv6Address('2001:658:22a:cafe:ffff:ffff:ffff:ffff'))
1837 self.assertEqual(self.ipv6_network.hostmask,
1838 ipaddress.IPv6Address('::ffff:ffff:ffff:ffff'))
1839 self.assertEqual(
1840 self.ipv6_interface.network.broadcast_address,
1841 ipaddress.IPv6Address('2001:658:22a:cafe:ffff:ffff:ffff:ffff'))
1842 self.assertEqual(self.ipv6_interface.network.hostmask,
1843 ipaddress.IPv6Address('::ffff:ffff:ffff:ffff'))
1844
1845 # V6 - check we're cached
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001846 self.assertIn('broadcast_address', self.ipv6_network._cache)
1847 self.assertIn('hostmask', self.ipv6_network._cache)
1848 self.assertIn('broadcast_address', self.ipv6_interface.network._cache)
1849 self.assertIn('hostmask', self.ipv6_interface.network._cache)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001850
1851 def testTeredo(self):
1852 # stolen from wikipedia
1853 server = ipaddress.IPv4Address('65.54.227.120')
1854 client = ipaddress.IPv4Address('192.0.2.45')
1855 teredo_addr = '2001:0000:4136:e378:8000:63bf:3fff:fdd2'
1856 self.assertEqual((server, client),
1857 ipaddress.ip_address(teredo_addr).teredo)
1858 bad_addr = '2000::4136:e378:8000:63bf:3fff:fdd2'
1859 self.assertFalse(ipaddress.ip_address(bad_addr).teredo)
1860 bad_addr = '2001:0001:4136:e378:8000:63bf:3fff:fdd2'
1861 self.assertFalse(ipaddress.ip_address(bad_addr).teredo)
1862
1863 # i77
1864 teredo_addr = ipaddress.IPv6Address('2001:0:5ef5:79fd:0:59d:a0e5:ba1')
1865 self.assertEqual((ipaddress.IPv4Address('94.245.121.253'),
1866 ipaddress.IPv4Address('95.26.244.94')),
1867 teredo_addr.teredo)
1868
Nick Coghlandc9b2552012-05-20 21:01:57 +10001869 def testsixtofour(self):
1870 sixtofouraddr = ipaddress.ip_address('2002:ac1d:2d64::1')
1871 bad_addr = ipaddress.ip_address('2000:ac1d:2d64::1')
1872 self.assertEqual(ipaddress.IPv4Address('172.29.45.100'),
1873 sixtofouraddr.sixtofour)
1874 self.assertFalse(bad_addr.sixtofour)
1875
Nick Coghlandc9b2552012-05-20 21:01:57 +10001876
1877if __name__ == '__main__':
1878 unittest.main()