+
    üÐjnk  ã                  ó\  € R t ^ RIHt ^ RIt^ RIt^ RIt^ RIHtHtH	t	H
t
Ht ^ RIHt ^ RIHtHtHt ^ RIHtHt ^ RIHt ^ RIHt ^ R	IHt ^ R
IHt ^ RIHtHt ^ RI H!t! ]! ]4       ! R R4      4       t" ! R R]]4      t# ! R R]!PH                  4      t% ! R R]!PL                  4      t'R# )z&
Tests for L{twisted.runner.procmon}.
)ÚannotationsN)ÚAnyStrÚMappingÚOptionalÚSequenceÚUnion)Úimplementer)ÚProcessDoneÚProcessExitedAlreadyÚProcessTerminated)ÚIProcessProtocolÚIProcessTransport)ÚClock)ÚMemoryReactor)ÚglobalLogPublisher)ÚFailure)ÚLoggingProtocolÚProcessMonitor)Úunittestc                  ó<   € ] tR t^tRt^tRt^tRR ltR t	R t
RtR# )ÚDummyProcessa  
An incomplete and fake L{IProcessTransport} implementation for testing how
L{ProcessMonitor} behaves when its monitored processes exit.

@ivar _terminationDelay: the delay in seconds after which the DummyProcess
    will appear to exit when it receives a TERM signal
