Your IP : 216.73.216.196


Current Path : /opt/alt/python310/lib64/python3.10/test/__pycache__/
Upload File :
Current File : //opt/alt/python310/lib64/python3.10/test/__pycache__/test_shutil.cpython-310.opt-2.pyc

o

0�i��@stddlZddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddl
Z
ddlZddlZddlmZmZmZmZmZmZmZmZmZmZmZmZddlZddlZzddlZWneyudZYnwddl m!Z!ddl"m#Z#ddl$m%Z%m&Z&ddl"m'Z'e%dZ(e%dZ)e%d	Z*ej+�,d
�Z-ej+�,d�Z.ej+dd�d
kZ/zddl0Z0ddl1Z1dZ2Wney�dZ2Ynwzddl3Z3Wney�dZ3Ynwej4j5de6d�d�Z7dd�Z8dd�Z9dFdd�Z:dd�Z;dFdd�Z<dd�Z=dd �Z>e>�Z?d!d"�Z@Gd#d$�d$�ZAGd%d&�d&eAejB�ZCGd'd(�d(eAejB�ZDGd)d*�d*eAejB�ZEGd+d,�d,eAejB�ZFGd-d.�d.eAejB�ZGGd/d0�d0eAejB�ZHGd1d2�d2eH�ZIGd3d4�d4eAejB�ZJGd5d6�d6ejB�ZKGd7d8�d8ejB�ZLGd9d:�d:eM�ZNe�Oe?d;�Gd<d=�d=eNejB��ZPe�Oe-d>�Gd?d@�d@eNejB��ZQGdAdB�dBejB�ZRGdCdD�dDejB�ZSeTdEk�r�e�U�dSdS)G�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)�warnings_helper�2Z_SRCZ_DST�darwinZsunos�ZaixTFzos.chdirzshouldn't call os.chdir()��side_effectcOstttdd�d��)NZEXDEV�zInvalid cross-device link)�OSError�getattr�errno��args�kwargs�r�7/opt/alt/python310/lib64/python3.10/test/test_shutil.py�_fake_rename:sr!cst����fdd��}|S)Ncs,ztj}tt_�|i|��W|t_S|t_w�N)�os�renamer!)rrZbuiltin_rename��funcrr �wrap?s
zmock_rename.<locals>.wrap)�	functools�wraps)r&r'rr%r �mock_rename>sr*cCsn	t|t�rtjj|�}|rdnd}|rdnd}t|||d��}|�|�Wd�dS1s0wYdS)N�wb�w�utf-8��encoding)�
isinstance�tupler#�path�join�open�write)r2Zcontent�binary�moder/�fprrr �
write_fileIs
"�r9cCsv	dd�}t|d�}d�dd�t|�D��}t|d��}|||�D]}|�|�q!Wd�dS1s4wYdS)Ncss2�||kr|V||8}||ks|r|VdSdSr"r)�total�steprrr �chunksYs��
�zwrite_test_file.<locals>.chunksi �cSsg|]
}t�tj����qSr)�randomZchoice�stringZ
ascii_letters�encode)�.0�irrr �
<listcomp>bs�z#write_test_file.<locals>.<listcomp>r+)�minr3�ranger4r5)r2�sizer<�bufsize�chunk�fZcsizerrr �write_test_fileWs

��"�rJcCsj	t|t�rtjj|�}|rdnd}|rdnd}t|||d��}|��Wd�S1s.wYdS)N�rb�rr-r.)r0r1r#r2r3r4�read)r2r6r7r/r8rrr �	read_fileis
$�rNcCs|g}tt�|��D]2}tj�||�}tj�|�r6tj�|�s6|�|d�t|�D]}|�|d|�q)q	|�|�q	|S)N�/)	�sortedr#�listdirr2r3�isdir�islink�append�rlistdir)r2�res�name�p�nrrr rUws�rUc
Cs�ttd�sdSd}d}z�tjdt��dd��}|j}|�d�Wd�n1s)wYt|d���}tjdt��dd��f}|j}|��}|��}z
t�	||dd�Wn+t
yYWd�Wd�W|durrt�|�|dur}t�|�dSdSw	Wd�Wd�W|dur�t�|�|dur�t�|�d	Sd	S1s�wYWd�n1s�wYW|dur�t�|�|dur�t�|�dSdS|dur�t�|�|dur�t�|�ww)
N�sendfileFr+��dir�deletes
0123456789rKr�T)
�hasattrr#�tempfile�NamedTemporaryFile�getcwdrWr5r4�filenorZrr�unlink)�srcname�dstnamerI�src�dstZinfdZoutfdrrr �supports_file2file_sendfile�s^
���
����
����
��
�ricCsFtr!tjdkr!t�dtj�}|�d�d��d}t|d�dkSdS)	Ni���z/usr/bin/dump -o %s�
�����i T)�AIX�sys�maxsize�
subprocessZ	getoutput�
executable�split�int)ZhdrsZmaxdatarrr �
_maxdataOK�s
ruc@seZdZddd�ZdS)�BaseTestNcCs&	tj|t��d�}|�tj|�|S)N)�prefixr\)r`�mkdtempr#rb�
addCleanupr�rmtree)�selfrw�drrr rx�szBaseTest.mkdtempr")�__name__�
__module__�__qualname__rxrrrr rv�srvc@s�eZdZdd�Zejdd��Zejdd��Ze�	e
d�dd	��Ze�	e
d�d
d��Zdd
�Z
e�ejdd�dkd�e�eed�oFe��dkd�dd���Zdd�Zdd�Zdd�Zdd�Zejdd ��Ze�	e
d�d!d"��ZdS)#�
TestRmTreecCsX|��}tj�|d�}t�|�ttj�|d�d�t�|�}|�|t�t	�
|�dS)NZkillmeZsomefile�foo)rxr#r2r3�mkdirr9�fsencode�assertIsInstance�bytes�shutilrz)r{�tmpZvictimrrr �test_rmtree_works_on_bytes�s

z%TestRmTree.test_rmtree_works_on_bytescs�|��}tj�|d�}t�|�tj�|d�}t�||�|�ttj	|�|�
tj�|��|�
tj�|��g��fdd�}tj	||d�|�
t��d�|��ddtjj�|�
�dd|�|��dddt�dS)	Nr\�linkc���|�dSr"�rT�r��errorsrr �onerror��z8TestRmTree.test_rmtree_fails_on_symlink.<locals>.onerror�r�rlrr^)rxr#r2r3r��symlink�assertRaisesrr�rz�
assertTrue�exists�lexists�assertEqual�len�assertIsrSr��r{r�Zdir_r�r�rr�r �test_rmtree_fails_on_symlink�s
z'TestRmTree.test_rmtree_fails_on_symlinkc
Cs�|��}tj�|d�}tj�|d�}tj�|d�}|||fD]}t�|�qtj�|d�}t|d�tj�|d�}t�||�tj�|d�}t�||�tj�|d�}	t�||	�t�|�|�	tj�
|��|�tj�
|��|�tj�
|��dS�	N�dir1�dir2�dir3�file1r��link1�link2�link3)rxr#r2r3r�r9r�r�rz�assertFalser�r��
r{r�r�r�r�r|r�r�r�r�rrr �test_rmtree_works_on_symlinks��$

z(TestRmTree.test_rmtree_works_on_symlinkszonly relevant on Windowscs�|��}tj�|d�}t�|�tj�|d�}t�||�|�tj	|�|�
ttj
|�|�tj�|��|�tj�|��g��fdd�}tj
||d�|�t��d�|��ddtjj�|��dd|�|��dddt�dS)	Nr\r�cr�r"r�r�r�rr r��r�z:TestRmTree.test_rmtree_fails_on_junctions.<locals>.onerrorr�rlrr^)rxr#r2r3r��_winapi�CreateJunctionryrrdr�rr�rzr�r�r�r�r�r�rSr�r�rr�r �test_rmtree_fails_on_junctions�s 
z)TestRmTree.test_rmtree_fails_on_junctionsc
Cs�|��}tj�|d�}tj�|d�}tj�|d�}|||fD]}t�|�qtj�|d�}t|d�tj�|d�}t�||�tj�|d�}t�||�tj�|d�}	t�||	�t�	|�|�
tj�|��|�tj�|��|�tj�|��dSr�)
rxr#r2r3r�r9r�r�r�rzr�r�r�r�rrr �test_rmtree_works_on_junctionsr�z)TestRmTree.test_rmtree_works_on_junctionscs�tj|��d�}|�ttj|�tj|dd�|��}t|dfd�tj	�
|d�}|�t��
}t�|�Wd�n1s>wY|�|j
j|�|�tj	�|��tj|dd�|�tj	�|��g��fdd�}tj||d�|�t��d	�|��d
d
tj�|��d
d|�|��d
d	dt�|��d
d	dj|�|��dd
tj�|��dd|�|��dd	dt�|��dd	dj|�dS)N�r\T��
ignore_errorsZtstfile�cr�r"r�r�r�rr r�,r�z.TestRmTree.test_rmtree_errors.<locals>.onerrorr�r^rrl)r`�mktemprxr��FileNotFoundErrorr�rzr9r#r2r3�NotADirectoryErrorr��	exception�filenamer�r�r�r��scandirr��rmdir)r{r��tmpdir�cmr�rr�r �test_rmtree_errorss2�zTestRmTree.test_rmtree_errorsN��cygwinz2This test can't be run on Cygwin (issue #1071513).�geteuidrz9This test can't be run reliably as root (issue #1076467).cCs
d|_t�t�|�tjt�tj�td�|_	tj�td�|_
t�|j	�t�|j
�t�
t�j}t�
|j	�j}t�
|j
�j}t
jt
jB}t�|j	|�t�|j
|�t�t|�|�tjt|�|�tj|j	|�|�tj|j
|�tjt|jd�|�|jdd�dS)Nr�a�br�rz1Expected call to onerror function did not happen.)�
errorStater#r�rryr�rzr2r3�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_modeZold_child_file_modeZold_child_dir_modeZnew_moderrr �
test_on_error:s*

