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.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|��\}}|tksRJ�|d	d
|t|��\}}|tksvJ�tt|���.|dd
|�\}}|tks�J�Wd�n1s�0Y|dd
|d�\}}|tks�J�|d	d
|t|��\}}|tk�sJ�dS)
N�reporVrk�	test_file�content�init�--encryption=nonez%s�createz%s::archive�extractzdoes/not/match)�mkdir�join�writerfr)rCr*r+)r��tmpdirr�rVrk�rc�outr^r^ra�test_return_codes�s


*r�z/tmp/borg-mountzneeds a 16MB fs mounted on %s��reasoncCs`ddd�}tdd���4t}tj�|�s,J�tj�|d�}tj�|d�}tj�|d�}td	�D�]�}tj|dd
�tj|dd
�||ddd
d�|d|�\}}|t	kr�t
d||�|t	ks�J��zd\}	}
|	�r�|
d7}
z||dd�WnDt�y,}z*|jtj
k�rWYd}~�q‚WYd}~n
d}~00zb|dd||
f|�\}}|t	k}	|	�sbt
d||�Wtjtj�|d�dd
�t�tj�|d��q�tjtj�|d�dd
�t�tj�|d��0q�Wtj|dd
�ntj|dd
�0|d|�\}}|t	k�rt
d||�|dd|�\}}|t	k�r.t
d||�|t	ks^J�q^Wd�n1�sR0YdS)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��existsr�r�r�r�r)�print�OSError�errno�ENOSPC�remove)r�r��mountr�rVr��jr�r��successr��errr^r^ra�test_disk_full�sT

� 

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�|dkr |r t|�|kr Jd��tj�|j|�}tj�tj�|��sVt�tj�|��t|d��*}|durrd|}|�	|�Wd�n1s�0YdS)Nrzsize and contents do not matchr��X)
�lenror�r�r�r��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�	�hardlink�	somewhere�link1�	fusexattrr?�user.foo�bar�
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�rrr3r^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/hardlinkrrrEr�output/input�info��zNumber of files: %dcSsBgd�}g}|��D]"}|D]}|�|�r|�|�qqd�|�S)N)zName:zFingerprint:zNumber of files:z
This archive:�
All archives:zChunk index:�
)r��
startswith�appendr�)rk�prefixes�resultr�r�r^r^ra�filter�s
z9ArchiverTestCase.test_basic_functionality.<locals>.filter)r3r�r��	assert_inrCrIrOrGrHr�r@ror�r��assert_dirs_equalr�r�r�r�)
r�r2rkZlist_output�expectedr�Zinfo_outputZ
item_countZinfo_output2rRr^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�}t
|�gd�ks�J�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>rM)rVzinput/a�input/a/hardlinkzinput/b�input/b/hardlink)ror�r�r�r�rrr�r��split�sorted)r��path_a�path_b�hl_a�hl_b�archive_list�pathsr^r^ra�test_create_duplicate_root�s

z+ArchiverTestCase.test_create_duplicate_rootcCs�tj�|jdd�}tj�|d�}|j|}t�tj��|�	dd|�Wd�n1sZ0Y|�	ddd|�tj�
|�s�J�dS)NZparent1Zparent2r�r�r�z--make-parent-dirs)ror�r�r�r��pytest�raisesr>ZParentPathDoesNotExistr�r�)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	��2|�d
|jd�tj�d�r�J�Wd�n1s�0YdS)Nr�r:zunix-socketz&unix sockets disabled or not supportedz(permission denied to create unix socketsr�r?rVrkr�zinput/unix-socket)r�r��socketZAF_UNIXZSOCK_STREAMZbindror�r�r�r-r��EPERMrl�skip�EACCES�closerCr�)r�Zsockr�r^r^ra�test_unix_socket�s 
z!ArchiverTestCase.test_unix_socketzsymlinks not supportedcCs||��|�dd|j�|�d|jdd�td��4|�d|jd�t�d�d	ksZJ�Wd�n1sn0YdS)
Nr�r:r�r?rVrkr�rFr)r3r�r�rCro�readlinkr�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\0Ytj�d�svJ�t�d	�}t�d
�}t|j	|j	�s�J�dS)Nr�r:r�r?rVrkr��output/input/dir2/file2r�output/input/dir2�
r3r�r�rCror�r�r&rF�st_mtime_ns)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�n1sd0Ytj�d
�s~J�t�d�}t�d�}t|j	|j	�s�J�dS)
Nr�r:sinput/dir2
input/dir2/file2
r��--paths-from-stdinr?�rVrkr�r}rr~r)r�Zflist_dir_firstr�r�r^r^ra�test_directory_timestamps2s�
0

z+ArchiverTestCase.test_directory_timestamps2cCs�|��|�dd|j�d}|jdd|jd|d�td��"|�d	|jd�Wd�n1sd0Ytj�d
�s~J�t�d�}t�d�}t|j	|j	�s�J�dS)
Nr�r:sinput/dir2/file2
input/dir2
r�r�r?r�rkr�r}rr~r)r�Zflist_file_firstr�r�r^r^ra�test_directory_timestamps30s�
0

z+ArchiverTestCase.test_directory_timestamps3cCsdd�}|��d\}}|d�}t�d||f�|�dd|j�|�dd|jd	d
�td��"|�d|jd	�Wd�n1s�0Yt�d�}t�d
�}t|j|j�s�J�t|j|d�s�J�|r�t|j	|j	�s�J�t|j	|d�s�J�nt|j	|d��sJ�dS)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�
rr�r:r��--atimer?rVrkr��output/input/file1�e��A)
r3ro�utimer�r�rCr&rFr�r�)r�r��atime�mtime�have_noatimer�r�r^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
�}t|jd|jd�s�J�t|jd|d�s�J�t|j	|j	�s�J�t|j	|d�s�J�dS)N�i�k8i�Cm8i�n8rr�r:r�r?rVrkr�r�r��
r3ror�r�r�rCr&rF�st_birthtimer��r�Z	birthtimer�r�r�r�r^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�}t|jd|d�s�J�t|jd|d�s�J�t|j	|j	�s�J�t|j	|d�s�J�dS)
Nr�rr�r:r�z
--nobirthtimer?rVrkr�r�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^rar8�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)rr�ror�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�0Y||||��s�J�dS)Nc	Ss�t�|�}|j|ksJ�d}|r>t|d�r>|jd|jkr>d}|r�tr�t|d��X}z0|�dtj�dkrjd}|�dtj	�|kr�d}Wnt
y�d}Yn0Wd�n1s�0Y|S)NT�	st_blocks�F�rbr)ror&�st_size�hasattrr�rr��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��foobarrKr?r�r�r:r�r?rVr�z--sparserHr��)ror�r�r�Z
CHUNK_MAX_EXPrr�r�r��tell�truncater�r�rCr�rTr�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]f}td��.|�d	|jdtj�d|��Wd�n1s�0Ytj�tj�dd|��stJ�qtdS)
N)Znormalzwith some blanksz
(with_parens)r�r�r:r�r?rVrkr�)	ror�r�r�r�r�r�rCr�)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�r:r�r?rVr�rA�rw�r3ror�r�r�r8r�r�r�r�r�r�r+rlrmrZEncryptionMethodMismatchr9r^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�r:�
_encryptedr��_encrypted::testrV�_encrypted::test.2r��r3r�r�ror�r�r�r��renamer�r+rlrmrZRepositoryAccessAbortedr�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�r:r�r?rVr��delete�--cache-onlyrAr�r�r9r^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�r:r�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�r:r�r?rVrY)r�r�r�rAr�)r3r�r�r�r�r�rDr%r�r+rlrmr�CacheInitAbortedErrorr�r^r^ra�7test_repository_swap_detection_repokey_blank_passphrases,zHArchiverTestCase.test_repository_swap_detection_repokey_blank_passphrasecCs4|�dd|j�|��}t�|j|jd�tdd��"|�d|jd�Wd�n1s^0Yttj�	|d���2}|�
�}|t|jd���ks�J�Wd�n1s�0Y|�d|jd�t
�|j�|�d|jd�t
�|�|�d|jd�dD]"}tj�tj�	||���sJ��qdS)	Nr�r:Z_new�yes)Z BORG_RELOCATED_REPO_ACCESS_IS_OKrI�location)r�zkey-typezmanifest-timestamp)r�r�r%ror�r�rDr�r�r�r�r$Zcanonical_pathr�r�r�r�)r�Zsecurity_dirr�r�r�r^r^ra�test_repository_move+s08
z%ArchiverTestCase.test_repository_movecCsd|�dd|j�ttj�|��d�d��}|�d�Wd�n1sH0Y|�d|j�dS)Nr�r:r�r�zsomething outdatedrI)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�rIr�r�)Z*BORG_UNKNOWN_UNENCRYPTED_REPO_ACCESS_IS_OK)
r�r�r�r�r�r%r�r+rlrmrr�rDr�r^r^ra�test_unknown_unencryptedEs,z)ArchiverTestCase.test_unknown_unencryptedc	CsD|�dd|j�|�d�|�d|jdd�td���|�d|jdd	d
�tj�d�r^J�|�d��&|�d|jdd	d�Wd�n1s�0Y|�d��&|�d|jdd	d
�Wd�n1s�0Y|�d��&|�d|jdd	d�Wd�n1�s0YWd�n1�s60YdS)Nr�r:�dir/filer�r?rVrkr��--strip-components�3r��2�1�input/dir/file�0)r�r�rrCror�r��assert_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�sourcerYrZZabbaz
dir1/hardlinkzdir1/subdir/hardlinkzdir1/source2z	dir1/aaaar�r:r�r?rV)	ror�r�r�r�rrr�r�r�r^r^ra�_extract_hardlinks_setupgs$���
�z)ArchiverTestCase._extract_hardlinks_setupzllfuse not installedc	Cs�|��tj�|jd�}tjdkr,ddg}nddg}|j|jd|dg|�R���t	|��vt�
d�jd	kspJ�t�
d
�jd	ks�J�td
d��
�dks�J�t�
d
�jd	ks�J�t�
d�jd	ks�J�Wd�n1s�0YWd�n1s�0Y|j|jd|dg|�R���t	|���t�
d�jd	k�s<J�t�
d�jd	k�sRJ�tdd��
�dk�sjJ�t�
d�jd	k�s�J�t�
d�jd	k�s�J�Wd�n1�s�0YWd�n1�s�0Y|j|jd|g|�R���t	|���t�
d�jdk�sJ�t�
d�jdk�s(J�t�
d�jdk�s>J�t�
d�jdk�sTJ�tdd��
�dk�slJ�Wd�n1�s�0YWd�n1�s�0YdS)N�
mountpoint�darwin�-oz$ignore_permissions,defer_permissionsZignore_permissionsr?�--strip-components=2rr�subdir/hardlinkr�rY�aaaa�source2�
input/dir1�input/dir1/hardlink�input/dir1/subdir/hardlink�input/dir1/aaaa�input/dir1/source2�input/sourcerJ�
input/abba)r�ror�r�r�rcr�
fuse_mountr�rCr&�st_nlinkr�r�)r�r�Zignore_permsr^r^ra�test_fuse_mount_hardlinkszs:

�P�V�z*ArchiverTestCase.test_fuse_mount_hardlinkscCs�|��td���|�d|jd�t�d�jdks8J�t�d�jdksLJ�t�d�jdks`J�t�d�jdkstJ�tdd	���d
ks�J�Wd�n1s�0YdS)Nrkr�r?r�rJr�r�r�r�rY�	r�rCr�r�ror&r�r�r�r�r^r^ra�test_extract_hardlinks1�s
z(ArchiverTestCase.test_extract_hardlinks1cCsZ|��td���|�d|jddd�t�d�jdks<J�t�d�jdksPJ�tdd	���d
ksfJ�t�d�jdkszJ�t�d�jdks�J�Wd�n1s�0Ytd���|�d|jdd
�t�d�jdks�J�t�d�jdks�J�tdd	���d
k�s
J�t�d�jdk�s J�t�d�jdk�s6J�Wd�n1�sL0YdS)Nrkr�r?r�r�rrr�r�rYr�r�r�r�r�r�r�r�r�r^r^ra�test_extract_hardlinks2�s
2
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��J|�d|jd	�t�
d
�jdks�J�t�
d�jdks�J�Wd�n1s�0YdS)NrWrXrrYrZr�r�r�r?rVrkr�rarrb)ror�r�r�r�rrr�r�rCr&r�)r�rerfrgrhr^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�r:rr	r
�file2�file3�file4r�z--exclude=input/file4r?rVrkr�rrH�--exclude=input/file2�--exclude-from=)	r�r�rrCr�rdro�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�r:rr	r
r�r�r��file333r�z--exclude=re:input/file4$r?rVrkr�rH�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�rdror�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�r:rr	r
r�r�r�r�zaa:somethingr�sre:input/file4$
sfm:*aa:*thing
r�r�r?rVrkr�rHr�s
re:file3+
sre:file(\d)\1\1$
sfm:nothingwillmatchthis
s*/file1
s
re:file2$
)
r�r�rr�r�r�rCr�rdror�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�r:rr	r
r�r�r�r�r�r?rVrkr�zre:.*rH)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�rdror�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�r:r�r	r
r�r?rVrkr��
input/filerH�--info�--list)r�r�rrC�
assert_not_inr�r�rS�r�rkr^r^ra�test_extract_list_outputKs$
0

