o
    E¾±h@  ã                   @   s  d dl mZ d dlZd dlZd dlZd dlmZ d dlmZm	Z	 d dl
mZ d dlmZmZ d dlmZ d dlmZmZ d d	lmZmZmZ d d
lmZ d dlZejrcd dlmZ d dlmZmZm Z  d\Z!Z"G dd„ deƒZ#G dd„ deƒZ$G dd„ dej%ƒZ&G dd„ deƒZ'dS )é    )ÚclosingN©ÚFuture)Úbind_socketsÚResolver)ÚQueue)Ú	TCPClientÚ
_Connector)Ú	TCPServer)ÚAsyncTestCaseÚgen_test)ÚskipIfNoIPv6Úrefusing_portÚskipIfNonUnix)ÚTimeoutError)ÚIOStream)ÚListÚDictÚTuple)é   é   c                       s0   e Zd Z‡ fdd„Zdd„ Z‡ fdd„Z‡  ZS )ÚTestTCPServerc                    sD   t ƒ  ¡  g | _tƒ | _tdd|ƒ}|  |¡ |d  ¡ d | _d S )Nr   Ú	localhostr   )	ÚsuperÚ__init__Ústreamsr   Úqueuer   Úadd_socketsÚgetsocknameÚport)ÚselfÚfamilyÚsockets©Ú	__class__© ú\/var/www/html/Persson_Maskin/env/lib/python3.10/site-packages/tornado/test/tcpclient_test.pyr   )   s   

zTestTCPServer.__init__c                 C   s   | j  |¡ | j |¡ d S ©N)r   Úappendr   Úput)r    ÚstreamÚaddressr%   r%   r&   Úhandle_stream1   s   zTestTCPServer.handle_streamc                    s"   t ƒ  ¡  | jD ]}| ¡  qd S r'   )r   Ústopr   Úclose©r    r*   r#   r%   r&   r-   5   s   


ÿzTestTCPServer.stop)Ú__name__Ú
__module__Ú__qualname__r   r,   r-   Ú__classcell__r%   r%   r#   r&   r   (   s    r   c                       sÆ   e Zd Z‡ fdd„Zdd„ Zdd„ Z‡ fdd„Zd	d
„ Zed&dd„ƒZ	dd„ Z
dd„ Zedd„ ƒZedd„ ƒZdd„ Zedd„ ƒZdd„ Zedd„ ƒZdd„ Zd d!„ Zed"d#„ ƒZed$d%„ ƒZ‡  ZS )'ÚTCPClientTestc                    s   t ƒ  ¡  d | _tƒ | _d S r'   )r   ÚsetUpÚserverr   Úclient©r    r#   r%   r&   r5   <   s   
zTCPClientTest.setUpc                 C   s   t |ƒ| _| jjS r'   )r   r6   r   )r    r!   r%   r%   r&   Ústart_serverA   s   
zTCPClientTest.start_serverc                 C   s"   | j d ur| j  ¡  d | _ d S d S r'   )r6   r-   r8   r%   r%   r&   Ústop_serverE   s   


þzTCPClientTest.stop_serverc                    s    | j  ¡  |  ¡  tƒ  ¡  d S r'   )r7   r.   r:   r   ÚtearDownr8   r#   r%   r&   r;   J   s   
zTCPClientTest.tearDownc                 C   s:   | j  dd„ ¡}dd„ |D ƒ}tj|vr|  d¡ d S d S )Nc                   S   s   t ƒ  dd¡S )Nr   éP   )r   Úresolver%   r%   r%   r&   Ú<lambda>R   s    z1TCPClientTest.skipIfLocalhostV4.<locals>.<lambda>c                 S   s   h | ]}|d  ’qS )r   r%   )Ú.0Úaddrr%   r%   r&   Ú	<setcomp>S   s    z2TCPClientTest.skipIfLocalhostV4.<locals>.<setcomp>z"localhost does not resolve to ipv6)Úio_loopÚrun_syncÚsocketÚAF_INET6ÚskipTest)r    ÚaddrinfoÚfamiliesr%   r%   r&   ÚskipIfLocalhostV4O   s
   
