o
    °ó®gåĪ ć                   @   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	   śI/Users/admin/.pyenv/versions/3.10.0/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 AddressValueErrorN)r   Ś	ipaddressŚAddressValueError©r   r   r   r	   r	   r
   ŚassertAddressError8   ó
   ’’zBaseTestCase.assertAddressErrorc                 G   r   )z Ensure a clean NetmaskValueErrorN)r   r   Z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    q1 s.w   Y  qd S )Nr4   )Ś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.   r3   r;   rF   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    q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.016rH   z001.000.008.016z	01.2.3.40z	1.02.3.40z	1.2.03.40z	1.2.3.040)Śaddress)r@   r   r   )r   ŚmsgZ	addressesrI   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Ś00000000rM   Śc0a80001rO   )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   r0   r1   r   ©r   rJ   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        rY   rZ   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 addressrY   ©ŚlengthrC   rJ   r   r	   r
   ŚassertBadLength   s
   "’zBCommonTestMixin_v4.test_bad_packed_length.<locals>.assertBadLengthé   é   r	   ©r   rb   r	   r   r
   Śtest_bad_packed_length   s   z)CommonTestMixin_v4.test_bad_packed_lengthN)	r#   r$   r%   rK   rQ   rV   r[   r]   rf   r	   r	   r	   r
   rG   `   s    rG   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   rL   )Nz
0000::0000ś::z000::c0a8:0001ś::c0a8:1rP   r   r	   r	   r
   rK      rR   z%CommonTestMixin_v6.test_leading_zerosc                 C   rL   )Nr   rh   rN   ri   rP   r   r	   r	   r
   rQ      rR   zCommonTestMixin_v6.test_intc                 C   sR   dt  d” }|  |d” dt  d” }|  |d” t  d”d }|  |d” d S )Ns               rS   rh   rT   ri   zc0a8:1::)r:   rU   r"   ©r   rC   r	   r	   r
   rV      s   zCommonTestMixin_v6.test_packedc                 C   rW   )Nz,-1 (< 0) is not permitted as an IPv6 addressrX   rY   rZ   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é   é   rY   rZ   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 )Nr_   z5%r (len %d != 16) is not permitted as an IPv6 addressrY   r`   r   r	   r
   rb   Æ   s   
"žzBCommonTestMixin_v6.test_bad_packed_length.<locals>.assertBadLengthé   é   r	   re   r	   r   r
   rf   ®   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   rI   r	   r	   r
   Śtest_blank_scope_id¹   ó   "’z&CommonTestMixin_v6.test_blank_scope_idc                 C   ro   )Nz
::1%scope%rp   r-   rq   r	   r	   r
   Ś"test_invalid_scope_id_with_percent¾   rs   z5CommonTestMixin_v6.test_invalid_scope_id_with_percentN)r#   r$   r%   rK   rQ   rV   r[   r]   rf   rr   rt   r	   r	   r	   r
   rg      s    rg   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)Śnry   )rD   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)Śsrw   )r,   rw   )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   rj   r	   r	   r
   Śtest_network_passed_as_addressß   rs   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   ©rC   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   r0   r1   r   r   ©rC   ZoctetrJ   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©rF   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
   ru   Ć   s    			ru   c                   @   s   e Zd ZejZdd Zdd Zdd Zdd Z	d	d
 Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZdS )ŚAddressTestCase_v6c                 C   rv   )Nz