2

4

6z)ArchiverTestCase.test_extract_list_outputcCs~|�dd|j�|jddd�|�d|jdd�td	��0|�d
|jdd�}d|vs\J�Wd�n1sp0YdS)
Nr�r:r�r	r
r�r?rVrkr��
--progresszExtracting:)r�r�rrCrr^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�r:rr	r
z	cache1/%s� extra stuffrZz	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_cachescCs�|�dd|j�d}|jd|jdd|d�t�|�dd	|jd��}|d
dksVJ�|ddksfJ�|d
t|�kszJ�|ddks�J�|jdd|jddd�}||ks�J�dS)Nr�r:sfoo

bar
   
r�r?�-r�ryr[�uidr�gidr�r�rqr��--stdoutT)rW�r�r�r^r_r)r��
input_data�item�extracted_datar^r^ra�test_create_stdin{sz"ArchiverTestCase.test_create_stdinc
Cs�|�dd|j�d}d}|�dd|d|jdd	d
|�t�|�dd|jd��}|d
dks`J�|ddkspJ�|dt|�dks�J�|d|ks�J�|�dd|jd�}||dks�J�dS)Nr�r:zsome test contentza/b/cr�z--stdin-name�--content-from-commandr?�--�echoryr[r
rrr�r?r�r�rrMr
)r�rr�rrr^r^ra� test_create_content_from_command�s�z1ArchiverTestCase.test_create_content_from_commandc
Csh|�dd|j�|jdd|jddddd	d
d�}|�d�s>J�t�|�d
d|j��}|dgksdJ�dS)Nr�r:r�rr?r�sh�-c�exit 73;rr��#Command 'sh' exited with status 73
ry�--json�archives�r�r��endswithr^r_�r�rkrir^r^ra�4test_create_content_from_command_with_failed_command�s
�zEArchiverTestCase.test_create_content_from_command_with_failed_commandcCs:|�dd|j�|jdd|jddd�}|�d�s6J�dS)	Nr�r:r�rr?rr��No command given.
�r�r�rrr^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�}|gd�ks�J�dS)Nr�r:rr	r
z
dir1/file2z
dir1/file3r�s"input/file1input/dir1input/file4r�r�z--paths-delimiterz\0r?r�ryr[cSsg|]}|rt�|�d�qSr\r]r�r^r^rar`�rRzAArchiverTestCase.test_create_paths_from_stdin.<locals>.<listcomp>rM)rr��input/file4�r�r�rrc�r�rrirjr^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�}|gd�ks�J�dS)Nr�r:rr	r
r�r�r�z#input/file1
input/file2
input/file3r��--paths-from-commandr?rrryr[cSsg|]}|rt�|�d�qSr\r]r�r^r^rar`�rRzCArchiverTestCase.test_create_paths_from_command.<locals>.<listcomp>rM)rr��input/file3r$r%r^r^ra�test_create_paths_from_command�s�z/ArchiverTestCase.test_create_paths_from_commandc
Csh|�dd|j�|jdd|jddddd	d
d�}|�d�s>J�t�|�d
d|j��}|dgksdJ�dS)Nr�r:r�r'r?rrrrrr�rryrrrrr^r^ra�2test_create_paths_from_command_with_failed_command�s
�zCArchiverTestCase.test_create_paths_from_command_with_failed_commandcCs:|�dd|j�|jdd|jddd�}|�d�s6J�dS)	Nr�r:r�r'r?rr�r r!rr^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�r:r�r?rr�N�r�r�r�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�r:rr	r
r�r��-vr�z--pattern=R inputr?�
A input/file1�
A input/file2N�r�r�rrSrr^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�r:rr	r
r��file_importantr�r.r��--pattern=+input/file_important�--pattern=-input/file*r?rV�A input/file_important�
x input/file1�
x input/file2Nr1rr^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)r3r�r:rr	r
r�Z	otherfiler4r�r.r�z--pattern=-input/otherfile�--patterns-from=r?rVr7r8r9zx input/otherfileN)r�r�rr�rSrr^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�r:�	x/a/foo_ar	r
�	x/b/foo_b�y/foo_yr�r.r�r;r?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�rrS�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 childr=r�s+ input/x/b
! input/x*
Nr�r:r>r	r
r?r@r�r.r�r;r?rVzinput/x/a/foo_az	input/x/arA)ror�r�r�rBr�r�r�r�rrrSrCr^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|�|�
d�|�
d�k�sJ�|�
d�|�
d�k�s"J�dS)zetest that intermediate folders appear first when patterns exclude a parent folder but include a childr=r�s#+ input/x/a
+ input/x/b
- input/x*
Nr�r:r>r	r
r?rVr�r;r?�.ry�--formatz{type} {path}{NL}zd x/azd x/bz- x/a/foo_az- x/b/foo_b)ror�r�r�rBr�r�r�r�rrCr�rS�index)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
}||ks�J�|�dd|j�|�dd|jdd�|�d|j�|�d|j�dS)Nr�r:r�r�r�z--no-cache-syncr?rVr�--errorrIr��stats�::test2r�)r3r�r�r^r_)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�r:rr	r
r�r4r�r?rVrkr�r5r6rH�r�r�rrCr�rdror�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?rHZcache2rzoutput/input/cache2�rCr�r�r�rdror�rr�r^r^ra�_assert_test_cachesKs
0z$ArchiverTestCase._assert_test_cachescCs*|��|�dd|jdd�|��dS)Nr��--exclude-cachesr?rV�rr�r�rRr�r^r^ra�test_exclude_cachesQsz$ArchiverTestCase.test_exclude_cachescCs<|��|�d|jdd�|�dd|jd�|��dS)Nr�r?rV�recreaterSrTr�r^r^ra�test_recreate_exclude_cachesVsz-ArchiverTestCase.test_recreate_exclude_cachescCsD|�dd|j�|jddd�|�d�|�d�|jdd	d�dS)
Nr�r:rr	r
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?rHr)rCr�r�r�rdror�r�r^r^ra�_assert_test_taggedcs
0z$ArchiverTestCase._assert_test_taggedc	Cs0|��|�ddddd|jdd�|��dS)Nr��--exclude-if-present�	.NOBACKUP�00-NOBACKUPr?rV�rXr�r�rYr�r^r^ra�test_exclude_taggedhsz$ArchiverTestCase.test_exclude_taggedc	CsB|��|�d|jdd�|�ddddd|jd�|��dS)Nr�r?rVrVrZr[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�r:�file0rr
ztagged1/.NOBACKUP1z
tagged1/file1ztagged2/.NOBACKUP2/subfile1z
tagged2/file2z
tagged3/%srrZz
tagged3/file3ztaggedall/.NOBACKUP1ztaggedall/.NOBACKUP2/subfile1ztaggedall/%sztaggedall/file4)r�r�rrrr�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?rH)r`Ztagged1Ztagged2Ztagged3Z	taggedallzoutput/input/tagged1�
.NOBACKUP1zoutput/input/tagged2�
.NOBACKUP2zoutput/input/tagged3zoutput/input/taggedallrQr�r^r^ra�_assert_test_keep_tagged�s
0�z)ArchiverTestCase._assert_test_keep_taggedcCs4|��|�ddddddd|jdd�	|��dS)	Nr�rZrbrcrS�--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?rVrVrZrbrcrSrerfr�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�rrZZsubdirr�r?rVrVrSre)r�r�rrror�r�r�r�rrr�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��dt�	td
|��"|�d|jd
�Wd�n1s�0Yt�
dd�|ks�J�Wd�n1s�0YdS)Ncs"tj|dddd��|||�dS)N�security.capabilityrRF��follow_symlinks)r
r#)r�r
r��fchownr^ra�patched_fchown�szBArchiverTestCase.test_extract_capabilities.<locals>.patched_fchowns r��
input/filerjr�r:r�r?rVrkrnr�)rornrr
r#r�r�rCr�object�getxattr)r�roZcapabilitiesr^rmra�test_extract_capabilities�s

0z*ArchiverTestCase.test_extract_capabilitieszAxattr not supported on this system or on this version of fakerootc	Cs�dd�}dd�}dd�}|�d�t�dd	d
�|�d|jd�|�d
|jdd�td���8tj�d�}t	�
td|��2|jd|jdtd�}d|vs�J�Wd�n1s�0Yt�|�t	�
td|��2|jd|jdtd�}d|vs�J�Wd�n1�s0Yt�|�t	�
td|��4|jd|jdtd�}d|v�sVJ�Wd�n1�sl0Ytj�
|��s�J�Wd�n1�s�0YdS)Nc_sttjd��dS)N�E2BIG)r�r�rt�r`�kwargsr^r^ra�patched_setxattr_E2BIG�szKArchiverTestCase.test_extract_xattrs_errors.<locals>.patched_setxattr_E2BIGc_sttjd��dS)Nr�)r�r�r�rur^r^ra�patched_setxattr_ENOSPC�szLArchiverTestCase.test_extract_xattrs_errors.<locals>.patched_setxattr_ENOSPCc_sttjd��dS�Nrx�r�r�rxrur^r^ra�patched_setxattr_EACCES�szLArchiverTestCase.test_extract_xattrs_errors.<locals>.patched_setxattr_EACCESr�rp�user.attribute�valuer��-enoner�r?rVrkr�r#r�r�zKwhen setting extended attribute user.attribute: too big for this filesystemzIwhen setting extended attribute user.attribute: fs full or xattr too big?z/when setting extended attribute user.attribute:)rr
r#r�r�rCror��abspathrrqr*r��isfile)r�rwrxr{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�0Y|	|ks�J�t|d|d�s�J�t||��sJ�dS)Nr�r�r~r�)scom.apple.ResourceForkswhatshouldbeherer�r?rVrkr�r�)rr�r�ror�rr
r#r�r&r�r�rCrrrF)
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�r:zdir1/dir2/filer	r
zinput/dir1/dir2r�r?z#../../../input/dir1/../dir1/dir2/..ryrQz input/dir1/dir2/file)r�r�rrCrrSrr^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�r:rr	r
r�rVr�z--exclude=file1�::test1rFrkr�z--exclude=./file1rLz--exclude=input/./file1�::test3rHrOr�r^r^ra�test_exclude_normalization�s"
4
0
4
2
2z+ArchiverTestCase.test_exclude_normalizationcCs8|jddd�|�dd|j�|�d|jddd�dS)	Nrr	r
r�r:r�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)Nrr	r
r
r�r:r�r?rVrHr�r~rkr�zoutput/input/file1/dirr?r�)rr�r�ror�rCrT�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)Nrr	r
r
r�r:r�r?rVrAr��	--dry-runr�ztest.3ztest.4�::test.3z::test.4r)rr�r�r>r�r&r�r�r�rrrS�r�r�r�rPr^r^ra�test_rename(s"2zArchiverTestCase.test_renamecCs�|jddd�|�dd|j�|�d|jdd�|�d	|j�}d
|vsLJ�|�d	|jd�}d|vsjJ�|�d	dd
|j�}d|vs�J�dS)Nrr	r
r�r:r�r?rVrIrL�Archive name: test
�--firstr�r�)r��	info_repo�info_archiver^r^ra�	test_info<szArchiverTestCase.test_infocs�|jddd�|�dd|j�|�d|jdd�t�|�d	d
|j��}|d}t|d�d
ksdJ�d|vspJ�t�|dt�s�J�|dddks�J�d|dvs�J�|d}|d�t	dd���
�D��s�J�t	�fdd�dD��s�J�t�|�d	d
|jd��}|d|dk�sJ�|d|dk�s2J�|d}t|�dk�sLJ�|d}|ddk�sfJ�t|dt��szJ�t|dt
��s�J�t|d�d
k�s�J�d|v�s�J�t�|d t��s�J�t�|d!t��s�J�dS)"Nrr	r
r�r:r�r?rVrIrr�r��@�
last_modified�
encryption�mode�repokey�keyfiler�rKcss|]}t|t�VqdSr])re�int)r��or^r^rar�TrRz2ArchiverTestCase.test_info_json.<locals>.<genexpr>c3s|]}|�vVqdSr]r^)r�rP�rKr^rar�UrR)Ztotal_chunksZtotal_csizer�Ztotal_unique_chunksZunique_csizeZunique_sizerr?rr�rC�command_line�duration�start�end)rr�r�r^r_rr�strptime�
ISO_FORMAT�all�valuesrery�float)r�r�r�r�r�rr�r^r�ra�test_info_jsonGs6zArchiverTestCase.test_info_jsoncCsd|�dd|j�t�|�ddd|j��}|dgks8J�t�|�ddd|j��}|dgks`J�dS)	z2See https://github.com/borgbackup/borg/issues/6120r�r:rIr�	--first=1r�--last=1N)r�r�r^r_)r�r�r^r^ra�test_info_json_of_empty_archivees
z0ArchiverTestCase.test_info_json_of_empty_archivecCsx|jddd�|�dd|j�|�d|jdd�|�dd	d
|jdd�|�dd	d|jd
d�|�dd	d|jdd�d|�d|jd�vs�J�d|�d|jd�vs�J�|�d|jdd	d�|�d|jdd	d�|�d|jd
d	d�|�d|jdd�d|�d|jd�v�s J�d|�d|jd�v�s<J�d|�d|jd
�v�sXJ�d|�d|jd�v�stJ�dS)Nrr	r
r�r:r�r�rV�	--commentzthis is the commentrLz"deleted" commentr�zpreserved comment�::test4z
Comment: 
rIzComment: this is the commentrVz
added commentzmodified commentrYZ12345zComment: added commentzComment: modified commentzComment: preserved commentr�r�r^r^ra�test_commentms zArchiverTestCase.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)Nrr	r
r
r�r:r�r?rVrAr�z::another_test.1z::another_test.2r�r�r�z--glob-archivesz	another_*�--lastr�r@z
Deleted data:r?)rr�r�rSr>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�|�d|j�r�J�dS)Nrr	r
r�r:r�r�rVrLr�r��test2r�r�Ztest3ryr�r�r^r^ra�test_delete_multiple�sz%ArchiverTestCase.test_delete_multiplecCs�|jddd�|jddd�|�dd|j�|�d|jdd	�|�d|jd
d	�dtjd<|jd
|jdd�tj�|j�s�J�dtjd<|�d
|j�|�tj�|j��dS)Nrr	r
r
r�r:r�r?rVrA�nor�r�rr�r�)	rr�r�ror�r�r�r�ZassertFalser�r^r^ra�test_delete_repo�s

