Ë
    ojbG  ã                   ó>  — d Z ddlmZmZ ddlmZmZmZmZm	Z	m
Z
 ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ d	d
lmZ d	dlmZ d	dlmZ d	dlmZmZ d	dlmZm Z m!Z!m"Z"m#Z$ d	dl%m&Z& d	dl'm(Z( d	dl)m*Z* dede+de+fd„Z, G d„ de«      Z- G d„ de«      Z. G d„ de«      Z/y)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   — | j                  |t        «       | j                  |j                  d«      d«       |S )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     ú?/usr/lib/python3/dist-packages/twisted/logger/test/test_json.pyÚsavedJSONInvariantsr(   !   s3   € ð ×Ñ˜i¬Ô-Ø×Ñ˜Ÿ™¨Ó.°Ô2ØÐó    c                   óp   — e Zd ZdZdedefd„Zdd„Zdd„Zdd„Z	dd	„Z
dd
„Zdd„Zdd„Zdd„Zdd„Zdd„Zy)ÚSaveLoadTestsz2
    Tests for loading and saving log events.
    Úeventr    c                 ó,   — t        | t        |«      «      S )zž
        Serialize some an events, assert some things about it, and return the
        JSON.

        @param event: An event.

        @return: JSON.
        )r(   r   )Úselfr,   s     r'   ÚsavedEventJSONzSaveLoadTests.savedEventJSON6   s   € ô # 4¬°UÓ);Ó<Ð<r)   Nc                 óX   — | j                  t        | j                  i «      «      i «       y)zX
        Saving and loading an empty dictionary results in an empty dictionary.
        N©r%   r   r/   ©r.   s    r'   Útest_simpleSaveLoadz!SaveLoadTests.test_simpleSaveLoadA   s$   € ð 	×Ñœ t×':Ñ':¸2Ó'>Ó?ÀÕDr)   c           	      ód   — | j                  t        | j                  dddœ«      «      dddœ«       y)a  
        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©Ú1r7   Nr1   r2   s    r'   Útest_saveLoadzSaveLoadTests.test_saveLoadG   s2   € ð 	×ÑÜ˜$×-Ñ-°!¸#Ñ.>Ó?Ó@Ø˜#Ñõ	
r)   c           	      óx   — | j                  t        | j                  dt        «       dœ«      «      dddidœ«       y)zx
        Saving and loading an object which cannot be represented in JSON will
        result in a placeholder.
        r   r8   ÚunpersistableTN©r%   r   r/   Úobjectr2   s    r'   Útest_saveUnPersistablez$SaveLoadTests.test_saveUnPersistableS   s9   € ð
 	×ÑÜ˜$×-Ñ-°A¼F»HÑ.EÓFÓGØ˜?¨DÐ1Ñ2õ	
r)   c           	      óx   — | j                  t        | j                  dt        «       dœ«      «      dddidœ«       y)zD
        Non-ASCII keys and values can be saved and loaded.
        u   äŒ¡)u   áˆ´r7   r<   TNr=   r2   s    r'   Útest_saveNonASCIIzSaveLoadTests.test_saveNonASCII]   s9   € ð 	×ÑÜ˜$×-Ñ-¸ÌËÑ.QÓRÓSØ ¸Ð&=Ñ>õ	
r)   c           	      óð   — dt        t        d«      «      i}|j                  ddi«       | j                  t	        | j                  |«      «      dt        t        d«      «      j                  d«      i«       y)zx
        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   r/   Údecode)r.   Ú
inputEvents     r'   Útest_saveByteszSaveLoadTests.test_saveBytesf   si   € ð
 œu¤U¨3£ZÓ0Ð1ˆ
ð 	×Ñ˜: vÐ.Ô/Ø×ÑÜ˜$×-Ñ-¨jÓ9Ó:Ø”eœE #›JÓ'×.Ñ.¨yÓ9Ð:õ	
r)   c                 ó˜   —  G d„ d«      }d |d«      dœ}t        | j                  |«      «      }| j                  t        |«      d«       y)a
  
        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                   ó(   — e Zd Zdeddfd„Zdefd„Zy)ú@SaveLoadTests.test_saveUnPersistableThenFormat.<locals>.ReprableÚvaluer    Nc                 ó   — || _         y ©N©rP   )r.   rP   s     r'   Ú__init__zISaveLoadTests.test_saveUnPersistableThenFormat.<locals>.Reprable.__init__~   s	   € Ø"�•
