a
    xd                     @   s   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
 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 dZeeddZG dd deZG dd dZG dd deZdS )zIntegration testing utilities.    N)defaultdict)partial)countretry_over_timestates)TimeoutError)	ResultSet)truncate)humanize_secondsz4Still waiting for {0}.  Trying again {when}: {exc!r}T)microsecondsc                   @   s   e Zd ZdZdS )SentinelzSignifies the end of something.N)__name__
__module____qualname____doc__ r   r   V/var/www/html/Ranjet/env/lib/python3.9/site-packages/celery/contrib/testing/manager.pyr      s   r   c                	   @   s   e Zd ZdZd;ddZd<dd	Zd
d Zd=ddZd>ddZdd Z	d?ddZ
d@ddZdAd d!ZdBd"d#ZdCd%d&ZdDd(d)ZdEd+d,ZdFd-d.Zed/d0 ZdGd1d2Zd3d4 Zd5d6 ZdHd7d8Zd9d: ZdS )IManagerMixinz.Mixin that adds :class:`Manager` capabilities.      @FNc                 C   sF   |d u rt jn|| _|d u r"t jn|| _| j j| _|| _|| _d S N)	sysstdoutstderrapp
connectionZrecoverable_connection_errors
connerrorsblock_timeoutno_join)selfr   r   r   r   r   r   r   _init_manager   s
    zManagerMixin._init_manager-c                 C   s   t | | | jd d S )N)file)printr   )r    ssepr   r   r   remark&   s    zManagerMixin.remarkc                 C   s   dd |D S )Nc                 S   s    g | ]}|j |jjvr|j qS r   )idbackend_cache).0resr   r   r   
<listcomp>,       z0ManagerMixin.missing_results.<locals>.<listcomp>r   )r    rr   r   r   missing_results*   s    zManagerMixin.missing_resultsthingr   
   皙?      ?      @c              	      s@   |si n|} fd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                    s>   t |}r*tj t|dd| d r:| || |S )Nin )whenexc)nextwarnE_STILL_WAITINGformatr   )r9   Z	intervalsretriesintervaldescemit_warningerrbackr    r   r   on_errorE   s    z'ManagerMixin.wait_for.<locals>.on_error)argskwargsrC   max_retriesinterval_startinterval_stepr   )r    funcatchrA   rE   rF   rC   rG   rH   rI   interval_maxrB   optionsrD   r   r@   r   wait_for.   s    
zManagerMixin.wait_for   {Gz?      ?c	           
   
   K   sB   z| j ||||||||dW S  |y.   Y n0 td| dS )z;Make sure something does not happen (at least for a while).)rA   rG   rH   rI   rL   rB   zShould not have happened: N)rN   AssertionError)
r    rJ   rK   rA   rG   rH   rI   rL   rB   rM   r   r   r   ensure_not_for_a_whileW   s    z#ManagerMixin.ensure_not_for_a_whilec                 O   s   t |i |S r   r   )r    rE   rF   r   r   r   r   h   s    zManagerMixin.retry_over_timec           	         s   | j r
d S t|ts"| j|g}g   fdd}|r>t|ntdD ]}g  d d < z|jf ||d|W   S  tjt	fy } zH| 
|}| dt|t  t|td||d W Y d }~qFd }~0  | jy } z| d|d W Y d }~qFd }~0 0 qFtd	d S )
Nc                    s     |  d S r   )append)task_idvalueZreceivedr   r   	on_resultr   s    z$ManagerMixin.join.<locals>.on_resultr   )callback	propagatez#Still waiting for {}/{}: [{}]: {!r}z, !zjoin: connection lost: z!Test failed: Missing task results)r   
isinstancer
   r   ranger   getsockettimeoutr	   r0   r'   r=   lenr   joinr   rR   )	r    r/   rZ   rG   rF   rX   ir9   Zwaiting_forr   rW   r   rb   k   s,    

