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

        Wraps unittest.TestCase.assertRaisesRegex
        N)ZassertRaisesRegex	exception__context__
assertTrue__suppress_context__)r   exc_typedetailsargscmexcr	   r	   r
   assertCleanError(   s    $zBaseTestCase.assertCleanErrorc                 G   s   | j tj|g|R  S )z Ensure a clean AddressValueError)r   	ipaddressAddressValueErrorr   r   r   r	   r	   r
   assertAddressError8   s
    zBaseTestCase.assertAddressErrorc                 G   s   | j tj|g|R  S )z Ensure a clean NetmaskValueError)r   r   ZNetmaskValueErrorr   r	   r	   r
   assertNetmaskError=   s
    zBaseTestCase.assertNetmaskErrorc                 C   s   |  | || | dS )z8Check constructor arguments produce equivalent instancesN)assertEqualr   r   lhsrhsr	   r	   r
   assertInstancesEqualB   s    z!BaseTestCase.assertInstancesEqualN)__name__
__module____qualname__propertyr   
contextlibcontextmanagerr   r   r   r   r	   r	   r	   r
   r      s   

r   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
CommonTestMixinc                 C   s8   |  d | d W d    n1 s*0    Y  d S )NAddress cannot be empty r   r   r   r	   r	   r
   test_empty_addressI   s    z"CommonTestMixin.test_empty_addressc                 C   sB   |  ttd | d W d    n1 s40    Y  d S )Nz1.0g      ?)r   reescapereprr   r   r	   r	   r
   test_floats_rejectedM   s    z$CommonTestMixin.test_floats_rejectedc                 C   sB   |  ttj| d |  tt| d |  tt| d d S )N   )assertRaises	TypeErroroperatorindexr   hexbytesr   r	   r	   r
   test_not_an_index_issue15559Q   s    z,CommonTestMixin.test_not_an_index_issue15559c              	   C   sl   t tjd D ]X}| j|d8 | |}tt||}| || W d    q1 s\0    Y  qd S )Nr/   )proto)rangepickleHIGHEST_PROTOCOLsubTestr   loadsdumpsr   )r   addrr7   xyr	   r	   r
   pickle_testX   s
    
zCommonTestMixin.pickle_testN)r    r!   r"   r*   r.   r6   rA   r	   r	   r	   r
   r&   G   s   r&   c                   @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )CommonTestMixin_v4c              
   C   sz   d}g d}|D ]d}| j |dD | | | | W d    n1 sL0    Y  W d    q1 sj0    Y  qd S )Nz(Leading zeros are not permitted in '\d+')	z000.000.000.000192.168.000.001z016.016.016.016rC   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	addressesrD   r	   r	   r
   test_leading_zerosb   s    z%CommonTestMixin_v4.test_leading_zerosc                 C   s   |  dd |  dd d S )Nr   0.0.0.0    P 192.168.0.1r   r   r	   r	   r
   test_intu   s    zCommonTestMixin_v4.test_intc                 C   s(   |  tdd |  tdd d S )N00000000rG   c0a80001rI   )r   r5   fromhexr   r	   r	   r
   test_packedy   s    zCommonTestMixin_v4.test_packedc                 C   sB   d}|  t| | d W d    n1 s40    Y  d S )Nz,-1 (< 0) is not permitted as an IPv4 addressr   r+   r,   r   r   rE   r	   r	   r
   test_negative_ints_rejected}   s    z.CommonTestMixin_v4.test_negative_ints_rejectedc                 C   sF   d}|  t|d  | d W d    n1 s80    Y  d S )Nz1%d (>= 2**32) is not permitted as an IPv4 addressl        rQ   rR   r	   r	   r
   test_large_ints_rejected   s    z+CommonTestMixin_v4.test_large_ints_rejectedc                    s     fdd}|d |d d S )Nc                    sR   d|  }d}  t||| f   | W d    n1 sD0    Y  d S )N    z4%r (len %d != 4) is not permitted as an IPv4 addressrQ   lengthr>   rE   r   r	   r
   assertBadLength   s    zBCommonTestMixin_v4.test_bad_packed_length.<locals>.assertBadLength      r	   r   rX   r	   r   r
   test_bad_packed_length   s    z)CommonTestMixin_v4.test_bad_packed_lengthN)	r    r!   r"   rF   rK   rO   rS   rT   r\   r	   r	   r	   r
   rB   `   s   rB   c                   @   sL   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dS )CommonTestMixin_v6c                 C   s   |  dd |  dd d S )Nz
0000::0000::z000::c0a8:0001::c0a8:1rJ   r   r	   r	   r
   rF      s    z%CommonTestMixin_v6.test_leading_zerosc                 C   s   |  dd |  dd d S )Nr   r^   rH   r_   rJ   r   r	   r	   r
   rK      s    zCommonTestMixin_v6.test_intc                 C   sR   dt d }| |d dt d }| |d t dd }| |d d S )Ns               rL   r^   rM   r_   zc0a8:1::)r5   rN   r   r   r>   r	   r	   r
   rO      s    zCommonTestMixin_v6.test_packedc                 C   sB   d}|  t| | d W d    n1 s40    Y  d S )Nz,-1 (< 0) is not permitted as an IPv6 addressrP   rQ   rR   r	   r	   r
   rS      s    z.CommonTestMixin_v6.test_negative_ints_rejectedc                 C   sN   d}|  t|dd   | dd  W d    n1 s@0    Y  d S )Nz2%d (>= 2**128) is not permitted as an IPv6 address      rQ   rR   r	   r	   r
   rT      s    z+CommonTestMixin_v6.test_large_ints_rejectedc                    s     fdd}|d |d d S )Nc                    s\   d|  }d}  t||| f $  |  | W d    n1 sN0    Y  d S )NrU   z5%r (len %d != 16) is not permitted as an IPv6 addressrQ   rV   r   r	   r
   rX      s
    
zBCommonTestMixin_v6.test_bad_packed_length.<locals>.assertBadLength      r	   r[   r	   r   r
   r\      s    z)CommonTestMixin_v6.test_bad_packed_lengthc                 C   s>   d}|  d| | | W d    n1 s00    Y  d S )Nz::1%Invalid IPv6 address: "%r"r)   r   rD   r	   r	   r
   test_blank_scope_id   s    z&CommonTestMixin_v6.test_blank_scope_idc                 C   s>   d}|  d| | | W d    n1 s00    Y  d S )Nz
::1%scope%re   r)   rf   r	   r	   r
   "test_invalid_scope_id_with_percent   s    z5CommonTestMixin_v6.test_invalid_scope_id_with_percentN)r    r!   r"   rF   rK   rO   rS   rT   r\   rg   rh   r	   r	   r	   r
   r]      s   r]   c                   @   sZ   e Zd ZejZdd Zdd Zdd Zdd Z	d	d
 Z
dd Zdd Zdd Zdd ZdS )AddressTestCase_v4c                 C   s6   t d}g d}|D ]\}}| |t|| qd S )N1.2.3.42))b 00000001000000100000001100101010)nrl   )r?   Z0102032a)XZ0102032A)_b'0000_0001_0000_0010_0000_0011_0010_1010)_nrp   )_xZ	0102_032a)_XZ	0102_032A)#b"0b00000001000000100000001100101010)#nru   )#xZ
0x0102032a)#XZ
0X0102032A)#_b)0b0000_0001_0000_0010_0000_0011_0010_1010)#_nrz   )#_xZ0x0102_032a)#_XZ0X0102_032A)srj   )r(   rj   )r   IPv4Addressr   format)r   Zv4Zv4_pairsfmttxtr	   r	   r
   test_format   s    
zAddressTestCase_v4.test_formatc                 C   s>   d}|  d| t| W d    n1 s00    Y  d S )Nz127.0.0.1/24Unexpected '/' in %rr   r   r   r`   r	   r	   r
   test_network_passed_as_address   s    z1AddressTestCase_v4.test_network_passed_as_addressc                    s    fdd}|d |d |d |d |d |d |d	 |d
 |d |d |d |d |d |d |d |d |d |d |d |d |d |d |d d S )Nc                    s:     d|  t|  W d    n1 s,0    Y  d S )NzExpected 4 octets in %rr   r>   r   r	   r
   assertBadSplit   s    zAAddressTestCase_v4.test_bad_address_split.<locals>.assertBadSplitz127.0.1z42.42.42.42.42z42.42.42z42.42Z42z42..42.42.42z42.42.42.42.z42.42.42.42...z.42.42.42.42z...42.42.42.42z016.016.016z016.016Z016Z000z0x0a.0x0a.0x0az	0x0a.0x0a0x0a.bogusz	bogus.comZ1000Z1000000000000000z192.168.0.1.comr	   r   r   r	   r   r
   test_bad_address_split   s0    z)AddressTestCase_v4.test_bad_address_splitc                    s     fdd}|d |d d S )Nc                    s:     d|  t|  W d    n1 s,0    Y  d S )NzEmpty octet not permitted in %rr   r   r   r	   r
   assertBadOctet  s    z;AddressTestCase_v4.test_empty_octet.<locals>.assertBadOctetz	42..42.42z...r	   r   r   r	   r   r
   test_empty_octet  s    z#AddressTestCase_v4.test_empty_octetc                    sj    fdd}|dd |dd |dd |d	d
 |dd |dd |dd |dd |dd d S )Nc                    sJ   d|| f }  t| t|  W d    n1 s<0    Y  d S )Nz)Only decimal digits permitted in %r in %rr   r+   r,   r   r   r>   ZoctetrE   r   r	   r
   r     s    zBAddressTestCase_v4.test_invalid_characters.<locals>.assertBadOctetz0x0a.0x0a.0x0a.0x0ar   z0xa.0x0a.0x0a.0x0aZ0xaz42.42.42.-0-0z42.42.42.+0+0z42.42.42.-42z-42z
