o
    g                    @   s  d dl Z d dlmZ d dlmZ d dlmZ d dlmZ d dlZd dlZd dl	Z	d dl
Z
d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlmZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl Z zd dl!Z!W n e"y   dZ!Y nw zd dl#Z#W n e"y   dZ#Y nw ej$Z$d%d	Z&d
Z'e( dkZ)zd dl*Z*W n e"y   dZ*Y nw dd Z+dd Z,dd Z-dd Z.dd Z/dd Z0dd Z1dd Z2dd Z3ej4dd Z5e, Z6e- Z7e. Z8e/ Z9e0 Z:e1 Z;e2 Z<e=e
d Z>e3 Z?ed!j@ZAG d"d# d#e jBZCG d$d% d%e jBZDG d&d' d'eDZEG d(d) d)e jBZFG d*d+ d+e jBZGG d,d- d-e jBZHG d.d/ d/ZIG d0d1 d1eCeIZJG d2d3 d3eDeIZKe Le>d4G d5d6 d6eEeIZMG d7d8 d8eGeIZNG d9d: d:eHeIZOe Pe#du d;e Le<d<e Le+ d=kd>G d?d@ d@e jBeIZQG dAdB dBeJZRG dCdD dDe jBeIZSG dEdF dFe jBZTG dGdH dHeTZUG dIdJ dJeFeTeIZVG dKdL dLeUeVZWG dMdN dNeTZXG dOdP dPeXZYG dQdR dReTZZG dSdT dTeZZ[G dUdV dVeZZ\G dWdX dXeZZ]G dYdZ dZeZZ^G d[d\ d\eZZ_G d]d^ d^e_Z`G d_d` d`e_Zadadb Zbdcdd Zcdedf ZdG dgdh dhe jBZee Le6diG djdk dke jBZfe Le6diG dldm dmeNZge Le7dnG dodp dpe jBZhe Le8dqG drds dse jBZie Le9dtG dudv dve jBZje Le9dtG dwdx dxeOZke Le;dyG dzd{ d{e jBZle Pe#du d;e Le<d<G d|d} d}e jBZme Le?d~G dd de jBZnG dd deRZoG dd deKZpe Le>d4G dd deMZqG dd deFZrG dd derZsG dd derZtG dd derZuG dd derZvG dd derZwG dd derZxG dd dexZyG dd deyZzG dd deyZ{G dd derZ|G dd de|Z}G dd de|Z~G dd dese|ZG dd de jBZG dd dexZG dd dexZG dd deteveVe\Zece
j
dG dd de{eZece
j
dG dd de~eZece
j
dG dd deeZG dd deteveVe`Zece
j
de LejdedddG dd de{eZece
j
de LejdedddG dd de~eZece
j
de LejdedddG dd deeZece
j
de Lejdece
dedddG dd deeZece
j
de Lejdece
dedddG ddÄ deseeZe Le>d4G ddń deteveVe]Ze Le>d4ece
j
dG ddǄ de{eZe Le>d4ece
j
dG ddɄ de~eZe Le>d4ece
j
dG dd˄ deeZe Le>d4G dd̈́ deteveVeaZece
j
de Lejde Le>d4edddG ddτ de{eZece
j
de Lejde Le>d4edddG ddф de~eZece
j
de Lejde Le>d4edddG ddӄ deeZece
j
de Lejde Le>d4ece
dedddG ddՄ deeZece
j
de Lejde Le>d4ece
dedddG ddׄ deseeZG ddل deweWe[Zece
j
dG ddۄ dezeZece
j
dG dd݄ de~e}eZece
j
dG dd߄ dee}eZG dd deueweWe^Zece
j
de Pe)deddddG dd dezeZece
j
de Pe)deddddG dd de~e}eZece
j
de Pe)deddddG dd dee}eZG dd deweWeYZece
j
dece
dG dd dezeZece
j
dece
dG dd de~e}eZece
j
dece
dG dd dee}eZece
j
ddece
dddG dd deeZece
j
ddece
dddG dd deseeZG dd de jBZecede Le=edpe=edd G dd dee\Zecede Le=edpe=edd G dd deeFeUe[ZG dd deJZG dd deSZG d	d
 d
eJZG dd deRZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deeoZG dd de jBZG dd  d eCeIZG d!d" d"eCeIZG d#d$ d$eCZG d%d& d&eDZe Le>d4G d'd( d(eEZG d)d* d*e jBZe Lejd+kd,G d-d. d.e jBZe Le=e
dd/G d0d1 d1e jBZG d2d3 d3eRZd4Zd5Zd6Zd7d8 Ze LeÃ d9G d:d; d;e jBZe LeÃ d9G d<d= d=e jBeIZG d>d? d?eJZG d@dA dAe jBZe Le=e
dBdCG dDdE dEe jBZe LejɐdFkdGe Le!dHG dIdJ dJeCZG dKdL dLeJZe Le=edMdNG dOdP dPe˃Ze Le:dQG dRdS dSe jBZe LejdTkdUG dVdW dWe jBZe LejϐdXdYG dZd[ d[e jBZG d\d] d]e jBZG d^d_ d_e jBZece
d`ece
daece
dG dbdc dce jBZӐddde ZeՐdfkreԃ  dS dS (g      N)support)	os_helper)socket_helper)threading_helper)proxyFu   Michael Gilfix was hereሴ
utf-8  AIXc                  C   s~   t d u rd S ttdsd S ztdd} t | tjd}W d    n1 s&w   Y  W n
 ty6   Y d S w td|d S )NIOCTL_VM_SOCKETS_GET_LOCAL_CIDz
/dev/vsockrbz    Ir   )	fcntlhasattrsocketopenioctlr
   OSErrorstructunpack)fr r   F/Users/admin/.pyenv/versions/3.10.0/lib/python3.10/test/test_socket.pyget_cid4   s   
r   c               	   C   >   zt  t jt jt j} W n ttfy   Y dS w |   dS )z5Check whether CAN sockets are supported on this host.FTN)r   PF_CANSOCK_RAWCAN_RAWAttributeErrorr   closesr   r   r   _have_socket_canA      r"   c               	   C   r   )z;Check whether CAN ISOTP sockets are supported on this host.FTN)r   r   
SOCK_DGRAM	CAN_ISOTPr   r   r   r    r   r   r   _have_socket_can_isotpK   r#   r&   c               	   C   r   )z;Check whether CAN J1939 sockets are supported on this host.FTN)r   r   r$   	CAN_J1939r   r   r   r    r   r   r   _have_socket_can_j1939U   r#   r(   c               	   C   <   zt  t jt jd} W n ttfy   Y dS w |   dS )z5Check whether RDS sockets are supported on this host.r   FTN)r   PF_RDSSOCK_SEQPACKETr   r   r   r    r   r   r   _have_socket_rds_      r,   c               	   C   r)   )z8Check whether AF_ALG sockets are supported on this host.r   FTN)r   AF_ALGr+   r   r   r   r    r   r   r   _have_socket_algi   r-   r/   c               	   C   r)   )z<Check whether AF_QIPCRTR sockets are supported on this host.r   FTN)r   
AF_QIPCRTRr$   r   r   r   r    r   r   r   _have_socket_qipcrtrs   r-   r1   c                  C   s   t  du} | S )z:Check whether AF_VSOCK sockets are supported on this host.N)r   )retr   r   r   _have_socket_vsock}   s   
r3   c               	   C   r   )z>Check whether AF_BLUETOOTH sockets are supported on this host.FTN)r   AF_BLUETOOTHSOCK_STREAMBTPROTO_RFCOMMr   r   r   r    r   r   r   _have_socket_bluetooth   s   r7   c              	   c   s8    t  }zt |  d V  W t | d S t | w N)r   getdefaulttimeoutsetdefaulttimeout)timeoutZold_timeoutr   r   r   socket_setdefaulttimeout   s   
r<   IPPROTO_UDPLITEic                   @      e Zd Zdd Zdd ZdS )SocketTCPTestc                 C   s.   t  t jt j| _t| j| _| j  d S r8   )r   AF_INETr5   servr   	bind_portportlistenselfr   r   r   setUp   s   zSocketTCPTest.setUpc                 C      | j   d | _ d S r8   rB   r   rF   r   r   r   tearDown      

zSocketTCPTest.tearDownN__name__
__module____qualname__rH   rK   r   r   r   r   r@      s    r@   c                   @   r?   )SocketUDPTestc                 C   s$   t  t jt j| _t| j| _d S r8   )r   rA   r$   rB   r   rC   rD   rF   r   r   r   rH         zSocketUDPTest.setUpc                 C   rI   r8   rJ   rF   r   r   r   rK      rL   zSocketUDPTest.tearDownNrM   r   r   r   r   rQ      s    rQ   c                   @      e Zd Zdd ZdS )SocketUDPLITETestc                 C   s(   t  t jt jt j| _t| j| _d S r8   )r   rA   r$   r=   rB   r   rC   rD   rF   r   r   r   rH      s   zSocketUDPLITETest.setUpN)rN   rO   rP   rH   r   r   r   r   rT          rT   c                       s8   e Zd ZdZ fddZ fddZ fddZ  ZS )ThreadSafeCleanupTestCasezSubclass of unittest.TestCase with thread-safe cleanup methods.

    This subclass protects the addCleanup() and doCleanups() methods
    with a recursive lock.
    c                    s    t  j|i | t | _d S r8   )super__init__	threadingRLock_cleanup_lockrG   argskwargs	__class__r   r   rX         z"ThreadSafeCleanupTestCase.__init__c                    <   | j  t j|i |W  d    S 1 sw   Y  d S r8   )r[   rW   
addCleanupr\   r_   r   r   rc         $z$ThreadSafeCleanupTestCase.addCleanupc                    rb   r8   )r[   rW   
doCleanupsr\   r_   r   r   re      rd   z$ThreadSafeCleanupTestCase.doCleanups)rN   rO   rP   __doc__rX   rc   re   __classcell__r   r   r_   r   rV      s
    rV   c                   @   sL   e Zd ZdZdZdZ	 dZeeZ		 dZ
