B
    u9a|É  ã               @   s2  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 d dl
Z
d dlmZ d dlmZ eedƒr”d dlZdZnd Ze je jkZeedƒZej d¡rÀd	Znd
ZG dd„ de
jƒZG dd„ de
jƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZ G dd„ deƒZ!ej"dd„ ƒZ#dd„ Z$G dd„ dƒZ%G dd „ d e%eƒZ&G d!d"„ d"eƒZ'G d#d$„ d$eƒZ(G d%d&„ d&eƒZ)G d'd(„ d(e%eƒZ*G d)d*„ d*eƒZ+G d+d,„ d,eƒZ,G d-d.„ d.eƒZ-e j.e j/k	rþG d/d0„ d0eƒZ0G d1d2„ d2ƒZ1G d3d4„ d4eƒZ2e3d5kr.e
 4¡  dS )6é    N)Úmock)Úsupport)Úscript_helperÚstaté   ÚspawnlZopenbsdé0   éd   c               @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚTestLowLevelInternalsc             C   s:   |   tt d¡¡ |   tt d¡¡ |   tt d ¡¡ d S )NÚ ó    )ÚassertIsÚstrÚtempfileÚ_infer_return_typeÚbytes)Úself© r   ú#/usr/lib/python3.7/test_tempfile.pyÚtest_infer_return_type_singles(   s    z4TestLowLevelInternals.test_infer_return_type_singlesc          	   C   sp   |   tt dd¡¡ |   tt dd¡¡ |  t¡ t dd¡ W d Q R X |  t¡ t dd¡ W d Q R X d S )Nr   r   )r   r   r   r   r   ÚassertRaisesÚ	TypeError)r   r   r   r   Ú test_infer_return_type_multiples-   s    z6TestLowLevelInternals.test_infer_return_type_multiplesc          	   C   s°   |   tt d d¡¡ |   tt dd ¡¡ |   tt d d ¡¡ |   tt dd ¡¡ |   tt d d¡¡ |  t¡ t dd d¡ W d Q R X |  t¡ t dd d¡ W d Q R X d S )Nr   r   )r   r   r   r   r   r   r   )r   r   r   r   Ú)test_infer_return_type_multiples_and_none5   s    z?TestLowLevelInternals.test_infer_return_type_multiples_and_noneN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r   r
   '   s   r
   c               @   s8   e Zd Ze d¡Ze d¡Zdd„ Zdd„ Zdd„ Z	d	S )
ÚBaseTestCasez^[a-z0-9_-]{8}$s   ^[a-z0-9_-]{8}$c             C   s*   t  ¡ | _| j ¡  tjdtdtd d S )NÚignoreÚmktemp)ÚcategoryÚmessageÚmodule)r   Úcheck_warningsÚ_warnings_managerÚ	__enter__ÚwarningsÚfilterwarningsÚRuntimeWarningr   )r   r   r   r   ÚsetUpH   s    

zBaseTestCase.setUpc             C   s   | j  d d d ¡ d S )N)r$   Ú__exit__)r   r   r   r   ÚtearDownN   s    zBaseTestCase.tearDownc       
      C   s|  t j |¡\}}|d t|ƒ… }|t|ƒt|ƒ d … }|d k	rb|  t|ƒt|ƒtkrZtntd¡ |d k	rŒ|  t|ƒt|ƒtkr„tntd¡ |d k	r¶|  t|ƒt|ƒtkr®tntd¡ |||fdkrÖ|  t|ƒtd¡ |  t j 	|¡t j 	|¡d||f ¡ |  ||d||f ¡ |  ||d||f ¡ |t|ƒt|ƒt|ƒ … }t
|tƒrV| jn| j}	|  |	 |¡d||	jf ¡ d S )Nzunexpected return type)NNNzdefault return type must be strzfile %r not in directory %rzfile %r does not begin with %rzfile %r does not end with %rz$random characters %r do not match %r)ÚosÚpathÚsplitÚlenr   Útyper   r   ÚassertEqualÚabspathÚ
isinstanceÚ	str_checkÚb_checkÚ
assertTrueÚmatchÚpattern)
r   ÚnameÚdirÚpreÚsufÚndirÚnbaseZnpreZnsufZcheckr   r   r   Ú	nameCheckQ   s2    zBaseTestCase.nameCheckN)
r   r   r   ÚreÚcompiler4   r5   r)   r+   r?   r   r   r   r   r   C   s
   

r   c               @   s   e Zd Zdd„ ZdS )ÚTestExportsc             C   st   t j}dddddddddddddddœ}g }x*|D ]"}|d dkr2||kr2| |¡ q2W |  t|ƒdkd| ¡ d S )Nr   )ÚNamedTemporaryFileÚTemporaryFileÚmkstempÚmkdtempr   ÚTMP_MAXÚgettempprefixÚgettempprefixbÚ
gettempdirÚgettempdirbÚtempdirÚtemplateÚSpooledTemporaryFileÚTemporaryDirectoryr   Ú_zunexpected keys: %s)r   Ú__dict__Úappendr6   r/   )r   ÚdictÚexpectedZunexpÚkeyr   r   r   Útest_exportsr   s*    
zTestExports.test_exportsN)r   r   r   rV   r   r   r   r   rB   q   s   rB   c                   sN   e Zd Z‡ fdd„Zdd„ Zdd„ Zdd„ Ze e	e
d	ƒd
¡dd„ ƒZ‡  ZS )ÚTestRandomNameSequencec                s   t  ¡ | _tƒ  ¡  d S )N)r   Ú_RandomNameSequenceÚrÚsuperr)   )r   )Ú	__class__r   r   r)   ’   s    
zTestRandomNameSequence.setUpc             C   s   t | jƒ}|  |ddd¡ d S )Nr   )ÚnextrY   r?   )r   Úsr   r   r   Útest_get_six_char_str–   s    
z,TestRandomNameSequence.test_get_six_char_strc             C   sL   i }| j }x<ttƒD ]0}t|ƒ}|  |ddd¡ |  ||¡ d||< qW d S )Nr   r   )rY   ÚrangeÚ
TEST_FILESr\   r?   ÚassertNotIn)r   rS   rY   Úir]   r   r   r   Ú	test_many›   s    z TestRandomNameSequence.test_manyc             C   s.   d}| j }x|D ]}|d7 }|dkrP qW d S )Nr   r   é   )rY   )r   rb   rY   r]   r   r   r   Úsupports_iter¦   s    
z$TestRandomNameSequence.supports_iterÚforkz!os.fork is required for this testc             C   sÖ   t  ¡ \}}d }zft  ¡ }|sTt  |¡ t  |t| jƒ d¡¡ t  |¡ t  d¡ t| jƒ}t  	|t
|ƒ¡ d¡}W d |r°yt  |tj¡ W n tk
r¢   Y nX t  |d¡ t  |¡ t  |¡ X |  ||¡ d S )NÚasciir   )r,   Úpiperf   ÚcloseÚwriter\   rY   ÚencodeÚ_exitÚreadr/   ÚdecodeÚkillÚsignalÚSIGKILLÚOSErrorÚwaitpidÚassertNotEqual)r   Zread_fdZwrite_fdÚpidZparent_valueZchild_valuer   r   r   Útest_process_awareness°   s(    




z-TestRandomNameSequence.test_process_awareness)r   r   r   r)   r^   rc   re   ÚunittestÚ
skipUnlessÚhasattrr,   rv   Ú__classcell__r   r   )r[   r   rW      s   
rW   c               @   s   e Zd Zdd„ Zdd„ ZdS )ÚTestCandidateTempdirListc             C   s8   t  ¡ }|  t|ƒdk¡ x|D ]}|  |t¡ q W d S )Nr   )r   Ú_candidate_tempdir_listÚassertFalser/   ÚassertIsInstancer   )r   ÚcandÚcr   r   r   Útest_nonempty_listÚ   s    
z+TestCandidateTempdirList.test_nonempty_listc          
   C   s°   t  ¡ ž}x*dD ]"}t |¡}|stj |¡||< qW t ¡ }x*dD ]"}t |¡}|sZt‚|  	||¡ qDW yt 
