a
    ńń"hIå ć                   @   sb  d Z ddlZddlZddlZddlZddlZddlZddlZddlm	Z	m
Z
 G dd dejZG dd dZG dd	 d	eZG d
d deZG dd deeZG dd deeZG dd deZG dd deeZG dd deeZG dd deZG dd deeZG dd deeZG dd deZG dd dejZG d d! d!ejZed"kr^e ”  dS )#zUnittest for ipaddress module.é    N)ŚLARGESTŚSMALLESTc                   @   s>   e Zd Zedd Zejdd Zdd Zdd Z	d	d
 Z
dS )ŚBaseTestCasec                 C   s   t d S ©N)ŚNotImplementedError©Śself© r	   ś;/opt/python-3.9.21/usr/lib/python3.9/test/test_ipaddress.pyŚfactory$   s    zBaseTestCase.factoryc                 g   s`   |r|| }|   ||”}|}|V  W d   n1 s80    Y  |jjdur\|  |jj” dS )z{
        Ensure exception does not display a context by default

        Wraps unittest.TestCase.assertRaisesRegex
        N)ZassertRaisesRegexŚ	exceptionŚ__context__Ś
assertTrueŚ__suppress_context__)r   Śexc_typeŚdetailsŚargsŚcmŚexcr	   r	   r
   ŚassertCleanError(   s    $zBaseTestCase.assertCleanErrorc                 G   s   | j tj|g|¢R  S )z Ensure a clean AddressValueError)r   Ś	ipaddressŚAddressValueError©r   r   r   r	   r	   r
   ŚassertAddressError8   s
    ’’zBaseTestCase.assertAddressErrorc                 G   s   | j tj|g|¢R  S )z Ensure a clean NetmaskValueError)r   r   ŚNetmaskValueErrorr   r	   r	   r
   ŚassertNetmaskError=   s
    ’’zBaseTestCase.assertNetmaskErrorc                 C   s   |   |  |”|  |”” dS )z8Check constructor arguments produce equivalent instancesN)ŚassertEqualr   ©r   ŚlhsŚrhsr	   r	   r
   ŚassertInstancesEqualB   s    z!BaseTestCase.assertInstancesEqualN)Ś__name__Ś
__module__Ś__qualname__Śpropertyr   Ś
contextlibŚcontextmanagerr   r   r   r    r	   r	   r	   r
   r      s   

r   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
ŚCommonTestMixinc                 C   s8   |   d” |  d” W d    n1 s*0    Y  d S )NśAddress cannot be emptyŚ ©r   r   r   r	   r	   r
   Śtest_empty_addressI   s    z"CommonTestMixin.test_empty_addressc                 C   sB   |   t td”” |  d” W d    n1 s40    Y  d S )Nz1.0g      š?)r   ŚreŚescapeŚreprr   r   r	   r	   r
   Śtest_floats_rejectedM   s    z$CommonTestMixin.test_floats_rejectedc                 C   sB   |   ttj|  d”” |   tt|  d”” |   tt|  d”” d S )Né   )ŚassertRaisesŚ	TypeErrorŚoperatorŚindexr   ŚhexŚbytesr   r	   r	   r
   Śtest_not_an_index_issue15559Q   s    z,CommonTestMixin.test_not_an_index_issue15559c              	   C   sl   t tjd D ]X}| j|d8 |  |”}t t ||””}|  ||” W d    q1 s\0    Y  qd S )Nr0   )Śproto)ŚrangeŚpickleŚHIGHEST_PROTOCOLŚsubTestr   ŚloadsŚdumpsr   )r   Śaddrr8   ŚxŚyr	   r	   r
   Śpickle_testX   s
    
zCommonTestMixin.pickle_testN)r!   r"   r#   r+   r/   r7   rB   r	   r	   r	   r
   r'   G   s   r'   c                   @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )ŚCommonTestMixin_v4c              
   C   sz   d}g d¢}|D ]d}| j |dD |  |” |  |” W d    n1 sL0    Y  W d    q1 sj0    Y  qd S )Nz(Leading zeros are not permitted in '\d+')	z000.000.000.000ś192.168.000.001z016.016.016.016rD   z001.000.008.016z	01.2.3.40z	1.02.3.40z	1.2.03.40z	1.2.3.040)Śaddress)r<   r   r   )r   ŚmsgŚ	addressesrE   r	   r	   r
   Śtest_leading_zerosb   s    z%CommonTestMixin_v4.test_leading_zerosc                 C   s   |   dd” |   dd” d S )Nr   ś0.0.0.0ģ    P ś192.168.0.1©r    r   r	   r	   r
   Śtest_intu   s    zCommonTestMixin_v4.test_intc                 C   s(   |   t d”d” |   t d”d” d S )NŚ00000000rI   Śc0a80001rK   )r    r6   Śfromhexr   r	   r	   r
   Śtest_packedy   s    zCommonTestMixin_v4.test_packedc                 C   sB   d}|   t |”” |  d” W d    n1 s40    Y  d S )Nz,-1 (< 0) is not permitted as an IPv4 addressé’’’’©r   r,   r-   r   ©r   rF   r	   r	   r
   Śtest_negative_ints_rejected}   s    z.CommonTestMixin_v4.test_negative_ints_rejectedc                 C   sF   d}|   t |d ”” |  d” W d    n1 s80    Y  d S )Nz1%d (>= 2**32) is not permitted as an IPv4 addressl        rS   rT   r	   r	   r
   Śtest_large_ints_rejected   s    z+CommonTestMixin_v4.test_large_ints_rejectedc                    s     fdd}|d |d d S )Nc                    sR   d|  }d}   t ||| f ””   |” W d    n1 sD0    Y  d S )Nó    z4%r (len %d != 4) is not permitted as an IPv4 addressrS   ©Ślengthr?   rF   r   r	   r
   ŚassertBadLength   s    zBCommonTestMixin_v4.test_bad_packed_length.<locals>.assertBadLengthé   é   r	   ©r   rZ   r	   r   r
   Śtest_bad_packed_length   s    z)CommonTestMixin_v4.test_bad_packed_lengthN)	r!   r"   r#   rH   rM   rQ   rU   rV   r^   r	   r	   r	   r
   rC   `   s   rC   c                   @   sL   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dS )ŚCommonTestMixin_v6c                 C   s   |   dd” |   dd” d S )Nz
0000::0000ś::z000::c0a8:0001ś::c0a8:1rL   r   r	   r	   r
   rH      s    z%CommonTestMixin_v6.test_leading_zerosc                 C   s   |   dd” |   dd” d S )Nr   r`   rJ   ra   rL   r   r	   r	   r
   rM      s    zCommonTestMixin_v6.test_intc                 C   sR   dt  d” }|  |d” dt  d” }|  |d” t  d”d }|  |d” d S )Ns               rN   r`   rO   ra   zc0a8:1::)r6   rP   r    ©r   r?   r	   r	   r
   rQ      s    zCommonTestMixin_v6.test_packedc                 C   sB   d}|   t |”” |  d” W d    n1 s40    Y  d S )Nz,-1 (< 0) is not permitted as an IPv6 addressrR   rS   rT   r	   r	   r
   rU   ¤   s    z.CommonTestMixin_v6.test_negative_ints_rejectedc                 C   sN   d}|   t |dd  ”” |  dd ” W d    n1 s@0    Y  d S )Nz2%d (>= 2**128) is not permitted as an IPv6 addressé   é   rS   rT   r	   r	   r
   rV   ©   s    z+CommonTestMixin_v6.test_large_ints_rejectedc                    s     fdd}|d |d d S )Nc                    s\   d|  }d}   t ||| f ””$   |”   |” W d    n1 sN0    Y  d S )NrW   z5%r (len %d != 16) is not permitted as an IPv6 addressrS   rX   r   r	   r
   rZ   Æ   s
    
zBCommonTestMixin_v6.test_bad_packed_length.<locals>.assertBadLengthé   é   r	   r]   r	   r   r
   r^   ®   s    z)CommonTestMixin_v6.test_bad_packed_lengthc                 C   s>   d}|   d|” |  |” W d    n1 s00    Y  d S )Nz::1%śInvalid IPv6 address: "%r"r*   ©r   rE   r	   r	   r
   Śtest_blank_scope_id¹   s    z&CommonTestMixin_v6.test_blank_scope_idc                 C   s>   d}|   d|” |  |” W d    n1 s00    Y  d S )Nz
::1%scope%rg   r*   rh   r	   r	   r
   Ś"test_invalid_scope_id_with_percent¾   s    z5CommonTestMixin_v6.test_invalid_scope_id_with_percentN)r!   r"   r#   rH   rM   rQ   rU   rV   r^   ri   rj   r	   r	   r	   r
   r_      s   r_   c                   @   sZ   e Zd ZejZdd Zdd Zdd Zdd Z	d	d
 Z
dd Zdd Zdd Zdd ZdS )ŚAddressTestCase_v4c                 C   s6   t  d”}g d¢}|D ]\}}|  |t||” qd S )Nś1.2.3.42))ŚbŚ 00000001000000100000001100101010)Śnrn   )r@   Z0102032a)ŚXZ0102032A)Ś_bŚ'0000_0001_0000_0010_0000_0011_0010_1010)Ś_nrr   )Ś_xZ	0102_032a)Ś_XZ	0102_032A)ś#bŚ"0b00000001000000100000001100101010)ś#nrw   )ś#xZ
0x0102032a)ś#XZ
0X0102032A)ś#_bŚ)0b0000_0001_0000_0010_0000_0011_0010_1010)ś#_nr|   )ś#_xZ0x0102_032a)ś#_XZ0X0102_032A)Śsrl   )r)   rl   )r   ŚIPv4Addressr   Śformat)r   Zv4Zv4_pairsŚfmtŚtxtr	   r	   r
   Śtest_formatĘ   s    
zAddressTestCase_v4.test_formatc                 C   s>   d}|   d|” t |” W d    n1 s00    Y  d S )Nz127.0.0.1/24śUnexpected '/' in %r©r   r   r   rb   r	   r	   r
   Śtest_network_passed_as_addressß   s    z1AddressTestCase_v4.test_network_passed_as_addressc                    sČ    fdd}|d |d |d |d |d |d |d	 |d
 |d |d |d |d |d |d |d |d |d |d |d |d |d |d |d d S )Nc                    s:      d| ” t | ” W d    n1 s,0    Y  d S )NzExpected 4 octets in %rr   ©r?   r   r	   r
   ŚassertBadSplitå   s    zAAddressTestCase_v4.test_bad_address_split.<locals>.assertBadSplitz127.0.1z42.42.42.42.42z42.42.42z42.42Z42z42..42.42.42z42.42.42.42.z42.42.42.42...z.42.42.42.42z...42.42.42.42z016.016.016z016.016Z016Z000z0x0a.0x0a.0x0az	0x0a.0x0aŚ0x0aŚ.Śbogusz	bogus.comZ1000Z1000000000000000z192.168.0.1.comr	   ©r   r   r	   r   r
   Śtest_bad_address_splitä   s0    z)AddressTestCase_v4.test_bad_address_splitc                    s     fdd}|d |d d S )Nc                    s:      d| ” t | ” W d    n1 s,0    Y  d S )NzEmpty octet not permitted in %rr   r   r   r	   r
   ŚassertBadOctet  s    ’z;AddressTestCase_v4.test_empty_octet.<locals>.assertBadOctetz	42..42.42z...r	   ©r   r   r	   r   r
   Śtest_empty_octet  s    z#AddressTestCase_v4.test_empty_octetc                    sj    fdd}|dd |dd |dd |d	d
 |dd |dd |dd |dd |dd d S )Nc                    sJ   d|| f }   t |”” t | ” W d    n1 s<0    Y  d S )Nz)Only decimal digits permitted in %r in %r©r   r,   r-   r   r   ©r?   ZoctetrF   r   r	   r
   r     s    zBAddressTestCase_v4.test_invalid_characters.<locals>.assertBadOctetz0x0a.0x0a.0x0a.0x0ar   z0xa.0x0a.0x0a.0x0aZ0xaz42.42.42.-0ś-0z42.42.42.+0ś+0z42.42.42.-42z-42z
