HEX
Server: Apache
System: Linux zacp120.webway.host 4.18.0-553.50.1.lve.el8.x86_64 #1 SMP Thu Apr 17 19:10:24 UTC 2025 x86_64
User: govancoz (1003)
PHP: 8.3.26
Disabled: exec,system,passthru,shell_exec,proc_close,proc_open,dl,popen,show_source,posix_kill,posix_mkfifo,posix_getpwuid,posix_setpgid,posix_setsid,posix_setuid,posix_setgid,posix_seteuid,posix_setegid,posix_uname
Upload Files
File: //usr/local/lib/python3.10/test/__pycache__/test_shutil.cpython-310.opt-2.pyc
o

�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�-/usr/local/lib/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)�random�choice�string�
ascii_letters�encode)�.0�irrr �
<listcomp>bs�z#write_test_file.<locals>.<listcomp>r+)�minr3�ranger4r5)r2�sizer<�bufsize�chunk�fZcsizerrr �write_test_fileWs

��"�rLcCsj	t|t�rtjj|�}|rdnd}|rdnd}t|||d��}|��Wd�S1s.wYdS)N�rb�rr-r.)r0r1r#r2r3r4�read)r2r6r7r/r8rrr �	read_fileis
$�rPcCs|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 rWws�rWc
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
0123456789rMr�T)
�hasattrr#�tempfile�NamedTemporaryFile�getcwdrYr5r4�filenor\rr�unlink)�srcname�dstnamerK�src�dst�infd�outfdrrr �supports_file2file_sendfile�s^
���
����
����
��
�rmcCsFtr!tjdkr!t�dtj�}|�d�d��d}t|d�dkSdS)	Ni���z/usr/bin/dump -o %s�
�����i T)�AIX�sys�maxsize�
subprocess�	getoutput�
executable�split�int)ZhdrsZmaxdatarrr �
_maxdataOK�s
rzc@seZdZddd�ZdS)�BaseTestNcCs&	tj|t��d�}|�tj|�|S)N)�prefixr^)rb�mkdtempr#rd�
addCleanupr�rmtree)�selfr|�drrr r}�szBaseTest.mkdtempr")�__name__�
__module__�__qualname__r}rrrr r{�sr{c@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)r}r#r2r3�mkdirr9�fsencode�assertIsInstance�bytes�shutilr)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"�rV�r��errorsrr �onerror��z8TestRmTree.test_rmtree_fails_on_symlink.<locals>.onerror�r�rprr`)r}r#r2r3r��symlink�assertRaisesrr�r�
assertTrue�exists�lexists�assertEqual�len�assertIsrUr��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)r}r#r2r3r�r9r�r�r�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�rprr`)r}r#r2r3r��_winapi�CreateJunctionr~rrfr�rr�rr�r�r�r�r�r�rUr�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�)
r}r#r2r3r�r9r�r�r�rr�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`rrp)rb�mktempr}r��FileNotFoundErrorr�rr9r#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�rr~r�rr2r3�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`rrpr)r�r#rfr�r�r�r�r�rS�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�r)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�r�rrrr �Called�sr�cs��r"rr�r�rr �_raiser��zITestRmTree.test_rmtree_uses_safe_fd_version_if_available.<locals>._raiser)r#r4r�rfr��supports_dir_fdrS�supports_fd�supports_follow_symlinksr�r��_use_fd_functionsr�avoids_symlink_attacksr}r2r3r��_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�)
rb�mkstempr}r#�closer�r�r�r�remove)r��handler2rrr �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�r�r�rirjrrr �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�rr�rrr �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��skipIfrs�platformrar#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)r}r#r2r3r~r�r�dirnamer9r��copytreer��isfilerTrPr��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)�
dirs_exist_okF)r}r~r�rr9r#r�r2r3r�r�r�rTrPr�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)Nrirj�subzfile.txtr�r�zsub/link�lchmod�lchflags�	UF_NODUMPT��symlinks�ntz\\?\�)r}r#r2r3r�r9r�rarr��S_IRWXU�S_IRWXOrr	r�r�r�r�rU�readlinkrY�
startswithr�r��st_flags)
r�r�r�rZsub_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)Nrorz.py)r#r2r3rTrxrV�splitext)ri�namesrXrYr2rrr �_filter6s
�z8TestCopyTree.test_copytree_with_exclude.<locals>._filter)r#r2r3r�r}r9r�r��ignore_patternsr�r�r�rr�)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�rr�r�csT��|���|t���|t���t|�tt|���|D]}��|t�qgSr")rVr��str�listr�r��set)rirrY�Zinvokationsr�rr �_ignore]s
z?TestCopyTree.test_copytree_arg_types_of_ignore.<locals>._ignorer�rr�	)r#r2r3r�r}r�r9r�r�r��pathlib�Pathr#r�r��DirEntryr�r�)r�r3r�r�r�r&rZ
src_dir_entryrr%r �!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)Nr!r�i�zpermissive.txtr�zrestrictive.txtr�i�r�rp)r}r#r2r3r�r~r�rr�r9rbrr�r�r�r�rx)r�r�r�rZrestrictive_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)
r}r#r2r3r~r�rr��PermissionErrorrr�rr�)r�Z
mock_patchr�rrrr �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�)rVr�r"r�r#r2r3)r�r��rj�flagr�rirr �custom_cpfun�s

