Commit d972265d authored by Nick Coghlan's avatar Nick Coghlan

Improve an internal ipaddress test, add a comment explaining why treating...

Improve an internal ipaddress test, add a comment explaining why treating networks as containers of interfaces rather than addresses would prove confusing
parent 5b0dac12
......@@ -416,6 +416,11 @@ class _IPAddressBase:
"""Return the shorthand version of the IP address as a string."""
return str(self)
@property
def version(self):
msg = '%200s has no version specified' % (type(self),)
raise NotImplementedError(msg)
def _ip_int_from_prefix(self, prefixlen=None):
"""Turn the prefix length netmask into a int for comparison.
......@@ -555,10 +560,6 @@ class _BaseAddress(_IPAddressBase):
def _get_address_key(self):
return (self._version, self)
@property
def version(self):
raise NotImplementedError('BaseIP has no version')
class _BaseNetwork(_IPAddressBase):
......@@ -726,13 +727,13 @@ class _BaseNetwork(_IPAddressBase):
"""Number of hosts in the current subnet."""
return int(self.broadcast_address) - int(self.network_address) + 1
@property
def version(self):
raise NotImplementedError('BaseNet has no version')
@property
def _address_class(self):
raise NotImplementedError('BaseNet has no associated address class')
# Returning bare address objects (rather than interfaces) allows for
# more consistent behaviour across the network address, broadcast
# address and individual host addresses.
msg = '%200s has no associated address class' % (type(self),)
raise NotImplementedError(msg)
@property
def prefixlen(self):
......@@ -1333,7 +1334,6 @@ class IPv4Network(_BaseV4, _BaseNetwork):
"""
# Class to use when creating address objects
# TODO (ncoghlan): Investigate using IPv4Interface instead
_address_class = IPv4Address
def __init__(self, address, strict=True):
......@@ -1945,7 +1945,6 @@ class IPv6Network(_BaseV6, _BaseNetwork):
"""
# Class to use when creating address objects
# TODO (ncoghlan): Investigate using IPv6Interface instead
_address_class = IPv6Address
def __init__(self, address, strict=True):
......
......@@ -150,16 +150,31 @@ class IpaddrUnitTest(unittest.TestCase):
self.assertEqual(first, last)
self.assertEqual(0, ipaddress._get_prefix_length(2**32, 0, 32))
self.assertEqual(128, ipaddress._count_righthand_zero_bits(0, 128))
base_ip = ipaddress._BaseAddress('127.0.0.1')
try:
base_ip.version
self.fail('_BaseAddress.version didn\'t raise NotImplementedError')
except NotImplementedError:
pass
self.assertEqual("IPv4Network('1.2.3.0/24')", repr(self.ipv4_network))
self.assertEqual('0x1020318', hex(self.ipv4_network))
self.assertRaises(TypeError, self.ipv4_network.__eq__, object())
def testMissingAddressVersion(self):
class Broken(ipaddress._BaseAddress):
pass
broken = Broken('127.0.0.1')
with self.assertRaisesRegex(NotImplementedError, "Broken.*version"):
broken.version
def testMissingNetworkVersion(self):
class Broken(ipaddress._BaseNetwork):
pass
broken = Broken('127.0.0.1')
with self.assertRaisesRegex(NotImplementedError, "Broken.*version"):
broken.version
def testMissingAddressClass(self):
class Broken(ipaddress._BaseNetwork):
pass
broken = Broken('127.0.0.1')
with self.assertRaisesRegex(NotImplementedError, "Broken.*address"):
broken._address_class
def testGetNetwork(self):
self.assertEqual(int(self.ipv4_network.network_address), 16909056)
self.assertEqual(str(self.ipv4_network.network_address), '1.2.3.0')
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment