
    \d\                     X   d Z ddlZddlZddlZddlmZ 	 ddlZn# e$ r dZY nw xY w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mZmZ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" ddl#m$Z$ ddl%m&Z&m'Z'  G d d          Z( G d de'          Z) e*ed          r ej+                    Z, ej-                    Z.ndxZ,Z. G d de'          Z/ G d de'          Z0 G d de'          Z1 G d de'          Z2 G d de'          Z3 G d d ej4                  Z5 G d! d"          Z6 G d# d$          Z7 G d% d&ej8                  Z9 G d' d(e'          Z: G d) d*e'          Z; G d+ d,ej<                  Z= G d- d.e"e'          Z> G d/ d0e'          Z? G d1 d2e'          Z@dS )3zU
Tests for L{twisted.application} and its interaction with
L{twisted.persisted.sob}.
    N)StringIO)skipIf)appinternetreactorsservice)backoffPolicy)defer
interfacesprotocolreactor)sob)twisted_reactors)basicwire)usage)platformType)TwistedModulesMixin)MemoryReactor)SkipTestTestCasec                       e Zd ZdZdS )DummyN)__name__
__module____qualname__processName     =lib/python3.11/site-packages/twisted/test/test_application.pyr   r   #   s        KKKr   r   c                   \    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd ZdS )ServiceTestsc                     t          j                    }|                    d           |                     |j        d           d S Nhello)r   ServicesetNameassertEqualnameselfss     r    testNamezServiceTests.testName(   s?    O			')))))r   c                     t          j                    }t          j                    }|                    |           |                     t          |          |g           |                     |j        |           d S N)r   r&   MultiServicesetServiceParentr(   listparentr+   r,   ps      r    
testParentzServiceTests.testParent-   sm    O ""	1a1#&&&1%%%%%r   c                 D   t          j                    }t          j        d          }|                    |           |                     t          t          j        |                    |g           |                     |j        t          j        |                     d S )N )r   r&   Applicationr1   r(   r2   IServiceCollectionr3   r4   s      r    testApplicationAsParentz$ServiceTests.testApplicationAsParent4   s    O##	1g8;;<<qcBBB7#=a#@#@AAAAAr   c                 v   t          j                    }t          j                    }|                    d           |                    |           |                     t          |          |g           |                     |j        |           |                     |                    d          |           d S r$   )	r   r&   r0   r'   r1   r(   r2   r3   getServiceNamedr4   s      r    testNamedChildzServiceTests.testNamedChild;   s    O ""			'	1a1#&&&1%%%**733Q77777r   c                     t          j                    }t          j                    }|                    d           |                    |           |                     t          |j        d           d S )Nr%   lalar   r&   r0   r'   r1   assertRaisesRuntimeErrorr4   s      r    testDoublyNamedChildz!ServiceTests.testDoublyNamedChildD   sc    O ""			'	1,	6:::::r   c                 8   t          j                    }t          j                    }|                    d           |                    |           t          j                    }|                    d           |                     t          |j        |           d S r$   rA   r4   s      r    testDuplicateNamedChildz$ServiceTests.testDuplicateNamedChildK   s    O ""			'	1O			',(:A>>>>>r   c                    t          j                    }t          j                    }|                    |           |                     t          |          |g           |                     |j        |           |                                 |                     t          |          g            |                     |j                   d S r/   )	r   r&   r0   r1   r(   r2   r3   disownServiceParentassertIsNoner4   s      r    testDisowningzServiceTests.testDisowningT   s    O ""	1a1#&&&1%%%	a"%%%!(#####r   c                    t          j                    }|                     |j                   |                                 |                     |j                   |                                 |                     |j                   d S r/   )r   r&   assertFalserunningstartService
assertTruestopServicer*   s     r    testRunningzServiceTests.testRunning^   sr    O###		"""	#####r   c                    t          j                    }t          j                    }|                    |           |                     |j                   |                     |j                   |                                 |                     |j                   |                     |j                   |                                 |                     |j                   |                     |j                   d S r/   )	r   r&   r0   r1   rL   rM   rN   rO   rP   r4   s      r    testRunningChildren1z!ServiceTests.testRunningChildren1f   s    O ""	1######		"""	"""	########r   c                 H    t          j                     fd}t          j                    }||_        ||_        t          j                    }                    |           |                    |           |                                 |                                 d S )Nc                  <                          j                   d S r/   )rO   rM   )r,   r+   s   r    checkRunningz7ServiceTests.testRunningChildren2.<locals>.checkRunningv   s    OOAI&&&&&r   )r   r&   rP   rN   r0   r1   )r+   rV   tr5   r,   s   `   @r    testRunningChildren2z!ServiceTests.testRunningChildren2s   s    O	' 	' 	' 	' 	' 	' O$% ""	1	1		r   c                 h   t          j                    }|                                 t          j                    }|                     |j                   |                    |           |                     |j                   |                                 |                     |j                   d S r/   )	r   r0   rN   r&   rL   rM   r1   rO   rH   )r+   r5   r,   s      r    testAddingIntoRunningz"ServiceTests.testAddingIntoRunning   s     ""	O###	1	"""	#####r   c                 B   t          j                    fd}|_        t          j                    }t          j                    }                    |           |                    |           |                                 |                     j                   d S )Nc                      d _         d S N   )privilegedStarted)r,   s   r    pssz(ServiceTests.testPrivileged.<locals>.pss   s    "#Ar   )r   r&   privilegedStartServicer0   r1   rO   r_   )r+   r`   s1r5   r,   s       @r    testPrivilegedzServiceTests.testPrivileged   s    O	$ 	$ 	$ 	$ 	$ $' _ ""	1
A	  """+,,,,,r   c                     t          j                    }|                                 t          j        |          }|                     |j                   |                     |j                   d S r/   )r   r&   rN   copyrL   rM   rO   )r+   r,   rb   s      r    testCopyingzServiceTests.testCopying   s\    O	Yq\\$$$	"""""r   N)r   r   r   r-   r6   r;   r>   rD   rF   rJ   rQ   rS   rX   rZ   rc   rf   r   r   r    r"   r"   '   s        * * *
& & &B B B8 8 8; ; ;? ? ?$ $ $$ $ $$ $ $  $ $ $- - -# # # # #r   r"   getuidc                        e Zd Zd Zd Zd ZdS )ProcessTestsc                     t          j        dd          }|                     |j        d           |                     |j        d           d S )N      )r   Processr(   uidgidr+   r5   s     r    testIDzProcessTests.testID   sI    OAq!!""""""""r   c                    t          j        d          }|                     |j        d           |                     |j                   t          j        d          }|                     |j                   |                     |j        d           t          j                    }|                     |j                   |                     |j                   d S )Nrk   )ro   )r   rm   r(   rn   rI   ro   rp   s     r    testDefaultszProcessTests.testDefaults   s    OA"""!%   O"""!%   """O!%   !%     r   c                     t          j                    }|                     |j                   d|_        |                     |j        d           d S r$   )r   rm   rI   r   r(   rp   s     r    testProcessNamezProcessTests.testProcessName   sJ    O!-(((00000r   N)r   r   r   rq   rs   ru   r   r   r    ri   ri      sA        # # #
	! 	! 	!1 1 1 1 1r   ri   c                        e Zd Zd Zd Zd ZdS )InterfacesTestsc                     |                      t          j                            t          j                                         d S r/   )rO   r   IService