+1.+2.+3.4+1z	1.2.3.4e0Z4e0	1.2.3.4::z4::1.a.2.3ar	   r   r	   r   r
   test_invalid_characters
  s    







z*AddressTestCase_v4.test_invalid_charactersc                    s$    fdd}|dd |dd d S )Nc                    sJ   d}  t||| f  t|  W d    n1 s<0    Y  d S )Nz*At most 3 characters permitted in %r in %rr   r   r   r	   r
   r     s    z<AddressTestCase_v4.test_octet_length.<locals>.assertBadOctetz0000.000.000.000Z0000z12345.67899.-54321.-98765Z12345r	   r   r	   r   r
   test_octet_length  s    
z$AddressTestCase_v4.test_octet_lengthc                    s$    fdd}|dd |dd d S )Nc                    sJ   d|| f }  t| t|  W d    n1 s<0    Y  d S )Nz$Octet %d (> 255) not permitted in %rr   r   r   r	   r
   r   $  s    z;AddressTestCase_v4.test_octet_limit.<locals>.assertBadOctetz	257.0.0.0i  z192.168.0.999i  r	   r   r	   r   r
   test_octet_limit#  s    
z#AddressTestCase_v4.test_octet_limitc                 C   s   |  d d S N	192.0.2.1rA   r   r	   r	   r
   test_pickle,  s    zAddressTestCase_v4.test_picklec                 C   s   t | d d S r   weakrefrefr   r   r	   r	   r
   test_weakref/  s    zAddressTestCase_v4.test_weakrefN)r    r!   r"   r   r   r   r   r   r   r   r   r   r   r   r   r	   r	   r	   r
   ri      s   			ri   c                   @   s   e Zd ZejZdd Zdd Zdd Zdd Z	d	d
 Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZdS )AddressTestCase_v6c                 C   s6   t d}g d}|D ]\}}| |t|| qd S )Nz
::1.2.3.42))rk   Z00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000100000001100101010)rm    0000000000000000000000000102032a)r?   r   )rn   Z 0000000000000000000000000102032A)ro   Z0000_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)rq   '0000_0000_0000_0000_0000_0000_0102_032a)rr   r   )rs   Z'0000_0000_0000_0000_0000_0000_0102_032A)rt   Z0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000100000001100101010)rv   "0x0000000000000000000000000102032a)rw   r   )rx   Z"0X0000000000000000000000000102032A)ry   Z0b0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0001_0000_0010_0000_0011_0010_1010)r{   )0x0000_0000_0000_0000_0000_0000_0102_032a)r|   r   )r}   Z)0X0000_0000_0000_0000_0000_0000_0102_032A)r~   	::102:32a)r(   r   )r   IPv6Addressr   r   )r   Zv6Zv6_pairsr   r   r	   r	   r
   r   6  s    