ÿzTCPClientTest.skipIfLocalhostV4Nc           	      c   s    |   |¡}| jj|||||dV }| jd usJ ‚| jj ¡ V }t|ƒ | d¡ | d¡V }|  	|d¡ W d   ƒ d S 1 sAw   Y  d S )N)Ú	source_ipÚsource_portÚafs   helloé   )
r9   r7   Úconnectr6   r   Úgetr   ÚwriteÚ
read_bytesÚassertEqual)	r    r!   ÚhostrJ   rK   r   r*   Úserver_streamÚdatar%   r%   r&   Údo_test_connectW   s    €
û

"ýzTCPClientTest.do_test_connectc                 C   ó   |   tjd¡ d S ©Nú	127.0.0.1©rV   rD   ÚAF_INETr8   r%   r%   r&   Útest_connect_ipv4_ipv4h   ó   z$TCPClientTest.test_connect_ipv4_ipv4c                 C   rW   ©Nr   rZ   r8   r%   r%   r&   Útest_connect_ipv4_dualk   r]   z$TCPClientTest.test_connect_ipv4_dualc                 C   ó   |   ¡  |  tjd¡ d S ©Nz::1©rI   rV   rD   rE   r8   r%   r%   r&   Útest_connect_ipv6_ipv6n   ó   z$TCPClientTest.test_connect_ipv6_ipv6c                 C   r`   r^   rb   r8   r%   r%   r&   Útest_connect_ipv6_duals   rd   z$TCPClientTest.test_connect_ipv6_dualc                 C   rW   rX   ©rV   rD   Ú	AF_UNSPECr8   r%   r%   r&   Útest_connect_unspec_ipv4x   r]   z&TCPClientTest.test_connect_unspec_ipv4c                 C   r`   ra   )rI   rV   rD   rg   r8   r%   r%   r&   Útest_connect_unspec_ipv6{   rd   z&TCPClientTest.test_connect_unspec_ipv6c                 C   rW   r^   rf   r8   r%   r%   r&   Útest_connect_unspec_dual€   r]   z&TCPClientTest.test_connect_unspec_dualc                 c   sV    t ƒ \}}|  |¡ |  t¡ | j d|¡V  W d   ƒ d S 1 s$w   Y  d S rX   )r   Ú
addCleanupÚassertRaisesÚIOErrorr7   rN   )r    Úcleanup_funcr   r%   r%   r&   Útest_refused_ipv4ƒ   s   €

"ÿzTCPClientTest.test_refused_ipv4c                 C   s   | j tj| jtjddd dS )z8Fail when trying to use the source IP Address '8.8.8.8'.rY   z8.8.8.8©rJ   N)rl   rD   ÚerrorrV   r[   r8   r%   r%   r&   Útest_source_ip_failŠ   s   
ûz!TCPClientTest.test_source_ip_failc                 C   s   | j tjddd dS )z=Success when trying to use the source IP Address '127.0.0.1'.rY   rp   NrZ   r8   r%   r%   r&   Útest_source_ip_success”   s   z$TCPClientTest.test_source_ip_successc                 C   s4   t  ¡ dkr|  d¡ | jtj| jtjddd dS )z&Fail when trying to use source port 1.Úrootzrunning as rootrY   r   )rK   N)ÚgetpassÚgetuserrF   rl   rD   rq   rV   r[   r8   r%   r%   r&   Útest_source_port_fail˜   s   

ûz#TCPClientTest.test_source_port_failc                 c   s`    d}G dd„ dt ƒ}|  t¡ t|ƒ djdd|dV  W d   ƒ d S 1 s)w   Y  d S )Ngš™™™™™©?c                   @   s   e Zd Zdd„ ZdS )z;TCPClientTest.test_connect_timeout.<locals>.TimeoutResolverc                 _   s   t ƒ S r'   r   )r    ÚargsÚkwargsr%   r%   r&   r=   ¬   s   zCTCPClientTest.test_connect_timeout.<locals>.TimeoutResolver.resolveN)r0   r1   r2   r=   r%   r%   r%   r&   ÚTimeoutResolver«   s    rz   )Úresolverz1.2.3.4i90  )Útimeout)r   rl   r   r   rN   )r    r|   rz   r%   r%   r&   Útest_connect_timeout§   s   €
ÿ"ÿz"TCPClientTest.test_connect_timeout)NN)r0   r1   r2   r5   r9   r:   r;   rI   r   rV   r\   r_   r   rc   re   rh   ri   rj   ro   rr   rs   r   rw   r}   r3   r%   r%   r#   r&   r4   ;   s4    





