o
    HXīh©õ ć                   @   sd  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 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 ©N)ŚNotImplementedError©Śself© r	   ś=/opt/python-3.10.19/usr/lib/python3.10/test/test_ipaddress.pyŚfactory$   ó   zBaseTestCase.factoryc                 g   sf    |r|| }|   ||”}|}|V  W d   n1 sw   Y  |jjdur1|  |jj” dS 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   ó   | j tj|g|¢R  S )z Ensure a clean AddressValueError)r   Ś	ipaddressŚAddressValueError©r   r   r   r	   r	   r
   ŚassertAddressError8   ó
   ’’zBaseTestCase.assertAddressErrorc                 G   r   )z Ensure a clean NetmaskValueError)r   r   ŚNetmaskValueErrorr   r	   r	   r
   ŚassertNetmaskError=   r   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                   @   ó,   e Zd Zdd Zdd Zdd Zdd Zd	S )
ŚCommonTestMixinc                 C   s:   |   d” |  d” W d    d S 1 sw   Y  d S )NśAddress cannot be emptyŚ ©r   r   r   r	   r	   r
   Śtest_empty_addressI   ó   "’z"CommonTestMixin.test_empty_addressc                 C   sD   |   t td”” |  d” W d    d S 1 sw   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 ],}| j|d |  |”}t t ||””}|  ||” W d    n1 s.w   Y  qd S )Nr5   )Śproto)ŚrangeŚpickleŚHIGHEST_PROTOCOLŚsubTestr   ŚloadsŚdumpsr   )r   Śaddrr=   ŚxŚyr	   r	   r
   Śpickle_testX   s   
ż’zCommonTestMixin.pickle_testN)r$   r%   r&   r/   r4   r<   rG   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 ]2}| j |d" |  |” |  |” W d    n1 s&w   Y  W d    n1 s5w   Y  qd S )Nz(Leading zeros are not permitted in '\d+')	z000.000.000.000ś192.168.000.001z016.016.016.016rI   z001.000.008.016z	01.2.3.40z	1.02.3.40z	1.2.03.40z	1.2.3.040)Śaddress)rA   r   r   )r   ŚmsgŚ	addressesrJ   r	   r	   r
   Śtest_leading_zerosb   s   ’’’z%CommonTestMixin_v4.test_leading_zerosc                 C   ó   |   dd” |   dd” d S )Nr   ś0.0.0.0ģ    P ś192.168.0.1©r#   r   r	   r	   r
   Śtest_intu   ó   zCommonTestMixin_v4.test_intc                 C   s(   |   t d”d” |   t d”d” d S )NŚ00000000rO   Śc0a80001rQ   )r#   r;   Śfromhexr   r	   r	   r
   Śtest_packedy   s   zCommonTestMixin_v4.test_packedc                 C   óD   d}|   t |”” |  d” W d    d S 1 sw   Y  d S )Nz,-1 (< 0) is not permitted as an IPv4 addressé’’’’©r   r1   r2   r   ©r   rK   r	   r	   r
   Śtest_negative_ints_rejected}   ó   "’z.CommonTestMixin_v4.test_negative_ints_rejectedc                 C   sH   d}|   t |d ”” |  d” W d    d S 1 sw   Y  d S )Nz1%d (>= 2**32) is not permitted as an IPv4 addressl        r[   r\   r	   r	   r
   Śtest_large_ints_rejected   s   "’z+CommonTestMixin_v4.test_large_ints_rejectedc                    ó     fdd}|d |d d S )Nc                    sT   d|  }d}   t ||| f ””   |” W d    d S 1 s#w   Y  d S )Nó    z4%r (len %d != 4) is not permitted as an IPv4 addressr[   ©ŚlengthrD   rK   r   r	   r
   ŚassertBadLength   s
   "’zBCommonTestMixin_v4.test_bad_packed_length.<locals>.assertBadLengthé   é   r	   ©r   rd   r	   r   r
   Śtest_bad_packed_length   s   z)CommonTestMixin_v4.test_bad_packed_lengthN)	r$   r%   r&   rM   rS   rX   r]   r_   rh   r	   r	   r	   r
   rH   `   s    rH   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   rN   )Nz
0000::0000ś::z000::c0a8:0001ś::c0a8:1rR   r   r	   r	   r
   rM      rT   z%CommonTestMixin_v6.test_leading_zerosc                 C   rN   )Nr   rj   rP   rk   rR   r   r	   r	   r
   rS      rT   zCommonTestMixin_v6.test_intc                 C   sR   dt  d” }|  |d” dt  d” }|  |d” t  d”d }|  |d” d S )Ns               rU   rj   rV   rk   zc0a8:1::)r;   rW   r#   ©r   rD   r	   r	   r
   rX      s   zCommonTestMixin_v6.test_packedc                 C   rY   )Nz,-1 (< 0) is not permitted as an IPv6 addressrZ   r[   r\   r	   r	   r
   r]   ¤   r^   z.CommonTestMixin_v6.test_negative_ints_rejectedc                 C   sP   d}|   t |dd  ”” |  dd ” W d    d S 1 s!w   Y  d S )Nz2%d (>= 2**128) is not permitted as an IPv6 addressé   é   r[   r\   r	   r	   r
   r_   ©   s   "’z+CommonTestMixin_v6.test_large_ints_rejectedc                    r`   )Nc                    s^   d|  }d}   t ||| f ””   |”   |” W d    d S 1 s(w   Y  d S )Nra   z5%r (len %d != 16) is not permitted as an IPv6 addressr[   rb   r   r	   r
   rd   Æ   s   
"žzBCommonTestMixin_v6.test_bad_packed_length.<locals>.assertBadLengthé   é   r	   rg   r	   r   r
   rh   ®   s   z)CommonTestMixin_v6.test_bad_packed_lengthc                 C   ó@   d}|   d|” |  |” W d    d S 1 sw   Y  d S )Nz::1%śInvalid IPv6 address: "%r"r.   ©r   rJ   r	   r	   r
   Śtest_blank_scope_id¹   ó   "’z&CommonTestMixin_v6.test_blank_scope_idc                 C   rq   )Nz
