
    Vh                     `   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ej@                  jB                  jD                        Z# G d dej@                  jB                  jD                        Z$y)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                   `    e Zd ZdZddZddZddZddZddZddZ	dd	Z
dd
ZddZddZy)
TwistTestsz
    Tests for L{Twist}.
    Nc                 $    | j                          y N)patchInstallReactorselfs    Y/home/dcms/DCMS/lib/python3.12/site-packages/twisted/application/twist/test/test_twist.pysetUpzTwistTests.setUp   s      "    c                 d    t               | _        | j                  t        d| j                         y)zX
        Patch L{_twist.exit} so we can capture usage and prevent actual exits.
        exitN)r   r!   patchr   r   s    r   	patchExitzTwistTests.patchExit!   s!     K	

66499-r   c                 r     i  _         dt        dt        dt        f fd} j	                  t        d|       y)zo
        Patch C{_options.installReactor} so we can capture usage and prevent
        actual installs.
        _namereturnc                 :    t               }|j                  |<   |S r   )r   installedReactors)r%   r&   reactorr   s      r   installReactorz6TwistTests.patchInstallReactor.<locals>.installReactor/   s    #oG+2D""4(Nr   r+   N)r)   r   strr   r"   )r   r+   s   ` r   r   zTwistTests.patchInstallReactor(   s:    
 ;=	l 	# 	, 	
 	

<!1>Br   c                 ^     g  _         dt        ddf fd} j                  t        d|       y)zo
        Patch L{MultiService.startService} so we can capture usage and prevent
        actual starts.
        servicer'   Nc                 <    j                   j                  |        y r   )serviceStartsappend)r.   r   s    r   startServicez2TwistTests.patchStartService.<locals>.startService=   s    %%g.r   r2   )r0   r   r"   r   )r   r2   s   ` r   patchStartServicezTwistTests.patchStartService6   s2    
 .0	/( 	/t 	/ 	

<>r   c                 ^    t        j                  ddg      }| j                  |t               y)zI
        L{Twist.options} given valid arguments returns options.
        twistwebN)r   optionsassertIsInstancer   )r   r7   s     r   test_optionsValidArgumentsz%TwistTests.test_optionsValidArgumentsB   s'     --% 01g|4r   c                    | j                          t        j                  ddg       | j                  | j                  j
                  t        j                         | j                  | j                  j                         | j                  | j                  j                  j                  d             | j                  | j                  j                  j                  dt                             y)z
        L{Twist.options} given invalid arguments exits with
        L{ExitStatus.EX_USAGE} and an error/usage message.
        r5   z--bogus-bagelszError: z

N)r#   r   r7   assertIdenticalr!   statusr   EX_USAGEassertIsNotNonemessage
assertTrue
startswithendswithr   r   s    r   test_optionsInvalidArgumentsz'TwistTests.test_optionsInvalidArgumentsJ   s    
 	w 012TYY--z/B/BCTYY../II((3	
 	II&&|~&'	
r   c                     t        j                  ddg      }t        j                  |j                  d   |j                        }| j                  t        j                  |             y)z:
        L{Twist.service} returns an L{IService}.
        r5   r6   N)r   r7   r.   plugins
subOptionsr@   r   
providedBy)r   r7   r.   s      r   test_servicezTwistTests.test_service^   sM     --% 01-- 68J8JK++G45r   c                    t        j                  ddg      }|d   }|j                  }|J t        j                  |j                  |   |j
                        }| j                          t        j                  ||       | j                  | j                  |g       | j                  |j                  d   d   |j                  di fg       y)	z
        L{Twist.startService} starts the service and registers a trigger to
        stop the service when the reactor shuts down.
        r5   r6   r*   N)pluginr7   beforeshutdown )r   r7   
subCommandr.   rE   rF   r3   r2   assertEqualr0   triggersstopService)r   r7   r*   rN   r.   s        r   test_startServicezTwistTests.test_startServicef   s    
 --% 01)$''
%%%--??:.&&

 	 7G,++gY7X&z2g6I6I2r5R4S	
r   c           	         g | j                  t        dfd       | j                  t        dd        t        j                  g d      }t        j                  |       | j                  t              d       | j                  d   t        | j                  d   t        j                  t        t        	             y
)zi
        L{Twist.run} runs the runner with arguments corresponding to the given
        options.
        __init__c                 &    j                  |      S r   )r1   )r   argsargsSeens     r   <lambda>z%TwistTests.test_run.<locals>.<lambda>   s    HOOD<Q r   runc                      y r   rM   r   s    r   rX   z%TwistTests.test_run.<locals>.<lambda>       r   r5   z--reactor=defaultz--log-format=jsonr6      r   defaultr*   defaultLogLevellogFilefileLogObserverFactoryN)r"   r   r   r7   rY   rO   lendictr)   r	   infor   r
   )r   twistOptionsrW   s     @r   test_runzTwistTests.test_run~   s    
 

