grthtrhthjhtyjytjytkergtrhtrjytjerhrfh3 \ó:ã @sdZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddl mZddlmZddlmZmZy ddlZWnek rÀdZYnXddlmZddlmZdd lmZdd lmZdd lmZdd lmZdd lmZddl m!Z!ddl"m#Z#e j$dk�rHddl%m&Z&n ddlm&Z&dd„Z'e'dƒZ(e'dƒZ)dd„Z*dd„Z+dRdd„Z,dd„Z-Gdd „d eƒZ.Gd!d"„d"eƒZ/Gd#d$„d$ƒZ0Gd%d&„d&e0e/ƒZ1d'd(œd)d*„Z2e3ed+ƒ�rZGd,d-„d-ej4eƒZ5Gd.d/„d/e5eƒZ6Gd0d1„d1e6ƒZ7Gd2d3„d3e0e7ƒZ8d4d5„Z9ej:d6d7„ƒZ;ej:d'd(œd8d9„ƒZd?„Z>Gd@dA„dAej?ƒZ@GdBdC„dCejAƒZBdDdE„ZCGdFdG„dGeDƒZEdHdI„ZFGdJdK„dKe jGƒZGej:dLdM„ƒZHejIejJejKfdNdO„ZLdPdQ„ZMdS)SzUtilities shared by tests.éN)Úmock)Ú HTTPServer)ÚWSGIRequestHandlerÚ WSGIServeré)Ú base_events)Úcompat)Úevents)Úfutures)Ú selectors)Útasks)Ú coroutine)Úlogger)ÚsupportZwin32)Ú socketpaircCs`ttdƒr*tjjtj|ƒ}tjj|ƒr*|Stjjtjjtjƒd|ƒ}tjj|ƒrT|St |ƒ‚dS)NÚ TEST_HOME_DIRÚtest) ÚhasattrrÚosÚpathÚjoinrÚisfileÚdirnameÚ__file__ÚFileNotFoundError)ÚfilenameÚfullname©rú*/usr/lib64/python3.6/asyncio/test_utils.pyÚ data_file-s   rz ssl_cert.pemz ssl_key.pemcCstdkr dStjtjƒSdS)N)ÚsslÚ SSLContextZPROTOCOL_SSLv23rrrrÚdummy_ssl_context<sr"c Cs@tdd„ƒ}|ƒ}|j|ƒ}d|_z|j|ƒWd|jƒXdS)NcSsdS)NrrrrrÚonceDszrun_briefly..onceF)r Z create_taskZ_log_destroy_pendingÚrun_until_completeÚclose)Úloopr#ÚgenÚtrrrÚ run_brieflyCs  r)écCsTtjƒ|}xB|ƒsN|dk r8|tjƒ}|dkr8tjƒ‚|jtjd|d�ƒqWdS)Nrgü©ñÒMbP?)r&)Útimer Ú TimeoutErrorr$r Zsleep)r&ZpredÚtimeoutZdeadlinerrrÚ run_untilRs  r.cCs|j|jƒ|jƒdS)zÊLegacy 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)Z call_soonÚstopZ run_forever)r&rrrÚrun_once\s r0c@seZdZdd„Zdd„ZdS)ÚSilentWSGIRequestHandlercCstjƒS)N)ÚioÚStringIO)ÚselfrrrÚ get_stderrisz#SilentWSGIRequestHandler.get_stderrcGsdS)Nr)r4ÚformatÚargsrrrÚ log_messagelsz$SilentWSGIRequestHandler.log_messageN)Ú__name__Ú __module__Ú __qualname__r5r8rrrrr1gsr1cs(eZdZdZ‡fdd„Zdd„Z‡ZS)ÚSilentWSGIServerécs"tƒjƒ\}}|j|jƒ||fS)N)ÚsuperÚ get_requestÚ settimeoutÚrequest_timeout)r4ÚrequestÚ client_addr)Ú __class__rrr?ts zSilentWSGIServer.get_requestcCsdS)Nr)r4rBÚclient_addressrrrÚ handle_erroryszSilentWSGIServer.handle_error)r9r:r;rAr?rFÚ __classcell__rr)rDrr<ps r<c@seZdZdd„ZdS)ÚSSLWSGIServerMixinc Cs^t}t}tjƒ}|j||ƒ|j|dd�}y|j|||ƒ|jƒWntk rXYnXdS)NT)Z server_side) ÚONLYKEYÚONLYCERTr r!Zload_cert_chainZ wrap_socketZRequestHandlerClassr%ÚOSError)r4rBrEZkeyfileZcertfileÚcontextZssockrrrÚfinish_requests  z!SSLWSGIServerMixin.finish_requestN)r9r:r;rMrrrrrH}srHc@s eZdZdS)Ú SSLWSGIServerN)r9r:r;rrrrrN’srNF)Úuse_sslc #svdd„}|r|n|}||tƒ‰ˆj|ƒˆjˆ_tj‡fdd„d�}|jƒz ˆVWdˆjƒˆjƒ|j ƒXdS)NcSsd}dg}|||ƒdgS)Nz200 OKú Content-typeú text/plains Test message)rPrQr)ÚenvironZstart_responseZstatusZheadersrrrÚapp˜s z_run_test_server..appcs ˆjdd�S)Ngš™™™™™©?)Z poll_interval)Z serve_foreverr)ÚhttpdrrÚ¥sz"_run_test_server..)Útarget) r1Zset_appZserver_addressÚaddressÚ threadingZThreadÚstartÚshutdownZ server_closer)rWrOÚ server_clsÚserver_ssl_clsrSZ server_classZ server_threadr)rTrÚ_run_test_server–s    r]ZAF_UNIXc@seZdZdd„ZdS)ÚUnixHTTPServercCstjj|ƒd|_d|_dS)Nz 127.0.0.1éP)Ú socketserverÚUnixStreamServerÚ server_bindZ server_nameZ server_port)r4rrrrb³s zUnixHTTPServer.server_bindN)r9r:r;rbrrrrr^±sr^cs(eZdZdZdd„Z‡fdd„Z‡ZS)ÚUnixWSGIServerr=cCstj|ƒ|jƒdS)N)r^rbZ setup_environ)r4rrrrb½s zUnixWSGIServer.server_bindcs"tƒjƒ\}}|j|jƒ|dfS)Nú 127.0.0.1Ú)rdre)r>r?r@rA)r4rBrC)rDrrr?Ás zUnixWSGIServer.get_request)r9r:r;rArbr?rGrr)rDrrc¹srcc@seZdZdd„ZdS)ÚSilentUnixWSGIServercCsdS)Nr)r4rBrErrrrFÏsz!SilentUnixWSGIServer.handle_errorN)r9r:r;rFrrrrrfÍsrfc@s eZdZdS)ÚUnixSSLWSGIServerN)r9r:r;rrrrrgÓsrgc Cstjƒ�}|jSQRXdS)N)ÚtempfileZNamedTemporaryFileÚname)ÚfilerrrÚgen_unix_socket_path×s rkccs<tƒ}z |VWdytj|ƒWntk r4YnXXdS)N)rkrÚunlinkrK)rrrrÚunix_socket_pathÜs rmc cs,tƒ�}t||ttd�EdHWdQRXdS)N)rWrOr[r\)rmr]rfrg)rOrrrrÚrun_test_unix_serverèsrnz 127.0.0.1)ÚhostÚportrOccst||f|ttd�EdHdS)N)rWrOr[r\)r]r<rN)rorprOrrrÚrun_test_serverðs rqcCsPi}x4t|ƒD](}|jdƒr(|jdƒr(qtdd�||<qWtd|f|j|ƒƒS)NÚ__)Ú return_valueZ TestProtocol)ÚdirÚ startswithÚendswithÚ MockCallbackÚtypeÚ __bases__)ÚbaseZdctrirrrÚmake_test_protocol÷s r{c@s6eZdZdd„Zd dd„Zdd„Zdd „Zd d „ZdS) Ú TestSelectorcCs i|_dS)N)Úkeys)r4rrrÚ__init__szTestSelector.__init__NcCstj|d||ƒ}||j|<|S)Nr)r Z SelectorKeyr})r4Úfileobjr ÚdataÚkeyrrrÚregisters zTestSelector.registercCs |jj|ƒS)N)r}Úpop)r4rrrrÚ unregister szTestSelector.unregistercCsgS)Nr)r4r-rrrÚselectszTestSelector.selectcCs|jS)N)r})r4rrrÚget_mapszTestSelector.get_map)N)r9r:r;r~r‚r„r…r†rrrrr|s  r|csÎeZdZdZd-‡fdd„ Zdd„Zdd„Z‡fd d „Zd d „Zd d„Z dd„Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„Zdd„Zdd „Zd!d"„Zd#d$„Z‡fd%d&„Z‡fd'd(„Zd)d*„Zd+d,„Z‡ZS).Ú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. Ncsvtƒjƒ|dkr"dd„}d|_nd|_|ƒ|_t|jƒd|_d|_g|_tƒ|_ i|_ i|_ |j ƒt jƒ|_dS)Ncss dVdS)Nrrrrrr',szTestLoop.__init__..genFTrg•Ö&è .>)r>r~Ú_check_on_closeÚ_genÚnextÚ_timeZ_clock_resolutionÚ_timersr|Z _selectorÚreadersÚwritersÚreset_countersÚweakrefÚWeakValueDictionaryÚ _transports)r4r')rDrrr~(s  zTestLoop.__init__cCs|jS)N)r‹)r4rrrr+?sz TestLoop.timecCs|r|j|7_dS)zMove test time forward.N)r‹)r4ÚadvancerrrÚ advance_timeBszTestLoop.advance_timec sBtƒjƒ|jr>y|jjdƒWntk r4Yn Xtdƒ‚dS)NrzTime generator is not finished)r>r%rˆr‰ÚsendÚ StopIterationÚAssertionError)r4)rDrrr%Gs zTestLoop.closecGstj|||ƒ|j|<dS)N)r ÚHandler�)r4ÚfdÚcallbackr7rrrÚ _add_readerQszTestLoop._add_readercCs0|j|d7<||jkr(|j|=dSdSdS)NrTF)Úremove_reader_countr�)r4r™rrrÚ_remove_readerTs  zTestLoop._remove_readercGsh||jkrtd|›d�ƒ‚|j|}|j|krDtd|j›d|›�ƒ‚|j|krdtd|j›d|›�ƒ‚dS)Nzfd z is not registeredzunexpected callback: z != zunexpected callback args: )r�r—Ú _callbackÚ_args)r4r™ršr7ÚhandlerrrÚ assert_reader\s    zTestLoop.assert_readercCs||jkrtd|›d�ƒ‚dS)Nzfd z is registered)r�r—)r4r™rrrÚassert_no_readergs zTestLoop.assert_no_readercGstj|||ƒ|j|<dS)N)r r˜rŽ)r4r™ršr7rrrÚ _add_writerkszTestLoop._add_writercCs0|j|d7<||jkr(|j|=dSdSdS)NrTF)Úremove_writer_countrŽ)r4r™rrrÚ_remove_writerns  zTestLoop._remove_writercGs^||jkstdj|ƒƒ‚|j|}|j|ks>tdj|j|ƒƒ‚|j|ksZtdj|j|ƒƒ‚dS)Nzfd {} is not registeredz {!r} != {!r})rŽr—r6ržrŸ)r4r™ršr7r rrrÚ assert_writervs   zTestLoop.assert_writerc Cs8y|j|}Wntk r"YnXtdj||ƒƒ‚dS)Nz.File descriptor {!r} is used by transport {!r})r’ÚKeyErrorÚ RuntimeErrorr6)r4r™Z transportrrrÚ_ensure_fd_no_transport~sz TestLoop._ensure_fd_no_transportcGs|j|ƒ|j||f|žŽS)zAdd a reader callback.)r©r›)r4r™ršr7rrrÚ add_readerˆs zTestLoop.add_readercCs|j|ƒ|j|ƒS)zRemove a reader callback.)r©r�)r4r™rrrÚ remove_reader�s zTestLoop.remove_readercGs|j|ƒ|j||f|žŽS)zAdd a writer callback..)r©r£)r4r™ršr7rrrÚ add_writer’s zTestLoop.add_writercCs|j|ƒ|j|ƒS)zRemove a writer callback.)r©r¥)r4r™rrrÚ remove_writer—s zTestLoop.remove_writercCstjtƒ|_tjtƒ|_dS)N)Ú collectionsÚ defaultdictÚintrœr¤)r4rrrr�œs zTestLoop.reset_counterscs:tƒjƒx$|jD]}|jj|ƒ}|j|ƒqWg|_dS)N)r>Ú _run_oncerŒr‰r•r”)r4Úwhenr“)rDrrr± s    zTestLoop._run_oncecs |jj|ƒtƒj||f|žŽS)N)rŒÚappendr>Úcall_at)r4r²ršr7)rDrrr´§s zTestLoop.call_atcCsdS)Nr)r4Z event_listrrrÚ_process_events«szTestLoop._process_eventscCsdS)Nr)r4rrrÚ_write_to_self®szTestLoop._write_to_self)N)r9r:r;Ú__doc__r~r+r”r%r›r�r¡r¢r£r¥r¦r©rªr«r¬r­r�r±r´rµr¶rGrr)rDrr‡s,     r‡cKstjfddgi|—ŽS)NÚspecÚ__call__)rZMock)Úkwargsrrrrw²srwc@seZdZdZdd„ZdS)Ú MockPatternzõA 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')) cCsttjt|ƒ|tjƒƒS)N)ÚboolÚreÚsearchÚstrÚS)r4ÚotherrrrÚ__eq__¿szMockPattern.__eq__N)r9r:r;r·rÂrrrrr»¶sr»cCs$tj|ƒ}|dkr td|fƒ‚|S)Nzunable to get the source of %r)r Z_get_function_sourceÚ ValueError)ÚfuncÚsourcerrrÚget_function_sourceÃs rÆc@sVeZdZedd„ƒZddœdd„Zddd „Zd d „Zd d „Zdd„Z e j sRdd„Z dS)ÚTestCasecCs&|j}|dk r|jdd�|jƒdS)NT)Úwait)Z_default_executorrZr%)r&ZexecutorrrrÚ close_loopËs zTestCase.close_loopT)ÚcleanupcCs,|dk s t‚tjdƒ|r(|j|j|ƒdS)N)r—r Úset_event_loopZ addCleanuprÉ)r4r&rÊrrrrËÒs  zTestCase.set_event_loopNcCst|ƒ}|j|ƒ|S)N)r‡rË)r4r'r&rrrÚ new_test_loopÙs zTestCase.new_test_loopcCs |jt_dS)N)Ú_get_running_loopr )r4rrrÚunpatch_get_running_loopÞsz!TestCase.unpatch_get_running_loopcCs tj|_dd„t_tjƒ|_dS)NcSsdS)NrrrrrrUãsz TestCase.setUp..)r rÍrZthreading_setupÚ_thread_cleanup)r4rrrÚsetUpás zTestCase.setUpcCsB|jƒtjdƒ|jtjƒdƒ|jƒtj|j Žtj ƒdS)N)NNN) rÎr rËZ assertEqualÚsysÚexc_infoZ doCleanupsrZthreading_cleanuprÏZ reap_children)r4rrrÚtearDownæs   zTestCase.tearDowncOsGdd„dƒ}|ƒS)Nc@seZdZdd„Zdd„ZdS)z!TestCase.subTest..EmptyCMcSsdS)Nr)r4rrrÚ __enter__÷sz+TestCase.subTest..EmptyCM.__enter__cWsdS)Nr)r4ÚexcrrrÚ__exit__ùsz*TestCase.subTest..EmptyCM.__exit__N)r9r:r;rÔrÖrrrrÚEmptyCMösr×r)r4r7rºr×rrrÚsubTestõszTestCase.subTest)N) r9r:r;Ú staticmethodrÉrËrÌrÎrÐrÓrZPY34rØrrrrrÇÊs   rÇc cs2tj}ztjtjdƒdVWdtj|ƒXdS)zrContext manager to disable asyncio logger. For example, it can be used to ignore warnings in debug mode. rN)rÚlevelZsetLevelÚloggingZCRITICAL)Z old_levelrrrÚdisable_loggerþs  rÜcCs*tjtjƒ}||_||_||_d|j_|S)z'Create a mock of a non-blocking socket.g)rZ MagicMockÚsocketÚprotorxÚfamilyZ gettimeoutrs)rÞrxrßZsockrrrÚmock_nonblocking_socket s  ràcCstjddd�S)Nz'asyncio.sslproto._is_sslproto_availableF)rs)rZpatchrrrrÚforce_legacy_ssl_supportsrá)r*)Nr·r®Ú contextlibr2rÛrr½rÝr`rÑrhrXr+Zunittestr�rZ http.serverrZwsgiref.simple_serverrrr Ú ImportErrorrerrr r r r Z coroutinesr ÚlogrrrÚplatformZ windows_utilsrrrJrIr"r)r.r0r1r<rHrNr]rrar^rcrfrgrkÚcontextmanagerrmrnrqr{Z BaseSelectorr|Z BaseEventLoopr‡rwr¿r»rÆrÇrÜZ IPPROTO_TCPZ SOCK_STREAMZAF_INETràrárrrrÚsˆ                        4