a
    äzeú/  ã                   @   sÒ   d dl mZmZ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ZdZerzdd„ Zn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 )é    )ÚverboseÚimport_moduleÚreap_childrenZtermiosNó   I wish to buy a fish license.
ó   For my pet fish, Eric.
c                 C   s   t | ƒ d S ©N)Úprint©Úmsg© r   ú#/usr/lib/python3.9/test/test_pty.pyÚdebug   s    r   c                 C   s   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_output%   s
    

r   c                 C   s   t j| ddd}| ¡ S )z8Read one line.  May block forever if no newline is read.ÚrbF)ÚmodeÚclosefd)ÚioÚFileIOÚreadline)ÚfdÚreaderr   r   r   Ú	_readline9   s    r   c                   @   s8   e Zd Zdd„ Zdd„ Ze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 S )Nr   é
   )ÚsignalÚSIGALRMÚ
handle_sigZ
addCleanupÚSIGHUPÚhandle_sighupÚalarm)ÚselfZ	old_alarmZ
old_sighupr   r   r   ÚsetUpD   s    zPtyTest.setUpc                 C   s   |   d¡ d S )Nzisatty hung)Úfail)r%   ÚsigÚframer   r   r   r!   P   s    zPtyTest.handle_sigc                 C   s   d S r   r   )Úsignumr)   r   r   r   r#   S   s    zPtyTest.handle_sighupc              
   C   sŽ  zLt dƒ t ¡ \}}t d||f ƒ t d|f ƒ t |¡}t d| ƒ W n tyh   t d¡‚Y n0 |  t 	|¡d¡ t 
|¡}zlt |d¡ zt |d¡}|  d	|¡ W n2 tyâ } z|jtjkrÎ‚ W Y d }~n
d }~0 0 W t ||¡ nt ||¡ 0 t d
ƒ t |t¡ t|ƒ}|  dt|ƒ¡ t dƒ t |td d… ¡ t |tdd … ¡ t|ƒ}|  dt|ƒ¡ t |¡ t |¡ d S )NzCalling master_open()z#Got master_fd '%d', slave_name '%s'zCalling slave_open(%r)zGot slave_fd '%d'z,Pseudo-terminals (seemingly) not functional.zslave_fd is not a ttyFi   ó    zWriting to slave_fdr   zWriting chunked outputé   r   )r   ÚptyZmaster_openZ
slave_openÚOSErrorÚunittestZSkipTestZ
assertTrueÚosÚisattyÚget_blockingÚset_blockingÚreadÚassertEqualÚerrnoÚEAGAINÚwriteÚTEST_STRING_1r   r   ÚTEST_STRING_2Úclose)r%   Ú	master_fdZ
slave_nameZslave_fdÚblockingÚs1ÚeÚs2r   r   r   Ú
test_basicZ   sF    ÿ

ÿ
zPtyTest.test_basicc                 C   s¨  t dƒ t ¡ \}}|tjkr¼t d¡s:t dƒ t d¡ t dƒ zt ¡  W nN tyh   t dƒ Y nH t	y€   t dƒ Y n0   t dƒ t d¡ Y n0 t d	ƒ t d
¡ t d¡ nÞt d| ƒ zt 
|d¡}W n tyð   Y qY n0 |súqtj t| dd¡dd¡ qÈt |d¡\}}t |¡}t d|||f ƒ |dkrZ|  d¡ n@|d
krp|  d¡ n*|dkr†|  d¡ n|dkrš|  d¡ t |¡ d S )Nzcalling pty.fork()é   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.é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-   ÚforkZCHILDr0   r1   Ú_exitÚsetsidr.   ÚAttributeErrorr4   ÚsysÚstdoutr8   Ústrr   ÚwaitpidÚwaitstatus_to_exitcoder'   r;   )r%   Úpidr<   r   ÚstatusÚresr   r   r   Ú	test_fork   sV    



ÿ
	






zPtyTest.test_forkN)	Ú__name__Ú
__module__Ú__qualname__r&   r!   Ústaticmethodr#   rA   rU   r   r   r   r   r   C   s   
3r   c                   @   sH   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dS )ÚSmallPtyTestsz)These tests don't spawn children or hang.c                 C   s4   t j| _t j| _t j| _g | _g | _g | _	g | _
d S r   )r-   ÚSTDIN_FILENOÚorig_stdin_filenoÚSTDOUT_FILENOÚorig_stdout_filenoÚselectÚorig_pty_selectÚfdsÚfilesÚselect_rfds_lengthsÚselect_rfds_results)r%   r   r   r   r&   æ   s    zSmallPtyTests.setUpc              	   C   sv   | j t_| jt_| jt_| jD ]$}z| ¡  W q t	y@   Y q0 q| j
D ]&}zt |¡ W qJ t	yn   Y qJ0 qJd S r   )r\   r-   r[   r^   r]   r`   r_   rb   r;   r.   ra   r0   )r%   Úfiler   r   r   r   ÚtearDownï   s    

zSmallPtyTests.tearDownc                 C   s   t  ¡ }| j |¡ |S r   )r0   Úpipera   Úextend)r%   Zpipe_fdsr   r   r   Ú_pipeþ   s    zSmallPtyTests._pipec                 C   s   t  ¡ }| j |¡ |S r   )ÚsocketÚ
socketpairrb   rh   )r%   rk   r   r   r   Ú_socketpair  s    zSmallPtyTests._socketpairc                 C   s*   |   | j d¡t|ƒ¡ | j d¡g g fS )Nr   )r5   rc   ÚpopÚlenrd   )r%   ÚrfdsZwfdsZxfdsr   r   r   Ú_mock_select  s    zSmallPtyTests._mock_selectc                 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¸0    Y  t ||d gg g d¡d }|  ||d g|¡ |  t |d	¡d¡ |  t |d d	¡d¡ dS )
z6Test the normal data case on both master_fd and stdin.c                 S   s   g | ]}|  ¡ ‘qS r   ©Úfileno©Ú.0Úsr   r   r   Ú
<listcomp>  r+   z4SmallPtyTests.test__copy_to_each.<locals>.<listcomp>rB   s   from masters
   from stdinrD   r   Né   )ri   r-   r]   r[   rl   r0   r8   rp   r_   rc   Úappendrd   ÚassertRaisesÚ
IndexErrorÚ_copyr5   r4   )r%   Úread_from_stdout_fdÚmock_stdout_fdÚmock_stdin_fdÚwrite_to_stdin_fdrk   Úmastersro   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¡ t |d ¡ W d  ƒ n1 s²0    Y  dS )z9Test the empty read EOF case on both master_fd and stdin.c                 S   s   g | ]}|  ¡ ‘qS r   rq   rs   r   r   r   rv   0  r+   z7SmallPtyTests.test__copy_eof_on_all.<locals>.<listcomp>rB   rD   r   N)ri   r-   r]   r[   rl   r;   r0   rp   r_   rc   rx   rd   ry   rz   r{   )r%   r|   r}   r~   r   rk   r€   r   r   r   Útest__copy_eof_on_all)  s    
z#SmallPtyTests.test__copy_eof_on_allN)rV   rW   rX   Ú__doc__r&   rf   ri   rl   rp   r   r‚   r   r   r   r   rZ   ã   s   	rZ   c                   C   s
   t ƒ  d S r   )r   r   r   r   r   ÚtearDownModuleA  s    r„   Ú__main__)Ztest.supportr   r   r   r6   r-   r0   rM   r_   r   rj   r   r/   r9   r:   r   r   r   ZTestCaser   rZ   r„   rV   Úmainr   r   r   r   Ú<module>   s.   

 !^