#zAddressTestCase_v6.test_formatc                    s     fdd}|d |d d S )Nc                    s>   d}  ||  t|  W d    n1 s00    Y  d S )Nr   )r   r   r   r>   rE   r   r	   r
   r   `  s    zIAddressTestCase_v6.test_network_passed_as_address.<locals>.assertBadSplitz::1/24z::1%scope_id/24r	   r   r	   r   r
   r   _  s    z1AddressTestCase_v6.test_network_passed_as_addressc                    s@    fdd}|d |d |d |d |d |d d S )	Nc                    sH   d}  || dd  t|  W d    n1 s:0    Y  d S )NzAt least 3 parts expected in %r%r   r   splitr   r   r   r   r	   r
   r   h  s    zUAddressTestCase_v6.test_bad_address_split_v6_not_enough_parts.<locals>.assertBadSplit:z:1z	FEDC:9878z:%scopez:1%scopezFEDC:9878%scoper	   r   r	   r   r
   *test_bad_address_split_v6_not_enough_partsg  s    z=AddressTestCase_v6.test_bad_address_split_v6_not_enough_partsc                    s`    fdd}|d |d |d |d |d |d |d	 |d
 |d |d d S )Nc                    sH   d}  || dd  t|  W d    n1 s:0    Y  d S )Nz At most 8 colons permitted in %rr   r   r   r   r   r	   r
   r   u  s    zTAddressTestCase_v6.test_bad_address_split_v6_too_many_colons.<locals>.assertBadSplitz9:8:7:6:5:4:3::2:1z10:9:8:7:6:5:4:3:2:1z::8:7:6:5:4:3:2:1z8:7:6:5:4:3:2:1::z10:9:8:7:6:5:4:3:42.42.42.42z9:8:7:6:5:4:3::2:1%scopez10:9:8:7:6:5:4:3:2:1%scopez::8:7:6:5:4:3:2:1%scopez8:7:6:5:4:3:2:1::%scopez"10:9:8:7:6:5:4:3:42.42.42.42%scoper	   r   r	   r   r
   )test_bad_address_split_v6_too_many_colonst  s    z<AddressTestCase_v6.test_bad_address_split_v6_too_many_colonsc                    s`    fdd}|d |d |d |d |d |d |d	 |d
 |d |d d S )Nc                    sH   d}  || dd  t|  W d    n1 s:0    Y  d S )Nz+Exactly 8 parts expected without '::' in %rr   r   r   r   r   r	   r
   r     s    zSAddressTestCase_v6.test_bad_address_split_v6_too_many_parts.<locals>.assertBadSplitz3ffe:0:0:0:0:0:0:0:1z9:8:7:6:5:4:3:2:1z7:6:5:4:3:2:1z9:8:7:6:5:4:3:42.42.42.42z7:6:5:4:3:42.42.42.42z3ffe:0:0:0:0:0:0:0:1%scopez9:8:7:6:5:4:3:2:1%scopez7:6:5:4:3:2:1%scopez9:8:7:6:5:4:3:42.42.42.42%scopez7:6:5:4:3:42.42.42.42%scoper	   r   r	   r   r
   (test_bad_address_split_v6_too_many_parts  s    z;AddressTestCase_v6.test_bad_address_split_v6_too_many_partsc                    s     fdd}|d |d d S )Nc                    sH   d}  || dd  t|  W d    n1 s:0    Y  d S )Nz.Expected at most 7 other parts with '::' in %rr   r   r   r   r   r	   r
   r     s    zeAddressTestCase_v6.test_bad_address_split_v6_too_many_parts_with_double_colon.<locals>.assertBadSplitz1:2:3:4::5:6:7:8z1:2:3:4::5:6:7:8%scoper	   r   r	   r   r
   :test_bad_address_split_v6_too_many_parts_with_double_colon  s    zMAddressTestCase_v6.test_bad_address_split_v6_too_many_parts_with_double_colonc                    s    fdd}|d |d |d |d |d |d |d	 |d
 |d |d |d |d |d |d |d |d |d |d |d |d d S )Nc                    sH   d}  || dd  t|  W d    n1 s:0    Y  d S )Nz At most one '::' permitted in %rr   r   r   r   r   r	   r
   r     s    zZAddressTestCase_v6.test_bad_address_split_v6_repeated_double_colon.<locals>.assertBadSplitz
3ffe::1::1z1::2::3::4:5z2001::db:::1z	3ffe::1::z	::3ffe::1z:3ffe::1::1z3ffe::1::1:z:3ffe::1::1:z:::z2001:db8:::1z3ffe::1::1%scopez1::2::3::4:5%scopez2001::db:::1%scopez3ffe::1::%scopez::3ffe::1%scopez:3ffe::1::1%scopez3ffe::1::1:%scopez:3ffe::1::1:%scopez	:::%scopez2001:db8:::1%scoper	   r   r	   r   r
   /test_bad_address_split_v6_repeated_double_colon  s*    zBAddressTestCase_v6.test_bad_address_split_v6_repeated_double_colonc                    sP    fdd}|d |d |d |d |d |d |d	 |d
 d S )Nc                    sH   d}  || dd  t|  W d    n1 s:0    Y  d S )Nz0Leading ':' only permitted as part of '::' in %rr   r   r   r   r   r	   r
   r     s    zRAddressTestCase_v6.test_bad_address_split_v6_leading_colon.<locals>.assertBadSplitz:2001:db8::1z:1:2:3:4:5:6:7z:1:2:3:4:5:6:z:6:5:4:3:2:1::z:2001:db8::1%scopez:1:2:3:4:5:6:7%scopez:1:2:3:4:5:6:%scopez:6:5:4:3:2:1::%scoper	   r   r	   r   r
   'test_bad_address_split_v6_leading_colon  s    z:AddressTestCase_v6.test_bad_address_split_v6_leading_colonc                    sP    fdd}|d |d |d |d |d |d |d	 |d
 d S )Nc                    sH   d}  || dd  t|  W d    n1 s:0    Y  d S )Nz1Trailing ':' only permitted as part of '::' in %rr   r   r   r   r   r	   r
   r     s    zSAddressTestCase_v6.test_bad_address_split_v6_trailing_colon.<locals>.assertBadSplitz2001:db8::1:z1:2:3:4:5:6:7:z
::1.2.3.4:z::7:6:5:4:3:2:z2001:db8::1:%scopez1:2:3:4:5:6:7:%scopez::1.2.3.4:%scopez::7:6:5:4:3:2:%scoper	   r   r	   r   r
   (test_bad_address_split_v6_trailing_colon  s    z;AddressTestCase_v6.test_bad_address_split_v6_trailing_colonc                    st    fdd}|dd |dd |dd |d	d
 |dd |dd |dd |dd |dd
 |dd d S )Nc                    sF     d|| dd  t|  W d    n1 s80    Y  d S )Nz%s in %rr   r   r   )r>   Zv4_errorr   r	   r
   assertBadAddressPart  s    zDAddressTestCase_v6.test_bad_v4_part_in.<locals>.assertBadAddressPartz3ffe::1.netzExpected 4 octets in '1.net'z3ffe::127.0.1zExpected 4 octets in '127.0.1'z::1.2.3zExpected 4 octets in '1.2.3'z::1.2.3.4.5z Expected 4 octets in '1.2.3.4.5'z3ffe::1.1.1.netz5Only decimal digits permitted in 'net' in '1.1.1.net'z3ffe::1.net%scopez3ffe::127.0.1%scopez::1.2.3%scopez::1.2.3.4.5%scopez3ffe::1.1.1.net%scoper	   )r   r   r	   r   r
   test_bad_v4_part_in  s6    

z&AddressTestCase_v6.test_bad_v4_part_inc                    s    fdd}|dd |dd |dd |d	d
 |dd |dd |dd |dd |dd |dd
 |dd |dd d S )Nc                    sT   d||  dd f } t| t|  W d    n1 sF0    Y  d S )Nz%Only hex digits permitted in %r in %rr   r   )r   r   r+   r,   r   r   r>   partrE   r   r	   r
   assertBadPart  s    zAAddressTestCase_v6.test_invalid_characters.<locals>.assertBadPartz
3ffe::googZgoogz3ffe::-0r   z3ffe::+0r   z3ffe::-1-1r   1.2.3.41234:axy::bZaxyz3ffe::goog%scopez3ffe::-0%scopez3ffe::+0%scopez3ffe::-1%scopez1.2.3.4::%scope1234:axy::b%scoper	   r   r   r	   r   r
   r     s    










z*AddressTestCase_v6.test_invalid_charactersc                    s`    fdd}|dd |dd |dd |d	d
 |dd |dd |dd |dd
 d S )Nc                    sJ   d}  ||| dd  t|  W d    n1 s<0    Y  d S )Nz*At most 4 characters permitted in %r in %rr   r   r   r   r   r	   r
   r     s    z:AddressTestCase_v6.test_part_length.<locals>.assertBadPartz::00000Z00000z3ffe::10000Z10000z02001:db8::Z02001z2001:888888::1Z888888z::00000%scopez3ffe::10000%scopez02001:db8::%scopez2001:888888::1%scoper	   r   r	   r   r
   test_part_length  s    






z#AddressTestCase_v6.test_part_lengthc                 C   s   |  d d S )N
2001:db8::r   r   r	   r	   r
   r      s    zAddressTestCase_v6.test_picklec                 C   s$   t | d t | d d S )Nr   2001:db8::%scoper   r   r	   r	   r
   r   #  s    zAddressTestCase_v6.test_weakrefN)r    r!   r"   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r	   r	   r	   r
   r   3  s   )	r   c                   @   sH   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dS )NetmaskTestMixin_v4;Input validation on interfaces and networks is very similarc                 C   sL   dD ]B}|  |}| t|d | t|jd | t|jd qd S )N)r      
1.2.3.4/32255.255.255.255rG   r   r   strnetmaskhostmask)r   rD   netr	   r	   r
   test_no_mask+  s
    
