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   