+
    üÐj€G  ã                  ó¸   € ^ RI Ht ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIHt ^ RI	H
t
Ht ^ RIHt  ! R R]4      t ! R R	]
P                  4      t ! R
 R]4      tR# )é    )ÚannotationsN)ÚskipIf)ÚlogfileÚruntime)ÚTestCasec                  óF  € ] tR t^tRtR R ltR R ltR R ltR R	 ltR
 R lt	R R lt
R R ltR R ltR R ltR R ltR R ltR R ltR R ltR R lt]! ]P*                  P-                  4       R4      R R  l4       tR! R" ltR# R$ ltR% R& ltR' R( ltR)tR*# )+ÚLogFileTestsz
Test the rotating log file.
c               ó   € V ^8„  d   QhRR/# ©é   ÚreturnÚNone© )Úformats   "Ú;/usr/lib/python3/dist-packages/twisted/test/test_logfile.pyÚ__annotate__ÚLogFileTests.__annotate__   ó   € ÷ 6ñ 6�tñ 6ó    c                	óð   € V P                  4       V n        \        P                  ! V P                  4       R V n        \        P
                  P                  V P                  V P                  4      V n        R# )ztest.logN©ÚmktempÚdirÚosÚmakedirsÚnameÚpathÚjoin©Úselfs   &r   ÚsetUpÚLogFileTests.setUp   sD   € Ø—;‘;“=ˆŒÜ
�Š�D—H‘HÔØˆŒ	Ü—G‘G—L‘L §¡¨4¯9©9Ó5ˆŽ	r   c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   r      s   € ÷ 'ñ '˜$ñ 'r   c                óì   € \         P                  ! V P                  R4       \         P                  P	                  V P                  4      '       d$   \         P                  ! V P                  R4       R# R# )z†
Restore back write rights on created paths: if tests modified the
rights, that will allow the paths to be removed easily afterwards.
éÿ  N)r   Úchmodr   r   Úexistsr   s   &r   ÚtearDownÚLogFileTests.tearDown   sD   € ô
 	�Š�—‘˜5Ô!Ü�7‰7�>‰>˜$Ÿ)™)×$Ò$Ü�HŠH�T—Y‘Y Ö&ñ %r   c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   r   $   s   € ÷ Añ A¨4ñ Ar   c                óÒ   € \         P                  ! V P                  V P                  4      pV P	                  VP
                  4       V P                  \        VP                  4       R# )zN
L{BaseLogFile.shouldRotate} is abstract and must be implemented by
subclass.
N)	r   ÚBaseLogFiler   r   Ú
addCleanupÚcloseÚassertRaisesÚNotImplementedErrorÚshouldRotate©r    Úlogs   & r   Útest_abstractShouldRotateÚ&LogFileTests.test_abstractShouldRotate$   sE   € ô
 ×!Ò! $§)¡)¨T¯X©XÓ6ˆØ�‰˜Ÿ	™	Ô"Ø×ÑÔ-¨s×/?Ñ/?Ö@r   c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   r   -   s   € ÷ 5ñ 5˜dñ 5r   c                ó  € \         P                  ! \        P                  ! V P                  V P
                  4      4      ;_uu_ 4       pVP                  R4       VP                  R4       VP                  4        VP                  R4       RRR4       \        V P                  4      ;_uu_ 4       pV P                  VP                  4       R4       RRR4       R#   + '       g   i     LX; i  + '       g   i     R# ; i)zV
Log files can be written to, flushed and closed. Closing a log file
also flushes it.
Ú123Ú456Ú7890NÚ
1234567890)Ú
contextlibÚclosingr   ÚLogFiler   r   ÚwriteÚflushÚopenr   ÚassertEqualÚread©r    r3   Úfs   &  r   Útest_writingÚLogFileTests.test_writing-   sŸ   € ô
 ×Ò¤§¢°·	±	¸4¿8¹8Ó D×EÔEÈØ�I‰I�eÔØ�I‰I�eÔØ�I‰IŒKØ�I‰I�fÔ÷	 Fô �$—)‘)�_Œ_ Ø×Ñ˜QŸV™V›X |Ô4÷ ‰_÷ F×Eú÷ �_ˆ_ús   ÁACÂ1!C/ÃC,	Ã/D 	c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   r   ;   s   € ÷ 4ñ 4˜tñ 4r   c                óŽ  € \         P                  ! \        P                  ! V P                  V P
                  ^