Nc                	ó~   € W`n         Wn        W n        W0n        W@n        WPn        Wpn        W€n        W�n        W n	        R # ©N)
ÚprotoÚ_reactorÚ_executableÚ_argsÚ_environmentÚ_pathÚ_uidÚ_gidÚ_usePTYÚ	_childFDs)ÚselfÚreactorÚ
executableÚargsÚenvironmentÚpathr   ÚuidÚgidÚusePTYÚchildFDss   &&&&&&&&&&&ÚB/usr/lib/python3/dist-packages/twisted/runner/test/test_procmon.pyÚ__init__ÚDummyProcess.__init__)   s8   € ð Œ
àŒØ%ÔØŒ
Ø'ÔØŒ
ØŒ	ØŒ	ØŒØ!Žó    c                óÔ   € RV P                   ^ 3RR/pV P                  f   \        4       hW9   d8   W!,          w  r4V P                  P	                  W0P
                  V4      V n        R# R# )a©  
A partial implementation of signalProcess which can only handle TERM and
KILL signals.
 - When a TERM signal is given, the dummy process will appear to exit
   after L{DummyProcess._terminationDelay} seconds with exit code 0
 - When a KILL signal is given, the dummy process will appear to exit
   immediately with exit code 1.

@param signalID: The signal name or number to be issued to the process.
@type signalID: C{str}
ÚTERMÚKILLN)é    é   )Ú_terminationDelayÚpidr
   r   Ú	callLaterÚprocessEndedÚ_signalHandler)r#   ÚsignalIDÚparamsÚdelayÚstatuss   &&   r-   ÚsignalProcessÚDummyProcess.signalProcessB   sg   € ð ˜4×1Ñ1°1Ð5°v¸vÐFˆà�8‰8ÒÜ&Ó(Ð(àÔØ"Õ,‰MˆEØ"&§-¡-×"9Ñ"9Ø×(Ñ(¨&ó#ˆDÖñ r0   c                ó�   € RV n         ^ \        ^\        /pV P                  P	                  \        W!,          ! V4      4      4       R# )z3
Deliver the process ended event to C{self.proto}.
N)r7   r	   r   r   r9   r   )r#   r>   Ú	statusMaps   && r-   r9   ÚDummyProcess.processEndedY   s>   € ð ˆŒàŒ{ØÔ ð
ˆ	ð 	�
‰
×Ñ¤¨	Ö(9¸&Ó(AÓ BÖCr0   )r   r"   r   r   r    r   r   r:   r   r!   r7   r   )NNr4   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r7   r   r6   r.   r?   r9   Ú__static_attributes__© r0   r-   r   r      s)   † ñð €CØ€EàÐô"ò2ö.	Dr0   r   c                  óL   € ] tR t^et$ RtR]R&   R]R&   R R ltRR	 R
 lltRtR# )ÚDummyProcessReactorz¹
@ivar spawnedProcesses: a list that keeps track of the fake process
    instances built by C{spawnProcess}.

@ivar spawnProcessException: An exception which spawnProcess() will raise.
zlist[DummyProcess]ÚspawnedProcesseszException | NoneÚspawnProcessExceptionc               ó   € V ^8„  d   QhRR/# ©é   ÚreturnÚNonerJ   )Úformats   "r-   Ú__annotate__Ú DummyProcessReactor.__annotate__p   s   € ÷ *ñ *˜$ñ *r0   c                	óz   € \         P                  ! V 4       \        P                  ! V 4       . V n        R V n        R # r   )r   r.   r   rM   rN   ©r#   s   &r-   r.   ÚDummyProcessReactor.__init__p   s,   € Ü×Ò˜tÔ$Ü�Š�tÔØ "ˆÔØ%)ˆÖ"r0   Nc               ó@   € V ^8„  d   QhRRRRRRRRR	R
RRRRRRRRRR/
# )rQ   ÚprocessProtocolr   r%   zUnion[bytes, str]r&   zSequence[Union[bytes, str]]Úenvz!Optional[Mapping[AnyStr, AnyStr]]r(   zUnion[None, bytes, str]r)   zOptional[int]r*   r+   Úboolr,   z'Optional[Mapping[int, Union[int, str]]]rR   r   rJ   )rT   s   "r-   rU   rV   v   sn   € ÷ !ñ !à)ð!ð &ð!ð *ð	!ð
 /ð!ð &ð!ð ð!ð ð!ð ð!ð :ð!ð 
ñ!r0   c
                óº   € V P                   e   V P                   h\        V VVVVVVVVV	4
      p
VP                  V
4       V P                  P	                  V
4       V
# )zb
Fake L{reactor.spawnProcess}, that logs all the process
arguments and returns a L{DummyProcess}.
)rN   r   ÚmakeConnectionrM   Úappend)r#   r[   r%   r&   r\   r(   r)   r*   r+   r,   Úprocs   &&&&&&&&&& r-   ÚspawnProcessÚ DummyProcessReactor.spawnProcessv   sm   € ð  ×%Ñ%Ò1Ø×,Ñ,Ð,äØØØØØØØØØØó
ˆð 	×&Ñ& tÔ,Ø×Ñ×$Ñ$ TÔ*Øˆr0   )rN   rM   )NNNNFN)	rD   rE   rF   rG   rH   Ú__annotations__r.   rb   rI   rJ   r0   r-   rL   rL   e   s$   ‡ ñð )Ó(Ø+Ó+õ*÷!ó !r0   rL   c                  óò   € ] tR t^štRtR tR tR tR tR t	R t
R tR	 tR
 tR tR tR tR tR tR R ltR R ltR tR tR tR tR tR tR tR tR tR tR tR t R  t!R! t"R" t#R# t$R$ t%R% t&R&t'R'# )(ÚProcmonTestsz
Tests for L{ProcessMonitor}.
c                óÀ   € \        4       V n        \        V P                  R7      V n        ^V P                  n        ^
V P                  n        ^
V P                  n        R# )z<
Create an L{ProcessMonitor} wrapped around a fake reactor.
©r$   N)rL   r$   r   ÚpmÚminRestartDelayÚmaxRestartDelayÚ	thresholdrX   s   &r-   ÚsetUpÚProcmonTests.setUpŸ   sB   € ô +Ó,ˆŒÜ ¨¯©Ô6ˆŒØ"#ˆ�‰ÔØ"$ˆ�‰ÔØˆ�‰Ör0   c                óà   € V P                   P                  RRR.^^/ R7       \        V P                   4      pV P                  RV4       V P                  RV4       V P                  RV4       R# )z
Repr includes all details
ÚfooÚarg1Úarg2©r)   r*   r\   Ú1Ú2N)ri   Ú
addProcessÚreprÚassertIn©r#   Úrepresentations   & r-   Útest_reprLooksGoodÚProcmonTests.test_reprLooksGood©   s]   € ð 	�‰×Ñ˜5 6¨6Ð"2¸¸qÀbÐÔIÜ˜dŸg™g›ˆØ�‰�e˜^Ô,Ø�‰�c˜>Ô*Ø�‰�c˜>Ö*r0   c                ó¸   € V P                   P                  RRR./ R7       \        V P                   4      pV P                  RV4       V P                  RV4       R# )z—
Repr does not include unneeded details.

Values of attributes that just mean "inherit from launching
process" do not appear in the repr of a process.
rp   rq   rr   )r\   Ú(Ú)N)ri   rv   rw   ÚassertNotInry   s   & r-   Útest_simpleReprLooksGoodÚ%ProcmonTests.test_simpleReprLooksGood³   sO   € ð 	�‰×Ñ˜5 6¨6Ð"2¸ÐÔ;Ü˜dŸg™g›ˆØ×Ñ˜˜nÔ-Ø×Ñ˜˜nÖ-r0   c                ó¼   € V P                   P                  RRR.^^/ R7       V P                  V P                   P                  4       R,          RRR.^^/ 3/4       R# )zG
The list of monitored processes must be included in the pickle state.
rp   rq   rr   rs   Ú	processesN)ri   rv   ÚassertEqualÚ__getstate__rX   s   &r-   Útest_getStateIncludesProcessesÚ+ProcmonTests.test_getStateIncludesProcesses¿   s_   € ð 	�‰×Ñ˜5 6¨6Ð"2¸¸qÀbÐÔIØ×ÑØ�G‰G× Ñ Ó" ;Õ/°%¸6À6Ð:JÈAÈqÐRTÐ9UÐ1Vö	
r0   c                óZ   € V P                  RV P                  P                  4       4       R# )zf
The private L{ProcessMonitor._reactor} instance variable should not be
included in the pickle state.
r   N)r€   ri   r†   rX   s   &r-   Útest_getStateExcludesReactorÚ)ProcmonTests.test_getStateExcludesReactorÈ   s!   € ð
 	×Ñ˜ T§W¡W×%9Ñ%9Ó%;Ö<r0   c                óØ  € V P                   P                  RRR.^^/ R7       V P                  V P                   P                  / 4       V P                  V P                   P                  RRR.^^/ 3/4       V P                   P                  4        V P                  P                  ^ 4       V P                  \        V P                   P                  P                  4       4      R.4       R# )zo
L{ProcessMonitor.addProcess} only starts the named program if
L{ProcessMonitor.startService} has been called.
rp   rq   rr   rs   N)
ri   rv   r…   Ú	protocolsr„   ÚstartServicer$   ÚadvanceÚlistÚkeysrX   s   &r-   Útest_addProcessÚProcmonTests.test_addProcessÏ   s¹   € ð
 	�‰×Ñ˜5 6¨6Ð"2¸¸qÀbÐÔIØ×Ñ˜Ÿ™×*Ñ*¨BÔ/Ø×Ñ˜Ÿ™×*Ñ*¨U°f¸fÐ5EÀqÈ!ÈRÐ4PÐ,QÔRØ�‰×ÑÔØ�‰×Ñ˜QÔØ×Ñœ˜dŸg™g×/Ñ/×4Ñ4Ó6Ó7¸%¸ÖAr0   c           
     ó®   € V P                   P                  RRR.^^/ R7       V P                  \        V P                   P                  RRR.^^/ R7       R# )zd
L{ProcessMonitor.addProcess} raises a C{KeyError} if a process with the
given name already exists.
rp   rq   rr   rs   N)ri   rv   ÚassertRaisesÚKeyErrorrX   s   &r-   Ú test_addProcessDuplicateKeyErrorÚ-ProcmonTests.test_addProcessDuplicateKeyErrorÛ   sX   € ð
 	�‰×Ñ˜5 6¨6Ð"2¸¸qÀbÐÔIØ×ÑÜ�d—g‘g×(Ñ(¨%°&¸&Ð1AÀqÈaÐUWð 	ö 	
r0   c                ó(  € RR/pV P                   P                  4        V P                   P                  RR.^^VR7       V P                  P	                  ^ 4       V P                  V P                  P                  ^ ,          P                  V4       R# )zk
L{ProcessMonitor.addProcess} takes an C{env} parameter that is passed to
L{IReactorProcess.spawnProcess}.
ÚKEYÚvaluerp   rs   N)ri   rŽ   rv   r$   r�   r…   rM   r   )r#   ÚfakeEnvs   & r-   Útest_addProcessEnvÚProcmonTests.test_addProcessEnvå   st   € ð
 ˜'Ð"ˆØ�‰×ÑÔØ�‰×Ñ˜5 5 '¨q°a¸WÐÔEØ�‰×Ñ˜QÔØ×Ñ˜Ÿ™×6Ñ6°qÕ9×FÑFÈÖPr0   c                ó  € V P                   P                  4        V P                   P                  RR.RR7       V P                  P	                  ^ 4       V P                  V P                  P                  ^ ,          P                  R4       R# )zk
L{ProcessMonitor.addProcess} takes an C{cwd} parameter that is passed
to L{IReactorProcess.spawnProcess}.
rp   z	/mnt/lala)ÚcwdN)ri   rŽ   rv   r$   r�   r…   rM   r   rX   s   &r-   Útest_addProcessCwdÚProcmonTests.test_addProcessCwdð   sf   € ð
 	�‰×ÑÔØ�‰×Ñ˜5 5 '¨{ÐÔ;Ø�‰×Ñ˜QÔØ×Ñ˜Ÿ™×6Ñ6°qÕ9×?Ñ?ÀÖMr0   c                óf  € V P                   P                  4        V P                   P                  RR.4       V P                  \	        V P                   P
                  4      ^4       V P                   P                  R4       V P                  \	        V P                   P
                  4      ^ 4       R# )zU
L{ProcessMonitor.removeProcess} removes the process from the public
processes list.
rp   N)ri   rŽ   rv   r…   Úlenr„   ÚremoveProcessrX   s   &r-   Útest_removeProcessÚProcmonTests.test_removeProcessú   sz   € ð
 	�‰×ÑÔØ�‰×Ñ˜5 5 'Ô*Ø×Ñœ˜TŸW™W×.Ñ.Ó/°Ô3Ø�‰×Ñ˜eÔ$Ø×Ñœ˜TŸW™W×.Ñ.Ó/°Ö3r0   c                ó�   € V P                   P                  4        V P                  \        V P                   P                  R4       R# )zb
L{ProcessMonitor.removeProcess} raises a C{KeyError} if the given
process name isn't recognised.
rp   N)ri   rŽ   r•   r–   r¥   rX   s   &r-   Ú!test_removeProcessUnknownKeyErrorÚ.ProcmonTests.test_removeProcessUnknownKeyError  s0   € ð
 	�‰×ÑÔØ×Ñœ( D§G¡G×$9Ñ$9¸5ÖAr0   c                ó@  € V P                   P                  RR.4       V P                   P                  R4       V P                  V P                   P                  R,          \
        4       V P                  RV P                   P                  P                  4       4       R# )zÞ
When a process has been started, an instance of L{LoggingProtocol} will
be added to the L{ProcessMonitor.protocols} dict and the start time of
the process will be recorded in the L{ProcessMonitor.timeStarted}
dictionary.
rp   N)	ri   rv   ÚstartProcessÚassertIsInstancer�   r   rx   ÚtimeStartedr‘   rX   s   &r-   Útest_startProcessÚProcmonTests.test_startProcess  sl   € ð 	�‰×Ñ˜5 5 'Ô*Ø�‰×Ñ˜UÔ#Ø×Ñ˜dŸg™g×/Ñ/°Õ6¼ÔHØ�‰�e˜TŸW™W×0Ñ0×5Ñ5Ó7Ö8r0   c                óÊ   € V P                   P                  RR.4       V P                   P                  R4       V P                  V P                   P                  R4      4       R# )zZ
L{ProcessMonitor.startProcess} silently returns if the named process is
already started.
rp   N)ri   rv   r¬   ÚassertIsNonerX   s   &r-   Útest_startProcessAlreadyStartedÚ,ProcmonTests.test_startProcessAlreadyStarted  sI   € ð
 	�‰×Ñ˜5 5 'Ô*Ø�‰×Ñ˜UÔ#Ø×Ñ˜$Ÿ'™'×.Ñ.¨uÓ5Ö6r0   c                ó\   € V P                  \        V P                  P                  R4       R# )za
L{ProcessMonitor.startProcess} raises a C{KeyError} if the given
process name isn't recognised.
rp   N)r•   r–   ri   r¬   rX   s   &r-   Ú test_startProcessUnknownKeyErrorÚ-ProcmonTests.test_startProcessUnknownKeyError"  s    € ð
 	×Ñœ( D§G¡G×$8Ñ$8¸%Ö@r0   c               ó   € V ^8„  d   QhRR/# rP   rJ   )rT   s   "r-   rU   ÚProcmonTests.__annotate__)  s   € ÷ Cñ C°tñ Cr0   c                ó  € \        \        P                  \        P                  ! \        P                  4      4      V P
                  n        ^{V P                  n        ^{V P                  n	        V P                  P                  RR.4       V P                  P                  R4       V P                  V P                  P                  R,          ^{4       V P                  \        V P                  \         4      4      ^4       R# )zg
L{IReactorProcess.spawnProcess} might raise C{OSError}, ensure it
is caught and process is restarted.
rp   N)ÚOSErrorÚerrnoÚEAGAINÚosÚstrerrorr$   rN   ri   rj   rk   rv   r¬   ÚassertEqualsr=   r¤   ÚflushLoggedErrorsrX   s   &r-   Ú%test_startProcessSpawnCaughtExceptionÚ2ProcmonTests.test_startProcessSpawnCaughtException)  sª   € ô
 .5Ü�L‰Lœ"Ÿ+š+¤e§l¡lÓ3ó.
ˆ�‰Ô*ð #&ˆ�‰ÔØ"%ˆ�‰ÔØ�‰×Ñ˜5 5 'Ô*Ø�‰×Ñ˜UÔ#à×Ñ˜$Ÿ'™'Ÿ-™-¨Õ.°Ô4Ø×Ñœ#˜d×4Ñ4´WÓ=Ó>ÀÖBr0   c               ó   € V ^8„  d   QhRR/# rP   rJ   )rT   s   "r-   rU   r¹   9  s   € ÷ Dñ D¸ñ Dr0   c                óÊ   € \        R4      V P                  n        V P                  P	                  RR.4       V P                  \         V P                  P                  R4       R# )za
L{IReactorProcess.spawnProcess} might raise C{OSError}, ensure other
exceptions are not caught.
zJust another exceptionrp   N)ÚSystemErrorr$   rN   ri   rv   r•   r¬   rX   s   &r-   Ú'test_startProcessSpawnUncaughtExceptionÚ4ProcmonTests.test_startProcessSpawnUncaughtException9  sH   € ô
 .9Ð9QÓ-Rˆ�‰Ô*Ø�‰×Ñ˜5 5 'Ô*Ø×Ñœ+ t§w¡w×';Ñ';¸UÖCr0   c                ó¤  € V P                   P                  4        V P                   P                  RR.4       V P                  RV P                   P                  4       ^;qP                   P                  R,          P
                  n        V P                  P                  V P                   P                  4       V P                   P                  R4       V P                  P                  V4       V P                  P                  ^ 4       V P                  V P                  P                  4       V P                   P                  R,          4       R# )zU
L{ProcessMonitor.stopProcess} immediately sends a TERM signal to the
named process.
rp   N)ri   rŽ   rv   rx   r�   Ú	transportr6   r$   r�   rl   ÚstopProcessr…   Úsecondsr®   )r#   Ú	timeToDies   & r-   Ú"test_stopProcessNaturalTerminationÚ/ProcmonTests.test_stopProcessNaturalTerminationB  sì   € ð
 	�‰×ÑÔØ�‰×Ñ˜5 5 'Ô*Ø�‰�e˜TŸW™W×.Ñ.Ô/ð LMÐLˆ	—G‘G×%Ñ% eÕ,×6Ñ6ÔHð 	�‰×Ñ˜TŸW™W×.Ñ.Ô/à�‰×Ñ˜EÔ"ð 	�‰×Ñ˜YÔ'ð
 	�‰×Ñ˜QÔð 	×Ñ˜Ÿ™×-Ñ-Ó/°·±×1DÑ1DÀUÕ1KÖLr0   c                ó¦  € V P                   P                  4        V P                   P                  RR.4       V P                  RV P                   P                  4       V P
                  P                  V P                   P                  4       V P                   P                  R,          P                  pV P                   P                  ^,           Vn
        V P                   P                  R4       V P
                  P                  V P                   P                  ^,
          4       V P                  RV P                   P                  R,          4       V P
                  P                  ^4       V P
                  P                  ^ ^ .4       V P                  V P
                  P                  4       V P                   P                  R,          4       R# )z}
L{ProcessMonitor.stopProcess} kills a process which fails to terminate
naturally within L{ProcessMonitor.killTime} seconds.
rp   g        N)ri   rŽ   rv   rx   r�   r$   r�   rl   rÊ   ÚkillTimer6   rË   r…   r®   ÚpumprÌ   )r#   ra   s   & r-   Útest_stopProcessForcedKillÚ'ProcmonTests.test_stopProcessForcedKill`  s9  € ð
 	�‰×ÑÔØ�‰×Ñ˜5 5 'Ô*Ø�‰�e˜TŸW™W×.Ñ.Ô/Ø�‰×Ñ˜TŸW™W×.Ñ.Ô/Ø�w‰w× Ñ  Õ'×1Ñ1ˆà!%§¡×!1Ñ!1°AÕ!5ˆÔØ�‰×Ñ˜EÔ"ð 	�‰×Ñ˜TŸW™W×-Ñ-°Õ1Ô2Ø×Ñ˜˜dŸg™g×1Ñ1°%Õ8Ô9à�‰×Ñ˜QÔð 	�‰×Ñ˜1˜a˜&Ô!à×Ñ˜Ÿ™×-Ñ-Ó/°·±×1DÑ1DÀUÕ1KÖLr0   c                ó\   € V P                  \        V P                  P                  R4       R# )z`
