ó
    Ö›‘hnk  ã                  óZ  • S r SSKJr  SSKrSSKrSSKrSSKJrJrJ	r	J
r
Jr  SSKJr  SSKJrJrJr  SSKJrJr  SSKJr  SS	KJr  SS
KJr  SSKJr  SSKJrJr  SSK J!r!  \" \5       " S S5      5       r" " S S\\5      r# " S S\!RH                  5      r% " S S\!RL                  5      r'g)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                  óB   • \ rS rSrSrSrSrSr    S	S jrS r	S r
Srg)
ÚDummyProcessé   a  
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                ó|   • X`l         Xl        X l        X0l        X@l        XPl        Xpl        X€l        X�l        X l	        g ©N)
ÚprotoÚ_reactorÚ_executableÚ_argsÚ_environmentÚ_pathÚ_uidÚ_gidÚ_usePTYÚ	_childFDs)ÚselfÚreactorÚ
executableÚargsÚenvironmentÚpathr   ÚuidÚgidÚusePTYÚchildFDss              ÚdC:\Users\psant\Downloads\Noiseback\school\venv\Lib\site-packages\twisted/runner/test/test_procmon.pyÚ__init__ÚDummyProcess.__init__)   s8   € ð Œ
àŒØ%ÔØŒ
Ø'ÔØŒ
ØŒ	ØŒ	ØŒØ!�ó    c                óÂ   • U R                   S4SS.nU R                  c
  [        5       eX;   a2  X!   u  p4U R                  R	                  X0R
                  U5      U l        gg)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}
r   ©r   r   )ÚTERMÚKILLN)Ú_terminationDelayÚpidr   r   Ú	callLaterÚprocessEndedÚ_signalHandler)r&   ÚsignalIDÚparamsÚdelayÚstatuss        r0   ÚsignalProcessÚDummyProcess.signalProcessB   sc   € ð  ×1Ñ1°1Ð5¸vÑFˆà�8‰8ÑÜ&Ó(Ð(àÓØ"Ñ,‰MˆEØ"&§-¡-×"9Ñ"9Ø×(Ñ(¨&ó#ˆDÕð r3   c                ó„   • SU l         [        [        S.nU R                  R	                  [        X!   " U5      5      5        g)z3
Deliver the process ended event to C{self.proto}.
Nr5   )r9   r
   r   r   r;   r   )r&   r@   Ú	statusMaps      r0   r;   ÚDummyProcess.processEndedY   s9   € ð ˆŒäÜ ñ
ˆ	ð 	�
‰
×Ñ¤¨	Ò(9¸&Ó(AÓ BÕCr3   )r   r%   r    r   r#   r!   r   r<   r"   r$   r9   r   )NNr   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r9   r   r8   r1   rA   r;   Ú__static_attributes__© r3   r0   r   r      s7   † ñð €CØ€EàÐð ØØØô"ò2õ.	Dr3   r   c                  óx   • \ rS rSr% SrS\S'   S\S'   SS jr      S                   SS	 jjrS
rg)ÚDummyProcessReactorée   z¹
@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                óx   • [         R                  " U 5        [        R                  " U 5        / U l        S U l        g r   )r   r1   r   rP   rQ   ©r&   s    r0   r1   ÚDummyProcessReactor.__init__p   s,   € Ü×Ò˜tÔ$Ü�Š�tÔØ "ˆÔØ%)ˆÕ"r3   Nc
                ó¸   • U R                   b  U R                   e[        U UUUUUUUUU	5
      n
UR                  U
5        U R                  R	                  U
5        U
$ )zb
Fake L{reactor.spawnProcess}, that logs all the process
arguments and returns a L{DummyProcess}.
)rQ   r   ÚmakeConnectionrP   Úappend)r&   ÚprocessProtocolr(   r)   Úenvr+   r,   r-   r.   r/   Úprocs              r0   ÚspawnProcessÚ DummyProcessReactor.spawnProcessv   sm   € ð  ×%Ñ%Ñ1Ø×,Ñ,Ð,äØØØØØØØØØØó
ˆð 	×&Ñ& tÔ,Ø×Ñ×$Ñ$ TÔ*Øˆr3   )rQ   rP   ©ÚreturnÚNone)NNNNFN)rX   r   r(   zUnion[bytes, str]r)   zSequence[Union[bytes, str]]rY   z!Optional[Mapping[AnyStr, AnyStr]]r+   zUnion[None, bytes, str]r,   úOptional[int]r-   r`   r.   Úboolr/   z'Optional[Mapping[int, Union[int, str]]]r^   r   )	rF   rG   rH   rI   rJ   Ú__annotations__r1   r[   rK   rL   r3   r0   rN   rN   e   sš   ‡ ñð )Ó(Ø+Ó+ô*ð 26Ø(,Ø!Ø!ØØ<@ð!à)ð!ð &ð!ð *ð	!ð
 /ð!ð &ð!ð ð!ð ð!ð ð!ð :ð!ð 
