U
    
W[0€  ã                   @   s2  d Z ddlmZmZ ddlZddlZddlZzddlZW n ek
rP   dZY nX ddl	m
Z
mZmZ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# ddl$m%Z% G dd„ dƒZ&G dd„ de%j'ƒZ(e)edƒr0e *¡ Z+e ,¡ Z-nd Z+Z-G dd„ de%j'ƒZ.G dd„ de%j'ƒZ/G dd„ de%j'ƒZ0G dd„ de%j'ƒZ1G dd„ de%j'ƒZ2G dd„ dej3ƒZ4G d d!„ d!ƒZ5G d"d#„ d#ƒZ6G d$d%„ d%ej7ƒZ8G d&d'„ d'e%j'ƒZ9G d(d)„ d)e%j'ƒZ:G d*d+„ d+ej;ƒZ<G d,d-„ d-e!e%j'ƒZ=G d.d/„ d/e%j'ƒZ>dS )0zU
Tests for L{twisted.application} and its interaction with
L{twisted.persisted.sob}.
é    )Úabsolute_importÚdivisionN)ÚserviceÚinternetÚappÚreactors)Ú
interfacesÚdeferÚprotocolÚreactor)Úsob)Útwisted_reactors)ÚwireÚbasic)Úusage)ÚNativeStringIO)ÚplatformType)ÚTwistedModulesMixin)ÚMemoryReactor)Úunittestc                   @   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   ÚtestApplicationAsParent3   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   ÚtestDoublyNamedChildC   s
    

z!ServiceTests.testDoublyNamedChildc                 C   sJ   t  ¡ }t  ¡ }| d¡ | |¡ t  ¡ }| d¡ |  t|j|¡ d S r   r6   r-   r   r   r   ÚtestDuplicateNamedChildJ   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   ÚtestDisowningS   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?   r@   rA   rB   r-   r   r   r   ÚtestRunningChildren1e   s    
z!ServiceTests.testRunningChildren1c                    sZ   t  ¡ ‰ ‡ ‡fdd„}t  ¡ }||_||_t  ¡ }ˆ  |¡ | |¡ | ¡  | ¡  d S )Nc                      s   ˆ  ˆ j¡ d S r(   )rA   r?   r   ©r&   r%   r   r   ÚcheckRunningt   s    z7ServiceTests.testRunningChildren2.<locals>.checkRunning)r   r    rB   r@   r)   r*   )r%   rF   Útr.   r   rE   r   ÚtestRunningChildren2r   s    

z!ServiceTests.testRunningChildren2c                 C   sR   t  ¡ }| ¡  t  ¡ }|  |j¡ | |¡ |  |j¡ | ¡  |  |j¡ d S r(   )	r   r)   r@   r    r>   r?   r*   rA   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*   rA   rK   )r%   rM   Ús1r.   r   rL   r   ÚtestPrivileged‰   s    

zServiceTests.testPrivilegedc                 C   s6   t  ¡ }| ¡  t |¡}|  |j¡ |  |j¡ d S r(   )r   r    r@   Úcopyr>   r?   rA   )r%   r&   rO   r   r   r   ÚtestCopying•   s
    