z!ArchiverTestCase.test_delete_repocCs�|�dd|j�|�d�t|jdd��t}t�|tj�\}}t|||d�}|�	�D]&}|j
�d�rR|�|j
dj�q�qRds�J�|jdd	�Wd�n1s�0Y|�d
d|jd�}|�d
|�|�dd|j�|�d|j�}|�d|�dS)Nr�r�rCTr��testsuite/archiver.py���F�Zcompactr��--forcer?zdeleted archive was corruptedr�r�ry)r�r�r�r>r�r&r�r�r�
iter_itemsr�rr��chunksr��commitrSr)r�r�r�rPr�rrkr^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�rCTr�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�r:rCr�r�r?r�r;r=�Starting repository checkr�r�r�T)�reverser?�r+br�sXXXXr�r�)r�r�r�rSrrdror�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�n^t�t	t
jf�� }|�dd|j�Wd�n1sz0Yt|j
t
j�r�|j
jdks�J�|�dd|jd�Wd�n1s�0YdS)	Nr�r:rCr��
--verify-datar�r:�
--bypass-lock�r�r�r��	read_onlyr�r�r+rlrmr:r<�RPCErrorre�value�exception_class�r��excinfor^r^ra�test_readonly_check�s
.z$ArchiverTestCase.test_readonly_checkc	Cs�|�dd|j�|�d�|�d�|�|j���|jrR|jdd|jdtd�nbt�t	t
jf��$}|�dd|jd�Wd�n1s�0Yt|j
t
j�r�|j
jdks�J�|�dd|jdd	�Wd�n1s�0YdS)
Nr�r:rWrX�diffz%s::ar�r:r�r�r�r^r^ra�test_readonly_diff�s

2z#ArchiverTestCase.test_readonly_diffc	Cs�|�dd|j�|�d�|�|j���|jrH|jdd|jdtd�nbt�t	t
jf��$}|�dd|jd�Wd�n1s�0Yt|j
t
j�r�|j
jdks�J�|�dd|jdd	�Wd�n1s�0YdS)
Nr�r:rC�
export-tar�%s::testztest.tarr�r: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�n`t�t	t
jf��"}|�dd|j�Wd�n1s~0Yt|j
t
j�r�|j
jdks�J�|�dd|jd�Wd�n1s�0YdS)	Nr�r:rCr�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�n\t�t	t
jf��}|�d|j�Wd�n1sv0Yt|j
t
j�r�|j
jdks�J�|�d|jd�Wd�n1s�0YdS)Nr�r:rCrIr�r:r�r�r�r^r^ra�test_readonly_infos
,z#ArchiverTestCase.test_readonly_infoc	Cs�|�dd|j�|�d�|�|j���|jrB|jd|jtd�n\t�t	t
jf��}|�d|j�Wd�n1sv0Yt|j
t
j�r�|j
jdks�J�|�d|jd�Wd�n1s�0YdS)Nr�r:rCryr�r:r�r�r�r^r^ra�test_readonly_list*s
,z#ArchiverTestCase.test_readonly_listc
Cs4|�dd|j�|�d�|�|j���|jr`|j|jtd��Wd�q�1sT0Yn~t�	t
tjf��@}|j|jdd��Wd�n1s�0YWd�n1s�0Yt
|jtj�r�|jjdks�J�|�|jdd��Wd�n1�s0YWd�n1�s&0YdS)	Nr�r:rCr�Fr<r:r�)r�r�r�r�r�r�r�r+rlrmr:r<r�rer�r�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)
Nrr	r
r�r:r�r?rVi�)	rr�r�ror&r��st_mode�assertEqual�S_IMODE)r�r�r^r^ra�
test_umaskMs
zArchiverTestCase.test_umaskcCsx|�dd|j�|�dd|jdd�t|j��"}t�|tj�\}}Wd�n1sX0Y|�t|j	�d�dS)Nr�r:r�r�r?rVr)
r�r�r>r�r&r�r�r�rrr�r^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_featurecCsd|jr|j|dti�nHt�t��}|j|�Wd�n1sB0Y|jjdgfks`J�dS)Nrw�unknown-feature)r�r�r+rlrmr'r�r`)r�r`r�r^r^ra�cmd_raises_unknown_featureds
(z+ArchiverTestCase.cmd_raises_unknown_featurecCs<t|�dd|j��|�tjj�|�d|jddg�dS)Nr�r:r�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�r:r�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�r:rP�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�r:r�r?rVrkr�ryrI)	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�r:r�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�r:r�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�r:r�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�nfd	�tj���fd
d�}t�td|��$|�d|jdd�Wd�n1�s"0Y��s6J�t|jdd��v}|�rXt|j�|_t	�
|t	j�\}}t|||��$}|jjt�k�s�J�Wd�n1�s�0YWd�n1�s�0YdS)
Nr�r:Tr�r�r�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�rrqr�)r�Zremote_repor�r�rPr�r�r^r�ra�'test_unknown_mandatory_feature_in_cache�s0

D4
z8ArchiverTestCase.test_unknown_mandatory_feature_in_cachecCsD|jddd�|�dd|j�|�dd|jdd	�}|�d
|�dS)Nrr	r
r�r:r�rr�rV�
)rr�r�rSrr^r^ra�test_progress_on�sz!ArchiverTestCase.test_progress_oncCsB|jddd�|�dd|j�|�d|jdd�}|�d	|�dS)
Nrr	r
r�r:r��::test5rVr�)rr�r�rrr^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 nowrr	r
r?r�r�r:r�r�r?rVr/r0r��
U input/file1N�rr/r0r�r�rSrr^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_moders123rZr?r�rr
r�r:r�r�z--files-cache=ctime,sizer�rVrs321)�nsrLz
M input/file1N)rr/r0r�r�ror&r�r�r�rS�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�r:r�r�z--files-cache=mtime,sizer�rVrrLr�N)rr/r0r�r�ror&r�r��S_IRWXOrSr�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�r:r�r�z--files-cache=rechunk,ctimer�rVrLr/Nr�rr^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 listedrr	r
r?r�r�r�r:r�r�r>r?rVr/r0�
x input/file3r��	--excludez*/file2r�r9N)rr/r0r@rr%ror�r�r�r&r'r�r�rSrr^r^ra�test_file_status_excludeds"
z*ArchiverTestCase.test_file_status_excludedcCs�|jddd�|�dd|j�t�|�dd|jdd	��}d
|vsFJ�d|vsRJ�d|vs^J�d
|dvsnJ�|d}|ddks�J�t|dt�s�J�t|dt�s�J�t|d�dks�J�d|vs�J�dS)Nrr	r
r�r:r�rr?rVr�r�r�r�r�r�rCr�r�r�r�rK)	rr�r�r^r_reryr�r)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)Nrr	r
r?r�r�r:r�r?rV�::test0r�z
--filter=Ur�z--filter=AMrLi�r�)rr/r0r�r�rrSrr^r^ra�test_create_topical2s
z$ArchiverTestCase.test_create_topicalzFIFOs not supportedc
	Cs*ddlm}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�s0Y|	|k�s&J�dS)Nr)�Threadc	Ss:t�|tj�}zt�||�Wt�|�nt�|�0dSr])ror��O_WRONLYr�ry)�fifo_fnr�r�r^r^ra�fifo_feederMszFArchiverTestCase.test_create_read_special_symlink.<locals>.fifo_feederr�r:r?r�i�ZfifoZ	link_fifo)�targetr`r��--read-specialzinput/link_fiforkr�r�)�	threadingrr�r�ror�r�r�r$rr�rCr�r�)