::1%scope%rr   r.   rs   r	   r	   r
   Ś"test_invalid_scope_id_with_percent¾   ru   z5CommonTestMixin_v6.test_invalid_scope_id_with_percentN)r$   r%   r&   rM   rS   rX   r]   r_   rh   rt   rv   r	   r	   r	   r
   ri      s    ri   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   ó6   t  d”}g d¢}|D ]\}}|  |t||” qd S )Nś1.2.3.42))ŚbŚ 00000001000000100000001100101010)Śnr{   )rE   Z0102032a)ŚXZ0102032A)Ś_bŚ'0000_0001_0000_0010_0000_0011_0010_1010)Ś_nr   )Ś_xZ	0102_032a)Ś_XZ	0102_032A)ś#bŚ"0b00000001000000100000001100101010)ś#nr   )ś#xZ
0x0102032a)ś#XZ
0X0102032A)ś#_bŚ)0b0000_0001_0000_0010_0000_0011_0010_1010)ś#_nr   )ś#_xZ0x0102_032a)ś#_XZ0X0102_032A)Śsry   )r-   ry   )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    d S 1 sw   Y  d S )Nz127.0.0.1/24śUnexpected '/' in %r©r   r   r   rl   r	   r	   r
   Śtest_network_passed_as_addressß   ru   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                    ó<      d| ” t | ” W d    d S 1 sw   Y  d S )NzExpected 4 octets in %rr   ©rD   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                    r`   )Nc                    r   )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  ó   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                    óL   d|| f }   t |”” t | ” W d    d S 1 sw   Y  d S )Nz)Only decimal digits permitted in %r in %r©r   r1   r2   r   r   ©rD   ZoctetrK   r   r	   r
   r     ó   "’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                    ó$    fdd}|dd |dd d S )Nc                    sL   d}   t ||| f ”” t | ” W d    d S 1 sw   Y  d S )Nz*At most 3 characters permitted in %r in %rr£   r¤   r   r	   r
   r     ó   "’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  ó   
z$AddressTestCase_v4.test_octet_lengthc                    r­   )Nc                    r¢   )Nz$Octet %d (> 255) not permitted in %rr£   r¤   r   r	   r
   r   $  r„   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#  r°   z#AddressTestCase_v4.test_octet_limitc                 C   ó   |   d” d S ©Nś	192.0.2.1©rG   r   r	   r	   r
   Śtest_pickle,  ó   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
   rw   Ć   s    			rw   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d ZdS ) ŚAddressTestCase_v6c                 C   rx   )Nz
::1.2.3.42))rz   Z00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000100000001100101010)r|   Ś 0000000000000000000000000102032a)rE   r½   )r}   Z 0000000000000000000000000102032A)r~   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)r   Ś'0000_0000_0000_0000_0000_0000_0102_032a)r   r¾   )r   Z'0000_0000_0000_0000_0000_0000_0102_032A)r   Z0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000100000001100101010)r   Ś"0x0000000000000000000000000102032a)r   ræ   )r   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                    r`   )Nc                    s@   d}   || ” t | ” W d    d S 1 sw   Y  d S )Nr   )r   r   rĀ   ©rD   rK   r   r	   r
   r   `  ru   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                    óJ   d}   ||  d”d ” t | ” W d    d S 1 sw   Y  d S )NzAt least 3 parts expected in %rś%r   ©r   Śsplitr   rĀ   rĆ   r   r	   r
   r   h  ó   "’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                    ó`    fdd}|d |d |d |d |d |d |d	 |d
 |d |d d S )Nc                    rÄ   )Nz At most 8 colons permitted in %rrÅ   r   rĘ   rĆ   r   r	   r
   r   u  rČ   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                    sH    fdd}dd d }|| ||d  ||d  ||d  d S )	Nc                    sN   d}   |t | d d ”” t | ” W d    d S 1 s w   Y  d S )Nz%At most 45 characters expected in '%sé-   )r   r1   r2   r   rĀ   rĆ   r   r	   r
   r     s   "’zMAddressTestCase_v6.test_bad_address_split_v6_too_long.<locals>.assertBadSplitz0:i'  Ś0z%zoneidz:255.255.255.255z:ffff:255.255.255.255r	   )r   r   Z	long_addrr	   r   r
   Ś"test_bad_address_split_v6_too_long  s   z5AddressTestCase_v6.test_bad_address_split_v6_too_longc                    rĖ   )Nc                    rÄ   )Nz+Exactly 8 parts expected without '::' in %rrÅ   r   rĘ   rĆ   r   r	   r
   r     rČ   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                    r`   )Nc                    rÄ   )Nz.Expected at most 7 other parts with '::' in %rrÅ   r   rĘ   rĆ   r   r	   r
   r   Ŗ  rČ   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©  r”   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                    rÄ   )Nz At most one '::' permitted in %rrÅ   r   rĘ   rĆ   r   r	   r
   r   ³  rČ   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                    óP    fdd}|d |d |d |d |d |d |d	 |d
 d S )Nc                    rÄ   )Nz0Leading ':' only permitted as part of '::' in %rrÅ   r   rĘ   rĆ   r   r	   r
   r   Ļ  rČ   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Ī  ó   z:AddressTestCase_v6.test_bad_address_split_v6_leading_colonc                    rÓ   )Nc                    rÄ   )Nz1Trailing ':' only permitted as part of '::' in %rrÅ   r   rĘ   rĆ   r   r	   r
   r   ß  rČ   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Ž  rÕ   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                    sH      d||  d”d ” t | ” W d    d S 1 sw   Y  d S )Nz%s in %rrÅ   r   rĘ   )rD   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                    sV   d||   d”d f }  t |”” t | ” W d    d S 1 s$w   Y  d S )Nz%Only hex digits permitted in %r in %rrÅ   r   )rĒ   r   r1   r2   r   rĀ   ©rD   ŚpartrK   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                    sL   d}   |||  d”d ” t | ” W d    d S 1 sw   Y  d S )Nz*At most 4 characters permitted in %r in %rrÅ   r   rĘ   rŁ   r   r	   r
   rŪ     r®   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   r²   )Nś
2001:db8::rµ   r   r	   r	   r
   r¶   -  r·   zAddressTestCase_v6.test_picklec                 C   s$   t  |  d”” t  |  d”” d S )Nrā   ś2001:db8::%scoperø   r   r	   r	   r
   r»   0  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
   r¼   3  s"    )	r¼   c                   @   óH   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 ]!}|   |”}|  t|d” |  t|jd” |  t|jd” qd S )N)rŻ   éó   ś
1.2.3.4/32ś255.255.255.255rO   ©r   r   ŚstrŚnetmaskŚhostmask)r   rJ   Śnetr	   r	   r
   Śtest_no_mask8  s   
üz NetmaskTestMixin_v4.test_no_maskc                 C   sB   d}|   d| ” |  |” W d    d S 1 sw   Y  d S )Nz1.2.3.4/32/24śOnly one '/' permitted in %rr.   rl   r	   r	   r
   Śtest_split_netmaskA  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                    ó:      |”   | ” W d    d S 1 sw   Y  d S r   r.   ©rD   r   r   r	   r
   ŚassertBadAddressG  r0   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))r1   r2   ©r   rõ   r	   r   r
   Śtest_address_errorsF  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 ]F}d| }|  |”}|   t||” |   t|  d	|j ”|” |   t|  d
| ”|” |dv ridd|  }|   t|  d	|j ”|” q1d 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   r>   rķ   rī   )r   ŚiŚnet_strrļ   r	   r	   r
   Śtest_valid_netmaskS  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                    óP   d| }   t |””   d| |f ” W d    d S 1 s!w   Y  d S ©Nś%r is not a valid netmaskz%s/%s©r   r1   r2   r   ©rD   rķ   rK   r   r	   r
   ŚassertBadNetmaskl  ó   "’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Śpuddingrj   r	   ©r   r  r	   r   r
   Śtest_netmask_errorsk  s   












z'NetmaskTestMixin_v4.test_netmask_errorsc                    s$    fdd}|dd |dd d S )Nc                    óL   d| }   t |””   | |f” W d    d S 1 sw   Y  d S ©Nr
  r  r  r   r	   r
   r    ó   "’zJNetmaskTestMixin_v4.test_netmask_in_tuple_errors.<locals>.assertBadNetmaskr  rZ   r  r	   r  r	   r   r
   Śtest_netmask_in_tuple_errors  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å   5  s    	rå   c                   @   ó   e Zd ZejZdS )ŚInterfaceTestCase_v4N)r$   r%   r&   r   ŚIPv4Interfacer   r	   r	   r	   r
   r    ó    
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  ó(   
’’
’’
’’
’’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§  r&  z#NetworkTestCase_v4.test_supernet_ofc                 C   s  |   t” t d” t d”” W d    n1 sw   Y  |   t” t d” t d”” W d    n1 s;w   Y  |   t” t d” t d”” W d    n1 s[w   Y  |   t” t d” t d”” W d    d S 1 s|w   Y  d S )Nr!  ś::1/128)r6   r7   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                   @   rä   )ŚNetmaskTestMixin_v6rę   c                 C   s   dD ]!}|   |”}|  t|d” |  t|jd” |  t|jd” q|   d”}|  t|d” |  t|jd” |  t|jd” d S )N)ś::1r5   s                  r*  z'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffffrj   ś	::1%scopeś::1%scope/128rė   )r   rJ   rļ   Z
scoped_netr	   r	   r
   rš   Ė  s   

z NetmaskTestMixin_v6.test_no_maskc                 C   s~   d}|   d| ” |  |” W d    n1 sw   Y  d}|   d| ” |  |” W d    d S 1 s8w   Y  d S )Nzcafe:cafe::/128/190rń   zcafe:cafe::%scope/128/190r.   )r   rD   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                    ró   r   r.   rō   r   r	   r
   rõ   ć  r0   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| ”|” q&|   t|  d”d” tddD ]}d| }|   t|  |”|” |   t|  d| ”|” qUd S )	N)rā   r  ś2001:db8::/32)rā   Z32r   é   z::/%dz::/0%dz2001:db8::%scope/32)r   rģ   r   r>   )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                    r  r	  r  r  r   r	   r
   r    r  zANetmaskTestMixin_v6.test_netmask_errors.<locals>.assertBadNetmaskr/  r-   ś1::rÜ   rØ   r  r  Z129rŻ   r  rj   r0  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                    r  r  r  r  r   r	   r
   r  !  r  zJNetmaskTestMixin_v6.test_netmask_in_tuple_errors.<locals>.assertBadNetmaskr/  rZ   r3  r0  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                   @   r  )ŚInterfaceTestCase_v6N)r$   r%   r&   r   ŚIPv6Interfacer   r	   r	   r	   r
   r5  1  r  r5  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%  8  s<   
’’
’’
’’
’’
’’
’’z!NetworkTestCase_v6.test_subnet_ofc                 C   st   |   |  d” |  d””” |   |  d” |  d””” |   |  d” |  d””” |  |  d” |  d””” d S )Nr8  r9  r:  r;  r'  r   r	   r	   r
   r)  Q  r&  z#NetworkTestCase_v6.test_supernet_ofN)r$   r%   r&   r   r,  r   r%  r)  r	   r	   r	   r
   r7  5  s    r7  c                   @   r*   )
ŚFactoryFunctionErrorsc                 C   sF   d}d}|   t|||” || W d   dS 1 sw   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   ŚkindrD   rK   r	   r	   r
   ŚassertFactoryErrorf  s
   
"’z(FactoryFunctionErrors.assertFactoryErrorc                 C   ó   |   tjd” d S )NrJ   )r?  r   Ś
ip_addressr   r	   r	   r
   Śtest_ip_addressm  ó   z%FactoryFunctionErrors.test_ip_addressc                 C   r@  )NZ	interface)r?  r   Śip_interfacer   r	   r	   r
   Śtest_ip_interfacep  rC  z'FactoryFunctionErrors.test_ip_interfacec                 C   r@  )NŚnetwork)r?  r   Ś
ip_networkr   r	   r	   r
   Śtest_ip_networks  rC  z%FactoryFunctionErrors.test_ip_networkN)r$   r%   r&   r?  rB  rE  rH  r	   r	   r	   r
   r<  d  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 )ŚComparisonTestsr5   r0  rm   ś	::2%scopec                 C   sT   t  }| jD ]!}|  ||” |  ||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   )ŚobjectsrM  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_objectsrM  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_objectsrY  rM  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   )rL  r   ŚassertLessEqualŚassertGreaterEqual©r   rS  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_scopedrM  Z
assertLessr]  ZassertGreaterr^  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” q#| j| j| jg D ]	}|  || j” q6| j| j| jg D ]	}|  || j” qI| j	| j
 | jg D ]	}|  || j” q]d S r   )Śv4_addressesŚassertInrc  Śv6_addressesŚv6_scoped_addressesri  ro  r[  ŚassertNotInrX  rY  r_  r	   r	   r
   Śtest_containmentĪ  s   
’z ComparisonTests.test_containmentc                    s   | j D ]C | j D ]=t tstt rq|  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	   rz  r	   r
   r{  ć  r|  c                      s    kS r   r	   r	   rz  r	   r
   r{  ä  r|  c                      s    kS r   r	   r	   rz  r	   r
   r{  å  r|  )rL  Ś
isinstanceŚtyper6   r7   r   r	   rz  r
   Śtest_mixed_type_orderingŻ  s   

ś’z(ComparisonTests.test_mixed_type_orderingc              	   C   sN  t  }| jD ]}|  t” ||k  W d    n1 sw   Y  |  t” ||k W d    n1 s5w   Y  |  t” ||k W d    n1 sNw   Y  |  t” ||k W d    n1 sgw   Y  |  |tk ” |  |tk” |  |tk” |  |tk” |  |tk ” |  |tk” |  |tk” |  |tk” qd S r   )rK  rL  r6   r7   r   r   r#  r   rQ  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)ra  rc  re  rg  ri  rk  rm  ro  rq  r   Śsortedr[  r   Śget_mixed_type_keyrX  rY  rO  rK  )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/  r0  )r   rA  rG  r6   r7   Ś__lt__Ś__gt__)r   ra  rc  rg  ri  rm  ro  r	   r	   r
   Śtest_incompatible_versions  s,   





z*ComparisonTests.test_incompatible_versionsN)/r$   r%   r&   r   r   ra  r+  rc  r  re  rĀ   rg  r,  ri  r6  rk  rm  ro  rq  rt  r[  rv  rX  rw  rY  rU  rL  rb  rd  rf  rh  rj  rl  rn  rp  rr  rT  rV  rZ  r\  r`  rs  ry  r  r  r  r  r	   r	   r	   r
   rI  w  sL    




















		
