o
    HXîh^C  ã                   @   sB  d dl mZmZ d dlmZ 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 dlZd dlZdZdZz
ejZejZdZW n ey_   dZY nw ergd	d
„ Zndd
„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZG dd„ dej ƒZ!G dd„ dej ƒZ"dd„ Z#e$dkrŸe %¡  dS dS )é    )ÚverboseÚreap_children)Úimport_moduleZtermiosNó   I wish to buy a fish license.
ó   For my pet fish, Eric.
TFc                 C   s   t | ƒ d S ©N)Úprint©Úmsg© r   ú7/opt/python-3.10.19/usr/lib/python3.10/test/test_pty.pyÚdebug!   s   r   c                 C   ó   d S r   r   r	   r   r   r   r   $   s   c                 C   s0   |   d¡r|  dd¡S |   d¡r|  dd¡S | S )Ns   
ó   
ó   
)ÚendswithÚreplace)Údatar   r   r   Únormalize_output2   s
   

r   c                 C   s   	 t j| ddd}| ¡ S )NÚrbF)ÚmodeÚclosefd)ÚioÚFileIOÚreadline)ÚfdÚreaderr   r   r   Ú	_readlineF   s   r   c                 C   s0   zt  tj¡ t | ¡W S  t jy   Y | S w r   )ÚttyÚ	tcgetattrÚptyÚSTDIN_FILENOÚunittestZexpectedFailureÚerror)Zfunr   r   r   ÚexpectedFailureIfStdinIsTTYK   s   þr$   c                 C   s    t  ddddd¡}t | t|¡S )NÚHHHHr   )ÚstructÚpackÚfcntlÚioctlÚ_TIOCGWINSZ)r   Úsr   r   r   Ú_get_term_winszT   s   r,   c                 C   s   t  | t|¡ d S r   )r(   r)   Ú_TIOCSWINSZ)r   Zwinszr   r   r   Ú_set_term_winszX   s   r.   c                   @   sL   e Zd Zdd„ Zdd„ Zedd„ ƒZedd„ ƒZd	d
„ Z	dd„ Z
dd„ ZdS )ÚPtyTestc                 C   sÎ   t   t j| j¡}|  t j t j|¡ t   t j| j¡}|  t j t j|¡ |  t jd¡ t  d¡ d | _d | _t	rez$t
 tj¡}|j| _|j| _t d| j| jdd¡}|  ttj|¡ W d S  tyd   Y d S w d S )Nr   é
   r%   )ÚsignalÚSIGALRMÚ
handle_sigÚ
addCleanupÚSIGHUPÚhandle_sighupÚalarmÚ
stdin_rowsÚ
stdin_colsÚ_HAVE_WINSZÚosÚget_terminal_sizer    r!   ÚlinesÚcolumnsr&   r'   r.   ÚOSError)ÚselfZ	old_alarmZ
old_sighupZ	stdin_dimZold_stdin_winszr   r   r   ÚsetUp_   s*   

ÿÿøzPtyTest.setUpc                 C   s   |   d¡ d S )Nzisatty hung)Úfail)r@   ÚsigÚframer   r   r   r3   y   s   zPtyTest.handle_sigc                 C   r   r   r   )ÚsignumrD   r   r   r   r6   |   s   zPtyTest.handle_sighupc              
   C   s¼  zt  tj¡}W n t jy   tdƒ d }Y nw d }| jd urw| jd urwzCtdƒ td| j› d| j› dƒ | jd }| jd }td|› d|› dƒ t 	d||d	d	¡}t
tj|ƒ ttjƒ}|  ||d
¡ W n tyv   t d¡ Y nw z+tdƒ z
t ||¡\}}W n ty•   t ¡ \}}Y nw td|› d|› dƒ W n ty®   t d¡‚w |  tj|¡ |  tj|¡ |  t |¡d¡ |rÒ|  t  |¡|d¡ |rÝ|  t|ƒ|d¡ t |¡}z8t |d¡ zt |d¡}	|  d|	¡ W n ty }
 z|