e
dee
d  7 Z
dd	 Zd
S )SocketCANTestzTo be able to run this test, a `vcan0` CAN interface can be created with
    the following commands:
    # modprobe vcan
    # ip link add dev vcan0 type vcan
    # ip link set up vcan0
    vcan0   z=IB3x8sz@3I4l2Ix   c                 C   s`   t  t jt jt j| _| | jj z| j| jf W d S  t	y/   | 
d| j  Y d S w N%network interface `%s` does not exist)r   r   r   r   r!   rc   r   bind	interfacer   skipTestrF   r   r   r   rH     s   zSocketCANTest.setUpN)rN   rO   rP   rf   rp   bufsizecan_frame_fmtr   calcsizeZcan_frame_sizebcm_cmd_msg_fmtrH   r   r   r   r   rh      s    
rh   c                   @   s   e Zd ZdZdZdd ZdS )SocketRDSTestz\To be able to run this test, the `rds` kernel module must be loaded:
    # modprobe rds
        c                 C   sV   t  t jt jd| _| | jj z
t| j| _W d S  t	y*   | 
d Y d S w )Nr   zunable to bind RDS socket)r   r*   r+   rB   rc   r   r   rC   rD   r   rq   rF   r   r   r   rH     s   zSocketRDSTest.setUpN)rN   rO   rP   rf   rr   rH   r   r   r   r   rv     s    rv   c                   @   sH   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dS )ThreadableTesta  Threadable Test class

    The ThreadableTest class makes it easy to create a threaded
    client/server pair from an existing unit test. To create a
    new threaded class from an existing unit test, use multiple
    inheritance:

        class NewClass (OldClass, ThreadableTest):
            pass

    This class defines two new fixture functions with obvious
    purposes for overriding:

        clientSetUp ()
        clientTearDown ()

    Any new test functions within the class must then define
    tests in pairs, where the test name is preceded with a
    '_' to indicate the client portion of the test. Ex:

        def testFoo(self):
            # Server portion

        def _testFoo(self):
            # Client portion

    Any exceptions raised by the clients during their tests
    are caught and transferred to the main thread to alert
    the testing framework.

    Note, the server setup function cannot call any blocking
    functions that rely on the client thread during setup,
    unless serverExplicitReady() is called just before
    the blocking call (such as in setting up a client/server
    connection and performing the accept() in setUp().
    c                 C   s$   | j | _| j| _| j| _ | j| _d S r8   )rH   _ThreadableTest__setUprK   _ThreadableTest__tearDown_setUp	_tearDownrF   r   r   r   rX   F  s   zThreadableTest.__init__c                 C   s   | j   dS )zThis method allows the server to explicitly indicate that
        it wants the client thread to proceed. This is useful if the
        server is about to execute a blocking routine that is
        dependent upon the client thread during its setup routine.N)server_readysetrF   r   r   r   serverExplicitReadyM  s   z"ThreadableTest.serverExplicitReadyc                 C   s   t  | _| j  t | _t | _t | _t	
d| _	d| _|  }|d}||d d  }t| d| }t| j|f| _zz|   W n   d| _ W | j  n| j  w | j  d S )N   F._T)r   Zwait_threads_exitwait_threads	__enter__rY   Eventr}   client_readydonequeueQueueserver_crashedidrfindgetattrthreadstart_new_thread	clientRunZclient_threadry   r~   wait)rG   Z
methodnamer>   Ztest_methodr   r   r   r{   T  s,   





zThreadableTest._setUpc                 C   s>   |    | j  | jd d d  | j r| j }|d S r8   )rz   r   r   r   __exit__r   qsizegetrG   excr   r   r   r|   o  s   


zThreadableTest._tearDownc              
   C   s  | j   z1z|   W n# ty/ } z| j| |   W Y d }~W | j  d S d }~ww W | j  n| j  w | j	rF|   d S t
|dsOtdz,z|  W n tym } z| j| W Y d }~nd }~ww W |   d S W |   d S |   w )N__call__z%test_func must be a callable function)r}   r   clientSetUpBaseExceptionr   putclientTearDownr   r~   r   r   	TypeError)rG   Z	test_funcer   r   r   r   x  s6   


zThreadableTest.clientRunc                 C      t d)Nz clientSetUp must be implemented.)NotImplementedErrorrF   r   r   r   r        zThreadableTest.clientSetUpc                 C   s   | j   t  d S r8   )r   r~   r   exitrF   r   r   r   r        
zThreadableTest.clientTearDownN)rN   rO   rP   rf   rX   r   r{   r|   r   r   r   r   r   r   r   rx      s    %	rx   c                   @   &   e Zd Zd	ddZdd Zdd ZdS )
ThreadedTCPSocketTestrunTestc                 C      t j| |d t|  d S N)
methodNamer@   rX   rx   rG   r   r   r   r   rX        zThreadedTCPSocketTest.__init__c                 C      t  t jt j| _d S r8   )r   rA   r5   clirF   r   r   r   r        z!ThreadedTCPSocketTest.clientSetUpc                 C      | j   d | _ t|  d S r8   r   r   rx   r   rF   r   r   r   r        
z$ThreadedTCPSocketTest.clientTearDownNr   rN   rO   rP   rX   r   r   r   r   r   r   r         
r   c                   @   r   )
ThreadedUDPSocketTestr   c                 C   r   r   )rQ   rX   rx   r   r   r   r   rX     r   zThreadedUDPSocketTest.__init__c                 C   r   r8   )r   rA   r$   r   rF   r   r   r   r     r   z!ThreadedUDPSocketTest.clientSetUpc                 C   r   r8   r   rF   r   r   r   r     r   z$ThreadedUDPSocketTest.clientTearDownNr   r   r   r   r   r   r     r   r   z'UDPLITE sockets required for this test.c                   @   r   )
ThreadedUDPLITESocketTestr   c                 C   r   r   )rT   rX   rx   r   r   r   r   rX     r   z"ThreadedUDPLITESocketTest.__init__c                 C   s   t  t jt jt j| _d S r8   )r   rA   r$   r=   r   rF   r   r   r   r        z%ThreadedUDPLITESocketTest.clientSetUpc                 C   r   r8   r   rF   r   r   r   r     r   z(ThreadedUDPLITESocketTest.clientTearDownNr   r   r   r   r   r   r     s    
r   c                   @   r   )
ThreadedCANSocketTestr   c                 C   r   r   )rh   rX   rx   r   r   r   r   rX     r   zThreadedCANSocketTest.__init__c                 C   sB   t  t jt jt j| _z| j| jf W d S  ty    Y d S w r8   )r   r   r   r   r   ro   rp   r   rF   r   r   r   r     s   z!ThreadedCANSocketTest.clientSetUpc                 C   r   r8   r   rF   r   r   r   r     r   z$ThreadedCANSocketTest.clientTearDownNr   r   r   r   r   r   r     s    
	r   c                   @   r   )
ThreadedRDSSocketTestr   c                 C   r   r   )rv   rX   rx   r   r   r   r   rX     r   zThreadedRDSSocketTest.__init__c                 C   sL   t  t jt jd| _z| jtdf | j | _W d S  ty%   Y d S w Nr   )	r   r*   r+   r   ro   HOSTgetsocknamecli_addrr   rF   r   r   r   r     s   z!ThreadedRDSSocketTest.clientSetUpc                 C   r   r8   r   rF   r   r   r   r     r   z$ThreadedRDSSocketTest.clientTearDownNr   r   r   r   r   r   r     s    
r   
need fcntlz%VSOCK sockets required for this test.   z-This test can only be run on a virtual guest.c                   @   6   e Zd ZdddZdd Zdd Zdd	 Zd
d ZdS )ThreadedVSOCKSocketStreamTestr   c                 C      t jj| |d t|  d S r   unittestTestCaserX   rx   r   r   r   r   rX        z&ThreadedVSOCKSocketStreamTest.__init__c                 C   sh   t  t jt j| _| | jj | jt jtf | j	  | 
  | j \| _| _| | jj d S r8   )r   AF_VSOCKr5   rB   rc   r   ro   VMADDR_CID_ANY	VSOCKPORTrE   r   acceptconnconnaddrrF   r   r   r   rH     s   
z#ThreadedVSOCKSocketStreamTest.setUpc                 C   sD   t d ttjtj| _| | jj t }| j	|t
f d S )N皙?)timesleepr   r   r5   r   rc   r   r   connectr   )rG   Zcidr   r   r   r     s
   
z)ThreadedVSOCKSocketStreamTest.clientSetUpc                 C      | j d}| |t d S N   )r   recvassertEqualMSGrG   msgr   r   r   
testStream     z(ThreadedVSOCKSocketStreamTest.testStreamc                 C      | j t | j   d S r8   r   sendr   r   rF   r   r   r   _testStream
     z)ThreadedVSOCKSocketStreamTest._testStreamNr   rN   rO   rP   rX   rH   r   r   r   r   r   r   r   r     s    
	r   c                   @   s:   e Zd ZdZdddZdd Zdd Zd	d
 Zdd ZdS )SocketConnectedTestzSocket tests for client-server connection.

    self.cli_conn is a client socket connected to the server.  The
    setUp() method guarantees that it is connected to the server.
    r   c                 C      t j| |d d S r   )r   rX   r   r   r   r   rX        zSocketConnectedTest.__init__c                 C   s*   t |  |   | j \}}|| _d S r8   )r   rH   r   rB   r   cli_connrG   r   addrr   r   r   rH        

zSocketConnectedTest.setUpc                 C   r   r8   )r   r   r   rK   rF   r   r   r   rK      r   zSocketConnectedTest.tearDownc                 C   s(   t |  | jt| jf | j| _d S r8   )r   r   r   r   r   rD   	serv_connrF   r   r   r   r   %  s   
zSocketConnectedTest.clientSetUpc                 C   r   r8   )r   r   r   r   rF   r   r   r   r   *  r   z"SocketConnectedTest.clientTearDownNr   )	rN   rO   rP   rf   rX   rH   rK   r   r   r   r   r   r   r     s    
r   c                   @   r   )SocketPairTestr   c                 C   r   r   r   r   r   r   r   rX   1  r   zSocketPairTest.__init__c                 C   s   t  \| _| _d S r8   )r   
socketpairrB   r   rF   r   r   r   rH   5     zSocketPairTest.setUpc                 C   rI   r8   rJ   rF   r   r   r   rK   8  rL   zSocketPairTest.tearDownc                 C      d S r8   r   rF   r   r   r   r   <     zSocketPairTest.clientSetUpc                 C   r   r8   r   rF   r   r   r   r   ?  r   zSocketPairTest.clientTearDownNr   )rN   rO   rP   rX   rH   rK   r   r   r   r   r   r   r   /  s    
r   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	SocketTestBasezA base class for socket tests.

    Subclasses must provide methods newSocket() to return a new socket
    and bindSock(sock) to bind it to an unused address.

    Creates a socket self.serv and sets self.serv_addr to its address.
    c                 C      |   | _|   d S r8   )	newSocketrB   
bindServerrF   r   r   r   rH   T  r   zSocketTestBase.setUpc                 C      |  | j | j | _dS )z9Bind server socket and set self.serv_addr to its address.N)bindSockrB   r   	serv_addrrF   r   r   r   r   X     zSocketTestBase.bindServerc                 C   rI   r8   rJ   rF   r   r   r   rK   ]  rL   zSocketTestBase.tearDownN)rN   rO   rP   rf   rH   r   rK   r   r   r   r   r   K  s
    r   c                       s    e Zd ZdZ fddZ  ZS )SocketListeningTestMixinz%Mixin to listen on the server socket.c                    s   t    | j  d S r8   )rW   rH   rB   rE   rF   r_   r   r   rH   e     
zSocketListeningTestMixin.setUp)rN   rO   rP   rf   rH   rg   r   r   r_   r   r   b  s    r   c                       s@   e Zd ZdZ fddZdd Zdd Zdd	 Zd
d Z  Z	S )ThreadedSocketTestMixinzMixin to add client socket and allow client/server tests.

    Client socket is self.cli and its address is self.cli_addr.  See
    ThreadableTest for usage information.
    c                    s    t  j|i | t|  d S r8   )rW   rX   rx   r\   r_   r   r   rX   r  ra   z ThreadedSocketTestMixin.__init__c                 C   r   r8   )newClientSocketr   
bindClientrF   r   r   r   r   v  r   z#ThreadedSocketTestMixin.clientSetUpc                 C   s   |   S )z&Return a new socket for use as client.N)r   rF   r   r   r   r   z  s   z'ThreadedSocketTestMixin.newClientSocketc                 C   r   )z8Bind client socket and set self.cli_addr to its address.N)r   r   r   r   rF   r   r   r   r   ~  r   z"ThreadedSocketTestMixin.bindClientc                 C   r   r8   r   rF   r   r   r   r     r   z&ThreadedSocketTestMixin.clientTearDown)
rN   rO   rP   rf   rX   r   r   r   r   rg   r   r   r_   r   r   j  s    r   c                       sD   e Zd ZdZ fddZ fddZ fddZ fdd	Z  ZS )
ConnectedStreamTestMixinzMixin to allow client/server stream tests with connected client.

    Server's socket representing connection to client is self.cli_conn
    and client's connection to server is self.serv_conn.  (Based on
    SocketConnectedTest.)
    c                    s*   t    |   | j \}}|| _d S r8   )rW   rH   r   rB   r   r   r   r_   r   r   rH     r   zConnectedStreamTestMixin.setUpc                    s   | j   d | _ t   d S r8   )r   r   rW   rK   rF   r_   r   r   rK     r   z!ConnectedStreamTestMixin.tearDownc                    s$   t    | j| j | j| _d S r8   )rW   r   r   r   r   r   rF   r_   r   r   r     s   
z$ConnectedStreamTestMixin.clientSetUpc                    s6   z
| j   d | _ W n	 ty   Y nw t   d S r8   )r   r   r   rW   r   rF   r_   r   r   r     s   

z'ConnectedStreamTestMixin.clientTearDown)	rN   rO   rP   rf   rH   rK   r   r   rg   r   r   r_   r   r     s    r   c                       s(   e Zd ZdZ fddZdd Z  ZS )UnixSocketTestBasez(Base class for Unix-domain socket tests.c                    s(   t  | _| tj| j t   d S r8   )tempfilemkdtempdir_pathrc   osrmdirrW   rH   rF   r_   r   r   rH     s   
zUnixSocketTestBase.setUpc                 C   s,   t j| jd}t|| | tj| d S )N)dir)r   mktempr   r   bind_unix_socketrc   r   unlink)rG   sockpathr   r   r   r     s   zUnixSocketTestBase.bindSock)rN   rO   rP   rf   rH   r   rg   r   r   r_   r   r     s    r   c                   @      e Zd ZdZdd ZdS )UnixStreamBasez-Base class for Unix-domain SOCK_STREAM tests.c                 C      t  t jt jS r8   )r   AF_UNIXr5   rF   r   r   r   r        zUnixStreamBase.newSocketNrN   rO   rP   rf   r   r   r   r   r   r	        r	  c                       s,   e Zd ZdZeZ fddZdd Z  ZS )InetTestBasez!Base class for IPv4 socket tests.c                    s   t    | jd | _d S Nr   )rW   rH   r   rD   rF   r_   r   r   rH     s   
zInetTestBase.setUpc                 C   s   t j|| jd d S )Nhost)r   rC   r  rG   r  r   r   r   r     r   zInetTestBase.bindSock)	rN   rO   rP   rf   r   r  rH   r   rg   r   r   r_   r   r    s
    r  c                   @   r  )TCPTestBasez#Base class for TCP-over-IPv4 tests.c                 C   r
  r8   )r   rA   r5   rF   r   r   r   r     r  zTCPTestBase.newSocketNr  r   r   r   r   r    r  r  c                   @   r  )UDPTestBasez#Base class for UDP-over-IPv4 tests.c                 C   r
  r8   )r   rA   r$   rF   r   r   r   r     r  zUDPTestBase.newSocketNr  r   r   r   r   r    r  r  c                   @   r  )UDPLITETestBasez'Base class for UDPLITE-over-IPv4 tests.c                 C      t  t jt jt jS r8   )r   rA   r$   r=   rF   r   r   r   r     r   zUDPLITETestBase.newSocketNr  r   r   r   r   r    r  r  c                   @   r  )SCTPStreamBasez;Base class for SCTP tests in one-to-one (SOCK_STREAM) mode.c                 C   r  r8   )r   rA   r5   IPPROTO_SCTPrF   r   r   r   r     s   zSCTPStreamBase.newSocketNr  r   r   r   r   r    r  r  c                   @   s   e Zd ZdZejZdS )Inet6TestBasez!Base class for IPv6 socket tests.N)rN   rO   rP   rf   r   HOSTv6r  r   r   r   r   r    s    
r  c                   @   r  )UDP6TestBasez#Base class for UDP-over-IPv6 tests.c                 C   r
  r8   )r   AF_INET6r$   rF   r   r   r   r     r  zUDP6TestBase.newSocketNr  r   r   r   r   r    r  r  c                   @   r  )UDPLITE6TestBasez'Base class for UDPLITE-over-IPv6 tests.c                 C   r  r8   )r   r  r$   r=   rF   r   r   r   r     r   zUDPLITE6TestBase.newSocketNr  r   r   r   r   r    r  r  c                    s*   dd   fdd}dd }| r|S |S )a  Skip decorated test if condition is true, add client_skip decorator.

    If the decorated object is not a class, sets its attribute
    "client_skip" to a decorator which will return an empty function
    if the test is to be skipped, or the original function if it is
    not.  This can be used to avoid running the client part of a
    skipped test when using ThreadableTest.
    c                  _   r   r8   r   r]   r^   r   r   r   client_pass	  r   z%skipWithClientIf.<locals>.client_passc                    s*   t | }t| ts fdd|_|S )Nc                    s    S r8   r   r   )r   r   r   <lambda>      z3skipWithClientIf.<locals>.skipdec.<locals>.<lambda>)r   skip
isinstancetypeclient_skip)objZretvalr   reasonr   r   skipdec  s   
z!skipWithClientIf.<locals>.skipdecc                 S   s"   t | tst| dsdd | _| S )Nr'  c                 S   s   | S r8   r   r!  r   r   r   r"    r#  z5skipWithClientIf.<locals>.noskipdec.<locals>.<lambda>)r%  r&  r   r'  r(  r   r   r   	noskipdec  s   
z#skipWithClientIf.<locals>.noskipdecNr   )Z	conditionr*  r+  r-  r   r)  r   skipWithClientIf   s   	r.  c                    s0    fdd|D }t |dddd |D  S )zSkip decorated test if obj is missing any of the given attributes.

    Sets client_skip attribute as skipWithClientIf() does.
    c                    s   g | ]	}t  |s|qS r   )r   .0namer,  r   r   
<listcomp>      z requireAttrs.<locals>.<listcomp>don't have , c                 s       | ]}|V  qd S r8   r   r/  r   r   r   	<genexpr>      zrequireAttrs.<locals>.<genexpr>N)r.  join)r(  Z
attributesmissingr   r,  r   requireAttrs  s   r;  c               
   G   s   d}dd | D }|rdd dd |D  }n)dd | D }ztj| }W n ty< } z
t|}W Y d}~n	d}~ww |  t|dud	d d
d | D |S )a  Skip decorated test if a socket cannot be created with given arguments.

    When an argument is given as a string, will use the value of that
    attribute of the socket module, or skip the test if it doesn't
    exist.  Sets client_skip attribute as skipWithClientIf() does.
    Nc                 S   s$   g | ]}t |trtt|s|qS r   )r%  strr   r   r0  r(  r   r   r   r2  )  s
    
z!requireSocket.<locals>.<listcomp>r4  r5  c                 s   r6  r8   r   r/  r   r   r   r7  ,  r8  z requireSocket.<locals>.<genexpr>c                 S   s$   g | ]}t |trtt|n|qS r   )r%  r<  r   r   r=  r   r   r   r2  .  s    zcan't create socket({0}): {1}c                 s   s    | ]}t |V  qd S r8   )r<  r0  or   r   r   r7  :  s    )r9  r   r   r<  r   r.  format)r]   errr:  Zcallargsr!   r   r   r   r   requireSocket!  s(   rB  c                   @   s  e Zd Zdd Zdd Zeeduddd Zd	d
 Z	dd Z
dd Zdd Zdd Zeejdkddd Zeejdkdeejddd Zdd Zdd Zd d! Zeeed"d#eeed$d%d&d' Zeeed(d)d*d+ Zeeed,d-d.d/ Zeeed0d1d2d3 Zeeed4d5d6d7 Zd8d9 Z d:d; Z!e"j#d<d= Z$d>d? Z%d@dA Z&eeedBdCdDdE Z'eeedFdGdHdI Z(eeedFdGdJdK Z)eeedLdMdNdO Z*eeedLdMdPdQ Z+dRdS Z,dTdU Z-dVdW Z.dXdY Z/dZd[ Z0d\d] Z1d^d_ Z2eejdkdd`da Z3eejdkdeeedbdcddde Z4dfdg Z5dhdi Z6ee"7djdkdldm Z8dndo Z9dpdq Z:drds Z;dtdu Z<dvdw Z=dxdy Z>dzd{ Z?d|d} Z@d~d ZAdd ZBdd ZCe"j#dd ZDeejddd ZEeejddd ZFeejdeGejdkdeGeHdeeed(ddd ZIeejdeejdkddd ZJeejdeGejdkdeGeHdeeed(ddd ZKeejdeejdkddd ZLdd ZMdd ZNdd ZOeeedddd ZPdd ZQdd ZRdd ZSdd ZTdd ZUeGejdkddd ZVdd ZWdd ZXdS )GeneralModuleTestsc                 C   s<   dd l }| tj|ju  t }| |tj |  d S r   )_socket
assertTruer   
SocketTypeassertIsInstancer   )rG   rD  r!   r   r   r   test_SocketType_is_socketobjectB  s
   z2GeneralModuleTests.test_SocketType_is_socketobjectc                 C   s   t  t jt j}|S | d|  t| | dt j t| | dt j t| | dt| | dt| |d | dt| | t|	 t| W d    n1 s`w   Y  | dt| | dt| d S )	Nzfd=%iz	family=%sztype=%szproto=0raddr	127.0.0.1r   laddrz[closed])
r   rA   r5   assertInfilenoreprassertNotInro   r<  r   rG   r!   r   r   r   	test_reprI  s   
	zGeneralModuleTests.test_reprNzneed _socket modulec                 C   sz   t t jt j}zd| |j|j|jf }| t	|| W |
  n|
  w d|j|j|jf }| t	|| d S )Nz4<socket object, fd=%s, family=%s, type=%s, proto=%s>z4<socket object, fd=-1, family=%s, type=%s, proto=%s>)rD  r   rA   r5   rN  familyr&  protor   rO  r   )rG   r!   expectedr   r   r   test_csocket_reprW  s   z$GeneralModuleTests.test_csocket_reprc                 C   s   t  t jt j}t|}| | |  W d    n1 s!w   Y  d }z|  W n
 ty8   Y d S w | d d S )NzSocket proxy still exists)r   rA   r5   r   r   rN  ReferenceErrorfail)rG   r!   pr   r   r   test_weakrefd  s   zGeneralModuleTests.test_weakrefc                 C   s   d}| j t|d d t1 sw   Y  | j t|d d tj1 s&w   Y  | j t|d d tj1 s;w   Y  d S )Nz$Error raising socket exception (%s).r   r   zsocket.herrorzsocket.gaierror)assertRaisesr   r   herrorgaierrorr   r   r   r   testSocketErrorp  s   z"GeneralModuleTests.testSocketErrorc                 C   s  t  t jt j}| |j |d | }| t}|	d| W d    n1 s-w   Y  | 
t|jd | t}|	d| W d    n1 sQw   Y  | 
t|jd | t}|	dd  W d    n1 suw   Y  | dt|j | t}|	dd| W d    n1 sw   Y  | 
t|jd | t}|	dd| W d    n1 sw   Y  | 
t|jd | t}|	ddd  W d    n1 sw   Y  | dt|j | t}|	dd	| W d    n	1 s
w   Y  | t}|	dd d  W d    n	1 s'w   Y  | t}|	d W d    n	1 sBw   Y  | d
t|j | t}|	dd|d W d    n	1 siw   Y  | dt|j d S )N) r   u   ☠z*a bytes-like object is required, not 'str'y              @z.a bytes-like object is required, not 'complex'   fooznot NoneTyper   barz	(1 given)   z	(4 given))r   rA   r$   rc   r   ro   r   r\  r   sendtor   r<  	exceptionrM  )rG   r!   Zsocknamecmr   r   r   testSendtoErrorsz  sd   
z#GeneralModuleTests.testSendtoErrorsc                 C   s@   t j t jr	t j t j t j t j t j t j t j	 t j
 d S r8   )r   rA   has_ipv6r  r5   r$   r   SOCK_RDMr+   
SOL_SOCKETSO_REUSEADDRrF   r   r   r   testCrucialConstants  s   
z'GeneralModuleTests.testCrucialConstantsc                 C   s    t j t j t jrt j d S d S r8   )r   IPPROTO_TCPIPPROTO_UDPrh  IPPROTO_IPV6rF   r   r   r   testCrucialIpProtoConstants  s
   
z.GeneralModuleTests.testCrucialIpProtoConstantsntWindows specificc                 C   4   t j t j t j t j t j t j t j t j d S r8   )	r   ZIPPROTO_ICLFXBMZ
IPPROTO_STZIPPROTO_CBTZIPPROTO_IGPZIPPROTO_RDPZIPPROTO_PGMZIPPROTO_L2TPr  rF   r   r   r   testWindowsSpecificConstants  s   
z/GeneralModuleTests.testWindowsSpecificConstantsdarwinmacOS specific testIPv6 required for this testc                 C   s0   h d}|D ]}|  tt|d| d qd S )N>   IPV6_RTHDR_TYPE_0
IPV6_RTHDRIPV6_HOPOPTSIPV6_RECVHOPLIMITIPV6_PATHMTUIPV6_HOPLIMITIPV6_PKTINFOIPV6_TCLASSIPV6_RECVPATHMTUIPV6_RECVPKTINFOIPV6_USE_MIN_MTUIPV6_RECVHOPOPTSIPV6_RTHDRDSTOPTSIPV6_DSTOPTSIPV6_RECVTCLASSIPV6_NEXTHOPIPV6_DONTFRAGIPV6_CHECKSUMIPV6_RECVDSTOPTSIPV6_RECVRTHDRzMissing RFC3542 socket option '')rE  r   r   )rG   optsoptr   r   r   test3542SocketOptions  s   z(GeneralModuleTests.test3542SocketOptionsc                 C   s   t  }zt |}W n ty   | d Y nw | |ddkd z
t |\}}}W n ty=   | d Y nw ||g| }t |}||vrZ| 	d|t
|f  d S d S )Nname lookup failurer   r   zError resolving host to ip.z=Error testing host resolution mechanisms. (fqdn: %s, all: %s))r   gethostnamegethostbynamer   rq   rE  findgethostbyaddrgetfqdnrX  rO  )rG   hostnameZipZhnamealiasesipaddrsZall_host_namesZfqhnr   r   r   testHostnameRes  s"   
z"GeneralModuleTests.testHostnameResc                 C   sL   t jddfD ]}| t|| qt jfD ]}| |t|d  qd S )Nz10.0.0.1255.255.255.255r   )r   ZHOSTv4r   r   r  rM  r  )rG   r   r  r   r   r   test_host_resolution  s
   z'GeneralModuleTests.test_host_resolutionc              	   C   s   d}dD ]:}| j t|d t| W d    n1 sw   Y  | j t|d t| W d    q1 s9w   Y  qd S )Nz[resolving an invalid IP address did not raise OSError; can be caused by a broken DNS server)z0.1.1.~1z1+.1.1.1z::1qz::1::2z1:1:1:1:1:1:1:1:1r[  )r\  r   r   r  r  )rG   Zexplanationr   r   r   r    test_host_resolution_bad_address  s   z3GeneralModuleTests.test_host_resolution_bad_addresssethostnameztest needs socket.sethostname()r  ztest needs socket.gethostname()c              
   C   s   t  }zt d W n ty* } z|jtjkr| d n W Y d }~nd }~ww z| t  d t d | t  d W t | d S t | w )Nnewztest should be run as roots   barrb  )r   r  r  r   errnoZEPERMrq   r   )rG   Zoldhnr   r   r   r   test_sethostname  s   
z#GeneralModuleTests.test_sethostnameif_nameindexz$socket.if_nameindex() not available.c                 C   s   t  }|D ]8\}}| |t | |t | |d t |}| |t | || t |}| |t | || qd S r   )	r   r  rG  intr<  assertGreaterif_nametoindexr   if_indextoname)rG   Z
interfacesindexr1  _index_namer   r   r   testInterfaceNameIndex   s   

z)GeneralModuleTests.testInterfaceNameIndexr  z&socket.if_indextoname() not available.c                 C   $   |  ttjd |  ttjd d S Nr   Z	_DEADBEEF)r\  r   r   r  r   rF   r   r   r   testInvalidInterfaceIndexToName0     z2GeneralModuleTests.testInvalidInterfaceIndexToNamer  z&socket.if_nametoindex() not available.c                 C   r  r  )r\  r   r   r  r   rF   r   r   r   testInvalidInterfaceNameToIndex6  r  z2GeneralModuleTests.testInvalidInterfaceNameToIndexgetrefcountztest needs sys.getrefcount()c                 C   sP   zt t}ttd W d S  ty'   t t|kr$| d Y d S Y d S w )Nr   z$socket.getnameinfo loses a reference)sysr  rN   r   getnameinfor   rX  )rG   origr   r   r   testRefCountGetNameInfo<  s   
z*GeneralModuleTests.testRefCountGetNameInfoc                 C   s(   z	t dd W d S  ty   Y d S w )N)rk   r   r   r   r   )r   r  r   rF   r   r   r   testInterpreterCrashH  s
   z'GeneralModuleTests.testInterpreterCrashc              	   C   s   t jdt jdt jdt jdi}| D ]2\}}d|> d }dD ]}| ||@ ||||@ |@  q||}| ||@ | | t|d qd S )N       r   )r   r     i  r   igE#i2Tvl        )	r   htonlntohlhtonsntohsitemsr   r\  OverflowError)rG   Zsizesfuncsizemaskr>   Zswappedr   r   r   testNtoHP  s   "zGeneralModuleTests.testNtoHc                 C   s   dd l }g d}|dg }ddddd> g}||jd |jd g d	|jg }|D ]}t| t| q(|D ]}t| t| q7|D ]}| t	tj| | t	tj| qF|D ]}| t	tj| | t	tj| q[d S )
Nr   )r   r   r   r      l        r        )
	_testcapiZINT_MININT_MAXr   r  r  r  r  r\  r  )rG   r  Zs_good_valuesZl_good_valuesZl_bad_valuesZs_bad_valueskr   r   r   testNtoHErrors^  s.   


z!GeneralModuleTests.testNtoHErrorsc              	   C   s  | j }tjdstjdv rd}nd}|D ]}z	t|d}W  q, ty)   Y qw tttdr7t dkrAt|}||| zt|d}W n tyT   d }Y nw ||| t	j
se|t|| |t|d| |d ur{|t|d| | ttjd	 | ttjd
 d S )N)freebsdZnetbsdZgnukfreebsd)linuxru  )daytimeZqotddomain)Zechor  r  Ztcpgetandroidapilevel   Zudpr  r  )r   r  platform
startswithr   getservbynamer   r   r  r   Z
is_androidgetservbyportr\  r  )rG   eqZservicesZservicerD   Zport2Zudpportr   r   r   testGetServByv  s@   




z GeneralModuleTests.testGetServByc              	   C   s.  |  t d  t }|  | d  W d    n1 sw   Y  tdU |  t d t }|  | d W d    n1 sHw   Y  td  |  t d  t }|  | d  W d    n1 sqw   Y  W d    n1 sw   Y  | ttjd | ttjd d S )N
   r  Zspam)	r   r   r9   
gettimeoutr<   r:   r\  
ValueErrorr   )rG   r!   r  r   r   r   testDefaultTimeout  s$   




z%GeneralModuleTests.testDefaultTimeout	inet_atonztest needs socket.inet_aton()c                 C   s(   |  dtd |  dtd d S )N       0.0.0.0   r  )r   r   r  rF   r   r   r   testIPv4_inet_aton_fourbytes  s   z/GeneralModuleTests.testIPv4_inet_aton_fourbytes	inet_ptonztest needs socket.inet_pton()c                    s*  ddl m}mm   fdd}fdd}d|d d|d	 d
|d d|d d|d tsF||d ||d ||d ||d ||d d|d d|d	 d
|d d|d ||d ||d ||d ||d ||d d S )Nr   )r  r  rA   c                    
    | S r8   r   a)rA   r  r   r   r"       
 z5GeneralModuleTests.testIPv4toString.<locals>.<lambda>c                         ttf| |S r8   r\  r   r  r  r  rF   r   r   r"        
r  r  s     z255.0.255.0s   z170.170.170.170   1.2.3.4r  r  z0.0.0.z	300.0.0.0za.0.0.0z	1.2.3.4.5::1)r   r  r  rA   r   r	   rG   r   gassertInvalidr   )rA   r  rG   r   testIPv4toString  s.   








z#GeneralModuleTests.testIPv4toStringc              
      s  zddl mm m} |sd W n ty!   d Y nw tjdkrKz d W n tyJ } z|j	dkr@d W Y d }~nd }~ww  fd	d
fdd
}
dd 
dd 
dd 
dd 
dd 
dd |d |d |d |d |d |d |d |d ts|d 
dd  
d!d" 
d#d$ |d% |d& |d' |d( |d) |d* d S )+Nr   )r  r  rh  IPv6 not available+could not import needed symbols from socketwin32::&'  IPv6 might not be supportedc                    r  r8   r   r  )r  r  r   r   r"    r  z5GeneralModuleTests.testIPv6toString.<locals>.<lambda>c                        ttf | S r8   r  r  r   rG   r   r   r"    r                     z0::0s                  z1::s   Ev V$z$45ef:76cb:1a:56ef:afeb:bac:1924:aeaes   B
    '  T zad42:abc::127:0:254:2s     
            z12:a::z0x20::z:::z::0::z1::abc::z1::abc::defz1:2:3:4:5:6z1:2:3:4:5:6:z1:2:3:4:5:6:7:8:0z1:2:3:4:5:6:7:8:s               *@z::254.42.23.64s    B        *@z42::a29b:254.42.23.64s    B   *@z"42:a8b9:0:2:ffff:a29b:254.42.23.64z255.254.253.252z1::260.2.3.0z1::0.be.e.0z1:2:3:4:5:6:7:1.2.3.4z::1.2.3.4:0z0.100.200.0:3:4:5:6:7:8)r   r  r  rh  rq   ImportErrorr  r  r   winerrorr   r	   rG   rh  r   r  r   )r  r   r  rG   r   testIPv6toString  sr   



z#GeneralModuleTests.testIPv6toString	inet_ntopztest needs socket.inet_ntop()c                    s  ddl m}mm   fdd}fdd}d|d d|d	 d
|d d|d ||d ||d ||d d|td	 d|d d|d	 d
|d ||d ||d ||d d|td	 d S )Nr   )	inet_ntoar  rA   c                    r  r8   r   r  )rA   r  r   r   r"  (  r  z5GeneralModuleTests.testStringToIPv4.<locals>.<lambda>c                    r  r8   r  r  rF   r   r   r"  )  r  z1.0.1.0s     z170.85.170.85s   UUr  r  r  r  s      s        r  )r   r  r  rA   r   	bytearrayr  r   )rA   r  rG   r   testStringToIPv4$  s$   





z#GeneralModuleTests.testStringToIPv4c              
      s  zddl mm m} |sd W n ty!   d Y nw tjdkrKz d W n tyJ } z|j	dkr@d W Y d }~nd }~ww  fd	d
fdd
}
dd 
dd 
dd 
dtd |d |d |d d S )Nr   )r  r  rh  r  r  r  r  r  r  c                    r  r8   r   r  )r  r  r   r   r"  O  r  z5GeneralModuleTests.testStringToIPv6.<locals>.<lambda>c                    r  r8   r  r  r  r   r   r"  P  r  r  r  s                  z!aef:b01:506:1001:ffff:9997:55:170s   
 Ups   s   s   )r   r  r  rh  rq   r  r  r  r   r  r   r  r  r   )r  r   r  rG   r   testStringToIPv6>  s8   



z#GeneralModuleTests.testStringToIPv6c                 C   s   t  }ttjtj}| |j |d|f | }z	t	t
 }W n ty4   | d Y nw | |d d|fd|d   | |d | d S )Nr  r  r   z
%s invalidr   )r   find_unused_portr   rA   r5   rc   r   ro   r   r  r  r   rq   rM  r   )rG   rD   r  r1  Z
my_ip_addrr   r   r   testSockNameb  s   zGeneralModuleTests.testSockNamec                 C   s@   t  t jt j}| |j |t jt j}| |dkd d S )Nr   zinitial mode is reuse)	r   rA   r5   rc   r   
getsockoptrj  rk  assertFalserG   r  Zreuser   r   r   testGetSockOptt  s   z!GeneralModuleTests.testGetSockOptc                 C   sR   t  t jt j}| |j |t jt jd |t jt j}| 	|dkd d S )Nr   r   zfailed to set reuse mode)
r   rA   r5   rc   r   
setsockoptrj  rk  r  r  r  r   r   r   testSetSockOpt|  s
   z!GeneralModuleTests.testSetSockOptc                 C   sN   t  t jt j}|d W d    n1 sw   Y  | t|jd d S )Nr      spam)r   rA   r5   
settimeoutr\  r   r   r  r   r   r   testSendAfterClose  s   z%GeneralModuleTests.testSendAfterClosec              
   C   s   t   }|t jdf t j | d  z|  W n ty: } z| |jtjtj	f W Y d }~d S d }~ww | 
d d S )Nr   rN  z#close() should raise EBADF/ENOTSOCK)r   ro   
_LOCALHOSTrN  r   r   rM  r  EBADFENOTSOCKrX  )rG   r  rA  r   r   r   testCloseException  s   $z%GeneralModuleTests.testCloseExceptionc                 C   s   t  t jt j4}| |jt j tt dr%| |jt jt jB t jf n| |jt j | |j	d W d    d S 1 s?w   Y  d S )NSOCK_CLOEXECr   )
r   rA   r5   r   rS  r   rM  r&  r  rT  r  r   r   r   testNewAttributes  s   

"z$GeneralModuleTests.testNewAttributesc                 C   s   t   }| |j t }|d }|d }| t|jt|f | t|jt|f t	
 D ].}t }z|t|f W  d S  ty\ } z|jtjksQ|dkrR W Y d }~q.d }~ww d S )Nr     )r   rc   r   r   r  r\  r  ro   r   	itertoolscountr   r  Z
EADDRINUSE)rG   r  rD   Zbig_portZneg_portr>   r   r   r   r   test_getsockaddrarg  s&   z&GeneralModuleTests.test_getsockaddrargc                 C   s   |  ttjd |  ttd |  ttd |  ttd |  ttd t }| |j | t|jdd  |tjd d S )Nr   Z
SIO_RCVALLZ	RCVALL_ONZ
RCVALL_OFFSIO_KEEPALIVE_VALSr  )r   d   r  )	rE  r   r   rc   r   r\  r  r   r  rQ  r   r   r   test_sock_ioctl  s   z"GeneralModuleTests.test_sock_ioctlSIO_LOOPBACK_FAST_PATHz1Loopback fast path support required for this testc              
   C   sr   t   }| |j z	|t jd W n ty, } zd}|j|kr'| d  d }~ww | t	|jt jd  d S )NTi='  zQSIO_LOOPBACK_FAST_PATH is defined but doesn't implemented in this Windows version)
r   rc   r   r   r  r   r  rq   r\  r   )rG   r!   r   ZWSAEOPNOTSUPPr   r   r   test_sio_loopback_fast_path  s   

z.GeneralModuleTests.test_sio_loopback_fast_pathc           
   
   C   s6  zt dd W n t jy! } z|jt jkr| d  d }~ww t td D ]
}| t|d q(t dd t dd t d d t	j
rNt dd ttdrYt dkr_t td	 t td t td  t tdt jt j}|D ]%\}}}}}| |t j | t|d
 | |t j | t|d qwt td dt j}|D ]\}}}}}| |t j qt td ddt j t td dddt j t d dt jt jdt j t td }t jtd d}	| ||	 t td t j}t jtd t jd}	| ||	 t td dt j}t jtd t jd}	| ||	 t td ddt j}t jtd t jd}	| ||	 t td dddt j}t jtd t jd}	| ||	 t d dt jt jdt j}t jd dt jt jdt jd}	| ||	 | tt jdd tt drzt dd dddt j W d S  t jy   Y d S w d S )N	localhostP   zbuggy libc versionr  rK  r  r  r  httpAddressFamily.AF_INETSocketKind.SOCK_STREAMr   )r  rD   rS  r&  )rT  )flags)r  rD   rS  r&  rT  r$  u   AI_NUMERICSERV)r   getaddrinfor^  r  EAI_SERVICErq   r   r   lenr   IPV6_ENABLEDr   r  r  rA   r5   r<  SOL_TCP
AI_PASSIVE	AF_UNSPECr\  UnicodeEncodeErrorr%  )
rG   rA  infoZinfosrS  r&  r   socktyper  br   r   r   testGetaddrinfo  s   



z"GeneralModuleTests.testGetaddrinfoc                 C   s   |  ttjdd d S )N)zmail.python.orgr   r   )r\  r   r   r  rF   r   r   r   test_getnameinfo!     z#GeneralModuleTests.test_getnameinfoZnetworkznetwork is not enabledc                 C   sd   t d td W d    n1 sw   Y  d}t| t| t|dtjtj d S )Nz
python.orgu!   испытание.pythontest.netr   )r   Ztransient_internetr   r  gethostbyname_exr&  r,  r5   )rG   r  r   r   r   	test_idna%  s   

zGeneralModuleTests.test_idnac              
      s\  t tdr
t tds d  fdd} fdd}t \}}ttj|}zp|r0|d  t t	d	 |
d
tj  W d    n1 sMw   Y  |rttj| t	d	  t|j
d
tj  W t	d ttj| |  |  d S W t	d ttj| |  |  d S t	d ttj| |  |  w )Nalarmr   z9signal.alarm and socket.socketpair required for this testc                     s     ttjd d S r   r\  r  mathacoshr]   rF   r   r   
ok_handler<  r   z@GeneralModuleTests.check_sendall_interrupted.<locals>.ok_handlerc                     s     ttjd dd  d S Nr   r   r7  r:  rF   r   r   raising_handler>  s   zEGeneralModuleTests.check_sendall_interrupted.<locals>.raising_handlerg      ?r      xr   )r   signalr   rq   r   SIGALRMr  r\  ZeroDivisionErrorr6  sendallr   SOCK_MAX_SIZETimeoutErrorr   )rG   Zwith_timeoutr;  r=  cr!   	old_alarmr   rF   r   check_sendall_interrupted6  s@   








z,GeneralModuleTests.check_sendall_interruptedc                 C      |  d d S NFrG  rF   r   r   r   test_sendall_interruptedU     z+GeneralModuleTests.test_sendall_interruptedc                 C   rH  )NTrJ  rF   r   r   r   %test_sendall_interrupted_with_timeoutX  rL  z8GeneralModuleTests.test_sendall_interrupted_with_timeoutc                 C   s   t  t jt j}t|}| t}d }t  W d    n1 s"w   Y  | |t	|j
jd  t  t jt j}|d}t|}d }t  | t d }t  W d    d S 1 saw   Y  d S )Nr   r   )r   rA   r5   rO  ZassertWarnsResourceWarningr   
gc_collectrM  r<  warningr]   makefile)rG   r  r   rf  r   r   r   r   test_dealloc_warn[  s    


"z$GeneralModuleTests.test_dealloc_warnc                 C   sX   t  t jt j}|d}|  | t|d W d    d S 1 s%w   Y  d S )Nr   z<_io.BufferedReader name=-1>)r   rA   r5   rQ  r   r   rO  rG   r  fpr   r   r   test_name_closed_socketiol  s
   
"z,GeneralModuleTests.test_name_closed_socketioc                 C   s   t   >}|jddd}| |  | |  | |  |  | t	|j | t	|j | t	|j W d    d S 1 sEw   Y  d S )Nr   r   )	buffering)
r   rQ  rE  readabler  writableseekabler   r\  r  rS  r   r   r   test_unusable_closed_socketior  s   
"z0GeneralModuleTests.test_unusable_closed_socketioc                 C   s2  t   }zC|tdf t |  | t |d W d    n1 s(w   Y  W | t |  W d    n#1 sBw   Y  n| t |  W d    w 1 s\w   Y  w | t t d  W d    n1 sww   Y  | t t d W d    d S 1 sw   Y  d S )Nr   r   r  )	r   ro   r   r   rN  r\  r   rE   r   r  r   r   r   test_socket_close}  s&   
*
"z$GeneralModuleTests.test_socket_closec                 C   s   dD ]R}| j |dB t .}d|v rd nd}|j||d}| |j| W d    n1 s1w   Y  W d    n1 s@w   Y  W d    q1 sOw   Y  qd S )N)r   r   rwwwbmoder0  r   encoding)subTestr   rQ  r   r`  )rG   r`  r  rb  rT  r   r   r   test_makefile_mode  s   
z%GeneralModuleTests.test_makefile_modec                 C   s   dD ]G}| j |d7 t #}| td || W d    n1 s&w   Y  W d    n1 s5w   Y  W d    q1 sDw   Y  qd S )N)Zrtrk   +r  r_  zinvalid mode)rc  r   assertRaisesRegexr  rQ  )rG   r`  r  r   r   r   test_makefile_invalid_mode  s   
z-GeneralModuleTests.test_makefile_invalid_modec                 C   s   t   }| ttjd D ]}| ttj|| qW d    n1 s$w   Y  ttjd D ]$}ttt j|}| 	|t j ttt j
|}| 	|t j
 q0d S r  )r   rangepickleHIGHEST_PROTOCOLr\  r   dumpsloadsrA   r   r5   )rG   r  protocolrS  r&  r   r   r   test_pickle  s   zGeneralModuleTests.test_picklec              	   C   s   dD ]&}t  t jt j}|tdf || W d    q1 s#w   Y  qt  t jt j}|tdf |  W d    d S 1 sHw   Y  d S )N)r   r  r   )r   rA   r5   ro   r   rE   )rG   backlogsrvr   r   r   test_listen_backlog  s   