L{ProcessMonitor.stopProcess} raises a C{KeyError} if the given process
name isn't recognised.
rp   N)r•   r–   ri   rË   rX   s   &r-   Útest_stopProcessUnknownKeyErrorÚ,ProcmonTests.test_stopProcessUnknownKeyError}  s    € ð
 	×Ñœ( D§G¡G×$7Ñ$7¸Ö?r0   c                ó”   € V P                   P                  RR.4       V P                  V P                   P                  R4      4       R# )zÁ
L{ProcessMonitor.stopProcess} silently returns if the named process
is already stopped. eg Process has crashed and a restart has been
rescheduled, but in the meantime, the service is stopped.
rp   N)ri   rv   r²   rË   rX   s   &r-   Útest_stopProcessAlreadyStoppedÚ+ProcmonTests.test_stopProcessAlreadyStopped„  s7   € ð 	�‰×Ñ˜5 5 'Ô*Ø×Ñ˜$Ÿ'™'×-Ñ-¨eÓ4Ö5r0   c                óŠ  € . pV P                  \        P                  VP                  4       \        P                  ! VP                  4       V P
                  P                  RR.4       V P
                  P                  4        V P                  P                  ^ 4       V P                  RV P
                  P                  4       V P                  P                  V P
                  P                  4       V P
                  P                  R,          P                  R4       V P                  \        V4      ^4       V^ ,          R,          pV^ ,          R,          pV^ ,          R,          pV^ ,          R,          pV P                  VR4       V P                  VR4       V P                  VR4       V P                  VR	4       R
