a
    äzeîH  ã                   @   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mZ d dlZd dlZd dlZd dlmZ zd dlZW n ey¢   dZY n0 eedƒr¶ejZnejejd fdd„Zdd	„ ZG d
d„ dƒZG dd„ dƒZG dd„ deejƒZG dd„ deejƒZe eedƒd¡G dd„ deeejƒƒZe eedƒd¡G dd„ deeejƒƒZe eedƒd¡G dd„ deeejƒƒZ e eedƒd¡G d d!„ d!eeejƒƒZ!d"d#„ Z"e#d$krÐe $¡  dS )%é    N)Úsupport)Úsocket_helper)Úsleep)Ú	monotonicÚ
socketpairc              	   C   sÆ   t   | ||¡¤}| tjdf¡ | ¡  t   | ||¡}zP| | ¡ ¡ | ¡ }| ¡ \}}||krz||fW W  d   ƒ S | ¡  qNW n t	y¢   | ¡  ‚ Y n0 W d   ƒ n1 s¸0    Y  d S )Nr   )
ÚsocketÚbindr   ZHOSTÚlistenÚconnectÚgetsocknameÚacceptÚcloseÚOSError)ÚfamilyÚtypeÚprotoÚlÚcZcaddrÚaÚaddr© r   ú)/usr/lib/python3.9/test/test_selectors.pyr      s    c                 C   s*   g }| D ]\}}||@ r|  |j¡ q|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 r   )r   Ú
addCleanupr   )ÚselfÚrdÚwrr   r   r   Úmake_socketpair5   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   é?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 ©Nr(   )
r)   r"   r   r&   r*   r+   r,   Ú
unregisterr1   r3   ©r#   r5   r$   r%   r   r   r   Útest_unregisterU   s    
z$BaseSelectorTestCase.test_unregisterc                 C   sv   |   ¡ }|  |j¡ |  ¡ \}}| ¡ | ¡  }}| |tj¡ | |tj¡ | ¡  | ¡  | 	|¡ | 	|¡ d S r   )
r)   r"   r   r&   r0   r*   r+   r,   ÚEVENT_WRITEr8   )r#   r5   r$   r%   ÚrÚwr   r   r   Útest_unregister_after_fd_closed   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 r   )r)   r"   r   r&   r0   r*   r+   r,   r;   ÚosÚdup2r8   )r#   r5   r$   r%   r<   r=   Zrd2Zwr2r   r   r   Ú(test_unregister_after_fd_close_and_reusep   s    
z=BaseSelectorTestCase.test_unregister_after_fd_close_and_reusec                 C   sd   |   ¡ }|  |j¡ |  ¡ \}}| |tj¡ | |tj¡ | ¡  | ¡  | |¡ | |¡ d S r   )	r)   r"   r   r&   r*   r+   r,   r;   r8   r9   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 r7   )r)   r"   r   r&   r*   r+   r,   Úmodifyr;   ZassertNotEqualr   r.   Úget_keyr8   Úobjectr'   r1   r3   ÚunittestÚmockÚMockÚassertFalseZcalled)	r#   r5   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   ƒ n1 sÞ0    Y  |  t|jƒd
¡ W d   ƒ n1 s0    Y  d S )NÚEpollSelectorz%selectors.EpollSelector._selector_clsÚPollSelectorz$selectors.PollSelector._selector_clsÚDevpollSelectorz'selectors.DevpollSelector._selector_clsÚ )Zside_effecté   r   )r)   Ú__name__rG   rH   ÚpatchÚskipTestrI   ÚZeroDivisionErrorZreturn_valuerD   r"   r   r&   r*   r+   r,   r.   ÚlenÚ_mapr1   r;   )r#   rR   Úmr5   r$   r%   r   r   r   Útest_modify_unregister³   s2    ÿÿÿ
ÿ
,z+BaseSelectorTestCase.test_modify_unregisterc                 C   s   |   ¡ }|  |j¡ | ¡ }|  ¡ \}}| |tj¡ | |tj¡ | ¡  |  	t
|j|¡ |  	t
|j|¡ |  	t|j|¡ |  	t|j|¡ d S r   )r)   r"   r   Úget_mapr&   r*   r+   r,   r;   r1   ÚRuntimeErrorrE   r3   Ú__getitem__)r#   r5   Úmappingr$   r%   r   r   r   Ú
test_closeÎ   s    zBaseSelectorTestCase.test_closec                 C   sV   |   ¡ }|  |j¡ |  ¡ \}}| |tjd¡}|  || |¡¡ |  	t
|jd¡ d S )Nr'   r(   )r)   r"   r   r&   r*   r+   r,   r.   rE   r1   r3   r4   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   ƒ n1 sâ0    Y  |  t¡ ||= W d   ƒ n1 s0    Y  d S )Nr   r'   rP   r(   )r)   r"   r   r&   rY   rJ   r.   rU   Úlistr*   r+   r,   ZassertInr0   Úvaluesr1   r3   Ú	TypeError)r#   r5   r$   r%   Úkeysr   r   r   r   Útest_get_mapê   s"    
&z!BaseSelectorTestCase.test_get_mapc                 C   sž   |   ¡ }|  |j¡ |  ¡ \}}| |tj¡ | |tj¡}| ¡ }|D ]<\}}|  	t
|tjƒ¡ |  	|¡ |  |tjtjB  @ ¡ qH|  |tjfg|¡ d S r   )r)   r"   r   r&   r*   r+   r,   r;   ÚselectÚ
assertTrueÚ
isinstancer-   rJ   r.   )r#   r5   r$   r%   Zwr_keyÚresultr   r   r   r   r   Útest_select  s    

