o
    °ó®gØ¹  ã                   @   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Zd dlmZmZ d dlmZ zd dlmZ eƒ  dZW n eyf   dZY nw d dlmZ 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 0¡  dS dS ))é    N)ÚmockÚ
skipUnless)ÚProcessPoolExecutor)Ú_check_system_limitsTF)Úsupport)Ú	os_helper)Ú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   úJ/Users/admin/.pyenv/versions/3.10.0/lib/python3.10/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>-   s    zget_pycs.<locals>.<listcomp>©r   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_hardlink0   s   r"   c                   @   s†  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ed#ƒe d$¡d%d&„ ƒƒZd'd(„ Zeed#ƒe d$¡d)d*„ ƒƒZeed#ƒe d$¡e d+¡d,d-„ ƒƒƒZejd$d.d/e d+¡d0d1„ ƒƒZd2d3„ Zd4d5œd6d7„Zd8d9„ Zd:d;„ Z d<d=„ Z!d>d?„ Z"d@dA„ Z#dBdC„ Z$dDdE„ Z%dFdG„ Z&dHdI„ Z'e(j)dJdK„ ƒZ*d.S )LÚCompileallTestsBasec                 C   sÜ   t  ¡ | _tj | jd¡| _tj 	| j¡| _
t| jddd}| d¡ W d   ƒ n1 s.w   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Úwúutf-8©Úencodingz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   ÚsetUp9   s   
ÿzCompileallTestsBase.setUpc                 C   ó   t  | j¡ d S r   ©r4   Úrmtreer+   ©r9   r   r   r   ÚtearDownG   ó   zCompileallTestsBase.tearDownc                 C   sR   t j | jd¡| _t| jddd}| d¡ W d   ƒ d S 1 s"w   Y  d S )Nz_test_bad.pyr%   r&   r'   zx (
)r   r,   r-   r+   Úbad_source_pathr0   r1   r8   r   r   r   Úadd_bad_source_fileJ   s   "ÿz'CompileallTestsBase.add_bad_source_filec                 C   sh   t | jdƒ}| d¡}W d   ƒ n1 sw   Y  tt | j¡jƒ}t 	dt
jjd|d@ ¡}||fS )NÚrbé   ú<4sLLr   ì   ÿÿ )r0   r/   ÚreadÚintr   r   r.   Úst_mtimeÚstructÚpackr   r   ÚMAGIC_NUMBER)r9   r:   ÚdataÚmtimeZcomparer   r   r   Útimestamp_metadataO   s   ÿÿz&CompileallTestsBase.timestamp_metadatac              	   C   óJ   z	t  | jd¡ W n ttfy   |  d¡ Y nw |  t | j¡¡ d S )N)rG   rG   z0filesystem doesn't support timestamps near 2**32©	r   Úutimer.   ÚOverflowErrorÚOSErrorZskipTestÚ
assertTrueÚ
compileallÚcompile_filer?   r   r   r   Ú test_year_2038_mtime_compilationW   ó   ÿz4CompileallTestsBase.test_year_2038_mtime_compilationc              	   C   rQ   )N)ì         r[   z+filesystem doesn't support large timestampsrR   r?   r   r   r   Útest_larger_than_32_bit_times`   rZ   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 s4w   Y  t
| jdƒ}| |¡ | |¡ W d   ƒ n1 sTw   Y  | j|  	¡ Ž  tj| jddd | j|  	¡ Ž  d S )NÚSOURCE_DATE_EPOCHzSOURCE_DATE_EPOCH is setrD   ÚwbFT©ÚforceÚquiet)r   ÚenvironÚgetÚunittestÚSkipTestÚ
py_compileÚcompiler.   ÚassertEqualrP   r0   r/   rH   Úlenr1   ÚassertNotEqualrW   Úcompile_dirr+   rV   )r9   Zmetadatar:   Úbcr   r   r   Úrecreation_checki   s   
ÿ
þz$CompileallTestsBase.recreation_checkc                 C   s   |   t dtjjdd¡¡ d S )NrF   r   r	   )rm   rK   rL   r   r   rM   r?   r   r   r   Ú
test_mtimey   s   
ÿzCompileallTestsBase.test_mtimec                 C   s   |   d¡ d S )Ns       )rm   r?   r   r   r   Útest_magic_number~   s   z%CompileallTestsBase.test_magic_numberc                 C   s   | j | jfD ]}zt |¡ W q   Y q|  tj| jddd¡ |  tj 	| j ¡o1tj 	| j¡ ¡ t | j ¡ |  tj
| jddd¡ |  tj 	| j ¡oTtj 	| j¡¡ t | j ¡ t | j¡ |  ¡  |  tj| jddd¡ |  tj
| jddd¡ d S )NFTr_   r   )r/   r3   r   ÚunlinkrV   rW   rX   r.   r,   Úisfilerk   r+   rC   ÚassertFalserB   )r9   Ú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 s%w   Y  |  | ¡ d¡ |  tj | j¡¡ d S )Nz&Compiling ([^WindowsPath|PosixPath].*))rr   r   r,   rq   r/   r   Úcaptured_stdoutrV   rW   rX   ÚpathlibÚPathr.   ÚassertRegexÚgetvalue)r9   Ústdoutr   r   r   Útest_compile_file_pathlike›   s   
ÿ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   )Úddirra   )rr   r   r,   rq   r/   rV   rW   rX   rv   rw   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w   Y  t jjj| jgd |  ¡  |  	tjdddd¡ W d   ƒ d S 1 sHw   Y  d S )N©r,   r   ©ra   FT)Úskip_curdirr`   ra   )
ÚtestÚtest_importlibr   Zimport_stater+   rV   rW   Úcompile_pathrC   rr   r?   r   r   r   Útest_compile_pathª   s   ÿ

ÿ"þz%CompileallTestsBase.test_compile_pathc                 C   s|   t j | jd¡}t j |d¡}t  |¡ t|dƒ W d   ƒ n1 s$w   Y  t |¡ |  t j 	t j |d¡¡¡ d S )NrN   r:   r^   Ú__pycache__)
r   r,   r-   r+   r6   r0   rW   rX   rr   Úexists)r9   Zdata_dirZ	data_filer   r   r   Útest_no_pycache_in_non_package³   s   
ÿ
 z2CompileallTestsBase.test_no_pycache_in_non_packagec                 C   sN   |   ¡  t t ¡ ¡ |  t | j¡¡ W d   ƒ d S 1 s w   Y  d S r   )	rC   Ú
contextlibÚredirect_stdoutÚioÚStringIOrr   rW   rX   rB   r?   r   r   r   Ú#test_compile_file_encoding_fallbackÀ   s   "ÿz7CompileallTestsBase.test_compile_file_encoding_fallbackc                 C   sŠ   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©ra   Úoptimizer   )rW   rk   r+   r   r   r   r.   rV   r   r,   rq   r2   r7   )r9   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 s"w   Y  | ¡  ¡ d }|  |d¡ |  tj | j¡¡ d S )Nr   z$Listing ([^WindowsPath|PosixPath].*))rr   r   r,   rq   r/   r   ru   rW   rk   rv   rw   r+   ry   Ú
splitlinesrx   rV   )r9   rz   Úliner   r   r   Útest_compile_dir_pathlikeÖ   s   
ÿz-CompileallTestsBase.test_compile_dir_pathlikeúrequires multiprocessingz&concurrent.futures.ProcessPoolExecutorc                 C   ó"   t j| jddd |  |j¡ d S ©NTé   ©ra   Úworkers©rW   rk   r+   rV   Úcalled©r9   Ú	pool_mockr   r   r   Útest_compile_pool_calledÞ   ó   z,CompileallTestsBase.test_compile_pool_calledc                 C   sB   |   td¡ tj| jdd W d   ƒ d S 1 sw   Y  d S )Nz%workers must be greater or equal to 0éÿÿÿÿ)r™   )ZassertRaisesRegexÚ
ValueErrorrW   rk   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)rW   rk   r+   rh   Ú	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   )rW   rk   r+   rr   r›   rV   )r9   Úcompile_file_mockr   r   r   r   Útest_compile_one_workerï   s   z+CompileallTestsBase.test_compile_one_workerN©Únewc                 C   r•   r–   rš   )r9   r¦   r   r   r   Ú$test_compile_missing_multiprocessing÷   rŸ   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)ra   Ú	maxlevels)r+   Úranger   r,   r-   r6   r4   r5   r.   r   r   r   rW   rk   rr   rq   rV   )r9   Z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||r6dnd	d
 |  
|¡ |D ]H}|  
| | j ¡|¡ tj |¡}|t| j tj ƒd … }	t |¡\}
}
}tj ||	¡}tjj |¡}|  |j|¡ |  d|› dt |¡¡ qAd S )Nr   ÚfooÚ__init__r   Úmodzdef fn(): 1/0
fn()
Tr   r	   )ra   r|   r™   ú")r+   r   r,   r-   r6   r   Úmake_scriptÚappendrW   rk   rV   Ú
startswithr   r   r   ri   ÚsepÚassert_python_failurer   r‚   Zget_code_from_pycrh   Úco_filenameÚassertInÚfsdecode)r9   r|   r±   Úfullpathr,   ZmodsZsubdirr´   ZmodcodeÚmodpathÚ_ÚerrÚexpected_inZmod_code_objr   r   r   Ú_test_ddir_only  s4   
ÿ
þ
øz#CompileallTestsBase._test_ddir_onlyc                 C   ó   	 | j dddS )Nú
<a prefix>F©r|   r±   ©rÃ   r?   r   r   r   Útest_ddir_only_one_worker'  ó   z-CompileallTestsBase.test_ddir_only_one_workerc                 C   rÄ   )NrÅ   TrÆ   rÇ   r?   r   r   r   Útest_ddir_multiple_workers+  rÉ   z.CompileallTestsBase.test_ddir_multiple_workersc                 C   rÄ   )Nr   FrÆ   rÇ   r?   r   r   r   Útest_ddir_empty_only_one_worker/  rÉ   z3CompileallTestsBase.test_ddir_empty_only_one_workerc                 C   rÄ   )Nr   TrÆ   rÇ   r?   r   r   r   Ú test_ddir_empty_multiple_workers3  rÉ   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)ra   Ústripdirr'   ©r   r,   r-   r+   Úmakedirsr   r¶   r   r   r   rW   rk   rº   r¼   ÚstrÚsysÚgetdefaultencodingÚassertNotIn)
r9   r¾   r,   r   rl   rÑ   ÚrcÚoutrÁ   rÂ   r   r   r   Útest_strip_only7  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)ra   Ú
prependdirr'   )r   r,   r-   r+   rÓ   r   r¶   r   r   r   rW   rk   rº   r¼   rÔ   rÕ   rÖ   )
r9   r¾   r,   r   rl   rÜ   rØ   rÙ   rÁ   rÂ   r   r   r   Útest_prepend_onlyJ  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)ra   rÑ   rÜ   r'   rÒ   ©r9   r¾   r,   r   rl   rÑ   rÜ   rØ   rÙ   rÁ   rÂ   r   r   r   Útest_strip_and_prependY  s(   
ÿþþz*CompileallTestsBase.test_strip_and_prependc                 C   sz   g d¢}t jj| jg|¢R Ž }t  |¡ t |dd¡ |  t¡ t	j
|ddddd W d   ƒ d S 1 s6w   Y  d S )N)r   rÎ   rÏ   r,   r|   r   rÐ   Tz/barrÛ   )ra   r|   rÑ   rÜ   )r   r,   r-   r+   rÓ   r   r¶   ÚassertRaisesr¡   rW   rk   )r9   r¾   r,   r   r   r   Útest_strip_prepend_and_ddirn  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 ],}tj|d	|d
 |D ]}|  	t
j || ¡¡ z	t
 || ¡ W q6 tyU   Y q6w q*d S )NÚtest_optimizationúa = 0©r   r	   r   r«   r   r   r	   r   r   Tr   )r   r¶   r+   r·   r   r   r   rW   rX   rV   r   r,   rq   rp   Ú	Exception)r9   r   rl   Ú	opt_levelÚtest_combinationsÚopt_combinationr   r   r   Ú!test_multiple_optimization_levelsw  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)ra   Úlimit_sl_dest)r   r,   r-   r+   rÓ   r   r¶   Úsymlinkr   r   r   rW   rk   rV   rq   rr   ©
r9   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__r;   r@   rC   rP   rY   r\   rm   rn   ro   rt   r{   r}   r„   r‡   rŒ   r   r“   r   Ú_have_multiprocessingr   Ú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#   7   sZ    				r#   c                   @   ó   e Zd ZdS )ÚCompileallTestsWithSourceEpochN©rö   r÷   rø   r   r   r   r   rý   ¤  ó    rý   )Ú	metaclassZsource_date_epochc                   @   rü   )Ú!CompileallTestsWithoutSourceEpochNrþ   r   r   r   r   r  «  rÿ   r  c                   @   s&   e Zd Z	 dd„ Zdd„ Zdd„ ZdS )ÚEncodingTestc                 C   sf   t  ¡ | _tj | jd¡| _t| jddd}| d¡ | d¡ W d   ƒ d S 1 s,w   Y  d S )Nr$   r%   r&   r'   z# -*- coding: utf-8 -*-
u   print u"â‚¬"
)	r)   r*   r+   r   r,   r-   r.   r0   r1   r8   r   r   r   r;   ¶  s   

"þzEncodingTest.setUpc                 C   r<   r   r=   r?   r   r   r   r@   ½  rA   zEncodingTest.tearDownc                 C   s<   zt j}tjt ¡ ddt _t | j¡ W |t _d S |t _w )NÚasciir'   )rÕ   rz   rŠ   ÚTextIOWrapperÚBytesIOrW   rk   r+   )r9   Zorig_stdoutr   r   r   Ú
test_errorÀ  s
   zEncodingTest.test_errorN)rö   r÷   rø   r;   r@   r  r   r   r   r   r  ²  s
    r  c                   @   sª  e Zd Z	 e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„ ƒ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 < qEd"d#„ Zd$d%„ Zed&d'„ ƒZd(d)„ Zd*d+„ Zej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(dFdG„ Z)e*e+dHƒdIdJ„ ƒZ,e- .dK¡dLdM„ ƒZ/dNdO„ Z0dPdQ„ Z1ejdRdS„ ƒZ2dTdU„ Z3dVdW„ Z4dXS )YÚCommandLineTestsBasec                 C   sÖ   t tjjtjƒD ][}d}t |¡d }|d }z=z| ¡ s#| ¡  d}|j	ddd W n t
yE   d}Y W t t|ƒ¡ |rC| ¡   qfw W t t|ƒ¡ |rT| ¡  qt t|ƒ¡ |rc| ¡  w w d}|| _d S )NFr…   ztest.tryTz# for test_compileallr&   r'   )Úfilterr   r,   ÚisdirrÕ   rv   rw   Úis_dirr6   Ú
write_textrU   r   rp   rÔ   ÚrmdirÚ_sys_path_writable)Úclsr,   Zdirectory_createdr+   Zsys_path_writabler   r   r   Ú
setUpClassÌ  s8   €úÿ€þ
ÿ
zCommandLineTestsBase.setUpClassc                 C   s   | j st d¡‚d S )Nz(not all entries on sys.path are writable)r  rd   re   r?   r   r   r   Ú_skip_if_sys_path_not_writableâ  s   
ÿz3CommandLineTestsBase._skip_if_sys_path_not_writablec                 C   s   g t  ¡ ¢d‘d‘d‘|¢S )Nz-Sú-mrW   )r   Z!optim_args_from_interpreter_flags)r9   Ú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   Úassert_python_okr  rh   ©r9   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   ó"   t j |¡}|  tj |¡¡ d S r   )r   r   r   rV   r   r,   r†   ©r9   rs   r,   r   r   r   ÚassertCompiledø  ó   z#CommandLineTestsBase.assertCompiledc                 C   r  r   )r   r   r   rr   r   r,   r†   r  r   r   r   ÚassertNotCompiledü  r  z&CommandLineTestsBase.assertNotCompiledc                 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   r>   r   r,   r-   Úpkgdirr6   Úpkgdir_cachedirr   r¶   ÚinitfnÚbarfnr?   r   r   r   r;      s   
zCommandLineTestsBase.setUpc                 C   sL   |   ¡  t | jdd¡}| j| jd |  |¡ |  | j¡ |  | j¡ d S )NÚbazr   ©Ú
PYTHONPATH)	r  r   r¶   r+   r  r  r  r!  r"  )r9   Úbazfnr   r   r   Útest_no_args_compiles_path
  s   
z/CommandLineTestsBase.test_no_args_compiles_pathc                 C   sª   |   ¡  t | jdd¡}| j| jd tj |¡}t 	|t
 
¡ d fd ¡ t |¡j}| j| jd t |¡j}|  ||¡ | jd| jd t |¡j}|  ||¡ d S )Nr#  r   r$  é<   r   ú-f)r  r   r¶   r+   r  r   r   r   r   rS   Útimer   rJ   rh   rj   )r9   r&  ÚpycpathrO   Úmtime2r   r   r   Ú test_no_args_respects_force_flag  s   z5CommandLineTestsBase.test_no_args_respects_force_flagc                 C   sR   |   ¡  t | jdd¡ | j| jd}|  d|¡ | jd| jd}|  d|¡ d S )Nr#  r   r$  s   Listing ú-q)r  r   r¶   r+   r  r¼   r×   ©r9   Znoisyra   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  rW   r.  c                 3   s     | ]}|  tjjˆ ¡V  qd S r   )ÚformatrÕ   ÚimplementationÚ	cache_tag)r   Úbase©Úextr   r   Ú	<genexpr>9  s   € ÿz)CommandLineTestsBase.f.<locals>.<genexpr>)z__init__.{}.{}z	bar.{}.{}c                    s   g | ]	}|  ˆ ¡r|‘qS r   )Úendswith)r   rs   r7  r   r   r   =  s    
ÿz*CommandLineTestsBase.f.<locals>.<listcomp>)r   r  r  rV   r   r,   r†   r   Úsortedrh   Úlistdirrr   )r9   r8  ÚswitchÚexpectedr   r7  r   Úf4  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  rr   r   r,   r†   r   r;  rh   r<  )r9   r>  r   r   r   Útest_legacy_pathsA  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  rV   r   r,   r†   r   r-   rr   )r9   Zcachecachedirr   r   r   Útest_multiple_runsK  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   rS   r*  r   rJ   rh   rj   )r9   r+  rO   r,  r   r   r   Ú
test_forceX  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  r6   r   r¶   r  r  rr   r†   r  )r9   Ú
subpackageÚ	subinitfnÚhamfnr   r   r   Útest_recursion_controlh  s   


z+CommandLineTestsBase.test_recursion_controlc           	      C   sV  t j | jd¡}t j |d¡}t j |d¡}|||fD ]}t |¡ qt 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 )NrD  rE  Zeggsr@  r   Zeggr.  z-r 0r…   z-r 1z-r 2z-r 5)r   r,   r-   r  r   Úmake_pkgr¶   r  r  rr   r†   r  )	r9   rF  Zsubpackage2Zsubpackage3ÚpkgrG  rH  ZspamfnZeggfnr   r   r   Útest_recursion_limitt  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 )NrD  Ú.ZevilZevil2r.  r@  )	r   r,   r-   r  r   rJ  ró   r  r  )r9   rK  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  rj   rh   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  rj   rh   )r9   rÀ   ra   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+   r6   r   r¶   r  r  r  r!  r"  )r9   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 )NrP  rQ  r.  ú-dÚdinsdaleó   File "dinsdale)r   r¶   r  r  rx   ©r9   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.  rW  rX  Úbingz
import bazzbaz.pycF)Ú
__isolatedrY  )r   r¶   r  r  r   r   r   r   Úrenamer,   r-   Úremoverº   rx   )r9   r&  rs   r1  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  rx   ZassertNotRegexrr   r†   r   r   r   r   rZ  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dd	$}| tj | jd
¡tj	 ¡ | tj | jd¡tj	 ¡ W d   ƒ n1 sTw   Y  |  
dtj | jd¡|¡ |  |¡ |  |¡ |  |¡ |  |¡ d S )NÚf1r   Úf2Úf3Úf4Úl1r%   r&   r'   úf1.pyúf2.pyra  )r   r¶   r  r0   r   r,   r-   r+   r1   Úlinesepr  r  r  ©r9   rd  re  rf  rg  rh  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dd	}| tj | jd
¡tj	 ¡ W d   ƒ n1 sFw   Y  |  
dtj | jd¡¡ |  |¡ |  |¡ |  |¡ |  |¡ d S )Nrd  r   re  rf  rg  rh  r%   r&   r'   rj  ra  )r   r¶   r  r0   r   r,   r-   r+   r1   rk  r  r  r  rl  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 )
Nrd  r   re  rf  rg  r   ra  ú-r  )r   r¶   r  Zspawn_pythonr  Ústdinr1   r   rk  ÚencodeZkill_pythonr  r  )r9   rd  re  rf  rg  Ú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 )Nr\  zsyntax(errorrb  s   rror)	r   r¶   r  r  r!  r"  rx   r  r  )r9   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  rx   )r9   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/w   Y  |  t |dd… d¡d	¡ |  	d
| j¡ t
|dƒ}| ¡ }W d   ƒ n1 s]w   Y  |  t |dd… d¡d¡ d S )Nrd  r   ri  z --invalidation-mode=checked-hashrD   é   é   Úlittler«   z"--invalidation-mode=unchecked-hashr	   )r   r¶   r  r   r   r   r   r,   r-   r  r0   rH   rh   rI   Ú
from_bytes)r9   r1  ÚfprN   r   r   r   Útest_pyc_invalidation_mode  s   ÿ
ÿ
ÿ z/CommandLineTestsBase.test_pyc_invalidation_moder”   c                 C   s–   t  | jdd¡}g }tdƒD ]#}tj | jd |¡¡}t |¡ t  |dd¡}| 	t  |dd¡¡ q|  
| jdd¡ |  |¡ |D ]}|  |¡ qAd S )NrT  r   r—   zfoo{}r³   z-jÚ0)r   r¶   r+   r­   r   r,   r-   r3  r6   r·   r  r  )r9   rU  ÚfilesÚsuffixr  rs   r:   r   r   r   Útest_workers  s   

ÿz!CommandLineTestsBase.test_workerszcompileall.compile_dirc                 C   sh   t jdtj| jdgd t ¡  |  |j¡ |  	|j
d d d¡ W d   ƒ d S 1 s-w   Y  d S )Nzsys.argvz-j0r¨   r    r™   r   )r   rú   rÕ   Ú
executabler+   rW   ÚmainrV   r›   rh   r¤   )r9   rk   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ß   1  s$   
þþz+CommandLineTestsBase.test_strip_and_prependc              
   C   sÚ   t j | jd¡}t  |¡ t |dd¡}g }dD ]}| tj	j
||d¡ qddgddgddgg d	¢g}|D ]4}| j|gd
d„ |D ƒ¢R Ž  |D ]!}|  t j |t|ƒ ¡¡ z	t  || ¡ W qH tyi   Y qHw q6d S )NZoptimizationsrâ   rã   rä   r   r|  Ú1Ú2)r|  rƒ  r„  c                 s   s    | ]	}d t |ƒ V  qdS )z-oN)rÔ   )r   Únr   r   r   r9  T  s   € zICommandLineTestsBase.test_multiple_optimization_levels.<locals>.<genexpr>)r   r,   r-   r+   rÓ   r   r¶   r·   r   r   r   r  rV   rq   rI   rp   rå   )r9   r,   r   rl   ræ   rç   rè   r   r   r   ré   E  s6   
þ
ÿýÿüþ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  rV   rq   rr   rô   r   r   r   rõ   \  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_argsu  s   z+CommandLineTestsBase.test_hardlink_bad_argsc              
   C   sî   dD ]r}t  ¡ d}| j|dN t |dd¡}t|ƒ}g d¢}|r&| d¡ | j|g|¢R Ž  |  t	|d |d ƒ|¡ |  t	|d |d	 ƒ|¡ |  t	|d |d	 ƒ|¡ W d   ƒ n1 s`w   Y  W d   ƒ q1 sow   Y  qd S )