# )zC
Getting a complete output line on stdout generates a log message.
rp   ó   hello world!
Úlog_namespaceÚstreamÚtagÚlineú%twisted.runner.procmon.ProcessMonitorÚstdoutúhello world!N)Ú
addCleanupr   ÚremoveObserverr`   ÚaddObserverri   rv   rŽ   r$   r�   rx   r�   rl   ÚoutReceivedrÀ   r¤   ©r#   ÚeventsÚ	namespacerÞ   rß   rà   s   &     r-   Útest_outputReceivedCompleteLineÚ,ProcmonTests.test_outputReceivedCompleteLine�  óK  € ð ˆØ�‰Ô*×9Ñ9¸6¿=¹=ÔIÜ×&Ò& v§}¡}Ô5Ø�‰×Ñ˜5 5 'Ô*à�‰×ÑÔà�‰×Ñ˜QÔØ�‰�e˜TŸW™W×.Ñ.Ô/à�‰×Ñ˜TŸW™W×.Ñ.Ô/à�‰×Ñ˜%Õ ×,Ñ,Ð->Ô?Ø×Ñœ#˜f›+ qÔ)Ø˜1•I˜oÕ.ˆ	Ø˜•˜8Õ$ˆØ�Q�i˜ÕˆØ�a�y˜Õ ˆØ×Ñ˜)Ð%LÔMØ×Ñ˜& (Ô+Ø×Ñ˜#˜uÔ%Ø×Ñ˜$ Ö/r0   c                óŠ  € . pV P                  \        P                  VP                  4       \        P                  ! VP                  4       V P
                  P                  RR.4       V P
                  P                  4        V P                  P                  ^ 4       V P                  RV P
                  P                  4       V P                  P                  V P
                  P                  4       V P
                  P                  R,          P                  R4       V P                  \        V4      ^4       V^ ,          R,          pV^ ,          R,          pV^ ,          R,          pV^ ,          R,          pV P                  VR4       V P                  VR4       V P                  VR4       V P                  VR	4       R
# )zC
Getting a complete output line on stderr generates a log message.
rp   rÜ   rÝ   rÞ   rß   rà   rá   Ústderrrã   N)rä   r   rå   r`   ræ   ri   rv   rŽ   r$   r�   rx   r�   rl   ÚerrReceivedrÀ   r¤   rè   s   &     r-   Ú!test_ouputReceivedCompleteErrLineÚ.ProcmonTests.test_ouputReceivedCompleteErrLine¨  rí   r0   c                óv  € . pV P                  \        P                  VP                  4       \        P                  ! VP                  4       V P
                  P                  RR.4       V P
                  P                  4        V P                  P                  ^ 4       V P                  RV P
                  P                  4       V P                  P                  V P
                  P                  4       V P
                  P                  R,          P                  R4       V P                  \        V4      ^4       V^ ,          pVR,          pVR,          pVR,          pVR,          pV P                  VR4       V P                  VR4       V P                  VR4       V P                  V\!        R	4      4       R