ÿz BaseSelectorTestCase.test_selectc                 C   s„   |   ¡ }|  |j¡ |  ¡ \}}|,}| |tj¡ | |tj¡ W d   ƒ n1 sV0    Y  |  t	|j
|¡ |  t	|j
|¡ d S r   )r)   r"   r   r&   r*   r+   r,   r;   r1   rZ   rE   )r#   r5   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 )Nr0   r   )	r)   r"   r   Úhasattrr0   re   rf   ÚintÚassertGreaterEqual)r#   r5   r/   r   r   r   Útest_fileno"  s    
z BaseSelectorTestCase.test_filenoc                 C   sˆ  |   ¡ }|  |j¡ d}d}t|ƒ}g }g }i }i }t|ƒD ]P}	|  ¡ \}
}| |
tj¡ | |tj	¡ | 
|
¡ | 
|¡ |||
< |
||< q<g }|rr| ¡ }t|tj	ƒ}|sº|  d¡ t |¡}| |¡ tdƒD ]*}	| ¡ }t|tjƒ}|rø qtdƒ qÖ|  d¡ |  || g|¡ |d }
|
 |¡}|  t|ƒ|¡ | 
|¡ | ||
 ¡ | |
¡ | ||
 ¡ q’|  ||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,   r;   r   rd   r    ZfailÚrandomÚchoiceÚsendr   r.   Úrecvr8   Úremove)r#   r5   ZNUM_SOCKETSZMSGZMSG_LENÚreadersZwritersZr2wZw2rÚir$   r%   Zbufsr   Zready_writersZready_readersÚbufr   r   r   Útest_selector+  sV    





