o
    ¯b*  ã                   @   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                   @   st   e Zd ZdZddd„Zddd„Zddd	„Zdd
d„Zddd„Zddd„Z	ddd„Z
ddd„Zddd„Zddd„ZdS )ÚLogPublisherTestsz$
    Tests for L{LogPublisher}.
    ÚreturnNc              
   C   sH   t ƒ }ztt|ƒ W dS  ty# } z|  |¡ W Y d}~dS d}~ww )z8
        L{LogPublisher} is an L{ILogObserver}.
        N)r   r   r   r   Úfail)ÚselfÚ	publisherÚe© r   úC/usr/lib/python3/dist-packages/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   ó   d S ©Nr   ©r   r   r   r   Ú<lambda>'   ó    z2LogPublisherTests.test_observers.<locals>.<lambda>c                 S   r   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   r   r   r   r   r   r   r   r   1   r   z4LogPublisherTests.test_addObserver.<locals>.<lambda>c                 S   r   r   r   r   r   r   r   r   2   r   c                 S   r   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   r   r   r   r   r   r   r   r   E   r   z7LogPublisherTests.test_removeObserver.<locals>.<lambda>c                 S   r   r   r   r   r   r   r   r   F   r   c                 S   r   r   r   r   r   r   r   r   G   r   N©r   r   r   Ú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   r   r   r   r   r   r   r   r   R   r   zDLogPublisherTests.test_removeObserverNotRegistered.<locals>.<lambda>c                 S   r   r   r   r   r   r   r   r   S   r   c                 S   r   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   ÚeventÚevents1Úevents2Úevents3r    r!   r%   r   r   r   r   Útest_fanOutZ   s   zLogPublisherTests.test_fanOutc                    s¦   t ddd�}tdƒ‰g ‰ ttƒdtddf‡ ‡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
   r0   úARGH! EVIL DEATH!r6   r   Nc                    s   ˆ  }ˆ   | ¡ |rˆ‚d S r   )r4   )r6   ÚshouldRaise©ÚeventsÚ	exceptionr   r   Úobserverx   s
   
ÿz7LogPublisherTests.test_observerRaises.<locals>.observerc                 S   s   g | ]
}d |v r|d  ‘qS )Úlog_failurer   )Ú.0r   r   r   r   Ú
<listcomp>ˆ   s    z9LogPublisherTests.test_observerRaises.<locals>.<listcomp>r   )r3   ÚRuntimeErrorr   r   r   r   r   r4   r5   r   ÚlenÚassertIsÚvalue)r   r6   r@   Ú	collectorr   Úerrorsr   r=   r   Útest_observerRaisesn   s   z%LogPublisherTests.test_observerRaisesc                    s^   t ddd�}tdƒ‰ ttƒdtddf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
   r0   r;   r6   r   Nc                 S   s   t dƒ‚)Nz	Sad panda)rD   )r6   r   r   r   r@   —   s   zGLogPublisherTests.test_observerRaisesAndLoggerHatesMe.<locals>.observerc                       s&   e Zd Zdededdf‡ fdd„ZdS )zILogPublisherTests.test_observerRaisesAndLoggerHatesMe.<locals>.GurkLoggerÚargsÚkwargsr   Nc                    s   ˆ ‚r   r   )r   rK   rL   ©r?   r   r   Úfailureœ   s   zQLogPublisherTests.test_observerRaisesAndLoggerHatesMe.<locals>.GurkLogger.failure)Ú__name__Ú
__module__Ú__qualname__r)   rN   r   rM   r   r   Ú
GurkLogger›   s    rR   )r3   rD   r   r   r   r   r   Úlog)r   r6   r@   rR   r   r   rM   r   Ú#test_observerRaisesAndLoggerHatesMeŽ   s   z5LogPublisherTests.test_observerRaisesAndLoggerHatesMec                    s–   t ddg d�}i ‰ ttƒdtddf‡ fdd„ƒ}ttƒdtddf‡ fd	d
„ƒ}t||ƒ}||ƒ |  ˆ d ||ff¡ |  ˆ d ||f||ff¡ dS )zA
        Tracing keeps track of forwarding to observers.
        r/   r
   )r1   r2   Ú	log_tracer   r   Nc                    ó*   ˆ   dtttttf  t| d ƒƒ¡ d S )Nr/   rU   ©Ú
setdefaultr   r   r   r   Útupler   ©Útracesr   r   r    °   ó   ÿz(LogPublisherTests.test_trace.<locals>.o1c                    rV   )Nr
   rU   rW   r   rZ   r   r   r!   ¶   r\   z(LogPublisherTests.test_trace.<locals>.o2)r3   r   r   r   r   r   )r   r6   r    r!   r   r   rZ   r   Ú
test_trace¥   s   
 zLogPublisherTests.test_trace)r   N)rO   rP   rQ   Ú__doc__r   r"   r&   r*   r-   r.   r:   rJ   rT   r]   r   r   r   r   r      s    










 r   N)r^   Útypingr   r   r   r   Úzope.interfacer   Úzope.interface.exceptionsr   Úzope.interface.verifyr   Útwisted.trialr	   Ú_interfacesr   r   Ú_loggerr   Ú	_observerr   ÚTestCaser   r   r   r   r   Ú<module>   s   