
    h!                        d Z ddlZddlZddlmZ ddlmZ ddlmZ ddl	m
Z
mZmZmZmZmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZmZ ddlmZ ddlmZ dZ  eed      Z G d de!      Z" G d d      Z# G d de#      Z$y)zIntegration testing utilities.    N)defaultdict)partial)count)AnyCallableDictSequenceTextIOTuple)ContentDisallowedretry_over_time)states)TimeoutError)AsyncResult	ResultSet)truncate)humanize_secondsz4Still waiting for {0}.  Trying again {when}: {exc!r}T)microsecondsc                       e Zd ZdZy)SentinelzSignifies the end of something.N)__name__
__module____qualname____doc__     Z/var/www/Befach/backend/env/lib/python3.12/site-packages/celery/contrib/testing/manager.pyr   r      s    )r   r   c                       e Zd ZdZ	 	 ddZddZd Z	 	 	 	 	 	 	 	 	 ddZ	 	 	 ddZd Z	dd	Z
dd
ZddZddZ	 	 ddZ	 	 d dZ	 	 d!dZ	 ddZed        ZddZd Zd ZddZd Zd Zy)"ManagerMixinz.Mixin that adds :class:`Manager` capabilities.Nc                     |t         j                  n|| _        |t         j                  n|| _        | j                  j	                         j
                  | _        || _        || _        y N)	sysstdoutstderrapp
connectionrecoverable_connection_errors
connerrorsblock_timeoutno_join)selfr*   r+   r$   r%   s        r   _init_managerzManagerMixin._init_manager   sO     %+Ncjj$*Ncjj((--/MM*r   c                 :    t        | | | j                         y )N)file)printr$   )r,   sseps      r   remarkzManagerMixin.remark(   s    aSk,r   c                     |D cg c]1  }|j                   |j                  j                  vs&|j                   3 c}S c c}w r"   )idbackend_cache)r,   rress      r   missing_resultszManagerMixin.missing_results,   s/    "#H3svvS[[5G5G'GHHHs   '>>c           
      \     |si n|} fd}  j                   ||f||||||	d|S )zWait for event to happen.

        The `catch` argument specifies the exception that means the event
        has not happened yet.
        c           
          t        |      }r2j                  t        j                  t	        |dd      |              r
 | ||       |S )Nin )whenexc)nextwarnE_STILL_WAITINGformatr   )r@   	intervalsretriesintervaldescemit_warningerrbackr,   s       r   on_errorz'ManagerMixin.wait_for.<locals>.on_errorG   sT    IH		/00/$D# 1   Xw/Or   )argskwargsrJ   max_retriesinterval_startinterval_stepr   )r,   funcatchrH   rL   rM   rJ   rN   rO   rP   interval_maxrI   optionsrK   s   `  `  `    `  r   wait_forzManagerMixin.wait_for0   sM    * "v	 $t##
f+)	

 
 	
r   c	           
      L    	 | j                  ||||||||      S # |$ r Y yw xY w)z;Make sure something does not happen (at least for a while).)rH   rN   rO   rP   rS   rI   N)rU   AssertionError)
r,   rQ   rR   rH   rN   rO   rP   rS   rI   rT   s
             r   ensure_not_for_a_whilez#ManagerMixin.ensure_not_for_a_whileY   sE    		F==U;-]) !  
  		s    ##c                     t        |i |S r"   r   )r,   rL   rM   s      r   r   zManagerMixin.retry_over_timej   s    ///r   c                   	 | j                   ry t        |t              s| j                  j                  |g      }g 		fd}|rt	        |      n
t        d      D ]  }g 	d d  	  |j                  d	||d|c S  t#        d      # t        j                  t        f$ ru}| j                  |      }| j                  dj                  t        |      t        	      z
  t        |      t        dj                  |            |      d       Y d }~d }~w| j                   $ r}| j                  d|d       Y d }~d }~ww xY w)