N)TF©Údedupr   rã   )r.  z-o 0r†  z-o 2r‡  r   r	   r   )
r)   ÚTemporaryDirectoryÚsubTestr   r¶   r   r·   r  rh   r"   )r9   rŠ  r,   r   Úpycsr  r   r   r   Útest_hardlinkz  s    

õ€ÿÿz"CommandLineTestsBase.test_hardlinkN)5rö   r÷   rø   Úclassmethodr  r  r  r  r  r  r  r;   r'  r
   r-  r0  Únamer8  r=  r?  ÚlocalsrA  rB  rC  rI  rL  r   rû   rN  rO  rR  rS  rV  r[  r`  rc  rm  rn  rs  rt  ru  r{  r   rù   r  r   rú   r‚  rß   ré   rõ   rˆ  rŽ  r   r   r   r   r  É  sh    

	


ý

"

	


r  c                   @   rü   )ÚCommandLineTestsWithSourceEpochNrþ   r   r   r   r   r’    rÿ   r’  c                   @   rü   )ÚCommandLineTestsNoSourceEpochNrþ   r   r   r   r   r“  —  rÿ   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   r~   r?   r   r   r   r;   ¢  s   
zHardlinkDedupTestsBase.setUpc                 c   sB    t  ¡ }|| _|V  d | _W d   ƒ d S 1 sw   Y  d S r   )r)   r‹  r,   )r9   r,   r   r   r   Útemporary_directory¥  s   €
"ýz*HardlinkDedupTestsBase.temporary_directoryr   c                 C   s   t  | j||¡S r   )r   r¶   r,   )r9   Úcoder  r   r   r   r¶   ¬  rA   z"HardlinkDedupTestsBase.make_scriptTr   F)rŠ  rŽ   r`   c                C   s   t j| jd|||d d S )NT)ra   rŽ   Úhardlink_dupesr`   )rW   rk   r,   )r9   rŠ  rŽ   r`   r   r   r   rk   ¯  s   
ÿz"HardlinkDedupTestsBase.compile_dirc              	   C   sÈ   |   ¡ V |  d¡ |  t¡ tj| jdddd W d   ƒ n1 s$w   Y  |  t¡ tj| jdddgdd W d   ƒ n1 sEw   Y  W d   ƒ d S W d   ƒ d S 1 s]w   Y  d S )NÚpassTr   )ra   rŽ   r—  )r•  r¶   rà   r¡   rW   rk   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-   )r9   Ú	docstringÚ	assertionÚlinesr   r   r   Úcreate_codeÁ  s   



