o
    bu+                     @   s   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 deZe e  dS )z/
Tests for implementations of L{IReactorCore}.
    N)	FrameType)CallableListOptionalTupleUnioncast)FileDescriptor)Deferred)ReactorAlreadyRunningReactorNotRestartable)ReactorBuilder)Failure)SynchronousTestCasec                   @   s   e Zd ZdZd ddZd ddZd dd	Zd d
dZd ddZd ddZ	d ddZ
d ddZd ddZd ddZd ddZd ddZd ddZd ddZdS )!SystemEventTestsBuilderz{
    Builder defining tests relating to L{IReactorCore.addSystemEventTrigger}
    and L{IReactorCore.fireSystemEvent}.
    returnNc                 C   s    |   }tt| t|j dS )zu
        C{reactor.stop()} raises L{RuntimeError} when called when the reactor
        has not been started.
        N)buildReactorr   r   assertRaisesRuntimeErrorstopselfreactor r   A/usr/lib/python3/dist-packages/twisted/internet/test/test_core.pytest_stopWhenNotStarted   s   z/SystemEventTestsBuilder.test_stopWhenNotStartedc                 C   s6   |   }||j | | tt| t|j dS )zr
        C{reactor.stop()} raises L{RuntimeError} when called after the reactor
        has been stopped.
        N)r   callWhenRunningr   
runReactorr   r   r   r   r   r   r   r   test_stopWhenAlreadyStopped$   s   
z3SystemEventTestsBuilder.test_stopWhenAlreadyStoppedc                 C   sX   |   }g }||jd ||jd ||j | | tt| |ddg dS )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   eventsr   r   r   test_callWhenRunningOrder.   s   
z1SystemEventTestsBuilder.test_callWhenRunningOrderc                    s   |    i d fdd}d fdd}d fdd}tt| } d	d
|  dd
|  dd
|   j |i  |   |dddd dS )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.
        r   Nc                          j d< d S Nbeforerunningr   r   stater   r   beforeStartupD      zKSystemEventTestsBuilder.test_runningForStartupEvents.<locals>.beforeStartupc                      r%   )Nduringr(   r   r*   r   r   duringStartupG   r-   zKSystemEventTestsBuilder.test_runningForStartupEvents.<locals>.duringStartupc                      r%   Nafterr(   r   r*   r   r   afterStartupJ   r-   zJSystemEventTestsBuilder.test_runningForStartupEvents.<locals>.afterStartupr'   startupr.   r1   FT)r'   r.   r1   r   N)r   r   r   addSystemEventTriggerr   r   r"   r   )r   r,   r/   r2   testCaser   r*   r   test_runningForStartupEvents;   s   

z4SystemEventTestsBuilder.test_runningForStartupEventsc                    s   |   }d d fdd}d fdd}|dd| |d	d| g d
tdtttgdf ddf fdd}tt| }|td| |	|j
 |  |g  | | |d | d	 dS )ze
        Signal handlers are installed in responsed to the C{"during"}
        C{"startup"}.
        Nr   c                         d d S r&   r   r   phaser   r   r,   _      zXSystemEventTestsBuilder.test_signalHandlersInstalledDuringStartup.<locals>.beforeStartupc                      r8   r0   r   r   r9   r   r   r2   c   r;   zWSystemEventTestsBuilder.test_signalHandlersInstalledDuringStartup.<locals>.afterStartupr'   r3   r1   signumactionc                    s      d S Nr!   )r<   r=   r:   sawPhaser   r   
fakeSignall   r-   zUSystemEventTestsBuilder.test_signalHandlersInstalledDuringStartup.<locals>.fakeSignalsignalr4   )r   r5   intr   r   r   r   patchrC   r   r   assertIsNoner"   r   assertIn)r   r   r,   r2   rB   r6   r   r@   r   )test_signalHandlersInstalledDuringStartupW   s    (


zASystemEventTestsBuilder.test_signalHandlersInstalledDuringStartupc                    s~   |   }g  |dd fdd |dd fdd |dd fdd ||j | | tt|  g d	 d
S )z
        C{reactor.stop()} fires all three phases of shutdown event triggers
        before it makes C{reactor.run()} return.
        r'   shutdownc                      
     dS Nr'   rI   r?   r   r#   r   r   <lambda>      
 zASystemEventTestsBuilder.test_stopShutDownEvents.<locals>.<lambda>r.   c                      rJ   )Nr.   rI   r?   r   rM   r   r   rN      rO   r1   c                      rJ   )Nr1   rI   r?   r   rM   r   r   rN      rO   )rL   rP   rQ   N)r   r5   r   r   r   r   r   r"   r   r   rM   r   test_stopShutDownEventsy   s"   

z/SystemEventTestsBuilder.test_stopShutDownEventsc                    sl   |   g  dd jd d	 fdd}tt| }| | g  |  | ddg dS )
zl
        C{"before"} C{"shutdown"} triggers are not run synchronously from
        L{reactor.stop}.
        r'   rI   zbefore shutdownr   Nc                      s       d d S )Nstopped)r   r!   r   r#   r   r   r   stopIt   s   zPSystemEventTestsBuilder.test_shutdownFiresTriggersAsynchronously.<locals>.stopItrS   r4   )r   r5   r!   r   r   r   r"   r   )r   rU   r6   r   rT   r   (test_shutdownFiresTriggersAsynchronously   s   