¡ }W n ttfk
r”   tj}Y nX |  	||¡ W d Q R X d S )N)ÚTMPDIRZTEMPZTMP)r   ÚEnvironmentVarGuardr,   Úgetenvr-   r2   r   r|   Ú
ValueErrorÚassertInÚgetcwdÚAttributeErrorrr   Úcurdir)r   ÚenvZenvnameÚdirnamer   r   r   r   Útest_wanted_dirsã   s     




 z)TestCandidateTempdirList.test_wanted_dirsN)r   r   r   r   rŒ   r   r   r   r   r{   ×   s   	r{   c               @   s   e Zd Zdd„ ZdS )ÚTestGetDefaultTempdirc                s  t  ¡ ð‰‡fdd„}t t d|¡Ê t  ¡  |  t ˆ¡g ¡ dd„ ‰t tdˆ¡6 |  	t
¡ t  ¡  W d Q R X |  t ˆ¡g ¡ W d Q R X ‡ ‡fdd„}t td|¡6‰ |  	t
¡ t  ¡  W d Q R X |  t ˆ¡g ¡ W d Q R X W d Q R X W d Q R X d S )	Nc                  s   ˆ gS )Nr   r   )Úour_temp_directoryr   r   Úour_candidate_list  s    zKTestGetDefaultTempdir.test_no_files_left_behind.<locals>.our_candidate_listr|   c              _   s
   t ƒ ‚d S )N)rr   )ÚargsÚkwargsr   r   r   Úraise_OSError  s    zFTestGetDefaultTempdir.test_no_files_left_behind.<locals>.raise_OSErrorÚopenc                 s   ˆ | |Ž}ˆ|_ |S )N)rj   )r   r‘   Úfp)Ú	orig_openr’   r   r   Ú
bad_writer  s    
zCTestGetDefaultTempdir.test_no_files_left_behind.<locals>.bad_writer)r   rO   r   Ú	swap_attrZ_get_default_tempdirr1   r,   ÚlistdirÚior   ÚFileNotFoundError)r   r   r–   r   )r•   rŽ   r’   r   Útest_no_files_left_behind  s     
z/TestGetDefaultTempdir.test_no_files_left_behindN)r   r   r   r›   r   r   r   r   r     s   r   c               @   s   e Zd Zdd„ Zdd„ ZdS )ÚTestGetCandidateNamesc             C   s   t  ¡ }|  |t j¡ d S )N)r   Ú_get_candidate_namesr~   rX   )r   Úobjr   r   r   Útest_retval)  s    z!TestGetCandidateNames.test_retvalc             C   s"   t  ¡ }t  ¡ }|  ||k¡ d S )N)r   r   r6   )r   ÚaÚbr   r   r   Útest_same_thing.  s    z%TestGetCandidateNames.test_same_thingN)r   r   r   rŸ   r¢   r   r   r   r   rœ   &  s   rœ   c           	   c   s>   t  ¡ } z$t t d| ¡ d V  W d Q R X W d t | ¡ X d S )NrL   )r   rF   r   r—   Úrmtree)r:   r   r   r   Ú_inside_empty_temp_dir6  s
    r¤   c                 s   t  td‡ fdd„¡S )Nr   c                  s   t ˆ ƒS )N)Úiterr   )Únamesr   r   Ú<lambda>C  r   z'_mock_candidate_names.<locals>.<lambda>)r   r—   r   )r¦   r   )r¦   r   Ú_mock_candidate_names@  s    r¨   c               @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚTestBadTempdirc             C   s°   t ƒ   t tj¡j }}|tjtjB tjB  M }t 	tj|¡ zPt 
