U
    ˆjÚ)  ã                   @   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 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)ÚFailure)Ú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              	      s\   t tƒtd dœ‡ fdd„ƒ}t |¡ ztjˆ ||f|Ž W 5 t |¡ X |||dœˆ _d S )N©Úeventr   c                    s
   | ˆ _ d S ©N©r   r   ©Úself© úC/tmp/pip-unpacked-wheel-j5h_c8_q/twisted/logger/test/test_logger.pyÚobserver    s    z!TestLogger.emit.<locals>.observer)r   r   r   )	r   r   r   r   ZaddObserverZremoveObserverr   ÚemitÚ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__8   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)   1   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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   Ú	namespacer0   r   r   r   Ú	test_reprD   s    zLoggerTests.test_reprc                 C   s   t ƒ }|  |jt¡ dS )z3
        Default namespace is module name.
        N)r   r2   r4   r#   ©r   r0   r   r   r   Útest_namespaceDefaultL   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   Úlocalsr2   r4   )r   Úresultr   r   r   Útest_namespaceOMGItsTooHardS   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#   r2   r   r   r0   r4   r   ÚassertIsÚsourceÚassertIsNoner   )r   ÚobjZexpectedNamespacer   r   r   Útest_namespaceAttributea   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   Úappendr0   r   ©Zobservedr   r   ÚMyObject}   s   rF   Úhelloé   r   Ú
log_formatN)r0   Úinfor2   Úlen)r   rF   r   rE   r   Útest_descriptorObserverw   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.
        rG   zHello, {log_source}.Ú
log_sourcez!Hello, <LogComposedObject hello>.N)	r)   r   r   r0   ÚerrorZassertInr   r2   r   )r   rA   r0   Ú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)ÚjunkrQ   r   r   r   rR   r   zNo event observed.rI   Ú	log_levelÚlog_namespacerM   N)r   r   Ziterconstantsr   ÚnameÚgetattrr2   r"   Ú
assertTrueÚhasattrr   r#   r@   r   )r   r0   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 ©NrM   ©r2   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>.ThingorC   N©r#   r$   r%   r   r0   r   rC   r   r   r]   ¹   s   r]   ©r   r   r   r   r   r0   rJ   r   r   )r]   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 r[   r\   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>.ThingorC   Nr^   r   rC   r   r   r]   Ç   s   r]   r_   )r   r]   r   )r    r   ra   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 r[   )r@   r   r   r   r   r    Ò   s    z0LoggerTests.test_sourceUnbound.<locals>.observerrC   ©r   r   r   r   rJ   )r   r    r0   r   r   r   Útest_sourceUnboundÍ   s    
zLoggerTests.test_sourceUnboundc                 C   sv   t ƒ }ztdƒ‚W n tk
r0   | d¡ Y nX |  t¡}|  t|ƒd¡ |  |jd tj¡ |  |jd d¡ dS )z?
        Test that log.failure() emits the right data.
        zbaloney!ZWhoopsrH   r   r   N)	r   ÚRuntimeErrorZfailureÚflushLoggedErrorsr2   rK   r"   r   Úcritical©r   r0   Ú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*)rI   rS   rT   rM   rI   rS   rT   rM   N)r   Úwarnr   rN   r2   r   r4   r@   r6   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*rH   N)r   r!   rf   r   r2   rK   rh   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   rC   r   r   Ú	publisher  s    z)LoggerTests.test_trace.<locals>.publisherc                    s   ˆ  | d ˆ ˆfg¡ d S )NÚ	log_tracer\   r   )r0   rp   r   r   r   r      s    z(LoggerTests.test_trace.<locals>.observerrC   zHello.)rq   rc   r   r   )r0   r    rp   r   r   Ú
test_trace  s    
zLoggerTests.test_tracec              	      sD  g ‰ t tƒtddœ‡ fdd„ƒ}t|d�}d‰G ‡fdd„dƒ}|jd	|ƒ d
��}dd  W 5 Q R X |  |jd¡ |  |jd¡ |  tˆ ƒd¡ ˆ \}g ˆ dd…< |d }|  ˆd¡ |  t	|ƒd¡ |  ˆd¡ |  |j
t¡ |jd|ƒ d
��"}|  |jd¡ |  |jd¡ W 5 Q R X |  ˆd¡ |  |jd¡ |  |jd¡ dS )zŽ
        The L{Logger.failuresHandled} context manager catches any
        L{BaseException} and converts it into a logged L{Failure}.
        Nr   c                    s   ˆ   | ¡ d S r   ©rD   r   ©Úeventsr   r   Úlogged  s    z0LoggerTests.test_failuresHandled.<locals>.loggedrC   r   c                       s   e Zd Zedœ‡ fdd„ZdS )z2LoggerTests.test_failuresHandled.<locals>.Reprabler-   c                    s   ˆ d7 ‰ dˆ › d�S )NrH   z<repr r.   r   r   ©Úreprdr   r   Ú__repr__&  s    z;LoggerTests.test_failuresHandled.<locals>.Reprable.__repr__N)r#   r$   r%   r'   ry   r   rw   r   r   ÚReprable%  s   rz   z*while testing failure handling for {value})ÚvaluerH   FTÚlog_failurez+while testing failure handling for <repr 1>zsucceeding for {value})r   r   r   r   ZfailuresHandledr2   Z	succeededÚfailedrK   r   ÚtypeÚZeroDivisionError)r   rv   r0   rz   Z	operationÚfZop2r   )ru   rx   r   Útest_failuresHandled  s>    
 ÿ ÿz LoggerTests.test_failuresHandledc              	      sÈ   g ‰ t tƒtddœ‡ fdd„ƒ}t|d�}| d¡}d}|�
}d}W 5 Q R X |  |d¡ |  |d¡ |  ˆ g ¡ d}dd	œd
d„}|�}|ƒ  W 5 Q R X |  tˆ ƒd¡ ˆ \}|d }|  |jt	¡ dS )z·
        The L{Logger.failureHandler} context manager can safely be shared
        amongst multiple invocations and converts L{BaseException} into logged
        L{Failure}s.
        Nr   c                    s   ˆ   | ¡ d S r   rs   r   rt   r   r   rv   J  s    z/LoggerTests.test_failureHandler.<locals>.loggedrC   rG   FTr-   c                   S   s
   t ƒ ‚d S r   )ÚKeyboardInterruptr   r   r   r   Ú	raisebaseY  s    z2LoggerTests.test_failureHandler.<locals>.raisebaserH   r|   )
r   r   r   r   ÚfailureHandlerr>   r2   rK   r~   r‚   )r   rv   r0   r„   ÚsuccessÚfhrƒ   r€   r   rt   r   Útest_failureHandlerB  s&    

zLoggerTests.test_failureHandler)r#   r$   r%   r&   r5   r7   r<   rB   rL   rP   rZ   r`   rb   rd   rj   rn   ro   rr   r�   r‡   r   r   r   r   r1   ?   s"   +r1   N)r&   Útypingr   r   r   r   Zzope.interfacer   Z
constantlyr   Ztwisted.python.failurer   Ztwisted.trialr	   Ú_formatr   Z_globalr   Z_interfacesr   r   Z_levelsr   r   Z_loggerr   r   r)   ZTestCaser1   r   r   r   r   Ú<module>   s   