::1.2.3.42))rx   Z00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000100000001100101010)rz   Ś 0000000000000000000000000102032a)rD   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Ą   ©rC   rJ   r   r	   r
   r   `  rs   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                    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Ä   )rC   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   r0   r1   r   rĄ   ©rC   ŚpartrJ   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¹   #  s   zAddressTestCase_v6.test_weakrefN)r#   r$   r%   r   rĄ   r   r   r   rČ   rŹ   rĖ   rĢ   rĶ   rĻ   rŃ   rÓ   rŖ   rÜ   r“   r¹   r	   r	   r	   r
   rŗ   3  s     )	rŗ   c                   @   ó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.255rM   ©r   r   ŚstrŚnetmaskŚhostmask)r   rI   Śnetr	   r	   r
   Śtest_no_mask+  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-   rj   r	   r	   r
   Śtest_split_netmask4  s   "’z&NetmaskTestMixin_v4.test_split_netmaskc                    s\    fdd}|dd |dd |dd |dd |d	d |d
d |dt  d” d S )Nc                    ó:      |”   | ” W d    d S 1 sw   Y  d S r   r-   ©rC   r   r   r	   r
   ŚassertBadAddress:  r/   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))r0   r1   ©r   rš   r	   r   r
   Śtest_address_errors9  s   





z'NetmaskTestMixin_v4.test_address_errorsc                 C   s²   |   t|  d”d” tddD ]F}d| }|  |”}|   t||” |   t|  d|j ”|” |   t|  d| ”|” |dv rHdd	|  }|   t|  d|j ”|” qd S )
Nz192.0.2.0/255.255.255.0ś192.0.2.0/24r   é!   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_netmaskF  s"   ’
’’ņz&NetmaskTestMixin_v4.test_valid_netmaskc                    s    fdd}|dd |dd |dd |dd |dd |dd	 |dd
 |dd |dd |dd |dd |dd |dd |dd d S )Nc                    ó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   r0   r1   r   ©rC   rč   rJ   r   r	   r
   ŚassertBadNetmask[  ó   "’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Śpuddingrh   r	   ©r   r  r	   r   r
   Śtest_netmask_errorsZ  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  p  ó   "’zJNetmaskTestMixin_v4.test_netmask_in_tuple_errors.<locals>.assertBadNetmaskr  rX   rł   r	   r	  r	   r   r
   Śtest_netmask_in_tuple_errorso  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/31ś	192.0.2.0r³   r   r	   r	   r
   r“   w  s   

zNetmaskTestMixin_v4.test_pickleN©r#   r$   r%   Ś__doc__rė   rķ   r÷   rż   r
  r  r“   r	   r	   r	   r
   rą   (  s    	rą   c                   @   ó   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)r5   r6   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)ś::1r4   s                  r!  z'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffffrh   ś	::1%scopeś::1%scope/128rę   )r   rI   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   rC   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š   Ņ  r/   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D ]}d| }|   t|  |”|” |   t|  d| ”|” q|   t|  d”d” tddD ]}d| }|   t|  |”|” |   t|  d| ”|” q?d S )Nz2001:db8::/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  rh   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&  rX   r)  r'  r	   r	  r	   r   r
   r    s   

z0NetmaskTestMixin_v6.test_netmask_in_tuple_errorsc                 C   s,   |   d” |   d” |   d” |   d” d S )Nz2001:db8::1000/124z2001:db8::1000/127z2001:db8::1000z2001:db8::1000%scoper³   r   r	   r	   r
   r“     s   


zNetmaskTestMixin_v6.test_pickleNr  r	   r	   r	   r
   r%  ·  s    		r%  c                   @   r  )ŚInterfaceTestCase_v6N)r#   r$   r%   r   ŚIPv6Interfacer   r	   r	   r	   r
   r+    r  r+  c                   @   s"   e Zd ZejZdd Zdd ZdS )ŚNetworkTestCase_v6c                 C   s¬   |   |  d” |  d””” |  |  d” |  d””” |   |  d” |  d””” |   |  d” |  d””” |   |  d” |  d””” |  |  d” |  d””” d S )Nś2000:999::/56ś2000:aaa::/48ś2000:aaa::/56ś2000:bbb::/56z2000:999::%scope/56z2000:aaa::%scope/48z2000:aaa::%scope/56r  r   r	   r	   r
   r  #  s<   
’’
’’
’’
’’
’’
’’z!NetworkTestCase_v6.test_subnet_ofc                 C   st   |   |  d” |  d””” |   |  d” |  d””” |   |  d” |  d””” |  |  d” |  d””” d S )Nr.  r/  r0  r1  r  r   r	   r	   r
   r   <  r  z#NetworkTestCase_v6.test_supernet_ofN)r#   r$   r%   r   r#  r   r  r   r	   r	   r	   r
   r-     s    r-  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   ŚkindrC   rJ   r	   r	   r
   ŚassertFactoryErrorQ  s
   
"’z(FactoryFunctionErrors.assertFactoryErrorc                 C   ó   |   tjd” d S )NrI   )r5  r   Ś
ip_addressr   r	   r	   r
   Śtest_ip_addressX  ó   z%FactoryFunctionErrors.test_ip_addressc                 C   r6  )NZ	interface)r5  r   Śip_interfacer   r	   r	   r
   Śtest_ip_interface[  r9  z'FactoryFunctionErrors.test_ip_interfacec                 C   r6  )NŚnetwork)r5  r   Ś
ip_networkr   r	   r	   r
   Śtest_ip_network^  r9  z%FactoryFunctionErrors.test_ip_networkN)r#   r$   r%   r5  r8  r;  r>  r	   r	   r	   r
   r2  O  s
    r2  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 )ŚComparisonTestsr4   r'  rk   ś	::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   )ŚobjectsrC  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_objectsrC  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_objectsrO  rC  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   )rB  r   ŚassertLessEqualŚassertGreaterEqual©r   rI  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_scopedrC  Z
assertLessrS  ZassertGreaterrT  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ŚassertInrY  Śv6_addressesŚv6_scoped_addressesr_  re  rQ  ŚassertNotInrN  rO  rU  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	   rp  r	   r
   rq  Ī  rr  c                      s    kS r   r	   r	   rp  r	   r
   rq  Ļ  rr  c                      s    kS r   r	   r	   rp  r	   r
   rq  Š  rr  )rB  Ś
isinstanceŚtyper5   r6   r   r	   rp  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   )rA  rB  r5   r6   r   r   r  r   rG  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)rW  rY  r[  r]  r_  ra  rc  re  rg  r   ŚsortedrQ  r   Zget_mixed_type_keyrN  rO  rE  rA  )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   r7  r=  r5   r6   Ś__lt__Ś__gt__)r   rW  rY  r]  r_  rc  re  r	   r	   r
   Śtest_incompatible_versionsł  s,   





z*ComparisonTests.test_incompatible_versionsN)/r#   r$   r%   r   r   rW  r"  rY  r  r[  rĄ   r]  r#  r_  r,  ra  rc  re  rg  rj  rQ  rl  rN  rm  rO  rK  rB  rX  rZ  r\  r^  r`  rb  rd  rf  rh  rJ  rL  rP  rR  rV  ri  ro  ru  rv  ry  r|  r	   r	   r	   r
   r?  b  sL    




















		