r4   c                   @   ó   e Zd Zdd„ Zdd„ ZdS )ÚTestConnectorSplitc                 C   sB   t  tdftdfg¡\}}|  |tdftdfg¡ |  |g ¡ d S )NÚaÚb)r	   ÚsplitÚAF1rR   ©r    ÚprimaryÚ	secondaryr%   r%   r&   Útest_one_family¶   s   z"TestConnectorSplit.test_one_familyc                 C   sZ   t  tdftdftdftdfg¡\}}|  |tdftdfg¡ |  |tdftdfg¡ d S ©Nr€   r   ÚcÚd)r	   r‚   rƒ   ÚAF2rR   r„   r%   r%   r&   Ú
test_mixed¼   s
   ÿzTestConnectorSplit.test_mixedN)r0   r1   r2   r‡   rŒ   r%   r%   r%   r&   r   µ   s    r   c                       sÞ   e Zd ZG dd„ dƒZ‡ fdd„Z‡ f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d „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Z‡  ZS )1ÚConnectorTestc                   @   r~   )zConnectorTest.FakeStreamc                 C   ó
   d| _ d S )NF©Úclosedr8   r%   r%   r&   r   Æ   ó   
z!ConnectorTest.FakeStream.__init__c                 C   rŽ   )NTr   r8   r%   r%   r&   r.   É   r‘   zConnectorTest.FakeStream.closeN)r0   r1   r2   r   r.   r%   r%   r%   r&   Ú
FakeStreamÅ   s    r’   c                    s8   t ƒ  ¡  i | _i | _tdftdftdftdfg| _d S rˆ   )r   r5   Úconnect_futuresr   rƒ   r‹   rG   r8   r#   r%   r&   r5   Ì   s
   
ÿ"zConnectorTest.setUpc                    s*   | j  ¡ D ]}|  |j¡ qtƒ  ¡  d S r'   )r   ÚvaluesÚassertFalser   r   r;   r/   r#   r%   r&   r;   Ô   s   zConnectorTest.tearDownc                 C   s.   t  ¡ }|| j|< tƒ }|| j||f< ||fS r'   )r   r’   r   r   r“   )r    rL   r@   r*   Úfuturer%   r%   r&   Úcreate_streamÛ   s
   
