U
    $i<                     @   s  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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ZddlZddlZG dd deZG dd dejZG dd deZG d	d
 d
ejedZdd Zejdd Zd*ddZG dd dZG dd deZ G dd deZ!dd Z"e" Z"G dd dZ#G dd dej$Z%G dd  d e%Z&G d!d" d"e%Z'd#d$ Z(d+d&d'Z)ejd(d) Z*dS ),z8Test utilities. Don't use outside of the uvloop project.    Nc                   @   s   e Zd Zdd ZdS )MockPatternc                 C   s   t tt| |tjS N)boolresearchstrS)selfother r   4/tmp/pip-unpacked-wheel-6lmrvi0o/uvloop/_testbase.py__eq__   s    zMockPattern.__eq__N)__name__
__module____qualname__r   r   r   r   r   r      s   r   c                       s(   e Zd Z fddZ fddZ  ZS )TestCaseDictc                    s   t    || _d S r   )super__init__namer	   r   	__class__r   r   r      s    
zTestCaseDict.__init__c                    s.   || j krtd| j|t || d S )Nzduplicate test {}.{})dataRuntimeErrorformatr   r   __setitem__)r	   keyvaluer   r   r   r   #   s    
 zTestCaseDict.__setitem__)r   r   r   r   r   __classcell__r   r   r   r   r      s   r   c                       s(   e Zd Zedd Z fddZ  ZS )BaseTestCaseMetac                 C   s   t |S r   )r   )mclsr   basesr   r   r   __prepare__,   s    zBaseTestCaseMeta.__prepare__c                    sT   |D ]8}| dsq|D ]"}t||rtd|||jqqt | ||t|S )NZtest_z6duplicate test {}.{} (also defined in {} parent class))
startswithhasattrr   r   r   r   __new__dict)r    r   r!   dctZ	test_namebaser   r   r   r%   0   s    

  zBaseTestCaseMeta.__new__)r   r   r   classmethodr"   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	d
 ZddddZdd Z	dd Z
dd Zdd ZejdddddddZejdfddZd d! Zd"d# Zejd$d% Zd&d' ZdS )(BaseTestCasec                 C   s   t d S r   NotImplementedErrorr	   r   r   r   new_loop@   s    zBaseTestCase.new_loopc                 C   s   t d S r   r+   r-   r   r   r   
new_policyC   s    zBaseTestCase.new_policyc                 C   s   t |S r   )r   )r	   r   r   r   r   mock_patternF   s    zBaseTestCase.mock_patternc              	      s@   t |tjsd S z| I d H  W n ttfk
r:   Y nX d S r   )
isinstanceasyncioStreamWriterwait_closedBrokenPipeErrorConnectionError)r	   objr   r   r   r4   I   s    zBaseTestCase.wait_closedc                 C   s   t | jjdS )Nzasyncio.)typeloopr   r#   r-   r   r   r   is_asyncio_loopQ   s    zBaseTestCase.is_asyncio_loopg{Gz?)delayc                C   s   | j t| d S r   )r9   run_until_completer2   sleep)r	   r;   r   r   r   run_loop_brieflyT   s    zBaseTestCase.run_loop_brieflyc                 C   s   | j | | j| d S r   )#_BaseTestCase__unhandled_exceptionsappendr9   Zdefault_exception_handler)r	   r9   contextr   r   r   loop_exception_handlerW   s    z#BaseTestCase.loop_exception_handlerc                 C   sB   |   | _t|   t| j d| _| j| j g | _	d S )NT)
r.   r9   r2   set_event_loop_policyr/   set_event_loop"_check_unclosed_resources_in_debugZset_exception_handlerrB   r?   r-   r   r   r   setUp[   s    
zBaseTestCase.setUpc              
   C   sx  | j   | jr2td t| j | d d S | js<d S t  t  t  t	| j ddrZt  t  t  | 
