blob: dbf68b3f8f1a06f3e3d2850e2c4307f4b58a266f [file] [log] [blame]
Nick Coghlandc9b2552012-05-20 21:01:57 +10001# Copyright 2007 Google Inc.
2# Licensed to PSF under a Contributor Agreement.
Nick Coghlandc9b2552012-05-20 21:01:57 +10003
Nick Coghlanaff73f92012-05-27 00:57:25 +10004"""Unittest for ipaddress module."""
Nick Coghlandc9b2552012-05-20 21:01:57 +10005
6
7import unittest
Nick Coghlan36f8dcd2012-07-07 19:23:53 +10008import re
9import contextlib
Serhiy Storchakaf186e122015-01-26 10:11:16 +020010import functools
Nick Coghlane0c3f5e2012-08-05 18:20:17 +100011import operator
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +020012import pickle
Nick Coghlandc9b2552012-05-20 21:01:57 +100013import ipaddress
Serhiy Storchaka88f64f32015-03-07 20:08:34 +020014import weakref
Nick Coghlandc9b2552012-05-20 21:01:57 +100015
R David Murray75678652014-10-12 15:17:22 -040016
Nick Coghlan07c4e332012-07-08 23:06:45 +100017class BaseTestCase(unittest.TestCase):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +100018 # One big change in ipaddress over the original ipaddr module is
19 # error reporting that tries to assume users *don't know the rules*
20 # for what constitutes an RFC compliant IP address
21
Nick Coghlan07c4e332012-07-08 23:06:45 +100022 # Ensuring these errors are emitted correctly in all relevant cases
23 # meant moving to a more systematic test structure that allows the
24 # test structure to map more directly to the module structure
25
Nick Coghlan36f8dcd2012-07-07 19:23:53 +100026 # Note that if the constructors are refactored so that addresses with
27 # multiple problems get classified differently, that's OK - just
28 # move the affected examples to the newly appropriate test case.
29
Nick Coghlan07c4e332012-07-08 23:06:45 +100030 # There is some duplication between the original relatively ad hoc
31 # test suite and the new systematic tests. While some redundancy in
32 # testing is considered preferable to accidentally deleting a valid
33 # test, the original test suite will likely be reduced over time as
34 # redundant tests are identified.
Nick Coghlan36f8dcd2012-07-07 19:23:53 +100035
Nick Coghlan297b1432012-07-08 17:11:04 +100036 @property
37 def factory(self):
38 raise NotImplementedError
39
Nick Coghlan36f8dcd2012-07-07 19:23:53 +100040 @contextlib.contextmanager
41 def assertCleanError(self, exc_type, details, *args):
42 """
43 Ensure exception does not display a context by default
44
45 Wraps unittest.TestCase.assertRaisesRegex
46 """
47 if args:
48 details = details % args
49 cm = self.assertRaisesRegex(exc_type, details)
50 with cm as exc:
51 yield exc
52 # Ensure we produce clean tracebacks on failure
53 if exc.exception.__context__ is not None:
54 self.assertTrue(exc.exception.__suppress_context__)
55
56 def assertAddressError(self, details, *args):
57 """Ensure a clean AddressValueError"""
58 return self.assertCleanError(ipaddress.AddressValueError,
R David Murray75678652014-10-12 15:17:22 -040059 details, *args)
Nick Coghlan36f8dcd2012-07-07 19:23:53 +100060
61 def assertNetmaskError(self, details, *args):
62 """Ensure a clean NetmaskValueError"""
63 return self.assertCleanError(ipaddress.NetmaskValueError,
R David Murray75678652014-10-12 15:17:22 -040064 details, *args)
Nick Coghlan36f8dcd2012-07-07 19:23:53 +100065
Nick Coghlan07c4e332012-07-08 23:06:45 +100066 def assertInstancesEqual(self, lhs, rhs):
67 """Check constructor arguments produce equivalent instances"""
68 self.assertEqual(self.factory(lhs), self.factory(rhs))
69
R David Murray75678652014-10-12 15:17:22 -040070
Nick Coghlan07c4e332012-07-08 23:06:45 +100071class CommonTestMixin:
Nick Coghlan36f8dcd2012-07-07 19:23:53 +100072
73 def test_empty_address(self):
74 with self.assertAddressError("Address cannot be empty"):
Nick Coghlan297b1432012-07-08 17:11:04 +100075 self.factory("")
76
77 def test_floats_rejected(self):
78 with self.assertAddressError(re.escape(repr("1.0"))):
79 self.factory(1.0)
80
Nick Coghlane0c3f5e2012-08-05 18:20:17 +100081 def test_not_an_index_issue15559(self):
82 # Implementing __index__ makes for a very nasty interaction with the
83 # bytes constructor. Thus, we disallow implicit use as an integer
84 self.assertRaises(TypeError, operator.index, self.factory(1))
85 self.assertRaises(TypeError, hex, self.factory(1))
86 self.assertRaises(TypeError, bytes, self.factory(1))
87
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +020088 def pickle_test(self, addr):
89 for proto in range(pickle.HIGHEST_PROTOCOL + 1):
90 with self.subTest(proto=proto):
91 x = self.factory(addr)
92 y = pickle.loads(pickle.dumps(x, proto))
93 self.assertEqual(y, x)
94
Nick Coghlan07c4e332012-07-08 23:06:45 +100095class CommonTestMixin_v4(CommonTestMixin):
96
97 def test_leading_zeros(self):
98 self.assertInstancesEqual("000.000.000.000", "0.0.0.0")
99 self.assertInstancesEqual("192.168.000.001", "192.168.0.1")
100
101 def test_int(self):
102 self.assertInstancesEqual(0, "0.0.0.0")
103 self.assertInstancesEqual(3232235521, "192.168.0.1")
104
105 def test_packed(self):
106 self.assertInstancesEqual(bytes.fromhex("00000000"), "0.0.0.0")
107 self.assertInstancesEqual(bytes.fromhex("c0a80001"), "192.168.0.1")
Nick Coghlan297b1432012-07-08 17:11:04 +1000108
109 def test_negative_ints_rejected(self):
110 msg = "-1 (< 0) is not permitted as an IPv4 address"
111 with self.assertAddressError(re.escape(msg)):
112 self.factory(-1)
113
114 def test_large_ints_rejected(self):
115 msg = "%d (>= 2**32) is not permitted as an IPv4 address"
116 with self.assertAddressError(re.escape(msg % 2**32)):
117 self.factory(2**32)
118
119 def test_bad_packed_length(self):
120 def assertBadLength(length):
Serhiy Storchaka5f1a5182016-09-11 14:41:02 +0300121 addr = b'\0' * length
Nick Coghlan297b1432012-07-08 17:11:04 +1000122 msg = "%r (len %d != 4) is not permitted as an IPv4 address"
123 with self.assertAddressError(re.escape(msg % (addr, length))):
124 self.factory(addr)
125
126 assertBadLength(3)
127 assertBadLength(5)
128
R David Murray75678652014-10-12 15:17:22 -0400129
Nick Coghlan07c4e332012-07-08 23:06:45 +1000130class CommonTestMixin_v6(CommonTestMixin):
131
132 def test_leading_zeros(self):
133 self.assertInstancesEqual("0000::0000", "::")
134 self.assertInstancesEqual("000::c0a8:0001", "::c0a8:1")
135
136 def test_int(self):
137 self.assertInstancesEqual(0, "::")
138 self.assertInstancesEqual(3232235521, "::c0a8:1")
139
140 def test_packed(self):
Serhiy Storchaka5f1a5182016-09-11 14:41:02 +0300141 addr = b'\0'*12 + bytes.fromhex("00000000")
Nick Coghlan07c4e332012-07-08 23:06:45 +1000142 self.assertInstancesEqual(addr, "::")
Serhiy Storchaka5f1a5182016-09-11 14:41:02 +0300143 addr = b'\0'*12 + bytes.fromhex("c0a80001")
Nick Coghlan07c4e332012-07-08 23:06:45 +1000144 self.assertInstancesEqual(addr, "::c0a8:1")
Serhiy Storchaka5f1a5182016-09-11 14:41:02 +0300145 addr = bytes.fromhex("c0a80001") + b'\0'*12
Nick Coghlan07c4e332012-07-08 23:06:45 +1000146 self.assertInstancesEqual(addr, "c0a8:1::")
Nick Coghlan297b1432012-07-08 17:11:04 +1000147
148 def test_negative_ints_rejected(self):
149 msg = "-1 (< 0) is not permitted as an IPv6 address"
150 with self.assertAddressError(re.escape(msg)):
151 self.factory(-1)
152
153 def test_large_ints_rejected(self):
154 msg = "%d (>= 2**128) is not permitted as an IPv6 address"
155 with self.assertAddressError(re.escape(msg % 2**128)):
156 self.factory(2**128)
157
158 def test_bad_packed_length(self):
159 def assertBadLength(length):
Serhiy Storchaka5f1a5182016-09-11 14:41:02 +0300160 addr = b'\0' * length
Nick Coghlan297b1432012-07-08 17:11:04 +1000161 msg = "%r (len %d != 16) is not permitted as an IPv6 address"
162 with self.assertAddressError(re.escape(msg % (addr, length))):
163 self.factory(addr)
164 self.factory(addr)
165
166 assertBadLength(15)
167 assertBadLength(17)
168
169
Nick Coghlan07c4e332012-07-08 23:06:45 +1000170class AddressTestCase_v4(BaseTestCase, CommonTestMixin_v4):
Nick Coghlan297b1432012-07-08 17:11:04 +1000171 factory = ipaddress.IPv4Address
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000172
173 def test_network_passed_as_address(self):
174 addr = "127.0.0.1/24"
175 with self.assertAddressError("Unexpected '/' in %r", addr):
176 ipaddress.IPv4Address(addr)
177
178 def test_bad_address_split(self):
179 def assertBadSplit(addr):
180 with self.assertAddressError("Expected 4 octets in %r", addr):
181 ipaddress.IPv4Address(addr)
182
183 assertBadSplit("127.0.1")
184 assertBadSplit("42.42.42.42.42")
185 assertBadSplit("42.42.42")
186 assertBadSplit("42.42")
187 assertBadSplit("42")
188 assertBadSplit("42..42.42.42")
189 assertBadSplit("42.42.42.42.")
190 assertBadSplit("42.42.42.42...")
191 assertBadSplit(".42.42.42.42")
192 assertBadSplit("...42.42.42.42")
193 assertBadSplit("016.016.016")
194 assertBadSplit("016.016")
195 assertBadSplit("016")
196 assertBadSplit("000")
197 assertBadSplit("0x0a.0x0a.0x0a")
198 assertBadSplit("0x0a.0x0a")
199 assertBadSplit("0x0a")
200 assertBadSplit(".")
201 assertBadSplit("bogus")
202 assertBadSplit("bogus.com")
203 assertBadSplit("1000")
204 assertBadSplit("1000000000000000")
205 assertBadSplit("192.168.0.1.com")
206
207 def test_empty_octet(self):
208 def assertBadOctet(addr):
209 with self.assertAddressError("Empty octet not permitted in %r",
R David Murray75678652014-10-12 15:17:22 -0400210 addr):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000211 ipaddress.IPv4Address(addr)
212
213 assertBadOctet("42..42.42")
214 assertBadOctet("...")
215
216 def test_invalid_characters(self):
217 def assertBadOctet(addr, octet):
218 msg = "Only decimal digits permitted in %r in %r" % (octet, addr)
219 with self.assertAddressError(re.escape(msg)):
220 ipaddress.IPv4Address(addr)
221
222 assertBadOctet("0x0a.0x0a.0x0a.0x0a", "0x0a")
Nick Coghlan07c4e332012-07-08 23:06:45 +1000223 assertBadOctet("0xa.0x0a.0x0a.0x0a", "0xa")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000224 assertBadOctet("42.42.42.-0", "-0")
225 assertBadOctet("42.42.42.+0", "+0")
226 assertBadOctet("42.42.42.-42", "-42")
227 assertBadOctet("+1.+2.+3.4", "+1")
228 assertBadOctet("1.2.3.4e0", "4e0")
229 assertBadOctet("1.2.3.4::", "4::")
230 assertBadOctet("1.a.2.3", "a")
231
Nick Coghlan07c4e332012-07-08 23:06:45 +1000232 def test_octal_decimal_ambiguity(self):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000233 def assertBadOctet(addr, octet):
Nick Coghlan07c4e332012-07-08 23:06:45 +1000234 msg = "Ambiguous (octal/decimal) value in %r not permitted in %r"
235 with self.assertAddressError(re.escape(msg % (octet, addr))):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000236 ipaddress.IPv4Address(addr)
237
238 assertBadOctet("016.016.016.016", "016")
239 assertBadOctet("001.000.008.016", "008")
Nick Coghlan07c4e332012-07-08 23:06:45 +1000240
241 def test_octet_length(self):
242 def assertBadOctet(addr, octet):
243 msg = "At most 3 characters permitted in %r in %r"
244 with self.assertAddressError(re.escape(msg % (octet, addr))):
245 ipaddress.IPv4Address(addr)
246
247 assertBadOctet("0000.000.000.000", "0000")
248 assertBadOctet("12345.67899.-54321.-98765", "12345")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000249
250 def test_octet_limit(self):
251 def assertBadOctet(addr, octet):
Nick Coghlanb582ecc2012-07-07 22:15:22 +1000252 msg = "Octet %d (> 255) not permitted in %r" % (octet, addr)
253 with self.assertAddressError(re.escape(msg)):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000254 ipaddress.IPv4Address(addr)
255
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000256 assertBadOctet("257.0.0.0", 257)
Nick Coghlan07c4e332012-07-08 23:06:45 +1000257 assertBadOctet("192.168.0.999", 999)
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000258
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +0200259 def test_pickle(self):
260 self.pickle_test('192.0.2.1')
261
Serhiy Storchaka88f64f32015-03-07 20:08:34 +0200262 def test_weakref(self):
263 weakref.ref(self.factory('192.0.2.1'))
264
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000265
Nick Coghlan07c4e332012-07-08 23:06:45 +1000266class AddressTestCase_v6(BaseTestCase, CommonTestMixin_v6):
Nick Coghlan297b1432012-07-08 17:11:04 +1000267 factory = ipaddress.IPv6Address
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000268
269 def test_network_passed_as_address(self):
270 addr = "::1/24"
271 with self.assertAddressError("Unexpected '/' in %r", addr):
272 ipaddress.IPv6Address(addr)
273
274 def test_bad_address_split_v6_not_enough_parts(self):
275 def assertBadSplit(addr):
276 msg = "At least 3 parts expected in %r"
277 with self.assertAddressError(msg, addr):
278 ipaddress.IPv6Address(addr)
279
280 assertBadSplit(":")
281 assertBadSplit(":1")
282 assertBadSplit("FEDC:9878")
283
284 def test_bad_address_split_v6_too_many_colons(self):
285 def assertBadSplit(addr):
286 msg = "At most 8 colons permitted in %r"
287 with self.assertAddressError(msg, addr):
288 ipaddress.IPv6Address(addr)
289
290 assertBadSplit("9:8:7:6:5:4:3::2:1")
291 assertBadSplit("10:9:8:7:6:5:4:3:2:1")
292 assertBadSplit("::8:7:6:5:4:3:2:1")
293 assertBadSplit("8:7:6:5:4:3:2:1::")
294 # A trailing IPv4 address is two parts
295 assertBadSplit("10:9:8:7:6:5:4:3:42.42.42.42")
296
297 def test_bad_address_split_v6_too_many_parts(self):
298 def assertBadSplit(addr):
299 msg = "Exactly 8 parts expected without '::' in %r"
300 with self.assertAddressError(msg, addr):
301 ipaddress.IPv6Address(addr)
302
303 assertBadSplit("3ffe:0:0:0:0:0:0:0:1")
304 assertBadSplit("9:8:7:6:5:4:3:2:1")
305 assertBadSplit("7:6:5:4:3:2:1")
306 # A trailing IPv4 address is two parts
307 assertBadSplit("9:8:7:6:5:4:3:42.42.42.42")
308 assertBadSplit("7:6:5:4:3:42.42.42.42")
309
310 def test_bad_address_split_v6_too_many_parts_with_double_colon(self):
311 def assertBadSplit(addr):
312 msg = "Expected at most 7 other parts with '::' in %r"
313 with self.assertAddressError(msg, addr):
314 ipaddress.IPv6Address(addr)
315
316 assertBadSplit("1:2:3:4::5:6:7:8")
317
318 def test_bad_address_split_v6_repeated_double_colon(self):
319 def assertBadSplit(addr):
320 msg = "At most one '::' permitted in %r"
321 with self.assertAddressError(msg, addr):
322 ipaddress.IPv6Address(addr)
323
324 assertBadSplit("3ffe::1::1")
325 assertBadSplit("1::2::3::4:5")
326 assertBadSplit("2001::db:::1")
327 assertBadSplit("3ffe::1::")
328 assertBadSplit("::3ffe::1")
329 assertBadSplit(":3ffe::1::1")
330 assertBadSplit("3ffe::1::1:")
331 assertBadSplit(":3ffe::1::1:")
332 assertBadSplit(":::")
333 assertBadSplit('2001:db8:::1')
334
335 def test_bad_address_split_v6_leading_colon(self):
336 def assertBadSplit(addr):
337 msg = "Leading ':' only permitted as part of '::' in %r"
338 with self.assertAddressError(msg, addr):
339 ipaddress.IPv6Address(addr)
340
341 assertBadSplit(":2001:db8::1")
342 assertBadSplit(":1:2:3:4:5:6:7")
343 assertBadSplit(":1:2:3:4:5:6:")
344 assertBadSplit(":6:5:4:3:2:1::")
345
346 def test_bad_address_split_v6_trailing_colon(self):
347 def assertBadSplit(addr):
348 msg = "Trailing ':' only permitted as part of '::' in %r"
349 with self.assertAddressError(msg, addr):
350 ipaddress.IPv6Address(addr)
351
352 assertBadSplit("2001:db8::1:")
353 assertBadSplit("1:2:3:4:5:6:7:")
354 assertBadSplit("::1.2.3.4:")
355 assertBadSplit("::7:6:5:4:3:2:")
356
357 def test_bad_v4_part_in(self):
358 def assertBadAddressPart(addr, v4_error):
359 with self.assertAddressError("%s in %r", v4_error, addr):
360 ipaddress.IPv6Address(addr)
361
362 assertBadAddressPart("3ffe::1.net", "Expected 4 octets in '1.net'")
363 assertBadAddressPart("3ffe::127.0.1",
364 "Expected 4 octets in '127.0.1'")
365 assertBadAddressPart("::1.2.3",
366 "Expected 4 octets in '1.2.3'")
367 assertBadAddressPart("::1.2.3.4.5",
368 "Expected 4 octets in '1.2.3.4.5'")
369 assertBadAddressPart("3ffe::1.1.1.net",
370 "Only decimal digits permitted in 'net' "
371 "in '1.1.1.net'")
372
373 def test_invalid_characters(self):
374 def assertBadPart(addr, part):
375 msg = "Only hex digits permitted in %r in %r" % (part, addr)
376 with self.assertAddressError(re.escape(msg)):
377 ipaddress.IPv6Address(addr)
378
379 assertBadPart("3ffe::goog", "goog")
380 assertBadPart("3ffe::-0", "-0")
381 assertBadPart("3ffe::+0", "+0")
382 assertBadPart("3ffe::-1", "-1")
383 assertBadPart("1.2.3.4::", "1.2.3.4")
384 assertBadPart('1234:axy::b', "axy")
385
386 def test_part_length(self):
387 def assertBadPart(addr, part):
388 msg = "At most 4 characters permitted in %r in %r"
389 with self.assertAddressError(msg, part, addr):
390 ipaddress.IPv6Address(addr)
391
Nick Coghlan07c4e332012-07-08 23:06:45 +1000392 assertBadPart("::00000", "00000")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000393 assertBadPart("3ffe::10000", "10000")
394 assertBadPart("02001:db8::", "02001")
395 assertBadPart('2001:888888::1', "888888")
396
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +0200397 def test_pickle(self):
398 self.pickle_test('2001:db8::')
399
Serhiy Storchaka88f64f32015-03-07 20:08:34 +0200400 def test_weakref(self):
401 weakref.ref(self.factory('2001:db8::'))
402
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000403
Nick Coghlan07c4e332012-07-08 23:06:45 +1000404class NetmaskTestMixin_v4(CommonTestMixin_v4):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000405 """Input validation on interfaces and networks is very similar"""
406
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000407 def test_split_netmask(self):
408 addr = "1.2.3.4/32/24"
409 with self.assertAddressError("Only one '/' permitted in %r" % addr):
410 self.factory(addr)
411
412 def test_address_errors(self):
413 def assertBadAddress(addr, details):
414 with self.assertAddressError(details):
415 self.factory(addr)
416
Nick Coghlan297b1432012-07-08 17:11:04 +1000417 assertBadAddress("/", "Address cannot be empty")
418 assertBadAddress("/8", "Address cannot be empty")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000419 assertBadAddress("bogus", "Expected 4 octets")
420 assertBadAddress("google.com", "Expected 4 octets")
421 assertBadAddress("10/8", "Expected 4 octets")
422 assertBadAddress("::1.2.3.4", "Only decimal digits")
Nick Coghlanb582ecc2012-07-07 22:15:22 +1000423 assertBadAddress("1.2.3.256", re.escape("256 (> 255)"))
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000424
Nick Coghlan932346f2014-02-08 23:17:36 +1000425 def test_valid_netmask(self):
426 self.assertEqual(str(self.factory('192.0.2.0/255.255.255.0')),
427 '192.0.2.0/24')
428 for i in range(0, 33):
429 # Generate and re-parse the CIDR format (trivial).
430 net_str = '0.0.0.0/%d' % i
431 net = self.factory(net_str)
432 self.assertEqual(str(net), net_str)
433 # Generate and re-parse the expanded netmask.
434 self.assertEqual(
435 str(self.factory('0.0.0.0/%s' % net.netmask)), net_str)
436 # Zero prefix is treated as decimal.
437 self.assertEqual(str(self.factory('0.0.0.0/0%d' % i)), net_str)
438 # Generate and re-parse the expanded hostmask. The ambiguous
439 # cases (/0 and /32) are treated as netmasks.
440 if i in (32, 0):
441 net_str = '0.0.0.0/%d' % (32 - i)
442 self.assertEqual(
443 str(self.factory('0.0.0.0/%s' % net.hostmask)), net_str)
444
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000445 def test_netmask_errors(self):
446 def assertBadNetmask(addr, netmask):
Nick Coghlan932346f2014-02-08 23:17:36 +1000447 msg = "%r is not a valid netmask" % netmask
448 with self.assertNetmaskError(re.escape(msg)):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000449 self.factory("%s/%s" % (addr, netmask))
450
451 assertBadNetmask("1.2.3.4", "")
Nick Coghlan932346f2014-02-08 23:17:36 +1000452 assertBadNetmask("1.2.3.4", "-1")
453 assertBadNetmask("1.2.3.4", "+1")
454 assertBadNetmask("1.2.3.4", " 1 ")
455 assertBadNetmask("1.2.3.4", "0x1")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000456 assertBadNetmask("1.2.3.4", "33")
457 assertBadNetmask("1.2.3.4", "254.254.255.256")
Nick Coghlan932346f2014-02-08 23:17:36 +1000458 assertBadNetmask("1.2.3.4", "1.a.2.3")
Nick Coghlan07c4e332012-07-08 23:06:45 +1000459 assertBadNetmask("1.1.1.1", "254.xyz.2.3")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000460 assertBadNetmask("1.1.1.1", "240.255.0.0")
Nick Coghlan932346f2014-02-08 23:17:36 +1000461 assertBadNetmask("1.1.1.1", "255.254.128.0")
462 assertBadNetmask("1.1.1.1", "0.1.127.255")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000463 assertBadNetmask("1.1.1.1", "pudding")
Nick Coghlan932346f2014-02-08 23:17:36 +1000464 assertBadNetmask("1.1.1.1", "::")
465
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +0200466 def test_pickle(self):
467 self.pickle_test('192.0.2.0/27')
468 self.pickle_test('192.0.2.0/31') # IPV4LENGTH - 1
469 self.pickle_test('192.0.2.0') # IPV4LENGTH
470
R David Murray75678652014-10-12 15:17:22 -0400471
Serhiy Storchakaa556af72015-01-18 22:56:47 +0200472class InterfaceTestCase_v4(BaseTestCase, NetmaskTestMixin_v4):
473 factory = ipaddress.IPv4Interface
474
475
Nick Coghlan07c4e332012-07-08 23:06:45 +1000476class NetworkTestCase_v4(BaseTestCase, NetmaskTestMixin_v4):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000477 factory = ipaddress.IPv4Network
478
Cheryl Sabella91dc64b2017-10-22 17:39:49 -0400479 def test_subnet_of(self):
480 # containee left of container
481 self.assertFalse(
482 self.factory('10.0.0.0/30').subnet_of(
483 self.factory('10.0.1.0/24')))
484 # containee inside container
485 self.assertTrue(
486 self.factory('10.0.0.0/30').subnet_of(
487 self.factory('10.0.0.0/24')))
488 # containee right of container
489 self.assertFalse(
490 self.factory('10.0.0.0/30').subnet_of(
491 self.factory('10.0.1.0/24')))
492 # containee larger than container
493 self.assertFalse(
494 self.factory('10.0.1.0/24').subnet_of(
495 self.factory('10.0.0.0/30')))
496
497 def test_supernet_of(self):
498 # containee left of container
499 self.assertFalse(
500 self.factory('10.0.0.0/30').supernet_of(
501 self.factory('10.0.1.0/24')))
502 # containee inside container
503 self.assertFalse(
504 self.factory('10.0.0.0/30').supernet_of(
505 self.factory('10.0.0.0/24')))
506 # containee right of container
507 self.assertFalse(
508 self.factory('10.0.0.0/30').supernet_of(
509 self.factory('10.0.1.0/24')))
510 # containee larger than container
511 self.assertTrue(
512 self.factory('10.0.0.0/24').supernet_of(
513 self.factory('10.0.0.0/30')))
514
515 def test_subnet_of_mixed_types(self):
516 with self.assertRaises(TypeError):
517 ipaddress.IPv4Network('10.0.0.0/30').supernet_of(
518 ipaddress.IPv6Network('::1/128'))
519 with self.assertRaises(TypeError):
520 ipaddress.IPv6Network('::1/128').supernet_of(
521 ipaddress.IPv4Network('10.0.0.0/30'))
522 with self.assertRaises(TypeError):
523 ipaddress.IPv4Network('10.0.0.0/30').subnet_of(
524 ipaddress.IPv6Network('::1/128'))
525 with self.assertRaises(TypeError):
526 ipaddress.IPv6Network('::1/128').subnet_of(
527 ipaddress.IPv4Network('10.0.0.0/30'))
528
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000529
Nick Coghlan07c4e332012-07-08 23:06:45 +1000530class NetmaskTestMixin_v6(CommonTestMixin_v6):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000531 """Input validation on interfaces and networks is very similar"""
532
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000533 def test_split_netmask(self):
534 addr = "cafe:cafe::/128/190"
535 with self.assertAddressError("Only one '/' permitted in %r" % addr):
536 self.factory(addr)
537
538 def test_address_errors(self):
539 def assertBadAddress(addr, details):
540 with self.assertAddressError(details):
541 self.factory(addr)
542
Nick Coghlan297b1432012-07-08 17:11:04 +1000543 assertBadAddress("/", "Address cannot be empty")
544 assertBadAddress("/8", "Address cannot be empty")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000545 assertBadAddress("google.com", "At least 3 parts")
546 assertBadAddress("1.2.3.4", "At least 3 parts")
547 assertBadAddress("10/8", "At least 3 parts")
548 assertBadAddress("1234:axy::b", "Only hex digits")
549
Nick Coghlan932346f2014-02-08 23:17:36 +1000550 def test_valid_netmask(self):
551 # We only support CIDR for IPv6, because expanded netmasks are not
552 # standard notation.
553 self.assertEqual(str(self.factory('2001:db8::/32')), '2001:db8::/32')
554 for i in range(0, 129):
555 # Generate and re-parse the CIDR format (trivial).
556 net_str = '::/%d' % i
557 self.assertEqual(str(self.factory(net_str)), net_str)
558 # Zero prefix is treated as decimal.
559 self.assertEqual(str(self.factory('::/0%d' % i)), net_str)
560
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000561 def test_netmask_errors(self):
562 def assertBadNetmask(addr, netmask):
Nick Coghlan932346f2014-02-08 23:17:36 +1000563 msg = "%r is not a valid netmask" % netmask
564 with self.assertNetmaskError(re.escape(msg)):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000565 self.factory("%s/%s" % (addr, netmask))
566
567 assertBadNetmask("::1", "")
568 assertBadNetmask("::1", "::1")
569 assertBadNetmask("::1", "1::")
Nick Coghlan932346f2014-02-08 23:17:36 +1000570 assertBadNetmask("::1", "-1")
571 assertBadNetmask("::1", "+1")
572 assertBadNetmask("::1", " 1 ")
573 assertBadNetmask("::1", "0x1")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000574 assertBadNetmask("::1", "129")
Nick Coghlan932346f2014-02-08 23:17:36 +1000575 assertBadNetmask("::1", "1.2.3.4")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000576 assertBadNetmask("::1", "pudding")
Nick Coghlan932346f2014-02-08 23:17:36 +1000577 assertBadNetmask("::", "::")
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000578
Serhiy Storchaka5f38f5c2015-01-18 22:36:33 +0200579 def test_pickle(self):
580 self.pickle_test('2001:db8::1000/124')
581 self.pickle_test('2001:db8::1000/127') # IPV6LENGTH - 1
582 self.pickle_test('2001:db8::1000') # IPV6LENGTH
583
R David Murray75678652014-10-12 15:17:22 -0400584
Nick Coghlan07c4e332012-07-08 23:06:45 +1000585class InterfaceTestCase_v6(BaseTestCase, NetmaskTestMixin_v6):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000586 factory = ipaddress.IPv6Interface
587
R David Murray75678652014-10-12 15:17:22 -0400588
Nick Coghlan07c4e332012-07-08 23:06:45 +1000589class NetworkTestCase_v6(BaseTestCase, NetmaskTestMixin_v6):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000590 factory = ipaddress.IPv6Network
591
Cheryl Sabella91dc64b2017-10-22 17:39:49 -0400592 def test_subnet_of(self):
593 # containee left of container
594 self.assertFalse(
595 self.factory('2000:999::/56').subnet_of(
596 self.factory('2000:aaa::/48')))
597 # containee inside container
598 self.assertTrue(
599 self.factory('2000:aaa::/56').subnet_of(
600 self.factory('2000:aaa::/48')))
601 # containee right of container
602 self.assertFalse(
603 self.factory('2000:bbb::/56').subnet_of(
604 self.factory('2000:aaa::/48')))
605 # containee larger than container
606 self.assertFalse(
607 self.factory('2000:aaa::/48').subnet_of(
608 self.factory('2000:aaa::/56')))
609
610 def test_supernet_of(self):
611 # containee left of container
612 self.assertFalse(
613 self.factory('2000:999::/56').supernet_of(
614 self.factory('2000:aaa::/48')))
615 # containee inside container
616 self.assertFalse(
617 self.factory('2000:aaa::/56').supernet_of(
618 self.factory('2000:aaa::/48')))
619 # containee right of container
620 self.assertFalse(
621 self.factory('2000:bbb::/56').supernet_of(
622 self.factory('2000:aaa::/48')))
623 # containee larger than container
624 self.assertTrue(
625 self.factory('2000:aaa::/48').supernet_of(
626 self.factory('2000:aaa::/56')))
627
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000628
Nick Coghlan07c4e332012-07-08 23:06:45 +1000629class FactoryFunctionErrors(BaseTestCase):
Nick Coghlan36f8dcd2012-07-07 19:23:53 +1000630
631 def assertFactoryError(self, factory, kind):
632 """Ensure a clean ValueError with the expected message"""
633 addr = "camelot"
634 msg = '%r does not appear to be an IPv4 or IPv6 %s'
635 with self.assertCleanError(ValueError, msg, addr, kind):
636 factory(addr)
637
638 def test_ip_address(self):
639 self.assertFactoryError(ipaddress.ip_address, "address")
640
641 def test_ip_interface(self):
642 self.assertFactoryError(ipaddress.ip_interface, "interface")
643
644 def test_ip_network(self):
645 self.assertFactoryError(ipaddress.ip_network, "network")
646
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200647
Serhiy Storchakaf186e122015-01-26 10:11:16 +0200648@functools.total_ordering
649class LargestObject:
650 def __eq__(self, other):
651 return isinstance(other, LargestObject)
652 def __lt__(self, other):
653 return False
654
655@functools.total_ordering
656class SmallestObject:
657 def __eq__(self, other):
658 return isinstance(other, SmallestObject)
659 def __gt__(self, other):
660 return False
661
Nick Coghlan3008ec02012-07-08 00:45:33 +1000662class ComparisonTests(unittest.TestCase):
663
664 v4addr = ipaddress.IPv4Address(1)
665 v4net = ipaddress.IPv4Network(1)
666 v4intf = ipaddress.IPv4Interface(1)
667 v6addr = ipaddress.IPv6Address(1)
668 v6net = ipaddress.IPv6Network(1)
669 v6intf = ipaddress.IPv6Interface(1)
670
671 v4_addresses = [v4addr, v4intf]
672 v4_objects = v4_addresses + [v4net]
673 v6_addresses = [v6addr, v6intf]
674 v6_objects = v6_addresses + [v6net]
R David Murray947ff382016-06-02 15:46:04 -0400675
Nick Coghlan3008ec02012-07-08 00:45:33 +1000676 objects = v4_objects + v6_objects
677
R David Murray947ff382016-06-02 15:46:04 -0400678 v4addr2 = ipaddress.IPv4Address(2)
679 v4net2 = ipaddress.IPv4Network(2)
680 v4intf2 = ipaddress.IPv4Interface(2)
681 v6addr2 = ipaddress.IPv6Address(2)
682 v6net2 = ipaddress.IPv6Network(2)
683 v6intf2 = ipaddress.IPv6Interface(2)
684
Nick Coghlan3008ec02012-07-08 00:45:33 +1000685 def test_foreign_type_equality(self):
686 # __eq__ should never raise TypeError directly
687 other = object()
688 for obj in self.objects:
689 self.assertNotEqual(obj, other)
690 self.assertFalse(obj == other)
691 self.assertEqual(obj.__eq__(other), NotImplemented)
692 self.assertEqual(obj.__ne__(other), NotImplemented)
693
694 def test_mixed_type_equality(self):
695 # Ensure none of the internal objects accidentally
696 # expose the right set of attributes to become "equal"
697 for lhs in self.objects:
698 for rhs in self.objects:
699 if lhs is rhs:
700 continue
701 self.assertNotEqual(lhs, rhs)
702
R David Murray947ff382016-06-02 15:46:04 -0400703 def test_same_type_equality(self):
704 for obj in self.objects:
705 self.assertEqual(obj, obj)
706 self.assertLessEqual(obj, obj)
707 self.assertGreaterEqual(obj, obj)
708
709 def test_same_type_ordering(self):
710 for lhs, rhs in (
711 (self.v4addr, self.v4addr2),
712 (self.v4net, self.v4net2),
713 (self.v4intf, self.v4intf2),
714 (self.v6addr, self.v6addr2),
715 (self.v6net, self.v6net2),
716 (self.v6intf, self.v6intf2),
717 ):
718 self.assertNotEqual(lhs, rhs)
719 self.assertLess(lhs, rhs)
720 self.assertLessEqual(lhs, rhs)
721 self.assertGreater(rhs, lhs)
722 self.assertGreaterEqual(rhs, lhs)
723 self.assertFalse(lhs > rhs)
724 self.assertFalse(rhs < lhs)
725 self.assertFalse(lhs >= rhs)
726 self.assertFalse(rhs <= lhs)
727
Nick Coghlan3008ec02012-07-08 00:45:33 +1000728 def test_containment(self):
729 for obj in self.v4_addresses:
730 self.assertIn(obj, self.v4net)
731 for obj in self.v6_addresses:
732 self.assertIn(obj, self.v6net)
733 for obj in self.v4_objects + [self.v6net]:
734 self.assertNotIn(obj, self.v6net)
735 for obj in self.v6_objects + [self.v4net]:
736 self.assertNotIn(obj, self.v4net)
737
738 def test_mixed_type_ordering(self):
739 for lhs in self.objects:
740 for rhs in self.objects:
741 if isinstance(lhs, type(rhs)) or isinstance(rhs, type(lhs)):
742 continue
743 self.assertRaises(TypeError, lambda: lhs < rhs)
744 self.assertRaises(TypeError, lambda: lhs > rhs)
745 self.assertRaises(TypeError, lambda: lhs <= rhs)
746 self.assertRaises(TypeError, lambda: lhs >= rhs)
747
Serhiy Storchakaf186e122015-01-26 10:11:16 +0200748 def test_foreign_type_ordering(self):
749 other = object()
750 smallest = SmallestObject()
751 largest = LargestObject()
752 for obj in self.objects:
753 with self.assertRaises(TypeError):
754 obj < other
755 with self.assertRaises(TypeError):
756 obj > other
757 with self.assertRaises(TypeError):
758 obj <= other
759 with self.assertRaises(TypeError):
760 obj >= other
761 self.assertTrue(obj < largest)
762 self.assertFalse(obj > largest)
763 self.assertTrue(obj <= largest)
764 self.assertFalse(obj >= largest)
765 self.assertFalse(obj < smallest)
766 self.assertTrue(obj > smallest)
767 self.assertFalse(obj <= smallest)
768 self.assertTrue(obj >= smallest)
769
Nick Coghlan3008ec02012-07-08 00:45:33 +1000770 def test_mixed_type_key(self):
771 # with get_mixed_type_key, you can sort addresses and network.
772 v4_ordered = [self.v4addr, self.v4net, self.v4intf]
773 v6_ordered = [self.v6addr, self.v6net, self.v6intf]
774 self.assertEqual(v4_ordered,
775 sorted(self.v4_objects,
776 key=ipaddress.get_mixed_type_key))
777 self.assertEqual(v6_ordered,
778 sorted(self.v6_objects,
779 key=ipaddress.get_mixed_type_key))
780 self.assertEqual(v4_ordered + v6_ordered,
781 sorted(self.objects,
782 key=ipaddress.get_mixed_type_key))
783 self.assertEqual(NotImplemented, ipaddress.get_mixed_type_key(object))
784
785 def test_incompatible_versions(self):
786 # These should always raise TypeError
787 v4addr = ipaddress.ip_address('1.1.1.1')
788 v4net = ipaddress.ip_network('1.1.1.1')
789 v6addr = ipaddress.ip_address('::1')
Serhiy Storchakaf186e122015-01-26 10:11:16 +0200790 v6net = ipaddress.ip_network('::1')
Nick Coghlan3008ec02012-07-08 00:45:33 +1000791
792 self.assertRaises(TypeError, v4addr.__lt__, v6addr)
793 self.assertRaises(TypeError, v4addr.__gt__, v6addr)
794 self.assertRaises(TypeError, v4net.__lt__, v6net)
795 self.assertRaises(TypeError, v4net.__gt__, v6net)
796
797 self.assertRaises(TypeError, v6addr.__lt__, v4addr)
798 self.assertRaises(TypeError, v6addr.__gt__, v4addr)
799 self.assertRaises(TypeError, v6net.__lt__, v4net)
800 self.assertRaises(TypeError, v6net.__gt__, v4net)
801
802
Nick Coghlandc9b2552012-05-20 21:01:57 +1000803class IpaddrUnitTest(unittest.TestCase):
804
805 def setUp(self):
806 self.ipv4_address = ipaddress.IPv4Address('1.2.3.4')
807 self.ipv4_interface = ipaddress.IPv4Interface('1.2.3.4/24')
808 self.ipv4_network = ipaddress.IPv4Network('1.2.3.0/24')
809 #self.ipv4_hostmask = ipaddress.IPv4Interface('10.0.0.1/0.255.255.255')
810 self.ipv6_address = ipaddress.IPv6Interface(
811 '2001:658:22a:cafe:200:0:0:1')
812 self.ipv6_interface = ipaddress.IPv6Interface(
813 '2001:658:22a:cafe:200:0:0:1/64')
814 self.ipv6_network = ipaddress.IPv6Network('2001:658:22a:cafe::/64')
815
816 def testRepr(self):
817 self.assertEqual("IPv4Interface('1.2.3.4/32')",
818 repr(ipaddress.IPv4Interface('1.2.3.4')))
819 self.assertEqual("IPv6Interface('::1/128')",
820 repr(ipaddress.IPv6Interface('::1')))
821
Martin Panter204bf0b2016-07-11 07:51:37 +0000822 # issue #16531: constructing IPv4Network from an (address, mask) tuple
Antoine Pitrou5fb195f2014-05-12 20:36:46 +0200823 def testIPv4Tuple(self):
824 # /32
825 ip = ipaddress.IPv4Address('192.0.2.1')
826 net = ipaddress.IPv4Network('192.0.2.1/32')
827 self.assertEqual(ipaddress.IPv4Network(('192.0.2.1', 32)), net)
828 self.assertEqual(ipaddress.IPv4Network((ip, 32)), net)
829 self.assertEqual(ipaddress.IPv4Network((3221225985, 32)), net)
830 self.assertEqual(ipaddress.IPv4Network(('192.0.2.1',
831 '255.255.255.255')), net)
832 self.assertEqual(ipaddress.IPv4Network((ip,
833 '255.255.255.255')), net)
834 self.assertEqual(ipaddress.IPv4Network((3221225985,
835 '255.255.255.255')), net)
836 # strict=True and host bits set
837 with self.assertRaises(ValueError):
838 ipaddress.IPv4Network(('192.0.2.1', 24))
839 with self.assertRaises(ValueError):
840 ipaddress.IPv4Network((ip, 24))
841 with self.assertRaises(ValueError):
842 ipaddress.IPv4Network((3221225985, 24))
843 with self.assertRaises(ValueError):
844 ipaddress.IPv4Network(('192.0.2.1', '255.255.255.0'))
845 with self.assertRaises(ValueError):
846 ipaddress.IPv4Network((ip, '255.255.255.0'))
847 with self.assertRaises(ValueError):
848 ipaddress.IPv4Network((3221225985, '255.255.255.0'))
849 # strict=False and host bits set
850 net = ipaddress.IPv4Network('192.0.2.0/24')
851 self.assertEqual(ipaddress.IPv4Network(('192.0.2.1', 24),
852 strict=False), net)
853 self.assertEqual(ipaddress.IPv4Network((ip, 24),
854 strict=False), net)
855 self.assertEqual(ipaddress.IPv4Network((3221225985, 24),
856 strict=False), net)
857 self.assertEqual(ipaddress.IPv4Network(('192.0.2.1',
858 '255.255.255.0'),
859 strict=False), net)
860 self.assertEqual(ipaddress.IPv4Network((ip,
861 '255.255.255.0'),
862 strict=False), net)
863 self.assertEqual(ipaddress.IPv4Network((3221225985,
864 '255.255.255.0'),
865 strict=False), net)
866
867 # /24
868 ip = ipaddress.IPv4Address('192.0.2.0')
869 net = ipaddress.IPv4Network('192.0.2.0/24')
870 self.assertEqual(ipaddress.IPv4Network(('192.0.2.0',
871 '255.255.255.0')), net)
872 self.assertEqual(ipaddress.IPv4Network((ip,
873 '255.255.255.0')), net)
874 self.assertEqual(ipaddress.IPv4Network((3221225984,
875 '255.255.255.0')), net)
876 self.assertEqual(ipaddress.IPv4Network(('192.0.2.0', 24)), net)
877 self.assertEqual(ipaddress.IPv4Network((ip, 24)), net)
878 self.assertEqual(ipaddress.IPv4Network((3221225984, 24)), net)
879
880 self.assertEqual(ipaddress.IPv4Interface(('192.0.2.1', 24)),
881 ipaddress.IPv4Interface('192.0.2.1/24'))
882 self.assertEqual(ipaddress.IPv4Interface((3221225985, 24)),
883 ipaddress.IPv4Interface('192.0.2.1/24'))
884
Martin Panter204bf0b2016-07-11 07:51:37 +0000885 # issue #16531: constructing IPv6Network from an (address, mask) tuple
Antoine Pitrou5fb195f2014-05-12 20:36:46 +0200886 def testIPv6Tuple(self):
887 # /128
888 ip = ipaddress.IPv6Address('2001:db8::')
889 net = ipaddress.IPv6Network('2001:db8::/128')
890 self.assertEqual(ipaddress.IPv6Network(('2001:db8::', '128')),
891 net)
892 self.assertEqual(ipaddress.IPv6Network(
893 (42540766411282592856903984951653826560, 128)),
894 net)
895 self.assertEqual(ipaddress.IPv6Network((ip, '128')),
896 net)
897 ip = ipaddress.IPv6Address('2001:db8::')
898 net = ipaddress.IPv6Network('2001:db8::/96')
899 self.assertEqual(ipaddress.IPv6Network(('2001:db8::', '96')),
900 net)
901 self.assertEqual(ipaddress.IPv6Network(
902 (42540766411282592856903984951653826560, 96)),
903 net)
904 self.assertEqual(ipaddress.IPv6Network((ip, '96')),
905 net)
906
907 # strict=True and host bits set
908 ip = ipaddress.IPv6Address('2001:db8::1')
909 with self.assertRaises(ValueError):
910 ipaddress.IPv6Network(('2001:db8::1', 96))
911 with self.assertRaises(ValueError):
912 ipaddress.IPv6Network((
913 42540766411282592856903984951653826561, 96))
914 with self.assertRaises(ValueError):
915 ipaddress.IPv6Network((ip, 96))
916 # strict=False and host bits set
917 net = ipaddress.IPv6Network('2001:db8::/96')
918 self.assertEqual(ipaddress.IPv6Network(('2001:db8::1', 96),
919 strict=False),
920 net)
921 self.assertEqual(ipaddress.IPv6Network(
922 (42540766411282592856903984951653826561, 96),
923 strict=False),
924 net)
925 self.assertEqual(ipaddress.IPv6Network((ip, 96), strict=False),
926 net)
927
928 # /96
929 self.assertEqual(ipaddress.IPv6Interface(('2001:db8::1', '96')),
930 ipaddress.IPv6Interface('2001:db8::1/96'))
931 self.assertEqual(ipaddress.IPv6Interface(
932 (42540766411282592856903984951653826561, '96')),
933 ipaddress.IPv6Interface('2001:db8::1/96'))
934
Nick Coghlandc9b2552012-05-20 21:01:57 +1000935 # issue57
936 def testAddressIntMath(self):
937 self.assertEqual(ipaddress.IPv4Address('1.1.1.1') + 255,
938 ipaddress.IPv4Address('1.1.2.0'))
939 self.assertEqual(ipaddress.IPv4Address('1.1.1.1') - 256,
940 ipaddress.IPv4Address('1.1.0.1'))
941 self.assertEqual(ipaddress.IPv6Address('::1') + (2**16 - 2),
942 ipaddress.IPv6Address('::ffff'))
943 self.assertEqual(ipaddress.IPv6Address('::ffff') - (2**16 - 2),
944 ipaddress.IPv6Address('::1'))
945
Nick Coghlan3c2570c2012-07-07 01:13:55 +1000946 def testInvalidIntToBytes(self):
947 self.assertRaises(ValueError, ipaddress.v4_int_to_packed, -1)
948 self.assertRaises(ValueError, ipaddress.v4_int_to_packed,
949 2 ** ipaddress.IPV4LENGTH)
950 self.assertRaises(ValueError, ipaddress.v6_int_to_packed, -1)
951 self.assertRaises(ValueError, ipaddress.v6_int_to_packed,
952 2 ** ipaddress.IPV6LENGTH)
953
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200954 def testInternals(self):
Serhiy Storchakab53f0fb2015-01-19 00:41:32 +0200955 ip1 = ipaddress.IPv4Address('10.10.10.10')
956 ip2 = ipaddress.IPv4Address('10.10.10.11')
957 ip3 = ipaddress.IPv4Address('10.10.10.12')
958 self.assertEqual(list(ipaddress._find_address_range([ip1])),
959 [(ip1, ip1)])
960 self.assertEqual(list(ipaddress._find_address_range([ip1, ip3])),
961 [(ip1, ip1), (ip3, ip3)])
962 self.assertEqual(list(ipaddress._find_address_range([ip1, ip2, ip3])),
963 [(ip1, ip3)])
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200964 self.assertEqual(128, ipaddress._count_righthand_zero_bits(0, 128))
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200965 self.assertEqual("IPv4Network('1.2.3.0/24')", repr(self.ipv4_network))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000966
Nick Coghland9722652012-06-17 16:33:00 +1000967 def testMissingNetworkVersion(self):
968 class Broken(ipaddress._BaseNetwork):
969 pass
970 broken = Broken('127.0.0.1')
971 with self.assertRaisesRegex(NotImplementedError, "Broken.*version"):
972 broken.version
973
974 def testMissingAddressClass(self):
975 class Broken(ipaddress._BaseNetwork):
976 pass
977 broken = Broken('127.0.0.1')
978 with self.assertRaisesRegex(NotImplementedError, "Broken.*address"):
979 broken._address_class
980
Nick Coghlandc9b2552012-05-20 21:01:57 +1000981 def testGetNetwork(self):
982 self.assertEqual(int(self.ipv4_network.network_address), 16909056)
983 self.assertEqual(str(self.ipv4_network.network_address), '1.2.3.0')
984
985 self.assertEqual(int(self.ipv6_network.network_address),
986 42540616829182469433403647294022090752)
987 self.assertEqual(str(self.ipv6_network.network_address),
988 '2001:658:22a:cafe::')
989 self.assertEqual(str(self.ipv6_network.hostmask),
990 '::ffff:ffff:ffff:ffff')
991
Nick Coghlandc9b2552012-05-20 21:01:57 +1000992 def testIpFromInt(self):
993 self.assertEqual(self.ipv4_interface._ip,
994 ipaddress.IPv4Interface(16909060)._ip)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000995
996 ipv4 = ipaddress.ip_network('1.2.3.4')
997 ipv6 = ipaddress.ip_network('2001:658:22a:cafe:200:0:0:1')
Nick Coghlan730f67f2012-08-05 22:02:18 +1000998 self.assertEqual(ipv4, ipaddress.ip_network(int(ipv4.network_address)))
999 self.assertEqual(ipv6, ipaddress.ip_network(int(ipv6.network_address)))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001000
1001 v6_int = 42540616829182469433547762482097946625
1002 self.assertEqual(self.ipv6_interface._ip,
1003 ipaddress.IPv6Interface(v6_int)._ip)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001004
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001005 self.assertEqual(ipaddress.ip_network(self.ipv4_address._ip).version,
1006 4)
1007 self.assertEqual(ipaddress.ip_network(self.ipv6_address._ip).version,
1008 6)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001009
1010 def testIpFromPacked(self):
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001011 address = ipaddress.ip_address
Nick Coghlandc9b2552012-05-20 21:01:57 +10001012 self.assertEqual(self.ipv4_interface._ip,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001013 ipaddress.ip_interface(b'\x01\x02\x03\x04')._ip)
1014 self.assertEqual(address('255.254.253.252'),
1015 address(b'\xff\xfe\xfd\xfc'))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001016 self.assertEqual(self.ipv6_interface.ip,
1017 ipaddress.ip_interface(
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001018 b'\x20\x01\x06\x58\x02\x2a\xca\xfe'
1019 b'\x02\x00\x00\x00\x00\x00\x00\x01').ip)
1020 self.assertEqual(address('ffff:2:3:4:ffff::'),
1021 address(b'\xff\xff\x00\x02\x00\x03\x00\x04' +
1022 b'\xff\xff' + b'\x00' * 6))
1023 self.assertEqual(address('::'),
1024 address(b'\x00' * 16))
1025
Nick Coghlandc9b2552012-05-20 21:01:57 +10001026 def testGetIp(self):
1027 self.assertEqual(int(self.ipv4_interface.ip), 16909060)
1028 self.assertEqual(str(self.ipv4_interface.ip), '1.2.3.4')
1029
1030 self.assertEqual(int(self.ipv6_interface.ip),
1031 42540616829182469433547762482097946625)
1032 self.assertEqual(str(self.ipv6_interface.ip),
1033 '2001:658:22a:cafe:200::1')
1034
1035 def testGetNetmask(self):
1036 self.assertEqual(int(self.ipv4_network.netmask), 4294967040)
1037 self.assertEqual(str(self.ipv4_network.netmask), '255.255.255.0')
1038 self.assertEqual(int(self.ipv6_network.netmask),
1039 340282366920938463444927863358058659840)
1040 self.assertEqual(self.ipv6_network.prefixlen, 64)
1041
1042 def testZeroNetmask(self):
1043 ipv4_zero_netmask = ipaddress.IPv4Interface('1.2.3.4/0')
1044 self.assertEqual(int(ipv4_zero_netmask.network.netmask), 0)
Nick Coghlan932346f2014-02-08 23:17:36 +10001045 self.assertEqual(ipv4_zero_netmask._prefix_from_prefix_string('0'), 0)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001046 self.assertTrue(ipv4_zero_netmask._is_valid_netmask('0'))
1047 self.assertTrue(ipv4_zero_netmask._is_valid_netmask('0.0.0.0'))
1048 self.assertFalse(ipv4_zero_netmask._is_valid_netmask('invalid'))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001049
1050 ipv6_zero_netmask = ipaddress.IPv6Interface('::1/0')
1051 self.assertEqual(int(ipv6_zero_netmask.network.netmask), 0)
Nick Coghlan932346f2014-02-08 23:17:36 +10001052 self.assertEqual(ipv6_zero_netmask._prefix_from_prefix_string('0'), 0)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001053
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001054 def testIPv4NetAndHostmasks(self):
1055 net = self.ipv4_network
1056 self.assertFalse(net._is_valid_netmask('invalid'))
1057 self.assertTrue(net._is_valid_netmask('128.128.128.128'))
1058 self.assertFalse(net._is_valid_netmask('128.128.128.127'))
1059 self.assertFalse(net._is_valid_netmask('128.128.128.255'))
1060 self.assertTrue(net._is_valid_netmask('255.128.128.128'))
1061
1062 self.assertFalse(net._is_hostmask('invalid'))
1063 self.assertTrue(net._is_hostmask('128.255.255.255'))
1064 self.assertFalse(net._is_hostmask('255.255.255.255'))
1065 self.assertFalse(net._is_hostmask('1.2.3.4'))
1066
1067 net = ipaddress.IPv4Network('127.0.0.0/0.0.0.255')
Nick Coghlan932346f2014-02-08 23:17:36 +10001068 self.assertEqual(net.prefixlen, 24)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001069
Nick Coghlandc9b2552012-05-20 21:01:57 +10001070 def testGetBroadcast(self):
1071 self.assertEqual(int(self.ipv4_network.broadcast_address), 16909311)
1072 self.assertEqual(str(self.ipv4_network.broadcast_address), '1.2.3.255')
1073
1074 self.assertEqual(int(self.ipv6_network.broadcast_address),
1075 42540616829182469451850391367731642367)
1076 self.assertEqual(str(self.ipv6_network.broadcast_address),
1077 '2001:658:22a:cafe:ffff:ffff:ffff:ffff')
1078
1079 def testGetPrefixlen(self):
Nick Coghlane3ded952012-08-05 22:45:22 +10001080 self.assertEqual(self.ipv4_interface.network.prefixlen, 24)
1081 self.assertEqual(self.ipv6_interface.network.prefixlen, 64)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001082
1083 def testGetSupernet(self):
1084 self.assertEqual(self.ipv4_network.supernet().prefixlen, 23)
1085 self.assertEqual(str(self.ipv4_network.supernet().network_address),
1086 '1.2.2.0')
1087 self.assertEqual(
1088 ipaddress.IPv4Interface('0.0.0.0/0').network.supernet(),
1089 ipaddress.IPv4Network('0.0.0.0/0'))
1090
1091 self.assertEqual(self.ipv6_network.supernet().prefixlen, 63)
1092 self.assertEqual(str(self.ipv6_network.supernet().network_address),
1093 '2001:658:22a:cafe::')
1094 self.assertEqual(ipaddress.IPv6Interface('::0/0').network.supernet(),
1095 ipaddress.IPv6Network('::0/0'))
1096
1097 def testGetSupernet3(self):
1098 self.assertEqual(self.ipv4_network.supernet(3).prefixlen, 21)
1099 self.assertEqual(str(self.ipv4_network.supernet(3).network_address),
1100 '1.2.0.0')
1101
1102 self.assertEqual(self.ipv6_network.supernet(3).prefixlen, 61)
1103 self.assertEqual(str(self.ipv6_network.supernet(3).network_address),
1104 '2001:658:22a:caf8::')
1105
1106 def testGetSupernet4(self):
1107 self.assertRaises(ValueError, self.ipv4_network.supernet,
1108 prefixlen_diff=2, new_prefix=1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001109 self.assertRaises(ValueError, self.ipv4_network.supernet,
1110 new_prefix=25)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001111 self.assertEqual(self.ipv4_network.supernet(prefixlen_diff=2),
1112 self.ipv4_network.supernet(new_prefix=22))
1113
1114 self.assertRaises(ValueError, self.ipv6_network.supernet,
1115 prefixlen_diff=2, new_prefix=1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001116 self.assertRaises(ValueError, self.ipv6_network.supernet,
1117 new_prefix=65)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001118 self.assertEqual(self.ipv6_network.supernet(prefixlen_diff=2),
1119 self.ipv6_network.supernet(new_prefix=62))
1120
1121 def testHosts(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001122 hosts = list(self.ipv4_network.hosts())
1123 self.assertEqual(254, len(hosts))
1124 self.assertEqual(ipaddress.IPv4Address('1.2.3.1'), hosts[0])
1125 self.assertEqual(ipaddress.IPv4Address('1.2.3.254'), hosts[-1])
1126
1127 # special case where only 1 bit is left for address
Nick Coghlandc9b2552012-05-20 21:01:57 +10001128 self.assertEqual([ipaddress.IPv4Address('2.0.0.0'),
1129 ipaddress.IPv4Address('2.0.0.1')],
1130 list(ipaddress.ip_network('2.0.0.0/31').hosts()))
1131
1132 def testFancySubnetting(self):
1133 self.assertEqual(sorted(self.ipv4_network.subnets(prefixlen_diff=3)),
1134 sorted(self.ipv4_network.subnets(new_prefix=27)))
1135 self.assertRaises(ValueError, list,
1136 self.ipv4_network.subnets(new_prefix=23))
1137 self.assertRaises(ValueError, list,
1138 self.ipv4_network.subnets(prefixlen_diff=3,
1139 new_prefix=27))
1140 self.assertEqual(sorted(self.ipv6_network.subnets(prefixlen_diff=4)),
1141 sorted(self.ipv6_network.subnets(new_prefix=68)))
1142 self.assertRaises(ValueError, list,
1143 self.ipv6_network.subnets(new_prefix=63))
1144 self.assertRaises(ValueError, list,
1145 self.ipv6_network.subnets(prefixlen_diff=4,
1146 new_prefix=68))
1147
1148 def testGetSubnets(self):
1149 self.assertEqual(list(self.ipv4_network.subnets())[0].prefixlen, 25)
1150 self.assertEqual(str(list(
1151 self.ipv4_network.subnets())[0].network_address),
1152 '1.2.3.0')
1153 self.assertEqual(str(list(
1154 self.ipv4_network.subnets())[1].network_address),
1155 '1.2.3.128')
1156
1157 self.assertEqual(list(self.ipv6_network.subnets())[0].prefixlen, 65)
1158
1159 def testGetSubnetForSingle32(self):
1160 ip = ipaddress.IPv4Network('1.2.3.4/32')
1161 subnets1 = [str(x) for x in ip.subnets()]
1162 subnets2 = [str(x) for x in ip.subnets(2)]
1163 self.assertEqual(subnets1, ['1.2.3.4/32'])
1164 self.assertEqual(subnets1, subnets2)
1165
1166 def testGetSubnetForSingle128(self):
1167 ip = ipaddress.IPv6Network('::1/128')
1168 subnets1 = [str(x) for x in ip.subnets()]
1169 subnets2 = [str(x) for x in ip.subnets(2)]
1170 self.assertEqual(subnets1, ['::1/128'])
1171 self.assertEqual(subnets1, subnets2)
1172
1173 def testSubnet2(self):
1174 ips = [str(x) for x in self.ipv4_network.subnets(2)]
1175 self.assertEqual(
1176 ips,
1177 ['1.2.3.0/26', '1.2.3.64/26', '1.2.3.128/26', '1.2.3.192/26'])
1178
1179 ipsv6 = [str(x) for x in self.ipv6_network.subnets(2)]
1180 self.assertEqual(
1181 ipsv6,
1182 ['2001:658:22a:cafe::/66',
1183 '2001:658:22a:cafe:4000::/66',
1184 '2001:658:22a:cafe:8000::/66',
1185 '2001:658:22a:cafe:c000::/66'])
1186
Serhiy Storchakabb0dbd52016-03-01 10:25:45 +02001187 def testGetSubnets3(self):
1188 subnets = [str(x) for x in self.ipv4_network.subnets(8)]
1189 self.assertEqual(subnets[:3],
1190 ['1.2.3.0/32', '1.2.3.1/32', '1.2.3.2/32'])
1191 self.assertEqual(subnets[-3:],
1192 ['1.2.3.253/32', '1.2.3.254/32', '1.2.3.255/32'])
1193 self.assertEqual(len(subnets), 256)
1194
1195 ipv6_network = ipaddress.IPv6Network('2001:658:22a:cafe::/120')
1196 subnets = [str(x) for x in ipv6_network.subnets(8)]
1197 self.assertEqual(subnets[:3],
1198 ['2001:658:22a:cafe::/128',
1199 '2001:658:22a:cafe::1/128',
1200 '2001:658:22a:cafe::2/128'])
1201 self.assertEqual(subnets[-3:],
1202 ['2001:658:22a:cafe::fd/128',
1203 '2001:658:22a:cafe::fe/128',
1204 '2001:658:22a:cafe::ff/128'])
1205 self.assertEqual(len(subnets), 256)
1206
Nick Coghlandc9b2552012-05-20 21:01:57 +10001207 def testSubnetFailsForLargeCidrDiff(self):
1208 self.assertRaises(ValueError, list,
1209 self.ipv4_interface.network.subnets(9))
1210 self.assertRaises(ValueError, list,
1211 self.ipv4_network.subnets(9))
1212 self.assertRaises(ValueError, list,
1213 self.ipv6_interface.network.subnets(65))
1214 self.assertRaises(ValueError, list,
1215 self.ipv6_network.subnets(65))
1216
1217 def testSupernetFailsForLargeCidrDiff(self):
1218 self.assertRaises(ValueError,
1219 self.ipv4_interface.network.supernet, 25)
1220 self.assertRaises(ValueError,
1221 self.ipv6_interface.network.supernet, 65)
1222
1223 def testSubnetFailsForNegativeCidrDiff(self):
1224 self.assertRaises(ValueError, list,
1225 self.ipv4_interface.network.subnets(-1))
1226 self.assertRaises(ValueError, list,
Nick Coghlan2c589102012-05-27 01:03:25 +10001227 self.ipv4_network.subnets(-1))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001228 self.assertRaises(ValueError, list,
1229 self.ipv6_interface.network.subnets(-1))
1230 self.assertRaises(ValueError, list,
1231 self.ipv6_network.subnets(-1))
1232
1233 def testGetNum_Addresses(self):
1234 self.assertEqual(self.ipv4_network.num_addresses, 256)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001235 self.assertEqual(list(self.ipv4_network.subnets())[0].num_addresses,
1236 128)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001237 self.assertEqual(self.ipv4_network.supernet().num_addresses, 512)
1238
1239 self.assertEqual(self.ipv6_network.num_addresses, 18446744073709551616)
1240 self.assertEqual(list(self.ipv6_network.subnets())[0].num_addresses,
1241 9223372036854775808)
1242 self.assertEqual(self.ipv6_network.supernet().num_addresses,
1243 36893488147419103232)
1244
1245 def testContains(self):
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001246 self.assertIn(ipaddress.IPv4Interface('1.2.3.128/25'),
1247 self.ipv4_network)
1248 self.assertNotIn(ipaddress.IPv4Interface('1.2.4.1/24'),
Nick Coghlandc9b2552012-05-20 21:01:57 +10001249 self.ipv4_network)
1250 # We can test addresses and string as well.
1251 addr1 = ipaddress.IPv4Address('1.2.3.37')
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001252 self.assertIn(addr1, self.ipv4_network)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001253 # issue 61, bad network comparison on like-ip'd network objects
1254 # with identical broadcast addresses.
1255 self.assertFalse(ipaddress.IPv4Network('1.1.0.0/16').__contains__(
1256 ipaddress.IPv4Network('1.0.0.0/15')))
1257
Nick Coghlandc9b2552012-05-20 21:01:57 +10001258 def testNth(self):
1259 self.assertEqual(str(self.ipv4_network[5]), '1.2.3.5')
1260 self.assertRaises(IndexError, self.ipv4_network.__getitem__, 256)
1261
1262 self.assertEqual(str(self.ipv6_network[5]),
1263 '2001:658:22a:cafe::5')
Berker Peksag28dc1182016-06-11 22:30:05 +03001264 self.assertRaises(IndexError, self.ipv6_network.__getitem__, 1 << 64)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001265
1266 def testGetitem(self):
1267 # http://code.google.com/p/ipaddr-py/issues/detail?id=15
1268 addr = ipaddress.IPv4Network('172.31.255.128/255.255.255.240')
1269 self.assertEqual(28, addr.prefixlen)
1270 addr_list = list(addr)
1271 self.assertEqual('172.31.255.128', str(addr_list[0]))
1272 self.assertEqual('172.31.255.128', str(addr[0]))
1273 self.assertEqual('172.31.255.143', str(addr_list[-1]))
1274 self.assertEqual('172.31.255.143', str(addr[-1]))
1275 self.assertEqual(addr_list[-1], addr[-1])
1276
1277 def testEqual(self):
1278 self.assertTrue(self.ipv4_interface ==
1279 ipaddress.IPv4Interface('1.2.3.4/24'))
1280 self.assertFalse(self.ipv4_interface ==
1281 ipaddress.IPv4Interface('1.2.3.4/23'))
1282 self.assertFalse(self.ipv4_interface ==
1283 ipaddress.IPv6Interface('::1.2.3.4/24'))
1284 self.assertFalse(self.ipv4_interface == '')
1285 self.assertFalse(self.ipv4_interface == [])
1286 self.assertFalse(self.ipv4_interface == 2)
1287
1288 self.assertTrue(self.ipv6_interface ==
1289 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/64'))
1290 self.assertFalse(self.ipv6_interface ==
1291 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/63'))
1292 self.assertFalse(self.ipv6_interface ==
1293 ipaddress.IPv4Interface('1.2.3.4/23'))
1294 self.assertFalse(self.ipv6_interface == '')
1295 self.assertFalse(self.ipv6_interface == [])
1296 self.assertFalse(self.ipv6_interface == 2)
1297
1298 def testNotEqual(self):
1299 self.assertFalse(self.ipv4_interface !=
1300 ipaddress.IPv4Interface('1.2.3.4/24'))
1301 self.assertTrue(self.ipv4_interface !=
1302 ipaddress.IPv4Interface('1.2.3.4/23'))
1303 self.assertTrue(self.ipv4_interface !=
1304 ipaddress.IPv6Interface('::1.2.3.4/24'))
1305 self.assertTrue(self.ipv4_interface != '')
1306 self.assertTrue(self.ipv4_interface != [])
1307 self.assertTrue(self.ipv4_interface != 2)
1308
1309 self.assertTrue(self.ipv4_address !=
1310 ipaddress.IPv4Address('1.2.3.5'))
1311 self.assertTrue(self.ipv4_address != '')
1312 self.assertTrue(self.ipv4_address != [])
1313 self.assertTrue(self.ipv4_address != 2)
1314
1315 self.assertFalse(self.ipv6_interface !=
1316 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/64'))
1317 self.assertTrue(self.ipv6_interface !=
1318 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/63'))
1319 self.assertTrue(self.ipv6_interface !=
1320 ipaddress.IPv4Interface('1.2.3.4/23'))
1321 self.assertTrue(self.ipv6_interface != '')
1322 self.assertTrue(self.ipv6_interface != [])
1323 self.assertTrue(self.ipv6_interface != 2)
1324
1325 self.assertTrue(self.ipv6_address !=
1326 ipaddress.IPv4Address('1.2.3.4'))
1327 self.assertTrue(self.ipv6_address != '')
1328 self.assertTrue(self.ipv6_address != [])
1329 self.assertTrue(self.ipv6_address != 2)
1330
1331 def testSlash32Constructor(self):
1332 self.assertEqual(str(ipaddress.IPv4Interface(
1333 '1.2.3.4/255.255.255.255')), '1.2.3.4/32')
1334
1335 def testSlash128Constructor(self):
1336 self.assertEqual(str(ipaddress.IPv6Interface('::1/128')),
1337 '::1/128')
1338
1339 def testSlash0Constructor(self):
1340 self.assertEqual(str(ipaddress.IPv4Interface('1.2.3.4/0.0.0.0')),
1341 '1.2.3.4/0')
1342
1343 def testCollapsing(self):
1344 # test only IP addresses including some duplicates
1345 ip1 = ipaddress.IPv4Address('1.1.1.0')
1346 ip2 = ipaddress.IPv4Address('1.1.1.1')
1347 ip3 = ipaddress.IPv4Address('1.1.1.2')
1348 ip4 = ipaddress.IPv4Address('1.1.1.3')
1349 ip5 = ipaddress.IPv4Address('1.1.1.4')
1350 ip6 = ipaddress.IPv4Address('1.1.1.0')
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07001351 # check that addresses are subsumed properly.
Nick Coghlandc9b2552012-05-20 21:01:57 +10001352 collapsed = ipaddress.collapse_addresses(
1353 [ip1, ip2, ip3, ip4, ip5, ip6])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001354 self.assertEqual(list(collapsed),
1355 [ipaddress.IPv4Network('1.1.1.0/30'),
1356 ipaddress.IPv4Network('1.1.1.4/32')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001357
1358 # test a mix of IP addresses and networks including some duplicates
1359 ip1 = ipaddress.IPv4Address('1.1.1.0')
1360 ip2 = ipaddress.IPv4Address('1.1.1.1')
1361 ip3 = ipaddress.IPv4Address('1.1.1.2')
1362 ip4 = ipaddress.IPv4Address('1.1.1.3')
1363 #ip5 = ipaddress.IPv4Interface('1.1.1.4/30')
1364 #ip6 = ipaddress.IPv4Interface('1.1.1.4/30')
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07001365 # check that addresses are subsumed properly.
Nick Coghlandc9b2552012-05-20 21:01:57 +10001366 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3, ip4])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001367 self.assertEqual(list(collapsed),
1368 [ipaddress.IPv4Network('1.1.1.0/30')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001369
1370 # test only IP networks
1371 ip1 = ipaddress.IPv4Network('1.1.0.0/24')
1372 ip2 = ipaddress.IPv4Network('1.1.1.0/24')
1373 ip3 = ipaddress.IPv4Network('1.1.2.0/24')
1374 ip4 = ipaddress.IPv4Network('1.1.3.0/24')
1375 ip5 = ipaddress.IPv4Network('1.1.4.0/24')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001376 # stored in no particular order b/c we want CollapseAddr to call
1377 # [].sort
Nick Coghlandc9b2552012-05-20 21:01:57 +10001378 ip6 = ipaddress.IPv4Network('1.1.0.0/22')
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07001379 # check that addresses are subsumed properly.
Nick Coghlandc9b2552012-05-20 21:01:57 +10001380 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3, ip4, ip5,
1381 ip6])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001382 self.assertEqual(list(collapsed),
1383 [ipaddress.IPv4Network('1.1.0.0/22'),
1384 ipaddress.IPv4Network('1.1.4.0/24')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001385
1386 # test that two addresses are supernet'ed properly
1387 collapsed = ipaddress.collapse_addresses([ip1, ip2])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001388 self.assertEqual(list(collapsed),
1389 [ipaddress.IPv4Network('1.1.0.0/23')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001390
1391 # test same IP networks
1392 ip_same1 = ip_same2 = ipaddress.IPv4Network('1.1.1.1/32')
1393 self.assertEqual(list(ipaddress.collapse_addresses(
1394 [ip_same1, ip_same2])),
1395 [ip_same1])
1396
1397 # test same IP addresses
1398 ip_same1 = ip_same2 = ipaddress.IPv4Address('1.1.1.1')
1399 self.assertEqual(list(ipaddress.collapse_addresses(
1400 [ip_same1, ip_same2])),
1401 [ipaddress.ip_network('1.1.1.1/32')])
1402 ip1 = ipaddress.IPv6Network('2001::/100')
1403 ip2 = ipaddress.IPv6Network('2001::/120')
1404 ip3 = ipaddress.IPv6Network('2001::/96')
1405 # test that ipv6 addresses are subsumed properly.
1406 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3])
1407 self.assertEqual(list(collapsed), [ip3])
1408
1409 # the toejam test
Hynek Schlawack35db5132012-06-01 20:12:17 +02001410 addr_tuples = [
1411 (ipaddress.ip_address('1.1.1.1'),
1412 ipaddress.ip_address('::1')),
1413 (ipaddress.IPv4Network('1.1.0.0/24'),
1414 ipaddress.IPv6Network('2001::/120')),
1415 (ipaddress.IPv4Network('1.1.0.0/32'),
1416 ipaddress.IPv6Network('2001::/128')),
1417 ]
1418 for ip1, ip2 in addr_tuples:
1419 self.assertRaises(TypeError, ipaddress.collapse_addresses,
1420 [ip1, ip2])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001421
1422 def testSummarizing(self):
1423 #ip = ipaddress.ip_address
1424 #ipnet = ipaddress.ip_network
1425 summarize = ipaddress.summarize_address_range
1426 ip1 = ipaddress.ip_address('1.1.1.0')
1427 ip2 = ipaddress.ip_address('1.1.1.255')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001428
1429 # summarize works only for IPv4 & IPv6
1430 class IPv7Address(ipaddress.IPv6Address):
1431 @property
1432 def version(self):
1433 return 7
1434 ip_invalid1 = IPv7Address('::1')
1435 ip_invalid2 = IPv7Address('::1')
1436 self.assertRaises(ValueError, list,
1437 summarize(ip_invalid1, ip_invalid2))
1438 # test that a summary over ip4 & ip6 fails
1439 self.assertRaises(TypeError, list,
1440 summarize(ip1, ipaddress.IPv6Address('::1')))
1441 # test a /24 is summarized properly
Nick Coghlandc9b2552012-05-20 21:01:57 +10001442 self.assertEqual(list(summarize(ip1, ip2))[0],
1443 ipaddress.ip_network('1.1.1.0/24'))
Martin Panter7462b6492015-11-02 03:37:02 +00001444 # test an IPv4 range that isn't on a network byte boundary
Nick Coghlandc9b2552012-05-20 21:01:57 +10001445 ip2 = ipaddress.ip_address('1.1.1.8')
1446 self.assertEqual(list(summarize(ip1, ip2)),
1447 [ipaddress.ip_network('1.1.1.0/29'),
1448 ipaddress.ip_network('1.1.1.8')])
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001449 # all!
1450 ip1 = ipaddress.IPv4Address(0)
1451 ip2 = ipaddress.IPv4Address(ipaddress.IPv4Address._ALL_ONES)
1452 self.assertEqual([ipaddress.IPv4Network('0.0.0.0/0')],
1453 list(summarize(ip1, ip2)))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001454
1455 ip1 = ipaddress.ip_address('1::')
1456 ip2 = ipaddress.ip_address('1:ffff:ffff:ffff:ffff:ffff:ffff:ffff')
Martin Panter7462b6492015-11-02 03:37:02 +00001457 # test an IPv6 is summarized properly
Nick Coghlandc9b2552012-05-20 21:01:57 +10001458 self.assertEqual(list(summarize(ip1, ip2))[0],
1459 ipaddress.ip_network('1::/16'))
1460 # test an IPv6 range that isn't on a network byte boundary
1461 ip2 = ipaddress.ip_address('2::')
1462 self.assertEqual(list(summarize(ip1, ip2)),
1463 [ipaddress.ip_network('1::/16'),
1464 ipaddress.ip_network('2::/128')])
1465
1466 # test exception raised when first is greater than last
1467 self.assertRaises(ValueError, list,
1468 summarize(ipaddress.ip_address('1.1.1.0'),
1469 ipaddress.ip_address('1.1.0.0')))
1470 # test exception raised when first and last aren't IP addresses
1471 self.assertRaises(TypeError, list,
1472 summarize(ipaddress.ip_network('1.1.1.0'),
1473 ipaddress.ip_network('1.1.0.0')))
1474 self.assertRaises(TypeError, list,
1475 summarize(ipaddress.ip_network('1.1.1.0'),
1476 ipaddress.ip_network('1.1.0.0')))
1477 # test exception raised when first and last are not same version
1478 self.assertRaises(TypeError, list,
1479 summarize(ipaddress.ip_address('::'),
1480 ipaddress.ip_network('1.1.0.0')))
1481
1482 def testAddressComparison(self):
1483 self.assertTrue(ipaddress.ip_address('1.1.1.1') <=
1484 ipaddress.ip_address('1.1.1.1'))
1485 self.assertTrue(ipaddress.ip_address('1.1.1.1') <=
1486 ipaddress.ip_address('1.1.1.2'))
1487 self.assertTrue(ipaddress.ip_address('::1') <=
1488 ipaddress.ip_address('::1'))
1489 self.assertTrue(ipaddress.ip_address('::1') <=
1490 ipaddress.ip_address('::2'))
1491
Nick Coghlan3008ec02012-07-08 00:45:33 +10001492 def testInterfaceComparison(self):
s-sanjay7bd8d3e2017-03-31 23:09:53 -07001493 self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') ==
1494 ipaddress.ip_interface('1.1.1.1/24'))
1495 self.assertTrue(ipaddress.ip_interface('1.1.1.1/16') <
1496 ipaddress.ip_interface('1.1.1.1/24'))
1497 self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') <
1498 ipaddress.ip_interface('1.1.1.2/24'))
1499 self.assertTrue(ipaddress.ip_interface('1.1.1.2/16') <
1500 ipaddress.ip_interface('1.1.1.1/24'))
1501 self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') >
1502 ipaddress.ip_interface('1.1.1.1/16'))
1503 self.assertTrue(ipaddress.ip_interface('1.1.1.2/24') >
1504 ipaddress.ip_interface('1.1.1.1/24'))
1505 self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') >
1506 ipaddress.ip_interface('1.1.1.2/16'))
1507
1508 self.assertTrue(ipaddress.ip_interface('::1/64') ==
1509 ipaddress.ip_interface('::1/64'))
1510 self.assertTrue(ipaddress.ip_interface('::1/64') <
1511 ipaddress.ip_interface('::1/80'))
1512 self.assertTrue(ipaddress.ip_interface('::1/64') <
1513 ipaddress.ip_interface('::2/64'))
1514 self.assertTrue(ipaddress.ip_interface('::2/48') <
1515 ipaddress.ip_interface('::1/64'))
1516 self.assertTrue(ipaddress.ip_interface('::1/80') >
1517 ipaddress.ip_interface('::1/64'))
1518 self.assertTrue(ipaddress.ip_interface('::2/64') >
1519 ipaddress.ip_interface('::1/64'))
1520 self.assertTrue(ipaddress.ip_interface('::1/64') >
1521 ipaddress.ip_interface('::2/48'))
Nick Coghlan3008ec02012-07-08 00:45:33 +10001522
Nick Coghlandc9b2552012-05-20 21:01:57 +10001523 def testNetworkComparison(self):
1524 # ip1 and ip2 have the same network address
1525 ip1 = ipaddress.IPv4Network('1.1.1.0/24')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001526 ip2 = ipaddress.IPv4Network('1.1.1.0/32')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001527 ip3 = ipaddress.IPv4Network('1.1.2.0/24')
1528
1529 self.assertTrue(ip1 < ip3)
1530 self.assertTrue(ip3 > ip2)
1531
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001532 self.assertEqual(ip1.compare_networks(ip1), 0)
1533
1534 # if addresses are the same, sort by netmask
1535 self.assertEqual(ip1.compare_networks(ip2), -1)
1536 self.assertEqual(ip2.compare_networks(ip1), 1)
1537
Nick Coghlandc9b2552012-05-20 21:01:57 +10001538 self.assertEqual(ip1.compare_networks(ip3), -1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001539 self.assertEqual(ip3.compare_networks(ip1), 1)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001540 self.assertTrue(ip1._get_networks_key() < ip3._get_networks_key())
1541
1542 ip1 = ipaddress.IPv6Network('2001:2000::/96')
1543 ip2 = ipaddress.IPv6Network('2001:2001::/96')
1544 ip3 = ipaddress.IPv6Network('2001:ffff:2000::/96')
1545
1546 self.assertTrue(ip1 < ip3)
1547 self.assertTrue(ip3 > ip2)
1548 self.assertEqual(ip1.compare_networks(ip3), -1)
1549 self.assertTrue(ip1._get_networks_key() < ip3._get_networks_key())
1550
1551 # Test comparing different protocols.
1552 # Should always raise a TypeError.
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001553 self.assertRaises(TypeError,
1554 self.ipv4_network.compare_networks,
1555 self.ipv6_network)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001556 ipv6 = ipaddress.IPv6Interface('::/0')
1557 ipv4 = ipaddress.IPv4Interface('0.0.0.0/0')
1558 self.assertRaises(TypeError, ipv4.__lt__, ipv6)
1559 self.assertRaises(TypeError, ipv4.__gt__, ipv6)
1560 self.assertRaises(TypeError, ipv6.__lt__, ipv4)
1561 self.assertRaises(TypeError, ipv6.__gt__, ipv4)
1562
1563 # Regression test for issue 19.
1564 ip1 = ipaddress.ip_network('10.1.2.128/25')
1565 self.assertFalse(ip1 < ip1)
1566 self.assertFalse(ip1 > ip1)
1567 ip2 = ipaddress.ip_network('10.1.3.0/24')
1568 self.assertTrue(ip1 < ip2)
1569 self.assertFalse(ip2 < ip1)
1570 self.assertFalse(ip1 > ip2)
1571 self.assertTrue(ip2 > ip1)
1572 ip3 = ipaddress.ip_network('10.1.3.0/25')
1573 self.assertTrue(ip2 < ip3)
1574 self.assertFalse(ip3 < ip2)
1575 self.assertFalse(ip2 > ip3)
1576 self.assertTrue(ip3 > ip2)
1577
1578 # Regression test for issue 28.
1579 ip1 = ipaddress.ip_network('10.10.10.0/31')
1580 ip2 = ipaddress.ip_network('10.10.10.0')
1581 ip3 = ipaddress.ip_network('10.10.10.2/31')
1582 ip4 = ipaddress.ip_network('10.10.10.2')
1583 sorted = [ip1, ip2, ip3, ip4]
1584 unsorted = [ip2, ip4, ip1, ip3]
1585 unsorted.sort()
1586 self.assertEqual(sorted, unsorted)
1587 unsorted = [ip4, ip1, ip3, ip2]
1588 unsorted.sort()
1589 self.assertEqual(sorted, unsorted)
Serhiy Storchakaf186e122015-01-26 10:11:16 +02001590 self.assertIs(ip1.__lt__(ipaddress.ip_address('10.10.10.0')),
1591 NotImplemented)
1592 self.assertIs(ip2.__lt__(ipaddress.ip_address('10.10.10.0')),
1593 NotImplemented)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001594
1595 # <=, >=
1596 self.assertTrue(ipaddress.ip_network('1.1.1.1') <=
1597 ipaddress.ip_network('1.1.1.1'))
1598 self.assertTrue(ipaddress.ip_network('1.1.1.1') <=
1599 ipaddress.ip_network('1.1.1.2'))
1600 self.assertFalse(ipaddress.ip_network('1.1.1.2') <=
1601 ipaddress.ip_network('1.1.1.1'))
1602 self.assertTrue(ipaddress.ip_network('::1') <=
1603 ipaddress.ip_network('::1'))
1604 self.assertTrue(ipaddress.ip_network('::1') <=
1605 ipaddress.ip_network('::2'))
1606 self.assertFalse(ipaddress.ip_network('::2') <=
1607 ipaddress.ip_network('::1'))
1608
1609 def testStrictNetworks(self):
1610 self.assertRaises(ValueError, ipaddress.ip_network, '192.168.1.1/24')
1611 self.assertRaises(ValueError, ipaddress.ip_network, '::1/120')
1612
1613 def testOverlaps(self):
1614 other = ipaddress.IPv4Network('1.2.3.0/30')
1615 other2 = ipaddress.IPv4Network('1.2.2.0/24')
1616 other3 = ipaddress.IPv4Network('1.2.2.64/26')
1617 self.assertTrue(self.ipv4_network.overlaps(other))
1618 self.assertFalse(self.ipv4_network.overlaps(other2))
1619 self.assertTrue(other2.overlaps(other3))
1620
1621 def testEmbeddedIpv4(self):
1622 ipv4_string = '192.168.0.1'
1623 ipv4 = ipaddress.IPv4Interface(ipv4_string)
1624 v4compat_ipv6 = ipaddress.IPv6Interface('::%s' % ipv4_string)
1625 self.assertEqual(int(v4compat_ipv6.ip), int(ipv4.ip))
1626 v4mapped_ipv6 = ipaddress.IPv6Interface('::ffff:%s' % ipv4_string)
1627 self.assertNotEqual(v4mapped_ipv6.ip, ipv4.ip)
1628 self.assertRaises(ipaddress.AddressValueError, ipaddress.IPv6Interface,
1629 '2001:1.1.1.1:1.1.1.1')
1630
1631 # Issue 67: IPv6 with embedded IPv4 address not recognized.
1632 def testIPv6AddressTooLarge(self):
1633 # RFC4291 2.5.5.2
1634 self.assertEqual(ipaddress.ip_address('::FFFF:192.0.2.1'),
1635 ipaddress.ip_address('::FFFF:c000:201'))
1636 # RFC4291 2.2 (part 3) x::d.d.d.d
1637 self.assertEqual(ipaddress.ip_address('FFFF::192.0.2.1'),
1638 ipaddress.ip_address('FFFF::c000:201'))
1639
1640 def testIPVersion(self):
1641 self.assertEqual(self.ipv4_address.version, 4)
1642 self.assertEqual(self.ipv6_address.version, 6)
1643
1644 def testMaxPrefixLength(self):
1645 self.assertEqual(self.ipv4_interface.max_prefixlen, 32)
1646 self.assertEqual(self.ipv6_interface.max_prefixlen, 128)
1647
1648 def testPacked(self):
1649 self.assertEqual(self.ipv4_address.packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001650 b'\x01\x02\x03\x04')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001651 self.assertEqual(ipaddress.IPv4Interface('255.254.253.252').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001652 b'\xff\xfe\xfd\xfc')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001653 self.assertEqual(self.ipv6_address.packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001654 b'\x20\x01\x06\x58\x02\x2a\xca\xfe'
1655 b'\x02\x00\x00\x00\x00\x00\x00\x01')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001656 self.assertEqual(ipaddress.IPv6Interface('ffff:2:3:4:ffff::').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001657 b'\xff\xff\x00\x02\x00\x03\x00\x04\xff\xff'
1658 + b'\x00' * 6)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001659 self.assertEqual(ipaddress.IPv6Interface('::1:0:0:0:0').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +10001660 b'\x00' * 6 + b'\x00\x01' + b'\x00' * 8)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001661
Nick Coghlandc9b2552012-05-20 21:01:57 +10001662 def testIpType(self):
1663 ipv4net = ipaddress.ip_network('1.2.3.4')
1664 ipv4addr = ipaddress.ip_address('1.2.3.4')
1665 ipv6net = ipaddress.ip_network('::1.2.3.4')
1666 ipv6addr = ipaddress.ip_address('::1.2.3.4')
1667 self.assertEqual(ipaddress.IPv4Network, type(ipv4net))
1668 self.assertEqual(ipaddress.IPv4Address, type(ipv4addr))
1669 self.assertEqual(ipaddress.IPv6Network, type(ipv6net))
1670 self.assertEqual(ipaddress.IPv6Address, type(ipv6addr))
1671
1672 def testReservedIpv4(self):
1673 # test networks
1674 self.assertEqual(True, ipaddress.ip_interface(
1675 '224.1.1.1/31').is_multicast)
1676 self.assertEqual(False, ipaddress.ip_network('240.0.0.0').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001677 self.assertEqual(True, ipaddress.ip_network('240.0.0.0').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001678
1679 self.assertEqual(True, ipaddress.ip_interface(
1680 '192.168.1.1/17').is_private)
1681 self.assertEqual(False, ipaddress.ip_network('192.169.0.0').is_private)
1682 self.assertEqual(True, ipaddress.ip_network(
1683 '10.255.255.255').is_private)
1684 self.assertEqual(False, ipaddress.ip_network('11.0.0.0').is_private)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001685 self.assertEqual(False, ipaddress.ip_network('11.0.0.0').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001686 self.assertEqual(True, ipaddress.ip_network(
1687 '172.31.255.255').is_private)
1688 self.assertEqual(False, ipaddress.ip_network('172.32.0.0').is_private)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001689 self.assertEqual(True,
1690 ipaddress.ip_network('169.254.1.0/24').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001691
1692 self.assertEqual(True,
1693 ipaddress.ip_interface(
1694 '169.254.100.200/24').is_link_local)
1695 self.assertEqual(False,
1696 ipaddress.ip_interface(
1697 '169.255.100.200/24').is_link_local)
1698
1699 self.assertEqual(True,
1700 ipaddress.ip_network(
1701 '127.100.200.254/32').is_loopback)
1702 self.assertEqual(True, ipaddress.ip_network(
1703 '127.42.0.0/16').is_loopback)
1704 self.assertEqual(False, ipaddress.ip_network('128.0.0.0').is_loopback)
Peter Moodye5019d52013-10-24 09:47:10 -07001705 self.assertEqual(False,
1706 ipaddress.ip_network('100.64.0.0/10').is_private)
Peter Moodybe9c1b12013-10-22 12:36:21 -07001707 self.assertEqual(False, ipaddress.ip_network('100.64.0.0/10').is_global)
Peter Moodye5019d52013-10-24 09:47:10 -07001708
Peter Moody22c31762013-10-21 13:58:06 -07001709 self.assertEqual(True,
1710 ipaddress.ip_network('192.0.2.128/25').is_private)
1711 self.assertEqual(True,
1712 ipaddress.ip_network('192.0.3.0/24').is_global)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001713
1714 # test addresses
Hynek Schlawackbcd30442012-06-04 14:19:39 +02001715 self.assertEqual(True, ipaddress.ip_address('0.0.0.0').is_unspecified)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001716 self.assertEqual(True, ipaddress.ip_address('224.1.1.1').is_multicast)
1717 self.assertEqual(False, ipaddress.ip_address('240.0.0.0').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001718 self.assertEqual(True, ipaddress.ip_address('240.0.0.1').is_reserved)
1719 self.assertEqual(False,
1720 ipaddress.ip_address('239.255.255.255').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001721
1722 self.assertEqual(True, ipaddress.ip_address('192.168.1.1').is_private)
1723 self.assertEqual(False, ipaddress.ip_address('192.169.0.0').is_private)
1724 self.assertEqual(True, ipaddress.ip_address(
1725 '10.255.255.255').is_private)
1726 self.assertEqual(False, ipaddress.ip_address('11.0.0.0').is_private)
1727 self.assertEqual(True, ipaddress.ip_address(
1728 '172.31.255.255').is_private)
1729 self.assertEqual(False, ipaddress.ip_address('172.32.0.0').is_private)
1730
1731 self.assertEqual(True,
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001732 ipaddress.ip_address('169.254.100.200').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001733 self.assertEqual(False,
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001734 ipaddress.ip_address('169.255.100.200').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001735
Berker Peksag742192a2016-06-11 22:11:47 +03001736 self.assertTrue(ipaddress.ip_address('192.0.7.1').is_global)
1737 self.assertFalse(ipaddress.ip_address('203.0.113.1').is_global)
1738
Nick Coghlandc9b2552012-05-20 21:01:57 +10001739 self.assertEqual(True,
1740 ipaddress.ip_address('127.100.200.254').is_loopback)
1741 self.assertEqual(True, ipaddress.ip_address('127.42.0.0').is_loopback)
1742 self.assertEqual(False, ipaddress.ip_address('128.0.0.0').is_loopback)
1743 self.assertEqual(True, ipaddress.ip_network('0.0.0.0').is_unspecified)
1744
1745 def testReservedIpv6(self):
1746
1747 self.assertEqual(True, ipaddress.ip_network('ffff::').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001748 self.assertEqual(True, ipaddress.ip_network(2**128 - 1).is_multicast)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001749 self.assertEqual(True, ipaddress.ip_network('ff00::').is_multicast)
1750 self.assertEqual(False, ipaddress.ip_network('fdff::').is_multicast)
1751
1752 self.assertEqual(True, ipaddress.ip_network('fecf::').is_site_local)
1753 self.assertEqual(True, ipaddress.ip_network(
1754 'feff:ffff:ffff:ffff::').is_site_local)
1755 self.assertEqual(False, ipaddress.ip_network(
1756 'fbf:ffff::').is_site_local)
1757 self.assertEqual(False, ipaddress.ip_network('ff00::').is_site_local)
1758
1759 self.assertEqual(True, ipaddress.ip_network('fc00::').is_private)
1760 self.assertEqual(True, ipaddress.ip_network(
1761 'fc00:ffff:ffff:ffff::').is_private)
1762 self.assertEqual(False, ipaddress.ip_network('fbff:ffff::').is_private)
1763 self.assertEqual(False, ipaddress.ip_network('fe00::').is_private)
1764
1765 self.assertEqual(True, ipaddress.ip_network('fea0::').is_link_local)
1766 self.assertEqual(True, ipaddress.ip_network(
1767 'febf:ffff::').is_link_local)
1768 self.assertEqual(False, ipaddress.ip_network(
1769 'fe7f:ffff::').is_link_local)
1770 self.assertEqual(False, ipaddress.ip_network('fec0::').is_link_local)
1771
1772 self.assertEqual(True, ipaddress.ip_interface('0:0::0:01').is_loopback)
1773 self.assertEqual(False, ipaddress.ip_interface('::1/127').is_loopback)
1774 self.assertEqual(False, ipaddress.ip_network('::').is_loopback)
1775 self.assertEqual(False, ipaddress.ip_network('::2').is_loopback)
1776
1777 self.assertEqual(True, ipaddress.ip_network('0::0').is_unspecified)
1778 self.assertEqual(False, ipaddress.ip_network('::1').is_unspecified)
1779 self.assertEqual(False, ipaddress.ip_network('::/127').is_unspecified)
1780
Peter Moody22c31762013-10-21 13:58:06 -07001781 self.assertEqual(True,
1782 ipaddress.ip_network('2001::1/128').is_private)
1783 self.assertEqual(True,
1784 ipaddress.ip_network('200::1/128').is_global)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001785 # test addresses
1786 self.assertEqual(True, ipaddress.ip_address('ffff::').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001787 self.assertEqual(True, ipaddress.ip_address(2**128 - 1).is_multicast)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001788 self.assertEqual(True, ipaddress.ip_address('ff00::').is_multicast)
1789 self.assertEqual(False, ipaddress.ip_address('fdff::').is_multicast)
1790
1791 self.assertEqual(True, ipaddress.ip_address('fecf::').is_site_local)
1792 self.assertEqual(True, ipaddress.ip_address(
1793 'feff:ffff:ffff:ffff::').is_site_local)
1794 self.assertEqual(False, ipaddress.ip_address(
1795 'fbf:ffff::').is_site_local)
1796 self.assertEqual(False, ipaddress.ip_address('ff00::').is_site_local)
1797
1798 self.assertEqual(True, ipaddress.ip_address('fc00::').is_private)
1799 self.assertEqual(True, ipaddress.ip_address(
1800 'fc00:ffff:ffff:ffff::').is_private)
1801 self.assertEqual(False, ipaddress.ip_address('fbff:ffff::').is_private)
1802 self.assertEqual(False, ipaddress.ip_address('fe00::').is_private)
1803
1804 self.assertEqual(True, ipaddress.ip_address('fea0::').is_link_local)
1805 self.assertEqual(True, ipaddress.ip_address(
1806 'febf:ffff::').is_link_local)
1807 self.assertEqual(False, ipaddress.ip_address(
1808 'fe7f:ffff::').is_link_local)
1809 self.assertEqual(False, ipaddress.ip_address('fec0::').is_link_local)
1810
1811 self.assertEqual(True, ipaddress.ip_address('0:0::0:01').is_loopback)
1812 self.assertEqual(True, ipaddress.ip_address('::1').is_loopback)
1813 self.assertEqual(False, ipaddress.ip_address('::2').is_loopback)
1814
1815 self.assertEqual(True, ipaddress.ip_address('0::0').is_unspecified)
1816 self.assertEqual(False, ipaddress.ip_address('::1').is_unspecified)
1817
1818 # some generic IETF reserved addresses
1819 self.assertEqual(True, ipaddress.ip_address('100::').is_reserved)
1820 self.assertEqual(True, ipaddress.ip_network('4000::1/128').is_reserved)
1821
1822 def testIpv4Mapped(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001823 self.assertEqual(
1824 ipaddress.ip_address('::ffff:192.168.1.1').ipv4_mapped,
1825 ipaddress.ip_address('192.168.1.1'))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001826 self.assertEqual(ipaddress.ip_address('::c0a8:101').ipv4_mapped, None)
1827 self.assertEqual(ipaddress.ip_address('::ffff:c0a8:101').ipv4_mapped,
1828 ipaddress.ip_address('192.168.1.1'))
1829
1830 def testAddrExclude(self):
1831 addr1 = ipaddress.ip_network('10.1.1.0/24')
1832 addr2 = ipaddress.ip_network('10.1.1.0/26')
1833 addr3 = ipaddress.ip_network('10.2.1.0/24')
1834 addr4 = ipaddress.ip_address('10.1.1.0')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001835 addr5 = ipaddress.ip_network('2001:db8::0/32')
Serhiy Storchakabb0dbd52016-03-01 10:25:45 +02001836 addr6 = ipaddress.ip_network('10.1.1.5/32')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001837 self.assertEqual(sorted(list(addr1.address_exclude(addr2))),
1838 [ipaddress.ip_network('10.1.1.64/26'),
1839 ipaddress.ip_network('10.1.1.128/25')])
1840 self.assertRaises(ValueError, list, addr1.address_exclude(addr3))
1841 self.assertRaises(TypeError, list, addr1.address_exclude(addr4))
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001842 self.assertRaises(TypeError, list, addr1.address_exclude(addr5))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001843 self.assertEqual(list(addr1.address_exclude(addr1)), [])
Serhiy Storchakabb0dbd52016-03-01 10:25:45 +02001844 self.assertEqual(sorted(list(addr1.address_exclude(addr6))),
1845 [ipaddress.ip_network('10.1.1.0/30'),
1846 ipaddress.ip_network('10.1.1.4/32'),
1847 ipaddress.ip_network('10.1.1.6/31'),
1848 ipaddress.ip_network('10.1.1.8/29'),
1849 ipaddress.ip_network('10.1.1.16/28'),
1850 ipaddress.ip_network('10.1.1.32/27'),
1851 ipaddress.ip_network('10.1.1.64/26'),
1852 ipaddress.ip_network('10.1.1.128/25')])
Nick Coghlandc9b2552012-05-20 21:01:57 +10001853
1854 def testHash(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001855 self.assertEqual(hash(ipaddress.ip_interface('10.1.1.0/24')),
1856 hash(ipaddress.ip_interface('10.1.1.0/24')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001857 self.assertEqual(hash(ipaddress.ip_network('10.1.1.0/24')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001858 hash(ipaddress.ip_network('10.1.1.0/24')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001859 self.assertEqual(hash(ipaddress.ip_address('10.1.1.0')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001860 hash(ipaddress.ip_address('10.1.1.0')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001861 # i70
1862 self.assertEqual(hash(ipaddress.ip_address('1.2.3.4')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001863 hash(ipaddress.ip_address(
Nick Coghlandc9b2552012-05-20 21:01:57 +10001864 int(ipaddress.ip_address('1.2.3.4')._ip))))
1865 ip1 = ipaddress.ip_address('10.1.1.0')
1866 ip2 = ipaddress.ip_address('1::')
1867 dummy = {}
1868 dummy[self.ipv4_address] = None
1869 dummy[self.ipv6_address] = None
1870 dummy[ip1] = None
1871 dummy[ip2] = None
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001872 self.assertIn(self.ipv4_address, dummy)
1873 self.assertIn(ip2, dummy)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001874
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001875 def testIPBases(self):
1876 net = self.ipv4_network
1877 self.assertEqual('1.2.3.0/24', net.compressed)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001878 net = self.ipv6_network
1879 self.assertRaises(ValueError, net._string_from_ip_int, 2**128 + 1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001880
Hynek Schlawack454a74d2012-06-04 18:14:02 +02001881 def testIPv6NetworkHelpers(self):
1882 net = self.ipv6_network
1883 self.assertEqual('2001:658:22a:cafe::/64', net.with_prefixlen)
1884 self.assertEqual('2001:658:22a:cafe::/ffff:ffff:ffff:ffff::',
1885 net.with_netmask)
1886 self.assertEqual('2001:658:22a:cafe::/::ffff:ffff:ffff:ffff',
1887 net.with_hostmask)
1888 self.assertEqual('2001:658:22a:cafe::/64', str(net))
1889
1890 def testIPv4NetworkHelpers(self):
1891 net = self.ipv4_network
1892 self.assertEqual('1.2.3.0/24', net.with_prefixlen)
1893 self.assertEqual('1.2.3.0/255.255.255.0', net.with_netmask)
1894 self.assertEqual('1.2.3.0/0.0.0.255', net.with_hostmask)
1895 self.assertEqual('1.2.3.0/24', str(net))
1896
Nick Coghlandc9b2552012-05-20 21:01:57 +10001897 def testCopyConstructor(self):
1898 addr1 = ipaddress.ip_network('10.1.1.0/24')
1899 addr2 = ipaddress.ip_network(addr1)
1900 addr3 = ipaddress.ip_interface('2001:658:22a:cafe:200::1/64')
1901 addr4 = ipaddress.ip_interface(addr3)
1902 addr5 = ipaddress.IPv4Address('1.1.1.1')
1903 addr6 = ipaddress.IPv6Address('2001:658:22a:cafe:200::1')
1904
1905 self.assertEqual(addr1, addr2)
1906 self.assertEqual(addr3, addr4)
1907 self.assertEqual(addr5, ipaddress.IPv4Address(addr5))
1908 self.assertEqual(addr6, ipaddress.IPv6Address(addr6))
1909
1910 def testCompressIPv6Address(self):
1911 test_addresses = {
1912 '1:2:3:4:5:6:7:8': '1:2:3:4:5:6:7:8/128',
1913 '2001:0:0:4:0:0:0:8': '2001:0:0:4::8/128',
1914 '2001:0:0:4:5:6:7:8': '2001::4:5:6:7:8/128',
1915 '2001:0:3:4:5:6:7:8': '2001:0:3:4:5:6:7:8/128',
Nick Coghlandc9b2552012-05-20 21:01:57 +10001916 '0:0:3:0:0:0:0:ffff': '0:0:3::ffff/128',
1917 '0:0:0:4:0:0:0:ffff': '::4:0:0:0:ffff/128',
1918 '0:0:0:0:5:0:0:ffff': '::5:0:0:ffff/128',
1919 '1:0:0:4:0:0:7:8': '1::4:0:0:7:8/128',
1920 '0:0:0:0:0:0:0:0': '::/128',
1921 '0:0:0:0:0:0:0:0/0': '::/0',
1922 '0:0:0:0:0:0:0:1': '::1/128',
1923 '2001:0658:022a:cafe:0000:0000:0000:0000/66':
1924 '2001:658:22a:cafe::/66',
1925 '::1.2.3.4': '::102:304/128',
1926 '1:2:3:4:5:ffff:1.2.3.4': '1:2:3:4:5:ffff:102:304/128',
1927 '::7:6:5:4:3:2:1': '0:7:6:5:4:3:2:1/128',
1928 '::7:6:5:4:3:2:0': '0:7:6:5:4:3:2:0/128',
1929 '7:6:5:4:3:2:1::': '7:6:5:4:3:2:1:0/128',
1930 '0:6:5:4:3:2:1::': '0:6:5:4:3:2:1:0/128',
1931 }
1932 for uncompressed, compressed in list(test_addresses.items()):
1933 self.assertEqual(compressed, str(ipaddress.IPv6Interface(
1934 uncompressed)))
1935
1936 def testExplodeShortHandIpStr(self):
1937 addr1 = ipaddress.IPv6Interface('2001::1')
1938 addr2 = ipaddress.IPv6Address('2001:0:5ef5:79fd:0:59d:a0e5:ba1')
1939 addr3 = ipaddress.IPv6Network('2001::/96')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001940 addr4 = ipaddress.IPv4Address('192.168.178.1')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001941 self.assertEqual('2001:0000:0000:0000:0000:0000:0000:0001/128',
1942 addr1.exploded)
1943 self.assertEqual('0000:0000:0000:0000:0000:0000:0000:0001/128',
1944 ipaddress.IPv6Interface('::1/128').exploded)
1945 # issue 77
1946 self.assertEqual('2001:0000:5ef5:79fd:0000:059d:a0e5:0ba1',
1947 addr2.exploded)
1948 self.assertEqual('2001:0000:0000:0000:0000:0000:0000:0000/96',
1949 addr3.exploded)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001950 self.assertEqual('192.168.178.1', addr4.exploded)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001951
Eric V. Smithebdaaf42014-04-14 12:58:07 -04001952 def testReversePointer(self):
1953 addr1 = ipaddress.IPv4Address('127.0.0.1')
1954 addr2 = ipaddress.IPv6Address('2001:db8::1')
1955 self.assertEqual('1.0.0.127.in-addr.arpa', addr1.reverse_pointer)
1956 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.' +
1957 'b.d.0.1.0.0.2.ip6.arpa',
1958 addr2.reverse_pointer)
1959
Nick Coghlandc9b2552012-05-20 21:01:57 +10001960 def testIntRepresentation(self):
1961 self.assertEqual(16909060, int(self.ipv4_address))
1962 self.assertEqual(42540616829182469433547762482097946625,
1963 int(self.ipv6_address))
1964
Nick Coghlandc9b2552012-05-20 21:01:57 +10001965 def testForceVersion(self):
1966 self.assertEqual(ipaddress.ip_network(1).version, 4)
Nick Coghlan51c30672012-05-27 00:25:58 +10001967 self.assertEqual(ipaddress.IPv6Network(1).version, 6)
Sandro Tosi876ecad2012-05-23 22:26:55 +02001968
Nick Coghlandc9b2552012-05-20 21:01:57 +10001969 def testWithStar(self):
Nick Coghlana8517ad2012-08-20 10:04:26 +10001970 self.assertEqual(self.ipv4_interface.with_prefixlen, "1.2.3.4/24")
1971 self.assertEqual(self.ipv4_interface.with_netmask,
Nick Coghlandc9b2552012-05-20 21:01:57 +10001972 "1.2.3.4/255.255.255.0")
Nick Coghlana8517ad2012-08-20 10:04:26 +10001973 self.assertEqual(self.ipv4_interface.with_hostmask,
Nick Coghlandc9b2552012-05-20 21:01:57 +10001974 "1.2.3.4/0.0.0.255")
1975
Nick Coghlana8517ad2012-08-20 10:04:26 +10001976 self.assertEqual(self.ipv6_interface.with_prefixlen,
Nick Coghlandc9b2552012-05-20 21:01:57 +10001977 '2001:658:22a:cafe:200::1/64')
Nick Coghlana8517ad2012-08-20 10:04:26 +10001978 self.assertEqual(self.ipv6_interface.with_netmask,
1979 '2001:658:22a:cafe:200::1/ffff:ffff:ffff:ffff::')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001980 # this probably don't make much sense, but it's included for
1981 # compatibility with ipv4
Nick Coghlana8517ad2012-08-20 10:04:26 +10001982 self.assertEqual(self.ipv6_interface.with_hostmask,
Nick Coghlandc9b2552012-05-20 21:01:57 +10001983 '2001:658:22a:cafe:200::1/::ffff:ffff:ffff:ffff')
1984
1985 def testNetworkElementCaching(self):
1986 # V4 - make sure we're empty
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02001987 self.assertNotIn('network_address', self.ipv4_network._cache)
1988 self.assertNotIn('broadcast_address', self.ipv4_network._cache)
1989 self.assertNotIn('hostmask', self.ipv4_network._cache)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001990
1991 # V4 - populate and test
1992 self.assertEqual(self.ipv4_network.network_address,
1993 ipaddress.IPv4Address('1.2.3.0'))
1994 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
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02002000 self.assertIn('broadcast_address', self.ipv4_network._cache)
2001 self.assertIn('hostmask', self.ipv4_network._cache)
Nick Coghlandc9b2552012-05-20 21:01:57 +10002002
2003 # V6 - make sure we're empty
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02002004 self.assertNotIn('broadcast_address', self.ipv6_network._cache)
2005 self.assertNotIn('hostmask', self.ipv6_network._cache)
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
Serhiy Storchaka7c389e22014-02-08 16:38:35 +02002025 self.assertIn('broadcast_address', self.ipv6_network._cache)
2026 self.assertIn('hostmask', self.ipv6_network._cache)
2027 self.assertIn('broadcast_address', self.ipv6_interface.network._cache)
2028 self.assertIn('hostmask', self.ipv6_interface.network._cache)
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()