jtjkr‚ W Y d }
~
nd }
~
ww W t ||¡ nt ||¡ w tdƒ t |t¡ t |ƒ}	|  dt!|	ƒ¡ tdƒ t |t"d d… ¡ t |t"dd … ¡ t |ƒ}|  dt!|ƒ¡ d S )Nz&tty.tcgetattr(pty.STDIN_FILENO) failedz$Setting pty.STDIN_FILENO window sizezoriginal size: (rows=z, cols=ú)é   ztarget size: (rows=r%   r   z&pty.STDIN_FILENO window size unchangedz*Failed to set pty.STDIN_FILENO window sizeúCalling pty.openpty()úGot master_fd 'ú', slave_fd 'ú'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   ó    zWriting to slave_fdr   zWriting chunked outputé   r   )#r   r   r    r!   r#   r   r8   r9   r&   r'   r.   r,   ÚassertEqualr?   ÚwarningsÚwarnÚopenptyÚ	TypeErrorr"   ZSkipTestr4   r;   ÚcloseZ
assertTrueÚisattyÚget_blockingÚset_blockingÚreadÚerrnoÚEAGAINÚwriteÚTEST_STRING_1r   r   ÚTEST_STRING_2)r@   r   Znew_stdin_winszZtarget_stdin_rowsZtarget_stdin_colsZtarget_stdin_winszÚ	master_fdÚslave_fdÚblockingÚs1ÚeÚs2r   r   r   Útest_openpty€   s’   ý

ÿ
ÿ
þÿ
þÿÿ
ÿ€ÿ€ÿzPtyTest.test_openptyc                 C   s¨  t dƒ t ¡ \}}|  tj|¡ |tjkret d¡s$t dƒ t d¡ t dƒ zt 	¡  W n& t
y;   t dƒ Y n# tyG   t dƒ Y n   t dƒ t d¡ Y n	t d	ƒ t d
¡ t d¡ d S t d| ƒ 	 zt |d¡}W n	 t
y}   Y nw |sntj t| dd¡dd¡ qlt |d¡\}}t |¡}t d|||f ƒ |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()rG   zChild's fd 1 is not a tty?!é   zIn child, calling os.setsid()zGood: OSError was raised.zNo setsid() available?zAn unexpected error was raised.zos.setsid() succeeded! (bad!)é   é   z!Waiting for child (%d) to finish.Té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    Úforkr4   r;   rS   ZCHILDrT   Ú_exitÚsetsidr?   ÚAttributeErrorrW   ÚsysÚstdoutrZ   Ústrr   ÚwaitpidÚwaitstatus_to_exitcoderB   )r@   Úpidr]   r   ÚstatusÚresr   r   r   Ú	test_forkÕ   s^   



