B `O@s dZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl m Z m Z ddl mZddlmZmZmZmZmZmZmZmZddl mZddlmZmZddlmZddlZdd lm Z m!Z!m"Z"d d l#m$Z$m%Z%d d l m&Z&d d l'm Z d dl(m)Z)d dl*m+Z+d dl,m-Z-m.Z.d dl/m0Z0d dl1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9d dl:m;Z;erxddldkoej?dkZ@eAejdddZBeAeCejdddZDeCdddZEGd d!d!e ZFGd"d#d#eFZGGd$d%d%eFZHGd&d'd'ZIGd(d)d)e jJZKeeeed*d+d,ZLegejMfZNejOejPd-feNeQeejMd.d/d0ZRejPfeNejMd1d2d3ZSdEejMeQdd4d5d6ZTejUdd7d8ZVdFee=ejWd9d:d;ZXdGe+e-d d d-de+e+e+e+dd eAeAeee-eQeeeeeee=eCee5d?d@dAZYe+e+feeedBdCdDZZdS)HzUtilities shared by tests.N)ABCabstractmethod) TracebackType) TYPE_CHECKINGAnyCallableIteratorListOptionalTypeUnion)mock) CIMultiDictCIMultiDictProxy)URL)ClientResponse_RequestContextManager_WSRequestContextManager) ClientSessionhdrs)AbstractCookieJar)r)ClientWebSocketResponse)sentinel) HttpVersionRawRequestMessage)Signal) Application AppRunner BaseRunnerRequestServer ServerRunnerSockSiteUrlMappingMatchInfo)_RequestHandler) SSLContextposixcygwin)hostreturncCs t|dS)Nr)get_port_socket)r)r,m/private/var/folders/7j/8686xlfs15q3tgljmghtvg0r0000gn/T/pip-target-isidps9b/lib/python/aiohttp/test_utils.pyget_unused_port_socket7sr.)r)portr*cCs8ttjtj}tr&|tjtjd|||f|S)Nr)socketAF_INET SOCK_STREAM REUSE_ADDRESS setsockopt SOL_SOCKET SO_REUSEADDRbind)r)r/sr,r,r-r+;s r+)r*c Cs2ttjtj}|d|dSQRXdS)z1Return a port that is unused on the current host.)z 127.0.0.1rrN)r0r1r2r7 getsockname)r8r,r,r- unused_portFs r:c @s0eZdZdZedddddeeefee j eee e e ddddZd#ee j e ddd d Zee ed d d ZeedddZee dddZee dddZeedddZddddZddddZeeeeeeeddddZdddd Z eeeeeeeddd!d"Z!dS)$BaseTestServerFNz 127.0.0.1)schemeloopr)r/skip_url_asserts)r<r=r)r/r>kwargsr*cKs4||_d|_d|_||_||_d|_||_||_dS)NF)_looprunner_rootr)r/_closedr<r>)selfr<r=r)r/r>r?r,r,r-__init__Ps zBaseTestServer.__init__)r=r?r*cs|jr dS||_|dd|_|jf|IdH|_|jIdH|jsNd|_t|j|j}| dd\|_|_t |j||jd}| IdH|j }|dk st |j}|dk st |d d|_|jtkr|jrd}nd}||_t|jd|jd |j|_dS) Nsslr)sock ssl_contextrhttpshttpz://:)rAr@pop_ssl _make_runnersetupr/r+r)r9r#start_serverAssertionErrorsocketsr<rrrB)rDr=r?_socksiteserverrTr<r,r,r- start_servercs.   zBaseTestServer.start_server)r?r*csdS)Nr,)rDr?r,r,r-rOszBaseTestServer._make_runner)pathr*cCsJ|jdk stt|}|js4|r(t|j|Stt|j|SdS)N)rBrSrr> is_absolutejoinstr)rDrYurlr,r,r-make_urls   zBaseTestServer.make_url)r*cCs |jdk S)N)rA)rDr,r,r-startedszBaseTestServer.startedcCs|jS)N)rC)rDr,r,r-closedszBaseTestServer.closedcCs&|j}|dk st|jdk s t|jS)N)rArSrW)rDrAr,r,r-handlers zBaseTestServer.handlercs@|jr<|js<|jdk st|jIdHd|_d|_d|_dS)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`rArScleanuprBr/rC)rDr,r,r-closes zBaseTestServer.closecCs tddS)NzUse async with instead) TypeError)rDr,r,r- __enter__szBaseTestServer.__enter__)exc_type exc_value tracebackr*cCsdS)Nr,)rDrfrgrhr,r,r-__exit__szBaseTestServer.__exit__cs|j|jdIdH|S)N)r=)rXr@)rDr,r,r- __aenter__szBaseTestServer.__aenter__cs|IdHdS)N)rc)rDrfrgrhr,r,r- __aexit__szBaseTestServer.__aexit__)N)"__name__ __module__ __qualname____test__rr r\objectr asyncioAbstractEventLoopintboolrrErXrrrOrr^propertyr_r`r!rarcrer BaseExceptionrrirjrkr,r,r,r-r;Ms<"    r;csPeZdZedddeeeefeee e dfddZ e e ddd Z ZS) TestServerz 127.0.0.1N)r<r)r/)appr<r)r/r?c s$||_tjf|||d|dS)N)r<r)r/)rxsuperrE)rDrxr<r)r/r?) __class__r,r-rEs zTestServer.__init__)r?r*cst|jf|S)N)rrx)rDr?r,r,r-rOszTestServer._make_runner)rlrmrnrrr r\rpr rsrrErrO __classcell__r,r,)rzr-rws rwcsVeZdZedddeeeefeee e ddfddZ d e e e dd d ZZS) RawTestServerz 127.0.0.1N)r<r)r/)rar<r)r/r?r*c s$||_tjf|||d|dS)N)r<r)r/)_handlerryrE)rDrar<r)r/r?)rzr,r-rEs zRawTestServer.__init__T)debugr?r*cs.t|jf|j|d|}t|fd|i|S)N)r=r~r~)r!r}r@r")rDr~r?Zsrvr,r,r-rOszRawTestServer._make_runner)T)rlrmrnrr%r r\rpr rsrrErtr"rOr{r,r,)rzr-r|s r|c@seZdZdZdZdddeeeeej e ddddZ ddd d Z e edd d Ze eedd dZe edddZe edddZe edddZeedddZeee edddZeee edddZee edddZee edd d!Zee edd"d#Zee edd$d%Z ee edd&d'Z!ee edd(d)Z"ee edd*d+Z#ee e$dd,d-Z%ee e&dd.d/Z'ddd0d1Z(ddd2d3Z)ee*e+ee+ee,dd4d5d6Z-ddd7d8Z.ee*e+ee+ee,dd4d9d:Z/dS); TestClientzb A test client implementation. To write functional tests for aiohttp based servers. FN) cookie_jarr=)rWrr=r?r*cKsht|tstdt|||_||_|dkr.new_func) functoolswrapsr)rrr?rr,)rr-unittest_run_loopsrF) loop_factoryfastr*ccst|}|Vt||ddS)zzA contextmanager that creates an event_loop, for test purposes. Handles the creation and cleanup of a test loop. )rN)rr)rrr=r,r,r- loop_contextsr)rr*c Cs|}y|jj}d|k}Wntk r2d}YnXt|tjdkr|st}t}| |t t | |WdQRX|S)zCreate and return an asyncio.BaseEventLoop instance. The caller should also call teardown_test_loop, once they are done with the loop. ZuvloopTwin32N)rzrmAttributeErrorrqset_event_loopsysplatformZget_event_loop_policyZSafeChildWatcherZ attach_loop contextlibsuppressNotImplementedErrorZset_child_watcher)rr=moduleZ skip_watcherpolicyZwatcherr,r,r-rs      r)r=rr*cCsB|}|s(||j|||s4ttddS)zHTeardown and cleanup an event_loop created by setup_test_loop. N) Z is_closedZ call_soonstopZ run_foreverrcgcZcollectrqr)r=rr`r,r,r-r s rcCs^tttddd}tttdddd}t}i|_||_||_d|_t||_ |j |S)N)rxkeyr*cSs |j|S)N) __app_dict)rxrr,r,r-get_dictsz"_create_app_mock..get_dict)rxrvaluer*cSs||j|<dS)N)r)rxrrr,r,r-set_dict!sz"_create_app_mock..set_dictF) rr\r MagicMockr __getitem__ __setitem___debugrZon_response_preparefreeze)rrrxr,r,r-_create_app_mocks  r) sslcontextr*cs,t}tttdfdd }||j_|S)N)rr*cs|dkr SdSdS)Nrr,)r)rr,r-get_extra_info2sz)_create_transport..get_extra_info)r Mockr\r r&rZ side_effect)r transportrr,)rr-_create_transport/sri.) match_infoversionclosingrxwriterprotocolrpayloadrclient_max_sizer=)rrYheadersrrrrxrrrrrrr=r*c  Cstt}| dkr t} d| j_|tddkr2d}|rZtt|}tdd|D}ntt}d}d| t j d k}t ||||||d d |t| }|d krt}| tkrt| } |tkrt}| |_|tkrt}td |_td |_td |_td |_| |_| |_||_| tkr.t} t|| |||| | d }t|tkrTin|t}||||_|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,rTcss&|]\}}|d|dfVqdS)zutf-8N)encode).0kvr,r,r- _sz&make_mocked_request..chunkedFN)r)r rZ create_future return_valuerrrtupleitemsrrZTRANSFER_ENCODINGlowerrrrrrrmake_mocked_coroZ write_headerswrite write_eofZdrainrr r$Zadd_appZ _match_info)rrYrrrrrxrrrrrrr=ZtaskZraw_hdrsrmessagereqr,r,r-make_mocked_request<sb          r)rraise_exceptionr*cs$tttdfdd }tj|dS)zCreates a coroutine mock.)rr?r*cs(tk r tsSIdHdS)N)rinspect isawaitable)rr?)rrr,r- mock_coros  z#make_mocked_coro..mock_coro)r)rr r)rrrr,)rrr-rsr)F)N)N)[rrqrrrrosr0rZunittestabcrrtypesrtypingrrrrr r r r r Z multidictrrZyarlrrZaiohttp.clientrrrrrrrZ client_reqrepZ client_wsrZhelpersrrKrrZsignalsrZwebrrrr r!r"r#r$Z web_protocolr%rFr&namerr3r\r.rsr+r:r;rwr|rZTestCaserrrrZ _LOOP_FACTORYcontextmanagerZnew_event_looprtrrrrrrrrrr,r,r,r-s (       (  |(@  &M