B
    u9ašJ  ã               @   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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edƒ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Ú_base_executablez: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ÚPIPEZcommunicateÚ
returncodeÚCalledProcessError)Úcmdr   ÚpÚoutÚerr© r   ú/usr/lib/python3.7/test_venv.pyÚcheck_output"   s    r   c               @   s8   e Zd ZdZdd„ Zdd„ Zdd„ Z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t
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Úlibzpython%d.%dé   Úincluder   éÿÿÿÿÚwin32TF)ÚosÚpathÚrealpathÚtempfileZmkdtempÚenv_dirÚnameÚbindirr   r    ÚsysÚversion_infoÚgetattrÚ
executableÚsplitÚexeÚplatformÚlexistsÚexistsÚcannot_link_exe)Úselfr-   r   r   r   ÚsetUp1   s    

zBaseTest.setUpc             C   s   t | jƒ d S )N)r   r'   )r4   r   r   r   ÚtearDownD   s    zBaseTest.tearDownc          
   O   s>   t ƒ "}tƒ }|||Ž W d Q R X W d Q R X | ¡ | ¡ fS )N)r   r   Úgetvalue)r4   ÚfuncÚargsÚkwargsÚoutputÚerrorr   r   r   Úrun_with_captureG   s    zBaseTest.run_with_capturec             G   s   t jj| jf|žŽ S )N)r#   r$   Újoinr'   )r4   r9   r   r   r   Úget_env_fileM   s    zBaseTest.get_env_filec          	   G   s(   t | j|Ž dƒ}| ¡ }W d Q R X |S )NÚr)Úopenr?   Úread)r4   r9   ÚfÚresultr   r   r   Úget_text_file_contentsP   s    zBaseTest.get_text_file_contentsN)	Ú__name__Ú
__module__Ú__qualname__ZmaxDiffr5   r6   r=   r?   rE   r   r   r   r   r   -   s   r   c            	   @   s  e 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ed*d+„ ƒZdS ),Ú	BasicTestc             G   s    | j |Ž }|  tj |¡¡ d S )N)r?   Ú
assertTruer#   r$   Úisdir)r4   r9   Úfnr   r   r   rK   X   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 )NZlib64ÚPé   ÚposixÚdarwinz
pyvenv.cfgr   z	home = %szContents of %r:z    %rzFile %r should exist.)r   r'   r=   ÚvenvÚcreaterK   r)   r    r   r?   ÚstructÚcalcsizer#   r(   r*   r0   rJ   r$   ÚislinkÚassertFalser2   rE   r,   r-   ÚdirnameÚassertInr/   ÚprintÚlistdir)r4   r   Z
conditionsÚdatar-   r$   rL   Úbdr   r   r   Útest_defaults\   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'   rQ   Ú
EnvBuilderZensure_directoriesÚassertEqualr_   )r4   Zenv_nameÚbuilderÚcontextr   r   r   Útest_promptx   s    zBasicTest.test_promptc             C   sœ   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 )Nz-cÚprefixÚbase_prefixÚbase_exec_prefixzimport sys; print(sys.%s)r   )r   r'   r=   rQ   rR   r#   r$   r>   r)   r/   r*   rf   rg   r   ra   ÚstripÚencode)r4   Úenvpyr   re   Zexpectedr   r   r   r   r   Útest_prefixesƒ   s    

zBasicTest.test_prefixesr"   ))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 )NÚwbs   Still here?)r#   r$   r>   r'   ÚmkdirrA   Úwrite)r4   ÚpathsÚfilenameÚsubdirsÚdrL   rC   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 )NÚfoo)rt   Úrbs   Still here?T)Úclear)rs   ÚENV_SUBDIRSrQ   rR   r'   r#   r$   r>   rJ   r2   rA   ra   rB   r`   rV   )r4   rq   rL   rC   rb   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#   rZ   r$   r>   rU   ÚisfileÚremoverK   r   )r4   r$   rL   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é   rl   ó    )rw   r#   r$   r>   r'   rA   rn   ZassertRaisesÚ
ValueErrorÚOSErrorrQ   rR   r{   )r4   ro   rL   rC   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 )N)FT)ÚupgradezContents of %r:z    %rzFile %r should exist.)rQ   r`   r=   rR   r'   rK   r)   r    r   r?   r/   r#   r$   r2   rY   rZ   rJ   )r4   r   rb   rL   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 )N))TÚtrue)FZfalseT)rv   Úsystem_site_packagesz
pyvenv.cfgz"include-system-site-packages = %s
)rQ   r`   rR   r'   rE   rX   )r4   ZsspÚsrb   r[   r   r   r   Útest_isolationê   s
    
