B
    18™\"H  ã               @   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	m
Z
mZmZmZmZmZ ddlZddlZddlZyddlZW n ek
r    dZY nX e 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ÚrmtreezTest not appropriate in a venvc             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   úR/oak/stanford/groups/akundaje/marinovg/programs/Python-3.7.3/Lib/test/test_venv.pyÚcheck_output   s    r   c               @   s<   e Zd ZdZdZdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Z	dS )ÚBaseTestzBase class for venv tests.i   c             C   sx   t j t ¡ ¡| _t jdkr0d| _d| _d| _	n$d| _ddt
jd d…  f| _d	| _	tt
d
t
jƒ}t j |¡d | _d S )NÚntÚScripts)ÚLibÚIncludeÚbinÚlibzpython%d.%dé   ÚincludeÚ_base_executableéÿÿÿÿ)ÚosÚpathÚrealpathÚtempfileÚmkdtempÚenv_dirÚnameÚbindirr   r    ÚsysÚversion_infoÚgetattrÚ
executableÚsplitÚexe)Úselfr.   r   r   r   ÚsetUp-   s    
zBaseTest.setUpc             C   s   t | jƒ d S )N)r   r(   )r1   r   r   r   ÚtearDown:   s    zBaseTest.tearDownc          
   O   s>   t ƒ "}tƒ }|||Ž W d Q R X W d Q R X | ¡ | ¡ fS )N)r   r   Úgetvalue)r1   ÚfuncÚargsÚkwargsÚoutputÚerrorr   r   r   Úrun_with_capture=   s    zBaseTest.run_with_capturec             G   s   t jj| jf|žŽ S )N)r#   r$   Újoinr(   )r1   r6   r   r   r   Úget_env_fileC   s    zBaseTest.get_env_filec          	   G   s(   t | j|Ž dƒ}| ¡ }W d Q R X |S )NÚr)Úopenr<   Úread)r1   r6   ÚfÚresultr   r   r   Úget_text_file_contentsF   s    zBaseTest.get_text_file_contentsN)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚmaxDiffr2   r3   r:   r<   rB   r   r   r   r   r   )   s   r   c            	   @   s  e Zd ZdZdd„ Zdd„ Zdd„ Zedd	„ ƒZe	j
