a
    ŪEb/  ć                   @   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 ” | _t ” | _t |  || jj| jj	””| _
d S ©N)r   ŚapplicationŚscopeŚasyncioŚQueueŚinput_queueŚoutput_queueŚensure_futureŚgetŚputŚfuture)Śselfr   r   © r   śO/home/ja/django-apps/lartica_env/lib/python3.9/site-packages/asgiref/testing.pyŚ__init__   s    


’z ApplicationCommunicator.__init__r   c                 Ć   sģ   zŖt |4 I dH F z| jI dH  | j ”  W n tjyB   Y n0 W d  I dH  qn1 I dH sd0    Y  W | j ” sč| j ”  z| jI dH  W qč tjyØ   Y qč0 n<| j ” sę| j ”  z| jI dH  W n tjyä   Y n0 0 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&    2

ū

zApplicationCommunicator.waitTc                 C   s(   | j  ” s| j  ”  n|r$| j  ”  d S r   )r   r   r   r   )r   Ś
exceptionsr   r   r   Śstop*   s    
zApplicationCommunicator.stopc                 C   s(   z| j dd W n ty"   Y n0 d S )NF)r   )r   ŚRuntimeError)r   r   r   r   Ś__del__1   s    zApplicationCommunicator.__del__c                 Ć   s   | 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  ” r| j  ”  zRt|4 I dH ( | j ” I dH W  d  I dH  W S 1 I dH sZ0    Y  W np tjyÖ } zV| j  ” r| j  ”  n0| j  ”  z| j I dH  W n tj	y¼   Y n0 |W Y d}~n
d}~0 0 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ē¹?ē{®Gįz?c                 Ć   sB   t  ” }t  ” | |k r8| j ” s&dS t |”I dH  q| 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&   Ścompatibilityr   r   r   r   r   r   r   r   Ś<module>   s   