o
    ¯b\…  ã                   @   s6  d Z ddlZddlZddlZddlmZ zddlZW n ey%   dZY n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„ dƒZ(G dd„ de'ƒZ)e*edƒr›e +¡ Z,e -¡ Z.nd Z,Z.G dd„ de'ƒZ/G dd„ de'ƒZ0G dd„ de'ƒZ1G dd„ de'ƒZ2G dd„ de'ƒZ3G dd „ d ej4ƒZ5G d!d"„ d"ƒZ6G d#d$„ d$ƒZ7G d%d&„ d&ej8ƒZ9G d'd(„ d(e'ƒZ:G d)d*„ d*e'ƒZ;G d+d,„ d,ej<ƒZ=G d-d.„ d.e"e'ƒZ>G d/d0„ d0e'ƒZ?G d1d2„ 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                   @   s   e Zd ZdZdS )ÚDummyN)Ú__name__Ú
__module__Ú__qualname__ÚprocessName© r   r   ú?/usr/lib/python3/dist-packages/twisted/test/test_application.pyr   #   s    r   c                   @   st   e 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d„ Zdd„ ZdS )ÚServiceTestsc                 C   s$   t  ¡ }| d¡ |  |jd¡ d S ©NÚhello)r   ÚServiceÚsetNameÚassertEqualÚname©ÚselfÚsr   r   r   ÚtestName(   s   
zServiceTests.testNamec                 C   s>   t  ¡ }t  ¡ }| |¡ |  t|ƒ|g¡ |  |j|¡ d S ©N)r   r!   ÚMultiServiceÚsetServiceParentr#   ÚlistÚparent©r&   r'   Úpr   r   r   Ú
testParent-   s
   
zServiceTests.testParentc                 C   sL   t  ¡ }t  d¡}| |¡ |  tt  |¡ƒ|g¡ |  |jt  |¡¡ d S )NÚ )r   r!   ÚApplicationr+   r#   r,   ÚIServiceCollectionr-   r.   r   r   r   ÚtestApplicationAsParent4   s
   

z$ServiceTests.testApplicationAsParentc                 C   sZ   t  ¡ }t  ¡ }| d¡ | |¡ |  t|ƒ|g¡ |  |j|¡ |  | d¡|¡ d S r   )	r   r!   r*   r"   r+   r#   r,   r-   ÚgetServiceNamedr.   r   r   r   ÚtestNamedChild;   s   

zServiceTests.testNamedChildc                 C   s8   t  ¡ }t  ¡ }| d¡ | |¡ |  t|jd¡ d S )Nr    Úlala©r   r!   r*   r"   r+   ÚassertRaisesÚRuntimeErrorr.   r   r   r   ÚtestDoublyNamedChildD   s
   

z!ServiceTests.testDoublyNamedChildc                 C   sJ   t  ¡ }t  ¡ }| d¡ | |¡ t  ¡ }| d¡ |  t|j|¡ d S r   r8   r.   r   r   r   ÚtestDuplicateNamedChildK   s   


z$ServiceTests.testDuplicateNamedChildc                 C   sb   t  ¡ }t  ¡ }| |¡ |  t|ƒ|g¡ |  |j|¡ | ¡  |  t|ƒg ¡ |  |j¡ d S r)   )	r   r!   r*   r+   r#   r,   r-   ÚdisownServiceParentÚassertIsNoner.   r   r   r   ÚtestDisowningT   s   
zServiceTests.testDisowningc                 C   s@   t  ¡ }|  |j¡ | ¡  |  |j¡ | ¡  |  |j¡ d S r)   )r   r!   ÚassertFalseÚrunningÚstartServiceÚ
assertTrueÚstopServicer%   r   r   r   ÚtestRunning^   s   zServiceTests.testRunningc                 C   sv   t  ¡ }t  ¡ }| |¡ |  |j¡ |  |j¡ | ¡  |  |j¡ |  |j¡ | ¡  |  |j¡ |  |j¡ d S r)   )	r   r!   r*   r+   r@   rA   rB   rC   rD   r.   r   r   r   ÚtestRunningChildren1f   s   
z!ServiceTests.testRunningChildren1c                    sZ   t  ¡ ‰ ‡ ‡fdd„}t  ¡ }||_||_t  ¡ }ˆ  |¡ | |¡ | ¡  | ¡  d S )Nc                      s   ˆ  ˆ j¡ d S r)   )rC   rA   r   ©r'   r&   r   r   ÚcheckRunningv   ó   z7ServiceTests.testRunningChildren2.<locals>.checkRunning)r   r!   rD   rB   r*   r+   )r&   rH   Útr/   r   rG   r   ÚtestRunningChildren2s   s   

z!ServiceTests.testRunningChildren2c                 C   sR   t  ¡ }| ¡  t  ¡ }|  |j¡ | |¡ |  |j¡ | ¡  |  |j¡ d S r)   )	r   r*   rB   r!   r@   rA   r+   rC   r=   )r&   r/   r'   r   r   r   ÚtestAddingIntoRunning‚   s   
z"ServiceTests.testAddingIntoRunningc                    sV   t  ¡ ‰ ‡ fdd„}|ˆ _t  ¡ }t  ¡ }ˆ  |¡ | |¡ | ¡  |  ˆ j¡ d S )Nc                      s
   dˆ _ d S ©Né   )ÚprivilegedStartedr   ©r'   r   r   Úpss   ó   