r?  c                   @   sT  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S )ŚIpaddrUnitTestc                 C   sp   t  d”| _t  d”| _t  d”| _t  d”| _t  d”| _	t  
d”| _t  d”| _t  d”| _t  
d	”| _d S )
NrŲ   ś
1.2.3.4/24ś
1.2.3.0/24ś2001:658:22a:cafe:200:0:0:1z2001:658:22a:cafe:200:0:0:1/64ś2001:658:22a:cafe::/64ś!2001:658:22a:cafe:200:0:0:1%scopez$2001:658:22a:cafe:200:0:0:1%scope/64z2001:658:22a:cafe::%scope/64)r   r   Śipv4_addressr  Śipv4_interfacer"  Śipv4_networkr,  Śipv6_addressŚipv6_interfacer#  Śipv6_networkŚipv6_scoped_addressŚipv6_scoped_interfaceŚipv6_scoped_networkr   r	   r	   r
   ŚsetUp  s"   ’’’’zIpaddrUnitTest.setUpc                 C   sF   |   dtt d”” |   dtt d”” |   dtt d”” d S )NzIPv4Interface('1.2.3.4/32')rŲ   zIPv6Interface('::1/128')r&  zIPv6Interface('::1%scope/128')r'  )r   r2   r   r  r,  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”” d S )Nr²   z192.0.2.1/32)r²   rś   rś   )ģ      rś   )r²   rå   rå   )r  rå   )r²   é   r  )r  r  )r²   ś255.255.255.0r  )r  r  rų   F©Śstrictr  )r  r  )ģ       r  )r  r  )r  r  z192.0.2.1/24)r   r   r"  r   r5   r3  r  )r   Śiprź   r	   r	   r
   ŚtestIPv4Tuple2  s²   

’
’’’’’’’’’

’’’’
’’
žž
’žž
žž

