U
    P|jZ…  ã                   @   s:  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k
rL   dZY nX 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 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&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)ÚMemoryReactor)Úsob)Útwisted_reactors)ÚbasicÚwire)Úusage)ÚplatformType)ÚTwistedModulesMixin)ÚSkipTestÚTestCasec                   @   s   e Zd ZdZdS )ÚDummyN)Ú__name__Ú
__module__Ú__qualname__ÚprocessName© r   r   úA/tmp/pip-unpacked-wheel-audpp6lv/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-   Z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   r7   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?   r@   rA   rB   rC   r.   r   r   r   ÚtestRunningChildren1f   s    
z!ServiceTests.testRunningChildren1c                    sZ   t  ¡ ‰ ‡ ‡fdd„}t  ¡ }||_||_t  ¡ }ˆ  |¡ | |¡ | ¡  | ¡  d S )Nc                      s   ˆ  ˆ j¡ d S r)   )rB   r@   r   ©r'   r&   r   r   ÚcheckRunningv   s    z7ServiceTests.testRunningChildren2.<locals>.checkRunning)r   r!   rC   rA   r*   r+   )r&   rG   Útr/   r   rF   r   ÚtestRunningChildren2s   s    

z!ServiceTests.testRunningChildren2c                 C   sR   t  ¡ }| ¡  t  ¡ }|  |j¡ | |¡ |  |j¡ | ¡  |  |j¡ d S r)   )	r   r*   rA   r!   r?   r@   r+   rB   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�   s    z(ServiceTests.testPrivileged.<locals>.pss)r   r!   ÚprivilegedStartServicer*   r+   rB   rM   )r&   rO   Ús1r/   r   rN   r   ÚtestPrivilegedŒ   s    

zServiceTests.testPrivilegedc                 C   s6   t  ¡ }| ¡  t |¡}|  |j¡ |  |j¡ d S r)   )r   r!   rA   Úcopyr?   r@   rB   )r&   r'   rQ   r   r   r   ÚtestCopyingš   s
    
zServiceTests.testCopyingN)r   r   r   r(   r0   r4   r5   r:   r;   r>   rD   rE   rI   rJ   rR   rT   r   r   r   r   r   '   s   		

r   Úgetuidc                   @   s$   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 )NrW   )r[   )r   rY   r#   rZ   r=   r[   r\   r   r   r   ÚtestDefaults¯   s    
zProcessTests.testDefaultsc                 C   s,   t  ¡ }|  |j¡ d|_|  |jd¡ d S r   )r   rY   r=   r   r#   r\   r   r   r   ÚtestProcessNameº   s    zProcessTests.testProcessNameN)r   r   r   r]   r^   r_   r   r   r   r   rV   ©   s   rV   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚInterfacesTestsc                 C   s   |   tj t ¡ ¡¡ d S r)   )rB   r   ÚIServiceÚ
providedByr!   ©r&   r   r   r   ÚtestServiceÂ   s    zInterfacesTests.testServicec                 C   s0   |   tj t ¡ ¡¡ |   tj t ¡ ¡¡ d S r)   )rB   r   ra   rb   r*   r3   rc   r   r   r   ÚtestMultiServiceÅ   s    z InterfacesTests.testMultiServicec                 C   s   |   tj t ¡ ¡¡ d S r)   )rB   r   ÚIProcessrb   rY   rc   r   r   r   ÚtestProcessÉ   s    zInterfacesTests.testProcessN)r   r   r   rd   re   rg   r   r   r   r   r`   Á   s   r`   c                   @   s,   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    rW   rX   )r   r2   rc   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 ri   )r   r2   r=   rf   rZ   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   ÚassertIsra   r3   r#   r$   r=   r-   rk   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$   rn   Úoriginal)r&   rl   r/   r   r   r   ÚtestPersistableComponentä   s
    

z)ApplicationTests.testPersistableComponentN)r   r   r   rj   rm   ro   rt   r   r   r   r   rh   Í   s   rh   c                   @   s   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 5 Q R X 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   rq   ÚsplitÚsetStyleÚsaveÚloadApplicationr#   ra   r$   ÚopenÚ
writelines)r&   rl   r/   rr   Úa1Úfr   r   r   Útest_simpleStoreAndLoadí   s    