providedByr&   r+   s    r    testServicezInterfacesTests.testService   3    (33GO4E4EFFGGGGGr   c                    |                      t          j                            t          j                                         |                      t          j                            t          j                                         d S r/   )rO   r   ry   rz   r0   r:   r{   s    r    testMultiServicez InterfacesTests.testMultiService   s`    (33G4H4J4JKKLLL2==g>R>T>TUUVVVVVr   c                     |                      t          j                            t          j                                         d S r/   )rO   r   IProcessrz   rm   r{   s    r    testProcesszInterfacesTests.testProcess   r}   r   N)r   r   r   r|   r   r   r   r   r    rw   rw      sL        H H HW W WH H H H Hr   rw   c                   &    e Zd Zd Zd Zd Zd ZdS )ApplicationTestsc                     t          j        d           t          j        dd           t          j        ddd           d S Nr%   rk   rl   )r   r9   r{   s    r    testConstructorz ApplicationTests.testConstructor   sA    G$$$GQ'''GQ*****r   c                    t          j        d          }|                     t          j        |          j                   |                     t          j        |          j                   t          j        dd          }|                     t          j        |          j        d           |                     t          j        |          j                   t          j        ddd          }|                     t          j        |          j        d           |                     t          j        |          j        d           d S r   )r   r9   rI   r   rn   ro   r(   r+   as     r    testProcessComponentz%ApplicationTests.testProcessComponent   s   (('*1--1222'*1--1222++)!,,0!444'*1--1222A..)!,,0!444)!,,0!44444r   c                 T   t          j        d          }|                     t          j        |          t          j        |                     |                     t          j        |          j        d           |                     t          j        |          j                   d S r$   )	r   r9   assertIsry   r:   r(   r)   rI   r3   r   s     r    testServiceComponentz%ApplicationTests.testServiceComponent   s    ((g&q))7+Ea+H+HIII)!,,17;;;'*1--455555r   c                     t          j        d          }t          j        |          }|                     |j        d           |                     |j        d           |                     |j        |           d S )Nr%   pickle)	r   r9   r   IPersistabler(   styler)   r   original)r+   r   r5   s      r    testPersistableComponentz)ApplicationTests.testPersistableComponent   sn    ((Q(+++)))aj!$$$$$r   N)r   r   r   r   r   r   r   r   r   r    r   r      sP        + + +
	5 	5 	56 6 6% % % % %r   r   c                       e Zd Zd ZdS )LoadingTestsc                 n   t          j        d          }t          j        |          }d                                D ]v}|                    |           |                                 t          j        d|d         z   |          }|                     t          j	        |          j
        d           wt          dd          5 }|                    ddg           d d d            n# 1 swxY w Y   t          j        dd	          }|                     t          j	        |          j
        d           d S )
Nr%   source picklezhello.tar   z	hello.tacw(from twisted.application import service
+application = service.Application('hello')
python)r   r9   r   r   splitsetStylesaveloadApplicationr(   ry   r)   open
writelines)r+   r   r5   r   a1fs         r    test_simpleStoreAndLoadz$LoadingTests.test_simpleStoreAndLoad   sa   ((Q$**,, 	A 	AEJJuFFHHH(eAh)>FFBW-b116@@@@+s## 	qLL?B  	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 $[(;;)"--2G<<<<<s   C((C,/C,N)r   r   r   r   r   r   r    r   r      s#        = = = = =r   r   c                   &    e Zd Zd Zd Zd Zd ZdS )AppSupportTestsc                 T    |                      t          j        d                     d S )Nr   )rI   r   getPassphraser{   s    r    testPassphrasezAppSupportTests.testPassphrase  s'    #+A../////r   c                    t          j        d          }dddd}d                                D ]}|                                }d|ddi                    ||          <   t          j        |                              |           t          j        |                              d           t          j
        |d          }|                     t          j        |          j        d           |                                }d|d	<   t          dd
          5 }|                    ddg           ddd           n# 1 swxY w Y   t          j
        |d          }|                     t          j        |          j        d           dS )zL
        Test loading an application file in different dump format.
        r%   N)filesourcer   r   helloapplicationr   r   filenamer   r   r   r   )r   r9   r   re   getr   r   r   r   r   getApplicationr(   ry   r)   r   r   )r+   r   
baseconfigr   configr   r   s          r    testLoadApplicationz#AppSupportTests.testLoadApplication  s    (("ddCC
$**,, 	A 	AE__&&F;MFHf%))%778Q((///Q$$.@$AAA#FD11BW-b116@@@@""-x$c** 	aLL?B  	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 --)"--2G<<<<<s   D??EEc           
         t          j        d          }d                                D ]}d                                D ]}t          j        |                              |           t          j        |                              d           t          j        d|d d|d           t          j	        d|          }| 
                    t          j        |          j        d           d S )Nr@   r   converttestr   zconverttest.outr   )r   r9   r   r   r   r   r   r   convertStyler   r(   ry   r)   )r+   applinstyleoutstyleappl2s        r    test_convertStylez!AppSupportTests.test_convertStyle  s    "6**&,,.. 	G 	GG+1133 G G &&//888 &&++]+CCC !7D2CXq    /0A8LL  !1%!8!8!=vFFFFG	G 	Gr   c                     t          j        d          }t          j        |d           |                     t          j        |          j                   d S )Nr@   r   )r   r9   r   startApplicationrO   ry   rM   )r+   r   s     r    test_startApplicationz%AppSupportTests.test_startApplication)  sK    "6**T1%%%(..677777r   N)r   r   r   r   r   r   r   r   r   r    r   r      sS        0 0 0= = =2
G 
G 
G8 8 8 8 8r   r   c                        e Zd Zd Zd Zd ZdS )Fooc                 :    | j                             d           d S )Ns   lalala
)	transportwriter{   s    r    connectionMadezFoo.connectionMade0  s    ]+++++r   c                 P    || j         _        | j                                         d S r/   )factoryliner   loseConnection)r+   r   s     r    lineReceivedzFoo.lineReceived3  s&     %%'''''r   c                 X    | j         j                            | j         j                   d S r/   )r   dcallbackr   r+   reasons     r    connectionLostzFoo.connectionLost7  s%     122222r   N)r   r   r   r   r   r   r   r   r    r   r   /  sA        , , ,( ( (3 3 3 3 3r   r   c                       e Zd ZdZd Zd ZdS )DummyAppNc                 $    || j         |j        <   d S r/   servicesr)   r+   r   s     r    
addServicezDummyApp.addService>  s    &-gl###r   c                      | j         |j        = d S r/   r   r   s     r    removeServicezDummyApp.removeServiceA  s    M','''r   )r   r   r   r   r   r   r   r   r    r   r   ;  s7        K. . .( ( ( ( (r   r   c                       e Zd Zd Zd ZdS )TimerTargetc                     g | _         d S r/   )lr{   s    r    __init__zTimerTarget.__init__F  s    r   c                 :    | j                             |           d S r/   )r   append)r+   whats     r    r   zTimerTarget.appendI  s    dr   N)r   r   r   r   r   r   r   r    r   r   E  s2              r   r   c                       e Zd Zd ZdS )TestEchoc                 :    | j                             d           d S NT)r   r   r   s     r    r   zTestEcho.connectionLostN  s    r   N)r   r   r   r   r   r   r    r   r   M  s#            r   r   c                   :   e Zd Zd Zd Zd Zd Z e ej	        e
d           d          d             Zd Z e ej	        e
d           d          d	             Z e ej	        e
d           d          d
             Zd Zd Zd Zd Zd Zd Zd Zd ZdS )InternetTestsc                    t          j                                                     t          j                    }t
          |_        t          j                    t
          _        t          j
        d|          }|                               |j                                        j        }t          j                    }t          j                    |_        t           |_        d |_        t          j        d||                                         |j                            | j        d           |j                            fd           |j                            d            |j        S )Nr   	127.0.0.1   lalalac                 ,                                     S r/   rP   xr,   s    r    <lambda>z'InternetTests.testTCP.<locals>.<lambda>b       r   c                     t           j        S r/   r   r   r   s    r    r   z'InternetTests.testTCP.<locals>.<lambda>c      
 r   )r   r0   rN   r   ServerFactoryr   r
   Deferredr   r   	TCPServerr1   _portgetHostportClientFactoryr   r   	TCPClientaddCallbackr(   )r+   r   rW   numr,   s       @r    testTCPzInternetTests.testTCPS  s,    ""	(**#^%%
q'**	1goo$(**N$$	;W55FFqIII	d.	:::	7777888	22333yr   c                    t          j        t          d          st          d          t	          j                    t          j        d          }|                                 |j	        
                                j        |                     d           fd}t          j        |j                                      |          S )z
        Test L{internet.UDPServer} with a random port: starting the service
        should give it valid port, and stopService should free it so that we
        can start a server on the same port again.
        Nz)This reactor does not support UDP socketsr   c                 ~    t          j                  }|                                 |                                S r/   )r   	UDPServerrN   rP   )ignoredrW   r   r5   s     r    onStopz&InternetTests.test_UDP.<locals>.onStopt  s3    "3**ANN==??"r   )r   IReactorUDPr   r   r   DatagramProtocolr   r  rN   r   r   r   assertNotEqualr
   maybeDeferredrP   r   )r+   rW   r  r   r5   s      @@r    test_UDPzInternetTests.test_UDPf  s     %gt44 	HFGGG%''q!$$	goo$C###	# 	# 	# 	# 	# 	#
 "1=11==fEEEr   c                    t          j                    }t          |_         t          j                    t          _        t          j        d|          d_        	                                 j
                                        j        }t          j                    }t          j                    |_        t          |_         d |_        t          j        d||                                           |j                            | j        d           |j                            fd           |j                            fd           |j                            d            |j        S )Nr   r^   r   r   c                 ,                                     S r/   r   )r   cs    r    r   z.InternetTests.testPrivileged.<locals>.<lambda>  r   r   c                 ,                                     S r/   r   r   rW   s    r    r   z.InternetTests.testPrivileged.<locals>.<lambda>  r   r   c                     t           j        S r/   r   r   s    r    r   z.InternetTests.testPrivileged.<locals>.<lambda>  r   r   )r   r   r   r
   r   r   r   r   
privilegedra   r   r   r   r   r   r   r   rN   r   r(   )r+   r   r   r  rW   s      @@r    rc   zInternetTests.testPrivileged{  s5   (**#^%%
q'**	  """goo$(**N$$	{C99		d.	:::	7777888	7777888	22333yr   c                    t          j                    }t          j        |_         t	          j        d|          }|                                 |j                                        j	        }|
                                 t          j                    t          j                    }fd|_        t	          j        d||          }|                                 S )Nr   c                  .                         d           S r/   r   argsr   s    r    r   z<InternetTests.testConnectionGettingRefused.<locals>.<lambda>      qzz$7G7G r   r   )r   r   r   Echor   r   rN   r   r   r   rP   r
   r   r   clientConnectionFailedr   )r+   r   rW   r   r  r   s        @r    testConnectionGettingRefusedz*InternetTests.testConnectionGettingRefused  s    (**9q'**	goo$	N(**)G)G)G)G&{C99	r   Nz1This reactor does not support UNIX domain socketsc                    t          j                                                     t          j                    }t
          |_        t          j                    t
          _        t          j
        d|          }|                               t          j                    }t          |_        t          j                    |_        d |_        t          j        d|                                         |j                            | j        d           |j                            fd           |j                            d            |j                            | j        |           |j        S )Necho.sktr   c                 ,                                     S r/   r   r   s    r    r   z(InternetTests.testUNIX.<locals>.<lambda>  r   r   c                     t           j        S r/   r   r   s    r    r   z(InternetTests.testUNIX.<locals>.<lambda>  r   r   )r   r0   rN   r   r   r   r
   r   r   r   
UNIXServerr1   r   r   r   
UNIXClientr   r(   _cbTestUnix)r+   r   rW   r,   s      @r    testUNIXzInternetTests.testUNIX  s5     ""	(**#^%%

G44	1(**N$$	J00AA!DDD	d.	:::	7777888	22333	d.;;;yr   c                 b   t          j                    t          _        d |_        t          j                    |_                                         |j                            | j        d           |j                            fd           |j                            d            |j        S )Nr   c                 ,                                     S r/   r   r   s    r    r   z+InternetTests._cbTestUnix.<locals>.<lambda>  r   r   c                     t           j        S r/   r   r   s    r    r   z+InternetTests._cbTestUnix.<locals>.<lambda>  r   r   )r
   r   r   r   r   rN   r   r(   )r+   r  r   r,   s      `r    r!  zInternetTests._cbTestUnix  s    ^%%
N$$			d.	:::	7777888	22333yr   c                 ~   t          j                    }t          j        |_         t	          j        d|          }|                                 |                     |j        d            t          j	        |          }| 
                    |j                   |                                 | 
                    |j                   |                     |j                   t          j                    }t          j        |_         t	          j        d|          }|                                 |                     |j        d            t          j	        |          }| 
                    |j                   |                                 | 
                    |j                   |                     |j                   d S )Nr  )r   r   r   r  r   r  rN   failIfIdenticalr   re   rI   rP   rL   rM   r   r   _connection)r+   r   rW   t1s       r    testVolatilezInternetTests.testVolatile  sf   
 (**9
G44	QWd+++Yq\\"(###	!'"""###(**9
G44	Q]D111Yq\\".)))	!-(((#####r   c                    t          j                    }t          j        |_         t	          j        d|          }|                                 |                                 |                     |j	                   t          j
                    }t          j                    fd|_        t          j        d|           S )Nr  c                  .                         d           S r/   r  r  s    r    r   z2InternetTests.testStoppingServer.<locals>.<lambda>  r  r   )r   r   r   r  r   r  rN   rP   rL   rM   r   r
   r   r  r   connectUNIX)r+   r   rW   r   s      @r    testStoppingServerz InternetTests.testStoppingServer  s    
 (**9
G44		###(**N)G)G)G)G&J000r   c                 ,   t                      }t          j        d|j        d          }|                                 t          j        |          }|                                 t          j        |          }| 	                    |j
                   d S )Nr^   r%   )r   r   TimerServicer   rN   r   dumpsrP   loadsrL   rM   )r+   targett0r,   rW   s        r    testPickledTimerzInternetTests.testPickledTimer  sy    "1fmW==
