
    <eB>                        d dl mZmZ d dlmZ  ed            ed           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ZdZ eed          o eed	          Zerd
 Znd Zd Zd Zd Z G d dej                  Z G d dej                  Zd Zedk    r ej                     dS dS )    )verbosereap_children)import_moduletermiosfcntlN   I wish to buy a fish license.
   For my pet fish, Eric.

TIOCGWINSZ
TIOCSWINSZc                 $    t          |            d S N)printmsgs    $/usr/lib/python3.11/test/test_pty.pydebugr      s    c




    c                     d S r    r   s    r   r   r      s    r   c                     |                      d          r|                     dd          S |                      d          r|                     dd          S | S )Ns   
   
   
)endswithreplace)datas    r   normalize_outputr   -   sY     }}Y .||Iu---}}W ,||GU+++Kr   c                 X    t          j        | dd          }|                                S )z8Read one line.  May block forever if no newline is read.rbF)modeclosefd)ioFileIOreadline)fdreaders     r   	_readliner&   A   s(    Yre444F??r   c                     	 t          j        t          j                   t	          j        |           S # t           j        $ r Y nw xY w| S r   )tty	tcgetattrptySTDIN_FILENOunittestexpectedFailureerror)funs    r   expectedFailureIfStdinIsTTYr0   F   sR    c&'''',,,9   Js   14 AAc                   X    e Zd Zd Zd Zed             Zed             Zd Z	d Z
d ZdS )	PtyTestc                    t          j         t           j        | j                  }|                     t           j         t           j        |           t          j         t           j        | j                  }|                     t           j         t           j        |           |                     t           j        d           t          j        d           d | _        t          rl	 t          j
        t          j                  | _        |                     t          j        t          j        | j                   d S # t          j        $ r Y d S w xY wd S )Nr   
   )signalSIGALRM
handle_sig
addCleanupSIGHUPhandle_sighupalarm	stdin_dim_HAVE_WINSZr(   tcgetwinsizer*   r+   tcsetwinsizer.   )self	old_alarm
old_sighups      r   setUpzPtyTest.setUpR   s   M&.$/BB	v~yAAA]6=$2DEE
v}jAAA 	a(((R  	!$!1#2B!C!C 0#2B $0 0 0 0 09   	 	s   "AD7 7E
	E
c                 0    |                      d           d S )Nzisatty hung)fail)r@   sigframes      r   r7   zPtyTest.handle_sigh   s    		-     r   c                     d S r   r   )signumrG   s     r   r:   zPtyTest.handle_sighupk   s    r   c                 
   	 t          j        t          j                  }n&# t           j        $ r t          d           d }Y nw xY wd }| j        r	 t          d           t          d| j                    | j        d         dz   | j        d         dz   f}t          d|            t          j        t          j        |           t          j        t          j                  }| 	                    ||d           n$# t          $ r t          j        d           Y nw xY w	 t          d	           	 t          j        ||d
          \  }}}n(# t          $ r t          j                    \  }}d }Y nw xY wt          d|d|d|           n"# t          $ r t          j        d          w xY w|                     t$          j        |           |                     t$          j        |           |                     t%          j        |          d           |r)| 	                    t          j        |          |d           |r)| 	                    t          j        |          |d           t%          j        |          }	 t%          j        |d           	 t%          j        |d          }| 	                    d|           n-# t          $ r }	|	j        t2          j        k    r Y d }	~	nd }	~	ww xY wt%          j        ||           n# t%          j        ||           w xY wt          d           t%          j        |t8                     t;          |          }| 	                    dt=          |                     t          d           t%          j        |t>          d d                    t%          j        |t>          dd                     t;          |          }
| 	                    dt=          |
                     d S )Nz&tty.tcgetattr(pty.STDIN_FILENO) failedz%Setting pty.STDIN_FILENO window size.zoriginal size: (row, col) = r      ztarget size: (row, col) = z&pty.STDIN_FILENO window size unchangedz+Failed to set pty.STDIN_FILENO window size.Calling pty.openpty()TzGot master_fd=z, slave_fd=z, slave_name=z,Pseudo-terminals (seemingly) not functional.zslave_fd is not a ttyz%openpty() failed to set slave termiosz)openpty() failed to set slave window sizeFi   r   zWriting to slave_fdr   zWriting chunked output   r	   ) r(   r)   r*   r+   r.   r   r<   r?   r>   assertEqualOSErrorwarningswarnopenpty	TypeErrorr,   SkipTestr8   osclose
assertTrueisattyget_blockingset_blockingreaderrnoEAGAINwriteTEST_STRING_1r&   r   TEST_STRING_2)r@   r   new_dim
target_dim	master_fdslave_fd
slave_nameblockings1es2s              r   test_openptyzPtyTest.test_openptyo   si   	=!122DDy 	 	 	:;;;DDD	
 > 	 =>>>ET^EEFFF"nQ/!3T^A5F5JK
?:??@@@ !1:>>> *3+;<<  *!IK K K K   KLLL	T)***"25+dG>B3D 3D/	8ZZ " " "&)kmm#	8!


