+
    üÐjbG  ã                   ó8  € R t ^ RIHtHt ^ RIHtHtHtHtH	t	H
t
 ^ RIHt ^ RIHt ^ RIHt ^ RIHt ^ RIHt ^RIHt ^R	IHt ^R
IHt ^RIHtHt ^RIHtH t H!t!H"t"H#t$ ^RI%H&t& ^RI'H(t( ^RI)H*t* R R lt+ ! R R]4      t, ! R R]4      t- ! R R]4      t.R# )z$
Tests for L{twisted.logger._json}.
)ÚBytesIOÚStringIO)ÚIOÚAnyÚListÚOptionalÚSequenceÚcast)Úimplementer)ÚBrokenMethodImplementation)ÚverifyObject)ÚFailure)ÚTestCase)ÚextractField)ÚformatEvent)ÚglobalLogPublisher)ÚILogObserverÚLogEvent)ÚeventAsJSONÚeventFromJSONÚeventsFromJSONLogFileÚjsonFileLogObserverÚlog)ÚLogLevel)ÚLogger)ÚLogPublisherc                ó<   € V ^8„  d   QhR\         R\        R\        /# )é   ÚtestCaseÚ	savedJSONÚreturn)r   Ústr)Úformats   "Ú?/usr/lib/python3/dist-packages/twisted/logger/test/test_json.pyÚ__annotate__r$   !   s!   € ÷ ñ ¤(ð ´sð ¼sñ ó    c                ót   € V P                  V\        4       V P                  VP                  R4      ^ 4       V# )a  
Assert a few things about the result of L{eventAsJSON}, then return it.

@param testCase: The L{TestCase} with which to perform the assertions.
@param savedJSON: The result of L{eventAsJSON}.

@return: C{savedJSON}

@raise AssertionError: If any of the preconditions fail.
Ú
)ÚassertIsInstancer!   ÚassertEqualÚcount)r   r   s   &&r#   ÚsavedJSONInvariantsr+   !   s3   € ð ×Ñ˜i¬Ô-Ø×Ñ˜Ÿ™¨Ó.°Ô2ØÐr%   c                   óê   a € ] tR t^1t o RtV 3R lR ltV 3R lR ltV 3R lR ltV 3R lR	 ltV 3R
 lR lt	V 3R lR lt
V 3R lR ltV 3R lR ltV 3R lR ltV 3R lR ltV 3R lR ltRtV tR# )ÚSaveLoadTestsz*
Tests for loading and saving log events.
c                ó&   <€ V ^8„  d   QhRS[ RS[/# )r   Úeventr    )r   r!   )r"   Ú__classdict__s   "€r#   r$   ÚSaveLoadTests.__annotate__6   s   ø€ ÷ 	=ñ 	=¡Hð 	=±ñ 	=r%   c                ó,   € \        V \        V4      4      # )zv
Serialize some an events, assert some things about it, and return the
JSON.

@param event: An event.

@return: JSON.
)r+   r   )Úselfr/   s   &&r#   ÚsavedEventJSONÚSaveLoadTests.savedEventJSON6   s   € ô # 4¬°UÓ);Ó<Ð<r%   c                ó   <€ V ^8„  d   QhRR/# ©r   r    N© )r"   r0   s   "€r#   r$   r1   A   s   ø€ ÷ Eñ E Tñ Er%   c                óZ   € V P                  \        V P                  / 4      4      / 4       R# )zH
Saving and loading an empty dictionary results in an empty dictionary.
N©r)   r   r4   ©r3   s   &r#   Útest_simpleSaveLoadÚ!SaveLoadTests.test_simpleSaveLoadA   s$   € ð 	×Ñœ t×':Ñ':¸2Ó'>Ó?ÀÖDr%   c                ó   <€ V ^8„  d   QhRR/# r7   r8   )r"   r0   s   "€r#   r$   r1   G   s   ø€ ÷ 

ñ 

˜tñ 

r%   c           
     ój   € V P                  \        V P                  ^^RR/4      4      R^RR/4       R# )zã
Saving and loading a dictionary with some simple values in it results
in those same simple values in the output; according to JSON's rules,
though, all dictionary keys must be L{str} and any non-L{str}
keys will be converted.
Ú3Ú4Ú1Nr:   r;   s   &r#   Útest_saveLoadÚSaveLoadTests.test_saveLoadG   s:   € ð 	×ÑÜ˜$×-Ñ-¨q°!°S¸#Ð.>Ó?Ó@Ø�!�S˜#Ðö	
r%   c                ó   <€ V ^8„  d   QhRR/# r7   r8   )r"   r0   s   "€r#   r$   r1   S   s   ø€ ÷ 
ñ 
¨ñ 
r%   c                ó~   € V P                  \        V P                  R^R\        4       /4      4      R^RRR//4       R# )z`
Saving and loading an object which cannot be represented in JSON will
result in a placeholder.
rB   r@   ÚunpersistableTN©r)   r   r4   Úobjectr;   s   &r#   Útest_saveUnPersistableÚ$SaveLoadTests.test_saveUnPersistableS   sA   € ð
 	×ÑÜ˜$×-Ñ-¨s°A°s¼F»HÐ.EÓFÓGØ�!�S˜?¨DÐ1Ð2ö	