+1.+2.+3.4ś+1z	1.2.3.4e0Z4e0ś	1.2.3.4::z4::ś1.a.2.3Śar	   r   r	   r   r
   Śtest_invalid_characters
  s    







z*AddressTestCase_v4.test_invalid_charactersc                    s$    fdd}|dd |dd d S )Nc                    sJ   d}   t ||| f ”” t | ” W d    n1 s<0    Y  d S )Nz*At most 3 characters permitted in %r in %rr   r   r   r	   r
   r     s    z<AddressTestCase_v4.test_octet_length.<locals>.assertBadOctetz0000.000.000.000Z0000z12345.67899.-54321.-98765Z12345r	   r   r	   r   r
   Śtest_octet_length  s    
z$AddressTestCase_v4.test_octet_lengthc                    s$    fdd}|dd |dd d S )Nc                    sJ   d|| f }   t |”” t | ” W d    n1 s<0    Y  d S )Nz$Octet %d (> 255) not permitted in %rr   r   r   r	   r
   r   $  s    z;AddressTestCase_v4.test_octet_limit.<locals>.assertBadOctetz	257.0.0.0i  z192.168.0.999iē  r	   r   r	   r   r
   Śtest_octet_limit#  s    
z#AddressTestCase_v4.test_octet_limitc                 C   s   |   d” d S ©Nś	192.0.2.1©rB   r   r	   r	   r
   Śtest_pickle,  s    zAddressTestCase_v4.test_picklec                 C   s   t  |  d”” d S r   ©ŚweakrefŚrefr   r   r	   r	   r
   Śtest_weakref/  s    zAddressTestCase_v4.test_weakrefN)r!   r"   r#   r   r   r   r   r   r   r   r   r   r   r”   r„   r	   r	   r	   r
   rk   Ć   s   			rk   c                   @   s   e Zd ZejZdd Zdd Zdd Zdd Z	d	d
 Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZdS )ŚAddressTestCase_v6c                 C   s6   t  d”}g d¢}|D ]\}}|  |t||” qd S )Nz
::1.2.3.42))rm   Z00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000100000001100101010)ro   Ś 0000000000000000000000000102032a)r@   r§   )rp   Z 0000000000000000000000000102032A)rq   Z0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0001_0000_0010_0000_0011_0010_1010)rs   Ś'0000_0000_0000_0000_0000_0000_0102_032a)rt   rØ   )ru   Z'0000_0000_0000_0000_0000_0000_0102_032A)rv   Z0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000100000001100101010)rx   Ś"0x0000000000000000000000000102032a)ry   r©   )rz   Z"0X0000000000000000000000000102032A)r{   Z”0b0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0001_0000_0010_0000_0011_0010_1010)r}   Ś)0x0000_0000_0000_0000_0000_0000_0102_032a)r~   rŖ   )r   Z)0X0000_0000_0000_0000_0000_0000_0102_032A)r   ś	::102:32a)r)   r«   )r   ŚIPv6Addressr   r   )r   Zv6Zv6_pairsr   r   r	   r	   r
   r   6  s    
#zAddressTestCase_v6.test_formatc                    s     fdd}|d |d d S )Nc                    s>   d}   || ” t | ” W d    n1 s00    Y  d S )Nr   )r   r   r¬   ©r?   rF   r   r	   r
   r   `  s    zIAddressTestCase_v6.test_network_passed_as_address.<locals>.assertBadSplitz::1/24z::1%scope_id/24r	   r   r	   r   r
   r   _  s    z1AddressTestCase_v6.test_network_passed_as_addressc                    s@    fdd}|d |d |d |d |d |d d S )	Nc                    sH   d}   ||  d”d ” t | ” W d    n1 s:0    Y  d S )NzAt least 3 parts expected in %rś%r   ©r   Śsplitr   r¬   r­   r   r	   r
   r   h  s    zUAddressTestCase_v6.test_bad_address_split_v6_not_enough_parts.<locals>.assertBadSplitś:z:1z	FEDC:9878z:%scopez:1%scopezFEDC:9878%scoper	   r   r	   r   r
   Ś*test_bad_address_split_v6_not_enough_partsg  s    z=AddressTestCase_v6.test_bad_address_split_v6_not_enough_partsc                    s`    fdd}|d |d |d |d |d |d |d	 |d
 |d |d d S )Nc                    sH   d}   ||  d”d ” t | ” W d    n1 s:0    Y  d S )Nz At most 8 colons permitted in %rr®   r   rÆ   r­   r   r	   r
   r   u  s    zTAddressTestCase_v6.test_bad_address_split_v6_too_many_colons.<locals>.assertBadSplitz9:8:7:6:5:4:3::2:1z10:9:8:7:6:5:4:3:2:1z::8:7:6:5:4:3:2:1z8:7:6:5:4:3:2:1::z10:9:8:7:6:5:4:3:42.42.42.42z9:8:7:6:5:4:3::2:1%scopez10:9:8:7:6:5:4:3:2:1%scopez::8:7:6:5:4:3:2:1%scopez8:7:6:5:4:3:2:1::%scopez"10:9:8:7:6:5:4:3:42.42.42.42%scoper	   r   r	   r   r
   Ś)test_bad_address_split_v6_too_many_colonst  s    z<AddressTestCase_v6.test_bad_address_split_v6_too_many_colonsc                    s`    fdd}|d |d |d |d |d |d |d	 |d
 |d |d d S )Nc                    sH   d}   ||  d”d ” t | ” W d    n1 s:0    Y  d S )Nz+Exactly 8 parts expected without '::' in %rr®   r   rÆ   r­   r   r	   r
   r     s    zSAddressTestCase_v6.test_bad_address_split_v6_too_many_parts.<locals>.assertBadSplitz3ffe:0:0:0:0:0:0:0:1z9:8:7:6:5:4:3:2:1z7:6:5:4:3:2:1z9:8:7:6:5:4:3:42.42.42.42z7:6:5:4:3:42.42.42.42z3ffe:0:0:0:0:0:0:0:1%scopez9:8:7:6:5:4:3:2:1%scopez7:6:5:4:3:2:1%scopez9:8:7:6:5:4:3:42.42.42.42%scopez7:6:5:4:3:42.42.42.42%scoper	   r   r	   r   r
   Ś(test_bad_address_split_v6_too_many_parts  s    z;AddressTestCase_v6.test_bad_address_split_v6_too_many_partsc                    s     fdd}|d |d d S )Nc                    sH   d}   ||  d”d ” t | ” W d    n1 s:0    Y  d S )Nz.Expected at most 7 other parts with '::' in %rr®   r   rÆ   r­   r   r	   r
   r     s    zeAddressTestCase_v6.test_bad_address_split_v6_too_many_parts_with_double_colon.<locals>.assertBadSplitz1:2:3:4::5:6:7:8z1:2:3:4::5:6:7:8%scoper	   r   r	   r   r
   Ś:test_bad_address_split_v6_too_many_parts_with_double_colon  s    zMAddressTestCase_v6.test_bad_address_split_v6_too_many_parts_with_double_colonc                    s°    fdd}|d |d |d |d |d |d |d	 |d
 |d |d |d |d |d |d |d |d |d |d |d |d d S )Nc                    sH   d}   ||  d”d ” t | ” W d    n1 s:0    Y  d S )Nz At most one '::' permitted in %rr®   r   rÆ   r­   r   r	   r
   r   ¦  s    zZAddressTestCase_v6.test_bad_address_split_v6_repeated_double_colon.<locals>.assertBadSplitz
3ffe::1::1z1::2::3::4:5z2001::db:::1z	3ffe::1::z	::3ffe::1z:3ffe::1::1z3ffe::1::1:z:3ffe::1::1:z:::z2001:db8:::1z3ffe::1::1%scopez1::2::3::4:5%scopez2001::db:::1%scopez3ffe::1::%scopez::3ffe::1%scopez:3ffe::1::1%scopez3ffe::1::1:%scopez:3ffe::1::1:%scopez	:::%scopez2001:db8:::1%scoper	   r   r	   r   r
   Ś/test_bad_address_split_v6_repeated_double_colon„  s*    zBAddressTestCase_v6.test_bad_address_split_v6_repeated_double_colonc                    sP    fdd}|d |d |d |d |d |d |d	 |d
 d S )Nc                    sH   d}   ||  d”d ” t | ” W d    n1 s:0    Y  d S )Nz0Leading ':' only permitted as part of '::' in %rr®   r   rÆ   r­   r   r	   r
   r   Ā  s    zRAddressTestCase_v6.test_bad_address_split_v6_leading_colon.<locals>.assertBadSplitz:2001:db8::1z:1:2:3:4:5:6:7z:1:2:3:4:5:6:z:6:5:4:3:2:1::z:2001:db8::1%scopez:1:2:3:4:5:6:7%scopez:1:2:3:4:5:6:%scopez:6:5:4:3:2:1::%scoper	   r   r	   r   r
   Ś'test_bad_address_split_v6_leading_colonĮ  s    z:AddressTestCase_v6.test_bad_address_split_v6_leading_colonc                    sP    fdd}|d |d |d |d |d |d |d	 |d
 d S )Nc                    sH   d}   ||  d”d ” t | ” W d    n1 s:0    Y  d S )Nz1Trailing ':' only permitted as part of '::' in %rr®   r   rÆ   r­   r   r	   r
   r   Ņ  s    zSAddressTestCase_v6.test_bad_address_split_v6_trailing_colon.<locals>.assertBadSplitz2001:db8::1:z1:2:3:4:5:6:7:z
::1.2.3.4:z::7:6:5:4:3:2:z2001:db8::1:%scopez1:2:3:4:5:6:7:%scopez::1.2.3.4:%scopez::7:6:5:4:3:2:%scoper	   r   r	   r   r
   Ś(test_bad_address_split_v6_trailing_colonŃ  s    z;AddressTestCase_v6.test_bad_address_split_v6_trailing_colonc                    st    fdd}|dd |dd |dd |d	d
 |dd |dd |dd |dd |dd
 |dd d S )Nc                    sF      d||  d”d ” t | ” W d    n1 s80    Y  d S )Nz%s in %rr®   r   rÆ   )r?   Zv4_errorr   r	   r
   ŚassertBadAddressPartā  s    zDAddressTestCase_v6.test_bad_v4_part_in.<locals>.assertBadAddressPartz3ffe::1.netzExpected 4 octets in '1.net'z3ffe::127.0.1zExpected 4 octets in '127.0.1'z::1.2.3zExpected 4 octets in '1.2.3'z::1.2.3.4.5z Expected 4 octets in '1.2.3.4.5'z3ffe::1.1.1.netz5Only decimal digits permitted in 'net' in '1.1.1.net'z3ffe::1.net%scopez3ffe::127.0.1%scopez::1.2.3%scopez::1.2.3.4.5%scopez3ffe::1.1.1.net%scoper	   )r   r¹   r	   r   r
   Śtest_bad_v4_part_inį  s6    
’’’’
’’’’z&AddressTestCase_v6.test_bad_v4_part_inc                    s    fdd}|dd |dd |dd |d	d
 |dd |dd |dd |dd |dd |dd
 |dd |dd d S )Nc                    sT   d||   d”d f }  t |”” t | ” W d    n1 sF0    Y  d S )Nz%Only hex digits permitted in %r in %rr®   r   )r°   r   r,   r-   r   r¬   ©r?   ŚpartrF   r   r	   r
   ŚassertBadPartż  s    zAAddressTestCase_v6.test_invalid_characters.<locals>.assertBadPartz
3ffe::googZgoogz3ffe::-0r   z3ffe::+0r   z3ffe::-1ś-1r   ś1.2.3.4ś1234:axy::bZaxyz3ffe::goog%scopez3ffe::-0%scopez3ffe::+0%scopez3ffe::-1%scopez1.2.3.4::%scopeś1234:axy::b%scoper	   ©r   r½   r	   r   r
   r   ü  s    










z*AddressTestCase_v6.test_invalid_charactersc                    s`    fdd}|dd |dd |dd |d	d
 |dd |dd |dd |dd
 d S )Nc                    sJ   d}   |||  d”d ” t | ” W d    n1 s<0    Y  d S )Nz*At most 4 characters permitted in %r in %rr®   r   rÆ   r»   r   r	   r
   r½     s    z:AddressTestCase_v6.test_part_length.<locals>.assertBadPartz::00000Z00000z3ffe::10000Z10000z02001:db8::Z02001z2001:888888::1Z888888z::00000%scopez3ffe::10000%scopez02001:db8::%scopez2001:888888::1%scoper	   rĀ   r	   r   r
   Śtest_part_length  s    






