a  ze9D@s ddlmZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl m Z mZmZmZmZddlmZddlmZddlmZddlmZmZmZmZmZmZmZddl m!Z!dd l"m#Z#m$Z$d Z%d Z&d Z'e(ed oe(ed Z)ddddddZ*ddddZ+ddddddZ,dddddd Z-Gd!d"d"Z.Gd#d$d$e Z/ere0Z1e2ed%e/fe2ed&e1fBZ3Gd'd(d(e4Z5Gd)d*d*e j6Z7d+d+d,d-d.Z8Gd/d0d0Z9d1d2d3d4d5Z:Gd6d7d7ej;Zd?Z>dS)@) annotationsN) NamedTupleNoReturnLiteralAny TYPE_CHECKING)support) Namespace)Regrtest)runtest is_failed TestResult InterruptedTimeout ChildErrorPROGRESS_MIN_TIME) setup_tests)format_duration print_warningg>@gr@setsidkillpgr r bool)resultnsreturncCs&t|trdS|jr"t||r"dSdS)NTF) isinstancerZfailfastr )rrrO/opt/bitninja-python-dojo/embedded/lib/python3.9/test/libregrtest/runtest_mp.py must_stop)s  rztuple[Namespace, str]rcCs$t|\}}tfi|}||fSN)jsonloadsr ) worker_argsns_dict test_namerrrrparse_worker_args1sr&strzsubprocess.Popen)testnamerrcCsxt|}||f}t|}tjgtdddd|}i}trNd|d<tj |ftj tj dt j dktj d|S) Nz-uz-mz test.regrtestz --worker-argsTstart_new_sessionnt)stdoutstderruniversal_newlines close_fdscwd)varsr!dumpssys executablerZargs_from_interpreter_flagsUSE_PROCESS_GROUP subprocessPopenPIPEosnameZSAVEDCWD)r(rr$r#cmdkwrrrrun_test_in_subprocess7s4 r<r)rr%rcCs<t|t||}tttj|tdddtddS)N)clsTflushr)rr printr!r1EncodeTestResultr2exit)rr%rrrrrun_tests_workerPs  rCc@s0eZdZdZddZddZddZdd Zd S) MultiprocessIteratorz8A thread-safe iterator over tests for multiprocess mode.cCst|_||_dSr ) threadingLocklock tests_iter)selfrHrrr__init__as zMultiprocessIterator.__init__cCs|Sr rrIrrr__iter__eszMultiprocessIterator.__iter__cCsB|j(|jdurtt|jWdS1s40YdSr )rGrH StopIterationnextrKrrr__next__hs zMultiprocessIterator.__next__cCs0|jd|_Wdn1s"0YdSr )rGrHrKrrrstopnszMultiprocessIterator.stopN)__name__ __module__ __qualname____doc__rJrLrOrPrrrrrD]s rDc@s.eZdZUded<ded<ded<ded<dS)MultiprocessResultr rr'r+r, error_msgN)rQrRrS__annotations__rrrrrUss rUFTc@s eZdZdS) ExitThreadN)rQrRrSrrrrrXsrXcseZdZddddfdd Zddd d Zddd d Zddd dZd$dddddddZdddddZdddddZ ddddZ ddddZ d dd!d"d#Z Z S)%TestWorkerProcessintz'MultiprocessTestRunner'None) worker_idrunnerrcsZt||_|j|_|j|_|j|_|j|_|j|_d|_ d|_ d|_ d|_ d|_ dS)NF)superrJr\pendingoutputrworker_timeouttimeoutregrtestcurrent_test_name start_time_popen_killed_stopped)rIr\r] __class__rrrJs zTestWorkerProcess.__init__r'rcCsd|jg}|r"|dn |d|j}|rF|d||j}|durt|j}|d|jj dt |fdd |S) NzTestWorkerProcess #runningstoppedztest=zpid=ztime=z<%s> ) r\is_aliveappendrdrftime monotonicreextendpidrjoin)rIinfotestpopendtrrr__repr__s   zTestWorkerProcess.__repr__c Cs|j}|durdS|jrdSd|_tr2|d}n|}td|tjddz"trft|jt j n| WnHt yYn8t y}z td|d|WYd}~n d}~00dS)NTz process groupzKill filer?zFailed to kill z: )rfrgr4r@r2r,r8rrssignalSIGKILLkillProcessLookupErrorOSErrorr)rIrwZwhatexcrrr_kills$   zTestWorkerProcess._killcCsd|_|dS)NT)rhrrKrrrrPszTestWorkerProcess.stopNr rU) test_resultr+r,rcCst|j|_t||||Sr )rprqre duration_secrU)rIrr+r,err_msgrrrmp_result_errorsz!TestWorkerProcess.mp_result_errorztuple[int, str, str])r%rcCs>t|_||_zt||j}d|_||_Wnd|_Yn0zz|jrX| t z|j |j d\}}|j }WnNtjy|jrt | d}d}}Yn.ty|jrt Yn0|}|}|||fWW|d|_d|_S| Yn0W|d|_d|_n|d|_d|_0dS)NFrbr)rprqrerdr<rrgrfrhrrX communicaterb returncoder5TimeoutExpiredrstriprstrip_wait_completed)rIr%rwr+r,retcoderrr _run_processsV       zTestWorkerProcess._run_processc Cs||\}}}|dur*|t|||Sd}|dkr@d|}nb|d\}}}|}|sbd}n@ztj|td}Wn,ty}zd|}WYd}~n d}~00|dur|t ||||St ||||S)Nrz Exit code %s zFailed to parse worker stdout)Z object_hookzFailed to parse worker JSON: %s) rrr rpartitionrr!r"decode_test_result ExceptionrrU) rIr%rr+r,r_rrrrr_runtests&  zTestWorkerProcess._runtestcCs|jszXzt|j}Wnty.YWqYn0||}|jd|ft|j|j r\WqWqt ytYqYqt y|jdt fYqYq0qdS)NFT)rhrNr_rMrr`putrrrrX BaseException traceback format_exc)rIr% mp_resultrrrrun#s     zTestWorkerProcess.runc Csv|j}|j|jz|tWnHtjtfyp}z*t d|dt td|WYd}~n d}~00dS)NzFailed to wait for z completion (timeout=z): ) rfr+closer,wait JOIN_TIMEOUTr5rrrr)rIrwrrrrr6s   z!TestWorkerProcess._wait_completedfloat)rercCsd|d|sq`t|}|jd|dt||tkrtd|dt|q`qdS)Ng?z Waiting for z thread for zFailed to join z in ) rtrnrprqrclogrrr)rIrerxrrr wait_stoppedEs  zTestWorkerProcess.wait_stopped)rrN)rQrRrSrJryrrPrrrrrr __classcell__rrrirrYs ;rYzlist[TestWorkerProcess])workersrcCsNg}|D]@}|j}|sqt|j}|tkrd|t|f}||q|S)Nz%s (%s))rdrprqrerrro)rrkworkerrdrxtextrrr get_running]s rc@steZdZdddddZddddZddd d Zd dd d ZdddddZdddddZddddZ dS)MultiprocessTestRunnerr r[rcrcCsj||_|jj|_|j|_t|_t|jj|_|jj durZt |jj d|jj d|_ nd|_ d|_ dS)Ng?i,) rcrrqueueQueuer`rDZtestsr_rbminrar)rIrcrrrrJks     zMultiprocessTestRunner.__init__rcs|fddtdjjdD_dtjd}jjrZ|dtjjtjf7}|jD] }| qjdS)Ncsg|]}t|qSr)rY).0indexrKrr |sz8MultiprocessTestRunner.start_workers..zRun tests in parallel using z child processesz" (timeout: %s, worker timeout: %s)) rangerZuse_mprlenrbrrarstart)rImsgrrrKr start_workers{s    z$MultiprocessTestRunner.start_workerscCs6t}|jD] }|q|jD]}||q"dSr )rprqrrPr)rIrerrrr stop_workerss    z#MultiprocessTestRunner.stop_workerszQueueOutput | NonecCstdd|jDsz5MultiprocessTestRunner._get_result..rrT)rBz running: %s, )anyrr`getrEmptyrrbPROGRESS_UPDATE faulthandlerZdump_traceback_laterMAIN_PROCESS_TIMEOUTrpgorrt)rIZuse_faulthandlerrbrkrrr _get_results$   z"MultiprocessTestRunner._get_resultrU)rrcCs|j}t|}|jdur(|d|j7}n$|jtkrL|jjsL|dt|j7}t|j }|rt|jjst|dd |7}|j |j |dS)Nz (%s)z -- running: %sr)rr'rVrrrrrrrrtrcZdisplay_progress test_index)rIrrrrkrrrdisplay_results   z%MultiprocessTestRunner.display_result QueueOutputr)itemrcCs|dr"|d}td|dS|jd7_|d}|j|j|||jrdt|jdd|jr|j j st|jt jddt |j|j rdSdS)z&Returns True if test runner must stop.rrzregrtest worker thread failed: Tr>rzF) rrrcZaccumulate_resultrrr+r@r,rrr2r)rIrrrrrr_process_results z&MultiprocessTestRunner._process_resultcCs|d|_ztz(|}|dur$q6||}|rq6qWn tyXtd|j_Yn0W|jj durpt |j |n(|jj durt |j |0dS)NrT)rrrrKeyboardInterruptr@rcZ interruptedrrbrZcancel_dump_traceback_laterr_rPr)rIrrPrrr run_testss(      z MultiprocessTestRunner.run_testsN) rQrRrSrJrrrrrrrrrrrjs rr r[rcCst|dSr )rr)rcrrrrun_tests_multiprocesssrcs(eZdZdZdddfdd ZZS)rAz7Encode a TestResult (sub)class object into a JSON dict.rdict[str, Any])orcs.t|tr"t|}|jj|d<|St|S)N__test_result__)rr r0rjrQr^default)rIrrrirrrs   zEncodeTestResult.default)rQrRrSrTrrrrrirrAsrArzTestResult | dict[str, Any])drcCsBd|vr |S|d}tD] }|j|kr|fi|SqdS)z7Decode a TestResult (sub)class object from a JSON dict.rN)popget_all_test_result_classesrQ)rcls_namer=rrrrs    rzset[type[TestResult]]cCsJd}th}t||krFt|}g}|D]}||q&||q |S)Nr)r rrr__subclasses__update)Z prev_countclassesZto_addr=rrrrs  r)?Z __future__rrr!r8rr|r5r2rErprtypingrrrrrrvrZtest.libregrtest.cmdliner Ztest.libregrtest.mainr Ztest.libregrtest.runtestr r r rrrrZtest.libregrtest.setuprZtest.libregrtest.utilsrrrrrhasattrr4rr&r<rCrDrUr'ZExcStrtuplerrrXThreadrYrrrZ JSONEncoderrArrrrrrsN    $   [ }