a
    äze ¶  ã                   @   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Zd dlZd dlZd dlZd dlZd dlmZmZ zd dlmZ dZW n ey²   dZY n0 d dlmZ d dlmZ d dlmZ d d	lmZ d
d„ Zdd„ Zdd„ ZG dd„ dƒZ G dd„ de ej!eddZ"G dd„ de ej!eddZ#G dd„ dej!ƒZ$G dd„ dƒZ%G dd„ de%ej!eddZ&G dd„ de%ej!eddZ'G dd „ d ƒZ(G d!d"„ d"e(ej!eddZ)G d#d$„ d$e(ej!eddZ*e+d%kræe ,¡  dS )&é    N)ÚmockÚ
skipUnless)ÚProcessPoolExecutorTF)Úsupport)Úscript_helper)Úwithout_source_date_epoch)ÚSourceDateEpochTestMetac                 C   s   |sd}t jj| |dS )NÚ ©Úoptimization)Ú	importlibÚutilÚcache_from_source)ÚscriptÚopt© r   ú*/usr/lib/python3.9/test/test_compileall.pyÚget_pyc   s    r   c                    s   ‡ fdd„dD ƒS )Nc                    s   g | ]}t ˆ |ƒ‘qS r   )r   )Ú.0r   ©r   r   r   Ú
<listcomp>&   ó    zget_pycs.<locals>.<listcomp>©r   é   é   r   r   r   r   r   Úget_pycs%   s    r   c                 C   s    t  | ¡j}t  |¡j}||kS ©N)ÚosÚstatÚst_ino)Z	filename1Ú	filename2Zinode1Zinode2r   r   r   Úis_hardlink)   s    r!   c                   @   sh  e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Ze d#¡d$d%„ ƒZd&d'„ Ze d#¡d(d)„ ƒZe d#¡e d*¡d+d,„ ƒƒZejd#d-d.e d*¡d/d0„ ƒƒZd1d2„ Zd3d4œd5d6„Zd7d8„ Zd9d:„ Zd;d<„ Zd=d>„ Z d?d@„ Z!dAdB„ Z"dCdD„ Z#dEdF„ Z$dGdH„ Z%e&j'dIdJ„ ƒZ(d-S )KÚCompileallTestsBasec                 C   sØ   t  ¡ | _tj | jd¡| _tj 	| j¡| _
t| jdƒ}| d¡ W d   ƒ n1 sX0    Y  tj | jd¡| _tj 	| j¡| _t | j| j¡ tj | jd¡| _t | j¡ tj | jd¡| _t | j| j¡ d S )Nú_test.pyÚwzx = 123
z	_test2.pyZ_subdirz	_test3.py)ÚtempfileÚmkdtempÚ	directoryr   ÚpathÚjoinÚsource_pathr   r   r   Úbc_pathÚopenÚwriteÚsource_path2Úbc_path2ÚshutilÚcopyfileZsubdirectoryÚmkdirÚsource_path3©ÚselfÚfiler   r   r   ÚsetUp2   s    
(zCompileallTestsBase.setUpc                 C   s   t  | j¡ d S r   ©r0   Úrmtreer'   ©r5   r   r   r   ÚtearDown@   s    zCompileallTestsBase.tearDownc                 C   sL   t j | jd¡| _t| jdƒ}| d¡ W d   ƒ n1 s>0    Y  d S )Nz_test_bad.pyr$   zx (
)r   r(   r)   r'   Úbad_source_pathr,   r-   r4   r   r   r   Úadd_bad_source_fileC   s    z'CompileallTestsBase.add_bad_source_filec                 C   sh   t | jdƒ}| d¡}W d   ƒ n1 s,0    Y  tt | j¡jƒ}t 	dt
jjd|d@ ¡}||fS )NÚrbé   ú<4sLLr   ì   ÿÿ )r,   r+   ÚreadÚintr   r   r*   Úst_mtimeÚstructÚpackr   r   ÚMAGIC_NUMBER)r5   r6   ÚdataÚmtimeZcomparer   r   r   Útimestamp_metadataH   s    (ÿz&CompileallTestsBase.timestamp_metadatac              	   C   sx   zt  | jd¡ W n  ttfy2   |  d¡ Y n0 t t 	¡ ¡" |  
t | j¡¡ W d   ƒ n1 sj0    Y  d S )N)rA   rA   z0filesystem doesn't support timestamps near 2**32©r   Úutimer*   ÚOverflowErrorÚOSErrorZskipTestÚ
contextlibÚredirect_stdoutÚioÚStringIOÚ
assertTrueÚ
compileallÚcompile_filer:   r   r   r   Ú test_year_2038_mtime_compilationP   s    z4CompileallTestsBase.test_year_2038_mtime_compilationc              	   C   sx   zt  | jd¡ W n  ttfy2   |  d¡ Y n0 t t 	¡ ¡" |  
t | j¡¡ W d   ƒ n1 sj0    Y  d S )N)ì         rW   z+filesystem doesn't support large timestampsrK   r:   r   r   r   Útest_larger_than_32_bit_timesZ   s    z1CompileallTestsBase.test_larger_than_32_bit_timesc                 C   sâ   t j d¡rt d¡‚t | j¡ | j|  	¡ Ž  t
| jdƒ$}| ¡ t|ƒd … }W d   ƒ n1 sf0    Y  t
| jdƒ$}| |¡ | |¡ W d   ƒ n1 s¦0    Y  | j|  	¡ Ž  tj| jddd | j|  	¡ Ž  d S )NÚSOURCE_DATE_EPOCHzSOURCE_DATE_EPOCH is setr>   ÚwbFT©ÚforceÚquiet)r   ÚenvironÚgetÚunittestZSkipTestÚ
py_compileÚcompiler*   ÚassertEqualrJ   r,   r+   rB   Úlenr-   ÚassertNotEqualrT   Úcompile_dirr'   rS   )r5   Úmetadatar6   Úbcr   r   r   Úrecreation_checkd   s    
2
(z$CompileallTestsBase.recreation_checkc                 C   s   |   t dtjjdd¡¡ d S )Nr@   r   r   )ri   rE   rF   r   r   rG   r:   r   r   r   Ú
test_mtimet   s    ÿzCompileallTestsBase.test_mtimec                 C   s   |   d¡ d S )Ns       )ri   r:   r   r   r   Útest_magic_numbery   s    z%CompileallTestsBase.test_magic_numberc                 C   s  | j | jfD ] }zt |¡ W q   Y q0 q|  tj| jddd¡ |  tj 	| j ¡oftj 	| j¡ ¡ t | j ¡ |  tj
| jddd¡ |  tj 	| j ¡o¬tj 	| j¡¡ t | j ¡ t | j¡ |  ¡  |  tj| jddd¡ |  tj
| jddd¡ d S )NFTr[   r   )r+   r/   r   ÚunlinkrS   rT   rU   r*   r(   Úisfilerf   r'   r=   ÚassertFalser<   )r5   Úfnr   r   r   Útest_compile_files}   s6    ÿÿÿÿÿÿz&CompileallTestsBase.test_compile_filesc                 C   s|   |   tj | j¡¡ t ¡ (}|  t 	t
 | j¡¡¡ W d   ƒ n1 sJ0    Y  |  | ¡ d¡ |  tj | j¡¡ d S )Nz&Compiling ([^WindowsPath|PosixPath].*))rn   r   r(   rm   r+   r   Úcaptured_stdoutrS   rT   rU   ÚpathlibÚPathr*   ÚassertRegexÚgetvalue)r5   Ústdoutr   r   r   Útest_compile_file_pathlike–   s
    
