
    h|                       S r SSKJr  SSKrSSKrSSKrSSKrSSKrSSKrSSK	J
r
Jr  SSKJrJr  SSKJr  SSKJr  SSKJrJrJrJrJr  SS	KJr  SS
KJrJr  SSK Jr  SSK!J"r"   " S S\#5      r$ " S S\"RJ                  5      r& " S S\"RJ                  5      r' " S S\\(   5      r)\
RT                  " \)5         " S S5      r+ " S S5      r, " S S\+\,5      r- " S S\5      r. " S S5      r/ " S S \/\"RJ                  5      r0 " S! S"\/\"RJ                  5      r1 " S# S$\"RJ                  5      r2 " S% S&\"RJ                  5      r3 " S' S(\"RJ                  5      r4 " S) S*\"RJ                  5      r5g)+z"
Tests for L{twisted.python.log}.
    )annotationsN)IOBaseStringIO)CallableList)implementer)Protocol)ILogObserverLogBeginnerLoggingFileLogLevelLogPublisher)handlerAndBytesIO)failurelog)r   )unittestc                      \ rS rSrSrSrg)FakeWarning#   zs
A unique L{Warning} subclass used by tests for interactions of
L{twisted.python.log} with the L{warnings} module.
 N)__name__
__module____qualname____firstlineno____doc____static_attributes__r       \/root/1688_scrapy/alibaba-scraper/venv/lib/python3.13/site-packages/twisted/test/test_log.pyr   r   #   s    r   r   c                  T    \ rS rSrSrSS jrSS jrSS jrSS jrSS jr	SS jr
S	rg
)TextFromEventDictTests*   z!
Tests for L{textFromEventDict}.
c                f    [        SS9n[        R                  " U5      nU R                  US5        g)zR
The C{"message"} value, when specified, is concatenated to generate the
message.
)abc)messageza b cNdictr   textFromEventDictassertEqualself	eventDicttexts      r   test_message#TextFromEventDictTests.test_message/   s.    
 1	$$Y/w'r   c                l    [        SSSSS9n[        R                  " U5      nU R                  US5        g)zG
