
    <eF                        d 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	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mZ 	 ddlZn# e$ r dZY nw xY w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 ddl m!Z! ddl"m#Z# d Z$ e$d          Z% e$d          Z& e$d          Z' e$d          Z(ddddddddddd
Z)d Z*dd d!Z+d" Z,d# Z-e!j.        fd$Z/d% Z0 G d& d'e          Z1 G d( d)e          Z2 G d* d+          Z3 G d, d-e3e2          Z4d.d/d0Z5 e6e	d1          rf G d2 d3e
j7        e          Z8 G d4 d5e8e          Z9 G d6 d7e9          Z: G d8 d9e3e:          Z;d: Z<ej=        d;             Z>ej=        d.d/d<            Z?ej=        d=dd.d>d?            Z@d@ ZAej=        d=ddAdB            ZBdC ZC G dD dEejD                  ZE G dF dGejF                  ZGdH ZH G dI dJeI          ZJ G dK dL          ZKdM ZL G dN dOejM                  ZMej=        dP             ZNe	jO        e	jP        e	jQ        fdQZRdS )RzUtilities shared by tests.    N)mock)
HTTPServer)WSGIRequestHandler
WSGIServer)base_events)events)format_helpers)futures)tasks)logger)support)threading_helperc                    t          t          d          rKt          j                            t          j        |           }t          j                            |          r|S t          j                            t          j                            t                    d|           }t          j                            |          r|S t          |           )NTEST_HOME_DIRz..)
hasattrr   ospathjoinr   isfiledirname__file__FileNotFoundError)filenamefullnames     ./usr/lib/python3.11/test/test_asyncio/utils.py	data_filer   (   s    w(( 7<< 5x@@7>>(## 	Ow||BGOOH55tXFFH	w~~h 
H
%
%%    zssl_cert.pemzssl_key.pemzkeycert3.pemzpycacert.pem)z)http://testca.pythontest.net/testca/ocsp/)z0http://testca.pythontest.net/testca/pycacert.cer)z2http://testca.pythontest.net/testca/revocation.crl))countryNameXY))organizationNamezPython Software Foundation CA))
commonNamezour-ca-serverzOct 28 14:23:16 2037 GMTzAug 29 14:23:16 2018 GMTCB2D80995A69525C)r   ))localityNamezCastle Anthrax))r!   zPython Software Foundation))r"   	localhost))DNSr%      )
OCSP	caIssuerscrlDistributionPointsissuernotAfter	notBeforeserialNumbersubjectsubjectAltNameversionc                      t          j        t           j                  } |                     t          t
                     d| _        t           j        | _        | S NF)	ssl
SSLContextPROTOCOL_TLS_SERVERload_cert_chainONLYCERTONLYKEYcheck_hostname	CERT_NONEverify_mode)server_contexts    r   simple_server_sslcontextr>   J   sB    ^C$;<<N""8W555$)N!!$Nr   Tdisable_verifyc                 v    t          j        t           j                  }d|_        | rt           j        |_        |S r3   )r4   r5   PROTOCOL_TLS_CLIENTr:   r;   r<   )r@   client_contexts     r   simple_client_sslcontextrD   R   s4    ^C$;<<N$)N! 3%(]"r   c                  4    t           d S t          d          S )NTr?   )r4   rD    r   r   dummy_ssl_contextrG   Z   s    
{t't<<<<r   c                     d } |            }|                      |          }d|_        	 |                     |           |                                 d S # |                                 w xY w)Nc                  
   K   d S NrF   rF   r   r   oncezrun_briefly.<locals>.onceb   s      r   F)create_task_log_destroy_pendingrun_until_completeclose)looprK   gents       r   run_brieflyrS   a   su      