"z&GeneralModuleTests.test_listen_backlogc                 C   sb   dd l }ttjtj}|tdf | t|j|j	d  W d    d S 1 s*w   Y  d S r<  )
r  r   rA   r5   ro   r   r\  r  rE   r  )rG   r  rp  r   r   r   test_listen_backlog_overflow  s
   "z/GeneralModuleTests.test_listen_backlog_overflowIPv6 required for this test.c                 C   sh   |  ttjtjddfd ttjtj}|  t|jtjddf W d    d S 1 s-w   Y  d S )Nr   r  i)	r\  r  r   r  r   r  r  r5   ro   rQ  r   r   r   test_flowinfo  s   
"z GeneralModuleTests.test_flowinfoc                 C   s0   t ddt jt jt j\^ }}| |d d S )Nff02::1de:c0:face:8Dr   )ff02::1de:c0:face:8dr   r   r   )r   r&  r  r$   rn  r   )rG   r   sockaddrr   r   r   test_getaddrinfo_ipv6_basic  s   z.GeneralModuleTests.test_getaddrinfo_ipv6_basicr  zdoes not work on WindowszSymbolic scope id does not workz test needs socket.if_nameindex()c                 C   sL   t  d \}}t d| dt jt jt j\^ }}| |ddd|f d S )Nr   ff02::1de:c0:face:8D%r   rv  )r   r  r&  r  r$   rn  r   )rG   ifindextest_interfacer   rw  r   r   r   &test_getaddrinfo_ipv6_scopeid_symbolic  s   z9GeneralModuleTests.test_getaddrinfo_ipv6_scopeid_symbolicz.Numeric scope id does not work or undocumentedc                 C   sD   d}t dt| dt jt jt j\^ }}| |ddd|f d S )N*   ry  r   rv  r   )r   r&  r<  r  r$   rn  r   )rG   rz  r   rw  r   r   r   %test_getaddrinfo_ipv6_scopeid_numeric  s   
z8GeneralModuleTests.test_getaddrinfo_ipv6_scopeid_numericc                 C   sH   t  d \}}ddd|f}t |t jt jB }| |d| df d S )Nr   ru  r   ff02::1de:c0:face:8d%1234)r   r  r  NI_NUMERICHOSTNI_NUMERICSERVr   )rG   rz  r{  rw  nameinfor   r   r   &test_getnameinfo_ipv6_scopeid_symbolic  s   z9GeneralModuleTests.test_getnameinfo_ipv6_scopeid_symbolicc                 C   s@   d}ddd|f}t |t jt jB }| |dt| df d S )Nr}  ru  r   r   r  r  )r   r  r  r  r   r<  )rG   rz  rw  r  r   r   r   %test_getnameinfo_ipv6_scopeid_numeric  s   z8GeneralModuleTests.test_getnameinfo_ipv6_scopeid_numericc                 C   sZ   t  t jt j}| t|jd | t|jd W d    d S 1 s&w   Y  d S )Nr   r!  )r   rA   r5   r   r<  rS  r&  rQ  r   r   r   test_str_for_enums  s   "z%GeneralModuleTests.test_str_for_enumsc                 C   s   t tdd}t tdd}tj|B |B }ttj|E}| |jtj |d | |jtj |d | |jtj |d | |jtj |d | |jtj W d    d S 1 sbw   Y  d S )NSOCK_NONBLOCKr   r  r   TF)r   r   r5   rA   r   r&  r  setblocking)rG   r  r  Z	sock_typer!   r   r   r    test_socket_consistent_sock_type  s   



"z3GeneralModuleTests.test_socket_consistent_sock_typec                 C   s   t  t jt j}| }tt jj d }tdd t jj	 D d }t j ||d|d }| 
|j| | 
|j| | |jddh W d    d S 1 sQw   Y  d S )Nr   c                 s   s     | ]\}}|d vr|V  qdS )>   r  r  Nr   )r0  r1  kindr   r   r   r7  #  s    
zEGeneralModuleTests.test_unknown_socket_family_repr.<locals>.<genexpr>r  )rS  r&  rT  rN  r   )r   rA   r5   detachmaxAddressFamily__members__values
SocketKindr  r   rS  r&  rM  rT  )rG   r  fdZunknown_familyZunknown_typer!   r   r   r   test_unknown_socket_family_repr  s"   
"z2GeneralModuleTests.test_unknown_socket_family_reprsendfileztest needs os.sendfile()c              	   C   s  G dd d}t   u}ttjtj}t| | t j ||| W d    n1 s1w   Y  | t	 ||dd  W d    n1 sOw   Y  | t
 ||d  W d    n1 skw   Y  W d    d S W d    d S 1 sw   Y  d S )Nc                   @   r?   )z<GeneralModuleTests.test__sendfile_use_sendfile.<locals>.Filec                 S   s
   || _ d S r8   r  )rG   r  r   r   r   rX   4     
zEGeneralModuleTests.test__sendfile_use_sendfile.<locals>.File.__init__c                 S      | j S r8   r  rF   r   r   r   rN  7  s   zCGeneralModuleTests.test__sendfile_use_sendfile.<locals>.File.filenoN)rN   rO   rP   rX   rN  r   r   r   r   File3  s    r  r   r  )r   r   r   curdirO_RDONLYr   r\  _GiveupOnSendfile_sendfile_use_sendfiler  r   )rG   r  r  r  r   r   r   test__sendfile_use_sendfile1  s    

"z.GeneralModuleTests.test__sendfile_use_sendfilec                 C   st   |  |j| |  |j| | }tj|d}| |j |  |  |j| |  |j| |  | | d S Nr  )r   rS  r&  rN  r   rc   r   r  )rG   r!   rS  styper  s2r   r   r   _test_socket_filenoC  s   z&GeneralModuleTests._test_socket_filenoc                 C   sR  t  t jt j}| |j |tjdf | |t jt j t	t drCt  t jt j
}| |j |tjdf | |t jt j
 tjrgt  t jt j}| |j |tjdddf | |t jt j t	t drt }| tj| t  t jt j}| |j z|tj|d W n
 ty   Y d S w | |t jt j d S d S )Nr   r$   r  r   )r   rA   r5   rc   r   ro   r   r   r  r   r$   r)  r  r  r   r   shutilrmtreer  r   r  r9  PermissionError)rG   r!   Ztmpdirr   r   r   test_socket_filenoP  s8   


z%GeneralModuleTests.test_socket_filenoc                 C   D   |  t tjtjtjdd W d    d S 1 sw   Y  d S )Ng     @E@r  r\  r   r   rA   r5   rF   r   r   r    test_socket_fileno_rejects_floato     "z3GeneralModuleTests.test_socket_fileno_rejects_floatc                 C   r  )Nfoor  r  rF   r   r   r   &test_socket_fileno_rejects_other_typess  r  z9GeneralModuleTests.test_socket_fileno_rejects_other_typesc                 C   F   |  td tjtjtjdd W d    d S 1 sw   Y  d S )Nnegative file descriptorr  r  rf  r  r   rA   r5   rF   r   r   r   )test_socket_fileno_rejects_invalid_socketw  s   "z<GeneralModuleTests.test_socket_fileno_rejects_invalid_socketzWindows disallows -1 onlyc                 C   r  )Nr  ir  r  rF   r   r   r   #test_socket_fileno_rejects_negative{  s   "z6GeneralModuleTests.test_socket_fileno_rejects_negativec                 C   s   d}|  t}tjt d W d    n1 sw   Y  | |jjtj|f |  t}tjtj	tj
t d W d    n1 sFw   Y  | |jjtj|f d S )Ni6'  r  )r\  r   r   r   Zmake_bad_fdrM  re  r  r  rA   r5   )rG   ZWSAENOTSOCKrf  r   r   r   $test_socket_fileno_requires_valid_fd  s   z7GeneralModuleTests.test_socket_fileno_requires_valid_fdc              	   C   s   t  P}| t tj| d W d    n1 sw   Y  | t}tjtjtj| d W d    n1 s>w   Y  | |j	j
t
j W d    d S 1 sWw   Y  d S r  )r   NamedTemporaryFiler\  r   r   rN  rA   r5   r   re  r  r  )rG   Zafilerf  r   r   r   %test_socket_fileno_requires_socket_fd  s   
"z8GeneralModuleTests.test_socket_fileno_requires_socket_fd)YrN   rO   rP   rH  rR  r   
skipUnlessrD  rV  rZ  r_  rg  rl  rp  r   r1  rt  r  r  r   r)  r  r  r  r  r   r   r  r  r  r  r  r  r  r   cpython_onlyr  r  r  r  r  r  r   r  r  r  r	  r  r  r  r  r  r  r1  r2  Zis_resource_enabledr5  rG  rK  rM  rR  rU  rZ  r[  rd  rg  rn  rq  rr  rt  rx  skipIfr	   r|  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r   r   rC  @  s   

*

	





,


>

"
N




	



rC  z!SocketCan required for this test.c                   @   s   e Zd Zdd Zeeedddd Zdd Z	eeeddd	d
 Z
dd Zdd Zeeedddd Zeeedddd ZdS )BasicCANTestc                 C   s   t j t j t j d S r8   )r   AF_CANr   r   rF   r   r   r   rl    s   
z!BasicCANTest.testCrucialConstantsCAN_BCM&socket.CAN_BCM required for this test.c                 C      t j t j t j t j t j t j t j t j t j	 t j
 t j t j t j t j t j t j t j t j t j t j t j t j t j t j d S r8   )r   r  ZCAN_BCM_TX_SETUPZCAN_BCM_TX_DELETEZCAN_BCM_TX_READCAN_BCM_TX_SENDZCAN_BCM_RX_SETUPZCAN_BCM_RX_DELETEZCAN_BCM_RX_READZCAN_BCM_TX_STATUSZCAN_BCM_TX_EXPIREDZCAN_BCM_RX_STATUSZCAN_BCM_RX_TIMEOUTZCAN_BCM_RX_CHANGEDZCAN_BCM_SETTIMERZCAN_BCM_STARTTIMERZCAN_BCM_TX_COUNTEVTZCAN_BCM_TX_ANNOUNCEZCAN_BCM_TX_CP_CAN_IDZCAN_BCM_RX_FILTER_IDZCAN_BCM_RX_CHECK_DLCZCAN_BCM_RX_NO_AUTOTIMERZCAN_BCM_RX_ANNOUNCE_RESUMEZCAN_BCM_TX_RESET_MULTI_IDXZCAN_BCM_RX_RTR_FRAMErF   r   r   r   testBCMConstants  s0   
zBasicCANTest.testBCMConstantsc                 C   :   t  t jt jt j	}W d    d S 1 sw   Y  d S r8   r   r   r   r   rQ  r   r   r   testCreateSocket     "zBasicCANTest.testCreateSocketc                 C   r  r8   )r   r   r$   r  rQ  r   r   r   testCreateBCMSocket     "z BasicCANTest.testCreateBCMSocketc                 C   sX   t  t jt jt j}d}|| | | | W d    d S 1 s%w   Y  d S )N)r`  )r   r   r   r   ro   r   r   )rG   r!   addressr   r   r   testBindAny  s
   
"zBasicCANTest.testBindAnyc                 C   sL   t  t jt jt j}| td|jd W d    d S 1 sw   Y  d S )Ninterface name too long)   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)r   r   r   r   rf  r   ro   rQ  r   r   r   testTooLongInterfaceName  s
   "z%BasicCANTest.testTooLongInterfaceNameCAN_RAW_LOOPBACKz/socket.CAN_RAW_LOOPBACK required for this test.c              	   C   sn   t  t jt jt j#}dD ]}|t jt j| | ||t jt j qW d    d S 1 s0w   Y  d S )N)r   r   )	r   r   r   r   r  SOL_CAN_RAWr  r   r  )rG   r!   Zloopbackr   r   r   testLoopback  s   "zBasicCANTest.testLoopbackCAN_RAW_FILTERz-socket.CAN_RAW_FILTER required for this test.c              	   C   s   d\}}t d||}ttjtjtj*}|tjtj| | 	||
tjtjd |tjtjt| W d    d S 1 sBw   Y  d S )N)   i   z=IIrl   )r   packr   r   r   r   r  r  r  r   r  r  )rG   can_idZcan_maskZ
can_filterr!   r   r   r   
testFilter  s   "zBasicCANTest.testFilterN)rN   rO   rP   rl  r   r  r   r   r  r  r  r  r  r  r  r   r   r   r   r    s*    


r  c                   @   s   e Zd ZdddZedd Zedd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd Zeeedddd Zeeedddd ZdS )CANTestr   c                 C   r   r   )r   rX   r   r   r   r   rX     r   zCANTest.__init__c                 C   s&   t |}|dd}t| j|||S )zBuild a CAN frame.rl       N)r(  ljustr   r  rs   )clsr  datacan_dlcr   r   r   build_can_frame  s   zCANTest.build_can_framec                 C   s&   t | j|\}}}|||d| fS )zDissect a CAN frame.N)r   r   rs   )r  framer  r  r  r   r   r   dissect_can_frame  s   zCANTest.dissect_can_framec                 C   s6   | j | j\}}| | j| | |d | j d S r   )r!   recvfromrr   r   cfrp   rG   r  r   r   r   r   testSendFrame  s   zCANTest.testSendFramec                 C       |  dd| _| j| j d S )Nr   s   r  r  r   r   rF   r   r   r   _testSendFrame     zCANTest._testSendFramec                 C   s$   | j | j\}}| | j| d S r8   )r!   r  rr   r   r  r  r   r   r   testSendMaxFrame
  rR   zCANTest.testSendMaxFramec                 C   r  )Nr   s   r  rF   r   r   r   _testSendMaxFrame  r  zCANTest._testSendMaxFramec                 C   D   | j | j\}}| | j| | j | j\}}| | j| d S r8   )r!   r  rr   r   cf1cf2r  r   r   r   testSendMultiFrames     zCANTest.testSendMultiFramesc                 C   s<   |  dd| _| j| j |  dd| _| j| j d S )N   s   D3"   s   "3)r  r  r   r   r  rF   r   r   r   _testSendMultiFrames  s   zCANTest._testSendMultiFramesr  r  c                 C   sP   | j | j\}}| | j| | |\}}}| | j| | | j| d S r8   )r   r  rr   r   r  r  r  r  )rG   r  r   r  r  r  r   r   r   _testBCM   s
   zCANTest._testBCMc                 C   s   t  t jt jt j}| |j || jf d| _t	g d| _
| | j| j
| _t j}d}d}d } } }}d}	d}
t| jdksFJ t| j||||||||	|

}|| j }||}| |t| d S )N#  )         r   i"  r   r  )r   r   r$   r  rc   r   r   rp   r  bytesr  r  r  r  r(  r   r  ru   r   r   )rG   ZbcmZopcoder$  r  Zival1_secondsZ
ival1_usecZival2_secondsZ
ival2_usecZ
bcm_can_idZnframesheaderZheader_plus_frameZ
bytes_sentr   r   r   testBCM)  s6   

zCANTest.testBCMNr   )rN   rO   rP   rX   classmethodr  r  r  r  r  r  r  r  r   r  r   r   r  r  r   r   r   r   r    s(    



r  z!CAN ISOTP required for this test.c                       sV   e Zd Z fddZdd Zdd Zeee	ddd	d
 Z
dd Zdd Z  ZS )	ISOTPTestc                       t  j|i | d| _d S Nri   rW   rX   rp   r\   r_   r   r   rX   L     
zISOTPTest.__init__c                 C   s   t j t j t j t j d S r8   )r   r  r   r%   r$   rF   r   r   r   rl  P  s   
zISOTPTest.testCrucialConstantsc                 C   r  r8   r  rQ  r   r   r   r  V  r  zISOTPTest.testCreateSocketr%   z(socket.CAN_ISOTP required for this test.c                 C   r  r8   )r   r   r$   r%   rQ  r   r   r   testCreateISOTPSocketZ  r  zISOTPTest.testCreateISOTPSocketc              	   C   s   t  t jt jt j,}| td |d W d    n1 s!w   Y  W d    d S W d    d S 1 s9w   Y  d S )Nr  )r  r   r   )r   r   r$   r%   rf  r   ro   rQ  r   r   r   r  `  s   "z"ISOTPTest.testTooLongInterfaceNamec              
   C   s   z2t  t jt jt j}| jddf}|| | | | W d    W d S 1 s+w   Y  W d S  tyU } z|j	t	j
krI| d| j  n W Y d }~d S d }~ww )Nr  iV  rn   )r   r   r$   r%   rp   ro   r   r   r   r  ENODEVrq   rG   r!   r   r   r   r   r   testBindf  s   
&zISOTPTest.testBind)rN   rO   rP   rX   rl  r  r   r  r   r   r  r  r  rg   r   r   r_   r   r  I  s    
r  z!CAN J1939 required for this test.c                       sX   e Zd Z fddZeeedddd Zeeedddd Z	d	d
 Z
  ZS )	J1939Testc                    r  r  r  r\   r_   r   r   rX   w  r  zJ1939Test.__init__r'   z(socket.CAN_J1939 required for this test.c                 C   r  r8   )r   r'   ZJ1939_MAX_UNICAST_ADDRZJ1939_IDLE_ADDRJ1939_NO_ADDRJ1939_NO_NAMEZJ1939_PGN_REQUESTZJ1939_PGN_ADDRESS_CLAIMEDZJ1939_PGN_ADDRESS_COMMANDEDZJ1939_PGN_PDU1_MAXZJ1939_PGN_MAXJ1939_NO_PGNZSO_J1939_FILTERZSO_J1939_PROMISCZSO_J1939_SEND_PRIOZSO_J1939_ERRQUEUEZSCM_J1939_DEST_ADDRZSCM_J1939_DEST_NAMEZSCM_J1939_PRIOZSCM_J1939_ERRQUEUEZJ1939_NLA_PADZJ1939_NLA_BYTES_ACKEDZJ1939_EE_INFO_NONEZJ1939_EE_INFO_TX_ABORTZJ1939_FILTER_MAXrF   r   r   r   testJ1939Constants{  s0   
zJ1939Test.testJ1939Constantsc                 C   r  r8   )r   r   r$   r'   rQ  r   r   r   testCreateJ1939Socket  r  zJ1939Test.testCreateJ1939Socketc              
   C   s   z6t  t jt jt j!}| jt jt jt jf}|| | 	|
 | W d    W d S 1 s/w   Y  W d S  tyY } z|jtjkrM| d| j  n W Y d }~d S d }~ww rm   )r   r   r$   r'   rp   r  r   r  ro   r   r   r   r  r  rq   r  r   r   r   r    s   
&zJ1939Test.testBind)rN   rO   rP   rX   r   r  r   r   r  r  r  rg   r   r   r_   r   r  t  s    
!
r  z#RDS sockets required for this test.c                   @   s$   e Zd Zdd Zdd Zdd ZdS )BasicRDSTestc                 C   s   t j t j d S r8   )r   ZAF_RDSr*   rF   r   r   r   rl    s   
z!BasicRDSTest.testCrucialConstantsc                 C   s8   t  t jt jd	}W d    d S 1 sw   Y  d S r   )r   r*   r+   rQ  r   r   r   r    s   "zBasicRDSTest.testCreateSocketc                 C   s`   d}t  t jt jd}|t jt j| |t jt j| W d    d S 1 s)w   Y  d S )Ni @  r   )r   r*   r+   r  rj  	SO_RCVBUF	SO_SNDBUF)rG   rr   r!   r   r   r   testSocketBufferSize  s
   "z!BasicRDSTest.testSocketBufferSizeN)rN   rO   rP   rl  r  r  r   r   r   r   r    s    r  c                       s   e Zd ZdddZ fddZdd Zdd	 Zd
d Zdd Ze	e
j
ddd Ze	e
j
ddd Zdd Zdd Zdd Zdd Z  ZS )RDSTestr   c                 C   r   r   )r   rX   r   r   r   r   rX     r   zRDSTest.__init__c                    s   t    t | _d S r8   )rW   rH   rY   r   ZevtrF   r_   r   r   rH     r   zRDSTest.setUpc                 C   s2   | j | j\}}| | j| | | j| d S r8   )rB   r  rr   r   r  r   rG   r  r   r   r   r   testSendAndRecv  s   zRDSTest.testSendAndRecvc                 C   "   d| _ | j| j dt| jf d S Nr
  r   r  r   rd  r   rD   rF   r   r   r   _testSendAndRecv     zRDSTest._testSendAndRecvc                 C   sH   | j | jtj\}}| | j| | j | j\}}| | j| d S r8   )rB   r  rr   r   MSG_PEEKr   r  r  r   r   r   testPeek  s   zRDSTest.testPeekc                 C   r
  r  r  rF   r   r   r   	_testPeek  r  zRDSTest._testPeekrecvmsgc                 C   s(   | j | j\}}}}| | j| d S r8   )rB   r  rr   r   r  )rG   r  ancdataZ	msg_flagsr   r   r   r   testSendAndRecvMsg  s   zRDSTest.testSendAndRecvMsgsendmsgc                 C   s&   d| _ | j| j gddt| jf d S )Ns<   hello hello hello hello hello hello hello hello hello hello r   r   )r  r   r  r   rD   rF   r   r   r   _testSendAndRecvMsg  s    zRDSTest._testSendAndRecvMsgc                 C   r  r8   )rB   r  rr   r   data1data2r  r   r   r   testSendAndRecvMulti  r  zRDSTest.testSendAndRecvMultic                 C   s@   d| _ | j| j dt| jf d| _| j| jdt| jf d S )Ns   baconr   s   egg)r  r   rd  r   rD   r  rF   r   r   r   _testSendAndRecvMulti  s   zRDSTest._testSendAndRecvMultic                 C   sL   t  | jgg g d\}}}| | j| | j| j\}}| | j| d S )Ng      @)selectrB   rM  r  rr   r   r  )rG   r   r]  rk   r  r   r   r   r   
testSelect  s   zRDSTest.testSelectc                 C   r
  )Ns   selectr   r  rF   r   r   r   _testSelect  r  zRDSTest._testSelectr   )rN   rO   rP   rX   rH   r	  r  r  r  r;  r   r  r  r  r  r  r  rg   r   r   r_   r   r    s    