þÿz$LoadingTests.test_simpleStoreAndLoadN)r   r   r   rƒ   r   r   r   r   ru   ì   s   ru   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚAppSupportTestsc                 C   s   |   t d¡¡ d S )Nr   )r=   r   ZgetPassphraserc   r   r   r   ÚtestPassphrase  s    zAppSupportTests.testPassphrasec              	   C   sÚ   t  d¡}ddddœ}d ¡ D ]b}| ¡ }d|ddi ||¡< t |¡ |¡ t |¡jdd� t	 
|d¡}|  t  |¡jd¡ q| ¡ }d|d	< tdd
ƒ�}| ddg¡ W 5 Q R X t	 
|d¡}|  t  |¡jd¡ dS )zL
        Test loading an application file in different dump format.
        r    N)ÚfileÚsourcerz   rv   Zhelloapplicationrp   r†   ©Úfilenamerz   rw   rx   ry   )r   r2   r{   rS   Úgetr   rq   r|   r}   r   ZgetApplicationr#   ra   r$   r   r€   )r&   rl   Z
baseconfigrr   Úconfigr�   r‚   r   r   r   ÚtestLoadApplication  s&    
þÿz#AppSupportTests.testLoadApplicationc              
   C   s€   t  d¡}d ¡ D ]h}d ¡ D ]Z}t |¡ |¡ t |¡jdd� t d|d d|d¡ t  	d|¡}|  
t  |¡jd¡ qqd S )Nr6   rv   Zconverttestrˆ   zconverttest.outr   )r   r2   r{   r   rq   r|   r}   r   ZconvertStyler~   r#   ra   r$   )r&   ÚapplZinstyleZoutstyleZappl2r   r   r   Útest_convertStyle  s    
     ÿz!AppSupportTests.test_convertStylec                 C   s,   t  d¡}t |d¡ |  t  |¡j¡ d S )Nr6   r   )r   r2   r   ZstartApplicationrB   ra   r@   )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                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚFooc                 C   s   | j  d¡ d S )Ns   lalala
)Ú	transportÚwriterc   r   r   r   ÚconnectionMade0  s    zFoo.connectionMadec                 C   s   || j _| j ¡  d S r)   )ÚfactoryÚliner‘   ZloseConnection)r&   r•   r   r   r   ÚlineReceived3  s    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�   /  s   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)   ©Zservicesr$   ©r&   r   r   r   r   Ú
addService>  s    zDummyApp.addServicec                 C   s   | j |j= d S r)   r�   rž   r   r   r   ÚremoveServiceA  s    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)   ©Úlrc   r   r   r   Ú__init__F  s    zTimerTarget.__init__c                 C   s   | j  |¡ d S r)   )r£   Úappend)r&   Úwhatr   r   r   r¥   I  s    zTimerTarget.appendN)r   r   r   r¤   r¥   r   r   r   r   r¡   E  s   r¡   c                   @   s   e Zd Zdd„ ZdS )ÚTestEchoc                 C   s   | j  d¡ d S ©NT)r—   r˜   r™   r   r   r   r›   N  s    zTestEcho.connectionLostN)r   r   r   r›   r   r   r   r   r§   M  s   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   ˆ   ¡ S r)   ©rC   ©ÚxrN   r   r   Ú<lambda>b  ó    z'InternetTests.testTCP.<locals>.<lambda>c                 S   s   t jS r)   ©r§   r—   r­   r   r   r   r¯   c  r°   )r   r*   rA   r   ÚServerFactoryr§   r	   ÚDeferredr—   r   Ú	TCPServerr+   Ú_portÚgetHostÚportÚClientFactoryr�   r•   Ú	TCPClientÚaddCallbackr#   )r&   r”   rH   Únumr   rN   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   Ú	UDPServerrA   rC   )ÚignoredrH   ©r»   r/   r   r   ÚonStopt  s    z&InternetTests.test_UDP.<locals>.onStop)r
   ZIReactorUDPr   r   r   ZDatagramProtocolr   r½   rA   rµ   r¶   r·   ZassertNotEqualr	   ZmaybeDeferredrC   rº   )r&   rH   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   rL   rª   r«   c                    s   ˆ   ¡ S r)   r¬   r­   )Úcr   r   r¯   Š  r°   z.InternetTests.testPrivileged.<locals>.<lambda>c                    s   ˆ   ¡ S r)   r¬   r­   ©rH   r   r   r¯   ‹  r°   c                 S   s   t jS r)   r±   r­   r   r   r   r¯   Œ  r°   )r   r²   r§   r	   r³   r—   r   r´   Z
