o
    ±ó®gu  ã                   @   sT  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mZmZmZmZmZmZmZmZmZmZ d dlZd dlZzd dlZW n eyu   dZY nw d dl m!Z! d dl"m#Z# d dl$m%Z%m&Z& e%d Z'e%d Z(e%d Z)ej* +d	¡Z,ej* +d
¡Z-ej*dd… dkZ.zd dl/Z/d dl0Z0dZ1W n eyÂ   dZ1Y nw zd dl2Z2W n eyÔ   dZ2Y nw dd„ Z3dd„ Z4dBdd„Z5dd„ Z6dBdd„Z7dd„ Z8dd„ Z9e9ƒ Z:dd„ Z;G dd „ d ƒZ<G d!d"„ d"e<e j=ƒZ>G d#d$„ d$e<e j=ƒZ?G d%d&„ d&e<e j=ƒZ@G d'd(„ d(e<e j=ƒZAG d)d*„ d*e<e j=ƒZBG d+d,„ d,e<e j=ƒZCG d-d.„ d.eCƒZDG d/d0„ d0e<e j=ƒZEG d1d2„ d2e j=ƒZFG d3d4„ d4e j=ƒZGG d5d6„ d6eHƒZIe  Je: d7¡G d8d9„ d9eIe j=ƒƒZKe  Je, d:¡G d;d<„ d<eIe j=ƒƒZLG d=d>„ d>e j=ƒZMG d?d@„ d@e j=ƒZNeOdAkr¨e  P¡  dS dS )Cé    N)Úmake_archiveÚregister_archive_formatÚunregister_archive_formatÚget_archive_formatsÚErrorÚunpack_archiveÚregister_unpack_formatÚRegistryErrorÚunregister_unpack_formatÚget_unpack_formatsÚSameFileErrorÚ_GiveupOnFastCopy)Úsupport)Ú	os_helper)ÚTESTFNÚFakePathÚ2Z_SRCZ_DSTÚdarwinZsunosé   ZaixTFc                  O   s   t ttddƒdƒ‚)NZEXDEVé   zInvalid cross-device link)ÚOSErrorÚgetattrÚerrno©ÚargsÚkwargs© r   úF/Users/admin/.pyenv/versions/3.10.0/lib/python3.10/test/test_shutil.pyÚ_fake_rename6   s   r   c                    s   t  ˆ ¡‡ fdd„ƒ}|S )Nc                     s,   zt j}tt _ˆ | i |¤ŽW |t _S |t _w ©N)ÚosÚrenamer   )r   r   Zbuiltin_rename©Úfuncr   r   Úwrap;   s
   zmock_rename.<locals>.wrap)Ú	functoolsÚwraps)r#   r$   r   r"   r   Úmock_rename:   s   r'   c                 C   sn   	 t | tƒrtjj| Ž } |rdnd}|rd nd}t| ||d}| |¡ W d   ƒ d S 1 s0w   Y  d S )NÚwbÚwúutf-8©Úencoding)Ú
isinstanceÚtupler    ÚpathÚjoinÚopenÚwrite)r/   ZcontentÚbinaryÚmoder,   Úfpr   r   r   Ú
write_fileE   s   
"ÿr6   c                 C   sv   	 dd„ }t |dƒ}d dd„ t|ƒD ƒ¡}t| dƒ}|||ƒD ]}| |¡ q!W d   ƒ d S 1 s4w   Y  d S )Nc                 s   s2    | |kr|V  | |8 } | |ks| r| V  d S d S r   r   )ÚtotalÚstepr   r   r   ÚchunksU   s   €þ
ÿzwrite_test_file.<locals>.chunksi    ó    c                 S   s   g | ]
}t  tj¡ ¡ ‘qS r   )ÚrandomÚchoiceÚstringÚascii_lettersÚencode)Ú.0Úir   r   r   Ú
<listcomp>^   s    ÿz#write_test_file.<locals>.<listcomp>r(   )Úminr0   Úranger1   r2   )r/   Úsizer9   ÚbufsizeÚchunkÚfZcsizer   r   r   Úwrite_test_fileS   s   

ÿÿ"ÿrI   c                 C   sj   	 t | tƒrtjj| Ž } |rdnd}|rd nd}t| ||d}| ¡ W  d   ƒ S 1 s.w   Y  d S )NÚrbÚrr*   r+   )r-   r.   r    r/   r0   r1   Úread)r/   r3   r4   r,   r5   r   r   r   Ú	read_filee   s   
$ÿrM   c                 C   sz   g }t t | ¡ƒD ]1}tj | |¡}tj |¡r5tj |¡s5| |d ¡ t|ƒD ]}| |d | ¡ q)| |¡ q	|S )Nú/)	Úsortedr    Úlistdirr/   r0   ÚisdirÚislinkÚappendÚrlistdir)r/   ÚresÚnameÚpÚnr   r   r   rT   s   s   
€rT   c               
   C   sÌ  t tdƒsdS d } d }zÆtjdt ¡ dd}|j} | d¡ W d   ƒ n1 s)w   Y  t| dƒ€}tjdt ¡ ddf}|j}| ¡ }| ¡ }z
t 	||dd¡ W n+ t
y   Y W d   ƒ W d   ƒ W | d urrt | ¡ |d ur}t |¡ dS dS w 	 W d   ƒ W d   ƒ W | d ur—t | ¡ |d ur¢t |¡ d	S d	S 1 s§w   Y  W d   ƒ n1 s¶w   Y  W | d urÅt | ¡ |d urÐt |¡ d S d S | d urÛt | ¡ |d uråt |¡ w w )
NÚsendfileFr(   ©ÚdirÚdeletes
   0123456789rJ   r   é   T)Úhasattrr    ÚtempfileÚNamedTemporaryFileÚgetcwdrV   r2   r1   ÚfilenorY   r   r   Úunlink)ÚsrcnameÚdstnamerH   ÚsrcÚdstÚinfdÚoutfdr   r   r   Úsupports_file2file_sendfile   s^   
þùÿ
ÿù÷ÿ
ÿóÿ€
ÿþ
ÿrj   c                  C   sF   t r!tjdkr!t dtj ¡} |  d¡d  ¡ d }t|dƒdkS dS )	Niÿÿÿz/usr/bin/dump -o %sÚ
éÿÿÿÿé   é   i    T)ÚAIXÚsysÚmaxsizeÚ
subprocessÚ	getoutputÚ
executableÚsplitÚint)ZhdrsZmaxdatar   r   r   Ú
_maxdataOK¢   s
   rw   c                   @   s   e Zd Zddd„ZdS )ÚBaseTestNc                 C   s&   	 t j|t ¡ d}|  tj|¡ |S )N)Úprefixr[   )r_   Úmkdtempr    ra   Ú
addCleanupr   Úrmtree)Úselfry   Údr   r   r   rz   ­   s   zBaseTest.mkdtempr   )Ú__name__Ú
__module__Ú__qualname__rz   r   r   r   r   rx   «   s    rx   c                   @   sâ   e Zd Zdd„ Zejdd„ ƒZejdd„ ƒZe 	e
d¡dd	„ ƒZe 	e
d¡d
d„ ƒZdd„ Ze ejdd… dkd¡e eedƒoFe ¡ dkd¡dd„ ƒƒZdd„ Zdd„ Zdd„ Zdd„ Zejdd „ ƒZe 	e
d¡d!d"„ ƒZdS )#Ú
TestRmTreec                 C   sX   |   ¡ }tj |d¡}t |¡ ttj |d¡dƒ t |¡}|  |t¡ t	 
|¡ d S )NZkillmeZsomefileÚfoo)rz   r    r/   r0   Úmkdirr6   ÚfsencodeÚassertIsInstanceÚbytesÚshutilr|   )r}   ÚtmpZvictimr   r   r   Útest_rmtree_works_on_bytes¹   s   

z%TestRmTree.test_rmtree_works_on_bytesc                    sä   |   ¡ }tj |d¡}t |¡ tj |d¡}t ||¡ |  ttj	|¡ |  
tj |¡¡ |  
tj |¡¡ g ‰ ‡ fdd„}tj	||d |  tˆ ƒd¡ |  ˆ d d tjj¡ |  ˆ d d |¡ |  ˆ d d d t¡ d S )	Nr[   Úlinkc                     ó   ˆ   | ¡ d S r   ©rS   ©r   ©Úerrorsr   r   ÚonerrorÍ   ó   z8TestRmTree.test_rmtree_fails_on_symlink.<locals>.onerror©r‘   rm   r   r]   )rz   r    r/   r0   r„   ÚsymlinkÚassertRaisesr   rˆ   r|   Ú
assertTrueÚexistsÚlexistsÚassertEqualÚlenÚassertIsrR   r†   ©r}   r‰   Zdir_r‹   r‘   r   r   r   Útest_rmtree_fails_on_symlinkÂ   s   
z'TestRmTree.test_rmtree_fails_on_symlinkc           
      C   sö   |   ¡ }tj |d¡}tj |d¡}tj |d¡}|||fD ]}t |¡ qtj |d¡}t|dƒ tj |d¡}t ||¡ tj |d¡}t ||¡ tj |d¡}	t ||	¡ t |¡ |  	tj 
|¡¡ |  tj 
|¡¡ |  tj 
|¡¡ d S ©	NÚdir1Údir2Údir3Úfile1rƒ   Úlink1Úlink2Úlink3)rz   r    r/   r0   r„   r6   r”   rˆ   r|   ÚassertFalser—   r–   ©
r}   r‰   rŸ   r    r¡   r~   r¢   r£   r¤   r¥   r   r   r   Útest_rmtree_works_on_symlinksÕ   ó$   

z(TestRmTree.test_rmtree_works_on_symlinkszonly relevant on Windowsc                    sò   |   ¡ }tj |d¡}t |¡ tj |d¡}t ||¡ |  tj	|¡ |  
ttj|¡ |  tj |¡¡ |  tj |¡¡ g ‰ ‡ fdd„}tj||d |  tˆ ƒd¡ |  ˆ d d tjj¡ |  ˆ d d |¡ |  ˆ d d d t¡ d S )	Nr[   r‹   c                     rŒ   r   r   rŽ   r   r   r   r‘   ÷   r’   z:TestRmTree.test_rmtree_fails_on_junctions.<locals>.onerrorr“   rm   r   r]   )rz   r    r/   r0   r„   Ú_winapiÚCreateJunctionr{   r   rc   r•   r   rˆ   r|   r–   r—   r˜   r™   rš   r›   rR   r†   rœ   r   r   r   Útest_rmtree_fails_on_junctionsë   s    
z)TestRmTree.test_rmtree_fails_on_junctionsc           
      C   sö   |   ¡ }tj |d¡}tj |d¡}tj |d¡}|||fD ]}t |¡ qtj |d¡}t|dƒ tj |d¡}t ||¡ tj |d¡}t ||¡ tj |d¡}	t ||	¡ t 	|¡ |  
tj |¡¡ |  tj |¡¡ |  tj |¡¡ d S rž   )rz   r    r/   r0   r„   r6   rª   r«   rˆ   r|   r¦   r—   r–   r§   r   r   r   Útest_rmtree_works_on_junctionsÿ   r©   z)TestRmTree.test_rmtree_works_on_junctionsc                    s²  t j|  ¡ d}|  ttj|¡ tj|dd |  ¡ }t|dfdƒ tj	 
|d¡}|  t¡}t |¡ W d   ƒ n1 s>w   Y  |  |jj|¡ |  tj	 |¡¡ tj|dd |  tj	 |¡¡ g ‰ ‡ fdd„}tj||d |  tˆ ƒd	¡ |  ˆ d
 d
 tj¡ |  ˆ d
 d |¡ |  ˆ d
 d	 d t¡ |  ˆ d
 d	 d j|¡ |  ˆ d d
 tj¡ |  ˆ d d |¡ |  ˆ d d	 d t¡ |  ˆ d d	 d j|¡ d S )N©r[   T©Úignore_errorsZtstfileÚ c                     rŒ   r   r   rŽ   r   r   r   r‘   (  r’   z.TestRmTree.test_rmtree_errors.<locals>.onerrorr“   r]   r   rm   )r_   Úmktemprz   r•   ÚFileNotFoundErrorrˆ   r|   r6   r    r/   r0   ÚNotADirectoryErrorr™   Ú	exceptionÚfilenamer–   r—   rš   r›   Úscandirr†   Úrmdir)r}   r¶   ÚtmpdirÚcmr‘   r   r   r   Útest_rmtree_errors  s2   ÿzTestRmTree.test_rmtree_errorsNé   Úcygwinz2This test can't be run on Cygwin (issue #1071513).Úgeteuidr   z9This test can't be run reliably as root (issue #1076467).c                 C   s
  d| _ t t¡ |  tjt¡ tj td¡| _	tj td¡| _
t | j	¡ t | j
¡ t t¡j}t | j	¡j}t | j
¡j}tjtjB }t | j	|¡ t | j
|¡ t t|¡ |  tjt|¡ |  tj| j	|¡ |  tj| j
|¡ tjt| jd |  | j dd¡ d S )Nr   ÚaÚbr“   r   z1Expected call to onerror function did not happen.)Ú
errorStater    r„   r   r{   rˆ   r|   r/   r0   Úchild_file_pathÚchild_dir_pathr   Úcreate_empty_fileÚstatÚst_modeÚS_IREADÚS_IEXECÚchmodÚcheck_args_to_onerrorr™   )r}   Zold_dir_modeZold_child_file_modeZold_child_dir_modeZnew_moder   r   r   Útest_on_error6  s*   

ÿzTestRmTree.test_on_errorc                 C   s¼   | j dk rB|tju r|  || j¡ n|tju r|  || j¡ n|  |tj¡ |  	|t
| jg¡ |  t|d tƒ¡ |  j d7  _ d S |  |tj¡ |  |t
¡ |  t|d tƒ¡ d| _ d S )Nr]   r   rm   r   )rÁ   r    rc   r™   rÂ   r¸   rÃ   r›   rP   ÚassertInr   r–   Ú
issubclassr   )r}   r#   ÚargÚexcr   r   r   rÊ   U  s   