r  z'QIPCRTR sockets required for this test.c                   @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )BasicQIPCRTRTestc                 C   
   t j d S r8   )r   r0   rF   r   r   r   rl  	  r  z%BasicQIPCRTRTest.testCrucialConstantsc                 C   6   t  t jt j	}W d    d S 1 sw   Y  d S r8   )r   r0   r$   rQ  r   r   r   r  
	     "z!BasicQIPCRTRTest.testCreateSocketc                 C   sJ   t  t jt j}| | d d W d    d S 1 sw   Y  d S Nr   r   )r   r0   r$   r   r   rQ  r   r   r   testUnbound	     "zBasicQIPCRTRTest.testUnboundc                 C   s`   t  t jt j}tj|| d d | | d d W d    d S 1 s)w   Y  d S )Nr   r  r   )r   r0   r$   r   rC   r   assertNotEqualrQ  r   r   r   testBindSock	  s   "zBasicQIPCRTRTest.testBindSockc                 C   sJ   t  t jt j}| jttj|dd W d    d S 1 sw   Y  d S )Nr  r  )r   r0   r$   r\  r   r   rC   rQ  r   r   r   testInvalidBindSock	  r$  z$BasicQIPCRTRTest.testInvalidBindSockc                 C   sT   t  t jt j}|d | | d d W d    d S 1 s#w   Y  d S )N){   r(  r   r   )r   r0   r$   r   r%  r   rQ  r   r   r   testAutoBindSock	  s   
"z!BasicQIPCRTRTest.testAutoBindSockN)	rN   rO   rP   rl  r  r#  r&  r'  r)  r   r   r   r   r  	  s    r  c                   @   ,   e Zd Zdd Zdd Zdd Zdd Zd	S )
BasicVSOCKTestc                 C   r  r8   )r   r   rF   r   r   r   rl  %	  r  z#BasicVSOCKTest.testCrucialConstantsc                 C   rs  r8   )	r   SO_VM_SOCKETS_BUFFER_SIZESO_VM_SOCKETS_BUFFER_MIN_SIZESO_VM_SOCKETS_BUFFER_MAX_SIZEr   ZVMADDR_PORT_ANYZVMADDR_CID_HOSTZVM_SOCKETS_INVALID_VERSIONr
   rF   r   r   r   testVSOCKConstants(	  s   
z!BasicVSOCKTest.testVSOCKConstantsc                 C   r   r8   )r   r   r5   rQ  r   r   r   r  2	  r!  zBasicVSOCKTest.testCreateSocketc                 C   s   t  t jt jl}|t jt j}|t jt j}|t jt j}|t jt j|d  |t jt j|d  |t jt j|d  | |d |t jt j | |d |t jt j | |d |t jt j W d    d S 1 sww   Y  d S Nr   )	r   r   r5   r  r.  r,  r-  r  r   )rG   r!   Zorig_maxr  Zorig_minr   r   r   r  6	  sF   





"z#BasicVSOCKTest.testSocketBufferSizeN)rN   rO   rP   rl  r/  r  r  r   r   r   r   r+   	  s
    
r+  z)Bluetooth sockets required for this test.c                   @   sv   e Zd Zdd Zdd Zeejdkddd Z	eejdkd	d
d Z
eejdkp2ejdddd ZdS )BasicBluetoothTestc                 C   sR   t j t j t j t j tjdkr%t j t j t j	 tj
ds't j d S d S d S )Nr  r  )r   Z
BDADDR_ANYZBDADDR_LOCALr4   r6   r  r  BTPROTO_HCIZSOL_HCIBTPROTO_L2CAPr  BTPROTO_SCOrF   r   r   r   testBluetoothConstantsU	  s   

z)BasicBluetoothTest.testBluetoothConstantsc                 C   r  r8   )r   r4   r5   r6   rQ  r   r   r   testCreateRfcommSocketc	  r  z)BasicBluetoothTest.testCreateRfcommSocketr  z&windows does not support L2CAP socketsc                 C   r  r8   )r   r4   r+   r3  rQ  r   r   r   testCreateL2capSocketg	     "z(BasicBluetoothTest.testCreateL2capSocketz$windows does not support HCI socketsc                 C   r  r8   )r   r4   r   r2  rQ  r   r   r   testCreateHciSocketl	  r8  z&BasicBluetoothTest.testCreateHciSocketr  z.windows and freebsd do not support SCO socketsc                 C   r  r8   )r   r4   r+   r4  rQ  r   r   r   testCreateScoSocketq	  r  z&BasicBluetoothTest.testCreateScoSocketN)rN   rO   rP   r5  r6  r   r  r  r  r7  r9  r  r:  r   r   r   r   r1  Q	  s    

r1  c                   @   s   e Zd Zd+ddZdd Zdd Zdd	 Zd
d Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# ZeeZejd$d% Zd&d' Zd(d) Zd*S ),BasicTCPTestr   c                 C   r   r   r   rX   r   r   r   r   rX   z	  r   zBasicTCPTest.__init__c                 C   r   r   )r   r   r   r   r   r   r   r   testRecv}	  r   zBasicTCPTest.testRecvc                 C      | j t d S r8   r   r   r   rF   r   r   r   	_testRecv	  r  zBasicTCPTest._testRecvc                 C   s8   | j ttd }| j d}|| }| |t d S N   r   )r   r   r(  r   r   )rG   seg1seg2r   r   r   r   testOverFlowRecv	  s   zBasicTCPTest.testOverFlowRecvc                 C   r>  r8   r?  rF   r   r   r   _testOverFlowRecv	  r  zBasicTCPTest._testOverFlowRecvc                 C   s    | j d\}}| |t d S r   )r   r  r   r   rG   r   r   r   r   r   testRecvFrom	     zBasicTCPTest.testRecvFromc                 C   r>  r8   r?  rF   r   r   r   _testRecvFrom	  r  zBasicTCPTest._testRecvFromc                 C   s@   | j ttd \}}| j d\}}|| }| |t d S rA  )r   r  r(  r   r   )rG   rC  r   rD  r   r   r   r   testOverFlowRecvFrom	  s   z!BasicTCPTest.testOverFlowRecvFromc                 C   r>  r8   r?  rF   r   r   r   _testOverFlowRecvFrom	  r  z"BasicTCPTest._testOverFlowRecvFromc                 C   s2   d}	 | j d}|sq||7 }q| |d d S )N    r   r      ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)r   r   r   )rG   r   readr   r   r   testSendAll	  s   zBasicTCPTest.testSendAllc                 C   s   d}| j | d S )NrN  )r   rB  )rG   Z	big_chunkr   r   r   _testSendAll	  s   zBasicTCPTest._testSendAllc                 C   sP   | j  }t|tjtj}| |j | |tj |	d}| 
|t d S r   )r   rN  r   fromfdrA   r5   rc   r   rG  r   r   r   )rG   r  r  r   r   r   r   
testFromFd	  s   

zBasicTCPTest.testFromFdc                 C   r>  r8   r?  rF   r   r   r   _testFromFd	  r  zBasicTCPTest._testFromFdc                 C   s0   | j  }| |j |d}| |t d S r   )r   duprc   r   r   r   r   )rG   r  r   r   r   r   testDup	  s   

zBasicTCPTest.testDupc                 C   r>  r8   r?  rF   r   r   r   _testDup	  r  zBasicTCPTest._testDupc                 C   s&   | j d}| |t | j  d S r   )r   r   r   r   r   r   r   r   r   r   testShutdown	  s   zBasicTCPTest.testShutdownc                 C   s   | j t | j d d S r0  )r   r   r   shutdownrF   r   r   r   _testShutdown	  r   zBasicTCPTest._testShutdownc                 C   sX   dd l }| jt | t| jj|jd  | t| jjd|jd   | jd d S )Nr   r   r   )	r  r   r   r   r\  r  rY  r  UINT_MAXrG   r  r   r   r   _testShutdown_overflow	  s   z#BasicTCPTest._testShutdown_overflowc                 C   s   | j  }| j  }| || | | j j | t| j jd | j 	  t
j
t
jt
j|d}| |j	 |d}| |t d S )Nr   r  )r   rN  r  r   rE  _closedr\  r   r   r   r   rA   r5   rc   r   )rG   rN  r   r  r   r   r   r   
testDetach	  s   



zBasicTCPTest.testDetachc                 C   r>  r8   r?  rF   r   r   r   _testDetach	  r  zBasicTCPTest._testDetachNr   )rN   rO   rP   rX   r=  r@  rE  rF  rH  rJ  rK  rL  rP  rQ  rS  rT  rV  rW  rX  rZ  r   r  ZtestShutdown_overflowr]  r_  r`  r   r   r   r   r;  x	  s.    

		


r;  c                   @   F   e Zd ZdddZdd Zdd Zdd	 Zd
d Zdd Zdd Z	dS )BasicUDPTestr   c                 C   r   r   )r   rX   r   r   r   r   rX   	  r   zBasicUDPTest.__init__c                 C       | j tt}| |t d S r8   rB   r   r(  r   r   r   r   r   r   testSendtoAndRecv	  rI  zBasicUDPTest.testSendtoAndRecvc                 C      | j tdt| jf d S r   r   rd  r   r   rD   rF   r   r   r   _testSendtoAndRecv	  r   zBasicUDPTest._testSendtoAndRecvc                 C   $   | j tt\}}| |t d S r8   rB   r  r(  r   r   rG  r   r   r   rH   
     zBasicUDPTest.testRecvFromc                 C   rf  r   rg  rF   r   r   r   rJ  
  r   zBasicUDPTest._testRecvFromc                 C      |  t| jjd d S Nr  r\  r  rB   r  rF   r   r   r   testRecvFromNegative
  r3  z!BasicUDPTest.testRecvFromNegativec                 C   rf  r   rg  rF   r   r   r   _testRecvFromNegative
  r   z"BasicUDPTest._testRecvFromNegativeNr   
rN   rO   rP   rX   re  rh  rH  rJ  ro  rp  r   r   r   r   rb  	  s    
rb  c                   @   ra  )BasicUDPLITETestr   c                 C   r   r   )r   rX   r   r   r   r   rX   
  r   zBasicUDPLITETest.__init__c                 C   rc  r8   rd  r   r   r   r   re  
  rI  z"BasicUDPLITETest.testSendtoAndRecvc                 C   rf  r   rg  rF   r   r   r   rh  
  r   z#BasicUDPLITETest._testSendtoAndRecvc                 C   ri  r8   rj  rG  r   r   r   rH  
  rk  zBasicUDPLITETest.testRecvFromc                 C   rf  r   rg  rF   r   r   r   rJ  $
  r   zBasicUDPLITETest._testRecvFromc                 C   rl  rm  rn  rF   r   r   r   ro  '
  r3  z%BasicUDPLITETest.testRecvFromNegativec                 C   rf  r   rg  rF   r   r   r   rp  +
  r   z&BasicUDPLITETest._testRecvFromNegativeNr   rq  r   r   r   r   rr  
  s    
rr  c                       s   e Zd ZejZ fddZdd ZdZdd Z	dd	 Z
d
d Zdd ZdZdD ]
ZeeeedO Zq'dZdZdZdddZ  ZS )SendrecvmsgBasec                    s   t  | _t   d S r8   )rY   r   
misc_eventrW   rH   rF   r_   r   r   rH   P
  r   zSendrecvmsgBase.setUpc                 C   s   | j |S r8   )cli_sockr   r   r   r   r   sendToServerT
  s   zSendrecvmsgBase.sendToServerr   c                 G   s   | j j|| jt|d    S r8   )ru  r  sendmsg_to_server_defaultsr(  rG   r]   r   r   r   sendmsgToServer\
  s   zSendrecvmsgBase.sendmsgToServerc                 G   s    |j |g|R  }| | |S r8   )r  registerRecvmsgResult)rG   r  rr   r]   resultr   r   r   	doRecvmsgd
  s   
zSendrecvmsgBase.doRecvmsgc                 C   r   r8   r   rG   r{  r   r   r   rz  n
  s   z%SendrecvmsgBase.registerRecvmsgResultc                 C   s   |  || d S r8   r   rG   Zaddr1Zaddr2r   r   r   checkRecvmsgAddresst
     z#SendrecvmsgBase.checkRecvmsgAddressr   )
MSG_CTRUNCMSG_OOBNc           
      C   s   | j }| j}|r|| jO }|| jO }n|d ur!|| jO }|| jO }|| M }|| M }||O }||O }||@ | @ }|rCtd|||B | @ }	| ||	@ ||	@  d S )Nz6contradictory set, unset requirements for flags {0:#x})msg_flags_common_setmsg_flags_common_unsetmsg_flags_eor_indicatormsg_flags_non_eor_indicator	Exceptionr@  r   )
rG   r$  eorcheckset
checkunsetignoreZ
defaultsetZdefaultunsetZinbothr  r   r   r   
checkFlags
  s&   




zSendrecvmsgBase.checkFlags)Nr   r   r   )rN   rO   rP   r   LOOPBACK_TIMEOUTfail_timeoutrH   rv  rw  ry  r|  rz  r  r  r1  r   r   r  r  r  r  rg   r   r   r_   r   rs  I
  s     
rs  c                   @   rS   )RecvmsgIntoMixinc                 G   sh   t |}|j|gg|R  }| | | |d d | |d | t|d |d  f|dd   S r<  )r  recvmsg_intorz  assertGreaterEqualassertLessEqualr  )rG   r  rr   r]   bufr{  r   r   r   r|  
  s   
"zRecvmsgIntoMixin.doRecvmsgN)rN   rO   rP   r|  r   r   r   r   r  
      r  c                           e Zd Ze fddZ  ZS )SendrecvmsgDgramFlagsBasec                       t  jtjB S r8   )rW   r  r   	MSG_TRUNCrF   r_   r   r   r  
     z5SendrecvmsgDgramFlagsBase.msg_flags_non_eor_indicator)rN   rO   rP   propertyr  rg   r   r   r_   r   r  
      r  c                       r  )SendrecvmsgSCTPFlagsBasec                    r  r8   )rW   r  r   MSG_EORrF   r_   r   r   r  
  r  z0SendrecvmsgSCTPFlagsBase.msg_flags_eor_indicator)rN   rO   rP   r  r  rg   r   r   r_   r   r  
  r  r  c                   @   s8   e Zd Zedd Zedd Zedd Zdd Zd	S )
SendrecvmsgConnectionlessBasec                 C   r  r8   )rB   rF   r   r   r   	serv_sock
     z'SendrecvmsgConnectionlessBase.serv_sockc                 C   r  r8   )r   rF   r   r   r   ru  
  r  z&SendrecvmsgConnectionlessBase.cli_sockc                 C   s   g g d| j fS r   )r   rF   r   r   r   rw  
  r  z8SendrecvmsgConnectionlessBase.sendmsg_to_server_defaultsc                 C   s   | j || jS r8   )ru  rd  r   r   r   r   r   rv  
  r  z*SendrecvmsgConnectionlessBase.sendToServerN)rN   rO   rP   r  r  ru  rw  rv  r   r   r   r   r  
  s    


r  c                   @   s,   e Zd Zedd Zedd Zdd ZdS )SendrecvmsgConnectedBasec                 C   r  r8   )r   rF   r   r   r   r  
  r  z"SendrecvmsgConnectedBase.serv_sockc                 C   r  r8   )r   rF   r   r   r   ru  
  r  z!SendrecvmsgConnectedBase.cli_sockc                 C   r   r8   r   r  r   r   r   r  
     z,SendrecvmsgConnectedBase.checkRecvmsgAddressN)rN   rO   rP   r  r  ru  r  r   r   r   r   r  
  s    

r  c                          e Zd Z fddZ  ZS )SendrecvmsgServerTimeoutBasec                       t    | j| j d S r8   )rW   rH   r  r  r  rF   r_   r   r   rH        
z"SendrecvmsgServerTimeoutBase.setUp)rN   rO   rP   rH   rg   r   r   r_   r   r    s    r  c                   @   s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zeeddd Zejd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*S )+SendmsgTestsc                 C      |  | jttt d S r8   r   r  r   r(  r   rF   r   r   r   testSendmsg     zSendmsgTests.testSendmsgc                 C   s   |  | tgtt d S r8   r   ry  r   r(  rF   r   r   r   _testSendmsg     zSendmsgTests._testSendmsgc                 C   r  r8   r  rF   r   r   r   testSendmsgDataGenerator  r  z%SendmsgTests.testSendmsgDataGeneratorc                 C   s&   |  | dd tfD tt d S )Nc                 s   r6  r8   r   r>  r   r   r   r7    r8  z9SendmsgTests._testSendmsgDataGenerator.<locals>.<genexpr>r  rF   r   r   r   _testSendmsgDataGenerator  s   z&SendmsgTests._testSendmsgDataGeneratorc                 C   r  r8   r  rF   r   r   r   testSendmsgAncillaryGenerator   r  z*SendmsgTests.testSendmsgAncillaryGeneratorc                 C   s(   |  | tgdd dD tt d S )Nc                 s   r6  r8   r   r>  r   r   r   r7  %  r8  z>SendmsgTests._testSendmsgAncillaryGenerator.<locals>.<genexpr>r   r  rF   r   r   r   _testSendmsgAncillaryGenerator$  s   z+SendmsgTests._testSendmsgAncillaryGeneratorc                 C   r  r8   r  rF   r   r   r   testSendmsgArray(  r  zSendmsgTests.testSendmsgArrayc                 C   s$   |  | tdtgtt d S )NB)r   ry  arrayr   r(  rF   r   r   r   _testSendmsgArray,  s   zSendmsgTests._testSendmsgArrayc                 C   r  r8   r  rF   r   r   r   testSendmsgGather0  r  zSendmsgTests.testSendmsgGatherc                 C   .   |  | td d tdd  gtt d S NrB  r  rF   r   r   r   _testSendmsgGather4  s   .zSendmsgTests._testSendmsgGatherc                 C      |  | jdd d S Nr     doner   r  r   rF   r   r   r   testSendmsgBadArgs7     zSendmsgTests.testSendmsgBadArgsc                 C   s   |  t| jj |  t| jd |  t| jt  |  t| jt g |  t| jtt g |  t| jtgt  |  t| jtgg t  |  t| jtgg dt  | d d S )Ns   not in an iterabler   r  )r\  r   ru  r  ry  objectr   rv  rF   r   r   r   _testSendmsgBadArgs;  s.   







z SendmsgTests._testSendmsgBadArgsc                 C   r  r  r  rF   r   r   r   testSendmsgBadCmsgM  r  zSendmsgTests.testSendmsgBadCmsgc                 C   s   |  t| jtgt g |  t| jtgt ddfg |  t| jtgdt dfg |  t| jtgddt fg |  t| jtgdg |  t| jtgdg | d d S )Nr      data)r   r   )r   r   r  r}  r  r\  r   ry  r   r  rv  rF   r   r   r   _testSendmsgBadCmsgQ  s&   






z SendmsgTests._testSendmsgBadCmsg
CMSG_SPACEc                 C   r  r  r  rF   r   r   r   testSendmsgBadMultiCmsg`  s   z$SendmsgTests.testSendmsgBadMultiCmsgc                 C   s@   |  t| jtgg d |  t| jtgdt g | d d S )Nr   r   rM  r  r  rF   r   r   r   _testSendmsgBadMultiCmsgf  s   


z%SendmsgTests._testSendmsgBadMultiCmsgc                 C   r  r  r  rF   r   r   r   testSendmsgExcessCmsgRejectn     z(SendmsgTests.testSendmsgExcessCmsgRejectc                 C   sb   t tds*| t}| tgddg W d    n1 sw   Y  | |jj | 	d d S )Nr  r  r  )
r   r   r\  r   ry  r   assertIsNonere  r  rv  rG   rf  r   r   r   _testSendmsgExcessCmsgRejects  s   
z)SendmsgTests._testSendmsgExcessCmsgRejectc                 C   r   r8   r   rF   r   r   r   testSendmsgAfterClose{  s   z"SendmsgTests.testSendmsgAfterClosec                 C   s    | j   | t| jtg d S r8   )ru  r   r\  r   ry  r   rF   r   r   r   _testSendmsgAfterClose  s   
z#SendmsgTests._testSendmsgAfterCloseN)rN   rO   rP   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r;  r   r  r'  r  r  r  r  r  r   r   r   r   r    s.    

r  c                   @   sR   e Zd Zdd Zdd Zdd Zdd Zeej	d	vd
dd Z
e
jdd ZdS )SendmsgStreamTestsc                 C   r  r8   r  rF   r   r   r   testSendmsgExplicitNoneAddr  r  z.SendmsgStreamTests.testSendmsgExplicitNoneAddrc                 C   s"   |  | tgg dd tt d S r   r  rF   r   r   r   _testSendmsgExplicitNoneAddr  s   "z/SendmsgStreamTests._testSendmsgExplicitNoneAddrc                 C   .   |  | jdd | | jj| jd d S Nr     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaar;   r   r  r   rE  rt  r   r  rF   r   r   r   testSendmsgTimeout  s   z%SendmsgStreamTests.testSendmsgTimeoutc              
   C   s   z@| j d z	 | dg q	 ty   Y n ty0 } z|jtjkr& W Y d }~nd }~ww W | j	  d S W | j	  d S | j	  w )NQ?Tr  TimeoutError not raised)
ru  r  ry  rD  r   r  ENOMEMrX  rt  r~   r   r   r   r   _testSendmsgTimeout  s$   	z&SendmsgStreamTests._testSendmsgTimeout>   r  z<MSG_DONTWAIT not known to work on this platform when sendingc                 C   r  r  r  rF   r   r   r   testSendmsgDontWait  s   z&SendmsgStreamTests.testSendmsgDontWaitc                 C   sl   z/|  t}	 | dgg tj q1 sw   Y  | |jjtjtj	tj
f W | j  d S | j  w )NTr  )r\  r   ry  r   MSG_DONTWAITrM  re  r  EAGAINEWOULDBLOCKr  rt  r~   r  r   r   r   _testSendmsgDontWait  s   
z'SendmsgStreamTests._testSendmsgDontWaitN)rN   rO   rP   r  r  r  r  r.  r  r  r  r'  r  r   r   r   r   r    s    

r  c                   @   r?   )SendmsgConnectionlessTestsc                 C   r   r8   r   rF   r   r   r   testSendmsgNoDestAddr  r  z0SendmsgConnectionlessTests.testSendmsgNoDestAddrc                 C   s2   |  t| jjtg |  t| jjtgg dd  d S r   )r\  r   ru  r  r   rF   r   r   r   _testSendmsgNoDestAddr  s   
z1SendmsgConnectionlessTests._testSendmsgNoDestAddrN)rN   rO   rP   r  r  r   r   r   r   r    s    r  c                   @   s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zeed!d"d# Zejd$d% Zeejd&d'd( Zejd)d* Zd+S ),RecvmsgGenericTestsc                 C   sR   |  | jtt\}}}}| |t | || j | |g  | j|dd d S NTr  r|  r  r(  r   r   r  r   r  rG   r   r  r$  r   r   r   r   testRecvmsg  s
   zRecvmsgGenericTests.testRecvmsgc                 C      |  t d S r8   rv  r   rF   r   r   r   _testRecvmsg  rL  z RecvmsgGenericTests._testRecvmsgc                 C   sV   |  | jttdd\}}}}| |t | || j | |g  | j|dd d S )Nr   Tr  r  r  r   r   r   testRecvmsgExplicitDefaults     
z/RecvmsgGenericTests.testRecvmsgExplicitDefaultsc                 C   r  r8   r  rF   r   r   r   _testRecvmsgExplicitDefaults  rL  z0RecvmsgGenericTests._testRecvmsgExplicitDefaultsc                 C   sV   |  | jttd \}}}}| |t | || j | |g  | j|dd d S )Nr}  Tr  r  r  r   r   r   testRecvmsgShorter  r  z&RecvmsgGenericTests.testRecvmsgShorterc                 C   r  r8   r  rF   r   r   r   _testRecvmsgShorter  rL  z'RecvmsgGenericTests._testRecvmsgShorterc                 C   s^   |  | jttd \}}}}| |td d  | || j | |g  | j|dd d S )NrB  Fr  r  r  r   r   r   testRecvmsgTrunc  s   
z$RecvmsgGenericTests.testRecvmsgTruncc                 C   r  r8   r  rF   r   r   r   _testRecvmsgTrunc  rL  z%RecvmsgGenericTests._testRecvmsgTruncc                 C   T   |  | jttd\}}}}| |t | || j | |g  | j|dd d S )Nr   Tr  r  r  r   r   r   testRecvmsgShortAncillaryBuf     z0RecvmsgGenericTests.testRecvmsgShortAncillaryBufc                 C   r  r8   r  rF   r   r   r   _testRecvmsgShortAncillaryBuf  rL  z1RecvmsgGenericTests._testRecvmsgShortAncillaryBufc                 C   r  )N (  Tr  r  r  r   r   r   testRecvmsgLongAncillaryBuf  r  z/RecvmsgGenericTests.testRecvmsgLongAncillaryBufc                 C   r  r8   r  rF   r   r   r   _testRecvmsgLongAncillaryBuf  rL  z0RecvmsgGenericTests._testRecvmsgLongAncillaryBufc                 C   s"   | j   | t| j| j d d S r   )r  r   r\  r   r|  rF   r   r   r   testRecvmsgAfterClose  s   
z)RecvmsgGenericTests.testRecvmsgAfterClosec                 C   r   r8   r   rF   r   r   r   _testRecvmsgAfterClose"  r   z*RecvmsgGenericTests._testRecvmsgAfterClosec                 C   sB   z| j d | t| j| j tt W | j  d S | j  w )Nr  )	r  r  r\  rD  r|  r(  r   rt  r~   rF   r   r   r   testRecvmsgTimeout%  s   z&RecvmsgGenericTests.testRecvmsgTimeoutc                 C   s   |  | jj| jd d S Nr  )rE  rt  r   r  rF   r   r   r   _testRecvmsgTimeout.  r   z'RecvmsgGenericTests._testRecvmsgTimeoutr  c                 C   s  |  | jttd dtj\}}}}| |td d  | || j | |g  | j	|dt
tddd |  | jttdtj\}}}}| |t | || j | |g  | j	|dd |  | jtt\}}}}| |t | || j | |g  | j	|dd d S )	NrB  r   r  Fr  r  r  Tr  )r|  r  r(  r   r   r  r   r  r   r  r   r  r   r   r   testRecvmsgPeek1  s.   
z#RecvmsgGenericTests.testRecvmsgPeekc                 C   r  r8   r  rF   r   r   r   _testRecvmsgPeekT  r  z$RecvmsgGenericTests._testRecvmsgPeekr  c                 C   s`   | j | j | | j tt\}}}}| |t | || j | |g  | j	|dd d S r  )
r  r  r  r|  r(  r   r   r  r   r  r  r   r   r   testRecvmsgFromSendmsgX  s   z*RecvmsgGenericTests.testRecvmsgFromSendmsgc                 C   r  r  r  rF   r   r   r   _testRecvmsgFromSendmsgc  s   .z+RecvmsgGenericTests._testRecvmsgFromSendmsgN)rN   rO   rP   r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r;  r   r  r'  r  r  r	  r   r   r   r   r    s2    						
"



r  c                   @   r*  )
RecvmsgGenericStreamTestsc                 C   sN   |  | jd\}}}}| |d | || j | |g  | j|d d d S )Nr   rM  r  )r|  r  r   r  r   r  r  r   r   r   testRecvmsgEOFl  s
   z(RecvmsgGenericStreamTests.testRecvmsgEOFc                 C      | j   d S r8   )ru  r   rF   r   r   r   _testRecvmsgEOFt  rL  z)RecvmsgGenericStreamTests._testRecvmsgEOFc                 C   s   |  | jttd \}}}}| || j | |g  | j|dd |  | jd\}}}}| || j | |g  | j|dd || }| |t d S )NrB  Fr  r   T)r|  r  r(  r   r  r   r   r  )rG   rC  r  r$  r   rD  r   r   r   r   testRecvmsgOverfloww  s   
z-RecvmsgGenericStreamTests.testRecvmsgOverflowc                 C   r  r8   r  rF   r   r   r   _testRecvmsgOverflow  rL  z.RecvmsgGenericStreamTests._testRecvmsgOverflowN)rN   rO   rP   r  r  r  r  r   r   r   r   r
  h  s
    r
  c                   @   r?   )RecvmsgTestsc                 C   s   |  t| jj |  t| jjddd |  t| jjttdd |  t| jjtdgdd |  t| jjt dd |  t| jjttt d |  t| jjttdt  | jttdd\}}}}| 	|t | 