tjtj¡r\|  d¡ |  t¡ |  ¡  W d Q R X |  t tj¡g ¡ W d t 	tj|¡ X W d Q R X d S )Nz!can't set the directory read-only)r¤   r,   r   r   rL   Úst_modeÚS_IWUSRÚS_IWGRPÚS_IWOTHÚchmodÚaccessÚW_OKZskipTestr   ÚPermissionErrorÚ	make_tempr1   r˜   )r   ZoldmodeÚmoder   r   r   Útest_read_only_directoryH  s    
z'TestBadTempdir.test_read_only_directoryc             C   s^   t ƒ N tj tjd¡}t td|¡$ |  t	¡ |  
¡  W d Q R X W d Q R X W d Q R X d S )NÚnonexistentrL   )r¤   r,   r-   Újoinr   rL   r   r—   r   rš   r²   )r   rL   r   r   r   Útest_nonexisting_directoryV  s
    z)TestBadTempdir.test_nonexisting_directoryc             C   sp   t ƒ ` tj tjd¡}t|dƒ ¡  t 	td|¡( |  
ttf¡ |  ¡  W d Q R X W d Q R X W d Q R X d S )NÚfileÚwbrL   )r¤   r,   r-   r¶   r   rL   r“   ri   r   r—   r   ÚNotADirectoryErrorrš   r²   )r   rL   r   r   r   Útest_non_directory]  s    z!TestBadTempdir.test_non_directoryN)r   r   r   r´   r·   r»   r   r   r   r   r©   F  s   r©   c               @   s˜   e Zd ZG dd„ dƒZddd„Zdd„ Zd	d
„ Zdd„ Zdd„ Ze	 
ed¡dd„ ƒZe	 
ed¡dd„ ƒZe	 
ed¡dd„ ƒZdd„ Zdd„ Zdd„ ZdS )ÚTestMkstempInnerc               @   s<   e Zd ZejZejZej	Z
ejZdd„ Zdd„ Zdd„ ZdS )zTestMkstempInner.mkstempedc             C   s>   |r| j }n| j}t |||¡}t |||||¡\| _| _d S )N)Ú_bflagsÚ_tflagsr   r   Ú_mkstemp_innerÚfdr9   )r   r:   r;   r<   ÚbinÚflagsÚoutput_typer   r   r   Ú__init__o  s
     z#TestMkstempInner.mkstemped.__init__c             C   s   t  | j|¡ d S )N)r,   rj   rÀ   )r   r   r   r   r   rj   v  s    z TestMkstempInner.mkstemped.writec             C   s   |   | j¡ |  | j¡ d S )N)Ú_closerÀ   Ú_unlinkr9   )r   r   r   r   Ú__del__y  s    z"TestMkstempInner.mkstemped.__del__N)r   r   r   r   Ú_bin_openflagsr½   Ú_text_openflagsr¾   r,   ri   rÅ   ÚunlinkrÆ   rÄ   rj   rÇ   r   r   r   r   Ú	mkstempedi  s   rË   Nr   c             C   sr   t  |||¡}|d kr0|tkr(t  ¡ }nt  ¡ }|d kr>|ƒ }|d krL|ƒ }|  ||||¡}|  |j|||¡ |S )N)r   r   r   rJ   rK   rË   r?   r9   )r   r:   r;   r<   rÁ   rÃ   r¸   r   r   r   Ú	do_create}  s    
zTestMkstempInner.do_createc             C   s^   |   ¡  d¡ | j dd d¡ | j dd d¡ | j ddd d¡ | j ddd d¡ d S )	Ns   blatr    )r;   r¡   )r<   )r;   r<   Úaaz.txt)rÌ   rj   )r   r   r   r   Ú
test_basic  s
    zTestMkstempInner.test_basicc          	   C   sô   t  ¡ }| j|dd d¡ | j|dd d¡ | j|dd d¡ | j|ddd d¡ | j|dd	d d¡ |  t¡ | jd
dd d¡ W d Q R X |  t¡ | j|d
d d¡ W d Q R X |  t¡ | j|dd
d d¡ W d Q R X d S )Nr   )r:   r<   s   blató   a)r:   r;   ó   b)r:   r;   r<   s   aas   .txtr   )r   rK   rÌ   rj   r   r   )r   Zdir_br   r   r   Útest_basic_with_bytes_names•  s    z,TestMkstempInner.test_basic_with_bytes_namesc             C   s.   t ttƒƒ}x|D ]}| jdd||< qW d S )NrÍ   )r;   )Úlistr_   r`   rÌ   )r   Úextantrb   r   r   r   Útest_basic_many¦  s    
z TestMkstempInner.test_basic_manyc          	   C   s0   t  ¡ }z| j|d d¡ W d t |¡ X d S )N)r:   s   blat)r   rF   rÌ   rj   r,   Úrmdir)r   r:   r   r   r   Útest_choose_directory¬  s    z&TestMkstempInner.test_choose_directoryzos.stat not availablec             C   sJ   |   ¡ }t t |j¡j¡}d}tjdkr:|d? }|d }|  ||¡ d S )Ni€  Úwin32é   éI   )	rÌ   r   ÚS_IMODEr,   r9   rª   ÚsysÚplatformr1   )r   r¸   r³   rT   Úuserr   r   r   Útest_file_mode´  s    
zTestMkstempInner.test_file_modezos.spawnl not availablec             C   sæ   t jrd}nd}|  ¡ }|  t |j¡d¡ d|j }yt}W n tk
r\   t	j
d }Y nX tj tj tj |¡¡d¡}t	jdkršdt	j }d| }nt	j}t tjt	j||||¡}|  |dk d	|  ¡ |  |dkd
| ¡ d S )NÚvÚqFz%dr   ztf_inherit_check.pyr×   z"%s"z$child process caught fatal signal %dz child process reports failure %d)r   ÚverboserÌ   r1   r,   Úget_inheritablerÀ   Ú__file__Ú	NameErrorrÛ   Úargvr-   r¶   r‹   r2   rÜ   Ú
executabler   ÚP_WAITr}   )r   rß   r¸   rÀ   ÚmeZtesterZ	decoratedZretvalr   r   r   Útest_noinheritÂ  s(    




zTestMkstempInner.test_noinheritztext mode not availablec             C   sL   | j dd}| d¡ | d¡ t |jdtj¡ |  t |jd¡d¡ d S )Nr   )rÁ   s   blats   extra
rd   s   blat)rÌ   rj   r,   ÚlseekrÀ   ÚSEEK_SETr1   rm   )r   Úfr   r   r   Útest_textmodeè  s
    

zTestMkstempInner.test_textmodec             C   s   t  t  ¡ t  ¡ dt jt¡S )Nr   )r   r¿   rJ   rH   rÈ   r   )r   r   r   r   r²   ó  s
    
zTestMkstempInner.make_tempc          
   C   sz   t ƒ j tdddƒR |  ¡ \}}t |¡ |  | d¡¡ |  ¡ \}}t |¡ |  | d¡¡ W d Q R X W d Q R X d S )NÚaaaÚbbb)r¤   r¨   r²   r,   ri   r6   Úendswith)r   Zfd1Zname1Zfd2Zname2r   r   r   Ú!test_collision_with_existing_fileú  s    

z2TestMkstempInner.test_collision_with_existing_filec          
   C   sl   t ƒ \ tdddƒD t ¡ }|  | d¡¡ |  ¡ \}}t |¡ |  | d¡¡ W d Q R X W d Q R X d S )Nrî   rï   )	r¤   r¨   r   rF   r6   rð   r²   r,   ri   )r   r:   rÀ   r9   r   r   r   Ú&test_collision_with_existing_directory  s    
z7TestMkstempInner.test_collision_with_existing_directory)NNNr   )r   r   r   rË   rÌ   rÎ   rÑ   rÔ   rÖ   rw   rx   Úhas_statrÞ   Ú
has_spawnlré   Úhas_textmoderí   r²   rñ   rò   r   r   r   r   r¼   f  s   
&r¼   c               @   s   e Zd Zdd„ Zdd„ ZdS )ÚTestGetTempPrefixc             C   sL   t  ¡ }|  |t¡ |  t|ƒd¡ t  ¡ }|  |t¡ |  t|ƒd¡ d S )Nr   )r   rH   r~   r   ZassertGreaterr/   rI   r   )r   ÚpZpbr   r   r   Útest_sane_template  s    z$TestGetTempPrefix.test_sane_templatec          	   C   sd   t  ¡ d }t jdd}z:tj ||¡}t |tjtjB ¡}t 	|¡ t 
|¡ W d t |¡ X d S )Nz
xxxxxx.xxxr   )Úprefix)r   rH   rF   r,   r-   r¶   r“   ÚO_RDWRÚO_CREATri   rÊ   rÕ   )r   r÷   ÚdrÀ   r   r   r   Útest_usable_template#  s    
z&TestGetTempPrefix.test_usable_templateN)r   r   r   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	S )
ÚTestGetTempDirc             C   sX   xRt  ¡ t  ¡ fD ]>}|  tj |¡p.|tjkd| ¡ |  tj |¡d| ¡ qW d S )Nz%r is not an absolute pathz%r is not a directory)	r   rJ   rK   r6   r,   r-   Úisabsr‰   Úisdir)r   rü   r   r   r   Útest_directory_exists7  s
    