The C{"format"} value, when specified, is used to format the message.
r   r   zHello, %(foo)s!dude)r&   isErrorformatfoozHello, dude!Nr'   r+   s      r   test_format"TextFromEventDictTests.test_format8   s5     Q7HfU	$$Y/~.r   c                f    [        SSS9n[        R                  " U5      nU R                  U5        g)zJ
If C{"format"} is unspecified and C{"message"} is empty, return
L{None}.
r   r   r&   r3   N)r(   r   r)   assertIsNoner+   s      r   test_noMessageNoFormat-TextFromEventDictTests.test_noMessageNoFormat@   s.    
 Q/	$$Y/$r   c                     [        5       e! [         a]    [        SS[        R                  " 5       SS9n[
        R                  " U5      nUc   eU R                  UR                  S5      5         gf = f)z?
The C{"why"} value, when specified, is first part of message.
r      r5   )r&   r3   r   whyNzfoo
	RuntimeErrorBaseExceptionr(   r   Failurer   r)   
assertTrue
startswithr+   s      r   test_whySpecified(TextFromEventDictTests.test_whySpecifiedI   sk    	6.  	6Aw/@eI ((3D###OODOOG45	6s   
 A$A32A3c                     [        5       e! [         a\    [        SS[        R                  " 5       S9n[
        R                  " U5      nUc   eU R                  UR                  S5      5         gf = f)zI
The C{"why"} value, when unspecified, defaults to C{"Unhandled Error"}.
r   r>   r&   r3   r   NzUnhandled Error
r@   r+   s      r   test_whyDefault&TextFromEventDictTests.test_whyDefaultW   sh    	B.  	BRGOO<MNI((3D###OODOO,?@A		Bs   
 A#A21A2c                z    [        SS[        5       S9n[        R                  " U5      nU R	                  SU5        g)zS
If unable to obtain a traceback due to an exception, catch it and note
the error.
r   r>   rI   z
(unable to obtain traceback)N)r(   objectr   r)   assertInr+   s      r   test_noTracebackForYou-TextFromEventDictTests.test_noTracebackForYouc   s3     QA	$$Y/6=r   r   NreturnNone)r   r   r   r   r   r/   r6   r;   rF   rJ   rO   r   r   r   r   r    r    *   s&    (/ 6
B>r   r    c                  n    \ rS rSrSS jrSS jrSS jrSS jrSS jrSS jr	SS jr
SS	 jrSS
 jrSrg)LogTestsn   c                    / U l         U R                   R                  U l        [        R                  " U R                  5        U R                  [        R                  U R                  5        g N)catcherappendobserverr   addObserver
addCleanupremoveObserverr,   s    r   setUpLogTests.setUpo   sB    ,.++&**DMM:r   c                   U R                   n[        R                  " SSS9  UR                  5       nU R	                  US   S   S5        U R                  US   5        U R                  SU5        U R	                  [        U5      S5        g )NtestT)testShouldCatchr&   r   rd   time)rY   r   msgpopr*   rD   rN   lenr,   rY   is      r   testObservationLogTests.testObservationu   sp    ,,-KKM9a&1+,-fa Wq)r   c           	     `   U R                   n[        R                  " SSSS.[        R                  SS0[        R                  SSS	9  UR	                  5       nU R                  US   S5        U R                  US
   S5        U R                  US   S5        U R                  US   S   S5        g )Nznot the defaultr#   r%   )	subsystemsubsubsystemotherro   r$   r5   d)rp   rn   rp   r&   r   )rY   r   callWithContextrf   rg   r*   ri   s      r   testContextLogTests.testContext~   s    ,,+S3OS!GG	
 KKM>*C0;):;7S)9a%0r   c                ,   S[        5       [         4[        R                  " [        5       5      [        44 H[  u  p[        R
                  " U5        U R                  R                  5       nU R                  US   S5        U R                  U5        M]     g )Nhello worldrw   r3   r>   
KeyErrorr   rC   rA   r   errrY   rg   r*   flushLoggedErrorsr,   eigrj   s       r   
testErrorsLogTests.testErrors   sq    *Z"__\^,l;
EA
 GGAJ  "AQy\1-""2&
r   c                X   S[        5       [         4[        R                  " [        5       5      [        44 Hq  u  p[        R
                  " US5        U R                  R                  5       nU R                  US   S5        U R                  US   S5        U R                  U5        Ms     g )Nrv   foobarr3   r>   r?   rx   r|   s       r   testErrorsWithWhyLogTests.testErrorsWithWhy   s    *Z"__\^,l;
EA
 GGAx   "AQy\1-QuXx0""2&
r   c                l   / n/ nSS jnUR                   X2R                   4 H9  n[        R                  " U5        U R                  [        R                  U5        M;     [        S5       H  n/ USS& / USS& [        R                  " S/ S9  U R                  [        5      nU R                  SS2	 U R                  [        U5      S5        U R                  [        U5      S5        U R                  [        U5      S5        U R                  US   S	   S
5        U R                  US   S	   S
5        M     g)z
Exceptions raised by log observers are logged but the observer which
raised the exception remains registered with the publisher.  These
exceptions do not prevent the event from being sent to other observers
registered with the publisher.
c                    SS-    g Nr>   r   r   )events    r   broken-LogTests.test_erroneousErrors.<locals>.broken   s	    Fr      NHowdy, y'all.)	log_tracer>      r   r&   )r   r   log.EventDictrR   rS   )rZ   r   r\   r]   r^   rangerf   r{   ZeroDivisionErrorrY   r*   rh   )r,   L1L2r   r[   rj   excss          r   test_erroneousErrorsLogTests.test_erroneousErrors   s    #%"$	 FII6HOOH%OOC..9 7 qABqEBqE GGOr2 ))*;<DQSY* SWa(SWa( RU9-/ABRU9-/AB) r   c                .   [         R                  " 5       nUR                  U R                  5        UR	                  [        S5      [
        SS5        U R                  R                  5       nU R                  US   U-  S5        U R                  U R                  / 5        UR	                  [        S5      [
        SS[        5       S9  U R                  R                  5       nU R                  US   U-  S5        U R                  U R                  / 5        g)za
L{twisted.python.log.showwarning} emits the warning as a message
to the Twisted logging system.
zunique warning messagewarning-filename.py   r4   zQwarning-filename.py:27: twisted.test.test_log.FakeWarning: unique warning message)lineN)
r   r   r\   r[   showwarningr   rY   rg   r*   rM   )r,   	publisherr   s      r   test_showwarningLogTests.test_showwarning   s   
 $$&	dmm,01!		
   "(Oe#%	

 	r*
 	01! 	 	
   "(Oe#%	

 	r*r   c           
     v   Sn[         nSnSn[        5       n[        R                  " XX4US9  U R	                  UR                  5       [        R                  " XX45      5        Sn[        5       n[        R                  " XX4XVS9  U R	                  UR                  5       [        R                  " XX4U5      5        g)z|
L{twisted.python.log.showwarning} passes warnings with an explicit file
target on to the underlying Python warning system.
zanother unique messager      filerw   )r   r   N)r   r   r   r   r*   getvaluewarningsformatwarning)r,   r&   categoryfilenamelinenooutputr   s          r   test_warningToFileLogTests.test_warningToFile   s    
 +(8&IOO""7hG	
 8&TOO""7hM	
r   c                h  ^ / mSU4S jjnSS jn[         R                  " 5       nUR                  U5        UR                  U5        UR                  S5        U R	                  [        UR                  5      X15        U R	                  [        T5      S5        U R                  TS   [        5        g)zS
Log publisher does not use the global L{log.err} when reporting broken
observers.
c                p   > U R                  S5      (       a  TR                  U S   R                  5        g g Nr3   r   )getrZ   value)r-   errorss    r   logErrorHLogTests.test_publisherReportsBrokenObserversPrivately.<locals>.logError  s.    }}Y''i	2889 (r   c                    [        S5      e)N*test_publisherLocalyReportsBrokenObservers)rA   r-   s    r   failDLogTests.test_publisherReportsBrokenObserversPrivately.<locals>.fail  s    KLLr   Hello!r>   r   Nr-   r   rR   rS   )
r   r   r\   rf   r*   set	observersrh   assertIsInstancerA   )r,   r   r   r   r   s       @r   -test_publisherReportsBrokenObserversPrivately6LogTests.test_publisherReportsBrokenObserversPrivately  s    
 	:	M $$&	h'd#hY001H3CDVa(fQi6r   rY   r[   NrQ   )r   r   r   r   r`   rk   rs   r   r   r   r   r   r   r   r   r   r   rU   rU   n   s2    ;*1 	'
'%CN&+P
<7r   rU   c                  (    \ rS rSrSS jrSS jrSrg)FakeFilei*  c                &    U R                  U5        g rX   rZ   )r,   bytess     r   writeFakeFile.write+  s    Er   c                    g rX   r   r_   s    r   flushFakeFile.flush.  s    r   r   N)r   r   rR   rS   rQ   )r   r   r   r   r   r   r   r   r   r   r   r   *  s    r   r   c                      \ rS rSrSS jrSrg)EvilStri5  c                    [        SS-  5      $ r   strr_   s    r   __str__EvilStr.__str__6      16{r   r   NrR   r   )r   r   r   r   r   r   r   r   r   r   r   5  s    r   r   c                  (    \ rS rSrSS jrSS jrSrg)EvilRepri:  c                    g)NzHappy Evil Reprr   r_   s    r   r   EvilRepr.__str__;  s     r   c                    [        SS-  5      $ r   r   r_   s    r   __repr__EvilRepr.__repr__>  r   r   r   Nr   )r   r   r   r   r   r   r   r   r   r   r   r   :  s    !r   r   c                      \ rS rSrSrg)EvilReprStriB  r   N)r   r   r   r   r   r   r   r   r   r   B  s    r   r   c                  :    \ rS rSr% S\S'           SS jrSrg)_LogPublisherTestCaseMixinBaseiF  r   outc                    g rX   r   )r,   instanceclassOrTupler&   s       r   r   /_LogPublisherTestCaseMixinBase.assertIsInstanceI  s     	r   r   N)r   rM   r   typer&   r   rR   rS   )r   r   r   r   __annotations__r   r   r   r   r   r   r   F  s,    	M.2=@	r   r   c                  (    \ rS rSrSS jrSS jrSrg)LogPublisherTestCaseMixiniO  c                    [        5       U l        [        R                  " 5       U l        [        R
                  " U R                  5      U l        U R                  R                  U R                  R                  5        g)z
Add a log observer which records log events in C{self.out}.  Also,
make sure the default string encoding is ASCII so that
L{testSingleUnicode} can test the behavior of logging unencodable
unicode messages.
N)	r   r   r   r   lpFileLogObserverflor\   emitr_   s    r   r`   LogPublisherTestCaseMixin.setUpP  sM     :""$&&txx0DHHMM*r   c                `    U R                    H  nU R                  U[        U< S35        M      g)z
Verify that everything written to the fake file C{self.out} was a
C{str}.  Also, restore the default string encoding to its previous
setting, if it was modified by L{setUp}.
z was not a stringN)r   r   r   )r,   chunks     r   tearDown"LogPublisherTestCaseMixin.tearDown\  s,     XXE!!%	9J.KL r   )r   r   r   NrQ   )r,   r   rR   rS   )r   r   r   r   r`   r   r   r   r   r   r   r   O  s    
+Mr   r   c                  2    \ rS rSrSS jrSS jrSS jrSrg)LogPublisherTestsif  c                    U R                   R                  S5        U R                  [        U R                  5      S5        g )NHello, world.r>   r   rf   r*   rh   r   r_   s    r   testSingleString"LogPublisherTests.testSingleStringg  s*    O$TXX*r   c                    U R                   R                  SS5        U R                  [        U R                  5      S5        g )NzHello, zworld.r>   r   r_   s    r   testMultipleString$LogPublisherTests.testMultipleStringk  s.     	Ix(TXX*r   c                    SnU R                   R                  U5        U R                  [        U R                  5      S5        U R                  XR                  S   5        g)z
L{log.LogPublisher.msg} does not accept non-ASCII Unicode on Python 2,
logging an error instead.

On Python 3, where Unicode is default message type, the message is
logged normally.
   Hello, ½ world.r>   r   N)r   rf   r*   rh   r   rN   )r,   r&   s     r   test_singleUnicode$LogPublisherTests.test_singleUnicoder  sE     ?GTXX*gxx{+r   r   NrQ   )r   r   r   r   r   r   r   r   r   r   r   r   r   f  s    ++,r   r   c                      \ rS rSrSrSrSrSrSrSr	Sr
S	r        S"S
 jrS#S jrS#S jrS#S jrS#S jrS#S jrS#S jrS#S jrS#S jrS#S jrS#S jrS#S jrS#S jrS#S jrS#S jrS#S jrS#S jrS#S jrS#S jrS#S jrS#S jr S#S jr!S r"g!)$FileObserverTestsi  z 
Tests for L{log.FileObserver}.
zInvalid format stringzUNFORMATTABLE OBJECTz<Invalid format string or unformattable object in log messagezPATHOLOGICAL ERRORzUnable to format eventz[UNFORMATTABLE]z)MESSAGE LOST: unformattable object loggedc                   [        [        SS5      c  [        R                  " S5      e[        R
                  R                  SS5      n U[        R
                  S'   [        R                  " 5         Sn[        R                  " U5      nSn [        R                  " U5      nU R                  U R                  R                  U5      U R                  R                  U5      4X#45        Uc  [        R
                  S	 OU[        R
                  S'   [        R                  " 5         g! [         a    X#:X  a  Un Ne f = f! Uc  [        R
                  S	 OU[        R
                  S'   [        R                  " 5         f = f)a  
Verify that L{getTimezoneOffset} produces the expected offset for a
certain timezone both when daylight saving time is in effect and when
it is not.

@param tzname: The name of a timezone to exercise.
@type tzname: L{bytes}

@param daylightOffset: The number of seconds west of UTC the timezone
    should be when daylight saving time is in effect.
@type daylightOffset: L{int}

@param standardOffset: The number of seconds west of UTC the timezone
    should be when daylight saving time is not in effect.
@type standardOffset: L{int}
tzsetNzWPlatform cannot change timezone, cannot verify correct offsets in well-known timezones.TZ)	i  r>   r   r   r   r   r   r   r   )	i        r   r   r         r>   )getattrre   r   SkipTestosenvironr   r  mktimeOverflowErrorr*   r   getTimezoneOffset)	r,   tznamedaylightOffsetstandardOffsetoriginalTimezonelocalStandardTuplestandardlocalDaylightTupledaylights	            r   _getTimezoneOffsetTest(FileObserverTests._getTimezoneOffsetTest  sL   & 4$'/##3 
 ::>>$5*	%BJJtJJL "B{{#56H "C;;'9: HH..x8HH..x8  0  'JJt$#3

4 JJL1 ! 
 "3'H
(  'JJt$#3

4 JJLs2   
AE  D( #AE  (D=9E  ;D==E   ?E?c                *    U R                  SSS5        g)z
Attempt to verify that L{FileLogObserver.getTimezoneOffset} returns
correct values for the current C{TZ} environment setting for at least
some cases.  This test method exercises a timezone that is west of UTC
(and should produce positive results).
zAmerica/New_Yorki@8  PF  Nr  r_   s    r   test_getTimezoneOffsetWestOfUTC1FileObserverTests.test_getTimezoneOffsetWestOfUTC  s     	##$6uEr   c                *    U R                  SSS5        g)z
Attempt to verify that L{FileLogObserver.getTimezoneOffset} returns
correct values for the current C{TZ} environment setting for at least
some cases.  This test method exercises a timezone that is east of UTC
(and should produce negative results).
zEurope/BerlinNr  r_   s    r   test_getTimezoneOffsetEastOfUTC1FileObserverTests.test_getTimezoneOffsetEastOfUTC  s     	##OUEBr   c                *    U R                  SSS5        g)a6  
Attempt to verify that L{FileLogObserver.getTimezoneOffset} returns
correct values for the current C{TZ} environment setting for at least
some cases.  This test method exercises a timezone that does not use
daylight saving time at all (so both summer and winter time test values
should have the same offset).
zAfrica/Johannesburgr!  Nr  r_   s    r   /test_getTimezoneOffsetWithoutDaylightSavingTimeAFileObserverTests.test_getTimezoneOffsetWithoutDaylightSavingTime  s     	##$95%Hr   c                   [         R                  " S5      nS U R                  l        U R	                  U R                  R                  U5      S5        S U R                  l        U R	                  U R                  R                  U5      S5        S U R                  l        U R	                  U R                  R                  U5      S5        S U R                  l        U R	                  U R                  R                  U5      S	5        S
 U R                  l        U R	                  U R                  R                  U5      S5        S U R                  l        U R	                  U R                  R                  U5      S5        S U R                  l        U R	                  U R                  R                  U5      S5        SU R                  l        U R	                  U R                  R                  U5      S5        g)z]
Test the method of L{FileLogObserver} which turns a timestamp into a
human-readable string.
)	i  r   r   r     r        r   c                    g)Nr  r   whens    r   <lambda>7FileObserverTests.test_timeFormatting.<locals>.<lambda>      %r   z2001-02-02 23:05:06-0500c                    g)Nr"  r   r-  s    r   r/  r0     r1  r   z2001-02-03 05:05:06+0100c                    g)NiPer   r-  s    r   r/  r0    s    &r   z2001-02-03 15:05:06+1100c                    g)Ni  r   r-  s    r   r/  r0        $r   z2001-02-03 02:35:06-0130c                    g)Nir   r-  s    r   r/  r0    r1  r   z2001-02-03 05:35:06+0130c                    g)Ni  r   r-  s    r   r/  r0    r5  r   z2001-02-03 03:35:06-0030c                    g)Nir   r-  s    r   r/  r0    r1  r   z2001-02-03 04:35:06+0030z%Y %mz2001 02N)calendartimegmr   r  r*   
formatTime
timeFormat)r,   r.  s     r   test_timeFormatting%FileObserverTests.test_timeFormatting  s   
 => &8",,T24NO &8",,T24NO &9",,T24NO &7",,T24NO &8",,T24NO &7",,T24NO &8",,T24NO &,,T2I>r   c                |    SU R                   l        U R                  SU R                   R                  S5      5        g)z
L{FileLogObserver.formatTime} supports a value of C{timeFormat} which
includes C{"%f"}, a L{datetime}-only format specifier for microseconds.
z%f600000gm@N)r   r<  r*   r;  r_   s    r   #test_microsecondTimestampFormatting5FileObserverTests.test_microsecondTimestampFormatting  s/    
 #488#6#6x#@Ar   c                    U R                   R                  [        5       5        U R                  [	        U R
                  5      S5        U R                  U R                  U R
                  S   5        g r   )r   rf   r   r*   rh   r   assertNotInERROR_UNFORMATTABLE_OBJECTr_   s    r   %test_loggingAnObjectWithBroken__str__7FileObserverTests.test_loggingAnObjectWithBroken__str__'  sJ    GITXX*88$((1+Fr   c                    U R                   R                  S[        5       S9  U R                  [	        U R
                  5      S5        U R                  U R                  U R
                  S   5        g Nz%(blat)sr4   blatr>   r   )r   rf   r   r*   rh   r   rN   ERROR_INVALID_FORMATr_   s    r   (test_formattingAnObjectWithBroken__str__:FileObserverTests.test_formattingAnObjectWithBroken__str__.  sL    :GI6TXX*d//!=r   c                    U R                   R                  S[        5       S9  U R                  [	        U R
                  5      S5        U R                  U R                  U R
                  S   5        g Nhuh)systemr>   r   )r   rf   r   r*   rh   r   rN   ERROR_FORMATr_   s    r   test_brokenSystem__str__*FileObserverTests.test_brokenSystem__str__3  sL    E'),TXX*d''!5r   c                    U R                   R                  S[        5       /S9  U R                  [	        U R
                  5      S5        U R                  U R                  U R
                  S   5        g rI  r   rf   r   r*   rh   r   rN   rE  r_   s    r   1test_formattingAnObjectWithBroken__repr__IndirectCFileObserverTests.test_formattingAnObjectWithBroken__repr__Indirect8  sN    :XZL9TXX*d55txx{Cr   c                    U R                   R                  S[        5       /S9  U R                  [	        U R
                  5      S5        U R                  U R                  U R
                  S   5        g rP  rW  r_   s    r   %test_systemWithBroker__repr__Indirect7FileObserverTests.test_systemWithBroker__repr__Indirect=  sN    E8:,/TXX*d55txx{Cr   c                    U R                   R                  SSS9  U R                  [        U R                  5      S5        U R                  U R                  U R                  S   5        g )Nz
hooj %s %sr>   rJ  r   r   rf   r*   rh   r   rN   rL  r_   s    r   test_simpleBrokenFormat)FileObserverTests.test_simpleBrokenFormatB  sJ    <a0TXX*d//!=r   c                    U R                   R                  SSS9  U R                  [        U R                  5      S5        U R                  U R                  U R                  S   5        g )Nr!   r>   rJ  r   r^  r_   s    r   test_ridiculousFormat'FileObserverTests.test_ridiculousFormatG  sJ    2A&TXX*d//!=r   c                    U R                   R                  [        5       SS9  U R                  [	        U R
                  5      S5        U R                  U R                  U R
                  S   5        g )Nr>   rJ  r   )r   rf   r   r*   rh   r   rN   ERROR_PATHOLOGICALr_   s    r   !test_evilFormat__repr__And__str__3FileObserverTests.test_evilFormat__repr__And__str__L  sL    ;=q1TXX*d--txx{;r   c                    U R                   R                  SSS9  U R                  [        U R                  5      S5        g)z@
This kind of eventDict used to fail silently, so test it does.
 Fr9   r   Nr   r_   s    r   test_strangeEventDict'FileObserverTests.test_strangeEventDictQ  s0     	B.TXX*r   c                    U R                  [        R                  R                  5        U R                  [        [
        S[
        R                  5        U R                  [        [
        S[
        R                  5        g)zU
Cleanup after a startLogging() call that mutates the hell out of some
global state.
stdoutstderrN)r]   r   theLogPublisher_stopLoggingsetattrsysrm  rn  r_   s    r   _startLoggingCleanup&FileObserverTests._startLoggingCleanupX  sH    
 	++889h

;h

;r   c                  ^ U R                  5         [        5       n[        R                  " U5        SU4S jjn/ m[        R                  " U5        [        S[        R                  S9  U R                  TS   S   S5        g)	z[
startLogging()'s overridden sys.stderr should consider everything
written to it an error.
c                (   > TR                  U 5        g rX   r   )r   observeds    r   observe@FileObserverTests.test_printToStderrSetsIsError.<locals>.observej  s    OOE"r   r   r   r   r3   r>   Nr   )	rs  r   r   startLoggingr\   printrr  rn  r*   )r,   fakeFilerx  rw  s      @r   test_printToStderrSetsIsError/FileObserverTests.test_printToStderrSetsIsErrora  se    
 	!!#:"	# )+ oCJJ/!Y/3r   c                p   [         R                  [         R                  p!U R                  5         [	        5       n[
        R                  " U5      nU R                  UR                  5        [
        R                  " S5        U R                  SUR                  5       5        U R                  [         R                  [        5        U R                  [         R                  R                  [         R"                  5        [%        USS5      nU(       d  [         R&                  " 5       nU R                  [         R                  R(                  R+                  5       UR+                  5       5        U R                  [         R                  [        5        U R                  [         R                  R                  [         R,                  5        [%        USS5      nU(       d  [         R&                  " 5       nU R                  [         R                  R(                  R+                  5       UR+                  5       5        g)zR
startLogging() installs FileLogObserver and overrides sys.stdout and
sys.stderr.
r   encodingN)rr  rm  rn  rs  r   r   rz  r]   stoprf   rN   r   r   r   r*   levelNewLogLevelinfor
  getdefaultencodingr  uppererror)r,   
origStdout
origStderrr|  r[   r  s         r   test_startLogging#FileObserverTests.test_startLoggings  sc   
 "%SZZJ!!#:##H-&h 1 1 34cjj+6));+;+;<:z48--/H,,224hnn6FGcjj+6));+<+<=:z48--/H,,224hnn6FGr   c                .   U R                  5         [        5       [        l        SS jn[        R
                  " U5        U R                  [        R                  U5        [        R                  " [        R                  5      nU R                  UR                  5        U R                  [        R                  [        5        [        R                  n[        R                  " [        R                  5      nU R                  [        R                  U5        g)z
There are some obscure error conditions that can occur when logging is
started twice. See http://twistedmatrix.com/trac/ticket/3289 for more
information.
c                z    U S   (       a1  [         R                  R                  U S   R                  5       5        g g r   )rr  
__stdout__r   getTracebackr   s    r   	showError;FileObserverTests.test_startLoggingTwice.<locals>.showError  s/    #$$Yy%9%F%F%HI $r   Nr   )rs  r   rr  rm  r   r\   r]   r^   rz  r  r   r   assertIs)r,   r  r[   
fakeStdouts       r   test_startLoggingTwice(FileObserverTests.test_startLoggingTwice  s     	!!# Z
	J 		"**I6##CJJ/&cjj+6ZZ
##CJJ/cjj*-r   c           
     f  ^ U R                  5         [        5       n " S S5      n[        UU[        U[	        5       U[
        5      S9nU R                  [        SU5        S[        l        [	        5       nSS0n/ m[        [        5       " U4S jS	5      5       nU" U5        UR                  U" 5       5        [        R                  " US
S9  U R                  UR                  5        U R                  T/ 5        [
        R                   " S5        UR#                  5       nU R%                  SU5        g)zi
startLogging() overrides global C{warnings.showwarning} such that
warnings go to Twisted log observers.
c                  0    \ rS rSr\" 5       r\" 5       rSrg)FFileObserverTests.test_startLoggingOverridesWarning.<locals>.SysModulei  r   N)r   r   r   r   rM   rm  rn  r   r   r   r   	SysModuler    s    XFXFr   r  )logBeginnerro  N	pre-startr   c                  &   > \ rS rSrSU 4S jjrSrg)MFileObserverTests.test_startLoggingOverridesWarning.<locals>.PreStartObserveri  c                R   > SUR                  5       ;   a  TR                  U5        g g )Nr  )keysrZ   )r,   r-   receiveds     r   __call__VFileObserverTests.test_startLoggingOverridesWarning.<locals>.PreStartObserver.__call__  s#    ).."22OOI. 3r   r   Nr   )r   r   r   r   r  r   )r  s   r   PreStartObserverr    s    / /r   r  F)	setStdoutzhello!zUserWarning: hello!)rs  NewLogPublisherr   r   r   r   patchr   _oldshowwarningr   r
   r\   rz  r]   rp  r*   warnr   rN   )	r,   newPublisherr  tempLogPublisherr|  evtr  r   r  s	           @r   !test_startLoggingOverridesWarning3FileObserverTests.test_startLoggingOverridesWarning  s   
 	!!#&(	 	 (#L(*iR
 	

3)+;< #: G$	\	"	/ 	/ 
#	/ 	S  !1!34U3(5562&h""$+V4r   c                  ^^ [        5       n[        R                  " U5      m/ mSUU4S jjn[        R                  " 5       nUR	                  U5        UR                  S5        U R                  [        T5      S5        TS   nUR                  5       nSR                  TR                  US   5      US   S9nU R                  UR                  U5      U< S	U< 35        g
)zS
FileLogObserver.emit() will add a timestamp and system prefix to its
file output.
c                J   > TR                  U 5        TR                  U 5        g rX   )rZ   r   )r   eventsr   s    r   r[   3FileObserverTests.test_emitPrefix.<locals>.observer  s    MM% HHUOr   r   r>   r   z{time} [{system}] re   rR  )re   rR  z does not start with Nr   )r   r   r   r   r\   rf   r*   rh   r   r4   r;  rD   rE   )	r,   r   r[   r   r   resultprefixr  r   s	          @@r   test_emitPrefix!FileObserverTests.test_emitPrefix  s    
 !!&)	 	
 $$&	h'hVa(q	"%,,f.? - 

 	f%j-fZ8	
r   c                :   [        5       n[        R                  " U5      n[        R                  " 5       nUR	                  UR
                  5        UR                  S5        UR                  5       nSnU R                  UR                  U5      U< SU< 35        g)zB
FileLogObserver.emit() will append a newline to its file output.
r   zHello!
z does not end with N)
r   r   r   r   r\   r   rf   r   rD   endswith)r,   r   r   r   r  suffixs         r   test_emitNewline"FileObserverTests.test_emitNewline  s     !!&)$$&	chh'h"OOF#j+F:6	
r   r   N)r  r   r  intr  r  rR   rS   rQ   )#r   r   r   r   r   rL  rE  rS  re  ERROR_NO_FORMATERROR_UNFORMATTABLE_SYSTEMERROR_MESSAGE_LOSTr  r  r#  r&  r=  rA  rF  rM  rT  rX  r[  r_  rb  rf  rj  rs  r}  r  r  r  r  r  r   r   r   r   r  r    s     3!7QL-.O!2DDD+.D@CD	DLFCI)?VBG>
6
D
D
>
>
<
+<4$H4.435j
@
r   r  c                  T    \ rS rSrSrSS jrSS jrSS jrSS jrSS jr	SS jr
S	rg
)PythonLoggingObserverTestsi  z-
Test the bridge with python logging module.
c                  ^ ^^ [         R                  " S5      mTR                  5       mTR                  [         R                  5        T R
                  SUU4S jj5       n[        5       u  T l        T l        TR                  T R                  5        T R
                  SUU 4S jj5       n[        R                  " 5       T l        [        R                  " 5       T l        T R                  R                  T R                  R                   5        g )Nri  c                 (   > TR                  T 5        g rX   )setLevel)originalLevel
rootLoggers   r   restoreLevel6PythonLoggingObserverTests.setUp.<locals>.restoreLevel  s    .r   c                 p   > T R                  TR                  5        TR                  R                  5         g rX   )removeHandlerhdlrclose)r  r,   s   r   removeLogger6PythonLoggingObserverTests.setUp.<locals>.removeLogger"  s#    $$TYY/IIOOr   rQ   )logging	getLoggergetEffectiveLevelr  DEBUGr]   r   r  r   
addHandlerr   r   r   PythonLoggingObserverobsr\   r   )r,   r  r  r  r  s   `  @@r   r`    PythonLoggingObserverTests.setUp  s    &&r*
"446GMM*		/ 
	/ 01	48dii(		 
	 ""$,,.DHHMM*r   c                    U R                   R                  S5        U R                  SU R                  R	                  5       5        U R                  SU R                  R	                  5       5        g)z,
Test simple output, and default log level.
r   s   Hello, world.s   INFONr   rf   rN   r   r   r_   s    r   test_singleString,PythonLoggingObserverTests.test_singleString+  sK     	O$&(9(9(;<gtxx0023r   c                    [         R                  " [        S5      5      nU R                  R	                  USS9  SnU R
                  R                  5       nU R                  UR                  U5      SU< SU< 35        g)z
Test error output.
zThat is bad.T)r   r3   s	   CRITICAL:zDoes not start with z: N)	r   rC   
ValueErrorr   rf   r   r   rD   rE   )r,   fr  r   s       r   test_errorString+PythonLoggingObserverTests.test_errorString3  sl     OOJ~67At,""$f%"6*Bvj9	
r   c                    U R                   R                  SSSS9  U R                  SU R                  R	                  5       5        g)z
Test logging with a format.
z%(bar)s oo %(foo)sHelloworld)r4   barr5   s   Hello oo worldNr  r_   s    r   test_formatString,PythonLoggingObserverTests.test_formatString@  s7     	/W'J'):):)<=r   c                `   U R                   R                  S[        R                  S9  U R	                  SU R
                  R                  5       5        U R	                  SU R
                  R                  5       5        U R
                  R                  SS5        U R
                  R                  5         U R                   R                  S[        R                  S9  U R	                  SU R
                  R                  5       5        U R	                  SU R
                  R                  5       5        g	)
z7
Test the logLevel keyword for customizing level used.
z	Spam egg.)logLevels	   Spam egg.s   ERRORr   zFoo bar.s   Foo bar.s   WARNINGN)
r   rf   r  ERRORrN   r   r   seektruncateWARNINGr_   s    r   test_customLevel+PythonLoggingObserverTests.test_customLevelG  s     	K'--8lDHH$5$5$78h 1 1 34aJ9k488#4#4#67j$(("3"3"56r   c                    U R                   R                  SSS9  U R                  U R                  R	                  5       S5        g)z`
Verify that an event dictionary which is not an error and has an empty
message isn't recorded.
ri  Fr9   r   N)r   rf   r*   r   r   r_   s    r   rj  0PythonLoggingObserverTests.test_strangeEventDictT  s5    
 	B.**,c2r   )r  r   r  r   NrQ   )r   r   r   r   r   r`   r  r  r  r  rj  r   r   r   r   r  r    s%    +*4
>73r   r  c                  ,    \ rS rSrSrSS jrSS jrSrg)PythonLoggingIntegrationTestsi]  z,
Test integration of python logging bridge.
c                   [         R                  n[         R                  n/ n UR                  [         l        UR                  [         l        [         R
                  " 5       nUR                  5         U R                  US   UR                  5        UR                  5         U R                  [        U5      S5        U[         l        U[         l        g! U[         l        U[         l        f = f)zf
Test that start and stop methods of the observer actually register
and unregister to the log system.
r   N)r   r\   r^   rZ   remover  startr*   r   r  rh   )r,   oldAddObserveroldRemoveObserverlr  s        r   test_startStopObserver4PythonLoggingIntegrationTests.test_startStopObserverb  s    
 ..35
	3hhCO!"C++-CIIKQqT388,HHJSVQ',CO!2C -CO!2Cs   BC C,c                j    " S S[         R                  5      nU" 5       n/ n[         R                  R                  n UR                  [         R                  l        UR                  SS05        U R	                  USS0/5        U[         R                  l        g! U[         R                  l        f = f)z
Test that we can inherit L{log.PythonLoggingObserver} and use super:
that's basically a validation that L{log.PythonLoggingObserver} is
new-style class.
c                  ,   ^  \ rS rSrSU 4S jjrSrU =r$ )BPythonLoggingIntegrationTests.test_inheritance.<locals>.MyObserveri}  c                $   > [         TU ]  U5        g rX   )superr   )r,   r-   	__class__s     r   r   GPythonLoggingIntegrationTests.test_inheritance.<locals>.MyObserver.emit~  s    Y'r   r   r   )r   r   r   r   r   r   __classcell__)r  s   @r   
MyObserverr  }  s    ( (r   r  r5   r  N)r   r  r   rZ   r*   )r,   r  r  r  oldEmits        r   test_inheritance.PythonLoggingIntegrationTests.test_inheritancev  s    	(22 	( l!#++00	5-.XXC%%*HHeU^$Q% 01-4C%%*WC%%*s   AB B2r   NrQ   )r   r   r   r   r   r  r  r   r   r   r   r  r  ]  s    3(5r   r  c                  ,    \ rS rSrSrSS jrSS jrSrg)DefaultObserverTestsi  z
Test the default observer.
c                d   / U l         U R                   R                  U l        [        R                  " U R                  5        U R                  [        R                  U R                  5        [        R                  " 5       n[        5       Ul	        UR                  5         U R                  UR                  5        Sn[        R                  " [        5       U5        U R                  5       nU R                  X!R                  R!                  5       5        U R#                  [%        U5      S5        g)z]
The reason argument passed to log.err() appears in the report
generated by DefaultObserver.
zThe reason.r>   N)rY   rZ   r[   r   r\   r]   r^   DefaultObserverr   rn  r  r  rz   	Exceptionr{   rN   r   r*   rh   )r,   r  reasonr   s       r   test_failureLogger'DefaultObserverTests.test_failureLogger  s    
 -/++&**DMM:!!#Z
		!	V$'')fjj1134Va(r   c                :    " S S5      nSU" 5       4n[        USS9n[        R                  " 5       n[        5        nXTl        UR                  U5        U R                  UR                  5       R                  S5      5        SSS5        g! , (       d  f       g= f)zt
DefaultObserver.emit() does not raise when it observes an error event
with a message that causes L{repr} to raise.
c                      \ rS rSrSS jrSrg)?DefaultObserverTests.test_emitEventWithBrokenRepr.<locals>.Ouchi  c                    [        SS-  5      $ r   r   r_   s    r   r   HDefaultObserverTests.test_emitEventWithBrokenRepr.<locals>.Ouch.__repr__  s    1q5z!r   r   Nr   )r   r   r   r   r   r   r   r   r   Ouchr    s    "r   r  r5   r>   r9   zfoo <Ouch instanceN)	r(   r   r  r   rn  r   rD   r   rE   )r,   r  r&   r   r[   r   s         r   test_emitEventWithBrokenRepr1DefaultObserverTests.test_emitEventWithBrokenRepr  st    	" 	" $&/Wa0&&(Z6$OMM% OOFOO-889MNO ZZs   AB
Br   NrQ   )r   r   r   r   r   r  r  r   r   r   r   r  r    s    ),Pr   r  c                  r    \ rS rSrSrSS jrSS jrSS jrSS jrSS jr	SS jr
SS	 jrSS
 jrSS jrSrg)StdioOnnaStickTestsi  z>
StdioOnnaStick should act like the normal sys.stdout object.
c                f    / U l         [        R                  " U R                   R                  5        g rX   )
resultLogsr   r\   rZ   r_   s    r   r`   StdioOnnaStickTests.setUp  s    /1../r   c                X    [         R                  " U R                  R                  5        g rX   )r   r^   r  rZ   r_   s    r   r   StdioOnnaStickTests.tearDown  s    4??112r   c                j    U R                    Vs/ s H  nSR                  US   5      PM     sn$ s  snf )Nri  r&   )r  join)r,   rq   s     r   getLogMessages"StdioOnnaStickTests.getLogMessages  s+    /3?!)%???s   0c                    [         R                  " 5       nUR                  S5        U R                  U R	                  5       S/5        UR                  S5        U R                  U R	                  5       SS/5        g)z
Writing to a StdioOnnaStick instance results in Twisted log messages.

Log messages are generated every time a '\n' is encountered.
zHello there
This is a testzHello therez!
zThis is a test!N)r   StdioOnnaStickr   r*   r  r,   stdios     r   
test_writeStdioOnnaStickTests.test_write  se     ""$12,,.@E,,.@Q0RSr   c                    [         R                  " 5       nUR                  S5        U R                  U R                  S   S   5        U R                  U R                  S   S   5        g)zc
The log messages written by StdioOnnaStick have printed=1 keyword, and
by default are not errors.
zhello
r   r3   printedN)r   r!  r   assertFalser  rD   r"  s     r   test_metadata!StdioOnnaStickTests.test_metadata  sT    
 ""$I+I67*956r   c                    [         R                  " 5       nUR                  SS/5        U R                  U R	                  5       SS/5        g)zD
Writing lines to a StdioOnnaStick results in Twisted log messages.
zlog 1zlog 2N)r   r!  
writelinesr*   r  r"  s     r   test_writeLines#StdioOnnaStickTests.test_writeLines  sC     ""$'7+,,,.'0BCr   c                   [         R                  n[        R                  " 5       [         l        U R	                  [
        [         SU5        [        SSS9  [        S5        U R                  U R                  5       S/5        g)zG
When StdioOnnaStick is set as sys.stdout, prints become log messages.
rm  This )endz	is a testzThis is a testN)	rr  rm  r   r!  r]   rq  r{  r*   r  )r,   	oldStdouts     r   
test_printStdioOnnaStickTests.test_print  s^     JJ	'')
h	:f#k,,.1A0BCr   c                    [         R                  " SS9nUR                  S5        U R                  U R                  S   S   5        g)zB
StdioOnnaStick created with isError=True log messages as errors.
T)r3   zlog 1
r   r3   N)r   r!  r   rD   r  r"  s     r   
test_errorStdioOnnaStickTests.test_error  s:     ""40I*956r   c                   Sn[         R                  " SS9nU R                  UR                  S5        UR	                  US-   5        UR                  SU-   /5        [        R                  nU[        l        U R                  [        [        SU5        [        U5        U R                  U R                  5       USU-   U/5        g)z
StdioOnnaStick converts unicode prints to byte strings on Python 2, in
order to be compatible with the normal stdout/stderr objects.

On Python 3, the prints are left unmodified.
r   zutf-8)r  
zAlso, rm  N)r   r!  r*   r  r   r,  rr  rm  r]   rq  r{  r  )r,   unicodeStringr#  r3  s       r   test_unicode StdioOnnaStickTests.test_unicode  s     E""G41MD()(]234JJ	
h	:m!H}4mD	
r   )r  NrQ   )rR   z	list[str])r   r   r   r   r   r`   r   r  r$  r)  r-  r4  r7  r<  r   r   r   r   r  r    s8    03@
T7D	D7
r   r  )6r   
__future__r   r9  r  r  rr  re   r   ior   r   typingr   r   zope.interfacer   typing_extensionsr	   twisted.loggerr
   r   r   r   r  r   r  twisted.logger.test.test_stdlibr   twisted.pythonr   r   twisted.python.logtwisted.trialr   Warningr   SynchronousTestCaser    rU   r   r   registerr   r   r   r   r   r   r  r  r  r  r  r   r   r   <module>rK     sQ   #   	 
    ! & &  > ' + "' A>X99 A>Hy7x++ y7xtE{    
 	'8 	X M M.,183O3O ,4N
183O3O N
bI3!=!= I3X,5H$@$@ ,5^,P877 ,P^T
(66 T
r   