ÿ




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.   rd   )r#   r5   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      à?çš™™™™™é?ç       @)r)   r"   r   r&   r*   r+   r;   Útimer.   rU   rd   Ú
assertLessr8   r,   rJ   re   )r#   r5   r$   r%   ÚtÚt0Út1Údtr   r   r   Útest_timeouti  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|¡ zrt d¡ | |t	j
¡ tƒ }|  ˆ ¡ | d¡ W d   ƒ n1 s¦0    Y  |  tƒ | d¡ W t d¡ nt d¡ 0 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 r   r   ©Ú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€   r1   rd   r   )r#   r5   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|¡ zNt d¡ | |tj	¡ t
ƒ }|  | d¡¡ |  t
ƒ | d¡ W t d¡ nt d¡ 0 d S )Nc                  W   s   d S r   r   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€   rJ   rd   rl   )r#   r5   r$   r%   r“   r‚   r   r   r   Útest_select_interrupt_noraise¡  s    
z2BaseSelectorTestCase.test_select_interrupt_noraiseN)rQ   rˆ   r‰   r&   r6   r:   r>   rG   Ú
skipUnlessr@   ÚnamerB   rC   rK   rX   r]   r^   rc   rh   ri   rm   ry   ZskipIfÚsysÚplatformr|   r†   rj   r‘   r”   r—   r   r   r   r   r!   3   s:   
&	5ÿ
ÿ
ÿr!   c                   @   s,   e Zd Ze dd¡e ed¡dd„ ƒƒZdS )ÚScalableSelectorMixInro   é   zTest needs resource modulec           
      C   s’  t  t j¡\}}z6t  t j||f¡ |  t jt j||f¡ t|dƒ}W n ttfy`   |}Y n0 |d8 }|  ¡ }|  |j	¡ t
|d ƒD ]”}z|  ¡ \}}W n tyº   |  d¡ Y n0 z | |tj¡ | |tj¡ W qŠ ty } z&|jtjkr|  d¡ ‚ W Y d }~qŠd }~0 0 qŠz| ¡ }	W nL tyx } z2|jtjkrbtjdkrb|  d¡ ‚ W Y d }~n
d }~0 0 |  |d t|	ƒ¡ d S )Ni   é    é   zFD limit reachedÚdarwinz%Invalid argument error calling poll())ÚresourceZ	getrlimitZRLIMIT_NOFILEZ	setrlimitr"   Úminr   r2   r)   r   rp   r&   rS   r*   r+   r,   r;   ÚerrnoÚENOSPCrd   ÚEINVALrš   r›   r.   rU   )
r#   ZsoftZhardZNUM_FDSr5   rw   r$   r%   ÚeÚfdsr   r   r   Útest_above_fd_setsize½  s>    ÿ


z+ScalableSelectorMixIn.test_above_fd_setsizeN)	rQ   rˆ   r‰   r   Zrequires_mac_verrG   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   s    |   ¡ }t ¡ |}|  t¡ | |tj¡ W d   ƒ n1 s@0    Y  |  t¡ | 	|¡ W d   ƒ n1 st0    Y  W d   ƒ n1 s’0    Y  d S r   )
r)   ÚtempfileÚNamedTemporaryFiler1   ÚIOErrorr*   r+   r,   r3   rE   )r#   r5   Ú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d„ ZdS )ÚKqueueSelectorTestCaser¶   Nc                 C   s’   |   ¡ }t ¡ }|  t¡}| |tj¡ W d   ƒ n1 s>0    Y  |  |j	j
t
j¡ |  t¡ | |¡ W d   ƒ n1 s„0    Y  d S r   )r)   r   Zmake_bad_fdr1   r   r*   r+   r,   r.   Ú	exceptionr£   ÚEBADFr3   rE   )r#   r5   Zbad_fÚcmr   r   r   Útest_register_bad_fd  s    ,z+KqueueSelectorTestCase.test_register_bad_fdc                 C   s^   |   ¡ }|  |j¡ tƒ }|  | d¡g ¡ tƒ }|| }|  d|  koPdkn  |¡ d S )NrP   r~   r   )r)   r"   r   r€   r.   rd   re   )r#   r5   rƒ   r„   r…   r   r   r   Útest_empty_select_timeout&  s    z0KqueueSelectorTestCase.test_empty_select_timeout)rQ   rˆ   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   Nr®   r   r   r   r   r½   4  s   r½   c                   C   s   t  ¡  d S r   )r   Úreap_childrenr   r   r   r   ÚtearDownModule<  s    r¿   Ú__main__)%r£   r@   rq   r+   r‘   r   rš   Útestr   Ztest.supportr   r€   r   rG   Zunittest.mockr±   r   r¡   ÚImportErrorrj   r   ÚAF_INETÚSOCK_STREAMr    r!   rœ   ZTestCaser©   r«   r˜   r­   r°   r·   r½   r¿   rQ   Úmainr   r   r   r   Ú<module>   sn   

   
5ÿÿÿÿÿÿÿÿ