�zTestRmTree.test_on_errorcCs�|jdkrB|tjur|�||j�n|tjur|�||j�n|�|tj�|�	|t
|jg�|�t|dt
��|jd7_dS|�|tj�|�|t
�|�t|dt
��d|_dS)Nr^rrlr)r�r#rdr�r�r�r�r�rQ�assertInrr��
issubclassr)r{r&�arg�excrrr r�Ys



z TestRmTree.check_args_to_onerrorcsPz#tj��fdd�}|t_t�t�ttdfd�t�t�W�t_dS�t_w)Ncs|tkrt���|�Sr")rr)�fnrr�Z
orig_lstatrr �raiserwszFTestRmTree.test_rmtree_does_not_choke_on_failing_lstat.<locals>.raiserr�)r#�lstatr�rr9r�rz)r{r�rr�r �+test_rmtree_does_not_choke_on_failing_lstatts
z6TestRmTree.test_rmtree_does_not_choke_on_failing_lstatcs�tjtjtjtjhtjkotjtjvotjtjv}|r_|�	t
j�|�	t
jj
�|��}tj�|d�}t�|�z"t
j}Gdd�dt���fdd�}|t
_|��t
j|�W|t
_dS|t
_w|�t
j�|�t
jj
�dS)Nr�c@seZdZdS)zHTestRmTree.test_rmtree_uses_safe_fd_version_if_available.<locals>.CalledN)r}r~rrrrr �Called�sr�cs��r"rr�r�rr �_raiser��zITestRmTree.test_rmtree_uses_safe_fd_version_if_available.<locals>._raiser)r#r4r�rdr��supports_dir_fdrQ�supports_fd�supports_follow_symlinksr�r��_use_fd_functionsrzZavoids_symlink_attacksrxr2r3r�Z_rmtree_safe_fd�	Exceptionr�r�)r{r��tmp_dirr|Zreal_rmtreer�rr�r �-test_rmtree_uses_safe_fd_version_if_available�s,�
�
�
z8TestRmTree.test_rmtree_uses_safe_fd_version_if_availablecCs<tj|��d�\}}t�|�|�ttj|�t�	|�dS�Nr�)
r`Zmkstemprxr#�closer�r�r�rz�remove)r{Zhandler2rrr �test_rmtree_dont_delete_file�s
z'TestRmTree.test_rmtree_dont_delete_filec
Cs�t�t�z2tj�td�}tj�td�}t�|�t�||�|�ttj	|�tj	|dd�Wtj	tdd�dStj	tdd�w)N�cheese�shopTr�)
r#r�rr2r3r�r�rr�rz�r{rgrhrrr �test_rmtree_on_symlink�s

"z!TestRmTree.test_rmtree_on_symlinkc
Cs�t�t�z>tj�td�}tj�td�}t�|�ttj�|d�d���t�||�|�	t
tj|�tj|dd�Wtjtdd�dStjtdd�w)Nr�r�Zspamr+Tr�)
r#r�rr2r3r4r�r�r�r�rr�rzr�rrr �test_rmtree_on_junction�s

"z"TestRmTree.test_rmtree_on_junction)r}r~rr�r�skip_unless_symlinkr�r��unittest�
skipUnlessr�r�r�r��skipIfro�platformr_r#r�r�r�r�r�r�r�r�rrrr r��s4	





!��


r�c@s�eZdZdd�Zdd�Zejdd��Zdd�Zd	d
�Z	dd�Z
ej�
d
�dd��Zdd�Ze�eed�d�eje�ejdkd�dd����Zdd�Zejdd��Zejdd��Zdd�Zd d!�Zd"S)#�TestCopyTreec	Cs|��}tj�|��d�}|�tj|�|�tjtj�|��t|dfd�t�	tj�|d��t|ddfd�t�
||�|�tj�tj�|d���|�tj�
tj�|d���|�tj�tj�|dd���t|df�}|�|d�t|ddf�}|�|d�dS)N�destination�test.txt�123�test_dir�456)rxr#r2r3ryr�rz�dirnamer9r��copytreer��isfilerRrNr��r{�src_dir�dst_dir�actualrrr �test_copytree_simple�s"�z!TestCopyTree.test_copytree_simplec	CsZ|��}|��}|�tj|�|�tj|�t|dfd�t�tj�|d��t�tj�|d��t|ddfd�t|ddfd�tj	||dd�|�
tj�tj�|d���|�
tj�tj�|d���|�
tj�tj�|dd���t
|df�}|�|d�t
|ddf�}|�|d�|�t��tj	||d	d�Wd�dS1s�wYdS)
Nznonexisting.txtr�Zexisting_dirzexisting.txtzwill be replacedzhas been replacedT)Z
dirs_exist_okF)rxryr�rzr9r#r�r2r3r�r�r�rRrNr�r��FileExistsErrorr�rrr �test_copytree_dirs_exist_ok�s,�"�z(TestCopyTree.test_copytree_dirs_exist_okc
	Cs�|��}tj�|d�}tj�|d�}tj�|d�}t�|�t�|�t|dfd�tj�|d�}tj�|d�}t�tj�|d�|�ttd�rRt�|t	j
t	jB�ttd	�rctt	d
�rct�|t	j
�t�|�}tj||dd�|�tj�tj�|dd���t�tj�|dd��}tjd
kr�|�d�r�|dd�}|�|tj�|d��t�|�}	ttd�r�|�|	j|j�ttd	�r�|�|	j|j�dSdS)Nrgrh�subzfile.txtr�r�zsub/link�lchmod�lchflags�	UF_NODUMPT�Zsymlinks�ntz\\?\�)rxr#r2r3r�r9r�r_r�r��S_IRWXU�S_IRWXOr�r�r�r�r�r�rS�readlinkrW�
startswithr�r��st_flags)
r{r�r�r�Zsub_dir�src_link�dst_link�src_statr��dst_statrrr �test_copytree_symlinks�s:

�




�z#TestCopyTree.test_copytree_symlinkscCs\tjj}tjj}|��}�z||��d�}t|dfd�t|dfd�t�||d��t|ddfd�t�||d��t|ddfd�t�||dd��t�||dd	��t|dddfd�t|dd	d
fd�z3t�dd�}tj	|||d�|�
|||d���|�|||d���|�|||d���Wt�|�nt�|�wz5t�dd
�}tj	|||d�|�|||d���|�|||dd	���|�|||dd���Wt�|�nt�|�wz*dd�}tj	|||d�|�|||dd	d
���|�|||dd���Wt�|�nt�|�wWt�|�t�tj�
|��dSt�|�t�tj�
|��w)Nr�r�r�ztest.tmpr�r�Z	test_dir2�subdirZsubdir2ztest.pyz*.tmp��ignorezsubdir*cSsfg}|D],}tj�||�}tj�|�r!|��ddkr!|�|�qtj�|�ddvr0|�|�q|S)Nrkr
z.py)r#r2r3rRrsrT�splitext)rg�namesrVrWr2rrr �_filter6s
�z8TestCopyTree.test_copytree_with_exclude.<locals>._filter)r#r2r3r�rxr9r�r��ignore_patternsr�r�r�rzr�)r{r3r�r�r��patternsrrrr �test_copytree_with_excludesR�

�z'TestCopyTree.test_copytree_with_excludecsVtjj}tjj}���}||d�}t�||��t�||d��t�tj�|dd��t|dddfd�g���fdd�}|���d�}tj|||d	���	|||ddd���|���d�}tjt
�|�||d	���	|||ddd���|���d�}tt�
|��d
}��|tj�tj|||d	���	|||ddd�����t��d�dS)N�sourcer�r
r�r�csT��|���|t���|t���t|�tt|���|D]}��|t�qgSr")rTr��str�listr�r��set)rgrrW�Zinvokationsr{rr �_ignore]s
z?TestCopyTree.test_copytree_arg_types_of_ignore.<locals>._ignorer�rr�	)r#r2r3r�rxr�r9r�r�r��pathlib�Pathrr�r��DirEntryr�r�)r{r3r�r�r�rr�Z
src_dir_entryrrr �!test_copytree_arg_types_of_ignoreOs8
	���z.TestCopyTree.test_copytree_arg_types_of_ignorec	Csx|��}tj�|d�}t�|�tj�|d�}|�tj|�t�|d�t	|dfd�t�tj�|d�d�t	|dfd�t�tj�|d�d�t
j|d	�}|�tj|�t�|d�t�||�|�
t�|�jt�|�j�|�
t�tj�|d��jt�tj�|d��j�|�
t�tj�|d��jt�tj�|d��j�tj�|tj�|�d
�}|�
t�|�jt�|�j�dS)Nrr�i�zpermissive.txtr�zrestrictive.txtr�i�r�rl)rxr#r2r3r�ryr�rzr�r9r`rr�r�r�r�rs)r{r�r�r�Zrestrictive_subdirZrestrictive_subdir_dstrrr �!test_copytree_retains_permissionsys6
���
�z.TestCopyTree.test_copytree_retains_permissionszos.chmodcCs�|��}tj�|��d�}|�tj|�|�tjtj�|��td�|_	|�
tj��t�||�Wd�dS1s<wYdS)Nr�zka-boom)
rxr#r2r3ryr�rzr��PermissionErrorrr�rr�)r{Z
mock_patchr�r�rrr �test_copytree_winerror�s
"�z#TestCopyTree.test_copytree_winerrorcs�����fdd�}g�����tj���d��ttj��d�ddd��}|��Wd�n1s2wYtj	��|d���
t��d	�dS)
NcsR��d���|t���|t���|tj��d����|tj��d��dS�Nr�)rTr�rr�r#r2r3)r�r��rh�flagr{rgrr �custom_cpfun�s

