o
    Òó·i	9  ã                   @   sÔ   d Z ddlZddlmZ ddlmZ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 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jƒZ G dd„ dejƒZ!dS )z+
Test cases for L{twisted.logger._legacy}.
é    N)Útime)ÚListÚcast)Úimplementer)ÚBrokenMethodImplementation)ÚverifyObject)ÚcontextÚlog)ÚFailure)Úunittesté   )ÚformatEvent)ÚILogObserverÚLogEvent)ÚLegacyLogObserverWrapperÚpublishToNewObserver)ÚLogLevelc                   @   s  e Zd ZdZd4dd„Zd4dd„Zdedefd	d
„Zdedefdd„Zd4dd„Z	d4dd„Z
d4dd„Zd4dd„Zd4dd„Zd4dd„Zd4dd„Zd4dd„Zd4dd„Zd4dd „Zd4d!d"„Zd4d#d$„Zd4d%d&„Zd4d'd(„Zd)edefd*d+„Zd4d,d-„Zd4d.d/„Zd4d0d1„Zd4d2d3„ZdS )5ÚLegacyLogObserverWrapperTestsz0
    Tests for L{LegacyLogObserverWrapper}.
    ÚreturnNc              
   C   sZ   t tjdd„ ƒ}t|ƒ}ztt|ƒ W dS  ty, } z|  |¡ W Y d}~dS d}~ww )zD
        L{LegacyLogObserverWrapper} is an L{ILogObserver}.
        c                 S   ó   d S ©N© ©Úer   r   úeC:\Users\psant\Downloads\PAF backend\school\venv\Lib\site-packages\twisted/logger/test/test_legacy.pyÚ<lambda>"   s    z>LegacyLogObserverWrapperTests.test_interface.<locals>.<lambda>N)r   Ú	legacyLogr   r   r   r   Zfail)ÚselfÚlegacyObserverÚobserverr   r   r   r   Útest_interface   s   €ÿz,LegacyLogObserverWrapperTests.test_interfacec                 C   s6   t tjƒG dd„ dƒƒ}t|ƒ ƒ}|  t|ƒd¡ dS )zJ
        L{LegacyLogObserverWrapper} returns the expected string.
        c                   @   s.   e Zd Zdefdd„Zdejddfdd„ZdS )z?LegacyLogObserverWrapperTests.test_repr.<locals>.LegacyObserverr   c                 S   s   dS )Nz<Legacy Observer>r   ©r   r   r   r   Ú__repr__0   ó   zHLegacyLogObserverWrapperTests.test_repr.<locals>.LegacyObserver.__repr__Ú	eventDictNc                 S   r   r   r   )r   r$   r   r   r   Ú__call__3   r#   zHLegacyLogObserverWrapperTests.test_repr.<locals>.LegacyObserver.__call__)Ú__name__Ú
__module__Ú__qualname__Ústrr"   r   Ú	EventDictr%   r   r   r   r   ÚLegacyObserver.   s    r+   z+LegacyLogObserverWrapper(<Legacy Observer>)N)r   r   r   r   ÚassertEqualÚrepr)r   r+   r   r   r   r   Ú	test_repr)   s   
z'LegacyLogObserverWrapperTests.test_reprÚeventc                    s@   g ‰ t tj‡ fdd„ƒ}t|ƒ}||ƒ |  tˆ ƒd¡ ˆ d S )zÒ
        Send an event to a wrapped legacy observer and capture the event as
        seen by that observer.

        @param event: an event

        @return: the event as observed by the legacy wrapper
        c                    s
   ˆ   | ¡S r   )Úappendr   ©Úeventsr   r   r   E   s   
 z7LegacyLogObserverWrapperTests.observe.<locals>.<lambda>é   r   N)r   r   r   r   r,   Úlen)r   r/   r   r   r   r1   r   Úobserve:   s   	z%LegacyLogObserverWrapperTests.observec                 C   sX   |  dtƒ ¡ |  dd¡ |  dtj¡ |  t|ƒ¡}| ¡ D ]
\}}|  ||¡ q|S )zÉ
        Send an event to a wrapped legacy observer and verify that its data is
        preserved.

        @param event: an event

        @return: the event as observed by the legacy wrapper
        Úlog_timeÚ
