a
     Rîh’f  ã                   @   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
mZmZmZmZmZ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y¶   dZY n0 e ejejkpÒe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 )é    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 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   ú6/opt/python-3.9.24/usr/lib/python3.9/test/test_venv.pyÚcheck_output&   s    ý
ÿr   c                   @   sF   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r0d| _d| _d| _	n$d| _ddt
jd d…  f| _d	| _	t
j}t j |¡d
 | _t
jdkr–t j |¡r–t j |¡s–d| _n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-   ©r9   r   r   r   ÚtearDownH   s    zBaseTest.tearDownc              	   O   sj   t ƒ D}tƒ }||i |¤Ž W d   ƒ n1 s20    Y  W d   ƒ n1 sP0    Y  | ¡ | ¡ fS r<   )r   r   Úgetvalue)r9   ÚfuncÚargsÚkwargsÚoutputÚerrorr   r   r   Úrun_with_captureK   s    JzBaseTest.run_with_capturec                 G   s   t jj| jg|¢R Ž S r<   )r(   r)   Újoinr-   )r9   rA   r   r   r   Úget_env_fileQ   s    zBaseTest.get_env_filezutf-8©r   c                G   s@   t | j|Ž d|d}| ¡ }W d   ƒ n1 s20    Y  |S )NÚrrH   )ÚopenrG   Úread)r9   r   rA   ÚfÚresultr   r   r   Úget_text_file_contentsT   s    &zBaseTest.get_text_file_contentsc                 C   s$   |  |¡s |  d|›d|›¡ d S )NzString z does not end with )ÚendswithÚfail)r9   ÚstringÚtailr   r   r   ÚassertEndsWithY   s    
zBaseTest.assertEndsWithN)
Ú__name__Ú
__module__Ú__qualname__ZmaxDiffr;   r>   rE   rG   rN   rS   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rDdZn4d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<   )rG   Ú
assertTruer(   r)   Úisdir)r9   rA   Úfnr   r   r   rY   `   s    
zBasicTest.isdirc                 C   s$  t | jƒ |  tj| j¡ |  | j¡ |  | j¡ | j| jŽ  |  	d¡}t
 d¡dkohtjdkohtjdk}|r‚|  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-   rE   ÚvenvÚcreaterY   r/   r%   r"   rG   ÚstructÚcalcsizer(   r.   r0   r5   rX   r)   ÚislinkÚassertFalser7   rN   r2   ÚdirnameÚassertInr4   ÚprintÚlistdir)r9   r   Z
conditionsÚdatar:   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)   r3   r-   r   rc   Ú
EnvBuilderrE   rd   Úensure_directoriesrN   ÚassertEqualrq   ZassertNotInrj   ÚbasenameÚgetcwd)r9   Ú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 	¡ ’}tj 
tj |||¡¡‰ tjdkrltj 
tj ˆ ¡¡‰ ‡ ‡fdd„}| |¡}td|ƒ | |¡ W d   ƒ n1 s®0    Y  W d   ƒ n1 sÌ0    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   ©Z
expect_exer9   r   r   Úpip_cmd_checker§   s    ùþz<BasicTest.test_upgrade_dependencies.<locals>.pip_cmd_checkerzvenv.subprocess.check_call)rc   rs   r0   r5   r(   r)   r3   r:   r+   ÚTemporaryDirectoryr€   rF   r*   rt   r
   Zupgrade_dependencies)r9   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 ]4\}}d| |d< t|ƒ\}}|  | ¡ | ¡ ¡ q^d S )Nú-cÚprefixÚexec_prefixÚbase_prefixÚbase_exec_prefixzimport sys; print(sys.%s)r$   )r   r-   rE   rc   rd   r(   r)   rF   r/   r4   r0   rˆ   r‰   r   ru   ÚstripÚencode)r9   Ú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 ]f}t jj| jg|¢R Ž }t  |¡ t j ||¡}t|dƒ}| d¡ W d   ƒ q1 s`0    Y  qd S )NÚwbó   Still here?)r(   r)   rF   r-   ÚmkdirrJ   Úwrite)r9   ÚpathsÚfilenameÚsubdirsÚdrZ   rL   r   r   r   Úcreate_contentsÝ   s    