rI  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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d ZNdd ZOdd ZPd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_networkr6  Ś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')r0  )r   r3   r   r  r6  r   r	   r	   r
   ŚtestRepr>  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 sYw   Y  |  t” t  |d
f” W d    n1 suw   Y  |  t” t  d” W d    n1 sw   Y  |  t” t  d” W d    n1 s©w   Y  |  t” t  |df” W d    n1 sÅw   Y  |  t” t  d” W d    n1 sßw   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 s”w   Y  |  t” t  d” W d    d S 1 s½w   Y  d S )Nr“   z192.0.2.1/32)r“   r  r  )ģ      r  )r“   rź   rź   )r  rź   )r“   r’   r’   )r  r’   )r“   r  r  )r  r  r   F©Śstrictrž   r  )ģ       r  rż   )r  r’   z192.0.2.1/24)r“   z255.255.255.255.0)r   r   r+  r   r6   r=  r  rG  )r   Śiprļ   r	   r	   r
   ŚtestIPv4TupleG  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 smw   Y  |  t” t  d” W d    n1 sw   Y  |  t” t  |df” W d    n1 s£w   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w   Y  |  t” t  |df” W d    n	1 s w   Y  |  t” t  d” W d    n	1 s;w   Y  |  t” t  d” W d    d S 1 sWw   Y  d S )Nrā   z2001:db8::/128)rā   Ś128)ģ	                n   rn   r  z2001:db8::/96)rā   Ś96)r   é`   r”  rć   ś2001:db8::1)r£  r¢  )ģ	               n   r¢  r¢  Fr  )r£  r”  z2001:db8::1/96)r¤  r”  ś2001:db8::1%scope)r„  r¢  )r£  r  )r   rĀ   r,  r   r6   r=  r6  rG  )r   r  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::ffffr0  z::ffff%scope)r   r   r   rĀ   rM  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 )NrZ   rm   )r6   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.12rn   r   zIPv4Network('1.2.3.0/24'))r   r   r   ŚlistŚ_find_address_rangeŚ_count_righthand_zero_bitsr3   r  )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   Śintr  Śnetwork_addressrģ   r  rī   r  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Ż   r  r  ģ	         ą/YE    é   é   )r   r  Ś_ipr   r  rG  rŗ  r»  rM  r  r6  r  r  Śversionr  r  )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::ó   ’’   ’’      rj   s                   )r   rA  r   r  rĄ  rD  r  r  rs   r	   r	   r
   ŚtestIpFromPacked  s&   

’
’
’ż
’
’zIpaddrUnitTest.testIpFromPackedc                 C   ó|   |   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ŗ  r  r  rģ   r  r  r   r	   r	   r
   Ś	testGetIp-  s   ’’’’zIpaddrUnitTest.testGetIpc                 C   s`   d}d}d}|| }t  |”}t  |”}|  t||” |  |j|| ” |  t|j|” d S )Nz0000:0000:0000:0000:0000:ffff:ś::ffff:rŻ   )r   rĀ   r6  r   rģ   Śexplodedr  )r   Zlong_prefixZshort_prefixrĀ  Zipv6_ipv4_strZipv6_ipv4_addrZipv6_ipv4_ifacer	   r	   r
   Ś&testIPv6IPv4MappedStringRepresentation:  s   