R7      4      ;_uu_ 4       pVP                  R4       VP                  R4       VP                  R4       V P                  \        P                  P                  V P                   R24      4       V P                  \        P                  P                  V P                   R24      4       VP                  R4       V P                  \        P                  P                  V P                   R24      4       V P                  \        P                  P                  V P                   R24      4       V P                  \        P                  P                  V P                   R24      4       VP                  R4       V P                  \        P                  P                  V P                   R24      4       VP                  4        V P                  \        P                  P                  V P                   R24      4       V P                  \        P                  P                  V P                   R	24      4       R
R
R
4       V P                  XP                  4       . RO4       R
#   + '       g   i     L4; i)zY
Rotating log files autorotate after a period of time, and can also be
manually rotated.
)ÚrotateLengthr8   Ú4567890ú.1ú.2Ú ú.3Ú3ú.4NÚ11111111111)é   r   é   )r<   r=   r   r>   r   r   r?   Ú
assertTruer   r   r'   ÚassertFalseÚrotaterB   ÚlistLogsr2   s   & r   Útest_rotationÚLogFileTests.test_rotation;   sÇ  € ô ×ÒÜ�OŠO˜DŸI™I t§x¡x¸bÔA÷
ô 
àà�I‰I�eÔØ�I‰I�iÔ Ø�I‰I�hÔØ�O‰OœBŸG™GŸN™N¨d¯i©i¨[¸Ð+;Ó<Ô=Ø×ÑœRŸW™WŸ^™^¨t¯y©y¨k¸Ð,<Ó=Ô>Ø�I‰I�bŒMØ�O‰OœBŸG™GŸN™N¨d¯i©i¨[¸Ð+;Ó<Ô=Ø�O‰OœBŸG™GŸN™N¨d¯i©i¨[¸Ð+;Ó<Ô=Ø×ÑœRŸW™WŸ^™^¨t¯y©y¨k¸Ð,<Ó=Ô>Ø�I‰I�cŒNØ×ÑœRŸW™WŸ^™^¨t¯y©y¨k¸Ð,<Ó=Ô>ð �J‰JŒLØ�O‰OœBŸG™GŸN™N¨d¯i©i¨[¸Ð+;Ó<Ô=Ø×ÑœRŸW™WŸ^™^¨t¯y©y¨k¸Ð,<Ó=Ô>÷'
ð* 	×Ñ˜Ÿ™›ªÖ3÷+
÷ 
ús   Á
H>J4Ê4K	c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   r   X   s   € ÷ 1ñ 1˜Tñ 1r   c                ó’  € \         P                  ! \        P                  ! V P                  V P
                  4      4      ;_uu_ 4       pVP                  R4       RRR4       \        P                  ! V P                  V P
                  4      pV P                  VP                  4       V P                  VP                  ^
4       V P                  VP                  P                  4       VP                  4       VP                  R4       VP                  R4       RpV P                  VP                  \        V4      4       V P                  VP                  P                  4       VP                  4       VP                  pVP                  ^ ^ 4       V P                  VP                  4       V4       R#   + '       g   i     ELd; i)zî
Log files can be written to, closed. Their size is the number of
bytes written to them. Everything that was written to them can
be read, even if the writing happened on separate occasions,
and even if the log file was closed in between.
Ú
0123456789NÚabcs   defÿs   0123456789abcdefÿ)r<   r=   r   r>   r   r   r?   r-   r.   rB   ÚsizeÚ_fileÚtellÚlenÚseekrC   )r    r3   ÚexpectResultrE   s   &   r   Útest_appendÚLogFileTests.test_appendX   s'  € ô ×Ò¤§¢°·	±	¸4¿8¹8Ó D×EÔEÈØ�I‰I�lÔ#÷ Fô �oŠo˜dŸi™i¨¯©Ó2ˆØ�‰˜Ÿ	™	Ô"Ø×Ñ˜Ÿ™ 2Ô&Ø×Ñ˜Ÿ™Ÿ™Ó)¨3¯8©8Ô4Ø�	‰	�%ÔØ�	‰	�*ÔØ.ˆØ×Ñ˜Ÿ™¤3 |Ó#4Ô5Ø×Ñ˜Ÿ™Ÿ™Ó)¨3¯8©8Ô4Ø�I‰IˆØ	�‰ˆq�!ŒØ×Ñ˜Ÿ™› <Ö0÷ F×EÐEús   ÁF5Æ5G	c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   r   o   s   € ÷ )5ñ )5 ñ )5r   c                ó&  € \         P                  ! V P                  V P                  4      pV P	                  VP
                  4       VP                  R4       VP                  R4       VP                  4        VP                  R4       VP                  4        V P                  VP                  4       ^.4       \        P                  ! VP                  4       4      ;_uu_ 4       pVP                  P                  ^ 4       V P                  VP!                  4       R.4       V P                  VP!                  4       . 4       RRR4       \        P                  ! VP#                  ^4      4      ;_uu_ 4       pV P                  VP!                  4       RR.4       V P                  VP!                  4       . 4       RRR4       V P%                  \&        VP"                  ^4       V P%                  \(        VP"                  R4       VP                  4        V P                  VP                  4       ^^.4       \        P                  ! VP#                  ^4      4      ;_uu_ 4       pVP                  P                  ^ 4       V P                  VP!                  4       R.4       V P                  VP!                  4       . 4       RRR4       \        P                  ! VP#                  ^4      4      ;_uu_ 4       pV P                  VP!                  4       RR.4       V P                  VP!                  4       . 4       RRR4       R#   + '       g   i     EL	; i  + '       g   i     EL¥; i  + '       g   i     L²; i  + '       g   i     R# ; i)a#  
Various tests for log readers.

First of all, log readers can get logs by number and read what
was written to those log files. Getting nonexistent log files
raises C{ValueError}. Using anything other than an integer
index raises C{TypeError}. As logs get older, their log
numbers increase.
zabc
zdef
zghi
NÚ1)r   r>   r   r   r-   r.   r?   rW   r@   rB   rX   r<   r=   ÚgetCurrentLogr`   rc   Ú	readLinesÚgetLogr/   Ú
ValueErrorÚ	TypeError)r    r3   Úreaders   &  r   Útest_logReaderÚLogFileTests.test_logReadero   s~  € ô �oŠo˜dŸi™i¨¯©Ó2ˆØ�‰˜Ÿ	™	Ô"Ø�	‰	�'ÔØ�	‰	�'ÔØ�
‰
ŒØ�	‰	�'ÔØ�	‰	Œð 	×Ñ˜Ÿ™›¨!¨Ô-Ü×Ò × 1Ñ 1Ó 3×4Ô4¸Ø�L‰L×Ñ˜aÔ Ø×Ñ˜V×-Ñ-Ó/°'°Ô;Ø×Ñ˜V×-Ñ-Ó/°Ô4÷ 5ô ×Ò §
¡
¨1£×.Ô.°&Ø×Ñ˜V×-Ñ-Ó/°'¸7Ð1CÔDØ×Ñ˜V×-Ñ-Ó/°Ô4÷ /ð
 	×Ñœ* c§j¡j°!Ô4Ø×Ñœ) S§Z¡Z°Ô5ð 	�
‰
ŒØ×Ñ˜Ÿ™›¨!¨Q¨Ô0Ü×Ò §
¡
¨1£×.Ô.°&Ø�L‰L×Ñ˜aÔ Ø×Ñ˜V×-Ñ-Ó/°'°Ô;Ø×Ñ˜V×-Ñ-Ó/°Ô4÷ /ô ×Ò §
¡
¨1£×.Ô.°&Ø×Ñ˜V×-Ñ-Ó/°'¸7Ð1CÔDØ×Ñ˜V×-Ñ-Ó/°Ô4÷ /Ñ.÷' 5×4Ð4ú÷ /×.Ð.ú÷ /×.ú÷ /×.Ð.ús4   Ã'AMÅ9AMÉ%AM,Ë7AM?ÍM	ÍM)	Í,M<	Í?N	c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   r   š   s   € ÷ 
2ñ 
2¨Tñ 
2r   c                ó4  € \        V P                  R4      ;_uu_ 4         RRR4       \        P                  ! V P                  4      pV P	                  VP
                  4       V P                  . VP                  ^ 4      4       R#   + '       g   i     Ln; i)z2
L{LogReader.readLines} supports reading no line.
ÚwN)rA   r   r   Ú	LogReaderr-   r.   rB   rk   )r    ro   s   & r   Útest_LogReaderReadsZeroLineÚ(LogFileTests.test_LogReaderReadsZeroLineš   sg   € ô
 �$—)‘)˜S×!Õ!Ø÷ "ô ×"Ò" 4§9¡9Ó-ˆØ�‰˜Ÿ™Ô%Ø×Ñ˜˜V×-Ñ-¨aÓ0Ö1÷ "×!ús   ŸBÂB	c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   r   ¦   s   € ÷ Añ A tñ Ar   c                óR  € \        V P                  R4      P                  4        \        P                  ! V P                  R4       \        P
                  ! V P                  4      \
        P                  ,          p\        P                  ! V P                  V P                  4      pV P                  VP                  4       VP                  R4       VP                  4        V P                  V\        P
                  ! V P                  4      \
        P                  ,          4       R# )z8
Check rotated files have same permissions as original.
rt   éÇ  r^   N)rA   r   r.   r   r&   ÚstatÚST_MODEr   r>   r   r   r-   r?   rW   rB   )r    Úmoder3   s   &  r   Útest_modePreservationÚ"LogFileTests.test_modePreservation¦   s«   € ô 	ˆT�Y‰Y˜Ó×"Ñ"Ô$Ü
�Š�—‘˜EÔ"Ü�wŠw�t—y‘yÓ!¤$§,¡,Õ/ˆÜ�oŠo˜dŸi™i¨¯©Ó2ˆØ�‰˜Ÿ	™	Ô"Ø�	‰	�%ÔØ�
‰
ŒØ×Ñ˜œrŸwšw t§y¡yÓ1´$·,±,Õ?Ö@r   c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   r   ³   s   € ÷ .ñ . 4ñ .r   c                óÄ  € \         P                  ! V P                  V P                  4      pV P	                  VP
                  4       VP                  R4       \        P                  ! V P                  R4        \        \        P                  P                  V P                  R4      R4      pVP                  4        R#   \         d     Mi ; iTP                  4        TP                  R4       TP                  4        TP                  pT P!                  TP#                  4       ^4       TP%                  ^ ^ 4       T P!                  TP'                  4       R4       R# )z8
Check it keeps working when permission on dir changes.
r^   ém  Úxxxrt   NÚdefs   abcdef)r   r>   r   r   r-   r.   r?   r   r&   rA   r   r   ÚOSErrorrW   r@   r`   rB   ra   rc   rC   rD   s   &  r   Útest_noPermissionÚLogFileTests.test_noPermission³   sô   € ô �oŠo˜dŸi™i¨¯©Ó2ˆØ�‰˜Ÿ	™	Ô"Ø�	‰	�%Ôô 	�Š�—‘˜5Ô!ð	Ü”R—W‘W—\‘\ $§(¡(¨EÓ2°CÓ8ˆAð �G‰GŒIÙøô	 ô 	Ùð	úð 	�
‰
Œà�	‰	�%ÔØ�	‰	Œà�I‰IˆØ×Ñ˜Ÿ™› 1Ô%Ø	�‰ˆq�!ŒØ×Ñ˜Ÿ™› 9Ö-s   Á:4C  Ã CÃCc               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   r   Ò   s   € ÷ ;ñ ; Tñ ;r   c                óŠ  € \         P                  ! V P                  V P                  ^
^R7      pV P	                  VP
                  4       VP                  R4       VP                  R4       V P                  \        P                  P                  V P                   R24      4       VP                  R	4       V P                  \        P                  P                  V P                   R24      4       VP                  R
4       V P                  \        P                  P                  V P                   R24      4       \        V P                   R24      ;_uu_ 4       pV P                  VP                  4       R4       RRR4       VP                  R4       \        V P                   R24      ;_uu_ 4       pV P                  VP                  4       R4       RRR4       V P                  \        P                  P                  V P                   R24      4       R#   + '       g   i     L§; i  + '       g   i     L`; i)zT
Test it respect the limit on the number of files when maxRotatedFiles
is not None.
)rJ   ÚmaxRotatedFilesrL   rM   rO   NrQ   rR   Ú22222222222Ú33333333333Ú44444444444Ú55555555555)r   r>   r   r   r-   r.   r?   rU   r   r   r'   rA   rB   rC   rV   ©r    r3   Úfps   &  r   Útest_maxNumberOfLogÚ LogFileTests.test_maxNumberOfLogÒ   sy  € ô
 �oŠo˜dŸi™i¨¯©ÀÐTUÔVˆØ�‰˜Ÿ	™	Ô"Ø�	‰	�(ÔØ�	‰	�(ÔØ�‰œŸ™Ÿ™¨$¯)©)¨°BÐ'7Ó8Ô9à�	‰	�(ÔØ�‰œŸ™Ÿ™¨$¯)©)¨°BÐ'7Ó8Ô9à�	‰	�(ÔØ�‰œŸ™Ÿ™¨$¯)©)¨°BÐ'7Ó8Ô9Ü�T—Y‘Y�K˜rÐ"×#Ô# rØ×Ñ˜RŸW™W›Y¨Ô1÷ $ð 	�	‰	�(ÔÜ�T—Y‘Y�K˜rÐ"×#Ô# rØ×Ñ˜RŸW™W›Y¨Ô1÷ $à×ÑœŸ™Ÿ™¨4¯9©9¨+°RÐ(8Ó9Ö:÷ $×#ú÷ $×#ús   Å!HÆ9!H2ÈH/	È2I	c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   r   ê   s   € ÷ =ñ = 4ñ =r   c                ó�  € \         P                  ! V P                  V P                  ^