6z.CompileallTestsBase.test_compile_file_pathlikec                 C   sP   |   tj | j¡¡ |  tjt 	| j
¡t 	d¡dd¡ |  tj | j¡¡ d S )NZ	ddir_pathr   )Úddirr]   )rn   r   r(   rm   r+   rS   rT   rU   rr   rs   r*   r:   r   r   r   Útest_compile_file_pathlike_ddirž   s    þz3CompileallTestsBase.test_compile_file_pathlike_ddirc                 C   sœ   t jjj| jgd" |  tjdd¡ W d   ƒ n1 s<0    Y  t jjj| jgd. |  ¡  |  	tjdddd¡ W d   ƒ n1 sŽ0    Y  d S )N©r(   r   ©r]   FT)Úskip_curdirr\   r]   )
ÚtestÚtest_importlibr   Zimport_stater'   rS   rT   Úcompile_pathr=   rn   r:   r   r   r   Útest_compile_path¥   s    0
ÿz%CompileallTestsBase.test_compile_pathc                 C   s|   t j | jd¡}t j |d¡}t  |¡ t|dƒ W d   ƒ n1 sH0    Y  t |¡ |  t j 	t j |d¡¡¡ d S )NrH   r6   r$   Ú__pycache__)
r   r(   r)   r'   r2   r,   rT   rU   rn   Úexists)r5   Zdata_dirZ	data_filer   r   r   Útest_no_pycache_in_non_package®   s    

z2CompileallTestsBase.test_no_pycache_in_non_packagec                 C   sL   |   ¡  t t ¡ ¡" |  t | j¡¡ W d   ƒ n1 s>0    Y  d S r   )	r=   rO   rP   rQ   rR   rn   rT   rU   r<   r:   r   r   r   Ú#test_compile_file_encoding_fallback»   s    z7CompileallTestsBase.test_compile_file_encoding_fallbackc                 C   s’   drdnd\}}t j| jd|d tjj| j|d}|  tj	 
|¡¡ tjj| j|d}|  tj	 
|¡¡ tjj| j|d}|  tj	 
|¡¡ d S )NF)r   r   )r   r	   T©r]   Úoptimizer
   )rT   rf   r'   r   r   r   r*   rS   r   r(   rm   r.   r3   )r5   r†   r   ÚcachedZcached2Zcached3r   r   r   Útest_optimizeÂ   s    
ÿ
ÿ
ÿz!CompileallTestsBase.test_optimizec                 C   s‚   |   tj | j¡¡ t ¡ "}t t	 
| j¡¡ W d   ƒ n1 sD0    Y  | ¡  ¡ d }|  |d¡ |  tj | j¡¡ d S )Nr   z$Listing ([^WindowsPath|PosixPath].*))rn   r   r(   rm   r+   r   rq   rT   rf   rr   rs   r'   ru   Ú
splitlinesrt   rS   )r5   rv   Úliner   r   r   Útest_compile_dir_pathlikeÑ   s    
0z-CompileallTestsBase.test_compile_dir_pathlikez&concurrent.futures.ProcessPoolExecutorc                 C   s"   t j| jddd |  |j¡ d S ©NTé   ©r]   Úworkers©rT   rf   r'   rS   Úcalled©r5   Ú	pool_mockr   r   r   Útest_compile_pool_calledÙ   s    z,CompileallTestsBase.test_compile_pool_calledc                 C   s@   |   td¡  tj| jdd W d   ƒ n1 s20    Y  d S )Nz%workers must be greater or equal to 0éÿÿÿÿ)r   )ZassertRaisesRegexÚ
ValueErrorrT   rf   r'   r:   r   r   r   Ú!test_compile_workers_non_positiveÞ   s    ÿz5CompileallTestsBase.test_compile_workers_non_positivec                 C   s,   t j| jddd |  |jd d d ¡ d S )NTr   rŽ   r   Úmax_workers)rT   rf   r'   rc   Ú	call_argsr’   r   r   r   Útest_compile_workers_cpu_countã   s    z2CompileallTestsBase.test_compile_workers_cpu_countzcompileall.compile_filec                 C   s,   t j| jdd |  |j¡ |  |j¡ d S )NTr{   )rT   rf   r'   rn   r‘   rS   )r5   Úcompile_file_mockr“   r   r   r   Útest_compile_one_workerè   s    z+CompileallTestsBase.test_compile_one_workerN©Únewc                 C   s"   t j| jddd |  |j¡ d S rŒ   r   )r5   r›   r   r   r   Ú$test_compile_missing_multiprocessingï   s    z8CompileallTestsBase.test_compile_missing_multiprocessingc                 C   s´   d}| j }td|d ƒD ]>}tj |d|› ¡}tj |d¡}t |¡ t | j|¡ qt	j
 |¡}tj| j d|d d |  tj |¡¡ tj| j d|d |  tj |¡¡ d S )Né   r   Zdir_z	script.pyT)r]   Ú	maxlevels)r'   Úranger   r(   r)   r2   r0   r1   r*   r   r   r   rT   rf   rn   rm   rS   )r5   Údepthr(   ÚiÚsourceZpyc_filenamer   r   r   Útest_compile_dir_maxlevelsõ   s    
