o
    ACeW                     @  sn  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	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 dd	lmZmZmZm Z  dd
l!m"Z"m#Z# erd 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-dyddZ.dzddZ/dzddZ0d{ddZ1dzddZ2dzd d!Z3dzd"d#Z4dzd$d%Z5ej6j7e8ed& d'd(dzd)d*Z9dzd+d,Z:edzd-d.Z;ej6j7ej<d/kd0d(dzd1d2Z=dzd3d4Z>dzd5d6Z?d|d9d:Z@dzd;d<ZAdzd=d>ZBej6Cd?d@ejDfejEdAejFedBgd}dGdHZGdzdIdJZHd~dLdMZIejJG dNdO dOZKej6CdPejDeKdQd@dRdSdTfejEejFeKdUdAdVdWdTedBgddYdZZLdzd[d\ZMdzd]d^ZNdzd_d`ZOdzdadbZPdzdcddZQdzdedfZRd{dgdhZSdzdidjZTd{dkdlZUdzdmdnZVdzdodpZWej6j7e8edq drd(dzdsdtZXdzdudvZYdzdwdxZZdS )    )annotationsN)AddressFamily
SocketKind)TYPE_CHECKINGAnyCallableListTupleUnion   )_coresocket)
binds_ipv6creates_ipv6)SocketStream)_NUMERIC_ONLY
SocketType_SocketType	_try_sync)assert_checkpointswait_all_tasks_blocked)	TypeAliasr   GaiTupleGetAddrInfoResponseobjectc                   @  s4   e Zd ZdddZdddZdddZdddZdS )MonkeypatchedGAIorig_getaddrinfo"Callable[..., GetAddrInfoResponse]returnNonec                 C  s   || _ i | _g | _d S N)_orig_getaddrinfo
_responsesrecord)selfr    r%   ;usr/lib/python3.10/site-packages/trio/_tests/test_socket.py__init__*   s   
zMonkeypatchedGAI.__init__argsr   kwargstuple[Any, ...]c                 O  s8   t | j}|j|i |}|  |j}|jrJ |S r    )inspect	signaturer!   bindapply_defaultsr(   r)   )r$   r(   r)   sigboundZfrozenboundr%   r%   r&   _frozenbind0   s   
zMonkeypatchedGAI._frozenbindresponseGetAddrInfoResponse | strc                 O  s   || j | j|i |< d S r    )r"   r1   )r$   r2   r(   r)   r%   r%   r&   set8   s   zMonkeypatchedGAI.setc                 O  s\   | j |i |}| j| || jv r| j| S |d tj@ r'| j|i |S td| )Nz%gai called with unexpected arguments )r1   r#   appendr"   stdlib_socketAI_NUMERICHOSTr!   RuntimeError)r$   r(   r)   r0   r%   r%   r&   getaddrinfo=   s   

zMonkeypatchedGAI.getaddrinfoN)r   r   r   r   )r(   r   r)   r   r   r*   )r2   r3   r(   r   r)   r   r   r   )r(   r   r)   r   r   r3   )__name__
__module____qualname__r'   r1   r4   r:   r%   r%   r%   r&   r   )   s
    


r   monkeypatchpytest.MonkeyPatchr   c                 C  s   t tj}| td|j |S )Nr:   )r   r7   r:   setattr)r>   Z
controllerr%   r%   r&   	monkeygaiH   s   
rA   r   c                    s  t  % t 4 I d H  W d   I d H  n1 I d H sw   Y  W d    n1 s,w   Y  t  2 tt t 4 I d H  t1 I d H sKw   Y  W d    n1 sZw   Y  W d    n1 siw   Y  t 4 I d H  t1 I d H s~w   Y  ddd} t| 4 I d H  t1 I d H sw   Y  t  < tt t| 4 I d H  t1 I d H sw   Y  W d    n1 sw   Y  W d    d S W d    d S 1 sw   Y  d S )NexcBaseExceptionr   boolc                 S  s
   t | tS r    )