RR7      pV P	                  VP
                  4       \         P                  P                  V P                  ^
RR7      pV P	                  VP
                  4       V P                  VP                  VP                  4       V P                  \        P                  P                  VP                  4      VP                  4       V P                  VP                  VP                  4       V P                  VP                  VP                  4       R# )z
Test the fromFullPath method.
r%   ©ÚdefaultModeN)r   r>   r   r   r-   r.   ÚfromFullPathr   rB   r   ÚabspathrJ   r–   )r    Úlog1Úlog2s   &  r   Útest_fromFullPathÚLogFileTests.test_fromFullPathê   sÔ   € ô �Š˜tŸy™y¨$¯(©(°BÀEÔJˆØ�‰˜Ÿ
™
Ô#Ü�‰×+Ñ+¨D¯I©I°rÀuÐ+ÓMˆØ�‰˜Ÿ
™
Ô#Ø×Ñ˜Ÿ™ D§I¡IÔ.Ø×ÑœŸ™Ÿ™¨¯©Ó3°T·Y±YÔ?Ø×Ñ˜×*Ñ*¨D×,=Ñ,=Ô>Ø×Ñ˜×)Ñ)¨4×+;Ñ+;Ö<r   c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   r   ÷   s   € ÷ 
$ñ 
$¨ñ 
$r   c                óŒ  € \        V P                  R4      ;_uu_ 4        \        P                  ! V P                  R4       \        P
                  ! \        P                  ! V P                  4      \        P                  ,          4      pRRR4       \        P                  ! V P                  V P                  4      pV P                  \        P
                  ! \        P                  ! V P                  4      \        P                  ,          4      X4       V P                  VP                  4       R#   + '       g   i     L±; i)z`
Test the default permission of the log file: if the file exist, it
should keep the permission.
Úwbrz   N)rA   r   r   r&   r{   ÚS_IMODEr|   r   r>   r   r   rB   r-   r.   )r    ÚcurrentModer™   s   &  r   Útest_defaultPermissionsÚ$LogFileTests.test_defaultPermissions÷   s²   € ô
 �$—)‘)˜T×"Õ"Ü�HŠH�T—Y‘Y Ô&ÜŸ,š,¤r§w¢w¨t¯y©yÓ'9¼$¿,¹,Õ'GÓHˆK÷ #ô �Š˜tŸy™y¨$¯(©(Ó3ˆØ×ÑœŸš¤b§g¢g¨d¯i©iÓ&8¼¿¹Õ&FÓGÈÔUØ�‰˜Ÿ
