Ϫf 9dZddlZddlmZddlmZmZddlmZddl m Z ddl m Z ddl mZmZdd lmZdd lmZd d lmZd d lmZmZd dlmZmZd dlmZGddej>Z Gddej>Z!y)z+ Test cases for L{twisted.logger._legacy}. N)time)Listcast) implementer)BrokenMethodImplementation) verifyObject)contextlog)Failure)unittest) formatEvent) ILogObserverLogEvent)LegacyLogObserverWrapperpublishToNewObserver)LogLevelceZdZdZddZddZdedefdZdedefdZdd Z dd Z dd Z dd Z dd Z ddZddZddZddZddZddZddZddZddZdedefdZddZddZddZddZy)LegacyLogObserverWrapperTestsz0 Tests for L{LegacyLogObserverWrapper}. returnNcttjd}t|} t t|y#t $r}|j |Yd}~yd}~wwxYw)zD L{LegacyLogObserverWrapper} is an L{ILogObserver}. cyN)es A/usr/lib/python3/dist-packages/twisted/logger/test/test_legacy.pyz>LegacyLogObserverWrapperTests.test_interface.."sN)r legacyLogrrrrfail)selflegacyObserverobserverrs rtest_interfacez,LegacyLogObserverWrapperTests.test_interfacesLi44nE+N;  x 0)  IIaLL s9 AAActtjGdd}t|}|j t |dy)zJ L{LegacyLogObserverWrapper} returns the expected string. c<eZdZdefdZdej ddfdZy)?LegacyLogObserverWrapperTests.test_repr..LegacyObserverrcy)Nzrr!s r__repr__zHLegacyLogObserverWrapperTests.test_repr..LegacyObserver.__repr__0s*r eventDictNcyrr)r!r+s r__call__zHLegacyLogObserverWrapperTests.test_repr..LegacyObserver.__call__3sr)__name__ __module__ __qualname__strr*r EventDictr-rrrLegacyObserverr'.s' +# + )*=*= $ rr3z+LegacyLogObserverWrapper()N)rrrr assertEqualrepr)r!r3r#s r test_reprz'LegacyLogObserverWrapperTests.test_repr)sJ Y++ ,   - ,N,<= h)VWreventcgttjfd}t|}|||j t ddS)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|Sr)append)reventss rrz7LegacyLogObserverWrapperTests.observe..Es a@Prr)rrrrr4len)r!r7r"r#r;s @robservez%LegacyLogObserverWrapperTests.observe:sL"$i446PQ+N; Va(ayrc&|jdt|jdd|jdtj|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) setdefaultrrinfor>dictitemsassertIn)r!r7observedkeyvalues rforwardAndVerifyz.LegacyLogObserverWrapperTests.forwardAndVerifyLs~ TV, s+ hmm4<<U , ++- )JC MM#x ( )rc<|jtddy)ze Basic forwarding: event keys as observed by a legacy observer are the same. r<r foobarN)rLrFr)s r test_forwardz*LegacyLogObserverWrapperTests.test_forwardcs dqa01rcxt}|jt|}|j|d|y)zc The new-style C{"log_time"} key is copied to the old-style C{"time"} key. )r@rNrrLrFr4r!stampr7s r test_timez'LegacyLogObserverWrapperTests.test_timejs4 %%dE&:; v.rct}|jt|dz|}|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@rrNrSrTs rtest_timeAlreadySetz1LegacyLogObserverWrapperTests.test_timeAlreadySetss: %%dEAIE&JK v.rcd|jtd}|j|ddy)zg The new-style C{"log_system"} key is copied to the old-style C{"system"} key. rO)rAsystemNrLrFr4r!r7s r test_systemz)LegacyLogObserverWrapperTests.test_system|s- %%de&<= x%0rcf|jtdd}|j|ddy)zv The new-style C{"log_system"} key does not step on a pre-existing old-style C{"system"} key. rOrP)rArZrZNr[r\s rtest_systemAlreadySetz3LegacyLogObserverWrapperTests.test_systemAlreadySets/ %%deE&JK x%0rctttj}|j t|}|j |ddy)zy If the new-style C{"log_system"} key is absent, the old-style C{"system"} key is set to C{"-"}. )r@rCrZrBN)rFrrrEr>r4)r!r7rIs r test_noSystemz+LegacyLogObserverWrapperTests.test_noSystems= df ><<U , (+S1rcT|jttjd|jttjd|jttj d|jttj dy)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<)rCisErrorrN)rLrFrrEwarnerrorcriticalr)s rtest_levelNotChangez1LegacyLogObserverWrapperTests.test_levelNotChangesj dX]]AFG dX]]AFG dX^^QGH dX->->JKrcz|jttj}|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. )rClogLevelN)rLrFrrE assertNotInr\s rtest_pythonLogLevelNotSetz7LegacyLogObserverWrapperTests.test_pythonLogLevelNotSets-%%dX]]&CD U+rcd|jtd}|j|ddy)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. WARNINGririNr[r\s rtest_stringPythonLogLevelz7LegacyLogObserverWrapperTests.test_stringPythonLogLevels6%% "   z*I6rc`|jt}|j|ddy)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. messagerNr[r\s r test_messagez*LegacyLogObserverWrapperTests.test_messages+ %%df- y)2.rcd|jtd}|j|ddy)zV The old-style C{"message"} key is not modified if it already exists. rN)rqrqNr[r\s rtest_messageAlreadySetz4LegacyLogObserverWrapperTests.test_messageAlreadySets.%%d>&BC y)>:rc|jtdd}|jtj|dy)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_formatwho Hello, world!NrLrFr4rtextFromEventDictr\s r test_formatz)LegacyLogObserverWrapperTests.test_formats6 %%do7&ST 44U;_Mrc|jtdd}|jtj|dy)zo Using the message key, which is special in old-style, works for new-style formatting. zHello, {message}!rv)rwrqryNrzr\s rtest_formatMessagez0LegacyLogObserverWrapperTests.test_formatMessages< %% / A  44U;_Mrc|jtdd}|jtj|dy)zd Formatting is not altered if the old-style C{"format"} key already exists. zHello!zHowdy!)rwformatNrzr\s rtest_formatAlreadySetz3LegacyLogObserverWrapperTests.test_formatAlreadySets6 %%dhx&PQ 44U;XFrvaluesc dttd}|jtd|dd|S)z Create a new-style event with a captured failure. @param values: Additional values to include in the event. @return: the new event znyargh! oopsie...) log_failurerwr)r RuntimeErrorrLrF)r!rfailures reventWithFailurez.LegacyLogObserverWrapperTests.eventWithFailures8,y12$$  GW G G  rc|j}|j|d|d|j|d|j|ddy)z} Captured failures in the new style set the old-style C{"failure"}, C{"isError"}, and C{"why"} keys. rrrcwhyrN)rassertIs assertTruer4r\s r test_failurez*LegacyLogObserverWrapperTests.test_failuresO %%' eI&m(<= i() u{3rczttd}|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!)rrN)r rrr)r!rr7s rtest_failureAlreadySetz4LegacyLogObserverWrapperTests.test_failureAlreadySets9 ,}56%%g%6 eI&0rcR|jd}|j|ddy)zv Captured failures in the new style do not step on a pre-existing old-style C{"isError"} key. rrcrcNrr4r\s rtest_isErrorAlreadySetz4LegacyLogObserverWrapperTests.test_isErrorAlreadySets, %%a%0 y)1-rcR|jd}|j|ddy)rblah)rrNrr\s rtest_whyAlreadySetz0LegacyLogObserverWrapperTests.test_whyAlreadySet s+ %%&%1 uv.rrN)r.r/r0__doc__r$r6rr>rLrQrVrXr]r_rargrkrorrrtr|r~robjectrrrrrrrrrrs X"X($h8.2//112 L , 7/;NNG    H  41./rrceZdZdZddZdededejfdZ ddZ dd Z dd Z dd Z dd Zdd ZddZddZddZddZy)PublishToNewObserverTestsz, Tests for L{publishToNewObserver}. rNcdg|_tt|jj|_yr)r;rrr:r#r)s rsetUpzPublishToNewObserverTests.setUps!&( \4;;+=+=> rrqrctjtjxsij }|j |||d<t |d<d|vrd|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 rqrrcr)r getr ILogContextcopyupdater)r!rqrr7s r legacyEventz%PublishToNewObserverTests.legacyEvents^Y2239r??A V"if E ! E)  rct|j|jtj|j t |jdy)z6 The observer is called exactly once. r<N)rr#rrr{r4r=r;r)s r test_observedz'PublishToNewObserverTests.test_observed/sA  MM4++-y/J/J  T[[)1-rct|j|jtj|j |j dd|j ddy)zc The old-style C{"time"} key is copied to the new-style C{"log_time"} key. rr@rNrr#rrr{r4r;r)s rrVz#PublishToNewObserverTests.test_time8sR  MM4++-y/J/J  Q 3T[[^F5KLrcdtdtfd}|jdd}||}t|j|||j t |jd|y)z A published old-style event should format as text in the same way as the given C{textFromEventDict} callable would format it. r7rcZdjtdj|dS)N rq)joinreversed)r7s rr{zAPublishToNewObserverTests.test_message..textFromEventDictHs$778CHHU9-=$>?@ @rzHello,zworld!rN)rr1rrr#r4rr;)r!r{r7texts rrrz&PublishToNewObserverTests.test_messageBsd  AX A# A  84 'T]]E3DE T[[^4d;rct|j|jtj|j |j ddtjy)zL Published event should have log level of L{LogLevel.info}. rrCN) rr#rrr{r4r;rrEr)s rtest_defaultLogLevelz.PublishToNewObserverTests.test_defaultLogLevelQsI  MM4++-y/J/J  Q 4hmmDrct|j|jdtj|j |j ddtjy)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<rrrCN) rr#rrr{r4r;rrfr)s r test_isErrorz&PublishToNewObserverTests.test_isErrorZsP  MM4++A+6 8S8S  Q 4h6G6GHrct|j|jtjt j |j|jddtjy)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. rnrrCN) rr#r py_loggingrmrr{r4r;rrdr)s rtest_stdlibLogLevelz-PublishToNewObserverTests.test_stdlibLogLeveldsV  MM   j&8&8  9  ' ' Q 4hmmDrct|j|jdtj|j |j ddtjy)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. rmrnrrCN) rr#rrr{r4r;rrdr)s rtest_stdlibLogLevelWithStringz7PublishToNewObserverTests.test_stdlibLogLevelWithStringqsP  MM   i  0  ' ' Q 4hmmDrct|j|jdtj|j d|j dy)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. zFoo!!!!!rnrCrN)rr#rrr{rjr;r)s rtest_stdlibLogLevelWithGarbagez8PublishToNewObserverTests.test_stdlibLogLevelWithGarbage~sG  MM   j  1  ' ' dkk!n5rct|j|jtj|j |j dddy)z Published event should have a namespace of C{"log_legacy"} to indicate that it was forwarded from legacy logging. r log_namespace log_legacyNrr)s rtest_defaultNamespacez/PublishToNewObserverTests.test_defaultNamespacesE  MM4++-y/J/J  Q8,Grct|j|jtj|j |j dd|j ddy)zg The old-style C{"system"} key is copied to the new-style C{"log_system"} key. rrArZNrr)s rr]z%PublishToNewObserverTests.test_systemsR  MM4++-y/J/J  Q 5t{{1~h7OPrr)r.r/r0rrr1rrr2rrrVrrrrrrrrr]rrrrrse?C6i>Q>Q".M <EI E E 6HQrr)"rloggingrrtypingrrzope.interfacerzope.interface.exceptionsrzope.interface.verifyrtwisted.pythonr r rtwisted.python.failurer twisted.trialr _formatr _interfacesrr_legacyrr_levelsrTestCaserrrrrrs^&@.4*"!0Dy/H$5$5y/xHQ 1 1HQr