Your IP : 216.73.216.85


Current Path : /opt/alt/python39/lib64/python3.9/test/__pycache__/
Upload File :
Current File : //opt/alt/python39/lib64/python3.9/test/__pycache__/test_shutil.cpython-39.opt-2.pyc

a

XC?h���@sTddlZddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddl
Z
ddlZddlZddlmZmZmZmZmZmZmZmZmZmZmZmZddlZddlZzddlZWney�dZYn0ddl m!Z!ddl"m#Z#m$Z$ddl"m%Z%e#dZ&e#dZ'e#dZ(ej)�*d	�Z+ej)�*d
�Z,ej)dd�dkZ-zddl.Z.ddl/Z/d
Z0Wne�y�dZ0Yn0zddl1Z1Wne�y�dZ1Yn0dd�Z2dd�Z3dBdd�Z4dd�Z5dCdd�Z6dd�Z7dd�Z8e8�Z9dd�Z:Gdd �d �Z;Gd!d"�d"e;ej<�Z=Gd#d$�d$e;ej<�Z>Gd%d&�d&e;ej<�Z?Gd'd(�d(e;ej<�Z@Gd)d*�d*e;ej<�ZAGd+d,�d,e;ej<�ZBGd-d.�d.eB�ZCGd/d0�d0e;ej<�ZDGd1d2�d2ej<�ZEGd3d4�d4ej<�ZFGd5d6�d6eG�ZHe�Ie9d7�Gd8d9�d9eHej<��ZJe�Ie+d:�Gd;d<�d<eHej<��ZKGd=d>�d>ej<�ZLGd?d@�d@ej<�ZMeNdAk�rPe�O�dS)D�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)�TESTFN�FakePath)�warnings_helper�2Z_SRCZ_DST�darwinZsunos�ZaixTFcOstttdd�d��dS)NZEXDEV�zInvalid cross-device link)�OSError�getattr�errno��args�kwargs�r�5/opt/alt/python39/lib64/python3.9/test/test_shutil.py�_fake_rename6srcst����fdd��}|S)Ncs0z"tj}tt_�|i|��W|t_S|t_0dS�N)�os�renamer)rrZbuiltin_rename��funcrr�wrap;s�zmock_rename.<locals>.wrap)�	functools�wraps)r#r$rr"r�mock_rename:sr'cCsVt|t�rtjj|�}t||r"dnd��}|�|�Wd�n1sH0YdS)N�wb�w)�
isinstance�tupler �path�join�open�write)r,Zcontent�binary�fprrr�
write_fileEs
r2cCsrdd�}t|d�}d�dd�t|�D��}t|d��*}|||�D]}|�|�q@Wd�n1sd0YdS)Ncss&||kr|V||8}q|r"|VdSrr)�total�steprrr�chunksSs

zwrite_test_file.<locals>.chunksi �cSsg|]}t�tj����qSr)�randomZchoice�stringZ
ascii_letters�encode)�.0�irrr�
<listcomp>\s�z#write_test_file.<locals>.<listcomp>r()�minr-�ranger.r/)r,�sizer5�bufsize�chunk�fZcsizerrr�write_test_fileQs

�*rCcCsTt|t�rtjj|�}t||r"dnd��}|��Wd�S1sF0YdS)N�rb�r)r*r+r r,r-r.�read)r,r0r1rrr�	read_filecs
rGcCs|g}tt�|��D]d}tj�||�}tj�|�rltj�|�sl|�|d�t|�D]}|�|d|�qRq|�|�q|S)N�/)	�sortedr �listdirr,r-�isdir�islink�append�rlistdir)r,�res�name�p�nrrrrNosrNc
Cs�ttd�sdSd}d}�z�tjdt��dd�� }|j}|�d�Wd�n1sT0Yt|d���}tjdt��dd���}|j}|��}|��}zt�	||dd�WnTt
�yYWd�Wd�W|dur�t�|�|dur�t�|�dS0Wd�Wd�W|du�r0t�|�|du�rDt�|�d	SWd�n1�s^0YWd�n1�s~0YW|du�r�t�|�|du�r�t�|�n*|du�r�t�|�|du�r�t�|�0dS)
N�sendfileFr(��dir�deletes
0123456789rDr�T)
�hasattrr �tempfile�NamedTemporaryFile�getcwdrPr/r.�filenorSrr�unlink)�srcname�dstnamerB�src�dstZinfdZoutfdrrr�supports_file2file_sendfile{sH
(

�



�F


�


rbcCsJtrBtjdkrBt�dtj�}|�d�d��d}t|d�dkSdSdS)	Ni���z/usr/bin/dump -o %s�
�����i T)�AIX�sys�maxsize�
subprocessZ	getoutput�
executable�split�int)ZhdrsZmaxdatarrr�
_maxdataOK�s
rnc@seZdZddd�ZdS)�BaseTestNcCs$tj|t��d�}|�tj|�|S)N)�prefixrU)rY�mkdtempr r[�
addCleanupr�rmtree)�selfrp�drrrrq�szBaseTest.mkdtemp)N)�__name__�
__module__�__qualname__rqrrrrro�sroc@s�eZdZdd�Zejdd��Zejdd��Ze�	e
d�dd	��Ze�	e
d�d
d��Zdd
�Z
e�ejdd�dkd�e�eed�o�e��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)rqr r,r-�mkdirr2�fsencode�assertIsInstance�bytes�shutilrs)rt�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)	NrU�linkcs��|�dSr�rM�r��errorsrr�onerror�sz8TestRmTree.test_rmtree_fails_on_symlink.<locals>.onerror�r�rerrW)rqr r,r-r{�symlink�assertRaisesrrrs�
assertTrue�exists�lexists�assertEqual�len�assertIsrLr}�rtr�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�|�q<tj�|d�}t|d�tj�|d�}t�||�tj�|d�}t�||�tj�|d�}	t�||	�t�|�|�	tj�
|��|�tj�
|��|�tj�
|��dS�	N�dir1�dir2�dir3�file1rz�link1�link2�link3)rqr r,r-r{r2r�rrs�assertFalser�r��
rtr�r�r�r�rur�r�r�r�rrr�test_rmtree_works_on_symlinks�s$

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)	NrUr�cs��|�dSrr�r�r�rrr��sz:TestRmTree.test_rmtree_fails_on_junctions.<locals>.onerrorr�rerrW)rqr r,r-r{�_winapi�CreateJunctionrrrr]r�rrrsr�r�r�r�r�r�rLr}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�|�q<tj�|d�}t|d�tj�|d�}t�||�tj�|d�}t�||�tj�|d�}	t�||	�t�	|�|�
tj�|��|�tj�|��|�tj�|��dSr�)
rqr r,r-r{r2r�r�rrsr�r�r�r�rrr�test_rmtree_works_on_junctions�s$

z)TestRmTree.test_rmtree_works_on_junctionscs�tj|��d�}|�ttj|�tj|dd�|��}t|dfd�tj	�
|d�}|�t��}t�|�Wd�n1s|0Y|tj	�
|d�g}|�|j
j|�|�tj	�|��tj|dd�|�tj	�|��g��fdd�}tj||d	�|�t��d
�|��ddtj�|��dd|�|��dd
dt�|��dd
dj|�|��ddtj�|��dd|�|��dd
dt�|��dd
dj|�dS)
N�rUT��
ignore_errorsZtstfile�z*.*cs��|�dSrr�r�r�rrr�'sz.TestRmTree.test_rmtree_errors.<locals>.onerrorr�rWrre)rY�mktemprqr��FileNotFoundErrorrrsr2r r,r-�NotADirectoryError�assertIn�	exception�filenamer�r�r�r�r��scandirr}�rmdir)rtr��tmpdir�cmZ
possible_argsr�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{rrrrrsr,r-�child_file_path�child_dir_pathr�create_empty_file�stat�st_mode�S_IREAD�S_IEXEC�chmod�check_args_to_onerrorr�)rtZold_dir_modeZold_child_file_modeZold_child_dir_modeZnew_moderrr�
test_on_error5s*

�zTestRmTree.test_on_errorcCs�|jdkr�|tjur$|�||j�n:|tjur>|�||j�n |�|tj�|�	|t
|jg�|�t|dt
��|jd7_n4|�|tj�|�|t
�|�t|dt
��d|_dS)NrWrrer)r�r r]r�r�r�r�r�rJr�rr��
issubclassr)rtr#�arg�excrrrr�Ts


