B
    v9at                 @   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)asyncioZnew_event_loop)self r    /usr/lib/python3.7/functional.pynew_loop   s    z FunctionalTestCaseMixin.new_loopg{Gz?)delayc            C   s   | j tj|| j d d S )N)loop)r	   Zrun_until_completer   Z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	   Z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_loopZ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#   tempfileZNamedTemporaryFilenameSOCK_STREAMRuntimeError
settimeoutZbindZlistenOSErrorr   TestThreadedServer)
r   Zserver_progr   r   r    r!   r"   Z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)   r*   TestThreadedClient)r   Zclient_progr   r    r-   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%   NotImplementedErrorr/   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%   r2   r1   r#   )r   r3   r4   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 )Nr-   )r&   ZTemporaryDirectoryospathjoinunlinkr+   )r   Z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   r.   r   r   r   _abort_socket_testv   s    z*FunctionalTestCaseMixin._abort_socket_test)__name__
__module____qualname__r   r
   r   r   r   r%   ZAF_INETr/   r1   r5   r6   
contextlibcontextmanagerr<   r>   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   r-   r   r   r   __init__   s    zTestSocketWrapper.__init__c             C   s@   d}x6t ||k r:| |t | }|dkr0t||7 }qW |S )Nr   )lenZ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)rM   rN   Zdo_handshake_on_connect)Zwrap_socketrE   Zdo_handshaker   )r   Zssl_contextrM   rN   Zssl_sockr   r   r   	start_tls   s    zTestSocketWrapper.start_tlsc             C   s   t | j|S )N)getattrrE   )r   r'   r   r   r   __getattr__   s    zTestSocketWrapper.__getattr__c             C   s   d t| j| jS )Nz	<{} {!r}>)formattyper?   rE   )r   r   r   r   __repr__   s    zTestSocketWrapper.__repr__)r?   r@   rA   rF   rL   rO   rQ   rT   r   r   r   r   rD      s   
rD   c               @   s$   e Zd Zdd Zdd Zdd ZdS )SocketThreadc             C   s   d| _ |   d S )NF)_activer9   )r   r   r   r   r=      s    zSocketThread.stopc             C   s   |    | S )N)start)r   r   r   r   	__enter__   s    zSocketThread.__enter__c             G   s   |    d S )N)r=   )r   excr   r   r   __exit__   s    zSocketThread.__exit__N)r?   r@   rA   r=   rX   rZ   r   r   r   r   rU      s   rU   c               @   s   e Zd Zdd Zdd ZdS )r0   c             C   s:   t j| d d d d| _|| _|| _d| _|| _|| _d S )Nztest-clientT)		threadingThreadrF   daemon_timeout_sockrV   _prog_test)r   testr-   progr    r   r   r   rF      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)r`   rD   r_   	Exceptionra   r>   )r   r.   r   r   r   run   s    zTestThreadedClient.runN)r?   r@   rA   rF   re   r   r   r   r   r0      s   
r0   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\   rF   r]   _clientsZ_finished_clients_max_clientsr^   r_   rV   r`   r%   Z
socketpair_s1_s2setblockingra   )r   rb   r-   rc   r    r"   r   r   r   rF      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)ri   filenosendr+   superr=   )r   )	__class__r   r   r=      s    
zTestThreadedServer.stopc          	   C   sF   z*| j  | j d |   W d Q R X W d | j  | j  X d S )Nr   )r_   rj   _runrh   r   ri   )r   r   r   r   re      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)rV   rf   rg   selectr_   rh   r^   ZacceptBlockingIOErrorr%   r    r*   _handle_clientrd   ra   r>   )r   rwxZconnr   r.   r   r   r   rp      s4    

zTestThreadedServer._runc             C   s   |  t| d S )N)r`   rD   )r   r-   r   r   r   rs     s    z!TestThreadedServer._handle_clientc             C   s
   | j  S )N)r_   Zgetsockname)r   r   r   r   r     s    zTestThreadedServer.addr)r?   r@   rA   rF   r=   re   rp   rs   propertyr   __classcell__r   r   )ro   r   r,      s   
	"r,   )r   Zasyncio.eventsrB   r7   r   rq   r%   r&   r[   r   rD   r\   rU   r0   r,   r   r   r   r   <module>   s   v(