÷!ð !r3   rN   c                  óì   • \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rS rS rS rS rS rS rS'S jrS'S jrS rS rS rS rS rS rS rS rS rS rS rS r S r!S  r"S! r#S" r$S# r%S$ r&S%r'g&)(ÚProcmonTestséš   z
Tests for L{ProcessMonitor}.
c                ó¸   • [        5       U l        [        U R                  S9U l        SU R                  l        SU R                  l        SU R                  l        g)z<
Create an L{ProcessMonitor} wrapped around a fake reactor.
©r'   é   é
   N)rN   r'   r   ÚpmÚminRestartDelayÚmaxRestartDelayÚ	thresholdrS   s    r0   ÚsetUpÚProcmonTests.setUpŸ   sB   € ô +Ó,ˆŒÜ ¨¯©Ñ6ˆŒØ"#ˆ�‰ÔØ"$ˆ�‰ÔØˆ�‰Õr3   c                óØ   • U R                   R                  SSS/SS0 S9  [        U R                   5      nU R                  SU5        U R                  SU5        U R                  SU5        g	)
z
Repr includes all details
ÚfooÚarg1Úarg2r   rh   ©r,   r-   rY   Ú1Ú2N)rj   Ú
addProcessÚreprÚassertIn©r&   Úrepresentations     r0   Útest_reprLooksGoodÚProcmonTests.test_reprLooksGood©   s]   € ð 	�‰×Ñ˜5 6¨6Ð"2¸¸qÀbÐÑIÜ˜dŸg™g›ˆØ�‰�e˜^Ô,Ø�‰�c˜>Ô*Ø�‰�c˜>Õ*r3   c                ó°   • U R                   R                  SSS/0 S9  [        U R                   5      nU R                  SU5        U R                  SU5        g)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.
rq   rr   rs   )rY   Ú(Ú)N)rj   rw   rx   ÚassertNotInrz   s     r0   Útest_simpleReprLooksGoodÚ%ProcmonTests.test_simpleReprLooksGood³   sO   € ð 	�‰×Ñ˜5 6¨6Ð"2¸ÐÑ;Ü˜dŸg™g›ˆØ×Ñ˜˜nÔ-Ø×Ñ˜˜nÕ-r3   c                ó¬   • U R                   R                  SSS/SS0 S9  U R                  U R                   R                  5       S   SSS/SS0 405        g)	zG
The list of monitored processes must be included in the pickle state.
rq   rr   rs   r   rh   rt   Ú	processesN)rj   rw   ÚassertEqualÚ__getstate__rS   s    r0   Útest_getStateIncludesProcessesÚ+ProcmonTests.test_getStateIncludesProcesses¿   s_   € ð 	�‰×Ñ˜5 6¨6Ð"2¸¸qÀbÐÑIØ×ÑØ�G‰G× Ñ Ó" ;Ñ/°%¸6À6Ð:JÈAÈqÐRTÐ9UÐ1Võ	
r3   c                óX   • U R                  SU R                  R                  5       5        g)zf
The private L{ProcessMonitor._reactor} instance variable should not be
included in the pickle state.
r   N)r�   rj   r‡   rS   s    r0   Útest_getStateExcludesReactorÚ)ProcmonTests.test_getStateExcludesReactorÈ   s!   € ð
 	×Ñ˜ T§W¡W×%9Ñ%9Ó%;Õ<r3   c                óÐ  • U R                   R                  SSS/SS0 S9  U R                  U R                   R                  0 5        U R                  U R                   R                  SSS/SS0 405        U R                   R                  5         U R                  R                  S5        U R                  [        U R                   R                  R                  5       5      S/5        g)	zo
