a
    äze¸  ã                   @   s¢   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mZm	Z	m
Z
 z
ej W n eyr   e d¡‚Y n0 dd„ ZG dd„ dejƒZedkrže ¡  dS )	é    N)ÚTESTFNÚreap_threadsÚcpython_onlyzselect.poll not definedc                 C   s(   g }| D ]\}}||@ r|  |¡ q|S )N)Úappend)ÚreadyÚflagÚmatchÚfdÚmode© r   ú$/usr/lib/python3.9/test/test_poll.pyÚfind_ready_matching   s
    r   c                   @   s\   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zed	d
„ ƒZe	dd„ ƒZ
e ed¡e	dd„ ƒƒZdS )Ú	PollTestsc                 C   sr  t  ¡ }d}d}t|ƒ}g }g }i }i }t|ƒD ]Z}	t ¡ \}
}| |
¡ | |
t j¡ | |t j	¡ | 
|
¡ | 
|¡ |||
< |
||< q0g }|r\| ¡ }t|t j	ƒ}|s¶tdƒ‚t |¡}t ||¡ | ¡ }t|t jƒ}|sìtdƒ‚t |¡}
t |
|¡}|  t|ƒ|¡ | 
|¡ t ||
 ¡ t |
¡ | ||
 ¡ | |
¡ | ||
 ¡ q|  ||g| ¡ d S )Né   s    This is a test.zno pipes ready for writingzno pipes ready for reading)ÚselectÚpollÚlenÚrangeÚosÚpipeÚregisterÚmodifyÚPOLLINÚPOLLOUTr   r   ÚRuntimeErrorÚrandomÚchoiceÚwriteÚreadÚassertEqualÚcloseÚ
unregisterÚremove)ÚselfÚpZ	NUM_PIPESZMSGZMSG_LENÚreadersZwritersZr2wZw2rÚiZrdÚwrZbufsr   Zready_writersZready_readersÚbufr   r   r   Ú
test_poll1   sL    







zPollTests.test_poll1c           
      C   sh  t  ¡ \}}t  |¡ t  |¡ t ¡ }| |¡ | ¡ }|  |d |tjf¡ tt	dƒF}| 
¡ }t ¡ }| |¡ | ¡ }|  |d d |¡ W d   ƒ n1 s¦0    Y  | ¡ }|  |d |tjf¡ t  t	¡ t ¡ }|  t|j|¡ |  t|j|¡ t ¡ }|  t|jd¡ t ¡ }G dd„ dƒ}G dd„ dƒ}	|  t|j|ƒ d¡ |  t|j|	ƒ d¡ d S )Nr   Úwé   c                   @   s   e Zd ZdS )z,PollTests.test_poll_unit_tests.<locals>.NopeN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   ÚNopek   s   r/   c                   @   s   e Zd Zdd„ ZdS )z.PollTests.test_poll_unit_tests.<locals>.Almostc                 S   s   dS )NÚfilenor   )r#   r   r   r   r0   o   s    z5PollTests.test_poll_unit_tests.<locals>.Almost.filenoN)r,   r-   r.   r0   r   r   r   r   ÚAlmostn   s   r1   )r   r   r    r   r   r   r   ÚPOLLNVALÚopenr   r0   ÚunlinkÚassertRaisesÚ	TypeErrorr!   ÚKeyError)
r#   ZFDr*   r$   ÚrÚfr	   Úpollsterr/   r1   r   r   r   Útest_poll_unit_testsL   s4    



2
zPollTests.test_poll_unit_testsc           
      C   sÜ   d}t j|dt jdd}| ¡  |  |jd d d ¡ |j}t ¡ }| 	|tj
¡ dD ]„}| |¡}|g krjqR|d \}}|tj@ rž| ¡ }	|	dkrR|  d¡ qRqR|tj
@ rÈ| ¡ }	|	s¸ qØ|  |	d¡ qRqR|  d	| ¡ qRd S )
Nz?for i in 0 1 2 3 4 5 6 7 8 9; do echo testing...; sleep 1; doneTr   )ÚshellÚstdoutÚbufsize)r   iè  iÐ  i   i@  i€>  éÿÿÿÿr?   r?   r?   r?   r?   r?   r?   r?   r?   ó    z6error: pipe seems to be closed, but still returns datas   testing...
z,Unexpected return value from select.poll: %s)Ú
subprocessÚPopenÚPIPEÚ	__enter__Ú
addCleanupÚ__exit__r=   r   r   r   r   ÚPOLLHUPÚreadlineÚfailr   )
r#   ÚcmdÚprocr$   r:   ZtoutZfdlistr	   ÚflagsÚliner   r   r   Ú
test_poll2x   s4    ÿ



zPollTests.test_poll2c                 C   s„   t  ¡ }| d¡ |  t|jd¡ d}|dkr8|  d¡ |  t|jdd¡ |  t|jdd¡ |  t|jdd¡ |  t|jdd¡ d S )Né   l            é   zOverflow must have occurredr   r?   )r   r   r   r5   ÚOverflowErrorrI   Ú
ValueErrorr   )r#   r:   Úxr   r   r   Ú
test_poll3•   s    

zPollTests.test_poll3c                 C   s~   ddl m}m}m} t ¡ }| d¡ |  t|jd|d ¡ |  t|j	d|d ¡ |  t|j|d ¡ |  t|j|d ¡ d S )Nr   )Ú	USHRT_MAXÚINT_MAXÚUINT_MAXrO   )
Z	_testcapirU   rV   rW   r   r   r   r5   rQ   r   )r#   rU   rV   rW   r:   r   r   r   Útest_poll_c_limits¦   s    
zPollTests.test_poll_c_limitsc              
   C   s   t  ¡ \}}|  t j|¡ |  t j|¡ g }tdƒD ]&}t  |¡}|  t j|¡ | |¡ q4t ¡ }|D ]}| 	|tj
¡ qhtj|jd}| ¡  zRt d¡ |D ]}| |¡ q¢| 	|tj¡ |  t|j¡ W t  |d¡ | ¡  nt  |d¡ | ¡  0 d S )Né
   )Útargetg      à?ó   spam)r   r   rE   r    r   Údupr   r   r   r   r   Ú	threadingÚThreadÚstartÚtimeÚsleepr!   r   r5   r   r   Újoin)r#   r8   r*   Zrfdsr&   r	   r:   Útr   r   r   Útest_threaded_poll²   s.    


ÿzPollTests.test_threaded_pollz!Threading required for this test.c                 C   sš   dD ]}t  ¡ \}}t ¡ }| |tj¡ tj|j|fd}| ¡  |j	dd |  
| ¡ ¡ t  |d¡ | 	¡  |  | ¡ ¡ t  |¡ t  |¡ qd S )N)Niüÿÿr?   g      ð¿gš™™™™™¹¿g0Žä.ÿ+«)rZ   Úargsgš™™™™™¹?)Útimeoutr[   )r   r   r   r   r   r   r]   r^   r_   rb   Z
assertTrueÚis_aliver   ZassertFalser    )r#   Z
timeout_msr8   r*   r:   Zpoll_threadr   r   r   Ú!test_poll_blocks_with_negative_msÎ   s    
z+PollTests.test_poll_blocks_with_negative_msN)r,   r-   r.   r)   r;   rN   rT   r   rX   r   rd   ÚunittestZ
skipUnlessr]   rh   r   r   r   r   r      s   1,


r   Ú__main__)r   rA   r   r   r]   r`   ri   Ztest.supportr   r   r   r   ÚAttributeErrorZSkipTestr   ZTestCaser   r,   Úmainr   r   r   r   Ú<module>   s    
 M