o
    IXîhi  ã                   @   s@  d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlmZmZmZmZ ddlmZmZmZ ddlZddlZddlmZ zddlZW n eyc   dZY nw e e	je	jkpqe	je	jkd¡Z ddd„Z!G d	d
„ d
ej"ƒZ#G dd„ de#ƒZ$e G dd„ de#ƒƒZ%e&dkrže '¡  dS dS )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Ú*skip_if_broken_multiprocessing_synchronize)Úcan_symlinkÚEnvironmentVarGuardÚrmtree)Úpatchz:cannot run venv.create from within a venv on this platformc                 C   sB   t j| t jt j|d}| ¡ \}}|jrt  |j| ||¡‚||fS )N)ÚstdoutÚstderrÚencoding)Ú
subprocessÚPopenÚPIPEÚcommunicateÚ
returncodeÚCalledProcessError)Úcmdr   ÚpÚoutÚerr© r   ú8/opt/python-3.10.19/usr/lib/python3.10/test/test_venv.pyÚcheck_output&   s   ý
ÿr   c                   @   sJ   e Zd ZdZdZdd„ Zdd„ Zdd„ Zd	d
„ Zddœdd„Z	dd„ Z
dS )ÚBaseTestzBase class for venv tests.i   c                 C   s¢   t j t ¡ ¡| _t jdkrd| _d| _d| _	nd| _ddt
jd d…  f| _d	| _	t
j}t j |¡d
 | _t
jdkrLt j |¡rLt j |¡sLd| _d S d| _d S )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Ú
executabler   r   r   ÚsetUp5   s"   


ÿ
þ

zBaseTest.setUpc                 C   s   t | jƒ d S ©N)r   r,   ©r8   r   r   r   ÚtearDownH   s   zBaseTest.tearDownc              	   O   sj   t ƒ "}tƒ }||i |¤Ž W d   ƒ n1 sw   Y  W d   ƒ n1 s(w   Y  | ¡ | ¡ fS r;   )r   r   Úgetvalue)r8   ÚfuncÚargsÚkwargsÚoutputÚerrorr   r   r   Úrun_with_captureK   s   ÿ€ÿzBaseTest.run_with_capturec                 G   s   t jj| jg|¢R Ž S r;   )r'   r(   Újoinr,   )r8   r@   r   r   r   Úget_env_fileQ   s   zBaseTest.get_env_filezutf-8©r   c                G   sB   t | j|Ž d|d}| ¡ }W d   ƒ |S 1 sw   Y  |S )NÚrrG   )ÚopenrF   Úread)r8   r   r@   ÚfÚresultr   r   r   Úget_text_file_contentsT   s   

ÿþzBaseTest.get_text_file_contentsc                 C   s(   |  |¡s|  d|›d|›¡ d S d S )NzString z does not end with )ÚendswithÚfail)r8   ÚstringÚtailr   r   r   ÚassertEndsWithY   s   
ÿzBaseTest.assertEndsWithN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ZmaxDiffr:   r=   rD   rF   rM   rR   r   r   r   r   r   1   s    r   c                	   @   s  e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zed
d„ ƒZ	e
jdkr$dZnddddde
jdd…  fdde
jdd…  dffZdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Ze eƒ d"¡d#d$„ ƒZed%d&„ ƒZe eƒ d"¡d'd(„ ƒZe ejd)kd*¡d+d,„ ƒZe ejd)kd*¡d-d.„ ƒZe ejd)kd/¡d0d1„ ƒZe ejd)kd/¡d2d3„ ƒZ ed4d5„ ƒZ!e ejd)kd6¡d7d8„ ƒZ"e e
jd9kd:¡d;d<„ ƒZ#dS )=Ú	BasicTestzTest venv module functionality.c                 G   s    | j |Ž }|  tj |¡¡ d S r;   )rF   Ú
assertTruer'   r(   Úisdir)r8   r@   Úfnr   r   r   rY   `   s   
zBasicTest.isdirc                 C   s"  t | jƒ |  tj| j¡ |  | j¡ |  | j¡ | j| jŽ  |  	d¡}t
 d¡dko4tjdko4tjdk}|rA|  tj |¡¡ n	|  tj |¡¡ |  d¡}tj}tj |¡}|  d| |¡ |  	| j| j¡}tj |¡sƒ|  	| j¡}td| ƒ td	t |¡ ƒ |  tj |¡d
