B
    u9a'G  ã               @   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 d dl	m
Z
 d dlZd dlZd dlZd dl	mZ	 yd dlZW n ek
r˜   dZY nX eedƒr¬ejZnejejd fdd„Zdd„ ZG d	d
„ d
ejƒZG dd„ dƒZG dd„ deƒZG dd„ deƒZe eedƒd¡G dd„ deeƒƒZe eedƒd¡G dd„ deeƒƒZe eedƒd¡G dd„ deeƒƒZe eedƒd¡G dd „ d eeƒƒZd!d"„ Z e!d#kr°e ƒ  dS )$é    N)Úsupport)Úsleep)Ú	monotonicÚ
socketpairc          	   C   s¨   t   | ||¡}| tjdf¡ | ¡  t   | ||¡}yD| | ¡ ¡ | ¡ }x(| ¡ \}}||krl||fS | ¡  qPW W n t	k
r˜   | ¡  ‚ Y nX W d Q R X d S )Nr   )
ÚsocketZbindr   ZHOSTZlistenZconnectZgetsocknameZacceptÚcloseÚOSError)ZfamilyÚtypeÚprotoÚlÚcZcaddrÚaZaddr© r   ú$/usr/lib/python3.7/test_selectors.pyr      s    c             C   s.   g }x$| D ]\}}||@ r
|  |j¡ q
W |S )N)ÚappendÚfileobj)ÚreadyÚflagÚmatchÚkeyÚeventsr   r   r   Úfind_ready_matching*   s
    r   c               @   sì   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Ze e	j
d	kd
¡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e ejd!kd"¡d#d$„ ƒZd%d&„ Ze eed'ƒd(¡d)d*„ ƒZe eed'ƒd(¡d+d,„ ƒZd-S ).ÚBaseSelectorTestCasec             C   s*   t ƒ \}}|  |j¡ |  |j¡ ||fS )N)r   Ú
addCleanupr   )ÚselfÚrdÚwrr   r   r   Úmake_socketpair4   s    
z$BaseSelectorTestCase.make_socketpairc             C   sÒ   |   ¡ }|  |j¡ |  ¡ \}}| |tjd¡}|  |tj¡ |  	|j
|¡ |  	|j| ¡ ¡ |  	|jtj¡ |  	|jd¡ |  t|jdd¡ |  t|jdtj¡ |  t|j|tj¡ |  t|j| ¡ tj¡ d S )NÚdatar   i?B iöÿÿÿ)ÚSELECTORr   r   r   ÚregisterÚ	selectorsÚ
EVENT_READZassertIsInstanceÚSelectorKeyÚassertEqualr   ÚfdÚfilenor   r   ÚassertRaisesÚ
ValueErrorÚKeyError)r   Úsr   r   r   r   r   r   Útest_register:   s    z"BaseSelectorTestCase.test_registerc             C   s\   |   ¡ }|  |j¡ |  ¡ \}}| |tj¡ | |¡ |  t	|jd¡ |  t	|j|¡ d S )Ni?B )
r   r   r   r   r    r!   r"   Ú
unregisterr'   r)   )r   r*   r   r   r   r   r   Útest_unregisterT   s    
z$BaseSelectorTestCase.test_unregisterc             C   sv   |   ¡ }|  |j¡ |  ¡ \}}| ¡ | ¡  }}| |tj¡ | |tj¡ | ¡  | ¡  | 	|¡ | 	|¡ d S )N)
r   r   r   r   r&   r    r!   r"   ÚEVENT_WRITEr,   )r   r*   r   r   ÚrÚwr   r   r   Útest_unregister_after_fd_closec   s    
z3BaseSelectorTestCase.test_unregister_after_fd_closeÚposixzrequires posixc             C   s¾   |   ¡ }|  |j¡ |  ¡ \}}| ¡ | ¡  }}| |tj¡ | |tj¡ |  ¡ \}}| ¡  | ¡  t	 
| ¡ |¡ t	 
| ¡ |¡ |  t	j|¡ |  t	j|¡ | |¡ | |¡ d S )N)r   r   r   r   r&   r    r!   r"   r.   ÚosÚdup2r,   )r   r*   r   r   r/   r0   Zrd2Zwr2r   r   r   Ú(test_unregister_after_fd_close_and_reuseo   s    
z=BaseSelectorTestCase.test_unregister_after_fd_close_and_reusec             C   sd   |   ¡ }|  |j¡ |  ¡ \}}| |tj¡ | |tj¡ | ¡  | ¡  | |¡ | |¡ d S )N)	r   r   r   r   r    r!   r"   r.   r,   )r   r*   r   r   r   r   r   Ú"test_unregister_after_socket_close   s    
z7BaseSelectorTestCase.test_unregister_after_socket_closec       	      C   s6  |   ¡ }|  |j¡ |  ¡ \}}| |tj¡}| |tj¡}|  	|j
|j
¡ |  || |¡¡ | |¡ tƒ }tƒ }| |tj|¡}| |tj|¡}|  |j
|j
¡ |  	|j|j¡ |  || |¡¡ |  |j|¡ |  t|jdtj¡ tƒ }tj ¡ |_tj ¡ |_| |tj|¡ |  |jj¡ |  |jj¡ d S )Ni?B )r   r   r   r   r    r!   r"   Úmodifyr.   ZassertNotEqualr   r$   Úget_keyr,   Úobjectr   r'   r)   ÚunittestÚmockÚMockÚassertFalseZcalled)	r   r*   r   r   r   Zkey2Zd1Zd2Zd3r   r   r   Útest_modifyŒ   s.    
z BaseSelectorTestCase.test_modifyc          
   C   sô   | j jdkrtj d¡}n>| j jdkr4tj d¡}n$| j jdkrNtj d¡}n