# )z>
Getting invalid UTF-8 results in the repr of the raw message
rp   s   ÿhello world!
rÝ   rÞ   rß   rà   rá   râ   s   ÿhello world!N)rä   r   rå   r`   ræ   ri   rv   rŽ   r$   r�   rx   r�   rl   rç   rÀ   r¤   rw   )r#   ré   Úmessagerê   rÞ   rß   Úoutputs   &      r-   Ú*test_outputReceivedCompleteLineInvalidUTF8Ú7ProcmonTests.test_outputReceivedCompleteLineInvalidUTF8Ã  sH  € ð ˆØ�‰Ô*×9Ñ9¸6¿=¹=ÔIÜ×&Ò& v§}¡}Ô5Ø�‰×Ñ˜5 5 'Ô*à�‰×ÑÔà�‰×Ñ˜QÔØ�‰�e˜TŸW™W×.Ñ.Ô/à�‰×Ñ˜TŸW™W×.Ñ.Ô/à�‰×Ñ˜%Õ ×,Ñ,Ð-BÔCØ×Ñœ#˜f›+ qÔ)Ø˜•)ˆØ˜OÕ,ˆ	Ø˜Õ"ˆØ�e�nˆØ˜•ˆØ×Ñ˜)Ð%LÔMØ×Ñ˜& (Ô+Ø×Ñ˜#˜uÔ%Ø×Ñ˜&¤$Ð':Ó";Ö<r0   c                ó<  € . pV P                  \        P                  VP                  4       \        P                  ! VP                  4       V P
                  P                  RR.4       V P
                  P                  4        V P                  P                  ^ 4       V P                  RV P
                  P                  4       V P                  P                  V P
                  P                  4       V P
                  P                  R,          P                  R4       V P                  \        V4      ^ 4       V P
                  P                  R,          P!                  \#        \%        ^ 4      4      4       V P                  \        V4      ^4       V^ ,          R,          pV^ ,          R,          pV^ ,          R,          pV^ ,          R,          pV P                  VR4       V P                  VR4       V P                  VR4       V P                  VR	4       R
# )z=
Getting partial line results in no events until process end
rp   s   hello world!rÝ   rÞ   rß   rà   rá   râ   rã   N)rä   r   rå   r`   ræ   ri   rv   rŽ   r$   r�   rx   r�   rl   rç   rÀ   r¤   r9   r   r	   rè   s   &     r-   Útest_outputReceivedPartialLineÚ+ProcmonTests.test_outputReceivedPartialLineß  s„  € ð ˆØ�‰Ô*×9Ñ9¸6¿=¹=ÔIÜ×&Ò& v§}¡}Ô5Ø�‰×Ñ˜5 5 'Ô*à�‰×ÑÔà�‰×Ñ˜QÔØ�‰�e˜TŸW™W×.Ñ.Ô/à�‰×Ñ˜TŸW™W×.Ñ.Ô/à�‰×Ñ˜%Õ ×,Ñ,¨_Ô=Ø×Ñœ#˜f›+ qÔ)Ø�‰×Ñ˜%Õ ×-Ñ-¬g´kÀ!³nÓ.EÔFØ×Ñœ#˜f›+ qÔ)Ø˜1•I˜oÕ.ˆ	Ø˜•˜8Õ$ˆØ�Q�i˜ÕˆØ�a�y˜Õ ˆØ×Ñ˜)Ð%LÔMØ×Ñ˜& (Ô+Ø×Ñ˜#˜uÔ%Ø×Ñ˜$ Ö/r0   c                óž  € V P                   P                  RR.4       V P                   P                  4        V P                  P	                  ^ 4       V P                  RV P                   P                  4       V P                  P	                  V P                   P                  4       V P                   P                  R,          P                  \        \        ^ 4      4      4       V P                  RV P                   P                  4       V P                  P	                  ^ 4       V P                  RV P                   P                  4       R# )zŒ
L{ProcessMonitor.processExit} should immediately restart a process
if it has been running longer than L{ProcessMonitor.threshold} seconds.
rp   N)ri   rv   rŽ   r$   r�   rx   r�   rl   r9   r   r	   r€   rX   s   &r-   Ú#test_connectionLostLongLivedProcessÚ0ProcmonTests.test_connectionLostLongLivedProcessü  sÚ   € ð
 	�‰×Ñ˜5 5 'Ô*à�‰×ÑÔà�‰×Ñ˜QÔØ�‰�e˜TŸW™W×.Ñ.Ô/à�‰×Ñ˜TŸW™W×.Ñ.Ô/à�‰×Ñ˜%Õ ×-Ñ-¬g´kÀ!³nÓ.EÔFØ×Ñ˜ §¡× 1Ñ 1Ô2à�‰×Ñ˜QÔØ�‰�e˜TŸW™W×.Ñ.Ö/r0   c                óÂ  € V P                   P                  RR.4       V P                   P                  4        V P                  P	                  ^4       V P                   P                  R4       V P                  RV P                   P                  4       V P                   P                  R,          pV P                  VP                  4       4       V P                  P	                  V P                   P                  R,          P                  P                  4       V P                  VP                  4       4       V P                  RV P                   P                  4       R# )z†