z(ServiceTests.testPrivileged.<locals>.pss)r   r!   ÚprivilegedStartServicer*   r+   rC   rO   )r&   rQ   Ús1r/   r   rP   r   ÚtestPrivilegedŒ   s   

zServiceTests.testPrivilegedc                 C   s6   t  ¡ }| ¡  t |¡}|  |j¡ |  |j¡ d S r)   )r   r!   rB   Úcopyr@   rA   rC   )r&   r'   rT   r   r   r   ÚtestCopyingš   s
   
zServiceTests.testCopyingN)r   r   r   r(   r0   r4   r6   r;   r<   r?   rE   rF   rK   rL   rU   rW   r   r   r   r   r   '   s    		

r   Úgetuidc                   @   ó$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚProcessTestsc                 C   s,   t  dd¡}|  |jd¡ |  |jd¡ d S )Né   é   )r   ÚProcessr#   ÚuidÚgid©r&   r/   r   r   r   ÚtestIDª   s   zProcessTests.testIDc                 C   sn   t  d¡}|  |jd¡ |  |j¡ t jdd}|  |j¡ |  |jd¡ t  ¡ }|  |j¡ |  |j¡ d S )Nr[   )r_   )r   r]   r#   r^   r>   r_   r`   r   r   r   ÚtestDefaults¯   s   
zProcessTests.testDefaultsc                 C   s,   t  ¡ }|  |j¡ d|_|  |jd¡ d S r   )r   r]   r>   r   r#   r`   r   r   r   ÚtestProcessNameº   s   zProcessTests.testProcessNameN)r   r   r   ra   rb   rc   r   r   r   r   rZ   ©   s    rZ   c                   @   rY   )ÚInterfacesTestsc                 C   ó   |   tj t ¡ ¡¡ d S r)   )rC   r   ÚIServiceÚ
providedByr!   ©r&   r   r   r   ÚtestServiceÂ   ó   zInterfacesTests.testServicec                 C   s0   |   tj t ¡ ¡¡ |   tj t ¡ ¡¡ d S r)   )rC   r   rf   rg   r*   r3   rh   r   r   r   ÚtestMultiServiceÅ   s   z InterfacesTests.testMultiServicec                 C   re   r)   )rC   r   ÚIProcessrg   r]   rh   r   r   r   ÚtestProcessÉ   rj   zInterfacesTests.testProcessN)r   r   r   ri   rk   rm   r   r   r   r   rd   Á   ó    rd   c                   @   ó,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚApplicationTestsc                 C   s(   t  d¡ t  dd¡ t  ddd¡ d S ©Nr    r[   r\   )r   r2   rh   r   r   r   ÚtestConstructorÎ   s   
z ApplicationTests.testConstructorc                 C   sš   t  d¡}|  t  |¡j¡ |  t  |¡j¡ t  dd¡}|  t  |¡jd¡ |  t  |¡j¡ t  ddd¡}|  t  |¡jd¡ |  t  |¡jd¡ d S rq   )r   r2   r>   rl   r^   r_   r#   ©r&   Úar   r   r   ÚtestProcessComponentÓ   s   
z%ApplicationTests.testProcessComponentc                 C   sL   t  d¡}|  t  |¡t  |¡¡ |  t  |¡jd¡ |  t  |¡j¡ d S r   )	r   r2   ÚassertIsrf   r3   r#   r$   r>   r-   rs   r   r   r   ÚtestServiceComponentÞ   s   
z%ApplicationTests.testServiceComponentc                 C   sB   t  d¡}t |¡}|  |jd¡ |  |jd¡ |  |j|¡ d S )Nr    Úpickle)	r   r2   r   ÚIPersistabler#   Ústyler$   rv   Úoriginal)r&   rt   r/   r   r   r   ÚtestPersistableComponentä   s
   

z)ApplicationTests.testPersistableComponentN)r   r   r   rr   ru   rw   r|   r   r   r   r   rp   Í   s
    rp   c                   @   ó   e Zd Zdd„ ZdS )ÚLoadingTestsc                 C   s¸   t  d¡}t |¡}d ¡ D ]}| |¡ | ¡  t  d|d  |¡}|  t  	|¡j
d¡ qtddƒ}| ddg¡ W d   ƒ n1 sEw   Y  t  dd	¡}|  t  	|¡j
d¡ d S )
Nr    úsource picklezhello.tar   z	hello.tacÚwú(from twisted.application import service
ú+application = service.Application('hello')
Úpython)r   r2   r   ry   ÚsplitÚsetStyleÚsaveÚloadApplicationr#   rf   r$   ÚopenÚ
writelines)r&   rt   r/   rz   Úa1Úfr   r   r   Útest_simpleStoreAndLoadí   s    