z5IpaddrUnitTest.testIPv6IPv4MappedStringRepresentationc                 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   r  Śscope_idrģ   r  r  r  r  r»  r  r   r	   r	   r
   ŚtestGetScopeIdE  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ŗ  r  rķ   rģ   r  Ś	prefixlenr  r   r	   r	   r
   ŚtestGetNetmaskS  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   rĪ   z::1/0z::1%scope/0)r   r  r   rŗ  rF  rķ   Ś_prefix_from_prefix_stringr6  )r   Zipv4_zero_netmaskZipv6_zero_netmaskZipv6_scoped_zero_netmaskr	   r	   r
   ŚtestZeroNetmask]  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
   ŚtestIPv4Netj  s   
zIpaddrUnitTest.testIPv4Netc                 C   rĖ  )Ni’ś	1.2.3.255l	   ’’’’ļ/YE    ś%2001:658:22a:cafe:ffff:ffff:ffff:ffff)r   rŗ  r  Śbroadcast_addressrģ   r  r  r   r	   r	   r
   ŚtestGetBroadcastn  s   ’’’’zIpaddrUnitTest.testGetBroadcastc                 C   s:   |   | jjjd” |   | jjjd” |   | jjjd” d S )Nr’   rÓ  )r   r  rF  rŌ  r  r  r   r	   r	   r
   ŚtestGetPrefixlen|  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   r  ŚsupernetrŌ  rģ   r»  r   r  rF  r+  r  r6  r,  r  r   r	   r	   r
   ŚtestGetSupernet  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 )Nre   é   z1.2.0.0é=   z2001:658:22a:caf8::)r   r  rć  rŌ  rģ   r»  r  r  r   r	   r	   r
   ŚtestGetSupernet3  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 )
