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eedƒsDe d¡‚ye ¡  W n: e	k
rŠ Z
 ze
j e jkrxe d¡‚‚ W ddZ
[
X Y nX G dd„ dejƒZedkr®e ¡  dS )é    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   ¡ | _| j d¡ | j ¡  | jg| _d S )N)z	127.0.0.1r   )ÚsocketÚserverSocketZbindZlistenÚconnections)Úself© r   ú /usr/lib/python3.7/test_epoll.pyÚsetUp+   s    

zTestEPoll.setUpc             C   s   x| j D ]}| ¡  qW d S )N)r   Úclose)r   Zsktr   r   r	   ÚtearDown1   s    zTestEPoll.tearDownc          
   C   s”   t   ¡ }| d¡ y| d| j ¡ d f¡ W n6 tk
rd } z|  |jd tj	¡ W d d }~X Y n
X t
dƒ‚| j ¡ \}}| j ||f¡ ||fS )NFz	127.0.0.1é   r   z&Connect should have raised EINPROGRESS)r   ZsetblockingZconnectr   ZgetsocknameÚOSErrorÚassertEqualÚargsÚerrnoZEINPROGRESSÚAssertionErrorZacceptr   Úextend)r   ÚclientÚeÚserverZaddrr   r   r	   Ú_connected_pair5   s    
&zTestEPoll._connected_pairc          
   C   sÈ   yt  d¡}W n. tk
r< } ztt|ƒƒ‚W d d }~X Y nX |  | ¡ 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_createC   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_badcreateS   s    
zTestEPoll.test_badcreatec          	   C   sP   t  d¡"}|  | ¡ d¡ |  |j¡ W d Q R X |  |j¡ |  t|j¡ d S )Nr   r   )	r   r   ZassertGreaterr   ÚassertFalser    r   r!   r"   )r   r$   r   r   r	   Útest_context_managerb   s
    zTestEPoll.test_context_managerc             C   sN  |   ¡ \}}t d¡}z4| | ¡ tjtjB ¡ | | ¡ tjtjB ¡ W d | ¡  X t d¡}z,| |tjtjB ¡ | |tjtjB ¡ W d | ¡  X 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 d | ¡  X d S )Nr&   r   i'  )r   r   r   Úregisterr   ÚEPOLLINÚEPOLLOUTr   r!   r*   Úobjectr"   r   )r   r   r   r$   r   r   r	   Útest_addi   s2    




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¡ | ¡  y| dd¡ W n8 tk
rÞ } z|  	|jd tj|¡ W d d }~X Y nX |  d¡ d S )Nr&   r   é   gÍÌÌÌÌÌì?r   z%epoll on closed fd didn't raise EBADF)r   r   r   Zfromfdr   r.   r/   r0   Úpollr   Úlenr   r   r   r   Z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}| ¡  |  ||¡ |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j¡ t 	¡ }| 
dd¡}t 	¡ }|  || d	k¡ | ¡ tjfg}|  ||¡ d S )
Nr   r   r3   gš™™™™™¹?gÍÌÌÌÌÌ @)ZtimeoutZ	maxeventss   Hello!s   world!!!g{®Gáz„?)r   r   r   r.   r   r/   r0   ZEPOLLETÚtimeÚ	monotonicr4   r,   Úsortr   ÚsendÚ
unregisterÚmodify)r   r   r   r$   Únowr6   Ú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 )Nr(   r   )r!   r"   r   r   r.   r/   )r   r   r   r	   Útest_errorsÖ   s    zTestEPoll.test_errorsc             C   sl   |   ¡ \}}| ¡ }t d¡}| |¡ t ¡ }| dd¡}t ¡ }|  || dk¡ | 	¡  | 
|¡ d S )Nr   r   r3   g{®Gáz„?)r   r   r   r   r.   r8   r9   r4   r,   r   r<   )r   r   r   Úfdr$   r>   r6   r?   r   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Úrbg      ð?)ÚopenÚ__file__Ú
addCleanupr   r   r   r   ZassertIsInstanceÚintr,   r    r   r!   r"   r=   r/   r4   r.   r<   )r   Z	open_filerB   r   r   r   r	   Ú
test_closeé   s    
zTestEPoll.test_closec             C   s.   t  ¡ }|  |j¡ |  t | ¡ ¡d¡ d S )NF)r   r   rG   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%   r+   r-   r2   r7   r@   rA   rC   rI   rL   r   r   r   r	   r   )   s   &1r   Ú__main__)r   rJ   r   r   r8   Zunittestr#   ZSkipTestr   r   r   ZENOSYSZTestCaser   rM   Úmainr   r   r   r	   Ú<module>   s"   


 _