diff options
Diffstat (limited to 'ipaddr_test.py')
-rwxr-xr-x | ipaddr_test.py | 138 |
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') |