L{ProcessMonitor.addProcess} only starts the named program if
L{ProcessMonitor.startService} has been called.
rq   rr   rs   r   rh   rt   r   N)
rj   rw   r†   Ú	protocolsr…   ÚstartServicer'   ÚadvanceÚlistÚkeysrS   s    r0   Ú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¸%¸ÕAr3   c           
     ó    • U R                   R                  SSS/SS0 S9  U R                  [        U R                   R                  SSS/SS0 S9  g)zd
L{ProcessMonitor.addProcess} raises a C{KeyError} if a process with the
given name already exists.
rq   rr   rs   r   rh   rt   N)rj   rw   ÚassertRaisesÚKeyErrorrS   s    r0   Ú test_addProcessDuplicateKeyErrorÚ-ProcmonTests.test_addProcessDuplicateKeyErrorÛ   sX   € ð
 	�‰×Ñ˜5 6¨6Ð"2¸¸qÀbÐÑIØ×ÑÜ�d—g‘g×(Ñ(¨%°&¸&Ð1AÀqÈaÐUWð 	ò 	
r3   c                ó  • SS0nU R                   R                  5         U R                   R                  SS/SSUS9  U R                  R	                  S5        U R                  U R                  R                  S   R                  U5        g)	zk
L{ProcessMonitor.addProcess} takes an C{env} parameter that is passed to
L{IReactorProcess.spawnProcess}.
ÚKEYÚvaluerq   r   rh   rt   r   N)rj   r�   rw   r'   r�   r†   rP   r    )r&   ÚfakeEnvs     r0   Útest_addProcessEnvÚProcmonTests.test_addProcessEnvå   st   € ð
 ˜'Ð"ˆØ�‰×ÑÔØ�‰×Ñ˜5 5 '¨q°a¸WÐÑEØ�‰×Ñ˜QÔØ×Ñ˜Ÿ™×6Ñ6°qÑ9×FÑFÈÕPr3   c                ó  • U R                   R                  5         U R                   R                  SS/SS9  U R                  R	                  S5        U R                  U R                  R                  S   R                  S5        g)zk
L{ProcessMonitor.addProcess} takes an C{cwd} parameter that is passed
to L{IReactorProcess.spawnProcess}.
rq   z	/mnt/lala)Úcwdr   N)rj   r�   rw   r'   r�   r†   rP   r!   rS   s    r0   Útest_addProcessCwdÚProcmonTests.test_addProcessCwdð   sf   € ð
 	�‰×ÑÔØ�‰×Ñ˜5 5 '¨{ÐÑ;Ø�‰×Ñ˜QÔØ×Ñ˜Ÿ™×6Ñ6°qÑ9×?Ñ?ÀÕMr3   c                ód  • U R                   R                  5         U R                   R                  SS/5        U R                  [	        U R                   R
                  5      S5        U R                   R                  S5        U R                  [	        U R                   R
                  5      S5        g)zU
L{ProcessMonitor.removeProcess} removes the process from the public
processes list.
rq   r   r   N)rj   r�   rw   r†   Úlenr…   ÚremoveProcessrS   s    r0   Útest_removeProcessÚProcmonTests.test_removeProcessú   sz   € ð
 	�‰×ÑÔØ�‰×Ñ˜5 5 'Ô*Ø×Ñœ˜TŸW™W×.Ñ.Ó/°Ô3Ø�‰×Ñ˜eÔ$Ø×Ñœ˜TŸW™W×.Ñ.Ó/°Õ3r3   c                óŽ   • U R                   R                  5         U R                  [        U R                   R                  S5        g)zb