zServiceTests.testCopyingN)r   r   r   r'   r/   r3   r4   r9   r:   r=   rC   rD   rH   rI   rP   rR   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 )NrU   )rY   )r   rW   r"   rX   r<   rY   rZ   r   r   r   ÚtestDefaults«   s    
zProcessTests.testDefaultsc                 C   s,   t  ¡ }|  |j¡ d|_|  |jd¡ d S r   )r   rW   r<   r   r"   rZ   r   r   r   ÚtestProcessName¶   s    zProcessTests.testProcessNameN)r   r   r   r[   r\   r]   r   r   r   r   rT   ¤   s   rT   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(   )rA   r   ÚIServiceÚ
providedByr    ©r%   r   r   r   ÚtestService¿   s    zInterfacesTests.testServicec                 C   s0   |   tj t ¡ ¡¡ |   tj t ¡ ¡¡ d S r(   )rA   r   r_   r`   r)   r2   ra   r   r   r   ÚtestMultiServiceÂ   s    
ÿz InterfacesTests.testMultiServicec                 C   s   |   tj t ¡ ¡¡ d S r(   )rA   r   ÚIProcessr`   rW   ra   r   r   r   ÚtestProcessÇ   s    zInterfacesTests.testProcessN)r   r   r   rb   rc   re   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   rU   rV   )r   r1   ra   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 rg   )r   r1   r<   rd   rX   rY   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   r1   ÚassertIsr_   r2   r"   r#   r<   r,   ri   r   r   r   ÚtestServiceComponentÝ   s    
z%ApplicationTests.testServiceComponentc                 C   sB   t  d¡}t |¡}|  |jd¡ |  |jd¡ |  |j|¡ d S )Nr   Úpickle)	r   r1   r   ÚIPersistabler"   Ústyler#   rl   Zoriginal)r%   rj   r.   r   r   r   ÚtestPersistableComponentã   s
    

z)ApplicationTests.testPersistableComponentN)r   r   r   rh   rk   rm   rq   r   r   r   r   rf   Ë   s   rf   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   r1   r   ro   ÚsplitÚsetStyleÚsaveÚloadApplicationr"   r_   r#   ÚopenÚ
writelines)r%   rj   r.   rp   Úa1Úfr   r   r   Útest_simpleStoreAndLoadì   s    


þz$LoadingTests.test_simpleStoreAndLoadN)r   r   r   r€   r   r   r   r   rr   ê   s   rr   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getPassphrasera   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Úsourcerw   rs   Zhelloapplicationrn   rƒ   ©Úfilenamerw   rt   ru   rv   )r   r1   rx   rQ   Úgetr   ro   ry   rz   r   ZgetApplicationr"   r_   r#   r|   r}   )r%   rj   Z
baseconfigrp   Z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 )Nr5   rs   Zconverttestr…   zconverttest.outr   )r   r1   rx   r   ro   ry   rz   r   ZconvertStyler{   r"   r_   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 )Nr5   r   )r   r1   r   ZstartApplicationrA   r_   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Úwritera   r   r   r   ÚconnectionMade-  s    zFoo.connectionMadec                 C   s   || j _| j ¡  d S r(   )ÚfactoryÚliner   ZloseConnection)r%   r‘   r   r   r   ÚlineReceived/  s    zFoo.lineReceivedc                 C   s   | j j | j j¡ d S r(   )r   ÚdÚcallbackr‘   ©r%   Úreasonr   r   r   ÚconnectionLost2  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(   ©Úservicesr#   ©r%   r   r   r   r   Ú
addService8  s    zDummyApp.addServicec                 C   s   | j |j= d S r(   r™   r›   r   r   r   ÚremoveService:  s    zDummyApp.removeService)r   r   r   r   rœ   r   r   r   r   r   r˜   6  s   r˜   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚTimerTargetc                 C   s
   g | _ d S r(   ©Úlra   r   r   r   Ú__init__?  s    zTimerTarget.__init__c                 C   s   | j  |¡ d S r(   )r    Úappend)r%   Zwhatr   r   r   r¢   A  s    zTimerTarget.appendN)r   r   r   r¡   r¢   r   r   r   r   rž   >  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—   G  s    zTestEcho.connectionLostN)r   r   r   r—   r   r   r   r   r£   F  s   r£   c                   @   s®   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
e ed¡sjdZee_ee	_ee
_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(   ©rB   ©ÚxrL   r   r   Ú<lambda>]  ó    z'InternetTests.testTCP.<locals>.<lambda>c                 S   s   t jS r(   ©r£   r“   r©   r   r   r   r«   ^  r¬   )r   r)   r@   r
   ÚServerFactoryr£   r	   ÚDeferredr“   r   Ú	TCPServerr*   Ú_portÚgetHostÚportÚClientFactoryrŒ   r‘   Ú	TCPClientÚaddCallbackr"   )r%   r   rG   Únumr   rL   r   ÚtestTCPN  s"    


