U
    g                     @  s   U d dl m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mZ d dlmZmZmZmZmZmZ d dlZd dlZddlmZmZ ddlmZmZ dd	lmZmZmZm Z  dd
l!m"Z"m#Z# er8d dl$m%Z% ddl&m'Z' eeee(e)eee)e(f ee)e(e(e(f f f Z*de+d< ee* Z,de+d< nde+d< e-Z,G dd dZ.ej/dddddZ0ddddZ1ddddZ2dddddZ3ddd d!Z4ddd"d#Z5ddd$d%Z6ddd&d'Z7ej8j9e:ed( d)d*ddd+d,Z;ddd-d.Z<eddd/d0Z=ej8j9ej>d1kd2d*ddd3d4Z?ddd5d6Z@ddd7d8ZAd9dd:d;d<ZBddd=d>ZCddd?d@ZDej8EdAdBejFfejGdCejHedDgdEdFddGdHdIZIdddJdKZJdLddMdNZKejLdOdPG dQdR dRZMej8EdSejFeMdTdBdUdVdWfejGejHeMdXdCdYdZdWedDgdFdRdd[d\d]ZNddd^d_ZOddd`daZPdddbdcZQdddddeZRdddfdgZSdddhdiZTddddjdkZUdddldmZVddddndoZWdddpdqZXdddrdsZYej8j9e:edt dud*dddvdwZZdddxdyZ[dddzd{Z\dS )|    )annotationsN)Path)AddressFamily
SocketKind)TYPE_CHECKINGAnyCallableListTupleUnion   )_coresocket)
binds_ipv6creates_ipv6)_NUMERIC_ONLY
SocketType_SocketType	_try_sync)assert_checkpointswait_all_tasks_blocked)	TypeAlias)SocketStreamr   GaiTupleGetAddrInfoResponseobjectc                   @  sT   e Zd ZdddddZddddd	d
ZdddddddZddddddZdS )MonkeypatchedGAIz"Callable[..., GetAddrInfoResponse]None)orig_getaddrinforeturnc                 C  s   || _ i | _g | _d S N)_orig_getaddrinfo
_responsesrecord)selfr    r%   ;/tmp/pip-unpacked-wheel-ks04xdmi/trio/_tests/test_socket.py__init__,   s    zMonkeypatchedGAI.__init__r   ztuple[Any, ...]argskwargsr   c                 O  s4   t | j}|j||}|  |j}|jr0t|S r    )inspect	signaturer!   bindapply_defaultsr)   r*   AssertionError)r$   r)   r*   sigboundZfrozenboundr%   r%   r&   _frozenbind2   s    
zMonkeypatchedGAI._frozenbindzGetAddrInfoResponse | str)responser)   r*   r   c                 O  s   || j | j||< d S r    )r"   r2   )r$   r3   r)   r*   r%   r%   r&   set:   s    zMonkeypatchedGAI.setc                 O  sX   | j ||}| j| || jkr,| j| S |d tj@ rF| j||S td| d S )Nz%gai called with unexpected arguments )r2   r#   appendr"   stdlib_socketAI_NUMERICHOSTr!   RuntimeError)r$   r)   r*   r1   r%   r%   r&   getaddrinfoB   s    

zMonkeypatchedGAI.getaddrinfoN)__name__
__module____qualname__r'   r2   r4   r:   r%   r%   r%   r&   r   +   s   r   zpytest.MonkeyPatch)monkeypatchr   c                 C  s   t tj}| td|j |S )Nr:   )r   r7   r:   setattr)r>   
controllerr%   r%   r&   	monkeygaiM   s    
rA   r   r   c                    s*  t  & t 4 I d H  W 5 Q I d H R X W 5 Q R X t  @ tt* t 4 I d H 
 tW 5 Q I d H R X W 5 Q R X W 5 Q R X t 4 I d H 
 tW 5 Q I d H R X ddddd} t| 4 I d H 
 tW 5 Q I d H R X t  B tt, t| 4 I d H 
 tW 5 Q I d H R X W 5 Q R X W 5 Q R X d S )NBaseExceptionbool)excr   c                 S  s
   t | tS r    )
