diff options
Diffstat (limited to 'netaddr/tests/ip/test_ip_v6.py')
-rw-r--r-- | netaddr/tests/ip/test_ip_v6.py | 168 |
1 files changed, 168 insertions, 0 deletions
diff --git a/netaddr/tests/ip/test_ip_v6.py b/netaddr/tests/ip/test_ip_v6.py new file mode 100644 index 0000000..395dcf3 --- /dev/null +++ b/netaddr/tests/ip/test_ip_v6.py @@ -0,0 +1,168 @@ +import pickle +import sys +import pytest +from netaddr import IPAddress, IPNetwork + + +def test_ipaddress_v6(): + ip = IPAddress('fe80::dead:beef') + assert ip.version == 6 + assert repr(ip) == "IPAddress('fe80::dead:beef')" + assert str(ip) == 'fe80::dead:beef' + assert ip.format() == 'fe80::dead:beef' + assert int(ip) == 338288524927261089654018896845083623151 + assert hex(ip) == '0xfe8000000000000000000000deadbeef' + if sys.version_info[0] > 2: + assert bytes(ip) == b'\xfe\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xad\xbe\xef' + assert ip.bin == '0b11111110100000000000000000000000000000000000000000000000000000000000000000000000000000000000000011011110101011011011111011101111' + assert ip.bits() == '1111111010000000:0000000000000000:0000000000000000:0000000000000000:0000000000000000:0000000000000000:1101111010101101:1011111011101111' + assert ip.words == (65152, 0, 0, 0, 0, 0, 57005, 48879) + + +@pytest.mark.parametrize( + ('value', 'ipaddr', 'network', 'cidr', 'broadcast', 'netmask', 'hostmask', 'size'), [ + ( + 'fe80::dead:beef/64', + IPAddress('fe80::dead:beef'), + IPAddress('fe80::'), + IPNetwork('fe80::/64'), + IPAddress('fe80::ffff:ffff:ffff:ffff'), + IPAddress('ffff:ffff:ffff:ffff::'), + IPAddress('::ffff:ffff:ffff:ffff'), + 18446744073709551616, + ), + ]) +def test_ipnetwork_v6(value, ipaddr, network, cidr, broadcast, netmask, hostmask, size): + net = IPNetwork(value) + assert net.ip == ipaddr + assert net.network == network + assert net.cidr == cidr + assert net.broadcast == broadcast + assert net.netmask == netmask + assert net.hostmask == hostmask + assert net.size == size + + +def test_iterhosts_v6(): + assert list(IPNetwork('::ffff:192.0.2.0/125').iter_hosts()) == [ + IPAddress('::ffff:192.0.2.1'), + IPAddress('::ffff:192.0.2.2'), + IPAddress('::ffff:192.0.2.3'), + IPAddress('::ffff:192.0.2.4'), + IPAddress('::ffff:192.0.2.5'), + IPAddress('::ffff:192.0.2.6'), + IPAddress('::ffff:192.0.2.7'), + ] + +def test_ipnetwork_boolean_evaluation_v6(): + assert bool(IPNetwork('::/0')) + + +def test_ipnetwork_slice_v6(): + ip = IPNetwork('fe80::/10') + assert ip[0] == IPAddress('fe80::') + assert ip[-1] == IPAddress('febf:ffff:ffff:ffff:ffff:ffff:ffff:ffff') + assert ip.size == 332306998946228968225951765070086144 + + with pytest.raises(TypeError): + list(ip[0:5:1]) + + +def test_ip_network_membership_v6(): + for what, network, result in [ + (IPAddress('ffff::1'), IPNetwork('ffff::/127'), True), + (IPNetwork('ffff::/127'), IPNetwork('ffff::/127'), True), + (IPNetwork('fe80::/10'), IPNetwork('ffff::/127'), False), + ]: + assert (what in network) is result + assert (str(what) in network) is result + + +def test_ip_network_equality_v6(): + assert IPNetwork('fe80::/10') == IPNetwork('fe80::/10') + assert IPNetwork('fe80::/10') is not IPNetwork('fe80::/10') + + assert not IPNetwork('fe80::/10') != IPNetwork('fe80::/10') + assert not IPNetwork('fe80::/10') is IPNetwork('fe80::/10') + + +def test_ipnetwork_constructor_v6(): + assert IPNetwork(IPNetwork('::192.0.2.0/120')) == IPNetwork('::192.0.2.0/120') + assert IPNetwork('::192.0.2.0/120') == IPNetwork('::192.0.2.0/120') + assert IPNetwork('::192.0.2.0/120', 6) == IPNetwork('::192.0.2.0/120') + + +def test_ipaddress_netmask_v6(): + assert IPAddress('::').netmask_bits() == 0 + assert IPAddress('8000::').netmask_bits() == 1 + assert IPAddress('ffff:ffff:ffff:ffff::').netmask_bits() == 64 + assert IPAddress('ffff:ffff:ffff:ffff:ffff:ffff:ffff::').netmask_bits() == 112 + assert IPAddress('ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffe').netmask_bits() == 127 + assert IPAddress('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff').netmask_bits() == 128 + + assert IPAddress('fe80::1').netmask_bits() == 128 + + +def test_objects_use_slots(): + assert not hasattr(IPNetwork("::/64"), "__dict__") + assert not hasattr(IPAddress("::"), "__dict__") + + +def test_ipaddress_pickling_v6(): + ip = IPAddress('::ffff:192.0.2.1') + assert ip == IPAddress('::ffff:192.0.2.1') + + assert ip.value == 281473902969345 + + buf = pickle.dumps(ip) + ip2 = pickle.loads(buf) + assert ip2 == ip + assert ip2.value == 281473902969345 + assert ip2.version == 6 + + +def test_ipnetwork_pickling_v6(): + cidr = IPNetwork('::ffff:192.0.2.0/120') + assert cidr == IPNetwork('::ffff:192.0.2.0/120') + assert cidr.value == 281473902969344 + assert cidr.prefixlen == 120 + + buf = pickle.dumps(cidr) + cidr2 = pickle.loads(buf) + + assert cidr2 == cidr + assert cidr2.value == 281473902969344 + assert cidr2.prefixlen == 120 + assert cidr2.version == 6 + + +def test_ipv6_unicast_address_allocation_info(): + ip = IPNetwork('2001:1200::/23') + + assert ip.info.IPv6[0].allocation == 'Global Unicast' + assert ip.info.IPv6[0].prefix == '2000::/3' + assert ip.info.IPv6[0].reference == 'rfc4291' + + assert ip.info.IPv6_unicast[0].prefix == '2001:1200::/23' + assert ip.info.IPv6_unicast[0].description == 'LACNIC' + assert ip.info.IPv6_unicast[0].whois == 'whois.lacnic.net' + assert ip.info.IPv6_unicast[0].status == 'ALLOCATED' + +def test_rfc6164_subnets(): + # Tests for /127 subnet + assert list(IPNetwork('1234::/127')) == [ + IPAddress('1234::'), + IPAddress('1234::1'), + ] + assert list(IPNetwork('1234::/127').iter_hosts()) == [ + IPAddress('1234::'), + IPAddress('1234::1'), + ] + assert IPNetwork('1234::/127').network == IPAddress('1234::') + assert IPNetwork('1234::').broadcast is None + + # Tests for /128 subnet + assert IPNetwork("1234::/128").network == IPAddress('1234::') + assert IPNetwork("1234::/128").broadcast is None + assert list(IPNetwork("1234::/128")) == [IPAddress('1234::')] + assert list(IPNetwork("1234::/128").iter_hosts()) == [IPAddress('1234::')] |