z TestRmTree.check_args_to_onerrorcsRzDtj��fdd�}|t_t�t�ttdfd�t�t�W�t_n�t_0dS)Ncs|tkrt��n�|�SdSr)rr)�fnrr�Z
orig_lstatrr�raiserrszFTestRmTree.test_rmtree_does_not_choke_on_failing_lstat.<locals>.raiserrz)r �lstatr{rr2rrs)rtr�rr�r�+test_rmtree_does_not_choke_on_failing_lstatos
z6TestRmTree.test_rmtree_does_not_choke_on_failing_lstatcs�tjtjtjtjhtjko0tjtjvo0tjtjv}|r�|�	t
j�|�	t
jj
�|��}tj�|d�}t�|�zBt
j}Gdd�dt���fdd�}|t
_|��t
j|�W|t
_q�|t
_0n|�t
j�|�t
jj
�dS)Nr�c@seZdZdS)zHTestRmTree.test_rmtree_uses_safe_fd_version_if_available.<locals>.CalledN)rvrwrxrrrr�Called�r6r�cs��dSrrr�r�rr�_raiser�szITestRmTree.test_rmtree_uses_safe_fd_version_if_available.<locals>._raiser)r r.r�r]r��supports_dir_fdrJ�supports_fd�supports_follow_symlinksr�r�_use_fd_functionsrsZavoids_symlink_attacksrqr,r-r{Z_rmtree_safe_fd�	Exceptionr�r�)rtr��tmp_dirruZreal_rmtreer�rr�r�-test_rmtree_uses_safe_fd_version_if_availables,�
�
�
z8TestRmTree.test_rmtree_uses_safe_fd_version_if_availablecCs<tj|��d�\}}t�|�|�ttj|�t�	|�dS�Nr�)
rYZmkstemprqr �closer�r�rrs�remove)rtZhandler,rrr�test_rmtree_dont_delete_file�s
z'TestRmTree.test_rmtree_dont_delete_filec
Cs�t�t�zbtj�td�}tj�td�}t�|�t�||�|�ttj	|�tj	|dd�Wtj	tdd�ntj	tdd�0dS)N�cheese�shopTr�)
r r{rr,r-r�r�rrrs�rtr`rarrr�test_rmtree_on_symlink�s

z!TestRmTree.test_rmtree_on_symlinkc
Cs�t�t�zztj�td�}tj�td�}t�|�ttj�|d�d���t�||�|�	t
tj|�tj|dd�Wtjtdd�ntjtdd�0dS)Nr�r�Zspamr(Tr�)
r r{rr,r-r.r�r�r�r�rrrsr�rrr�test_rmtree_on_junction�s

z"TestRmTree.test_rmtree_on_junction)rvrwrxr�r�skip_unless_symlinkr�r��unittest�
skipUnlessr�r�r�r��skipIfrh�platformrXr r�r�r�r�r�r�r�r�rrrrry�s2	





$��

ryc@s�eZdZdd�Zdd�Zejdd��Zdd�Zd	d
�Z	dd�Z
ej�
d
�dd��Zdd�Ze�eed�d�ejdd���Zdd�Zejdd��Zejdd��Zdd�Zdd�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)rqr r,r-rrrrs�dirnamer2r{�copytreer��isfilerKrGr��rt�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�n1�sL0YdS)
Nznonexisting.txtr�Zexisting_dirzexisting.txtzwill be replacedzhas been replacedT)Z
dirs_exist_okF)rqrrrrsr2r r{r,r-r�r�r�rKrGr�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�r�t�|t	j
t	jB�ttd	�r�tt	d
�r�t�|t	j
�t�|�}tj||dd�|�tj�tj�|dd���t�tj�|dd��}tjd
k�r8|�d��r8|dd�}|�|tj�|d��t�|�}	ttd��rt|�|	j|j�ttd	��r�|�|	j|j�dS)Nr`ra�subzfile.txtrzr�zsub/link�lchmod�lchflags�	UF_NODUMPT�Zsymlinks�ntz\\?\�)rqr r,r-r{r2r�rXr�r��S_IRWXU�S_IRWXOr�r�r�rr�r�rL�readlinkrP�
startswithr�r��st_flags)
rtr�r�r�Zsub_dir�src_link�dst_link�src_statr��dst_statrrr�test_copytree_symlinks�s8

�


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�zft�dd�}tj	|||d�|�
|||d���|�|||d���|�|||d���Wt�|�nt�|�0zjt�dd
�}tj	|||d�|�|||d���|�|||dd	���|�|||dd���Wt�|�nt�|�0zTdd�}tj	|||d�|�|||dd	d
���|�|||dd���Wt�|�nt�|�0Wt�|�t�tj�
|��nt�|�t�tj�
|��0dS)Nr�r�r�ztest.tmpr�r�Z	test_dir2�subdirZsubdir2ztest.pyz*.tmp��ignorezsubdir*cSsfg}|D]X}tj�||�}tj�|�rB|��ddkrB|�|�qtj�|�ddvr|�|�q|S)Nrdrz.py)r r,r-rKrlrM�splitext)r`�namesrOrPr,rrr�_filter1s�z8TestCopyTree.test_copytree_with_exclude.<locals>._filter)r r,r-r�rqr2r{r�ignore_patternsr�r�r�rsr�)rtr-r�r�r�Zpatternsrrrr�test_copytree_with_exclude	sR�
�
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�q>gSr)rMr}�str�listr�r��set)r`rrP�Zinvokationsrtrr�_ignoreXs
z?TestCopyTree.test_copytree_arg_types_of_ignore.<locals>._ignorer�rr�	)r r,r-r�rqr{r2rr�r��pathlib�Pathrr�r}�DirEntryr�r�)rtr-r�r�r�rr�Z
src_dir_entryrrr�!test_copytree_arg_types_of_ignoreJs8
	���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�re)rqr r,r-r{rrrrsr�r2rYrr�r�r�r�rl)rtr�r�r�Zrestrictive_subdirZrestrictive_subdir_dstrrr�!test_copytree_retains_permissionsts6
���
�z.TestCopyTree.test_copytree_retains_permissionszos.chmodcCs�|��}tj�|��d�}|�tj|�|�tjtj�|��td�|_	|�
tj��t�||�Wd�n1sv0YdS)Nr�zka-boom)
rqr r,r-rrrrsr��PermissionError�side_effectr�rr�)rtZ
mock_patchr�r�rrr�test_copytree_winerror�s
z#TestCopyTree.test_copytree_winerrorcs�����fdd�}g�����tj���d��ttj��d�d��}|��Wd�n1s`0Ytj	��|d���
t��d�dS)NcsR��d���|t���|t���|tj��d����|tj��d��dS�Nrz)rMr}rr�r r,r-)r�r��ra�flagrtr`rr�custom_cpfun�s

zETestCopyTree.test_copytree_custom_copy_function.<locals>.custom_cpfunr�rzr)�Z
copy_functionre)rqrYr�r.r r,r-r�rr�r�r�)rtrrBrrr�"test_copytree_custom_copy_function�s&z/TestCopyTree.test_copytree_custom_copy_function�mkfifo�requires os.mkfifo()c
Cs2t�t��ztj�td�}t�|�tj�|d�}zt�|�Wn2tyt}z|�d|�WYd}~n
d}~00zt�	tt
�Wn^tjy�}zD|jd}|�
t|�d�|d\}}}|�
d||�WYd}~nd}~00|�d�Wtjtdd	�tjt
dd	�ntjtdd	�tjt
dd	�0dS)
NrZmypipe�os.mkfifo(): %srrez`%s` is a named pipez$shutil.Error should have been raisedTr�)r r{rr,r-rr�skipTestrr��TESTFN2rrr�r��failrs)rtr�pipe�er�r`raZ	error_msgrrr�test_copytree_named_pipe�s*