" AAAxAAJAABBBB 	T 	T 	T#$RSSS	T 	),,,(+++	(++-DEEE 	FS]844dDF F F 	JS-h77HJ J J ?9--
	1OIu---WY--  b))))   7el** +****
 OIx0000BOIx0000#$$$
=)))y!!;)"--	/ 	/ 	/ 	&'''
=!,---
=,---y!!46Fr6J6JKKKKKs   !  AAB,C> >DD#F 3E F "E30F 2E33F F.L	 +K L	 
K0K+&L	 +K00L	 	L c                    t          d           t          j                    \  }}|                     t          j        |           |t          j        k    rt	          j        d          s#t          d           t	          j        d           t          d           	 t	          j	                     t          d           t	          j        d           n^# t          $ r t          d           Y nCt          $ r t          d	           Y n) t          d
           t	          j        d           Y nxY wt	          j        d           d S t          d|z             	 	 t	          j        |d          }n# t          $ r Y nJw xY w|snCt          j                            t!          |                    dd          d                     mt	          j        |d          \  }}t	          j        |          }t          d|||fz             |dk    r|                     d           d S |dk    r|                     d           d S |dk    r|                     d           d S |dk    r|                     d           d S d S )Nzcalling pty.fork()rK   zChild's fd 1 is not a tty?!   zIn child, calling os.setsid()zos.setsid() succeeded! (bad!)   zGood: OSError was raised.zNo setsid() available?zAn unexpected error was raised.   z!Waiting for child (%d) to finish.TP   r   r   ascii)encodingr   z+Child (%d) exited with code %d (status %d).z3Child raised an unexpected exception in os.setsid()z1pty.fork() failed to make child a session leader.z8Child spawned by pty.fork() did not have a tty as stdoutz&pty.fork() failed for unknown reasons.)r   r*   forkr8   rU   rV   CHILDrX   _exitsetsidrO   AttributeErrorr[   sysstdoutr^   strr   waitpidwaitstatus_to_exitcoderE   )r@   pidrc   r   statusress         r   	test_forkzPtyTest.test_fork   s   "###Y),,,#)9Q<< 3444 1222	" 5666#    1222!   .///
 7888 HQKKKKK5;<<<879b11DD   E 
  T\\'5%A%A.5"7 "7 "7 8 8 88  JsA..MS&+F33C?3VBTTUUUaxx		OPPPPP		MNNNNN		TUUUUU		BCCCCC s*   C D//D/	$D/E2 2