zETestCopyTree.test_copytree_custom_copy_function.<locals>.custom_cpfunr�r�r,r-r.��
copy_functionrp)r}rbr�r4r#r2r3r�r�r�r�r�)r�r2rKrr0r �"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)
NrZmypipe�os.mkfifo(): %srrpz`%s` is a named pipez$shutil.Error should have been raisedTr�)r#r�rr2r3r6r-�skipTestr�r��TESTFN2rrr�r��failr)r�r�pipe�er�rirjZ	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��rirj�Zcopiedrr �_copy��z6TestCopyTree.test_copytree_special_func.<locals>._copyr3r`)
r}r#r2r3r9r�r�r�r�r�)r�r�rrDrrCr �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
IDONTEXIST�brokenZvalidr��destination2T)�ignore_dangling_symlinksZdestination3r
)r}r#r2r3r9r�r�r�rr�r��walk�assertNotInr�rS)	r�r�Z
valid_filerHr�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)�target_is_directoryFr
rJ)r}r#r2r3r�r4r�r�r�r�rUr�rSr�)r�r�rrrr �test_copytree_symlink_dir�s"�� z&TestCopyTree.test_copytree_symlink_dircCs\|��}|d}|�tj|d�tj�|d�}t|d�t�||�}|�	dgt�
|��dS)N�destTr�)r}r~r�rr#r2r3r9r�r�rS)r�r�rri�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)r}r~r�rr#r2r3�makedirsr9r�r�rS)r��base_dirr�rrirUrrr �test_copytree_subdirectorys