zInternetTests.testTCPc                    sj   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   Ú	UDPServerr@   rB   )ÚignoredrG   ©r·   r.   r   r   ÚonStopo  s    z&InternetTests.test_UDP.<locals>.onStop)r   ZIReactorUDPr   r   ZSkipTestr
   ZDatagramProtocolr   r¹   r@   r±   r²   r³   ZassertNotEqualr	   ZmaybeDeferredrB   r¶   )r%   rG   r¼   r   r»   r   Útest_UDPb  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   rJ   r¦   r§   c                    s   ˆ   ¡ S r(   r¨   r©   )Úcr   r   r«   …  r¬   z.InternetTests.testPrivileged.<locals>.<lambda>c                    s   ˆ   ¡ S r(   r¨   r©   ©rG   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
privilegedrN   r±   r²   r³   r´   rŒ   r‘   rµ   r@   r¶   r"   )r%   r   r·   r   )r¾   rG   r   rP   v  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°   r@   r±   r²   r³   rB   r	   r¯   r´   ÚclientConnectionFailedrµ   )r%   r   rG   r·   r¾   r   rÃ   r   ÚtestConnectionGettingRefusedŠ  s    z*InternetTests.testConnectionGettingRefusedc                    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©   rL   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)   r@   r
   r®   r£   r	   r¯   r“   r   Ú
UNIXServerr*   r´   rŒ   r‘   Ú
UNIXClientr¶   r"   Ú_cbTestUnix©r%   r   rG   r   rL   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©   rL   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‘   r@   r¶   r"   )r%   rº   r   r&   r   rL   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È   r@   ZfailIfIdenticalr±   rQ   r<   rB   r>   r?   r´   rÉ   Z_connection)r%   r   rG   Ú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È   r@   rB   r>   r?   r´   r	   r¯   rÅ   r   ZconnectUNIXrË   r   rÃ   r   ÚtestStoppingServerÏ  s    z InternetTests.testStoppingServerNz1This reactor does not support UNIX domain socketsc                 C   sJ   t ƒ }t d|jd¡}| ¡  t |¡}| ¡  t |¡}|  	|j
¡ d S )NrJ   r   )rž   r   ÚTimerServicer¢   r@   rn   ÚdumpsrB   Úloadsr>   r?   )r%   ÚtargetZt0r&   rG   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 )NrJ   c                   S   s   dd S )NrJ   r   r   r   r   r   r   r«   ï  r¬   z/InternetTests.testBrokenTimer.<locals>.<lambda>c                    s   ˆ| ƒ ˆ   d ¡ d S r(   rÀ   )Z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©   ra   r   r   r«   ÷  s   þ)r	   r¯   r   rÐ   rÖ   r@   r¶   )r%   rÖ   r   )r“   rÕ   r%   rG   r   ÚtestBrokenTimerí  s    zInternetTests.testBrokenTimerc                 C   sð   d  ¡ }|dd… D ]"}ttd| ƒtdƒs| |¡ q|D ]®}d  ¡ D ] }|dkr^|dkr^qH|dkrp|dkrpqH|  tt|| ƒ¡ tt|| ƒj}dd	d
œ| }|  tt|| ƒpÂ|d	koÂ|dk¡ tt|| ƒƒ }|  	t
 |¡|¡ qHq<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.
        z'TCP UNIX SSL UDP UNIXDatagram MulticastNZIReactorzServer ClientZ	MulticastÚClientZUDPZlistenZconnect)ZServerrÞ   )rx   Úgetattrr   r   ÚremoverA   Úhasattrr   Úmethodr"   r   r_   )r%   ZtransZtranZsiderâ   ÚprefixrÚ   r   r   r   Útest_everythingThereý  s$    ÿz"InternetTests.test_everythingTherec                 C   s(   t jD ]}|  tt |ƒd|f ¡ 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.
        z3%s not importable from twisted.application.internetN)r   Ú__all__rA   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°   r@   r"   Ú
