o
    c[h<                     @   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                   @      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   w/home/ubuntu/experiments/live_experiments/Pythonexperiments/Otree/venv/lib/python3.10/site-packages/uvloop/_testbase.py__eq__   s   zMockPattern.__eq__N)__name__
__module____qualname__r   r   r   r   r   r          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 v 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      t |S r   )r   )mclsr   basesr   r   r   __prepare__,   s   zBaseTestCaseMeta.__prepare__c                    sT   |D ]}| 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      t r   NotImplementedErrorr
   r   r   r   new_loop@      zBaseTestCase.new_loopc                 C   r.   r   r/   r1   r   r   r   
new_policyC   r3   zBaseTestCase.new_policyc                 C   r"   r   )r   )r
   r   r   r   r   mock_patternF      zBaseTestCase.mock_patternc              	      s@   t |tjs	d S z
| I d H  W d S  ttfy   Y d S w r   )
isinstanceasyncioStreamWriterwait_closedBrokenPipeErrorConnectionError)r
   objr   r   r   r:   I   s   zBaseTestCase.wait_closedc                 C   s   t | jjdS )Nzasyncio.)typeloopr   r&   r1   r   r   r   is_asyncio_loopQ      zBaseTestCase.is_asyncio_loopg{Gz?)delayc                C   s   | j t| d S r   )r?   run_until_completer8   sleep)r
   rB   r   r   r   run_loop_brieflyT      zBaseTestCase.run_loop_brieflyc                 C   s   | j | | j| d S r   )#_BaseTestCase__unhandled_exceptionsappendr?   Zdefault_exception_handler)r
   r?   contextr   r   r   loop_exception_handlerW   s   z#BaseTestCase.loop_exception_handlerc                 C   sB   |   | _t|   t| j d| _| j| j g | _	d S )NT)
r2   r?   r8   set_event_loop_policyr4   set_event_loop"_check_unclosed_resources_in_debugZset_exception_handlerrJ   rG   r1   r   r   r   setUp[   s   

zBaseTestCase.setUpc              	   C   s  | j   | jrtd t| j | d d S | jsd S t  t  t  t	| j ddrt  t  t  | 
| j j| j jd | 
| j jdd | 
| j jdd | 
| j jdd	 | j j D ]%\}}| jd
|d | 
|dd| W d    n1 sw   Y  qi| j j D ])\}}| jd|d | 
|| j j| d| W d    n1 sw   Y  qt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 {})r?   closerG   printpprintfailrM   gcZcollectgetattrZ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_closedr8   rL   rK   )r
   Zh_nameZh_cntr   r   r   tearDownd   sn   




zBaseTestCase.tearDownc                 C   s
   d| _ d S NF)rM   r1   r   r   r   skip_unclosed_handles_check      
z(BaseTestCase.skip_unclosed_handles_checkN      
   )familyaddrtimeoutbacklogmax_clientsc          
   
   C   s   |d u r#|t jkr!t }|j}W d    n1 sw   Y  nd}t  |t j}|d u r2td|dkr:td|| z|| |	| W n t