zETestCopyTree.test_copytree_custom_copy_function.<locals>.custom_cpfunr�r�r,r-r.�Z
copy_functionrl)rxr`r�r4r#r2r3r�r�r�r�r�)r{r'rIrr%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
CsPt�t�z�tj�td�}t�|�tj�|d�}zt�|�Wnty9}z
|�d|�WYd}~nd}~wwzt�	tt
�Wn/tjyq}z"|jd}|�
t|�d�|d\}}}|�
d||�WYd}~nd}~ww|�d�Wtjtdd	�tjt
dd	�dSWtjtdd	�tjt
dd	�dStjtdd	�tjt
dd	�w)
Nr
Zmypipe�os.mkfifo(): %srrlz`%s` is a named pipez$shutil.Error should have been raisedTr�)r#r�rr2r3r*r"�skipTestr�r��TESTFN2rrr�r��failrz)r{r
�pipe�er�rgrhZ	error_msgrrr �test_copytree_named_pipe�s8

��
����z%TestCopyTree.test_copytree_named_pipecs�|��}tj�|��d�}t|dfd�t�tj�|d��t|ddfd�g��fdd�}tj|||d�|�t	��d	�dS)
Nr�r�r�r�r�c���||f�dSr"r��rgrh�Zcopiedrr �_copy��z6TestCopyTree.test_copytree_special_func.<locals>._copyr(r^)
rxr#r2r3r9r�r�r�r�r�)r{r�r�r8rr7r �test_copytree_special_func�sz'TestCopyTree.test_copytree_special_funcc	Cs|��}tj�|d�}t|d�tj�|d�}t�|�||fD]}t�dtj�|d��t�|tj�|d��q tj�|��d�}|�tt	j
||�tj�|��d�}t	j
||d	d
�t�|�D]\}}}|�d|�|�
d|�qatj�|��d�}t	j
||d	d�|�
dt�|��dS)
Nr��abc�dir_aZ
IDONTEXISTZbrokenZvalidr��destination2T)Zignore_dangling_symlinksZdestination3r)rxr#r2r3r9r�r�r�rr�r��walk�assertNotInr�rQ)	r{r�Z
valid_filer<r|r��root�dirs�filesrrr �test_copytree_dangling_symlinks�s$

z,TestCopyTree.test_copytree_dangling_symlinksc	Cs.|��}tj�|��d�}t�tj�|d��ttj�|dd�d��Wd�n1s-wYtjtj�|d�tj�|d�dd�tj||dd	�|�	tj�
tj�|d���|�dt�tj�|d���tj�|��d
�}tj||dd	�|�
tj�
tj�|d���|�dt�tj�|d���dS)Nr�Zreal_dirr�r+Zlink_to_dirT)Ztarget_is_directoryFrr=)rxr#r2r3r�r4r�r�r�r�rSr�rQr�)r{r�r�rrr �test_copytree_symlink_dir�s"�� z&TestCopyTree.test_copytree_symlink_dircCs\|��}|d}|�tj|d�tj�|d�}t|d�t�||�}|�	dgt�
|��dS)N�destTr�)rxryr�rzr#r2r3r9r�r�rQ)r{r�r�rg�rvrrr �test_copytree_return_values
z'TestCopyTree.test_copytree_return_valuecCs�|��}|jtj|dd�tj�|dd�}tj�|dd�}t�|�tj�|d�}t|d�t�	||�}|�
dgt�|��dS)NTr��tZpgZ
somevendorz1.0Zpol)rxryr�rzr#r2r3�makedirsr9r�r�rQ)r{�base_dirr�r�rgrFrrr �test_copytree_subdirectorys

z'TestCopyTree.test_copytree_subdirectoryN)r}r~rr�r�rr�rrr r!r��mock�patchr#r)r�r_r#r�ror�r4r:rCrDrGrKrrrr r��s0
A*


�


r�c@s�eZdZejdd��Ze�ee	d�d�ejdd���Z
e�ee	d�d�ejdd	���Zejd
d��Z
e�ee	d�oBeed
�oBeed�d�dd��Zejdd��Zejeje�ee	d�o`e	��dkd�dd����Zdd�Zdd�Zejdd��Ze�ee	d�d �d!d"��Zejd#d$��Zejd%d&��Zd'd(�Zd)d*�Zd+d,�Zd-d.�Zejd/d0��Ze�ee	d1�d2�d3d4��Zejd5d6��Z e�ee	d7�d8�e�e!j"d9kd:�d;d<���Z#d=d>�Z$d?d@�Z%e�e&p�e'p�e(dA�e�e)dB�dCdD���Z*dEdF�Z+dGS)H�TestCopycCs�|��}tj�|d�}tj�|d�}tj�|d�}tj�|d�}t|d�t|d�t�||�t�||�t�|tjtj	B�t�|tj
�|�t�|�jt�|�j�t
�||�|�t�|�jt�|�j�tjdkr�t�|tj
�t
�||�|�t�|�jt�|�j�t�|tj
�t
�||�|�t�|�jt�|�j�t�|tj
�t
�||�|�t�|�jt�|�j�dSdS)Nr��bar�baz�quuxr)rxr#r2r3r9r�r�r�r�S_IRWXGr�assertNotEqualr�r��copymoder�rW�r{r�rgrhrr	rrr �test_copymode_follow_symlinks&s2


 �z&TestCopy.test_copymode_follow_symlinksr�zrequires os.lchmodcCsp|��}tj�|d�}tj�|d�}tj�|d�}tj�|d�}t|d�t|d�t�||�t�||�t�|tjtj	B�t�|tj�t�
|tjtj	B�t�
|tj�tj
||dd�|�t�|�jt�|�j�|�t�|�jt�|�j�t�
|tj�tj
||dd�|�t�|�jt�|�j�t�
|tj�tj
||dd�|�t�|�jt�|�j�dS�Nr�rOrPrQF��follow_symlinks)rxr#r2r3r9r�r�r�rrRr�rr�rTr�r�r�rSrUrrr � test_copymode_symlink_to_symlinkFs0


� z)TestCopy.test_copymode_symlink_to_symlinkz requires os.lchmod to be missingcCs�|��}tj�|d�}tj�|d�}tj�|d�}tj�|d�}t|d�t|d�t�||�t�||�tj||dd�dSrW)rxr#r2r3r9r�r�rTrUrrr �*test_copymode_symlink_to_symlink_wo_lchmodds

z3TestCopy.test_copymode_symlink_to_symlink_wo_lchmodc
Cs�|��}tj�|d�}tj�|d�}tj�|d�}tj�|d�}t|d�t�|�}t�||j|jdf�t|d�|�	t�|�jt�|�j�t�
||�t�
||�ttd�rat�|tj
�ttd�rrttd�rrt�|tj�t�|�}ttd�r�tj||d	d
�|�	|jt�|�j�tj||dd
�t�|�}tjtjvr�dD]}	|�t||	�t||	�d
�q�ttd�r�|�|j|j�ttd�r�t|d�r�|�|j|j�tj||dd
�|�tt�|�jt�|�j�dk�dS)Nr�rOrP�quxgE@r�r�r�TrXF��st_atime�st_mtimerlrg�������?)rxr#r2r3r9r��utimer^r_rSr�r_r�rr�r�r�r��copystatr�r��assertLessEqualrr�rr��abs)
r{r�rgrhrr	r
�
src_link_statZ
dst_link_stat�attrrrr �test_copystat_symlinkstsJ


�




�

�zTestCopy.test_copystat_symlinks�chflags�
EOPNOTSUPP�ENOTSUPz)requires os.chflags, EOPNOTSUPP & ENOTSUPcCs�|��}tj�|d�}tj�|d�}t|d�t|d�dd�}tj}z,tjtjfD]
}||�t_t	�
||�q*|tjtj�t_|�tt	j
||�W|t_dS|t_w)Nr��file2�xxxcst��dd���fdd�
}|S)NTrXcs
��_��r")r)r2�flagsrY��errZexrr �_chflags_raiser�szlTestCopy.test_copystat_handles_harmless_chflags_errors.<locals>.make_chflags_raiser.<locals>._chflags_raiser�r)rnrorrmr �make_chflags_raiser�szSTestCopy.test_copystat_handles_harmless_chflags_errors.<locals>.make_chflags_raiser)
rxr#r2r3r9rgrrhrir�rar�r)r{r�r�rjrqZold_chflagsrnrrr �-test_copystat_handles_harmless_chflags_errors�s


z6TestCopy.test_copystat_handles_harmless_chflags_errorscs |��}tj�|d��t�d�tj�|d�}t|d�t��|�t��dd�t��dd�t��|�|�t	t�
���t	t�
|���|�t��d�t�|d��t�|�t|d�t
tjd����fdd	�}ztj�|t_t��|�|�dt�
|��W�t_n�t_wd
d���fdd
�
}ztj
�|t_
t��|�W�t_
n�t_
wtj�|d��tj�|d�}t���t||�t��dd�t�|dd�t�|d�tj�|d�}tj�|d�}t||�t||�t��|�t�||�|�t�|d�d�|�t�|d�d�dS)Nr�rO�user.foo�42zuser.bar�43�EPERMcs$|dkr���|||fi|��dS)Nrsr)�fnamere�valr)�
orig_setxattr�os_errorrr �_raise_on_user_foo�sz3TestCopy.test_copyxattr.<locals>._raise_on_user_fooTrXcs |�kr
ttjd���||d�S)NzOperation not supportedrX)rrri)rwrY)�orig_listxattrrgrr �
_raise_on_src�sz.TestCopy.test_copyxattr.<locals>._raise_on_srcZthe_originalZthe_original_rozuser.the_valuesfiddlyi$Zthe_copyZthe_copy_ro)rxr#r2r3r9r��
_copyxattr�setxattrr�rP�	listxattr�getxattrr�rrrvr�r�ra)r{r�rhr{r}ZsrcroZdstror)r|ryrzrgr �test_copyxattr�sZ

 

�





zTestCopy.test_copyxattrr�r�root privileges requiredcCs�|��}tj�|d�}tj�|d�}t|d�t�||�t�|dd�tj|dddd�tj�|d�}tj�|d	�}t|d�t�||�tj||dd�|�	tj
|ddd�d�|�ttj
|d�tj||dd�|�	t�
|d�d�dS)
Nr�rPztrusted.foortruFrXrOr\)
rxr#r2r3r9r�rr�r~r�r�r�r)r{r�rgrrhr	rrr �test_copyxattr_symlinks�s 

z TestCopy.test_copyxattr_symlinkscCsPd}|��}t||fd�tj�||�}|��}|||�tj�||�}||fS)Nr�rk)rxr9r#r2r3)r{�methodrwr�r��tmpdir2rjrrr �
_copy_files
zTestCopy._copy_filecCsB|�tj�\}}|�tj�|��|�t�|�j	t�|�j	�dSr")
r�r��copyr�r#r2r�r�r�r�)r{r�rjrrr �	test_copy!s zTestCopy.test_copycCs|��}tj�|d�}tj�|d�}tj�|d�}t|d�t�||�ttd�r3t�|tj	tj
B�tj||dd�|�
tj�|��|�t|�t|��t�|�tj||dd�|�tj�|��|�t�|�t�|��ttd�r�|�t�|�jt�|�j�dSdS)Nr�rOrPr�TrXF)rxr#r2r3r9r�r_r�r�rrr�r�r�rSr�rNr�r�rr�r�)r{r�rgrhrrrr �test_copy_symlinks's(