z$TestGetTempDir.test_directory_existsc             C   s   t  ¡ }| d¡ | ¡  d S )Ns   blat)r   rC   rj   ri   )r   r¸   r   r   r   Útest_directory_writable@  s    
z&TestGetTempDir.test_directory_writablec             C   sP   t  ¡ }t  ¡ }t  ¡ }|  ||k¡ |  t|ƒt|ƒ¡ |  |t |¡¡ d S )N)	r   rJ   rK   r6   rt   r0   r1   r,   Úfsdecode)r   r    r¡   r€   r   r   r   r¢   J  s    zTestGetTempDir.test_same_thingc          	   C   s`   t  d¡}t jd  }t _z0t ¡ }||d< |  t  ¡ |¡ W d Q R X W d |t _t |¡ X d S )Nz-Tempr‚   )r   rF   rL   r   rƒ   r1   rJ   rÕ   )r   Zcase_sensitive_tempdirZ_tempdirrŠ   r   r   r   Útest_case_sensitiveT  s    

z"TestGetTempDir.test_case_sensitiveN)r   r   r   r  r  r¢   r  r   r   r   r   rþ   4  s   	

rþ   c               @   s.   e Zd Zd
dd„Zdd„ Zdd„ Zdd	„ ZdS )ÚTestMkstempNc       
   	   C   sÂ   t  |||¡}|d kr0|tkr(t  ¡ }nt  ¡ }|d kr>|ƒ }|d krL|ƒ }t j|||d\}}tj |¡\}}tj 	|¡}	|  
|	|d|	|f ¡ z|  ||||¡ W d t |¡ t |¡ X d S )N)r:   rù   Úsuffixz+Directory '%s' incorrectly returned as '%s')r   r   r   rJ   rK   rE   r,   r-   r.   r2   r1   r?   ri   rÊ   )
r   r:   r;   r<   rÃ   rÀ   r9   r=   r>   Zadirr   r   r   rÌ   f  s$    

zTestMkstemp.do_createc             C   sL   |   ¡  | j dd | j dd | j ddd | j ddd | j dd	 d S )
Nr    )r;   r¡   )r<   )r;   r<   rÍ   z.txtÚ.)r:   )rÌ   )r   r   r   r   rÎ   }  s    zTestMkstemp.test_basicc          	   C   sÔ   t  ¡ }| j|dd | j|dd | j|dd | j|ddd | j|ddd | jd	d
 |  t¡ | jdddd W d Q R X |  t¡ | jd	ddd W d Q R X |  t¡ | jd	ddd W d Q R X d S )Nr   )r:   r<   rÏ   )r:   r;   rÐ   )r:   r;   r<   s   aas   .txtó   .)r:   r  rÍ   z.txt)r   rK   rÌ   r   r   )r   rü   r   r   r   rÑ   †  s    z'TestMkstemp.test_basic_with_bytes_namesc          	   C   s*   t  ¡ }z| j|d W d t |¡ X d S )N)r:   )r   rF   rÌ   r,   rÕ   )r   r:   r   r   r   rÖ   ˜  s    z!TestMkstemp.test_choose_directory)NNN)r   r   r   rÌ   rÎ   rÑ   rÖ   r   r   r   r   r  c  s   
	r  c               @   sb   e Zd Zdd„ Zddd„Zdd„ Zdd	„ Zd
d„ Zdd„ Ze	 
ed¡dd„ ƒZdd„ Zdd„ ZdS )ÚTestMkdtempc             C   s   t  ¡ S )N)r   rF   )r   r   r   r   r²   ¤  s    zTestMkdtemp.make_tempNc             C   sŽ   t  |||¡}|d kr0|tkr(t  ¡ }nt  ¡ }|d kr>|ƒ }|d krL|ƒ }t j|||d}y|  ||||¡ |S    t |¡ ‚ Y nX d S )N)r:   rù   r  )	r   r   r   rJ   rK   rF   r?   r,   rÕ   )r   r:   r;   r<   rÃ   r9   r   r   r   rÌ   §  s     

zTestMkdtemp.do_createc             C   s^   t  |  ¡ ¡ t  | jdd¡ t  | jdd¡ t  | jddd¡ t  | jddd¡ d S )Nr    )r;   r¡   )r<   )r;   r<   rÍ   z.txt)r,   rÕ   rÌ   )r   r   r   r   rÎ   »  s
    zTestMkdtemp.test_basicc          	   C   sö   t  ¡ }t | j|d¡ t | j|dd¡ t | j|dd¡ t | j|ddd¡ t | j|ddd¡ |  t¡ t | j|d	dd¡ W d Q R X |  t¡ t | j|dd
d¡ W d Q R X |  t¡ t | jdddd¡ W d Q R X d S )N)r:   rÏ   )r:   r;   rÐ   )r:   r<   )r:   r;   r<   s   aas   .txtrÍ   z.txtr   )r   rK   r,   rÕ   rÌ   r   r   )r   rü   r   r   r   rÑ   Ã  s      z'TestMkdtemp.test_basic_with_bytes_namesc          
   C   sX   t ttƒƒ}z"x|D ]}| jdd||< qW W d x |D ]}t|tƒr6t |¡ q6W X d S )NrÍ   )r;   )rÒ   r_   r`   rÌ   r3   r   r,   rÕ   )r   rÓ   rb   r   r   r   rÔ   Ò  s    


zTestMkdtemp.test_basic_manyc          	   C   s0   t  ¡ }zt | j|d¡ W d t |¡ X d S )N)r:   )r   rF   r,   rÕ   rÌ   )r   r:   r   r   r   rÖ   Ý  s    z!TestMkdtemp.test_choose_directoryzos.stat not availablec          	   C   sb   |   ¡ }zHt t |¡j¡}|dM }d}tjdkrB|d? }|d }|  ||¡ W d t |¡ X d S )Niÿ  iÀ  r×   rØ   rÙ   )	rÌ   r   rÚ   r,   rª   rÛ   rÜ   r1   rÕ   )r   r:   r³   rT   rÝ   r   r   r   Ú	test_modeå  s    
zTestMkdtemp.test_modec          
   C   sl   t ƒ \ tdddƒD tjdd}| ¡  |  |j d¡¡ t ¡ }|  | d¡¡ W d Q R X W d Q R X d S )Nrî   rï   F)Údelete)	r¤   r¨   r   rC   ri   r6   r9   rð   rF   )r   r¸   r:   r   r   r   rñ   ÷  s    z-TestMkdtemp.test_collision_with_existing_filec          
   C   s^   t ƒ N tdddƒ6 t ¡ }|  | d¡¡ t ¡ }|  | d¡¡ W d Q R X W d Q R X d S )Nrî   rï   )r¤   r¨   r   rF   r6   rð   )r   Zdir1Zdir2r   r   r   rò     s    z2TestMkdtemp.test_collision_with_existing_directory)NNN)r   r   r   r²   rÌ   rÎ   rÑ   rÔ   rÖ   rw   rx   ró   r
  rñ   rò   r   r   r   r   r	  ¡  s   
