§
    Ètºfd  ã                   óö   — d Z ddlZddlmZmZmZ ddlmZ ddlm	Z	 ddl
mZ ddlmZ ddlmZmZ dd	lmZ  G d
„ d¦  «        Z G d„ de	e¦  «        Z G d„ dej        ¦  «        Z G d„ dej        ¦  «        ZdS )z&
Tests for L{twisted.runner.procmon}.
é    N)ÚProcessDoneÚProcessExitedAlreadyÚProcessTerminated)ÚClock)ÚMemoryReactor)ÚglobalLogPublisher)ÚFailure)ÚLoggingProtocolÚProcessMonitor)Úunittestc                   ó:   — e Zd ZdZdZdZdZ	 	 	 	 dd„Zd„ Zd„ Z	dS )	Ú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
    é   Nr   c                 ó’   — || _         || _        || _        || _        || _        || _        || _        || _        |	| _        |
| _	        d S ©N)
ÚprotoÚ_reactorÚ_executableÚ_argsÚ_environmentÚ_pathÚ_uidÚ_gidÚ_usePTYÚ	_childFDs)ÚselfÚreactorÚ
executableÚargsÚenvironmentÚpathr   ÚuidÚgidÚusePTYÚchildFDss              ú_/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/twisted/runner/test/test_procmon.pyÚ__init__zDummyProcess.__init__    sP   € ð ˆŒ
àˆŒØ%ˆÔØˆŒ
Ø'ˆÔØˆŒ
ØˆŒ	ØˆŒ	ØˆŒØ!ˆŒˆˆó    c                 ó¶   — | j         dfddœ}| j        €t          ¦   «         ‚||v r3||         \  }}| j                             || j        |¦  «        | _        dS dS )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        r&   ÚsignalProcesszDummyProcess.signalProcess9   sx   € ð  Ô1°1Ð5¸vÐFÐFˆàŒ8ÐÝ&Ñ(Ô(Ð(à�vÐÐØ" 8Ô,‰MˆE�6Ø"&¤-×"9Ò"9Ø�tÔ(¨&ñ#ô #ˆDÔÐÐð Ðr(   c                 óž   — d| _         t          t          dœ}| j                             t           ||         |¦  «        ¦  «        ¦  «         dS )zC
        Deliver the process ended event to C{self.proto}.
        Nr*   )r.   r   r   r   r0   r	   )r   r5   Ú	statusMaps      r&   r0   zDummyProcess.processEndedP   sS   € ð ˆŒåÝ ð
ð 
ˆ	ð 	Œ
×Ò¥Ð(9¨	°&Ô(9¸&Ñ(AÔ(AÑ BÔ BÑCÔCÐCÐCÐCr(   )NNr   N)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r.   r   r-   r'   r6   r0   © r(   r&   r   r      su   € € € € € ðð ð €CØ€EàÐð ØØØð"ð "ð "ð "ð2ð ð ð.	Dð 	Dð 	Dð 	Dð 	Dr(   r   c                   ó.   — e Zd ZdZd„ Zdi dddddfd„ZdS )ÚDummyProcessReactorz�
    @ivar spawnedProcesses: a list that keeps track of the fake process
        instances built by C{spawnProcess}.
    @type spawnedProcesses: C{list}
    c                 ód   — t          j        | ¦  «         t          j        | ¦  «         g | _        d S r   )r   r'   r   ÚspawnedProcesses©r   s    r&   r'   zDummyProcessReactor.__init__c   s1   € ÝÔ˜tÑ$Ô$Ð$ÝŒ�tÑÔÐà "ˆÔÐÐr(   r=   Nr   c
                 ó”   — t          | |||||||||	¦
  «
        }
|                     |
¦  «         | j                             |
¦  «         |
S )zz
        Fake L{reactor.spawnProcess}, that logs all the process
        arguments and returns a L{DummyProcess}.
        )r   ÚmakeConnectionrA   Úappend)r   ÚprocessProtocolr   r   Úenvr!   r"   r#   r$   r%   Úprocs              r&   ÚspawnProcessz DummyProcessReactor.spawnProcessi   sc   € õ" ØØØØØØØØØØñ
ô 
ˆð 	×&Ò& tÑ,Ô,Ð,ØÔ×$Ò$ TÑ*Ô*Ð*Øˆr(   )r9   r:   r;   r<   r'   rI   r=   r(   r&   r?   r?   \   sX   € € € € € ðð ð#ð #ð #ð ØØØØØØðð ð ð ð ð r(   r?   c                   óÒ   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z d„ Z!d „ Z"d!„ Z#d"S )#ÚProcmonTestsz&
    Tests for L{ProcessMonitor}.
    c                 ó¨   — t          ¦   «         | _        t          | j        ¬¦  «        | _        d| j        _        d| j        _        d| j        _        dS )zL
        Create an L{ProcessMonitor} wrapped around a fake reactor.
        ©r   é   é
   N)r?   r   r   ÚpmÚminRestartDelayÚmaxRestartDelayÚ	thresholdrB   s    r&   ÚsetUpzProcmonTests.setUp�   sI   € õ +Ñ,Ô,ˆŒÝ ¨¬Ð6Ñ6Ô6ˆŒØ"#ˆŒÔØ"$ˆŒÔØˆŒÔÐÐr(   c                 óô   — | j                              dddgddi ¬¦  «         t          | j         ¦  «        }|                      d|¦  «         |                      d|¦  «         |                      d|¦  «         d	S )
z+
        Repr includes all details
        ÚfooÚarg1Úarg2r   rN   ©r"   r#   rG   Ú1Ú2N)rP   Ú