þÿÿz$LoadingTests.test_simpleStoreAndLoadN)r   r   r   rŒ   r   r   r   r   r~   ì   ó    r~   c                   @   ro   )
ÚAppSupportTestsc                 C   s   |   t d¡¡ d S )Nr   )r>   r   ÚgetPassphraserh   r   r   r   ÚtestPassphrase  s   zAppSupportTests.testPassphrasec                 C   sî   t  d¡}ddddœ}d ¡ D ]1}| ¡ }d|ddi ||¡< t |¡ |¡ t |¡jdd t	 
|d¡}|  t  |¡jd¡ q| ¡ }d|d	< tdd
ƒ}| ddg¡ W d  ƒ n1 s`w   Y  t	 
|d¡}|  t  |¡jd¡ dS )zL
        Test loading an application file in different dump format.
        r    N)ÚfileÚsourcerƒ   r   Úhelloapplicationrx   r‘   ©Úfilenamerƒ   r€   r   r‚   )r   r2   r„   rV   Úgetr   ry   r…   r†   r   ÚgetApplicationr#   rf   r$   rˆ   r‰   )r&   rt   Ú
baseconfigrz   ÚconfigrŠ   r‹   r   r   r   ÚtestLoadApplication  s(   
þÿÿz#AppSupportTests.testLoadApplicationc              
   C   s€   t  d¡}d ¡ D ]4}d ¡ D ]-}t |¡ |¡ t |¡jdd t d|d d|d¡ t  	d|¡}|  
t  |¡jd¡ qq	d S )Nr7   r   Úconverttestr”   zconverttest.outr   )r   r2   r„   r   ry   r…   r†   r   ÚconvertStyler‡   r#   rf   r$   )r&   ÚapplÚinstyleÚoutstyleÚappl2r   r   r   Útest_convertStyle  s   
ÿùÿz!AppSupportTests.test_convertStylec                 C   s,   t  d¡}t |d¡ |  t  |¡j¡ d S )Nr7   r   )r   r2   r   ÚstartApplicationrC   rf   rA   )r&   r   r   r   r   Útest_startApplication)  s   
z%AppSupportTests.test_startApplicationN)r   r   r   r   rš   r¡   r£   r   r   r   r   rŽ      s
    rŽ   c                   @   rY   )ÚFooc                 C   ó   | j  d¡ d S )Ns   lalala
)Ú	transportÚwriterh   r   r   r   ÚconnectionMade0  rI   zFoo.connectionMadec                 C   s   || j _| j ¡  d S r)   )ÚfactoryÚliner¦   ÚloseConnection)r&   rª   r   r   r   ÚlineReceived3  ó   zFoo.lineReceivedc                 C   s   | j j | j j¡ d S r)   )r©   ÚdÚcallbackrª   ©r&   Úreasonr   r   r   ÚconnectionLost7  s   zFoo.connectionLostN)r   r   r   r¨   r¬   r²   r   r   r   r   r¤   /  rn   r¤   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚDummyAppNc                 C   s   || j |j< d S r)   ©Úservicesr$   ©r&   r   r   r   r   Ú
addService>  rI   zDummyApp.addServicec                 C   s   | j |j= d S r)   r´   r¶   r   r   r   ÚremoveServiceA  ó   zDummyApp.removeService)r   r   r   r   r·   r¸   r   r   r   r   r³   ;  s    r³   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚTimerTargetc                 C   s
   g | _ d S r)   ©Úlrh   r   r   r   Ú__init__F  rR   zTimerTarget.__init__c                 C   s   | j  |¡ d S r)   )r¼   Úappend)r&   Úwhatr   r   r   r¾   I  rI   zTimerTarget.appendN)r   r   r   r½   r¾   r   r   r   r   rº   E  s    rº   c                   @   r}   )ÚTestEchoc                 C   r¥   ©NT)r®   r¯   r°   r   r   r   r²   N  rI   zTestEcho.connectionLostN)r   r   r   r²   r   r   r   r   rÀ   M  r   rÀ   c                   @   sÈ   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zee 	e
d	¡ d
ƒdd„ ƒZdd„ Zee 	e
d	¡ d
ƒdd„ ƒZee 	e
d	¡ d
ƒ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 )#ÚInternetTestsc                    s¶   t  ¡ ‰ ˆ  ¡  t ¡ }t|_t ¡ t_t	 
d|¡}| ˆ ¡ |j ¡ j}t ¡ }t ¡ |_t|_d |_t	 d||¡ ˆ ¡ |j | jd¡ |j ‡ fdd„¡ |j dd„ ¡ |jS )Nr   ú	127.0.0.1ó   lalalac                    ó   ˆ   ¡ S r)   ©rD   ©ÚxrP   r   r   Ú<lambda>b  ó    z'InternetTests.testTCP.<locals>.<lambda>c                 S   ó   t jS r)   ©rÀ   r®   rÇ   r   r   r   rÉ   c  ó    )r   r*   rB   r   ÚServerFactoryrÀ   r	   ÚDeferredr®   r   Ú	TCPServerr+   Ú_portÚgetHostÚportÚClientFactoryr¤   rª   Ú	TCPClientÚaddCallbackr#   )r&   r©   rJ   Únumr   rP   r   ÚtestTCPS  s"   


zInternetTests.testTCPc                    sh   t  td¡s
tdƒ‚t ¡ ‰t dˆ¡}| ¡  |j	 
¡ j‰ |  ˆ d¡ ‡ ‡fdd„}t |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                    s   t  ˆ ˆ¡}| ¡  | ¡ S r)   )r   Ú	UDPServerrB   rD   )ÚignoredrJ   ©r×   r/   r   r   ÚonStopt  s   z&InternetTests.test_UDP.<locals>.onStop)r
   ÚIReactorUDPr   r   r   ÚDatagramProtocolr   rÙ   rB   rÑ   rÒ   rÓ   ÚassertNotEqualr	   ÚmaybeDeferredrD   rÖ   )r&   rJ   rÜ   r   rÛ   r   Útest_UDPf  s   zInternetTests.test_UDPc                    sÀ   t  ¡ }t|_ t ¡ t_t d|¡‰dˆ_ˆ 	¡  ˆj
 ¡ j}t  ¡ }t ¡ |_t|_ d |_t d||¡‰ ˆ  ¡  |j | jd¡ |j ‡ fdd„¡ |j ‡fdd„¡ |j dd„ ¡ |jS )	Nr   rN   rÃ   rÄ   c                    rÅ   r)   rÆ   rÇ   )Úcr   r   rÉ   Š  rÊ   z.InternetTests.testPrivileged.<locals>.<lambda>c                    rÅ   r)   rÆ   rÇ   ©rJ   r   r   rÉ   ‹  rÊ   c                 S   rË   r)   rÌ   rÇ   r   r   r   rÉ   Œ  rÍ   )r   rÎ   rÀ   r	   rÏ   r®   r   rÐ   Ú
privilegedrS   rÑ   rÒ   rÓ   rÔ   r¤   rª   rÕ   rB   rÖ   r#   )r&   r©   r×   r   )râ   rJ   r   rU   {  s$   

zInternetTests.testPrivilegedc                    sp   t  ¡ }tj|_ t d|¡}| ¡  |j ¡ j	}| 
¡  t ¡ ‰ t  ¡ }‡ fdd„|_t d||¡}| ¡  ˆ S )Nr   c                     ó
   ˆ   d ¡S r)   ©r¯   ©Úargs©r®   r   r   rÉ   ˜  ó   
 z<InternetTests.testConnectionGettingRefused.<locals>.<lambda>rÃ   )r   rÎ   r   ÚEchor   rÐ   rB   rÑ   rÒ   rÓ   rD   r	   rÏ   rÔ   ÚclientConnectionFailedrÕ   )r&   r©   rJ   r×   râ   r   ré   r   ÚtestConnectionGettingRefused  s   z*InternetTests.testConnectionGettingRefusedNz1This reactor does not support UNIX domain socketsc                    sº   t  ¡ ‰ ˆ  ¡  t ¡ }t|_t ¡ t_t	 
d|¡}| ˆ ¡ t ¡ }t|_t ¡ |_d |_t	 d|¡ ˆ ¡ |j | jd¡ |j ‡ fdd„¡ |j dd„ ¡ |j | j|ˆ ¡ |jS )Núecho.sktrÄ   c                    rÅ   r)   rÆ   rÇ   rP   r   r   rÉ   ±  rÊ   z(InternetTests.testUNIX.<locals>.<lambda>c                 S   rË   r)   rÌ   rÇ   r   r   r   rÉ   ²  rÍ   )r   r*   rB   r   rÎ   rÀ   r	   rÏ   r®   r   Ú
UNIXServerr+   rÔ   r¤   rª   Ú
UNIXClientrÖ   r#   Ú_cbTestUnix©r&   r©   rJ   r   rP   r   ÚtestUNIX  s"   


zInternetTests.testUNIXc                    s\   t  ¡ t_d |_t  ¡ |_ˆ  ¡  |j | jd¡ |j ‡ fdd„¡ |j dd„ ¡ |jS )NrÄ   c                    rÅ   r)   rÆ   rÇ   rP   r   r   rÉ   ¼  rÊ   z+InternetTests._cbTestUnix.<locals>.<lambda>c                 S   rË   r)   rÌ   rÇ   r   r   r   rÉ   ½  rÍ   )r	   rÏ   rÀ   r®   rª   rB   rÖ   r#   )r&   rÚ   r©   r'   r   rP   r   rñ   ¶  s   

zInternetTests._cbTestUnixc                 C   sÔ   t  ¡ }tj|_ t d|¡}| ¡  |  |jd ¡ t	 	|¡}|  
|j¡ | ¡  |  
|j¡ |  |j¡ t  ¡ }tj|_ t d|¡}| ¡  |  |jd ¡ t	 	|¡}|  
|j¡ | ¡  |  
|j¡ |  |j¡ d S )Nrî   )r   rÎ   r   rë   r   rï   rB   ÚfailIfIdenticalrÑ   rV   r>   rD   r@   rA   rÔ   rð   Ú_connection)r&   r©   rJ   Út1r   r   r   ÚtestVolatileÀ  s(   

zInternetTests.testVolatilec                    sf   t  ¡ }tj|_ t d|¡}| ¡  | ¡  |  |j	¡ t  
¡ }t ¡ ‰ ‡ fdd„|_t d|¡ ˆ S )Nrî   c                     rå   r)   ræ   rç   ré   r   r   rÉ   è  rê   z2InternetTests.testStoppingServer.<locals>.<lambda>)r   rÎ   r   rë   r   rï   rB   rD   r@   rA   rÔ   r	   rÏ   rì   r   ÚconnectUNIXrò   r   ré   r   ÚtestStoppingServerÛ  s   z InternetTests.testStoppingServerc                 C   sJ   t ƒ }t d|jd¡}| ¡  t |¡}| ¡  t |¡}|  	|j
¡ d S )NrN   r    )rº   r   ÚTimerServicer¾   rB   rx   ÚdumpsrD   Úloadsr@   rA   )r&   ÚtargetÚt0r'   rJ   r   r   r   ÚtestPickledTimerì  s   

zInternetTests.testPickledTimerc                    sb   t  ¡ ‰ t ddd„ ¡‰ˆj‰‡ ‡fdd„}|ˆ_ˆ ¡  ˆ  ‡fdd„¡ ˆ  ‡fdd„¡ ˆ S )NrN   c                   S   s   dd S )NrN   r   r   r   r   r   r   rÉ   ø  rÊ   z/InternetTests.testBrokenTimer.<locals>.<lambda>c                    s   ˆ| ƒ ˆ   d ¡ d S r)   ræ   )Úwhy)r®   Ú	oldFailedr   r   Ú_failedû  r­   z.InternetTests.testBrokenTimer.<locals>._failedc                    s   ˆ j S r)   rÆ   rÇ   rã   r   r   rÉ     rÍ   c                    s   ˆ   tgdd„ ˆ  t¡D ƒ¡S )Nc                 S   s   g | ]}|j j‘qS r   )ÚvalueÚ	__class__)Ú.0Úor   r   r   Ú
<listcomp>  s    zCInternetTests.testBrokenTimer.<locals>.<lambda>.<locals>.<listcomp>)r#   ÚZeroDivisionErrorÚflushLoggedErrorsrÇ   rh   r   r   rÉ     s    þ)r	   rÏ   r   rú   r  rB   rÖ   )r&   r  r   )r®   r  r&   rJ   r   ÚtestBrokenTimerö  s   
ÿzInternetTests.testBrokenTimerc                 C   sì   g d¢}|dd… D ]}t td| ƒtdƒs| |¡ q
|D ]U}dD ]P}|dkr-|dkr-q"|dkr6|dkr6q"|  tt|| ƒ¡ t t|| ƒj}dd	dœ| }|  tt|| ƒp_|d	ko_|dk¡ t t|| ƒƒ }|  t	 
|¡|¡ q"q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ÚClientr  r  r  ÚlistenÚconnect)Úgetattrr
   r   ÚremoverC   Úhasattrr   Úmethodr#   r   rf   )r&   ÚtransÚtranÚsider  Úprefixr  r   r   r   Útest_everythingThere
  s,   
€þóÿz"InternetTests.test_everythingTherec                 C   s(   t jD ]}|  tt |ƒ|› d¡ q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__rC   r  )r&   Úclsr   r   r   Útest_importAll$  s   
þÿzInternetTests.test_importAllc                 C   sF   t ƒ }tƒ }tjd||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Ð   rB   r#   Ú
tcpServersÚpop©r&   r   r©   rJ   r   r   r   Ú#test_reactorParametrizationInServer0  s
   "z1InternetTests.test_reactorParametrizationInServerc                 C   sL   t ƒ }t ¡ }tjd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Ã   r"  r#  Né   )	r   r   rÔ   r   rÕ   rB   r#   Ú
tcpClientsr'  r(  r   r   r   Ú#test_reactorParametrizationInClient=  s
   $z1InternetTests.test_reactorParametrizationInClientc                 C   sv   t ƒ }t ¡ }tjd||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.
        r"  r#  Nr$  )
r   r   ÚFactoryr   rÐ   rB   r#   r&  r'  rD   r(  r   r   r   Ú0test_reactorParametrizationInServerMultipleStartJ  s   "z>InternetTests.test_reactorParametrizationInServerMultipleStartc                 C   s|   t ƒ }t ¡ }tjd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Ã   r"  r#  Nr*  )
r   r   rÔ   r   rÕ   rB   r#   r+  r'  rD   r(  r   r   r   Ú0test_reactorParametrizationInClientMultipleStartY  s    $z>InternetTests.test_reactorParametrizationInClientMultipleStart)r   r   r   rØ   rá   rU   rí   r   r
   ÚIReactorUNIXr   ró   rñ   r÷   rù   rÿ   r
  r  r!  r)  r,  r.  r/  r   r   r   r   rÂ   R  s:    þ

þ
þ

rÂ   c                   @   ro   )
ÚTimerBasicTestsc                    sZ   t  ¡ }t d|jd¡ˆ _ˆ j ¡  | ˆ jd¡ | ‡ fdd„¡ | ‡ fdd„¡ |S )NrN   r    c                    ó
   ˆ j  ¡ S r)   ©rJ   rD   rÇ   rh   r   r   rÉ   o  rê   z/TimerBasicTests.testTimerRuns.<locals>.<lambda>c                    s   ˆ   ˆ jj¡S r)   )r@   rJ   rA   rÇ   rh   r   r   rÉ   p  s    )	r	   rÏ   r   rú   r¯   rJ   rB   rÖ   r#   )r&   r®   r   rh   r   ÚtestTimerRunsj  s   
zTimerBasicTests.testTimerRunsc                 C   s
   | j  ¡ S r)   r3  rh   r   r   r   ÚtearDowns  rR   zTimerBasicTests.tearDownc                    sŒ   t  ¡ }t  ¡ ‰ ˆ df|dfg‰‡fdd„}t d|¡ˆ_ˆj ¡  ‡fdd„}‡ ‡fdd	„}‡fd
d„}| |¡ | |¡ | |¡ |S )NÚbarÚfooc                     s   ˆ   ¡ \} }|  |¡ d S r)   )r'  r¯   )r®   Úarg)Úworkr   r   Útrigger|  ó   z1TimerBasicTests.testTimerRestart.<locals>.triggerrN   c                    s   ˆ   | d¡ ˆ j ¡ S )Nr7  ©r#   rJ   rD   ©Úresultrh   r   r   ÚonFirstResultƒ  s   
z7TimerBasicTests.testTimerRestart.<locals>.onFirstResultc                    s   ˆ  ˆjj¡ ˆj ¡  ˆ S r)   )r@   rJ   rA   rB   )rÚ   )Úd2r&   r   r   ÚonFirstStop‡  s   
z5TimerBasicTests.testTimerRestart.<locals>.onFirstStopc                    s   ˆ   | d¡ ˆ j ¡  d S )Nr6  r<  r=  rh   r   r   ÚonSecondResultŒ  r;  z8TimerBasicTests.testTimerRestart.<locals>.onSecondResult)r	   rÏ   r   rú   rJ   rB   rÖ   )r&   Úd1r:  r?  rA  rB  r   )r@  r&   r9  r   ÚtestTimerRestartv  s   



z TimerBasicTests.testTimerRestartc                    s`   g ‰ ‡ fdd„}t  ¡ }t d|dd|¡ˆ_ˆj ¡  | ˆjdgd ¡ | ‡fdd„¡ |S )Nc                    s(   ˆ   | ¡ tˆ ƒ|kr| ˆ ¡ d S d S r)   )r¾   Úlenr¯   )ÚdataÚnumberr®   r»   r   r   r:  ˜  s   
ÿz/TimerBasicTests.testTimerLoops.<locals>.triggerg{®Gáz„?r    é
   c                    r2  r)   r3  rÇ   rh   r   r   rÉ   ¡  rê   z0TimerBasicTests.testTimerLoops.<locals>.<lambda>)r	   rÏ   r   rú   rJ   rB   rÖ   r#   )r&   r:  r®   r   )r¼   r&   r   ÚtestTimerLoops•  s   