r	  c                   sP   e Zd Z‡ fdd„Z‡ fdd„ZG dd„ dƒZddd	„Zd
d„ Zdd„ Z‡  Z	S )Ú
TestMktempc                s   t  ¡ | _tƒ  ¡  d S )N)r   rF   r:   rZ   r)   )r   )r[   r   r   r)     s    
zTestMktemp.setUpc                s&   | j rt | j ¡ d | _ tƒ  ¡  d S )N)r:   r,   rÕ   rZ   r+   )r   )r[   r   r   r+     s    zTestMktemp.tearDownc               @   s(   e Zd ZejZejZdd„ Z	dd„ Z
dS )zTestMktemp.mktempedc             C   s.   t j|||d| _t t | j| jd¡¡ d S )N)r:   rù   r  i€  )r   r   r9   r,   ri   r“   r½   )r   r:   r;   r<   r   r   r   rÄ      s    zTestMktemp.mktemped.__init__c             C   s   |   | j¡ d S )N)rÆ   r9   )r   r   r   r   rÇ   &  s    zTestMktemp.mktemped.__del__N)r   r   r   r,   rÊ   rÆ   r   rÈ   r½   rÄ   rÇ   r   r   r   r   Úmktemped  s   r  r   c             C   s(   |   | j||¡}|  |j| j||¡ |S )N)r  r:   r?   r9   )r   r;   r<   r¸   r   r   r   rÌ   )  s    zTestMktemp.do_createc             C   s@   |   ¡  | j dd | j dd | j ddd | j ddd d S )Nr    )r;   r¡   )r<   )r;   r<   rÍ   z.txt)rÌ   )r   r   r   r   rÎ   /  s
    zTestMktemp.test_basicc             C   s.   t ttƒƒ}x|D ]}| jdd||< qW d S )NrÍ   )r;   )rÒ   r_   r`   rÌ   )r   rÓ   rb   r   r   r   rc   7  s    
zTestMktemp.test_many)r   r   )
r   r   r   r)   r+   r  rÌ   rÎ   rc   rz   r   r   )r[   r   r    s   
r  c               @   sf   e Zd Zd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S )ÚTestNamedTemporaryFileNr   Tc             C   s8   |d krt  ¡ }t j||||d}|  |j|||¡ |S )N)r:   rù   r  r  )r   rJ   rC   r?   r9   )r   r:   r;   r<   r  r¸   r   r   r   rÌ   L  s    
z TestNamedTemporaryFile.do_createc             C   s@   |   ¡  | j dd | j dd | j ddd | j ddd d S )Nr    )r;   r¡   )r<   )r;   r<   rÍ   z.txt)rÌ   )r   r   r   r   rÎ   V  s
    z!TestNamedTemporaryFile.test_basicc             C   sP   |   ¡ }t |¡}|j}|j}~|dƒ ~|dƒ ~tjddrL|  |ƒ ¡ d S )Ns   foos   barT)Zcpython)rÌ   ÚweakrefÚrefrj   r   Zcheck_impl_detailÚassertIsNone)r   rì   Úwrrj   Zwrite2r   r   r   Útest_method_lookup^  s    
z)TestNamedTemporaryFile.test_method_lookupc                sV   dddg‰ ‡ fdd„}x&t |ƒ ƒD ]\}}|  |ˆ | ¡ q"W |  |tˆ ƒd ¡ d S )Ns   spam
s   eggs
s   beans
c                 s*   t jdd} |  d ˆ ¡¡ |  d¡ | S )Nzw+b)r³   r   r   )r   rC   rj   r¶   Úseek)rì   )Úlinesr   r   Ú	make_filer  s    
z3TestNamedTemporaryFile.test_iter.<locals>.make_filer   )Ú	enumerater1   r/   )r   r  rb   Úlr   )r  r   Ú	test_itern  s
    
z TestNamedTemporaryFile.test_iterc             C   s(   t  ¡ }|  tj |j¡d|j ¡ d S )Nz$NamedTemporaryFile %s does not exist)r   rC   r6   r,   r-   Úexistsr9   )r   rì   r   r   r   Útest_creates_named{  s    z)TestNamedTemporaryFile.test_creates_namedc          	   C   sX   t  ¡ }z>t j|d}| d¡ | ¡  |  tj |j	¡d|j	 ¡ W d t 
|¡ X d S )N)r:   s   blatz(NamedTemporaryFile %s exists after close)r   rF   rC   rj   ri   r}   r,   r-   r  r9   rÕ   )r   r:   rì   r   r   r   Útest_del_on_close  s    
z(TestNamedTemporaryFile.test_del_on_closec          	   C   sv   t  ¡ }d }zFt j|dd}|j}| d¡ | ¡  |  tj 	|j¡d|j ¡ W d |d k	rft 
|¡ t |¡ X d S )NF)r:   r  s   blatz)NamedTemporaryFile %s missing after close)r   rF   rC   r9   rj   ri   r6   r,   r-   r  rÊ   rÕ   )r   r:   Útmprì   r   r   r   Útest_dis_del_on_close  s    

z,TestNamedTemporaryFile.test_dis_del_on_closec             C   s.   t  ¡ }| d¡ | ¡  | ¡  | ¡  d S )Ns   abc
)r   rC   rj   ri   )r   rì   r   r   r   Útest_multiple_close  s
    
z*TestNamedTemporaryFile.test_multiple_closec          	      sX   t  ¡ ‰ |  tj ˆ j¡¡ W d Q R X |  tj ˆ j¡¡ ‡ fdd„}|  t	|¡ d S )Nc            	      s   ˆ  W d Q R X d S )Nr   r   )rì   r   r   Ú
use_closedª  s    z?TestNamedTemporaryFile.test_context_manager.<locals>.use_closed)
r   rC   r6   r,   r-   r  r9   r}   r   r…   )r   r   r   )rì   r   Útest_context_manager¥  s
    
z+TestNamedTemporaryFile.test_context_managerc          
      sn   g ‰ t j‰‡ ‡fdd„}tjd|d> tjdtd$ |  ttj¡ |  t	ˆ ƒd¡ W d Q R X W d Q R X d S )Nc                s   ˆ   | ¡ ˆ| ƒ d S )N)rR   )rÀ   )ÚclosedÚos_closer   r   ri   ³  s    
z5TestNamedTemporaryFile.test_no_leak_fd.<locals>.closezos.close)Úside_effectzio.openr   )
r,   ri   r   Úpatchr…   r   r   rC   r1   r/   )r   ri   r   )r"  r#  r   Útest_no_leak_fd¯  s    z&TestNamedTemporaryFile.test_no_leak_fdc          	   C   st   t  ¡ }|  tj|¡ |  t¡ t jd|d W d Q R X |  t¡ t jd|d W d Q R X |  	t
 |¡g ¡ d S )Nr  )r³   r:   é   )r   rF   Z
addCleanupr   r£   r   r…   rC   r   r1   r,   r˜   )r   r:   r   r   r   Útest_bad_mode¼  s    z$TestNamedTemporaryFile.test_bad_mode)Nr   r   T)r   r   r   rÌ   rÎ   r  r  r  r  r  r  r!  r&  r(  r   r   r   r   r  I  s   


r  c               @   s¦   e Zd Zd*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d&d'„ Zd(d)„ ZdS )+ÚTestSpooledTemporaryFiler   Nr   c             C   s&   |d krt  ¡ }t j||||d}|S )N)Úmax_sizer:   rù   r  )r   rJ   rN   )r   r*  r:   r;   r<   r¸   r   r   r   rÌ   Ê  s    z"TestSpooledTemporaryFile.do_createc             C   s4   |   ¡ }|  |j¡ | j dddd}|  |j¡ d S )Nr	   r    z.txt)r*  r;   r<   )rÌ   r}   Ú_rolled)r   rì   r   r   r   rÎ   Ò  s    z#TestSpooledTemporaryFile.test_basicc          	   C   s~   t  ¡ }zdt jd|d}|  |j¡ | d¡ |  |j¡ |j}| ¡  |  t	|t
ƒo`tj |¡d| ¡ W d t |¡ X d S )Né
   )r*  r:   s   blat blat blat blat blat z*SpooledTemporaryFile %s exists after close)r   rF   rN   r}   r+  rj   r6   r9   ri   r3   r   r,   r-   r  rÕ   )r   r:   rì   Úfilenamer   r   r   r  Ù  s    