addProcessÚreprÚassertIn©r   Úrepresentations     r&   Útest_reprLooksGoodzProcmonTests.test_reprLooksGoodš   sy   € ð 	Œ×Ò˜5 6¨6Ð"2¸¸qÀbÐÑIÔIÐIÝ˜dœg™œˆØ�Š�e˜^Ñ,Ô,Ð,Ø�Š�c˜>Ñ*Ô*Ð*Ø�Š�c˜>Ñ*Ô*Ð*Ð*Ð*r(   c                 óÄ   — | j                              dddgi ¬¦  «         t          | j         ¦  «        }|                      d|¦  «         |                      d|¦  «         dS )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.
        rV   rW   rX   )rG   ú(ú)N)rP   r\   r]   ÚassertNotInr_   s     r&   Útest_simpleReprLooksGoodz%ProcmonTests.test_simpleReprLooksGood¤   se   € ð 	Œ×Ò˜5 6¨6Ð"2¸ÐÑ;Ô;Ð;Ý˜dœg™œˆØ×Ò˜˜nÑ-Ô-Ð-Ø×Ò˜˜nÑ-Ô-Ð-Ð-Ð-r(   c                 ó¾   — | j                              dddgddi ¬¦  «         |                      | j                              ¦   «         d         dddgddi fi¦  «         dS )	zW
        The list of monitored processes must be included in the pickle state.
        rV   rW   rX   r   rN   rY   Ú	processesN)rP   r\   ÚassertEqualÚ__getstate__rB   s    r&   Útest_getStateIncludesProcessesz+ProcmonTests.test_getStateIncludesProcesses°   sx   € ð 	Œ×Ò˜5 6¨6Ð"2¸¸qÀbÐÑIÔIÐIØ×ÒØŒG× Ò Ñ"Ô" ;Ô/°%¸6À6Ð:JÈAÈqÐRTÐ9UÐ1Vñ	
