Ë
    oj�  ã                   ó`  — 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    úK/usr/lib/python3/dist-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ˆŒ	Ø�
‰
”6˜6 4§9¡9Õ-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   ø€ Ü#“oˆGØ+2ˆD×"Ñ" 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à×Ñ˜TŸY™Y×-Ñ-¬z×/BÑ/BÔCØ×Ñ˜TŸY™Y×.Ñ.Ô/Ø�‰Ø�I‰I×Ñ×(Ñ(¨Ó3ô	
ð 	�‰Ø�I‰I×Ñ×&Ñ&Ø”|“~Ð&Ð'óõ	
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¸×8JÑ8JÓ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ˆà˜)Ñ$ˆØ×'Ñ'ˆ
ØÐ%Ð%Ð%Ü—-‘-Ø—?‘? :Ñ.Ø×&Ñ&ô
ˆð
 	×ÑÔ ä×Ñ˜7 GÔ,à×Ñ˜×+Ñ+¨g¨YÔ7Ø×ÑØ×Ñ˜XÑ& zÑ2°g×6IÑ6IÈ2ÈrÐ5RÐ4Sõ	
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   ø€ ¸H¿O¹OÈDÓ<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Ø�
‰
”6˜5Ñ"3Ô4ä—}‘}ÚFó
ˆô 	�	‰	�,Ôà×Ñœ˜X›¨Ô*Ø×ÑØ�Q‰KÜØ×.Ñ.¨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Ä   ø€ ð
 	×ÑÔ àˆ÷	ó 	ð 	�
‰
”6˜8 VÔ,ä�
‰
ÒMÔNà×Ñœ˜T×/Ñ/Ó0°!Ô4Ø×Ñœ˜W› qÔ)Ø×ÑØ�A‰J�O‰OÜØ×.Ñ.¨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   „ ñó
9ó2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3�W—]‘]×+Ñ+×4Ñ4õ D3r   