r%   c                ó   <€ V ^8„  d   QhRR/# r7   r8   )r"   r0   s   "€r#   r$   r1   ]   s   ø€ ÷ 
ñ 
 4ñ 
r%   c                ó~   € V P                  \        V P                  RRR\        4       /4      4      RRRRR//4       R# )z4
Non-ASCII keys and values can be saved and loaded.
u   áˆ´u   äŒ¡r@   rG   TNrH   r;   s   &r#   Útest_saveNonASCIIÚSaveLoadTests.test_saveNonASCII]   sA   € ð 	×ÑÜ˜$×-Ñ-¨x¸À3ÌËÐ.QÓRÓSØ�x  ¸Ð&=Ð>ö	
r%   c                ó   <€ V ^8„  d   QhRR/# r7   r8   )r"   r0   s   "€r#   r$   r1   f   s   ø€ ÷ 
ñ 
 ñ 
r%   c           	     óò   € R\        \        ^ÿ4      4      /pVP                  RR/4       V P                  \	        V P                  V4      4      R\        \        ^ÿ4      4      P                  R4      /4       R# )z`
Any L{bytes} objects will be saved as if they are latin-1 so they can
be faithfully re-loaded.
Úhellos   skippedÚokayÚcharmapN)ÚbytesÚrangeÚupdater)   r   r4   Údecode)r3   Ú
inputEvents   & r#   Útest_saveBytesÚSaveLoadTests.test_saveBytesf   si   € ð
 œu¤U¨3£ZÓ0Ð1ˆ