™
Ö#÷ #×"ús   ŸA+D3Ä3E	c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   r     s   € ÷ *ñ *¨4ñ *r   c                ó¼  € \         P                  ! V P                  V P                  ^6R7      pV P	                  VP
                  4       \        P                  ! \        P                  ! V P                  4      \        P                  ,          4      p\        P                  P                  4       '       d   V P                  VR4       R# V P                  V^64       R# )z7
Test specifying the permissions used on the log file.
r•   é$  N)r   r>   r   r   r-   r.   r{   r    r   r   r|   r   ÚplatformÚ	isWindowsrB   )r    r™   r}   s   &  r   Útest_specifiedPermissionsÚ&LogFileTests.test_specifiedPermissions  s‡   € ô �Š˜tŸy™y¨$¯(©(ÀÔFˆØ�‰˜Ÿ
™
Ô#Ü�|Š|œBŸGšG D§I¡IÓ.¬t¯|©|Õ<Ó=ˆÜ×Ñ×%Ñ%×'Ò'à×Ñ˜T 5Ö)à×Ñ˜T 5Ö)r   zCan't test reopen on Windowsc               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   r     s   € ÷ 1ñ 1˜Tñ 1r   c                ó  € \         P                  ! \        P                  ! V P                  V P
                  4      4      ;_uu_ 4       pVP                  R4       \        P                  P                  V P
                  R4      p\        P                  ! V P                  V4       VP                  4        VP                  R4       RRR4       \        V P                  4      ;_uu_ 4       pV P                  VP                  4       R4       RRR4       \        X4      ;_uu_ 4       pV P                  VP                  4       R4       RRR4       R#   + '       g   i     L”; i  + '       g   i     La; i  + '       g   i     R# ; i)zs
L{logfile.LogFile.reopen} allows to rename the currently used file and
make L{logfile.LogFile} create a new file.
Úhello1zsave.logÚhello2N)r<   r=   r   r>   r   r   r?   r   r   r   ÚrenameÚreopenrA   rB   rC   )r    r™   ÚsavePathrE   s   &   r   Útest_reopenÚLogFileTests.test_reopen  sé   € ô ×Ò¤§¢°·	±	¸4¿8¹8Ó D×EÔEÈØ�J‰J�xÔ Ü—w‘w—|‘| D§H¡H¨jÓ9ˆHÜ�IŠI�d—i‘i Ô*Ø�K‰KŒMØ�J‰J�xÔ ÷ Fô �$—)‘)�_Œ_ Ø×Ñ˜QŸV™V›X xÔ0÷ ä�(�^Œ^˜qØ×Ñ˜QŸV™V›X xÔ0÷ ‰^÷ F×Eú÷ �_úç�^ˆ^ús%   ÁA>EÃ+!E%Ä'!E8ÅE"	Å%E5	Å8F		c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   r   "  s   € ÷ 0ñ 0 Tñ 0r   c                óº   € V P                  \        \        P                  V P                  R4      pV P                  VP                  \        P                  4       R# )zB
Specifying an invalid directory to L{LogFile} raises C{IOError}.
Úthis_dir_does_not_existN)r/   ÚIOErrorr   r>   r   rB   ÚerrnoÚENOENT)r    Úes   & r   Útest_nonExistentDirÚ LogFileTests.test_nonExistentDir"  s@   € ð ×ÑÜ”W—_‘_ d§i¡iÐ1Jó
ˆð 	×Ñ˜Ÿ™¤%§,¡,Ö/r   c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   r   +  s   € ÷ 1ñ 1¨ñ 1r   c                ó:  € \         P                  P                  4       '       d   RRr!RpMRRr!Rp\        P                  ! WRR7      pV P                  VP                  4       V P                  VP                  V4       V P                  VP                  R4       R# )	zl
Opening a L{LogFile} which can be read and write but whose mode can't
be changed doesn't trigger an error.
ÚNULrN   Únullz/devz	/dev/nullr‚   r•   N)
r   r§   r¨   r   r>   r-   r.   rB   r   r–   )r    r   Ú	directoryÚexpectedPathr3   s   &    r   Útest_cantChangeFileModeÚ$LogFileTests.test_cantChangeFileMode+  sy   € ô
 ×Ñ×%Ñ%×'Ò'Ø# R�)Ø ‰Là$ f�)Ø&ˆLä�oŠo˜d¸5ÔAˆØ�‰˜Ÿ	™	Ô"à×Ñ˜Ÿ™ <Ô0Ø×Ñ˜Ÿ™¨%Ö0r   c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   r   =  s   € ÷ .ñ .°$ñ .r   c                ó  € \         P                  ! V P                  V P                  4      pV P	                  VP
                  4       \        VP                   R2R4      ;_uu_ 4       pVP                  R4       RRR4       \        VP                   R2R4      ;_uu_ 4       pVP                  R4       RRR4       V P                  ^.VP                  4       4       R#   + '       g   i     Ln; i  + '       g   i     LF; i)zT