$&&CA #A"""				s   A A,c                    t          j                    |z   } |            sd|/|t          j                    z
  }|dk    rt          j                    |                     t          j        d                      |            bd S d S )Nr   gMbP?)time	monotonicr
   TimeoutErrorrN   r   sleep)rP   predtimeoutdeadlines       r   	run_untilr\   o   s    ~')Hdff 4!1!11G!||*,,,E 2 2333 dff 4 4 4 4 4r   c                 b    |                      | j                   |                                  dS )zLegacy API to run once through the event loop.

    This is the recommended pattern for test code.  It will poll the
    selector once and run all callbacks scheduled in response to I/O
    events.
    N)	call_soonstoprun_forever)rP   s    r   run_oncera   y   s0     	NN49r   c                       e Zd Zd Zd ZdS )SilentWSGIRequestHandlerc                 (    t          j                    S rJ   )ioStringIOselfs    r   
get_stderrz#SilentWSGIRequestHandler.get_stderr   s    {}}r   c                     d S rJ   rF   )rh   formatargss      r   log_messagez$SilentWSGIRequestHandler.log_message       r   N)__name__
__module____qualname__ri   rm   rF   r   r   rc   rc      s2              r   rc   c                   2     e Zd Zej        Z fdZd Z xZS )SilentWSGIServerc                     t                                                      \  }}|                    | j                   ||fS rJ   superget_request
settimeoutrequest_timeoutrh   requestclient_addr	__class__s      r   rw   zSilentWSGIServer.get_request   s?    $ww22444/000##r   c                     d S rJ   rF   rh   r{   client_addresss      r   handle_errorzSilentWSGIServer.handle_error   rn   r   )	ro   rp   rq   r   LOOPBACK_TIMEOUTry   rw   r   __classcell__r}   s   @r   rs   rs      sO        .O$ $ $ $ $
      r   rs   c                       e Zd Zd ZdS )SSLWSGIServerMixinc                 *   t          j        t           j                  }|                    t          t
                     |                    |d          }	 |                     |||            |                                 d S # t          $ r Y d S w xY w)NT)server_side)
