o
    >h                     @   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   /var/www/vedio/testing/chatpythonscript.ninositsolution.com/env/lib/python3.10/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   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.internet.testingr   twisted.loggerr   r	   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$    $