z*TestSpooledTemporaryFile.test_del_on_closec             C   sP   | j dd}|  |j¡ x&tdƒD ]}| dd¡ | d¡ q"W |  |j¡ d S )Né   )r*  é   r   s   xxxxxxxxxxxxxxxxxxxx)rÌ   r}   r+  r_   r  rj   )r   rì   rb   r   r   r   Útest_rewrite_smallè  s    z+TestSpooledTemporaryFile.test_rewrite_smallc             C   s^   | j dd}|  |j¡ | d¡ |  |j¡ | d¡ |  |j¡ | d¡ |  |j¡ d S )Nr.  )r*  s   xxxxxxxxxxxxxxxxxxxxs
   xxxxxxxxxxó   x)rÌ   r}   r+  rj   r6   )r   rì   r   r   r   Útest_write_sequentialñ  s    


z.TestSpooledTemporaryFile.test_write_sequentialc             C   s4   |   ¡ }| d¡ | d¡ | ¡ }|  |d¡ d S )N)r1  ó   yó   zr   s   xyz)rÌ   Ú
writelinesr  rm   r1   )r   rì   Úbufr   r   r   Útest_writelinesý  s
    

z(TestSpooledTemporaryFile.test_writelinesc             C   s<   | j dd}| d¡ |  |j¡ | d¡ |  |j¡ d S )Né#   )r*  )s   xxxxxxxxxxxxxxxxxxxxs
   xxxxxxxxxxs   xxxxxr1  )rÌ   r5  r}   r+  rj   r6   )r   rì   r   r   r   Útest_writelines_sequential  s
    

z3TestSpooledTemporaryFile.test_writelines_sequentialc             C   sJ   | j dd}|  |j¡ | dd¡ |  |j¡ | d¡ |  |j¡ d S )Nr.  )r*  r	   r   r1  )rÌ   r}   r+  r  rj   r6   )r   rì   r   r   r   Útest_sparse  s    
z$TestSpooledTemporaryFile.test_sparsec             C   s:   | j dd}|  |j¡ |  | ¡ dk¡ |  |j¡ d S )Nr.  )r*  r   )rÌ   r}   r+  r6   Úfileno)r   rì   r   r   r   Útest_fileno  s    z$TestSpooledTemporaryFile.test_filenoc             C   s:   t  ¡ }| d¡ |  |j¡ | ¡  | ¡  | ¡  d S )Ns   abc
)r   rN   rj   r}   r+  ri   )r   rì   r   r   r   Ú#test_multiple_close_before_rollover  s    
z<TestSpooledTemporaryFile.test_multiple_close_before_rolloverc             C   s>   t jdd}| d¡ |  |j¡ | ¡  | ¡  | ¡  d S )Nr   )r*  s   abc
)r   rN   rj   r6   r+  ri   )r   rì   r   r   r   Ú"test_multiple_close_after_rollover(  s    
z;TestSpooledTemporaryFile.test_multiple_close_after_rolloverc             C   sL   | j dd}|j}|j}|j}|dƒ |dƒ |ddƒ |  |dƒd¡ d S )Nr.  )r*  s#   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaas#   bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbr   éF   sF   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb)rÌ   rm   rj   r  r1   )r   rì   rm   rj   r  r   r   r   Útest_bound_methods1  s    
z+TestSpooledTemporaryFile.test_bound_methodsc          	   C   sà   t jdd}| d¡ |  |j¡ |  |jd¡ |  |j¡ |  	t
¡ |j W d Q R X |  	t
¡ |j W d Q R X | d¡ |  |j¡ |  |jd¡ |  |j¡ |  	t
¡ |j W d Q R X |  	t
¡ |j W d Q R X d S )Nr,  )r*  s
   xxxxxxxxxxzw+br1  zrb+)r   rN   rj   r}   r+  r1   r³   r  r9   r   rˆ   ÚnewlinesÚencodingr6   ÚassertIsNotNone)r   rì   r   r   r   Útest_properties?  s"    

z(TestSpooledTemporaryFile.test_propertiesc             C   s"  t jddd}| d¡ | d¡ |  | ¡ d¡ | d¡ | d¡ |  | ¡ d¡ |  |j¡ |  |jd¡ |  	|j
¡ |  	|j¡ |  	|j¡ | d¡ | d¡ |  | ¡ d	¡ | d
¡ | d¡ |  | ¡ d¡ |  |j¡ |  |jd¡ |  |j
¡ |  |jtj¡ |  |j¡ d S )Nzw+r,  )r³   r*  zabc
r   zdef
zabc
def
zxyzzy
zabc
def
xyzzy
zfoobar
zabc
def
xyzzy
foobar
)r   rN   rj   r  r1   rm   r}   r+  r³   r  r9   rA  rB  r6   rC  r,   Úlinesep)r   rì   r   r   r   Útest_text_modeS  s.    







