a
    äzeX  ã                   @   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	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   ú$/usr/lib/python3.9/test/test_venv.pyÚcheck_output%   s    ý
ÿr   c                   @   s>   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
dœ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   ÚsetUp4   s"    


ÿ
þzBaseTest.setUpc                 C   s   t | jƒ d S ©N)r   r-   ©r9   r   r   r   ÚtearDownG   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_captureJ   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_fileP   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_contentsS   s    &zBaseTest.get_text_file_contentsN)	Ú__name__Ú
__module__Ú__qualname__ZmaxDiffr;   r>   rE   rG   rN   r   r   r   r   r   0   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d,d-„ ƒZe ejd(kd.¡d/d0„ ƒZe e	j
d1kd2¡d3d4„ ƒZdS )5Ú	BasicTestc                 G   s    | j |Ž }|  tj |¡¡ d S r<   )rG   Ú
assertTruer(   r)   Úisdir)r9   rA   Úfnr   r   r   rT   [   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ÚcreaterT   r/   r%   r"   rG   ÚstructÚcalcsizer(   r.   r0   r5   rS   r)   ÚislinkÚassertFalser7   rN   r2   ÚdirnameÚassertInr4   ÚprintÚlistdir)r9   r   Z
conditionsÚdatar:   r)   rU   Úbdr   r   r   Útest_defaults_   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é   rZ   z(%s) z	prompt = z	My prompt)Úpromptz(My prompt) zprompt = 'My prompt'
Ú.zprompt = '%s'
)r(   r)   r3   r-   r   r^   Ú
EnvBuilderrE   r_   Úensure_directoriesrN   ÚassertEqualrl   ZassertNotInre   ÚbasenameÚgetcwd)r9   Zenv_nameÚbuilderÚcontextrh   Ú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!   rk   c              
      s2   t j | d ¡| d< ˆ | ˆ ddddddg¡ d S )Nr   ú-mÚpipÚinstallz	--upgradeZ
setuptools)r(   r)   Únormcaserp   )r   ©Z
expect_exer9   r   r   Úpip_cmd_checker¢   s    ùþz<BasicTest.test_upgrade_dependencies.<locals>.pip_cmd_checkerzvenv.subprocess.check_call)r^   rn   r0   r5   r(   r)   r3   r:   r+   ÚTemporaryDirectoryrz   rF   r*   ro   r
   Zupgrade_dependencies)r9   rs   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   r^   r_   r(   r)   rF   r/   r4   r0   r‚   rƒ   r   rp   Ú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ÚdrU   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_SUBDIRSr^   r_   r-   r(   r)   rF   rS   r7   rJ   rp   rK   rn   rc   )r9   r   rU   rL   rs   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(   rg   r)   rF   rb   ÚisfileÚremoverT   r   )r9   r)   rU   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ÚOSErrorr^   r_   rš   )r9   r   rU   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[   r\   r]   )r^   rn   rE   r_   r-   rT   r/   r%   r"   rG   r4   r(   r)   r7   rf   rg   rS   )r9   r¡   rs   rU   ri   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_packagesrZ   z"include-system-site-packages = %s
)r^   rn   r_   r-   rN   re   )r9   ZsspÚsrs   rh   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)r^   rn   r_   r-   rG   r/   r4   r8   rc   r(   r)   rb   rS   )r9   Zuslrs   rU   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   r^   r_   r(   r)   rF   r*   r/   r4   r   rp   r„   r…   ©r9   r†   r   r   r   r   r   Útest_executable>  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-   r^   rn   r_   r(   r)   rF   r*   r/   r4   r   rp   r„   r…   ©r9   rs   r†   r   r   r   r   r   Útest_executable_symlinksK  s    
ÿÿ
z"BasicTest.test_executable_symlinksr   zonly relevant on 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”   zactivate.batú&r   zprint(0)ZoemrH   Ú0)r   r-   r(   r)   rF   r*   r^   rn   r_   r/   r4   r   rp   r„   )r9   r-   rs   Úactivater†   r   r   r   r   r   Útest_unicode_in_batch_fileY  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   r^   r_   r(   r)   rF   r*   r/   r4   r   rp   r„   r…   r«   r   r   r   Útest_multiprocessingj  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 )NÚbashzbash required for this testTr”   r²   ztest_strict.shÚwzset -euo pipefail
source z
deactivate
Ú )ÚshutilÚwhichZskipTestr   r-   r^   rn   r_   r(   r)   rF   r/   rJ   rŒ   r   rp   r…   )r9   rµ   rs   r²   Ztest_scriptrL   r   r   r   r   r   Ú%test_deactivate_with_strict_bash_opts  s    


ÿ(z/BasicTest.test_deactivate_with_strict_bash_optsrY   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) rO   rP   rQ   rT   rj   rv   r~   ÚrequireVenvCreater‡   r0   r5   r–   r1   r‘   r—   rš   rŸ   r¢   r¦   ÚunittestÚ
skipUnlessr   r©   r¬   r¯   r(   r.   r³   r´   ZskipIfrº   r¼   r   r   r   r   rR   X   sD   

û	






rR   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   Údecoderp   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   r^   r_   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(   Údevnullrp   rK   rS   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)rx   zpip.ini)z.pipzpip.confr¶   T)r¤   rÆ   Úreplace)Úerrorsz{}

**Subprocess Output**
{}z-Wzignore::DeprecationWarningz-Irw   rx   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   r^   r_   r   r   rC   rÂ   ZfailÚformatr*   r/   r4   r   rp   Ú	ensurepipÚversionÚlenÚfsencodere   ÚreÚsubÚ	MULTILINEÚrstriprÃ   )r9   r¤   ÚenvvarsZhome_dirZ
bad_configZwin_locationZposix_locationrd   ZfnameÚdirpathZfpathrL   ÚexcZ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_pip  s    
zEnsurePipTest.test_with_pipN)rO   rP   rQ   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¸   r`   r   r0   r+   Ztest.supportr   r   r   r   r   r   r   r	   r¾   r^   Zunittest.mockr
   rß   ÚImportErrorr¿   r€   r‚   r2   r:   r½   r   ZTestCaser   rR   rÀ   rO   Úmainr   r   r   r   Ú<module>   s>   (

ý
(  H 