tcpServersÚpop©r%   r   r   rG   r   r   r   Ú#test_reactorParametrizationInServer"  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µ   r@   r"   Ú
tcpClientsrí   rî   r   r   r   Ú#test_reactorParametrizationInClient0  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°   r@   r"   rì   rí   rB   rî   r   r   r   Ú0test_reactorParametrizationInServerMultipleStart?  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µ   r@   r"   rñ   rí   rB   rî   r   r   r   Ú0test_reactorParametrizationInClientMultipleStartO  s     ÿ ÿz>InternetTests.test_reactorParametrizationInClientMultipleStart)r   r   r   r¸   r½   rP   rÆ   rÌ   rÊ   rÎ   rÏ   r   ZIReactorUNIXr   Z_skipMsgÚskiprÔ   rÝ   rä   rç   rï   rò   ró   rô   r   r   r   r   r¥   L  s*   

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 )NrJ   r   c                    s
   ˆ j  ¡ S r(   ©rG   rB   r©   ra   r   r   r«   i  r¬   z/TimerBasicTests.testTimerRuns.<locals>.<lambda>c                    s   ˆ   ˆ jj¡S r(   )r>   rG   r?   r©   ra   r   r   r«   j  r¬   )	r	   r¯   r   rÐ   r”   rG   r@   r¶   r"   )r%   r“   r   ra   r   ÚtestTimerRunsd  s    
zTimerBasicTests.testTimerRunsc                 C   s
   | j  ¡ S r(   r÷   ra   r   r   r   ÚtearDownm  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   Útriggeru  s    z1TimerBasicTests.testTimerRestart.<locals>.triggerrJ   c                    s   ˆ   | d¡ ˆ j ¡ S )Nrû   ©r"   rG   rB   ©Úresultra   r   r   ÚonFirstResultz  s    z7TimerBasicTests.testTimerRestart.<locals>.onFirstResultc                    s   ˆ  ˆjj¡ ˆj ¡  ˆ S r(   )r>   rG   r?   r@   )rº   )Úd2r%   r   r   ÚonFirstStop}  s    
z5TimerBasicTests.testTimerRestart.<locals>.onFirstStopc                    s   ˆ   | d¡ ˆ j ¡  d S )Nrú   rÿ   r   ra   r   r   ÚonSecondResult  s    z8TimerBasicTests.testTimerRestart.<locals>.onSecondResult)r	   r¯   r   rÐ   rG   r@   r¶   )r%   Zd1rþ   r  r  r  r   )r  r%   rý   r   ÚtestTimerRestartp  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”   )ÚdataZnumberr“   rŸ   r   r   rþ   ‹  s    
z/TimerBasicTests.testTimerLoops.<locals>.triggerg{®Gáz„?r   é
   c                    s
   ˆ j  ¡ S r(   r÷   r©   ra   r   r   r«   “  r¬   z0TimerBasicTests.testTimerLoops.<locals>.<lambda>)r	   r¯   r   rÐ   rG   r@   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ö   b  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Ú_getPluginsra   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  ra   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ÚmodulesZ	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   Zpatchr)  ©r   r%   r   r   r    s    zHPluggableReactorTests.test_installReactorReturnsReactor.<locals>.installr  r  N)rë   r   r  r  r   r&  rl   )r%   r  r#   r  r  r   r   r*  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otherreactorTNr%  )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  r7   r   ZNoSuchReactorr&  ra   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  5  s    zFPluggableReactorTests.test_installNotAvailableReactor.<locals>.installr  r  N)r   r  r  r7   r0  r   r&  r'  r   r   r   Útest_installNotAvailableReactor0  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‡ ‡fdd„Zeeƒ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   ra   r   r   r«   J  r¬   zoPluggableReactorTests.test_reactorSelectionMixin.<locals>.ReactorSelectionOptions.subCommands.<locals>.<lambda>ztest subcommandr  ra   ©ÚSUBCOMMAND_EVENTÚexecutedra   r   ÚsubCommandsH  s    
