§
    Čtŗf(  ć                   óT   d Z ddlZddlZddlZddlZddlmZmZmZmZ ddl	m
Z
mZmZmZm	Z	 ddlmZ 	 ddl	mZmZ dZn# e$ r dZY nw xY wdd	lmZ dd
lmZ ddlmZmZ ddlmZ ddlmZ ddlm Z  ddl!m"Z" ddl#m$Z$  e"j%        ¦   «         r	ddl	m&Z& dZ'ndZ'	 ddl(m)Z)m*Z*m+Z+m,Z, dZ-dZ.n# e$ r dZ-dZ.Y nw xY w G d d¦  «        Z/d Z0 G d de1¦  «        Z2 G d de¦  «        Z3d Z4 ee-e.¦  «         G d de$¦  «        ¦   «         Z5 ee-e.¦  «         G d d e$¦  «        ¦   «         Z6dS )!z&
Tests for L{twisted.python.sendmsg}.
é    N)ŚcloseŚpathsepŚpipeŚread)ŚAF_INETŚAF_INET6Ś
SOL_SOCKETŚerrorŚsocket)Śpack)ŚAF_UNIXŚ
socketpairFT)ŚskipIf)Śreactor)ŚDeferredŚinlineCallbacks)ŚProcessDone)ŚProcessProtocol)ŚFilePath)Śplatform)ŚTestCase)ŚMSG_DONTWAIT)Ś
SCM_RIGHTSŚgetSocketFamilyŚrecvmsgŚsendmsgŚ z!Platform doesn't support sendmsg.c                   ó6    e Zd ZdZd Zd Zd Zd Zd Zd Z	dS )	Ś	_FDHolderzP
    A wrapper around a FD that will remember if it has been closed or not.
    c                 ó    || _         d S ©N©Ś_fd)ŚselfŚfds     ś_/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/twisted/python/test/test_sendmsg.pyŚ__init__z_FDHolder.__init__:   s    Ųó    c                 ó    | j         S )z/
        Return the fileno of this FD.
        r"   ©r$   s    r&   Śfilenoz_FDHolder.fileno=   s    š xr(   c                 óN    | j         rt          | j         ¦  «         d| _         dS dS )zH
        Close the FD. If it's already been closed, do nothing.
        N)r#   r   r*   s    r&   r   z_FDHolder.closeC   s0    š 8š 	Ż$(OOOŲDHHHš	š 	r(   c                 ó    | j         r9t          j        d| j          dt          ¦  «         |                      ¦   «          dS dS )z>
        If C{self._fd} is unclosed, raise a warning.
        zFD z was not closed!N)r#   ŚwarningsŚwarnŚResourceWarningr   r*   s    r&   Ś__del__z_FDHolder.__del__K   sI    š 8š 	ŻMŠ: ¤Š:Š:Š:½OŃLŌLŠLŲJJLLLLLš	š 	r(   c                 ó    | S r!   © r*   s    r&   Ś	__enter__z_FDHolder.__enter__S   s    Ųr(   c                 ó.    |                       ¦   «          d S r!   )r   )r$   Śexc_typeŚ	exc_valueŚ	tracebacks       r&   Ś__exit__z_FDHolder.__exit__V   s    Ų

r(   N)
Ś__name__Ś
__module__Ś__qualname__Ś__doc__r'   r+   r   r1   r4   r9   r3   r(   r&   r   r   5   sx        šš šš š šš š šš š šš š šš š šš š š š r(   r   c                  ó`    t          ¦   «         \  } }t          | ¦  «        t          |¦  «        fS )zI
    Create a pipe, and return the two FDs wrapped in L{_FDHolders}.
    )r   r   )ŚrŚws     r&   Ś	_makePiperA   Z   s(    õ 66DAqŻaLL) A,,Š'Š'r(   c                   ó    e Zd ZdZdefdZdS )ŚExitedWithStderrz,
    A process exited with some stderr.
    Śreturnc                 óv    d                      dgt          | j        ¦  «        z   ¦  «        }t          |¦  «        S )zY
        Dump the errors in a pretty way in the event of a subprocess traceback.
        ó   
