a
    )(b                     @   s   d Z ddlmZ ddlmZmZmZ ddl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 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j j!j"Z#G dd dej j!j"Z$dS )z0
Tests for L{twisted.application.twist._twist}.
    )stdout)AnyDictListN)IReactorCore)LogLeveljsonFileLogObserver)MemoryReactor)SignalCapturingMemoryReactor   )
ExitStatus)Runner)	DummyExit)IServiceMultiService)_twist   )TwistOptions)Twistc                   @   s   e Zd ZdZddddZddddZdddd	Zddd
dZddddZddddZ	ddddZ
ddddZddddZddddZdS )
TwistTestsz
    Tests for L{Twist}.
    Nreturnc                 C   s   |    d S N)patchInstallReactorself r   Hlib/python3.9/site-packages/twisted/application/twist/test/test_twist.pysetUp   s    zTwistTests.setUpc                 C   s   t  | _| td| j dS )zX
        Patch L{_twist.exit} so we can capture usage and prevent actual exits.
        exitN)r   r   patchr   r   r   r   r   	patchExit!   s    zTwistTests.patchExitc                    s.   i  _ tttd fdd} td| dS )zo
        Patch C{_options.installReactor} so we can capture usage and prevent
        actual installs.
        )_namer   c                    s   t  }| j|< |S r   )r	   installedReactors)r"   r#   reactorr   r   r   installReactor/   s    
z6TwistTests.patchInstallReactor.<locals>.installReactorr&   N)r$   r   strr   r    )r   r&   r   r   r   r   (   s    zTwistTests.patchInstallReactorc                    s,   g  _ tdd fdd} td| dS )zo
        Patch L{MultiService.startService} so we can capture usage and prevent
        actual starts.
        N)servicer   c                    s    j |  d S r   )serviceStartsappend)r(   r   r   r   startService=   s    z2TwistTests.patchStartService.<locals>.startServicer+   )r)   r   r    r   )r   r+   r   r   r   patchStartService6   s    zTwistTests.patchStartServicec                 C   s   t ddg}| |t dS )zI
        L{Twist.options} given valid arguments returns options.
        twistwebN)r   optionsZassertIsInstancer   )r   r/   r   r   r   test_optionsValidArgumentsB   s    z%TwistTests.test_optionsValidArgumentsc                 C   sj   |    tddg | | jjtj | | jj	 | 
| jj	d | 
| jj	dt   dS )z
        L{Twist.options} given invalid arguments exits with
        L{ExitStatus.EX_USAGE} and an error/usage message.
        r-   z--bogus-bagelszError: z

N)r!   r   r/   ZassertIdenticalr   Zstatusr   EX_USAGEZassertIsNotNonemessage
assertTrue
startswithendswithr   r   r   r   r   test_optionsInvalidArgumentsJ   s    
z'TwistTests.test_optionsInvalidArgumentsc                 C   s6   t ddg}t |jd |j}| t| dS )z:
        L{Twist.service} returns an L{IService}.
        r-   r.   N)r   r/   r(   plugins
subOptionsr3   r   Z
providedBy)r   r/   r(   r   r   r   test_service^   s    zTwistTests.test_servicec                 C   s   t ddg}|d }|j}|dus(J t j|j| |jd}|   t || | | j	|g | |j
d d |jdi fg dS )	z
        L{Twist.startService} starts the service and registers a trigger to
        stop the service when the reactor shuts down.
        r-   r.   r%   N)Zpluginr/   ZbeforeZshutdownr   )r   r/   
subCommandr(   r7   r8   r,   r+   assertEqualr)   ZtriggersZstopService)r   r/   r%   r:   r(   r   r   r   test_startServicef   s    zTwistTests.test_startServicec              	      s|   g  |  td fdd |  tddd  tg d}t| | t d |  d t| jd	 t	j
ttd
 dS )zi
        L{Twist.run} runs the runner with arguments corresponding to the given
        options.
        __init__c                    s
     |S r   )r*   )r   argsZargsSeenr   r   <lambda>       z%TwistTests.test_run.<locals>.<lambda>runc                 S   s   d S r   r   r   r   r   r   r@      rA   r-   z--reactor=defaultz--log-format=jsonr.      r   defaultr%   ZdefaultLogLevelZlogFilefileLogObserverFactoryN)r    r   r   r/   rB   r;   lendictr$   r   infor   r   )r   ZtwistOptionsr   r?   r   test_run~   s"    
