HEX
Server: Apache
System: Linux scp1.abinfocom.com 5.4.0-216-generic #236-Ubuntu SMP Fri Apr 11 19:53:21 UTC 2025 x86_64
User: confeduphaar (1010)
PHP: 8.1.33
Disabled: exec,passthru,shell_exec,system
Upload Files
File: //usr/lib/python3/dist-packages/twisted/test/__pycache__/test_tcp_internals.cpython-38.pyc
U


W[=3�@s dZddlmZmZddlZddlZddlZzddlZWnek
rPdZYnXddl	m
Z
ddlmZm
Z
ddlmZmZmZmZmZmZmZmZmZmZmZddlmZmZddlmZdd	lm Z m!Z!dd
l"m#Z#m$Z$Gdd�de
�Z%Gd
d�de
�Z&e$j'�(e#��sdZ)e)e%_*e)e&_*dS)z
Whitebox tests for TCP APIs.
�)�division�absolute_importN)�TestCase)�compat�log)�_ACCEPT_ERRORS�ECONNABORTED�EPERM�ENOMEM�ENFILE�EAGAIN�EMFILE�ENOBUFS�EINPROGRESS�EWOULDBLOCK�Port)�Protocol�
ServerFactory)�platform)�
maybeDeferred�
gatherResults)�reactor�
interfacesc@sFeZdZdZdZdd�Zdd�Zdd�Zd	d
�Ze	�
�dkrBde_d
S)�PlatformAssumptionsTestsz4
    Test assumptions about platform behaviors.
    i cCs\g|_tdk	rXddlm}t|��d}t�tj�|_t�tj||jdf�|d|_	dS)Nr)�_listOpenFDs���d)
�openSockets�resourceZtwisted.internet.processr�len�	getrlimit�
RLIMIT_NOFILE�originalFileLimit�	setrlimit�socketLimit)�selfrZnewLimit�r'�A/usr/lib/python3/dist-packages/twisted/test/test_tcp_internals.py�setUp$szPlatformAssumptionsTests.setUpcCsT|jr|j����qtdk	rPt�tj�d}t|jd|�}t�tj||f�dS)Nrr)	r�pop�closerr!r"�minr#r$)r&ZcurrentHardLimitZnewSoftLimitr'r'r(�tearDown4sz!PlatformAssumptionsTests.tearDowncCst��}|j�|�|S)z|
        Create and return a new socket object, also tracking it so it can be
        closed in the test tear down.
        )�socketr�append)r&�sr'r'r(r.AszPlatformAssumptionsTests.socketcCs�|��}|�d�|��d}|�d�|��}|�d�t|j�D]V}z|��WqDtjk
r�}z$|jdt	t
fkr�WY�q�n�W5d}~XYqDXqD|�d�|�|�
d|f�dtf�|�tj|j�}|�|jdt	t
f�dS)	z�
        Test that the platform accept(2) call fails with either L{EMFILE} or
        L{ENOBUFS} when there are too many file descriptors open.
        )�	127.0.0.1rr�FrNz7Could provoke neither EMFILE nor ENOBUFS from platform.r1)r.ZbindZgetsocknameZlistenZsetblocking�ranger%�error�argsr
r�failZassertInZ
connect_exr�assertRaises�accept)r&�portZserverPortNumber�client�i�e�excr'r'r(�test_acceptOutOfFilesKs&



�z.PlatformAssumptionsTests.test_acceptOutOfFiles�win32zhWindows requires an unacceptably large amount of resources to provoke this behavior in the naive manner.N)�__name__�
__module__�__qualname__�__doc__r%r)r-r.r>r�getType�skipr'r'r'r(rs

%�rc@s�eZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
dd�Ze�
�dkr^de_dd�Ze�
�dkrxde_dd�Zdd�Ze�
�dkr�de_dd�ZdS)�SelectReactorTestsz7
    Tests for select-specific failure conditions.
    cCsg|_g|_t�|jj�dS�N)�ports�messagesrZaddObserverr/�r&r'r'r(r)|szSelectReactorTests.setUpcCs"t�|jj�tdd�|jD��S)NcSsg|]}t|j��qSr')r�
stopListening)�.0�pr'r'r(�
<listcomp>�s�z/SelectReactorTests.tearDown.<locals>.<listcomp>)rZremoveObserverrIr/rrHrJr'r'r(r-�s�zSelectReactorTests.tearDowncCs&t|||d�}|��|j�|�|S)z
        Create, start, and return a new L{Port}, also tracking it so it can
        be stopped in the test tear down.
        ��	interface)rZstartListeningrHr/)r&Z
portNumber�factoryrPrMr'r'r(r9�szSelectReactorTests.portcs�G�fdd�dt�}t�}|jd|dd�}|�|d|��|��d�tj����fdd	�|jD�}|�t	|�dd
|jf�dS)a�
        Test behavior in the face of an exception from C{accept(2)}.

        On any exception which indicates the platform is unable or unwilling
        to allocate further resources to us, the existing port should remain
        listening, a message should be logged, and the exception should not
        propagate outward from doRead.

        @param socketErrorNumber: The errno to simulate from accept.
        cseZdZdZ�fdd�ZdS)z9SelectReactorTests._acceptFailureTest.<locals>.FakeSocketzI
            Pretend to be a socket in an overloaded system.
            cst��t�����dSrG)r.r4�os�strerrorrJ��socketErrorNumberr'r(r8�s�z@SelectReactorTests._acceptFailureTest.<locals>.FakeSocket.acceptN�r@rArBrCr8r'rTr'r(�
FakeSocket�srWrr1rOr.z/Could not accept new connection ({acceptError})cs(g|] }|�d��ko"|�d��k�qS)Z
log_formatZacceptError)�get)rL�msg)�expectedErrorCode�expectedFormatr'r(rN�s�z9SelectReactorTests._acceptFailureTest.<locals>.<listcomp>z+Log event for failed accept not found in %rN)
�objectrr9�patch�doRead�errnoZ	errorcoderI�
assertGreaterr )r&rUrWrQr9ZmatchingMessagesr')rZr[rUr(�_acceptFailureTest�s
���z%SelectReactorTests._acceptFailureTestcCs
|�t�S)a*
        C{accept(2)} can fail with C{EMFILE} when there are too many open file
        descriptors in the process.  Test that this doesn't negatively impact
        any other existing connections.

        C{EMFILE} mainly occurs on Linux when the open file rlimit is
        encountered.
        )rar
rJr'r'r(�test_tooManyFilesFromAccept�s	z.SelectReactorTests.test_tooManyFilesFromAcceptcCs
|�t�S)z�
        Similar to L{test_tooManyFilesFromAccept}, but test the case where
        C{accept(2)} fails with C{ENOBUFS}.

        This mainly occurs on Windows and FreeBSD, but may be possible on
        Linux and other platforms as well.
        )rarrJr'r'r(�test_noBufferSpaceFromAccept�sz/SelectReactorTests.test_noBufferSpaceFromAcceptcCs
|�t�S)z�
        Similar to L{test_tooManyFilesFromAccept}, but test the case where
        C{accept(2)} fails with C{ECONNABORTED}.

        It is not clear whether this is actually possible for TCP
        connections on modern versions of Linux.
        )rarrJr'r'r(� test_connectionAbortedFromAccept�sz3SelectReactorTests.test_connectionAbortedFromAcceptcCs
|�t�S)z�
        Similar to L{test_tooManyFilesFromAccept}, but test the case where
        C{accept(2)} fails with C{ENFILE}.

        This can occur on Linux when the system has exhausted (!) its supply
        of inodes.
        )rarrJr'r'r(�test_noFilesFromAccept�sz)SelectReactorTests.test_noFilesFromAcceptr?z(Windows accept(2) cannot generate ENFILEcCs
|�t�S)a�
        Similar to L{test_tooManyFilesFromAccept}, but test the case where
        C{accept(2)} fails with C{ENOMEM}.

        On Linux at least, this can sensibly occur, even in a Python program
        (which eats memory like no ones business), when memory has become
        fragmented or low memory has been filled (d_alloc calls
        kmem_cache_alloc calls kmalloc - kmalloc only allocates out of low
        memory).
        )rar