r�rr	r�r�rZlink_fn�tr�rr^r^ra� test_create_read_special_symlinkIs(


Fz1ArchiverTestCase.test_create_read_special_symlinkcCs^t�dtj�|jd��|�dd|j�|jd}|�dd|d�|�d	|�}d
|vsZJ�dS)Nzsomewhere does not existrr�r:r?r�rrVryz&input/link -> somewhere does not exist)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�}t�d
|�s�J�t�d|�s�J�t�d|�s�J�|�dd|j�}|�d|�|�d|�|�d|�|�d|�|�d|�|�d	|jd�|�dd|j�}|�d|�|�d|�|�d|�|�d|�|�d|�|�d|jdt�|�d	|jd�|�dd|j�}|�d|�|�d|�dS)Nr�r:r�r�rLz::test3.checkpoint�::test3.checkpoint.1z::test4.checkpointr�r�r��--keep-daily=1�Would prune:\s+test1�+Keeping archive \(rule: daily #1\):\s+test2z.Keeping checkpoint archive:\s+test4.checkpointry�--consider-checkpoints�test1r�ztest3.checkpoint�test3.checkpoint.1ztest4.checkpointr�z--keep-daily=2Z
checkpointZtest5�r�r�r��re�searchrSrrr^r^ra�test_prune_repositoryys8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	Cs|�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:�}t�d;|��s�J�t�d<|��s�J�t�d=|��s�J�t�d>|��s�J�tdd
�D]0}t�d?t|�d@dAd
||��s�J��q�tddB�D]0}t�dCt|�d@dAd||��s6J��q6|�dD|j�}tdd$�D]}|�dE||��q�|�d5|jd8d9d:�|�dD|j�}tdd�D]}|�dE||��q�tdd$�D]}|�dE||��q�dS)FNr�r:Ztest01i�r?Ztest02�rZtest03��Ztest04�Ztest05�	Ztest06rZtest07�Ztest08��Ztest09�Ztest10r�Ztest11�Ztest12�Ztest13�Ztest14�Ztest15�Ztest16�Ztest17�Ztest18�Ztest19�Ztest20Ztest21Ztest22rZtest23rKZtest24�r�r�r�z--keep-daily=14z--keep-monthly=6z--keep-yearly=1zWould prune:\s+test22zWould prune:\s+test23zWould prune:\s+test24z7Keeping archive \(rule: yearly\[oldest\] #1\):\s+test01z!Keeping archive \(rule: monthly #z
\):\s+testz%02d�zKeeping archive \(rule: daily #ryztest%02d)	r�r�r*rrr�rfrSr)r�rkr�r^r^ra�test_prune_repository_example�sV..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�}t�d|�s�J�|�ddddd�|�d|jd
d�|�ddd|jd
d�}t�d|��sJ�|�d|�dS)Nr�r:�original_archivei�r/r?r0r>r-z
september%02dr1r�z--keep-daily=7z--keep-monthly=1r,zoctober%02drr�r�zBKeeping archive \(rule: monthly\[oldest\] #1\):\s+original_archiveZ	october07z3Keeping archive \(rule: monthly #1\):\s+september30)r�r�r*r�rrr)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	�}t�d
|�s\J�t�d|�slJ�|�d|j�}|�d
|�|�d|�|�dd|jd	�|�d|j�}|�d
|�|�d|�dS)Nr�r:r�r�rLr�r�r�rrrryrr�z--save-spacerrr^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�}t�d
|�s�J�t�d|�s�J�|�d|j�}|�d|�|�d|�|�d|�|�d|�|�d|jdd�|�d|j�}|�d|�|�d|�|�d|�|�d|�dS)Nr�r:r�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�r�rz
--prefix=foo-z:Keeping archive \(rule: daily #1\):\s+foo-2015-08-12-20:00z#Would prune:\s+foo-2015-08-12-10:00ryzfoo-2015-08-12-10:00zfoo-2015-08-12-20:00zbar-2015-08-12-10:00zbar-2015-08-12-20:00rrr^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�}t�d
|�s�J�t�d|�s�J�|�d|j�}|�d|�|�d|�|�d|�|�d|�|�d|jdd�|�d|j�}|�d|�|�d|�|�d|�|�d|�dS)Nr�r:r�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�r�rz--glob-archives=2015-*-fooz:Keeping archive \(rule: daily #1\):\s+2015-08-12-20:00-fooz#Would prune:\s+2015-08-12-10:00-fooryz2015-08-12-10:00-fooz2015-08-12-20:00-fooz2015-08-12-10:00-barz2015-08-12-20:00-barrrr^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�r:r��::test-1z::something-else-than-test-1�::test-2ryz--glob-archives=test-*ztest-1ztest-2zsomething-else)r�r�r�rSrrr^r^ra�test_list_glob7	szArchiverTestCase.test_list_globcCsp|�dd|j�|jd}|�d|t�|�d|�}|�ddd|�}|�ddd|�}|�||�|�||�dS)	Nr�r:r?r�ryrGzB{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�r:r�r�z	comment 1rEz	comment 2rFryrGz{archive:<36} {time} [{id}]{NL}rBztest-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�rS)r�rIrJrKr^r^ra�test_list_repository_formatK	sz,ArchiverTestCase.test_list_repository_formatcCst|jddd�|jdddd�|�dd	|j�|jd
}|�d|d�|�d
dd|�}d|vsdJ�d|vspJ�dS)N�
empty_filerr
Zamb�ai@BrZr�r:r?r�rVryrGz{sha256} {path}{NL}zJcdc76e5c9914fb9281a1c7e284d73e67f1809a48a497200e046d39ccc7112cd0 input/ambzQe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 input/empty_filer�)r�rHrkr^r^ra�test_list_hashZ	s
zArchiverTestCase.test_list_hashcCs�|�dd|j�|�d|jdt�|�d|jdt�|�d|jdt�|�d|j�}d|vsfJ�d	|vsrJ�d
|vs~J�|�dd|j�}d|vs�J�d	|vs�J�d
|vs�J�dS)Nr�r:r�r�z::test2.checkpointrryrztest2.checkpointrrr�rr^r^ra�test_list_consider_checkpointsd	sz/ArchiverTestCase.test_list_consider_checkpointscCs�|jddd�|�d�ttj�|jd�d��,}|�dd�|�dd�Wd�n1s`0Y|�d	d
|j�|jd}|�d|d
�|�ddd|�}d|vs�J�d|vs�J�dS)NrNrr
Z
two_chunksr�sabbai��sbaabr�r:r?r�rVryrGz'{num_chunks} {unique_chunks} {path}{NL}z0 0 input/empty_filez2 2 input/two_chunks)	rr�ror�r�r�r�r�r�)r�r�rHrkr^r^ra�test_list_chunk_countss	s
,
z'ArchiverTestCase.test_list_chunk_countscCs�|jddd�|�dd|j�|jd}|�ddd	|d
�|�ddd
|�}|�d�d�d�\}}}}}t|�t|�ks|J�t|�t|�ks�J�t|�t|�ks�J�t|�t|�ks�J�dS)NZcompressible_file�'r
r�r:r?r��-C�lz4rVryrGz*{size} {csize} {dsize} {dcsize} {path}{NL}rMr?� )rr�r�rcr�)r�rHrkr��csizeZdsizeZdcsizer�r^r^ra�test_list_size�	s
zArchiverTestCase.test_list_sizecCs�|jddd�|�dd|j�|�d|jdd�t�|�d	d
|j��}|d}t|d�d
ksdJ�t�|dt�sxJ�|dddks�J�d|dvs�J�|dd}t�|dt�s�J�|�d	d|jd�}dd�|�	�D�}t|�dks�J�|d}|ddk�sJ�|ddk�sJ�t�|dt��s4J�|�d	dd|jd�}d d�|�	�D�}t|�dk�snJ�|d}|ddk�s�J�|d!d"k�s�J�dS)#Nrr	r
r�r:r�r?rVryrr�r�r�r�r�r�r�r�rrr/r[cSsg|]}t�|��qSr^r]�r��sr^r^rar`�	rRz3ArchiverTestCase.test_list_json.<locals>.<listcomp>rr?r�rr�r�z--format={sha256}cSsg|]}t�|��qSr^r]rYr^r^rar`�	rRrZ@b2915eb69f260d8d3c25249195f2c8f4f716ea82ec760ae929732c0262442b2b)
rr�r�r^r_rrr�r�r�)r�Z	list_repor�Zarchive0Zlist_archiver�rr^r^ra�test_list_json�	s0zArchiverTestCase.test_list_jsoncCs@|�dd|j�|jdd|jdd�|jdd|jddd�dS)	Nr�r:ryr[rr�r�	::archiver,r�r^r^ra�test_list_json_args�	sz$ArchiverTestCase.test_list_json_argscCs�|��|�dd|j�|�dd|jdddd�}i}|��D]}t�|�}|||d	<q>|d
}d|vsnJ�|d�d�s�J�|d
}t|dt�s�J�|ddks�J�t|dt	�s�J�dS)Nr�r:r�z
--log-jsonr?rVr��--debug�type�file_status�statusr��log_messager/Z	levelname�DEBUG�message)
r3r�r�r�r^r_rNrer�rf)r��log�messagesr��msgr`rbr^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�r:r�r?rVz--debug-profile=create.prof�debugzconvert-profilezcreate.profz
create.pyprofZcumtimerLz--debug-profile=create.pyprof)r3r�r��pstatsZStatsZ
strip_dirsZ
sort_stats)r�rKr^r^ra�test_debug_profile�	s


z#ArchiverTestCase.test_debug_profilecCs>|��|�dd|j�|�dd|jdd�}d|vs:J�dS)Nr�r:r^r�r?rVz security: read previous location)r3r�r�)r�rer^r^ra�test_common_options�	sz$ArchiverTestCase.test_common_optionsrSc	Cs�|rd|}n
t�|�}|jd|d�|�dd|j�|jd}|�dd||d	�|�d
dd|�}|�d
�d�d�\}}}t|�t|�fS)Nrr�rZr�r�r?r�rTrVryrGz{size} {csize} {path}{NL}rMr?rV)ror�rr�r�rcr�)	r��compression�compressibler�rr�rkrWr�r^r^ra�
_get_sizes�	s


zArchiverTestCase._get_sizescCs&|jddd�\}}||dks"J�dS)N�noneT�rn��ro�r�r�rWr^r^ra�"test_compression_none_compressible�	sz3ArchiverTestCase.test_compression_none_compressiblecCs&|jddd�\}}||dks"J�dS)NrpFrqrrrsrtr^r^ra�$test_compression_none_uncompressible�	sz5ArchiverTestCase.test_compression_none_uncompressiblecCs&|jddd�\}}||dks"J�dS)N�zlibTrq皙�����?rsrtr^r^ra�"test_compression_zlib_compressible�	sz3ArchiverTestCase.test_compression_zlib_compressiblecCs"|jddd�\}}||ksJ�dS)NrwFrqrsrtr^r^ra�$test_compression_zlib_uncompressible�	sz5ArchiverTestCase.test_compression_zlib_uncompressiblecCs&|jddd�\}}||dks"J�dS)NrUTrqrxrsrtr^r^ra�!test_compression_lz4_compressible�	sz2ArchiverTestCase.test_compression_lz4_compressiblecCs&|jddd�\}}||dks"J�dS)NrUFrqrrrsrtr^r^ra�#test_compression_lz4_uncompressible�	sz4ArchiverTestCase.test_compression_lz4_uncompressiblecCs&|jddd�\}}||dks"J�dS)N�lzmaTrqrxrsrtr^r^ra�"test_compression_lzma_compressible�	sz3ArchiverTestCase.test_compression_lzma_compressiblecCs&|jddd�\}}||dks"J�dS)Nr}Frqrrrsrtr^r^ra�$test_compression_lzma_uncompressible�	sz5ArchiverTestCase.test_compression_lzma_uncompressiblecCs&|jddd�\}}||dks"J�dS)N�zstdTrqrxrsrtr^r^ra�"test_compression_zstd_compressible
sz3ArchiverTestCase.test_compression_zstd_compressiblecCs&|jddd�\}}||dks"J�dS)Nr�Frqrrrsrtr^r^ra�$test_compression_zstd_uncompressible
sz5ArchiverTestCase.test_compression_zstd_uncompressiblecCs�|jddd�\}}|�d|j�|jddd�\}}|�d|j�|jddd�\}}||krf|kslnJ�||dks|J�t||�}||ks�J�dS)N�	auto,zlibTrqr�rwrUrx)ror�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_compressiblecCs2|jddd�\}}||ksJ�||dks.J�dS)Nr�Frqrrrsrtr^r^ra�$test_compression_auto_uncompressible
sz5ArchiverTestCase.test_compression_auto_uncompressiblecCsF|�dd|j�dtjd<|�dd|j�dtjd<|�d|j�dS)	Nr�r:Z
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�r:�
break-lockr,r�r^r^ra�test_break_lock&
sz ArchiverTestCase.test_break_lockcCs|��|�d�dS)N�-h�r�r�r^r^ra�
test_usage*
szArchiverTestCase.test_usagecCsjd|�d�vsJ�d|�dd�vs&J�d|�dd�vs:J�d|�ddd�vsPJ�d|�ddd	�vsfJ�dS)
NZBorgr�r�Z
Initializer�zpositional argumentsz
--epilog-onlyzThis command initializesz--usage-onlyr�r�r^r^ra�	test_help.
s
zArchiverTestCase.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�|�}|j
|j
k�s\J�|j|jk�snJ�|j|jk�s�J�|j|jk�s�J�|�r�t|jd|jd��s�J�t|jd|jd��s�J�t|jd|jd��s�J�t��r|j|jk�rdk�snJ�t|d��R}t|d��&}	|��|	��k�sDJ�Wd�n1�sZ0YWd�n1�sz0Yt��r�d}tj�|d
d�}t�|�}
t�|�}|
j|jk�r�dk�s�nJ�|j|jk�s�J�t��r�d}tj�|d
d�}tj|dd�}tj|dd�}
|jtd�k�s4J�|
jtd�k�sHJ�t�|j
��sZJ�t�|
j
��slJ�t�|�t�|�k�s�J�t��r�tj�|d
d�}t�|�}
t�|
j
��s�J�z�d}t� tj�|d
d��}t!j"�s:t!�#|j��r:t$t%t!�&|���d d!gk�sJ�t!�'|d!�d"k�s"J�t!�'|d �d#k�s�J�npt%t!�&|��gk�sRJ�zt!�'|d!�Wn8t(�y�}z|j)t*j+k�s�J�WYd}~nd}~00d�s�Jd$��WnFt(�y�}z,t,j-�.d%��r�|j)t)j/k�r�n�WYd}~n
d}~00Wd�n1�s
0YdS)&NcSs^t�|�j}zt�t�|t��Wnty6YdS0t�|�j}ttk}|oXt||�SdSr�)	ror&r�ryr�r/r-r0rF)r�r�r�r�r^r^rar�7
sz/ArchiverTestCase.test_fuse.<locals>.has_noatimer�r:rr�r>r�r\rV�
::archive2rr�r�T)�ignore_flags�
ignore_xattrs�archive2rr�rr�rGrrFrFrkrrzinput/fusexattrrrrrrRz2expected OSError(ENOATTR), but no error was raised)Znothing_here_now)0r�r�r3r@ror�r�r�r�r�rTr�r&r��st_uid�st_gidr�rF�st_atime�st_ctime�st_mtimerHr�r�r��st_inorGr�S_ISLNKr{rI�S_ISFIFOr"r
r r!rdrE�	listxattrrrr�r�rAZENOATTRrcrrN�ENOTSUP)r�r�r�r�Zin_fnZout_fnZsti1Zsto1Zin_fZout_fZsti2Zsto2r�r�r�r�r^r^ra�	test_fuse5
s���$�

"V

"
 (zArchiverTestCase.test_fusecs<|�dd|j�|jddd�t�rJ|jddd�t�dd	�t�dd
�|�d|jdd
�|jddd�|�d|jdd
�tj�|jd�}|�	|j|dd���tj�|d
d��t�
��}tdd�|D��s�J�ddh�fdd�|D�ks�J�t��r~tj�|d
dd�}tj�|d
dd�}tj�|d
dd�}t�|�j
t�|�j
k�r`t�|�j
k�sfnJ�t|d���dk�s~J�Wd�n1�s�0Y|�	|j|dddd��rt��rtj�|d
dd�}tj�|d
dd�}t�|�j
t�|�j
k�sJ�t|d���dk�sJ�Wd�n1�s.0YdS)Nr�r:rCsfirstrZZ	hardlink1rYzinput/hardlink1zinput/hardlink2zinput/hardlink3r��
::archive1rVssecondr�r�r�Zversionscss|]}|�d�VqdS)ztest.N�rN�r�r�r^r^rar��
rRz;ArchiverTestCase.test_fuse_versions_view.<locals>.<genexpr>cs$h|]}ttj��|�d����qS)r�)r�ror�r�r�r�r\r^ra�	<setcomp>�
rRz;ArchiverTestCase.test_fuse_versions_view.<locals>.<setcomp>zhardlink1.00001Z	hardlink2zhardlink2.00001Z	hardlink3zhardlink3.00001r��-e)r�r�rrHrorr�r�r�r�r�r�r&r�r�r�)r�r��filesZhl1Zhl2Zhl3r^r\ra�test_fuse_versions_view�
s6
68z(ArchiverTestCase.test_fuse_versions_viewc	Cs�|�dd|j�|�d�|�d�\}}|�Z|��D],}|j�d�r6|�|jdj	�|j}qlq6dslJ�|j
dd�Wd�n1s�0Y|jdd	|jd
d�tj�|j
d�}|�|jd
|��bt�t��"}ttj�||��Wd�n1�s0Y|jjtjk�s J�Wd�n1�s60Y|�|jd
|dd��&ttj�||����Wd�n1�s�0YdS)Nr�r:r�r�r�Fr�r�r�rr�r�r\r�Zallow_damaged_files)r�r�r�r�r�r�rr�r�r�r�ror�r�r�rlrmr�r�r�r�ZEIOry)r�r�r�rr�r�r�r^r^ra�test_fuse_allow_damaged_files�
s&
*24z.ArchiverTestCase.test_fuse_allow_damaged_filescCsH|�dd|j�|�d�|�d�|�d�|�d�tj�|jd�}|�|j|dd	��2tt�	tj�|���ddgks~J�Wd�n1s�0Y|�|j|d
d	��2tt�	tj�|���ddgks�J�Wd�n1s�0Y|�|j|d��4tt�	tj�|���ddgk�s&J�Wd�n1�s<0Y|�|j|d��4tt�	tj�|���ddgk�s|J�Wd�n1�s�0Y|�|j|d
��4tt�	tj�|���gd�k�s�J�Wd�n1�s�0Y|�|j|d��0tt�	tj�|���gk�s$J�Wd�n1�s:0YdS)Nr�r:�arch11�arch12�arch21�arch22r�z	--first=2z--sort=namez--last=2z--glob-archives=arch1*z--glob-archives=arch2*z--glob-archives=arch*)r�r�r�r�z--glob-archives=nope*)
r�r�r�ror�r�r�r�rdr�r�r^r^ra�test_fuse_mount_options�
s$



@@DDDz(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��|ddk�sdJd��|du�svJd��|d}|d�s�Jd��|d�s�Jd��|d }|d�s�Jd!��|d�s�Jd"��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?)�old_id_alive�new_id_alive)�	num_calls�old_id�new_id�before�	exception�exception.extr_tb�afterr�r�r�r�)	r�rZ
process_aliver��dump�update�
BaseException�
extract_tb�
__traceback__)r�r�r��assert_dataZ_outr�)�assert_data_file�migrate_lock�pickle�	traceback�wrapperr^rar��
sf���.�.�(�0��0zTArchiverTestCase.test_migrate_lock_alive.<locals>.write_assert_data.<locals>.wrapperr)r�)r��r�r�r�r�)r�r�ra�write_assert_data�
s!zCArchiverTestCase.test_migrate_lock_alive.<locals>.write_assert_datar�r�Zarchr�T)Zos_forkr�z$
Lock.migrate_lock(): assert_data = rF)r�rzr�r�z)Lock.migrate_lock() raised an exception:
z#Traceback (most recent call last):
rY)�sepr�r�rzr�r?z0Lock.migrate_lock() must be called exactly once.z/Lock.migrate_lock() may not raise an exception.r�r�zKold_id must be alive (=must not be stale) when calling Lock.migrate_lock().r�zKnew_id must be alive (=must not be stale) when calling Lock.migrate_lock().r�zPold_id must be alive (=must not be stale) when Lock.migrate_lock() has returned.zPnew_id must be alive (=must not be stale) when Lock.migrate_lock() has returned.)�	functoolsr�r�r�ror�r�r�r~�locking�Lockr�r�r�r�r�r�r�r�rcrX�format_list�format_exception�	__class__�__wrapped__)	r�r�r�Z_inr�r�Zextracted_tbZassert_data_beforeZassert_data_afterr^r�ra�test_migrate_lock_alive�
sJ'
(
���
�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�addrrrr�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?rVrAr�)r�r3ror�r�r�)r��methodr�r^r�ra�verify_aes_counter_uniquenessAs

z.ArchiverTestCase.verify_aes_counter_uniquenesscCs|�d�dS)Nr��r�r�r^r^ra�#test_aes_counter_uniqueness_keyfile]sz4ArchiverTestCase.test_aes_counter_uniqueness_keyfilecCs|�d�dS)Nr�r�r�r^r^ra�&test_aes_counter_uniqueness_passphrase`sz7ArchiverTestCase.test_aes_counter_uniqueness_passphrasecCs�|��|�dd|j�|�d|jdd�td��$|�dd|jd�}Wd�n1s^0Ytt�d��}t|�d	kr�|d	�d
�s�J�d|vs�J�dS)Nr�r:r�r?rVrkrizdump-archive-itemsrZ000000_�Done.�	r3r�r�rCrdror�rrN�r�rkZ
output_dirr^r^ra�test_debug_dump_archive_itemscs
2z.ArchiverTestCase.test_debug_dump_archive_itemscCs�|��|�dd|j�|�d|jdd�td�� |�dd|j�}Wd�n1sZ0Ytt�d��}t|�d	kr�|d	�d
�s�J�d|vs�J�dS)Nr�r:r�r?rVrkrizdump-repo-objsrZ	00000000_r�r�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�}||vs\J�|�dd
|j|d�}||vs|J�tdd��}|��}Wd�n1s�0Y||ks�J�|�dd
|j|�}d|vs�J�|�dd
|j|�}d|vs�J�|�dd
|jd�}d|v�sJ�dS)Nr�r:s	some datar�rZrizid-hashr�zput-objzget-objzoutput/filer�z
delete-objZdeletedz	not foundZinvalidz
is invalid)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_objcCs`dd�}t�td|��$|jdd|jdd�Wd�n1s@0Ytj�|j�r\J�dS)NcWst�dSr])�EOFErrorr_r^r^ra�	raise_eof�sz7ArchiverTestCase.test_init_interrupt.<locals>.raise_eofr�r�r:r?r�)rrqrr�r�ror�r�)r�r�r^r^ra�test_init_interrupt�s2z$ArchiverTestCase.test_init_interruptcCs|jd|jdd�dS)Nr�rr�r,r�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�r:z/nestedrr�)r�r�r�rlrmr>Z
AlreadyExistsr�r^r^ra�test_init_nested_repositories�s
z.ArchiverTestCase.test_init_nested_repositoriesc	Cs"tj�|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�0Y||ks�J�Wd�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�r�r�rlrmr~r�errors�Error)r�r�r�r��argr�r^r^ra�%test_init_refuse_to_overwrite_keyfile�s
&(
&z6ArchiverTestCase.test_init_refuse_to_overwrite_keyfilec	CsP|�d|j�|����}t�|tj�\}}t|||dd��}|j}Wd�n1sV0Yt�|�t|||��}|j}Wd�n1s�0YWd�n1s�0Y||us�J�t	�}|�
�D]N\}\}	}
}||\}}
}|	|ks�J�|
|
k�s
J�||k�sJ�|�|�q�|�
�D]\}\}	}
}||v�s,J��q,dS)Nr�F��sync)r�r�rr&r�r�rr�Zdestroyr�r�r�)r�r�r�rPr�Zoriginal_chunksZcorrect_chunksr�r�Zrefcountr�rWZ
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�r:r�r?rVFr�r)r�r�rr&r�r�rr�r�Zincrefryr�r�rlrm�AssertionErrorr�)r�r�r�rPr�r^r^ra�test_check_cache�s
Dz!ArchiverTestCase.test_check_cachecCs4|�dd|j�|jd|jddd�}d|vs0J�dS)Nr�r:rVz
--target=asdfrr�zNeed to specify single archiver,rr^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�}||vs�J�d|vs�J�|jd
}|�dd|�}d|vs�J�d|vs�J�d|vs�J�dS)Nr�r:rr�rVryrVrr��input/dir2/file3z--target=new-archiveznew-archivez
::new-archiverBrr
�
dir2/file3)r3r�r�r�)r�r�r@r�listingr^r^ra�test_recreate_target�s"

z%ArchiverTestCase.test_recreate_targetcCs�|��|jddd�|�dd|j�|jd}|�d|d�|�d	|d
dd�|��|�d
d|�}d|vsrJ�d|vs~J�d|vs�J�dS)Nr�r	r
r�r:rr�rVrVrr�r�ryrBrr
)r3rr�r�r�)r�r�r�r^r^ra�test_recreate_basic�s
z$ArchiverTestCase.test_recreate_basiccCs|��|�d|jdd�|�d|jdd�|��td��r|�d|jd�t�d	�jd
kshJ�t�d�jd
ks|J�t�d�jd
ks�J�t�d
�jd
ks�J�Wd�n1s�0Ytd��6|�d|jd�t�d	�jdks�J�Wd�n1�s0YdS)Nr�rLrVrVr?r�rkr�r�rr�r�r�rJ)r�r�r�r�rCror&r�r�r^r^ra�test_recreate_subtree_hardlinks�s
2
z0ArchiverTestCase.test_recreate_subtree_hardlinkscCsttj�|jd�d��$}|�d�|�d�Wd�n1s@0Y|�dd|j�|�ddd	|jd
d�|�d|jddd
�|�d|jd
ddd�}tt	|�
d��\}}||ks�J�|�d|jdd�|��t	|�d|jd
dd��s�J�t	|�d|jd
ddd���rJ�dS)NZ
large_filer�saaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbr�r:r��--chunker-params�	7,9,8,127r�rVrLz--files-cache=disabledryzinput/large_filerGz{num_chunks} {unique_chunks}rVrV�defaultz--format={size}z{unique_chunks})r�ror�r�r�r�r�r��mapr�rcr�)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|�}|dks�J�|�d|jdd�|�d|jd
d
dd�}t|�}|dks�J�dS)Nr�r�rO� r�r:r�r�r�r?rVryr�rG�{num_chunks}rrVz
fixed,4096�	r�ror�r�r�r�r�r�r�)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|vs�J�|�d|jd
d
dd�}t|�}||ks�J�dS)Nr�r�rOr�r�r:r�r�r�r?rVryr�rGr�rVr^rZfilename_never_matchesZ
Rechunkingr)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�\}}}t|�t|�ksrJ�|�d|jd	dd�|��|�d|jddd
d�}|�d�\}}}t|�t|�ks�J�||ks�J�dS)NrnrSr
r�r:r�r?rVrTrpry�input/compressiblerGz{size} {csize} {sha256}rVrVrUz--recompress)rr�r�rcr�r�)r�Z	file_listr�rWZ
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��t�fdd�|D��s�J�t�fdd�|D��s�J�dS)Nrr�r:rr�rVrVr"z1970-01-02T00:00:00r�rCrIi�r?rz%Y-%m-%dcsg|]}t�d�|��qS)zTime \(start\).+ %s�rr�r�r�Zs_timer^rar`XrRz<ArchiverTestCase.test_recreate_timestamp.<locals>.<listcomp>csg|]}t�d�|��qS)zTime \(end\).+ %srrrr^rar`YrR)
r�nowrrrZtzinfor3r�r�r�Z	utcoffsetr�any)r�Zlocal_timezoner�rIr r^rra�test_recreate_timestampMs
�
z(ArchiverTestCase.test_recreate_timestampcCs�|jddd�|�dd|j�|�d|jdd�|�d	|jd�}|�d
|jddd
�|��|�d	|jd�}||ks~J�dS)NrnrSr
r�r:r�r?rVryrVz-nr�r�rr�r�r�)r�Zarchives_beforeZarchives_afterr^r^ra�test_recreate_dry_run[sz&ArchiverTestCase.test_recreate_dry_runcCs�|jddd�|�dd|j�|�d|jdd�|�d	|jd�}|�d
|jdd�|��|�d	|jd�}||ks|J�dS)
Nrr	r
r�r:r�r?rVrIrVr�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�r:r�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�r:Znon_existent_commandrTr)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�r:rrr
r�r�r�Zfile5r�r?rVrVr�r�r�r�rr9r(rr#z
x input/file4zinput/file5z
x input/file5)r�r�rr�rSrrr^r^ra�test_recreate_list_outputzs.z*ArchiverTestCase.test_recreate_list_outputc
CsD|�dd|j�|�d|jdd�|jdddd	d|jd
dd�dS)
Nr�r:r�r?rVr�r�r�r�Trrr,r�r^r^ra�test_bad_filters�sz!ArchiverTestCase.test_bad_filterscCs:|jd}|�d|jdd�|�|j�}|�dd|j|�t|��}|��}Wd�n1s`0Y|�dt|�d�s�J�|j	d	t
�|j	�d
}t|��}|��}Wd�n1s�0Y||ks�J�t
�|�|�dd|j|�t|��}|��}Wd�n1�s0Y||k�s6J�dS)N�	/exportedr��--encryptionr�rP�export�	BORG_KEY rM�/r�import)
r�r�r�r8r�r�r�rNr,r�ror�r�)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�0Ytj�|�r�Jd��t|��}|�	�}Wd�n1�s0Y||k�s*J�dS)Nr�rr��exportedrPrrZimportedr�rz."borg key import" should respect BORG_KEY_FILE)
r�r�ror�r�r�r�r�r�r�r�rDr�)r�Zexported_key_filerr�rZimported_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	Cs�|jd}|�d|jdd�|�|j�}|�dd|j|�t|��}|��}Wd�n1s`0Y|�dt|�d�s�J�t	|j��(}t
|�}|�dt�
��Wd�n1s�0Yttj���}|�|t�
��|j|jks�J�t	|j��}|�d	�Wd�n1�s 0Y|�dd
|j|�t	|j��(}t
|�}|�dt�
��Wd�n1�sv0Y|j|jk�s�J�dS)Nrr�rr�rPrrrMrRr)r�r�r�r8r�r�r�rNr,r>rr�rZenv_passphraserrPZTestKeyZMockRepositoryZenc_keyZsave_key)	r�rrr�rr�Zrepo_keyZ
backup_keyZ	repo_key2r^r^ra�test_key_export_repokey�s(

&.*0z(ArchiverTestCase.test_key_export_repokeycCs�|jd}|�d|jdd�|�|j�}|�ddd|j|�t|dd	��}|��}Wd�n1sf0Yt|�|vs�J�|�d
�s�J�|�	d�s�J�dS)Nz/exported.htmlr�rr�rPrz	--qr-htmlrZr[z<!doctype html>z</html>
)
r�r�r�r8r�r�r�r,rNr)r�rrr�rr^r^ra�test_key_export_qr�s
&z#ArchiverTestCase.test_key_export_qrcCs@|jd}t�|�|�d|jdd�|jdd|j|td�dS)Nrr�rr�rPrr�)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)Nrr�rr�rPrr�r�zsomething not a key
rzBORG_KEY a0a0a0
)r�r�r�r+r�r�r�rlrmr"r!)r�rr�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�0Y|dks�J�dS)N�@e294423506da4e1ea76e8dcdf1a3919624ae3ae496fddf905610c351d3f09239rr�rr�rrr�rVrM�abcdefghijklmnopqrsturPr�--paperz�To restore key use borg key import --paper /path/to/repo

BORG PAPER KEY v1
id: 2 / e29442 3506da 4e1ea7 / 25f62a 5a3d41 - 02
 1: 616263 646566 676869 6a6b6c 6d6e6f 707172 - 6d
 2: 737475 - 88
)r�r�r�r�r�rr�ror�r�r�r�FILE_IDrrsr�)r�rrrr�rr^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�rr�rrr�rVrMr(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
rPrr)r�s
y
s12 / e29442 3506da 4e1ea7 / 25f62a 5a3d41 - 02

y
)r�r�r�r�rr�ror�r�r�rr*rrs)r�rrr�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|�}|dksZJ�t|��}t�|�}Wd�n1s�0Yd
|vs�J�d|vs�J�d|vs�J�d|vs�J�d|vs�J�dS)Nrr	r
r�r:r�r?rV�/dumpriz
dump-manifestrYrr�Z	item_keys�	timestamp�version�rr�r�r�r�r^r��r�Z	dump_filerkr�rQr^r^ra�test_debug_dump_manifest_
s

(z)ArchiverTestCase.test_debug_dump_manifestcCs�|jddd�|�dd|j�|�d|jdd�|jd	}|�d
d|jd|�}|dks^J�t|��}t�|�}Wd�n1s�0Yd
|vs�J�d|vs�J�d|vs�J�d|vs�J�dS)Nrr	r
r�r:r�r?rVr-rizdump-archiverY�_nameZ_manifest_entryZ_metaZ_itemsr0r1r^r^ra�test_debug_dump_archiven
s

(z(ArchiverTestCase.test_debug_dump_archivecCs�|�dd|j�|�dd|jd���}|dks2J�t�|�dd|jd	d
��}|dd}|�dd|j|���}|d
|dks�J�|�dd|jdd���}|dks�J�dS)Nr�r:rizrefcount-objZ@0000000000000000000000000000000000000000000000000000000000000000zkobject 0000000000000000000000000000000000000000000000000000000000000000 not found [info from chunks cache].r�rr?rVr�r�zobject z* has 1 referrers [info from chunks cache].Z124Zxyzaz4object id 124 is invalid.
object id xyza is invalid.)r�r�r�r^r_)r�rkrM�
archive_idr^r^ra�test_debug_refcount_obj|
sz(ArchiverTestCase.test_debug_refcount_objcCs(|�dd�}d|vsJ�d|vs$J�dS)NrirIzCRC implementation�Pythonr�rr^r^ra�test_debug_info�
sz ArchiverTestCase.test_debug_infocCsR|�dd|j�tdd��$|�dd|j|j�Wd�n1sD0YdS)Nr�r:r�)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
�}|dks�J�|�dd|j�}|�d
|�|�dd|jd
�dD]�\}}|�d|j|�}|dk�s8J�|�d|j||�|�d|j|�}||dk�slJ�|�dd|j|�|jd|j|dd��q|jddd|jdd�|jd|jdd�|jd|jddd�dS)NrEr�r:r�r�z[repository]r/Zsegments_per_dirZ
storage_quota�append_only�additional_free_spacer�Zlast_segment_checkedr?r�z
No option Z123z123
z--delete))r;Z2G)zrepository.append_onlyr�z0
rMrzinvalid-option)r3ror�r�r�rSr)r�rkZcfg_keyZ	cfg_valuer^r^ra�test_config�
s>
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)NrEr�r:r�r?rVr��
simple.tarrrk�r��xpfz
../simple.tar�--warning=no-timestamprHT�r�r��	ignore_ns)	r3ror�r�r�rCri�
check_callrTr�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�}d|vslJ�d
|vsxJ�t	d��t
�gd��Wd�n1s�0Y|jdddddd�dS)Nr=�gzip is not installedrEr�r:r�r?rVr�z
simple.tar.gzr��input/file1
�input/dir2
rk)r�r@z../simple.tar.gzrArHTrB�
r�r�rlrwr3ror�r�r�rCrirDrT�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�}d
|vsnJ�d|vszJ�t	d��t
�gd��Wd�n1s�0Y|jdddddd�dS)Nr=rFrEr�r:r�r?rVr�r>z--strip-components=1r�rGrHrkr?zoutput/TrBrIrJr^r^ra� test_export_tar_strip_components�
s



,z1ArchiverTestCase.test_export_tar_strip_componentscCs�|��|�d|jddd�td��nt�gd��t�d�jdksJJ�t�d	�jdks^J�t�d
�jdksrJ�t�d�jdks�J�Wd�n1s�0YdS)Nr�r?�
output.tarr�rk�r�r@z
../output.tarrArrr�r�r��	r�r�r�rCrirDror&r�r�r^r^ra�&test_export_tar_strip_components_links�
s
z7ArchiverTestCase.test_export_tar_strip_components_linkscCs�|��|�d|jddd�td��nt�gd��t�d�jdksJJ�t�d	�jdks^J�t�d
�jdksrJ�t�d�jdks�J�Wd�n1s�0YdS)Nr�r?rMr�rkrNr�rr�r�r�rOr�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)NrEr�r�r��::srcrVr�r>�
import-tar�::dstr�rHT�rCr�)r3ror�r�r�rCr�rTr�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=rFrEr�r�r�rRrVr�z
simple.tgzrSrTr�rHTrU)r�r�rlrwr3ror�r�r�rCr�rTr�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)r1rErV�r��cf�	file1.tarr�r�rY�the_rest.tarrzfile1*rF�concatenated.tarr�rZr�r\r�r�rSz--ignore-zerosrT�input/concatenated.tarr�rkTrU)
r3ror�rCrirDr�r�r�r�r�r�rT�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)NrErVrXr[r]r�rZr�r\r�r�rSrTr^r�rkr)r3ror�rCrirDr�r�r�r�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��Ht�gd��t�gd����}d|vsNJ�d	|vsZJ�Wd
�n1sn0Y|�dd|j	�|�d
|j	dd�|�dd|j	d�}d|vs�J�d|vs�J�d|vs�J�d
S)zDTest that paths starting with './' are normalized during import-tar.z	input/dirT)�exist_okr�rV)r�rY�dotslash.tar�./dir)r�Ztfrcrdz
./dir/fileNr�r�rSz
::dotslashzinput/dotslash.tarryz--format={path}{NL}r�)
rorrrCrirDrjrsr�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��}d|vszJ�qzdS)Nr�r?r�r�r�Znewnameryr�r�rIrPrr!rr�r�TrrzAttic repository detected.)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��dSryrzrur^r^rar{�sz`ArchiverTestCase.test_do_not_fail_when_percent_is_in_xattr_name.<locals>.patched_setxattr_EACCESr�rpsuser.attribute%pr}r�r~r�r?rVrkr#r�r�N)	rr
r#r�r�rCrrqr*�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)rgc_sttjd��dSryrzrur^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?rVrkr#r�r�N)
rorr�r�r�r
r#r�r�rCrrqr*rhr^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?rIrT)rwrTzthis-repository-does-not-existz$this-repository-does-not-exist::testN)r�r�rSrrr^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|vszJ�|�d|j�}d
|vs�J�|�d
|jd�}d|vs�J�|�d|jd�}d|vs�J�t	d��"|�d|jd�Wd�n1�s0Y|�
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, borgrZr�r:r�r?rVr�rIrLryrCr�rkr�NrH)rr�r�ror�r�r�r�r%rCrT)r�Z	repo_infoZ	repo_listZarchive_inforir^r^ra�+test_can_read_repo_even_if_nonce_is_deleted�s 
2z<ArchiverTestCase.test_can_read_repo_even_if_nonce_is_deletedcCst|jddd�|�dd|j�|�d|jdd�tj�|jd	�}t�|�|�d|jd
d�tj�|�spJ�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.
        rrlrZr�r:r�r?rVr�rLN)	rr�r�ror�r�r�r�r�)r�r�r^r^ra�%test_recovery_from_deleted_repo_nonce�s
