o
    Òó·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                   @   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   úoC:\Users\psant\Downloads\PAF backend\school\venv\Lib\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                    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   Ú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   Z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Ú
subOptionsr2   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.   ÚbeforeÚshutdownr   )r   r.   Ú
subCommandr'   r6   r7   r+   r*   ÚassertEqualr(   Ú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>…   s   
 z%TwistTests.test_run.<locals>.<lambda>Úrunc                 S   s   d S r   r   r   r   r   r   rB   †   ó    ©r,   z--reactor=defaultz--log-format=jsonr-   é   r   Údefault©r$   ZdefaultLogLevelZlogFileÚfileLogObserverFactoryN)r   r   r   r.   rC   r<   ÚlenÚdictr#   r   Úinfor   r	   )r   ZtwistOptionsr   rA   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   )r@   Úrunsr)   )r   rN   ©Úrunnersr   r   r?   ¢   s   z-TwistTests.test_main.<locals>.Runner.__init__c                 S   s   |  j d7  _ d S )NrF   )rO   r   r   r   r   rC   §   s   z(TwistTests.test_main.<locals>.Runner.run©r   N)Ú__name__Ú
__module__Ú__qualname__r   r?   rC   r   rP   r   r   r   ¡   s    r   rE   rF   r   rG   rH   N)r+   r   r   r   Úmainr<   rJ   r(   r@   rK   r#   r   rL   r   r	   rO   )r   r   r   rP   r   Ú	test_main˜   s"   	üþ	zTwistTests.test_mainrR   )rS   rT   rU   Ú__doc__r   r    r   r+   r/   r5   r8   r>   rM   rW   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)rZ   r   r   r   ÚfakeExitWithSignalÅ   s   
z0TwistExitTests.setUp.<locals>.fakeExitWithSignalZ_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Ñ   rD   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$   rI   )r
   Ú_exitSignalr   r	   r   rC   Ú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$   rI   N)r   r   r	   r   rC   r`   r[   ra   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$   rI   N)r
   r_   r   r	   r   rC   r2   r[   ra   r   r   r   Ú test_twistReactorExitsWithSignalõ   s   
z/TwistExitTests.test_twistReactorExitsWithSignalrR   )rS   rT   rU   rX   r   rb   rc   rd   r   r   r   r   rY   ¼   s    


rY   )%rX   Ú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   rY   r   r   r   r   Ú<module>   s$    $