3
sY]o,                 @   s   d Z ddlZddlZddlmZ ejd ZddlZddlZddl	Z	ej
 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re  dS )z&Unit tests for socket timeout feature.    N)supportnetworkc             C   s2   t j|  tj| |tjtjd d S Q R X dS )zResolve 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socketZgetaddrinfoAF_INETSOCK_STREAM)hostZport r
   "lib/python3.6/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 j t jt j| _d S )N)r   r   r   sock)selfr
   r
   r   setUp   s    zCreationTestCase.setUpc             C   s   | j j  d S )N)r   close)r   r
   r
   r   tearDown!   s    zCreationTestCase.tearDownc             C   s   | j | jj d d d S )Nztimeout not disabled by default)assertEqualr   
gettimeout)r   r
   r
   r   testObjectCreation$   s    z#CreationTestCase.testObjectCreationc             C   s^   | j jd | j| j j d | j jd | j| j j d | j jd  | j| j j d  d S )NgzGa@   )r   
settimeoutr   r   )r   r
   r
   r   testFloatReturnValue)   s    z%CreationTestCase.testFloatReturnValuec             C   sP   | j jd | jt| j j td | j jd | jt| j j td d S )N   g      ?g333333@)r   r   r   typer   )r   r
   r
   r   testReturnType4   s    zCreationTestCase.testReturnTypec             C   s   | j jd | j jd | j jd | j jd  | jt| j jd | jt| j jd | jt| j jf  | jt| j jg  | jt| j ji  | jt| j jd d S )Nr   g         y                )r   r   assertRaises	TypeError)r   r
   r
   r   testTypeCheck<   s    zCreationTestCase.testTypeCheckc             C   s:   | j t| jjd | j t| jjd | j t| jjd d S )Nr   g      ?r    g      )r   
ValueErrorr   r   )r   r
   r
   r   testRangeCheckI   s    zCreationTestCase.testRangeCheckc             C   s   | j jd | j jd | j| j j d  | j jd | j| j j d | j jd | j jd | j| j j d | j jd | j| j j d  d S )N
   r   r   g        )r   r   setblockingr   r   )r   r
   r
   r   testTimeoutThenBlockingO   s    z(CreationTestCase.testTimeoutThenBlockingc             C   sX   | j jd | j jd | j| j j d | j jd | j jd | j| j j d d S )Nr   r   )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 )N)NotImplementedError)r   r
   r
   r   r   s   s    zTimeoutTestCase.setUpc       	      G   s   | j j| t| j |}xbt|D ]L}tj }y||  W q" tjk
rl } ztj | }P W Y dd}~X q"X q"W | jd | j||| j	  | 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 raisedg      ?)r   r   getattrrangetimer   timeoutZfailZ
assertLessfuzzZassertGreater)	r   countr0   methodargsiZt1eZdeltar
   r
   r   _sock_operationx   s    
zTimeoutTestCase._sock_operationN)
r'   r(   r)   r1   r   ZHOST	localhostr   r   r7   r
   r
   r
   r   r+   h   s
   r+   c               @   sP   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S )TCPTimeoutTestCasez3TCP test case for socket.socket() timeout functionsc             C   s"   t j t jt j| _tdd| _d S )Nzwww.python.org.P   )r   r   r   r   r   addr_remote)r   r
   r
   r   r      s    zTCPTimeoutTestCase.setUpc             C   s   | j j  d S )N)r   r   )r   r
   r
   r   r      s    zTCPTimeoutTestCase.tearDownc              C   s  t dd}t dd}d}tjtjtj}d}|j| zZy|j| W nF tjk
r\   Y n2 tk
r } z|jtj	kr|d}W Y d d }~X nX W d |j
  ~X |r| jdj|d	 |d
 ||d	 |d
  || _tj| jd	  | jd
dd| j W d Q R X d S )Nzblackhole.snakebite.netiZ  zwhitehole.snakebite.neti[  Tr   FzWe 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   gMbP?connect)r   r   r   r   r   r<   r0   OSErrorerrnoZECONNREFUSEDr   ZskipTestformatr;   r   r   r7   )r   Z	blackholeZ	whiteholeskipr   r0   errr
   r
   r   testConnectTimeout   s4    


z%TCPTimeoutTestCase.testConnectTimeoutc             C   s>   t j| jd $ | jj| j | jdddd W d Q R X d S )Nr   r   g      ?Zrecvi   )r   r   r;   r   r<   r7   )r   r
   r
   r   testRecvTimeout   s    z"TCPTimeoutTestCase.testRecvTimeoutc             C   s,   t j| j| j | jj  | jddd d S )Nr   g      ?Zaccept)r   	bind_portr   r8   listenr7   )r   r
   r
   r   testAcceptTimeout   s    
z$TCPTimeoutTestCase.testAcceptTimeoutc             C   sZ   t j t jt j@}tj|| j |j  | jj|j	  | j
ddddd  W d Q R X d S )Nd   g      ?send   Xi@ )r   r   r   r   rD   r8   rE   r   r<   getsocknamer7   )r   servr
   r
   r   testSend   s
    zTCPTimeoutTestCase.testSendc             C   s`   t j t jt jF}tj|| j |j  | jj|j	  | j
ddddd |j	  W d Q R X d S )NrG   g      ?ZsendtorI   i@ )r   r   r   r   rD   r8   rE   r   r<   rJ   r7   )r   rK   r
   r
   r   
testSendto  s    zTCPTimeoutTestCase.testSendtoc             C   sZ   t j t jt j@}tj|| j |j  | jj|j	  | j
ddddd  W d Q R X d S )NrG   g      ?ZsendallrI   i@ )r   r   r   r   rD   r8   rE   r   r<   rJ   r7   )r   rK   r
   r
   r   testSendall  s
    zTCPTimeoutTestCase.testSendallN)r'   r(   r)   r*   r   r   rB   rC   rF   rL   rM   rN   r
   r
   r
   r   r9      s   T	
r9   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 j t jt j| _d S )N)r   r   Z
SOCK_DGRAMr   )r   r
   r
   r   r     s    zUDPTimeoutTestCase.setUpc             C   s   | j j  d S )N)r   r   )r   r
   r
   r   r     s    zUDPTimeoutTestCase.tearDownc             C   s$   t j| j| j | jdddd d S )Nr   g      ?Zrecvfromi   )r   rD   r   r8   r7   )r   r
   r
   r   testRecvfromTimeout  s    z&UDPTimeoutTestCase.testRecvfromTimeoutN)r'   r(   r)   r*   r   r   rP   r
   r
   r
   r   rO     s   rO   c               C   s   t jd t jttt d S )Nr   )r   ZrequiresZrun_unittestr   r9   rO   r
   r
   r
   r   	test_main&  s
    
rQ   __main__)r*   	functoolsZunittestZtestr   Zis_resource_enabledZskip_expectedr/   r>   r   	lru_cacher   ZTestCaser   r+   r9   rO   rQ   r'   r
   r
   r
   r   <module>   s    M' 