z6ArchiverTestCase.test_recovery_from_deleted_repo_nonceN)rrr)rS)�r4r5r6rl�mark�skipifrHZrequires_hardlinksr%rVrkrortrzrGr|rJr�r�r�r�rKr�r�r8r�r�r�r�r�r�r�r�r�r�r�r�r��unittest�
skipUnlessrAr�r�r�r�r�r�r�r�rrrrrrr"r&r)r*r+r-r2r:r<rDrErIrNrPrRrUrWrXrYr^r_rardrgrhrir
r rsr�rMr�r�r�r�r�r�r�r�r�r�r�r�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�rrrrIrrrr!r*r?rArBrCrDrGrLrMrPrQrRrXr[r]rhrkrlrorurvryrzr{r|r~rr�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�rrrr
rr
rrrrr r"r#r$r%r&r+r,r2r4r6r8r9r<r�Zrequires_gnutarr�r�Z
requires_gziprErKrLrPrQrVrWr`rarerfrirjrkrmrnr^r^r^rar7�s?



�
�

 	3

 



!(!		






	






	
$
 (=





d



W





-'



r7zno 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^raro�sz,ArchiverTestCaseBinary.test_init_parent_dirszpatches objectscCsdSr]r^r�r^r^rar��sz*ArchiverTestCaseBinary.test_init_interruptcCsdSr]r^r�r^r^rars�sz0ArchiverTestCaseBinary.test_extract_capabilitiescCsdSr]r^r�r^r^rar��sz1ArchiverTestCaseBinary.test_extract_xattrs_errorszLtest_basic_functionality seems incompatible with fakeroot and/or the binary.cCsdSr]r^r�r^r^rarV�sz/ArchiverTestCaseBinary.test_basic_functionalityzBtest_overwrite seems incompatible with fakeroot and/or the binary.cCsdSr]r^r�r^r^rar��sz%ArchiverTestCaseBinary.test_overwritecs t�rt�d�n
t���dS)Nz9test_fuse with the binary is not compatible with fakeroot)rLrqrw�superr�r��r�r^rar��sz ArchiverTestCaseBinary.test_fusecCsdSr]r^r�r^r^rari�szEArchiverTestCaseBinary.test_do_not_fail_when_percent_is_in_xattr_namecCsdSr]r^r�r^r^rarj�szDArchiverTestCaseBinary.test_do_not_fail_when_percent_is_in_file_name)r4r5r6r�r�rqrwror�rsr�rVr�r�rirj�
__classcell__r^r^rurars�s&






rscs�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�r:�archive1r�)rtr�rrqrr�r�r�r�rur^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�r.rrr�r�z"Starting archive consistency checkzChecking segmentszborg.output.progressz--repository-onlyz--archives-onlyz--glob-archives=archive2ryr�r�r�)r�r�rS�loggingZ	getLoggerZsetLevelZNOTSETrrr^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)Nryr�r�zshould not happenFr�r�r?r�r�rzNew missing file chunk detectedryz--format={health}#{path}{LF}r�zbroken#)ryr�rxr�archive3r.z$Healed previously missing file chunkzAtestsuite/archiver.py: Completely healed previously damaged file!)r�r�r�rr�r�r�Zfailr�r�r�rSZassert_not_equalrrrqrr�r�)r�r�r�rZ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)	NryrFr�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)	NryFr�r�r?r�r�r)r�r�r�r�r�r�rr^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)NryFr�r�r?r�r.r�rr�)r�r�r&�MANIFEST_IDr�r�r�rS)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�Nry�
corrupted!Fr�r�r?r�r.r�rr�)	r�r�r&r�r�r�r�r�rS)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�dSr�)
r�r�r&r�r�r�r�r�r�rS)r�r�r�r�r��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)Nryr��foo�barz2016-12-15T18:49:51.849711r?)�cmdliner��hostname�usernamer�r/r/sarchive)�contextFr�r�r�r�rryz
archive1.1r�)
r�rPr�r&r�r�Zpack_and_authenticate_metadatar��encryptr�r�r�rS)	r�r�r�rPr�r�Zarchive_dictr5rkr^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�r�r�)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
�}t|j�d
|vs�J�|jddd|jd	d
�}t|j�d
|v�sJ�d|v�s(J�dS)Nr�ryr�r��1234Fr�r�rr�r�r?z, integrity errorr�z6testsuite/archiver.py: New missing file chunk detected)r�r�r�r�r�r�r�r�r�rr�r�r�r�r�r,)r�Z	init_argsr�r�rr�r�rkr^r^ra�_test_verify_data�s$

*z'ArchiverCheckTestCase._test_verify_datacCs|�dd�dS)Nrr��r�r�r^r^ra�test_verify_data�sz&ArchiverCheckTestCase.test_verify_datacCs|�dd�dS)Nrrpr�r�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)r4r5r6r�r^r^r^ra�Attic013Item�sr�ryz0.13T)r�r�r�rr�ryz::0.13)r�r&r�r�rrZitems_bufferr�Zsaver�r�)r�r�r�r�r�rPr�r^r^ra�test_attic013_acl_bug�sDz+ArchiverCheckTestCase.test_attic013_acl_bug)r4r5r6r�r{r~r�r�r�r�r�r�r�r�r�r�r�r�rvr^r^rurarws2		
rwc@s4eZdZdd�Zdd�Zdd�Zdd�Zd	d
�ZdS)�ManifestAuthenticationTestcCs||�dt�|tj�\}}|�tj|�t�diit�t	dd��
t�d����|jdd�Wd�n1sn0YdS)Nr?�Zdays)r/rr�r.Fr�)
r&r�r�r�r�r�r.�packbr1rrr�r�)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�r:Tr�r?r�)r/rr.Fr�ry)r�r�r>r�r&r�r�r�r�r�r.r�r1rrr�r�rlrmrr�r^r^ra�test_fresh_init_tam_requireds�*z7ManifestAuthenticationTest.test_fresh_init_tam_requiredc	Cs�|�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�}d|vs�J�d|vs�J�|�dd
|j�|�d	d
|j�}d|v�s J�d|v�s.J�|�|�t�t��|�d	|j�Wd�n1�sh0Y|�dd
d|j�|�d	|j�dS)Nr�r:�archive1234Tr�Fstamr�ryr^z'Manifest TAM not found and not required�upgradez--tamzTAM-verified manifestr�)r�r�r�r>r�r�r�r%r,r�r&r�r�Ztam_requiredZchange_passphraseZ_passphraser.ZunpackbZdecryptr�r�r�r�r�r�r�rlrmr)r�r�r�rPr�rkr^r^ra�test_not_requireds0
*
.z,ManifestAuthenticationTest.test_not_requiredcCsX|�dd|j�|�d�|�dd|j�t|jdd�}|�|�|�d|j�rTJ�dS)	Nr�r:r�r��
--disable-tamTr�ry�r�r�r�r>r�r�r�r^r^ra�test_disable2s

z'ManifestAuthenticationTest.test_disablecCsX|�dd|j�|�d�t|jdd�}|�|�|�dd|j�|�d|j�rTJ�dS)	Nr�r:r�Tr�r�r�ryr�r�r^r^ra�
test_disable2:s

z(ManifestAuthenticationTest.test_disable2N)r4r5r6r�r�r�r�r�r^r^r^rar��s
 r�c@s,eZdZdd�Zdd�Zdd�Zdd�Zd	S)
�ArchiveAuthenticationTestcCszt�|tj�\}}t�d|gdddt��t�d��}|�|�}|�	||�
|��|t��f|j
|<|��|jdd�dS)Nr?rY)r/r�r�r�r�r�r/Fr�)r&r�r�r.r�r1rr�r�r�r�rrrr�r�)r�r�r}r�rPZarchive_datar5r^r^ra�write_archive_without_tamEs
�	
z3ArchiveAuthenticationTest.write_archive_without_tamcCs�|�dd|j�|�d�t|jdd�}|�|�|d�Wd�n1sN0Y|�dd|j�}d	|vstJ�d
|vs�J�|�dd|j�|�dd|j�}d	|vs�J�d
|vs�J�dS)Nr�r:�archive_tamTr��archive_no_tamry�--format="{name} tam:{tam}{NL}"�archive_tam tam:verified�archive_no_tam tam:noner�z--archives-tamzarchive_no_tam tam:verified�r�r�r�r>r�r��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�}d
|vs�J�d|vs�J�dS)Nr�r:r�Tr�r�Fr�r�r�ryr�r�)
r�r�r�r>r�r�r�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
|vs�J�d|vs�J�|�dd
|j�|�dd	|j�}d
|vs�J�d|vs�J�|�dd|j�}||ks�J�dS)Nr�r:r�ryz--format="{name} {id}{NL}"Tr�r�r�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)r4r5r6r�r�r�r�r^r^r^rar�Cs
r�c@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�r:Z_0z/fooZ_1Z_2Z_3)rrqr<r�r�r�rlrmr=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)Nr�z--restrict-to-repositoryr�r:rQ)rrqr<r�r�r�ror�r�rlrmr=)r�rnr^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�}||vs�J�|�d��4|�dd|jddd�}||vs�J�Wd�n1s�0Y|�d��6|�dd|jddd�}||v�sJ�Wd�n1�s40Y|�d��6|�dd|jddd�}||v�spJ�Wd�n1�s�0YWd�n1�s�0YdS)Nr�r:r�stest file contents 1rZz	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�rrCr�)r�Zmarker�resr^r^ra�-test_remote_repo_strip_components_doesnt_leak�s(*.zDRemoteArchiverTestCase.test_remote_repo_strip_components_doesnt_leakN)
r4r5r6r�rr�r�rqrwr�r<r�r�r^r^r^rar��s	


r�csFeZdZ�fdd�Zddd�Zdd�Zdd	�Zd
d�Zdd
�Z�Z	S)�ArchiverCorruptionTestCasecsFt���|��|�dd|j�t�|�d|jd��dd|_dS)Nr�r:rIrr�r�)rtr�r3r�r�r^r_r�r�rur^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�bytesr�r�)r�r��amountr�Z	corruptedr^r^ra�corrupt�s
z"ArchiverCorruptionTestCase.corruptcCsx|�tj�|jd��|jr<|jd|jdd�}d|vstJ�n8t�	t
��|�d|j�Wd�n1sj0YdS)Nr�rIrr�zfailed integrity check)r�ror�r�r�r�r�r�rlrmr#�r�r�r^r^ra�test_cache_chunks�sz,ArchiverCorruptionTestCase.test_cache_chunkscCsN|�d|jdd�|�tj�|jd��|�d|jdd�}d|vsJJ�dS)Nr�r?rVr�r�zfiles cache is corrupted)r�r�r�ror�r�r�r�r^r^ra�test_cache_files�sz+ArchiverCorruptionTestCase.test_cache_filescCsP|�d|jdd�|�d|jd���}|�d|jdd�|�dd|j�|�d	|jd
�tj�|jd�}tt�|��dks�J�|�	tj�||d
��tj�|jd�}t
dd�}|�|�|�ddt
td���t|d��}|�|�Wd�n1s�0Y|jdd|jdddd�}d|v�s0J�d|v�s>J�d|v�sLJ�dS)Nr�r�rVryz--format={id}{LF}rLr�r�rIrzchunks.archive.drJz.compactr�r�r�r�� r�r.r�r?r�z,Reading cached archive chunk index for test1z0Cached archive chunk index of test1 is corruptedz-Fetching and building archive index for test1)r�r�r�ror�r�r�rr�r�rr�r�r,r�r�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�}d|vs�J�dS)	Nr�r�r�r�r�r�rIzHCache integrity data not available: old Borg version modified the cache.)
ror�r�r�rr�r�r,r�r�r�r�r�)r�r�r�r�r�r^r^ra�test_old_version_interfereds

(z6ArchiverCorruptionTestCase.test_old_version_interfered)r?)
r4r5r6r�r�r�r�r�r�rvr^r^rurar��s

r�c@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��
file_replacedr�input/dir_replaced_with_filei��input/dir_removed�input/dir_replaced_with_link�input/link_changed�input/file_unchanged�input/link_removedzinput/file_removed2�input/link_target_removedrD�"input/link_target_contents_changed�input/link_replaced_by_file�input/file_replaced�input/hardlink_target_replaced�input/hardlink_contents_changed�input/file_removed�input/hardlink_removed�input/hardlink_target_removedr�r:r�rrVZ
file_added�Zfile_empty_addeds0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000rZZdir_replaced_with_filer��input/dir_added�input/link_addedZlink_replaced_by_filei@�input/file_added�input/hardlink_added�abs
appended_dataz::test1ar�z
16,18,17,4095z::test1bFcs�|rdnd�d�}|��}d|vs&J���||�d��d|vsDJ�dtjvrbtsb|sb��|d�d	|vsnJ�d
|vszJ�t�rȈ�|d���|d���|d
�d|vs�J�d|vs�J�d|vs�J�|r�dnd�d�}��||�d��t��r��||�d��t��rd|v�sJ�d|v�s*J�t��r@d|v�s@J�d|v�sNJ�d|v�s\J�t��rrd|v�srJ�t��r�|�r�d|v�s�J�d|v�s�J�dS)N�Bz{:<19}�modifiedr�z.*input/file_replacedr�r�z6drwxr-xr-x -> -rwxr-xr-x.*input/dir_replaced_with_filez#added directory     input/dir_addedz%removed directory   input/dir_removedz changed link.*input/link_changedzadded link.*input/link_addedz removed link.*input/link_removedr�r�r�z0 Bz
.*input/emptyz!.*input/hardlink_contents_changedr�z$added       2.05 kB input/file_addedz(added       2.05 kB input/hardlink_addedz*added           0 B input/file_empty_addedz&removed       256 B input/file_removedz*removed       256 B input/hardlink_removedr�r�)�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}||d|�vsFJ�t|d|��rXJ�d
tjvr�|s�dddd�|d|�vs�J�d
di|d|�vs�J�d
di|d|�vs�J�t��r`d
di|d|�vs�J�d
di|d|�vs�J�d
di|d|�vs�J�|�sLtdd�|d|�D���s$J|d|���td d�|d!|�D���sLJ|d!|���t|d"|���r`J�|�rrdd#d$d	�nd
di}||d%|�v�s�J�t��r�||d&|�v�s�J�t��r�t|d'|���r�J�d(d)d*�|d+|�v�s�J�t��rd(d)d*�|d,|�v�sJ�d(d$d*�|d-|�v�sJ�d.d/d*�|d0|�v�s6J�t��rXd.d/d*�|d1|�v�sXJ�t��r�|�r�t|d2|���rzJ�t|d3|���r�J�dS)4Ncs0�fdd�|D�}t|�dks"J�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>rcSsg|]}|D]}|�qqSr^r^)r�Zchgset�chgr^r^rar`�rR)r)rr�Zchgsetsr^r�ra�get_changes�sz[DiffArchiverTestCase.test_basic_functionality.<locals>.do_json_asserts.<locals>.get_changescSsg|]}|rt�|��qSr^r]r�r^r^rar`�rRzZDiffArchiverTestCase.test_basic_functionality.<locals>.do_json_asserts.<locals>.<listcomp>rMr�ir)r_�added�removedr_r�r�r�r�z
drwxr-xr-xz
-rwxr-xr-x)r_�old_mode�new_moder�zadded directoryr�zremoved directoryr�zchanged linkr�z
added linkr�zremoved linkr�css(|] }|ddko|d�d�VqdS)r_r�r��lNr��r�r�r^r^rar��s�zYDiffArchiverTestCase.test_basic_functionality.<locals>.do_json_asserts.<locals>.<genexpr>r�css(|] }|ddko|d�d�VqdS)r_r�r�r�Nr�r�r^r^rar��s�r�r��
rrDr�r�r�r�)r_r�r�r�zinput/file_empty_addedr�r�r�r�r�r�)rcr	ror�rGrH)rkr�r�r�ZjoutputrUr^r^ra�do_json_asserts�sV
�����zFDiffArchiverTestCase.test_basic_functionality.<locals>.do_json_assertsr�Ztest1aTZtest1b�--content-onlyr?r�)r�r[)F)F)rror�r�r&�S_IFDIRrGrrHrr�r�r��rmdir�S_IFREGr�r�)r�r�r�r�rkr^r�rarVsv