z NetmaskTestMixin_v4.test_no_maskc                 C   s@   d}|  d|  | | W d    n1 s20    Y  d S )Nz1.2.3.4/32/24Only one '/' permitted in %rr)   r`   r	   r	   r
   test_split_netmask4  s    z&NetmaskTestMixin_v4.test_split_netmaskc                    s\    fdd}|dd |dd |dd |dd |d	d |d
d |dt d d S )Nc                    s8     |  |  W d    n1 s*0    Y  d S r   r)   r>   r   r   r	   r
   assertBadAddress:  s    zANetmaskTestMixin_v4.test_address_errors.<locals>.assertBadAddress/r'   /8r   zExpected 4 octets
google.com10/8	::1.2.3.4zOnly decimal digitsz	1.2.3.256z256 (> 255))r+   r,   r   r   r	   r   r
   test_address_errors9  s    





z'NetmaskTestMixin_v4.test_address_errorsc                 C   s   |  t| dd |  t| dd |  t| dd |  t| dd tddD ]}d| }| |}|  t|| |  t| d	|j | |  t| d
| | |dv rdd|  }|  t| d	|j | qbd S )N	192.0.2.0   192.0.2.0/24)r   Z24r   255.255.255.0z192.0.2.0/255.255.255.0r   !   z
0.0.0.0/%dz
0.0.0.0/%sz0.0.0.0/0%d)    r   r   )r   r   r   r8   r   r   )r   inet_strr   r	   r	   r
   test_valid_netmaskF  s*    
z&NetmaskTestMixin_v4.test_valid_netmaskc                    s    fdd}|dd |dd |dd |dd |dd |dd	 |dd
 |dd |dd |dd |dd |dd |dd |dd d S )Nc                    sN   d| }  t|"  d| |f  W d    n1 s@0    Y  d S N%r is not a valid netmaskz%s/%sr   r+   r,   r   r>   r   rE   r   r	   r
   assertBadNetmask_  s    zANetmaskTestMixin_v4.test_netmask_errors.<locals>.assertBadNetmaskr   r(   r   r    1 0x1Z33z254.254.255.256r   1.1.1.1z254.xyz.2.3z240.255.0.0z255.254.128.0z0.1.127.255puddingr^   r	   r   r   r	   r   r
   test_netmask_errors^  s    












z'NetmaskTestMixin_v4.test_netmask_errorsc                    s$    fdd}|dd |dd d S )Nc                    sJ   d| }  t|  | |f W d    n1 s<0    Y  d S Nr   r   r   r   r	   r
   r   t  s    zJNetmaskTestMixin_v4.test_netmask_in_tuple_errors.<locals>.assertBadNetmaskr   rP   r   r	   r   r	   r   r
   test_netmask_in_tuple_errorss  s    
z0NetmaskTestMixin_v4.test_netmask_in_tuple_errorsc                 C   s"   |  d |  d |  d d S )Nz192.0.2.0/27z192.0.2.0/31r   r   r   r	   r	   r
   r   {  s    

zNetmaskTestMixin_v4.test_pickleNr    r!   r"   __doc__r   r   r   r   r   r   r   r	   r	   r	   r
   r   (  s   	r   c                   @   s   e Zd ZejZdS )InterfaceTestCase_v4N)r    r!   r"   r   IPv4Interfacer   r	   r	   r	   r
   r     s   r   c                   @   s*   e Zd ZejZdd Zdd Zdd ZdS )NetworkTestCase_v4c                 C   st   |  | d| d | | d| d |  | d| d |  | d| d d S N10.0.0.0/30z10.0.1.0/24z10.0.0.0/24assertFalser   	subnet_ofr   r   r	   r	   r
   test_subnet_of  s(    



z!NetworkTestCase_v4.test_subnet_ofc                 C   st   |  | d| d |  | d| d |  | d| d | | d| d d S r   r   r   supernet_ofr   r   r	   r	   r
   test_supernet_of  s(    



z#NetworkTestCase_v4.test_supernet_ofc                 C   s  |  t& tdtd W d    n1 s60    Y  |  t& tdtd W d    n1 sv0    Y  |  t& tdtd W d    n1 s0    Y  |  t& tdtd W d    n1 s0    Y  d S )Nr   ::1/128)r0   r1   r   IPv4Networkr   IPv6Networkr   r   r	   r	   r
   test_subnet_of_mixed_types  s     
"
"
"
z-NetworkTestCase_v4.test_subnet_of_mixed_typesN)	r    r!   r"   r   r  r   r   r   r  r	   r	   r	   r
   r     s   r   c                   @   sH   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dS )NetmaskTestMixin_v6r   c                 C   s   dD ]B}|  |}| t|d | t|jd | t|jd q|  d}| t|d | t|jd | t|jd d S )N)::1r/   s                  r  z'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffffr^   	::1%scope::1%scope/128r   )r   rD   r   Z
scoped_netr	   r	   r
   r     s    

z NetmaskTestMixin_v6.test_no_maskc                 C   s|   d}|  d|  | | W d    n1 s20    Y  d}|  d|  | | W d    n1 sn0    Y  d S )Nzcafe:cafe::/128/190r   zcafe:cafe::%scope/128/190r)   )r   r>   Zscoped_addrr	   r	   r
   r     s    (z&NetmaskTestMixin_v6.test_split_netmaskc                    s    fdd}|dd |dd |dd |dd |d	d |d
d |dd |dd |dd |dd |dd |dd d S )Nc                    s8     |  |  W d    n1 s*0    Y  d S r   r)   r   r   r	   r
   r     s    zANetmaskTestMixin_v6.test_address_errors.<locals>.assertBadAddressr   r'   r   r   zAt least 3 partsr   r   r   zOnly hex digitsz/%scopez/%scope8zgoogle.com%scopez1.2.3.4%scopez
10%scope/8r   r	   r   r	   r   r
   r     s    










z'NetmaskTestMixin_v6.test_address_errorsc                 C   s   |  t| dd |  t| dd |  t| dd tddD ]<}d| }|  t| || |  t| d| | qL|  t| dd tddD ]<}d| }|  t| || |  t| d| | qd S )	N)r   r   z2001:db8::/32)r   Z32r      z::/%dz::/0%dz2001:db8::%scope/32)r   r   r   r8   )r   r   r   r	   r	   r
   r     s     z&NetmaskTestMixin_v6.test_valid_netmaskc                    s    fdd}|dd |dd |dd |dd |dd |dd |dd	 |dd
 |dd |dd |dd |dd d S )Nc                    sN   d| }  t|"  d| |f  W d    n1 s@0    Y  d S r   r   r   r   r	   r
   r      s    zANetmaskTestMixin_v6.test_netmask_errors.<locals>.assertBadNetmaskr  r(   1::r   r   r   r   Z129r   r   r^   r  r	   r   r	   r   r
   r     s    










z'NetmaskTestMixin_v6.test_netmask_errorsc                    s.    fdd}|dd |dd |dd d S )Nc                    sJ   d| }  t|  | |f W d    n1 s<0    Y  d S r   r   r   r   r	   r
   r     s    zJNetmaskTestMixin_v6.test_netmask_in_tuple_errors.<locals>.assertBadNetmaskr  rP   r	  r  r	   r   r	   r   r
   r     s    

z0NetmaskTestMixin_v6.test_netmask_in_tuple_errorsc                 C   s,   |  d |  d |  d |  d d S )Nz2001:db8::1000/124z2001:db8::1000/127z2001:db8::1000z2001:db8::1000%scoper   r   r	   r	   r
   r     s    


zNetmaskTestMixin_v6.test_pickleNr   r	   r	   r	   r
   r    s   		r  c                   @   s   e Zd ZejZdS )InterfaceTestCase_v6N)r    r!   r"   r   IPv6Interfacer   r	   r	   r	   r
   r  $  s   r  c                   @   s"   e Zd ZejZdd Zdd ZdS )NetworkTestCase_v6c                 C   s   |  | d| d | | d| d |  | d| d |  | d| d |  | d| d | | d| d d S )N2000:999::/562000:aaa::/482000:aaa::/562000:bbb::/56z2000:999::%scope/56z2000:aaa::%scope/48z2000:aaa::%scope/56r   r   r	   r	   r
   r   +  s<    





z!NetworkTestCase_v6.test_subnet_ofc                 C   st   |  | d| d |  | d| d |  | d| d | | d| d d S )Nr  r  r  r  r   r   r	   r	   r
   r   D  s(    



z#NetworkTestCase_v6.test_supernet_ofN)r    r!   r"   r   r  r   r   r   r	   r	   r	   r
   r  (  s   r  c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
FactoryFunctionErrorsc                 C   sD   d}d}|  t||| || W d   n1 s60    Y  dS )z3Ensure a clean ValueError with the expected messageZcamelotz+%r does not appear to be an IPv4 or IPv6 %sN)r   
ValueError)r   r   kindr>   rE   r	   r	   r
   assertFactoryErrorY  s    z(FactoryFunctionErrors.assertFactoryErrorc                 C   s   |  tjd d S )NrD   )r  r   
ip_addressr   r	   r	   r
   test_ip_address`  s    z%FactoryFunctionErrors.test_ip_addressc                 C   s   |  tjd d S )NZ	interface)r  r   ip_interfacer   r	   r	   r
   test_ip_interfacec  s    z'FactoryFunctionErrors.test_ip_interfacec                 C   s   |  tjd d S )Nnetwork)r  r   
ip_networkr   r	   r	   r
   test_ip_networkf  s    z%FactoryFunctionErrors.test_ip_networkN)r    r!   r"   r  r  r  r  r	   r	   r	   r
   r  W  s   r  c                   @   s^  e Zd ZedZedZedZ	e
dZedZedZe
dZedZedZee	gZeeg ZeegZeeg ZeegZeeg Zee Zee ZedZedZedZe
dZedZedZ e
dZ!edZ"edZ#dd Z$dd Z%d	d
 Z&dd Z'dd Z(dd Z)dd Z*dd Z+dd Z,dd Z-dd Z.dS )ComparisonTestsr/   r  ra   	::2%scopec                 C   sT   t  }| jD ]B}| || | ||k | ||t | ||t qd S r   )objectobjects_with_scopedassertNotEqualr   r   __eq__NotImplemented__ne__r   otherobjr	   r	   r
   test_foreign_type_equality  s    