��zTestCopy.test_copy_symlinksr`zrequires os.utimecCs�|�tj�\}}|�tj�|��t�|�}t�|�}|�|j	|j	�dD]}|�
t||�t||�d�q%ttd�rNt|d�rP|�t|d�t|d��dSdSdS)Nr]rlrgr)
r�r��copy2r�r#r2r�r�r�r�rbrr_)r{r�rjZ
file1_statZ
file2_statrerrr �
test_copy2@s

���zTestCopy.test_copy2c	Cs�|��}tj�|d�}tj�|d�}tj�|d�}t|d�t�||�ttd�r3t�|tj	tj
B�ttd�rDttd�rDt�|tj�t�|�}t�
|�}tj||dd�|�tj�|��|�t|�t|��t�|�tj||d	d�|�tj�|��|�t�|�t�|��t�
|�}tjtjvr�d
D]}|�t||�t||�d�q�ttd�r�|�|j|j�|�|j|j�ttd�r�t|d�r�|�|j|j�dSdSdS)
Nr�rOrPr�r�r�TrXFr]rlr)rxr#r2r3r9r�r_r�r�rrr�r�r�r�r�r�rSr�rNr�r�rr`r�rbrr�rSr)	r{r�rgrhrr
rdrrerrr �test_copy2_symlinksQs>





�
�zTestCopy.test_copy2_symlinkscCsr|��}tj�|d�}tj�|d�}t|d�t�|dd�t�||�|�t�	|d�t�	|d��t�
|�dS)Nr�rOrsrt)rxr#r2r3r9rr�r�r�r�r�)r{r�rgrhrrr �test_copy2_xattrts


�zTestCopy.test_copy2_xattrcCs�tjtjfD];}|��}|��}tj�|d�}t|d�|||�}|�|tj�|d��||tj�|d��}|�|tj�|d��qdS)Nr�rO)	r�r�r�rxr#r2r3r9r�)r{r�r�r�rgrFrrr �test_copy_return_value�s

�zTestCopy.test_copy_return_valuecC�|�tj�dSr")�_test_copy_dirr�r��r{rrr �
test_copy_dir��zTestCopy.test_copy_dircCr�r")r�r�r�r�rrr �test_copy2_dir�r�zTestCopy.test_copy2_dircCsx|��}tj�|d�}|��}tj�|d�}t|d�tjdkr#t}nt}|�	||||�|�	||||�|||�dS�Nr��does_not_exist/�win32)
rxr#r2r3r9ror�r"�IsADirectoryErrorr�)r{Z	copy_funcr��src_filer�rhrnrrr r��s

zTestCopy._test_copy_dircCs�|��}tj�|d�}tj�|d�}tj�|d�}tj�|d�}t|d�t�||�tj||dd�|�tj�	|��|�
t�|�t�|��t�||�|�tj�	|��dS)Nrgrhr	r�r�FrX)
rxr#r2r3r9r�r��copyfiler�rSr�rr�)r{r�rgrhr	r�rrr �test_copyfile_symlinks�s
zTestCopy.test_copyfile_symlinksr�zrequires os.linkc
Cs$t�t�tj�td�}tj�td�}zvt|ddd��
}|�d�Wd�n1s+wYzt�||�WntyQ}z
|�	d|�WYd}~nd}~ww|�
tjtj
||�t|ddd��}|�|��d�Wd�n1svwYt�|�Wtjtd	d
�dStjtd	d
�w)Nr�r�r,r-r.�cheddarz
os.link(): %srLTr�)r#r�rr2r3r4r5r�r"r/r�r�rr�r�rMr�rz)r{rgrhrIr3rrr �'test_dont_copy_file_onto_link_to_itself�s&
����"z0TestCopy.test_dont_copy_file_onto_link_to_itselfc
Cs�t�t�tj�td�}tj�td�}zZt|ddd��
}|�d�Wd�n1s+wYt�d|�|�t	j
t	j||�t|ddd��}|�|�
�d�Wd�n1sZwYt�|�Wt	jtdd	�dSt	jtdd	�w)
Nr�r�r,r-r.r�rLTr�)r#r�rr2r3r4r5r�r�r�rr�r�rMr�rz)r{rgrhrIrrr �*test_dont_copy_file_onto_symlink_to_itself�s
��"z3TestCopy.test_dont_copy_file_onto_symlink_to_itselfr*r+r,r-c
Cs�zt�t�Wnty }z
|�d|�WYd}~nd}~wwz|�tjtjtt	�|�tjtjt
t�Wt�t�dSt�t�w)Nr.)r#r*rr"r/r�r��SpecialFileErrorr�r0�__file__r�)r{r3rrr �test_copyfile_named_pipe�s����z!TestCopy.test_copyfile_named_pipecCsl|��}|��}tj�|d�}tj�|d�}t|d�t�||�}|�tj�|��|�	t
|�t
|��dS)NrOr�)rxr#r2r3r9r�r�r�r�r�rN)r{r�r��dst_filer�rFrrr �test_copyfile_return_value�s
z#TestCopy.test_copyfile_return_valuecCsX|��}tj�|d�}t|d�|�ttj||�|�t	tj||�|�
t|�d�dSr$)rxr#r2r3r9r�rr�r�rr�rN)r{r�r�rrr �test_copyfile_same_file�s
z TestCopy.test_copyfile_same_filezMOn MACOS, Solaris and Windows the errors are not confusing (though different)zNot valid on AIX, see gh-92670cCsD|��}tj�|d�}tj�|d�}t|d�|�ttj||�dS)Nr�r�)	rxr#r2r3r9r�r�r�r�)r{r�r�rhrrr �test_copyfile_nonexistent_dirs

z&TestCopy.test_copyfile_nonexistent_dircCs�|��}tj�|d�}|��}tj�|d�}t|d�tjdkr#t}nt}|�	|t
j||�|�	|t
j||�|�	|t
j||�dSr�)rxr#r2r3r9ror�r"r�r�r�r�)r{r�r�r�rhrnrrr �test_copyfile_copy_dirs

zTestCopy.test_copyfile_copy_dirN),r}r~rrr�rVr�r�r_r#rZr�r[rfrrrZskip_unless_xattrr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�ror�r�r�r��MACOS�SOLARISr�rnr�r�rrrr rN"sr

(��

?�



"



�

rNc@s|eZdZe��dd��Zdd�Zd9dd�Ze��e�	e
�d�d	�d
d���Ze��dd
��Z
e��e�	e
�d�d�dd���Ze��e�	e
�d�d�dd���Zdd�Ze��dd��Ze��e�	ed�dd���Zdd�Zdd �Ze��d!d"��Zd#d$�Zd%d&�Zd'd(�Zd)d*�Zd+d,�Ze��d-d.��Ze��d/d0��Ze��e� e!o�e"�d1�d2d3���Z#e��d4d5��Z$d6d7�Z%d8S):�TestArchivesc		Cs�|�d�\}}|��}t�|�tj�|�}tj�tj�|�d�}t�	|��'t
�tj�|�}t|d|d�}Wd�n1sAwYWd�n1sPwY|�
||d�|�tj�|��|�t�|��t�|d��}|�|��gd��Wd�n1s�wYt�	|��!t
�t|d|d�}Wd�n1s�wYWd�n1s�wY|�
||d	�|�tj�|��|�t�|��t�|d
��}|�|��gd��Wd�dS1s�wYdS)Nr��archive�gztar�.�.tar.gzzr:gz)r�z./subz./sub2z./file1z./file2z./sub/file3�tar�.tarrL)�
_create_filesrxr#r�r2r�r3�basenamer�
change_cwd�no_chdir�abspathrr�r�r��tarfileZ
is_tarfiler4�assertCountEqual�getnames)	r{�root_dirrJr��work_dir�
rel_base_name�	base_name�tarballZtfrrr �test_make_tarball*s@
��
����
�"�zTestArchives.test_make_tarballcCsFt�|��}|��}|��t|�Wd�S1swYdSr")r�r4r��sortr1)r{r2r�rrrr �_tarinfoNs
$�zTestArchives._tarinfo�distcCs�|��}tj�||�}tj|dd�t|dfd�t|dfd�t�tj�|d��t|ddfd�t�tj�|d��|rEt|d	fd�||fS)
NT)�exist_okr�rkrjr�Zfile3Zsub2�outer)rxr#r2r3rIr9r�)r{rJr�r�rrr r�TszTestArchives._create_filesr�zNeed the tar command to runcCsx|��\}}tj�|��d�}t�t|d||�}Wd�n1s#wY|�||d�|�tj�	|��tj�|d�}ddd|g}t
j||t
jd�|�tj�	|��|�|�
|�|�
|��t�t|d||�}Wd�n1sxwY|�||d�|�tj�	|��t�t|d||d	d
�}Wd�n1s�wY|�||d�|�tj�	|��dS)Nr�r�r�zarchive2.tarr�z-cf��cwd�stdoutr�T)Zdry_run)r�r#r2r3rxr�rr�r�r�rq�
check_call�DEVNULLr�)r{r�rJr�r�Ztarball2Ztar_cmdrrr �test_tarfile_vs_tarbs4���
��z TestArchives.test_tarfile_vs_tarc		Cs�|��\}}|��}t�|�tj�|�}tj�tj�|�d�}t�	|��&t
�tj�|�}t|d|�}Wd�n1s?wYWd�n1sNwY|�
||d�|�tj�|��|�t�|��t�|��}|�|��gd��Wd�n1s�wYt�	|��'t
�tj�|�}t|d||�}Wd�n1s�wYWd�n1s�wY|�
||d�|�tj�|��|�t�|��t�|��}|�|��gd��Wd�dS1s�wYdS)Nr��zip�.zip)�dist/�	dist/sub/�
dist/sub2/�
dist/file1�
dist/file2�dist/sub/file3r�)r�r�r�r�r�r�)r�rxr#r�r2r�r3r�rr�r�r�rr�r�r��zipfileZ
is_zipfile�ZipFiler��namelist)	r{r�rJr�r�r�r�rV�zfrrr �test_make_zipfile�sB
��
����
�"�zTestArchives.test_make_zipfiler�zNeed the zip command to runc
Cs.|��\}}tj�|��d�}t�t|d||�}Wd�n1s#wY|�||d�|�tj�	|��tj�|d�}dddd|g}t
j||t
jd�|�tj�	|��t
�|��}|��}Wd�n1smwYt
�|��}|��}	Wd�n1s�wY|�t|�t|	��dS)Nr�r�r�zarchive2.zipz-qz-rr�)r�r#r2r3rxr�rr�r�r�rqr�r�r�r�r�rP)
r{r�rJr�r�Zarchive2�zip_cmdr�rZnames2rrr �test_zipfile_vs_zip�s(��
�
�z TestArchives.test_zipfile_vs_zip�unzipzNeed the unzip command to runc	Cs.|��\}}tj�|��d�}t�t|d||�}Wd�n1s#wY|�||d�|�tj�	|��dd|g}t
�|��Jz
tj
|tjd�Wn.tjy|}z!|jjdd�}d	|vrg|�d
�d}|�|�||��WYd}~n
d}~wwWd�dSWd�dS1s�wYdS)Nr�r�r�r�z-t)�stderr�replacer�zunrecognized option: tzunzip doesn't support -tz{}