y] }	 z|  |	d }	~	ww 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OSErrorrO   TestThreadedServer)
r
   Zserver_progr]   r^   r_   r`   ra   tmpsockexr   r   r   
tcp_server   s0   




zBaseTestCase.tcp_serverc                 C   sF   t  |t j}|d u rtd|dkrtd|| t| |||S )Nrb   r   rc   )rd   rh   r   ri   TestThreadedClient)r
   Zclient_progr]   r_   ro   r   r   r   
tcp_client   s   
zBaseTestCase.tcp_clientc                 O      | j |dtji|S Nr]   )rq   rd   re   r
   argskwargsr   r   r   unix_server   rF   zBaseTestCase.unix_serverc                 O   rt   ru   )rs   rd   re   rv   r   r   r   unix_client   rF   zBaseTestCase.unix_clientc                 c   s    t  ?}tj|d}z|V  W zt| W n ty"   Y nw zt| W w  ty3   Y w w W d    d S W d    d S 1 sGw   Y  d S )Nro   )rf   TemporaryDirectoryospathjoinunlinkrl   )r
   tdfnr   r   r   unix_sock_name   s&   
"zBaseTestCase.unix_sock_namec              	   C   s(   z| j   W | | d S | | w r   )r?   stoprR   r
   rp   r   r   r   _abort_socket_test   s   zBaseTestCase._abort_socket_test)r   r   r   r2   r4   r5   r:   r@   rE   rJ   rN   rV   rX   rd   AF_INETrq   rs   ry   rz   
contextlibcontextmanagerr   r   r   r   r   r   r-   >   s2    	9!

r-   )	metaclassc                 C   s4   t jt jt j| d|}t j|sJ |S )Ncerts)r|   r}   abspathr~   dirnameisfile)Ztest_file_nameZcert_file_namefullnamer   r   r   _cert_fullname   s
   r   c               	   c   sR    G dd dt j} t d}|  }|| zd V  W || d S || w )Nc                   @   r   )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   r   r   r8   )loggingr   	getLogger	addFilterremoveFilter)r   loggerr   r   r   r   silence_long_exec_warning   s   

r   P  c              
   C   s   t | | d D ]6}t }|& z	|d|f W n tjy)   Y W d    qw |W  d      S 1 s8w   Y  qtd)Ni   zcould not find a free port)rangerd   rj   errorr   )Z
start_fromportro   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rt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 rW   )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   sD    t d}t d}|| zd V  W || d S || w )Nr8   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_warningr   )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      t  S r   )r   new_event_loopr1   r   r   r   r2   1  r6   zUVTestCase.new_loopc                 C   r   r   )r   ZEventLoopPolicyr1   r   r   r   r4   4  r6   zUVTestCase.new_policyN)r   r   r   implementationr2   r4   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 )
AIOTestCaser8   c                    s:   t    tjdk rt }|| j t| d S d S N)      )	r   rN   sysversion_infor8   ZSafeChildWatcherZattach_loopr?   set_child_watcher)r
   Zwatcherr   r   r   rN   <  s   

zAIOTestCase.setUpc                    s"   t jdk r
td  t   d S r   )r   r   r8   r   r   rV   r1   r   r   r   rV   D  s   

zAIOTestCase.tearDownc                 C   r   r   )r8   r   r1   r   r   r   r2   I  r6   zAIOTestCase.new_loopc                 C   r   r   )r8   ZDefaultEventLoopPolicyr1   r   r   r   r4   L  r6   zAIOTestCase.new_policy)	r   r   r   r   rN   rV   r2   r4   r    r   r   r   r   r   8  s    r   c               	   C   sh   t  t j} | " z| d W n ty    Y W d    dS w 	 W d    dS 1 s-w   Y  d S )N)z::1r   FT)rd   AF_INET6rj   rl   )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
   ro   r   r   r   r   e  rY   zTestSocketWrapper.__init__c                 C   sF   d}t ||k r!| |t | }|dkrt||7 }t ||k s|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J |j| j|||d}|r|  | j  || _d S )Nr   )r7   r   r   wrap_socketr   do_handshakerO   )r
   ssl_contextr   r   r   ssl_sockr   r   r   starttlsq  s   

zTestSocketWrapper.starttlsc                 C   s   t | j|S r   )rT   r   r   r   r   r   __getattr__     zTestSocketWrapper.__getattr__c                 C   s   d t| j| jS )Nz	<{} {!r}>)r   r>   r   r   r1   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 rW   )_activer~   r1   r   r   r   r     s   zSocketThread.stopc                 C   s   |    | S r   )startr1   r   r   r   	__enter__  s   zSocketThread.__enter__c                 G   s   |    d S r   )r   )r
   excr   r   r   __exit__  r   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 )rr   c                 C   s:   t j| d d d d| _|| _|| _d| _|| _|| _d S )Nztest-clientT)		threadingThreadr   daemon_timeout_sockr   _prog_test)r
   testro   progr_   r   r   r   r     s   
zTestThreadedClient.__init__c              
   C   s\   z|  t| j W d S  ttfy     ty- } z| j| W Y d }~d S d }~ww 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   rr     s    
rr   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 )rm   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   rd   
socketpair_s1_s2setblockingr   )r
   r   ro   r   r_   ra   r   r   r   r     s   
zTestThreadedServer.__init__c                    s   z<| j r| j  dkr%z| j d W n ty   Y nw W t   d S W t   d S W t   d S W t   d S t   w )Ns   stop)r   filenosendrl   r   r   r1   r   r   r   r     s   zTestThreadedServer.stopc                 C   s   z7| j  | j d |   W d    n1 sw   Y  W | j  | j  d S W | j  | j  d S | j  | j  w )Nr   )r   r   _runr   rO   r   r1   r   r   r   r     s   



zTestThreadedServer.runc                 C   s.  | j r| j| jkrd S t| j| jgg g | j\}}}| j|v r"d S | j|v rz	| j \}}W n ty9   Y q  t	j
yG   | j sFY d S  w |  jd7  _|| j z| | | W d    n1 shw   Y  W n! ttfyx     ty } zd| _ z | j| w d }~ww | j sd S d S )Nr[   F)r   r   r   selectr   r   r   acceptBlockingIOErrorrd   r_   ri   _handle_clientr   r   r   r   r   )r
   rwxconnr^   rp   r   r   r   r     sF   


zTestThreadedServer._runc                 C   s   |  t| d S r   )r   r   r   r   r   r   r     rA   z!TestThreadedServer._handle_clientc                 C   s
   | j  S r   )r   getsocknamer1   r   r   r   r^     s   
zTestThreadedServer.addr)r   r   r   r   r   r   r   r   propertyr^   r    r   r   r   r   rm     s    
	$rm   c                 C   sB   dd }| }|  |}d|_z| | W |  d S |  w )Nc                      s   d S r   r   r   r   r   r   once  s   zrun_briefly.<locals>.onceF)Zcreate_taskZ_log_destroy_pendingrC   rO   )r?   r  gentr   r   r   run_briefly  s   
r     c                 C   sX   t   | }| s*|d ur|t    }|dkrtj | tjd | r	d S d S )Nr   gMbP?)timer8   ZfuturesTimeoutErrorrC   tasksrD   )r?   predr_   deadliner   r   r   	run_until  s   
r  c               	   c   sL    t jjj} zt jjtjd  dV  W t jj|  dS t jj|  w )zrContext manager to disable asyncio logger.

    For example, it can be used to ignore warnings in debug mode.
    r[   N)r8   logr   levelsetLevelr   CRITICAL)Z	old_levelr   r   r   disable_logger  s   
"r  )r   )r  )+__doc__r8   Zasyncio.eventscollectionsr   rS   r   r|   rQ   r   r   rd   r   r   rf   r   r  Zunittestr   r   r   UserDictr   r>   r!   ZTestCaser-   r   r   r   r   r   r   r   r   r   r   r   rr   rm   r  r  r  r   r   r   r   <module>   sR     +

 'X