d
kr@d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d+d,„ ZdS )-Ú	BasicTestzTest venv module functionality.c             G   s    | j |Ž }|  tj |¡¡ d S )N)r<   Ú
assertTruer#   r$   Úisdir)r1   r6   Úfnr   r   r   rJ   N   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t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Údarwinz
pyvenv.cfgr!   z	home = %szContents of %r:z    %rzFile %r should exist.N)r   r(   r:   ÚvenvÚcreaterJ   r*   r    r   r<   ÚstructÚcalcsizer#   r)   r+   ÚplatformrI   r$   ÚislinkÚassertFalseÚexistsrB   r-   r.   ÚdirnameÚassertInr0   ÚprintÚlistdir)r1   r   Z
conditionsÚdatar.   r$   rK   Úbdr   r   r   Útest_defaultsR   s*    



zBasicTest.test_defaultsc             C   sb   t j | j¡d }t ¡ }| | j¡}|  |jd| ¡ tjdd}| | j¡}|  |jd¡ d S )Né   z(%s) z	My prompt)Úpromptz(My prompt) )	r#   r$   r/   r(   rP   Ú
EnvBuilderZensure_directoriesÚassertEqualr`   )r1   Zenv_nameÚbuilderÚcontextr   r   r   Útest_promptn   s    zBasicTest.test_promptc             C   s¼   |   tjtj¡ |   tjtj¡ t| jƒ |  t	j
| j¡ tj | j| j| j¡}|ddg}x\d| jfd| jfdtjfdtjffD ]4\}}d| |d< t|ƒ\}}|   | ¡ | ¡ ¡ q€W dS )z>
        Test that the prefix values are as expected.
        z-cNÚprefixÚbase_prefixÚbase_exec_prefixzimport sys; print(sys.%s)r   )rb   r+   rg   rf   rh   Úexec_prefixr   r(   r:   rP   rQ   r#   r$   r;   r*   r0   r   ÚstripÚencode)r1   Úenvpyr   rf   Úexpectedr   r   r   r   r   Útest_prefixesy   s    

zBasicTest.test_prefixesÚwin32))r   )r   )r   )r   zsite-packages)r   )r    )r   r   zpython%d.%dNr   zsite-packagesc          
   C   s^   xX|D ]P}t jj| jf|žŽ }t  |¡ t j ||¡}t|dƒ}| d¡ W dQ R X qW dS )zn
        Create some files in the environment which are unrelated
        to the virtual environment.
        Úwbs   Still here?N)r#   r$   r;   r(   Úmkdirr>   Úwrite)r1   ÚpathsÚfilenameÚsubdirsÚdrK   r@   r   r   r   Úcreate_contents    s    

zBasicTest.create_contentsc          
   C   sÐ   |   | jd¡ t | j¡ x^| jD ]T}tjj| jf|d žŽ }|  tj 	|¡¡ t
|dƒ}|  | ¡ d¡ W dQ R X q"W tjdd}| | j¡ x8| jD ].}tjj| jf|d žŽ }|  tj 	|¡¡ qšW dS )zE
        Test creating environment in an existing directory.
        Úfoo)rx   Úrbs   Still here?NT)Úclear)rw   ÚENV_SUBDIRSrP   rQ   r(   r#   r$   r;   rI   rW   r>   rb   r?   ra   rV   )r1   ru   rK   r@   rc   r   r   r   Útest_overwrite_existing¬   s    z!BasicTest.test_overwrite_existingc             C   s^   xXt  |¡D ]J}t j ||¡}t j |¡s6t j |¡rBt  |¡ qt j |¡rt|ƒ qW d S )N)	r#   r[   r$   r;   rU   ÚisfileÚremoverJ   r   )r1   r$   rK   r   r   r   Úclear_directory¾   s    zBasicTest.clear_directoryc          
   C   sr   xl| j d d… D ]Z}tjj| jf|žŽ }t|dƒ}| d¡ W d Q R X |  tt	ft
j| j¡ |  | j¡ qW d S )Né   rp   ó    )r{   r#   r$   r;   r(   r>   rr   ÚassertRaisesÚ
ValueErrorÚOSErrorrP   rQ   r   )r1   rs   rK   r@   r   r   r   Útest_unoverwritable_failsÆ   s    z#BasicTest.test_unoverwritable_failsc             C   s°   xª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W dS )zC
        Test upgrading an existing environment directory.
        )FT)ÚupgradezContents of %r:z    %rzFile %r should exist.N)rP   ra   r:   rQ   r(   rJ   r*   r    r   r<   r0   r#   r$   rW   rZ   r[   rI   )r1   r†   rc   rK   r]   r   r   r   Útest_upgradeÏ   s    
zBasicTest.test_upgradec             C   sJ   xDdD ]<\}}t jd|d}| | j¡ |  d¡}|  d| |¡ qW dS )z:
        Test isolation from system site-packages
        ))TÚtrue)FÚfalseT)rz   Úsystem_site_packagesz
pyvenv.cfgz"include-system-site-packages = %s
N)rP   ra   rQ   r(   rB   rY   )r1   ZsspÚsrc   r\   r   r   r   Útest_isolationä   s
    
zBasicTest.test_isolationzNeeds symlinksc             C   sR   xLdD ]D}t jd|d}| | j¡ |  | j| j¡}|r|  tj	 
|¡¡ qW dS )z3
        Test symlinking works as expected
        )FTT)rz   ÚsymlinksN)rP   ra   rQ   r(   r<   r*   r0   rI   r#   r$   rU   )r1   Zuslrc   rK   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 )zD
        Test that the sys.executable value is as expected.
        z-cz!import sys; print(sys.executable)N)r   r(   r:   rP   rQ   r#   r$   r;   r%   r*   r0   r   rb   rj   rk   )r1   rl   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 )zD
        Test that the sys.executable value is as expected.
        T)rz   r   z-cz!import sys; print(sys.executable)N)r   r(   rP   ra   rQ   r#   r$   r;   r%   r*   r0   r   rb   rj   rk   )r1   rc   rl   r   r   r   r   r   Útest_executable_symlinks  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   Ï¼ÑžÐ¢Î»Ð¤Ð™T)rz   zactivate.batú&z-czprint(0)Zoem)r
   Ú0N)r   r(   r#   r$   r;   r%   rP   ra   rQ   r*   r0   r   rb   rj   )r1   r(   rc   Zactivaterl   r   r   r   r   r   Útest_unicode_in_batch_file  s    

z$BasicTest.test_unicode_in_batch_filec             C   sb   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.
        z-czSfrom multiprocessing import Pool; print(Pool(1).apply_async("Python".lower).get(3))ÚpythonN)r   r(   r:   rP   rQ   r#   r$   r;   r%   r*   r0   r   rb   rj   rk   )r1   rl   r   r   r   r   r   Útest_multiprocessing-  s    
zBasicTest.test_multiprocessing)rC   rD   rE   rF   rJ   r^   re   Ú
skipInVenvrn   r+   rT   r{   r,   rw   r|   r   r…   r‡   rŒ   ÚunittestÚ
skipUnlessr   rŽ   r   r   r#   r)   r“   r•   r   r   r   r   rH   K   s.   
	
rH   c               @   sP   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 )Nz-cz1try:
 import pip
except ImportError:
 print("OK")zlatin-1Ú ÚOK)r#   r$   r;   r%   r(   r*   r0   r   Údecoderb   rj   )r1   rl   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 )N)r   r(   r:   rP   rQ   r   )r1   r   r   r   Útest_no_pip_by_defaultJ  s    
z$EnsurePipTest.test_no_pip_by_defaultc             C   s*   t | jƒ | jtj| jdd |  ¡  d S )NF)Úwith_pip)r   r(   r:   rP   rQ   r   )r1   r   r   r   Útest_explicit_no_pipO  s    
z"EnsurePipTest.test_explicit_no_pipc          	   C   sd   t tjdƒ}|  | ¡ d¡ W d Q R X tj ¡ dkrL|  tj tj¡¡ n|  	tj tj¡¡ d S )Nry   r   Znul)
r>   r#   Údevnullrb   r?   ÚlowerrV   r$   rW   rI   )r1   r@   r   r   r   Útest_devnullT  s
    zEnsurePipTest.test_devnullc             C   s:  t | jƒ tƒ ü}d|d< d|d< t ¡ Ø}||d< d}d}d}xX|fD ]N\}}tj ||¡}	t |	¡ tj |	|¡}
t	|
d	ƒ}| 
|¡ W d Q R X qHW y| jtj| j|d
d W nH tjk
rü } z(|jjdd}d}|  | ||¡¡ W d d }~X Y nX W d Q R X W d Q R X 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 Q R X | d¡}tjdd|tj d}|  | !¡ d¡ | d¡}|  d|¡ |  d|¡ |s6|  "¡  d S )NÚeZPYTHONWARNINGSÚ1ZPIP_NO_INSTALLÚHOMEz[global]
no-install=1)Úpipzpip.ini)z.pipzpip.confÚwT)rŠ   rŸ   Úreplace)Úerrorsz{}

**Subprocess Output**
{}z-Wzignore::DeprecationWarningz-Iz-mr§   z	--versionzlatin-1rš   zpip {}zensurepip._uninstallzN^The directory .* or its parent directory is not owned by the current user .*$)ÚflagszSuccessfully uninstalled pipz#Successfully uninstalled setuptools)#r   r(   r   r&   ÚTemporaryDirectoryr#   r$   r;   rq   r>   rr   r:   rP   rQ   r   r   r8   rœ   ÚfailÚformatr%   r*   r0   r   rb   Ú	ensurepipÚversionÚlenÚfsencoderY   ÚreÚsubÚ	MULTILINEÚrstripr   )r1   rŠ   ÚenvvarsZhome_dirZ
bad_configZwin_locationZposix_locationrX   ÚfnameÚdirpathZfpathr@   ÚexcÚdetailsÚmsgrl   r   r   Zexpected_versionr(   r   r   r   Údo_test_with_pipb  s\    


8




zEnsurePipTest.do_test_with_pipzpip requires ctypesc             C   s   |   d¡ |   d¡ d S )NFT)r½   )r1   r   r   r   Útest_with_pip»  s    
zEnsurePipTest.test_with_pipN)rC   rD   rE   rF   r   rž   r    r£   r½   r—   r˜   Úctypesr   r¾   r   r   r   r   r™   :  s   Y
r™   Ú__main__)N) rF   r¯   r#   Úos.pathr³   rR   r   r+   r&   Ztest.supportr   r   r   r   r   r   Ú	threadingr—   rP   r¿   ÚImportErrorÚskipIfrf   rg   r–   r   ÚTestCaser   rH   r™   rC   Úmainr   r   r   r   Ú<module>   s6    

" p 
