U
    n5{iï  ã                   @  sž   d Z ddlmZ ddlZddlmZ ddlmZ ddlm	Z	 ddl
mZ e	dkr^dd	lmZ ndd
lmZ G dd„ dƒZG dd„ deƒZG dd„ dejƒZdS )zK
Tests for the internal implementation details of L{twisted.internet.udp}.
é    )ÚannotationsN)Úudp)ÚDatagramProtocol)ÚplatformType)ÚunittestÚwin32)ÚWSAEWOULDBLOCK)ÚEWOULDBLOCKc                   @  s@   e Zd ZdZdddœdd„Zdddœd	d
„Zdddœdd„ZdS )ÚStringUDPSocketa  
    A fake UDP socket object, which returns a fixed sequence of strings and/or
    socket errors.  Useful for testing.

    @ivar retvals: A C{list} containing either strings or C{socket.error}s.

    @ivar connectedAddr: The address the socket is connected to.
    zlist[bytes | socket.error]ÚNone)ÚretvalsÚreturnc                 C  s   || _ d | _d S ©N)r   ÚconnectedAddr)Úselfr   © r   úL/tmp/pip-unpacked-wheel-mnhg7r0q/twisted/internet/test/test_udp_internals.pyÚ__init__    s    zStringUDPSocket.__init__Úobject)Úaddrr   c                 C  s
   || _ d S r   )r   )r   r   r   r   r   Úconnect$   s    zStringUDPSocket.connectÚintztuple[bytes, None])Úsizer   c                 C  s$   | j  d¡}t|tjƒr|‚|dfS )zH
        Return (or raise) the next value from C{self.retvals}.
        r   N)r   ÚpopÚ
isinstanceÚsocketÚerror)r   r   Úretr   r   r   Úrecvfrom'   s    zStringUDPSocket.recvfromN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r   r   r
      s   	r
   c                   @  s0   e Zd ZdZddœdd„Zddddœd	d
„ZdS )Ú	KeepReadsz%
    Accumulate reads in a list.
    r   ©r   c                 C  s
   g | _ d S r   )Úreads)r   r   r   r   r   6   s    zKeepReads.__init__Úbytesr   )Údatar   r   c                 C  s   | j  |¡ d S r   )r%   Úappend)r   r'   r   r   r   r   ÚdatagramReceived9   s    zKeepReads.datagramReceivedN)r   r    r!   r"   r   r)   r   r   r   r   r#   1   s   r#   c                   @  sH   e Zd ZdZddœdd„Zddœdd„Zddœdd	„Zddœd
d„ZdS )ÚErrorsTestsz/
    Error handling tests for C{udp.Port}.
    r   r$   c                 C  sˆ   t j d¡ |  t jjd¡ tƒ }t  d|¡}tddt 	d¡dt 	d¡gƒ|_| 
¡  |  |jddg¡ | 
¡  |  |jdddg¡ dS )z¤
        Socket reads with some good data followed by a socket error which can
        be ignored causes reading to stop, and no log messages to be logged.
        i¨äÿÿNs   results   123s   456)r   Z_sockErrReadIgnorer(   Ú
addCleanupÚremover#   ÚPortr
   r   r   ÚdoReadÚassertEqualr%   ©r   ÚprotocolÚportr   r   r   Útest_socketReadNormalB   s    ÿz!ErrorsTests.test_socketReadNormalc                 C  sŒ   t j d¡ |  t jjd¡ tƒ }dd„ |_t  d|¡}tdt	 
d¡dt	 
t¡gƒ|_	| ¡  |  |jdg¡ | ¡  |  |jddg¡ dS )zË
        If the socket is unconnected, socket reads with an immediate
        connection refusal are ignored, and reading stops. The protocol's
        C{connectionRefused} method is not called.
        é�èÿÿc                   S  s   dd S )Né   r   r   r   r   r   r   Ú<lambda>e   ó    z5ErrorsTests.test_readImmediateError.<locals>.<lambda>Nó   aó   b)r   Ú_sockErrReadRefuser(   r+   r,   r#   ÚconnectionRefusedr-   r
   r   r   r	   r.   r/   r%   r0   r   r   r   Útest_readImmediateErrorX   s    
ÿz#ErrorsTests.test_readImmediateErrorc                   s¼   t j d¡ |  t jjd¡ tƒ }g ‰ ‡ fdd„|_t  d|¡}tdt	 
d¡dt	 
t¡gƒ|_	| dd¡ | ¡  |  |jdg¡ |  ˆ d	g¡ | ¡  |  |jddg¡ |  ˆ d	g¡ dS )
zÂ
        If the socket connected, socket reads with an immediate
        connection refusal are ignored, and reading stops. The protocol's
        C{connectionRefused} method is called.
        r4   c                     s
   ˆ   d¡S )NT)r(   r   ©Zrefusedr   r   r6   �   r7   z>ErrorsTests.test_connectedReadImmediateError.<locals>.<lambda>Nr8   r9   z	127.0.0.1i'  T)r   r:   r(   r+   r,   r#   r;   r-   r
   r   r   r	   r   r.   r/   r%   r0   r   r=   r   Ú test_connectedReadImmediateErrort   s     ÿz,ErrorsTests.test_connectedReadImmediateErrorc                 C  sJ   t ƒ }t d|¡}tdt d¡gƒ|_|  tj|j¡ |  |j	dg¡ dS )zG
        Socket reads with an unknown socket error are raised.
        Ns   goodiÇúÿÿ)
r#   r   r-   r
   r   r   ÚassertRaisesr.   r/   r%   r0   r   r   r   Útest_readUnknownError“   s
    z!ErrorsTests.test_readUnknownErrorN)r   r    r!   r"   r3   r<   r>   r@   r   r   r   r   r*   =   s
   r*   )r"   Ú
__future__r   r   Ztwisted.internetr   Ztwisted.internet.protocolr   Ztwisted.python.runtimer   Ztwisted.trialr   Úerrnor   r	   r
   r#   ZSynchronousTestCaser*   r   r   r   r   Ú<module>   s   