| ¡ dS )zB
        Test the create function with default arguments.
        Zlib64ÚPé   ÚposixÚdarwinú
pyvenv.cfgz	home = %súContents of %r:ú    %rúFile %r should exist.N)r   r,   rD   ÚvenvÚcreaterY   r.   r$   r!   rF   ÚstructÚcalcsizer'   r-   r/   r4   rX   r(   ÚislinkÚassertFalser6   rM   r1   ÚdirnameÚassertInr3   ÚprintÚlistdir)r8   r   Z
conditionsÚdatar9   r(   rZ   Úbdr   r   r   Útest_defaultsd   s,   

ÿ
zBasicTest.test_defaultsc                 C   s0  t j | j¡d }t| jƒ t ¡ }|  |j| j¡ | 	| j¡}|  
d¡}|  |jd| ¡ |  d|¡ t| jƒ tjdd}|  |j| j¡ | 	| j¡}|  
d¡}|  |jd¡ |  d|¡ t| jƒ tjd	d}t j t  ¡ ¡}|  |j| j¡ | 	| j¡}|  
d¡}|  |jd| ¡ |  d
| |¡ d S )Né   r_   z(%s) z	prompt = z	My prompt)Úpromptz(My prompt) zprompt = 'My prompt'
Ú.zprompt = '%s'
)r'   r(   r2   r,   r   rc   Ú
EnvBuilderrD   rd   Úensure_directoriesrM   ÚassertEqualrq   ZassertNotInrj   ÚbasenameÚgetcwd)r8   Úenv_nameÚbuilderÚcontextrm   Úcwdr   r   r   Útest_prompt€   s.   





zBasicTest.test_promptc              	      sì   t  ¡ }tjdkrdnd}tj tj¡d }t 	¡ R}tj 
tj |||¡¡‰ tjdkr6tj 
tj ˆ ¡¡‰ ‡ ‡fdd„}| |¡}td|ƒ | |¡ W d   ƒ n1 sWw   Y  W d   ƒ d S W d   ƒ d S 1 sow   Y  d S )Nr&   r   r    rp   c              
      s2   t j | d ¡| d< ˆ | ˆ ddddddg¡ d S )Nr   ú-mÚpipÚinstallz	--upgradeZ
setuptools)r'   r(   Únormcaseru   )r   rA   ©Z
expect_exer8   r   r   Úpip_cmd_checker§   s   ùþz<BasicTest.test_upgrade_dependencies.<locals>.pip_cmd_checkerzvenv.subprocess.check_output)rc   rs   r/   r4   r'   r(   r2   r9   r*   ÚTemporaryDirectoryr€   rE   r)   rt   r	   Zupgrade_dependencies)r8   ry   Zbin_pathZ
python_exeZfake_env_dirr‚   Zfake_contextr   r   r   Útest_upgrade_dependenciesœ   s"   
ÿ

ÿé"éz#BasicTest.test_upgrade_dependenciesc                 C   s˜   t | jƒ |  tj| j¡ tj | j| j| j	¡}|ddg}d| jfd| jfdt
jfdt
jffD ]\}}d| |d< t|ƒ\}}|  | ¡ | ¡ ¡ q/dS )	z>
        Test that the prefix values are as expected.
        ú-cNÚprefixÚexec_prefixÚbase_prefixÚbase_exec_prefixzimport sys; print(sys.%s)r#   )r   r,   rD   rc   rd   r'   r(   rE   r.   r3   r/   rˆ   r‰   r   ru   ÚstripÚencode)r8   Úenvpyr   r†   Zexpectedr   r   r   r   r   Útest_prefixesº   s   

