HEX
Server: LiteSpeed
System: Linux shams.tasjeel.ae 5.14.0-611.5.1.el9_7.x86_64 #1 SMP PREEMPT_DYNAMIC Tue Nov 11 08:09:09 EST 2025 x86_64
User: infowars (1469)
PHP: 8.2.29
Disabled: NONE
Upload Files
File: //usr/lib64/python3.9/site-packages/borg/testsuite/__pycache__/archiver.cpython-39.opt-1.pyc
a

HZ�h"��@s�ddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddl
Z
ddlZddlZddlZddlZddlZddlmZmZddlmZddlmZddlmZddlmZddlmZddlmZmZdd	lm Z ddl!Z!ddl"Z"ddl#Z"d
dl$m%Z%m&Z&m'Z'd
dl(m)Z)m*Z*d
d
l+m,Z,m-Z-m.Z.d
dl/m0Z0m1Z1d
dl2m3Z3d
dl4Td
dl5m6Z6m7Z7d
dl8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>d
dl?m@Z@mAZAd
dlBmCZCd
dl&mDZDmEZEd
dl&mFZFmGZGmHZHd
dl&mIZImJZJmKZKd
dl&mLZLd
dl&mMZMd
dl&mNZNd
dl&mOZOmPZPd
dl&mQZQd
dlRmSZSmTZTd
dlUmVZVmWZWmXZXd
dlYmZZZm[Z[m\Z\d
d l]m^Z^d
d!l_m`Z`d
d"lambZbmcZcd
d#ldmeZed$d%l$mfZfmgZgd$d&l$mhZhmiZimjZjmkZkmlZld$d'l$mmZmmnZnmoZompZpmqZqd$d(l'mrZrmsZsmtZtd$d)lumvZvd$d*l$mwZwejx�yejx�zejx�{e|�d+��Z}dd,dd-d,d.�d/d0�Z~d1d2�Zze~d3d4d5d6�d7d8gZ�Wne��y�d7gZ�Yn0e!j�e�d9�d:d;��Z�d<d=�Z�d>Z�e!j�j�ejx��e��d?e�d@�dAdB��Z�GdCdD�dDeh�Z�GdEdF�dFe��Z�e��d8e�vdG�GdHdI�dIe���Z�GdJdK�dKe��Z�GdLdM�dMe��Z�GdNdO�dOe��Z�GdPdQ�dQe��Z�GdRdS�dSe��Z�GdTdU�dUe��Z�dVdW�Z�dXdY�Z�GdZd[�d[�Z�Gd\d]�d]�Z�d^d_�Z�d`da�Z�e!j���dbe�e�������dcdd��Z�e!j���dee�e,j������dfdg��Z�dS)h�N)�	unhexlify�
b2a_base64)�ConfigParser)�datetime)�timezone)�	timedelta)�sha256)�BytesIO�StringIO)�patch�)�xattr�helpers�platform)�Archive�ChunkBuffer)�Archiver�parse_storage_quota�PURE_PYTHON_MSGPACK_WARNING)�Cache�
LocalCache)�
has_seek_hole)�*)�
bytes_to_long�num_cipher_blocks)�KeyfileKeyBase�RepoKey�
KeyfileKey�
Passphrase�TAMRequiredError�ArchiveTAMRequiredError)�RepoIdMismatch�NotABorgKeyFile)�FileIntegrityError)�Location�get_security_dir)�Manifest�MandatoryFeatureUnsupported�ArchiveInfo)�EXIT_SUCCESS�EXIT_WARNING�
EXIT_ERROR)�
bin_to_hex)�MAX_S)�msgpack)�
flags_noatime�flags_normal)�utcnow)�
RstToTextLazy�rst_to_terminal)�	IECommand�PatternMatcher�
parse_pattern)�Item�ItemDiff�chunks_contents_equal)�
LockFailed)�
setup_logging)�RemoteRepository�PathNotAllowed)�
Repository�)�has_lchflags�llfuse)�BaseTestCase�	changedir�environment_variable�
no_selinux�
same_ts_ns)�are_symlinks_supported�are_hardlinks_supported�are_fifos_supported�is_utime_fully_supported�is_birthtime_fully_supported)�fakeroot_detected�	is_darwin�is_win32)�make_attic_repo)�key�..F�)�archiver�fork�exe�input�
binary_outputc
Os2|r�zX|durtjddf}n$t|t�r.|f}nt|t�s@td��tj||tj|d�}d}	Wn^tj	y�}
z|
j
}|
j}	WYd}
~
n6d}
~
0ty�}
zd}|
j
}	WYd}
~
n
d}
~
00|r�|	|fS|	t�|�fS�nTtjtjtj}}}
�z"t|���t_t|�tj_t�}tj|dd�}t_t_|du�r>t�}d	d
�|_t|_tt_z|�t|��}Wnft�y�}
zL|� �|
j
|�r�|�!�n
|�!���fWYd}
~
W|||
t_t_t_Sd}
~
00|�"|�}	|� �|	|�r�|�!�n
|�!���fW|||
t_t_t_S|||
t_t_t_0dS)Nz-mz
borg.archiverz"exe must be None, a tuple or a str)�stderrrVr��utf-8��encodingcWsdS�N���argsr^r^�=/usr/lib64/python3.9/site-packages/borg/testsuite/archiver.py�<lambda>crRzexec_cmd.<locals>.<lambda>)#�sys�
executable�
isinstance�str�tuple�
ValueError�
subprocess�check_outputZSTDOUTZCalledProcessError�output�
returncode�
SystemExit�code�os�fsdecode�stdin�stdoutrXr
�decoder	�buffer�io�
TextIOWrapperrZ
prerun_checksr)�	exit_coder�
parse_args�list�flush�getvalue�run)rSrTrUrVrWr`�kw�borgrk�ret�erqrrrXZoutput_textr^r^ra�exec_cmdDsV



,�
�r�cCs6t�d�sdStjddgtjd�}|��\}}d|vS)N�tarFz	--version)rrsGNU tar)�shutil�whichri�Popen�PIPEZcommunicate)�popenrrrXr^r^ra�have_gnutarus

r��help�borg.exeT�rUrT�python�binary)�paramscs8|jdkrd�n|jdkr d�ntd���fdd�}|S)Nr�r�r�z"param must be 'python' or 'binary'cst|�dd�|��S)NTr�)r�)r`r}�rUr^ra�exec_fn�szcmd.<locals>.exec_fn)Zparamrh)Zrequestr�r^r�ra�cmd�s

r�cCs�|�d�}|�d�}|�d�}|�d��d�|dddt|��\}}|d	d
|t|��\}}tt|���"|dd
|�\}}Wd�n1s�0Y|dd
|d�\}}|d	d
|t|��\}}dS)
N�reporVrk�	test_file�content�init�--encryption=nonez%s�createz%s::archive�extractzdoes/not/match)�mkdir�join�writerfrC)r��tmpdirr�rVrk�rc�outr^r^ra�test_return_codes�s


r�z/tmp/borg-mountzneeds a 16MB fs mounted on %s��reasoncCs4ddd�}tdd���t}tj�|d�}tj�|d�}tj�|d�}td	�D�]�}tj|dd
�tj|dd
�||ddd
d�|d|�\}}|tkr�t	d||��zd\}	}
|	�r�|
d7}
z||dd�WnBt
�y}z(|jtjkr�WYd}~�q��WYd}~n
d}~00zb|dd||
f|�\}}|tk}	|	�sDt	d||�Wtjtj�|d�dd
�t�
tj�|d��q�tjtj�|d�dd
�t�
tj�|d��0q�Wtj|dd
�ntj|dd
�0|d|�\}}|tk�r�t	d||�|dd|�\}}|tkrNt	d||�qNWd�n1�s&0YdS)NTc	Ss�tj|dd�t�|�|r<t�d|�}|dkr<t�d|�}t|�D]T}tj�|d|�}t	|d��$}t�
|�}|�|�Wd�qD1s�0YqDdS)NT��
ignore_errorsr?zfile%03d�wb)r��rmtreeror��randomZrandint�range�pathr��open�urandomr�)�dir�count�size�rnd�i�fn�f�datar^r^ra�
make_files�s

z"test_disk_full.<locals>.make_files�YES)�!BORG_CHECK_I_KNOW_WHAT_I_AM_DOINGr�rV�reserve�dr��Pi��F)r�r�)Trr?�i@
r�z%s::test%03d�lock.exclusivezlock.rosterry�check�--repair)T)rD�DF_MOUNTror�r�r�r�r�r)�print�OSError�errno�ENOSPC�remove)r�r��mountr�rVr��jr�r��successr��errr^r^ra�test_disk_full�sP

� 
r�c@s\eZdZdZdZdZdd�Zdd�Zdd	�Zd
d�Z	dd
�Z
dd�Zddd�Zddd�Z
dS)�ArchiverTestCaseBaseNFrYcCs�dtjd<dtjd<dtjd<dtjd<|jr6t�p8d|_t��|_tj�	|jd�|_
|j|j
|_tj�	|jd	�|_
tj�	|jd
�|_tj�	|jd�|_tj�	|jd�|_tj�	|jd
�|_tj�	|jd�|_|jtjd<|jtjd<t�|j
�t�|j
d�t�|j�t�|j�t�|j�t|jd��}|�d�Wd�n1�sV0Yt|jd��}|�d�Wd�n1�s�0Yt��|_t�|j�dS)Nr�r��"BORG_DELETE_I_KNOW_WHAT_I_AM_DOINGZwaytooeasyonlyfortests�BORG_PASSPHRASEZdisabledZ
BORG_SELFTEST�
repositoryrVrk�keys�cacheZexcludes�patternsZ
BORG_KEYS_DIRZBORG_CACHE_DIR�r�s1input/file2
# A comment line, then a blank line

sI+input/file_important
- input/file*
# A comment line, then a blank line

)ro�environ�FORK_DEFAULTrrS�tempfileZmkdtempr�r�r��repository_path�prefix�repository_location�
input_path�output_path�	keys_path�
cache_path�exclude_file_path�patterns_file_pathr��chmodr�r��getcwd�_old_wd�chdir��self�fdr^r^ra�setUp�s6




**
zArchiverTestCaseBase.setUpcCs&t�|j�tj|jdd�t�dS)NTr�)ror�r�r�r�r�r;�r�r^r^ra�tearDownszArchiverTestCaseBase.tearDownc	s�|�dd�}|�dd�}|�dd�}|dur2|j}t|||j|jd�|��\}}||kr`t|�|�||�|rxt�	�nt�|r�dnd}|�
�fd	d
�|jdd�D��}|S)
NrwrrTrWF)rTrUrSrRrYc3s|]}�|vr|VqdSr]r^��.0�line�Zpp_msgr^ra�	<genexpr>+s�z+ArchiverTestCaseBase.cmd.<locals>.<genexpr>T)�keepends)�pop�getr�r��EXErSr��assert_equalr�encoder��
splitlines)	r�r`r}rwrTrWrrk�emptyr^r�rar�s zArchiverTestCaseBase.cmdcCs|�dd|jd|t�dS)Nr�z--compression=lz4�::�r�r��src_dir)r��namer^r^ra�create_src_archive/sz'ArchiverTestCaseBase.create_src_archivecCsZt|jdd�}|�0t�|tj�\}}t||||�}Wd�n1sH0Y||fS�NT�Z	exclusive)r>r�r&�load�NO_OPERATION_CHECKr)r�r�r��manifestrP�archiver^r^ra�open_archive2s
,z!ArchiverTestCaseBase.open_archivecCst|jdd�Sr�)r>r�r�r^r^ra�open_repository9sz$ArchiverTestCaseBase.open_repositoryrcCs~tj�|j|�}tj�tj�|��s6t�tj�|��t|d��*}|durRd|}|�|�Wd�n1sp0YdS)Nr��X)	ror�r�r��exists�dirname�makedirsr�r�)r�r�r��contents�filenamer�r^r^ra�create_regular_file<sz(ArchiverTestCaseBase.create_regular_fileTc
Cs�|jddd�|jddd�|jddd�t�dd�|rdt�rdt�tj�|jd�tj�|jd	��t�r�t�	d
tj�|jd��|jdd
d�t
js�t
�|j�r�t�
tj�|jd��}t
�|dd�t
�|dd�t�r�t�tj�|jd��t�rt�tj�|jd�tj�zZt�ddtjBt�dd��t�ddtjBt�dd��t�dd�t�ddd�d}WnVt�y�d}Yn@t�y�}z&|jtjtjfv�r��d}WYd }~n
d }~00t �!d
�|jd!d"d�|S)#z�Create a minimal test case including all supported file types

        Args:
          create_hardlinks: whether to create a sample hardlink. When set to
                            False, the hardlink file will not be created at all.
        �file1�@�r��flagfile��
dir2/file2�input/file1i�	�hardlinkZ	somewhere�link1�	fusexattrr?�user.foosbars
user.emptyrR�fifo1�
input/bdevi��
r��
input/cdev��(�
input/dir2imr���TFNr�r)"rror�rH�linkr�r�r�rG�symlinkr
�XATTR_FAKEROOT�
is_enabled�fsencode�setxattrrI�mkfifor@r�	set_flags�stat�	UF_NODUMP�mknod�S_IFBLK�makedev�S_IFCHR�chown�PermissionErrorr�r��EINVALZENOSYS�time�sleep)r��create_hardlinksr��	have_rootr�r^r^ra�create_test_filesFsD
�
z&ArchiverTestCaseBase.create_test_files)rN)T)�__name__�
__module__�__qualname__r�r�r�r�r�r�r�r�r�rr/r^r^r^rar��s

r�c@s�
eZdZejje�dd�Zdd�Zdd�Z	edd��Z
d	d
�Zdd�Zd
d�Z
ejje�dd�dd��Zejje�dd�dd��Zejje�dd�dd��Zejje�dd�dd��Zejje�dd�dd��Zejje�dd�ejje�dd�dd���Zejje�dd�ejje�dd�dd���Zd d!�Zd"d#�Zd$d%�Zd&d'�Zd(d)�Zd*d+�Zd,d-�Zd.d/�Zd0d1�Z d2d3�Z!d4d5�Z"d6d7�Z#d8d9�Z$d:d;�Z%ee&�'e(d<�d=d>���Z)ed?d@��Z*edAdB��Z+edCdD��Z,dEdF�Z-dGdH�Z.dIdJ�Z/dKdL�Z0dMdN�Z1dOdP�Z2dQdR�Z3dSdT�Z4dUdV�Z5dWdX�Z6dYdZ�Z7d[d\�Z8d]d^�Z9d_d`�Z:dadb�Z;dcdd�Z<dedf�Z=dgdh�Z>didj�Z?dkdl�Z@dmdn�ZAdodp�ZBdqdr�ZCdsdt�ZDdudv�ZEdwdx�ZFdydz�ZGd{d|�ZHd}d~�ZIdd��ZJd�d��ZKd�d��ZLd�d��ZMd�d��ZNd�d��ZOejje�dd�d�d���ZPejjeQjRd�d�d�d���ZSejjeQjRd�d�d�d���ZTejjeUd�d�d�d���ZVd�d��ZWd�d��ZXd�d��ZYd�d��ZZd�d��Z[d�d��Z\d�d��Z]d�d��Z^d�d��Z_d�d��Z`d�d��Zad�d��Zbd�d��Zcd�d��Zdd�d��Zed�d��Zfd�d��Zgd�d��Zhd�d��Zid�d��Zjd�d��Zke&�'e(d<�d�d���Zlejjd�emjnvd�d�d�dń�Zod�dDŽZpd�dɄZqd�d˄Zrd�d̈́Zsd�dτZtd�dфZud�dӄZvd�dՄZwd�dׄZxe&�'e(d<�d�dل�Zyejjzd�dۄ�Z{d�d݄Z|d�d߄Z}d�d�Z~d�d�Zd�d�Z�d�d�Z�d�d�Z�d�d�Z�d�d�Z�ejje��d�d�d�d��Z�d�d�Z�d�d�Z�d�d��Z��d�d�d��Z�d�d��Z�d�d��Z�d�d��Z��d�d�Z��d�d�Z��d�d�Z��d�d�Z��d�d	�Z��d
�d�Z��d�d
�Z��d�d�Z��d�d�Z��d�d�Z��d�d�Z��d�d�Z��d�d�Z��d�d�Z��d��d�d�Z��d�d �Z��d!�d"�Z��d#�d$�Z��d%�d&�Z��d'�d(�Z��d)�d*�Z��d+�d,�Z��d-�d.�Z��d/�d0�Z��d1�d2�Z��d3�d4�Z��d5�d6�Z��d7�d8�Z��d9�d:�Z��d;�d<�Z��d=�d>�Z�e&�'e(d<��d?�d@��Z�e&�'e(d<��dA�dB��Z�e&�'e(d<��dC�dD��Z�e&�'e(d<��dE�dF��Z�e&�'e(d<��dG�dH��Z��dI�dJ�Z��dK�dL�Z��dM�dN�Z��dO�dP�Z��dQ�dR�Z��dS�dT�Z��dU�dV�Z��dW�dX�Z��dY�dZ�Z��d[�d\�Z��d]�d^�Z��d_�d`�Z��da�db�Z��dc�dd�Z��de�df�Z�ejje�dd��dg�dh��Z��di�dj�Zdk�dl�ZÐdm�dn�ZĐdo�dp�ZŐdq�dr�ZƐds�dt�Zǐdu�dv�ZȐdw�dx�Zɐdy�dz�Zʐd{�d|�Zːd}�d~�Z̐d�d��Z͐d��d��Zΐd��d��Zϐd��d��ZАd��d��Zѐd��d��ZҐd��d��ZӐd��d��ZԐd��d��ZՐd��d��Z֐d��d��Zאd��d��Zؐd��d��Zِd��d��Z�ejjeۃ�d�d�Z�ejjeݠސd���d�d�Z�eܐd��d���Z�e�eߐd��d����Z�eܐd��d���Z�eeܐd��d����Z�eeܐd��d����Z�d��d��Z�eߐd��d���Z�eܐd��d���Z�eܐd��d���Z�eܐd��d���Z�d��d��Z�ejjeQjRd�d��d��d���Z�ejjeQjRd�d��d��d���Z�d��d��Z�d��d��Z�d��d��Z�d�S(��ArchiverTestCasezhardlinks not supportedr�cCst|�|j��}t|�Sr])r,�_extract_repository_idr�r%�r�Z
repository_idr^r^rar%�sz!ArchiverTestCase.get_security_dirc
Cs|��}|jdddd|jdd�}|�d|�|�d|�|�d	d
|jdd�|�d	d
d
|jdd�}|�d|�|�d|�td��"|�d|jd�Wd�n1s�0Y|�dd|j�}|�d|�|�d|�gd�}t�r�|�d�t��r
|�d�t��r|�d�|�s6|�	d�|�	d�t
�rZ|�	d�t�	tj�
dd��|�dd|jd�}|D]}|�||��qr|�dd�|�d |jd�}t
�r�d!nd"}|�d#||�t�|j�|�d |jd�}d$d%�}	|�|	|�|	|��dS)&Nr��--encryption=repokey�--show-versionz	--show-rcT�rT�borgbackup versionz%terminating with success status, rc 0r��--exclude-nodump�::testrV�--stats�::test.2zArchive name: test.2zThis archive: rkr�ry�--short�testztest.2)rVrrrzinput/dir2/file2�input/emptyr
�input/flagfilezinput/fifo1�input/link1�input/hardlinkrrrAr
�output/input�info��zNumber of files: %dcSsBgd�}g}|��D]"}|D]}|�|�r|�|�qqd�|�S)N)zName:zFingerprint:zNumber of files:z
This archive:z
All archives:zChunk index:�
)r��
startswith�appendr�)rk�prefixes�resultr�r�r^r^ra�filter�s
z9ArchiverTestCase.test_basic_functionality.<locals>.filter)r/r�r��	assert_inrCrIrJrGrHr�r@ror�r��assert_dirs_equalr�r�r�r�)
r�r.rkZlist_output�expectedr�Zinfo_outputZ
item_countZinfo_output2rMr^r^ra�test_basic_functionality�sJ
0