z.CompileallTestsBase.test_compile_dir_maxlevelsT)Úparallelc                C   s  ddg}| j }g }|D ]>}tj ||¡}t |¡ t |dd¡ | t |dd¡¡ qtj	| j d||rjdnd	d
 |  
|¡ |D ]}|  
| | j ¡|¡ tj |¡}|t| j tj ƒd … }	t |¡\}
}
}tj ||	¡}tjj |¡}|  |j|¡ |  d|› dt |¡¡ q€d S )Nr}   ÚfooÚ__init__r	   Úmodzdef fn(): 1/0
fn()
Tr   r   )r]   rx   r   ú")r'   r   r(   r)   r2   r   Úmake_scriptÚappendrT   rf   rS   Ú
startswithr   r   r   rd   ÚsepÚassert_python_failurer}   r~   Zget_code_from_pycrc   Úco_filenameÚassertInÚfsdecode)r5   rx   r§   Úfullpathr(   ZmodsZsubdirrª   ZmodcodeÚmodpathÚ_ÚerrÚexpected_inZmod_code_objr   r   r   Ú_test_ddir_only  s0    
ÿ
þ
z#CompileallTestsBase._test_ddir_onlyc                 C   s   | j dddS )Nú
<a prefix>F©rx   r§   ©r¹   r:   r   r   r   Útest_ddir_only_one_worker  s    z-CompileallTestsBase.test_ddir_only_one_workerc                 C   s   | j dddS )Nrº   Tr»   r¼   r:   r   r   r   Útest_ddir_multiple_workers#  s    z.CompileallTestsBase.test_ddir_multiple_workersc                 C   s   | j dddS )Nr	   Fr»   r¼   r:   r   r   r   Útest_ddir_empty_only_one_worker'  s    z3CompileallTestsBase.test_ddir_empty_only_one_workerc                 C   s   | j dddS )Nr	   Tr»   r¼   r:   r   r   r   Ú test_ddir_empty_multiple_workers+  s    z4CompileallTestsBase.test_ddir_empty_multiple_workersc           
      C   sÈ   g d¢}t jj| jg|¢R Ž }t  |¡ t |dd¡}tj 	|¡}t jj| jg|d d… ¢R Ž }t
j|d|d t |¡\}}}t jj|dd … Ž }	|  |	t|t ¡ d¡ |  |t|t ¡ d¡ d S )N©r}   ÚbuildÚrealr(   r}   ú1 / 0r   T)r]   Ústripdir©Úencoding©r   r(   r)   r'   Úmakedirsr   r¬   r   r   r   rT   rf   r°   r²   ÚstrÚsysÚgetdefaultencodingÚassertNotIn)
r5   r´   r(   r   rh   rÅ   ÚrcÚoutr·   r¸   r   r   r   Útest_strip_only/  s"    
þþz#CompileallTestsBase.test_strip_onlyc           
      C   sš   g d¢}t jj| jg|¢R Ž }t  |¡ t |dd¡}tj 	|¡}d}t
j|d|d t |¡\}}}t jj|| jg|¢R Ž }	|  |	t|t ¡ d¡ d S )NrÁ   r}   rÄ   ú/fooT)r]   Ú
prependdirrÆ   )r   r(   r)   r'   rÉ   r   r¬   r   r   r   rT   rf   r°   r²   rÊ   rË   rÌ   )
r5   r´   r(   r   rh   rÒ   rÎ   rÏ   r·   r¸   r   r   r   Útest_prepend_onlyB  s    
þz%CompileallTestsBase.test_prepend_onlyc                 C   sÖ   g d¢}t jj| jg|¢R Ž }t  |¡ t |dd¡}tj 	|¡}t jj| jg|d d… ¢R Ž }d}t
j|d||d t |¡\}}}	t jj|g|dd … ¢R Ž }
|  |
t|	t ¡ d¡ |  |t|	t ¡ d¡ d S )	NrÁ   r}   rÄ   r   rÑ   T)r]   rÅ   rÒ   rÆ   rÈ   ©r5   r´   r(   r   rh   rÅ   rÒ   rÎ   rÏ   r·   r¸   r   r   r   Útest_strip_and_prependQ  s(    
ÿþþz*CompileallTestsBase.test_strip_and_prependc                 C   sx   g d¢}t jj| jg|¢R Ž }t  |¡ t |dd¡ |  t¡$ t	j
|ddddd W d   ƒ n1 sj0    Y  d S )N)r}   rÂ   rÃ   r(   rx   r}   rÄ   Tz/barrÑ   )r]   rx   rÅ   rÒ   )r   r(   r)   r'   rÉ   r   r¬   ÚassertRaisesr–   rT   rf   )r5   r´   r(   r   r   r   Útest_strip_prepend_and_ddirf  s    

ÿz/CompileallTestsBase.test_strip_prepend_and_ddirc              
   C   s´   t  | jdd¡}g }dD ]}| tjj||d¡ qddgddgddgg d¢g}|D ]Z}tj|d	|d
 |D ]@}|  	t
j || ¡¡ zt
 || ¡ W ql tyª   Y ql0 qlqTd S )NÚtest_optimizationúa = 0©r	   r   r   r    r
   r   r   r   r   Tr…   )r   r¬   r'   r­   r   r   r   rT   rU   rS   r   r(   rm   rl   Ú	Exception)r5   r   rh   Ú	opt_levelÚtest_combinationsÚopt_combinationr   r   r   Ú!test_multiple_optimization_levelso  s(    þÿ
ÿz5CompileallTestsBase.test_multiple_optimization_levelsc           
      C   sú   t j | jddd¡}t j | jddd¡}t j | jddd¡}t  |¡ t  |¡ t  |¡ t |dd¡}t |dd¡}t j |d	¡}t j |d