zConnectorTest.create_streamc                 G   s   |   t| j ¡ ƒt|ƒ¡ d S r'   )rR   Úsortedr“   Úkeys)r    r™   r%   r%   r&   Úassert_pendingâ   s   zConnectorTest.assert_pendingc                 C   sX   | j  ||f¡}|r| | j| ¡ n| j |¡ | tƒ ¡ | j | j¡ |  	¡  d S r'   )
r“   ÚpopÚ
set_resultr   Úset_exceptionrm   rB   Úadd_callbackr-   Úwait)r    rL   r@   Úsuccessr–   r%   r%   r&   Úresolve_connectå   s   zConnectorTest.resolve_connectc                 C   s   |j D ]}|  |j¡ qd S r'   )r   Ú
assertTruer   )r    Úconnr*   r%   r%   r&   Úassert_connector_streams_closedð   s   
ÿz-ConnectorTest.assert_connector_streams_closedc                 C   s,   t || jƒ}|jd| j ¡ d d}||fS )Ni  )Úconnect_timeout)r	   r—   ÚstartrB   Útime)r    rG   r£   r–   r%   r%   r&   Ústart_connectô   s   zConnectorTest.start_connectc                 C   sZ   |   | j¡\}}|  t| j ¡ ƒtdfg¡ |  tdd¡ |  | ¡ td| j	d f¡ d S )Nr€   T)
r¨   rG   rR   Úlistr“   r™   rƒ   r¡   Úresultr   ©r    r£   r–   r%   r%   r&   Útest_immediate_successú   s    z$ConnectorTest.test_immediate_successc                 C   sB   |   tdfg¡\}}|  tdf¡ |  tdd¡ |  t|j¡ d S )Nr€   F©r¨   rƒ   rš   r¡   rl   rm   rª   r«   r%   r%   r&   Útest_immediate_failure   s   z$ConnectorTest.test_immediate_failurec                 C   sr   |   tdftdfg¡\}}|  tdf¡ |  tdd¡ |  tdf¡ |  tdd¡ |  | ¡ td| jd f¡ d S ©Nr€   r   FT)r¨   rƒ   rš   r¡   rR   rª   r   r«   r%   r%   r&   Útest_one_family_second_try  s    z(ConnectorTest.test_one_family_second_tryc                 C   sd   |   tdftdfg¡\}}|  tdf¡ |  tdd¡ |  tdf¡ |  tdd¡ |  t|j¡ d S )Nr€   r   Fr­   r«   r%   r%   r&   Ú"test_one_family_second_try_failure  s   z0ConnectorTest.test_one_family_second_try_failurec                 C   sˆ   |   tdftdfg¡\}}|  tdf¡ | ¡  |  tdf¡ |  tdd¡ |  tdf¡ |  tdd¡ |  | ¡ td| jd f¡ d S r¯   )r¨   rƒ   rš   Ú
on_timeoutr¡   rR   rª   r   r«   r%   r%   r&   Ú"test_one_family_second_try_timeout  s    z0ConnectorTest.test_one_family_second_try_timeoutc                 C   s|   |   | j¡\}}|  tdf¡ |  tdd¡ |  tdftdf¡ |  tdd¡ |  tdd¡ |  | ¡ td| jd f¡ d S )Nr€   Fr   r‰   T)	r¨   rG   rš   rƒ   r¡   r‹   rR   rª   r   r«   r%   r%   r&   Ú#test_two_families_immediate_failure#  s    z1ConnectorTest.test_two_families_immediate_failurec                 C   s~   |   | j¡\}}|  tdf¡ | ¡  |  tdftdf¡ |  tdd¡ |  | ¡ td| j	d f¡ |  tdd¡ |  ¡  d S )Nr€   r‰   TF)
r¨   rG   rš   rƒ   r²   r‹   r¡   rR   rª   r   r«   r%   r%   r&   Útest_two_families_timeout,  s   z'ConnectorTest.test_two_families_timeoutc                 C   sŠ   |   | j¡\}}|  tdf¡ | ¡  |  tdftdf¡ |  tdd¡ |  | ¡ td| j	d f¡ |  tdd¡ |  
| j	 d¡j¡ d S )Nr€   r‰   T)r¨   rG   rš   rƒ   r²   r‹   r¡   rR   rª   r   r¢   r›   r   r«   r%   r%   r&   Útest_success_after_timeout7  s   z(ConnectorTest.test_success_after_timeoutc                 C   sÂ   |   | j¡\}}|  tdf¡ | ¡  |  tdftdf¡ |  tdd¡ |  tdftdf¡ |  tdd¡ |  tdf¡ |  tdd¡ |  tdf¡ |  | ¡ ¡ |  tdd¡ |  	t
|j¡ d S )Nr€   r‰   FrŠ   r   )r¨   rG   rš   rƒ   r²   r‹   r¡   r•   Údonerl   rm   rª   r«   r%   r%   r&   Útest_all_failB  s   zConnectorTest.test_all_failc                 C   s’   |   tdftdfg¡\}}|  tdf¡ | ¡  | j tdf¡ |  | j d¡j¡ | 	¡  |  ¡  |  
t|jƒd¡ |  |¡ |  t|j¡ d S )Nr€   r   r   )r¨   rƒ   rš   Úon_connect_timeoutr“   r›   r¢   r   r   r²   rR   Úlenr¤   rl   r   rª   r«   r%   r%   r&   Ú-test_one_family_timeout_after_connect_timeoutR  s   
z;ConnectorTest.test_one_family_timeout_after_connect_timeoutc                 C   s”   |   tdftdfg¡\}}|  tdf¡ |  tdd¡ | ¡  |  ¡  |  | jd j¡ |  t	|jƒd¡ |  
|¡ |  | ¡ td| jd f¡ d S )Nr€   r   Tr   )r¨   rƒ   rš   r¡   r¹   r•   r   r   rR   rº   r¤   rª   r«   r%   r%   r&   Ú.test_one_family_success_before_connect_timeoutb  s   
 z<ConnectorTest.test_one_family_success_before_connect_timeoutc                 C   s¦   |   tdftdfg¡\}}|  tdf¡ |  tdd¡ |  tdf¡ | ¡  | j tdf¡ |  | j d¡j	¡ |  ¡  |  