L{ProcessMonitor.removeProcess} raises a C{KeyError} if the given
process name isn't recognised.
rq   N)rj   r�   r–   r—   r¦   rS   s    r0   Ú!test_removeProcessUnknownKeyErrorÚ.ProcmonTests.test_removeProcessUnknownKeyError  s0   € ð
 	�‰×ÑÔØ×Ñœ( D§G¡G×$9Ñ$9¸5ÕAr3   c                ó6  • U R                   R                  SS/5        U R                   R                  S5        U R                  U R                   R                  S   [
        5        U R                  SU R                   R                  R                  5       5        g)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.
rq   N)	rj   rw   ÚstartProcessÚassertIsInstancerŽ   r   ry   ÚtimeStartedr’   rS   s    r0   Útest_startProcessÚProcmonTests.test_startProcess  sl   € ð 	�‰×Ñ˜5 5 'Ô*Ø�‰×Ñ˜UÔ#Ø×Ñ˜dŸg™g×/Ñ/°Ñ6¼ÔHØ�‰�e˜TŸW™W×0Ñ0×5Ñ5Ó7Õ8r3   c                óÈ   • U R                   R                  SS/5        U R                   R                  S5        U R                  U R                   R                  S5      5        g)zZ
L{ProcessMonitor.startProcess} silently returns if the named process is
already started.
rq   N)rj   rw   r­   ÚassertIsNonerS   s    r0   Útest_startProcessAlreadyStartedÚ,ProcmonTests.test_startProcessAlreadyStarted  sI   € ð
 	�‰×Ñ˜5 5 'Ô*Ø�‰×Ñ˜UÔ#Ø×Ñ˜$Ÿ'™'×.Ñ.¨uÓ5Õ6r3   c                óZ   • U R                  [        U R                  R                  S5        g)za
L{ProcessMonitor.startProcess} raises a C{KeyError} if the given
process name isn't recognised.
rq   N)r–   r—   rj   r­   rS   s    r0   Ú test_startProcessUnknownKeyErrorÚ-ProcmonTests.test_startProcessUnknownKeyError"  s    € ð
 	×Ñœ( D§G¡G×$8Ñ$8¸%Õ@r3   c                óü  • [        [        R                  [        R                  " [        R                  5      5      U R
                  l        SU R                  l        SU R                  l	        U R                  R                  SS/5        U R                  R                  S5        U R                  U R                  R                  S   S5        U R                  [        U R                  [         5      5      S5        g)zg
L{IReactorProcess.spawnProcess} might raise C{OSError}, ensure it
is caught and process is restarted.
é{   rq   r   N)ÚOSErrorÚerrnoÚEAGAINÚosÚstrerrorr'   rQ   rj   rk   rl   rw   r­   ÚassertEqualsr?   r¥   ÚflushLoggedErrorsrS   s    r0   Ú%test_startProcessSpawnCaughtExceptionÚ2ProcmonTests.test_startProcessSpawnCaughtException)  sª   € ô
 .5Ü�L‰Lœ"Ÿ+š+¤e§l¡lÓ3ó.
ˆ�‰Ô*ð #&ˆ�‰ÔØ"%ˆ�‰ÔØ�‰×Ñ˜5 5 'Ô*Ø�‰×Ñ˜UÔ#à×Ñ˜$Ÿ'™'Ÿ-™-¨Ñ.°Ô4Ø×Ñœ#˜d×4Ñ4´WÓ=Ó>ÀÕBr3   c                óÈ   • [        S5      U R                  l        U R                  R	                  SS/5        U R                  [         U R                  R                  S5        g)za
L{IReactorProcess.spawnProcess} might raise C{OSError}, ensure other
exceptions are not caught.
zJust another exceptionrq   N)ÚSystemErrorr'   rQ   rj   rw   r–   r­   rS   s    r0   Ú'test_startProcessSpawnUncaughtExceptionÚ4ProcmonTests.test_startProcessSpawnUncaughtException9  sH   € ô
 .9Ð9QÓ-Rˆ�‰Ô*Ø�‰×Ñ˜5 5 'Ô*Ø×Ñœ+ t§w¡w×';Ñ';¸UÕCr3   c                ó’  • U R                   R                  5         U R                   R                  SS/5        U R                  SU R                   R                  5        S=oR                   R                  S   R
                  l        U R                  R                  U R                   R                  5        U R                   R                  S5        U R                  R                  U5        U R                  R                  S5        U R                  U R                  R                  5       U R                   R                  S   5        g)zU
L{ProcessMonitor.stopProcess} immediately sends a TERM signal to the
named process.
rq   r   r   N)rj   r�   rw   ry   rŽ   Ú	transportr8   r'   r�   rm   ÚstopProcessr†   Úsecondsr¯   )r&   Ú	timeToDies     r0   Ú"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ÕLr3   c                ó|  • U R                   R                  5         U R                   R                  SS/5        U R                  SU R                   R                  5        U R
                  R                  U R                   R                  5        U R                   R                  S   R                  nU R                   R                  S-   Ul
        U R                   R                  S5        U R
                  R                  U R                   R                  S-
  5        U R                  SU R                   R                  S   5        U R
                  R                  S5        U R
                  R                  SS/5        U R                  U R
                  R                  5       U R                   R                  S   5        g)z}