**Unzip Output**
{})r�r#r2r3rxr�rr�r�r�rr�rq�check_outputZSTDOUT�CalledProcessError�output�decoder/r1�format)	r{r�rJr�r�r�r�Zdetails�msgrrr �test_unzip_zipfile�s.�

����"�zTestArchives.test_unzip_zipfilecCs*|��}tj�|d�}|�tt|d�dS)Nr�rk)rxr#r2r3r��
ValueErrorr)r{r�r�rrr �test_make_archive�szTestArchives.test_make_archivecCs�trt�d�d}t�d�d}nd}}|��\}}tj�|�	�d�}t
|d||||d�}|�tj�|��t
|d||�}|�tj�|��t
|d||||d�}|�tj�|��t
|d||ddd�}|�tj�|��dS)	Nrr@r�r���owner�groupr�Z	kjhkjhkjgZoihohoh)
�UID_GID_SUPPORT�grp�getgrgid�pwd�getpwuidr�r#r2r3rxrr�r�)r{r�r�r�rJr�rVrrr �test_make_archive_owner_group�s(�
�
�z*TestArchives.test_make_archive_owner_group�Requires grp and pwd supportc	
Cs�|��\}}tj�|��d�}t�d�d}t�d�d}t	�
|��$t�t|d|d||d�}Wd�n1s:wYWd�n1sIwY|�
tj�|��t�|�}z|��D]}|�|jd�|�|jd�qaW|��dS|��w)Nr�rr�r�r�)r�r#r2r3rxr�r�r�r�rr�r�rr�r�r�r4Z
getmembersr��uid�gidr�)	r{r�rJr�r�r�Zarchive_namer��memberrrr �test_tarfile_root_owners&
���
�z$TestArchives.test_tarfile_root_ownerc	s�t��}|��}dd�}g���fdd�}td|gd�zAt�td|���z	tdd|d�Wn	ty7YnwWd�n1sBwY|�t��|�|��||g�Wt	d�dSt	d�w)	Nc_st��r")�RuntimeError)r�kwrrr �_breakssz3TestArchives.test_make_archive_cwd.<locals>._breakscs��|��|�dSr"r��r2�rAZ
orig_chdirrr �_chdirs
z2TestArchives.test_make_archive_cwd.<locals>._chdirrk�xxx file�chdir)r�)
r#rbrxrr�	swap_attrrr�r�r)r{Zcurrent_dirr�r�r�rr�r �test_make_archive_cwds$���z"TestArchives.test_make_archive_cwdc	C�|��}t�|��5t�|�tdd�d�|�tj�	d��Wd�n1s)wYWd�dSWd�dS1sAwYdS)N�testr�ztest.tar�
rxrr�r�r�rr�r#r2r��r{r�rrr �test_make_tarfile_in_curdir-s
P�z(TestArchives.test_make_tarfile_in_curdirc	Cr�)Nr�r�ztest.zipr�rrrr �test_make_zipfile_in_curdir4s
P�z(TestArchives.test_make_zipfile_in_curdircCs�|�ttdd�|�ttddd�d�|�ttddd�ddg�tddd�dgd	�d
d�t�D�}|�d|�td�dd�t�D�}|�d|�dS)
NrkrlcS�tSr"��xrrrr �<lambda>?�z;TestArchives.test_register_archive_format.<locals>.<lambda>cSrr"rrrrr rAr)rlr^)rlr^rcSrr"rrrrr rDrr�cS�g|]\}}|�qSrr�rArW�paramsrrr rCE�z=TestArchives.test_register_archive_format.<locals>.<listcomp>cSrrrr	rrr rCIr)r��	TypeErrorrrr�rr?)r{�formatsrrr �test_register_archive_format<s��z)TestArchives.test_register_archive_formatcKsF|j|dd�fi|��|j|tjfi|��|j|tfi|��dS)NcSs|Sr"rr�rrr rPrz3TestArchives.check_unpack_archive.<locals>.<lambda>)�#check_unpack_archive_with_converterrrr)r{r�rrrr �check_unpack_archiveNs����z!TestArchives.check_unpack_archivecKs.|��\}}t|�}|�d�tj�|��d�}t||||�}|��}	t||�||	�fi|��|�	t|	�|�|��}
t||�||
�fd|i|��|�	t|
�|�|�
tj��t|t
�fi|��Wd�n1snwY|�
t��t|t
�fddi|��Wd�dS1s�wYdS)Nr�r�r�rk)r�rUr�r#r2r3rxrrr�r�r�Z	ReadErrorrr�)r{r�Z	converterrr�rJ�expectedr�r�r�Ztmpdir3rrr rUs&
��"�z0TestArchives.check_unpack_archive_with_convertercCsV|j|dd�|j|dd�t�|��|�|�Wd�dS1s$wYdS)NZ
fully_trusted��filter�data)rrZcheck_no_warnings)r{r�rrr �check_unpack_tarballms
"�z!TestArchives.check_unpack_tarballcC�|�d�dS)Nr��rr�rrr �test_unpack_archive_tarsr�z$TestArchives.test_unpack_archive_tarcCr)Nr�rr�rrr �test_unpack_archive_gztarv�z&TestArchives.test_unpack_archive_gztarcCr)NZbztarrr�rrr �test_unpack_archive_bztarzrz&TestArchives.test_unpack_archive_bztarz(AIX MAXDATA must be 0x20000000 or largercCr)NZxztarrr�rrr �test_unpack_archive_xztar~sz&TestArchives.test_unpack_archive_xztarcCsH|�d�|�t��|jddd�Wd�dS1swYdS)Nr�rr)rr�rr�rrr �test_unpack_archive_zip�s
"�z$TestArchives.test_unpack_archive_zipcs�t�}�fdd�}tdddg|dg�tdd���ttd	dg|�td�td	dg|���d	dgd
ft����ddgd
ft��td	���t�|�dS)Ncs(��|d���|d���|d�dS)Nrl�	stuff.boo�xx)r�)r�Zextract_dir�extrar�rr �_boo�sz/TestArchives.test_unpack_registry.<locals>._booZBooz.booz.b2)r rlrrZBoo2r�)	rrrr�r	r
r�r?r�)r{r
r!rr�r �test_unpack_registry�s

�z!TestArchives.test_unpack_registryN)r�)&r}r~rrZ
requires_zlibr�r�r�r�r�r��whichr�r�r�r�r�r�r�r�r�rrrrrrrrZrequires_bz2rZ
requires_lzmar�rnrurrr"rrrr r�&s^
#
�!
$��





r�c@sLeZdZe�eed�d�dd��Ze�ed�e�ee	d�d�dd	���Z
d
S)�TestMisc�
disk_usagez)disk_usage not available on this platformcCs�t�tj�t��}dD]}|�t||�t�q|�	|j
d�|�	|jd�|�|j
d�|�|j
|j�|�	|j
|j
�t�t�dS)N)r:�used�freer)r�r%r#r2r�r�r�rrtZ
assertGreaterr:r&�assertGreaterEqualr')r{Zusagererrr �test_disk_usage�szTestMisc.test_disk_usager��chownzrequires os.chowncs����}tj|d��t�d���t��
t���Wd�n1s$wY��t��tj�dd�Wd�n1s@wY��t��tj�dd�Wd�n1s\wY��t	��t��d�Wd�n1swwY��t	��t��d�Wd�n1s�wYt
��}t
��}d
��fd	d
�	}t��||�|�||�t��|�|�|�tj�|d�|�|�tj�|d�|�|d�t�|||�||||�t�||�|||�tj||d�|||�tj||d�|||d�zt
�|�d}t�|�d}Wnt�y$YdSwt��||�|�||�t�|||�||||�dS)Nr�ztesting chown functionznon-existing username)�userznon-existing groupname)r��spamg��Q�	@cs>t���}|dur��||j�|dur��||j�dSdSr")r#r�r��st_uid�st_gid)r2r�r��s�r�r{rr �check_chown�s
�z(TestMisc.test_chown.<locals>.check_chown)r�r)NN)rxr`r�r9r�r�r�r*�LookupErrorrr#�getuid�getgidr�r�r�r��KeyError)r{r�r�r�r1r+r�rr0r �
test_chown�s^
�����



�zTestMisc.test_chownN)r}r~rr�r�r_r�r)r�r#r6rrrr r$�s�


r$c@s�eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Ze�	e
ed�o$e��dkd
�dd��Z
dd�Zdd�Ze�ejdkd�dd��Zdd�Zdd�Zdd�Zdd�Zd d!�Zd"d#�Ze�ejdkd$�d%d&��Ze�ejdkd$�d'd(��Zd)S)*�	TestWhichcCst|jdd�|_tj|jddd�|_t�|jjtj	�|�
|jj�tj�
|jj�\|_|_|j|_tj|_d|_dS)NZTmp)rwz.Exe�r\rw�suffixz.EXE)rx�temp_dirr`ra�	temp_filer#r�rWr��S_IXUSRryr�r2rsr\�file�env_path�curdir�extr�rrr �setUp�s�
zTestWhich.setUpcCs&tj|j|jd�}|�||jj�dS�Nr�)r�r#r=r\r�r;rW�r{rFrrr �
test_basicszTestWhich.test_basiccCs(tj|jj|jd�}|�||jj�dSrB)r�r#r;rWr:r�rCrrr �test_absolute_cmd	szTestWhich.test_absolute_cmdcCs�tj�|j�\}}tj�||j�}tj|d��tj	||j
d�}|�||�Wd�n1s0wYtj|jd��tj	||d�}|�|�Wd�dS1sTwYdSrB)
r#r2rsr\r3r=rr�r�r#r:r��assertIsNone)r{rJ�tail_dir�relpathrFrrr �test_relative_cmds�"�zTestWhich.test_relative_cmdcCs�tj�|j�}tj|jd��1tj|j|d�}t	j
dkr*|�|tj�|j
|j��n
|�|�Wd�dSWd�dS1sBwYdS)Nr�r�)r#r2r�r\rr�r�r#r=ror�r�r3r?rF)r{rJrFrrr �test_cwds
�"�zTestWhich.test_cwdr�rznon-root user requiredcCsRt�|jjtj�t�|jjtj�r|�d�t	j
|j|jtjd�}|�
|�dS)Nzcan't set the file read-only)r2r7)r#r�r;rWr�r��access�W_OKr/r�r#r=r\rFrCrrr �test_non_matching_mode(s