z TestRmTree.check_args_to_onerrorc                    sP   z#t j‰ ‡ fdd„}|t _t  t¡ ttdfdƒ t t¡ W ˆ t _d S ˆ t _w )Nc                    s   | t krtƒ ‚ˆ | ƒS r   )r   r   )Úfnr   r   ©Z
orig_lstatr   r   Úraisers  s   zFTestRmTree.test_rmtree_does_not_choke_on_failing_lstat.<locals>.raiserrƒ   )r    Úlstatr„   r   r6   rˆ   r|   )r}   rÒ   r   rÑ   r   Ú+test_rmtree_does_not_choke_on_failing_lstatp  s   
z6TestRmTree.test_rmtree_does_not_choke_on_failing_lstatc                    sÜ   t jt jt jt jht jkot jt jv ot jt jv }|r_|  	t
j¡ |  	t
jj¡ |  ¡ }t j |d¡}t  |¡ z"t
j}G dd„ dtƒ‰ ‡ fdd„}|t
_|  ˆ t
j|¡ W |t
_d S |t
_w |  t
j¡ |  t
jj¡ d S )Nr¿   c                   @   s   e Zd ZdS )zHTestRmTree.test_rmtree_uses_safe_fd_version_if_available.<locals>.CalledN)r   r€   r   r   r   r   r   ÚCalled  s    rÕ   c                     s   ˆ ‚r   r   r   ©rÕ   r   r   Ú_raiserŽ  ó   zITestRmTree.test_rmtree_uses_safe_fd_version_if_available.<locals>._raiser)r    r1   rÅ   rc   r¸   Úsupports_dir_fdrP   Úsupports_fdÚsupports_follow_symlinksr–   rˆ   Ú_use_fd_functionsr|   Úavoids_symlink_attacksrz   r/   r0   r„   Ú_rmtree_safe_fdÚ	Exceptionr•   r¦   )r}   rÜ   Útmp_dirr~   Zreal_rmtreer×   r   rÖ   r   Ú-test_rmtree_uses_safe_fd_version_if_available€  s,   ÿ
þ
ý
z8TestRmTree.test_rmtree_uses_safe_fd_version_if_availablec                 C   s<   t j|  ¡ d\}}t |¡ |  ttj|¡ t 	|¡ d S ©Nr®   )
r_   Úmkstemprz   r    Úcloser•   r´   rˆ   r|   Úremove)r}   Úhandler/   r   r   r   Útest_rmtree_dont_delete_file˜  s   
z'TestRmTree.test_rmtree_dont_delete_filec              
   C   s€   t  t¡ z2t j td¡}t j td¡}t  |¡ t  ||¡ |  ttj	|¡ tj	|dd W tj	tdd d S tj	tdd w )NÚcheeseÚshopTr¯   )
r    r„   r   r/   r0   r”   r•   r   rˆ   r|   ©r}   rf   rg   r   r   r   Útest_rmtree_on_symlinkŸ  s   

"z!TestRmTree.test_rmtree_on_symlinkc              
   C   s˜   t  t¡ z>t j td¡}t j td¡}t  |¡ tt j |d¡dƒ ¡  t ||¡ |  	t
tj|¡ tj|dd W tjtdd d S tjtdd w )Nrè   ré   Zspamr(   Tr¯   )r    r„   r   r/   r0   r1   rä   rª   r«   r•   r   rˆ   r|   rê   r   r   r   Útest_rmtree_on_junction­  s   

"z"TestRmTree.test_rmtree_on_junction)r   r€   r   rŠ   r   Úskip_unless_symlinkr   r¨   ÚunittestÚ
skipUnlessrª   r¬   r­   r»   ÚskipIfrp   Úplatformr^   r    r¾   rË   rÊ   rÔ   rá   rç   rë   rì   r   r   r   r   r‚   ·   s4    	





!ÿÿ

r‚   c                   @   sÄ   e Zd Zdd„ Zdd„ Zejdd„ ƒZdd„ Zd	d
„ Z	dd„ Z
ej d¡dd„ ƒZdd„ Ze eedƒd¡eje ejdkd¡dd„ ƒƒƒZdd„ Zejdd„ ƒZejdd„ ƒZdd„ Zd d!„ Zd"S )#ÚTestCopyTreec              	   C   s  |   ¡ }tj |   ¡ d¡}|  tj|¡ |  tjtj |¡¡ t|dfdƒ t 	tj |d¡¡ t|ddfdƒ t 
||¡ |  tj tj |d¡¡¡ |  tj tj |d¡¡¡ |  tj tj |dd¡¡¡ t|dfƒ}|  |d¡ t|ddfƒ}|  |d¡ d S )NÚdestinationútest.txtÚ123Útest_dirÚ456)rz   r    r/   r0   r{   rˆ   r|   Údirnamer6   r„   Úcopytreer–   ÚisfilerQ   rM   r™   ©r}   Úsrc_dirÚdst_dirÚactualr   r   r   Útest_copytree_simple¾  s"   ÿz!TestCopyTree.test_copytree_simplec              	   C   sZ  |   ¡ }|   ¡ }|  tj|¡ |  tj|¡ t|dfdƒ t tj |d¡¡ t tj |d¡¡ t|ddfdƒ t|ddfdƒ tj	||dd |  
tj tj |d¡¡¡ |  
tj tj |d¡¡¡ |  
tj tj |dd¡¡¡ t|dfƒ}|  |d¡ t|ddfƒ}|  |d¡ |  t¡ tj	||d	d W d   ƒ d S 1 s¦w   Y  d S )
Nznonexisting.txtrõ   Zexisting_dirzexisting.txtzwill be replacedzhas been replacedT)Údirs_exist_okF)rz   r{   rˆ   r|   r6   r    r„   r/   r0   rù   r–   rú   rQ   rM   r™   r•   ÚFileExistsErrorrû   r   r   r   Útest_copytree_dirs_exist_okÑ  s,   ÿ"ÿz(TestCopyTree.test_copytree_dirs_exist_okc           
   	   C   s  |   ¡ }tj |d¡}tj |d¡}tj |d¡}t |¡ t |¡ t|dfdƒ tj |d¡}tj |d¡}t tj |d¡|¡ ttdƒrRt |t	j
t	jB ¡ ttd	ƒrctt	d
ƒrct |t	j¡ t |¡}tj||dd |  tj tj |dd¡¡¡ t tj |dd¡¡}tjdkrš| d¡rš|dd … }|  |tj |d¡¡ t |¡}	ttdƒr·|  |	j|j¡ ttd	ƒrÆ|  |	j|j¡ d S d S )Nrf   rg   Úsubzfile.txtrƒ   r‹   zsub/linkÚlchmodÚlchflagsÚ	UF_NODUMPT©ÚsymlinksÚntz\\?\é   )rz   r    r/   r0   r„   r6   r”   r^   r  rÅ   ÚS_IRWXUÚS_IRWXOr  r  rÓ   rˆ   rù   r–   rR   ÚreadlinkrV   Ú
startswithr™   rÆ   Úst_flags)
r}   rà   rü   rý   Zsub_dirÚsrc_linkÚdst_linkÚsrc_statrþ   Údst_statr   r   r   Útest_copytree_symlinksê  s:   

ÿ




ÿz#TestCopyTree.test_copytree_symlinksc                 C   s\  t jj}t jj}|  ¡ }z||  ¡ dƒ}t|dfdƒ t|dfdƒ t  ||dƒ¡ t|ddfdƒ t  ||dƒ¡ t|ddfdƒ t  ||ddƒ¡ t  ||dd	ƒ¡ t|dddfdƒ t|dd	d
fdƒ z3t dd¡}tj	|||d |  
|||dƒƒ¡ |  |||dƒƒ¡ |  |||dƒƒ¡ W t |¡ nt |¡ w z5t dd¡}tj	|||d |  |||dƒƒ¡ |  |||dd	ƒƒ¡ |  |||ddƒƒ¡ W t |¡ nt |¡ w z*dd„ }tj	|||d |  |||dd	d
ƒƒ¡ |  |||ddƒƒ¡ W t |¡ nt |¡ w W t |¡ t t j |¡¡ d S t |¡ t t j |¡¡ w )Nró   rô   rõ   ztest.tmprö   r÷   Z	test_dir2ÚsubdirZsubdir2ztest.pyz*.tmp©Úignorezsubdir*c                 S   sf   g }|D ],}t j | |¡}t j |¡r!| ¡ d dkr!| |¡ qt j |¡d dv r0| |¡ q|S )Nrl   r  z.py)r    r/   r0   rQ   ru   rS   Úsplitext)rf   ÚnamesrU   rV   r/   r   r   r   Ú_filter2  s   ÿ
€z8TestCopyTree.test_copytree_with_exclude.<locals>._filter)r    r/   r0   r—   rz   r6   r„   rˆ   Úignore_patternsrù   r–   r¦   r|   rø   )r}   r0   r—   rü   rý   Úpatternsr  r   r   r   Útest_copytree_with_exclude
  sR   ÿ

ÿz'TestCopyTree.test_copytree_with_excludec                    sV  t jj}t jj}ˆ ¡ }||dƒ}t  ||ƒ¡ t  ||dƒ¡ t  t j |dd¡¡ t|dddfdƒ g ‰ ‡ ‡fdd„}|ˆ ¡ dƒ}tj|||d	 ˆ 	|||dddƒƒ¡ |ˆ ¡ dƒ}tjt
 |¡||d	 ˆ 	|||dddƒƒ¡ |ˆ ¡ dƒ}tt  |¡ƒd
 }ˆ |t j¡ tj|||d	 ˆ 	|||dddƒƒ¡ ˆ tˆ ƒd¡ d S )NÚsourcerö   r  rô   r÷   c                    sT   ˆ   | ¡ ˆ | t¡ ˆ |t¡ ˆ t|ƒtt|ƒƒ¡ |D ]}ˆ |t¡ qg S r   )rS   r†   ÚstrÚlistr™   rš   Úset)rf   r  rV   ©Zinvokationsr}   r   r   Ú_ignoreY  s   
z?TestCopyTree.test_copytree_arg_types_of_ignore.<locals>._ignoreró   r  r   é	   )r    r/   r0   r—   rz   r„   r6   rˆ   rù   r–   ÚpathlibÚPathr   r·   r†   ÚDirEntryr™   rš   )r}   r0   r—   rà   rü   r#  rý   Zsrc_dir_entryr   r"  r   Ú!test_copytree_arg_types_of_ignoreK  s8   
	ÿÿÿz.TestCopyTree.test_copytree_arg_types_of_ignorec              	   C   sx  |   ¡ }tj |d¡}t |¡ tj |d¡}|  tj|¡ t |d¡ t	|dfdƒ t tj |d¡d¡ t	|dfdƒ t tj |d¡d¡ t
j |d	}|  tj|¡ t |d¡ t ||¡ |  t |¡jt |¡j¡ |  t tj |d¡¡jt tj |d¡¡j¡ |  t tj |d¡¡jt tj |d¡¡j¡ tj |tj |¡d
 ¡}|  t |¡jt |¡j¡ d S )Nr  ró   iÿ  zpermissive.txtrõ   zrestrictive.txtr÷   i€  r®   rm   )rz   r    r/   r0   r„   r{   rˆ   r|   rÉ   r6   r_   r   rù   r™   rÅ   rÆ   ru   )r}   rà   rü   rý   Zrestrictive_subdirZrestrictive_subdir_dstr   r   r   Ú!test_copytree_retains_permissionsu  s6   
ÿÿÿ
ÿz.TestCopyTree.test_copytree_retains_permissionszos.chmodc                 C   s†   |   ¡ }tj |   ¡ d¡}|  tj|¡ |  tjtj |¡¡ tdƒ|_	|  
tj¡ t ||¡ W d   ƒ d S 1 s<w   Y  d S )Nró   zka-boom)rz   r    r/   r0   r{   rˆ   r|   rø   ÚPermissionErrorÚside_effectr•   r   rù   )r}   Z
mock_patchrü   rý   r   r   r   Útest_copytree_winerror  s   
"ÿz#TestCopyTree.test_copytree_winerrorc                    s’   ‡ ‡‡‡fdd„}g ‰ˆ  ¡ ‰tjˆ  ¡ d‰ ttj ˆd¡ddd}| ¡  W d   ƒ n1 s2w   Y  tj	ˆˆ |d ˆ 
tˆƒd	¡ d S )
Nc                    sR   ˆ  d ¡ ˆ | t¡ ˆ |t¡ ˆ | tj ˆd¡¡ ˆ |tj ˆ d¡¡ d S ©Nrƒ   )rS   r†   r  r™   r    r/   r0   )r¿   rÀ   ©rg   Úflagr}   rf   r   r   Úcustom_cpfun   s
   
zETestCopyTree.test_copytree_custom_copy_function.<locals>.custom_cpfunr®   rƒ   r)   r*   r+   ©Úcopy_functionrm   )rz   r_   r²   r1   r    r/   r0   rä   rˆ   rù   r™   rš   )r}   r0  rH   r   r.  r   Ú"test_copytree_custom_copy_functionž  s   
ÿz/TestCopyTree.test_copytree_custom_copy_functionÚmkfifoúrequires os.mkfifo()Úvxworksú%fifo requires special path on VxWorksc              
   C   sP  t  t¡ z“t j td¡}t  |¡ t j |d¡}zt  |¡ W n ty9 } z|  d| ¡ W Y d }~nd }~ww zt 	tt
¡ W n/ tjyq } z"|jd }|  t|ƒd¡ |d \}}}|  d| |¡ W Y d }~nd }~ww |  d¡ W tjtdd	 tjt
dd	 d S W tjtdd	 tjt
dd	 d S tjtdd	 tjt
dd	 w )
Nr  Zmypipeúos.mkfifo(): %sr   rm   z`%s` is a named pipez$shutil.Error should have been raisedTr¯   )r    r„   r   r/   r0   r4  r*  ÚskipTestrˆ   rù   ÚTESTFN2r   r   r™   rš   Úfailr|   )r}   r  ÚpipeÚer   rf   rg   Z	error_msgr   r   r   Útest_copytree_named_pipe°  s8   