’
’’’’’zIpaddrUnitTest.testIPv4Tuplec                 C   sP  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    d S 1 s!w   Y  d S )NrŻ   z2001:db8::/128)rŻ   Ś128)ģ	                n   rl   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   r5   r3  r,  )r   r  rź   Ś	ip_scopedr	   r	   r
   ŚtestIPv6Tupleq  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Ą   rC  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 )NrX   rk   )r5   r3  r   Zv4_int_to_packedZ
IPV4LENGTHZv6_int_to_packedZ
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.12rl   r   zIPv4Network('1.2.3.0/24'))r   r   r   ŚlistZ_find_address_rangeZ_count_righthand_zero_bitsr2   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  r=  r«  r¬  rC  r  r,  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::ó   ’’   ’’      rh   s                   )r   r7  r   r  r±  r:  r  r  rq   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   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  Zscope_idrē   r  r  r  r  r¬  r  r   r	   r	   r
   ŚtestGetScopeId  s$   
’’
’’’’zIpaddrUnitTest.testGetScopeIdc                 C   st   |   t| jjd” |   t| jjd” |   t| jjd” |   | jjd” |   t| jjd” |   | jjd” d S )Nl    ’ r  l	           š’’’’ é@   )r   r«  r  rč   rē   r  Ś	prefixlenr  r   r	   r	   r
   ŚtestGetNetmask#  s   ’’zIpaddrUnitTest.testGetNetmaskc                 C   s   t  d”}|  t|jjd” |  | d”d” t  d”}|  t|jjd” |  | d”d” t  d”}|  t|jjd” |  | d”d” d S )Nś	1.2.3.4/0r   Ś0z::1/0z::1%scope/0)r   r  r   r«  r<  rč   Z_prefix_from_prefix_stringr,  )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
   ŚtestIPv4Net:  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
   ŚtestGetBroadcast>  s   ’’’’zIpaddrUnitTest.testGetBroadcastc                 C   s:   |   | jjjd” |   | jjjd” |   | jjjd” d S )Nr  rĄ  )r   r  r<  rĮ  r  r  r   r	   r	   r
   ŚtestGetPrefixlenL  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  r<  r"  r  r,  r#  r  r   r	   r	   r
   ŚtestGetSupernetQ  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 )Nrc   é   z1.2.0.0é=   z2001:658:22a:caf8::)r   r  rŠ  rĮ  rē   r¬  r  r  r   r	   r	   r
   ŚtestGetSupernet3b  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 )
Nrk   r4   ©Śprefixlen_diffŚ
new_prefixé   ©r×  ©rÖ  é   éA   é>   )r5   r3  r  rŠ  r   r  r  r   r	   r	   r
   ŚtestGetSupernet4n  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.254rX   ś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į  rl   )
r£  r  Śhostsr   Ślenr   r   r#  rĄ   r=  )r   rę  r  r  Z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 )
Nrc   rŚ  é   rŁ  rĶ  rÕ  rÆ  éD   rĻ  )	r   rx  r  Śsubnetsr5   r3  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Ø  r4   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ē   ©Ś.0rD   r	   r	   r
   Ś
<listcomp>Ž  ó    z;IpaddrUnitTest.testGetSubnetForSingle32.<locals>.<listcomp>c                 S   rī  r	   rļ  rš  r	   r	   r
   rņ  ß  ró  rk   )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ó  rk   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>rk   )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   Z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>é   rc   )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ņ    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Ü  ©r5   r3  r£  r  r<  rė  r  r  r  r  r  r   r	   r	   r
   ŚtestSubnetFailsForLargeCidrDiff  ó$   ’
’’
’’
’z.IpaddrUnitTest.testSubnetFailsForLargeCidrDiffc                 C   s@   |   t| jjjd” |   t| jjjd” |   t| jjjd” d S )NrŲ  rÜ  )r5   r3  r  r<  rŠ  r  r  r   r	   r	   r
   Ś!testSupernetFailsForLargeCidrDiff   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 )NrX   rž  r   r	   r	   r
   Ś"testSubnetFailsForNegativeCidrDiff(  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   rl   i   ģ            l            l             )r   r  Znum_addressesr£  rė  rŠ  r  r  r   r	   r	   r
   ŚtestGetNum_Addresses6  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)	rk  r   r  r  rn  r   r  r"  Ś__contains__)r   Śaddr1r	   r	   r
   ŚtestContainsG  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 )Nrd   ś1.2.3.5r   z2001:658:22a:cafe::5r  )r   rē   r  r5   Ś
