summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_ipaddress.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/test/test_ipaddress.py')
-rw-r--r--Lib/test/test_ipaddress.py76
1 files changed, 65 insertions, 11 deletions
diff --git a/Lib/test/test_ipaddress.py b/Lib/test/test_ipaddress.py
index 5bfcf41..95e3f04 100644
--- a/Lib/test/test_ipaddress.py
+++ b/Lib/test/test_ipaddress.py
@@ -7,9 +7,11 @@
import unittest
import re
import contextlib
+import functools
import operator
import ipaddress
+
class BaseTestCase(unittest.TestCase):
# One big change in ipaddress over the original ipaddr module is
# error reporting that tries to assume users *don't know the rules*
@@ -52,17 +54,18 @@ class BaseTestCase(unittest.TestCase):
def assertAddressError(self, details, *args):
"""Ensure a clean AddressValueError"""
return self.assertCleanError(ipaddress.AddressValueError,
- details, *args)
+ details, *args)
def assertNetmaskError(self, details, *args):
"""Ensure a clean NetmaskValueError"""
return self.assertCleanError(ipaddress.NetmaskValueError,
- details, *args)
+ details, *args)
def assertInstancesEqual(self, lhs, rhs):
"""Check constructor arguments produce equivalent instances"""
self.assertEqual(self.factory(lhs), self.factory(rhs))
+
class CommonTestMixin:
def test_empty_address(self):
@@ -115,6 +118,7 @@ class CommonTestMixin_v4(CommonTestMixin):
assertBadLength(3)
assertBadLength(5)
+
class CommonTestMixin_v6(CommonTestMixin):
def test_leading_zeros(self):
@@ -195,7 +199,7 @@ class AddressTestCase_v4(BaseTestCase, CommonTestMixin_v4):
def test_empty_octet(self):
def assertBadOctet(addr):
with self.assertAddressError("Empty octet not permitted in %r",
- addr):
+ addr):
ipaddress.IPv4Address(addr)
assertBadOctet("42..42.42")
@@ -443,6 +447,7 @@ class NetmaskTestMixin_v4(CommonTestMixin_v4):
class InterfaceTestCase_v4(BaseTestCase, NetmaskTestMixin_v4):
factory = ipaddress.IPv4Interface
+
class NetworkTestCase_v4(BaseTestCase, NetmaskTestMixin_v4):
factory = ipaddress.IPv4Network
@@ -496,9 +501,11 @@ class NetmaskTestMixin_v6(CommonTestMixin_v6):
assertBadNetmask("::1", "pudding")
assertBadNetmask("::", "::")
+
class InterfaceTestCase_v6(BaseTestCase, NetmaskTestMixin_v6):
factory = ipaddress.IPv6Interface
+
class NetworkTestCase_v6(BaseTestCase, NetmaskTestMixin_v6):
factory = ipaddress.IPv6Network
@@ -522,6 +529,20 @@ class FactoryFunctionErrors(BaseTestCase):
self.assertFactoryError(ipaddress.ip_network, "network")
+@functools.total_ordering
+class LargestObject:
+ def __eq__(self, other):
+ return isinstance(other, LargestObject)
+ def __lt__(self, other):
+ return False
+
+@functools.total_ordering
+class SmallestObject:
+ def __eq__(self, other):
+ return isinstance(other, SmallestObject)
+ def __gt__(self, other):
+ return False
+
class ComparisonTests(unittest.TestCase):
v4addr = ipaddress.IPv4Address(1)
@@ -575,6 +596,28 @@ class ComparisonTests(unittest.TestCase):
self.assertRaises(TypeError, lambda: lhs <= rhs)
self.assertRaises(TypeError, lambda: lhs >= rhs)
+ def test_foreign_type_ordering(self):
+ other = object()
+ smallest = SmallestObject()
+ largest = LargestObject()
+ for obj in self.objects:
+ with self.assertRaises(TypeError):
+ obj < other
+ with self.assertRaises(TypeError):
+ obj > other
+ with self.assertRaises(TypeError):
+ obj <= other
+ with self.assertRaises(TypeError):
+ obj >= other
+ self.assertTrue(obj < largest)
+ self.assertFalse(obj > largest)
+ self.assertTrue(obj <= largest)
+ self.assertFalse(obj >= largest)
+ self.assertFalse(obj < smallest)
+ self.assertTrue(obj > smallest)
+ self.assertFalse(obj <= smallest)
+ self.assertTrue(obj >= smallest)
+
def test_mixed_type_key(self):
# with get_mixed_type_key, you can sort addresses and network.
v4_ordered = [self.v4addr, self.v4net, self.v4intf]
@@ -595,7 +638,7 @@ class ComparisonTests(unittest.TestCase):
v4addr = ipaddress.ip_address('1.1.1.1')
v4net = ipaddress.ip_network('1.1.1.1')
v6addr = ipaddress.ip_address('::1')
- v6net = ipaddress.ip_address('::1')
+ v6net = ipaddress.ip_network('::1')
self.assertRaises(TypeError, v4addr.__lt__, v6addr)
self.assertRaises(TypeError, v4addr.__gt__, v6addr)
@@ -608,7 +651,6 @@ class ComparisonTests(unittest.TestCase):
self.assertRaises(TypeError, v6net.__gt__, v4net)
-
class IpaddrUnitTest(unittest.TestCase):
def setUp(self):
@@ -1118,7 +1160,7 @@ class IpaddrUnitTest(unittest.TestCase):
# test a /24 is summarized properly
self.assertEqual(list(summarize(ip1, ip2))[0],
ipaddress.ip_network('1.1.1.0/24'))
- # test an IPv4 range that isn't on a network byte boundary
+ # test an IPv4 range that isn't on a network byte boundary
ip2 = ipaddress.ip_address('1.1.1.8')
self.assertEqual(list(summarize(ip1, ip2)),
[ipaddress.ip_network('1.1.1.0/29'),
@@ -1131,7 +1173,7 @@ class IpaddrUnitTest(unittest.TestCase):
ip1 = ipaddress.ip_address('1::')
ip2 = ipaddress.ip_address('1:ffff:ffff:ffff:ffff:ffff:ffff:ffff')
- # test a IPv6 is sumamrized properly
+ # test an IPv6 is summarized properly
self.assertEqual(list(summarize(ip1, ip2))[0],
ipaddress.ip_network('1::/16'))
# test an IPv6 range that isn't on a network byte boundary
@@ -1243,10 +1285,10 @@ class IpaddrUnitTest(unittest.TestCase):
unsorted = [ip4, ip1, ip3, ip2]
unsorted.sort()
self.assertEqual(sorted, unsorted)
- self.assertRaises(TypeError, ip1.__lt__,
- ipaddress.ip_address('10.10.10.0'))
- self.assertRaises(TypeError, ip2.__lt__,
- ipaddress.ip_address('10.10.10.0'))
+ self.assertIs(ip1.__lt__(ipaddress.ip_address('10.10.10.0')),
+ NotImplemented)
+ self.assertIs(ip2.__lt__(ipaddress.ip_address('10.10.10.0')),
+ NotImplemented)
# <=, >=
self.assertTrue(ipaddress.ip_network('1.1.1.1') <=
@@ -1358,6 +1400,14 @@ class IpaddrUnitTest(unittest.TestCase):
self.assertEqual(True, ipaddress.ip_network(
'127.42.0.0/16').is_loopback)
self.assertEqual(False, ipaddress.ip_network('128.0.0.0').is_loopback)
+ self.assertEqual(False,
+ ipaddress.ip_network('100.64.0.0/10').is_private)
+ self.assertEqual(False, ipaddress.ip_network('100.64.0.0/10').is_global)
+
+ self.assertEqual(True,
+ ipaddress.ip_network('192.0.2.128/25').is_private)
+ self.assertEqual(True,
+ ipaddress.ip_network('192.0.3.0/24').is_global)
# test addresses
self.assertEqual(True, ipaddress.ip_address('0.0.0.0').is_unspecified)
@@ -1423,6 +1473,10 @@ class IpaddrUnitTest(unittest.TestCase):
self.assertEqual(False, ipaddress.ip_network('::1').is_unspecified)
self.assertEqual(False, ipaddress.ip_network('::/127').is_unspecified)
+ self.assertEqual(True,
+ ipaddress.ip_network('2001::1/128').is_private)
+ self.assertEqual(True,
+ ipaddress.ip_network('200::1/128').is_global)
# test addresses
self.assertEqual(True, ipaddress.ip_address('ffff::').is_multicast)
self.assertEqual(True, ipaddress.ip_address(2**128 - 1).is_multicast)