z TestWhich.test_non_matching_modecCsltj�|j�\}}tj|d��tj|j|d�}|�	|tj�
||j��Wd�dS1s/wYdSrB)r#r2rsr\rr�r�r#r=r�r3)r{rJrGrFrrr �test_relative_path2s
"�zTestWhich.test_relative_pathcCstjd|jd�}|�|�dS)Nzfoo.exer�)r�r#r\rFrCrrr �test_nonexistent_file8szTestWhich.test_nonexistent_filer�zpathext check is Windows-onlycCs<tj|jdd�|jd�}|�||jjdd�|j�dS)N���r�)r�r#r=r\r�r;rWr@rCrrr �test_pathext_checking=s"zTestWhich.test_pathext_checkingcCsTt���}|j|d<t�|j�}|�||jj�Wd�dS1s#wYdS�N�PATH)	r�EnvironmentVarGuardr>r�r#r=r�r;rW�r{�envrFrrr �test_environ_pathEs


"�zTestWhich.test_environ_pathcCs�t���h}d|d<tjjd|jdd��At�td|j��)t�	|j��t
�|j�}|�
|�Wd�n1s9wYWd�n1sHwYWd�n1sWwYWd�dSWd�dS1sowYdS)Nr�rS�
os.confstrT��return_value�create�defpath)rrTr�rLrMr\rr�r#r�r�r#r=rFrUrrr �test_environ_path_emptyKs&
��
�����"�z!TestWhich.test_environ_path_emptycCsHtj�|jj�}tjdkr!tj}t|t	�rt�
|�}tj�||�}t�
��u}tj|d<tjjd|jdd��Mt�td|j��5t�|j�}|�|�t�|j��t�|j�}|�||�Wd�n1sgwYWd�n1svwYWd�n1s�wYWd�dSWd�dS1s�wYdS)Nr�rSrXTrYr\)r#r2r�r;rWror�r?r0r�r�r3rrT�pathsepr�rLrMr\rr�r�r#r=rFr�r�)r{Zexpected_cwdr?rVrFrrr �test_environ_path_cwdVs4




��
�����"�zTestWhich.test_environ_path_cwdc
Cs6t����}|�dd�tjjdtdd��&t�t	d|j
��t�|j
�}Wd�n1s.wYWd�n1s=wY|�||jj�tjjd|j
dd��%t�t	dd��t�|j
�}Wd�n1smwYWd�n1s|wY|�||jj�Wd�dS1s�wYdS)NrSrXT)rr[r\rYr�)rrT�popr�rLrMr�rr�r#r\r�r#r=r�r;rWrUrrr �test_environ_path_missingls.

��������"�z#TestWhich.test_environ_path_missingc	Cs�tj�|j�}tj|jd��7t���}|j|d<tj	|j
dd�}|�|�Wd�n1s0wYWd�dSWd�dS1sHwYdS)Nr�rSr�)r#r2r�r\rr�rTr>r�r#r=rF)r{rJrVrFrrr �test_empty_path~s�
P�zTestWhich.test_empty_pathcCsPt���}|�dd�t�|j�}|�|�Wd�dS1s!wYdSrR)rrTr`r�r#r=rFrUrrr �test_empty_path_no_PATH�s

"�z!TestWhich.test_empty_path_no_PATHztest specific to WindowscCs�d}tj|jd|d�}t�|jtj�|�|j	�tj
�|j�}tj
�|�d}t
���}||d<tj||jd�}|�||j�Wd�dS1sKwYdS)N�.xyz�Tmp2r8r�PATHEXTr�)r`rar:r#r�rWr�r<ryr�r2r�rrrTr�r#r��r{r@Ztemp_filexyzZprogramrVrFrrr �test_pathext�s�
"�zTestWhich.test_pathextcCs�d}tj|jd|d�}|�|j�tj�|j�}tj�	|�d}t
���}|�d�|d<tj
||jd�}|�||j�Wd�dS1sFwYdS)Nrdrer8r�;rfr�)r`rar:ryr�r#r2r�rWrrrTr�r#r�rgrrr �test_pathext_with_empty_str�s�
"�z%TestWhich.test_pathext_with_empty_strN)r}r~rrArDrErIrJr�r�r_r#r�rMrNrOr�ror�rQrWr]r_rarbrcrhrjrrrr r7�s4
�
�

r7c@seZdZdd�ZdS)�TestWhichBytescCsXt�|�t�|j�|_t�|j�|_t�|jj�|j_t�|j�|_t�|j	�|_	dSr")
r7rAr#r�r\r=r;rWr?r@r�rrr rA�s
zTestWhichBytes.setUpN)r}r~rrArrrr rk�srkc@s�eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	e
dd��Ze
dd��Zdd�Z
e
dd��Zdd�Ze
dd��Zdd�Ze�ejjd�dd��Zd d!�Zd"d#�Zd$d%�Zd&d'�Zeje
d(d)���Zeje
d*d+���Zeje
d,d-���Z eje
d.d/���Z!d0d1�Z"d2d3�Z#e
d4d5��Z$e
d6d7��Z%d8d9�Z&e�e'ed:�o�e�(�d;ko�e'ed<�o�e'e)d=�o�e'e)d>�d?�d@dA��Z*dBS)C�TestMovecCsxd}|��|_|��|_tj�|j|�|_tj�|j|�|_t|jd��}|�	d�Wd�dS1s5wYdS)Nr�r+r,)
rxr�r�r#r2r3r�r�r4r5)r{r�rIrrr rA�s

"�zTestMove.setUpcCs�t|d��}|��}Wd�n1swYt�||�t|d��}|�||���Wd�n1s7wY|�tj�|��dS�NrK)	r4rMr��mover�r�r#r2r�)r{rgrh�real_dstrI�contentsrrr �_check_move_file�s
��zTestMove._check_move_filecCsFtt�|��}t�||�|�|tt�|���|�tj�|��dSr")	rPr#rQr�rnr�r�r2r�)r{rgrhrorprrr �_check_move_dir�szTestMove._check_move_dircCs|�|j|j|j�dSr")rqr�r�r�rrr �test_move_file��zTestMove.test_move_filecCs|�|j|j|j�dSr")rqr�r�r�r�rrr �test_move_file_to_dir�rtzTestMove.test_move_file_to_dircCs"t�|j�}|�||j|j�dSr")rrr�rqr�r�)r{rgrrr �"test_move_file_to_dir_pathlike_src��z+TestMove.test_move_file_to_dir_pathlike_srccCs"t�|j�}|�|j||j�dSr")rrr�rqr�r��r{rhrrr �"test_move_file_to_dir_pathlike_dst�rwz+TestMove.test_move_file_to_dir_pathlike_dstcC�|��dSr")rsr�rrr �test_move_file_other_fs��z TestMove.test_move_file_other_fscCrzr")rur�rrr �test_move_file_to_dir_other_fs�r|z'TestMove.test_move_file_to_dir_other_fsc	Cs>tj|��d�}z|�|j||�Wt�|�dSt�|�wr�)r`r�rxrrr�rrz�r{r�rrr �
test_move_dir�szTestMove.test_move_dircCrzr")rr�rrr �test_move_dir_other_fs�r|zTestMove.test_move_dir_other_fsc
Cs,|�|j|jtj�|jtj�|j���dSr")rrr�r�r#r2r3r�r�rrr �test_move_dir_to_dir�s�zTestMove.test_move_dir_to_dircCrzr")r�r�rrr �test_move_dir_to_dir_other_fsr|z&TestMove.test_move_dir_to_dir_other_fsc
C�4|�|jtjj|jtj�|jtj�|j���dSr")rrr�r#r2�sepr�r3r�r�rrr �test_move_dir_sep_to_dirs�z!TestMove.test_move_dir_sep_to_dirzrequires os.path.altsepc
Cr�r")rrr�r#r2�altsepr�r3r�r�rrr �test_move_dir_altsep_to_dir	s�z$TestMove.test_move_dir_altsep_to_dircCsHt|jd��Wd�n1swY|�tjtj|j|j�dS)Nr+)r4r�r�r�rrnr�r�r�rrr �"test_existing_file_inside_dest_dirs�z+TestMove.test_existing_file_inside_dest_dircCs*tj�|jd�}|�tjtj|j|�dS�NrO)r#r2r3r�r�r�rrnrxrrr �test_dont_move_dir_in_itselfsz%TestMove.test_dont_move_dir_in_itselfc	C�pt�t�z,dD]!\}}tj�t|�}tj�t|�}|jt�||�d||fd�qWt�	t�dSt�	t�w)N))�srcdirzsrcdir/destz?_destinsrc() wrongly concluded that dst (%s) is not in src (%s)�r�)
r#r�rr2r3r�r��
_destinsrcrrzr�rrr �test_destinsrc_false_negative�
���z&TestMove.test_destinsrc_false_negativec	Cr�)N))r�zsrc/dest)r�z
srcdir.newz;_destinsrc() wrongly concluded that dst (%s) is in src (%s)r�)
r#r�rr2r3r�r�r�rrzr�rrr �test_destinsrc_false_positive%r�z&TestMove.test_destinsrc_false_positivecCs\tj�|jd�}t�|j|�t�||j�|�	tj�
|j��|�	tj�|j|j��dSr�)r#r2r3r�r�r�r�rnr�r�rS�samefilerxrrr �test_move_file_symlink1s
zTestMove.test_move_file_symlinkcCsld}tj�|j|�}t�|j|�t�||j�tj�|j|�}|�	tj�
|��|�	tj�|j|��dSr�)r#r2r3r�r�r�r�rnr�r�rSr�)r{r�rhZ
final_linkrrr �test_move_file_symlink_to_dir:sz&TestMove.test_move_file_symlink_to_dircCsztj�|jd�}tj�|jd�}t�||�tj�|jd�}t�||�|�tj�	|��|�
tj�|�tj�|��dS�NrPrOrQ)r#r2r3r�r�r�r�rnr�rSr��realpath�r{rgrhr	rrr �test_move_dangling_symlinkEs z#TestMove.test_move_dangling_symlinkcCs|tj�|jd�}tj�|jd�}t�|�t�||�tj�|jd�}t�||�|�	tj�
|��|�	tj�||��dSr�)r#r2r3r�r�r�r�r�rnr�rSr�r�rrr �test_move_dir_symlinkPs
zTestMove.test_move_dir_symlinkc	Cs6t�|j|j�}|�|tj�|jtj�|j���dSr")	r�rnr�r�r�r#r2r3r�rCrrr �test_move_return_value\s�zTestMove.test_move_return_valuecCs6t�|jtj�|jd��}|�|tj�|jd��dSr�)r�rnr�r#r2r3r�r�rCrrr � test_move_as_rename_return_valueasz)TestMove.test_move_as_rename_return_valuecs8g��fdd�}tj|j|j|d�|�t��d�dS)Ncr5r"r�r6�Zmovedrr r8hr9z7TestMove.test_move_file_special_function.<locals>._copyr(rl)r�rnr�r�r�r��r{r8rr�r �test_move_file_special_functionesz(TestMove.test_move_file_special_functioncsdg��fdd�}t�tj�|jd��t�tj�|jd��tj|j|j|d�|�	t
��d�dS)Ncr5r"r�r6r�rr r8pr9z6TestMove.test_move_dir_special_function.<locals>._copy�childZchild1r(r)rr�r#r2r3r�r�rnr�r�r�r�rr�r �test_move_dir_special_functionmsz'TestMove.test_move_dir_special_functionc	Cs||��|_tj�tj�|j�tj�|j����}|�|j|�zt	�
|j|�|�tj�|��Wt�
|�dSt�
|�wr")rxr�r#r2r3r�r��upperrSr�rnr�rRr�r~rrr �test_move_dir_caseinsensitivews
�z&TestMove.test_move_dir_caseinsensitiver�rr��SF_IMMUTABLE�	UF_OPAQUEr�c
Cs0zqt�t�t�ttj�|�ttj	tt
�|�t
t��v�t�ttj
�t�tj�td��t�ttj�|�ttj	tt
�|�t
t��v�Wtj�t�r\t�ttj
�t�t�tj�t
�rpt�t
tj
�t�t
�dSdStj�t�r�t�ttj
�t�t�tj�t
�r�t�t
tj
�t�t
�ww)Nr�)r#r��
TESTFN_SRCr�r�r�r�r"r�rn�
TESTFN_DSTr�rQr�rr�r2r3r�rzr�rrr �test_move_dir_permission_denied�s0