log_systemú-Ú	log_levelN)Ú
setdefaultr   r   Úinfor5   ÚdictÚitemsZassertIn)r   r/   ÚobservedÚkeyÚvaluer   r   r   ÚforwardAndVerifyL   s   
z.LegacyLogObserverWrapperTests.forwardAndVerifyc                 C   s   |   tddd�¡ dS )ze
        Basic forwarding: event keys as observed by a legacy observer are the
        same.
        r3   r   ©ÚfooÚbarN)rA   r<   r!   r   r   r   Útest_forwardc   s   z*LegacyLogObserverWrapperTests.test_forwardc                 C   s*   t ƒ }|  t|d�¡}|  |d |¡ dS )zc
        The new-style C{"log_time"} key is copied to the old-style C{"time"}
        key.
        )r6   r   N©r   rA   r<   r,   ©r   Zstampr/   r   r   r   Ú	test_timej   s   z'LegacyLogObserverWrapperTests.test_timec                 C   s0   t ƒ }|  t|d |d�¡}|  |d |¡ dS )zr
        The new-style C{"log_time"} key does not step on a pre-existing
        old-style C{"time"} key.
        r3   )r6   r   r   NrF   rG   r   r   r   Útest_timeAlreadySets   s   z1LegacyLogObserverWrapperTests.test_timeAlreadySetc                 C   ó$   |   tdd�¡}|  |d d¡ dS )zg
        The new-style C{"log_system"} key is copied to the old-style
        C{"system"} key.
        rC   )r7   ÚsystemN©rA   r<   r,   ©r   r/   r   r   r   Útest_system|   s   z)LegacyLogObserverWrapperTests.test_systemc                 C   s&   |   tddd�¡}|  |d d¡ dS )zv
        The new-style C{"log_system"} key does not step on a pre-existing
        old-style C{"system"} key.
        rC   rD   )r7   rK   rK   NrL   rM   r   r   r   Útest_systemAlreadySet„   s   z3LegacyLogObserverWrapperTests.test_systemAlreadySetc                 C   s2   t tƒ tjd�}|  t |ƒ¡}|  |d d¡ dS )zy
        If the new-style C{"log_system"} key is absent, the old-style
        C{"system"} key is set to C{"-"}.
        )r6   r9   rK   r8   N)r<   r   r   r;   r5   r,   )r   r/   r>   r   r   r   Útest_noSystemŒ   s   z+LegacyLogObserverWrapperTests.test_noSystemc                 C   sT   |   ttjdd�¡ |   ttjdd�¡ |   ttjdd�¡ |   ttjdd�¡ dS )zÁ
        If explicitly set, the C{isError} key will be preserved when forwarding
        from a new-style logging emitter to a legacy logging observer,
        regardless of log level.
        r3   )r9   ÚisErrorr   N)rA   r<   r   r;   ÚwarnÚerrorÚcriticalr!   r   r   r   Útest_levelNotChange–   s   z1LegacyLogObserverWrapperTests.test_levelNotChangec                 C   s"   |   ttjd�¡}|  d|¡ dS )a)  
        The new-style C{"log_level"} key is not translated to the old-style
        C{"logLevel"} key.

        Events are forwarded from the old module from to new module and are
        then seen by old-style observers.
        We don't want to add unexpected keys to old-style events.
        )r9   ÚlogLevelN)rA   r<   r   r;   ÚassertNotInrM   r   r   r   Útest_pythonLogLevelNotSet¡   s   	z7LegacyLogObserverWrapperTests.test_pythonLogLevelNotSetc                 C   rJ   )a  
        If a stdlib log level was provided as a string (eg. C{"WARNING"}) in
        the legacy "logLevel" key, it does not get converted to a number.
        The documentation suggested that numerical values should be used but
        this was not a requirement.
        ÚWARNING©rV   rV   NrL   rM   r   r   r   Útest_stringPythonLogLevel­   s   ÿÿz7LegacyLogObserverWrapperTests.test_stringPythonLogLevelc                 C   s    |   tƒ ¡}|  |d d¡ dS )z–
        The old-style C{"message"} key is added, even if no new-style
        C{"log_format"} is given, as it is required, but may be empty.
        Úmessager   NrL   rM   r   r   r   Útest_message»   ó   z*LegacyLogObserverWrapperTests.test_messagec                 C   rJ   )zV
        The old-style C{"message"} key is not modified if it already exists.
        rB   )r\   r\   NrL   rM   r   r   r   Útest_messageAlreadySetÃ   s   z4LegacyLogObserverWrapperTests.test_messageAlreadySetc                 C   ó(   |   tddd�¡}|  t |¡d¡ dS )z—
        Formatting is translated such that text is rendered correctly, even
        though old-style logging doesn't use PEP 3101 formatting.
        zHello, {who}!Úworld)Ú
