1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180
|
import pickle
import pytest
from netaddr import IPAddress, IPNetwork, ZEROFILL
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'
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::')]
def test_ipaddress_ignores_zerofill_when_parsing_ipv6():
assert IPAddress('fe80::', flags=ZEROFILL)
|