z]PluggableReactorTests.test_reactorSelectionMixin.<locals>.ReactorSelectionOptions.subCommandsN)r   r   r   r6  Úpropertyr   r3  r   r   ÚReactorSelectionOptionsG  s   r8  c                      s   ˆ  ˆ ¡ d S r(   r  r   )ÚINSTALL_EVENTr5  r   r   r  M  s    zAPluggableReactorTests.test_reactorSelectionMixin.<locals>.installr  r!  ú	--reactorr2  r   rJ   r   N)
r   ÚOptionsr   ÚReactorSelectionMixinr  r   r  ÚparseOptionsr"   Úcount)r%   r8  r  Úoptionsr   )r9  r4  r5  r   Útest_reactorSelectionMixin>  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   r8  `  s   r8  r:  r  r2  r   úhelp-reactorsN)r   r;  r   r<  r  r   ÚmessageOutputr7   Ú
UsageErrorr=  ÚassertInrÂ   )r%   r8  r?  Úer   r   r   Ú%test_reactorSelectionMixinNonExistentZ  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>.ReactorSelectionOptionsNrA  r   r   r   r   r8  r  s   r8  r.  c                      s   t ˆ ƒ‚d S r(   r/  r   ©Úmessager   r   r  u  s    zMPluggableReactorTests.test_reactorSelectionMixinNotAvailable.<locals>.installr  r  r:  r2  r   rB  N)r   r;  r   r<  r   r  r  r   rC  r7   rD  r=  rE  rÂ   )r%   r8  r  r#   r  r  r?  rF  r   rH  r   Ú&test_reactorSelectionMixinNotAvailablel  s    ÿz<PluggableReactorTests.test_reactorSelectionMixinNotAvailable)N)r   r   r   r  r  rù   r  r  r$  r(  r+  r,  r-  r1  r@  rG  rJ  r   r   r   r   r  ¦  s   
	r  c                   @   sp   e Zd ZdZdd„ Zdd„ Zer&de_dd„ Zes8d	e_d
d„ Z	e
dkrNde	_dd„ Ze
dkrdde_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   rC  r7   Ú
SystemExitÚopt_help_reactorsÚgetvaluerI  ra   r   r   r   r  Š  s    

zHelpReactorsTests.setUpc                 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)rE  r   Úasyncior  rI  r  ra   r   r   r   Útest_lacksAsyncIO”  s    z#HelpReactorsTests.test_lacksAsyncIOz$Not applicable, asyncio is 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
        rO  N)rE  r   rP  r  rI  ÚassertNotInr  ra   r   r   r   Útest_hasAsyncIOž  s
    
 ÿz!HelpReactorsTests.test_hasAsyncIOzasyncio library not availablec                 C   s,   |   tjj| j¡ |  dtjj | j¡ dS )zL
        --help-reactors should display the iocp reactor on Windows
        rO  N)rE  r   Úiocpr  rI  rR  r  ra   r   r   r   Útest_iocpWin32©  s    z HelpReactorsTests.test_iocpWin32Zwin32zTest only 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
        rO  N)rE  r   rT  r  rI  r  ra   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   r<  Z_getReactorTypesr   rC  r7   rL  rM  rN  rR  )r%   r  r?  rI  r   r   r   Útest_onlySupportedReactors½  s    
z,HelpReactorsTests.test_onlySupportedReactorsN)r   r   r   r  r  rQ  rP  rõ   rS  rU  r   rV  rX  r   r   r   r   rK  †  s   
rK  )?r  Z
__future__r   r   rQ   Úosrn   rP  r0  Ztwisted.applicationr   r   r   r   Ztwisted.internetr   r	   r
   r   Ztwisted.persistedr   Ztwisted.pluginsr   Ztwisted.protocolsr   r   Ztwisted.pythonr   Ztwisted.python.compatr   Ztwisted.python.runtimer   Z#twisted.python.test.modules_helpersr   Ztwisted.test.proto_helpersr   Ztwisted.trialr   r   ZTestCaser   rá   rS   ZcuruidÚgetgidZcurgidrT   r^   rf   rr   r   ZLineReceiverrŒ   r˜   rž   rÄ   r£   r¥   rö   r  r  r  rK  r   r   r   r   Ú<module>   sT   
x
.
  5 a