a
    äze,  ã                   @   sÀ   d Z ddlZddlZddlmZ ddlmZ e d¡ Zddl	Z	ddl
Z
ddlZe ¡ dd„ ƒZG dd	„ d	ejƒZG d
d„ dejƒZG dd„ deƒZG dd„ deƒZdd„ Zedkr¼e ¡  dS )z&Unit tests for socket timeout feature.é    N)Úsupport)Úsocket_helperÚnetworkc                 C   sJ   t  | ¡, t | |tjtj¡d d W  d  ƒ S 1 s<0    Y  dS )z—Resolve an (host, port) to an address.

    We must perform name resolution before timeout tests, otherwise it will be
    performed by connect().
    r   é   N)r   Útransient_internetÚsocketÚgetaddrinfoÚAF_INETÚSOCK_STREAM)ÚhostÚport© r   ú'/usr/lib/python3.9/test/test_timeout.pyÚresolve_address   s    ÿÿÿr   c                   @   sX   e Zd 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S )ÚCreationTestCasez9Test case for socket.gettimeout() and socket.settimeout()c                 C   s   t   t jt j¡| _d S ©N)r   r	   r
   Úsock©Úselfr   r   r   ÚsetUp   s    zCreationTestCase.setUpc                 C   s   | j  ¡  d S r   ©r   Úcloser   r   r   r   ÚtearDown"   s    zCreationTestCase.tearDownc                 C   s   |   | j ¡ d d¡ d S )Nztimeout not disabled by default)ÚassertEqualr   Ú
gettimeoutr   r   r   r   ÚtestObjectCreation%   s    ÿz#CreationTestCase.testObjectCreationc                 C   s^   | j  d¡ |  | j  ¡ d¡ | j  d¡ |  | j  ¡ d¡ | j  d ¡ |  | j  ¡ d ¡ d S )Ngáz®Ga@é   )r   Ú
settimeoutr   r   r   r   r   r   ÚtestFloatReturnValue*   s    z%CreationTestCase.testFloatReturnValuec                 C   sP   | j  d¡ |  t| j  ¡ ƒtdƒ¡ | j  d¡ |  t| j  ¡ ƒtdƒ¡ d S )Né   ç      ð?g333333@)r   r   r   Útyper   r   r   r   r   ÚtestReturnType5   s    zCreationTestCase.testReturnTypec                 C   s    | j  d¡ | j  d¡ | j  d¡ | j  d ¡ |  t| j jd¡ |  t| j jd¡ |  t| j jd¡ |  t| j jg ¡ |  t| j ji ¡ |  t| j jd¡ d S )Nr   ç        Ú r   y                )r   r   ÚassertRaisesÚ	TypeErrorr   r   r   r   ÚtestTypeCheck=   s    zCreationTestCase.testTypeCheckc                 C   s:   |   t| jjd¡ |   t| jjd¡ |   t| jjd¡ d S )Néÿÿÿÿg      ð¿)r%   Ú
ValueErrorr   r   r   r   r   r   ÚtestRangeCheckJ   s    zCreationTestCase.testRangeCheckc                 C   s”   | j  d¡ | j  d¡ |  | j  ¡ d ¡ | j  d¡ |  | j  ¡ d¡ | j  d¡ | j  d¡ |  | j  ¡ d¡ | j  d¡ |  | j  ¡ d ¡ d S )Né
   TFr#   )r   r   Úsetblockingr   r   r   r   r   r   ÚtestTimeoutThenBlockingP   s    z(CreationTestCase.testTimeoutThenBlockingc                 C   sX   | j  d¡ | j  d¡ |  | j  ¡ d¡ | j  d¡ | j  d¡ |  | j  ¡ d¡ d S )NFr   T)r   r,   r   r   r   r   r   r   r   ÚtestBlockingThenTimeout^   s    z(CreationTestCase.testBlockingThenTimeoutN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r"   r'   r*   r-   r.   r   r   r   r   r      s   r   c                   @   s*   e Zd ZdZejZdd„ ZeZdd„ Z	dS )ÚTimeoutTestCaseg       @c                 C   s
   t ƒ ‚d S r   )ÚNotImplementedErrorr   r   r   r   r   t   s    zTimeoutTestCase.setUpc           	      G   s¬   | j  |¡ t| j |ƒ}t|ƒD ]Z}t ¡ }z||Ž  W q  tjyx } z&t ¡ | }W Y d}~ q†W Y d}~q d}~0 0 q |  d¡ |  	||| j
 ¡ |  ||d ¡ dS )z²
        Test the specified socket method.

        The method is run at most `count` times and must raise a socket.timeout
        within `timeout` + self.fuzz seconds.
        Nzsocket.timeout was not raisedr    )r   r   ÚgetattrÚrangeÚtimeÚ	monotonicr   ÚtimeoutZfailZ
assertLessÚfuzzZassertGreater)	r   Úcountr9   ÚmethodÚargsÚiÚt1ÚeZdeltar   r   r   Ú_sock_operationy   s    &
zTimeoutTestCase._sock_operationN)
r/   r0   r1   r:   r   ZHOSTÚ	localhostr   r   rA   r   r   r   r   r3   i   s
   r3   c                   @   s\   e Zd ZdZdd„ Zdd„ Ze dd¡dd	„ ƒZd
