wceN dZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl m Z m Z ddl mZddlmZmZmZmZmZmZmZmZmZddlmZmZddlmZddlmZm Z dd l!m"Z"ddl#Z#dd l$m%Z%m&Z&d d l'm(Z(m)Z)d d l m*Z*d dl+m,Z,d dl-m.Z.d dl/m0Z0d dl1m2Z2m3Z3d dl4m5Z5d dl6m7Z7m8Z8m9Z9m:Z:m;Z;mZ>d dl?m@Z@erddlAmBZBndZBejdk(xrejdk7ZEejfdeGdejdejfdZIdeGdeJdejdejfdZKdeJfdZLGdd e ZMGd!d"eMZNGd#d$eMZOGd%d&ZPGd'd(eZQd)ed*ed+edefd,ZRegejfZTejejd-fd.eTd/eWdeejfd0ZXejfd.eTdejfd1ZYdJd2ejd/eWddfd3ZZdejfd4Z\dKd5eeBdejfd6Z^ dKe0e2d d d-de0e0e0e0dd7d8d9 d:eGd;eGde2d?eWd@edAedBedCedDed5eeBdEeJd2ede:fdFZ_e0e0fdGedHedefdIZ`y)LzUtilities shared by tests.N)ABCabstractmethod) TracebackType) TYPE_CHECKINGAnyCallableIteratorListOptionalTypeUnioncast)IsolatedAsyncioTestCasemock)Signal) CIMultiDictCIMultiDictProxy)URL)_RequestContextManager_WSRequestContextManager) ClientSessionhdrs)AbstractCookieJar)ClientResponse)ClientWebSocketResponse)sentinel) HttpVersionRawRequestMessage)StrOrURL) Application AppRunner BaseRunnerRequestServer ServerRunnerSockSiteUrlMappingMatchInfo)_RequestHandler) SSLContextposixcygwinhostfamilyreturnct|d|S)Nr)get_port_socket)r-r.s 4/usr/lib/python3/dist-packages/aiohttp/test_utils.pyget_unused_port_socketr3=s 4F ++portctj|tj}tr/|jtjtj d|j ||f|S)Nr)socket SOCK_STREAM REUSE_ADDRESS setsockopt SOL_SOCKET SO_REUSEADDRbind)r-r5r.ss r2r1r1CsP  ff001A V&&(;(;Q?FFD$< Hr4ctjtjtj5}|jdt t |j dcdddS#1swYyxYw)z1Return a port that is unused on the current host.) 127.0.0.1rrN)r7AF_INETr8r=rint getsockname)r>s r2 unused_portrDPsS v~~v'9'9 :-a  C+,---s 2A//A8ceZdZdZeddddeddeeefde e jdede e d e d eee ej gejfd ed dfd Z dde e jd ed dfdZed ed efdZded efdZed e fdZed e fdZed efdZddZddZ de e!e"de e"de e#d dfdZ$ddZ%de e!e"de e"de e#d dfdZ&y) BaseTestServerFNr@)schemeloopr-r5skip_url_assertssocket_factoryrGrHr-r5rIrJkwargsr/c ||_d|_d|_||_||_d|_||_||_||_y)NF) _looprunner_rootr-r5_closedrGrIrJ)selfrGrHr-r5rIrJrKs r2__init__zBaseTestServer.__init__ZsE ,0 $(     0,r4cK|jry||_|jdd|_|jdddi|d{|_|jj d{|j sd|_ tj|jj}|dk(rtjntj}|j|j|j |}|j!dd\|_ |_t#|j||j}|j%d{|j&}|J|j(}|J|dj!d |_|j*t,ur|jrd } nd } | |_t/|j*d |jd |j |_y77#t$rd}YVwxYw7w)Nsslhandler_cancellationTr)sock ssl_contextrhttpshttpz://:)rNrMpop_ssl _make_runnersetupr5 ipaddress ip_addressr-version ValueErrorr7AF_INET6rArJrCr'start_serversocketsrGrrrO) rQrHrKrer._socksiteserverrjrGs r2 start_serverzBaseTestServer.start_serverqs ;;  JJud+ -D--R4R6RR kk!!!yyDI **4995==G%,qLfnn##DIItyy&A$0022A6 49 %TYYGjjl!!!.."""AJ**,Q/ ;;( "yy  DKDKK=DII;a {CD 1S!  G  sVAH G0&H ,G3-H )G6.B!H HB!H 3H 6 HH HH c KywNr^rQrKs r2razBaseTestServer._make_runners  spathc|jJt|}|js-|jrJ|jj |Stt |jt |zSrp)rOrrI is_absolutejoinstr)rQrrurls r2make_urlzBaseTestServer.make_urlsczz%%%$i$$( ((::??3' 's4::T23 3r4c|jduSrp)rNrQs r2startedzBaseTestServer.starteds{{$&&r4c|jSrp)rPrzs r2closedzBaseTestServer.closed ||r4cV|j}|J|jJ|jSrp)rNrm)rQrNs r2handlerzBaseTestServer.handlers3!!!}}(((}}r4cK|jrS|jsF|jJ|jjd{d|_d|_d|_yyy7w)a`Close all fixtures created by the test client. After that point, the TestClient is no longer usable. This is an idempotent function: running close multiple times will not have any additional effects. close is also run when the object is garbage collected, and on exit when used as a context manager. NT)r{r}rNcleanuprOr5rPrzs r2closezBaseTestServer.closesZ << ;;* **++%%' ' 'DJDIDL !,< 'sAA%A#A%ctdNzUse async with instead TypeErrorrzs r2 __enter__zBaseTestServer.__enter__011r4exc_type exc_value tracebackcyrpr^rQrrrs r2__exit__zBaseTestServer.__exit__ r4cZK|j|jd{|S7wNrH)rnrMrzs r2 __aenter__zBaseTestServer.__aenter__s+TZZ000  1s +)+c@K|jd{y7wrprrs r2 __aexit__zBaseTestServer.__aexit__ jjl rpr/N)r/rF)'__name__ __module__ __qualname____test__rr1r rvobjectr asyncioAbstractEventLooprBboolrr7 AddressFamilyrrRrnrr#rar rrxpropertyr{r}r%rrrr BaseExceptionrrrrr^r4r2rFrFWsH &.48"!& -c6k"-w001 -  - sm --! #v++ ,fmm ; -- -0;?EW667EJME EB 3 :  4X4#4''' &2 4 ./ M* M*    4 ./M*M*   r4rFc ^eZdZeddddedeeefdedee de f fd Z de d e fd Z xZS) TestServerr@NrGr-r5apprGr-r5rKc :||_t|d|||d|yNrr^)rsuperrR)rQrrGr-r5rK __class__s r2rRzTestServer.__init__s% GTGGr4r/c6Kt|jfi|Swrp)r"rrqs r2razTestServer._make_runners,V,,s)rrrrr!r rvrr rBrrRr#ra __classcell__rs@r2rrsi &." H  Hc6k" H  H sm H H-3-:-r4rc heZdZeddddedeeefdedee de d df fd Z d d e de d e fd ZxZS) RawTestServerr@NrrrGr-r5rKr/c :||_t|d|||d|yr)_handlerrrR)rQrrGr-r5rKrs r2rRzRawTestServer.__init__s%   GTGGr4debugclKt|jf|j|d|}t|fd|i|Sw)N)rHrr)r%rrMr&)rQrrKsrvs r2razRawTestServer._make_runners9T]]K5KFKC7u777s24)T)rrrrr)r rvrr rBrrRrr&rarrs@r2rrs{ &." H  Hc6k" H  H sm H H  H88s8|8r4rc FeZdZdZdZddddedeedeejde d df d Z d'd Z e d efd Ze d eefd Ze d efdZe d eefdZe d efdZded efdZdedede d efdZdedede d efdZdede d efdZdede d efdZdede d efdZ dede d efdZ!dede d efdZ"dede d efdZ#dede d efdZ$dede d e%fdZ&dede d e'fdZ(d'dZ)d'd Z*d!ee+e,d"ee,d#ee-d dfd$Z.d(d%Z/d!ee+e,d"ee,d#ee-d dfd&Z0y)) TestClientzb A test client implementation. To write functional tests for aiohttp based servers. FN) cookie_jarrHrmrrHrKr/c t|tstdt|z||_||_|t jd|}td||d||_ d|_ g|_ g|_ y)Nz2server must be TestServer instance, found type: %rT)unsaferH)rHrFr^) isinstancerFrtyperirMaiohttp CookieJarr_sessionrP _responses _websockets)rQrmrrHrKs r2rRzTestClient.__init__ s{&.1G$v,V     **$TBJ%Q4JQ&Q  02:<r4clK|jj|jd{y7wr)rirnrMrzs r2rnzTestClient.start_servers%ll''TZZ'888s *424c.|jjSrp)rir-rzs r2r-zTestClient.host!||   r4c.|jjSrp)rir5rzs r2r5zTestClient.port%rr4c|jSrp)rirzs r2rmzTestClient.server)r~r4cZtttt|jddS)Nr)rr r!getattrrirzs r2rzTestClient.app-s!H[)74<<+MNNr4c|jS)zAn internal aiohttp.ClientSession. Unlike the methods on the TestClient, client session requests do not automatically include the host in the url queried, and will require an absolute path to the resource. )rrzs r2sessionzTestClient.session1s}}r4rrc8|jj|Srp)rirx)rQrrs r2rxzTestClient.make_url<s||$$T**r4methodcK|jj||j|fi|d{}|jj ||S7!wrp)rrequestrxrappend)rQrrrrKresps r2_requestzTestClient._request?sN+T]]**64==3FQ&QQ t$ Rs1AA"Ac <t|j||fi|S)zRoutes a request to tested http server. The interface is identical to aiohttp.ClientSession.request, except the loop kwarg is overridden by the instance used by the test server. )rr)rQrrrrKs r2rzTestClient.requestGs!&mdmmFD&KF&KLLr4c Xt|jtj|fi|S)zPerform an HTTP GET request.)rrrMETH_GETrQrrrKs r2getzTestClient.getS#%mdmmDMM4&R6&RSSr4c Xt|jtj|fi|S)zPerform an HTTP POST request.)rrr METH_POSTrs r2postzTestClient.postW#%mdmmDNND&SF&STTr4c Xt|jtj|fi|S)z Perform an HTTP OPTIONS request.)rrr METH_OPTIONSrs r2optionszTestClient.options[s%%mdmmD4E4Et&Vv&VWWr4c Xt|jtj|fi|S)zPerform an HTTP HEAD request.)rrr METH_HEADrs r2headzTestClient.head_rr4c Xt|jtj|fi|S)zPerform an HTTP PUT request.)rrrMETH_PUTrs r2putzTestClient.putcrr4c Xt|jtj|fi|SzPerform an HTTP PATCH request.)rrr METH_PATCHrs r2patchzTestClient.patchgs#%mdmmDOOT&TV&TUUr4c Xt|jtj|fi|Sr)rrr METH_DELETErs r2deletezTestClient.deleteks%%mdmmD4D4Dd&Uf&UVVr4c :t|j|fi|S)zjInitiate websocket connection. The api corresponds to aiohttp.ClientSession.ws_connect. )r _ws_connectrs r2 ws_connectzTestClient.ws_connectos" ((8(8(8(H(HIIr4cK|jj|j|fi|d{}|jj ||S7!wrp)rrrxrr)rQrrrKwss r2rzTestClient._ws_connectwsN,4==++DMM$,?J6J J # Ks0AA"Ac\K|js|jD]}|j|jD]}|jd{|jjd{|j jd{d|_yy7S717w)aHClose all fixtures created by the test client. After that point, the TestClient is no longer usable. This is an idempotent function: running close multiple times will not have any additional effects. close is also run on exit when used as a(n) (asynchronous) context manager. NT)rPrrrrri)rQrrs r2rzTestClient.close~s||   && !hhj   !--%%' ' ',,$$& & &DL! ' &s6AB,B&#B,6B(7!B,B*B,(B,*B,ctdrrrzs r2rzTestClient.__enter__rr4rexctbcyrpr^rQrrrs r2rzTestClient.__exit__rr4cBK|jd{|S7wrp)rnrzs r2rzTestClient.__aenter__s"!!!  "s c@K|jd{y7wrprrs r2rzTestClient.__aexit__rrr)r/r)1rrr__doc__rrFr rrrrrRrnrrvr-rBr5rmr!rrrr rrxrrrrrrrrrrrrrrrrrr rrrrrr^r4r2rrsH 3748 ==./ = w001 =  = =*9!c!!!hsm!!OXk*OO+X+#+!)58  M M!) M58 M  MTTCT4JTUUSU5KUXHXX8NXUUSU5KUTTCT4JTV(VcV6LVW8WsW7MWJxJ3J;SJ(+  *2 4 ./ m $  ] #    4 ./m $ ] #   r4rcheZdZdZdefdZdefdZddZddZddZ dd Z d ede fd Z d e de fd Zy)AioHTTPTestCaseaA base class to allow for unittest web applications using aiohttp. Provides the following: * self.client (aiohttp.test_utils.TestClient): an aiohttp test client. * self.loop (asyncio.BaseEventLoop): the event loop in which the application and server are running. * self.app (aiohttp.web.Application): the application returned by self.get_application() Note that the TestClient's methods are asynchronous: you have to execute function on the test client using asynchronous methods. r/c*K|jSw)zGet application. This method should be overridden to return the aiohttp.web.Application object to test. )get_apprzs r2get_applicationzAioHTTPTestCase.get_applications||~sctd)zqObsolete method used to constructing web application. Use .get_application() coroutine instead. z+Did you forget to define get_application()?) RuntimeErrorrzs r2rzAioHTTPTestCase.get_apps HIIr4NcpKtj|_|jd{S7wrp)rget_running_looprH setUpAsyncrzs r2 asyncSetUpzAioHTTPTestCase.asyncSetUps),,. __&&&&s -646c:K|jd{|_|j|jd{|_|j |jd{|_|j j d{y7|7V707 wrp)rr get_serverrm get_clientclientrnrzs r2rzAioHTTPTestCase.setUpAsyncsn--// OODHH55  OODKK88 kk&&((( 058(sCBB'BB'B&B'&B BBBBBc>K|jd{S7wrp) tearDownAsyncrzs r2 asyncTearDownzAioHTTPTestCase.asyncTearDowns''))))s cTK|jjd{y7wrp)r rrzs r2r zAioHTTPTestCase.tearDownAsyncskk!!!s (&(rc8Kt||jSw)zReturn a TestServer instance.r)rrH)rQrs r2rzAioHTTPTestCase.get_servers#DII..rmc8Kt||jSw)zReturn a TestClient instance.r)rrH)rQrms r2r zAioHTTPTestCase.get_clients&tyy11rr)rrrrr!rrrrr r rrrr r^r4r2rrs[ {JJ')*"/K/J/2z2j2r4rfuncargsrKc>tjdtd|S)zw A decorator dedicated to use with asynchronous AioHTTPTestCase test methods. In 3.8+, this does nothing. zBDecorator `@unittest_run_loop` is no longer needed in aiohttp 3.8+rX) stacklevel)warningswarnDeprecationWarning)rrrKs r2unittest_run_looprs  MML Kr4F loop_factoryfastc#DKt|}|t||yw)zzA contextmanager that creates an event_loop, for test purposes. Handles the creation and cleanup of a test loop. )rN)setup_test_loopteardown_test_loop)rrrHs r2 loop_contextrs! < (D Jt$'s c>|}tj||S)zCreate and return an asyncio.BaseEventLoop instance. The caller should also call teardown_test_loop, once they are done with the loop. )rset_event_loop)rrHs r2rrs >D 4 Kr4rHc|j}|s;|j|j|j|j |st j tjdy)z>Teardown and cleanup an event_loop created by setup_test_loop.N) is_closed call_soonstop run_foreverrgccollectrr!)rHrr}s r2rrsP ^^ F  tyy!    4 r4c"dtdtdtfd}dtdtdtddfd}tjt}i|_||_||_d|_t||_ |jj|S) Nrkeyr/c |j|Srp __app_dict)rr*s r2get_dictz"_create_app_mock..get_dicts~~c""r4valuec"||j|<yrpr,)rr*r/s r2set_dictz"_create_app_mock..set_dict"s#sr4)specF) rrvr MagicMockr!r- __getitem__ __setitem___debugron_response_preparefreeze)r.r1rs r2_create_app_mockr9s#c###$c$$C$D$ ..k *CCNCOCOCJ$SkC""$ Jr4 sslcontextctj}dtdttffd }||j _|S)Nr*r/c|dk(rSy)Nr:r^)r*r:s r2get_extra_infoz)_create_transport..get_extra_info3s ,  r4)rMockrvr r*r= side_effect)r: transportr=s` r2_create_transportrA0s< ICHZ$8 ,:I( r4i.) match_inforeclosingrwriterprotocolr@payloadr:client_max_sizerHrrrheadersrBrerCrrDrEr@rFrGc tj}| dur%tj} d| j_|t ddkrd}|r5t t |}td|jD}nt t }d}d|jtjdjv}t||||||dd |t| }| t}| t ur t#| } |t urtj}| |_|t ur[tj}t'd|_t'd|_t'd|_t'd|_| |_| |_||_| t urtj} t3|| |||| | }t5|t urin|tj}|j7|||_|S) zCreates mocked web.Request testing purposes. Useful in unit tests, when spinning full web server is overkill or specific conditions and errors are hard to trigger. .r^rTc3fK|])\}}|jd|jdf+yw)zutf-8N)encode).0kvs r2 z&make_mocked_request..]s0 7;q!QXXg  1 2 s/1chunkedNF)rG)rr> create_future return_valuerrrtupleitemsrrTRANSFER_ENCODINGlowerrrr9rrAr@make_mocked_coro write_headerswrite write_eofdrainrDr$r(add_app _match_info)rrrrHrBrerCrrDrEr@rFr:rGrHtaskraw_hdrsrPmessagereqs r2make_mocked_requestrc=s, 99;D s{yy{*,'Q""";w#78 ?F}}  #;=17;;t'='=rBHHJJG    D  G { H%j1 899;& /5'- +D1'- $"HHO())+ (FD$ C%H$*diikJs CO Jr4rSraise_exceptioncddtdtdtffd }tj|S)zCreates a coroutine mock.rrKr/chKturtjsSd{y7wrp)rinspect isawaitable)rrKrdrSs r2 mock_coroz#make_mocked_coro..mock_coros2 ( *! !""<0 s '202)wraps)rrr>)rSrdris`` r2rXrXs. scc 999 %%r4)Frp)arr contextlibr'rgrcosr7sysrabcrrtypesrtypingrrrr r r r r runittestrr aiosignalr multidictrryarlrraiohttp.clientrrrQrrr client_reqrepr client_wsrhelpersrr\rrtypedefsr webr!r"r#r$r%r&r'r( web_protocolr)rTr*nameplatformr9rArvrr3rBr1rDrFrrrrrr _LOOP_FACTORYcontextmanagernew_event_looprrrrr3r9r>rArcrXr^r4r2rsA   #   33K!").0   *J7"?s||x'? /5nn, ,++, ]],      "("6"6   ]]  -S-BSBJ--"8N8$jjZ62-62r C  s s W6667  ")"8"8u ( (@D ( g''( ( (#*"8"8     !W66 !d !t !$..$ (:"6 $))  W &q!,'+"W W WW  W  WW W WWWW$WW W  !Wv! & &36 & &r4