| j j| j jd | 
| j jdd | 
| j jdd | 
| j jdd	 | j j D ]6\}}| jd
|d | 
|dd| W 5 Q R X q| j j D ]@\}}| jd|d" | 
|| j j| d| W 5 Q R X qtd  td  d | _ d S )Nz2Unexpected calls to loop.call_exception_handler():z1unexpected calls to loop.call_exception_handler()Z	_debug_ccFz&not all uv_handle_t handles were freedr   z&not all callbacks (call_soon) are GCedz-not all timer callbacks (call_later) are GCedz&not all stream write contexts are GCedzAlive handle after test)Zhandle_namezalive {} after testzTotal/closed handlesztotal != closed for {})r9   closer?   printpprintfailrE   gcZcollectgetattrassertEqualZ_debug_uv_handles_totalZ_debug_uv_handles_freedZ_debug_cb_handles_countZ_debug_cb_timer_handles_countZ_debug_stream_write_ctx_cntZ_debug_handles_currentitemsZsubTestr   Z_debug_handles_totalZ_debug_handles_closedr2   rD   rC   )r	   Zh_nameZh_cntr   r   r   tearDownd   sp    

     


zBaseTestCase.tearDownc                 C   s
   d| _ d S NF)rE   r-   r   r   r   skip_unclosed_handles_check   s    z(BaseTestCase.skip_unclosed_handles_checkN      
   )familyaddrtimeoutbacklogmax_clientsc          
   
   C   s   |d kr2|t jkr.t }|j}W 5 Q R X nd}t  |t j}|d krPtd|dkr`td|| z|| |	| W n. t
k
r }	 z|  |	W 5 d }	~	X Y nX t| ||||S )N)z	127.0.0.1r   timeout is requiredr   #only blocking sockets are supported)socketAF_UNIXtempfileNamedTemporaryFiler   SOCK_STREAMr   
settimeoutbindlistenOSErrorrG   TestThreadedServer)
r	   Zserver_progrU   rV   rW   rX   rY   tmpsockexr   r   r   
tcp_server   s0    



    zBaseTestCase.tcp_serverc                 C   sF   t  |t j}|d krtd|dkr.td|| t| |||S )NrZ   r   r[   )r\   r`   r   ra   TestThreadedClient)r	   Zclient_progrU   rW   rg   r   r   r   
tcp_client   s    
   zBaseTestCase.tcp_clientc                 O   s   | j |dtji|S NrU   )ri   r\   r]   r	   argskwargsr   r   r   unix_server   s    zBaseTestCase.unix_serverc                 O   s   | j |dtji|S rl   )rk   r\   r]   rm   r   r   r   unix_client   s    zBaseTestCase.unix_clientc                 c   sX   t  F}tj|d}z
|V  W 5 zt| W n tk
rF   Y nX X W 5 Q R X d S )Nrg   )r^   TemporaryDirectoryospathjoinunlinkrd   )r	   tdfnr   r   r   unix_sock_name   s    

zBaseTestCase.unix_sock_namec              	   C   s    z| j  W 5 |  | X d S r   )rJ   r9   stopr	   rh   r   r   r   _abort_socket_test   s    zBaseTestCase._abort_socket_test)r   r   r   r.   r/   r0   r4   r:   r>   rB   rF   rO   rQ   r\   AF_INETri   rk   rp   rq   
contextlibcontextmanagerry   r|   r   r   r   r   r*   >   s0   	9!

r*   )	metaclassc                 C   s4   t jt jt j| d|}t j|s0t|S )Ncerts)rs   rt   abspathru   dirnameisfileAssertionError)Ztest_file_nameZcert_file_namefullnamer   r   r   _cert_fullname   s    
  r   c               	   c   sH   G dd dt j} t d}|  }|| z
d V  W 5 || X d S )Nc                   @   s   e Zd Zdd ZdS )z)silence_long_exec_warning.<locals>.Filterc                 S   s   |j do|j d S )NZ	Executingseconds)msgr#   endswith)r	   recordr   r   r   filter   s    
z0silence_long_exec_warning.<locals>.Filter.filterN)r   r   r   r   r   r   r   r   Filter   s   r   r2   )loggingr   	getLogger	addFilterremoveFilter)r   loggerr   r   r   r   silence_long_exec_warning   s    