E?>E?c                    t          d           t          j                    \  }}t          d| d| d           |                     t          j        |           t          d           t	          j        |           t          d           	 t	          j        |d          }n# t          $ r d}Y nw xY w|                     |d           d S )	NrL   zGot master_fd 'z', slave_fd ''zClosing slave_fdzReading from master_fdrK   r   )	r   r*   rR   r8   rU   rV   r[   rO   rN   )r@   rc   rd   r   s       r   test_master_readzPtyTest.test_master_read  s    %&&&!kmm	8C	CCCCCDDD),,, !!!
&'''	79a((DD 	 	 	DDD	 	s#####s   B% %B43B4c                 H    t          j        t          j        ddg           d S )Nz-czprint("hi there"))r*   spawnrw   
executabler@   s    r   test_spawn_doesnt_hangzPtyTest.test_spawn_doesnt_hang(  s"    	3>4)<=>>>>>r   N)__name__
__module____qualname__rC   r7   staticmethodr:   r0   rj   r   r   r   r   r   r   r2   r2   Q   s          ,! ! !   \ !QL QL ! QLfHD HD HDd$ $ $&? ? ? ? ?r   r2   c                   H    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S )SmallPtyTestsz)These tests don't spawn children or hang.c                    t           j        | _        t           j        | _        t           j        | _        t           j        | _        t           j	        | _
        t           j        | _        t           j        | _        t           j        | _        t           j        | _        t           j        | _        g | _        g | _        g | _        g | _        d | _        d S r   )r*   r+   orig_stdin_filenoSTDOUT_FILENOorig_stdout_filenorV   orig_pty_close_copyorig_pty__copyrr   orig_pty_forkselectorig_pty_selectsetraworig_pty_setrawr)   orig_pty_tcgetattr	tcsetattrorig_pty_tcsetattrrz   orig_pty_waitpidfdsfilesselect_inputselect_outputtcsetattr_mode_settingr   s    r   rC   zSmallPtyTests.setUp.  s    !$!1"%"3!i!i X"z"z"%-"%- #
&*###r   c                    | j         t          _        | j        t          _        | j        t          _        | j        t          _        | j	        t          _
        | j        t          _        | j        t          _        | j        t          _        | j        t          _        | j        t          _        | j        D ]'}	 |                                 # t,          $ r Y $w xY w| j        D ]'}	 t1          j        |           # t,          $ r Y $w xY wd S r   )r   r*   r+   r   r   r   rV   r   r   r   rr   r   r   r   r   r   r)   r   r   r   rz   r   rO   r   rU   )r@   filer$   s      r   tearDownzSmallPtyTests.tearDown?  s    1 3'	'	%)
)
//+J 	 	D

   ( 	 	B   	 	s$   5C


CC$C99
DDc                 `    t          j                    }| j                            |           |S r   )rU   piper   extend)r@   pipe_fdss     r   _pipezSmallPtyTests._pipeU  s&    799!!!r   c                 `    t          j                    }| j                            |           |S r   )socket
socketpairr   r   )r@   r   s     r   _socketpairzSmallPtyTests._socketpairZ  s,    &((

*%%%r   c                     |                      |||f| j                            d                     | j                            d          S )Nr   )rN   r   popr   )r@   rfdswfdsxfdss       r   _mock_selectzSmallPtyTests._mock_select_  sG    $d+T->-B-B1-E-EFFF!%%a(((r   c                     fd}|S )Nc                       dfS )N   r   )r|   s   r   	mock_forkz0SmallPtyTests._make_mock_fork.<locals>.mock_forke  s    9r   r   )r@   r|   r   s    ` r   _make_mock_forkzSmallPtyTests._make_mock_forkd  s"    	 	 	 	 	r   c                     || _         d S r   )r   )r@   filenooptr   s       r   _mock_tcsetattrzSmallPtyTests._mock_tcsetattri  s    &*###r   c                    |                                  \  }}|t          _        |                                  \  }}|t          _        |                                 }d |D             }t          j        |d         d           t          j        |d           | j        t          _        | j	        
                    ||d         gg g f           | j        
                    ||d         gg g f           | j	        
                    ||d         g||d         gg f           | j        
                    g ||d         gg f           | j	        
                    ||d         gg g f           |                     t                    5  t          j        |d                    ddd           n# 1 swxY w Y   t          j        ||d         gg g d          d         }|                     ||d         g|           |                     t          j        |d          d           |                     t          j        |d         d          d           dS )z6Test the normal data case on both master_fd and stdin.c                 6    g | ]}|                                 S r   )r   ).0ss     r   
<listcomp>z4SmallPtyTests.test__copy_to_each.<locals>.<listcomp>s  s     222!188::222r   rK   s   from masters
   from stdinr   N   )r   r*   r   r+   r   rU   r^   r   r   r   appendr   assertRaises
IndexErrorr   rN   r[   )r@   read_from_stdout_fdmock_stdout_fdmock_stdin_fdwrite_to_stdin_fdr   mastersr   s           r   test__copy_to_eachz SmallPtyTests.test__copy_to_eachl  su   .2jjll+^*+/::<<(((%%''
22z222 	^,,,
"M222 &
  ='!*"=r2!FGGG!!M71:#>B"GHHH  ='!*"=PWXYPZ?[]_!`aaa!!2
'CR"HIII  ='!*"=r2!FGGGz** 	" 	"Igaj!!!	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" }171:>BJJ1M-wqz:DAAA!4b99>JJJR00-@@@@@s   F**F.1F.c                    |                      d          t          _        t                      fdt          _        d t          _        d t          _        t                      fdt          _        | j        t          _	        d t          _
        |                     t          j        g           d           |                     | j        d           d	S )
zCTest that spawn resets the tty mode no when _copy returns normally.rK   c                     d gS r   r   )_1_2status_sentinels     r   <lambda>zDSmallPtyTests.test__restore_tty_mode_normal_return.<locals>.<lambda>  s    dO%< r   c                     d S r   r   _s    r   r   zDSmallPtyTests.test__restore_tty_mode_normal_return.<locals>.<lambda>  s    d r   c                     d S r   r   )r   r   _3s      r   r   zDSmallPtyTests.test__restore_tty_mode_normal_return.<locals>.<lambda>  s    t r   c                     S r   r   )r$   mode_sentinels    r   r   zDSmallPtyTests.test__restore_tty_mode_normal_return.<locals>.<lambda>  s    = r   c                     d S r   r   r   s    r   r   zDSmallPtyTests.test__restore_tty_mode_normal_return.<locals>.<lambda>  s    t r   z4pty.waitpid process status not returned by pty.spawnz1pty.tcsetattr not called with original mode valueN)r   r*   rr   objectrz   rV   r   r)   r   r   r   rN   r   r   )r@   r   r   s    @@r   $test__restore_tty_mode_normal_returnz2SmallPtyTests.test__restore_tty_mode_normal_return  s    
 ''** ((<<<<"N	++	0000,#^
29oppp4mExyyyyyr   N)r   r   r   __doc__rC   r   r   r   r   r   r   r   r   r   r   r   r   r   +  s        33+ + +"  ,  
  
) ) )
  
+ + +A A A<z z z z zr   r   c                  "    t                       d S r   )r   r   r   r   tearDownModuler     s    OOOOOr   __main__)test.supportr   r   test.support.import_helperr   r\   rU   r*   r(   rw   r   r5   r   r!   r,   rP   r_   r`   hasattrr=   r   r   r&   r0   TestCaser2   r   r   r   mainr   r   r   <module>r      s   / / / / / / / / 4 4 4 4 4 4 i    g     				 



 



 



    				  2+gc<((GWWS,-G-G
        (  
  X? X? X? X? X?h X? X? X?trz rz rz rz rzH% rz rz rzj   zHMOOOOO r   