zBasicTest.create_contentsc              	   C   sà   |   | jd¡ t | j¡ | jD ]j}tjj| jg|d ¢R Ž }|  tj 	|¡¡ t
|dƒ }|  | ¡ d¡ W d   ƒ q 1 s€0    Y  q tjdd}| | j¡ | jD ]0}tjj| jg|d ¢R Ž }|  tj 	|¡¡ qªd S )NÚfoo)r˜   Úrbr   T©Úclear)r—   ÚENV_SUBDIRSrc   rd   r-   r(   r)   rF   rX   r7   rJ   ru   rK   rs   rh   )r9   r•   rZ   rL   ry   r   r   r   Útest_overwrite_existingé   s    
0
z!BasicTest.test_overwrite_existingc                 C   sZ   t  |¡D ]J}t j ||¡}t j |¡s4t j |¡r@t  |¡ q
t j |¡r
t|ƒ q
d S r<   )	r(   rl   r)   rF   rg   ÚisfileÚremoverY   r   )r9   r)   rZ   r   r   r   Úclear_directoryû   s    zBasicTest.clear_directoryc              	   C   s„   | j d d… D ]p}tjj| jg|¢R Ž }t|dƒ}| d¡ W d   ƒ n1 sR0    Y  |  tt	ft
j| j¡ |  | j¡ qd S )Né   r   ó    )rœ   r(   r)   rF   r-   rJ   r’   ZassertRaisesÚ
ValueErrorÚOSErrorrc   rd   r    )r9   r“   rZ   rL   r   r   r   Útest_unoverwritable_fails  s    (z#BasicTest.test_unoverwritable_failsc                 C   s¬   dD ]¢}t j|d}|  |j| j¡ |  | j¡ |  | j¡ | j| jŽ  |  	| j| j
¡}tj |¡sŽ|  	| j¡}td| ƒ tdt |¡ ƒ |  tj |¡d| ¡ qd S )N©FT)Úupgrader`   ra   rb   )rc   rs   rE   rd   r-   rY   r/   r%   r"   rG   r4   r(   r)   r7   rk   rl   rX   )r9   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 )N))TÚtrue)FZfalseT)r›   Úsystem_site_packagesr_   z"include-system-site-packages = %s
)rc   rs   rd   r-   rN   rj   )r9   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¡}|r| jrP|  t	j
 |¡¡ q|  t	j
 |¡¡ qd S )Nr¦   T©r›   Úsymlinks)rc   rs   rd   r-   rG   r/   r4   r8   rh   r(   r)   rg   rX   )r9   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 )Nr…   ú!import sys; print(sys.executable))r   r-   rE   rc   rd   r(   r)   rF   r*   r/   r4   r   ru   rŠ   r‹   ©r9   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 )NTr­   r…   r°   ©r   r-   rc   rs   rd   r(   r)   rF   r*   r/   r4   r   ru   rŠ   r‹   ©r9   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 s²0    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   rp   ©r   r-   ÚshutilÚwhichÚskipTestr(   r)   rF   r*   rc   rs   rd   r/   rJ   r’   ÚshlexÚquoter   Ú
splitlinesrX   r‹   rS   )r9   r¶   rx   r-   ry   r¹   Útest_scriptrL   r   r   Úlinesr   r   r   Útest_special_chars_bash_  s     



6z!BasicTest.test_special_chars_bashc                 C   s  t | jƒ t d¡pt d¡}|d u r0|  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¼0    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   rp   r½   )r9   rÇ   rx   r-   ry   r¹   rÄ   rL   r   r   rÅ   r   r   r   Útest_special_chars_cshy  s     


6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ƒ2}| d|› d| j› d	| j› d
¡ W d   ƒ n1 s 0    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   rp   )r   r-   r(   r)   rF   r*   rc   rs   rd   r/   rJ   r’   r4   r   rÃ   rX   r‹   rS   )
r9   rx   r-   ry   r¹   Z
test_batchrL   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oemrH   Ú0)r   r-   r(   r)   rF   r*   rc   rs   rd   r/   r4   r   ru   rŠ   )r9   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 )Nr…   zrfrom multiprocessing import Pool; pool = Pool(1); print(pool.apply_async("Python".lower).get(3)); pool.terminate()Zpython)r	   r   r-   rE   rc   rd   r(   r)   rF   r*   r/   r4   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 s”0    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)   rF   r/   rJ   r’   r   ru   r‹   )r9   r¶   ry   r¹   rÄ   rL   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)#rT   rU   rV   rY   ro   r|   r„   ÚrequireVenvCreater   r0   r5   rœ   r1   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   ]   sP   

û	









rW   c                   @   sN   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Z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)   rF   r*   r-   r/   r4   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-   rE   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 s20    Y  |  tj tj¡¡ d S )Nr™   r¢   )rJ   r(   Údevnullru   rK   rX   r)   r7   )r9   rL   r   r   r   Útest_devnull	  s    .zEnsurePipTest.test_devnullc                 C   s’  t | jƒ tƒ 0}d|d< d|d< t ¡ ö}||d< d}d}d}|fD ]b\}}tj ||¡}	t |	¡ tj |	|¡}
t	|
d	ƒ}| 
|¡ W d   ƒ qH1 s 0    Y  qHz| jtj| j|d
d W nL tjy } z0|jjdd}d}|  | ||¡¡ W Y d }~n
d }~0 0 W d   ƒ n1 s*0    Y  W d   ƒ n1 sJ0    Y  tj tj | j¡| j| j¡}t|ddddddgƒ\}}| d¡}|  |d¡ | d¡}d t ¡ ¡}|  |d t|ƒ… |¡ t | j¡ d¡}|  ||¡ tƒ (}t|dddddgƒ\}}W d   ƒ n1 s&0    Y  | d¡}tjdd|tj d}|  | !¡ d¡ | d¡}|  d|¡ |  d|¡ |sŽ|  "¡  d S )NÚeZPYTHONWARNINGSÚ1ZPIP_NO_INSTALLÚHOMEz[global]
no-install=1)r~   zpip.ini)z.pipzpip.confrº   T)rª   rÜ   Úreplace)Úerrorsz{}

**Subprocess Output**
{}z-Wzignore::DeprecationWarningz-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)   rF   r‘   rJ   r’   rE   rc   rd   r   r   rC   rØ   rP   Úformatr*   r/   r4   r   ru   Ú	ensurepipÚversionÚlenÚfsencoderj   ÚreÚsubÚ	MULTILINEÚrstriprÙ   )r9   rª   ÚenvvarsZhome_dirZ
bad_configZwin_locationZposix_locationri   ZfnameÚdirpathZfpathrL   ÚexcÚdetailsÚmsgrŒ   r   r   Zexpected_versionr-   r   r   r   Údo_test_with_pip  sf    



*þ
h
ÿ


þ*
þ
zEnsurePipTest.do_test_with_pipzpip requires ctypesc                 C   s   |   d¡ |   d¡ d S )NFT)rô   r=   r   r   r   Útest_with_pipm  s    
zEnsurePipTest.test_with_pipN)rT   rU   rV   rÙ   rÛ   rÝ   rß   rô   rÔ   rÕ   Úctypesr   rõ   r   r   r   r   rÖ   ï  s   
Z
rÖ   Ú__main__)N)&rç   r(   Zos.pathrë   r¾   re   r   r0   r+   rÁ   Ztest.supportr   r   r   r   r   r   r   r	   rÔ   rc   Zunittest.mockr
   rö   ÚImportErrorrÕ   r†   rˆ   r2   r:   rÓ   r   ZTestCaser   rW   rÖ   rT   Úmainr   r   r   r   Ú<module>   sB   (

ý
,    