r(   )ŚjoinŚlistŚargsŚrepr©r$   Śresults     r&   Ś__str__zExitedWithStderr.__str__g   s0    š SE„DØ¬”O¤OŃ3Ń4Ō4ŻF||Šr(   N)r:   r;   r<   r=   ŚstrrM   r3   r(   r&   rC   rC   b   s9        šš šš š š š š š r(   rC   c                   ó0    e Zd ZdZd Zd Zd Zd Zd ZdS )ŚStartStopProcessProtocolaų  
    An L{IProcessProtocol} with a Deferred for events where the subprocess
    starts and stops.

    @ivar started: A L{Deferred} which fires with this protocol's
        L{IProcessTransport} provider when it is connected to one.

    @ivar stopped: A L{Deferred} which fires with the process output or a
        failure if the process produces output on standard error.

    @ivar output: A C{str} used to accumulate standard output.

    @ivar errors: A C{str} used to accumulate standard error.
    c                 ón    t          ¦   «         | _        t          ¦   «         | _        d| _        d| _        d S )Nr(   )r   ŚstartedŚstoppedŚoutputŚerrorsr*   s    r&   r'   z!StartStopProcessProtocol.__init__   s*    ŻzzŻzzŲŲr(   c                 óD    | j                              | j        ¦  «         d S r!   )rR   ŚcallbackŚ	transportr*   s    r&   ŚconnectionMadez'StartStopProcessProtocol.connectionMade   s     Ų×ŅdnŃ-Ō-Š-Š-Š-r(   c                 ó&    | xj         |z  c_         d S r!   )rT   ©r$   Śdatas     r&   ŚoutReceivedz$StartStopProcessProtocol.outReceived   ó    ŲtŃr(   c                 ó&    | xj         |z  c_         d S r!   )rU   r[   s     r&   ŚerrReceivedz$StartStopProcessProtocol.errReceived   r^   r(   c                 óą    |                      t          ¦  «        r!| j                             | j        ¦  «         d S | j                             t          | j        | j        ¦  «        ¦  «         d S r!   )Ścheckr   rS   rW   rT   ŚerrbackrC   rU   )r$   Śreasons     r&   ŚprocessEndedz%StartStopProcessProtocol.processEnded   s`    Ų<<Ń$Ō$š 	MŲL×!Ņ! $¤+Ń.Ō.Š.Š.Š.ąL× Ņ Õ!1°$“+øt¼{Ń!KŌ!KŃLŌLŠLŠLŠLr(   N)	r:   r;   r<   r=   r'   rY   r]   r`   re   r3   r(   r&   rP   rP   o   sn        šš šš š š.š .š .šš š šš š šMš Mš Mš Mš Mr(   rP   c                 óž   t          t          j        ¦  «                             ¦   «         j        }t          t          j        ¦  «        }t          t          j	        t          j        ¦  «        ¦  «                             ¦   «         j        |d<   t          ¦   «         }t          j        |||t          t          ¦  «                             | dz   ¦  «                             ¦   «         j        dg|ddd|d¬¦  «         |S )zń
    Start a script that is a peer of this test as a subprocess.

    @param script: the module name of the script in this directory (no
        package prefix, no '.py')
    @type script: C{str}

    @rtype: L{StartStopProcessProtocol}
    Ś
PYTHONPATHz.pys   17r@   r?   )r   é   é   é   )ŚenvŚchildFDs)r   ŚsysŚ
executableŚ
asTextModeŚpathŚdictŚosŚenvironr   rG   rP   r   ŚspawnProcessŚ__file__Śsibling)ŚscriptŚoutputFDŚpyExerk   Śsspps        r&   Ś_spawnr{      sŪ    õ S^Ń$Ō$×/Ņ/Ń1Ō1Ō6EŻ
rzŃ
Ō
CŻ „¤­c¬hŃ!7Ō!7Ń8Ō8×CŅCŃEŌEŌJCŃŻ#Ń%Ō%DŻŌŲŲąŻXŃŌ×&Ņ& v°”~Ń6Ō6×AŅAŃCŌCŌHŲš	
š
 ŲS SØhŠ7Š7š
ń 
ō 
š 
š Kr(   c                   ó|    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
 eed	¦  «        d
 ¦   «         Zed ¦   «         ZdS )ŚSendmsgTestszB
    Tests for the Python2/3 compatible L{sendmsg} interface.
    c                 óH    t          t          ¦  «        \  | _        | _        dS )z0
        Create a pair of UNIX sockets.
        N)r   r   ŚinputrT   r*   s    r&   ŚsetUpzSendmsgTests.setUp·   s    õ #-­WŃ"5Ō"5Ń