r)   c                  ó   — y)NÚreprable© r2   s    r'   Ú__repr__zISaveLoadTests.test_saveUnPersistableThenFormat.<locals>.Reprable.__repr__�   s   € Ø!r)   )Ú__name__Ú
__module__Ú__qualname__r>   rT   r$   rX   rW   r)   r'   ÚReprablerO   }   s!   „ ð# fð #°ó #ð" #ô "r)   r\   z{object} {object.value}é   ©Ú
log_formatr>   z
reprable 7N)r   r/   r%   r   )r.   r\   rK   ÚoutputEvents       r'   Ú test_saveUnPersistableThenFormatz.SaveLoadTests.test_saveUnPersistableThenFormatu   sG   € ÷	"ñ 	"ð %>ÉÐRSËÑUˆ
Ü# D×$7Ñ$7¸
Ó$CÓDˆØ×Ñœ [Ó1°<Õ@r)   c                 ó  —  G d„ d«      }t        d |«       ¬«      }t        | j                  |«      «      }| j                  t	        d|«      d«       | j                  t        t        d|«       | j                  t        t        d|«       y)	zs
        L{extractField} can extract fields from an object that's been saved and
        loaded from JSON.
        c                   ó   — e Zd Zdd„Zy)ú8SaveLoadTests.test_extractingFieldsPostLoad.<locals>.ObjNc                 ó   — d| _         y )NéY  rS   r2   s    r'   rT   zASaveLoadTests.test_extractingFieldsPostLoad.<locals>.Obj.__init__�   s	   € Ø �•
r)   ©r    N)rY   rZ   r[   rT   rW   r)   r'   ÚObjrd   Ž   s   „ ô!r)   rh   z{object.value}r^   zobject.valuerf   r>   N)Údictr   r/   r%   r   ÚassertRaisesÚKeyError)r.   rh   rK   ÚloadedEvents       r'   Útest_extractingFieldsPostLoadz+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                 óä  — g }t        t        t        |j                  «      ¬«      }	 ddz   | j                  t        |«      d«       t        | j                  |d   «      «      d   }| j                  |t
        «       | j                  |j                  t        «      «       | j                  |j                  «       t        «       y# t        $ r t        «       }|j                  d|«       Y ŒÁw xY w)zl
        Round-tripping a failure through L{eventAsJSON} preserves its class and
        structure.
        ©Úobserverr6   r   za message about failureÚlog_failureN)r   r
   r   ÚappendÚZeroDivisionErrorr   Úfailurer%   Úlenr   r/   r#   Ú
assertTrueÚcheckÚgetTracebackr$   )r.   Úeventsr   ÚfÚloadeds        r'   Útest_failureStructurePreservedz,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                 ó²   — t        t        j                  ¬«      }t        | j	                  |«      «      }| j                  |d   t        j                  «       y)zo
        It's important that the C{log_level} key remain a
        L{constantly.NamedConstant} object.
        ©Ú	log_levelr   N)ri   r   Úwarnr   r/   ÚassertIs)r.   rK   rl   s      r'   Útest_saveLoadLevelz SaveLoadTests.test_saveLoadLevel®   s>   € ô
 ¤H§M¡MÔ2ˆ
Ü# D×$7Ñ$7¸
Ó$CÓDˆØ�‰�k +Ñ.´·±Õ>r)   c                 óR   — t        d«      }| j                  |t        d¬«      «       y)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%   ri   )r.   rl   s     r'   Útest_saveLoadUnknownLevelz'SaveLoadTests.test_saveLoadUnknownLevel·   s+   € ô
 $ðIó
ˆð 	×Ñ˜¤d°TÔ&:Õ;r)   rg   )rY   rZ   r[   Ú__doc__r   r$   r/   r3   r:   r?   rA   rL   ra   rm   r|   r‚   r„   rW   r)   r'   r+   r+   1   sO   „ ñð	= Hð 	=°ó 	=óEó