privilegedrP   rµ   r¶   r·   r¸   r�   r•   r¹   rA   rº   r#   )r&   r”   r»   r   )rÂ   rH   r   rR   {  s$    

zInternetTests.testPrivilegedc                    sp   t  ¡ }tj|_ t d|¡}| ¡  |j ¡ j	}| 
¡  t ¡ ‰ t  ¡ }‡ fdd„|_t d||¡}| ¡  ˆ S )Nr   c                     s
   ˆ   d ¡S r)   ©r˜   ©Úargs©r—   r   r   r¯   ˜  r°   z<InternetTests.testConnectionGettingRefused.<locals>.<lambda>rª   )r   r²   r   ÚEchor   r´   rA   rµ   r¶   r·   rC   r	   r³   r¸   ÚclientConnectionFailedr¹   )r&   r”   rH   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                    s   ˆ   ¡ S r)   r¬   r­   rN   r   r   r¯   ±  r°   z(InternetTests.testUNIX.<locals>.<lambda>c                 S   s   t jS r)   r±   r­   r   r   r   r¯   ²  r°   )r   r*   rA   r   r²   r§   r	   r³   r—   r   Ú
UNIXServerr+   r¸   r�   r•   Ú
UNIXClientrº   r#   Ú_cbTestUnix©r&   r”   rH   r   rN   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                    s   ˆ   ¡ S r)   r¬   r­   rN   r   r   r¯   ¼  r°   z+InternetTests._cbTestUnix.<locals>.<lambda>c                 S   s   t jS r)   r±   r­   r   r   r   r¯   ½  r°   )r	   r³   r§   r—   r•   rA   rº   r#   )r&   r¾   r”   r'   r   rN   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Ì   rA   ZfailIfIdenticalrµ   rS   r=   rC   r?   r@   r¸   rÍ   Ú_connection)r&   r”   rH   Ú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                     s
   ˆ   d ¡S r)   rÄ   rÅ   rÇ   r   r   r¯   è  r°   z2InternetTests.testStoppingServer.<locals>.<lambda>)r   r²   r   rÈ   r   rÌ   rA   rC   r?   r@   r¸   r	   r³   rÉ   r   ZconnectUNIXrÏ   r   rÇ   r   ÚtestStoppingServerÛ  s    z InternetTests.testStoppingServerc                 C   sJ   t ƒ }t d|jd¡}| ¡  t |¡}| ¡  t |¡}|  	|j
¡ d S )NrL   r    )r¡   r   ÚTimerServicer¥   rA   rp   ÚdumpsrC   Úloadsr?   r@   )r&   ÚtargetÚt0r'   rH   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 )NrL   c                   S   s   dd S )NrL   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û  s    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#   ÚZeroDivisionErrorZflushLoggedErrorsr­   rc   r   r   r¯     s   þ)r	   r³   r   rÕ   rÝ   rA   rº   )r&   rÝ   r   )r—   rÜ   r&   rH   r   ÚtestBrokenTimerö  s    
ÿzInternetTests.testBrokenTimerc                 C   sô   ddddddg}|dd… D ]"}t td| ƒtdƒs| |¡ q|D ]ª}d	D ] }|dkrb|d
krbqL|dkrt|d
krtqL|  tt|| ƒ¡ t t|| ƒj}ddd	œ| }|  tt|| ƒpÆ|dkoÆ|dk¡ t t|| ƒƒ }|  t	 
|¡|¡ qLqDd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.
        ZTCPZUNIXZSSLZUDPZUNIXDatagramZ	MulticastNZIReactor)ÚServerÚClientræ   ÚlistenÚconnect)Úgetattrr
   r   ÚremoverB   Úhasattrr   Úmethodr#   r   ra   )r&   ZtransZtranZ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__rB   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´   rA   r#   Ú
