Ë
    oj  ã                   óæ   — d 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	m
Z
 ddlmZ  G d„ dej                  «      Z G d	„ d
ej                  «      Z G d„ dej                  «      Zy# e$ r dZY ŒUw xY w)z&
Tests for L{twisted.internet.fdesc}.
é    N)Úfdescznot supported on this platform)ÚuntilConcludes)Úunittestc                   ó   — e Zd ZdZd„ Zd„ Zy)ÚNonBlockingTestszE
    Tests for L{fdesc.setNonBlocking} and L{fdesc.setBlocking}.
    c                 óì  — t        j                  «       \  }}| j                  t         j                  |«       | j                  t         j                  |«       | j	                  t        j
                  |t
        j                  «      t         j                  z  «       t        j                  |«       | j                  t        j
                  |t
        j                  «      t         j                  z  «       y)zR
        L{fdesc.setNonBlocking} sets a file description to non-blocking.
        N)ÚosÚpipeÚ
addCleanupÚcloseÚassertFalseÚfcntlÚF_GETFLÚ
O_NONBLOCKr   ÚsetNonBlockingÚ
assertTrue©ÚselfÚrÚws      ú9/usr/lib/python3/dist-packages/twisted/test/test_fdesc.pyÚtest_setNonBlockingz$NonBlockingTests.test_setNonBlocking   s�   € ô �w‰w‹y‰ˆˆ1Ø�‰œŸ™ !Ô$Ø�‰œŸ™ !Ô$Ø×ÑœŸ™ Q¬¯©Ó6¼¿¹ÑFÔGÜ×Ñ˜QÔØ�‰œŸ™ A¤u§}¡}Ó5¼¿¹ÑEÕFó    c                 óŽ  — t        j                  «       \  }}| j                  t         j                  |«       | j                  t         j                  |«       t	        j
                  |«       t	        j                  |«       | j                  t        j                  |t        j                  «      t         j                  z  «       y)zK
        L{fdesc.setBlocking} sets a file description to blocking.
        N)r	   r
   r   r   r   r   ÚsetBlockingr   r   r   r   r   s      r   Útest_setBlockingz!NonBlockingTests.test_setBlocking'   sy   € ô �w‰w‹y‰ˆˆ1Ø�‰œŸ™ !Ô$Ø�‰œŸ™ !Ô$Ü×Ñ˜QÔÜ×Ñ˜!ÔØ×ÑœŸ™ Q¬¯©Ó6¼¿¹ÑFÕGr   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   © r   r   r   r      s   „ ñò	Gó	Hr   r   c                   óX   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zd„ Zd„ Zd„ Zy)ÚReadWriteTestsz<
    Tests for L{fdesc.readFromFD}, L{fdesc.writeToFD}.
    c                 óÂ   — t        j                  «       \  | _        | _        t	        j
                  | j                  «       t	        j
                  | j                  «       y)zG
        Create a non-blocking pipe that can be used in tests.
        N)r	   r
   r   r   r   r   ©r   s    r   ÚsetUpzReadWriteTests.setUp8   s;   € ô Ÿ™›‰ˆŒ�”Ü×Ñ˜TŸV™VÔ$Ü×Ñ˜TŸV™VÕ$r   c                 óÀ   — 	 t        j                  | j                  «       	 t        j                  | j                  «       y# t        $ r Y Œ,w xY w# t        $ r Y yw xY w)z
        Close pipes.
        N)r	   r   r   ÚOSErrorr   r%   s    r   ÚtearDownzReadWriteTests.tearDown@   sS   € ð	Ü�H‰H�T—V‘VÔð	Ü�H‰H�T—V‘VÕøô ò 	Ùð	ûô ò 	Ùð	ús"   ‚A ¢A Á	AÁAÁ	AÁAc                 óB   — t        j                  | j                  |«      S )z)
        Write data to the pipe.
        )r   Ú	writeToFDr   )r   Úds     r   ÚwritezReadWriteTests.writeM   s   € ô �‰˜tŸv™v qÓ)Ð)r   c                 ór   — g }t        j                  | j                  |j                  «      }|€|r|d   S y|S )z*
        Read data from the pipe.
        r   r   )r   Ú
