B
    u9aDE  ã            	   @   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mZ d dlm	Z	 d dl
Z
d dlZe ¡  e de¡ d dlZW dQ R X d dlZdd„ ZG dd„ de
jƒZG d	d
„ d
e
jƒZG dd„ de
jƒZG dd„ de
jƒZG dd„ de
jƒZedkrúe
 ¡  dS )é    N)Úsupport)Úscript_helperÚignorec             C   s"   t  | ¡} t ttdƒ d¡| ƒS )zXDecorator to skip a test if not running under CPython or lacking
    imp.load_dynamic().Úload_dynamiczimp.load_dynamic() required)r   Úcpython_onlyÚunittestÚskipIfÚhasattrÚimp)Zmeth© r   ú/usr/lib/python3.7/test_imp.pyÚrequires_load_dynamic   s    
r   c               @   s    e Zd ZdZdd„ Zdd„ ZdS )Ú	LockTestsz)Very basic test of import lock functions.c             C   s   |   t ¡ |d| ¡ d S )Nz!expected imp.lock_held() to be %r)ÚassertEqualr
   Ú	lock_held)ÚselfÚexpectedr   r   r   Úverify_lock_state   s    zLockTests.verify_lock_statec             C   s’   d}t  ¡ }|  |¡ x"t|ƒD ]}t  ¡  |  d¡ q W xt|ƒD ]}t  ¡  qDW |  |¡ |sŽyt  ¡  W n tk
r‚   Y nX |  d¡ d S )Né2   Tz5release_lock() without lock should raise RuntimeError)r
   r   r   ÚrangeÚacquire_lockÚrelease_lockÚRuntimeErrorZfail)r   ZLOOPSZlock_held_at_startÚir   r   r   ÚtestLock    s    

zLockTests.testLockN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r   r      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
edd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZe ejd¡dd„ ƒZdd„ Zd d!„ Zejd"d#„ ƒZd$d%„ Zd&d'„ Zd(d)„ Zd*S )+ÚImportTestsc             C   s   t  d¡}|j| _|j| _d S )Nztest.encoded_modules)Ú	importlibÚimport_moduleÚtest_stringsÚ__path__Ú	test_path)r   Úmodr   r   r   ÚsetUp<   s    
zImportTests.setUpc             C   s6   x0| j D ]&\}}}t d| ¡}|  ||j¡ qW d S )Nztest.encoded_modules.module_)r"   r    r!   r   Útest)r   ÚmodnameÚencodingZteststrr%   r   r   r   Útest_import_encoded_moduleA   s    z&ImportTests.test_import_encoded_modulec          
   C   sz   xD| j D ]:\}}}t d| | j¡d }|  |j|¡ W d Q R X qW tj t	¡g}|  
t¡ t d|¡ W d Q R X d S )NÚmodule_r   Úbadsyntax_pep3120)r"   r
   Úfind_moduler$   r   r)   ÚosÚpathÚdirnameÚ__file__ÚassertRaisesÚSyntaxError)r   r%   r)   Ú_Úfdr/   r   r   r   Útest_find_module_encodingG   s    z%ImportTests.test_find_module_encodingc          
   C   sÚ   xz| j D ]p\}}}t d| | j¡\}}}|D |  |d ¡ |  |j|¡ |  | ¡ d¡ |  | ¡ d| ¡ W d Q R X qW t d¡\}}}|@ |  |d ¡ |  |jd¡ |  | ¡ d¡ |  | ¡ d¡ W d Q R X d S )Nr+   r   z# test %s encoding