z'TestCopyTree.test_copytree_subdirectoryN)r�r�r�rrrr�rr r+r,r��mock�patchr.r5r�rar#r�rsr�r@rFrQrSrVrZrrrr 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)r}r#r2r3r9r�r�r�r�S_IRWXGr�assertNotEqualr�r��copymoder�rY�r�r�rirjrrrrr �test_copymode_follow_symlinks&s2


 �z&TestCopy.test_copymode_follow_symlinksrzrequires 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�r^r_r`F��follow_symlinks)r}r#r2r3r9r�r�r�rrarrr�rcr�r�r�rbrdrrr � 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�dSrf)r}r#r2r3r9r�r�rcrdrrr �*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�r^r_�quxgE@rrr	TrgF��st_atime�st_mtimerprg�������?)r}r#r2r3r9r��utimermrnrbr�rarrrr	r�r��copystatr�r��assertLessEqualrr�rr��abs)
r�r�rirjrrr�
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)NTrgcs
��_��r")r)r2�flagsrh��err�exrr �_chflags_raiser�szlTestCopy.test_copystat_handles_harmless_chflags_errors.<locals>.make_chflags_raiser.<locals>._chflags_raiser�r)r}rrr|r �make_chflags_raiser�szSTestCopy.test_copystat_handles_harmless_chflags_errors.<locals>.make_chflags_raiser)
r}r#r2r3r9rvrrwrxr�rpr�r)r�r�r�ryr�Zold_chflagsr}rrr �-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�r^�user.foo�42zuser.bar�43�EPERMcs$|dkr���|||fi|��dS)Nr�r)�fnamert�valr)�
orig_setxattr�os_errorrr �_raise_on_user_foo�sz3TestCopy.test_copyxattr.<locals>._raise_on_user_fooTrgcs |�kr
ttjd���||d�S)NzOperation not supportedrg)rrrx)r�rh)�orig_listxattrrirr �
_raise_on_src�sz.TestCopy.test_copyxattr.<locals>._raise_on_srcZthe_originalZthe_original_rozuser.the_valuesfiddlyi$Zthe_copyZthe_copy_ro)r}r#r2r3r9r��
_copyxattr�setxattrr�rR�	listxattr�getxattrr�rrr�r�r�rp)r�r�rjr�r�ZsrcroZdstror)r�r�r�rir �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�r_ztrusted.foor�r�Frgr^rk)
r}r#r2r3r9r�r�r�r�r�r�r�r)r�r�rirrjrrrr �test_copyxattr_symlinks�s 

z TestCopy.test_copyxattr_symlinkscCsPd}|��}t||fd�tj�||�}|��}|||�tj�||�}||fS)Nr�rz)r}r9r#r2r3)r��methodr�r�r��tmpdir2ryrrr �
_copy_files
zTestCopy._copy_filecCsB|�tj�\}}|�tj�|��|�t�|�j	t�|�j	�dSr")
r�r��copyr�r#r2r�r�r�r�)r�r�ryrrr �	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�r^r_rTrgF)r}r#r2r3r9r�rarr�rrr�r�r�rUr�rPr�r�rr�r�)r�r�rirjrrrr �test_copy_symlinks's(




��zTestCopy.test_copy_symlinksrozrequires os.utimecCs�|�tj�\}}|�tj�|��t�|�}t�|�}|�|j	|j	�dD]}|�
t||�t||�d�q%ttd�rNt|d�rP|�t|d�t|d��dSdSdS)Nrlrprvr)
r�r��copy2r�r#r2r�r�r�r�rqrra)r�r�ryZ
file1_statZ
file2_statrtrrr �
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�r^r_rrr	TrgFrlrpr)r}r#r2r3r9r�rarr�rrrr	r�r�r�r�rUr�rPr�r�rror�rqrr�rbr)	r�r�rirjrrrsrrtrrr �test_copy2_symlinksQs>





�
�zTestCopy.test_copy2_symlinkscCsr|��}tj�|d�}tj�|d�}t|d�t�|dd�t�||�|�t�	|d�t�	|d��t�
|�dS)Nr�r^r�r�)r}r#r2r3r9r�r�r�r�r�r�)r�r�rirjrrr �test_copy2_xattrts


�zTestCopy.test_copy2_xattrcCs�tjtjfD];}|��}|��}tj�|d�}t|d�|||�}|�|tj�|d��||tj�|d��}|�|tj�|d��qdS)Nr�r^)	r�r�r�r}r#r2r3r9r�)r�r�r�rrirUrrr �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)
r}r#r2r3r9rsr�r-�IsADirectoryErrorr�)r�Z	copy_funcr��src_filer�rjr}rrr 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)Nrirjrr�r�Frg)
r}r#r2r3r9r�r��copyfiler�rUr�rr�)r�r�rirjrr�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(): %srNTr�)r#r�rr2r3r4r5r�r-r;r�r�rr�r�rOr�r)r�rirjrKr?rrr �'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�rNTr�)r#r�rr2r3r4r5r�r�r�rr�r�rOr�r)r�rirjrKrrr �*test_dont_copy_file_onto_symlink_to_itself�s
��"z3TestCopy.test_dont_copy_file_onto_symlink_to_itselfr6r7r8r9c
Cs�zt�t�Wnty }z
|�d|�WYd}~nd}~wwz|�tjtjtt	�|�tjtjt
t�Wt�t�dSt�t�w)Nr:)r#r6rr-r;r�r��SpecialFileErrorr�r<�__file__r�)r�r?rrr �test_copyfile_named_pipe�s����z!TestCopy.test_copyfile_named_pipecCsl|��}|��}tj�|d�}tj�|d�}t|d�t�||�}|�tj�|��|�	t
|�t
|��dS)Nr^r�)r}r#r2r3r9r�r�r�r�r�rP)r�r�r�dst_filer�rUrrr �test_copyfile_return_value�s
z#TestCopy.test_copyfile_return_valuecCsX|��}tj�|d�}t|d�|�ttj||�|�t	tj||�|�
t|�d�dSr/)r}r#r2r3r9r�rr�r�rr�rP)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�)	r}r#r2r3r9r�r�r�r�)r�r�r�rjrrr �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�)r}r#r2r3r9rsr�r-r�r�r�r�)r�r�r�r�rjr}rrr �test_copyfile_copy_dirs

zTestCopy.test_copyfile_copy_dirN),r�r�r�rr�rer�r�rar#rir�rjrurr�Zskip_unless_xattrr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rsr�r�r�r��MACOS�SOLARISr�rrr�r�rrrr r]"sr

(��

?�



"



�

r]c@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�.tarrN)�
_create_filesr}r#r�r2r�r3�basenamer�
change_cwd�no_chdir�abspathrr�r�r��tarfileZ
is_tarfiler4�assertCountEqual�getnames)	r��root_dirrYr��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�rzryrZfile3Zsub2�outer)r}r#r2r3rXr9r�)r�rYr�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)�dry_run)r�r#r2r3r}r�rr�r�r�ru�
check_call�DEVNULLr�)r�r�rYr�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�r}r#r�r2r�r3r�rr�r�r�rr�r�r��zipfile�
is_zipfile�ZipFiler��namelist)	r�r�rYr�r�r�r�rX�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#r2r3r}r�rr�r�r�rur�r�r�r�r�rR)
r�r�rYr�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#r2r3r}r�rr�r�r�rr�ru�check_output�STDOUT�CalledProcessError�output�decoder;r=�format)	r�r�rYr�r�r�r�Zdetails�msgrrr �test_unzip_zipfile�s.�

����"�zTestArchives.test_unzip_zipfilecCs*|��}tj�|d�}|�tt|d�dS)Nr�rz)r}r#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)	NrrNr�r���owner�groupr�Z	kjhkjhkjgZoihohoh)
�UID_GID_SUPPORT�grp�getgrgid�pwd�getpwuidr�r#r2r3r}rr�r�)r�r�r�r�rYr�rXrrr �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#r2r3r}r�r�r�r�rr�r�rr�r�r�r4Z
getmembersr��uid�gidr�)	r�r�rYr�r�r��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�rOZ
orig_chdirrr �_chdirs
z2TestArchives.test_make_archive_cwd.<locals>._chdirrz�xxx file�chdir)r�)
r#rdr}rr�	swap_attrrr�r�r)r�Zcurrent_dirr�r	rrrr �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�
r}rr�r�r�rr�r#r2r��r�r�rrr �test_make_tarfile_in_curdir-s
P�z(TestArchives.test_make_tarfile_in_curdirc	Cr)Nrr�ztest.ziprrrrr �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)
NrzrpcS�tSr"��xrrrr �<lambda>?�z;TestArchives.test_register_archive_format.<locals>.<lambda>cSrr"rrrrr rAr)rpr`)rpr`rcSrr"rrrrr rDrr
cS�g|]\}}|�qSrr�rCrY�paramsrrr rEE�z=TestArchives.test_register_archive_format.<locals>.<listcomp>cSrrrrrrr rEIr)r��	TypeErrorrrr�rrM)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_converterr(r)r)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�rz)r�rWr�r#r2r3r}rrr�r�r��	ReadErrorrr�)r�r��	converterrr�rY�expectedr�r�r�Ztmpdir3rrr r#Us&
��"�z0TestArchives.check_unpack_archive_with_convertercCsV|j|dd�|j|dd�t�|��|�|�Wd�dS1s$wYdS)NZ
fully_trusted��filter�data)r$rZcheck_no_warnings)r�r�rrr �check_unpack_tarballms
"�z!TestArchives.check_unpack_tarballcC�|�d�dS)Nr��r+r�rrr �test_unpack_archive_tarsr�z$TestArchives.test_unpack_archive_tarcCr,)Nr�r-r�rrr �test_unpack_archive_gztarv�z&TestArchives.test_unpack_archive_gztarcCr,)N�bztarr-r�rrr �test_unpack_archive_bztarzr0z&TestArchives.test_unpack_archive_bztarz(AIX MAXDATA must be 0x20000000 or largercCr,)N�xztarr-r�rrr �test_unpack_archive_xztar~sz&TestArchives.test_unpack_archive_xztarcCsH|�d�|�t��|jddd�Wd�dS1swYdS)Nr�r*r()r$r�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)Nrp�	stuff.boo�xx)r�)r��extract_dir�extrar�rr �_boo�sz/TestArchives.test_unpack_registry.<locals>._booZBooz.booz.b2)r9rpr6r7ZBoo2r�)	rrrr�r	r
r�rMr�)r�r!r:rr�r �test_unpack_registry�s

�z!TestArchives.test_unpack_registryN)r�)&r�r�r�rZ
requires_zlibr�r�r�r�r�r��whichr�r�r�r�r�rr�rrrrr"r$r#r+r.r/Zrequires_bz2r2Z
requires_lzmar�rrrzr4r5r;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�rryZ
assertGreaterr:r?�assertGreaterEqualr@)r��usagertrrr �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)r2rr�s�r�r�rr �check_chown�s
�z(TestMisc.test_chown.<locals>.check_chown)rr)NN)r}rbr�r9r�r�r�rD�LookupErrorr r#�getuid�getgidr�r�r�r��KeyError)r�r�rrrKrEr�rrJr �
test_chown�s^
�����



�zTestMisc.test_chownN)r�r�r�r�r�rar�rCr�r#rPrrrr 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)r|z.Exe�r^r|�suffixz.EXE)r}�temp_dirrbrc�	temp_filer#r�rYr��S_IXUSRr~r�r2rxr^�file�env_path�curdir�extr�rrr �setUp�s�
zTestWhich.setUpcCs&tj|j|jd�}|�||jj�dS�Nr
)r�r<rWr^r�rUrY�r�rUrrr �
test_basicszTestWhich.test_basiccCs(tj|jj|jd�}|�||jj�dSr\)r�r<rUrYrTr�r]rrr �test_absolute_cmd	szTestWhich.test_absolute_cmdcCs�tj�|j�\}}tj�||j�}tj|d��tj	||j
d�}|�||�Wd�n1s0wYtj|jd��tj	||d�}|�|�Wd�dS1sTwYdSr\)
r#r2rxr^r3rWrr�r�r<rTr��assertIsNone)r�rY�tail_dir�relpathrUrrr �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<rWrsr�r�r3rYr`)r�rYrUrrr �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�rUrYr�r��access�W_OKr;r�r<rWr^r`r]rrr �test_non_matching_mode(s

z TestWhich.test_non_matching_modecCsltj�|j�\}}tj|d��tj|j|d�}|�	|tj�
||j��Wd�dS1s/wYdSr\)r#r2rxr^rr�r�r<rWr�r3)r�rYrarUrrr �test_relative_path2s
"�zTestWhich.test_relative_pathcCstjd|jd�}|�|�dS)Nzfoo.exer
)r�r<r^r`r]rrr �test_nonexistent_file8szTestWhich.test_nonexistent_filer�zpathext check is Windows-onlycCs<tj|jdd�|jd�}|�||jjdd�|j�dS)N���r
)r�r<rWr^r�rUrYrZr]rrr �test_pathext_checking=s"zTestWhich.test_pathext_checkingcCsTt���}|j|d<t�|j�}|�||jj�Wd�dS1s#wYdS�N�PATH)	r�EnvironmentVarGuardrXr�r<rWr�rUrY�r��envrUrrr �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�rm�
os.confstrT��return_value�create�defpath)rrnr�r[r\r^rrr#r�r�r<rWr`rorrr �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�rmrrTrsrv)r#r2r�rUrYrsr�rYr0r�r�r3rrn�pathsepr�r[r\r^rrr�r<rWr`r�r�)r�Zexpected_cwdrYrprUrrr �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)NrmrrT)rrurvrsr�)rrn�popr�r[r\r�rrr#r^r�r<rWr�rUrYrorrr �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
rmr�)r#r2r�r^rr�rnrXr�r<rWr`)r�rYrprUrrr �test_empty_path~s�
P�zTestWhich.test_empty_pathcCsPt���}|�dd�t�|j�}|�|�Wd�dS1s!wYdSrl)rrnrzr�r<rWr`rorrr �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�Tmp2rRr�PATHEXTr
)rbrcrTr#r�rYr�rVr~r�r2r�rrrnr�r<r��r�rZZtemp_filexyzZprogramrprUrrr �test_pathext�s�
"�zTestWhich.test_pathextcCs�d}tj|jd|d�}|�|j�tj�|j�}tj�	|�d}t
���}|�d�|d<tj
||jd�}|�||j�Wd�dS1sFwYdS)Nr~rrRr�;r�r
)rbrcrTr~r�r#r2r�rYrrrnr�r<r�r�rrr �test_pathext_with_empty_str�s�
"�z%TestWhich.test_pathext_with_empty_strN)r�r�r�r[r^r_rcrdr�r�rar#r�rgrhrir�rsr�rkrqrwryr{r|r}r�r�rrrr rQ�s4
�
�

rQc@seZdZdd�ZdS)�TestWhichBytescCsXt�|�t�|j�|_t�|j�|_t�|jj�|j_t�|j�|_t�|j	�|_	dSr")
rQr[r#r�r^rWrUrYrYrZr�rrr r[�s
zTestWhichBytes.setUpN)r�r�r�r[rrrr r��sr�c@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+rF)
r}r�rr#r2r3r�r�r4r5)r�r�rKrrr r[�s

"�zTestMove.setUpcCs�t|d��}|��}Wd�n1swYt�||�t|d��}|�||���Wd�n1s7wY|�tj�|��dS�NrM)	r4rOr��mover�r�r#r2r�)r�rirj�real_dstrK�contentsrrr �_check_move_file�s
��zTestMove._check_move_filecCsFtt�|��}t�||�|�|tt�|���|�tj�|��dSr")	rRr#rSr�r�r�r�r2r�)r�rirjr�r�rrr �_check_move_dir�szTestMove._check_move_dircCs|�|j|j|j�dSr")r�r�r�r�rrr �test_move_file��zTestMove.test_move_filecCs|�|j|j|j�dSr")r�r�rr�r�rrr �test_move_file_to_dir�r�zTestMove.test_move_file_to_dircCs"t�|j�}|�||j|j�dSr")r(r)r�r�rr�)r�rirrr �"test_move_file_to_dir_pathlike_src��z+TestMove.test_move_file_to_dir_pathlike_srccCs"t�|j�}|�|j||j�dSr")r(r)rr�r�r��r�rjrrr �"test_move_file_to_dir_pathlike_dst�r�z+TestMove.test_move_file_to_dir_pathlike_dstcC�|��dSr")r�r�rrr �test_move_file_other_fs��z TestMove.test_move_file_other_fscCr�r")r�r�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�)rbr�r}r�r�rr�r�rrrr �
test_move_dir�szTestMove.test_move_dircCr�r")r�r�rrr �test_move_dir_other_fs�r�zTestMove.test_move_dir_other_fsc
Cs,|�|j|jtj�|jtj�|j���dSr")r�r�rr#r2r3r�r�rrr �test_move_dir_to_dir�s�zTestMove.test_move_dir_to_dircCr�r")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")r�r�r#r2�seprr3r�r�rrr �test_move_dir_sep_to_dirs�z!TestMove.test_move_dir_sep_to_dirzrequires os.path.altsepc
Cr�r")r�r�r#r2�altseprr3r�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�rr�r�rr�rrr �"test_existing_file_inside_dest_dirs�z+TestMove.test_existing_file_inside_dest_dircCs*tj�|jd�}|�tjtj|j|�dS�Nr^)r#r2r3r�r�r�rr�r�rrr �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��
_destinsrcrrr�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�rrr�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�r�r�r�rU�samefiler�rrr �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�r�rr�rUr�)r�r�rjZ
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�Nr_r^r`)r#r2r3r�r�rr�r�r�rUr��realpath�r�rirjrrrr �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�rr�r�r�rUr�r�rrr �test_move_dir_symlinkPs
zTestMove.test_move_dir_symlinkc	Cs6t�|j|j�}|�|tj�|jtj�|j���dSr")	r�r�r�rr�r#r2r3r�r]rrr �test_move_return_value\s�zTestMove.test_move_return_valuecCs6t�|jtj�|jd��}|�|tj�|jd��dSr�)r�r�r�r#r2r3rr�r]rrr � test_move_as_rename_return_valueasz)TestMove.test_move_as_rename_return_valuecs8g��fdd�}tj|j|j|d�|�t��d�dS)NcrAr"r�rB�Zmovedrr rDhrEz7TestMove.test_move_file_special_function.<locals>._copyr3rp)r�r�r�rr�r��r�rDrr�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)NcrAr"r�rBr�rr rDprEz6TestMove.test_move_dir_special_function.<locals>._copy�childZchild1r3r)rr�r#r2r3r�r�r�rr�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")r}r�r#r2r3r�r��upperrbr�r�r�rTr�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_SRCrr�r�r�r-r�r��
TESTFN_DSTr�rSr�rr�r2r3r�rr�rrr �test_move_dir_permission_denied�s0