readFromFDr   Úappend)r   ÚlÚress      r   ÚreadzReadWriteTests.readS   s<   € ð ˆÜ×Ñ˜tŸv™v q§x¡xÓ0ˆØˆ;ÙØ˜‘t�ààˆJr   c                 óÎ   — | j                  d«      }| j                  |dkD  «       | j                  «       }| j                  t	        |«      |«       | j                  dd| |«       y)z”
        Test that the number of bytes L{fdesc.writeToFD} reports as written
        with its return value are seen by L{fdesc.readFromFD}.
        s   hellor   N)r-   r   r3   ÚassertEqualÚlen)r   ÚnÚss      r   Útest_writeAndReadz ReadWriteTests.test_writeAndReada   sW   € ð
 �J‰J�xÓ ˆØ�‰˜˜A™ÔØ�I‰I‹KˆØ×Ñœ˜Q› Ô#Ø×Ñ˜ " 1˜ qÕ)r   c                 ó|  — ddz  }| j                  |«      }| j                  |dkD  «       g }d}d}||k  s|dk  rA|j                  | j                  «       «       |t	        |d   «      z  }|dz  }||k  rŒ;|dk  rŒAdj                  |«      }| j                  t	        |«      |«       | j                  |d| |«       y)	z}
        Similar to L{test_writeAndRead}, but use a much larger string to verify
        the behavior for that case.
        s
   0123456879i'  r   é2   éÿÿÿÿé   r   N)r-   r   r0   r3   r6   Újoinr5   )r   ÚorigÚwrittenÚresultÚresultlengthÚis         r   Útest_writeAndReadLargez%ReadWriteTests.test_writeAndReadLargel   sÀ   € ð
 ˜uÑ$ˆØ—*‘*˜TÓ"ˆØ�‰˜ !™Ô$ØˆØˆØˆØ˜WÒ$¨¨BªØ�M‰M˜$Ÿ)™)›+Ô&ØœC  r¡
›OÑ+ˆLà�‰FˆAð	 ˜WÓ$¨¨B«ð
 —‘˜&Ó!ˆØ×Ñœ˜V› gÔ.Ø×Ñ˜˜h˜w˜¨Õ0r   c                 ó¢   — g }t        j                  | j                  |j                  «      }| j	                  |g «       | j                  |«       y)z¨
        Verify that reading from a file descriptor with no data does not raise
        an exception and does not result in the callback function being called.
        N)r   r/   r   r0   r5   ÚassertIsNone)r   r1   rA   s      r   Útest_readFromEmptyz!ReadWriteTests.test_readFromEmpty€   sA   € ð
 ˆÜ×!Ñ! $§&¡&¨!¯(©(Ó3ˆØ×Ñ˜˜BÔØ×Ñ˜&Õ!r   c                 óž   — t        j                  | j                  «       | j                  | j	                  «       t
        j                  «       y)z†
        Test that using L{fdesc.readFromFD} on a cleanly closed file descriptor
        returns a connection done indicator.
        N)r	   r   r   r5   r3   r   ÚCONNECTION_DONEr%   s    r   Útest_readFromCleanClosez&ReadWriteTests.test_readFromCleanCloseŠ   ó0   € ô
 	�‰�—‘ÔØ×Ñ˜Ÿ™›¤e×&;Ñ&;Õ<r   c                 ó    — t        j                  | j                  «       | j                  | j	                  d«      t
        j                  «       y)z‰
        Verify that writing with L{fdesc.writeToFD} when the read end is closed
        results in a connection lost indicator.
        ó   sN)r	   r   r   r5   r-   r   ÚCONNECTION_LOSTr%   s    r   Útest_writeToClosedz!ReadWriteTests.test_writeToClosed’   ó3   € ô
 	�‰�—‘ÔØ×Ñ˜Ÿ™ DÓ)¬5×+@Ñ+@ÕAr   c                 óž   — t        j                  | j                  «       | j                  | j	                  «       t
        j                  «       y)zŠ
        Verify that reading with L{fdesc.readFromFD} when the read end is
        closed results in a connection lost indicator.
        N)r	   r   r   r5   r3   r   rN   r%   s    r   Útest_readFromInvalidz#ReadWriteTests.test_readFromInvalidš   rK   r   c                 ó    — t        j                  | j                  «       | j                  | j	                  d«      t
        j                  «       y)zŠ
        Verify that writing with L{fdesc.writeToFD} when the write end is
        closed results in a connection lost indicator.
        rM   N)r	   r   r   r5   r-   r   rN   r%   s    r   Útest_writeToInvalidz"ReadWriteTests.test_writeToInvalid¢   rP   r   c                 óP  — t         j                  }d„ }|t         _        	 | j                  | j                  d«      d«       |t         _        d„ }|t         _        	 | j                  | j                  d«      d«       |t         _        y# |t         _        w xY w# |t         _        w xY w)z8
        Test error path for L{fdesc.writeTod}.
        c                 óD   — t        «       }t        j                  |_        |‚©N)r(   ÚerrnoÚEAGAIN©ÚfdÚdataÚerrs      r   ÚeagainWritez4ReadWriteTests.test_writeErrors.<locals>.eagainWrite°   s   € Ü“)ˆCÜŸ™ˆCŒIØˆIr   rM   r   c                 óD   — t        «       }t        j                  |_        |‚rW   )r(   rX   ÚEINTRrZ   s      r   Ú
eintrWritez3ReadWriteTests.test_writeErrors.<locals>.eintrWrite»   s   € Ü“)ˆCÜŸ™ˆCŒIØˆIr   N)r	   r-   r5   )r   Ú
oldOsWriter^   ra   s       r   Útest_writeErrorszReadWriteTests.test_writeErrorsª   sˆ   € ô —X‘Xˆ
ò	ð
 ŒŒð	"Ø×Ñ˜TŸZ™Z¨Ó-¨qÔ1à!ŒBŒHò	ð
 ŒŒð	"Ø×Ñ˜TŸZ™Z¨Ó-¨qÔ1à!ŒB�Høð "ŒB�Hûð "ŒB�Hús    !B Á!B ÂBÂB%N)r   r   r   r    r&   r)   r-   r3   r9   rD   rG   rJ   rO   rR   rT   rc   r!   r   r   r#   r#   3   sE   „ ñò%òò*òò	*ò1ò("ò=òBò=òBó"r   r#   c                   ó&   — e Zd ZdZdZd„ Zd„ Zd„ Zy)ÚCloseOnExecTestszL
    Tests for L{fdesc._setCloseOnExec} and L{fdesc._unsetCloseOnExec}.
    zÆ
