o
    Òó·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„Zdd
d„Z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.
    Úretvalsúlist[bytes | socket.error]ÚreturnÚNonec                 C  s   || _ d | _d S ©N)r   ÚconnectedAddr)Úselfr   © r   únC:\Users\psant\Downloads\PAF backend\school\venv\Lib\site-packages\twisted/internet/test/test_udp_internals.pyÚ__init__    s   
zStringUDPSocket.__init__ÚaddrÚobjectc                 C  s
   || _ d S r   )r   )r   r   r   r   r   Úconnect$   ó   
zStringUDPSocket.connectÚsizeÚintútuple[bytes, None]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)r   r   r   r   )r   r   r   r   )r   r   r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r!   r   r   r   r   r
      s
    
	
r
   c                   @  s$   e Zd ZdZddd„Z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   r   zKeepReads.__init__ÚdataÚbytesr   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$   r%   r   r+   r   r   r   r   r&   1   s    
r&   c                   @  s8   e Zd ZdZddd„Zddd„Zddd	„Z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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/   r0   )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   s    z5ErrorsTests.test_readImmediateError.<locals>.<lambda>Nó   aó   b)r   Ú_sockErrReadRefuser*   r1   r2   r&   ÚconnectionRefusedr3   r
   r   r   r	   r4   r5   r'   r6   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.
        r:   c                     s
   ˆ   d¡S )NT)r*   r   ©Zrefusedr   r   r<   �   s   
 z>ErrorsTests.test_connectedReadImmediateError.<locals>.<lambda>Nr=   r>   z	127.0.0.1i'  T)r   r?   r*   r1   r2   r&   r@   r3   r
   r   r   r	   r   r4   r5   r'   r6   r   rB   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   r3   r
   r   r   ÚassertRaisesr4   r5   r'   r6   r   r   r   Útest_readUnknownError“   s
   z!ErrorsTests.test_readUnknownErrorNr,   )r"   r#   r$   r%   r9   rA   rC   rE   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   