o
    Òó·iÚ)  ã                   @   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                	   @   s2   e Zd ZdZ	d	dedee deddf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              	      sl   t tƒdtdd f‡ fdd„ƒ}t |¡ ztjˆ ||fi |¤Ž W t |¡ nt |¡ w |||dœˆ _d S )NÚeventr   c                    s
   | ˆ _ d S ©N©r   r   ©Úself© úeC:\Users\psant\Downloads\PAF backend\school\venv\Lib\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.emitr   )	Ú__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	dee ddfdd„Zdef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__c                 C   s   d| j › d�S )Nz<LogComposedObject ú>r*   r   r   r   r   Ú__str__;   s   zLogComposedObject.__str__r   )
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„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$dd„Zd$dd„Zd$dd„Zd$d d!„Zd$d"d#„ZdS )%ÚLoggerTestsz
    Tests for L{Logger}.
    r   Nc                 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_reprD   s    zLoggerTests.test_reprc                 C   s   t ƒ }|  |jt¡ dS )z3
        Default namespace is module name.
        N)r   r0   r2   r"   ©r   r.   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   Úlocalsr0   r2   )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"   r0   r   r   r.   r2   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   Úappendr.   r   ©Zobservedr   r   ÚMyObject}   ó    rD   Úhelloé   r   Ú
log_formatN)r.   Úinfor0   Úlen)r   rD   r   rC   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.
        rF   zHello, {log_source}.Ú
log_sourcez!Hello, <LogComposedObject hello>.N)	r(   r   r   r.   ÚerrorZassertInr   r0   r   )r   r?   r.   Ústuffr   r   r   Ú!test_sourceAvailableForFormatting„   s   

