ó
    Ö›‘hbG  ã                   ó@  • S r SSKJrJr  SSKJrJrJrJrJ	r	J
r
  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  S	S
KJr  S	SKJr  S	SKJr  S	SKJr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(  S	SK)J*r*  S\S\+S\+4S jr, " S S\5      r- " S S\5      r. " S S\5      r/g)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)ÚLogPublisherÚtestCaseÚ	savedJSONÚreturnc                 ót   • U R                  U[        5        U R                  UR                  S5      S5        U$ )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.
Ú
r   )ÚassertIsInstanceÚstrÚassertEqualÚcount)r   r   s     ÚaC:\Users\psant\Downloads\Noiseback\school\venv\Lib\site-packages\twisted/logger/test/test_json.pyÚsavedJSONInvariantsr(   !   s3   € ð ×Ñ˜i¬Ô-Ø×Ñ˜Ÿ™¨Ó.°Ô2ØÐó    c                   óŽ   • \ rS rSrSrS\S\4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)ÚSaveLoadTestsé1   z*
Tests for loading and saving log events.
Úeventr    c                 ó,   • [        U [        U5      5      $ )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)   Nc                 óX   • U R                  [        U R                  0 5      5      0 5        g)zH
Saving and loading an empty dictionary results in an empty dictionary.
N©r%   r   r0   ©r/   s    r'   Útest_simpleSaveLoadÚ!SaveLoadTests.test_simpleSaveLoadA   s$   € ð 	×Ñœ t×':Ñ':¸2Ó'>Ó?ÀÕDr)   c           	      ód   • U R                  [        U R                  SSS.5      5      SSS.5        g)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.
r   Ú4)é   Ú3©Ú1r:   Nr3   r4   s    r'   Útest_saveLoadÚSaveLoadTests.test_saveLoadG   s2   € ð 	×ÑÜ˜$×-Ñ-°!¸#Ñ.>Ó?Ó@Ø˜#Ñõ	
r)   c           	      óx   • U R                  [        U R                  S[        5       S.5      5      SSS0S.5        g)z`
Saving and loading an object which cannot be represented in JSON will
result in a placeholder.
r   r;   ÚunpersistableTN©r%   r   r0   Úobjectr4   s    r'   Útest_saveUnPersistableÚ$SaveLoadTests.test_saveUnPersistableS   s9   € ð
 	×ÑÜ˜$×-Ñ-°A¼F»HÑ.EÓFÓGØ˜?¨DÐ1Ñ2õ	
r)   c           	      óx   • U R                  [        U R                  S[        5       S.5      5      SSS0S.5        g)z4
Non-ASCII keys and values can be saved and loaded.
u   äŒ¡)u   áˆ´r:   r@   TNrA   r4   s    r'   Útest_saveNonASCIIÚSaveLoadTests.test_saveNonASCII]   s9   € ð 	×ÑÜ˜$×-Ñ-¸ÌËÑ.QÓRÓSØ ¸Ð&=Ñ>õ	
r)   c           	      óð   • S[        [        S5      5      0nUR                  SS05        U R                  [	        U R                  U5      5      S[        [        S5      5      R                  S5      05        g)z`
Any L{bytes} objects will be saved as if they are latin-1 so they can
be faithfully re-loaded.
Úhelloéÿ   s   skippedÚokayÚcharmapN)ÚbytesÚrangeÚupdater%   r   r0   Údecode)r/   Ú
inputEvents     r'   Útest_saveBytesÚSaveLoadTests.test_saveBytesf   si   € ð
 œu¤U¨3£ZÓ0Ð1ˆ