€ÿ
€üûÿz%TestCopyTree.test_copytree_named_pipec                    s€   |   ¡ }tj |   ¡ d¡}t|dfdƒ t tj |d¡¡ t|ddfdƒ g ‰ ‡ fdd„}tj|||d |  t	ˆ ƒd	¡ d S )
Nró   rô   rõ   rö   r÷   c                    ó   ˆ   | |f¡ d S r   r   ©rf   rg   ©Zcopiedr   r   Ú_copyÓ  ó   z6TestCopyTree.test_copytree_special_func.<locals>._copyr1  r]   )
rz   r    r/   r0   r6   r„   rˆ   rù   r™   rš   )r}   rü   rý   rB  r   rA  r   Útest_copytree_special_funcË  s   z'TestCopyTree.test_copytree_special_funcc                 C   sÒ   |   ¡ }tj |   ¡ d¡}t dtj |d¡¡ t tj |d¡¡ t|ddfdƒ |  tt	j
||¡ tj |   ¡ d¡}t	j
||dd |  dt |¡¡ tj |   ¡ d	¡}t	j
||dd
 |  dt |¡¡ d S )Nró   Z
IDONTEXISTrô   rö   r÷   Údestination2T)Úignore_dangling_symlinksZdestination3r  )rz   r    r/   r0   r”   r„   r6   r•   r   rˆ   rù   ÚassertNotInrP   rÌ   ©r}   rü   rý   r   r   r   Útest_copytree_dangling_symlinksÙ  s   z,TestCopyTree.test_copytree_dangling_symlinksc              	   C   s.  |   ¡ }tj |   ¡ d¡}t tj |d¡¡ ttj |dd¡dƒ W d   ƒ n1 s-w   Y  tjtj |d¡tj |d¡dd tj||dd	 |  	tj 
tj |d¡¡¡ |  dt tj |d¡¡¡ tj |   ¡ d
¡}tj||dd	 |  tj 
tj |d¡¡¡ |  dt tj |d¡¡¡ d S )Nró   Zreal_dirrô   r(   Zlink_to_dirT)Útarget_is_directoryFr  rE  )rz   r    r/   r0   r„   r1   r”   rˆ   rù   r¦   rR   rÌ   rP   r–   rH  r   r   r   Útest_copytree_symlink_dirí  s"   ÿþ z&TestCopyTree.test_copytree_symlink_dirc                 C   s\   |   ¡ }|d }|  tj|d¡ tj |d¡}t|dƒ t ||¡}|  	dgt 
|¡¡ d S )NÚdestTrƒ   )rz   r{   rˆ   r|   r    r/   r0   r6   rù   r™   rP   )r}   rü   rý   rf   Úrvr   r   r   Útest_copytree_return_value  s   
z'TestCopyTree.test_copytree_return_valuec                 C   s€   |   ¡ }| jtj|dd tj |dd¡}tj |dd¡}t |¡ tj |d¡}t|dƒ t 	||¡}|  
dgt |¡¡ d S )NTr¯   ÚtZpgZ
somevendorz1.0Zpol)rz   r{   rˆ   r|   r    r/   r0   Úmakedirsr6   rù   r™   rP   )r}   Úbase_dirrü   rý   rf   rM  r   r   r   Útest_copytree_subdirectory  s   

z'TestCopyTree.test_copytree_subdirectoryN)r   r€   r   rÿ   r  r   rí   r  r  r(  r)  rî   ÚmockÚpatchr,  r3  rï   r^   r    rð   rp   rñ   r>  rD  rI  rK  rN  rR  r   r   r   r   rò   ¼  s0    
A*

ÿ


rò   c                   @   sà  e Zd Zejdd„ ƒZe ee	dƒd¡ejdd„ ƒƒZ
e ee	dƒd¡ejdd	„ ƒƒZejd
d„ ƒZe ee	dƒoBeedƒoBeedƒd¡dd„ ƒZejdd„ ƒZejeje ee	dƒo`e	 ¡ dkd¡dd„ ƒƒƒZdd„ Zdd„ Zejdd„ ƒZe ee	dƒd ¡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ejd/d0„ ƒZe ee	d1ƒd2¡d3d4„ ƒZejd5d6„ ƒZ e ee	d7ƒd8¡e e!j"d9kd:¡d;d<„ ƒƒZ#d=d>„ Z$d?d@„ Z%e e&pãe'pãe(dA¡dBdC„ ƒZ)dDdE„ Z*dFS )GÚTestCopyc                 C   s†  |   ¡ }tj |d¡}tj |d¡}tj |d¡}tj |d¡}t|dƒ t|dƒ t ||¡ t ||¡ t |tjtj	B ¡ t |tj
¡ |  t |¡jt |¡j¡ t ||¡ |  t |¡jt |¡j¡ tjdkrÁt |tj
¡ t ||¡ |  t |¡jt |¡j¡ t |tj
¡ t ||¡ |  t |¡jt |¡j¡ t |tj
¡ t ||¡ |  t |¡jt |¡j¡ d S d S )Nrƒ   ÚbarÚbazÚquuxr	  )rz   r    r/   r0   r6   r”   rÉ   rÅ   r  ÚS_IRWXGr  ÚassertNotEqualrÆ   rˆ   Úcopymoder™   rV   ©r}   rà   rf   rg   r  r  r   r   r   Útest_copymode_follow_symlinks  s2   


 ôz&TestCopy.test_copymode_follow_symlinksr  zrequires os.lchmodc                 C   sp  |   ¡ }tj |d¡}tj |d¡}tj |d¡}tj |d¡}t|dƒ t|dƒ t ||¡ t ||¡ t |tjtj	B ¡ t |tj¡ t 
|tjtj	B ¡ t 
|tj¡ tj||dd |  t |¡jt |¡j¡ |  t |¡jt |¡j¡ t 
|tj¡ tj||dd |  t |¡jt |¡j¡ t 
|tj¡ tj||dd |  t |¡jt |¡j¡ d S ©Nrƒ   rV  rW  rX  F©Úfollow_symlinks)rz   r    r/   r0   r6   r”   rÉ   rÅ   r  rY  r  r  rˆ   r[  r™   rÓ   rÆ   rZ  r\  r   r   r   Ú test_copymode_symlink_to_symlink;  s0   


ÿ z)TestCopy.test_copymode_symlink_to_symlinkz requires os.lchmod to be missingc                 C   s€   |   ¡ }tj |d¡}tj |d¡}tj |d¡}tj |d¡}t|dƒ t|dƒ t ||¡ t ||¡ tj||dd d S r^  )rz   r    r/   r0   r6   r”   rˆ   r[  r\  r   r   r   Ú*test_copymode_symlink_to_symlink_wo_lchmodY  s   

z3TestCopy.test_copymode_symlink_to_symlink_wo_lchmodc           
      C   sâ  |   ¡ }tj |d¡}tj |d¡}tj |d¡}tj |d¡}t|dƒ t |¡}t ||j|jd f¡ t|dƒ |  	t |¡jt |¡j¡ t 
||¡ t 
||¡ ttdƒrat |tj¡ ttdƒrrttdƒrrt |tj¡ t |¡}ttdƒrtj||d	d
 |  	|jt |¡j¡ tj||dd
 t |¡}tjtjv rµdD ]}	|  t||	ƒt||	ƒd ¡ q¤ttdƒrÂ|  |j|j¡ ttdƒrÔt|dƒrÔ|  |j|j¡ tj||dd
 |  tt |¡jt |¡j ƒdk ¡ d S )Nrƒ   rV  rW  Úquxg      E@r  r  r  Tr_  F©Úst_atimeÚst_mtimerm   r  gš™™™™™¹?)rz   r    r/   r0   r6   rÅ   Úutimere  rf  rZ  r”   r^   r  r  r  r  rÓ   rˆ   ÚcopystatrÆ   rÛ   ÚassertLessEqualr   r™   r  r–   Úabs)
r}   rà   rf   rg   r  r  r  Úsrc_link_statZdst_link_statÚattrr   r   r   Útest_copystat_symlinksi  sJ   


ÿ




ÿ

ÿzTestCopy.test_copystat_symlinksÚchflagsÚ
EOPNOTSUPPÚENOTSUPz)requires os.chflags, EOPNOTSUPP & ENOTSUPc                 C   s¨   |   ¡ }tj |d¡}tj |d¡}t|dƒ t|dƒ dd„ }tj}z,tjtjfD ]}||ƒt_t	 
||¡ q*|tjtj ƒt_|  tt	j
||¡ W |t_d S |t_w )Nr¢   Úfile2Úxxxc                    s   t ƒ ‰ddœ‡ ‡fdd„
}|S )NTr_  c                   s
   ˆ ˆ_ ˆ‚r   )r   )r/   Úflagsr`  ©ÚerrÚexr   r   Ú_chflags_raiser   s   zlTestCopy.test_copystat_handles_harmless_chflags_errors.<locals>.make_chflags_raiser.<locals>._chflags_raiser©r   )ru  rw  r   rt  r   Úmake_chflags_raiser  s   zSTestCopy.test_copystat_handles_harmless_chflags_errors.<locals>.make_chflags_raiser)rz   r    r/   r0   r6   rn  r   ro  rp  rˆ   rh  r•   r   )r}   r¹   r¢   rq  ry  Zold_chflagsru  r   r   r   Ú-test_copystat_handles_harmless_chflags_errors’  s   