ô 	
ð 	
ð 	
ð 	
r(   c                 ó`   — |                       d| j                             ¦   «         ¦  «         dS )z~
        The private L{ProcessMonitor._reactor} instance variable should not be
        included in the pickle state.
        r   N)re   rP   rj   rB   s    r&   Útest_getStateExcludesReactorz)ProcmonTests.test_getStateExcludesReactor¹   s.   € ð
 	×Ò˜ T¤W×%9Ò%9Ñ%;Ô%;Ñ<Ô<Ð<Ð<Ð<r(   c                 ó¾  — | j                              dddgddi ¬¦  «         |                      | j         j        i ¦  «         |                      | j         j        dddgddi fi¦  «         | j                              ¦   «          | j                             d¦  «         |                      t          | j         j         	                    ¦   «         ¦  «        dg¦  «         dS )	z‡
        L{ProcessMonitor.addProcess} only starts the named program if
        L{ProcessMonitor.startService} has been called.
        rV   rW   rX   r   rN   rY   r   N)
rP   r\   ri   Ú	protocolsrh   ÚstartServicer   ÚadvanceÚlistÚkeysrB   s    r&   Útest_addProcesszProcmonTests.test_addProcessÀ   sÔ   € ð
 	Œ×Ò˜5 6¨6Ð"2¸¸qÀbÐÑIÔIÐIØ×Ò˜œÔ*¨BÑ/Ô/Ð/Ø×Ò˜œÔ*¨U°f¸fÐ5EÀqÈ!ÈRÐ4PÐ,QÑRÔRÐRØŒ×ÒÑÔÐØŒ×Ò˜QÑÔÐØ×Ò�˜dœgÔ/×4Ò4Ñ6Ô6Ñ7Ô7¸%¸ÑAÔAÐAÐAÐAr(   c           	      ó¢   — | j                              dddgddi ¬¦  «         |                      t          | j         j        dddgddi ¬¦  «         dS )z|
        L{ProcessMonitor.addProcess} raises a C{KeyError} if a process with the
        given name already exists.
        rV   rW   rX   r   rN   rY   N)rP   r\   ÚassertRaisesÚKeyErrorrB   s    r&   Ú test_addProcessDuplicateKeyErrorz-ProcmonTests.test_addProcessDuplicateKeyErrorÌ   sk   € ð
 	Œ×Ò˜5 6¨6Ð"2¸¸qÀbÐÑIÔIÐIØ×ÒÝ�d”gÔ(¨%°&¸&Ð1AÀqÈaÐUWð 	ñ 	
ô 	
ð 	
ð 	
ð 	
r(   c                 ó
  — ddi}| j                              ¦   «          | j                              ddgdd|¬¦  «         | j                             d¦  «         |                      | j        j        d         j        |¦  «         dS )	zƒ
        L{ProcessMonitor.addProcess} takes an C{env} parameter that is passed to
        L{IReactorProcess.spawnProcess}.
        ÚKEYÚvaluerV   r   rN   rY   r   N)rP   rp   r\   r   rq   ri   rA   r   )r   ÚfakeEnvs     r&   Útest_addProcessEnvzProcmonTests.test_addProcessEnvÖ   s„   € ð
 ˜'Ð"ˆØŒ×ÒÑÔÐØŒ×Ò˜5 5 '¨q°a¸WÐÑEÔEÐEØŒ×Ò˜QÑÔÐØ×Ò˜œÔ6°qÔ9ÔFÈÑPÔPÐPÐPÐPr(   c                 óþ   — | j                              ¦   «          | j                              ddgd¬¦  «         | j                             d¦  «         |                      | j        j        d         j        d¦  «         dS )zƒ
        L{ProcessMonitor.addProcess} takes an C{cwd} parameter that is passed
        to L{IReactorProcess.spawnProcess}.
        rV   z	/mnt/lala)Úcwdr   N)rP   rp   r\   r   rq   ri   rA   r   rB   s    r&   Útest_addProcessCwdzProcmonTests.test_addProcessCwdá   sv   € ð
 	Œ×ÒÑÔÐØŒ×Ò˜5 5 '¨{ÐÑ;Ô;Ð;ØŒ×Ò˜QÑÔÐØ×Ò˜œÔ6°qÔ9Ô?ÀÑMÔMÐMÐMÐMr(   c                 óX  — | j                              ¦   «          | j                              ddg¦  «         |                      t	          | j         j        ¦  «        d¦  «         | j                              d¦  «         |                      t	          | j         j        ¦  «        d¦  «         dS )zm
        L{ProcessMonitor.removeProcess} removes the process from the public
        processes list.
        rV   r   r   N)rP   rp   r\   ri   Úlenrh   ÚremoveProcessrB   s    r&   Útest_removeProcesszProcmonTests.test_removeProcessë   s”   € ð
 	Œ×ÒÑÔÐØŒ×Ò˜5 5 'Ñ*Ô*Ð*Ø×Ò�˜TœWÔ.Ñ/Ô/°Ñ3Ô3Ð3ØŒ×Ò˜eÑ$Ô$Ð$Ø×Ò�˜TœWÔ.Ñ/Ô/°Ñ3Ô3Ð3Ð3Ð3r(   c                 ó„   — | j                              ¦   «          |                      t          | j         j        d¦  «         dS )zz
        L{ProcessMonitor.removeProcess} raises a C{KeyError} if the given
        process name isn't recognised.
        rV   N)rP   rp   rv   rw   rƒ   rB   s    r&   Ú!test_removeProcessUnknownKeyErrorz.ProcmonTests.test_removeProcessUnknownKeyErrorö   s;   € ð
 	Œ×ÒÑÔÐØ×Ò�( D¤GÔ$9¸5ÑAÔAÐAÐAÐAr(   c                 ó,  — | j                              ddg¦  «         | j                              d¦  «         |                      | j         j        d         t
          ¦  «         |                      d| j         j                             ¦   «         ¦  «         dS )a  
        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.
        rV   N)	rP   r\   ÚstartProcessÚassertIsInstancero   r
   r^   ÚtimeStartedrs   rB   s    r&   Útest_startProcesszProcmonTests.test_startProcessþ   s   € ð 	Œ×Ò˜5 5 'Ñ*Ô*Ð*ØŒ×Ò˜UÑ#Ô#Ð#Ø×Ò˜dœgÔ/°Ô6½ÑHÔHÐHØ�Š�e˜TœWÔ0×5Ò5Ñ7Ô7Ñ8Ô8Ð8Ð8Ð8r(   c                 óÌ   — | j                              ddg¦  «         | j                              d¦  «         |                      | j                              d¦  «        ¦  «         dS )zr
        L{ProcessMonitor.startProcess} silently returns if the named process is
        already started.
        rV   N)rP   r\   rˆ   ÚassertIsNonerB   s    r&   Útest_startProcessAlreadyStartedz,ProcmonTests.test_startProcessAlreadyStarted
  s^   € ð
 	Œ×Ò˜5 5 'Ñ*Ô*Ð*ØŒ×Ò˜UÑ#Ô#Ð#Ø×Ò˜$œ'×.Ò.¨uÑ5Ô5Ñ6Ô6Ð6Ð6Ð6r(   c                 óR   — |                       t          | j        j        d¦  «         dS )zy
        L{ProcessMonitor.startProcess} raises a C{KeyError} if the given
        process name isn't recognised.
        rV   N)rv   rw   rP   rˆ   rB   s    r&   Ú test_startProcessUnknownKeyErrorz-ProcmonTests.test_startProcessUnknownKeyError  s'   € ð
 	×Ò�( D¤GÔ$8¸%Ñ@Ô@Ð@Ð@Ð@r(   c                 óJ  — | j                              ¦   «          | j                              ddg¦  «         |                      d| j         j        ¦  «         dx}| j         j        d         j        _        | j                             | j         j	        ¦  «         | j          
                    d¦  «         | j                             |¦  «         | j                             d¦  «         |                      | j                             ¦   «         | j         j        d         ¦  «         dS )zm
        L{ProcessMonitor.stopProcess} immediately sends a TERM signal to the
        named process.
        rV   r   r   N)rP   rp   r\   r^   ro   Ú	transportr-   r   rq   rS   ÚstopProcessri   ÚsecondsrŠ   )r   Ú	timeToDies     r&   Ú"test_stopProcessNaturalTerminationz/ProcmonTests.test_stopProcessNaturalTermination  s  € ð
 	Œ×ÒÑÔÐØŒ×Ò˜5 5 'Ñ*Ô*Ð*Ø�Š�e˜TœWÔ.Ñ/Ô/Ð/ð LMÐLˆ	�D”GÔ% eÔ,Ô6ÔHð 	Œ×Ò˜TœWÔ.Ñ/Ô/Ð/àŒ×Ò˜EÑ"Ô"Ð"ð 	Œ×Ò˜YÑ'Ô'Ð'ð
 	Œ×Ò˜QÑÔÐð 	×Ò˜œ×-Ò-Ñ/Ô/°´Ô1DÀUÔ1KÑLÔLÐLÐLÐLr(   c                 ó  — | j                              ¦   «          | j                              ddg¦  «         |                      d| j         j        ¦  «         | j                             | j         j        ¦  «         | j         j        d         j        }| j         j	        dz   |_
        | j                              d¦  «         | j                             | j         j	        dz
  ¦  «         |                      d| j         j        d         ¦  «         | j                             d¦  «         | j                             ddg¦  «         |                      | j                             ¦   «         | j         j        d         ¦  «         dS )z•
        L{ProcessMonitor.stopProcess} kills a process which fails to terminate
        naturally within L{ProcessMonitor.killTime} seconds.
        rV   r   g        r   N)rP   rp   r\   r^   ro   r   rq   rS   r’   ÚkillTimer-   r“   ri   rŠ   Úpumpr”   )r   rH   s     r&   Útest_stopProcessForcedKillz'ProcmonTests.test_stopProcessForcedKill8  sH  € ð
 	Œ×ÒÑÔÐØŒ×Ò˜5 5 'Ñ*Ô*Ð*Ø�Š�e˜TœWÔ.Ñ/Ô/Ð/ØŒ×Ò˜TœWÔ.Ñ/Ô/Ð/ØŒwÔ  Ô'Ô1ˆà!%¤Ô!1°AÑ!5ˆÔØŒ×Ò˜EÑ"Ô"Ð"ð 	Œ×Ò˜TœWÔ-°Ñ1Ñ2Ô2Ð2Ø×Ò˜˜dœgÔ1°%Ô8Ñ9Ô9Ð9àŒ×Ò˜QÑÔÐð 	Œ×Ò˜1˜a˜&Ñ!Ô!Ð!à×Ò˜œ×-Ò-Ñ/Ô/°´Ô1DÀUÔ1KÑLÔLÐLÐLÐLr(   c                 óR   — |                       t          | j        j        d¦  «         dS )zx
        L{ProcessMonitor.stopProcess} raises a C{KeyError} if the given process
        name isn't recognised.
        rV   N)rv   rw   rP   r“   rB   s    r&   Útest_stopProcessUnknownKeyErrorz,ProcmonTests.test_stopProcessUnknownKeyErrorU  s'   € ð
 	×Ò�( D¤GÔ$7¸Ñ?Ô?Ð?Ð?Ð?r(   c                 ó˜   — | j                              ddg¦  «         |                      | j                              d¦  «        ¦  «         dS )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.
        rV   N)rP   r\   r�   r“   rB   s    r&   Útest_stopProcessAlreadyStoppedz+ProcmonTests.test_stopProcessAlreadyStopped\  sH   € ð 	Œ×Ò˜5 5 'Ñ*Ô*Ð*Ø×Ò˜$œ'×-Ò-¨eÑ4Ô4Ñ5Ô5Ð5Ð5Ð5r(   c                 ó\  — g }|                       t          j        |j        ¦  «         t          j        |j        ¦  «         | j                             ddg¦  «         | j                             ¦   «          | j         	                    d¦  «         |  
                    d| j        j        ¦  «         | j         	                    | j        j        ¦  «         | j        j        d                              d¦  «         |                      t          |¦  «        d¦  «         |d         d         }|d         d         }|d         d         }|d         d         }|                      |d	¦  «         |                      |d
¦  «         |                      |d¦  «         |                      |d¦  «         dS )zS
        Getting a complete output line on stdout generates a log message.
        rV   r   ó   hello world!
r   Úlog_namespaceÚstreamÚtagÚlineú%twisted.runner.procmon.ProcessMonitorÚstdoutúhello world!N)Ú
addCleanupr   ÚremoveObserverrE   ÚaddObserverrP   r\   rp   r   rq   r^   ro   rS   ÚoutReceivedÚassertEqualsr‚   ©r   ÚeventsÚ	namespacer¢   r£   r¤   s         r&   Útest_outputReceivedCompleteLinez,ProcmonTests.test_outputReceivedCompleteLinee  ó€  € ð ˆØ�ŠÕ*Ô9¸6¼=ÑIÔIÐIÝÔ& v¤}Ñ5Ô5Ð5ØŒ×Ò˜5 5 'Ñ*Ô*Ð*àŒ×ÒÑÔÐàŒ×Ò˜QÑÔÐØ�Š�e˜TœWÔ.Ñ/Ô/Ð/àŒ×Ò˜TœWÔ.Ñ/Ô/Ð/àŒÔ˜%Ô ×,Ò,Ð->Ñ?Ô?Ð?Ø×Ò�#˜f™+œ+ qÑ)Ô)Ð)Ø˜1”I˜oÔ.ˆ	Ø˜”˜8Ô$ˆØ�QŒi˜ÔˆØ�aŒy˜Ô ˆØ×Ò˜)Ð%LÑMÔMÐMØ×Ò˜& (Ñ+Ô+Ð+Ø×Ò˜#˜uÑ%Ô%Ð%Ø×Ò˜$ Ñ/Ô/Ð/Ð/Ð/r(   c                 ó\  — g }|                       t          j        |j        ¦  «         t          j        |j        ¦  «         | j                             ddg¦  «         | j                             ¦   «          | j         	                    d¦  «         |  
                    d| j        j        ¦  «         | j         	                    | j        j        ¦  «         | j        j        d                              d¦  «         |                      t          |¦  «        d¦  «         |d         d         }|d         d         }|d         d         }|d         d         }|                      |d	¦  «         |                      |d
¦  «         |                      |d¦  «         |                      |d¦  «         dS )zS
        Getting a complete output line on stderr generates a log message.
        rV   r   r    r   r¡   r¢   r£   r¤   r¥   Ústderrr§   N)r¨   r   r©   rE   rª   rP   r\   rp   r   rq   r^   ro   rS   ÚerrReceivedr¬   r‚   r­   s         r&   Ú!test_ouputReceivedCompleteErrLinez.ProcmonTests.test_ouputReceivedCompleteErrLine€  r±   r(   c                 óV  — g }|                       t          j        |j        ¦  «         t          j        |j        ¦  «         | j                             ddg¦  «         | j                             ¦   «          | j         	                    d¦  «         |  
                    d| j        j        ¦  «         | j         	                    | j        j        ¦  «         | j        j        d                              d¦  «         |                      t          |¦  «        d¦  «         |d         }|d         }|d         }|d         }|d         }|                      |d	¦  «         |                      |d
¦  «         |                      |d¦  «         |                      |t!          d¦  «        ¦  «         dS )zN
        Getting invalid UTF-8 results in the repr of the raw message
        rV   r   s   ÿhello world!
r   r¡   r¢   r£   r¤   r¥   r¦   s   ÿhello world!N)r¨   r   r©   rE   rª   rP   r\   rp   r   rq   r^   ro   rS   r«   r¬   r‚   r]   )r   r®   Úmessager¯   r¢   r£   Úoutputs          r&   Ú*test_outputReceivedCompleteLineInvalidUTF8z7ProcmonTests.test_outputReceivedCompleteLineInvalidUTF8›  s€  € ð ˆØ�ŠÕ*Ô9¸6¼=ÑIÔIÐIÝÔ& v¤}Ñ5Ô5Ð5ØŒ×Ò˜5 5 'Ñ*Ô*Ð*àŒ×ÒÑÔÐàŒ×Ò˜QÑÔÐØ�Š�e˜TœWÔ.Ñ/Ô/Ð/àŒ×Ò˜TœWÔ.Ñ/Ô/Ð/àŒÔ˜%Ô ×,Ò,Ð-BÑCÔCÐCØ×Ò�#˜f™+œ+ qÑ)Ô)Ð)Ø˜”)ˆØ˜OÔ,ˆ	Ø˜Ô"ˆØ�eŒnˆØ˜”ˆØ×Ò˜)Ð%LÑMÔMÐMØ×Ò˜& (Ñ+Ô+Ð+Ø×Ò˜#˜uÑ%Ô%Ð%Ø×Ò˜&¥$Ð':Ñ";Ô";Ñ<Ô<Ð<Ð<Ð<r(   c                 ó   — g }|                       t          j        |j        ¦  «         t          j        |j        ¦  «         | j                             ddg¦  «         | j                             ¦   «          | j         	                    d¦  «         |  
                    d| j        j        ¦  «         | j         	                    | j        j        ¦  «         | j        j        d                              d¦  «         |                      t          |¦  «        d¦  «         | j        j        d                              t#          t%          d¦  «        ¦  «        ¦  «         |                      t          |¦  «        d¦  «         |d         d         }|d         d         }|d         d         }|d         d         }|                      |d	¦  «         |                      |d
¦  «         |                      |d¦  «         |                      |d¦  «         dS )zM
        Getting partial line results in no events until process end
        rV   r   s   hello world!r   r¡   r¢   r£   r¤   r¥   r¦   r§   N)r¨   r   r©   rE   rª   rP   r\   rp   r   rq   r^   ro   rS   r«   r¬   r‚   r0   r	   r   r­   s         r&   Útest_outputReceivedPartialLinez+ProcmonTests.test_outputReceivedPartialLine·  sÇ  € ð ˆØ�ŠÕ*Ô9¸6¼=ÑIÔIÐIÝÔ& v¤}Ñ5Ô5Ð5ØŒ×Ò˜5 5 'Ñ*Ô*Ð*àŒ×ÒÑÔÐàŒ×Ò˜QÑÔÐØ�Š�e˜TœWÔ.Ñ/Ô/Ð/àŒ×Ò˜TœWÔ.Ñ/Ô/Ð/àŒÔ˜%Ô ×,Ò,¨_Ñ=Ô=Ð=Ø×Ò�#˜f™+œ+ qÑ)Ô)Ð)ØŒÔ˜%Ô ×-Ò-­gµkÀ!±n´nÑ.EÔ.EÑFÔFÐFØ×Ò�#˜f™+œ+ qÑ)Ô)Ð)Ø˜1”I˜oÔ.ˆ	Ø˜”˜8Ô$ˆØ�QŒi˜ÔˆØ�aŒy˜Ô ˆØ×Ò˜)Ð%LÑMÔMÐMØ×Ò˜& (Ñ+Ô+Ð+Ø×Ò˜#˜uÑ%Ô%Ð%Ø×Ò˜$ Ñ/Ô/Ð/Ð/Ð/r(   c                 ó^  — | j                              ddg¦  «         | j                              ¦   «          | j                             d¦  «         |                      d| j         j        ¦  «         | j                             | j         j        ¦  «         | j         j        d                              t          t          d¦  «        ¦  «        ¦  «         |                      d| j         j        ¦  «         | j                             d¦  «         |                      d| j         j        ¦  «         dS )z§
        L{ProcessMonitor.connectionLost} should immediately restart a process
        if it has been running longer than L{ProcessMonitor.threshold} seconds.
        rV   r   N)rP   r\   rp   r   rq   r^   ro   rS   r0   r	   r   re   rB   s    r&   Ú#test_connectionLostLongLivedProcessz0ProcmonTests.test_connectionLostLongLivedProcessÔ  sø   € ð
 	Œ×Ò˜5 5 'Ñ*Ô*Ð*àŒ×ÒÑÔÐàŒ×Ò˜QÑÔÐØ�Š�e˜TœWÔ.Ñ/Ô/Ð/àŒ×Ò˜TœWÔ.Ñ/Ô/Ð/àŒÔ˜%Ô ×-Ò-­gµkÀ!±n´nÑ.EÔ.EÑFÔFÐFØ×Ò˜ ¤Ô 1Ñ2Ô2Ð2àŒ×Ò˜QÑÔÐØ�Š�e˜TœWÔ.Ñ/Ô/Ð/Ð/Ð/r(   c                 ó€  — | j                              ddg¦  «         | j                              ¦   «          | j                             d¦  «         | j                              d¦  «         |                      d| j         j        ¦  «         | j         j        d         }|                      | 	                    ¦   «         ¦  «         | j                             | j         j
        d         j        j        ¦  «         |                      | 	                    ¦   «         ¦  «         |                      d| j         j        ¦  «         dS )z¡
        L{ProcessMonitor.connectionLost} cancels a scheduled process killer and
        deletes the DelayedCall from the L{ProcessMonitor.murder} list.
        rV   r   N)rP   r\   rp   r   rq   r“   r^   ÚmurderÚ
assertTrueÚactivero   r’   r-   ÚassertFalsere   )r   ÚdelayedCalls     r&   Útest_connectionLostMurderCancelz,ProcmonTests.test_connectionLostMurderCancelè  s  € ð
 	Œ×Ò˜5 5 'Ñ*Ô*Ð*àŒ×ÒÑÔÐàŒ×Ò˜QÑÔÐØŒ×Ò˜EÑ"Ô"Ð"à�Š�e˜TœWœ^Ñ,Ô,Ð,Ø”g”n UÔ+ˆØ�Š˜×*Ò*Ñ,Ô,Ñ-Ô-Ð-àŒ×Ò˜TœWÔ.¨uÔ5Ô?ÔQÑRÔRÐRà×Ò˜×+Ò+Ñ-Ô-Ñ.Ô.Ð.Ø×Ò˜ ¤¤Ñ/Ô/Ð/Ð/Ð/r(   c                 ó¬  — | j                              ¦   «          | j                              ddg¦  «         |                      d| j         j        ¦  «         | j         j        d         j                             d¦  «         | j                             | j         j        d         j        j	        ¦  «         |  
                    d| j         j        ¦  «         dS )z˜
        L{ProcessMonitor.connectionLost} removes the corresponding
        ProcessProtocol instance from the L{ProcessMonitor.protocols} list.
        rV   r,   N)rP   rp   r\   r^   ro   r’   r6   r   rq   r-   re   rB   s    r&   Ú#test_connectionLostProtocolDeletionz0ProcmonTests.test_connectionLostProtocolDeletioný  s³   € ð
 	Œ×ÒÑÔÐØŒ×Ò˜5 5 'Ñ*Ô*Ð*Ø�Š�e˜TœWÔ.Ñ/Ô/Ð/ØŒÔ˜%Ô Ô*×8Ò8¸Ñ@Ô@Ð@ØŒ×Ò˜TœWÔ.¨uÔ5Ô?ÔQÑRÔRÐRØ×Ò˜ ¤Ô 1Ñ2Ô2Ð2Ð2Ð2r(   c                 ó,  — d| j         _        d| j         _        | j                              ¦   «          | j                              ddg¦  «         |                      | j         j        d         | j         j        ¦  «         | j                             | j         j	        dz
  ¦  «         | j         j
        d                              t          t          d¦  «        ¦  «        ¦  «         |                      | j         j        d         | j         j        ¦  «         dS )z}
        L{ProcessMonitor.connectionLost} will wait at least minRestartDelay s
        and at most maxRestartDelay s
        rN   é   rV   r   r   N)rP   rQ   rR   rp   r\   ri   r4   r   rq   rS   ro   r0   r	   r   rB   s    r&   Ú%test_connectionLostMinMaxRestartDelayz2ProcmonTests.test_connectionLostMinMaxRestartDelay	  sà   € ð
 #$ˆŒÔØ"#ˆŒÔàŒ×ÒÑÔÐØŒ×Ò˜5 5 'Ñ*Ô*Ð*à×Ò˜œœ uÔ-¨t¬wÔ/FÑGÔGÐGØŒ×Ò˜TœWÔ.°Ñ2Ñ3Ô3Ð3ØŒÔ˜%Ô ×-Ò-­gµkÀ!±n´nÑ.EÔ.EÑFÔFÐFØ×Ò˜œœ uÔ-¨t¬wÔ/FÑGÔGÐGÐGÐGr(   c                 óB  — | j                              ¦   «          | j                              ddg¦  «         | j                             | j         j        dz
  ¦  «         |                      d| j         j        ¦  «         |                      | j         j	        d         | j         j
        ¦  «         | j         j        d                              t          t          d¦  «        ¦  «        ¦  «         |                      | j         j	        d         | j         j
        dz  ¦  «         dS )z|
        L{ProcessMonitor.connectionLost} doubles the restart delay each time
        the process dies too quickly.
        rV   r   r   rN   N)rP   rp   r\   r   rq   rS   r^   ro   ri   r4   rQ   r0   r	   r   rB   s    r&   Ú&test_connectionLostBackoffDelayDoublesz3ProcmonTests.test_connectionLostBackoffDelayDoubles  sê   € ð
 	Œ×ÒÑÔÐØŒ×Ò˜5 5 'Ñ*Ô*Ð*ØŒ×Ò˜TœWÔ.°Ñ2Ñ3Ô3Ð3Ø�Š�e˜TœWÔ.Ñ/Ô/Ð/Ø×Ò˜œœ uÔ-¨t¬wÔ/FÑGÔGÐGàŒÔ˜%Ô ×-Ò-­gµkÀ!±n´nÑ.EÔ.EÑFÔFÐFØ×Ò˜œœ uÔ-¨t¬wÔ/FÈÑ/JÑKÔKÐKÐKÐKr(   c                 óä   — | j                              ddg¦  «         | j                              ¦   «          | j                             d¦  «         |                      d| j         j        ¦  «         dS )zP
        L{ProcessMonitor.startService} starts all monitored processes.
        rV   r   N)rP   r\   rp   r   rq   r^   ro   rB   s    r&   Útest_startServicezProcmonTests.test_startService'  sg   € ð 	Œ×Ò˜5 5 'Ñ*Ô*Ð*àŒ×ÒÑÔÐàŒ×Ò˜QÑÔÐØ�Š�e˜TœWÔ.Ñ/Ô/Ð/Ð/Ð/r(   c                 ód  — | j                              ddg¦  «         | j                              ddg¦  «         | j                              ¦   «          | j                             | j         j        ¦  «         |                      d| j         j        ¦  «         |                      d| j         j        ¦  «         | j                             d¦  «         | j                              ¦   «          | j                             | j         j	        dz   ¦  «         |  
                    i | j         j        ¦  «         dS )zT
        L{ProcessMonitor.stopService} should stop all monitored processes.
        rV   Úbarr   N)rP   r\   rp   r   rq   rS   r^   ro   ÚstopServicer˜   ri   rB   s    r&   Útest_stopServicezProcmonTests.test_stopService2  s  € ð 	Œ×Ò˜5 5 'Ñ*Ô*Ð*ØŒ×Ò˜5 5 'Ñ*Ô*Ð*àŒ×ÒÑÔÐàŒ×Ò˜TœWÔ.Ñ/Ô/Ð/Ø�Š�e˜TœWÔ.Ñ/Ô/Ð/Ø�Š�e˜TœWÔ.Ñ/Ô/Ð/àŒ×Ò˜QÑÔÐàŒ×ÒÑÔÐð 	Œ×Ò˜TœWÔ-°Ñ1Ñ2Ô2Ð2à×Ò˜˜TœWÔ.Ñ/Ô/Ð/Ð/Ð/r(   c                 óÄ  — | j                              ddg¦  «         | j                              ¦   «          | j                             d¦  «         | j                              ¦   «          | j                             d¦  «         t          | j        j        ¦  «        }|                     ¦   «         }|  	                    |g ¦  «         |  
                    |j        ¦  «         dS )zR
        L{ProcessMonitor.restartAll} succeeds when there is one process.
        rV   r   N)rP   r\   rp   r   rq   Ú
restartAllrr   rA   Úpopr¬   r�   r.   )r   rh   Ú	myProcesss      r&   Ú!test_restartAllRestartsOneProcessz.ProcmonTests.test_restartAllRestartsOneProcessH  sÅ   € ð 	Œ×Ò˜5 5 'Ñ*Ô*Ð*ØŒ×ÒÑÔÐØŒ×Ò˜QÑÔÐØŒ×ÒÑÔÐð 	Œ×Ò˜QÑÔÐÝ˜œÔ6Ñ7Ô7ˆ	Ø—M’M‘O”Oˆ	Ø×Ò˜) RÑ(Ô(Ð(Ø×Ò˜)œ-Ñ(Ô(Ð(Ð(Ð(r(   c                 ó¸  — | j                              ddg¦  «         | j                              ¦   «          | j                             | j         j        ¦  «         |                      d| j         j        ¦  «         | j                             d¦  «         | j         j        d                              t          t          d¦  «        ¦  «        ¦  «         |                      | j         j        d                              ¦   «         ¦  «         | j                              ¦   «          |                      | j         j        d                              ¦   «         ¦  «         dS )ze
        L{ProcessMonitor.stopService} should cancel any scheduled process
        restarts.
        rV   r   r   N)rP   r\   rp   r   rq   rS   r^   ro   r0   r	   r   rÀ   ÚrestartrÁ   rÐ   rÂ   rB   s    r&   Útest_stopServiceCancelRestartsz+ProcmonTests.test_stopServiceCancelRestartsX  s  € ð
 	Œ×Ò˜5 5 'Ñ*Ô*Ð*àŒ×ÒÑÔÐàŒ×Ò˜TœWÔ.Ñ/Ô/Ð/Ø�Š�e˜TœWÔ.Ñ/Ô/Ð/àŒ×Ò˜QÑÔÐàŒÔ˜%Ô ×-Ò-­gµkÀ!±n´nÑ.EÔ.EÑFÔFÐFØ�Š˜œœ¨Ô.×5Ò5Ñ7Ô7Ñ8Ô8Ð8ØŒ×ÒÑÔÐà×Ò˜œœ¨Ô/×6Ò6Ñ8Ô8Ñ9Ô9Ð9Ð9Ð9r(   c                 óâ  — d| j         _        d| j         _        | j                              ¦   «          | j                              ddg¦  «         | j                             d¦  «         | j                              d¦  «         | j                             d¦  «         | j                              ¦   «          | j                             d¦  «         |  	                    | j         j
        i ¦  «         dS )ze
        L{ProcessMonitor.stopService} should cancel all scheduled process
        restarts.
        é   rV   r   é   N)rP   rS   rQ   rp   r\   r   rq   r“   rÐ   ri   ro   rB   s    r&   Ú(test_stopServiceCleanupScheduledRestartsz5ProcmonTests.test_stopServiceCleanupScheduledRestartsl  sÕ   € ð
 ˆŒÔØ"#ˆŒÔàŒ×ÒÑÔÐØŒ×Ò˜5 5 'Ñ*Ô*Ð*àŒ×Ò˜QÑÔÐØŒ×Ò˜EÑ"Ô"Ð"àŒ×Ò˜QÑÔÐàŒ×ÒÑÔÐàŒ×Ò˜QÑÔÐð 	×Ò˜œÔ*¨BÑ/Ô/Ð/Ð/Ð/r(   N)$r9   r:   r;   r<   rT   ra   rf   rk   rm   rt   rx   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   rK   ‹   s  € € € € € ðð ðð ð ð+ð +ð +ð
.ð 
.ð 
.ð
ð 
ð 
ð=ð =ð =ð
Bð 
Bð 
Bð
ð 
ð 
ð	Qð 	Qð 	QðNð Nð Nð	4ð 	4ð 	4ðBð Bð Bð
9ð 
9ð 
9ð7ð 7ð 7ðAð Að AðMð Mð Mð<Mð Mð Mð:@ð @ð @ð6ð 6ð 6ð0ð 0ð 0ð60ð 0ð 0ð6=ð =ð =ð80ð 0ð 0ð:0ð 0ð 0ð(0ð 0ð 0ð*
3ð 
3ð 
3ðHð Hð Hð Lð Lð Lð	0ð 	0ð 	0ð0ð 0ð 0ð,)ð )ð )ð :ð :ð :ð(0ð 0ð 0ð 0ð 0r(   rK   c                   ó*   — e Zd ZdZd„ Zd„ Zd„ Zd„ ZdS )ÚDeprecationTestszQ
    Tests that check functionality that should be deprecated is deprecated.
    c                 ó`   — t          ¦   «         | _        t          | j        ¬¦  «        | _        dS )z5
        Create reactor and process monitor.
        rM   N)r?   r   r   rP   rB   s    r&   rT   zDeprecationTests.setUpŠ  s)   € õ +Ñ,Ô,ˆŒÝ ¨¬Ð6Ñ6Ô6ˆŒˆˆr(   c                 óx  — | j                              ddg¦  «         | j         j        }|                      t	          |¦  «        d¦  «         |                      ¦   «         }d}|D ]/}|                      |d         t          ¦  «         d|d         v rd}Œ0|                      |dt          |¦  «        › �¦  «         d	S )