L{LogFile.listLogs} doesn't choke if it encounters a file with an
unexpected name.
rL   rt   r8   Nz	.bad-file)r   r>   r   r   r-   r.   rA   r   r?   rB   rX   r�   s   &  r   Ú test_listLogsWithBadlyNamedFilesÚ-LogFileTests.test_listLogsWithBadlyNamedFiles=  s©   € ô
 �oŠo˜dŸi™i¨¯©Ó2ˆØ�‰˜Ÿ	™	Ô"ä�S—X‘X�J˜b�/ 3×'Ô'¨2Ø�H‰H�UŒO÷ (ä�S—X‘X�J˜iÐ(¨#×.Ô.°"Ø�H‰H�UŒO÷ /ð 	×Ñ˜!˜˜cŸl™l›nÖ-÷ (×'úç.×.ús   Á(C Â#C3Ã C0	Ã3D	c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   r   L  s   € ÷ 1ñ 1°tñ 1r   c                óž  € \         P                  ! V P                  V P                  4      pV P	                  VP
                  4       \        ^ ^4       F@  p\        VP                   RV 2R4      ;_uu_ 4       pVP                  R4       RRR4       KB  	  V P                  ^^.VP                  4       4       R#   + '       g   i     Ky  ; i)zB
L{LogFile.listLogs} ignores log files which rotated suffix is 0.
Ú.rt   r8   N)r   r>   r   r   r-   r.   ÚrangerA   r   r?   rB   rX   )r    r3   Úir�   s   &   r   Ú%test_listLogsIgnoresZeroSuffixedFilesÚ2LogFileTests.test_listLogsIgnoresZeroSuffixedFilesL  s•   € ô �oŠo˜dŸi™i¨¯©Ó2ˆØ�‰˜Ÿ	™	Ô"ä�q˜!–ˆAÜ˜Ÿ™˜
 ! A 3Ð'¨×-Ô-°Ø—‘˜”÷ .Ñ-ñ ð 	×Ñ˜!˜Q˜ §¡£Ö0÷ .×-Ð-ús   Á9B;Â;C©r   r   r   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r!   r(   r4   rF   rY   re   rp   rv   r~   r†   r‘   r›   r¢   r©   r   r   r§   r¨   r²   r»   rÃ   rÇ   rÎ   Ú__static_attributes__r   r   r   r	   r	      s•   † ñõ6õ'õAõ5õ4õ:1õ.)5õV
