
    \eQ                        d dl Z d dlZd dlZd dlmZ d dlZd dlZd dlmZ	 d dl
mZ  G d de	j                        Z G d de	j                        Z G d	 d
e	j                        Ze j                   d        Z G d de	j                        Zy)    N)mock)base)netutilsc                      e Zd Zd Zd Zd Zd Zd Zd Ze	j                  j                  edd	      d
        Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z e	j                  d       e	j                  d      d               Z e	j                  d       e	j                  d      d               Z e	j                  d        e	j                  d!      d"               Z  e	j                  d        e	j                  d!      d#               Z! e	j                  d        e	j                  d!      d$               Z"y%)&NetworkUtilsTestc                 
   t        j                  d      }| j                  d|j                         | j	                  |j
                         | j	                  |j                         | j                  d|j                         y )Nzhttp:// http)r   urlsplitassertEqualnetlocassertIsNoneporthostnameschemeselfresults     @/usr/lib/python3/dist-packages/oslo_utils/tests/test_netutils.pytest_no_hostzNetworkUtilsTest.test_no_host   s^    ""9-V]]+&++&&//*/    c                    | j                  dt        j                  d             | j                  dt        j                  d             | j                  dt        j                  dd             | j                  dt        j                  d	             | j                  d
t        j                  d             | j                  dt        j                  dd             | j                  dt        j                  dd             y )N)server01P   zserver01:80)r   Nr   )r     r   )default_port)::1r   z[::1]:80)r   Nz[::1])r   r   )2001:db8:85a3::8a2e:370:7334r   r   )r   r   parse_host_portr   s    r   test_parse_host_portz%NetworkUtilsTest.test_parse_host_port%   s    )!11-@	B+!11*=	?+!11*&*,	- 	!11*=	?!11':	<!11'&*,	- 	?!11;*.0	1r   c                    t        j                  d      }| j                  |j                  d       | j                  |j                  d       | j                  |j
                  d       | j                  |j                  d       | j                  |j                  d       t        j                  dd	      }| j                  |j                  d       | j                  |j                  d       | j                  |j
                  d
       | j                  |j                  d       | j                  |j                  d       t        j                  dd	      }| j                  |j                  d       | j                  |j                  d       | j                  |j
                  d
       | j                  |j                  d       | j                  |j                  d       y )Nz#rpc://myhost?someparam#somefragmentrpcmyhostr	   	someparamsomefragmentz*rpc://myhost/mypath?someparam#somefragmentF)allow_fragmentsz/mypathzsomeparam#somefragmentz4rpc://user:pass@myhost/mypath?someparam#somefragmentzuser:pass@myhost)r   r   r   r   r   pathqueryfragmentr   s     r   test_urlsplitzNetworkUtilsTest.test_urlsplit9   sr   ""#HI.1b){3.9""8!# 	.1i0'?@"-""B!# 	.(:;i0'?@"-r   c                 D   d}t        j                  |      }| j                  |j                  d       | j                  |j                  d       | j                  |j
                  d       | j                  |j                  d       | j                  |j                  d       d}t        j                  |      }| j                  |j                  d       | j                  |j                  d       | j                  |j
                  d       | j                  |j                  d       | j                  |j                         d	}t        j                  |      }| j                  |j                  d
       | j                  |j                  d       | j                  |j
                  d       | j                  |j                  d       | j                  |j                  d       | j                  |j                  d       | j                  |j                  d       y )Nzhttp://[::1]:443/v2.0/r
   z	[::1]:443z/v2.0/r   i  zhttp://user:pass@[::1]/v2.0/zuser:pass@[::1]z9https://[2001:db8:85a3::8a2e:370:7334]:1234/v2.0/xy?ab#12httpsz#[2001:db8:85a3::8a2e:370:7334]:1234z/v2.0/xyr   r   ab12)r   r   r   r   r   r(   r   r   r   r)   r*   )r   ipv6_urlr   s      r   test_urlsplit_ipv6z#NetworkUtilsTest.test_urlsplit_ipv6S   s   +""8,/4h/%0c*1""8,/(9:h/%0&++&N""8,0(MNj1*HId+t,$/r   c                 \   d}t        j                  |      }| j                  ddd|j                                | j                  ddd|j                  d             d}t        j                  |      }| j                  ddi|j                                | j                  dg d	i|j                  d             d
}t        j                  |      }| j                  i |j                                d}t        j                  |      }| j                  i |j                                y )Nzhttp://localhost/?a=b&c=dbd)acF)collapsezhttp://localhost/?a=b&a=c&a=dr5   )r3   r6   r4   zhttp://localhostzhttp://localhost?)r   r   r   params)r   test_urlr   s      r   test_urlsplit_paramsz%NetworkUtilsTest.test_urlsplit_paramsn   s    .""8,s-v}}?s-v}}e}/LM2""8,#sV]]_5#/1NO%""8,V]]_-&""8,V]]_-r   c                 x   t        j                         }t        j                  |dddd       t         j                  j                  t        j                  t        j                  d      g}t        t        d      rA|t         j                  j                  t        j                  t        j                  d      gz  }t        t        d      rA|t         j                  j                  t        j                  t        j                  d      gz  }t        t        d      rA|t         j                  j                  t        j                  t        j                  d      gz  }|j                  |       |j                          t        j                  |d       | j!                  d	t#        |j$                               y )
NTd   
      TCP_KEEPIDLETCP_KEEPINTVLTCP_KEEPCNTF   )r   Mockr   set_tcp_keepalivecall
