
    daf@                        d dl mZmZ 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d Z G d dej8                        Z G d dej8                        Zd Ze dk(  r ejB                          yy)    )verbosereap_children)TESTFNunlink)import_moduletermiosfcntlN   I wish to buy a fish license.
   For my pet fish, Eric.

TIOCGWINSZ
TIOCSWINSZc                     t        |        y N)printmsgs    (/root/Python-3.12.4/Lib/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(   B   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   expectedFailureIfStdinIsTTYr2   G   sE    c&&''',,99 Js   7: AAc           	          t        j                  | |      }|t        |      k7  rt        d|  dt        |       d| d      y )Nzshort write: os.write(z, z bytes) wrote z bytes)oswritelen	Exception)r&   r   writtens      r   	write_allr9   Q   sS    hhr4 G#d)0Bs4yk B!!(	1 2 	2 r   c                   D    e 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                  |       d | _        t
        rc	 t        j                  t        j                        | _        | j                  t        j                  t        j                  | j                         y y # t        j                  $ r Y y w xY wr   )signalSIGHUPhandle_sighup
addCleanup	stdin_dim_HAVE_WINSZr*   tcgetwinsizer,   r-   tcsetwinsizer0   )self
old_sighups     r   setUpzPtyTest.setUp\   s    ]]6==$2D2DE
v}}jA !$!1!1#2B2B!C 0 0#2B2B $0 
 99 s   ,A!C C%$C%c                      y r   r   )signumframes     r   r?   zPtyTest.handle_sighupj   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       t7        |t8               t;        |      }| j                  dt=        |             t        d       t7        |t>        d d        t7        |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 }	~	sd }	~	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 sizeF   r   zWriting to slave_fdr
   zWriting chunked output   r   ) r*   r+   r,   r-   r0   r   rA   rD   rC   assertEqualOSErrorwarningswarnopenpty	TypeErrorr.   SkipTestr@   r4   close
assertTrueisattyget_blockingset_blockingreaderrnoEAGAINr9   TEST_STRING_1r(   r   TEST_STRING_2)rE   r!   new_dim
target_dim	master_fdslave_fd
slave_nameblockings1es2s              r   test_openptyzPtyTest.test_openptyn   s=   	==!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#$(M*y!;)"-	/ 	&'(M"1-.(M!"-.y!46Fr6JK] yy 	:;D	,  KL  "&)kkm#	8!
"  	T##$RSS	T4  77ell* +
 OOIx0s   #K B/K? $M 0L$ M *N$ (M/  K<;K<?L! L!$"M
M 	M

M M,/	N!8NN$ N!!N$ $N<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()rL   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,   forkr@   r4   rW   CHILDrY   _exitsetsidrQ   AttributeErrorr\   sysstdoutr5   strr   waitpidwaitstatus_to_exitcodefail)rE   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)	NrM   zGot master_fd 'z', slave_fd ''zClosing slave_fdzReading from master_fdrL   r   )	r   r,   rT   r@   r4   rW   r\   rQ   rP   )rE   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                    | j                  t        t               t        t        d      5 }d}t	        j
                  |      }t	        j                  |j                         |       dfd}	 t        j                  t        j                  ddg|       t	        j                  ||       t	        j                  |       	 d d d        | j                  d       t        t        d      5 }| j                  |j                         d       d d d        y # t	        j                  ||       t	        j                  |       w xY w# 1 sw Y   xY w# 1 sw Y   y xY w)	NwbrL   r   c                 >    t        j                  | d      }|z  |S )NrN   )r4   r\   )r&   r   bufs     r   master_readz3PtyTest.test_spawn_doesnt_hang.<locals>.master_read.  s!    wwr4(tr   z-czprint("hi there")s
   hi there
r    )r@   r   r   openr4   dupdup2filenor,   spawnrw   
executablerW   rP   r\   )rE   fSTDOUT_FILENO
dup_stdoutr   r   s        @r   test_spawn_doesnt_hangzPtyTest.test_spawn_doesnt_hang'  s   '&$ 	%1M.JGGAHHJ.C
%		3>>41DE%' 
M2$	%  	o.&$ 	81QVVX7	8 	8 
M2$	% 	%"	8 	8s0   AE0'D+E-!E-EEEEN)__name__
__module____qualname__rG   staticmethodr?   r2   rj   r   r   r   r   r   r   r;   r;   [   sF       !QL !QLfHDd$&8r   r;   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_filenor   orig_stdout_filenorW   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_setting)rE   s    r   rG   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   rW   r   r   r   rr   r   r   r   r   r   r+   r   r   r   rz   r   rQ   r   r4   )rE   filer&   s      r   tearDownzSmallPtyTests.tearDownQ  s    11 33''	''	%%))
))
////++JJ 	D

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

*%r   c                     | j                  |||f| j                  j                  d             | j                  j                  d      S )Nr   )rP   r   popr   )rE   rfdswfdsxfdss       r   _mock_selectzSmallPtyTests._mock_selectq  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_forkw  s    9r   r   )rE   r}   r   s    ` r   _make_mock_forkzSmallPtyTests._make_mock_forkv  s    	r   c                     || _         y r   )r   )rE   r   optr!   s       r   _mock_tcsetattrzSmallPtyTests._mock_tcsetattr{  s
    &*#r   c                 8   | j                         \  }}|t        _        | j                         \  }}|t        _        | j	                         }|D cg c]  }|j                          }}t        |d   d       t        |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.rL   s   from masters
   from stdinr   N   )r   r,   r   r-   r   r   r9   r   r   r   appendr   assertRaises
IndexErrorr   rP   r4   r\   )	rE   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_each~  s   .2jjl+^*+/::<(((%%'
'12!188:22 	'!*n-#]3 &&
  ='!*"=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#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.rL   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   rW   r   r+   r   r   r   rP   r   r   )rE   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__rG   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.os_helperr   r   test.support.import_helperr   r]   r4   r,   r*   rw   r   r=   r   r#   r.   rR   r_   r`   hasattrrB   r   r   r(   r2   r9   TestCaser;   r   r   r   mainr   r   r   <module>r      s    / 1 4 i  g   	 
 
 
    	  2+c<(GWS,-G
(
2`8h `8DrzH%% rzj zHMMO r   