L{ProcessMonitor.stopProcess} kills a process which fails to terminate
naturally within L{ProcessMonitor.killTime} seconds.
rq   r   g        r   N)rj   r�   rw   ry   rŽ   r'   r�   rm   rÉ   ÚkillTimer8   rÊ   r†   r¯   ÚpumprË   )r&   rZ   s     r0   Ú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ÕLr3   c                óZ   • U R                  [        U R                  R                  S5        g)z`
L{ProcessMonitor.stopProcess} raises a C{KeyError} if the given process
name isn't recognised.
rq   N)r–   r—   rj   rÊ   rS   s    r0   Útest_stopProcessUnknownKeyErrorÚ,ProcmonTests.test_stopProcessUnknownKeyError}  s    € ð
 	×Ñœ( D§G¡G×$7Ñ$7¸Õ?r3   c                ó’   • U R                   R                  SS/5        U R                  U R                   R                  S5      5        g)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.
rq   N)rj   rw   r³   rÊ   rS   s    r0   Útest_stopProcessAlreadyStoppedÚ+ProcmonTests.test_stopProcessAlreadyStopped„  s7   € ð 	�‰×Ñ˜5 5 'Ô*Ø×Ñ˜$Ÿ'™'×-Ñ-¨eÓ4Õ5r3   c                ó@  • / nU R                  [        R                  UR                  5        [        R                  " UR                  5        U R
                  R                  SS/5        U R
                  R                  5         U R                  R                  S5        U R                  SU R
                  R                  5        U R                  R                  U R
                  R                  5        U R
                  R                  S   R                  S5        U R                  [        U5      S5        US   S   nUS   S   nUS   S   nUS   S   nU R                  US	5        U R                  US
5        U R                  US5        U R                  US5        g)zC
Getting a complete output line on stdout generates a log message.
rq   r   ó   hello world!
r   Úlog_namespaceÚstreamÚtagÚlineú%twisted.runner.procmon.ProcessMonitorÚstdoutúhello world!N)Ú
addCleanupr   ÚremoveObserverrW   ÚaddObserverrj   rw   r�   r'   r�   ry   rŽ   rm   ÚoutReceivedrÀ   r¥   ©r&   ÚeventsÚ	namespacerÝ   rÞ   rß   s         r0   Ú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Ô%Ø×Ñ˜$ Õ/r3   c                ó@  • / nU R                  [        R                  UR                  5        [        R                  " UR                  5        U R
                  R                  SS/5        U R
                  R                  5         U R                  R                  S5        U R                  SU R
                  R                  5        U R                  R                  U R
                  R                  5        U R
                  R                  S   R                  S5        U R                  [        U5      S5        US   S   nUS   S   nUS   S   nUS   S   nU R                  US	5        U R                  US
5        U R                  US5        U R                  US5        g)zC
Getting a complete output line on stderr generates a log message.
rq   r   rÛ   r   rÜ   rÝ   rÞ   rß   rà   Ústderrrâ   N)rã   r   rä   rW   rå   rj   rw   r�   r'   r�   ry   rŽ   rm   ÚerrReceivedrÀ   r¥   rç   s         r0   Ú!test_ouputReceivedCompleteErrLineÚ.ProcmonTests.test_ouputReceivedCompleteErrLine¨  rì   r3   c                óD  • / nU R                  [        R                  UR                  5        [        R                  " UR                  5        U R
                  R                  SS/5        U R
                  R                  5         U R                  R                  S5        U R                  SU R
                  R                  5        U R                  R                  U R
                  R                  5        U R
                  R                  S   R                  S5        U R                  [        U5      S5        US   nUS   nUS   nUS   nUS   nU R                  US	5        U R                  US
5        U R                  US5        U R                  U[!        S5      5        g)z>
Getting invalid UTF-8 results in the repr of the raw message
rq   r   s   ÿhello world!
r   rÜ   rÝ   rÞ   rß   rà   rá   s   ÿhello world!N)rã   r   rä   rW   rå   rj   rw   r�   r'   r�   ry   rŽ   rm   ræ   rÀ   r¥   rx   )r&   rè   Úmessageré   rÝ   rÞ   Úoutputs          r0   Ú*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Ô%Ø×Ñ˜&¤$Ð':Ó";Õ<r3   c                óê  • / nU R                  [        R                  UR                  5        [        R                  " UR                  5        U R
                  R                  SS/5        U R
                  R                  5         U R                  R                  S5        U R                  SU R
                  R                  5        U R                  R                  U R
                  R                  5        U R
                  R                  S   R                  S5        U R                  [        U5      S5        U R
                  R                  S   R!                  [#        [%        S5      5      5        U R                  [        U5      S5        US   S   nUS   S   nUS   S   nUS   S   nU R                  US	5        U R                  US
5        U R                  US5        U R                  US5        g)z=
Getting partial line results in no events until process end
rq   r   s   hello world!r   rÜ   rÝ   rÞ   rß   rà   rá   râ   N)rã   r   rä   rW   rå   rj   rw   r�   r'   r�   ry   rŽ   rm   ræ   rÀ   r¥   r;   r   r
   rç   s         r0   Ú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Ô%Ø×Ñ˜$ Õ/r3   c                ó”  • U R                   R                  SS/5        U R                   R                  5         U R                  R	                  S5        U R                  SU R                   R                  5        U R                  R	                  U R                   R                  5        U R                   R                  S   R                  [        [        S5      5      5        U R                  SU R                   R                  5        U R                  R	                  S5        U R                  SU R                   R                  5        g)zŒ
L{ProcessMonitor.processExit} should immediately restart a process
if it has been running longer than L{ProcessMonitor.threshold} seconds.
rq   r   N)rj   rw   r�   r'   r�   ry   rŽ   rm   r;   r   r
   r�   rS   s    r0   Ú#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×.Ñ.Õ/r3   c                ó°  • U R                   R                  SS/5        U R                   R                  5         U R                  R	                  S5        U R                   R                  S5        U R                  SU R                   R                  5        U R                   R                  S   nU R                  UR                  5       5        U R                  R	                  U R                   R                  S   R                  R                  5        U R                  UR                  5       5        U R                  SU R                   R                  5        g)z†
