o
    °ó®gh  ã                   @   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Zd dlZd dl	m
Z
 d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ e
jrPe  d¡‚d dlZe ¡  e d	e¡ d dlZW d  ƒ n1 smw   Y  eed
ƒZG dd„ dƒZG dd„ dƒZG dd„ dƒZG dd„ dƒZdd„ Zdd„ Z G dd„ de j!ƒZ"G dd„ de j!ƒZ#G dd„ dej$ƒZ%G dd„ de j!ƒZ&e  'eedƒd ¡G d!d"„ d"e j!ƒƒZ(G d#d$„ d$ej)ƒZ*G d%d&„ d&ej)ƒZ+G d'd(„ d(e*ƒZ,G d)d*„ d*ƒZ-G d+d,„ d,e-ƒZ.e  'ej/d-¡G d.d/„ d/e-ƒƒZ0e  'ed0¡G d1d2„ d2e-ƒƒZ1G d3d4„ d4e.e j!ƒZ2e  'eed5ƒd6¡G d7d8„ d8e.e j!ƒƒZ3G d9d:„ d:e0e j!ƒZ4e  'eed5ƒd6¡G d;d<„ d<e0e j!ƒƒZ5G d=d>„ d>e1e j!ƒZ6e  'eed5ƒd6¡G d?d@„ d@e1e j!ƒƒZ7e8dAkrye  9¡  dS dS )Bé    N)Úsupport)Ú	os_helper)Úsocket_helper)Úthreading_helper)Úwarnings_helper)ÚBytesIOztest is not helpful for PGOÚignoreÚAF_UNIXc                   @   ó$   e Zd Zdd„ Zdd„ Zdd„ ZdS )Údummysocketc                 C   ó
   d| _ d S ©NF©Úclosed©Úself© r   úH/Users/admin/.pyenv/versions/3.10.0/lib/python3.10/test/test_asyncore.pyÚ__init__   ó   
zdummysocket.__init__c                 C   r   ©NTr   r   r   r   r   Úclose!   r   zdummysocket.closec                 C   ó   dS )Né*   r   r   r   r   r   Úfileno$   ó   zdummysocket.filenoN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r   r      s    r   c                   @   ó   e Zd Zdd„ Zdd„ ZdS )Údummychannelc                 C   s   t ƒ | _d S ©N)r   Úsocketr   r   r   r   r   (   ó   zdummychannel.__init__c                 C   s   | j  ¡  d S r!   )r"   r   r   r   r   r   r   +   ó   zdummychannel.closeN)r   r   r   r   r   r   r   r   r   r    '   ó    r    c                   @   s(   e Zd Zdd„ Zdd„ ZeZeZeZdS )Úexitingdummyc                 C   ó   d S r!   r   r   r   r   r   r   /   r   zexitingdummy.__init__c                 C   s   t  ¡ ‚r!   )ÚasyncoreÚExitNowr   r   r   r   Úhandle_read_event2   ó   zexitingdummy.handle_read_eventN)r   r   r   r   r*   Úhandle_write_eventÚhandle_closeÚhandle_expt_eventr   r   r   r   r&   .   s    r&   c                   @   s0   e Zd Zdd„ Zdd„ ZeZeZeZdd„ ZdS )Úcrashingdummyc                 C   r   r   ©Úerror_handledr   r   r   r   r   :   r   zcrashingdummy.__init__c                 C   s   t ƒ ‚r!   ©Ú	Exceptionr   r   r   r   r*   =   s   zcrashingdummy.handle_read_eventc                 C   r   r   r0   r   r   r   r   Úhandle_errorD   r   zcrashingdummy.handle_errorN©	r   r   r   r   r*   r,   r-   r.   r4   r   r   r   r   r/   9   s    r/   c                 C   s  zxz|  ¡  | ¡ \}}W n	 ty   Y nXw d}t ¡ }|dkr_t ¡ | dk r_t |gg g d¡\}}}	|rN|d8 }| d¡}
| |
 dd¡¡ d|
v rNq_t 	d	¡ |dkr_t ¡ | dk s)| 
¡  W | 
¡  |  ¡  d S W | 
¡  |  ¡  d S | 
¡  |  ¡  w )
NéÈ   r   g      @çš™™™™™¹?é   é
   ó   
ó    ç{®Gáz„?)ÚlistenÚacceptÚTimeoutErrorÚtimeÚ	monotonicÚselectÚrecvÚwriteÚreplaceÚsleepr   Úset)ÚevtÚbufZservÚconnÚaddrÚnÚstartÚrÚwÚeÚdatar   r   r   Úcapture_serverH   s4   ÿ