L{ProcessMonitor.processExit} cancels a scheduled process killer and
deletes the DelayedCall from the L{ProcessMonitor.murder} list.
rp   N)ri   rv   rŽ   r$   r�   rË   rx   ÚmurderÚ
assertTrueÚactiver�   rÊ   r6   ÚassertFalser€   )r#   ÚdelayedCalls   & r-   Útest_connectionLostMurderCancelÚ,ProcmonTests.test_connectionLostMurderCancel  sç   € ð
 	�‰×Ñ˜5 5 'Ô*à�‰×ÑÔà�‰×Ñ˜QÔØ�‰×Ñ˜EÔ"à�‰�e˜TŸW™WŸ^™^Ô,Ø—g‘g—n‘n UÕ+ˆØ�‰˜×*Ñ*Ó,Ô-à�‰×Ñ˜TŸW™W×.Ñ.¨uÕ5×?Ñ?×QÑQÔRà×Ñ˜×+Ñ+Ó-Ô.Ø×Ñ˜ §¡§¡Ö/r0   c                ó  € V P                   P                  4        V P                   P                  RR.4       V P                  RV P                   P                  4       V P                   P                  R,          P
                  P                  R4       V P                  P                  V P                   P                  R,          P
                  P                  4       V P                  RV P                   P                  4       R# )z}
L{ProcessMonitor.processExit} removes the corresponding
ProcessProtocol instance from the L{ProcessMonitor.protocols} list.
rp   r3   N)ri   rŽ   rv   rx   r�   rÊ   r?   r$   r�   r6   r€   rX   s   &r-   Ú#test_connectionLostProtocolDeletionÚ0ProcmonTests.test_connectionLostProtocolDeletion%  s¬   € ð
 	�‰×ÑÔØ�‰×Ñ˜5 5 'Ô*Ø�‰�e˜TŸW™W×.Ñ.Ô/Ø�‰×Ñ˜%Õ ×*Ñ*×8Ñ8¸Ô@Ø�‰×Ñ˜TŸW™W×.Ñ.¨uÕ5×?Ñ?×QÑQÔRØ×Ñ˜ §¡× 1Ñ 1Ö2r0   c                ó¤  € ^V P                   n        ^V P                   n        V P                   P                  4        V P                   P	                  RR.4       V P                  V P                   P                  R,          V P                   P                  4       V P                  P                  V P                   P                  ^,
          4       V P                   P                  R,          P                  \        \        ^ 4      4      4       V P                  V P                   P                  R,          V P                   P                  4       R# )zb