z)ArchiverTestCase.test_basic_functionalitycCs�tj�|jd�}tj�|jd�}t�|�t�|�tj�|d�}tj�|d�}|j|dd�t�||�|�dd|j�|�d|jd	d
d
�|�dd|jd	�}d
d�|�	d�D�}dS)N�a�br�123456�rr�r�r�r;rVry�--json-linescSsg|]}|rt�|�d�qS�r���json�loadsr�r^r^ra�
<listcomp>�rRz?ArchiverTestCase.test_create_duplicate_root.<locals>.<listcomp>rH)
ror�r�r�r�rrr�r��split)r��path_a�path_b�hl_a�hl_b�archive_list�pathsr^r^ra�test_create_duplicate_root�s

z+ArchiverTestCase.test_create_duplicate_rootcCsxtj�|jdd�}tj�|d�}|j|}t�tj��|�	dd|�Wd�n1sZ0Y|�	ddd|�dS)NZparent1Zparent2r�r�r�z--make-parent-dirs)
ror�r�r�r��pytest�raisesr>ZParentPathDoesNotExistr�)r��parent_pathr�r�r^r^ra�test_init_parent_dirs�s
,z&ArchiverTestCase.test_init_parent_dirscCsjtj�|jd�}tj�|jdd�}t�|�t�|�t�|d�|�dd|j�|�d|jd|�dS)N�parent�root�Ir�r�r�r;)ror�r�r�r�r�r�r�)r�Z
parent_dir�root_dirr^r^ra�test_create_unreadable_parent�s

z.ArchiverTestCase.test_create_unreadable_parentc
Cs�|�dd|j�z*t�tjtj�}|�tj�|j	d��WnRt
y�}z:|jtjkrbt
�d�n|jtjkrxt
�d�WYd}~n
d}~00|�d|jdd�|��td	��"|�d
|jd�Wd�n1s�0YdS)Nr�r6zunix-socketz&unix sockets disabled or not supportedz(permission denied to create unix socketsr�r;rVrkr�)r�r��socketZAF_UNIXZSOCK_STREAMZbindror�r�r�r)r��EPERMrd�skip�EACCES�closerC)r�Zsockr�r^r^ra�test_unix_socket�s 
z!ArchiverTestCase.test_unix_socketzsymlinks not supportedcCsj|��|�dd|j�|�d|jdd�td��"|�d|jd�Wd�n1s\0YdS)Nr�r6r�r;rVrkr�)r/r�r�rCr�r^r^ra�test_symlink_extracts
z%ArchiverTestCase.test_symlink_extractz4cannot properly setup and execute test without utimecCs~|��|�dd|j�|�d|jdd�td��"|�d|jd�Wd�n1s\0Yt�d�}t�d	�}dS)
Nr�r6r�r;rVrkr�r�output/input/dir2�r/r�r�rCror")r��sti�stor^r^ra�test_directory_timestamps1
s
0

z+ArchiverTestCase.test_directory_timestamps1cCs�|��|�dd|j�d}|jdd|jd|d�td��"|�d	|jd�Wd�n1sd0Yt�d
�}t�d�}dS)Nr�r6sinput/dir2
input/dir2/file2
r��--paths-from-stdinr;�rVrkr�rrtru)r�Zflist_dir_firstrvrwr^r^ra�test_directory_timestamps2s�
0

z+ArchiverTestCase.test_directory_timestamps2cCs�|��|�dd|j�d}|jdd|jd|d�td��"|�d	|jd�Wd�n1sd0Yt�d
�}t�d�}dS)Nr�r6sinput/dir2/file2
input/dir2
r�ryr;rzrkr�rrtru)r�Zflist_file_firstrvrwr^r^ra�test_directory_timestamps30s�
0

z+ArchiverTestCase.test_directory_timestamps3cCs�dd�}|��d\}}|d�}t�d||f�|�dd|j�|�dd|jd	d
�td��"|�d|jd	�Wd�n1s�0Yt�d�}t�d
�}|r�ndS)NcSs�t�|�j}z<tt�|t���}|��Wd�n1s<0YWnty\YdS0t�|�j}ttk}|o~t||�SdS�NF)	ror"�st_atime_nsr�r/�readr)r0rF)�	some_file�atime_before�file�atime_after�noatime_usedr^r^ra�has_noatimeEs*z0ArchiverTestCase.test_atime.<locals>.has_noatime)i�[i�8�
r
r�r6r��--atimer;rVrkr��output/input/file1�r/ro�utimer�r�rCr")r�r��atime�mtime�have_noatimervrwr^r^ra�
test_atimeCs
0

zArchiverTestCase.test_atimez8cannot properly setup and execute test without birthtimecCs�|��d\}}}t�d||f�t�d||f�|�dd|j�|�d|jdd�td��"|�d	|jd�Wd�n1s�0Yt�d�}t�d
�}dS)N�i�k8i�Cm8i�n8r
r�r6r�r;rVrkr�r�r��r�Z	birthtimer�r�rvrwr^r^ra�test_birthtimeds

0

zArchiverTestCase.test_birthtimecCs�|��d\}}}t�d||f�t�d||f�|�dd|j�|�dd|jdd�td	��"|�d
|jd�Wd�n1s�0Yt�d�}t�d�}dS)Nr�r
r�r6r�z
--nobirthtimer;rVrkr�r�r�r�r^r^ra�test_nobirthtimevs

0

z!ArchiverTestCase.test_nobirthtimecCs4t|j��}|jWd�S1s&0YdSr])r>r��id)r�r�r�r^r^rar4�sz'ArchiverTestCase._extract_repository_idcCs�tdd�}|�tj�|d��|�ddt|��ttj�|d�d��}|�|�Wd�n1sd0Yt	|j
��}|jWd�S1s�0YdS)N�Z
interpolation�configr�r��w)rrror�r��setr,r�r�r>r�r�)r�r�r�r�r�r�r^r^ra�_set_repository_id�s
(z#ArchiverTestCase._set_repository_idc	Cs�dd�}tj�|jd�}d}ddt>}|t|�|}t|d��D}|�|d�|�|�|�|d�|�	�}|�
|�Wd�n1s�0Y||||�}|�r�|�dd	|j�|�d
|jdd�t
|j��$|�d
d|jd�Wd�n1�s0Y|�dd�tj�|jdd�}t|d��R}|�|�|�d|�|�|�t|��|�|�|�|�d|�Wd�n1�s�0YdS)Nc	Ss�t�|�}d}|r0t|d�r0|jd|jkr0d}|r�tr�t|d��X}z0|�dtj�dkr\d}|�dtj	�|krrd}Wnt
y�d}Yn0Wd�n1s�0Y|S)NT�	st_blocks�F�rbr)ror"�hasattrr��st_sizerr��seek�	SEEK_HOLE�	SEEK_DATAr�)r��
total_size�	hole_size�st�sparser�r^r^ra�	is_sparse�s
(z4ArchiverTestCase.test_sparse_file.<locals>.is_sparser��foobarrGr?r�r�r6r�r;rVr�z--sparserDr��)ror�r�r�Z
CHUNK_MAX_EXP�lenr�r�r��tell�truncater�r�rCr�rOr�r)	r�r�rr�r�r�r��posZsparse_supportr^r^ra�test_sparse_file�s0
(46z!ArchiverTestCase.test_sparse_filec
Cs�gd�}|D]>}tj�|j|�}t|d��Wd�q1s@0Yq|�dd|j�|�d|jdd�|D]J}td��.|�d	|jdtj�d|��Wd�qt1s�0YqtdS)
N)Znormalzwith some blanksz
(with_parens)r�r�r6r�r;rVrkr�)ror�r�r�r�r�r�rC)r��	filenamesrr^r^ra�test_unusual_filenames�s 
<z'ArchiverTestCase.test_unusual_filenamescCs�|��dtjd<|�dd|j�|�|j�}|�d|jdd�t�|j�|�dd|j�|�	|j|�|�
||�|j��|jr�|jd|jd	dtd
�n@t
�tj��$|�d|jd	d�Wd�n1s�0YdS)N�
passphraser�r�r6r�r;rVr�r=�rw�r/ror�r�r�r4r�r�r�r�r�r�r+rdrerZEncryptionMethodMismatchr5r^r^ra�test_repository_swap_detection�s
z/ArchiverTestCase.test_repository_swap_detectioncCs�|��|�dd|jd�dtjd<|�dd|jd�|�d|jd	d
�t�|jd�t�|jd|jd�|j	r�|jd|jdd
t
d�n@t�t
j��$|�d|jdd
�Wd�n1s�0YdS)
Nr�r��_unencryptedr�r�r6�
_encryptedr��_encrypted::testrV�_encrypted::test.2r��r/r�r�ror�r�r�r��renamer�r+rdrerZRepositoryAccessAbortedr�r^r^ra�test_repository_swap_detection2�s
z0ArchiverTestCase.test_repository_swap_detection2cCs�|��dtjd<|�dd|j�|�|j�}|�d|jdd�t�|j�|�dd|j�|�	|j|�|�
||�|j��|�d	d
|j�|jr�|jd|jddtd�n@t
�tj��$|�d|jdd�Wd�n1s�0YdS)
Nr�r�r�r6r�r;rVr��delete�--cache-onlyr=r�r�r5r^r^ra�'test_repository_swap_detection_no_cache�s
z8ArchiverTestCase.test_repository_swap_detection_no_cachecCs|��|�dd|jd�dtjd<|�dd|jd�|�d|jd	d
�|�dd|jd�|�dd|jd�t�|jd�t�|jd|jd�|j	r�|jd|jd
d
t
d�n@t�t
j��$|�d|jd
d
�Wd�n1s�0YdS)Nr�r�r�r�r�r6r�r�r�rVr�r�r�r�r�r�r^r^ra�(test_repository_swap_detection2_no_caches
z9ArchiverTestCase.test_repository_swap_detection2_no_cachec	Cs |��|�dd|j�|�d|jdd�t�|j�tdd��>|�dd|j�|�dd	|j�t�|���Wd�n1s�0Ytdd��p|jr�|jd|jd
dt	d�n@t
�tj
��$|�d|jd
d�Wd�n1s�0YWd�n1�s0YdS)Nr�r6r�r;rVrY)r�r�r�r=r�)r/r�r�r�r�r�rDr%r�r+rdrer�CacheInitAbortedErrorr�r^r^ra�7test_repository_swap_detection_repokey_blank_passphrases,zHArchiverTestCase.test_repository_swap_detection_repokey_blank_passphrasecCs�|�dd|j�|��}t�|j|jd�tdd��"|�d|jd�Wd�n1s^0Yttj�	|d���}|�
�}Wd�n1s�0Y|�d|jd�t�|j
�|�d|jd�t�|�|�d|jd�dD]}q�dS)	Nr�r6Z_new�yes)Z BORG_RELOCATED_REPO_ACCESS_IS_OKrE�location)r�zkey-typezmanifest-timestamp)r�r�r%ror�r�rDr�r�r�rr�r�r�)r�Zsecurity_dirr�r�r�r^r^ra�test_repository_move+s0
z%ArchiverTestCase.test_repository_movecCsd|�dd|j�ttj�|��d�d��}|�d�Wd�n1sH0Y|�d|j�dS)Nr�r6r�r�zsomething outdatedrE)r�r�r�ror�r�r%r�r�r^r^ra�test_security_dir_compat=s(z)ArchiverTestCase.test_security_dir_compatcCs�|�dd|j�|�d|j�t�|j�|�d|j�t�|j�t�|���|jrl|jd|jtd�n:t�	t
j��|�d|j�Wd�n1s�0Ytdd��|�d|j�Wd�n1s�0YdS)Nr�r�rEr�r�)Z*BORG_UNKNOWN_UNENCRYPTED_REPO_ACCESS_IS_OK)
r�r�r�r�r�r%r�r+rdrerr�rDr�r^r^ra�test_unknown_unencryptedEs,z)ArchiverTestCase.test_unknown_unencryptedc	Cs4|�dd|j�|�d�|�d|jdd�td���|�d|jdd	d
�|�d��&|�d|jdd	d�Wd�n1s�0Y|�d��&|�d|jdd	d
�Wd�n1s�0Y|�d��&|�d|jdd	d�Wd�n1�s0YWd�n1�s&0YdS)Nr�r6�dir/filer�r;rVrkr��--strip-components�3r��2�1�input/dir/file�0�r�r�rrCZassert_creates_filer�r^r^ra�test_strip_componentsYs

44z&ArchiverTestCase.test_strip_componentscCs�t�tj�|jd��t�tj�|jd��|jddd�t�tj�|jd�tj�|jd��t�tj�|jd�tj�|jd��t�tj�|jd�tj�|jd��|�d	�t�tj�|jd	�tj�|jd
��|�dd|j�|�d
|jdd�dS)NZdir1zdir1/subdir�sourcerTrUZabbaz
dir1/hardlinkzdir1/subdir/hardlinkzdir1/source2z	dir1/aaaar�r6r�r;rV)	ror�r�r�r�rrr�r�r�r^r^ra�_extract_hardlinks_setupgs$���
�z)ArchiverTestCase._extract_hardlinks_setupzllfuse not installedc	Csf|��tj�|jd�}tjdkr,ddg}nddg}|j|jd|dg|�R��8t	|��Wd�n1sp0YWd�n1s�0Y|j|jd|dg|�R��8t	|��Wd�n1s�0YWd�n1s�0Y|j|jd|g|�R��:t	|��Wd�n1�s80YWd�n1�sX0YdS)	N�
mountpoint�darwin�-oz$ignore_permissions,defer_permissionsZignore_permissionsr;�--strip-components=2�
input/dir1)
r�ror�r�r�rcr�
fuse_mountr�rC)r�r�Zignore_permsr^r^ra�test_fuse_mount_hardlinkszs"

�<�<�z*ArchiverTestCase.test_fuse_mount_hardlinkscCsF|��td��"|�d|jd�Wd�n1s80YdS)Nrkr�r;�r�rCr�r�r�r^r^ra�test_extract_hardlinks1�s
z(ArchiverTestCase.test_extract_hardlinks1cCs�|��td��&|�d|jddd�Wd�n1s<0Ytd��$|�d|jdd�Wd�n1sx0YdS)Nrkr�r;r�r�r�r�r�r^r^ra�test_extract_hardlinks2�s

z(ArchiverTestCase.test_extract_hardlinks2cCs�tj�|jd�}tj�|jd�}t�|�t�|�tj�|d�}tj�|d�}|j|dd�t�||�|�dd|j�|�d|jd	d
d
�t	d��"|�d|jd	�Wd�n1s�0YdS)
NrRrSrrTrUr�r�r�r;rVrkr�)
ror�r�r�r�rrr�r�rC)r�r]r^r_r`r^r^ra�test_extract_hardlinks_twice�s


z-ArchiverTestCase.test_extract_hardlinks_twicecCsj|�dd|j�|jddd�|jddd�|jddd�|jddd�|�d	d
|jdd�td
��$|�d|jdd�Wd�n1s�0Y|�tt�d��dg�td
��$|�dd|jd�Wd�n1s�0Y|�tt�d��ddg�td
��*|�dd|j|jd�Wd�n1�sB0Y|�tt�d��ddg�dS)Nr�r6rrr	�file2�file3�file4r�z--exclude=input/file4r;rVrkr�r
rD�--exclude=input/file2�--exclude-from=)	r�r�rrCr��sortedro�listdirr�r�r^r^ra�test_extract_include_exclude�s
2
2
:z-ArchiverTestCase.test_extract_include_excludec	Cs�|�dd|j�|jddd�|jddd�|jddd�|jddd�|jd	dd�|�d
d|jdd
�td��"|�d|jd�Wd�n1s�0Y|�tt�d��gd��t�	d�td��$|�dd|jd�Wd�n1s�0Y|�tt�d��ddg�t�	d�td��&|�ddd|jd�Wd�n1�s`0Y|�tt�d��dd	g�t�	d�td��.|�dd|j
dd|jd�Wd�n1�s�0Y|�tt�d��dg�dS)Nr�r6rrr	r�r�r��file333r�z--exclude=re:input/file4$r;rVrkr�rD�rr�r�r�z--exclude=re:file3+r�z--exclude=re:file[01]r�z--exclude=re:file1z--exclude=re:file(\d)\1\1$)r�r�rrCr�r�ror�r�r�r�r�r^r^ra�"test_extract_include_exclude_regex�s0
0

2

6


�$z3ArchiverTestCase.test_extract_include_exclude_regexcCst|�dd|j�|jddd�|jddd�|jddd�|jddd�|jd	dd�|jd
dd�t|jd��$}|�d�|�d
�Wd�n1s�0Y|�dd|j|jdd�td��"|�d|jd�Wd�n1s�0Y|�tt	�
d��gd��t�d�t|jd��}|�d�Wd�n1�sL0Ytd��*|�dd|j|jd�Wd�n1�s�0Y|�tt	�
d��ddg�t�d�t|jd��8}|�d�|�d�|�d�|�d�Wd�n1�s
0Ytd��*|�dd|j|jd�Wd�n1�sN0Y|�tt	�
d��dg�dS)Nr�r6rrr	r�r�r�r�zaa:somethingr�sre:input/file4$
sfm:*aa:*thing
r�r�r;rVrkr�rDr�s
re:file3+
sre:file(\d)\1\1$
sfm:nothingwillmatchthis
s*/file1
s
re:file2$
)
r�r�rr�r�r�rCr�r�ror�r�r�r�r^r^ra�,test_extract_include_exclude_regex_from_files:
(
0
*
:



*
:z=ArchiverTestCase.test_extract_include_exclude_regex_from_filecCs�|�dd|j�|jddd�|jddd�|jddd�|jddd�|jd	dd�|�d
|jdd�td
��$|�d|jdd�Wd�n1s�0Y|�tt�d��gd��t�	d�td
��&|�dd|jdd�Wd�n1s�0Y|�tt�d��ddg�t�	d�td
��&|�dd|jdd�Wd�n1�sb0Y|�tt�d��dg�t�	d�td
��(|�d|jdddd�Wd�n1�s�0Y|�tt�d��gd��dS)Nr�r6rrr	r�r�r�r�r�r;rVrkr�zre:.*rD)rr�r�r�r�z--exclude=re:file[34]$z
re:file\d$z--exclude=input/file1zre:file[12]$zfm:input/file1zfm:*file33*�input/file2)rr�r�)
r�r�rrCr�r�ror�r�r�r�r^r^ra�test_extract_with_pattern*s,
2

4

6

8z*ArchiverTestCase.test_extract_with_patterncCsx|�dd|j�|jddd�|�d|jdd�td	��"|�d
|jd�}Wd�n1sb0Y|�d|�t�d�td	��$|�d
d
|jd�}Wd�n1s�0Y|�d|�t�d�td	��$|�d
d|jd�}Wd�n1�s0Y|�d|�t�d�td	��&|�d
dd
|jd�}Wd�n1�s^0Y|�d|�dS)Nr�r6r�rr	r�r;rVrkr��
input/filerD�--info�--list)r�r�rrC�
assert_not_inr�r�rN�r�rkr^r^ra�test_extract_list_outputKs$
0

2

4

