o
    ¯bå  ã                   @   s’   d 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}.
é    N)Úudp)ÚDatagramProtocol)ÚplatformType)ÚunittestÚwin32)ÚWSAEWOULDBLOCK)ÚEWOULDBLOCKc                   @   s(   e Zd ZdZdd„ Zdd„ Z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.
    c                 C   s   || _ d | _d S ©N)ÚretvalsÚconnectedAddr)Úselfr   © r   úJ/usr/lib/python3/dist-packages/twisted/internet/test/test_udp_internals.pyÚ__init__    s   
zStringUDPSocket.__init__c                 C   s
   || _ d S r
   )r   )r   Úaddrr   r   r   Úconnect$   ó   
zStringUDPSocket.connectc                 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   ÚsizeÚretr   r   r   Úrecvfrom'   s   zStringUDPSocket.recvfromN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r   r   r	      s
    	r	   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )Ú	KeepReadsz%
    Accumulate reads in a list.
    c                 C   s
   g | _ d S r
   )Úreads)r   r   r   r   r   6   r   zKeepReads.__init__c                 C   s   | j  |¡ d S r
   )r    Úappend)r   Údatar   r   r   r   ÚdatagramReceived9   s   zKeepReads.datagramReceivedN)r   r   r   r   r   r#   r   r   r   r   r   1   s    r   c                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )ÚErrorsTestsz/
    Error handling tests for C{udp.Port}.
    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g d¢¡ 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¨äÿÿNó   resultó   123ó   456)r%   r&   r'   )r   Ú_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   s    z5ErrorsTests.test_readImmediateError.<locals>.<lambda>Nó   aó   b)r   Ú_sockErrReadRefuser!   r)   r*   r   ÚconnectionRefusedr+   r	   r   r   r   r,   r-   r    r.   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.
        r2   c                      s
   ˆ   d¡S )NT)r!   r   ©Úrefusedr   r   r4   �   s   
 z>ErrorsTests.test_connectedReadImmediateError.<locals>.<lambda>Nr5   r6   z	127.0.0.1i'  T)r   r7   r!   r)   r*   r   r8   r+   r	   r   r   r   r   r,   r-   r    r.   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    r.   r   r   r   Útest_readUnknownError“   s
   z!ErrorsTests.test_readUnknownErrorN)r   r   r   r   r1   r9   r<   r>   r   r   r   r   r$   =   s    r$   )r   r   Útwisted.internetr   Útwisted.internet.protocolr   Útwisted.python.runtimer   Útwisted.trialr   Úerrnor   r   r	   r   ÚSynchronousTestCaser$   r   r   r   r   Ú<module>   s   