$
&�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�cs��||f�dSrr��r`ra�Zcopiedrr�_copy�sz6TestCopyTree.test_copytree_special_func.<locals>._copyrrW)
rqr r,r-r2r{rr�r�r�)rtr�r�r*rr)r�test_copytree_special_func�sz'TestCopyTree.test_copytree_special_funccCs�|��}tj�|��d�}t�dtj�|d��t�tj�|d��t|ddfd�|�tt	j
||�tj�|��d�}t	j
||dd�|�dt�|��tj�|��d	�}t	j
||dd
�|�
dt�|��dS)Nr�Z
IDONTEXISTr�r�r��destination2T)Zignore_dangling_symlinksZdestination3r�)rqr r,r-r�r{r2r�rrr��assertNotInrJr��rtr�r�rrr�test_copytree_dangling_symlinks�sz,TestCopyTree.test_copytree_dangling_symlinksc	Cs.|��}tj�|��d�}t�tj�|d��ttj�|dd�d��Wd�n1sZ0Ytjtj�|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_directoryFr�r,)rqr r,r-r{r.r�rr�r�rLr�rJr�r.rrr�test_copytree_symlink_dir�s �z&TestCopyTree.test_copytree_symlink_dircCs\|��}|d}|�tj|d�tj�|d�}t|d�t�||�}|�	dgt�
|��dS)N�destTrz)rqrrrrsr r,r-r2r�r�rJ)rtr�r�r`�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)rqrrrrsr r,r-�makedirsr2r�r�rJ)rt�base_dirr�r�r`r2rrr�test_copytree_subdirectorys

z'TestCopyTree.test_copytree_subdirectoryN)rvrwrxr�r�rr�rr	rrr��mock�patchrrr�rXr r'r+r/r0r3r7rrrrr��s(
A*





r�c@s�eZdZejdd��Ze�ee	d�d�ejdd���Z
e�ee	d�d�ejdd	���Zejd
d��Z
e�ee	d�o�eed
�o�eed�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�d9d:��Z!d;d<�Z"d=d>�Z#e�e$�p�e%�p�e&d?�d@dA��Z'dBdC�Z(dDS)E�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�tjdk�r�t�|tj
�t
�||�|�t�|�jt�|�j�t�|tj
�t
�||�|�t�|�jt�|�j�t�|tj
�t
�||�|�t�|�jt�|�j�dS)Nrz�bar�baz�quuxr�)rqr r,r-r2r�r�r�r��S_IRWXGr��assertNotEqualr�r�copymoder�rP�rtr�r`rar�r�rrr�test_copymode_follow_symlinkss0

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�Nrzr;r<r=F��follow_symlinks)rqr r,r-r2r�r�r�r�r>r�r�rr@r�r�r�r?rArrr� test_copymode_symlink_to_symlink8s0


�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�dSrC)rqr r,r-r2r�rr@rArrr�*test_copymode_symlink_to_symlink_wo_lchmodVs

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�r�t�|tj
�ttd�r�ttd�r�t�|tj�t�|�}ttd��r tj||d	d
�|�	|jt�|�j�tj||dd
�t�|�}tjtjv�rpdD]"}	|�t||	�t||	�d
��qLttd��r�|�|j|j�ttd��r�t|d��r�|�|j|j�tj||dd
�|�tt�|�jt�|�j�dk�dS)Nrzr;r<�quxgE@r�r�r�TrDF��st_atime�st_mtimerer�g�������?)rqr r,r-r2r��utimerJrKr?r�rXr�r�r�r�r�r�copystatr�r��assertLessEqualrr�r�r��abs)
rtr�r`rar�r�r��
src_link_statZ
dst_link_stat�attrrrr�test_copystat_symlinksfsJ


�



��zTestCopy.test_copystat_symlinks�chflags�
EOPNOTSUPP�ENOTSUPz)requires os.chflags, EOPNOTSUPP & ENOTSUPcCs�|��}tj�|d�}tj�|d�}t|d�t|d�dd�}tj}zVtjtjfD]}||�t_t	�
||�qT|tjtj�t_|�tt	j
||�W|t_n|t_0dS)Nr��file2�xxxcst��dd���fdd�
}|S)NTrDcs��_��dSr)r)r,�flagsrE��errZexrr�_chflags_raiser�szlTestCopy.test_copystat_handles_harmless_chflags_errors.<locals>.make_chflags_raiser.<locals>._chflags_raiser�r)rZr[rrYr�make_chflags_raiser�szSTestCopy.test_copystat_handles_harmless_chflags_errors.<locals>.make_chflags_raiser)
rqr r,r-r2rSrrTrUrrMr�r)rtr�r�rVr]Zold_chflagsrZrrr�-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	�}z4tj�|t_t��|�|�dt�
|��W�t_n�t_0d
d���fdd
�
}z"tj
�|t_
t��|�W�t_
n�t_
0tj�|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)Nrzr;�user.foo�42zuser.bar�43�EPERMcs&|dkr��n�|||fi|��dS)Nr_r)�fnamerQ�valr)�
orig_setxattr�os_errorrr�_raise_on_user_foo�sz3TestCopy.test_copyxattr.<locals>._raise_on_user_fooTrDcs |�krttjd���||d�S)NzOperation not supportedrD)rrrU)rcrE)�orig_listxattrr`rr�
_raise_on_src�sz.TestCopy.test_copyxattr.<locals>._raise_on_srcZthe_originalZthe_original_rozuser.the_valuesfiddlyi$Zthe_copyZthe_copy_ro)rqr r,r-r2r�
_copyxattr�setxattrr�rI�	listxattr�getxattrr�rrrbr�r�rM)rtr�rargriZsrcroZdstror)rhrerfr`r�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)
Nrzr<ztrusted.foor`raFrDr;rH)
rqr r,r-r2r�rkrrjr�rmr�r)rtr�r`r�rar�rrr�test_copyxattr_symlinks�s 

z TestCopy.test_copyxattr_symlinkscCsPd}|��}t||fd�tj�||�}|��}|||�tj�||�}||fS)Nr�rW)rqr2r r,r-)rt�methodrcr�r��tmpdir2rVrrr�
_copy_file	s
zTestCopy._copy_filecCsB|�tj�\}}|�tj�|��|�t�|�j	t�|�j	�dSr)
rsr�copyr�r r,r�r�r�r�)rtr�rVrrr�	test_copyszTestCopy.test_copycCs|��}tj�|d�}tj�|d�}tj�|d�}t|d�t�||�ttd�rft�|tj	tj
B�tj||dd�|�
tj�|��|�t|�t|��t�|�tj||dd�|�tj�|��|�t�|�t�|��ttd��r|�t�|�jt�|�j�dS)Nrzr;r<r�TrDF)rqr r,r-r2r�rXr�r�r�r�rrtr�rLr�rGr�r�r�r�r�)rtr�r`rar�rrr�test_copy_symlinkss&



�zTestCopy.test_copy_symlinksrLzrequires os.utimecCs�|�tj�\}}|�tj�|��t�|�}t�|�}|�|j	|j	�dD] }|�
t||�t||�d�qJttd�r�t|d�r�|�t|d�t|d��dS)NrIrerSr�)
rsr�copy2r�r r,r�r�r�r�rNrrX)rtr�rVZ
file1_statZ
file2_statrQrrr�
test_copy22s

��zTestCopy.test_copy2c	Cs�|��}tj�|d�}tj�|d�}tj�|d�}t|d�t�||�ttd�rft�|tj	tj
B�ttd�r�ttd�r�t�|tj�t�|�}t�
|�}tj||dd�|�tj�|��|�t|�t|��t�|�tj||d	d�|�tj�|��|�t�|�t�|��t�
|�}tjtjv�rVd
D]"}|�t||�t||�d��q2ttd��r�|�|j|j�|�|j|j�ttd��r�t|d��r�|�|j|j�dS)
Nrzr;r<r�r�r�TrDFrIrer�)rqr r,r-r2r�rXr�r�r�r�r�r�r�rrwr�rLr�rGr�r�r�rLr�rNrr�r?r�)	rtr�r`rar�r�rPrrQrrr�test_copy2_symlinksCs<





�zTestCopy.test_copy2_symlinkscCsr|��}tj�|d�}tj�|d�}t|d�t�|dd�t�||�|�t�	|d�t�	|d��t�
|�dS)Nrzr;r_r`)rqr r,r-r2rkrrwr�rmr�)rtr�r`rarrr�test_copy2_xattrfs


�zTestCopy.test_copy2_xattrcCs�tjtjfD]v}|��}|��}tj�|d�}t|d�|||�}|�|tj�|d��||tj�|d��}|�|tj�|d��qdS)Nrzr;)	rrtrwrqr r,r-r2r�)rtr�r�r�r`r2rrr�test_copy_return_valuess

zTestCopy.test_copy_return_valuecCs|�tj�dSr)�_test_copy_dirrrt�rtrrr�
test_copy_dirszTestCopy.test_copy_dircCs|�tj�dSr)r|rrwr}rrr�test_copy2_dir�szTestCopy.test_copy2_dircCsx|��}tj�|d�}|��}tj�|d�}t|d�tjdkrFt}nt}|�	||||�|�	||||�|||�dS�Nrz�does_not_exist/�win32)
rqr r,r-r2rhr�r�IsADirectoryErrorr�)rtZ	copy_funcr��src_filer�rarZrrrr|�s

