U
    ª€lj*  ã                   @   sŠ   d Z ddl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 G dd„ dejƒZdS )z-
Test cases for L{twisted.logger._observer}.
é    )ÚDictÚListÚTupleÚcast)Úimplementer)ÚBrokenMethodImplementation)ÚverifyObject)Úunittesté   )ÚILogObserverÚLogEvent)ÚLogger)ÚLogPublisherc                   @   sœ   e Zd ZdZddœdd„Zddœdd„Zddœdd	„Zddœd
d„Zddœdd„Zddœdd„Z	ddœdd„Z
ddœdd„Zddœdd„Zddœdd„ZdS )ÚLogPublisherTestsz$
    Tests for L{LogPublisher}.
    N)Úreturnc              
   C   sF   t ƒ }ztt|ƒ W n, tk
r@ } z|  |¡ W 5 d}~X Y nX dS )z8
        L{LogPublisher} is an L{ILogObserver}.
        N)r   r   r   r   Zfail)ÚselfÚ	publisherÚe© r   úE/tmp/pip-unpacked-wheel-aghyhbke/twisted/logger/test/test_observer.pyÚtest_interface   s
    z LogPublisherTests.test_interfacec                 C   s@   t tdd„ ƒ}t tdd„ ƒ}t||ƒ}|  ||ht|jƒ¡ dS )zB
        L{LogPublisher.observers} returns the observers.
        c                 S   s   d S ©Nr   ©r   r   r   r   Ú<lambda>'   ó    z2LogPublisherTests.test_observers.<locals>.<lambda>c                 S   s   d S r   r   r   r   r   r   r   (   r   N)r   r   r   ÚassertEqualÚsetÚ
_observers)r   Úo1Úo2r   r   r   r   Útest_observers#   s    
z LogPublisherTests.test_observersc                 C   sZ   t tdd„ ƒ}t tdd„ ƒ}t tdd„ ƒ}t||ƒ}| |¡ |  |||ht|jƒ¡ dS )z?
        L{LogPublisher.addObserver} adds an observer.
        c                 S   s   d S r   r   r   r   r   r   r   1   r   z4LogPublisherTests.test_addObserver.<locals>.<lambda>c                 S   s   d S r   r   r   r   r   r   r   2   r   c                 S   s   d S r   r   r   r   r   r   r   3   r   N)r   r   r   ÚaddObserverr   r   r   ©r   r   r   Úo3r   r   r   r   Útest_addObserver-   s    

z"LogPublisherTests.test_addObserverc                 C   s   t ƒ }|  t|jtƒ ¡ dS )ze
        L{LogPublisher.addObserver} refuses to add an observer that's
        not callable.
        N)r   ÚassertRaisesÚ	TypeErrorr!   Úobject)r   r   r   r   r   Útest_addObserverNotCallable9   s    z-LogPublisherTests.test_addObserverNotCallablec                 C   sZ   t tdd„ ƒ}t tdd„ ƒ}t tdd„ ƒ}t|||ƒ}| |¡ |  ||ht|jƒ¡ dS )zE
        L{LogPublisher.removeObserver} removes an observer.
        c                 S   s   d S r   r   r   r   r   r   r   E   r   z7LogPublisherTests.test_removeObserver.<locals>.<lambda>c                 S   s   d S r   r   r   r   r   r   r   F   r   c                 S   s   d S r   r   r   r   r   r   r   G   r   N©r   r   r   ZremoveObserverr   r   r   r"   r   r   r   Útest_removeObserverA   s    
z%LogPublisherTests.test_removeObserverc                 C   sX   t tdd„ ƒ}t tdd„ ƒ}t tdd„ ƒ}t||ƒ}| |¡ |  ||ht|jƒ¡ dS )zd
        L{LogPublisher.removeObserver} removes an observer that is not
        registered.
        c                 S   s   d S r   r   r   r   r   r   r   R   r   zDLogPublisherTests.test_removeObserverNotRegistered.<locals>.<lambda>c                 S   s   d S r   r   r   r   r   r   r   S   r   c                 S   s   d S r   r   r   r   r   r   r   T   r   Nr)   r"   r   r   r   Ú test_removeObserverNotRegisteredM   s    

