
    daf!J                        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mZ ddlmZ ddlmZmZ 	 ddlZddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlm Z  ddl!m"Z" ddl!m#Z# dZ$d Z% e%dd      Z& e%dd      Z' e%dd      Z( e%d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'Z0d( Z1 G d) d*e      Z2 G d+ d,e      Z3 G d- d.      Z4 G d/ d0e4e3      Z5d1d2d3Z6 e7e	d4      rc G d5 d6e
jp                  e      Z9 G d7 d8e9e      Z: G d9 d:e:      Z; G d; d<e4e;      Z<d= Z=ej|                  d>        Z?ej|                  d1d2d?       Z@ej|                  d@dd1dAdB       ZAdC ZBej|                  d@ddDdE       ZCdF ZD G dG dHej                        ZF G dI dJej                        ZHdK ZI G dL dMeJ      ZK G dN dO      ZLdP ZM G dQ dRej                        ZNej|                  dS        ZOe	j                  e	j                  e	j                  fdTZSdU ZTy# e$ r dZY w xY w)VzUtilities shared by tests.    N)mock)
HTTPServer)WSGIRequestHandler
WSGIServer)base_events)events)format_helpers)futures)tasks)logger)support)socket_helper)threading_helper皙?c                     t        t        d      rOt        j                  j                  t        j
                  g|  }t        j                  j                  |      r|S t        j                  j                  t        j                  j                  t              dg|  }t        j                  j                  |      r|S t        t        j                  j	                  |             )NTEST_HOME_DIRz..)
hasattrr   ospathjoinr   isfiledirname__file__FileNotFoundError)filenamefullnames     2/root/Python-3.12.4/Lib/test/test_asyncio/utils.py	data_filer   -   s    w(77<< 5 5AA77>>(#Oww||BGGOOH5tGhGH	ww~~h
BGGLL2
33    certdataz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                        } | 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_sslcontextrA   O   s@    ^^C$;$;<N""8W5$)N!!$Nr   Tdisable_verifyc                     t        j                  t         j                        }d|_        | rt         j                  |_        |S r6   )r7   r8   PROTOCOL_TLS_CLIENTr=   r>   r?   )rC   client_contexts     r   simple_client_sslcontextrG   W   s3    ^^C$;$;<N$)N!%(]]"r   c                  (    t         y t        d      S )NTrB   )r7   rG    r   r   dummy_ssl_contextrJ   _   s    
{'t<<r   c                     d } |       }| j                  |      }d|_        	 | j                  |       |j                          y # |j                          w xY w)Nc                     K   y wNrI   rI   r   r   oncezrun_briefly.<locals>.onceg   s	     s   F)create_task_log_destroy_pendingrun_until_completeclose)looprN   gents       r   run_brieflyrV   f   sN    
&CA #A"				s   A Ac                     d}t        j                  |d      D ]>  } |       r y | j                  t        j                  |             t        |dz  d      }@ t        j                         )NgMbP?F)error   g      ?)r   
busy_retryrQ   r   sleepmaxr
   TimeoutError)rS   predtimeoutdelay_s        r   	run_untilrb   t   sc    Eu5 %6E 23EAIs#	% ""$$r   c                 Z    | j                  | j                         | j                          y)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)rS   s    r   run_oncerg      s      	NN499r   c                       e Zd Zd Zd Zy)SilentWSGIRequestHandlerc                 *    t        j                         S rM   )ioStringIOselfs    r   
get_stderrz#SilentWSGIRequestHandler.get_stderr   s    {{}r   c                      y rM   rI   )rn   formatargss      r   log_messagez$SilentWSGIRequestHandler.log_message       r   N)__name__
__module____qualname__ro   rs   rI   r   r   ri   ri      s    r   ri   c                   <     e Zd Zej                  Z fdZd Z xZS )SilentWSGIServerc                 d    t         |          \  }}|j                  | j                         ||fS rM   superget_request
settimeoutrequest_timeoutrn   requestclient_addr	__class__s      r   r}   zSilentWSGIServer.get_request   s4    $w244//0##r   c                      y rM   rI   rn   r   client_addresss      r   handle_errorzSilentWSGIServer.handle_error   rt   r   )	ru   rv   rw   r   LOOPBACK_TIMEOUTr   r}   r   __classcell__r   s   @r   ry   ry      s    ..O$
r   ry   c                       e Zd Zd Zy)SSLWSGIServerMixinc                 
   t        j                  t         j                        }|j                  t        t
               |j                  |d      }	 | j                  |||        |j                          y # t        $ r Y y w xY w)NT)server_side)