isinstance
ValueError)rB   r%   r%   r&   _is_ValueError\   s   
z&test__try_sync.<locals>._is_ValueError)rB   rC   r   rD   )r   r   pytestraisesKeyErrorBlockingIOErrorrF   )rG   r%   r%   r&   test__try_syncO   s>   (
"rL   c                   C  sD   t jtjksJ t jtjksJ t jtjksJ t jtjks J d S r    )tsocket
SOL_SOCKETr7   TCP_NODELAYgaierrorntohsr%   r%   r%   r&   test_socket_has_some_reexportsm   s   rR   c              	     sL  ddd}t   tjdd	tjd
I d H }W d    n1 s w   Y  ||tjtjtjddfg t   tjdd	tjd
I d H }W d    n1 sMw   Y  ||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 d    n1 sw   Y  |dksJ | j
d dksJ t  ) ttj}tjdd	dd
I d H  W d    n1 sw   Y  W d    n1 sw   Y  tjh}|tj ttdr|tj |jj|v sJ t  0 tt tdd	I d H  W d    n1 sw   Y  W d    d S W d    d S 1 sw   Y  d S )Ngotr   expectedr   r   c                   s0   ddd d fd
d}|| ||ksJ d S )Ngai_tupr   r   dtuple[AddressFamily, SocketKind, tuple[str, int] | tuple[str, int, int] | tuple[str, int, int, int]]c                 S  s   | \}}}}}|||fS r    r%   )rU   familytypeproto	canonnamesockaddrr%   r%   r&   interesting_fields   s   
z;test_getaddrinfo.<locals>.check.<locals>.interesting_fieldsgai_listr   jlist[tuple[AddressFamily, SocketKind, tuple[str, int] | tuple[str, int, int] | tuple[str, int, int, int]]]c                   s    fdd| D S )Nc                   s   g | ]} |qS r%   r%   ).0rU   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)rU   r   r   rV   )r]   r   r   r^   r%   )rS   rT   rb   r%   r`   r&   checkz   s   
ztest_getaddrinfo.<locals>.check	127.0.0.1Z12345rX    )rd   90  ::1)rh   rg   r   r   x   hostportr   rW   rX   rY   flagshostr5   )rj   rk   r   r   r   r   EAI_BADHINTSasdf)rS   r   rT   r   r   r   )r   rM   r:   SOCK_STREAMAF_INETIPPROTO_TCP
SOCK_DGRAMAF_INET6IPPROTO_UDPr4   r#   rH   rI   rP   EAI_SOCKTYPEaddEAI_SERVICEhasattrro   valueerrnor9   )rA   rc   resexcinfoexpected_errnosr%   r%   r&   test_getaddrinfoy   sh   

 $r   c               	     s  t jt jB } t  td| I d H }W d    n1 sw   Y  |dks)J t ' ttj tddI d H  W d    n1 sGw   Y  W d    n1 sVw   Y  t ' ttj tddI d H  W d    n1 syw   Y  W d    n1 sw   Y  t dd\}}tddI d H }|||fksJ tdtjI d H }|d|fksJ tdtjI d H }||dfksJ d S )	N)rd   i  )rd   Z1234)z
google.comP   r   )	localhostr   rd   r   rd   80)	r7   NI_NUMERICHOSTNI_NUMERICSERVr   rM   getnameinforH   rI   rP   )Z
ni_numericrS   rn   Zservicer%   r%   r&   test_getnameinfo   s2   r   c               	     sl  t  \} }t| tjrJ | B |0 t| }t|tjs"J |  | ks,J |dI d H  |ddks=J W d    n1 sGw   Y  W d    n1 sVw   Y  t	
t td W d    n1 spw   Y  G dd dt j}| +}t	
t t| W d    n1 sw   Y  W d    d S W d    d S 1 sw   Y  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   
socketpairrE   rM   r   from_stdlib_socketfilenosendrecvrH   rI   	TypeErrorr   )sasbtar   Zmysockr%   r%   r&   test_from_stdlib_socket   s.   
 "r   c               
     s   t  \} }t|  | j| j| j}| P |5 |# | |  ks'J |dI d H  |	ddks8J W d    n1 sBw   Y  W d    n1 sQw   Y  W d    d S W d    d S 1 siw   Y  d S )Nr      )
r7   r   rM   fromfdr   rW   rX   rY   r   r   )r   r   r   r%   r%   r&   test_from_fd  s   P r   c                    s   ddd} t  \}}|M |2 t 4 I d H }|| | || | W d   I d H  n1 I d H s7w   Y  W d    n1 sFw   Y  W d    d S W d    d S 1 s^w   Y  d S )Nsockr   r   r   c                   s6   t d | dI d H  | dI d H dksJ d S )Nzsending hello   hr   )printr   r   r   r%   r%   r&   child  s   z%test_socketpair_simple.<locals>.child)r   r   r   r   )rM   r   r   open_nursery
start_soon)r   abnurseryr%   r%   r&   test_socketpair_simple  s   
(Pr   	fromsharezwindows only)reasonc               
     s   t r
tjdkr
d S t \} }| _ |D | t }t|}|& | 	 |	 ks/J |
dI d H  |dI d H dksCJ W d    n1 sMw   Y  W d    n1 s\w   Y  W d    d S W d    d S 1 stw   Y  d S )Nwin32r   r   )r   sysplatformrM   r   shareosgetpidr   r   r   r   )r   r   shareda2r%   r%   r&   test_fromshare"  s   
Pr   c                    sP   t  } t| t jsJ | jt jksJ W d    d S 1 s!w   Y  d S r    )rM   r   rE   r   rW   rr   sr%   r%   r&   test_socket1  s
   
"r   c                    sX   t t jt j} t| t jsJ | jt jksJ W d    d S 1 s%w   Y  d S r    )rM   r   ru   rt   rE   r   rW   r   r%   r%   r&   test_socket_v67  s
   "r   linuxz
linux onlyc            
        s   ddl m} m}m}m} g }| |fD ]}||fD ]}|t || qq|D ]?}tj | d}|j	|j	ks:J |j
|j
ksBJ |  t| | |}	|	j	|j	ksWJ |	j
|j
ks_J |	  |  q(d S )Nr   )rr   ru   rt   rq   r   )r   rr   ru   rt   rq   r6   r7   rM   r   rW   rX   detachr   close)
rr   ru   rt   rq   socketsrW   rX   r   Ztsocket_socketZtsocket_from_fdr%   r%   r&   test_sniff_sockopts>  s$   
r   c                    s   t  } | N}|| u sJ t|  tsJ |  rJ | d |  s(J | t jt j	d | 
t jt j	r;J | t jt j	d | 
t jt j	sNJ W d    n1 sXw   Y  |  dkseJ t|  t  } |  }|  |kszJ |  dksJ W d    n1 sw   Y  t  } |  dksJ |   |  dksJ dt| v sJ dt| v sJ dt| v sJ tt | j W d    n1 sw   Y  t }t |} | j|jksJ | j|jksJ | j|jksJ |   d S )NTFr5   r   rW   r   
setsockopt)rM   r   rE   r   intget_inheritableset_inheritabler   rs   rO   
getsockoptreprr   r   dirrH   rI   AttributeErrorrp   r7   r   rX   rW   rY   )r   Zcm_enter_valuefdZstdlib_sockr%   r%   r&   test_SocketType_basics^  sH   


r   c                    s<   t  } | }t|  W d    d S 1 sw   Y  d S r    )rM   r   setsockopt_tests)r   _r%   r%   r&   test_SocketType_setsockopt  s
   
"r   r   SocketType | SocketStreamc                 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 d   n1 s4w   Y  tjt	dd | tjtjd W d   dS 1 sUw   Y  dS )z6Extract these out, to be reused for SocketStream also.SO_BINDTODEVICENr   Fz"invalid value for argument 'value')match   )
rz   rM   r   rN   r   rs   rO   rH   rI   r   r   r%   r%   r&   r     s   
"r   c               
     s   t  \} }| c |H |  }|2 t|t jsJ | |  ks&J |   |dI d H  |dI d H dks>J W d    n1 sHw   Y  W d    n1 sWw   Y  W d    d S W d    d S 1 sow   Y  d S Nr   r   )	rM   r   duprE   r   r   r   r   r   )r   r   r   r%   r%   r&   test_SocketType_dup  s   Pr   c               	     s  t  \} }| h |V | dI d H  |dI d H dks!J | jr&J |jr+J | t j | js6J |jr;J |dI d H dksGJ |dI d H  | dI d H dks[J W d    n1 sew   Y  W d    n1 stw   Y  t  \} }| * | | jrJ | t j | jrJ W d    n1 sw   Y  W d    n1 sw   Y  t  \} }| 3 | | jrJ | t j | jsJ W d    n1 sw   Y  W d    d S W d    d S 1 sw   Y  d S )Nr   r          y)	rM   r   r   r   Zdid_shutdown_SHUT_WRshutdownSHUT_WRSHUT_RD	SHUT_RDWRr   r   r%   r%   r&   test_SocketType_shutdown  s<   



 
 
Pr   zaddress, socket_typerd   rh   )Zmarksaddressstrsocket_typer   c                   sn  t |}t |}| | || dfI d H  |d | d d }t 4 I d H }||j| |	 I d H \}}W d   I d H  n1 I d H sQw   Y  |. ||
   krh| kskJ  J |dI d H  |dI d H dksJ W d    n1 sw   Y  W d    n1 sw   Y  W d    d S W d    d S 1 sw   Y  d S )Nr      r   r   r   )rM   r   r-   listengetsocknamer   r   r   connectacceptgetpeernamer   r   )r   r   listenerZclientaddrr   serverZclient_addrr%   r%   r&   test_SocketType_simple_server  s$   


($Pr   c               	     s   t  \} }| Q |6 |  rJ |dI d H  t| I d H  |  s)J | dI d H dks5J |  r;J W d    n1 sEw   Y  W d    d S W d    d S 1 s]w   Y  d S r   )rM   r   Zis_readabler   r   wait_readabler   r   r%   r%   r&   test_SocketType_is_readable  s   Pr   rD   c                   C  s0   zt jddt jd W dS  t jy   Y dS w )N1.2.3.4r   rW   FT)r7   r:   ru   rP   r%   r%   r%   r&   gai_without_v4mapped_is_buggy  s   r   c                   @  sN   e Zd ZU e Zded< e Zded< e Zded< e Z	ded< dS )	Addressesr   bind_allr   	arbitrary	broadcastN)
r;   r<   r=   attrZibr   __annotations__r   r   r   r%   r%   r%   r&   r     s
   
 r   zsocket_type, addrsz0.0.0.0r   z255.255.255.255)r   r   r   r   z::1::2z::ffff:255.255.255.255addrsc           	        s  | t jkd/fddd0fd	d
}t j| dωtts#J dD ]<}j|dfddI d H }t|ttfr<J |||jdf j|dfddI d H }t|ttfrYJ |||j	df q%dD ]| d1 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 rLt sLt jt jd tt j}|d'I d H  W d    n	1 s.w   Y  t jh}tt d(rC|t j |jj|v sLJ zt jt jt jd)}W n ttfyc   Y nw t|tslJ |jd* dI d H d*ks{J |  tt |d+I d H  W d    n	1 sw   Y  tt |d,I d H  W d    n	1 sw   Y  tt r|d-I d H  n|d.I d H  W d    n	1 sw   Y  qdW d    d S 1 sw   Y  d S )2Nr   tuple[str | int, ...]r   c                   s(    rt | dk r| d7 } t | dk s| S )N   )r   )len)r   )v6r%   r&   pad&  s
   z$test_SocketType_resolve.<locals>.padactualrT   r   c                   s    | | ks
J d S r    r%   )r   rT   )r   r%   r&   	assert_eq,  s   z*test_SocketType_resolve.<locals>.assert_eqr   )Nrf   r   TlocalF)FTr(   tuple[str, int] | tuple[str, int, int] | tuple[str, int, int, int] | tuple[str, str] | tuple[str, str, int] | tuple[str, str, int, int]r   c                   s   j |  dI d H S )Nr   )_resolve_address_nocp)r(   )r   r   r%   r&   r}   E  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   rX   rp   r   )r   )r   r   r   r   r   )r   r   r   r   )r   r   r   r   )r   r   rT   r   r   r   )r(   r   r   r   )rM   ru   r   rE   r   r   r   bytesr   r   r   r   IPPROTO_IPV6IPV6_V6ONLYr   r   rH   rI   rP   
EAI_NONAMErz   rx   r   r{   r|   
AF_NETLINKrt   r   OSErrorr   rF   )	r   r   r   nullrS   r}   r~   r   Znetlink_sockr%   )r   r   r   r   r&   test_SocketType_resolve  s   

 

$r  c               	     s*  t  K} | dI d H  |  d dksJ | d t   }|d|  d fI d H  | |  ks:J W d    n1 sDw   Y  W d    n1 sSw   Y  t  /} tt j	 | dI d H  W d    n1 svw   Y  W d    d S W d    d S 1 sw   Y  d S )N)r   r   r   rd   
   r   r   )z1.2:3r5   )
rM   r   r-   r   r   r   r   rH   rI   rP   )r   Zsock2r%   r%   r&    test_SocketType_unresolved_names  s$   




"r  c                    sT  t  \} }|  |x t|  |d |d t =}|  t	 & t
tj  dI d H  W d    n1 sDw   Y  W d    n1 sSw   Y  W d    n1 sbw   Y  t	   dI d H dkswJ W d    n1 sw   Y  t	 % t
t  dI d H  W d    n1 sw   Y  W d    n1 sw   Y  d fdd}t 4 I d H }|| t I d H  |d	 W d   I d H  n1 I d H sw   Y  d fd
d}t 4 I d H }|| t I d H  |j  W d   I d H  n1 I d H sw   Y  t|d fdd}d fdd}t 4 I d H 5}|| || t I d H  | d |d t I d H  | d |d W d   I d H  n1 I d H szw   Y  W d    n1 sw   Y  W d    d S W d    d S 1 sw   Y  d S )NF   1r  Zhahar   r   c                     sF   t    dI d H dksJ W d    d S 1 sw   Y  d S )Nr     2r   r   r%   r   r%   r&   do_successful_blocking_recv  s   "zGtest_SocketType_non_blocking_paths.<locals>.do_successful_blocking_recvr  c                	     sz   t  / ttj  dI d H  W d    n1 sw   Y  W d    d S W d    d S 1 s6w   Y  d S )Nr  )r   rH   rI   r   	Cancelledr   r%   r
  r%   r&   do_cancelled_blocking_recv  s   "zFtest_SocketType_non_blocking_paths.<locals>.do_cancelled_blocking_recvc                     s   t    dI d H dksJ W d    n1 sw   Y  t   dI d H dks0J W d    d S 1 s;w   Y  d S )Nr      a   br	  r%   r   tbr%   r&   t1     "z.test_SocketType_non_blocking_paths.<locals>.t1c                     s   t   dI d H dksJ W d    n1 sw   Y  t    dI d H dks0J W d    d S 1 s;w   Y  d S )Nr   r  r  r	  r%   r  r%   r&   t2  r  z.test_SocketType_non_blocking_paths.<locals>.t2r  r  r   r   )r7   r   rM   r   setblockingr   r   CancelScopecancelr   rH   rI   r  r   r   r   r   r   cancel_scope)r   r   Zcscoper  r   r  r  r  r%   r  r&   "test_SocketType_non_blocking_paths  sh   




(
*





*Tr  c                    s  t  %tt dI d H  W d    n1 sw   Y  W d    n1 s-w   Y  t  >t *    ttj	 dI d H  W d    n1 sYw   Y  W d    n1 shw   Y  W d    n1 sww   Y  t  t  t  k} | 
dI d H  |   G  fdddtj}ttsJ j  | _t ( ttj	 |  I d H  W d    n1 sw   Y  W d    n1 sw   Y   dksJ W d    n1 sw   Y  W d    n	1 sw   Y  W d    n	1 sw   Y  t  /tt dI d H  W d    n1 s;w   Y  W d    d S W d    d S 1 sTw   Y  d S )Nr   r   rd   r   c                      s   e Zd Zd	 fddZdS )
z3test_SocketType_connect_paths.<locals>.CancelSocketr(   r   r)   r   r   c                   sD   t tsJ    t|  | j| j_jj	|i | t
r    )rE   r   r  r7   r   r   rW   rX   _sockr   rK   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<   r=   r   r%   r  r%   r&   CancelSocket
  s    r  r5   )rd   r   )rM   r   rH   rI   rF   r   r   r  r  r  r-   r   r7   rE   r   r  r   r   r   r   r  )r   r  r%   r  r&   test_SocketType_connect_paths  sX   




 
  $r   c                    s   d t  >} z|  dfI d H  W n  ty4 } zt fdd|jD s*J W Y d }~nd }~ww W d    d S W d    d S 1 sHw   Y  d S )Nrd   r   c                 3  s    | ]	} t |v V  qd S r    )r   )r_   argr   r%   r&   	<genexpr>5  s    z/test_address_in_socket_error.<locals>.<genexpr>)rM   r   r   r  anyr(   )r   er%   r"  r&   test_address_in_socket_error/  s   
("r&  c                    s   t  o t R} d fdd}t| tsJ || _t & t	t j
 | d	I d H  W d    n1 s9w   Y  W d    n1 sHw   Y  |  d
ksUJ W d    n1 s_w   Y  W d    d S W d    d S 1 sww   Y  d S )Nr$   r   r(   r)   r   r   c                   s       t I d H  d S r    )r  r   Z
checkpointr  r  r%   r&   r   =  s   zVtest_resolve_address_exception_in_connect_closes_socket.<locals>._resolve_address_nocprf   r5   )r$   r   r(   r   r)   r   r   r   )r   r  rM   r   rE   r   r   r   rH   rI   r  r   r   )r   r   r%   r'  r&   7test_resolve_address_exception_in_connect_closes_socket8  s"   

"r(  c               	     s  t  \} }| y |g | dI d H dksJ |dt jI d H dks'J |dI d H dks3J | dI d H  td}||I d H  |dksMJ t| drl| dgg I d H dks`J |dI d H dkslJ W d    n1 svw   Y  W d    n1 sw   Y  t j	t j
d} t j	t j
d}|  | | d	I d H  |d	I d H  | d
| d fg}|D ]'}| d|I d H dksJ |dI d H \}}|dksJ ||  ksJ qtt dr+| dt j| I d H  | dt j| I d H  | d| I d H  |dI d H \}}|dks"J ||  ks+J | d| I d H dks;J td}||I d H \}}|dksPJ |dksWJ ||  ks`J t|dr| d| I d H dksvJ |dI d H \}}}	}|dksJ |g ksJ |	dksJ ||  ksJ t|dr| d| I d H dksJ td}
td}||
|gI d H }|\}}}	}|dksJ |
dksJ |dksJ |g ksJ |	dksJ ||  ksJ t| dr)|D ]&}| ddgg d|I d H dksJ |dI d H d|  fks'J qW d    n	1 s4w   Y  W d    n	1 sDw   Y  t j	t j
d} t j	t j
d}| ` |D |d	I d H  | | I d H  | dI d H  | dI d H  |dI d H dksJ |dI d H dksJ W d    n1 sw   Y  W d    d S W d    d S 1 sw   Y  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)rM   r   r   r   MSG_PEEK	bytearray	recv_intorz   r)  r   rt   r-   r   sendtorecvfromr*  recvfrom_intor+  r,  r   )r   r   buftargetstargetdatar   nbytesancdataZ	msg_flagsZbuf1buf2retr%   r%   r&   test_send_recv_variantsK  s   
 
   $& ?Tr;  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s5J tddI d H dksBJ tddI d H dksOJ td
dI d H dks\J tddI d H dksiJ d S )Nu
   ok faß.des   xn--fa-hia.der   zok ::1rh   )rm   s   ::1badzfass.dezxn--fa-hia.deu   faß.de)r4   r   rM   r:   )rA   r%   r%   r&   	test_idna  s   r=  c                     s6   t dI d H dksJ t dI d H dksJ d S )NZudp   Ztcp   )rM   getprotobynamer%   r%   r%   r&   test_getprotobyname  s   rA  c              	     s  G dd d}| }t |d u sJ 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dg|R  I d H dddg|R ksGJ q.t ddI d H }d	}||ksYJ t d
dI d H dksfJ t d |u soJ | jdddddddd t ddI d H dksJ d S )Nc                   @  s    e Zd ZdddZdddZdS )z5test_custom_hostname_resolver.<locals>.CustomResolverrn   r   rk   rW   r   rX   rY   rm   r   (tuple[str, str, str, int, int, int, int]c                   s   d||||||fS )N
custom_gair%   )r$   rn   rk   rW   rX   rY   rm   r%   r%   r&   r:     s   zAtest_custom_hostname_resolver.<locals>.CustomResolver.getaddrinfor[   +tuple[str, int] | tuple[str, int, int, int]<tuple[str, tuple[str, int] | tuple[str, int, int, int], int]c                   s   d||fS )N
custom_gnir%   )r$   r[   rm   r%   r%   r&   r     s   
zAtest_custom_hostname_resolver.<locals>.CustomResolver.getnameinfoN)rn   r   rk   r   rW   r   rX   r   rY   r   rm   r   r   rB  )r[   rD  rm   r   r   rE  )r;   r<   r=   r:   r   r%   r%   r%   r&   CustomResolver  s    
rG  r   r   foorC  s	   localhostu   föö)rC  s
   xn--f-1gaarH  r   r   r   r   r   )rF  r   r   ri   rj   rk   rl   rn   )	rM   Zset_custom_hostname_resolverrr   rq   rs   AI_CANONNAMEr:   r   r4   )rA   rG  ZcrvalsrS   rT   r%   r%   r&   test_custom_hostname_resolver  s.   rK  c               	     s  G dd d} |  }t |d u sJ t  dt jt jdfks"J t ddddks-J t  }t j|d	}t|d
s@J |  t 	 \}}|( | t|d
sWJ t|d
s^J W d    n1 shw   Y  W d    n1 sww   Y  t d |u sJ d S )Nc                   @  s   e Zd Zdd	d
ZdS )z7test_custom_socket_factory.<locals>.CustomSocketFactoryrW   r   rX   r   rY   r   r   *tuple[str, AddressFamily, SocketKind, int]c                 S  s   d|||fS )Nhir%   )r$   rW   rX   rY   r%   r%   r&   r     s   z>test_custom_socket_factory.<locals>.CustomSocketFactory.socketN)rW   r   rX   r   rY   r   r   rL  )r;   r<   r=   r   r%   r%   r%   r&   CustomSocketFactory  s    rN  rM  r   r   r   r   )rM  r   r   r   r   r-   )
rM   Zset_custom_socket_factoryr   rr   rq   r7   r   rz   r   r   )rN  Zcsfr   wrappedr   r   r%   r%   r&   test_custom_socket_factory  s$    rP  c                     s:   t t t  W d    d S 1 sw   Y  d S r    )rH   rI   r   rM   r   r%   r%   r%   r&   test_SocketType_is_abstract  s   
"rQ  AF_UNIXzno unix domain socketsc                    s   ddd} t  }| d}| |I d H  W d    n1 s!w   Y  ztd d	}| d
| I d H  W d S  tyF   Y d S w )Npathstr | bytesr   r   c              
     s   t jt jdl}|| 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sFJ W d    n1 sPw   Y  W d    n1 s_w   Y  W d    d S W d    d S 1 sww   Y  d S )Nr   r  r   r   )	rM   r   rR  r-   r   r   r   r   r   )rS  ZlsockZcsockZssockr   r%   r%   r&   check_AF_UNIX   s    
"z.test_unix_domain_socket.<locals>.check_AF_UNIXz/sockr   asciis    trio-test-)rS  rT  r   r   )tempfileTemporaryDirectoryr   urandomhexencodeFileNotFoundError)rU  ZtmpdirrS  Zcookier%   r%   r&   test_unix_domain_socket  s   


r]  c                    s,  t  \} }|  |h | d dd z	 |  q ty&   Y nw t|  d fdd}d fd	d
}t 4 I d H }|	| |	| t
 I d H     W d   I d H  n1 I d H shw   Y  W d    n1 sww   Y  W d    d S W d    d S 1 sw   Y  d S )NFr   i Tr   r   c                     sD   t tj  I d H  W d    d S 1 sw   Y  d S r    )rH   rI   r   ClosedResourceErrorr   r%   r   r6  r%   r&   senderH     "z)test_interrupted_by_close.<locals>.senderc                     sD   t tj  dI d H  W d    d S 1 sw   Y  d S )Nr   )rH   rI   r   r^  r   r%   )r   r%   r&   receiverL  ra  z+test_interrupted_by_close.<locals>.receiverr  )r7   r   r  r   rK   rM   r   r   r   r   r   r   )Za_stdlibZb_stdlibr`  rb  r   r%   r_  r&   test_interrupted_by_close9  s.   