setsockoptsocket
SOL_SOCKETSO_KEEPALIVEhasattrIPPROTO_TCPr?   r@   rA   assert_has_calls
reset_mockr   len
mock_calls)r   	mock_sockcallss      r   test_set_tcp_keepalivez'NetworkUtilsTest.test_set_tcp_keepalive   sV   IIK	""9dCQ?II  !2!2!'!4!4d<
 6>*		$$V%7%7%+%8%8#? E 6?+		$$V%7%7%+%9%92? E 6=)		$$V%7%7%+%7%7< E 	""5)""9e4C	 4 456r   LOGT)autospecc                    d}| j                  t        j                  d             | j                  t        j                  d             | j                  t        j                  d             | j                  t        j                  d             |j                  j                  |       |j                          | j                  t        j                  d             |j                  j                  |       |j                          | j                  t        j                  d             |j                  j                  |       |j                          | j                  t        j                  d             |j                  j                          |j                          | j                  t        j                  dd	
             | j                  t        j                  dd	
             | j                  t        j                  dd	
             |j                  j                          |j                          | j                  t        j                  dd
             | j                  t        j                  dd
             | j                  t        j                  dd
             |j                  j                          |j                          y )NzqConverting in non strict mode is deprecated. You should pass strict=False if you want to preserve legacy behaviorz42.42.42.42z-1.11.11.11r	   10z10.10z10.10.10z10.10.10.10T)strictF)
assertTruer   is_valid_ipv4assertFalsewarningassert_called_withrM   assert_not_called)r   mock_logexpected_logs      r   test_is_valid_ipv4z#NetworkUtilsTest.test_is_valid_ipv4   s$    	..}=>//>?//34..t45++L9..w78++L9..z:;++L9..}=>**,""45	
 	""748	
 	"":d;	
 	**,""46	
 	""759	
 	"":e<	
 	**,r   c                 l   | j                  t        j                  d             | j                  t        j                  d             | j                  t        j                  d             | j                  t        j                  d             | j                  t        j                  d             y )Nr   fe80::1%eth0zfe%80::1%eth0z1fff::a88:85a3::172.31.128.1r	   )rX   r   is_valid_ipv6rZ   is_valid_ipr    s    r   test_is_valid_ipv6z#NetworkUtilsTest.test_is_valid_ipv6   s    ..u56..~>?--o>?//*, 	- 	//34r   c                     | j                  dt        j                  d             | j                  dt        j                  d             y )Nz[1234::1234]z