|| j | 	|g  | j|dd d S )Nr  r   r  Tr  )r\  r   r  r  r  r(  r   r  r  r   r  r   r  r  r   r   r   testRecvmsgBadArgs  s0   
zRecvmsgTests.testRecvmsgBadArgsc                 C   r  r8   r  rF   r   r   r   _testRecvmsgBadArgs  rL  z RecvmsgTests._testRecvmsgBadArgsN)rN   rO   rP   r  r  r   r   r   r   r    s    r  c                   @   sL   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dS )RecvmsgIntoTestsc                 C   sL  t tt}| t| jj | t| jjttdd | t| jj|dd | t| jjt gdd | t| jjdgdd | t| jj|t gdd | t| jj|gdd | t| jj|gt d | t| jj|gdt  | j|gdd\}}}}| 	|tt | 	|t t | 
|| j | 	|g  | j|dd d S )Nr   s   I'm not writabler  Tr  )r  r(  r   r\  r   r  r  r  r  r   r  r   r  rG   r  nbytesr  r$  r   r   r   r   testRecvmsgIntoBadArgs  s@   



z'RecvmsgIntoTests.testRecvmsgIntoBadArgsc                 C   r  r8   r  rF   r   r   r   _testRecvmsgIntoBadArgs  rL  z(RecvmsgIntoTests._testRecvmsgIntoBadArgsc                 C   sx   t tt}| jdd |fD \}}}}| |tt | |t t | || j | |g  | j|dd d S )Nc                 s   r6  r8   r   r>  r   r   r   r7    r8  z<RecvmsgIntoTests.testRecvmsgIntoGenerator.<locals>.<genexpr>Tr  )	r  r(  r   r  r  r   r  r   r  r  r   r   r   testRecvmsgIntoGenerator  s   z)RecvmsgIntoTests.testRecvmsgIntoGeneratorc                 C   r  r8   r  rF   r   r   r   _testRecvmsgIntoGenerator  rL  z*RecvmsgIntoTests._testRecvmsgIntoGeneratorc                 C   sx   t  ddgtt }| j|g\}}}}| |tt | | t | || j | |g  | j	|dd d S )Nr  r   Tr  )
r  r(  r   r  r  r   tobytesr  r   r  r  r   r   r   testRecvmsgIntoArray  s   z%RecvmsgIntoTests.testRecvmsgIntoArrayc                 C   r  r8   r  rF   r   r   r   _testRecvmsgIntoArray  rL  z&RecvmsgIntoTests._testRecvmsgIntoArrayc                 C   s   t d}t d}t d}| j|t|dd |g\}}}}| |td | |t d | |t d | |t d	 | || j | |g  | j|d
d d S )Ns   ----s
   0123456789s   --------------r   	      Mary had a little lambs   Marys
   01 had a 9s   little lamb---Tr  )	r  r  r  
memoryviewr   r(  r  r   r  )rG   b1b2Zb3r  r  r$  r   r   r   r   testRecvmsgIntoScatter  s   z'RecvmsgIntoTests.testRecvmsgIntoScatterc                 C   rH  )Nr  )rv  rF   r   r   r   _testRecvmsgIntoScatter  rL  z(RecvmsgIntoTests._testRecvmsgIntoScatterN)rN   rO   rP   r  r  r  r  r  r  r"  r#  r   r   r   r   r    s    
r  c                   @   s`   e Zd ZzddlZW n ey   dZY nw edejZee	ddd Z
ee	ddd	 ZdS )
CmsgMacroTestsr   NiCMSG_LENc                 C   s   | j td d }ttdtt|d | }| tdtdjd  |D ]}t|}| |td | | 	|| j  q*| 
ttjd | 
ttj| | 
ttjtj d S )Nr   r     r>   r   r  )socklen_t_limitr   r%  listrh  r  r  itemsizer   r  r\  r  r  maxsize)rG   toobigr  nr2   r   r   r   testCMSG_LEN  s   
zCmsgMacroTests.testCMSG_LENr  c                 C   s   | j td d }ttdtt|d | }td}| |tdjd  |D ]*}t|}| || | |t	| | ||t	d  | 
|| j  |}q,| ttjd | ttj| | ttjtj d S )Nr   r&  r   r>   r   r  )r'  r   r  r(  rh  r  r  r)  r  r%  r  r\  r  r  r*  )rG   r+  r  Zlastr,  r2   r   r   r   testCMSG_SPACE  s   

zCmsgMacroTests.testCMSG_SPACE)rN   rO   rP   r  r  r'  minr  r;  r   r-  r.  r   r   r   r   r$    s    
r$  c                   @   sH  e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZddddZ	dd Z
dd Zdd Zdd Zeeddd Zejdd Zdd Zdd  Zeejd!kd"eed#eedd$d% Zejeejd!kd"eed#d&d' Zeejd!kd"eed#eedd(d) Zejeejd!kd"eed#d*d+ Zd,d- Zeejd!kd.d/d0 Zd1d2 Z d3d4 Z!d5d6 Z"eedd7d8 Z#e#jd9d: Z$ded;d<Z%d=d> Z&d?d@ Z'dAdB Z(dCdD Z)dEdF Z*dGdH Z+dIdJ Z,dKdL Z-dMdN Z.dOdP Z/dedQdRZ0dSdT Z1dUdV Z2dWdX Z3dYdZ Z4d[d\ Z5d]d^ Z6d_d` Z7dadb Z8dcS )fSCMRightsTestic                 C   s\   g }t |D ]%}t \}}| tj| | tj| t|t|	  |
| q|S r8   )rh  r   mkstemprc   r   r  r   writer<  encodeappend)rG   r,  fdsr>   r  r  r   r   r   newFDs;  s   zSCMRightsTest.newFDsc                 C   sB   t |D ]\}}t|dtj | t|dt|  qd S )Nr   r   )	enumerater   lseekSEEK_SETr   rO  r<  r3  )rG   r5  r,  r  r   r   r   checkFDsG  s   zSCMRightsTest.checkFDsc                 C   s   |  | j| d S r8   )rc   closeRecvmsgFDsr}  r   r   r   rz  N  r   z#SCMRightsTest.registerRecvmsgResultc                 C   sn   |d D ]0\}}}|t jkr4|t jkr4td}||d t|t||j    |D ]}t| q,qd S )Nr   r>   )	r   rj  
SCM_RIGHTSr  	frombytesr(  r)  r   r   )rG   Zrecvmsg_result
cmsg_level	cmsg_type	cmsg_datar5  r  r   r   r   r;  Q  s   

zSCMRightsTest.closeRecvmsgFDsc                 C   s8   |  | tgtjtjtd| |fgtt d S )Nr>   )	r   ry  r   r   rj  r<  r  r6  r(  )rG   r,  r   r   r   createAndSendFDs]  s   zSCMRightsTest.createAndSendFDsr   r   c                 C   s   |\}}}}|  |t | || j | j|dtj|d | |t | 	t
|| td}	|D ]0}
| |
t |
\}}}|  |tj |  |tj | |t |  t
|t d |	| q2|  t
|	| | |	 d S )NTr  r  r  r>   r   )r   r   r  r   r  r   r  rG  r(  r  r(  r  tuplerj  r<  r  
SIZEOF_INTr=  r:  )rG   Znumfdsr{  maxcmsgsignoreflagsr   r  r$  r   r5  itemr>  r?  r@  r   r   r   checkRecvmsgFDsg  s&   

zSCMRightsTest.checkRecvmsgFDsc                 C       |  d| | jttd d S )Nr   r  rH  r|  r  r(  r   rF   r   r   r   testFDPassSimple     
zSCMRightsTest.testFDPassSimplec                 C   s<   |  | tgtjtjtd| d fgt	t d S )Nr>   r   )
r   ry  r   r   rj  r<  r  r6  r  r(  rF   r   r   r   _testFDPassSimple  s   zSCMRightsTest._testFDPassSimplec                 C   rI  )Nrc  r  rJ  rF   r   r   r   testMultipleFDPass  rL  z SCMRightsTest.testMultipleFDPassc                 C   rH  Nrc  rA  rF   r   r   r   _testMultipleFDPass  rL  z!SCMRightsTest._testMultipleFDPassr  c                 C   s*   |  d| | jtttdt  d S rO  )rH  r|  r  r(  r   r   r  rD  rF   r   r   r   testFDPassCMSG_SPACE  s
   z"SCMRightsTest.testFDPassCMSG_SPACEc                 C   rH  rO  rP  rF   r   r   r   _testFDPassCMSG_SPACE  r  z#SCMRightsTest._testFDPassCMSG_SPACEc              
   C   s0   | j d| | jtttdt tjd d S )Nr   rc  rF  )	rH  r|  r  r(  r   r   r%  rD  r  rF   r   r   r   testFDPassCMSG_LEN  s   
z SCMRightsTest.testFDPassCMSG_LENc                 C   rH  r  rP  rF   r   r   r   _testFDPassCMSG_LEN  rL  z!SCMRightsTest._testFDPassCMSG_LENru  zskipping, see issue #12958zskipping, see issue #22397c                 C   s$   | j d| | jttddd d S )Nr   r  )rE  rJ  rF   r   r   r   testFDPassSeparate  s   
z SCMRightsTest.testFDPassSeparatec                 C   X   |  d\}}| | tgtjtjtd|gftjtjtd|gfgtt d S Nr   r>   	r6  r   ry  r   r   rj  r<  r  r(  rG   Zfd0fd1r   r   r   _testFDPassSeparate     z!SCMRightsTest._testFDPassSeparatec                 C   s@   d}| j || | jtttttt|  dtj	d d S )Nr   )rE  rF  )
rH  r|  r  r(  r   r   r  rD  r%  r  )rG   Znum_fdsr   r   r   testFDPassSeparateMinSpace  s   
z(SCMRightsTest.testFDPassSeparateMinSpacec                 C   rX  rY  rZ  r[  r   r   r   _testFDPassSeparateMinSpace  r^  z)SCMRightsTest._testFDPassSeparateMinSpacec              
   C   sf   z	|  |g|}W n ty( } z| |jt |  |g}W Y d }~nd }~ww | |t| d S r8   )ry  r   rG  r  r  r   r(  )rG   r   r  r  r   r   r   r   sendAncillaryIfPossible  s   z%SCMRightsTest.sendAncillaryIfPossiblezsee issue #24725c                 C   s&   | j d| | jttdtjd d S )Nr   r  rT  )rH  r|  r  r(  r   r   r  rF   r   r   r   testFDPassEmpty  s
   
zSCMRightsTest.testFDPassEmptyc                 C   s   |  ttjtjdfg d S NrM  )ra  r   r   rj  r<  rF   r   r   r   _testFDPassEmpty  s   
zSCMRightsTest._testFDPassEmptyc                 C   s   |  | jttd\}}}}| |t | || j | j|dtj	d | 
t|d |D ]\}}}| |tj | |tj | t|t q.d S )Nr  Tr  r   )r|  r  r(  r   r   r  r   r  r   r  r  rj  r<  
assertLessrD  rG   r   r  r$  r   r>  r?  r@  r   r   r   testFDPassPartialInt  s   z"SCMRightsTest.testFDPassPartialIntc              	   C   s4   |  ttjtjtd| jg d d fg d S )Nr>   r  )ra  r   r   rj  r<  r  badfdr  rF   r   r   r   _testFDPassPartialInt  s   z#SCMRightsTest._testFDPassPartialIntc           	      C   s   |  | jttd\}}}}| |t | || j | j|dtj	d | 
t|d td}|D ]%\}}}| |tj | |tj ||d t|t||j    q3| 
t|d | | d S )Nr  Tr  r   r>   )r|  r  r(  r   r   r  r   r  r   r  r  r  rj  r<  r=  r)  r:  )	rG   r   r  r$  r   r5  r>  r?  r@  r   r   r   testFDPassPartialIntInMiddle  s    

z*SCMRightsTest.testFDPassPartialIntInMiddlec              
   C   sZ   |  d\}}| ttjtjtd|| jg d d ftjtjtd|gfg d S )Nr   r>   r  )	r6  ra  r   r   rj  r<  r  rh  r  r[  r   r   r   _testFDPassPartialIntInMiddle"  s   z+SCMRightsTest._testFDPassPartialIntInMiddlec                 C   sJ   |\}}}}|  |t | || j |  |g  | j|dtj|d d S )NTr  r  r  )r   r   r  r   r  r   r  )rG   r{  rF  r   r  r$  r   r   r   r   checkTruncatedHeader.  s   
z"SCMRightsTest.checkTruncatedHeaderc                 C   s"   | j | | jtttjd d S NrT  rm  r|  r  r(  r   r   r  rF   r   r   r   testCmsgTruncNoBufSize8  s   
z$SCMRightsTest.testCmsgTruncNoBufSizec                 C   rH  r  rP  rF   r   r   r   _testCmsgTruncNoBufSizeA  rL  z%SCMRightsTest._testCmsgTruncNoBufSizec                 C   s$   | j | | jttdtjd d S )Nr   rT  ro  rF   r   r   r   testCmsgTrunc0D  s   
zSCMRightsTest.testCmsgTrunc0c                 C   rH  r  rP  rF   r   r   r   _testCmsgTrunc0I  rL  zSCMRightsTest._testCmsgTrunc0c                 C   s   |  | | jttd d S r  )rm  r|  r  r(  r   rF   r   r   r   testCmsgTrunc1O  s   zSCMRightsTest.testCmsgTrunc1c                 C   rH  r  rP  rF   r   r   r   _testCmsgTrunc1R  rL  zSCMRightsTest._testCmsgTrunc1c                 C   s"   |  | | jtttd  d S r0  )rm  r|  r  r(  r   rD  rF   r   r   r   testCmsgTrunc2IntU  s   
zSCMRightsTest.testCmsgTrunc2Intc                 C   rH  r  rP  rF   r   r   r   _testCmsgTrunc2Int\  rL  z SCMRightsTest._testCmsgTrunc2Intc              	   C   s(   |  | | jtttdd  d S r<  )rm  r|  r  r(  r   r   r%  rF   r   r   r   testCmsgTruncLen0Minus1_  s   
z%SCMRightsTest.testCmsgTruncLen0Minus1c                 C   rH  r  rP  rF   r   r   r   _testCmsgTruncLen0Minus1c  rL  z&SCMRightsTest._testCmsgTruncLen0Minus1c                 C   s   |  | jtt|\}}}}| |t | || j | j|dtj	d |dkr.|g kr.d S | t|d |d \}}	}
| |tj
 | |	tj | t|
| | t|
| td}||
d t|
t|
|j    | | d S )NTr  r  r   r   r>   )r|  r  r(  r   r   r  r   r  r   r  rj  r<  r  r  r  r=  r)  r:  )rG   ancbufmaxdataZmindatar   r  r$  r   r>  r?  r@  r5  r   r   r   checkTruncatedArrayi  s&   
z!SCMRightsTest.checkTruncatedArrayc                 C   s   | j tddd d S )Nr   r{  r|  r}  r   r%  rF   r   r   r   testCmsgTruncLen0     zSCMRightsTest.testCmsgTruncLen0c                 C   rH  r  rP  rF   r   r   r   _testCmsgTruncLen0  rL  z SCMRightsTest._testCmsgTruncLen0c                 C   s   | j tdd dd d S )Nr   r   r~  r  rF   r   r   r   testCmsgTruncLen0Plus1  r  z$SCMRightsTest.testCmsgTruncLen0Plus1c                 C   rH  r0  rP  rF   r   r   r   _testCmsgTruncLen0Plus1  rL  z%SCMRightsTest._testCmsgTruncLen0Plus1c                 C   s   | j tttd d S )Nr~  r}  r   r%  rD  rF   r   r   r   testCmsgTruncLen1  s   
zSCMRightsTest.testCmsgTruncLen1c                 C   rH  r0  rP  rF   r   r   r   _testCmsgTruncLen1  rL  z SCMRightsTest._testCmsgTruncLen1c                 C   s(   | j tdt d dt d d d S )Nr   r   r~  r  rF   r   r   r   testCmsgTruncLen2Minus1  s   