üùzBasicTest.test_prefixesr&   ))r   )r   r   )r   úsite-packages)r    )r$   )r!   r!   r"   Nr#   rŽ   c              	   C   sp   |D ]3}t jj| jg|¢R Ž }t  |¡ t j ||¡}t|dƒ}| d¡ W d  ƒ n1 s0w   Y  qdS )zn
        Create some files in the environment which are unrelated
        to the virtual environment.
        Úwbó   Still here?N)r'   r(   rE   r,   ÚmkdirrI   Úwrite)r8   ÚpathsÚfilenameÚsubdirsÚdrZ   rK   r   r   r   Úcreate_contentsÝ   s   
ÿ€üzBasicTest.create_contentsc              	   C   sà   |   | jd¡ t | j¡ | jD ]5}tjj| jg|d ¢R Ž }|  tj 	|¡¡ t
|dƒ}|  | ¡ d¡ W d  ƒ n1 s@w   Y  qtjdd}| | j¡ | jD ]}tjj| jg|d ¢R Ž }|  tj 	|¡¡ qUdS )zE
        Test creating environment in an existing directory.
        Úfoo)r˜   Úrbr   NT©Úclear)r—   ÚENV_SUBDIRSrc   rd   r,   r'   r(   rE   rX   r6   rI   ru   rJ   rs   rh   )r8   r•   rZ   rK   ry   r   r   r   Útest_overwrite_existingé   s   