zBasicTest.test_isolationzNeeds symlinksc             C   sl   xfdD ]^}t jd|d}| | j¡ |  | j| j¡}|r| jrR|  t	j
 |¡¡ q|  t	j
 |¡¡ qW d S )N)FTT)rv   Úsymlinks)rQ   r`   rR   r'   r?   r)   r/   r3   rV   r#   r$   rU   rJ   )r4   Zuslrb   rL   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 )Nz-cz!import sys; print(sys.executable))r   r'   r=   rQ   rR   r#   r$   r>   r%   r)   r/   r   ra   rh   ri   )r4   rj   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 )NT)rv   r‡   z-cz!import sys; print(sys.executable))r   r'   rQ   r`   rR   r#   r$   r>   r%   r)   r/   r   ra   rh   ri   )r4   rb   rj   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 )Nu   Ï¼ÑžÐ¢Î»Ð¤Ð™T)rv   zactivate.batú&z-czprint(0)Zoem)r   Ú0)r   r'   r#   r$   r>   r%   rQ   r`   rR   r)   r/   r   ra   rh   )r4   r'   rb   Zactivaterj   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 )Nz-czrfrom multiprocessing import Pool; pool = Pool(1); print(pool.apply_async("Python".lower).get(3)); pool.terminate()Zpython)r   r'   r=   rQ   rR   r#   r$   r>   r%   r)   r/   r   ra   rh   ri   )r4   rj   r   r   r   r   r   Útest_multiprocessing8  s    
zBasicTest.test_multiprocessing)rF   rG   rH   rK   r]   rd   ÚrequireVenvCreaterk   r*   r0   rw   r+   rs   rx   r{   r€   r‚   r†   ÚunittestÚ
skipUnlessr   rˆ   r‰   rŠ   r#   r(   r   rŽ   r   r   r   r   rI   U   s,   
	
rI   c               @   sL   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 )Nz-cz1try:
 import pip
except ImportError:
 print("OK")zlatin-1Ú ZOK)r#   r$   r>   r%   r'   r)   r/   r   Údecodera   rh   )r4   rj   r   r   r   r   r   Úassert_pip_not_installedK  s    

z&EnsurePipTest.assert_pip_not_installedc             C   s&   t | jƒ |  tj| j¡ |  ¡  d S )N)r   r'   r=   rQ   rR   r•   )r4   r   r   r   Útest_no_pip_by_defaultX  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=   rQ   rR   r•   )r4   r   r   r   Útest_explicit_no_pip]  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 )Nru   r}   Znul)
rA   r#   Údevnullra   rB   ÚlowerrV   r$   r2   rJ   )r4   rC   r   r   r   Útest_devnullb  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&   ZTemporaryDirectoryr#   r$   r>   rm   rA   rn   r=   rQ   rR   r   r   r;   r”   ZfailÚformatr%   r)   r/   r   ra   Ú	ensurepipÚversionÚlenÚfsencoderX   ÚreÚsubÚ	MULTILINEÚrstripr•   )r4   r„   ÚenvvarsZhome_dirZ
bad_configZwin_locationZposix_locationrW   ZfnameÚdirpathZfpathrC   ÚexcZdetailsÚmsgrj   r   r   Zexpected_versionr'   r   r   r   Údo_test_with_pipp  s\    


8




zEnsurePipTest.do_test_with_pipzpip requires ctypesc             C   s   |   d¡ |   d¡ d S )NFT)r±   )r4   r   r   r   Útest_with_pipÉ  s    
zEnsurePipTest.test_with_pipN)rF   rG   rH   r•   r–   r˜   r›   r±   r   r‘   Úctypesr   r²   r   r   r   r   r’   H  s   Y
r’   Ú__main__)N) r¥   r#   Zos.pathr©   rS   r   r*   r&   Ztest.supportr   r   r   r   r   r   Z	threadingr   rQ   r³   ÚImportErrorr‘   Úhasattrre   rf   r   r   ZTestCaser   rI   r’   rF   Úmainr   r   r   r   Ú<module>   s8    



( t 