IndexErrorŚ__getitem__r  r  r   r	   r	   r
   ŚtestNthT  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.143rX   )r   r"  r   rĮ  r£  rē   )r   rC   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,   rk   ś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  r,  r  r  r   r	   r	   r
   Ś	testEqualj  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,   rk   r  r  r  rŲ   r  r  )r  r  r   r  r   r,  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   r,  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   Zcollapse_addressesr   r£  r"  r=  r#  r7  r5   r6   )r   r¤  r„  r¦  Śip4Zip5Zip6Z	collapsedZip_same1Zip_same2Zaddr_tuplesr	   r	   r
   ŚtestCollapsingŌ  s¶   





’
’’





’





’
’’

’
’ž
’
ž





’’’ū
’’’’ū
’’zIpaddrUnitTest.testCollapsingc              	   C   sV  t j}t  d”}t  d”}G dd dt j}|d}|d}|  tt|||” |  tt||t  d”” |  tt||t  d”” |  t|||d t  	d”” t  d	”}|  t|||t  	d
”t  	d	”g” t  
d”}t  
t j
j”}|  t  d”gt|||” t  d”}t  d”}|  t|||d t  	d”” t  d”}|  t|||t  	d”t  	d”g” t  d”}t  d”}|  t|||d t  	d”” t  d”}|  t|||t  	d”t  	d”g” |  tt|t  d”t  d”” |  tt|t  	d”t  	d”” |  tt|t  	d”t  	d”” |  tt|t  d”t  	d”” d S )Nr  z	1.1.1.255c                   @   s   e Zd Zedd ZdS )z3IpaddrUnitTest.testSummarizing.<locals>.IPv7Addressc                 S   s   dS )Né   r	   r   r	   r	   r
   r²  ?  r   z;IpaddrUnitTest.testSummarizing.<locals>.IPv7Address.versionN)r#   r$   r%   r&   r²  r	   r	   r	   r
   ŚIPv7Address>  s    r$  r&  r'  r   r  z1.1.1.8z
1.1.1.0/29rĪ  r*  z$1:ffff:ffff:ffff:ffff:ffff:ffff:ffffz1::/16z2::z2::/128z	1::%scopez*1:ffff:ffff:ffff:ffff:ffff:ffff:ffff%scopez	2::%scopez1.1.0.0rh   )r   Zsummarize_address_ranger7  rĄ   r5   r3  r£  r6   r   r=  r   Z	_ALL_ONESr"  )r   Z	summarizer¤  r„  r$  Zip_invalid1Zip_invalid2r	   r	   r
   ŚtestSummarizing6  s   

’’’’
’’
’

’
’’

’
’’
’’
’’
’’
’’zIpaddrUnitTest.testSummarizingc                 C   s    |   t d”t d”k” |   t d”t d”k” |   t d”t d”k” |   t d”t d”k” |   t d”t d”k” |   t d”t d”k” d S )Nr  r  r&  ś::2r'  r@  )r   r   r7  r   r	   r	   r
   ŚtestAddressComparison  s$   ’’’’’
’z$IpaddrUnitTest.testAddressComparisonc                 C   s  |   t d”t d”k” |   t d”t d”k ” |   t d”t d”k ” |   t d”t d”k ” |   t d”t d”k” |   t d”t d”k” |   t d”t d”k” |   t d”t d”k” |   t d”t d”k ” |   t d”t d”k ” |   t d”t d”k ” |   t d”t d”k” |   t d”t d”k” |   t d”t d”k” |   t d	”t d	”k” |   t d	”t d
”k ” |   t d	”t d”k ” |   t d”t d	”k ” |   t d
”t d	”k” |   t d”t d	”k” |   t d	”t d”k” |  t d	”t d”k” |   t d	”t d”k ” |   t d	”t d”k ” |   t d”t d”k ” |   t d
”t d”k” |   t d”t d”k” |   t d	”t d”k” |  t d”t d	”k” |   t d”t d
”k ” |   t d”t d”k ” |   t d”t d	”k ” |   t d”t d	”k” |   t d”t d	”k” |   t d”t d”k” d S )Nz
1.1.1.1/24z
1.1.1.1/16z
1.1.1.2/24z
1.1.1.2/16z::1/64z::1/80z::2/64z::2/48z::1%scope/64z::1%scope/80z::2%scope/64z::2%scope/48)r   r   r:  r  r   r	   r	   r
   ŚtestInterfaceComparison  sŅ   ’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’