import os, errno
try:
    os.write(%d, b'lul')
except OSError as e:
    if e.errno == errno.EBADF:
        os._exit(0)
    os._exit(5)
except BaseException:
    os._exit(10)
else:
    os._exit(20)
c                 ó†  — t        j                  «       }|dk(  rS	 t        j                  t        j                  t        j                  d| j
                  |j                  «       fz  g«       y t        t         j                  |d«      d   S # t        $ r, dd l}|j                  «        t        j                  d«       Y y w xY w)Nr   z-cé   r=   )r	   ÚforkÚexecvÚsysÚ
executableÚprogramÚfilenoÚBaseExceptionÚ	tracebackÚ	print_excÚ_exitr   Úwaitpid)r   ÚfObjÚpidro   s       r   Ú_execWithFileDescriptorz(CloseOnExecTests._execWithFileDescriptorÚ   s‘   € Ü�g‰g‹iˆØ�!Š8ð	Ü—‘Ü—N‘NÜ—^‘^ T¨4¯<©<¸4¿;¹;»=Ð:JÑ+JÐKõô "¤"§*¡*¨c°1Ó5°aÑ8Ð8øô !ò Û à×#Ñ#Ô%Ü—‘˜–ð	ús   ›AB Â2C Â?C c                 ó\  — t        | j                  «       d«      5 }t        j                  |j	                  «       «       | j                  |«      }| j                  t        j                  |«      «       | j                  t        j                  |«      d«       ddd«       y# 1 sw Y   yxY w)z°
        A file descriptor passed to L{fdesc._setCloseOnExec} is not inherited
        by a new process image created with one of the exec family of
        functions.
        Úwbr   N)ÚopenÚmktempr   Ú_setCloseOnExecrm   ru   r   r	   Ú	WIFEXITEDr5   ÚWEXITSTATUS©r   rs   Ústatuss      r   Útest_setCloseOnExecz$CloseOnExecTests.test_setCloseOnExecì   s}   € ô �$—+‘+“- Ó&ð 	8¨$Ü×!Ñ! $§+¡+£-Ô0Ø×1Ñ1°$Ó7ˆFØ�O‰OœBŸL™L¨Ó0Ô1Ø×ÑœRŸ^™^¨FÓ3°QÔ7÷		8÷ 	8ñ 	8ús   ›A>B"Â"B+c                 ó¢  — t        | j                  «       d«      5 }t        j                  |j	                  «       «       t        j
                  |j	                  «       «       | j                  |«      }| j                  t        j                  |«      «       | j                  t        j                  |«      d«       ddd«       y# 1 sw Y   yxY w)z¦
        A file descriptor passed to L{fdesc._unsetCloseOnExec} is inherited by
        a new process image created with one of the exec family of functions.
        rw   é   N)rx   ry   r   rz   rm   Ú_unsetCloseOnExecru   r   r	   r{   r5   r|   r}   s      r   Útest_unsetCloseOnExecz&CloseOnExecTests.test_unsetCloseOnExecø   s‘   € ô
 �$—+‘+“- Ó&ð 	9¨$Ü×!Ñ! $§+¡+£-Ô0Ü×#Ñ# D§K¡K£MÔ2Ø×1Ñ1°$Ó7ˆFØ�O‰OœBŸL™L¨Ó0Ô1Ø×ÑœRŸ^™^¨FÓ3°RÔ8÷	9÷ 	9ñ 	9ús   ›B!CÃCN)r   r   r   r    rl   ru   r   rƒ   r!   r   r   re   re   Ç   s   „ ñð€Gò9ò$
8ó
9r   re   )r    rX   r	   rj   r   Útwisted.internetr   ÚImportErrorÚskipÚtwisted.python.utilr   Útwisted.trialr   ÚSynchronousTestCaser   r#   re   r!   r   r   ú<module>rŠ      sz   ðñó Û 	Û 
ð'Ûõ 'å .Ý "ôH�x×3Ñ3ô Hô8Q"�X×1Ñ1ô Q"ôh;9�x×3Ñ3õ ;9øðs ò ,Ø+‚Dð,ús   �A& Á&A0Á/A0