1234::1234	127.0.0.1)r   r   escape_ipv6r    s    r   test_escape_ipv6z!NetworkUtilsTest.test_escape_ipv6   s8    )=)=l)KLh&:&:;&GHr   c                    | j                  t        j                  d             | j                  t        j                  d             | j                  t        j                  d             | j                  t        j                  d             | j                  t        j                  d             | j                  t        j                  d             | j                  t        j                  d              y )Nrg   z2001:db8::ff00:42:8329rb   z	256.0.0.0z::1.2.3.r	   )rX   r   rd   rZ   r    s    r   test_is_valid_ipz!NetworkUtilsTest.test_is_valid_ip   s    ,,[9:,,-EFG,,^<=--k:;--j9:--b12--d34r   c                 D   | j                  t        j                  d             | j                  t        j                  d             | j                  t        j                  d             | j                  t        j                  d             | j                  t        j                  d             | j                  t        j                  d             | j                  t        j                  d             | j                  t        j                  d             y )	Nz52:54:00:cf:2d:31rg   znot:a:mac:addressz52-54-00-cf-2d-31zaa bb cc dd ee ffzAA:BB:CC:DD:EE:FFzAA BB CC DD EE FFzAA-BB-CC-DD-EE-FF)rX   r   is_valid_macrZ   r    s    r   test_is_valid_macz"NetworkUtilsTest.test_is_valid_mac   s    --.ABC..{;<../BCD../BCD../BCD--.ABC../BCD../BCDr   c                 D   | j                  t        j                  d             | j                  t        j                  d             | j                  t        j                  d             | j                  t        j                  d             | j                  t        j                  d             | j                  t        j                  d             | j                  t        j                  d             | j                  t        j                  d             y )	Nz10.0.0.0/24z10.0.0.1/32z	0.0.0.0/0	2600::/64*0000:0000:0000:0000:0000:0000:0000:0001/32z10.0.0.1z10.0.0.1/33r=   )rX   r   is_valid_cidrrZ   r    s    r   test_is_valid_cidrz#NetworkUtilsTest.test_is_valid_cidr   s    ..}=>..}=>..{;<..{;<..DF 	G 	//
;<//>?//34r   c                    | j                  t        j                  d             | j                  t        j                  d             | j                  t        j                  d             | j                  t        j                  d             | j                  t        j                  d             | j                  t        j                  d             y )Nrp   z0abcd:ef01:2345:6789:abcd:ef01:192.168.254.254/48rq   z'0000:0000:0000:0000:0000:0000:0000:0001foorg   )rX   r   is_valid_ipv6_cidrrZ   r    s    r   test_is_valid_ipv6_cidrz(NetworkUtilsTest.test_is_valid_ipv6_cidr   s    33K@A33>@ 	A338: 	;3357 	844U;<44[ABr   c                 b    g d}|D ]&  }| j                  t        j                  |             ( y )N)r   0rB   1   35         80324665535)rX   r   is_valid_port)r   valid_inputs	input_strs      r   test_valid_portz NetworkUtilsTest.test_valid_port  s/    /% 	?IOOH229=>	?r   c                 b    g d}|D ]&  }| j                  t        j                  |             ( y )N)z-3276865536ik 528491z528.491zthirty-sevenN)rZ   r   r   )r   invalid_inputsr   s      r   test_valid_port_failz%NetworkUtilsTest.test_valid_port_fail  s3    ;' 	@IX33I>?	@r   c                     dddgi}t        j                  di |5  t        j                         }d d d        | j	                  d       y # 1 sw Y   xY w)N%return_value.getsockname.return_value1.2.3.4r	   socket.socket)r   patchr   get_my_ipv4r   r   
sock_attrsaddrs      r   test_get_my_ipv4z!NetworkUtilsTest.test_get_my_ipv4  sU    3i_F
ZZ6:6 	*'')D	*y)	* 	*   AAc                     dg di}t        j                  di |5  t        j                         }d d d        | j	                  d       y # 1 sw Y   xY w)Nr   )2001:db8::2r	   r	   r	   r   r   )r   r   r   get_my_ipv6r   r   s      r   test_get_my_ipv6z!NetworkUtilsTest.test_get_my_ipv6  sU    3 6>?
 ZZ6:6 	*'')D	*}-	* 	*r   c                 \    g d}|D ]#  }| j                  t        j                  |        % y )N))rB   r<   )rz   r   r<   )r<   r   r<   )100r   r<   )r   r   r<   )z-100r   r<   )rX   r   _is_int_in_ranger   r   input_values      r   test_is_int_in_rangez%NetworkUtilsTest.test_is_int_in_range&  s3    - ( 	EKOOH55{CD	Er   c                 \    g d}|D ]#  }| j                  t        j                  |        % y )N))NrB   r<   )tenrB   r<   )r      )NonerB   r<   )rZ   r   r   r   r   r   s      r   test_is_int_not_in_rangez)NetworkUtilsTest.test_is_int_not_in_range0  s5    , * 	FKX66DE	Fr   c                 b    g d}|D ]&  }| j                  t        j                  |             ( y )N)rB   rz   r   ry   r   255)rX   r   is_valid_icmp_typer   s      r   test_valid_icmp_typez%NetworkUtilsTest.test_valid_icmp_type8  s/    3' 	FKOOH77DE	Fr   c                 b    g d}|D ]&  }| j                  t        j                  |             ( y )N)r   -1   256Nr   five)rZ   r   r   r   s      r   test_invalid_icmp_typez'NetworkUtilsTest.test_invalid_icmp_type=  s1    E) 	GKX88EF	Gr   c                 b    g d}|D ]&  }| j                  t        j                  |             ( y )N)rB   rz   r   ry   r   r   N)rX   r   is_valid_icmp_coder   s      r   test_valid_icmp_codez%NetworkUtilsTest.test_valid_icmp_codeB  s/    9' 	FKOOH77DE	Fr   c                 b    g d}|D ]&  }| j                  t        j                  |             ( y )N)r   r   r   r   r   zero)rZ   r   r   r   s      r   test_invalid_icmp_codez'NetworkUtilsTest.test_invalid_icmp_codeG  s1    ?) 	GKX88EF	Gr   r   z(oslo_utils.netutils._get_my_ipv4_addressc                     t         j                  |_        d|_        t	        j
                         }| j                  |d       y )Nr   )rG   errorside_effectreturn_valuer   r   r   r   ipmock_socketr   s       r   test_get_my_ipv4_socket_errorz.NetworkUtilsTest.test_get_my_ipv4_socket_errorL  s5     #),,###%y)r   z(oslo_utils.netutils._get_my_ipv6_addressc                     t         j                  |_        d|_        t	        j
                         }| j                  |d       y )Nr   )rG   r   r   r   r   r   r   r   s       r   test_get_my_ipv6_socket_errorz.NetworkUtilsTest.test_get_my_ipv6_socket_errorT  s5     #),,'##%}-r   znetifaces.gatewaysznetifaces.ifaddressesc                     t         j                  ddigt         j                  ddigi|_        | j	                  dt        j                                | j	                  dt        j                                y )Nr   z172.18.204.1r   )	netifacesAF_INETAF_INET6r   r   r   _get_my_ipv4_address_get_my_ipv6_addressr   ifaddrgatewayss      r   )test_get_my_ip_address_with_default_routez:NetworkUtilsTest.test_get_my_ip_address_with_default_route\  sg      )00FN3K2L(11V]4K3LN)F)F)HI(E(E(GHr   c                     i |_         | j                  dt        j                                | j                  dt        j                                y Nrg   r   )r   r   r   r   r   r   s      r   ,test_get_my_ip_address_without_default_routez=NetworkUtilsTest.test_get_my_ip_address_without_default_routee  s>     !h&C&C&EF = = ?@r   c                     i |_         | j                  dt        j                                | j                  dt        j                                | j                  |j                         y r   )r   r   r   r   r   rZ   calledr   s      r   2test_get_my_ipv4_address_without_default_interfacezCNetworkUtilsTest.test_get_my_ipv4_address_without_default_interfacem  sP     !#h&C&C&EF = = ?@'r   N)#__name__
