U çÑÙgv`ã@sºddlZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlmZddlmZejZGdd„de jƒZdd„Zedkr¶eƒdS) éN)Úsupport)Ú script_helperc@sÌeZdZdd„Zdd„Zdd„Ze d¡dd „ƒZd d „Z d d „Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„Zdd„Zdd„Zdd„Ze eed ƒd!¡d"d#„ƒZd$d%„Zd&d'„Zd(d)„Zd*d+„Zd,d-„Zd.d/„Zd0d1„Zd2d3„Zd4d5„Z d6d7„Z!d8d9„Z"d:d;„Z#dd?„Z%d@dA„Z&dBdC„Z'dDdE„Z(dFdG„Z)GdHdI„dIƒZ*GdJdK„dKƒZ+dLdM„Z,dNdO„Z-dPdQ„Z.e eedRƒo€eedSƒdT¡dUdV„ƒZ/dfdXdY„Z0dZd[„Z1d\d]„Z2d^d_„Z3d`da„Z4dbdc„Z5ddde„Z6dWS)gÚ TestSupportcCs t d¡| tjtjd¡dS)NÚftplibÚfoo)rÚ import_moduleÚ assertRaisesÚunittestÚSkipTest©Úself©r ú'/usr/lib/python3.8/test/test_support.pyÚtest_import_modules zTestSupport.test_import_modulecCst d¡dS)Nr)rZimport_fresh_moduler r r rÚtest_import_fresh_modulesz$TestSupport.test_import_fresh_modulecCs.| t |d¡|j¡| tjtj|d¡dS)NÚtest_get_attributer)Ú assertEqualrZ get_attributerrr r r r r rrsÿzTestSupport.test_get_attributezfailing buildbotscCs| t ¡tj¡dS©N)rrZget_original_stdoutÚsysÚstdoutr r r rÚtest_get_original_stdout#sz$TestSupport.test_get_original_stdoutcCs2ddl}| dtj¡t d¡| dtj¡dS)NrÚsched)rÚassertInrÚmodulesrZunloadÚ assertNotIn)r rr r rÚ test_unload's zTestSupport.test_unloadc Cs@ttdƒ}W5QRXt t¡| tj t¡¡t t¡dS)NÚw)ÚopenÚTESTFNrÚunlinkÚ assertFalseÚosÚpathÚexists)r Úfr r rÚ test_unlink-s    zTestSupport.test_unlinkc Cs$tjd}tj |d¡}t |¡t |¡t |¡| tj |¡¡t  tdd¡t |¡W5QRXt |¡t |¡t  |t j t j B¡t  tdd¡t |¡W5QRX| tj |¡¡t |¡t |¡t  |d¡t  tdd¡t |¡W5QRX| tj |¡¡dS)NÚdZsubdirÚverboser)rrr!r"ÚjoinÚmkdirÚrmtreer r#Ú swap_attrÚchmodÚstatÚS_IRUSRÚS_IXUSR)r ÚdirpathZ subdirpathr r rÚ test_rmtree4s(         zTestSupport.test_rmtreec Cs˜td}t|dƒ}td|dW5QRXtj dtj¡t  ¡z2t tƒ}| ttj¡t  t¡| ttj¡W5tjd=t   |¡t   d¡XdS)Nz.pyrzfoo = 1©ÚfilerÚ __pycache__)rrÚprintrr"Úinsertr!ÚcurdirÚ importlibÚinvalidate_cachesrrr*Ú __import__rrZforgetr)r Z mod_filenamer$Úmodr r rÚ test_forgetLs   zTestSupport.test_forgetcCst tjdf¡}| ¡dS)Nr)ÚsocketÚ create_serverrÚHOSTÚclose©r Úsr r rÚ test_HOST]szTestSupport.test_HOSTcCs$t ¡}t tj|f¡}| ¡dSr)rZfind_unused_portr=r>r?r@)r ZportrBr r rÚtest_find_unused_portasz!TestSupport.test_find_unused_portcCs&t ¡}t |¡| ¡| ¡dSr)r=rZ bind_portZlistenr@rAr r rÚtest_bind_portfs zTestSupport.test_bind_portc Cst ¡}tj |¡}zjtj |d¡}| tj  |¡¡t  |¡$}|  ||¡|  tj  |¡¡W5QRX| tj  |¡¡W5t |¡XdS)z8Test that temp_dir() creates and destroys its directory.ZtempN) ÚtempfileÚmkdtempr!r"Úrealpathrr*r(r ÚisdirÚtemp_dirrÚ assertTrue)r Ú parent_dirr"Ú temp_pathr r rÚ test_temp_dirns   zTestSupport.test_temp_dirc Cs<t ¡}| tj |¡¡W5QRX| tj |¡¡dS)zTest passing no path.N)rrJrKr!r"rIr )r rMr r rÚtest_temp_dir__path_none}s z$TestSupport.test_temp_dir__path_nonec Csddd„}t ¡}tj |¡}z6| tj |¡¡|  t ||¡| tj |¡¡W5t |¡XdS)z-Test passing a directory that already exists.c Ss"t |¡}tdƒ‚W5QRXdS©Nzshould not get here)rrJÚ Exception)r"rMr r rÚ call_temp_dir…s zMTestSupport.test_temp_dir__existing_dir__quiet_default..call_temp_dirN) rFrGr!r"rHÚshutilr*rKrIrÚFileExistsError)r rRr"r r rÚ*test_temp_dir__existing_dir__quiet_defaultƒs z6TestSupport.test_temp_dir__existing_dir__quiet_defaultc Csºt ¡}tj |¡}z`t ¡<}tj |dd}|  ||¡W5QRXdd„|j Dƒ}W5QRX|  tj  |¡¡W5t |¡X|  t|ƒd|¡|d}|  | d|›d¡|¡d S) z=Test passing a directory that already exists with quiet=True.T©ÚquietcSsg|]}t|jƒ‘qSr ©ÚstrÚmessage©Ú.0rr r rÚ œszGTestSupport.test_temp_dir__existing_dir__quiet_true..érz5tests may fail, unable to create temporary directory ú: N)rFrGr!r"rHrSr*rÚcheck_warningsrJrÚwarningsrKrIÚlenÚ startswith)r r"ÚrecorderrMraÚwarnr r rÚ'test_temp_dir__existing_dir__quiet_true“s   þz3TestSupport.test_temp_dir__existing_dir__quiet_trueÚforkztest requires os.forkcCst dt d¡¡dS)z?Test that a forked child process does not remove the directory.ú-ca§ import os from test import support with support.temp_cwd() as temp_path: pid = os.fork() if pid != 0: # parent process (child has pid == 0) # wait for the child to terminate (pid, status) = os.waitpid(pid, 0) if status != 0: raise AssertionError(f"Child process failed with exit " f"status indication 0x{status:x}.") # Make sure that temp_path is still present. When the child # process leaves the 'temp_cwd'-context, the __exit__()- # method of the context must not remove the temporary # directory. if not os.path.isdir(temp_path): raise AssertionError("Child removed temp_path.") N)rZassert_python_okÚtextwrapZdedentr r r rÚtest_temp_dir__forked_child¨sz'TestSupport.test_temp_dir__forked_childc Csbt ¡}t ¡8}t |¡"}| ||¡| t ¡|¡W5QRXW5QRX| t ¡|¡dSr)r!ÚgetcwdrrJÚ change_cwdr)r Ú original_cwdrMÚnew_cwdr r rÚtest_change_cwdÅs    $zTestSupport.test_change_cwdc CsTt ¡}dd„}t ¡"}tj |d¡}| t||¡W5QRX| t ¡|¡dS)z&Test passing a non-existent directory.c Ss"t |¡}tdƒ‚W5QRXdSrP)rrlrQ)r"rnr r rÚcall_change_cwdÓs zFTestSupport.test_change_cwd__non_existent_dir..call_change_cwdÚdoes_not_existN) r!rkrrJr"r(rÚFileNotFoundErrorr)r rmrprLZnon_existent_dirr r rÚ!test_change_cwd__non_existent_dirÏs ÿz-TestSupport.test_change_cwd__non_existent_dirc Cs¼t ¡}t ¡n}tj |d¡}t ¡L}tj|dd"}| ||¡| t ¡|¡W5QRXdd„|j Dƒ}W5QRXW5QRX| t |ƒd|¡|d}|  |  d|›d ¡|¡d S) z6Test passing a non-existent directory with quiet=True.rqTrVcSsg|]}t|jƒ‘qSr rXr[r r rr]èszMTestSupport.test_change_cwd__non_existent_dir__quiet_true..r^rúBtests may fail, unable to change the current working directory to r_N) r!rkrrJr"r(r`rlrrarbrKrc)r rmrLZbad_dirrdrnrarer r rÚ-test_change_cwd__non_existent_dir__quiet_trueÞs   $ýz9TestSupport.test_change_cwd__non_existent_dir__quiet_truec Cs~td}t ¡0}tj|ddW5QRXdd„|jDƒ}W5QRX| t|ƒd|¡|d}| | d|›d ¡|¡d S) z0Check the warning message when os.chdir() fails.Z_does_not_existT)r"rWcSsg|]}t|jƒ‘qSr rXr[r r rr]ùsz>TestSupport.test_change_cwd__chdir_warning..r^rrtr_N) rrr`rlrarrbrKrc)r r"rdZmessagesÚmsgr r rÚtest_change_cwd__chdir_warningós  ýz*TestSupport.test_change_cwd__chdir_warningc Cs^t ¡}tjtd| tj t ¡¡t¡W5QRX| tj  t¡¡| t ¡|¡dS)N©Úname) r!rkrÚtemp_cwdrrr"Úbasenamer r#)r Úherer r rÚ test_temp_cwds "zTestSupport.test_temp_cwdc Csbt ¡}tjdd4}| ||¡| tj |¡¡| t ¡|¡W5QRX| t ¡|¡dS)z Test passing None to temp_cwd().Nrx) r!rkrrzZassertNotEqualrKr"rIr)r rmrnr r rÚtest_temp_cwd__name_none s  z$TestSupport.test_temp_cwd__name_nonecCs| t ddddœ¡d¡dS)Néér^)rr€r^z{1: 1, 2: 2, 3: 3})rrZsortdictr r r rÚ test_sortdictszTestSupport.test_sortdictc Cs@t ¡}| t¡}t |d¡W5QRX| |jjtj ¡dS)Nsfoo) rZ make_bad_fdrÚOSErrorr!ÚwriterZ exceptionÚerrnoZEBADF)r ÚfdÚcmr r rÚtest_make_bad_fds zTestSupport.test_make_bad_fdc Cs8tj|dddd| t¡t |d¡W5QRXdS)Nz def classr^é)ÚlinenoÚoffsetzx=1)rZcheck_syntax_errorrÚAssertionErrorr r r rÚtest_check_syntax_errors z#TestSupport.test_check_syntax_errorc Cs,ddl}t d¡| d¡W5QRXdS)NrZasyncore)r8rZ CleanImportr)r r8r r rÚtest_CleanImport#s zTestSupport.test_CleanImportc CsTt dd¡"| dtj¡| dtj¡W5QRX| dtj¡| dtj¡dS)NrZbar)rZ DirsOnSysPathrrr"rr r r rÚtest_DirsOnSysPath(s zTestSupport.test_DirsOnSysPathc Cs0t ¡}tdƒW5QRX| | ¡d¡dS)NÚhelloúhello )rZcaptured_stdoutr5rÚgetvalue)r rr r rÚtest_captured_stdout/s z TestSupport.test_captured_stdoutc Cs6t ¡}tdtjdW5QRX| | ¡d¡dS)Nrr2r)rZcaptured_stderrr5rÚstderrrr‘)r r“r r rÚtest_captured_stderr4s z TestSupport.test_captured_stderrc Cs>t ¡ }| d¡| d¡tƒ}W5QRX| |d¡dS)Nrrr)rZcaptured_stdinrƒÚseekÚinputr)r ÚstdinZcapturedr r rÚtest_captured_stdin9s    zTestSupport.test_captured_stdincCs t ¡dSr)rZ gc_collectr r r rÚtest_gc_collectAszTestSupport.test_gc_collectcCs| t ¡t¡dSr)ZassertIsInstancerZpython_is_optimizedÚboolr r r rÚtest_python_is_optimizedDsz$TestSupport.test_python_is_optimizedc CsÐGdd„dƒ}|ƒ}d|_t |dd¡ }| |jd¡| |d¡W5QRX| |jd¡t |dd¡}| |jd¡| |¡W5QRX| t|dƒ¡t |dd¡ |`W5QRX| t|dƒ¡dS)Nc@s eZdZdS)z'TestSupport.test_swap_attr..ObjN)Ú__name__Ú __module__Ú __qualname__r r r rÚObjHsrŸr^ÚxrˆÚy)r rr+rr¡Ú assertIsNoner Úhasattr)r rŸÚobjr r¡r r rÚtest_swap_attrGszTestSupport.test_swap_attrc Cs¾ddi}t |dd¡"}| |dd¡| |d¡W5QRX| |dd¡t |dd¡ }| |dd¡| |¡W5QRX| d|¡t |dd¡ |d=W5QRX| d|¡dS)Nr r^rˆr¡)rZ swap_itemrr¢r)r ÚDr r¡r r rÚtest_swap_itemXs zTestSupport.test_swap_itemc@seZdZdZdZdZdZdS)zTestSupport.RefClassN)rœrržÚ attribute1Ú attribute2Z_hidden_attribute1Ú __magic_1__r r r rÚRefClassfsr«c@seZdZdZdZdZdZdS)zTestSupport.OtherClassN)rœrržr©Ú attribute3rªÚ __magic_2__r r r rÚ OtherClasslsr®cCsBt |j|j¡}| dh|¡t |j|j¡}| ddh|¡dS)Nr¨r¬r­)rÚdetect_api_mismatchr«r®r)r Ú missing_itemsr r rÚtest_detect_api_mismatchrsÿÿz$TestSupport.test_detect_api_mismatchcCsTddddg}tj|j|j|d}| tƒ|¡tj|j|j|d}| tƒ|¡dS)Nr¨r¬r­Z not_in_either)Úignore)rr¯r«r®rÚset)r r²r°r r rÚ test_detect_api_mismatch__ignore{s ÿÿz,TestSupport.test_detect_api_mismatch__ignorecCsZdh}dh}tj|t||dddh}dddh}tj|td ||d| ttj|t¡dS) NZtempdirÚtemplate)ÚextraÚ blacklistZTextTestResultZinstallHandlerZ load_testsZ TestProgramZ BaseTestSuite)zunittest.resultz unittest.casezunittest.suitezunittest.loaderz unittest.mainzunittest.runnerzunittest.signalszunittest.async_case)rZ check__all__rFr rr‹)r r¶r·r r rÚtest_check__all__†s ý ù zTestSupport.test_check__all__ÚwaitpidÚWNOHANGz need os.waitpid() and os.WNOHANGcCsÔt ¡t ¡}|dkr"t d¡t ¡}t ¡d}tj}z‚dt_t  ¡}t ¡|krb|  d¡t j }z|t _ t ¡W5|t _ XtjrŒq˜t  d¡qLd|}| || ¡¡| tj¡W5|t_Xt ¡dS)NrgN@FZtimeoutgš™™™™™¹?z2Warning -- reap_children() reaped child process %s)rZ reap_childrenr!rgÚ_exitÚtimeÚ monotonicZenvironment_alteredÚioÚStringIOZfailrÚ __stderr__Úsleeprr‘rK)r ÚpidZt0ZdeadlineZ was_alteredr“Ú old_stderrrvr r rÚtest_reap_childrenœs2      zTestSupport.test_reap_childrenNcCs„d|›d|›d}tjf|d|f•}dd„tj ¡Dƒ}tj|tjtjd|d}|dkr\|}|  |j   ¡t |ƒ¡|  |j d ¡dS) Nzfrom test.support import z ; print(repr(z()))rhcSs i|]\}}| d¡s||“qS)ZPYTHON)rc)r\ÚkeyÚvaluer r rÚ Ðs ÿz-TestSupport.check_options..T)rr“Zuniversal_newlinesÚenvr)rÚ executabler!ÚenvironÚitemsÚ subprocessÚrunÚPIPEZDEVNULLrrÚrstripÚreprÚ returncode)r ÚargsÚfuncÚexpectedÚcodeÚcmdrÈÚprocr r rÚ check_optionsÍsüzTestSupport.check_optionscCs¨gdgdgdgdgdgdgdgdgd gd gd gd d gd d d gd dgd dgd dgd dgd dgd dgfD](}|j|d| |d¡W5QRXqd| dddgddg¡dS)Nz-Bz-sz-Sz-Ez-vz-bz-qz-Iz-bbz-vvvz-Wignorez-XZdevZ faulthandlerZ importtimeZshowalloccountZ showrefcountÚ tracemallocz tracemalloc=3©ÚoptsZargs_from_interpreter_flags©ZsubTestrØ©r rÛr r rÚ test_args_from_interpreter_flagsÜs4çÿz,TestSupport.test_args_from_interpreter_flagsc Cs@gdgdgdgfD](}|j|d| |d¡W5QRXqdS)Nz-Oz-OOz-OOOOrÚZ!optim_args_from_interpreter_flagsrÜrÝr r rÚ&test_optim_args_from_interpreter_flagsÿsûz2TestSupport.test_optim_args_from_interpreter_flagsc CsÈGdd„dƒ}|dƒ}|dƒ}t tdd¡¼t g¡| t |¡¡| t |¡¡t dd¡| t |¡¡| t |¡¡t | ¡gd¡| t |¡¡| t |¡¡t dgd¡| t |¡¡| t |¡¡t dgd¡| t |¡¡| t |¡¡t dgd¡| t |¡¡t d gd¡| t |¡¡t d gd¡| t |¡¡| t |¡¡t | ¡| ¡gd¡| t |¡¡| t |¡¡t d d gd¡| t |¡¡| t |¡¡W5QRXt tdd¡¾tjgd | t |¡¡| t |¡¡t dd¡| t |¡¡| t |¡¡t d| ¡g¡| t |¡¡| t |¡¡t ddg¡| t |¡¡| t |¡¡t ddg¡| t |¡¡| t |¡¡t ddg¡| t |¡¡t dd g¡| t |¡¡t dd g¡| t |¡¡| t |¡¡t d| ¡| ¡g¡| t |¡¡| t |¡¡t dd d g¡| t |¡¡| t |¡¡W5QRXdS)Nc@seZdZdd„Zdd„ZdS)z)TestSupport.test_match_test..TestcSs ||_dSr©Útest_id)r rár r rÚ__init__ sz2TestSupport.test_match_test..Test.__init__cSs|jSrràr r r rÚidsz,TestSupport.test_match_test..Test.idN)rœrržrârãr r r rÚTest sräz"test.test_os.FileTests.test_accessz'test.test_os.Win32ErrorTests.test_chdirZ_match_test_funcZtest_osztest_*Z filetestsZ FileTestsz*test_os.*.test_*Ú test_accessZ DONTMATCH)Zignore_patterns)rr+Zset_match_testsrKZ match_testrãr )r räråZ test_chdirr r rÚtest_match_test sz    zTestSupport.test_match_testc CsDt ¡}t ttj¡}z t ¡}W5t |¡X| ||d¡dS)Nr^)rZfd_countr!rÚ__file__ÚO_RDONLYr@r)r Ústartr…Zmorer r rÚ test_fd_countts   zTestSupport.test_fd_countcCs@t ¡}tj}z|t_t |¡W5|t_X| | ¡|¡dSr)r¾r¿rrÀrZ print_warningrr‘)r rvrÔr“rÃr r rÚcheck_print_warning€szTestSupport.check_print_warningcCs| dd¡| dd¡dS)NrvzWarning -- msg za bzWarning -- a Warning -- b )rër r r rÚtest_print_warningŒs ÿÿzTestSupport.test_print_warning)N)7rœrržrrrr Úskiprrr%r1r<rCrDrErNrOrUrfZ skipUnlessr£r!rjrorsrurwr}r~rr‡rŒrrŽr’r”r˜r™r›r¥r§r«r®r±r´r¸rÄrØrÞrßrærêrërìr r r rrsh      ÿ / # i  rcCstg}tj|ŽdSr)rrZ run_unittest)Ztestsr r rÚ test_main¬srîÚ__main__)Ú contextlibr„r8r¾r!rSr=r-rÌrrFrir¼r ZtestrZ test.supportrrZTestCaserrîrœr r r rÚs2