
    z%iB>                     t   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      xr	  eed	      Zerd
 Znd Zd Zd Zd Z G d dej0                        Z G d dej0                        Zd Zedk(  r ej:                          yy)    )verbosereap_children)import_moduletermiosfcntlN   I wish to buy a fish license.
   For my pet fish, Eric.

TIOCGWINSZ
TIOCSWINSZc                     t        |        y N)printmsgs    A/home/uftp/.pyenv/versions/3.12.0/lib/python3.12/test/test_pty.pydebugr      s	    c
    c                      y r    r   s    r   r   r      s    r   c                     | j                  d      r| j                  dd      S | j                  d      r| j                  dd      S | S )Ns   
   
   
)endswithreplace)datas    r   normalize_outputr   -   sC     }}Y||Iu--}}W||GU++Kr   c                 R    t        j                  | dd      }|j                         S )z8Read one line.  May block forever if no newline is read.rbF)modeclosefd)ioFileIOreadline)fdreaders     r   	_readliner&   A   s!    YYre4F??r   c                     	 t        j                  t        j                         t	        j
                  |       S # t         j                  $ r Y | S w xY wr   )tty	tcgetattrptySTDIN_FILENOunittestexpectedFailureerror)funs    r   expectedFailureIfStdinIsTTYr0   F   sE    c&&''',,99 Js   7: AAc                   J    e Zd Zd Zd Zed        Zed        Zd Z	d Z
d Zy)	PtyTestc                    t        j                   t         j                  | j                        }| j                  t         j                   t         j                  |       t        j                   t         j                  | j
                        }| j                  t         j                   t         j                  |       | j                  t         j                  d       t        j                  d       d | _        t        rc	 t        j                  t        j                        | _        | j                  t        j                  t        j                  | j                         y y # t        j                  $ r Y y w xY w)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    MM&..$//B	v~~yA]]6==$2D2DE
v}}jA 	a(R !$!1!1#2B2B!C 0 0#2B2B $0 
 99 s   >A!E! !E76E7c                 &    | j                  d       y )Nzisatty hung)fail)r@   sigframes      r   r7   zPtyTest.handle_sigh   s    		- r   c                      y r   r   )signumrG   s     r   r:   zPtyTest.handle_sighupk   s    r   c                    	 t        j                  t        j                        }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                        }| j                  ||d       	 t        d	       	 t        j                  ||d
      \  }}}t        d|d|d|       | j#                  t$        j&                  |       | j#                  t$        j&                  |       | j)                  t%        j*                  |      d       |r&| j                  t        j                  |      |d       |r&| j                  t        j                  |      |d       t%        j,                  |      }	 t%        j.                  |d       	 t%        j0                  |d      }| j                  d|       t%        j.                  ||       t        d       t%        j6                  |t8               t;        |      }| j                  dt=        |             t        d       t%        j6                  |t>        d d        t%        j6                  |t>        dd         t;        |      }
| j                  dt=        |
             y # t         j                  $ r t        d       d }Y w xY w# t        $ r t        j                  d       Y [w xY w# t        $ r t        j                         \  }}d }Y \w xY w# t        $ r t        j                   d      w xY w# t        $ r)}	|	j2                  t2        j4                  k7  r Y d }	~	d }	~	ww xY w# t%        j.                  ||       w xY w)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!12D >> =>4T^^4DEF"nnQ/!3T^^A5F5JK
2:,?@  !1!1:> **3+;+;<  *!IK	T)*"25++dG>B3D/	8Z
 OLxkJ=AB 	),(+		(+-DES]]84dDFS--h7HJ ??9-
	1OOIu-WWY-  b) OOIx0#$
=)y!;)"-	/ 	&'
=!,-
=,-y!46Fr6JK] yy 	:;D	,  KL  "&)kkm#	8!
"  	T##$RSS	T4  77ell* +
 OOIx0s   #K6 B/L $M+ 0M M+ *O (N 6 LLL?>L?"M($M+ 'M((M+ +N
	N?N:4O :N??O Oc                    t        d       t        j                         \  }}| j                  t        j
                  |       |t        j                  k(  rt	        j                  d      s t        d       t	        j                  d       t        d       	 t	        j                          t        d       t	        j                  d       t	        j                  d       y t        d|z         	 	 t	        j                  |d      }|sn;t        j                  j                  t!        |j#                  dd      d             Ut	        j$                  |d      \  }}t	        j&                  |      }t        d|||fz         |dk(  r| j)                  d       y |dk(  r| j)                  d       y |dk(  r| j)                  d       y |dk7  r| j)                  d       y y # t        $ r t        d       Y -t        $ r t        d	       Y C t        d
       t	        j                  d       Y gxY w# t        $ r Y w xY w)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.P   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),#))99Q<34 12		" 56HHQK5;< 779b1D 

  T\\'5%A.5"7 8   JJsA.MS&++F3C?3VBTTUax		OP		MN		TU		BC q  12! ./
 78(  s*   G! 1H5 !H28H2!H25	I Ic                 v   t        d       t        j                         \  }}t        d| d| d       | j                  t        j
                  |       t        d       t	        j
                  |       t        d       	 t	        j                  |d      }| j                  |d       y # t        $ r d}Y  w xY w)	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    %&!kkm	8	{-zCD), !
