o
    ¯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                   @   st   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S )Ú
TwistTestsz
    Tests for L{Twist}.
    ÚreturnNc                 C   s   |   ¡  d S ©N)ÚpatchInstallReactor©Úself© r   úK/usr/lib/python3/dist-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                    s2   i ˆ _ dtdtdtf‡ 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 ˆ _ dtddf‡ fdd„}ˆ  td|¡ dS )zo
        Patch L{MultiService.startService} so we can capture usage and prevent
        actual starts.
        Úservicer   Nc                    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   ÚoptionsÚ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.   ÚassertIdenticalr   Ústatusr   ÚEX_USAGEÚ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Ú
subOptionsr6   r   Ú
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)Úpluginr.   ÚbeforeÚshutdownr   )r   r.   Ú
subCommandr'   r:   r;   r+   r*   ÚassertEqualr(   ÚtriggersÚstopService)r   r.   r$   rA   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©ÚargsSeenr   r   Ú<lambda>…   s   
 z%TwistTests.test_run.<locals>.<lambda>Úrunc                 S   s   d S r   r   r   r   r   r   rJ   †   ó    ©r,   z--reactor=defaultz--log-format=jsonr-   é   r   Údefault©r$   ÚdefaultLogLevelÚlogFileÚfileLogObserverFactoryN)r   r   r   r.   rK   rB   ÚlenÚdictr#   r   Úinfor   r   )r   ÚtwistOptionsr   rH   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deddf‡ fdd„Zddd„ZdS )	z$TwistTests.test_main.<locals>.RunnerÚkwargsr   Nc                    s   || _ d| _ˆ  | ¡ d S )Nr   )rG   Úrunsr)   )r   rY   ©Úrunnersr   r   rF   ¢   s   z-TwistTests.test_main.<locals>.Runner.__init__c                 S   s   |  j d7  _ d S )NrN   )rZ   r   r   r   r   rK   §   s   z(TwistTests.test_main.<locals>.Runner.run©r   N)Ú__name__Ú
__module__Ú__qualname__r   rF   rK   r   r[   r   r   r   ¡   s    r   rM   rN   r   rO   rP   N)r+   r   r   r   ÚmainrB   rT   r(   rG   rU   r#   r   rV   r   r   rZ   )r   r   r   r[   r   Ú	test_main˜   s"   	üþ	zTwistTests.test_mainr]   )r^   r_   r`   Ú__doc__r   r    r   r+   r0   r9   r=   rE   rX   rb   r   r   r   r   r      s    








r   c                   @   s8   e Zd ZdZddd„Zddd„Zddd	„Zdd
d„ZdS )ÚTwistExitTestszr
    Tests to verify that the Twist script takes the expected actions related
    to signals and the reactor.
    r   Nc                    sN   dˆ _ dtdd f‡ fdd„}ˆ  td|¡ dtdd f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)re   r   r   r   ÚfakeExitWithSignalÅ   s   
z0TwistExitTests.setUp.<locals>.fakeExitWithSignalÚ_exitWithSignalr!   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Ñ   rL   z*TwistExitTests.setUp.<locals>.startLoggingri   )rf   Úintr   r   r   )r   rg   ri   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$   rS   )r
   Ú_exitSignalr   r   r   rK   ÚassertFalserf   ©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$   rS   N)r	   r   r   r   rK   rl   rf   rm   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$   rS   N)r
   rk   r   r   r   rK   r6   rf   rm   r   r   r   Ú test_twistReactorExitsWithSignalõ   s   
z/TwistExitTests.test_twistReactorExitsWithSignalr]   )r^   r_   r`   rc   r   rn   ro   rp   r   r   r   r   rd   ¼   s    


rd   )%rc   Úsysr   Útypingr   r   r   Útwisted.trial.unittestÚtwistedÚtwisted.internet.interfacesr   Útwisted.loggerr   r   Útwisted.test.proto_helpersr	   Útwisted.test.test_twistdr
   Úrunner._exitr   Úrunner._runnerr   Úrunner.test.test_runnerr   r'   r   r   r,   r   Ú_optionsr   r   ÚtrialÚunittestÚTestCaser   rd   r   r   r   r   Ú<module>   s$    $