2õAõ.õ>;õ0=õ
$õ*ñ ˆG×Ñ×&Ñ&Ó(Ð*HÓIô1ó Jð1õ"0õ1õ$.÷1ñ 1r   r	   c                  ó2   € ] tR tRtRtR R ltR R ltRtR# )	ÚRiggedDailyLogFileiZ  ç        c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   ÚRiggedDailyLogFile.__annotate__]  s   € ÷ &ñ &˜4ñ &r   c                	ón   € \         P                  P                  V 4       V P                  4       V n        R # )N)r   ÚDailyLogFileÚ	_openFileÚtoDateÚlastDater   s   &r   rÞ   ÚRiggedDailyLogFile._openFile]  s#   € Ü×Ñ×&Ñ& tÔ,àŸ™›ˆŽr   c               ó    € V ^8„  d   QhRRRR/# )r   ÚargsÚfloatr   ztuple[int, int, int]r   )r   s   "r   r   rÛ   b  s   € ÷ ,ñ ,˜Eð ,Ð&:ñ ,r   c                	ó–   € V'       d   \         P                  ! V!  R ,          # \         P                  ! V P                  4      R ,          # ):NrT   N)ÚtimeÚgmtimeÚ_clock)r    rã   s   &*r   rß   ÚRiggedDailyLogFile.toDateb  s1   € ßÜ—;’; Ñ% bÕ)Ð)Ü�{Š{˜4Ÿ;™;Ó'¨Õ+Ð+r   )rà   N)rÑ   rÒ   rÓ   rÔ   rè   rÞ   rß   rÖ   r   r   r   rØ   rØ   Z  s   † Ø€Fõ&÷
,ñ ,r   rØ   c                  óÚ   € ] tR tRtRtR R ltR R ltR R ltR	 R
 ltR R lt	]
! ]P                  P                  4       R4      R R l4       tR R ltR R ltR R ltR R ltRtR# )ÚDailyLogFileTestsih  z
Test rotating log file.
c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   ÚDailyLogFileTests.__annotate__m  r   r   c                	óð   € V P                  4       V n        \        P                  ! V P                  4       R V n        \        P
                  P                  V P                  V P                  4      V n        R# )ztestdaily.logNr   r   s   &r   r!   ÚDailyLogFileTests.setUpm  sD   € Ø—;‘;“=ˆŒÜ