ó
ó
ó
óAó&Hó(:ó$?ô	<r)   r+   c                   óB   — e Zd ZdZd
d„Zddeddfd„Zd
d„Zd
d„Zd
d	„Z	y)ÚFileLogObserverTestsz+
    Tests for L{jsonFileLogObserver}.
    r    Nc                 óÈ   — t        «       5 }t        |«      }	 t        t        |«       ddd«       y# t        $ r}| j                  |«       Y d}~Œ(d}~ww xY w# 1 sw Y   yxY w)zh
        A L{FileLogObserver} returned by L{jsonFileLogObserver} is an
        L{ILogObserver}.
        N)r   r   r   r   r   Úfail)r.   Ú
fileHandlerp   Úes       r'   Útest_interfacez#FileLogObserverTests.test_interfaceÈ   s]   € ô
 ‹Zð 	˜:Ü*¨:Ó6ˆHðÜœ\¨8Ô4÷	ð 	øô .ò Ø—	‘	˜!—‘ûðú÷		ð 	ús+   ‹A˜1±	AºAÁAÁAÁAÁA!ÚrecordSeparatorc                 óÈ   — t        «       5 }t        ||«      }t        d¬«      } ||«       | j                  |j	                  «       |› d�«       ddd«       y# 1 sw Y   yxY w)a!  
        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}
        r6   ©Úxz	{"x": 1}
N)r   r   ri   r%   Úgetvalue)r.   r�   rŠ   rp   r,   s        r'   ÚassertObserverWritesJSONz-FileLogObserverTests.assertObserverWritesJSONÔ   sa   € ô ‹Zð 	V˜:Ü*¨:°ÓGˆHÜ˜1”IˆEÙ�UŒOØ×Ñ˜Z×0Ñ0Ó2°Ð6GÀ|Ð4TÔU÷		V÷ 	Vñ 	Vús   ‹AAÁA!c                 ó$   — | j                  «        y)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’   r2   s    r'   Ú(test_observeWritesDefaultRecordSeparatorz=FileLogObserverTests.test_observeWritesDefaultRecordSeparatorã   s   € ð 	×%Ñ%Õ'r)   c                 ó(   — | j                  d¬«       y)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”   r2   s    r'   Ú&test_observeWritesEmptyRecordSeparatorz;FileLogObserverTests.test_observeWritesEmptyRecordSeparatorë   s   € ð 	×%Ñ%°bÐ%Õ9r)   c                 óÀ  ‡ — t        «       }t        «       }g }|j                  t        t        |j
                  «      «       |j                  t        |«      «       t        |¬«      }	 ddz   t        |j                  «       «      }t        t        |«      «      }dt        t           ddfˆ fd„} ||«        ||«       y# t        $ r |j                  d«       Y Œow xY w)	z›
        A L{FileLogObserver} created by L{jsonFileLogObserver} writes failures
        serialized as JSON text to a file when it observes events.
        ro   r6   r   zfailed as expectedÚ	logEventsr    Nc                 ób  •— ‰j                  t        | «      d«       | \  }‰j                  d|«       |d   }‰j                  |t        «       |j                  «       }‰j                  |j                  j                  j                  j                  d«      t        j                  d«      «       y )Nr6   rq   Úco)r%   ru   ÚassertInr#   r   ÚgetTracebackObjectÚtb_frameÚf_codeÚco_filenameÚrstripÚ__file__)r›   ÚfailureEventÚfailureObjectÚtracebackObjectr.   s       €r'   ÚcheckEventsz@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   rr   r   r   ÚBaseExceptionrt   r‘   Úlistr   r	   r   )r.   ÚioÚ	publisherÚloggedÚloggerÚreaderÚdeserializedr¨   s   `       r'   Útest_failureFormattingz+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   Á(C  Ã CÃCrg   )ú)