zTimerBasicTests.testTimerLoopsN)r   r   r   r4  r5  rD  rI  r   r   r   r   r1  i  s
    	r1  c                   @   s   e Zd ZdZdd„ ZdS )ÚFakeReactorz6
    A fake reactor with a hooked install method.
    c                 O   s$   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&   rL  rè   Úkwargsr   r   r   r½   ª  s   
zFakeReactor.__init__N)r   r   r   Ú__doc__r½   r   r   r   r   rJ  ¥  s    rJ  c                   @   sz   e Zd ZdZdd„ Zdd„ Zd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 )ÚPluggableReactorTestsz:
    Tests for the reactor discovery/inspection APIs.
    c                 C   s    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Ú_getPluginsrh   r   r   r   ÚsetUp¸  s   	zPluggableReactorTests.setUpc                 C   s   | j t_dS )z>
        Restore the original L{reactors.getPlugins}.
        N)rS  r   rR  rh   r   r   r   r5  Æ  s   zPluggableReactorTests.tearDownNc                 C   s   | j  ||f¡ t| jƒS )zy
        Stand-in for the real getPlugins method which records its arguments
        and returns a fixed result.
        )rP  r¾   r,   rQ  )r&   Ú	interfaceÚpackager   r   r   rT  Ì  s   