�Š�D—H‘HÔØ#ˆŒ	Ü—G‘G—L‘L §¡¨4¯9©9Ó5ˆŽ	r   c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   rí   s  s   € ÷ 5ñ 5˜dñ 5r   c                óð  € \         P                  ! \        V P                  V P                  4      4      ;_uu_ 4       pVP                  R4       VP                  R4       VP                  4        VP                  R4       RRR4       \        V P                  4      ;_uu_ 4       pV P                  VP                  4       R4       RRR4       R#   + '       g   i     LX; i  + '       g   i     R# ; i)z?
A daily log file can be written to like an ordinary log file.
r8   r9   r:   Nr;   )r<   r=   rØ   r   r   r?   r@   rA   r   rB   rC   rD   s   &  r   rF   ÚDailyLogFileTests.test_writings  sœ   € ô ×ÒÔ 2°4·9±9¸d¿h¹hÓ G×HÔHÈCØ�I‰I�eÔØ�I‰I�eÔØ�I‰IŒKØ�I‰I�fÔ÷	 Iô �$—)‘)�_Œ_ Ø×Ñ˜QŸV™V›X |Ô4÷ ‰_÷ I×Hú÷ �_ˆ_ús   ½ACÂ&!C$ÃC!	Ã$C5	c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   rí   €  s   € ÷ 2ñ 2˜tñ 2r   c                ó€  € \        V P                  V P                  4      pV P                  VP                  4       \        ^4       Uu. uF2  q P                  R,           VP                  VR,          4      ,           NK4  	  ppRVn        VP                  R4       RVn        VP                  R4       RVn        VP                  R4       V P                  \        P                  P                  V^ ,          4      4       V P                  \        P                  P                  V^,          4      4       RVn        VP                  R4       V P                  \        P                  P                  V^ ,          4      4       V P                  \        P                  P                  V^,          4      4       V P                  \        P                  P                  V^,          4      4       R	Vn        VP                  R
4       V P                  \        P                  P                  V^,          4      4       R# u upi )z
Daily log files rotate daily.
rË   é€Q rÙ   r8   iÀ¨  rK   i £ rN   iô rP   NrR   )rØ   r   r   r-   r.   rÌ   r   Úsuffixrè   r?   rU   r   r'   rV   )r    r3   ÚdayÚdayss   &   r   rY   ÚDailyLogFileTests.test_rotation€  st  € ô ! §¡¨D¯H©HÓ5ˆØ�‰˜Ÿ	™	Ô"ÜGLÈQÄxÓPÁxÀ—‘˜S• 3§:¡:¨c°E­kÓ#:×:Ð:ÁxˆÐPð ˆŒ
Ø�	‰	�%ÔØˆŒ
Ø�	‰	�)ÔØˆŒ
Ø�	‰	�(ÔØ�‰œŸ™Ÿ™ t¨A¥wÓ/Ô0Ø×ÑœŸ™Ÿ™¨¨Q­Ó0Ô1ØˆŒ
Ø�	‰	�"ŒØ�‰œŸ™Ÿ™ t¨A¥wÓ/Ô0Ø�‰œŸ™Ÿ™ t¨A¥wÓ/Ô0Ø×ÑœŸ™Ÿ™¨¨Q­Ó0Ô1ØˆŒ
Ø�	‰	�#ŒØ×ÑœŸ™Ÿ™¨¨Q­Ó0Ö1ùò% Qs   Á	8H;c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   rí   š  s   € ÷ .ñ .˜Tñ .r   c                ó”  € . ROp\        V P                  V P                  4      pV P                  VP                  4       V F  pVP                  V4       K  	  VP                  4        VP                  R4      pV P                  VP                  4       V P                  WP                  4       4       V P                  \        VP                  R4       RVn        VP	                  4        VP                  4        VP                  ^ 4      pV P                  VP                  4       V P                  WP                  4       4       R# )z8
Test retrieving log files with L{DailyLogFile.getLog}.
rÙ   rõ   i�Q N)z1
z2
z3
)rØ   r   r   r-   r.   r?   r@   rl   rB   rk   r/   rm   rè   rW   )r    Údatar3   ÚdÚrs   &    r   Útest_getLogÚDailyLogFileTests.test_getLogš  sà   € ò %ˆÜ  §¡¨D¯H©HÓ5ˆØ�‰˜Ÿ	™	Ô"ÛˆAØ�I‰I�aŽLñ à�	‰	Œð �J‰J�s‹OˆØ�‰˜Ÿ™Ô à×Ñ˜Ÿ{™{›}Ô-ð 	×Ñœ* c§j¡j°%Ô8àˆŒ
Ø	�‰Œ	Ø�
‰
ŒØ�J‰J�q‹MˆØ�‰˜Ÿ™Ô Ø×Ñ˜Ÿ{™{›}Ö-r   c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   rí   µ  s   € ÷ 2ñ 2¨$ñ 2r   c                óÀ  € \        V P                  V P                  4      pV P                  VP                  4       VP
                   RVP                  VP                  4       2p\        VR4      ;_uu_ 4       pVP                  R4       RRR4       VP                  pVP                  4        V P                  WAP                  4       R#   + '       g   i     LI; i)z]
L{DailyLogFile.rotate} doesn't do anything if they new log file already
exists on the disk.
rË   rt   r8   N)rØ   r   r   r-   r.   r   rö   rà   rA   r?   r`   rW   rB   )r    r3   ÚnewFilePathr�   ÚpreviousFiles   &    r   Útest_rotateAlreadyExistsÚ*DailyLogFileTests.test_rotateAlreadyExistsµ  s˜   € ô
 ! §¡¨D¯H©HÓ5ˆØ�‰˜Ÿ	™	Ô"ð Ÿ™˜
 ! C§J¡J¨s¯|©|Ó$<Ð#=Ð>ˆÜ�+˜s×#Ô# rØ�H‰H�UŒO÷ $à—y‘yˆØ�
‰
ŒØ×Ñ˜§y¡yÖ1÷	 $×#ús   Á:CÃC	zVMaking read-only directories on Windows is too complex for this test to reasonably do.c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   rí   Ë  s   € ÷ 2ñ 2°Tñ 2r   c                ó˜  € \         P                  ! V P                  V P                  4      pV P	                  VP
                  4       \        P                  ! VP                  R4       V P	                  \        P                  VP                  R4       VP                  pVP                  4        V P                  W!P                  4       R# )zk
L{DailyLogFile.rotate} doesn't do anything if the directory containing
the log files can't be written to.
r¦   ií  N)r   rÝ   r   r   r-   r.   r   r&   rÁ   r`   rW   rB   ©r    r3   r  s   &  r   Ú#test_rotatePermissionDirectoryNotOkÚ5DailyLogFileTests.test_rotatePermissionDirectoryNotOkÆ  s|   € ô ×"Ò" 4§9¡9¨d¯h©hÓ7ˆØ�‰˜Ÿ	™	Ô"ä
�Š�—‘ Ô&à�‰œŸ™ #§-¡-°Ô7Ø—y‘yˆØ�
‰
ŒØ×Ñ˜§y¡yÖ1r   c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   rí   Ú  s   € ÷ 2ñ 2°ñ 2r   c                óB  € \         P                  ! V P                  V P                  4      pV P	                  VP
                  4       \        P                  ! VP                  R4       VP                  pVP                  4        V P                  W!P                  4       R# )zQ