6z)ArchiverTestCase.test_extract_list_outputcCsr|�dd|j�|jddd�|�d|jdd�td	��$|�d
|jdd�}Wd�n1sd0YdS)Nr�r6r�rr	r�r;rVrkr��
--progress)r�r�rrCr�r^r^ra�test_extract_progressds
z&ArchiverTestCase.test_extract_progresscCs�|�dd|j�|jddd�|jdttdd�|jd	td
d�t�d�t�rlt�dtd
t�n|jdttdd�dS)Nr�r6rrr	z	cache1/%s� extra stuffrUz	cache2/%ssinvalid signaturezinput/cache3zinput/cache1/%szinput/cache3/%sz	cache3/%s)	r�r�r�CACHE_TAG_NAME�CACHE_TAG_CONTENTSror�rHrr�r^r^ra�_create_test_cachesms
�
�

�z$ArchiverTestCase._create_test_cachescCsb|�dd|j�d}|jd|jdd|d�t�|�dd	|jd��}|jd
d|jddd
�}dS)Nr�r6sfoo

bar
   
r�r;�-rzryrVr��--stdoutT)rW�r�r�rYrZ)r��
input_data�item�extracted_datar^r^ra�test_create_stdin{sz"ArchiverTestCase.test_create_stdinc
Csh|�dd|j�d}d}|�dd|d|jdd	d
|�t�|�dd|jd��}|�d
d|jd�}dS)Nr�r6zsome test contentza/b/cr�z--stdin-name�--content-from-commandr;�--�echoryrVr�r�r�)r�r�r�r�r�r^r^ra� test_create_content_from_command�s�z1ArchiverTestCase.test_create_content_from_commandc
CsJ|�dd|j�|jdd|jddddd	d
d�}t�|�dd
|j��}dS)Nr�r6r�r�r;r��sh�-c�exit 73;rr�ry�--jsonr��r�rkrar^r^ra�4test_create_content_from_command_with_failed_command�s
�zEArchiverTestCase.test_create_content_from_command_with_failed_commandcCs,|�dd|j�|jdd|jddd�}dS)Nr�r6r�r�r;rr��r�r�r�r^r^ra�0test_create_content_from_command_missing_command�szAArchiverTestCase.test_create_content_from_command_missing_commandcCs�|�dd|j�|jddd�|jddd�|jddd�|jddd�d	}|jd
ddd
|jd|d�|�dd|jd�}dd�|�d�D�}dS)Nr�r6rrr	z
dir1/file2z
dir1/file3r�s"input/file1input/dir1input/file4r�ryz--paths-delimiterz\0r;rzryrVcSsg|]}|rt�|�d�qSrWrXr�r^r^rar[�rRzAArchiverTestCase.test_create_paths_from_stdin.<locals>.<listcomp>rH�r�r�rr\�r�r�rarbr^r^ra�test_create_paths_from_stdin�s
�z-ArchiverTestCase.test_create_paths_from_stdincCs�|�dd|j�|jddd�|jddd�|jddd�|jddd�d	}|�d
d|jdd
d|�|�dd|jd�}dd�|�d�D�}dS)Nr�r6rrr	r�r�r�z#input/file1
input/file2
input/file3r��--paths-from-commandr;r�r�ryrVcSsg|]}|rt�|�d�qSrWrXr�r^r^rar[�rRzCArchiverTestCase.test_create_paths_from_command.<locals>.<listcomp>rHrrr^r^ra�test_create_paths_from_command�s�z/ArchiverTestCase.test_create_paths_from_commandc
CsJ|�dd|j�|jdd|jddddd	d
d�}t�|�dd
|j��}dS)Nr�r6r�r
r;r�r�rrrr�ryrr�rr^r^ra�2test_create_paths_from_command_with_failed_command�s
�zCArchiverTestCase.test_create_paths_from_command_with_failed_commandcCs,|�dd|j�|jdd|jddd�}dS)Nr�r6r�r
r;rr�rr�r^r^ra�.test_create_paths_from_command_missing_command�sz?ArchiverTestCase.test_create_paths_from_command_missing_commandcCs*|�dd|j�|jd|jddd�dS)ztest create without a rootr�r6r�r;rr�Nrr�r^r^ra�test_create_without_root�sz)ArchiverTestCase.test_create_without_rootcCs`|�dd|j�|jddd�|jddd�|�ddd	d
|jd�}|�d|�|�d
|�dS)z$test create with only a root patternr�r6rrr	r�r��-vr�z--pattern=R inputr;�
A input/file1�
A input/file2N�r�r�rrNr�r^r^ra�test_create_pattern_root�sz)ArchiverTestCase.test_create_pattern_rootc	Cs~|�dd|j�|jddd�|jddd�|jddd�|�dd	d
dd|jd
d�}|�d|�|�d|�|�d|�dS)� test file patterns during creater�r6rrr	r��file_importantr�rr��--pattern=+input/file_important�--pattern=-input/file*r;rV�A input/file_important�
x input/file1�
x input/file2Nrr�r^r^ra�test_create_pattern�s

�z$ArchiverTestCase.test_create_patternc	Cs�|�dd|j�|jddd�|jddd�|jddd�|jddd�|�d	d
ddd
|j|jdd�}|�d|�|�d|�|�d|�|�d|�dS)rr�r6rrr	r�Z	otherfilerr�rr�z--pattern=-input/otherfile�--patterns-from=r;rVrrrzx input/otherfileN)r�r�rr�rNr�r^r^ra�test_create_pattern_file�s


�z)ArchiverTestCase.test_create_pattern_filecCs�tj�|jd�|_t|jd��}|�d�Wd�n1s>0Y|�dd|j�|j	ddd	�|j	d
dd	�|j	ddd	�|�dd
dd|j|jdd�}|�
d|�|�
d|�|�
d|�dS)z?test when patterns exclude a parent folder, but include a child�	patterns2r�s+ input/x/b
- input/x*
Nr�r6�	x/a/foo_arr	�	x/b/foo_b�y/foo_yr�rr�rr;rVzx input/x/a/foo_azA input/x/b/foo_b�A input/y/foo_y)ror�r�r��patterns_file_path2r�r�r�r�rrN�r�r�rkr^r^ra�.test_create_pattern_exclude_folder_but_recurse�s(

�z?ArchiverTestCase.test_create_pattern_exclude_folder_but_recursecCs�tj�|jd�|_t|jd��}|�d�Wd�n1s>0Y|�dd|j�|j	ddd	�|j	d
dd	�|j	ddd	�|�dd
dd|j|jdd�}|�
d|�|�
d|�|�d|�dS)zCtest when patterns exclude a parent folder and, but include a childrr�s+ input/x/b
! input/x*
Nr�r6rrr	r r!r�rr�rr;rVzinput/x/a/foo_az	input/x/ar")ror�r�r�r#r�r�r�r�rr�rNr$r^r^ra�-test_create_pattern_exclude_folder_no_recurses(

�z>ArchiverTestCase.test_create_pattern_exclude_folder_no_recursecCs�tj�|jd�|_t|jd��}|�d�Wd�n1s>0Y|�dd|j�|j	ddd	�|j	d
dd	�t
d��,|�dd
|j|jdd�Wd�n1s�0Y|�ddd|jd�}|��}|�d|�|�d|�dS)zetest that intermediate folders appear first when patterns exclude a parent folder but include a childrr�s#+ input/x/a
+ input/x/b
- input/x*
Nr�r6rrr	r rVr�rr;�.ry�--formatz{type} {path}{NL}zd x/azd x/b)
ror�r�r�r#r�r�r�r�rrCr�rN)r�r�r�Zout_listr^r^ra�.test_create_pattern_intermediate_folders_firsts(

�"z?ArchiverTestCase.test_create_pattern_intermediate_folders_firstc
Cs�|��|�dd|j�|�dd|j�t�|�dd|jddd	d
��}t�|�d|jdd	��}|dd
}|dd
}|�dd|j�|�dd|jdd�|�d|j�|�d|j�dS)Nr�r6r�r�r�z--no-cache-syncr;rVr�--errorrEr��stats�::test2r�)r/r�r�rYrZ)r��create_jsonZ	info_jsonZcreate_statsZ
info_statsr^r^ra�test_create_no_cache_sync0s�z*ArchiverTestCase.test_create_no_cache_synccCs�|�dd|j�|jddd�|jddd�|jddd�|�d|jd	d
�td��&|�dd
d|jd	�Wd�n1s�0Y|�tt�d��dg�dS)Nr�r6rrr	r�rr�r;rVrkr�rrrD�r�r�rrCr�r�ror�r�r^r^ra�test_extract_pattern_opt?s
�"z)ArchiverTestCase.test_extract_pattern_optcCsptd��"|�d|jd�Wd�n1s00Y|�tt�d��ddg�|�tt�d��tg�dS)Nrkr�r;rDZcache2rzoutput/input/cache2�rCr�r�r�r�ror�r�r�r^r^ra�_assert_test_cachesKs
0z$ArchiverTestCase._assert_test_cachescCs*|��|�dd|jdd�|��dS)Nr��--exclude-cachesr;rV�r�r�r�r2r�r^r^ra�test_exclude_cachesQsz$ArchiverTestCase.test_exclude_cachescCs<|��|�d|jdd�|�dd|jd�|��dS)Nr�r;rV�recreater3r4r�r^r^ra�test_recreate_exclude_cachesVsz-ArchiverTestCase.test_recreate_exclude_cachescCsD|�dd|j�|jddd�|�d�|�d�|jdd	d�dS)
Nr�r6rrr	ztagged1/.NOBACKUPztagged2/00-NOBACKUPztagged3/.NOBACKUP/file2r)r�r�rr�r^r^ra�_create_test_tagged\s


z$ArchiverTestCase._create_test_taggedcCsVtd��"|�d|jd�Wd�n1s00Y|�tt�d��dg�dS)Nrkr�r;rDr)rCr�r�r�r�ror�r�r^r^ra�_assert_test_taggedcs
0z$ArchiverTestCase._assert_test_taggedc	Cs0|��|�ddddd|jdd�|��dS)Nr��--exclude-if-present�	.NOBACKUP�00-NOBACKUPr;rV�r8r�r�r9r�r^r^ra�test_exclude_taggedhsz$ArchiverTestCase.test_exclude_taggedc	CsB|��|�d|jdd�|�ddddd|jd�|��dS)Nr�r;rVr6r:r;r<r=r�r^r^ra�test_recreate_exclude_taggedms�z-ArchiverTestCase.test_recreate_exclude_taggedcCs�|�dd|j�|jddd�|�d�|jddd�|jddd�|jd	dd�|jd
ttdd�|jd
dd�|�d�|jddd�|jdttdd�|jddd�dS)Nr�r6�file0rr	ztagged1/.NOBACKUP1z
tagged1/file1ztagged2/.NOBACKUP2/subfile1z
tagged2/file2z
tagged3/%sr�rUz
tagged3/file3ztaggedall/.NOBACKUP1ztaggedall/.NOBACKUP2/subfile1ztaggedall/%sztaggedall/file4)r�r�rr�r�r�r^r^ra�_create_test_keep_taggedts 

�

�z)ArchiverTestCase._create_test_keep_taggedcCs�td��"|�d|jd�Wd�n1s00Y|�tt�d��gd��|�t�d�dg�|�t�d�d	g�|�t�d
�tg�|�tt�d��dd	tg�dS)Nrkr�r;rD)r@Ztagged1Ztagged2Ztagged3Z	taggedallzoutput/input/tagged1�
.NOBACKUP1zoutput/input/tagged2�
.NOBACKUP2zoutput/input/tagged3zoutput/input/taggedallr1r�r^r^ra�_assert_test_keep_tagged�s
0�z)ArchiverTestCase._assert_test_keep_taggedcCs4|��|�ddddddd|jdd�	|��dS)	Nr�r:rBrCr3�--keep-exclude-tagsr;rV�rAr�r�rDr�r^r^ra�test_exclude_keep_tagged�s
�z)ArchiverTestCase.test_exclude_keep_taggedcCsF|��|�d|jdd�|�ddddddd	|jd�|��dS)
Nr�r;rVr6r:rBrCr3rErFr�r^r^ra�!test_recreate_exclude_keep_tagged�s�z2ArchiverTestCase.test_recreate_exclude_keep_taggedcCs�|�dd|j�|jdtd�t�tj�|jd��t�	tj�|jd�tj�|jdt
��|�d|jdd�|�d	d
d|jd�dS)Nr�r�rrUZsubdirr�r;rVr6r3rE)r�r�rr�ror�r�r�r�rr�r�r^r^ra�test_recreate_hardlinked_tags�s�z.ArchiverTestCase.test_recreate_hardlinked_tagsz4Linux capabilities test, requires fakeroot >= 1.20.2c	s�tj��fdd�}d}|�d�t�dd|�|�dd|j�|�d	|jd
d�td��Pt�	td
|��"|�d|jd
�Wd�n1s�0YWd�n1s�0YdS)Ncs"tj|dddd��|||�dS)N�security.capabilityrRF��follow_symlinks)r
r)r��uid�gid��fchownr^ra�patched_fchown�szBArchiverTestCase.test_extract_capabilities.<locals>.patched_fchowns r��
input/filerJr�r6r�r;rVrkrPr�)
rorPrr
rr�r�rCr�object)r�rQZcapabilitiesr^rOra�test_extract_capabilities�s

0z*ArchiverTestCase.test_extract_capabilitieszAxattr not supported on this system or on this version of fakerootc	Cspdd�}dd�}dd�}|�d�t�dd	d
�|�d|jd�|�d
|jdd�td���tj�d�}t	�
td|��&|jd|jdtd�}Wd�n1s�0Yt�|�t	�
td|��&|jd|jdtd�}Wd�n1s�0Yt�|�t	�
td|��&|jd|jdtd�}Wd�n1�sB0YWd�n1�sb0YdS)Nc_sttjd��dS)N�E2BIG)r�r�rU�r`�kwargsr^r^ra�patched_setxattr_E2BIG�szKArchiverTestCase.test_extract_xattrs_errors.<locals>.patched_setxattr_E2BIGc_sttjd��dS)Nr�)r�r�r�rVr^r^ra�patched_setxattr_ENOSPC�szLArchiverTestCase.test_extract_xattrs_errors.<locals>.patched_setxattr_ENOSPCc_sttjd��dS�Nrp�r�r�rprVr^r^ra�patched_setxattr_EACCES�szLArchiverTestCase.test_extract_xattrs_errors.<locals>.patched_setxattr_EACCESr�rR�user.attribute�valuer��-enoner�r;rVrkr�rr�r�)
rr
rr�r�rCror��abspathrrSr*r�)r�rXrYr\Z
input_abspathr�r^r^ra�test_extract_xattrs_errors�s*



 z+ArchiverTestCase.test_extract_xattrs_errorszonly for macOSc
Cs�|�d�|�d|jd�tj�d�}d\}}t�|��||�t�	|�j
}t�	|�j}|�d|jdd�td	��V|�d
|jd�tj�d�}t�	|�j
}t�	|�j}t�
|��|�}	Wd�n1s�0YdS)Nr�r�r_r�)scom.apple.ResourceForkswhatshouldbeherer�r;rVrkr�)rr�r�ror�r`r
rr�r"Zst_birthtime�st_mtime_nsrC�getxattr)
r�r�Zxa_keyZxa_valueZbirthtime_expectedZmtime_expectedZextracted_pathZbirthtime_extractedZmtime_extractedZxa_value_extractedr^r^ra� test_extract_xattrs_resourcefork�s

.z1ArchiverTestCase.test_extract_xattrs_resourceforkcCs�|�dd|j�|jddd�td��$|�d|jdd	�Wd�n1sP0Y|�d
|jd�}|�d|�|�d|�dS)
Nr�r6zdir1/dir2/filerr	zinput/dir1/dir2r�r;z#../../../input/dir1/../dir1/dir2/..ryrQz input/dir1/dir2/file)r�r�rrCr�rNr�r^r^ra�test_path_normalization�s
2z(ArchiverTestCase.test_path_normalizationcCs�|�dd|j�|jddd�|jddd�td��&|�dd	|jd
d�Wd�n1s`0Ytd��"|�d
|jd
�Wd�n1s�0Y|�tt�d��dg�td��&|�dd|jdd�Wd�n1s�0Ytd��"|�d
|jd�Wd�n1�s,0Y|�tt�d��dg�|�dd|jdd�td��"|�d
|jd�Wd�n1�s�0Y|�tt�d��dg�dS)Nr�r6rrr	r�rVr�z--exclude=file1�::test1r'rkr�z--exclude=./file1r,z--exclude=input/./file1�::test3rDr/r�r^r^ra�test_exclude_normalization�s"
4
0
4
2
2z+ArchiverTestCase.test_exclude_normalizationcCs8|jddd�|�dd|j�|�d|jddd�dS)	Nrrr	r�r6r�r;rV�rr�r�r�r^r^ra�test_repeated_filessz$ArchiverTestCase.test_repeated_filescCs|jddd�|jddd�|�dd|j�|�d|jdd	�t�d
�t�d�t�d�td
��"|�d|jd�Wd�n1s�0Y|�d	d
�t�d�t�d�t�d�td
��&|jd|jddd�Wd�n1s�0YdS)Nrrr	rr�r6r�r;rVrDr�rtrkr�zoutput/input/file1/dirr?r�)rr�r�ror�rCrO�unlinkr�r^r^ra�test_overwrites



0



zArchiverTestCase.test_overwritecCsP|jddd�|jddd�|�dd|j�|�d|jdd	�|�d|jd
d	�|�dd|jd�|�dd|jd
�|�d
|jdd�|�dd|jd
�|�d
|jd
d�|�dd|jd�|�dd|jd�t|j��"}t�|tj�\}}Wd�n1�s0Y|�t	|j
�d�|�d|j
�|�d|j
�dS)Nrrr	rr�r6r�r;rVr=r��	--dry-runr�ztest.3ztest.4�::test.3z::test.4r)rr�r�r>r�r&r�r�r�r��archivesrN�r�r�r�rPr^r^ra�test_rename(s"2zArchiverTestCase.test_renamecCsh|jddd�|�dd|j�|�d|jdd�|�d	|j�}|�d	|jd�}|�d	d
d|j�}dS)Nrrr	r�r6r�r;rVrE�--firstr�ri)r��	info_repo�info_archiver^r^ra�	test_info<szArchiverTestCase.test_infocs�|jddd�|�dd|j�|�d|jdd�t�|�d	d
|j��}|d}|d}|d
�t�|�d	d
|jd��}|d}|d}dS)Nrrr	r�r6r�r;rVrErr�r�r+ror�rr�r�rYrZ)r�rsr�r�rtror�r^)r+ra�test_info_jsonGszArchiverTestCase.test_info_jsoncCsD|�dd|j�t�|�ddd|j��}t�|�ddd|j��}dS)z2See https://github.com/borgbackup/borg/issues/6120r�r6rEr�	--first=1�--last=1Nr�)r�rsr^r^ra�test_info_json_of_empty_archiveesz0ArchiverTestCase.test_info_json_of_empty_archivecCs�|jddd�|�dd|j�|�d|jdd�|�dd	d
|jdd�|�dd	d|jd
d�|�dd	d|jdd�|�d|jdd	d�|�d|jdd	d�|�d|jd
d	d�|�d|jdd�dS)Nrrr	r�r6r�rfrV�	--commentzthis is the commentr,z"deleted" commentrgzpreserved comment�::test4r6z
added commentzmodified commentrYZ12345rir�r^r^ra�test_commentmszArchiverTestCase.test_commentcCsb|jddd�|jddd�|�dd|j�|�d|jdd	�|�d|jd
d	�|�d|jdd	�|�d|jdd	�|�d|jd
d	�|�dd|jd�|�dd|jd
�|�ddd|j�|�ddd|j�|�d|jd�|�dd|jd
�|�dd|jd
�}|�d|�t|j�� }|�t|�d�Wd�n1�sT0YdS)Nrrr	rr�r6r�r;rVr=rnz::another_test.1z::another_test.2r�rmr�z--glob-archivesz	another_*�--lastr�r<z
Deleted data:r?)rr�r�rNr>r�r�r�)r�rkr�r^r^ra�test_delete�s$zArchiverTestCase.test_deletecCs�|jddd�|�dd|j�|�d|jdd�|�d|jd	d�|�d|jd
d�|�d|jdd�|�d
d|jd
�|�d|jd�dS)Nrrr	r�r6r�rfrVr,rgr��test2r�rmZtest3rir�r^r^ra�test_delete_multiple�sz%ArchiverTestCase.test_delete_multiplecCs�|jddd�|jddd�|�dd|j�|�d|jdd	�|�d|jd
d	�dtjd<|jd
|jdd�dtjd<|�d
|j�|�tj�|j��dS)Nrrr	rr�r6r�r;rVr=�nor�r�rr�r�)	rr�r�ror�ZassertFalser�rr�r�r^r^ra�test_delete_repo�s

