
    Vh	9                        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ej>                        Z  G d dej>                        Z!y)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                       e Zd ZdZddZddZdedefdZdedefdZdd	Z	dd
Z
ddZddZddZddZddZddZddZddZddZddZddZddZdedefdZddZddZddZddZy)LegacyLogObserverWrapperTestsz0
    Tests for L{LegacyLogObserverWrapper}.
    returnNc                     t        t        j                  d       }t        |      }	 t	        t        |       y# t
        $ r}| j                  |       Y d}~yd}~ww xY w)zD
        L{LegacyLogObserverWrapper} is an L{ILogObserver}.
        c                      y N )es    O/home/dcms/DCMS/lib/python3.12/site-packages/twisted/logger/test/test_legacy.py<lambda>z>LegacyLogObserverWrapperTests.test_interface.<locals>.<lambda>"   s        N)r   	legacyLogr   r   r   r   fail)selflegacyObserverobserverr   s       r   test_interfacez,LegacyLogObserverWrapperTests.test_interface   sL     i44nE+N;	x0) 	IIaLL	s   9 	AAAc                     t        t        j                         G d d             }t         |             }| j	                  t        |      d       y)zJ
        L{LegacyLogObserverWrapper} returns the expected string.
        c                   <    e Zd ZdefdZdej                  ddfdZy)?LegacyLogObserverWrapperTests.test_repr.<locals>.LegacyObserverr   c                      y)Nz<Legacy Observer>r   r!   s    r   __repr__zHLegacyLogObserverWrapperTests.test_repr.<locals>.LegacyObserver.__repr__0   s    *r   	eventDictNc                      y r   r   )r!   r+   s     r   __call__zHLegacyLogObserverWrapperTests.test_repr.<locals>.LegacyObserver.__call__3   s    r   )__name__
__module____qualname__strr*   r   	EventDictr-   r   r   r   LegacyObserverr'   .   s'    +# +)*=*= $ r   r3   z+LegacyLogObserverWrapper(<Legacy Observer>)N)r   r   r   r   assertEqualrepr)r!   r3   r#   s      r   	test_reprz'LegacyLogObserverWrapperTests.test_repr)   sJ    
 