¡}t  ||¡ t  ||¡ tj	 
|¡}tj	 
|¡}	tj|d|d |  t j |¡¡ |  t j |	¡¡ d S )Nr}   ÚdirÚallowedÚsymlinksÚ
prohibitedÚtest_allowedrÙ   Útest_prohibitedútest_allowed.pyútest_prohibited.pyT)r]   Úlimit_sl_dest)r   r(   r)   r'   rÉ   r   r¬   Úsymlinkr   r   r   rT   rf   rS   rm   rn   ©
r5   Zallowed_pathZsymlinks_pathZprohibited_pathZallowed_scriptZprohibited_scriptZallowed_symlinkZprohibited_symlinkZ
allowed_bcZprohibited_bcr   r   r   Útest_ignore_symlink_destination‚  s"    


z3CompileallTestsBase.test_ignore_symlink_destination))Ú__name__Ú
__module__Ú__qualname__r7   r;   r=   rJ   rV   rX   ri   rj   rk   rp   rw   ry   r€   rƒ   r„   rˆ   r‹   r   Úpatchr”   r—   rš   rœ   rŸ   r¦   r¹   r½   r¾   r¿   rÀ   rÐ   rÓ   rÕ   r×   rß   r   Úskip_unless_symlinkrë   r   r   r   r   r"   0   sR   

	

	r"   c                   @   s   e Zd ZdS )ÚCompileallTestsWithSourceEpochN©rì   rí   rî   r   r   r   r   rñ   œ  s   rñ   )Ú	metaclassZsource_date_epochc                   @   s   e Zd ZdS )Ú!CompileallTestsWithoutSourceEpochNrò   r   r   r   r   rô   £  s   rô   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚEncodingTestc                 C   sd   t  ¡ | _tj | jd¡| _t| jddd$}| d¡ | d¡ W d   ƒ n1 sV0    Y  d S )Nr#   r$   úutf-8rÆ   z# -*- coding: utf-8 -*-
u   print u"â‚¬"
)	r%   r&   r'   r   r(   r)   r*   r,   r-   r4   r   r   r   r7   ®  s
    

zEncodingTest.setUpc                 C   s   t  | j¡ d S r   r8   r:   r   r   r   r;   µ  s    zEncodingTest.tearDownc                 C   s>   z0t j}tjt ¡ ddt _t | j¡ W |t _n|t _0 d S )NÚasciirÆ   )rË   rv   rQ   ÚTextIOWrapperÚBytesIOrT   rf   r'   )r5   Zorig_stdoutr   r   r   Ú
test_error¸  s
    zEncodingTest.test_errorN)rì   rí   rî   r7   r;   rú   r   r   r   r   rõ   ª  s   rõ   c                   @   s¢  e Zd Zdd„ Zejdd„ ƒZdd„ Zdd„ Zd	d
„ Z	dd„ Z
dd„ Zdd„ Zedd„ ƒZdd„ Zddg fdddgfdddgffD ]&\ZZZeefdd„Zeeƒ de < q‚d d!„ Zd"d#„ Zed$d%„ ƒZd&d'„ Zd(d)„ Zejd*d+„ ƒZd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ Z d4d5„ Z!d6d7„ Z"d8d9„ Z#d:d;„ Z$d<d=„ Z%d>d?„ Z&d@dA„ Z'dBdC„ Z(dDdE„ Z)e*e+dFƒdGdH„ ƒZ,e- .dI¡dJdK„ ƒZ/dLdM„ Z0dNdO„ Z1ejdPdQ„ ƒZ2dRdS„ Z3dTdU„ Z4dVS )WÚCommandLineTestsBasec                 C   sr   t  ¡ | _|  tj| j¡ tj | jd¡| _	t 
| j	¡ tj | j	d¡| _t | j	dd¡| _t | j	dd¡| _d S )Nr¨   r   r©   r	   Zbar)r%   r&   r'   Z
addCleanupr0   r9   r   r(   r)   Úpkgdirr2   Úpkgdir_cachedirr   r¬   ÚinitfnÚbarfnr:   r   r   r   r7   Ä  s    
zCommandLineTestsBase.setUpc                 c   sB   t j}tj | jd¡}z|t _| j|dœV  W |t _n|t _0 d S )NZ__testcache__)Ú
PYTHONPATHZPYTHONPYCACHEPREFIX)rË   Úpycache_prefixr   r(   r)   r'   )r5   Z
old_prefixZ
new_prefixr   r   r   Útemporary_pycache_prefixÎ  s    þ
z-CommandLineTestsBase.temporary_pycache_prefixc                 C   s   g t  ¡ ¢d‘d‘d‘|¢S )Nz-Sú-mrT   )r   Z!optim_args_from_interpreter_flags)r5   Úargsr   r   r   Ú_get_run_argsÜ  s    
ÿÿÿþz"CommandLineTestsBase._get_run_argsc                 O   s4   t j|  |¡i |¤ddi¤Ž\}}}|  d|¡ |S )NÚPYTHONIOENCODINGrö   r   )r   Úassert_python_okr  rc   ©r5   r  Zenv_varsrÎ   rÏ   r·   r   r   r   ÚassertRunOKá  s    ÿÿþz CommandLineTestsBase.assertRunOKc                 O   s.   t j|  |¡i |¤ddi¤Ž\}}}|||fS )Nr  rö   )r   r°   r  r  r   r   r   ÚassertRunNotOKè  s    ÿÿþz#CommandLineTestsBase.assertRunNotOKc                 C   s"   t j |¡}|  tj |¡¡ d S r   )r   r   r   rS   r   r(   r‚   ©r5   ro   r(   r   r   r   ÚassertCompiledî  s    z#CommandLineTestsBase.assertCompiledc                 C   s"   t j |¡}|  tj |¡¡ d S r   )r   r   r   rn   r   r(   r‚   r  r   r   r   ÚassertNotCompiledò  s    z&CommandLineTestsBase.assertNotCompiledc                 C   sn   t  | jdd¡}|  ¡ B}| jf i |¤Ž |  |¡ |  | j¡ |  | j¡ W d   ƒ n1 s`0    Y  d S )NÚbazr	   )	r   r¬   r'   r  r	  r  r  rþ   rÿ   )r5   ÚbazfnÚenvr   r   r   Útest_no_args_compiles_pathö  s    

z/CommandLineTestsBase.test_no_args_compiles_pathc                 C   sÎ   t  | jdd¡}|  ¡ ,}| jf i |¤Ž tj |¡}W d   ƒ n1 sJ0    Y  t 	|t
 
