summaryrefslogtreecommitdiff
path: root/ipaddr_test.py
diff options
context:
space:
mode:
Diffstat (limited to 'ipaddr_test.py')
-rwxr-xr-xipaddr_test.py138
1 files changed, 127 insertions, 11 deletions
diff --git a/ipaddr_test.py b/ipaddr_test.py
index 9446889..79a18c4 100755
--- a/ipaddr_test.py
+++ b/ipaddr_test.py
@@ -133,6 +133,7 @@ class IpaddrUnitTest(unittest.TestCase):
AssertInvalidIP(":1:2:3:4:5:6:")
AssertInvalidIP("192.0.2.1/32")
AssertInvalidIP("2001:db8::1/128")
+ AssertInvalidIP("02001:db8::")
self.assertRaises(ipaddr.AddressValueError, ipaddr.IPv4Network, '')
self.assertRaises(ipaddr.AddressValueError, ipaddr.IPv4Network,
@@ -157,7 +158,14 @@ class IpaddrUnitTest(unittest.TestCase):
self.assertRaises(ipaddr.AddressValueError,
ipaddr.IPv4Address(1)._ip_int_from_string,
'1.a.2.3')
- self.assertEqual(False, ipaddr.IPv4Network(1)._is_hostmask('1.a.2.3'))
+ self.assertRaises(ipaddr.AddressValueError, ipaddr.IPv4Network,
+ ('1.2.3.0',))
+ self.assertRaises(ipaddr.AddressValueError, ipaddr.IPv6Network,
+ ('2001:db8::',))
+ self.assertRaises(ipaddr.AddressValueError, ipaddr.IPv4Network,
+ ('1.2.3.0', 24, 0))
+ self.assertRaises(ipaddr.AddressValueError, ipaddr.IPv6Network,
+ ('2001:db8::', 32, 0))
def testGetNetwork(self):
self.assertEqual(int(self.ipv4.network), 16909056)
@@ -276,11 +284,11 @@ class IpaddrUnitTest(unittest.TestCase):
def testZeroNetmask(self):
ipv4_zero_netmask = ipaddr.IPv4Network('1.2.3.4/0')
self.assertEqual(int(ipv4_zero_netmask.netmask), 0)
- self.assertTrue(ipv4_zero_netmask._is_valid_netmask(str(0)))
+ self.assertEqual(ipv4_zero_netmask._prefix_from_prefix_string('0'), 0)
ipv6_zero_netmask = ipaddr.IPv6Network('::1/0')
self.assertEqual(int(ipv6_zero_netmask.netmask), 0)
- self.assertTrue(ipv6_zero_netmask._is_valid_netmask(str(0)))
+ self.assertEqual(ipv6_zero_netmask._prefix_from_prefix_string('0'), 0)
def testGetBroadcast(self):
self.assertEqual(int(self.ipv4.broadcast), 16909311L)
@@ -434,20 +442,128 @@ class IpaddrUnitTest(unittest.TestCase):
self.assertRaises(ipaddr.AddressValueError,
ipaddr.IPv6Network, '10/8')
-
- def testBadNetMask(self):
+ def testGoodNetmaskIPv4(self):
+ self.assertEqual(str(ipaddr.IPv4Network('192.0.2.0/255.255.255.0')),
+ '192.0.2.0/24')
+ for i in range(0, 33):
+ # Generate and re-parse the CIDR format (trivial).
+ net_str = '0.0.0.0/%d' % i
+ net = ipaddr.IPv4Network(net_str)
+ self.assertEqual(str(net), net_str)
+
+ # Parse some 2-tuple inputs.
+ self.assertEqual(str(ipaddr.IPv4Network((0, i))), net_str)
+ self.assertEqual(str(ipaddr.IPv4Network(('0.0.0.0', i))), net_str)
+ self.assertEqual(
+ str(ipaddr.IPv4Network((ipaddr.IPAddress('0.0.0.0'), i))),
+ net_str)
+
+ # Generate and re-parse the expanded netmask.
+ self.assertEqual(
+ str(ipaddr.IPv4Network('0.0.0.0/%s' % net.netmask)),
+ net_str)
+
+ # Zero prefix is treated as decimal.
+ self.assertEqual(str(ipaddr.IPv4Network('0.0.0.0/0%d' % i)),
+ net_str)
+
+ # Generate and re-parse the expanded hostmask. The ambiguous cases
+ # (/0 and /32) are treated as netmasks.
+ if i in (32, 0):
+ net_str = '0.0.0.0/%d' % (32 - i)
+ self.assertEqual(
+ str(ipaddr.IPv4Network('0.0.0.0/%s' % net.hostmask)),
+ net_str)
+
+ def testGoodNetmaskIPv6(self):
+ # We only support CIDR for IPv6, because expanded netmasks are not
+ # standard notation.
+ self.assertEqual(str(ipaddr.IPv6Network('2001:db8::/32')),
+ '2001:db8::/32')
+ for i in range(0, 129):
+ # Generate and re-parse the CIDR format (trivial).
+ net_str = '::/%d' % i
+ self.assertEqual(str(ipaddr.IPv6Network(net_str)), net_str)
+
+ # Parse some 2-tuple inputs.
+ self.assertEqual(str(ipaddr.IPv6Network((0, i))), net_str)
+ self.assertEqual(str(ipaddr.IPv6Network(('::', i))), net_str)
+ self.assertEqual(
+ str(ipaddr.IPv6Network((ipaddr.IPAddress('::'), i))),
+ net_str)
+
+ # Zero prefix is treated as decimal.
+ self.assertEqual(str(ipaddr.IPv6Network('::/0%d' % i)), net_str)
+
+ def testBadNetmask(self):
self.assertRaises(ipaddr.NetmaskValueError,
ipaddr.IPv4Network, '1.2.3.4/')
self.assertRaises(ipaddr.NetmaskValueError,
+ ipaddr.IPv4Network, '1.2.3.4/-1')
+ self.assertRaises(ipaddr.NetmaskValueError,
+ ipaddr.IPv4Network, ('1.2.3.4', -1))
+ self.assertRaises(ipaddr.NetmaskValueError,
+ ipaddr.IPv4Network, '1.2.3.4/+1')
+ self.assertRaises(ipaddr.NetmaskValueError,
+ ipaddr.IPv4Network, '1.2.3.4/0x1')
+ self.assertRaises(ipaddr.NetmaskValueError,
ipaddr.IPv4Network, '1.2.3.4/33')
self.assertRaises(ipaddr.NetmaskValueError,
+ ipaddr.IPv4Network, ('1.2.3.4', 33))
+ self.assertRaises(ipaddr.NetmaskValueError,
ipaddr.IPv4Network, '1.2.3.4/254.254.255.256')
self.assertRaises(ipaddr.NetmaskValueError,
ipaddr.IPv4Network, '1.1.1.1/240.255.0.0')
self.assertRaises(ipaddr.NetmaskValueError,
+ ipaddr.IPv4Network, '1.1.1.1/255.254.128.0')
+ self.assertRaises(ipaddr.NetmaskValueError,
+ ipaddr.IPv4Network, '1.1.1.1/0.1.127.255')
+ self.assertRaises(ipaddr.NetmaskValueError,
+ ipaddr.IPv4Network, '1.2.3.4/1.a.2.3')
+ self.assertRaises(ipaddr.NetmaskValueError,
+ ipaddr.IPv4Network, '1.1.1.1/::')
+ self.assertRaises(ipaddr.NetmaskValueError,
ipaddr.IPv6Network, '::1/')
self.assertRaises(ipaddr.NetmaskValueError,
+ ipaddr.IPv6Network, '::1/-1')
+ self.assertRaises(ipaddr.NetmaskValueError,
+ ipaddr.IPv6Network, ('::1', -1))
+ self.assertRaises(ipaddr.NetmaskValueError,
+ ipaddr.IPv6Network, '::1/+1')
+ self.assertRaises(ipaddr.NetmaskValueError,
+ ipaddr.IPv6Network, '::1/0x1')
+ self.assertRaises(ipaddr.NetmaskValueError,
ipaddr.IPv6Network, '::1/129')
+ self.assertRaises(ipaddr.NetmaskValueError,
+ ipaddr.IPv6Network, ('::1', 129))
+ self.assertRaises(ipaddr.NetmaskValueError,
+ ipaddr.IPv6Network, '::1/1.2.3.4')
+ # IPv6 expanded form is currently not supported.
+ self.assertRaises(ipaddr.NetmaskValueError,
+ ipaddr.IPv6Network, '::/::')
+ # The 2-tuple constructors only accept integer prefixlens for now.
+ self.assertRaises(ipaddr.NetmaskValueError, ipaddr.IPv4Network,
+ ('0.0.0.0', '0'))
+ self.assertRaises(ipaddr.NetmaskValueError, ipaddr.IPv6Network,
+ ('::', '0'))
+
+ def testCopyConstructors(self):
+ # Create address types with unparseable str() outputs, to ensure that
+ # the copy constructors aren't taking the slow path.
+ class BadStringIPv4Address(ipaddr.IPv4Address):
+ def __str__(self):
+ return "<IPv4>"
+ class BadStringIPv6Address(ipaddr.IPv6Address):
+ def __str__(self):
+ return "<IPv6>"
+
+ v4addr = BadStringIPv4Address('1.2.3.4')
+ self.assertEqual("<IPv4>", str(v4addr))
+ self.assertEqual(v4addr, ipaddr.IPv4Address(v4addr))
+
+ v6addr = BadStringIPv6Address('2001:db8::')
+ self.assertEqual("<IPv6>", str(v6addr))
+ self.assertEqual(v6addr, ipaddr.IPv6Address(v6addr))
def testNth(self):
self.assertEqual(str(self.ipv4[5]), '1.2.3.5')
@@ -710,7 +826,12 @@ class IpaddrUnitTest(unittest.TestCase):
def testStrictNetworks(self):
self.assertRaises(ValueError, ipaddr.IPNetwork, '192.168.1.1/24',
strict=True)
- self.assertRaises(ValueError, ipaddr.IPNetwork, '::1/120', strict=True)
+ self.assertRaises(ValueError, ipaddr.IPNetwork, ('192.168.1.1', 24),
+ strict=True)
+ self.assertRaises(ValueError, ipaddr.IPNetwork, '::1/120',
+ strict=True)
+ self.assertRaises(ValueError, ipaddr.IPNetwork, ('::1', 120),
+ strict=True)
def testOverlaps(self):
other = ipaddr.IPv4Network('1.2.3.0/30')
@@ -761,11 +882,6 @@ class IpaddrUnitTest(unittest.TestCase):
self.assertEqual(ipaddr.IPv6Network('::1:0:0:0:0').packed,
_cb('\x00' * 6 + '\x00\x01' + '\x00' * 8))
- def testIpStrFromPrefixlen(self):
- ipv4 = ipaddr.IPv4Network('1.2.3.4/24')
- self.assertEqual(ipv4._ip_string_from_prefix(), '255.255.255.0')
- self.assertEqual(ipv4._ip_string_from_prefix(28), '255.255.255.240')
-
def testIpType(self):
ipv4net = ipaddr.IPNetwork('1.2.3.4')
ipv4addr = ipaddr.IPAddress('1.2.3.4')