*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�}tdd �t||���D���sJ�dS)!Nr�r:�a_file_removedr.r
�f_file_removedr=�c_file_changedr��e_file_changedr�r�rrVzinput/a_file_removedzinput/f_file_removedzinput/c_file_changedzinput/e_file_changedr�r�b_file_addedr��d_file_addedr�r�r�z--sortrr�)r�r�r�r�r�r�css|]\}}||vVqdSr]r^)r��xr�r^r^rar�rRz8DiffArchiverTestCase.test_sort_option.<locals>.<genexpr>)r�r�rror�r��zipr�)r�rkrUr^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�r:r�rr
r�r�rVrxzinput/test_filer>r?r�r�r�r��ctimer�z
::archive3r|)r�r�rr/r0ror�rNrMrSr�rrr^r^ra�test_time_diffss.



z$DiffArchiverTestCase.test_time_diffsN)r4r5r6rVrrr^r^r^rar�s^r�cCs"t�}|�gd�d�}|j|jks&J�|jddgks8J�|jdksFJ�|jdksTJ�|�gd�d�}|jd	d
gksvJ�|�gd�d�}|jddgks�J�|�gd�d
�}|jd	d
gks�J�|�gd�d�}|jd	d
gks�J�|�gd�d�}|j|jks�J�|�ddgd�}|j|jk�sJ�dS)N)r~�servez--umask=0027�--restrict-to-path=/p1�--restrict-to-path=/p2zborg serve --infoz/p1z/p2r6rI)r~rz--restrict-to-repository=/r1z--restrict-to-repository=/r2zborg serve --info --umask=0027z/r1z/r2)r~rrrzborg serve --restrict-to-path=/z%borg serve --restrict-to-repository=/z-borg serve --restrict-to-repository=/r1/belowz borg init --encryption=repokey /r~rzBORG_FOO=bar borg serve --info)r�get_args�funcZdo_serveZrestrict_to_paths�umask�	log_levelZrestrict_to_repositories)rSr`r^r^ra�
test_get_args.s@
�
�
�
�
�
�
�rcCsbdd�}|gd�gd��sJ�|dgddg�r2J�|ddgddg�rHJ�|ddgdd	g�r^J�dS)
NcSsPdd�|D�}dd�|D�}tt|�t|��}tt|�t|��}||ksLJ�|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)rWrXZchunks_aZchunks_bZcompare1Zcompare2r^r^ra�cccWsz%test_chunk_content_equal.<locals>.ccc)r�s567AsbC)�1s23s4567A�b�Cs12345r�s56s65s565r^)rr^r^ra�test_chunk_content_equalVs,����������rc@s0eZdZedd��Zdd�Zdd�Zdd�Zd	S)
�TestBuildFiltercCsdSr]r^)rZmatchedr^r^ra�peek_and_store_hardlink_mastersxsz/TestBuildFilter.peek_and_store_hardlink_masterscCsdt�}|�td�gtj�t�||jd�}|tdd��s<J�|tdd��sNJ�|tdd��r`J�dS)NZincludedrr\z
included/filezsomething else)	r5r�r6r4ZIncluder�build_filterrr7�r�ZmatcherrRr^r^ra�
test_basic|szTestBuildFilter.test_basiccCs0tdd�}t�||jd�}|tdd��s,J�dS)NT��fallbackrZanythingr\�r5rrrr7rr^r^ra�
test_empty�s
zTestBuildFilter.test_emptycCshtdd�}tj||jdd�}|tdd��r.J�|tdd��r@J�|tdd��sRJ�|td	d��sdJ�dS)
NTrr?)Zstrip_components�shallowr\zshallow/zdeep enough/filezsomething/dir/filerrr^r^rar��s
z%TestBuildFilter.test_strip_componentsN)r4r5r6�staticmethodrrrr�r^r^r^rarws