L{ProcessMonitor.processExit} cancels a scheduled process killer and
deletes the DelayedCall from the L{ProcessMonitor.murder} list.
rq   r   N)rj   rw   r�   r'   r�   rÊ   ry   ÚmurderÚ
assertTrueÚactiverŽ   rÉ   r8   ÚassertFalser�   )r&   ÚdelayedCalls     r0   Ú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à×Ñ˜×+Ñ+Ó-Ô.Ø×Ñ˜ §¡§¡Õ/r3   c                óú  • U R                   R                  5         U R                   R                  SS/5        U R                  SU R                   R                  5        U R                   R                  S   R
                  R                  S5        U R                  R                  U R                   R                  S   R
                  R                  5        U R                  SU R                   R                  5        g)z}
L{ProcessMonitor.processExit} removes the corresponding
ProcessProtocol instance from the L{ProcessMonitor.protocols} list.
rq   r7   N)rj   r�   rw   ry   rŽ   rÉ   rA   r'   r�   r8   r�   rS   s    r0   Ú#test_connectionLostProtocolDeletionÚ0ProcmonTests.test_connectionLostProtocolDeletion%  s¬   € ð
 	�‰×ÑÔØ�‰×Ñ˜5 5 'Ô*Ø�‰�e˜TŸW™W×.Ñ.Ô/Ø�‰×Ñ˜%Ñ ×*Ñ*×8Ñ8¸Ô@Ø�‰×Ñ˜TŸW™W×.Ñ.¨uÑ5×?Ñ?×QÑQÔRØ×Ñ˜ §¡× 1Ñ 1Õ2r3   c                ó‚  • SU R                   l        SU R                   l        U R                   R                  5         U R                   R	                  SS/5        U R                  U R                   R                  S   U R                   R                  5        U R                  R                  U R                   R                  S-
  5        U R                   R                  S   R                  [        [        S5      5      5        U R                  U R                   R                  S   U R                   R                  5        g)zb
L{ProcessMonitor.processExit} will wait at least minRestartDelay s
and at most maxRestartDelay s
rh   é   rq   r   r   N)rj   rk   rl   r�   rw   r†   r?   r'   r�   rm   rŽ   r;   r   r
   rS   s    r0   Ú%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ÕGr3   c                ó�  • U R                   R                  5         U R                   R                  SS/5        U R                  R	                  U R                   R
                  S-
  5        U R                  SU R                   R                  5        U R                  U R                   R                  S   U R                   R                  5        U R                   R                  S   R                  [        [        S5      5      5        U R                  U R                   R                  S   U R                   R                  S-  5        g)za
L{ProcessMonitor.processExit} doubles the restart delay each time
the process dies too quickly.
rq   r   r   rh   N)rj   r�   rw   r'   r�   rm   ry   rŽ   r†   r?   rk   r;   r   r
   rS   s    r0   Ú&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ÕKr3   c                óô   • U R                   R                  SS/5        U R                   R                  5         U R                  R	                  S5        U R                  SU R                   R                  5        g)z@