z6TestCopy.test_copystat_handles_harmless_chflags_errorsc                    s   |   ¡ }tj |d¡‰tˆdƒ tj |d¡}t|dƒ t ˆ|¡ t ˆdd¡ t ˆdd¡ t ˆ|¡ |  t	t 
ˆ¡ƒt	t 
|¡ƒ¡ |  t ˆd¡t |d¡¡ t |¡ t|dƒ ttjdƒ‰‡‡fdd	„}ztj‰|t_t ˆ|¡ |  dt 
|¡¡ W ˆt_nˆt_w d
dœ‡ ‡fdd„
}ztj
‰ |t_
t ˆ|¡ W ˆ t_
nˆ t_
w tj |d¡‰tj |d¡}tˆˆƒ t||ƒ t ˆdd¡ t |dd¡ t |d¡ tj |d¡}tj |d¡}t||ƒ t||ƒ t ˆ|¡ t ||¡ |  t |d¡d¡ |  t |d¡d¡ d S )Nrƒ   rV  úuser.fooó   42zuser.baró   43ÚEPERMc                    s$   |dkrˆ‚ˆ | ||fi |¤Ž d S )Nr{  r   )Úfnamerl  Úvalr   )Úorig_setxattrÚos_errorr   r   Ú_raise_on_user_fooÈ  s   z3TestCopy.test_copyxattr.<locals>._raise_on_user_fooTr_  c                   s    | ˆkr
t tjdƒ‚ˆ | |dS )NzOperation not supportedr_  )r   r   rp  )r  r`  )Úorig_listxattrrf   r   r   Ú_raise_on_srcÕ  s   z.TestCopy.test_copyxattr.<locals>._raise_on_srcZthe_originalZthe_original_rozuser.the_values   fiddlyi$  Zthe_copyZthe_copy_ro)rz   r    r/   r0   r6   rˆ   Ú
_copyxattrÚsetxattrr™   rO   Ú	listxattrÚgetxattrrå   r   r   r~  rÌ   rÉ   rh  )r}   rà   rg   rƒ  r…  ZsrcroZdstror   )r„  r  r‚  rf   r   Útest_copyxattr±  sZ   

 

þ





zTestCopy.test_copyxattrr¾   r   úroot privileges requiredc                 C   sî   |   ¡ }tj |d¡}tj |d¡}t|dƒ t ||¡ t |dd¡ tj|dddd tj |d¡}tj |d	¡}t|dƒ t ||¡ tj||dd |  	tj
|dddd¡ |  ttj
|d¡ tj||dd |  	t 
|d¡d¡ d S )
Nrƒ   rW  ztrusted.foor|  r}  Fr_  rV  rc  )rz   r    r/   r0   r6   r”   r‡  rˆ   r†  r™   r‰  r•   r   )r}   rà   rf   r  rg   r  r   r   r   Útest_copyxattr_symlinksñ  s    

z TestCopy.test_copyxattr_symlinksc                 C   sP   d}|   ¡ }t||fdƒ tj ||¡}|   ¡ }|||ƒ tj ||¡}||fS )Nrô   rr  )rz   r6   r    r/   r0   )r}   Úmethodr  r¹   r¢   Útmpdir2rq  r   r   r   Ú
_copy_file  s   
zTestCopy._copy_filec                 C   sB   |   tj¡\}}|  tj |¡¡ |  t |¡j	t |¡j	¡ d S r   )
r  rˆ   Úcopyr–   r    r/   r—   r™   rÅ   rÆ   )r}   r¢   rq  r   r   r   Ú	test_copy  s    zTestCopy.test_copyc                 C   s  |   ¡ }tj |d¡}tj |d¡}tj |d¡}t|dƒ t ||¡ ttdƒr3t |tj	tj
B ¡ tj||dd |  tj |¡¡ |  t|ƒt|ƒ¡ t |¡ tj||dd |  tj |¡¡ |  t |¡t |¡¡ ttdƒr…|  t |¡jt |¡j¡ d S d S )Nrƒ   rV  rW  r  Tr_  F)rz   r    r/   r0   r6   r”   r^   r  rÅ   r  r  rˆ   r  r¦   rR   r™   rM   rå   r–   r  rÓ   rÆ   )r}   rà   rf   rg   r  r   r   r   Útest_copy_symlinks  s(   




ÿÿzTestCopy.test_copy_symlinksrg  zrequires os.utimec                 C   s¤   |   tj¡\}}|  tj |¡¡ t |¡}t |¡}|  |j	|j	¡ dD ]}|  
t||ƒt||ƒd ¡ q%ttdƒrNt|dƒrP|  t|dƒt|dƒ¡ d S d S d S )Nrd  rm   rn  r  )r  rˆ   Úcopy2r–   r    r/   r—   rÅ   r™   rÆ   ri  r   r^   )r}   r¢   rq  Z
file1_statZ
file2_statrl  r   r   r   Ú
test_copy25  s   

ÿÿÿzTestCopy.test_copy2c           	      C   s¬  |   ¡ }tj |d¡}tj |d¡}tj |d¡}t|dƒ t ||¡ ttdƒr3t |tj	tj
B ¡ ttdƒrDttdƒrDt |tj¡ t |¡}t |¡}tj||dd |  tj |¡¡ |  t|ƒt|ƒ¡ t |¡ tj||d	d |  tj |¡¡ |  t |¡t |¡¡ t |¡}tjtjv r©d
D ]}|  t||ƒt||ƒd ¡ q˜ttdƒr¾|  |j|j¡ |  |j|j¡ ttdƒrÒt|dƒrÔ|  |j|j¡ d S d S d S )Nrƒ   rV  rW  r  r  r  Tr_  Frd  rm   r  )rz   r    r/   r0   r6   r”   r^   r  rÅ   r  r  r  r  rÓ   rˆ   r“  r¦   rR   r™   rM   rå   r–   r  rg  rÛ   ri  r   rÆ   rZ  r  )	r}   rà   rf   rg   r  r  rk  r  rl  r   r   r   Útest_copy2_symlinksF  s>   





ÿ
ÿzTestCopy.test_copy2_symlinksc                 C   sr   |   ¡ }tj |d¡}tj |d¡}t|dƒ t |dd¡ t ||¡ |  t 	|d¡t 	|d¡¡ t 
|¡ d S )Nrƒ   rV  r{  r|  )rz   r    r/   r0   r6   r‡  rˆ   r“  r™   r‰  rå   )r}   rà   rf   rg   r   r   r   Útest_copy2_xattri  s   


þzTestCopy.test_copy2_xattrc                 C   sˆ   t jt jfD ];}|  ¡ }|  ¡ }tj |d¡}t|dƒ |||ƒ}|  |tj |d¡¡ ||tj |d¡ƒ}|  |tj |d¡¡ qd S )Nrƒ   rV  )	rˆ   r  r“  rz   r    r/   r0   r6   r™   )r}   rÐ   rü   rý   rf   rM  r   r   r   Útest_copy_return_valuev  s   

øzTestCopy.test_copy_return_valuec                 C   ó   |   tj¡ d S r   )Ú_test_copy_dirrˆ   r  ©r}   r   r   r   Útest_copy_dir‚  ó   zTestCopy.test_copy_dirc                 C   r˜  r   )r™  rˆ   r“  rš  r   r   r   Útest_copy2_dir…  rœ  zTestCopy.test_copy2_dirc                 C   sx   |   ¡ }tj |d¡}|   ¡ }tj |d¡}t|dƒ tjdkr#t}nt}|  	||||¡ |  	||||¡ |||ƒ d S ©Nrƒ   údoes_not_exist/Úwin32)
rz   r    r/   r0   r6   rp   rñ   r*  ÚIsADirectoryErrorr•   )r}   Z	copy_funcrü   Úsrc_filer    rg   ru  r   r   r   r™  ˆ  s   

zTestCopy._test_copy_dirc                 C   s²   |   ¡ }tj |d¡}tj |d¡}tj |d¡}tj |d¡}t|dƒ t ||¡ tj||dd |  tj 	|¡¡ |  
t |¡t |¡¡ t ||¡ |  tj 	|¡¡ d S )Nrf   rg   r  r‹   rƒ   Fr_  )rz   r    r/   r0   r6   r”   rˆ   Úcopyfiler–   rR   r™   r  r¦   )r}   rà   rf   rg   r  r‹   r   r   r   Útest_copyfile_symlinksš  s   
zTestCopy.test_copyfile_symlinksr‹   zrequires os.linkc              
   C   s$  t  t¡ t j td¡}t j td¡}zvt|ddd}| d¡ W d   ƒ n1 s+w   Y  zt  ||¡ W n tyQ } z|  	d| ¡ W Y d }~nd }~ww |  
tjtj||¡ t|ddd}|  | ¡ d¡ W d   ƒ n1 svw   Y  t  |¡ W tjtd	d
 d S tjtd	d
 w )Nrè   ré   r)   r*   r+   Úcheddarzos.link(): %srK   Tr¯   )r    r„   r   r/   r0   r1   r2   r‹   r*  r9  r•   rˆ   r   r£  r™   rL   rå   r|   )r}   rf   rg   rH   r=  r   r   r   Ú'test_dont_copy_file_onto_link_to_itself«  s&   
ÿ€ÿÿ"z0TestCopy.test_dont_copy_file_onto_link_to_itselfc              
   C   sì   t  t¡ t j td¡}t j td¡}zZt|ddd}| d¡ W d   ƒ n1 s+w   Y  t  d|¡ |  t	j
t	j||¡ t|ddd}|  | ¡ d¡ W d   ƒ n1 sZw   Y  t  |¡ W t	jtdd	 d S t	jtdd	 w )
Nrè   ré   r)   r*   r+   r¥  rK   Tr¯   )r    r„   r   r/   r0   r1   r2   r”   r•   rˆ   r   r£  r™   rL   rå   r|   )r}   rf   rg   rH   r   r   r   Ú*test_dont_copy_file_onto_symlink_to_itself¿  s   
ÿÿ"z3TestCopy.test_dont_copy_file_onto_symlink_to_itselfr4  r5  r6  r7  c              
   C   sˆ   zt  t¡ W n ty  } z|  d| ¡ W Y d }~nd }~ww z|  tjtjtt	¡ |  tjtjt
t¡ W t  t¡ d S t  t¡ w )Nr8  )r    r4  r   r*  r9  r•   rˆ   ÚSpecialFileErrorr£  r:  Ú__file__rå   )r}   r=  r   r   r   Útest_copyfile_named_pipeÔ  s   €ÿÿÿz!TestCopy.test_copyfile_named_pipec                 C   sl   |   ¡ }|   ¡ }tj |d¡}tj |d¡}t|dƒ t ||¡}|  tj |¡¡ |  	t
|ƒt
|ƒ¡ d S )NrV  rƒ   )rz   r    r/   r0   r6   rˆ   r£  r–   r—   r™   rM   )r}   rü   rý   Údst_filer¢  rM  r   r   r   Útest_copyfile_return_valueä  s   
z#TestCopy.test_copyfile_return_valuec                 C   sX   |   ¡ }tj |d¡}t|dƒ |  ttj||¡ |  t	tj||¡ |  
t|ƒd¡ d S r-  )rz   r    r/   r0   r6   r•   r   rˆ   r£  r   r™   rM   )r}   rü   r¢  r   r   r   Útest_copyfile_same_fileï  s   
z TestCopy.test_copyfile_same_filezMOn MACOS, Solaris and Windows the errors are not confusing (though different)c                 C   sD   |   ¡ }tj |d¡}tj |d¡}t|dƒ |  ttj||¡ d S )Nrƒ   rŸ  )	rz   r    r/   r0   r6   r•   r³   rˆ   r£  )r}   rü   r¢  rg   r   r   r   Útest_copyfile_nonexistent_dirû  s
   
z&TestCopy.test_copyfile_nonexistent_dirc                 C   s„   |   ¡ }tj |d¡}|   ¡ }tj |d¡}t|dƒ tjdkr#t}nt}|  	|t
j||¡ |  	|t
j||¡ |  	|t
j||¡ d S rž  )rz   r    r/   r0   r6   rp   rñ   r*  r¡  r•   rˆ   r£  )r}   rü   r¢  r    rg   ru  r   r   r   Útest_copyfile_copy_dir  s   

zTestCopy.test_copyfile_copy_dirN)+r   r€   r   r   rí   r]  rî   rï   r^   r    ra  rð   rb  rm  r   rz  Zskip_unless_xattrrŠ  r¾   rŒ  r  r‘  r’  r”  r•  r–  r—  r›  r  r™  r¤  r¦  r§  rp   rñ   rª  r¬  r­  ÚMACOSÚSOLARISrª   r®  r¯  r   r   r   r   rU    sp    

(ÿý

?ÿ



"



ÿ
rU  c                   @   st  e Zd Ze ¡ dd„ ƒZdd„ Zd7dd„Ze ¡ e 	e
 d¡d	¡d
d„ ƒƒZe ¡ dd„ ƒZe ¡ e 	e
 d¡d¡dd„ ƒƒZe ¡ e 	e
 d¡d¡dd„ ƒƒZdd„ Ze ¡ dd„ ƒZe ¡ e 	ed¡dd„ ƒƒZdd„ Zdd „ Ze ¡ d!d"„ ƒZd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Ze ¡ d+d,„ ƒZe ¡ d-d.„ ƒZe ¡ e e o¤e!ƒ  d/¡d0d1„ ƒƒZ"e ¡ d2d3„ ƒZ#d4d5„ Z$d6S )8ÚTestArchivesc           	      C   s¨  |   d¡\}}|  ¡ }t |¡ tj |¡}tj tj |¡d¡}t 	|¡ tj 
|¡}t|d|dƒ}W d   ƒ n1 s>w   Y  |  ||d ¡ |  tj |¡¡ |  t |¡¡ t |d¡}|  | ¡ g d¢¡ W d   ƒ n1 sww   Y  t 	|¡ t|d|dƒ}W d   ƒ n1 s“w   Y  |  ||d	 ¡ |  tj |¡¡ |  t |¡¡ t |d
¡}|  | ¡ g d¢¡ W d   ƒ d S 1 sÍw   Y  d S )Nr±   ÚarchiveÚgztarÚ.ú.tar.gzzr:gz)rµ  z./subz./sub2z./file1z./file2z./sub/file3Útarú.tarrK   )Ú_create_filesrz   r    r¸   r/   rø   r0   Úbasenamer   Ú
change_cwdÚabspathr   r™   r–   rú   ÚtarfileZ
is_tarfiler1   ÚassertCountEqualÚgetnames)	r}   Úroot_dirrQ  rŽ  Úwork_dirÚrel_base_nameÚ	base_nameÚtarballZtfr   r   r   Útest_make_tarball  s8   
þ
ÿÿÿ
ÿ"ÿzTestArchives.test_make_tarballc                 C   sF   t  |¡}| ¡ }| ¡  t|ƒW  d   ƒ S 1 sw   Y  d S r   )r½  r1   r¿  Úsortr.   )r}   r/   r·  r  r   r   r   Ú_tarinfo?  s
   $ýzTestArchives._tarinfoÚdistc                 C   s’   |   ¡ }tj ||¡}tj|dd t|dfdƒ t|dfdƒ t tj |d¡¡ t|ddfdƒ t tj |d¡¡ |rEt|d	fdƒ ||fS )
NT)Úexist_okr¢   rr  rq  r  Zfile3Zsub2Úouter)rz   r    r/   r0   rP  r6   r„   )r}   rQ  rÀ  rÈ  r   r   r   r¹  E  s   zTestArchives._create_filesr·  zNeed the tar command to runc                 C   s  |   ¡ \}}tj |  ¡ d¡}t|d||ƒ}|  ||d ¡ |  tj |¡¡ tj |d¡}ddd|g}t	j
||t	jd |  tj |¡¡ |  |  |¡|  |¡¡ t|d||ƒ}|  ||d ¡ |  tj |¡¡ t|d||d	d
}|  ||d ¡ |  tj |¡¡ d S )Nr³  r´  r¶  zarchive2.tarr·  z-cf©ÚcwdÚstdoutr¸  T)Údry_run)r¹  r    r/   r0   rz   r   r™   r–   rú   rr   Ú
check_callÚDEVNULLrÇ  )r}   rÀ  rQ  rÃ  rÄ  Ztarball2Ztar_cmdr   r   r   Útest_tarfile_vs_tarS  s(   ÿ
ÿz TestArchives.test_tarfile_vs_tarc           	      C   s¬  |   ¡ \}}|  ¡ }t |¡ tj |¡}tj tj |¡d¡}t 	|¡ tj 
|¡}t|d|ƒ}W d   ƒ n1 s<w   Y  |  ||d ¡ |  tj |¡¡ |  t |¡¡ t |¡}|  | ¡ g d¢¡ W d   ƒ n1 stw   Y  t 	|¡ tj 
|¡}t|d||ƒ}W d   ƒ n1 s–w   Y  |  ||d ¡ |  tj |¡¡ |  t |¡¡ t |¡}|  | ¡ g d¢¡ W d   ƒ d S 1 sÏw   Y  d S )Nr³  Úzipú.zip)údist/ú	dist/sub/ú
dist/sub2/ú
dist/file1ú
dist/file2údist/sub/file3rÊ  )rÔ  rÕ  rÖ  r×  rØ  rÙ  )r¹  rz   r    r¸   r/   rø   r0   rº  r   r»  r¼  r   r™   r–   rú   ÚzipfileÚ
is_zipfileÚZipFiler¾  Únamelist)	r}   rÀ  rQ  rŽ  rÁ  rÂ  rÃ  rU   Úzfr   r   r   Útest_make_zipfilet  s:   
þ
ÿÿþ
ÿ"ÿzTestArchives.test_make_zipfilerÒ  zNeed the zip command to runc           
      C   s
  |   ¡ \}}tj |  ¡ d¡}t|d||ƒ}|  ||d ¡ |  tj |¡¡ tj |d¡}dddd|g}t	j
||t	jd |  tj |¡¡ t |¡}| ¡ }W d   ƒ n1 s[w   Y  t |¡}| ¡ }	W d   ƒ n1 stw   Y  |  t|ƒt|	ƒ¡ d S )Nr³  rÒ  rÓ  zarchive2.zipz-qz-rrË  )r¹  r    r/   r0   rz   r   r™   r–   rú   rr   rÏ  rÐ  rÚ  rÜ  rÝ  rO   )
r}   rÀ  rQ  rÃ  r³  Zarchive2Úzip_cmdrÞ  r  Znames2r   r   r   Útest_zipfile_vs_zip™  s$   ÿ
ÿ
ÿz TestArchives.test_zipfile_vs_zipÚunzipzNeed the unzip command to runc           	      C   s
  |   ¡ \}}tj |  ¡ d¡}t|d||ƒ}|  ||d ¡ |  tj |¡¡ dd|g}t	 
|¡J z
tj|tjd W n. tjyj } z!|jjdd}d	|v rU|  d
¡ d}|  | ||¡¡ W Y d }~nd }~ww W d   ƒ d S W d   ƒ d S 1 s~w   Y  d S )Nr³  rÒ  rÓ  râ  z-t)ÚstderrÚreplacer   zunrecognized option: tzunzip doesn't support -tz{}

**Unzip Output**
{})r¹  r    r/   r0   rz   r   r™   r–   rú   r   r»  rr   Úcheck_outputÚSTDOUTÚCalledProcessErrorÚoutputÚdecoder9  r;  Úformat)	r}   rÀ  rQ  rÃ  r³  rà  rÏ   ZdetailsÚmsgr   r   r   Útest_unzip_zipfile³  s*   

€ûÿþ"øzTestArchives.test_unzip_zipfilec                 C   s*   |   ¡ }tj |d¡}|  tt|d¡ d S )Nr³  rr  )rz   r    r/   r0   r•   Ú
ValueErrorr   )r}   r¹   rÃ  r   r   r   Útest_make_archiveË  s   zTestArchives.test_make_archivec                 C   sÞ   t rt d¡d }t d¡d }nd }}|  ¡ \}}tj |  	¡ d¡}t
|d||||d}|  tj |¡¡ t
|d||ƒ}|  tj |¡¡ t
|d||||d}|  tj |¡¡ t
|d||ddd}|  tj |¡¡ d S )	Nr   Úrootr³  rÒ  ©ÚownerÚgroupr·  Z	kjhkjhkjgZoihohoh)ÚUID_GID_SUPPORTÚgrpÚgetgrgidÚpwdÚgetpwuidr¹  r    r/   r0   rz   r   r–   rú   )r}   rò  rñ  rÀ  rQ  rÃ  rU   r   r   r   Útest_make_archive_owner_groupÐ  s(   ÿ
ÿ
ÿz*TestArchives.test_make_archive_owner_groupúRequires grp and pwd supportc           	   	   C   sØ   |   ¡ \}}tj |  ¡ d¡}t d¡d }t d¡d }t	 
|¡ t|d|d||d}W d   ƒ n1 s7w   Y  |  tj |¡¡ t |¡}z| ¡ D ]}|  |jd¡ |  |jd¡ qOW | ¡  d S | ¡  w )Nr³  r   r´  rÈ  rð  )r¹  r    r/   r0   rz   rô  rõ  rö  r÷  r   r»  r   r–   rú   r½  r1   Z
getmembersr™   ÚuidÚgidrä   )	r}   rÀ  rQ  rÃ  rò  rñ  Úarchive_namer³  Úmemberr   r   r   Útest_tarfile_root_ownerì  s"   
ÿÿ
þz$TestArchives.test_tarfile_root_ownerc                 C   sr   t  ¡ }dd„ }td|g dƒ z$ztdd|  ¡ d W n	 ty$   Y nw |  t  ¡ |¡ W tdƒ d S tdƒ w )Nc                  _   s   t ƒ ‚r   )ÚRuntimeError)r   Úkwr   r   r   Ú_breaks  s   z3TestArchives.test_make_archive_cwd.<locals>._breaksrr  úxxx file)rÀ  )r    ra   r   r   rz   rß   r™   r   )r}   Zcurrent_dirr  r   r   r   Útest_make_archive_cwd  s   ÿz"TestArchives.test_make_archive_cwdc                 C   ó\   |   ¡ }t |¡ |  tddƒd¡ |  tj d¡¡ W d   ƒ d S 1 s'w   Y  d S )NÚtestr·  ztest.tar©	rz   r   r»  r™   r   r–   r    r/   rú   ©r}   rÀ  r   r   r   Útest_make_tarfile_in_curdir  s
   "þz(TestArchives.test_make_tarfile_in_curdirc                 C   r  )Nr  rÒ  ztest.zipr  r  r   r   r   Útest_make_zipfile_in_curdir  s
   "þz(TestArchives.test_make_zipfile_in_curdirc                 C   s˜   |   ttdd¡ |   ttddd„ d¡ |   ttddd„ ddg¡ tddd„ dgd	ƒ d
d„ tƒ D ƒ}|  d|¡ tdƒ dd„ tƒ D ƒ}|  d|¡ d S )Nrr  rm   c                   S   ó   t S r   ©Úxr   r   r   r   Ú<lambda>$  ó    z;TestArchives.test_register_archive_format.<locals>.<lambda>c                   S   r
  r   r  r   r   r   r   r  &  r  )rm   r]   )rm   r]   r   c                   S   r
  r   r  r   r   r   r   r  )  r  r  c                 S   ó   g | ]\}}|‘qS r   r   ©r@   rV   Úparamsr   r   r   rB   *  ó    z=TestArchives.test_register_archive_format.<locals>.<listcomp>c                 S   r  r   r   r  r   r   r   rB   .  r  )r•   Ú	TypeErrorr   r   rÌ   r   rG  )r}   Úformatsr   r   r   Útest_register_archive_format!  s   ÿÿz)TestArchives.test_register_archive_formatc                 C   s.   |   |dd„ ¡ |   |tj¡ |   |t¡ d S )Nc                 S   s   | S r   r   ©r/   r   r   r   r  4  r  z3TestArchives.check_unpack_archive.<locals>.<lambda>)Ú#check_unpack_archive_with_converterr%  r&  r   )r}   rê  r   r   r   Úcheck_unpack_archive3  s   z!TestArchives.check_unpack_archivec           
      C   sÄ   |   ¡ \}}t|ƒ}| d¡ tj |  ¡ d¡}t||||ƒ}|  ¡ }t||ƒ||ƒƒ |  	t|ƒ|¡ |  ¡ }	t||ƒ||	ƒ|d |  	t|	ƒ|¡ |  
tjt|tƒ¡ | j
tt|tƒdd d S )NrÊ  r³  )rê  rr  )r¹  rT   rå   r    r/   r0   rz   r   r   r™   r•   rˆ   Ú	ReadErrorr   rí  )
r}   rê  Ú	converterrÀ  rQ  ÚexpectedrÃ  r¶   rŽ  Ztmpdir3r   r   r   r  8  s   
z0TestArchives.check_unpack_archive_with_converterc                 C   ó   |   d¡ d S )Nr·  ©r  rš  r   r   r   Útest_unpack_archive_tarM  r’   z$TestArchives.test_unpack_archive_tarc                 C   r  )Nr´  r  rš  r   r   r   Útest_unpack_archive_gztarP  ó   z&TestArchives.test_unpack_archive_gztarc                 C   r  )NÚbztarr  rš  r   r   r   Útest_unpack_archive_bztarT  r   z&TestArchives.test_unpack_archive_bztarz(AIX MAXDATA must be 0x20000000 or largerc                 C   r  )NÚxztarr  rš  r   r   r   Útest_unpack_archive_xztarX  s   z&TestArchives.test_unpack_archive_xztarc                 C   r  )NrÒ  r  rš  r   r   r   Útest_unpack_archive_zip]  r   z$TestArchives.test_unpack_archive_zipc                    s    t ƒ }‡ fdd„}tdddg|dgƒ tddƒ ˆ  ttd	dg|¡ tdƒ td	dg|ƒ ˆ  d	dgd
ft ƒ ¡ ˆ  ddgd
ft ƒ ¡ td	ƒ ˆ  t ƒ |¡ d S )Nc                    s(   ˆ   |d¡ ˆ   | d¡ ˆ   |d¡ d S )Nrm   ú	stuff.booÚxx)r™   )r¶   Úextract_dirÚextrarš  r   r   Ú_booe  s   z/TestArchives.test_unpack_registry.<locals>._booZBooz.booz.b2)r)  rm   r&  r'  ZBoo2r±   )	r   r   r   r•   r	   r
   rÌ   rG  r™   )r}   r  r*  r   rš  r   Útest_unpack_registrya  s   

ÿz!TestArchives.test_unpack_registryN)rÈ  )%r   r€   r   r   Zrequires_zlibrÅ  rÇ  r¹  rî   rï   rˆ   ÚwhichrÑ  rß  rá  rì  rî  rø  ró  rþ  r  r  r	  r  r  r  r  r  Zrequires_bz2r"  Zrequires_lzmarð   ro   rw   r$  r%  r+  r   r   r   r   r²    s\    
#
ÿ
$ÿÿ





r²  c                   @   sL   e Zd Ze eedƒd¡dd„ ƒZe ed¡e ee	dƒd¡dd	„ ƒƒZ
d
S )ÚTestMiscÚ
disk_usagez)disk_usage not available on this platformc                 C   s†   t  tj t¡¡}dD ]}|  t||ƒt¡ q|  	|j
d¡ |  	|jd¡ |  |jd¡ |  |j
|j¡ |  	|j
|j¡ t  t¡ d S )N)r7   ÚusedÚfreer   )rˆ   r.  r    r/   rø   r©  r†   r   rv   ZassertGreaterr7   r/  ÚassertGreaterEqualr0  )r}   Úusagerl  r   r   r   Útest_disk_usage~  s   zTestMisc.test_disk_usagerù  Úchownzrequires os.chownc                    s‚  ˆ  ¡ }tj|d‰ tˆ dƒ ˆ t¡ t ˆ ¡ W d   ƒ n1 s$w   Y  ˆ t¡ tjˆ dd W d   ƒ n1 s@w   Y  ˆ t¡ tjˆ dd W d   ƒ n1 s\w   Y  ˆ t	¡ t ˆ d¡ W d   ƒ n1 sww   Y  ˆ t	¡ t ˆ d¡ W d   ƒ n1 s’w   Y  t
 ¡ }t
 ¡ }d‡ ‡fd	d
„	}t ˆ ||¡ |ˆ ||ƒ t ˆ |¡ |ˆ |ƒ tjˆ |d |ˆ |ƒ tjˆ |d |ˆ |d t |||¡ ||||ƒ t ||¡ |||ƒ tj||d |||ƒ tj||d |||d zt |¡d }t |¡d }W n ty$   Y d S w t ˆ ||¡ |ˆ ||ƒ t |||¡ ||||ƒ d S )Nr®   ztesting chown functionznon-existing username)Úuserznon-existing groupname)rò  ó   spamg…ëQ¸	@c                    s>   t  ˆ ¡}|d urˆ ||j¡ |d urˆ ||j¡ d S d S r   )r    rÅ   r™   Úst_uidÚst_gid)r/   rú  rû  Ús©r¶   r}   r   r   Úcheck_chown¦  s   
ÿz(TestMisc.test_chown.<locals>.check_chown)rû  r   )NN)rz   r_   r²   r6   r•   rí  rˆ   r4  ÚLookupErrorr  r    ÚgetuidÚgetgidrö  r÷  rô  rõ  ÚKeyError)r}   rø   rú  rû  r;  r5  rò  r   r:  r   Ú
test_chown  s^   
ÿÿÿÿÿ



þzTestMisc.test_chownN)r   r€   r   rî   rï   r^   rˆ   r3  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	d
„ Ze 	e
edƒo$e ¡ dkd¡dd„ ƒZdd„ Zdd„ Ze ejdkd¡dd„ ƒZdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Ze ejdkd$¡d%d&„ ƒZe ejdkd$¡d'd(„ ƒZd)S )*Ú	TestWhichc                 C   st   | j dd| _tj| jddd| _t | jjtj	¡ |  
| jj¡ tj | jj¡\| _| _| j| _tj| _d| _d S )NZTmp)ry   z.Exe©r[   ry   Úsuffixz.EXE)rz   Útemp_dirr_   r`   Ú	temp_filer    rÉ   rV   rÅ   ÚS_IXUSRr{   rä   r/   ru   r[   ÚfileÚenv_pathÚcurdirÚextrš  r   r   r   ÚsetUpÎ  s   þ
zTestWhich.setUpc                 C   s&   t j| j| jd}|  || jj¡ d S ©Nr  )rˆ   r,  rG  r[   r™   rE  rV   ©r}   rM  r   r   r   Ú
test_basicÜ  s   zTestWhich.test_basicc                 C   s(   t j| jj| jd}|  || jj¡ d S rL  )rˆ   r,  rE  rV   rD  r™   rM  r   r   r   Útest_absolute_cmdá  s   zTestWhich.test_absolute_cmdc                 C   s¶   t j | j¡\}}t j || j¡}tj|d tj	|| j
d}|  ||¡ W d   ƒ n1 s0w   Y  tj| jd tj	||d}|  |¡ W d   ƒ d S 1 sTw   Y  d S rL  )r    r/   ru   r[   r0   rG  r   r»  rˆ   r,  rD  r™   ÚassertIsNone)r}   rQ  Útail_dirÚrelpathrM  r   r   r   Útest_relative_cmdç  s   þ"þzTestWhich.test_relative_cmdc                 C   s’   t j | j¡}tj| jd1 tj| j|d}t	j
dkr*|  |t j | j| j¡¡ n|  |¡ W d   ƒ d S W d   ƒ d S 1 sBw   Y  d S )Nr  r   )r    r/   rø   r[   r   r»  rˆ   r,  rG  rp   rñ   r™   r0   rI  rP  )r}   rQ  rM  r   r   r   Útest_cwdô  s   
ù"üzTestWhich.test_cwdr¾   r   znon-root user requiredc                 C   sR   t  | jjtj¡ t  | jjt j¡r|  d¡ t	j
| j| jt jd}|  |¡ d S )Nzcan't set the file read-only)r/   r4   )r    rÉ   rE  rV   rÅ   rÇ   ÚaccessÚW_OKr9  rˆ   r,  rG  r[   rP  rM  r   r   r   Útest_non_matching_mode   s
   
