U
    
W[                     @   sZ   d Z ddlmZmZ ddlmZ ddl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}.
    )verifyObjectBrokenMethodImplementation)unittest   )Logger)ILogObserver)LogPublisherc                   @   s`   e Z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dd Zdd ZdS )LogPublisherTestsz$
    Tests for L{LogPublisher}.
    c              
   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   C/usr/lib/python3/dist-packages/twisted/logger/test/test_observer.pytest_interface   s
    z LogPublisherTests.test_interfacec                 C   s8   dd }dd }t ||}| t||f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   assertEqualset
_observers)r
   o1o2r   r   r   r   test_observers"   s    
z LogPublisherTests.test_observersc                 C   sL   dd }dd }dd }t ||}|| | t|||f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   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   ZassertRaises	TypeErrorr   object)r
   r   r   r   r   test_addObserverNotCallable:   s    z-LogPublisherTests.test_addObserverNotCallablec                 C   sL   dd }dd }dd }t |||}|| | t||ft|j dS )zE
        L{LogPublisher.removeObserver} removes an observer.
        c                 S   s   d S r   r   r   r   r   r   r   G   r   z7LogPublisherTests.test_removeObserver.<locals>.<lambda>c                 S   s   d S r   r   r   r   r   r   r   H   r   c                 S   s   d S r   r   r   r   r   r   r   I   r   Nr   ZremoveObserverr   r   r   r   r   r   r   test_removeObserverC   s    
z%LogPublisherTests.test_removeObserverc                 C   sJ   dd }dd }dd }t ||}|| | t||f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   U   r   zDLogPublisherTests.test_removeObserverNotRegistered.<locals>.<lambda>c                 S   s   d S r   r   r   r   r   r   r   V   r   c                 S   s   d S r   r   r   r   r   r   r   W   r   Nr!   r   r   r   r    test_removeObserverNotRegisteredP   s    

z2LogPublisherTests.test_removeObserverNotRegisteredc                    sx   t ddd}g  g g  fdd}fdd}fdd}t|||}|| | |  | | | | dS )	z6
        L{LogPublisher} calls its observers.
           r   foobarc                    s
     | S r   appendr   )events1r   r   r   h   r   z/LogPublisherTests.test_fanOut.<locals>.<lambda>c                    s
     | S r   r(   r   )events2r   r   r   i   r   c                    s
     | S r   r(   r   )events3r   r   r   j   r   N)dictr   assertIn)r
   eventr   r   r   r   r   )r*   r+   r,   r   test_fanOut^   s    zLogPublisherTests.test_fanOutc                    s   t ddd}tdg   fdd}g }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!c                    s     }  |  |rd S r   r(   )r/   ZshouldRaiseZevents	exceptionr   r   observer}   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   N)	r-   RuntimeErrorr   r)   r.   r   lenZassertIsvalue)r
   r/   r4   Z	collectorr   errorsr   r2   r   test_observerRaisess   s    z%LogPublisherTests.test_observerRaisesc                    sL   t ddd}t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%   r1   c                 S   s   t dd S )Nz	Sad panda)r7   )r/   r   r   r   r4      s    zGLogPublisherTests.test_observerRaisesAndLoggerHatesMe.<locals>.observerc                       s   e Zd Z fddZdS )zILogPublisherTests.test_observerRaisesAndLoggerHatesMe.<locals>.GurkLoggerc                    s    d S r   r   )r
   argskwargsr3   r   r   failure   s    zQLogPublisherTests.test_observerRaisesAndLoggerHatesMe.<locals>.GurkLogger.failureN)__name__
__module____qualname__r?   r   r>   r   r   
GurkLogger   s   rC   N)r-   r7   r   r   log)r
   r/   r4   rC   r   r   r>   r   #test_observerRaisesAndLoggerHatesMe   s    z5LogPublisherTests.test_observerRaisesAndLoggerHatesMec                    sr   t ddg d}i   f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_tracec                    s     dt| d S )Nr$   rF   
setdefaulttupler   Ztracesr   r   r      r   z.LogPublisherTests.test_trace.<locals>.<lambda>c                    s     dt| d S )Nr   rF   rG   r   rJ   r   r   r      r   N)r-   r   r   )r
   r/   r   r   r   r   rJ   r   
test_trace   s    
zLogPublisherTests.test_traceN)r@   rA   rB   __doc__r   r   r   r    r"   r#   r0   r;   rE   rK   r   r   r   r   r	      s   	#r	   N)rL   Zzope.interface.verifyr   r   Ztwisted.trialr   Z_loggerr   Z	_observerr   r   ZTestCaser	   r   r   r   r   <module>   s   