z#AddressTestCase_v6.test_part_lengthc                 C   s   |   d” d S )Nś
2001:db8::r    r   r	   r	   r
   r”      s    zAddressTestCase_v6.test_picklec                 C   s$   t  |  d”” t  |  d”” d S )NrÄ   ś2001:db8::%scoper¢   r   r	   r	   r
   r„   #  s    zAddressTestCase_v6.test_weakrefN)r!   r"   r#   r   r¬   r   r   r   r²   r³   r“   rµ   r¶   r·   rø   rŗ   r   rĆ   r”   r„   r	   r	   r	   r
   r¦   3  s   )	r¦   c                   @   sH   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dS )ŚNetmaskTestMixin_v4ś;Input validation on interfaces and networks is very similarc                 C   sL   dD ]B}|   |”}|  t|d” |  t|jd” |  t|jd” qd S )N)ræ   éó   ś
1.2.3.4/32ś255.255.255.255rI   ©r   r   ŚstrŚnetmaskŚhostmask)r   rE   Śnetr	   r	   r
   Śtest_no_mask+  s
    
z NetmaskTestMixin_v4.test_no_maskc                 C   s@   d}|   d| ” |  |” W d    n1 s20    Y  d S )Nz1.2.3.4/32/24śOnly one '/' permitted in %rr*   rb   r	   r	   r
   Śtest_split_netmask4  s    z&NetmaskTestMixin_v4.test_split_netmaskc                    s\    fdd}|dd |dd |dd |dd |d	d |d
d |dt  d” d S )Nc                    s8      |”   | ” W d    n1 s*0    Y  d S r   r*   ©r?   r   r   r	   r
   ŚassertBadAddress:  s    zANetmaskTestMixin_v4.test_address_errors.<locals>.assertBadAddressś/r(   ś/8r   zExpected 4 octetsś
google.comś10/8ś	::1.2.3.4zOnly decimal digitsz	1.2.3.256z256 (> 255))r,   r-   ©r   rÕ   r	   r   r
   Śtest_address_errors9  s    





z'NetmaskTestMixin_v4.test_address_errorsc                 C   sō   |   t|  d”d” |   t|  d”d” |   t|  d”d” |   t|  d”d” tddD ]}d| }|  |”}|   t||” |   t|  d	|j ”|” |   t|  d
| ”|” |dv rŅdd|  }|   t|  d	|j ”|” qbd S )N©ś	192.0.2.0é   ś192.0.2.0/24)rŽ   Z24©rŽ   ś255.255.255.0z192.0.2.0/255.255.255.0r   é!   z
0.0.0.0/%dz
0.0.0.0/%sz0.0.0.0/0%d)é    r   rä   )r   rĶ   r   r9   rĪ   rĻ   )r   ŚiŚnet_strrŠ   r	   r	   r
   Śtest_valid_netmaskF  s*    ’’
’’z&NetmaskTestMixin_v4.test_valid_netmaskc                    s    fdd}|dd |dd |dd |dd |dd |dd	 |dd
 |dd |dd |dd |dd |dd |dd |dd d S )Nc                    sN   d| }   t |””"   d| |f ” W d    n1 s@0    Y  d S ©Nś%r is not a valid netmaskz%s/%s©r   r,   r-   r   ©r?   rĪ   rF   r   r	   r
   ŚassertBadNetmask_  s    zANetmaskTestMixin_v4.test_netmask_errors.<locals>.assertBadNetmaskræ   r)   r¾   r   ś 1 Ś0x1Z33z254.254.255.256r   ś1.1.1.1z254.xyz.2.3z240.255.0.0z255.254.128.0z0.1.127.255Śpuddingr`   r	   ©r   rģ   r	   r   r
   Śtest_netmask_errors^  s    












z'NetmaskTestMixin_v4.test_netmask_errorsc                    s$    fdd}|dd |dd d S )Nc                    sJ   d| }   t |””   | |f” W d    n1 s<0    Y  d S ©Nré   rź   rė   r   r	   r
   rģ   t  s    zJNetmaskTestMixin_v4.test_netmask_in_tuple_errors.<locals>.assertBadNetmaskrļ   rR   rć   r	   rń   r	   r   r
   Śtest_netmask_in_tuple_errorss  s    
z0NetmaskTestMixin_v4.test_netmask_in_tuple_errorsc                 C   s"   |   d” |   d” |   d” d S )Nz192.0.2.0/27z192.0.2.0/31rŽ   r    r   r	   r	   r
   r”   {  s    

zNetmaskTestMixin_v4.test_pickleN©r!   r"   r#   Ś__doc__rŃ   rÓ   rÜ   rē   rņ   rō   r”   r	   r	   r	   r
   rĘ   (  s   	rĘ   c                   @   s   e Zd ZejZdS )ŚInterfaceTestCase_v4N)r!   r"   r#   r   ŚIPv4Interfacer   r	   r	   r	   r
   r÷     s   r÷   c                   @   s*   e Zd ZejZdd Zdd Zdd ZdS )ŚNetworkTestCase_v4c                 C   st   |   |  d” |  d””” |  |  d” |  d””” |   |  d” |  d””” |   |  d” |  d””” d S ©Nś10.0.0.0/30z10.0.1.0/24z10.0.0.0/24©ŚassertFalser   Ś	subnet_ofr   r   r	   r	   r
   Śtest_subnet_of  s(    
’’
’’
’’
’’z!NetworkTestCase_v4.test_subnet_ofc                 C   st   |   |  d” |  d””” |   |  d” |  d””” |   |  d” |  d””” |  |  d” |  d””” d S rś   ©rż   r   Śsupernet_ofr   r   r	   r	   r
   Śtest_supernet_of  s(    
’’
’’
’’
’’z#NetworkTestCase_v4.test_supernet_ofc                 C   s  |   t”& t d” t d”” W d    n1 s60    Y  |   t”& t d” t d”” W d    n1 sv0    Y  |   t”& t d” t d”” W d    n1 s¶0    Y  |   t”& t d” t d”” W d    n1 sö0    Y  d S )Nrū   ś::1/128)r1   r2   r   ŚIPv4Networkr  ŚIPv6Networkrž   r   r	   r	   r
   Śtest_subnet_of_mixed_types¬  s     
’"
’"
’"
’z-NetworkTestCase_v4.test_subnet_of_mixed_typesN)	r!   r"   r#   r   r  r   r’   r  r  r	   r	   r	   r
   rł     s   rł   c                   @   sH   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dS )ŚNetmaskTestMixin_v6rĒ   c                 C   s   dD ]B}|   |”}|  t|d” |  t|jd” |  t|jd” q|   d”}|  t|d” |  t|jd” |  t|jd” d S )N)ś::1r0   s                  r  z'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffffr`   ś	::1%scopeś::1%scope/128rĢ   )r   rE   rŠ   Z
scoped_netr	   r	   r
   rŃ   ¾  s    

z NetmaskTestMixin_v6.test_no_maskc                 C   s|   d}|   d| ” |  |” W d    n1 s20    Y  d}|   d| ” |  |” W d    n1 sn0    Y  d S )Nzcafe:cafe::/128/190rŅ   zcafe:cafe::%scope/128/190r*   )r   r?   Zscoped_addrr	   r	   r
   rÓ   Ģ  s    (z&NetmaskTestMixin_v6.test_split_netmaskc                    s    fdd}|dd |dd |dd |dd |d	d |d
d |dd |dd |dd |dd |dd |dd d S )Nc                    s8      |”   | ” W d    n1 s*0    Y  d S r   r*   rŌ   r   r	   r
   rÕ   Ö  s    zANetmaskTestMixin_v6.test_address_errors.<locals>.assertBadAddressrÖ   r(   r×   rŲ   zAt least 3 partsræ   rŁ   rĄ   zOnly hex digitsz/%scopez/%scope8zgoogle.com%scopez1.2.3.4%scopez
10%scope/8rĮ   r	   rŪ   r	   r   r
   rÜ   Õ  s    










z'NetmaskTestMixin_v6.test_address_errorsc                 C   sģ   |   t|  d”d” |   t|  d”d” |   t|  d”d” tddD ]<}d| }|   t|  |”|” |   t|  d| ”|” qL|   t|  d”d” tddD ]<}d| }|   t|  |”|” |   t|  d| ”|” qŖd S )	N)rÄ   rä   ś2001:db8::/32)rÄ   Z32r   é   z::/%dz::/0%dz2001:db8::%scope/32)r   rĶ   r   r9   )r   rå   rę   r	   r	   r
   rē   č  s     ’’z&NetmaskTestMixin_v6.test_valid_netmaskc                    s    fdd}|dd |dd |dd |dd |dd |dd |dd	 |dd
 |dd |dd |dd |dd d S )Nc                    sN   d| }   t |””"   d| |f ” W d    n1 s@0    Y  d S rč   rź   rė   r   r	   r
   rģ      s    zANetmaskTestMixin_v6.test_netmask_errors.<locals>.assertBadNetmaskr  r)   ś1::r¾   r   rķ   rī   Z129ræ   rš   r`   r	  r	   rń   r	   r   r
   rņ   ’  s    










z'NetmaskTestMixin_v6.test_netmask_errorsc                    s.    fdd}|dd |dd |dd d S )Nc                    sJ   d| }   t |””   | |f” W d    n1 s<0    Y  d S ró   rź   rė   r   r	   r
   rģ     s    zJNetmaskTestMixin_v6.test_netmask_in_tuple_errors.<locals>.assertBadNetmaskr  rR   r  r	  r	   rń   r	   r   r
   rō     s    

z0NetmaskTestMixin_v6.test_netmask_in_tuple_errorsc                 C   s,   |   d” |   d” |   d” |   d” d S )Nz2001:db8::1000/124z2001:db8::1000/127z2001:db8::1000z2001:db8::1000%scoper    r   r	   r	   r
   r”     s    


zNetmaskTestMixin_v6.test_pickleNrõ   r	   r	   r	   r
   r  »  s   		r  c                   @   s   e Zd ZejZdS )ŚInterfaceTestCase_v6N)r!   r"   r#   r   ŚIPv6Interfacer   r	   r	   r	   r
   r  $  s   r  c                   @   s"   e Zd ZejZdd Zdd ZdS )ŚNetworkTestCase_v6c                 C   s¬   |   |  d” |  d””” |  |  d” |  d””” |   |  d” |  d””” |   |  d” |  d””” |   |  d” |  d””” |  |  d” |  d””” d S )Nś2000:999::/56ś2000:aaa::/48ś2000:aaa::/56ś2000:bbb::/56z2000:999::%scope/56z2000:aaa::%scope/48z2000:aaa::%scope/56rü   r   r	   r	   r
   r’   +  s<    
’’
’’
’’
’’
’’
’’z!NetworkTestCase_v6.test_subnet_ofc                 C   st   |   |  d” |  d””” |   |  d” |  d””” |   |  d” |  d””” |  |  d” |  d””” d S )Nr  r  r  r  r   r   r	   r	   r
   r  D  s(    
’’
’’
’’
’’z#NetworkTestCase_v6.test_supernet_ofN)r!   r"   r#   r   r  r   r’   r  r	   r	   r	   r
   r  (  s   r  c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
ŚFactoryFunctionErrorsc                 C   sD   d}d}|   t|||” || W d   n1 s60    Y  dS )z3Ensure a clean ValueError with the expected messageZcamelotz+%r does not appear to be an IPv4 or IPv6 %sN)r   Ś
ValueError)r   r   Śkindr?   rF   r	   r	   r
   ŚassertFactoryErrorY  s    z(FactoryFunctionErrors.assertFactoryErrorc                 C   s   |   tjd” d S )NrE   )r  r   Ś
ip_addressr   r	   r	   r
   Śtest_ip_address`  s    z%FactoryFunctionErrors.test_ip_addressc                 C   s   |   tjd” d S )NZ	interface)r  r   Śip_interfacer   r	   r	   r
   Śtest_ip_interfacec  s    z'FactoryFunctionErrors.test_ip_interfacec                 C   s   |   tjd” d S )NŚnetwork)r  r   Ś