&'	779a(D 	s#  	D	s   B* *B87B8c                 P    t        j                  t        j                  ddg       y )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   sK    ,!   !QL !QLfHDd$&?r   r2   c                   F    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zy)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 | _        y 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!1"%"3"3!ii!ii XX"zz"zz"%--"%-- #
&*#r   c                 v   | j                   t        _        | j                  t        _        | j
                  t        _        | j                  t        _        | j                  t        _
        | j                  t        _        | j                  t        _        | j                  t        _        | j"                  t        _        | j&                  t        _        | j*                  D ]  }	 |j                           | j.                  D ]  }	 t1        j                  |        y # t,        $ r Y Iw xY w# t,        $ r Y 6w xY w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1 33''	''	%%))
))
////++JJ 	D

	
 (( 	B	  
  s$   #DD,	D)(D),	D87D8c                 d    t        j                         }| j                  j                  |       |S r   )rU   piper   extend)r@   pipe_fdss     r   _pipezSmallPtyTests._pipeU  s"    779!r   c                 d    t        j                         }| j                  j                  |       |S r   )socket
socketpairr   r   )r@   r   s     r   _socketpairzSmallPtyTests._socketpairZ  s(    &&(


*%r   c                     | j                  |||f| j                  j                  d             | j                  j                  d      S )Nr   )rN   r   popr   )r@   rfdswfdsxfdss       r   _mock_selectzSmallPtyTests._mock_select_  sA    $d+T->->-B-B1-E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                     || _         y r   )r   )r@   filenooptr   s       r   _mock_tcsetattrzSmallPtyTests._mock_tcsetattri  s
    &*#r   c                 `   | j                         \  }}|t        _        | j                         \  }}|t        _        | j	                         }|D cg c]  }|j                          }}t        j                  |d   d       t        j                  |d       | j                  t        _	        | j                  j                  ||d   gg g f       | j                  j                  ||d   gg g f       | j                  j                  ||d   g||d   gg f       | j                  j                  g ||d   gg f       | j                  j                  ||d   gg g f       | j                  t              5  t        j                  |d          ddd       t        j                  ||d   gg g d      d   }| j!                  ||d   g|       | j!                  t        j"                  |d      d       | j!                  t        j"                  |d   d      d       yc c}w # 1 sw Y   xY w)z6Test the normal data case on both master_fd and stdin.rK   s   from masters
   from stdinr   N   )r   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   smastersr   s	            r   test__copy_to_eachz SmallPtyTests.test__copy_to_eachl  s    .2jjl+^*+/::<(((%%'
'12!188:22 	^,
"M2 &&
  ='!*"=r2!FG!!M71:#>B"GH  ='!*"=PWXYPZ?[]_!`a!!2
'CR"HI  ='!*"=r2!FGz* 	"IIgaj!	" }}171:>BJ1M-wqz:DA!4b9>JR0-@+ 3	" 	"s   H7H$$H-c                    | j                  d      t        _        t               fdt        _        d t        _        d t        _        t               fdt        _        | j                  t        _	        d t        _
        | j                  t        j                  g       d       | j                  | j                  d       y	)
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                      y r   r   _s    r   r   zDSmallPtyTests.test__restore_tty_mode_normal_return.<locals>.<lambda>      r   c                      y r   r   )r   r   _3s      r   r   zDSmallPtyTests.test__restore_tty_mode_normal_return.<locals>.<lambda>  r   r   c                     S r   r   )r$   mode_sentinels    r   r   zDSmallPtyTests.test__restore_tty_mode_normal_return.<locals>.<lambda>  s    = r   c                      y r   r   r   s    r   r   zDSmallPtyTests.test__restore_tty_mode_normal_return.<locals>.<lambda>  r   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    
 ''* (<"	+	0,,#
29op44mExyr   N)r   r   r   __doc__rC   r   r   r   r   r   r   r   r   r   r   r   r   r   +  s4    3+",

)

+A<zr   r   c                      t                y r   )r   r   r   r   tearDownModuler     s    Or   __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 i  g   	 
 
 
    	  2+c<(GWS,-G
(
X?h X?trzH%% rzj zHMMO r   