ÿ€
þz!BasicTest.test_overwrite_existingc                 C   sZ   t  |¡D ]%}t j ||¡}t j |¡st j |¡r t  |¡ qt j |¡r*t|ƒ qd S r;   )	r'   rl   r(   rE   rg   ÚisfileÚremoverY   r   )r8   r(   rZ   r   r   r   Úclear_directoryû   s   €ûzBasicTest.clear_directoryc              	   C   s„   | j d d… D ]8}tjj| jg|¢R Ž }t|dƒ}| d¡ W d   ƒ n1 s)w   Y  |  tt	ft
j| j¡ |  | j¡ qd S )Né   r   ó    )rœ   r'   r(   rE   r,   rI   r’   ZassertRaisesÚ
ValueErrorÚOSErrorrc   rd   r    )r8   r“   rZ   rK   r   r   r   Útest_unoverwritable_fails  s   ÿûz#BasicTest.test_unoverwritable_failsc                 C   s¬   dD ]Q}t j|d}|  |j| j¡ |  | j¡ |  | j¡ | j| jŽ  |  	| j| j
¡}tj |¡sG|  	| j¡}td| ƒ tdt |¡ ƒ |  tj |¡d| ¡ qdS )zC
        Test upgrading an existing environment directory.
        ©FT)Úupgrader`   ra   rb   N)rc   rs   rD   rd   r,   rY   r.   r$   r!   rF   r3   r'   r(   r6   rk   rl   rX   )r8   r§   ry   rZ   rn   r   r   r   Útest_upgrade  s   ôzBasicTest.test_upgradec                 C   sF   dD ]\}}t jd|d}| | j¡ |  d¡}|  d| |¡ qdS )z:
        Test isolation from system site-packages
        ))TÚtrue)FZfalseT)r›   Úsystem_site_packagesr_   z"include-system-site-packages = %s
N)rc   rs   rd   r,   rM   rj   )r8   ZsspÚsry   rm   r   r   r   Útest_isolation!  s   
üzBasicTest.test_isolationzNeeds symlinksc                 C   sh   dD ]/}t jd|d}| | j¡ |  | j| j¡}|r1| jr(|  t	j
 |¡¡ q|  t	j
 |¡¡ qdS )z3
        Test symlinking works as expected
        r¦   T©r›   ÚsymlinksN)rc   rs   rd   r,   rF   r.   r3   r7   rh   r'   r(   rg   rX   )r8   Zuslry   rZ   r   r   r   Útest_symlinking+  s   €ózBasicTest.test_symlinkingc                 C   sb   t | jƒ |  tj| j¡ tj tj | j¡| j	| j
¡}t|ddgƒ\}}|  | ¡ | ¡ ¡ dS )úD
        Test that the sys.executable value is as expected.
        r…   ú!import sys; print(sys.executable)N)r   r,   rD   rc   rd   r'   r(   rE   r)   r.   r3   r   ru   rŠ   r‹   ©r8   rŒ   r   r   r   r   r   Útest_executableC  s   
ÿ
ÿzBasicTest.test_executablec                 C   sl   t | jƒ tjddd}| | j¡ tj tj | j¡| j	| j
¡}t|ddgƒ\}}|  | ¡ | ¡ ¡ dS )r°   Tr­   r…   r±   N©r   r,   rc   rs   rd   r'   r(   rE   r)   r.   r3   r   ru   rŠ   r‹   ©r8   ry   rŒ   r   r   r   r   r   Útest_executable_symlinksP  s   
ÿ
ÿz"BasicTest.test_executable_symlinksr   z&contains invalid characters on Windowsc                 C   s  t | jƒ t d¡}|du r|  d¡ d}tj tj | j¡|¡}t	j
dd}| |¡ tj || jd¡}tj | jd¡}t|d	ƒ}| d
t |¡› d¡ W d  ƒ n1 sYw   Y  t||gƒ\}}	| ¡ }
|  | ¡ |
d v ¡ |  |
d | ¡ ¡ dS )zK
        Test that the template strings are quoted properly (bash)
        ÚbashNúbash required for this testú
"';&&$e|'"Trš   Úactivateztest_special_chars.shÚwúsource úr
python -c 'import sys; print(sys.executable)'
python -c 'import os; print(os.environ["VIRTUAL_ENV"])'
deactivate
r   rp   ©r   r,   ÚshutilÚwhichÚskipTestr'   r(   rE   r)   rc   rs   rd   r.   rI   r’   ÚshlexÚquoter   Ú
splitlinesrX   r‹   rR   )r8   r·   rx   r,   ry   rº   Útest_scriptrK   r   r   Úlinesr   r   r   Útest_special_chars_bash_  s"   



ÿz!BasicTest.test_special_chars_bashc                 C   s  t | jƒ t d¡pt d¡}|du r|  d¡ d}tj tj | j¡|¡}t	j
dd}| |¡ tj || jd¡}tj | jd	¡}t|d
ƒ}| dt |¡› d¡ W d  ƒ n1 s^w   Y  t||gƒ\}}	| ¡ }
|  | ¡ |
d v ¡ |  |
d | ¡ ¡ dS )zJ
        Test that the template strings are quoted properly (csh)
        ZtcshÚcshNzcsh required for this testr¹   Trš   zactivate.cshztest_special_chars.cshr»   r¼   r½   r   rp   r¾   )r8   rÈ   rx   r,   ry   rº   rÅ   rK   r   r   rÆ   r   r   r   Útest_special_chars_cshy  s"   


ÿz BasicTest.test_special_chars_cshzonly relevant on Windowsc           
   
   C   sî   t | jƒ d}tj tj | j¡|¡}tjdd}| |¡ tj || j	d¡}tj | jd¡}t
|dƒ}| d|› d| j› d	| j› d
¡ W d  ƒ n1 sPw   Y  t|gƒ\}}| ¡ }	|  | ¡ |	d v ¡ |  |	d | ¡ ¡ dS )zO
        Test that the template strings are quoted properly on Windows
        z'&&^$eTrš   úactivate.batztest_special_chars.batr»   z@echo off
"z" & z* -c "import sys; print(sys.executable)" & z> -c "import os; print(os.environ['VIRTUAL_ENV'])" & deactivateNr   rp   )r   r,   r'   r(   rE   r)   rc   rs   rd   r.   rI   r’   r3   r   rÄ   rX   r‹   rR   )
r8   rx   r,   ry   rº   Z
test_batchrK   r   r   rÆ   r   r   r   Útest_special_chars_windows“  s(   

ÿþýÿz$BasicTest.test_special_chars_windowsc                 C   sŽ   t | jƒ tj tj | j¡d¡}tjdd}| |¡ tj || j	d¡}tj || j	| j
¡}t|d| j
ddgdd	\}}|  | ¡ d
¡ dS )z0
        Test handling of Unicode paths
        u   Ï¼ÑžÐ¢Î»Ð¤Ð™Trš   rÊ   ú&r…   zprint(0)ZoemrG   Ú0N)r   r,   r'   r(   rE   r)   rc   rs   rd   r.   r3   r   ru   rŠ   )r8   r,   ry   rº   rŒ   r   r   r   r   r   Útest_unicode_in_batch_fileª  s   


þz$BasicTest.test_unicode_in_batch_filec                 C   sh   t ƒ  t| jƒ |  tj| j¡ tj tj 	| j¡| j
| j¡}t|ddgƒ\}}|  | ¡ d ¡ ¡ dS )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()ZpythonN)r   r   r,   rD   rc   rd   r'   r(   rE   r)   r.   r3   r   ru   rŠ   r‹   r²   r   r   r   Útest_multiprocessing»  s   
ÿ
ÿzBasicTest.test_multiprocessingznot relevant on Windowsc                 C   sÒ   t  d¡}|d u r|  d¡ t| jƒ tjdd}| | j¡ tj	 
| j| jd¡}tj	 
| jd¡}t|dƒ}| d|› d	¡ W d   ƒ n1 sJw   Y  t||gƒ\}}|  |d
 ¡ ¡ |  |d
 ¡ ¡ d S )Nr·   r¸   Trš   rº   ztest_strict.shr»   zset -euo pipefail
source z
deactivate
Ú )r¿   rÀ   rÁ   r   r,   rc   rs   rd   r'   r(   rE   r.   rI   r’   r   ru   r‹   )r8   r·   ry   rº   rÅ   rK   r   r   r   r   r   Ú%test_deactivate_with_strict_bash_optsÐ  s    


ÿÿz/BasicTest.test_deactivate_with_strict_bash_optsr^   zonly relevant on macOSc                 C   sf   t | jƒ t ¡ }| | j¡ tj tj | j¡| j	| j
¡}t|ddgƒ\}}|  | ¡ d ¡ ¡ d S )Nr…   z5import os; print("__PYVENV_LAUNCHER__" in os.environ)ÚFalser´   rµ   r   r   r   Útest_macos_envã  s   
ÿ
ÿzBasicTest.test_macos_env)$rS   rT   rU   rV   rY   ro   r|   r„   ÚrequireVenvCreater   r/   r4   rœ   r0   r—   r   r    r¥   r¨   r¬   ÚunittestÚ
skipUnlessr   r¯   r³   r¶   ZskipIfr'   r-   rÇ   rÉ   rË   rÎ   rÏ   rÑ   rÓ   r   r   r   r   rW   ]   sT    

û	









rW   c                   @   s`   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Ze	j
dd„ ƒZe ed¡eƒ dd„ ƒƒZdS )ÚEnsurePipTestz%Test venv module installation of pip.c                 C   sd   t j t j | j¡| j| j¡}t|ddgƒ\}}| d¡}|  	|d¡ | d¡}|  	| 
¡ d¡ d S )Nr…   z1try:
 import pip