z2LogPublisherTests.test_removeObserverNotRegisteredc           	      C   sx   t ddd�}g }g }g }tt|jƒ}tt|jƒ}tt|jƒ}t|||ƒ}||ƒ |  ||¡ |  ||¡ |  ||¡ dS )z6
        L{LogPublisher} calls its observers.
        é   r
   ©ÚfooÚbarN)Údictr   r   Úappendr   ÚassertIn)	r   ÚeventZevents1Zevents2Zevents3r   r   r#   r   r   r   r   Útest_fanOutZ   s    zLogPublisherTests.test_fanOutc                    s¤   t ddd�}tdƒ‰g ‰ ttƒtddœ‡ ‡fdd„ƒ}g }t|tt|jƒƒ}||ƒ |  |ˆ ¡ d	d
„ |D ƒ}|  	t
|ƒd¡ |  |d jˆ¡ |  	t
ˆ ƒd¡ dS )z}
        Observer raises an exception during fan out: a failure is logged, but
        not re-raised.  Life goes on.
        r,   r
   r-   úARGH! EVIL DEATH!N©r3   r   c                    s   ˆ  }ˆ   | ¡ |rˆ‚d S r   )r1   )r3   ZshouldRaise©ÚeventsÚ	exceptionr   r   Úobserverx   s    
z7LogPublisherTests.test_observerRaises.<locals>.observerc                 S   s   g | ]}d |kr|d  ‘qS )Zlog_failurer   )Ú.0r   r   r   r   Ú
<listcomp>ˆ   s      z9LogPublisherTests.test_observerRaises.<locals>.<listcomp>r   )r0   ÚRuntimeErrorr   r   r   r   r   r1   r2   r   ÚlenZassertIsÚvalue)r   r3   r:   Ú	collectorr   Úerrorsr   r7   r   Útest_observerRaisesn   s    z%LogPublisherTests.test_observerRaisesc                    s\   t ddd�}tdƒ‰ ttƒtddœdd„ƒ}G ‡ fd	d
„d
tƒ}t|ƒ}|ƒ |_||ƒ dS )zÂ
        Observer raises an exception during fan out and the publisher's Logger
        pukes when the failure is reported.  The exception does not propagate
        back to the caller.
        r,   r
   r-   r5   Nr6   c                 S   s   t dƒ‚d S )Nz	Sad panda)r=   )r3   r   r   r   r:   —   s    zGLogPublisherTests.test_observerRaisesAndLoggerHatesMe.<locals>.observerc                       s"   e Zd Zeeddœ‡ fdd„ZdS )zILogPublisherTests.test_observerRaisesAndLoggerHatesMe.<locals>.GurkLoggerN)ÚargsÚkwargsr   c                    s   ˆ ‚d S r   r   )r   rC   rD   ©r9   r   r   Úfailureœ   s    zQLogPublisherTests.test_observerRaisesAndLoggerHatesMe.<locals>.GurkLogger.failure)Ú__name__Ú
__module__Ú__qualname__r'   rF   r   rE   r   r   Ú
GurkLogger›   s   rJ   )r0   r=   r   r   r   r   r   Úlog)r   r3   r:   rJ   r   r   rE   r   Ú#test_observerRaisesAndLoggerHatesMeŽ   s    z5LogPublisherTests.test_observerRaisesAndLoggerHatesMec                    s’   t ddg d�}i ‰ ttƒtddœ‡ fdd„ƒ}ttƒtddœ‡ fdd	„ƒ}t||ƒ}||ƒ |  ˆ d ||ff¡ |  ˆ d ||f||ff¡ dS )
zA
        Tracing keeps track of forwarding to observers.
        r,   r
   )r.   r/   Ú	log_traceN)r   r   c                    s*   ˆ   dtttttf  t| d ƒƒ¡ d S )Nr,   rM   ©Ú
setdefaultr   r   r   r   Útupler   ©Ztracesr   r   r   °   s     ÿz(LogPublisherTests.test_trace.<locals>.o1c                    s*   ˆ   dtttttf  t| d ƒƒ¡ d S )Nr
   rM   rN   r   rQ   r   r   r   ¶   s     ÿz(LogPublisherTests.test_trace.<locals>.o2)r0   r   r   r   r   r   )r   r3   r   r   r   r   rQ   r   Ú
test_trace¥   s    
zLogPublisherTests.test_trace)rG   rH   rI   Ú__doc__r   r    r$   r(   r*   r+   r4   rB   rL   rR   r   r   r   r   r      s   

 r   N)rS   Útypingr   r   r   r   Zzope.interfacer   Zzope.interface.exceptionsr   Zzope.interface.verifyr   Ztwisted.trialr	   Z_interfacesr   r   Z_loggerr   Z	_observerr   ZTestCaser   r   r   r   r   Ú<module>   s   