
    \d                         d Z ddlZddlZddlZ	 ddlZddlmZ n# e$ r dZY nw xY w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dS )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dS )NonBlockingTestszE
    Tests for L{fdesc.setNonBlocking} and L{fdesc.setBlocking}.
    c                    t          j                    \  }}|                     t           j        |           |                     t           j        |           |                     t          j        |t
          j                  t           j        z             t          j	        |           | 
                    t          j        |t
          j                  t           j        z             dS )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      7lib/python3.11/site-packages/twisted/test/test_fdesc.pytest_setNonBlockingz$NonBlockingTests.test_setNonBlocking   s     wyy1!$$$!$$$Q66FGGGQAu}55EFFFFF    c                    t          j                    \  }}|                     t           j        |           |                     t           j        |           t	          j        |           t	          j        |           |                     t          j        |t          j	                  t           j
        z             dS )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'   s     wyy1!$$$!$$$Q!Q66FGGGGGr   N)__name__
__module____qualname____doc__r   r    r   r   r   r      sD         	G 	G 	G	H 	H 	H 	H 	Hr   r   c                   Z    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dS )ReadWriteTestsz<
    Tests for L{fdesc.readFromFD}, L{fdesc.writeToFD}.
    c                     t          j                    \  | _        | _        t	          j        | j                   t	          j        | j                   dS )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   sC     TV$$$TV$$$$$r   c                     	 t          j        | j                   n# t          $ r Y nw xY w	 t          j        | j                   dS # t          $ r Y dS w xY w)z
        Close pipes.
        N)r	   r   r   OSErrorr   r%   s    r   tearDownzReadWriteTests.tearDown@   s{    	HTV 	 	 	D		HTV 	 	 	DD	s    
))A 
AAc                 6    t          j        | j        |          S )z)
        Write data to the pipe.
        )r   	writeToFDr   )r   ds     r   writezReadWriteTests.writeM   s     tvq)))r   c                 d    g }t          j        | j        |j                  }||r|d         S dS |S )z*
        Read data from the pipe.
        Nr   r   )r   
readFromFDr   append)r   lress      r   readzReadWriteTests.readS   s?     tvqx00; tsJr   c                    |                      d          }|                     |dk               |                                 }|                     t	          |          |           |                     dd|         |           dS )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   sx    
 JJx  AIIKKQ###"1"q)))))r   c                    ddz  }|                      |          }|                     |dk               g }d}d}||k     s|dk     rP|                    |                                            |t	          |d                   z  }|dz  }||k     J|dk     Pd                    |          }|                     t	          |          |           |                     |d|         |           dS )	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MM$))++&&&Cr
OO+LFA	 W$$B
 &!!Vg...hwh00000r   c                     g }t          j        | j        |j                  }|                     |g            |                     |           dS )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   sO    
 !$&!(33B&!!!!!r   c                     t          j        | j                   |                     |                                 t
          j                   dS )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   =    
 	e&;<<<<<r   c                     t          j        | j                   |                     |                     d          t
          j                   dS )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   A    
 	D))5+@AAAAAr   c                     t          j        | j                   |                     |                                 t
          j                   dS )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                   |                     |                     d          t
          j                   dS )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                 x   t           j        }d }|t           _        	 |                     |                     d          d           |t           _        n# |t           _        w xY wd }|t           _        	 |                     |                     d          d           |t           _        dS # |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CIIr   rM   r   c                 D    t                      }t          j        |_        |rW   )r(   rX   EINTRrZ   s      r   
eintrWritez3ReadWriteTests.test_writeErrors.<locals>.eintrWrite   s    ))CCIIr   N)r	   r-   r5   )r   
oldOsWriter^   ra   s       r   test_writeErrorszReadWriteTests.test_writeErrors   s     X
	 	 	
 	"TZZ--q111!BHHzBH!!!!	 	 	
 	"TZZ--q111!BHHHzBH!!!!s   )A A!4)B+ +B9N)r   r   r   r    r&   r)   r-   r3   r9   rD   rG   rJ   rO   rR   rT   rc   r!   r   r   r#   r#   3   s         % % %  * * *  	* 	* 	*1 1 1(" " "= = =B B B= = =B B B" " " " "r   r#   c                   (    e Zd ZdZdZd Zd Zd ZdS )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    r	 t          j        t          j        t          j        d| j        |                                fz  g           d S # t          $ r0 dd l}|	                                 t          j
        d           Y d S w xY wt          t           j        |d          d         S )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    gii!88	N^T4<4;;==:J+JK     !       ##%%%	 ""*c155a88s   AA$ $6BBc                    t          |                                 d          5 }t          j        |                                           |                     |          }|                     t          j        |                     | 	                    t          j
        |          d           ddd           dS # 1 swxY w Y   dS )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0011$77FOOBL00111R^F33Q777		8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8s   BB;;B?B?c                    t          |                                 d          5 }t          j        |                                           t          j        |                                           |                     |          }|                     t          j	        |                     | 
                    t          j        |          d           ddd           dS # 1 swxY w Y   dS )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00#DKKMM22211$77FOOBL00111R^F33R888	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9s   B1C!!C%(C%N)r   r   r   r    rl   ru   r   r   r!   r   r   re   re      sR         G9 9 9$
8 
8 
8
9 
9 
9 
9 
9r   re   )r    rX   r	   rj   r   twisted.internetr   ImportErrorskiptwisted.python.utilr   twisted.trialr   SynchronousTestCaser   r#   re   r!   r   r   <module>r      s?     				 



'LLL '&&&&&&  , , ,+DDD,
 / . . . . . " " " " " "H H H H Hx3 H H H8Q" Q" Q" Q" Q"X1 Q" Q" Q"h;9 ;9 ;9 ;9 ;9x3 ;9 ;9 ;9 ;9 ;9s    %%