��
�z(TestMove.test_move_dir_permission_deniedN)+r�r�r�r[r�r�r�r�r�r�r*r�r�r�r�r�r�r�r�r�r#r2r�r�r�r�r�r�rr�r�r�r�r�r�r�r�r�r�rar�r�r�rrrr r��sj	




		


	���r�c@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 rO�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_type�exc_val�exc_tbrrr �__exit__�s
zTestCopyFile.Faux.__exit__)FT)
r�r�r�r�r�r�r�rOr�r�rrrr �Faux�s
r�c	Cs�ddd�}t�td|��,|�t��t�dd�Wd�n1s#wYWd�dSWd�dS1s;wYdS)NrNcSs|dkrtd��dS)N�srcfilezCannot open "srcfile"r��r�r7rrr �_open�s�z4TestCopyFile.test_w_source_open_fails.<locals>._openr4r��destfile�rN)rrr�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)NrNcs |dkr�S|dkrtd��dS)Nr�r��Cannot open "destfile"r�r��r�rr r��s
�z2TestCopyFile.test_w_dest_open_fails.<locals>._openr4r�r�rrp)r�r�)r�rrr�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)NTrNc�|dkr�S|dkr�SdS�Nr�r�rr��r�r�rr r���
�z3TestCopyFile.test_w_dest_close_fails.<locals>._openr4r�r�rrp)r�r�)r�rrr�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)
NTrNcr�r�rr�r�rr r��r�z5TestCopyFile.test_w_source_close_fails.<locals>._openr4r�r�rr�)r�rrr�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")rLr�FILESIZE��clsrrr �
setUpClass
	szTestCopyFileObj.setUpClasscCst�t�t�t�dSr")rrfrr<r�rrr �
tearDownClass	s
zTestCopyFileObj.tearDownClasscC�t�t�dSr"�rrfr<r�rrr �tearDown	r�zTestCopyFileObj.tearDownc	c�v�ttd��+}ttd��
}||fVWd�n1swYWd�dSWd�dS1s4wYdS�NrMr+�r4rr<r�rrr �	get_files	����"�zTestCopyFileObj.get_filesc	Cs~t|d��0}t|d��}|�|��|���Wd�n1s wYWd�dSWd�dS1s8wYdSr�)r4r�rO)r�rirj�fsrc�fdstrrr �assert_files_eq	s��"�zTestCopyFileObj.assert_files_eqcCsH|���\}}t�||�Wd�n1swY|�tt�dSr")r�r��copyfileobjr�rr<r�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_offsetrz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�r[r\r�r�rr<r��	call_argsrbrcr#rdr5rYr~rrfr�)r��mrKr�rrr �
test_win_impl2	s,�����zTestCopyFileObj.test_win_implN)r�r�r�r��classmethodr�r�r��
contextlib�contextmanagerr�r�r�r�r�r�r�r#rYr�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�dS1swYdSr�)rLrr�r4rO�FILEDATA)r�rKrrr r�W	s"�z_ZeroCopyFileTest.setUpClasscCr�r")rrfrr�rrr r�^	r0z_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�r[r�rrr �resetn	sz_ZeroCopyFileTest.resetc	Cs�|���\}}|�||�Wd�n1swY|�ttdd�|j�|���/\}}tj�d��}t	�
tt�Wd�n1sEwYWd�dSWd�dS1s]wYdS)NT�r6zshutil.copyfileobj)r�rr�rPr<r�r�r[r\r�r�r)r�rirjr�rrr �test_regular_copyv	s���"�z#_ZeroCopyFileTest.test_regular_copyc	Cs�|�|j�|���%\}}|�t��|�||�Wd�n1s#wYWd�n1s2wY|�ttdd�|j	�dS)NTr)
r~rr�r�r�rr�rPrr�r�rrr �test_same_file�	s���z _ZeroCopyFileTest.test_same_filecCsZtjt��d�}|�t��}t�|d�Wd�n1swY|�|j	j
|�dS)Nr��new)rbr�r#rdr�r�r�r�r�r�r�)r�rYr�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)Nrirjc�
t���Sr"�rrfr)rgrr r�	�
z3_ZeroCopyFileTest.test_empty_file.<locals>.<lambda>crr"rr)rhrr r�	r	r+rMTrr=)rr~r4rr�rPr�r)rhrgr �test_empty_file�	s����z!_ZeroCopyFileTest.test_empty_filecCsJtjj|jtd��|�ttjtt	�Wd�dS1swYdS)Nr)
r�r[r\�
PATCHPOINT�ZeroDivisionErrorr�r�r�rr<r�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�r[r\rrr�EINVALr�r�r
rr�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�r[r\rrr�ENOSPCr�r�rr�rrr �test_filesystem_full�	s

���"�z&_ZeroCopyFileTest.test_filesystem_fullN)r�r�r�r�r�rr�r�r�r�r�r�r�rrrrrr
r
rrrrrr 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�r4r<r�r
rr�r�r�rPr�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)NrMr)
r4rrrr�r
rr�r��seekr�rOr�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)rVrr�EBADFr�r1Z
orig_sendfilerr r\�	s
zDTestZeroCopySendfile.test_exception_on_second_call.<locals>.sendfilerT)rur)r#r\r�r[r\r�r�rr�rr�r�rr)r�r\rirjr�rrr �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�r[r\rr�r�rr�rPr<r��r�r�rirjrrr �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�rtTr)r�r[�Mock�st_sizer\r�r�rr�rPr<r��r�r[r�rirjrrr �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@rr"Tr)
r�r[r#r�r$r\r�r�rr�rPr<r�r%rrr �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)
NrrrrshelloTr�3i�)r�r[r\rr�r�r�rr<r�r�r#r2�getsizerrfr9r~)r�r��	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)NrrT)r�r[r\rrr�ENOTSOCKr�r�r
r�rr�rr<�_USE_CP_SENDFILEr rrr �test_file2file_not_supported
s(
������	�
�z1TestZeroCopySendfile.test_file2file_not_supportedN)
r�r�r�rrrrrr!r&r'r+r.rrrr r�	s		


rz
macOS onlyc@seZdZdZdd�ZdS)�TestZeroCopyMACOSzposix._fcopyfilecCst�||tj�Sr")r��_fastcopy_fcopyfile�posix�_COPYFILE_DATAr�rrr r0
r�zTestZeroCopyMACOS.zerocopy_funN)r�r�r�rrrrrr r/,
sr/c@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_sizerA�columns�lines)r�rHrrr �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)rrnr�r4r�r5r6�r�rprHrrr �test_os_environ_first?
s