z%SCMRightsTest.testCmsgTruncLen2Minus1c                 C   rH  r0  rP  rF   r   r   r   _testCmsgTruncLen2Minus1  rL  z&SCMRightsTest._testCmsgTruncLen2Minus1N)r   r   r   )9rN   rO   rP   rh  r6  r:  rz  r;  rA  rH  rK  rM  rN  rQ  r;  r   rR  r'  rS  rU  rV  r   r  r  r  r	   rW  r]  r_  r`  ra  rb  rd  rg  ri  rj  rk  rm  rp  rq  rr  rs  rt  ru  rv  rw  rx  ry  r}  r  r  r  r  r  r  r  r  r   r   r   r   r0  3  s    

	












	
r0  c                   @   s  e Zd ZdZdZdd Zd^ddZeed	d
dd Z	e	j
dd Zeedd	d
dd Zej
dd Zeejdeed	d
dd Zej
dd Z		d^ddZeed	d
dddd Zej
dd  Zeedd	d
ddd!d" Zej
d#d$ Zeejdeedd	d
ddd%d& Zej
d'd( Zeejdeedd	d
ddd)d* Zej
d+d, Zd_d-d.Zeed	d
d/d0 Zej
d1d2 Zeed	d
d3d4 Zej
d5d6 Zeed	d
d7d8 Zej
d9d: Zeed	d
d;d< Z e j
d=d> Z!eed	d
d?d@ Z"e"j
dAdB Z#eed	d
dCdD Z$e$j
dEdF Z%d_dGdHZ&eedd	d
dddIdJ Z'e'j
dKdL Z(eedd	d
dddMdN Z)e)j
dOdP Z*eedd	d
dddQdR Z+e+j
dSdT Z,eedd	d
dddUdV Z-e-j
dWdX Z.eedd	d
dddYdZ Z/e/j
d[d\ Z0d]S )`RFC3542AncillaryTestr   r  c                 C   s4   i }|D ]\}}}|  ||f| ||||f< q|S r8   )rP  )rG   r  dr>  r?  r@  r   r   r   ancillaryMapping  s
   z%RFC3542AncillaryTest.ancillaryMappingr  r   c                 C   s  | j tjtjd | j  | | j tt	|\}}}}| 
|t	 | || j | j|dtj|d | 
t|d | |d t |d \}}	}
| 
|tj | 
|	tj | |
t | 
t|
t td}||
 | |d d | |d | d S )Nr   TrB  r   r>   )r  r  r   ro  r{  rt  r~   r|  r(  r   r   r  r   r  r  rG  rC  r}  r  rD  r  r=  r  r  )rG   
ancbufsizemaxhoprF  r   r  r$  r   r>  r?  r@  r  r   r   r   checkHopLimit  s.   



z"RFC3542AncillaryTest.checkHopLimitr{  r}  c                 C      | j dd d S Nr  r  )r  rF   r   r   r   testRecvHopLimit  r  z%RFC3542AncillaryTest.testRecvHopLimitc                 C   $   |  | jj| jd | t d S r  rE  rt  r   r  rv  r   rF   r   r   r   _testRecvHopLimit  s   z&RFC3542AncillaryTest._testRecvHopLimitr  c                 C   s   | j ttd d S )Nr  )r  r   r  rD  rF   r   r   r   testRecvHopLimitCMSG_SPACE     z/RFC3542AncillaryTest.testRecvHopLimitCMSG_SPACEc                 C   r  r  r  rF   r   r   r   _testRecvHopLimitCMSG_SPACE     z0RFC3542AncillaryTest._testRecvHopLimitCMSG_SPACEr  c                 C      | j d| jd d S Nr  )r  r  )r  	hop_limitrF   r   r   r   testSetHopLimit  s   z$RFC3542AncillaryTest.testSetHopLimitc                 C   sL   |  | jj| jd | | tgtjtj	t

d| jgfgtt d S Nr  r>   )rE  rt  r   r  r   ry  r   r   ro  r}  r  r  r(  rF   r   r   r   _testSetHopLimit  s   z%RFC3542AncillaryTest._testSetHopLimitc                 C   sB  | j tjtjd | j tjtjd | j  | | j t	t
|\}}}}| |t
 | || j | j|dtj|d | t	|d | |}|tjtjf }	| t	|	t td}
|
|	 | |
d d | |
d d |tjtjf }| t	|t td}
|
| | |
d d | |
d | d S )Nr   TrB  r   r>   r   r  )r  r  r   ro  r{  r  rt  r~   r|  r(  r   r   r  r   r  r  r  r  rD  r  r=  r  r  r}  )rG   r  r  rF  r   r  r$  r   ZancmapZtcdatar  Zhldatar   r   r   checkTrafficClassAndHopLimit  s:   







z1RFC3542AncillaryTest.checkTrafficClassAndHopLimitr  r  c                 C   r  r  )r  rF   r   r   r   testRecvTrafficClassAndHopLimit#  s   z4RFC3542AncillaryTest.testRecvTrafficClassAndHopLimitc                 C   r  r  r  rF   r   r   r    _testRecvTrafficClassAndHopLimit)  r  z5RFC3542AncillaryTest._testRecvTrafficClassAndHopLimitc                 C   s   | j ttd d d S Nr   r  )r  r   r  rD  rF   r   r   r   )testRecvTrafficClassAndHopLimitCMSG_SPACE.  s   
z>RFC3542AncillaryTest.testRecvTrafficClassAndHopLimitCMSG_SPACEc                 C   r  r  r  rF   r   r   r   *_testRecvTrafficClassAndHopLimitCMSG_SPACE6  r  z?RFC3542AncillaryTest._testRecvTrafficClassAndHopLimitCMSG_SPACEc                 C   r  r  r  r  rF   r   r   r   testSetTrafficClassAndHopLimit;  s   
z3RFC3542AncillaryTest.testSetTrafficClassAndHopLimitc                 C   sd   |  | jj| jd | | tgtjtj	t

d| jgftjtjt

d| jgfgtt d S r  )rE  rt  r   r  r   ry  r   r   ro  r  r  traffic_classr}  r  r(  rF   r   r   r   _testSetTrafficClassAndHopLimitD  s   z4RFC3542AncillaryTest._testSetTrafficClassAndHopLimitc                 C   r  r  r  rF   r   r   r   testOddCmsgSizeO  s   
z$RFC3542AncillaryTest.testOddCmsgSizec                 C   s   |  | jj| jd z&| tgtjtjt		d| j
g d ftjtjt		d| jgfg}W d S  tyr } z5| |jt | tgtjtjt		d| j
gftjtjt		d| jgfg}| |tt W Y d }~d S d }~ww )Nr  r>   r  )rE  rt  r   r  ry  r   r   ro  r  r  r  r  r}  r  r   rG  r  r  r   r(  )rG   r  r   r   r   r   _testOddCmsgSizeY  s6   
z%RFC3542AncillaryTest._testOddCmsgSizec                 C   s   | j tjtjd | j  |d u rdn|f}| j| j tt	g|R  \}}}}| 
|t	 | || j | 
|g  | j|dtj|d d S )Nr   r   Trl  )r  r  r   ro  r{  rt  r~   r|  r(  r   r   r  r   r  r  )rG   r  rF  r]   r   r  r$  r   r   r   r   checkHopLimitTruncatedHeadero  s    


z1RFC3542AncillaryTest.checkHopLimitTruncatedHeaderc                 C   s   | j d tjd d S )Nr  rF  r  r   r  rF   r   r   r   rp    s   
z+RFC3542AncillaryTest.testCmsgTruncNoBufSizec                 C   r  r  r  rF   r   r   r   rq    r  z,RFC3542AncillaryTest._testCmsgTruncNoBufSizec                 C   s   | j dtjd d S )Nr   r  r  rF   r   r   r   testSingleCmsgTrunc0  s   
z)RFC3542AncillaryTest.testSingleCmsgTrunc0c                 C   r  r  r  rF   r   r   r   _testSingleCmsgTrunc0  r  z*RFC3542AncillaryTest._testSingleCmsgTrunc0c                 C   r  )Nr   r  )r  rF   r   r   r   testSingleCmsgTrunc1     z)RFC3542AncillaryTest.testSingleCmsgTrunc1c                 C   r  r  r  rF   r   r   r   _testSingleCmsgTrunc1  r  z*RFC3542AncillaryTest._testSingleCmsgTrunc1c                 C   s   | j dt d d S r  )r  rD  rF   r   r   r   testSingleCmsgTrunc2Int     z,RFC3542AncillaryTest.testSingleCmsgTrunc2Intc                 C   r  r  r  rF   r   r   r   _testSingleCmsgTrunc2Int  r  z-RFC3542AncillaryTest._testSingleCmsgTrunc2Intc                 C   s   | j tdd d d S )Nr   r   r  )r  r   r%  rF   r   r   r   testSingleCmsgTruncLen0Minus1     z2RFC3542AncillaryTest.testSingleCmsgTruncLen0Minus1c                 C   r  r  r  rF   r   r   r   _testSingleCmsgTruncLen0Minus1  r  z3RFC3542AncillaryTest._testSingleCmsgTruncLen0Minus1c                 C   s   | j tjtjd | j  | | j tt	t
td \}}}}| |t	 | || j | j|dtjd | t|d |ra|d \}}}| |tj | |tj | t|t d S d S )Nr   Trz  r   )r  r  r   ro  r{  rt  r~   r|  r(  r   r%  rD  r   r  r   r  r  r  r}  re  rf  r   r   r   testSingleCmsgTruncInData  s"   

z.RFC3542AncillaryTest.testSingleCmsgTruncInDatac                 C   r  r  r  rF   r   r   r   _testSingleCmsgTruncInData  r  z/RFC3542AncillaryTest._testSingleCmsgTruncInDatac                 C   s  | j tjtjd | j tjtjd | j  | | j t	t
|\}}}}| |t
 | || j | j|dtj|d | t	|d |d \}}}	| |tj | |tjtjh | t	|	t td}
|
|	 | |
d d | |
d d d S )Nr   Trl  r   r>   r  )r  r  r   ro  r{  r  rt  r~   r|  r(  r   r   r  r   r  r  rM  r  r}  rD  r  r=  r  r  )rG   r  rF  r   r  r$  r   r>  r?  r@  r  r   r   r   checkTruncatedSecondHeader  s0   




z/RFC3542AncillaryTest.checkTruncatedSecondHeaderc                 C   s   | j tttjd d S rn  )r  r   r  rD  r  rF   r   r   r   testSecondCmsgTrunc0  s   
z)RFC3542AncillaryTest.testSecondCmsgTrunc0c                 C   r  r  r  rF   r   r   r   _testSecondCmsgTrunc0  r  z*RFC3542AncillaryTest._testSecondCmsgTrunc0c                 C   s   |  ttd  d S r  r  r   r  rD  rF   r   r   r   testSecondCmsgTrunc1  r  z)RFC3542AncillaryTest.testSecondCmsgTrunc1c                 C   r  r  r  rF   r   r   r   _testSecondCmsgTrunc1  r  z*RFC3542AncillaryTest._testSecondCmsgTrunc1c                 C   s   |  ttdt   d S r0  r  rF   r   r   r   testSecondCmsgTrunc2Int  s   
z,RFC3542AncillaryTest.testSecondCmsgTrunc2Intc                 C   r  r  r  rF   r   r   r   _testSecondCmsgTrunc2Int  r  z-RFC3542AncillaryTest._testSecondCmsgTrunc2Intc                 C   s"   |  tttd d  d S r<  )r  r   r  rD  r%  rF   r   r   r   testSecondCmsgTruncLen0Minus1  s
   
z2RFC3542AncillaryTest.testSecondCmsgTruncLen0Minus1c                 C   r  r  r  rF   r   r   r   _testSecondCmsgTruncLen0Minus1  r  z3RFC3542AncillaryTest._testSecondCmsgTruncLen0Minus1c           
      C   sR  | j tjtjd | j tjtjd | j  | | j t	t
tttt d \}}}}| |t
 | || j | j|dtjd tjtjh}|d\}}}| |tj || | t	|t td}	|	| | |	d d | |	d d |r|d\}}}| |tj || | t	|t | |g  d S )Nr   Trz  r   r>   r  )r  r  r   ro  r{  r  rt  r~   r|  r(  r   r  rD  r%  r   r  r   r  r  r  r}  popremover  r=  r  r  re  )
rG   r   r  r$  r   Z
cmsg_typesr>  r?  r@  r  r   r   r   testSecondCmsgTruncInData#  s:   







z.RFC3542AncillaryTest.testSecondCmsgTruncInDatac                 C   r  r  r  rF   r   r   r   _testSecondCmsgTruncInDataH  r  z/RFC3542AncillaryTest._testSecondCmsgTruncInDataN)r  r   r  )1rN   rO   rP   r  r  r  r  r;  r   r  r'  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rp  rq  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r   r   r    s    







	


$

































 












#r  c                   @      e Zd ZdS )SendrecvmsgUDPTestBaseNrN   rO   rP   r   r   r   r   r  P      r  r  c                   @   r  )SendmsgUDPTestNr  r   r   r   r   r  U      r  r  c                   @   r  )RecvmsgUDPTestNr  r   r   r   r   r  Y  r  r  r  c                   @   r  )RecvmsgIntoUDPTestNr  r   r   r   r   r  ]  r  r  c                   @   rS   )SendrecvmsgUDP6TestBasec                 C       |  |d d |d d  d S rm  r~  r  r   r   r   r  f      z+SendrecvmsgUDP6TestBase.checkRecvmsgAddressNrN   rO   rP   r  r   r   r   r   r  b      r  rs  r  r$   c                   @   r  )SendmsgUDP6TestNr  r   r   r   r   r  k      r  c                   @   r  )RecvmsgUDP6TestNr  r   r   r   r   r  q  r  r  c                   @   r  )RecvmsgIntoUDP6TestNr  r   r   r   r   r  w  r  r  ro  c                   @   r  )RecvmsgRFC3542AncillaryUDP6TestNr  r   r   r   r   r  }      r  c                   @   r  )#RecvmsgIntoRFC3542AncillaryUDP6TestNr  r   r   r   r   r    s    r  c                   @   r  )SendrecvmsgUDPLITETestBaseNr  r   r   r   r   r    s    r  c                   @   r  )SendmsgUDPLITETestNr  r   r   r   r   r    r  r  c                   @   r  )RecvmsgUDPLITETestNr  r   r   r   r   r    r  r  c                   @   r  )RecvmsgIntoUDPLITETestNr  r   r   r   r   r    r  r  c                   @   rS   )SendrecvmsgUDPLITE6TestBasec                 C   r  rm  r~  r  r   r   r   r    r  z/SendrecvmsgUDPLITE6TestBase.checkRecvmsgAddressNr  r   r   r   r   r    s    r  c                   @   r  )SendmsgUDPLITE6TestNr  r   r   r   r   r    r  r  c                   @   r  )RecvmsgUDPLITE6TestNr  r   r   r   r   r    r  r  c                   @   r  )RecvmsgIntoUDPLITE6TestNr  r   r   r   r   r    r  r  c                   @   r  )#RecvmsgRFC3542AncillaryUDPLITE6TestNr  r   r   r   r   r    s    r  c                   @   r  )'RecvmsgIntoRFC3542AncillaryUDPLITE6TestNr  r   r   r   r   r    s    	r  c                   @   r  )SendrecvmsgTCPTestBaseNr  r   r   r   r   r    r  r  c                   @   r  )SendmsgTCPTestNr  r   r   r   r   r    r  r  c                   @   r  )RecvmsgTCPTestNr  r   r   r   r   r    r  r  c                   @   r  )RecvmsgIntoTCPTestNr  r   r   r   r   r    r  r  c                   @   r  )SendrecvmsgSCTPStreamTestBaseNr  r   r   r   r   r    r  r  z6IPPROTO_SCTP: [Errno 62] Protocol not supported on AIXrA   r5   r  c                   @   r  )SendmsgSCTPStreamTestNr  r   r   r   r   r    r  r  c                       r  )RecvmsgSCTPStreamTestc              
      T   z
t t|   W d S  ty) } z|jtjkr | d W Y d }~d S d }~ww Nz4sporadic ENOTCONN (kernel issue?) - see issue #13876)rW   r  r  r   r  ENOTCONNrq   rG   r   r_   r   r   r       z$RecvmsgSCTPStreamTest.testRecvmsgEOFrN   rO   rP   r  rg   r   r   r_   r   r         r  c                       r  )RecvmsgIntoSCTPStreamTestc              
      r  r  )rW   r  r  r   r  r  rq   r  r_   r   r   r    r  z(RecvmsgIntoSCTPStreamTest.testRecvmsgEOFr  r   r   r_   r   r    r  r  c                   @   r  )SendrecvmsgUnixStreamTestBaseNr  r   r   r   r   r    r  r  r  c                   @   r  )SendmsgUnixStreamTestNr  r   r   r   r   r  !  r  r  c                   @   r  )RecvmsgUnixStreamTestNr  r   r   r   r   r  &  r  r  c                   @   r  )RecvmsgIntoUnixStreamTestNr  r   r   r   r   r  ,  r  r  rj  r<  c                   @   r  )RecvmsgSCMRightsStreamTestNr  r   r   r   r   r  2  r  r  c                   @   r  )RecvmsgIntoSCMRightsStreamTestNr  r   r   r   r   r  7  r  r  c                       sL   e Zd Z fddZejZeedrdZ	dd Z
  ZS dZ	dd Z
  ZS )	InterruptedTimeoutBasec                    s2   t    ttjdd }| tjtj| d S )Nc                 S   s   dd S r"  r   )signumr  r   r   r   r"  K  s    z.InterruptedTimeoutBase.setUp.<locals>.<lambda>)rW   rH   r?  r@  rc   )rG   Zorig_alrm_handlerr_   r   r   rH   H  s
   
zInterruptedTimeoutBase.setUp	setitimerg?c                 C   s   t t j| d S r8   )r?  r  ITIMER_REALrG   Zsecondsr   r   r   setAlarmW  r   zInterruptedTimeoutBase.setAlarmr   c                 C   s   t | d S r8   )r?  r6  r  r   r   r   r  ]  rL  )rN   rO   rP   rH   r   r  r;   r   r?  
alarm_timer  rg   r   r   r_   r   r  C  s    
r  siginterruptr6  r  z+Don't have signal.alarm or signal.setitimerc                       sl   e Zd Z fddZdd Zdd Zdd Zd	d
 Zdd Ze	e
j
ddd Ze	e
j
ddd Z  ZS )InterruptedRecvTimeoutTestc                    r  r8   )rW   rH   rB   r  r;   rF   r_   r   r   rH   j  r  z InterruptedRecvTimeoutTest.setUpc              	   O   sr   z2|  | j | t}||i | W d    n1 sw   Y  W |  d d S W |  d d S |  d w r   )r  r  r\  rA  rG   r  r]   r^   rf  r   r   r   checkInterruptedRecvn  s   z/InterruptedRecvTimeoutTest.checkInterruptedRecvc                 C      |  | jjd d S r   )r	  rB   r   rF   r   r   r   testInterruptedRecvTimeoutx  r   z5InterruptedRecvTimeoutTest.testInterruptedRecvTimeoutc                 C      |  | jjtd d S r   )r	  rB   	recv_intor  rF   r   r   r   testInterruptedRecvIntoTimeout{  r  z9InterruptedRecvTimeoutTest.testInterruptedRecvIntoTimeoutc                 C   r
  r   )r	  rB   r  rF   r   r   r   testInterruptedRecvfromTimeout~  r   z9InterruptedRecvTimeoutTest.testInterruptedRecvfromTimeoutc                 C   r  r   )r	  rB   recvfrom_intor  rF   r   r   r   "testInterruptedRecvfromIntoTimeout  r  z=InterruptedRecvTimeoutTest.testInterruptedRecvfromIntoTimeoutr  c                 C   r
  r   )r	  rB   r  rF   r   r   r   testInterruptedRecvmsgTimeout  r  z8InterruptedRecvTimeoutTest.testInterruptedRecvmsgTimeoutr  c                 C   s   |  | jjtdg d S r   )r	  rB   r  r  rF   r   r   r   !testInterruptedRecvmsgIntoTimeout  r  z<InterruptedRecvTimeoutTest.testInterruptedRecvmsgIntoTimeout)rN   rO   rP   rH   r	  r  r  r  r  r;  r   r  r  rg   r   r   r_   r   r  c  s    



r  c                       st   e Zd Z fddZdd Zdd Zeddd	d
 Zedddd Z	edde
ejddd Z  ZS )InterruptedSendTimeoutTestc                    sp   t    |  | _| | jj tj| jd}|	  | j
 \| _}| | jj |  | j| j d S )N)target)rW   rH   r   r   rc   r   rY   Thread	doConnectstartrB   r   r   r9  r  r;   )rG   Z
cli_threadr   r_   r   r   rH     s   

z InterruptedSendTimeoutTest.setUpc                 C   s   | j | j d S r8   )r   r   r   rF   r   r   r   r    r   z$InterruptedSendTimeoutTest.doConnectc              	   O   sX   z%|  t}	 | | j ||i | q1 sw   Y  W | d d S | d w NTr   )r\  rA  r  r  r  r   r   r   checkInterruptedSend  s   z/InterruptedSendTimeoutTest.checkInterruptedSendr  r  c                 C   r
  Nr  )r  r   r   rF   r   r   r   testInterruptedSendTimeout  r  z5InterruptedSendTimeoutTest.testInterruptedSendTimeoutc                 C   s   |  | jjd| j d S r  )r  r   rd  r   rF   r   r   r   testInterruptedSendtoTimeout  s   z7InterruptedSendTimeoutTest.testInterruptedSendtoTimeoutr  c                 C   s   |  | jjdg d S r  )r  r   r  rF   r   r   r   testInterruptedSendmsgTimeout  r  z8InterruptedSendTimeoutTest.testInterruptedSendmsgTimeout)rN   rO   rP   rH   r  r  r   Zrequires_mac_verr  r  r;  r   r  rg   r   r   r_   r   r    s    	





r  c                   @   r?   )TCPCloserTestc                 C   sh   | j  \}}|  | j}t|gg g d\}}}| ||g | |dd |  |  d S )N      ?r   rM  )rB   r   r   r   r  r   r   )rG   r   r   sdrO  r2  rA  r   r   r   	testClose  s   zTCPCloserTest.testClosec                 C   s    | j t| jf td d S Nr   )r   r   r   rD   r   r   rF   r   r   r   
_testClose  ra   zTCPCloserTest._testCloseN)rN   rO   rP   r"  r$  r   r   r   r   r        r  c                   @   sN   e Zd ZdddZdd Zdd Zdd	 Zd
d Zdd Zdd Z	dd Z
dS )BasicSocketPairTestr   c                 C   r   r   )r   rX   r   r   r   r   rX     r   zBasicSocketPairTest.__init__c                 C   s\   |  |tj ttdr| |jtj n| |jtj | |jtj | |j	d d S )Nr  r   )
rG  r   r   r   rS  r  rA   r&  r5   rT  r  r   r   r   _check_defaults  s   
z#BasicSocketPairTest._check_defaultsc                 C      |  | j d S r8   )r'  r   rF   r   r   r   _testDefaults  r  z!BasicSocketPairTest._testDefaultsc                 C   r(  r8   )r'  rB   rF   r   r   r   testDefaults  r  z BasicSocketPairTest.testDefaultsc                 C   r   r   )rB   r   r   r   r   r   r   r   r=    r   zBasicSocketPairTest.testRecvc                 C   r>  r8   )r   r   r   rF   r   r   r   r@    r  zBasicSocketPairTest._testRecvc                 C   r>  r8   )rB   r   r   rF   r   r   r   testSend  r  zBasicSocketPairTest.testSendc                 C   r   r   )r   r   r   r   r   r   r   r   	_testSend  r   zBasicSocketPairTest._testSendNr   )rN   rO   rP   rX   r'  r)  r*  r=  r@  r+  r,  r   r   r   r   r&    s    
	r&  c                   @   s   e Zd Zd&ddZdd Zdd Zdd	 Zejd
d Z	eeZ
eeeddeddddd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%S )'NonBlockingTCPTestsr   c                 C   s   t  | _tj| |d d S r   )rY   r   eventr   rX   r   r   r   r   rX     r  zNonBlockingTCPTests.__init__c                 C   sl   |  | j | |dk}|  | | td ur4|d u }t|tjtj}|  t|tj@  | d S d S )N        )	r   rB   r  getblockingr   F_GETFLr   
O_NONBLOCKbool)rG   r  r;   blockingZfd_blockingflagr   r   r   assert_sock_timeout  s   z'NonBlockingTCPTests.assert_sock_timeoutc                 C   s   | j d | | j d  | j d | | j d | j d  | | j d  | j d | | j d | j d | | j d | j d | | j d d S )NTFr/  r   r  )rB   r  r6  r  rF   r   r   r   testSetBlocking  s   z#NonBlockingTCPTests.testSetBlockingc                 C   r   r8   r   rF   r   r   r   _testSetBlocking+  r   z$NonBlockingTCPTests._testSetBlockingc                 C   sb   dd l }|j|jkr| d | jd | | j d | j|jd  | | j  d S )Nr   zneeds UINT_MAX < ULONG_MAXFr/  r   )	r  r[  Z	ULONG_MAXrq   rB   r  r   r  r  r\  r   r   r   testSetBlocking_overflow.  s   
z,NonBlockingTCPTests.testSetBlocking_overflowr  ztest needs socket.SOCK_NONBLOCKr         c                 C   s4   | j   ttjtjtjB | _ | | j d d S r   )rB   r   r   rA   r5   r  r6  rF   r   r   r   testInitNonBlocking=  s
   

z'NonBlockingTCPTests.testInitNonBlockingc                 C   r   r8   r   rF   r   r   r   _testInitNonBlockingG  r   z(NonBlockingTCPTests._testInitNonBlockingc                 C   sb   t d # | jd | j \}}| |j | |  W d    d S 1 s*w   Y  d S )Nr  )r<   rB   r  r   rc   r   r  r  r   r   r   r   testInheritFlagsBlockingJ  s   
"z,NonBlockingTCPTests.testInheritFlagsBlockingc                 C      | j t| jf d S r8   r   r   r   rD   rF   r   r   r   _testInheritFlagsBlockingS  r   z-NonBlockingTCPTests._testInheritFlagsBlockingc                 C   sh   d}t |$ | jd | j \}}| |j | | | W d    d S 1 s-w   Y  d S )Ng      4@r  )r<   rB   r  r   rc   r   r   r  )rG   Zdefault_timeoutr   r   r   r   r   testInheritFlagsTimeoutV  s   
"z+NonBlockingTCPTests.testInheritFlagsTimeoutc                 C   r?  r8   r@  rF   r   r   r   _testInheritFlagsTimeouta  r   z,NonBlockingTCPTests._testInheritFlagsTimeoutc                 C   s   | j d t }| t | j  \}}W d    n1 s!w   Y  t | }| |d | j	  t

| j gg g tj\}}}| j |vrO| d | j  \}}| |j | |  d S )NFr   z'Error trying to do accept after select.)rB   r  r   	monotonicr\  BlockingIOErrorr   re  r.  r~   r  r   LONG_TIMEOUTrX  rc   r   r  r  )rG   Z
start_timer   r   ZdtrO  r2  rA  r   r   r   
testAcceptd  s   


zNonBlockingTCPTests.testAcceptc                 C   s    | j   | jt| jf d S r8   )r.  r   r   r   r   rD   rF   r   r   r   _testAcceptz  s   
zNonBlockingTCPTests._testAcceptc                 C   s   | j  \}}| |j |d | t |tt	}W d    n1 s)w   Y  | j
  t|gg g tj\}}}||vrI| d |tt	}| |t	 d S )NFz0Error during select call to non-blocking socket.)rB   r   rc   r   r  r\  rE  r   r(  r   r.  r~   r  r   rF  rX  r   )rG   r   r   r   rO  r2  rA  r   r   r   r=    s   


zNonBlockingTCPTests.testRecvc                 C   s,   | j t| jf | j  | j t d S r8   )r   r   r   rD   r.  r   rB  r   rF   r   r   r   r@    s   
zNonBlockingTCPTests._testRecvNr   )rN   rO   rP   rX   r6  r7  r8  r   r  r9  Z_testSetBlocking_overflowr   r  r   r   requires_linux_versionr<  r=  r>  rA  rB  rC  rG  rH  r=  r@  r   r   r   r   r-     s,    


	r-  c                   @   s   e Zd ZdZdZdZdZdZdZe	Z
dZe	Zd;d	d
Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Z d1d2 Z!d3d4 Z"d5d6 Z#d7d8 Z$d9d: Z%dS )<FileObjectClassTestCaseao  Unit tests for the object returned by socket.makefile()

    self.read_file is the io object returned by makefile() on
    the client connection.  You can read from this file to
    get output from the server.

    self.write_file is the io object returned by makefile() on the
    server connection.  You can write to this file to send output
    to the client.
    r  r   strictNr   r^  r   c                 C   r   r   r<  r   r   r   r   rX     r   z FileObjectClassTestCase.__init__c                 C   sR   dd t dD \| _| _| _| _t|  | jj| j	| j
| j| j| jd| _d S )Nc                 S      g | ]}t  qS r   )rY   r   r0  r>   r   r   r   r2    s    z1FileObjectClassTestCase.setUp.<locals>.<listcomp>rc  rb  errorsnewline)rh  evt1evt2serv_finishedcli_finishedr   rH   r   rQ  	read_moderr   rb  rO  rP  	read_filerF   r   r   r   rH     s   
zFileObjectClassTestCase.setUpc                 C   6   | j   | j  | | jj d | _t|  d S r8   )rS  r~   rV  r   rE  closedr   rK   rF   r   r   r   rK     
   

z FileObjectClassTestCase.tearDownc                 C   s0   t |  | jj| j| j| j| j| jd| _	d S )NrN  )
r   r   r   rQ  
write_moderr   rb  rO  rP  
write_filerF   r   r   r   r     s   
z#FileObjectClassTestCase.clientSetUpc                 C   rW  r8   )rT  r~   r[  r   rE  rX  r   r   rF   r   r   r   r     rY  z&FileObjectClassTestCase.clientTearDownc                 C   sv   | j d | jd | t| jjd | t}| jd W d    n1 s+w   Y  | dt|j	 d S )Nr   rB  z!cannot read from timed out object)
r   r  rV  rO  r\  rD  r   rM  r<  re  )rG   ctxr   r   r   testReadAfterTimeout  s   z,FileObjectClassTestCase.testReadAfterTimeoutc                 C   s.   | j | jdd  | j   | j  d S )Nr   rB  )r[  r2  	write_msgflushrS  r   rF   r   r   r   _testReadAfterTimeout  s   
z-FileObjectClassTestCase._testReadAfterTimeoutc                 C   s<   | j t| jd }| j d}|| }| || j d S r  )rV  rO  r(  read_msgr   )rG   	first_segZ
second_segr   r   r   r   testSmallRead  s   z%FileObjectClassTestCase.testSmallReadc                 C      | j | j | j   d S r8   r[  r2  r^  r_  rF   r   r   r   _testSmallRead  r   z&FileObjectClassTestCase._testSmallReadc                 C      | j  }| || j d S r8   )rV  rO  r   ra  r   r   r   r   testFullRead     
z$FileObjectClassTestCase.testFullReadc                 C   rd  r8   )r[  r2  r^  r   rF   r   r   r   _testFullRead  r   z%FileObjectClassTestCase._testFullReadc                 C   s<   t | j }	 | jd}|sq||7 }q| || j d S r  )r&  ra  rV  rO  r   )rG   r  charr   r   r   testUnbufferedRead  s   z*FileObjectClassTestCase.testUnbufferedReadc                 C   rd  r8   re  rF   r   r   r   _testUnbufferedRead  r   z+FileObjectClassTestCase._testUnbufferedReadc                 C   rg  r8   )rV  readliner   ra  rG   liner   r   r   testReadline  ri  z$FileObjectClassTestCase.testReadlinec                 C   rd  r8   re  rF   r   r   r   _testReadline  r   z%FileObjectClassTestCase._testReadlinec                 C   s&   | j   | j }| || j d S r8   )r   r   rV  rO  r   ra  r   r   r   r   testCloseAfterMakefile  s   

z.FileObjectClassTestCase.testCloseAfterMakefilec                 C   rd  r8   re  rF   r   r   r   _testCloseAfterMakefile  r   z/FileObjectClassTestCase._testCloseAfterMakefilec                 C   s@   | j   | jtt}t| jtr|	 }| 
|| j d S r8   )rV  r   r   r   r(  r   r%  ra  r<  decoder   r   r   r   r   testMakefileAfterMakefileClose   s
   
z6FileObjectClassTestCase.testMakefileAfterMakefileClosec                 C   rd  r8   re  rF   r   r   r   _testMakefileAfterMakefileClose'  r   z7FileObjectClassTestCase._testMakefileAfterMakefileClosec                 C      |  | jj  d S r8   )rE  rV  rX  rF   r   r   r   testClosedAttr+  r   z&FileObjectClassTestCase.testClosedAttrc                 C   rx  r8   )rE  r[  rX  rF   r   r   r   _testClosedAttr.  r   z'FileObjectClassTestCase._testClosedAttrc                 C   ,   |  | jj| j |  | jj| j  d S r8   )r   rV  r`  rU  r1  r   rN  rF   r   r   r   testAttributes1     z&FileObjectClassTestCase.testAttributesc                 C   r{  r8   )r   r[  r`  rZ  r1  r   rN  rF   r   r   r   _testAttributes5  r}  z'FileObjectClassTestCase._testAttributesc                 C   s8   | j   | t| j j | j  | t| jj d S r8   )rV  r   r\  r  rN  r   r   r   rF   r   r   r   testRealClose9  s   

z%FileObjectClassTestCase.testRealClosec                 C   r   r8   r   rF   r   r   r   _testRealClose?  r   z&FileObjectClassTestCase._testRealCloser   )&rN   rO   rP   rf   rr   rb  rO  rP  rU  r   ra  rZ  r^  rX   rH   rK   r   r   r]  r`  rc  rf  rh  rj  rl  rm  rq  rr  rs  rt  rv  rw  ry  rz  r|  r~  r  r  r   r   r   r   rJ    sF    


rJ  c                   @   sd   e Zd ZdZdZdd Zdd Zdd Zd	d
 Zdd Z	dd Z
dd Zdd Zdd Zdd ZdS )!UnbufferedFileObjectClassTestCasea  Repeat the tests from FileObjectClassTestCase with bufsize==0.

    In this case (and in this case only), it should be possible to
    create a file object, read a line from it, create another file
    object, read another line from it, without loss of data in the
    first file object's buffer.  Note that http.client relies on this
    when reading multiple requests from the same socket.r   c                 C   sL   | j  }| |d| j  | jdd| _ | j  }| |d| j  d S )N   A. r   r      B. )rV  rn  r   r^  r   rQ  ro  r   r   r   testUnbufferedReadlineO  s
   

z8UnbufferedFileObjectClassTestCase.testUnbufferedReadlinec                 C   s2   | j d| j  | j d| j  | j   d S )Nr  r  re  rF   r   r   r   _testUnbufferedReadlineW  s   z9UnbufferedFileObjectClassTestCase._testUnbufferedReadlinec                 C   sD   | j   | j d}| || j | j  | t| j jd d S r   )r   r   r   r   ra  rV  r\  r   r   r   r   r   testMakefileClose\  s
   

z3UnbufferedFileObjectClassTestCase.testMakefileClosec                 C   rd  r8   re  rF   r   r   r   _testMakefileClosee  r   z4UnbufferedFileObjectClassTestCase._testMakefileClosec                 C   s6   t | j}| j  t | j}| |d | d S r  )r  r  r   rV  r   r   )rG   Zrefcount_beforeZrefcount_afterr   r   r   testMakefileCloseSocketDestroyi  s   
z@UnbufferedFileObjectClassTestCase.testMakefileCloseSocketDestroyc                 C   r   r8   r   rF   r   r   r   _testMakefileCloseSocketDestroyo  r   zAUnbufferedFileObjectClassTestCase._testMakefileCloseSocketDestroyc                 C   s  | j d | | jtdd  | | jt| jd d  | j	
  | jd | jt| jd }|d u rKtd | jt| jd }td}| j|}| |d ||d |  }| || j | | jtdd  | | jdd  d S )NFr  rB  r   g      ?r  r   )r   r  r   rV  readintor  rO  r(  ra  rQ  r~   rR  r   r   r   )rG   rb  r  r,  r   r   r   r   testSmallReadNonBlockingv  s    

z:UnbufferedFileObjectClassTestCase.testSmallReadNonBlockingc                 C   s>   | j d | j| j | j  | j  | jd d S )Nr         @)	rQ  r   r[  r2  r^  r_  rR  r~   rS  rF   r   r   r   _testSmallReadNonBlocking  s
   

z;UnbufferedFileObjectClassTestCase._testSmallReadNonBlockingc                 C   s&   | j d | jr| | j d S d S )Nr  )rT  r   serv_skippedrq   rF   r   r   r   testWriteNonBlocking  s   z6UnbufferedFileObjectClassTestCase.testWriteNonBlockingc                 C   sv   d | _ | jd dtj }d}| j|}| |d t|D ]}| j|}|d u r/ d S | |d q d| _ d S )NFr>  r  r   z$failed to saturate the socket buffer)	r  r   r  r   rC  r[  r2  r  rh  )rG   ZBIGZLIMITr,  r>   r   r   r   _testWriteNonBlocking  s   