tcpServersÚpop©r&   r   r”   rH   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¹   rA   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   ZFactoryr   r´   rA   r#   rö   r÷   rC   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¹   rA   r#   rû   r÷   rC   rø   r   r   r   Ú0test_reactorParametrizationInClientMultipleStartY  s     z>InternetTests.test_reactorParametrizationInClientMultipleStart)r   r   r   r¼   rÁ   rR   rÊ   r   r
   ZIReactorUNIXr   rÐ   rÎ   rÓ   rÔ   rÚ   rä   rî   rñ   rù   rü   rý   rþ   r   r   r   r   r©   R  s8   þ

þ
þ

r©   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚTimerBasicTestsc                    sZ   t  ¡ }t d|jd¡ˆ _ˆ j ¡  | ˆ jd¡ | ‡ fdd„¡ | ‡ fdd„¡ |S )NrL   r    c                    s
   ˆ j  ¡ S r)   ©rH   rC   r­   rc   r   r   r¯   o  r°   z/TimerBasicTests.testTimerRuns.<locals>.<lambda>c                    s   ˆ   ˆ jj¡S r)   )r?   rH   r@   r­   rc   r   r   r¯   p  r°   )	r	   r³   r   rÕ   r˜   rH   rA   rº   r#   )r&   r—   r   rc   r   ÚtestTimerRunsj  s    
zTimerBasicTests.testTimerRunsc                 C   s
   | j  ¡ S r)   r   rc   r   r   r   ÚtearDowns  s    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|  s    z1TimerBasicTests.testTimerRestart.<locals>.triggerrL   c                    s   ˆ   | d¡ ˆ j ¡ S )Nr  ©r#   rH   rC   ©Úresultrc   r   r   ÚonFirstResultƒ  s    z7TimerBasicTests.testTimerRestart.<locals>.onFirstResultc                    s   ˆ  ˆjj¡ ˆj ¡  ˆ S r)   )r?   rH   r@   rA   )r¾   )Úd2r&   r   r   ÚonFirstStop‡  s    
z5TimerBasicTests.testTimerRestart.<locals>.onFirstStopc                    s   ˆ   | d¡ ˆ j ¡  d S )Nr  r  r	  rc   r   r   ÚonSecondResultŒ  s    z8TimerBasicTests.testTimerRestart.<locals>.onSecondResult)r	   r³   r   rÕ   rH   rA   rº   )r&   Úd1r  r  r  r  r   )r  r&   r  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 r)   )r¥   Úlenr˜   )ÚdataÚnumberr—   r¢   r   r   r  ˜  s    
z/TimerBasicTests.testTimerLoops.<locals>.triggerg{®Gáz„?r    é
   c                    s
   ˆ j  ¡ S r)   r   r­   rc   r   r   r¯   ¡  r°   z0TimerBasicTests.testTimerLoops.<locals>.<lambda>)r	   r³   r   rÕ   rH   rA   rº   r#   )r&   r  r—   r   )r£   r&   r   ÚtestTimerLoops•  s    