ð 	×Ñ˜: vÐ.Ô/Ø×ÑÜ˜$×-Ñ-¨jÓ9Ó:Ø”eœE #›JÓ'×.Ñ.¨yÓ9Ð:õ	
r)   c                 ó˜   •  " S S5      nSU" S5      S.n[        U R                  U5      5      nU R                  [        U5      S5        g)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                   ó4   • \ rS rSrS\SS4S jrS\4S jrSrg)Ú@SaveLoadTests.test_saveUnPersistableThenFormat.<locals>.Reprableé}   Úvaluer    Nc                 ó   • Xl         g ©N©rX   )r/   rX   s     r'   Ú__init__ÚISaveLoadTests.test_saveUnPersistableThenFormat.<locals>.Reprable.__init__~   s   € Ø"•
r)   c                 ó   • g)NÚreprable© r4   s    r'   Ú__repr__ÚISaveLoadTests.test_saveUnPersistableThenFormat.<locals>.Reprable.__repr__�   s   € Ø!r)   r[   )	Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__rB   r\   r$   ra   Ú__static_attributes__r`   r)   r'   ÚReprablerV   }   s!   † ð# fð #°ô #ð" #÷ "r)   rh   z{object} {object.value}é   ©Ú
log_formatrB   z
reprable 7N)r   r0   r%   r   )r/   rh   rQ   ÚoutputEvents       r'   Ú test_saveUnPersistableThenFormatÚ.SaveLoadTests.test_saveUnPersistableThenFormatu   sG   € ÷	"ñ 	"ð %>ÉÐRSËÑUˆ
Ü# D×$7Ñ$7¸
Ó$CÓDˆØ×Ñœ [Ó1°<Õ@r)   c                 ó  •  " S S5      n[        SU" 5       S9n[        U R                  U5      5      nU R                  [	        SU5      S5        U R                  [        [        SU5        U R                  [        [        SU5        g)	z[
L{extractField} can extract fields from an object that's been saved and
loaded from JSON.
c                   ó   • \ rS rSrSS jrSrg)Ú8SaveLoadTests.test_extractingFieldsPostLoad.<locals>.ObjéŽ   Nc                 ó   • SU l         g )NéY  r[   r4   s    r'   r\   ÚASaveLoadTests.test_extractingFieldsPostLoad.<locals>.Obj.__init__�   s	   € Ø �•
r)   r[   ©r    N)rc   rd   re   rf   r\   rg   r`   r)   r'   ÚObjrq   Ž   s   † ÷!r)   rw   z{object.value}rj   zobject.valuert   rB   N)Údictr   r0   r%   r   ÚassertRaisesÚKeyError)r/   rw   rQ   Ú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                 óà  • / n[        [        [        UR                  5      S9n SS-    U R                  [        U5      S5        [        U R                  US   5      5      S   nU R                  U[
        5        U R                  UR                  [        5      5        U R                  UR                  5       [        5        g! [         a    [        5       nUR                  SU5         NÂf = f)zT
Round-tripping a failure through L{eventAsJSON} preserves its class and
structure.
©Úobserverr9   r   za message about failureÚlog_failureN)r   r
   r   ÚappendÚZeroDivisionErrorr   Úfailurer%   Úlenr   r0   r#   Ú
assertTrueÚcheckÚgetTracebackr$   )r/   Ú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                 ó¬   • [        [        R                  S9n[        U R	                  U5      5      nU R                  US   [        R                  5        g)zW
It's important that the C{log_level} key remain a
L{constantly.NamedConstant} object.
©Ú	log_levelr�   N)rx   r   Úwarnr   r0   ÚassertIs)r/   rQ   r{   s      r'   Útest_saveLoadLevelÚ SaveLoadTests.test_saveLoadLevel®   s>   € ô
 ¤H§M¡MÑ2ˆ
Ü# D×$7Ñ$7¸
Ó$CÓDˆØ�‰�k +Ñ.´·±Õ>r)   c                 óL   • [        S5      nU R                  U[        SS95        g)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%   rx   )r/   r{   s     r'   Útest_saveLoadUnknownLevelÚ'SaveLoadTests.test_saveLoadUnknownLevel·   s+   € ô
 $ðIó
ˆð 	×Ñ˜¤d°TÑ&:Õ;r)   r`   rv   )rc   rd   re   rf   Ú__doc__r   r$   r0   r5   r=   rC   rF   rR   rm   r|   rŒ   r“   r–   rg   r`   r)   r'   r+   r+   1   sO   † ñð	= Hð 	=°ô 	=ôEô

ô
ô
ô
ôAô&Hô(:ô$?÷	<r)   r+   c                   óV   • \ rS rSrSrSS jrSS\SS4S jjrSS jrSS	 jr	SS
 jr
Srg)ÚFileLogObserverTestséÃ   z#
Tests for L{jsonFileLogObserver}.
r    Nc                 óÔ   • [        5        n[        U5      n [        [        U5        SSS5        g! [         a  nU R                  U5         SnAN)SnAff = f! , (       d  f       g= f)zP
A L{FileLogObserver} returned by L{jsonFileLogObserver} is an
L{ILogObserver}.
N)r   r   r   r   r   Úfail)r/   Ú
fileHandler€   Úes       r'   Útest_interfaceÚ#FileLogObserverTests.test_interfaceÈ   sR   € ô
 ŒZ˜:Ü*¨:Ó6ˆHðÜœ\¨8Ô4÷ ˆZøô .ó Ø—	‘	˜!—‘ûðú÷	 �Zús+   ‹A˜1±
A»AÁAÁAÁAÁ
A'ÚrecordSeparatorc                 óÊ   • [        5        n[        X!5      n[        SS9nU" U5        U R                  UR	                  5       U S35        SSS5        g! , (       d  f       g= f)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}
r9   ©Úxz	{"x": 1}
N)r   r   rx   r%   Úgetvalue)r/   r¢   rž   r€   r-   s        r'   ÚassertObserverWritesJSONÚ-FileLogObserverTests.assertObserverWritesJSONÔ   sP   € ô ŒZ˜:Ü*¨:ÓGˆHÜ˜1‘IˆEÙ�UŒOØ×Ñ˜Z×0Ñ0Ó2°Ð6GÀ|Ð4TÔU÷	 �ZŽZús   ‹A AÁ
A"c                 ó$   • U R                  5         g)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§   r4   s    r'   Ú(test_observeWritesDefaultRecordSeparatorÚ=FileLogObserverTests.test_observeWritesDefaultRecordSeparatorã   s   € ð 	×%Ñ%Õ'r)   c                 ó"   • U R                  SS9  g)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ª   r4   s    r'   Ú&test_observeWritesEmptyRecordSeparatorÚ;FileLogObserverTests.test_observeWritesEmptyRecordSeparatorë   s   € ð 	×%Ñ%°bÐ%Ò9r)   c                 óÀ  ^ • [        5       n[        5       n/ nUR                  [        [        UR
                  5      5        UR                  [        U5      5        [        US9n SS-    [        UR                  5       5      n[        [        U5      5      nS[        [           SS4U 4S jjnU" U5        U" U5        g! [         a    UR                  S5         Nrf = f)	zƒ
A L{FileLogObserver} created by L{jsonFileLogObserver} writes failures
serialized as JSON text to a file when it observes events.
r   r9   r   zfailed as expectedÚ	logEventsr    Nc                 ób  >• TR                  [        U 5      S5        U u  nTR                  SU5        US   nTR                  U[        5        UR                  5       nTR                  UR                  R                  R                  R                  S5      [        R                  S5      5        g )Nr9   r�   Úco)r%   r…   ÚassertInr#   r   ÚgetTracebackObjectÚtb_frameÚf_codeÚco_filenameÚrstripÚ__file__)r³   ÚfailureEventÚfailureObjectÚtracebackObjectr/   s       €r'   ÚcheckEventsÚ@FileLogObserverTests.test_failureFormatting.<locals>.checkEvents  sŽ   ø€ Ø×ÑœS ›^¨QÔ/Ø&‰Nˆ\Ø�M‰M˜-¨Ô6Ø(¨Ñ7ˆMØ×!Ñ! -´Ô9Ø+×>Ñ>Ó@ˆOØ×ÑØ×(Ñ(×/Ñ/×;Ñ;×BÑBÀ4ÓHÜ—‘ Ó%õr)   )r   r   ÚaddObserverr
   r   r‚   r   r   ÚBaseExceptionr„   r¦   Úlistr   r	   r   )r/   ÚioÚ	publisherÚloggedÚloggerÚreaderÚdeserializedrÀ   s   `       r'   Útest_failureFormattingÚ+FileLogObserverTests.test_failureFormattingó   sÅ   ø€ ô
 ‹ZˆÜ “Nˆ	Ø!#ˆØ×Ñœd¤<°·±Ó?Ô@Ø×ÑÔ1°"Ó5Ô6Ü Ñ+ˆð	1Ø�ŠEô ˜"Ÿ+™+›-Ó(ˆÜÔ1°&Ó9Ó:ˆð
	¤8¬HÑ#5ð 
	¸$÷ 
	ñ 	�FÔÙ�LÕ!øô% ó 	1Ø�N‰NÐ/Ö0ð	1ús   Á%B? Â?CÃCr`   rv   )Ú)rc   rd   re   rf   r˜   r    r$   r§   r«   r°   rË   rg   r`   r)   r'   rš   rš   Ã   s1   † ñô
ñV¸ð VÈõ Vô(ô:÷"r)   rš   c            	       óÒ   • \ rS rSrSrSS jrSS jr  SS\\   S\	\
   S	\SS4S
 j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)ÚLogFileReaderTestsi  z%
Tests for L{eventsFromJSONLogFile}.
r    Nc                 ó’   ^ • / T l         [        [        5      S[        SS 4U 4S jj5       nUT l        [
        R                  " U5        g )Nr-   r    c                 óz   >• U S   [         R                  :X  a#  SU ;   a  TR                  R                  U 5        g g g )NÚlog_namespaceÚrecord)ÚjsonLogÚ	namespaceÚerrorEventsr‚   )r-   r/   s    €r'   r€   Ú*LogFileReaderTests.setUp.<locals>.observer  s;   ø€ à�_Ñ%¬×):Ñ):Ó:¸xÈ5Ó?PØ× Ñ ×'Ñ'¨Õ.ð @QÐ:r)   )rÖ   r   r   r   ÚlogObserverr   rÂ   )r/   r€   s   ` r'   ÚsetUpÚLogFileReaderTests.setUp  sH   ø€ Ø+-ˆÔä	”\Ó	"ð	/œHð 	/¨ö 	/ó 
#ð	/ð $ˆÔä×&Ò& xÕ0r)   c                 óD   • [         R                  " U R                  5        g rZ   )r   ÚremoveObserverrØ   r4   s    r'   ÚtearDownÚLogFileReaderTests.tearDown&  s   € Ü×)Ò)¨$×*:Ñ*:Õ;r)   ÚinFiler¢   Ú
bufferSizec                 óØ   • [        [        XU5      5      nU R                  [        U5      SS05        U R                  [        U5      SS05        U R	                  [
        [        U5        g)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¥   r9   Úyr   N)Úiterr   r%   Únextry   ÚStopIteration)r/   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                 óº   • [        S5       nU R                  U5        U R                  [        U R                  5      S5        SSS5        g! , (       d  f       g= f)zw
L{eventsFromJSONLogFile} reads events from a file and automatically
detects use of C{"\x1e"} as the record separator.
ú{"x": 1}
{"y": 2}
r   N©r   ræ   r%   r…   rÖ   ©r/   rž   s     r'   Ú&test_readEventsAutoWithRecordSeparatorÚ9LogFileReaderTests.test_readEventsAutoWithRecordSeparator>  sD   € ô
 Ð7Ô8¸JØ×Ñ˜ZÔ(Ø×ÑœS ×!1Ñ!1Ó2°AÔ6÷ 9×8Ö8úó   Œ7AÁ
Ac                 óº   • [        S5       nU R                  U5        U R                  [        U R                  5      S5        SSS5        g! , (       d  f       g= f)zs
L{eventsFromJSONLogFile} reads events from a file and automatically
detects use of C{""} as the record separator.
z{"x": 1}
{"y": 2}
r   Nrê   rë   s     r'   Ú'test_readEventsAutoEmptyRecordSeparatorÚ:LogFileReaderTests.test_readEventsAutoEmptyRecordSeparatorG  sD   € ô
 Ð/Ô0°JØ×Ñ˜ZÔ(Ø×ÑœS ×!1Ñ!1Ó2°AÔ6÷ 1×0Ö0úrî   c                 ó¸   • [        S5       nU R                  USS9  U R                  [        U R                  5      S5        SSS5        g! , (       d  f       g= f)zc
L{eventsFromJSONLogFile} reads events from a file and is told to use
a specific record separator.
z{"x": 1}
{"y": 2}
Úr¯   r   Nrê   rë   s     r'   Ú&test_readEventsExplicitRecordSeparatorÚ9LogFileReaderTests.test_readEventsExplicitRecordSeparatorP  sI   € ô Ð7Ô8¸JØ×Ñ˜Z¸ÐÑ@Ø×ÑœS ×!1Ñ!1Ó2°AÔ6÷ 9×8Ö8úó   Œ6AÁ
Ac                 ó¸   • [        S5       nU R                  USS9  U R                  [        U R                  5      S5        SSS5        g! , (       d  f       g= f)z=
L{eventsFromJSONLogFile} handles buffering a partial event.
ré   r9   ©rà   r   Nrê   rë   s     r'   Útest_readEventsPartialBufferÚ/LogFileReaderTests.test_readEventsPartialBufferZ  sI   € ô Ð7Ô8¸Jà×Ñ˜Z°AÐÑ6Ø×ÑœS ×!1Ñ!1Ó2°AÔ6÷ 9×8Ö8úrö   c                 ó¸  • [        S5       n[        [        U5      5      nU R                  [	        U5      SS05        U R                  [        [        U5        U R                  [        U R                  5      S5        U R                  U R                  S   S   S5        U R                  U R                  S   S   S	5        S
S
S
5        g
! , (       d  f       g
= f)z6
If the JSON text for a record is truncated, skip it.
z{"x": 1{"y": 2}
râ   r   r9   r   rk   z0Unable to read truncated JSON record: {record!r}rÓ   s   {"x": 1N©	r   rã   r   r%   rä   ry   rå   r…   rÖ   ©r/   rž   r‰   s      r'   Útest_readTruncatedÚ%LogFileReaderTests.test_readTruncatedc  s¸   € ô Ð4Ô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úó   ŒB6CÃ
Cc                 ó0  • [        S5       n[        [        U5      5      nU R                  [	        U5      SS05        U R                  [        [        U5        U R                  [        U R                  5      S5        SSS5        g! , (       d  f       g= f)zK
If the file being read from vends L{str}, strings decode from JSON
as-is.
u   {"currency": "â‚¬"}
Úcurrencyõ   â‚¬r   Nrü   rý   s      r'   Útest_readUnicodeÚ#LogFileReaderTests.test_readUnicodeu  sq   € ô Ð4Ô5¸ÜÔ/°
Ó;Ó<ˆFà×ÑœT &›\¨J¸Ð+AÔBØ×Ñœm¬T°6Ô:Ø×ÑœS ×!1Ñ!1Ó2°AÔ6÷ 6×5Ö5úó   ŒA2BÂ
Bc                 ó0  • [        S5       n[        [        U5      5      nU R                  [	        U5      SS05        U R                  [        [        U5        U R                  [        U R                  5      S5        SSS5        g! , (       d  f       g= f)zP
If the file being read from vends L{bytes}, strings decode from JSON as
UTF-8.
s   {"currency": "â‚¬"}
r  r  r   N©	r   rã   r   r%   rä   ry   rå   r…   rÖ   rý   s      r'   Útest_readUTF8BytesÚ%LogFileReaderTests.test_readUTF8Bytes‚  ss   € ô Ð:Ô;¸zÜÔ/°
Ó;Ó<ˆFð ×ÑœT &›\¨J¸Ð+AÔBØ×Ñœm¬T°6Ô:Ø×ÑœS ×!1Ñ!1Ó2°AÔ6÷ <×;Ö;úr  c                 ó.  • [        S5       n[        [        USS95      nU R                  [	        U5      SS05        U R                  [        [        U5        U R                  [        U R                  5      S5        SSS5        g! , (       d  f       g= f)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  r   Nr  rý   s      r'   Útest_readTruncatedUTF8BytesÚ.LogFileReaderTests.test_readTruncatedUTF8Bytes�  sr   € ô Ð3Ô4¸
ÜÔ/°
ÀqÑIÓJˆFà×ÑœT &›\¨C°¨?Ô;Ø×Ñœm¬T°6Ô:Ø×ÑœS ×!1Ñ!1Ó2°AÔ6÷ 5×4Ö4ús   ŒA1BÂ
Bc                 ó¸  • [        S5       n[        [        U5      5      nU R                  [	        U5      SS05        U R                  [        [        U5        U R                  [        U R                  5      S5        U R                  U R                  S   S   S5        U R                  U R                  S   S   S	5        S
S
S
5        g
! , (       d  f       g
= f)zP
If the JSON text for a record contains invalid UTF-8 text, ignore that
record.
s   {"x": "â¬"}
{"y": 2}
râ   r   r9   r   rk   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À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úr   c                 ó¸  • [        S5       n[        [        U5      5      nU R                  [	        U5      SS05        U R                  [        [        U5        U R                  [        U R                  5      S5        U R                  U R                  S   S   S5        U R                  U R                  S   S   S	5        S
S
S
5        g
! , (       d  f       g
= f)z4
If the JSON text for a record is invalid, skip it.
z{"x": }
{"y": 2}
râ   r   r9   r   rk   ú&Unable to read JSON record: {record!r}rÓ   s   {"x": }
Nrü   rý   s      r'   Útest_readInvalidJSONÚ'LogFileReaderTests.test_readInvalidJSON³  s¸   € ô Ð6Ô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úr   c                 ól  • [        S5       n[        U5      nU R                  [        [        U5        U R                  [        U R                  5      S5        U R                  U R                  S   S   S5        U R                  U R                  S   S   S5        SSS5        g! , (       d  f       g= f)	z9
Multiple events without a record separator are skipped.
z{"x": 1}
{"y": 2}
r9   r   rk   r  rÓ   s   {"x": 1}
{"y": 2}
N)r   r   ry   rå   rä   r%   r…   rÖ   rý   s      r'   Útest_readUnseparatedÚ'LogFileReaderTests.test_readUnseparatedÅ  s›   € ô Ð3Ô4¸
Ü*¨:Ó6ˆFà×Ñœm¬T°6Ô:ð ×ÑœS ×!1Ñ!1Ó2°AÔ6Ø×ÑØ× Ñ  Ñ# LÑ1Ø8ôð ×Ñ˜T×-Ñ-¨aÑ0°Ñ:Ð<SÔT÷ 5×4Ö4ús   ŒBB%Â%
B3c                 ó>  • [        SS9n[        5        n[        U5      nU" U5        UR                  S5        [	        U5      nU R                  [        U5      U45        U R                  [        U R                  5      S5        SSS5        g! , (       d  f       g= f)z‰
Data written by a L{FileLogObserver} returned by L{jsonFileLogObserver}
and read by L{eventsFromJSONLogFile} is reconstructed properly.
r9   r¤   r   N)	rx   r   r   Úseekr   r%   Útupler…   rÖ   )r/   r-   rž   r€   r‰   s        r'   Útest_roundTripÚ!LogFileReaderTests.test_roundTripÖ  sv   € ô
 �q‘	ˆäŒZ˜:Ü*¨:Ó6ˆHÙ�UŒOà�O‰O˜AÔÜ*¨:Ó6ˆFà×ÑœU 6›]¨U¨HÔ5Ø×ÑœS ×!1Ñ!1Ó2°AÔ6÷ �ZŽZús   ”A1BÂ
B)rÖ   rØ   rv   )Ni   )rc   rd   re   rf   r˜   rÙ   rÝ   r   r   r   r$   Úintræ   rì   rð   rô   rù   rþ   r  r	  r  r  r  r  r  rg   r`   r)   r'   rÏ   rÏ     sŒ   † ñô
1ô<ð *.Øñ	7à�3‘ð7ð " #™ð7ð ð	7ð
 
õ7ô*7ô7ô7ô7ôHô$7ô7ô7ôTô(Jô$U÷"7r)   rÏ   N)0r˜   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š   rÏ   r`   r)   r'   Ú<module>r-     s‹   ðñ÷ !ß :× :å &Ý @Ý .å *Ý +Ý #Ý !Ý (ß 0÷õ õ Ý Ý $ð (ð °sð ¸sô ô O<�Hô O<ôdO"˜8ô O"ôdP7˜õ P7r)   