ip_networkr   r	   r	   r
   Śtest_ip_networkf  s    z%FactoryFunctionErrors.test_ip_networkN)r!   r"   r#   r  r  r  r  r	   r	   r	   r
   r  W  s   r  c                   @   s^  e Zd Ze d”Ze d”Ze d”Z	e 
d”Ze d”Ze d”Ze 
d”Ze d”Ze d”Zee	gZeeg ZeegZeeg ZeegZeeg Zee Zee Ze d”Ze d”Ze d”Ze 
d”Ze d”Ze d”Z e 
d”Z!e d”Z"e d”Z#dd Z$dd Z%d	d
 Z&dd Z'dd Z(dd Z)dd Z*dd Z+dd Z,dd Z-dd Z.dS )ŚComparisonTestsr0   r	  rc   ś	::2%scopec                 C   sT   t  }| jD ]B}|  ||” |  ||k” |  | |”t” |  | |”t” qd S r   )ŚobjectŚobjects_with_scopedŚassertNotEqualrż   r   Ś__eq__ŚNotImplementedŚ__ne__©r   ŚotherŚobjr	   r	   r
   Śtest_foreign_type_equality  s    
z*ComparisonTests.test_foreign_type_equalityc                 C   s2   | j D ]&}| j D ]}||u rq|  ||” qqd S r   )Śobjectsr$  r   r	   r	   r
   Śtest_mixed_type_equality  s
    

z(ComparisonTests.test_mixed_type_equalityc                 C   s(   t | j| jD ]\}}|  ||” qd S r   )ŚzipŚ
v6_objectsŚv6_scoped_objectsr$  r   r	   r	   r
   Śtest_scoped_ipv6_equality  s    z)ComparisonTests.test_scoped_ipv6_equalityc                 C   s(   | j D ]}| jD ]}|  ||” qqd S r   )Ś
v4_objectsr0  r$  r   r	   r	   r
   Śtest_v4_with_v6_scoped_equality   s    

z/ComparisonTests.test_v4_with_v6_scoped_equalityc                 C   s4   | j D ](}|  ||” |  ||” |  ||” qd S r   )r#  r   ŚassertLessEqualŚassertGreaterEqual©r   r*  r	   r	   r
   Śtest_same_type_equality„  s    
z'ComparisonTests.test_same_type_equalityc              
   C   są   | j | jf| j| jf| j| jf| j| jf| j| j	f| j
| jf| j| jf| j| jf| j| jff	D ]|\}}|  ||” |  ||” |  ||” |  ||” |  ||” |  ||k” |  ||k ” |  ||k” |  ||k” q^d S r   )Śv4addrŚv4addr2Śv4netŚv4net2Śv4intfŚv4intf2Śv6addrŚv6addr2Śv6netŚv6net2Śv6intfŚv6intf2Śv6addr_scopedŚv6addr2_scopedŚv6net_scopedŚv6net2_scopedŚv6intf_scopedŚv6intf2_scopedr$  Z
assertLessr4  ZassertGreaterr5  rż   r   r	   r	   r
   Śtest_same_type_ordering«  s&    








÷z'ComparisonTests.test_same_type_orderingc                 C   sŅ   | j D ]}|  || j” q| j| j D ]}|  || j” q&| j| j D ]}|  || j” qF| j| j| jg D ]}|  || j” ql| j| j| jg D ]}|  || j” q| j	| j
 | jg D ]}|  || j” qŗd S r   )Śv4_addressesŚassertInr:  Śv6_addressesŚv6_scoped_addressesr@  rF  r2  ŚassertNotInr/  r0  r6  r	   r	   r
   Śtest_containmentĮ  s    
z ComparisonTests.test_containmentc                    s   | j D ] | j D ]zt tstt r2q|  t fdd” |  t fdd” |  t fdd” |  t fdd” qqd S )Nc                      s    k S r   r	   r	   ©r   r   r	   r
   Ś<lambda>Õ  ó    z:ComparisonTests.test_mixed_type_ordering.<locals>.<lambda>c                      s    kS r   r	   r	   rQ  r	   r
   rR  Ö  rS  c                      s    kS r   r	   r	   rQ  r	   r
   rR  ×  rS  c                      s    kS r   r	   r	   rQ  r	   r
   rR  Ų  rS  )r#  Ś
isinstanceŚtyper1   r2   r   r	   rQ  r
   Śtest_mixed_type_orderingŠ  s    

z(ComparisonTests.test_mixed_type_orderingc              	   C   sP  t  }| jD ]<}|  t” ||k  W d    n1 s:0    Y  |  t” ||k W d    n1 sl0    Y  |  t” ||k W d    n1 s0    Y  |  t” ||k W d    n1 sŠ0    Y  |  |tk ” |  |tk” |  |tk” |  |tk” |  |tk ” |  |tk” |  |tk” |  |tk” qd S r   )r"  r#  r1   r2   r   r   rż   r   r(  r	   r	   r
   Śtest_foreign_type_orderingŚ  s$    &&&&z*ComparisonTests.test_foreign_type_orderingc                 C   s°   | j | j| jg}| j| j| jg}| j| j| jg}|  	|t
| jtjd” |  	|t
| jtjd” |  	|t
| jtjd” |  	|| t
| j| j tjd” |  	tt t”” d S )N)Śkey)r8  r:  r<  r>  r@  rB  rD  rF  rH  r   Śsortedr2  r   Śget_mixed_type_keyr/  r0  r&  r"  )r   Z
v4_orderedZ
v6_orderedZv6_scoped_orderedr	   r	   r
   Śtest_mixed_type_keyī  s0    ’’’’’’
’’z#ComparisonTests.test_mixed_type_keyc                 C   s@  t  d”}t  d”}t  d”}t  d”}t  d”}t  d”}|  t|j|” |  t|j|” |  t|j|” |  t|j|” |  t|j|” |  t|j|” |  t|j|” |  t|j|” |  t|j|” |  t|j|” |  t|j|” |  t|j|” |  t|j|” |  t|j|” |  t|j|” |  t|j|” d S )Nrļ   r  r	  )r   r  r  r1   r2   Ś__lt__Ś__gt__)r   r8  r:  r>  r@  rD  rF  r	   r	   r
   Śtest_incompatible_versions  s,    





z*ComparisonTests.test_incompatible_versionsN)/r!   r"   r#   r   r   r8  r  r:  rų   r<  r¬   r>  r  r@  r  rB  rD  rF  rH  rK  r2  rM  r/  rN  r0  r,  r#  r9  r;  r=  r?  rA  rC  rE  rG  rI  r+  r-  r1  r3  r7  rJ  rP  rV  rW  r[  r^  r	   r	   r	   r
   r   j  sJ   




















		
r   c                   @   sd  e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: Zd;d< Z d=d> Z!d?d@ Z"dAdB Z#dCdD Z$dEdF Z%dGdH Z&dIdJ Z'dKdL Z(dMdN Z)dOdP Z*dQdR Z+dSdT Z,dUdV Z-dWdX Z.dYdZ Z/d[d\ Z0d]d^ Z1d_d` Z2dadb Z3dcdd Z4dedf Z5dgdh Z6didj Z7dkdl Z8dmdn Z9dodp Z:dqdr Z;dsdt Z<dudv Z=dwdx Z>dydz Z?d{d| Z@d}d~ ZAdd ZBdd ZCdd ZDdd ZEdd ZFdd ZGdd ZHdd ZIdd ZJdd ZKdd ZLdd ZMdS )ŚIpaddrUnitTestc                 C   sp   t  d”| _t  d”| _t  d”| _t  d”| _t  d”| _	t  
d”| _t  d”| _t  d”| _t  
d	”| _d S )
Nræ   ś
1.2.3.4/24ś
1.2.3.0/24ś2001:658:22a:cafe:200:0:0:1z2001:658:22a:cafe:200:0:0:1/64ś2001:658:22a:cafe::/64ś!2001:658:22a:cafe:200:0:0:1%scopez$2001:658:22a:cafe:200:0:0:1%scope/64z2001:658:22a:cafe::%scope/64)r   r   Śipv4_addressrų   Śipv4_interfacer  Śipv4_networkr  Śipv6_addressŚipv6_interfacer  Śipv6_networkŚipv6_scoped_addressŚipv6_scoped_interfaceŚipv6_scoped_networkr   r	   r	   r
   ŚsetUp!  s"    ’’’’zIpaddrUnitTest.setUpc                 C   sF   |   dtt d”” |   dtt d”” |   dtt d”” d S )NzIPv4Interface('1.2.3.4/32')ræ   zIPv6Interface('::1/128')r  zIPv6Interface('::1%scope/128')r	  )r   r.   r   rų   r  r   r	   r	   r
   ŚtestRepr1  s    ’’’zIpaddrUnitTest.testReprc                 C   s  t  d”}t  d”}|  t  d”|” |  t  |df”|” |  t  d”|” |  t  d”|” |  t  |df”|” |  t  d”|” |  t” t  d	” W d    n1 s²0    Y  |  t” t  |d
f” W d    n1 sź0    Y  |  t” t  d” W d    n1 s 0    Y  |  t” t  d” W d    n1 sV0    Y  |  t” t  |df” W d    n1 s0    Y  |  t” t  d” W d    n1 sĘ0    Y  t  d”}|  t jd	dd|” |  t j|d
fdd|” |  t jddd|” |  t jddd|” |  t j|dfdd|” |  t jddd|” t  d”}t  d”}|  t  d”|” |  t  |df”|” |  t  d”|” |  t  d”|” |  t  |d
f”|” |  t  d”|” |  t  d	”t  d”” |  t  d”t  d”” |  t” t  d” W d    n1 sJ0    Y  |  t” t  d” W d    n1 s0    Y  d S )Nr   z192.0.2.1/32)r   rä   rä   )ģ      rä   )r   rĖ   rĖ   )rp  rĖ   )r   rß   rß   )rp  rß   )r   rā   rā   )rp  rā   rą   F©ŚstrictrŽ   rį   )ģ       rā   rŻ   )rs  rß   z192.0.2.1/24)r   z255.255.255.255.0)r   r   r  r   r1   r  rų   r  )r   ŚiprŠ   r	   r	   r
   ŚtestIPv4Tuple:  s®    