Nc                 (    j                  |        y r"   )append)task_idvaluereceiveds     r   	on_resultz$ManagerMixin.join.<locals>.on_resultt   s    OOG$r   r   )callback	propagatez#Still waiting for {}/{}: [{}]: {!r}z, !zjoin: connection lost: z!Test failed: Missing task resultsr   )r+   
isinstancer   r&   ranger   getsockettimeoutr   r:   r3   rD   lenr   joinr)   rW   )
r,   r8   rb   rN   rM   r`   ir@   waiting_forr_   s
            @r   rj   zManagerMixin.joinm   s,   <<!Y'""A3'A	% (3{#a@AHQK
DquuOi9OOO A @AA NNL1 "22159@@AX.A ;!78#?@C 
 ?? D5cW=sCCDs%   #BE A+DE !D;;E c                 N    | j                   j                  j                  |      S Nrh   )r&   controlinspect)r,   rh   s     r   rq   zManagerMixin.inspect   s     xx'''88r   c              #      K    | j                  |      j                  | xs i }|j                         E d {    y 7 wr"   )rq   
query_taskitems)r,   idsrh   taskss       r   query_taskszManagerMixin.query_tasks   s5     0W%00#6<";;=  s   6A >A c                     t        t              }| j                  ||      D ]4  \  }}|j                         D ]  \  }\  }}||   j	                  |        6 |S rn   )r   setrw   rt   add)	r,   ru   rh   r   hostnamereplyr]   state_s	            r   query_task_stateszManagerMixin.query_task_states   s]    S!#//W/EOHe',{{}#%u!!'* (5  F r   c                 D     | j                   | j                  |f||d|S N)rG   rH   )assert_task_worker_stateis_acceptedr,   ru   rG   rH   policys        r   assert_acceptedzManagerMixin.assert_accepted   4    ,t,,c
,44
CI
 	
r   c                 D     | j                   | j                  |f||d|S r   )r   is_receivedr   s        r   assert_receivedzManagerMixin.assert_received   r   r   c                 D     | j                   | j                  |f||d|S r   )assert_task_state_from_resultis_result_task_in_progress)r,   async_resultsrG   rH   r   s        r   ,assert_result_tasks_in_progress_or_completedz9ManagerMixin.assert_result_tasks_in_progress_or_completed   s;     2t11++
 D
 -3
 	
r   c                 b     | j                   t        | j                  |||      t        ffi |S rn   rU   r   true_or_raiser   )r,   rQ   resultsrG   r   s        r   r   z*ManagerMixin.assert_task_state_from_result   s6    t}}D&&WhGK
!
 	
r   c                 l    t         j                  t         j                  ft        fd| D              S )Nc              3   :   K   | ]  }|j                   v   y wr"   )r}   ).0resultpossible_statess     r   	<genexpr>z:ManagerMixin.is_result_task_in_progress.<locals>.<genexpr>   s     Iv6<<?2Is   )r   STARTEDSUCCESSall)r   rM   r   s     @r   r   z'ManagerMixin.is_result_task_in_progress   s&    !>>6>>:IIIIr   c                 b     | j                   t        | j                  |||      t        ffi |S rn   r   )r,   rQ   ru   rG   r   s        r   r   z%ManagerMixin.assert_task_worker_state   s6    t}}D&&S(CK
!
 	
r   c                 .     | j                   g d|fi |S )N)reservedactiveready_ids_matches_stater,   ru   rM   s      r   r   zManagerMixin.is_received   s$    &t&&+S<4:< 	<r   c                 .     | j                   ddg|fi |S )Nr   r   r   r   s      r   r   zManagerMixin.is_accepted   s!    &t&&'':CJ6JJr   c                 V    | j                  ||      t        fd|D              S )Nro   c           	   3   t   K   | ])  t        fd D cg c]  }|   	 c}D               + yc c}w w)c              3   &   K   | ]  }|v  
 y wr"   r   )r   r1   ts     r   r   z<ManagerMixin._ids_matches_state.<locals>.<genexpr>.<genexpr>   s     E1QEs   N)any)r   kr   expected_statesr   s     @r   r   z2ManagerMixin._ids_matches_state.<locals>.<genexpr>   s6      
 EO Dq DEE
 Ds   838)r   r   )r,   r   ru   rh   r   s    `  @r   r   zManagerMixin._ids_matches_state   s2    ''W'= 

 
 	
r   c                 .     ||i |}|s
t               |S r"   )r   )r,   rQ   rL   rM   r9   s        r   r   zManagerMixin.true_or_raise   s!    4"6"*
r   c                 |   | j                   j                  }| j                   j                         5 }	 |j                  |      }|dk(  rn|j	                         }||_        	 	 t        d |j                         j                         D              }|dk(  rn6d d d        y # t        $ r Y w xY w# 1 sw Y   y xY w)N)r'   r   c              3   2   K   | ]  }t        |        y wr"   )ri   )r   r   s     r   r   z/ManagerMixin.wait_until_idle.<locals>.<genexpr>   s     J1AJs   )	r&   rp   r'   purgerq   sumr   valuesr   )r,   rp   r'   r   rq   s        r   wait_until_idlezManagerMixin.wait_until_idle   s    ((""XX  " 	j <A:  oo'G!+GJ0@0G0G0IJJE A: 	 	 ) 	 	s/   3B2%.B#B2#	B/,B2.B//B22B;)g      @FNN)-)	thingr   NN
   皙?      ?g      @F)r      r   g{Gz?g      ?F)Fr   )g      @)r   )r   z waiting for tasks to be accepted)r   z waiting for tasks to be received)r   z,waiting for tasks to be started or completed)r   r   r   r   r-   r3   r:   rU   rX   r   rj   rq   rw   r   r   r   r   r   staticmethodr   r   r   r   r   r   r   r   r   r   r    r       s    8 8=*.-I '
T :<AE>CF"0B29! -0?
 -0?
 ?	
 03
 J J
<K
r   r    c                       e Zd ZdZd Zy)Managerz(Test helpers for task integration tests.c                 6    || _          | j                  di | y )Nr   )r&   r-   )r,   r&   rM   s      r   __init__zManager.__init__   s    $V$r   N)r   r   r   r   r   r   r   r   r   r      s
    2%r   r   )%r   rg   r#   collectionsr   	functoolsr   	itertoolsr   typingr   r   r   r	   r
   r   kombu.exceptionsr   kombu.utils.functionalr   celeryr   celery.exceptionsr   celery.resultr   r   celery.utils.textr   celery.utils.timer   _humanize_secondsrC   	Exceptionr   r    r   r   r   r   <module>r      sj    $  
 #   ? ? . 2  * 0 & CH,4@ *y *L L^%l %r   