L
LOO#####r   c                     t          j                    t          j        dd           j        fd}|_                                                             fd                                fd           S )Nr^   c                      ddz  S )Nr^   r   r   r   r   r    r   z/InternetTests.testBrokenTimer.<locals>.<lambda>  s
    Q!V r   c                 H     |                                 d            d S r/   r  )whyr   	oldFaileds    r    _failedz.InternetTests.testBrokenTimer.<locals>._failed  s(    IcNNNJJtr   c                     j         S r/   r   r  s    r    r   z/InternetTests.testBrokenTimer.<locals>.<lambda>  s	     r   c                                          t          gd                     t                    D                       S )Nc                 &    g | ]}|j         j        S r   )value	__class__).0os     r    
<listcomp>zCInternetTests.testBrokenTimer.<locals>.<lambda>.<locals>.<listcomp>  s    VVVq"VVVr   )r(   ZeroDivisionErrorflushLoggedErrorsr   r+   s    r    r   z/InternetTests.testBrokenTimer.<locals>.<lambda>  s=    d&&"#VVD,B,BCT,U,UVVV  r   )r
   r   r   r0  r;  rN   r   )r+   r;  r   r:  rW   s   ` @@@r    testBrokenTimerzInternetTests.testBrokenTimer  s    N!!^^44I		 	 	 	 	 	 			----...	   	
 	
 	
 r   c           	         g d}|dd         D ]>} t          t          d|z             t          d          s|                    |           ?|D ]}dD ]}|dk    r|dk    r|dk    r|dk    r|                     t          t          ||z                        t          t          ||z             j        }dd	d|         }|                     t          t          ||z             p|d	k    o|dk                t          t          ||z                         }|                     t          j
        |          |           dS )
z
        L{twisted.application.internet} dynamically defines a set of
        L{service.Service} subclasses that in general have corresponding
        reactor.listenXXX or reactor.connectXXX calls.
        )TCPUNIXSSLUDPUNIXDatagram	MulticastNIReactor)ServerClientrN  rQ  rL  listenconnect)getattrr   r   removerO   hasattrr   methodr(   r   ry   )r+   transtransiderW  prefixrB  s          r    test_everythingTherez"InternetTests.test_everythingThere
  s    KJJ!!!H 	# 	#D97:zD'899'4HH #T""" 	9 	9D, 9 9;&&48+;+;5==TX%5%5$+ > >??? 4$;77>$,	BB4HGVf_55 A)+?%   3GHdTk2244  !1!!4!4a88889	9 	9r   c                 |    t           j        D ].}|                     t          t           |          | d           /dS )z
        L{twisted.application.internet} dynamically defines L{service.Service}
        subclasses. This test ensures that the subclasses exposed by C{__all__}
        are valid attributes of the module.
        z1 not importable from twisted.application.internetN)r   __all__rO   rV  )r+   clss     r    test_importAllzInternetTests.test_importAll$  sT     # 	 	COO#&&III   	 	r   c                    t                      }t                      }t          j        d||          }|                                 |                     |j                                        dd         d|f           dS )z
        L{internet._AbstractServer} supports a C{reactor} keyword argument
        that can be used to parametrize the reactor used to listen for
        connections.
          r   N   )r   objectr   r   rN   r(   
tcpServerspopr+   r   r   rW   s       r    #test_reactorParametrizationInServerz1InternetTests.test_reactorParametrizationInServer0  su      //((tWg>>>	+//11"1"5gGGGGGr   c                    t                      }t          j                    }t          j        dd||          }|                                 |                     |j                                        dd         dd|f           dS )z
        L{internet._AbstractClient} supports a C{reactor} keyword arguments
        that can be used to parametrize the reactor used to create new client
        connections.
        r   rb  rc  N   )	r   r   r   r   r   rN   r(   
tcpClientsrg  rh  s       r    #test_reactorParametrizationInClientz1InternetTests.test_reactorParametrizationInClient=  s      //(**{D'7KKK	+//11"1"5T77STTTTTr   c                    t                      }t          j                    }t          j        d||          }|                                 |                     |j                                        dd         d|f           |	                                 |                                 |                     |j                                        dd         d|f           dS )z
        Like L{test_reactorParametrizationInServer}, but stop and restart the
        service and check that the given reactor is still used.
        rb  rc  Nrd  )
r   r   Factoryr   r   rN   r(   rf  rg  rP   rh  s       r    0test_reactorParametrizationInServerMultipleStartz>InternetTests.test_reactorParametrizationInServerMultipleStartJ  s    
  //"$$tWg>>>	+//11"1"5gGGG		+//11"1"5gGGGGGr   c                    t                      }t          j                    }t          j        dd||          }|                                 |                     |j                                        dd         dd|f           |	                                 |                                 |                     |j                                        dd         dd|f           dS )z
        Like L{test_reactorParametrizationInClient}, but stop and restart the
        service and check that the given reactor is still used.
        r   rb  rc  Nrk  )
r   r   r   r   r   rN   r(   rl  rg  rP   rh  s       r    0test_reactorParametrizationInClientMultipleStartz>InternetTests.test_reactorParametrizationInClientMultipleStartY  s    
  //(**{D'7KKK	+//11"1"5T77STTT		+//11"1"5T77STTTTTr   )r   r   r   r   r
  rc   r  r   r   IReactorUNIXr   r"  r!  r*  r.  r5  rG  r\  r`  ri  rm  rp  rr  r   r   r    r   r   R  s         &F F F*  (   V#J#GT222;  	 *   V#J#GT222; $ $	 $. V#J#GT222;  	 $ $ $  (9 9 94
 
 
H H HU U UH H HU U U U Ur   r   c                   &    e Zd Zd Zd Zd Zd ZdS )TimerBasicTestsc                 6    t          j                    }t          j        d|j        d           _         j                                         |                     j        d           |                     fd           |                     fd           |S )Nr^   r%   c                 6    j                                         S r/   rW   rP   rF  s    r    r   z/TimerBasicTests.testTimerRuns.<locals>.<lambda>o       2 2 4 4 r   c                 B                         j        j                  S r/   )rL   rW   rM   rF  s    r    r   z/TimerBasicTests.testTimerRuns.<locals>.<lambda>p  s     0 0 @ @ r   )	r
   r   r   r0  r   rW   rN   r   r(   )r+   r   s   ` r    testTimerRunszTimerBasicTests.testTimerRunsj  s    N&q!*g>>	d&000	4444555	@@@@AAAr   c                 4    | j                                         S r/   rx  r{   s    r    tearDownzTimerBasicTests.tearDowns  s    v!!###r   c                 v    t          j                    }t          j                    df|dfgfd}t          j        d|           _         j                                          fd} fd} fd}|                    |           |                    |           |                    |           |S )Nbarfooc                  `                                     \  } }|                     |           d S r/   )rg  r   )r   argworks     r    triggerz1TimerBasicTests.testTimerRestart.<locals>.trigger|  s'    XXZZFAsJJsOOOOOr   r^   c                 b                         | d           j                                        S )Nr  r(   rW   rP   resultr+   s    r    onFirstResultz7TimerBasicTests.testTimerRestart.<locals>.onFirstResult  s-    VU+++6%%'''r   c                 x                         j        j                   j                                         S r/   )rL   rW   rM   rN   )r  d2r+   s    r    onFirstStopz5TimerBasicTests.testTimerRestart.<locals>.onFirstStop  s4    TV^,,,F!!!Ir   c                 f                         | d           j                                         d S )Nr  r  r  s    r    onSecondResultz8TimerBasicTests.testTimerRestart.<locals>.onSecondResult  s3    VU+++F     r   )r
   r   r   r0  rW   rN   r   )r+   d1r  r  r  r  r  r  s   `     @@r    testTimerRestartz TimerBasicTests.testTimerRestartv  s   ^^Ub%[)	 	 	 	 	 &q'22	( 	( 	( 	( 	(	 	 	 	 	 	
	! 	! 	! 	! 	! 	}%%%
{###
~&&&	r   c                     g fd}t          j                    }t          j        d|dd|           _         j                                         |                     j        dgdz             |                     fd           |S )Nc                                          |            t                    |k    r|                               d S d S r/   )r   lenr   )datanumberr   r   s      r    r  z/TimerBasicTests.testTimerLoops.<locals>.trigger  s>    HHTNNN1vv

1  r   g{Gz?r%   
   c                 6    j                                         S r/   rx  rF  s    r    r   z0TimerBasicTests.testTimerLoops.<locals>.<lambda>  ry  r   )r
   r   r   r0  rW   rN   r   r(   )r+   r  r   r   s   `  @r    testTimerLoopszTimerBasicTests.testTimerLoops  s    	 	 	 	 	
 N&tWgr1EE	d&	B777	4444555r   N)r   r   r   r{  r}  r  r  r   r   r    ru  ru  i  sP          $ $ $  >    r   ru  c                       e Zd ZdZd ZdS )FakeReactorz6
    A fake reactor with a hooked install method.
    c                 H    t          j        j        | g|R i | || _        dS )zv
        @param install: any callable that will be used as install method.
        @type install: C{callable}
        N)r   Reactorr   install)r+   r  r  kwargss       r    r   zFakeReactor.__init__  s3    
 	!$8888888r   N)r   r   r   __doc__r   r   r   r    r  r    s-             r   r  c                   b    e Zd ZdZd Zd ZddZd Zd Zd Z	d	 Z
