a
    äze$  ã                
   @   s¸   d 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eedƒsHe d¡‚ze 	¡  W n< e
y Z z$ejejkrze d¡‚‚ W Y dZ[n
dZ[0 0 G dd„ dejƒZedkr´e ¡  dS )	z
Tests for epoll wrapper.
é    NÚepollztest works only on Linux 2.6zkernel doesn't support epoll()c                   @   st   e 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d„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )Ú	TestEPollc                 C   s   t  d¡| _| jg| _d S )N)ú	127.0.0.1r   )ÚsocketÚcreate_serverÚserverSocketÚconnections©Úself© r   ú%/usr/lib/python3.9/test/test_epoll.pyÚsetUp+   s    zTestEPoll.setUpc                 C   s   | j D ]}| ¡  qd S )N)r   Úclose)r
   Zsktr   r   r   ÚtearDown/   s    
zTestEPoll.tearDownc              
   C   s–   t   ¡ }| d¡ z| d| j ¡ d f¡ W n8 tyf } z |  |jd tj	¡ W Y d }~nd }~0 0 t
dƒ‚| j ¡ \}}| j ||f¡ ||fS )NFr   é   r   z&Connect should have raised EINPROGRESS)r   ÚsetblockingÚconnectr   ÚgetsocknameÚOSErrorÚassertEqualÚargsÚerrnoZEINPROGRESSÚAssertionErrorÚacceptr   Úextend)r
   ÚclientÚeÚserverÚaddrr   r   r   Ú_connected_pair3   s    
*zTestEPoll._connected_pairc              
   C   sÊ   zt  d¡}W n0 ty> } ztt|ƒƒ‚W Y d }~n
d }~0 0 |  | ¡ dk| ¡ ¡ |  |j ¡ | ¡  |  |j¡ |  	t
|j¡ tt dƒrÆt  dt j¡ ¡  t jt jd ¡  t jdd ¡  d S )Né   r   ÚEPOLL_CLOEXECéÿÿÿÿ©Úflags)Úselectr   r   r   ÚstrÚ
assertTrueÚfilenoÚclosedr   ÚassertRaisesÚ
ValueErrorÚhasattrr!   )r
   Úepr   r   r   r   Útest_createA   s    "
