blob: 5cd2ad4d198accccb69c84acbe6c542122ad46cf [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 Coghlandc9b2552012-05-20 21:01:57 +10008import ipaddress
9
Hynek Schlawack91c5a342012-06-05 11:55:58 +020010
Nick Coghlandc9b2552012-05-20 21:01:57 +100011class IpaddrUnitTest(unittest.TestCase):
12
13 def setUp(self):
14 self.ipv4_address = ipaddress.IPv4Address('1.2.3.4')
15 self.ipv4_interface = ipaddress.IPv4Interface('1.2.3.4/24')
16 self.ipv4_network = ipaddress.IPv4Network('1.2.3.0/24')
17 #self.ipv4_hostmask = ipaddress.IPv4Interface('10.0.0.1/0.255.255.255')
18 self.ipv6_address = ipaddress.IPv6Interface(
19 '2001:658:22a:cafe:200:0:0:1')
20 self.ipv6_interface = ipaddress.IPv6Interface(
21 '2001:658:22a:cafe:200:0:0:1/64')
22 self.ipv6_network = ipaddress.IPv6Network('2001:658:22a:cafe::/64')
23
24 def testRepr(self):
25 self.assertEqual("IPv4Interface('1.2.3.4/32')",
26 repr(ipaddress.IPv4Interface('1.2.3.4')))
27 self.assertEqual("IPv6Interface('::1/128')",
28 repr(ipaddress.IPv6Interface('::1')))
29
30 # issue57
31 def testAddressIntMath(self):
32 self.assertEqual(ipaddress.IPv4Address('1.1.1.1') + 255,
33 ipaddress.IPv4Address('1.1.2.0'))
34 self.assertEqual(ipaddress.IPv4Address('1.1.1.1') - 256,
35 ipaddress.IPv4Address('1.1.0.1'))
36 self.assertEqual(ipaddress.IPv6Address('::1') + (2**16 - 2),
37 ipaddress.IPv6Address('::ffff'))
38 self.assertEqual(ipaddress.IPv6Address('::ffff') - (2**16 - 2),
39 ipaddress.IPv6Address('::1'))
40
Nick Coghlan3c2570c2012-07-07 01:13:55 +100041 def testInvalidIntToBytes(self):
42 self.assertRaises(ValueError, ipaddress.v4_int_to_packed, -1)
43 self.assertRaises(ValueError, ipaddress.v4_int_to_packed,
44 2 ** ipaddress.IPV4LENGTH)
45 self.assertRaises(ValueError, ipaddress.v6_int_to_packed, -1)
46 self.assertRaises(ValueError, ipaddress.v6_int_to_packed,
47 2 ** ipaddress.IPV6LENGTH)
48
49 def testInvalidStringsInAddressFactory(self):
Nick Coghlandc9b2552012-05-20 21:01:57 +100050 def AssertInvalidIP(ip_str):
Nick Coghlan3c2570c2012-07-07 01:13:55 +100051 with self.assertRaises(ValueError) as ex:
52 ipaddress.ip_address(ip_str)
53 self.assertIsNone(ex.exception.__context__)
54
Nick Coghlandc9b2552012-05-20 21:01:57 +100055 AssertInvalidIP("")
56 AssertInvalidIP("016.016.016.016")
57 AssertInvalidIP("016.016.016")
58 AssertInvalidIP("016.016")
59 AssertInvalidIP("016")
60 AssertInvalidIP("000.000.000.000")
61 AssertInvalidIP("000")
62 AssertInvalidIP("0x0a.0x0a.0x0a.0x0a")
63 AssertInvalidIP("0x0a.0x0a.0x0a")
64 AssertInvalidIP("0x0a.0x0a")
65 AssertInvalidIP("0x0a")
66 AssertInvalidIP("42.42.42.42.42")
67 AssertInvalidIP("42.42.42")
68 AssertInvalidIP("42.42")
69 AssertInvalidIP("42")
70 AssertInvalidIP("42..42.42")
71 AssertInvalidIP("42..42.42.42")
72 AssertInvalidIP("42.42.42.42.")
73 AssertInvalidIP("42.42.42.42...")
74 AssertInvalidIP(".42.42.42.42")
75 AssertInvalidIP("...42.42.42.42")
76 AssertInvalidIP("42.42.42.-0")
77 AssertInvalidIP("42.42.42.+0")
78 AssertInvalidIP(".")
79 AssertInvalidIP("...")
80 AssertInvalidIP("bogus")
81 AssertInvalidIP("bogus.com")
82 AssertInvalidIP("192.168.0.1.com")
83 AssertInvalidIP("12345.67899.-54321.-98765")
84 AssertInvalidIP("257.0.0.0")
85 AssertInvalidIP("42.42.42.-42")
86 AssertInvalidIP("3ffe::1.net")
87 AssertInvalidIP("3ffe::1::1")
88 AssertInvalidIP("1::2::3::4:5")
89 AssertInvalidIP("::7:6:5:4:3:2:")
90 AssertInvalidIP(":6:5:4:3:2:1::")
91 AssertInvalidIP("2001::db:::1")
92 AssertInvalidIP("FEDC:9878")
93 AssertInvalidIP("+1.+2.+3.4")
94 AssertInvalidIP("1.2.3.4e0")
95 AssertInvalidIP("::7:6:5:4:3:2:1:0")
96 AssertInvalidIP("7:6:5:4:3:2:1:0::")
97 AssertInvalidIP("9:8:7:6:5:4:3::2:1")
98 AssertInvalidIP("0:1:2:3::4:5:6:7")
99 AssertInvalidIP("3ffe:0:0:0:0:0:0:0:1")
100 AssertInvalidIP("3ffe::10000")
101 AssertInvalidIP("3ffe::goog")
102 AssertInvalidIP("3ffe::-0")
103 AssertInvalidIP("3ffe::+0")
104 AssertInvalidIP("3ffe::-1")
105 AssertInvalidIP(":")
106 AssertInvalidIP(":::")
107 AssertInvalidIP("::1.2.3")
108 AssertInvalidIP("::1.2.3.4.5")
109 AssertInvalidIP("::1.2.3.4:")
110 AssertInvalidIP("1.2.3.4::")
111 AssertInvalidIP("2001:db8::1:")
112 AssertInvalidIP(":2001:db8::1")
113 AssertInvalidIP(":1:2:3:4:5:6:7")
114 AssertInvalidIP("1:2:3:4:5:6:7:")
115 AssertInvalidIP(":1:2:3:4:5:6:")
Nick Coghlan3c2570c2012-07-07 01:13:55 +1000116 AssertInvalidIP("1000")
117 AssertInvalidIP("1000000000000000")
118 AssertInvalidIP("02001:db8::")
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200119 self.assertRaises(ValueError, ipaddress.ip_interface, 'bogus')
Nick Coghlan3c2570c2012-07-07 01:13:55 +1000120
121 def testInvalidStringsInConstructors(self):
122 def AssertInvalidIP(ip_class, ip_str):
123 with self.assertRaises(ipaddress.AddressValueError) as ex:
124 ip_class(ip_str)
125 if ex.exception.__context__ is not None:
126 # Provide clean tracebacks by default
127 self.assertTrue(ex.exception.__suppress_context__)
128
129 AssertInvalidIP(ipaddress.IPv4Address, '127.0.0.1/32')
130 AssertInvalidIP(ipaddress.IPv4Address(1)._ip_int_from_string,
131 '1.a.2.3')
132 AssertInvalidIP(ipaddress.IPv4Interface, '')
133 AssertInvalidIP(ipaddress.IPv4Interface, 'google.com')
134 AssertInvalidIP(ipaddress.IPv6Address, '1234:axy::b')
135 AssertInvalidIP(ipaddress.IPv6Address, '2001:db8:::1')
136 AssertInvalidIP(ipaddress.IPv6Address, '2001:888888::1')
137 AssertInvalidIP(ipaddress.IPv4Interface, '::1.2.3.4')
138 AssertInvalidIP(ipaddress.IPv6Interface, '')
139 AssertInvalidIP(ipaddress.IPv6Interface, 'google.com')
140 AssertInvalidIP(ipaddress.IPv6Interface, '1.2.3.4')
141 AssertInvalidIP(ipaddress.IPv6Interface, 'cafe:cafe::/128/190')
142 AssertInvalidIP(ipaddress.IPv6Interface, '1234:axy::b')
143
144 def testInvalidHostmask(self):
145 self.assertFalse(ipaddress.IPv4Interface(1)._is_hostmask('1.a.2.3'))
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200146
147 def testInternals(self):
148 first, last = ipaddress._find_address_range([
149 ipaddress.IPv4Address('10.10.10.10'),
150 ipaddress.IPv4Address('10.10.10.12')])
151 self.assertEqual(first, last)
152 self.assertEqual(0, ipaddress._get_prefix_length(2**32, 0, 32))
153 self.assertEqual(128, ipaddress._count_righthand_zero_bits(0, 128))
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200154 self.assertEqual("IPv4Network('1.2.3.0/24')", repr(self.ipv4_network))
155 self.assertEqual('0x1020318', hex(self.ipv4_network))
156 self.assertRaises(TypeError, self.ipv4_network.__eq__, object())
Nick Coghlandc9b2552012-05-20 21:01:57 +1000157
Nick Coghland9722652012-06-17 16:33:00 +1000158 def testMissingAddressVersion(self):
159 class Broken(ipaddress._BaseAddress):
160 pass
161 broken = Broken('127.0.0.1')
162 with self.assertRaisesRegex(NotImplementedError, "Broken.*version"):
163 broken.version
164
165 def testMissingNetworkVersion(self):
166 class Broken(ipaddress._BaseNetwork):
167 pass
168 broken = Broken('127.0.0.1')
169 with self.assertRaisesRegex(NotImplementedError, "Broken.*version"):
170 broken.version
171
172 def testMissingAddressClass(self):
173 class Broken(ipaddress._BaseNetwork):
174 pass
175 broken = Broken('127.0.0.1')
176 with self.assertRaisesRegex(NotImplementedError, "Broken.*address"):
177 broken._address_class
178
Nick Coghlandc9b2552012-05-20 21:01:57 +1000179 def testGetNetwork(self):
180 self.assertEqual(int(self.ipv4_network.network_address), 16909056)
181 self.assertEqual(str(self.ipv4_network.network_address), '1.2.3.0')
182
183 self.assertEqual(int(self.ipv6_network.network_address),
184 42540616829182469433403647294022090752)
185 self.assertEqual(str(self.ipv6_network.network_address),
186 '2001:658:22a:cafe::')
187 self.assertEqual(str(self.ipv6_network.hostmask),
188 '::ffff:ffff:ffff:ffff')
189
190 def testBadVersionComparison(self):
191 # These should always raise TypeError
192 v4addr = ipaddress.ip_address('1.1.1.1')
193 v4net = ipaddress.ip_network('1.1.1.1')
194 v6addr = ipaddress.ip_address('::1')
195 v6net = ipaddress.ip_address('::1')
196
197 self.assertRaises(TypeError, v4addr.__lt__, v6addr)
198 self.assertRaises(TypeError, v4addr.__gt__, v6addr)
199 self.assertRaises(TypeError, v4net.__lt__, v6net)
200 self.assertRaises(TypeError, v4net.__gt__, v6net)
201
202 self.assertRaises(TypeError, v6addr.__lt__, v4addr)
203 self.assertRaises(TypeError, v6addr.__gt__, v4addr)
204 self.assertRaises(TypeError, v6net.__lt__, v4net)
205 self.assertRaises(TypeError, v6net.__gt__, v4net)
206
207 def testMixedTypeComparison(self):
208 v4addr = ipaddress.ip_address('1.1.1.1')
209 v4net = ipaddress.ip_network('1.1.1.1/32')
210 v6addr = ipaddress.ip_address('::1')
211 v6net = ipaddress.ip_network('::1/128')
212
213 self.assertFalse(v4net.__contains__(v6net))
214 self.assertFalse(v6net.__contains__(v4net))
215
216 self.assertRaises(TypeError, lambda: v4addr < v4net)
217 self.assertRaises(TypeError, lambda: v4addr > v4net)
218 self.assertRaises(TypeError, lambda: v4net < v4addr)
219 self.assertRaises(TypeError, lambda: v4net > v4addr)
220
221 self.assertRaises(TypeError, lambda: v6addr < v6net)
222 self.assertRaises(TypeError, lambda: v6addr > v6net)
223 self.assertRaises(TypeError, lambda: v6net < v6addr)
224 self.assertRaises(TypeError, lambda: v6net > v6addr)
225
226 # with get_mixed_type_key, you can sort addresses and network.
227 self.assertEqual([v4addr, v4net],
228 sorted([v4net, v4addr],
229 key=ipaddress.get_mixed_type_key))
230 self.assertEqual([v6addr, v6net],
231 sorted([v6net, v6addr],
232 key=ipaddress.get_mixed_type_key))
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200233 self.assertEqual(NotImplemented, ipaddress.get_mixed_type_key(object))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000234
235 def testIpFromInt(self):
236 self.assertEqual(self.ipv4_interface._ip,
237 ipaddress.IPv4Interface(16909060)._ip)
238 self.assertRaises(ipaddress.AddressValueError,
239 ipaddress.IPv4Interface, 2**32)
240 self.assertRaises(ipaddress.AddressValueError,
241 ipaddress.IPv4Interface, -1)
242
243 ipv4 = ipaddress.ip_network('1.2.3.4')
244 ipv6 = ipaddress.ip_network('2001:658:22a:cafe:200:0:0:1')
245 self.assertEqual(ipv4, ipaddress.ip_network(int(ipv4)))
246 self.assertEqual(ipv6, ipaddress.ip_network(int(ipv6)))
247
248 v6_int = 42540616829182469433547762482097946625
249 self.assertEqual(self.ipv6_interface._ip,
250 ipaddress.IPv6Interface(v6_int)._ip)
251 self.assertRaises(ipaddress.AddressValueError,
252 ipaddress.IPv6Interface, 2**128)
253 self.assertRaises(ipaddress.AddressValueError,
254 ipaddress.IPv6Interface, -1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200255 self.assertRaises(ipaddress.AddressValueError,
256 ipaddress.IPv6Network, 2**128)
257 self.assertRaises(ipaddress.AddressValueError,
258 ipaddress.IPv6Network, -1)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000259
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200260 self.assertEqual(ipaddress.ip_network(self.ipv4_address._ip).version,
261 4)
262 self.assertEqual(ipaddress.ip_network(self.ipv6_address._ip).version,
263 6)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000264
265 def testIpFromPacked(self):
Nick Coghlan5cf896f2012-07-07 01:43:31 +1000266 address = ipaddress.ip_address
Nick Coghlandc9b2552012-05-20 21:01:57 +1000267 self.assertEqual(self.ipv4_interface._ip,
Nick Coghlan5cf896f2012-07-07 01:43:31 +1000268 ipaddress.ip_interface(b'\x01\x02\x03\x04')._ip)
269 self.assertEqual(address('255.254.253.252'),
270 address(b'\xff\xfe\xfd\xfc'))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000271 self.assertEqual(self.ipv6_interface.ip,
272 ipaddress.ip_interface(
Nick Coghlan5cf896f2012-07-07 01:43:31 +1000273 b'\x20\x01\x06\x58\x02\x2a\xca\xfe'
274 b'\x02\x00\x00\x00\x00\x00\x00\x01').ip)
275 self.assertEqual(address('ffff:2:3:4:ffff::'),
276 address(b'\xff\xff\x00\x02\x00\x03\x00\x04' +
277 b'\xff\xff' + b'\x00' * 6))
278 self.assertEqual(address('::'),
279 address(b'\x00' * 16))
280
281 def testIpFromPackedErrors(self):
282 def assertInvalidPackedAddress(f, length):
283 self.assertRaises(ValueError, f, b'\x00' * length)
284 assertInvalidPackedAddress(ipaddress.ip_address, 3)
285 assertInvalidPackedAddress(ipaddress.ip_address, 5)
286 assertInvalidPackedAddress(ipaddress.ip_address, 15)
287 assertInvalidPackedAddress(ipaddress.ip_address, 17)
288 assertInvalidPackedAddress(ipaddress.ip_interface, 3)
289 assertInvalidPackedAddress(ipaddress.ip_interface, 5)
290 assertInvalidPackedAddress(ipaddress.ip_interface, 15)
291 assertInvalidPackedAddress(ipaddress.ip_interface, 17)
292 assertInvalidPackedAddress(ipaddress.ip_network, 3)
293 assertInvalidPackedAddress(ipaddress.ip_network, 5)
294 assertInvalidPackedAddress(ipaddress.ip_network, 15)
295 assertInvalidPackedAddress(ipaddress.ip_network, 17)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000296
297 def testGetIp(self):
298 self.assertEqual(int(self.ipv4_interface.ip), 16909060)
299 self.assertEqual(str(self.ipv4_interface.ip), '1.2.3.4')
300
301 self.assertEqual(int(self.ipv6_interface.ip),
302 42540616829182469433547762482097946625)
303 self.assertEqual(str(self.ipv6_interface.ip),
304 '2001:658:22a:cafe:200::1')
305
306 def testGetNetmask(self):
307 self.assertEqual(int(self.ipv4_network.netmask), 4294967040)
308 self.assertEqual(str(self.ipv4_network.netmask), '255.255.255.0')
309 self.assertEqual(int(self.ipv6_network.netmask),
310 340282366920938463444927863358058659840)
311 self.assertEqual(self.ipv6_network.prefixlen, 64)
312
313 def testZeroNetmask(self):
314 ipv4_zero_netmask = ipaddress.IPv4Interface('1.2.3.4/0')
315 self.assertEqual(int(ipv4_zero_netmask.network.netmask), 0)
316 self.assertTrue(ipv4_zero_netmask.network._is_valid_netmask(
317 str(0)))
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200318 self.assertTrue(ipv4_zero_netmask._is_valid_netmask('0'))
319 self.assertTrue(ipv4_zero_netmask._is_valid_netmask('0.0.0.0'))
320 self.assertFalse(ipv4_zero_netmask._is_valid_netmask('invalid'))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000321
322 ipv6_zero_netmask = ipaddress.IPv6Interface('::1/0')
323 self.assertEqual(int(ipv6_zero_netmask.network.netmask), 0)
324 self.assertTrue(ipv6_zero_netmask.network._is_valid_netmask(
325 str(0)))
326
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200327 def testIPv4NetAndHostmasks(self):
328 net = self.ipv4_network
329 self.assertFalse(net._is_valid_netmask('invalid'))
330 self.assertTrue(net._is_valid_netmask('128.128.128.128'))
331 self.assertFalse(net._is_valid_netmask('128.128.128.127'))
332 self.assertFalse(net._is_valid_netmask('128.128.128.255'))
333 self.assertTrue(net._is_valid_netmask('255.128.128.128'))
334
335 self.assertFalse(net._is_hostmask('invalid'))
336 self.assertTrue(net._is_hostmask('128.255.255.255'))
337 self.assertFalse(net._is_hostmask('255.255.255.255'))
338 self.assertFalse(net._is_hostmask('1.2.3.4'))
339
340 net = ipaddress.IPv4Network('127.0.0.0/0.0.0.255')
341 self.assertEqual(24, net.prefixlen)
342
Nick Coghlandc9b2552012-05-20 21:01:57 +1000343 def testGetBroadcast(self):
344 self.assertEqual(int(self.ipv4_network.broadcast_address), 16909311)
345 self.assertEqual(str(self.ipv4_network.broadcast_address), '1.2.3.255')
346
347 self.assertEqual(int(self.ipv6_network.broadcast_address),
348 42540616829182469451850391367731642367)
349 self.assertEqual(str(self.ipv6_network.broadcast_address),
350 '2001:658:22a:cafe:ffff:ffff:ffff:ffff')
351
352 def testGetPrefixlen(self):
353 self.assertEqual(self.ipv4_interface.prefixlen, 24)
354 self.assertEqual(self.ipv6_interface.prefixlen, 64)
355
356 def testGetSupernet(self):
357 self.assertEqual(self.ipv4_network.supernet().prefixlen, 23)
358 self.assertEqual(str(self.ipv4_network.supernet().network_address),
359 '1.2.2.0')
360 self.assertEqual(
361 ipaddress.IPv4Interface('0.0.0.0/0').network.supernet(),
362 ipaddress.IPv4Network('0.0.0.0/0'))
363
364 self.assertEqual(self.ipv6_network.supernet().prefixlen, 63)
365 self.assertEqual(str(self.ipv6_network.supernet().network_address),
366 '2001:658:22a:cafe::')
367 self.assertEqual(ipaddress.IPv6Interface('::0/0').network.supernet(),
368 ipaddress.IPv6Network('::0/0'))
369
370 def testGetSupernet3(self):
371 self.assertEqual(self.ipv4_network.supernet(3).prefixlen, 21)
372 self.assertEqual(str(self.ipv4_network.supernet(3).network_address),
373 '1.2.0.0')
374
375 self.assertEqual(self.ipv6_network.supernet(3).prefixlen, 61)
376 self.assertEqual(str(self.ipv6_network.supernet(3).network_address),
377 '2001:658:22a:caf8::')
378
379 def testGetSupernet4(self):
380 self.assertRaises(ValueError, self.ipv4_network.supernet,
381 prefixlen_diff=2, new_prefix=1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200382 self.assertRaises(ValueError, self.ipv4_network.supernet,
383 new_prefix=25)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000384 self.assertEqual(self.ipv4_network.supernet(prefixlen_diff=2),
385 self.ipv4_network.supernet(new_prefix=22))
386
387 self.assertRaises(ValueError, self.ipv6_network.supernet,
388 prefixlen_diff=2, new_prefix=1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200389 self.assertRaises(ValueError, self.ipv6_network.supernet,
390 new_prefix=65)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000391 self.assertEqual(self.ipv6_network.supernet(prefixlen_diff=2),
392 self.ipv6_network.supernet(new_prefix=62))
393
394 def testHosts(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200395 hosts = list(self.ipv4_network.hosts())
396 self.assertEqual(254, len(hosts))
397 self.assertEqual(ipaddress.IPv4Address('1.2.3.1'), hosts[0])
398 self.assertEqual(ipaddress.IPv4Address('1.2.3.254'), hosts[-1])
399
400 # special case where only 1 bit is left for address
Nick Coghlandc9b2552012-05-20 21:01:57 +1000401 self.assertEqual([ipaddress.IPv4Address('2.0.0.0'),
402 ipaddress.IPv4Address('2.0.0.1')],
403 list(ipaddress.ip_network('2.0.0.0/31').hosts()))
404
405 def testFancySubnetting(self):
406 self.assertEqual(sorted(self.ipv4_network.subnets(prefixlen_diff=3)),
407 sorted(self.ipv4_network.subnets(new_prefix=27)))
408 self.assertRaises(ValueError, list,
409 self.ipv4_network.subnets(new_prefix=23))
410 self.assertRaises(ValueError, list,
411 self.ipv4_network.subnets(prefixlen_diff=3,
412 new_prefix=27))
413 self.assertEqual(sorted(self.ipv6_network.subnets(prefixlen_diff=4)),
414 sorted(self.ipv6_network.subnets(new_prefix=68)))
415 self.assertRaises(ValueError, list,
416 self.ipv6_network.subnets(new_prefix=63))
417 self.assertRaises(ValueError, list,
418 self.ipv6_network.subnets(prefixlen_diff=4,
419 new_prefix=68))
420
421 def testGetSubnets(self):
422 self.assertEqual(list(self.ipv4_network.subnets())[0].prefixlen, 25)
423 self.assertEqual(str(list(
424 self.ipv4_network.subnets())[0].network_address),
425 '1.2.3.0')
426 self.assertEqual(str(list(
427 self.ipv4_network.subnets())[1].network_address),
428 '1.2.3.128')
429
430 self.assertEqual(list(self.ipv6_network.subnets())[0].prefixlen, 65)
431
432 def testGetSubnetForSingle32(self):
433 ip = ipaddress.IPv4Network('1.2.3.4/32')
434 subnets1 = [str(x) for x in ip.subnets()]
435 subnets2 = [str(x) for x in ip.subnets(2)]
436 self.assertEqual(subnets1, ['1.2.3.4/32'])
437 self.assertEqual(subnets1, subnets2)
438
439 def testGetSubnetForSingle128(self):
440 ip = ipaddress.IPv6Network('::1/128')
441 subnets1 = [str(x) for x in ip.subnets()]
442 subnets2 = [str(x) for x in ip.subnets(2)]
443 self.assertEqual(subnets1, ['::1/128'])
444 self.assertEqual(subnets1, subnets2)
445
446 def testSubnet2(self):
447 ips = [str(x) for x in self.ipv4_network.subnets(2)]
448 self.assertEqual(
449 ips,
450 ['1.2.3.0/26', '1.2.3.64/26', '1.2.3.128/26', '1.2.3.192/26'])
451
452 ipsv6 = [str(x) for x in self.ipv6_network.subnets(2)]
453 self.assertEqual(
454 ipsv6,
455 ['2001:658:22a:cafe::/66',
456 '2001:658:22a:cafe:4000::/66',
457 '2001:658:22a:cafe:8000::/66',
458 '2001:658:22a:cafe:c000::/66'])
459
460 def testSubnetFailsForLargeCidrDiff(self):
461 self.assertRaises(ValueError, list,
462 self.ipv4_interface.network.subnets(9))
463 self.assertRaises(ValueError, list,
464 self.ipv4_network.subnets(9))
465 self.assertRaises(ValueError, list,
466 self.ipv6_interface.network.subnets(65))
467 self.assertRaises(ValueError, list,
468 self.ipv6_network.subnets(65))
469
470 def testSupernetFailsForLargeCidrDiff(self):
471 self.assertRaises(ValueError,
472 self.ipv4_interface.network.supernet, 25)
473 self.assertRaises(ValueError,
474 self.ipv6_interface.network.supernet, 65)
475
476 def testSubnetFailsForNegativeCidrDiff(self):
477 self.assertRaises(ValueError, list,
478 self.ipv4_interface.network.subnets(-1))
479 self.assertRaises(ValueError, list,
Nick Coghlan2c589102012-05-27 01:03:25 +1000480 self.ipv4_network.subnets(-1))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000481 self.assertRaises(ValueError, list,
482 self.ipv6_interface.network.subnets(-1))
483 self.assertRaises(ValueError, list,
484 self.ipv6_network.subnets(-1))
485
486 def testGetNum_Addresses(self):
487 self.assertEqual(self.ipv4_network.num_addresses, 256)
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200488 self.assertEqual(list(self.ipv4_network.subnets())[0].num_addresses,
489 128)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000490 self.assertEqual(self.ipv4_network.supernet().num_addresses, 512)
491
492 self.assertEqual(self.ipv6_network.num_addresses, 18446744073709551616)
493 self.assertEqual(list(self.ipv6_network.subnets())[0].num_addresses,
494 9223372036854775808)
495 self.assertEqual(self.ipv6_network.supernet().num_addresses,
496 36893488147419103232)
497
498 def testContains(self):
499 self.assertTrue(ipaddress.IPv4Interface('1.2.3.128/25') in
500 self.ipv4_network)
501 self.assertFalse(ipaddress.IPv4Interface('1.2.4.1/24') in
502 self.ipv4_network)
503 # We can test addresses and string as well.
504 addr1 = ipaddress.IPv4Address('1.2.3.37')
505 self.assertTrue(addr1 in self.ipv4_network)
506 # issue 61, bad network comparison on like-ip'd network objects
507 # with identical broadcast addresses.
508 self.assertFalse(ipaddress.IPv4Network('1.1.0.0/16').__contains__(
509 ipaddress.IPv4Network('1.0.0.0/15')))
510
511 def testBadAddress(self):
512 self.assertRaises(ipaddress.AddressValueError, ipaddress.IPv4Interface,
513 'poop')
514 self.assertRaises(ipaddress.AddressValueError,
515 ipaddress.IPv4Interface, '1.2.3.256')
516
517 self.assertRaises(ipaddress.AddressValueError, ipaddress.IPv6Interface,
518 'poopv6')
519 self.assertRaises(ipaddress.AddressValueError,
520 ipaddress.IPv4Interface, '1.2.3.4/32/24')
521 self.assertRaises(ipaddress.AddressValueError,
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200522 ipaddress.IPv4Network, '1.2.3.4/32/24')
523 self.assertRaises(ipaddress.AddressValueError,
Nick Coghlandc9b2552012-05-20 21:01:57 +1000524 ipaddress.IPv4Interface, '10/8')
525 self.assertRaises(ipaddress.AddressValueError,
526 ipaddress.IPv6Interface, '10/8')
527
528
529 def testBadNetMask(self):
530 self.assertRaises(ipaddress.NetmaskValueError,
531 ipaddress.IPv4Interface, '1.2.3.4/')
532 self.assertRaises(ipaddress.NetmaskValueError,
533 ipaddress.IPv4Interface, '1.2.3.4/33')
534 self.assertRaises(ipaddress.NetmaskValueError,
535 ipaddress.IPv4Interface, '1.2.3.4/254.254.255.256')
536 self.assertRaises(ipaddress.NetmaskValueError,
537 ipaddress.IPv4Interface, '1.1.1.1/240.255.0.0')
538 self.assertRaises(ipaddress.NetmaskValueError,
539 ipaddress.IPv6Interface, '::1/')
540 self.assertRaises(ipaddress.NetmaskValueError,
541 ipaddress.IPv6Interface, '::1/129')
542
543 def testNth(self):
544 self.assertEqual(str(self.ipv4_network[5]), '1.2.3.5')
545 self.assertRaises(IndexError, self.ipv4_network.__getitem__, 256)
546
547 self.assertEqual(str(self.ipv6_network[5]),
548 '2001:658:22a:cafe::5')
549
550 def testGetitem(self):
551 # http://code.google.com/p/ipaddr-py/issues/detail?id=15
552 addr = ipaddress.IPv4Network('172.31.255.128/255.255.255.240')
553 self.assertEqual(28, addr.prefixlen)
554 addr_list = list(addr)
555 self.assertEqual('172.31.255.128', str(addr_list[0]))
556 self.assertEqual('172.31.255.128', str(addr[0]))
557 self.assertEqual('172.31.255.143', str(addr_list[-1]))
558 self.assertEqual('172.31.255.143', str(addr[-1]))
559 self.assertEqual(addr_list[-1], addr[-1])
560
561 def testEqual(self):
562 self.assertTrue(self.ipv4_interface ==
563 ipaddress.IPv4Interface('1.2.3.4/24'))
564 self.assertFalse(self.ipv4_interface ==
565 ipaddress.IPv4Interface('1.2.3.4/23'))
566 self.assertFalse(self.ipv4_interface ==
567 ipaddress.IPv6Interface('::1.2.3.4/24'))
568 self.assertFalse(self.ipv4_interface == '')
569 self.assertFalse(self.ipv4_interface == [])
570 self.assertFalse(self.ipv4_interface == 2)
571
572 self.assertTrue(self.ipv6_interface ==
573 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/64'))
574 self.assertFalse(self.ipv6_interface ==
575 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/63'))
576 self.assertFalse(self.ipv6_interface ==
577 ipaddress.IPv4Interface('1.2.3.4/23'))
578 self.assertFalse(self.ipv6_interface == '')
579 self.assertFalse(self.ipv6_interface == [])
580 self.assertFalse(self.ipv6_interface == 2)
581
582 def testNotEqual(self):
583 self.assertFalse(self.ipv4_interface !=
584 ipaddress.IPv4Interface('1.2.3.4/24'))
585 self.assertTrue(self.ipv4_interface !=
586 ipaddress.IPv4Interface('1.2.3.4/23'))
587 self.assertTrue(self.ipv4_interface !=
588 ipaddress.IPv6Interface('::1.2.3.4/24'))
589 self.assertTrue(self.ipv4_interface != '')
590 self.assertTrue(self.ipv4_interface != [])
591 self.assertTrue(self.ipv4_interface != 2)
592
593 self.assertTrue(self.ipv4_address !=
594 ipaddress.IPv4Address('1.2.3.5'))
595 self.assertTrue(self.ipv4_address != '')
596 self.assertTrue(self.ipv4_address != [])
597 self.assertTrue(self.ipv4_address != 2)
598
599 self.assertFalse(self.ipv6_interface !=
600 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/64'))
601 self.assertTrue(self.ipv6_interface !=
602 ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/63'))
603 self.assertTrue(self.ipv6_interface !=
604 ipaddress.IPv4Interface('1.2.3.4/23'))
605 self.assertTrue(self.ipv6_interface != '')
606 self.assertTrue(self.ipv6_interface != [])
607 self.assertTrue(self.ipv6_interface != 2)
608
609 self.assertTrue(self.ipv6_address !=
610 ipaddress.IPv4Address('1.2.3.4'))
611 self.assertTrue(self.ipv6_address != '')
612 self.assertTrue(self.ipv6_address != [])
613 self.assertTrue(self.ipv6_address != 2)
614
615 def testSlash32Constructor(self):
616 self.assertEqual(str(ipaddress.IPv4Interface(
617 '1.2.3.4/255.255.255.255')), '1.2.3.4/32')
618
619 def testSlash128Constructor(self):
620 self.assertEqual(str(ipaddress.IPv6Interface('::1/128')),
621 '::1/128')
622
623 def testSlash0Constructor(self):
624 self.assertEqual(str(ipaddress.IPv4Interface('1.2.3.4/0.0.0.0')),
625 '1.2.3.4/0')
626
627 def testCollapsing(self):
628 # test only IP addresses including some duplicates
629 ip1 = ipaddress.IPv4Address('1.1.1.0')
630 ip2 = ipaddress.IPv4Address('1.1.1.1')
631 ip3 = ipaddress.IPv4Address('1.1.1.2')
632 ip4 = ipaddress.IPv4Address('1.1.1.3')
633 ip5 = ipaddress.IPv4Address('1.1.1.4')
634 ip6 = ipaddress.IPv4Address('1.1.1.0')
635 # check that addreses are subsumed properly.
636 collapsed = ipaddress.collapse_addresses(
637 [ip1, ip2, ip3, ip4, ip5, ip6])
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200638 self.assertEqual(list(collapsed),
639 [ipaddress.IPv4Network('1.1.1.0/30'),
640 ipaddress.IPv4Network('1.1.1.4/32')])
Nick Coghlandc9b2552012-05-20 21:01:57 +1000641
642 # test a mix of IP addresses and networks including some duplicates
643 ip1 = ipaddress.IPv4Address('1.1.1.0')
644 ip2 = ipaddress.IPv4Address('1.1.1.1')
645 ip3 = ipaddress.IPv4Address('1.1.1.2')
646 ip4 = ipaddress.IPv4Address('1.1.1.3')
647 #ip5 = ipaddress.IPv4Interface('1.1.1.4/30')
648 #ip6 = ipaddress.IPv4Interface('1.1.1.4/30')
649 # check that addreses are subsumed properly.
650 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3, ip4])
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200651 self.assertEqual(list(collapsed),
652 [ipaddress.IPv4Network('1.1.1.0/30')])
Nick Coghlandc9b2552012-05-20 21:01:57 +1000653
654 # test only IP networks
655 ip1 = ipaddress.IPv4Network('1.1.0.0/24')
656 ip2 = ipaddress.IPv4Network('1.1.1.0/24')
657 ip3 = ipaddress.IPv4Network('1.1.2.0/24')
658 ip4 = ipaddress.IPv4Network('1.1.3.0/24')
659 ip5 = ipaddress.IPv4Network('1.1.4.0/24')
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200660 # stored in no particular order b/c we want CollapseAddr to call
661 # [].sort
Nick Coghlandc9b2552012-05-20 21:01:57 +1000662 ip6 = ipaddress.IPv4Network('1.1.0.0/22')
663 # check that addreses are subsumed properly.
664 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3, ip4, ip5,
665 ip6])
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200666 self.assertEqual(list(collapsed),
667 [ipaddress.IPv4Network('1.1.0.0/22'),
668 ipaddress.IPv4Network('1.1.4.0/24')])
Nick Coghlandc9b2552012-05-20 21:01:57 +1000669
670 # test that two addresses are supernet'ed properly
671 collapsed = ipaddress.collapse_addresses([ip1, ip2])
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200672 self.assertEqual(list(collapsed),
673 [ipaddress.IPv4Network('1.1.0.0/23')])
Nick Coghlandc9b2552012-05-20 21:01:57 +1000674
675 # test same IP networks
676 ip_same1 = ip_same2 = ipaddress.IPv4Network('1.1.1.1/32')
677 self.assertEqual(list(ipaddress.collapse_addresses(
678 [ip_same1, ip_same2])),
679 [ip_same1])
680
681 # test same IP addresses
682 ip_same1 = ip_same2 = ipaddress.IPv4Address('1.1.1.1')
683 self.assertEqual(list(ipaddress.collapse_addresses(
684 [ip_same1, ip_same2])),
685 [ipaddress.ip_network('1.1.1.1/32')])
686 ip1 = ipaddress.IPv6Network('2001::/100')
687 ip2 = ipaddress.IPv6Network('2001::/120')
688 ip3 = ipaddress.IPv6Network('2001::/96')
689 # test that ipv6 addresses are subsumed properly.
690 collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3])
691 self.assertEqual(list(collapsed), [ip3])
692
693 # the toejam test
Hynek Schlawack35db5132012-06-01 20:12:17 +0200694 addr_tuples = [
695 (ipaddress.ip_address('1.1.1.1'),
696 ipaddress.ip_address('::1')),
697 (ipaddress.IPv4Network('1.1.0.0/24'),
698 ipaddress.IPv6Network('2001::/120')),
699 (ipaddress.IPv4Network('1.1.0.0/32'),
700 ipaddress.IPv6Network('2001::/128')),
701 ]
702 for ip1, ip2 in addr_tuples:
703 self.assertRaises(TypeError, ipaddress.collapse_addresses,
704 [ip1, ip2])
Nick Coghlandc9b2552012-05-20 21:01:57 +1000705
706 def testSummarizing(self):
707 #ip = ipaddress.ip_address
708 #ipnet = ipaddress.ip_network
709 summarize = ipaddress.summarize_address_range
710 ip1 = ipaddress.ip_address('1.1.1.0')
711 ip2 = ipaddress.ip_address('1.1.1.255')
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200712
713 # summarize works only for IPv4 & IPv6
714 class IPv7Address(ipaddress.IPv6Address):
715 @property
716 def version(self):
717 return 7
718 ip_invalid1 = IPv7Address('::1')
719 ip_invalid2 = IPv7Address('::1')
720 self.assertRaises(ValueError, list,
721 summarize(ip_invalid1, ip_invalid2))
722 # test that a summary over ip4 & ip6 fails
723 self.assertRaises(TypeError, list,
724 summarize(ip1, ipaddress.IPv6Address('::1')))
725 # test a /24 is summarized properly
Nick Coghlandc9b2552012-05-20 21:01:57 +1000726 self.assertEqual(list(summarize(ip1, ip2))[0],
727 ipaddress.ip_network('1.1.1.0/24'))
728 # test an IPv4 range that isn't on a network byte boundary
729 ip2 = ipaddress.ip_address('1.1.1.8')
730 self.assertEqual(list(summarize(ip1, ip2)),
731 [ipaddress.ip_network('1.1.1.0/29'),
732 ipaddress.ip_network('1.1.1.8')])
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200733 # all!
734 ip1 = ipaddress.IPv4Address(0)
735 ip2 = ipaddress.IPv4Address(ipaddress.IPv4Address._ALL_ONES)
736 self.assertEqual([ipaddress.IPv4Network('0.0.0.0/0')],
737 list(summarize(ip1, ip2)))
Nick Coghlandc9b2552012-05-20 21:01:57 +1000738
739 ip1 = ipaddress.ip_address('1::')
740 ip2 = ipaddress.ip_address('1:ffff:ffff:ffff:ffff:ffff:ffff:ffff')
741 # test a IPv6 is sumamrized properly
742 self.assertEqual(list(summarize(ip1, ip2))[0],
743 ipaddress.ip_network('1::/16'))
744 # test an IPv6 range that isn't on a network byte boundary
745 ip2 = ipaddress.ip_address('2::')
746 self.assertEqual(list(summarize(ip1, ip2)),
747 [ipaddress.ip_network('1::/16'),
748 ipaddress.ip_network('2::/128')])
749
750 # test exception raised when first is greater than last
751 self.assertRaises(ValueError, list,
752 summarize(ipaddress.ip_address('1.1.1.0'),
753 ipaddress.ip_address('1.1.0.0')))
754 # test exception raised when first and last aren't IP addresses
755 self.assertRaises(TypeError, list,
756 summarize(ipaddress.ip_network('1.1.1.0'),
757 ipaddress.ip_network('1.1.0.0')))
758 self.assertRaises(TypeError, list,
759 summarize(ipaddress.ip_network('1.1.1.0'),
760 ipaddress.ip_network('1.1.0.0')))
761 # test exception raised when first and last are not same version
762 self.assertRaises(TypeError, list,
763 summarize(ipaddress.ip_address('::'),
764 ipaddress.ip_network('1.1.0.0')))
765
766 def testAddressComparison(self):
767 self.assertTrue(ipaddress.ip_address('1.1.1.1') <=
768 ipaddress.ip_address('1.1.1.1'))
769 self.assertTrue(ipaddress.ip_address('1.1.1.1') <=
770 ipaddress.ip_address('1.1.1.2'))
771 self.assertTrue(ipaddress.ip_address('::1') <=
772 ipaddress.ip_address('::1'))
773 self.assertTrue(ipaddress.ip_address('::1') <=
774 ipaddress.ip_address('::2'))
775
776 def testNetworkComparison(self):
777 # ip1 and ip2 have the same network address
778 ip1 = ipaddress.IPv4Network('1.1.1.0/24')
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200779 ip2 = ipaddress.IPv4Network('1.1.1.0/32')
Nick Coghlandc9b2552012-05-20 21:01:57 +1000780 ip3 = ipaddress.IPv4Network('1.1.2.0/24')
781
782 self.assertTrue(ip1 < ip3)
783 self.assertTrue(ip3 > ip2)
784
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200785 self.assertEqual(ip1.compare_networks(ip1), 0)
786
787 # if addresses are the same, sort by netmask
788 self.assertEqual(ip1.compare_networks(ip2), -1)
789 self.assertEqual(ip2.compare_networks(ip1), 1)
790
Nick Coghlandc9b2552012-05-20 21:01:57 +1000791 self.assertEqual(ip1.compare_networks(ip3), -1)
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200792 self.assertEqual(ip3.compare_networks(ip1), 1)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000793 self.assertTrue(ip1._get_networks_key() < ip3._get_networks_key())
794
795 ip1 = ipaddress.IPv6Network('2001:2000::/96')
796 ip2 = ipaddress.IPv6Network('2001:2001::/96')
797 ip3 = ipaddress.IPv6Network('2001:ffff:2000::/96')
798
799 self.assertTrue(ip1 < ip3)
800 self.assertTrue(ip3 > ip2)
801 self.assertEqual(ip1.compare_networks(ip3), -1)
802 self.assertTrue(ip1._get_networks_key() < ip3._get_networks_key())
803
804 # Test comparing different protocols.
805 # Should always raise a TypeError.
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200806 self.assertRaises(TypeError,
807 self.ipv4_network.compare_networks,
808 self.ipv6_network)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000809 ipv6 = ipaddress.IPv6Interface('::/0')
810 ipv4 = ipaddress.IPv4Interface('0.0.0.0/0')
811 self.assertRaises(TypeError, ipv4.__lt__, ipv6)
812 self.assertRaises(TypeError, ipv4.__gt__, ipv6)
813 self.assertRaises(TypeError, ipv6.__lt__, ipv4)
814 self.assertRaises(TypeError, ipv6.__gt__, ipv4)
815
816 # Regression test for issue 19.
817 ip1 = ipaddress.ip_network('10.1.2.128/25')
818 self.assertFalse(ip1 < ip1)
819 self.assertFalse(ip1 > ip1)
820 ip2 = ipaddress.ip_network('10.1.3.0/24')
821 self.assertTrue(ip1 < ip2)
822 self.assertFalse(ip2 < ip1)
823 self.assertFalse(ip1 > ip2)
824 self.assertTrue(ip2 > ip1)
825 ip3 = ipaddress.ip_network('10.1.3.0/25')
826 self.assertTrue(ip2 < ip3)
827 self.assertFalse(ip3 < ip2)
828 self.assertFalse(ip2 > ip3)
829 self.assertTrue(ip3 > ip2)
830
831 # Regression test for issue 28.
832 ip1 = ipaddress.ip_network('10.10.10.0/31')
833 ip2 = ipaddress.ip_network('10.10.10.0')
834 ip3 = ipaddress.ip_network('10.10.10.2/31')
835 ip4 = ipaddress.ip_network('10.10.10.2')
836 sorted = [ip1, ip2, ip3, ip4]
837 unsorted = [ip2, ip4, ip1, ip3]
838 unsorted.sort()
839 self.assertEqual(sorted, unsorted)
840 unsorted = [ip4, ip1, ip3, ip2]
841 unsorted.sort()
842 self.assertEqual(sorted, unsorted)
843 self.assertRaises(TypeError, ip1.__lt__,
844 ipaddress.ip_address('10.10.10.0'))
845 self.assertRaises(TypeError, ip2.__lt__,
846 ipaddress.ip_address('10.10.10.0'))
847
848 # <=, >=
849 self.assertTrue(ipaddress.ip_network('1.1.1.1') <=
850 ipaddress.ip_network('1.1.1.1'))
851 self.assertTrue(ipaddress.ip_network('1.1.1.1') <=
852 ipaddress.ip_network('1.1.1.2'))
853 self.assertFalse(ipaddress.ip_network('1.1.1.2') <=
854 ipaddress.ip_network('1.1.1.1'))
855 self.assertTrue(ipaddress.ip_network('::1') <=
856 ipaddress.ip_network('::1'))
857 self.assertTrue(ipaddress.ip_network('::1') <=
858 ipaddress.ip_network('::2'))
859 self.assertFalse(ipaddress.ip_network('::2') <=
860 ipaddress.ip_network('::1'))
861
862 def testStrictNetworks(self):
863 self.assertRaises(ValueError, ipaddress.ip_network, '192.168.1.1/24')
864 self.assertRaises(ValueError, ipaddress.ip_network, '::1/120')
865
866 def testOverlaps(self):
867 other = ipaddress.IPv4Network('1.2.3.0/30')
868 other2 = ipaddress.IPv4Network('1.2.2.0/24')
869 other3 = ipaddress.IPv4Network('1.2.2.64/26')
870 self.assertTrue(self.ipv4_network.overlaps(other))
871 self.assertFalse(self.ipv4_network.overlaps(other2))
872 self.assertTrue(other2.overlaps(other3))
873
874 def testEmbeddedIpv4(self):
875 ipv4_string = '192.168.0.1'
876 ipv4 = ipaddress.IPv4Interface(ipv4_string)
877 v4compat_ipv6 = ipaddress.IPv6Interface('::%s' % ipv4_string)
878 self.assertEqual(int(v4compat_ipv6.ip), int(ipv4.ip))
879 v4mapped_ipv6 = ipaddress.IPv6Interface('::ffff:%s' % ipv4_string)
880 self.assertNotEqual(v4mapped_ipv6.ip, ipv4.ip)
881 self.assertRaises(ipaddress.AddressValueError, ipaddress.IPv6Interface,
882 '2001:1.1.1.1:1.1.1.1')
883
884 # Issue 67: IPv6 with embedded IPv4 address not recognized.
885 def testIPv6AddressTooLarge(self):
886 # RFC4291 2.5.5.2
887 self.assertEqual(ipaddress.ip_address('::FFFF:192.0.2.1'),
888 ipaddress.ip_address('::FFFF:c000:201'))
889 # RFC4291 2.2 (part 3) x::d.d.d.d
890 self.assertEqual(ipaddress.ip_address('FFFF::192.0.2.1'),
891 ipaddress.ip_address('FFFF::c000:201'))
892
893 def testIPVersion(self):
894 self.assertEqual(self.ipv4_address.version, 4)
895 self.assertEqual(self.ipv6_address.version, 6)
896
897 def testMaxPrefixLength(self):
898 self.assertEqual(self.ipv4_interface.max_prefixlen, 32)
899 self.assertEqual(self.ipv6_interface.max_prefixlen, 128)
900
901 def testPacked(self):
902 self.assertEqual(self.ipv4_address.packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +1000903 b'\x01\x02\x03\x04')
Nick Coghlandc9b2552012-05-20 21:01:57 +1000904 self.assertEqual(ipaddress.IPv4Interface('255.254.253.252').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +1000905 b'\xff\xfe\xfd\xfc')
Nick Coghlandc9b2552012-05-20 21:01:57 +1000906 self.assertEqual(self.ipv6_address.packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +1000907 b'\x20\x01\x06\x58\x02\x2a\xca\xfe'
908 b'\x02\x00\x00\x00\x00\x00\x00\x01')
Nick Coghlandc9b2552012-05-20 21:01:57 +1000909 self.assertEqual(ipaddress.IPv6Interface('ffff:2:3:4:ffff::').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +1000910 b'\xff\xff\x00\x02\x00\x03\x00\x04\xff\xff'
911 + b'\x00' * 6)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000912 self.assertEqual(ipaddress.IPv6Interface('::1:0:0:0:0').packed,
Nick Coghlan5cf896f2012-07-07 01:43:31 +1000913 b'\x00' * 6 + b'\x00\x01' + b'\x00' * 8)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000914
915 def testIpStrFromPrefixlen(self):
916 ipv4 = ipaddress.IPv4Interface('1.2.3.4/24')
917 self.assertEqual(ipv4._ip_string_from_prefix(), '255.255.255.0')
918 self.assertEqual(ipv4._ip_string_from_prefix(28), '255.255.255.240')
919
920 def testIpType(self):
921 ipv4net = ipaddress.ip_network('1.2.3.4')
922 ipv4addr = ipaddress.ip_address('1.2.3.4')
923 ipv6net = ipaddress.ip_network('::1.2.3.4')
924 ipv6addr = ipaddress.ip_address('::1.2.3.4')
925 self.assertEqual(ipaddress.IPv4Network, type(ipv4net))
926 self.assertEqual(ipaddress.IPv4Address, type(ipv4addr))
927 self.assertEqual(ipaddress.IPv6Network, type(ipv6net))
928 self.assertEqual(ipaddress.IPv6Address, type(ipv6addr))
929
930 def testReservedIpv4(self):
931 # test networks
932 self.assertEqual(True, ipaddress.ip_interface(
933 '224.1.1.1/31').is_multicast)
934 self.assertEqual(False, ipaddress.ip_network('240.0.0.0').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200935 self.assertEqual(True, ipaddress.ip_network('240.0.0.0').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000936
937 self.assertEqual(True, ipaddress.ip_interface(
938 '192.168.1.1/17').is_private)
939 self.assertEqual(False, ipaddress.ip_network('192.169.0.0').is_private)
940 self.assertEqual(True, ipaddress.ip_network(
941 '10.255.255.255').is_private)
942 self.assertEqual(False, ipaddress.ip_network('11.0.0.0').is_private)
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200943 self.assertEqual(False, ipaddress.ip_network('11.0.0.0').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000944 self.assertEqual(True, ipaddress.ip_network(
945 '172.31.255.255').is_private)
946 self.assertEqual(False, ipaddress.ip_network('172.32.0.0').is_private)
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200947 self.assertEqual(True,
948 ipaddress.ip_network('169.254.1.0/24').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000949
950 self.assertEqual(True,
951 ipaddress.ip_interface(
952 '169.254.100.200/24').is_link_local)
953 self.assertEqual(False,
954 ipaddress.ip_interface(
955 '169.255.100.200/24').is_link_local)
956
957 self.assertEqual(True,
958 ipaddress.ip_network(
959 '127.100.200.254/32').is_loopback)
960 self.assertEqual(True, ipaddress.ip_network(
961 '127.42.0.0/16').is_loopback)
962 self.assertEqual(False, ipaddress.ip_network('128.0.0.0').is_loopback)
963
964 # test addresses
Hynek Schlawackbcd30442012-06-04 14:19:39 +0200965 self.assertEqual(True, ipaddress.ip_address('0.0.0.0').is_unspecified)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000966 self.assertEqual(True, ipaddress.ip_address('224.1.1.1').is_multicast)
967 self.assertEqual(False, ipaddress.ip_address('240.0.0.0').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200968 self.assertEqual(True, ipaddress.ip_address('240.0.0.1').is_reserved)
969 self.assertEqual(False,
970 ipaddress.ip_address('239.255.255.255').is_reserved)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000971
972 self.assertEqual(True, ipaddress.ip_address('192.168.1.1').is_private)
973 self.assertEqual(False, ipaddress.ip_address('192.169.0.0').is_private)
974 self.assertEqual(True, ipaddress.ip_address(
975 '10.255.255.255').is_private)
976 self.assertEqual(False, ipaddress.ip_address('11.0.0.0').is_private)
977 self.assertEqual(True, ipaddress.ip_address(
978 '172.31.255.255').is_private)
979 self.assertEqual(False, ipaddress.ip_address('172.32.0.0').is_private)
980
981 self.assertEqual(True,
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200982 ipaddress.ip_address('169.254.100.200').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000983 self.assertEqual(False,
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200984 ipaddress.ip_address('169.255.100.200').is_link_local)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000985
986 self.assertEqual(True,
987 ipaddress.ip_address('127.100.200.254').is_loopback)
988 self.assertEqual(True, ipaddress.ip_address('127.42.0.0').is_loopback)
989 self.assertEqual(False, ipaddress.ip_address('128.0.0.0').is_loopback)
990 self.assertEqual(True, ipaddress.ip_network('0.0.0.0').is_unspecified)
991
992 def testReservedIpv6(self):
993
994 self.assertEqual(True, ipaddress.ip_network('ffff::').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +0200995 self.assertEqual(True, ipaddress.ip_network(2**128 - 1).is_multicast)
Nick Coghlandc9b2552012-05-20 21:01:57 +1000996 self.assertEqual(True, ipaddress.ip_network('ff00::').is_multicast)
997 self.assertEqual(False, ipaddress.ip_network('fdff::').is_multicast)
998
999 self.assertEqual(True, ipaddress.ip_network('fecf::').is_site_local)
1000 self.assertEqual(True, ipaddress.ip_network(
1001 'feff:ffff:ffff:ffff::').is_site_local)
1002 self.assertEqual(False, ipaddress.ip_network(
1003 'fbf:ffff::').is_site_local)
1004 self.assertEqual(False, ipaddress.ip_network('ff00::').is_site_local)
1005
1006 self.assertEqual(True, ipaddress.ip_network('fc00::').is_private)
1007 self.assertEqual(True, ipaddress.ip_network(
1008 'fc00:ffff:ffff:ffff::').is_private)
1009 self.assertEqual(False, ipaddress.ip_network('fbff:ffff::').is_private)
1010 self.assertEqual(False, ipaddress.ip_network('fe00::').is_private)
1011
1012 self.assertEqual(True, ipaddress.ip_network('fea0::').is_link_local)
1013 self.assertEqual(True, ipaddress.ip_network(
1014 'febf:ffff::').is_link_local)
1015 self.assertEqual(False, ipaddress.ip_network(
1016 'fe7f:ffff::').is_link_local)
1017 self.assertEqual(False, ipaddress.ip_network('fec0::').is_link_local)
1018
1019 self.assertEqual(True, ipaddress.ip_interface('0:0::0:01').is_loopback)
1020 self.assertEqual(False, ipaddress.ip_interface('::1/127').is_loopback)
1021 self.assertEqual(False, ipaddress.ip_network('::').is_loopback)
1022 self.assertEqual(False, ipaddress.ip_network('::2').is_loopback)
1023
1024 self.assertEqual(True, ipaddress.ip_network('0::0').is_unspecified)
1025 self.assertEqual(False, ipaddress.ip_network('::1').is_unspecified)
1026 self.assertEqual(False, ipaddress.ip_network('::/127').is_unspecified)
1027
1028 # test addresses
1029 self.assertEqual(True, ipaddress.ip_address('ffff::').is_multicast)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001030 self.assertEqual(True, ipaddress.ip_address(2**128 - 1).is_multicast)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001031 self.assertEqual(True, ipaddress.ip_address('ff00::').is_multicast)
1032 self.assertEqual(False, ipaddress.ip_address('fdff::').is_multicast)
1033
1034 self.assertEqual(True, ipaddress.ip_address('fecf::').is_site_local)
1035 self.assertEqual(True, ipaddress.ip_address(
1036 'feff:ffff:ffff:ffff::').is_site_local)
1037 self.assertEqual(False, ipaddress.ip_address(
1038 'fbf:ffff::').is_site_local)
1039 self.assertEqual(False, ipaddress.ip_address('ff00::').is_site_local)
1040
1041 self.assertEqual(True, ipaddress.ip_address('fc00::').is_private)
1042 self.assertEqual(True, ipaddress.ip_address(
1043 'fc00:ffff:ffff:ffff::').is_private)
1044 self.assertEqual(False, ipaddress.ip_address('fbff:ffff::').is_private)
1045 self.assertEqual(False, ipaddress.ip_address('fe00::').is_private)
1046
1047 self.assertEqual(True, ipaddress.ip_address('fea0::').is_link_local)
1048 self.assertEqual(True, ipaddress.ip_address(
1049 'febf:ffff::').is_link_local)
1050 self.assertEqual(False, ipaddress.ip_address(
1051 'fe7f:ffff::').is_link_local)
1052 self.assertEqual(False, ipaddress.ip_address('fec0::').is_link_local)
1053
1054 self.assertEqual(True, ipaddress.ip_address('0:0::0:01').is_loopback)
1055 self.assertEqual(True, ipaddress.ip_address('::1').is_loopback)
1056 self.assertEqual(False, ipaddress.ip_address('::2').is_loopback)
1057
1058 self.assertEqual(True, ipaddress.ip_address('0::0').is_unspecified)
1059 self.assertEqual(False, ipaddress.ip_address('::1').is_unspecified)
1060
1061 # some generic IETF reserved addresses
1062 self.assertEqual(True, ipaddress.ip_address('100::').is_reserved)
1063 self.assertEqual(True, ipaddress.ip_network('4000::1/128').is_reserved)
1064
1065 def testIpv4Mapped(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001066 self.assertEqual(
1067 ipaddress.ip_address('::ffff:192.168.1.1').ipv4_mapped,
1068 ipaddress.ip_address('192.168.1.1'))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001069 self.assertEqual(ipaddress.ip_address('::c0a8:101').ipv4_mapped, None)
1070 self.assertEqual(ipaddress.ip_address('::ffff:c0a8:101').ipv4_mapped,
1071 ipaddress.ip_address('192.168.1.1'))
1072
1073 def testAddrExclude(self):
1074 addr1 = ipaddress.ip_network('10.1.1.0/24')
1075 addr2 = ipaddress.ip_network('10.1.1.0/26')
1076 addr3 = ipaddress.ip_network('10.2.1.0/24')
1077 addr4 = ipaddress.ip_address('10.1.1.0')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001078 addr5 = ipaddress.ip_network('2001:db8::0/32')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001079 self.assertEqual(sorted(list(addr1.address_exclude(addr2))),
1080 [ipaddress.ip_network('10.1.1.64/26'),
1081 ipaddress.ip_network('10.1.1.128/25')])
1082 self.assertRaises(ValueError, list, addr1.address_exclude(addr3))
1083 self.assertRaises(TypeError, list, addr1.address_exclude(addr4))
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001084 self.assertRaises(TypeError, list, addr1.address_exclude(addr5))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001085 self.assertEqual(list(addr1.address_exclude(addr1)), [])
1086
1087 def testHash(self):
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001088 self.assertEqual(hash(ipaddress.ip_interface('10.1.1.0/24')),
1089 hash(ipaddress.ip_interface('10.1.1.0/24')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001090 self.assertEqual(hash(ipaddress.ip_network('10.1.1.0/24')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001091 hash(ipaddress.ip_network('10.1.1.0/24')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001092 self.assertEqual(hash(ipaddress.ip_address('10.1.1.0')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001093 hash(ipaddress.ip_address('10.1.1.0')))
Nick Coghlandc9b2552012-05-20 21:01:57 +10001094 # i70
1095 self.assertEqual(hash(ipaddress.ip_address('1.2.3.4')),
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001096 hash(ipaddress.ip_address(
Nick Coghlandc9b2552012-05-20 21:01:57 +10001097 int(ipaddress.ip_address('1.2.3.4')._ip))))
1098 ip1 = ipaddress.ip_address('10.1.1.0')
1099 ip2 = ipaddress.ip_address('1::')
1100 dummy = {}
1101 dummy[self.ipv4_address] = None
1102 dummy[self.ipv6_address] = None
1103 dummy[ip1] = None
1104 dummy[ip2] = None
1105 self.assertTrue(self.ipv4_address in dummy)
1106 self.assertTrue(ip2 in dummy)
1107
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001108 def testIPBases(self):
1109 net = self.ipv4_network
1110 self.assertEqual('1.2.3.0/24', net.compressed)
1111 self.assertEqual(
1112 net._ip_int_from_prefix(24),
1113 net._ip_int_from_prefix(None))
1114 net = self.ipv6_network
1115 self.assertRaises(ValueError, net._string_from_ip_int, 2**128 + 1)
1116 self.assertEqual(
1117 self.ipv6_address._string_from_ip_int(self.ipv6_address._ip),
1118 self.ipv6_address._string_from_ip_int(None))
1119
Hynek Schlawack454a74d2012-06-04 18:14:02 +02001120 def testIPv6NetworkHelpers(self):
1121 net = self.ipv6_network
1122 self.assertEqual('2001:658:22a:cafe::/64', net.with_prefixlen)
1123 self.assertEqual('2001:658:22a:cafe::/ffff:ffff:ffff:ffff::',
1124 net.with_netmask)
1125 self.assertEqual('2001:658:22a:cafe::/::ffff:ffff:ffff:ffff',
1126 net.with_hostmask)
1127 self.assertEqual('2001:658:22a:cafe::/64', str(net))
1128
1129 def testIPv4NetworkHelpers(self):
1130 net = self.ipv4_network
1131 self.assertEqual('1.2.3.0/24', net.with_prefixlen)
1132 self.assertEqual('1.2.3.0/255.255.255.0', net.with_netmask)
1133 self.assertEqual('1.2.3.0/0.0.0.255', net.with_hostmask)
1134 self.assertEqual('1.2.3.0/24', str(net))
1135
Nick Coghlandc9b2552012-05-20 21:01:57 +10001136 def testCopyConstructor(self):
1137 addr1 = ipaddress.ip_network('10.1.1.0/24')
1138 addr2 = ipaddress.ip_network(addr1)
1139 addr3 = ipaddress.ip_interface('2001:658:22a:cafe:200::1/64')
1140 addr4 = ipaddress.ip_interface(addr3)
1141 addr5 = ipaddress.IPv4Address('1.1.1.1')
1142 addr6 = ipaddress.IPv6Address('2001:658:22a:cafe:200::1')
1143
1144 self.assertEqual(addr1, addr2)
1145 self.assertEqual(addr3, addr4)
1146 self.assertEqual(addr5, ipaddress.IPv4Address(addr5))
1147 self.assertEqual(addr6, ipaddress.IPv6Address(addr6))
1148
1149 def testCompressIPv6Address(self):
1150 test_addresses = {
1151 '1:2:3:4:5:6:7:8': '1:2:3:4:5:6:7:8/128',
1152 '2001:0:0:4:0:0:0:8': '2001:0:0:4::8/128',
1153 '2001:0:0:4:5:6:7:8': '2001::4:5:6:7:8/128',
1154 '2001:0:3:4:5:6:7:8': '2001:0:3:4:5:6:7:8/128',
1155 '2001:0:3:4:5:6:7:8': '2001:0:3:4:5:6:7:8/128',
1156 '0:0:3:0:0:0:0:ffff': '0:0:3::ffff/128',
1157 '0:0:0:4:0:0:0:ffff': '::4:0:0:0:ffff/128',
1158 '0:0:0:0:5:0:0:ffff': '::5:0:0:ffff/128',
1159 '1:0:0:4:0:0:7:8': '1::4:0:0:7:8/128',
1160 '0:0:0:0:0:0:0:0': '::/128',
1161 '0:0:0:0:0:0:0:0/0': '::/0',
1162 '0:0:0:0:0:0:0:1': '::1/128',
1163 '2001:0658:022a:cafe:0000:0000:0000:0000/66':
1164 '2001:658:22a:cafe::/66',
1165 '::1.2.3.4': '::102:304/128',
1166 '1:2:3:4:5:ffff:1.2.3.4': '1:2:3:4:5:ffff:102:304/128',
1167 '::7:6:5:4:3:2:1': '0:7:6:5:4:3:2:1/128',
1168 '::7:6:5:4:3:2:0': '0:7:6:5:4:3:2:0/128',
1169 '7:6:5:4:3:2:1::': '7:6:5:4:3:2:1:0/128',
1170 '0:6:5:4:3:2:1::': '0:6:5:4:3:2:1:0/128',
1171 }
1172 for uncompressed, compressed in list(test_addresses.items()):
1173 self.assertEqual(compressed, str(ipaddress.IPv6Interface(
1174 uncompressed)))
1175
1176 def testExplodeShortHandIpStr(self):
1177 addr1 = ipaddress.IPv6Interface('2001::1')
1178 addr2 = ipaddress.IPv6Address('2001:0:5ef5:79fd:0:59d:a0e5:ba1')
1179 addr3 = ipaddress.IPv6Network('2001::/96')
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001180 addr4 = ipaddress.IPv4Address('192.168.178.1')
Nick Coghlandc9b2552012-05-20 21:01:57 +10001181 self.assertEqual('2001:0000:0000:0000:0000:0000:0000:0001/128',
1182 addr1.exploded)
1183 self.assertEqual('0000:0000:0000:0000:0000:0000:0000:0001/128',
1184 ipaddress.IPv6Interface('::1/128').exploded)
1185 # issue 77
1186 self.assertEqual('2001:0000:5ef5:79fd:0000:059d:a0e5:0ba1',
1187 addr2.exploded)
1188 self.assertEqual('2001:0000:0000:0000:0000:0000:0000:0000/96',
1189 addr3.exploded)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001190 self.assertEqual('192.168.178.1', addr4.exploded)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001191
1192 def testIntRepresentation(self):
1193 self.assertEqual(16909060, int(self.ipv4_address))
1194 self.assertEqual(42540616829182469433547762482097946625,
1195 int(self.ipv6_address))
1196
1197 def testHexRepresentation(self):
1198 self.assertEqual(hex(0x1020304),
1199 hex(self.ipv4_address))
1200
1201 self.assertEqual(hex(0x20010658022ACAFE0200000000000001),
1202 hex(self.ipv6_address))
1203
1204 def testForceVersion(self):
1205 self.assertEqual(ipaddress.ip_network(1).version, 4)
Nick Coghlan51c30672012-05-27 00:25:58 +10001206 self.assertEqual(ipaddress.IPv6Network(1).version, 6)
Sandro Tosi876ecad2012-05-23 22:26:55 +02001207
Nick Coghlandc9b2552012-05-20 21:01:57 +10001208 def testWithStar(self):
1209 self.assertEqual(str(self.ipv4_interface.with_prefixlen), "1.2.3.4/24")
1210 self.assertEqual(str(self.ipv4_interface.with_netmask),
1211 "1.2.3.4/255.255.255.0")
1212 self.assertEqual(str(self.ipv4_interface.with_hostmask),
1213 "1.2.3.4/0.0.0.255")
1214
1215 self.assertEqual(str(self.ipv6_interface.with_prefixlen),
1216 '2001:658:22a:cafe:200::1/64')
1217 # rfc3513 sec 2.3 says that ipv6 only uses cidr notation for
1218 # subnets
1219 self.assertEqual(str(self.ipv6_interface.with_netmask),
1220 '2001:658:22a:cafe:200::1/64')
1221 # this probably don't make much sense, but it's included for
1222 # compatibility with ipv4
1223 self.assertEqual(str(self.ipv6_interface.with_hostmask),
1224 '2001:658:22a:cafe:200::1/::ffff:ffff:ffff:ffff')
1225
1226 def testNetworkElementCaching(self):
1227 # V4 - make sure we're empty
1228 self.assertFalse('network_address' in self.ipv4_network._cache)
1229 self.assertFalse('broadcast_address' in self.ipv4_network._cache)
1230 self.assertFalse('hostmask' in self.ipv4_network._cache)
1231
1232 # V4 - populate and test
1233 self.assertEqual(self.ipv4_network.network_address,
1234 ipaddress.IPv4Address('1.2.3.0'))
1235 self.assertEqual(self.ipv4_network.broadcast_address,
1236 ipaddress.IPv4Address('1.2.3.255'))
1237 self.assertEqual(self.ipv4_network.hostmask,
1238 ipaddress.IPv4Address('0.0.0.255'))
1239
1240 # V4 - check we're cached
1241 self.assertTrue('broadcast_address' in self.ipv4_network._cache)
1242 self.assertTrue('hostmask' in self.ipv4_network._cache)
1243
1244 # V6 - make sure we're empty
1245 self.assertFalse('broadcast_address' in self.ipv6_network._cache)
1246 self.assertFalse('hostmask' in self.ipv6_network._cache)
1247
1248 # V6 - populate and test
1249 self.assertEqual(self.ipv6_network.network_address,
1250 ipaddress.IPv6Address('2001:658:22a:cafe::'))
1251 self.assertEqual(self.ipv6_interface.network.network_address,
1252 ipaddress.IPv6Address('2001:658:22a:cafe::'))
1253
1254 self.assertEqual(
1255 self.ipv6_network.broadcast_address,
1256 ipaddress.IPv6Address('2001:658:22a:cafe:ffff:ffff:ffff:ffff'))
1257 self.assertEqual(self.ipv6_network.hostmask,
1258 ipaddress.IPv6Address('::ffff:ffff:ffff:ffff'))
1259 self.assertEqual(
1260 self.ipv6_interface.network.broadcast_address,
1261 ipaddress.IPv6Address('2001:658:22a:cafe:ffff:ffff:ffff:ffff'))
1262 self.assertEqual(self.ipv6_interface.network.hostmask,
1263 ipaddress.IPv6Address('::ffff:ffff:ffff:ffff'))
1264
1265 # V6 - check we're cached
1266 self.assertTrue('broadcast_address' in self.ipv6_network._cache)
1267 self.assertTrue('hostmask' in self.ipv6_network._cache)
Hynek Schlawack91c5a342012-06-05 11:55:58 +02001268 self.assertTrue(
1269 'broadcast_address' in self.ipv6_interface.network._cache)
Nick Coghlandc9b2552012-05-20 21:01:57 +10001270 self.assertTrue('hostmask' in self.ipv6_interface.network._cache)
1271
1272 def testTeredo(self):
1273 # stolen from wikipedia
1274 server = ipaddress.IPv4Address('65.54.227.120')
1275 client = ipaddress.IPv4Address('192.0.2.45')
1276 teredo_addr = '2001:0000:4136:e378:8000:63bf:3fff:fdd2'
1277 self.assertEqual((server, client),
1278 ipaddress.ip_address(teredo_addr).teredo)
1279 bad_addr = '2000::4136:e378:8000:63bf:3fff:fdd2'
1280 self.assertFalse(ipaddress.ip_address(bad_addr).teredo)
1281 bad_addr = '2001:0001:4136:e378:8000:63bf:3fff:fdd2'
1282 self.assertFalse(ipaddress.ip_address(bad_addr).teredo)
1283
1284 # i77
1285 teredo_addr = ipaddress.IPv6Address('2001:0:5ef5:79fd:0:59d:a0e5:ba1')
1286 self.assertEqual((ipaddress.IPv4Address('94.245.121.253'),
1287 ipaddress.IPv4Address('95.26.244.94')),
1288 teredo_addr.teredo)
1289
Nick Coghlandc9b2552012-05-20 21:01:57 +10001290 def testsixtofour(self):
1291 sixtofouraddr = ipaddress.ip_address('2002:ac1d:2d64::1')
1292 bad_addr = ipaddress.ip_address('2000:ac1d:2d64::1')
1293 self.assertEqual(ipaddress.IPv4Address('172.29.45.100'),
1294 sixtofouraddr.sixtofour)
1295 self.assertFalse(bad_addr.sixtofour)
1296
Nick Coghlandc9b2552012-05-20 21:01:57 +10001297
1298if __name__ == '__main__':
1299 unittest.main()