a
    )(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                   @   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   sH   t  }ztt| W n. tyB } z| | W Y d}~n
d}~0 0 dS )z8
        L{LogPublisher} is an L{ILogObserver}.
        N)r   r   r   r   Zfail)self	publishere r   @lib/python3.9/site-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   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   Z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r2   r   c                    s     }  |  |rd S r   )r0   )r2   ZshouldRaiseZevents	exceptionr   r   observerx   s    
z7LogPublisherTests.test_observerRaises.<locals>.observerc                 S   s   g | ]}d |v r|d  qS )Zlog_failurer   ).0r   r   r   r   
<listcomp>   r   z9LogPublisherTests.test_observerRaises.<locals>.<listcomp>r   )r/   RuntimeErrorr   r   r   r   r   r0   r1   r   lenZassertIsvalue)r   r2   r8   Z	collectorr   errorsr   r6   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,   r4   Nr5   c                 S   s   t dd S )Nz	Sad panda)r;   )r2   r   r   r   r8      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   r@   rA   r7   r   r   failure   s    zQLogPublisherTests.test_observerRaisesAndLoggerHatesMe.<locals>.GurkLogger.failure)__name__
__module____qualname__r&   rC   r   rB   r   r   
GurkLogger   s   rG   )r/   r;   r   r   r   r   r   log)r   r2   r8   rG   r   r   rB   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+   rJ   
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
   rJ   rK   r   rN   r   r   r      s    z(LogPublisherTests.test_trace.<locals>.o2)r/   r   r   r   r   r   )r   r2   r   r   r   r   rN   r   
test_trace   s    
zLogPublisherTests.test_trace)rD   rE   rF   __doc__r   r    r$   r'   r)   r*   r3   r?   rI   rO   r   r   r   r   r      s   

 r   N)rP   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   