ð 	×Ñ˜: vÐ.Ô/Ø×ÑÜ˜$×-Ñ-¨jÓ9Ó:Ø”eœE #›JÓ'×.Ñ.¨yÓ9Ð:ö	
r%   c                ó   <€ V ^8„  d   QhRR/# r7   r8   )r"   r0   s   "€r#   r$   r1   u   s   ø€ ÷ Añ A°$ñ Ar%   c                óœ   €  ! R R4      pRRRV! ^4      /p\        V P                  V4      4      pV P                  \        V4      R4       R# )zâ
Saving and loading an object which cannot be represented in JSON, but
has a string representation which I{can} be saved as JSON, will result
in the same string formatting; any extractable fields will retain their
data types.
c                   óD   a € ] tR t^}t o V 3R lR ltV 3R lR ltRtV tR# )Ú@SaveLoadTests.test_saveUnPersistableThenFormat.<locals>.Reprablec                ó$   <€ V ^8„  d   QhRS[ RR/# )r   Úvaluer    N)rI   )r"   r0   s   "€r#   r$   ÚMSaveLoadTests.test_saveUnPersistableThenFormat.<locals>.Reprable.__annotate__~   s   ø€ ÷ #ñ #¡fð #°ñ #r%   c                ó   € Wn         R # ©N©ra   )r3   ra   s   &&r#   Ú__init__ÚISaveLoadTests.test_saveUnPersistableThenFormat.<locals>.Reprable.__init__~   s   € Ø"–
r%   c                ó    <€ V ^8„  d   QhRS[ /# )r   r    ©r!   )r"   r0   s   "€r#   r$   rb   �   s   ø€ ÷ "ñ "¡#ñ "r%   c                ó   € R # )Úreprabler8   r;   s   &r#   Ú__repr__ÚISaveLoadTests.test_saveUnPersistableThenFormat.<locals>.Reprable.__repr__�   s   € Ù!r%   re   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__rf   rl   Ú__static_attributes__Ú__classdictcell__©r0   s   @r#   ÚReprabler_   }   s   ø‡ € ÷#ð #÷"ö "r%   ru   Ú
log_formatz{object} {object.value}rI   z
reprable 7N)r   r4   r)   r   )r3   ru   rY   ÚoutputEvents   &   r#   Ú test_saveUnPersistableThenFormatÚ.SaveLoadTests.test_saveUnPersistableThenFormatu   sL   € ÷	"ñ 	"ð #Ð$=¸xÉÐRSËÐUˆ
Ü# D×$7Ñ$7¸
Ó$CÓDˆØ×Ñœ [Ó1°<Ö@r%   c                ó   <€ V ^8„  d   QhRR/# r7   r8   )r"   r0   s   "€r#   r$   r1   ˆ   s   ø€ ÷ Hñ H¨tñ Hr%   c                ó  €  ! R R4      p\        RV! 4       R7      p\        V P                  V4      4      pV P                  \	        RV4      R4       V P                  \        \        RV4       V P                  \        \        RV4       R# )	z[
L{extractField} can extract fields from an object that's been saved and
loaded from JSON.
c                   ó2   a € ] tR t^Žt o V 3R lR ltRtV tR# )Ú8SaveLoadTests.test_extractingFieldsPostLoad.<locals>.Objc                ó   <€ V ^8„  d   QhRR/# r7   r8   )r"   r0   s   "€r#   r$   ÚESaveLoadTests.test_extractingFieldsPostLoad.<locals>.Obj.__annotate__�   s   ø€ ÷ !ñ ! $ñ !r%   c                ó   € R V n         R# )éY  Nre   r;   s   &r#   rf   ÚASaveLoadTests.test_extractingFieldsPostLoad.<locals>.Obj.__init__�   s	   € Ø �–
r%   re   N)rn   ro   rp   rq   rf   rr   rs   rt   s   @r#   ÚObjr}   Ž   s   ø‡ € ÷!ö !r%   rƒ   z{object.value})rv   rI   zobject.valuer�   rI   N)Údictr   r4   r)   r   ÚassertRaisesÚKeyError)r3   rƒ   rY   ÚloadedEvents   &   r#   Útest_extractingFieldsPostLoadÚ+SaveLoadTests.test_extractingFieldsPostLoadˆ   ss   € ÷	!ñ 	!ô Ð%5¹c»eÔDˆ
Ü# D×$7Ñ$7¸
Ó$CÓDˆØ×Ñœ n°kÓBÀCÔHð
 	×Ñœ(¤L°(¸KÔHØ×Ñœ(¤L°(¸JÖGr%   c                ó   <€ V ^8„  d   QhRR/# r7   r8   )r"   r0   s   "€r#   r$   r1   œ   s   ø€ ÷ :ñ :°ñ :r%   c                ó  € . p\        \        \        VP                  4      R7      p ^^ ,           V P                  \        V4      ^4       \        V P                  V^ ,          4      4      R,          pV P                  V\
        4       V P                  VP                  \        4      4       V P                  VP                  4       \        4       R#   \         d     \        4       pTP                  RT4        LÌi ; i)zT
Round-tripping a failure through L{eventAsJSON} preserves its class and
structure.
©Úobserverza message about failureÚlog_failureN)r   r	   r   ÚappendÚZeroDivisionErrorr   Úfailurer)   Úlenr   r4   r(   Ú
assertTrueÚcheckÚgetTracebackr!   )r3   Úeventsr   ÚfÚloadeds   &    r#   Útest_failureStructurePreservedÚ,SaveLoadTests.test_failureStructurePreservedœ   sÄ   € ð
 "$ˆÜœd¤<°·±Ó?Ô@ˆð	6Ø�ŽEð 	×Ñœ˜V› aÔ(Ü˜t×2Ñ2°6¸!µ9Ó=Ó>¸}ÕMˆØ×Ñ˜f¤gÔ.Ø�‰˜Ÿ™Ô%6Ó7Ô8Ø×Ñ˜f×1Ñ1Ó3´SÖ9øô !ô 	6Ü“	ˆAØ�K‰KÐ1°1Ö5ð	6ús   ¨	C Ã'C>Ã=C>c                ó   <€ V ^8„  d   QhRR/# r7   r8   )r"   r0   s   "€r#   r$   r1   ®   s   ø€ ÷ ?ñ ? Dñ ?r%   c                ó¼   € \        \        P                  R7      p\        V P	                  V4      4      pV P                  VR,          \        P                  4       R# )zW
It's important that the C{log_level} key remain a
L{constantly.NamedConstant} object.
©Ú	log_levelrž   N)r„   r   Úwarnr   r4   ÚassertIs)r3   rY   r‡   s   &  r#   Útest_saveLoadLevelÚ SaveLoadTests.test_saveLoadLevel®   s>   € ô
 ¤H§M¡MÔ2ˆ
Ü# D×$7Ñ$7¸
Ó$CÓDˆØ�‰�k +Õ.´·±Ö>r%   c                ó   <€ V ^8„  d   QhRR/# r7   r8   )r"   r0   s   "€r#   r$   r1   ·   s   ø€ ÷ 	<ñ 	<¨4ñ 	<r%   c                óT   € \        R4      pV P                  V\        RR7      4       R# )z†
If a saved bit of JSON (let's say, from a future version of Twisted)
were to persist a different log_level, it will resolve as None.
zZ{"log_level": {"name": "other", "__class_uuid__": "02E59486-F24D-46AD-8224-3ACDF2A5732A"}}Nr�   )r   r)   r„   )r3   r‡   s   & r#   Útest_saveLoadUnknownLevelÚ'SaveLoadTests.test_saveLoadUnknownLevel·   s+   € ô
 $ðIó
ˆð 	×Ñ˜¤d°TÔ&:Ö;r%   r8   N)rn   ro   rp   rq   Ú__doc__r4   r<   rC   rJ   rN   rZ   rx   rˆ   r™   r¡   r¥   rr   rs   rt   s   @r#   r-   r-   1   s~   ø‡ € ñ÷	=ð 	=÷Eð E÷

ð 

÷
ð 
÷
ð 
÷
ð 
÷Að A÷&Hð H÷(:ð :÷$?ð ?÷	<ö 	<r%   r-   c                   ó‚   a € ] tR t^Ãt o RtV 3R lR ltRV 3R lR lltV 3R lR ltV 3R lR	 ltV 3R
 lR lt	Rt
