
    Vhu+                         d Z ddlZddlZddlmZ ddlmZmZmZm	Z	m
Z
mZ ddlmZ ddlmZ ddlmZmZ ddlmZ dd	lmZ dd
lmZ  G d de      Z e       j7                  ej9                                y)z/
Tests for implementations of L{IReactorCore}.
    N)	FrameType)CallableListOptionalTupleUnioncast)FileDescriptor)Deferred)ReactorAlreadyRunningReactorNotRestartable)ReactorBuilder)Failure)SynchronousTestCasec                       e Zd ZdZddZddZddZddZddZddZ	dd	Z
dd
ZddZddZddZddZddZddZy)SystemEventTestsBuilderz{
    Builder defining tests relating to L{IReactorCore.addSystemEventTrigger}
    and L{IReactorCore.fireSystemEvent}.
    Nc                     | j                         }t        t        |       j                  t        |j
                         y)zu
        C{reactor.stop()} raises L{RuntimeError} when called when the reactor
        has not been started.
        N)buildReactorr	   r   assertRaisesRuntimeErrorstopselfreactors     O/home/dcms/DCMS/lib/python3.12/site-packages/twisted/internet/test/test_core.pytest_stopWhenNotStartedz/SystemEventTestsBuilder.test_stopWhenNotStarted   s.    
 ##% $'44\7<<P    c                     | j                         }|j                  |j                         | j                  |       t	        t
        |       j                  t        |j                         y)zr
        C{reactor.stop()} raises L{RuntimeError} when called after the reactor
        has been stopped.
        N)r   callWhenRunningr   
runReactorr	   r   r   r   r   s     r   test_stopWhenAlreadyStoppedz3SystemEventTestsBuilder.test_stopWhenAlreadyStopped$   sL    
 ##%-  $'44\7<<Pr   c                 4   | j                         }g }|j                  |j                  d       |j                  |j                  d       |j                  |j                         | j	                  |       t        t        |       j                  |ddg       y)zm
        Functions are run in the order that they were passed to
        L{reactor.callWhenRunning}.
        firstsecondN)r   r   appendr   r    r	   r   assertEqualr   r   eventss      r   test_callWhenRunningOrderz1SystemEventTestsBuilder.test_callWhenRunningOrder.   sz    
 ##%w7x8-  $'33FWh<OPr   c                    | j                         i dfd}dfd}dfd}t        t        |       }j                  dd|       j                  dd|       j                  dd|       j	                  j
                         |j                  i        | j                         |j                  d	d
d
d       y)z
        The reactor is not running when C{"before"} C{"startup"} triggers are
        called and is running when C{"during"} and C{"after"} C{"startup"}
        triggers are called.
        Nc                  $     j                   d<   y Nbeforerunningr   states   r   beforeStartupzKSystemEventTestsBuilder.test_runningForStartupEvents.<locals>.beforeStartupD       %ooE(Or   c                  $     j                   d<   y )Nduringr.   r0   s   r   duringStartupzKSystemEventTestsBuilder.test_runningForStartupEvents.<locals>.duringStartupG   r3   r   c                  $     j                   d<   y Nafterr.   r0   s   r   afterStartupzJSystemEventTestsBuilder.test_runningForStartupEvents.<locals>.afterStartupJ   s    $__E'Nr   r-   startupr5   r9   FT)r-   r5   r9   returnN)r   r	   r   addSystemEventTriggerr   r   r&   r    )r   r2   r6   r:   testCaser   r1   s        @@r   test_runningForStartupEventsz4SystemEventTestsBuilder.test_runningForStartupEvents;   s     ##%	.	.	- +T2%%h	=I%%h	=I%%gy,G-UB' Uut$TUr   c                    | j                         }ddfd}dfd}|j                  dd|       |j                  dd|       g dt        d	t        t        t        gdf   ddffd
}t        t        |       }|j                  t        d|       |j                  |j                         |j                         |j                  g        | j                  |       |j                  d       |j                  d       y)ze
        Signal handlers are installed in responsed to the C{"during"}
        C{"startup"}.
        Nr=   c                  
    d y r,    phases   r   r2   zXSystemEventTestsBuilder.test_signalHandlersInstalledDuringStartup.<locals>.beforeStartup_   s    Er   c                  
    d y r8   rC   rD   s   r   r:   zWSystemEventTestsBuilder.test_signalHandlersInstalledDuringStartup.<locals>.afterStartupc   s    Er   r-   r;   r9   signumactionc                 (    j                         y Nr%   )rG   rH   rE   sawPhases     r   