�

�z)TestGetTerminalSize.test_os_environ_firstcCs`t���}d|d<d|d<t��}Wd�n1swY|�|jd�|�|jd�dS)Nrzr8Zyyyr9r)rrnr�r4rAr5r6r:rrr �test_bad_environN
s

�z$TestGetTerminalSize.test_bad_environz
not on ttyr4zneed os.get_terminal_size()c
Cs�	z
t�ddg�����}Wntttjfy |�d�Ynwt|d�t|d�f}t	�
��}|d=|d=t��}Wd�n1sFwY|�
||�dS)NZsttyrHzstty invocation failedrprr9r8)rur�r�rxr�r-r�r;ryrrnr�r4r�)r�rHr'rprrrr �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)Nr9r8�
__stdout__)�
�)�fallbackr?r@r,r-r.)��(rBrC)
rrnrrrsr�r4r�r5r6r4r#�devnull)r�rprHrKrrr �
test_fallbackn
s$
����"�z!TestGetTerminalSize.test_fallbackN)r�r�r�r7r;r<r�r�r#�isattyrsr>rerar=rErrrr r34
s
�r3c@seZdZ	dd�ZdS)�PublicAPITestscCsP|�ttd��gd�}ttd�stjdkr|�d�|�ttj�t|��dS)N�__all__)r�r�rcrpr�r�r�r�rrr��	ExecErrorrrrrrrr
rrrDr<r4r�statvfsrr>)	r�rar�r#rYrVr�r$rH)r�Z
target_apirrr �test_module_all_attribute�
s

z(PublicAPITests.test_module_all_attributeN)r�r�r�rKrrrr rG�
srG�__main__)F)Vr�Z
unittest.mockr�rbrsr�r#Zos.pathrr(r(rur>r@r�rrrrrrrrr	r
rrr
r�r�r1�ImportErrorrrZtest.supportrZtest.support.os_helperrrrr<r�r�r�rr�r�rrr�r�r�r�r[r\�AssertionErrorr�r!r*r9rLrPrWrmZSUPPORTS_SENDFILErzr{ZTestCaser�r�r]r�r=rQr�r�r�r�r�r�r�rr/r3rGr��mainrrrr �<module>s�8����

	dP<
s\JdvN