z*ComparisonTests.test_foreign_type_equalityc                 C   s2   | j D ]&}| j D ]}||u rq| || qqd S r   )objectsr!  r   r	   r	   r
   test_mixed_type_equality  s
    

z(ComparisonTests.test_mixed_type_equalityc                 C   s(   t | j| jD ]\}}| || qd S r   )zip
v6_objectsv6_scoped_objectsr!  r   r	   r	   r
   test_scoped_ipv6_equality  s    z)ComparisonTests.test_scoped_ipv6_equalityc                 C   s(   | j D ]}| jD ]}| || qqd S r   )
v4_objectsr-  r!  r   r	   r	   r
   test_v4_with_v6_scoped_equality  s    

z/ComparisonTests.test_v4_with_v6_scoped_equalityc                 C   s4   | j D ](}| || | || | || qd S r   )r   r   assertLessEqualassertGreaterEqualr   r'  r	   r	   r
   test_same_type_equality  s    
z'ComparisonTests.test_same_type_equalityc              
   C   s   | j | jf| j| jf| j| jf| j| jf| j| j	f| j
| jf| j| jf| j| jf| j| jff	D ]|\}}| || | || | || | || | || | ||k | ||k  | ||k | ||k q^d S r   )v4addrv4addr2v4netv4net2v4intfv4intf2v6addrv6addr2v6netv6net2v6intfv6intf2v6addr_scopedv6addr2_scopedv6net_scopedv6net2_scopedv6intf_scopedv6intf2_scopedr!  Z
assertLessr1  ZassertGreaterr2  r   r   r	   r	   r
   test_same_type_ordering  s&    








z'ComparisonTests.test_same_type_orderingc                 C   s   | j D ]}| || j q| j| j D ]}| || j q&| j| j D ]}| || j qF| j| j| jg D ]}| || j ql| j| j| jg D ]}| || j q| j	| j
 | jg D ]}| || j qd S r   )v4_addressesassertInr7  v6_addressesv6_scoped_addressesr=  rC  r/  assertNotInr,  r-  r3  r	   r	   r
   test_containment  s    
z ComparisonTests.test_containmentc                    s   | j D ] | j D ]zt tstt r2q| t fdd | t fdd | t fdd | t fdd qqd S )Nc                      s    k S r   r	   r	   r   r   r	   r
   <lambda>      z:ComparisonTests.test_mixed_type_ordering.<locals>.<lambda>c                      s    kS r   r	   r	   rN  r	   r
   rO    rP  c                      s    kS r   r	   r	   rN  r	   r
   rO    rP  c                      s    kS r   r	   r	   rN  r	   r
   rO    rP  )r   
isinstancetyper0   r1   r   r	   rN  r
   test_mixed_type_ordering  s    

z(ComparisonTests.test_mixed_type_orderingc              	   C   sP  t  }| jD ]<}| t ||k  W d    n1 s:0    Y  | t ||k W d    n1 sl0    Y  | t ||k W d    n1 s0    Y  | t ||k W d    n1 s0    Y  | |tk  | |tk | |tk | |tk | |tk  | |tk | |tk | |tk qd S r   )r  r   r0   r1   r   r   r   r   r%  r	   r	   r
   test_foreign_type_ordering  s$    &&&&z*ComparisonTests.test_foreign_type_orderingc                 C   s   | j | j| jg}| j| j| jg}| j| j| jg}| 	|t
| jtjd | 	|t
| jtjd | 	|t
| jtjd | 	|| t
| j| j tjd | 	ttt d S )N)key)r5  r7  r9  r;  r=  r?  rA  rC  rE  r   sortedr/  r   Zget_mixed_type_keyr,  r-  r#  r  )r   Z
v4_orderedZ
v6_orderedZv6_scoped_orderedr	   r	   r
   test_mixed_type_key  s0    
z#ComparisonTests.test_mixed_type_keyc                 C   s@  t d}t d}t d}t d}t d}t d}| t|j| | t|j| | t|j| | t|j| | t|j| | t|j| | t|j| | t|j| | t|j| | t|j| | t|j| | t|j| | t|j| | t|j| | t|j| | t|j| d S )Nr   r  r  )r   r  r  r0   r1   __lt____gt__)r   r5  r7  r;  r=  rA  rC  r	   r	   r
   test_incompatible_versions  s,    





z*ComparisonTests.test_incompatible_versionsN)/r    r!   r"   r   r   r5  r  r7  r   r9  r   r;  r  r=  r  r?  rA  rC  rE  rH  r/  rJ  r,  rK  r-  r)  r   r6  r8  r:  r<  r>  r@  rB  rD  rF  r(  r*  r.  r0  r4  rG  rM  rS  rT  rW  rZ  r	   r	   r	   r
   r  j  sJ   




















		
r  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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 ZBdd ZCdd ZDdd ZEdd ZFdd ZGdd ZHdd ZIdd ZJdS )IpaddrUnitTestc                 C   sp   t d| _t d| _t d| _t d| _t d| _	t 
d| _t d| _t d| _t 
d	| _d S )
Nr   
1.2.3.4/24
1.2.3.0/242001:658:22a:cafe:200:0:0:1z2001:658:22a:cafe:200:0:0:1/642001:658:22a:cafe::/64!2001:658:22a:cafe:200:0:0:1%scopez$2001:658:22a:cafe:200:0:0:1%scope/64z2001:658:22a:cafe::%scope/64)r   r   ipv4_addressr   ipv4_interfacer  ipv4_networkr  ipv6_addressipv6_interfacer  ipv6_networkipv6_scoped_addressipv6_scoped_interfaceipv6_scoped_networkr   r	   r	   r
   setUp!  s"    zIpaddrUnitTest.setUpc                 C   sF   |  dttd |  dttd |  dttd d S )NzIPv4Interface('1.2.3.4/32')r   zIPv6Interface('::1/128')r  zIPv6Interface('::1%scope/128')r  )r   r-   r   r   r  r   r	   r	   r
   testRepr1  s    zIpaddrUnitTest.testReprc                 C   s  t d}t d}| t d| | t |df| | t d| | t d| | t |df| | t d| | t t d	 W d    n1 s0    Y  | t t |d
f W d    n1 s0    Y  | t t d W d    n1 s 0    Y  | t t d W d    n1 sV0    Y  | t t |df W d    n1 s0    Y  | t t d W d    n1 s0    Y  t d}| t jd	dd| | t j|d
fdd| | t jddd| | t jddd| | t j|dfdd| | t jddd| t d}t d}| t d| | t |df| | t d| | t d| | t |d
f| | t d| | t d	t d | t dt d | t t d W d    n1 sJ0    Y  | t t d W d    n1 s0    Y  d S )Nr   z192.0.2.1/32)r   r   r   )      r   )r   r   r   )rl  r   )r   r   r   )rl  r   )r   r   r   )rl  r   r   Fstrictr   r   )       r   r   )ro  r   z192.0.2.1/24)r   z255.255.255.255.0)r   r   r  r   r0   r  r   r  )r   ipr   r	   r	   r
   testIPv4Tuple:  s    