L{ProcessMonitor.startService} starts all monitored processes.
rq   r   N)rj   rw   r�   r'   r�   ry   rŽ   rS   s    r0   Útest_startServiceÚProcmonTests.test_startServiceO  sT   € ð 	�‰×Ñ˜5 5 'Ô*à�‰×ÑÔà�‰×Ñ˜QÔØ�‰�e˜TŸW™W×.Ñ.Õ/r3   c                ó¼  • U R                   R                  SS/5        U R                   R                  SS/5        U R                   R                  5         U R                  R	                  U R                   R
                  5        U R                  SU R                   R                  5        U R                  SU R                   R                  5        U R                  R	                  S5        U R                   R                  5         U R                  R	                  U R                   R                  S-   5        U R                  0 U R                   R                  5        g)zD
L{ProcessMonitor.stopService} should stop all monitored processes.
rq   Úbarr   N)rj   rw   r�   r'   r�   rm   ry   rŽ   ÚstopServicerÐ   r†   rS   s    r0   Ú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×.Ñ.Õ/r3   c                óÊ  • U R                   R                  SS/5        U R                   R                  5         U R                  R	                  S5        U R                   R                  5         U R                  R	                  S5        [        U R                  R                  5      nUR                  5       nU R                  U/ 5        U R                  UR                  5        g)zB
L{ProcessMonitor.restartAll} succeeds when there is one process.
rq   r   N)rj   rw   r�   r'   r�   Ú
restartAllr‘   rP   ÚpoprÀ   r³   r9   )r&   r…   Ú	myProcesss      r0   Ú!test_restartAllRestartsOneProcessÚ.ProcmonTests.test_restartAllRestartsOneProcessp  s¡   € ð 	�‰×Ñ˜5 5 'Ô*Ø�‰×ÑÔØ�‰×Ñ˜QÔØ�‰×ÑÔð 	�‰×Ñ˜QÔÜ˜Ÿ™×6Ñ6Ó7ˆ	Ø—M‘M“Oˆ	Ø×Ñ˜) RÔ(Ø×Ñ˜)Ÿ-™-Õ(r3   c                óÒ  • U R                   R                  SS/5        U R                   R                  5         U R                  R	                  U R                   R
                  5        U R                  SU R                   R                  5        U R                  R	                  S5        U R                   R                  S   R                  [        [        S5      5      5        U R                  U R                   R                  S   R                  5       5        U R                   R                  5         U R                  U R                   R                  S   R                  5       5        g)zM
L{ProcessMonitor.stopService} should cancel any scheduled process
restarts.
rq   r   r   N)rj   rw   r�   r'   r�   rm   ry   rŽ   r;   r   r
   rÿ   Úrestartr   r  r  rS   s    r0   Ú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Õ9r3   c                ó  • SU R                   l        SU R                   l        U R                   R                  5         U R                   R	                  SS/5        U R
                  R                  S5        U R                   R                  S5        U R
                  R                  S5        U R                   R                  5         U R
                  R                  S5        U R                  U R                   R                  0 5        g)zM