isinstance
ValueError)rE   r%   r%   r&   _is_ValueErrora   s    z&test__try_sync.<locals>._is_ValueError)r   r   pytestraisesKeyErrorBlockingIOErrorrG   )rH   r%   r%   r&   test__try_syncT   s     (rM   c                   C  sD   t jtjkstt jtjks tt jtjks0tt jtjks@td S r    )tsocket
SOL_SOCKETr7   r/   TCP_NODELAYgaierrorntohsr%   r%   r%   r&   test_socket_has_some_reexportsr   s    rS   )rA   r   c              
     s  dddddd}t   tjddtjdI d H }W 5 Q R X ||tjtjtjd	d
fg t   tjddtjdI d H }W 5 Q R X ||tjtjtjd	dfg | j	dddddddd t   tddI d H }W 5 Q R X |dkst
| jd dkst
t  4 ttj}tjddddI d H  W 5 Q R X W 5 Q R X tjh}|tj ttdrd|tj |jj|ksvt
t  . tt tddI d H  W 5 Q R X W 5 Q R X d S )Nr   r   )gotexpectedr   c                   s<   ddddd ddd fd	d
}|| ||ks8t d S )Nr   zdtuple[AddressFamily, SocketKind, tuple[str, int] | tuple[str, int, int] | tuple[str, int, int, int]])gai_tupr   c                 S  s   | \}}}}}|||fS r    r%   )rV   familytype_proto	canonnamesockaddrr%   r%   r&   interesting_fields   s    z;test_getaddrinfo.<locals>.check.<locals>.interesting_fieldsr   zjlist[tuple[AddressFamily, SocketKind, tuple[str, int] | tuple[str, int, int] | tuple[str, int, int, int]]])gai_listr   c                   s    fdd| D S )Nc                   s   g | ]} |qS r%   r%   ).0rV   r\   r%   r&   
<listcomp>   s     zEtest_getaddrinfo.<locals>.check.<locals>.filtered.<locals>.<listcomp>r%   )r]   r_   r%   r&   filtered   s    	z1test_getaddrinfo.<locals>.check.<locals>.filteredr/   )rT   rU   ra   r%   r_   r&   check   s    ztest_getaddrinfo.<locals>.check	127.0.0.1Z12345type )rd   90  ::1)ri   rh   r   r   x   hostportr   rW   rf   rY   flagshostr5   )rk   rl   r   r   r   r   EAI_BADHINTSasdf)r   rN   r:   SOCK_STREAMAF_INETIPPROTO_TCP
SOCK_DGRAMAF_INET6IPPROTO_UDPr4   r/   r#   rI   rJ   rQ   EAI_SOCKTYPEaddEAI_SERVICEhasattrrp   valueerrnor9   )rA   rc   resexcinfoexpected_errnosr%   r%   r&   test_getaddrinfo~   sR    ""*r   c               
     s6  t jt jB } t  td| I d H }W 5 Q R X |dks<tt 0 ttj	 tddI d H  W 5 Q R X W 5 Q R X t 0 ttj	 tddI d H  W 5 Q R X W 5 Q R X t dd\}}tddI d H }|||fksttdtjI d H }|d|fksttdtjI d H }||dfks2td S )	N)rd   i  )rd   Z1234)z
google.comP   r   )	localhostr   rd   r   rd   80)
r7   NI_NUMERICHOSTNI_NUMERICSERVr   rN   getnameinfor/   rI   rJ   rQ   )Z
ni_numericrT   ro   Zservicer%   r%   r&   test_getnameinfo   s"    &&r   c               
     s   t  \} }t| tjrt| f |V t| }t|tjsBt|  | ksVt|dI d H  |	ddksxtW 5 Q R X W 5 Q R X t