r7   r8   r9   r:   r;   r<   wrap_socketRequestHandlerClassrR   OSError)rn   r   r   contextssocks        r   finish_requestz!SSLWSGIServerMixin.finish_request   so    
 ..!8!89'2##G#>	$$UNDAKKM 		s   #A6 6	BBN)ru   rv   rw   r   rI   r   r   r   r      s    r   r   c                       e Zd Zy)SSLWSGIServerNru   rv   rw   rI   r   r   r   r      s    r   r   F)use_sslc              #     K   d fd}|r|n|} || t               j                  |       j                  _        t	        j
                  fd      }|j                          	  j                          j                          |j                          y # j                          j                          |j                          w xY ww)Nc              3      K   t        | d         }|r4| d   j                  t        |d            }| |t        |      z  }|r3y y w)NCONTENT_LENGTHz
wsgi.inputi   )intreadminlen)environsizedatas      r   rS   z_run_test_server.<locals>.loop   sM     7+,-<(--c$.@ADJCID s   AAAc                 F    d}dg} |||       | d   dk(  r |       S dgS )Nz200 OK)zContent-typez
text/plain	PATH_INFOz/loops   Test messagerI   )r   start_responsestatusheadersrS   s       r   appz_run_test_server.<locals>.app   s:    12vw';7*= #$$r   c                  (     j                  d      S )Nr   )poll_interval)serve_forever)httpds   r   <lambda>z"_run_test_server.<locals>.<lambda>   s    u***> r   target)
ri   set_appserver_addressaddress	threadingThreadstartshutdownserver_closer   )	r   r   
server_clsserver_ssl_clsr   server_classserver_threadr   rS   s	          @@r   _run_test_serverr      s     % &->*L":;E	MM#((EM$$>@M 	s   A'C,B! 01C!2CCAF_UNIXc                       e Zd Zd Zy)UnixHTTPServerc                 ^    t         j                  j                  |        d| _        d| _        y )N	127.0.0.1P   )socketserverUnixStreamServerserver_bindserver_nameserver_portrm   s    r   r   zUnixHTTPServer.server_bind   s&    ))55d;*D!Dr   N)ru   rv   rw   r   rI   r   r   r   r      s    	"r   r   c                   <     e Zd Zej                  Zd Z fdZ xZS )UnixWSGIServerc                 N    t         j                  |        | j                          y rM   )r   r   setup_environrm   s    r   r   zUnixWSGIServer.server_bind   s    &&t, r   c                 d    t         |          \  }}|j                  | j                         |dfS )N)r    r{   r   s      r   r}   zUnixWSGIServer.get_request   s7    #(7#6#8 G[t334 ---r   )	ru   rv   rw   r   r   r   r   r}   r   r   s   @r   r   r      s    !22	!		. 		.r   r   c                       e Zd Zd Zy)SilentUnixWSGIServerc                      y rM   rI   r   s      r   r   z!SilentUnixWSGIServer.handle_error   s    r   N)ru   rv   rw   r   rI   r   r   r   r      s    	r   r   c                       e Zd Zy)UnixSSLWSGIServerNr   rI   r   r   r   r      s    r   r   c                  *    t        j                         S rM   )r   create_unix_domain_namerI   r   r   gen_unix_socket_pathr     s    4466r   c               #      K   t               } 	 |  	 t        j                  |        y # t        $ r Y y w xY w# 	 t        j                  |        w # t        $ r Y w w xY wxY wwrM   )r   r   unlinkr   )r   s    r   unix_socket_pathr     s[     #%	J		$ 		$ sR   A"8 ) A"	5A"5A"AAA	AAAAA"c              #      K   t               5 }t        || t        t              E d {    d d d        y 7 # 1 sw Y   y xY wwN)r   r   r   r   )r   r   r   r   )r   r   s     r   run_test_unix_serverr     sR      	J4'g3G7HJ J J	J 	JJ	J 	Js$   A868	A8AAr   hostportr   c              #   R   K   t        | |f|t        t              E d {    y 7 wr   )r   ry   r   r   s      r   run_test_serverr     s&     tg+;/<> > >s   '%'c                 ~    	 | j                  d      \  }}|dk(  r| j                          y | j                  ||       =)Ni      STOP)recvfromrR   sendto)sockr   addrs      r   echo_datagramsr   !  s=    
]]4(
d7?JJLKKd# r   )r   r   c              #     	K   t        j                  | |t         j                        }|d   \  }}}}}t        j                   |||      		j                  | |f       t	        j
                  	fd      }|j                          	 	j                          	j                  d	j                                |j                          y # 	j                  d	j                                |j                          w xY ww)N)typer   c                      t               S rM   )r   )r   s   r   r   z%run_udp_echo_server.<locals>.<lambda>1  s    ^D-A r   r   r   )
