B
    u9aí  ã               @   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
mZ y
ej W n ek
rx   e d¡‚Y nX dd„ ZG dd„ dejƒZdd	„ Zed
krªeƒ  dS )é    N)ÚTESTFNÚrun_unittestÚreap_threadsÚcpython_onlyzselect.poll not definedc             C   s,   g }x"| D ]\}}||@ r
|  |¡ q
W |S )N)Úappend)ÚreadyÚflagÚmatchÚfdÚmode© r   ú/usr/lib/python3.7/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   sz  t  ¡ }d}d}t|ƒ}g }g }i }i }xft|ƒD ]Z}	t ¡ \}
}| |
¡ | |
t j¡ | |t j	¡ | 
|
¡ | 
|¡ |||
< |
||< q2W g }xÎ|rb| ¡ }t|t j	ƒ}|s¼tdƒ‚t |¡}t ||¡ | ¡ }t|t jƒ}|sòtdƒ‚t |¡}
t |
|¡}|  t|ƒ|¡ | 
|¡ t ||
 ¡ t |
¡ | ||
 ¡ | |
¡ | ||
 ¡ q–W |  ||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_LENZreadersZwritersZr2wZw2rÚiZrdZwrZbufsr   Zready_writersZready_readersÚbufr   r   r   Ú
test_poll1   sN    





 

zPollTests.test_poll1c       
      C   sP  t  ¡ \}}t  |¡ t  |¡ t ¡ }| |¡ | ¡ }|  |d |tjf¡ tt	dƒ}| 
¡ }t ¡ }| |¡ | ¡ }|  |d d |¡ | ¡  | ¡ }|  |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   ÚNopel   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   r/   p   s    z5PollTests.test_poll_unit_tests.<locals>.Almost.filenoN)r+   r,   r-   r/   r   r   r   r   ÚAlmosto   s   r0   )r   r   r!   r   r   r   r    ZPOLLNVALÚopenr   r/   ÚunlinkÚassertRaisesÚ	TypeErrorr"   ÚKeyError)
r$   ZFDr)   r%   ÚrÚfr
   Úpollsterr.   r0   r   r   r   Útest_poll_unit_testsL   s6    





zPollTests.test_poll_unit_testsc       
      C   sÞ   d}t j|dt jdd}| ¡  |  |jd d d ¡ |j}t ¡ }| 	|tj
¡ xŠdD ]‚}| |¡}|g krlqT|d \}}|tj@ r | ¡ }	|	dkrT|  d¡ qTqT|tj
@ rÈ| ¡ }	|	s¸P |  |	d¡ qTqT|  d	| ¡ qTW d 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   ZPOLLHUPÚreadlineÚfailr    )
r$   ÚcmdÚprocr%   r8   ZtoutZfdlistr
   ÚflagsÚliner   r   r   Ú
test_poll2y   s2    




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   r3   ÚOverflowErrorrF   r   )r$   r8   Ú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_MAXrL   )
Z	_testcapirQ   rR   rS   r   r   r   r3   rN   r   )r$   rQ   rR   rS   r8   r   r   r   Útest_poll_c_limits§   s    
zPollTests.test_poll_c_limitsc          
   C   sø   t  ¡ \}}|  t j|¡ |  t j|¡ g }x2tdƒD ]&}t  |¡}|  t j|¡ | |¡ q6W t ¡ }x|D ]}| 	|tj
¡ qnW tj|jd}| ¡  zBt d¡ x|D ]}| |¡ q¬W | 	|tj¡ |  t|j¡ W d t  |d¡ | ¡  X d S )Né
   )Útargetg      à?s   spam)r   r   rC   r!   r   Údupr   r   r   r   r   Ú	threadingÚThreadÚstartÚtimeZsleepr"   r   r3   r   r   Újoin)r$   r6   r)   Zrfdsr&   r
   r8   Útr   r   r   Útest_threaded_poll³   s*    



zPollTests.test_threaded_pollz!Threading required for this test.c             C   sž   x˜dD ]}t  ¡ \}}t ¡ }| |tj¡ tj|j|fd}| ¡  |j	dd |  
| ¡ ¡ t  |d¡ | 	¡  |  | ¡ ¡ t  |¡ t  |¡ qW d S )N)Niüÿÿr=   g      ð¿gš™™™™™¹¿g0Žä.ÿ+«)rV   Úargsgš™™™™™¹?)Ztimeouts   spam)r   r   r   r   r   r   rX   rY   rZ   r\   Z
assertTrueZis_aliver   ZassertFalser!   )r$   Z
timeout_msr6   r)   r8   Zpoll_threadr   r   r   Ú!test_poll_blocks_with_negative_msÏ   s    

z+PollTests.test_poll_blocks_with_negative_msN)r+   r,   r-   r(   r9   rK   rP   r   rT   r   r^   ÚunittestZ
skipUnlessrX   r`   r   r   r   r   r      s   1-
r   c               C   s   t tƒ d S )N)r   r   r   r   r   r   Ú	test_mainæ   s    rb   Ú__main__)r   r?   r   r   rX   r[   ra   Ztest.supportr   r   r   r   r   ÚAttributeErrorZSkipTestr   ZTestCaser   rb   r+   r   r   r   r   Ú<module>   s"   
 N