Nrm   r5   ©Śprefixlen_diffŚ
new_prefixé   ©rź  ©ré  é   éA   é>   )r6   r=  r  rć  r   r  r  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.254rZ   ś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ō  rn   )
r°  r  Śhostsr   Ślenr   r   r,  rĀ   rG  )r   rł  r  r  Ś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 )
Nre   rķ  é   rģ  rą  rč  r¾  éD   rā  )	r   r  r  Śsubnetsr6   r=  r°  r  r  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·  r5   z	1.2.3.128rļ  )	r   r°  r  r’  rŌ  rģ   r»  r  r  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   ó   g | ]}t |qS r	   ©rģ   ©Ś.0rE   r	   r	   r
   Ś
<listcomp>  ó    z;IpaddrUnitTest.testGetSubnetForSingle32.<locals>.<listcomp>c                 S   r  r	   r  r  r	   r	   r
   r    r  rm   )r   r+  r’  r   )r   r  Ś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   r  r	   r  r  r	   r	   r
   r    r  z<IpaddrUnitTest.testGetSubnetForSingle128.<locals>.<listcomp>c                 S   r  r	   r  r  r	   r	   r
   r    r  rm   r1  c                 S   r  r	   r  r  r	   r	   r
   r    r  c                 S   r  r	   r  r  r	   r	   r
   r    r  )r   r,  r’  r   )r   r  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   r  r	   r  r  r	   r	   r
   r  !  r  z.IpaddrUnitTest.testSubnet2.<locals>.<listcomp>rm   )z