’
’’’(,**.*

’’’’
’’
žž
’žž
žž

’
’’’’’*zIpaddrUnitTest.testIPv4Tuplec                 C   s¾  t  d”}t  d”}|  t  d”|” |  t  d”|” |  t  |df”|” t  d”}t  d”}|  t  d”|” |  t  d”|” |  t  |d	f”|” t  d
”}t  d”}|  t” t  d” W d    n1 sŚ0    Y  |  t” t  d” W d    n1 s0    Y  |  t” t  |df” W d    n1 sJ0    Y  t  d”}|  t jddd|” |  t jddd|” |  t j|dfdd|” |  t  d”t  d”” |  t  d”t  d”” t  d”}|  t” t  d” W d    n1 s
0    Y  |  t” t  |df” W d    n1 sD0    Y  |  t” t  d” W d    n1 sz0    Y  |  t” t  d” W d    n1 s°0    Y  d S )NrÄ   z2001:db8::/128)rÄ   Ś128)ģ	                n   rd   rv  z2001:db8::/96)rÄ   Ś96)rw  é`   rx  rÅ   ś2001:db8::1)rz  ry  )ģ	               n   ry  ry  Frq  )rz  rx  z2001:db8::1/96)r{  rx  ś2001:db8::1%scope)r|  ry  )rz  rā   )r   r¬   r  r   r1   r  r  r  )r   rt  rŠ   Ś	ip_scopedr	   r	   r
   ŚtestIPv6Tuple  s    

’’ž’

’’ž’

(*.

’žžż’’’ž
*.*zIpaddrUnitTest.testIPv6Tuplec                 C   s¬   |   t d”d t d”” |   t d”d t d”” |   t d”d t d”” |   t d”d t d”” |  t d	”d t d
”” |  t d
”d t d	”” d S )Nrļ   é’   z1.1.2.0é   z1.1.0.1r  iž’  z::ffffr	  z::ffff%scope)r   r   r   r¬   r$  r   r	   r	   r
   ŚtestAddressIntMathÄ  s$    ’’’’’’z!IpaddrUnitTest.testAddressIntMathc                 C   sP   |   ttjd” |   ttjdtj ” |   ttjd” |   ttjdtj ” d S )NrR   rc   )r1   r  r   Śv4_int_to_packedŚ
IPV4LENGTHŚv6_int_to_packedŚ
IPV6LENGTHr   r	   r	   r
   ŚtestInvalidIntToBytesŅ  s    
’
’z$IpaddrUnitTest.testInvalidIntToBytesc                 C   s®   t  d”}t  d”}t  d”}|  tt  |g”||fg” |  tt  ||g”||f||fg” |  tt  |||g”||fg” |  dt  dd”” |  dt| j” d S )Nz10.10.10.10z10.10.10.11z10.10.10.12rd   r   zIPv4Network('1.2.3.0/24'))r   r   r   ŚlistŚ_find_address_rangeŚ_count_righthand_zero_bitsr.   rg  )r   Śip1Śip2Śip3r	   r	   r
   ŚtestInternalsŚ  s    


’’’zIpaddrUnitTest.testInternalsc                 C   s¤   |   t| jjd” |   t| jjd” |   t| jjd” |   t| jjd” |   t| jjd” |   t| jjd” |   t| jjd” |   t| jjd” d S )Ni ś1.2.3.0l	           ą/YE    ś2001:658:22a:cafe::ś::ffff:ffff:ffff:ffffz2001:658:22a:cafe::%scope)r   Śintrg  Śnetwork_addressrĶ   rj  rĻ   rm  r   r	   r	   r
   ŚtestGetNetworkē  s(    ’’’’’’zIpaddrUnitTest.testGetNetworkc                 C   sž   |   | jjt d”j” t d”}t d”}t d”}|   |t t|j”” |   |t t|j”” |  |t t|j”” d}|   | j	jt 
|”j” |   | jjt 
|”j” |   t | jj”jd” |   t | jj”jd” |   t | jj”jd” d S )NrČ   ræ   rb  rd  ģ	         ą/YE    é   é   )r   rf  Ś_ipr   rų   r  r  r  r$  ri  r  rl  re  Śversionrh  rk  )r   Śipv4Śipv6Zipv6_scopedZv6_intr	   r	   r
   ŚtestIpFromIntų  s2    

’




’

’’’’zIpaddrUnitTest.testIpFromIntc                 C   sv   t j}|  | jjt  d”j” |  |d|d” |  | jjt  d”j” |  |d|d” |  |d|d” d S )	NrÉ   ś255.254.253.252ó   ’žżüó    X*Źž      śffff:2:3:4:ffff::ó   ’’   ’’      r`   s                   )r   r  r   rf  r  r  ri  rt  rh   r	   r	   r
   ŚtestIpFromPacked  s$    

’
’
’’
’
’zIpaddrUnitTest.testIpFromPackedc                 C   s|   |   t| jjd” |   t| jjd” |   t| jjd” |   t| jjd” |   t| jjd” |   t| jjd” d S )NrČ   ræ   r  ś2001:658:22a:cafe:200::1)r   r  rf  rt  rĶ   ri  rl  r   r	   r	   r
   Ś	testGetIp   s    ’’’’zIpaddrUnitTest.testGetIpc                 C   st   |   | jjd ” |   t| jjd” |   | jjd ” |   t| jjd” |   | jjjd ” |   t| j	jjd” d S )NZscope)
r   rh  Śscope_idrĶ   rk  ri  rl  rj  r  rm  r   r	   r	   r
   ŚtestGetScopeId-  s$    
’’
’’’’zIpaddrUnitTest.testGetScopeIdc                 C   st   |   t| jjd” |   t| jjd” |   t| jjd” |   | jjd” |   t| jjd” |   | jjd” d S )Nl    ’ rā   l	           š’’’’ é@   )r   r  rg  rĪ   rĶ   rj  Ś	prefixlenrm  r   r	   r	   r
   ŚtestGetNetmask;  s    ’’zIpaddrUnitTest.testGetNetmaskc                 C   s   t  d”}|  t|jjd” |  | d”d” t  d”}|  t|jjd” |  | d”d” t  d”}|  t|jjd” |  | d”d” d S )Nś	1.2.3.4/0r   Ś0z::1/0z::1%scope/0)r   rų   r   r  r  rĪ   Ś_prefix_from_prefix_stringr  )r   Zipv4_zero_netmaskZipv6_zero_netmaskZipv6_scoped_zero_netmaskr	   r	   r
   ŚtestZeroNetmaskE  s    


zIpaddrUnitTest.testZeroNetmaskc                 C   s   t  d”}|  |jd” d S )Nz127.0.0.0/0.0.0.255rß   )r   r  r   r§  ©r   rŠ   r	   r	   r
   ŚtestIPv4NetR  s    
zIpaddrUnitTest.testIPv4Netc                 C   s|   |   t| jjd” |   t| jjd” |   t| jjd” |   t| jjd” |   t| jjd” |   t| jjd” d S )Ni’ś	1.2.3.255l	   ’’’’ļ/YE    ś%2001:658:22a:cafe:ffff:ffff:ffff:ffff)r   r  rg  Śbroadcast_addressrĶ   rj  rm  r   r	   r	   r
   ŚtestGetBroadcastV  s    ’’’’zIpaddrUnitTest.testGetBroadcastc                 C   s:   |   | jjjd” |   | jjjd” |   | jjjd” d S )Nrß   r¦  )r   rf  r  r§  ri  rl  r   r	   r	   r
   ŚtestGetPrefixlend  s    zIpaddrUnitTest.testGetPrefixlenc                 C   sÄ   |   | j ” jd” |   t| j ” jd” |   t d”j ” t 	d”” |   | j
 ” jd” |   t| j
 ” jd” |   t d”j ” t d”” |   | j ” jd” |   t| j ” jd” d S )Né   z1.2.2.0ś	0.0.0.0/0é?   r  z::0/0)r   rg  Śsupernetr§  rĶ   r  r   rų   r  r  rj  r  r  rm  r   r	   r	   r
   ŚtestGetSuperneti  s&    ’ž’’’zIpaddrUnitTest.testGetSupernetc                 C   s   |   | j d”jd” |   t| j d”jd” |   | j d”jd” |   t| j d”jd” |   | j d”jd” |   t| j d”jd” d S )Nr[   é   z1.2.0.0é=   z2001:658:22a:caf8::)r   rg  r·  r§  rĶ   r  rj  rm  r   r	   r	   r
   ŚtestGetSupernet3z  s    ’’’zIpaddrUnitTest.testGetSupernet3c                 C   sā   | j t| jjddd | j t| jjdd |  | jjdd| jjdd” | j t| jjddd | j t| jjdd |  | jjdd| jjd	d” | j t| jjddd | j t| jjdd |  | jjdd| jjd	d” d S )
Nrc   r0   ©Śprefixlen_diffŚ
new_prefixé   ©r¾  ©r½  é   éA   é>   )r1   r  rg  r·  r   rj  rm  r   r	   r	   r
   ŚtestGetSupernet4  s6    ’’’’’’’’’zIpaddrUnitTest.testGetSupernet4c                 C   sĀ  t | j ” }|  dt|” |  t d”|d ” |  t d”|d ” t d”}t | ” }|  dt|” |  t d”|d ” |  t d	”|d ” t d
”}t | ” }|  dt|” |  t d”|d ” |  t d	”|d ” t d”t d”g}d}d}|  |t t 	|” ” ” |  |t t 	|” ” ” |  t t 	|” ” t t 	|” ” ” t d”g}d}d}|  |t t 	|” ” ” |  |t t 	|” ” ” |  t t 	|” ” t t 	|” ” ” t d”t d”g}d}d}|  |t t 	|” ” ” |  |t t 	|” ” ” |  t t 	|” ” t t 	|” ” ” t d”g}d}d}|  |t t 	|” ” ” |  |t t 	|” ” ” |  t t 	|” ” t t 	|” ” ” d S )Néž   z1.2.3.1r   z	1.2.3.254rR   ś2001:658:22a:cafe::/120r  ś2001:658:22a:cafe::1z2001:658:22a:cafe::ffz2001:658:22a:cafe::%scope/120ś2.0.0.0z2.0.0.1z
2.0.0.0/31)rÉ  é   ræ   rŹ   )ræ   rä   r  z2001:658:22a:cafe::/127)r  é   ś2001:658:22a:cafe::1/128)rČ  rd   )
r  rg  Śhostsr   Ślenr   r   r  r¬   r  )r   rĶ  rj  rm  ŚaddrsZstr_argsZtpl_argsr	   r	   r
   Ś	testHosts  sd    

’’’’’’zIpaddrUnitTest.testHostsc                 C   s  |   t| jjddt| jjdd” |  tt| jjdd” |  tt| jjddd” |   t| jjddt| jjdd” |  tt| jjd	d” |  tt| jjddd” |   t| jjddt| jjdd” |  tt| jjd	d” |  tt| jjddd” d S )
Nr[   rĮ  é   rĄ  r“  r¼  r  éD   r¶  )	r   rY  rg  Śsubnetsr1   r  r  rj  rm  r   r	   r	   r
   ŚtestFancySubnettingŃ  sB    ’’’’’’’’’’’’z"IpaddrUnitTest.testFancySubnettingc                 C   s   |   t| j ” d jd” |   tt| j ” d jd” |   tt| j ” d jd” |   t| j ” d jd” |   t| j ” d jd” d S )Nr   ræ  r  r0   z	1.2.3.128rĆ  )	r   r  rg  rÓ  r§  rĶ   r  rj  rm  r   r	   r	   r
   ŚtestGetSubnetsč  s"    ’’ž’’žzIpaddrUnitTest.testGetSubnetsc                 C   sN   t  d”}dd | ” D }dd | d”D }|  |dg” |  ||” d S )NrŹ   c                 S   s   g | ]}t |qS r	   ©rĶ   ©Ś.0r@   r	   r	   r
   Ś
<listcomp>ö  rS  z;IpaddrUnitTest.testGetSubnetForSingle32.<locals>.<listcomp>c                 S   s   g | ]}t |qS r	   rÖ  r×  r	   r	   r
   rŁ  ÷  rS  rc   )r   r  rÓ  r   )r   rt  Śsubnets1Śsubnets2r	   r	   r
   ŚtestGetSubnetForSingle32ō  s
    
z'IpaddrUnitTest.testGetSubnetForSingle32c                 C   s   t  d”}dd | ” D }dd | d”D }|  |dg” |  ||” t  d”}dd | ” D }dd | d”D }|  |dg” |  ||” d S )	Nr  c                 S   s   g | ]}t |qS r	   rÖ  r×  r	   r	   r
   rŁ  ż  rS  z<IpaddrUnitTest.testGetSubnetForSingle128.<locals>.<listcomp>c                 S   s   g | ]}t |qS r	   rÖ  r×  r	   r	   r
   rŁ  ž  rS  rc   r
  c                 S   s   g | ]}t |qS r	   rÖ  r×  r	   r	   r
   rŁ    rS  c                 S   s   g | ]}t |qS r	   rÖ  r×  r	   r	   r
   rŁ    rS  )r   r  rÓ  r   )r   rt  rŚ  rŪ  r}  r	   r	   r
   ŚtestGetSubnetForSingle128ū  s    