z!PluggableReactorTests._getPluginsc                 C   sv   d}t d }d}t |||¡g| _t ¡ }|  | jtjdfg¡ |D ]}|j|kr3|  |j	|¡  dS q"|  
d¡ dS )zP
        Test that reactor plugins are returned from L{getReactorTypes}
        Úfakereactortestz.fakereactorÚdescriptionNz6Reactor plugin not present in getReactorTypes() result)r   r   rK  rQ  ÚgetReactorTypesr#   rP  ÚIReactorInstallerÚ	shortNamerY  Úfail)r&   r$   rW  rY  ÚreactorTypesÚrr   r   r   Útest_getPluginReactorTypesÔ  s   
þz0PluggableReactorTests.test_getPluginReactorTypesc                    sX   g ‰ ‡ fdd„}t |dtdƒ}d|i}|  |¡ t ddd¡}| ¡  |  ˆ dg¡ dS )zy
        Test that L{reactors.Reactor.install} loads the correct module and
        calls its install attribute.
        c                      ó   ˆ   d¡ d S rÁ   ©r¾   r   ©Ú	installedr   r   rL  î  r¹   z?PluggableReactorTests.test_reactorInstallation.<locals>.installrX  Ú	describedÚfakereactorTN)rJ  r   ÚreplaceSysModulesr   rK  rL  r#   )r&   rL  ÚfakeReactorÚmodulesÚ	installerr   rc  r   Útest_reactorInstallationç  s   