z!ArchiverTestCase.test_delete_repocCs�|�dd|j�|�d�t|jdd��l}t�|tj�\}}t|||d�}|�	�D]&}|j
�d�rR|�|j
dj�qzqR|jdd	�Wd�n1s�0Y|�d
d|jd�}|�d
|�|�dd|j�|�d|j�}|�d|�dS)Nr�r�r?Tr��testsuite/archiver.py���F�Zcompactr��--forcer;zdeleted archive was corruptedr�r�ry)r�r�r�r>r�r&r�r�r�
iter_itemsr��endswithr��chunksr��commitrNr�)r�r�r�rPr�r�rkr^r^ra�test_delete_force�s
*z"ArchiverTestCase.test_delete_forcecCs�|�dd|j�|�d�t|jdd��T}t�|tj�\}}t|||d�}|j	j
d}|�|d�|jdd	�Wd�n1s�0Y|�d
dd|jd�|�d
d|j�|�d|j�}|�
d|�dS)Nr�r�r?Tr�rs%corrupted items metadata stream chunkFr�r�r�r;r�r�ry)r�r�r�r>r�r&r�r�r�metadata�items�putr�r�)r�r�r�rPr�r�rkr^r^ra�test_delete_double_force�s
*z)ArchiverTestCase.test_delete_double_forcec	Cs�|�dd|j�|�d�|�dd|jd�|�dd|j�}|�d	|�|�d
|�tt�tj�	|j
ddd
��dd�d}ttj�	|j
ddd
|�d��$}|�d�|�
d�Wd�n1s�0Y|jdd|jdd�}|�d
|�dS)Nr�r6r?r�rmr;r�r7r9�Starting repository checkr�r�r�T)�reverser?�r+br�sXXXXr�r�)r�r�r�rNr�r�ror�r�r�r�r�r�r�)r�rkr�r�r^r^ra�test_corrupted_repository�s
&
(z*ArchiverTestCase.test_corrupted_repositoryc	Cs�|�dd|j�|�d�|�|j���|jrD|jdd|jtd�nNt�t	t
jf�� }|�dd|j�Wd�n1sz0Yt|j
t
j�r�|�dd|jd�Wd�n1s�0YdS)Nr�r6r?r��
--verify-datar��
--bypass-lock�r�r�r��	read_onlyr�r�r+rdrer:r<�RPCErrorre�value�r��excinfor^r^ra�test_readonly_check�s
.z$ArchiverTestCase.test_readonly_checkc	Cs�|�dd|j�|�d�|�d�|�|j���|jrR|jdd|jdtd�nRt�t	t
jf��$}|�dd|jd�Wd�n1s�0Yt|j
t
j�r�|�dd|jdd�Wd�n1s�0YdS)	Nr�r6rRrS�diffz%s::ar�r�r�r�r^r^ra�test_readonly_diff�s

2z#ArchiverTestCase.test_readonly_diffc	Cs�|�dd|j�|�d�|�|j���|jrH|jdd|jdtd�nRt�t	t
jf��$}|�dd|jd�Wd�n1s�0Yt|j
t
j�r�|�dd|jdd�Wd�n1s�0YdS)	Nr�r6r?�
export-tar�%s::testztest.tarr�r�r�r�r^r^ra�test_readonly_export_tar�s
2z)ArchiverTestCase.test_readonly_export_tarc	Cs�|�dd|j�|�d�|�|j���|jrF|jdd|jtd�nPt�t	t
jf��"}|�dd|j�Wd�n1s~0Yt|j
t
j�r�|�dd|jd�Wd�n1s�0YdS)Nr�r6r?r�r�r�r�r�r�r^r^ra�test_readonly_extracts
0z&ArchiverTestCase.test_readonly_extractc	Cs�|�dd|j�|�d�|�|j���|jrB|jd|jtd�nLt�t	t
jf��}|�d|j�Wd�n1sv0Yt|j
t
j�r�|�d|jd�Wd�n1s�0YdS)Nr�r6r?rEr�r�r�r�r^r^ra�test_readonly_infos
,z#ArchiverTestCase.test_readonly_infoc	Cs�|�dd|j�|�d�|�|j���|jrB|jd|jtd�nLt�t	t
jf��}|�d|j�Wd�n1sv0Yt|j
t
j�r�|�d|jd�Wd�n1s�0YdS)Nr�r6r?ryr�r�r�r�r^r^ra�test_readonly_list*s
,z#ArchiverTestCase.test_readonly_listc
Cs"|�dd|j�|�d�|�|j���|jr`|j|jtd��Wd�q�1sT0Ynnt�	t
tjf��@}|j|jdd��Wd�n1s�0YWd�n1s�0Yt
|jtj�r�|�|jdd��Wd�n1s�0YWd�n1�s0YdS)Nr�r6r?r�Fr8r�)r�r�r�r�r�r�r�r+rdrer:r<r�rer�r�r^r^ra�test_readonly_mount9s
 <z$ArchiverTestCase.test_readonly_mount�BORG_TESTS_IGNORE_MODESzmodes unreliablecCsV|jddd�|�dd|j�|�d|jdd�t�|j�j}|�t�|�d	�dS)
Nrrr	r�r6r�r;rVi�)	rr�r�ror"r��st_mode�assertEqual�S_IMODE)r��moder^r^ra�
test_umaskMs
zArchiverTestCase.test_umaskcCsx|�dd|j�|�dd|jdd�t|j��"}t�|tj�\}}Wd�n1sX0Y|�t|j	�d�dS)Nr�r6r�rmr;rVr)
r�r�r>r�r&r�r�r�r�rorpr^r^ra�test_create_dry_runUs
0z$ArchiverTestCase.test_create_dry_runcCsrt|jdd��P}t�|tj�\}}|j��ddgii|jd<|��|j	dd�Wd�n1sd0YdS)NTr�s	mandatorysunknown-features
feature_flagsFr�)
r>r�r&r�r�r�r�r�r�r�)r�Z	operationr�r�rPr^r^ra�add_unknown_feature]s
z$ArchiverTestCase.add_unknown_featurecCsP|jr|j|dti�n4t�t��}|j|�Wd�n1sB0YdS)Nrw)r�r�r+rdrer')r�r`r�r^r^ra�cmd_raises_unknown_featureds
(z+ArchiverTestCase.cmd_raises_unknown_featurecCs<t|�dd|j��|�tjj�|�d|jddg�dS)Nr�r6r�r;rV)r�r�r�r�r&�	OperationZWRITEr�r�r^r^ra�test_unknown_feature_on_createlsz/ArchiverTestCase.test_unknown_feature_on_createcCsH|�dd|j�|�dd|j�|�tjj�|�d|jddg�dS)Nr�r6r�r�r�r;rV)r�r�r�r&r��READr�r�r^r^ra�"test_unknown_feature_on_cache_syncqsz3ArchiverTestCase.test_unknown_feature_on_cache_synccCs8t|�dd|j��|�tjj�|�dd|jg�dS)Nr�r6rP�change-passphrase�r�r�r�r�r&r�ZCHECKr�r�r^r^ra�)test_unknown_feature_on_change_passphrasewsz:ArchiverTestCase.test_unknown_feature_on_change_passphrasecCs�t|�dd|j��|�d|jdd�|�tjj�td��$|�d|jdg�Wd�n1sh0Y|�d|jg�|�d	|jdg�dS)
Nr�r6r�r;rVrkr�ryrE)	r�r�r�r�r&r�r�rCr�r�r^r^ra�test_unknown_feature_on_read|s
2z-ArchiverTestCase.test_unknown_feature_on_readcCsPt|�dd|j��|�d|jdd�|�tjj�|�d|jddg�dS)Nr�r6r�r;rVr��otherr�r�r^r^ra�test_unknown_feature_on_rename�sz/ArchiverTestCase.test_unknown_feature_on_renamecCsnt|�dd|j��|�d|jdd�|�tjj�|�d|jdg�|�dd|jg�|�d|j�dS)	Nr�r6r�r;rVr��prunez--keep-daily=3)r�r�r�r�r&r�ZDELETEr�r�r^r^ra�test_unknown_feature_on_delete�sz/ArchiverTestCase.test_unknown_feature_on_deletecCsf|�dd|j�|�d|jdd�|�tjj�tj�|j	d�}t�
|�|�d|jd|g�dS)Nr�r6r�r;rVr�r�)r�r�r�r&r�r�ror�r�r�r�r��r�r�r^r^ra�test_unknown_feature_on_mount�s
z.ArchiverTestCase.test_unknown_feature_on_mountc	s�t|j�}t|�dd|j��t|jdd��x}|r>t|j�|_t	�
|t	j�\}}t|||��*}|�
�dh|j_|��Wd�n1s�0YWd�n1s�0Y|jr�|�d|jdd�n\d	�tj���fd
d�}t�td|��$|�d|jdd�Wd�n1�s"0Yt|jdd��b}|�rNt|j�|_t	�
|t	j�\}}t|||��}Wd�n1�s�0YWd�n1�s�0YdS)
Nr�r6Tr�zunknown-featurer�r;rVFcsd��|�dS)NTr^r_�ZcalledZwipe_cache_safer^ra�wipe_wrapper�szNArchiverTestCase.test_unknown_mandatory_feature_in_cache.<locals>.wipe_wrapper�
wipe_cache)�boolr�r�r�r�r>r�r$Z	_locationr&r�r�r�	begin_txnZcache_configZmandatory_featuresr�r�rr�rrS)r�Zremote_repor�r�rPr�r�r^r�ra�'test_unknown_mandatory_feature_in_cache�s.

D4z8ArchiverTestCase.test_unknown_mandatory_feature_in_cachecCsD|jddd�|�dd|j�|�dd|jdd	�}|�d
|�dS)Nrrr	r�r6r�r�r|rV�
)rr�r�rNr�r^r^ra�test_progress_on�sz!ArchiverTestCase.test_progress_oncCsB|jddd�|�dd|j�|�d|jdd�}|�d	|�dS)
Nrrr	r�r6r��::test5rVr�)rr�r�r�r�r^r^ra�test_progress_off�sz"ArchiverTestCase.test_progress_offcCs�|jddd�t�d�|jddd�|�dd|j�|�dd	|jd
d�}|�d|�|�d
|�|�dd	|jdd�}|�d|�|�d
|�dS)z�test that various file status show expected results

        clearly incomplete: only tests for the weird "unchanged" status for nowrrr	r?r�r�r6r�r�r;rVrrrf�
U input/file1N�rr+r,r�r�rNr�r^r^ra�test_file_status�s
z!ArchiverTestCase.test_file_statuscCs�|jddd�t�d�|jddd�|�dd	|j�|�d
dd|jd
d�}t�d�}|jddd�tjd|j|j	fd�|�d
dd|jdd�}|�
d|�dS)zbtest that a changed file with faked "previous" mtime still gets backed up in ctime,size cache_moders123rUr?r�rr	r�r6r�r�z--files-cache=ctime,sizerfrVr
s321)�nsr,z
M input/file1N)rr+r,r�r�ror"r�r~rbrN�r�rkr�r^r^ra�test_file_status_cs_cache_mode�s

z/ArchiverTestCase.test_file_status_cs_cache_modecCs�|jddd�t�d�|jddd�|�dd|j�|�dd	d
|jdd�}t�d
�}t�d
|jtj	A�|�dd	d
|jdd�}|�
d|�dS)zetest that a chmod'ed file with no content changes does not get chunked again in mtime,size cache_moderrr	r?r�r�r6r�r�z--files-cache=mtime,sizerfrVr
r,r�N)rr+r,r�r�ror"r�r��S_IRWXOrNr�r^r^ra�test_file_status_ms_cache_mode�s

z/ArchiverTestCase.test_file_status_ms_cache_modecCsv|jddd�t�d�|jddd�|�dd|j�|�dd	d
|jdd�}|�dd	d
|jd
d�}|�d|�dS)zItest that files get rechunked unconditionally in rechunk,ctime cache moderrr	r?r�r�r6r�r�z--files-cache=rechunk,ctimerfrVr,rNr�r�r^r^ra�test_file_status_rc_cache_modes
z/ArchiverTestCase.test_file_status_rc_cache_modec	Cs�|jddd�t�d�|jddd�trR|jddd�t�tj�|j	d�t
j�|�dd|j
�|�d	d
d|j
dd
�}|�d|�|�d|�tr�|�d|�|�d	d
d|j
dd
dd�}|�d|�|�d|�tr�|�d|�dS)z#test that excluded paths are listedrrr	r?r�r�r�r6r�r�r:r;rVrr�
x input/file3rf�	--excludez*/file2r�rN)rr+r,r@rr!ror�r�r�r"r#r�r�rNr�r^r^ra�test_file_status_excludeds"
z*ArchiverTestCase.test_file_status_excludedcCsF|jddd�|�dd|j�t�|�dd|jdd	��}|d
}dS)Nrrr	r�r6r�rr;rVr�rv)r�Zcreate_infor�r^r^ra�test_create_json!s
z!ArchiverTestCase.test_create_jsoncCs�|jddd�t�d�|jddd�|�dd|j�|�d|jd	d
�}|�d|�|�d|jdd
�}|�d|�|�ddd
|jdd
�}|�d|�|�ddd|jdd
�}|�d|�|jddd�|�ddd|jdd
�}|�d|�dS)Nrrr	r?r�r�r6r�r;rV�::test0r�z
--filter=Urfz--filter=AMr,i�rg)rr+r,r�r�r�rNr�r^r^ra�test_create_topical2s
z$ArchiverTestCase.test_create_topicalzFIFOs not supportedc
	Csddlm}dd�}|�dd|j�|jd}dd	}tj�|jd