rc@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)Nr�z--helpr�zshow this help message and exit)�actionr��
--criticalr
r��store_const�critical�warning)�destr�r�constr�rJ�error�--appendrOZTOPIC)r$r�r�metavarr��-pr�progress�
store_true)r$rr�z--lock-wait�	lock_wait�Nr?z(default: %(default)d).)r$r_r(r�r�)r�)Zadd_common_optionr^r^ra�define_common_options�s����z'TestCommonOptions.define_common_optionscCs&tjdddd�}tj|jdd�|_|S)NrCztest 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�r8r^r^ra�
subparsers�szTestCommonOptions.subparserscCs|jj|ddd�|S)Nr2T)Zprovide_defaults)r6�add_common_groupr;r^r^rar7�szTestCommonOptions.parsercCs tjddd�}|j�|d�|S)NFrC)r1r/r3)r4r5r6r=)r�r7�
common_parserr^r^rar>�szTestCommonOptions.common_parserc	sH|jd|gddddtjd�}|jdd�|jd	d
dd��fd
d�}|S)N�
subcommandFr�r��baz)�parentsr1r0�epilogr��formatter_class��)r�
--append-onlyr:r+)r$rcs&t|���|�}�j�|�t|�Sr])r�rxr6�resolve�vars)r�r`�r7r^ra�parse_vars_from_line�s
zDTestCommonOptions.parse_vars_from_line.<locals>.parse_vars_from_line)�
add_parserr4�RawDescriptionHelpFormatter�set_defaults�add_argument)r�r7r<r>Z	subparserrIr^rHrarI�s�z&TestCommonOptions.parse_vars_from_linecCs�|d�gdddd�ksJ�|ddd�gddddd	d
�ks<J�t�t��|dd�Wd�n1sf0Y|dd
ddd
d�gd�ddddd	d
�ks�J�dS)NrJr?r&F)rOr,r
r*r?r r"rD�rOr,r
r*r:rrEz--append=foor'r�r@)r�r�r@r#)rlrmrm)r�rIr^r^ra�test_simple�s0�
�	(�zTestCommonOptions.test_simple�position)r�r��bothzflag,args_key,args_value))r)r*T)z
--lock-wait=3r,rrcCs`g}|dvr|�|�|�d�|dvr2|�|�gdddddd�}|||<||�|ks\J�dS)	N)r�rQr?)r�rQr?r#FrDrN)rO)r�rIrP�flagZargs_keyZ
args_valuer�rQr^r^ra�test_flag_position_independence�s


�z1TestCommonOptions.test_flag_position_independenceN)r4r5r6rr.rl�fixturer8r<r7r>rIrOro�parametrizerSr^r^r^rar�s 





rcCsHtd�dksJ�t�tj��td�Wd�n1s:0YdS)NZ50Mi��Z5M)rrlrmr4�ArgumentTypeErrorr^r^r^ra�test_parse_storage_quota�srWcsFtdd���}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)NZSubParsersActionrV)�_actions�choicesrfr�r�r�rd)r�r7rZ
extra_choicesrYrr��command��discover_level�parsersr^rar\s

z'get_all_parsers.<locals>.discover_levelrY)N)rZbuild_parser)r7Z
borgfs_parserr^r[ra�get_all_parserssr^zcommand, parsercCst|jt�r|jjsJ�dSr])rerBr2Zrst)rZr7r^r^ra�test_help_formattingsr_�topiccCstj|}tt|��sJ�dSr])r�helptextrfr3)r`rar^r^ra�test_help_formatting_helptexts$s
rb)�r4Zdateutil.tzrr�rur^rzrorjr�rr�rur&rircr�r/rqZbinasciirrZconfigparserrrrrZhashlibrr	r
Z
unittest.mockrrlr~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�r4r5r6rr7r8r9r�r:�loggerr;Zremoter<r=r�r>r@rArBrCrDrErFrGrHrIrJrKrLrMrNZupgraderrOrPr�rr�r�__file__r�r�r�Z	BORG_EXES�FileNotFoundErrorrTr�r�r�rorpr�r�r�r7rrrsrwr�r�r�r�r�rrrrrWr^rUryr�r_rar�rbr^r^r^ra�<module>s� 1	


 
>l+tL@GJ(!k