z-LoggerTests.test_sourceAvailableForFormattingc                 C   sü   t ƒ }t ¡ D ]t}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)ÚjunkrP   r   r   r   rQ   r   zNo event observed.rH   Ú	log_levelÚlog_namespacerL   N)r   r   Ziterconstantsr   ÚnameÚgetattrr0   r!   Ú
assertTrueÚhasattrr   r"   r>   r   )r   r.   r   r   ÚmessageZ	logMethodr   r   r   Útest_basicLogger“   s"   ìzLoggerTests.test_basicLoggerc                    sF   t tƒdtddf‡ ‡fdd„ƒ‰G ‡fdd„dƒ‰ ttˆ jƒ ¡  dS )z>
        C{log_source} event key refers to the class.
        r   r   Nc                    s   ˆ  | d ˆ ¡ d S ©NrL   ©r0   r   )ÚThingor   r   r   r   µ   ó   z0LoggerTests.test_sourceOnClass.<locals>.observerc                       ó   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   r\   ¹   ó    r\   ©r   r   r   r   r   r.   rI   r   r   )r\   r   r   r   Útest_sourceOnClass°   s   zLoggerTests.test_sourceOnClassc                    sL   t tƒdtddf‡‡fdd„ƒ‰ G ‡ fdd„dƒ}|ƒ ‰ttˆjƒ ¡  dS )zA
        C{log_source} event key refers to the instance.
        r   r   Nc                    s   ˆ   | d ˆ¡ d S rZ   r[   r   )r   Úthingor   r   r   Ã   r]   z3LoggerTests.test_sourceOnInstance.<locals>.observerc                       r^   )z1LoggerTests.test_sourceOnInstance.<locals>.ThingorA   Nr_   r   rA   r   r   r\   Ç   r`   r\   ra   )r   r\   r   )r   r   rc   r   Útest_sourceOnInstance¾   s
   z!LoggerTests.test_sourceOnInstancec                    s4   t tƒdtddf‡ fdd„ƒ}t|d�}| ¡  dS )z5
        C{log_source} event key is L{None}.
        r   r   Nc                    s   ˆ   | d ¡ d S rZ   )r>   r   r   r   r   r   Ò   s   z0LoggerTests.test_sourceUnbound.<locals>.observerrA   ©r   r   r   r   rI   )r   r   r.   r   r   r   Útest_sourceUnboundÍ   s   
zLoggerTests.test_sourceUnboundc                 C   sp   t ƒ }ztdƒ‚ ty   | d¡ Y nw |  t¡}|  t|ƒd¡ |  |jd tj¡ |  |jd d¡ dS )z?
        Test that log.failure() emits the right data.
        zbaloney!ZWhoopsrG   r   r   N)	r   ÚRuntimeErrorZfailureÚflushLoggedErrorsr0   rJ   r!   r   Ú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*)rH   rR   rS   rL   rH   rR   rS   rL   N)r   Úwarnr   rM   r0   r   r2   r>   r4   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*rG   N)r   r    rh   r   r0   rJ   rj   r   r   r   Útest_logInvalidLogLevelü   s   

z#LoggerTests.test_logInvalidLogLevelc                    s\   t tƒdtddf‡fdd„ƒ‰t tƒdtddf‡ ‡‡fdd„ƒ‰tˆd�‰ ˆ jd	g d
� dS )zE
        Tracing keeps track of forwarding to the publisher.
        r   r   Nc                    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_tracer[   r   )r.   rr   r   r   r   r     s   z(LoggerTests.test_trace.<locals>.observerrA   zHello.)rs   re   r   r   )r.   r   rr   r   r   Ú
test_trace  s   
zLoggerTests.test_tracec                    sn  g ‰ t tƒdtddf‡ fdd„ƒ}t|d�}d‰G ‡fdd	„d	ƒ}|jd
|ƒ d��}dd  W d  ƒ n1 s8w   Y  |  |jd¡ |  |jd¡ |  tˆ ƒd¡ ˆ \}g ˆ dd…< |d }|  ˆd¡ |  t	|ƒd¡ |  ˆd¡ |  |j
t¡ |jd|ƒ d��}|  |jd¡ |  |jd¡ W d  ƒ n1 sœw   Y  |  ˆ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}.
        r   r   Nc                    ó   ˆ   | ¡ d S r   ©rB   r   ©Úeventsr   r   Úlogged  ó   z0LoggerTests.test_failuresHandled.<locals>.loggedrA   r   c                       s   e Zd Zdef‡ fdd„ZdS )z2LoggerTests.test_failuresHandled.<locals>.Reprabler   c                    s   ˆ d7 ‰ dˆ › d�S )NrG   z<repr r,   r   r   ©Úreprdr   r   Ú__repr__&  s   z;LoggerTests.test_failuresHandled.<locals>.Reprable.__repr__N)r"   r#   r$   r&   r}   r   r{   r   r   ÚReprable%  rE   r~   z*while testing failure handling for {value})ÚvaluerG   FTÚlog_failurez+while testing failure handling for <repr 1>zsucceeding for {value})r   r   r   r   ZfailuresHandledr0   Z	succeededÚfailedrJ   r   ÚtypeÚZeroDivisionError)r   ry   r.   r~   Z	operationÚfZop2r   )rx   r|   r   Útest_failuresHandled  s>   
ÿ
ýÿþz LoggerTests.test_failuresHandledc                    sî   g ‰ t tƒdtddf‡ fdd„ƒ}t|d�}| d¡}d}|�
}d	}W d  ƒ n1 s,w   Y  |  |d¡ |  |d	¡ |  ˆ g ¡ d}dd
d„}|�}|ƒ  W d  ƒ n1 sZw   Y  |  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.
        r   r   Nc                    ru   r   rv   r   rw   r   r   ry   J  rz   z/LoggerTests.test_failureHandler.<locals>.loggedrA   rF   FTc                   S   s   t ƒ ‚r   )ÚKeyboardInterruptr   r   r   r   Ú	raisebaseY  s   z2LoggerTests.test_failureHandler.<locals>.raisebaserG   r€   ©r   N)
r   r   r   r   ÚfailureHandlerr<   r0   rJ   r‚   r†   )r   ry   r.   r‰   ÚsuccessÚfhr‡   r„   r   rw   r   Útest_failureHandlerB  s*   

ÿ
ÿzLoggerTests.test_failureHandlerrˆ   )r"   r#   r$   r%   r3   r5   r:   r@   rK   rO   rY   rb   rd   rf   rl   rp   rq   rt   r…   rŒ   r   r   r   r   r/   ?   s$    














+r/   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TestCaser/   r   r   r   r   Ú<module>   s   