DKKKr(   c                 ój    | j                              ¦   «          | j                             ¦   «          dS )z4
        Close the sockets opened by setUp.
        N)r   r   rT   r*   s    r&   ŚtearDownzSendmsgTests.tearDown½   s2    š 	
×ŅŃŌŠŲ×ŅŃŌŠŠŠr(   c                 óÜ    | j                              ¦   «          |                      t          t          | j         d¦  «        }|                      |j        d         t          j        ¦  «         dS )z
        If the underlying C{sendmsg} call fails, L{send1msg} raises
        L{socket.error} with its errno set to the underlying errno value.
        ó   hello, worldr   N©	r   r   ŚassertRaisesr
   r   ŚassertEqualrI   ŚerrnoŚEBADF©r$   Śexcs     r&   Śtest_syscallErrorzSendmsgTests.test_syscallErrorÄ   sW    š
 	
×ŅŃŌŠŲ×Ņ„„w°“
øOŃLŌLŲ×Ņ !„e¤kŃ2Ō2Š2Š2Š2r(   c                 óā    | j                              ¦   «          |                      t          t          | j         ddgd¦  «        }|                      |j        d         t          j        ¦  «         dS )z
        The behavior when the underlying C{sendmsg} call fails is the same
        whether L{sendmsg} is passed ancillary data or not.
        r   )r   r   s   0123r   Nr   r   s     r&   Ś#test_syscallErrorWithControlMessagez0SendmsgTests.test_syscallErrorWithControlMessageĶ   se    š
 	
×ŅŃŌŠŲ×ŅŻ7DJØø/Š9JČAń
ō 
š 	×Ņ !„e¤kŃ2Ō2Š2Š2Š2r(   c                 ó@   d}|                       t          |¦  «        t          | j        |¦  «        ¦  «         t	          | j        ¦  «        }|                       |j        d¦  «         |                       |j        d¦  «         |                       |j        g ¦  «         dS )zI
        L{recvmsg} will retrieve a message sent via L{sendmsg}.
        ó   hello, world!r   N)	r   Ślenr   r   r   rT   r\   ŚflagsŚ	ancillary)r$   ŚmessagerL   s      r&   Śtest_roundtripzSendmsgTests.test_roundtripŲ   s    š #Ų×ŅW„wØt¬zø7Ń'CŌ'CŃDŌDŠDåŃ%Ō%Ų×ŅŠ&6Ń7Ō7Š7Ų×Ņ qŃ)Ō)Š)Ų×ŅŌ)Ø2Ń.Ō.Š.Š.Š.r(   c                 óV   ddz  dz  }| j                              d¦  «         t          | j         |¦  «        }|                      |t	          |¦  «        k     ¦  «         t          | j        t	          |¦  «        ¦  «        }|                      t	          |d         ¦  «        |¦  «         dS )zS
        L{sendmsg} returns the number of bytes which it was able to send.
        ó   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxé   é   Fr   N)r   Śsetblockingr   Ś
assertTruer   r   rT   r   )r$   r   ŚsentŚreceiveds       r&   Śtest_shortsendzSendmsgTests.test_shortsendä   s    š  Ń$ rŃ)Ų
×ŅuŃ%Ō%Š%Żtz 7Ń+Ō+š
 	s 7||Ņ+Ń,Ō,Š,Ż4;­ØG©¬Ń5Ō5Ų×ŅX a[Ń)Ō)Ø4Ń0Ō0Š0Š0Š0r(   c                 ó    t          | j        dg d¦  «         t          | j        ¦  «        }|                      |dg df¦  «         dS )z
        L{sendmsg} treats an empty ancillary data list the same way it treats
        receiving no argument for the ancillary parameter at all.
        r   r   N)r   r   r   rT   r   rK   s     r&   Śtest_roundtripEmptyAncillaryz)SendmsgTests.test_roundtripEmptyAncillaryó   sN    õ
 	