zTimerBasicTests.testTimerLoopsN)r   r   r   r  r  r  r  r   r   r   r   rÿ   i  s   	rÿ   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| f|ž|Ž || _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Æ   Úkwargsr   r   r   r¤   ª  s    zFakeReactor.__init__N)r   r   r   Ú__doc__r¤   r   r   r   r   r  ¥  s   r  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Ú_getPluginsrc   r   r   r   ÚsetUp¸  s    	zPluggableReactorTests.setUpc                 C   s   | j t_dS )z>
        Restore the original L{reactors.getPlugins}.
        N)r  r   r  rc   r   r   r   r  Æ  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.
        )r  r¥   r,   r  )r&   Z	interfaceÚpackager   r   r   r   Ì  s    z!PluggableReactorTests._getPluginsc                 C   st   d}t d }d}t |||¡g| _t ¡ }|  | jtjdfg¡ |D ] }|j|krD|  |j	|¡  qpqD|  
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  ZIReactorInstallerÚ	shortNamer$  Zfail)r&   r$   r"  r$  Z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                      s   ˆ   d¡ d S r¨   ©r¥   r   ©Ú	installedr   r   r  î  s    z?PluggableReactorTests.test_reactorInstallation.<locals>.installr#  Ú	describedZfakereactorTN)r  r   ZreplaceSysModulesr   r  r  r#   )r&   r  ÚfakeReactorÚmodulesÚ	installerr   r*  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                      s   ˆ   d¡ d S r¨   r)  r   r*  r   r   r  ÿ  s    z:PluggableReactorTests.test_installReactor.<locals>.installr#  r$  TN©r   r  r  r   ÚinstallReactorr#   ©r&   r  r$   r"  r$  r   r*  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   )Ztwistedr   Úpatchr5  ©r   r&   r   r   r    s    zHPluggableReactorTests.test_installReactorReturnsReactor.<locals>.installr#  r$  N)rõ   r   r  r  r   r2  rn   )r&   r  r$   r"  r$  r+  r   r7  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                      s   ˆ   d¡ d S r¨   r)  r   r*  r   r   r  #  s    zIPluggableReactorTests.test_installReactorMultiplePlugins.<locals>.installr#  r$  c                   S   s   d S r)   r   r   r   r   r   r¯   *  r°   zJPluggableReactorTests.test_installReactorMultiplePlugins.<locals>.<lambda>ZotherreactorTNr1  )r&   r  r$   r"  r$  r-  ZotherReactorr   r*  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.
        ZsomereactorN)r  r8   r   ZNoSuchReactorr2  rc   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ƒ‚d S )NúMissing foo bar©ÚImportErrorr   r   r   r   r  ?  s    zFPluggableReactorTests.test_installNotAvailableReactor.<locals>.installr#  r$  N)r   r  r  r8   r=  r   r2  r3  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| _|ƒ }| d	dd
g¡ |  ˆ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   rc   r   r   r¯   U  r°   zoPluggableReactorTests.test_reactorSelectionMixin.<locals>.ReactorSelectionOptions.subCommands.<locals>.<lambda>ztest subcommandr)  rc   ©ÚSUBCOMMAND_EVENTÚexecutedrc   r   ÚsubCommandsR  s    
z]PluggableReactorTests.test_reactorSelectionMixin.<locals>.ReactorSelectionOptions.subCommandsN)r   r   r   ÚpropertyrC  r   r@  r   r   ÚReactorSelectionOptionsQ  s   rE  c                      s   ˆ  ˆ ¡ d S r)   r)  r   )ÚINSTALL_EVENTrB  r   r   r  W  s    zAPluggableReactorTests.test_reactorSelectionMixin.<locals>.installr#  r,  ú	--reactorr?  r   rL   r   N)
r   ÚOptionsr   ÚReactorSelectionMixinr  r   r  ÚparseOptionsr#   Úcount)r&   rE  r  Úoptionsr   )rF  rA  rB  r   Útest_reactorSelectionMixinH  s    ÿz0PluggableReactorTests.test_reactorSelectionMixinc                 C   sj   G dd„ dt jtjƒ}g | _|ƒ }tƒ |_|  t j|j	dddg¡}|  
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                   @   s   e Zd ZdS )z\PluggableReactorTests.test_reactorSelectionMixinNonExistent.<locals>.ReactorSelectionOptionsN©r   r   r   r   r   r   r   rE  k  s   rE  rG  r#  r?  r   úhelp-reactorsN)r   rH  r   rI  r  r   ÚmessageOutputr8   Ú
UsageErrorrJ  ÚassertInrÆ   )r&   rE  rL  Ú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ddd	g¡}|  ˆ |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                   @   s   e Zd ZdS )z]PluggableReactorTests.test_reactorSelectionMixinNotAvailable.<locals>.ReactorSelectionOptionsNrN  r   r   r   r   rE  �  s   rE  r;  c                      s   t ˆ ƒ‚d S r)   r<  r   ©Úmessager   r   r  †  s    zMPluggableReactorTests.test_reactorSelectionMixinNotAvailable.<locals>.installr#  r$  rG  r?  r   rO  N)r   rH  r   rI  r   r  r  r   rP  r8   rQ  rJ  rR  rÆ   )r&   rE  r  r$   r"  r$  rL  rS  r   rU  r   Ú&test_reactorSelectionMixinNotAvailablez  s     ýz<PluggableReactorTests.test_reactorSelectionMixinNotAvailable)N)r   r   r   r  r!  r  r   r(  r0  r4  r8  r9  r:  r>  rM  rT  rW  r   r   r   r   r  ³  s   

