U
    Z+d                  	   @   s   d 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
 dddhd	d
ddddZG dd dZG dd dee	jZddddeddfddZedd ZedddZdS )z-Create Celery app instances used for testing.    N)contextmanager)deepcopy)symbol_by_name)Celery_stateFjsonTUTCz	memory://zcache+memory://)Zworker_hijack_root_loggerZworker_log_colorZaccept_contentZ
enable_utctimezone
broker_urlresult_backendZbroker_heartbeatc                   @   s   e Zd ZdZdd ZdS )TrapzTrap that pretends to be an app but raises an exception instead.

    This to protect from code that does not properly pass app instances,
    then falls back to the current_app.
    c                 C   s(   |dks|dkrd S t | tdd S )NZ_is_coroutine__func__zTest depends on current_app)printRuntimeError)selfname r   >/tmp/pip-unpacked-wheel-ucduq0nd/celery/contrib/testing/app.py__getattr__   s    zTrap.__getattr__N)__name__
__module____qualname____doc__r   r   r   r   r   r      s   r   c                       s    e Zd ZdZ fddZ  ZS )UnitLoggingz)Sets up logging for the test application.c                    s   t  j|| d| _d S )NT)super__init__Zalready_setup)r   argskwargs	__class__r   r   r   *   s    zUnitLogging.__init__)r   r   r   r   r   __classcell__r   r   r   r   r   '   s   r   c           
      K   s   ddl m} tttf|pi }|dk	r4|dd |dk	rH|dd |rPdn|}t| p\df||||d|}	|	| |	S )zApp used for testing.   )tasksNr
   r   zcelery.tests)set_as_currentlogbrokerbackend) r"   dictr   DEFAULT_TEST_CONFIGpopr   Zadd_defaults)
r   configZenable_loggingr#   r$   r&   r%   r   r"   Ztest_appr   r   r   TestApp/   s&    
r,   c                 #   s@   t   tj}t  G  fddd}| t_dV  |t_dS )zContextmanager that installs the trap app.

    The trap means that anything trying to use the current or default app
    will raise an exception.
    c                       s   e Zd Z ZdS )zset_trap.<locals>.NonTLSN)r   r   r   current_appr   Ztrapr   r   NonTLSO   s   r/   N)r   r   _tlsset_default_app)appZprev_tlsr/   r   r.   r   set_trapD   s    
r3   c              	   c   s|   t  }t j}tt j}tt j}|rDt|  dV  W 5 Q R X ndV  t 	| |t j
_| |k	rl|   |t _|t _dS )zWSetup default app for testing.

    Ensures state is clean after the test returns.
    N)r   Zget_current_appZdefault_appsetZ_on_app_finalizersweakrefWeakSetZ_appsr3   r1   r0   r-   close)r2   Zuse_trapZprev_current_appZprev_default_appZprev_finalizersZ	prev_appsr   r   r   setup_default_appW   s    


r8   )F)r   r5   
contextlibr   copyr   Zkombu.utils.importsr   Zceleryr   r   r)   r   Zlog_clsr   r,   r3   r8   r   r   r   r   <module>   s2     