z.PluggableReactorTests.test_reactorInstallationc                    sJ   g ‰ ‡ fdd„}d}t }d}t||||ƒg| _t |¡ |  ˆ dg¡ dS )zu
        Test that the L{reactors.installReactor} function correctly installs
        the specified reactor.
        c                      ra  rÁ   rb  r   rc  r   r   rL  ÿ  r¹   z:PluggableReactorTests.test_installReactor.<locals>.installrX  rY  TN©r   rJ  rQ  r   ÚinstallReactorr#   ©r&   rL  r$   rW  rY  r   rc  r   Útest_installReactorø  s   
z)PluggableReactorTests.test_installReactorc                    sL   t ƒ ‰ ‡ ‡fdd„}d}t}d}t||||ƒgˆ_t |¡}ˆ |ˆ ¡ dS )zt
        Test that the L{reactors.installReactor} function correctly returns
        the installed reactor.
        c                     s   ddl m}  ˆ | dˆ ¡ d S )Nr   ©r   r   )Útwistedr   Úpatchrp  ©r   r&   r   r   rL    s   zHPluggableReactorTests.test_installReactorReturnsReactor.<locals>.installrX  rY  N)r%  r   rJ  rQ  r   rm  rv   )r&   rL  r$   rW  rY  rd  r   rs  r   Ú!test_installReactorReturnsReactor	  s   
