B
    18\t                 @   s   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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S )    Nc               @   s   e Zd Zdd Zdd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 )FunctionalTestCaseMixinc             C   s   t  S )N)asyncionew_event_loop)self r   `/oak/stanford/groups/akundaje/marinovg/programs/Python-3.7.3/Lib/test/test_asyncio/functional.pynew_loop   s    z FunctionalTestCaseMixin.new_loopg{Gz?)delayc            C   s   | j tj|| j d d S )N)loop)r
   run_until_completer   sleep)r   r	   r   r   r   run_loop_briefly   s    z(FunctionalTestCaseMixin.run_loop_brieflyc             C   s   | j | | j| d S )N)._FunctionalTestCaseMixin__unhandled_exceptionsappendr
   default_exception_handler)r   r
   contextr   r   r   loop_exception_handler   s    z.FunctionalTestCaseMixin.loop_exception_handlerc             C   sB   |   | _td  | j| j g | _tjj| _	dd tj_d S )Nc               S   s   d S )Nr   r   r   r   r   <lambda>!       z/FunctionalTestCaseMixin.setUp.<locals>.<lambda>)
r   r
   r   set_event_loopset_exception_handlerr   r   events_get_running_loop_old_get_running_loop)r   r   r   r   setUp   s    


zFunctionalTestCaseMixin.setUpc          	   C   sT   z2| j   | jr0td t| j | d W d | jtj_	t
d  d | _ X d S )Nz2Unexpected calls to loop.call_exception_handler():z1unexpected calls to loop.call_exception_handler())r
   closer   printpprintfailr   r   r   r   r   )r   r   r   r   tearDown#   s    


z FunctionalTestCaseMixin.tearDownN      
   )familyaddrtimeoutbacklogmax_clientsc      
   
   C   s   |d kr<t tdr8|tjkr8t }|j}W d Q R X nd}t|tj}|d krZtd|dkrjtd|| y|	| |
| W n. tk
r }	 z|  |	W d d }	~	X Y nX t| ||||S )NAF_UNIX)z	127.0.0.1r   ztimeout is requiredr   z#only blocking sockets are supported)hasattrsocketr(   tempfileNamedTemporaryFilenameSOCK_STREAMRuntimeError
settimeoutbindlistenOSErrorr   TestThreadedServer)
r   Zserver_progr#   r$   r%   r&   r'   tmpsockexr   r   r   
tcp_server1   s&    


z"FunctionalTestCaseMixin.tcp_serverc             C   sF   t  |t j}|d krtd|dkr.td|| t| |||S )Nztimeout is requiredr   z#only blocking sockets are supported)r*   r.   r/   r0   TestThreadedClient)r   Zclient_progr#   r%   r6   r   r   r   
tcp_clientQ   s    
z"FunctionalTestCaseMixin.tcp_clientc             O   s$   t tdst| j|dtji|S )Nr(   r#   )r)   r*   NotImplementedErrorr8   r(   )r   argskwargsr   r   r   unix_server`   s    
z#FunctionalTestCaseMixin.unix_serverc             O   s$   t tdst| j|dtji|S )Nr(   r#   )r)   r*   r;   r:   r(   )r   r<   r=   r   r   r   unix_cliente   s    
z#FunctionalTestCaseMixin.unix_clientc             c   sX   t  F}tj|d}z
|V  W d yt| W n tk
rF   Y nX X W d Q R X d S )Nr6   )r+   TemporaryDirectoryospathjoinunlinkr3   )r   tdfnr   r   r   unix_sock_namej   s    

z&FunctionalTestCaseMixin.unix_sock_namec          	   C   s    z| j   W d | | X d S )N)r
   stopr   )r   r7   r   r   r   _abort_socket_testv   s    z*FunctionalTestCaseMixin._abort_socket_test)__name__