z'TestSpooledTemporaryFile.test_text_modec             C   sÜ   t jddddd}| d¡ | d¡ |  | ¡ d¡ |  |j¡ |  |jd¡ |  	|j
¡ |  	|j¡ |  	|j¡ | d¡ | d¡ |  | ¡ d	¡ |  |j¡ |  |jd¡ |  |j
¡ |  |j¡ |  |jd¡ d S )
Nzw+r,  r   zutf-8)r³   r*  ÚnewlinerB  u   Î›
r   u*   Î›Î›Î›Î›Î›Î›Î›Î›Î›Î›Î›Î›Î›Î›Î›Î›Î›Î›Î›Î›
u.   Î›
Î›Î›Î›Î›Î›Î›Î›Î›Î›Î›Î›Î›Î›Î›Î›Î›Î›Î›Î›Î›
)r   rN   rj   r  r1   rm   r}   r+  r³   r  r9   rA  rB  r6   rC  )r   rì   r   r   r   Útest_text_newline_and_encodingp  s$    




z7TestSpooledTemporaryFile.test_text_newline_and_encodingc          	      sX   t jdd‰ |  ˆ j¡ |  ˆ j¡ W d Q R X |  ˆ j¡ ‡ fdd„}|  t|¡ d S )Nr   )r*  c            	      s   ˆ  W d Q R X d S )Nr   r   )rì   r   r   r   ‹  s    zQTestSpooledTemporaryFile.test_context_manager_before_rollover.<locals>.use_closed)r   rN   r}   r+  r"  r6   r   r…   )r   r   r   )rì   r   Ú$test_context_manager_before_rollover…  s    z=TestSpooledTemporaryFile.test_context_manager_before_rolloverc          	      sv   t jdd<‰ |  ˆ j¡ ˆ  d¡ ˆ  ¡  |  ˆ j¡ |  ˆ j¡ W d Q R X |  ˆ j¡ ‡ fdd„}|  t	|¡ d S )Nr   )r*  s   abc
c            	      s   ˆ  W d Q R X d S )Nr   r   )rì   r   r   r   ™  s    zQTestSpooledTemporaryFile.test_context_manager_during_rollover.<locals>.use_closed)
r   rN   r}   r+  rj   Úflushr6   r"  r   r…   )r   r   r   )rì   r   Ú$test_context_manager_during_rollover  s    
z=TestSpooledTemporaryFile.test_context_manager_during_rolloverc          	      sn   t jdd‰ ˆ  d¡ ˆ  ¡  |  ˆ j¡ ˆ  |  ˆ j¡ W d Q R X |  ˆ j¡ ‡ fdd„}|  t	|¡ d S )Nr   )r*  s   abc
c            	      s   ˆ  W d Q R X d S )Nr   r   )rì   r   r   r   §  s    zPTestSpooledTemporaryFile.test_context_manager_after_rollover.<locals>.use_closed)
r   rN   rj   rJ  r6   r+  r}   r"  r   r…   )r   r   r   )rì   r   Ú#test_context_manager_after_rolloverž  s    
z<TestSpooledTemporaryFile.test_context_manager_after_rolloverc             C   sÐ   t jdd}| d¡ | d¡ | ¡  |  |j¡ |  |j 	¡ d¡ t jdd}| d¡ | d¡ |  |j¡ |  |j 	¡ d¡ t jdd}| d¡ | d¡ |  
|j¡ trÌ|  t | ¡ ¡jd¡ d S )	Nr,  )r*  s   abcdefg
r   r   é   s   abcdrd   )r   rN   rj   r  Útruncater}   r+  r1   Z_fileÚgetvaluer6   ró   r,   Úfstatr;  Úst_size)r   rì   r   r   r   Ú!test_truncate_with_size_parameter¬  s"    





z:TestSpooledTemporaryFile.test_truncate_with_size_parameter)r   Nr   r   )r   r   r   rÌ   rÎ   r  r0  r2  r7  r9  r:  r<  r=  r>  r@  rD  rF  rH  rI  rK  rL  rR  r   r   r   r   r)  Ç  s&   
		
		r)  c               @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚTestTemporaryFilec             C   s   t  ¡  d S )N)r   rD   )r   r   r   r   rÎ   È  s    zTestTemporaryFile.test_basicc             C   sR   t  ¡ }t j|d}| d¡ yt |¡ W n    | ¡  t |¡ ‚ Y nX d S )N)r:   s   blat)r   rF   rD   rj   r,   rÕ   ri   )r   r:   rì   r   r   r   Útest_has_no_nameÍ  s    

z"TestTemporaryFile.test_has_no_namec             C   s.   t  ¡ }| d¡ | ¡  | ¡  | ¡  d S )Ns   abc
)r   rD   rj   ri   )r   rì   r   r   r   r  Ý  s
    
z%TestTemporaryFile.test_multiple_closec                s@   ‡ fdd„}|ddƒ |ddƒ |dddd	 |d
ddd d S )Nc          	      s@   t j||Ž*}| | ¡ | d¡ ˆ  | | ¡ ¡ W d Q R X d S )Nr   )r   rD   rj   r  r1   rm   )Úinputr   r‘   Zfileobj)r   r   r   Ú	roundtripè  s    

z;TestTemporaryFile.test_mode_and_encoding.<locals>.roundtrips   1234zw+bzabdc
zw+u   Î›zutf-16)rB  zfoo
r   )rG  r   )r   rV  r   )r   r   Útest_mode_and_encodingæ  s
    

z(TestTemporaryFile.test_mode_and_encodingc          
      sn   g ‰ t j‰‡ ‡fdd„}tjd|d> tjdtd$ |  ttj¡ |  t	ˆ ƒd¡ W d Q R X W d Q R X d S )Nc                s   ˆ   | ¡ ˆ| ƒ d S )N)rR   )rÀ   )r"  r#  r   r   ri   ÷  s    
z0TestTemporaryFile.test_no_leak_fd.<locals>.closezos.close)r$  zio.openr   )
r,   ri   r   r%  r…   r   r   rD   r1   r/   )r   ri   r   )r"  r#  r   r&  ó  s    z!TestTemporaryFile.test_no_leak_fdN)r   r   r   rÎ   rT  r  rW  r&  r   r   r   r   rS  Å  s
   	rS  c               @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚNulledModulesc             G   s&   dd„ |D ƒ| _ dd„ | j D ƒ| _d S )Nc             S   s   g | ]
}|j ‘qS r   )rQ   )Ú.0Úmodr   r   r   ú
<listcomp>  s    z*NulledModules.__init__.<locals>.<listcomp>c             S   s   g | ]}|  ¡ ‘qS r   )Úcopy)rY  r  r   r   r   r[    s    )ÚrefsÚcontents)r   Úmodulesr   r   r   rÄ     s    zNulledModules.__init__c             C   s*   x$| j D ]}x|D ]}d ||< qW qW d S )N)r]  )r   rü   rU   r   r   r   r%     s    
zNulledModules.__enter__c             G   s2   x,t | j| jƒD ]\}}| ¡  | |¡ qW d S )N)Úzipr]  r^  ÚclearÚupdate)r   Úexc_inforü   r€   r   r   r   r*     s    zNulledModules.__exit__N)r   r   r   rÄ   r%   r*   r   r   r   r   rX    s   rX  c               @   sj   e Zd Zddd„Zdd„ Zdd	„ Zejd
d„ ƒZej	dd„ ƒZ
dd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚTestTemporaryDirectoryNr   r   c          	   C   s‚   |d krt  ¡ }t j|||d}|  |j|||¡ |rR|  |j|||d ¡}d |_ttj 	|jd¡dƒ}| 
d¡ W d Q R X |S )N)r:   rù   r  r   ztest.txtr¹   s   Hello world!)r   rJ   rO   r?   r9   rÌ   r“   r,   r-   r¶   rj   )r   r:   r;   r<   Úrecurser  Úd1rì   r   r   r   rÌ     s    z TestTemporaryDirectory.do_createc          	   C   sL   t  ¡ }W d Q R X |  t¡}t j|d W d Q R X |  |jjtj¡ d S )N)r:   )r   rO   r   rš   r1   Z	exceptionÚerrnoÚENOENT)r   rµ   Úcmr   r   r   Útest_mkdtemp_failure"  s
    