Útokenizezutf-8z*"""Tokenization help for Python programs.
)	r"   r
   r-   r$   ZassertNotEqualr   r)   ÚtellÚreadline)r   r%   r)   r4   ÚfpÚfilenameÚinfor   r   r   Útest_issue1267P   s     

zImportTests.test_issue1267c          
   C   sŒ   d}t j dd¡ zNt|d dƒ}| d¡ W d Q R X t |¡\}}}| ¡  |  |j	d¡ W d t jd= t
 |d ¡ t
 |d ¡ X d S )	NZtest_imp_helperr   Ú.z.pyÚwz%# coding: cp1252
u = 'test.test_imp'
Úcp1252z.pyc)Úsysr/   ÚinsertÚopenÚwriter
   r-   Úcloser   r)   r   Úunlink)r   Útemp_mod_nameÚfiler;   r<   r   r   r   Útest_issue3594c   s    zImportTests.test_issue3594c             C   s”  t  ¡ }dddddddddddœ
}t jdkr>|  |d¡ d	}n
| |¡}|sZ|  d
| ¡ | |¡}d| }d| }tj 	|d¡}zÀt j 
dtj¡ t|d dƒ}| d¡ W d Q R X t |¡\}}	}
|x |  |¡ |  |	d d…  |¡¡ |  |
d d¡ |  |
d d¡ |  |
d tj¡ t |||	|
¡}|  |jd¡ W d Q R X t ¡   t d¡ t ||d ¡}W d Q R X |  |jd¡ t ¡ . t d¡ t jsºt |t |d ¡¡}W d Q R X |  |jd¡ tj |¡sêt |¡ t|dƒ}| d¡ W d Q R X t ¡  t d¡ t ||¡}W d Q R X |  |j d¡ W d t jd= x*dD ]"}t! "|| ¡ t! "|| ¡ qTW t! #|¡ t! #d¡ X d S )Ns   Ã¤ó   Œó   Àó   Áó   à)
zutf-8Úcp1250Úcp1251r@   Úcp1253Úcp1254Úcp1255Úcp1256Úcp1257Úcp1258Údarwinzutf-8s   aÌˆz2can't run this test with %s as filesystem encodingZtest_imp_helper_Ztest_imp_helper_package_z__init__.pyr   z.pyr?   za = 1
éýÿÿÿé   Úré   r   zb = 2
)z.pyz.pycÚ__pycache__)$rA   ÚgetfilesystemencodingÚplatformr   ÚgetÚskipTestÚdecoder.   r/   ÚjoinrB   ÚcurdirrC   rD   r
   r-   ZassertIsNotNoneZ
assertTrueÚendswithZ	PY_SOURCEÚload_moduleÚaÚwarningsÚcatch_warningsÚsimplefilterÚload_sourceÚdont_write_bytecodeZload_compiledÚcache_from_sourceÚexistsÚmkdirZload_packageÚbr   rF   Zrmtree)r   Zfs_encodingZknown_localesZspecial_charZdecoded_charrG   Ztest_package_nameZinit_file_namerH   r;   r<   r%   ÚpackageZextr   r   r   Útest_issue5604q   sx    












zImportTests.test_issue5604c             C   s$   t j t¡}|  ttjd|g¡ d S )Nr,   )r.   r/   r0   r1   r2   r3   r
   r-   )r   r/   r   r   r   Útest_issue9319È   s    zImportTests.test_issue9319c          	   C   st   t j}t j}t ¡ V t d¡}|  |d j¡ tj	d|žŽ }|  
t |¡ |  
||j¡ |  ||j¡ W d Q R X d S )Nr.   r   )r.   )r.   r/   Úgetenvr   ÚEnvironmentVarGuardr
   r-   Ú
addCleanuprE   rd   ÚassertIsZassertIsNot)r   Ú	orig_pathZorig_getenvÚxZnew_osr   r   r   Útest_load_from_sourceÍ   s    	

z!ImportTests.test_load_from_sourcec             C   sL   d}t  |¡}|d }|d k	r*|  |j¡ t j|f|žŽ }|  |j|¡ d S )NÚ_heapqr   )r
   r-   rt   rE   rd   r   r   )r   Zexamplerw   Zfile_r%   r   r   r   Útest_issue15828_load_extensionsà   s    
z+ImportTests.test_issue15828_load_extensionsc          	   C   s   d}t  |¡\}}}| ¡  t  ||¡}t  d|¡}t  d|¡}|  |j|¡ |  |jd¡ |  |jd¡ |  t¡ t  d|¡ W d Q R X d S )NÚ_testimportmultipleZ_testimportmultiple_fooZ_testimportmultiple_barZnonexistent)r
   r-   rE   r   r   r   r2   ÚImportError)r   ÚmZfileobjÚpathnameÚdescriptionZmod0Zmod1Zmod2r   r   r   Ú+test_issue16421_multiple_modules_in_one_dllì   s    z7ImportTests.test_issue16421_multiple_modules_in_one_dllc          	   C   sN   d}d}|   t¡}t ||¡ W d Q R X |  ||jj¡ |  ||jj¡ d S )Nzbogus file pathÚ	extension)	r2   r|   r
   r   ZassertInZ	exceptionr/   r   Úname)r   r/   r‚   Úerrr   r   r   Ú"test_load_dynamic_ImportError_pathû   s    z.ImportTests.test_load_dynamic_ImportError_pathc             C   s`   d}t  |¡}|d d k	r&|d  ¡  |d d t jkrB|  d¡ t j|d f|dd … žŽ  d S )Nr{   r   rZ   z/found module doesn't appear to be a C extensionrX   )r
   r-   rE   ZC_EXTENSIONr_   rd   )r   r‚   Úfoundr   r   r   Ú'test_load_module_extension_file_is_None  s    

z3ImportTests.test_load_module_extension_file_is_Nonec             C   sØ   d}yt j|= W n tk
r$   Y nX zˆt |¡}tj d¡}t ||j	¡}|  
|j|¡ |  
|jj|¡ |  
|jj	|j	¡ |  tt|d¡ |  
|jd¡ |  t j| |¡ W d yt j|= W n tk
rÐ   Y nX X d S )Nztest.imp_dummyZ_testmultiphaseZ
dummy_namei±  )rA   ÚmodulesÚKeyErrorr    r!   ÚutilÚ	find_specr
   r   Úoriginr   r   Ú__spec__r‚   r2   ÚAttributeErrorÚgetattrZ	int_constru   )r   r‚   ÚmoduleÚspecr   r   r   Ú3test_issue24748_load_module_skips_sys_modules_check  s&    
z?ImportTests.test_issue24748_load_module_skips_sys_modules_checkz*test meaningful only when writing bytecodec          	   C   sD   t  ¡ 2 t jd }t |¡ |  tdtjt jdg¡ W d Q R X d S )Nz.pyz
^No moduler>   )	r   Útemp_cwdZTESTFNr.   rm   ÚassertRaisesRegexr|   r
   r-   )r   Úsourcer   r   r   Útest_bug7732+  s
    


zImportTests.test_bug7732c             C   s2   t  dt jtt jƒ¡}| t j¡ | t j¡ d S )Nr
   )r
   Z_LoadSourceCompatibilityr1   rC   Úget_data)r   Úloaderr   r   r   Útest_multiple_calls_to_get_data4  s    
z+ImportTests.test_multiple_calls_to_get_datac          
   C   sd   dt › }ttjt  ƒ|ƒ}t tj||¡. |  td¡ t 	|t
d ¡ W d Q R X W d Q R X d S )NZtmpzembedded nullú )r   ÚtyperA   r‡   r   Z	swap_itemr“   Ú
ValueErrorr
   ri   r1   )r   r(   r%   r   r   r   Útest_load_source;  s
    
zImportTests.test_load_sourcec          	   C   s>   t  td¡}G dd„ dƒ}|  t¡ ||ƒ ƒ W d Q R X d S )NÚcreate_dynamicc               @   s   e Zd ZdZdZdS )z,ImportTests.test_issue31315.<locals>.BadSpecNÚfoo)r   r   r   r‚   r‹   r   r   r   r   ÚBadSpecI  s   rŸ   )r   Zget_attributer
   r2   Ú	TypeError)r   r   rŸ   r   r   r   Útest_issue31315D  s    zImportTests.test_issue31315c             C   s,   |   t dd¡d¡ |   t dd¡d¡ d S )Né*   s   his   ÆçZ:}«é+   s   …—65øš‹9)r   Ú_impÚsource_hash)r   r   r   r   Útest_source_hashO  s    zImportTests.test_source_hashc             C   sl   g dfddgdfddgdfddgdfg}x>|D ]6\}}|ddg }t j|Ž }|  |j ¡  d¡|¡ q.W d S )NÚdefaultz--check-hash-based-pycsÚalwaysÚneverz-cz.import _imp; print(_imp.check_hash_based_pycs)zutf-8)r   Zassert_python_okr   ÚoutÚstripr`   )r   ZcasesZinterp_argsr   ÚargsZresr   r   r   Ú'test_pyc_invalidation_mode_from_cmdlineS  s    


z3ImportTests.test_pyc_invalidation_mode_from_cmdlinec          
   C   s€   t  ¡ ` tddƒ}| d¡ W d Q R X tjddtjjd tj	ddgd\}}}t 
d|||¡}W d Q R X |  |jd	¡ d S )
Nzmymod.pyÚwbs   x = 42
T)ÚdoraiseÚinvalidation_modeZmymodr>   )r/   r¢   )r   r’   rC   rD   Ú
py_compileÚcompileÚPycInvalidationModeÚCHECKED_HASHr
   r-   rd   r   rw   )r   r:   rH   r/   r   r%   r   r   r   Útest_find_and_load_checked_pycb  s    
z*ImportTests.test_find_and_load_checked_pycN)r   r   r   r&   r*   r6   r=   rI   rp   rq   rx   r   rz   r€   r„   r†   r‘   r   r   rA   rj   r•   r˜   rœ   r   r   r¡   r¦   r­   rµ   r   r   r   r   r   ;   s*   	W	r   c               @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )ÚReloadTestszPVery basic tests to make sure that imp.reload() operates just like
    reload().c          	   C   s*   t  ¡  dd l}t |¡ W d Q R X d S )Nr   )r   rs   r.   r
   Úreload)r   r.   r   r   r   Útest_sourcev  s    
zReloadTests.test_sourcec          	   C   s,   t  d¡ dd l}t |¡ W d Q R X d S )NÚtimer   )r   ÚCleanImportr¹   r
   r·   )r   r¹   r   r   r   Útest_extension‚  s    zReloadTests.test_extensionc          	   C   s,   t  d¡ dd l}t |¡ W d Q R X d S )NÚmarshalr   )r   rº   r¼   r
   r·   )r   r¼   r   r   r   Útest_builtin‡  s    zReloadTests.test_builtinc          	      sT   ddl m} tj d¡‰ ‡ fdd„}|  |¡ |  td¡ t 	|¡ W d Q R X d S )Nr   )ÚparserÚhtmlc                  s   ˆ t jd< d S )Nr¿   )rA   r‡   r   )r¿   r   r   Úcleanup  s    z5ReloadTests.test_with_deleted_parent.<locals>.cleanup)
r¿   r¾   rA   r‡   Úpoprt   r“   r|   r
   r·   )r   r¾   rÀ   r   )r¿   r   Útest_with_deleted_parentŒ  s    
z$ReloadTests.test_with_deleted_parentN)r   r   r   r   r¸   r»   r½   rÂ   r   r   r   r   r¶   q  s
   r¶   c               @   sP   e Zd ZdZe ¡ Ze e	j
jdk	d¡dd„ ƒZe e	j
jdk	d¡dd„ ƒZdS )	ÚPEP3147TestszTests of PEP 3147.Nz1requires sys.implementation.cache_tag not be Nonec          	   C   sF   t j dddd¡}t j ddddd | j¡¡}|  t |d¡|¡ d S )Nrž   ÚbarÚbazzqux.pyr[   z
qux.{}.pycT)r.   r/   ra   ÚformatÚtagr   r
   rk   )r   r/   Úexpectr   r   r   Útest_cache_from_sourceœ  s    z#PEP3147Tests.test_cache_from_sourcez4requires sys.implementation.cache_tag to not be Nonec          	   C   sD   t j ddddd | j¡¡}t j dddd¡}|  t |¡|¡ d S )Nrž   rÄ   rÅ   r[   z
qux.{}.pyczqux.py)r.   r/   ra   rÆ   rÇ   r   r
   Úsource_from_cache)r   r/   rÈ   r   r   r   Útest_source_from_cache¦  s    z#PEP3147Tests.test_source_from_cache)r   r   r   r   r
   Zget_tagrÇ   r   Z
skipUnlessrA   ÚimplementationÚ	cache_tagrÉ   rË   r   r   r   r   rÃ   —  s   	rÃ   c               @   s&   e Zd Ze ejdkd¡dd„ ƒZdS )ÚNullImporterTestsNzNeed an undecodeable filenamec          	   C   s6   t j}t |¡ z|  ttj|¡ W d t |¡ X d S )N)	r   ÚTESTFN_UNENCODABLEr.   rm   r2   r|   r
   ZNullImporterÚrmdir)r   r‚   r   r   r   Útest_unencodeable³  s
    
z#NullImporterTests.test_unencodeable)r   r   r   r   r   r   rÏ   rÑ   r   r   r   r   rÎ   ²  s   rÎ   Ú__main__)r    Úimportlib.utilr.   Zos.pathr±   rA   r'   r   Ztest.supportr   r   rf   rg   rh   ÚDeprecationWarningr
   r¤   r   ZTestCaser   r   r¶   rÃ   rÎ   r   Úmainr   r   r   r   Ú<module>   s.   
"  8&