��
�z(TestMove.test_move_dir_permission_deniedN)+r}r~rrArqrrrsrurvryr*r{r}rr�r�r�r�r�r�r#r2r�r�r�r�r�r�rr�r�r�r�r�r�r�r�r�r�r_r�r�r�rrrr rl�sj	




		


	���rlc@s`eZdZGdd�de�Zdd�Ze�ed�dd��Z	e�ed�dd	��Z
e�ed�d
d��ZdS)
�TestCopyFilec@s:eZdZdZdZdZddd�Zdd�Zdd	�Zd
d�Z	dS)
zTestCopyFile.FauxFNTcCs||_||_dSr")�_raise_in_exit�_suppress_at_exit)r{Z
raise_in_exitZsuppress_at_exitrrr �__init__�s
zTestCopyFile.Faux.__init__cGsdS)Nr�r)r{rrrr rM�r�zTestCopyFile.Faux.readcCs
d|_dS)NT)�_enteredr�rrr �	__enter__�s
zTestCopyFile.Faux.__enter__cCs&|||f|_|jrd|_td��|jS)NT�Cannot close)�_exited_withr��_raisedrr�)r{�exc_typeZexc_valZexc_tbrrr �__exit__�s
zTestCopyFile.Faux.__exit__)FT)
r}r~rr�r�r�r�rMr�r�rrrr �Faux�s
r�c	Cs�ddd�}t�td|��,|�t��t�dd�Wd�n1s#wYWd�dSWd�dS1s;wYdS)NrLcSs|dkrtd��dS)N�srcfilezCannot open "srcfile"rp�r�r7rrr �_open�s�z4TestCopyFile.test_w_source_open_fails.<locals>._openr4r��destfile�rL)rr�r�r�rr��r{r�rrr �test_w_source_open_fails�s
��"�z%TestCopyFile.test_w_source_open_failszskipped on macOScs�|���d
�fdd�	}t�td|��t�dd�Wd�n1s#wY|��j�|��jdtu�|�	�jdj
d	�dS)NrLcs |dkr�S|dkrtd��dS)Nr�r��Cannot open "destfile"rpr��r�rr r��s
�z2TestCopyFile.test_w_dest_open_fails.<locals>._openr4r�r�rrl)r�r�)r�rr�r�r�r�r�r�rr�rr�rr�r �test_w_dest_open_fails�s��z#TestCopyFile.test_w_dest_open_failscs�|���|�d��d��fdd�	}t�td|��t�dd�Wd�n1s)wY|��j�|��j�|��j�|��jdt	u�|�
�jd	jd
�dS)NTrLc�|dkr�S|dkr�SdS�Nr�r�rr��r�r�rr r���
�z3TestCopyFile.test_w_dest_close_fails.<locals>._openr4r�r�rrl)r�r�)r�rr�r�r�r�r�r�r�rr�rr�rr�r �test_w_dest_close_fails�s
��z$TestCopyFile.test_w_dest_close_failsc	s�|�d��|���d	��fdd�	}t�td|��#|�t��t�dd�Wd�n1s/wYWd�n1s>wY|��j�|��j�|�	�j
�|��jddu�|��j
�dS)
NTrLcr�r�rr�r�rr r��r�z5TestCopyFile.test_w_source_close_fails.<locals>._openr4r�r�rr�)r�rr�r�r�rr�r�r�r�r�r�r�rr�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�rrrr r��s





r�c@sxeZdZdZedd��Zedd��Zdd�Zej	dd	��Z
d
d�Zdd
�Zdd�Z
dd�Ze�ejdkd�dd��ZdS)�TestCopyFileObji cCstt|j�dSr")rJr�FILESIZE��clsrrr �
setUpClass
	szTestCopyFileObj.setUpClasscCst�t�t�t�dSr")rrdrr0r�rrr �
tearDownClass	s
zTestCopyFileObj.tearDownClasscC�t�t�dSr"�rrdr0r�rrr �tearDown	r�zTestCopyFileObj.tearDownc	c�v�ttd��+}ttd��
}||fVWd�n1swYWd�dSWd�dS1s4wYdS�NrKr+�r4rr0r�rrr �	get_files	����"�zTestCopyFileObj.get_filesc	Cs~t|d��0}t|d��}|�|��|���Wd�n1s wYWd�dSWd�dS1s8wYdSrm)r4r�rM)r{rgrh�fsrc�fdstrrr �assert_files_eq	s��"�zTestCopyFileObj.assert_files_eqcCsH|���\}}t�||�Wd�n1swY|�tt�dSr")r�r��copyfileobjr�rr0r�rrr �test_content!	s�zTestCopyFileObj.test_contentcCs>|���\}}t�||�Wd�dS1swYdSr")r�r�r�r�rrr �test_file_not_closed&	s"�z$TestCopyFileObj.test_file_not_closedcCsb|���#\}}t�||�|�|��|j�|�|��|j�Wd�dS1s*wYdSr")r�r�r�r��tellr�r�rrr �test_file_offset,	s
"�z TestCopyFileObj.test_file_offsetrzWindows onlycCsztj�d��}t�tt�Wd�n1swY|�|jddd�t	j
t��dd��
}|�
d�Wd�n1s@wY|j}|�tj|�tj�d��}t�|t�Wd�n1sfwY|�|jddd�t	j
t��dd��}Wd�n1s�wY|j}|�tj|�tj�d��}t�|t�Wd�n1s�wY|�|t�dS)	Nzshutil._copyfileobj_readintorr^iFr[sfoor)r�rLrMr�r�rr0r��	call_argsr`rar#rbr5rWryrrdr�)r{�mrIrwrrr �
test_win_impl2	s,�����zTestCopyFileObj.test_win_implN)r}r~rr��classmethodr�r�r��
contextlib�contextmanagerr�r�r�r�r�r�r�r#rWr�rrrr r�	s


