a
    ŠxdnN  ã                   @   s†   d dl mZ d dlZddlmZ ddlmZ ddlmZm	Z	m
Z
mZ ddlmZ G d	d
„ d
ƒZedd„ ƒZdd„ Zdd„ Zdd„ ZdS )é    )ÚcontextmanagerNé   )Ú_core)Úaclose_forcefully)Ú
SendStreamÚReceiveStreamÚStreamÚHalfCloseableStreamé   )Úassert_checkpointsc                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )Ú_ForceCloseBothc                 C   s   t |ƒ| _d S ©N)ÚlistÚ_both)ÚselfZboth© r   úS/var/www/html/Ranjet/env/lib/python3.9/site-packages/trio/testing/_check_streams.pyÚ__init__   s    z_ForceCloseBoth.__init__c                 Ã   s   | j S r   )r   )r   r   r   r   Ú
__aenter__   s    z_ForceCloseBoth.__aenter__c              	   Ç   sH   z,t | jd ƒI d H  W t | jd ƒI d H  nt | jd ƒI d H  0 d S )Nr   r
   )r   r   )r   Úargsr   r   r   Ú	__aexit__   s    z_ForceCloseBoth.__aexit__N)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r   r      s   r   c                 c   s4   d}z
d V  W n | y    Y n0 t d | ¡ƒ‚d S )NTzexpected exception: {})ÚAssertionErrorÚformat)ÚexcZ__tracebackhide__r   r   r   Ú_assert_raises   s    
r   c                 ƒ   s  t | ƒ I dH ƒ4 I dH š"\‰‰tˆtƒs.J ‚tˆtƒs<J ‚‡fdd„‰‡fdd„‰‡fdd„‰ dd	„ ‰t ¡ 4 I dH š.}| ˆd
¡ | ˆ d
¡ W d  ƒI dH  q¼1 I dH s²0    Y  ‡fdd„}t ¡ 4 I dH š.}| |¡ | ˆ d¡ W d  ƒI dH  q1 I dH s0    Y  t ¡ 4 I dH š4}| ˆtdƒ¡ | ˆ d¡ W d  ƒI dH  qz1 I dH sp0    Y  t ¡ 4 I dH š4}| ˆtdƒ¡ | ˆ d¡ W d  ƒI dH  qÖ1 I dH sÌ0    Y  t	t
ƒ  ˆ d¡I dH  W d  ƒ n1 s0    Y  t	t
ƒ  ˆ d¡I dH  W d  ƒ n1 s@0    Y  t	tƒ  ˆ d¡I dH  W d  ƒ n1 sz0    Y  t ¡ 4 I dH š:}| ˆd
¡ ˆƒ I dH d
ks¸J ‚W d  ƒI dH  qæ1 I dH sÜ0    Y  t ¡ 4 I dH š<}| ˆd
¡ ˆdƒI dH d
ksJ ‚W d  ƒI dH  qJ1 I dH s@0    Y  t	tjƒh t ¡ 4 I dH š0}| ˆd¡ | ˆd¡ W d  ƒI dH  q®1 I dH s¤0    Y  W d  ƒ n1 sÄ0    Y  ‡fdd„}t ¡ 4 I dH š2}| ||j¡ | ˆd¡ W d  ƒI dH  q41 I dH s*0    Y  ‡fdd„}t ¡ 4 I dH š.}| |¡ | ˆˆ¡ W d  ƒI dH  q–1 I dH sŒ0    Y  t	tjƒ ˆdƒI dH  W d  ƒ n1 sÆ0    Y  t	tjƒ ˆdƒI dH  W d  ƒ n1 s 0    Y  ˆˆƒI dH  ˆˆƒI dH  ˆˆƒI dH  t	tjƒ ˆdƒI dH  W d  ƒ n1 sd0    Y  t	tjƒ ˆdƒI dH  W d  ƒ n1 sž0    Y  t	tjƒF tƒ  ˆ ¡ I dH  W d  ƒ n1 sà0    Y  W d  ƒ n1 s 0    Y  ˆˆƒI dH  ˆˆƒI dH  W d  ƒI dH  qT1 I dH sJ0    Y  t | ƒ I dH ƒ4 I dH š\‰‰‡‡‡fdd„}‡ ‡‡fdd„}t ¡ 4 I dH š,}| |¡ | |¡ W d  ƒI dH  qæ1 I dH sÜ0    Y  W d  ƒI dH  q1 I dH s
0    Y  t | ƒ I dH ƒ4 I dH š¢\‰‰tˆƒI dH  t	tjƒ" ˆdƒI dH  qLW d  ƒ n1 st0    Y  t	tjƒ ˆdƒI dH  W d  ƒ n1 s®0    Y  W d  ƒI dH  qæ1 I dH sÜ0    Y  t | ƒ I dH ƒ4 I dH šŽ\‰‰tˆƒI dH  t	tjƒ ˆdƒI dH  W d  ƒ n1 sB0    Y  zˆ dƒI dH  W n tjyt   Y n0 W d  ƒI dH  q¤1 I dH sš0    Y  t | ƒ I dH ƒ4 I dH š\‰‰t ¡ &}| ¡  ˆ ¡ I dH  W d  ƒ n1 sú0    Y  t ¡ &}| ¡  ˆ ¡ I dH  W d  ƒ n1 	s:0    Y  t	tjƒ ˆdƒI dH  W d  ƒ n1 	st0    Y  t	tjƒ ˆdƒI dH  W d  ƒ n1 	s®0    Y  W d  ƒI dH  	qæ1 I dH 	sÜ0    Y  t | ƒ I dH ƒ4 I dH š
\‰‰d d!„ }	t ¡ t}| ¡  t ¡ 4 I dH š4}| |	ˆd
¡ | |	ˆd¡ W d  ƒI dH  
q|1 I dH 
sr0    Y  W d  ƒ n1 
s’0    Y  t ¡ 4 I dH š0}| ˆˆ¡ | ˆˆ¡ W d  ƒI dH  
qô1 I dH 
sê0    Y  W d  ƒI dH  q"1 I dH s0    Y  t | ƒ I dH ƒ4 I dH šŽ\‰‰‡fd"d#„}
t ¡ 4 I dH š>}| |
¡ t ¡ I dH  tˆƒI dH  W d  ƒI dH  q²1 I dH s¨0    Y  W d  ƒI dH  qà1 I dH sÖ0    Y  |durt |ƒ I dH ƒ4 I dH š´\‰‰g ‰‡‡fd$d%„}‡‡fd&d'„}t ¡ 4 I dH š>}| ||j¡ t ¡ I dH  | |¡ W d  ƒI dH  qŽ1 I dH s„0    Y  ˆg d(¢ks J ‚W d  ƒI dH  qÎ1 I dH sÄ0    Y  t |ƒ I dH ƒ4 I dH š&\‰‰t	tjƒh t ¡ 4 I dH š0}| ˆj¡ | ˆj¡ W d  ƒI dH  qR1 I dH sH0    Y  W d  ƒ n1 sh0    Y  t	tjƒj t ¡ 4 I dH š2}| ˆj¡ | ˆjd¡ W d  ƒI dH  qØ1 I dH sÎ0    Y  W d  ƒ n1 sî0    Y  W d  ƒI dH  q&1 I dH s0    Y  t |ƒ I dH ƒ4 I dH š¤\‰‰t	tjƒl t ¡ 4 I dH š4}| ˆjd¡ | ˆjd¡ W d  ƒI dH  q¬1 I dH s¢0    Y  W d  ƒ n1 sÂ0    Y  W d  ƒI dH  qú1 I dH sð0    Y  t |ƒ I dH ƒ4 I dH šˆ\‰‰‡fd)d*„}‡fd+d'„}t ¡ 4 I dH š,}| |¡ | |¡ W d  ƒI dH  q„1 I dH sz0    Y  W d  ƒI dH  q²1 I dH s¨0    Y  t |ƒ I dH ƒ4 I dH š|\‰‰tˆƒI dH  z:tƒ  ˆ ¡ I dH  W d  ƒ n1 s0    Y  W n tjy.   Y n0 W d  ƒI dH  q^1 I dH sT0    Y  d,d-„ }t |ƒ I dH ƒ4 I dH š¤\‰‰t ¡ 4 I dH š`}| |ˆ¡ t	tjƒ  ˆ d.¡I dH  W d  ƒ n1 sÔ0    Y  W d  ƒI dH  q1 I dH s0    Y  W d  ƒI dH  q:1 I dH s00    Y  t |ƒ I dH ƒ4 I dH š¢\‰‰t ¡ 4 I dH š^}| |ˆ¡ t	tjƒ ˆ ¡ I dH  W d  ƒ n1 s¦0    Y  W d  ƒI dH  qÞ1 I dH sÔ0    Y  W d  ƒI dH  q1 I dH s0    Y  dS )/aÜ  Perform a number of generic tests on a custom one-way stream
    implementation.

    Args:
      stream_maker: An async (!) function which returns a connected
          (:class:`~trio.abc.SendStream`, :class:`~trio.abc.ReceiveStream`)
          pair.
      clogged_stream_maker: Either None, or an async function similar to
          stream_maker, but with the extra property that the returned stream
          is in a state where ``send_all`` and
          ``wait_send_all_might_not_block`` will block until ``receive_some``
          has been called. This allows for more thorough testing of some edge
          cases, especially around ``wait_send_all_might_not_block``.

    Raises:
      AssertionError: if a test fails.

    Nc                 “   sB   t ƒ ( ˆ  | ¡I d H d u s J ‚W d   ƒ n1 s40    Y  d S r   )r   Úsend_all)Údata©Úsr   r   Údo_send_all<   s    z)check_one_way_stream.<locals>.do_send_allc                  —   s:   t ƒ   ˆ j| Ž I d H W  d   ƒ S 1 s,0    Y  d S r   )r   Úreceive_some)r   ©Úrr   r   Údo_receive_some@   s    z-check_one_way_stream.<locals>.do_receive_somec                 “   s   ˆ dƒI d H | ksJ ‚d S ©Nr
   r   )Úexpected)r&   r   r   Úchecked_receive_1D   s    z/check_one_way_stream.<locals>.checked_receive_1c                 Ó   s8   t ƒ  |  ¡ I d H  W d   ƒ n1 s*0    Y  d S r   )r   Úaclose)Úresourcer   r   r   Ú	do_acloseG   s    z'check_one_way_stream.<locals>.do_acloseó   xc                   “   s    ˆ dƒI d H  ˆ dƒI d H  d S )Nó    ó   yr   r   ©r"   r   r   Úsend_empty_then_yP   s    z/check_one_way_stream.<locals>.send_empty_then_yr/   ó   1ó   2éÿÿÿÿr   g      ø?r
   c                 “   s@   t ƒ  ˆ  ¡ I d H  W d   ƒ n1 s*0    Y  |  ¡  d S r   )r   Úwait_send_all_might_not_blockÚcancel)Úscoper    r   r   Ú*simple_check_wait_send_all_might_not_block~   s    ,zHcheck_one_way_stream.<locals>.simple_check_wait_send_all_might_not_blockc                   “   s>   t tjƒ  ˆ dƒI d H  qW d   ƒ n1 s00    Y  d S )Nód   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)r   r   ÚBrokenResourceErrorr   r0   r   r   Úexpect_broken_stream_on_send‹   s    z:check_one_way_stream.<locals>.expect_broken_stream_on_sendr9   i   r.   c                   “   s    ˆdƒI d H  ˆ ˆƒI d H  d S )Nr/   r   r   )r,   r"   r!   r   r   Úsend_then_close¶   s    z-check_one_way_stream.<locals>.send_then_closec                   “   s<   t  ¡ I d H  ˆ dƒI d H  ˆ dƒI d H  ˆˆƒI d H  d S )Nr/   r.   )r   Úwait_all_tasks_blockedr   )r)   r,   r%   r   r   Úreceive_send_then_closeº   s    z5check_one_way_stream.<locals>.receive_send_then_closes   123c                 ×   s<   t tjƒ | |Ž I d H  W d   ƒ n1 s.0    Y  d S r   )r   r   Z	Cancelled)Zafnr   r   r   r   Úexpect_cancelledû   s    z.check_one_way_stream.<locals>.expect_cancelledc                   “   s>   t tjƒ  ˆ  d¡I d H  W d   ƒ n1 s00    Y  d S )Né
   )r   r   ÚClosedResourceErrorr#   r   r$   r   r   Úreceive_expecting_closed  s    z6check_one_way_stream.<locals>.receive_expecting_closedc                 “   sT   ˆ   d¡ tƒ  ˆ ¡ I d H  W d   ƒ n1 s40    Y  ˆ   d¡ |  ¡  d S )Núwaiter sleepingúwaiter wokeup)Úappendr   r5   r6   )Úcancel_scope)Úrecordr!   r   r   Úwaiter  s
    
,
z$check_one_way_stream.<locals>.waiterc                   “   s.   t  ¡ I d H  ˆ d¡ ˆ  d¡I d H  qd S )Núreceiver startingiÂA  )r   r=   rE   r#   r   )r%   rG   r   r   Úreceiver"  s    
z&check_one_way_stream.<locals>.receiver)rC   rI   rD   c                   “   sR   z8t ƒ  ˆ  ¡ I d H  W d   ƒ n1 s,0    Y  W n tjyL   Y n0 d S r   )r   r5   r   r:   r   r    r   r   ÚsenderP  s
    0z$check_one_way_stream.<locals>.senderc                   “   s    t  ¡ I d H  tˆ ƒI d H  d S r   ©r   r=   r   r   r$   r   r   rJ   W  s    c                 Ó   s    t  ¡ I d H  t| ƒI d H  d S r   rL   r    r   r   r   Ú
close_soonj  s    z(check_one_way_stream.<locals>.close_soons   xyzzy)r   Ú
isinstancer   r   r   Úopen_nurseryÚ
start_soonÚ	bytearrayÚ
memoryviewr   Ú
ValueErrorr#   Ú	TypeErrorÚBusyResourceErrorrF   r:   rA   r   r5   r   ZCancelScoper6   r*   r=   r   )Ústream_makerÚclogged_stream_makerÚnurseryr1   r8   r;   r<   r>   r7   r?   rB   rH   rJ   rK   rM   r   )r)   r,   r&   r"   r%   rG   r!   r   Úcheck_one_way_stream%   s:    6
:::
0
0
0DFZÿ:
:....N<

f2\.4 
.
..\ 
\h
j
8@ ZŠŠ
f24ŒrY   c              
   ƒ   sî  t ˆˆƒI dH  ‡fdd„}ˆdur2‡fdd„}nd}t ||ƒI dH  tˆƒ I dH ƒ4 I dH šr\}‰t|tƒstJ ‚tˆtƒs‚J ‚d}d‰ t d¡}| d	| ¡}| |d
¡}‡ fdd„}	‡ fdd„}
t 	¡ 4 I dH šl}| 
|	||d¡ | 
|	ˆ|ddd… d¡ | 
|
||ddd… d¡ | 
|
ˆ|d¡ W d  ƒI dH  qZ1 I dH sP0    Y  ‡fdd„}t 	¡ 4 I dH š.}| 
|¡ | 
|j¡ W d  ƒI dH  q¼1 I dH s²0    Y  W d  ƒI dH  qê1 I dH sà0    Y  dS )u¸  Perform a number of generic tests on a custom two-way stream
    implementation.

    This is similar to :func:`check_one_way_stream`, except that the maker
    functions are expected to return objects implementing the
    :class:`~trio.abc.Stream` interface.

    This function tests a *superset* of what :func:`check_one_way_stream`
    checks â€“ if you call this, then you don't need to also call
    :func:`check_one_way_stream`.

    Nc                   “   s   t ˆ ƒ I d H ƒS r   ©Úreversedr   )rV   r   r   Úflipped_stream_makerŠ  s    z2check_two_way_stream.<locals>.flipped_stream_makerc                   “   s   t ˆ ƒ I d H ƒS r   rZ   r   )rW   r   r   Úflipped_clogged_stream_maker  s    z:check_two_way_stream.<locals>.flipped_clogged_stream_makeri   i @  r   é   Úlittlec                 “   sL   t  |¡}t|ƒ}|rH| dˆ ¡}|  |d |… ¡I d H  ||d … }qd S r'   )ÚrandomÚRandomrR   Úrandintr   )r!   r   Úseedr%   ÚmÚ
chunk_size©ÚCHUNK_SIZE_MAXr   r   rK   ¢  s    
z$check_two_way_stream.<locals>.senderc                 “   sZ   t  |¡}tƒ }t|ƒt|ƒk rJ|  | dˆ ¡¡I d H }|s@J ‚||7 }q||ksVJ ‚d S r'   )r`   ra   rQ   Úlenr#   rb   )r!   r   rc   r%   ÚgotÚchunkrf   r   r   rJ   ª  s    