z"HardlinkDedupTestsBase.create_codec                 c   s4    dD ]}dD ]}| j ||d}|||fV  qqd S )N)FT©r›  rœ  )rž  )r9   r›  rœ  r–  r   r   r   Ú
iter_codesÊ  s   €þÿz!HardlinkDedupTestsBase.iter_codesc              
   C   sÔ   |   ¡ D ]c\}}}| j||dO |  ¡ ; |  |¡}t|ƒ}| jdd |  t|d |d ƒ¡ |  t|d |d ƒ¡ |  t|d |d ƒ¡ W d   ƒ n1 sSw   Y  W d   ƒ q1 sbw   Y  qd S )NrŸ  Fr‰  r   r	   r   )r   rŒ  r•  r¶   r   rk   rr   r"   )r9   r–  r›  rœ  r   r  r   r   r   Útest_disabledÐ  s   

ú€ÿÿz$HardlinkDedupTestsBase.test_disabledc                 C   sf   t |ƒ}|  t|d |d ƒ| ¡ |  t|d |d ƒ| o!| ¡ |  t|d |d ƒ| ¡ d S )Nr   r	   r   )r   rh   r"   )r9   r   r›  rœ  r  r   r   r   Úcheck_hardlinksÜ  s   ÿ
ÿÿz&HardlinkDedupTestsBase.check_hardlinksc              
   C   sŽ   |   ¡ D ]@\}}}| j||d, |  ¡  |  |¡}|  ¡  |  |||¡ W d   ƒ n1 s0w   Y  W d   ƒ q1 s?w   Y  qd S )NrŸ  )r   rŒ  r•  r¶   rk   r¢  )r9   r–  r›  rœ  r   r   r   r   rŽ  å  s   