d
 Zd Zd Zd Zd Zd ZdS )PluggableReactorTestsz:
    Tests for the reactor discovery/inspection APIs.
    c                 f    g | _         g | _        t          j        | _        | j        t          _        dS )aI  
        Override the L{reactors.getPlugins} function, normally bound to
        L{twisted.plugin.getPlugins}, in order to control which
        L{IReactorInstaller} plugins are seen as available.

        C{self.pluginResults} can be customized and will be used as the
        result of calls to C{reactors.getPlugins}.
        N)pluginCallspluginResultsr   
getPluginsoriginalFunction_getPluginsr{   s    r    setUpzPluggableReactorTests.setUp  s0      ( 3".r   c                 (    | j         t          _        dS )z>
        Restore the original L{reactors.getPlugins}.
        N)r  r   r  r{   s    r    r}  zPluggableReactorTests.tearDown  s     #3r   Nc                 b    | j                             ||f           t          | j                  S )zy
        Stand-in for the real getPlugins method which records its arguments
        and returns a fixed result.
        )r  r   r2   r  )r+   	interfacepackages      r    r  z!PluggableReactorTests._getPlugins  s1    
 	G 4555D&'''r   c                 V   d}t           dz   }d}t          j        |||          g| _        t          j                    }|                     | j        t          j        dfg           |D ]+}|j        |k    r|                     |j	        |            dS ,| 
                    d           dS )zP
        Test that reactor plugins are returned from L{getReactorTypes}
        fakereactortestz.fakereactordescriptionNz6Reactor plugin not present in getReactorTypes() result)r   r   r  r  getReactorTypesr(   r  IReactorInstaller	shortNamer  fail)r+   r)   r  r  reactorTypesrs         r    test_getPluginReactorTypesz0PluggableReactorTests.test_getPluginReactorTypes  s     !^+#&.tWkJJK/11)X-G,N+OPPP 	P 	PA{d""  <<< # IINOOOOOr   c                     g fd}t          |dt          d          }d|i}|                     |           t          j        ddd          }|                                 |                     dg           dS )zy
        Test that L{reactors.Reactor.install} loads the correct module and
        calls its install attribute.
        c                  2                          d           d S r   r   	installeds   r    r  z?PluggableReactorTests.test_reactorInstallation.<locals>.install      T"""""r   r  	describedfakereactorTN)r  r   replaceSysModulesr   r  r  r(   )r+   r  fakeReactormodules	installerr  s        @r    test_reactorInstallationz.PluggableReactorTests.test_reactorInstallation  s    
 		# 	# 	# 	# 	# "'+<hTT$k2w'''$]4E{SS	TF+++++r   c                     g fd}d}t           }d}t          ||||          g| _        t          j        |           |                     dg           dS )zu
        Test that the L{reactors.installReactor} function correctly installs
        the specified reactor.
        c                  2                          d           d S r   r  r  s   r    r  z:PluggableReactorTests.test_installReactor.<locals>.install  r  r   r  r  TNr   r  r  r   installReactorr(   )r+   r  r)   r  r  r  s        @r    test_installReactorz)PluggableReactorTests.test_installReactor  s|    
 		# 	# 	# 	# 	# !#)'4+NNO%%%TF+++++r   c                      t                       fd}d}t          }d}t          ||||          g _        t	          j        |          }                     |           dS )zt
        Test that the L{reactors.installReactor} function correctly returns
        the installed reactor.
        c                  B    ddl m}                      | d           d S )Nr   )r   r   )twistedr   patch)r   r   r+   s    r    r  zHPluggableReactorTests.test_installReactorReturnsReactor.<locals>.install  s1    ((((((JJxG44444r   r  r  N)re  r   r  r  r   r  r   )r+   r  r)   r  r  r  r   s   `     @r    !test_installReactorReturnsReactorz7PluggableReactorTests.test_installReactorReturnsReactor	  s    
 ((	5 	5 	5 	5 	5 	5
 !#)'4+NNO+D11	i)))))r   c                     g fd}d}t           }d}t          ||||          }t          d d||          }||g| _        t          j        |           |                     dg           dS )z
        Test that the L{reactors.installReactor} function correctly installs
        the specified reactor when there are multiple reactor plugins.
        c                  2                          d           d S r   r  r  s   r    r  zIPluggableReactorTests.test_installReactorMultiplePlugins.<locals>.install#  r  r   r  r  c                      d S r/   r   r   r   r    r   zJPluggableReactorTests.test_installReactorMultiplePlugins.<locals>.<lambda>*  s    4 r   otherreactorTNr  )r+   r  r)   r  r  r  otherReactorr  s          @r    "test_installReactorMultiplePluginsz8PluggableReactorTests.test_installReactorMultiplePlugins  s    
 		# 	# 	# 	# 	# !#!'4+FF"<<+VV*K8%%%TF+++++r   c                 j    g | _         |                     t          j        t          j        d           dS )z
        Test that L{reactors.installReactor} raises L{reactors.NoSuchReactor}
        when asked to install a reactor which it cannot find.
        somereactorN)r  rB   r   NoSuchReactorr  r{   s    r    test_installNonExistentReactorz4PluggableReactorTests.test_installNonExistentReactor/  s;    
  "H$;]	
 	
 	
 	
 	
r   c                     d }d}t           }d}t          ||||          g| _        |                     t          t
          j        |           dS )z
        Test that L{reactors.installReactor} raises an exception when asked to
        install a reactor which doesn't work in this environment.
        c                       t          d          )NMissing foo barImportErrorr   r   r    r  zFPluggableReactorTests.test_installNotAvailableReactor.<locals>.install?  s    /000r   r  r  N)r   r  r  rB   r  r   r  )r+   r  r)   r  r  s        r    test_installNotAvailableReactorz5PluggableReactorTests.test_installNotAvailableReactor9  s\    	1 	1 	1 !#)'4+NNO+x'>EEEEEr   c                    g dd G fddt           j        t          j                  }fd}t	          |dt
          d          g| _         |            }|                    g d           |                     d	                    |                     	                              d
           |                     |d         d           dS )zx
        Test that the reactor selected is installed as soon as possible, ie
        when the option is parsed.
        zreactor installedzsubcommands loadedc                   ,    e Zd Ze fd            ZdS )QPluggableReactorTests.test_reactorSelectionMixin.<locals>.ReactorSelectionOptionsc                 D                                     dd  fddfgS )N
subcommandc                       S r/   r   r{   s   r    r   zoPluggableReactorTests.test_reactorSelectionMixin.<locals>.ReactorSelectionOptions.subCommands.<locals>.<lambda>U  s    T r   ztest subcommandr  )r+   SUBCOMMAND_EVENTexecuteds   `r    subCommandsz]PluggableReactorTests.test_reactorSelectionMixin.<locals>.ReactorSelectionOptions.subCommandsR  s0     0111%t\\\\;LMNNr   N)r   r   r   propertyr  )r  r  s   r    ReactorSelectionOptionsr  Q  sE        O O O O O XO O Or   r  c                  2                                     d S r/   r  )INSTALL_EVENTr  s   r    r  zAPluggableReactorTests.test_reactorSelectionMixin.<locals>.installW  s    OOM*****r   r  r  z	--reactorr  r  r   r^   r   N)
r   Optionsr   ReactorSelectionMixinr  r   r  parseOptionsr(   count)r+   r  r  optionsr  r  r  s       @@@r    test_reactorSelectionMixinz0PluggableReactorTests.test_reactorSelectionMixinH  s'   
 +/	O 	O 	O 	O 	O 	O 	O 	OemS5N 	O 	O 	O	+ 	+ 	+ 	+ 	+ 	+ !2HkJJ
 *)++KKKLLL!m44466:::+->?????r   c                 h    G d dt           j        t          j                  }g | _         |            }t                      |_        |                     t           j        |j	        g d          }| 
                    d|j        d                    | 
                    d|j        d                    dS )z
        Test that the usage mixin exits when trying to use a non existent
        reactor (the name not matching to any reactor), giving an error
        message.
        c                       e Zd ZdS )\PluggableReactorTests.test_reactorSelectionMixinNonExistent.<locals>.ReactorSelectionOptionsNr   r   r   r   r   r    r  r  k          Dr   r  r  r  r   help-reactorsN)r   r  r   r  r  r   messageOutputrB   