z(IpaddrUnitTest.testGetSubnetForSingle128c                 C   sP   dd | j  d”D }|  |g d¢” dd | j d”D }|  |g d¢” d S )Nc                 S   s   g | ]}t |qS r	   rÖ  r×  r	   r	   r
   rŁ  	  rS  z.IpaddrUnitTest.testSubnet2.<locals>.<listcomp>rc   )z
1.2.3.0/26z1.2.3.64/26z1.2.3.128/26z1.2.3.192/26c                 S   s   g | ]}t |qS r	   rÖ  r×  r	   r	   r
   rŁ    rS  )ś2001:658:22a:cafe::/66z2001:658:22a:cafe:4000::/66z2001:658:22a:cafe:8000::/66z2001:658:22a:cafe:c000::/66)rg  rÓ  r   rj  )r   ŚipsZipsv6r	   r	   r
   ŚtestSubnet2  s    žžzIpaddrUnitTest.testSubnet2c                 C   sø   dd | j  d”D }|  |d d g d¢” |  |dd  g d¢” |  t|d” t d	”}d
d | d”D }|  |d d g d¢” |  |dd  g d¢” |  t|d” d S )Nc                 S   s   g | ]}t |qS r	   rÖ  r×  r	   r	   r
   rŁ    rS  z2IpaddrUnitTest.testGetSubnets3.<locals>.<listcomp>é   r[   )z
1.2.3.0/32z
1.2.3.1/32z
1.2.3.2/32éż’’’)z1.2.3.253/32z1.2.3.254/32z1.2.3.255/32r  rĒ  c                 S   s   g | ]}t |qS r	   rÖ  r×  r	   r	   r
   rŁ    rS  )z2001:658:22a:cafe::/128rĢ  z2001:658:22a:cafe::2/128)z2001:658:22a:cafe::fd/128z2001:658:22a:cafe::fe/128z2001:658:22a:cafe::ff/128)rg  rÓ  r   rĪ  r   r  )r   rÓ  rj  r	   r	   r
   ŚtestGetSubnets3  s"    ’’
’’zIpaddrUnitTest.testGetSubnets3c                 C   s   |   tt| jj d”” |   tt| j d”” |   tt| jj d”” |   tt| j d”” |   tt| j	j d”” |   tt| j
 d”” d S )Né	   rĆ  ©r1   r  r  rf  r  rÓ  rg  ri  rj  rl  rm  r   r	   r	   r
   ŚtestSubnetFailsForLargeCidrDiff*  s$    ’
’’
’’
’z.IpaddrUnitTest.testSubnetFailsForLargeCidrDiffc                 C   s@   |   t| jjjd” |   t| jjjd” |   t| jjjd” d S )Nræ  rĆ  )r1   r  rf  r  r·  ri  rl  r   r	   r	   r
   Ś!testSupernetFailsForLargeCidrDiff8  s    
’
’
’z0IpaddrUnitTest.testSupernetFailsForLargeCidrDiffc                 C   s   |   tt| jj d”” |   tt| j d”” |   tt| jj d”” |   tt| j d”” |   tt| j	j d”” |   tt| j
 d”” d S )NrR   rå  r   r	   r	   r
   Ś"testSubnetFailsForNegativeCidrDiff@  s$    ’
’’
’’
’z1IpaddrUnitTest.testSubnetFailsForNegativeCidrDiffc                 C   sÄ   |   | jjd” |   t| j ” d jd” |   | j ” jd” |   | jjd” |   t| j ” d jd” |   | j ” jd” |   | jjd” |   t| j ” d jd” |   | j ” jd” d S )Nr  r   rd   i   ģ            l            l             )r   rg  Śnum_addressesr  rÓ  r·  rj  rm  r   r	   r	   r
   ŚtestGetNum_AddressesN  s&    ’’’’’z#IpaddrUnitTest.testGetNum_Addressesc                 C   s`   |   t d”| j” |  t d”| j” t d”}|   || j” |  t d” t d””” d S )Nz1.2.3.128/25z
1.2.4.1/24z1.2.3.37z
1.1.0.0/16z
1.0.0.0/15)	rL  r   rų   rg  rO  r   rż   r  Ś__contains__)r   Śaddr1r	   r	   r
   ŚtestContains_  s    ’’
’zIpaddrUnitTest.testContainsc                 C   s|   |   t| jd d” |  t| jjd” |   t| jd d” |  t| jjd” |   t| jd d” |  t| jjd” d S )Nr\   ś1.2.3.5r  z2001:658:22a:cafe::5ré  )r   rĶ   rg  r1   Ś
IndexErrorŚ__getitem__rj  rm  r   r	   r	   r
   ŚtestNthl  s    ’’zIpaddrUnitTest.testNthc                 C   s   t  d”}|  d|j” t|}|  dt|d ” |  dt|d ” |  dt|d ” |  dt|d ” |  |d |d ” d S )Nz172.31.255.128/255.255.255.240é   z172.31.255.128r   z172.31.255.143rR   )r   r  r   r§  r  rĶ   )r   r?   Z	addr_listr	   r	   r
   ŚtestGetitemw  s    
zIpaddrUnitTest.testGetitemc                 C   s  |   | jt d”k” |  | jt d”k” |  | jt d”k” |  | jt d”k” |  | jdk” |  | jg k” |  | jdk” |   | jt d”k” |  | jt d”k” |  | jt d”k” |  | jdk” |  | jg k” |  | jdk” |   | jt d	”k” |  | jt d
”k” |  | jt d”k” |  | jt d”k” |  | jt d”k” |  | jdk” |  | jg k” |  | jdk” d S )Nr`  ś
1.2.3.4/23ś::1.2.3.4/24ś::1.2.3.4%scope/24r)   rc   ś2001:658:22a:cafe:200::1/64ś2001:658:22a:cafe:200::1/63ś!2001:658:22a:cafe:200::1%scope/64ś!2001:658:22a:cafe:200::1%scope/63)r   rf  r   rų   rż   r  ri  rl  r   r	   r	   r
   Ś	testEqual  sZ    ’’’’’’’’’’’’zIpaddrUnitTest.testEqualc                 C   sn  |   | jt d”k” |  | jt d”k” |  | jt d”k” |  | jt d”k” |  | jdk” |  | jg k” |  | jdk” |  | jt d”k” |  | jdk” |  | jg k” |  | jdk” |   | jt d”k” |  | jt d	”k” |  | jt d”k” |  | jdk” |  | jg k” |  | jdk” |  | j	t d
”k” |  | j	dk” |  | j	g k” |  | j	dk” |   | j
t d”k” |  | j
t d”k” |  | j
t d”k” |  | j
t d	”k” |  | j
t d”k” |  | j
dk” |  | j
g k” |  | j
dk” |  | jt d
”k” |  | jdk” |  | jg k” |  | jdk” d S )Nr`  rõ  rö  r÷  r)   rc   rļ  rų  rł  ræ   rś  rū  )rż   rf  r   rų   r   r  re  r   ri  rh  rl  rk  r   r	   r	   r
   ŚtestNotEqual§  s~    ’’’’’’’’’’’’’’’zIpaddrUnitTest.testNotEqualc                 C   s   |   tt d”d” d S )Nz1.2.3.4/255.255.255.255rŹ   ©r   rĶ   r   rų   r   r	   r	   r
   ŚtestSlash32ConstructorŽ  s
    
’’z%IpaddrUnitTest.testSlash32Constructorc                 C   s0   |   tt d”d” |   tt d”d” d S )Nr  r
  )r   rĶ   r   r  r   r	   r	   r
   ŚtestSlash128Constructorā  s    ’’z&IpaddrUnitTest.testSlash128Constructorc                 C   s   |   tt d”d” d S )Nz1.2.3.4/0.0.0.0r©  rž  r   r	   r	   r
   ŚtestSlash0Constructorč  s    ’z$IpaddrUnitTest.testSlash0Constructorc                 C   sö  t  d”}t  d”}t  d”}t  d”}t  d”}t  d”}t  ||||||g”}|  t|t  d”t  d”g” t  d”}t  d”}t  d”}t  d”}t  ||||g”}|  t|t  d”g” t  d”}t  d	”}t  d
”}t  d”}t  d”}t  d”}t  ||||||g”}|  t|t  d”t  d”g” t  ||g”}|  t|t  d”g” t  d” }}	|  tt  ||	g”|g” t  d” }}	|  tt  ||	g”t  d”g” t  d”}t  d”}t  d”}t  |||g”}|  t||g” t  d”}t  d”}t  d”}t  |||g”}|  t||g” t  d”t  d”ft  d”t  d”ft  d”t  d”fg}
|
D ]\}}|  	t
t j||g” qtt  d”t  d”ft  d”t  d”ft  d”t  d”fg}
|
D ]\}}|  	t
t j||g” qŅd S )Nś1.1.1.0rļ   ś1.1.1.2z1.1.1.3z1.1.1.4z
1.1.1.0/30z
1.1.1.4/32z
1.1.0.0/24ś
1.1.1.0/24ś
1.1.2.0/24z
1.1.3.0/24z
1.1.4.0/24z
1.1.0.0/22z
1.1.0.0/23z
1.1.1.1/32z
2001::/100z
2001::/120ś	2001::/96z2001::%scope/100z2001::%scope/120z2001::%scope/96r  z
1.1.0.0/32z
2001::/128r	  z2001::%scope/128)r   r   Ścollapse_addressesr   r  r  r  r  r  r1   r2   )r   r  r  r  Śip4Zip5Zip6Z	collapsedZip_same1Zip_same2Zaddr_tuplesr	   r	   r
   ŚtestCollapsingģ  s“    





’
’’





’





’
’’

’
’ž
’
ž





’’’ū
’’’’ū
’zIpaddrUnitTest.testCollapsingc              	   C   sV  t j}t  d”}t  d”}G dd dt j}|d}|d}|  tt|||” |  tt||t  d”” |  tt||t  d”” |  t|||d t  	d”” t  d	”}|  t|||t  	d
”t  	d	”g” t  
d”}t  
t j
j”}|  t  d”gt|||” t  d”}t  d”}|  t|||d t  	d”” t  d”}|  t|||t  	d”t  	d”g” t  d”}t  d”}|  t|||d t  	d”” t  d”}|  t|||t  	d”t  	d”g” |  tt|t  d”t  d”” |  tt|t  	d”t  	d”” |  tt|t  	d”t  	d”” |  tt|t  d”t  	d”” d S )Nr  z	1.1.1.255c                   @   s   e Zd Zedd ZdS )z3IpaddrUnitTest.testSummarizing.<locals>.IPv7Addressc                 S   s   dS )Né   r	   r   r	   r	   r
   r  W  s    z;IpaddrUnitTest.testSummarizing.<locals>.IPv7Address.versionN)r!   r"   r#   r$   r  r	   r	   r	   r
   ŚIPv7AddressV  s   r  r  r	  r   r  z1.1.1.8z
