a 5êdg0Wã@s*dZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl m Z m Z m Z mZmZmZmZmZddlZddlZddlmZz ddlZWney²dZYn0e ejejkpÎejejkd¡Zddd„ZGdd „d ej ƒZ!Gd d „d e!ƒZ"eGd d „d e!ƒƒZ#e$dkr&e %¡dS)z| Test harness for the venv module. Copyright (C) 2011-2012 Vinay Sajip. Licensed to the PSF under a contributor agreement. éN)Úcaptured_stdoutÚcaptured_stderrÚ requires_zlibÚ can_symlinkÚEnvironmentVarGuardÚrmtreeÚ import_moduleÚ*skip_if_broken_multiprocessing_synchronize)Úpatchz:cannot run venv.create from within a venv on this platformcCsBtj|tjtj|d}| ¡\}}|jr:t |j|||¡‚||fS)N)ÚstdoutÚstderrÚencoding)Ú subprocessÚPopenÚPIPEÚ communicateÚ returncodeÚCalledProcessError)Úcmdr ÚpÚoutÚerr©rú*/usr/local/lib/python3.9/test/test_venv.pyÚ check_output%sý  ÿrc@sBeZdZdZdZdd„Zdd„Zdd„Zd d „Zd d œd d„Z dS)ÚBaseTestzBase class for venv tests.i cCs tj t ¡¡|_tjdkr0d|_d|_d|_ n$d|_ddt j dd…f|_d |_ t j }tj  |¡d |_t jd kr–tj |¡r–tj |¡s–d |_nd |_dS)NÚntÚScripts©ÚLibÚIncludeÚbinÚlibú python%d.%déÚincludeéÿÿÿÿÚwin32TF)ÚosÚpathÚrealpathÚtempfileÚmkdtempÚenv_dirÚnameÚbindirr"r%ÚsysÚ version_infoÚ_base_executableÚsplitÚexeÚplatformÚlexistsÚexistsÚcannot_link_exe)ÚselfÚ executablerrrÚsetUp4s"   ÿ þzBaseTest.setUpcCst|jƒdS©N)rr-©r9rrrÚtearDownGszBaseTest.tearDownc OsjtƒD}tƒ}||i|¤ŽWdƒn1s20YWdƒn1sP0Y| ¡| ¡fSr<)rrÚgetvalue)r9ÚfuncÚargsÚkwargsÚoutputÚerrorrrrÚrun_with_captureJsJzBaseTest.run_with_capturecGstjj|jg|¢RŽSr<)r(r)Újoinr-)r9rArrrÚ get_env_filePszBaseTest.get_env_filezutf-8©r cGs@t|j|Žd|d}| ¡}Wdƒn1s20Y|S)NÚrrH)ÚopenrGÚread)r9r rAÚfÚresultrrrÚget_text_file_contentsSs&zBaseTest.get_text_file_contentsN) Ú__name__Ú __module__Ú __qualname__Ú__doc__ZmaxDiffr;r>rErGrNrrrrr0src @sBeZdZdZdd„Zdd„Zdd„Zdd „Zed d „ƒZ e j d krHd Z n4ddddde j dd…fdde j dd…dffZ dd„Zdd„Zdd„Zdd„Zdd„Zd d!„Ze eƒd"¡d#d$„ƒZed%d&„ƒZe eƒd"¡d'd(„ƒZe ejd)kd*¡d+d,„ƒZed-d.„ƒZe ejd)kd/¡d0d1„ƒZe e j d2kd3¡d4d5„ƒZ dS)6Ú BasicTestzTest venv module functionality.cGs |j|Ž}| tj |¡¡dSr<)rGÚ assertTruer(r)Úisdir)r9rAÚfnrrrrU[s zBasicTest.isdircCs$t|jƒ| tj|j¡| |j¡| |j¡|j|jŽ|  d¡}t   d¡dkoht j dkohtjdk}|r‚| t j |¡¡n| t j |¡¡| d¡}tj}t j |¡}| d||¡|  |j|j¡}t j |¡s|  |j¡}td|ƒtd t  |¡ƒ| t j |¡d |¡d S) zB Test the create function with default arguments. Zlib64ÚPéÚposixÚdarwinú pyvenv.cfgz home = %súContents of %r:ú %rúFile %r should exist.N)rr-rEÚvenvÚcreaterUr/r%r"rGÚstructÚcalcsizer(r.r0r5rTr)ÚislinkÚ assertFalser7rNr2ÚdirnameÚassertInr4ÚprintÚlistdir)r9rZ conditionsÚdatar:r)rVÚbdrrrÚ test_defaults_s,     ÿ    zBasicTest.test_defaultscCs0tj |j¡d}t|jƒt ¡}| |j|j¡|  |j¡}|  d¡}|  |j d|¡|  d|¡t|jƒtjdd}| |j|j¡|  |j¡}|  d¡}|  |j d¡| d|¡t|jƒtjd d}tj t ¡¡}| |j|j¡|  |j¡}|  d¡}|  |j d|¡| d ||¡dS) Nér[z(%s) z prompt = z My prompt)Úpromptz (My prompt) zprompt = 'My prompt' Ú.zprompt = '%s' )r(r)r3r-rr_Ú EnvBuilderrEr`Úensure_directoriesrNÚ assertEqualrmZ assertNotInrfÚbasenameÚgetcwd)r9Zenv_nameÚbuilderÚcontextriÚcwdrrrÚ test_prompt{s.             zBasicTest.test_promptc s¨t ¡}tjdkrdnd‰tjdkr(dnd‰t ¡`‰‡‡‡‡fdd„}| ˆ¡}td|ƒ| |¡Wdƒn1s|0YWdƒn1sš0YdS) Nr'rr!z python.exeÚpythonc s*ˆ |tj ˆˆˆ¡ddddddg¡dS)Nú-mÚpipÚinstallz --upgradeZ setuptools)rqr(r)rF)r©Zbin_pathZ fake_env_dirZ python_exer9rrÚpip_cmd_checkersùþz.pip_cmd_checkerzvenv.subprocess.check_call) r_ror0r5r+ÚTemporaryDirectoryrpr Zupgrade_dependencies)r9rtr}Z fake_contextrr|rÚtest_upgrade_dependencies—s   z#BasicTest.test_upgrade_dependenciescCs˜t|jƒ| tj|j¡tj |j|j|j ¡}|ddg}d|jfd|jfdt j fdt j ffD]4\}}d||d<t |ƒ\}}| | ¡| ¡¡q^dS) z> Test that the prefix values are as expected. ú-cNÚprefixÚ exec_prefixÚ base_prefixÚbase_exec_prefixzimport sys; print(sys.%s)r$)rr-rEr_r`r(r)rFr/r4r0rƒr„rrqÚstripÚencode)r9ÚenvpyrrZexpectedrrrrrÚ test_prefixes¯s  ü   zBasicTest.test_prefixesr'))r)r r)rú site-packages)r!)r%)r"r"r#Nr$r‰c Csp|D]f}tjj|jg|¢RŽ}t |¡tj ||¡}t|dƒ}| d¡Wdƒq1s`0YqdS)zn Create some files in the environment which are unrelated to the virtual environment. Úwbó Still here?N)r(r)rFr-ÚmkdirrJÚwrite)r9ÚpathsÚfilenameÚsubdirsÚdrVrLrrrÚcreate_contentsÒs   zBasicTest.create_contentsc Csà| |jd¡t |j¡|jD]j}tjj|jg|d¢RŽ}| tj  |¡¡t |dƒ }|  |  ¡d¡Wdƒq 1s€0Yq tj dd}| |j¡|jD]0}tjj|jg|d¢RŽ}| tj  |¡¡qªdS)zE Test creating environment in an existing directory. Úfoo)r“Úrbr‹NT©Úclear)r’Ú ENV_SUBDIRSr_r`r-r(r)rFrTr7rJrqrKrord)r9rrVrLrtrrrÚtest_overwrite_existingÞs   0   z!BasicTest.test_overwrite_existingcCsZt |¡D]J}tj ||¡}tj |¡s4tj |¡r@t |¡q tj |¡r t|ƒq dSr<) r(rhr)rFrcÚisfileÚremoverUr)r9r)rVrrrÚclear_directoryðs   zBasicTest.clear_directoryc Cs„|jdd…D]p}tjj|jg|¢RŽ}t|dƒ}| d¡Wdƒn1sR0Y| tt ft j |j¡|  |j¡qdS)NérŠó) r—r(r)rFr-rJrZ assertRaisesÚ ValueErrorÚOSErrorr_r`r›)r9rŽrVrLrrrÚtest_unoverwritable_failsøs  (z#BasicTest.test_unoverwritable_failscCs¬dD]¢}tj|d}| |j|j¡| |j¡| |j¡|j|jŽ|  |j|j ¡}t j   |¡sŽ|  |j¡}td|ƒtdt  |¡ƒ| t j   |¡d|¡qdS)zC Test upgrading an existing environment directory. ©FT)Úupgrader\r]r^N)r_rorEr`r-rUr/r%r"rGr4r(r)r7rgrhrT)r9r¢rtrVrjrrrÚ test_upgrades       zBasicTest.test_upgradecCsFdD]<\}}tjd|d}| |j¡| d¡}| d||¡qdS)z: Test isolation from system site-packages ))TÚtrue)FZfalseT)r–Úsystem_site_packagesr[z"include-system-site-packages = %s N)r_ror`r-rNrf)r9ZsspÚsrtrirrrÚtest_isolations    zBasicTest.test_isolationzNeeds symlinkscCshdD]^}tjd|d}| |j¡| |j|j¡}|r|jrP| t j   |¡¡q|  t j   |¡¡qdS)z3 Test symlinking works as expected r¡T©r–ÚsymlinksN) r_ror`r-rGr/r4r8rdr(r)rcrT)r9ZuslrtrVrrrÚtest_symlinking s zBasicTest.test_symlinkingcCsbt|jƒ| tj|j¡tj tj |j¡|j |j ¡}t |ddgƒ\}}|  |  ¡| ¡¡dS)úD Test that the sys.executable value is as expected. r€ú!import sys; print(sys.executable)N)rr-rEr_r`r(r)rFr*r/r4rrqr…r†©r9r‡rrrrrÚtest_executable8s ÿÿ zBasicTest.test_executablecCslt|jƒtjddd}| |j¡tj tj |j¡|j |j ¡}t |ddgƒ\}}|  |  ¡| ¡¡dS)r«Tr¨r€r¬N©rr-r_ror`r(r)rFr*r/r4rrqr…r†©r9rtr‡rrrrrÚtest_executable_symlinksEs  ÿÿ z"BasicTest.test_executable_symlinksrzonly relevant on WindowscCsŽt|jƒtj tj |j¡d¡}tjdd}| |¡tj ||j d¡}tj ||j |j ¡}t |d|j ddgdd \}}|  |  ¡d ¡d S) z0 Test handling of Unicode paths u ϼўТλФЙTr•z activate.batú&r€zprint(0)ZoemrHÚ0N)rr-r(r)rFr*r_ror`r/r4rrqr…)r9r-rtÚactivater‡rrrrrÚtest_unicode_in_batch_fileSs   þ z$BasicTest.test_unicode_in_batch_filecCshtƒt|jƒ| tj|j¡tj tj  |j¡|j |j ¡}t |ddgƒ\}}|  | ¡d ¡¡dS)zA Test that the multiprocessing is able to spawn. r€zrfrom multiprocessing import Pool; pool = Pool(1); print(pool.apply_async("Python".lower).get(3)); pool.terminate()rxN)r rr-rEr_r`r(r)rFr*r/r4rrqr…r†r­rrrÚtest_multiprocessingds ÿÿ zBasicTest.test_multiprocessingznot relevant on WindowscCsÒt d¡}|dur| d¡t|jƒtjdd}| |j¡tj   |j|j d¡}tj   |jd¡}t |dƒ"}|  d|›d ¡Wdƒn1s”0Yt||gƒ\}}| |d  ¡¡| |d  ¡¡dS) NÚbashzbash required for this testTr•r´ztest_strict.shÚwzset -euo pipefail source z deactivate Ú)ÚshutilÚwhichZskipTestrr-r_ror`r(r)rFr/rJrrrqr†)r9r·rtr´Z test_scriptrLrrrrrÚ%test_deactivate_with_strict_bash_optsys      ÿ(z/BasicTest.test_deactivate_with_strict_bash_optsrZzonly relevant on macOScCsft|jƒt ¡}| |j¡tj tj |j¡|j |j ¡}t |ddgƒ\}}|  |  ¡d ¡¡dS)Nr€z5import os; print("__PYVENV_LAUNCHER__" in os.environ)ÚFalser¯r°rrrÚtest_macos_envŒs  ÿÿ zBasicTest.test_macos_env)!rOrPrQrRrUrkrwrÚrequireVenvCreaterˆr0r5r—r1r’r˜r›r r£r§ÚunittestÚ skipUnlessrrªr®r±r(r.rµr¶ZskipIfr¼r¾rrrrrSXsF  û         rSc@sReZdZdZdd„Zdd„Zdd„Zdd „Zd d „Ze   e d ¡e ƒd d„ƒƒZ dS)Ú EnsurePipTestz%Test venv module installation of pip.cCsdtj tj |j¡|j|j¡}t|ddgƒ\}}| d¡}|  |d¡| d¡}|  |  ¡d¡dS)Nr€z1try: import pip except ImportError: print("OK")úlatin-1r¹ZOK) r(r)rFr*r-r/r4rÚdecoderqr…r­rrrÚassert_pip_not_installed›sÿÿ    z&EnsurePipTest.assert_pip_not_installedcCs&t|jƒ| tj|j¡| ¡dSr<©rr-rEr_r`rÅr=rrrÚtest_no_pip_by_default¨s z$EnsurePipTest.test_no_pip_by_defaultcCs*t|jƒ|jtj|jdd| ¡dS)NF)Úwith_piprÆr=rrrÚtest_explicit_no_pip­s z"EnsurePipTest.test_explicit_no_pipcCsTttjdƒ }| | ¡d¡Wdƒn1s20Y| tj tj¡¡dS)Nr”r)rJr(ÚdevnullrqrKrTr)r7)r9rLrrrÚ test_devnull²s.zEnsurePipTest.test_devnullc Cs’t|jƒtƒ0}d|d<d|d<t ¡ö}||d<d}d}d}|fD]b\}}tj ||¡} t | ¡tj | |¡} t | d ƒ} |   |¡WdƒqH1s 0YqHz|j t j |j|d d WnLtjy} z0| jjd d } d}| | | | ¡¡WYd} ~ n d} ~ 00Wdƒn1s*0YWdƒn1sJ0Ytj tj |j¡|j|j¡}t|ddddddgƒ\}}| d¡}| |d¡| d¡}d t ¡¡}| |dt|ƒ…|¡t |j¡ d¡}| ||¡tƒ(}t|dddddgƒ\}}Wdƒn1s&0Y| d¡}tjdd|tj d}| | !¡d¡| d¡}| d|¡| d|¡|sŽ| "¡dS)NÚeZPYTHONWARNINGSÚ1ZPIP_NO_INSTALLÚHOMEz[global] no-install=1)rzzpip.ini)z.pipzpip.confr¸T)r¥rÈÚreplace)Úerrorsz{} **Subprocess Output** {}z-Wzignore::DeprecationWarningz-Iryrzz --versionrÃr¹zpip {}zensurepip._uninstallzl^(WARNING: )?The directory .* or its parent directory is not owned or is not writable by the current user.*$)ÚflagszSuccessfully uninstalled pipz#Successfully uninstalled setuptools)#rr-rr+r~r(r)rFrŒrJrrEr_r`rrrCrÄZfailÚformatr*r/r4rrqÚ ensurepipÚversionÚlenÚfsencoderfÚreÚsubÚ MULTILINEÚrstriprÅ)r9r¥ÚenvvarsZhome_dirZ bad_configZ win_locationZposix_locationreZfnameÚdirpathZfpathrLÚexcZdetailsÚmsgr‡rrZexpected_versionr-rrrÚdo_test_with_pip¼sf     * þ h ÿ     þ* þ   zEnsurePipTest.do_test_with_pipzpip requires ctypescCs| d¡| d¡dS)NFT)rßr=rrrÚ test_with_pips zEnsurePipTest.test_with_pipN)rOrPrQrRrÅrÇrÉrËrßrÀrÁÚctypesrràrrrrr˜s  Z rÂÚ__main__)N)&rRrÓr(Zos.pathr×rºrarr0r+Z test.supportrrrrrrrr rÀr_Z unittest.mockr ráÚ ImportErrorrÁrrƒr2r:r¿rZTestCaserrSrÂrOÚmainrrrrÚs@(      ý (B