socketgetaddrinfo
SOCK_DGRAMbindr   r   r   getsocknamer   r   )
r   r   	addr_infofamilyr   protora   sockaddrthreadr   s
            @r   run_udp_echo_serverr   +  s     ""4F4E4EFI'0|$FD%H==u-DIItTl%ABF
LLN  GT--/0 	GT--/0s   BD	C 1D2C>>Dc                     i }t        |       D ]4  }|j                  d      r|j                  d      r&t        d       ||<   6  t	        d| f| j
                  z   |             S )N__)return_valueTestProtocol)dir
startswithendswithMockCallbackr   	__bases__)basedctnames      r   make_test_protocolr  :  sc    
CD	 4??4 T]]4%8 d3D		4
 ?4$.. 8#>@@r   c                   ,    e Zd Zd ZddZd Zd Zd Zy)TestSelectorc                     i | _         y rM   keysrm   s    r   __init__zTestSelector.__init__F  s	    	r   Nc                 T    t        j                  |d||      }|| j                  |<   |S )Nr   )	selectorsSelectorKeyr  )rn   fileobjr   r   keys        r   registerzTestSelector.registerI  s+    ##GQ= 		'
r   c                 8    | j                   j                  |      S rM   )r  pop)rn   r  s     r   
unregisterzTestSelector.unregisterN  s    yy}}W%%r   c                     g S rM   rI   )rn   r_   s     r   selectzTestSelector.selectQ  s    	r   c                     | j                   S rM   r  rm   s    r   get_mapzTestSelector.get_mapT  s    yyr   rM   )ru   rv   rw   r  r  r  r  r  rI   r   r   r  r  D  s    
&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                 B   t         |           |d }d| _        nd| _         |       | _        t	        | j                         d| _        d| _        g | _        t               | _	        i | _
        i | _        | j                          t        j                         | _        y )Nc               3      K   d  y wrM   rI   rI   r   r   rT   zTestLoop.__init__.<locals>.geno  s	     s   FTr   g&.>)r|   r  _check_on_close_gennext_time_clock_resolution_timersr  	_selectorreaderswritersreset_countersweakrefWeakValueDictionary_transports)rn   rT   r   s     r   r  zTestLoop.__init__k  s    ;#(D #'D E	TYY
!%%"668r   c                     | j                   S rM   r  rm   s    r   timezTestLoop.time  s    zzr   c                 4    |r| xj                   |z  c_         yy)zMove test time forward.Nr(  )rn   advances     r   advance_timezTestLoop.advance_time  s    JJ'!J r   c                     t         |           | j                  r'	 | j                  j	                  d       t        d      y # t        $ r Y y w xY w)Nr   zTime generator is not finished)r|   rR   r  r  sendAssertionErrorStopIteration)rn   r   s    r   rR   zTestLoop.close  sR    G		q! %%EFF   ! s   A 	AAc                 N    t        j                  ||| d       | j                  |<   y rM   )r   Handler!  rn   fdcallbackrr   s       r   _add_readerzTestLoop._add_reader      !==4tDRr   c                 j    | j                   |xx   dz  cc<   || j                  v r| j                  |= yyN   TF)remove_reader_countr!  rn   r4  s     r   _remove_readerzTestLoop._remove_reader  6      $)$R r   c                    || j                   vrt        d| d      | j                   |   }|j                  |k7  rt        d|j                   d|       |j                  |k7  rt        d|j                   d|       y )Nfd  is not registeredzunexpected callback:  != zunexpected callback args: )r!  r/  	_callback_argsrn   r4  r5  rr   handles        r   assert_readerzTestLoop.assert_reader  s    T\\! 3rd*<!=>>b!x' '(8(8'9hZHJ J<<4 ,V\\N$tfEG G  r   c                 >    || j                   v rt        d| d      y )Nr@  z is registered)r!  r/  r<  s     r   assert_no_readerzTestLoop.assert_no_reader  s'     3rd.!9:: r   c                 N    t        j                  ||| d       | j                  |<   y rM   )r   r2  r"  r3  s       r   _add_writerzTestLoop._add_writer  r7  r   c                 j    | j                   |xx   dz  cc<   || j                  v r| j                  |= yyr9  )remove_writer_countr"  r<  s     r   _remove_writerzTestLoop._remove_writer  r>  r   c                     || j                   vrt        d| d      | j                   |   }|j                  |k7  rt        |j                  d|      |j                  |k7  rt        |j                  d|      y )Nr@  rA  rB  )r"  r/  rC  rD  rE  s        r   assert_writerzTestLoop.assert_writer  s    T\\! 3rd*<!=>>b!x' F$4$4#7tH<!HII<<4 FLL#34x!@AA  r   c                 0   t        |t              s	 t        |j                               }	 | j                  |   }t        dj                  ||            # t        t        t
        f$ r t        dj                  |            d w xY w# t        $ r Y y w xY w)NzInvalid file object: {!r}z.File descriptor {!r} is used by transport {!r})