V tR# )ÚFileLogObserverTestsz#
Tests for L{jsonFileLogObserver}.
c                ó   <€ V ^8„  d   QhRR/# r7   r8   )r"   r0   s   "€r#   r$   Ú!FileLogObserverTests.__annotate__È   s   ø€ ÷ 
ñ 
 ñ 
r%   c                óî   € \        4       ;_uu_ 4       p\        V4      p \        \        V4       RRR4       R#   \         d   pT P                  T4        Rp?L+Rp?ii ; i  + '       g   i     R# ; i)zP
A L{FileLogObserver} returned by L{jsonFileLogObserver} is an
L{ILogObserver}.
N)r   r   r   r   r   Úfail)r3   Ú
fileHandler�   Úes   &   r#   Útest_interfaceÚ#FileLogObserverTests.test_interfaceÈ   sV   € ô
 �ZŒZ˜:Ü*¨:Ó6ˆHðÜœ\¨8Ô4÷ ‰Zøô .ô Ø—	‘	˜!—‘ûðú÷	 �ZˆZús,   “A# :ºA ÁAÁA#ÁA Á A#Á#A4	c                ó$   <€ V ^8„  d   QhRS[ RR/# )r   ÚrecordSeparatorr    Nri   )r"   r0   s   "€r#   r$   r«   Ô   s   ø€ ÷ Vñ V¹ð VÈñ Vr%   c                óè   € \        4       ;_uu_ 4       p\        W!4      p\        ^R7      pV! V4       V P                  VP	                  4       V R24       RRR4       R#   + '       g   i     R# ; i)zñ
Asserts that an observer created by L{jsonFileLogObserver} with the
given arguments writes events serialized as JSON text, using the given
record separator.

@param recordSeparator: C{recordSeparator} argument to
    L{jsonFileLogObserver}
©Úxz	{"x": 1}
N)r   r   r„   r)   Úgetvalue)r3   r³   r®   r�   r/   s   &&   r#   ÚassertObserverWritesJSONÚ-FileLogObserverTests.assertObserverWritesJSONÔ   sT   € ô �ZŒZ˜:Ü*¨:ÓGˆHÜ˜1”IˆEÙ�UŒOØ×Ñ˜Z×0Ñ0Ó2°Ð6GÀ|Ð4TÔU÷	 �Z�ZŠZús   “AA Á A1	c                ó   <€ V ^8„  d   QhRR/# r7   r8   )r"   r0   s   "€r#   r$   r«   ã   s   ø€ ÷ (ñ (¸$ñ (r%   c                ó&   € V P                  4        R# )z¯
A L{FileLogObserver} created by L{jsonFileLogObserver} writes events
serialzed as JSON text to a file when it observes events.
By default, the record separator is C{"\x1e"}.
N©r¸   r;   s   &r#   Ú(test_observeWritesDefaultRecordSeparatorÚ=FileLogObserverTests.test_observeWritesDefaultRecordSeparatorã   s   € ð 	×%Ñ%Ö'r%   c                ó   <€ V ^8„  d   QhRR/# r7   r8   )r"   r0   s   "€r#   r$   r«   ë   s   ø€ ÷ :ñ :¸ñ :r%   c                ó*   € V P                  RR7       R# )z®
A L{FileLogObserver} created by L{jsonFileLogObserver} writes events
serialzed as JSON text to a file when it observes events.
This test sets the record separator to C{""}.
Ú ©r³   Nr¼   r;   s   &r#   Ú&test_observeWritesEmptyRecordSeparatorÚ;FileLogObserverTests.test_observeWritesEmptyRecordSeparatorë   s   € ð 	×%Ñ%°bÐ%Ö9r%   c                ó   <€ V ^8„  d   QhRR/# r7   r8   )r"   r0   s   "€r#   r$   r«   ó   s   ø€ ÷ "ñ "¨ñ "r%   c                ó¶  a € \        4       p\        4       p. pVP                  \        \        VP
                  4      4       VP                  \        V4      4       \        VR7      p ^^ ,           \        VP                  4       4      p\        \        V4      4      pR V 3R llpV! V4       V! V4       R#   \         d    TP                  R4        Lfi ; i)zƒ