1.1.1.0/29rµ  r  z$1:ffff:ffff:ffff:ffff:ffff:ffff:ffffz1::/16z2::z2::/128z	1::%scopez*1:ffff:ffff:ffff:ffff:ffff:ffff:ffff%scopez	2::%scopez1.1.0.0r`   )r   Śsummarize_address_ranger  r¬   r1   r  r  r2   r   r  r   Ś	_ALL_ONESr  )r   Z	summarizer  r  r  Zip_invalid1Zip_invalid2r	   r	   r
   ŚtestSummarizingN  s    

’’’’
’’
’

’
’’

’
’’
’’
’’
’’
’’zIpaddrUnitTest.testSummarizingc                 C   s    |   t d”t d”k” |   t d”t d”k” |   t d”t d”k” |   t d”t d”k” |   t d”t d”k” |   t d”t d”k” d S )Nrļ   r  r  ś::2r	  r!  )r   r   r  r   r	   r	   r
   ŚtestAddressComparison  s$    ’’’’’’z$IpaddrUnitTest.testAddressComparisonc                 C   s  |   t d”t d”k” |   t d”t d”k ” |   t d”t d”k ” |   t d”t d”k ” |   t d”t d”k” |   t d”t d”k” |   t d”t d”k” |   t d”t d”k” |   t d”t d”k ” |   t d”t d”k ” |   t d”t d”k ” |   t d”t d”k” |   t d”t d”k” |   t d”t d”k” |   t d	”t d	”k” |   t d	”t d
”k ” |   t d	”t d”k ” |   t d”t d	”k ” |   t d
”t d	”k” |   t d”t d	”k” |   t d	”t d”k” |  t d	”t d”k” |   t d	”t d”k ” |   t d	”t d”k ” |   t d”t d”k ” |   t d
”t d”k” |   t d”t d”k” |   t d	”t d”k” |  t d”t d	”k” |   t d”t d
”k ” |   t d”t d”k ” |   t d”t d	”k ” |   t d”t d	”k” |   t d”t d	”k” |   t d”t d”k” d S )Nz
1.1.1.1/24z
1.1.1.1/16z
1.1.1.2/24z
1.1.1.2/16z::1/64z::1/80z::2/64z::2/48z::1%scope/64z::1%scope/80z::2%scope/64z::2%scope/48)r   r   r  rż   r   r	   r	   r
   ŚtestInterfaceComparison„  sŅ    ’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’z&IpaddrUnitTest.testInterfaceComparisonc           	      C   sb  t  d”}t  d”}t  d”}|  ||k ” |  ||k” |  | |”d” |  | |”d” |  | |”d” |  | |”d” |  | |”d” |  | ” | ” k ” t  d”}t  d”}t  d	”}|  ||k ” |  ||k” |  | |”d” |  | ” | ” k ” |  t| j	j| j
” t  d
”}t  d”}|  t|j|” |  t|j|” |  t|j|” |  t|j|” t  d”}|  ||k ” |  ||k” t  d”}|  ||k ” |  ||k ” |  ||k” |  ||k” t  d”}|  ||k ” |  ||k ” |  ||k” |  ||k” t  d”}t  d”}t  d”}t  d”}||||g}||||g}| ”  |  ||” ||||g}| ”  |  ||” |  | t  d””t” |  | t  d””t” |  t  d”t  d”k” |  t  d”t  d”k” |  t  d”t  d”k” |  t  d”t  d”k” |  t  d”t  d”k” |  t  d”t  d”k” d S )Nr  z
1.1.1.0/32r  r   rR   r0   z2001:2000::/96z2001:2001::/96z2001:ffff:2000::/96ś::/0rµ  z10.1.2.128/25z10.1.3.0/24z10.1.3.0/25z10.10.10.0/31z
10.10.10.0z10.10.10.2/31z
10.10.10.2rļ   r  r  r  )r   r  r   r   Ścompare_networksŚ_get_networks_keyr  r1   r2   rg  rj  r  rų   r\  r]  r  rż   ŚsortZassertIsr  r&  )	r   r  r  r  r  r  r  rY  Zunsortedr	   r	   r
   ŚtestNetworkComparisonņ  s    





ž








’’’’’’’’z$IpaddrUnitTest.testNetworkComparisonc                 C   s4   |   ttjd” |   ttjd” |   ttjd” d S )Nz192.168.1.1/24z::1/120z::1%scope/120)r1   r  r   r  r   r	   r	   r
   ŚtestStrictNetworksI  s    z!IpaddrUnitTest.testStrictNetworksc                 C   sV   t  d”}t  d”}t  d”}|  | j |”” |  | j |”” |  | |”” d S )Nz
1.2.3.0/30z
1.2.2.0/24z1.2.2.64/26)r   r  r   rg  Śoverlapsrż   )r   r)  Zother2Zother3r	   r	   r
   ŚtestOverlapsN  s    


zIpaddrUnitTest.testOverlapsc                 C   sh   d}t  |”}t  d| ”}|  t|jt|j” t  d| ”}|  |j|j” |  t jt jd” d S )NrK   z::%sz	::ffff:%sz2001:1.1.1.1:1.1.1.1)	r   rų   r  r   r  rt  r$  r1   r   )r   Zipv4_stringr  Zv4compat_ipv6Zv4mapped_ipv6r	   r	   r
   ŚtestEmbeddedIpv4V  s    
’zIpaddrUnitTest.testEmbeddedIpv4c                 C   sÄ   |   t d”t d”” |   t d”t d”” |   t d”t d”” |   t d”t d”” |  t d”t d”” |  t d”t d”” |  t d”t d”” |  t d”t d”” d S )	Nz::FFFF:192.0.2.1z::FFFF:c000:201zFFFF::192.0.2.1zFFFF::c000:201z::FFFF:192.0.2.1%scopez::FFFF:c000:201%scopezFFFF::192.0.2.1%scopezFFFF::c000:201%scope)r   r   r  r$  r   r	   r	   r
   ŚtestIPv6AddressTooLargea  s0    ’’’’’’’’z&IpaddrUnitTest.testIPv6AddressTooLargec                 C   s4   |   | jjd” |   | jjd” |   | jjd” d S )Nr  r  )r   re  r  rh  rk  r   r	   r	   r
   ŚtestIPVersionv  s    zIpaddrUnitTest.testIPVersionc                 C   s4   |   | jjd” |   | jjd” |   | jjd” d S )Nrä   rd   )r   rf  Śmax_prefixlenri  rl  r   r	   r	   r
   ŚtestMaxPrefixLength{  s    z"IpaddrUnitTest.testMaxPrefixLengthc                 C   s   |   | jjd” |   t d”jd” |   | jjd” |   t d”jd” |   t d”jd” |   | jjd” |   t d	”jd” |   t d
”jd” d S )NrÉ   r  r  r  r  r   z::1:0:0:0:0s                  zffff:2:3:4:ffff::%scopez::1:0:0:0:0%scope)r   re  Śpackedr   rų   rh  r  rk  r   r	   r	   r
   Ś
testPacked  s0    
’’
’’’
’’’zIpaddrUnitTest.testPackedc                 C   st   t  d”}t  d”}t  d”}t  d”}|  t jt|” |  t jt|” |  t jt|” |  t jt|” d S )Nræ   rŚ   )	r   r  r  r   r  rU  r   r  r¬   )r   Zipv4netZipv4addrZipv6netZipv6addrr	   r	   r
   Ś
testIpType  s    



zIpaddrUnitTest.testIpTypec                 C   sT  |   dt d”j” |   dt d”j” |   dt d”j” |   dt d”j” |   dt d”j” |   dt d”j” |   dt d”j” |   dt d”j” |   dt d	”j” |   dt d
”j” |   dt d”j” |   dt d”j” |   dt d”j” |   dt d”j” |   dt d”j” |   dt d”j” |   dt d”j” |   dt d”j	” |   dt d”j” |   dt d”j	” |   dt 
d”j” |   dt 
d”j” |   dt 
d”j” |   dt 
d”j” |   dt 
d”j” |   dt 
d”j” |   dt 
d”j” |   dt 
d”j” |   dt 
d”j” |   dt 
d	”j” |   dt 
d
”j” |  t 
d”j	” |  t 
d”j	” |  t 
d”j	” |  t 
d”j	” |   dt 
d”j” |   dt 
d”j” |  t 
d”j	” |  t 
d ”j	” |   dt 
d!”j” |   dt 
d"”j” |   dt 
d”j” |   dt d”j” d S )#NTz224.1.1.1/31Fz	240.0.0.0z192.168.1.1/17z192.169.0.0z10.255.255.255z11.0.0.0z172.31.255.255z
172.32.0.0z169.254.1.0/24z169.254.100.200/24z169.255.100.200/24z127.100.200.254/32z127.42.0.0/16z	128.0.0.0z100.64.0.0/10z192.0.2.128/25z192.0.3.0/24rI   z	224.1.1.1z	240.0.0.1z239.255.255.255ś192.168.1.1z	192.0.0.0z	192.0.0.9z
192.0.0.10z192.0.0.255z169.254.100.200z169.255.100.200z	192.0.7.1z203.0.113.1z127.100.200.254z
127.42.0.0)r   r   r  Śis_multicastr  Śis_reservedŚ
is_privateŚis_link_localŚis_loopbackŚ	is_globalr  Śis_unspecifiedrż   r   r   r	   r	   r
   ŚtestReservedIpv4   sŖ    
’
’
’
’
’’’’’’’
’
’
’
’
’
’
’
’
’
’zIpaddrUnitTest.testReservedIpv4c                 C   sH  |   dt d”j” |   dt d”j” |   dt d”j” |   dt d”j” |   dt d”j” |   dt d”j” |   dt d	”j” |   dt d
”j” |   dt d”j” |   dt d”j” |   dt d”j” |   dt d”j” |   dt d”j” |   dt d”j” |   dt d”j” |   dt d”j” |   dt d”j” |   dt d”j” |   dt d”j” |   dt d”j” |   dt d”j” |   dt d”j” |   dt d”j” |   dt d”j” |   dt d”j” |   dt d”j” |   dt d”j” |   dt d”j” |   dt d”j” d S ) NTrµ  Fz	1.0.0.0/8z	0.0.0.0/8z
10.0.0.0/8z127.0.0.0/8z169.254.0.0/16z172.16.0.0/12z192.0.0.0/29z192.0.0.9/32z192.0.0.170/31rą   z192.168.0.0/16z198.18.0.0/15z198.51.100.0/24z203.0.113.0/24z240.0.0.0/4z255.255.255.255/32r  z::ff/128r  ś::/128z::ffff:0:0/96z100::/64z2001:2::/48z2001:3::/48r  z2001:10::/28zfc00::/7z	fe80::/10)r   r   r  r%  r   r	   r	   r
   ŚtestPrivateNetworksķ  s:    z"IpaddrUnitTest.testPrivateNetworksc                 C   s¾  |   dt d”j” |   dt dd d ”j” |   dt d”j” |   dt d”j” |   dt d	”j” |   dt d
”j” |   dt d”j” |   dt d”j” |   dt d”j” |   dt d”j” |   dt d”j” |   dt d”j” |   dt d”j” |   dt d”j” |   dt d”j” |   dt d”j” |   dt d”j” |   dt d”j” |   dt d”j” |   dt d”j” |   dt d”j	” |   dt d”j	” |   dt d”j	” |   dt d”j” |   dt d”j
” |   dt d”j” |   dt dd d ”j” |   dt d”j” |   dt d”j” |   dt d	”j” |   dt d
”j” |   dt d”j” |   dt d”j” |   dt d”j” |   dt d”j” |   dt d”j” |   dt d”j” |   dt d”j” |   dt d”j” |   dt d”j” |   dt d”j” |   dt d”j” |   dt d”j” |   dt d”j” |   dt d”j	” |   dt d”j	” |  t d”j
” |  t d”j
” |  t d”j
” |  t d ”j
” |  t d!”j
” |  t d"”j
” |  t d#”j
” |  t d$”j
” |  t d%”j
” |  t d&”j
” |  t d'”j
” |  t d(”j
” |  t d)”j
” |   dt d*”j” |   dt d+”j” d S ),NTzffff::rc   rd   r0   zff00::Fzfdff::zfecf::zfeff:ffff:ffff:ffff::z
fbf:ffff::zfc00::zfc00:ffff:ffff:ffff::zfbff:ffff::zfe00::zfea0::zfebf:ffff::zfe7f:ffff::zfec0::z	0:0::0:01z::1/127r`   r  z0::0r  z::/127z2001::1/128z
200::1/128z64:ff9b:1::z2001::z	2001:1::1z	2001:1::2z2001:2::z2001:3::z2001:4::z2001:4:112::z	2001:10::z	2001:20::z	2001:30::z	2001:40::z2002::z100::z4000::1/128)r   r   r  r#  Śis_site_localr%  r&  r  r'  r)  r(  r  rż   r   r$  r   r	   r	   r
   ŚtestReservedIpv6	  sŖ    