t|jƒd¡ |  |¡ |  t|j¡ d S ©Nr€   r   Fr   )r¨   rƒ   rš   r¡   r¹   r“   r›   r¢   r   r   rR   rº   r¤   rl   r   rª   r«   r%   r%   r&   Ú0test_one_family_second_try_after_connect_timeouto  s   
z>ConnectorTest.test_one_family_second_try_after_connect_timeoutc                 C   s   |   tdftdfg¡\}}|  tdf¡ |  tdd¡ |  tdf¡ |  tdd¡ | ¡  |  ¡  |  t|jƒd¡ |  |¡ |  	t
|j¡ d S r½   )r¨   rƒ   rš   r¡   r¹   rR   rº   r   r¤   rl   rm   rª   r«   r%   r%   r&   Ú9test_one_family_second_try_failure_before_connect_timeout|  s   
zGConnectorTest.test_one_family_second_try_failure_before_connect_timeoutc                 C   sÀ   |   | j¡\}}|  tdf¡ | ¡  |  tdftdf¡ | ¡  | j tdf¡ |  	| j
 d¡j¡ | j tdf¡ |  	| j
 d¡j¡ |  ¡  |  t|j
ƒd¡ |  |¡ |  t|j¡ d S )Nr€   r‰   r   )r¨   rG   rš   rƒ   r²   r‹   r¹   r“   r›   r¢   r   r   rR   rº   r¤   rl   r   rª   r«   r%   r%   r&   Ú.test_two_family_timeout_before_connect_timeoutˆ  s   
z<ConnectorTest.test_two_family_timeout_before_connect_timeoutc                 C   s°   |   | j¡\}}|  tdf¡ | ¡  |  tdftdf¡ |  tdd¡ | j tdf¡ |  	| j
 d¡j¡ |  ¡  |  t|j
ƒd¡ |  |¡ |  | ¡ td| j
d f¡ d S )Nr€   r‰   Tr   )r¨   rG   rš   rƒ   r²   r‹   r¡   r“   r›   r¢   r   r   rR   rº   r¤   rª   r«   r%   r%   r&   Ú%test_two_family_success_after_timeout—  s   
 z3ConnectorTest.test_two_family_success_after_timeoutc                 C   s   |   | j¡\}}|  tdf¡ | ¡  | j tdf¡ |  | j d¡j	¡ |  ¡  | 
¡  |  ¡  |  t|jƒd¡ |  |¡ |  t|j¡ d S )Nr€   r   )r¨   rG   rš   rƒ   r¹   r“   r›   r¢   r   r   r²   rR   rº   r¤   rl   r   rª   r«   r%   r%   r&   Ú-test_two_family_timeout_after_connect_timeout¥  s   
z;ConnectorTest.test_two_family_timeout_after_connect_timeout)r0   r1   r2   r’   r5   r;   r—   rš   r¡   r¤   r¨   r¬   r®   r°   r±   r³   r´   rµ   r¶   r¸   r»   r¼   r¾   r¿   rÀ   rÁ   rÂ   r3   r%   r%   r#   r&   r   Ä   s2    	r   )(Ú
contextlibr   ru   rD   ÚunittestÚtornado.concurrentr   Útornado.netutilr   r   Útornado.queuesr   Útornado.tcpclientr   r	   Útornado.tcpserverr
   Útornado.testingr   r   Útornado.test.utilr   r   r   Útornado.genr   ÚtypingÚTYPE_CHECKINGÚtornado.iostreamr   r   r   r   rƒ   r‹   r   r4   ÚTestCaser   r   r%   r%   r%   r&   Ú<module>   s*   z