’z&IpaddrUnitTest.testInterfaceComparisonc           	      C   sb  t  d”}t  d”}t  d”}|  ||k ” |  ||k” |  | |”d” |  | |”d” |  | |”d” |  | |”d” |  | |”d” |  | ” | ” k ” t  d”}t  d”}t  d	”}|  ||k ” |  ||k” |  | |”d” |  | ” | ” k ” |  t| j	j| j
” t  d
”}t  d”}|  t|j|” |  t|j|” |  t|j|” |  t|j|” t  d”}|  ||k ” |  ||k” t  d”}|  ||k ” |  ||k ” |  ||k” |  ||k” t  d”}|  ||k ” |  ||k ” |  ||k” |  ||k” t  d”}t  d”}t  d”}t  d”}||||g}||||g}| ”  |  ||” ||||g}| ”  |  ||” |  | t  d””t” |  | t  d””t” |  t  d”t  d”k” |  t  d”t  d”k” |  t  d”t  d”k” |  t  d”t  d”k” |  t  d”t  d”k” |  t  d”t  d”k” d S )Nr  z
1.1.1.0/32r  r   rX   r4   z2001:2000::/96z2001:2001::/96z2001:ffff:2000::/96ś::/0rĪ  z10.1.2.128/25z10.1.3.0/24z10.1.3.0/25z10.10.10.0/31z
10.10.10.0z10.10.10.2/31z
10.10.10.2r  r  r&  r&  )r   r"  r   r   Zcompare_networksZ_get_networks_keyr#  r5   r6   r  r  r,  r  rz  r{  r=  r  ŚsortZassertIsr7  rE  )	r   r¤  r„  r¦  r“  r³  r!  rx  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)r5   r3  r   r=  r   r	   r	   r
   ŚtestStrictNetworks1  ó   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  Zoverlapsr  )r   rH  Zother2Zother3r	   r	   r
   ŚtestOverlaps6  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 )NrO   z::%sz	::ffff:%sz2001:1.1.1.1:1.1.1.1)	r   r  r,  r   r«  r  rC  r5   r   )r   Zipv4_stringr³  Zv4compat_ipv6Zv4mapped_ipv6r	   r	   r
   ŚtestEmbeddedIpv4>  s   
’zIpaddrUnitTest.testEmbeddedIpv4c                 C   sÄ   |   t d”t d”” |   t d”t d”” |   t d”t d”” |   t d”t d”” |  t d”t d”” |  t d”t d”” |  t d”t d”” |  t d”t d”” d S )	Nz::FFFF:192.0.2.1z::FFFF:c000:201zFFFF::192.0.2.1zFFFF::c000:201z::FFFF:192.0.2.1%scopez::FFFF:c000:201%scopezFFFF::192.0.2.1%scopezFFFF::c000:201%scope)r   r   r7  rC  r   r	   r	   r
   ŚtestIPv6AddressTooLargeI  s0   ’’’’’’’’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^  r-  zIpaddrUnitTest.testIPVersionc                 C   r1  )Nrś   rl   )r   r  Zmax_prefixlenr  r  r   r	   r	   r
   ŚtestMaxPrefixLengthc  r-  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  Zpackedr   r  r  r,  r  r   r	   r	   r
   Ś
testPackedh  s0   
’’
’’’
’’’zIpaddrUnitTest.testPackedc                 C   st   t  d”}t  d”}t  d”}t  d”}|  t jt|” |  t jt|” |  t jt|” |  t jt|” d S )NrŲ   rõ   )	r   r=  r7  r   r"  rt  r   r#  rĄ   )r   Zipv4netZipv4addrZipv6netZipv6addrr	   r	   r
   Ś
testIpType~  s   