Š,Øb°!Ń4Ō4Š4åŃ%Ō%Ų×ŅŠ"2°BøŠ!:Ń;Ō;Š;Š;Š;r(   z7MSG_DONTWAIT is only known to work as intended on Linuxc                 ó   t          d¦  «        D ]c}	 t          | j        dt          ¬¦  «          # t          $ r7}|                      |j        d         t          j        ¦  «         Y d}~ dS d}~ww xY w|  	                    d¦  «         dS )z­
        The C{flags} argument to L{sendmsg} is passed on to the underlying
        C{sendmsg} call, to affect it in whatever way is defined by those
        flags.
        i    r   )r   r   NzHFailed to fill up the send buffer, or maybe send1msg blocked for a while)
Śranger   r   r   ŚOSErrorr   rI   r   ŚEAGAINŚfail)r$   ŚiŚes      r&   Ś
test_flagszSendmsgTests.test_flagsż   s«    õ xš 
	š 
	AšŻ
 Kµ|ŠDŃDŌDŠDŠDųŻš š š Ų× Ņ  ¤Ø¤­E¬LŃ9Ō9Š9Ųųųųųšųųųš IIš8ńō š š š s   0°
A1ŗ+A,Į,A1c              #   ó  K   t          d| j                             ¦   «         ¦  «        }|j        V  t	          ¦   «         \  }}|                      |j        ¦  «         |                      |j        ¦  «         |5  t          | j        dt          t          t          d|                     ¦   «         ¦  «        fg¦  «         ddd¦  «         n# 1 swxY w Y   |j        V  |                      t          |                     ¦   «         d¦  «        d¦  «         |                      t          |                     ¦   «         d¦  «        d¦  «         dS )zī
        Calling L{sendmsg} with SOL_SOCKET, SCM_RIGHTS, and a platform-endian
        packed file descriptor number should send that file descriptor to a
        different process, where it can be retrieved by using L{recv1msg}.
        Śpullpipes   blonkr¦   Nr   s   Test fixture data: blonk.
r(   )r{   rT   r+   rR   rA   Ś
addCleanupr   r   r   r	   r   r   rS   r   r   )r$   rz   ŚpipeOutŚpipeIns       r&   Śtest_sendSubProcessFDz"SendmsgTests.test_sendSubProcessFD  sg  č č  õ j $¤+×"4Ņ"4Ń"6Ō"6Ń7Ō7ŲlŠŠŠŻ#++ŲŃ&Ō&Š&ŲŃ%Ō%Š%ąš 	š 	ŻŲ
ŲŻj­$Øs°F·M²M±O“OŃ*DŌ*DŠEŠFńō š š	š 	š 	ń 	ō 	š 	š 	š 	š 	š 	š 	ųųųš 	š 	š 	š 	š lŠŠŠŲ×ŅgnnŃ.Ō.°Ń5Ō5Š7UŃVŌVŠVą×ŅgnnŃ.Ō.°Ń5Ō5°sŃ;Ō;Š;Š;Š;s   Į:ACĆCĆCN)r:   r;   r<   r=   r   r   r   r   r   r   r    r   ŚdontWaitSkiprØ   r   r®   r3   r(   r&   r}   r}   ±   sĢ        šš š6š 6š 6šš š š3š 3š 3š	3š 	3š 	3š
/š 
/š 
/š1š 1š 1š<š <š <š VLŠSŃTŌTšš ń UŌTšš* š<š <ń _š<š <š <r(   r}   c                   óN    e Zd ZdZd Zd Zd Z eed¦  «        d ¦   «         Z	dS )ŚGetSocketFamilyTestsz'
    Tests for L{getSocketFamily}.
    c                 óX    t          |¦  «        }|                      |j        ¦  «         |S )zĆ
        Create a new socket using the given address family and return that
        socket's file descriptor.  The socket will automatically be closed when
        the test is torn down.
        )r   r«   r   )r$   ŚaddressFamilyŚss      r&   Ś_socketzGetSocketFamilyTests._socket3  s*    õ =Ń!Ō!ŲŃ Ō Š Ųr(   c                 ó    |                       t          t          |                      t          ¦  «        ¦  «        ¦  «         dS )z
        When passed the file descriptor of a socket created with the C{AF_INET}
        address family, L{getSocketFamily} returns C{AF_INET}.
        N)r   r   r   rµ   r*   s    r&   Ś	test_inetzGetSocketFamilyTests.test_inet=  s4    š
 	×Ņ„/°$·,²,½wŃ2GŌ2GŃ"HŌ"HŃIŌIŠIŠIŠIr(   c                 ó    |                       t          t          |                      t          ¦  «        ¦  «        ¦  «         dS )z
        When passed the file descriptor of a socket created with the
        C{AF_INET6} address family, L{getSocketFamily} returns C{AF_INET6}.
        N)r   r   r   rµ   r*   s    r&   Ś