|  d¡‚|Ž}tjjtd|j_	|   ¡ }|  
|j¡ |  ¡ \}}| |tj¡ |  t|jƒd	¡ |  t¡ | 	|tj¡ W d Q R X |  t|jƒd
¡ W d Q R X d S )NÚEpollSelectorz%selectors.EpollSelector._selector_clsÚPollSelectorz$selectors.PollSelector._selector_clsÚDevpollSelectorz'selectors.DevpollSelector._selector_clsÚ )Zside_effecté   r   )r   Ú__name__r:   r;   ÚpatchÚskipTestr<   ÚZeroDivisionErrorZreturn_valuer7   r   r   r   r    r!   r"   r$   ÚlenZ_mapr'   r.   )r   rE   Úmr*   r   r   r   r   r   Útest_modify_unregister²   s*    
z+BaseSelectorTestCase.test_modify_unregisterc             C   s   |   ¡ }|  |j¡ | ¡ }|  ¡ \}}| |tj¡ | |tj¡ | ¡  |  	t
|j|¡ |  	t
|j|¡ |  	t|j|¡ |  	t|j|¡ d S )N)r   r   r   Úget_mapr   r    r!   r"   r.   r'   ÚRuntimeErrorr8   r)   Ú__getitem__)r   r*   Úmappingr   r   r   r   r   Ú
test_closeÍ   s    zBaseSelectorTestCase.test_closec             C   sV   |   ¡ }|  |j¡ |  ¡ \}}| |tjd¡}|  || |¡¡ |  	t
|jd¡ d S )Nr   i?B )r   r   r   r   r    r!   r"   r$   r8   r'   r)   )r   r*   r   r   r   r   r   r   Útest_get_keyÝ   s    z!BaseSelectorTestCase.test_get_keyc          	   C   sø   |   ¡ }|  |j¡ |  ¡ \}}| ¡ }|  |¡ |  t|ƒd¡ |  t|ƒg ¡ | 	|t
jd¡}|  ||¡ |  ||| ¡ |  t|ƒd¡ |  t|ƒ| ¡ g¡ |  t| ¡ ƒ|g¡ |  t¡ |d  W d Q R X |  t¡ ||= W d Q R X d S )Nr   r   rC   i?B )r   r   r   r   rK   r=   r$   rH   Úlistr    r!   r"   ZassertInr&   Úvaluesr'   r)   Ú	TypeError)r   r*   r   r   Úkeysr   r   r   r   Útest_get_mapé   s"    
z!BaseSelectorTestCase.test_get_mapc             C   s¢   |   ¡ }|  |j¡ |  ¡ \}}| |tj¡ | |tj¡}| ¡ }xD|D ]<\}}|  	t
|tjƒ¡ |  	|¡ |  |tjtjB  @ ¡ qJW |  |tjfg|¡ d S )N)r   r   r   r   r    r!   r"   r.   ÚselectÚ
assertTrueÚ
isinstancer#   r=   r$   )r   r*   r   r   Zwr_keyÚresultr   r   r   r   r   Útest_select  s    

