U
    n5{i�  ã                   @   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 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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)ÚMemoryReactor)ÚLogLevelÚjsonFileLogObserver)Ú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   úM/tmp/pip-unpacked-wheel-mnhg7r0q/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   Ú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Ú
subOptionsr4   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k	s(t‚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/   ÚbeforeÚshutdownr   )r   r/   Ú
subCommandÚAssertionErrorr(   r8   r9   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 dddd	g¡}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   rD   †   rE   r-   ú--reactor=defaultú--log-format=jsonr.   é   r   Údefault©r%   ZdefaultLogLevelZlogFileÚfileLogObserverFactoryN)r    r   r   r/   rF   r?   ÚlenÚdictr$   r   Úinfor   r	   )r   ZtwistOptionsr   rC   r   Útest_run~   s"    
ÿ
üþzTwistTests.test_runc              	      sœ   |   ¡  g ‰ G ‡ fdd„dƒ}|  td|¡ t ddddg¡ |  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   )rB   Úrunsr*   )r   rQ   ©Zrunnersr   r   rA   ¢   s    z-TwistTests.test_main.<locals>.Runner.__init__r   c                 S   s   |  j d7  _ d S )NrI   )rR   r   r   r   r   rF   §   s    z(TwistTests.test_main.<locals>.Runner.run)Ú__name__Ú
__module__Ú__qualname__r   rA   rF   r   rS   r   r   r   ¡   s   r   r-   rG   rH   r.   rI   r   rJ   rK   N)r,   r    r   r   Úmainr?   rM   r)   rB   rN   r$   r   rO   r   r	   rR   )r   r   r   rS   r   Ú	test_main˜   s"    	üþ	zTwistTests.test_main)rT   rU   rV   Ú__doc__r   r!   r   r,   r0   r7   r:   r@   rP   rX   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)r[   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>.startLoggingr^   )r\   Úintr    r   r   )r   r]   r^   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%   rL   )r
   Ú_exitSignalr   r	   r   rF   ÚassertFalser\   ©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%   rL   N)r   r   r	   r   rF   ra   r\   rb   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%   rL   N)r
   r`   r   r	   r   rF   r4   r\   rb   r   r   r   Ú test_twistReactorExitsWithSignalõ   s    
z/TwistExitTests.test_twistReactorExitsWithSignal)rT   rU   rV   rY   r   rc   rd   re   r   r   r   r   rZ   ¼   s
   rZ   )%rY   Úsysr   Útypingr   r   r   Ztwisted.trial.unittestZtwistedZtwisted.internet.interfacesr   Ztwisted.internet.testingr   Ztwisted.loggerr   r	   Ztwisted.test.test_twistdr
   Zrunner._exitr   Zrunner._runnerr   Zrunner.test.test_runnerr   r(   r   r   r-   r   Ú_optionsr   r   ZtrialZunittestZTestCaser   rZ   r   r   r   r   Ú<module>   s"    $