L{ProcessMonitor.processExit} will wait at least minRestartDelay s
and at most maxRestartDelay s
rp   N)ri   rj   rk   rŽ   rv   r…   r=   r$   r�   rl   r�   r9   r   r	   rX   s   &r-   Ú%test_connectionLostMinMaxRestartDelayÚ2ProcmonTests.test_connectionLostMinMaxRestartDelay1  s×   € ð
 #$ˆ�‰ÔØ"#ˆ�‰Ôà�‰×ÑÔØ�‰×Ñ˜5 5 'Ô*à×Ñ˜Ÿ™Ÿ™ uÕ-¨t¯w©w×/FÑ/FÔGØ�‰×Ñ˜TŸW™W×.Ñ.°Õ2Ô3Ø�‰×Ñ˜%Õ ×-Ñ-¬g´kÀ!³nÓ.EÔFØ×Ñ˜Ÿ™Ÿ™ uÕ-¨t¯w©w×/FÑ/FÖGr0   c                óº  € V P                   P                  4        V P                   P                  RR.4       V P                  P	                  V P                   P
                  ^,
          4       V P                  RV P                   P                  4       V P                  V P                   P                  R,          V P                   P                  4       V P                   P                  R,          P                  \        \        ^ 4      4      4       V P                  V P                   P                  R,          V P                   P                  ^,          4       R# )za
L{ProcessMonitor.processExit} doubles the restart delay each time
the process dies too quickly.
rp   N)ri   rŽ   rv   r$   r�   rl   rx   r�   r…   r=   rj   r9   r   r	   rX   s   &r-   Ú&test_connectionLostBackoffDelayDoublesÚ3ProcmonTests.test_connectionLostBackoffDelayDoublesA  sÜ   € ð
 	�‰×ÑÔØ�‰×Ñ˜5 5 'Ô*Ø�‰×Ñ˜TŸW™W×.Ñ.°Õ2Ô3Ø�‰�e˜TŸW™W×.Ñ.Ô/Ø×Ñ˜Ÿ™Ÿ™ uÕ-¨t¯w©w×/FÑ/FÔGà�‰×Ñ˜%Õ ×-Ñ-¬g´kÀ!³nÓ.EÔFØ×Ñ˜Ÿ™Ÿ™ uÕ-¨t¯w©w×/FÑ/FÈÕ/JÖKr0   c                óö   € V P                   P                  RR.4       V P                   P                  4        V P                  P	                  ^ 4       V P                  RV P                   P                  4       R# )z@
L{ProcessMonitor.startService} starts all monitored processes.
rp   N)ri   rv   rŽ   r$   r�   rx   r�   rX   s   &r-   Útest_startServiceÚProcmonTests.test_startServiceO  sT   € ð 	�‰×Ñ˜5 5 'Ô*à�‰×ÑÔà�‰×Ñ˜QÔØ�‰�e˜TŸW™W×.Ñ.Ö/r0   c                óÆ  € V P                   P                  RR.4       V P                   P                  RR.4       V P                   P                  4        V P                  P	                  V P                   P
                  4       V P                  RV P                   P                  4       V P                  RV P                   P                  4       V P                  P	                  ^4       V P                   P                  4        V P                  P	                  V P                   P                  ^,           4       V P                  / V P                   P                  4       R# )zD
L{ProcessMonitor.stopService} should stop all monitored processes.
rp   ÚbarN)ri   rv   rŽ   r$   r�   rl   rx   r�   ÚstopServicerÑ   r…   rX   s   &r-   Útest_stopServiceÚProcmonTests.test_stopServiceZ  së   € ð 	�‰×Ñ˜5 5 'Ô*Ø�‰×Ñ˜5 5 'Ô*à�‰×ÑÔà�‰×Ñ˜TŸW™W×.Ñ.Ô/Ø�‰�e˜TŸW™W×.Ñ.Ô/Ø�‰�e˜TŸW™W×.Ñ.Ô/à�‰×Ñ˜QÔà�‰×ÑÔð 	�‰×Ñ˜TŸW™W×-Ñ-°Õ1Ô2à×Ñ˜˜TŸW™W×.Ñ.Ö/r0   c                óÌ  € V P                   P                  RR.4       V P                   P                  4        V P                  P	                  ^4       V P                   P                  4        V P                  P	                  ^4       \        V P                  P                  4      pVP                  4       pV P                  V. 4       V P                  VP                  4       R# )zB
L{ProcessMonitor.restartAll} succeeds when there is one process.
rp   N)ri   rv   rŽ   r$   r�   Ú
restartAllr�   rM   ÚpoprÀ   r²   r7   )r#   r„   Ú	myProcesss   &  r-   Ú!test_restartAllRestartsOneProcessÚ.ProcmonTests.test_restartAllRestartsOneProcessp  s¡   € ð 	�‰×Ñ˜5 5 'Ô*Ø�‰×ÑÔØ�‰×Ñ˜QÔØ�‰×ÑÔð 	�‰×Ñ˜QÔÜ˜Ÿ™×6Ñ6Ó7ˆ	Ø—M‘M“Oˆ	Ø×Ñ˜) RÔ(Ø×Ñ˜)Ÿ-™-Ö(r0   c                óì  € V P                   P                  RR.4       V P                   P                  4        V P                  P	                  V P                   P
                  4       V P                  RV P                   P                  4       V P                  P	                  ^4       V P                   P                  R,          P                  \        \        ^ 4      4      4       V P                  V P                   P                  R,          P                  4       4       V P                   P                  4        V P                  V P                   P                  R,          P                  4       4       R# )zM
L{ProcessMonitor.stopService} should cancel any scheduled process
restarts.
rp   N)ri   rv   rŽ   r$   r�   rl   rx   r�   r9   r   r	   r   Úrestartr  r  r  rX   s   &r-   Útest_stopServiceCancelRestartsÚ+ProcmonTests.test_stopServiceCancelRestarts€  sì   € ð
 	�‰×Ñ˜5 5 'Ô*à�‰×ÑÔà�‰×Ñ˜TŸW™W×.Ñ.Ô/Ø�‰�e˜TŸW™W×.Ñ.Ô/à�‰×Ñ˜QÔà�‰×Ñ˜%Õ ×-Ñ-¬g´kÀ!³nÓ.EÔFØ�‰˜Ÿ™Ÿ™¨Õ.×5Ñ5Ó7Ô8Ø�‰×ÑÔà×Ñ˜Ÿ™Ÿ™¨Õ/×6Ñ6Ó8Ö9r0   c                ó  € ^V P                   n        ^V P                   n        V P                   P                  4        V P                   P	                  RR.4       V P
                  P                  ^4       V P                   P                  R4       V P
                  P                  ^4       V P                   P                  4        V P
                  P                  ^4       V P                  V P                   P                  / 4       R# )zM