z&check_two_way_stream.<locals>.receiverr4   r
   r   é   c                   “   s*   ˆ   d¡I d H dksJ ‚ˆ  ¡ I d H  d S )Nr@   r.   )r#   r*   r   )Ús2r   r   Úexpect_receive_some_empty¹  s    z7check_two_way_stream.<locals>.expect_receive_some_empty)rY   r   rN   r   r`   ra   ÚgetrandbitsÚto_bytesr   rO   rP   r*   )rV   rW   r\   r]   Ús1ZDUPLEX_TEST_SIZEr%   ÚiZ	test_datarK   rJ   rX   rm   r   )rg   rW   rl   rV   r   Úcheck_two_way_stream{  s2     
	>
rr   c                 Ã   sr  t | |ƒI dH  t| ƒ I dH ƒ4 I dH šd\}}t|tƒs>J ‚t|tƒsLJ ‚dd„ }dd„ }t ¡ 4 I dH š.}| ||¡ | ||¡ W d  ƒI dH  q°1 I dH s¦0    Y  ttjƒ  | 	d¡I dH  W d  ƒ n1 sà0    Y  t
ƒ  | ¡ I dH  W d  ƒ n1 s0    Y  t ¡ 4 I dH š0}| ||¡ | ||¡ W d  ƒI dH  qx1 I dH sn0    Y  W d  ƒI dH  q¦1 I dH sœ0    Y  |durnt|ƒ I dH ƒ4 I dH š°\}}ttjƒx t ¡ 4 I dH š@}| |j	d¡ t ¡ I dH  | |j¡ W d  ƒI dH  qB1 I dH s80    Y  W d  ƒ n1 sX0    Y  W d  ƒI dH  q1 I dH s†0    Y  t|ƒ I dH ƒ4 I dH š®\}}ttjƒv t ¡ 4 I dH š>}| |j¡ t ¡ I dH  | |j¡ W d  ƒI dH  q 1 I dH s0    Y  W d  ƒ n1 s60    Y  W d  ƒI dH  qn1 I dH sd0    Y  dS )uÎ  Perform a number of generic tests on a custom half-closeable stream
    implementation.

    This is similar to :func:`check_two_way_stream`, except that the maker
    functions are expected to return objects that implement the
    :class:`~trio.abc.HalfCloseableStream` interface.

    This function tests a *superset* of what :func:`check_two_way_stream`
    checks â€“ if you call this, then you don't need to also call
    :func:`check_two_way_stream`.

    Nc                 Ó   sH   |   d¡I d H  tƒ  |  ¡ I d H  W d   ƒ n1 s:0    Y  d S )Nr-   )r   r   Úsend_eofr    r   r   r   Úsend_x_then_eofÕ  s    z4check_half_closeable_stream.<locals>.send_x_then_eofc                 Ó   sB   t  ¡ I d H  |  d¡I d H dks&J ‚|  d¡I d H dks>J ‚d S )Nr@   r-   r.   )r   r=   r#   r$   r   r   r   Úexpect_x_then_eofÚ  s    z6check_half_closeable_stream.<locals>.expect_x_then_eofr/   r-   )rr   r   rN   r	   r   rO   rP   r   rA   r   r   rs   rU   r=   r5   )rV   rW   rp   rl   rt   ru   rX   r   r   r   Úcheck_half_closeable_streamÂ  s:     6..h
ˆrv   )Ú
contextlibr   r`   Ú r   Z_highlevel_genericr   Ú_abcr   r   r   r	   Z_checkpointsr   r   r   rY   rr   rv   r   r   r   r   Ú<module>   s   

  XG