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 )z8Returns True if two files have the same inode (hardlink))Ú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 ©N©r/   Úrmtreer&   ©r4   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,   r3   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)r4   r5   Ú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 )	zOCheck that compileall recreates bytecode when the new metadata is
        used.ÚSOURCE_DATE_EPOCHzSOURCE_DATE_EPOCH is setr>   NÚwbFT©ÚforceÚquiet)r   ÚenvironÚgetÚunittestZSkipTestÚ
py_compileÚcompiler)   ÚassertEqualrJ   r+   r*   rB   Úlenr,   ÚassertNotEqualrT   Úcompile_dirr&   rS   )r4   Úmetadatar5   Ú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<   )r4   Ú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)r4   Ú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   r5   r#   Ú__pycache__)
r   r'   r(   r&   r1   r+   rT   rU   rn   Úexists)r4   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 r7   )	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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 )NT)r   r   )r   r	   ©r]   Úoptimizer
   )rT   rf   r&   r   r   r   r)   rS   r   r'   rm   r-   r2   )r4   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   )r4   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©r4   Ú	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   )r4   Ú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   )r4   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(   r1   r/   r0   r)   r   r   r   rT   rf   rn   rm   rS   )r4   Ú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 )z@Recursive compile_dir ddir must contain package paths; bpo39769.r}   ÚfooÚ__init__r	   Úmodzdef fn(): 1/0
fn()
Tr   r   )r]   rx   r   Nú")r&   r   r'   r(   r1   r   Úmake_scriptÚappendrT   rf   rS   Ú
startswithr   r   r   rd   ÚsepÚassert_python_failurer}   r~   Zget_code_from_pycrc   Úco_filenameÚassertInÚfsdecode)r4   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 )ú=Recursive compile_dir ddir= contains package paths; bpo39769.ú
<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 )rº   r»   Tr¼   r½   r:   r   r   r   Útest_ddir_multiple_workers#  s    z.CompileallTestsBase.test_ddir_multiple_workersc                 C   s   | j dddS )ú?Recursive compile_dir ddir='' contains package paths; bpo39769.r	   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 )rÀ   r	   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)
r4   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Î   )
r4   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Ê   ©r4   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   )r4   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)r4   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   ©
r4   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__r6   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Zdd„ Zdd„ Zdd„ ZdS )	ÚEncodingTestzTIssue 6716: compileall should escape source code when printing errors
    to stdout.c                 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,   r3   r   r   r   r6   ®  s
    

zEncodingTest.setUpc                 C   s   t  | j¡ d S r7   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&   )r4   Zorig_stdoutr   r   r   Ú
test_error¸  s
    zEncodingTest.test_errorN)rî   rï   rð   Ú__doc__r6   r;   rü   r   r   r   r   r÷   ª  s   r÷   c                   @   s¦  e Zd 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/d0„ Zd1d2„ Z d3d4„ Z!d5d6„ Z"d7d8„ Z#d9d:„ Z$d;d<„ Z%d=d>„ Z&d?d@„ Z'dAdB„ Z(dCdD„ Z)dEdF„ Z*e+e,dGƒdHdI„ ƒZ-e. /dJ¡dKdL„ ƒZ0dMdN„ Z1dOdP„ Z2ejdQdR„ ƒZ3dSdT„ Z4dUdV„ Z5dWS )XÚCommandLineTestsBasezTest compileall's CLI.c                 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
