§
    Ètºf¨,  ã                   ó  — 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j'        j(        j)        ¦  «        Z*dS )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#dS )%ÚOptionsTestsz$
    Tests for L{TwistOptions}.
    ÚreturnNc                 ón   — t          ¦   «         | _        |                      t          d| j        ¦  «         dS )zX
        Patch L{_twist.exit} so we can capture usage and prevent actual exits.
        ÚexitN)r   r    Úpatchr   ©Úselfs    új/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/twisted/application/twist/test/test_options.pyÚ	patchExitzOptionsTests.patchExit$   s-   € õ ‘K”KˆŒ	Ø�
Š
•8˜V T¤YÑ/Ô/Ð/Ð/Ð/ó    c                 óœ   ‡ — g ‰ _         ddt          dt          t                   dt          fˆ fd„}‰                      t
          d|¦  «         dS )zZ
        Patch L{_options.open} so we can capture usage and prevent actual opens.
        NÚnameÚmoder   c                 óx   •— | dk    rt          d d | ¦  «        ‚‰j                             | |f¦  «         t          S )NÚ	nocanopen)ÚOSErrorÚopenedÚappendÚNotImplemented)r(   r)   r#   s     €r$   ÚfakeOpenz(OptionsTests.patchOpen.<locals>.fakeOpen1   s@   ø€ Ø�{Ò"Ð"Ý˜d D¨$Ñ/Ô/Ð/àŒK×Ò  d˜|Ñ,Ô,Ð,Ý!Ð!r&   ÚopenFile)N)r-   Ústrr   r	   r!   r   )r#   r0   s   ` r$   Ú	patchOpenzOptionsTests.patchOpen+   sf   ø€ ð 8:ˆŒð	"ð 	"�3ð 	"¥h­s¤mð 	"½vð 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	�
Š
•8˜Z¨Ñ2Ô2Ð2Ð2Ð2r&   c                 óv   ‡ — i ‰ _         dt          dt          fˆ fd„}‰                      t          d|¦  «         dS )zo
        Patch C{_options.installReactor} so we can capture usage and prevent
        actual installs.
        r(   r   c                 ó`   •— | dk    rt          ¦   «         ‚t          ¦   «         }|‰j        | <   |S )NÚfusion)r   r   ÚinstalledReactors)r(   r   r#   s     €r$   ÚinstallReactorz8OptionsTests.patchInstallReactor.<locals>.installReactorA   s3   ø€ Ø�xÒÐÝ#‘o”oÐ%å#‘o”oˆGØ+2ˆDÔ" 4Ñ(ØˆNr&   r8   N)r7   r2   r   r!   r   )r#   r8   s   ` r$   ÚpatchInstallReactorz OptionsTests.patchInstallReactor:   sX   ø€ ð
 ;=ˆÔð	¥ð 	­ð 	ð 	ð 	ð 	ð 	ð 	ð 	�
Š
•8Ð-¨~Ñ>Ô>Ð>Ð>Ð>r&   c                 ó–   — t          ¦   «         }|                      |                     ¦   «                              d¦  «        ¦  «         dS )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ÔRÑSÔSÐSÐSÐSr&   c                 ó  — |                       ¦   «          t          ¦   «         }|                     ¦   «          |                      | j        j        t          j        ¦  «         |                      | j        j        t          ¦  «         dS )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   sn   € ð
 	�ŠÑÔÐå‘.”.ˆØ×ÒÑÔÐà×Ò˜$œ)Ô*­JÔ,<Ñ=Ô=Ð=Ø×Ò˜$œ)Ô+­WÑ5Ô5Ð5Ð5Ð5r&   c                 óþ   — |                       ¦   «          t          ¦   «         }|                     d¦  «         |                      t	          | j        ¦  «        dh¦  «         |                      |d         d¦  «         dS )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Ñ4Ô4°x°jÑAÔAÐAØ×Ò˜' -Ô0°(Ñ;Ô;Ð;Ð;Ð;r&   c                 óÖ   — |                       ¦   «          t          ¦   «         }d|_        |                     dg¦  «         |                      t          | j        ¦  «        dh¦  «         dS )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   sh   € ð
 	× Ò Ñ"Ô"Ð"å‘.”.ˆØ.ˆÔØ×ÒÐ0Ð1Ñ2Ô2Ð2à×Ò�˜TÔ3Ñ4Ô4°x°jÑAÔAÐAÐAÐAr&   c                 óŒ   — |                       ¦   «          t          ¦   «         }|                      t          |j        d¦  «         dS )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¸6ÑBÔBÐBÐBÐBr&   c                 ó~   — t          ¦   «         }|                      t          |                     d¦  «        ¦  «         dS )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„   s7   € õ
 ‘.”.ˆØ×Ò�W g×&<Ò&<¸YÑ&GÔ&GÑHÔHÐHÐHÐHr&   c                 ó˜   — t          ¦   «         }|                     d¦  «         |                      |d         t          j        ¦  «         dS )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Œ   sD   € õ ‘.”.ˆØ×Ò˜fÑ%Ô%Ð%à×Ò˜W ZÔ0µ(´-Ñ@Ô@Ð@Ð@Ð@r&   c                 ód   — t          ¦   «         }|                      t          |j        d¦  «         dS )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ÑFÔFÐFÐFÐFr&   r(   ÚexpectedStreamc                 ó„   — t          ¦   «         }|                     |¦  «         |                      |d         |¦  «         dS )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ž   sB   € õ ‘.”.ˆØ×Ò˜TÑ"Ô"Ð"à×Ò˜W YÔ/°Ñ@Ô@Ð@Ð@Ð@r&   c                 ó<   — |                       dt          ¦  «         dS )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                 ó<   — |                       dt          ¦  «         dS )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                 ó¬   — |                       ¦   «          t          ¦   «         }|                     d¦  «         |                      dg| j        ¦  «         dS )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¶   sR   € ð 	�ŠÑÔÐå‘.”.ˆØ×Ò˜WÑ%Ô%Ð%à×Ò˜.Ð)¨4¬;Ñ7Ô7Ð7Ð7Ð7r&   c                 ó’  — |                       ¦   «          |                      ¦   «          t          ¦   «         }|                     d¦  «         |                      | j        j        t          j        ¦  «         |  	                    | j        j
        ¦  «         |                      | j        j
                             d¦  «        ¦  «         dS )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Ô.Ñ/Ô/Ð/Ø�ŠØŒIÔ×(Ò(Ø7ñô ñ	
ô 	
ð 	
ð 	
ð 	
r&   ÚformatÚexpectedObserverFactoryc                 ó¼   — t          ¦   «         }|                     |¦  «         |                      |d         |¦  «         |                      |d         |¦  «         dS )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Ô   s_   € õ ‘.”.ˆØ×Ò˜vÑ&Ô&Ð&à×Ò˜WÐ%=Ô>Ð@WÑXÔXÐXØ×Ò˜ Ô-¨vÑ6Ô6Ð6Ð6Ð6r&   c                 ó<   — |                       dt          ¦  «         dS )ú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Ñ8Ô8Ð8Ð8Ð8r&   c                 ó<   — |                       dt          ¦  «         dS )r   ÚjsonN)r}   r   r"   s    r$   Útest_logFormatJSONzOptionsTests.test_logFormatJSONê   r‚   r&   c                 ód   — t          ¦   «         }|                      t          |j        d¦  «         dS )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ÑIÔIÐIÐIÐIr&   c                 ó@  — |                       ¦   «          t          ¦   «         }|                     d¦  «         |                     d¦  «         |                     ¦   «          |                      |d         t          ¦  «         |                      |d         d¦  «         dS )ú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ú   s—   € ð
 	�ŠÑÔÐå‘.”.ˆØ×Ò˜vÑ&Ô&Ð&Ø×Ò˜WÑ%Ô%Ð%Ø×(Ò(Ñ*Ô*Ð*ð 	×Ò˜WÐ%=Ô>Õ@SÑTÔTÐTØ×Ò˜ Ô-¨vÑ6Ô6Ð6Ð6Ð6r&   c                 óP  —  G d„ d¦  «        }|                       t          d |¦   «         ¦  «         t          ¦   «         }|                     d¦  «         |                     ¦   «          |                      |d         t          ¦  «         |                      |d         d¦  «         dS )	rŠ   c                   ó   — e Zd Zdefd„ZdS )úIOptionsTests.test_selectDefaultLogObserverDefaultWithTTY.<locals>.TTYFiler   c                 ó   — dS )NT© r"   s    r$   ÚisattyzPOptionsTests.test_selectDefaultLogObserverDefaultWithTTY.<locals>.TTYFile.isatty  s   € Ø�tr&   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  sµ   € ð	ð 	ð 	ð 	ð 	ñ 	ô 	ð 	ð
 	�
Š
•8˜X w w¡y¤yÑ1Ô1Ð1å‘.”.ˆØ×Ò˜SÑ!Ô!Ð!Ø×(Ò(Ñ*Ô*Ð*à×Ò˜WÐ%=Ô>Õ@SÑTÔTÐTØ×Ò˜ Ô-¨vÑ6Ô6Ð6Ð6Ð6r&   c                 ó  — |                       ¦   «          t          ¦   «         }|                     d¦  «         |                     ¦   «          |                      |d         t
          ¦  «         |                      |d         d¦  «         dS )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ÔTÐTØ×Ò˜ Ô-¨vÑ6Ô6Ð6Ð6Ð6r&   c                 ó²   — t          ¦   «         }|j        }|D ]>}|                      |t          ¦  «         |                      ||         t          ¦  «         Œ?dS )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-  s`   € õ ‘.”.ˆØ”/ˆàð 	?ð 	?ˆDØ×!Ò! $­Ñ,Ô,Ð,Ø×!Ò! '¨$¤-µÑ>Ô>Ð>Ð>ð	?ð 	?r&   c                 óX   — t          ¦   «         }|                      d|j        ¦  «         dS )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 ]u\  }}}}|                      |t          ¦  «         |                      |d¦  «         |                      t          |¦  «        ¦  «         |                      |t          ¦  «         ŒvdS )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  s‘   € õ
 ‘.”.ˆà+2Ô+>ð 	,ð 	,Ñ'ˆD�(˜F CØ×!Ò! $­Ñ,Ô,Ð,Ø× Ò  ¨4Ñ0Ô0Ð0Ø�OŠO�H VÑ,Ô,Ñ-Ô-Ð-Ø×!Ò! #¥sÑ+Ô+Ð+Ð+ð		,ð 	,r&   c                 ó˜   — t          ¦   «         }t          |j        ¦  «        }d„ |j        D ¦   «         }|                      ||¦  «         dS )zW
        L{TwistOptions.subCommands} includes a sub-command for every plug-in.
        c                 ó   — h | ]	\  }}}}|’Œ
S r’   r’   )Ú.0r(   r§   r¨   r©   s        r$   ú	<setcomp>z:OptionsTests.test_subCommandsIncludeWeb.<locals>.<setcomp>V  s!   € ÐSÐSÐSÑ ;  h°¸�tÐSÐSÐSr&   N)r   rL   r�   r¥   rK   )r#   r?   r�   r¥   s       r$   Útest_subCommandsIncludeWebz'OptionsTests.test_subCommandsIncludeWebO  sN   € õ ‘.”.ˆå�g”oÑ&Ô&ˆØSÐS¸wÔ?RÐSÑSÔSˆà×Ò˜ gÑ.Ô.Ð.Ð.Ð.r&   c                 óŠ   — |                       ¦   «          t          ¦   «         }|                      t          |j        ¦  «         dS )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Ñ:Ô:Ð:Ð:Ð: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ð 0ð 0ð 0ð3ð 3ð 3ð 3ð?ð ?ð ?ð ?ð"Tð Tð Tð Tð6ð 6ð 6ð 6ð<ð <ð <ð <ðBð Bð Bð BðCð Cð Cð CðIð Ið Ið IðAð Að Að AðGð Gð Gð Gð
A ð 
A°fð 
AÀð 
Að 
Að 
Að 
Að'ð 'ð 'ð 'ð'ð 'ð 'ð 'ð	8ð 	8ð 	8ð 	8ð
ð 
ð 
ð 
ð&7Øð7Ø4<¸f¸XÀÐ=VÔ4Wð7à	ð7ð 7ð 7ð 7ð9ð 9ð 9ð 9ð9ð 9ð 9ð 9ðJð Jð Jð Jð7ð 7ð 7ð 7ð"7ð 7ð 7ð 7ð(7ð 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Æ      s¯  ððð ð Ð Ð Ð Ð Ð Ð Ð Ø @Ð @Ð @Ð @Ð @Ð @Ð @Ð @Ð @Ð @Ð @Ð @Ð @Ð @Ð @Ð @à Ð Ð Ð Ø %Ð %Ð %Ð %Ð %Ð %Ø $Ð $Ð $Ð $Ð $Ð $Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2ðð ð ð ð ð ð ð ð ð ð ð ð ,Ð +Ð +Ð +Ð +Ð +Ø %Ð %Ð %Ð %Ð %Ð %Ø &Ð &Ð &Ð &Ð &Ð &Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø #Ð #Ð #Ð #Ð #Ð #Ø Ð Ð Ð Ð Ð Ø #Ð #Ð #Ð #Ð #Ð #ðD;ð D;ð D;ð D;ð D;�7”=Ô)Ô2ñ D;ô D;ð D;ð D;ð D;r&   