t td W 5 Q R X G dd dt j}| &}t
t t| W 5 Q R X W 5 Q R X d S )N   x   c                   @  s   e Zd ZdS )z)test_from_stdlib_socket.<locals>.MySocketN)r;   r<   r=   r%   r%   r%   r&   MySocket	  s   r   )r7   
socketpairrF   rN   r   r/   from_stdlib_socketfilenosendrecvrI   rJ   	TypeErrorr   )sasbtar   Zmysockr%   r%   r&   test_from_stdlib_socket   s    
&r   c                    s   t  \} }t|  | j| j| j}| \ |L |< | |  ksLt|	dI d H  |
ddksntW 5 Q R X W 5 Q R X W 5 Q R X d S )Nr      )r7   r   rN   fromfdr   rW   rf   rY   r/   r   r   )r   r   r   r%   r%   r&   test_from_fd  s    r   c                    sz   ddddd} t  \}}|P |@ t 4 I d H }|| | || | W 5 Q I d H R X W 5 Q R X W 5 Q R X d S )Nr   r   sockr   c                   s4   t d | dI d H  | dI d H dks0td S )Nzsending hello   hr   )printr   r   r/   r   r%   r%   r&   child  s    z%test_socketpair_simple.<locals>.child)rN   r   r   open_nursery
start_soon)r   abnurseryr%   r%   r&   test_socketpair_simple  s    r   	fromsharezwindows only)reasonc                    s   t rtjdkrd S t \} }| z |j | t }t|}|B | 	 |	 ks\t
|dI d H  |dI d H dkst
W 5 Q R X W 5 Q R X W 5 Q R X d S )Nwin32r   r   )r   sysplatformrN   r   Zshareosgetpidr   r   r/   r   r   )r   r   Zshareda2r%   r%   r&   test_fromshare'  s    
r   c               	     s8   t  &} t| t jst| jt jks*tW 5 Q R X d S r    )rN   r   rF   r   r/   rW   rs   sr%   r%   r&   test_socket6  s    
r   c               	     s@   t t jt j&} t| t js"t| jt jks2tW 5 Q R X d S r    )rN   r   rv   ru   rF   r   r/   rW   r   r%   r%   r&   test_socket_v6<  s    r   linuxz
linux onlyc                    s   ddl m} m}m m  fdd| |fD }|D ]~}tj | d}|j|jksXt|j	|j	ksht|
  t| | }|j|jkst|j	|j	kst|  |  q4d S )Nr   )rs   rv   ru   rr   c                   s&   g | ]} fD ]}t ||qqS r%   )r7   r   )r^   rW   rX   ru   rr   r%   r&   r`   H  s   
 z'test_sniff_sockopts.<locals>.<listcomp>r   )r   rs   rv   ru   rr   rN   r   rW   r/   rf   detachr   close)rs   rv   socketsr   Ztsocket_socketZtsocket_from_fdr%   r   r&   test_sniff_sockoptsC  s    r   c               	     s  t  } | }|| kstt|  ts,t|  r8t| d |  sNt| t j	t j
d | t j	t j
rtt| t j	t j
d | t j	t j
stW 5 Q R X |  dkstt|  t  .} |  }|  |kst|  dkstW 5 Q R X t  } |  dkst|   |  dks,tdt| ks>tdt| ksPtdt| ksbttt | j W 5 Q R X t }t |} | j|jkst| j|jkst| j|jkst|   d S )NTFr5   r   rW   r   
setsockopt)rN   r   r/   rF   r   intget_inheritableset_inheritabler   rt   rP   
getsockoptreprr   r   dirrI   rJ   AttributeErrorrq   r7   r   rf   rW   rY   )r   Zcm_enter_valuefdZstdlib_sockr%   r%   r&   test_SocketType_basicsd  s@    


r   c               	     s$   t  } | }t|  W 5 Q R X d S r    )rN   r   setsockopt_tests)r   _r%   r%   r&   test_SocketType_setsockopt  s    r   zSocketType | SocketStreamr   c              	   C  s   t tdr| tjtjdd | tjtjd tjt	dd | tjtjdd W 5 Q R X tjt	dd | tjtjd W 5 Q R X dS )z6Extract these out, to be reused for SocketStream also.SO_BINDTODEVICENr   Fz"invalid value for argument 'value'match   )
r{   rN   r   rO   r   rt   rP   rI   rJ   r   r   r%   r%   r&   r     s    
r   c                    s   t  \} }|  |r |  }|Z t|t js6t| |  ksJt|   |dI d H  |	dI d H dksztW 5 Q R X W 5 Q R X W 5 Q R X d S Nr   r   )
rN   r   duprF   r   r/   r   r   r   r   )r   r   r   r%   r%   r&   test_SocketType_dup  s    r   c               
     sj  t  \} }|  | | dI d H  |dI d H dks@t| jrJt|jrTt| t j | jsjt|jrtt|dI d H dkst|dI d H  | dI d H dkstW 5 Q R X W 5 Q R X t  \} }| 8 |( | jrt| t j | jrtW 5 Q R X W 5 Q R X t  \} }| : |* | jr:t| t j	 | jsRtW 5 Q R X W 5 Q R X d S )Nr   r          y)
rN   r   r   r   r/   Zdid_shutdown_SHUT_WRshutdownSHUT_WRSHUT_RD	SHUT_RDWRr   r   r%   r%   r&   test_SocketType_shutdown  s,    



,
 r   )addresssocket_typerd   ri   )Zmarksstrr   )r   r   r   c                   s  t |}t |}| | || dfI d H  |d | d d }t 4 I d H &}||j| |	 I d H \}}W 5 Q I d H R X |P ||
   kr| ksn t|dI d H  |dI d H dkstW 5 Q R X W 5 Q R X W 5 Q R X d S )Nr      r   r   r   )rN   r   r-   listengetsocknamer   r   r   connectacceptgetpeernamer/   r   r   )r   r   listenerclientaddrr   serverclient_addrr%   r%   r&   test_SocketType_simple_server  s    


""r   c               
     s   t  \} }| r |b |  r$t|dI d H  t| I d H  |  sPt| dI d H dksht|  rttW 5 Q R X W 5 Q R X d S r   )rN   r   Zis_readabler/   r   r   wait_readabler   r   r%   r%   r&   test_SocketType_is_readable  s    r   rD   c                   C  s8   zt jddt jd W n t jk
r.   Y dS X dS d S )N1.2.3.4r   rW   FT)r7   r:   rv   rQ   r%   r%   r%   r&   gai_without_v4mapped_is_buggy   s
    r   F)slotsc                   @  s.   e Zd ZU ded< ded< ded< ded< dS )	Addressesr   bind_allr   	arbitrary	broadcastN)r;   r<   r=   __annotations__r%   r%   r%   r&   r   	  s   
r   )r   addrsz0.0.0.0r   z255.255.255.255)r   r   r   r   z::1::2z::ffff:255.255.255.255)r   r   r   c           
        s  | t jkdddfddddddfdd}t j| d	XttsRtd
D ]x}j|dfddI d H }t|ttfrt|||j	df j|dfddI d H }t|ttfrt|||j
df qVdD ] ddd fdd}|||jdfI d H |jdf r||dI d H d ||dI d H d ||dI d H d ||dI d H d ||dI d H d ||dI d H d ||dI d H d ||dI d H d ||dI d H d ||d I d H d t jt jd ||d!I d H d" ||d#I d H |jd$f rt st jt jd tt j}|d%I d H  W 5 Q R X t jt jh}tt d&r|t j |jj|kstzt jt jt jd'}W n ttfk
r   Y n8X t|tst|jd( dI d H d(kst|  d)}	tjt |	d* |d+I d H  W 5 Q R X tjt |	d* |d,I d H  W 5 Q R X tjt |	d** r||d-I d H  n|d.I d H  W 5 Q R X qW 5 Q R X d S )/Nztuple[str | int, ...])r   r   c                   s    rt | dk r| d7 } q| S )N   )r   )len)r   )v6r%   r&   pad-  s    
z$test_SocketType_resolve.<locals>.padr   )actualrU   r   c                   s    | | kst d S r    rb   )r   rU   )r   r%   r&   	assert_eq3  s    z*test_SocketType_resolve.<locals>.assert_eqr   )Nrg   r   TlocalF)FTztuple[str, int] | tuple[str, int, int] | tuple[str, int, int, int] | tuple[str, str] | tuple[str, str, int] | tuple[str, str, int, int]r   )r)   r   c                   s   j |  dI d H S )Nr   )_resolve_address_nocp)r)   )r   r   r%   r&   r~   M  s    
z$test_SocketType_resolve.<locals>.reshttp)r   r   )r   r   r   r   )r   r   r   )r   r   r   )r   r   r   r   )r   r   r   r   )r   r   )r   r   r   )r   r   r   r   )r   r   r   )r   r   r   r   )r   r   )z::ffff:1.2.3.4r   )z<broadcast>{   r   )r   r   EAI_ADDRFAMILY)rW   rf   rq   H^address should be a \(host, port(, \[flowinfo, \[scopeid\]\])*\) tuple$r   r   )r   )r   r   r   r   r   )r   r   r   r   )!rN   rv   r   rF   r   r/   r   r   bytesr   r   r   r   IPPROTO_IPV6IPV6_V6ONLYr   r   rI   rJ   rQ   
EAI_NONAME
EAI_NODATAr{   ry   r   r|   r}   
AF_NETLINKru   r   OSErrorr   rG   )
r   r   r   nullrT   r~   r   r   Znetlink_sockr   r%   )r   r   r   r   r&   test_SocketType_resolve  s|    

 
r  c               
     s   t  x} | dI d H  |  d dks.t| d t  6}|d|  d fI d H  | |  ksrtW 5 Q R X W 5 Q R X t  .} t	t j
 | dI d H  W 5 Q R X W 5 Q R X d S )N)r   r   r   rd   
   r   r   )z1.2:3r5   )rN   r   r-   r   r/   r   r   r   rI   rJ   rQ   )r   Zsock2r%   r%   r&    test_SocketType_unresolved_names  s    


(
r	  c                    sZ  t  \} }| > |, t|  |d |d t H}|  t	 . t
tj  dI d H  W 5 Q R X W 5 Q R X W 5 Q R X t	   dI d H dkstW 5 Q R X t	 , t
t  dI d H  W 5 Q R X W 5 Q R X dd fdd}t 4 I d H &}|| t I d H  |d	 W 5 Q I d H R X dd fd
d}t 4 I d H &}|| t I d H  |j  W 5 Q I d H R X t|dd fdd}dd fdd}t 4 I d H Z}|| || t I d H  | d |d t I d H  | d |d W 5 Q I d H R X W 5 Q R X W 5 Q R X d S )NF   1r  Zhahar   rB   c                	     s.   t    dI d H dks tW 5 Q R X d S )Nr     2r   r   r/   r%   r   r%   r&   do_successful_blocking_recv  s    zGtest_SocketType_non_blocking_paths.<locals>.do_successful_blocking_recvr  c                
     s>   t  . ttj  dI d H  W 5 Q R X W 5 Q R X d S )Nr  )r   rI   rJ   r   	Cancelledr   r%   r  r%   r&   do_cancelled_blocking_recv  s    zFtest_SocketType_non_blocking_paths.<locals>.do_cancelled_blocking_recvc                	     sX   t    dI d H dks tW 5 Q R X t   dI d H dksJtW 5 Q R X d S )Nr      a   br  r%   r   tbr%   r&   t1  s    "z.test_SocketType_non_blocking_paths.<locals>.t1c                	     sX   t   dI d H dks tW 5 Q R X t    dI d H dksJtW 5 Q R X d S )Nr   r  r  r  r%   r  r%   r&   t2  s    "z.test_SocketType_non_blocking_paths.<locals>.t2r  r  )r7   r   rN   r   setblockingr   r   CancelScopecancelr   rI   rJ   r  r   r/   r   r   r   r   cancel_scope)r   r   Zcscoper  r   r  r  r  r%   r  r&   "test_SocketType_non_blocking_paths  sJ    



."$







r  c                    s  t  0tjtdd dI d H  W 5 Q R X W 5 Q R X t  Jt 6    ttj	 dI d H  W 5 Q R X W 5 Q R X W 5 Q R X t Ή t  t  } | 
dI d H  |   G  fdddtj}ttstj  | _t 2 ttj	 |  I d H  W 5 Q R X W 5 Q R X  dksTtW 5 Q R X W 5 Q R X W 5 Q R X t  0tjtd	d d
I d H  W 5 Q R X W 5 Q R X d S )Nr   r   r   r   rd   r   c                      s$   e Zd Zdddd fddZdS )z3test_SocketType_connect_paths.<locals>.CancelSocketr   r   r(   c                   sD   t tst   t|  | j| j_	j	j
|| td S r    )rF   r   r/   r  r7   r   r   rW   rf   _sockr   rL   r$   r)   r*   r  r   r%   r&   r     s    z;test_SocketType_connect_paths.<locals>.CancelSocket.connectN)r;   r<   r=   r   r%   r  r%   r&   CancelSocket  s   r   r5   z^^\[\w+ \d+\] Error connecting to \('127\.0\.0\.\d', \d+\): (Connection refused|Unknown error)$)rd   r   )rN   r   rI   rJ   rG   r   r   r  r  r  r-   r   r7   rF   r   r/   r  r   r   r   r   r  )r   r   r%   r  r&   test_SocketType_connect_paths  s:    
$

.

(0
r!  c               
     sR   d} t  <}tjtd| dd || dfI d H  W 5 Q R X W 5 Q R X d S )Nrd   z#^\[\w+ \d+\] Error connecting to \(z*, 2\): (Connection refused|Unknown error)$r   r   )rN   r   rI   rJ   r  r   )r   r   r%   r%   r&   test_address_in_socket_errorF  s    

r"  c                    s   t   t |} ddddd fdd}t| ts:t|| _t . t	
t j | dI d H  W 5 Q R X W 5 Q R X |  dkstW 5 Q R X W 5 Q R X d S )Nr   r   )r$   r)   r*   r   c                   s       t I d H  d S r    )r  r   
checkpointr  r  r%   r&   r   U  s    zVtest_resolve_address_exception_in_connect_closes_socket.<locals>._resolve_address_nocprg   r5   )r   r  rN   r   rF   r   r/   r   r   rI   rJ   r  r   r   )r   r   r%   r$  r&   7test_resolve_address_exception_in_connect_closes_socketP  s    

$r%  c               
     s  t  \} }|  | | dI d H dks0t|dt jI d H dksLt|dI d H dksdt| dI d H  td}||I d H  |dkstt| dr| 	dgg I d H dkst|dI d H dkstW 5 Q R X W 5 Q R X t j
t jd} t j
t jd}| 2 |  | d	I d H  |d	I d H  | d
| d fg}|D ]V}| d|I d H dksrt|dI d H \}}|dkst||  ksRtqRtt dr4| dt j| I d H  | dt j| I d H  | d| I d H  |dI d H \}}|dks"t||  ks4t| d| I d H dksTttd}||I d H \}}|dks~t|dkst||  kstt|dr| d| I d H dkst|dI d H \}}}	}|dkst|g kst|	dkst||  kstt|dr| d| I d H dksJttd}
td}||
|gI d H }|\}}}	}|dkst|
dkst|dkst|g kst|	dkst||  kstt| dr0|D ]L}| 	ddgg d|I d H dks
t|dI d H d|  fkstqW 5 Q R X W 5 Q R X t j
t jd} t j
t jd}|  |~ |d	I d H  | | I d H  | dI d H  | dI d H  |dI d H dkst|dI d H dkstW 5 Q R X W 5 Q R X d S )Nr   r   r  s
   x         sendmsgs   xxxr   re   r  r   MSG_MOREs   yyys   zzzs	   xxxyyyzzzs
   xxx       recvmsgr   recvmsg_intos   xyzwr   r   s   xys   zw s   yzs   xyz)rN   r   r   r/   r   MSG_PEEK	bytearray	recv_intor{   r&  r   ru   r-   r   sendtorecvfromr'  recvfrom_intor(  r)  r   )r   r   buftargetstargetdatar   nbytesZancdataZ	msg_flagsZbuf1buf2retr%   r%   r&   test_send_recv_variantse  s    
,
   $:r7  c                   s   |  ddd | j dddtd | j dddtd |  dd	d |  dd
d tddI d H dkshttddI d H dksttddI d H dksttd
dI d H dksttddI d H dkstd S )Nu
   ok faß.des   xn--fa-hia.der   zok ::1ri   )rn   s   ::1badzfass.dezxn--fa-hia.deu   faß.de)r4   r   rN   r:   r/   )rA   r%   r%   r&   	test_idna  s    r9  c                     s4   t dI d H dkstt dI d H dks0td S )NZudp   Ztcp   )rN   getprotobynamer/   r%   r%   r%   r&   test_getprotobyname  s    r=  c              	     s  G dd d}| }t |d ks&tt jdddfdt jddfddt jdfdddt jffD ]$}t jd| I d H d|ksZtqZt ddI d H }d	}||kstt d
dI d H dkstt d |kst| j	dddddddd t ddI d H dkstd S )Nc                   @  s8   e Zd ZddddddddddZdddd	d
dZdS )z5test_custom_hostname_resolver.<locals>.CustomResolverr   r   z(tuple[str, str, str, int, int, int, int])ro   rl   rW   rf   rY   rn   r   c                   s   d||||||fS )N
custom_gair%   )r$   ro   rl   rW   rf   rY   rn   r%   r%   r&   r:     s    	zAtest_custom_hostname_resolver.<locals>.CustomResolver.getaddrinfoz+tuple[str, int] | tuple[str, int, int, int]z<tuple[str, tuple[str, int] | tuple[str, int, int, int], int])r[   rn   r   c                   s
   d||fS )N
custom_gnir%   )r$   r[   rn   r%   r%   r&   r     s    zAtest_custom_hostname_resolver.<locals>.CustomResolver.getnameinfoN)r;   r<   r=   r:   r   r%   r%   r%   r&   CustomResolver  s   r@  r   r   foor>  	   localhostu   föö)r>  s
   xn--f-1gaarA  r   r   r   r   r   )r?  r   r   rj   rk   rl   rm   ro   )r   rA  )r>  rB  rA  )
rN   Zset_custom_hostname_resolverr/   rs   rr   rt   AI_CANONNAMEr:   r   r4   )rA   r@  ZcrvalsrT   rU   r%   r%   r&   test_custom_hostname_resolver  s,       rE  c               
     s   G dd d} |  }t |d ks&tt  dt jt jdfksBtt ddddksXtt  }t j|d	}t|d
s~t|	  t 
 \}}|2 |" t|d
stt|d
stW 5 Q R X W 5 Q R X t d |kstd S )Nc                   @  s    e Zd ZdddddddZdS )	z7test_custom_socket_factory.<locals>.CustomSocketFactoryr   r   r   z*tuple[str, AddressFamily, SocketKind, int])rW   rf   rY   r   c                 S  s   d|||fS )Nhir%   )r$   rW   rf   rY   r%   r%   r&   r     s    z>test_custom_socket_factory.<locals>.CustomSocketFactory.socketN)r;   r<   r=   r   r%   r%   r%   r&   CustomSocketFactory  s   rG  rF  r   r   r   r   )rF  r   r   r   r   r-   )rN   Zset_custom_socket_factoryr/   r   rs   rr   r7   r   r{   r   r   )rG  Zcsfr   wrappedr   r   r%   r%   r&   test_custom_socket_factory  s    	"rI  c                	     s"   t t t  W 5 Q R X d S r    )rI   rJ   r   rN   r   r%   r%   r%   r&   test_SocketType_is_abstract;  s    rJ  AF_UNIXzno unix domain socketsc               	     s   ddddd} t  L}| | dI d H  | t| dI d H  | t| dI d H  W 5 Q R X z*td	 d
}| d| I d H  W n tk
r   Y nX d S )Nzstr | bytes | os.PathLike[str]r   )pathr   c                   s   t jt jd}|| I d H  |d t jt jd`}|| I d H  | I d H \}}|. |dI d H  |dI d H dkst	W 5 Q R X W 5 Q R X W 5 Q R X d S )Nr   r  r   r   )
rN   r   rK  r-   r   r   r   r   r   r/   )rL  ZlsockZcsockZssockr   r%   r%   r&   check_AF_UNIXE  s    
z.test_unix_domain_socket.<locals>.check_AF_UNIXz/sockz/sock1z/sock2r   asciis    trio-test-)	tempfileTemporaryDirectoryr   r   fsencodeurandomhexencodeFileNotFoundError)rM  Ztmpdircookier%   r%   r&   test_unix_domain_socket@  s    
$rW  c                    s   t  \} }|  | | d dd z|  q,W n tk
rN   Y nX t|  dd fdd}dd fdd	}t 4 I d H .}|	| |	| t
 I d H     W 5 Q I d H R X W 5 Q R X W 5 Q R X d S )
