o
    KK&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   C/var/www/html/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 )Ntest_z6duplicate test {}.{} (also defined in {} parent class))
startswithhasattrr   r   r   r   __new__dict)r#   r   r$   dct	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   r0   r   r1   r3   r   r   r   
new_policyC   r5   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'   r3   r   r   r   is_asyncio_loopQ      zBaseTestCase.is_asyncio_loopg{Gz?)delayc                C   s   | j t| d S r   )rA   run_until_completer:   sleep)r
   rD   r   r   r   run_loop_brieflyT      zBaseTestCase.run_loop_brieflyc                 C   s   | j | | j| d S r   )#_BaseTestCase__unhandled_exceptionsappendrA   default_exception_handler)r
   rA   contextr   r   r   loop_exception_handlerW   s   z#BaseTestCase.loop_exception_handlerc                 C   sB   |   | _t|   t| j d| _| j| j g | _	d S )NT)
r4   rA   r:   set_event_loop_policyr6   set_event_loop"_check_unclosed_resources_in_debugset_exception_handlerrM   rI   r3   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()	_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)handle_namezalive {} after testzTotal/closed handlesztotal != closed for {})rA   closerI   printpprintfailrP   gccollectgetattrassertEqual_debug_uv_handles_total_debug_uv_handles_freed_debug_cb_handles_count_debug_cb_timer_handles_count_debug_stream_write_ctx_cnt_debug_handles_currentitemssubTestr   _debug_handles_total_debug_handles_closedr:   rO   rN   )r
   h_nameh_cntr   r   r   tearDownd   sn   




zBaseTestCase.tearDownc                 C   s
   d| _ d S NF)rP   r3   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OSErrorrU   TestThreadedServer)
r
   server_progrp   rq   rr   rs   rt   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 )Nru   r   rv   )rw   r{   r   r|   TestThreadedClient)r
   client_progrp   rr   r   r   r   r   
tcp_client   s   
zBaseTestCase.tcp_clientc                 O      | j |dtji|S Nrp   )r   rw   rx   r
   argskwargsr   r   r   unix_server   rH   zBaseTestCase.unix_serverc                 O   r   r   )r   rw   rx   r   r   r   r   unix_client   rH   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 )Nr   )ry   TemporaryDirectoryospathjoinunlinkr   )r
   tdfnr   r   r   unix_sock_name   s&   
"zBaseTestCase.unix_sock_namec              	   C   s(   z| j   W | | d S | | w r   )rA   stoprX   r
   r   r   r   r   _abort_socket_test   s   zBaseTestCase._abort_socket_test)r   r   r   r4   r6   r7   r<   rB   rG   rM   rR   ri   rk   rw   AF_INETr   r   r   r   
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)test_file_name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 )N	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   r:   )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)rangerw   r}   errorr   )
start_fromportr   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 rj   )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 )Nr:   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_loopr3   r   r   r   r4   1  r8   zUVTestCase.new_loopc                 C   r   r   )r   EventLoopPolicyr3   r   r   r   r6   4  r8   zUVTestCase.new_policyN)r   r   r   implementationr4   r6   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 )
AIOTestCaser:   c                    s:   t    tjdk rt }|| j t| d S d S N)      )	r   rR   sysversion_infor:   SafeChildWatcherattach_looprA   set_child_watcher)r
   watcherr   r   r   rR   <  s   

zAIOTestCase.setUpc                    s"   t jdk r
td  t   d S r   )r   r   r:   r   r   ri   r3   r   r   r   ri   D  s   

zAIOTestCase.tearDownc                 C   r   r   )r:   r   r3   r   r   r   r4   I  r8   zAIOTestCase.new_loopc                 C   r   r   )r:   DefaultEventLoopPolicyr3   r   r   r   r6   L  r8   zAIOTestCase.new_policy)	r   r   r   r   rR   ri   r4   r6   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)rw   AF_INET6r}   r   )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
   r   r   r   r   r   e  rl   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   )r9   r   r   wrap_socketr   do_handshakerU   )r
   ssl_contextr   r   r   ssl_sockr   r   r   starttlsq  s   

zTestSocketWrapper.starttlsc                 C   s   t | j|S r   )r[   r   r   r   r   r   __getattr__     zTestSocketWrapper.__getattr__c                 C   s   d t| j| jS )Nz	<{} {!r}>)r   r@   r   r   r3   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 rj   )_activer   r3   r   r   r   r     s   zSocketThread.stopc                 C   s   |    | S r   )startr3   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 )r   c                 C   s:   t j| d d d d| _|| _|| _d| _|| _|| _d S )Nztest-clientT)		threadingThreadr   daemon_timeout_sockr   _prog_test)r
   testr   progrr   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   r     s    
r   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 )r   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  _clients_finished_clients_max_clientsr  r  r   r  rw   
socketpair_s1_s2setblockingr  )r
   r  r   r  rr   rt   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sendr   r   r   r3   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  rU   r  r3   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 )Nrn   F)r   r  r  selectr  r  r  acceptBlockingIOErrorrw   rr   r|   _handle_clientr  r	  r
  r  r   )r
   rwxconnrq   r   r   r   r   r    sF   


zTestThreadedServer._runc                 C   s   |  t| d S r   )r  r   r   r   r   r   r    rC   z!TestThreadedServer._handle_clientc                 C   s
   | j  S r   )r  getsocknamer3   r   r   r   rq     s   
zTestThreadedServer.addr)r   r   r   r   r   r  r  r  propertyrq   r    r   r   r   r   r     s    
	$r   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)create_task_log_destroy_pendingrE   rU   )rA   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?)timer:   futuresTimeoutErrorrE   tasksrF   )rA   predrr   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.
    rn   N)r:   logr   levelsetLevelr   CRITICAL)	old_levelr   r   r   disable_logger  s   
"r4  )r   )r'  )+__doc__r:   asyncio.eventscollectionsr   rY   r   r   rW   r   r  rw   r   r   ry   r   r(  unittestr   r   r   UserDictr   r@   r!   TestCaser/   r   r   r   r   r   r   r   r   r   r   r   r   r   r&  r.  r4  r   r   r   r   <module>   sR     +

 'X