*zManagerMixin.join      @c                 C   s   | j jj|dS Nr`   )r   controlinspect)r    r`   r   r   r   rh      s    zManagerMixin.inspectc                 c   s&   |  |j| pi }| E d H  d S r   )rh   Z
query_taskitems)r    idsr`   Ztasksr   r   r   query_tasks   s    zManagerMixin.query_tasksc           	      C   sH   t t}| j||dD ],\}}| D ]\}\}}|| | q&q|S re   )r   setrk   ri   add)	r    rj   r`   r   hostnameZreplyrU   state_r   r   r   query_task_states   s
    zManagerMixin.query_task_states waiting for tasks to be acceptedc                 K   s   | j | j|f||d|S N)r?   rA   assert_task_worker_stateis_acceptedr    rj   r?   rA   policyr   r   r   assert_accepted   s    zManagerMixin.assert_accepted waiting for tasks to be receivedc                 K   s   | j | j|f||d|S rs   rt   rw   r   r   r   assert_received   s    zManagerMixin.assert_received,waiting for tasks to be started or completedc                 K   s   | j | j|f||d|S rs   )assert_task_state_from_resultis_result_task_in_progress)r    Zasync_resultsr?   rA   rx   r   r   r   ,assert_result_tasks_in_progress_or_completed   s    z9ManagerMixin.assert_result_tasks_in_progress_or_completedc                 K   s$   | j t| j|||dtffi |S re   rN   r   true_or_raiser   )r    rJ   resultsr?   rx   r   r   r   r}      s    z*ManagerMixin.assert_task_state_from_resultc                    s"   t jt jf t fdd| D S )Nc                 3   s   | ]}|j  v V  qd S r   )ro   )r+   resultZpossible_statesr   r   	<genexpr>   r.   z:ManagerMixin.is_result_task_in_progress.<locals>.<genexpr>)r   ZSTARTEDSUCCESSall)r   rF   r   r   r   r~      s    z'ManagerMixin.is_result_task_in_progressc                 K   s$   | j t| j|||dtffi |S re   r   )r    rJ   rj   r?   rx   r   r   r   ru      s    z%ManagerMixin.assert_task_worker_statec                 K   s   | j g d|fi |S )N)reservedactiveready_ids_matches_stater    rj   rF   r   r   r   is_received   s
    zManagerMixin.is_receivedc                 K   s   | j ddg|fi |S )Nr   r   r   r   r   r   r   rv      s    zManagerMixin.is_acceptedc                    s&   | j ||dt fdd|D S )Nrf   c                 3   s2   | ]* t  fd dfddD D V  qdS )c                 3   s   | ]} |v V  qd S r   r   )r+   r%   tr   r   r      r.   z<ManagerMixin._ids_matches_state.<locals>.<genexpr>.<genexpr>c                    s   g | ]} | qS r   r   )r+   kr   r   r   r-      r.   z=ManagerMixin._ids_matches_state.<locals>.<genexpr>.<listcomp>N)any)r+   expected_statesr   r   r   r      s   z2ManagerMixin._ids_matches_state.<locals>.<genexpr>)rq   r   )r    r   rj   r`   r   r   r   r      s    zManagerMixin._ids_matches_statec                 O   s   ||i |}|st  |S r   )r   )r    rJ   rE   rF   r,   r   r   r   r      s    zManagerMixin.true_or_raise)r   FNN)r"   )	r1   r   NNr2   r3   r4   r5   F)r1   rO   r3   rP   rQ   F)Fr2   )rd   )r4   )r4   )r4   rr   )r4   rz   )r4   r|   )r4   )r4   )r4   )r   r   r   r   r!   r'   r0   rN   rS   r   rb   rh   rk   rq   ry   r{   r   r}   staticmethodr~   ru   r   rv   r   r   r   r   r   r   r      sV     


         
*   




  
  
	  
 



r   c                   @   s   e Zd ZdZdd ZdS )Managerz(Test helpers for task integration tests.c                 K   s   || _ | jf i | d S r   )r   r!   )r    r   rF   r   r   r   __init__   s    zManager.__init__N)r   r   r   r   r   r   r   r   r   r      s   r   )r   r_   r   collectionsr   	functoolsr   	itertoolsr   Zkombu.utils.functionalr   Zceleryr   Zcelery.exceptionsr	   Zcelery.resultr
   Zcelery.utils.textr   Zcelery.utils.timer   Z_humanize_secondsr<   	Exceptionr   r   r   r   r   r   r   <module>   s"    :