
    z
g$                         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mZ  G d d          Z G d dej	                  Z
 G d d          Zd	 ZdS )
    N)CancelledErrorc                   B    e Zd ZdZdZddZd Zd Zd Zd	 Z	d
 Z
d ZdS )DaphneTestingInstancez
    Launches an instance of Daphne in a subprocess, with a host and port
    attribute allowing you to call it.

    Works as a context manager.
       FNc                 n    || _         || _        d| _        t          j                    | _        || _        d S )Nz	127.0.0.1)xffhttp_timeouthostmultiprocessingLocklockrequest_buffer_size)selfr   r	   r   s       @/var/www/html/env/lib/python3.11/site-packages/daphne/testing.py__init__zDaphneTestingInstance.__init__   s6    (	#(**	#6       c                    t                                            t                                            i }| j        r
| j        |d<   | j        rd|d<   d|d<   d|d<   | j        r
| j        |d<   t          | j        t          | j        	          || j	        | j
        
          | _        | j                                         | j        j                            | j                  r| j        j        j        | _        | S | j        j                                        rt)          d          | j        j                            d          \  }}t)          d|z            )Nr   zX-Forwarded-Forproxy_forwarded_address_headerzX-Forwarded-Portproxy_forwarded_port_headerzX-Forwarded-Protoproxy_forwarded_proto_headerr	   )r   )r
   applicationkwargssetupteardownz(Daphne did not start up, no error caughtFzDaphne did not start up:
%s)TestApplicationdelete_setupdelete_resultr   r   r	   DaphneProcessr
   r   process_setupprocess_teardownprocessstartreadywaitstartup_timeoutportvalueerrorsemptyRuntimeErrorget)r   r   error	tracebacks       r   	__enter__zDaphneTestingInstance.__enter__   sf   $$&&&%%'''# 	E,0,DF()8 	I7HF344FF015HF12 	7%)%6F>"$'TY777$*
 
 
 	<""4#788 	O)/DIK|"((** O"#MNNN#'<#6#:#:5#A#A y"#AI#MNNNr   c                 <    | j                                          | ` d S N)r!   	terminate)r   exc_type	exc_valuer-   s       r   __exit__zDaphneTestingInstance.__exit__>   s       LLLr   c                     dS )zF
        Called by the process just before it starts serving.
        N r   s    r   r   z#DaphneTestingInstance.process_setupC   	     	r   c                     dS )zC
        Called by the process just after it stops serving
        Nr6   r7   s    r   r    z&DaphneTestingInstance.process_teardownI   r8   r   c                     	 | j         5  t                                          }ddd           n# 1 swxY w Y   n# t          $ r t	          d          w xY wd|v r|d         |d         |d         fS )a$  
        Returns the scope and messages the test application has received
        so far. Note you'll get all messages since scope start, not just any
        new ones since the last call.

        Also checks for any exceptions in the application. If there are,
        raises them.
        NzNo results available yet.	exceptionscopemessages)r   r   load_resultFileNotFoundError
ValueError)r   inner_results     r   get_receivedz"DaphneTestingInstance.get_receivedO   s    	: = =.::<<= = = = = = = = = = = = = = =  	: 	: 	:8999	: ,&&{++G$l:&>>>s!   ; /; 3; 3; Ac                 <    t                               |           dS )z
        Adds messages for the application to send back.
        The next time it receives an incoming message, it will reply with these.
        )response_messagesN)r   
save_setup)r   r=   s     r   add_send_messagesz'DaphneTestingInstance.add_send_messagesb   s!    
 	""X">>>>>r   )FNN)__name__
__module____qualname____doc__r%   r   r.   r4   r   r    rB   rF   r6   r   r   r   r   
   s          O7 7 7 7!O !O !OF  
    ? ? ?&? ? ? ? ?r   r   c                   0     e Zd ZdZd fd	Zd Zd Z xZS )r   z
    Process subclass that launches and runs a Daphne instance, communicating the
    port it ends up listening on back to the parent process.
    Nc                 0   t                                                       || _        || _        |pi | _        |pd | _        |pd | _        t          j        d          | _	        t          j
                    | _        t          j                    | _        d S )Nc                      d S r0   r6   r6   r   r   <lambda>z(DaphneProcess.__init__.<locals>.<lambda>u   s    t r   c                      d S r0   r6   r6   r   r   rN   z(DaphneProcess.__init__.<locals>.<lambda>v   s    T r   i)superr   r
   r   r   r   r   r   Valuer&   Eventr#   Queuer(   )r   r
   r   r   r   r   	__class__s         r   r   zDaphneProcess.__init__p   s    	&l,||
 2\\#)#..	$*,,
%+--r   c                    t                       ddlm} ddlm} ddlm} 	  || j        d          } |d
| j        |dd| j	        | _        |
                    d	| j                   |                                  	 | j                                         |                                  d S # |                                  w xY w# t          $ r8}| j                            |t%          j                    f           Y d }~d S d }~ww xY w)Nr   reactor   )"build_endpoint_description_strings)Server)r
   r&   F)r   	endpointssignal_handlers皙?r6   )_reinstall_reactortwisted.internetrX   r\   rZ   serverr[   r
   r   r   	callLaterresolve_portr   runr   	Exceptionr(   putr-   
format_exc)r   rX   rZ   r[   r\   es         r   rd   zDaphneProcess.run{   sM   
 	,,,,,,AAAAAA""""""	9::	PQRRRI &  ,# %  +	 DK c4#4555JJLLL !!! 	9 	9 	9KOOQ	 4 6 67888888888	9s0   AC ?B. C .CC 
D	-DD	c                     ddl m} | j        j        r=| j        j        d         d         | j        _        | j                                         d S |                    d| j	                   d S )Nr   rW   rY   r^   )
r`   rX   ra   listening_addressesr&   r'   r#   setrb   rc   )r   rX   s     r   rc   zDaphneProcess.resolve_port   sp    ,,,,,,;* 	6"k=a@CDIOJNNc4#455555r   )NNN)rG   rH   rI   rJ   r   rd   rc   __classcell__)rU   s   @r   r   r   j   sf         
	. 	. 	. 	. 	. 	.9 9 9B6 6 6 6 6 6 6r   r   c                   X   e Zd ZdZej                             ej                    d          Z	ej                             ej                    d          Z
d Zd Zed             Zed             Zed             Zed	             Zed
             Zed             Zed             ZdS )r   zz
    An application that receives one or more messages, sends a response,
    and then quits the server. For testing.
    zsetup.testiozresult.testioc                 "    || _         g | _        d S r0   )r   r=   )r   r   s     r   r   zTestApplication.__init__   s    	r   c                   K   || _         t          j        d           	 	 | j                             |             d {V            | j                                         t          j        d| j        d                    |                     | j         | j                   | j                                         | 	                                }| 
                                 |d         D ](} ||           d {V  t          j        d|           )# t          $ r6}t          |t                    r |                     |           Y d }~d S d }~ww xY w)Nztest app coroutine aliveTztest app received %rrD   ztest app sent %r)r<   loggingdebugr=   appendr   acquiresave_resultrelease
load_setupr   re   
isinstancer   save_exception)r   r<   receivesendr   messagerh   s          r   __call__zTestApplication.__call__   sy     
0111	'?$$7799______555	!!###4dmB6GHHH  T];;;	!!###))!!###$%89 ? ?G$w--'''''''M"4g>>>>?  	' 	' 	'!^,, '##A&&&&&&&&&	's   C5D 
E+EEc                     t          | j        d          5 }t          j        d|i|           ddd           dS # 1 swxY w Y   dS )z+
        Stores setup information.
        wbrD   N)opensetup_storagepickledump)clsrD   fhs      r   rE   zTestApplication.save_setup   s    
 ##T** 	FbK,.?@"EEE	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F   ;??c                     	 t          | j        d          5 }t          j        |          cddd           S # 1 swxY w Y   dS # t          $ r dg icY S w xY w)z(
        Returns setup details.
        rbNrD   )r   r   r   loadr?   r   r   s     r   rw   zTestApplication.load_setup   s    
	-c'.. '"{2' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '  	- 	- 	-',,,,	-s-   A 8A <A < A AAc                     t          | j        d          5 }t          j        ||d|           ddd           dS # 1 swxY w Y   dS )
        Saves details of what happened to the result storage.
        We could use pickle here, but that seems wrong, still, somehow.
        r   )r<   r=   Nr   result_storager   r   )r   r<   r=   r   s       r   ru   zTestApplication.save_result   s     #$d++ 	DrK%X>>CCC	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	Ds   <A A c                     t          | j        d          5 }t          j        d|i|           ddd           dS # 1 swxY w Y   dS )r   r   r;   Nr   )r   r;   r   s      r   ry   zTestApplication.save_exception   s     #$d++ 	6rKi0"555	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6r   c                     t          | j        d          5 }t          j        |          cddd           S # 1 swxY w Y   dS )z)
        Returns result details.
        r   N)r   r   r   r   r   s     r   r>   zTestApplication.load_result   s    
 #$d++ 	#r;r??	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	#s   7;;c                 \    	 t          j        | j                   dS # t          $ r Y dS w xY w)z-
        Clears setup storage files.
        N)osunlinkr   OSErrorr   s    r   r   zTestApplication.delete_setup   sB    
	Ic'((((( 	 	 	DD	    
++c                 \    	 t          j        | j                   dS # t          $ r Y dS w xY w)z.
        Clears result storage files.
        N)r   r   r   r   r   s    r   r   zTestApplication.delete_result  sB    
	Ic())))) 	 	 	DD	r   N)rG   rH   rI   rJ   r   pathjointempfile
gettempdirr   r   r   r}   classmethodrE   rw   ru   ry   r>   r   r   r6   r   r   r   r      sC        
 GLL!4!4!6!6GGMW\\"5("5"7"7IIN  ' ' '2 F F [F - - [- D D [D 6 6 [6 # # [#   [   [  r   r   c                      dd l } dd l}ddlm} d|j        v r|j        d= d|j        v r|j        d= |                                 }|                    |           |                     |           d S )Nr   )asyncioreactorztwisted.internet.reactorzdaphne.server)asynciosysr`   r   modulesnew_event_loopinstallset_event_loop)r   r   r   
event_loops       r   r_   r_     s    NNNJJJ////// "S[00K23
 #+%%K(''))J:&&&:&&&&&r   )rq   r   r   r   r   r-   concurrent.futuresr   r   Processr   r   r_   r6   r   r   <module>r      s         				       - - - - - -]? ]? ]? ]? ]? ]? ]? ]?@96 96 96 96 96O+ 96 96 96xe e e e e e e eP' ' ' ' 'r   