rY   rZ   r[   r…   rŒ   r$   r’   r•   r™   r²   rW   r)   r'   r‡   r‡   Ã   s1   „ ñó
ñV¸ð VÈó Vó(ó:ô"r)   r‡   c            	       óª   — e Zd ZdZdd„Zdd„Z	 	 ddee   dee	   de
ddfd	„Zdd
„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zy)ÚLogFileReaderTestsz-
    Tests for L{eventsFromJSONLogFile}.
    r    Nc                 óŒ   ‡ — g ‰ _         t        t        «      dt        dd fˆ fd„«       }|‰ _        t        j                  |«       y )Nr,   r    c                 ót   •— | d   t         j                  k(  r!d| v r‰j                  j                  | «       y y y )NÚlog_namespaceÚrecord)ÚjsonLogÚ	namespaceÚerrorEventsrr   )r,   r.   s    €r'   rp   z*LogFileReaderTests.setUp.<locals>.observer  s;   ø€ à�_Ñ%¬×):Ñ):Ò:¸xÈ5Ñ?PØ× Ñ ×'Ñ'¨Õ.ð @QÐ:r)   )r¼   r   r   r   ÚlogObserverr   r©   )r.   rp   s   ` r'   ÚsetUpzLogFileReaderTests.setUp  sH   ø€ Ø+-ˆÔä	”\Ó	"ð	/œHð 	/¨ô 	/ó 
#ð	/ð $ˆÔä×&Ñ& xÕ0r)   c                 óB   — t        j                  | j                  «       y rR   )r   ÚremoveObserverr½   r2   s    r'   ÚtearDownzLogFileReaderTests.tearDown&  s   € Ü×)Ñ)¨$×*:Ñ*:Õ;r)   ÚinFiler�   Ú
bufferSizec                 óÚ   — t        t        |||«      «      }| j                  t        |«      ddi«       | j                  t        |«      ddi«       | j	                  t
        t        |«       y)a|  
        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�   r6   Úyr   N)Úiterr   r%   Únextrj   ÚStopIteration)r.   rÂ   r�   rÃ   ry   s        r'   Ú_readEventszLogFileReaderTests._readEvents)  sZ   € ô Ô+¨F°OÀZÓPÓQˆà×Ñœ˜f›¨¨Q xÔ0Ø×Ñœ˜f›¨¨Q xÔ0Ø×Ñœ-¬¨vÕ6r)   c                 ó°   — t        d«      5 }| j                  |«       | j                  t        | j                  «      d«       ddd«       y# 1 sw Y   yxY w)z�
        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%   ru   r¼   ©r.   rŠ   s     r'   Ú&test_readEventsAutoWithRecordSeparatorz9LogFileReaderTests.test_readEventsAutoWithRecordSeparator>  sM   € ô
 Ð7Ó8ð 	7¸JØ×Ñ˜ZÔ(Ø×ÑœS ×!1Ñ!1Ó2°AÔ6÷	7÷ 	7ñ 	7úó   Œ7AÁAc                 ó°   — t        d«      5 }| j                  |«       | j                  t        | j                  «      d«       ddd«       y# 1 sw Y   yxY w)z‹
        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_readEventsAutoEmptyRecordSeparatorz:LogFileReaderTests.test_readEventsAutoEmptyRecordSeparatorG  sM   € ô
 Ð/Ó0ð 	7°JØ×Ñ˜ZÔ(Ø×ÑœS ×!1Ñ!1Ó2°AÔ6÷	7÷ 	7ñ 	7úrÏ   c                 ó´   — t        d«      5 }| j                  |d¬«       | j                  t        | j                  «      d«       ddd«       y# 1 sw Y   yxY w)z{
        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_readEventsExplicitRecordSeparatorz9LogFileReaderTests.test_readEventsExplicitRecordSeparatorP  sR   € ô Ð7Ó8ð 	7¸JØ×Ñ˜Z¸ÐÔ@Ø×ÑœS ×!1Ñ!1Ó2°AÔ6÷	7÷ 	7ñ 	7úó   Œ9AÁAc                 ó´   — t        d«      5 }| j                  |d¬«       | j                  t        | j                  «      d«       ddd«       y# 1 sw Y   yxY w)zM
        L{eventsFromJSONLogFile} handles buffering a partial event.
        rË   r6   ©rÃ   r   NrÌ   rÍ   s     r'   Útest_readEventsPartialBufferz/LogFileReaderTests.test_readEventsPartialBufferZ  sR   € ô Ð7Ó8ð 	7¸Jà×Ñ˜Z°AÐÔ6Ø×ÑœS ×!1Ñ!1Ó2°AÔ6÷	7÷ 	7ñ 	7úrÕ   c                 ó®  — t        d«      5 }t        t        |«      «      }| j                  t	        |«      ddi«       | j                  t        t        |«       | j                  t        | j                  «      d«       | j                  | j                  d   d   d«       | j                  | j                  d   d   d	«       d