__module____qualname__r   r   r   r   r   r*   AF_INETr8   r:   r>   r?   
contextlibcontextmanagerrG   rI   r   r   r   r   r      s    r   c               @   s<   e Zd Zdd Zdd Zddddd	Zd
d Zdd ZdS )TestSocketWrapperc             C   s
   || _ d S )N)_TestSocketWrapper__sock)r   r6   r   r   r   __init__   s    zTestSocketWrapper.__init__c             C   s@   d}x6t ||k r:| |t | }|dkr0t||7 }qW |S )Nr   )lenrecvConnectionAbortedError)r   nbufdatar   r   r   recv_all   s    zTestSocketWrapper.recv_allFN)server_sideserver_hostnamec            C   sT   |j | j||dd}z(y|  W n   |   Y nX W d | j  X || _d S )NF)rZ   r[   Zdo_handshake_on_connect)wrap_socketrQ   do_handshaker   )r   ssl_contextrZ   r[   Zssl_sockr   r   r   	start_tls   s    zTestSocketWrapper.start_tlsc             C   s   t | j|S )N)getattrrQ   )r   r-   r   r   r   __getattr__   s    zTestSocketWrapper.__getattr__c             C   s   d t| j| jS )Nz	<{} {!r}>)formattyperJ   rQ   )r   r   r   r   __repr__   s    zTestSocketWrapper.__repr__)rJ   rK   rL   rR   rY   r_   ra   rd   r   r   r   r   rP      s   
rP   c               @   s$   e Zd Zdd Zdd Zdd ZdS )SocketThreadc             C   s   d| _ |   d S )NF)_activerC   )r   r   r   r   rH      s    zSocketThread.stopc             C   s   |    | S )N)start)r   r   r   r   	__enter__   s    zSocketThread.__enter__c             G   s   |    d S )N)rH   )r   excr   r   r   __exit__   s    zSocketThread.__exit__N)rJ   rK   rL   rH   rh   rj   r   r   r   r   re      s   re   c               @   s   e Zd Zdd Zdd ZdS )r9   c             C   s:   t j| d d d d| _|| _|| _d| _|| _|| _d S )Nztest-clientT)		threadingThreadrR   daemon_timeout_sockrf   _prog_test)r   testr6   progr%   r   r   r   rR      s    zTestThreadedClient.__init__c          
   C   sH   y|  t| j W n. tk
rB } z| j| W d d }~X Y nX d S )N)rp   rP   ro   	Exceptionrq   rI   )r   r7   r   r   r   run   s    zTestThreadedClient.runN)rJ   rK   rL   rR   ru   r   r   r   r   r9      s   
r9   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 )r4   c             C   sh   t j| d d d d| _d| _d| _|| _|| _|| _d| _	|| _
t \| _| _| jd || _d S )Nztest-serverTr   F)rk   rl   rR   rm   _clientsZ_finished_clients_max_clientsrn   ro   rf   rp   r*   
socketpair_s1_s2setblockingrq   )r   rr   r6   rs   r%   r'   r   r   r   rR      s    zTestThreadedServer.__init__c                sP   z>| j r<| j  dkr<y| j d W n tk
r:   Y nX W d t   X d S )Ns   stop)rz   filenosendr3   superrH   )r   )	__class__r   r   rH      s    
zTestThreadedServer.stopc          	   C   sF   z*| j  | j d |   W d Q R X W d | j  | j  X d S )Nr   )ro   r{   _runry   r   rz   )r   r   r   r   ru      s    
zTestThreadedServer.runc             C   s   x| j r| j| jkrd S t| j| jgg g | j\}}}| j|krJd S | j|kry| j \}}W n6 tk
r|   wY q t	j
k
r   | j sd S  Y qX |  jd7  _|| j y| | | W d Q R X W q tk
r } z d| _ z W d | j| X W d d }~X Y qX qW d S )Nr!   F)rf   rv   rw   selectro   ry   rn   acceptBlockingIOErrorr*   r%   r0   _handle_clientrt   rq   rI   )r   rwxconnr$   r7   r   r   r   r      s4    

zTestThreadedServer._runc             C   s   |  t| d S )N)rp   rP   )r   r6   r   r   r   r     s    z!TestThreadedServer._handle_clientc             C   s
   | j  S )N)ro   getsockname)r   r   r   r   r$     s    zTestThreadedServer.addr)rJ   rK   rL   rR   rH   ru   r   r   propertyr$   __classcell__r   r   )r   r   r4      s   
	"r4   )r   Zasyncio.eventsrN   rA   r   r   r*   r+   rk   r   rP   rl   re   r9   r4   r   r   r   r   <module>   s   v(