fakeSignalzUSystemEventTestsBuilder.test_signalHandlersInstalledDuringStartup.<locals>.fakeSignall   s    OOE"r   signalr<   )r   r>   intr   r   r	   r   patchrN   r   r   assertIsNoner&   r    assertIn)r   r   r2   r:   rM   r?   rE   rL   s         @@r   )test_signalHandlersInstalledDuringStartupzASystemEventTestsBuilder.test_signalHandlersInstalledDuringStartupW   s    
 ##%#		 	%%h	=I%%gy,G	#s 	#Hc95Et5K,L 	#QU 	# +T2vx4-e$Xr* (H-UG,r   c                 J   | j                         }g |j                  ddfd       |j                  ddfd       |j                  ddfd       |j                  |j                         | j	                  |       t        t        |       j                  g d       y	)
z
        C{reactor.stop()} fires all three phases of shutdown event triggers
        before it makes C{reactor.run()} return.
        r-   shutdownc                  &     j                  d      S Nr-   rU   rK   r(   s   r   <lambda>zASystemEventTestsBuilder.test_stopShutDownEvents.<locals>.<lambda>       &--8N*O r   r5   c                  &     j                  d      S )Nr5   rU   rK   rY   s   r   rZ   zASystemEventTestsBuilder.test_stopShutDownEvents.<locals>.<lambda>   r[   r   r9   c                  &     j                  d      S )Nr9   rU   rK   rY   s   r   rZ   zASystemEventTestsBuilder.test_stopShutDownEvents.<locals>.<lambda>   s    7L)M r   )rX   r]   r_   N)r   r>   r   r   r    r	   r   r&   r'   s     @r   test_stopShutDownEventsz/SystemEventTestsBuilder.test_stopShutDownEventsy   s    
 ##%%%j"O	
 	%%j"O	
 	%%Z!M	
 	-  $'33S	
r   c                 &   | j                         g j                  ddj                  d       dfd}t        t        |       }j                  |       |j                  g        | j                         |j                  ddg       y)zl
        C{"before"} C{"shutdown"} triggers are not run synchronously from
        L{reactor.stop}.
        r-   rU   zbefore shutdownNc                  H    j                           j                  d       y )Nstopped)r   r%   r(   r   s   r   stopItzPSystemEventTestsBuilder.test_shutdownFiresTriggersAsynchronously.<locals>.stopIt   s    LLNMM)$r   rc   r<   )r   r>   r%   r	   r   r   r&   r    )r   re   r?   r(   r   s      @@r   (test_shutdownFiresTriggersAsynchronouslyz@SystemEventTestsBuilder.test_shutdownFiresTriggersAsynchronously   s    
 ##%%%j&--1B	
	% +T2'VR( Vi1B%CDr   c                    dg G d dt               } G fddt               }t        t        |       }| j                         }t	         |        |       g      fd|_        |j                  |j                         | j                  |       |j                  t        |j                  t                    d       |j                  d          y	)
z
        A L{IFileDescriptor.connectionLost} implementation which raises an
        exception does not prevent the remaining L{IFileDescriptor}s from
        having their C{connectionLost} method called.
        Fc                       e Zd ZdeddfdZy)ZSystemEventTestsBuilder.test_shutdownDisconnectsCleanly.<locals>.ProblematicFileDescriptorreasonr=   Nc                     t        d      )Nzsimulated connectionLost error)r   )r   rj   s     r   connectionLostziSystemEventTestsBuilder.test_shutdownDisconnectsCleanly.<locals>.ProblematicFileDescriptor.connectionLost   s    "#CDDr   __name__
__module____qualname__r   rl   rC   r   r   ProblematicFileDescriptorri      s    EW E Er   rq   c                   "    e Zd Zdeddf fdZy)QSystemEventTestsBuilder.test_shutdownDisconnectsCleanly.<locals>.OKFileDescriptorrj   r=   Nc                     dd<   y )NTr   rC   )r   rj   lostOKs     r   rl   z`SystemEventTestsBuilder.test_shutdownDisconnectsCleanly.<locals>.OKFileDescriptor.connectionLost   s     q	r   rm   )ru   s   r   OKFileDescriptorrs      s    !W ! !r   rv   c                       S rJ   rC   )fdss   r   rZ   zISystemEventTestsBuilder.test_shutdownDisconnectsCleanly.<locals>.<lambda>   s    C r      r   N)r
   r	   r   r   iter	removeAllr   r   r    r&   lenflushLoggedErrorsr   