�}tj�|jd�}t�|�t�	||�||||fd�}|�
�z|�d
d|d�W|��n
|��0td��R|�d|�d}t|d��}|�
�}	Wd�n1s�0YWd�n1�s0YdS)Nr)�Threadc	Ss:t�|tj�}zt�||�Wt�|�nt�|�0dSr])ror��O_WRONLYr�rq)�fifo_fnr�r�r^r^ra�fifo_feederMszFArchiverTestCase.test_create_read_special_symlink.<locals>.fifo_feederr�r6r;r�i�ZfifoZ	link_fifo)�targetr`r��--read-specialzinput/link_fiforkr�r�)�	threadingr�r�r�ror�r�r�r r�startrCr�r)
r�r�r�r�r�r�Zlink_fn�tr�r�r^r^ra� test_create_read_special_symlinkIs(


Fz1ArchiverTestCase.test_create_read_special_symlinkcCsRt�dtj�|jd��|�dd|j�|jd}|�dd|d�|�d	|�}dS)
Nzsomewhere does not existrr�r6r;r�r�rVry)rorr�r�r�r�r��r�r�rkr^r^ra�'test_create_read_special_broken_symlinkjs
z8ArchiverTestCase.test_create_read_special_broken_symlinkcCs�|�dd|j�|�d|jdt�|�d|jdt�|�d|jdt�|�d|jdt�|�d|jdt�|�d	d
d|jd�}|�d
d|j�}|�d|�|�d|�|�d|�|�d|�|�d|�|�d	|jd�|�d
d|j�}|�d|�|�d|�|�d|�|�d|�|�d|�|�d|jdt�|�d	|jd�|�d
d|j�}|�d|�|�d|�dS)Nr�r6r�rfr,z::test3.checkpoint�::test3.checkpoint.1z::test4.checkpointr�r�rm�--keep-daily=1ry�--consider-checkpoints�test1r�ztest3.checkpointztest3.checkpoint.1ztest4.checkpointr�z--keep-daily=2Z
checkpointZtest5�r�r�r�rNr�r�r^r^ra�test_prune_repositoryys2z&ArchiverTestCase.test_prune_repositoryc
Cs0t||||||dtj���}|�tjj��d�S)Nrz%Y-%m-%dT%H:%M:%S)r�dateutilZtzZgettz�
astimezoneZUTC�strftime)r�ZyearZmonthZdayZhourZminute�second�dtimer^r^ra�_to_utc_timestamp�sz"ArchiverTestCase._to_utc_timestamprc	Cs4|jd|}|�dd|�||||||�|t�dS)Nr�r��--timestamp)r�r�r�r�)	r�r��y�m�d�H�M�S�locr^r^ra�_create_archive_ts�sz#ArchiverTestCase._create_archive_tsc	Csf|�dd|j�|�dddd�|�dddd�|�d	dd
d�|�ddd
d�|�dddd�|�dddd�|�dddd�|�dddd�|�dddd�|�dddd�|�dddd�|�dddd�|�dddd �|�d!ddd"�|�d#ddd$�|�d%ddd&�|�d'ddd(�|�d)ddd*�|�d+ddd,�|�d-ddd�|�d.ddd�|�d/ddd0�|�d1dd2d�|�d3ddd4�|�d5d6d7|jd8d9d:�}tdd
�D]}�q�tdd;�D]}�q�|�d<|j�}tdd$�D]}|�d=||��q�|�d5|jd8d9d:�|�d<|j�}tdd�D]}|�d=||��q(tdd$�D]}|�d=||��qJdS)>Nr�r6Ztest01i�r?Ztest02�rZtest03��Ztest04�Ztest05�	Ztest06rZtest07�Ztest08��Ztest09�Ztest10r�Ztest11�Ztest12�Ztest13�Ztest14�Ztest15�Ztest16�Ztest17�Ztest18�Ztest19�Ztest20Ztest21Ztest22rZtest23rGZtest24�r�r�rmz--keep-daily=14z--keep-monthly=6z--keep-yearly=1�ryztest%02d)r�r�r�r�rNr�)r�rkr�r^r^ra�test_prune_repository_example�sN	z.ArchiverTestCase.test_prune_repository_examplecCs�|�dd|j�|�dddddd�tdd	�D],}|�d
|dd|d�|�d|jd
d�q.tdd�D],}|�d|dd|d�|�d|jd
d�qf|�ddd|jd
d�}|�ddddd�|�d|jd
d�|�ddd|jd
d�}|�d|�dS)Nr�r6�original_archivei�r�r?r�rr�z
september%02dr�r�z--keep-daily=7z--keep-monthly=1r�zoctober%02drr�rmZ	october07)r�r�r�r�r�)r�r�rkr^r^ra�#test_prune_retain_and_expire_oldest�sz4ArchiverTestCase.test_prune_retain_and_expire_oldestcCs�|�dd|j�|�d|jdt�|�d|jdt�|�ddd|jd	�}|�d
|j�}|�d|�|�d|�|�dd
|jd	�|�d
|j�}|�d|�|�d|�dS)Nr�r6r�rfr,r�r�rmr�ryr�r�z--save-spacer�r�r^r^ra� test_prune_repository_save_space�sz1ArchiverTestCase.test_prune_repository_save_spacecCs|�dd|j�|�d|jdt�|�d|jdt�|�d|jdt�|�d|jdt�|�dd	d
|jdd�}|�d
|j�}|�d|�|�d|�|�d|�|�d|�|�d|jdd�|�d
|j�}|�d|�|�d|�|�d|�|�d|�dS)Nr�r6r�z::foo-2015-08-12-10:00z::foo-2015-08-12-20:00z::bar-2015-08-12-10:00z::bar-2015-08-12-20:00r�r�rmr�z
--prefix=foo-ryzfoo-2015-08-12-10:00zfoo-2015-08-12-20:00zbar-2015-08-12-10:00zbar-2015-08-12-20:00r�r�r^r^ra�test_prune_repository_prefix
	s"z-ArchiverTestCase.test_prune_repository_prefixcCs|�dd|j�|�d|jdt�|�d|jdt�|�d|jdt�|�d|jdt�|�dd	d
|jdd�}|�d
|j�}|�d|�|�d|�|�d|�|�d|�|�d|jdd�|�d
|j�}|�d|�|�d|�|�d|�|�d|�dS)Nr�r6r�z::2015-08-12-10:00-fooz::2015-08-12-20:00-fooz::2015-08-12-10:00-barz::2015-08-12-20:00-barr�r�rmr�z--glob-archives=2015-*-fooryz2015-08-12-10:00-fooz2015-08-12-20:00-fooz2015-08-12-10:00-barz2015-08-12-20:00-barr�r�r^r^ra�test_prune_repository_glob"	s"z+ArchiverTestCase.test_prune_repository_globcCs�|�dd|j�|�d|jdt�|�d|jdt�|�d|jdt�|�dd|j�}|�d	|�|�d
|�|�d|�dS)Nr�r6r��::test-1z::something-else-than-test-1�::test-2ryz--glob-archives=test-*ztest-1ztest-2zsomething-elser�r�r^r^ra�test_list_glob7	szArchiverTestCase.test_list_globcCsp|�dd|j�|jd}|�d|t�|�d|�}|�ddd|�}|�ddd|�}|�||�|�||�dS)	Nr�r6r;r�ryr(zB{mode} {user:6} {group:6} {size:8d} {mtime} {path}{extra}{NEWLINE}z{mtime:%s} {path}{NL})r�r�r�r�ZassertNotEqual)r��test_archive�output_1�output_2�output_3r^r^ra�test_list_formatA	s
z!ArchiverTestCase.test_list_formatcCs�|�dd|j�|�ddd|jdt�|�ddd|jdt�|�d	|j�}|�d	d
d|j�}|�||�|�d	d|j�}|�|d
�|�d	d
d|j�}|�|d�|�d	d
d|j�}|�d|�|�d|�dS)Nr�r6r�r{z	comment 1rz	comment 2rryr(z{archive:<36} {time} [{id}]{NL}r>ztest-1
test-2
z{barchive}/ztest-1/test-2/z{name} {comment}{NL}ztest-1 comment 1
ztest-2 comment 2
)r�r�r�r�rN)r�rrrr^r^ra�test_list_repository_formatK	sz,ArchiverTestCase.test_list_repository_formatcCs\|jddd�|jdddd�|�dd	|j�|jd
}|�d|d�|�d
dd|�}dS)N�
empty_filerr	Zamb�ai@BrUr�r6r;r�rVryr(z{sha256} {path}{NL}ri)r�rrkr^r^ra�test_list_hashZ	s
zArchiverTestCase.test_list_hashcCsn|�dd|j�|�d|jdt�|�d|jdt�|�d|jdt�|�d|j�}|�dd|j�}dS)	Nr�r6r�rfz::test2.checkpointr�ryr�r�r�r^r^ra�test_list_consider_checkpointsd	sz/ArchiverTestCase.test_list_consider_checkpointscCs�|jddd�|�d�ttj�|jd�d��,}|�dd�|�dd�Wd�n1s`0Y|�d	d
|j�|jd}|�d|d
�|�ddd|�}dS)Nrrr	Z
two_chunksr�sabbai��sbaabr�r6r;r�rVryr(z'{num_chunks} {unique_chunks} {path}{NL})	rr�ror�r�r�r�r�r�)r�r�rrkr^r^ra�test_list_chunk_countss	s
,
z'ArchiverTestCase.test_list_chunk_countscCsl|jddd�|�dd|j�|jd}|�ddd	|d
�|�ddd
|�}|�d�d�d�\}}}}}dS)NZcompressible_file�'r	r�r6r;r��-C�lz4rVryr(z*{size} {csize} {dsize} {dcsize} {path}{NL}rHr?� )rr�r�r\)r�rrkr��csizeZdsizeZdcsizer�r^r^ra�test_list_size�	s
zArchiverTestCase.test_list_sizecCs�|jddd�|�dd|j�|�d|jdd�t�|�d	d
|j��}|d}|dd
}|�d	d|jd�}dd�|��D�}|d}|�d	dd|jd�}dd�|��D�}|d}dS)Nrrr	r�r6r�r;rVryrr�rorrVcSsg|]}t�|��qSr^rX�r��sr^r^rar[�	rRz3ArchiverTestCase.test_list_json.<locals>.<listcomp>r?z--format={sha256}cSsg|]}t�|��qSr^rXr&r^r^rar[�	rR)rr�r�rYrZr�)r�Z	list_repor�Zarchive0Zlist_archiver�rr^r^ra�test_list_json�	szArchiverTestCase.test_list_jsoncCs@|�dd|j�|jdd|jdd�|jdd|jddd�dS)	Nr�r6ryrVrr�r�	::archiverr�r^r^ra�test_list_json_args�	sz$ArchiverTestCase.test_list_json_argscCsn|��|�dd|j�|�dd|jdddd�}i}|��D]}t�|�}|||d	<q>|d
}|d}dS)Nr�r6r�z
--log-jsonr;rVr��--debug�type�file_status�log_message)r/r�r�r�rYrZ)r��log�messagesr��msgr-r.r^r^ra�
test_log_json�	s
zArchiverTestCase.test_log_jsoncCs�|��|�dd|j�|�d|jddd�|�ddd	d
�t�d
�}|��|�d�|�d|jddd
�t�d
�}|��|�d�dS)Nr�r6r�r;rVz--debug-profile=create.prof�debugzconvert-profilezcreate.profz
create.pyprofZcumtimer,z--debug-profile=create.pyprof)r/r�r��pstatsZStatsZ
strip_dirsZ
sort_stats)r�r+r^r^ra�test_debug_profile�	s


z#ArchiverTestCase.test_debug_profilecCs2|��|�dd|j�|�dd|jdd�}dS)Nr�r6r+r�r;rV)r/r�r�)r�r/r^r^ra�test_common_options�	sz$ArchiverTestCase.test_common_optionsr c	Cs�|rd|}n
t�|�}|jd|d�|�dd|j�|jd}|�dd||d	�|�d
dd|�}|�d
�d�d�\}}}t|�t|�fS)Nrr�rUr�r�r;r�r!rVryr(z{size} {csize} {path}{NL}rHr?r#)ror�rr�r�r\�int)	r��compression�compressibler�rr�rkr$r�r^r^ra�
_get_sizes�	s


zArchiverTestCase._get_sizescCs|jddd�\}}dS)N�noneT�r9�r:�r�r�r$r^r^ra�"test_compression_none_compressible�	sz3ArchiverTestCase.test_compression_none_compressiblecCs|jddd�\}}dS)Nr;Fr<r=r>r^r^ra�$test_compression_none_uncompressible�	sz5ArchiverTestCase.test_compression_none_uncompressiblecCs|jddd�\}}dS)N�zlibTr<r=r>r^r^ra�"test_compression_zlib_compressible�	sz3ArchiverTestCase.test_compression_zlib_compressiblecCs|jddd�\}}dS)NrAFr<r=r>r^r^ra�$test_compression_zlib_uncompressible�	sz5ArchiverTestCase.test_compression_zlib_uncompressiblecCs|jddd�\}}dS)Nr"Tr<r=r>r^r^ra�!test_compression_lz4_compressible�	sz2ArchiverTestCase.test_compression_lz4_compressiblecCs|jddd�\}}dS)Nr"Fr<r=r>r^r^ra�#test_compression_lz4_uncompressible�	sz4ArchiverTestCase.test_compression_lz4_uncompressiblecCs|jddd�\}}dS)N�lzmaTr<r=r>r^r^ra�"test_compression_lzma_compressible�	sz3ArchiverTestCase.test_compression_lzma_compressiblecCs|jddd�\}}dS)NrFFr<r=r>r^r^ra�$test_compression_lzma_uncompressible�	sz5ArchiverTestCase.test_compression_lzma_uncompressiblecCs|jddd�\}}dS)N�zstdTr<r=r>r^r^ra�"test_compression_zstd_compressible
sz3ArchiverTestCase.test_compression_zstd_compressiblecCs|jddd�\}}dS)NrIFr<r=r>r^r^ra�$test_compression_zstd_uncompressible
sz5ArchiverTestCase.test_compression_zstd_uncompressiblecCs`|jddd�\}}|�d|j�|jddd�\}}|�d|j�|jddd�\}}t||�}dS)N�	auto,zlibTr<r�rAr")r:r�r��min)r�Z	auto_sizeZ
auto_csizeZ	zlib_sizeZ
zlib_csizeZlz4_sizeZ	lz4_csizeZsmallest_csizer^r^ra�"test_compression_auto_compressible
s
z3ArchiverTestCase.test_compression_auto_compressiblecCs|jddd�\}}dS)NrLFr<r=r>r^r^ra�$test_compression_auto_uncompressible
sz5ArchiverTestCase.test_compression_auto_uncompressiblecCsF|�dd|j�dtjd<|�dd|j�dtjd<|�d|j�dS)	Nr�r6Z
newpassphraseZBORG_NEW_PASSPHRASErPr�r�ry)r�r�ror�r�r^r^ra�test_change_passphrase
s


z'ArchiverTestCase.test_change_passphrasecCs"|�dd|j�|�d|j�dS)Nr�r6�
break-lockrr�r^r^ra�test_break_lock&
sz ArchiverTestCase.test_break_lockcCs|��|�d�dS)N�-h�r�r�r^r^ra�
test_usage*
szArchiverTestCase.test_usagecCsdSr]r^r�r^r^ra�	test_help.
szArchiverTestCase.test_helpcCsdd�}|�dd|j�|��|d�}|�ddd|jd	d
�|�ddd|jdd
�trpt�tj�d
d��tj�|jd
�}|�	|j|��P|j
|jtj�|dd
�ddd�|j
|jtj�|dd
�ddd�Wd�n1s�0Y|�	|jd	|����|j
|jtj�|d
�ddd�d}tj�|d
d�}t�|�}t�|�}|�rPt
��rXt|d��<}t|d��}	Wd�n1�s�0YWd�n1�s�0Yt
��r�d}tj�|d
d�}t�|�}
t�|�}t��rd}tj�|d
d�}tj|dd�}tj|dd�}
t��r:tj�|d
d�}t�|�}
znd}t�tj�|d
d��}tj�snt�|j��rnn8zt�|d�Wn&t�y�}zWYd}~n
d}~00WnFt�y�}z,tj�d��r�|jtjk�r�n�WYd}~n
d}~00Wd�n1�s0YdS)NcSs^t�|�j}zt�t�|t��Wnty6YdS0t�|�j}ttk}|oXt||�SdSr})	ror"r~rqr�r/r)r0rF)r�r�r�r�r^r^rar�7
sz/ArchiverTestCase.test_fuse.<locals>.has_noatimer�r6r
r�r:r�r)rV�
::archive2r
r�r�T)�ignore_flags�
ignore_xattrs�archive2rr�rCrrBrFrKrzinput/fusexattrrr)Znothing_here_now)r�r�r/r@ror�r�r�r�r�rOr�r"rHr�rGrIrr
rrrcr�rcrrIr��ENOTSUP)r�r�r�r�Zin_fnZout_fnZsti1Zsto1Zin_fZout_fZsti2Zsto2rvrwr�r�r^r^ra�	test_fuse5
sn��$�

@


zArchiverTestCase.test_fusecs�|�dd|j�|jddd�t�rJ|jddd�t�dd	�t�dd
�|�d|jdd
�|jddd�|�d|jdd
�tj�|jd�}|�	|j|dd��ftj�|d
d��t�
��}t�r�tj�|d
dd�}tj�|d
dd�}tj�|d
dd�}Wd�n1�s0Y|�	|j|dddd��<t��r^tj�|d
dd�}tj�|d
dd�}Wd�n1�st0YdS)Nr�r6r?sfirstrUZ	hardlink1rTzinput/hardlink1zinput/hardlink2zinput/hardlink3r��
::archive1rVssecondrWr�r�Zversionszhardlink1.00001Z	hardlink2zhardlink2.00001Z	hardlink3zhardlink3.00001�-e)r�r�rrHrorr�r�r�r�r�)r�r��filesZhl1Zhl2Zhl3r^rWra�test_fuse_versions_view�
s.
 z(ArchiverTestCase.test_fuse_versions_viewc	Cst|�dd|j�|�d�|�d�\}}|�R|��D],}|j�d�r6|�|jdj	�|j}qdq6|j
dd�Wd�n1s�0Y|jdd	|jd
d�tj�|j
d�}|�|jd
|��Lt�t��"}ttj�||��Wd�n1s�0YWd�n1�s0Y|�|jd
|dd��&ttj�||����Wd�n1�sf0YdS)Nr�r6r�r�r�Fr�r�r�rr�r�r)r�Zallow_damaged_files)r�r�r�r�r�r�r�r�r�r�r�ror�r�r�rdrer�r�rq)r�r�r�r�r�r�r�r^r^ra�test_fuse_allow_damaged_files�
s$
*0 z.ArchiverTestCase.test_fuse_allow_damaged_filescCsv|�dd|j�|�d�|�d�|�d�|�d�tj�|jd�}|�|j|dd	��Wd�n1sp0Y|�|j|d
d	��Wd�n1s�0Y|�|j|d��Wd�n1s�0Y|�|j|d��Wd�n1�s0Y|�|j|d
��Wd�n1�s60Y|�|j|d��Wd�n1�sh0YdS)Nr�r6Zarch11Zarch12Zarch21Zarch22r�z	--first=2z--sort=namez--last=2z--glob-archives=arch1*z--glob-archives=arch2*z--glob-archives=arch*z--glob-archives=nope*)r�r�r�ror�r�r�r�r�r^r^ra�test_fuse_mount_options�
s$



  z(ArchiverTestCase.test_fuse_mount_optionsc	s�ddlm�ddl�ddl�tj�|jd������fdd�}|tj	j
j�tj	j
_�z|�dd|j
�|�d	�tj�|jd
�}|j|j
|dd��Wd�n1s�0Yt�d
��}��|�}Wd�n1s�0Ytd|�d�tjdd�|d}|du�rN|d}tddg��|����|j|d��Rddtjdd��|d}|d}Wtj	j
jjtj	j
_ntj	j
jjtj	j
_0dS)zOBoth old_id and new_id must not be stale during lock migration / daemonization.r)�wrapsNzmigrate_lock_assert_data.picklecs&��������fdd���d�_�S)Ncs�jd7_�j||tj|�tj|�d�ddddd�d�}z:t�d��}��||�Wd�n1sj0YWnYn0�z&zx�|||�WW|d�tj|�tj|�d��z:t�d��}��||�Wd�n1s�0YWSYS0St�y>}z$||d<��|j�|d<WYd}~n
d}~00W|d�tj|�tj|�d��z<t�d��}��||�Wd�n1�s�0YWnYn0nl|d�tj|�tj|�d��z<t�d��}��||�Wd�n1�s�0YWnYn00dS)Nr?)Zold_id_aliveZnew_id_alive)�	num_calls�old_id�new_id�before�	exception�exception.extr_tb�afterr�rjrhri)	rdrZ
process_aliver��dump�update�
BaseException�
extract_tb�
__traceback__)r�rerf�assert_dataZ_outr�)�assert_data_file�migrate_lock�pickle�	traceback�wrapperr^raru�
sf���.�.�(�0��0zTArchiverTestCase.test_migrate_lock_alive.<locals>.write_assert_data.<locals>.wrapperr)rd)rr�rqrsrtrc)rrrura�write_assert_data�
s!zCArchiverTestCase.test_migrate_lock_alive.<locals>.write_assert_datar�r�Zarchr�T)Zos_forkr�z$
Lock.migrate_lock(): assert_data = r')r�rzrhriz)Lock.migrate_lock() raised an exception:
z#Traceback (most recent call last):
rY)�sep�endr�rzrgrj)�	functoolsrcrsrtror�r�r�r~�locking�Lockrrr�r�r�r�r�r�r�rcrX�format_list�format_exception�	__class__�__wrapped__)	r�rwr�Z_inrprhZextracted_tbZassert_data_beforeZassert_data_afterr^rvra�test_migrate_lock_alive�
s@'
(
���
�
z(ArchiverTestCase.test_migrate_lock_alivecs�t��t�����fdd�}���dtjd<��dd|�j�|���d�jdd	�|���d�jd
d	�|���d�jd
�|�dS)Ncs�t�j���}|�|�����D]z\}}|�|�}t|���}|�vr��|�t	t
|�d�}t|dd��}t|||�D]}��
|����|�q|qWd�n1s�0YdS)N�)�!)r>r�Z
open_indexZget_transaction_id�	iteritemsr�rZdigest�addrr�rr�r�)r�r��_r��hashZ
num_blocks�nonceZcounter��seenr��usedr^ra�verify_uniquenessEs

zIArchiverTestCase.verify_aes_counter_uniqueness.<locals>.verify_uniquenessr�r�r�z
--encryption=r�r;rVr=r�)r�r/ror�r�r�)r��methodr�r^r�ra�verify_aes_counter_uniquenessAs

z.ArchiverTestCase.verify_aes_counter_uniquenesscCs|�d�dS)N�keyfile�r�r�r^r^ra�#test_aes_counter_uniqueness_keyfile]sz4ArchiverTestCase.test_aes_counter_uniqueness_keyfilecCs|�d�dS)N�repokeyr�r�r^r^ra�&test_aes_counter_uniqueness_passphrase`sz7ArchiverTestCase.test_aes_counter_uniqueness_passphrasecCsz|��|�dd|j�|�d|jdd�td��$|�dd|jd�}Wd�n1s^0Ytt�d��}dS)	Nr�r6r�r;rVrkr3zdump-archive-items�r/r�r�rCr�ror��r�rkZ
output_dirr^r^ra�test_debug_dump_archive_itemscs
2z.ArchiverTestCase.test_debug_dump_archive_itemscCsv|��|�dd|j�|�d|jdd�td�� |�dd|j�}Wd�n1sZ0Ytt�d��}dS)	Nr�r6r�r;rVrkr3zdump-repo-objsr�r�r^r^ra�test_debug_dump_repo_objsms
.z*ArchiverTestCase.test_debug_dump_repo_objscCs�|�dd|j�d}|jd|d�|�dd|jd�}|��}|�dd	|j|d�}|�dd
|j|d�}tdd��}|��}Wd�n1s�0Y|�dd
|j|�}|�dd
|j|�}|�dd
|jd�}dS)Nr�r6s	some datar�rUr3zid-hashr�zput-objzget-objzoutput/filer�z
delete-objZinvalid)r�r�r�stripr�r)r�r�rk�id_hashr�Z	data_readr^r^ra�test_debug_put_get_delete_objws&z.ArchiverTestCase.test_debug_put_get_delete_objcCsNdd�}t�td|��$|jdd|jdd�Wd�n1s@0YdS)NcWst�dSr])�EOFErrorr_r^r^ra�	raise_eof�sz7ArchiverTestCase.test_init_interrupt.<locals>.raise_eofr�r�r6r?r�)rrSrr�r�)r�r�r^r^ra�test_init_interrupt�s2z$ArchiverTestCase.test_init_interruptcCs|jd|jdd�dS)Nr�rr�rr�r^r^ra�$test_init_requires_encryption_option�sz5ArchiverTestCase.test_init_requires_encryption_optioncCst|�dd|j�|jr0|jdd|jddd�n@t�tj��$|�dd|jd�Wd�n1sf0YdS)Nr�r6z/nestedrr�)r�r�r�rdrer>Z
AlreadyExistsr�r^r^ra�test_init_nested_repositories�s
z.ArchiverTestCase.test_init_nested_repositoriesc	Cstj�|jd�}t|d���|�dd|jd�t|��}|��}Wd�n1sV0Ydd|jdf}|j	r�|j|dd	i�n:t
�tj
jj��|j|�Wd�n1s�0Yt|��}|��}Wd�n1s�0YWd�n1�s0YdS)
z�BORG_KEY_FILE=something borg init should quit if "something" already exists.

        See https://github.com/borgbackup/borg/pull/6046r��Z
