o
    IXîhi  ã                   @   s>  	 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yb   dZY nw e ejejkppe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re &¡  dS dS )é    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                   @   sH   e 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 )ÚBaseTesti   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__ZmaxDiffr:   r=   rD   rF   rM   rR   r   r   r   r   r   1   s    r   c                	   @   sŽ  e 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.¡d/d0„ ƒZe ejd(kd.¡d1d2„ ƒZed3d4„ ƒZ e ejd(kd5¡d6d7„ ƒZ!e e	j
d8kd9¡d:d;„ ƒZ"dS )<Ú	BasicTestc                 G   s    | j |Ž }|  tj |¡¡ d S r;   )rF   Ú
assertTruer'   r(   Úisdir)r8   r@   Úfnr   r   r   rX   `   s   
zBasicTest.isdirc                 C   s$  	 t | jƒ |  tj| j¡ |  | j¡ |  | j¡ | j| jŽ  |  	d¡}t
 d¡dko5tjdko5tjdk}|rB|  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 )NZlib64ÚPé   ÚposixÚdarwinú
pyvenv.cfgz	home = %súContents of %r:ú    %rúFile %r should exist.)r   r,   rD   ÚvenvÚcreaterX   r.   r$   r!   rF   ÚstructÚcalcsizer'   r-   r/   r4   rW   r(   ÚislinkÚassertFalser6   rM   r1   ÚdirnameÚassertInr3   ÚprintÚlistdir)r8   r   Z
conditionsÚdatar9   r(   rY   Ú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   rb   Ú
EnvBuilderrD   rc   Úensure_directoriesrM   ÚassertEqualrp   ZassertNotInri   ÚbasenameÚgetcwd)r8   Úenv_nameÚbuilderÚcontextrl   Ú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    ro   c              
      s2   t j | d ¡| d< ˆ | ˆ ddddddg¡ d S )Nr   ú-mÚpipÚinstallz	--upgradeZ
setuptools)r'   r(   Únormcasert   )r   rA   ©Z
expect_exer8   r   r   Úpip_cmd_checker§   s   ùþz<BasicTest.test_upgrade_dependencies.<locals>.pip_cmd_checkerzvenv.subprocess.check_output)rb   rr   r/   r4   r'   r(   r2   r9   r*   ÚTemporaryDirectoryr   rE   r)   rs   r	   Zupgrade_dependencies)r8   rx   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|ƒ\}}|  | ¡ | ¡ ¡ q0d S )Nú-cÚprefixÚexec_prefixÚbase_prefixÚbase_exec_prefixzimport sys; print(sys.%s)r#   )r   r,   rD   rb   rc   r'   r(   rE   r.   r3   r/   r‡   rˆ   r   rt   Ú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   sr   	 |D ]3}t jj| jg|¢R Ž }t  |¡ t j ||¡}t|dƒ}| d¡ W d   ƒ n1 s1w   Y  qd S )NÚwbó   Still here?)r'   r(   rE   r,   ÚmkdirrI   Úwrite)r8   ÚpathsÚfilenameÚsubdirsÚdrY   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 sAw   Y  qtjdd}| | j¡ | jD ]}tjj| jg|d ¢R Ž }|  tj 	|¡¡ qVd S )NÚfoo)r—   Úrbr   T©Úclear)r–   ÚENV_SUBDIRSrb   rc   r,   r'   r(   rE   rW   r6   rI   rt   rJ   rr   rg   )r8   r”   rY   rK   rx   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'   rk   r(   rE   rf   ÚisfileÚremoverX   r   )r8   r(   rY   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ÚOSErrorrb   rc   rŸ   )r8   r’   rY   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 |¡sH|  	| j¡}td| ƒ tdt |¡ ƒ |  tj |¡d| ¡ qd S )N©FT)Úupgrader_   r`   ra   )rb   rr   rD   rc   r,   rX   r.   r$   r!   rF   r3   r'   r(   r6   rj   rk   rW   )r8   r¦   rx   rY   rm   r   r   r   Útest_upgrade  s   ôzBasicTest.test_upgradec                 C   sH   	 dD ]\}}t jd|d}| | j¡ |  d¡}|  d| |¡ qd S )N))TÚtrue)FZfalseT)rš   Úsystem_site_packagesr^   z"include-system-site-packages = %s
)rb   rr   rc   r,   rM   ri   )r8   ZsspÚsrx   rl   r   r   r   Útest_isolation!  s   
üzBasicTest.test_isolationzNeeds symlinksc                 C   sj   	 dD ]/}t jd|d}| | j¡ |  | j| j¡}|r2| jr)|  t	j
 |¡¡ q|  t	j
 |¡¡ qd S )Nr¥   T©rš   Úsymlinks)rb   rr   rc   r,   rF   r.   r3   r7   rg   r'   r(   rf   rW   )r8   Zuslrx   rY   r   r   r   Útest_symlinking+  s   €ózBasicTest.test_symlinkingc                 C   sd   	 t | jƒ |  tj| j¡ tj tj | j¡| j	| j
