B
    18™\'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   )
ÚsocketÚbindr   ÚHOSTÚlistenÚconnectÚgetsocknameÚacceptÚcloseÚOSError)ÚfamilyÚtypeÚprotoÚlÚcZcaddrÚaÚaddr© r   úW/oak/stanford/groups/akundaje/marinovg/programs/Python-3.7.3/Lib/test/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_READÚ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*   Ú
unregisterr0   r2   )r"   r3   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_WRITEr5   )r"   r3   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*   r7   ÚosÚdup2r5   )r"   r3   r#   r$   r8   r9   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*   r7   r5   )r"   r3   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*   Úmodifyr7   ÚassertNotEqualr   r-   Úget_keyr5   Úobjectr&   r0   r2   ÚunittestÚmockÚMockÚassertFalseÚcalled)	r"   r3   r#   r$   r   Zkey2Úd1Ú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__rD   rE   ÚpatchÚskipTestrF   ÚZeroDivisionErrorZreturn_valuer@   r!   r   r%   r(   r)   r*   r-   ÚlenÚ_mapr0   r7   )r"   rR   Úmr3   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*   r7   r0   ÚRuntimeErrorrB   r2   Ú__getitem__)r"   r3   Ú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-   rB   r0   r2   )r"   r3   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&   rP   i?B )r'   r!   r   r%   rY   rG   r-   rU   Úlistr(   r)   r*   ÚassertInr/   Úvaluesr0   r2   Ú	TypeError)r"   r3   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*   r7   ÚselectÚ
assertTrueÚ
isinstancer,   rG   r-   )r"   r3   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*   r7   r0   rZ   rB   )r"   r3   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/   rf   rg   ÚintÚassertGreaterEqual)r"   r3   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   rU   Úranger%   r(   r)   r*   r7   r   re   r   ÚfailÚrandomÚchoiceÚsendr   r-   Úrecvr5   Úremove)r"   r3   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   )Útimeout)r'   r!   r   r-   re   )r"   r3   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 )NrP   r   éÿÿÿÿg      à?gš™™™™™é?g       @)r'   r!   r   r%   r(   r)   r7   Útimer-   rU   re   Ú
assertLessr5   r*   rG   rf   )r"   r3   r#   r$   ÚtÚt0Út1Ú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)rQ   Ú
__module__Ú__qualname__r   r   r   r   ÚInterruptSelectŠ  s   r‰   c                 s   ˆ ‚d S )Nr   )Úargs)r‰   r   r   Úhandler  s    z?BaseSelectorTestCase.test_select_interrupt_exc.<locals>.handlerrP   é   g      @r   )r'   r!   r   r%   Ú	ExceptionÚsignalÚSIGALRMr†   r(   r)   r*   r   r0   re   r€   )r"   r3   r#   r$   r‹   Úorig_alrm_handlerr   r   )r‰   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   )rŠ   r   r   r   Ú<lambda>¨  ó    zDBaseSelectorTestCase.test_select_interrupt_noraise.<locals>.<lambda>rP   g      ø?g      ð?r   )r'   r!   r   r%   rŽ   r   r†   r(   r)   r*   r   rG   re   rm   )r"   r3   r#   r$   r   r   r   r   r   Útest_select_interrupt_noraise   s    
z2BaseSelectorTestCase.test_select_interrupt_noraiseN)rQ   r‡   rˆ   r%   r4   r6   r:   rD   Ú
skipUnlessr<   Únamer>   r?   rK   rX   r]   r^   rd   ri   rj   rn   rz   ÚskipIfÚsysÚplatformr}   r…   rk   rŽ   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 )ÚScalableSelectorMixInrp   é   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())ÚresourceÚ	getrlimitÚRLIMIT_NOFILEÚ	setrlimitr!   Úminr   r1   r'   r   rq   r%   rS   r(   r)   r*   r7   ÚerrnoZENOSPCre   ÚEINVALr˜   r™   r-   rU   )
r"   ÚsoftÚhardZNUM_FDSr3   rx   r#   r$   ÚeÚfdsr   r   r   Útest_above_fd_setsize¼  s<    



z+ScalableSelectorMixIn.test_above_fd_setsizeN)	rQ   r‡   rˆ   r   Úrequires_mac_verrD   r•   rŸ   rª   r   r   r   r   rš   ¹  s   
rš   c               @   s   e Zd ZejZdS )ÚDefaultSelectorTestCaseN)rQ   r‡   rˆ   r)   ÚDefaultSelectorr'   r   r   r   r   r¬   î  s   r¬   c               @   s   e Zd ZejZdS )ÚSelectSelectorTestCaseN)rQ   r‡   rˆ   r)   ÚSelectSelectorr'   r   r   r   r   r®   ó  s   r®   rM   z!Test needs selectors.PollSelectorc               @   s   e Zd ZeeddƒZdS )ÚPollSelectorTestCaserM   N)rQ   r‡   rˆ   Úgetattrr)   r'   r   r   r   r   r°   ø  s   r°   rL   z"Test needs selectors.EpollSelectorc               @   s    e Zd ZeeddƒZdd„ ZdS )ÚEpollSelectorTestCaserL   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'   ÚtempfileÚNamedTemporaryFiler0   ÚIOErrorr(   r)   r*   r2   rB   )r"   r3   Úfr   r   r   Útest_register_file  s    
z(EpollSelectorTestCase.test_register_file)rQ   r‡   rˆ   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   Úmake_bad_fdr0   r   r(   r)   r*   r-   Ú	exceptionr¤   ÚEBADFr2   rB   )r"   r3   Zbad_fÚcmr   r   r   Útest_register_bad_fd  s    z+KqueueSelectorTestCase.test_register_bad_fd)rQ   r‡   rˆ   r±   r)   r'   r¾   r   r   r   r   r¹     s   r¹   rN   z$Test needs selectors.DevpollSelectorc               @   s   e Zd ZeeddƒZdS )ÚDevpollSelectorTestCaserN   N)rQ   r‡   rˆ   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   Úrun_unittestÚreap_children)Útestsr   r   r   Ú	test_main+  s
    
rÃ   Ú__main__)"r¤   r<   rs   r)   rŽ   r   r˜   Útestr   r   r   rD   Zunittest.mockr³   r   rŸ   ÚImportErrorrk   r   ÚAF_INETÚSOCK_STREAMr   ÚTestCaser    rš   r¬   r®   r•   r°   r²   r¹   r¿   rÃ   rQ   r   r   r   r   Ú<module>   sT   

   
5