UsageErrorr  assertInr  )r+   r  r  es       r    %test_reactorSelectionMixinNonExistentz;PluggableReactorTests.test_reactorSelectionMixinNonExistentd  s    	 	 	 	 	emS5N 	 	 	  ))++ (

 :::
 

 	'333oqvay11111r   c                     G d dt           j        t          j                  }dfd}d}t          }d}t          ||||          g| _         |            }t                      |_        | 	                    t           j
        |j        g d          }|                     |j        d                    |                     d	|j        d                    d
S )z
        Test that the usage mixin exits when trying to use a reactor not
        available (the reactor raises an error at installation), giving an
        error message.
        c                       e Zd ZdS )]PluggableReactorTests.test_reactorSelectionMixinNotAvailable.<locals>.ReactorSelectionOptionsNr  r   r   r    r  r    r  r   r  r  c                  "    t                     r/   r  )messages   r    r  zMPluggableReactorTests.test_reactorSelectionMixinNotAvailable.<locals>.install  s    g&&&r   r  r  r  r   r  N)r   r  r   r  r   r  r  r   r  rB   r  r  r  r  )	r+   r  r  r)   r  r  r  r  r  s	           @r    &test_reactorSelectionMixinNotAvailablez<PluggableReactorTests.test_reactorSelectionMixinNotAvailablez  s    	 	 	 	 	emS5N 	 	 	 $	' 	' 	' 	' 	' !#)'4+NNO))++ (

 :::
 

 	gqvay)))oqvay11111r   r/   )r   r   r   r  r  r}  r  r  r  r  r  r  r  r  r  r  r  r   r   r    r  r    s         / / /4 4 4( ( ( (P P P&, , ,", , ,"* * *&, , ,&
 
 
F F F@ @ @82 2 2,2 2 2 2 2r   r  c                       e Zd ZdZd Z eed          d             Z ee d          d             Z ee	dk    d          d	             Z
 ee	dk    d
          d             Zd ZdS )HelpReactorsTestsz6
    --help-reactors lists the available reactors
    c                     t          j                    | _        t                      | j        _        |                     t          | j        j                   | j        j                                        | _	        dS )z3
        Get the text from --help-reactors
        N)
r   r  r  r   r  rB   
SystemExitopt_help_reactorsgetvaluer  r{   s    r    r  zHelpReactorsTests.setUp  sY     022%-ZZ"*dl&DEEE|1::<<r   z$Not applicable, asyncio is availablec                     |                      t          j        j        | j                   |                      dt          j        j        z   | j                   dS )zX
        --help-reactors should NOT display the asyncio reactor on Python < 3.4
        !N)r  r   asyncior  r  r  r{   s    r    test_lacksAsyncIOz#HelpReactorsTests.test_lacksAsyncIO  sI    
 	&.:DLIIIc,4>>MMMMMr   zasyncio library not availablec                     |                      t          j        j        | j                   |                     dt          j        j        z   | j                   dS )zU
        --help-reactors should display the asyncio reactor on Python >= 3.4
        r
  N)r  r   r  r  r  assertNotInr  r{   s    r    test_hasAsyncIOz!HelpReactorsTests.test_hasAsyncIO  sK    
 	&.:DLIII/7AA4<PPPPPr   win32zTest only applicable on Windowsc                     |                      t          j        j        | j                   |                     dt          j        j        z   | j                   dS )zL
        --help-reactors should display the iocp reactor on Windows
        r
  N)r  r   iocpr  r  r  r  r{   s    r    test_iocpWin32z HelpReactorsTests.test_iocpWin32  sK    
 	&+7FFF/4>>MMMMMr   zTest not applicable on Windowsc                     |                      t          j        j        | j                   |                      dt          j        j        z   | j                   dS )zP
        --help-reactors should NOT display the iocp reactor on Windows
        r
  N)r  r   r  r  r  r  r{   s    r    test_iocpNotWin32z#HelpReactorsTests.test_iocpNotWin32  sI    
 	&+7FFFc,1;;T\JJJJJr   c                    d }t          j                    }||_        t                      |_        |                     t          |j                   |j                                        }| 	                    d|           dS )z>
        --help-reactors with only supported reactors
        c               3   &   K   t           j        V  d S r/   )r   defaultr   r   r    r  zEHelpReactorsTests.test_onlySupportedReactors.<locals>.getReactorTypes  s      "******r   zreactors not availableN)