BORG_KEY_FILEr�z--encryption=keyfiler�Nr�rwr)ror�r�r�rDr�r�r�rr�rdrer~r�errors�Error)r�r�r�rg�argrjr^r^ra�%test_init_refuse_to_overwrite_keyfile�s
&(
&z6ArchiverTestCase.test_init_refuse_to_overwrite_keyfilec	Cs|�d|j�|����}t�|tj�\}}t|||dd��}|j}Wd�n1sV0Yt�|�t|||��}|j}Wd�n1s�0YWd�n1s�0Yt	�}|�
�D]&\}\}	}
}||\}}
}|�|�q�|�
�D]\}\}	}
}q�dS)Nr�F��sync)r�r�r�r&r�r�rr�Zdestroyr�r�r�)r�r�r�rPr�Zoriginal_chunksZcorrect_chunksr�r�Zrefcountr�r$Z
o_refcountZo_sizeZo_csizer^r^ra�check_cache�s
$
BzArchiverTestCase.check_cachec	Cs�|�dd|j�|�d|jdd�|����}t�|tj�\}}t|||dd��>}|��|j�	t
|j���dd�|��Wd�n1s�0YWd�n1s�0Yt
�t��|��Wd�n1s�0YdS)	Nr�r6r�r;rVFr�r)r�r�r�r&r�r�rr�r�Zincrefryr�r�rdre�AssertionErrorr�)r�r�r�rPr�r^r^ra�test_check_cache�s
Dz!ArchiverTestCase.test_check_cachecCs(|�dd|j�|jd|jddd�}dS)Nr�r6r6z
--target=asdfrr�rr�r^r^ra�test_recreate_target_rc�sz(ArchiverTestCase.test_recreate_target_rccCs�|��|�dd|j�|��|jd}|�d|d�|��|�d|j�}|�d|dd	d
d�|��|�d|j�}|jd}|�dd
|�}dS)Nr�r6r�r�rVryr6rr^�input/dir2/file3z--target=new-archivez
::new-archiver>)r/r�r�r�)r�r�r
ro�listingr^r^ra�test_recreate_target�s

z%ArchiverTestCase.test_recreate_targetcCsj|��|jddd�|�dd|j�|jd}|�d|d�|�d	|d
dd�|��|�d
d|�}dS)Nz
dir2/file3rr	r�r6r�r�rVr6rr^r�ryr>)r/rr�r�r�)r�r�r�r^r^ra�test_recreate_basic�s
z$ArchiverTestCase.test_recreate_basiccCs�|��|�d|jdd�|�d|jdd�|��td��"|�d|jd�Wd�n1sh0Ytd��"|�d|jd�Wd�n1s�0YdS)	Nr�r,rVr6r;r�rkr�)r�r�r�r�rCr�r^r^ra�test_recreate_subtree_hardlinks�s

z0ArchiverTestCase.test_recreate_subtree_hardlinkscCs�ttj�|jd�d��$}|�d�|�d�Wd�n1s@0Y|�dd|j�|�ddd	|jd
d�|�d|jddd
�|�d|jd
ddd�}tt	|�
d��\}}|�d|jdd�|��dS)NZ
large_filer�saaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbr�r6r��--chunker-params�	7,9,8,127rfrVr,z--files-cache=disabledryzinput/large_filer(z{num_chunks} {unique_chunks}r#r6�default)r�ror�r�r�r�r�r��mapr7r\r�)r�r�ry�
num_chunksZ
unique_chunksr^r^ra�test_recreate_rechunkify
s
(�z)ArchiverTestCase.test_recreate_rechunkifycCs�ttj�|jd�d��}|�dd�Wd�n1s:0Y|�dd|j�|�ddd	|jd
d�|�d|jd
d
dd�}t|�}|�d|jdd�|�d|jd
d
dd�}t|�}dS)Nr�r�r� r�r6r�r�r�r;rVryr�r(�{num_chunks}r6z
fixed,4096�	r�ror�r�r�r�r�r�r7)r�r�rkr�r^r^ra�test_recreate_fixed_rechunkifys,��z/ArchiverTestCase.test_recreate_fixed_rechunkifycCs�ttj�|jd�d��}|�dd�Wd�n1s:0Y|�dd|j�|�ddd	|jd
d�|�d|jd
d
dd�}t|�}|�dddd|jd
�}|�d|jd
d
dd�}t|�}dS)Nr�r�rr�r�r6r�r�r�r;rVryr�r(r�r6r+r�Zfilename_never_matchesr�)r�r�rkr�Znum_chunks_after_recreater^r^ra�test_recreate_no_rechunkify,s,��z,ArchiverTestCase.test_recreate_no_rechunkifycCs�|jddd�|�dd|j�|�d|jddd	d
�|�d|jddd
d�}|�d�\}}}|�d|jd	dd�|��|�d|jddd
d�}|�d�\}}}dS)Nr9r r	r�r6r�r;rVr!r;ry�input/compressibler(z{size} {csize} {sha256}r#r6r"z--recompress)rr�r�r\r�)r�Z	file_listr�r$Z
sha256_beforeZsha256_afterr^r^ra�test_recreate_recompress=s��z)ArchiverTestCase.test_recreate_recompresscs�t�ttd�����j}|��|�dd|j�|jd}|�d|d�|�ddd	d
d|�|�d|��	�}td
dd�|�
d�}|�d��dS)Nrr�r6r�r�rVr6r�z1970-01-02T00:00:00r{r?rEi�r?rz%Y-%m-%d)r�nowrrr�Ztzinfor/r�r�r�Z	utcoffsetr�)r�Zlocal_timezoner�rEr�r^)Zs_timera�test_recreate_timestampMs
�
z(ArchiverTestCase.test_recreate_timestampcCsv|jddd�|�dd|j�|�d|jdd�|�d	|jd�}|�d
|jddd
�|��|�d	|jd�}dS)Nr9r r	r�r6r�r;rVryr6z-nr^r��rr�r�r�)r�Zarchives_beforeZarchives_afterr^r^ra�test_recreate_dry_run[sz&ArchiverTestCase.test_recreate_dry_runcCst|jddd�|�dd|j�|�d|jdd�|�d	|jd�}|�d
|jdd�|��|�d	|jd�}dS)
Nrrr	r�r6r�r;rVrEr6r�r�r�)r�Zinfo_beforeZ
info_afterr^r^ra�!test_recreate_skips_nothing_to_doesz2ArchiverTestCase.test_recreate_skips_nothing_to_docCsP|�dd|j�tj�|jd�}ddd|f}|jd|jg|�Rdd	d
��dS)Nr�r6r�Zpython3rz<import os, sys; sys.exit(42 if os.path.exists("%s") else 23)�	with-lockT�*�rTrw)r�r�ror�r�r�)r�Z	lock_pathr�r^r^ra�test_with_lockoszArchiverTestCase.test_with_lockcCs8|�dd|j�dg}|jd|jg|�Rdtd��dS)Nr�r6Znon_existent_commandr�Tr�)r�r�r+)r�r�r^r^ra�#test_with_lock_non_existent_commandusz4ArchiverTestCase.test_with_lock_non_existent_commandcCsN|�dd|j�|jddd�|jddd�|jddd�|jddd�|jd	dd�|�d
|jdd�|�d
dd|jddd�}|��|�d|�|�d|�|�d
d|jddd�}|��|�d|�|�d|�|�d
|jddd�}|��|�d|�|�d|�|�d
d|jddd�}|��|�d|�|�d|�dS)Nr�r6rrr	r�r�r�Zfile5r�r;rVr6r�r�r^r�r
rzinput/file3r�zinput/file4z
x input/file4zinput/file5z
x input/file5)r�r�rr�rNr�r�r^r^ra�test_recreate_list_outputzs.z*ArchiverTestCase.test_recreate_list_outputc
CsD|�dd|j�|�d|jdd�|jdddd	d|jd
dd�dS)
Nr�r6r�r;rVr�rrr�r~Trr�rr�r^r^ra�test_bad_filters�sz!ArchiverTestCase.test_bad_filterscCs|jd}|�d|jdd�|�|j�}|�dd|j|�t|��}|��}Wd�n1s`0Y|jdt�	|j�d}t|��}|��}Wd�n1s�0Yt�
|�|�dd	|j|�t|��}|��}Wd�n1s�0YdS)
N�	/exportedr��--encryptionr�rP�export�/r�import)r�r�r�r4r�r�rr�ror�rk)r��export_file�repo_idr��export_contents�key_file�key_contentsZ
key_contents2r^r^ra�test_key_export_keyfile�s

&
&

&z(ArchiverTestCase.test_key_export_keyfilecCs
|�d|jdd�tj�|jd�}|�dd|j|�tj�|jt�|j�d�}t|��}|�	�}Wd�n1sv0Yt�
|�tj�|jd�}t|d	��"|�dd
|j|�Wd�n1s�0Yt|��}|�	�}Wd�n1s�0YdS)Nr�r�r��exportedrPr�rZimportedr�r�)r�r�ror�r�r�r�r�r�rrkrD)r�Zexported_key_filer�r�r�Zimported_key_fileZimported_key_contentsr^r^ra�*test_key_import_keyfile_with_borg_key_file�s
&
0
&z;ArchiverTestCase.test_key_import_keyfile_with_borg_key_filec	CsX|jd}|�d|jdd�|�|j�}|�dd|j|�t|��}|��}Wd�n1s`0Yt|j��(}t|�}|�	dt
���Wd�n1s�0Ytt
j���}|�	|t
���t|j��}|�d�Wd�n1s�0Y|�dd|j|�t|j��(}t|�}|�	dt
���Wd�n1�sJ0YdS)	Nr�r�r�r�rPr�rRr�)r�r�r�r4r�r�rr>rr�rZenv_passphraserrPZTestKeyZMockRepositoryZsave_key)	r�r�r�r�r�r�Zrepo_keyZ
backup_keyZ	repo_key2r^r^ra�test_key_export_repokey�s$

&.(0z(ArchiverTestCase.test_key_export_repokeycCst|jd}|�d|jdd�|�|j�}|�ddd|j|�t|dd	��}|��}Wd�n1sf0YdS)
Nz/exported.htmlr�r�r�rPr�z	--qr-htmlrZr[)r�r�r�r4r�r�r)r�r�r�r�r�r^r^ra�test_key_export_qr�s
&z#ArchiverTestCase.test_key_export_qrcCs@|jd}t�|�|�d|jdd�|jdd|j|td�dS)Nr�r�r�r�rPr�r�)r�ror�r�r�r+)r�Zexport_directoryr^r^ra�test_key_export_directory�s

z*ArchiverTestCase.test_key_export_directorycCsV|jd}|�d|jdd�|jdd|j|td�t|d��}|�d	�Wd�n1s\0Y|jr�|jdd|j|d
d�n<t�t	��"|�dd|j|�Wd�n1s�0Yt|d��}|�d�Wd�n1s�0Y|j�r|jdd|j|d
d�n>t�t
��"|�dd|j|�Wd�n1�sH0YdS)Nr�r�r�r�rPr�r�r�zsomething not a key
rzBORG_KEY a0a0a0
)r�r�r�r+r�r�r�rdrer"r!)r�r�r�r^r^ra�test_key_import_errors
s
(0(z'ArchiverTestCase.test_key_import_errorscCs�d}|jd}|�d|jdd�|�|jt|��|jdt�|j�d}t	|d��:}|�
tjd	|d
�|�
t
d����Wd�n1s�0Y|�dd
d|j|�t	|��}|��}Wd�n1s�0YdS)N�@e294423506da4e1ea76e8dcdf1a3919624ae3ae496fddf905610c351d3f09239r�r�r�r�r�rr�r#rH�abcdefghijklmnopqrsturPr��--paper)r�r�r�r�r�rr�ror�r�r�r�FILE_IDrrsr)r�r�r�r�r�r�r^r^ra�test_key_export_paperkey
s
0
&z)ArchiverTestCase.test_key_export_paperkeycCs�d}|�d|jdd�|�|jt|��|jdt�|j�d}t|d��:}|�	t
jd|d	�|�	td
��
��Wd�n1s�0Yd}|jdd
d|j|d�d}|jdd
d|j|d�d}|jdd
d|j|d�dS)Nr�r�r�r�r�rr�r#rHr�s�2 / e29442 3506da 4e1ea7 / 25f62a 5a3d41  02
2 / e29442 3506da 4e1ea7  25f62a 5a3d41 - 02
2 / e29442 3506da 4e1ea7 / 25f62a 5a3d42 - 02
2 / e29442 3506da 4e1ea7 / 25f62a 5a3d41 - 02
616263 646566 676869 6a6b6c 6d6e6f 707172 - 6d


737475 88
73747i - 88
73747 - 88
73 74 75  -  89
00a1 - 88
2 / e29442 3506da 4e1ea7 / 25f62a 5a3d41 - 02
616263 646566 676869 6a6b6c 6d6e6f 707172 - 6d
73 74 75  -  88
rPr�r�rzs
y
s12 / e29442 3506da 4e1ea7 / 25f62a 5a3d41 - 02

y
)r�r�r�r�rr�ror�r�r�rr�rrs)r�r�r�r�Ztyped_inputr^r^ra�test_key_import_paperkey2
s0�z)ArchiverTestCase.test_key_import_paperkeycCs�|jddd�|�dd|j�|�d|jdd�|jd	}|�d
d|j|�}t|��}t�|�}Wd�n1sv0YdS)Nrrr	r�r6r�r;rV�/dumpr3z
dump-manifest�rr�r�r�r�rYr��r�Z	dump_filerkr�rLr^r^ra�test_debug_dump_manifest_
s

(z)ArchiverTestCase.test_debug_dump_manifestcCs�|jddd�|�dd|j�|�d|jdd�|jd	}|�d
d|jd|�}t|��}t�|�}Wd�n1sz0YdS)Nrrr	r�r6r�r;rVr�r3zdump-archiver�r�r^r^ra�test_debug_dump_archiven
s

(z(ArchiverTestCase.test_debug_dump_archivecCs�|�dd|j�|�dd|jd���}t�|�dd|jdd	��}|d
d}|�dd|j|���}|�dd|jdd
���}dS)Nr�r6r3zrefcount-objZ@0000000000000000000000000000000000000000000000000000000000000000r�rr;rVr�r�Z124Zxyza)r�r�r�rYrZ)r�rkr-�
archive_idr^r^ra�test_debug_refcount_obj|
sz(ArchiverTestCase.test_debug_refcount_objcCs|�dd�}dS)Nr3rErTr�r^r^ra�test_debug_info�
sz ArchiverTestCase.test_debug_infocCsR|�dd|j�tdd��$|�dd|j|j�Wd�n1sD0YdS)Nr�r6r�)Z_BORG_BENCHMARK_CRUD_TESTZ	benchmarkZcrud)r�r�rDr�r�r^r^ra�test_benchmark_crud�
sz$ArchiverTestCase.test_benchmark_crudcCs�|��t�d�|�dd|j�|�dd|j�}|�d|�|�d|�|�d|�|�d	|�|�d
|�|�d|�|�d|�|�d
|�|jd|jd
dd�}|�d|�|�d|jd
d�|�d|jd
�}|�dd|j�}|�d
|�|�dd|jd
�dD]b\}}|�d|j|�}|�d|j||�|�d|j|�}|�dd|j|�|jd|j|dd��q|jddd|jdd�|jd|jdd�|jd|jddd�dS)NrAr�r6r�r�z[repository]�versionZsegments_per_dirZ
storage_quota�append_only�additional_free_spacer�Zlast_segment_checkedr?r�z
No option Z123z--delete))r�Z2G)zrepository.append_onlyr�rzinvalid-option)r/rorkr�r�rNr�)r�rkZcfg_keyZ	cfg_valuer^r^ra�test_config�
s8
zArchiverTestCase.test_configz(GNU tar must be installed for this test.�gzipz%gzip must be installed for this test.cCs�|��t�d�|�dd|j�|�d|jdd�|�d|jddd	�td
��t�gd��Wd�n1sx0Y|jddd
d
d
d�dS)NrAr�r6r�r;rVr��
simple.tarr�rk�r��xpfz
../simple.tar�--warning=no-timestamprDT�rXrY�	ignore_ns)	r/rorkr�r�rCri�
check_callrOr�r^r^ra�test_export_tar�
s

,z ArchiverTestCase.test_export_tarcCs�t�d�st�d�|��t�d�|�dd|j�|�d|jdd�|�d	|jdd
d�}t	d��t
�gd
��Wd�n1s�0Y|jdddddd�dS)Nr��gzip is not installedrAr�r6r�r;rVr�z
simple.tar.gzr�rk)r�r�z../simple.tar.gzr�rDTr��
r�r�rdror/rorkr�r�rCrir�rO�r�ryr^r^ra�test_export_tar_gz�
s



,z#ArchiverTestCase.test_export_tar_gzcCs�t�d�st�d�|��t�d�|�dd|j�|�d|jdd�|�d	|jdd
dd�}t	d
��t
�gd��Wd�n1s�0Y|jdddddd�dS)Nr�r�rAr�r6r�r;rVr�r�z--strip-components=1r�rkr�zoutput/Tr�r�r�r^r^ra� test_export_tar_strip_components�
s



,z1ArchiverTestCase.test_export_tar_strip_componentscCsX|��|�d|jddd�td��t�gd��Wd�n1sJ0YdS)Nr�r;�
output.tarr�rk�r�r�z
../output.tarr��r�r�r�rCrir�r�r^r^ra�&test_export_tar_strip_components_links�
s

z7ArchiverTestCase.test_export_tar_strip_components_linkscCsX|��|�d|jddd�td��t�gd��Wd�n1sJ0YdS)Nr�r;r�r�rkr�r�r�r^r^ra�test_extract_hardlinks_tar�
s

z+ArchiverTestCase.test_extract_hardlinks_tarcCs�|��t�d�|�dd|j�|�d|jdd�|�d|jdd�|�d	|jd
d�t|j��"|�d|jd
�Wd�n1s�0Y|jddd
d
d�dS)NrAr�r�r��::srcrVr�r��
import-tar�::dstr�rDT�r�rY)r/rorkr�r�rCr�rOr�r^r^ra�test_import_tars
0z ArchiverTestCase.test_import_tarcCs�t�d�st�d�|��t�d�|�dd|j�|�d|jdd�|�d	|jdd
�|�d|jdd
�t	|j
��"|�d
|jd�Wd�n1s�0Y|jddddd�dS)Nr�r�rAr�r�r�rrVr�z
simple.tgzrrr�rDTr)r�r�rdror/rorkr�r�rCr�rOr�r^r^ra�test_import_tar_gz
s