L{ProcessMonitor.stopService} should cancel all scheduled process
restarts.
rp   N)ri   rl   rj   rŽ   rv   r$   r�   rË   r  r…   r�   rX   s   &r-   Ú(test_stopServiceCleanupScheduledRestartsÚ5ProcmonTests.test_stopServiceCleanupScheduledRestarts”  s¶   € ð
 ˆ�‰ÔØ"#ˆ�‰Ôà�‰×ÑÔØ�‰×Ñ˜5 5 'Ô*à�‰×Ñ˜QÔØ�‰×Ñ˜EÔ"à�‰×Ñ˜QÔà�‰×ÑÔà�‰×Ñ˜QÔð 	×Ñ˜Ÿ™×*Ñ*¨BÖ/r0   ©ri   r$   N)(rD   rE   rF   rG   rH   rm   r{   r�   r‡   rŠ   r’   r—   r�   r¡   r¦   r©   r¯   r³   r¶   rÂ   rÇ   rÎ   rÓ   rÖ   rÙ   rë   rñ   rö   rù   rü   r  r  r
  r  r  r  r  r  r"  rI   rJ   r0   r-   rf   rf   š   s½   † ñòò+ò
.ò
ò=ò
Bò
ò	QòNò	4òBò
9ò7òAõCõ DòMò<Mò:@ò6ò0ò60ò6=ò80ò:0ò(0ò*
3òHò Lò	0ò0ò,)ò :ö(0r0   rf   c                  ó2   € ] tR tRtRtR tR tR tR tRt	R# )	ÚDeprecationTestsi¬  zI
Tests that check functionality that should be deprecated is deprecated.
c                óZ   € \        4       V n        \        V P                  R7      V n        R# )z%
Create reactor and process monitor.
rh   N)rL   r$   r   ri   rX   s   &r-   rm   ÚDeprecationTests.setUp±  s   € ô +Ó,ˆŒÜ ¨¯©Ô6ˆŽr0   c                ór  € V P                   P                  RR.4       V P                   P                  pV P                  \	        V4      ^4       V P                  4       pRpV F2  pV P                  VR,          \        4       RVR,          9   g   K0  RpK4  	  V P                  VR\        V4       24       R# )	zØ
_Process.toTuple is deprecated.

When getting the deprecated processes property, the actual
data (kept in the class _Process) is converted to a tuple --
which produces a DeprecationWarning per process so converted.
rp   FÚcategoryÚtoTuplerô   Tzno tuple deprecation found:N)
ri   rv   r„   rÀ   r¤   ÚflushWarningsÚassertIsÚDeprecationWarningr   rw   )r#   ÚmyprocessesÚwarningsÚfoundToTupleÚwarnings   &    r-   Útest_toTupleÚDeprecationTests.test_toTuple¸  sž   € ð 	�‰×Ñ˜5 5 'Ô*Ø—g‘g×'Ñ'ˆØ×Ñœ#˜kÓ*¨AÔ.Ø×%Ñ%Ó'ˆØˆÛˆGØ�M‰M˜' *Õ-Ô/AÔBØ˜G IÕ.Ö.Ø#’ñ  ð 	�‰˜Ð(CÄDÈÃNÐCSÐ&TÖUr0   c                óö   € V P                   P                  pV P                  V/ 4       V P                  4       pVP	                  ^ 4      pV P                  VR,          \        4       V P                  V. 4       R# )zõ
Accessing L{ProcessMonitor.processes} results in deprecation warning

Even when there are no processes, and thus no process is converted
to a tuple, accessing the L{ProcessMonitor.processes} property
should generate its own DeprecationWarning.
r*  N)ri   r„   rÀ   r,  r  r-  r.  )r#   ÚmyProcessesr0  Úfirsts   &   r-   Útest_processesÚDeprecationTests.test_processesË  sb   € ð —g‘g×'Ñ'ˆØ×Ñ˜+ rÔ*Ø×%Ñ%Ó'ˆØ—‘˜Q“ˆØ�‰�e˜JÕ'Ô);Ô<Ø×Ñ˜( BÖ'r0   c                ó²   € \         P                  ! V P                  4       V P                  4       pV F   pV P	                  VR,          \
        4       K"  	  R# )z?
Pickling an L{ProcessMonitor} results in deprecation warnings
r*  N)ÚpickleÚdumpsri   r,  r-  r.  )r#   r0  r2  s   &  r-   Útest_getstateÚDeprecationTests.test_getstateÚ  s@   € ô 	�Š�T—W‘WÔØ×%Ñ%Ó'ˆÛˆGØ�M‰M˜' *Õ-Ô/AÖBó  r0   r$  N)
rD   rE   rF   rG   rH   rm   r3  r8  r=  rI   rJ   r0   r-   r&  r&  ¬  s   † ñò7òVò&(öCr0   r&  )(rH   Ú
__future__r   r¼   r¾   r;  Útypingr   r   r   r   r   Úzope.interfacer   Útwisted.internet.errorr	   r
   r   Útwisted.internet.interfacesr   r   Útwisted.internet.taskr   Útwisted.internet.testingr   Útwisted.loggerr   Útwisted.python.failurer   Útwisted.runner.procmonr   r   Útwisted.trialr   r   rL   ÚTestCaserf   ÚSynchronousTestCaser&  rJ   r0   r-   Ú<module>rL     sš   ðñõ #ã Û 	Û ß =Õ =å &ç WÑ Wß KÝ 'Ý 2Ý -Ý *ß BÝ "ñ ÐÓ÷GDð GDó  ðGDôT2˜-¨ô 2ôjO0�8×$Ñ$ô O0ôd5C�x×3Ñ3ö 5Cr0   