1.2.3.0/26z1.2.3.64/26z1.2.3.128/26z1.2.3.192/26c                 S   r  r	   r  r  r	   r	   r
   r  &  r  )ś2001:658:22a:cafe::/66z2001:658:22a:cafe:4000::/66z2001:658:22a:cafe:8000::/66z2001:658:22a:cafe:c000::/66)r  r’  r   r  )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   r  r	   r  r  r	   r	   r
   r  /  r  z2IpaddrUnitTest.testGetSubnets3.<locals>.<listcomp>é   re   )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   r  r	   r  r  r	   r	   r
   r  7  r  )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)r  r’  r   rś  r   r,  )r   r’  r  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ļ  ©r6   r=  r°  r  rF  r’  r  r  r  r  r  r   r	   r	   r
   ŚtestSubnetFailsForLargeCidrDiffB  ó$   ’
’’
’’
’z.IpaddrUnitTest.testSubnetFailsForLargeCidrDiffc                 C   s@   |   t| jjjd” |   t| jjjd” |   t| jjjd” d S )Nrė  rļ  )r6   r=  r  rF  rć  r  r  r   r	   r	   r
   Ś!testSupernetFailsForLargeCidrDiffP  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 )NrZ   r  r   r	   r	   r
   Ś"testSubnetFailsForNegativeCidrDiffX  r  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   rn   i   ģ            l            l             )r   r  Śnum_addressesr°  r’  rć  r  r  r   r	   r	   r
   ŚtestGetNum_Addressesf  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)	ru  r   r  r  rx  r   r#  r+  Ś__contains__)r   Śaddr1r	   r	   r
   ŚtestContainsw  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 )Nrf   ś1.2.3.5r©  z2001:658:22a:cafe::5r  )r   rģ   r  r6   Ś
IndexErrorŚ__getitem__r  r  r   r	   r	   r
   ŚtestNth  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.143rZ   )r   r+  r   rŌ  r°  rģ   )r   rD   Z	addr_listr	   r	   r
   ŚtestGetitem  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-   rm   ś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   r  r   r  r#  r6  r  r  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-   rm   r  r'  r(  rŻ   r)  r*  )r#  r  r   r  r   r6  r  r   r  r  r  r  r   r	   r	   r
   ŚtestNotEqualæ  s~   ’’’’’’’’’’’’’’’zIpaddrUnitTest.testNotEqualc                 C   ó   |   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*  r1  )r   rģ   r   r6  r   r	   r	   r
   ŚtestSlash128Constructorś  s   ’’z&IpaddrUnitTest.testSlash128Constructorc                 C   r-  )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” q:t  d”t  d”ft  d”t  d”ft  d”t  d”fg}
|
D ]\}}|  	t
t j||g” qid 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::/128r0  z2001::%scope/128)r   r   Ścollapse_addressesr   r°  r+  rG  r,  rA  r6   r7   )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 )Nr2  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Į  o  r   z;IpaddrUnitTest.testSummarizing.<locals>.IPv7Address.versionN)r$   r%   r&   r'   rĮ  r	   r	   r	   r
   ŚIPv7Addressn  s    r;  r/  r0  r   r4  z1.1.1.8z
1.1.1.0/29rį  r4  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.0rj   )r   Śsummarize_address_rangerA  rĀ   r6   r=  r°  r7   r   rG  r   Ś	_ALL_ONESr+  )r   Z	summarizer³  r“  r;  Zip_invalid1Zip_invalid2r	   r	   r
   ŚtestSummarizingf  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  r3  r/  ś::2r0  rJ  )r   r   rA  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   rD  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 )Nr4  z
1.1.1.0/32r5  r   rZ   r5   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  r3  r/  r?  )r   r+  r   r   Ścompare_networksŚ_get_networks_keyr,  r6   r7   r  r  r6  r  r  r  rG  r#  ŚsortZassertIsrA  rO  )	r   r³  r“  rµ  rĆ  rĀ  r8  r  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)r6   r=  r   rG  r   r	   r	   r
   ŚtestStrictNetworksa  ó   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   r  Śoverlapsr#  )r   rR  Zother2Zother3r	   r	   r
   ŚtestOverlapsf  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 )NrQ   z::%sz	::ffff:%sz2001:1.1.1.1:1.1.1.1)	r   r  r6  r   rŗ  r  rM  r6   r   )r   Zipv4_stringrĀ  Zv4compat_ipv6Zv4mapped_ipv6r	   r	   r
   ŚtestEmbeddedIpv4n  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”” |  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-0000:0000:0000:0000:0000:FFFF:192.168.255.255z::ffff:c0a8:ffffz-FFFF:0000:0000:0000:0000:0000:192.168.255.255zffff::c0a8:ffffz::FFFF:192.0.2.1%scopez::FFFF:c000:201%scopezFFFF::192.0.2.1%scopezFFFF::c000:201%scopez30000:0000:0000:0000:0000:FFFF:192.168.255.255%scopez::ffff:c0a8:ffff%scopez3FFFF:0000:0000:0000:0000:0000:192.168.255.255%scopezffff::c0a8:ffff%scope)r   r   rA  rM  r   r	   r	   r
   ŚtestIPv6AddressTooLargey  sH   ’’’’’’’’’’’’z&IpaddrUnitTest.testIPv6AddressTooLargec                 C   ó4   |   | jjd” |   | jjd” |   | jjd” d S )Nr¾  ræ  )r   r  rĮ  r  r  r   r	   r	   r
   ŚtestIPVersion  rH  zIpaddrUnitTest.testIPVersionc                 C   rM  )Nr  rn   )r   r  Śmax_prefixlenr  r  r   r	   r	   r
   ŚtestMaxPrefixLength  rH  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   r  Śpackedr   r  r  r6  r  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   rG  rA  r   r+  r~  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/24rO   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   rD  Śis_multicastrG  Śis_reservedŚ