d
d
«       y
# 1 sw Y   y
xY w)zF
        If the JSON text for a record is truncated, skip it.
        z{"x": 1{"y": 2}
rÅ   r   r6   r   r_   z0Unable to read truncated JSON record: {record!r}r¹   s   {"x": 1N©	r   rÆ   r   r%   rÇ   rj   rÈ   ru   r¼   ©r.   rŠ   ry   s      r'   Útest_readTruncatedz%LogFileReaderTests.test_readTruncatedc  sÅ   € ô Ð4Ó5ð 	H¸ÜÔ/°
Ó;Ó<ˆFà×ÑœT &›\¨C°¨8Ô4Ø×Ñœm¬T°6Ô:ð ×ÑœS ×!1Ñ!1Ó2°AÔ6Ø×ÑØ× Ñ  Ñ# LÑ1ØBôð ×Ñ˜T×-Ñ-¨aÑ0°Ñ:¸JÔG÷	H÷ 	Hñ 	Húó   ŒB6CÃCc                 ó&  — t        d«      5 }t        t        |«      «      }| j                  t	        |«      ddi«       | j                  t        t        |«       | j                  t        | j                  «      d«       ddd«       y# 1 sw Y   yxY w)zc
        If the file being read from vends L{str}, strings decode from JSON
        as-is.
        u   {"currency": "â‚¬"}
Úcurrencyõ   â‚¬r   NrÚ   rÛ   s      r'   Útest_readUnicodez#LogFileReaderTests.test_readUnicodeu  sz   € ô Ð4Ó5ð 	7¸ÜÔ/°
Ó;Ó<ˆFà×ÑœT &›\¨J¸Ð+AÔBØ×Ñœm¬T°6Ô:Ø×ÑœS ×!1Ñ!1Ó2°AÔ6÷	7÷ 	7ñ 	7úó   ŒA2BÂBc                 ó&  — t        d«      5 }t        t        |«      «      }| j                  t	        |«      ddi«       | j                  t        t        |«       | j                  t        | j                  «      d«       ddd«       y# 1 sw Y   yxY w)zh
        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Ç   rj   rÈ   ru   r¼   rÛ   s      r'   Útest_readUTF8Bytesz%LogFileReaderTests.test_readUTF8Bytes‚  s|   € ô Ð:Ó;ð 	7¸zÜÔ/°