NFr   i r   rB   c                	     s,   t tj  I d H  W 5 Q R X d S r    )rI   rJ   r   ClosedResourceErrorr   r%   r   r3  r%   r&   senderp  s    z)test_interrupted_by_close.<locals>.senderc                	     s,   t tj  dI d H  W 5 Q R X d S )Nr   )rI   rJ   r   rX  r   r%   )r   r%   r&   receivert  s    z+test_interrupted_by_close.<locals>.receiver)r7   r   r  r   rL   rN   r   r   r   r   r   r   )Za_stdlibZb_stdlibrZ  r[  r   r%   rY  r&   test_interrupted_by_closea  s     



r\  c                    s   d} g }t d| dD ]t}zt \}}W nR tk
rz } z4|jtjtjfksPttd| d W Y  qW 5 d }~X Y nX |||g7 }qt	
 4 I d H 6}|D ]}|t	j| qt	 I d H  |j  W 5 Q I d H R X |D ]}|  qd S )Ni  r   r   zUnable to open more than z	 sockets.)ranger7   r   r  r}   ZEMFILEZENFILEr/   r   r   r   r   r   r   r  r  r   )totalr   Zopenedr   r   rE   r   r   r%   r%   r&   test_many_sockets  s"    r_  )]
__future__r   r}   r+   r   r   r7   r   rO  pathlibr   r   r   typingr   r   r   r	   r
   r   attrsrI   rg   r   rN   Z_core._tests.tutilr   r   _socketr   r   r   r   Ztestingr   r   Ztyping_extensionsr   Z_highlevel_socketr   r   r   r   r   r   r   r   ZfixturerA   rM   rS   r   r   r   r   r   markZskipifr{   r   r   r   r   r   r   r   r   r   r   Zparametrizers   paramrv   r   r   r   Zdefiner   r  r	  r  r!  r"  r%  r7  r9  r=  rE  rI  rJ  rW  r\  r_  r%   r%   r%   r&   <module>   s     "Z#	 3	
	{KC
`=  