z+TestTemporaryDirectory.test_mkdtemp_failurec          	   C   sj   t  ¡ }zP| j|d}|  tj |j¡d|j ¡ | ¡  |  	tj |j¡d|j ¡ W d t 
|¡ X d S )N)r:   z$TemporaryDirectory %s does not existz*TemporaryDirectory %s exists after cleanup)r   rF   rÌ   r6   r,   r-   r  r9   Úcleanupr}   rÕ   )r   r:   rü   r   r   r   Útest_explicit_cleanup,  s    z,TestTemporaryDirectory.test_explicit_cleanupc             C   sŒ   |   ¡ }| j dd}t |jtj |jd¡¡ | ¡  |  tj |j¡d|j ¡ |  	tj |j¡d¡ |  
t |j¡dgd¡ | ¡  d S )Nr   )re  Zfooz*TemporaryDirectory %s exists after cleanupz-Directory pointed to by a symlink was deletedztest.txtz>Contents of the directory pointed to by a symlink were deleted)rÌ   r,   Úsymlinkr9   r-   r¶   rk  r}   r  r6   r1   r˜   )r   rf  Zd2r   r   r   Ú(test_cleanup_with_symlink_to_a_directory9  s    z?TestTemporaryDirectory.test_cleanup_with_symlink_to_a_directoryc          	   C   sJ   t  ¡ }z0| j|d}|j}~|  tj |¡d| ¡ W d t |¡ X d S )N)r:   z*TemporaryDirectory %s exists after __del__)	r   rF   rÌ   r9   r}   r,   r-   r  rÕ   )r   r:   rü   r9   r   r   r   Útest_del_on_collectionN  s    z-TestTemporaryDirectory.test_del_on_collectionc          	   C   sŽ   |   ¡ |}xtdD ]l}dj||d}t d|¡\}}}| ¡  ¡ }|  tj 	|¡d| ¡ | dd¡}|  
d|¡ |  d	|¡ qW W d Q R X d S )
N)Úbuiltinsr,   ZshutilrÛ   r   r&   a¼  if True:
                    import builtins
                    import os
                    import shutil
                    import sys
                    import tempfile
                    import warnings

                    tmp = tempfile.TemporaryDirectory(dir={dir!r})
                    sys.stdout.buffer.write(tmp.name.encode())

                    tmp2 = os.path.join(tmp.name, 'test_dir')
                    os.mkdir(tmp2)
                    with open(os.path.join(tmp2, "test.txt"), "w") as f:
                        f.write("Hello world!")

                    {mod}.tmp = tmp

                    warnings.filterwarnings("always", category=ResourceWarning)
                    )r:   rZ  z-cz*TemporaryDirectory %s exists after cleanupzutf-8Úbackslashreplacez
Exception z'ResourceWarning: Implicitly cleaning up)rÌ   Úformatr   Úassert_python_okrn   Ústripr}   r,   r-   r  ra   r†   )r   r:   rZ  ÚcodeÚrcÚoutÚerrÚtmp_namer   r   r   Útest_del_on_shutdown[  s    


z+TestTemporaryDirectory.test_del_on_shutdownc          	   C   s~   |   ¡ l}dj|d}t d|¡\}}}| ¡  ¡ }|  tj 	|¡d| ¡ | dd¡}|  
d|¡ |  d|¡ W d Q R X d S )	Na©  if True:
                import sys
                import tempfile
                import warnings

                def generator():
                    with tempfile.TemporaryDirectory(dir={dir!r}) as tmp:
                        yield tmp
                g = generator()
                sys.stdout.buffer.write(next(g).encode())

                warnings.filterwarnings("always", category=ResourceWarning)
                )r:   z-cz*TemporaryDirectory %s exists after cleanupzutf-8rq  z
Exception z'ResourceWarning: Implicitly cleaning up)rÌ   rr  r   rs  rn   rt  r}   r,   r-   r  ra   r†   )r   r:   ru  rv  rw  rx  ry  r   r   r   Útest_exit_on_shutdown{  s    

z,TestTemporaryDirectory.test_exit_on_shutdownc          
   C   sz   |   ¡ h}| j |dd}|j}tjdtfdd tjdtd ~t ¡  W d Q R X |  t	j
 |¡d| ¡ W d Q R X d S )	Né   )r:   re  Z
ImplicitlyF)ÚquietÚalways)r    z*TemporaryDirectory %s exists after __del__)rÌ   r9   r   r#   ÚResourceWarningr&   r'   Z
gc_collectr}   r,   r-   r  )r   r:   rü   r9   r   r   r   Útest_warnings_on_cleanup“  s    
z/TestTemporaryDirectory.test_warnings_on_cleanupc             C   s$   |   ¡ }| ¡  | ¡  | ¡  d S )N)rÌ   rk  )r   rü   r   r   r   r  ¡  s    z*TestTemporaryDirectory.test_multiple_closec          	   C   sN   |   ¡ }|&}|  tj |¡¡ |  ||j¡ W d Q R X |  tj |¡¡ d S )N)rÌ   r6   r,   r-   r  r1   r9   r}   )r   rü   r9   r   r   r   r!  ¨  s
    z+TestTemporaryDirectory.test_context_manager)Nr   r   r   )r   r   r   rÌ   rj  rl  r   Zskip_unless_symlinkrn  Zcpython_onlyro  rz  r{  r€  r  r!  r   r   r   r   rd    s   

 rd  Ú__main__)5r   rg  r™   r,   rp   rÛ   r@   r&   Ú
contextlibr  rw   r   Ztestr   Ztest.supportr   ry   r   ró   rÉ   rÈ   rõ   rô   rÜ   Ú
startswithr`   ZTestCaser
   r   rB   rW   r{   r   rœ   Úcontextmanagerr¤   r¨   r©   r¼   rö   rþ   r  r	  r  r  r)  rC   rD   rS  rX  rd  r   Úmainr   r   r   r   Ú<module>   sb   

.H*%
  / />l<~ }>  