(Prc  c            	        s$  d} g }t | d D ]/}zt \}}W n ty3 } z|jtjtjfv s(J W Y d }~ nd }~ww |||g7 }qt 4 I d H #}|D ]	}|	tj
| qFt I d H  |j  W d   I d H  n1 I d H slw   Y  |D ]}|  qs|| d d krtd|d d  d d S d 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   )	totalr   Z_xr   r   r%  r   r   r   r%   r%   r&   test_many_socketsW  s.   (
rf  )r>   r?   r   r   r  )rA   r   r   r   )r   r   r   r   )r   r   r   r   r   r   )r   rD   )r   r   r   r   r   r   )[
__future__r   r|   r+   r   r   r7   r   rW  r   r   typingr   r   r   r   r	   r
   r   rH   rf   r   rM   Z_core._tests.tutilr   r   Z_highlevel_socketr   _socketr   r   r   r   testingr   r   typing_extensionsr   r   r   r   r   r   r   r   ZfixturerA   rL   rR   r   r   r   r   r   ZmarkZskipifrz   r   r   r   r   r   r   r   r   r   r   Zparametrizerr   paramru   r   r   r   r   r   r  r  r  r   r&  r(  r;  r=  rA  rK  rP  rQ  r]  rc  rf  r%   r%   r%   r&   <module>   s     



Z
#

	


3




		
s

K
;
	

`


5

