
    Yf,                        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    ]/var/www/html/env/lib/python3.11/site-packages/twisted/application/twist/test/test_options.py	patchExitzOptionsTests.patchExit$   s-     KK	

8VTY/////    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@    {""dD$///Kd|,,,!!r&   openFile)N)r-   strr   r	   r!   r   )r#   r0   s   ` r$   	patchOpenzOptionsTests.patchOpen+   sf     8:	" 	"3 	"hsm 	"v 	" 	" 	" 	" 	" 	" 	

8Z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#oo%#ooG+2D"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67Q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4xj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4xj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&96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    
 ..Wg&<&<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%%%WZ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"""WY/@@@@@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,?@@@TY.///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    	 	 	 	 	 	 	 	
 	

8Xwwyy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)     ..eW_-----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(FC!!$,,,  4000OOHV,,---!!#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     ..go&&SSw?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74<fX=V4W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&   