r   r  _getReactorTypesr   r  rB   r  r  r  r  )r+   r  r  r  s       r    test_onlySupportedReactorsz,HelpReactorsTests.test_onlySupportedReactors  s    
	+ 	+ 	+ +--#2  (

*g&?@@@'002217;;;;;r   N)r   r   r   r  r  r   r  r  r  r   r  r  r  r   r   r    r  r    s         = = = VG;<<N N =<N VK899Q Q :9Q VLG#%FGGN N HGN VLG#%EFFK K GFK< < < < <r   r  c                   $    e Zd ZdZd Zd Zd ZdS )BackoffPolicyTestsz@
    Tests of L{twisted.application.internet.backoffPolicy}
    c                 d   t          dddd           }|                      |d          d           |                      |d          d	           |                      |d
          d           |                      |d          d           |                      |d          d           dS )zI
        Test that L{backoffPolicy()} calculates expected values
              ?      N@      ?c                      dS r]   r   r   r   r    r   zCBackoffPolicyTests.test_calculates_correct_values.<locals>.<lambda>      1 r   jitterr   rd  r^   g      @r  g     UM@   =   d   N)r	   assertAlmostEqualr(   r+   pols     r    test_calculates_correct_valuesz1BackoffPolicyTests.test_calculates_correct_values  s     Cs99===ss1vvq)))ss1vvs+++ss2ww666R"%%%S2&&&&&r   c                     t          dddd           }|                      |d          d           |                      |d          d           d	S )