ý€ÿÿz$HardlinkDedupTestsBase.test_hardlinkc              
   C   s¨   dD ]O}| j |d? |  ¡ + |  |  ¡ ¡}| j|d t||d ƒ}t||d ƒ}|  t||ƒ¡ W d   ƒ n1 s=w   Y  W d   ƒ q1 sLw   Y  qd S )N))r   r	   )r	   r   )r   r   )Úopts©rŽ   r   r	   )rŒ  r•  r¶   rž  rk   r   rV   r"   )r9   r£  r   Úpyc1Úpyc2r   r   r   Útest_only_two_levelsî  s   
ù€ÿÿz+HardlinkDedupTestsBase.test_only_two_levelsc                 C   sp   |   ¡ * |  |  ¡ ¡}| jg d¢d t|dƒ}t|dƒ}|  t||ƒ¡ W d   ƒ d S 1 s1w   Y  d S )N)r	   r   r	   r   r¤  r   r	   )r•  r¶   rž  rk   r   rV   r"   )r9   r   r¥  r¦  r   r   r   Útest_duplicated_levelsû  s   


"ùz-HardlinkDedupTestsBase.test_duplicated_levelsc                 C   sä   |   ¡ d |  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   ƒ d S 1 skw   Y  d S )	Nrã   r   úprint(0)r   T)rŽ   r`   r	   ©Úshallow)r•  r¶   rk   r¢  r   r   r   r    rh   rV   r"   rj   rr   ÚfilecmpÚcmp©r9   r   r  Úinoder   r   r   Útest_recompilation  s   



 "ìz)HardlinkDedupTestsBase.test_recompilationc                 C   sô   |   ¡ l | 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   ƒ d S 1 ssw   Y  d S )NÚmodule)r  r   r©  r2  z-czimport moduleF)r]  r%  r   r	   Trª  )r•  r¶   rž  rk   r¢  r   r   r   r    r   r  r,   rh   rr   r"   r¬  r­  r®  r   r   r   Útest_import   s   

ÿ "êz"HardlinkDedupTestsBase.test_importNr   )FF)rö   r÷   rø   r;   rˆ   Úcontextmanagerr•  r¶   rk   r™  rž  r   r¡  r¢  rŽ  r§  r¨  r°  r²  r   r   r   r   r”  Ÿ  s     


	
		r”  c                   @   rü   )Ú!HardlinkDedupTestsWithSourceEpochNrþ   r   r   r   r   r´  <  rÿ   r´  c                   @   rü   )ÚHardlinkDedupTestsNoSourceEpochNrþ   r   r   r   r   rµ  C  rÿ   rµ  Ú__main__)1rW   rˆ   r¬  Úimportlib.utilr   rŠ   Ú	itertoolsr   rv   rf   r4   rK   rÕ   r)   Ztest.test_importlib.utilr   r*  rd   r   r   Úconcurrent.futuresr   Úconcurrent.futures.processr   rù   ÚNotImplementedErrorr   Ztest.supportr   r   Ztest_py_compiler
   r   r   r   r"   r#   ZTestCaserý   r  r  r  r’  r“  r”  r´  rµ  rö   r  r   r   r   r   Ú<module>   s˜    ÿ  oýý   Jýý ýý
ÿ