Ë
    oj¨,  ã                   ó.  — d Z ddlmZmZ ddlmZmZmZ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 ddlmZ dd	lmZmZ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% ddl%m&Z&  G d„ dejN                  jP                  jR                  «      Z*y)z2
Tests for L{twisted.application.twist._options}.
é    )ÚstderrÚstdout)ÚCallableÚDictÚListÚOptionalÚTextIOÚTupleN)Úversion)Úreactor)ÚIReactorCore)ÚMemoryReactor)ÚFileLogObserverÚLogLevelÚjsonFileLogObserverÚtextFileLogObserver)Ú
UsageErroré   )ÚNoSuchReactor)Ú
ExitStatus)Ú	DummyExit)ÚServiceMaker)Ú_optionsé   )ÚTwistOptionsc                   ó  — 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d$d„Zdededdfd„Zd$d„Zd$d„Zd$d„Zd$d„Zdedeegef   ddf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"d$d#„Z#y)%ÚOptionsTestsz$
    Tests for L{TwistOptions}.
    ÚreturnNc                 ó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   ©Úselfs    úM/usr/lib/python3/dist-packages/twisted/application/twist/test/test_options.pyÚ	patchExitzOptionsTests.patchExit$   s!   € ô “KˆŒ	Ø�
‰
”8˜V T§Y¡YÕ/ó    c                 ó‚   ‡ — g ‰ _         ddt        dt        t           dt        fˆ fd„}‰ j	                  t
        d|«       y)zZ
        Patch L{_options.open} so we can capture usage and prevent actual opens.
        NÚnameÚmoder   c                 ón   •— | dk(  rt        d d | «      ‚‰j                  j                  | |f«       t        S )NÚ	nocanopen)ÚOSErrorÚopenedÚappendÚNotImplemented)r(   r)   r#   s     €r$   ÚfakeOpenz(OptionsTests.patchOpen.<locals>.fakeOpen1   s6   ø€ Ø�{Ò"Ü˜d D¨$Ó/Ð/à�K‰K×Ñ  d˜|Ô,Ü!Ð!r&   ÚopenFile)N)r-   Ústrr   r	   r!   r   )r#   r0   s   ` r$   Ú	patchOpenzOptionsTests.patchOpen+   s<   ø€ ð 8:ˆŒñ	"œ3ð 	"¤h¬s¡mð 	"¼võ 	"ð 	�
‰
”8˜Z¨Õ2r&   c                 óf   ‡ — i ‰ _         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.
        r(   r   c                 óX   •— | dk7  r
t        «       ‚t        «       }|‰j                  | <   |S )NÚfusion)r   r   ÚinstalledReactors)r(   r   r#   s     €r$   ÚinstallReactorz8OptionsTests.patchInstallReactor.<locals>.installReactorA   s/   ø€ Ø�xÒÜ#“oÐ%ä#“oˆGØ+2ˆD×"Ñ" 4Ñ(ØˆNr&   r8   N)r7   r2   r   r!   r   )r#   r8   s   ` r$   ÚpatchInstallReactorz OptionsTests.patchInstallReactor:   s3   ø€ ð
 ;=ˆÔð	¤ð 	¬õ 	ð 	�
‰
”8Ð-¨~Õ>r&   c                 ót   — t        «       }| j                  |j                  «       j                  d«      «       y)z@
        L{TwistOptions.getSynopsis} appends arguments.
        z plugin [plugin_options]N)r   Ú
assertTrueÚgetSynopsisÚendswith©r#   Úoptionss     r$   Útest_synopsiszOptionsTests.test_synopsisK   s,   € ô “.ˆà�‰˜×+Ñ+Ó-×6Ñ6Ð7QÓRÕSr&   c                 ó  — | j                  «        t        «       }|j                  «        | j                  | j                  j
                  t        j                  «       | j                  | j                  j                  t        «       y)zl
        L{TwistOptions.opt_version} exits with L{ExitStatus.EX_OK} and prints
        the version.
        N)