z
        L{backoffPolicy()} does not fail for large values of the attempt
        parameter. In previous versions, this test failed when attempt was
        larger than 1750.

        See https://twistedmatrix.com/trac/ticket/9476
        r  r  r   c                      dS r]   r   r   r   r    r   zLBackoffPolicyTests.test_does_not_overflow_on_high_attempts.<locals>.<lambda>  r"  r   r#    r&  i@B Nr	   r(   r)  s     r    'test_does_not_overflow_on_high_attemptsz:BackoffPolicyTests.test_does_not_overflow_on_high_attempts  s^     Cs99===TB'''Wr*****r   c                 l    t          dddd           }|                      |d          d           dS )	z
        Even with unusual parameters, any L{OverflowError} within
        L{backoffPolicy()} will be caught and L{maxDelay} will be returned
        instead
        r  r  g    _Bc                      dS r]   r   r   r   r    r   zSBackoffPolicyTests.test_does_not_overflow_with_large_factor_value.<locals>.<lambda>  s    A r   r#  r.  r&  Nr/  r)  s     r    .test_does_not_overflow_with_large_factor_valuezABackoffPolicyTests.test_does_not_overflow_with_large_factor_value  s@     CtII>>>TB'''''r   N)r   r   r   r  r+  r0  r3  r   r   r    r  r    sK         	' 	' 	'