zTestCopy._test_copy_dircCs�|��}tj�|d�}tj�|d�}tj�|d�}tj�|d�}t|d�t�||�tj||dd�|�tj�	|��|�
t�|�t�|��t�||�|�tj�	|��dS)Nr`rar�r�rzFrD)
rqr r,r-r2r�r�copyfiler�rLr�r�r�)rtr�r`rar�r�rrr�test_copyfile_symlinks�s
zTestCopy.test_copyfile_symlinksr�zrequires os.linkc
Cst�t�tj�td�}tj�td�}z�t|d��}|�d�Wd�n1sR0Yzt�||�Wn2ty�}z|�	d|�WYd}~n
d}~00|�
tjtj
||�t|d�� }|�|��d�Wd�n1s�0Yt�|�Wtjtdd�ntjtdd�0dS)	Nr�r�r)�cheddarz
os.link(): %srETr�)r r{rr,r-r.r/r�rr"r�rrr�r�rFr�rs)rtr`rarBr&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�}z�t|d��}|�d�Wd�n1sR0Yt�d|�|�t	j
t	j||�t|d�� }|�|�
�d�Wd�n1s�0Yt�|�Wt	jtdd�nt	jtdd�0dS)Nr�r�r)r�rETr�)r r{rr,r-r.r/r�r�rrr�r�rFr�rs)rtr`rarBrrr�*test_dont_copy_file_onto_symlink_to_itself�s
(.z3TestCopy.test_dont_copy_file_onto_symlink_to_itselfrr c
Cs�zt�t�Wn2ty@}z|�d|�WYd}~n
d}~00z6|�tjtjtt	�|�tjtjt
t�Wt�t�nt�t�0dS)Nr!)r rrrr"r�r�SpecialFileErrorr�r#�__file__r�)rtr&rrr�test_copyfile_named_pipe�s$��z!TestCopy.test_copyfile_named_pipecCsl|��}|��}tj�|d�}tj�|d�}t|d�t�||�}|�tj�|��|�	t
|�t
|��dS)Nr;rz)rqr r,r-r2rr�r�r�r�rG)rtr�r��dst_filer�r2rrr�test_copyfile_return_value�s
z#TestCopy.test_copyfile_return_valuecCsX|��}tj�|d�}t|d�|�ttj||�|�t	tj||�|�
t|�d�dSr)rqr r,r-r2r�rrr�rr�rG)rtr�r�rrr�test_copyfile_same_file�s
z TestCopy.test_copyfile_same_filezMOn MACOS, Solaris and Windows the errors are not confusing (though different)cCsD|��}tj�|d�}tj�|d�}t|d�|�ttj||�dS)Nrzr�)	rqr r,r-r2r�r�rr�)rtr�r�rarrr�test_copyfile_nonexistent_dir�s

z&TestCopy.test_copyfile_nonexistent_dircCs�|��}tj�|d�}|��}tj�|d�}t|d�tjdkrFt}nt}|�	|t
j||�|�	|t
j||�|�	|t
j||�dSr�)rqr r,r-r2rhr�rr�r�rr�)rtr�r�r�rarZrrr�test_copyfile_copy_dir�s

zTestCopy.test_copyfile_copy_dirN))rvrwrxrr�rBr�r�rXr rFr�rGrRrr^Zskip_unless_xattrrnr�rprsrurvrxryrzr{r~rr|r�r�r�r�r�r��MACOS�SOLARISr�r�r�rrrrr:sh

(��

?�



"






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!�oRe"�d1�d2d3���Z#e��d4d5��Z$d6d7�Z%d8S):�TestArchivesc	Cs�|�d�\}}|��}t�|�tj�|�}tj�tj�|�d�}t�	|��*tj�
|�}t|d|d�}Wd�n1s|0Y|�||d�|�
tj�|��|�
t�|��t�|d��$}|�|��gd��Wd�n1s�0Yt�	|��t|d|d�}Wd�n1�s(0Y|�||d	�|�
tj�|��|�
t�|��t�|d
��$}|�|��gd��Wd�n1�s�0YdS)Nr��archive�gztar�.�.tar.gzzr:gz)r�z./subz./sub2z./file1z./file2z./sub/file3�tar�.tarrE)�
_create_filesrqr r�r,r�r-�basenamer�
change_cwd�abspathrr�r�r��tarfileZ
is_tarfiler.�assertCountEqual�getnames)	rt�root_dirr6rr�work_dir�
rel_base_name�	base_name�tarballZtfrrr�test_make_tarballs0
,
�".
�zTestArchives.test_make_tarballcCsFt�|��(}|��}|��t|�Wd�S1s80YdSr)r�r.r��sortr+)rtr,r�rrrr�_tarinfo:szTestArchives._tarinfo�distcCs�|��}tj�||�}tj|dd�t|dfd�t|dfd�t�tj�|d��t|ddfd�t�tj�|d��|r�t|d	fd�||fS)
NT)�exist_okr�rWrVr�Zfile3Zsub2�outer)rqr r,r-r5r2r{)rtr6r�r�rrrr�@szTestArchives._create_filesr�zNeed the tar command to runcCs|��\}}tj�|��d�}t|d||�}|�||d�|�tj�|��tj�|d�}ddd|g}t	j
||t	jd�|�tj�|��|�|�|�|�|��t|d||�}|�||d�|�tj�|��t|d||d	d
�}|�||d�|�tj�|��dS)Nr�r�r�zarchive2.tarr�z-cf��cwd�stdoutr�T)Zdry_run)
r�r r,r-rqrr�r�r�rj�
check_call�DEVNULLr�)rtr�r6r�r�Ztarball2Ztar_cmdrrr�test_tarfile_vs_tarNs(�
�z TestArchives.test_tarfile_vs_tarc	Cs�|��\}}|��}t�|�tj�|�}tj�tj�|�d�}t�	|��(tj�
|�}t|d|�}Wd�n1sx0Y|�||d�|�
tj�|��|�
t�|��t�|��$}|�|��gd��Wd�n1s�0Yt�	|��*tj�
|�}t|d||�}Wd�n1�s.0Y|�||d�|�
tj�|��|�
t�|��t�|��$}|�|��gd��Wd�n1�s�0YdS)Nr��zip�.zip)�dist/�	dist/sub/�
dist/sub2/�
dist/file1�
dist/file2�dist/sub/file3r�)r�r�r�r�r�r�)r�rqr r�r,r�r-r�rr�r�rr�r�r��zipfileZ
is_zipfile�ZipFiler��namelist)	rtr�r6rrr�r�r�rO�zfrrr�test_make_zipfileos2
*
�".
�zTestArchives.test_make_zipfiler�zNeed the zip command to runc
Cs
|��\}}tj�|��d�}t|d||�}|�||d�|�tj�|��tj�|d�}dddd|g}t	j
||t	jd�|�tj�|��t�
|��}|��}Wd�n1s�0Yt�
|��}|��}	Wd�n1s�0Y|�t|�t|	��dS)Nr�r�r�zarchive2.zipz-qz-rr�)r�r r,r-rqrr�r�r�rjr�r�r�r�r�rI)
rtr�r6r�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|d||�}|�||d�|�tj�|��dd|g}t	�
|���ztj|tj
d�Wn\tjy�}zB|jjdd�}d	|vr�|�d
�d}|�|�||��WYd}~n
d}~00Wd�n1s�0YdS)Nr�r�r�r�z-t)�stderr�replacer�zunrecognized option: tzunzip doesn't support -tz{}

**Unzip Output**
{})r�r r,r-rqrr�r�r�rr�rj�check_outputZSTDOUT�CalledProcessError�output�decoder"r$�format)	rtr�r6r�r�r�r�Zdetails�msgrrr�test_unzip_zipfile�s

zTestArchives.test_unzip_zipfilecCs*|��}tj�|d�}|�tt|d�dS)Nr�rW)rqr r,r-r��
ValueErrorr)rtr�r�rrr�test_make_archive�szTestArchives.test_make_archivecCs�tr"t�d�d}t�d�d}nd}}|��\}}tj�|�	�d�}t
|d||||d�}|�tj�|��t
|d||�}|�tj�|��t
|d||||d�}|�tj�|��t
|d||ddd�}|�tj�|��dS)	Nr�rootr�r���owner�groupr�Z	kjhkjhkjgZoihohoh)
�UID_GID_SUPPORT�grp�getgrgid�pwd�getpwuidr�r r,r-rqrr�r�)rtr�r�r�r6r�rOrrr�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|d|d||d�}Wd�n1sn0Y|�tj�
|��t�|�}z6|��D] }|�|jd�|�|jd�q�W|��n
|��0dS)Nr�rr�r�r�)r�r r,r-rqr�r�r�r�rr�rr�r�r�r.Z
getmembersr��uid�gidr�)	rtr�r6r�r�r�Zarchive_namer��memberrrr�test_tarfile_root_owner�s
�$
z$TestArchives.test_tarfile_root_ownercCstt��}dd�}td|gd�zFztdd|��d�WntyHYn0|�t��|�Wtd�n
td�0dS)Nc_s
t��dSr)�RuntimeError)r�kwrrr�_breakssz3TestArchives.test_make_archive_cwd.<locals>._breaksrW�xxx file)r�)r r[rrrqr�r�r)rtZcurrent_dirr�rrr�test_make_archive_cwd�sz"TestArchives.test_make_archive_cwdcCsZ|��}t�|��4|�tdd�d�|�tj�d��Wd�n1sL0YdS)N�testr�ztest.tar�	rqrr�r�rr�r r,r��rtr�rrr�test_make_tarfile_in_curdir
sz(TestArchives.test_make_tarfile_in_curdircCsZ|��}t�|��4|�tdd�d�|�tj�d��Wd�n1sL0YdS)Nr�r�ztest.zipr�r�rrr�test_make_zipfile_in_curdirs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)
NrWrecSstSr��xrrrr�<lambda>r6z;TestArchives.test_register_archive_format.<locals>.<lambda>cSstSrr�rrrrr�!r6)rerW)rerWrcSstSrr�rrrrr�$r6r�cSsg|]\}}|�qSrr�r:rP�paramsrrrr<%r6z=TestArchives.test_register_archive_format.<locals>.<listcomp>cSsg|]\}}|�qSrrr�rrrr<)r6)r��	TypeErrorrrr�rr-)rt�formatsrrr�test_register_archive_formats��z)TestArchives.test_register_archive_formatcKsF|j|dd�fi|��|j|tjfi|��|j|tfi|��dS)NcSs|Srr�r,rrrr�0r6z3TestArchives.check_unpack_archive.<locals>.<lambda>)�#check_unpack_archive_with_converterrrr)rtr�rrrr�check_unpack_archive.s����z!TestArchives.check_unpack_archivecKs.|��\}}t|�}|�d�tj�|��d�}t||||�}|��}	t||�||	�fi|��|�	t|	�|�|��}
t||�||
�fd|i|��|�	t|
�|�|�
tj��$t|t
�fi|��Wd�n1s�0Y|�
t��(t|t
�fddi|��Wd�n1�s 0YdS)Nr�r�r�rW)r�rNr�r r,r-rqrrr�r�rZ	ReadErrorrr�)rtr�Z	converterrr�r6�expectedr�r�rrZtmpdir3rrrr�5s"
�2z0TestArchives.check_unpack_archive_with_convertercCsT|j|dd�|j|dd�t�|��|�|�Wd�n1sF0YdS)NZ
fully_trusted��filter�data)r�rZcheck_no_warnings)rtr�rrr�check_unpack_tarballMsz!TestArchives.check_unpack_tarballcCs|�d�dS)Nr��r�r}rrr�test_unpack_archive_tarSsz$TestArchives.test_unpack_archive_tarcCs|�d�dS)Nr�r�r}rrr�test_unpack_archive_gztarVsz&TestArchives.test_unpack_archive_gztarcCs|�d�dS)NZbztarr�r}rrr�test_unpack_archive_bztarZsz&TestArchives.test_unpack_archive_bztarz(AIX MAXDATA must be 0x20000000 or largercCs|�d�dS)NZxztarr�r}rrr�test_unpack_archive_xztar^sz&TestArchives.test_unpack_archive_xztarcCsF|�d�|�t��|jddd�Wd�n1s80YdS)Nr�r�r�)r�r�r�r}rrr�test_unpack_archive_zipcs
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)Nre�	stuff.boo�xx)r�)r�Zextract_dir�extrar}rr�_boomsz/TestArchives.test_unpack_registry.<locals>._booZBooz.booz.b2)r�rer�r�ZBoo2r�)	rrrr�r	r
r�r-r�)rtr�rrr}r�test_unpack_registryis

�z!TestArchives.test_unpack_registryN)r�)&rvrwrxrZ
requires_zlibr�r�r�r�r�r�whichr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�Zrequires_bz2r�Z
requires_lzmar�rgrnr�r�rrrrrr�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)r3�used�freer)rrr r,r�r�r}rrmZ
assertGreaterr3r�assertGreaterEqualr)rtZusagerQrrr�test_disk_usage�szTestMisc.test_disk_usager��chownzrequires os.chowncs����}tj|d��t�d���t��t���Wd�n1sH0Y��t��tj�dd�Wd�n1s�0Y��t��tj�dd�Wd�n1s�0Y��t	��t��d�Wd�n1s�0Y��t	��t��d�Wd�n1�s&0Yt
��}t
��}d
��fd	d
�	}t��||�|�||�t��|�|�|�tj�|d�|�|�tj�|d�|�|d�t�|||�||||�t�||�|||�tj||d�|||�tj||d�|||d�z t
�|�d}t�|�d}Wnt�yHYn60t��||�|�||�t�|||�||||�dS)Nr�ztesting chown functionznon-existing username)�userznon-existing groupname)r��spamg��Q�	@cs:t���}|dur ��||j�|dur6��||j�dSr)r r�r��st_uid�st_gid)r,r�r��s�r�rtrr�check_chown�s

z(TestMisc.test_chown.<locals>.check_chown)r�r)NN)rqrYr�r2r�r�rr	�LookupErrorr�r �getuid�getgidr�r�r�r��KeyError)rtr�r�r�rr
r�rrr�
test_chown�sR
(,,*,



zTestMisc.test_chownN)rvrwrxr�r�rXrrr�r rrrrrr�s�

rc@s�eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Ze�	e
ed�oHe��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)rpz.Exe�rUrp�suffixz.EXE)rq�temp_dirrYrZ�	temp_filer r�rPr��S_IXUSRrrr�r,rlrU�file�env_path�curdir�extr}rrr�setUp�s�zTestWhich.setUpcCs&tj|j|jd�}|�||jj�dS�Nr�)rrrrUr�rrP�rtr2rrr�
test_basic�szTestWhich.test_basiccCs(tj|jj|jd�}|�||jj�dSr!)rrrrPrr�r"rrr�test_absolute_cmd�szTestWhich.test_absolute_cmdcCs�tj�|j�\}}tj�||j�}tj|d��,tj	||j
d�}|�||�Wd�n1s`0Ytj|jd��(tj	||d�}|�|�Wd�n1s�0YdSr!)
r r,rlrUr-rrr�rrrr��assertIsNone)rtr6�tail_dir�relpathr2rrr�test_relative_cmd�s*zTestWhich.test_relative_cmdcCs�tj�|j�}tj|jd��Ptj|j|d�}t	j
dkrT|�|tj�|j
|j��n
|�|�Wd�n1sr0YdS)Nr�r�)r r,r�rUrr�rrrrhr�r�r-rr%)rtr6r2rrr�test_cwd�s
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)r,�mode)r r�rrPr�r��access�W_OKr"rrrrUr%r"rrr�test_non_matching_modes