A L{FileLogObserver} created by L{jsonFileLogObserver} writes failures
serialized as JSON text to a file when it observes events.
rŒ   zfailed as expectedc                ó>   € V ^8„  d   QhR\         \        ,          RR/# )r   Ú	logEventsr    N)r   r   )r"   s   "r#   r$   ÚAFileLogObserverTests.test_failureFormatting.<locals>.__annotate__  s   € ÷ 
	ñ 
	¤8¬HÕ#5ð 
	¸$ñ 
	r%   c                 ól  <€ SP                  \        V 4      ^4       V w  pSP                  RV4       VR,          pSP                  V\        4       VP                  4       pSP                  VP                  P                  P                  P                  R4      \        P                  R4      4       R# )é   rŽ   ÚcoN)r)   r’   ÚassertInr(   r   ÚgetTracebackObjectÚtb_frameÚf_codeÚco_filenameÚrstripÚ__file__)rÈ   ÚfailureEventÚfailureObjectÚtracebackObjectr3   s   &   €r#   ÚcheckEventsÚ@FileLogObserverTests.test_failureFormatting.<locals>.checkEvents  sŽ   ø€ Ø×ÑœS ›^¨QÔ/Ø&‰Nˆ\Ø�M‰M˜-¨Ô6Ø(¨Õ7ˆMØ×!Ñ! -´Ô9Ø+×>Ñ>Ó@ˆOØ×ÑØ×(Ñ(×/Ñ/×;Ñ;×BÑBÀ4ÓHÜ—‘ Ó%ör%   N)r   r   ÚaddObserverr	   r   r�   r   r   ÚBaseExceptionr‘   r·   Úlistr   )r3   ÚioÚ	publisherÚloggedÚloggerÚreaderÚdeserializedr×   s   f       r#   Útest_failureFormattingÚ+FileLogObserverTests.test_failureFormattingó   s·   ø€ ô
 ‹ZˆÜ “Nˆ	Ø!#ˆØ×Ñœd¤<°·±Ó?Ô@Ø×ÑÔ1°"Ó5Ô6Ü Ô+ˆð	1Ø�ŽEô ˜"Ÿ+™+›-Ó(ˆÜÔ1°&Ó9Ó:ˆ÷
	ð 
	ñ 	�FÔÙ�LÖ!øô% ô 	1Ø�N‰NÐ/Ö0ð	1ús   Á(	B9 Â9CÃCr8   N)Ú)rn   ro   rp   rq   r§   r°   r¸   r½   rÃ   râ   rr   rs   rt   s   @r#   r©   r©   Ã   s>   ø‡ € ñ÷
ð 
÷Vò V÷(ð (÷:ð :÷"ö "r%   r©   c                   ó6  a € ] tR tRt o RtV 3R lR ltV 3R lR ltR#V 3R lR	 lltV 3R
 lR ltV 3R lR lt	V 3R lR lt
V 3R lR ltV 3R lR ltV 3R lR ltV 3R lR ltV 3R lR ltV 3R lR ltV 3R lR ltV 3R lR ltV 3R  lR! ltR"tV tR# )$ÚLogFileReaderTestsi  z%
Tests for L{eventsFromJSONLogFile}.
c                ó   <€ V ^8„  d   QhRR/# r7   r8   )r"   r0   s   "€r#   r$   ÚLogFileReaderTests.__annotate__  s   ø€ ÷ 
1ñ 
1�tñ 
1r%   c                ó†   a € . S n         \        \        4      R  V 3R ll4       pVS n        \        P
                  ! V4       R# )c                ó(   € V ^8„  d   QhR\         RR/# )r   r/   r    N)r   )r"   s   "r#   r$   Ú.LogFileReaderTests.setUp.<locals>.__annotate__  s   € ÷ 	/ñ 	/œHð 	/¨ñ 	/r%   c                 óŒ   <€ V R ,          \         P                  8X  d'   RV 9   d   SP                  P                  V 4       R# R# R# )Úlog_namespaceÚrecordN)ÚjsonLogÚ	namespaceÚerrorEventsr�   )r/   r3   s   &€r#   r�   Ú*LogFileReaderTests.setUp.<locals>.observer  s;   ø€ à�_Õ%¬×):Ñ):Ô:¸xÈ5Ô?PØ× Ñ ×'Ñ'¨Ö.ñ @QÑ:r%   N)rñ   r
   r   ÚlogObserverr   rÙ   )r3   r�   s   f r#   ÚsetUpÚLogFileReaderTests.setUp  s:   ø€ Ø+-ˆÔä	”\Ó	"÷	/ó 
#ð	/ð $ˆÔä×&Ò& xÖ0r%   c                ó   <€ V ^8„  d   QhRR/# r7   r8   )r"   r0   s   "€r#   r$   rè   &  s   ø€ ÷ <ñ <˜$ñ <r%   c                óF   € \         P                  ! V P                  4       R # rd   )r   ÚremoveObserverró   r;   s   &r#   ÚtearDownÚLogFileReaderTests.tearDown&  s   € Ü×)Ò)¨$×*:Ñ*:Ö;r%   Nc                óP   <€ V ^8„  d   QhRS[ S[,          RS[S[,          RS[RR/# )r   ÚinFiler³   Ú
bufferSizer    N)r   r   r   r!   Úint)r"   r0   s   "€r#   r$   rè   )  s;   ø€ ÷ 7ñ 7á‘3•ð7ñ "¡#�ð7ñ ð	7ð
 
ñ7r%   c                óÚ   € \        \        WV4      4      pV P                  \        V4      R^/4       V P                  \        V4      R^/4       V P	                  \
        \        V4       R# )aD  
Test that L{eventsFromJSONLogFile} reads two pre-defined events from a
file: C{{"x": 1}} and C{{"y": 2}}.

@param inFile: C{inFile} argument to L{eventsFromJSONLogFile}
@param recordSeparator: C{recordSeparator} argument to
    L{eventsFromJSONLogFile}