L{DailyLogFile.rotate} doesn't do anything if the log file can't be
written to.
r¦   N)r   rÝ   r   r   r-   r.   r   r&   r   r`   rW   rB   r	  s   &  r   Útest_rotatePermissionFileNotOkÚ0DailyLogFileTests.test_rotatePermissionFileNotOkÚ  sd   € ô
 ×"Ò" 4§9¡9¨d¯h©hÓ7ˆØ�‰˜Ÿ	™	Ô"ä
�Š�—‘˜5Ô!Ø—y‘yˆØ�
‰
ŒØ×Ñ˜§y¡yÖ1r   c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   rí   ç  s   € ÷ 	>ñ 	>˜Tñ 	>r   c                ó   € \         P                  ! V P                  V P                  4      pV P	                  VP
                  4       \        P                  ! R4      pV P                  RVP                  V4      4       R# )zf
Test that L{DailyLogFile.toDate} converts its timestamp argument to a
time tuple (year, month, day).
N)	éÐ  rS   rS   r   r   r   r   r   r   )r  rS   rS   )
r   rÝ   r   r   r-   r.   ræ   ÚmktimerB   rß   )r    r3   Ú	timestamps   &  r   Útest_toDateÚDailyLogFileTests.test_toDateç  sV   € ô
 ×"Ò" 4§9¡9¨d¯h©hÓ7ˆØ�‰˜Ÿ	™	Ô"ä—K’KÐ >Ó?ˆ	Ø×Ñ˜ s§z¡z°)Ó'<Ö=r   c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   rí   ò  s   € ÷ -ñ -¨ñ -r   c                ó  a € R V 3R llp\         P                  ! S P                  S P                  4      pS P	                  VP
                  4       S P                  \        RV4       VP                  4       pS P                  . ROV4       R# )a‹  
Test that L{DailyLogFile.toDate} returns today's date by default.

By mocking L{time.localtime}, we ensure that L{DailyLogFile.toDate}
returns the first 3 values of L{time.localtime} which is the current
date.

Note that we don't compare the *real* result of L{DailyLogFile.toDate}
to the *real* current date, as there's a slight possibility that the
date changes between the 2 function calls.
c               ó    € V ^8„  d   QhRRRR/# )r   rã   Úobjectr   z	list[int]r   )r   s   "r   r   Ú?DailyLogFileTests.test_toDateDefaultToday.<locals>.__annotate__ÿ  s   € ÷ 	%ñ 	% &ð 	%¨Yñ 	%r   c                 óR   <€ SP                  RV 4       \        \        ^ ^	4      4      # )r   r   )rB   ÚlistrÌ   )rã   r    s   *€r   Úmock_localtimeÚADailyLogFileTests.test_toDateDefaultToday.<locals>.mock_localtimeÿ  s$   ø€ Ø×Ñ˜R Ô&Üœ˜a ›Ó$Ð$r   Ú	localtimeN)r   rS   r   )
r   rÝ   r   r   r-   r.   Úpatchræ   rß   rB   )r    r  r3   ÚlogDates   f   r   Útest_toDateDefaultTodayÚ)DailyLogFileTests.test_toDateDefaultTodayò  sd   ø€ ÷	%ð 	%ô ×"Ò" 4§9¡9¨d¯h©hÓ7ˆØ�‰˜Ÿ	™	Ô"à�
‰
”4˜ nÔ5Ø—*‘*“,ˆØ×Ñš GÖ,r   c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   rí   
  s   € ÷ (ñ (°Tñ (r   c                ó  € \         P                  ! V P                  V P                  4      pV P	                  VP
                  4       Rp\        P                  ! VR,           4      pVP                  V4      pV P                  W$4       R# )zK
Test that L{DailyLogFile.toDate} uses its arguments to create a new
date.
N)iÞ  é
   é   )r   r   r   r   r   r   )
r   rÝ   r   r   r-   r.   ræ   r  rß   rB   )r    r3   ÚdateÚsecondsr"  s   &    r   Ú#test_toDateUsesArgumentsToMakeADateÚ5DailyLogFileTests.test_toDateUsesArgumentsToMakeADate
  sa   € ô
 ×"Ò" 4§9¡9¨d¯h©hÓ7ˆØ�‰˜Ÿ	™	Ô"àˆÜ—+’+˜d X�oÓ.ˆà—*‘*˜WÓ%ˆØ×Ñ˜Ö'r   rÐ   N)rÑ   rÒ   rÓ   rÔ   rÕ   r!   rF   rY   rÿ   r  r   r   r§   r¨   r
  r  r  r#  r+  rÖ   r   r   r   rë   rë   h  si   † ñõ6õ5õ2õ4.õ62ñ" Ø×Ñ×"Ñ"Ó$ð	!óô
2óð
2õ2õ	>õ-÷0(ñ (r   rë   )Ú
__future__r   r<   r¸   r   r{   ræ   Úunittestr   Útwisted.pythonr   r   Útwisted.trial.unittestr   r	   rÝ   rØ   rë   r   r   r   Ú<module>r1     sQ   ðõ #ã Û Û 	Û Û Ý ç +Ý +ôG1�8ô G1ôT
,˜×-Ñ-ô ,ôn(˜ö n(r   