÷
îÿ
rR   c                 C   s:   	 t r| jtjkrt |¡ t | |¡ d S |  |¡ d S r!   )	ÚHAS_UNIX_SOCKETSÚfamilyr"   r	   r   Úunlinkr   Zbind_unix_socketÚbind)ÚsockrK   r   r   r   Úbind_af_awarea   s
   
rX   c                   @   sN   e Zd Zdd„ Ze eedƒd¡dd„ ƒZdd„ Z	d	d
„ Z
dd„ Zdd„ ZdS )ÚHelperFunctionTestsc                 C   sš   t ƒ }|  tjtj|¡ |  tjtj|¡ |  tjtj|¡ tƒ }t |¡ |  |j	d¡ tƒ }t |¡ |  |j	d¡ tƒ }t |¡ |  |j	d¡ d S r   )
r&   ÚassertRaisesr(   r)   ÚreadrD   Ú
_exceptionr/   ÚassertEqualr1   )r   Útr1Útr2r   r   r   Útest_readwriteexcl   s   


z%HelperFunctionTests.test_readwriteexcÚpollúselect.poll requiredc           
      C   sä   d}t jdft jdft jdft jdft jdft jdff}G dd„ dƒ}|D ]J\}}|ƒ }|  t||ƒd¡ t	 