¡ d fd ¡ t |¡j}| jf i |¤Ž t |¡j}|  ||¡ | jdi |¤Ž t |¡j}|  ||¡ d S )Nr  r	   é<   r   ú-f)r  )r   r¬   r'   r  r	  r   r   r   r   rL   Útimer   rD   rc   re   )r5   r  r  ÚpycpathrI   Úmtime2r   r   r   Ú test_no_args_respects_force_flagÿ  s    
*z5CommandLineTestsBase.test_no_args_respects_force_flagc                 C   st   t  | jdd¡ |  ¡  }| jf i |¤Ž}W d   ƒ n1 s>0    Y  |  d|¡ | jdi |¤Ž}|  d|¡ d S )Nr  r	   s   Listing ú-q)r  )r   r¬   r'   r  r	  r²   rÍ   )r5   r  Únoisyr]   r   r   r   Ú test_no_args_respects_quiet_flag  s    
.z5CommandLineTestsBase.test_no_args_respects_quiet_flagZnormalÚpycr†   z	opt-1.pycú-OZdoubleoptimizez	opt-2.pycz-OOc                    s~   t j|ddd| jg Ž  |  tj | j¡¡ t‡ fdd„dD ƒƒ}|  	tt 
| j¡ƒ|¡ |  ‡ fdd„t 
| j¡D ƒ¡ d S )	Nr  rT   r  c                 3   s   | ]}|  tjjˆ ¡V  qd S r   )ÚformatrË   ÚimplementationÚ	cache_tag)r   Úbase©Úextr   r   Ú	<genexpr>%  s   ÿz)CommandLineTestsBase.f.<locals>.<genexpr>)z__init__.{}.{}z	bar.{}.{}c                    s   g | ]}|  ˆ ¡r|‘qS r   )Úendswith)r   ro   r!  r   r   r   )  s   
ÿz*CommandLineTestsBase.f.<locals>.<listcomp>)r   r  rü   rS   r   r(   r‚   rý   Úsortedrc   Úlistdirrn   )r5   r"  ÚswitchÚexpectedr   r!  r   Úf   s    ÿÿzCommandLineTestsBase.fZtest_pep3147_paths_c                 C   sL   |   dd| j¡ |  tj | j¡¡ tg d¢ƒ}|  tt 	| j¡ƒ|¡ d S )Nz-br  )ú__init__.pyz__init__.pyczbar.pyzbar.pyc)
r	  rü   rn   r   r(   r‚   rý   r%  rc   r&  )r5   r(  r   r   r   Útest_legacy_paths-  s    z&CommandLineTestsBase.test_legacy_pathsc                 C   s|   |   d| j¡ |  tj | j¡¡ tj | jd¡}|  tj |¡¡ |   d| j¡ |  tj | j¡¡ |  tj |¡¡ d S )Nr  r   )	r	  rü   rS   r   r(   r‚   rý   r)   rn   )r5   Zcachecachedirr   r   r   Útest_multiple_runs7  s    z'CommandLineTestsBase.test_multiple_runsc                 C   s”   |   d| j¡ tj | j¡}t |t ¡ d fd ¡ t 	|¡j
}|   d| j¡ t 	|¡j
}|  ||¡ |   dd| j¡ t 	|¡j
}|  ||¡ d S )Nr  r  r   r  )r	  rü   r   r   r   rÿ   r   rL   r  r   rD   rc   re   )r5   r  rI   r  r   r   r   Ú
test_forceD  s    zCommandLineTestsBase.test_forcec                 C   s’   t j | jd¡}t  |¡ t |dd¡}t |dd¡}|  dd| j¡ |  |¡ |  	t j 
t j |d¡¡¡ |  d| j¡ |  |¡ |  |¡ d S )NÚspamr©   r	   Úhamr  z-lr   )r   r(   r)   rü   r2   r   r¬   r	  r  rn   r‚   r  )r5   Ú
subpackageÚ	subinitfnÚhamfnr   r   r   Útest_recursion_controlT  s    