Y++	,	 	 
-	 ,N,<=h)VWr   eventc                     g t        t        j                  fd      }t        |      } ||       | j	                  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                 &    j                  |       S r   )append)r   eventss    r   r   z7LegacyLogObserverWrapperTests.observe.<locals>.<lambda>E   s    a@P r      r   )r   r   r   r   r4   len)r!   r7   r"   r#   r;   s       @r   observez%LegacyLogObserverWrapperTests.observe:   sL     "$i446PQ+N;Va(ayr   c                 &   |j                  dt                      |j                  dd       |j                  dt        j                         | j	                  t        |            }|j                         D ]  \  }}| j                  ||        |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   infor>   dictitemsassertIn)r!   r7   observedkeyvalues        r   forwardAndVerifyz.LegacyLogObserverWrapperTests.forwardAndVerifyL   s~     	TV,s+hmm4 <<U,  ++- 	)JCMM#x(	) r   c                 <    | j                  t        dd             y)ze
        Basic forwarding: event keys as observed by a legacy observer are the
        same.
        r<   r   foobarN)rL   rF   r)   s    r   test_forwardz*LegacyLogObserverWrapperTests.test_forwardc   s    
 	dqa01r   c                 x    t               }| j                  t        |            }| j                  |d   |       y)zc
        The new-style C{"log_time"} key is copied to the old-style C{"time"}
        key.
        )r@   r   Nr   rL   rF   r4   r!   stampr7   s      r   	test_timez'LegacyLogObserverWrapperTests.test_timej   s4    
 %%dE&:;v.r   c                     t               }| j                  t        |dz   |            }| j                  |d   |       y)zr
        The new-style C{"log_time"} key does not step on a pre-existing
        old-style C{"time"} key.
        r<   )r@   r   r   NrS   rT   s      r   test_timeAlreadySetz1LegacyLogObserverWrapperTests.test_timeAlreadySets   s:    
 %%dEAIE&JKv.r   c                 d    | j                  t        d            }| j                  |d   d       y)zg
        The new-style C{"log_system"} key is copied to the old-style
        C{"system"} key.
        rO   )rA   systemNrL   rF   r4   r!   r7   s     r   test_systemz)LegacyLogObserverWrapperTests.test_system|   s-    
 %%de&<=x%0r   c                 f    | j                  t        dd            }| j                  |d   d       y)zv
        The new-style C{"log_system"} key does not step on a pre-existing
        old-style C{"system"} key.
        rO   rP   )rA   rZ   rZ   Nr[   r\   s     r   test_systemAlreadySetz3LegacyLogObserverWrapperTests.test_systemAlreadySet   s/    
 %%deE&JKx%0r   c                     t        t               t        j                        }| j	                  t        |            }| j                  |d   d       y)zy
        If the new-style C{"log_system"} key is absent, the old-style
        C{"system"} key is set to C{"-"}.
        )r@   rC   rZ   rB   N)rF   r   r   rE   r>   r4   )r!   r7   rI   s      r   test_noSystemz+LegacyLogObserverWrapperTests.test_noSystem   s=     df><<U,(+S1r   c                 T   | j                  t        t        j                  d             | j                  t        t        j                  d             | j                  t        t        j
                  d             | j                  t        t        j                  d             y)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.
        r<   )rC   isErrorr   N)rL   rF   r   rE   warnerrorcriticalr)   s    r   test_levelNotChangez1LegacyLogObserverWrapperTests.test_levelNotChange   sj     	dX]]AFGdX]]AFGdX^^QGHdX->->JKr   c                 z    | j                  t        t        j                              }| j	                  d|       y)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.
        )rC   logLevelN)rL   rF   r   rE   assertNotInr\   s     r   test_pythonLogLevelNotSetz7LegacyLogObserverWrapperTests.test_pythonLogLevelNotSet   s-     %%dX]]&CDU+r   c                 d    | j                  t        d            }| j                  |d   d       y)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ri   ri   Nr[   r\   s     r   test_stringPythonLogLevelz7LegacyLogObserverWrapperTests.test_stringPythonLogLevel   s6     %%"

 	z*I6r   c                 `    | j                  t                     }| j                  |d   d       y)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   Nr[   r\   s     r   test_messagez*LegacyLogObserverWrapperTests.test_message   s+    
 %%df-y)2.r   c                 d    | j                  t        d            }| j                  |d   d       y)zV
        The old-style C{"message"} key is not modified if it already exists.
        rN   )rq   rq   Nr[   r\   s     r   test_messageAlreadySetz4LegacyLogObserverWrapperTests.test_messageAlreadySet   s.     %%d>&BCy)>:r   c                     | j                  t        dd            }| j                  t        j                  |      d       y)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_formatwhoHello, world!NrL   rF   r4   r   textFromEventDictr\   s     r   test_formatz)LegacyLogObserverWrapperTests.test_format   s6    
 %%do7&ST44U;_Mr   c                     | j                  t        dd            }| j                  t        j                  |      d       y)zo
        Using the message key, which is special in old-style, works for
        new-style formatting.
        zHello, {message}!rv   )rw   rq   ry   Nrz   r\   s     r   test_formatMessagez0LegacyLogObserverWrapperTests.test_formatMessage   s<    
 %%/A
 	44U;_Mr   c                     | j                  t        dd            }| j                  t        j                  |      d       y)zd
        Formatting is not altered if the old-style C{"format"} key already
        exists.
        zHello!zHowdy!)rw   formatNrz   r\   s     r   test_formatAlreadySetz3LegacyLogObserverWrapperTests.test_formatAlreadySet   s6    
 %%dhx&PQ44U;XFr   valuesc                 d    t        t        d            }| j                  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_failurerw   r   )r   RuntimeErrorrL   rF   )r!   r   failures      r   eventWithFailurez.LegacyLogObserverWrapperTests.eventWithFailure   s8     ,y12$$GWGG
 	
r   c                     | j                         }| j                  |d   |d          | j                  |d          | j                  |d   d       y)z}
        Captured failures in the new style set the old-style C{"failure"},
        C{"isError"}, and C{"why"} keys.
        r   r   rc   whyr   N)r   assertIs
assertTruer4   r\   s     r   test_failurez*LegacyLogObserverWrapperTests.test_failure   sO    
 %%'eI&m(<=i()u{3r   c                 z    t        t        d            }| j                  |      }| j                  |d   |       y)v
        Captured failures in the new style do not step on a pre-existing
        old-style C{"failure"} key.
        zWeak salsa!)r   r   N)r   r   r   r   )r!   r   r7   s      r   test_failureAlreadySetz4LegacyLogObserverWrapperTests.test_failureAlreadySet   s9    
 ,}56%%g%6eI&0r   c                 R    | j                  d      }| j                  |d   d       y)zv
        Captured failures in the new style do not step on a pre-existing
        old-style C{"isError"} key.
        r   rc   rc   Nr   r4   r\   s     r   test_isErrorAlreadySetz4LegacyLogObserverWrapperTests.test_isErrorAlreadySet  s,    
 %%a%0y)1-r   c                 R    | j                  d      }| j                  |d   d       y)r   blah)r   r   Nr   r\   s     r   test_whyAlreadySetz0LegacyLogObserverWrapperTests.test_whyAlreadySet  s+    
 %%&%1uv.r   r   N)r.   r/   r0   __doc__r$   r6   r   r>   rL   rQ   rV   rX   r]   r_   ra   rg   rk   ro   rr   rt   r|   r~   r   objectr   r   r   r   r   r   r   r   r   r      s    	X"X ( $h 8 .2//112	L
,7/;NNG
 
H 
41./r   r   c                       e Zd ZdZddZdededej                  fdZ	ddZ
dd	Zdd
ZddZddZddZddZddZddZddZy)PublishToNewObserverTestsz,
    Tests for L{publishToNewObserver}.
    r   Nc                 d    g | _         t        t        | j                   j                        | _        y r   )r;   r   r   r:   r#   r)   s    r   setUpzPublishToNewObserverTests.setUp  s!    &(\4;;+=+=>r   rq   r   c                     t        j                  t        j                        xs i j	                         }|j                  |       ||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
        rq   r   rc   r   )r	   getr   ILogContextcopyupdater   )r!   rq   r   r7   s       r   legacyEventz%PublishToNewObserverTests.legacyEvent  s^     Y2239r??AV"ifE! E)r   c                     t        | j                  | j                         t        j                         | j                  t        | j                        d       y)z6
        The observer is called exactly once.
        r<   N)r   r#   r   r   r{   r4   r=   r;   r)   s    r   test_observedz'PublishToNewObserverTests.test_observed/  sA     	MM4++-y/J/J	
 	T[[)1-r   c                     t        | j                  | j                         t        j                         | j                  | j                  d   d   | j                  d   d          y)zc
        The old-style C{"time"} key is copied to the new-style C{"log_time"}
        key.
        r   r@   r   Nr   r#   r   r   r{   r4   r;   r)   s    r   rV   z#PublishToNewObserverTests.test_time8  sR    
 	MM4++-y/J/J	
 	Q
3T[[^F5KLr   c                     dt         dt        fd}| j                  dd      } ||      }t        | j                  ||       | j                  t        | j                  d         |       y)z
        A published old-style event should format as text in the same way as
        the given C{textFromEventDict} callable would format it.
        r7   r   c                 Z    dj                  t        dj                  | d                     S )N  rq   )joinreversed)r7   s    r   r{   zAPublishToNewObserverTests.test_message.<locals>.textFromEventDictH  s$    778CHHU9-=$>?@@r   zHello,zworld!r   N)r   r1   r   r   r#   r4   r   r;   )r!   r{   r7   texts       r   rr   z&PublishToNewObserverTests.test_messageB  sd    	AX 	A# 	A   84 'T]]E3DET[[^4d;r   c                     t        | j                  | j                         t        j                         | j                  | j                  d   d   t        j                         y)zL
        Published event should have log level of L{LogLevel.info}.
        r   rC   N)	r   r#   r   r   r{   r4   r;   r   rE   r)   s    r   test_defaultLogLevelz.PublishToNewObserverTests.test_defaultLogLevelQ  sI     	MM4++-y/J/J	
 	Q4hmmDr   c                     t        | j                  | j                  d      t        j                         | j                  | j                  d   d   t        j                         y)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}.
        r<   r   r   rC   N)	r   r#   r   r   r{   r4   r;   r   rf   r)   s    r   test_isErrorz&PublishToNewObserverTests.test_isErrorZ  sP    
 	MM4++A+6	8S8S	
 	Q4h6G6GHr   c                     t        | j                  | j                  t        j                        t
        j                         | j                  | j                  d   d   t        j                         y)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.
        rn   r   rC   N)r   r#   r   
py_loggingrm   r   r{   r4   r;   r   rd   r)   s    r   test_stdlibLogLevelz-PublishToNewObserverTests.test_stdlibLogLeveld  sV     	MMj&8&89''	

 	Q4hmmDr   c                     t        | j                  | j                  d      t        j                         | j                  | j                  d   d   t        j                         y)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.
        rm   rn   r   rC   N)	r   r#   r   r   r{   r4   r;   r   rd   r)   s    r   test_stdlibLogLevelWithStringz7PublishToNewObserverTests.test_stdlibLogLevelWithStringq  sP     	MMi0''	

 	Q4hmmDr   c                     t        | j                  | j                  d      t        j                         | j                  d| j                  d          y)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!!!!!rn   rC   r   N)r   r#   r   r   r{   rj   r;   r)   s    r   test_stdlibLogLevelWithGarbagez8PublishToNewObserverTests.test_stdlibLogLevelWithGarbage~  sG     	MMj1''	

 	dkk!n5r   c                     t        | j                  | j                         t        j                         | j                  | j                  d   d   d       y)z
        Published event should have a namespace of C{"log_legacy"} to indicate
        that it was forwarded from legacy logging.
        r   log_namespace
log_legacyNr   r)   s    r   test_defaultNamespacez/PublishToNewObserverTests.test_defaultNamespace  sE    
 	MM4++-y/J/J	
 	Q8,Gr   c                     t        | j                  | j                         t        j                         | j                  | j                  d   d   | j                  d   d          y)zg
        The old-style C{"system"} key is copied to the new-style
        C{"log_system"} key.
        r   rA   rZ   Nr   r)   s    r   r]   z%PublishToNewObserverTests.test_system  sR    
 	MM4++-y/J/J	
 	Q5t{{1~h7OPr   r   )r.   r/   r0   r   r   r1   r   r   r2   r   r   rV   rr   r   r   r   r   r   r   r]   r   r   r   r   r     se    ?C 6 i>Q>Q ".M<EIEE6HQr   r   )"r   loggingr   r   typingr   r   zope.interfacer   zope.interface.exceptionsr   zope.interface.verifyr   twisted.pythonr	   r
   r   twisted.python.failurer   twisted.trialr   _formatr   _interfacesr   r   _legacyr   r   _levelsr   TestCaser   r   r   r   r   <module>r      s^       & @ . 4 * " ! 0 D y/H$5$5 y/xHQ 1 1 HQr   