(,**.*








*zIpaddrUnitTest.testIPv4Tuplec                 C   s  t d}t d}| t d| | t d| | t |df| t d}t d}| t d| | t d| | t |d	f| t d
}t d}| t t d W d    n1 s0    Y  | t t d W d    n1 s0    Y  | t t |df W d    n1 sJ0    Y  t d}| t jddd| | t jddd| | t j|dfdd| | t dt d | t dt d t d}| t t d W d    n1 s
0    Y  | t t |df W d    n1 sD0    Y  | t t d W d    n1 sz0    Y  | t t d W d    n1 s0    Y  d S )Nr   z2001:db8::/128)r   128)	                n   rb   rr  z2001:db8::/96)r   96)rs  `   rt  r   2001:db8::1)rv  ru  )	               n   ru  ru  Frm  )rv  rt  z2001:db8::1/96)rw  rt  2001:db8::1%scope)rx  ru  )rv  r   )r   r   r  r   r0   r  r  r  )r   rp  r   	ip_scopedr	   r	   r
   testIPv6Tuple  s    





(*.


*.*zIpaddrUnitTest.testIPv6Tuplec                 C   s   |  tdd td |  tdd td |  tdd td |  tdd td | td	d td
 | td
d td	 d S )Nr      z1.1.2.0   z1.1.0.1r  i  z::ffffr  z::ffff%scope)r   r   r   r   r!  r   r	   r	   r
   testAddressIntMath  s$    z!IpaddrUnitTest.testAddressIntMathc                 C   sP   |  ttjd |  ttjdtj  |  ttjd |  ttjdtj  d S )NrP   ra   )r0   r  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.12rb   r   zIPv4Network('1.2.3.0/24'))r   r   r   listZ_find_address_rangeZ_count_righthand_zero_bitsr-   rc  )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   intrc  network_addressr   rf  r   ri  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   rb  _ipr   r   r  r  r  r!  re  r  rh  ra  versionrd  rg  )r   ipv4ipv6Zipv6_scopedZv6_intr	   r	   r
   testIpFromInt  s2    








zIpaddrUnitTest.testIpFromIntc                 C   sv   t j}| | jjt dj | |d|d | | jjt dj | |d|d | |d|d d S )	Nr   255.254.253.252       X*      ffff:2:3:4:ffff::            r^   s                   )r   r  r   rb  r  r  re  rp  rf   r	   r	   r
   testIpFromPacked  s$    





zIpaddrUnitTest.testIpFromPackedc                 C   s|   |  t| jjd |  t| jjd |  t| jjd |  t| jjd |  t| jjd |  t| jjd d S )Nr   r   r  2001:658:22a:cafe:200::1)r   r  rb  rp  r   re  rh  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   rd  Zscope_idr   rg  re  rh  rf  r  ri  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  rc  r   r   rf  	prefixlenri  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
   testZeroNetmaskE  s    


zIpaddrUnitTest.testZeroNetmaskc                 C   s   t d}| |jd d S )Nz127.0.0.0/0.0.0.255r   )r   r  r   r  r   r   r	   r	   r
   testIPv4NetR  s    
zIpaddrUnitTest.testIPv4Netc                 C   s|   |  t| jjd |  t| jjd |  t| jjd |  t| jjd |  t| jjd |  t| jjd d S )Ni	1.2.3.255l	   /YE    %2001:658:22a:cafe:ffff:ffff:ffff:ffff)r   r  rc  broadcast_addressr   rf  ri  r   r	   r	   r
   testGetBroadcastV  s    zIpaddrUnitTest.testGetBroadcastc                 C   s:   |  | jjjd |  | jjjd |  | jjjd d S )Nr   r  )r   rb  r  r  re  rh  r   r	   r	   r
   testGetPrefixlend  s    zIpaddrUnitTest.testGetPrefixlenc                 C   s   |  | j jd |  t| j jd |  tdj t	d |  | j
 jd |  t| j
 jd |  tdj td |  | j jd |  t| j jd d S )N   z1.2.2.0	0.0.0.0/0?   r  z::0/0)r   rc  supernetr  r   r  r   r   r  r  rf  r  r  ri  r   r	   r	   r
   testGetSuperneti  s&    zIpaddrUnitTest.testGetSupernetc                 C   s   |  | jdjd |  t| jdjd |  | jdjd |  t| jdjd |  | jdjd |  t| jdjd d S )NrY      z1.2.0.0=   z2001:658:22a:caf8::)r   rc  r  r  r   r  rf  ri  r   r	   r	   r
   testGetSupernet3z  s    zIpaddrUnitTest.testGetSupernet3c                 C   s   | j t| jjddd | j t| jjdd | | jjdd| jjdd | j t| jjddd | j t| jjdd | | jjdd| jjd	d | j t| jjddd | j t| jjdd | | jjdd| jjd	d d S )
Nra   r/   prefixlen_diff
new_prefix   r  r     A   >   )r0   r  rc  r  r   rf  ri  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.254rP   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  rb   )
r  rc  hostsr   lenr   r   r  r   r  )r   r  rf  ri  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 )
NrY   r     r  r  r  r  D   r  )	r   rV  rc  subnetsr0   r  r  rf  ri  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  r/   z	1.2.3.128r  )	r   r  rc  r  r  r   r  rf  ri  r   r	   r	   r
   testGetSubnets  s"    zIpaddrUnitTest.testGetSubnetsc                 C   sN   t d}dd | D }dd |dD }| |dg | || d S )Nr   c                 S   s   g | ]}t |qS r	   r   .0r?   r	   r	   r
   
<listcomp>  rP  z;IpaddrUnitTest.testGetSubnetForSingle32.<locals>.<listcomp>c                 S   s   g | ]}t |qS r	   r  r  r	   r	   r
   r    rP  ra   )r   r  r  r   )r   rp  subnets1subnets2r	   r	   r
   testGetSubnetForSingle32  s
    
z'IpaddrUnitTest.testGetSubnetForSingle32c                 C   s   t d}dd | D }dd |dD }| |dg | || t d}dd | D }dd |dD }| |dg | || d S )	Nr  c                 S   s   g | ]}t |qS r	   r  r  r	   r	   r
   r    rP  z<IpaddrUnitTest.testGetSubnetForSingle128.<locals>.<listcomp>c                 S   s   g | ]}t |qS r	   r  r  r	   r	   r
   r    rP  ra   r  c                 S   s   g | ]}t |qS r	   r  r  r	   r	   r
   r    rP  c                 S   s   g | ]}t |qS r	   r  r  r	   r	   r
   r    rP  )r   r  r  r   )r   rp  r  r  ry  r	   r	   r
   testGetSubnetForSingle128  s    

z(IpaddrUnitTest.testGetSubnetForSingle128c                 C   sP   dd | j dD }| |g d dd | jdD }| |g d d S )Nc                 S   s   g | ]}t |qS r	   r  r  r	   r	   r
   r  	  rP  z.IpaddrUnitTest.testSubnet2.<locals>.<listcomp>ra   )z
1.2.3.0/26z1.2.3.64/26z1.2.3.128/26z1.2.3.192/26c                 S   s   g | ]}t |qS r	   r  r  r	   r	   r
   r    rP  )2001:658:22a:cafe::/66z2001:658:22a:cafe:4000::/66z2001:658:22a:cafe:8000::/66z2001:658:22a:cafe:c000::/66)rc  r  r   rf  )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   s   g | ]}t |qS r	   r  r  r	   r	   r
   r    rP  z2IpaddrUnitTest.testGetSubnets3.<locals>.<listcomp>   rY   )z
1.2.3.0/32z
1.2.3.1/32z
1.2.3.2/32)z1.2.3.253/32z1.2.3.254/32z1.2.3.255/32r|  r  c                 S   s   g | ]}t |qS r	   r  r  r	   r	   r
   r    rP  )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)rc  r  r   r  r   r  )r   r  rf  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  r0   r  r  rb  r  r  rc  re  rf  rh  ri  r   r	   r	   r
   testSubnetFailsForLargeCidrDiff*  s$    


z.IpaddrUnitTest.testSubnetFailsForLargeCidrDiffc                 C   s@   |  t| jjjd |  t| jjjd |  t| jjjd d S )Nr  r  )r0   r  rb  r  r  re  rh  r   r	   r	   r
   !testSupernetFailsForLargeCidrDiff8  s    


z0IpaddrUnitTest.testSupernetFailsForLargeCidrDiffc                 C   s   |  tt| jjd |  tt| jd |  tt| jjd |  tt| jd |  tt| j	jd |  tt| j
d d S )NrP   r  r   r	   r	   r
   "testSubnetFailsForNegativeCidrDiff@  s$    


z1IpaddrUnitTest.testSubnetFailsForNegativeCidrDiffc                 C   s   |  | jjd |  t| j d jd |  | j jd |  | jjd |  t| j d jd |  | j jd |  | jjd |  t| j d jd |  | j jd d S )Nr|  r   rb   i               l            l             )r   rc  Znum_addressesr  r  r  rf  ri  r   r	   r	   r
   testGetNum_AddressesN  s&    z#IpaddrUnitTest.testGetNum_Addressesc                 C   s`   |  td| j | td| j td}|  || j | tdtd d S )Nz1.2.3.128/25z
1.2.4.1/24z1.2.3.37z
1.1.0.0/16z
1.0.0.0/15)	rI  r   r   rc  rL  r   r   r  __contains__)r   addr1r	   r	   r
   testContains_  s    