zTwistTests.test_runc              	      s   |    g  G  fddd}| td| tg d | t| jd | t d |  d jt	| j
d tjttd |  d jd dS )	zy
        L{Twist.main} runs the runner with arguments corresponding to the given
        command line arguments.
        c                       s.   e Zd Zedd fddZddddZdS )z$TwistTests.test_main.<locals>.RunnerN)kwargsr   c                    s   || _ d| _ |  d S )Nr   )r>   runsr*   )r   rL   Zrunnersr   r   r=      s    z-TwistTests.test_main.<locals>.Runner.__init__r   c                 S   s   |  j d7  _ d S )NrD   )rM   r   r   r   r   rB      s    z(TwistTests.test_main.<locals>.Runner.run)__name__
__module____qualname__r   r=   rB   r   rN   r   r   r      s   r   rC   rD   r   rE   rF   N)r,   r    r   r   mainr;   rH   r)   r>   rI   r$   r   rJ   r   r   rM   )r   r   r   rN   r   	test_main   s"    		zTwistTests.test_main)rO   rP   rQ   __doc__r   r!   r   r,   r0   r6   r9   r<   rK   rS   r   r   r   r   r      s   r   c                   @   sH   e Zd ZdZddddZddddZdddd	Zddd
dZdS )TwistExitTestszr
    Tests to verify that the Twist script takes the expected actions related
    to signals and the reactor.
    Nr   c                    sJ   d _ td d fdd} td| td ddd} td	| d S )
NF)sigr   c                    s
   d _ dS )z
            Fake to capture whether L{twisted.application._exitWithSignal
            was called.

            @param sig: Signal value
            @type sig: C{int}
            TN)exitWithSignalCalled)rV   r   r   r   fakeExitWithSignal   s    z0TwistExitTests.setUp.<locals>.fakeExitWithSignalZ_exitWithSignal)r"   r   c                 S   s   dS )z
            Prevent Runner from adding new log observers or other
            tests outside this module will fail.

            @param _: Unused self param
            Nr   )r"   r   r   r   startLogging   s    z*TwistExitTests.setUp.<locals>.startLoggingrY   )rW   intr    r   r   )r   rX   rY   r   r   r   r      s
    
zTwistExitTests.setUpc                 C   s<   t  }d|_t }||d< t|d< t| | | j dS )zg
        _exitWithSignal is not called if the reactor's _exitSignal attribute
        is zero.
        Nr%   rG   )r
   _exitSignalr   r   r   rB   assertFalserW   r   r%   r/   r   r   r   %test_twistReactorDoesntExitWithSignal   s    
z4TwistExitTests.test_twistReactorDoesntExitWithSignalc                 C   s6   t  }t }||d< t|d< t| | | j dS )z
        _exitWithSignal is not called if the runner's reactor does not
        implement L{twisted.internet.interfaces._ISupportsExitSignalCapturing}
        r%   rG   N)r	   r   r   r   rB   r\   rW   r]   r   r   r   $test_twistReactorHasNoExitSignalAttr   s    
z3TwistExitTests.test_twistReactorHasNoExitSignalAttrc                 C   s<   t  }d|_t }||d< t|d< t| | | j dS )zb
        _exitWithSignal is called if the runner's reactor exits due
        to a signal.
        r   r%   rG   N)r
   r[   r   r   r   rB   r3   rW   r]   r   r   r    test_twistReactorExitsWithSignal   s    
z/TwistExitTests.test_twistReactorExitsWithSignal)rO   rP   rQ   rT   r   r^   r_   r`   r   r   r   r   rU      s
   rU   )%rT   sysr   typingr   r   r   Ztwisted.trial.unittestZtwistedZtwisted.internet.interfacesr   Ztwisted.loggerr   r   Ztwisted.test.proto_helpersr	   Ztwisted.test.test_twistdr
   Zrunner._exitr   Zrunner._runnerr   Zrunner.test.test_runnerr   r(   r   r   r-   r   Z_optionsr   r   ZtrialZunittestZTestCaser   rU   r   r   r   r   <module>   s"    $