a
    äzeX  ã                   @   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
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 )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 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                   @   sB   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S )ÚBaseTestzBase class for venv tests.i   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__Ú__doc__ZmaxDiffr;   r>   rE   rG   rN   r   r   r   r   r   0   s   r   c                	   @   sB  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rHd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/¡d0d1„ ƒZe e
jd2kd3¡d4d5„ ƒZ dS )6Ú	BasicTestzTest venv module functionality.c                 G   s    | j |Ž }|  tj |¡¡ d S r<   )rG   Ú
assertTruer(   r)   Úisdir)r9   rA   Úfnr   r   r   rU   [   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 )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-   rE   ÚvenvÚcreaterU   r/   r%   r"   rG   ÚstructÚcalcsizer(   r.   r0   r5   rT   r)   ÚislinkÚassertFalser7   rN   r2   ÚdirnameÚassertInr4   ÚprintÚlistdir)r9   r   Z
conditionsÚdatar:   r)   rV   Ú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é   r[   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   ÚassertEqualrm   ZassertNotInrf   ÚbasenameÚgetcwd)r9   Zenv_nameÚbuilderÚcontextri   Ú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!   rl   c              
      s2   t j | d ¡| d< ˆ | ˆ ddddddg¡ d S )Nr   ú-mÚpipÚinstallz	--upgradeZ
setuptools)r(   r)   Únormcaserq   )r   ©Z
expect_exer9   r   r   Úpip_cmd_checker¢   s    ùþz<BasicTest.test_upgrade_dependencies.<locals>.pip_cmd_checkerzvenv.subprocess.check_call)r_   ro   r0   r5   r(   r)   r3   r:   r+   ÚTemporaryDirectoryr{   rF   r*   rp   r
   Zupgrade_dependencies)r9   rt   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 )	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-   rE   r_   r`   r(   r)   rF   r/   r4   r0   rƒ   r„   r   rq   Ú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 )zn
        Create some files in the environment which are unrelated
        to the virtual environment.
        Úwbó   Still here?N)r(   r)   rF   r-   ÚmkdirrJ   Úwrite)r9   ÚpathsÚfilenameÚsubdirsÚdrV   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 )zE
        Test creating environment in an existing directory.
        Úfoo)r“   Úrbr‹   NT©Úclear)r’   ÚENV_SUBDIRSr_   r`   r-   r(   r)   rF   rT   r7   rJ   rq   rK   ro   rd   )r9   r   rV   rL   rt   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(   rh   r)   rF   rc   ÚisfileÚremoverU   r   )r9   r)   rV   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Ž   rV   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 )zC
        Test upgrading an existing environment directory.
        ©FT)Úupgrader\   r]   r^   N)r_   ro   rE   r`   r-   rU   r/   r%   r"   rG   r4   r(   r)   r7   rg   rh   rT   )r9   r¢   rt   rV   rj   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)r_   ro   r`   r-   rN   rf   )r9   ZsspÚsrt   ri   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 )z3
        Test symlinking works as expected
        r¡   T©r–   ÚsymlinksN)r_   ro   r`   r-   rG   r/   r4   r8   rd   r(   r)   rc   rT   )r9   Zuslrt   rV   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-   rE   r_   r`   r(   r)   rF   r*   r/   r4   r   rq   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 )r«   Tr¨   r€   r¬   N©r   r-   r_   ro   r`   r(   r)   rF   r*   r/   r4   r   rq   r…   r†   ©r9   rt   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 )z0
        Test handling of Unicode paths
        u   Ï¼ÑžÐ¢Î»Ð¤Ð™Tr•   zactivate.batú&r€   zprint(0)ZoemrH   Ú0N)r   r-   r(   r)   rF   r*   r_   ro   r`   r/   r4   r   rq   r…   )r9   r-   rt   Ú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 )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-   rE   r_   r`   r(   r)   rF   r*   r/   r4   r   rq   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_   ro   r`   r(   r)   rF   r/   rJ   r   r   rq   r†   )r9   r·   rt   r´   Ztest_scriptrL   r   r   r   r   r   Ú%test_deactivate_with_strict_bash_opts  s    


ÿ(z/BasicTest.test_deactivate_with_strict_bash_optsrZ   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   rR   rU   rk   rw   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   rS   X   sF   

û	






rS   c                   @   sR   e Zd 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 )Ú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)   rF   r*   r-   r/   r4   r   Údecoderq   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(   Údevnullrq   rK   rT   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)ry   zpip.ini)z.pipzpip.confr¸   T)r¥   rÈ   Úreplace)Úerrorsz{}

**Subprocess Output**
{}z-Wzignore::DeprecationWarningz-Irx   ry   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   rq   Ú	ensurepipÚversionÚlenÚfsencoderf   ÚreÚsubÚ	MULTILINEÚrstriprÅ   )r9   r¥   ÚenvvarsZhome_dirZ
bad_configZwin_locationZposix_locationre   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   rR   rÅ   rÇ   rÉ   rË   rß   rÀ   rÁ   Úctypesr   rà   r   r   r   r   rÂ   ž  s   
Z
rÂ   Ú__main__)N)&rR   rÓ   r(   Zos.pathr×   rº   ra   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   rS   rÂ   rO   Úmainr   r   r   r   Ú<module>   s@   (

ý
(  H 