z BaseSelectorTestCase.test_selectc          	   C   sp   |   ¡ }|  |j¡ |  ¡ \}}|"}| |tj¡ | |tj¡ W d Q R X |  t	|j
|¡ |  t	|j
|¡ d S )N)r   r   r   r   r    r!   r"   r.   r'   rL   r8   )r   r*   r   r   Zselr   r   r   Útest_context_manager  s    z)BaseSelectorTestCase.test_context_managerc             C   sF   |   ¡ }|  |j¡ t|dƒrB| ¡ }|  t|tƒ¡ |  |d¡ d S )Nr&   r   )	r   r   r   Úhasattrr&   rW   rX   ÚintÚassertGreaterEqual)r   r*   r%   r   r   r   Útest_fileno!  s    
z BaseSelectorTestCase.test_filenoc             C   s  |   ¡ }|  |j¡ d}d}t|ƒ}g }g }i }i }x\t|ƒD ]P}	|  ¡ \}
}| |
tj¡ | |tj	¡ | 
|
¡ | 
|¡ |||
< |
||< q>W g }xâ|rx| ¡ }t|tj	ƒ}|sÀ|  d¡ t |¡}| |¡ x<tdƒD ]&}	| ¡ }t|tjƒ}|rüP tdƒ qÞW |  d¡ |  || g|¡ |d }
|
 |¡}|  t|ƒ|¡ | 
|¡ | ||
 ¡ | |
¡ | ||
 ¡ q˜W |  ||g| ¡ d S )Né   s    This is a test.zno sockets ready for writingé
   gš™™™™™¹?zno sockets ready for readingr   )r   r   r   rH   Úranger   r    r!   r"   r.   r   rV   r   ZfailÚrandomÚchoiceÚsendr   r$   Zrecvr,   Úremove)r   r*   ZNUM_SOCKETSZMSGZMSG_LENZreadersZwritersZr2wZw2rÚir   r   Zbufsr   Zready_writersZready_readersÚbufr   r   r   Útest_selector*  sT    








z"BaseSelectorTestCase.test_selectorÚwin32z1select.select() cannot be used with empty fd setsc             C   s,   |   ¡ }|  |j¡ |  |jddg ¡ d S )Nr   )Ztimeout)r   r   r   r$   rV   )r   r*   r   r   r   Útest_empty_select_  s    z&BaseSelectorTestCase.test_empty_selectc             C   s
  |   ¡ }|  |j¡ |  ¡ \}}| |tj¡ tƒ }|  dt	| 
d¡ƒ¡ |  dt	| 
d¡ƒ¡ |  tƒ | d¡ | |¡ | |tj¡ tƒ }|  | 
d¡¡ |  | 
d¡¡ |  tƒ | d¡ tƒ }|  | 
d¡¡ tƒ }|| }|  d|  koüdkn  |¡ d S )NrC   r   éÿÿÿÿg      à?gš™™™™™é?g       @)r   r   r   r   r    r!   r.   Útimer$   rH   rV   Ú
assertLessr,   r"   r=   rW   )r   r*   r   r   ÚtZt0Zt1Zdtr   r   r   Útest_timeouth  s&    
z!BaseSelectorTestCase.test_timeoutÚalarmz%signal.alarm() required for this testc          	      sÂ   |   ¡ }|  |j¡ |  ¡ \}}G dd„ dtƒ‰ ‡ fdd„}t tj|¡}|  tjtj|¡ zTt d¡ | |t	j
¡ tƒ }|  ˆ ¡ | d¡ W d Q R X |  tƒ | d¡ W d t d¡ X d S )	Nc               @   s   e Zd ZdS )zGBaseSelectorTestCase.test_select_interrupt_exc.<locals>.InterruptSelectN)rD   Ú
__module__Ú__qualname__r   r   r   r   ÚInterruptSelectŠ  s   rt   c                 s   ˆ ‚d S )Nr   )Úargs)rt   r   r   Úhandler  s    z?BaseSelectorTestCase.test_select_interrupt_exc.<locals>.handlerrC   é   g      @r   )r   r   r   r   Ú	ExceptionÚsignalÚSIGALRMrq   r    r!   r"   rm   r'   rV   rn   )r   r*   r   r   rv   Úorig_alrm_handlerro   r   )rt   r   Útest_select_interrupt_exc‚  s    
z.BaseSelectorTestCase.test_select_interrupt_excc          	   C   sš   |   ¡ }|  |j¡ |  ¡ \}}t tjdd„ ¡}|  tjtj|¡ zDt d¡ | |tj	¡ t
ƒ }|  | d¡¡ |  t
ƒ | d¡ W d t d¡ X d S )Nc              W   s   d S )Nr   )ru   r   r   r   Ú<lambda>¨  ó    zDBaseSelectorTestCase.test_select_interrupt_noraise.<locals>.<lambda>rC   g      ø?g      ð?r   )r   r   r   r   ry   rz   rq   r    r!   r"   rm   r=   rV   r^   )r   r*   r   r   r{   ro   r   r   r   Útest_select_interrupt_noraise   s    
z2BaseSelectorTestCase.test_select_interrupt_noraiseN)rD   rr   rs   r   r+   r-   r1   r:   Ú
skipUnlessr3   Únamer5   r6   r>   rJ   rO   rP   rU   rZ   r[   r_   ri   ZskipIfÚsysÚplatformrk   rp   r\   ry   r|   r   r   r   r   r   r   2   s,   &	5r   c               @   s,   e Zd Ze dd¡e ed¡dd„ ƒƒZdS )ÚScalableSelectorMixInra   é   zTest needs resource modulec       
      C   s–  t  t j¡\}}y6t  t j||f¡ |  t jt j||f¡ t|dƒ}W n ttfk