addCleanupr/   r9   r   r'   r(   Úpkgdirr1   Úpkgdir_cachedirr   r¬   ÚinitfnÚbarfnr:   r   r   r   r6   Ä  s    
zCommandLineTestsBase.setUpc                 c   sB   t j}tj | jd¡}z|t _| j|dœV  W |t _n|t _0 dS )z&Adjust and restore sys.pycache_prefix.Z__testcache__)Ú
PYTHONPATHZPYTHONPYCACHEPREFIXN)rÍ   Úpycache_prefixr   r'   r(   r&   )r4   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)r4   Ú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   ©r4   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 r7   )r   r   r   rS   r   r'   r‚   ©r4   ro   r'   r   r   r   ÚassertCompiledî  s    z#CommandLineTestsBase.assertCompiledc                 C   s"   t j |¡}|  tj |¡¡ d S r7   )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  )r4   Ú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   )r4   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Ï   )r4   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 r7   )Ú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   )r4   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)  )r4   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   )r4   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   )r4   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ÿ   r1   r   r¬   r  r  rn   r‚   r  )r4   Ú
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 )Nr1  r2  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  )	r4   r3  Zsubpackage2Zsubpackage3Úpkgr4  r5  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 )Nr1  Ú.ZevilZevil2r  r-  )	r   r'   r(   rÿ   r   r7  rë   r  r  )r4   r8  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   )r4   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   )r4   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&   r1   r   r¬   r  rÿ   r  r  r  )r4   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   ©r4   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  rD  rE  Úbingz
import bazzbaz.pycF)Ú
__isolatedrF  )r   r¬   rÿ   r  r   r   r   r   Úrenamer'   r(   Úremover°   rt   )r4   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   rG  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.pyrN  )r   r¬   rÿ   r+   r   r'   r(   r&   r,   Úlinesepr  r  r  ©r4   rQ  rR  rS  rT  rU  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 )
NrQ  r	   rR  rS  rT  rU  r#   rW  rN  )r   r¬   rÿ   r+   r   r'   r(   r&   r,   rX  r  r  r  rY  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 )
NrQ  r	   rR  rS  rT  r   rN  ú-rù   )r   r¬   rÿ   Zspawn_pythonr  Ústdinr,   r   rX  ÚencodeZkill_pythonr  r  )r4   rQ  rR  rS  rT  Ú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 )NrI  zsyntax(errorrO  s   rror)	r   r¬   rÿ   r  r  r  rt   r  r  )r4   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   )r4   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 )NrQ  r	   rV  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)r4   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 )NrA  r	   r   zfoo{}r©   z-jÚ0)r   r¬   r&   r¢   r   r'   r(   r   r1   r­   r  r  )r4   rB  ÚfilesÚsuffixrÿ   ro   r5   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™   )r4   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
   ri  Ú1Ú2)ri  rp  rq  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Ý   )r4   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 0rs  z-o 2rt  r   r   r   )
r$   ÚTemporaryDirectoryÚsubTestr   r¬   r   r­   r  rc   r    )r4   rw  r'   r   Úpycsr  r   r   r   Útest_hardlinkf  s    

z"CommandLineTestsBase.test_hardlinkN)6rî   rï   rð   rý   r6   rO   Úcontextmanagerr  r  r  r  r  r  r  r   r  r  Únamer%  r*  r,  Úlocalsr.  r/  r0  r6  r9  r   rò   r;  r<  r?  r@  rC  rH  rM  rP  rZ  r[  r`  ra  rb  rh  r   Ú_have_multiprocessingrl  r   rñ   ro  r×   rá   rí   ru  r{  r   r   r   r   rþ   Á  sd   

	


ý

"

	


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 r7   rz   r:   r   r   r   r6   Ž  s    zHardlinkDedupTestsBase.setUpc                 c   s>   t  ¡ "}|| _|V  d | _W d   ƒ n1 s00    Y  d S r7   )r$   rx  r'   )r4   r'   r   r   r   Útemporary_directory‘  s    
z*HardlinkDedupTestsBase.temporary_directoryr   c                 C   s   t  | j||¡S r7   )r   r¬   r'   )r4   Úcoder}  r   r   r   r¬   ˜  s    z"HardlinkDedupTestsBase.make_scriptTr   F)rw  r†   r\   c                C   s   t j| jd|||d d S )NT)r]   r†   Úhardlink_dupesr\   )rT   rf   r'   )r4   rw  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(   )r4   Ú	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Œ  )r4   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  Frv  r   r   r   )rŽ  ry  rƒ  r¬   r   rf   rn   r    )r4   r„  r‰  rŠ  r   rz  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    )r4   r   r‰  rŠ  rz  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Ž  ry  rƒ  r¬   rf   r  )r4   r„  r‰  rŠ  r   r   r   r   r{  Ñ  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   )ry  rƒ  r¬   rŒ  rf   r   rS   r    )r4   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    )r4   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©r4   r   rz  Ú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)r}  r   r—  r  z-czimport moduleF)rJ  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ð   r6   rO   r|  rƒ  r¬   rf   r‡  rŒ  rŽ  r  r  r{  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   r/   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î   rn  r   r   r   r   Ú<module>   sŠ   
  nýý   >ýý ýý
