a
    )(b	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                   @   sX  e Zd ZdZddddZddddZeedd	d
Zee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eed)d*d+Zddd,d-Zddd.d/Zddd0d1Zddd2d3ZdS )4LegacyLogObserverWrapperTestsz0
    Tests for L{LegacyLogObserverWrapper}.
    Nreturnc              
   C   sZ   t tjdd }t|}ztt| W n. tyT } z| | W Y d}~n
d}~0 0 dS )zD
        L{LegacyLogObserverWrapper} is an L{ILogObserver}.
        c                 S   s   d S N er   r   >lib/python3.9/site-packages/twisted/logger/test/test_legacy.py<lambda>"       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edddZejdd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   s    zHLegacyLogObserverWrapperTests.test_repr.<locals>.LegacyObserver.__repr__N)	eventDictr   c                 S   s   d S r   r   )r   r$   r   r   r   __call__3   s    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eventr   c                    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   r   z7LegacyLogObserverWrapperTests.observe.<locals>.<lambda>   r   )r   r   r   r   r,   len)r   r0   r   r    r   r2   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_level)
setdefaultr   r   infor6   dictitemsZassertIn)r   r0   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.
        r4   r   foobarN)rB   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.
        )r7   r   Nr   rB   r=   r,   r   Zstampr0   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.
        r4   )r7   r   r   NrG   rH   r   r   r   test_timeAlreadySets   s    z1LegacyLogObserverWrapperTests.test_timeAlreadySetc                 C   s$   |  tdd}| |d d dS )zg
        The new-style C{"log_system"} key is copied to the old-style
        C{"system"} key.
        rD   )r8   systemNrB   r=   r,   r   r0   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.
        rD   rE   )r8   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{"-"}.
        )r7   r:   rK   r9   N)r=   r   r   r<   r6   r,   )r   r0   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.
        r4   )r:   isErrorr   N)rB   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.
        )r:   logLevelN)rB   r=   r   r<   assertNotInrM   r   r   r   test_pythonLogLevelNotSet   s    	z7LegacyLogObserverWrapperTests.test_pythonLogLevelNotSetc                 C   s$   |  tdd}| |d d dS )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   s    z*LegacyLogObserverWrapperTests.test_messagec                 C   s$   |  tdd}| |d d dS )zV
        The old-style C{"message"} key is not modified if it already exists.
        rC   )r\   r\   NrL   rM   r   r   r   test_messageAlreadySet   s    z4LegacyLogObserverWrapperTests.test_messageAlreadySetc                 C   s(   |  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rB   r=   r,   r   textFromEventDictrM   r   r   r   test_format   s    z)LegacyLogObserverWrapperTests.test_formatc                 C   s(   |  tddd}| t|d dS )zo
        Using the message key, which is special in old-style, works for
        new-style formatting.
        zHello, {message}!r_   )r`   r\   ra   Nrb   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!)r`   formatNrb   rM   r   r   r   test_formatAlreadySet   s    z3LegacyLogObserverWrapperTests.test_formatAlreadySet)valuesr   c                 K   s&   t td}| tf |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_failurer`   )r
   RuntimeErrorrB   r=   )r   rh   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.
        rl   rj   rQ   whyri   N)rm   assertIsZ
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!)rl   rl   N)r
   rk   rm   ro   )r   rl   r0   r   r   r   test_failureAlreadySet   s    z4LegacyLogObserverWrapperTests.test_failureAlreadySetc                 C   s    | 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rm   r,   rM   r   r   r   test_isErrorAlreadySet  s    z4LegacyLogObserverWrapperTests.test_isErrorAlreadySetc                 C   s    | j dd}| |d d dS )rq   Zblah)rn   rn   Nrt   rM   r   r   r   test_whyAlreadySet  s    z0LegacyLogObserverWrapperTests.test_whyAlreadySet)r&   r'   r(   __doc__r!   r.   r   r6   rB   rF   rI   rJ   rN   rO   rP   rU   rX   r[   r]   r^   rd   re   rg   objectrm   rp   rr   ru   rv   r   r   r   r   r      s0   		


	r   c                   @   s   e Zd ZdZddddZeeej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 )PublishToNewObserverTestsz,
    Tests for L{publishToNewObserver}.
    Nr   c                 C   s   g | _ tt| j j| _d S r   )r3   r   r   r1   r    r"   r   r   r   setUp  s    zPublishToNewObserverTests.setUp)r\   rh   r   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   )r   getr   ZILogContextcopyupdater   )r   r\   rh   r0   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.
        r4   N)r   r    r~   r   rc   r,   r5   r3   r"   r   r   r   test_observed/  s    z'PublishToNewObserverTests.test_observedc                 C   s8   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   r7   r   Nr   r    r~   r   rc   r,   r3   r"   r   r   r   rI   8  s    z#PublishToNewObserverTests.test_timec                 C   sL   t td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/   c                 S   s   d td | d S )N  r\   )joinreversed)r0   r   r   r   rc   H  s    zAPublishToNewObserverTests.test_message.<locals>.textFromEventDictzHello,zworld!r   N)r   r)   r~   r   r    r,   r   r3   )r   rc   r0   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   r:   N)	r   r    r~   r   rc   r,   r3   r   r<   r"   r   r   r   test_defaultLogLevelQ  s    z.PublishToNewObserverTests.test_defaultLogLevelc                 C   s4   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}.
        r4   rs   r   r:   N)	r   r    r~   r   rc   r,   r3   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   r:   N)r   r    r~   
py_loggingrY   r   rc   r,   r3   r   rR   r"   r   r   r   test_stdlibLogLeveld  s    z-PublishToNewObserverTests.test_stdlibLogLevelc                 C   s4   t | j| jd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 string value, the new-style C{"log_level"} key should
        get set to the corresponding log level.
        rY   rZ   r   r:   N)	r   r    r~   r   rc   r,   r3   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   r:   r   N)r   r    r~   r   rc   rW   r3   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   s8   t | j|  tj | | jd d | jd d  dS )zg
        The old-style C{"system"} key is copied to the new-style
        C{"log_system"} key.
        r   r8   rK   Nr   r"   r   r   r   rN     s    z%PublishToNewObserverTests.test_system)r&   r'   r(   rw   rz   r)   rx   r   r*   r~   r   rI   r]   r   r   r   r   r   r   rN   r   r   r   r   ry     s   	
	

ry   )"rw   Z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   Z_formatr   Z_interfacesr   r   Z_legacyr   r   Z_levelsr   ZTestCaser   ry   r   r   r   r   <module>   s     }