Ó;Ó<ˆFð ×ÑœT &›\¨J¸Ð+AÔBØ×Ñœm¬T°6Ô:Ø×ÑœS ×!1Ñ!1Ó2°AÔ6÷	7÷ 	7ñ 	7úrâ   c                 ó*  — t        d«      5 }t        t        |d¬«      «      }| j                  t	        |«      ddi«       | j                  t        t        |«       | j                  t        | j                  «      d«       ddd«       y# 1 sw Y   yxY w)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_readTruncatedUTF8Bytesz.LogFileReaderTests.test_readTruncatedUTF8Bytes�  s{   € ô Ð3Ó4ð 	7¸
ÜÔ/°
ÀqÔIÓJˆFà×ÑœT &›\¨C°¨?Ô;Ø×Ñœm¬T°6Ô:Ø×ÑœS ×!1Ñ!1Ó2°AÔ6÷	7÷ 	7ñ 	7ús   ŒA4B	Â	Bc                 ó®  — t        d«      5 }t        t        |«      «      }| j                  t	        |«      ddi«       | j                  t        t        |«       | j                  t        | j                  «      d«       | j                  | j                  d   d   d«       | j                  | j                  d   d   d	«       d
d
d
«       y
# 1 sw Y   y
xY w)zh
        If the JSON text for a record contains invalid UTF-8 text, ignore that
        record.
        s   {"x": "â¬"}
{"y": 2}
rÅ   r   r6   r   r_   z2Unable to decode UTF-8 for JSON record: {record!r}r¹   s   {"x": "â¬"}
Nrä   rÛ   s      r'   Útest_readInvalidUTF8Bytesz,LogFileReaderTests.test_readInvalidUTF8BytesŸ  sÆ   € ô ÐAÓBð 	TÀjÜÔ/°
Ó;Ó<ˆFà×ÑœT &›\¨C°¨8Ô4Ø×Ñœm¬T°6Ô:ð ×ÑœS ×!1Ñ!1Ó2°AÔ6Ø×ÑØ× Ñ  Ñ# LÑ1ØDôð ×Ñ˜T×-Ñ-¨aÑ0°Ñ:Ð<RÔS÷	T÷ 	Tñ 	TúrÝ   c                 ó®  — t        d«      5 }t        t        |«      «      }| j                  t	        |«      ddi«       | j                  t        t        |«       | j                  t        | j                  «      d«       | j                  | j                  d   d   d«       | j                  | j                  d   d   d	«       d
d
d
«       y
# 1 sw Y   y
xY w)zD
        If the JSON text for a record is invalid, skip it.
        z{"x": }
{"y": 2}
rÅ   r   r6   r   r_   ú&Unable to read JSON record: {record!r}r¹   s   {"x": }
NrÚ   rÛ   s      r'   Útest_readInvalidJSONz'LogFileReaderTests.test_readInvalidJSON³  sÅ   € ô Ð6Ó7ð 	J¸:ÜÔ/°
Ó;Ó<ˆFà×ÑœT &›\¨C°¨8Ô4Ø×Ñœm¬T°6Ô:ð ×ÑœS ×!1Ñ!1Ó2°AÔ6Ø×ÑØ× Ñ  Ñ# LÑ1Ø8ôð ×Ñ˜T×-Ñ-¨aÑ0°Ñ:¸LÔI÷	J÷ 	Jñ 	JúrÝ   c                 ób  — t        d«      5 }t        |«      }| j                  t        t        |«       | j                  t        | j                  «      d«       | j                  | j                  d   d   d«       | j                  | j                  d   d   d«       ddd«       y# 1 sw Y   yxY w)	zI
        Multiple events without a record separator are skipped.
        z{"x": 1}
{"y": 2}
r6   r   r_   rì   r¹   s   {"x": 1}
{"y": 2}
N)r   r   rj   rÈ   rÇ   r%   ru   r¼   rÛ   s      r'   Útest_readUnseparatedz'LogFileReaderTests.test_readUnseparatedÅ  s¨   € ô Ð3Ó4ð 	U¸
Ü*¨:Ó6ˆFà×Ñœm¬T°6Ô:ð ×ÑœS ×!1Ñ!1Ó2°AÔ6Ø×ÑØ× Ñ  Ñ# LÑ1Ø8ôð ×Ñ˜T×-Ñ-¨aÑ0°Ñ:Ð<SÔT÷	U÷ 	Uñ 	Uús   ŒBB%Â%B.c                 ó:  — t        d¬«      }t        «       5 }t        |«      } ||«       |j                  d«       t	        |«      }| j                  t        |«      |f«       | j                  t        | j                  «      d«       ddd«       y# 1 sw Y   yxY w)z¡
        Data written by a L{FileLogObserver} returned by L{jsonFileLogObserver}
        and read by L{eventsFromJSONLogFile} is reconstructed properly.
        r6   r�   r   N)	ri   r   r   Úseekr   r%   Útupleru   r¼   )r.   r,   rŠ   rp   ry   s        r'   Útest_roundTripz!LogFileReaderTests.test_roundTripÖ  s�   € ô
 �q”	ˆä‹Zð 	7˜:Ü*¨:Ó6ˆHÙ�UŒOà�O‰O˜AÔÜ*¨:Ó6ˆFà×ÑœU 6›]¨U¨HÔ5Ø×ÑœS ×!1Ñ!1Ó2°AÔ6÷	7÷ 	7ñ 	7ús   —A1BÂBrg   )Ni   )rY   rZ   r[   r…   r¾   rÁ   r   r   r   r$   ÚintrÉ   rÎ   rÑ   rÔ   rØ   rÜ   rá   rå   rè   rê   rí   rï   ró   rW   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µ   rW   r)   r'   ú<module>r     s‹   ðñ÷ !ß :× :å &Ý @Ý .å *Ý +Ý #Ý !Ý (ß 0÷õ õ Ý Ý $ð (ð °sð ¸só ô O<�Hô O<ôdO"˜8ô O"ôdP7˜õ P7r)   