@param bufferSize: C{bufferSize} argument to L{eventsFromJSONLogFile}
r¶   ÚyN)Úiterr   r)   Únextr…   ÚStopIteration)r3   rü   r³   rý   r–   s   &&&& r#   Ú_readEventsÚLogFileReaderTests._readEvents)  sX   € ô Ô+¨FÀZÓPÓQˆà×Ñœ˜f›¨¨Q xÔ0Ø×Ñœ˜f›¨¨Q xÔ0Ø×Ñœ-¬¨vÖ6r%   c                ó   <€ V ^8„  d   QhRR/# r7   r8   )r"   r0   s   "€r#   r$   rè   >  s   ø€ ÷ 7ñ 7¸ñ 7r%   c                óÒ   € \        R4      ;_uu_ 4       pV P                  V4       V P                  \        V P                  4      ^ 4       RRR4       R#   + '       g   i     R# ; i)zw
L{eventsFromJSONLogFile} reads events from a file and automatically
detects use of C{"\x1e"} as the record separator.
ú{"x": 1}
{"y": 2}
N©r   r  r)   r’   rñ   ©r3   r®   s   & r#   Ú&test_readEventsAutoWithRecordSeparatorÚ9LogFileReaderTests.test_readEventsAutoWithRecordSeparator>  sJ   € ô
 Ð7×8Ô8¸JØ×Ñ˜ZÔ(Ø×ÑœS ×!1Ñ!1Ó2°AÔ6÷ 9×8×8Ò8úó   ”7AÁA&	c                ó   <€ V ^8„  d   QhRR/# r7   r8   )r"   r0   s   "€r#   r$   rè   G  s   ø€ ÷ 7ñ 7¸ñ 7r%   c                óÒ   € \        R4      ;_uu_ 4       pV P                  V4       V P                  \        V P                  4      ^ 4       RRR4       R#   + '       g   i     R# ; i)zs
L{eventsFromJSONLogFile} reads events from a file and automatically
detects use of C{""} as the record separator.
z{"x": 1}
{"y": 2}
Nr	  r
  s   & r#   Ú'test_readEventsAutoEmptyRecordSeparatorÚ:LogFileReaderTests.test_readEventsAutoEmptyRecordSeparatorG  sJ   € ô
 Ð/×0Ô0°JØ×Ñ˜ZÔ(Ø×ÑœS ×!1Ñ!1Ó2°AÔ6÷ 1×0×0Ò0úr  c                ó   <€ V ^8„  d   QhRR/# r7   r8   )r"   r0   s   "€r#   r$   rè   P  s   ø€ ÷ 7ñ 7¸ñ 7r%   c                óÖ   € \        R4      ;_uu_ 4       pV P                  VRR7       V P                  \        V P                  4      ^ 4       RRR4       R#   + '       g   i     R# ; i)zc
L{eventsFromJSONLogFile} reads events from a file and is told to use
a specific record separator.
z{"x": 1}
{"y": 2}
ÚrÂ   Nr	  r
  s   & r#   Ú&test_readEventsExplicitRecordSeparatorÚ9LogFileReaderTests.test_readEventsExplicitRecordSeparatorP  sO   € ô Ð7×8Ô8¸JØ×Ñ˜Z¸ÐÔ@Ø×ÑœS ×!1Ñ!1Ó2°AÔ6÷ 9×8×8Ò8úó   ”9AÁA(	c                ó   <€ V ^8„  d   QhRR/# r7   r8   )r"   r0   s   "€r#   r$   rè   Z  s   ø€ ÷ 7ñ 7¨dñ 7r%   c                óÖ   € \        R4      ;_uu_ 4       pV P                  V^R7       V P                  \        V P                  4      ^ 4       RRR4       R#   + '       g   i     R# ; i)z=
L{eventsFromJSONLogFile} handles buffering a partial event.
r  ©rý   Nr	  r
  s   & r#   Útest_readEventsPartialBufferÚ/LogFileReaderTests.test_readEventsPartialBufferZ  sO   € ô Ð7×8Ô8¸Jà×Ñ˜Z°AÐÔ6Ø×ÑœS ×!1Ñ!1Ó2°AÔ6÷ 9×8×8Ò8úr  c                ó   <€ V ^8„  d   QhRR/# r7   r8   )r"   r0   s   "€r#   r$   rè   c  s   ø€ ÷ Hñ H Dñ Hr%   c                óð  € \        R4      ;_uu_ 4       p\        \        V4      4      pV P                  \	        V4      R^/4       V P                  \        \        V4       V P                  \        V P                  4      ^4       V P                  V P                  ^ ,          R,          R4       V P                  V P                  ^ ,          R,          R4       RRR4       R#   + '       g   i     R# ; i)z6
If the JSON text for a record is truncated, skip it.
z{"x": 1{"y": 2}
r   rv   z0Unable to read truncated JSON record: {record!r}rî   s   {"x": 1N©	r   r  r   r)   r  r…   r  r’   rñ   ©r3   r®   r–   s   &  r#   Útest_readTruncatedÚ%LogFileReaderTests.test_readTruncatedc  s¾   € ô Ð4×5Ô5¸ÜÔ/°
Ó;Ó<ˆFà×ÑœT &›\¨C°¨8Ô4Ø×Ñœm¬T°6Ô:ð ×ÑœS ×!1Ñ!1Ó2°AÔ6Ø×ÑØ× Ñ  Õ# LÕ1ØBôð ×Ñ˜T×-Ñ-¨aÕ0°Õ:¸JÔG÷ 6×5×5Ò5úó   ”CC$Ã$C5	c                ó   <€ V ^8„  d   QhRR/# r7   r8   )r"   r0   s   "€r#   r$   rè   u  s   ø€ ÷ 7ñ 7 $ñ 7r%   c                óH  € \        R4      ;_uu_ 4       p\        \        V4      4      pV P                  \	        V4      RR/4       V P                  \        \        V4       V P                  \        V P                  4      ^ 4       RRR4       R#   + '       g   i     R# ; i)zK
If the file being read from vends L{str}, strings decode from JSON
as-is.
u   {"currency": "â‚¬"}
Úcurrencyõ   â‚¬Nr  r   s   &  r#   Útest_readUnicodeÚ#LogFileReaderTests.test_readUnicodeu  sw   € ô Ð4×5Ô5¸ÜÔ/°
Ó;Ó<ˆFà×ÑœT &›\¨J¸Ð+AÔBØ×Ñœm¬T°6Ô:Ø×ÑœS ×!1Ñ!1Ó2°AÔ6÷ 6×5×5Ò5úó   ”A2BÂB!	c                ó   <€ V ^8„  d   QhRR/# r7   r8   )r"   r0   s   "€r#   r$   rè   ‚  s   ø€ ÷ 7ñ 7 Dñ 7r%   c                óH  € \        R4      ;_uu_ 4       p\        \        V4      4      pV P                  \	        V4      RR/4       V P                  \        \        V4       V P                  \        V P                  4      ^ 4       RRR4       R#   + '       g   i     R# ; i)zP
If the file being read from vends L{bytes}, strings decode from JSON as
UTF-8.
s   {"currency": "â‚¬"}
r&  r'  N©	r   r  r   r)   r  r…   r  r’   rñ   r   s   &  r#   Útest_readUTF8BytesÚ%LogFileReaderTests.test_readUTF8Bytes‚  sy   € ô Ð:×;Ô;¸zÜÔ/°
Ó;Ó<ˆFð ×ÑœT &›\¨J¸Ð+AÔBØ×Ñœm¬T°6Ô:Ø×ÑœS ×!1Ñ!1Ó2°AÔ6÷ <×;×;Ò;úr*  c                ó   <€ V ^8„  d   QhRR/# r7   r8   )r"   r0   s   "€r#   r$   rè   �  s   ø€ ÷ 7ñ 7¨Tñ 7r%   c           	     óL  € \        R4      ;_uu_ 4       p\        \        V^R7      4      pV P                  \	        V4      RR/4       V P                  \        \        V4       V P                  \        V P                  4      ^ 4       RRR4       R#   + '       g   i     R# ; i)zÄ
If the JSON text for a record is truncated in the middle of a two-byte
Unicode codepoint, we don't want to see a codec exception and the
stream is read properly when the additional data arrives.
s   {"x": "â‚¬"}
r  r¶   r'  Nr-  r   s   &  r#   Útest_readTruncatedUTF8BytesÚ.LogFileReaderTests.test_readTruncatedUTF8Bytes�  sx   € ô Ð3×4Ô4¸
ÜÔ/°
ÀqÔIÓJˆFà×ÑœT &›\¨C°¨?Ô;Ø×Ñœm¬T°6Ô:Ø×ÑœS ×!1Ñ!1Ó2°AÔ6÷ 5×4×4Ò4ús   ”A4BÂB#	c                ó   <€ V ^8„  d   QhRR/# r7   r8   )r"   r0   s   "€r#   r$   rè   Ÿ  s   ø€ ÷ Tñ T¨4ñ Tr%   c                óð  € \        R4      ;_uu_ 4       p\        \        V4      4      pV P                  \	        V4      R^/4       V P                  \        \        V4       V P                  \        V P                  4      ^4       V P                  V P                  ^ ,          R,          R4       V P                  V P                  ^ ,          R,          R4       RRR4       R#   + '       g   i     R# ; i)zP
If the JSON text for a record contains invalid UTF-8 text, ignore that
record.
s   {"x": "â¬"}
{"y": 2}
r   rv   z2Unable to decode UTF-8 for JSON record: {record!r}rî   s   {"x": "â¬"}
Nr-  r   s   &  r#   Útest_readInvalidUTF8BytesÚ,LogFileReaderTests.test_readInvalidUTF8BytesŸ  sÀ   € ô ÐA×BÔBÀjÜÔ/°
Ó;Ó<ˆFà×ÑœT &›\¨C°¨8Ô4Ø×Ñœm¬T°6Ô:ð ×ÑœS ×!1Ñ!1Ó2°AÔ6Ø×ÑØ× Ñ  Õ# LÕ1ØDôð ×Ñ˜T×-Ñ-¨aÕ0°Õ:Ð<RÔS÷ C×B×BÒBúr#  c                ó   <€ V ^8„  d   QhRR/# r7   r8   )r"   r0   s   "€r#   r$   rè   ³  s   ø€ ÷ Jñ J dñ Jr%   c                óð  € \        R4      ;_uu_ 4       p\        \        V4      4      pV P                  \	        V4      R^/4       V P                  \        \        V4       V P                  \        V P                  4      ^4       V P                  V P                  ^ ,          R,          R4       V P                  V P                  ^ ,          R,          R4       RRR4       R#   + '       g   i     R# ; i)z4
If the JSON text for a record is invalid, skip it.
z{"x": }
{"y": 2}
r   rv   ú&Unable to read JSON record: {record!r}rî   s   {"x": }
Nr  r   s   &  r#   Útest_readInvalidJSONÚ'LogFileReaderTests.test_readInvalidJSON³  s¾   € ô Ð6×7Ô7¸:ÜÔ/°
Ó;Ó<ˆFà×ÑœT &›\¨C°¨8Ô4Ø×Ñœm¬T°6Ô:ð ×ÑœS ×!1Ñ!1Ó2°AÔ6Ø×ÑØ× Ñ  Õ# LÕ1Ø8ôð ×Ñ˜T×-Ñ-¨aÕ0°Õ:¸LÔI÷ 8×7×7Ò7úr#  c                ó   <€ V ^8„  d   QhRR/# r7   r8   )r"   r0   s   "€r#   r$   rè   Å  s   ø€ ÷ Uñ U dñ Ur%   c                ó¤  € \        R4      ;_uu_ 4       p\        V4      pV P                  \        \        V4       V P                  \        V P                  4      ^4       V P                  V P                  ^ ,          R,          R4       V P                  V P                  ^ ,          R,          R4       RRR4       R#   + '       g   i     R# ; i)z9
Multiple events without a record separator are skipped.
z{"x": 1}
{"y": 2}
rv   r:  rî   s   {"x": 1}
{"y": 2}
N)r   r   r…   r  r  r)   r’   rñ   r   s   &  r#   Útest_readUnseparatedÚ'LogFileReaderTests.test_readUnseparatedÅ  s¡   € ô Ð3×4Ô4¸
Ü*¨:Ó6ˆFà×Ñœm¬T°6Ô:ð ×ÑœS ×!1Ñ!1Ó2°AÔ6Ø×ÑØ× Ñ  Õ# LÕ1Ø8ôð ×Ñ˜T×-Ñ-¨aÕ0°Õ:Ð<SÔT÷ 5×4×4Ò4ús   ”B B>Â>C	c                ó   <€ V ^8„  d   QhRR/# r7   r8   )r"   r0   s   "€r#   r$   rè   Ö  s   ø€ ÷ 7ñ 7 ñ 7r%   c                ó\  € \        ^R7      p\        4       ;_uu_ 4       p\        V4      pV! V4       VP                  ^ 4       \	        V4      pV P                  \        V4      V34       V P                  \        V P                  4      ^ 4       RRR4       R#   + '       g   i     R# ; i)z‰
Data written by a L{FileLogObserver} returned by L{jsonFileLogObserver}
and read by L{eventsFromJSONLogFile} is reconstructed properly.
rµ   N)	r„   r   r   Úseekr   r)   Útupler’   rñ   )r3   r/   r®   r�   r–   s   &    r#   Útest_roundTripÚ!LogFileReaderTests.test_roundTripÖ  sz   € ô
 �q”	ˆä�ZŒZ˜:Ü*¨:Ó6ˆHÙ�UŒOà�O‰O˜AÔÜ*¨:Ó6ˆFà×ÑœU 6›]¨U¨HÔ5Ø×ÑœS ×!1Ñ!1Ó2°AÔ6÷ �Z�ZŠZús   ŸA1BÂB+	)rñ   ró   )Ni   )rn   ro   rp   rq   r§   rô   rù   r  r  r  r  r  r!  r(  r.  r2  r6  r;  r?  rE  rr   rs   rt   s   @r#   ræ   ræ     s¨   ø‡ € ñ÷
1ð 
1÷<ð <÷7ò 7÷*7ð 7÷7ð 7÷7ð 7÷7ð 7÷Hð H÷$7ð 7÷7ð 7÷7ð 7÷Tð T÷(Jð J÷$Uð U÷"7ö 7r%   ræ   N)/r§   rÜ   r   r   Útypingr   r   r   r   r   r	   Úzope.interfacer
   Úzope.interface.exceptionsr   Úzope.interface.verifyr   Útwisted.python.failurer   Útwisted.trial.unittestr   Ú_flattenr   Ú_formatr   Ú_globalr   Ú_interfacesr   r   Ú_jsonr   r   r   r   r   rï   Ú_levelsr   Ú_loggerr   Ú	_observerr   r+   r-   r©   ræ   r8   r%   r#   Ú<module>rU     sv   ðñ÷ !ß :× :å &Ý @Ý .å *Ý +Ý #Ý !Ý (ß 0÷õ õ Ý Ý $õô O<�Hô O<ôdO"˜8ô O"ôdP7˜ö P7r%   