zIpaddrUnitTest.testContainsc                 C   s|   |  t| jd d | t| jjd |  t| jd d | t| jjd |  t| jd d | t| jjd d S )NrZ   1.2.3.5r|  z2001:658:22a:cafe::5r  )r   r   rc  r0   
IndexError__getitem__rf  ri  r   r	   r	   r
   testNthl  s    zIpaddrUnitTest.testNthc                 C   s   t d}| d|j t|}| dt|d  | dt|d  | dt|d  | dt|d  | |d |d  d S )Nz172.31.255.128/255.255.255.240   z172.31.255.128r   z172.31.255.143rP   )r   r  r   r  r  r   )r   r>   Z	addr_listr	   r	   r
   testGetitemw  s    
zIpaddrUnitTest.testGetitemc                 C   s  |  | jtdk | | jtdk | | jtdk | | jtdk | | jdk | | jg k | | jdk |  | jtdk | | jtdk | | jtdk | | jdk | | jg k | | jdk |  | jtd	k | | jtd
k | | jtdk | | jtdk | | jtdk | | jdk | | jg k | | jdk d S )Nr\  
1.2.3.4/23::1.2.3.4/24::1.2.3.4%scope/24r(   ra   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   rb  r   r   r   r  re  rh  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(   ra   r  r  r  r   r  r  )r   rb  r   r   r   r  ra  r   re  rd  rh  rg  r   r	   r	   r
   testNotEqual  s~    zIpaddrUnitTest.testNotEqualc                 C   s   |  ttdd d S )Nz1.2.3.4/255.255.255.255r   r   r   r   r   r   r	   r	   r
   testSlash32Constructor  s
    
z%IpaddrUnitTest.testSlash32Constructorc                 C   s0   |  ttdd |  ttdd d S )Nr  r  )r   r   r   r  r   r	   r	   r
   testSlash128Constructor  s    z&IpaddrUnitTest.testSlash128Constructorc                 C   s   |  ttdd d S )Nz1.2.3.4/0.0.0.0r  r  r   r	   r	   r
   testSlash0Constructor  s    z$IpaddrUnitTest.testSlash0Constructorc                 C   s  t d}t d}t d}t d}t d}t d}t ||||||g}| t|t dt dg t d}t d}t d}t d}t ||||g}| t|t dg t d}t d	}t d
}t d}t d}t d}t ||||||g}| t|t dt dg t ||g}| t|t dg t d }}	| tt ||	g|g t d }}	| tt ||	gt dg t d}t d}t d}t |||g}| t||g t d}t d}t d}t |||g}| t||g t dt dft dt dft dt dfg}
|
D ]\}}| 	t
t j||g qtt dt dft dt dft dt dfg}
|
D ]\}}| 	t
t j||g qd 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  r  r0   r1   )r   r  r  r  ip4Zip5Zip6Z	collapsedZip_same1Zip_same2Zaddr_tuplesr	   r	   r
   testCollapsing  s    
































zIpaddrUnitTest.testCollapsingc              	   C   sV  t j}t d}t d}G dd dt j}|d}|d}| tt||| | tt||t d | tt||t d | t|||d t 	d t d	}| t|||t 	d
t 	d	g t 
d}t 
t j
j}| t dgt||| t d}t d}| t|||d t 	d t d}| t|||t 	dt 	dg t d}t d}| t|||d t 	d t d}| t|||t 	dt 	dg | tt|t dt d | tt|t 	dt 	d | tt|t 	dt 	d | tt|t dt 	d d S )Nr  z	1.1.1.255c                   @   s   e Zd Zedd ZdS )z3IpaddrUnitTest.testSummarizing.<locals>.IPv7Addressc                 S   s   dS )N   r	   r   r	   r	   r
   r  W  s    z;IpaddrUnitTest.testSummarizing.<locals>.IPv7Address.versionN)r    r!   r"   r#   r  r	   r	   r	   r
   IPv7AddressV  s   r  r  r  r   r  z1.1.1.8z
1.1.1.0/29r  r
  z$1:ffff:ffff:ffff:ffff:ffff:ffff:ffffz1::/16z2::z2::/128z	1::%scopez*1:ffff:ffff:ffff:ffff:ffff:ffff:ffff%scopez	2::%scopez1.1.0.0r^   )r   Zsummarize_address_ranger  r   r0   r  r  r1   r   r  r   Z	_ALL_ONESr  )r   Z	summarizer  r  r  Zip_invalid1Zip_invalid2r	   r	   r
   testSummarizingN  s    













zIpaddrUnitTest.testSummarizingc                 C   s   |  tdtdk |  tdtdk |  tdtdk |  tdtdk |  tdtdk |  tdtdk d S )Nr   r  r  ::2r  r  )r   r   r  r   r	   r	   r
   testAddressComparison  s$    z$IpaddrUnitTest.testAddressComparisonc                 C   s  |  tdtdk |  tdtdk  |  tdtdk  |  tdtdk  |  tdtdk |  tdtdk |  tdtdk |  tdtdk |  tdtdk  |  tdtdk  |  tdtdk  |  tdtdk |  tdtdk |  tdtdk |  td	td	k |  td	td
k  |  td	tdk  |  tdtd	k  |  td
td	k |  tdtd	k |  td	tdk | td	tdk |  td	tdk  |  td	tdk  |  tdtdk  |  td
tdk |  tdtdk |  td	tdk | tdtd	k |  tdtd
k  |  tdtdk  |  tdtd	k  |  tdtd	k |  tdtd	k |  tdtdk d S )Nz
1.1.1.1/24z
1.1.1.1/16z
1.1.1.2/24z
1.1.1.2/16z::1/64z::1/80z::2/64z::2/48z::1%scope/64z::1%scope/80z::2%scope/64z::2%scope/48)r   r   r  r   r   r	   r	   r
   testInterfaceComparison  s    z&IpaddrUnitTest.testInterfaceComparisonc           	      C   sb  t d}t d}t d}| ||k  | ||k | ||d | ||d | ||d | ||d | ||d | | | k  t d}t d}t d	}| ||k  | ||k | ||d | | | k  | t| j	j| j
 t d
}t d}| t|j| | t|j| | t|j| | t|j| t d}| ||k  | ||k t d}| ||k  | ||k  | ||k | ||k t d}| ||k  | ||k  | ||k | ||k t d}t d}t d}t d}||||g}||||g}|  | || ||||g}|  | || | |t dt | |t dt | t dt dk | t dt dk | t dt dk | t dt dk | t dt dk | t dt dk d S )Nr  z
1.1.1.0/32r  r   rP   r/   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  r0   r1   rc  rf  r  r   rX  rY  r  r   sortZassertIsr  r#  )	r   r  r  r  r  r  r  rV  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)r0   r  r   r  r   r	   r	   r
   testStrictNetworksI  s    z!IpaddrUnitTest.testStrictNetworksc                 C   sV   t d}t d}t d}| | j| | | j| | || d S )Nz
1.2.3.0/30z
1.2.2.0/24z1.2.2.64/26)r   r  r   rc  Zoverlapsr   )r   r&  Zother2Zother3r	   r	   r
   testOverlapsN  s    


zIpaddrUnitTest.testOverlapsc                 C   sh   d}t |}t d| }| t|jt|j t d| }| |j|j | t jt jd d S )NrI   z::%sz	::ffff:%sz2001:1.1.1.1:1.1.1.1)	r   r   r  r   r  rp  r!  r0   r   )r   Zipv4_stringr  Zv4compat_ipv6Zv4mapped_ipv6r	   r	   r
   testEmbeddedIpv4V  s    
zIpaddrUnitTest.testEmbeddedIpv4c                 C   s   |  tdtd |  tdtd |  tdtd |  tdtd | tdtd | tdtd | tdtd | tdtd d S )	Nz::FFFF:192.0.2.1z::FFFF:c000:201zFFFF::192.0.2.1zFFFF::c000:201z::FFFF:192.0.2.1%scopez::FFFF:c000:201%scopezFFFF::192.0.2.1%scopezFFFF::c000:201%scope)r   r   r  r!  r   r	   r	   r
   testIPv6AddressTooLargea  s0    z&IpaddrUnitTest.testIPv6AddressTooLargec                 C   s4   |  | jjd |  | jjd |  | jjd d S )Nr  r  )r   ra  r  rd  rg  r   r	   r	   r
   testIPVersionv  s    zIpaddrUnitTest.testIPVersionc                 C   s4   |  | jjd |  | jjd |  | jjd d S )Nr   rb   )r   rb  Zmax_prefixlenre  rh  r   r	   r	   r
   testMaxPrefixLength{  s    z"IpaddrUnitTest.testMaxPrefixLengthc                 C   s   |  | jjd |  tdjd |  | jjd |  tdjd |  tdjd |  | jjd |  td	jd |  td
jd d S )Nr   r  r  r  r  r  z::1:0:0:0:0s                  zffff:2:3:4:ffff::%scopez::1:0:0:0:0%scope)r   ra  Zpackedr   r   rd  r  rg  r   r	   r	   r
   