¡}t|ddgƒ\}}|  | ¡ | ¡ ¡ d S )Nr„   ú!import sys; print(sys.executable))r   r,   rD   rb   rc   r'   r(   rE   r)   r.   r3   r   rt   r‰   rŠ   ©r8   r‹   r   r   r   r   r   Útest_executableC  s   
ÿ
ÿzBasicTest.test_executablec                 C   sn   	 t | jƒ tjddd}| | j¡ tj tj | j¡| j	| j
¡}t|ddgƒ\}}|  | ¡ | ¡ ¡ d S )NTr¬   r„   r¯   ©r   r,   rb   rr   rc   r'   r(   rE   r)   r.   r3   r   rt   r‰   rŠ   ©r8   rx   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 sZw   Y  t||gƒ\}}	| ¡ }
|  | ¡ |
d v ¡ |  |
d | ¡ ¡ d S )NÚbashú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   ro   ©r   r,   ÚshutilÚwhichÚskipTestr'   r(   rE   r)   rb   rr   rc   r.   rI   r‘   ÚshlexÚquoter   Ú
splitlinesrW   rŠ   rR   )r8   rµ   rw   r,   rx   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 )NZtcshÚcshzcsh required for this testr·   Tr™   zactivate.cshztest_special_chars.cshr¹   rº   r»   r   ro   r¼   )r8   rÆ   rw   r,   rx   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 sQw   Y  t|gƒ\}}| ¡ }	|  | ¡ |	d v ¡ |  |	d | ¡ ¡ d S )Nz'&&^$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'])" & deactivater   ro   )r   r,   r'   r(   rE   r)   rb   rr   rc   r.   rI   r‘   r3   r   rÂ   rW   rŠ   rR   )
r8   rw   r,   rx   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 )Nu   Ï¼ÑžÐ¢Î»Ð¤Ð™Tr™   rÈ   ú&r„   zprint(0)ZoemrG   Ú0)r   r,   r'   r(   rE   r)   rb   rr   rc   r.   r3   r   rt   r‰   )r8   r,   rx   r¸   r‹   r   r   r   r   r   Útest_unicode_in_batch_fileª  s   


þz$BasicTest.test_unicode_in_batch_filec                 C   sj   	 t ƒ  t| jƒ |  tj| j¡ tj tj 	| j¡| j
| j¡}t|ddgƒ\}}|  | ¡ d ¡ ¡ d S )Nr„   zrfrom multiprocessing import Pool; pool = Pool(1); print(pool.apply_async("Python".lower).get(3)); pool.terminate()Zpython)r   r   r,   rD   rb   rc   r'   r(   rE   r)   r.   r3   r   rt   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,   rb   rr   rc   r'   r(   rE   r.   rI   r‘   r   rt   rŠ   )r8   rµ   rx   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   rX   rn   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   rV   ]   sT    

û	









rV   c                   @   s^   e 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 )ÚEnsurePipTestc                 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   Údecodert   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   rb   rc   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'   Údevnullrt   rJ   rW   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   rb   rc   r)   r.   r3   r   r×   rt   ÚformatÚ	ensurepipÚversionÚlenÚfsencoderi   ÚreÚsubÚ	MULTILINEÚrstriprØ   )r8   r©   ÚenvvarsZhome_dirZ
bad_configZwin_locationZposix_locationrh   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   sx    	 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 )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   rØ   rÚ   rÜ   rÞ   rï   Ú
contextlibÚcontextmanagerrã   rÓ   rÔ   Úctypesr   ró   r   r   r   r   rÕ   ï  s    
Y

rÕ   Ú__main__r;   )'rô   rå   r'   Zos.pathré   r½   rd   r   r/   r*   rÀ   Ztest.supportr   r   r   r   Ztest.support.os_helperr   r   r   rÓ   rb   Zunittest.mockr	   rö   ÚImportErrorrÔ   r…   r‡   r1   r9   rÒ   r   ZTestCaser   rV   rÕ   rS   Úmainr   r   r   r   Ú<module>   sN    ÿ
ý
,    ÿ