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 dd	lmZmZ dd
lmZmZ ddlmZ G dd deZG dd dZG dd dejZdS )z+
Test cases for L{twisted.logger._logger}.
    )ListOptionalTypecast)implementer)NamedConstant)unittest   )formatEvent)globalLogPublisher)ILogObserverLogEvent)InvalidLogLevelErrorLogLevelLoggerc                   @   s*   e Zd ZdZdeee eddddZdS )
TestLoggerz^
    L{Logger} with an overridden C{emit} method that keeps track of received
    events.
    N)levelformatkwargsreturnc              	      sj   t ttd d fdd}t| z$tj ||fi | W t| nt| 0 |||d _d S )Neventr   c                    s
   |  _ d S Nr   r   self >lib/python3.9/site-packages/twisted/logger/test/test_logger.pyobserver   s    z!TestLogger.emit.<locals>.observer)r   r   r   )	r   r   r   r   ZaddObserverr   emitZremoveObserveremitted)r   r   r   r   r   r   r   r   r       s    
zTestLogger.emit)N)	__name__
__module____qualname____doc__r   r   strobjectr    r   r   r   r   r      s    
r   c                   @   s:   e Zd ZdZe Zd	ee ddddZedddZ	dS )
LogComposedObjectz3
    A regular object, with a logger attached.
    N)stater   c                 C   s
   || _ d S r   r)   )r   r)   r   r   r   __init__7   s    zLogComposedObject.__init__r   c                 C   s   d| j  dS )Nz<LogComposedObject >r*   r   r   r   r   __str__:   s    zLogComposedObject.__str__)N)
r"   r#   r$   r%   r   logr   r&   r+   r.   r   r   r   r   r(   0   s   r(   c                   @   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dddZddddZddddZddddZdS ) LoggerTestsz
    Tests for L{Logger}.
    Nr,   c                 C   s,   d}t |}| t|dt| d dS )z"
        repr() on Logger
        Zblearghz<Logger r-   N)r   assertEqualrepr)r   	namespacer/   r   r   r   	test_reprC   s    zLoggerTests.test_reprc                 C   s   t  }| |jt dS )z3
        Default namespace is module name.
        N)r   r1   r3   r"   r   r/   r   r   r   test_namespaceDefaultK   s    z!LoggerTests.test_namespaceDefaultc                 C   s.   g }t dttdt  | |d jd dS )z
        Default namespace is C{"<unknown>"} when a logger is created from a
        context in which is can't be determined automatically and no namespace
        was specified.
        zresult.append(Logger())r   r   z	<unknown>N)execdictr   localsr1   r3   )r   resultr   r   r   test_namespaceOMGItsTooHardR   s    z'LoggerTests.test_namespaceOMGItsTooHardc                 C   s   t  }d|j|jj}| tt|jj	| | tt
t t jj	| | tt
t t jjt  | tt|jj| | t j dS )z
        Default namespace for classes using L{Logger} as a descriptor is the
        class name they were retrieved from.
        z{}.{}N)r(   r   r#   	__class__r"   r1   r   r   r/   r3   r   ZassertIssourceassertIsNoner   )r   objZexpectedNamespacer   r   r   test_namespaceAttribute`   s    z#LoggerTests.test_namespaceAttributec                    sJ   g  G  fddd}|j d | t d |  d d d dS )zH
        When used as a descriptor, the observer is propagated.
        c                       s   e Zd Zeee jdZdS )z5LoggerTests.test_descriptorObserver.<locals>.MyObjectr   N)r"   r#   r$   r   r   r   appendr/   r   Zobservedr   r   MyObject|   s   rD   hello   r   
log_formatN)r/   infor1   len)r   rD   r   rC   r   test_descriptorObserverv   s
    z#LoggerTests.test_descriptorObserverc                 C   sX   t d}tt|j}|d | d|j | |jd | t|j}| d| dS )z
        On instances that have a L{Logger} class attribute, the C{log_source}
        key is available to format strings.
        rE   zHello, {log_source}.
log_sourcez!Hello, <LogComposedObject hello>.N)	r(   r   r   r/   errorZassertInr   r1   r
   )r   r?   r/   Zstuffr   r   r   !test_sourceAvailableForFormatting   s    

z-LoggerTests.test_sourceAvailableForFormattingc                 C   s   t  }t D ]}d}|j|jd}t||j}||||jd | |jd | | |jd | | |jd d | | t	|dd	 | |j
d
 | | |j