isinstancer   filenoAttributeError	TypeError
ValueErrorrq   r&  RuntimeErrorKeyError)rn   r4  	transports      r   _ensure_fd_no_transportz TestLoop._ensure_fd_no_transport  s    "c">%
	$((,I @GG	#$ $ #Iz: >  "((.r
49=>>  		s   A B	 0B		BBc                 L    | j                  |        | j                  ||g| S )zAdd a reader callback.)rZ  r6  r3  s       r   
add_readerzTestLoop.add_reader  *    $$R(tH4t44r   c                 F    | j                  |       | j                  |      S )zRemove a reader callback.)rZ  r=  r<  s     r   remove_readerzTestLoop.remove_reader  !    $$R(""2&&r   c                 L    | j                  |        | j                  ||g| S )zAdd a writer callback..)rZ  rK  r3  s       r   
add_writerzTestLoop.add_writer  r]  r   c                 F    | j                  |       | j                  |      S )zRemove a writer callback.)rZ  rN  r<  s     r   remove_writerzTestLoop.remove_writer  r`  r   c                 |    t        j                  t              | _        t        j                  t              | _        y rM   )collectionsdefaultdictr   r;  rM  rm   s    r   r#  zTestLoop.reset_counters  s(    #.#:#:3#? #.#:#:3#? r   c                     t         |           | j                  D ].  }| j                  j	                  |      }| j                  |       0 g | _        y rM   )r|   	_run_oncer  r  r.  r,  )rn   whenr+  r   s      r   ri  zTestLoop._run_once  sJ    LL 	'DiinnT*Gg&	' r   )r   c                b    | j                   j                  |       t        |   ||g|d|iS )Nr   )r  appendr|   call_at)rn   rj  r5  r   rr   r   s        r   rm  zTestLoop.call_at  s0    D!wtXFFgFFr   c                      y rM   rI   )rn   
event_lists     r   _process_eventszTestLoop._process_events  s    r   c                      y rM   rI   rm   s    r   _write_to_selfzTestLoop._write_to_self  rt   r   rM   )ru   rv   rw   __doc__r  r)  r,  rR   r6  r=  rG  rI  rK  rN  rP  rZ  r\  r_  rb  rd  r#  ri  rm  rp  rr  r   r   s   @r   r  r  X  s}    $9."
GE	G;EB$"5
'
5
'
@ 6: Gr   r  c                  2    t        j                  dddgi| S )Nspec__call__rI   )r   Mock)kwargss    r   r   r     s    991:,1&11r   c                       e Zd ZdZd Zy)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                 p    t        t        j                  t        |       |t        j                              S rM   )boolresearchstrSrn   others     r   __eq__zMockPattern.__eq__
  s"    BIIc$i566r   N)ru   rv   rw   rs  r  rI   r   r   rz  rz    s    7r   rz  c                       e Zd Zd Zd Zy)MockInstanceOfc                     || _         y rM   )_type)rn   r   s     r   r  zMockInstanceOf.__init__  s	    
r   c                 .    t        || j                        S rM   )rR  r  r  s     r   r  zMockInstanceOf.__eq__  s    %,,r   N)ru   rv   rw   r  r  rI   r   r   r  r    s    -r   r  c                 P    t        j                  |       }|t        d|       |S )Nzunable to get the source of )r	   _get_function_sourcerV  )funcsources     r   get_function_sourcer    s*    006F~TCDDMr   c                   <    e Zd Zed        ZdddZd	dZd Zd Zy)
TestCasec                    | j                   L| j                         s | j                  | j                                n| j                   j	                  d       | j                          t        j                         }|	 t        j                         5  t        j                  dt               |j                         }d d d        t        t        j                        rht!        |j"                  j%                               D ]A  }|j'                  t        j(                         |j+                         s4t-        d| d       y y y # 1 sw Y   xY w# t.        $ r Y y w xY w)NT)waitignore)r_   zthread z& still alive: subprocess still running)_default_executor	is_closedrQ   shutdown_default_executorr   rR   r   maybe_get_event_loop_policywarningscatch_warningssimplefilterDeprecationWarningget_child_watcherrR  asyncioThreadedChildWatcherlist_threadsvaluesr   SHORT_TIMEOUTis_aliverW  NotImplementedError)rS   policywatcherr   s       r   
close_loopzTestCase.close_loop  s>   !!->>#''(F(F(HI&&//T/:

446K,,. 9))(4FG$668G9 gw'C'CD"&w'7'7'>'>'@"A KG,A,AB!??,". AJ 0J #K KK E 9 9 ' s*    E +E?E EE 	E#"E#T)cleanupc                    |t        d      t        j                  d        |r| j                  | j                  |       y y )Nzloop is None)r/  r   set_event_loop
addCleanupr  )rn   rS   r  s      r   r  zTestCase.set_event_loop:  s:    < 00d#OODOOT2 r   Nc                 >    t        |      }| j                  |       |S rM   )r  r  )rn   rT   rS   s      r   new_test_loopzTestCase.new_test_loopB  s    }D!r   c                 6    t        j                         | _        y rM   )r   threading_setup_thread_cleanuprm   s    r   setUpzTestCase.setUpG  s    /??Ar   c                     t        j                  d        | j                  t        j                                | j                          t        j                  | j                    t        j                          y rM   )r   r  assertIsNonesys	exception
doCleanupsr   threading_cleanupr  r   reap_childrenrm   s    r   tearDownzTestCase.tearDownJ  sP    d# 	#--/***D,@,@Ar   rM   )	ru   rv   rw   staticmethodr  r  r  r  r  rI   r   r   r  r    s0    K K6 /3 3
B	 r   r  c               #      K   t         j                  } 	 t        j                  t        j                  dz          d t        j                  |        y# t        j                  |        w xY ww)zrContext manager to disable asyncio logger.

    For example, it can be used to ignore warnings in debug mode.
    r:  N)r   levelsetLevelloggingCRITICAL)	old_levels    r   disable_loggerr  V  sH      I#((*+	"	"s   A.*A A.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  d  s<     >>&--(DDJDIDK#&DOO Kr   c                     K   d  fd}t        j                         j                  |       t        j                  d       d {    y 7 	w)Nc                  b    	 j                         D ]  }  y # t        $ r}|Y d }~y d }~ww xY wrM   )	__await__BaseException)ra   errcoroexcs     r   r  z await_without_task.<locals>.funcq  s6    	^^%  	C	s    	.).r   )r  get_running_looprd   r[   )r  r  r  s   ` @r   await_without_taskr  o  sP     
C ((.
--

	  s   AAA	
A)Urs  r  rf  
contextlibrk   r  r   r}  r
  r   r   r  r   unittestr$  r  r   http.serverr   wsgiref.simple_serverr   r   r7   ImportErrorr   r   r	   r
   r   asyncio.logr   testr   test.supportr   r   	CLOCK_RESr   r;   r<   SIGNED_CERTFILE
SIGNING_CAPEERCERTrA   rG   rJ   rV   r  rb   rg   ri   ry   r   r   r   r   r   r   r   r   r   r   contextmanagerr   r   r   r   r   r  BaseSelectorr  BaseEventLoopr  r   r  rz  r  r  r  r  IPPROTO_TCPSOCK_STREAMAF_INETr  r  rI   r   r   <module>r     s        	  	 	    
      " @    "     & ) 	4 Z0
J
.J7z>2
:FT0 ++&- .& 04 = #*"7"7 %1 
z 
 &	&(8 	 */  F 69"66
 ". .(~ .0D 7   (- J J 'a > >$  +!  A9)) (b{(( bJ2
7# 
7- -6 x   6 r 
# 
# #)"4"46;M;M#)>>m  
Cs   I II