r   P  c                 C   s   t | | d D ]h}t }|R z|d|f W n$ tjk
rV   Y W 5 Q R  qY nX |W  5 Q R    S W 5 Q R X qtdd S )Ni   zcould not find a free port)ranger\   rb   errorr   )Z
start_fromportrg   r   r   r   find_free_port   s     r   c                   @   s2   e Zd Zd
ddZddddZejdd	 ZdS )SSLTestCaseNc                 C   s\   t tdrttj}n$t tdr0ttj}nttj}| jtjO  _||| |S )NPROTOCOL_TLS_SERVERPROTOCOL_TLS)	r$   ssl
SSLContextr   r   PROTOCOL_SSLv23optionsOP_NO_SSLv2load_cert_chain)r	   certfilekeyfile
sslcontextr   r   r   _create_server_ssl_context  s    

z&SSLTestCase._create_server_ssl_contextT)disable_verifyc                C   s   t  }d|_|rt j|_|S rP   )r   create_default_contextcheck_hostname	CERT_NONEverify_mode)r	   r   r   r   r   r   _create_client_ssl_context  s
    z&SSLTestCase._create_client_ssl_contextc              	   c   s:   t d}t d}|| z
d V  W 5 || X d S )Nr2   zhas no effect when using ssl)r   r   r   r   r   )r	   r   r   r   r   r   _silence_eof_received_warning!  s    



z)SSLTestCase._silence_eof_received_warning)N)r   r   r   r   r   r~   r   r   r   r   r   r   r     s   
r   c                   @   s    e Zd ZdZdd Zdd ZdS )
UVTestCaseuvloopc                 C   s   t  S r   )r   new_event_loopr-   r   r   r   r.   1  s    zUVTestCase.new_loopc                 C   s   t  S r   )r   ZEventLoopPolicyr-   r   r   r   r/   4  s    zUVTestCase.new_policyN)r   r   r   implementationr.   r/   r   r   r   r   r   -  s   r   c                       s<   e Zd ZdZ fddZ fddZdd Zdd	 Z  ZS )
AIOTestCaser2   c                    s6   t    tjdk r2t }|| j t| d S N)      )	r   rF   sysversion_infor2   ZSafeChildWatcherZattach_loopr9   set_child_watcher)r	   Zwatcherr   r   r   rF   <  s
    

zAIOTestCase.setUpc                    s"   t jdk rtd  t   d S r   )r   r   r2   r   r   rO   r-   r   r   r   rO   D  s    

zAIOTestCase.tearDownc                 C   s   t  S r   )r2   r   r-   r   r   r   r.   I  s    zAIOTestCase.new_loopc                 C   s   t  S r   )r2   ZDefaultEventLoopPolicyr-   r   r   r   r/   L  s    zAIOTestCase.new_policy)	r   r   r   r   rF   rO   r.   r/   r   r   r   r   r   r   8  s
   r   c               	   C   s^   t  t j} | D z| d W n  tk
r@   Y W 5 Q R  dS X W 5 Q R  dS W 5 Q R X d S )N)z::1r   FT)r\   AF_INET6rb   rd   )Zserver_sockr   r   r   has_IPv6P  s    r   c                   @   s>   e Zd Zdd Zdd Zddddd	d
Zdd Zdd ZdS )TestSocketWrapperc                 C   s
   || _ d S r   )_TestSocketWrapper__sockr	   rg   r   r   r   r   e  s    zTestSocketWrapper.__init__c                 C   s<   d}t ||k r8| |t | }|dkr.t||7 }q|S )N    )lenrecvConnectionAbortedError)r	   nbufr   r   r   r   recv_allh  s    