||¡ |D ]}|  t||ƒ||k¡ q=tƒ }|  t	jt	j
||¡ tƒ }	|  |	jd¡ t	 
|	|¡ |  |	jd	¡ q%d S )
N)r[   ÚexptrD   r   r1   r[   rc   rD   r   c                   @   s<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )z3HelperFunctionTests.test_readwrite.<locals>.testobjc                 S   s"   d| _ d| _d| _d| _d| _d S r   )r[   rD   r   rc   r1   r   r   r   r   r   ™   s
   
z<HelperFunctionTests.test_readwrite.<locals>.testobj.__init__c                 S   r   r   )r[   r   r   r   r   r*       r   zEHelperFunctionTests.test_readwrite.<locals>.testobj.handle_read_eventc                 S   r   r   )rD   r   r   r   r   r,   £   r   zFHelperFunctionTests.test_readwrite.<locals>.testobj.handle_write_eventc                 S   r   r   r   r   r   r   r   r-   ¦   r   z@HelperFunctionTests.test_readwrite.<locals>.testobj.handle_closec                 S   r   r   )rc   r   r   r   r   r.   ©   r   zEHelperFunctionTests.test_readwrite.<locals>.testobj.handle_expt_eventc                 S   r   r   r0   r   r   r   r   r4   ¬   r   z@HelperFunctionTests.test_readwrite.<locals>.testobj.handle_errorNr5   r   r   r   r   Útestobj˜   s    rd   FT)rB   ÚPOLLINÚPOLLPRIÚPOLLOUTÚPOLLERRÚPOLLHUPÚPOLLNVALr]   Úgetattrr(   Z	readwriter&   rZ   r)   r/   r1   )
r   Z
attributesÚexpectedrd   ÚflagZexpectedattrZtobjÚattrr^   r_   r   r   r   Útest_readwrite‰   s,   ú	ìz"HelperFunctionTests.test_readwritec                 C   ó   |   d¡ d S r   ©Úcloseall_checkr   r   r   r   Útest_closeallÅ   r$   z!HelperFunctionTests.test_closeallc                 C   rp   r   rq   r   r   r   r   Útest_closeall_defaultÈ   r$   z)HelperFunctionTests.test_closeall_defaultc                 C   s²   g }i }t dƒD ]}tƒ }| |¡ |  |jjd¡ |||< q|r=tj}z|t_t ¡  W tj|}t_ntj|}t_w t |¡ |  t	|ƒd¡ |D ]
}|  |jjd¡ qLd S )Nr9   Fr   T)
Úranger    Úappendr]   r"   r   r(   Ú
socket_mapÚ	close_allÚlen)r   Z
usedefaultÚlZtestmapÚiÚcZ	socketmapr   r   r   rr   Ë   s$   


 
ÿz"HelperFunctionTests.closeall_checkc                 C   s   zt dƒ‚   t ¡ \}}}t ¡ }Y |\\}}}}}	}
|  tj 	|¡d d¡ |  |d¡ |  ||¡ |  |	|¡ |  |
d|||f ¡ d S )NúI don't like spam!zExpected exceptionéÿÿÿÿztest_asyncore.pyÚtest_compact_tracebackz
[%s|%s|%s])
r3   ÚsysÚexc_infor(   Zcompact_tracebackÚfailr]   ÚosÚpathÚsplit)r   Zreal_tZreal_vZreal_tbrN   ÚfÚfunctionÚlineÚtÚvÚinfor   r   r   r   å   s   
z*HelperFunctionTests.test_compact_tracebackN)r   r   r   r`   ÚunittestÚ
skipUnlessÚhasattrrB   ro   rs   rt   rr   r   r   r   r   r   rY   k   s    
;rY   c                   @   sL   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S )ÚDispatcherTestsc                 C   r'   r!   r   r   r   r   r   ÚsetUp÷   r   zDispatcherTests.setUpc                 C   ó   t  ¡  d S r!   ©r(   rx   r   r   r   r   ÚtearDownú   r#   zDispatcherTests.tearDownc                 C   s,   t  ¡ }|  | ¡ d¡ |  | ¡ d¡ d S r   )r(   Ú
dispatcherr]   ÚreadableÚwritable©r   Údr   r   r   Ú
test_basicý   s   zDispatcherTests.test_basicc                 C   s$   t  ¡ }|  t|ƒdt|ƒ ¡ d S )Nz<asyncore.dispatcher at %#x>)r(   r”   r]   ÚreprÚidr—   r   r   r   Ú	test_repr  s   zDispatcherTests.test_reprc                 C   st   t  ¡ }d}d}t ¡ }| |¡ | |¡ W d   ƒ n1 s!w   Y  | ¡  ¡ }|  |d| d| g¡ d S )NzLovely spam! Wonderful spam!r}   zlog: %s)r(   r”   r   Zcaptured_stderrÚlogÚgetvalueÚ
splitlinesr]   )r   r˜   Úl1Úl2ÚstderrÚlinesr   r   r   Útest_log  s   

þzDispatcherTests.test_logc                 C   s   t  ¡ }d}d}d}t ¡ }| |d¡ | |¡ | |d¡ W d   ƒ n1 s*w   Y  | ¡  ¡ }d| d| d| g}|  ||¡ d S )	Nz#Have you got anything without spam?z.Why can't she have egg bacon spam and sausage?zTHAT'S got spam in it!ZEGGSZSPAMzEGGS: %szinfo: %szSPAM: %s)r(   r”   r   Úcaptured_stdoutZlog_inforž   rŸ   r]   )r   r˜   r    r¡   Úl3Ústdoutr£   rl   r   r   r   Útest_log_info  s   

ýzDispatcherTests.test_log_infoc                 C   sz   t  ¡ }d|_t ¡ }| ¡  | ¡  | ¡  | ¡  W d   ƒ n1 s&w   Y  | 	¡  
¡ }g d¢}|  ||¡ d S )Nr   )z*warning: unhandled incoming priority eventzwarning: unhandled read eventzwarning: unhandled write eventz warning: unhandled connect event)r(   r”   Zignore_log_typesr   r¥   Úhandle_exptÚhandle_readÚhandle_writeÚhandle_connectrž   rŸ   r]   )r   r˜   r§   r£   rl   r   r   r   Útest_unhandled#  s   

üzDispatcherTests.test_unhandledc                 C   sF   t  tj¡}ttdƒr|  |t tj¡¡ t  d¡}|  |dk¡ d S )NÚstrerrorr~   Ú )	r(   Z	_strerrorÚerrnoZEPERMrŽ   rƒ   r]   r®   Ú
assertTrue)r   Úerrr   r   r   Útest_strerror5  s
   

zDispatcherTests.test_strerrorN)r   r   r   r   r“   r™   rœ   r¤   r¨   r­   r³   r   r   r   r   r   ö   s    r   c                   @   r   )Údispatcherwithsend_noreadc                 C   r   r   r   r   r   r   r   r•   ?  r   z"dispatcherwithsend_noread.readablec                 C   r'   r!   r   r   r   r   r   r¬   B  r   z(dispatcherwithsend_noread.handle_connectN)r   r   r   r•   r¬   r   r   r   r   r´   >  r%   r´   c                   @   s*   e Zd Zdd„ Zdd„ Zejdd„ ƒZdS )ÚDispatcherWithSendTestsc                 C   r'   r!   r   r   r   r   r   r   G  r   zDispatcherWithSendTests.setUpc                 C   r‘   r!   r’   r   r   r   r   r“   J  r#   z DispatcherWithSendTests.tearDownc           
   	   C   s  t  ¡ }t ¡ }| d¡ t |¡}tƒ }|||f}t jt|d}| 	¡  zXt
 d¡ d}tƒ }| ¡  | tj|f¡ t
 d¡ | |¡ | |¡ | d¡ d}	|jrh|	dkrht ¡  |	d	8 }	|jrh|	dksY| ¡  |  | ¡ |d
 ¡ W t |¡ d S t |¡ w )Né   )ÚtargetÚargsçš™™™™™É?s$   Suppose there isn't a 16-ton weight?r7   r:   iè  r   r8   é   )Ú	threadingÚEventr"   Ú
settimeoutr   Z	bind_portr   ÚThreadrR   rM   r@   rF   r´   Úcreate_socketÚconnectÚHOSTÚsendZ
out_bufferr(   ra   Úwaitr]   rž   r   Újoin_thread)
r   rH   rW   ÚportZcapr¸   r‰   rQ   r˜   rL   r   r   r   Ú	test_sendM  s4   







þz!DispatcherWithSendTests.test_sendN)r   r   r   r   r“   r   Úreap_threadsrÆ   r   r   r   r   rµ   F  s
    rµ   Úfile_wrapperzasyncore.file_wrapper requiredc                   @   sV   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Ze e	e
d	ƒd
¡dd„ ƒZdd„ Zdd„ ZdS )ÚFileWrapperTestc                 C   sD   d| _ ttjdƒ}| | j ¡ W d   ƒ d S 1 sw   Y  d S )Ns   It's not dead, it's sleeping!Úwb)r˜   Úopenr   ÚTESTFNrD   )r   Úfiler   r   r   r   x  s   "ÿzFileWrapperTest.setUpc                 C   s   t  t j¡ d S r!   )r   rU   rÌ   r   r   r   r   r“   }  ó   zFileWrapperTest.tearDownc                 C   s‚   t  tjt j¡}t |¡}t  |¡ |  |j	|¡ |  | 
¡ |¡ |  | d¡d¡ |  | d¡d¡ | ¡  |  t|jd¡ d S )Né   s   It's not deadé   s   , it'sr8   )rƒ   rË   r   rÌ   ÚO_RDONLYr(   rÈ   r   ZassertNotEqualÚfdr   r]   rC   r[   rZ   ÚOSError)r   rÒ   rO   r   r   r   Ú	test_recv€  s   

zFileWrapperTest.test_recvc                 C   sš   d}d}t  tjt jt jB ¡}t |¡}t  |¡ | 	|¡ | 
|¡ | ¡  ttjdƒ}|  | ¡ | j| | ¡ W d   ƒ d S 1 sFw   Y  d S )Ns   Come again?s   I want to buy some cheese.Úrb)rƒ   rË   r   rÌ   ÚO_WRONLYÚO_APPENDr(   rÈ   r   rD   rÂ   r]   r[   r˜   )r   Zd1Zd2rÒ   rO   rÍ   r   r   r   rÆ   Œ  s   



"ÿzFileWrapperTest.test_sendÚfile_dispatcherz!asyncore.file_dispatcher requiredc                    sd   t  tjt j¡}g ‰ G ‡ fdd„dtjƒ}||ƒ}t  |¡ tjdddd |  	d 
ˆ ¡| j¡ d S )Nc                       s   e Zd Z‡ fdd„ZdS )z7FileWrapperTest.test_dispatcher.<locals>.FileDispatcherc                    s   ˆ   |  d¡¡ d S )Né   )rv   rC   r   ©rQ   r   r   rª   Ÿ  s   zCFileWrapperTest.test_dispatcher.<locals>.FileDispatcher.handle_readN©r   r   r   rª   r   rÚ   r   r   ÚFileDispatcherž  s    rÜ   r<   Trº   ©ÚtimeoutÚuse_pollÚcountr;   )rƒ   rË   r   rÌ   rÑ   r(   rØ   r   Úloopr]   Újoinr˜   )r   rÒ   rÜ   Úsr   rÚ   r   Útest_dispatcher™  s   
zFileWrapperTest.test_dispatcherc                 C   sd   t  tjt j¡}t |¡}t  |¡ t 	dt
f¡ d }t ¡  W d   ƒ d S 1 s+w   Y  d S )Nr¯   )rƒ   rË   r   rÌ   rÑ   r(   rÈ   r   r   Zcheck_warningsÚResourceWarningr   Ú
gc_collect©r   rÒ   r†   r   r   r   Útest_resource_warning¦  s   


"þz%FileWrapperTest.test_resource_warningc                 C   s|   t  tjt j¡}t |¡}t  |¡ t  |j¡ |  	t
¡ | ¡  W d   ƒ n1 s,w   Y  |  |jd¡ | ¡  d S )Nr~   )rƒ   rË   r   rÌ   rÑ   r(   rÈ   r   rÒ   rZ   rÓ   r]   rç   r   r   r   Útest_close_twice°  s   


ÿz FileWrapperTest.test_close_twiceN)r   r   r   r   r“   rÔ   rÆ   rŒ   r   rŽ   r(   rä   rè   ré   r   r   r   r   rÉ   u  s    ÿ

rÉ   c                   @   sF   e Zd Zddd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Z	dS )ÚBaseTestHandlerNc                 C   s   t j | |¡ d| _d S r   )r(   r”   r   rm   )r   rW   r   r   r   r   À  s   
zBaseTestHandler.__init__c                 C   ó   t dƒ‚)Nz'handle_accept not supposed to be calledr2   r   r   r   r   Úhandle_acceptÄ  r+   zBaseTestHandler.handle_acceptc                 C   rë   )Nz)handle_accepted not supposed to be calledr2   r   r   r   r   Úhandle_acceptedÇ  r+   zBaseTestHandler.handle_acceptedc                 C   rë   )Nz(handle_connect not supposed to be calledr2   r   r   r   r   r¬   Ê  r+   zBaseTestHandler.handle_connectc                 C   rë   )Nz%handle_expt not supposed to be calledr2   r   r   r   r   r©   Í  r+   zBaseTestHandler.handle_exptc                 C   rë   )Nz&handle_close not supposed to be calledr2   r   r   r   r   r-   Ð  r+   zBaseTestHandler.handle_closec                  C   ó   ‚ r!   r   r   r   r   r   r4   Ó  ó   zBaseTestHandler.handle_errorr!   )
r   r   r   r   rì   rí   r¬   r©   r-   r4   r   r   r   r   rê   ¾  s    
rê   c                   @   s6   e Zd Z	 efdd„Zedd„ ƒZdd„ Zdd„ Zd	S )
Ú
BaseServerc                 C   s>   t j | ¡ |  |¡ |  ¡  t| j|ƒ |  d¡ || _d S ©Né   )	r(   r”   r   r¿   Úset_reuse_addrrX   r"   r=   Úhandler)r   rT   rK   rô   r   r   r   r   Ü  s   


zBaseServer.__init__c                 C   s
   | j  ¡ S r!   )r"   Úgetsocknamer   r   r   r   Úaddressä  s   
zBaseServer.addressc                 C   s   |   |¡ d S r!   )rô   ©r   rW   rK   r   r   r   rí   è  r$   zBaseServer.handle_acceptedc                  C   rî   r!   r   r   r   r   r   r4   ë  rï   zBaseServer.handle_errorN)	r   r   r   rê   r   Úpropertyrö   rí   r4   r   r   r   r   rð   ×  s    
rð   c                   @   r   )Ú
BaseClientc                 C   s"   t  | ¡ |  |¡ |  |¡ d S r!   )rê   r   r¿   rÀ   )r   rT   rö   r   r   r   r   ñ  s   

zBaseClient.__init__c                 C   r'   r!   r   r   r   r   r   r¬   ö  r   zBaseClient.handle_connectN)r   r   r   r   r¬   r   r   r   r   rù   ï  ó    rù   c                   @   s¨   e Zd Zdd„ Z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e ej d¡d¡dd„ ƒZdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zejd"d#„ ƒZd$S )&ÚBaseTestAPIc                 C   s   t jdd d S )NT)Z
ignore_allr’   r   r   r   r   r“   ü  rÎ   zBaseTestAPI.tearDownrò   c                 C   sh   t |ƒd }d}tjr-|dkr-tjdd| jd |jrd S |d8 }t |¡ tjr-|dks|  d¡ d S )Néd   r   r<   r8   )rÞ   rà   rß   zflag not set)	Úfloatr(   rw   rá   rß   rm   r@   rF   r‚   )r   ÚinstancerÞ   rà   r   r   r   Úloop_waiting_for_flagÿ  s   
ûz!BaseTestAPI.loop_waiting_for_flagc                 C   ó:   G dd„ dt ƒ}t| j| jƒ}|| j|jƒ}|  |¡ d S )Nc                   @   ó   e Zd Zdd„ ZdS )z3BaseTestAPI.test_handle_connect.<locals>.TestClientc                 S   r   r   ©rm   r   r   r   r   r¬     r   zBBaseTestAPI.test_handle_connect.<locals>.TestClient.handle_connectN)r   r   r   r¬   r   r   r   r   Ú
TestClient  ó    r  ©rù   rð   rT   rK   rö   rÿ   ©r   r  ÚserverÚclientr   r   r   Útest_handle_connect
  ó   zBaseTestAPI.test_handle_connectc                 C   ó:   G dd„ dt ƒ}|| j| jƒ}t| j|jƒ}|  |¡ d S )Nc                   @   r   )z4BaseTestAPI.test_handle_accept.<locals>.TestListenerc                 S   ó:   t  | ¡ |  |¡ t| j|ƒ |  d¡ | j ¡ | _d S rñ   ©rê   r   r¿   rX   r"   r=   rõ   rö   ©r   rT   rK   r   r   r   r     ó
   


z=BaseTestAPI.test_handle_accept.<locals>.TestListener.__init__c                 S   r   r   r  r   r   r   r   rì   !  r   zBBaseTestAPI.test_handle_accept.<locals>.TestListener.handle_acceptN)r   r   r   r   rì   r   r   r   r   ÚTestListener  s    r  ©rê   rT   rK   rù   rö   rÿ   ©r   r  r  r  r   r   r   Útest_handle_accept  s   zBaseTestAPI.test_handle_acceptc                 C   r  )Nc                   @   r
   )z6BaseTestAPI.test_handle_accepted.<locals>.TestListenerc                 S   r  rñ   r  r  r   r   r   r   -  r  z?BaseTestAPI.test_handle_accepted.<locals>.TestListener.__init__c                 S   s   t j | ¡ d S r!   )r(   r”   rì   r   r   r   r   rì   4  rÎ   zDBaseTestAPI.test_handle_accepted.<locals>.TestListener.handle_acceptc                 S   s   |  ¡  d| _d S r   )r   rm   r÷   r   r   r   rí   7  s   
zFBaseTestAPI.test_handle_accepted.<locals>.TestListener.handle_acceptedN)r   r   r   r   rì   rí   r   r   r   r   r  +  s    r  r  r  r   r   r   Útest_handle_accepted(  s   z BaseTestAPI.test_handle_acceptedc                 C   óL   G dd„ dt ƒ}G dd„ dtƒ}t| j| j|ƒ}|| j|jƒ}|  |¡ d S )Nc                   @   r  )z0BaseTestAPI.test_handle_read.<locals>.TestClientc                 S   r   r   r  r   r   r   r   rª   D  r   z<BaseTestAPI.test_handle_read.<locals>.TestClient.handle_readNrÛ   r   r   r   r   r  C  r  r  c                   @   r  )z1BaseTestAPI.test_handle_read.<locals>.TestHandlerc                 S   s   t  | |¡ |  d¡ d S )Ns   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)rê   r   rÂ   ©r   rJ   r   r   r   r   H  ó   z:BaseTestAPI.test_handle_read.<locals>.TestHandler.__init__N©r   r   r   r   r   r   r   r   ÚTestHandlerG  r  r  ©rù   rê   rð   rT   rK   rö   rÿ   ©r   r  r  r  r  r   r   r   Útest_handle_read@  s
   zBaseTestAPI.test_handle_readc                 C   r   )Nc                   @   r  )z1BaseTestAPI.test_handle_write.<locals>.TestClientc                 S   r   r   r  r   r   r   r   r«   T  r   z>BaseTestAPI.test_handle_write.<locals>.TestClient.handle_writeN)r   r   r   r«   r   r   r   r   r  S  r  r  r  r  r   r   r   Útest_handle_writeP  r
  zBaseTestAPI.test_handle_writec                 C   r  )Nc                   @   r   )z1BaseTestAPI.test_handle_close.<locals>.TestClientc                 S   rp   )Né   )rC   r   r   r   r   rª   a  s   z=BaseTestAPI.test_handle_close.<locals>.TestClient.handle_readc                 S   ó   d| _ |  ¡  d S r   ©rm   r   r   r   r   r   r-   f  ó   z>BaseTestAPI.test_handle_close.<locals>.TestClient.handle_closeN)r   r   r   rª   r-   r   r   r   r   r  _  rú   r  c                   @   r  )z2BaseTestAPI.test_handle_close.<locals>.TestHandlerc                 S   s   t  | |¡ |  ¡  d S r!   )rê   r   r   r  r   r   r   r   k  s   z;BaseTestAPI.test_handle_close.<locals>.TestHandler.__init__Nr  r   r   r   r   r  j  r  r  r  r  r   r   r   Útest_handle_close[  s
   zBaseTestAPI.test_handle_closec                    sX   d‰ G ‡ fdd„dt ƒ}G ‡ fdd„dtƒ}t| j| j|ƒ}|| j|jƒ}|  |¡ d S )Ns€                                                                                                                                   c                       s(   e Zd Z‡ fdd„Zdd„ Zdd„ ZdS )zCBaseTestAPI.test_handle_close_after_conn_broken.<locals>.TestClientc                    s   |   ˆ ¡ d S r!   )rÂ   r   rÚ   r   r   r«   {  r$   zPBaseTestAPI.test_handle_close_after_conn_broken.<locals>.TestClient.handle_writec                 S   r  r   r   r   r   r   r   r-   ~  r!  zPBaseTestAPI.test_handle_close_after_conn_broken.<locals>.TestClient.handle_closec                 S   r  r   r   r   r   r   r   r©   ‚  r!  zOBaseTestAPI.test_handle_close_after_conn_broken.<locals>.TestClient.handle_exptN)r   r   r   r«   r-   r©   r   rÚ   r   r   r  y  s    r  c                       s    e Zd Z‡ fdd„Zdd„ ZdS )zDBaseTestAPI.test_handle_close_after_conn_broken.<locals>.TestHandlerc                    s   |   tˆ ƒ¡ |  ¡  d S r!   )rC   ry   r   r   rÚ   r   r   rª   ˆ  s   zPBaseTestAPI.test_handle_close_after_conn_broken.<locals>.TestHandler.handle_readc                 S   r   r   r   r   r   r   r   r–   Œ  r   zMBaseTestAPI.test_handle_close_after_conn_broken.<locals>.TestHandler.writableN)r   r   r   rª   r–   r   rÚ   r   r   r  †  s    r  r  r  r   rÚ   r   Ú#test_handle_close_after_conn_brokens  s   	z/BaseTestAPI.test_handle_close_after_conn_brokenZsunosz OOB support is broken on Solarisc                 C   s€   t r| jtjkr|  d¡ tjdkr| jr|  d¡ G dd„ dtƒ}G dd„ dt	ƒ}t
| j| j|ƒ}|| j|jƒ}|  |¡ d S )Nú"Not applicable to AF_UNIX sockets.Údarwinz(poll may fail on macOS; see issue #28087c                   @   r  )z0BaseTestAPI.test_handle_expt.<locals>.TestClientc                 S   s   | j  dt j¡ d| _d S )Nr  T)r"   rC   ÚMSG_OOBrm   r   r   r   r   r©      s   
z<BaseTestAPI.test_handle_expt.<locals>.TestClient.handle_exptN)r   r   r   r©   r   r   r   r   r  Ÿ  r  r  c                   @   r  )z1BaseTestAPI.test_handle_expt.<locals>.TestHandlerc                 S   s*   t  | |¡ | j ttdƒdƒtj¡ d S )Néô   zlatin-1)rê   r   r"   rÂ   ÚbytesÚchrr&  r  r   r   r   r   ¥  s   z:BaseTestAPI.test_handle_expt.<locals>.TestHandler.__init__Nr  r   r   r   r   r  ¤  r  r  )rS   rT   r"   r	   ÚskipTestr€   Úplatformrß   rù   rê   rð   rK   rö   rÿ   r  r   r   r   Útest_handle_expt“  s   

zBaseTestAPI.test_handle_exptc                 C   r   )Nc                   @   r   )z1BaseTestAPI.test_handle_error.<locals>.TestClientc                 S   s   dd  d S )Ng      ð?r   r   r   r   r   r   r«   °  r#   z>BaseTestAPI.test_handle_error.<locals>.TestClient.handle_writec                 S   s   d| _ z‚  ty   Y d S w )NTzexception not raised)rm   ÚZeroDivisionErrorr3   r   r   r   r   r4   ²  s   ÿz>BaseTestAPI.test_handle_error.<locals>.TestClient.handle_errorN)r   r   r   r«   r4   r   r   r   r   r  ¯  s    r  r  r  r   r   r   Útest_handle_error­  s   zBaseTestAPI.test_handle_errorc                 C   sÞ   t | j| jƒ}t| j|jƒ}|  |j¡ |  |j¡ |  |j¡ t	j
d| jdd |  |j¡ |  |j¡ |  |j¡ |  |j¡ | ¡  |  |j¡ |  |j¡ |  |j¡ |  |j¡ | ¡  |  |j¡ |  |j¡ d S )Nr<   rü   rÝ   )rð   rT   rK   rù   rö   ÚassertFalseZ	connectedr±   Z	acceptingr(   rá   rß   r   )r   r  r  r   r   r   Útest_connection_attributes¿  s$   z&BaseTestAPI.test_connection_attributesc                 C   s^   t  ¡ }| | j¡ |  |jjtj¡ |  |jj| j¡ |  |j ¡ d¡ |  	|j 
¡ ¡ d S )Nr   )r(   r”   r¿   rT   r]   r"   ÚtypeÚSOCK_STREAMÚ
gettimeoutr/  Úget_inheritable)r   rã   r   r   r   Útest_create_socketÝ  s   zBaseTestAPI.test_create_socketc                 C   s„   t r| jtjkr|  d¡ t ¡ }| | j¡ | | j	¡ | 
d¡ |j ¡ d }t ¡ }| | j¡ |  t|j| j	d |f¡ d S )Nr$  rò   r8   r   )rS   rT   r"   r	   r*  r(   r”   r¿   rV   rK   r=   rõ   rZ   rÓ   )r   Ús1rÅ   Ús2r   r   r   Ú	test_bindå  s   

zBaseTestAPI.test_bindc              	   C   sð   t r| jtjkr|  d¡ t | j¡[}z| tjtjd¡ W n ty-   t	 
d¡ Y n9w t t | j¡¡}|  |j tjtj¡¡ |j ¡  | | j¡ | ¡  |  |j tjtj¡¡ W d   ƒ d S W d   ƒ d S 1 sqw   Y  d S )Nr$  r8   z+SO_REUSEADDR not supported on this platform)rS   rT   r"   r	   r*  Ú
setsockoptÚ
SOL_SOCKETÚSO_REUSEADDRrÓ   rŒ   Úskipr(   r”   r/  Ú
getsockoptr   r¿   ró   r±   )r   rW   rã   r   r   r   Útest_set_reuse_addró  s*   
ÿÿ
ÿò"üzBaseTestAPI.test_set_reuse_addrc              
   C   sò   | j tjttdtƒ ƒfvr|  d¡ t| j | jƒ}tj	dd„ d}| 
¡  zMt | j tj¡-}| d¡ | tjtjt ddd	¡¡ z| |j¡ W n	 tyS   Y nw W d   ƒ n1 s^w   Y  W t |¡ d S W t |¡ d S t |¡ w )
NÚAF_INET6z%test specific to AF_INET and AF_INET6c                   S   s   t jdddS )Nr7   rò   )rÞ   rà   )r(   rá   r   r   r   r   Ú<lambda>  s    ÿz0BaseTestAPI.test_quick_connect.<locals>.<lambda>)r·   r¹   Ziir8   r   )rT   r"   ÚAF_INETrk   Úobjectr*  rð   rK   r»   r¾   rM   r2  r½   r9  r:  Ú	SO_LINGERÚstructÚpackrÀ   rö   rÓ   r   rÄ   )r   r  r‰   rã   r   r   r   Útest_quick_connect  s*   

ÿÿ€ù
ö
zBaseTestAPI.test_quick_connectN)rò   )r   r   r   r“   rÿ   r	  r  r  r  r  r"  r#  rŒ   ZskipIfr€   r+  Ú
startswithr,  r.  r0  r5  r8  r>  r   rÇ   rF  r   r   r   r   rû   ú  s*    
 ÿ
rû   c                   @   ó   e Zd ZejZejdfZdS )ÚTestAPI_UseIPv4Socketsr   N)	r   r   r   r"   rA  rT   r   rÁ   rK   r   r   r   r   rI     s    rI  zIPv6 support requiredc                   @   rH  )ÚTestAPI_UseIPv6Socketsr   N)	r   r   r   r"   r?  rT   r   ZHOSTv6rK   r   r   r   r   rJ  $  s    rJ  zUnix sockets requiredc                   @   s$   e Zd Zer	ejZejZ	dd„ Z
dS )ÚTestAPI_UseUnixSocketsc                 C   s   t  | j¡ t | ¡ d S r!   )r   rU   rK   rû   r“   r   r   r   r   r“   /  r  zTestAPI_UseUnixSockets.tearDownN)r   r   r   rS   r"   r	   rT   r   rÌ   rK   r“   r   r   r   r   rK  )  s
    rK  c                   @   ó   e Zd ZdZdS )ÚTestAPI_UseIPv4SelectFN©r   r   r   rß   r   r   r   r   rM  3  ó    rM  ra   rb   c                   @   rL  )ÚTestAPI_UseIPv4PollTNrN  r   r   r   r   rP  6  ó    rP  c                   @   rL  )ÚTestAPI_UseIPv6SelectFNrN  r   r   r   r   rR  :  rO  rR  c                   @   rL  )ÚTestAPI_UseIPv6PollTNrN  r   r   r   r   rS  =  rQ  rS  c                   @   rL  )ÚTestAPI_UseUnixSocketsSelectFNrN  r   r   r   r   rT  A  rO  rT  c                   @   rL  )ÚTestAPI_UseUnixSocketsPollTNrN  r   r   r   r   rU  D  rQ  rU  Ú__main__):rŒ   rB   rƒ   r"   r€   r@   r°   rD  r»   Útestr   Ztest.supportr   r   r   r   Úior   ZPGOZSkipTestÚwarningsÚcatch_warningsÚsimplefilterÚDeprecationWarningr(   rŽ   rS   r   r    r&   r/   rR   rX   ZTestCaserY   r   Zdispatcher_with_sendr´   rµ   r   rÉ   r”   rê   rð   rù   rû   rI  ZIPV6_ENABLEDrJ  rK  rM  rP  rR  rS  rT  rU  r   Úmainr   r   r   r   Ú<module>   sz    


þ


 H/ÿG  (
	
ÿ