log_formatZwhoúHello, world!N©rA   r<   r,   r   ÚtextFromEventDictrM   r   r   r   Útest_formatÊ   ó   z)LegacyLogObserverWrapperTests.test_formatc                 C   r`   )zo
        Using the message key, which is special in old-style, works for
        new-style formatting.
        zHello, {message}!ra   )rb   r\   rc   Nrd   rM   r   r   r   Útest_formatMessageÒ   s   
ÿz0LegacyLogObserverWrapperTests.test_formatMessagec                 C   s(   |   tddd�¡}|  t |¡d¡ dS )zd
        Formatting is not altered if the old-style C{"format"} key already
        exists.
        zHello!zHowdy!)rb   ÚformatNrd   rM   r   r   r   Útest_formatAlreadySetÜ   rg   z3LegacyLogObserverWrapperTests.test_formatAlreadySetÚvaluesc                 K   s&   t tdƒƒ}|  td|ddœ|¤Ž¡S )z¦
        Create a new-style event with a captured failure.

        @param values: Additional values to include in the event.

        @return: the new event
        znyargh!ú	oopsie...)Úlog_failurerb   Nr   )r
   ÚRuntimeErrorrA   r<   )r   rk   Úfailurer   r   r   ÚeventWithFailureä   s   ÿz.LegacyLogObserverWrapperTests.eventWithFailurec                 C   s>   |   ¡ }|  |d |d ¡ |  |d ¡ |  |d d¡ dS )z}
        Captured failures in the new style set the old-style C{"failure"},
        C{"isError"}, and C{"why"} keys.
        ro   rm   rQ   Úwhyrl   N)rp   ÚassertIsÚ
assertTruer,   rM   r   r   r   Útest_failureñ   s   z*LegacyLogObserverWrapperTests.test_failurec                 C   s,   t tdƒƒ}| j|d�}|  |d |¡ dS )úv
        Captured failures in the new style do not step on a pre-existing
        old-style C{"failure"} key.
        zWeak salsa!)ro   ro   N)r
   rn   rp   rr   )r   ro   r/   r   r   r   Útest_failureAlreadySetû   s   z4LegacyLogObserverWrapperTests.test_failureAlreadySetc                 C   ó    | j dd�}|  |d d¡ dS )zv
        Captured failures in the new style do not step on a pre-existing
        old-style C{"isError"} key.
        r   ©rQ   rQ   N©rp   r,   rM   r   r   r   Útest_isErrorAlreadySet  r^   z4LegacyLogObserverWrapperTests.test_isErrorAlreadySetc                 C   rw   )ru   Zblah)rq   rq   Nry   rM   r   r   r   Útest_whyAlreadySet  r^   z0LegacyLogObserverWrapperTests.test_whyAlreadySet©r   N)r&   r'   r(   Ú__doc__r    r.   r   r5   rA   rE   rH   rI   rN   rO   rP   rU   rX   r[   r]   r_   rf   rh   rj   Úobjectrp   rt   rv   rz   r{   r   r   r   r   r      s2    




	
	















	r   c                   @   s–   e Zd ZdZddd„Zdededejf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 )ÚPublishToNewObserverTestsz,
    Tests for L{publishToNewObserver}.
    r   Nc                 C   s   g | _ tt| j jƒ| _d S r   )r2   r   r   r0   r   r!   r   r   r   ÚsetUp  s   zPublishToNewObserverTests.setUpr\   rk   c                 O   sD   t  tj¡pi  ¡ }| |¡ ||d< tƒ |d< d|vr d|d< |S )a  
        Return a basic old-style event as would be created by L{legacyLog.msg}.

        @param message: a message event value in the legacy event format
        @param values: additional event values in the legacy event format

        @return: a legacy event
        r\   r   rQ   r   N)r   Úgetr   ZILogContextÚcopyÚupdater   )r   r\   rk   r/   r   r   r   ÚlegacyEvent  s   	

z%PublishToNewObserverTests.legacyEventc                 C   s*   t | j|  ¡ tjƒ |  t| jƒd¡ dS )z6
        The observer is called exactly once.
        r3   N)r   r   r„   r   re   r,   r4   r2   r!   r   r   r   Útest_observed/  s   ÿz'PublishToNewObserverTests.test_observedc                 C   ó8   t | j|  ¡ tjƒ |  | jd d | jd d ¡ dS )zc
        The old-style C{"time"} key is copied to the new-style C{"log_time"}
        key.
        r   r6   r   N©r   r   r„   r   re   r,   r2   r!   r   r   r   rH   8  ó   ÿ$z#PublishToNewObserverTests.test_timec                 C   sN   dt dtfdd„}|  dd¡}||ƒ}t| j||ƒ |  t| jd ƒ|¡ dS )	z—
        A published old-style event should format as text in the same way as
        the given C{textFromEventDict} callable would format it.
        r/   r   c                 S   s   d  td  | d ¡ƒ¡S )NÚ ú r\   )ÚjoinÚreversed)r/   r   r   r   re   H  s   zAPublishToNewObserverTests.test_message.<locals>.textFromEventDictzHello,zworld!r   N)r   r)   r„   r   r   r,   r   r2   )r   re   r/   Útextr   r   r   r]   B  s
   z&PublishToNewObserverTests.test_messagec                 C   s0   t | j|  ¡ tjƒ |  | jd d tj¡ dS )zL
        Published event should have log level of L{LogLevel.info}.
        r   r9   N)	r   r   r„   r   re   r,   r2   r   r;   r!   r   r   r   Útest_defaultLogLevelQ  s   ÿz.PublishToNewObserverTests.test_defaultLogLevelc                 C   ó4   t | j| jdd�tjƒ |  | jd d tj¡ dS )z“
        If C{"isError"} is set to C{1} (true) on the legacy event, the
        C{"log_level"} key should get set to L{LogLevel.critical}.
        r3   rx   r   r9   N)	r   r   r„   r   re   r,   r2   r   rT   r!   r   r   r   Útest_isErrorZ  s   ÿz&PublishToNewObserverTests.test_isErrorc                 C   s6   t | j| jtjd�tjƒ |  | jd d t	j
¡ dS )zæ
        If the old-style C{"logLevel"} key is set to a standard library logging
        level, using a predefined (L{int}) constant, the new-style
        C{"log_level"} key should get set to the corresponding log level.
        rZ   r   r9   N)r   r   r„   Ú
py_loggingrY   r   re   r,   r2   r   rR   r!   r   r   r   Útest_stdlibLogLeveld  s   ýz-PublishToNewObserverTests.test_stdlibLogLevelc                 C   r�   )zÖ
        If the old-style C{"logLevel"} key is set to a standard library logging
        level, using a string value, the new-style C{"log_level"} key should
        get set to the corresponding log level.
        rY   rZ   r   r9   N)	r   r   r„   r   re   r,   r2   r   rR   r!   r   r   r   Útest_stdlibLogLevelWithStringq  s   
ýz7PublishToNewObserverTests.test_stdlibLogLevelWithStringc                 C   s.   t | j| jdd�tjƒ |  d| jd ¡ dS )z½
        If the old-style C{"logLevel"} key is set to a standard library logging
        level, using an unknown value, the new-style C{"log_level"} key should
        not get set.
        zFoo!!!!!rZ   r9   r   N)r   r   r„   r   re   rW   r2   r!   r   r   r   Útest_stdlibLogLevelWithGarbage~  s   
ýz8PublishToNewObserverTests.test_stdlibLogLevelWithGarbagec                 C   s.   t | j|  ¡ tjƒ |  | jd d d¡ dS )z‹
        Published event should have a namespace of C{"log_legacy"} to indicate
        that it was forwarded from legacy logging.
        r   Zlog_namespaceZ
log_legacyNr‡   r!   r   r   r   Útest_defaultNamespace‹  s   ÿz/PublishToNewObserverTests.test_defaultNamespacec                 C   r†   )zg
        The old-style C{"system"} key is copied to the new-style
        C{"log_system"} key.
        r   r7   rK   Nr‡   r!   r   r   r   rN   •  rˆ   z%PublishToNewObserverTests.test_systemr|   )r&   r'   r(   r}   r€   r)   r~   r   r*   r„   r…   rH   r]   rŽ   r�   r’   r“   r”   r•   rN   r   r   r   r   r     s    


	



	





r   )"r}   Úloggingr‘   r   Útypingr   r   Zzope.interfacer   Zzope.interface.exceptionsr   Zzope.interface.verifyr   Ztwisted.pythonr   r	   r   Ztwisted.python.failurer
   Ztwisted.trialr   Ú_formatr   Z_interfacesr   r   Z_legacyr   r   Z_levelsr   ZTestCaser   r   r   r   r   r   Ú<module>   s"    }