z+CommandLineTestsBase.test_recursion_controlc           	      C   sV  t j | jd¡}t j |d¡}t j |d¡}|||fD ]}t |¡ q6t j |d¡}t |dd¡}t |dd¡}t |dd¡}|  dd| j¡ |  |¡ |  	t j 
t j |d	¡¡¡ |  dd
| j¡ |  |¡ |  |¡ |  |¡ |  dd| j¡ |  |¡ |  |¡ |  |¡ |  |¡ |  dd| j¡ |  |¡ |  |¡ |  |¡ |  |¡ d S )Nr.  r/  Zeggsr*  r	   Zeggr  z-r 0r   z-r 1z-r 2z-r 5)r   r(   r)   rü   r   Úmake_pkgr¬   r	  r  rn   r‚   r  )	r5   r0  Zsubpackage2Zsubpackage3Úpkgr1  r2  ZspamfnZeggfnr   r   r   Útest_recursion_limit`  s8    
ÿ









z)CommandLineTestsBase.test_recursion_limitc              	   C   st   t j | jd¡}t |¡ t  dt j |d¡¡ t  dt j |d¡¡ |  d| j¡ |  t j | jdddd¡¡ d S )Nr.  Ú.ZevilZevil2r  r*  )	r   r(   r)   rü   r   r4  ré   r	  r  )r5   r5  r   r   r   Útest_symlink_loop‚  s    

ÿz&CommandLineTestsBase.test_symlink_loopc                 C   s6   |   | j¡}|   d| j¡}|  d|¡ |  d|¡ d S )Nr  r   )r	  rü   re   rc   )r5   r  r]   r   r   r   Ú
test_quiet  s    zCommandLineTestsBase.test_quietc                 C   sT   t  | jdd¡ |  d| j¡\}}}|  d| j¡\}}}|  d|¡ |  d|¡ d S )NÚcrunchyfrogú
bad(syntaxr  z-qqr   )r   r¬   rü   r
  re   rc   )r5   r¶   r]   Zsilentr   r   r   Útest_silent–  s
    z CommandLineTestsBase.test_silentc                 C   s.   |   ddd| j¡ |  | j¡ |  | j¡ d S )Nr  z-xz
ba[^\\/]*$)r	  rü   r  rÿ   r  rþ   r:   r   r   r   Útest_regexp  s    z CommandLineTestsBase.test_regexpc                 C   sv   t j | jd¡}t  |¡ t |dd¡}t |dd¡}|  d| j|¡ |  	| j
¡ |  	| j¡ |  	|¡ |  	|¡ d S )NZfoo2r©   r	   Úbar2r  )r   r(   r)   r'   r2   r   r¬   r	  rü   r  rþ   rÿ   )r5   Zpkgdir2Zinit2fnÚbar2fnr   r   r   Útest_multiple_dirs¢  s    

z'CommandLineTestsBase.test_multiple_dirsc                 C   s8   t  | jdd¡ |  ddd| j¡\}}}|  |d¡ d S )Nr:  r;  r  ú-dÚdinsdaleó   File "dinsdale)r   r¬   rü   r
  rt   ©r5   rÎ   rÏ   r·   r   r   r   Útest_d_compile_error­  s    z)CommandLineTestsBase.test_d_compile_errorc                 C   s„   t  | jdd¡}|  ddd| j¡ t  | jdd¡}tj |¡}t |tj	 
| jd¡¡ t |¡ t j|d	d
\}}}|  |d¡ d S )Nr  zraise Exceptionr  rA  rB  Úbingz
import bazzbaz.pycF)Ú
__isolatedrC  )r   r¬   rü   r	  r   r   r   r   Úrenamer(   r)   Úremover°   rt   )r5   r  ro   r  rÎ   rÏ   r·   r   r   r   Útest_d_runtime_error²  s    
z)CommandLineTestsBase.test_d_runtime_errorc                 C   sZ   |   dtj | jd¡| j¡\}}}|  |d¡ |  |d¡ |  tj 	t
j | j¡¡¡ d S )Nú-iÚ
nosuchfiles   rror.*nosuchfiles	   Traceback)r
  r   r(   r)   r'   rü   rt   ZassertNotRegexrn   r‚   r   r   r   rý   rD  r   r   r   Útest_include_bad_file¼  s    ÿ
ÿz*CommandLineTestsBase.test_include_bad_filec                 C   sô   t  | jdd¡}t  | jdd¡}t  | jdd¡}t  | jdd¡}ttj | jd¡dƒH}| tj | jd¡tj	 ¡ | tj | jd	¡tj	 ¡ W d   ƒ n1 s¤0    Y  |  
d
tj | jd¡|¡ |  |¡ |  |¡ |  |¡ |  |¡ d S )NÚf1r	   Úf2Úf3Úf4Úl1r$   úf1.pyúf2.pyrK  )r   r¬   rü   r,   r   r(   r)   r'   r-   Úlinesepr	  r  r  ©r5   rN  rO  rP  rQ  rR  r   r   r   Útest_include_file_with_argÄ  s    :


z/CommandLineTestsBase.test_include_file_with_argc                 C   sÖ   t  | jdd¡}t  | jdd¡}t  | jdd¡}t  | jdd¡}ttj | jd¡dƒ,}| tj | jd¡tj	 ¡ W d   ƒ n1 sˆ0    Y  |  
d	tj | jd¡¡ |  |¡ |  |¡ |  |¡ |  |¡ d S )
NrN  r	   rO  rP  rQ  rR  r$   rT  rK  )r   r¬   rü   r,   r   r(   r)   r'   r-   rU  r	  r  r  rV  r   r   r   Útest_include_file_no_argÒ  s    :


z-CommandLineTestsBase.test_include_file_no_argc                 C   s¦   t  | jdd¡}t  | jdd¡}t  | jdd¡}t  | jdd¡}t j|  d¡ddg Ž }|j |tj  	d	¡¡ t  
|¡ |  |¡ |  |¡ |  |¡ |  |¡ d S )
NrN  r	   rO  rP  rQ  r   rK  ú-r÷   )r   r¬   rü   Zspawn_pythonr  Ústdinr-   r   rU  ÚencodeZkill_pythonr  r  )r5   rN  rO  rP  rQ  Úpr   r   r   Útest_include_on_stdinß  s    



z*CommandLineTestsBase.test_include_on_stdinc                 C   s\   t  | jdd¡}|  d| j|| j¡\}}}|  |d¡ |  |¡ |  | j¡ |  | j¡ d S )NrF  zsyntax(errorrL  s   rror)	r   r¬   rü   r
  rþ   rÿ   rt   r  r  )r5   ZbingfnrÎ   rÏ   r·   r   r   r   Ú!test_compiles_as_much_as_possibleì  s    
ÿ

z6CommandLineTestsBase.test_compiles_as_much_as_possiblec                 C   s   |   d¡}|  |d¡ d S )NZbadfilenames   Can't list 'badfilename')r	  rt   )r5   rÏ   r   r   r   Ú!test_invalid_arg_produces_messageõ  s    
z6CommandLineTestsBase.test_invalid_arg_produces_messagec                 C   sä   t  | jdd¡ tj tj | jd¡¡}|  	d| j¡ t
|dƒ}| ¡ }W d   ƒ n1 s^0    Y  |  t |dd… d¡d	¡ |  	d
| j¡ t
|dƒ}| ¡ }W d   ƒ n1 sº0    Y  |  t |dd… d¡d¡ d S )NrN  r	   rS  z --invalidation-mode=checked-hashr>   é   é   Úlittler    z"--invalidation-mode=unchecked-hashr   )r   r¬   rü   r   r   r   r   r(   r)   r	  r,   rB   rc   rC   Ú
from_bytes)r5   r  ÚfprH   r   r   r   Útest_pyc_invalidation_modeù  s    ÿ&&z/CommandLineTestsBase.test_pyc_invalidation_modezrequires multiprocessingc                 C   s–   t  | jdd¡}g }tdƒD ]F}tj | jd |¡¡}t |¡ t  |dd¡}| 	t  |dd¡¡ q|  
| jdd¡ |  |¡ |D ]}|  |¡ q‚d S )Nr>  r	   r   zfoo{}r©   z-jÚ0)r   r¬   r'   r¢   r   r(   r)   r  r2   r­   r	  r  )r5   r?  ÚfilesÚsuffixrü   ro   r6   r   r   r   Útest_workers  s    

z!CommandLineTestsBase.test_workerszcompileall.compile_dirc                 C   sf   t jdtj| jdgd: t ¡  |  |j¡ |  	|j
d d d¡ W d   ƒ n1 sX0    Y  d S )Nzsys.argvz-j0r   r•   r   r   )r   rï   rË   Ú
executabler'   rT   ÚmainrS   r‘   rc   r™   )r5   rf   r   r   r   Útest_workers_available_cores  s    ÿz1CommandLineTestsBase.test_workers_available_coresc                 C   sÖ   g d¢}t jj| jg|¢R Ž }t  |¡ t |dd¡}tj 	|¡}t jj| jg|d d… ¢R Ž }d}|  
d|d||¡ t |¡\}}}	t jj|g|dd … ¢R Ž }
|  |
t|	t ¡ d¡ |  |t|	t ¡ d¡ d S )	NrÁ   r}   rÄ   r   rÑ   z-sz-prÆ   )r   r(   r)   r'   rÉ   r   r¬   r   r   r   r	  r°   r²   rÊ   rË   rÌ   rÍ   rÔ   r   r   r   rÕ     s$    
þþz+CommandLineTestsBase.test_strip_and_prependc              
   C   sÜ   t j | jd¡}t  |¡ t |dd¡}g }dD ]}| tj	j
||d¡ q0ddgddgddgg d	¢g}|D ]j}| j|gd
d„ |D ƒ¢R Ž  |D ]D}|  t j |t|ƒ ¡¡ zt  || ¡ W q tyÒ   Y q0 qqld S )NZoptimizationsrØ   rÙ   rÚ   r
   rf  Ú1Ú2)rf  rm  rn  c                 s   s   | ]}d t |ƒ V  qdS )z-oN)rÊ   )r   Únr   r   r   r#  @  r   zICommandLineTestsBase.test_multiple_optimization_levels.<locals>.<genexpr>)r   r(   r)   r'   rÉ   r   r¬   r­   r   r   r   r	  rS   rm   rC   rl   rÛ   )r5   r(   r   rh   rÜ   rÝ   rÞ   r   r   r   rß   1  s0    
þÿ
ýz6CommandLineTestsBase.test_multiple_optimization_levelsc           
      C   sø   t j | jddd¡}t j | jddd¡}t j | jddd¡}t  |¡ t  |¡ t  |¡ t |dd¡}t |dd¡}t j |d	¡}t j |d
¡}t  ||¡ t  ||¡ tj	 
|¡}tj	 
|¡}	|  |d|¡ |  t j |¡¡ |  t j |	¡¡ d S )Nr}   rà   rá   râ   rã   rä   rÙ   rå   ræ   rç   z-e)r   r(   r)   r'   rÉ   r   r¬   ré   r   r   r   r	  rS   rm   rn   rê   r   r   r   rë   H  s"    


z4CommandLineTestsBase.test_ignore_symlink_destinationc                 C   s   |   | jdd¡ d S )Nú-o 1ú--hardlink-dupes)r
  r'   r:   r   r   r   Útest_hardlink_bad_argsa  s    z+CommandLineTestsBase.test_hardlink_bad_argsc              
   C   sî   dD ]ä}t  ¡ È}| j|dœ t |dd¡}t|ƒ}g d¢}|rL| d¡ | j|g|¢R Ž  |  t	|d |d ƒ|¡ |  t	|d |d	 ƒ|¡ |  t	|d |d	 ƒ|¡ W d   ƒ n1 sÀ0    Y  W d   ƒ q1 sÞ0    Y  qd S )
N)TF©Údedupr   rÙ   )r  z-o 0rp  z-o 2rq  r   r   r   )
r%   ÚTemporaryDirectoryÚsubTestr   r¬   r   r­   r	  rc   r!   )r5   rt  r(   r   Úpycsr  r   r   r   Útest_hardlinkf  s    

z"CommandLineTestsBase.test_hardlinkN)5rì   rí   rî   r7   rO   Úcontextmanagerr  r  r	  r
  r  r  r  r   r  r  Únamer"  r'  r)  Úlocalsr+  r,  r-  r3  r6  r   rð   r8  r9  r<  r=  r@  rE  rJ  rM  rW  rX  r]  r^  r_  re  r   Ú_have_multiprocessingri  r   rï   rl  rÕ   rß   rë   rr  rx  r   r   r   r   rû   Á  sb   

	


ý

"

	


rû   c                   @   s   e Zd ZdS )ÚCommandLineTestsWithSourceEpochNrò   r   r   r   r   r}  |  s   r}  c                   @   s   e Zd ZdS )ÚCommandLineTestsNoSourceEpochNrò   r   r   r   r   r~  ƒ  s   r~  c                   @   s’   e Zd Zdd„ Zejdd„ ƒZd#dd„Zdd	d
dœdd„Zdd„ Z	d$dd„Z
dd„ Zdd„ Zd%dd„Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"S )&ÚHardlinkDedupTestsBasec                 C   s
   d | _ d S r   rz   r:   r   r   r   r7   Ž  s    zHardlinkDedupTestsBase.setUpc                 c   s>   t  ¡ "}|| _|V  d | _W d   ƒ n1 s00    Y  d S r   )r%   ru  r(   )r5   r(   r   r   r   Útemporary_directory‘  s    
z*HardlinkDedupTestsBase.temporary_directoryr   c                 C   s   t  | j||¡S r   )r   r¬   r(   )r5   Úcoderz  r   r   r   r¬   ˜  s    z"HardlinkDedupTestsBase.make_scriptTr   F)rt  r†   r\   c                C   s   t j| jd|||d d S )NT)r]   r†   Úhardlink_dupesr\   )rT   rf   r(   )r5   rt  r†   r\   r   r   r   rf   ›  s    ÿz"HardlinkDedupTestsBase.compile_dirc              	   C   s¶   |   ¡ š |  d¡ |  t¡$ tj| jdddd W d   ƒ n1 sH0    Y  |  t¡( tj| jdddgdd W d   ƒ n1 sŠ0    Y  W d   ƒ n1 s¨0    Y  d S )NÚpassTr   )r]   r†   r‚  )r€  r¬   rÖ   r–   rT   rf   r(   r:   r   r   r   Útest_bad_argsŸ  s    

ÿ$ÿz$HardlinkDedupTestsBase.test_bad_argsc                 C   s4   g }|r|  d¡ |  d¡ |r*|  d¡ d |¡S )Nz'module docstring'zx = 1zassert x == 1Ú
)r­   r)   )r5   Ú	docstringÚ	assertionÚlinesr   r   r   Úcreate_code­  s    


z"HardlinkDedupTestsBase.create_codec                 c   s2   dD ](}dD ]}| j ||d}|||fV  qqd S )N)FT©r†  r‡  )r‰  )r5   r†  r‡  r  r   r   r   Ú
iter_codes¶  s    z!HardlinkDedupTestsBase.iter_codesc              
   C   sÔ   |   ¡ D ]Æ\}}}| j||dž |  ¡ v |  |¡}t|ƒ}| jdd |  t|d |d ƒ¡ |  t|d |d ƒ¡ |  t|d |d ƒ¡ W d   ƒ n1 s¦0    Y  W d   ƒ q1 sÄ0    Y  qd S )NrŠ  Frs  r   r   r   )r‹  rv  r€  r¬   r   rf   rn   r!   )r5   r  r†  r‡  r   rw  r   r   r   Útest_disabled¼  s    

z$HardlinkDedupTestsBase.test_disabledc                 C   sf   t |ƒ}|  t|d |d ƒ| ¡ |  t|d |d ƒ| oB| ¡ |  t|d |d ƒ| ¡ d S )Nr   r   r   )r   rc   r!   )r5   r   r†  r‡  rw  r   r   r   Úcheck_hardlinksÈ  s    ÿ
ÿÿz&HardlinkDedupTestsBase.check_hardlinksc              
   C   sŽ   |   ¡ D ]€\}}}| j||dX |  ¡ 0 |  |¡}|  ¡  |  |||¡ W d   ƒ n1 s`0    Y  W d   ƒ q1 s~0    Y  qd S )NrŠ  )r‹  rv  r€  r¬   rf   r  )r5   r  r†  r‡  r   r   r   r   rx  Ñ  s    