6:'QR

65"34}}F
 			,X*QK..y9 (':		
r   c           	         | j                          g  G fdd      }| j                  t        d|       t        j                  g d       | j                  t        | j                        d       | j                  t              d       | j                  d   j                  t        | j                  d   t        j                  t        t                     | j                  d   j                  d       y)	zy
        L{Twist.main} runs the runner with arguments corresponding to the given
        command line arguments.
        c                   *    e Zd Zdeddf fdZddZy)$TwistTests.test_main.<locals>.Runnerkwargsr'   Nc                 D    || _         d| _        j                  |        y )Nr   )rV   runsr1   )r   rk   runnerss     r   rT   z-TwistTests.test_main.<locals>.Runner.__init__   s    "		t$r   c                 .    | xj                   dz  c_         y )Nr]   )rm   r   s    r   rY   z(TwistTests.test_main.<locals>.Runner.run   s    		Q	r   r'   N)__name__
__module____qualname__r   rT   rY   )rn   s   r   r   rj      s    % % %
r   r   r\   r]   r   r^   r_   N)r3   r"   r   r   mainrO   rc   r0   rV   rd   r)   r	   re   r   r
   rm   )r   r   rn   s     @r   	test_mainzTwistTests.test_main   s    
 	 	 	 	

68V,

MNT//0!4Wq)AJOO..y9 (':		
 	!,r   rp   )rq   rr   rs   __doc__r   r#   r   r3   r9   rC   rH   rR   rg   ru   rM   r   r   r   r      s:    #.C
?5
(6
0
4!-r   r   c                   0    e Zd ZdZddZddZddZddZy)TwistExitTestszr
    Tests to verify that the Twist script takes the expected actions related
    to signals and the reactor.
    Nc                      d _         dt        dd f fd} j                  t        d|       dt        dd fd} j                  t        d|       y )	NFsigr'   c                     d_         y)z
            Fake to capture whether L{twisted.application._exitWithSignal
            was called.

            @param sig: Signal value
            @type sig: C{int}
            TN)exitWithSignalCalled)rz   r   s    r   fakeExitWithSignalz0TwistExitTests.setUp.<locals>.fakeExitWithSignal   s     )-D%r   _exitWithSignalr%   c                      y)z
            Prevent Runner from adding new log observers or other
            tests outside this module will fail.

            @param _: Unused self param
            NrM   )r%   s    r   startLoggingz*TwistExitTests.setUp.<locals>.startLogging   r[   r   r   )r|   intr"   r   r   )r   r}   r   s   `  r   r   zTwistExitTests.setUp   sW    $)!	-C 	-D 	- 	

6,.@A	F 	t 	 	

6><8r   c                     t               }d|_        t               }||d<   t        |d<   t	        j
                  |       | j                  | j                         y)zg
        _exitWithSignal is not called if the reactor's _exitSignal attribute
        is zero.
        Nr*   rb   )r   _exitSignalr   r
   r   rY   assertFalser|   r   r*   r7   s      r   %test_twistReactorDoesntExitWithSignalz4TwistExitTests.test_twistReactorDoesntExitWithSignal   sP    
 /0".$	,?()		'223r   c                     t               }t               }||d<   t        |d<   t        j                  |       | j                  | j                         y)z
        _exitWithSignal is not called if the runner's reactor does not
        implement L{twisted.internet.interfaces._ISupportsExitSignalCapturing}
        r*   rb   N)r   r   r
   r   rY   r   r|   r   s      r   $test_twistReactorHasNoExitSignalAttrz3TwistExitTests.test_twistReactorHasNoExitSignalAttr   sG    
  /.$	,?()		'223r   c                     t               }d|_        t               }||d<   t        |d<   t	        j
                  |       | j                  | j                         y)zb
        _exitWithSignal is called if the runner's reactor exits due
        to a signal.
        r   r*   rb   N)r   r   r   r
   r   rY   r@   r|   r   s      r    test_twistReactorExitsWithSignalz/TwistExitTests.test_twistReactorExitsWithSignal   sN    
 /0.$	,?()		'112r   rp   )rq   rr   rs   rv   r   r   r   r   rM   r   r   rx   rx      s    
924
43r   rx   )%rv   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   r5   r   _optionsr   r   trialunittestTestCaser   rx   rM   r   r   <module>r      sv     " "  4 2 8 A & $ 0 -  # `-''00 `-FD3W]]++44 D3r   