except ImportError:
 print("OK")úlatin-1rÐ   ZOK)r'   r(   rE   r)   r,   r.   r3   r   Údecoderu   rŠ   r²   r   r   r   Úassert_pip_not_installedò  s   ÿ
ÿ

z&EnsurePipTest.assert_pip_not_installedc                 C   s&   t | jƒ |  tj| j¡ |  ¡  d S r;   ©r   r,   rD   rc   rd   rÚ   r<   r   r   r   Útest_no_pip_by_defaultÿ  s   
z$EnsurePipTest.test_no_pip_by_defaultc                 C   s*   t | jƒ | jtj| jdd |  ¡  d S )NF)Úwith_piprÛ   r<   r   r   r   Útest_explicit_no_pip  s   
z"EnsurePipTest.test_explicit_no_pipc                 C   sT   t tjdƒ}|  | ¡ d¡ W d   ƒ n1 sw   Y  |  tj tj¡¡ d S )Nr™   r¢   )rI   r'   Údevnullru   rJ   rX   r(   r6   )r8   rK   r   r   r   Útest_devnull	  s   ÿzEnsurePipTest.test_devnullc                 C   s   t | jƒ tƒ ‚}d|d< d|d< t ¡ f}||d< d}d}d}|fD ]1\}}tj ||¡}	t |	¡ tj |	|¡}
t	|
d	ƒ}| 
|¡ W d   ƒ n1 sOw   Y  q#|  ¡  | jtj| j|d
d W d   ƒ n1 sow   Y  W d   ƒ n1 s~w   Y  W d   ƒ n1 sw   Y  tj tj | j¡| j| j¡}t|ddddddddg	ƒ\}}| d¡}|  |d¡ | d¡}d t ¡ ¡}|  |d t|ƒ… |¡ t | j¡ d¡}|  ||¡ tƒ /}|  ¡  d|d< t|dddddddgƒ\}}W d   ƒ n	1 sw   Y  W d   ƒ n	1 sw   Y  | d¡}tjdd|tjd}|  | ¡ d¡ | d¡}|  d|¡ |  d|¡ |sN|  ¡  d S d S )NÚignoreZPYTHONWARNINGSÚ1ZPIP_NO_INSTALLÚHOMEz[global]
no-install=1)r~   zpip.ini)z.pipzpip.confr»   T)rª   rÝ   z-Wzignore::DeprecationWarningzignore::ImportWarningz-Ir}   r~   z	--versionrØ   rÐ   zpip {}zensurepip._uninstallzl^(WARNING: )?The directory .* or its parent directory is not owned or is not writable by the current user.*$)ÚflagszSuccessfully uninstalled pipz#Successfully uninstalled setuptools) r   r,   r   r*   rƒ   r'   r(   rE   r‘   rI   r’   Únicer_errorrD   rc   rd   r)   r.   r3   r   rÙ   ru   ÚformatÚ	ensurepipÚversionÚlenÚfsencoderj   ÚreÚsubÚ	MULTILINEÚrstriprÚ   )r8   rª   ÚenvvarsZhome_dirZ
bad_configZwin_locationZposix_locationri   ZfnameÚdirpathZfpathrK   rŒ   r   r   Zexpected_versionr,   r   r   r   Údo_test_with_pip  s|   