z TestWhich.test_non_matching_modec                 C   sl   t j | j¡\}}tj|d tj| j|d}|  	|t j 
|| j¡¡ W d   ƒ d S 1 s/w   Y  d S rL  )r    r/   ru   r[   r   r»  rˆ   r,  rG  r™   r0   )r}   rQ  rQ  rM  r   r   r   Útest_relative_path
  s
   "þzTestWhich.test_relative_pathc                 C   s   t jd| jd}|  |¡ d S )Nzfoo.exer  )rˆ   r,  r[   rP  rM  r   r   r   Útest_nonexistent_file  s   zTestWhich.test_nonexistent_filer   zpathext check is Windows-onlyc                 C   s<   t j| jd d… | jd}|  || jjd d… | j ¡ d S )Néüÿÿÿr  )rˆ   r,  rG  r[   r™   rE  rV   rJ  rM  r   r   r   Útest_pathext_checking  s   "zTestWhich.test_pathext_checkingc                 C   sT   t  ¡ }| j|d< t | j¡}|  || jj¡ W d   ƒ d S 1 s#w   Y  d S ©NÚPATH)	r   ÚEnvironmentVarGuardrH  rˆ   r,  rG  r™   rE  rV   ©r}   ÚenvrM  r   r   r   Útest_environ_path  s
   