r%   r   Úopt_versionÚassertEqualsr    Ústatusr   ÚEX_OKÚmessager   r>   s     r$   Útest_versionzOptionsTests.test_versionS   s[   € ð
 	�‰Ôä“.ˆØ×ÑÔà×Ñ˜$Ÿ)™)×*Ñ*¬J×,<Ñ,<Ô=Ø×Ñ˜$Ÿ)™)×+Ñ+¬WÕ5r&   c                 óÐ   — | j                  «        t        «       }|j                  d«       | j                  t	        | j
                  «      dh«       | j                  |d   d«       y)zo
        L{TwistOptions.installReactor} installs the chosen reactor and sets
        the reactor name.
        r6   ÚreactorNameN)r9   r   Úopt_reactorÚassertEqualÚsetr7   rC   r>   s     r$   Útest_reactorzOptionsTests.test_reactor`   sW   € ð
 	× Ñ Ô"ä“.ˆØ×Ñ˜HÔ%à×Ñœ˜T×3Ñ3Ó4°x°jÔAØ×Ñ˜' -Ñ0°(Õ;r&   c                 ó¶   — | j                  «        t        «       }d|_        |j                  dg«       | j	                  t        | j                  «      dh«       y)z…
        L{TwistOptions.installReactor} installs the chosen reactor after the
        command line options have been parsed.
        ztest-subcommandz--reactor=fusionr6   N)r9   r   Ú
subCommandÚparseOptionsrK   rL   r7   r>   s     r$   Útest_installCorrectReactorz'OptionsTests.test_installCorrectReactorm   sN   € ð
 	× Ñ Ô"ä“.ˆØ.ˆÔØ×ÑÐ0Ð1Ô2à×Ñœ˜T×3Ñ3Ó4°x°jÕAr&   c                 óz   — | j                  «        t        «       }| j                  t        |j                  d«       y)zn
        L{TwistOptions.installReactor} raises UsageError if an unknown reactor
        is specified.
        ÚcoalN)r9   r   ÚassertRaisesr   rJ   r>   s     r$   Útest_installReactorBogusz%OptionsTests.test_installReactorBogusz   s/   € ð
 	× Ñ Ô"ä“.ˆØ×Ñœ* g×&9Ñ&9¸6ÕBr&   c                 ób   — t        «       }| j                  t        |j                  d«      «       y)zŒ
        L{TwistOptions.installReactor} returns the currently installed reactor
        when the default reactor name is specified.
        ÚdefaultN)r   ÚassertIdenticalr   r8   r>   s     r$   Útest_installReactorDefaultz'OptionsTests.test_installReactorDefault„   s&   € ô
 “.ˆØ×ÑœW g×&<Ñ&<¸YÓ&GÕHr&   c                 ó€   — t        «       }|j                  d«       | j                  |d   t        j                  «       y)zQ
        L{TwistOptions.opt_log_level} sets the corresponding log level.
        ÚwarnÚlogLevelN)r   Úopt_log_levelrX   r   r[   r>   s     r$   Útest_logLevelValidzOptionsTests.test_logLevelValidŒ   s2   € ô “.ˆØ×Ñ˜fÔ%à×Ñ˜W ZÑ0´(·-±-Õ@r&   c                 óZ   — t        «       }| j                  t        |j                  d«       y)zi
        L{TwistOptions.opt_log_level} with an invalid log level name raises
        UsageError.
        ÚcheeseN)r   rT   r   r]   r>   s     r$   Útest_logLevelInvalidz!OptionsTests.test_logLevelInvalid•   s#   € ô
 “.ˆà×Ñœ* g×&;Ñ&;¸XÕFr&   r(   ÚexpectedStreamc                 ód   — t        «       }|j                  |«       | j                  |d   |«       y)z©
        Set log file name and check the selected output stream.

        @param name: The name of the file.
        @param expectedStream: The expected stream.
        ÚlogFileN)r   Úopt_log_filerX   )r#   r(   rb   r?   s       r$   Ú_testLogFilezOptionsTests._testLogFilež   s.   € ô “.ˆØ×Ñ˜TÔ"à×Ñ˜W YÑ/°Õ@r&   c                 ó0   — | j                  dt        «       y)zW
        L{TwistOptions.opt_log_file} given C{"-"} as a file name uses stdout.
        ú-N)rf   r   r"   s    r$   Útest_logFileStdoutzOptionsTests.test_logFileStdoutª   ó   € ð 	×Ñ˜#œvÕ&r&   c                 ó0   — | j                  dt        «       y)zW
        L{TwistOptions.opt_log_file} given C{"+"} as a file name uses stderr.
        ú+N)rf   r   r"   s    r$   Útest_logFileStderrzOptionsTests.test_logFileStderr°   rj   r&   c                 ó”   — | j                  «        t        «       }|j                  d«       | j                  dg| j                  «       y)zX
        L{TwistOptions.opt_log_file} opens the given file name in append mode.
        Úmylog)ro   ÚaN)r3   r   re   rK   r-   r>   s     r$   Útest_logFileNamedzOptionsTests.test_logFileNamed¶   s:   € ð 	�‰Ôä“.ˆØ×Ñ˜WÔ%à×Ñ˜.Ð)¨4¯;©;Õ7r&   c                 ó”  — | j                  «        | j                  «        t        «       }|j                  d«       | j	                  | j
                  j                  t        j                  «       | j                  | j
                  j                  «       | j                  | j
                  j                  j                  d«      «       y)z–
        L{TwistOptions.opt_log_file} exits with L{ExitStatus.EX_IOERR} if
        unable to open the log file due to an L{EnvironmentError}.
        r+   z%Unable to open log file 'nocanopen': N)r%   r3   r   re   rC   r    rD   r   ÚEX_IOERRÚassertIsNotNonerF   r;   Ú
startswithr>   s     r$   Útest_logFileCantOpenz!OptionsTests.test_logFileCantOpenÁ   sŒ   € ð
 	�‰ÔØ�‰Ôä“.ˆØ×Ñ˜[Ô)à×Ñ˜$Ÿ)™)×*Ñ*¬J×,?Ñ,?Ô@Ø×Ñ˜TŸY™Y×.Ñ.Ô/Ø�‰Ø�I‰I×Ñ×(Ñ(Ø7óõ	
r&   ÚformatÚexpectedObserverFactoryc                 óŽ   — t        «       }|j                  |«       | j                  |d   |«       | j                  |d   |«       y)zÅ
        Set log file format and check the selected observer factory.

        @param format: The format of the file.
        @param expectedObserverFactory: The expected observer factory.
        ÚfileLogObserverFactoryÚ	logFormatN)r   Úopt_log_formatrX   rK   )r#   rw   rx   r?   s       r$   Ú_testLogFormatzOptionsTests._testLogFormatÔ   sE   € ô “.ˆØ×Ñ˜vÔ&à×Ñ˜WÐ%=Ñ>Ð@WÔXØ×Ñ˜ Ñ-¨vÕ6r&   c                 ó0   — | j                  dt        «       y)úg
        L{TwistOptions.opt_log_format} given C{"text"} uses a
        L{textFileLogObserver}.
        ÚtextN)r}   r   r"   s    r$   Útest_logFormatTextzOptionsTests.test_logFormatTextã   ó   € ð
 	×Ñ˜FÔ$7Õ8r&   c                 ó0   — | j                  dt        «       y)r   ÚjsonN)r}   r   r"   s    r$   Útest_logFormatJSONzOptionsTests.test_logFormatJSONê   r‚   r&   c                 óZ   — t        «       }| j                  t        |j                  d«       y)zk
        L{TwistOptions.opt_log_format} given an invalid format name raises
        L{UsageError}.
        ÚfrommageN)r   rT   r   r|   r>   s     r$   Útest_logFormatInvalidz"OptionsTests.test_logFormatInvalidñ   s#   € ô
 “.ˆà×Ñœ* g×&<Ñ&<¸jÕIr&   c                 óø   — | j                  «        t        «       }|j                  d«       |j                  d«       |j	                  «        | j                  |d   t        «       | j                  |d   d«       y)úr
        L{TwistOptions.selectDefaultLogObserver} will not override an already
        selected observer.
        r€   Úquesorz   r{   N)r3   r   r|   re   ÚselectDefaultLogObserverrX   r   rK   r>   s     r$   Ú'test_selectDefaultLogObserverNoOverridez4OptionsTests.test_selectDefaultLogObserverNoOverrideú   sk   € ð
 	�‰Ôä“.ˆØ×Ñ˜vÔ&Ø×Ñ˜WÔ%Ø×(Ñ(Ô*ð 	×Ñ˜WÐ%=Ñ>Ô@SÔTØ×Ñ˜ Ñ-¨vÕ6r&   c                 ó  —  G d„ d«      }| j                  t        d |«       «       t        «       }|j                  d«       |j	                  «        | j                  |d   t        «       | j                  |d   d«       y)	rŠ   c                   ó   — e Zd Zdefd„Zy)úIOptionsTests.test_selectDefaultLogObserverDefaultWithTTY.<locals>.TTYFiler   c                  ó   — y)NT© r"   s    r$   ÚisattyzPOptionsTests.test_selectDefaultLogObserverDefaultWithTTY.<locals>.TTYFile.isatty  s   € Ør&   N)Ú__name__Ú
__module__Ú__qualname__Úboolr“   r’   r&   r$   ÚTTYFiler�     s   „ ð ô r&   r˜   r   rh   rz   r{   r€   N)r!   r   r   re   rŒ   rX   r   rK   )r#   r˜   r?   s      r$   Ú+test_selectDefaultLogObserverDefaultWithTTYz8OptionsTests.test_selectDefaultLogObserverDefaultWithTTY  sm   € ÷	ñ 	ð
 	�
‰
”8˜X¡w£yÔ1ä“.ˆØ×Ñ˜SÔ!Ø×(Ñ(Ô*à×Ñ˜WÐ%=Ñ>Ô@SÔTØ×Ñ˜ Ñ-¨vÕ6r&   c                 óÖ   — | j                  «        t        «       }|j                  d«       |j                  «        | j	                  |d   t
        «       | j                  |d   d«       y)rŠ   r‹   rz   r{   r„   N)r3   r   re   rŒ   rX   r   rK   r>   s     r$   Ú.test_selectDefaultLogObserverDefaultWithoutTTYz;OptionsTests.test_selectDefaultLogObserverDefaultWithoutTTY  s[   € ð
 	�‰Ôä“.ˆØ×Ñ˜WÔ%Ø×(Ñ(Ô*à×Ñ˜WÐ%=Ñ>Ô@SÔTØ×Ñ˜ Ñ-¨vÕ6r&   c                 óœ   — t        «       }|j                  }|D ]1  }| j                  |t        «       | j                  ||   t        «       Œ3 y)zM
        L{TwistOptions.plugins} is a mapping of available plug-ins.
        N)r   ÚpluginsÚassertIsInstancer2   r   )r#   r?   r�   r(   s       r$   Útest_pluginsTypezOptionsTests.test_pluginsType-  sG   € ô “.ˆØ—/‘/ˆàò 	?ˆDØ×!Ñ! $¬Ô,Ø×!Ñ! '¨$¡-´Õ>ñ	?r&   c                 óP   — t        «       }| j                  d|j                  «       y)zÜ
        L{TwistOptions.plugins} includes a C{"web"} plug-in.
        This is an attempt to verify that something we expect to be in the list
        is in there without enumerating all of the built-in plug-ins.
        ÚwebN)r   ÚassertInr�   r>   s     r$   Útest_pluginsIncludeWebz#OptionsTests.test_pluginsIncludeWeb8  s   € ô “.ˆà�‰�e˜WŸ_™_Õ-r&   c                 óô   — t        «       }|j                  D ]_  \  }}}}| j                  |t        «       | j	                  |d«       | j                  t        |«      «       | j                  |t        «       Œa y)z~
        L{TwistOptions.subCommands} is an iterable of tuples as expected by
        L{twisted.python.usage.Options}.
        N)r   ÚsubCommandsrž   r2   rX   r;   Úcallable)r#   r?   r(   ÚshortcutÚparserÚdocs         r$   Útest_subCommandsTypez!OptionsTests.test_subCommandsTypeB  sj   € ô
 “.ˆà+2×+>Ñ+>ò 	,Ñ'ˆD�(˜F CØ×!Ñ! $¬Ô,Ø× Ñ  ¨4Ô0Ø�O‰OœH VÓ,Ô-Ø×!Ñ! #¤sÕ+ñ		,r&   c           
      ó¾   — t        «       }t        |j                  «      }|j                  D ����ch c]	  \  }}}}|’Œ }}}}}| j	                  ||«       yc c}}}}w )zW
        L{TwistOptions.subCommands} includes a sub-command for every plug-in.
        N)r   rL   r�   r¥   rK   )r#   r?   r�   r(   r§   r¨   r©   r¥   s           r$   Útest_subCommandsIncludeWebz'OptionsTests.test_subCommandsIncludeWebO  sT   € ô “.ˆä�g—o‘oÓ&ˆØ?F×?RÑ?R×SÑSÑ ;  h°¸’tÐSˆÓSà×Ñ˜ gÕ.ùõ Ts   ±A
c                 óx   — | j                  «        t        «       }| j                  t        |j                  «       y)zd
        L{TwistOptions.postOptions} raises L{UsageError} is it has no
        sub-command.
        N)r9   r   rT   r   ÚpostOptionsr>   s     r$   Útest_postOptionsNoSubCommandz)OptionsTests.test_postOptionsNoSubCommandZ  s-   € ð
 	× Ñ Ô"ä“.ˆà×Ñœ* g×&9Ñ&9Õ:r&   )r   N)$r”   r•   r–   Ú__doc__r%   r3   r9   r@   rG   rM   rQ   rU   rY   r^   ra   r2   r	   rf   ri   rm   rq   rv   r   r   r}   r�   r…   rˆ   r�   r™   r›   rŸ   r£   rª   r¬   r¯   r’   r&   r$   r   r      s×   „ ñó0ó3ó?ó"Tó6ó<óBóCóIóAóGð
A ð 
A°fð 
AÀó 
Aó'ó'ó	8ó
ð&7Øð7Ø4<¸f¸XÀÐ=VÑ4Wð7à	ó7ó9ó9óJó7ó"7ó(7ó	?ó.ó,ó	/ô	;r&   r   )+r°   Úsysr   r   Útypingr   r   r   r   r	   r
   Útwisted.trial.unittestÚtwistedÚtwisted.copyrightr   Útwisted.internetr   Útwisted.internet.interfacesr   Útwisted.internet.testingr   Útwisted.loggerr   r   r   r   Útwisted.python.usager   Úreactorsr   Úrunner._exitr   Úrunner.test.test_runnerr   Úservicer   Útwistr   r   ÚtrialÚunittestÚTestCaser   r’   r&   r$   ú<module>rÃ      sc   ðñ÷ ß @× @ã Ý %Ý $Ý 4Ý 2÷ó õ ,Ý %Ý &Ý 0Ý #Ý Ý #ôD;�7—=‘=×)Ñ)×2Ñ2õ D;r&   