is_privateŚis_link_localŚis_loopbackŚ	is_globalrA  Ś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/8ś
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/32rB  z::ff/128r*  ś::/128z::ffff:0:0/96z100::/64z2001:2::/48z2001:3::/48r2  z2001:10::/28zfc00::/7z	fe80::/10)r   r   rG  rW  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::rm   rn   r5   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/127rj   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   rG  rU  Śis_site_localrW  rX  rD  rY  r[  rZ  rA  r#  r   rV  r   r	   r	   r
   ŚtestReservedIpv60	  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.1rT  z
::c0a8:101z::ffff:c0a8:101)r   r   rA  Śipv4_mappedr   r	   r	   r
   ŚtestIpv4Mapped	  s   
ž’zIpaddrUnitTest.testIpv4Mappedc              	   C   sĀ   dD ]\}|   |”M t |”}t d| ”}|  |j|j” |  |j|j” |  |j|j” |  |j|j” |  |j	|j	” |  |j
|j
” |  |j|j” W d    n1 sYw   Y  qd S )N)z178.62.3.251z169.254.169.254ś	127.0.0.1z	224.0.0.1rQ   rO   z
100.64.0.1rĪ  )rA   r   r   rĀ   r   rZ  rW  rV  rU  r[  rX  rY  )r   Śaddr4rĀ  rĆ  r	   r	   r
   ŚtestIpv4MappedProperties	  s   	
ö÷z'IpaddrUnitTest.testIpv4MappedPropertiesc                 C   s,   |   dt d”j” |   dt d”j” d S )NTrb  Fz::ffff:172.32.0.0)r   r   rA  rW  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   rG  rA  r   r  r°  Śaddress_excluder6   r=  r7   ©r   r  Śaddr2Śaddr3rf  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 )Nri  rj  rŻ   r4  )r   Śhashr   rD  rG  rA  rŗ  rĄ  r  r  ru  )r   r³  r“  Zdummyr	   r	   r
   ŚtestHashÉ	  s.   ’’’’’



zIpaddrUnitTest.testHashc                 C   s6   | j }|  d|j” | j}|  t|jdd d ” d S )Nr  rm   rn   r5   )r  r   Ś
compressedr  r6   r=  Ś_string_from_ip_intrŁ  r	   r	   r
   ŚtestIPBasesŽ	  s   zIpaddrUnitTest.testIPBasesc                 C   óD   | j }|  d|j” |  d|j” |  d|j” |  dt|” d S )Nr  z)2001:658:22a:cafe::/ffff:ffff:ffff:ffff::z)2001:658:22a:cafe::/::ffff:ffff:ffff:ffff)r  r   Świth_prefixlenŚwith_netmaskŚwith_hostmaskrģ   rŁ  r	   r	   r
   ŚtestIPv6NetworkHelpersä	  s   ’’z%IpaddrUnitTest.testIPv6NetworkHelpersc                 C   ru  )Nr  z1.2.3.0/255.255.255.0z1.2.3.0/0.0.0.255)r  r   rv  rw  rx  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 )Nri  r'  r  rĢ  )r   rG  rD  r   rĀ   r   rl  r	   r	   r
   ŚtestCopyConstructorō	  s   





z"IpaddrUnitTest.testCopyConstructorc                 C   sØ   i 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d d!d"d#d$d%d&d'„}t | ” D ]\}}|  |tt |”” qBd S )(Nz1:2:3:4:5:6:7:8z1:2:3:4:5:6:7:8/128z2001:0:0:4:0:0:0:8z2001:0:0:4::8/128z2001:0:0:4:5:6:7:8z2001::4:5:6:7:8/128z2001:0:3:4:5:6:7:8z2001:0:3:4:5:6:7:8/128z0:0:3:0:0:0:0:ffffz0:0:3::ffff/128z0:0:0:4:0:0:0:ffffz::4:0:0:0:ffff/128z0:0:0:0:5:0:0:ffffz::5:0:0:ffff/128z1:0:0:4:0:0:7:8z1::4:0:0:7:8/128z0:0:0:0:0:0:0:0r^  z0:0:0:0:0:0:0:0/0rB  z0:0:0:0:0:0:0:1r*  z*2001:0658:022a:cafe:0000:0000:0000:0000/66r  rś   z::102:304/128z1:2:3:4:5:ffff:1.2.3.4z1:2:3:4:5:ffff:102:304/128z::7:6:5:4:3:2:1z0:7:6:5:4:3:2:1/128z::7:6:5:4:3:2:0z0:7:6:5:4:3:2:0/128z7:6:5:4:3:2:1::z7:6:5:4:3:2:1:0/128z0:6:5:4:3:2:1:0/128z::ffff:ffff/128z::ffff:255.255.255.255/128z+ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128)z0:6:5:4:3:2:1::z-0000:0000:0000:0000:0000:0000:255.255.255.255z-0000:0000:0000:0000:0000:ffff:255.255.255.255z-ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255)r°  Śitemsr   rģ   r   r6  )r   Ztest_addressesZuncompressedrr  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:ba1r6  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   r6  rĀ   r,  r   r   rĻ  )r   r  rm  rn  rf  r	   r	   r
   ŚtestExplodeShortHandIpStr
  s"   