z TestWhich.test_non_matching_modecCsjtj�|j�\}}tj|d��8tj|j|d�}|�	|tj�
||j��Wd�n1s\0YdSr!)r r,rlrUrr�rrrr�r-)rtr6r&r2rrr�test_relative_pathszTestWhich.test_relative_pathcCstjd|jd�}|�|�dS)Nzfoo.exer�)rrrUr%r"rrr�test_nonexistent_fileszTestWhich.test_nonexistent_filer�zpathext check is Windows-onlycCs<tj|jdd�|jd�}|�||jjdd�|j�dS)N���r�)rrrrUr�rrPrr"rrr�test_pathext_checkingszTestWhich.test_pathext_checkingcCsRt���6}|j|d<t�|j�}|�||jj�Wd�n1sD0YdS�N�PATH)	r�EnvironmentVarGuardrrrrr�rrP�rt�envr2rrr�test_environ_path%s

zTestWhich.test_environ_pathcCs�t����}d|d<tjjd|jdd���t�td|j��Rt�|j��&t	�
|j�}|�|�Wd�n1sr0YWd�n1s�0YWd�n1s�0YWd�n1s�0YdS)Nr�r3�
os.confstrT��return_value�create�defpath)
rr4r�r8r9rU�	swap_attrr r�rrrr%r5rrr�test_environ_path_empty+s
��
�z!TestWhich.test_environ_path_emptycCs:tj�|jj�}tjdkrBtj}t|t	�r4t�
|�}tj�||�}t�
���}tj|d<tjjd|jdd���t�td|j��jt�|j�}|�|�t�|j��(t�|j�}|�||�Wd�n1s�0YWd�n1s�0YWd�n1�s0YWd�n1�s,0YdS)Nr�r3r8Tr9r<)r r,r�rrPrhr�rr*r~r|r-rr4�pathsepr�r8r9rUr=rrrr%r�r�)rtZexpected_cwdrr6r2rrr�test_environ_path_cwd6s$