d„ Z	dd„ Z
dd„ Zdd„ Zdd„ ZdS )ÚTCPTimeoutTestCasez3TCP test case for socket.socket() timeout functionsc                 C   s"   t   t jt j¡| _tddƒ| _d S )Nzwww.python.org.éP   )r   r	   r
   r   r   Úaddr_remoter   r   r   r   r   “   s    zTCPTimeoutTestCase.setUpc                 C   s   | j  ¡  d S r   r   r   r   r   r   r   —   s    zTCPTimeoutTestCase.tearDownTz*need to replace these hosts; see bpo-35518c              
   C   s$  t ddƒ}t ddƒ}d}t tjtj¡}tj}| |¡ zdz| |¡ W nF tjy\   Y n4 t	yŽ } z|j
t
jkrzd}W Y d }~n
d }~0 0 W | ¡  ~n| ¡  ~0 |rÖ|  d |d |d	 ||d |d	 ¡¡ || _t | jd ¡" |  d	d
d| j¡ W d   ƒ n1 s0    Y  d S )Nzblackhole.snakebite.netiZÝ  zwhitehole.snakebite.neti[Ý  TFzÇWe didn't receive a connection reset (RST) packet from {}:{} within {} seconds, so we're unable to test connect timeout against the corresponding {}:{} (which is configured to silently drop packets).r   r   gü©ñÒMbP?Úconnect)r   r   r	   r
   r   ZLOOPBACK_TIMEOUTr   rF   r9   ÚOSErrorÚerrnoZECONNREFUSEDr   ZskipTestÚformatrE   r   r   rA   )r   Z	blackholeZ	whiteholeÚskipr   r9   Úerrr   r   r   ÚtestConnectTimeoutš   s<    


ÿ÷ÿz%TCPTimeoutTestCase.testConnectTimeoutc                 C   sR   t  | jd ¡. | j | j¡ |  dddd¡ W d   ƒ n1 sD0    Y  d S )Nr   r   ç      ø?Úrecvé   )r   r   rE   r   rF   rA   r   r   r   r   ÚtestRecvTimeoutì   s    z"TCPTimeoutTestCase.testRecvTimeoutc                 C   s,   t  | j| j¡ | j ¡  |  ddd¡ d S )Nr   rM   Úaccept)r   Ú	bind_portr   rB   ÚlistenrA   r   r   r   r   ÚtestAcceptTimeoutò   s    
z$TCPTimeoutTestCase.testAcceptTimeoutc                 C   sn   t   t jt j¡J}t || j¡ | ¡  | j | 	¡ ¡ |  
ddddd ¡ W d   ƒ n1 s`0    Y  d S )Néd   rM   Úsendó   Xé@ ©r   r	   r
   r   rR   rB   rS   r   rF   ÚgetsocknamerA   ©r   Zservr   r   r   ÚtestSendø   s
    zTCPTimeoutTestCase.testSendc              	   C   st   t   t jt j¡P}t || j¡ | ¡  | j | 	¡ ¡ |  
ddddd | 	¡ ¡ W d   ƒ n1 sf0    Y  d S )NrU   rM   ÚsendtorW   rX   rY   r[   r   r   r   Ú
testSendto  s    ÿzTCPTimeoutTestCase.testSendtoc                 C   sn   t   t jt j¡J}t || j¡ | ¡  | j | 	¡ ¡ |  
ddddd ¡ W d   ƒ n1 s`0    Y  d S )NrU   rM   ÚsendallrW   rX   rY   r[   r   r   r   ÚtestSendall  s
    zTCPTimeoutTestCase.testSendallN)r/   r0   r1   r2   r   r   ÚunittestZskipIfrL   rP   rT   r\   r^   r`   r   r   r   r   rC      s   

Q	
rC   c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚUDPTimeoutTestCasez3UDP test case for socket.socket() timeout functionsc                 C   s   t   t jt j¡| _d S r   )r   r	   Ú
SOCK_DGRAMr   r   r   r   r   r     s    zUDPTimeoutTestCase.setUpc                 C   s   | j  ¡  d S r   r   r   r   r   r   r     s    zUDPTimeoutTestCase.tearDownc                 C   s$   t  | j| j¡ |  dddd¡ d S )Nr   rM   ÚrecvfromrO   )r   rR   r   rB   rA   r   r   r   r   ÚtestRecvfromTimeout  s    z&UDPTimeoutTestCase.testRecvfromTimeoutN)r/   r0   r1   r2   r   r   re   r   r   r   r   rb     s   rb   c                   C   s   t  d¡ d S )Nr   )r   Zrequiresr   r   r   r   ÚsetUpModule%  s    rf   Ú__main__)r2   Ú	functoolsra   Útestr   Ztest.supportr   Zis_resource_enabledZskip_expectedr7   rH   r   Ú	lru_cacher   ZTestCaser   r3   rC   rb   rf   r/   Úmainr   r   r   r   Ú<module>   s$   
M' 