zIpaddrUnitTest.testIpTypec                 C   s  |   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” |   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/24rM   z	224.1.1.1z	240.0.0.1z239.255.255.255ś192.168.1.1z169.254.100.200z169.255.100.200z	192.0.7.1z203.0.113.1z127.100.200.254z
127.42.0.0)r   r   r:  Śis_multicastr=  Śis_reservedŚ
is_privateŚis_link_localŚis_loopbackŚ	is_globalr7  Śis_unspecifiedr   r  r   r	   r	   r
   ŚtestReservedIpv4  sÄ   
’’
’’
’’
’’
’’ž’ž’ž
’’
’
’
’
’
’’
’’
’
’
’zIpaddrUnitTest.testReservedIpv4c                 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	” |   dt d”j” |   dt d”j” d S )NTzffff::rk   rl   r4   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/127rh   r&  z0::0r&  z::/127z2001::1/128z
200::1/128z100::z4000::1/128)r   r   r=  r7  Zis_site_localr9  r:  r:  r;  r=  r<  r7  r8  r   r	   r	   r
   ŚtestReservedIpv6Ń  sø   
’’
’’
’’
’’
’’
’
’
’’
’’
’’
’’
’’zIpaddrUnitTest.testReservedIpv6c                 C   sL   |   t d”jt d”” |   t d”jd ” |   t d”jt d”” d S )Nś::ffff:192.168.1.1r6  z
::c0a8:101z::ffff:c0a8:101)r   r   r7  Zipv4_mappedr   r	   r	   r
   ŚtestIpv4Mapped	  s   
ž’zIpaddrUnitTest.testIpv4Mappedc                 C   s,   |   dt d”j” |   dt d”j” d S )NTr@  Fz::ffff:172.32.0.0)r   r   r7  r9  r   r	   r	   r
   ŚtestIpv4MappedPrivateCheck&	  s   ’’z)IpaddrUnitTest.testIpv4MappedPrivateCheckc                 C   s  t  d”}t  d”}t  d”}t  d”}t  d”}t  d”}|  tt| |”t  d”t  d”g” |  tt| |”” |  t	t| |”” |  t	t| |”” |  t| |”g ” |  tt| |”t  d	”t  d
”t  d”t  d”t  d”t  d”t  d”t  d”g” d S )Nś10.1.1.0/24z10.1.1.0/26z10.2.1.0/24ś10.1.1.0z2001:db8::0/32z10.1.1.5/32z10.1.1.64/26z10.1.1.128/25z10.1.1.0/30z10.1.1.4/32z10.1.1.6/31z10.1.1.8/29z10.1.1.16/28z10.1.1.32/27)
r   r=  r7  r   rx  r£  Zaddress_excluder5   r3  r6   ©r   r  Śaddr2Śaddr3Śaddr4Z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 )NrC  rD  rŲ   r*  )r   Śhashr   r:  r=  r7  r«  r±  r  r  rk  )r   r¤  r„  Zdummyr	   r	   r
   ŚtestHashD	  s.   ’’’’’



zIpaddrUnitTest.testHashc                 C   s6   | j }|  d|j” | j}|  t|jdd d ” d S )Nr  rk   rl   r4   )r  r   Ś
compressedr  r5   r3  Z_string_from_ip_intrĘ  r	   r	   r
   ŚtestIPBasesY	  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   rN  )Nr  z1.2.3.0/255.255.255.0z1.2.3.0/0.0.0.255)r  r   rO  rP  rQ  rē   rĘ  r	   r	   r
   ŚtestIPv4NetworkHelpersh	  s
   z%IpaddrUnitTest.testIPv4NetworkHelpersc                 C   s|   t  d”}t  |”}t  d”}t  |”}t  d”}t  d”}|  ||” |  ||” |  |t  |”” |  |t  |”” d S )NrC  r  r  r½  )r   r=  r:  r   rĄ   r   rE  r	   r	   r
   ŚtestCopyConstructoro	  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$i„}t | ” D ]\}}|  |tt |”” q?d 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:0z::/128z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::z0:6:5:4:3:2:1:0/128)r£  Śitemsr   rē   r   r,  )r   Ztest_addressesZuncompressedrL  r	   r	   r
   ŚtestCompressIPv6Address|	  sV   ’žżüūśłų	÷