ÿ€
þÿ€ï€ó#
þ


ýü€ÿ
þ
ÿzEnsurePipTest.do_test_with_pipc              
   c   sv    zdV  W dS  t jy: } z&|jpdjdd}|jpdjdd}|  |› d|› d|› ¡ W Y d}~dS d}~ww )zÄ
        Capture output from a failed subprocess for easier debugging.

        The output this handler produces can be a little hard to read,
        but at least it has all the details.
        Nr¢   Úreplace)Úerrorsz

**Subprocess Output**
z

**Subprocess Error**
)r   r   rB   rÙ   r   rO   )r8   Úexcr   r   r   r   r   rå   l  s   €ÿþÿ€ýzEnsurePipTest.nicer_errorzpip requires ctypesc                 C   s   |   d¡ |   d¡ d S )NFT)rñ   r<   r   r   r   Útest_with_pip€  s   
zEnsurePipTest.test_with_pipN)rS   rT   rU   rV   rÚ   rÜ   rÞ   rà   rñ   Ú
contextlibÚcontextmanagerrå   rÕ   rÖ   Úctypesr   rõ   r   r   r   r   r×   ï  s    
Y

r×   Ú__main__r;   )(rV   rö   rç   r'   Zos.pathrë   r¿   re   r   r/   r*   rÂ   Ztest.supportr   r   r   r   Ztest.support.os_helperr   r   r   rÕ   rc   Zunittest.mockr	   rø   ÚImportErrorrÖ   r†   rˆ   r1   r9   rÔ   r   ZTestCaser   rW   r×   rS   Úmainr   r   r   r   Ú<module>   sN    ÿ
ý
,    ÿ