File: //usr/lib/python3/dist-packages/twisted/internet/test/__pycache__/test_tcp.cpython-38.pyc
U
W[�� �
@ s� d Z ddlmZmZ eZddlZddlZddlZddl Z ddl
Z
ddlmZ ddl
Z
ddlmZmZ ddlmZmZ ddlmZ ddlmZ dd lmZ dd
lmZ ddlmZ ddlmZm Z m!Z! dd
l"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+ ddl,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5 ddl6m7Z7m8Z8m9Z9 ddl:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZA ddlBmCZCmDZD ddlEmFZFmGZGmHZHmIZImJZJmKZK ddlLmMZMmNZN ddlOmPZPmQZQmRZR ddl:mSZSmTZTmUZU ddlVmWZWmXZXmYZYmZZZm[Z[m\Z\m]Z] ddl^m_Z_ ddl`maZambZb ddl`mcZcmdZd ddlemfZfmgZg zddlhmiZi W n ejk
�rF dZkY nX ddllmmZm dZkdZnze
�
e
joe
jp�Znen�qd� W n. e
jrk
�r� Zs zetes�ZuW 5 dZs[sX Y nX dZuendk �r�en�v� e�w� �r�dd lxmyZy eyjzZ{d!Z|n:zdd"lxm}Z} W n ejk
�r d#d$� Z{Y nX e}j~Z{dZ|d%d&� Zd'd(� Z�G d)d*� d*e��Z�G d+d,� d,e!�Z�G d-d.� d.eR�Z�ee=�G d/d0� d0e���Z�ee=e�� G d1d2� d2e!�Z�G d3d4� d4e!�Z�G d5d6� d6e2�Z�G d7d8� d8e��Z�ee@�G d9d:� d:e���Z�G d;d<� d<e7e.e/�Z�G d=d>� d>e��Z�G d?d@� d@e��Z�G dAdB� dBe7�Z�G dCdD� dDe��Z�G dEdF� dFe��Z�dGdH� Z�G dIdJ� dJe�Z�ee��e
jnG dKdL� dLe����Z�G dMdN� dNe �Z�dOdP� Z�G dQdR� dRe �Z�G dSdT� dTe-�Z�G dUdV� dVe��Z�G dWdX� dXe��Z�G dYdZ� dZe��Z�G d[d\� d\e��Z�G d]d^� d^e7e�e�e_e��Z�G d_d`� d`e7e�e�e_e��Z�G dadb� dbeR�Z�dcdd� Z�dedf� Z�dgdh� Z�G didj� dje7�Z�G dkdl� dle��Z�G dmdn� dne��Z�G dodp� dpe�e�e7�Z�G dqdr� dre�e�e7�Z�e�� ��e���� � e�� ��e���� � e�� ��e���� � e�� ��e���� � e�� ��e���� � e�� ��e���� � e�� ��e���� � e�� ��e���� � e�� ��e���� � G dsdt� dte1�Z�G dudv� dve1�Z�G dwdx� dxe1�Z�G dydz� dze��Z�G d{d|� d|e1�Z�G d}d~� d~e1�Z�G dd�� d�e1�Z�G d�d�� d�e��Z�G d�d�� d�e��Z�G d�d�� d�e��Z�G d�d�� d�e��Z�G d�d�� d�e1�Z�G d�d�� d�e1�Z�G d�d�� d�e��Z�G d�d�� d�e��Z�G d�d�� d�e��Z�G d�d�� d�e��Z�G d�d�� d�e��Z�G d�d�� d�e7e��Z�e�� ��e���� � G d�d�� d�e!�Z�G d�d�� d�e �Z�G d�d�� d�e �Z�G d�d�� d�e �Z�dS )�zU
Tests for implementations of L{IReactorTCP} and the TCP parts of
L{IReactorSocket}.
� )�division�absolute_importN��wraps)� Interface�implementer)�verifyClass�verifyObject)�Logger)�long)�platform)�Failure)�log)�SkipTest�SynchronousTestCase�TestCase) �ConnectionLost� UserError�ConnectionRefusedError�ConnectionDone�ConnectionAborted�DNSLookupError�
NoProtocol�ConnectBindError�ConnectionClosed) �LogObserverMixin�ConnectionTestsMixin�StreamClientTestsMixin�findFreePort�ConnectableProtocol�EndpointCreator�runProtocolsWithReactor�Stop�BrokenContextFactory)�ReactorBuilder�needsRunningReactor�stopOnError)�ILoggingContext�
IConnector�
IReactorFDSet�IReactorSocket�IReactorTCP�IResolverSimple�
ITLSTransport)�IPv4Address�IPv6Address)�Deferred�DeferredList�
maybeDeferred�
gatherResults�succeed�fail)�TCP4ServerEndpoint�TCP4ClientEndpoint)�
ServerFactory�
ClientFactory�Protocol)�
IPushProducer�
IPullProducer�IHalfCloseableProtocol)�_BuffersLogs�
Connection�_FileDescriptorReservation�_IFileDescriptorReservation�_NullFileDescriptorReservation�Server�_resolveIPv6)�ObjectModelIntegrationMixin)�MyClientFactory�MyServerFactory)�ClosingFactory�ClientStartStopFactory)�
MemoryReactor�StringTransport)�SSLF)�ClientContextFactoryT)�::1r )�_win32ifacesz9Reserved EMFILE file descriptor not supported on Windows.)�_posixifacesc C s g S �N� rR rR rR �@/usr/lib/python3/dist-packages/twisted/internet/test/test_tcp.py�<lambda>b � rT c C s t � } | r| d S td��dS )al
Find and return a configured link local IPv6 address including a scope
identifier using the % separation syntax. If the system has no link local
IPv6 addresses, raise L{SkipTest} instead.
@raise SkipTest: if no link local address can be found or if the
C{netifaces} module is not available.
@return: a C{str} giving the address
r z#Link local IPv6 address unavailableN)�getLinkLocalIPv6Addressesr )Z addressesrR rR rS �getLinkLocalIPv6Addressj s rW c C sD |\}}d|ksd|kr.t �||�d d }n||f}| �|� dS )a7
Connect a socket to the given destination.
@param client: A C{socket.socket}.
@param destination: A tuple of (host, port). The host is a C{str}, the
port a C{int}. If the C{host} is an IPv6 IP, the address is resolved
using C{getaddrinfo} and the first version found is used.
�%�:r � N)�socket�getaddrinfo�connect)�clientZdestination�host�port�addressrR rR rS r] | s
r] c @ sP e Zd ZdZdd� Zdd� Zdd� Zdd � Zd
d� Zdd
� Z dd� Z
dd� ZdS )�
FakeSocketz�
A fake for L{socket.socket} objects.
@ivar data: A C{str} giving the data which will be returned from
L{FakeSocket.recv}.
@ivar sendBuffer: A C{list} of the objects passed to L{FakeSocket.send}.
c C s || _ g | _d S rQ )�data�
sendBuffer��selfrc rR rR rS �__init__� s zFakeSocket.__init__c C s
|| _ d S rQ )�blocking)rf rh rR rR rS �setblocking� s zFakeSocket.setblockingc C s | j S rQ �rc )rf �sizerR rR rS �recv� s zFakeSocket.recvc C s | j �|� t|�S )z�
I{Send} all of C{bytes} by accumulating it into C{self.sendBuffer}.
@return: The length of C{bytes}, indicating all the data has been
accepted.
)rd �append�len�rf �bytesrR rR rS �send� s zFakeSocket.sendc C s dS )z�
Shutdown is not implemented. The method is provided since real sockets
have it and some code expects it. No behavior of L{FakeSocket} is
affected by a call to it.
NrR )rf ZhowrR rR rS �shutdown� s zFakeSocket.shutdownc C s dS )z�
Close is not implemented. The method is provided since real sockets
have it and some code expects it. No behavior of L{FakeSocket} is
affected by a call to it.
NrR �rf rR rR rS �close� s zFakeSocket.closec G s dS )z�
Setsockopt is not implemented. The method is provided since
real sockets have it and some code expects it. No behavior of
L{FakeSocket} is affected by a call to it.
NrR )rf �argsrR rR rS �
setsockopt� s zFakeSocket.setsockoptc C s dS )z�
Return a fake file descriptor. If actually used, this will have no
connection to this L{FakeSocket} and will probably cause surprising
results.
� rR rs rR rR rS �fileno� s zFakeSocket.filenoN)�__name__�
__module__�__qualname__�__doc__rg ri rl rq rr rt rv rx rR rR rR rS rb � s rb c @ s( e Zd ZdZdd� Zdd� Zdd� ZdS ) �FakeSocketTestszT
Test that the FakeSocket can be used by the doRead method of L{Connection}
c C s$ t d�}|�d� | �|jd� d S )N� someDatar )rb ri �assertEqualrh �rf �sktrR rR rS �
test_blocking� s
zFakeSocketTests.test_blockingc C s t d�}| �|�d�d� d S )Nr~ �
)rb r rl r� rR rR rS � test_recv� s zFakeSocketTests.test_recvc C s2 t d�}|�d�}| �|d� | �|jdg� dS )z�
L{FakeSocket.send} accepts the entire string passed to it, adds it to
its send buffer, and returns its length.
rU s foo� N)rb rq r rd )rf r� �countrR rR rS � test_send� s
zFakeSocketTests.test_sendN)ry rz r{ r| r� r� r� rR rR rR rS r} � s r} c @ s e Zd ZdZdd� ZdS )�FakeProtocolzL
An L{IProtocol} that returns a value from its dataReceived method.
c C s dS )zq
Return something other than L{None} to trigger a deprecation warning for
that behavior.
rR rR re rR rR rS �dataReceived� s zFakeProtocol.dataReceivedN�ry rz r{ r| r� rR rR rR rS r� � s r� c @ sP e Zd ZdZdd� Zdd� Zdd� Zdd � Zd
d� Zdd
� Z dd� Z
dd� ZdS )�_FakeFDSetReactora�
An in-memory implementation of L{IReactorFDSet}, which records the current
sets of active L{IReadDescriptor} and L{IWriteDescriptor}s.
@ivar _readers: The set of L{IReadDescriptor}s active on this
L{_FakeFDSetReactor}
@type _readers: L{set}
@ivar _writers: The set of L{IWriteDescriptor}s active on this
L{_FakeFDSetReactor}
@ivar _writers: L{set}
c C s t � | _t � | _d S rQ )�set�_readers�_writersrs rR rR rS rg s z_FakeFDSetReactor.__init__c C s | j �|� d S rQ )r� �add�rf �readerrR rR rS � addReader s z_FakeFDSetReactor.addReaderc C s || j kr| j �|� d S rQ )r� �remover� rR rR rS �removeReader s
z_FakeFDSetReactor.removeReaderc C s | j �|� d S rQ )r� r� �rf �writerrR rR rS � addWriter s z_FakeFDSetReactor.addWriterc C s || j kr| j �|� d S rQ )r� r� r� rR rR rS �removeWriter s
z_FakeFDSetReactor.removeWriterc C s | � � | �� }| �� |S rQ )�
getReaders�
getWritersrg �rf �resultrR rR rS � removeAll s z_FakeFDSetReactor.removeAllc C s
t | j�S rQ )�listr� rs rR rR rS r� $ s z_FakeFDSetReactor.getReadersc C s
t | j�S rQ )r� r� rs rR rR rS r� ( s z_FakeFDSetReactor.getWritersN)ry rz r{ r| rg r� r� r� r� r� r� r� rR rR rR rS r� � s
r� c @ s8 e Zd ZdZdd� Zdd� Zdd� Zdd � Zd
d� ZdS )
�TCPServerTestsz<
Whitebox tests for L{twisted.internet.tcp.Server}.
c C sJ t � | _G dd� dt�}td�| _t� | _t| j| jd|� d | j�| _d S )Nc @ s e Zd ZdZdS )z&TCPServerTests.setUp.<locals>.FakePortr� N)ry rz r{ Z_realPortNumberrR rR rR rS �FakePort5 s r� rU )� r ) r� �reactor�objectrb r� r: �protocolrC �server)rf r� rR rR rS �setUp3 s
�zTCPServerTests.setUpc C s4 | j �ttd��� | j �d� | �| jjg � dS )zq
L{Server.write} discards bytes passed to it if called after it has lost
its connection.
�Simulated lost connection� hello worldN)r� �connectionLostr
� Exception�writer r� rd rs rR rR rS �test_writeAfterDisconnect= s
�z(TCPServerTests.test_writeAfterDisconnectc C s d| j _| �� dS )z�
L{Server.write} discards bytes passed to it if called after it has lost
its connection when the connection had started TLS.
TN)r� �TLSr� rs rR rR rS �!test_writeAfterDisconnectAfterTLSH s z0TCPServerTests.test_writeAfterDisconnectAfterTLSc C s6 | j �ttd��� | j �dg� | �| jjg � dS )zy
L{Server.writeSequence} discards bytes passed to it if called after it
has lost its connection.
r� r� N)r� r� r
r� �
writeSequencer r� rd rs rR rR rS �!test_writeSequenceAfterDisconnectQ s
�z0TCPServerTests.test_writeSequenceAfterDisconnectc C s d| j _| �� dS )z�
L{Server.writeSequence} discards bytes passed to it if called after it
has lost its connection when the connection had started TLS.
TN)r� r� r� rs rR rR rS �)test_writeSequenceAfterDisconnectAfterTLS\ s z8TCPServerTests.test_writeSequenceAfterDisconnectAfterTLSN) ry rz r{ r| r� r� r� r� r� rR rR rR rS r� / s
r� c @ s2 e Zd ZdZdd� Zdd� Zdd� Zes.de_d S )
�TCPConnectionTestsz@
Whitebox tests for L{twisted.internet.tcp.Connection}.
c C sj t d�}t� }t||�}|�� | �tjg�}| �|d d t� | �|d d d� | �t|�d� dS )z�
When an L{IProtocol} implementation that returns a value from its
C{dataReceived} method, a deprecated warning is emitted.
r~ r �category�messagez�Returning a value other than None from twisted.internet.test.test_tcp.FakeProtocol.dataReceived is deprecated since Twisted 11.0.0.rw N) rb r� r? ZdoReadZ
flushWarningsr� r �DeprecationWarningrn )rf r� r� �conn�warningsrR rR rS �test_doReadWarningIsRaisedj s
�z-TCPConnectionTests.test_doReadWarningIsRaisedc C s( t d�}t� }t||�}| �|j� dS )z
The C{TLS} attribute of a L{Connection} instance is C{False} before
L{Connection.startTLS} is called.
rU N)rb r� r? �assertFalser� �rf r� r� r� rR rR rS �test_noTLSBeforeStartTLS} s
z+TCPConnectionTests.test_noTLSBeforeStartTLSc C sB t d�}t� }t||t� d�}d|_|�t� d� | �|j� dS )z}
The C{TLS} attribute of a L{Connection} instance is C{True} after
L{Connection.startTLS} is called.
rU �r� TN) rb r� r? r� Z_tlsClientDefault�startTLSrM �
assertTruer� r� rR rR rS �test_tlsAfterStartTLS� s z(TCPConnectionTests.test_tlsAfterStartTLSzNo SSL support availableN) ry rz r{ r| r� r� r� �useSSL�skiprR rR rR rS r� f s r� c @ s$ e Zd ZdZdZdd� Zdd� ZdS )�
TCPCreatorzO
Create IPv4 TCP endpoints for L{runProtocolsWithReactor}-based tests.
� 127.0.0.1c C s t |d| jd�S )z4
Create a server-side TCP endpoint.
r �� interface)r6 r� )rf r� rR rR rS r� � s zTCPCreator.serverc C s t || j|j�S )z�
Create a client end point that will connect to the given address.
@type serverAddress: L{IPv4Address}
)r7 r� r` )rf r� �
serverAddressrR rR rS r^ � s zTCPCreator.clientN)ry rz r{ r| r� r� r^ rR rR rR rS r� � s r� c @ s e Zd ZdZdd� ZdS )�TCP6CreatoraV
Create IPv6 TCP endpoints for
C{ReactorBuilder.runProtocolsWithReactor}-based tests.
The endpoint types in question here are still the TCP4 variety, since
these simply pass through IPv6 address literals to the reactor, and we are
only testing address literals, not name resolution (as name resolution has
not yet been implemented). See http://twistedmatrix.com/trac/ticket/4470
for more specific information about new endpoint classes. The naming is
slightly misleading, but presumably if you're passing an IPv6 literal, you
know what you're asking for.
c C s t � | _d S rQ �rW r� rs rR rR rS rg � s zTCP6Creator.__init__N)ry rz r{ r| rg rR rR rR rS r� � s r� c @ s e Zd ZdZdd� Zdd� ZdS )�FakeResolverzR
A resolver implementation based on a C{dict} mapping names to addresses.
c C s
|| _ d S rQ )�names)rf r� rR rR rS rg � s zFakeResolver.__init__c C s: zt | j| �W S tk
r4 ttd| �� Y S X dS )z�
Return the address mapped to C{name} if it exists, or raise a
C{DNSLookupError}.
@param name: The name to resolve.
@param timeout: The lookup timeout, ignore here.
zFakeResolver couldn't find N)r4 r� �KeyErrorr5 r )rf �nameZtimeoutrR rR rS �
getHostByName� s zFakeResolver.getHostByNameN)ry rz r{ r| rg r� rR rR rR rS r� � s r� c @ sZ e Zd ZdZefZdZedd� �Zedd� �Z dd� Z
d d
� Zdd� Zd
d� Z
dd� ZdS )�TCPClientTestsBasea�
Base class for builders defining tests related to
L{IReactorTCP.connectTCP}. Classes which uses this in must provide all of
the documented instance variables in order to specify how the test works.
These are documented as instance variables rather than declared as methods
due to some peculiar inheritance ordering concerns, but they are
effectively abstract methods.
@ivar endpoints: A client/server endpoint creator appropriate to the
address family being tested.
@type endpoints: L{twisted.internet.test.connectionmixins.EndpointCreator}
@ivar interface: An IP address literal to locally bind a socket to as well
as to connect to. This can be any valid interface for the local host.
@type interface: C{str}
@ivar port: An unused local listening port to listen on and connect to.
This will be used in conjunction with the C{interface}. (Depending on
what they're testing, some tests will locate their own port with
L{findFreePort} instead.)
@type port: C{int}
@ivar family: an address family constant, such as L{socket.AF_INET},
L{socket.AF_INET6}, or L{socket.AF_UNIX}, which indicates the address
family of the transport type under test.
@type family: C{int}
@ivar addressClass: the L{twisted.internet.interfaces.IAddress} implementor
associated with the transport type under test. Must also be a
3-argument callable which produces an instance of same.
@type addressClass: C{type}
@ivar fakeDomainName: A fake domain name to use, to simulate hostname
resolution and to distinguish between hostnames and IP addresses where
necessary.
@type fakeDomainName: C{str}
Nc C s( | j dk r| j �� jS t| j| j�d S )z�
Return the port number to connect to, using C{self._port} set up by
C{listen} if available.
@return: The port number to connect to.
@rtype: C{int}
Nrw )�_port�getHostr` r r� �familyrs rR rR rS r` s
zTCPClientTestsBase.portc C s | j jS )zK
Return the interface attribute from the endpoints object.
)� endpointsr� rs rR rR rS r� s zTCPClientTestsBase.interfacec C s |j d|| jd�| _| jS )z�
Start a TCP server with the given C{factory}.
@param reactor: The reactor to create the TCP port in.
@param factory: The server factory.
@return: A TCP port instance.
r r� )� listenTCPr� r� �rf r� �factoryrR rR rS �listen s
zTCPClientTestsBase.listenc C s |� | j| j|�S )z�
Start a TCP client with the given C{factory}.
@param reactor: The reactor to create the connection in.
@param factory: The client factory.
@return: A TCP connector instance.
)�
connectTCPr� r` r� rR rR rS r] + s
zTCPClientTestsBase.connectc
s� t � ���� �t� }�|_t��� G dd� dt�� �j����|�}� ��fdd�}|� |�}�fdd�}dd� }|�
||� �fd d
�}|� |�}|�tj
� �fdd�} |� | � ���� d
S )zr
When the factory's C{buildProtocol} returns L{None} the connection is
gracefully closed.
c @ s e Zd Zdd� ZdS )zETCPClientTestsBase.test_buildProtocolReturnsNone.<locals>.NoneFactoryc S s d S rQ rR �rf ra rR rR rS �
buildProtocolF s zSTCPClientTestsBase.test_buildProtocolReturnsNone.<locals>.NoneFactory.buildProtocolN�ry rz r{ r� rR rR rR rS �NoneFactoryE s r� c s"