test_inet6zGetSocketFamilyTests.test_inet6D  s4    š
 	×Ņ„?°4·<²<ÅŃ3IŌ3IŃ#JŌ#JŃKŌKŠKŠKŠKr(   z)Platform does not support AF_UNIX socketsc                 ó    |                       t          t          |                      t          ¦  «        ¦  «        ¦  «         dS )z
        When passed the file descriptor of a socket created with the C{AF_UNIX}
        address family, L{getSocketFamily} returns C{AF_UNIX}.
        N)r   r   r   rµ   r*   s    r&   Ś	test_unixzGetSocketFamilyTests.test_unixK  s4    š 	×Ņ„/°$·,²,½wŃ2GŌ2GŃ"HŌ"HŃIŌIŠIŠIŠIr(   N)
r:   r;   r<   r=   rµ   r·   r¹   r   ŚnonUNIXSkipr»   r3   r(   r&   r±   r±   -  s        šš šš š šJš Jš JšLš Lš Lš VKŠDŃEŌEšJš Jń FŌEšJš Jš Jr(   r±   )7r=   r   rr   rm   r.   r   r   r   r   r   r   r   r	   r
   Śstructr   r   r   r¼   ŚImportErrorŚunittestr   Śtwisted.internetr   Śtwisted.internet.deferr   r   Śtwisted.internet.errorr   Śtwisted.internet.protocolr   Śtwisted.python.filepathr   Śtwisted.python.runtimer   Śtwisted.trial.unittestr   ŚisLinuxr   rÆ   Śtwisted.python.sendmsgr   r   r   r   ŚdoImportSkipŚimportSkipReasonr   rA   Ś	ExceptionrC   rP   r{   r}   r±   r3   r(   r&   ś<module>rĢ      s\  ššš š Ų 				Ų 



Ų Ų )Š )Š )Š )Š )Š )Š )Š )Š )Š )Š )Š )Ų ?Š ?Š ?Š ?Š ?Š ?Š ?Š ?Š ?Š ?Š ?Š ?Š ?Š ?Ų Š Š Š Š Š šŲ*Š*Š*Š*Š*Š*Š*Š*š KKųš š š š ŲKKKšųųųš
 Š Š Š Š Š ą $Š $Š $Š $Š $Š $Ų <Š <Š <Š <Š <Š <Š <Š <Ų .Š .Š .Š .Š .Š .Ų 5Š 5Š 5Š 5Š 5Š 5Ų ,Š ,Š ,Š ,Š ,Š ,Ų +Š +Š +Š +Š +Š +Ų +Š +Š +Š +Š +Š +ą8ŌŃŌš Ų#Š#Š#Š#Š#Š#ąLLš LšŲTŠTŠTŠTŠTŠTŠTŠTŠTŠTŠTŠTš
 LŲŠŠųš š ;š ;š ;ŲLŲ:ŠŠŠš;ųųųš"š "š "š "š "ń "ō "š "šJ(š (š (š
š 
š 
š 
š 
yń 
ō 
š 
š#Mš #Mš #Mš #Mš #Mń #Mō #Mš #MšLš š š8 Š&Ń'Ō'šx<š x<š x<š x<š x<8ń x<ō x<ń (Ō'šx<šv Š&Ń'Ō'š#Jš #Jš #Jš #Jš #J8ń #Jō #Jń (Ō'š#Jš #Jš #Js!   “? æA	ĮA	ĀB* Ā*	B6Ā5B6