"ýzTestWhich.test_environ_pathc                 C   sì   t  ¡ h}d|d< tjjd| jddA t td| j¡) t  	| j¡ t
 | j¡}|  |¡ W d   ƒ n1 s9w   Y  W d   ƒ n1 sHw   Y  W d   ƒ n1 sWw   Y  W d   ƒ d S W d   ƒ d S 1 sow   Y  d S )Nr±   r]  ú
os.confstrT©Úreturn_valueÚcreateÚdefpath)r   r^  rî   rS  rT  r[   r   Ú	swap_attrr    r»  rˆ   r,  rG  rP  r_  r   r   r   Útest_environ_path_empty#  s&   
ÿþ
ýû€ € þ"þz!TestWhich.test_environ_path_emptyc                 C   sH  t j | jj¡}tjdkr!t j}t|t	ƒrt  
|¡}t j ||¡}t ¡ u}t j|d< tjjd| jddM t t d| j¡5 t | j¡}|  |¡ t | j¡ t | j¡}|  ||¡ W d   ƒ n1 sgw   Y  W d   ƒ n1 svw   Y  W d   ƒ n1 s…w   Y  W d   ƒ d S W d   ƒ d S 1 sw   Y  d S )Nr   r]  rb  Trc  rf  )r    r/   rº  rE  rV   rp   rñ   rI  r-   r‡   r…   r0   r   r^  Úpathseprî   rS  rT  r[   r   rg  rˆ   r,  rG  rP  r»  r™   )r}   Zexpected_cwdrI  r`  rM  r   r   r   Útest_environ_path_cwd.  s4   




ÿþ
þ€ù€ þ"þzTestWhich.test_environ_path_cwdc              
   C   s6  t  ¡ }| dd ¡ tjjdtdd& t t	d| j
¡ t | j¡}W d   ƒ n1 s.w   Y  W d   ƒ n1 s=w   Y  |  || jj¡ tjjd| j
dd% t t	dd¡ t | j¡}W d   ƒ n1 smw   Y  W d   ƒ n1 s|w   Y  |  || jj¡ W d   ƒ d S 1 s”w   Y  d S )Nr]  rb  T)r+  re  rf  rc  r±   )r   r^  Úpoprî   rS  rT  rí  r   rg  r    r[   rˆ   r,  rG  r™   rE  rV   r_  r   r   r   Útest_environ_path_missingD  s.   

ÿþý€ ÿþý€ "ñz#TestWhich.test_environ_path_missingc              	   C   sž   t j | j¡}tj| jd7 t ¡ }| j|d< tj	| j
dd}|  |¡ W d   ƒ n1 s0w   Y  W d   ƒ d S W d   ƒ d S 1 sHw   Y  d S )Nr  r]  r±   )r    r/   rø   r[   r   r»  r^  rH  rˆ   r,  rG  rP  )r}   rQ  r`  rM  r   r   r   Útest_empty_pathV  s   ÿ
PüzTestWhich.test_empty_pathc                 C   sP   t  ¡ }| dd ¡ t | j¡}|  |¡ W d   ƒ d S 1 s!w   Y  d S r\  )r   r^  rk  rˆ   r,  rG  rP  r_  r   r   r   Útest_empty_path_no_PATH^  s
   
"ýz!TestWhich.test_empty_path_no_PATHztest specific to Windowsc                 C   s¤   d}t j| jd|d}t |jtj¡ |  |j	¡ tj
 |j¡}tj
 |¡d }t ¡ }||d< tj|| jd}|  ||j¡ W d   ƒ d S 1 sKw   Y  d S )Nú.xyzÚTmp2rB  r   ÚPATHEXTr  )r_   r`   rD  r    rÉ   rV   rÅ   rF  r{   rä   r/   rº  r  r   r^  rˆ   r,  r™   ©r}   rJ  Ztemp_filexyzZprogramr`  rM  r   r   r   Útest_pathextd  s   ÿ
"ýzTestWhich.test_pathextc                 C   sš   d}t j| jd|d}|  |j¡ tj |j¡}tj 	|¡d }t
 ¡ }|› d|d< tj|| jd}|  ||j¡ W d   ƒ d S 1 sFw   Y  d S )Nro  rp  rB  r   ú;rq  r  )r_   r`   rD  r{   rä   r    r/   rº  rV   r  r   r^  rˆ   r,  r™   rr  r   r   r   Útest_pathext_with_empty_strv  s   ÿ
"ýz%TestWhich.test_pathext_with_empty_strN)r   r€   r   rK  rN  rO  rS  rT  rî   rð   r^   r    r¾   rW  rX  rY  rï   rp   rñ   r[  ra  rh  rj  rl  rm  rn  rs  ru  r   r   r   r   rA  Ì  s4    ÿ
ÿ

rA  c                   @   s   e Zd Zdd„ ZdS )ÚTestWhichBytesc                 C   sX   t  | ¡ t | j¡| _t | j¡| _t | jj¡| j_t | j¡| _t | j	¡| _	d S r   )
rA  rK  r    r…   r[   rG  rE  rV   rI  rJ  rš  r   r   r   rK  ˆ  s   
zTestWhichBytes.setUpN)r   r€   r   rK  r   r   r   r   rv  ‡  s    rv  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	e
dd„ ƒZe
dd„ ƒZdd„ Ze
dd„ ƒZdd„ Ze
dd„ ƒZdd„ Ze ejjd¡dd„ ƒZd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zeje
d(d)„ ƒƒZeje
d*d+„ ƒƒZeje
d,d-„ ƒƒZ eje
d.d/„ ƒƒZ!d0d1„ Z"d2d3„ Z#e
d4d5„ ƒZ$e
d6d7„ ƒZ%d8d9„ Z&e e'ed:ƒo·e (¡ d;ko·e'ed<ƒo·e'e)d=ƒo·e'e)d>ƒd?¡d@dA„ ƒZ*dBS )CÚTestMovec                 C   sx   d}|   ¡ | _|   ¡ | _tj | j|¡| _tj | j|¡| _t| jdƒ}| 	d¡ W d   ƒ d S 1 s5w   Y  d S )Nrƒ   r(   r6  )
rz   rü   rý   r    r/   r0   r¢  r«  r1   r2   )r}   r¶   rH   r   r   r   rK  “  s   

"ÿzTestMove.setUpc                 C   sŽ   t |dƒ}| ¡ }W d   ƒ n1 sw   Y  t ||¡ t |dƒ}|  || ¡ ¡ W d   ƒ n1 s7w   Y  |  tj |¡¡ d S ©NrJ   )	r1   rL   rˆ   Úmover™   r¦   r    r/   r—   )r}   rf   rg   Úreal_dstrH   Úcontentsr   r   r   Ú_check_move_fileœ  s   
ÿÿzTestMove._check_move_filec                 C   sF   t t |¡ƒ}t ||¡ |  |t t |¡ƒ¡ |  tj |¡¡ d S r   )	rO   r    rP   rˆ   ry  r™   r¦   r/   r—   )r}   rf   rg   rz  r{  r   r   r   Ú_check_move_dir¤  s   zTestMove._check_move_dirc                 C   s   |   | j| j| j¡ d S r   )r|  r¢  r«  rš  r   r   r   Útest_move_fileª  ó   zTestMove.test_move_filec                 C   s   |   | j| j| j¡ d S r   )r|  r¢  rý   r«  rš  r   r   r   Útest_move_file_to_dir®  r  zTestMove.test_move_file_to_dirc                 C   s"   t  | j¡}|  || j| j¡ d S r   )r%  r&  r¢  r|  rý   r«  )r}   rf   r   r   r   Ú"test_move_file_to_dir_pathlike_src²  ó   z+TestMove.test_move_file_to_dir_pathlike_srcc                 C   s"   t  | j¡}|  | j|| j¡ d S r   )r%  r&  rý   r|  r¢  r«  ©r}   rg   r   r   r   Ú"test_move_file_to_dir_pathlike_dst·  r‚  z+TestMove.test_move_file_to_dir_pathlike_dstc                 C   ó   |   ¡  d S r   )r~  rš  r   r   r   Útest_move_file_other_fs¼  ó   z TestMove.test_move_file_other_fsc                 C   r…  r   )r€  rš  r   r   r   Útest_move_file_to_dir_other_fsÁ  r‡  z'TestMove.test_move_file_to_dir_other_fsc              	   C   s>   t j|  ¡ d}z|  | j||¡ W t |¡ d S t |¡ w râ   )r_   r²   rz   r}  rü   r   r|   ©r}   rý   r   r   r   Útest_move_dirÆ  s   zTestMove.test_move_dirc                 C   r…  r   )rŠ  rš  r   r   r   Útest_move_dir_other_fsÎ  r‡  zTestMove.test_move_dir_other_fsc              
   C   s,   |   | j| jtj | jtj | j¡¡¡ d S r   )r}  rü   rý   r    r/   r0   rº  rš  r   r   r   Útest_move_dir_to_dirÓ  s   ÿzTestMove.test_move_dir_to_dirc                 C   r…  r   )rŒ  rš  r   r   r   Útest_move_dir_to_dir_other_fsØ  r‡  z&TestMove.test_move_dir_to_dir_other_fsc              
   C   ó4   |   | jtjj | jtj | jtj | j¡¡¡ d S r   )r}  rü   r    r/   Úseprý   r0   rº  rš  r   r   r   Útest_move_dir_sep_to_dirÝ  s   ÿz!TestMove.test_move_dir_sep_to_dirzrequires os.path.altsepc              
   C   rŽ  r   )r}  rü   r    r/   Úaltseprý   r0   rº  rš  r   r   r   Útest_move_dir_altsep_to_dirá  s   ÿz$TestMove.test_move_dir_altsep_to_dirc                 C   sH   t | jdƒ W d   ƒ n1 sw   Y  |  tjtj| j| j¡ d S )Nr(   )r1   r«  r•   rˆ   r   ry  r¢  rý   rš  r   r   r   Ú"test_existing_file_inside_dest_diræ  s   ÿz+TestMove.test_existing_file_inside_dest_dirc                 C   s*   t j | jd¡}|  tjtj| j|¡ d S ©NrV  )r    r/   r0   rü   r•   rˆ   r   ry  rƒ  r   r   r   Útest_dont_move_dir_in_itselfì  s   z%TestMove.test_dont_move_dir_in_itselfc              	   C   óp   t  t¡ z,dD ]!\}}t j t|¡}t j t|¡}| jt ||¡d||f d qW t 	t¡ d S t 	t¡ w )N))Úsrcdirzsrcdir/destz?_destinsrc() wrongly concluded that dst (%s) is not in src (%s)©rë  )
r    r„   r   r/   r0   r–   rˆ   Ú
_destinsrcr   r|   rê   r   r   r   Útest_destinsrc_false_negativeñ  ó   
ÿÿýz&TestMove.test_destinsrc_false_negativec              	   C   r–  )N))r—  zsrc/dest)r—  z
srcdir.newz;_destinsrc() wrongly concluded that dst (%s) is in src (%s)r˜  )
r    r„   r   r/   r0   r¦   rˆ   r™  r   r|   rê   r   r   r   Útest_destinsrc_false_positiveý  r›  z&TestMove.test_destinsrc_false_positivec                 C   s\   t j | jd¡}t  | j|¡ t || j¡ |  	t j 
| j¡¡ |  	t j | j| j¡¡ d S r”  )r    r/   r0   rü   r”   r¢  rˆ   ry  r«  r–   rR   Úsamefilerƒ  r   r   r   Útest_move_file_symlink	  s
   zTestMove.test_move_file_symlinkc                 C   sl   d}t j | j|¡}t  | j|¡ t || j¡ t j | j|¡}|  	t j 
|¡¡ |  	t j | j|¡¡ d S r”  )r    r/   r0   rü   r”   r¢  rˆ   ry  rý   r–   rR   r  )r}   r¶   rg   Z
final_linkr   r   r   Útest_move_file_symlink_to_dir  s   z&TestMove.test_move_file_symlink_to_dirc                 C   sz   t j | jd¡}t j | jd¡}t  ||¡ t j | jd¡}t ||¡ |  t j 	|¡¡ |  
t j |¡t j |¡¡ d S ©NrW  rV  rX  )r    r/   r0   rü   r”   rý   rˆ   ry  r–   rR   r™   Úrealpath©r}   rf   rg   r  r   r   r   Útest_move_dangling_symlink  s    z#TestMove.test_move_dangling_symlinkc                 C   s|   t j | jd¡}t j | jd¡}t  |¡ t  ||¡ t j | jd¡}t ||¡ |  	t j 
|¡¡ |  	t j ||¡¡ d S r   )r    r/   r0   rü   r„   r”   rý   rˆ   ry  r–   rR   r  r¢  r   r   r   Útest_move_dir_symlink(  s   
zTestMove.test_move_dir_symlinkc              	   C   s6   t  | j| j¡}|  |tj | jtj | j¡¡¡ d S r   )	rˆ   ry  r¢  rý   r™   r    r/   r0   rº  rM  r   r   r   Útest_move_return_value4  s   ÿzTestMove.test_move_return_valuec                 C   s6   t  | jtj | jd¡¡}|  |tj | jd¡¡ d S r”  )rˆ   ry  r¢  r    r/   r0   rý   r™   rM  r   r   r   Ú test_move_as_rename_return_value9  s   z)TestMove.test_move_as_rename_return_valuec                    s8   g ‰ ‡ fdd„}t j| j| j|d |  tˆ ƒd¡ d S )Nc                    r?  r   r   r@  ©Zmovedr   r   rB  @  rC  z7TestMove.test_move_file_special_function.<locals>._copyr1  rm   )rˆ   ry  r¢  rý   r™   rš   ©r}   rB  r   r§  r   Útest_move_file_special_function=  s   z(TestMove.test_move_file_special_functionc                    sd   g ‰ ‡ fdd„}t  tj | jd¡¡ t  tj | jd¡¡ tj| j| j|d |  	t
ˆ ƒd¡ d S )Nc                    r?  r   r   r@  r§  r   r   rB  H  rC  z6TestMove.test_move_dir_special_function.<locals>._copyÚchildZchild1r1  r   )r   rÄ   r    r/   r0   rü   rˆ   ry  rý   r™   rš   r¨  r   r§  r   Útest_move_dir_special_functionE  s   z'TestMove.test_move_dir_special_functionc              	   C   s|   |   ¡ | _tj tj | j¡tj | j¡ ¡ ¡}|  | j|¡ zt	 
| j|¡ |  tj |¡¡ W t |¡ d S t |¡ w r   )rz   rü   r    r/   r0   rø   rº  ÚupperrZ  rˆ   ry  r–   rQ   r¸   r‰  r   r   r   Útest_move_dir_caseinsensitiveO  s   
þz&TestMove.test_move_dir_caseinsensitiver¾   r   r  ÚSF_IMMUTABLEÚ	UF_OPAQUEr‹  c              
   C   s0  zqt  t¡ t  ttj¡ |  ttj	tt
¡ |  t
t  ¡ v ¡ t  ttj¡ t t j td¡¡ t  ttj¡ |  ttj	tt
¡ |  t
t  ¡ v ¡ W t j t¡r\t  ttj¡ t t¡ t j t
¡rpt  t
tj¡ t t
¡ d S d S t j t¡r„t  ttj¡ t t¡ t j t
¡r—t  t
tj¡ t t
¡ w w )Nrª  )r    r„   Ú
TESTFN_SRCr  rÅ   r®  r•   r*  rˆ   ry  Ú
TESTFN_DSTr¦   rP   r¯  r   rÄ   r/   r0   r—   r|   rš  r   r   r   Útest_move_dir_permission_denied`  s0   

