ϪfbG>dZddlmZmZddlmZmZmZmZm Z m Z ddl m Z ddl mZddlmZddlmZddlmZd d lmZd d lmZd d lmZd d lmZmZd dlmZm Z m!Z!m"Z"m#Z$d dl%m&Z&d dl'm(Z(d dl)m*Z*dede+de+fdZ,GddeZ-GddeZ.GddeZ/y)z$ Tests for L{twisted.logger._json}. )BytesIOStringIO)IOAnyListOptionalSequencecast) implementer)BrokenMethodImplementation) verifyObject)Failure)TestCase) extractField) formatEvent)globalLogPublisher) ILogObserverLogEvent) eventAsJSON eventFromJSONeventsFromJSONLogFilejsonFileLogObserverlog)LogLevel)Logger) LogPublishertestCase savedJSONreturnct|j|t|j|jdd|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)assertIsInstancestr assertEqualcount)rrs ?/usr/lib/python3/dist-packages/twisted/logger/test/test_json.pysavedJSONInvariantsr(!s3 i- .2 cpeZdZdZdedefdZddZddZddZ dd Z dd Z dd Z dd Z dd ZddZddZy) 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'savedEventJSONzSaveLoadTests.savedEventJSON6s#4U);<?Dr)c d|jt|jddddddy)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. r4)31r7Nr1r2s r' test_saveLoadzSaveLoadTests.test_saveLoadGs2  $--!#.>? @#  r)c x|jt|jdtddddidy)zx Saving and loading an object which cannot be represented in JSON will result in a placeholder. rr8 unpersistableTNr%rr/objectr2s r'test_saveUnPersistablez$SaveLoadTests.test_saveUnPersistableSs9  $--AFH.EF G?D1 2 r)c x|jt|jdtddddidy)zD Non-ASCII keys and values can be saved and loaded. u䌡)uሴr7r<TNr=r2s r'test_saveNonASCIIzSaveLoadTests.test_saveNonASCII]s9  $--.QR S&= > r)c dttdi}|jddi|jt |j |dttdj diy)zx Any L{bytes} objects will be saved as if they are latin-1 so they can be faithfully re-loaded. hellosskippedokaycharmapN)bytesrangeupdater%rr/decode)r. inputEvents r'test_saveByteszSaveLoadTests.test_saveBytesfsi uU3Z01  :v./  $--j9 : eE#J'..y9 : r)cGdd}d|dd}t|j|}|jt|dy)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(eZdZdeddfdZdefdZy)@SaveLoadTests.test_saveUnPersistableThenFormat..Reprablevaluer Nc||_yNrP)r.rPs r'__init__zISaveLoadTests.test_saveUnPersistableThenFormat..Reprable.__init__~s " r)cy)Nreprabler2s r'__repr__zISaveLoadTests.test_saveUnPersistableThenFormat..Reprable.__repr__s!r))__name__ __module__ __qualname__r>rTr$rXrWr)r'ReprablerO}s! #f # # "# "r)r\z{object} {object.value} log_formatr>z reprable 7N)rr/r%r)r.r\rK outputEvents r' test_saveUnPersistableThenFormatz.SaveLoadTests.test_saveUnPersistableThenFormatusG " "%>RSU #D$7$7 $CD  [1<@r)cGdd}td|}t|j|}|jt d|d|j t td||j t td|y) zs L{extractField} can extract fields from an object that's been saved and loaded from JSON. ceZdZddZy)8SaveLoadTests.test_extractingFieldsPostLoad..ObjNcd|_y)NYrSr2s r'rTzASaveLoadTests.test_extractingFieldsPostLoad..Obj.__init__s   r)r N)rYrZr[rTrWr)r'Objrds !r)rhz{object.value}r^z object.valuerfr>N)dictrr/r%r assertRaisesKeyError)r.rhrK loadedEvents r'test_extractingFieldsPostLoadz+SaveLoadTests.test_extractingFieldsPostLoadss  ! !%5ceD #D$7$7 $CD  nkBCH (L(KH (L(JGr)cg}ttt|j} ddz |jt|dt|j|dd}|j|t |j|jt|j|jty#t$rt }|j d|YwxYw)zl Round-tripping a failure through L{eventAsJSON} preserves its class and structure. observerr6rza message about failure log_failureN)rr rappendZeroDivisionErrorrfailurer%lenrr/r# assertTruecheck getTracebackr$)r.eventsrfloadeds r'test_failureStructurePreservedz,SaveLoadTests.test_failureStructurePreserveds "$d<?@ 6 E Va(t226!9=>}M fg.  %678 f113S9! 6 A KK11 5 6sC%C/.C/cttj}t|j |}|j |dtjy)zo It's important that the C{log_level} key remain a L{constantly.NamedConstant} object.  log_levelrN)rirwarnrr/assertIs)r.rKrls r'test_saveLoadLevelz SaveLoadTests.test_saveLoadLevels> HMM2 #D$7$7 $CD  k+. >r)cRtd}|j|tdy)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~)rr%ri)r.rls r'test_saveLoadUnknownLevelz'SaveLoadTests.test_saveLoadUnknownLevels+ $ I  dT&:;r)rg)rYrZr[__doc__rr$r/r3r:r?rArLrarmr|rrrWr)r'r+r+1sO =H = =E      A&H(:$? .checkEventss   S^Q /&N\ MM- 6(7M  ! !- 9+>>@O   ((//;;BB4H% r))rr addObserverr rrrrr BaseExceptionrtrlistrr r)r.io publisherloggedloggerreader deserializedrs` r'test_failureFormattingz+FileLogObserverTests.test_failureFormattings Z N !#d<?@1"56+ 1 E"++-(1&9:  8H#5 $  FL!% 1 NN/ 0 1s(CCCrg)) rYrZr[rrr$rrrrrWr)r'rrs1  V V V(:"r)rc eZdZdZddZddZ ddeedee de ddfd Z dd Z dd Z dd Zdd ZddZddZddZddZddZddZddZddZy)LogFileReaderTestsz- Tests for L{eventsFromJSONLogFile}. r Ncg_ttdtddffd }|_t j |y)Nr,r ct|dtjk(r!d|vrjj|yyy)N log_namespacerecord)jsonLog namespace errorEventsrr)r,r.s r'rpz*LogFileReaderTests.setUp..observers;_%):)::x5?P  ''.@Q:r))rr rr logObserverrr)r.rps` r'setUpzLogFileReaderTests.setUpsH+- \ " /H / / # /$&&x0r)cBtj|jyrR)rremoveObserverrr2s r'tearDownzLogFileReaderTests.tearDown&s))$*:*:;r)inFiler bufferSizectt|||}|jt|ddi|jt|ddi|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} rr6yrN)iterrr%nextrj StopIteration)r.rrrrys r' _readEventszLogFileReaderTests._readEvents)sZ+FOZPQ fQx0 fQx0 -v6r)ctd5}|j||jt|jddddy#1swYyxYw)z L{eventsFromJSONLogFile} reads events from a file and automatically detects use of C{"\x1e"} as the record separator. {"x": 1} {"y": 2} rNrrr%rurr.rs r'&test_readEventsAutoWithRecordSeparatorz9LogFileReaderTests.test_readEventsAutoWithRecordSeparator>sM 7 8 7J   Z (   S!1!12A 6 7 7 7 7A  Actd5}|j||jt|jddddy#1swYyxYw)z L{eventsFromJSONLogFile} reads events from a file and automatically detects use of C{""} as the record separator. z{"x": 1} {"y": 2} rNrrs r''test_readEventsAutoEmptyRecordSeparatorz:LogFileReaderTests.test_readEventsAutoEmptyRecordSeparatorGsM / 0 7J   Z (   S!1!12A 6 7 7 7rctd5}|j|d|jt|jddddy#1swYyxYw)z{ L{eventsFromJSONLogFile} reads events from a file and is told to use a specific record separator. z{"x": 1} {"y": 2} rrNrrs r'&test_readEventsExplicitRecordSeparatorz9LogFileReaderTests.test_readEventsExplicitRecordSeparatorPsR 7 8 7J   Z  @   S!1!12A 6 7 7 7 9AActd5}|j|d|jt|jddddy#1swYyxYw)zM L{eventsFromJSONLogFile} handles buffering a partial event. rr6rrNrrs r'test_readEventsPartialBufferz/LogFileReaderTests.test_readEventsPartialBufferZsR7 8 7J   ZA  6   S!1!12A 6 7 7 7rctd5}tt|}|jt |ddi|j t t||jt|jd|j|jddd|j|jddd d d d y #1swYy xYw) zF If the JSON text for a record is truncated, skip it. z{"x": 1{"y": 2} rrr6rr_z0Unable to read truncated JSON record: {record!r}rs{"x": 1N rrrr%rrjrrurr.rrys r'test_readTruncatedz%LogFileReaderTests.test_readTruncatedcs4 5 H/ ;rs!::&@.*+#!(0$ ( s s  O