blob: 20316f15f8cfbd1259158f7c625efc3051ce6ba3 [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
Joel Croteaue653d4d2019-03-30 07:53:48 -070095
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")
Joel Croteaue653d4d2019-03-30 07:53:48 -0700101 self.assertInstancesEqual("016.016.016.016", "16.16.16.16")
102 self.assertInstancesEqual("001.000.008.016", "1.0.8.16")
Nick Coghlan07c4e332012-07-08 23:06:45 +1000103
104 def test_int(self):
105 self.assertInstancesEqual(0, "0.0.0.0")
106 self.assertInstancesEqual(3232235521, "192.168.0.1")
107
108 def test_packed(self):
109 self.assertInstancesEqual(bytes.fromhex("00000000"), "0.0.0.0")
110 self.assertInstancesEqual(bytes.fromhex("c0a80001"), "192.168.0.1")
Nick Coghlan297b1432012-07-08 17:11:04 +1000111
112 def test_negative_ints_rejected(self):
113 msg = "-1 (< 0) is not permitted as an IPv4 address"
114 with self.assertAddressError(re.escape(msg)):
115 self.factory(-1)
116
117 def test_large_ints_rejected(self):
118 msg = "%d (>= 2**32) is not permitted as an IPv4 address"
119 with self.assertAddressError(re.escape(msg % 2**32)):
120 self.factory(2**32)
121
122 def test_bad_packed_length(self):
123 def assertBadLength(length):
Serhiy Storchaka5f1a5182016-09-11 14:41:02 +0300124 addr = b'\0' * length
Nick Coghlan297b1432012-07-08 17:11:04 +1000125 msg = "%r (len %d != 4) is not permitted as an IPv4 address"
126 with self.assertAddressError(re.escape(msg % (addr, length))):
127 self.factory(addr)
128
129 assertBadLength(3)
130 assertBadLength(5)
131
R David Murray75678652014-10-12 15:17:22 -0400132
Nick Coghlan07c4e332012-07-08 23:06:45 +1000133class CommonTestMixin_v6(CommonTestMixin):
134
135 def test_leading_zeros(self):
136 self.assertInstancesEqual("0000::0000", "::")
137 self.assertInstancesEqual("000::c0a8:0001", "::c0a8:1")
138
139 def test_int(self):
140 self.assertInstancesEqual(0, "::")
141 self.assertInstancesEqual(3232235521, "::c0a8:1")
142
143 def test_packed(self):
Serhiy Storchaka5f1a5182016-09-11 14:41:02 +0300144 addr = b'\0'*12 + bytes.fromhex("00000000")
Nick Coghlan07c4e332012-07-08 23:06:45 +1000145 self.assertInstancesEqual(addr, "::")
Serhiy Storchaka5f1a5182016-09-11 14:41:02 +0300146 addr = b'\0'*12 + bytes.fromhex("c0a80001")
Nick Coghlan07c4e332012-07-08 23:06:45 +1000147 self.assertInstancesEqual(addr, "::c0a8:1")
Serhiy Storchaka5f1a5182016-09-11 14:41:02 +0300148 addr = bytes.fromhex("c0a80001") + b'\0'*12
Nick Coghlan07c4e332012-07-08 23:06:45 +1000149 self.assertInstancesEqual(addr, "c0a8:1::")
Nick Coghlan297b1432012-07-08 17:11:04 +1000150
151 def test_negative_ints_rejected(self):
152 msg = "-1 (< 0) is not permitted as an IPv6 address"
153 with self.assertAddressError(re.escape(msg)):
154 self.factory(-1)
155
156 def test_large_ints_rejected(self):
157 msg = "%d (>= 2**128) is not permitted as an IPv6 address"
158 with self.assertAddressError(re.escape(msg % 2**128)):
159 self.factory(2**128)
160
161 def test_bad_packed_length(self):
162 def assertBadLength(length):
Serhiy Storchaka5f1a5182016-09-11 14:41:02 +0300163 addr = b'\0' * length
Nick Coghlan297b1432012-07-08 17:11:04 +1000164 msg = "%r (len %d != 16) is not permitted as an IPv6 address"
165 with self.assertAddressError(re.escape(msg % (addr, length))):
166 self.factory(addr)
167 self.factory(addr)
168
169 assertBadLength(15)
170 assertBadLength(17)
171
172
Nick Coghlan07c4e332012-07-08 23:06:45 +1000173class AddressTestCase_v4(BaseTestCase, CommonTestMixin_v4):
Nick Coghlan297b1432012-07-08 17:11:04 +1000174 factory = ipaddress.IPv4Address
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000175
176 def test_network_passed_as_address(self):
177 addr = "127.0.0.1/24"
178 with self.assertAddressError("Unexpected '/' in %r", addr):
179 ipaddress.IPv4Address(addr)
180
181 def test_bad_address_split(self):
182 def assertBadSplit(addr):
183 with self.assertAddressError("Expected 4 octets in %r", addr):
184 ipaddress.IPv4Address(addr)
185
186 assertBadSplit("127.0.1")
187 assertBadSplit("42.42.42.42.42")
188 assertBadSplit("42.42.42")
189 assertBadSplit("42.42")
190 assertBadSplit("42")
191 assertBadSplit("42..42.42.42")
192 assertBadSplit("42.42.42.42.")
193 assertBadSplit("42.42.42.42...")
194 assertBadSplit(".42.42.42.42")
195 assertBadSplit("...42.42.42.42")
196 assertBadSplit("016.016.016")
197 assertBadSplit("016.016")
198 assertBadSplit("016")
199 assertBadSplit("000")
200 assertBadSplit("0x0a.0x0a.0x0a")
201 assertBadSplit("0x0a.0x0a")
202 assertBadSplit("0x0a")
203 assertBadSplit(".")
204 assertBadSplit("bogus")
205 assertBadSplit("bogus.com")
206 assertBadSplit("1000")
207 assertBadSplit("1000000000000000")
208 assertBadSplit("192.168.0.1.com")
209
210 def test_empty_octet(self):
211 def assertBadOctet(addr):
212 with self.assertAddressError("Empty octet not permitted in %r",
R David Murray75678652014-10-12 15:17:22 -0400213 addr):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000214 ipaddress.IPv4Address(addr)
215
216 assertBadOctet("42..42.42")
217 assertBadOctet("...")
218
219 def test_invalid_characters(self):
220 def assertBadOctet(addr, octet):
221 msg = "Only decimal digits permitted in %r in %r" % (octet, addr)
222 with self.assertAddressError(re.escape(msg)):
223 ipaddress.IPv4Address(addr)
224
225 assertBadOctet("0x0a.0x0a.0x0a.0x0a", "0x0a")
Nick Coghlan07c4e332012-07-08 23:06:45 +1000226 assertBadOctet("0xa.0x0a.0x0a.0x0a", "0xa")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000227 assertBadOctet("42.42.42.-0", "-0")
228 assertBadOctet("42.42.42.+0", "+0")
229 assertBadOctet("42.42.42.-42", "-42")
230 assertBadOctet("+1.+2.+3.4", "+1")
231 assertBadOctet("1.2.3.4e0", "4e0")
232 assertBadOctet("1.2.3.4::", "4::")
233 assertBadOctet("1.a.2.3", "a")
234
Nick Coghlan07c4e332012-07-08 23:06:45 +1000235 def test_octet_length(self):
236 def assertBadOctet(addr, octet):
237 msg = "At most 3 characters permitted in %r in %r"
238 with self.assertAddressError(re.escape(msg % (octet, addr))):
239 ipaddress.IPv4Address(addr)
240
241 assertBadOctet("0000.000.000.000", "0000")
242 assertBadOctet("12345.67899.-54321.-98765", "12345")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000243
244 def test_octet_limit(self):
245 def assertBadOctet(addr, octet):
Nick Coghlanb582ecc2012-07-07 22:15:22 +1000246 msg = "Octet %d (> 255) not permitted in %r" % (octet, addr)
247 with self.assertAddressError(re.escape(msg)):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000248 ipaddress.IPv4Address(addr)
249
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000250 assertBadOctet("257.0.0.0", 257)
Nick Coghlan07c4e332012-07-08 23:06:45 +1000251 assertBadOctet("192.168.0.999", 999)
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000252
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +0200253 def test_pickle(self):
254 self.pickle_test('192.0.2.1')
255
Serhiy Storchaka88f64f32015-03-07 20:08:34 +0200256 def test_weakref(self):
257 weakref.ref(self.factory('192.0.2.1'))
258
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000259
Nick Coghlan07c4e332012-07-08 23:06:45 +1000260class AddressTestCase_v6(BaseTestCase, CommonTestMixin_v6):
Nick Coghlan297b1432012-07-08 17:11:04 +1000261 factory = ipaddress.IPv6Address
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000262
263 def test_network_passed_as_address(self):
264 addr = "::1/24"
265 with self.assertAddressError("Unexpected '/' in %r", addr):
266 ipaddress.IPv6Address(addr)
267
268 def test_bad_address_split_v6_not_enough_parts(self):
269 def assertBadSplit(addr):
270 msg = "At least 3 parts expected in %r"
271 with self.assertAddressError(msg, addr):
272 ipaddress.IPv6Address(addr)
273
274 assertBadSplit(":")
275 assertBadSplit(":1")
276 assertBadSplit("FEDC:9878")
277
278 def test_bad_address_split_v6_too_many_colons(self):
279 def assertBadSplit(addr):
280 msg = "At most 8 colons permitted in %r"
281 with self.assertAddressError(msg, addr):
282 ipaddress.IPv6Address(addr)
283
284 assertBadSplit("9:8:7:6:5:4:3::2:1")
285 assertBadSplit("10:9:8:7:6:5:4:3:2:1")
286 assertBadSplit("::8:7:6:5:4:3:2:1")
287 assertBadSplit("8:7:6:5:4:3:2:1::")
288 # A trailing IPv4 address is two parts
289 assertBadSplit("10:9:8:7:6:5:4:3:42.42.42.42")
290
291 def test_bad_address_split_v6_too_many_parts(self):
292 def assertBadSplit(addr):
293 msg = "Exactly 8 parts expected without '::' in %r"
294 with self.assertAddressError(msg, addr):
295 ipaddress.IPv6Address(addr)
296
297 assertBadSplit("3ffe:0:0:0:0:0:0:0:1")
298 assertBadSplit("9:8:7:6:5:4:3:2:1")
299 assertBadSplit("7:6:5:4:3:2:1")
300 # A trailing IPv4 address is two parts
301 assertBadSplit("9:8:7:6:5:4:3:42.42.42.42")
302 assertBadSplit("7:6:5:4:3:42.42.42.42")
303
304 def test_bad_address_split_v6_too_many_parts_with_double_colon(self):
305 def assertBadSplit(addr):
306 msg = "Expected at most 7 other parts with '::' in %r"
307 with self.assertAddressError(msg, addr):
308 ipaddress.IPv6Address(addr)
309
310 assertBadSplit("1:2:3:4::5:6:7:8")
311
312 def test_bad_address_split_v6_repeated_double_colon(self):
313 def assertBadSplit(addr):
314 msg = "At most one '::' permitted in %r"
315 with self.assertAddressError(msg, addr):
316 ipaddress.IPv6Address(addr)
317
318 assertBadSplit("3ffe::1::1")
319 assertBadSplit("1::2::3::4:5")
320 assertBadSplit("2001::db:::1")
321 assertBadSplit("3ffe::1::")
322 assertBadSplit("::3ffe::1")
323 assertBadSplit(":3ffe::1::1")
324 assertBadSplit("3ffe::1::1:")
325 assertBadSplit(":3ffe::1::1:")
326 assertBadSplit(":::")
327 assertBadSplit('2001:db8:::1')
328
329 def test_bad_address_split_v6_leading_colon(self):
330 def assertBadSplit(addr):
331 msg = "Leading ':' only permitted as part of '::' in %r"
332 with self.assertAddressError(msg, addr):
333 ipaddress.IPv6Address(addr)
334
335 assertBadSplit(":2001:db8::1")
336 assertBadSplit(":1:2:3:4:5:6:7")
337 assertBadSplit(":1:2:3:4:5:6:")
338 assertBadSplit(":6:5:4:3:2:1::")
339
340 def test_bad_address_split_v6_trailing_colon(self):
341 def assertBadSplit(addr):
342 msg = "Trailing ':' only permitted as part of '::' in %r"
343 with self.assertAddressError(msg, addr):
344 ipaddress.IPv6Address(addr)
345
346 assertBadSplit("2001:db8::1:")
347 assertBadSplit("1:2:3:4:5:6:7:")
348 assertBadSplit("::1.2.3.4:")
349 assertBadSplit("::7:6:5:4:3:2:")
350
351 def test_bad_v4_part_in(self):
352 def assertBadAddressPart(addr, v4_error):
353 with self.assertAddressError("%s in %r", v4_error, addr):
354 ipaddress.IPv6Address(addr)
355
356 assertBadAddressPart("3ffe::1.net", "Expected 4 octets in '1.net'")
357 assertBadAddressPart("3ffe::127.0.1",
358 "Expected 4 octets in '127.0.1'")
359 assertBadAddressPart("::1.2.3",
360 "Expected 4 octets in '1.2.3'")
361 assertBadAddressPart("::1.2.3.4.5",
362 "Expected 4 octets in '1.2.3.4.5'")
363 assertBadAddressPart("3ffe::1.1.1.net",
364 "Only decimal digits permitted in 'net' "
365 "in '1.1.1.net'")
366
367 def test_invalid_characters(self):
368 def assertBadPart(addr, part):
369 msg = "Only hex digits permitted in %r in %r" % (part, addr)
370 with self.assertAddressError(re.escape(msg)):
371 ipaddress.IPv6Address(addr)
372
373 assertBadPart("3ffe::goog", "goog")
374 assertBadPart("3ffe::-0", "-0")
375 assertBadPart("3ffe::+0", "+0")
376 assertBadPart("3ffe::-1", "-1")
377 assertBadPart("1.2.3.4::", "1.2.3.4")
378 assertBadPart('1234:axy::b', "axy")
379
380 def test_part_length(self):
381 def assertBadPart(addr, part):
382 msg = "At most 4 characters permitted in %r in %r"
383 with self.assertAddressError(msg, part, addr):
384 ipaddress.IPv6Address(addr)
385
Nick Coghlan07c4e332012-07-08 23:06:45 +1000386 assertBadPart("::00000", "00000")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000387 assertBadPart("3ffe::10000", "10000")
388 assertBadPart("02001:db8::", "02001")
389 assertBadPart('2001:888888::1', "888888")
390
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +0200391 def test_pickle(self):
392 self.pickle_test('2001:db8::')
393
Serhiy Storchaka88f64f32015-03-07 20:08:34 +0200394 def test_weakref(self):
395 weakref.ref(self.factory('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
Cheryl Sabella5609b782018-03-20 20:09:15 -0400401 def test_no_mask(self):
Inada Naoki6fa84bd2019-04-16 08:32:28 +0900402 for address in ('1.2.3.4', 0x01020304, b'\x01\x02\x03\x04'):
403 net = self.factory(address)
404 self.assertEqual(str(net), '1.2.3.4/32')
405 self.assertEqual(str(net.netmask), '255.255.255.255')
406 self.assertEqual(str(net.hostmask), '0.0.0.0')
407 # IPv4Network has prefixlen, but IPv4Interface doesn't.
408 # Should we add it to IPv4Interface too? (bpo-36392)
Cheryl Sabella5609b782018-03-20 20:09:15 -0400409
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000410 def test_split_netmask(self):
411 addr = "1.2.3.4/32/24"
412 with self.assertAddressError("Only one '/' permitted in %r" % addr):
413 self.factory(addr)
414
415 def test_address_errors(self):
416 def assertBadAddress(addr, details):
417 with self.assertAddressError(details):
418 self.factory(addr)
419
Nick Coghlan297b1432012-07-08 17:11:04 +1000420 assertBadAddress("/", "Address cannot be empty")
421 assertBadAddress("/8", "Address cannot be empty")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000422 assertBadAddress("bogus", "Expected 4 octets")
423 assertBadAddress("google.com", "Expected 4 octets")
424 assertBadAddress("10/8", "Expected 4 octets")
425 assertBadAddress("::1.2.3.4", "Only decimal digits")
Nick Coghlanb582ecc2012-07-07 22:15:22 +1000426 assertBadAddress("1.2.3.256", re.escape("256 (> 255)"))
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000427
Nick Coghlan932346f2014-02-08 23:17:36 +1000428 def test_valid_netmask(self):
429 self.assertEqual(str(self.factory('192.0.2.0/255.255.255.0')),
430 '192.0.2.0/24')
431 for i in range(0, 33):
432 # Generate and re-parse the CIDR format (trivial).
433 net_str = '0.0.0.0/%d' % i
434 net = self.factory(net_str)
435 self.assertEqual(str(net), net_str)
436 # Generate and re-parse the expanded netmask.
437 self.assertEqual(
438 str(self.factory('0.0.0.0/%s' % net.netmask)), net_str)
439 # Zero prefix is treated as decimal.
440 self.assertEqual(str(self.factory('0.0.0.0/0%d' % i)), net_str)
441 # Generate and re-parse the expanded hostmask. The ambiguous
442 # cases (/0 and /32) are treated as netmasks.
443 if i in (32, 0):
444 net_str = '0.0.0.0/%d' % (32 - i)
445 self.assertEqual(
446 str(self.factory('0.0.0.0/%s' % net.hostmask)), net_str)
447
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000448 def test_netmask_errors(self):
449 def assertBadNetmask(addr, netmask):
Nick Coghlan932346f2014-02-08 23:17:36 +1000450 msg = "%r is not a valid netmask" % netmask
451 with self.assertNetmaskError(re.escape(msg)):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000452 self.factory("%s/%s" % (addr, netmask))
453
454 assertBadNetmask("1.2.3.4", "")
Nick Coghlan932346f2014-02-08 23:17:36 +1000455 assertBadNetmask("1.2.3.4", "-1")
456 assertBadNetmask("1.2.3.4", "+1")
457 assertBadNetmask("1.2.3.4", " 1 ")
458 assertBadNetmask("1.2.3.4", "0x1")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000459 assertBadNetmask("1.2.3.4", "33")
460 assertBadNetmask("1.2.3.4", "254.254.255.256")
Nick Coghlan932346f2014-02-08 23:17:36 +1000461 assertBadNetmask("1.2.3.4", "1.a.2.3")
Nick Coghlan07c4e332012-07-08 23:06:45 +1000462 assertBadNetmask("1.1.1.1", "254.xyz.2.3")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000463 assertBadNetmask("1.1.1.1", "240.255.0.0")
Nick Coghlan932346f2014-02-08 23:17:36 +1000464 assertBadNetmask("1.1.1.1", "255.254.128.0")
465 assertBadNetmask("1.1.1.1", "0.1.127.255")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000466 assertBadNetmask("1.1.1.1", "pudding")
Nick Coghlan932346f2014-02-08 23:17:36 +1000467 assertBadNetmask("1.1.1.1", "::")
468
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +0200469 def test_pickle(self):
470 self.pickle_test('192.0.2.0/27')
471 self.pickle_test('192.0.2.0/31') # IPV4LENGTH - 1
472 self.pickle_test('192.0.2.0') # IPV4LENGTH
473
R David Murray75678652014-10-12 15:17:22 -0400474
Serhiy Storchakaa556af72015-01-18 22:56:47 +0200475class InterfaceTestCase_v4(BaseTestCase, NetmaskTestMixin_v4):
476 factory = ipaddress.IPv4Interface
477
478
Nick Coghlan07c4e332012-07-08 23:06:45 +1000479class NetworkTestCase_v4(BaseTestCase, NetmaskTestMixin_v4):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000480 factory = ipaddress.IPv4Network
481
Cheryl Sabella91dc64b2017-10-22 17:39:49 -0400482 def test_subnet_of(self):
483 # containee left of container
484 self.assertFalse(
485 self.factory('10.0.0.0/30').subnet_of(
486 self.factory('10.0.1.0/24')))
487 # containee inside container
488 self.assertTrue(
489 self.factory('10.0.0.0/30').subnet_of(
490 self.factory('10.0.0.0/24')))
491 # containee right of container
492 self.assertFalse(
493 self.factory('10.0.0.0/30').subnet_of(
494 self.factory('10.0.1.0/24')))
495 # containee larger than container
496 self.assertFalse(
497 self.factory('10.0.1.0/24').subnet_of(
498 self.factory('10.0.0.0/30')))
499
500 def test_supernet_of(self):
501 # containee left of container
502 self.assertFalse(
503 self.factory('10.0.0.0/30').supernet_of(
504 self.factory('10.0.1.0/24')))
505 # containee inside container
506 self.assertFalse(
507 self.factory('10.0.0.0/30').supernet_of(
508 self.factory('10.0.0.0/24')))
509 # containee right of container
510 self.assertFalse(
511 self.factory('10.0.0.0/30').supernet_of(
512 self.factory('10.0.1.0/24')))
513 # containee larger than container
514 self.assertTrue(
515 self.factory('10.0.0.0/24').supernet_of(
516 self.factory('10.0.0.0/30')))
517
518 def test_subnet_of_mixed_types(self):
519 with self.assertRaises(TypeError):
520 ipaddress.IPv4Network('10.0.0.0/30').supernet_of(
521 ipaddress.IPv6Network('::1/128'))
522 with self.assertRaises(TypeError):
523 ipaddress.IPv6Network('::1/128').supernet_of(
524 ipaddress.IPv4Network('10.0.0.0/30'))
525 with self.assertRaises(TypeError):
526 ipaddress.IPv4Network('10.0.0.0/30').subnet_of(
527 ipaddress.IPv6Network('::1/128'))
528 with self.assertRaises(TypeError):
529 ipaddress.IPv6Network('::1/128').subnet_of(
530 ipaddress.IPv4Network('10.0.0.0/30'))
531
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000532
Nick Coghlan07c4e332012-07-08 23:06:45 +1000533class NetmaskTestMixin_v6(CommonTestMixin_v6):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000534 """Input validation on interfaces and networks is very similar"""
535
Inada Naoki6fa84bd2019-04-16 08:32:28 +0900536 def test_no_mask(self):
537 for address in ('::1', 1, b'\x00'*15 + b'\x01'):
538 net = self.factory(address)
539 self.assertEqual(str(net), '::1/128')
540 self.assertEqual(str(net.netmask), 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff')
541 self.assertEqual(str(net.hostmask), '::')
542 # IPv6Network has prefixlen, but IPv6Interface doesn't.
543 # Should we add it to IPv4Interface too? (bpo-36392)
544
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000545 def test_split_netmask(self):
546 addr = "cafe:cafe::/128/190"
547 with self.assertAddressError("Only one '/' permitted in %r" % addr):
548 self.factory(addr)
549
550 def test_address_errors(self):
551 def assertBadAddress(addr, details):
552 with self.assertAddressError(details):
553 self.factory(addr)
554
Nick Coghlan297b1432012-07-08 17:11:04 +1000555 assertBadAddress("/", "Address cannot be empty")
556 assertBadAddress("/8", "Address cannot be empty")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000557 assertBadAddress("google.com", "At least 3 parts")
558 assertBadAddress("1.2.3.4", "At least 3 parts")
559 assertBadAddress("10/8", "At least 3 parts")
560 assertBadAddress("1234:axy::b", "Only hex digits")
561
Nick Coghlan932346f2014-02-08 23:17:36 +1000562 def test_valid_netmask(self):
563 # We only support CIDR for IPv6, because expanded netmasks are not
564 # standard notation.
565 self.assertEqual(str(self.factory('2001:db8::/32')), '2001:db8::/32')
566 for i in range(0, 129):
567 # Generate and re-parse the CIDR format (trivial).
568 net_str = '::/%d' % i
569 self.assertEqual(str(self.factory(net_str)), net_str)
570 # Zero prefix is treated as decimal.
571 self.assertEqual(str(self.factory('::/0%d' % i)), net_str)
572
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000573 def test_netmask_errors(self):
574 def assertBadNetmask(addr, netmask):
Nick Coghlan932346f2014-02-08 23:17:36 +1000575 msg = "%r is not a valid netmask" % netmask
576 with self.assertNetmaskError(re.escape(msg)):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000577 self.factory("%s/%s" % (addr, netmask))
578
579 assertBadNetmask("::1", "")
580 assertBadNetmask("::1", "::1")
581 assertBadNetmask("::1", "1::")
Nick Coghlan932346f2014-02-08 23:17:36 +1000582 assertBadNetmask("::1", "-1")
583 assertBadNetmask("::1", "+1")
584 assertBadNetmask("::1", " 1 ")
585 assertBadNetmask("::1", "0x1")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000586 assertBadNetmask("::1", "129")
Nick Coghlan932346f2014-02-08 23:17:36 +1000587 assertBadNetmask("::1", "1.2.3.4")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000588 assertBadNetmask("::1", "pudding")
Nick Coghlan932346f2014-02-08 23:17:36 +1000589 assertBadNetmask("::", "::")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000590
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +0200591 def test_pickle(self):
592 self.pickle_test('2001:db8::1000/124')
593 self.pickle_test('2001:db8::1000/127') # IPV6LENGTH - 1
594 self.pickle_test('2001:db8::1000') # IPV6LENGTH
595
R David Murray75678652014-10-12 15:17:22 -0400596
Nick Coghlan07c4e332012-07-08 23:06:45 +1000597class InterfaceTestCase_v6(BaseTestCase, NetmaskTestMixin_v6):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000598 factory = ipaddress.IPv6Interface
599
R David Murray75678652014-10-12 15:17:22 -0400600
Nick Coghlan07c4e332012-07-08 23:06:45 +1000601class NetworkTestCase_v6(BaseTestCase, NetmaskTestMixin_v6):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000602 factory = ipaddress.IPv6Network
603
Cheryl Sabella91dc64b2017-10-22 17:39:49 -0400604 def test_subnet_of(self):
605 # containee left of container
606 self.assertFalse(
607 self.factory('2000:999::/56').subnet_of(
608 self.factory('2000:aaa::/48')))
609 # containee inside container
610 self.assertTrue(
611 self.factory('2000:aaa::/56').subnet_of(
612 self.factory('2000:aaa::/48')))
613 # containee right of container
614 self.assertFalse(
615 self.factory('2000:bbb::/56').subnet_of(
616 self.factory('2000:aaa::/48')))
617 # containee larger than container
618 self.assertFalse(
619 self.factory('2000:aaa::/48').subnet_of(
620 self.factory('2000:aaa::/56')))
621
622 def test_supernet_of(self):
623 # containee left of container
624 self.assertFalse(
625 self.factory('2000:999::/56').supernet_of(
626 self.factory('2000:aaa::/48')))
627 # containee inside container
628 self.assertFalse(
629 self.factory('2000:aaa::/56').supernet_of(
630 self.factory('2000:aaa::/48')))
631 # containee right of container
632 self.assertFalse(
633 self.factory('2000:bbb::/56').supernet_of(
634 self.factory('2000:aaa::/48')))
635 # containee larger than container
636 self.assertTrue(
637 self.factory('2000:aaa::/48').supernet_of(
638 self.factory('2000:aaa::/56')))
639
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000640
Nick Coghlan07c4e332012-07-08 23:06:45 +1000641class FactoryFunctionErrors(BaseTestCase):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000642
643 def assertFactoryError(self, factory, kind):
644 """Ensure a clean ValueError with the expected message"""
645 addr = "camelot"
646 msg = '%r does not appear to be an IPv4 or IPv6 %s'
647 with self.assertCleanError(ValueError, msg, addr, kind):
648 factory(addr)
649
650 def test_ip_address(self):
651 self.assertFactoryError(ipaddress.ip_address, "address")
652
653 def test_ip_interface(self):
654 self.assertFactoryError(ipaddress.ip_interface, "interface")
655
656 def test_ip_network(self):
657 self.assertFactoryError(ipaddress.ip_network, "network")
658
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200659
Serhiy Storchakaf186e122015-01-26 10:11:16 +0200660@functools.total_ordering
661class LargestObject:
662 def __eq__(self, other):
663 return isinstance(other, LargestObject)
664 def __lt__(self, other):
665 return False
666
667@functools.total_ordering
668class SmallestObject:
669 def __eq__(self, other):
670 return isinstance(other, SmallestObject)
671 def __gt__(self, other):
672 return False
673
Nick Coghlan3008ec02012-07-08 00:45:33 +1000674class ComparisonTests(unittest.TestCase):
675
676 v4addr = ipaddress.IPv4Address(1)
677 v4net = ipaddress.IPv4Network(1)
678 v4intf = ipaddress.IPv4Interface(1)
679 v6addr = ipaddress.IPv6Address(1)
680 v6net = ipaddress.IPv6Network(1)
681 v6intf = ipaddress.IPv6Interface(1)
682
683 v4_addresses = [v4addr, v4intf]
684 v4_objects = v4_addresses + [v4net]
685 v6_addresses = [v6addr, v6intf]
686 v6_objects = v6_addresses + [v6net]
R David Murray947ff382016-06-02 15:46:04 -0400687
Nick Coghlan3008ec02012-07-08 00:45:33 +1000688 objects = v4_objects + v6_objects
689
R David Murray947ff382016-06-02 15:46:04 -0400690 v4addr2 = ipaddress.IPv4Address(2)
691 v4net2 = ipaddress.IPv4Network(2)
692 v4intf2 = ipaddress.IPv4Interface(2)
693 v6addr2 = ipaddress.IPv6Address(2)
694 v6net2 = ipaddress.IPv6Network(2)
695 v6intf2 = ipaddress.IPv6Interface(2)
696
Nick Coghlan3008ec02012-07-08 00:45:33 +1000697 def test_foreign_type_equality(self):
698 # __eq__ should never raise TypeError directly
699 other = object()
700 for obj in self.objects:
701 self.assertNotEqual(obj, other)
702 self.assertFalse(obj == other)
703 self.assertEqual(obj.__eq__(other), NotImplemented)
704 self.assertEqual(obj.__ne__(other), NotImplemented)
705
706 def test_mixed_type_equality(self):
707 # Ensure none of the internal objects accidentally
708 # expose the right set of attributes to become "equal"
709 for lhs in self.objects:
710 for rhs in self.objects:
711 if lhs is rhs:
712 continue
713 self.assertNotEqual(lhs, rhs)
714
R David Murray947ff382016-06-02 15:46:04 -0400715 def test_same_type_equality(self):
716 for obj in self.objects:
717 self.assertEqual(obj, obj)
718 self.assertLessEqual(obj, obj)
719 self.assertGreaterEqual(obj, obj)
720
721 def test_same_type_ordering(self):
722 for lhs, rhs in (
723 (self.v4addr, self.v4addr2),
724 (self.v4net, self.v4net2),
725 (self.v4intf, self.v4intf2),
726 (self.v6addr, self.v6addr2),
727 (self.v6net, self.v6net2),
728 (self.v6intf, self.v6intf2),
729 ):
730 self.assertNotEqual(lhs, rhs)
731 self.assertLess(lhs, rhs)
732 self.assertLessEqual(lhs, rhs)
733 self.assertGreater(rhs, lhs)
734 self.assertGreaterEqual(rhs, lhs)
735 self.assertFalse(lhs > rhs)
736 self.assertFalse(rhs < lhs)
737 self.assertFalse(lhs >= rhs)
738 self.assertFalse(rhs <= lhs)
739
Nick Coghlan3008ec02012-07-08 00:45:33 +1000740 def test_containment(self):
741 for obj in self.v4_addresses:
742 self.assertIn(obj, self.v4net)
743 for obj in self.v6_addresses:
744 self.assertIn(obj, self.v6net)
745 for obj in self.v4_objects + [self.v6net]:
746 self.assertNotIn(obj, self.v6net)
747 for obj in self.v6_objects + [self.v4net]:
748 self.assertNotIn(obj, self.v4net)
749
750 def test_mixed_type_ordering(self):
751 for lhs in self.objects:
752 for rhs in self.objects:
753 if isinstance(lhs, type(rhs)) or isinstance(rhs, type(lhs)):
754 continue
755 self.assertRaises(TypeError, lambda: lhs < rhs)
756 self.assertRaises(TypeError, lambda: lhs > rhs)
757 self.assertRaises(TypeError, lambda: lhs <= rhs)
758 self.assertRaises(TypeError, lambda: lhs >= rhs)
759
Serhiy Storchakaf186e122015-01-26 10:11:16 +0200760 def test_foreign_type_ordering(self):
761 other = object()
762 smallest = SmallestObject()
763 largest = LargestObject()
764 for obj in self.objects:
765 with self.assertRaises(TypeError):
766 obj < other
767 with self.assertRaises(TypeError):
768 obj > other
769 with self.assertRaises(TypeError):
770 obj <= other
771 with self.assertRaises(TypeError):
772 obj >= other
773 self.assertTrue(obj < largest)
774 self.assertFalse(obj > largest)
775 self.assertTrue(obj <= largest)
776 self.assertFalse(obj >= largest)
777 self.assertFalse(obj < smallest)
778 self.assertTrue(obj > smallest)
779 self.assertFalse(obj <= smallest)
780 self.assertTrue(obj >= smallest)
781
Nick Coghlan3008ec02012-07-08 00:45:33 +1000782 def test_mixed_type_key(self):
783 # with get_mixed_type_key, you can sort addresses and network.
784 v4_ordered = [self.v4addr, self.v4net, self.v4intf]
785 v6_ordered = [self.v6addr, self.v6net, self.v6intf]
786 self.assertEqual(v4_ordered,
787 sorted(self.v4_objects,
788 key=ipaddress.get_mixed_type_key))
789 self.assertEqual(v6_ordered,
790 sorted(self.v6_objects,
791 key=ipaddress.get_mixed_type_key))
792 self.assertEqual(v4_ordered + v6_ordered,
793 sorted(self.objects,
794 key=ipaddress.get_mixed_type_key))
795 self.assertEqual(NotImplemented, ipaddress.get_mixed_type_key(object))
796
797 def test_incompatible_versions(self):
798 # These should always raise TypeError
799 v4addr = ipaddress.ip_address('1.1.1.1')
800 v4net = ipaddress.ip_network('1.1.1.1')
801 v6addr = ipaddress.ip_address('::1')
Serhiy Storchakaf186e122015-01-26 10:11:16 +0200802 v6net = ipaddress.ip_network('::1')
Nick Coghlan3008ec02012-07-08 00:45:33 +1000803
804 self.assertRaises(TypeError, v4addr.__lt__, v6addr)
805 self.assertRaises(TypeError, v4addr.__gt__, v6addr)
806 self.assertRaises(TypeError, v4net.__lt__, v6net)
807 self.assertRaises(TypeError, v4net.__gt__, v6net)
808
809 self.assertRaises(TypeError, v6addr.__lt__, v4addr)
810 self.assertRaises(TypeError, v6addr.__gt__, v4addr)
811 self.assertRaises(TypeError, v6net.__lt__, v4net)
812 self.assertRaises(TypeError, v6net.__gt__, v4net)
813
814
Nick Coghlandc9b2552012-05-20 21:01:57 +1000815class IpaddrUnitTest(unittest.TestCase):
816
817 def setUp(self):
818 self.ipv4_address = ipaddress.IPv4Address('1.2.3.4')
819 self.ipv4_interface = ipaddress.IPv4Interface('1.2.3.4/24')
820 self.ipv4_network = ipaddress.IPv4Network('1.2.3.0/24')
821 #self.ipv4_hostmask = ipaddress.IPv4Interface('10.0.0.1/0.255.255.255')
822 self.ipv6_address = ipaddress.IPv6Interface(
823 '2001:658:22a:cafe:200:0:0:1')
824 self.ipv6_interface = ipaddress.IPv6Interface(
825 '2001:658:22a:cafe:200:0:0:1/64')
826 self.ipv6_network = ipaddress.IPv6Network('2001:658:22a:cafe::/64')
827
828 def testRepr(self):
829 self.assertEqual("IPv4Interface('1.2.3.4/32')",
830 repr(ipaddress.IPv4Interface('1.2.3.4')))
831 self.assertEqual("IPv6Interface('::1/128')",
832 repr(ipaddress.IPv6Interface('::1')))
833
Martin Panter204bf0b2016-07-11 07:51:37 +0000834 # issue #16531: constructing IPv4Network from an (address, mask) tuple
Antoine Pitrou5fb195f2014-05-12 20:36:46 +0200835 def testIPv4Tuple(self):
836 # /32
837 ip = ipaddress.IPv4Address('192.0.2.1')
838 net = ipaddress.IPv4Network('192.0.2.1/32')
839 self.assertEqual(ipaddress.IPv4Network(('192.0.2.1', 32)), net)
840 self.assertEqual(ipaddress.IPv4Network((ip, 32)), net)
841 self.assertEqual(ipaddress.IPv4Network((3221225985, 32)), net)
842 self.assertEqual(ipaddress.IPv4Network(('192.0.2.1',
843 '255.255.255.255')), net)
844 self.assertEqual(ipaddress.IPv4Network((ip,
845 '255.255.255.255')), net)
846 self.assertEqual(ipaddress.IPv4Network((3221225985,
847 '255.255.255.255')), net)
848 # strict=True and host bits set
849 with self.assertRaises(ValueError):
850 ipaddress.IPv4Network(('192.0.2.1', 24))
851 with self.assertRaises(ValueError):
852 ipaddress.IPv4Network((ip, 24))
853 with self.assertRaises(ValueError):
854 ipaddress.IPv4Network((3221225985, 24))
855 with self.assertRaises(ValueError):
856 ipaddress.IPv4Network(('192.0.2.1', '255.255.255.0'))
857 with self.assertRaises(ValueError):
858 ipaddress.IPv4Network((ip, '255.255.255.0'))
859 with self.assertRaises(ValueError):
860 ipaddress.IPv4Network((3221225985, '255.255.255.0'))
861 # strict=False and host bits set
862 net = ipaddress.IPv4Network('192.0.2.0/24')
863 self.assertEqual(ipaddress.IPv4Network(('192.0.2.1', 24),
864 strict=False), net)
865 self.assertEqual(ipaddress.IPv4Network((ip, 24),
866 strict=False), net)
867 self.assertEqual(ipaddress.IPv4Network((3221225985, 24),
868 strict=False), net)
869 self.assertEqual(ipaddress.IPv4Network(('192.0.2.1',
870 '255.255.255.0'),
871 strict=False), net)
872 self.assertEqual(ipaddress.IPv4Network((ip,
873 '255.255.255.0'),
874 strict=False), net)
875 self.assertEqual(ipaddress.IPv4Network((3221225985,
876 '255.255.255.0'),
877 strict=False), net)
878
879 # /24
880 ip = ipaddress.IPv4Address('192.0.2.0')
881 net = ipaddress.IPv4Network('192.0.2.0/24')
882 self.assertEqual(ipaddress.IPv4Network(('192.0.2.0',
883 '255.255.255.0')), net)
884 self.assertEqual(ipaddress.IPv4Network((ip,
885 '255.255.255.0')), net)
886 self.assertEqual(ipaddress.IPv4Network((3221225984,
887 '255.255.255.0')), net)
888 self.assertEqual(ipaddress.IPv4Network(('192.0.2.0', 24)), net)
889 self.assertEqual(ipaddress.IPv4Network((ip, 24)), net)
890 self.assertEqual(ipaddress.IPv4Network((3221225984, 24)), net)
891
892 self.assertEqual(ipaddress.IPv4Interface(('192.0.2.1', 24)),
893 ipaddress.IPv4Interface('192.0.2.1/24'))
894 self.assertEqual(ipaddress.IPv4Interface((3221225985, 24)),
895 ipaddress.IPv4Interface('192.0.2.1/24'))
896
Martin Panter204bf0b2016-07-11 07:51:37 +0000897 # issue #16531: constructing IPv6Network from an (address, mask) tuple
Antoine Pitrou5fb195f2014-05-12 20:36:46 +0200898 def testIPv6Tuple(self):
899 # /128
900 ip = ipaddress.IPv6Address('2001:db8::')
901 net = ipaddress.IPv6Network('2001:db8::/128')
902 self.assertEqual(ipaddress.IPv6Network(('2001:db8::', '128')),
903 net)
904 self.assertEqual(ipaddress.IPv6Network(
905 (42540766411282592856903984951653826560, 128)),
906 net)
907 self.assertEqual(ipaddress.IPv6Network((ip, '128')),
908 net)
909 ip = ipaddress.IPv6Address('2001:db8::')
910 net = ipaddress.IPv6Network('2001:db8::/96')
911 self.assertEqual(ipaddress.IPv6Network(('2001:db8::', '96')),
912 net)
913 self.assertEqual(ipaddress.IPv6Network(
914 (42540766411282592856903984951653826560, 96)),
915 net)
916 self.assertEqual(ipaddress.IPv6Network((ip, '96')),
917 net)
918
919 # strict=True and host bits set
920 ip = ipaddress.IPv6Address('2001:db8::1')
921 with self.assertRaises(ValueError):
922 ipaddress.IPv6Network(('2001:db8::1', 96))
923 with self.assertRaises(ValueError):
924 ipaddress.IPv6Network((
925 42540766411282592856903984951653826561, 96))
926 with self.assertRaises(ValueError):
927 ipaddress.IPv6Network((ip, 96))
928 # strict=False and host bits set
929 net = ipaddress.IPv6Network('2001:db8::/96')
930 self.assertEqual(ipaddress.IPv6Network(('2001:db8::1', 96),
931 strict=False),
932 net)
933 self.assertEqual(ipaddress.IPv6Network(
934 (42540766411282592856903984951653826561, 96),
935 strict=False),
936 net)
937 self.assertEqual(ipaddress.IPv6Network((ip, 96), strict=False),
938 net)
939
940 # /96
941 self.assertEqual(ipaddress.IPv6Interface(('2001:db8::1', '96')),
942 ipaddress.IPv6Interface('2001:db8::1/96'))
943 self.assertEqual(ipaddress.IPv6Interface(
944 (42540766411282592856903984951653826561, '96')),
945 ipaddress.IPv6Interface('2001:db8::1/96'))
946
Nick Coghlandc9b2552012-05-20 21:01:57 +1000947 # issue57
948 def testAddressIntMath(self):
949 self.assertEqual(ipaddress.IPv4Address('1.1.1.1') + 255,
950 ipaddress.IPv4Address('1.1.2.0'))
951 self.assertEqual(ipaddress.IPv4Address('1.1.1.1') - 256,
952 ipaddress.IPv4Address('1.1.0.1'))
953 self.assertEqual(ipaddress.IPv6Address('::1') + (2**16 - 2),
954 ipaddress.IPv6Address('::ffff'))
955 self.assertEqual(ipaddress.IPv6Address('::ffff') - (2**16 - 2),
956 ipaddress.IPv6Address('::1'))
957
Nick Coghlan3c2570c2012-07-07 01:13:55 +1000958 def testInvalidIntToBytes(self):
959 self.assertRaises(ValueError, ipaddress.v4_int_to_packed, -1)
960 self.assertRaises(ValueError, ipaddress.v4_int_to_packed,
961 2 ** ipaddress.IPV4LENGTH)
962 self.assertRaises(ValueError, ipaddress.v6_int_to_packed, -1)
963 self.assertRaises(ValueError, ipaddress.v6_int_to_packed,
964 2 ** ipaddress.IPV6LENGTH)
965
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200966 def testInternals(self):
Serhiy Storchakab53f0fb2015-01-19 00:41:32 +0200967 ip1 = ipaddress.IPv4Address('10.10.10.10')
968 ip2 = ipaddress.IPv4Address('10.10.10.11')
969 ip3 = ipaddress.IPv4Address('10.10.10.12')
970 self.assertEqual(list(ipaddress._find_address_range([ip1])),
971 [(ip1, ip1)])
972 self.assertEqual(list(ipaddress._find_address_range([ip1, ip3])),
973 [(ip1, ip1), (ip3, ip3)])
974 self.assertEqual(list(ipaddress._find_address_range([ip1, ip2, ip3])),
975 [(ip1, ip3)])
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200976 self.assertEqual(128, ipaddress._count_righthand_zero_bits(0, 128))
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200977 self.assertEqual("IPv4Network('1.2.3.0/24')", repr(self.ipv4_network))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000978
979 def testGetNetwork(self):
980 self.assertEqual(int(self.ipv4_network.network_address), 16909056)
981 self.assertEqual(str(self.ipv4_network.network_address), '1.2.3.0')
982
983 self.assertEqual(int(self.ipv6_network.network_address),
984 42540616829182469433403647294022090752)
985 self.assertEqual(str(self.ipv6_network.network_address),
986 '2001:658:22a:cafe::')
987 self.assertEqual(str(self.ipv6_network.hostmask),
988 '::ffff:ffff:ffff:ffff')
989
Nick Coghlandc9b2552012-05-20 21:01:57 +1000990 def testIpFromInt(self):
991 self.assertEqual(self.ipv4_interface._ip,
992 ipaddress.IPv4Interface(16909060)._ip)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000993
994 ipv4 = ipaddress.ip_network('1.2.3.4')
995 ipv6 = ipaddress.ip_network('2001:658:22a:cafe:200:0:0:1')
Nick Coghlan730f67f2012-08-05 22:02:18 +1000996 self.assertEqual(ipv4, ipaddress.ip_network(int(ipv4.network_address)))
997 self.assertEqual(ipv6, ipaddress.ip_network(int(ipv6.network_address)))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000998
999 v6_int = 42540616829182469433547762482097946625
1000 self.assertEqual(self.ipv6_interface._ip,
1001 ipaddress.IPv6Interface(v6_int)._ip)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001002
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001003 self.assertEqual(ipaddress.ip_network(self.ipv4_address._ip).version,
1004 4)
1005 self.assertEqual(ipaddress.ip_network(self.ipv6_address._ip).version,
1006 6)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001007
1008 def testIpFromPacked(self):
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001009 address = ipaddress.ip_address
Nick Coghlandc9b2552012-05-20 21:01:57 +10001010 self.assertEqual(self.ipv4_interface._ip,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001011 ipaddress.ip_interface(b'\x01\x02\x03\x04')._ip)
1012 self.assertEqual(address('255.254.253.252'),
1013 address(b'\xff\xfe\xfd\xfc'))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001014 self.assertEqual(self.ipv6_interface.ip,
1015 ipaddress.ip_interface(
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001016 b'\x20\x01\x06\x58\x02\x2a\xca\xfe'
1017 b'\x02\x00\x00\x00\x00\x00\x00\x01').ip)
1018 self.assertEqual(address('ffff:2:3:4:ffff::'),
1019 address(b'\xff\xff\x00\x02\x00\x03\x00\x04' +
1020 b'\xff\xff' + b'\x00' * 6))
1021 self.assertEqual(address('::'),
1022 address(b'\x00' * 16))
1023
Nick Coghlandc9b2552012-05-20 21:01:57 +10001024 def testGetIp(self):
1025 self.assertEqual(int(self.ipv4_interface.ip), 16909060)
1026 self.assertEqual(str(self.ipv4_interface.ip), '1.2.3.4')
1027
1028 self.assertEqual(int(self.ipv6_interface.ip),
1029 42540616829182469433547762482097946625)
1030 self.assertEqual(str(self.ipv6_interface.ip),
1031 '2001:658:22a:cafe:200::1')
1032
1033 def testGetNetmask(self):
1034 self.assertEqual(int(self.ipv4_network.netmask), 4294967040)
1035 self.assertEqual(str(self.ipv4_network.netmask), '255.255.255.0')
1036 self.assertEqual(int(self.ipv6_network.netmask),
1037 340282366920938463444927863358058659840)
1038 self.assertEqual(self.ipv6_network.prefixlen, 64)
1039
1040 def testZeroNetmask(self):
1041 ipv4_zero_netmask = ipaddress.IPv4Interface('1.2.3.4/0')
1042 self.assertEqual(int(ipv4_zero_netmask.network.netmask), 0)
Nick Coghlan932346f2014-02-08 23:17:36 +10001043 self.assertEqual(ipv4_zero_netmask._prefix_from_prefix_string('0'), 0)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001044
1045 ipv6_zero_netmask = ipaddress.IPv6Interface('::1/0')
1046 self.assertEqual(int(ipv6_zero_netmask.network.netmask), 0)
Nick Coghlan932346f2014-02-08 23:17:36 +10001047 self.assertEqual(ipv6_zero_netmask._prefix_from_prefix_string('0'), 0)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001048
Rémi Lapeyree59ec1b2019-04-13 10:49:34 +02001049 def testIPv4Net(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001050 net = ipaddress.IPv4Network('127.0.0.0/0.0.0.255')
Nick Coghlan932346f2014-02-08 23:17:36 +10001051 self.assertEqual(net.prefixlen, 24)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001052
Nick Coghlandc9b2552012-05-20 21:01:57 +10001053 def testGetBroadcast(self):
1054 self.assertEqual(int(self.ipv4_network.broadcast_address), 16909311)
1055 self.assertEqual(str(self.ipv4_network.broadcast_address), '1.2.3.255')
1056
1057 self.assertEqual(int(self.ipv6_network.broadcast_address),
1058 42540616829182469451850391367731642367)
1059 self.assertEqual(str(self.ipv6_network.broadcast_address),
1060 '2001:658:22a:cafe:ffff:ffff:ffff:ffff')
1061
1062 def testGetPrefixlen(self):
Nick Coghlane3ded952012-08-05 22:45:22 +10001063 self.assertEqual(self.ipv4_interface.network.prefixlen, 24)
1064 self.assertEqual(self.ipv6_interface.network.prefixlen, 64)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001065
1066 def testGetSupernet(self):
1067 self.assertEqual(self.ipv4_network.supernet().prefixlen, 23)
1068 self.assertEqual(str(self.ipv4_network.supernet().network_address),
1069 '1.2.2.0')
1070 self.assertEqual(
1071 ipaddress.IPv4Interface('0.0.0.0/0').network.supernet(),
1072 ipaddress.IPv4Network('0.0.0.0/0'))
1073
1074 self.assertEqual(self.ipv6_network.supernet().prefixlen, 63)
1075 self.assertEqual(str(self.ipv6_network.supernet().network_address),
1076 '2001:658:22a:cafe::')
1077 self.assertEqual(ipaddress.IPv6Interface('::0/0').network.supernet(),
1078 ipaddress.IPv6Network('::0/0'))
1079
1080 def testGetSupernet3(self):
1081 self.assertEqual(self.ipv4_network.supernet(3).prefixlen, 21)
1082 self.assertEqual(str(self.ipv4_network.supernet(3).network_address),
1083 '1.2.0.0')
1084
1085 self.assertEqual(self.ipv6_network.supernet(3).prefixlen, 61)
1086 self.assertEqual(str(self.ipv6_network.supernet(3).network_address),
1087 '2001:658:22a:caf8::')
1088
1089 def testGetSupernet4(self):
1090 self.assertRaises(ValueError, self.ipv4_network.supernet,
1091 prefixlen_diff=2, new_prefix=1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001092 self.assertRaises(ValueError, self.ipv4_network.supernet,
1093 new_prefix=25)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001094 self.assertEqual(self.ipv4_network.supernet(prefixlen_diff=2),
1095 self.ipv4_network.supernet(new_prefix=22))
1096
1097 self.assertRaises(ValueError, self.ipv6_network.supernet,
1098 prefixlen_diff=2, new_prefix=1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001099 self.assertRaises(ValueError, self.ipv6_network.supernet,
1100 new_prefix=65)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001101 self.assertEqual(self.ipv6_network.supernet(prefixlen_diff=2),
1102 self.ipv6_network.supernet(new_prefix=62))
1103
1104 def testHosts(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001105 hosts = list(self.ipv4_network.hosts())
1106 self.assertEqual(254, len(hosts))
1107 self.assertEqual(ipaddress.IPv4Address('1.2.3.1'), hosts[0])
1108 self.assertEqual(ipaddress.IPv4Address('1.2.3.254'), hosts[-1])
1109
Xiang Zhang10b134a2018-03-21 08:25:13 +08001110 ipv6_network = ipaddress.IPv6Network('2001:658:22a:cafe::/120')
1111 hosts = list(ipv6_network.hosts())
1112 self.assertEqual(255, len(hosts))
1113 self.assertEqual(ipaddress.IPv6Address('2001:658:22a:cafe::1'), hosts[0])
1114 self.assertEqual(ipaddress.IPv6Address('2001:658:22a:cafe::ff'), hosts[-1])
1115
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001116 # special case where only 1 bit is left for address
Xiang Zhang10b134a2018-03-21 08:25:13 +08001117 addrs = [ipaddress.IPv4Address('2.0.0.0'),
1118 ipaddress.IPv4Address('2.0.0.1')]
1119 str_args = '2.0.0.0/31'
1120 tpl_args = ('2.0.0.0', 31)
1121 self.assertEqual(addrs, list(ipaddress.ip_network(str_args).hosts()))
1122 self.assertEqual(addrs, list(ipaddress.ip_network(tpl_args).hosts()))
1123 self.assertEqual(list(ipaddress.ip_network(str_args).hosts()),
1124 list(ipaddress.ip_network(tpl_args).hosts()))
1125
1126 addrs = [ipaddress.IPv6Address('2001:658:22a:cafe::'),
1127 ipaddress.IPv6Address('2001:658:22a:cafe::1')]
1128 str_args = '2001:658:22a:cafe::/127'
1129 tpl_args = ('2001:658:22a:cafe::', 127)
1130 self.assertEqual(addrs, list(ipaddress.ip_network(str_args).hosts()))
1131 self.assertEqual(addrs, list(ipaddress.ip_network(tpl_args).hosts()))
1132 self.assertEqual(list(ipaddress.ip_network(str_args).hosts()),
1133 list(ipaddress.ip_network(tpl_args).hosts()))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001134
1135 def testFancySubnetting(self):
1136 self.assertEqual(sorted(self.ipv4_network.subnets(prefixlen_diff=3)),
1137 sorted(self.ipv4_network.subnets(new_prefix=27)))
1138 self.assertRaises(ValueError, list,
1139 self.ipv4_network.subnets(new_prefix=23))
1140 self.assertRaises(ValueError, list,
1141 self.ipv4_network.subnets(prefixlen_diff=3,
1142 new_prefix=27))
1143 self.assertEqual(sorted(self.ipv6_network.subnets(prefixlen_diff=4)),
1144 sorted(self.ipv6_network.subnets(new_prefix=68)))
1145 self.assertRaises(ValueError, list,
1146 self.ipv6_network.subnets(new_prefix=63))
1147 self.assertRaises(ValueError, list,
1148 self.ipv6_network.subnets(prefixlen_diff=4,
1149 new_prefix=68))
1150
1151 def testGetSubnets(self):
1152 self.assertEqual(list(self.ipv4_network.subnets())[0].prefixlen, 25)
1153 self.assertEqual(str(list(
1154 self.ipv4_network.subnets())[0].network_address),
1155 '1.2.3.0')
1156 self.assertEqual(str(list(
1157 self.ipv4_network.subnets())[1].network_address),
1158 '1.2.3.128')
1159
1160 self.assertEqual(list(self.ipv6_network.subnets())[0].prefixlen, 65)
1161
1162 def testGetSubnetForSingle32(self):
1163 ip = ipaddress.IPv4Network('1.2.3.4/32')
1164 subnets1 = [str(x) for x in ip.subnets()]
1165 subnets2 = [str(x) for x in ip.subnets(2)]
1166 self.assertEqual(subnets1, ['1.2.3.4/32'])
1167 self.assertEqual(subnets1, subnets2)
1168
1169 def testGetSubnetForSingle128(self):
1170 ip = ipaddress.IPv6Network('::1/128')
1171 subnets1 = [str(x) for x in ip.subnets()]
1172 subnets2 = [str(x) for x in ip.subnets(2)]
1173 self.assertEqual(subnets1, ['::1/128'])
1174 self.assertEqual(subnets1, subnets2)
1175
1176 def testSubnet2(self):
1177 ips = [str(x) for x in self.ipv4_network.subnets(2)]
1178 self.assertEqual(
1179 ips,
1180 ['1.2.3.0/26', '1.2.3.64/26', '1.2.3.128/26', '1.2.3.192/26'])
1181
1182 ipsv6 = [str(x) for x in self.ipv6_network.subnets(2)]
1183 self.assertEqual(
1184 ipsv6,
1185 ['2001:658:22a:cafe::/66',
1186 '2001:658:22a:cafe:4000::/66',
1187 '2001:658:22a:cafe:8000::/66',
1188 '2001:658:22a:cafe:c000::/66'])
1189
Serhiy Storchakabb0dbd52016-03-01 10:25:45 +02001190 def testGetSubnets3(self):
1191 subnets = [str(x) for x in self.ipv4_network.subnets(8)]
1192 self.assertEqual(subnets[:3],
1193 ['1.2.3.0/32', '1.2.3.1/32', '1.2.3.2/32'])
1194 self.assertEqual(subnets[-3:],
1195 ['1.2.3.253/32', '1.2.3.254/32', '1.2.3.255/32'])
1196 self.assertEqual(len(subnets), 256)
1197
1198 ipv6_network = ipaddress.IPv6Network('2001:658:22a:cafe::/120')
1199 subnets = [str(x) for x in ipv6_network.subnets(8)]
1200 self.assertEqual(subnets[:3],
1201 ['2001:658:22a:cafe::/128',
1202 '2001:658:22a:cafe::1/128',
1203 '2001:658:22a:cafe::2/128'])
1204 self.assertEqual(subnets[-3:],
1205 ['2001:658:22a:cafe::fd/128',
1206 '2001:658:22a:cafe::fe/128',
1207 '2001:658:22a:cafe::ff/128'])
1208 self.assertEqual(len(subnets), 256)
1209
Nick Coghlandc9b2552012-05-20 21:01:57 +10001210 def testSubnetFailsForLargeCidrDiff(self):
1211 self.assertRaises(ValueError, list,
1212 self.ipv4_interface.network.subnets(9))
1213 self.assertRaises(ValueError, list,
1214 self.ipv4_network.subnets(9))
1215 self.assertRaises(ValueError, list,
1216 self.ipv6_interface.network.subnets(65))
1217 self.assertRaises(ValueError, list,
1218 self.ipv6_network.subnets(65))
1219
1220 def testSupernetFailsForLargeCidrDiff(self):
1221 self.assertRaises(ValueError,
1222 self.ipv4_interface.network.supernet, 25)
1223 self.assertRaises(ValueError,
1224 self.ipv6_interface.network.supernet, 65)
1225
1226 def testSubnetFailsForNegativeCidrDiff(self):
1227 self.assertRaises(ValueError, list,
1228 self.ipv4_interface.network.subnets(-1))
1229 self.assertRaises(ValueError, list,
Nick Coghlan2c589102012-05-27 01:03:25 +10001230 self.ipv4_network.subnets(-1))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001231 self.assertRaises(ValueError, list,
1232 self.ipv6_interface.network.subnets(-1))
1233 self.assertRaises(ValueError, list,
1234 self.ipv6_network.subnets(-1))
1235
1236 def testGetNum_Addresses(self):
1237 self.assertEqual(self.ipv4_network.num_addresses, 256)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001238 self.assertEqual(list(self.ipv4_network.subnets())[0].num_addresses,
1239 128)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001240 self.assertEqual(self.ipv4_network.supernet().num_addresses, 512)
1241
1242 self.assertEqual(self.ipv6_network.num_addresses, 18446744073709551616)
1243 self.assertEqual(list(self.ipv6_network.subnets())[0].num_addresses,
1244 9223372036854775808)
1245 self.assertEqual(self.ipv6_network.supernet().num_addresses,
1246 36893488147419103232)
1247
1248 def testContains(self):
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001249 self.assertIn(ipaddress.IPv4Interface('1.2.3.128/25'),
1250 self.ipv4_network)
1251 self.assertNotIn(ipaddress.IPv4Interface('1.2.4.1/24'),
Nick Coghlandc9b2552012-05-20 21:01:57 +10001252 self.ipv4_network)
1253 # We can test addresses and string as well.
1254 addr1 = ipaddress.IPv4Address('1.2.3.37')
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001255 self.assertIn(addr1, self.ipv4_network)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001256 # issue 61, bad network comparison on like-ip'd network objects
1257 # with identical broadcast addresses.
1258 self.assertFalse(ipaddress.IPv4Network('1.1.0.0/16').__contains__(
1259 ipaddress.IPv4Network('1.0.0.0/15')))
1260
Nick Coghlandc9b2552012-05-20 21:01:57 +10001261 def testNth(self):
1262 self.assertEqual(str(self.ipv4_network[5]), '1.2.3.5')
1263 self.assertRaises(IndexError, self.ipv4_network.__getitem__, 256)
1264
1265 self.assertEqual(str(self.ipv6_network[5]),
1266 '2001:658:22a:cafe::5')
Berker Peksag28dc1182016-06-11 22:30:05 +03001267 self.assertRaises(IndexError, self.ipv6_network.__getitem__, 1 << 64)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001268
1269 def testGetitem(self):
1270 # http://code.google.com/p/ipaddr-py/issues/detail?id=15
1271 addr = ipaddress.IPv4Network('172.31.255.128/255.255.255.240')
1272 self.assertEqual(28, addr.prefixlen)
1273 addr_list = list(addr)
1274 self.assertEqual('172.31.255.128', str(addr_list[0]))
1275 self.assertEqual('172.31.255.128', str(addr[0]))
1276 self.assertEqual('172.31.255.143', str(addr_list[-1]))
1277 self.assertEqual('172.31.255.143', str(addr[-1]))
1278 self.assertEqual(addr_list[-1], addr[-1])
1279
1280 def testEqual(self):
1281 self.assertTrue(self.ipv4_interface ==
1282 ipaddress.IPv4Interface('1.2.3.4/24'))
1283 self.assertFalse(self.ipv4_interface ==
1284 ipaddress.IPv4Interface('1.2.3.4/23'))
1285 self.assertFalse(self.ipv4_interface ==
1286 ipaddress.IPv6Interface('::1.2.3.4/24'))
1287 self.assertFalse(self.ipv4_interface == '')
1288 self.assertFalse(self.ipv4_interface == [])
1289 self.assertFalse(self.ipv4_interface == 2)
1290
1291 self.assertTrue(self.ipv6_interface ==
1292 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/64'))
1293 self.assertFalse(self.ipv6_interface ==
1294 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/63'))
1295 self.assertFalse(self.ipv6_interface ==
1296 ipaddress.IPv4Interface('1.2.3.4/23'))
1297 self.assertFalse(self.ipv6_interface == '')
1298 self.assertFalse(self.ipv6_interface == [])
1299 self.assertFalse(self.ipv6_interface == 2)
1300
1301 def testNotEqual(self):
1302 self.assertFalse(self.ipv4_interface !=
1303 ipaddress.IPv4Interface('1.2.3.4/24'))
1304 self.assertTrue(self.ipv4_interface !=
1305 ipaddress.IPv4Interface('1.2.3.4/23'))
1306 self.assertTrue(self.ipv4_interface !=
1307 ipaddress.IPv6Interface('::1.2.3.4/24'))
1308 self.assertTrue(self.ipv4_interface != '')
1309 self.assertTrue(self.ipv4_interface != [])
1310 self.assertTrue(self.ipv4_interface != 2)
1311
1312 self.assertTrue(self.ipv4_address !=
1313 ipaddress.IPv4Address('1.2.3.5'))
1314 self.assertTrue(self.ipv4_address != '')
1315 self.assertTrue(self.ipv4_address != [])
1316 self.assertTrue(self.ipv4_address != 2)
1317
1318 self.assertFalse(self.ipv6_interface !=
1319 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/64'))
1320 self.assertTrue(self.ipv6_interface !=
1321 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/63'))
1322 self.assertTrue(self.ipv6_interface !=
1323 ipaddress.IPv4Interface('1.2.3.4/23'))
1324 self.assertTrue(self.ipv6_interface != '')
1325 self.assertTrue(self.ipv6_interface != [])
1326 self.assertTrue(self.ipv6_interface != 2)
1327
1328 self.assertTrue(self.ipv6_address !=
1329 ipaddress.IPv4Address('1.2.3.4'))
1330 self.assertTrue(self.ipv6_address != '')
1331 self.assertTrue(self.ipv6_address != [])
1332 self.assertTrue(self.ipv6_address != 2)
1333
1334 def testSlash32Constructor(self):
1335 self.assertEqual(str(ipaddress.IPv4Interface(
1336 '1.2.3.4/255.255.255.255')), '1.2.3.4/32')
1337
1338 def testSlash128Constructor(self):
1339 self.assertEqual(str(ipaddress.IPv6Interface('::1/128')),
1340 '::1/128')
1341
1342 def testSlash0Constructor(self):
1343 self.assertEqual(str(ipaddress.IPv4Interface('1.2.3.4/0.0.0.0')),
1344 '1.2.3.4/0')
1345
1346 def testCollapsing(self):
1347 # test only IP addresses including some duplicates
1348 ip1 = ipaddress.IPv4Address('1.1.1.0')
1349 ip2 = ipaddress.IPv4Address('1.1.1.1')
1350 ip3 = ipaddress.IPv4Address('1.1.1.2')
1351 ip4 = ipaddress.IPv4Address('1.1.1.3')
1352 ip5 = ipaddress.IPv4Address('1.1.1.4')
1353 ip6 = ipaddress.IPv4Address('1.1.1.0')
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07001354 # check that addresses are subsumed properly.
Nick Coghlandc9b2552012-05-20 21:01:57 +10001355 collapsed = ipaddress.collapse_addresses(
1356 [ip1, ip2, ip3, ip4, ip5, ip6])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001357 self.assertEqual(list(collapsed),
1358 [ipaddress.IPv4Network('1.1.1.0/30'),
1359 ipaddress.IPv4Network('1.1.1.4/32')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001360
1361 # test a mix of IP addresses and networks including some duplicates
1362 ip1 = ipaddress.IPv4Address('1.1.1.0')
1363 ip2 = ipaddress.IPv4Address('1.1.1.1')
1364 ip3 = ipaddress.IPv4Address('1.1.1.2')
1365 ip4 = ipaddress.IPv4Address('1.1.1.3')
1366 #ip5 = ipaddress.IPv4Interface('1.1.1.4/30')
1367 #ip6 = ipaddress.IPv4Interface('1.1.1.4/30')
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07001368 # check that addresses are subsumed properly.
Nick Coghlandc9b2552012-05-20 21:01:57 +10001369 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3, ip4])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001370 self.assertEqual(list(collapsed),
1371 [ipaddress.IPv4Network('1.1.1.0/30')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001372
1373 # test only IP networks
1374 ip1 = ipaddress.IPv4Network('1.1.0.0/24')
1375 ip2 = ipaddress.IPv4Network('1.1.1.0/24')
1376 ip3 = ipaddress.IPv4Network('1.1.2.0/24')
1377 ip4 = ipaddress.IPv4Network('1.1.3.0/24')
1378 ip5 = ipaddress.IPv4Network('1.1.4.0/24')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001379 # stored in no particular order b/c we want CollapseAddr to call
1380 # [].sort
Nick Coghlandc9b2552012-05-20 21:01:57 +10001381 ip6 = ipaddress.IPv4Network('1.1.0.0/22')
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07001382 # check that addresses are subsumed properly.
Nick Coghlandc9b2552012-05-20 21:01:57 +10001383 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3, ip4, ip5,
1384 ip6])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001385 self.assertEqual(list(collapsed),
1386 [ipaddress.IPv4Network('1.1.0.0/22'),
1387 ipaddress.IPv4Network('1.1.4.0/24')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001388
1389 # test that two addresses are supernet'ed properly
1390 collapsed = ipaddress.collapse_addresses([ip1, ip2])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001391 self.assertEqual(list(collapsed),
1392 [ipaddress.IPv4Network('1.1.0.0/23')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001393
1394 # test same IP networks
1395 ip_same1 = ip_same2 = ipaddress.IPv4Network('1.1.1.1/32')
1396 self.assertEqual(list(ipaddress.collapse_addresses(
1397 [ip_same1, ip_same2])),
1398 [ip_same1])
1399
1400 # test same IP addresses
1401 ip_same1 = ip_same2 = ipaddress.IPv4Address('1.1.1.1')
1402 self.assertEqual(list(ipaddress.collapse_addresses(
1403 [ip_same1, ip_same2])),
1404 [ipaddress.ip_network('1.1.1.1/32')])
1405 ip1 = ipaddress.IPv6Network('2001::/100')
1406 ip2 = ipaddress.IPv6Network('2001::/120')
1407 ip3 = ipaddress.IPv6Network('2001::/96')
1408 # test that ipv6 addresses are subsumed properly.
1409 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3])
1410 self.assertEqual(list(collapsed), [ip3])
1411
1412 # the toejam test
Hynek Schlawack35db5132012-06-01 20:12:17 +02001413 addr_tuples = [
1414 (ipaddress.ip_address('1.1.1.1'),
1415 ipaddress.ip_address('::1')),
1416 (ipaddress.IPv4Network('1.1.0.0/24'),
1417 ipaddress.IPv6Network('2001::/120')),
1418 (ipaddress.IPv4Network('1.1.0.0/32'),
1419 ipaddress.IPv6Network('2001::/128')),
1420 ]
1421 for ip1, ip2 in addr_tuples:
1422 self.assertRaises(TypeError, ipaddress.collapse_addresses,
1423 [ip1, ip2])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001424
1425 def testSummarizing(self):
1426 #ip = ipaddress.ip_address
1427 #ipnet = ipaddress.ip_network
1428 summarize = ipaddress.summarize_address_range
1429 ip1 = ipaddress.ip_address('1.1.1.0')
1430 ip2 = ipaddress.ip_address('1.1.1.255')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001431
1432 # summarize works only for IPv4 & IPv6
1433 class IPv7Address(ipaddress.IPv6Address):
1434 @property
1435 def version(self):
1436 return 7
1437 ip_invalid1 = IPv7Address('::1')
1438 ip_invalid2 = IPv7Address('::1')
1439 self.assertRaises(ValueError, list,
1440 summarize(ip_invalid1, ip_invalid2))
1441 # test that a summary over ip4 & ip6 fails
1442 self.assertRaises(TypeError, list,
1443 summarize(ip1, ipaddress.IPv6Address('::1')))
1444 # test a /24 is summarized properly
Nick Coghlandc9b2552012-05-20 21:01:57 +10001445 self.assertEqual(list(summarize(ip1, ip2))[0],
1446 ipaddress.ip_network('1.1.1.0/24'))
Martin Panter7462b6492015-11-02 03:37:02 +00001447 # test an IPv4 range that isn't on a network byte boundary
Nick Coghlandc9b2552012-05-20 21:01:57 +10001448 ip2 = ipaddress.ip_address('1.1.1.8')
1449 self.assertEqual(list(summarize(ip1, ip2)),
1450 [ipaddress.ip_network('1.1.1.0/29'),
1451 ipaddress.ip_network('1.1.1.8')])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001452 # all!
1453 ip1 = ipaddress.IPv4Address(0)
1454 ip2 = ipaddress.IPv4Address(ipaddress.IPv4Address._ALL_ONES)
1455 self.assertEqual([ipaddress.IPv4Network('0.0.0.0/0')],
1456 list(summarize(ip1, ip2)))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001457
1458 ip1 = ipaddress.ip_address('1::')
1459 ip2 = ipaddress.ip_address('1:ffff:ffff:ffff:ffff:ffff:ffff:ffff')
Martin Panter7462b6492015-11-02 03:37:02 +00001460 # test an IPv6 is summarized properly
Nick Coghlandc9b2552012-05-20 21:01:57 +10001461 self.assertEqual(list(summarize(ip1, ip2))[0],
1462 ipaddress.ip_network('1::/16'))
1463 # test an IPv6 range that isn't on a network byte boundary
1464 ip2 = ipaddress.ip_address('2::')
1465 self.assertEqual(list(summarize(ip1, ip2)),
1466 [ipaddress.ip_network('1::/16'),
1467 ipaddress.ip_network('2::/128')])
1468
1469 # test exception raised when first is greater than last
1470 self.assertRaises(ValueError, list,
1471 summarize(ipaddress.ip_address('1.1.1.0'),
1472 ipaddress.ip_address('1.1.0.0')))
1473 # test exception raised when first and last aren't IP addresses
1474 self.assertRaises(TypeError, list,
1475 summarize(ipaddress.ip_network('1.1.1.0'),
1476 ipaddress.ip_network('1.1.0.0')))
1477 self.assertRaises(TypeError, list,
1478 summarize(ipaddress.ip_network('1.1.1.0'),
1479 ipaddress.ip_network('1.1.0.0')))
1480 # test exception raised when first and last are not same version
1481 self.assertRaises(TypeError, list,
1482 summarize(ipaddress.ip_address('::'),
1483 ipaddress.ip_network('1.1.0.0')))
1484
1485 def testAddressComparison(self):
1486 self.assertTrue(ipaddress.ip_address('1.1.1.1') <=
1487 ipaddress.ip_address('1.1.1.1'))
1488 self.assertTrue(ipaddress.ip_address('1.1.1.1') <=
1489 ipaddress.ip_address('1.1.1.2'))
1490 self.assertTrue(ipaddress.ip_address('::1') <=
1491 ipaddress.ip_address('::1'))
1492 self.assertTrue(ipaddress.ip_address('::1') <=
1493 ipaddress.ip_address('::2'))
1494
Nick Coghlan3008ec02012-07-08 00:45:33 +10001495 def testInterfaceComparison(self):
s-sanjay7bd8d3e2017-03-31 23:09:53 -07001496 self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') ==
1497 ipaddress.ip_interface('1.1.1.1/24'))
1498 self.assertTrue(ipaddress.ip_interface('1.1.1.1/16') <
1499 ipaddress.ip_interface('1.1.1.1/24'))
1500 self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') <
1501 ipaddress.ip_interface('1.1.1.2/24'))
1502 self.assertTrue(ipaddress.ip_interface('1.1.1.2/16') <
1503 ipaddress.ip_interface('1.1.1.1/24'))
1504 self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') >
1505 ipaddress.ip_interface('1.1.1.1/16'))
1506 self.assertTrue(ipaddress.ip_interface('1.1.1.2/24') >
1507 ipaddress.ip_interface('1.1.1.1/24'))
1508 self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') >
1509 ipaddress.ip_interface('1.1.1.2/16'))
1510
1511 self.assertTrue(ipaddress.ip_interface('::1/64') ==
1512 ipaddress.ip_interface('::1/64'))
1513 self.assertTrue(ipaddress.ip_interface('::1/64') <
1514 ipaddress.ip_interface('::1/80'))
1515 self.assertTrue(ipaddress.ip_interface('::1/64') <
1516 ipaddress.ip_interface('::2/64'))
1517 self.assertTrue(ipaddress.ip_interface('::2/48') <
1518 ipaddress.ip_interface('::1/64'))
1519 self.assertTrue(ipaddress.ip_interface('::1/80') >
1520 ipaddress.ip_interface('::1/64'))
1521 self.assertTrue(ipaddress.ip_interface('::2/64') >
1522 ipaddress.ip_interface('::1/64'))
1523 self.assertTrue(ipaddress.ip_interface('::1/64') >
1524 ipaddress.ip_interface('::2/48'))
Nick Coghlan3008ec02012-07-08 00:45:33 +10001525
Nick Coghlandc9b2552012-05-20 21:01:57 +10001526 def testNetworkComparison(self):
1527 # ip1 and ip2 have the same network address
1528 ip1 = ipaddress.IPv4Network('1.1.1.0/24')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001529 ip2 = ipaddress.IPv4Network('1.1.1.0/32')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001530 ip3 = ipaddress.IPv4Network('1.1.2.0/24')
1531
1532 self.assertTrue(ip1 < ip3)
1533 self.assertTrue(ip3 > ip2)
1534
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001535 self.assertEqual(ip1.compare_networks(ip1), 0)
1536
1537 # if addresses are the same, sort by netmask
1538 self.assertEqual(ip1.compare_networks(ip2), -1)
1539 self.assertEqual(ip2.compare_networks(ip1), 1)
1540
Nick Coghlandc9b2552012-05-20 21:01:57 +10001541 self.assertEqual(ip1.compare_networks(ip3), -1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001542 self.assertEqual(ip3.compare_networks(ip1), 1)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001543 self.assertTrue(ip1._get_networks_key() < ip3._get_networks_key())
1544
1545 ip1 = ipaddress.IPv6Network('2001:2000::/96')
1546 ip2 = ipaddress.IPv6Network('2001:2001::/96')
1547 ip3 = ipaddress.IPv6Network('2001:ffff:2000::/96')
1548
1549 self.assertTrue(ip1 < ip3)
1550 self.assertTrue(ip3 > ip2)
1551 self.assertEqual(ip1.compare_networks(ip3), -1)
1552 self.assertTrue(ip1._get_networks_key() < ip3._get_networks_key())
1553
1554 # Test comparing different protocols.
1555 # Should always raise a TypeError.
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001556 self.assertRaises(TypeError,
1557 self.ipv4_network.compare_networks,
1558 self.ipv6_network)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001559 ipv6 = ipaddress.IPv6Interface('::/0')
1560 ipv4 = ipaddress.IPv4Interface('0.0.0.0/0')
1561 self.assertRaises(TypeError, ipv4.__lt__, ipv6)
1562 self.assertRaises(TypeError, ipv4.__gt__, ipv6)
1563 self.assertRaises(TypeError, ipv6.__lt__, ipv4)
1564 self.assertRaises(TypeError, ipv6.__gt__, ipv4)
1565
1566 # Regression test for issue 19.
1567 ip1 = ipaddress.ip_network('10.1.2.128/25')
1568 self.assertFalse(ip1 < ip1)
1569 self.assertFalse(ip1 > ip1)
1570 ip2 = ipaddress.ip_network('10.1.3.0/24')
1571 self.assertTrue(ip1 < ip2)
1572 self.assertFalse(ip2 < ip1)
1573 self.assertFalse(ip1 > ip2)
1574 self.assertTrue(ip2 > ip1)
1575 ip3 = ipaddress.ip_network('10.1.3.0/25')
1576 self.assertTrue(ip2 < ip3)
1577 self.assertFalse(ip3 < ip2)
1578 self.assertFalse(ip2 > ip3)
1579 self.assertTrue(ip3 > ip2)
1580
1581 # Regression test for issue 28.
1582 ip1 = ipaddress.ip_network('10.10.10.0/31')
1583 ip2 = ipaddress.ip_network('10.10.10.0')
1584 ip3 = ipaddress.ip_network('10.10.10.2/31')
1585 ip4 = ipaddress.ip_network('10.10.10.2')
1586 sorted = [ip1, ip2, ip3, ip4]
1587 unsorted = [ip2, ip4, ip1, ip3]
1588 unsorted.sort()
1589 self.assertEqual(sorted, unsorted)
1590 unsorted = [ip4, ip1, ip3, ip2]
1591 unsorted.sort()
1592 self.assertEqual(sorted, unsorted)
Serhiy Storchakaf186e122015-01-26 10:11:16 +02001593 self.assertIs(ip1.__lt__(ipaddress.ip_address('10.10.10.0')),
1594 NotImplemented)
1595 self.assertIs(ip2.__lt__(ipaddress.ip_address('10.10.10.0')),
1596 NotImplemented)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001597
1598 # <=, >=
1599 self.assertTrue(ipaddress.ip_network('1.1.1.1') <=
1600 ipaddress.ip_network('1.1.1.1'))
1601 self.assertTrue(ipaddress.ip_network('1.1.1.1') <=
1602 ipaddress.ip_network('1.1.1.2'))
1603 self.assertFalse(ipaddress.ip_network('1.1.1.2') <=
1604 ipaddress.ip_network('1.1.1.1'))
1605 self.assertTrue(ipaddress.ip_network('::1') <=
1606 ipaddress.ip_network('::1'))
1607 self.assertTrue(ipaddress.ip_network('::1') <=
1608 ipaddress.ip_network('::2'))
1609 self.assertFalse(ipaddress.ip_network('::2') <=
1610 ipaddress.ip_network('::1'))
1611
1612 def testStrictNetworks(self):
1613 self.assertRaises(ValueError, ipaddress.ip_network, '192.168.1.1/24')
1614 self.assertRaises(ValueError, ipaddress.ip_network, '::1/120')
1615
1616 def testOverlaps(self):
1617 other = ipaddress.IPv4Network('1.2.3.0/30')
1618 other2 = ipaddress.IPv4Network('1.2.2.0/24')
1619 other3 = ipaddress.IPv4Network('1.2.2.64/26')
1620 self.assertTrue(self.ipv4_network.overlaps(other))
1621 self.assertFalse(self.ipv4_network.overlaps(other2))
1622 self.assertTrue(other2.overlaps(other3))
1623
1624 def testEmbeddedIpv4(self):
1625 ipv4_string = '192.168.0.1'
1626 ipv4 = ipaddress.IPv4Interface(ipv4_string)
1627 v4compat_ipv6 = ipaddress.IPv6Interface('::%s' % ipv4_string)
1628 self.assertEqual(int(v4compat_ipv6.ip), int(ipv4.ip))
1629 v4mapped_ipv6 = ipaddress.IPv6Interface('::ffff:%s' % ipv4_string)
1630 self.assertNotEqual(v4mapped_ipv6.ip, ipv4.ip)
1631 self.assertRaises(ipaddress.AddressValueError, ipaddress.IPv6Interface,
1632 '2001:1.1.1.1:1.1.1.1')
1633
1634 # Issue 67: IPv6 with embedded IPv4 address not recognized.
1635 def testIPv6AddressTooLarge(self):
1636 # RFC4291 2.5.5.2
1637 self.assertEqual(ipaddress.ip_address('::FFFF:192.0.2.1'),
1638 ipaddress.ip_address('::FFFF:c000:201'))
1639 # RFC4291 2.2 (part 3) x::d.d.d.d
1640 self.assertEqual(ipaddress.ip_address('FFFF::192.0.2.1'),
1641 ipaddress.ip_address('FFFF::c000:201'))
1642
1643 def testIPVersion(self):
1644 self.assertEqual(self.ipv4_address.version, 4)
1645 self.assertEqual(self.ipv6_address.version, 6)
1646
1647 def testMaxPrefixLength(self):
1648 self.assertEqual(self.ipv4_interface.max_prefixlen, 32)
1649 self.assertEqual(self.ipv6_interface.max_prefixlen, 128)
1650
1651 def testPacked(self):
1652 self.assertEqual(self.ipv4_address.packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001653 b'\x01\x02\x03\x04')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001654 self.assertEqual(ipaddress.IPv4Interface('255.254.253.252').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001655 b'\xff\xfe\xfd\xfc')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001656 self.assertEqual(self.ipv6_address.packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001657 b'\x20\x01\x06\x58\x02\x2a\xca\xfe'
1658 b'\x02\x00\x00\x00\x00\x00\x00\x01')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001659 self.assertEqual(ipaddress.IPv6Interface('ffff:2:3:4:ffff::').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001660 b'\xff\xff\x00\x02\x00\x03\x00\x04\xff\xff'
1661 + b'\x00' * 6)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001662 self.assertEqual(ipaddress.IPv6Interface('::1:0:0:0:0').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001663 b'\x00' * 6 + b'\x00\x01' + b'\x00' * 8)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001664
Nick Coghlandc9b2552012-05-20 21:01:57 +10001665 def testIpType(self):
1666 ipv4net = ipaddress.ip_network('1.2.3.4')
1667 ipv4addr = ipaddress.ip_address('1.2.3.4')
1668 ipv6net = ipaddress.ip_network('::1.2.3.4')
1669 ipv6addr = ipaddress.ip_address('::1.2.3.4')
1670 self.assertEqual(ipaddress.IPv4Network, type(ipv4net))
1671 self.assertEqual(ipaddress.IPv4Address, type(ipv4addr))
1672 self.assertEqual(ipaddress.IPv6Network, type(ipv6net))
1673 self.assertEqual(ipaddress.IPv6Address, type(ipv6addr))
1674
1675 def testReservedIpv4(self):
1676 # test networks
1677 self.assertEqual(True, ipaddress.ip_interface(
1678 '224.1.1.1/31').is_multicast)
1679 self.assertEqual(False, ipaddress.ip_network('240.0.0.0').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001680 self.assertEqual(True, ipaddress.ip_network('240.0.0.0').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001681
1682 self.assertEqual(True, ipaddress.ip_interface(
1683 '192.168.1.1/17').is_private)
1684 self.assertEqual(False, ipaddress.ip_network('192.169.0.0').is_private)
1685 self.assertEqual(True, ipaddress.ip_network(
1686 '10.255.255.255').is_private)
1687 self.assertEqual(False, ipaddress.ip_network('11.0.0.0').is_private)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001688 self.assertEqual(False, ipaddress.ip_network('11.0.0.0').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001689 self.assertEqual(True, ipaddress.ip_network(
1690 '172.31.255.255').is_private)
1691 self.assertEqual(False, ipaddress.ip_network('172.32.0.0').is_private)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001692 self.assertEqual(True,
1693 ipaddress.ip_network('169.254.1.0/24').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001694
1695 self.assertEqual(True,
1696 ipaddress.ip_interface(
1697 '169.254.100.200/24').is_link_local)
1698 self.assertEqual(False,
1699 ipaddress.ip_interface(
1700 '169.255.100.200/24').is_link_local)
1701
1702 self.assertEqual(True,
1703 ipaddress.ip_network(
1704 '127.100.200.254/32').is_loopback)
1705 self.assertEqual(True, ipaddress.ip_network(
1706 '127.42.0.0/16').is_loopback)
1707 self.assertEqual(False, ipaddress.ip_network('128.0.0.0').is_loopback)
Peter Moodye5019d52013-10-24 09:47:10 -07001708 self.assertEqual(False,
1709 ipaddress.ip_network('100.64.0.0/10').is_private)
Peter Moodybe9c1b12013-10-22 12:36:21 -07001710 self.assertEqual(False, ipaddress.ip_network('100.64.0.0/10').is_global)
Peter Moodye5019d52013-10-24 09:47:10 -07001711
Peter Moody22c31762013-10-21 13:58:06 -07001712 self.assertEqual(True,
1713 ipaddress.ip_network('192.0.2.128/25').is_private)
1714 self.assertEqual(True,
1715 ipaddress.ip_network('192.0.3.0/24').is_global)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001716
1717 # test addresses
Hynek Schlawackbcd30442012-06-04 14:19:39 +02001718 self.assertEqual(True, ipaddress.ip_address('0.0.0.0').is_unspecified)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001719 self.assertEqual(True, ipaddress.ip_address('224.1.1.1').is_multicast)
1720 self.assertEqual(False, ipaddress.ip_address('240.0.0.0').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001721 self.assertEqual(True, ipaddress.ip_address('240.0.0.1').is_reserved)
1722 self.assertEqual(False,
1723 ipaddress.ip_address('239.255.255.255').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001724
1725 self.assertEqual(True, ipaddress.ip_address('192.168.1.1').is_private)
1726 self.assertEqual(False, ipaddress.ip_address('192.169.0.0').is_private)
1727 self.assertEqual(True, ipaddress.ip_address(
1728 '10.255.255.255').is_private)
1729 self.assertEqual(False, ipaddress.ip_address('11.0.0.0').is_private)
1730 self.assertEqual(True, ipaddress.ip_address(
1731 '172.31.255.255').is_private)
1732 self.assertEqual(False, ipaddress.ip_address('172.32.0.0').is_private)
1733
1734 self.assertEqual(True,
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001735 ipaddress.ip_address('169.254.100.200').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001736 self.assertEqual(False,
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001737 ipaddress.ip_address('169.255.100.200').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001738
Berker Peksag742192a2016-06-11 22:11:47 +03001739 self.assertTrue(ipaddress.ip_address('192.0.7.1').is_global)
1740 self.assertFalse(ipaddress.ip_address('203.0.113.1').is_global)
1741
Nick Coghlandc9b2552012-05-20 21:01:57 +10001742 self.assertEqual(True,
1743 ipaddress.ip_address('127.100.200.254').is_loopback)
1744 self.assertEqual(True, ipaddress.ip_address('127.42.0.0').is_loopback)
1745 self.assertEqual(False, ipaddress.ip_address('128.0.0.0').is_loopback)
1746 self.assertEqual(True, ipaddress.ip_network('0.0.0.0').is_unspecified)
1747
1748 def testReservedIpv6(self):
1749
1750 self.assertEqual(True, ipaddress.ip_network('ffff::').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001751 self.assertEqual(True, ipaddress.ip_network(2**128 - 1).is_multicast)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001752 self.assertEqual(True, ipaddress.ip_network('ff00::').is_multicast)
1753 self.assertEqual(False, ipaddress.ip_network('fdff::').is_multicast)
1754
1755 self.assertEqual(True, ipaddress.ip_network('fecf::').is_site_local)
1756 self.assertEqual(True, ipaddress.ip_network(
1757 'feff:ffff:ffff:ffff::').is_site_local)
1758 self.assertEqual(False, ipaddress.ip_network(
1759 'fbf:ffff::').is_site_local)
1760 self.assertEqual(False, ipaddress.ip_network('ff00::').is_site_local)
1761
1762 self.assertEqual(True, ipaddress.ip_network('fc00::').is_private)
1763 self.assertEqual(True, ipaddress.ip_network(
1764 'fc00:ffff:ffff:ffff::').is_private)
1765 self.assertEqual(False, ipaddress.ip_network('fbff:ffff::').is_private)
1766 self.assertEqual(False, ipaddress.ip_network('fe00::').is_private)
1767
1768 self.assertEqual(True, ipaddress.ip_network('fea0::').is_link_local)
1769 self.assertEqual(True, ipaddress.ip_network(
1770 'febf:ffff::').is_link_local)
1771 self.assertEqual(False, ipaddress.ip_network(
1772 'fe7f:ffff::').is_link_local)
1773 self.assertEqual(False, ipaddress.ip_network('fec0::').is_link_local)
1774
1775 self.assertEqual(True, ipaddress.ip_interface('0:0::0:01').is_loopback)
1776 self.assertEqual(False, ipaddress.ip_interface('::1/127').is_loopback)
1777 self.assertEqual(False, ipaddress.ip_network('::').is_loopback)
1778 self.assertEqual(False, ipaddress.ip_network('::2').is_loopback)
1779
1780 self.assertEqual(True, ipaddress.ip_network('0::0').is_unspecified)
1781 self.assertEqual(False, ipaddress.ip_network('::1').is_unspecified)
1782 self.assertEqual(False, ipaddress.ip_network('::/127').is_unspecified)
1783
Peter Moody22c31762013-10-21 13:58:06 -07001784 self.assertEqual(True,
1785 ipaddress.ip_network('2001::1/128').is_private)
1786 self.assertEqual(True,
1787 ipaddress.ip_network('200::1/128').is_global)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001788 # test addresses
1789 self.assertEqual(True, ipaddress.ip_address('ffff::').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001790 self.assertEqual(True, ipaddress.ip_address(2**128 - 1).is_multicast)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001791 self.assertEqual(True, ipaddress.ip_address('ff00::').is_multicast)
1792 self.assertEqual(False, ipaddress.ip_address('fdff::').is_multicast)
1793
1794 self.assertEqual(True, ipaddress.ip_address('fecf::').is_site_local)
1795 self.assertEqual(True, ipaddress.ip_address(
1796 'feff:ffff:ffff:ffff::').is_site_local)
1797 self.assertEqual(False, ipaddress.ip_address(
1798 'fbf:ffff::').is_site_local)
1799 self.assertEqual(False, ipaddress.ip_address('ff00::').is_site_local)
1800
1801 self.assertEqual(True, ipaddress.ip_address('fc00::').is_private)
1802 self.assertEqual(True, ipaddress.ip_address(
1803 'fc00:ffff:ffff:ffff::').is_private)
1804 self.assertEqual(False, ipaddress.ip_address('fbff:ffff::').is_private)
1805 self.assertEqual(False, ipaddress.ip_address('fe00::').is_private)
1806
1807 self.assertEqual(True, ipaddress.ip_address('fea0::').is_link_local)
1808 self.assertEqual(True, ipaddress.ip_address(
1809 'febf:ffff::').is_link_local)
1810 self.assertEqual(False, ipaddress.ip_address(
1811 'fe7f:ffff::').is_link_local)
1812 self.assertEqual(False, ipaddress.ip_address('fec0::').is_link_local)
1813
1814 self.assertEqual(True, ipaddress.ip_address('0:0::0:01').is_loopback)
1815 self.assertEqual(True, ipaddress.ip_address('::1').is_loopback)
1816 self.assertEqual(False, ipaddress.ip_address('::2').is_loopback)
1817
1818 self.assertEqual(True, ipaddress.ip_address('0::0').is_unspecified)
1819 self.assertEqual(False, ipaddress.ip_address('::1').is_unspecified)
1820
1821 # some generic IETF reserved addresses
1822 self.assertEqual(True, ipaddress.ip_address('100::').is_reserved)
1823 self.assertEqual(True, ipaddress.ip_network('4000::1/128').is_reserved)
1824
1825 def testIpv4Mapped(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001826 self.assertEqual(
1827 ipaddress.ip_address('::ffff:192.168.1.1').ipv4_mapped,
1828 ipaddress.ip_address('192.168.1.1'))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001829 self.assertEqual(ipaddress.ip_address('::c0a8:101').ipv4_mapped, None)
1830 self.assertEqual(ipaddress.ip_address('::ffff:c0a8:101').ipv4_mapped,
1831 ipaddress.ip_address('192.168.1.1'))
1832
1833 def testAddrExclude(self):
1834 addr1 = ipaddress.ip_network('10.1.1.0/24')
1835 addr2 = ipaddress.ip_network('10.1.1.0/26')
1836 addr3 = ipaddress.ip_network('10.2.1.0/24')
1837 addr4 = ipaddress.ip_address('10.1.1.0')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001838 addr5 = ipaddress.ip_network('2001:db8::0/32')
Serhiy Storchakabb0dbd52016-03-01 10:25:45 +02001839 addr6 = ipaddress.ip_network('10.1.1.5/32')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001840 self.assertEqual(sorted(list(addr1.address_exclude(addr2))),
1841 [ipaddress.ip_network('10.1.1.64/26'),
1842 ipaddress.ip_network('10.1.1.128/25')])
1843 self.assertRaises(ValueError, list, addr1.address_exclude(addr3))
1844 self.assertRaises(TypeError, list, addr1.address_exclude(addr4))
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001845 self.assertRaises(TypeError, list, addr1.address_exclude(addr5))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001846 self.assertEqual(list(addr1.address_exclude(addr1)), [])
Serhiy Storchakabb0dbd52016-03-01 10:25:45 +02001847 self.assertEqual(sorted(list(addr1.address_exclude(addr6))),
1848 [ipaddress.ip_network('10.1.1.0/30'),
1849 ipaddress.ip_network('10.1.1.4/32'),
1850 ipaddress.ip_network('10.1.1.6/31'),
1851 ipaddress.ip_network('10.1.1.8/29'),
1852 ipaddress.ip_network('10.1.1.16/28'),
1853 ipaddress.ip_network('10.1.1.32/27'),
1854 ipaddress.ip_network('10.1.1.64/26'),
1855 ipaddress.ip_network('10.1.1.128/25')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001856
1857 def testHash(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001858 self.assertEqual(hash(ipaddress.ip_interface('10.1.1.0/24')),
1859 hash(ipaddress.ip_interface('10.1.1.0/24')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001860 self.assertEqual(hash(ipaddress.ip_network('10.1.1.0/24')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001861 hash(ipaddress.ip_network('10.1.1.0/24')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001862 self.assertEqual(hash(ipaddress.ip_address('10.1.1.0')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001863 hash(ipaddress.ip_address('10.1.1.0')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001864 # i70
1865 self.assertEqual(hash(ipaddress.ip_address('1.2.3.4')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001866 hash(ipaddress.ip_address(
Nick Coghlandc9b2552012-05-20 21:01:57 +10001867 int(ipaddress.ip_address('1.2.3.4')._ip))))
1868 ip1 = ipaddress.ip_address('10.1.1.0')
1869 ip2 = ipaddress.ip_address('1::')
1870 dummy = {}
1871 dummy[self.ipv4_address] = None
1872 dummy[self.ipv6_address] = None
1873 dummy[ip1] = None
1874 dummy[ip2] = None
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001875 self.assertIn(self.ipv4_address, dummy)
1876 self.assertIn(ip2, dummy)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001877
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001878 def testIPBases(self):
1879 net = self.ipv4_network
1880 self.assertEqual('1.2.3.0/24', net.compressed)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001881 net = self.ipv6_network
1882 self.assertRaises(ValueError, net._string_from_ip_int, 2**128 + 1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001883
Hynek Schlawack454a74d2012-06-04 18:14:02 +02001884 def testIPv6NetworkHelpers(self):
1885 net = self.ipv6_network
1886 self.assertEqual('2001:658:22a:cafe::/64', net.with_prefixlen)
1887 self.assertEqual('2001:658:22a:cafe::/ffff:ffff:ffff:ffff::',
1888 net.with_netmask)
1889 self.assertEqual('2001:658:22a:cafe::/::ffff:ffff:ffff:ffff',
1890 net.with_hostmask)
1891 self.assertEqual('2001:658:22a:cafe::/64', str(net))
1892
1893 def testIPv4NetworkHelpers(self):
1894 net = self.ipv4_network
1895 self.assertEqual('1.2.3.0/24', net.with_prefixlen)
1896 self.assertEqual('1.2.3.0/255.255.255.0', net.with_netmask)
1897 self.assertEqual('1.2.3.0/0.0.0.255', net.with_hostmask)
1898 self.assertEqual('1.2.3.0/24', str(net))
1899
Nick Coghlandc9b2552012-05-20 21:01:57 +10001900 def testCopyConstructor(self):
1901 addr1 = ipaddress.ip_network('10.1.1.0/24')
1902 addr2 = ipaddress.ip_network(addr1)
1903 addr3 = ipaddress.ip_interface('2001:658:22a:cafe:200::1/64')
1904 addr4 = ipaddress.ip_interface(addr3)
1905 addr5 = ipaddress.IPv4Address('1.1.1.1')
1906 addr6 = ipaddress.IPv6Address('2001:658:22a:cafe:200::1')
1907
1908 self.assertEqual(addr1, addr2)
1909 self.assertEqual(addr3, addr4)
1910 self.assertEqual(addr5, ipaddress.IPv4Address(addr5))
1911 self.assertEqual(addr6, ipaddress.IPv6Address(addr6))
1912
1913 def testCompressIPv6Address(self):
1914 test_addresses = {
1915 '1:2:3:4:5:6:7:8': '1:2:3:4:5:6:7:8/128',
1916 '2001:0:0:4:0:0:0:8': '2001:0:0:4::8/128',
1917 '2001:0:0:4:5:6:7:8': '2001::4:5:6:7:8/128',
1918 '2001:0:3:4:5:6:7:8': '2001:0:3:4:5:6:7:8/128',
Nick Coghlandc9b2552012-05-20 21:01:57 +10001919 '0:0:3:0:0:0:0:ffff': '0:0:3::ffff/128',
1920 '0:0:0:4:0:0:0:ffff': '::4:0:0:0:ffff/128',
1921 '0:0:0:0:5:0:0:ffff': '::5:0:0:ffff/128',
1922 '1:0:0:4:0:0:7:8': '1::4:0:0:7:8/128',
1923 '0:0:0:0:0:0:0:0': '::/128',
1924 '0:0:0:0:0:0:0:0/0': '::/0',
1925 '0:0:0:0:0:0:0:1': '::1/128',
1926 '2001:0658:022a:cafe:0000:0000:0000:0000/66':
1927 '2001:658:22a:cafe::/66',
1928 '::1.2.3.4': '::102:304/128',
1929 '1:2:3:4:5:ffff:1.2.3.4': '1:2:3:4:5:ffff:102:304/128',
1930 '::7:6:5:4:3:2:1': '0:7:6:5:4:3:2:1/128',
1931 '::7:6:5:4:3:2:0': '0:7:6:5:4:3:2:0/128',
1932 '7:6:5:4:3:2:1::': '7:6:5:4:3:2:1:0/128',
1933 '0:6:5:4:3:2:1::': '0:6:5:4:3:2:1:0/128',
1934 }
1935 for uncompressed, compressed in list(test_addresses.items()):
1936 self.assertEqual(compressed, str(ipaddress.IPv6Interface(
1937 uncompressed)))
1938
1939 def testExplodeShortHandIpStr(self):
1940 addr1 = ipaddress.IPv6Interface('2001::1')
1941 addr2 = ipaddress.IPv6Address('2001:0:5ef5:79fd:0:59d:a0e5:ba1')
1942 addr3 = ipaddress.IPv6Network('2001::/96')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001943 addr4 = ipaddress.IPv4Address('192.168.178.1')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001944 self.assertEqual('2001:0000:0000:0000:0000:0000:0000:0001/128',
1945 addr1.exploded)
1946 self.assertEqual('0000:0000:0000:0000:0000:0000:0000:0001/128',
1947 ipaddress.IPv6Interface('::1/128').exploded)
1948 # issue 77
1949 self.assertEqual('2001:0000:5ef5:79fd:0000:059d:a0e5:0ba1',
1950 addr2.exploded)
1951 self.assertEqual('2001:0000:0000:0000:0000:0000:0000:0000/96',
1952 addr3.exploded)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001953 self.assertEqual('192.168.178.1', addr4.exploded)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001954
Eric V. Smithebdaaf42014-04-14 12:58:07 -04001955 def testReversePointer(self):
1956 addr1 = ipaddress.IPv4Address('127.0.0.1')
1957 addr2 = ipaddress.IPv6Address('2001:db8::1')
1958 self.assertEqual('1.0.0.127.in-addr.arpa', addr1.reverse_pointer)
1959 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.' +
1960 'b.d.0.1.0.0.2.ip6.arpa',
1961 addr2.reverse_pointer)
1962
Nick Coghlandc9b2552012-05-20 21:01:57 +10001963 def testIntRepresentation(self):
1964 self.assertEqual(16909060, int(self.ipv4_address))
1965 self.assertEqual(42540616829182469433547762482097946625,
1966 int(self.ipv6_address))
1967
Nick Coghlandc9b2552012-05-20 21:01:57 +10001968 def testForceVersion(self):
1969 self.assertEqual(ipaddress.ip_network(1).version, 4)
Nick Coghlan51c30672012-05-27 00:25:58 +10001970 self.assertEqual(ipaddress.IPv6Network(1).version, 6)
Sandro Tosi876ecad2012-05-23 22:26:55 +02001971
Nick Coghlandc9b2552012-05-20 21:01:57 +10001972 def testWithStar(self):
Nick Coghlana8517ad2012-08-20 10:04:26 +10001973 self.assertEqual(self.ipv4_interface.with_prefixlen, "1.2.3.4/24")
1974 self.assertEqual(self.ipv4_interface.with_netmask,
Nick Coghlandc9b2552012-05-20 21:01:57 +10001975 "1.2.3.4/255.255.255.0")
Nick Coghlana8517ad2012-08-20 10:04:26 +10001976 self.assertEqual(self.ipv4_interface.with_hostmask,
Nick Coghlandc9b2552012-05-20 21:01:57 +10001977 "1.2.3.4/0.0.0.255")
1978
Nick Coghlana8517ad2012-08-20 10:04:26 +10001979 self.assertEqual(self.ipv6_interface.with_prefixlen,
Nick Coghlandc9b2552012-05-20 21:01:57 +10001980 '2001:658:22a:cafe:200::1/64')
Nick Coghlana8517ad2012-08-20 10:04:26 +10001981 self.assertEqual(self.ipv6_interface.with_netmask,
1982 '2001:658:22a:cafe:200::1/ffff:ffff:ffff:ffff::')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001983 # this probably don't make much sense, but it's included for
1984 # compatibility with ipv4
Nick Coghlana8517ad2012-08-20 10:04:26 +10001985 self.assertEqual(self.ipv6_interface.with_hostmask,
Nick Coghlandc9b2552012-05-20 21:01:57 +10001986 '2001:658:22a:cafe:200::1/::ffff:ffff:ffff:ffff')
1987
1988 def testNetworkElementCaching(self):
1989 # V4 - make sure we're empty
Inada Naoki2430d532019-04-15 16:01:00 +09001990 self.assertNotIn('broadcast_address', self.ipv4_network.__dict__)
1991 self.assertNotIn('hostmask', self.ipv4_network.__dict__)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001992
1993 # V4 - populate and test
Nick Coghlandc9b2552012-05-20 21:01:57 +10001994 self.assertEqual(self.ipv4_network.broadcast_address,
1995 ipaddress.IPv4Address('1.2.3.255'))
1996 self.assertEqual(self.ipv4_network.hostmask,
1997 ipaddress.IPv4Address('0.0.0.255'))
1998
1999 # V4 - check we're cached
Inada Naoki2430d532019-04-15 16:01:00 +09002000 self.assertIn('broadcast_address', self.ipv4_network.__dict__)
2001 self.assertIn('hostmask', self.ipv4_network.__dict__)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002002
2003 # V6 - make sure we're empty
Inada Naoki2430d532019-04-15 16:01:00 +09002004 self.assertNotIn('broadcast_address', self.ipv6_network.__dict__)
2005 self.assertNotIn('hostmask', self.ipv6_network.__dict__)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002006
2007 # V6 - populate and test
2008 self.assertEqual(self.ipv6_network.network_address,
2009 ipaddress.IPv6Address('2001:658:22a:cafe::'))
2010 self.assertEqual(self.ipv6_interface.network.network_address,
2011 ipaddress.IPv6Address('2001:658:22a:cafe::'))
2012
2013 self.assertEqual(
2014 self.ipv6_network.broadcast_address,
2015 ipaddress.IPv6Address('2001:658:22a:cafe:ffff:ffff:ffff:ffff'))
2016 self.assertEqual(self.ipv6_network.hostmask,
2017 ipaddress.IPv6Address('::ffff:ffff:ffff:ffff'))
2018 self.assertEqual(
2019 self.ipv6_interface.network.broadcast_address,
2020 ipaddress.IPv6Address('2001:658:22a:cafe:ffff:ffff:ffff:ffff'))
2021 self.assertEqual(self.ipv6_interface.network.hostmask,
2022 ipaddress.IPv6Address('::ffff:ffff:ffff:ffff'))
2023
2024 # V6 - check we're cached
Inada Naoki2430d532019-04-15 16:01:00 +09002025 self.assertIn('broadcast_address', self.ipv6_network.__dict__)
2026 self.assertIn('hostmask', self.ipv6_network.__dict__)
2027 self.assertIn('broadcast_address', self.ipv6_interface.network.__dict__)
2028 self.assertIn('hostmask', self.ipv6_interface.network.__dict__)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002029
2030 def testTeredo(self):
2031 # stolen from wikipedia
2032 server = ipaddress.IPv4Address('65.54.227.120')
2033 client = ipaddress.IPv4Address('192.0.2.45')
2034 teredo_addr = '2001:0000:4136:e378:8000:63bf:3fff:fdd2'
2035 self.assertEqual((server, client),
2036 ipaddress.ip_address(teredo_addr).teredo)
2037 bad_addr = '2000::4136:e378:8000:63bf:3fff:fdd2'
2038 self.assertFalse(ipaddress.ip_address(bad_addr).teredo)
2039 bad_addr = '2001:0001:4136:e378:8000:63bf:3fff:fdd2'
2040 self.assertFalse(ipaddress.ip_address(bad_addr).teredo)
2041
2042 # i77
2043 teredo_addr = ipaddress.IPv6Address('2001:0:5ef5:79fd:0:59d:a0e5:ba1')
2044 self.assertEqual((ipaddress.IPv4Address('94.245.121.253'),
2045 ipaddress.IPv4Address('95.26.244.94')),
2046 teredo_addr.teredo)
2047
Nick Coghlandc9b2552012-05-20 21:01:57 +10002048 def testsixtofour(self):
2049 sixtofouraddr = ipaddress.ip_address('2002:ac1d:2d64::1')
2050 bad_addr = ipaddress.ip_address('2000:ac1d:2d64::1')
2051 self.assertEqual(ipaddress.IPv4Address('172.29.45.100'),
2052 sixtofouraddr.sixtofour)
2053 self.assertFalse(bad_addr.sixtofour)
2054
Nick Coghlandc9b2552012-05-20 21:01:57 +10002055
2056if __name__ == '__main__':
2057 unittest.main()