þý
þz(TestMove.test_move_dir_permission_deniedN)+r   r€   r   rK  r|  r}  r~  r€  r  r„  r'   r†  rˆ  rŠ  r‹  rŒ  r  r  rî   rï   r    r/   r‘  r’  r“  r•  rš  rœ  r   rí   rž  rŸ  r£  r¤  r¥  r¦  r©  r«  r­  r^   r¾   rÅ   r²  r   r   r   r   rw  ‘  sj    	




		


	ÿþürw  c                   @   s`   e Zd ZG dd„ deƒZdd„ Ze ed¡dd„ ƒZ	e ed¡dd	„ ƒZ
e ed¡d
d„ ƒZdS )ÚTestCopyFilec                   @   s:   e Zd ZdZdZdZddd„Zdd„ Zdd	„ Zd
d„ Z	dS )zTestCopyFile.FauxFNTc                 C   s   || _ || _d S r   )Ú_raise_in_exitÚ_suppress_at_exit)r}   Zraise_in_exitZsuppress_at_exitr   r   r   Ú__init__‰  s   
zTestCopyFile.Faux.__init__c                 G   s   dS )Nr±   r   )r}   r   r   r   r   rL   Œ  rØ   zTestCopyFile.Faux.readc                 C   s
   d| _ d S )NT)Ú_enteredrš  r   r   r   Ú	__enter__Ž  s   
zTestCopyFile.Faux.__enter__c                 C   s&   |||f| _ | jrd| _tdƒ‚| jS )NTúCannot close)Ú_exited_withr´  Ú_raisedr   rµ  )r}   Úexc_typeÚexc_valÚexc_tbr   r   r   Ú__exit__  s
   zTestCopyFile.Faux.__exit__)FT)
r   r€   r   r·  rº  r»  r¶  rL   r¸  r¿  r   r   r   r   ÚFaux…  s    
rÀ  c              	   C   s„   ddd„}t  td|¡, |  t¡ t dd¡ W d   ƒ n1 s#w   Y  W d   ƒ d S W d   ƒ d S 1 s;w   Y  d S )NrK   c                 S   s   | dkrt dƒ‚d S )NÚsrcfilezCannot open "srcfile"rx  ©r¶   r4   r   r   r   Ú_open˜  s   ÿz4TestCopyFile.test_w_source_open_fails.<locals>._openr1   rÁ  Údestfile©rK   )r   rg  rˆ   r•   r   r£  ©r}   rÃ  r   r   r   Útest_w_source_open_fails—  s   
ÿÿ"ÿz%TestCopyFile.test_w_source_open_failszskipped on macOSc                    sˆ   |   ¡ ‰ d
‡ fdd„	}t td|¡ t dd¡ W d   ƒ n1 s#w   Y  |  ˆ j¡ |  ˆ jd tu ¡ |  	ˆ jd j
d	¡ d S )NrK   c                    s    | dkrˆ S | dkrt dƒ‚d S )NrÁ  rÄ  úCannot open "destfile"rx  rÂ  ©rÁ  r   r   rÃ  ¥  s
   ÿz2TestCopyFile.test_w_dest_open_fails.<locals>._openr1   rÁ  rÄ  r   rm   )rÈ  rÅ  )rÀ  r   rg  rˆ   r£  r–   r·  rº  r   r™   r   rÆ  r   rÉ  r   Útest_w_dest_open_fails¡  s   ÿÿz#TestCopyFile.test_w_dest_open_failsc                    s¬   |   ¡ ‰|   d¡‰ d‡ ‡fdd„	}t td|¡ t dd¡ W d   ƒ n1 s)w   Y  |  ˆj¡ |  ˆ j¡ |  ˆ j¡ |  ˆjd t	u ¡ |  
ˆjd	 jd
¡ d S )NTrK   c                    ó   | dkrˆS | dkrˆ S d S ©NrÁ  rÄ  r   rÂ  ©rÄ  rÁ  r   r   rÃ  ¸  ó
   ÿz3TestCopyFile.test_w_dest_close_fails.<locals>._openr1   rÁ  rÄ  r   rm   )r¹  rÅ  )rÀ  r   rg  rˆ   r£  r–   r·  r»  rº  r   r™   r   rÆ  r   rÍ  r   Útest_w_dest_close_fails³  s   
ÿÿz$TestCopyFile.test_w_dest_close_failsc              	      sÎ   |   d¡‰|   ¡ ‰ d	‡ ‡fdd„	}t td|¡# |  t¡ t dd¡ W d   ƒ n1 s/w   Y  W d   ƒ n1 s>w   Y  |  ˆj¡ |  ˆ j¡ |  	ˆ j
¡ |  ˆjd d u ¡ |  ˆj
¡ d S )
NTrK   c                    rË  rÌ  r   rÂ  rÍ  r   r   rÃ  Î  rÎ  z5TestCopyFile.test_w_source_close_fails.<locals>._openr1   rÁ  rÄ  r   rÅ  )rÀ  r   rg  rˆ   r•   r   r£  r–   r·  r¦   r»  rº  rÆ  r   rÍ  r   Útest_w_source_close_failsÈ  s   
ÿ€ÿz&TestCopyFile.test_w_source_close_failsN)r   r€   r   ÚobjectrÀ  rÇ  rî   rð   r°  rÊ  rÏ  rÐ  r   r   r   r   r³  ƒ  s    





r³  c                   @   sx   e Zd ZdZedd„ ƒZedd„ ƒZdd„ Zej	dd	„ ƒZ
d
d„ Zdd„ Zdd„ Zdd„ Ze ejdkd¡dd„ ƒZdS )ÚTestCopyFileObji    c                 C   s   t t| jƒ d S r   )rI   r   ÚFILESIZE©Úclsr   r   r   Ú
setUpClassâ  s   zTestCopyFileObj.setUpClassc                 C   s   t  t¡ t  t¡ d S r   )r   rc   r   r:  rÔ  r   r   r   ÚtearDownClassæ  s   
zTestCopyFileObj.tearDownClassc                 C   ó   t  t¡ d S r   ©r   rc   r:  rš  r   r   r   ÚtearDownë  r’   zTestCopyFileObj.tearDownc              	   c   óv    t tdƒ+}t tdƒ}||fV  W d   ƒ n1 sw   Y  W d   ƒ d S W d   ƒ d S 1 s4w   Y  d S ©NrJ   r(   ©r1   r   r:  rê   r   r   r   Ú	get_filesî  ó   €ÿÿ"ÿzTestCopyFileObj.get_filesc              	   C   s~   t |dƒ0}t |dƒ}|  | ¡ | ¡ ¡ W d   ƒ n1 s w   Y  W d   ƒ d S W d   ƒ d S 1 s8w   Y  d S rx  )r1   r™   rL   )r}   rf   rg   ÚfsrcÚfdstr   r   r   Úassert_files_eqô  s   ÿÿ"ÿzTestCopyFileObj.assert_files_eqc                 C   sH   |   ¡ \}}t ||¡ W d   ƒ n1 sw   Y  |  tt¡ d S r   )rÞ  rˆ   Úcopyfileobjrâ  r   r:  rê   r   r   r   Útest_contentù  s   ÿzTestCopyFileObj.test_contentc                 C   s>   |   ¡ \}}t ||¡ W d   ƒ d S 1 sw   Y  d S r   )rÞ  rˆ   rã  rê   r   r   r   Útest_file_not_closedþ  s   "ÿz$TestCopyFileObj.test_file_not_closedc                 C   sb   |   ¡ #\}}t ||¡ |  | ¡ | j¡ |  | ¡ | j¡ W d   ƒ d S 1 s*w   Y  d S r   )rÞ  rˆ   rã  r™   ÚtellrÓ  rê   r   r   r   Útest_file_offset	  s
   "ýz TestCopyFileObj.test_file_offsetr	  zWindows onlyc                 C   sz  t j d¡}t tt¡ W d   ƒ n1 sw   Y  |  |jd d d¡ t	j
t ¡ dd}| d¡ W d   ƒ n1 s@w   Y  |j}|  tj|¡ t j d¡}t |t¡ W d   ƒ n1 sfw   Y  |  |jd d d¡ t	j
t ¡ dd}W d   ƒ n1 sŠw   Y  |j}|  tj|¡ t j d¡}t |t¡ W d   ƒ n1 s°w   Y  |  |t¡ d S )	Nzshutil._copyfileobj_readintor   r]   i   FrZ   s   foor   )rî   rS  rT  rˆ   r£  r   r:  r™   Ú	call_argsr_   r`   r    ra   r2   rV   r{   r   rc   râ  )r}   ÚmrH   r  r   r   r   Útest_win_impl
	  s,   ÿÿÿÿÿzTestCopyFileObj.test_win_implN)r   r€   r   rÓ  ÚclassmethodrÖ  r×  rÚ  Ú
contextlibÚcontextmanagerrÞ  râ  rä  rå  rç  rî   rð   r    rV   rê  r   r   r   r   rÒ  ß  s    