+ 
+ 
+( ( ( ( (r   r  )Ar  re   osr   ior   r  r  unittestr   twisted.applicationr   r   r   r   twisted.application.internetr	   twisted.internetr
   r   r   r   twisted.persistedr   twisted.pluginsr   twisted.protocolsr   r   twisted.pythonr   twisted.python.runtimer   #twisted.python.test.modules_helpersr   twisted.test.proto_helpersr   twisted.trial.unittestr   r   r   r"   rV  rg   curuidgetgidcurgidri   rw   r   r   r   LineReceiverr   r   r   r  r   r   ru  r  r  r  r  r  r   r   r    <module>rF     s     				       NNNN   GGG       @ @ @ @ @ @ @ @ @ @ @ @ 6 6 6 6 6 6 A A A A A A A A A A A A ! ! ! ! ! ! , , , , , , ) ) ) ) ) ) ) )             / / / / / / C C C C C C 4 4 4 4 4 4 5 5 5 5 5 5 5 5       x# x# x# x# x#8 x# x# x#v 72x RY[[FRY[[FFFV1 1 1 1 18 1 1 10	H 	H 	H 	H 	Hh 	H 	H 	H% % % % %x % % %>= = = = =8 = = =(,8 ,8 ,8 ,8 ,8h ,8 ,8 ,8^	3 	3 	3 	3 	3%
 	3 	3 	3( ( ( ( ( ( ( (           ty   
TU TU TU TU TUH TU TU TUn9 9 9 9 9h 9 9 9x    ("   c2 c2 c2 c2 c2/ c2 c2 c2L;< ;< ;< ;< ;< ;< ;< ;<|#( #( #( #( #( #( #( #( #( #(s    %%