testPacked  s0    


zIpaddrUnitTest.testPackedc                 C   st   t d}t d}t d}t d}| t jt| | t jt| | t jt| | t jt| d S )Nr   r   )	r   r  r  r   r  rR  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/24rG   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_globalr  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::ra   rb   r/   zff00::Fzfdff::zfecf::zfeff:ffff:ffff:ffff::z
fbf:ffff::zfc00::zfc00:ffff:ffff:ffff::zfbff:ffff::zfe00::zfea0::zfebf:ffff::zfe7f:ffff::zfec0::z	0:0::0:01z::1/127r^   r  z0::0r  z::/127z2001::1/128z
200::1/128z100::z4000::1/128)r   r   r  r  Zis_site_localr  r  r  r  r  r  r  r  r   r	   r	   r
   testReservedIpv6  s    











zIpaddrUnitTest.testReservedIpv6c                 C   sL   |  tdjtd |  tdjd  |  tdjtd d S )Nz::ffff:192.168.1.1r  z
::c0a8:101z::ffff:c0a8:101)r   r   r  Zipv4_mappedr   r	   r	   r
   testIpv4Mapped6	  s    
zIpaddrUnitTest.testIpv4Mappedc                 C   s  t d}t d}t d}t d}t d}t d}| tt||t dt dg | tt|| | t	t|| | t	t|| | t||g  | tt||t d	t d
t dt dt dt dt dt dg d S )N10.1.1.0/24z10.1.1.0/26z10.2.1.0/2410.1.1.0z2001:db8::0/32z10.1.1.5/32z10.1.1.64/26z10.1.1.128/25z10.1.1.0/30z10.1.1.4/32z10.1.1.6/31z10.1.1.8/29z10.1.1.16/28z10.1.1.32/27)
r   r  r  r   rV  r  Zaddress_excluder0   r  r1   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 )Nr  r  r   r
  )r   hashr   r  r  r  r  r  ra  rd  rI  )r   r  r  dummyr	   r	   r
   testHashV	  s.    



zIpaddrUnitTest.testHashc                 C   s6   | j }| d|j | j}| t|jdd d  d S )Nr]  ra   rb   r/   )rc  r   
compressedrf  r0   r  Z_string_from_ip_intr  r	   r	   r
   testIPBasesk	  s    zIpaddrUnitTest.testIPBasesc                 C   sD   | 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)rf  r   with_prefixlenwith_netmaskwith_hostmaskr   r  r	   r	   r
   testIPv6NetworkHelpersq	  s    z%IpaddrUnitTest.testIPv6NetworkHelpersc                 C   sD   | j }| d|j | d|j | d|j | dt| d S )Nr]  z1.2.3.0/255.255.255.0z1.2.3.0/0.0.0.255)rc  r   r"  r#  r$  r   r  r	   r	   r
   testIPv4NetworkHelpersz	  s
    z%IpaddrUnitTest.testIPv4NetworkHelpersc                 C   s|   t d}t |}t d}t |}t d}t d}| || | || | |t | | |t | d S )Nr  r  r   r  )r   r  r  r   r   r   r  r	   r	   r
   testCopyConstructor	  s    





z"IpaddrUnitTest.testCopyConstructorc                 C   sZ   ddddddddd	d
ddddddddd}t | D ]\}}| |tt| q6d S )Nz1:2:3:4:5:6:7:8/128z2001:0:0:4::8/128z2001::4:5:6:7:8/128z2001:0:3:4:5:6:7:8/128z0:0:3::ffff/128z::4:0:0:0:ffff/128z::5:0:0:ffff/128z1::4:0:0:7:8/128z::/128r   r  r  z::102:304/128z1:2:3:4:5:ffff:102:304/128z0:7:6:5:4:3:2:1/128z0:7:6:5:4:3:2:0/128z7:6:5:4:3:2:1:0/128z0:6:5:4:3:2:1:0/128)z1:2:3:4:5:6:7:8z2001:0:0:4:0:0:0:8z2001:0:0:4:5:6:7:8z2001:0:3:4:5:6:7:8z0:0:3:0:0:0:0:ffffz0:0:0:4:0:0:0:ffffz0:0:0:0:5:0:0:ffffz1:0:0:4:0:0:7:8z0:0:0:0:0:0:0:0z0:0:0:0:0:0:0:0/0z0:0:0:0:0:0:0:1z*2001:0658:022a:cafe:0000:0000:0000:0000/66r   z1:2:3:4:5:ffff:1.2.3.4z::7:6:5:4:3:2:1z::7:6:5:4:3:2:0z7:6:5:4:3:2:1::z0:6:5:4:3:2:1::)r  itemsr   r   r   r  )r   Ztest_addressesZuncompressedr   r	   r	   r
   testCompressIPv6Address	  s.    z&IpaddrUnitTest.testCompressIPv6Addressc                 C   sx   t d}t d}t d}t d}| d|j | dt dj | d|j | d	|j | d|j d S )
Nz2001::12001:0:5ef5:79fd:0:59d:a0e5:ba1r  z192.168.178.1z+2001:0000:0000:0000:0000:0000:0000:0001/128z+0000:0000:0000:0000:0000:0000:0000:0001/128r  z'2001:0000:5ef5:79fd:0000:059d:a0e5:0ba1z*2001:0000:0000:0000:0000:0000:0000:0000/96)r   r  r   r  r   r   Zexploded)r   r  r  r  r  r	   r	   r
   testExplodeShortHandIpStr	  s"    




z(IpaddrUnitTest.testExplodeShortHandIpStrc                 C   s4   t d}t d}| d|j | d|j d S )Nz	127.0.0.1rv  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  r  r	   r	   r
   testReversePointer	  s    

z!IpaddrUnitTest.testReversePointerc                 C   s(   |  dt| j |  dt| j d S )Nr   r  )r   r  ra  rd  r   r	   r	   r
   testIntRepresentation	  s    z$IpaddrUnitTest.testIntRepresentationc                 C   s,   |  tdjd |  tdjd d S )Nr/   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   rb  r"  r#  r$  re  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  )rL  rc  __dict__r   r  r   r   r   rI  rf  r  r   re  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:fdd2r*  z94.245.121.253z95.26.244.94)r   r   r   r  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   r  r   r   Z	sixtofourr   )r   Zsixtofouraddrr3  r	   r	   r
   testsixtofour
  s    

zIpaddrUnitTest.testsixtofourc                 C   s,   t d}t d}| | |  d S )Nr   z2.3.4.5)r   r   r!  __hash__)r   Zipv4_address1Zipv4_address2r	   r	   r
   testV4HashIsNotConstant
  s    

z&IpaddrUnitTest.testV4HashIsNotConstantc                 C   s,   t d}t d}| | |  d S )Nr^  z2001:658:22a:cafe:200:0:0:2)r   r  r!  r6  )r   Zipv6_address1Zipv6_address2r	   r	   r
   testV6HashIsNotConstant#
  s    

z&IpaddrUnitTest.testV6HashIsNotConstantN)Kr    r!   r"   rj  rk  rq  rz  r}  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r	  r
  r  r  r  r  r  r!  r%  r&  r'  r)  r+  r,  r-  r.  r/  r1  r4  r5  r7  r8  r	   r	   r	   r
   r[    s   	GC
6%7bIMW
IM	*r[  __main__)r   Zunittestr+   r$   r2   r9   r   r   Ztest.supportr   r   ZTestCaser   r&   rB   r]   ri   r   r   r   r   r  r  r  r  r  r[  r    mainr	   r	   r	   r
   <module>   sN   621p vY6i/ 6            