rÒ  c                   @   s   e Zd Z	 dZdZdZedd„ ƒZedd„ ƒZdd	„ Z	e
jd
d„ ƒZdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )Ú_ZeroCopyFileTesti    r:   r±   c                 C   sF   t t| jƒ ttdƒ}| ¡ | _W d   ƒ d S 1 sw   Y  d S rx  )rI   r   rÓ  r1   rL   ÚFILEDATA)rÕ  rH   r   r   r   rÖ  /	  s   "ÿz_ZeroCopyFileTest.setUpClassc                 C   rØ  r   )r   rc   r   rÔ  r   r   r   r×  6	  r   z_ZeroCopyFileTest.tearDownClassc                 C   rØ  r   rÙ  rš  r   r   r   rÚ  :	  r’   z_ZeroCopyFileTest.tearDownc              	   c   rÛ  rÜ  rÝ  rê   r   r   r   rÞ  =	  rß  z_ZeroCopyFileTest.get_filesc                 O   s   t dƒ‚)Nzmust be implemented in subclass)ÚNotImplementedError)r}   r   r   r   r   r   Úzerocopy_funC	  s   z_ZeroCopyFileTest.zerocopy_func                 C   s$   |   ¡  |  ¡  |  ¡  |  ¡  d S r   )rÚ  r×  rÖ  rK  rš  r   r   r   ÚresetF	  s   z_ZeroCopyFileTest.resetc              	   C   sÈ   |   ¡ \}}|  ||¡ W d   ƒ n1 sw   Y  |  ttdd| j¡ |   ¡ /\}}tj d¡}t	 
tt¡ W d   ƒ n1 sEw   Y  W d   ƒ d S W d   ƒ d S 1 s]w   Y  d S )NT©r3   zshutil.copyfileobj)rÞ  rñ  r™   rM   r:  rï  rî   rS  rT  rˆ   r£  r   )r}   rf   rg   ré  r   r   r   Útest_regular_copyN	  s   ÿÿÿ"ÿz#_ZeroCopyFileTest.test_regular_copyc              	   C   sˆ   |   | j¡ |  ¡ %\}}|  t¡ |  ||¡ W d   ƒ n1 s#w   Y  W d   ƒ n1 s2w   Y  |  ttdd| j	¡ d S )NTró  )
r{   rò  rÞ  r•   rß   rñ  r™   rM   r   rï  rê   r   r   r   Útest_same_fileX	  s   ÿ€ÿz _ZeroCopyFileTest.test_same_filec                 C   sZ   t jt ¡ d}|  t¡}t |d¡ W d   ƒ n1 sw   Y  |  |j	j
|¡ d S )Nr®   Únew)r_   r²   r    ra   r•   r³   rˆ   r£  r™   rµ   r¶   )r}   rV   rº   r   r   r   Útest_non_existent_src`	  s
   ÿz'_ZeroCopyFileTest.test_non_existent_srcc              	      sÖ   t d ‰t d ‰ |  ‡fdd„¡ |  ‡ fdd„¡ tˆdƒ W d   ƒ n1 s*w   Y  tˆdƒ#}tˆ dƒ}|  ||¡ W d   ƒ n1 sKw   Y  W d   ƒ n1 sZw   Y  |  tˆ dd	d
¡ d S )Nrf   rg   c                      ó
   t  ˆ ¡S r   ©r   rc   r   )rd   r   r   r  i	  ó   
 z3_ZeroCopyFileTest.test_empty_file.<locals>.<lambda>c                      rø  r   rù  r   )re   r   r   r  j	  rú  r(   rJ   Tró  r:   )r   r{   r1   rñ  r™   rM   rê   r   )re   rd   r   Útest_empty_filef	  s   ÿÿ€ÿz!_ZeroCopyFileTest.test_empty_filec                 C   sJ   t jj| jtd |  ttjtt	¡ W d   ƒ d S 1 sw   Y  d S )N©r+  )
rî   rS  rT  Ú
PATCHPOINTÚZeroDivisionErrorr•   rˆ   r£  r   r:  rš  r   r   r   Útest_unhandled_exceptiont	  s   
ÿÿ"þz*_ZeroCopyFileTest.test_unhandled_exceptionc              
   C   s²   t jj| jttjdƒdB |  ¡ %\}}|  t	¡ |  
||¡ W d   ƒ n1 s+w   Y  W d   ƒ n1 s:w   Y  W d   ƒ d S W d   ƒ d S 1 sRw   Y  d S ©NÚyorü  )rî   rS  rT  rý  r   r   ÚEINVALrÞ  r•   r   rñ  rê   r   r   r   Útest_exception_on_first_callz	  s   

ÿÿ€ÿþ"þz._ZeroCopyFileTest.test_exception_on_first_callc              	   C   sŽ   t jj| jttjdƒd0 |  ¡ \}}|  t| j	||¡ W d   ƒ n1 s(w   Y  W d   ƒ d S W d   ƒ d S 1 s@w   Y  d S r   )
rî   rS  rT  rý  r   r   ÚENOSPCrÞ  r•   rñ  rê   r   r   r   Útest_filesystem_full„	  s   

ÿÿþ"þz&_ZeroCopyFileTest.test_filesystem_fullN)r   r€   r   rÓ  rï  rý  rë  rÖ  r×  rÚ  rì  rí  rÞ  rñ  rò  rô  rõ  r÷  rû  rÿ  r  r  r   r   r   r   rî  )	  s*    




rî  zos.sendfile() not supportedc                   @   sX   e Zd 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S )ÚTestZeroCopySendfileúos.sendfilec                 C   s   t  ||¡S r   )rˆ   Ú_fastcopy_sendfile)r}   rà  rá  r   r   r   rñ  ‘	  s   z!TestZeroCopySendfile.zerocopy_func              
   C   s²   t  | j¡>}ttdƒ)}|  t¡ |  ||¡ W d   ƒ n1 s#w   Y  t 	||¡ W d   ƒ n1 s8w   Y  W d   ƒ n1 sGw   Y  |  
ttdd| j¡ d S )Nr(   Tró  )ÚioÚBytesIOrï  r1   r:  r•   r   rñ  rˆ   rã  r™   rM   rê   r   r   r   Útest_non_regular_file_src”	  s   ÿý€ÿz.TestZeroCopySendfile.test_non_regular_file_srcc              
   C   sÆ   t tdƒT}t ¡ 7}|  t¡ |  ||¡ W d   ƒ n1 s!w   Y  t ||¡ | 	d¡ |  
| ¡ | j¡ W d   ƒ n1 sDw   Y  W d   ƒ d S W d   ƒ d S 1 s\w   Y  d S )NrJ   r   )r1   r   r	  r
  r•   r   rñ  rˆ   rã  Úseekr™   rL   rï  rê   r   r   r   Útest_non_regular_file_dst	  s   
ÿ
ûÿ"ÿz.TestZeroCopySendfile.test_non_regular_file_dstc              
      sÂ   ‡ ‡fdd„}g ‰ t j‰tjjdd|d9 |  ¡ %\}}|  t¡}t 	||¡ W d   ƒ n1 s3w   Y  W d   ƒ n1 sBw   Y  W d   ƒ n1 sQw   Y  |  
|jjtj¡ d S )Nc                     s(   ˆ sˆ   d ¡ ˆ| i |¤ŽS ttjdƒ‚)Nr  )rS   r   r   ÚEBADFr   ©r/  Zorig_sendfiler   r   rY   §	  s   
zDTestZeroCopySendfile.test_exception_on_second_call.<locals>.sendfiler  T)re  r+  )r    rY   rî   rS  rT  rÞ  r•   r   rˆ   r  r™   rµ   r   r  )r}   rY   rf   rg   rº   r   r  r   Útest_exception_on_second_call¦	  s   
ÿÿ€ÿ€þz2TestZeroCopySendfile.test_exception_on_second_callc              	   C   s‚   t jjdtd$}|  ¡ \}}t ||¡ W d   ƒ n1 s w   Y  W d   ƒ n1 s/w   Y  |  tt	dd| j
¡ d S )Núos.fstatrü  Tró  )rî   rS  rT  r   rÞ  rˆ   r  r™   rM   r:  rï  ©r}   ré  rf   rg   r   r   r   Útest_cant_get_size¸	  s   ÿ€ÿz'TestZeroCopySendfile.test_cant_get_sizec              	   C   s’   t j ¡ }d|_t jjd|d$}|  ¡ \}}t ||¡ W d   ƒ n1 s(w   Y  W d   ƒ n1 s7w   Y  |  t	t
dd| j¡ d S )Ni  r  ©rd  Tró  )rî   rS  ÚMockÚst_sizerT  rÞ  rˆ   r  r™   rM   r:  rï  ©r}   rS  ré  rf   rg   r   r   r   Útest_small_chunksÂ	  s   
ÿ€ÿz&TestZeroCopySendfile.test_small_chunksc              	   C   s˜   t j ¡ }| jd |_t jjd|d$}|  ¡ \}}t ||¡ W d   ƒ n1 s+w   Y  W d   ƒ n1 s:w   Y  |  	t
tdd| j¡ d S )Ni  @r  r  Tró  )rî   rS  r  rÓ  r  rT  rÞ  rˆ   r  r™   rM   r:  rï  r  r   r   r   Útest_big_chunkÏ	  s   
ÿ€ÿz#TestZeroCopySendfile.test_big_chunkc                 C   sÄ   t jjdtdP}|  ttjtt¡ |j	d d }|  
|tj t¡¡ t t¡ ttddd |  tjtd ¡ |  ttjttd ¡ |j	d d }|  
|d	¡ W d   ƒ d S 1 s[w   Y  d S )
Nr  rü  r   r   s   helloTró  Ú3i  € )rî   rS  rT  rþ  r•   rˆ   r£  r   r:  rè  r™   r    r/   Úgetsizer   rc   r6   r{   )r}   ré  Ú	blocksizer   r   r   Útest_blocksize_argÜ	  s$   ÿÿ
ÿ"ñz'TestZeroCopySendfile.test_blocksize_argc              
   C   sø   zwt jj| jttjdƒd9}|  ¡ %\}}|  t	¡ t
 ||¡ W d   ƒ n1 s,w   Y  W d   ƒ n1 s;w   Y  W d   ƒ n1 sJw   Y  t j | j¡}t
 tt¡ W d   ƒ n1 sgw   Y  W dt
_d S W dt
_d S dt
_w )Nr  rü  T)rî   rS  rT  rý  r   r   ÚENOTSOCKrÞ  r•   r   rˆ   r  r£  r   r:  Ú_USE_CP_SENDFILEr  r   r   r   Útest_file2file_not_supportedî	  s(   
þÿ€ÿ€ý	ÿ
üz1TestZeroCopySendfile.test_file2file_not_supportedN)r   r€   r   rý  rñ  r  r  r  r  r  r  r  r   r   r   r   r   r  	  s    		
r  z
macOS onlyc                   @   s   e Zd ZdZdd„ ZdS )ÚTestZeroCopyMACOSzposix._fcopyfilec                 C   s   t  ||tj¡S r   )rˆ   Ú_fastcopy_fcopyfileÚposixÚ_COPYFILE_DATArê   r   r   r   rñ  
  rœ  zTestZeroCopyMACOS.zerocopy_funN)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e e 	e
j ¡ ¡d¡e eedƒd	¡d
d„ ƒƒZdd„ ZdS )ÚTestGetTerminalSizec                 C   s*   	 t  ¡ }|  |jd¡ |  |jd¡ d S )Nr   )rˆ   Úget_terminal_sizer1  ÚcolumnsÚlines)r}   rE   r   r   r   Útest_does_not_crash
  s   z'TestGetTerminalSize.test_does_not_crashc                 C   sž   	 t  ¡ }d|d< |d= t ¡ }W d   ƒ n1 sw   Y  |  |jd¡ t  ¡ }|d= d|d< t ¡ }W d   ƒ n1 sAw   Y  |  |jd¡ d S )NZ777ÚCOLUMNSÚLINESi	  Z888ix  )r   r^  rˆ   r&  r™   r'  r(  ©r}   r`  rE   r   r   r   Útest_os_environ_first
  s   

ý

ýz)TestGetTerminalSize.test_os_environ_firstc                 C   s`   t  ¡ }d|d< d|d< t ¡ }W d   ƒ n1 sw   Y  |  |jd¡ |  |jd¡ d S )Nrr  r*  Zyyyr+  r   )r   r^  rˆ   r&  r1  r'  r(  r,  r   r   r   Útest_bad_environ&
  s   

ýz$TestGetTerminalSize.test_bad_environz
not on ttyr&  zneed os.get_terminal_size()c              
   C   s¦   	 zt  ddg¡ ¡  ¡ }W n ttt jfy    |  d¡ Y nw t|d ƒt|d ƒf}t	 
¡ }|d= |d= t ¡ }W d   ƒ n1 sFw   Y  |  ||¡ d S )NZsttyrE   zstty invocation failedrm   r   r+  r*  )rr   rå  ré  ru   r³   r*  rç  r9  rv   r   r^  rˆ   r&  r™   )r}   rE   r  r`  rþ   r   r   r   Útest_stty_match.
  s   
ÿþ

ýz#TestGetTerminalSize.test_stty_matchc              
   C   s  t  ¡ }}|d= |d= t tdd ¡ tjdd}W d   ƒ n1 s#w   Y  |  |jd¡ |  |j	d¡ t
tjdd	d
%}t td|¡ tjdd}W d   ƒ n1 sWw   Y  W d   ƒ n1 sfw   Y  |  |jd¡ |  |j	d¡ W d   ƒ d S 1 s„w   Y  d S )Nr+  r*  Ú
__stdout__)é
   é   )Úfallbackr1  r2  r)   r*   r+   )é   é(   r4  r5  )r   r^  r   rg  rp   rˆ   r&  r™   r'  r(  r1   r    Údevnull)r}   r`  rE   rH   r   r   r   Útest_fallbackF
  s$   
ÿÿþ€ "ðz!TestGetTerminalSize.test_fallbackN)r   r€   r   r)  r-  r.  rî   rï   r    Úisattyrp   r0  rb   r^   r/  r7  r   r   r   r   r%  
  s    
ÿr%  c                   @   s   e Zd Z	 dd„ ZdS )ÚPublicAPITestsc                 C   sP   |   ttdƒ¡ g d¢}ttdƒstjdkr| d¡ |  ttjƒt|ƒ¡ d S )NÚ__all__)rã  r£  r[  rh  r  r“  rù   ry  r|   r   r¨  Ú	ExecErrorr   r   r   r   r   r   r
   r   r  r4  r,  r&  r   Ústatvfsr	  r.  )	r–   r^   rˆ   r    rV   rS   r™   r!  r:  )r}   Z
target_apir   r   r   Útest_module_all_attribute]
  s
   
z(PublicAPITests.test_module_all_attributeN)r   r€   r   r=  r   r   r   r   r9  Z
  s    r9  Ú__main__)F)Qrî   Zunittest.mockrˆ   r_   rp   rÅ   r    Zos.pathr   r%   r%  rr   r;   r=   rì  r	  r   r   r   r   r   r   r   r	   r
   r   r   r   r½  rÚ  r#  ÚImportErrorr  r   Ztest.supportr   Ztest.support.os_helperr   r   r:  r°  r±  rñ   r  r°  r±  ro   rô  rö  ró  rª   r   r'   r6   rI   rM   rT   rj   ZSUPPORTS_SENDFILErw   rx   ZTestCaser‚   rò   rU  r²  r-  rA  rv  rw  r³  rÒ  rÑ  rî  rð   r  r!  r%  r9  r   Úmainr   r   r   r   Ú<module>   s®   8ÿÿÿ

	    ]      gP <
 s\JdvN
ÿ