__module____qualname__r   r!   r+   r1   r:   rR   r   r   objectr   r`   re   ri   rk   rn   rs   rw   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r   r   r   r      s   01(.406.&78 
ZZx6+ 7+Z
5I5E
5	C?@*.EFF
G
F
G
 TZZ TZZ:;* < !* TZZ TZZ:;. < !. TZZ$%TZZ'(I ) &I TZZ$%TZZ'(A ) &A TZZ$%TZZ'(( ) &(r   r   c                   4    e Zd ZdZd Zd Zd Zd Zd Zd Z	y)	IPv6byEUI64TestCasez1Unit tests to generate IPv6 by EUI-64 operations.c                 p    t        j                  dd      }| j                  d|j                                y )N
2001:db8::00:16:3e:33:44:552001:db8::216:3eff:fe33:4455)r   get_ipv6_addr_by_EUI64r   format)r   r   s     r   test_generate_IPv6_by_EUI64z/IPv6byEUI64TestCase.test_generate_IPv6_by_EUI64z  s/    ..|/BD7Gr   c                 D    dd| j                  t        fd       y )Nz10.0.8r   c                  0    t        j                         S Nr   r   )ipv4_prefixmacs   r   <lambda>zIIPv6byEUI64TestCase.test_generate_IPv6_with_IPv4_prefix.<locals>.<lambda>  s    "99+sK r   assertRaises
ValueError)r   r   r   s    @@r   #test_generate_IPv6_with_IPv4_prefixz7IPv6byEUI64TestCase.test_generate_IPv6_with_IPv4_prefix  s$    !* 'L 	Mr   c                 D    dd| j                  t        fd       y )Nz00:16:3e:33:44:5Zr   c                  0    t        j                         S r   r   )bad_macprefixs   r   r   zEIPv6byEUI64TestCase.test_generate_IPv6_with_bad_mac.<locals>.<lambda>  s    "99&'J r   r   )r   r   r   s    @@r   test_generate_IPv6_with_bad_macz3IPv6byEUI64TestCase.test_generate_IPv6_with_bad_mac  s$    %* 'K 	Lr   c                 D    dd| j                  t        fd       y )Nr   bbc                  0    t        j                         S r   r   )
bad_prefixr   s   r   r   zHIPv6byEUI64TestCase.test_generate_IPv6_with_bad_prefix.<locals>.<lambda>  s    "99*cJ r   r   )r   r   r   s    @@r   "test_generate_IPv6_with_bad_prefixz6IPv6byEUI64TestCase.test_generate_IPv6_with_bad_prefix  s$    !
* 'K 	Lr   c                 D    dd| j                  t        fd       y )Nr   {   c                  0    t        j                         S r   r   r   r   s   r   r   zOIPv6byEUI64TestCase.test_generate_IPv6_with_error_prefix_type.<locals>.<lambda>      "99&#F r   )r   	TypeErrorr   r   r   s    @@r   )test_generate_IPv6_with_error_prefix_typez=IPv6byEUI64TestCase.test_generate_IPv6_with_error_prefix_type  s$    !) &G 	Hr   c                 D    dd| j                  t        fd       y )Nr   r	   c                  0    t        j                         S r   r   r   s   r   r   zJIPv6byEUI64TestCase.test_generate_IPv6_with_empty_prefix.<locals>.<lambda>  r   r   r   r   s    @@r   $test_generate_IPv6_with_empty_prefixz8IPv6byEUI64TestCase.test_generate_IPv6_with_empty_prefix  s$    !* 'G 	Hr   N)
r   r   r   __doc__r   r   r   r   r   r  r   r   r   r   r   w  s)    ;H
MLLHHr   r   c                   (    e Zd ZdZd Zd Zd Zd Zy)MACbyIPv6TestCasez$Unit tests to extract MAC from IPv6.c                     | j                  t        j                  d      t        j                  t        j
                  d                   y )Nr   r   r   netaddrEUIr   get_mac_addr_by_ipv6	IPAddressr    s    r   #test_reverse_generate_IPv6_by_EUI64z5MACbyIPv6TestCase.test_reverse_generate_IPv6_by_EUI64  s;    KK+,))!!"@AC	
r   c                     | j                  t        j                  d      t        j                  t        j
                  d                   y )Nz52:54:00:42:02:19zfe80::5054:ff:fe42:219r  r    s    r   test_random_qemu_macz&MACbyIPv6TestCase.test_random_qemu_mac  s:    KK+,))!!":;=	
r   c                     | j                  t        j                  d      t        j                  t        j
                  d                   y )Nz02:00:00:00:00:00zfe80::ff:fe00:0r  r    s    r   
test_localzMACbyIPv6TestCase.test_local  s:    KK+,))!!"346	
r   c                     | j                  t        j                  d      t        j                  t        j
                  d                   y )Nz00:00:00:00:00:00zfe80::200:ff:fe00:0r  r    s    r   test_universalz MACbyIPv6TestCase.test_universal  s:    KK+,))!!"78:	
r   N)r   r   r   r  r  r  r  r  r   r   r   r  r    s    .



r   r  c              #   :   K   t        j                  |        y wr   )ioStringIO)contents    r   mock_file_contentr    s      ++g
s   c                   >    e Zd Z fdZ ej
                  dd       ej
                  d ed            d               Z ej
                  dd       ej
                  d ed            d	               Z ej
                  dd
       ej
                  d e	d            d               Z
 ej
                  dd      d        Z ej
                  dd      d        Z ej
                  dd
       ej
                  d e	d            d               Z xZS )TestIsIPv6Enabledc                 `    t         t        |           d } |        | j                  |       y )Nc                      d t         _        y r   )r   _IS_IPV6_ENABLEDr   r   r   reset_detection_flagz5TestIsIPv6Enabled.setUp.<locals>.reset_detection_flag  s
    (,H%r   )superr  setUp