0z#ArchiverTestCase.test_import_tar_gzc
Cs�|jdd�t�d�td���t�gd��t�gd��tdd���}td	d
��}|�|���Wd�n1sv0Yt�d	�tdd
��}|�|���Wd�n1s�0Yt�d�Wd�n1s�0YWd�n1s�0Y|�	dd
|j
�|�	dd|j
dd�t�d�t|j��"|�	d|j
d�Wd�n1�sl0Y|jddddd�dS)NF)r-rArV�r��cf�	file1.tarr�r�r�the_rest.tarr�zfile1*r'�concatenated.tarr�rr�r
r�r�rz--ignore-zerosr�input/concatenated.tarr�rkTr)
r/rorkrCrir�r�r�rr�r�r�rO�r�ZconcatenatedrZthe_restr^r^ra�.test_import_concatenated_tar_with_ignore_zeross$

,
,F
2z?ArchiverTestCase.test_import_concatenated_tar_with_ignore_zerosc
Csj|��t�d�td���t�gd��t�gd��tdd���}tdd��}|�|���Wd�n1sr0Ytd	d��}|�|���Wd�n1s�0YWd�n1s�0YWd�n1s�0Y|�	d
d|j
�|�	d|j
d
d�t|j��"|�	d|j
d
�Wd�n1�sH0Y|�t�
d�dg�dS)NrArVrr	rr�rr�r
r�r�rrrr�rkr)r/rorkrCrir�r�r�rr�r�r�r�r�r
r^r^ra�1test_import_concatenated_tar_without_ignore_zeros9s

,h2zBArchiverTestCase.test_import_concatenated_tar_without_ignore_zeroscCs�tjddd�|�d�td��0t�gd��t�gd����}Wd�n1sV0Y|�d	d
|j	�|�d|j	dd
�|�dd|j	d�}dS)zDTest that paths starting with './' are normalized during import-tar.z	input/dirT)�exist_okr�rV)r�r�dotslash.tarz./dir)r�ZtfrNr�r�rz
::dotslashzinput/dotslash.tarryz--format={path}{NL})
rorrrCrir�rjrsr�r�)r�Ztar_contentrkr^r^ra�#test_import_tar_with_dotslash_pathsRs

z4ArchiverTestCase.test_import_tar_with_dotslash_pathsc
Cs�t|j�}d|d|jgd|dgd|gd|ddgd|gd|gd	|gd
|dgdd|d
gdd|dgdd|gd|gg}|D]}|j|ddd��}qzdS)Nr�r;r�r�r�Znewnameryr�r�rErPr�r�r�r�rQTrr�)rOr�r�r�)r�r�Zcmdsr`rkr^r^ra�test_detect_attic_repoms"




�z'ArchiverTestCase.test_detect_attic_repoc	Cs�dd�}|�d�t�ddd�|�d|jd�|�d	|jd
d�td��Tt�td
|��&|jd|jd
td�Wd�n1s�0YWd�n1s�0YdS)�.https://github.com/borgbackup/borg/issues/6063c_sttjd��dSrZr[rVr^r^rar\�sz`ArchiverTestCase.test_do_not_fail_when_percent_is_in_xattr_name.<locals>.patched_setxattr_EACCESr�rRsuser.attribute%pr^r�r_r�r;rVrkrr�r�N)	rr
rr�r�rCrrSr*�r�r\r^r^ra�.test_do_not_fail_when_percent_is_in_xattr_name�s

z?ArchiverTestCase.test_do_not_fail_when_percent_is_in_xattr_namec	Cs�dd�}t�tj�|jd��t�ddd�|�d|jd�|�d	|jd
d�t	d��Tt
�td
|��&|jd|jd
td�Wd�n1s�0YWd�n1s�0YdS)rc_sttjd��dSrZr[rVr^r^rar\�sz_ArchiverTestCase.test_do_not_fail_when_percent_is_in_file_name.<locals>.patched_setxattr_EACCESzdir%psinput/dir%pr]r^r�r_r�r;rVrkrr�r�N)
rorr�r�r�r
rr�r�rCrrSr*rr^r^ra�-test_do_not_fail_when_percent_is_in_file_name�s
z>ArchiverTestCase.test_do_not_fail_when_percent_is_in_file_namecCs<|jdd}|jd|ddd�}|�d|�|�d|�d	S)
z.https://github.com/borgbackup/borg/issues/6014z-this-repository-does-not-existr;rErT)rwrTzthis-repository-does-not-existz$this-repository-does-not-exist::testN)r�r�rNr�r�r^r^ra�4test_do_not_mention_archive_if_you_can_not_find_repo�szEArchiverTestCase.test_do_not_mention_archive_if_you_can_not_find_repocCs�|jddd�|�dd|j�|�d|jdd�t�tj�|jd	��t�tj�|��d	��|�d
|j�}|�d|j�}|�d
|jd�}|�d|jd�}t	d��"|�d
|jd�Wd�n1s�0Y|�
dd�dS)z�Nonce is only used for encrypting new data.

        It should be possible to retrieve the data from an archive even if
        both the client and the server forget the noncer�Hello, borgrUr�r6r�r;rVr�rEryrkr�NrD)rr�r�ror�r�r�r�r%rCrO)r�Z	repo_infoZ	repo_listZarchive_inforar^r^ra�+test_can_read_repo_even_if_nonce_is_deleted�s
0z<ArchiverTestCase.test_can_read_repo_even_if_nonce_is_deletedcCsd|jddd�|�dd|j�|�d|jdd�tj�|jd	�}t�|�|�d|jd
d�dS)a We should be able to recover if path/to/repo/nonce is deleted.

        The nonce is stored in two places: in the repo and in $HOME.
        The nonce in the repo is only needed when multiple clients use the same
        repo. Otherwise we can just use our own copy of the nonce.
        rrrUr�r6r�r;rVr�r,N)rr�r�ror�r�r�r�)r�r�r^r^ra�%test_recovery_from_deleted_repo_nonce�s
z6ArchiverTestCase.test_recovery_from_deleted_repo_nonceN)rrr)r )�r0r1r2rd�mark�skipifrHZrequires_hardlinksr%rQrcrgrlrrrGrsrJrxr{r|r�rKr�r�r4r�r�r�r�r�r�r�r�r�r�r�r�r��unittest�
skipUnlessrAr�r�r�r�r�r�r�r�r�r�r�r�r�rrr	rrr
rrrrr%r&r)r.r0r2r5r7r8r9r>r?rArDrGrHrIr
rrTrarMrdrerhrjrlrqrurwrzr}rr�r�r�r�r�r�r�r�r�r�r�r�ror�r�r�r�r�r�r�r�r�r�r�r�Zallow_cache_wiper�r�r�r�r�r�r�r�r�r�rIr�r�r�r�r�rrrrrrrrrrrr%r(r*r2r5r6r:r?r@rBrCrDrErGrHrJrKrNrOrPrRrUrVr\r`rarbr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�Zrequires_gnutarr�r�Z
requires_gzipr�r�r�r�r�rrrrrrrrrrrr^r^r^rar3�s?



�
�

 	3

 



!(!		






	






	
$
 (=





d



W





-'



r3zno borg.exe availablecs�eZdZdZdZe�d�dd��Ze�d�dd��Ze�d�d	d
��Z	e�d�dd��Z
e�d
�dd��Ze�d�dd��Z�fdd�Z
e�d�dd��Ze�d�dd��Z�ZS)�ArchiverTestCaseBinaryr�Tz(does not raise Exception, but sets rc==2cCsdSr]r^r�r^r^rarg�sz,ArchiverTestCaseBinary.test_init_parent_dirszpatches objectscCsdSr]r^r�r^r^rar��sz*ArchiverTestCaseBinary.test_init_interruptcCsdSr]r^r�r^r^rarT�sz0ArchiverTestCaseBinary.test_extract_capabilitiescCsdSr]r^r�r^r^rara�sz1ArchiverTestCaseBinary.test_extract_xattrs_errorszLtest_basic_functionality seems incompatible with fakeroot and/or the binary.cCsdSr]r^r�r^r^rarQ�sz/ArchiverTestCaseBinary.test_basic_functionalityzBtest_overwrite seems incompatible with fakeroot and/or the binary.cCsdSr]r^r�r^r^rarl�sz%ArchiverTestCaseBinary.test_overwritecs t�rt�d�n
t���dS)Nz9test_fuse with the binary is not compatible with fakeroot)rLrro�superr\r��rr^rar\�sz ArchiverTestCaseBinary.test_fusecCsdSr]r^r�r^r^rar�szEArchiverTestCaseBinary.test_do_not_fail_when_percent_is_in_xattr_namecCsdSr]r^r�r^r^rar�szDArchiverTestCaseBinary.test_do_not_fail_when_percent_is_in_file_name)r0r1r2r�r�rrorgr�rTrarQrlr\rr�
__classcell__r^r^r"rar �s&






r cs�eZdZ�fdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Z�ZS)�ArchiverCheckTestCasecs`t���t�tdd��4|�dd|j�|�d�|�d�Wd�n1sR0YdS)N�BUFFER_SIZErr�r6�archive1rZ)r!r�rrSrr�r�r�r�r"r^rar�s


zArchiverCheckTestCase.setUpcCs<|jddd|jdd�}|�d|�|�d|�|�d|�t�d	��tj�|jddd
|jdd�}|�d|�|�d|�|�d|�|jddd|jdd�}|�d|�|�d|�|jdddd|jdd�}|�d
|�|jdddd|jdd�}|�d
|�|�d|�|jdddd|jdd�}|�d
|�|�d|�dS)Nr�rr�rr�r�z"Starting archive consistency checkzChecking segmentszborg.output.progressz--repository-onlyz--archives-onlyz--glob-archives=archive2r&rxrZry)r�r�rN�loggingZ	getLoggerZsetLevelZNOTSETr�r�r^r^ra�test_check_usage
s(z&ArchiverCheckTestCase.test_check_usagec	Cs||�d�\}}|�^|��D].}|j�d�r|j}|d}|�|j�qVq|�d�|jdd�Wd�n1sv0Y|j	d|j
dd	�|j	dd
|j
dd	�}|�d|�|j	d|j
dd	�|j	d
d|j
ddd	�}|�d|�dD]�}|�|�\}}|�Z|��D]6}|j�d��r|�||j�|�
||j��qN�q|�d�Wd�q�1�sd0Yq�t�tdd��|�d�Wd�n1�s�0Y|j	ddd
|j
dd	�}|�d|�|�d|�dD]v}|�|�\}}|�L|��D](}|j�d��r�|�||j��q0�q�|�d�Wd�n1�sF0Y�q�|j	d
d|j
ddd	�}|�
d|�dS)Nr&r�r�zshould not happenFr�r�r?r�r�rzNew missing file chunk detectedryz--format={health}#{path}{LF}r]zbroken#)r&rZr%r�archive3rz$Healed previously missing file chunkzAtestsuite/archiver.py: Completely healed previously damaged file!)r�r�r�r�r�r�r�Zfailr�r�r�rNZassert_not_equalr�rrSrr�r�)r�r�r�r�Zvalid_chunksZkilled_chunkrk�archive_namer^r^ra�test_missing_file_chunk$sP
*
,*
.z-ArchiverCheckTestCase.test_missing_file_chunkcCs�|�d�\}}|�.|�|jjd�|jdd�Wd�n1sF0Y|jd|jdd�|jdd|jdd�|jd|jdd�dS)	Nr&rFr�r�r?r�r�)r�r�r�r�r�r�r��r�r�r�r^r^ra�test_missing_archive_item_chunkVs*z5ArchiverCheckTestCase.test_missing_archive_item_chunkcCs�|�d�\}}|�(|�|j�|jdd�Wd�n1s@0Y|jd|jdd�|jdd|jdd�|jd|jdd�dS)	Nr&Fr�r�r?r�r�r)r�r�r�r�r�r�r,r^r^ra�test_missing_archive_metadata_s*z3ArchiverCheckTestCase.test_missing_archive_metadatacCs�|�d�\}}|�(|�tj�|jdd�Wd�n1s@0Y|jd|jdd�|jddd|jd	d�}|�d|�|�d
|�|jd|jd	d�dS)Nr&Fr�r�r?r�rr�rrZ)r�r�r&�MANIFEST_IDr�r�r�rN)r�r�r�rkr^r^ra�test_missing_manifesths*z+ArchiverCheckTestCase.test_missing_manifestcCs�|�d�\}}|�>|�tj�}|d}|�tj|�|jdd�Wd�n1sV0Y|jd|jdd�|jddd	|jd
d�}|�d|�|�d|�|jd|jd
d�dS�Nr&�
corrupted!Fr�r�r?r�rr�rrZ)	r�r�r&r/r�r�r�r�rN)r�r�r�r��corrupted_manifestrkr^r^ra�test_corrupted_manifestss*z-ArchiverCheckTestCase.test_corrupted_manifestcCs�|�d�\}}|�`|�tj�}|d}|�tj|�|�|j�}|d}|�|j|�|jdd�Wd�n1sx0Y|jd|jdd�|jddd	|jd
d�}|�	d|�|jd|jd
d�dSr1)
r�r�r&r/r�r�r�r�r�rN)r�r�r�r�r3�chunkZcorrupted_chunkrkr^r^ra�%test_manifest_rebuild_corrupted_chunk�s*z;ArchiverCheckTestCase.test_manifest_rebuild_corrupted_chunkc		Cs|�d�\}}|j}|�||�tj�}|d}|�tj|�ggdddddd�}|j|dd	�}|�|�}|�||�|��|j	d
d�Wd�n1s�0Y|j
d|jdd
�|j
dd|jdd
�|�
d|j�}|�d|�|�d|�|�d|�dS)Nr&r2�foo�barz2016-12-15T18:49:51.849711r?)�cmdliner��hostname�usernamer�r+r�sarchive)�contextFr�r�r�r�rryz
archive1.1rZ)
r�rPr�r&r/r�Zpack_and_authenticate_metadatar��encryptr�r�r�rN)	r�r�r�rPr�r3Zarchive_dictr�rkr^r^ra�'test_manifest_rebuild_duplicate_archive�s0�	
*z=ArchiverCheckTestCase.test_manifest_rebuild_duplicate_archivecCs�|jd|jdd�t|jdd��(}|�dd�|jdd	�Wd�n1sN0Y|jd|jd
d�|jd|jd
d�|jdd|jdd�|jd|jdd�|jdd
|jddd�dS)Nr�rr�Tr�s 01234567890123456789012345678901sxxxxFr�r?r�r�rmr])r�r�r>r�r��r�r�r^r^ra�test_extra_chunks�s*z'ArchiverCheckTestCase.test_extra_chunkscGs�t�|j�|jd|jg|�R�|�d�|�d�\}}|�b|��D]<}|j�	d�rH|j
d}|�|j�d}|�
|j|�q�qH|jdd�Wd�n1s�0Y|jd|jd	d
�|jdd|jdd
�}|jdd
d|jd	d
�}dS)Nr�r&r�r�s1234Fr�r�rr�r�r?r�)r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�)r�Z	init_argsr�r�r�r5r�rkr^r^ra�_test_verify_data�s 

*z'ArchiverCheckTestCase._test_verify_datacCs|�dd�dS)Nr�r��rAr�r^r^ra�test_verify_data�sz&ArchiverCheckTestCase.test_verify_datacCs|�dd�dS)Nr�r;rBr�r^r^ra�test_verify_data_unencrypted�sz2ArchiverCheckTestCase.test_verify_data_unencryptedcCsht|jdd��4}|��D]}|�|�q|jdd�Wd�n1sH0Y|jd|jdd�dS)NTr�Fr�r�r?r�)r>r�ryr�r�r�)r�r�Zid_r^r^ra�test_empty_repository�s
*z+ArchiverCheckTestCase.test_empty_repositoryc
Cs�Gdd�d�}|�d�\}}|�xt�|tj�\}}t|||��:}t|||d|dd�}|j�|��|��Wd�n1s�0YWd�n1s�0Y|j	d|j
dd	�|j	d
|j
ddd	�dS)Nc@seZdZdd�ZdS)zAArchiverCheckTestCase.test_attic013_acl_bug.<locals>.Attic013Itemc	Ssddddddddd�S)NZ1234r�0)spathsmtimesmodesusersgroupsuidsgidsaclr^r�r^r^ra�as_dict�s�zIArchiverCheckTestCase.test_attic013_acl_bug.<locals>.Attic013Item.as_dictN)r0r1r2rGr^r^r^ra�Attic013Item�srHr&z0.13T)r�r�r�rr�ryz::0.13)r�r&r�r�rrZitems_bufferr�Zsaver�r�)r�rHr�r�r�rPr�r^r^ra�test_attic013_acl_bug�sDz+ArchiverCheckTestCase.test_attic013_acl_bug)r0r1r2r�r(r+r-r.r0r4r6r>r@rArCrDrErIr#r^r^r"rar$s2		
r$c@s4eZdZdd�Zdd�Zdd�Zdd�Zd	d
�ZdS)�ManifestAuthenticationTestcCs||�dt�|tj�\}}|�tj|�t�diit�t	dd��
t�d����|jdd�Wd�n1sn0YdS)Nr?�Zdays)r�ror��	timestampFr�)
r&r�r�r�r/r=r.�packbr1rr��
ISO_FORMATr�)r�r�r�rPr^r^ra�spoof_manifest�s�z)ManifestAuthenticationTest.spoof_manifestcCs�|�dd|j�t|jdd�}|�bt�|tj�\}}|�tj|�	t
�dit�t
dd��t�d����|jdd	�Wd�n1s�0Yt�t��|�d
|j�Wd�n1s�0YdS)Nr�r6Tr�r?rK)r�rorLFr�ry)r�r�r>r�r&r�r�r�r/r=r.rMr1rr�rNr�rdrerrpr^r^ra�test_fresh_init_tam_requireds�*z7ManifestAuthenticationTest.test_fresh_init_tam_requiredc	Csb|�dd|j�|�d�t|jdd�}|��t�tt|j	���t
�|t
j�\}}d|_
|�|j�t�|�d|�t
j���}|d=|�t
j|�t�|���|jdd�Wd�n1s�0Y|�d	d
|j�}|�dd|j�|�d	d
|j�}|�|�t�t��|�d	|j�Wd�n1�s40Y|�ddd
|j�|�d	|j�dS)Nr�r6�archive1234Tr�Fstamr�ryr+�upgradez--tamr�)r�r�r�r>r�r�r�r%r,r�r&r�r�Ztam_requiredZchange_passphraseZ_passphraser.ZunpackbZdecryptr�r/r�r=rMr�rOrdrer)r�r�r�rPr�rkr^r^ra�test_not_requireds(
*
.z,ManifestAuthenticationTest.test_not_requiredcCsF|�dd|j�|�d�|�dd|j�t|jdd�}|�|�dS)Nr�r6rQrR�
--disable-tamTr��r�r�r�r>r�rOr?r^r^ra�test_disable2s

z'ManifestAuthenticationTest.test_disablecCsF|�dd|j�|�d�t|jdd�}|�|�|�dd|j�dS)Nr�r6rQTr�rRrTrUr?r^r^ra�
test_disable2:s

z(ManifestAuthenticationTest.test_disable2N)r0r1r2rOrPrSrVrWr^r^r^rarJ�s
 rJc@s,eZdZdd�Zdd�Zdd�Zdd�Zd	S)
�ArchiveAuthenticationTestcCszt�|tj�\}}t�d|gdddt��t�d��}|�|�}|�	||�
|��|t��f|j
|<|��|jdd�dS)Nr?rY)r�r�r�r9r:r;r+Fr�)r&r�r�r.rMr1r�rNr�r�r=rr�ror�r�)r�r�r*r�rPZarchive_datar�r^r^ra�write_archive_without_tamEs
�	
z3ArchiveAuthenticationTest.write_archive_without_tamcCs�|�dd|j�|�d�t|jdd�}|�|�|d�Wd�n1sN0Y|�dd|j�}|�d	d
|j�|�dd|j�}dS)Nr�r6�archive_tamTr��archive_no_tamry�--format="{name} tam:{tam}{NL}"rRz--archives-tam�r�r�r�r>r�rY�r�r�rkr^r^ra�test_upgrade_archives_tamVs
*z3ArchiveAuthenticationTest.test_upgrade_archives_tamcCs�|�dd|j�|�d�t|jdd�}|�4|�|d�|�tj�|j	dd�Wd�n1sf0Y|�d	d
|j�|�dd|j�}dS)
Nr�r6rZTr�r[Fr�r�r�ryr\)
r�r�r�r>r�rYr�r&r/r�r^r^r^ra�test_check_rebuild_manifestds
*z5ArchiveAuthenticationTest.test_check_rebuild_manifestcCs�|�dd|j�|�d�|�dd|j�}t|jdd�}|�|�|d�Wd�n1s^0Y|�dd	|j�}|�d
d|j�|�dd	|j�}|�dd|j�}dS)Nr�r6rZryz--format="{name} {id}{NL}"Tr�r[r\r�r�r])r�Zarchive_id_pre_checkr�rkZarchive_id_post_checkr^r^ra�test_check_rebuild_refcountsqs
*z6ArchiveAuthenticationTest.test_check_rebuild_refcountsN)r0r1r2rYr_r`rar^r^r^rarXCs
rXc@sfeZdZdZdd�Zdd�Zdd�Ze�d�d	d
��Z	e�d�dd��Z
e�d�d
d��Zdd�ZdS)�RemoteArchiverTestCasez__testsuite__:cCstt|j��Sr])r<r$r�r�r^r^rar��sz&RemoteArchiverTestCase.open_repositoryc	Cs�t�tdd|jg�� |�dd|j�Wd�n1s:0Yt�tdd|jg��Nt�t��$|�dd|jd�Wd�n1s�0YWd�n1s�0Yt�tdddg��Nt�t��$|�dd|jd�Wd�n1s�0YWd�n1�s0Yt	j
�|j�}t�tdd|g��$|�dd|jd�Wd�n1�st0Yt�tdddd|g��$|�dd|jd	�Wd�n1�s�0YdS)
N�extra_test_argsz--restrict-to-pathr�r6Z_0z/fooZ_1Z_2Z_3)rrSr<r�r�r�rdrer=ror�r)r�Zpath_prefixr^r^ra�!test_remote_repo_restrict_to_path�s.PR4z8RemoteArchiverTestCase.test_remote_repo_restrict_to_pathc	Cs�t�tdd|jg�� |�dd|j�Wd�n1s:0Ytj�|jd�}t�tdd|g��Jt	�
t�� |�dd|j�Wd�n1s�0YWd�n1s�0YdS)Nrcz--restrict-to-repositoryr�r6rQ)rrSr<r�r�r�ror�r�rdrer=)r�rfr^r^ra�'test_remote_repo_restrict_to_repository�s.z>RemoteArchiverTestCase.test_remote_repo_restrict_to_repositoryzonly works locallycCsdSr]r^r�r^r^rar��sz4RemoteArchiverTestCase.test_debug_put_get_delete_objcCsdSr]r^r�r^r^rar��sz"RemoteArchiverTestCase.test_configcCsdSr]r^r�r^r^rar��sz.RemoteArchiverTestCase.test_migrate_lock_alivec	Cs~|�dd|j�|jddd�|jddd�|jdd	d�|jd
dd�|jdd
d�|�d|jdd�d}td���|�dd|jddd�}|�d��(|�dd|jddd�}Wd�n1s�0Y|�d��(|�dd|jddd�}Wd�n1�s0Y|�d��(|�dd|jddd�}Wd�n1�sP0YWd�n1�sp0YdS)Nr�r6r�stest file contents 1rUz	dir/file2stest file contents 2z
skipped-file1stest file contents 3z
skipped-file2stest file contents 4z
skipped-file3stest file contents 5r�r;rVz)cached responses left in RemoteRepositoryrkr�r+r�r�r�r�r�r�r�r�)r�Zmarker�resr^r^ra�-test_remote_repo_strip_components_doesnt_leak�s&
 zDRemoteArchiverTestCase.test_remote_repo_strip_components_doesnt_leakN)