z$HardlinkDedupTestsBase.test_hardlinkc              
   C   s¨   dD ]ž}| j |d~ |  ¡ V |  |  ¡ ¡}| j|d t||d ƒ}t||d ƒ}|  t||ƒ¡ W d   ƒ n1 sz0    Y  W d   ƒ q1 s˜0    Y  qd S )N))r   r   )r   r   )r   r   )Úopts©r†   r   r   )rv  r€  r¬   r‰  rf   r   rS   r!   )r5   rŽ  r   Úpyc1Úpyc2r   r   r   Útest_only_two_levelsÚ  s    
z+HardlinkDedupTestsBase.test_only_two_levelsc                 C   sn   |   ¡ R |  |  ¡ ¡}| jg d¢d t|dƒ}t|dƒ}|  t||ƒ¡ W d   ƒ n1 s`0    Y  d S )N)r   r   r   r   r  r   r   )r€  r¬   r‰  rf   r   rS   r!   )r5   r   r  r‘  r   r   r   Útest_duplicated_levelsç  s    


z-HardlinkDedupTestsBase.test_duplicated_levelsc                 C   sâ   |   ¡ Æ |  d¡}|  ¡  |  |¡ t|ƒ}t |d ¡j}|  d¡}| jddgdd |  |t |d ¡j¡ |  	t
|d |d ƒ¡ |  |t |d ¡j¡ |  tj|d |d dd¡ W d   ƒ n1 sÔ0    Y  d S )	NrÙ   r   úprint(0)r   T)r†   r\   r   ©Úshallow)r€  r¬   rf   r  r   r   r   r   rc   rS   r!   re   rn   ÚfilecmpÚcmp©r5   r   rw  Úinoder   r   r   Útest_recompilationó  s    



z)HardlinkDedupTestsBase.test_recompilationc                 C   sò   |   ¡ Ö | j|  ¡ dd}|  ¡  |  |¡ t|ƒ}t |d ¡j}| jddd}t	j
dddd| jd	 |  |t |d ¡j¡ |  |t |d
 ¡j¡ |  t|d |d
 ƒ¡ |  tj|d |d
 dd¡ W d   ƒ n1 sä0    Y  d S )NÚmodule)rz  r   r”  r  z-czimport moduleF)rG  r   r   r   Tr•  )r€  r¬   r‰  rf   r  r   r   r   r   r   r  r(   rc   rn   r!   r—  r˜  r™  r   r   r   Útest_import  s    

ÿz"HardlinkDedupTestsBase.test_importN)r   )FF)FF)rì   rí   rî   r7   rO   ry  r€  r¬   rf   r„  r‰  r‹  rŒ  r  rx  r’  r“  r›  r  r   r   r   r   r  ‹  s   


	
		r  c                   @   s   e Zd ZdS )Ú!HardlinkDedupTestsWithSourceEpochNrò   r   r   r   r   rž  (  s   rž  c                   @   s   e Zd ZdS )ÚHardlinkDedupTestsNoSourceEpochNrò   r   r   r   r   rŸ  /  s   rŸ  Ú__main__)-rT   rO   r—  Úimportlib.utilr   rQ   r   rr   ra   r0   rE   rË   r%   Ztest.test_importlib.utilr}   r  r`   r   r   Úconcurrent.futuresr   r|  ÚImportErrorr   Ztest.supportr   Ztest.test_py_compiler   r   r   r   r!   r"   ZTestCaserñ   rô   rõ   rû   r}  r~  r  rž  rŸ  rì   rk  r   r   r   r   Ú<module>   sŠ   
  nýý   >ýý ýý
