U
    <{f_<                     @   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   O/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/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   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_debugset_exception_handlerrC   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failrF   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   rE   rD   )r	   Zh_nameZh_cntr   r   r   tearDownd   sp    

     


zBaseTestCase.tearDownc                 C   s
   d| _ d S NF)rF   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OSErrorrI   TestThreadedServer)
r	   Zserver_progrW   rX   rY   rZ   r[   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 )Nr\   r   r]   )r^   rb   r   rc   TestThreadedClient)r	   Zclient_progrW   rY   ri   r   r   r   
tcp_client   s    
   zBaseTestCase.tcp_clientc                 O   s   | j |dtji|S NrW   )rk   r^   r_   r	   argskwargsr   r   r   unix_server   s    zBaseTestCase.unix_serverc                 O   s   | j |dtji|S rn   )rm   r^   r_   ro   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 )Nri   )r`   TemporaryDirectoryospathjoinunlinkrf   )r	   tdfnr   r   r   unix_sock_name   s    

zBaseTestCase.unix_sock_namec              	   C   s    z| j  W 5 |  | X d S r   )rL   r9   stopr	   rj   r   r   r   _abort_socket_test   s    zBaseTestCase._abort_socket_test)r   r   r   r.   r/   r0   r4   r:   r>   rC   rH   rQ   rS   r^   AF_INETrk   rm   rr   rs   
contextlibcontextmanagerr{   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)ru   rv   abspathrw   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^   rd   errorr   )Z
start_fromportri   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   sD   t tdrttj}nttj}| jtjO  _||| |S )NPROTOCOL_TLS)r$   ssl
SSLContextr   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 rR   )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.   /  s    zUVTestCase.new_loopc                 C   s   t  S r   )r   ZEventLoopPolicyr-   r   r   r   r/   2  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   rH   sysversion_infor2   SafeChildWatcherattach_loopr9   set_child_watcher)r	   watcherr   r   r   rH   :  s
    

zAIOTestCase.setUpc                    s"   t jdk rtd  t   d S r   )r   r   r2   r   r   rQ   r-   r   r   r   rQ   B  s    

zAIOTestCase.tearDownc                 C   s   t  S r   )r2   r   r-   r   r   r   r.   G  s    zAIOTestCase.new_loopc                 C   s   t  S r   )r2   DefaultEventLoopPolicyr-   r   r   r   r/   J  s    zAIOTestCase.new_policy)	r   r   r   r   rH   rQ   r.   r/   r   r   r   r   r   r   6  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_INET6rd   rf   )Zserver_sockr   r   r   has_IPv6N  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	   ri   r   r   r   r   c  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_allf  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_handshakerI   )r	   ssl_contextr   r   r   ssl_sockr   r   r   starttlso  s     
zTestSocketWrapper.starttlsc                 C   s   t | j|S r   )rN   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   a  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 rR   )_activerw   r-   r   r   r   r|     s    zSocketThread.stopc                 C   s   |    | S r   )startr-   r   r   r   	__enter__  s    zSocketThread.__enter__c                 G   s   |    d S r   )r|   )r	   excr   r   r   __exit__  s    zSocketThread.__exit__N)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S )rl   c                 C   s:   t j| d d d d| _|| _|| _d| _|| _|| _d S )Nztest-clientT)		threadingThreadr   daemon_timeout_sockr   _prog_test)r	   testri   progrY   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   rl     s   
rl   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 )rg   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   ri   r   rY   r[   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   r|   r   filenosendrf   r-   r   r   r   r|     s    
zTestThreadedServer.stopc              	   C   sF   z*| j | jd |   W 5 Q R X W 5 | j   | j  X d S )Nr   )r   rI   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 )NrU   F)r   r   r   selectr   r   r   acceptBlockingIOErrorr^   rY   rc   _handle_clientr   r   r   r   r~   )r	   rwxconnrX   rj   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   rX     s    zTestThreadedServer.addr)r   r   r   r   r|   r   r   r   propertyrX   r   r   r   r   r   rg     s   
	$rg   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)create_task_log_destroy_pendingrI   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   futuresTimeoutErrorr<   tasksr=   )r9   predrY   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.
    rU   N)r2   logr   levelsetLevelr   CRITICAL)Z	old_levelr   r   r   disable_logger  s
    

r  )r   )r  )+__doc__r2   Zasyncio.eventscollectionsr   rM   r   ru   rK   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   rl   rg   r  r	  r  r   r   r   r   <module>   sP    +

'X