assertTrue)r   rq   rv   r?   r   rx   ru   s        @@r   test_shutdownDisconnectsCleanlyz7SystemEventTestsBuilder.test_shutdownDisconnectsCleanly   s     	E 	E	!~ 	! +T2##% -/1A1CDE'- S!;!;L!IJANF1I&r   c                     g t        t        |       dfd}| j                         j                  |       j                  j                         | j                         j                  dg       y)z{
        C{reactor.run()} raises L{ReactorAlreadyRunning} when called when
        the reactor is already running.
        Nc                  h    j                  t        j                          j                  d       y Ntested)r   r   runr%   r(   r   r?   s   r   reentrantRunz>SystemEventTestsBuilder.test_multipleRun.<locals>.reentrantRun   $    !!"7EMM(#r   r   r<   )r	   r   r   r   r   r    r&   )r   r   r(   r   r?   s     @@@r   test_multipleRunz(SystemEventTestsBuilder.test_multipleRun   sj    
 +T2	$ ##%-- VhZ0r   c                    g dt         t           ffd}dt        ddffd| j                         j                  dd|       | j	                         t        t        |       j                  dd	g       y)
z
        When there is a C{'before'} C{'startup'} trigger which returns an
        unfired L{Deferred}, C{reactor.run()} starts the reactor and does not
        return until after C{reactor.stop()} is called
        r=   c                      j                  d       t               } | j                         j                  d| j                  d        | S )Ntriggerr   )r%   r   addCallback	callLatercallback)dr   r(   r   s    r   r   zUSystemEventTestsBuilder.test_runWithAsynchronousBeforeStartupTrigger.<locals>.trigger   s=    MM)$"**AMM(#aT2Hr   ignoredNc                 H    j                  d       j                          y )Nr   )r%   r   )r   r(   r   s    r   r   zVSystemEventTestsBuilder.test_runWithAsynchronousBeforeStartupTrigger.<locals>.callback   s    MM*%LLNr   r-   r;   r   r   )r   objectr   r>   r    r	   r   r&   )r   r   r   r(   r   s     @@@r   ,test_runWithAsynchronousBeforeStartupTriggerzDSystemEventTestsBuilder.test_runWithAsynchronousBeforeStartupTrigger   sy     	&) 		f 	 	 ##%%%h	7C  $'33FY
<STr   c                 8   | j                         }|j                  d|j                        }t        j                         }|j	                  d       t        j                         |z
  }t        t        |       j                  |dk         |j                          y)z6
        C{reactor.iterate()} does not block.
           r      N)	r   r   crashtimeiterater	   r   r~   cancel)r   r   tstartelapseds        r   test_iteratez$SystemEventTestsBuilder.test_iterate   sr     ##%a/		))+% $'227Q;?	
r   c                 @   | j                         }g |j                  ddfd       |j                  |j                  d|j                         | j                  |       t        t        |       }|j                  |j                         |j                  d       y)zc
        C{reactor.crash()} stops the reactor and does not fire shutdown
        triggers.
        r-   rU   c                  &     j                  d      S rW   rK   rY   s   r   rZ   z4SystemEventTestsBuilder.test_crash.<locals>.<lambda>  r[   r   r   z8Shutdown triggers invoked but they should not have been.N)
r   r>   r   r   r   r    r	   r   assertFalser/   )r   r   r?   r(   s      @r   
test_crashz"SystemEventTestsBuilder.test_crash   s    
 ##%%%j"O	
 	 1 11gmmD +T2W__-N	
r   c                    g dfd}| j                         j                  |       | j                         dfd}j                  |       | j                         t        t        |       j                  ddg       y)zp
        C{reactor.run()} restarts the reactor after it has been stopped by
        C{reactor.crash()}.
        Nc                  H     j                  d       j                          y )Nr   )r%   r   rd   s   r   r   z9SystemEventTestsBuilder.test_runAfterCrash.<locals>.crash  s    MM'"MMOr   c                  `     j                  dj                  f       j                          y )Nr   )r%   r/   r   rd   s   r   r   z8SystemEventTestsBuilder.test_runAfterCrash.<locals>.stop   s!    MM67??34LLNr   r   )r   Tr<   )r   r   r    r	   r   r&   )r   r   r   r(   r   s      @@r   test_runAfterCrashz*SystemEventTestsBuilder.test_runAfterCrash  sw    
 68	 ##%& 	 	%  $'33FWn<UVr   c                    g t        t        |       dfd}| j                         j                  j                         j                  dd|       | j                         j                  dg       y)z
        C{reactor.run()} raises L{ReactorNotRestartable} when called when
        the reactor is being run after getting stopped priorly.
        Nc                  h    j                  t        j                          j                  d       y r   )r   r   r   r%   r   s   r   restartz:SystemEventTestsBuilder.test_runAfterStop.<locals>.restart1  r   r   r9   rU   r   r<   )r	   r   r   r   r   r>   r    r&   )r   r   r(   r   r?   s     @@@r   test_runAfterStopz)SystemEventTestsBuilder.test_runAfterStop(  sn    
 +T2	$ ##%-%%gz7C VhZ0r   r<   )rn   ro   rp   __doc__r   r!   r)   r@   rS   r`   rf   r   r   r   r   r   r   r   rC   r   r   r   r      sV    
QQQV8 -D
.E,'@1&U0
$W.1r   r   )r   rN   r   typesr   typingr   r   r   r   r   r	   twisted.internet.abstractr
   twisted.internet.deferr   twisted.internet.errorr   r   #twisted.internet.test.reactormixinsr   twisted.python.failurer   twisted.trial.unittestr   r   globalsupdatemakeTestCaseClassesrC   r   r   <module>r      sX   
    ? ? 4 + O > * 6c1n c1L	 	  (<<> ?r   