z7PluggableReactorTests.test_installReactorReturnsReactorc                    sb   g ‰ ‡ fdd„}d}t }d}t||||ƒ}tdd„ d||ƒ}||g| _t |¡ |  ˆ dg¡ d	S )
z
        Test that the L{reactors.installReactor} function correctly installs
        the specified reactor when there are multiple reactor plugins.
        c                      ra  rÁ   rb  r   rc  r   r   rL  #  r¹   zIPluggableReactorTests.test_installReactorMultiplePlugins.<locals>.installrX  rY  c                   S   s   d S r)   r   r   r   r   r   rÉ   *  ó    zJPluggableReactorTests.test_installReactorMultiplePlugins.<locals>.<lambda>ÚotherreactorTNrl  )r&   rL  r$   rW  rY  rh  ÚotherReactorr   rc  r   Ú"test_installReactorMultiplePlugins  s   

z8PluggableReactorTests.test_installReactorMultiplePluginsc                 C   s   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)rQ  r9   r   ÚNoSuchReactorrm  rh   r   r   r   Útest_installNonExistentReactor/  s   
ÿz4PluggableReactorTests.test_installNonExistentReactorc                 C   s:   d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                   S   s   t dƒ‚)NúMissing foo bar©ÚImportErrorr   r   r   r   rL  ?  ó   zFPluggableReactorTests.test_installNotAvailableReactor.<locals>.installrX  rY  N)r   rJ  rQ  r9   r~  r   rm  rn  r   r   r   Útest_installNotAvailableReactor9  s   z5PluggableReactorTests.test_installNotAvailableReactorc                    s’   g ‰d‰ d‰G ‡‡fdd„dt jtjƒ}‡ ‡fd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                       s   e Zd Ze‡ ‡fdd„ƒZdS )zQPluggableReactorTests.test_reactorSelectionMixin.<locals>.ReactorSelectionOptionsc                    s    ˆ  ˆ¡ dd ‡ fdd„dfgS )NÚ
subcommandc                      s   ˆ S r)   r   r   rh   r   r   rÉ   U  ru  zoPluggableReactorTests.test_reactorSelectionMixin.<locals>.ReactorSelectionOptions.subCommands.<locals>.<lambda>ztest subcommandrb  rh   ©ÚSUBCOMMAND_EVENTÚexecutedrh   r   ÚsubCommandsR  s   
z]PluggableReactorTests.test_reactorSelectionMixin.<locals>.ReactorSelectionOptions.subCommandsN)r   r   r   Úpropertyr…  r   r‚  r   r   ÚReactorSelectionOptionsQ  s    r‡  c                      s   ˆ  ˆ ¡ d S r)   rb  r   )ÚINSTALL_EVENTr„  r   r   rL  W  r¹   zAPluggableReactorTests.test_reactorSelectionMixin.<locals>.installrX  re  ©z	--reactorrX  r  r   rN   r   N)
r   ÚOptionsr   ÚReactorSelectionMixinrJ  r   rQ  ÚparseOptionsr#   Úcount)r&   r‡  rL  Úoptionsr   )rˆ  rƒ  r„  r   Útest_reactorSelectionMixinH  s   ÿz0PluggableReactorTests.test_reactorSelectionMixinc                 C   sh   G d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 )z\PluggableReactorTests.test_reactorSelectionMixinNonExistent.<locals>.ReactorSelectionOptionsN©r   r   r   r   r   r   r   r‡  k  ó    r‡  r‰  rX  r   úhelp-reactorsN)r   rŠ  r   r‹  rQ  r   ÚmessageOutputr9   Ú
UsageErrorrŒ  ÚassertInrè   )r&   r‡  rŽ  Úer   r   r   Ú%test_reactorSelectionMixinNonExistentd  s   ýz;PluggableReactorTests.test_reactorSelectionMixinNonExistentc                    s   G dd„ dt jtjƒ}d‰ ‡ fd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                   @   r  )z]PluggableReactorTests.test_reactorSelectionMixinNotAvailable.<locals>.ReactorSelectionOptionsNr‘  r   r   r   r   r‡    r’  r‡  r|  c                      s   t ˆ ƒ‚r)   r}  r   ©Úmessager   r   rL  †  r  zMPluggableReactorTests.test_reactorSelectionMixinNotAvailable.<locals>.installrX  rY  r‰  r   r“  N)r   rŠ  r   r‹  r   rJ  rQ  r   r”  r9   r•  rŒ  r–  rè   )r&   r‡  rL  r$   rW  rY  rŽ  r—  r   r™  r   Ú&test_reactorSelectionMixinNotAvailablez  s    ýz<PluggableReactorTests.test_reactorSelectionMixinNotAvailabler)   )r   r   r   rN  rU  r5  rT  r`  rk  ro  rt  rx  r{  r€  r  r˜  r›  r   r   r   r   rO  ³  s    

rO  c                   @   sr   e Zd ZdZdd„ Zeedƒdd„ ƒZee dƒdd	„ ƒZee	d
kdƒdd„ ƒZ
ee	d
kdƒdd„ ƒZdd„ ZdS )ÚHelpReactorsTestsz6
    --help-reactors lists the available reactors
    c                 C   s6   t  ¡ | _tƒ | j_|  t| jj¡ | jj ¡ | _	dS )z3
        Get the text from --help-reactors
        N)
r   r‹  rŽ  r   r”  r9   Ú
SystemExitÚopt_help_reactorsÚgetvaluerš  rh   r   r   r   rU  ž  s   

zHelpReactorsTests.setUpz$Not applicable, asyncio is availablec                 C   ó,   |   tjj| j¡ |   dtjj | j¡ dS )zX
        --help-reactors should NOT display the asyncio reactor on Python < 3.4
        ú!N)r–  r   ÚasynciorY  rš  r\  rh   r   r   r   Útest_lacksAsyncIO§  ó   z#HelpReactorsTests.test_lacksAsyncIOzasyncio library not availablec                 C   ó,   |   tjj| j¡ |  dtjj | j¡ dS )zU
        --help-reactors should display the asyncio reactor on Python >= 3.4
        r¡  N)r–  r   r¢  rY  rš  ÚassertNotInr\  rh   r   r   r   Útest_hasAsyncIO¯  r¤  z!HelpReactorsTests.test_hasAsyncIOÚwin32zTest only applicable on Windowsc                 C   r¥  )zL
        --help-reactors should display the iocp reactor on Windows
        r¡  N)r–  r   ÚiocprY  rš  r¦  r\  rh   r   r   r   Útest_iocpWin32·  r¤  z HelpReactorsTests.test_iocpWin32zTest not applicable on Windowsc                 C   r   )zP
        --help-reactors should NOT display the iocp reactor on Windows
        r¡  N)r–  r   r©  rY  rš  r\  rh   r   r   r   Útest_iocpNotWin32¿  r¤  z#HelpReactorsTests.test_iocpNotWin32c                 C   sF   dd„ }t  ¡ }||_tƒ |_|  t|j¡ |j ¡ }|  	d|¡ dS )z>
        --help-reactors with only supported reactors
        c                   s   s    t jV  d S r)   )r   Údefaultr   r   r   r   rZ  Ì  s   €zEHelpReactorsTests.test_onlySupportedReactors.<locals>.getReactorTypeszreactors not availableN)
r   r‹  Ú_getReactorTypesr   r”  r9   r  rž  rŸ  r¦  )r&   rZ  rŽ  rš  r   r   r   Útest_onlySupportedReactorsÇ  s   
z,HelpReactorsTests.test_onlySupportedReactorsN)r   r   r   rN  rU  r   r¢  r£  r§  r   rª  r«  r®  r   r   r   r   rœ  ™  s    	




rœ  c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚBackoffPolicyTestsz@
    Tests of L{twisted.application.internet.backoffPolicy}
    c                 C   sh   t dd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                   S   ó   dS rM   r   r   r   r   r   rÉ   à  ru  zCBackoffPolicyTests.test_calculates_correct_values.<locals>.<lambda>©Újitterr   r$  rN   g      @rH  g     UM@é   é=   éd   N)r   ÚassertAlmostEqualr#   ©r&   Úpolr   r   r   Útest_calculates_correct_valuesÜ  s   z1BackoffPolicyTests.test_calculates_correct_valuesc                 C   s8   t dd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                   S   r³  rM   r   r   r   r   r   rÉ   ï  ru  zLBackoffPolicyTests.test_does_not_overflow_on_high_attempts.<locals>.<lambda>r´  é×  r·  i@B N©r   r#   rº  r   r   r   Ú'test_does_not_overflow_on_high_attemptsç  s   z:BackoffPolicyTests.test_does_not_overflow_on_high_attemptsc                 C   s(   t dd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                   S   r³  rM   r   r   r   r   r   rÉ   ù  ru  zSBackoffPolicyTests.test_does_not_overflow_with_large_factor_value.<locals>.<lambda>r´  r½  r·  Nr¾  rº  r   r   r   Ú.test_does_not_overflow_with_large_factor_valueó  s   zABackoffPolicyTests.test_does_not_overflow_with_large_factor_valueN)r   r   r   rN  r¼  r¿  rÀ  r   r   r   r   r¯  ×  s
    r¯  )ArN  rV   Úosrx   Ú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   r  rX   ÚcuruidÚgetgidÚcurgidrZ   rd   rp   r~   rŽ   ÚLineReceiverr¤   r³   rº   rë   rÀ   rÂ   r1  rK  rJ  rO  rœ  r¯  r   r   r   r   Ú<module>   s\   ÿ
{
/
  < g>