r  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   rI  rL  r   rP  r8   Ú
SystemExitÚopt_help_reactorsÚgetvaluerV  rc   r   r   r   r!  ž  s    

zHelpReactorsTests.setUpz$Not applicable, asyncio is availablec                 C   s,   |   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)rR  r   Úasyncior$  rV  r&  rc   r   r   r   Útest_lacksAsyncIO§  s    z#HelpReactorsTests.test_lacksAsyncIOzasyncio library not availablec                 C   s,   |   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)rR  r   r]  r$  rV  ÚassertNotInr&  rc   r   r   r   Útest_hasAsyncIO¯  s    z!HelpReactorsTests.test_hasAsyncIOÚwin32zTest only applicable on Windowsc                 C   s,   |   tjj| j¡ |  dtjj | j¡ dS )zL
        --help-reactors should display the iocp reactor on Windows
        r\  N)rR  r   Úiocpr$  rV  r_  r&  rc   r   r   r   Útest_iocpWin32·  s    z HelpReactorsTests.test_iocpWin32zTest not applicable on Windowsc                 C   s,   |   tjj| j¡ |   dtjj | j¡ dS )zP
        --help-reactors should NOT display the iocp reactor on Windows
        r\  N)rR  r   rb  r$  rV  r&  rc   r   r   r   Útest_iocpNotWin32¿  s    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   r%  Ì  s    zEHelpReactorsTests.test_onlySupportedReactors.<locals>.getReactorTypeszreactors not availableN)
r   rI  Z_getReactorTypesr   rP  r8   rY  rZ  r[  r_  )r&   r%  rL  rV  r   r   r   Útest_onlySupportedReactorsÇ  s    
z,HelpReactorsTests.test_onlySupportedReactorsN)r   r   r   r  r!  r   r]  r^  r`  r   rc  rd  rf  r   r   r   r   rX  ™  s   	




rX  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   s   dS rK   r   r   r   r   r   r¯   à  r°   zCBackoffPolicyTests.test_calculates_correct_values.<locals>.<lambda>©Újitterr   rô   rL   g      @r  g     UM@é   é=   éd   N)r   ZassertAlmostEqualr#   ©r&   Z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
        rh  ri  rj  c                   S   s   dS rK   r   r   r   r   r   r¯   ï  r°   zLBackoffPolicyTests.test_does_not_overflow_on_high_attempts.<locals>.<lambda>rk  é×  rn  i@B N©r   r#   rp  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
        rh  ri  g    _ Bc                   S   s   dS rK   r   r   r   r   r   r¯   ù  r°   zSBackoffPolicyTests.test_does_not_overflow_with_large_factor_value.<locals>.<lambda>rk  rr  rn  Nrs  rp  r   r   r   Ú.test_does_not_overflow_with_large_factor_valueó  s    zABackoffPolicyTests.test_does_not_overflow_with_large_factor_valueN)r   r   r   r  rq  rt  ru  r   r   r   r   rg  ×  s   rg  )Ar  rS   Úosrp   Úior   r]  r=  Zunittestr   Ztwisted.applicationr   r   r   r   Ztwisted.application.internetr   Ztwisted.internetr	   r
   r   r   Ztwisted.internet.testingr   Ztwisted.persistedr   Ztwisted.pluginsr   Ztwisted.protocolsr   r   Ztwisted.pythonr   Ztwisted.python.runtimer   Z#twisted.python.test.modules_helpersr   Ztwisted.trial.unittestr   r   r   r   rë   rU   ZcuruidÚgetgidZcurgidrV   r`   rh   ru   r„   ZLineReceiverr�   rœ   r¡   rÈ   r§   r©   rÿ   r  r  r  rX  rg  r   r   r   r   Ú<module>   sX   
{
/
  < g>