a   
        _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.
        rV   r   FÚcategoryÚtoTupler·   Tzno tuple deprecation found:N)
rP   r\   rh   r¬   r‚   ÚflushWarningsÚassertIsÚDeprecationWarningrÀ   r]   )r   ÚmyprocessesÚwarningsÚfoundToTupleÚwarnings        r&   Útest_toTuplezDeprecationTests.test_toTuple‘  sÄ   € ð 	Œ×Ò˜5 5 'Ñ*Ô*Ð*Ø”gÔ'ˆØ×Ò�#˜kÑ*Ô*¨AÑ.Ô.Ð.Ø×%Ò%Ñ'Ô'ˆØˆØð 	$ð 	$ˆGØ�MŠM˜' *Ô-Õ/AÑBÔBÐBØ˜G IÔ.Ð.Ð.Ø#�øØ�Š˜Ð&TÅDÈÁNÄNÐ&TÐ&TÑUÔUÐUÐUÐUr(   c                 ó
  — | j         j        }|                      |i ¦  «         |                      ¦   «         }|                     d¦  «        }|                      |d         t          ¦  «         |                      |g ¦  «         dS )a  
        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)rP   rh   r¬   rä   rÔ   rå   ræ   )r   ÚmyProcessesrè   Úfirsts       r&   Útest_processeszDeprecationTests.test_processes¤  sz   € ð ”gÔ'ˆØ×Ò˜+ rÑ*Ô*Ð*Ø×%Ò%Ñ'Ô'ˆØ—’˜Q‘”ˆØ�Š�e˜JÔ'Õ);Ñ<Ô<Ð<Ø×Ò˜( BÑ'Ô'Ð'Ð'Ð'r(   c                 ó¬   — t          j        | j        ¦  «         |                      ¦   «         }|D ]#}|                      |d         t
          ¦  «         Œ$dS )zO
        Pickling an L{ProcessMonitor} results in deprecation warnings
        râ   N)ÚpickleÚdumpsrP   rä   rå   ræ   )r   rè   rê   s      r&   Útest_getstatezDeprecationTests.test_getstate³  sa   € õ 	Œ�T”WÑÔÐØ×%Ò%Ñ'Ô'ˆØð 	Cð 	CˆGØ�MŠM˜' *Ô-Õ/AÑBÔBÐBÐBð	Cð 	Cr(   N)r9   r:   r;   r<   rT   rë   rï   ró   r=   r(   r&   rß   rß   „  sb   € € € € € ðð ð7ð 7ð 7ðVð Vð Vð&(ð (ð (ðCð Cð Cð Cð Cr(   rß   )r<   rñ   Útwisted.internet.errorr   r   r   Útwisted.internet.taskr   Útwisted.internet.testingr   Útwisted.loggerr   Útwisted.python.failurer	   Útwisted.runner.procmonr
   r   Útwisted.trialr   r   r?   ÚTestCaserK   ÚSynchronousTestCaserß   r=   r(   r&   ú<module>rý      s‡  ððð ð €€€à WÐ WÐ WÐ WÐ WÐ WÐ WÐ WÐ WÐ WØ 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2Ø -Ð -Ð -Ð -Ð -Ð -Ø *Ð *Ð *Ð *Ð *Ð *Ø BÐ BÐ BÐ BÐ BÐ BÐ BÐ BØ "Ð "Ð "Ð "Ð "Ð "ðGDð GDð GDð GDð GDñ GDô GDð GDðT,ð ,ð ,ð ,ð ,˜-¨ñ ,ô ,ð ,ð^v0ð v0ð v0ð v0ð v0�8Ô$ñ v0ô v0ð v0ðr6Cð 6Cð 6Cð 6Cð 6C�xÔ3ñ 6Cô 6Cð 6Cð 6Cð 6Cr(   