��
zTestWhich.test_environ_path_cwdc
Cs8t����}|�dd�tjjdtdd��Lt�td|j	��t
�|j�}Wd�n1s^0YWd�n1s|0Y|�
||jj�tjjd|j	dd��Jt�tdd��t
�|j�}Wd�n1s�0YWd�n1s�0Y|�
||jj�Wd�n1�s*0YdS)Nr3r8T)rr;r<r9r�)rr4�popr�r8r9r�r=r rUrrrr�rrPr5rrr�test_environ_path_missingLs 
��H��Hz#TestWhich.test_environ_path_missingc	Cs�tj�|j�}tj|jd��\t���4}|j|d<tj	|j
dd�}|�|�Wd�n1s`0YWd�n1s~0YdS)Nr�r3r�)r r,r�rUrr�r4rrrrr%)rtr6r6r2rrr�test_empty_path^s�
zTestWhich.test_empty_pathcCsNt���2}|�dd�t�|j�}|�|�Wd�n1s@0YdSr2)rr4rArrrr%r5rrr�test_empty_path_no_PATHfs
z!TestWhich.test_empty_path_no_PATHztest specific to WindowscCs�d}tj|jd|d�}t�|jtj�|�|j	�tj
�|j�}tj
�|�d}t
���6}||d<tj||jd�}|�||j�Wd�n1s�0YdS)N�.xyz�Tmp2rr�PATHEXTr�)rYrZrr r�rPr�rrrr�r,r�rrr4rrr��rtrZtemp_filexyzZprogramr6r2rrr�test_pathextls�
zTestWhich.test_pathextcCs�d}tj|jd|d�}|�|j�tj�|j�}tj�	|�d}t
���<}|�d�|d<tj
||jd�}|�||j�Wd�n1s�0YdS)NrErFrr�;rGr�)rYrZrrrr�r r,r�rPrrr4rrr�rHrrr�test_pathext_with_empty_str~s�
z%TestWhich.test_pathext_with_empty_strN)rvrwrxr r#r$r(r)r�r�rXr r�r-r.r/r�rhr�r1r7r>r@rBrCrDrIrKrrrrr�s2
�
�

rc@seZdZdd�ZdS)�TestWhichBytescCsXt�|�t�|j�|_t�|j�|_t�|jj�|j_t�|j�|_t�|j	�|_	dSr)
rr r r|rUrrrPrrr}rrrr �s
zTestWhichBytes.setUpN)rvrwrxr rrrrrL�srLc@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:��ove�(�d;k�ove'ed<��ove'e)d=��ove'e)d>�d?�d@dA��Z*dBS)C�TestMovecCsvd}|��|_|��|_tj�|j|�|_tj�|j|�|_t|jd��}|�	d�Wd�n1sh0YdS)Nrzr(r)
rqr�r�r r,r-r�r�r.r/)rtr�rBrrrr �s

zTestMove.setUpcCs�t|d��}|��}Wd�n1s(0Yt�||�t|d�� }|�||���Wd�n1sn0Y|�tj�|��dS�NrD)	r.rFr�mover�r�r r,r�)rtr`ra�real_dstrB�contentsrrr�_check_move_file�s&.zTestMove._check_move_filecCsFtt�|��}t�||�|�|tt�|���|�tj�|��dSr)	rIr rJrrOr�r�r,r�)rtr`rarPrQrrr�_check_move_dir�szTestMove._check_move_dircCs|�|j|j|j�dSr)rRr�r�r}rrr�test_move_file�szTestMove.test_move_filecCs|�|j|j|j�dSr)rRr�r�r�r}rrr�test_move_file_to_dir�szTestMove.test_move_file_to_dircCs"t�|j�}|�||j|j�dSr)rrr�rRr�r�)rtr`rrr�"test_move_file_to_dir_pathlike_src�sz+TestMove.test_move_file_to_dir_pathlike_srccCs"t�|j�}|�|j||j�dSr)rrr�rRr�r��rtrarrr�"test_move_file_to_dir_pathlike_dst�sz+TestMove.test_move_file_to_dir_pathlike_dstcCs|��dSr)rTr}rrr�test_move_file_other_fs�sz TestMove.test_move_file_other_fscCs|��dSr)rUr}rrr�test_move_file_to_dir_other_fs�sz'TestMove.test_move_file_to_dir_other_fsc	Cs@tj|��d�}z|�|j||�Wt�|�nt�|�0dSr�)rYr�rqrSr�rrs�rtr�rrr�
test_move_dir�szTestMove.test_move_dircCs|��dSr)r\r}rrr�test_move_dir_other_fs�szTestMove.test_move_dir_other_fsc
Cs,|�|j|jtj�|jtj�|j���dSr)rSr�r�r r,r-r�r}rrr�test_move_dir_to_dir�s�zTestMove.test_move_dir_to_dircCs|��dSr)r^r}rrr�test_move_dir_to_dir_other_fs�sz&TestMove.test_move_dir_to_dir_other_fsc
Cs4|�|jtjj|jtj�|jtj�|j���dSr)rSr�r r,�sepr�r-r�r}rrr�test_move_dir_sep_to_dir�s�z!TestMove.test_move_dir_sep_to_dirzrequires os.path.altsepc
Cs4|�|jtjj|jtj�|jtj�|j���dSr)rSr�r r,�altsepr�r-r�r}rrr�test_move_dir_altsep_to_dir�s�z$TestMove.test_move_dir_altsep_to_dircCsHt|jd��Wd�n1s"0Y|�tjtj|j|j�dS)Nr()r.r�r�rrrOr�r�r}rrr�"test_existing_file_inside_dest_dir�sz+TestMove.test_existing_file_inside_dest_dircCs*tj�|jd�}|�tjtj|j|�dS�Nr;)r r,r-r�r�rrrOrWrrr�test_dont_move_dir_in_itself�sz%TestMove.test_dont_move_dir_in_itselfc	Csrt�t�zVdD]B\}}tj�t|�}tj�t|�}|jt�||�d||fd�qWt�	t�nt�	t�0dS)N))�srcdirzsrcdir/destz?_destinsrc() wrongly concluded that dst (%s) is not in src (%s)�r�)
r r{rr,r-r�r�
_destinsrcrrsr�rrr�test_destinsrc_false_negative�s
��
z&TestMove.test_destinsrc_false_negativec	Csrt�t�zVdD]B\}}tj�t|�}tj�t|�}|jt�||�d||fd�qWt�	t�nt�	t�0dS)N))rgzsrc/dest)rgz
srcdir.newz;_destinsrc() wrongly concluded that dst (%s) is in src (%s)rh)
r r{rr,r-r�rrirrsr�rrr�test_destinsrc_false_positives
��
z&TestMove.test_destinsrc_false_positivecCs\tj�|jd�}t�|j|�t�||j�|�	tj�
|j��|�	tj�|j|j��dSre)r r,r-r�r�r�rrOr�r�rL�samefilerWrrr�test_move_file_symlinks
zTestMove.test_move_file_symlinkcCsld}tj�|j|�}t�|j|�t�||j�tj�|j|�}|�	tj�
|��|�	tj�|j|��dSre)r r,r-r�r�r�rrOr�r�rLrl)rtr�raZ
final_linkrrr�test_move_file_symlink_to_dirsz&TestMove.test_move_file_symlink_to_dircCsztj�|jd�}tj�|jd�}t�||�tj�|jd�}t�||�|�tj�	|��|�
tj�|�tj�|��dS�Nr<r;r=)r r,r-r�r�r�rrOr�rLr��realpath�rtr`rar�rrr�test_move_dangling_symlink%sz#TestMove.test_move_dangling_symlinkcCs|tj�|jd�}tj�|jd�}t�|�t�||�tj�|jd�}t�||�|�	tj�
|��|�	tj�||��dSro)r r,r-r�r{r�r�rrOr�rLrlrqrrr�test_move_dir_symlink0s
zTestMove.test_move_dir_symlinkc	Cs6t�|j|j�}|�|tj�|jtj�|j���dSr)	rrOr�r�r�r r,r-r�r"rrr�test_move_return_value<s�zTestMove.test_move_return_valuecCs6t�|jtj�|jd��}|�|tj�|jd��dSre)rrOr�r r,r-r�r�r"rrr� test_move_as_rename_return_valueAsz)TestMove.test_move_as_rename_return_valuecs8g��fdd�}tj|j|j|d�|�t��d�dS)Ncs��||f�dSrr�r(�Zmovedrrr*Hsz7TestMove.test_move_file_special_function.<locals>._copyrre)rrOr�r�r�r��rtr*rrvr�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)Ncs��||f�dSrr�r(rvrrr*Psz6TestMove.test_move_dir_special_function.<locals>._copy�childZchild1rr)rr�r r,r-r�rrOr�r�r�rwrrvr�test_move_dir_special_functionMsz'TestMove.test_move_dir_special_functionc	Cs~|��|_tj�tj�|j�tj�|j����}|�|j|�z.t	�
|j|�|�tj�|��Wt�
|�nt�
|�0dSr)rqr�r r,r-r�r��upperr?rrOr�rKr�r[rrr�test_move_dir_caseinsensitiveWs
�z&TestMove.test_move_dir_caseinsensitiver�rr��SF_IMMUTABLE�	UF_OPAQUEroc
Cs0z�t�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
�r�t�t
tj
�t�t
�nNtj�t��rt�ttj
�t�t�tj�t
��r*t�t
tj
�t�t
�0dS)Nry)r r{�
TESTFN_SRCr�r�r}r�rrrO�
TESTFN_DSTr�rJr~rr�r,r-r�rsr}rrr�test_move_dir_permission_deniedhs,

�
z(TestMove.test_move_dir_permission_deniedN)+rvrwrxr rRrSrTrUrVrXr'rYrZr\r]r^r_rar�r�r r,rbrcrdrfrjrkrr�rmrnrrrsrtrurxrzr|rXr�r�r�rrrrrM�sh	




		


	���rMc@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)rtZ
raise_in_exitZsuppress_at_exitrrr�__init__�szTestCopyFile.Faux.__init__cGsdS)Nr�r)rtrrrrrF�szTestCopyFile.Faux.readcCs
d|_dS)NT)�_enteredr}rrr�	__enter__�szTestCopyFile.Faux.__enter__cCs&|||f|_|jr d|_td��|jS)NT�Cannot close)�_exited_withr��_raisedrr�)rt�exc_typeZexc_valZexc_tbrrr�__exit__�s
zTestCopyFile.Faux.__exit__)FT)
rvrwrxr�r�r�r�rFr�r�rrrr�Faux�s
r�c	Csrddd�}t�td|��F|�t��t�dd�Wd�n1sF0YWd�n1sd0YdS)NrEcSs|dkrtd��dS)N�srcfilezCannot open "srcfile"r\�r�r*rrr�_open�sz4TestCopyFile.test_w_source_open_fails.<locals>._openr.r��destfile)rE)rr=rr�rr��rtr�rrr�test_w_source_open_fails�s
z%TestCopyFile.test_w_source_open_failszskipped on macOScs�|���d
�fdd�	}t�td|��t�dd�Wd�n1sF0Y|��j�|��jdtu�|�	�jdj
d	�dS)NrEcs |dkr�S|dkrtd��dS)Nr�r��Cannot open "destfile"r\r��r�rrr��s
z2TestCopyFile.test_w_dest_open_fails.<locals>._openr.r�r�rre)r�)rE)r�rr=rr�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�n1sR0Y|��j�|��j�|��j�|��jdt	u�|�
�jd	jd
�dS)NTrEcs|dkr�S|dkr�SdS�Nr�r�rr��r�r�rrr��s
z3TestCopyFile.test_w_dest_close_fails.<locals>._openr.r�r�rre)r�)rE)r�rr=rr�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|��F|�t��t�dd�Wd�n1s^0YWd�n1s|0Y|��j�|��j�|�	�j
�|��jddu�|��j
�dS)
NTrEcs|dkr�S|dkr�SdSr�rr�r�rrr��s
z5TestCopyFile.test_w_source_close_fails.<locals>._openr.r�r�r)rE)r�rr=rr�rr�r�r�r�r�r�r�rr�r�test_w_source_close_fails�s
Hz&TestCopyFile.test_w_source_close_failsN)rvrwrx�objectr�r�r�r�r�r�r�r�rrrrr��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)rCr�FILESIZE��clsrrr�
setUpClass�szTestCopyFileObj.setUpClasscCst�t�t�t�dSr)rr]rr#r�rrr�
tearDownClass�s
zTestCopyFileObj.tearDownClasscCst�t�dSr�rr]r#r}rrr�tearDown�szTestCopyFileObj.tearDownc	csbttd��D}ttd��}||fVWd�n1s60YWd�n1sT0YdS�NrDr(�r.rr#r�rrr�	get_files�szTestCopyFileObj.get_filesc	Cslt|d��N}t|d��$}|�|��|���Wd�n1s@0YWd�n1s^0YdSrN)r.r�rF)rtr`ra�fsrc�fdstrrr�assert_files_eq�szTestCopyFileObj.assert_files_eqcCsH|��� \}}t�||�Wd�n1s.0Y|�tt�dSr)r�r�copyfileobjr�rr#r�rrr�test_content	s*zTestCopyFileObj.test_contentcCs<|��� \}}t�||�Wd�n1s.0YdSr)r�rr�r�rrr�test_file_not_closed	sz$TestCopyFileObj.test_file_not_closedcCs`|���D\}}t�||�|�|��|j�|�|��|j�Wd�n1sR0YdSr)r�rr�r��tellr�r�rrr�test_file_offset	sz TestCopyFileObj.test_file_offsetr�zWindows onlycCs~tj�d��}t�tt�Wd�n1s.0Y|�|jddd�t	j
t��dd��}|�
d�Wd�n1s�0Y|j}|�tj|�tj�d��}t�|t�Wd�n1s�0Y|�|jddd�t	j
t��dd��}Wd�n1�s0Y|j}|�tj|�tj�d��}t�|t�Wd�n1�sd0Y|�|t�dS)	Nzshutil._copyfileobj_readintorrWiFrTsfoor)r�r8r9rr�rr#r��	call_argsrYrZr r[r/rPrrrr]r�)rt�mrBrcrrr�
test_win_impl	s"*(* ,zTestCopyFileObj.test_win_implN)rvrwrxr��classmethodr�r�r��
contextlib�contextmanagerr�r�r�r�r�r�r�r rPr�rrrrr��s