z@SystemEventTestsBuilder.test_shutdownFiresTriggersAsynchronouslyc                    s   dgG dd dt }G fdddt }tt| }|  }t| | g  fdd|_||j | | |	t
|td |d	  d
S )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                   @   s   e Zd ZdeddfddZdS )zZSystemEventTestsBuilder.test_shutdownDisconnectsCleanly.<locals>.ProblematicFileDescriptorreasonr   Nc                 S   s   t d)Nzsimulated connectionLost error)r   r   rW   r   r   r   connectionLost   s   ziSystemEventTestsBuilder.test_shutdownDisconnectsCleanly.<locals>.ProblematicFileDescriptor.connectionLost__name__
__module____qualname__r   rY   r   r   r   r   ProblematicFileDescriptor   s    r^   c                       s"   e Zd Zdeddf fddZdS )zQSystemEventTestsBuilder.test_shutdownDisconnectsCleanly.<locals>.OKFileDescriptorrW   r   Nc                    s   d d< d S )NTr   r   rX   lostOKr   r   rY      s   z`SystemEventTestsBuilder.test_shutdownDisconnectsCleanly.<locals>.OKFileDescriptor.connectionLostrZ   r   r_   r   r   OKFileDescriptor   s    ra   c                      s    S r>   r   r   )fdsr   r   rN      s    zISystemEventTestsBuilder.test_shutdownDisconnectsCleanly.<locals>.<lambda>   r   N)r	   r   r   r   iter	removeAllr   r   r   r"   lenflushLoggedErrorsr   
assertTrue)r   r^   ra   r6   r   r   )rb   r`   r   test_shutdownDisconnectsCleanly   s   

z7SystemEventTestsBuilder.test_shutdownDisconnectsCleanlyc                    sZ   g  t t| d fdd}|  | j |   dg dS )z{
        C{reactor.run()} raises L{ReactorAlreadyRunning} when called when
        the reactor is already running.
        r   Nc                          tj  d d S Ntested)r   r   runr!   r   r#   r   r6   r   r   reentrantRun      z>SystemEventTestsBuilder.test_multipleRun.<locals>.reentrantRunrl   r4   )r   r   r   r   r   r   r"   )r   ro   r   rn   r   test_multipleRun   s   


z(SystemEventTestsBuilder.test_multipleRunc                    sp   g dt t f fdd}dtddffdd |  dd	| |  tt| d
dg dS )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                     s.    d t } |   d| jd  | S )Ntriggerr   )r!   r
   addCallback	callLatercallback)dru   r#   r   r   r   rr      s
   

zUSystemEventTestsBuilder.test_runWithAsynchronousBeforeStartupTrigger.<locals>.triggerignoredNc                         d   d S )Nru   )r!   r   )rx   rT   r   r   ru         
zVSystemEventTestsBuilder.test_runWithAsynchronousBeforeStartupTrigger.<locals>.callbackr'   r3   rr   ru   )r
   objectr   r5   r   r   r   r"   )r   rr   r   rw   r   ,test_runWithAsynchronousBeforeStartupTrigger   s   
zDSystemEventTestsBuilder.test_runWithAsynchronousBeforeStartupTriggerc                 C   sT   |   }|d|j}t }|d t | }tt| |dk  |  dS )z6
        C{reactor.iterate()} does not block.
           r      N)	r   rt   crashtimeiterater   r   rh   cancel)r   r   tstartelapsedr   r   r   test_iterate   s   
z$SystemEventTestsBuilder.test_iteratec                    sd   |   }g  |dd fdd ||jd|j | | tt| }||j	 | d dS )zc
        C{reactor.crash()} stops the reactor and does not fire shutdown
        triggers.
        r'   rI   c                      rJ   rK   r?   r   rM   r   r   rN     rO   z4SystemEventTestsBuilder.test_crash.<locals>.<lambda>r   z8Shutdown triggers invoked but they should not have been.N)
r   r5   r   rt   r   r   r   r   assertFalser)   )r   r   r6   r   rM   r   
test_crash   s   

z"SystemEventTestsBuilder.test_crashc                    sn   g  d	 fdd}|   | |  d	 fdd}| |  tt|  ddg dS )
zp
        C{reactor.run()} restarts the reactor after it has been stopped by
        C{reactor.crash()}.
        r   Nc                      ry   )Nr   )r!   r   r   rT   r   r   r     rz   z9SystemEventTestsBuilder.test_runAfterCrash.<locals>.crashc                      s     djf   d S )Nr   )r!   r)   r   r   rT   r   r   r      s   z8SystemEventTestsBuilder.test_runAfterCrash.<locals>.stopr   )r   Tr4   )r   r   r   r   r   r"   )r   r   r   r   rT   r   test_runAfterCrash  s   



z*SystemEventTestsBuilder.test_runAfterCrashc                    s^   g  t t| d fdd}|  j dd| |   dg dS )	z
        C{reactor.run()} raises L{ReactorNotRestartable} when called when
        the reactor is being run after getting stopped priorly.
        r   Nc                      rj   rk   )r   r   rm   r!   r   rn   r   r   restart1  rp   z:SystemEventTestsBuilder.test_runAfterStop.<locals>.restartr1   rI   rl   r4   )r   r   r   r   r   r5   r   r"   )r   r   r   rn   r   test_runAfterStop(  s   

z)SystemEventTestsBuilder.test_runAfterStopr4   )r[   r\   r]   __doc__r   r   r$   r7   rH   rR   rV   ri   rq   r|   r   r   r   r   r   r   r   r   r      s     






"


 



r   )r   rC   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makeTestCaseClassesr   r   r   r   <module>   s      (