zTestEPoll.test_createc                 C   s¸   |   ttjddd¡ |   ttjd¡ |   ttjd ¡ |   ttjd¡ |   ttjdg¡ |   ttji ¡ |   ttjd¡ |   ttjd¡ | j ttjdd ttd	ƒr´| j ttjd
d d S )Nr   é   é   Zfoor   r   éþÿÿÿ)Úsizehintr!   iD0  r#   )r*   Ú	TypeErrorr%   r   r+   r,   r   r	   r   r   r   Útest_badcreateQ   s    
zTestEPoll.test_badcreatec                 C   sd   t  d¡,}|  | ¡ d¡ |  |j¡ W d   ƒ n1 s<0    Y  |  |j¡ |  t|j¡ d S )Nr    r   )	r%   r   ZassertGreaterr(   ÚassertFalser)   r'   r*   r+   )r
   r-   r   r   r   Útest_context_manager`   s
    *zTestEPoll.test_context_managerc                 C   sf  |   ¡ \}}t d¡}z<| | ¡ tjtjB ¡ | | ¡ tjtjB ¡ W | ¡  n
| ¡  0 t d¡}z4| |tjtjB ¡ | |tjtjB ¡ W | ¡  n
| ¡  0 t d¡}z¤|  t	|jt
ƒ tjtjB ¡ |  t	|jd tjtjB ¡ |  t|jdtjtjB ¡ |  t|jdtjtjB ¡ | |tjtjB ¡ |  t|j|tjtjB ¡ W | ¡  n
| ¡  0 d S )Nr/   r"   i'  )r   r%   r   Úregisterr(   ÚEPOLLINÚEPOLLOUTr   r*   r3   Úobjectr+   r   )r
   r   r   r-   r   r   r   Útest_addg   s<    



ÿ
ÿ
ÿ
ÿ
ÿzTestEPoll.test_addc              
   C   s  |   ¡ \}}t d¡ˆ}tj | ¡ ¡}| | ¡ tjtjB ¡ | | ¡ tjtjB ¡ | dd¡}| dd¡}|  	t
|ƒd¡ |  	t
|ƒd¡ W d   ƒ n1 s¤0    Y  z| dd¡ W n: tyø } z"|  	|jd tj|¡ W Y d }~nd }~0 0 |  d¡ d S )Nr/   r   é   gÍÌÌÌÌÌì?r   z%epoll on closed fd didn't raise EBADF)r   r%   r   Úfromfdr(   r7   r8   r9   Úpollr   Úlenr   r   r   ÚEBADFZfail)r
   r   r   r-   Zep2ÚeventsZevents2r   r   r   r   Útest_fromfd   s    .,zTestEPoll.test_fromfdc                 C   sº  |   ¡ \}}t d¡}| | ¡ tjtjB tjB ¡ | | ¡ tjtjB tjB ¡ t 	¡ }| 
dd¡}t 	¡ }|  || dk|| ¡ | ¡ tjf| ¡ tjfg}|  t|ƒt|ƒ¡ |j
ddd}|  |¡ | d¡ | d¡ t 	¡ }| 
dd¡}t 	¡ }|  || d	k¡ | ¡ tjtjB f| ¡ tjtjB fg}|  t|ƒt|ƒ¡ | | ¡ ¡ | | ¡ tj¡ t 	¡ }| 
dd¡}t 	¡ }|  || d	k¡ | ¡ tjfg}|  ||¡ d S )
Nr    r   r<   gš™™™™™¹?)ÚtimeoutZ	maxeventss   Hello!s   world!!!ç      ð?ç{®Gáz„?)r   r%   r   r7   r(   r8   r9   ÚEPOLLETÚtimeÚ	monotonicr>   r5   r   ÚsortedÚsendallÚ
unregisterÚmodify)r
   r   r   r-   ÚnowrA   ÚthenZexpectedr   r   r   Útest_control_and_wait¢   sH    

ÿ
ÿÿ


ÿzTestEPoll.test_control_and_waitc                 C   s,   |   ttjd¡ |   tt ¡ jdtj¡ d S )Nr1   r"   )r*   r+   r%   r   r7   r8   r	   r   r   r   Útest_errorsÑ   s    ÿzTestEPoll.test_errorsc           	      C   s¨   |   ¡ \}}| ¡ }t d¡}| |¡ t ¡ }| dd¡}t ¡ }|  || dk¡ | 	¡  |  
t¡}| |¡ W d   ƒ n1 sˆ0    Y  |  |jjtj¡ d S )Nr    r   r<   rE   )r   r(   r%   r   r7   rG   rH   r>   r5   r   r*   r   rK   r   Ú	exceptionr   r@   )	r
   r   r   Úfdr-   rM   rA   rN   Úcmr   r   r   Útest_unregister_closedÖ   s    

(z TestEPoll.test_unregister_closedc                 C   s¸   t tdƒ}|  |j¡ | ¡ }t ¡ }|  | ¡ t¡ |  	|j
¡ | ¡  |  |j
¡ |  t|j¡ | ¡  |  t|j|tj¡ |  t|jd¡ |  t|j|tj¡ |  t|j|¡ d S )NÚrbrD   )ÚopenÚ__file__Ú
addCleanupr   r(   r%   r   ZassertIsInstanceÚintr5   r)   r'   r*   r+   rL   r8   r>   r7   rK   )r
   Z	open_filerR   r   r   r   r   Ú
test_closeç   s    
zTestEPoll.test_closec                 C   s.   t  ¡ }|  |j¡ |  t | ¡ ¡d¡ d S )NF)r%   r   rX   r   r   ÚosÚget_inheritabler(   )r
   r   r   r   r   Útest_fd_non_inheritableÿ   s    z!TestEPoll.test_fd_non_inheritableN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r.   r4   r6   r;   rB   rO   rP   rT   rZ   r]   r   r   r   r   r   )   s   &/r   Ú__main__)Ú__doc__r   r[   r%   r   rG   Zunittestr,   ZSkipTestr   r   r   ZENOSYSZTestCaser   r^   Úmainr   r   r   r   Ú<module>   s$   


 ]