d | | |j
d t | |j
d  | |j
d | | t|j
| qdS )z]
        Test that log levels and messages are emitted correctly for
        Logger.
        zThis is a {level_name} message)
level_name)junkrN   r   r   r   rO   r   zNo event observed.rG   	log_levellog_namespacerK   N)r   r   Ziterconstantsr   namegetattrr1   r!   Z
assertTruehasattrr   r"   r>   r
   )r   r/   r   r   messageZ	logMethodr   r   r   test_basicLogger   s     zLoggerTests.test_basicLoggerc                    sD   t ttdd fddG fddd tt j  dS )z>
        C{log_source} event key refers to the class.
        Nr   c                    s    | d   d S NrK   r1   r   )Thingor   r   r   r      s    z0LoggerTests.test_sourceOnClass.<locals>.observerc                       s   e Zd Ze dZdS )z.LoggerTests.test_sourceOnClass.<locals>.ThingorA   Nr"   r#   r$   r   r/   r   rA   r   r   rY      s   rY   r   r   r   r   r   r/   rH   r   r   )rY   r   r   r   test_sourceOnClass   s    zLoggerTests.test_sourceOnClassc                    sJ   t ttddfdd G  fddd}| ttj  dS )zA
        C{log_source} event key refers to the instance.
        Nr   c                    s     | d  d S rW   rX   r   )r   thingor   r   r      s    z3LoggerTests.test_sourceOnInstance.<locals>.observerc                       s   e Zd Ze dZdS )z1LoggerTests.test_sourceOnInstance.<locals>.ThingorA   NrZ   r   rA   r   r   rY      s   rY   r[   )r   rY   r   )r   r   r]   r   test_sourceOnInstance   s
    z!LoggerTests.test_sourceOnInstancec                    s2   t ttdd fdd}t|d}|  dS )z5
        C{log_source} event key is L{None}.
        Nr   c                    s     | d  d S rW   )r>   r   r   r   r   r      s    z0LoggerTests.test_sourceUnbound.<locals>.observerrA   r   r   r   r   rH   )r   r   r/   r   r   r   test_sourceUnbound   s    
zLoggerTests.test_sourceUnboundc                 C   st   t  }ztdW n ty.   |d Y n0 | t}| t|d | |jd tj | |jd d dS )z?
        Test that log.failure() emits the right data.
        zbaloney!ZWhoopsrF   r   r   N)	r   RuntimeErrorZfailureflushLoggedErrorsr1   rI   r!   r   Zcriticalr   r/   errorsr   r   r   test_defaultFailure   s    
zLoggerTests.test_defaultFailurec                 C   sj   t  }|jddtjddd | |jd d | |jd tj | |jd |j | |jd	  d
S )zQ
        Make sure that kwargs conflicting with args don't pass through.
        *#z*namespace*z*source*)rG   rP   rQ   rK   rG   rP   rQ   rK   N)r   warnr   rL   r1   r   r3   r>   r5   r   r   r   test_conflictingKwargs   s    z"LoggerTests.test_conflictingKwargsc                 C   s.   t  }|d | t}| t|d dS )zA
        Test passing in a bogus log level to C{emit()}.
        z*bogus*rF   N)r   r    rb   r   r1   rI   rc   r   r   r   test_logInvalidLogLevel   s    

z#LoggerTests.test_logInvalidLogLevelc                    sX   t ttddfddt ttdd fddtd  jdg d	 dS )
zE
        Tracing keeps track of forwarding to the publisher.
        Nr   c                    s    |  d S r   r   r   rA   r   r   	publisher  s    z)LoggerTests.test_trace.<locals>.publisherc                    s    | d  fg d S )N	log_tracerX   r   )r/   rk   r   r   r   r     s    z(LoggerTests.test_trace.<locals>.observerrA   zHello.)rl   r_   r   r   )r/   r   rk   r   r   
test_trace  s    
zLoggerTests.test_trace)r"   r#   r$   r%   r4   r6   r;   r@   rJ   rM   rV   r\   r^   r`   re   ri   rj   rm   r   r   r   r   r0   >   s   r0   N)r%   typingr   r   r   r   Zzope.interfacer   Z
constantlyr   Ztwisted.trialr   Z_formatr
   Z_globalr   Z_interfacesr   r   Z_levelsr   r   Z_loggerr   r   r(   ZTestCaser0   r   r   r   r   <module>   s   