r0r1r2r�r�rdrerror�r�r�rgr^r^r^rarb�s	


rbcsFeZdZ�fdd�Zddd�Zdd�Zdd	�Zd
d�Zdd
�Z�Z	S)�ArchiverCorruptionTestCasecsFt���|��|�dd|j�t�|�d|jd��dd|_dS)Nr�r6rErr�r�)r!r�r/r�r�rYrZr�r�r"r^rar��s
z ArchiverCorruptionTestCase.setUpr?cCspt|d��R}|�|tj�tdd�|�|�D��}|�|tj�|�|�Wd�n1sb0YdS)Nr�css|]}d|VqdS)�Nr^)r��cr^r^rar��rRz5ArchiverCorruptionTestCase.corrupt.<locals>.<genexpr>)r�r�ru�SEEK_END�bytesrr�)r�r��amountr�Z	corruptedr^r^ra�corrupt�s
z"ArchiverCorruptionTestCase.corruptcCsl|�tj�|jd��|jr0|jd|jdd�}n8t�	t
��|�d|j�Wd�n1s^0YdS)Nr�rErr�)rnror�r�r�r�r�r�rdrer#�r�r�r^r^ra�test_cache_chunks�sz,ArchiverCorruptionTestCase.test_cache_chunkscCsB|�d|jdd�|�tj�|jd��|�d|jdd�}dS)Nr�r;rVr_rf)r�r�rnror�r�r�ror^r^ra�test_cache_files�sz+ArchiverCorruptionTestCase.test_cache_filescCs|�d|jdd�|�d|jd���}|�d|jdd�|�dd|j�|�d	|jd
�tj�|jd�}|�tj�||d��tj�|jd
�}tdd�}|�	|�|�
ddttd���t
|d��}|�|�Wd�n1s�0Y|jdd|jdddd�}dS)Nr�rfrVryz--format={id}{LF}r,r�r�rErzchunks.archive.dz.compactr�r�r�r�� r�rrgr?r�)r�r�r�ror�r�r�rnrrr�r,rlr�r�)r�Z	target_idZchunks_archive�config_pathr�r�r�r^r^ra�test_chunks_archive�s

(z.ArchiverCorruptionTestCase.test_chunks_archivecCs�tj�|jd�}tdd�}|�|�|�ddttd���t	|d��}|�
|�Wd�n1sd0Y|�d|j�}dS)Nr�r�r�r�rrr�rE)
ror�r�r�rrr�r,rlr�r�r�r�)r�rsr�r�r�r^r^ra�test_old_version_interfereds

(z6ArchiverCorruptionTestCase.test_old_version_interfered)r?)
r0r1r2r�rnrprqrtrur#r^r^r"rarh�s

rhc@s$eZdZdd�Zdd�Zdd�ZdS)�DiffArchiverTestCasecs"�jddd��jddd��jddd��jdd	d��jd
dd�t�d�t�dtjd
B�t�d�t�r�t�d�t�dd�t�dd�t�dd�t�dd�t�dd�t�r�t�	dd�t�	dd�t�	dd�t�	dd���
dd�j���
d �jd!d"��jd#d$d��jd%dd�t�d��jd
d&d'�t�d�t�d�t�
d��jd(d)d�t�dtjd
B�t�d*�t�
d�t��r�t�
d�t�d*d�t�d�t�d*d�t�d*d+�t�d��jd,d-d�t�d�t��rt�d�t�	d.d/�tdd0��}|�d1�Wd�n1�sD0Y��
d �jd2d"���
d d3d4�jd5d"�dD�fd7d8�	}dEd9d:�}��
d;�jd!d<�}||d=��j
d;�jd!d>d?d@dA�}||d6d=dB���
d;�jd!d<dC�}||d=���
d;�jd!d<dCd?�}||d=d=dB�dS)FNr�rr	Zfile_unchanged�Zfile_removed�Z
file_removed2r�Z
file_replacedrzinput/dir_replaced_with_filei�zinput/dir_removedzinput/dir_replaced_with_linkzinput/link_changedzinput/file_unchangedzinput/link_removedzinput/file_removed2zinput/link_target_removedr@z"input/link_target_contents_changedzinput/link_replaced_by_filezinput/file_replacedzinput/hardlink_target_replacedzinput/hardlink_contents_changedzinput/file_removedzinput/hardlink_removedzinput/hardlink_target_removedr�r6r�r�rVZ
file_addediZfile_empty_addeds0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000rUZdir_replaced_with_filer�zinput/dir_addedzinput/link_addedZlink_replaced_by_filei@zinput/file_addedzinput/hardlink_added�abs
appended_dataz::test1ar�z
16,18,17,4095z::test1bFcs�|rdnd�d�}|��}��||�d��dtjvrJtsJ|sJ��|d�t�rt��|d���|d���|d	�|r|d
nd�d�}��||�d��t�r���||�d��t�r�t�r�t�r�t�r�|r�dS)
N�Bz{:<19}�modifiedz.*input/file_replacedr�z6drwxr-xr-x -> -rwxr-xr-x.*input/dir_replaced_with_filez changed link.*input/link_changedzadded link.*input/link_addedz removed link.*input/link_removedz0 Bz
.*input/emptyz!.*input/hardlink_contents_changed)�formatr�Zassert_line_existsror�rNrGrH)rk�can_compare_ids�content_onlyZchange�linesr�r^ra�
do_assertsQs$	
	zADiffArchiverTestCase.test_basic_functionality.<locals>.do_assertscSs�dd�}dd�|�d�D�}|r,dddd	�nd
di}dtjvrB|sBt�rL|sL|r\ddd
d	�nd
di}t�rjt�rpt�rvt�r|t�r�|r�dS)Ncs �fdd�|D�}dd�|D�S)Ncs g|]}|d�kr|d�qS)r�Zchangesr^)r�r��rr^rar[�rRzoDiffArchiverTestCase.test_basic_functionality.<locals>.do_json_asserts.<locals>.get_changes.<locals>.<listcomp>cSsg|]}|D]}|�qqSr^r^)r�ZchgsetZchgr^r^rar[�rRr^)rr�Zchgsetsr^r�ra�get_changes�sz[DiffArchiverTestCase.test_basic_functionality.<locals>.do_json_asserts.<locals>.get_changescSsg|]}|rt�|��qSr^rXr�r^r^rar[�rRzZDiffArchiverTestCase.test_basic_functionality.<locals>.do_json_asserts.<locals>.<listcomp>rHr{ir)r,ZaddedZremovedr,r��
r)r\ror�rGrH)rkr}r~r�ZjoutputrPr^r^ra�do_json_asserts�s	
	zFDiffArchiverTestCase.test_basic_functionality.<locals>.do_json_assertsr�Ztest1aTZtest1b�--content-onlyr?r�)r~rV)F)F)rror�r�r"�S_IFDIRrGrrHrr�r�rk�rmdir�S_IFREGr�r�)r�r�r�r�rkr^r�rarQsv













*D
R

z-DiffArchiverTestCase.test_basic_functionalitycCs�|�dd|j�|jddd�|jddd�|jdd	d�|jd
dd�|�d|jd
d�t�d�t�d�t�d�t�d�|jddd�|jd
dd�|jddd�|jddd�|�d|jdd�|�dd|jd
dd�}gd�}dS)Nr�r6�a_file_removedr�r	�f_file_removedr
�c_file_changedrr�e_file_changed�@r�r�rVzinput/a_file_removedzinput/f_file_removedzinput/c_file_changedzinput/e_file_changedr�r�b_file_addedrw�d_file_addedrxrfr�z--sortr�r�)r�r�r�r�r�r�)r�r�rrork)r�rkrPr^r^ra�test_sort_option�s$



	z%DiffArchiverTestCase.test_sort_optioncCs$|�dd|j�|jddd�|�d|jdd�t�d	�t�d
�trVt�d�ntrdt�d�|jddd�|�d|jd
d�|�d|jdd�}|�	d|�|�	d|�tr�t�d�t�
d
d�|�d|jdd�|�d|jd
d�}|�d|�t�s|�	d|�n|�d|�dS)Nr�r6r�rr	r�r]rVg�������?zinput/test_filerr?rWr�rZr��ctimer�z
::archive3r))r�r�rr+r,rorkrNrMrNr�r�r�r^r^ra�test_time_diffss.



z$DiffArchiverTestCase.test_time_diffsN)r0r1r2rQr�r�r^r^r^rarvs^rvcCszt�}|�gd�d�}|�gd�d�}|�gd�d�}|�gd�d�}|�gd�d�}|�gd�d	�}|�d
dgd�}dS)
N)r~�servez--umask=0027�--restrict-to-path=/p1�--restrict-to-path=/p2zborg serve --info)r~r�z--restrict-to-repository=/r1z--restrict-to-repository=/r2zborg serve --info --umask=0027)r~r�r�r�zborg serve --restrict-to-path=/z%borg serve --restrict-to-repository=/z-borg serve --restrict-to-repository=/r1/belowz borg init --encryption=repokey /r~r�zBORG_FOO=bar borg serve --info)r�get_args)rSr`r^r^ra�
test_get_args.s.
�
�
�
�
�
�
�r�cCsdd�}dS)NcSsDdd�|D�}dd�|D�}tt|�t|��}tt|�t|��}|S)NcSsg|]}|�qSr^r^�r�r�r^r^rar[XrRz9test_chunk_content_equal.<locals>.ccc.<locals>.<listcomp>cSsg|]}|�qSr^r^r�r^r^rar[YrR)r9�iter)rRrSZchunks_aZchunks_bZcompare1Zcompare2r^r^ra�cccWs
z%test_chunk_content_equal.<locals>.cccr^)r�r^r^ra�test_chunk_content_equalVsr�c@s0eZdZedd��Zdd�Zdd�Zdd�Zd	S)
�TestBuildFiltercCsdSr]r^)r�Zmatchedr^r^ra�peek_and_store_hardlink_mastersxsz/TestBuildFilter.peek_and_store_hardlink_masterscCs.t�}|�td�gtj�t�||jd�}dS)NZincludedr)r5r�r6r4ZIncluder�build_filterr��r�ZmatcherrMr^r^ra�
test_basic|szTestBuildFilter.test_basiccCstdd�}t�||jd�}dS)NT��fallbackr�r5rr�r�r�r^r^ra�
test_empty�s
zTestBuildFilter.test_emptycCs tdd�}tj||jdd�}dS)NTr�r?)Zstrip_componentsr�r�r^r^rar��s
z%TestBuildFilter.test_strip_componentsN)r0r1r2�staticmethodr�r�r�r�r^r^r^rar�ws

r�c@s�eZdZedd��Zejdd��Zejdd��Zejdd��Z	ejd	d
��Z
ejdd��Zd
d�Zej
�dd�ej
�dd�dd���ZdS)�TestCommonOptionscCsv|ddddd�|dddd	d
dd�|d
ddd	ddd�|dddddgd�|dddddd�|ddtdddd�dS)NrSz--helpr�zshow this help message and exit)�actionr�z
--critical�	log_levelr7�store_constZcritical�warning)�destr�r��constr�r*�errorz--appendrJZTOPIC)r�r�r��metavarr��-pr��progress�
store_true)r�r�r�z--lock-wait�	lock_wait�Nr?z(default: %(default)d).)r�r,r�r�r�)r7)Zadd_common_optionr^r^ra�define_common_options�s����z'TestCommonOptions.define_common_optionscCs&tjdddd�}tj|jdd�|_|S)Nr?ztest parserF)�prog�description�add_help)�_level0�_level1)Zsuffix_precedence)�argparse�ArgumentParserrZ
CommonOptionsr��common_options)r��parserr^r^ra�basic_parser�s
�zTestCommonOptions.basic_parsercCs|jddd�S)Nzrequired argumentsz	<command>)�titler�)�add_subparsers�r�r�r^r^ra�
subparsers�szTestCommonOptions.subparserscCs|jj|ddd�|S)Nr�T)Zprovide_defaults)r��add_common_groupr�r^r^rar��szTestCommonOptions.parsercCs tjddd�}|j�|d�|S)NFr?)r�r�r�)r�r�r�r�)r�r��
common_parserr^r^rar��szTestCommonOptions.common_parserc	sH|jd|gddddtjd�}|jdd�|jd	d
dd��fd
d�}|S)N�
subcommandFr7r8Zbaz)�parentsr�r��epilogr��formatter_class��)�func�
--append-onlyr�r�)r�r�cs&t|���|�}�j�|�t|�Sr])r�rxr��resolve�vars)r�r`�r�r^ra�parse_vars_from_line�s
zDTestCommonOptions.parse_vars_from_line.<locals>.parse_vars_from_line)�
add_parserr��RawDescriptionHelpFormatter�set_defaults�add_argument)r�r�r�r�Z	subparserr�r^r�rar��s�z&TestCommonOptions.parse_vars_from_linecCs8t�t��|dd�Wd�n1s*0YdS)Nr�r�)rdrerm)r�r�r^r^ra�test_simple�s(zTestCommonOptions.test_simple�position)rgrj�bothzflag,args_key,args_value))r�r�T)z
--lock-wait=3r��cCsPg}|dvr|�|�|�d�|dvr2|�|�gdddddd�}|||<dS)	N)rgr�r�)rjr�r?r�Fr�)rJr�r�r�r�r�)rJ)r�r�r��flagZargs_keyZ
args_valuer�rLr^r^ra�test_flag_position_independence�s


�z1TestCommonOptions.test_flag_position_independenceN)r0r1r2r�r�rd�fixturer�r�r�r�r�r�r�parametrizer�r^r^r^rar��s 





r�cCs8t�tj��td�Wd�n1s*0YdS)NZ5M)rdrer��ArgumentTypeErrorrr^r^r^ra�test_parse_storage_quota�sr�csFtdd���}tdd���}i�d��fdd�	��d|td|i��S)	z0
    Return dict mapping command to parser.
    r~)r�ZborgfsNcs�i}|jD]<}|jdur
dt|j�vr
|j��D]\}}||||<q0q
|durZ|�|�|rf|sfdSt|���D] \}}�|d||�|�|<qrdS)NZSubParsersActionr#)�_actions�choicesrfrr�rlr�)r�r�rZ
extra_choicesr�r�r��command��discover_level�parsersr^rar�s

z'get_all_parsers.<locals>.discover_levelrY)N)rZbuild_parser)r�Z
borgfs_parserr^r�ra�get_all_parserssr�zcommand, parsercCst|jt�rdSr])rer�r2)r�r�r^r^ra�test_help_formattingsr��topiccCstj|}dSr])r�helptext)r�r�r^r^ra�test_help_formatting_helptexts$s
r�)�r�Zdateutil.tzr�r�rurYr'ror4r��rer�rmr"rircr�r+rZbinasciirrZconfigparserrrrrZhashlibrr	r
Z
unittest.mockrrdr~Zborg.helpers.errorsrYr
rrr�rrrSrrrr�rrZchunkerrZ	constantsZcrypto.low_levelrrZ
crypto.keyrrrrrr Zcrypto.keymanagerr!r"Zcrypto.file_integrityr#r$r%r&r'r(r)r*r+r,r-r.r/r0r1Znanorstr2r3r�r4r5r6r�r7r8r9r{r:�loggerr;Zremoter<r=r�r>r@rArBrCrDrErFrGrHrIrJrKrLrMrNZupgraderrOrPr�r`r�r�__file__r�r�r�Z	BORG_EXES�FileNotFoundErrorr�r�r�r�rrrr�r�r3rr r$rJrXrbrhrvr�r�r�r�r�r�r�ryr�r�r�r�r�r^r^r^ra�<module>s� 1	


 
>l+tL@GJ(!k