r�c@s�eZdZdZdZdZedd��Zedd��Zdd	�Z	e
jd
d��Zdd
�Z
dd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�ZdS)�_ZeroCopyFileTesti�r6r�cCsDtt|j�ttd��}|��|_Wd�n1s60YdSrN)rCrr�r.rF�FILEDATA)r�rBrrrr�7	s
z_ZeroCopyFileTest.setUpClasscCst�t�dSr)rr]rr�rrrr�>	sz_ZeroCopyFileTest.tearDownClasscCst�t�dSrr�r}rrrr�B	sz_ZeroCopyFileTest.tearDownc	csbttd��D}ttd��}||fVWd�n1s60YWd�n1sT0YdSr�r�r�rrrr�E	sz_ZeroCopyFileTest.get_filescOstd��dS)Nzmust be implemented in subclass)�NotImplementedError)rtrrrrr�zerocopy_funK	sz_ZeroCopyFileTest.zerocopy_funcCs$|��|��|��|��dSr)r�r�r�r r}rrr�resetN	sz_ZeroCopyFileTest.resetc	Cs�|��� \}}|�||�Wd�n1s.0Y|�ttdd�|j�|���L\}}tj�d��}t	�
tt�Wd�n1s�0YWd�n1s�0YdS)NT�r0zshutil.copyfileobj)r�r�r�rGr#r�r�r8r9rr�r)rtr`rar�rrr�test_regular_copyV	s**z#_ZeroCopyFileTest.test_regular_copyc	Cs�|�|j�|���J\}}|�t��|�||�Wd�n1sF0YWd�n1sd0Y|�ttdd�|j	�dS)NTr�)
rrr�r�r�r�r�r�rGrr�r�rrr�test_same_file`	s
Hz _ZeroCopyFileTest.test_same_filecCsZtjt��d�}|�t��}t�|d�Wd�n1s<0Y|�|j	j
|�dS)Nr��new)rYr�r r[r�r�rr�r�r�r�)rtrPr�rrr�test_non_existent_srch	s*z'_ZeroCopyFileTest.test_non_existent_srcc	s�td�td�|��fdd��|��fdd��t�d��Wd�n1sT0Yt�d��F}t�d��}|�||�Wd�n1s�0YWd�n1s�0Y|�t�dd	�d
�dS)Nr`racs
t���Sr�rr]r)r^rrr�q	r6z3_ZeroCopyFileTest.test_empty_file.<locals>.<lambda>cs
t���Srr�r)r_rrr�r	r6r(rDTr�r6)rrrr.r�r�rGr�r)r_r^r�test_empty_filen	sHz!_ZeroCopyFileTest.test_empty_filecCsHtjj|jtd��"|�ttjtt	�Wd�n1s:0YdS)N�r)
r�r8r9�
PATCHPOINT�ZeroDivisionErrorr�rr�rr#r}rrr�test_unhandled_exception|	s
��z*_ZeroCopyFileTest.test_unhandled_exceptionc
Cs�tjj|jttjd�d��r|���J\}}|�t	��|�
||�Wd�n1sV0YWd�n1st0YWd�n1s�0YdS�N�yor�)r�r8r9r�rrZEINVALr�r�r
r�r�rrr�test_exception_on_first_call�	s