addCleanup)r   r  	__class__s     r   r  zTestIsIPv6Enabled.setUp  s)    ,.	-,-r   zos.path.existsTr   builtins.openry   c                 N    t        j                         }| j                  |       y r   )r   is_ipv6_enabledrX   r   	mock_openexistsenableds       r   test_enabledzTestIsIPv6Enabled.test_enabled  s     **, r   rz   c                 N    t        j                         }| j                  |       y r   r   r%  rZ   r&  s       r   test_disabledzTestIsIPv6Enabled.test_disabled  s      **,!r   Fzshould not readr   c                 N    t        j                         }| j                  |       y r   r,  r&  s       r   test_disabled_non_existsz*TestIsIPv6Enabled.test_disabled_non_exists  s      **,!r   c                    d t         _        t        j                  dt	        d            5 }t        j
                         }| j                  |j                         | j                  t         j                         | j                  |       d d d        t        j                  dt        d            5  t        j
                         }| j                  |       d d d        y # 1 sw Y   XxY w# 1 sw Y   y xY w)Nr#  ry   r"  should not be calledr.  )	r   r  r   r   r  r%  rX   r   AssertionError)r   r(  r'  r)  s       r   test_memoize_enabledz&TestIsIPv6Enabled.test_memoize_enabled  s     %)!ZZ%6s%;= 	%@I..0GOOI,,-OOH556OOG$	% ZZ$23I$JL 	%..0GOOG$	% 	%	% 	%	% 	%s   A C#4&C/#C,/C8c                    d t         _        t        j                  dt	        d            5  t        j
                         }| j                  |       d d d        t        j                  dt        d            5  t        j
                         }| j                  |       d d d        y # 1 sw Y   XxY w# 1 sw Y   y xY w)Nr#  rz   r"  r2  r.  )r   r  r   r   r  r%  rZ   r3  )r   r(  r)  s      r   test_memoize_disabledz'TestIsIPv6Enabled.test_memoize_disabled  s     %)!ZZ%6s%;= 	&..0GW%	&
 ZZ$23I$JL 	&..0GW%	& 	&	& 	&
	& 	&s   &B):&B5)B25B>c                     d t         _        t        j                         }| j                  |       t        j                         }| j                  |       y r   )r   r  r%  rZ   r&  s       r   test_memoize_not_existsz)TestIsIPv6Enabled.test_memoize_not_exists  sD    
 %)!**,!**,!r   )r   r   r   r  r   r   r  r*  r-  r3  r0  r4  r6  r8  __classcell__)r!  s   @r   r  r    sH   . TZZ t4TZZ.?.DE! F 5! TZZ t4TZZ.?.DE" F 5" TZZ u5TZZ*+<=?"? 6" TZZ t4% 5% TZZ t4& 5& TZZ u5TZZ*+<=?"? 6"r   r  )
contextlibr  rG   unittestr   r  r   oslotestr   	test_base
oslo_utilsr   BaseTestCaser   r   r  contextmanagerr  r  r   r   r   <module>rA     s      	     & X(y-- X(v
$H)00 $HN
	.. 
@  
D"	.. D"r   