rJr'r'r(�test_noMemoryFromAccept�sz*SelectReactorTests.test_noMemoryFromAcceptz(Windows accept(2) cannot generate ENOMEMcs�t�}t|_|jd|dd��|��j�g��fdd�}|�|��fdd�}��|��d�_���|�	�jd���|�����|�
�jd����|�
�jd�d	S)
z�
        L{tcp.Port.doRead} increases the number of consecutive
        C{accept} calls it performs if all of the previous C{accept}
        calls succeed; otherwise, it reduces the number to the amount
        of successful calls.
        rr1rOcs�D]}|��qdSrG)r+�r:)�clientsr'r(�closeAllsz7SelectReactorTests.test_acceptScaling.<locals>.closeAllcs(t�tjtj�}|�d���jf�|S)Nr1)r.ZAF_INETZSOCK_STREAM�connectZgetHostr9rg)r9r'r(rj
sz6SelectReactorTests.test_acceptScaling.<locals>.connectrN)rrZprotocolr9Z
addCleanuprKr/�
numberAcceptsr^r`�assertEqual)r&rQrirjr')rhr9r(�test_acceptScaling�s"
z%SelectReactorTests.test_acceptScalingcs�d�dg�G���fdd�dt�}t��D]}��tj|�j�q*���j|�j�dg�t�}�jd|dd�}d|_	��
|d|��|����|j	d�d	S)
z�
        C{accept(2)} returning C{EPERM} is treated as a transient
        failure and the call retried no more than the maximum number
        of consecutive C{accept(2)} calls.
        �{rcs eZdZdZ���fdd�ZdS)zLSelectReactorTests.test_permissionFailure.<locals>.FakeSocketWithAcceptLimit��
            Pretend to be a socket in an overloaded system whose
            C{accept} method can only be called
            C{maximumNumberOfAccepts} times.
            cs<�dd7<�d�kr&��d�t�tt�t���dS)Nrrz(Maximum number of accept calls exceeded.)r6r.r4r	rRrS�Zoself�ZacceptCallsZmaximumNumberOfAcceptsr&r'r(r82s
zSSelectReactorTests.test_permissionFailure.<locals>.FakeSocketWithAcceptLimit.acceptNrVr'rqr'r(�FakeSocketWithAcceptLimit,srrr1rOr.rN)
r\r3r7r.r4r8ZfailureExceptionrr9rkr]r^ZassertEquals)r&rr�_rQr9r'rqr(�test_permissionFailure#s"��z)SelectReactorTests.test_permissionFailurez'Windows accept(2) cannot generate EPERMcs�tt�}|�tttg�tdd�|D��d�G�fdd�dt�}t�}|j	d|dd�}|�
|d	|��|��|�t
j�}|�dt|��|�|djjd��d
S)z}
        A C{socket.error} raised by C{accept(2)} whose C{errno} is
        unknown to the recovery logic is logged.
        css"|]}t|ttjf�r|VqdSrG)�
isinstance�intrZlong)rLr4r'r'r(�	<genexpr>\s�zBSelectReactorTests.test_unknownSocketErrorRaise.<locals>.<genexpr>rcseZdZdZ�fdd�ZdS)zYSelectReactorTests.test_unknownSocketErrorRaise.<locals>.FakeSocketWithUnknownAcceptErrorrocst��d��dS)Nzunknown socket error message)r.r4rp�ZunknownAcceptErrorr'r(r8gs�z`SelectReactorTests.test_unknownSocketErrorRaise.<locals>.FakeSocketWithUnknownAcceptError.acceptNrVr'rxr'r(� FakeSocketWithUnknownAcceptErrorasryrr1rOr.N)�listr�extendrr	r�maxr\rr9r]r^ZflushLoggedErrorsr.r4rlr �valuer5)r&ZknownErrorsryrQr9Zfailuresr'rxr(�test_unknownSocketErrorRaiseTs��
z/SelectReactorTests.test_unknownSocketErrorRaiseN)r@rArBrCr)r-r9rarbrcrdrerrDrErfrmrtr~r'r'r'r(rFws*%	�*,�rFz?This test only applies to reactors that implement IReactorFDset)+rCZ
__future__rrr_r.rRr�ImportErrorZtwisted.trial.unittestrZtwisted.pythonrrZtwisted.internet.tcprrr	r
rrr
rrrrZtwisted.internet.protocolrrZtwisted.python.runtimerZtwisted.internet.deferrrZtwisted.internetrrrrFZ
IReactorFDSetZ
providedByZskipMsgrEr'r'r'r(�<module>s*
4Y