zTestSocketWrapper.recv_allFNTserver_sideserver_hostnamedo_handshake_on_connectc                C   sD   t |tjst|j| j|||d}|r0|  | j  || _d S )Nr   )r1   r   r   r   wrap_socketr   do_handshakerG   )r	   ssl_contextr   r   r   Zssl_sockr   r   r   starttlsq  s     
zTestSocketWrapper.starttlsc                 C   s   t | j|S r   )rL   r   r   r   r   r   __getattr__  s    zTestSocketWrapper.__getattr__c                 C   s   d t| j| jS )Nz	<{} {!r}>)r   r8   r   r   r-   r   r   r   __repr__  s    zTestSocketWrapper.__repr__)r   r   r   r   r   r   r   r   r   r   r   r   r   c  s   
r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )SocketThreadc                 C   s   d| _ |   d S rP   )_activeru   r-   r   r   r   rz     s    zSocketThread.stopc                 C   s   |    | S r   )startr-   r   r   r   	__enter__  s    zSocketThread.__enter__c                 G   s   |    d S r   )rz   )r	   excr   r   r   __exit__  s    zSocketThread.__exit__N)r   r   r   rz   r   r   r   r   r   r   r     s   r   c                   @   s   e Zd Zdd Zdd ZdS )rj   c                 C   s:   t j| d d d d| _|| _|| _d| _|| _|| _d S )Nztest-clientT)		threadingThreadr   daemon_timeout_sockr   _prog_test)r	   testrg   progrW   r   r   r   r     s    zTestThreadedClient.__init__c              
   C   s`   z|  t| j W nF ttfk
r.    Y n. tk
rZ } z| j| W 5 d }~X Y nX d S r   )r   r   r   KeyboardInterrupt
SystemExitBaseExceptionr   r|   r{   r   r   r   run  s    zTestThreadedClient.runN)r   r   r   r   r   r   r   r   r   rj     s   
rj   c                       sH   e Zd Zdd Z fddZdd Zdd Zd	d
 Zedd Z	  Z
S )re   c                 C   sh   t j| d d d d| _d| _d| _|| _|| _|| _d| _	|| _
t \| _| _| jd || _d S )Nztest-serverTr   F)r   r   r   r   _clientsZ_finished_clients_max_clientsr   r   r   r   r\   
socketpair_s1_s2setblockingr   )r	   r   rg   r   rW   rY   r   r   r   r     s    zTestThreadedServer.__init__c                    sP   z>| jr<| j dkr<z| jd W n tk
r:   Y nX W 5 t    X d S )Ns   stop)r   rz   r   filenosendrd   r-   r   r   r   rz     s    
zTestThreadedServer.stopc              	   C   sF   z*| j | jd |   W 5 Q R X W 5 | j   | j  X d S )Nr   )r   rG   r   r   r   _runr-   r   r   r   r     s    
zTestThreadedServer.runc                 C   s6  | j r2| j| jkrd S t| j| jgg g | j\}}}| j|krFd S | j|kr z| j \}}W n: tk
rz   Y q Y q  t	j
k
r   | j sY d S  Y q X |  jd7  _|| j z| | | W 5 Q R X W q  ttfk
r    Y q  tk
r. } z d| _ z W 5 | j| X W 5 d }~X Y q X q d S )NrS   F)r   r   r   selectr   r   r   acceptBlockingIOErrorr\   rW   ra   _handle_clientr   r   r   r   r|   )r	   rwxconnrV   rh   r   r   r   r     s@    
   


zTestThreadedServer._runc                 C   s   |  t| d S r   )r   r   r   r   r   r   r     s    z!TestThreadedServer._handle_clientc                 C   s
   | j  S r   )r   getsocknamer-   r   r   r   rV     s    zTestThreadedServer.addr)r   r   r   r   rz   r   r   r   propertyrV   r   r   r   r   r   re     s   
	$re   c                 C   s<   dd }| }|  |}d|_z| | W 5 |  X d S )Nc                      s   d S r   r   r   r   r   r   once  s    zrun_briefly.<locals>.onceF)Zcreate_taskZ_log_destroy_pendingrG   r<   )r9   r   gentr   r   r   run_briefly  s    
r      c                 C   sP   t   | }| sL|d k	r8|t    }|dkr8tj | tjd qd S )Nr   gMbP?)timer2   ZfuturesTimeoutErrorr<   Ztasksr=   )r9   predrW   deadliner   r   r   	run_until  s    
r   c               	   c   s>   t jjj} zt jjtjd  dV  W 5 t jj|  X dS )zrContext manager to disable asyncio logger.

    For example, it can be used to ignore warnings in debug mode.
    rS   N)r2   logr   levelsetLevelr   CRITICAL)Z	old_levelr   r   r   disable_logger  s
    

r  )r   )r   )+__doc__r2   Zasyncio.eventscollectionsr~   rK   r   rs   rI   r   r   r\   r   r   r^   r   r   Zunittestr   r   r   UserDictr   r8   r   ZTestCaser*   r   r   r   r   r   r   r   r   r   r   r   rj   re   r   r   r  r   r   r   r   <module>   sP    +

 'X