’
’’’z(IpaddrUnitTest.testExplodeShortHandIpStrc              	   C   s¬   dD ]'\}}| j d|d t |”}|  |j|” W d    n1 s$w   Y  qdD ]'\}}| j d|d t |”}|  |j|” W d    n1 sNw   Y  q,d S )N))re  z1.0.0.127.in-addr.arpa)z	10.2.0.52z52.0.2.10.in-addr.arpaZipv4_reverse_pointerr   ))r£  zH1.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)z::FFFF:192.168.1.35zH3.2.1.0.8.a.0.c.f.f.f.f.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa)z4321:0:1:2:3:4:567:89abzHb.a.9.8.7.6.5.0.4.0.0.0.3.0.0.0.2.0.0.0.1.0.0.0.0.0.0.0.1.2.3.4.ip6.arpaZipv6_reverse_pointer)rA   r   r   r   Śreverse_pointerrĀ   )r   Zaddr_v4ZexpectedrD   Zaddr_v6r	   r	   r
   ŚtestReversePointer/
  s   
ž
žčz!IpaddrUnitTest.testReversePointerc                 C   s(   |   dt| j” |   dt| j” d S )Nrē   r½  )r   rŗ  r  r  r   r	   r	   r
   ŚtestIntRepresentationU
  s   ’z$IpaddrUnitTest.testIntRepresentationc                 C   s,   |   t d”jd” |   t d”jd” d S )Nr5   r¾  ræ  )r   r   rG  rĮ  r,  r   r	   r	   r
   ŚtestForceVersionZ
  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   r  rv  rw  rx  r  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¹  )rx  r  Ś__dict__r   rŻ  r   r   rī   ru  r  r»  rĀ   r  rF  r   r	   r	   r
   ŚtestNetworkElementCachingn
  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:fdd2r~  z94.245.121.253z95.26.244.94)r   r   r   rA  Śteredor#  rĀ   )r   ZserverŚclientZteredo_addrŚbad_addrr	   r	   r
   Ś
testTeredo
  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   rA  r   r   Ś	sixtofourr#  )r   Zsixtofouraddrr  r	   r	   r
   ŚtestsixtofourŖ
  s   

’zIpaddrUnitTest.testsixtofourc                 C   ó,   t  d”}t  d”}|  | ” | ” ” d S )NrŻ   z2.3.4.5)r   r  rM  Ś__hash__)r   Zipv4_address1Zipv4_address2r	   r	   r
   ŚtestV4HashIsNotConstant²
  ó   

z&IpaddrUnitTest.testV4HashIsNotConstantc                 C   r  )Nr  z2001:658:22a:cafe:200:0:0:2)r   r6  rM  r  )r   Zipv6_address1Zipv6_address2r	   r	   r
   ŚtestV6HashIsNotConstantø
  r  z&IpaddrUnitTest.testV6HashIsNotConstantc                 C   sd   |   t d” ” t d” ” ” |   t d” ” t d” ” ” |   t d” ” t d” ” ” d S )Nz192.168.1.255/32z192.168.1.0/24z172.24.255.0/24z172.24.0.0/16z192.168.1.87/32z192.168.1.86/31)rM  r   r+  r  r   r	   r	   r
   ŚtestNetworkV4HashCollisions¾
  s   žžžz*IpaddrUnitTest.testNetworkV4HashCollisionsc                 C   sD   |   t d” ” t d” ” ” |   t d” ” t d” ” ” d S )Nz	fe80::/64zfe80::ffff:ffff:ffff:0/112r]  z'ffff:ffff:ffff:ffff:ffff:ffff:aff:0/112)rM  r   r,  r  r+  r   r	   r	   r
   ŚtestNetworkV6HashCollisionsĶ
  s   ž’üz*IpaddrUnitTest.testNetworkV6HashCollisionsN)Qr$   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/  r0  r1  r9  r>  r@  rA  rF  rG  rJ  rK  rL  rN  rP  rR  rS  r\  r_  ra  rd  rg  rh  ro  rq  rt  ry  rz  r{  r}  r  r  r  r  r  r  r  r  r  r  r  r  r	   r	   r	   r
   r  ,  s    	GC
6%7bIMW
M"[	&*r  Ś__main__)r  Zunittestr1   r(   r8   r?   r   r¹   Ztest.supportr   r   ZTestCaser   r+   rH   ri   rw   r¼   rå   r  r  r.  r5  r7  r<  rI  r  r$   Śmainr	   r	   r	   r
   Ś<module>   sV   621p  Y6i/ 6             ;’