o
    Óó·iZ…  ã                   @   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 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   úcC:\Users\psant\Downloads\PAF backend\school\venv\Lib\site-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-   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   ó   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�   ó   
z(ServiceTests.testPrivileged.<locals>.pss)r   r!   ÚprivilegedStartServicer*   r+   rB   rN   )r&   rP   Ús1r/   r   rO   r   ÚtestPrivilegedŒ   s   

zServiceTests.testPrivilegedc                 C   s6   t  ¡ }| ¡  t |¡}|  |j¡ |  |j¡ d S r)   )r   r!   rA   Úcopyr?   r@   rB   )r&   r'   rS   r   r   r   ÚtestCopyingš   s
   
zServiceTests.testCopyingN)r   r   r   r(   r0   r4   r5   r:   r;   r>   rD   rE   rJ   rK   rT   rV   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 )NrZ   )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   r`   ra   rb   r   r   r   r   rY   ©   s    rY   c                   @   rX   )ÚInterfacesTestsc                 C   ó   |   tj t ¡ ¡¡ d S r)   )rB   r   ÚIServiceÚ
providedByr!   ©r&   r   r   r   ÚtestServiceÂ   ó   zInterfacesTests.testServicec                 C   s0   |   tj t ¡ ¡¡ |   tj t ¡ ¡¡ d S r)   )rB   r   re   rf   r*   r3   rg   r   r   r   ÚtestMultiServiceÅ   s   z InterfacesTests.testMultiServicec                 C   rd   r)   )rB   r   ÚIProcessrf   r\   rg   r   r   r   ÚtestProcessÉ   ri   zInterfacesTests.testProcessN)r   r   r   rh   rj   rl   r   r   r   r   rc   Á   ó    rc   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    rZ   r[   )r   r2   rg   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 rp   )r   r2   r=   rk   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   ÚassertIsre   r3   r#   r$   r=   r-   rr   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$   ru   Úoriginal)r&   rs   r/   r   r   r   ÚtestPersistableComponentä   s
   

z)ApplicationTests.testPersistableComponentN)r   r   r   rq   rt   rv   r{   r   r   r   r   ro   Í   s
    ro   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   rx   ÚsplitÚsetStyleÚsaveÚloadApplicationr#   re   r$   ÚopenÚ
writelines)r&   rs   r/   ry   Úa1Úfr   r   r   Útest_simpleStoreAndLoadí   s    


þÿÿz$LoadingTests.test_simpleStoreAndLoadN)r   r   r   r‹   r   r   r   r   r}   ì   ó    r}   c                   @   rn   )
ÚAppSupportTestsc                 C   s   |   t d¡¡ d S )Nr   )r=   r   ZgetPassphraserg   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~   Zhelloapplicationrw   r�   ©Úfilenamer‚   r   r€   r�   )r   r2   rƒ   rU   Úgetr   rx   r„   r…   r   ZgetApplicationr#   re   r$   r‡   rˆ   )r&   rs   Z
baseconfigry   Ú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 )Nr6   r~   Zconverttestr‘   zconverttest.outr   )r   r2   rƒ   r   rx   r„   r…   r   ZconvertStyler†   r#   re   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   re   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                   @   rX   )ÚFooc                 C   ó   | j  d¡ d S )Ns   lalala
)Ú	transportÚwriterg   r   r   r   ÚconnectionMade0  rH   zFoo.connectionMadec                 C   s   || j _| j ¡  d S r)   )ÚfactoryÚliner›   Z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™   /  rm   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>  rH   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)   ©Úlrg   r   r   r   Ú__init__F  rQ   zTimerTarget.__init__c                 C   s   | j  |¡ d S r)   )r¯   Úappend)r&   Úwhatr   r   r   r±   I  rH   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  rH   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)   ©rC   ©ÚxrO   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*   rA   r   ÚServerFactoryr³   r	   ÚDeferredr¢   r   Ú	TCPServerr+   Ú_portÚgetHostÚportÚClientFactoryr™   rŸ   Ú	TCPClientÚaddCallbackr#   )r&   rž   rI   Únumr   rO   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   )ÚignoredrI   ©rÊ   r/   r   r   ÚonStopt  s   z&InternetTests.test_UDP.<locals>.onStop)r
   ZIReactorUDPr   r   r   ÚDatagramProtocolr   rÌ   rA   rÄ   rÅ   rÆ   ZassertNotEqualr	   ZmaybeDeferredrC   rÉ   )r&   rI   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   rM   r¶   r·   c                    r¸   r)   r¹   rº   )Úcr   r   r¼   Š  r½   z.InternetTests.testPrivileged.<locals>.<lambda>c                    r¸   r)   r¹   rº   ©rI   r   r   r¼   ‹  r½   c                 S   r¾   r)   r¿   rº   r   r   r   r¼   Œ  rÀ   )r   rÁ   r³   r	   rÂ   r¢   r   rÃ   Z
privilegedrR   rÄ   rÅ   rÆ   rÇ   r™   rŸ   rÈ   rA   rÉ   r#   )r&   rž   rÊ   r   )rÒ   rI   r   rT   {  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Ã   rA   rÄ   rÅ   rÆ   rC   r	   rÂ   rÇ   ÚclientConnectionFailedrÈ   )r&   rž   rI   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º   rO   r   r   r¼   ±  r½   z(InternetTests.testUNIX.<locals>.<lambda>c                 S   r¾   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ž   rI   r   rO   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º   rO   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Ÿ   rA   rÉ   r#   )r&   rÍ   rž   r'   r   rO   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Ä   rU   r=   rC   r?   r@   rÇ   rß   Ú_connection)r&   rž   rI   Ú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Þ   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 )NrM   r    )r­   r   ÚTimerServicer±   rA   rw   ÚdumpsrC   Úloadsr?   r@   )r&   ÚtargetÚt0r'   rI   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 )NrM   c                   S   s   dd S )NrM   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#   ÚZeroDivisionErrorZflushLoggedErrorsrº   rg   r   r   r¼     s    þ)r	   rÂ   r   rç   rï   rA   rÉ   )r&   rï   r   )r¢   rî   r&   rI   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.
        )ZTCPZUNIXZSSLÚUDPZUNIXDatagramÚ	MulticastNZIReactor)ÚServerÚClientrø   rú   r÷   ÚlistenÚconnect)Úgetattrr
   r   ÚremoverB   Úhasattrr   Úmethodr#   r   re   )r&   Ú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ž   rI   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   Ú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Ñ   rT   rÜ   r   r
   ZIReactorUNIXr   râ   rà   rå   ræ   rì   rö   r  r  r  r  r  r  r   r   r   r   rµ   R  s:    þ

þ
þ

rµ   c                   @   rn   )
ÚTimerBasicTestsc                    sZ   t  ¡ }t d|jd¡ˆ _ˆ j ¡  | ˆ jd¡ | ‡ fdd„¡ | ‡ fdd„¡ |S )NrM   r    c                    ó
   ˆ j  ¡ S r)   ©rI   rC   rº   rg   r   r   r¼   o  rÙ   z/TimerBasicTests.testTimerRuns.<locals>.<lambda>c                    s   ˆ   ˆ jj¡S r)   )r?   rI   r@   rº   rg   r   r   r¼   p  s    )	r	   rÂ   r   rç   r£   rI   rA   rÉ   r#   )r&   r¢   r   rg   r   ÚtestTimerRunsj  s   
zTimerBasicTests.testTimerRunsc                 C   s
   | j  ¡ S r)   r  rg   r   r   r   ÚtearDowns  rQ   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>.triggerrM   c                    s   ˆ   | d¡ ˆ j ¡ S )Nr  ©r#   rI   rC   ©Úresultrg   r   r   ÚonFirstResultƒ  s   
z7TimerBasicTests.testTimerRestart.<locals>.onFirstResultc                    s   ˆ  ˆjj¡ ˆj ¡  ˆ S r)   )r?   rI   r@   rA   )rÍ   )Úd2r&   r   r   ÚonFirstStop‡  s   
z5TimerBasicTests.testTimerRestart.<locals>.onFirstStopc                    s   ˆ   | d¡ ˆ j ¡  d S )Nr  r   r!  rg   r   r   ÚonSecondResultŒ  r  z8TimerBasicTests.testTimerRestart.<locals>.onSecondResult)r	   rÂ   r   rç   rI   rA   rÉ   )r&   Z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 d S r)   )r±   Úlenr£   )ÚdataÚnumberr¢   r®   r   r   r  ˜  s   
ÿz/TimerBasicTests.testTimerLoops.<locals>.triggerg{®Gáz„?r    é
   c                    r  r)   r  rº   rg   r   r   r¼   ¡  rÙ   z0TimerBasicTests.testTimerLoops.<locals>.<lambda>)r	   rÂ   r   rç   rI   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| g|¢R i |¤Ž || _dS )zv
        @param install: any callable that will be used as install method.
        @type install: C{callable}
        N)r   ÚReactorr°   Úinstall)r&   r/  r×   Ú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Ú_getPluginsrg   r   r   r   ÚsetUp¸  s   	zPluggableReactorTests.setUpc                 C   s   | j t_dS )z>
        Restore the original L{reactors.getPlugins}.
        N)r6  r   r5  rg   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.
        N)r3  r±   r,   r4  )r&   Z	interfaceÚpackager   r   r   r7  Ì  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   r.  r4  ÚgetReactorTypesr#   r3  ZIReactorInstallerÚ	shortNamer;  Zfail)r&   r$   r9  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                      ó   ˆ   d¡ d S r´   ©r±   r   ©Ú	installedr   r   r/  î  r¬   z?PluggableReactorTests.test_reactorInstallation.<locals>.installr:  Ú	describedZfakereactorTN)r-  r   ZreplaceSysModulesr   r.  r/  r#   )r&   r/  ÚfakeReactorÚmodulesÚ	installerr   rB  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                      r@  r´   rA  r   rB  r   r   r/  ÿ  r¬   z:PluggableReactorTests.test_installReactor.<locals>.installr:  r;  TN©r   r-  r4  r   ÚinstallReactorr#   ©r&   r/  r$   r9  r;  r   rB  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   ÚpatchrM  ©r   r&   r   r   r/    s   zHPluggableReactorTests.test_installReactorReturnsReactor.<locals>.installr:  r;  N)r
  r   r-  r4  r   rJ  ru   )r&   r/  r$   r9  r;  rC  r   rO  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                      r@  r´   rA  r   rB  r   r   r/  #  r¬   zIPluggableReactorTests.test_installReactorMultiplePlugins.<locals>.installr:  r;  c                   S   s   d S r)   r   r   r   r   r   r¼   *  ó    zJPluggableReactorTests.test_installReactorMultiplePlugins.<locals>.<lambda>ZotherreactorTNrI  )r&   r/  r$   r9  r;  rE  ZotherReactorr   rB  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)r4  r8   r   ZNoSuchReactorrJ  rg   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   r/  ?  ó   zFPluggableReactorTests.test_installNotAvailableReactor.<locals>.installr:  r;  N)r   r-  r4  r8   rV  r   rJ  rK  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   rg   r   r   r¼   U  rQ  zoPluggableReactorTests.test_reactorSelectionMixin.<locals>.ReactorSelectionOptions.subCommands.<locals>.<lambda>ztest subcommandrA  rg   ©ÚSUBCOMMAND_EVENTÚexecutedrg   r   ÚsubCommandsR  s   
z]PluggableReactorTests.test_reactorSelectionMixin.<locals>.ReactorSelectionOptions.subCommandsN)r   r   r   Úpropertyr]  r   rZ  r   r   ÚReactorSelectionOptionsQ  s    r_  c                      s   ˆ  ˆ ¡ d S r)   rA  r   )ÚINSTALL_EVENTr\  r   r   r/  W  r¬   zAPluggableReactorTests.test_reactorSelectionMixin.<locals>.installr:  rD  ©z	--reactorr:  rY  r   rM   r   N)
r   ÚOptionsr   ÚReactorSelectionMixinr-  r   r4  ÚparseOptionsr#   Úcount)r&   r_  r/  Ú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_  ra  r:  r   úhelp-reactorsN)r   rb  r   rc  r4  r   ÚmessageOutputr8   Ú
UsageErrorrd  ÚassertInr×   )r&   r_  rf  Ú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                   @   rh  )z]PluggableReactorTests.test_reactorSelectionMixinNotAvailable.<locals>.ReactorSelectionOptionsNri  r   r   r   r   r_  �  rj  r_  rT  c                      s   t ˆ ƒ‚r)   rU  r   ©Úmessager   r   r/  †  rW  zMPluggableReactorTests.test_reactorSelectionMixinNotAvailable.<locals>.installr:  r;  ra  r   rk  N)r   rb  r   rc  r   r-  r4  r   rl  r8   rm  rd  rn  r×   )r&   r_  r/  r$   r9  r;  rf  ro  r   rq  r   Ú&test_reactorSelectionMixinNotAvailablez  s    ýz<PluggableReactorTests.test_reactorSelectionMixinNotAvailabler)   )r   r   r   r1  r8  r  r7  r?  rH  rL  rP  rR  rS  rX  rg  rp  rs  r   r   r   r   r2  ³  s    

r2  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   rc  rf  r   rl  r8   Ú
SystemExitÚopt_help_reactorsÚgetvaluerr  rg   r   r   r   r8  ž  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)rn  r   Úasyncior;  rr  r=  rg   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
        ry  N)rn  r   rz  r;  rr  ÚassertNotInr=  rg   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
        ry  N)rn  r   Úiocpr;  rr  r~  r=  rg   r   r   r   Útest_iocpWin32·  r|  z HelpReactorsTests.test_iocpWin32zTest not applicable on Windowsc                 C   rx  )zP
        --help-reactors should NOT display the iocp reactor on Windows
        ry  N)rn  r   r�  r;  rr  r=  rg   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   r<  Ì  s   €zEHelpReactorsTests.test_onlySupportedReactors.<locals>.getReactorTypeszreactors not availableN)
r   rc  Z_getReactorTypesr   rl  r8   ru  rv  rw  r~  )r&   r<  rf  rr  r   r   r   Útest_onlySupportedReactorsÇ  s   
z,HelpReactorsTests.test_onlySupportedReactorsN)r   r   r   r1  r8  r   rz  r{  r  r   r‚  rƒ  r…  r   r   r   r   rt  ™  s    	




rt  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 rL   r   r   r   r   r   r¼   à  rQ  zCBackoffPolicyTests.test_calculates_correct_values.<locals>.<lambda>©Zjitterr   r	  rM   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
        r‡  rˆ  r‰  c                   S   rŠ  rL   r   r   r   r   r   r¼   ï  rQ  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Š  rL   r   r   r   r   r   r¼   ù  rQ  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   r1  r�  r“  r”  r   r   r   r   r†  ×  s
    r†  )Ar1  rU   Úosrw   Úior   rz  rV  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ÿ   rW   ZcuruidÚgetgidZcurgidrY   rc   ro   r}   r�   ZLineReceiverr™   r§   r­   rÚ   r³   rµ   r  r.  r-  r2  rt  r†  r   r   r   r   Ú<module>   s\   ÿ
{
/
  < g>