z7UnbufferedFileObjectClassTestCase._testWriteNonBlockingN)rN   rO   rP   rf   rr   r  r  r  r  r  r  r  r  r  r  r   r   r   r   r  C  s    		r  c                   @      e Zd ZdZdS )#LineBufferedFileObjectClassTestCaser   NrN   rO   rP   rr   r   r   r   r   r        r  c                   @   r  )$SmallBufferedFileObjectClassTestCaser   Nr  r   r   r   r   r    r  r  c                   @   s*   e Zd ZdZdZedZdZeZ	dZ
dS )"UnicodeReadFileObjectClassTestCase=Tests for socket.makefile() in text mode (rather than binary)r   r   r^  r`  NrN   rO   rP   rf   rU  r   ru  ra  rZ  r^  rP  r   r   r   r   r    s    
r  c                   @   s*   e Zd ZdZdZeZdZedZ	dZ
dS )#UnicodeWriteFileObjectClassTestCaser  r   r]  r   r`  N)rN   rO   rP   rf   rU  r   ra  rZ  ru  r^  rP  r   r   r   r   r    s    
r  c                   @   s0   e Zd ZdZdZedZdZedZ	dZ
dS )'UnicodeReadWriteFileObjectClassTestCaser  r   r   r]  r`  Nr  r   r   r   r   r    s    

r  c                   @   r  )NetworkConnectionTestzProve network connection.c                 C   s   t t| jf| _| j| _d S r8   )r   create_connectionr   rD   r   r   rF   r   r   r   r     s   z!NetworkConnectionTest.clientSetUpN)rN   rO   rP   rf   r   r   r   r   r   r    r  r  c                   @   r  )BasicTCPTest2zLTests that NetworkConnection does not break existing TCP functionality.
    N)rN   rO   rP   rf   r   r   r   r   r    s    r  c                   @   sD   e Zd ZG dd dejZejdd Zdd Zdd Z	d	d
 Z
dS )NetworkConnectionNoServerc                   @   rS   )z$NetworkConnectionNoServer.MockSocketc                 G   r   )Nz	timed out)rD  rx  r   r   r   r     r   z,NetworkConnectionNoServer.MockSocket.connectN)rN   rO   rP   r   r   r   r   r   
MockSocket  s    r  c                 c   s,    t j }| jt _ z	dV  W |t _ dS |t _ w )z*Return a socket which times out on connectN)r   r  )rG   Z
old_socketr   r   r   mocked_socket_module  s   z.NetworkConnectionNoServer.mocked_socket_modulec                 C   sr   t  }ttjtj}| |j | t}|	t
|f W d    n1 s)w   Y  | |jjtj d S r8   )r   r  r   rA   r5   rc   r   r\  r   r   r   r   re  r  ZECONNREFUSED)rG   rD   r   rf  r   r   r   test_connect  s   z&NetworkConnectionNoServer.test_connectc                 C   s\   t  }| t}tt|f W d    n1 sw   Y  t  }| |j	j
| d S r8   )r   r  r\  r   r   r  r   Zget_socket_conn_refused_errsrM  re  r  )rG   rD   rf  Zexpected_errnosr   r   r   test_create_connection  s   z0NetworkConnectionNoServer.test_create_connectionc                 C   s   |   L z	ttdf W n$ ty   Y n) ty2 } ztjs'|jtj	kr( W Y d }~nd }~ww | 
d W d    d S W d    d S W d    d S 1 sSw   Y  d S )Nr   r  )r  r   r  r   rD  r   r   r)  r  ZEAFNOSUPPORTrX  r   r   r   r   test_create_connection_timeout  s"   
"z8NetworkConnectionNoServer.test_create_connection_timeoutN)rN   rO   rP   r   r  
contextlibcontextmanagerr  r  r  r  r   r   r   r   r    s    
	r  c                   @   sv   e Zd ZdddZdd Zdd Zdd	 ZeZd
d ZeZ	dd Z
eZdd ZeZdd ZeZdd ZeZdd ZdS )NetworkConnectionAttributesTestr   c                 C   r   r   r   r   r   r   r   rX   %  r   z(NetworkConnectionAttributesTest.__init__c                 C   s   t  | _d S r8   )r   r  source_portrF   r   r   r   r   )  rL  z+NetworkConnectionAttributesTest.clientSetUpc                 C   r   r8   r   rF   r   r   r   r   ,  r   z.NetworkConnectionAttributesTest.clientTearDownc                 C   s   | j  \}}|  d S r8   )rB   r   r   r   r   r   r   _justAccept1  s   z+NetworkConnectionAttributesTest._justAcceptc                 C   s:   t jt| jftjd| _| | jj | 	| jj
d d S )Nr  r   )r   r  r   rD   r   r  r   rc   r   r   rS  rF   r   r   r   _testFamily6  s
   z+NetworkConnectionAttributesTest._testFamilyc                 C   sJ   t jt| jftjd| jfd| _| | jj	 | 
| j d | j d S )Nr`  )r;   source_addressr   )r   r  r   rD   r   r  r  r   rc   r   r   r   rF   r   r   r   _testSourceAddress=  s   z2NetworkConnectionAttributesTest._testSourceAddressc              	   C   sn   |  t d u  td ztt| jf| _| | jj	 W td  ntd  w | 
| j d d S )Nr}  rE  r   r9   r:   r  r   rD   r   rc   r   r   r  rF   r   r   r   _testTimeoutDefaultG  s   
z3NetworkConnectionAttributesTest._testTimeoutDefaultc              	   C   sr   |  t d u  td ztjt| jfd d| _| | jj	 W td  ntd  w | 
| j d  d S N   r  r  rF   r   r   r   _testTimeoutNoneS  s   
z0NetworkConnectionAttributesTest._testTimeoutNonec                 C   s,   t jt| jfdd| _| | j d d S r  )r   r  r   rD   r   r   r  rF   r   r   r   _testTimeoutValueNamed_  s   z6NetworkConnectionAttributesTest._testTimeoutValueNamedc                 C   s8   t t| jfd| _| | jj | | j d d S )Nr  )	r   r  r   rD   r   rc   r   r   r  rF   r   r   r   _testTimeoutValueNonamedd  s   z8NetworkConnectionAttributesTest._testTimeoutValueNonamedNr   )rN   rO   rP   rX   r   r   r  Z
testFamilyr  ZtestSourceAddressr  ZtestTimeoutDefaultr  ZtestTimeoutNoner  ZtestTimeoutValueNamedr  ZtestTimeoutValueNonamedr  r   r   r   r   r  #  s"    
	r  c                   @   sB   e Zd ZdddZdd Zdd Zdd	 ZeZd
d Zdd Z	dS )NetworkConnectionBehaviourTestr   c                 C   r   r   r   r   r   r   r   rX   l  r   z'NetworkConnectionBehaviourTest.__init__c                 C   r   r8   r   rF   r   r   r   r   p  r   z*NetworkConnectionBehaviourTest.clientSetUpc                 C   r   r8   r   rF   r   r   r   r   s  r   z-NetworkConnectionBehaviourTest.clientTearDownc                 C   s2   | j  \}}| |j td |d d S )NrB     done!)rB   r   rc   r   r   r   r   r   r   r   r   testInsideTimeoutx     
z0NetworkConnectionBehaviourTest.testInsideTimeoutc                 C   s0   t t| jf | _}|d}| |d d S )Nr  r  )r   r  r   rD   r   r   r   )rG   r  r  r   r   r   _testInsideTimeout  s   
z1NetworkConnectionBehaviourTest._testInsideTimeoutc                    s2   t jt| jfdd | _ | t fdd d S )Nr   r  c                      s
     dS )Nr  )r   r   r  r   r   r"    r  zDNetworkConnectionBehaviourTest._testOutsideTimeout.<locals>.<lambda>)r   r  r   rD   r   r\  rD  rF   r   r  r   _testOutsideTimeout  s   z2NetworkConnectionBehaviourTest._testOutsideTimeoutNr   )
rN   rO   rP   rX   r   r   r  ZtestOutsideTimeoutr  r  r   r   r   r   r  j  s    
r  c                   @   s6   e Zd Zdd Zdd Zeeedddd Z	d	S )
TCPTimeoutTestc                        fdd}  t|d d S )Nc                     s    j d  j   d S r#  )rB   r  r   r  rF   r   r   raise_timeout  r   z4TCPTimeoutTest.testTCPTimeout.<locals>.raise_timeoutz*Error generating a timeout exception (TCP)r\  rD  rG   r  r   rF   r   testTCPTimeout     zTCPTimeoutTest.testTCPTimeoutc                 C   sv   d}z| j d | j  }W n  ty   | d Y n ty'   d}Y n	   | d Y |s9| d d S d S )NFr/  z%caught timeout instead of error (TCP)Tz!caught unexpected exception (TCP)z3accept() returned success when we did not expect it)rB   r  r   rD  rX  r   rG   okr  r   r   r   testTimeoutZero  s   zTCPTimeoutTest.testTimeoutZeror6  ztest needs signal.alarm()c              
      s*  | j d G dd dt  fdd}ttj|}zqzNzEztd | j  }W n, ty8   | d Y n$  y@   Y n   | dt	
 d d t f   Y n| d	 W td
 ntd
 w W n  yx   | d Y nw W ttj| d S W ttj| d S ttj| w )Nr  c                   @   r  )z4TCPTimeoutTest.testInterruptedTimeout.<locals>.AlarmNr  r   r   r   r   Alarm  s    r  c                    s    r8   r   )r?  r  r  r   r   alarm_handler  r   z<TCPTimeoutTest.testInterruptedTimeout.<locals>.alarm_handlerr   zcaught timeout instead of Alarmz3caught other exception instead of Alarm: %s(%s):
%sznothing caughtr   zgot Alarm in wrong place)rB   r  r  r?  r@  r6  r   rD  rX  r  exc_info	traceback
format_exc)rG   r  rF  r  r   r  r   testInterruptedTimeout  s4   


"z%TCPTimeoutTest.testInterruptedTimeoutN)
rN   rO   rP   r  r  r   r  r   r?  r  r   r   r   r   r    s    r  c                   @   r?   )UDPTimeoutTestc                    r  )Nc                         j d  j d d S Nr   r   rB   r  r   r  rF   r   r   r    r   z4UDPTimeoutTest.testUDPTimeout.<locals>.raise_timeoutz*Error generating a timeout exception (UDP)r  r  r   rF   r   testUDPTimeout  r  zUDPTimeoutTest.testUDPTimeoutc                 C   x   d}z| j d | j d}W n  ty   | d Y n ty(   d}Y n	   | d Y |s:| d d S d S )NFr/  r   z%caught timeout instead of error (UDP)Tz!caught unexpected exception (UDP)1recv() returned success when we did not expect itrB   r  r   rD  rX  r   r  r   r   r   r       zUDPTimeoutTest.testTimeoutZeroN)rN   rO   rP   r  r  r   r   r   r   r    s    r  c                   @   r?   )UDPLITETimeoutTestc                    r  )Nc                     r  r  r  r  rF   r   r   r    r   z<UDPLITETimeoutTest.testUDPLITETimeout.<locals>.raise_timeoutz.Error generating a timeout exception (UDPLITE)r  r  r   rF   r   testUDPLITETimeout  r  z%UDPLITETimeoutTest.testUDPLITETimeoutc                 C   r  )NFr/  r   z)caught timeout instead of error (UDPLITE)Tz%caught unexpected exception (UDPLITE)r  r  r  r   r   r   r    r  z"UDPLITETimeoutTest.testTimeoutZeroN)rN   rO   rP   r  r  r   r   r   r   r    s    r  c                   @   r?   )TestExceptionsc                 C   sf   |  ttt |  ttjt |  ttjt |  ttjt | tj	t | tjt
 d S r8   )rE  
issubclassr   r  r   r]  r^  r;   ZassertIserrorrD  rF   r   r   r   testExceptionTree  s   z TestExceptions.testExceptionTreec                 C   sx   t  t jt jd}t  t jt jd| }|  | |j | t |	d W d    d S 1 s5w   Y  d S )Nr   F)
r   rA   r5   rN  r   rc   r  r\  r   r  )rG   Zsock0r  r   r   r   test_setblocking_invalidfd  s   "z)TestExceptions.test_setblocking_invalidfdN)rN   rO   rP   r  r  r   r   r   r   r    s    r  r  zLinux specific testc                   @   s8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )TestLinuxAbstractNamespacel   c              
   C   s   d}t  t jt j_}|| |  t  t jt j5}||  | d }| | | | |	 | W d    n1 sEw   Y  W d    n1 sTw   Y  W d    d S W d    d S 1 slw   Y  d S )Ns    python-test-hello r   )
r   r  r5   ro   rE   r   r   r   r   getpeername)rG   r  s1r  Zs3r   r   r   testLinuxAbstractNamespace  s   
"z5TestLinuxAbstractNamespace.testLinuxAbstractNamespacec                 C   sb   dd| j d   }ttjtj}|| | | | W d    d S 1 s*w   Y  d S )Nr     hr   )UNIX_PATH_MAXr   r  r5   ro   r   r   rG   r  r!   r   r   r   testMaxName  s
   
"z&TestLinuxAbstractNamespace.testMaxNamec                 C   sT   dd| j   }ttjtj}| t|j| W d    d S 1 s#w   Y  d S )N h)r  r   r  r5   r\  r   ro   r  r   r   r   testNameOverflow  s   "z+TestLinuxAbstractNamespace.testNameOverflowc                 C   sD   t  t jt j}z|d | | d W |  d S |  w )Nz python test     python test )r   r  r5   ro   r   r   r   rQ  r   r   r   testStrName$  s
   
z&TestLinuxAbstractNamespace.testStrNamec                 C   sT   t  t jt j}|td | | d W d    d S 1 s#w   Y  d S )Nr  )r   r  r5   ro   r  r   r   rQ  r   r   r   testBytearrayName-  s   "z,TestLinuxAbstractNamespace.testBytearrayNameN)	rN   rO   rP   r  r  r  r  r  r  r   r   r   r   r  	  s    	r  ztest needs socket.AF_UNIXc                   @   sT   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd ZdS )TestUnixDomainc                 C   r   r8   )r   r  r5   r  rF   r   r   r   rH   6  r   zTestUnixDomain.setUpc                 C   r  r8   )r  r   rF   r   r   r   rK   9  rL  zTestUnixDomain.tearDownc              
   C   s8   zt |W S  ty   | d|t  Y d S w )NzBPathname {0!a} cannot be represented in file system encoding {1!r})r   fsencoder-  rq   r@  r  getfilesystemencodingrG   r  r   r   r   encoded<  s   
zTestUnixDomain.encodedc              
   C   sZ   z	t || W d S  ty, } zt|dkr | d| n W Y d }~d S d }~ww )NzAF_UNIX path too longz6Pathname {0!a} is too long to serve as an AF_UNIX path)r   r  r   r<  rq   r@  )rG   r  r  r   r   r   r   ro   G  s   zTestUnixDomain.bindc                 C   s   |  | j d d S )N)r`  N)rM  r  r   rF   r   r   r   r#  S  r3  zTestUnixDomain.testUnboundc                 C   s@   t jtj}| | j| | tj| | 	| j
 | d S r8   )r   r  abspathr   TESTFNro   r  rc   r  r   r   r  r   r   r   testStrAddrW  s   zTestUnixDomain.testStrAddrc                 C   sF   t jtj}| | j| | | tj	| | 
| j | d S r8   )r   r  r  r   r  ro   r  r  rc   r  r   r   r  r   r   r   testBytesAddr^  s   zTestUnixDomain.testBytesAddrc                 C   sR   t jtj}| |}| | j|dd | 	tj
| | | j | d S )Nasciisurrogateescape)r   r  r  r   ZTESTFN_UNICODEr  ro   r  ru  rc   r  r   r   )rG   r  r0  r   r   r   testSurrogateescapeBinde  s
   
z&TestUnixDomain.testSurrogateescapeBindc                 C   sT   t jd u r
| d tjt j}| | j| | t j	| | 
| j | d S )Nz!No unencodable filename available)r   ZTESTFN_UNENCODABLErq   r   r  r  ro   r  rc   r  r   r   r  r   r   r   testUnencodableAddrn  s   

z"TestUnixDomain.testUnencodableAddrN)rN   rO   rP   rH   rK   r  ro   r#  r  r  r  r  r   r   r   r   r  3  s    	r  c                   @   s   e Zd ZdZdddZdd Zdd Zd	d
 ZeZdd Z	eZ
dd Zdd Zdd ZeZdd ZeZdd Zdd Zdd ZeZdS )BufferIOTestzF
    Test the buffer versions of socket.recv() and socket.send().
    r   c                 C   r   r   r<  r   r   r   r   rX   }  r   zBufferIOTest.__init__c                 C   sZ   t  ddgtt }| j|}| |tt | }|d tt }| |t d S Nr  r   )r  r(  r   r   r  r   r  rG   r  r  r   r   r   r   testRecvIntoArray  s   zBufferIOTest.testRecvIntoArrayc                 C      t t}| j| d S r8   r  r   r   r   rG   r  r   r   r   _testRecvIntoArray     zBufferIOTest._testRecvIntoArrayc                 C   sD   t d}| j|}| |tt |d tt }| |t d S r   )r  r   r  r   r(  r   r  r   r   r   testRecvIntoBytearray  s
   z"BufferIOTest.testRecvIntoBytearrayc                 C   sH   t d}| jt|}| |tt |d tt }| |t d S r   )r  r   r  r  r   r(  r   r  r   r   r   testRecvIntoMemoryview  
   z#BufferIOTest.testRecvIntoMemoryviewc                 C   s^   t  ddgtt }| j|\}}| |tt | }|d tt }| |t d S r  )r  r(  r   r   r  r   r  rG   r  r  r   r   r   r   r   testRecvFromIntoArray  s   z"BufferIOTest.testRecvFromIntoArrayc                 C   r  r8   r  r  r   r   r   _testRecvFromIntoArray  r  z#BufferIOTest._testRecvFromIntoArrayc                 C   sH   t d}| j|\}}| |tt |d tt }| |t d S r   )r  r   r  r   r(  r   r  r   r   r   testRecvFromIntoBytearray  r  z&BufferIOTest.testRecvFromIntoBytearrayc                 C   sL   t d}| jt|\}}| |tt |d tt }| |t d S r   )r  r   r  r  r   r(  r   r  r   r   r   testRecvFromIntoMemoryview  s
   z'BufferIOTest.testRecvFromIntoMemoryviewc                 C   s    t d}| t| jj|d d S )Nrl   r   )r  r\  r  r   r  r  r   r   r   testRecvFromIntoSmallBuffer  s   z(BufferIOTest.testRecvFromIntoSmallBufferc                 C   r>  r8   r?  rF   r   r   r   _testRecvFromIntoSmallBuffer  r  z)BufferIOTest._testRecvFromIntoSmallBufferc                 C   s$   t  }| j| | j|d d S r   )r  r   r  r  r   r   r   testRecvFromIntoEmptyBuffer  s   z(BufferIOTest.testRecvFromIntoEmptyBufferNr   )rN   rO   rP   rf   rX   r  r  r   Z_testRecvIntoBytearrayr  Z_testRecvIntoMemoryviewr  r  r  Z_testRecvFromIntoBytearrayr  Z_testRecvFromIntoMemoryviewr  r	  r
  Z_testRecvFromIntoEmptyBufferr   r   r   r   r  y  s&    
r  i        c               
   C   s   t tdsdS ztddd} W n tttfy   Y dS w |  | D ]}|dr2 W d   dS q"W d   dS 1 s>w   Y  dS )	zCheck if the TIPC module is loaded

    The TIPC module is not loaded automatically on Ubuntu and probably
    other Linux distros.
    AF_TIPCFz/proc/modulesr   ra  ztipc NT)r   r   r   FileNotFoundErrorIsADirectoryErrorr  r  )r   rp  r   r   r   isTipcAvailable  s$   


r  z6TIPC module is not loaded, please 'sudo modprobe tipc'c                   @   rS   )TIPCTestc                 C   s   t  t jt j}t  t jt j}| |j | |j |t jt jd t jt	t
tf}|| t jt	t
ttt
 d  df}|t| |d\}}| | | | |t d S )Nr   r   r   r   )r   r  ri  rc   r   r  rj  rk  TIPC_ADDR_NAMESEQ
TIPC_STYPE
TIPC_LOWER
TIPC_UPPERro   TIPC_ADDR_NAMEr  rd  r   r  r   r   )rG   rp  r   srvaddrZsendaddrr   Zrecvaddrr   r   r   testRDM  s    
zTIPCTest.testRDMN)rN   rO   rP   r  r   r   r   r   r    r  r  c                   @   r   )TIPCThreadableTestr   c                 C   r   r   r   r   r   r   r   rX     r   zTIPCThreadableTest.__init__c                 C   s   t  t jt j| _| | jj | jt jt jd t j	t
ttf}| j| | j  |   | j \| _| _| | jj d S r  )r   r  r5   rp  rc   r   r  rj  rk  r  r  r  r  ro   rE   r   r   r   r   )rG   r  r   r   r   rH     s   
zTIPCThreadableTest.setUpc                 C   sd   t d ttjtj| _| | jj tjt	t
ttt
 d  df}| j| | j | _d S )Nr   r   r   )r   r   r   r  r5   r   rc   r   r  r  r  r  r  r   r   cliaddr)rG   r   r   r   r   r     s   
zTIPCThreadableTest.clientSetUpc                 C   s,   | j d}| |t | | j| j d S r   )r   r   r   r   r  r   r   r   r   r   r     s   zTIPCThreadableTest.testStreamc                 C   r   r8   r   rF   r   r   r   r      r   zTIPCThreadableTest._testStreamNr   r   r   r   r   r   r    s    
r  c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )ContextManagersTestc                 C   s   t   }| |j W d    n1 sw   Y  | |j t   }|  W d    n1 s3w   Y  | |j t   }| t|jd W d    n1 sUw   Y  | |j d S Nra  )r   r  r^  rE  r   r\  r   rB  r  r   r   r   _testSocketClass'  s   



z$ContextManagersTest._testSocketClassc                 C   2   | j  \}}| |j |d}|| d S r   rB   r   rc   r   r   rB  rG   r   r   r  r   r   r   testCreateConnectionBase5  r  z,ContextManagersTest.testCreateConnectionBasec                 C   sl   | j  }t|}| |j |d | |dd W d    n1 s)w   Y  | 	|j d S )Nra  r   )
rB   r   r   r  r  r^  rB  r   r   rE  rG   r  r  r   r   r   _testCreateConnectionBase;  s   

z-ContextManagersTest._testCreateConnectionBasec                 C   r  r   r  r   r   r   r   testCreateConnectionCloseC  r  z-ContextManagersTest.testCreateConnectionClosec                 C   s\   | j  }t|}|  W d    n1 sw   Y  | |j | t|j	d d S r  )
rB   r   r   r  r   rE  r^  r\  r   rB  r"  r   r   r   _testCreateConnectionCloseI  s   

z.ContextManagersTest._testCreateConnectionCloseN)rN   rO   rP   r  r!  r#  r$  r%  r   r   r   r   r  %  s    r  c                   @   s   e Zd Zeeeddeddddd Z	dd	 Z
d
d Zdd Zeedu ddd Zeedu ddd Zdd ZdS )InheritanceTestr  zSOCK_CLOEXEC not definedr   r:  r;  c                 C   sZ   t  t jt jt jB }| |jt j | |  W d    d S 1 s&w   Y  d S r8   )r   rA   r5   r  r   r&  r  get_inheritablerQ  r   r   r   test_SOCK_CLOEXECR  s   
"z!InheritanceTest.test_SOCK_CLOEXECc                 C   sB   t   }| | | d W d    d S 1 sw   Y  d S rI  )r   r   r'  r  r   r   r   test_default_inheritable[  s   "z(InheritanceTest.test_default_inheritablec              	   C   s   t   }|3 | }|  | | | d W d    n1 s$w   Y  W d    d S W d    d S 1 s<w   Y  d S rI  )r   rU  r   r   r'  )rG   r  Znewsockr   r   r   test_dup`  s   "zInheritanceTest.test_dupc                 C   sf   t   }|# |d | | d |d | | d W d    d S 1 s,w   Y  d S )NTF)r   set_inheritabler   r'  r  r   r   r   test_set_inheritableh  s   

"z$InheritanceTest.test_set_inheritableNr   c                 C   s   t   }|2 | }| | d t|tj}|tj M }t|tj| | | d W d    d S 1 s;w   Y  d S )NFT)r   rN  r   r'  r   F_GETFD
FD_CLOEXECF_SETFD)rG   r  r  r$  r   r   r   test_get_inheritable_cloexecq  s   "z,InheritanceTest.test_get_inheritable_cloexecc                 C   s~   t   }|/ | }| t|tjtj@ tj |d | t|tjtj@ d W d    d S 1 s8w   Y  d S r  )r   rN  r   r   r-  r.  r+  )rG   r  r  r   r   r   test_set_inheritable_cloexec  s   
"z,InheritanceTest.test_set_inheritable_cloexecc                 C   sH   t  \}}| |j | |j | | d | | d d S rI  )r   r   rc   r   r   r'  )rG   r  r  r   r   r   test_socketpair  s
   zInheritanceTest.test_socketpair)rN   rO   rP   r   r  r   r   r   rI  r(  r)  r*  r,  r  r   r0  r1  r2  r   r   r   r   r&  Q  s    	

r&  r  zSOCK_NONBLOCK not definedc                   @   s,   e Zd ZdddZeddddd	 Zd
S )NonblockConstantTestTr/  c                 C   s   |r7|  |jtj |  | | | t|tjtj	tj	@  |dkr.| 
|  d S | |  d S |  |jtj |  | d  | 
t|tjtj	tj	@  | |  d S r   )r   r&  r   r5   r  rE  r   r1  r   r2  r  r0  )rG   r!   nonblockr;   r   r   r   checkNonblock  s   	z"NonblockConstantTest.checkNonblockr   r:  r;  c                 C   s  t  t jt jt jB G}| | |d | j|dd |d | | |d  | j|dd |d | j|dd |d | j|dd W d    n1 sUw   Y  t  }t d t   }| | W d    n1 sww   Y  t d  t   }| |d W d    n1 sw   Y  t d t   }| j|dd W d    n1 sw   Y  t d  t   }| |d W d    n1 sw   Y  t | d S )NTF)r4  g       @r  r/  )	r   rA   r5   r  r5  r  r  r9   r:   )rG   r!   tr   r   r   test_SOCK_NONBLOCK  sD   















z'NonblockConstantTest.test_SOCK_NONBLOCKN)Tr/  )rN   rO   rP   r5  r   rI  r7  r   r   r   r   r3    s    
r3  rq  rr  zneed multiprocessingc                   @   s@   e Zd Zedd Zdd Zdd Zdd Zd	d
 Zdd Z	dS )TestSocketSharingc                 C   sD   |  }|  }t|}| \}}|| |  |  d S r8   )r   r   	fromsharer   rB  r   )r  qZsdatamessager!   r  rE  r   r   r   remoteProcessServer  s   