�z._ZeroCopyFileTest.test_exception_on_first_callc	Cs|tjj|jttjd�d��N|���&\}}|�t|j	||�Wd�n1sP0YWd�n1sn0YdSr�)
r�r8r9r�rrZENOSPCr�r�r�r�rrr�test_filesystem_full�	s


�z&_ZeroCopyFileTest.test_filesystem_fullN)rvrwrxr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrrr�1	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)rtr�r�rrrr��	sz!TestZeroCopySendfile.zerocopy_func
Cs�t�|j��|}ttd��R}|�t��|�||�Wd�n1sF0Yt�	||�Wd�n1sp0YWd�n1s�0Y|�
ttdd�|j�dS)Nr(Tr�)�io�BytesIOr�r.r#r�r
r�rr�r�rGr�rrr�test_non_regular_file_src�	s*Hz.TestZeroCopySendfile.test_non_regular_file_srcc
Cs�ttd���}t���n}|�t��|�||�Wd�n1sB0Yt�||�|�	d�|�
|��|j�Wd�n1s�0YWd�n1s�0YdS)NrDr)
r.rr�r�r�r
r�rr��seekr�rFr�r�rrr�test_non_regular_file_dst�	s
*
z.TestZeroCopySendfile.test_non_regular_file_dstc
s���fdd�}g�tj�tjjdd|d��r|���J\}}|�t��}t�	||�Wd�n1sf0YWd�n1s�0YWd�n1s�0Y|�
|jjtj
�dS)Ncs,�s��d��|i|��Sttjd��dS)Nr�)rMrr�EBADFr�rZ
orig_sendfilerrrS�	s
zDTestZeroCopySendfile.test_exception_on_second_call.<locals>.sendfiler�T)r;r)r rSr�r8r9r�r�rrr�r�r�rr�)rtrSr`rar�rr�r�test_exception_on_second_call�	s
�fz2TestZeroCopySendfile.test_exception_on_second_callc	Cs�tjjdtd��H}|��� \}}t�||�Wd�n1s@0YWd�n1s^0Y|�tt	dd�|j
�dS)N�os.fstatr�Tr�)r�r8r9rr�rr�r�rGr#r��rtr�r`rarrr�test_cant_get_size�	s
<z'TestZeroCopySendfile.test_cant_get_sizec	Cs�tj��}d|_tjjd|d��H}|��� \}}t�||�Wd�n1sP0YWd�n1sn0Y|�t	t
dd�|j�dS)Nir��r:Tr�)r�r8�Mock�st_sizer9r�rr�r�rGr#r��rtr8r�r`rarrr�test_small_chunks�	s
<z&TestZeroCopySendfile.test_small_chunksc	Cs�tj��}|jd|_tjjd|d��H}|��� \}}t�||�Wd�n1sV0YWd�n1st0Y|�	t
tdd�|j�dS)Ni@r�r�Tr�)
r�r8r�r�r�r9r�rr�r�rGr#r�r�rrr�test_big_chunk�	s
<z#TestZeroCopySendfile.test_big_chunkcCs�tjjdtd���}|�ttjtt�|j	dd}|�
|tj�
t��t�t�ttddd�|�tjtd�|�ttjttd�|j	dd}|�
|d	�Wd�n1s�0YdS)
Nr�r�rrshelloTr��3i�)r�r8r9r�r�rr�rr#r�r�r r,�getsizerr]r2rr)rtr�Z	blocksizerrr�test_blocksize_arg�	s"��
�z'TestZeroCopySendfile.test_blocksize_argc
Cs�z�tjj|jttjd�d��r}|���J\}}|�t	��t
�||�Wd�n1sX0YWd�n1sv0YWd�n1s�0Ytj�|j��}t
�t
t�Wd�n1s�0YWdt
_ndt
_0dS)Nr�r�T)r�r8r9r�rrZENOTSOCKr�r�r
rr�r�rr#Z_USE_CP_SENDFILEr�rrr�test_file2file_not_supported�	s
�H z1TestZeroCopySendfile.test_file2file_not_supportedN)
rvrwrxr�r�r�r�r�r�r�r�r�r�rrrrr��	s		


r�z
macOS onlyc@seZdZdZdd�ZdS)�TestZeroCopyMACOSzposix._fcopyfilecCst�||tj�Sr)rZ_fastcopy_fcopyfile�posixZ_COPYFILE_DATAr�rrrr�
szTestZeroCopyMACOS.zerocopy_funN)rvrwrxr�r�rrrrr�
sr�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_sizer�columns�lines)rtr?rrr�test_does_not_crash
sz'TestGetTerminalSize.test_does_not_crashcCs�t���&}d|d<|d=t��}Wd�n1s40Y|�|jd�t���&}|d=d|d<t��}Wd�n1s�0Y|�|jd�dS)NZ777�COLUMNS�LINESi	Z888ix)rr4rr�r�r�r��rtr6r?rrr�test_os_environ_first
s
&
&z)TestGetTerminalSize.test_os_environ_firstcCs`t���(}d|d<d|d<t��}Wd�n1s60Y|�|jd�|�|jd�dS)NrWr�Zyyyr�r)rr4rr�rr�r�r�rrr�test_bad_environ.
s
&z$TestGetTerminalSize.test_bad_environz
not on ttyr�zneed os.get_terminal_size()c
Cs�zt�ddg�����}Wn$tttjfy>|�d�Yn0t|d�t|d�f}t	�
��$}|d=|d=t��}Wd�n1s�0Y|�
||�dS)NZsttyr?zstty invocation failedrerr�r�)rjr�r�rlr�rr�r"rmrr4rr�r�)rtr?r�r6r�rrr�test_stty_match6
s
�

&z#TestGetTerminalSize.test_stty_matchc
Cst����}|d=|d=t�tdd��tjdd�}Wd�n1sF0Y|�|jd�|�|jd�t	t
jd��J}t�td|��tjd	d�}Wd�n1s�0YWd�n1s�0Y|�|jd
�|�|jd�Wd�n1�s0YdS)Nr�r��
__stdout__)�
�)Zfallbackr�r�r))��(r�r�)rr4r=rhrr�r�r�r�r.r �devnull)rtr6r?rBrrr�
test_fallbackN
s
*�Hz!TestGetTerminalSize.test_fallbackN)rvrwrxr�r�r�r�r�r �isattyrhr�r\rXr�r�rrrrr�
s
�r�c@seZdZdd�ZdS)�PublicAPITestscCsP|�ttd��gd�}ttd�s,tjdkr6|�d�|�ttj�t|��dS)N�__all__)r�r�r@rMrtrwr�rOrsrr�Z	ExecErrorrrrrrrr
rrr	rr�r�statvfsr�r)	r�rXrr rPrMr�r
r�)rtZ
target_apirrr�test_module_all_attributee
s

z(PublicAPITests.test_module_all_attributeN)rvrwrxr�rrrrr�b
sr��__main__)F)F)Pr�Z
unittest.mockrrYrhr�r Zos.pathrr%rrjr7r8r�r�rrrrrrrr	r
rrr
r�r�r��ImportErrorr�rZtest.supportrrrr#rr�r�r�r�r�rgr�r�r�r�rr'r2rCrGrNrbZSUPPORTS_SENDFILErnroZTestCaseryr�r:r�rrrLrMr�r�r�r�r�r�r�r�r�rv�mainrrrr�<module>s�8




	
[tP<
s\JdvN