öõóņńšļīķ
’’z&IpaddrUnitTest.testCompressIPv6Addressc                 C   sx   t  d”}t  d”}t  d”}t  d”}|  d|j” |  dt  d”j” |  d|j” |  d	|j” |  d|j” d S )
Nz2001::1ś2001:0:5ef5:79fd:0:59d:a0e5:ba1r   z192.168.178.1z+2001:0000:0000:0000:0000:0000:0000:0001/128z+0000:0000:0000:0000:0000:0000:0000:0001/128r!  z'2001:0000:5ef5:79fd:0000:059d:a0e5:0ba1z*2001:0000:0000:0000:0000:0000:0000:0000/96)r   r,  rĄ   r#  r   r   Zexploded)r   r  rF  rG  rH  r	   r	   r
   ŚtestExplodeShortHandIpStr	  s"   



’
’’’z(IpaddrUnitTest.testExplodeShortHandIpStrc                 C   s4   t  d”}t  d”}|  d|j” |  d|j” d S )Nz	127.0.0.1r  z1.0.0.127.in-addr.arpazH1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa)r   r   rĄ   r   Zreverse_pointer)r   r  rF  r	   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
   ŚtestIntRepresentation®	  s   ’z$IpaddrUnitTest.testIntRepresentationc                 C   s,   |   t d”jd” |   t d”jd” d S )Nr4   rÆ  r°  )r   r   r=  r²  r#  r   r	   r	   r
   ŚtestForceVersion³	  s   zIpaddrUnitTest.testForceVersionc                 C   sd   |   | jjd” |   | jjd” |   | jjd” |   | jjd” |   | jjd” |   | jjd” d S )Nr~  z1.2.3.4/255.255.255.0z1.2.3.4/0.0.0.255r  z.2001:658:22a:cafe:200::1/ffff:ffff:ffff:ffff::z.2001:658:22a:cafe:200::1/::ffff:ffff:ffff:ffff)r   r  rO  rP  rQ  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Ŗ  )rn  r  Ś__dict__r   rŹ  r   r   ré   rk  r  r¬  rĄ   r  r<  r   r	   r	   r
   ŚtestNetworkElementCachingĒ	  sH   
’
’
’’ž
’ž’z(IpaddrUnitTest.testNetworkElementCachingc                 C   s   t  d”}t  d”}d}|  ||ft  |”j” d}|  t  |”j” d}|  t  |”j” t  d”}|  t  d”t  d”f|j” d S )	Nz65.54.227.120z
192.0.2.45z'2001:0000:4136:e378:8000:63bf:3fff:fdd2z#2000::4136:e378:8000:63bf:3fff:fdd2z'2001:0001:4136:e378:8000:63bf:3fff:fdd2rW  z94.245.121.253z95.26.244.94)r   r   r   r7  Z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   r7  r   r   Z	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  rC  Ś__hash__)r   Zipv4_address1Zipv4_address2r	   r	   r
   ŚtestV4HashIsNotConstant
  ó   

z&IpaddrUnitTest.testV4HashIsNotConstantc                 C   rc  )Nr  z2001:658:22a:cafe:200:0:0:2)r   r,  rC  rd  )r   Zipv6_address1Zipv6_address2r	   r	   r
   ŚtestV6HashIsNotConstant
  rf  z&IpaddrUnitTest.testV6HashIsNotConstantN)Lr#   r$   r%   r  r  r  r  r”  r¢  r§  r­  rµ  r»  r¾  ræ  rĀ  rÅ  rĒ  rĖ  rĢ  rŃ  rŌ  rŽ  rč  rģ  rķ  rö  r÷  rł  rü  r’  r  r  r  r  r  r  r  r  r  r  r  r"  r%  r'  r(  r+  r,  r.  r/  r0  r2  r3  r4  r5  r>  r?  rA  rB  rI  rK  rM  rR  rS  rT  rV  rX  rY  rZ  r[  r\  r^  ra  rb  re  rg  r	   r	   r	   r
   r}    s    	?;
6%7bIMW
IM	*r}  Ś__main__)r  Zunittestr0   r'   r7   r>   r   r·   Ztest.supportr   r   ZTestCaser   r*   rG   rg   ru   rŗ   rą   r  r  r%  r+  r-  r2  r?  r}  r#   Śmainr	   r	   r	   r
   Ś<module>   sR   621p vU6e/ 6            ’