z%TestSocketSharing.remoteProcessServerc           	      C   s   t  }t j| j|fd}|  | j|j}| j }| j	  |
| d}|
| t|}g }	 |d}|s>qD|| q6|	  d|}| || |  d S )Nr  r]   s
   slapmahfroTr  rM  )multiprocessingr   Processr<  r  rB   sharepidr   r   r   r   r  r   r4  r9  r   )	rG   r:  rY  r  r   r;  r!   mreceivedr   r   r   	testShare  s*   







zTestSocketSharing.testSharec                 C   s@   | j t }| ttj|d d  | ttj|d  d S )Nr  ra  )rB   r@  r   getpidr\  r  r   r9  )rG   r  r   r   r   testShareLength  s   z!TestSocketSharing.testShareLengthc                 C   sf   |  | d  |  | |  |  |j|j |  |j|j |jdkr1|  |j|j d S d S r   )r   r  rS  r&  rT  )rG   Zorgotherr   r   r   compareSockets  s   
z TestSocketSharing.compareSocketsc                 C   sB   | j t }t|}z| | j | W |  d S |  w r8   )rB   r@  r   rE  r   r9  rH  r   )rG   r  r!   r   r   r   testShareLocal  s
   
z TestSocketSharing.testShareLocalc              
   C   s   t jt jg}t jt jg}|D ]B}|D ]=}zt  ||}W n	 ty%   Y qw z$|t }t 	|}z| 
|| W |  n|  w W |  q|  w qd S r8   )r   rA   r  r5   r$   r   r@  r   rE  r9  rH  r   )rG   familiestypesr   r6  sourcer  Zsharedr   r   r   	testTypes%  s$   
zTestSocketSharing.testTypesN)
rN   rO   rP   r  r<  rD  rF  rH  rI  rM  r   r   r   r   r8    s    
#r8  c                   @   s  e Zd ZdZdZdZdZejZ	e
dd Ze
dd Zd	d
 Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Z d1d2 Z!d3d4 Z"d5d6 Z#d7d8 Z$d9d: Z%d;S )<SendfileUsingSendTestz>
    Test the send() implementation of socket.sendfile().
    i   rw   rM  c                 C   s   dd }d dd t| jD }ttjd}|| j| jD ]}|| qW d    n1 s1w   Y  ttjd}| | _	t
| j	| jksLJ W d    d S 1 sWw   Y  d S )Nc                 s   s>    | |ksJ | |kr|V  | |8 } | |ks| r| V  d S d S r8   r   )totalstepr   r   r   chunksE  s   
z0SendfileUsingSendTest.setUpClass.<locals>.chunksrM  c                 S   s   g | ]
}t tj qS r   )randomchoicestringascii_lettersr3  rM  r   r   r   r2  M  s    z4SendfileUsingSendTest.setUpClass.<locals>.<listcomp>r^  r   )r9  rh  BUFSIZEr   r   r  FILESIZEr2  rO  FILEDATAr(  )r  rQ  chunkr   Zcsizer   r   r   
setUpClassC  s   

"z SendfileUsingSendTest.setUpClassc                 C   s   t t j d S r8   )r   r  r  )r  r   r   r   tearDownClassV  r  z#SendfileUsingSendTest.tearDownClassc                 C   s8   | j tj | j  \}}|| j | |j |S r8   )rB   r  r   rF  r   TIMEOUTrc   r   r   r   r   r   accept_connZ  s
   z!SendfileUsingSendTest.accept_connc                 C   s.   g }	 | | j}|sq|| qd|S )NTrM  )r   rV  r4  r9  )rG   r   rC  rY  r   r   r   	recv_dataa  s   

zSendfileUsingSendTest.recv_datac                 C   
   t |dS )N_sendfile_use_sendr   r  r   r   r   meth_from_sockj  s   
z$SendfileUsingSendTest.meth_from_sockc              	   C   s   | j  }ttjd}t|<}|!}| |}||}| || j	 | |
 | j	 W d    n1 s7w   Y  W d    d S W d    d S 1 sOw   Y  d S )Nr   rB   r   r   r   r  r   r  rb  r   rW  tellrG   r  filer  methsentr   r   r   _testRegularFileq  s   

Pz&SendfileUsingSendTest._testRegularFilec                 C   6   |   }| |}| t|| j | || j d S r8   r]  r^  r   r(  rW  rX  rG   r   r  r   r   r   testRegularFilez     
z%SendfileUsingSendTest.testRegularFilec              	   C   s   | j  }t| j}t|A}|&}||}| || j	 | |
 | j	 | tj|j| W d    n1 s<w   Y  W d    d S W d    d S 1 sTw   Y  d S r8   )rB   r   ioBytesIOrX  r   r  r  r   rW  rd  r\  r  r  )rG   r  rf  r  rh  r   r   r   _testNonRegularFile  s   

Pz)SendfileUsingSendTest._testNonRegularFilec                 C   rj  r8   rk  rl  r   r   r   testNonRegularFile  rn  z(SendfileUsingSendTest.testNonRegularFilec              	   C   s   | j  }tjd }t|d | tj| W d    n1 s!w   Y  t|d}t|:}|}| 	|}||}| 
|d | 
| d W d    n1 sUw   Y  W d    d S W d    d S 1 smw   Y  d S )N2r^  r   r   )rB   r   r   r  r   rc   r  r   r  rb  r   rd  )rG   r  filenamerf  r  rg  rh  r   r   r   _testEmptyFileSend  s   



Pz(SendfileUsingSendTest._testEmptyFileSendc                 C   s"   |   }| |}| |d d S rc  )r]  r^  r   rl  r   r   r   testEmptyFileSend  s   
z'SendfileUsingSendTest.testEmptyFileSendc              	   C   s   | j  }ttjd}t|@}|%}| |}||dd}| || j	d  | |
 | j	 W d    n1 s;w   Y  W d    d S W d    d S 1 sSw   Y  d S )Nr     )offsetrc  re  r   r   r   _testOffset  s   

Pz!SendfileUsingSendTest._testOffsetc                 C   sB   |   }| |}| t|| jd  | || jdd   d S )Nrw  rk  rl  r   r   r   
testOffset  s   
z SendfileUsingSendTest.testOffsetc              	   C      | j  }ttjd}tj|tjd}|> |# d}| 	|}|||d}| 
|| | 
| | W d    n1 s>w   Y  W d    d S W d    d S 1 sVw   Y  d S )Nr   r  GKL r  rB   r   r   r   r  r   r  r   r  rb  r   rd  rG   r  rf  r  r  rg  rh  r   r   r   
_testCount     

Pz SendfileUsingSendTest._testCountc                 C   @   d}|   }| |}| t|| | || jd |  d S )Nr|  r]  r^  r   r(  rX  rG   r  r   r  r   r   r   	testCount  
   
zSendfileUsingSendTest.testCountc              	   C   r{  )Nr   r  r   r}  r~  r  r   r   r   _testCountSmall  r  z%SendfileUsingSendTest._testCountSmallc                 C   r  r  r  r  r   r   r   testCountSmall  r  z$SendfileUsingSendTest.testCountSmallc              	   C   s   | j  }ttjd}tj|ddA}|&}d}| |}||d|d}| || | |	 |d  W d    n1 s>w   Y  W d    d S W d    d S 1 sVw   Y  d S )Nr   r   r  駆   )rx  r  )
rB   r   r   r   r  r   r  rb  r   rd  r  r   r   r   _testCountWithOffset  s   

Pz*SendfileUsingSendTest._testCountWithOffsetc                 C   sD   d}|   }| |}| t|| | || jd|d   d S )Nr  r  r  r  r   r   r   testCountWithOffset  s
   
z)SendfileUsingSendTest.testCountWithOffsetc              	   C   s   | j  }ttjd}t|<}|!}|d | |}| 	t
|| | 	t
|j| W d    n1 s7w   Y  W d    d S W d    d S 1 sOw   Y  d S )Nr   F)rB   r   r   r   r  r   r  r  rb  r\  r  r  rG   r  rf  r  rg  r   r   r   _testNonBlocking  s   


Pz&SendfileUsingSendTest._testNonBlockingc                 C   s$   |   }|dr| d d S d S )Nrw   z$was not supposed to receive any data)r]  r   rX  rG   r   r   r   r   testNonBlocking  s   
z%SendfileUsingSendTest.testNonBlockingc              	   C   s   | j  }ttjd}tj|tjd}|3 | | 	|}||}| 
|| j W d    n1 s3w   Y  W d    d S W d    d S 1 sKw   Y  d S )Nr   r  )rB   r   r   r   r  r   r  r   r  rb  r   rW  re  r   r   r   _testWithTimeout  s   

Pz&SendfileUsingSendTest._testWithTimeoutc                 C   rj  r8   rk  rl  r   r   r   testWithTimeout  rn  z%SendfileUsingSendTest.testWithTimeoutc              	   C   s   | j  }ttjd7}t|}|d | |}| 	t
|| W d    n1 s-w   Y  W d    d S W d    d S 1 sEw   Y  d S )Nr   g{Gz?)rB   r   r   r   r  r   r  r  rb  r\  rD  r  r   r   r   _testWithTimeoutTriggeredSend  s   


"z3SendfileUsingSendTest._testWithTimeoutTriggeredSendc                 C   s   |   }|d d S )NiX )r]  r   r  r   r   r   testWithTimeoutTriggeredSend  s   z2SendfileUsingSendTest.testWithTimeoutTriggeredSendc                 C   r   r8   r   rF   r   r   r   _test_errors%  r   z"SendfileUsingSendTest._test_errorsc              	   C   s  t tjd,}tjtjd}| |}| td|| W d    n1 s&w   Y  W d    n1 s5w   Y  t tjdd)}t }| |}| td|| W d    n1 s^w   Y  W d    n1 smw   Y  t tjdR}t 5}| |}| jtd||dd	 | jtd||d
d	 | jtd||dd	 | jtd||dd	 W d    n1 sw   Y  W d    d S W d    d S 1 sw   Y  d S )Nr   r#  r5   r   ra  zbinary modezpositive integerrs  r}  r   r   r  )	r   r   r  r   r$   rb  rf  r  r   )rG   rf  r!   rg  r   r   r   test_errors(  sJ   




"z!SendfileUsingSendTest.test_errorsN)&rN   rO   rP   rf   rW  rV  rX  r   r  r\  r  rZ  r[  r]  r^  rb  ri  rm  rq  rr  ru  rv  ry  rz  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r   r   rN  9  sF    

		
			
		
rN  r  z%os.sendfile() required for this test.c                   @   r  )SendfileUsingSendfileTestzB
    Test the sendfile() implementation of socket.sendfile().
    c                 C   r_  )Nr  ra  r  r   r   r   rb  F  r  z(SendfileUsingSendfileTest.meth_from_sockN)rN   rO   rP   rf   rb  r   r   r   r   r  @  s    r  zAF_ALG requiredc                   @   s|   e Zd Zdd Zedddd Zdd Zedd	d
d Zedddd Z	edd	dd Z
dd Zdd ZdS )LinuxKernelCryptoAPIc              
   C   sZ   t  t jt jd}z
|||f W |S  ty, } z|  tt|||d }~ww r   )	r   r.   r+   ro   r  r   r   ZSkipTestr<  )rG   typr1  r  r   r   r   r   
create_algM  s   zLinuxKernelCryptoAPI.create_algrc  r  c              	   C   s  t d}| ddr}| \}}| |d | |d| W d    n1 s-w   Y  | \}}|+ |dtj	 |dtj	 |dtj	 |d	 | |d| W d    n1 shw   Y  W d    d S W d    d S 1 sw   Y  d S )
NZ@ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015adhashZsha256s   abcr     a   b   crM  )
r  fromhexr  r   rB  r   r   r   r   MSG_MORErG   rU  algoopr   r   r   r   test_sha256Z  s$   


"z LinuxKernelCryptoAPI.test_sha256c              	   C   s   t d}| dd@}|tjtjd | \}}| |d | 	|
d| W d    n1 s6w   Y  W d    d S W d    d S 1 sNw   Y  d S )NZ(effcdf6ae5eb2fa2d27416d5f184df9c259a7c79r  z
hmac(sha1)s   Jefes   what do ya want for nothing?r  )r  r  r  r  r   SOL_ALGALG_SET_KEYr   rB  r   r   r  r   r   r   test_hmac_sha1l  s   

"z#LinuxKernelCryptoAPI.test_hmac_sha1rB  c              	   C   s"  t d}t d}d}t d}t|}| dd}|tjtj| | \}}|  |j	tj
|tjd || | ||| W d    n1 sPw   Y  | \}}| |j	|gtj|d | ||| W d    n1 s{w   Y  d	}	|g|	 }
| \}}| |j	|
tj
|d |||	 }W d    n1 sw   Y  | t|||	  | |d | | | \}}| |j	|gtj|d |||	 }W d    n1 sw   Y  | t|||	  | |||	  W d    d S 1 s
w   Y  d S )
NZ 06a9214036b8a15b512e03d534120006Z 3dafba429d9eb430b422da802c9fac41s   Single block msgZ e353779c1079aeb82708942dbe77181aZskcipherzcbc(aes))r  ivr$  )r  r  r   )r  r  r(  r  r  r   r  r  r   sendmsg_afalgALG_OP_ENCRYPTr  rB  r   r   ALG_OP_DECRYPT)rG   keyr  r   Z
ciphertextZmsglenr  r  r   Z
multiplierZlongmsgencZdecr   r   r   test_aes_cbcw  sV   





$z!LinuxKernelCryptoAPI.test_aes_cbcr  c                 C   s.  t d}t d}t d}t d}t d}t d}t|}t|}| dd_}	|	tjtj| |	tjtjd | |		 \}
}|
@ |
j
tj||tjd	 |
|tj |
| |
|t| | }| ||||   | ||| d   W d    n1 sw   Y  |		 \}
}|
8 || }|
j
|gtj||d
 |
|t| | }| ||||   | ||| d   W d    n1 sw   Y  tdj}|		 \}
}|
O || }|
|gtjtj|tjgtjtj|t|| gtjtj||gf |
t|| }| ||||   | ||| d   W d    n	1 s:w   Y  |		 \}
}|
, || | }|
j
|gtj||d
 |
t|| }| |||d   W d    n1 sww   Y  W d    d S W d    d S 1 sw   Y  d S )NZ c939cc13397c1d37de6ae0e1cb7c423cZb3d8cc017cbb89b39e0f67e2Z c3b3c41f113a31b73d9a5cd432103069Z 24825602bd12a984e0092d3e448eda5fZ 93fe7d9e9bfd10348a5606e5cafa7354Z 0032a1dc85f1c9786925a2e71d8272ddZaeadzgcm(aes))r  r  assoclenr$  )r  r  r  r   )r  r  r(  r  r  r   r  r  ZALG_SET_AEAD_AUTHSIZEr   r  r  r  rB  r   r   r   Structr  r  Z
ALG_SET_OPZ
ALG_SET_IVZALG_SET_AEAD_ASSOCLENr  )rG   r  r  ZplainZassocZexpected_ctZexpected_tagZtaglenr  r  r  r   resr   Zpack_uint32r   r   r   test_aead_aes_gcm  sz   








	 ,$z&LinuxKernelCryptoAPI.test_aead_aes_gcmc              	   C   s   |  ddD}td}|tjtj| | \}}| |d}| 	t
|d W d    n1 s5w   Y  W d    d S W d    d S 1 sMw   Y  d S )NrngZdrbg_pr_sha256r  )r  r   urandomr  r   r  r  r   r   r   r(  )rG   r  Z
extra_seedr  r   Zrnr   r   r   test_drbg_pr_sha256  s   

"z(LinuxKernelCryptoAPI.test_drbg_pr_sha256c              	   C   s\  t  t jt jd}| | t |  W d    n1 s w   Y  | t |jd d W d    n1 s;w   Y  | t |d W d    n1 sUw   Y  | t |jt jd d W d    n1 srw   Y  | t |jt jdd W d    n1 sw   Y  W d    d S W d    d S 1 sw   Y  d S )Nr   )r  r   )r  r  r  )r   r.   r+   r\  r   r  r  r  r   r   r   test_sendmsg_afalg_args  s(   
"z,LinuxKernelCryptoAPI.test_sendmsg_afalg_argsc                 C   s   t  t jt jd}| |j | t |d W d    n1 s$w   Y  | t	d |d W d    n1 s?w   Y  | t |d W d    n1 sYw   Y  | t	d |d W d    d S 1 suw   Y  d S )Nr   )Ztttttttttttttr1  ztype too long)Zttttttttttttttr1  )r&  Z?nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnzname too long)r&  Z@nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn)
r   r.   r+   rc   r   r\  r  ro   rf  r  r  r   r   r   test_length_restriction  s   "z,LinuxKernelCryptoAPI.test_length_restrictionN)rN   rO   rP   r  r   rI  r  r  r  r  r  r  r  r   r   r   r   r  J  s    




(

>

r  ru  rv  c                   @   rS   )TestMacOSTCPFlagsc                 C   s   |  tj d S r8   )rE  r   TCP_KEEPALIVErF   r   r   r   test_tcp_keepalive  r  z$TestMacOSTCPFlags.test_tcp_keepaliveN)rN   rO   rP   r  r   r   r   r   r    rU   r  winzrequires Windowsc                   @   s   e Zd Zh dZdd ZdS )TestMSWindowsTCPFlags>   ZTCP_KEEPIDLETCP_FASTOPENTCP_KEEPCNTTCP_NODELAY
TCP_MAXSEGTCP_KEEPINTVLc                    s6   dd t tD } fdd|D } g |d d S )Nc                 S   s   g | ]	}| d r|qS )ZTCP)r  r0  r!   r   r   r   r2  $  r3  z<TestMSWindowsTCPFlags.test_new_tcp_flags.<locals>.<listcomp>c                    s   g | ]	}| j vr|qS r   )knownTCPFlagsr  rF   r   r   r2  %  r3  zANew TCP flags were discovered. See bpo-32394 for more information)r  r   r   )rG   Zprovidedunknownr   rF   r   test_new_tcp_flags#  s
   z(TestMSWindowsTCPFlags.test_new_tcp_flagsN)rN   rO   rP   r  r  r   r   r   r   r    r%  r  c                   @   s   e Zd Zdd Zdd Zdd Zeee	d pee	d d	e
ejd
dd Zee  de
ejd
dd ZdS )CreateServerTestc                 C   s   t  }td|f}| | d d | | d | W d    n1 s*w   Y  t jrctjd|ftjd}| | d d | | d | W d    d S 1 s\w   Y  d S d S )NrK  r   r   r  r"  )r   r  r   create_serverr   r   r)  r  rG   rD   r  r   r   r   test_address-  s   
"zCreateServerTest.test_addressc                 C   s   t d}| |jt j | |jt j W d    n1 s w   Y  tjrSt jdt j	d}| |jt j	 | |jt j W d    d S 1 sLw   Y  d S d S )NrJ  r  r   r"  )
r   r  r   rS  rA   r&  r5   r   r)  r  )rG   r  r!   r   r   r   test_family_and_type8  s   "z%CreateServerTest.test_family_and_typec                 C   s   t tds$| t tjddd W d    d S 1 sw   Y  d S td}|tjtj}| |d W d    n1 sBw   Y  tjddd}|tjtj}| 	|d W d    d S 1 shw   Y  d S )NSO_REUSEPORT)r  r   T)
reuse_portr   )
r   r   r\  r  r  r  rj  r  r   r%  )rG   r  r  r   r   r   test_reuse_portA  s   
""z CreateServerTest.test_reuse_portro  IPV6_V6ONLYz IPV6_V6ONLY option not supportedrw  c                 C   sJ   t jdt jd}|t jt jsJ W d    d S 1 sw   Y  d S )Nr  r"  )r   r  r  r  ro  r  r  r   r   r   test_ipv6_only_defaultM  s   "z'CreateServerTest.test_ipv6_only_defaultdualstack_ipv6 not supportedc                 C   sH   t jdt jdd}| |jt j W d    d S 1 sw   Y  d S )Nr  TrS  dualstack_ipv6)r   r  r  r   rS  r  r   r   r   test_dualstack_ipv6_familyU  s   
"z+CreateServerTest.test_dualstack_ipv6_familyN)rN   rO   rP   r  r  r  r   r  r   rD  r  r   r)  r  r   has_dualstack_ipv6r  r   r   r   r   r  +  s    	
r  c                   @   s   e Zd ZejZdd Zdd Zdd Zdd Z	d	d
 Z
eejddd Zee  deejddd Zee  deejddd ZdS )CreateServerFunctionalTestc                 C   s
   d | _ d S r8   )r   rF   r   r   r   rH   a  r  z CreateServerFunctionalTest.setUpc                 C   s    | j d ur| j | j d S d S r8   )r   r9  r;   rF   r   r   r   rK   d  s   
z#CreateServerFunctionalTest.tearDownc                    sJ    fdd}t   |j t j||fd_j     d S )Nc              	      s   | J |   \}}|)  j |d}|s(	 W d    W d    d S || W d    n1 s7w   Y  W d    d S W d    d S 1 sOw   Y  d S r   )r   r   r;   r   rB  )r  r   r   r   r.  rG   r   r   runi  s   
"z3CreateServerFunctionalTest.echo_server.<locals>.runr=  )rY   r   r  r;   r  r   r  r~   )rG   r  r  r   r  r   echo_serverh  s   

z&CreateServerFunctionalTest.echo_serverc                 C   sd   t j |d"}|| j || |d | |dd W d    d S 1 s+w   Y  d S )Nr"  ra  r   )r   r  r;   r   rB  r   r   )rG   r   rS  r  r   r   r   echo_clienty  s   

"z&CreateServerFunctionalTest.echo_clientc                 C   sX   t  }td|f}| | | d|ftj W d    d S 1 s%w   Y  d S )Nr`  rK  )r   r  r   r  r  r  rA   r  r   r   r   	test_tcp4  s
   
"z$CreateServerFunctionalTest.test_tcp4rw  c                 C   s^   t  }tjd|ftjd}| | | d|ftj W d    d S 1 s(w   Y  d S )Nr`  r"  r  r   r  r   r  r  r  r  r  r   r   r   	test_tcp6  s   

"z$CreateServerFunctionalTest.test_tcp6r  c                 C   s`   t  }tjd|ftjdd}| | | d|ftj W d    d S 1 s)w   Y  d S )Nr`  Tr  rK  )r   r  r   r  r  r  r  rA   r  r   r   r   test_dual_stack_client_v4     
"z4CreateServerFunctionalTest.test_dual_stack_client_v4c                 C   s`   t  }tjd|ftjdd}| | | d|ftj W d    d S 1 s)w   Y  d S )Nr`  Tr  r  r  r  r   r   r   test_dual_stack_client_v6  r  z4CreateServerFunctionalTest.test_dual_stack_client_v6N)rN   rO   rP   r   r  r;   rH   rK   r  r  r  r   r  r   r)  r  r  r   r  r  r  r   r   r   r   r  ^  s&    
	r  send_fdsrecv_fdsc                   @   rS   )SendRecvFdsTestsc              	   C   sj  dd }dd }dd t dD }| || dd |D }ttjtj\}}|; |) t|tg| t|t	td	 t	|d	 \}}}	}
| || W d    n1 sYw   Y  W d    n1 shw   Y  | 
|t | 
t	|t	| | 
|	d
 t|D ]\}}|\}}t|t|  qt|D ]\}}t|d}| 
|t|  qd S )Nc                 S   s&   | D ]\}}t | t | qd S r8   r   r   )pipesr\  fd2r   r   r   close_pipes  s   
z8SendRecvFdsTests.testSendAndRecvFds.<locals>.close_pipesc                 S   s   | D ]}t | qd S r8   r  )r5  r  r   r   r   	close_fds  s   z6SendRecvFdsTests.testSendAndRecvFds.<locals>.close_fdsc                 S   rL  r   )r   pipe)r0  r   r   r   r   r2        z7SendRecvFdsTests.testSendAndRecvFds.<locals>.<listcomp>r  c                 S   s   g | ]\}}|qS r   r   )r0  rfdwfdr   r   r   r2    r  r   r   r  )rh  rc   r   r   r  r5   r  r   r  r(  r   r7  r   r2  r<  r3  rO  )rG   r  r  r  r5  Zsock1Zsock2r   Zfds2r$  r   r  r  r  r  r   r   r   testSendAndRecvFds  s.   & z#SendRecvFdsTests.testSendAndRecvFdsN)rN   rO   rP   r  r   r   r   r   r    r  r  c                  C   sx  t ttttttttt	t
tg} | ttttttttttttttg | t | t | t | tt g | t!t"g | t#t$g | t% | t& | t't(g | t) | g t*t+t,t-t.t/t0t1t2t3t4t5t6t7t8t9t:t;t<t=t>t?t@tAtBtCtDtEtFtGtHtItJ | tK | tL tMN }tOjP|   tMjQ|  d S r8   )RrC  r;  r  r  r  r  r  rb  r  r  r  r  extendr-  rJ  r  r  r  r  r  r  r  r  r  r  r&  r3  r4  r&  r  r  r  r  r  r  r  r  r  r  r+  r   r1  r$  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r8  rN  r  r  r  r   Zthreading_setupr   Zrun_unittestZthreading_cleanup)Zteststhread_infor   r   r   	test_main  s   





	
 !"
$

r  __main__)r   testr   Ztest.supportr   r   r   r  ro  r  r   r  r   r   r  r   r  r   r  r  r  weakrefr   r?  r8  ri  r   rR  r  rT  _threadr   rY   r>  r  r   r   r3  r   r   systemr	   rD  r   r"   r&   r(   r,   r/   r1   r3   r7   r  r<   ZHAVE_SOCKET_CANZHAVE_SOCKET_CAN_ISOTPZHAVE_SOCKET_CAN_J1939ZHAVE_SOCKET_RDSZHAVE_SOCKET_ALGZHAVE_SOCKET_QIPCRTRZHAVE_SOCKET_VSOCKr   ZHAVE_SOCKET_UDPLITEZHAVE_SOCKET_BLUETOOTHr)  rD  r   r@   rQ   rT   rV   rh   rv   rx   r   r   r  r   r   r   r  r   r   r   r   r   r   r   r   r	  r  r  r  r  r  r  r  r  r.  r;  rB  rC  r  r  r  r  r  r  r  r+  r1  r;  rb  rr  rs  r  r  r  r  r  r  r  r  r  r  r
  r  r  r$  r0  r  r  r  r  r  r  r)  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r&  r-  rJ  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r&  r3  r1  r8  rN  r  r  r  r  r  r  r  r  r  rN   r   r   r   r   <module>   sf   







	

3u!$	
        
b
S
Z
*
=
>.%{7ww= #P;  k   7



	







	





















 )7# ! $l


	?G9)ES',C<e  	 D3
F
'O