rb   |}Y nX |d8 }|  ¡ }|  |j	¡ x¤t
|d ƒD ]”}y|  ¡ \}}W n tk
rÀ   |  d¡ Y nX y | |tj¡ | |tj¡ W qŽ tk
r  } z|jtjkr|  d¡ ‚ W d d }~X Y qŽX qŽW y| ¡ }	W nJ tk
r| } z*|jtjkrjtjdkrj|  d¡ ‚ W d d }~X Y nX |  |d t|	ƒ¡ d S )Ni   é    é   zFD limit reachedÚdarwinz%Invalid argument error calling poll())ÚresourceZ	getrlimitZRLIMIT_NOFILEZ	setrlimitr   Úminr   r(   r   r   rb   r   rF   r    r!   r"   r.   ÚerrnoZENOSPCrV   ZEINVALr‚   rƒ   r$   rH   )
r   ZsoftZhardZNUM_FDSr*   rg   r   r   ÚeZfdsr   r   r   Útest_above_fd_setsize¼  s<    



z+ScalableSelectorMixIn.test_above_fd_setsizeN)	rD   rr   rs   r   Zrequires_mac_verr:   r€   r‰   r   r   r   r   r   r„   ¹  s   
r„   c               @   s   e Zd ZejZdS )ÚDefaultSelectorTestCaseN)rD   rr   rs   r!   ZDefaultSelectorr   r   r   r   r   rŽ   î  s   rŽ   c               @   s   e Zd ZejZdS )ÚSelectSelectorTestCaseN)rD   rr   rs   r!   ZSelectSelectorr   r   r   r   r   r   ó  s   r   r@   z!Test needs selectors.PollSelectorc               @   s   e Zd ZeeddƒZdS )ÚPollSelectorTestCaser@   N)rD   rr   rs   Úgetattrr!   r   r   r   r   r   r   ø  s   r   r?   z"Test needs selectors.EpollSelectorc               @   s    e Zd ZeeddƒZdd„ ZdS )ÚEpollSelectorTestCaser?   Nc          
   C   sd   |   ¡ }t ¡ J}|  t¡ | |tj¡ W d Q R X |  t¡ | 	|¡ W d Q R X W d Q R X d S )N)
r   ÚtempfileZNamedTemporaryFiler'   ÚIOErrorr    r!   r"   r)   r8   )r   r*   Úfr   r   r   Útest_register_file  s    
z(EpollSelectorTestCase.test_register_file)rD   rr   rs   r‘   r!   r   r–   r   r   r   r   r’   ÿ  s   r’   ÚKqueueSelectorz$Test needs selectors.KqueueSelector)c               @   s    e Zd ZeeddƒZdd„ ZdS )ÚKqueueSelectorTestCaser—   Nc          	   C   sj   |   ¡ }t ¡ }|  t¡}| |tj¡ W d Q R X |  |j	j
t
j¡ |  t¡ | |¡ W d Q R X d S )N)r   r   Zmake_bad_fdr'   r   r    r!   r"   r$   Z	exceptionr‹   ZEBADFr)   r8   )r   r*   Zbad_fÚcmr   r   r   Útest_register_bad_fd  s    z+KqueueSelectorTestCase.test_register_bad_fd)rD   rr   rs   r‘   r!   r   rš   r   r   r   r   r˜     s   r˜   rA   z$Test needs selectors.DevpollSelectorc               @   s   e Zd ZeeddƒZdS )ÚDevpollSelectorTestCaserA   N)rD   rr   rs   r‘   r!   r   r   r   r   r   r›   #  s   r›   c              C   s&   t tttttg} tj| Ž  t ¡  d S )N)	rŽ   r   r   r’   r˜   r›   r   Zrun_unittestZreap_children)Ztestsr   r   r   Ú	test_main+  s
    
rœ   Ú__main__)"r‹   r3   rc   r!   ry   r   r‚   Ztestr   rm   r   r:   Zunittest.mockr“   r   r‰   ÚImportErrorr\   r   ZAF_INETZSOCK_STREAMr   ZTestCaser   r„   rŽ   r   r€   r   r’   r˜   r›   rœ   rD   r   r   r   r   Ú<module>   sT   

   
5




