o EhsD@sbddlZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl m Z m Z mZmZddlmZddlmZddlmZddlmZddlmZmZmZmZmZmZmZddl m!Z!dd l"m#Z#m$Z$d Z%e%eksxJd Z&e&e%ksJd Z'e(ed oe(ed Z)dedede*fddZ+de,ee-ffddZ.de-dedej/fddZ0dede-de fddZ1GdddZ2Gddde Z3e-Z4e,ede3fe,ed e4fBZ5Gd!d"d"e6Z7Gd#d$d$ej8Z9d%e:e9de:e9fd&d'Z;Gd(d)d)ZZ?d/e@e-efdee@e-efBfd0d1ZAdeBeCefd2d3ZDdS)4N) NamedTupleNoReturnLiteralAny)support) os_helper) Namespace)Regrtest)runtest is_failed TestResult InterruptedTimeout ChildErrorPROGRESS_MIN_TIME) setup_tests)format_duration print_warningg>@gr@setsidkillpgresultnsreturncCs&t|trdS|jrt||rdSdS)NTF) isinstancer failfastr )rrr2/usr/lib/python3.10/test/libregrtest/runtest_mp.py must_stop)s rcCs$t|\}}tdi|}||fS)Nr)jsonloadsr) worker_argsns_dict test_namerrrrparse_worker_args1sr#testnamecCsxt|}||f}t|}tjgtdddd|}i}tr'd|d<tj |ftj tj dt j dkt jd|S) Nz-uz-mz test.regrtestz --worker-argsTstart_new_sessionnt)stdoutstderruniversal_newlines close_fdscwd)varsrdumpssys executablerargs_from_interpreter_flagsUSE_PROCESS_GROUP subprocessPopenPIPEosnamerSAVEDCWD)r$rr!r cmdkwrrrrun_test_in_subprocess7s4 r:r"cCs<t|t||}tttj|tdddtddS)N)clsTflushr)rr printrr-EncodeTestResultr.exit)rr"rrrrrun_tests_workerPs  rAc@s0eZdZdZddZddZddZdd Zd S) MultiprocessIteratorz8A thread-safe iterator over tests for multiprocess mode.cCst|_||_dSN) threadingLocklock tests_iter)selfrGrrr__init__as  zMultiprocessIterator.__init__cCs|SrCrrHrrr__iter__eszMultiprocessIterator.__iter__cCsB|j|jdur tt|jWdS1swYdSrC)rFrG StopIterationnextrJrrr__next__hs  $zMultiprocessIterator.__next__cCs2|j d|_WddS1swYdSrC)rFrGrJrrrstopns"zMultiprocessIterator.stopN)__name__ __module__ __qualname____doc__rIrKrNrOrrrrrB]s  rBc@s.eZdZUeed<eed<eed<eed<dS)MultiprocessResultrr'r( error_msgN)rPrQrRr __annotations__strrrrrrTss  rTFTc@s eZdZdS) ExitThreadN)rPrQrRrrrrrX~srXc seZdZdeddddffdd Zdefdd Zd d d Zd d d Z   d!de dedede fddZ dede eeeffddZ dede fddZd ddZd ddZdeddfddZZS)"TestWorkerProcess worker_idrunnerMultiprocessTestRunnerrNcsZt||_|j|_|j|_|j|_|j|_|j|_d|_ d|_ d|_ d|_ d|_ dS)NF)superrIrZpendingoutputrworker_timeouttimeoutregrtestcurrent_test_name start_time_popen_killed_stopped)rHrZr[ __class__rrrIs  zTestWorkerProcess.__init__cCsd|jg}|r|dn|d|j}|r#|d||j}|durBt|j}|d|jj dt |fdd |S) NzTestWorkerProcess #runningstoppedztest=zpid=ztime=z<%s> ) rZis_aliveappendrcretime monotonicrdextendpidrjoin)rHinfotestpopendtrrr__repr__s   zTestWorkerProcess.__repr__c Cs|j}|dur dS|jrdSd|_tr|d}n|}td|tjddztr5t|jt j WdS| WdSt yEYdSt ya}ztd|d|WYd}~dSd}~ww)NTz process groupzKill filer=zFailed to kill z: )rerfr1r>r.r(r5rrrsignalSIGKILLkillProcessLookupErrorOSErrorr)rHrvwhatexcrrr_kills(  "zTestWorkerProcess._killcCsd|_|dS)NT)rgrrJrrrrOs zTestWorkerProcess.stop test_resultr'r(cCst|j|_t||||SrC)rorprd duration_secrT)rHrr'r(err_msgrrrmp_result_errorsz!TestWorkerProcess.mp_result_errorr"cCst|_||_zt||j}d|_||_Wnd|_zez\|jr)| t z|j |j d\}}|j }|dus{sz8MultiprocessTestRunner.start_workers..zRun tests in parallel using z child processesz" (timeout: %s, worker timeout: %s)) rangeruse_mprlenrarr`rstart)rHmsgrrrJr start_workerszs     z$MultiprocessTestRunner.start_workerscCs6t}|jD]}|q|jD]}||qdSrC)rorprrOr)rHrdrrrr stop_workerss     z#MultiprocessTestRunner.stop_workerscCs|jjdu}t}tdd|jDrM|rtjtddz|jj |dWSt j y-Ynwt |j}|rC|jj sC|dd|tdd|jDsz|jj ddWSt j y`YdSw) Ncss|]}|VqdSrC)rm)rrrrr sz5MultiprocessTestRunner._get_result..T)r@rz running: %s, r)rraPROGRESS_UPDATEanyr faulthandlerdump_traceback_laterMAIN_PROCESS_TIMEOUTr_getrEmptyrpgorrs)rHuse_faulthandlerrarjrrr _get_results*   z"MultiprocessTestRunner._get_resultrcCs|j}t|}|jdur|d|j7}n|jtkr&|jjs&|dt|j7}t|j }|r:|jjs:|dd |7}|j |j |dS)Nz (%s)z -- running: %sr)rrWrUrrrrrrrrsrbdisplay_progress test_index)rHrrrrjrrrdisplay_results   z%MultiprocessTestRunner.display_resultitemcCs|dr|d}td|dS|jd7_|d}|j|j|||jr2t|jdd|jrB|j j sBt|jt jddt |j|j rKdSdS)z&Returns True if test runner must stop.rrzregrtest worker thread failed: Tr<ryF) rrrbaccumulate_resultrrr'r>r(rrr.r)rHrrrrrr_process_results z&MultiprocessTestRunner._process_resultcCs|d|_zrb interruptedrrarcancel_dump_traceback_laterr^rOr)rHrrOrrr run_testss2         z MultiprocessTestRunner.run_testsr)rPrQrRr rIrr QueueOutputrrTrboolrrrrrrr\is  r\rbcCst|dSrC)r\r)rbrrrrun_tests_multiprocesssrcs2eZdZdZdedeeefffdd ZZS)r?z7Encode a TestResult (sub)class object into a JSON dict.orcs.t|trt|}|jj|d<|St|S)N__test_result__)rr r,rirPr]default)rHrrrhrrrs   zEncodeTestResult.default) rPrQrRrSrdictrWrrrrrhrr?s&r?dcCsBd|vr|S|d}tD]}|j|kr|di|SqdS)z7Decode a TestResult (sub)class object from a JSON dict.rNr)popget_all_test_result_classesrP)rcls_namer;rrrrs   rcCsTd}th}t||kr(t|}g}|D] }||q||t||ks |S)Nr)r rrq__subclasses__update) prev_countclassesto_addr;rrrrs   r)E collectionsrrr5rr{r2r.rDrortypingrrrrrur test.supportrtest.libregrtest.cmdlinertest.libregrtest.mainr test.libregrtest.runtestr r r r rrrtest.libregrtest.setuprtest.libregrtest.utilsrrrrrhasattrr1rrrrWr#r3r:rArBrTExcStrrrrXThreadrYlistrr\r JSONEncoderr?rrsettyperrrrrsT    $     [ &