r4   r5   r6   r7   r8   r9   wrap_socketRequestHandlerClassrO   OSError)rh   r{   r   contextssocks        r   finish_requestz!SSLWSGIServerMixin.finish_request   s    
 .!899'222##G#>>	$$UNDAAAKKMMMMM 	 	 	DD	s   +B 
BBN)ro   rp   rq   r   rF   r   r   r   r      s#            r   r   c                       e Zd ZdS )SSLWSGIServerNro   rp   rq   rF   r   r   r   r      s        Dr   r   F)use_sslc              #     K   d fd}|r|n|} || t                                         |           j        _        t	          j        fd          }|                                 	 V                                                                    |	                                 d S #                                                                   |	                                 w xY w)Nc              3      K   t          | d                   }|rC| d                             t          |d                    }|V  |t          |          z  }|Ad S d S )NCONTENT_LENGTHz
wsgi.inputi   )intreadminlen)environsizedatas      r   rP   z_run_test_server.<locals>.loop   sz      7+,-- 	<(--c$.@.@AADJJJCIID  	 	 	 	 	r   c                 Z    d}dg} |||           | d         dk    r |           S dgS )Nz200 OK)zContent-typez
text/plain	PATH_INFOz/loops   Test messagerF   )r   start_responsestatusheadersrP   s       r   appz_run_test_server.<locals>.app   sI    12vw''';7**4== #$$r   c                  0                          d          S )Ng?)poll_interval)serve_forever)httpds   r   <lambda>z"_run_test_server.<locals>.<lambda>   s    u***>> r   target)
rc   set_appserver_addressaddress	threadingThreadstartshutdownserver_closer   )	r   r   
server_clsserver_ssl_clsr   server_classserver_threadr   rP   s	          @@r   _run_test_serverr      s+       % % % % % &-<>>*LL":;;E	MM#(EM$>>>>@ @ @M 	s   2B4 4>C2AF_UNIXc                       e Zd Zd ZdS )UnixHTTPServerc                 `    t           j                            |            d| _        d| _        d S )N	127.0.0.1P   )socketserverUnixStreamServerserver_bindserver_nameserver_portrg   s    r   r   zUnixHTTPServer.server_bind   s/    )55d;;;*D!Dr   N)ro   rp   rq   r   rF   r   r   r   r      s#        	" 	" 	" 	" 	"r   r   c                   2     e Zd Zej        Zd Z fdZ xZS )UnixWSGIServerc                 b    t                               |            |                                  d S rJ   )r   r   setup_environrg   s    r   r   zUnixWSGIServer.server_bind   s.    &&t,,,     r   c                     t                                                      \  }}|                    | j                   |dfS )N)r    ru   rz   s      r   rw   zUnixWSGIServer.get_request   sB    #(77#6#6#8#8 G[t3444 ---r   )	ro   rp   rq   r   r   ry   r   rw   r   r   s   @r   r   r      sO        !2	! 	! 	!		. 		. 		. 		. 		. 		. 		. 		. 		.r   r   c                       e Zd Zd ZdS )SilentUnixWSGIServerc                     d S rJ   rF   r   s      r   r   z!SilentUnixWSGIServer.handle_error   s    Dr   N)ro   rp   rq   r   rF   r   r   r   r      s#        	 	 	 	 	r   r   c                       e Zd ZdS )UnixSSLWSGIServerNr   rF   r   r   r   r      s        r   r   c                  j    t          j                    5 } | j        cd d d            S # 1 swxY w Y   d S rJ   )tempfileNamedTemporaryFilename)files    r   gen_unix_socket_pathr      sw    (** 	d9	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   (,,c               #      K   t                      } 	 | V  	 t          j        |            d S # t          $ r Y d S w xY w# 	 t          j        |            w # t          $ r Y w w xY wxY wrJ   )r   r   unlinkr   )r   s    r   unix_socket_pathr     s      #%%	JJJ	$   	$   s9   > - 
;;A% AA%
A"A%!A""A%c              #      K   t                      5 }t          || t          t                    E d {V  d d d            d S # 1 swxY w Y   d S N)r   r   r   r   )r   r   r   r   )r   r   s     r   run_test_unix_serverr     s       	J4'g3G7HJ J J J J J J J J J	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	J 	Js   $AA	Ar   hostportr   c              #   T   K   t          | |f|t          t                    E d {V  d S r   )r   rs   r   r   s      r   run_test_serverr     sS      tg+;/<> > > > > > > > > > > >r   c                     	 |                      d          \  }}|dk    r|                                  d S |                     ||           K)NTi      STOP)recvfromrO   sendto)sockr   addrs      r   echo_datagramsr     sP    $]]4((
d7??JJLLLEKKd###$r   )r   r   c              #   D  	K   t          j        | |t           j                  }|d         \  }}}}}t          j         |||          		                    | |f           t	          j        	fd          }|                                 	 	                                V  	                    d	                                           |	                                 d S # 	                    d	                                           |	                                 w xY w)N)typer   c                  "    t                     S rJ   )r   )r   s   r   r   z%run_udp_echo_server.<locals>.<lambda>,  s    ^D-A-A r   r   r   )
socketgetaddrinfo
SOCK_DGRAMbindr   r   r   getsocknamer   r   )
r   r   	addr_infofamilyr   proto_sockaddrthreadr   s
            @r   run_udp_echo_serverr   &  s     "4F4EFFFI'0|$FD%H=u--DIItTl%A%A%A%ABBBF
LLNNN     GT--//000 	GT--//000s   C! !>Dc                     i }t          |           D ]@}|                    d          r|                    d          r-t          d           ||<   A t	          d| f| j        z   |                      S )N__)return_valueTestProtocol)dir
startswithendswithMockCallbackr   	__bases__)basedctr   s      r   make_test_protocolr   5  s    
CD		 4 4??4   	T]]4%8%8 	 d333D		>4$. 8#>>@@@r   c                   .    e Zd Zd ZddZd Zd Zd ZdS )TestSelectorc                     i | _         d S rJ   keysrg   s    r   __init__zTestSelector.__init__A  s    			r   Nc                 H    t          j        |d||          }|| j        |<   |S )Nr   )	selectorsSelectorKeyr  )rh   fileobjr   r   keys        r   registerzTestSelector.registerD  s)    #GQ== 	'
r   c                 6    | j                             |          S rJ   )r  pop)rh   r	  s     r   
unregisterzTestSelector.unregisterI  s    y}}W%%%r   c                     g S rJ   rF   )rh   rZ   s     r   selectzTestSelector.selectL  s    	r   c                     | j         S rJ   r  rg   s    r   get_mapzTestSelector.get_mapO  s
    yr   rJ   )ro   rp   rq   r  r  r  r  r  rF   r   r   r  r  ?  sd             
& & &      r   r  c                        e Zd ZdZd fd	Zd Zd Z fdZd Zd Z	d	 Z
d
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Z fdZdd fd
Zd Zd Z xZS )TestLoopa  Loop for unittests.

    It manages self time directly.
    If something scheduled to be executed later then
    on next loop iteration after all ready handlers done
    generator passed to __init__ is calling.

    Generator should be like this:

        def gen():
            ...
            when = yield ...
            ... = yield time_advance

    Value returned by yield is absolute time of next scheduled handler.
    Value passed to yield is time advance to move loop's time forward.
    Nc                 z   t                                                       |d }d| _        nd| _         |            | _        t	          | j                   d| _        d| _        g | _        t                      | _	        i | _
        i | _        |                                  t          j                    | _        d S )Nc               3      K   d V  d S rJ   rF   rF   r   r   rQ   zTestLoop.__init__.<locals>.genj  s      r   FTr   g&.>)rv   r  _check_on_close_gennext_time_clock_resolution_timersr  	_selectorreaderswritersreset_countersweakrefWeakValueDictionary_transports)rh   rQ   r}   s     r   r  zTestLoop.__init__f  s    ;  #(D  #'D CEE	TY
!%%"688r   c                     | j         S rJ   r  rg   s    r   rU   zTestLoop.time}  s
    zr   c                 .    |r| xj         |z  c_         dS dS )zMove test time forward.Nr%  )rh   advances     r   advance_timezTestLoop.advance_time  s(     	"JJ'!JJJJ	" 	"r   c                     t                                                       | j        r;	 | j                            d           t          d          # t          $ r Y d S w xY wd S )Nr   zTime generator is not finished)rv   rO   r  r  sendAssertionErrorStopIteration)rh   r}   s    r   rO   zTestLoop.close  s{     	GG	q!!! %%EFFF !   	G 	Gs   A 
A! A!c                 D    t          j        ||| d           | j        |<   d S rJ   )r   Handler  rh   fdcallbackrl   s       r   _add_readerzTestLoop._add_reader  $    !=4tDDRr   c                 V    | j         |xx         dz  cc<   || j        v r
| j        |= dS dS N   TF)remove_reader_countr  rh   r0  s     r   _remove_readerzTestLoop._remove_reader  B     $$$)$$$R 45r   c                     || j         vrt          d| d          | j         |         }|j        |k    rt          d|j         d|           |j        |k    rt          d|j         d|           d S )Nfd  is not registeredzunexpected callback:  != zunexpected callback args: )r  r+  	_callback_argsrh   r0  r1  rl   handles        r   assert_readerzTestLoop.assert_reader  s    T\!! !=r!=!=!=>>>b!x'' H(8HHhHHJ J J<4 EV\EEtEEG G G  r   c                 >    || j         v rt          d| d          d S )Nr<  z is registered)r  r+  r8  s     r   assert_no_readerzTestLoop.assert_no_reader  s1     !9r!9!9!9::: r   c                 D    t          j        ||| d           | j        |<   d S rJ   )r   r.  r  r/  s       r   _add_writerzTestLoop._add_writer  r3  r   c                 V    | j         |xx         dz  cc<   || j        v r
| j        |= dS dS r5  )remove_writer_countr  r8  s     r   _remove_writerzTestLoop._remove_writer  r:  r   c                     || j         vrt          d| d          | j         |         }|j        |k    rt          |j        d|          |j        |k    rt          |j        d|          d S )Nr<  r=  r>  )r  r+  r?  r@  rA  s        r   assert_writerzTestLoop.assert_writer  s    T\!! !=r!=!=!=>>>b!x'' F$4!H!HH!H!HIII<4 FL!@!@!@!@AAA  r   c                 r   t          |t                    sa	 t          |                                          }n># t          t          t
          f$ r$ t          d                    |                    d w xY w	 | j        |         }t          d                    ||                    # t          $ r Y d S w xY w)NzInvalid file object: {!r}z.File descriptor {!r} is used by transport {!r})

isinstancer   filenoAttributeError	TypeError
ValueErrorrk   r#  RuntimeErrorKeyError)rh   r0  	transports      r   _ensure_fd_no_transportz TestLoop._ensure_fd_no_transport  s    "c"" 	>>%%"Iz: > > >  "((.r

4 49=>>	$(,I @GG	# #$ $ $  	 	 	DD	s   !9 ;A48B( (
B65B6c                 J    |                      |            | j        ||g|R  S )zAdd a reader callback.)rV  r2  r/  s       r   
add_readerzTestLoop.add_reader  3    $$R(((tH4t4444r   c                 V    |                      |           |                     |          S )zRemove a reader callback.)rV  r9  r8  s     r   remove_readerzTestLoop.remove_reader  *    $$R(((""2&&&r   c                 J    |                      |            | j        ||g|R  S )zAdd a writer callback..)rV  rG  r/  s       r   
add_writerzTestLoop.add_writer  rY  r   c                 V    |                      |           |                     |          S )zRemove a writer callback.)rV  rJ  r8  s     r   remove_writerzTestLoop.remove_writer  r\  r   c                 ~    t          j        t                    | _        t          j        t                    | _        d S rJ   )collectionsdefaultdictr   r7  rI  rg   s    r   r   zTestLoop.reset_counters  s.    #.#:3#?#? #.#:3#?#?   r   c                     t                                                       | j        D ]1}| j                            |          }|                     |           2g | _        d S rJ   )rv   	_run_oncer  r  r*  r(  )rh   whenr'  r}   s      r   re  zTestLoop._run_once  s_    L 	' 	'DinnT**Gg&&&&r   )r   c                t    | j                             |            t                      j        ||g|R d|iS )Nr   )r  appendrv   call_at)rh   rf  r1  r   rl   r}   s        r   ri  zTestLoop.call_at  sA    D!!!uwwtXFFFFgFFFr   c                     d S rJ   rF   )rh   
event_lists     r   _process_eventszTestLoop._process_events  s    r   c                     d S rJ   rF   rg   s    r   _write_to_selfzTestLoop._write_to_self  rn   r   rJ   )ro   rp   rq   __doc__r  rU   r(  rO   r2  r9  rC  rE  rG  rJ  rL  rV  rX  r[  r^  r`  r   re  ri  rl  rn  r   r   s   @r   r  r  S  s        $9 9 9 9 9 9.  " " "
G G G G GE E E  	G 	G 	G; ; ;E E E  B B B$ $ $"5 5 5
' ' '
5 5 5
' ' '
@ @ @     6: G G G G G G G        r   r  c                  *    t          j        dddgi| S )Nspec__call__rF   )r   Mock)kwargss    r   r   r     s    911:,1&111r   c                       e Zd ZdZd ZdS )MockPatternzA regex based str with a fuzzy __eq__.

    Use this helper with 'mock.assert_called_with', or anywhere
    where a regex comparison between strings is needed.

    For instance:
       mock_call.assert_called_with(MockPattern('spam.*ham'))
    c                 v    t          t          j        t          |           |t          j                            S rJ   )boolresearchstrSrh   others     r   __eq__zMockPattern.__eq__  s&    BIc$ii55666r   N)ro   rp   rq   ro  r  rF   r   r   rv  rv    s-         7 7 7 7 7r   rv  c                       e Zd Zd Zd ZdS )MockInstanceOfc                     || _         d S rJ   )_type)rh   r   s     r   r  zMockInstanceOf.__init__
  s    


r   c                 ,    t          || j                  S rJ   )rN  r  r}  s     r   r  zMockInstanceOf.__eq__  s    %,,,r   N)ro   rp   rq   r  r  rF   r   r   r  r  	  s2          - - - - -r   r  c                 V    t          j        |           }|t          d|           |S )Nzunable to get the source of )r	   _get_function_sourcerR  )funcsources     r   get_function_sourcer    s1    066F~jTTCDDDMr   c                   D    e Zd Zed             ZdddZd	dZd Zd ZdS )
TestCasec                    | j         W|                                 s(|                     |                                            n| j                             d           |                                  t          j                    }|	 |                                }t          |t          j                  r?t          |j                                                  }|D ]}|                                 d S d S # t           $ r Y d S w xY wd S )NT)wait)_default_executor	is_closedrN   shutdown_default_executorr   rO   r   maybe_get_event_loop_policyget_child_watcherrN  asyncioThreadedChildWatcherlist_threadsvaluesr   NotImplementedError)rP   policywatcherthreadsr   s        r   
close_loopzTestCase.close_loop  s"   !->>## ;''(F(F(H(HIIII&//T/:::

466	& 2244
 gw'CDD &"7#3#:#:#<#<==G") & && && & '    s   	C: :
DDT)cleanupc                    |t          d          t          j        d            |r|                     | j        |           d S d S )Nzloop is None)r+  r   set_event_loop
addCleanupr  )rh   rP   r  s      r   r  zTestCase.set_event_loop.  sT    < 000d### 	3OODOT22222	3 	3r   Nc                 N    t          |          }|                     |           |S rJ   )r  r  )rh   rQ   rP   s      r   new_test_loopzTestCase.new_test_loop6  s&    }}D!!!r   c                 6    t          j                    | _        d S rJ   )r   threading_setup_thread_cleanuprg   s    r   setUpzTestCase.setUp;  s    /?AAr   c                     t          j        d            |                     t          j                    d           |                                  t          j        | j          t          j
                     d S )N)NNN)r   r  assertEqualsysexc_info
doCleanupsr   threading_cleanupr  r   reap_childrenrg   s    r   tearDownzTestCase.tearDown>  sh    d### 	);<<<*D,@AAr   rJ   )	ro   rp   rq   staticmethodr  r  r  r  r  rF   r   r   r  r    s        & & \&( /3 3 3 3 3 3   
B B B	  	  	  	  	 r   r  c               #      K   t           j        } 	 t          j        t          j        dz              dV  t          j        |            dS # t          j        |            w xY w)zrContext manager to disable asyncio logger.

    For example, it can be used to ignore warnings in debug mode.
    r6  N)r   levelsetLevelloggingCRITICAL)	old_levels    r   disable_loggerr  J  sa       I#(*+++	"""""	""""s   %A A!c                     t          j        t          j                  }| |_        ||_        ||_        d|j        _        |S )z'Create a mock of a non-blocking socket.g        )r   	MagicMockr   r   r   r   
gettimeoutr   )r   r   r   r   s       r   mock_nonblocking_socketr  X  s9     >&-((DDJDIDK#&DO Kr   )Sro  r  rb  
contextlibre   r  r   ry  r  r   r   r  r   r   rU   unittestr!  r   http.serverr   wsgiref.simple_serverr   r   r4   ImportErrorr   r   r	   r
   r   asyncio.logr   testr   test.supportr   r   r8   r9   SIGNED_CERTFILE
SIGNING_CAPEERCERTr>   rD   rG   rS   SHORT_TIMEOUTr\   ra   rc   rs   r   r   r   r   r   r   r   r   r   r   contextmanagerr   r   r   r   r   r   BaseSelectorr  BaseEventLoopr  r   r{  rv  r  r  r  r  IPPROTO_TCPSOCK_STREAMAF_INETr  rF   r   r   <module>r     sc                				  				 				          



               " " " " " " @ @ @ @ @ @ @ @JJJJ   
CCC              " " " " " "                         ) ) ) ) ) )& & & 9^$$
)M
"
")N++Y~&&
:FT0 ++&- . &   04     = = =   #*"7 4 4 4 4      1   
 
 
 
 
z 
 
 
       &	 	 	 	 	&(8 	 	 	 */          F 769 >J" " " " "6
 " " ". . . . . . . .(    ~       .0D     
    (- J J J J J 'a > > > > >$ $ $  +!     A A A    9)   (b b b b b{( b b bJ2 2 2
7 
7 
7 
7 
7# 
7 
7 
7- - - - - - - -  /  /  /  /  / x  /  /  / d 
# 
# 
# #)"46;M#)>     s   A A'&A'