3
g/                 @   s:   d dl Z d dlZddlmZ ddlmZ G dd dZdS )    N   )guarantee_single_callable)timeoutc               @   sP   e Zd ZdZdd ZdddZddd	Zd
d Zdd ZdddZ	dddZ
dS )ApplicationCommunicatorz}
    Runs an ASGI application in a test mode, allowing sending of
    messages to it and retrieval of messages it sends.
    c             C   sF   t || _|| _tj | _tj | _tj| j|| jj| jj	| _
d S )N)r   applicationscopeasyncioQueueinput_queueoutput_queueensure_futuregetputfuture)selfr   r    r   M/var/www/tester-filtro-web/env/lib/python3.6/site-packages/asgiref/testing.py__init__   s    


z ApplicationCommunicator.__init__r   c          !      s   zXt |4 I dH 8 y| jI dH  | jj  W n tjk
rD   Y nX W dQ I dH R X W d| jj s| jj  y| jI dH  W n tjk
r   Y nX X dS )zV
        Waits for the application to stop itself and returns any exceptions.
        N)async_timeoutr   resultr   CancelledErrordonecancel)r   r   r   r   r   wait   s    

zApplicationCommunicator.waitTc             C   s(   | j j s| j j  n|r$| j j  d S )N)r   r   r   r   )r   
exceptionsr   r   r   stop*   s    
zApplicationCommunicator.stopc             C   s*   y| j dd W n tk
r$   Y nX d S )NF)r   )r   RuntimeError)r   r   r   r   __del__1   s    zApplicationCommunicator.__del__c                s   | j j|I dH  dS )z;
        Sends a single message to the application
        N)r
   r   )r   messager   r   r   
send_input9   s    z"ApplicationCommunicator.send_inputc                s   | j j r| j j  y2t|4 I dH  | jj I dH S Q I dH R X W np tjk
r } zR| j j rp| j j  n2| j j  y| j I dH  W n tj	k
r   Y nX |W Y dd}~X nX dS )zX
        Receives a single message from the application, with optional timeout.
        N)
r   r   r   r   r   r   r   TimeoutErrorr   r   )r   r   er   r   r   receive_output@   s    

 

z&ApplicationCommunicator.receive_output皙?{Gz?c                sF   t j }x2t j | |k r:| jj s(dS tj|I dH  q
W | jj S )zO
        Checks that there is no message to receive in the given time.
        FN)time	monotonicr   emptyr   sleep)r   r   intervalstartr   r   r   receive_nothingW   s    
z'ApplicationCommunicator.receive_nothingN)r   )T)r   )r#   r$   )__name__
__module____qualname____doc__r   r   r   r   r   r"   r+   r   r   r   r   r      s   	


r   )r   r%   Zcompatibilityr   r   r   r   r   r   r   r   <module>   s   