r�c@s�eZdZ	dZdZdZedd��Zedd��Zdd	�Z	e
jd
d��Zdd
�Z
dd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�ZdS)�_ZeroCopyFileTesti�r=r�cCsFtt|j�ttd��}|��|_Wd�dS1swYdSrm)rJrr�r4rM�FILEDATA)r�rIrrr r�W	s"�z_ZeroCopyFileTest.setUpClasscCr�r")rrdrr�rrr r�^	rz_ZeroCopyFileTest.tearDownClasscCr�r"r�r�rrr r�b	r�z_ZeroCopyFileTest.tearDownc	cr�r�r�r�rrr r�e	r�z_ZeroCopyFileTest.get_filescOstd��)Nzmust be implemented in subclass)�NotImplementedError)r{rrrrr �zerocopy_funk	sz_ZeroCopyFileTest.zerocopy_funcCs$|��|��|��|��dSr")r�r�r�rAr�rrr �resetn	sz_ZeroCopyFileTest.resetc	Cs�|���\}}|�||�Wd�n1swY|�ttdd�|j�|���/\}}tj�d��}t	�
tt�Wd�n1sEwYWd�dSWd�dS1s]wYdS)NT�r6zshutil.copyfileobj)r�r�r�rNr0r�r�rLrMr�r�r)r{rgrhr�rrr �test_regular_copyv	s���"�z#_ZeroCopyFileTest.test_regular_copyc	Cs�|�|j�|���%\}}|�t��|�||�Wd�n1s#wYWd�n1s2wY|�ttdd�|j	�dS)NTr�)
ryr�r�r�r�r�r�rNrr�r�rrr �test_same_file�	s���z _ZeroCopyFileTest.test_same_filecCsZtjt��d�}|�t��}t�|d�Wd�n1swY|�|j	j
|�dS)Nr��new)r`r�r#rbr�r�r�r�r�r�r�)r{rWr�rrr �test_non_existent_src�	s
�z'_ZeroCopyFileTest.test_non_existent_srcc	s�td�td�|��fdd��|��fdd��t�d��Wd�n1s*wYt�d��#}t�d��}|�||�Wd�n1sKwYWd�n1sZwY|�t�dd	�d
�dS)Nrgrhc�
t���Sr"�rrdr)rerr r�	�
z3_ZeroCopyFileTest.test_empty_file.<locals>.<lambda>cr�r"r�r)rfrr r�	r�r+rKTr�r=)rryr4r�r�rNr�r)rfrer �test_empty_file�	s����z!_ZeroCopyFileTest.test_empty_filecCsJtjj|jtd��|�ttjtt	�Wd�dS1swYdS)Nr)
r�rLrM�
PATCHPOINT�ZeroDivisionErrorr�r�r�rr0r�rrr �test_unhandled_exception�	s
��"�z*_ZeroCopyFileTest.test_unhandled_exceptionc
Cs�tjj|jttjd�d��B|���%\}}|�t	��|�
||�Wd�n1s+wYWd�n1s:wYWd�dSWd�dS1sRwYdS�N�yor)r�rLrMr�rrZEINVALr�r�r
r�r�rrr �test_exception_on_first_call�	s

�����"�z._ZeroCopyFileTest.test_exception_on_first_callc	Cs�tjj|jttjd�d��0|���\}}|�t|j	||�Wd�n1s(wYWd�dSWd�dS1s@wYdSr�)
r�rLrMr�rrZENOSPCr�r�r�r�rrr �test_filesystem_full�	s

���"�z&_ZeroCopyFileTest.test_filesystem_fullN)r}r~rr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrr r�Q	s*




r�zos.sendfile() not supportedc@sXeZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
dd�Zdd�ZdS)�TestZeroCopySendfile�os.sendfilecCst�||�Sr")r��_fastcopy_sendfile)r{r�r�rrr r��	sz!TestZeroCopySendfile.zerocopy_func
Cs�t�|j��>}ttd��)}|�t��|�||�Wd�n1s#wYt�	||�Wd�n1s8wYWd�n1sGwY|�
ttdd�|j�dS)Nr+Tr�)�io�BytesIOr�r4r0r�r
r�r�r�r�rNr�rrr �test_non_regular_file_src�	s����z.TestZeroCopySendfile.test_non_regular_file_srcc
Cs�ttd��T}t���7}|�t��|�||�Wd�n1s!wYt�||�|�	d�|�
|��|j�Wd�n1sDwYWd�dSWd�dS1s\wYdS)NrKr)
r4rr�r�r�r
r�r�r��seekr�rMr�r�rrr �test_non_regular_file_dst�	s
�
��"�z.TestZeroCopySendfile.test_non_regular_file_dstc
s���fdd�}g�tj�tjjdd|d��9|���%\}}|�t��}t�	||�Wd�n1s3wYWd�n1sBwYWd�n1sQwY|�
|jjtj
�dS)Ncs(�s��d��|i|��Sttjd��)Nr�)rTrr�EBADFr�r&Z
orig_sendfilerr rZ�	s
zDTestZeroCopySendfile.test_exception_on_second_call.<locals>.sendfiler�T)r[r)r#rZr�rLrMr�r�rr�r�r�r�rr�)r{rZrgrhr�rr�r �test_exception_on_second_call�	s
������z2TestZeroCopySendfile.test_exception_on_second_callc	Cs�tjjdtd��$}|���\}}t�||�Wd�n1s wYWd�n1s/wY|�tt	dd�|j
�dS)N�os.fstatrTr�)r�rLrMrr�r�r�r�rNr0r��r{r�rgrhrrr �test_cant_get_size�	s���z'TestZeroCopySendfile.test_cant_get_sizec	Cs�tj��}d|_tjjd|d��$}|���\}}t�||�Wd�n1s(wYWd�n1s7wY|�t	t
dd�|j�dS)Nir�rZTr�)r�rL�Mock�st_sizerMr�r�r�r�rNr0r��r{rLr�rgrhrrr �test_small_chunks�	s
���z&TestZeroCopySendfile.test_small_chunksc	Cs�tj��}|jd|_tjjd|d��$}|���\}}t�||�Wd�n1s+wYWd�n1s:wY|�	t
tdd�|j�dS)Ni@rrTr�)
r�rLrr�rrMr�r�r�r�rNr0r�rrrr �test_big_chunk�	s
���z#TestZeroCopySendfile.test_big_chunkcCs�tjjdtd��P}|�ttjtt�|j	dd}|�
|tj�
t��t�t�ttddd�|�tjtd�|�ttjttd�|j	dd}|�
|d	�Wd�dS1s[wYdS)
Nr�rrrshelloTr��3i�)r�rLrMr�r�r�r�rr0r�r�r#r2�getsizerrdr9ry)r{r�Z	blocksizerrr �test_blocksize_arg
s$��
�"�z'TestZeroCopySendfile.test_blocksize_argc
Cs�zwtjj|jttjd�d��9}|���%\}}|�t	��t
�||�Wd�n1s,wYWd�n1s;wYWd�n1sJwYtj�|j��}t
�t
t�Wd�n1sgwYWdt
_dSWdt
_dSdt
_w)Nr�rT)r�rLrMr�rrZENOTSOCKr�r�r
r�r�r�rr0Z_USE_CP_SENDFILErrrr �test_file2file_not_supported
s(
������	�
�z1TestZeroCopySendfile.test_file2file_not_supportedN)
r}r~rr�r�r�r�rrrr	rr
rrrr r��	s		


r�z
macOS onlyc@seZdZdZdd�ZdS)�TestZeroCopyMACOSzposix._fcopyfilecCst�||tj�Sr")r�Z_fastcopy_fcopyfile�posixZ_COPYFILE_DATAr�rrr r�0
r�zTestZeroCopyMACOS.zerocopy_funN)r}r~rr�r�rrrr r,
src@s^eZdZdd�Zdd�Zdd�Ze�e�	e
j���d�e�e
ed�d	�d
d���Zdd
�ZdS)�TestGetTerminalSizecCs*	t��}|�|jd�|�|jd�dS)Nr)r��get_terminal_sizer(�columns�lines)r{rFrrr �test_does_not_crash5
sz'TestGetTerminalSize.test_does_not_crashcCs�	t���}d|d<|d=t��}Wd�n1swY|�|jd�t���}|d=d|d<t��}Wd�n1sAwY|�|jd�dS)NZ777�COLUMNS�LINESi	Z888ix)rrTr�rr�rr�r{rVrFrrr �test_os_environ_first?
s

�

�z)TestGetTerminalSize.test_os_environ_firstcCs`t���}d|d<d|d<t��}Wd�n1swY|�|jd�|�|jd�dS)NrkrZyyyrr)rrTr�rr(rrrrrr �test_bad_environN
s

�z$TestGetTerminalSize.test_bad_environz
not on ttyrzneed os.get_terminal_size()c
Cs�	z
t�ddg�����}Wntttjfy |�d�Ynwt|d�t|d�f}t	�
��}|d=|d=t��}Wd�n1sFwY|�
||�dS)NZsttyrFzstty invocation failedrlrrr)rqr�r�rsr�r"r�r/rtrrTr�rr�)r{rFrrVr�rrr �test_stty_matchV
s
��

�z#TestGetTerminalSize.test_stty_matchc
Cst���}}|d=|d=t�tdd��tjdd�}Wd�n1s#wY|�|jd�|�|j	d�t
tjdd	d
��%}t�td|��tjdd�}Wd�n1sWwYWd�n1sfwY|�|jd�|�|j	d
�Wd�dS1s�wYdS)Nrr�
__stdout__)�
�)Zfallbackrrr,r-r.)��(rr)
rrTrr�ror�rr�rrr4r#�devnull)r{rVrFrIrrr �
test_fallbackn
s$
����"�z!TestGetTerminalSize.test_fallbackN)r}r~rrrrr�r�r#�isattyrorrcr_rr!rrrr r4
s
�rc@seZdZ	dd�ZdS)�PublicAPITestscCsP|�ttd��gd�}ttd�stjdkr|�d�|�ttj�t|��dS)N�__all__)r�r�rTrar�r�r�rnrzrr�Z	ExecErrorrrrrrrr
rrr*r#rr�statvfsrr%)	r�r_r�r#rWrTr�rr$)r{Z
target_apirrr �test_module_all_attribute�
s

z(PublicAPITests.test_module_all_attributeN)r}r~rr&rrrr r#�
sr#�__main__)F)Vr�Z
unittest.mockr�r`ror�r#Zos.pathrr(rrqr>r?r�r�rrrrrrrr	r
rrr
r�r�r�ImportErrorr�rZtest.supportrZtest.support.os_helperrrrr0r�r�r�rr�r�rnr�r�r�r�rLrM�AssertionErrorr�r!r*r9rJrNrUriZSUPPORTS_SENDFILErurvZTestCaser�r�rNr�r$r7rkrlr�r�r�r�r�r�rrr#r}�mainrrrr �<module>s�8����

	dP<
s\JdvN
