%PDF- %PDF-
Direktori : /backups/router/usr/local/lib/python3.11/site-packages/netaddr/tests/ip/ |
Current File : //backups/router/usr/local/lib/python3.11/site-packages/netaddr/tests/ip/test_ip_v4.py |
import pickle import types import random import pytest from netaddr import ( IPAddress, IPNetwork, INET_ATON, INET_PTON, spanning_cidr, AddrFormatError, ZEROFILL, NOHOST, ) def test_ipaddress_v4(): ip = IPAddress('192.0.2.1') assert ip.version == 4 assert repr(ip) == "IPAddress('192.0.2.1')" assert str(ip) == '192.0.2.1' assert ip.format() == '192.0.2.1' assert int(ip) == 3221225985 assert hex(ip) == '0xc0000201' assert bytes(ip) == b'\xc0\x00\x02\x01' assert ip.bin == '0b11000000000000000000001000000001' assert ip.bits() == '11000000.00000000.00000010.00000001' assert ip.words == (192, 0, 2, 1) @pytest.mark.parametrize( ('value', 'ipaddr', 'network', 'cidr', 'broadcast', 'netmask', 'hostmask', 'size'), [ ( '192.0.2.1', IPAddress('192.0.2.1'), IPAddress('192.0.2.1'), IPNetwork('192.0.2.1/32'), None, IPAddress('255.255.255.255'), IPAddress('0.0.0.0'), 1, ), ( '192.0.2.0/24', IPAddress('192.0.2.0'), IPAddress('192.0.2.0'), IPNetwork('192.0.2.0/24'), IPAddress('192.0.2.255'), IPAddress('255.255.255.0'), IPAddress('0.0.0.255'), 256, ), ( '192.0.3.112/22', IPAddress('192.0.3.112'), IPAddress('192.0.0.0'), IPNetwork('192.0.0.0/22'), IPAddress('192.0.3.255'), IPAddress('255.255.252.0'), IPAddress('0.0.3.255'), 1024, ), ], ) def test_ipnetwork_v4(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_ipnetwork_list_operations_v4(): ip = IPNetwork('192.0.2.16/29') assert len(ip) == 8 ip_list = list(ip) assert len(ip_list) == 8 assert ip_list == [ IPAddress('192.0.2.16'), IPAddress('192.0.2.17'), IPAddress('192.0.2.18'), IPAddress('192.0.2.19'), IPAddress('192.0.2.20'), IPAddress('192.0.2.21'), IPAddress('192.0.2.22'), IPAddress('192.0.2.23'), ] def test_ipnetwork_index_operations_v4(): ip = IPNetwork('192.0.2.16/29') assert ip[0] == IPAddress('192.0.2.16') assert ip[1] == IPAddress('192.0.2.17') assert ip[-1] == IPAddress('192.0.2.23') @pytest.mark.parametrize( ['start', 'stop', 'step'], [ [None, None, -1], [-1, 0, -2], [-1, None, -1], [-1, None, -3], [0, None, 4], [0, -1, None], [0, 4, None], [1, None, 4], [1, 4, 2], ], ) def test_ipnetwork_slice_operations_v4(start, stop, step): ip = IPNetwork('192.0.2.16/29') result = ip[start:stop:step] assert isinstance(result, types.GeneratorType) assert list(result) == list(ip)[start:stop:step] def test_ipnetwork_sort_order(): ip_list = list(IPNetwork('192.0.2.128/28')) random.shuffle(ip_list) assert sorted(ip_list) == [ IPAddress('192.0.2.128'), IPAddress('192.0.2.129'), IPAddress('192.0.2.130'), IPAddress('192.0.2.131'), IPAddress('192.0.2.132'), IPAddress('192.0.2.133'), IPAddress('192.0.2.134'), IPAddress('192.0.2.135'), IPAddress('192.0.2.136'), IPAddress('192.0.2.137'), IPAddress('192.0.2.138'), IPAddress('192.0.2.139'), IPAddress('192.0.2.140'), IPAddress('192.0.2.141'), IPAddress('192.0.2.142'), IPAddress('192.0.2.143'), ] def test_ipaddress_and_ipnetwork_canonical_sort_order_by_version(): ip_list = [ IPAddress('192.0.2.130'), IPNetwork('192.0.2.128/28'), IPAddress('::'), IPNetwork('192.0.3.0/24'), IPNetwork('192.0.2.0/24'), IPNetwork('fe80::/64'), IPAddress('10.0.0.1'), ] random.shuffle(ip_list) ip_list.sort() assert ip_list == [ IPAddress('10.0.0.1'), IPNetwork('192.0.2.0/24'), IPNetwork('192.0.2.128/28'), IPAddress('192.0.2.130'), IPNetwork('192.0.3.0/24'), IPAddress('::'), IPNetwork('fe80::/64'), ] def test_ipnetwork_v4_constructor(): assert IPNetwork('192.168.0.15') == IPNetwork('192.168.0.15/32') def test_ipaddress_integer_operations_v4(): assert IPAddress('192.0.2.0') + 1 == IPAddress('192.0.2.1') assert 1 + IPAddress('192.0.2.0') == IPAddress('192.0.2.1') assert IPAddress('192.0.2.1') - 1 == IPAddress('192.0.2.0') assert IPAddress('192.0.0.0') + IPAddress('0.0.0.42') == IPAddress('192.0.0.42') assert IPAddress('192.0.0.42') - IPAddress('0.0.0.42') == IPAddress('192.0.0.0') with pytest.raises(IndexError): 1 - IPAddress('192.0.2.1') ip = IPAddress('10.0.0.1') ip += 1 assert ip == IPAddress('10.0.0.2') ip -= 1 assert ip == IPAddress('10.0.0.1') ip += IPAddress('0.0.0.42') assert ip == IPAddress('10.0.0.43') ip -= IPAddress('0.0.0.43') assert ip == IPAddress('10.0.0.0') # Negative increments around address range boundaries. ip = IPAddress('0.0.0.0') with pytest.raises(IndexError): ip += -1 ip = IPAddress('255.255.255.255') with pytest.raises(IndexError): ip -= -1 def test_ipaddress_binary_operations_v4(): assert IPAddress('192.0.2.15') & IPAddress('255.255.255.0') == IPAddress('192.0.2.0') assert IPAddress('255.255.0.0') | IPAddress('0.0.255.255') == IPAddress('255.255.255.255') assert IPAddress('255.255.0.0') ^ IPAddress('255.0.0.0') == IPAddress('0.255.0.0') assert IPAddress('1.2.3.4').packed == '\x01\x02\x03\x04'.encode('ascii') def test_iterhosts_v4(): assert list(IPNetwork('192.0.2.0/29').iter_hosts()) == [ IPAddress('192.0.2.1'), IPAddress('192.0.2.2'), IPAddress('192.0.2.3'), IPAddress('192.0.2.4'), IPAddress('192.0.2.5'), IPAddress('192.0.2.6'), ] assert list(IPNetwork('192.168.0.0/31')) == [ IPAddress('192.168.0.0'), IPAddress('192.168.0.1'), ] assert list(IPNetwork('192.168.0.0/31').iter_hosts()) == [ IPAddress('192.168.0.0'), IPAddress('192.168.0.1'), ] assert list(IPNetwork('192.168.0.0/32').iter_hosts()) == [IPAddress('192.168.0.0')] def test_ipaddress_boolean_evaluation_v4(): assert not bool(IPAddress('0.0.0.0')) assert bool(IPAddress('0.0.0.1')) assert bool(IPAddress('255.255.255.255')) def test_ipnetwork_boolean_evaluation_v4(): assert bool(IPNetwork('0.0.0.0/0')) def test_ipnetwork_equality_v4(): assert IPNetwork('192.0.2.0/255.255.254.0') == IPNetwork('192.0.2.0/23') assert IPNetwork('192.0.2.65/255.255.254.0') == IPNetwork('192.0.2.0/23') assert IPNetwork('192.0.2.65/255.255.254.0') == IPNetwork('192.0.2.65/23') assert IPNetwork('192.0.2.65/255.255.255.0') != IPNetwork('192.0.2.0/23') assert IPNetwork('192.0.2.65/255.255.254.0') != IPNetwork('192.0.2.65/24') def test_ip_network_membership_v4(): for what, network, result in [ (IPAddress('192.0.2.1'), IPNetwork('192.0.2.0/24'), True), (IPAddress('192.0.2.255'), IPNetwork('192.0.2.0/24'), True), (IPNetwork('192.0.2.0/24'), IPNetwork('192.0.2.0/23'), True), (IPNetwork('192.0.2.0/24'), IPNetwork('192.0.2.0/24'), True), (IPNetwork('192.0.2.0/23'), IPNetwork('192.0.2.0/24'), False), ]: assert (what in network) is result assert (str(what) in network) is result def test_ip_network_equality_v4(): assert IPNetwork('192.0.2.0/24') == IPNetwork('192.0.2.0/24') assert IPNetwork('192.0.2.0/24') is not IPNetwork('192.0.2.0/24') assert not IPNetwork('192.0.2.0/24') != IPNetwork('192.0.2.0/24') assert not IPNetwork('192.0.2.0/24') is IPNetwork('192.0.2.0/24') def test_ipaddress_integer_constructor_v4(): assert IPAddress(1) == IPAddress('0.0.0.1') assert IPAddress(1, 4) == IPAddress('0.0.0.1') assert IPAddress(1, 6) == IPAddress('::1') assert IPAddress(10) == IPAddress('0.0.0.10') def test_ipaddress_integer_constructor_v6(): assert IPAddress(0x1FFFFFFFF) == IPAddress('::1:ffff:ffff') assert IPAddress(0xFFFFFFFF, 6) == IPAddress('::255.255.255.255') assert IPAddress(0x1FFFFFFFF) == IPAddress('::1:ffff:ffff') assert IPAddress(2**128 - 1) == IPAddress('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff') def test_ipaddress_inet_aton_constructor_v4(): assert IPAddress('0x7f.0x1', flags=INET_ATON) == IPAddress('127.0.0.1') assert IPAddress('0x7f.0x0.0x0.0x1', flags=INET_ATON) == IPAddress('127.0.0.1') assert IPAddress('0177.01', flags=INET_ATON) == IPAddress('127.0.0.1') assert IPAddress('0x7f.0.01', flags=INET_ATON) == IPAddress('127.0.0.1') # Partial addresses - pretty weird, but valid ... assert IPAddress('127', flags=INET_ATON) == IPAddress('0.0.0.127') assert IPAddress('127', flags=INET_ATON) == IPAddress('0.0.0.127') assert IPAddress('127.1', flags=INET_ATON) == IPAddress('127.0.0.1') assert IPAddress('127.0.1', flags=INET_ATON) == IPAddress('127.0.0.1') @pytest.mark.parametrize( 'address', [ '0177.01', '0x7f.0.01', '10', '10.1', '10.0.1', '010.0.0.1', '10.01.0.1', '10.0.00.1', '10.0.1.01', ], ) def test_ipaddress_inet_pton_constructor_v4_rejects_invalid_input(address): with pytest.raises(AddrFormatError): IPAddress(address, flags=INET_PTON) with pytest.raises(AddrFormatError): IPAddress(address) def test_ipaddress_inet_pton_constructor_v4_accepts_valid_input(): assert IPAddress('10.0.0.1', flags=INET_PTON) == IPAddress('10.0.0.1') def test_ipaddress_constructor_zero_filled_octets_v4(): assert IPAddress('010.000.000.001', flags=INET_ATON) == IPAddress('8.0.0.1') assert IPAddress('010.000.000.001', flags=INET_ATON | ZEROFILL) == IPAddress('10.0.0.1') assert IPAddress('010.000.001', flags=INET_ATON | ZEROFILL) == IPAddress('10.0.0.1') with pytest.raises(AddrFormatError): assert IPAddress('010.000.001', flags=ZEROFILL) with pytest.raises(AddrFormatError): assert IPAddress('010.000.001', flags=INET_PTON | ZEROFILL) assert IPAddress('010.000.000.001', flags=INET_PTON | ZEROFILL) == IPAddress('10.0.0.1') def test_ipnetwork_constructor_v4(): assert IPNetwork('192.0.2.0/24') == IPNetwork('192.0.2.0/24') assert IPNetwork('192.0.2.0/255.255.255.0') == IPNetwork('192.0.2.0/24') assert IPNetwork('192.0.2.0/0.0.0.255') == IPNetwork('192.0.2.0/24') assert IPNetwork(IPNetwork('192.0.2.0/24')) == IPNetwork('192.0.2.0/24') assert IPNetwork(IPNetwork('192.0.2.0/24')) == IPNetwork('192.0.2.0/24') def test_ipnetwork_bad_string_constructor(): with pytest.raises(AddrFormatError): IPNetwork('foo') def test_ipnetwork_expand_partial_v4(): with pytest.raises(AddrFormatError): IPNetwork('10/8') assert IPNetwork('10/8', expand_partial=True) == IPNetwork('10.0.0.0/8') assert IPNetwork('10.20/16', expand_partial=True) == IPNetwork('10.20.0.0/16') assert IPNetwork('10.20.30/24', expand_partial=True) == IPNetwork('10.20.30.0/24') def test_ipaddress_netmask_v4(): assert IPAddress('0.0.0.0').netmask_bits() == 0 assert IPAddress('128.0.0.0').netmask_bits() == 1 assert IPAddress('255.0.0.0').netmask_bits() == 8 assert IPAddress('255.255.0.0').netmask_bits() == 16 assert IPAddress('255.255.255.0').netmask_bits() == 24 assert IPAddress('255.255.255.254').netmask_bits() == 31 assert IPAddress('255.255.255.255').netmask_bits() == 32 assert IPAddress('1.1.1.1').netmask_bits() == 32 def test_ipaddress_hex_format(): assert hex(IPAddress(0)) == '0x0' assert hex(IPAddress(0xFFFFFFFF)) == '0xffffffff' def test_ipaddress_oct_format(): assert oct(IPAddress(0xFFFFFFFF)) == '0o37777777777' assert oct(IPAddress(0)) == '0o0' def test_multicast_info(): ip = IPAddress('224.0.1.173') assert ip.info.IPv4[0].designation == 'Multicast' assert ip.info.IPv4[0].prefix == '224/8' assert ip.info.IPv4[0].status == 'Reserved' assert ip.info.Multicast[0].address == '224.0.1.173' def test_ipaddress_pickling_v4(): ip = IPAddress(3221225985) assert ip == IPAddress('192.0.2.1') buf = pickle.dumps(ip) ip2 = pickle.loads(buf) assert ip2 == ip assert id(ip2) != id(ip) assert ip2.value == 3221225985 assert ip2.version == 4 def test_ipnetwork_pickling_v4(): cidr = IPNetwork('192.0.2.0/24') assert cidr == IPNetwork('192.0.2.0/24') buf = pickle.dumps(cidr) cidr2 = pickle.loads(buf) assert cidr2 == cidr assert id(cidr2) != id(cidr) assert cidr2.value == 3221225984 assert cidr2.prefixlen == 24 assert cidr2.version == 4 def test_ipnetwork_incrementing_by_int(): ip = IPNetwork('192.0.2.0/28') results = [] for i in range(16): results.append(str(ip)) ip += 1 assert results == [ '192.0.2.0/28', '192.0.2.16/28', '192.0.2.32/28', '192.0.2.48/28', '192.0.2.64/28', '192.0.2.80/28', '192.0.2.96/28', '192.0.2.112/28', '192.0.2.128/28', '192.0.2.144/28', '192.0.2.160/28', '192.0.2.176/28', '192.0.2.192/28', '192.0.2.208/28', '192.0.2.224/28', '192.0.2.240/28', ] def test_rfc3021_subnets(): # Tests for /31 subnet assert IPNetwork('192.0.2.0/31').network == IPAddress('192.0.2.0') assert IPNetwork('192.0.2.0/31').broadcast is None assert list(IPNetwork('192.0.2.0/31').iter_hosts()) == [ IPAddress('192.0.2.0'), IPAddress('192.0.2.1'), ] # Tests for /32 subnet assert IPNetwork('192.0.2.0/32').network == IPAddress('192.0.2.0') assert IPNetwork('192.0.2.0/32').broadcast is None assert list(IPNetwork('192.0.2.0/32').iter_hosts()) == [IPAddress('192.0.2.0')] def test_ipnetwork_change_prefixlen(): ip = IPNetwork('192.168.0.0/16') assert ip.prefixlen == 16 ip.prefixlen = 8 assert ip.prefixlen == 8 ip = IPNetwork('dead:beef::/16') assert ip.prefixlen == 16 ip.prefixlen = 64 assert ip.prefixlen == 64 def test_ipnetwork_change_netmask(): ip = IPNetwork('192.168.0.0/16') ip.netmask = '255.0.0.0' assert ip.prefixlen == 8 ip = IPNetwork('dead:beef::/16') ip.netmask = 'ffff:ffff:ffff:ffff::' assert ip.prefixlen == 64 def test_spanning_cidr_handles_strings(): # This that a regression introduced in 0fda41a is fixed. The regression caused an error when str # addresses were passed to the function. addresses = [ IPAddress('10.0.0.1'), IPAddress('10.0.0.2'), '10.0.0.3', '10.0.0.4', ] assert spanning_cidr(addresses) == IPNetwork('10.0.0.0/29') assert spanning_cidr(reversed(addresses)) == IPNetwork('10.0.0.0/29') def test_ipnetwork_nohost(): assert IPNetwork(IPNetwork('192.168.0.1/24'), flags=NOHOST).ip == IPAddress('192.168.0.0')