ÿÿù
ÿzPtyTest.test_forkc                 C   sŠ   t dƒ t ¡ \}}t d|› d|› dƒ |  tj|¡ t dƒ t |¡ t dƒ zt |d¡}W n ty<   d}Y nw |  |d¡ d S )	NrH   rI   rJ   rK   zClosing slave_fdzReading from master_fdrG   rL   )	r   r    rQ   r4   r;   rS   rW   r?   rN   )r@   r]   r^   r   r   r   r   Útest_master_read'  s   
ÿzPtyTest.test_master_readc                 C   s   t  tjddg¡ d S )Nz-czprint("hi there"))r    Úspawnrn   Ú
executable©r@   r   r   r   Útest_spawn_doesnt_hang:  s   zPtyTest.test_spawn_doesnt_hangN)Ú__name__Ú
__module__Ú__qualname__rA   r3   Ústaticmethodr6   r$   rc   rv   rw   r{   r   r   r   r   r/   ^   s    

TRr/   c                   @   s`   e Zd Z	 dd„ Zdd„ Zdd„ Zdd„ Zdd
d„Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ ZdS )ÚSmallPtyTestsc                 C   sr   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_filenorS   Úorig_pty_closeÚ_copyÚorig_pty__copyrj   Úorig_pty_forkÚselectÚorig_pty_selectÚsetrawÚorig_pty_setrawr   Úorig_pty_tcgetattrÚ	tcsetattrÚorig_pty_tcsetattrrq   Úorig_pty_waitpidÚfdsÚfilesÚselect_rfds_lengthsÚselect_rfds_resultsÚtcsetattr_mode_settingrz   r   r   r   rA   @  s   
zSmallPtyTests.setUpc              	   C   sª   | j t_| jt_| jt_| jt_| j	t_
| jt_| jt_| jt_| jt_| jt_| jD ]}z| ¡  W q+ ty<   Y q+w | jD ]}zt |¡ W q@ tyR   Y q@w d S r   )r   r    r!   rƒ   r‚   r„   rS   r†   r…   r‡   rj   r‰   rˆ   r‹   rŠ   rŒ   r   rŽ   r   r   rq   r‘   r?   r   r;   )r@   Úfiler   r   r   r   ÚtearDownQ  s.   
ÿ
ÿýzSmallPtyTests.tearDownc                 C   ó   t  ¡ }| j |¡ |S r   )r;   Úpiper   Úextend)r@   Zpipe_fdsr   r   r   Ú_pipeg  ó   zSmallPtyTests._pipec                 C   r—   r   )ÚsocketÚ
socketpairr‘   r™   )r@   r   r   r   r   Ú_socketpairl  r›   zSmallPtyTests._socketpairr   c                 C   s*   |   | j d¡t|ƒ¡ | j d¡g g fS )Nr   )rN   r’   ÚpopÚlenr“   )r@   ÚrfdsZwfdsZxfdsÚtimeoutr   r   r   Ú_mock_selectq  s   zSmallPtyTests._mock_selectc                    s   ‡ fdd„}|S )Nc                      s   ˆ dfS )Né   r   r   ©rs   r   r   Ú	mock_forkx  s   z0SmallPtyTests._make_mock_fork.<locals>.mock_forkr   )r@   rs   r¦   r   r¥   r   Ú_make_mock_forkw  s   zSmallPtyTests._make_mock_forkc                 C   s
   || _ d S r   )r”   )r@   ÚfilenoÚoptr   r   r   r   Ú_mock_tcsetattr|  ó   
zSmallPtyTests._mock_tcsetattrc                 C   s$  	 |   ¡ \}}|t_|   ¡ \}}|t_|  ¡ }dd„ |D ƒ}t |d d¡ t |d¡ | jt_| j	 
d¡ | j 
||d g¡ | j	 
d¡ |  t¡ t |d ¡ W d   ƒ n1 s]w   Y  t ||d gg g d¡d }|  ||d g|¡ |  t |d¡d¡ |  t |d d¡d¡ d S )	Nc                 S   ó   g | ]}|  ¡ ‘qS r   ©r¨   ©Ú.0r+   r   r   r   Ú
<listcomp>†  ó    z4SmallPtyTests.test__copy_to_each.<locals>.<listcomp>rG   s   from masters
   from stdinre   r   é   )rš   r    r‚   r!   rž   r;   rZ   r£   rˆ   r’   Úappendr“   ZassertRaisesÚ
IndexErrorr…   rN   rW   )r@   Úread_from_stdout_fdÚmock_stdout_fdÚmock_stdin_fdÚwrite_to_stdin_fdr   Úmastersr¡   r   r   r   Útest__copy_to_each  s(   ÿz SmallPtyTests.test__copy_to_eachc                 C   s    	 |   ¡ \}}|t_|   ¡ \}}|t_|  ¡ }dd„ |D ƒ}|d  ¡  t |¡ | jt_| j	 
d¡ | j 
||d g¡ | j	 
d¡ |  t |d ¡d ¡ d S )Nc                 S   r¬   r   r­   r®   r   r   r   r°   ¢  r±   z7SmallPtyTests.test__copy_eof_on_all.<locals>.<listcomp>rG   re   r   )rš   r    r‚   r!   rž   rS   r;   r£   rˆ   r’   r³   r“   rN   r…   )r@   rµ   r¶   r·   r¸   r   r¹   r   r   r   Útest__copy_eof_on_all›  s   
z#SmallPtyTests.test__copy_eof_on_allc                    s„   	 |   d¡t_tƒ ‰‡fdd„t_dd„ t_dd„ t_tƒ ‰ ‡ fdd„t_| jt_	dd„ t_
|  t g ¡ˆd¡ |  | jˆ d	¡ d S )
NrG   c                    s   d ˆ gS r   r   )Ú_1Ú_2)Ústatus_sentinelr   r   Ú<lambda>¹  s    zDSmallPtyTests.test__restore_tty_mode_normal_return.<locals>.<lambda>c                 S   r   r   r   ©Ú_r   r   r   r¿   º  ó    c                 S   r   r   r   )r¼   r½   Z_3r   r   r   r¿   ¼  rÂ   c                    s   ˆ S r   r   )r   )Úmode_sentinelr   r   r¿   ¿  rÂ   c                 S   r   r   r   rÀ   r   r   r   r¿   Á  rÂ   z4pty.waitpid process status not returned by pty.spawnz1pty.tcsetattr not called with original mode value)r§   r    rj   Úobjectrq   rS   r…   r   rª   r   rŠ   rN   rx   r”   rz   r   )rÃ   r¾   r   Ú$test__restore_tty_mode_normal_return±  s   


z2SmallPtyTests.test__restore_tty_mode_normal_returnN)r   )r|   r}   r~   rA   r–   rš   rž   r£   r§   rª   rº   r»   rÅ   r   r   r   r   r€   =  s    
r€   c                   C   s
   t ƒ  d S r   )r   r   r   r   r   ÚtearDownModuleÇ  r«   rÆ   Ú__main__)&Ztest.supportr   r   Ztest.support.import_helperr   rX   r;   r    r   rn   rˆ   r1   rœ   r   r"   r&   r(   rO   r[   r\   Z
TIOCGWINSZr*   Z
TIOCSWINSZr-   r:   rm   r   r   r   r$   r,   r.   ZTestCaser/   r€   rÆ   r|   Úmainr   r   r   r   Ú<module>   sR    ÿ
	 ` ÿ