o
    HXīh©õ ć                   @   sb  	 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 )"é    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   sh    	 |r|| }|   ||”}|}|V  W d    n1 sw   Y  |jjd ur2|  |jj” d S d S r   )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 r   )r   Ś	ipaddressŚAddressValueError©r   r   r   r	   r	   r
   ŚassertAddressError8   ó   ’’zBaseTestCase.assertAddressErrorc                 G   r   r   )r   r   ŚNetmaskValueErrorr   r	   r	   r
   ŚassertNetmaskError=   r   zBaseTestCase.assertNetmaskErrorc                 C   s   	 |   |  |”|  |”” d S r   )Ś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                   @   óF   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S )ŚNetmaskTestMixin_v4c                 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&   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_v6c                 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   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                    r  r  r
  r  r   r	   r
   r  !  r  zJNetmaskTestMixin_v6.test_netmask_in_tuple_errors.<locals>.assertBadNetmaskr-  rZ   r1  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                   @   r  )ŚInterfaceTestCase_v6N)r$   r%   r&   r   ŚIPv6Interfacer   r	   r	   r	   r
   r3  1  r  r3  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 )Nr6  r7  r8  r9  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
   r5  5  s    r5  c                   @   r*   )
ŚFactoryFunctionErrorsc                 C   sH   	 d}d}|   t|||” || W d    d S 1 sw   Y  d S )NZcamelotz+%r does not appear to be an IPv4 or IPv6 %s)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  rA  z'FactoryFunctionErrors.test_ip_interfacec                 C   r>  )NŚnetwork)r=  r   Ś
ip_networkr   r	   r	   r
   Śtest_ip_networks  rA  z%FactoryFunctionErrors.test_ip_networkN)r$   r%   r&   r=  r@  rC  rF  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   r.  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   )ŚobjectsrK  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_objectsrK  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_objectsrW  rK  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   )rJ  r   ŚassertLessEqualŚassertGreaterEqual©r   rQ  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_scopedrK  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ŚassertInra  Śv6_addressesŚv6_scoped_addressesrg  rm  rY  ŚassertNotInrV  rW  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	   rx  r	   r
   ry  ć  rz  c                      s    kS r   r	   r	   rx  r	   r
   ry  ä  rz  c                      s    kS r   r	   r	   rx  r	   r
   ry  å  rz  )rJ  Ś
isinstanceŚtyper6   r7   r   r	   rx  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   )rI  rJ  r6   r7   r   r   r!  r   rO  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)r_  ra  rc  re  rg  ri  rk  rm  ro  r   ŚsortedrY  r   Śget_mixed_type_keyrV  rW  rM  rI  )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?  rE  r6   r7   Ś__lt__Ś__gt__)r   r_  ra  re  rg  rk  rm  r	   r	   r
   Śtest_incompatible_versions  s,   





z*ComparisonTests.test_incompatible_versionsN)/r$   r%   r&   r   r   r_  r)  ra  r  rc  rĀ   re  r*  rg  r4  ri  rk  rm  ro  rr  rY  rt  rV  ru  rW  rS  rJ  r`  rb  rd  rf  rh  rj  rl  rn  rp  rR  rT  rX  rZ  r^  rq  rw  r}  r~  r  r  r	   r	   r	   r
   rG  w  sL    




















		
rG  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_networkr4  Ś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   r3   r   r  r4  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  rE  )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;  r4  rE  )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::ffffr.  z::ffff%scope)r   r   r   rĀ   rK  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  rE  rø  r¹  rK  r  r4  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   r?  r   r  r¾  rB  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Ā   r4  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ø  rD  rģ   Ś_prefix_from_prefix_stringr4  )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  rD  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  rD  r)  r  r4  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Ā   rE  )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   r/  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  rD  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  rD  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)	rs  r   r  r  rv  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!  r4  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   r4  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(  r/  )r   rė   r   r4  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::/128r.  z2001::%scope/128)r   r   Ścollapse_addressesr   r®  r)  rE  r*  r?  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 )Nr0  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    r9  r-  r.  r   r2  z1.1.1.8z
1.1.1.0/29rß  r2  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_ranger?  rĀ   r6   r;  r®  r7   r   rE  r   Ś	_ALL_ONESr)  )r   Z	summarizer±  r²  r9  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  r1  r-  ś::2r.  rH  )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   rB  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 )Nr2  z
1.1.1.0/32r3  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  r1  r-  r=  )r   r)  r   r   Ścompare_networksŚ_get_networks_keyr*  r6   r7   r  r  r4  r  r  r  rE  r!  ŚsortZassertIsr?  rM  )	r   r±  r²  r³  rĮ  rĄ  r6  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   rE  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   rP  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  r4  r   rø  r  rK  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   r?  rK  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  rF  zIpaddrUnitTest.testIPVersionc                 C   rK  )Nr  rn   )r   r  Śmax_prefixlenr  r  r   r	   r	   r
   ŚtestMaxPrefixLength  rF  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  r4  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   rE  r?  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   rB  Śis_multicastrE  Ś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/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/32r@  z::ff/128r(  ś::/128z::ffff:0:0/96z100::/64z2001:2::/48z2001:3::/48r0  z2001:10::/28zfc00::/7z	fe80::/10)r   r   rE  rU  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   rE  rS  Śis_site_localrU  rV  rB  rW  rY  rX  r?  r!  r   rT  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.1rR  z
::c0a8:101z::ffff:c0a8:101)r   r   r?  Ś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   rX  rU  rT  rS  rY  rV  rW  )r   Śaddr4rĄ  rĮ  r	   r	   r
   ŚtestIpv4MappedProperties	  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?  rU  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   rE  r?  r   r  r®  Śaddress_excluder6   r;  r7   ©r   r  Śaddr2Śaddr3rd  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 )Nrg  rh  rŻ   r2  )r   Śhashr   rB  rE  r?  rø  r¾  r  r  rs  )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   rs  )Nr  z1.2.3.0/255.255.255.0z1.2.3.0/0.0.0.255)r  r   rt  ru  rv  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 )Nrg  r%  r  rŹ  )r   rE  rB  r   rĀ   r   rj  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/0r@  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   r4  )r   Ztest_addressesZuncompressedrp  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:ba1r4  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   r4  rĀ   r*  r   r   rĶ  )r   r  rk  rl  rd  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))rc  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   rE  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  rt  ru  rv  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·  )rv  r  Ś__dict__r   rŪ  r   r   rķ   rs  r  r¹  rĀ   r  rD  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   r?  Ś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   r?  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  rK  Ś__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   r4  rK  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)rK  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)rK  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-  r.  r/  r7  r<  r>  r?  rD  rE  rH  rI  rJ  rL  rN  rP  rQ  rZ  r]  r_  rb  re  rf  rm  ro  rr  rw  rx  ry  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__)Zunittestr1   r(   r8   r?   r   r¹   Ztest.supportr   r   ZTestCaser   r+   rH   ri   rw   r¼   rå   r  r  r,  r3  r5  r:  rG  r  r$   Śmainr	   r	   r	   r
   Ś<module>   sV   621p  Y6i/ 6             ;’