’
’
’
’
’
’
’
’
’
’
’
’zIpaddrUnitTest.testReservedIpv6c                 C   sL   |   t d”jt d”” |   t d”jd ” |   t d”jt d”” d S )Nś::ffff:192.168.1.1r"  z
::c0a8:101z::ffff:c0a8:101)r   r   r  Śipv4_mappedr   r	   r	   r
   ŚtestIpv4Mappedj	  s    
ž’zIpaddrUnitTest.testIpv4Mappedc              	   C   sĀ   dD ]ø}|   |” t |”}t d| ”}|  |j|j” |  |j|j” |  |j|j” |  |j|j” |  |j	|j	” |  |j
|j
” |  |j|j” W d    q1 s²0    Y  qd S )N)z178.62.3.251z169.254.169.254ś	127.0.0.1z	224.0.0.1rK   rI   z
100.64.0.1z::ffff:)r<   r   r   r¬   r   r(  r%  r$  r#  r)  r&  r'  )r   Śaddr4r  r  r	   r	   r
   ŚtestIpv4MappedPropertiesr	  s    	
z'IpaddrUnitTest.testIpv4MappedPropertiesc                 C   s,   |   dt d”j” |   dt d”j” d S )NTr/  Fz::ffff:172.32.0.0)r   r   r  r%  r   r	   r	   r
   ŚtestIpv4MappedPrivateCheck	  s    ’’z)IpaddrUnitTest.testIpv4MappedPrivateCheckc                 C   s  t  d”}t  d”}t  d”}t  d”}t  d”}t  d”}|  tt| |”t  d”t  d”g” |  tt| |”” |  t	t| |”” |  t	t| |”” |  t| |”g ” |  tt| |”t  d	”t  d
”t  d”t  d”t  d”t  d”t  d”t  d”g” d S )Nś10.1.1.0/24z10.1.1.0/26z10.2.1.0/24ś10.1.1.0z2001:db8::0/32z10.1.1.5/32z10.1.1.64/26z10.1.1.128/25z10.1.1.0/30z10.1.1.4/32z10.1.1.6/31z10.1.1.8/29z10.1.1.16/28z10.1.1.32/27)
r   r  r  r   rY  r  Śaddress_excluder1   r  r2   ©r   rķ  Śaddr2Śaddr3r3  Zaddr5Zaddr6r	   r	   r
   ŚtestAddrExclude	  s4    





’’ł’zIpaddrUnitTest.testAddrExcludec              
   C   sę   |   tt d”tt d”” |   tt d”tt d”” |   tt d”tt d”” |   tt d”tt tt d”j”” t d”}t d”}i }d || j< d || j	< d ||< d ||< |  
| j|” |  
||” d S )Nr6  r7  ræ   r  )r   Śhashr   r  r  r  r  r  re  rh  rL  )r   r  r  Śdummyr	   r	   r
   ŚtestHashØ	  s.    ’’’’’



zIpaddrUnitTest.testHashc                 C   s6   | j }|  d|j” | j}|  t|jdd d ” d S )Nra  rc   rd   r0   )rg  r   Ś
compressedrj  r1   r  Ś_string_from_ip_intr­  r	   r	   r
   ŚtestIPBases½	  s    zIpaddrUnitTest.testIPBasesc                 C   sD   | j }|  d|j” |  d|j” |  d|j” |  dt|” d S )Nrc  z)2001:658:22a:cafe::/ffff:ffff:ffff:ffff::z)2001:658:22a:cafe::/::ffff:ffff:ffff:ffff)rj  r   Świth_prefixlenŚwith_netmaskŚwith_hostmaskrĶ   r­  r	   r	   r
   ŚtestIPv6NetworkHelpersĆ	  s    ’’z%IpaddrUnitTest.testIPv6NetworkHelpersc                 C   sD   | j }|  d|j” |  d|j” |  d|j” |  dt|” d S )Nra  z1.2.3.0/255.255.255.0z1.2.3.0/0.0.0.255)rg  r   rC  rD  rE  rĶ   r­  r	   r	   r
   ŚtestIPv4NetworkHelpersĢ	  s
    z%IpaddrUnitTest.testIPv4NetworkHelpersc                 C   s|   t  d”}t  |”}t  d”}t  |”}t  d”}t  d”}|  ||” |  ||” |  |t  |”” |  |t  |”” d S )Nr6  rų  rļ   r¢  )r   r  r  r   r¬   r   r9  r	   r	   r
   ŚtestCopyConstructorÓ	  s    





z"IpaddrUnitTest.testCopyConstructorc                 C   sZ   ddddddddd	d
ddddddddd}t | ” D ]\}}|  |tt |”” q6d S )Nz1:2:3:4:5:6:7:8/128z2001:0:0:4::8/128z2001::4:5:6:7:8/128z2001:0:3:4:5:6:7:8/128z0:0:3::ffff/128z::4:0:0:0:ffff/128z::5:0:0:ffff/128z1::4:0:0:7:8/128r+  r  r  rŽ  z::102:304/128z1:2:3:4:5:ffff:102:304/128z0:7:6:5:4:3:2:1/128z0:7:6:5:4:3:2:0/128z7:6:5:4:3:2:1:0/128z0:6:5:4:3:2:1:0/128)z1:2:3:4:5:6:7:8z2001:0:0:4:0:0:0:8z2001:0:0:4:5:6:7:8z2001:0:3:4:5:6:7:8z0:0:3:0:0:0:0:ffffz0:0:0:4:0:0:0:ffffz0:0:0:0:5:0:0:ffffz1:0:0:4:0:0:7:8z0:0:0:0:0:0:0:0z0:0:0:0:0:0:0:0/0z0:0:0:0:0:0:0:1z*2001:0658:022a:cafe:0000:0000:0000:0000/66rŚ   z1:2:3:4:5:ffff:1.2.3.4z::7:6:5:4:3:2:1z::7:6:5:4:3:2:0z7:6:5:4:3:2:1::z0:6:5:4:3:2:1::)r  Śitemsr   rĶ   r   r  )r   Ztest_addressesZuncompressedr@  r	   r	   r
   ŚtestCompressIPv6Addressą	  s.    ķ’z&IpaddrUnitTest.testCompressIPv6Addressc                 C   sx   t  d”}t  d”}t  d”}t  d”}|  d|j” |  dt  d”j” |  d|j” |  d	|j” |  d|j” d S )
Nz2001::1ś2001:0:5ef5:79fd:0:59d:a0e5:ba1r  z192.168.178.1z+2001:0000:0000:0000:0000:0000:0000:0001/128z+0000:0000:0000:0000:0000:0000:0000:0001/128r  z'2001:0000:5ef5:79fd:0000:059d:a0e5:0ba1z*2001:0000:0000:0000:0000:0000:0000:0000/96)r   r  r¬   r  r   r   Śexploded)r   rķ  r:  r;  r3  r	   r	   r
   ŚtestExplodeShortHandIpStrś	  s"    



’
’’’z(IpaddrUnitTest.testExplodeShortHandIpStrc                 C   s4   t  d”}t  d”}|  d|j” |  d|j” d S )Nr2  rz  z1.0.0.127.in-addr.arpazH1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa)r   r   r¬   r   Śreverse_pointer)r   rķ  r:  r	   r	   r
   ŚtestReversePointer

  s    

žz!IpaddrUnitTest.testReversePointerc                 C   s(   |   dt| j” |   dt| j” d S )NrČ   r  )r   r  re  rh  r   r	   r	   r
   ŚtestIntRepresentation
  s    ’z$IpaddrUnitTest.testIntRepresentationc                 C   s,   |   t d”jd” |   t d”jd” d S )Nr0   r  r  )r   r   r  r  r  r   r	   r	   r
   ŚtestForceVersion
  s    zIpaddrUnitTest.testForceVersionc                 C   sd   |   | jjd” |   | jjd” |   | jjd” |   | jjd” |   | jjd” |   | jjd” d S )Nr`  z1.2.3.4/255.255.255.0z1.2.3.4/0.0.0.255rų  z.2001:658:22a:cafe:200::1/ffff:ffff:ffff:ffff::z.2001:658:22a:cafe:200::1/::ffff:ffff:ffff:ffff)r   rf  rC  rD  rE  ri  r   r	   r	   r
   ŚtestWithStar
  s     
’
’
’
’
’zIpaddrUnitTest.testWithStarc                 C   s^  |   d| jj” |   d| jj” |  | jjt d”” |  | jjt d”” |  d| jj” |  d| jj” |   d| j	j” |   d| j	j” |  | j	j
t d”” |  | jjj
t d”” |  | j	jt d”” |  | j	jt d”” |  | jjjt d”” |  | jjjt d”” |  d| j	j” |  d| j	j” |  d| jjj” |  d| jjj” d S )Nr±  rĻ   rÆ  z	0.0.0.255r  r°  r  )rO  rg  Ś__dict__r   r±  r   r   rĻ   rL  rj  r  r¬   ri  r  r   r	   r	   r
   ŚtestNetworkElementCaching+
  sH    
’
’
’’ž
’ž’z(IpaddrUnitTest.testNetworkElementCachingc                 C   s   t  d”}t  d”}d}|  ||ft  |”j” d}|  t  |”j” d}|  t  |”j” t  d”}|  t  d”t  d”f|j” d S )	Nz65.54.227.120z
192.0.2.45z'2001:0000:4136:e378:8000:63bf:3fff:fdd2z#2000::4136:e378:8000:63bf:3fff:fdd2z'2001:0001:4136:e378:8000:63bf:3fff:fdd2rK  z94.245.121.253z95.26.244.94)r   r   r   r  Śteredorż   r¬   )r   ZserverŚclientZteredo_addrŚbad_addrr	   r	   r
   Ś
testTeredoU
  s     



’
’žzIpaddrUnitTest.testTeredoc                 C   s8   t  d”}t  d”}|  t  d”|j” |  |j” d S )Nz2002:ac1d:2d64::1z2000:ac1d:2d64::1z172.29.45.100)r   r  r   r   Ś	sixtofourrż   )r   ZsixtofouraddrrW  r	   r	   r
   Śtestsixtofourg
  s    

’zIpaddrUnitTest.testsixtofourc                 C   s,   t  d”}t  d”}|  | ” | ” ” d S )Nræ   z2.3.4.5)r   rų   r$  Ś__hash__)r   Zipv4_address1Zipv4_address2r	   r	   r
   ŚtestV4HashIsNotConstanto
  s    

z&IpaddrUnitTest.testV4HashIsNotConstantc                 C   s,   t  d”}t  d”}|  | ” | ” ” d S )Nrb  z2001:658:22a:cafe:200:0:0:2)r   r  r$  r[  )r   Zipv6_address1Zipv6_address2r	   r	   r
   ŚtestV6HashIsNotConstantu
  s    

z&IpaddrUnitTest.testV6HashIsNotConstantN)Nr!   r"   r#   rn  ro  ru  r~  r  r  r  r  r  r”  r£  r„  rØ  r¬  r®  r²  r³  rø  r»  rÅ  rŠ  rŌ  rÕ  rÜ  rŻ  rą  rć  rę  rē  rč  rė  rī  rņ  rō  rü  rż  r’  r   r  r	  r  r  r  r  r  r  r  r  r  r  r   r!  r*  r,  r.  r1  r4  r5  r<  r?  rB  rF  rG  rH  rJ  rM  rO  rP  rQ  rR  rT  rX  rZ  r\  r]  r	   r	   r	   r
   r_    s   	GC
6%7bIMW
M"[	*r_  Ś__main__)rö   Zunittestr,   r%   r3   r:   r   r£   Ztest.supportr   r   ZTestCaser   r'   rC   r_   rk   r¦   rĘ   r÷   rł   r  r  r  r  r   r_  r!   Śmainr	   r	   r	   r
   Ś<module>   sN   621p vY6i/ 6            h