L{ProcessMonitor.stopService} should cancel all scheduled process
restarts.
é   rq   r   é   N)rj   rm   rk   r�   rw   r'   r�   rÊ   r  r†   rŽ   rS   s    r0   Ú(test_stopServiceCleanupScheduledRestartsÚ5ProcmonTests.test_stopServiceCleanupScheduledRestarts”  s¶   € ð
 ˆ�‰ÔØ"#ˆ�‰Ôà�‰×ÑÔØ�‰×Ñ˜5 5 'Ô*à�‰×Ñ˜QÔØ�‰×Ñ˜EÔ"à�‰×Ñ˜QÔà�‰×ÑÔà�‰×Ñ˜QÔð 	×Ñ˜Ÿ™×*Ñ*¨BÕ/r3   ©rj   r'   Nr]   )(rF   rG   rH   rI   rJ   rn   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$  rK   rL   r3   r0   rd   rd   š   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ò,)ò :õ(0r3   rd   c                  ó0   • \ rS rSrSrS rS rS rS rSr	g)	ÚDeprecationTestsi¬  zI
Tests that check functionality that should be deprecated is deprecated.
c                óR   • [        5       U l        [        U R                  S9U l        g)z%
Create reactor and process monitor.
rg   N)rN   r'   r   rj   rS   s    r0   rn   ÚDeprecationTests.setUp±  s   € ô +Ó,ˆŒÜ ¨¯©Ñ6ˆ�r3   c                ó^  • U R                   R                  SS/5        U R                   R                  nU R                  [	        U5      S5        U R                  5       nSnU H)  nU R                  US   [        5        SUS   ;   d  M'  SnM+     U R                  US[        U5       35        g	)
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.
rq   r   FÚcategoryÚtoTupleró   Tzno tuple deprecation found:N)
rj   rw   r…   rÀ   r¥   ÚflushWarningsÚassertIsÚDeprecationWarningrÿ   rx   )r&   ÚmyprocessesÚwarningsÚfoundToTupleÚwarnings        r0   Útest_toTupleÚDeprecationTests.test_toTuple¸  sž   € ð 	�‰×Ñ˜5 5 'Ô*Ø—g‘g×'Ñ'ˆØ×Ñœ#˜kÓ*¨AÔ.Ø×%Ñ%Ó'ˆØˆÛˆGØ�M‰M˜' *Ñ-Ô/AÔBØ˜G IÑ.Õ.Ø#’ñ  ð 	�‰˜Ð(CÄDÈÃNÐCSÐ&TÕUr3   c                óì   • U R                   R                  nU R                  U0 5        U R                  5       nUR	                  S5      nU R                  US   [        5        U R                  U/ 5        g)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   r,  N)rj   r…   rÀ   r.  r  r/  r0  )r&   ÚmyProcessesr2  Úfirsts       r0   Útest_processesÚDeprecationTests.test_processesË  sb   € ð —g‘g×'Ñ'ˆØ×Ñ˜+ rÔ*Ø×%Ñ%Ó'ˆØ—‘˜Q“ˆØ�‰�e˜JÑ'Ô);Ô<Ø×Ñ˜( BÕ'r3   c                ó¨   • [         R                  " U R                  5        U R                  5       nU H  nU R	                  US   [
        5        M     g)z?
Pickling an L{ProcessMonitor} results in deprecation warnings
r,  N)ÚpickleÚdumpsrj   r.  r/  r0  )r&   r2  r4  s      r0   Útest_getstateÚDeprecationTests.test_getstateÚ  s@   € ô 	�Š�T—W‘WÔØ×%Ñ%Ó'ˆÛˆGØ�M‰M˜' *Ñ-Ô/AÖBò  r3   r&  N)
rF   rG   rH   rI   rJ   rn   r5  r:  r?  rK   rL   r3   r0   r(  r(  ¬  s   † ñò7òVò&(õCr3   r(  )(rJ   Ú
__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   rN   ÚTestCaserd   ÚSynchronousTestCaser(  rL   r3   r0   Ú<module>rN     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r3   