o
    +ke1                    @   s  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlmZmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZmZ d d	lm Z  d dl!Z!d dl"Z"d dl#Z"d
dl$m%Z%m&Z&m'Z' d
dl(m)Z)m*Z* d
dl+m,Z,m-Z-m.Z. d
dl/m0Z0m1Z1 d
dl2m3Z3 d
dl4T d
dl5m6Z6m7Z7 d
dl8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z> d
dl?m@Z@mAZA d
dlBmCZC d
dl&mDZDmEZE d
dl&mFZFmGZGmHZH d
dl&mIZImJZJmKZK d
dl&mLZL d
dl&mMZM d
dl&mNZN d
dl&mOZOmPZP d
dl&mQZQ d
dlRmSZSmTZT d
dlUmVZVmWZWmXZX d
dlYmZZZm[Z[m\Z\ d
d l]m^Z^ d
d!l_m`Z` d
d"lambZbmcZc d
d#ldmeZe d$d%l$mfZfmgZg d$d&l$mhZhmiZimjZjmkZkmlZl d$d'l$mmZmmnZnmoZompZpmqZq d$d(l'mrZrmsZsmtZt d$d)lumvZv d$d*l$mwZw ejxyejxzejx{e|d+Z}dd,dd-d,d.d/d0Z~d1d2 Zze~d3d4d5d6 d7d8gZW n ey   d7gZY nw e!jed9d:d; Zd<d= Z	 d>Ze!jjejxe d?e d@dAdB ZG dCdD dDehZG dEdF dFeZed8ev dGG dHdI dIeZG dJdK dKeZG dLdM dMeZG dNdO dOeZG dPdQ dQeZG dRdS dSeZG dTdU dUeZdVdW ZdXdY ZG dZd[ d[ZG d\d] d]Zd^d_ Zd`da Ze!jdbee  dcdd Ze!jdeee,j dfdg ZdS )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              
   O   s   |rkz,|d u rt jddf}nt|tr|f}n	t|ts tdtj|| tj|d}d}	W n/ tj	yG }
 z|
j
}|
j}	W Y d }
~
nd }
~
w ty] }
 zd}|
j}	W Y d }
~
nd }
~
ww |rd|	|fS |	t|fS t jt jt j}}}zt| t _t|t j_t }tj|dd } t _t _| d u rt } d	d
 | _t| _tt_z	| t|}W n1 ty }
 z%|   |
j|r|! n|!  fW  Y d }
~
W |||t _t _t _S d }
~
ww | "|}	|   |	|r|! n|!  fW |||t _t _t _S |||t _t _t _w )Nz-mzborg.archiverz"exe must be None, a tuple or a str)stderrrV   r    utf-8encodingc                  W      d S N argsr_   r_   ;usr/lib/python3.10/site-packages/borg/testsuite/archiver.py<lambda>c   s    zexec_cmd.<locals>.<lambda>)#sys
executable
isinstancestrtuple
ValueError
subprocesscheck_outputSTDOUTCalledProcessErroroutput
returncode
SystemExitcodeosfsdecodestdinstdoutrX   r
   decoder	   bufferioTextIOWrapperr   Zprerun_checksr)   	exit_coder   
parse_argslistflushgetvaluerun)rS   rT   rU   rV   rW   ra   kwborgrn   retert   ru   rX   Zoutput_textr_   r_   rb   exec_cmdD   sZ   


*
0r   c                  C   s6   t dsdS tjddgtjd} |  \}}d|v S )NtarFz	--version)ru   s   GNU tar)shutilwhichrj   PopenPIPEcommunicate)popenru   rX   r_   r_   rb   have_gnutaru   s
   
r   helpborg.exeTrU   rT   pythonbinary)paramsc                    s8   | j dkrd  n| j dkrd ntd fdd}|S )Nr   r   r   z"param must be 'python' or 'binary'c                     s   t |  dd|S )NTr   )r   )ra   r   rU   r_   rb   exec_fn   s   zcmd.<locals>.exec_fn)paramri   )Zrequestr   r_   r   rb   cmd   s   

r   c                 C   s  | d}| d}| d}|dd | dddt| \}}|tks)J | d	d
| t|\}}|tks;J tt| | dd
| \}}|tksQJ W d    n1 s[w   Y  | dd
| d\}}|tkspJ | d	d
| t|\}}|tksJ d S )NreporV   rn   	test_filecontentinit--encryption=nonez%screatez%s::archiveextractzdoes/not/match)mkdirjoinwriterg   r)   rC   r*   r+   )r   tmpdirr   rV   rn   rcoutr_   r_   rb   test_return_codes   s    


r   z/tmp/borg-mountzneeds a 16MB fs mounted on %sreasonc                 C   sJ  ddd}t dd t}tj|sJ tj|d}tj|d}tj|d}td	D ]}tj|dd
 tj|dd
 ||dddd | d|\}}|t	krXt
d|| |t	ks^J zd\}	}
|	r|
d7 }
z||dd W n ty } z|jtjkrW Y d }~nP d }~ww z0| dd||
f |\}}|t	k}	|	st
d|| W tjtj|ddd
 ttj|d ntjtj|ddd
 ttj|d w |	seW tj|dd
 ntj|dd
 w | d|\}}|t	krt
d|| | dd|\}}|t	kr
t
d|| |t	ksJ q/W d    d S 1 sw   Y  d S )NTc              	   S   s   t j| dd t|  |rtd|}|dkrtd|}t|D ]*}tj| d| }t	|d}t
|}|| W d    n1 sGw   Y  q"d S )NTignore_errorsr?   zfile%03dwb)r   rmtreerr   r   randomrandintrangepathr   openurandomr   )dircountsizerndifnfdatar_   r_   rb   
make_files   s   

z"test_disk_full.<locals>.make_filesYES)!BORG_CHECK_I_KNOW_WHAT_I_AM_DOINGr   rV   reserved   r   P   i F)r   r   )Tr   r?      i@ r   z%s::test%03dlock.exclusivezlock.rosterr|   check--repairT)rD   DF_MOUNTrr   r   existsr   r   r   r   r)   printOSErrorerrnoENOSPCremove)r   r   mountr   rV   r   jr   r   successr   errr_   r_   rb   test_disk_full   sb   
 
$r   c                   @   s\   e Zd ZdZdZ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dZdS )ArchiverTestCaseBaseNFrY   c                 C   s  dt jd< dt jd< dt jd< dt jd< | j rt pd | _t | _t j	| jd| _
| j| j
 | _t j	| jd	| _t j	| jd
| _t j	| jd| _t j	| jd| _t j	| jd| _t j	| jd| _| jt jd< | jt jd< t | j t | jd t | j t | j t | j t| jd}|d W d    n1 sw   Y  t| jd}|d W d    n1 sw   Y  t  | _t | j d S )Nr   r   "BORG_DELETE_I_KNOW_WHAT_I_AM_DOINGZwaytooeasyonlyfortestsBORG_PASSPHRASEdisabledZBORG_SELFTEST
repositoryrV   rn   keyscacheZexcludespatternsZBORG_KEYS_DIRZBORG_CACHE_DIR  r   s1   input/file2
# A comment line, then a blank line

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

)rr   environFORK_DEFAULTr   rS   tempfilemkdtempr   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_   rb   setUp   s:   





zArchiverTestCaseBase.setUpc                 C   s&   t | j tj| jdd t  d S )NTr   )rr   r   r   r   r   r   r;   r   r_   r_   rb   tearDown  s   
zArchiverTestCaseBase.tearDownc           	         s   | dd}| dd }|dd}|d u r| j}t||| j| jd|\}}||kr0t| | || |r<t	 nt |rBdnd}|
 fd	d
|jddD }|S )Nrz   r   rT   rW   F)rT   rU   rS   rR   rY   c                 3   s    | ]	} |vr|V  qd S r^   r_   .0lineZpp_msgr_   rb   	<genexpr>+  s    z+ArchiverTestCaseBase.cmd.<locals>.<genexpr>T)keepends)popgetr   r   EXErS   r   assert_equalr   encoder   
splitlines)	r   ra   r   rz   rT   rW   r   rn   emptyr_   r   rb   r     s    zArchiverTestCaseBase.cmdc                 C   s   |  dd| jd | t d S )Nr   z--compression=lz4::r   r   src_dir)r   namer_   r_   rb   create_src_archive/  s   z'ArchiverTestCaseBase.create_src_archivec                 C   s`   t | jdd}| t|tj\}}t||||}W d    ||fS 1 s'w   Y  ||fS NTZ	exclusive)r>   r   r&   loadNO_OPERATION_CHECKr   )r   r   r   manifestrP   archiver_   r_   rb   open_archive2  s   
z!ArchiverTestCaseBase.open_archivec                 C   s   t | jddS r  )r>   r   r   r_   r_   rb   open_repository9     z$ArchiverTestCaseBase.open_repositoryr   c                 C   s   |dkr|rt ||krJ dtj| j|}tjtj|s+ttj| t|d}|d u r9d| }|	| W d    d S 1 sIw   Y  d S )Nr   zsize and contents do not matchr      X)
lenrr   r   r   r   r   dirnamemakedirsr   r   )r   r   r   contentsfilenamer   r_   r_   rb   create_regular_file<  s    "z(ArchiverTestCaseBase.create_regular_fileTc              
   C   s  | j ddd | j ddd | j ddd tdd |r2t r2ttj| jdtj| jd	 t rAt	d
tj| jd | j ddd t
jsjt
| jrjttj| jd}t
|dd t
|dd t rxttj| jd trttj| jdtj z-tddtjB tdd tddtjB tdd tdd tddd d}W n( ty   d}Y n ty } z|jtjtjfvrЂ d}W Y d }~nd }~ww t !d | j d!d"d |S )#zCreate 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/dir2im  r      TFNr   r   )"r  rr   r   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   EINVALZENOSYStimesleep)r   create_hardlinksr   	have_rootr   r_   r_   rb   create_test_filesF  sH   

z&ArchiverTestCaseBase.create_test_files)r   Nr   )__name__
__module____qualname__r   r   r   r   r   r   r  r  r	  r  r=  r_   r_   r_   rb   r      s    

r   c                   @   sx
  e Zd Zejje  ddZdd Zdd Z	edd Z
d	d
 Zdd Zdd Zejje  dddd Zejje  dddd Zejje  dddd Zejje  dddd Zejje  dddd Zejje  ddejje  dddd Zejje  ddejje  d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d0d1 Z d2d3 Z!d4d5 Z"d6d7 Z#d8d9 Z$d:d; Z%ee&'e(d<d=d> Z)ed?d@ Z*edAdB Z+edCdD 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~ ZIdd ZJdd ZKdd ZLdd ZMdd ZNdd ZOejje  dddd ZPejjeQjR dddd ZSejjeQjR dddd ZTejjeU dddd ZVdd ZWdd ZXdd ZYdd ZZdd Z[dd Z\dd Z]dd Z^dd Z_dd Z`dd Zadd Zbdd Zcdd Zddd Zedd Zfdd Zgdd Zhdd Zidd Zjdd Zke&'e(d<dd Zlejjdemjnv ddddń ZoddǄ ZpddɄ Zqdd˄ Zrdd̈́ Zsddτ Ztddф Zuddӄ ZvddՄ Zwddׄ Zxe&'e(d<ddل Zyejjzddۄ Z{dd݄ Z|dd߄ Z}dd Z~dd Zdd Zdd Zdd Zdd Zdd Zejje  dddd Zdd Zdd Zdd ZdddZdd Zdd Zdd 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> Ze&'e(d<d?d@ Ze&'e(d<dAdB Ze&'e(d<dCdD Ze&'e(d<dEdF Ze&'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 Zejje  d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͐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 Zejjeڃ  ddZejjeܠݐd ddZeېdd Zeeސdd Zeېdd Zeeېdd Zeeېdd Zdd Zeސdd Zeېdd Zeېdd Zdd ZejjeQjR dddd ZejjeQjR dddd Zdd Zdd Zdd ZdS (  ArchiverTestCasezhardlinks not supportedr   c                 C   s   t | | j}t|S r^   )r,   _extract_repository_idr   r%   r   Zrepository_idr_   r_   rb   r%     s   z!ArchiverTestCase.get_security_dirc           
      C   s  |   }| jdddd| jdd}| d| | d| | d	d
| jd d | d	d
d| jd d}| d| | d| td | d| jd  W d    n1 sWw   Y  | dd| j}| d| | d| g d}t r||d t r|d t r|d |s|	d |	d t
r|	d t	tjdd | dd| jd }|D ]}| || q| dd | d | jd }t
rd!nd"}| d#| | t| j | d | jd }d$d% }	| |	||	| d S )&Nr   --encryption=repokey--show-versionz	--show-rcTrT   borgbackup versionz%terminating with success status, rc 0r   --exclude-nodump::testrV   --stats::test.2zArchive name: test.2zThis archive: rn   r   r|   --shorttestztest.2)rV   r!  r#  r&  zinput/dir2/file2input/emptyr  input/flagfilezinput/fifo1input/link1input/hardlinkr!  r#  rO  r  output/inputinfo      zNumber of files: %dc                 S   sB   g d}g }|   D ]}|D ]}||r|| qq
d|S )N)zName:zFingerprint:zNumber of files:zThis archive:All archives:zChunk index:
)r   
startswithappendr   )rn   prefixesresultr   r   r_   r_   rb   filter  s   


z9ArchiverTestCase.test_basic_functionality.<locals>.filter)r=  r   r   	assert_inrC   rI   rY  rG   rH   r   r@   rr   r   r   assert_dirs_equalr   r   r   r   )
r   r<  rn   Zlist_outputexpectedr   Zinfo_output
item_countZinfo_output2r\  r_   r_   rb   test_basic_functionality  sL   







z)ArchiverTestCase.test_basic_functionalityc                 C   s   t j| jd}t j| jd}t | t | t j|d}t j|d}| j|dd t || | dd| j | d| jd	 d
d
 | dd| jd	 }dd |	dD }t
|g dksfJ d S )Nabr     123456r  r   r   r   rI  rV   r|   --json-linesc                 S      g | ]}|rt |d  qS r   jsonloadsr   r_   r_   rb   
<listcomp>      z?ArchiverTestCase.test_create_duplicate_root.<locals>.<listcomp>rW  )rV   zinput/ainput/a/hardlinkzinput/binput/b/hardlink)rr   r   r   r   r   r  r(  r   r   splitsorted)r   path_apath_bhl_ahl_barchive_listpathsr_   r_   rb   test_create_duplicate_root  s   

z+ArchiverTestCase.test_create_duplicate_rootc                 C   s   t j| jdd}t j|d}| j| }ttj | 	dd| W d    n1 s-w   Y  | 	ddd| t j
|sBJ d S )NZparent1Zparent2r   r   r   z--make-parent-dirs)rr   r   r   r   r   pytestraisesr>   ZParentPathDoesNotExistr   r   )r   parent_pathr   r   r_   r_   rb   test_init_parent_dirs  s   
z&ArchiverTestCase.test_init_parent_dirsc                 C   sj   t j| jd}t j| jdd}t | t | t |d | dd| j | d| jd | d S )NparentrootI   r   r   r   rI  )rr   r   r   r   r   r   r   r   )r   
parent_dirroot_dirr_   r_   rb   test_create_unreadable_parent  s   

z.ArchiverTestCase.test_create_unreadable_parentc              
   C   s   |  dd| j zttjtj}|tj| j	d W n) t
yF } z|jtjkr1td n|jtjkr<td W Y d }~nd }~ww |  d| jd d |  td	 |  d
| jd  tjdrkJ W d    d S 1 svw   Y  d S )Nr   rD  zunix-socketz&unix sockets disabled or not supportedz(permission denied to create unix socketsr   rI  rV   rn   r   zinput/unix-socket)r   r   socketAF_UNIXSOCK_STREAMbindrr   r   r   r   r7  r   EPERMry  skipEACCEScloserC   r   )r   sockr   r_   r_   rb   test_unix_socket  s"   

"z!ArchiverTestCase.test_unix_socketzsymlinks not supportedc                 C   s~   |    | dd| j | d| jd d td | d| jd  tdd	ks-J W d    d S 1 s8w   Y  d S )
Nr   rD  r   rI  rV   rn   r   rP  r  )r=  r   r   rC   rr   readlinkr   r_   r_   rb   test_symlink_extract  s   
"z%ArchiverTestCase.test_symlink_extractz4cannot properly setup and execute test without utimec                 C   s   |    | dd| j | d| jd d td | d| jd  W d    n1 s.w   Y  tjds;J td	}td
}t|j	|j	sNJ d S )Nr   rD  r   rI  rV   rn   r   output/input/dir2/file2r&  output/input/dir2
r=  r   r   rC   rr   r   r   r0  rF   st_mtime_ns)r   stistor_   r_   rb   test_directory_timestamps1  s   


z+ArchiverTestCase.test_directory_timestamps1c                 C      |    | dd| j d}| jdd| jd |d td | d	| jd  W d    n1 s2w   Y  tjd
s?J td}td}t|j	|j	sRJ d S )Nr   rD  s   input/dir2
input/dir2/file2
r   --paths-from-stdinrI  rV   rn   r   r  r&  r  r  )r   Zflist_dir_firstr  r  r_   r_   rb   test_directory_timestamps2     


z+ArchiverTestCase.test_directory_timestamps2c                 C   r  )Nr   rD  s   input/dir2/file2
input/dir2
r   r  rI  r  rn   r   r  r&  r  r  )r   Zflist_file_firstr  r  r_   r_   rb   test_directory_timestamps30  r  z+ArchiverTestCase.test_directory_timestamps3c                 C   s  dd }|    d\}}|d}td||f | dd| j | dd| jd	 d
 td | d| jd	  W d    n1 sCw   Y  td}td}t|j|js[J t|j|d seJ |r|t|j	|j	spJ t|j	|d szJ d S t|j	|d sJ d S )Nc                 S   s   t | j}ztt | t}|  W d    n1 sw   Y  W n
 ty.   Y dS w t | j}ttk}|o?t||S NF)	rr   r0  st_atime_nsr   r/   readr7  r0   rF   )	some_fileatime_beforefileatime_afternoatime_usedr_   r_   rb   has_noatimeE  s   
z0ArchiverTestCase.test_atime.<locals>.has_noatime)i[i8r  r   rD  r   --atimerI  rV   rn   r   output/input/file1    eA)
r=  rr   utimer   r   rC   r0  rF   r  r  )r   r  atimemtimehave_noatimer  r  r_   r_   rb   
test_atimeC  s$   


zArchiverTestCase.test_atimez8cannot properly setup and execute test without birthtimec                 C   s   |    d\}}}td||f td||f | dd| j | d| jd d td | d	| jd  W d    n1 sCw   Y  td}td
}t|jd |jd s_J t|jd |d skJ t|j	|j	stJ t|j	|d s~J d S )Ni k8iCm8i n8r  r   rD  r   rI  rV   rn   r   r  r  
r=  rr   r  r   r   rC   r0  rF   st_birthtimer  r   Z	birthtimer  r  r  r  r_   r_   rb   test_birthtimed  s   



zArchiverTestCase.test_birthtimec                 C   s   |    d\}}}td||f td||f | dd| j | dd| jd d td	 | d
| jd  W d    n1 sDw   Y  td}td}t|jd |d s_J t|jd |d skJ t|j	|j	stJ t|j	|d s~J d S )Nr  r  r   rD  r   z--nobirthtimerI  rV   rn   r   r  r  r  r  r_   r_   rb   test_nobirthtimev  s   



z!ArchiverTestCase.test_nobirthtimec                 C   s4   t | j}|jW  d    S 1 sw   Y  d S r^   )r>   r   id)r   r   r   r_   r_   rb   rB    s   $z'ArchiverTestCase._extract_repository_idc                 C   s   t d d}|tj|d |ddt| ttj|dd}|| W d    n1 s2w   Y  t	| j
}|jW  d    S 1 sJw   Y  d S )Ninterpolationconfigr   r  w)r   r  rr   r   r   setr,   r   r   r>   r   r  )r   r   r  r  r   r   r_   r_   rb   _set_repository_id  s   
$z#ArchiverTestCase._set_repository_idc           	      C   s  dd }t j| jd}d}ddt>  }|t| | }t|d"}||d || ||d |	 }|
| W d    n1 sFw   Y  ||||}|r| dd	| j | d
| jd d t| j | dd| jd  W d    n1 sw   Y  | dd t j| jdd}t|d)}| ||d|  | |t|| | ||d|  W d    n1 sw   Y  ||||sJ d S d S )Nc              	   S   s   t | }|j|ksJ d}|rt|dr|jd |jkrd}|retret| d5}z|dt jdkr5d}|dt j	|kr@d}W n t
yL   d}Y n	w W d    |S W d    |S 1 s`w   Y  |S )NT	st_blocks   Frbr   )rr   r0  st_sizehasattrr  r   r   seek	SEEK_HOLE	SEEK_DATAr   )r   
total_size	hole_sizestsparser   r_   r_   rb   	is_sparse  s0   


z4ArchiverTestCase.test_sparse_file.<locals>.is_sparser     foobarrU  r?   r   r   rD  r   rI  rV   r   z--sparserR  r      )rr   r   r   r   ZCHUNK_MAX_EXPr  r   r  r   telltruncater   r   rC   r   r^  r   r  )	r   r  r  r   r  r  r   posZsparse_supportr_   r_   rb   test_sparse_file  s:   
	z!ArchiverTestCase.test_sparse_filec              
   C   s   g d}|D ]}t j| j|}t|d W d    n1 s w   Y  q| dd| j | d| jd d |D ]3}td | d	| jd t jd| W d    n1 sZw   Y  t jt jdd|smJ q:d S )
N)Znormalzwith some blanksz(with_parens)r   r   rD  r   rI  rV   rn   r   )	rr   r   r   r   r   r   r   rC   r   )r   	filenamesr  r_   r_   rb   test_unusual_filenames  s   
 z'ArchiverTestCase.test_unusual_filenamesc                 C   s   |    dtjd< | dd| j | | j}| d| jd d t| j | dd| j | 	| j| | 
|| | j | jrQ| jd| jd	 dtd
 d S ttj | d| jd	 d W d    d S 1 smw   Y  d S )N
passphraser   r   rD  r   rI  rV   r   rK  rz   r=  rr   r   r   r   rB  r   r   r   r  r   r   r+   ry  rz  r   ZEncryptionMethodMismatchrC  r_   r_   rb   test_repository_swap_detection  s   
"z/ArchiverTestCase.test_repository_swap_detectionc                 C   s   |    | dd| jd  dtjd< | dd| jd  | d| jd	 d
 t| jd  t| jd | jd  | j	rL| jd| jd d
t
d d S ttj | d| jd d
 W d    d S 1 shw   Y  d S )Nr   r   _unencryptedr  r   rD  
_encryptedr   _encrypted::testrV   _encrypted::test.2r  r=  r   r   rr   r   r   r   r   renamer   r+   ry  rz  r   ZRepositoryAccessAbortedr   r_   r_   rb   test_repository_swap_detection2  s   
"z0ArchiverTestCase.test_repository_swap_detection2c                 C   s   |    dtjd< | dd| j | | j}| d| jd d t| j | dd| j | 	| j| | 
|| | j | d	d
| j | jrY| jd| jd dtd d S ttj | d| jd d W d    d S 1 suw   Y  d S )Nr  r   r   rD  r   rI  rV   r   delete--cache-onlyrK  r  r  rC  r_   r_   rb   'test_repository_swap_detection_no_cache  s   
"z8ArchiverTestCase.test_repository_swap_detection_no_cachec                 C   s  |    | dd| jd  dtjd< | dd| jd  | d| jd	 d
 | dd| jd  | dd| jd  t| jd  t| jd | jd  | j	r`| jd| jd d
t
d d S ttj | d| jd d
 W d    d S 1 s|w   Y  d S )Nr   r   r  r  r   rD  r  r   r  rV   r  r  r  r  r  r   r_   r_   rb   (test_repository_swap_detection2_no_cache  s   
"z9ArchiverTestCase.test_repository_swap_detection2_no_cachec              	   C   s@  |    | dd| j | d| jd d t| j tdd | dd| j | dd	| j t|   W d    n1 sCw   Y  td dI | jr^| jd| jd
 dt	d n(t
tj | d| jd
 d W d    n1 syw   Y  W d    d S W d    d S W d    d S 1 sw   Y  d S )Nr   rD  r   rI  rV   rY   )r   r  r  rK  r  )r=  r   r   r   r   r   rD   r%   r   r+   ry  rz  r   CacheInitAbortedErrorr   r_   r_   rb   7test_repository_swap_detection_repokey_blank_passphrase  s(   "zHArchiverTestCase.test_repository_swap_detection_repokey_blank_passphrasec                 C   s0  |  dd| j |  }t| j| jd  tdd |  d| jd  W d    n1 s/w   Y  ttj	|d}|
 }|t| jd  ksOJ W d    n1 sYw   Y  |  d| jd  t| j |  d| jd  t| |  d| jd  dD ]}tjtj	||sJ qd S )	Nr   rD  _newyes)Z BORG_RELOCATED_REPO_ACCESS_IS_OKrS  location)r  zkey-typezmanifest-timestamp)r   r   r%   rr   r  r   rD   r   r   r   r  r$   Zcanonical_pathr   r   r   r   )r   Zsecurity_dirr   r  r  r_   r_   rb   test_repository_move+  s$   
z%ArchiverTestCase.test_repository_movec                 C   sd   |  dd| j ttj|  dd}|d W d    n1 s$w   Y  |  d| j d S )Nr   rD  r  r  zsomething outdatedrS  )r   r   r   rr   r   r   r%   r   r   r_   r_   rb   test_security_dir_compat=  s
   z)ArchiverTestCase.test_security_dir_compatc                 C   s   |  dd| j |  d| j t| j |  d| j t| j t|   | jr6| j d| jtd nt	t
j |  d| j W d    n1 sNw   Y  tdd |  d| j W d    d S 1 skw   Y  d S )Nr   r   rS  r  r  )Z*BORG_UNKNOWN_UNENCRYPTED_REPO_ACCESS_IS_OK)r   r   r   r   r   r%   r   r+   ry  rz  r   r  rD   r   r_   r_   rb   test_unknown_unencryptedE  s   "z)ArchiverTestCase.test_unknown_unencryptedc              	   C   sR  |  dd| j | d |  d| jd d td |  d| jd d	d
 tjdr/J | d |  d| jd d	d W d    n1 sJw   Y  | d |  d| jd d	d W d    n1 sjw   Y  | d |  d| jd d	d W d    n1 sw   Y  W d    d S W d    d S 1 sw   Y  d S )Nr   rD  dir/filer   rI  rV   rn   r   --strip-components3r  21input/dir/file0)r   r   r  rC   rr   r   r   assert_creates_filer   r_   r_   rb   test_strip_componentsY  s$   

"z&ArchiverTestCase.test_strip_componentsc                 C   s   t t j| jd t t j| jd | jddd t t j| jdt j| jd t t j| jdt j| jd t t j| jdt j| jd | d	 t t j| jd	t j| jd
 | dd| j | d| jd d d S )NZdir1zdir1/subdirsourcerd  re  Zabbazdir1/hardlinkzdir1/subdir/hardlinkzdir1/source2z	dir1/aaaar   rD  r   rI  rV   )	rr   r   r   r   r   r  r(  r   r   r   r_   r_   rb   _extract_hardlinks_setupg  s$   
z)ArchiverTestCase._extract_hardlinks_setupzllfuse not installedc              	   C   s  |    tj| jd}tjdkrddg}nddg}| j| jd |dg|R  O t	|; t
djd	ks8J t
d
jd	ksBJ td
d dksMJ t
djd	ksWJ t
djd	ksaJ W d    n1 skw   Y  W d    n1 szw   Y  | j| jd |dg|R  O t	|; t
djd	ksJ t
djd	ksJ tdd dksJ t
djd	ksJ t
djd	ksJ W d    n1 sw   Y  W d    n1 sw   Y  | j| jd |g|R  ^ t	|@ t
djdksJ t
djdksJ t
djdksJ t
djdks#J tdd dks/J W d    n1 s:w   Y  W d    d S W d    d S 1 sSw   Y  d S )N
mountpointdarwin-oz$ignore_permissions,defer_permissionsZignore_permissionsrI  --strip-components=2r  r   subdir/hardlinkr  rd  aaaasource2
input/dir1input/dir1/hardlinkinput/dir1/subdir/hardlinkinput/dir1/aaaainput/dir1/source2input/sourcerT  
input/abba)r  rr   r   r   r   rd   r   
fuse_mountr   rC   r0  st_nlinkr   r  )r   r  Zignore_permsr_   r_   rb   test_fuse_mount_hardlinksz  sH   

  Tz*ArchiverTestCase.test_fuse_mount_hardlinksc                 C   s   |    tdE | d| jd  tdjdksJ tdjdks&J tdjdks0J tdjdks:J tdd	 d
ksEJ W d    d S 1 sPw   Y  d S )Nrn   r   rI  r  rT  r  r  r  r  rd  	r  rC   r   r   rr   r0  r   r   r  r   r_   r_   rb   test_extract_hardlinks1  s   
"z(ArchiverTestCase.test_extract_hardlinks1c                 C   sT  |    tdF | d| jd dd tdjdksJ tdjdks(J tdd	 d
ks3J tdjdks=J tdjdksGJ W d    n1 sQw   Y  tdF | d| jd d tdjdksoJ tdjdksyJ tdd	 d
ksJ tdjdksJ tdjdksJ W d    d S 1 sw   Y  d S )Nrn   r   rI  r  r  r  r   r  r  rd  r  r  r  r  r  r  r  r  r   r_   r_   rb   test_extract_hardlinks2  s"   

"z(ArchiverTestCase.test_extract_hardlinks2c                 C   s   t j| jd}t j| jd}t | t | t j|d}t j|d}| j|dd t || | dd| j | d| jd	 d
d
 t	d& | d| jd	  t 
djdks`J t 
djdksjJ W d    d S 1 suw   Y  d S )Nrb  rc  r  rd  re  r   r   r   rI  rV   rn   r   rn  r   ro  )rr   r   r   r   r   r  r(  r   r   rC   r0  r   )r   rr  rs  rt  ru  r_   r_   rb   test_extract_hardlinks_twice  s   


"z-ArchiverTestCase.test_extract_hardlinks_twicec                 C   sh  |  dd| j | jddd | jddd | jddd | jddd |  d	d
| jd d td |  d| jd d W d    n1 sHw   Y  | ttddg td |  dd| jd  W d    n1 srw   Y  | ttdddg td |  dd| j | jd  W d    n1 sw   Y  | ttdddg d S )Nr   rD  r  r  r  file2file3file4r   z--exclude=input/file4rI  rV   rn   r   r  rR  --exclude=input/file2--exclude-from=)	r   r   r  rC   r   rq  rr   listdirr   r   r_   r_   rb   test_extract_include_exclude  s$   


z-ArchiverTestCase.test_extract_include_excludec              	   C   s  |  dd| j | jddd | jddd | jddd | jddd | jd	dd |  d
d| jd d td |  d| jd  W d    n1 sNw   Y  | ttdg d t	d td |  dd| jd  W d    n1 s~w   Y  | ttdddg t	d td |  ddd| jd  W d    n1 sw   Y  | ttddd	g t	d td |  dd| j
 dd| jd  W d    n1 sw   Y  | ttddg d S )Nr   rD  r  r  r  r  r  r  file333r   z--exclude=re:input/file4$rI  rV   rn   r   rR  r  r  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   r  rC   r   rq  rr   r  r   r   r   r   r_   r_   rb   "test_extract_include_exclude_regex  s8   







z3ArchiverTestCase.test_extract_include_exclude_regexc                 C   sp  |  dd| j | jddd | jddd | jddd | jddd | jd	dd | jd
dd t| jd}|d |d W d    n1 sMw   Y  |  dd| j | jd d td |  d| jd  W d    n1 sxw   Y  | tt	
dg d td t| jd}|d W d    n1 sw   Y  td |  dd| j | jd  W d    n1 sw   Y  | tt	
dddg td t| jd}|d |d |d |d W d    n	1 sw   Y  td |  dd| j | jd  W d    n	1 s%w   Y  | tt	
ddg d S )Nr   rD  r  r  r  r  r  r  r  zaa:somethingr   s   re:input/file4$
s   fm:*aa:*thing
r   r
  rI  rV   rn   r   rR  r  s
   re:file3+
s   re:file(\d)\1\1$
s   fm:nothingwillmatchthis
s   */file1
s
   re:file2$
)r   r   r  r   r   r   rC   r   rq  rr   r  r   r   r   r_   r_   rb   ,test_extract_include_exclude_regex_from_file  sF   








z=ArchiverTestCase.test_extract_include_exclude_regex_from_filec                 C   s  |  dd| j | jddd | jddd | jddd | jddd | jd	dd |  d
| jd d td |  d| jd d W d    n1 sNw   Y  | ttdg d t	d td |  dd| jd d W d    n1 sw   Y  | ttdddg t	d td |  dd| jd d W d    n1 sw   Y  | ttddg t	d td |  d| jd ddd W d    n1 sw   Y  | ttdg d d S )Nr   rD  r  r  r  r  r  r  r  r   rI  rV   rn   r   zre:.*rR  )r  r  r  r  r  z--exclude=re:file[34]$z
re:file\d$z--exclude=input/file1zre:file[12]$zfm:input/file1zfm:*file33*input/file2)r  r  r  )
r   r   r  rC   r   rq  rr   r  r   r   r   r_   r_   rb   test_extract_with_pattern*  s4   






z*ArchiverTestCase.test_extract_with_patternc                 C   st  |  dd| j | jddd |  d| jd d td	 |  d
| jd }W d    n1 s1w   Y  | d| td td	 |  d
d| jd }W d    n1 sZw   Y  | d| td td	 |  d
d| jd }W d    n1 sw   Y  | d| td td	 |  d
dd| jd }W d    n1 sw   Y  | d| d S )Nr   rD  r  r  r  r   rI  rV   rn   r   
input/filerR  --info--list)r   r   r  rC   assert_not_inr   r   r]  r   rn   r_   r_   rb   test_extract_list_outputK  s,   






z)ArchiverTestCase.test_extract_list_outputc                 C   s   |  dd| j | jddd |  d| jd d td	 |  d
| jd d}d|v s.J W d    d S 1 s9w   Y  d S )Nr   rD  r  r  r  r   rI  rV   rn   r   
--progresszExtracting:)r   r   r  rC   r  r_   r_   rb   test_extract_progressd  s   
"z&ArchiverTestCase.test_extract_progressc                 C   s   |  dd| j | jddd | jdt td d | jd	t d
d td t r7tdt dt  d S | jdt td d d S )Nr   rD  r  r  r  z	cache1/%s    extra stuffre  z	cache2/%ss   invalid signaturezinput/cache3zinput/cache1/%szinput/cache3/%sz	cache3/%s)	r   r   r  CACHE_TAG_NAMECACHE_TAG_CONTENTSrr   r   rH   r(  r   r_   r_   rb   _create_test_cachesm  s   




z$ArchiverTestCase._create_test_cachesc                 C   s   |  dd| j d}| j d| jd d|d t|  dd	| jd }|d
 dks+J |d dks3J |d t|ks=J |d dksEJ | j dd| jd dd}||ksWJ d S )Nr   rD  s    foo

bar
   
r   rI  -r  r|   rf  uidr   gidr   r   rt   r   --stdoutT)rW   r   r   rj  rk  r  )r   
input_dataitemextracted_datar_   r_   rb   test_create_stdin{  s   z"ArchiverTestCase.test_create_stdinc              
   C   s   |  dd| j d}d}|  dd|d| jd d	d
| t|  dd| jd }|d dks0J |d dks8J |d t|d ksDJ |d |ksLJ |  dd| jd }||d ks^J d S )Nr   rD  zsome test contentza/b/cr   z--stdin-name--content-from-commandrI  --echor|   rf  r   r   r!  r   r?   r   r   r"  rW  r#  )r   r$  r   r%  r&  r_   r_   rb    test_create_content_from_command  s   z1ArchiverTestCase.test_create_content_from_commandc              
   C   h   |  dd| j | j dd| jd dddd	d
d}|dsJ t|  dd| j}|d g ks2J d S )Nr   rD  r   r(  rI  r)  sh-cexit 73;r   r  #Command 'sh' exited with status 73
r|   --jsonarchivesr   r   endswithrj  rk  r   rn   rv  r_   r_   rb   4test_create_content_from_command_with_failed_command     
zEArchiverTestCase.test_create_content_from_command_with_failed_commandc                 C   :   |  dd| j | j dd| jd dd}|dsJ d S )	Nr   rD  r   r(  rI  r   r  No command given.
r   r   r4  r  r_   r_   rb   0test_create_content_from_command_missing_command     zAArchiverTestCase.test_create_content_from_command_missing_commandc                 C   s   |  dd| j | jddd | jddd | jddd | jddd d	}| j d
ddd| jd |d |  dd| jd }dd |dD }|g dksPJ d S )Nr   rD  r  r  r  z
dir1/file2z
dir1/file3r  s"   input/file1 input/dir1 input/file4r   r  z--paths-delimiterz\0rI  r  r|   rf  c                 S   rg  rh  ri  r   r_   r_   rb   rl    rm  zAArchiverTestCase.test_create_paths_from_stdin.<locals>.<listcomp>rW  )r  r  input/file4r   r   r  rp  r   r$  rv  rw  r_   r_   rb   test_create_paths_from_stdin  s   
z-ArchiverTestCase.test_create_paths_from_stdinc                 C   s   |  dd| j | jddd | jddd | jddd | jddd d	}|  d
d| jd dd| |  dd| jd }dd |dD }|g dksOJ d S )Nr   rD  r  r  r  r  r  r  z#input/file1
input/file2
input/file3r   --paths-from-commandrI  r)  r*  r|   rf  c                 S   rg  rh  ri  r   r_   r_   rb   rl    rm  zCArchiverTestCase.test_create_paths_from_command.<locals>.<listcomp>rW  )r  r  input/file3r>  r?  r_   r_   rb   test_create_paths_from_command  s   z/ArchiverTestCase.test_create_paths_from_commandc              
   C   r,  )Nr   rD  r   rA  rI  r)  r-  r.  r/  r   r  r0  r|   r1  r2  r3  r5  r_   r_   rb   2test_create_paths_from_command_with_failed_command  r7  zCArchiverTestCase.test_create_paths_from_command_with_failed_commandc                 C   r8  )	Nr   rD  r   rA  rI  r   r  r9  r:  r  r_   r_   rb   .test_create_paths_from_command_missing_command  r<  z?ArchiverTestCase.test_create_paths_from_command_missing_commandc                 C   s*   |  dd| j | j d| jd dd dS )ztest create without a rootr   rD  r   rI  r   r  Nr   r   r   r_   r_   rb   test_create_without_root  s   z)ArchiverTestCase.test_create_without_rootc                 C   s`   |  dd| j | jddd | jddd |  ddd	d
| jd }| d| | d| dS )z$test create with only a root patternr   rD  r  r  r  r  r   -vr  z--pattern=R inputrI  A input/file1A input/file2Nr   r   r  r]  r  r_   r_   rb   test_create_pattern_root  s   z)ArchiverTestCase.test_create_pattern_rootc              	   C   s~   |  dd| j | jddd | jddd | jddd |  dd	d
dd| jd d}| d| | d| | d| dS ) test file patterns during creater   rD  r  r  r  r  file_importantr   rH  r  --pattern=+input/file_important--pattern=-input/file*rI  rV   A input/file_importantx input/file1x input/file2NrK  r  r_   r_   rb   test_create_pattern  s   

z$ArchiverTestCase.test_create_patternc              	   C   s   |  dd| j | jddd | jddd | jddd | jddd |  d	d
ddd| j | jd d}| d| | d| | d| | d| dS )rM  r   rD  r  r  r  r  Z	otherfilerN  r   rH  r  z--pattern=-input/otherfile--patterns-from=rI  rV   rQ  rR  rS  zx input/otherfileN)r   r   r  r   r]  r  r_   r_   rb   test_create_pattern_file  s   


z)ArchiverTestCase.test_create_pattern_filec                 C   s   t j| jd| _t| jd}|d W d   n1 sw   Y  | dd| j | j	ddd	 | j	d
dd	 | j	ddd	 | dddd| j | jd d}| 
d| | 
d| | 
d| dS )z?test when patterns exclude a parent folder, but include a child	patterns2r   s   + input/x/b
- input/x*
Nr   rD  	x/a/foo_ar  r  	x/b/foo_by/foo_yr   rH  r  rU  rI  rV   zx input/x/a/foo_azA input/x/b/foo_bA input/y/foo_y)rr   r   r   r   patterns_file_path2r   r   r   r   r  r]  r   r   rn   r_   r_   rb   .test_create_pattern_exclude_folder_but_recurse     

z?ArchiverTestCase.test_create_pattern_exclude_folder_but_recursec                 C   s   t j| jd| _t| jd}|d W d   n1 sw   Y  | dd| j | j	ddd	 | j	d
dd	 | j	ddd	 | dddd| j | jd d}| 
d| | 
d| | d| dS )zCtest when patterns exclude a parent folder and, but include a childrW  r   s   + input/x/b
! input/x*
Nr   rD  rX  r  r  rY  rZ  r   rH  r  rU  rI  rV   zinput/x/a/foo_az	input/x/ar[  )rr   r   r   r   r\  r   r   r   r   r  r  r]  r]  r_   r_   rb   -test_create_pattern_exclude_folder_no_recurse  r_  z>ArchiverTestCase.test_create_pattern_exclude_folder_no_recursec                 C   s"  t j| jd| _t| jd}|d W d   n1 sw   Y  | dd| j | j	ddd	 | j	d
dd	 t
d | dd| j | jd d W d   n1 sWw   Y  | ddd| jd }| }| d| | d| |d|dk sJ |d|dk sJ dS )zetest that intermediate folders appear first when patterns exclude a parent folder but include a childrW  r   s#   + input/x/a
+ input/x/b
- input/x*
Nr   rD  rX  r  r  rY  rV   r   rU  rI  .r|   --formatz{type} {path}{NL}zd x/azd x/bz- x/a/foo_az- x/b/foo_b)rr   r   r   r   r\  r   r   r   r   r  rC   r   r]  index)r   r   r   Zout_listr_   r_   rb   .test_create_pattern_intermediate_folders_first  s$   

z?ArchiverTestCase.test_create_pattern_intermediate_folders_firstc              
   C   s   |    | dd| j | dd| j t| dd| jd dd	d
}t| d| jd d	}|d d }|d d }||ksCJ | dd| j | dd| jd d | d| j | d| j d S )Nr   rD  r  r  r   z--no-cache-syncrI  rV   r1  --errorrS  r   stats::test2r   )r=  r   r   rj  rk  )r   create_jsonZ	info_jsonZcreate_statsZ
info_statsr_   r_   rb   test_create_no_cache_sync0  s   z*ArchiverTestCase.test_create_no_cache_syncc                 C   s   |  dd| j | jddd | jddd | jddd |  d| jd	 d
 td |  ddd| jd	  W d    n1 sAw   Y  | ttddg d S )Nr   rD  r  r  r  r  rN  r   rI  rV   rn   r   rO  rP  rR  r   r   r  rC   r   rq  rr   r  r   r_   r_   rb   test_extract_pattern_opt?  s   
z)ArchiverTestCase.test_extract_pattern_optc                 C   sp   t d | d| jd  W d    n1 sw   Y  | ttdddg | ttdtg d S )Nrn   r   rI  rR  Zcache2r  zoutput/input/cache2rC   r   r   r   rq  rr   r  r  r   r_   r_   rb   _assert_test_cachesK  s
   
z$ArchiverTestCase._assert_test_cachesc                 C   s*   |    | dd| jd d |   d S )Nr   --exclude-cachesrI  rV   r  r   r   rm  r   r_   r_   rb   test_exclude_cachesQ  s   z$ArchiverTestCase.test_exclude_cachesc                 C   s<   |    | d| jd d | dd| jd  |   d S )Nr   rI  rV   recreatern  ro  r   r_   r_   rb   test_recreate_exclude_cachesV  s   z-ArchiverTestCase.test_recreate_exclude_cachesc                 C   sD   |  dd| j | jddd | d | d | jdd	d d S )
Nr   rD  r  r  r  ztagged1/.NOBACKUPztagged2/00-NOBACKUPztagged3/.NOBACKUP/file2r  )r   r   r  r   r_   r_   rb   _create_test_tagged\  s
   

z$ArchiverTestCase._create_test_taggedc                 C   sV   t d | d| jd  W d    n1 sw   Y  | ttddg d S )Nrn   r   rI  rR  r  )rC   r   r   r   rq  rr   r  r   r_   r_   rb   _assert_test_taggedc  s   
z$ArchiverTestCase._assert_test_taggedc              	   C   s0   |    | ddddd| jd d |   d S )Nr   --exclude-if-present	.NOBACKUP00-NOBACKUPrI  rV   rs  r   r   rt  r   r_   r_   rb   test_exclude_taggedh  s   z$ArchiverTestCase.test_exclude_taggedc              	   C   sB   |    | d| jd d | ddddd| jd  |   d S )Nr   rI  rV   rq  ru  rv  rw  rx  r   r_   r_   rb   test_recreate_exclude_taggedm  s   z-ArchiverTestCase.test_recreate_exclude_taggedc                 C   s   |  dd| j | jddd | d | jddd | jddd | jd	dd | jd
t td d | jddd | d | jddd | jdt td d | jddd d S )Nr   rD  file0r  r  ztagged1/.NOBACKUP1ztagged1/file1ztagged2/.NOBACKUP2/subfile1ztagged2/file2z
tagged3/%sr  re  ztagged3/file3ztaggedall/.NOBACKUP1ztaggedall/.NOBACKUP2/subfile1ztaggedall/%sztaggedall/file4)r   r   r  r  r  r   r_   r_   rb   _create_test_keep_taggedt  s    



z)ArchiverTestCase._create_test_keep_taggedc                 C   s   t d | d| jd  W d    n1 sw   Y  | ttdg d | tddg | tdd	g | td
tg | ttddd	tg d S )Nrn   r   rI  rR  )r{  Ztagged1Ztagged2Ztagged3Z	taggedallzoutput/input/tagged1
.NOBACKUP1zoutput/input/tagged2
.NOBACKUP2zoutput/input/tagged3zoutput/input/taggedallrl  r   r_   r_   rb   _assert_test_keep_tagged  s   
z)ArchiverTestCase._assert_test_keep_taggedc                 C   s4   |    | ddddddd| jd d	 |   d S )	Nr   ru  r}  r~  rn  --keep-exclude-tagsrI  rV   r|  r   r   r  r   r_   r_   rb   test_exclude_keep_tagged  s
   z)ArchiverTestCase.test_exclude_keep_taggedc                 C   sF   |    | d| jd d | ddddddd	| jd  |   d S )
Nr   rI  rV   rq  ru  r}  r~  rn  r  r  r   r_   r_   rb   !test_recreate_exclude_keep_tagged  s   z2ArchiverTestCase.test_recreate_exclude_keep_taggedc                 C   s   |  dd| j | jdtd ttj| jd t	tj| jdtj| jdt
 |  d| jd d |  d	d
d| jd  d S )Nr   r   r  re  Zsubdirr   rI  rV   rq  rn  r  )r   r   r  r  rr   r   r   r   r   r(  r  r   r_   r_   rb   test_recreate_hardlinked_tags  s   z.ArchiverTestCase.test_recreate_hardlinked_tagsz4Linux capabilities test, requires fakeroot >= 1.20.2c              	      s   t j  fdd}d}| d tdd| | dd| j | d	| jd
 d td3 t	t d| | d| jd
  W d    n1 sIw   Y  t
dd|ksXJ W d    d S 1 scw   Y  d S )Nc                    s"   t j| dddd  | || d S )N   security.capabilityrR   Ffollow_symlinks)r   r-  )r   r   r!  fchownr_   rb   patched_fchown     zBArchiverTestCase.test_extract_capabilities.<locals>.patched_fchowns                     r  
   input/filer  r   rD  r   rI  rV   rn   r  r   )rr   r  r  r   r-  r   r   rC   r   objectgetxattr)r   r  Zcapabilitiesr_   r  rb   test_extract_capabilities  s   

"z*ArchiverTestCase.test_extract_capabilitieszAxattr not supported on this system or on this version of fakerootc              	   C   s  dd }dd }dd }|  d tdd	d
 | d| jd | d| jd d td tjd}t	
td| | jd| jd td}d|v sNJ W d    n1 sXw   Y  t| t	
td| | jd| jd td}d|v s{J W d    n1 sw   Y  t| t	
td| | jd| jd td}d|v sJ W d    n1 sw   Y  tj|sJ W d    d S 1 sw   Y  d S )Nc                  _      t tjd)NE2BIG)r   r   r  ra   kwargsr_   r_   rb   patched_setxattr_E2BIG     zKArchiverTestCase.test_extract_xattrs_errors.<locals>.patched_setxattr_E2BIGc                  _   r  )Nr   )r   r   r   r  r_   r_   rb   patched_setxattr_ENOSPC  r  zLArchiverTestCase.test_extract_xattrs_errors.<locals>.patched_setxattr_ENOSPCc                  _   r  Nr  r   r   r  r  r_   r_   rb   patched_setxattr_EACCES  r  zLArchiverTestCase.test_extract_xattrs_errors.<locals>.patched_setxattr_EACCESr  r     user.attribute   valuer   -enoner   rI  rV   rn   r  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:)r  r   r-  r   r   rC   rr   r   abspathr   r  r*   r   isfile)r   r  r  r  Zinput_abspathr   r_   r_   rb   test_extract_xattrs_errors  s2   



"z+ArchiverTestCase.test_extract_xattrs_errorszonly for macOSc           
      C   s  |  d | d| jd tjd}d\}}t| || t	|j
}t	|j}| d| jd d td	+ | d
| jd  tjd}t	|j
}t	|j}t| |}	W d    n1 shw   Y  |	|kssJ t|d |d s~J t||sJ d S )Nr  r   r  r  )s   com.apple.ResourceForks   whatshouldbeherer   rI  rV   rn   r   r  )r  r   r   rr   r   r  r   r-  r   r0  r  r  rC   r  rF   )
r   r   Zxa_keyZxa_valueZbirthtime_expectedZmtime_expectedZextracted_pathZbirthtime_extractedZmtime_extractedZxa_value_extractedr_   r_   rb    test_extract_xattrs_resourcefork  s$   

z1ArchiverTestCase.test_extract_xattrs_resourceforkc                 C   s   |  dd| j | jddd td |  d| jd d	 W d    n1 s(w   Y  |  d
| jd }| d| | d| d S )Nr   rD  zdir1/dir2/filer  r  zinput/dir1/dir2r   rI  z#../../../input/dir1/../dir1/dir2/..r|   rQ   z input/dir1/dir2/file)r   r   r  rC   r  r]  r  r_   r_   rb   test_path_normalization  s   
z(ArchiverTestCase.test_path_normalizationc                 C   s  |  dd| j | jddd | jddd td |  dd	| jd
 d W d    n1 s0w   Y  td |  d| jd
  W d    n1 sMw   Y  | ttddg td |  dd| jd d W d    n1 sxw   Y  td |  d| jd  W d    n1 sw   Y  | ttddg |  dd| jd d td |  d| jd  W d    n1 sw   Y  | ttddg d S )Nr   rD  r  r  r  r  rV   r   z--exclude=file1::test1ra  rn   r   z--exclude=./file1rg  z--exclude=input/./file1::test3rR  rj  r   r_   r_   rb   test_exclude_normalization  s,   




z+ArchiverTestCase.test_exclude_normalizationc                 C   s8   | j ddd | dd| j | d| jd dd d S )	Nr  r  r  r   rD  r   rI  rV   r  r   r   r   r_   r_   rb   test_repeated_files  s   z$ArchiverTestCase.test_repeated_filesc                 C   s  | j ddd | j ddd | dd| j | d| jd d	 td
 td td td | d| jd  W d    n1 sGw   Y  | d	d
 td td td td | jd| jd dd W d    d S 1 s|w   Y  d S )Nr  r  r  r  r   rD  r   rI  rV   rR  r  r  rn   r   zoutput/input/file1/dirr?   r  )r  r   r   rr   r   rC   r^  unlinkr   r_   r_   rb   test_overwrite  s"   







"zArchiverTestCase.test_overwritec                 C   sN  | j ddd | j ddd | dd| j | d| jd d	 | d| jd
 d	 | dd| jd  | dd| jd
  | d| jd d | dd| jd
  | d| jd
 d | dd| jd  | dd| jd  t| j}t|tj\}}W d    n1 sw   Y  | t	|j
d | d|j
 | d|j
 d S )Nr  r  r  r  r   rD  r   rI  rV   rK  r   	--dry-runr  ztest.3ztest.4::test.3z::test.4r   )r  r   r   r>   r   r&   r  r  r   r  r2  r]  r   r   r  rP   r_   r_   rb   test_rename(  s$   zArchiverTestCase.test_renamec                 C   s   | j ddd | dd| j | d| jd d | d	| j}d
|v s&J | d	| jd }d|v s5J | d	dd| j}d|v sDJ d S )Nr  r  r  r   rD  r   rI  rV   rS  rV  Archive name: test
--firstr  r  )r   	info_repoinfo_archiver_   r_   rb   	test_info<  s   zArchiverTestCase.test_infoc                    s  | j ddd | dd| j | d| jd d t| d	d
| j}|d }t|d dks2J d|v s8J t|d tsBJ |d d dksLJ d|d vsTJ |d }|d  t	dd  
 D siJ t	 fdddD svJ t| d	d
| jd }|d |d ksJ |d |d ksJ |d }t|dksJ |d }|d dksJ t|d tsJ t|d tsJ t|d dksJ d|v sJ t|d  tsJ t|d! tsJ d S )"Nr  r  r  r   rD  r   rI  rV   rS  r1  r   r  @   last_modified
encryptionmoderepokeykeyfiler   rf  c                 s   s    | ]}t |tV  qd S r^   )rf   int)r   or_   r_   rb   r   T      z2ArchiverTestCase.test_info_json.<locals>.<genexpr>c                 3   s    | ]}| v V  qd S r^   r_   )r   rP   rf  r_   rb   r   U      )Ztotal_chunksZtotal_csizer  Ztotal_unique_chunksZunique_csizeZunique_sizer2  r?   r   r   rM  command_linedurationstartend)r  r   r   rj  rk  r  r   strptime
ISO_FORMATallvaluesrf   r|   float)r   r  r   r   r  r2  r  r_   r  rb   test_info_jsonG  s6   zArchiverTestCase.test_info_jsonc                 C   sd   |  dd| j t|  ddd| j}|d g ksJ t|  ddd| j}|d g ks0J dS )	z2See https://github.com/borgbackup/borg/issues/6120r   rD  rS  r1  	--first=1r2  --last=1N)r   r   rj  rk  )r   r  r_   r_   rb   test_info_json_of_empty_archivee  s
   z0ArchiverTestCase.test_info_json_of_empty_archivec                 C   sp  | j ddd | dd| j | d| jd d | dd	d
| jd d | dd	d| jd d | dd	d| jd d d| d| jd v sJJ d| d| jd v sWJ | d| jd d	d | d| jd d	d | d| jd d	d | d| jd d d| d| jd v sJ d| d| jd v sJ d| d| jd v sJ d| d| jd v sJ d S )Nr  r  r  r   rD  r   r  rV   	--commentzthis is the commentrg  z"deleted" commentr  zpreserved comment::test4z
Comment: 
rS  zComment: this is the commentrq  zadded commentzmodified commentrY   Z12345zComment: added commentzComment: modified commentzComment: preserved commentr  r   r_   r_   rb   test_commentm  s    zArchiverTestCase.test_commentc                 C   sb  | j ddd | j ddd | dd| j | d| jd d	 | d| jd
 d	 | d| jd d	 | d| jd d	 | d| jd d	 | dd| jd  | dd| jd
  | ddd| j | ddd| j | d| jd  | dd| jd
  | dd| jd
 }| d| t| j}| t|d W d    d S 1 sw   Y  d S )Nr  r  r  r  r   rD  r   rI  rV   rK  r  z::another_test.1z::another_test.2r   r  r  z--glob-archivesz	another_*--lastr  rJ  zDeleted data:r?   )r  r   r   r]  r>   r   r   r  )r   rn   r   r_   r_   rb   test_delete  s&   "zArchiverTestCase.test_deletec                 C   s   | j ddd | dd| j | d| jd d | d| jd	 d | d| jd
 d | d| jd d | dd| jd
  | d| jd | d| jrRJ d S )Nr  r  r  r   rD  r   r  rV   rg  r  r  test2r   r  Ztest3r|   r  r   r_   r_   rb   test_delete_multiple  s   z%ArchiverTestCase.test_delete_multiplec                 C   s   | j ddd | j ddd | dd| j | d| jd d	 | d| jd
 d	 dtjd< | jd| jdd tj| jsAJ dtjd< | d| j | tj| j d S )Nr  r  r  r  r   rD  r   rI  rV   rK  nor   r  r   r  r   )	r  r   r   rr   r   r   r   r   ZassertFalser   r_   r_   rb   test_delete_repo  s   

z!ArchiverTestCase.test_delete_repoc                 C   s   |  dd| j | d t| jdd8}t|tj\}}t|||d}|	 D ]}|j
dr<||jd j  nq)J |jdd	 W d    n1 sOw   Y  |  d
d| jd }| d| |  dd| j |  d| j}| d| d S )Nr   r   rM  Tr  testsuite/archiver.pyFcompactr  --forcerI  zdeleted archive was corruptedr   r   r|   )r   r   r  r>   r   r&   r  r  r   
iter_itemsr   r4  r  chunksr  commitr]  r  )r   r   r  rP   r  r%  rn   r_   r_   rb   test_delete_force  s$   

z"ArchiverTestCase.test_delete_forcec                 C   s   |  dd| j | d t| jdd*}t|tj\}}t|||d}|j	j
d }||d |jdd	 W d    n1 sAw   Y  |  d
dd| jd  |  dd| j |  d| j}| d| d S )Nr   r   rM  Tr  r   s%   corrupted items metadata stream chunkFr  r  r  rI  r   r   r|   )r   r   r  r>   r   r&   r  r  r   metadataitemsputr  r  )r   r   r  rP   r  r  rn   r_   r_   rb   test_delete_double_force  s   
z)ArchiverTestCase.test_delete_double_forcec              	   C   s   |  dd| j | d |  dd| jd  |  dd| j}| d	| | d
| tttj	| j
dddddd }ttj	| j
ddd|d}|d |d W d    n1 saw   Y  | j dd| jdd}| d
| d S )Nr   rD  rM  r   r  rI  r   rE  rG  Starting repository checkr   r   r  T)reverser?   r+br   s   XXXXr  r  )r   r   r  r]  r  rq  rr   r  r   r   r   r   r  r   )r   rn   r   r   r_   r_   rb   test_corrupted_repository  s   
&
z*ArchiverTestCase.test_corrupted_repositoryc              	   C   s   |  dd| j | d | | jO | jr"| j dd| jtd n/tt	t
jf}|  dd| j W d    n1 s=w   Y  t|jt
jrQ|jjdksQJ |  dd| jd W d    d S 1 sew   Y  d S )	Nr   rD  rM  r   --verify-datar  r:   --bypass-lockr   r   r  	read_onlyr   r   r+   ry  rz  r:   r<   RPCErrorrf   valueexception_classr   excinfor_   r_   rb   test_readonly_check  s   
"z$ArchiverTestCase.test_readonly_checkc              	   C   s   |  dd| j | d | d | | jU | jr)| j dd| j dtd n1tt	t
jf}|  dd| j d W d    n1 sFw   Y  t|jt
jrZ|jjdksZJ |  dd| j dd	 W d    d S 1 spw   Y  d S )
Nr   rD  rb  rc  diffz%s::ar  r:   r  r  r  r_   r_   rb   test_readonly_diff  s   

"z#ArchiverTestCase.test_readonly_diffc              	   C   s   |  dd| j | d | | jU | jr$| j dd| j dtd n1tt	t
jf}|  dd| j d W d    n1 sAw   Y  t|jt
jrU|jjdksUJ |  dd| j dd	 W d    d S 1 skw   Y  d S )
Nr   rD  rM  
export-tar%s::testztest.tarr  r:   r  r  r  r_   r_   rb   test_readonly_export_tar  s   
"z)ArchiverTestCase.test_readonly_export_tarc              	   C   s   |  dd| j | d | | jR | jr#| j dd| j td n0tt	t
jf}|  dd| j  W d    n1 s?w   Y  t|jt
jrS|jjdksSJ |  dd| j d W d    d S 1 shw   Y  d S )	Nr   rD  rM  r   r  r  r:   r  r  r  r_   r_   rb   test_readonly_extract  s   
"z&ArchiverTestCase.test_readonly_extractc              	   C      |  dd| j | d | | jL | jr!| j d| jtd n.tt	t
jf}|  d| j W d    n1 s;w   Y  t|jt
jrO|jjdksOJ |  d| jd W d    d S 1 sbw   Y  d S )Nr   rD  rM  rS  r  r:   r  r  r  r_   r_   rb   test_readonly_info     
"z#ArchiverTestCase.test_readonly_infoc              	   C   r  )Nr   rD  rM  r|   r  r:   r  r  r  r_   r_   rb   test_readonly_list*  r  z#ArchiverTestCase.test_readonly_listc              
   C   sB  |  dd| j | d | | j | jr0| j| jtd W d    n1 s*w   Y  n?t	t
tjf }| j| jdd W d    n1 sLw   Y  W d    n1 s[w   Y  t|jtjro|jjdksoJ | | jd d W d    n1 sw   Y  W d    d S W d    d S 1 sw   Y  d S )	Nr   rD  rM  r  FrF  r:   r  )r   r   r  r  r   r   r  r+   ry  rz  r:   r<   r  rf   r  r  r  r_   r_   rb   test_readonly_mount9  s,   
"z$ArchiverTestCase.test_readonly_mountBORG_TESTS_IGNORE_MODESzmodes unreliablec                 C   sV   | j ddd | dd| j | d| jd d t| jj}| t|d	 d S )
Nr  r  r  r   rD  r   rI  rV   i  )	r  r   r   rr   r0  r   st_modeassertEqualS_IMODE)r   r  r_   r_   rb   
test_umaskM  s
   zArchiverTestCase.test_umaskc                 C   sx   |  dd| j |  dd| jd d t| j}t|tj\}}W d    n1 s,w   Y  | t|j	d d S )Nr   rD  r   r  rI  rV   r   )
r   r   r>   r   r&   r  r  r   r  r2  r  r_   r_   rb   test_create_dry_runU  s   z$ArchiverTestCase.test_create_dry_runc                 C   st   t | jdd)}t|tj\}}|j ddgii|jd< |  |j	dd W d    d S 1 s3w   Y  d S )NTr  s	   mandatorys   unknown-features   feature_flagsFr  )
r>   r   r&   r  r  r  r   r  r   r  )r   Z	operationr   r  rP   r_   r_   rb   add_unknown_feature]  s   "z$ArchiverTestCase.add_unknown_featurec                 C   sf   | j r| j|dti d S tt}| j|  W d    n1 s"w   Y  |jjdgfks1J d S )Nrz   unknown-feature)r   r   r+   ry  rz  r'   r  ra   )r   ra   r  r_   r_   rb   cmd_raises_unknown_featured  s   z+ArchiverTestCase.cmd_raises_unknown_featurec                 C   s<   t | dd| j | tjj | d| jd dg d S )Nr   rD  r   rI  rV   )r   r   r   r  r&   	OperationZWRITEr  r   r_   r_   rb   test_unknown_feature_on_createl  s   z/ArchiverTestCase.test_unknown_feature_on_createc                 C   sH   |  dd| j |  dd| j | tjj | d| jd dg d S )Nr   rD  r  r  r   rI  rV   )r   r   r  r&   r  READr  r   r_   r_   rb   "test_unknown_feature_on_cache_syncq  s   z3ArchiverTestCase.test_unknown_feature_on_cache_syncc                 C   s8   t | dd| j | tjj | dd| jg d S )Nr   rD  rP   change-passphraser   r   r   r  r&   r  ZCHECKr  r   r_   r_   rb   )test_unknown_feature_on_change_passphrasew  s   z:ArchiverTestCase.test_unknown_feature_on_change_passphrasec                 C   s   t | dd| j | d| jd d | tjj td | d| jd g W d    n1 s4w   Y  | d| jg | d	| jd g d S )
Nr   rD  r   rI  rV   rn   r   r|   rS  )	r   r   r   r  r&   r  r  rC   r  r   r_   r_   rb   test_unknown_feature_on_read|  s   
z-ArchiverTestCase.test_unknown_feature_on_readc                 C   sP   t | dd| j | d| jd d | tjj | d| jd dg d S )Nr   rD  r   rI  rV   r  otherr  r   r_   r_   rb   test_unknown_feature_on_rename  s   z/ArchiverTestCase.test_unknown_feature_on_renamec                 C   sn   t | dd| j | d| jd d | tjj | d| jd g | dd| jg | d| j d S )	Nr   rD  r   rI  rV   r  prunez--keep-daily=3)r   r   r   r  r&   r  ZDELETEr  r   r_   r_   rb   test_unknown_feature_on_delete  s   z/ArchiverTestCase.test_unknown_feature_on_deletec                 C   sf   |  dd| j |  d| jd d | tjj tj| j	d}t
| | d| jd |g d S )Nr   rD  r   rI  rV   r  r   )r   r   r  r&   r  r  rr   r   r   r   r   r  r   r  r_   r_   rb   test_unknown_feature_on_mount  s   
z.ArchiverTestCase.test_unknown_feature_on_mountc              	      s  t | j}t| dd| j t| jdd<}|rt| j|_t	
|t	j\}}t|||}|  dh|j_|  W d    n1 sFw   Y  W d    n1 sUw   Y  | jrh| d| jd d n1d	 tj fd
d}ttd| | d| jd d W d    n1 sw   Y   sJ t| jddA}|rt| j|_t	
|t	j\}}t|||}|jjt ksJ W d    n1 sw   Y  W d    d S W d    d S 1 sw   Y  d S )Nr   rD  Tr  r   r   rI  rV   Fc                     s   d |   d S )NTr_   r`   calledZwipe_cache_safer_   rb   wipe_wrapper  s   zNArchiverTestCase.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_configZmandatory_featuresr  r   r   r  r   r  r  )r   Zremote_repor   r  rP   r   r  r_   r  rb   'test_unknown_mandatory_feature_in_cache  s@   


	"z8ArchiverTestCase.test_unknown_mandatory_feature_in_cachec                 C   sD   | j ddd | dd| j | dd| jd d	}| d
| d S )Nr  r  r  r   rD  r   r  r  rV   )r  r   r   r]  r  r_   r_   rb   test_progress_on  s   z!ArchiverTestCase.test_progress_onc                 C   sB   | j ddd | dd| j | d| jd d}| d	| d S )
Nr  r  r  r   rD  r   ::test5rV   r  )r  r   r   r  r  r_   r_   rb   test_progress_off  s   z"ArchiverTestCase.test_progress_offc                 C   s   | j ddd td | j ddd | dd| j | dd	| jd
 d}| d| | d| | dd	| jd d}| d| | d| dS )ztest that various file status show expected results

        clearly incomplete: only tests for the weird "unchanged" status for nowr  r  r  r?   r  r   rD  r   r  rI  rV   rI  rJ  r  U input/file1Nr  r9  r:  r   r   r]  r  r_   r_   rb   test_file_status  s   
z!ArchiverTestCase.test_file_statusc                 C   s   | j ddd td | j ddd | dd	| j | d
dd| jd d}td}| j ddd tjd|j|j	fd | d
dd| jd d}| 
d| dS )zbtest that a changed file with faked "previous" mtime still gets backed up in ctime,size cache_moder  s   123re  r?   r  r"  r  r   rD  r   r  z--files-cache=ctime,sizer  rV   r  s   321)nsrg  zM input/file1N)r  r9  r:  r   r   rr   r0  r  r  r  r]  r   rn   r  r_   r_   rb   test_file_status_cs_cache_mode  s   

z/ArchiverTestCase.test_file_status_cs_cache_modec                 C   s   | j ddd td | j ddd | dd| j | dd	d
| jd d}td}td|jtj	A  | dd	d
| jd d}| 
d| dS )zetest that a chmod'ed file with no content changes does not get chunked again in mtime,size cache_moder  r"  r  r?   r  r   rD  r   r  z--files-cache=mtime,sizer  rV   r  rg  r  N)r  r9  r:  r   r   rr   r0  r   r  S_IRWXOr]  r  r_   r_   rb   test_file_status_ms_cache_mode  s   

z/ArchiverTestCase.test_file_status_ms_cache_modec                 C   sv   | j ddd td | j ddd | dd| j | dd	d
| jd d}| dd	d
| jd d}| d| dS )zItest that files get rechunked unconditionally in rechunk,ctime cache moder  r"  r  r?   r  r   rD  r   r  z--files-cache=rechunk,ctimer  rV   rg  rI  Nr  r  r_   r_   rb   test_file_status_rc_cache_mode   s   
z/ArchiverTestCase.test_file_status_rc_cache_modec              	   C   s   | j ddd td | j ddd tr)| j ddd ttj| j	dt
j | dd| j | d	d
d| jd d}| d| | d| trQ| d| | d	d
d| jd ddd}| d| | d| tru| d| dS dS )z#test that excluded paths are listedr  r  r  r?   r  r  r   rD  r   r  rH  rI  rV   rI  rJ  x input/file3r  	--excludez*/file2r  rS  N)r  r9  r:  r@   r   r/  rr   r   r   r   r0  r1  r   r   r]  r  r_   r_   rb   test_file_status_excluded  s$   
z*ArchiverTestCase.test_file_status_excludedc                 C   s   | j ddd | dd| j t| dd| jd d	}d
|v s#J d|v s)J d|v s/J d|d v s7J |d }|d dksCJ t|d tsLJ t|d tsUJ t|d dks_J d|v seJ d S )Nr  r  r  r   rD  r   r1  rI  rV   r  r   r   r  r  r   rM  r  r  r  r  rf  )	r  r   r   rj  rk  rf   r|   r  r  )r   Zcreate_infor  r_   r_   rb   test_create_json!  s   z!ArchiverTestCase.test_create_jsonc                 C   s   | j ddd td | j ddd | dd| j | d| jd	 d
}| d| | d| jd d
}| d| | ddd| jd d
}| d| | ddd| jd d
}| d| | j ddd | ddd| jd d
}| d| d S )Nr  r  r  r?   r  r   rD  r   rI  rV   ::test0r  z
--filter=Ur  z--filter=AMrg  i  r  )r  r9  r:  r   r   r  r]  r  r_   r_   rb   test_create_topical2  s   
z$ArchiverTestCase.test_create_topicalzFIFOs not supportedc           
   	   C   s&  ddl m} dd }| dd| j | jd }dd	 }tj| jd
}tj| jd}t| t	|| ||||fd}|
  z| dd|d W |  n|  w td) | d| d}t|d}| }	W d    n1 sww   Y  W d    n1 sw   Y  |	|ksJ d S )Nr   )Threadc              	   S   s8   t | t j}zt || W t | d S t | w r^   )rr   r   O_WRONLYr   r  )fifo_fnr   r   r_   r_   rb   fifo_feederM  s   zFArchiverTestCase.test_create_read_special_symlink.<locals>.fifo_feederr   rD  rI  r  i  ZfifoZ	link_fifo)targetra   r   --read-specialzinput/link_fiforn   r   r  )	threadingr*  r   r   rr   r   r   r   r.  r)  r  rC   r   r  )
r   r*  r-  r  r   r,  Zlink_fntr   r&  r_   r_   rb    test_create_read_special_symlinkI  s.   



z1ArchiverTestCase.test_create_read_special_symlinkc                 C   s^   t dt j| jd | dd| j | jd }| dd|d | d	|}d
|v s-J d S )Nzsomewhere does not existr(  r   rD  rI  r   r/  rV   r|   z&input/link -> somewhere does not exist)rr   r)  r   r   r   r   r   r   r  rn   r_   r_   rb   'test_create_read_special_broken_symlinkj  s   
z8ArchiverTestCase.test_create_read_special_broken_symlinkc                 C   s  |  dd| j |  d| jd t |  d| jd t |  d| jd t |  d| jd t |  d| jd t |  d	d
d| jd}td|sLJ td|sTJ td|s\J |  dd| j}| d| | d| | d| | d| | d| |  d	| jd |  dd| j}| d| | d| | d| | d| | d| |  d| jd t |  d	| jd |  dd| j}| d| | d| d S )Nr   rD  r   r  rg  z::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.checkpointr|   --consider-checkpointstest1r  ztest3.checkpointtest3.checkpoint.1ztest4.checkpointr  z--keep-daily=2Z
checkpointZtest5r   r   r   researchr]  r  r  r_   r_   rb   test_prune_repositoryy  s8   z&ArchiverTestCase.test_prune_repositoryc              
   C   s0   t ||||||dtj }|tjjdS )Nr   z%Y-%m-%dT%H:%M:%S)r   dateutiltzZgettz
astimezoneUTCstrftime)r   yearmonthdayhourminuteseconddtimer_   r_   rb   _to_utc_timestamp  s   z"ArchiverTestCase._to_utc_timestampr   c           	      C   s4   | j d | }| dd| |||||||t d S )Nr   r   --timestamp)r   r   rL  r   )	r   r   ymdHMSlocr_   r_   rb   _create_archive_ts  s   &z#ArchiverTestCase._create_archive_tsc              	   C   s  |  dd| j | dddd | dddd | d	dd
d | dddd | dddd | dddd | dddd | dddd | dddd | dddd | dddd | dddd | dddd  | d!ddd" | d#ddd$ | d%ddd& | d'ddd( | d)ddd* | d+ddd, | d-ddd | d.ddd | d/ddd0 | d1dd2d | d3ddd4 |  d5d6d7| jd8d9d:}td;|sJ td<|sJ td=|sJ td>|sJ tdd
D ]}td?t| d@ dAd|   |sJ qtddBD ]}tdCt| d@ dAd|   |s-J q|  dD| j}tdd$D ]}| dE| | q;|  d5| jd8d9d: |  dD| j}tddD ]}| dE| | q]tdd$D ]}| dE| | qnd S )FNr   rD  Ztest01i  r?   Ztest02   r$  Ztest03      Ztest04   Ztest05	   Ztest06r"  Ztest07   Ztest08      Ztest09   Ztest10r   Ztest11   Ztest12   Ztest13   Ztest14   Ztest15   Ztest16   Ztest17   Ztest18   Ztest19   Ztest20Ztest21Ztest22r   Ztest23rU  Ztest24   r  r  r  z--keep-daily=14z--keep-monthly=6z--keep-yearly=1zWould prune:\s+test22zWould prune:\s+test23zWould prune:\s+test24z7Keeping archive \(rule: yearly\[oldest\] #1\):\s+test01z!Keeping archive \(rule: monthly #z
\):\s+testz%02d   zKeeping archive \(rule: daily #r|   ztest%02d)	r   r   rU  r=  r>  r   rg   r]  r  )r   rn   r   r_   r_   rb   test_prune_repository_example  sX   ,.z.ArchiverTestCase.test_prune_repository_examplec                 C   s  |  dd| j | dddddd tdd	D ]}| d
| dd|d |  d| jdd qtddD ]}| d| dd|d |  d| jdd q3|  ddd| jdd}td|s]J | ddddd |  d| jdd |  ddd| jdd}td|sJ | d| d S )Nr   rD  original_archivei  rZ  r?   r[  ri  rX  zseptember%02dr\  r  z--keep-daily=7z--keep-monthly=1rW  zoctober%02dr"  r  r  zBKeeping archive \(rule: monthly\[oldest\] #1\):\s+original_archiveZ	october07z3Keeping archive \(rule: monthly #1\):\s+september30)r   r   rU  r   r=  r>  r  )r   r   rn   r_   r_   rb   #test_prune_retain_and_expire_oldest  s   z4ArchiverTestCase.test_prune_retain_and_expire_oldestc                 C   s   |  dd| j |  d| jd t |  d| jd t |  ddd| jd	}td
|s.J td|s6J |  d| j}| d| | d| |  dd| jd	 |  d| j}| d| | d| d S )Nr   rD  r   r  rg  r  r  r  r6  r8  r7  r|   r:  r  z--save-spacer<  r  r_   r_   rb    test_prune_repository_save_space  s   z1ArchiverTestCase.test_prune_repository_save_spacec                 C   (  |  dd| j |  d| jd t |  d| jd t |  d| jd t |  d| jd t |  dd	d
| jdd}td|sCJ td|sKJ |  d| j}| d| | d| | d| | d| |  d| jdd |  d| j}| d| | d| | d| | d| d S )Nr   rD  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  r6  z--prefix=foo-z:Keeping archive \(rule: daily #1\):\s+foo-2015-08-12-20:00z#Would prune:\s+foo-2015-08-12-10:00r|   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_   r_   rb   test_prune_repository_prefix	  &   z-ArchiverTestCase.test_prune_repository_prefixc                 C   rn  )Nr   rD  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  r6  z--glob-archives=2015-*-fooz:Keeping archive \(rule: daily #1\):\s+2015-08-12-20:00-fooz#Would prune:\s+2015-08-12-10:00-foor|   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_   r_   rb   test_prune_repository_glob"	  rp  z+ArchiverTestCase.test_prune_repository_globc                 C   s   |  dd| j |  d| jd t |  d| jd t |  d| jd t |  dd| j}| d	| | d
| | d| d S )Nr   rD  r   ::test-1z::something-else-than-test-1::test-2r|   z--glob-archives=test-*ztest-1ztest-2zsomething-else)r   r   r   r]  r  r  r_   r_   rb   test_list_glob7	  s   zArchiverTestCase.test_list_globc                 C   sp   |  dd| j | jd }|  d|t |  d|}|  ddd|}|  ddd|}| || | || d S )	Nr   rD  rI  r   r|   rb  zB{mode} {user:6} {group:6} {size:8d} {mtime} {path}{extra}{NEWLINE}z{mtime:%s} {path}{NL})r   r   r   r  ZassertNotEqual)r   test_archiveoutput_1output_2output_3r_   r_   rb   test_list_formatA	  s   
z!ArchiverTestCase.test_list_formatc                 C   s   |  dd| j |  ddd| jd t |  ddd| jd t |  d	| j}|  d	d
d| j}| || |  d	d| j}| |d |  d	d
d| j}| |d |  d	d
d| j}| d| | d| d S )Nr   rD  r   r  z	comment 1rr  z	comment 2rs  r|   rb  z{archive:<36} {time} [{id}]{NL}rL  ztest-1
test-2
z{barchive}/ztest-1/test-2/z{name} {comment}{NL}ztest-1 comment 1
ztest-2 comment 2
)r   r   r   r  r]  )r   rv  rw  rx  r_   r_   rb   test_list_repository_formatK	  s   z,ArchiverTestCase.test_list_repository_formatc                 C   st   | j ddd | j ddd d | dd	| j | jd
 }| d|d | ddd|}d|v s2J d|v s8J d S )N
empty_filer   r  Zamb   ai@B re  r   rD  rI  r   rV   r|   rb  z{sha256} {path}{NL}zJcdc76e5c9914fb9281a1c7e284d73e67f1809a48a497200e046d39ccc7112cd0 input/ambzQe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 input/empty_filer  )r   ru  rn   r_   r_   rb   test_list_hashZ	  s   
zArchiverTestCase.test_list_hashc                 C   s   |  dd| j |  d| jd t |  d| jd t |  d| jd t |  d| j}d|v s3J d	|vs9J d
|vs?J |  dd| j}d|v sMJ d	|v sSJ d
|v sYJ d S )Nr   rD  r   r  z::test2.checkpointr5  r|   r:  ztest2.checkpointr;  r9  r   r  r_   r_   rb   test_list_consider_checkpointsd	  s   z/ArchiverTestCase.test_list_consider_checkpointsc                 C   s   | j ddd |  d ttj| jdd}|dd  |dd  W d    n1 s0w   Y  | d	d
| j | jd }| d|d | ddd|}d|v sWJ d|v s]J d S )Nr{  r   r  Z
two_chunksr   s   abbai s   baabr   rD  rI  r   rV   r|   rb  z'{num_chunks} {unique_chunks} {path}{NL}z0 0 input/empty_filez2 2 input/two_chunks)	r  r   rr   r   r   r   r   r   r   )r   r   ru  rn   r_   r_   rb   test_list_chunk_countss	  s   

z'ArchiverTestCase.test_list_chunk_countsc                 C   s   | j ddd | dd| j | jd }| ddd	|d
 | ddd|}|dd d\}}}}}t|t|k s>J t|t|k sHJ t|t|ksRJ t|t|ks\J d S )NZcompressible_file'  r  r   rD  rI  r   -Clz4rV   r|   rb  z*{size} {csize} {dsize} {dcsize} {path}{NL}rW  r?    )r  r   r   rp  r  )r   ru  rn   r   csizeZdsizeZdcsizer   r_   r_   rb   test_list_size	  s   
zArchiverTestCase.test_list_sizec                 C   s  | j ddd | dd| j | d| jd d t| d	d
| j}|d }t|d dks2J t|d ts<J |d d dksFJ d|d vsNJ |d d }t|d ts^J | d	d| jd }dd |	 D }t|dksyJ |d }|d dksJ |d dksJ t|d tsJ | d	dd| jd }d d |	 D }t|dksJ |d }|d dksJ |d! d"ksJ d S )#Nr  r  r  r   rD  r   rI  rV   r|   r1  r   r  r  r  r  r  r  r  r2  r   r9  rf  c                 S      g | ]}t |qS r_   ri  r   sr_   r_   rb   rl  	      z3ArchiverTestCase.test_list_json.<locals>.<listcomp>r   r?   r   r  r   r  z--format={sha256}c                 S   r  r_   ri  r  r_   r_   rb   rl  	  r  r   Z@b2915eb69f260d8d3c25249195f2c8f4f716ea82ec760ae929732c0262442b2b)
r  r   r   rj  rk  r  r   r  r  r   )r   Z	list_repor   Zarchive0Zlist_archiver  r  r_   r_   rb   test_list_json	  s0   zArchiverTestCase.test_list_jsonc                 C   s@   |  dd| j | j dd| jdd | j dd| jd dd d S )	Nr   rD  r|   rf  r   r  r1  	::archiverF  r   r_   r_   rb   test_list_json_args	  s   z$ArchiverTestCase.test_list_json_argsc                 C   s   |    | dd| j | dd| jd ddd}i }| D ]}t|}|||d	 < q|d
 }d|v s7J |d ds@J |d }t|d tsMJ |d dksUJ t|d t	s^J d S )Nr   rD  r   z
--log-jsonrI  rV   r  --debugtypefile_statusstatusr   log_messager9  	levelnameDEBUGmessage)
r=  r   r   r   rj  rk  rX  rf   r  rg   )r   logmessagesr   msgr  r  r_   r_   rb   test_log_json	  s   
zArchiverTestCase.test_log_jsonc                 C   s   |    | dd| j | d| jd dd | ddd	d
 td
}|  |d | d| jd dd td
}|  |d d S )Nr   rD  r   rI  rV   z--debug-profile=create.profdebugzconvert-profilezcreate.profzcreate.pyprofZcumtimerg  z--debug-profile=create.pyprof)r=  r   r   pstatsZStatsZ
strip_dirsZ
sort_stats)r   rf  r_   r_   rb   test_debug_profile	  s   


z#ArchiverTestCase.test_debug_profilec                 C   s>   |    | dd| j | dd| jd d}d|v sJ d S )Nr   rD  r  r   rI  rV   z security: read previous location)r=  r   r   )r   r  r_   r_   rb   test_common_options	  s   z$ArchiverTestCase.test_common_optionsr  c           	      C   s   |rd| }nt |}| jd|d | dd| j | jd }| dd||d	 | d
dd|}|dd d\}}}t|t|fS )Nr  r  re  r   r   rI  r   r  rV   r|   rb  z{size} {csize} {path}{NL}rW  r?   r  )rr   r   r  r   r   rp  r  )	r   compressioncompressibler   r  r  rn   r  r   r_   r_   rb   
_get_sizes	  s   


zArchiverTestCase._get_sizesc                 C   &   | j ddd\}}||d ksJ d S )NnoneTr     r  r   r   r  r_   r_   rb   "test_compression_none_compressible	     z3ArchiverTestCase.test_compression_none_compressiblec                 C   r  )Nr  Fr  r  r  r  r_   r_   rb   $test_compression_none_uncompressible	  r  z5ArchiverTestCase.test_compression_none_uncompressiblec                 C   &   | j ddd\}}||d k sJ d S )NzlibTr  皙?r  r  r_   r_   rb   "test_compression_zlib_compressible	  r  z3ArchiverTestCase.test_compression_zlib_compressiblec                 C   s"   | j ddd\}}||ksJ d S )Nr  Fr  r  r  r_   r_   rb   $test_compression_zlib_uncompressible	  r  z5ArchiverTestCase.test_compression_zlib_uncompressiblec                 C   r  )Nr  Tr  r  r  r  r_   r_   rb   !test_compression_lz4_compressible	  r  z2ArchiverTestCase.test_compression_lz4_compressiblec                 C   r  )Nr  Fr  r  r  r  r_   r_   rb   #test_compression_lz4_uncompressible	  r  z4ArchiverTestCase.test_compression_lz4_uncompressiblec                 C   r  )NlzmaTr  r  r  r  r_   r_   rb   "test_compression_lzma_compressible	  r  z3ArchiverTestCase.test_compression_lzma_compressiblec                 C   r  )Nr  Fr  r  r  r  r_   r_   rb   $test_compression_lzma_uncompressible	  r  z5ArchiverTestCase.test_compression_lzma_uncompressiblec                 C   r  )NzstdTr  r  r  r  r_   r_   rb   "test_compression_zstd_compressible 
  r  z3ArchiverTestCase.test_compression_zstd_compressiblec                 C   r  )Nr  Fr  r  r  r  r_   r_   rb   $test_compression_zstd_uncompressible
  r  z5ArchiverTestCase.test_compression_zstd_uncompressiblec                 C   s   | j ddd\}}| d| j | j ddd\}}| d| j | j ddd\}}||  kr4|ks7J  J ||d k s?J t||}||ksJJ d S )N	auto,zlibTr  r  r  r  r  )r  r   r   min)r   Z	auto_sizeZ
auto_csizeZ	zlib_sizeZ
zlib_csizeZlz4_sizeZ	lz4_csizeZsmallest_csizer_   r_   rb   "test_compression_auto_compressible
  s   
z3ArchiverTestCase.test_compression_auto_compressiblec                 C   s2   | j ddd\}}||ksJ ||d ksJ d S )Nr  Fr  r  r  r  r_   r_   rb   $test_compression_auto_uncompressible
  s   z5ArchiverTestCase.test_compression_auto_uncompressiblec                 C   sF   |  dd| j dtjd< |  dd| j dtjd< |  d| j d S )	Nr   rD  ZnewpassphraseZBORG_NEW_PASSPHRASErP   r  r   r|   )r   r   rr   r   r   r_   r_   rb   test_change_passphrase
  s
   

z'ArchiverTestCase.test_change_passphrasec                 C   s"   |  dd| j |  d| j d S )Nr   rD  
break-lockrF  r   r_   r_   rb   test_break_lock&
  s   z ArchiverTestCase.test_break_lockc                 C   s   |    |  d d S )N-hr   r   r_   r_   rb   
test_usage*
  s   zArchiverTestCase.test_usagec                 C   sj   d|  dv s	J d|  ddv sJ d|  ddv sJ d|  dddvs(J d|  ddd	vs3J d S )
NZBorgr   r   Z
Initializer   zpositional argumentsz--epilog-onlyzThis command initializesz--usage-onlyr  r   r_   r_   rb   	test_help.
  s
   zArchiverTestCase.test_helpc                 C   s  dd }|  dd| j |   |d}|  ddd| jd	 d
 |  ddd| jd d
 tr8ttjd
d tj| jd}| 	| j|( | j
| jtj|dd
ddd | j
| jtj|dd
ddd W d    n1 srw   Y  | 	| jd	 |  | j
| jtj|d
ddd d}tj|d
d}t|}t|}|j|jksJ |j|jksJ |j|jksJ |j|jksJ |rt|jd |jd sJ t|jd |jd sJ t|jd |jd sJ t r|j|j  krdksJ  J t|d)}t|d}	| |	 ksJ W d    n	1 s&w   Y  W d    n	1 s6w   Y  t rnd}tj|d
d}t|}
t|}|
j|j  krbdkseJ  J |j|jksnJ t rd}tj|d
d}tj|dd}tj|dd}|jtdksJ |jtdksJ t|jsJ t|jsJ t|t|ksJ t rtj|d
d}t|}t|jsJ zvd}t tj|d
d}t!j"st!#| jrt$t%t!&|d d!gks J t!'|d!d"ksJ t!'|d d#ksJ n5t%t!&|g ks#J zt!'|d! W n t(yG } z|j)t*j+ks=J W Y d }~n	d }~ww J d$W n# t(yp } zt,j-.d%re|j)t)j/kren W Y d }~nd }~ww W d    d S W d    d S 1 sw   Y  d S )&Nc                 S   sZ   t | j}zt t | t W n
 ty   Y dS w t | j}ttk}|o,t||S r  )	rr   r0  r  r  r   r/   r7  r0   rF   )r  r  r  r  r_   r_   rb   r  7
  s   z/ArchiverTestCase.test_fuse.<locals>.has_noatimer   rD  r  r   rH  r  r  rV   
::archive2r  r  r  T)ignore_flagsignore_xattrsarchive2r  r  r   r  rQ  r  rP  r  Fr  r  r   zinput/fusexattrr  r  r  r  rR   z2expected OSError(ENOATTR), but no error was raised)Znothing_here_now)0r   r   r=  r@   rr   r   r   r   r   r  r^  r   r0  r  st_uidst_gidr  rF   st_atimest_ctimest_mtimerH   r   r   r  st_inorG   r  S_ISLNKr  rI   S_ISFIFOr,  r   r*  r+  rq  rE   	listxattrr  r   r   rA   ZENOATTRrd   r   rX  ENOTSUP)r   r  r  r  Zin_fnZout_fnZsti1Zsto1Zin_fZout_fZsti2Zsto2r  r  r   r   r_   r_   rb   	test_fuse5
  s   

$ 

$
 B$zArchiverTestCase.test_fusec                    sD  |  dd| j | jddd t r%| jddd tdd	 tdd
 |  d| jd d | jddd |  d| jd d tj| jd}| 	| j|ddr tj|dd t
 }tdd |D sjJ ddh fdd|D ksyJ t rtj|ddd}tj|ddd}tj|ddd}t|jt|j  krt|jksJ  J t|d dksJ W d    n1 sw   Y  | 	| j|ddddA t rtj|ddd}tj|ddd}t|jt|jksJ t|d dksJ W d    d S W d    d S 1 sw   Y  d S )Nr   rD  rM  s   firstre  Z	hardlink1rd  zinput/hardlink1zinput/hardlink2zinput/hardlink3r   
::archive1rV   s   secondr  r  r  Zversionsc                 s   s    | ]}| d V  qdS )ztest.NrX  r   r   r_   r_   rb   r   
  r  z;ArchiverTestCase.test_fuse_versions_view.<locals>.<genexpr>c                    s$   h | ]}t tj |d  qS )r  )r   rr   r   r   r  r  rh  r_   rb   	<setcomp>
  s   $ z;ArchiverTestCase.test_fuse_versions_view.<locals>.<setcomp>zhardlink1.00001Z	hardlink2zhardlink2.00001Z	hardlink3zhardlink3.00001r  -e)r   r   r  rH   rr   r(  r   r   r   r  r  r  r0  r  r   r  )r   r  filesZhl1Zhl2Zhl3r_   rh  rb   test_fuse_versions_view
  sB   
4$z(ArchiverTestCase.test_fuse_versions_viewc              	   C   s  |  dd| j | d | d\}}|+ | D ]}|jdr1||jd j	 |j} nqJ |j
dd W d    n1 sDw   Y  | j dd	| jd
d tj| jd}| | jd |/ tt}ttj|| W d    n1 s~w   Y  |jjtjksJ W d    n1 sw   Y  | | jd |dd ttj||  W d    d S 1 sw   Y  d S )Nr   rD  r  r  r  Fr  r   r   r   r  r  r  r  Zallow_damaged_files)r   r   r  r  r  r   r4  r  r  r  r  rr   r   r   r  ry  rz  r   r   r  r   ZEIOr  )r   r  r   r%  r   r  r  r_   r_   rb   test_fuse_allow_damaged_files
  s0   
	"z.ArchiverTestCase.test_fuse_allow_damaged_filesc                 C   s>  |  dd| j | d | d | d | d tj| jd}| | j|dd	 tt	tj|ddgks?J W d    n1 sIw   Y  | | j|d
d	 tt	tj|ddgksiJ W d    n1 ssw   Y  | | j|d tt	tj|ddgksJ W d    n1 sw   Y  | | j|d tt	tj|ddgksJ W d    n1 sw   Y  | | j|d tt	tj|g dksJ W d    n1 sw   Y  | | j|d tt	tj|g ksJ W d    d S 1 sw   Y  d S )Nr   rD  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  rr   r   r   r   r  rq  r  r  r_   r_   rb   test_fuse_mount_options
  s0   



$$$$$"$z(ArchiverTestCase.test_fuse_mount_optionsc           	         s  ddl m ddlddltj| jd  fdd}|tj	j
jtj	j
_z| dd| j | d	 tj| jd
}| j| j|dd W d   n1 sSw   Y  t d}|}W d   n1 smw   Y  td|dtjdd |d }|dur|d }tddg||j|dR ddtjdd |d dksJ d|du sJ d|d }|d sJ d|d sJ d|d  }|d sJ d!|d sJ d"W tj	j
jjtj	j
_dS tj	j
jjtj	j
_w )#zOBoth old_id and new_id must not be stale during lock migration / daemonization.r   )wrapsNzmigrate_lock_assert_data.picklec                    s&     fddd_ S )Nc                    s   j d7  _ j ||tj| tj| dd d d d dd}zt d}|| W d    n1 s5w   Y  W n   Y zz;| ||W W |d tj| tj| d zt d}|| W d    W S 1 sqw   Y  W S    Y S  ty } z||d< |j|d< W Y d }~nd }~ww W |d tj| tj| d z t d}|| W d    W d S 1 sw   Y  W d S    Y d S |d tj| tj| d zt d}|| W d    W w 1 sw   Y  W w    Y w )Nr?   )old_id_alivenew_id_alive)	num_callsold_idnew_idbefore	exceptionexception.extr_tbafterr   r  r  r  )	r  r   Zprocess_aliver   dumpupdateBaseException
extract_tb__traceback__)r   r  r  assert_dataZ_outr   )assert_data_filemigrate_lockpickle	tracebackwrapperr_   rb   r  
  st   "&"zTArchiverTestCase.test_migrate_lock_alive.<locals>.write_assert_data.<locals>.wrapperr   )r  )r  r  r  r  r  )r  r  rb   write_assert_data
  s   !zCArchiverTestCase.test_migrate_lock_alive.<locals>.write_assert_datar   r   archr  T)Zos_forkr  z$
Lock.migrate_lock(): assert_data = ra  )r  r}   r  r  z)Lock.migrate_lock() raised an exception:
z#Traceback (most recent call last):
rY   )sepr  r  r}   r  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  rr   r   r   r   r   lockingLockr  r   r   r  r  r   r  r   rd   rX   format_listformat_exception	__class____wrapped__)	r   r  r  Z_inr  r  Zextracted_tbZassert_data_beforeZassert_data_afterr_   r  rb   test_migrate_lock_alive
  sN   '

*z(ArchiverTestCase.test_migrate_lock_alivec                    s   t   t   fdd}  dtjd< dd| j |  djd d	 |  djd
 d	 |  djd
  |  d S )Nc                     s   t jP} | |   D ]=\}}| |}t| }| vrL | t	t
|d }t|dd }t||| D ]}| | q>qW d    d S 1 sXw   Y  d S )N)   !   )r>   r   Z
open_indexZget_transaction_id	iteritemsr   r   digestaddr   r  r   r   r  )r   r  _r   hashZ
num_blocksnoncecounterseenr   usedr_   rb   verify_uniquenessE  s   

"zIArchiverTestCase.verify_aes_counter_uniqueness.<locals>.verify_uniquenessr  r   r   z--encryption=r   rI  rV   rK  r  )r  r=  rr   r   r   r   )r   methodr
  r_   r  rb   verify_aes_counter_uniquenessA  s   

z.ArchiverTestCase.verify_aes_counter_uniquenessc                 C      |  d d S )Nr  r  r   r_   r_   rb   #test_aes_counter_uniqueness_keyfile]  r
  z4ArchiverTestCase.test_aes_counter_uniqueness_keyfilec                 C   r  )Nr  r  r   r_   r_   rb   &test_aes_counter_uniqueness_passphrase`  r
  z7ArchiverTestCase.test_aes_counter_uniqueness_passphrasec                 C   s   |    | dd| j | d| jd d td | dd| jd }W d    n1 s/w   Y  ttd}t|d	krH|d	 d
sJJ d|v sPJ d S )Nr   rD  r   rI  rV   rn   r  zdump-archive-itemsr   Z000000_Done.	r=  r   r   rC   rq  rr   r  r  rX  r   rn   
output_dirr_   r_   rb   test_debug_dump_archive_itemsc  s   
z.ArchiverTestCase.test_debug_dump_archive_itemsc                 C   s   |    | dd| j | d| jd d td | dd| j}W d    n1 s-w   Y  ttd}t|d	krF|d	 d
sHJ d|v sNJ d S )Nr   rD  r   rI  rV   rn   r  zdump-repo-objsr   Z	00000000_r  r  r  r_   r_   rb   test_debug_dump_repo_objsm  s   
z*ArchiverTestCase.test_debug_dump_repo_objsc                 C   s  |  dd| j d}| jd|d |  dd| jd}| }|  dd	| j|d}||v s.J |  dd
| j|d}||v s>J tdd}| }W d    n1 sRw   Y  ||ks]J |  dd| j|}d|v slJ |  dd| j|}d|v s{J |  dd| jd}d|v sJ d S )Nr   rD  s	   some datar  re  r  zid-hashr  zput-objzget-objzoutput/filer  z
delete-objZdeletedz	not foundinvalidz
is invalid)r   r   r  stripr   r  )r   r   rn   id_hashr   Z	data_readr_   r_   rb   test_debug_put_get_delete_objw  s&   
z.ArchiverTestCase.test_debug_put_get_delete_objc                 C   s`   dd }t td| | jdd| jdd W d    n1 s w   Y  tj| jr.J d S )Nc                  W   s   t r^   )EOFErrorr`   r_   r_   rb   	raise_eof  s   z7ArchiverTestCase.test_init_interrupt.<locals>.raise_eofr   r   rD  r?   r  )r   r  r   r   r   rr   r   r   )r   r  r_   r_   rb   test_init_interrupt  s
   z$ArchiverTestCase.test_init_interruptc                 C   s   | j d| jdd d S )Nr   r   r  rF  r   r_   r_   rb   $test_init_requires_encryption_option  s   z5ArchiverTestCase.test_init_requires_encryption_optionc                 C   sx   |  dd| j | jr| j dd| jd dd d S ttj |  dd| jd  W d    d S 1 s5w   Y  d S )Nr   rD  z/nestedr   r  )r   r   r   ry  rz  r>   ZAlreadyExistsr   r_   r_   rb   test_init_nested_repositories  s   "z.ArchiverTestCase.test_init_nested_repositoriesc              	   C   s"  t j| jd}t|dz | dd| jd  t|}| }W d   n1 s+w   Y  dd| jd f}| j	rD| j|dd	i nt
tjjj | j|  W d   n1 s\w   Y  t|}| }W d   n1 stw   Y  ||ksJ W d   dS 1 sw   Y  dS )
zBORG_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  rz   r   )rr   r   r   r   rD   r   r   r   r  r   ry  rz  r   r   errorsError)r   r  r  r  argr  r_   r_   rb   %test_init_refuse_to_overwrite_keyfile  s"   



"z6ArchiverTestCase.test_init_refuse_to_overwrite_keyfilec              	   C   sH  |  d| j |  J}t|tj\}}t|||dd}|j}W d    n1 s+w   Y  t| t|||}|j}W d    n1 sIw   Y  W d    n1 sXw   Y  ||uscJ t	 }|
 D ]%\}\}	}
}|| \}}}|	|ks~J |
|ksJ ||ksJ || qj|
 D ]\}\}	}
}||v sJ qd S )Nr   Fsync)r   r   r	  r&   r  r  r   r  Zdestroyr  r   r  )r   r   r  rP   r   Zoriginal_chunksZcorrect_chunksr  r  Zrefcountr   r  Z
o_refcountZo_sizeZo_csizer_   r_   rb   check_cache  s.   

zArchiverTestCase.check_cachec              	   C   s   |  dd| j |  d| jd d |  @}t|tj\}}t|||dd}|  |j	t
|j d d  |  W d    n1 sJw   Y  W d    n1 sYw   Y  tt |   W d    d S 1 ssw   Y  d S )	Nr   rD  r   rI  rV   Fr%  r   )r   r   r	  r&   r  r  r   r  r  Zincrefr|   r   r  ry  rz  AssertionErrorr'  )r   r   r  rP   r   r_   r_   rb   test_check_cache  s   


"z!ArchiverTestCase.test_check_cachec                 C   s4   |  dd| j | j d| jddd}d|v sJ d S )Nr   rD  rq  z--target=asdfr   r  zNeed to specify single archiverF  r  r_   r_   rb   test_recreate_target_rc  s   z(ArchiverTestCase.test_recreate_target_rcc                 C   s   |    | dd| j |   | jd }| d|d |   | d| j}| d|dd	d
d |   | d| j}||v sBJ d|v sHJ | jd }| dd|}d|vsZJ d|v s`J d|vsfJ d S )Nr   rD  r(  r   rV   r|   rq  r&  r  input/dir2/file3z--target=new-archiveznew-archivez::new-archiverL  r  r  
dir2/file3)r=  r   r   r'  )r   r  rk  r2  listingr_   r_   rb   test_recreate_target  s"   

z%ArchiverTestCase.test_recreate_targetc                 C   s   |    | jddd | dd| j | jd }| d|d | d	|d
dd |   | dd|}d|vs9J d|v s?J d|vsEJ d S )Nr,  r  r  r   rD  r(  r   rV   rq  r&  r  r+  r|   rL  r  r  )r=  r  r   r   r'  )r   r  r-  r_   r_   rb   test_recreate_basic  s   
z$ArchiverTestCase.test_recreate_basicc                 C   s  |    | d| jd d | d| jd d |   td9 | d| jd  td	jd
ks4J tdjd
ks>J tdjd
ksHJ tdjd
ksRJ W d    n1 s\w   Y  td | d| jd  td	jdksyJ W d    d S 1 sw   Y  d S )Nr   rg  rV   rq  rI  r  rn   r   r  r   r  r  r  rT  )r  r   r   r'  rC   rr   r0  r   r   r_   r_   rb   test_recreate_subtree_hardlinks  s   

"z0ArchiverTestCase.test_recreate_subtree_hardlinksc                 C   s  t tj| jdd}|d |d W d    n1 s w   Y  | dd| j | ddd	| jd
 d | d| jd dd | d| jd
 ddd}tt	|
d\}}||ks`J | d| jdd |   t	| d| jd
 dds|J t	| d| jd
 dddrJ d S )NZ
large_filer   s  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaas  bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbr   rD  r   --chunker-params	7,9,8,128r  rV   rg  z--files-cache=disabledr|   zinput/large_filerb  z{num_chunks} {unique_chunks}r  rq  defaultz--format={size}z{unique_chunks})r   rr   r   r   r   r   r   r   mapr  rp  r'  )r   r   r|   
num_chunksZunique_chunksr_   r_   rb   test_recreate_rechunkify
  s$   
z)ArchiverTestCase.test_recreate_rechunkifyc                 C   s   t tj| jdd}|dd  W d    n1 sw   Y  | dd| j | ddd	| jd
 d | d| jd
 ddd}t|}|dksLJ | d| jdd | d| jd
 ddd}t|}|dkskJ d S )Nr  r   r|      r   rD  r   r1  r2  rI  rV   r|   r  rb  {num_chunks}r   rq  z
fixed,4096	r   rr   r   r   r   r   r   r   r  )r   r   rn   r5  r_   r_   rb   test_recreate_fixed_rechunkify  s    z/ArchiverTestCase.test_recreate_fixed_rechunkifyc                 C   s   t tj| jdd}|dd  W d    n1 sw   Y  | dd| j | ddd	| jd
 d | d| jd
 ddd}t|}| dddd| jd
 }d|vsXJ | d| jd
 ddd}t|}||ksnJ d S )Nr  r   r|  r7  r   rD  r   r1  r2  rI  rV   r|   r  rb  r8  rq  r  r%  Zfilename_never_matchesZ
Rechunkingr9  )r   r   rn   r5  Znum_chunks_after_recreater_   r_   rb   test_recreate_no_rechunkify,  s    z,ArchiverTestCase.test_recreate_no_rechunkifyc                 C   s   | j ddd | dd| j | d| jd dd	d
 | d| jd ddd}|d\}}}t|t|ks9J | d| jd	dd |   | d| jd ddd}|d\}}}t|t|k seJ ||kskJ d S )Nr  r  r  r   rD  r   rI  rV   r  r  r|   input/compressiblerb  z{size} {csize} {sha256}r  rq  r  z--recompress)r  r   r   rp  r  r'  )r   Z	file_listr   r  Zsha256_beforeZsha256_afterr_   r_   rb   test_recreate_recompress=  s    z)ArchiverTestCase.test_recreate_recompressc                    s   t ttd j}|   | dd| j | jd }| d|d | ddd	d
d| | d|	 }t ddd|
d  }|d t fdd|D sSJ t fdd|D s`J d S )Nr   r   rD  r(  r   rV   rq  rM  z1970-01-02T00:00:00r  rM  rS  i  r?   r   z%Y-%m-%dc                       g | ]
}t d   |qS )zTime \(start\).+ %sr=  r>  r   r%  Zs_timer_   rb   rl  X      z<ArchiverTestCase.test_recreate_timestamp.<locals>.<listcomp>c                    r>  )zTime \(end\).+ %sr?  r@  rA  r_   rb   rl  Y  rB  )r   nowr   r   rB  tzinfor=  r   r   r   	utcoffsetrD  any)r   Zlocal_timezoner  rS  rK  r_   rA  rb   test_recreate_timestampM  s   

z(ArchiverTestCase.test_recreate_timestampc                 C   s   | j ddd | dd| j | d| jd d | d	| jd }| d
| jddd |   | d	| jd }||ks?J d S )Nr  r  r  r   rD  r   rI  rV   r|   rq  z-nr  r<  r  r   r   r'  )r   Zarchives_beforeZarchives_afterr_   r_   rb   test_recreate_dry_run[  s   z&ArchiverTestCase.test_recreate_dry_runc                 C   s   | j ddd | dd| j | d| jd d | d	| jd }| d
| jdd |   | d	| jd }||ks>J d S )Nr  r  r  r   rD  r   rI  rV   rS  rq  r1  r3  rH  )r   Zinfo_beforeZ
info_afterr_   r_   rb   !test_recreate_skips_nothing_to_doe  s   z2ArchiverTestCase.test_recreate_skips_nothing_to_doc                 C   sP   |  dd| j tj| jd}ddd| f}| j d| jg|R dd	d
 d S )Nr   rD  r   Zpython3r.  z<import os, sys; sys.exit(42 if os.path.exists("%s") else 23)z	with-lockT*   rT   rz   )r   r   rr   r   r   r   )r   Z	lock_pathr   r_   r_   rb   test_with_locko  s   "zArchiverTestCase.test_with_lockc                 C   sN  |  dd| j | jddd | jddd | jddd | jddd | jd	dd |  d
| jd d |  ddd| jd dd}|   | d| | d| |  dd| jd dd}|   | d| | d| |  d| jd dd}|   | d| | d| |  dd| jd dd}|   | d| | d| d S )Nr   rD  r  r   r  r  r  r  Zfile5r   rI  rV   rq  r  r  r  r  r  rS  rB  r$  r=  zx input/file4zinput/file5zx input/file5)r   r   r  r'  r]  r  r  r_   r_   rb   test_recreate_list_outputu  s.   z*ArchiverTestCase.test_recreate_list_outputc              
   C   sD   |  dd| j |  d| jd d | j dddd	d| jd
dd d S )Nr   rD  r   rI  rV   r  r  r  r  Tr   rL  rF  r   r_   r_   rb   test_bad_filters  s    z!ArchiverTestCase.test_bad_filtersc                 C   s6  | j d }| d| jdd | | j}| dd| j| t|}| }W d    n1 s0w   Y  |dt| d sBJ | j	d	 t
| j	d
  }t|}| }W d    n1 sbw   Y  ||ksmJ t
| | dd| j| t|}| }W d    n1 sw   Y  ||ksJ d S )N	/exportedr   --encryptionr  rP   export	BORG_KEY rW  /r   import)r   r   r   rB  r   r   r  rX  r,   r   rr   r  r  )r   export_filerepo_idr   export_contentskey_filekey_contentsZkey_contents2r_   r_   rb   test_key_export_keyfile  s&   







z(ArchiverTestCase.test_key_export_keyfilec                 C   s*  |  d| jdd tj| jd}|  dd| j| tj| jt| jd }t|}|	 }W d    n1 s;w   Y  t
| tj| jd}t|d	 |  dd
| j| W d    n1 sfw   Y  tj|ruJ dt|}|	 }W d    n1 sw   Y  ||ksJ d S )Nr   rQ  r  exportedrP   rR  r   importedr   rU  z."borg key import" should respect BORG_KEY_FILE)r   r   rr   r   r   r   r   r  r   r  r  rD   r  )r   Zexported_key_filerY  r   rZ  Zimported_key_fileZimported_key_contentsr_   r_   rb   *test_key_import_keyfile_with_borg_key_file  s"   




z;ArchiverTestCase.test_key_import_keyfile_with_borg_key_filec           	      C   s  | j d }| d| jdd | | j}| dd| j| t|}| }W d    n1 s0w   Y  |dt| d sBJ t	| j}t
|}|d t  W d    n1 s^w   Y  ttj }||t  |j|jkszJ t	| j}|d	 W d    n1 sw   Y  | dd
| j| t	| j}t
|}|d t  W d    n1 sw   Y  |j|jksJ d S )NrP  r   rQ  r  rP   rR  rS  rW  rR   rU  )r   r   r   rB  r   r   r  rX  r,   r>   r   r  r   Zenv_passphraser   rP   ZTestKeyZMockRepositoryZenc_keyZsave_key)	r   rV  rW  r   rX  r   Zrepo_keyZ
backup_keyZ	repo_key2r_   r_   rb   test_key_export_repokey  s0   


z(ArchiverTestCase.test_key_export_repokeyc                 C   s   | j d }| d| jdd | | j}| ddd| j| t|dd	}| }W d    n1 s3w   Y  t||v s@J |d
sGJ |	dsNJ d S )Nz/exported.htmlr   rQ  r  rP   rR  z	--qr-htmlrZ   r[   z<!doctype html>z</html>
)
r   r   r   rB  r   r   r  r,   rX  r4  )r   rV  rW  r   rX  r_   r_   rb   test_key_export_qr  s   

z#ArchiverTestCase.test_key_export_qrc                 C   s@   | j d }t| | d| jdd | jdd| j|td d S )NrP  r   rQ  r  rP   rR  r  )r   rr   r   r   r   r+   )r   Zexport_directoryr_   r_   rb   test_key_export_directory  s   

z*ArchiverTestCase.test_key_export_directoryc                 C   sV  | j d }| d| jdd | jdd| j|td t|d}|d	 W d    n1 s.w   Y  | jrB| jdd| j|d
d ntt	 | dd| j| W d    n1 s[w   Y  t|d}|d W d    n1 suw   Y  | jr| jdd| j|d
d d S tt
 | dd| j| W d    d S 1 sw   Y  d S )NrP  r   rQ  r  rP   rU  r  r  zsomething not a key
r   zBORG_KEY a0a0a0
)r   r   r   r+   r   r   r   ry  rz  r"   r!   )r   rV  r   r_   r_   rb   test_key_import_errors  s&   
"z'ArchiverTestCase.test_key_import_errorsc                 C   s   d}| j d }| d| jdd | | jt| | jd t| jd  }t	|d}|
tjd	 | d
  |
td  W d    n1 sKw   Y  | ddd| j| t	|}| }W d    n1 smw   Y  |dksxJ d S )N@e294423506da4e1ea76e8dcdf1a3919624ae3ae496fddf905610c351d3f09239rP  r   rQ  r  rT  r   r  r  rW     abcdefghijklmnopqrsturP   rR  --paperzTo 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   r   r   rr   r  r   r   r   FILE_IDr   rv   r  )r   rW  rV  rY  r   rX  r_   r_   rb   test_key_export_paperkey  s   


z)ArchiverTestCase.test_key_export_paperkeyc                 C   s   d}|  d| jdd | | jt| | jd t| jd  }t|d}|	t
jd | d	  |	td
  W d    n1 sFw   Y  d}| j ddd| j|d d}| j ddd| j|d d}| j ddd| j|d d S )Nrc  r   rQ  r  rT  r   r  r  rW  rd  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
rP   rU  re  r  s   
y
s1   2 / e29442 3506da 4e1ea7 / 25f62a 5a3d41 - 02

y
)r   r   r  r   r   r   rr   r  r   r   r   rf  r   rv   )r   rW  rY  r   Ztyped_inputr_   r_   rb   test_key_import_paperkey-  s   z)ArchiverTestCase.test_key_import_paperkeyc                 C   s   | j ddd | dd| j | d| jd d | jd	 }| d
d| j|}|dks-J t|}t|}W d    n1 sAw   Y  d|v sLJ d|v sRJ d|v sXJ d|v s^J d|v sdJ d S )Nr  r  r  r   rD  r   rI  rV   /dumpr  zdump-manifestrY   r2  r  Z	item_keys	timestampversionr  r   r   r   r   rj  r  r   Z	dump_filern   r   r[  r_   r_   rb   test_debug_dump_manifestZ  s   

z)ArchiverTestCase.test_debug_dump_manifestc                 C   s   | j ddd | dd| j | d| jd d | jd	 }| d
d| jd |}|dks/J t|}t|}W d    n1 sCw   Y  d|v sNJ d|v sTJ d|v sZJ d|v s`J d S )Nr  r  r  r   rD  r   rI  rV   ri  r  zdump-archiverY   _nameZ_manifest_entry_metaZ_itemsrl  rm  r_   r_   rb   test_debug_dump_archivei  s   

z(ArchiverTestCase.test_debug_dump_archivec                 C   s   |  dd| j |  dd| jd }|dksJ t|  dd| jd	 d
}|d d }|  dd| j| }|d| d ksBJ |  dd| jdd }|dksTJ d S )Nr   rD  r  zrefcount-objZ@0000000000000000000000000000000000000000000000000000000000000000zkobject 0000000000000000000000000000000000000000000000000000000000000000 not found [info from chunks cache].r   r1  rI  rV   r  r  zobject z* has 1 referrers [info from chunks cache].Z124Zxyzaz4object id 124 is invalid.
object id xyza is invalid.)r   r   r  rj  rk  )r   rn   rh  
archive_idr_   r_   rb   test_debug_refcount_objw  s   z(ArchiverTestCase.test_debug_refcount_objc                 C   s(   |  dd}d|v sJ d|v sJ d S )Nr  rS  zCRC implementationPythonr  r  r_   r_   rb   test_debug_info  s   z ArchiverTestCase.test_debug_infoc                 C   sT   |  dd| j tdd |  dd| j| j W d    d S 1 s#w   Y  d S )Nr   rD  r   )Z_BORG_BENCHMARK_CRUD_TEST	benchmarkZcrud)r   r   rD   r   r   r_   r_   rb   test_benchmark_crud  s   "z$ArchiverTestCase.test_benchmark_crudc                 C   s  |    td | dd| j | dd| j}| d| | d| | d| | d	| | d
| | d| | d| | d| | jd| jddd}| d| | d| jdd | d| jd}|dkspJ | dd| j}| d| | dd| jd dD ]>\}}| d| j|}|dksJ | d| j|| | d| j|}||d ksJ | dd| j| | jd| j|dd q| jddd| jdd | jd| jdd | jd| jddd d S )NrO  r   rD  r  r  z[repository]rk  Zsegments_per_dirZstorage_quotaappend_onlyadditional_free_spacer  Zlast_segment_checkedr?   r  z
No option Z123z123
z--delete))ry  Z2G)zrepository.append_onlyr  z0
rW  r   zinvalid-option)r=  rr   r  r   r   r]  r  )r   rn   Zcfg_keyZ	cfg_valuer_   r_   rb   test_config  s>   
zArchiverTestCase.test_configz(GNU tar must be installed for this test.gzipz%gzip must be installed for this test.c                 C   s   |    td | dd| j | d| jd d | d| jd dd	 td
 tg d W d    n1 s<w   Y  | jdddddd d S )NrO  r   rD  r   rI  rV   r  
simple.tarr  rn   r   xpfz../simple.tar--warning=no-timestamprR  Tr  r  	ignore_ns)	r=  rr   r  r   r   rC   rj   
check_callr^  r   r_   r_   rb   test_export_tar  s   

z ArchiverTestCase.test_export_tarc                 C   s   t ds
td |   td | dd| j | d| jd d | d	| jd d
d}d|v s6J d|v s<J t	d t
g d W d    n1 sRw   Y  | jdddddd d S )Nr{  gzip is not installedrO  r   rD  r   rI  rV   r  zsimple.tar.gzr  input/file1
input/dir2
rn   )r   r~  z../simple.tar.gzr  rR  Tr  r   r   ry  r  r=  rr   r  r   r   rC   rj   r  r^  r   r|   r_   r_   rb   test_export_tar_gz  s   



z#ArchiverTestCase.test_export_tar_gzc                 C   s   t ds
td |   td | dd| j | d| jd d | d	| jd d
dd}d|v s7J d|v s=J t	d t
g d W d    n1 sSw   Y  | jdddddd d S )Nr{  r  rO  r   rD  r   rI  rV   r  r|  z--strip-components=1r  r  r  rn   r}  zoutput/Tr  r  r  r_   r_   rb    test_export_tar_strip_components  s   



z1ArchiverTestCase.test_export_tar_strip_componentsc                 C      |    | d| jd dd td8 tg d tdjdks%J td	jdks/J td
jdks9J tdjdksCJ W d    d S 1 sNw   Y  d S )Nr  rI  
output.tarr  rn   r   r~  z../output.tarr  r  r   r  r  r  	r  r   r   rC   rj   r  rr   r0  r   r   r_   r_   rb   &test_export_tar_strip_components_links     
"z7ArchiverTestCase.test_export_tar_strip_components_linksc                 C   r  )Nr  rI  r  r  rn   r  r  r   r  r  r  r  r   r_   r_   rb   test_extract_hardlinks_tar  r  z+ArchiverTestCase.test_extract_hardlinks_tarc                 C   s   |    td | dd| j | d| jd d | d| jd d | d	| jd
 d t| j | d| jd
  W d    n1 sHw   Y  | jddddd d S )NrO  r   r   r   ::srcrV   r  r|  
import-tar::dstr   rR  Tr  r  )r=  rr   r  r   r   rC   r   r^  r   r_   r_   rb   test_import_tar  s   
z ArchiverTestCase.test_import_tarc                 C   s   t ds
td |   td | dd| j | d| jd d | d	| jd d
 | d| jd d
 t	| j
 | d| jd  W d    n1 sRw   Y  | jddddd d S )Nr{  r  rO  r   r   r   r  rV   r  z
simple.tgzr  r  r   rR  Tr  )r   r   ry  r  r=  rr   r  r   r   rC   r   r^  r   r_   r_   rb   test_import_tar_gz  s   


z#ArchiverTestCase.test_import_tar_gzc              
   C   s  | j dd td tdm tg d tg d tddJ}td	d
}||  W d    n1 s;w   Y  td	 tdd
}||  W d    n1 s\w   Y  td W d    n1 spw   Y  W d    n1 sw   Y  | 	dd| j
 | 	dd| j
d d td t| j | 	d| j
d  W d    n1 sw   Y  | jddddd d S )NF)r;  rO  rV   r   cf	file1.tarr  r   r  the_rest.tarr%  zfile1*ra  concatenated.tarr   r  r  r  r   r   r  z--ignore-zerosr  input/concatenated.tarr   rn   Tr  )r=  rr   r  rC   rj   r  r   r   r  r   r   r   r^  r   Zconcatenatedr  Zthe_restr_   r_   rb   .test_import_concatenated_tar_with_ignore_zeros  s0   



z?ArchiverTestCase.test_import_concatenated_tar_with_ignore_zerosc              
   C   sh  |    td tdc tg d tg d tdd@}tdd}||  W d    n1 s9w   Y  td	d}||  W d    n1 sUw   Y  W d    n1 sdw   Y  W d    n1 ssw   Y  | 	d
d| j
 | 	d| j
d d t| j | 	d| j
d  W d    n1 sw   Y  | tddg d S )NrO  rV   r  r  r  r   r  r  r  r   r   r  r  r  r   rn   r  )r=  rr   r  rC   rj   r  r   r   r  r   r   r   r   r  r  r_   r_   rb   1test_import_concatenated_tar_without_ignore_zeros4  s,   


zBArchiverTestCase.test_import_concatenated_tar_without_ignore_zerosc                 C   s   t | j}d|d | jgd|d gd|gd|d dgd|gd|gd	|gd
|d gdd|dgdd|dgdd|gd|gg}|D ]}| j|ddd}d|v sNJ q=d S )Nr   rI  r   r   r  Znewnamer|   r  r  rS  rP   rR  r\  rU  r  r  Tr   rL  zAttic repository detected.)rO   r   r   r   )r   r   Zcmdsra   rn   r_   r_   rb   test_detect_attic_repoM  s$   




z'ArchiverTestCase.test_detect_attic_repoc              	   C   s   dd }|  d tddd | d| jd | d	| jd
 d td3 ttd| | jd| jd
 td W d   n1 sDw   Y  W d   dS W d   dS 1 s\w   Y  dS ).https://github.com/borgbackup/borg/issues/6063c                  _   r  r  r  r  r_   r_   rb   r  f  r  z`ArchiverTestCase.test_do_not_fail_when_percent_is_in_xattr_name.<locals>.patched_setxattr_EACCESr  r  s   user.attribute%pr  r   r  r   rI  rV   rn   r-  r   r  N)	r  r   r-  r   r   rC   r   r  r*   r   r  r_   r_   rb   .test_do_not_fail_when_percent_is_in_xattr_nameb  s   

"z?ArchiverTestCase.test_do_not_fail_when_percent_is_in_xattr_namec              	   C   s   dd }t t j| jd tddd | d| jd | d	| jd
 d t	d3 t
td| | jd| jd
 td W d   n1 sJw   Y  W d   dS W d   dS 1 sbw   Y  dS )r  c                  _   r  r  r  r  r_   r_   rb   r  v  r  z_ArchiverTestCase.test_do_not_fail_when_percent_is_in_file_name.<locals>.patched_setxattr_EACCESzdir%ps   input/dir%pr  r  r   r  r   rI  rV   rn   r-  r   r  N)rr   r  r   r   r   r   r-  r   r   rC   r   r  r*   r  r_   r_   rb   -test_do_not_fail_when_percent_is_in_file_namer  s   
"z>ArchiverTestCase.test_do_not_fail_when_percent_is_in_file_namec                 C   s<   | j d d }| jd|ddd}| d| | d| d	S )
z.https://github.com/borgbackup/borg/issues/6014z-this-repository-does-not-existrI  rS  r   T)rz   rT   zthis-repository-does-not-existz$this-repository-does-not-exist::testN)r   r   r]  r  r3  r_   r_   rb   4test_do_not_mention_archive_if_you_can_not_find_repo  s   zEArchiverTestCase.test_do_not_mention_archive_if_you_can_not_find_repoc                 C   s  | j ddd | dd| j | d| jd d ttj| jd	 ttj|  d	 | d
| j}d|v s=J | d| j}d|v sJJ | d
| jd }d|v sYJ | d| jd }d|v shJ t	d | d| jd  W d   n1 sw   Y  | 
dd dS )zNonce 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, borgre  r   rD  r   rI  rV   r  rS  rV  r|   rM  r  rn   r   NrR  )r  r   r   rr   r   r   r   r   r%   rC   r^  )r   Z	repo_infoZ	repo_listZarchive_inforv  r_   r_   rb   +test_can_read_repo_even_if_nonce_is_deleted  s"   
z<ArchiverTestCase.test_can_read_repo_even_if_nonce_is_deletedc                 C   st   | j ddd | dd| j | d| jd d tj| jd	}t| | d| jd
 d tj|s8J dS )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.
        r  r  re  r   rD  r   rI  rV   r  rg  N)	r  r   r   rr   r   r   r   r   r   )r   r  r_   r_   rb   %test_recovery_from_deleted_repo_nonce  s   
z6ArchiverTestCase.test_recovery_from_deleted_repo_nonceN)r   r   r   )r  )r>  r?  r@  ry  markskipifrH   Zrequires_hardlinksr%   ra  rx  r|  r  r  rG   r  rJ   r  r  r  r  rK   r  r  rB  r  r  r  r  r  r  r  r  r  r  r  r  r  unittest
skipUnlessrA   r  r  r  r  r  r  r  r  r  r  r  r'  r+  r6  r;  r@  rC  rD  rE  rG  rL  rT  rV  r^  r`  rd  ri  rk  rm  rp  rr  rs  rt  ry  rz  r|  r  r  r  r  r   r*  r  r  rM   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rr   r   r  r  r  r  r  r  r  r	  r  r  r  Zallow_cache_wiper  r  r  r  r   r"  r#  r&  r'  r)  rI   r2  r4  r?  rL  rU  rj  rl  rm  ro  rq  rt  ry  rz  r}  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r$  r'  r)  r*  r.  r/  r0  r6  r:  r;  r=  rG  rI  rJ  rM  rN  rO  r[  r^  r_  r`  ra  rb  rg  rh  rn  rq  rs  ru  rw  rz  r   Zrequires_gnutarr   r   Zrequires_gzipr  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r_   r_   r_   rb   rA    s   ?






 	3
 



!(!		




	






	
$
 (=




d


W



-'

rA  zno borg.exe availablec                       s   e Zd ZdZdZeddd Zeddd Zedd	d
 Z	eddd Z
eddd Zeddd Z fddZeddd Zeddd Z  ZS )ArchiverTestCaseBinaryr   Tz(does not raise Exception, but sets rc==2c                 C   r]   r^   r_   r   r_   r_   rb   r|       z,ArchiverTestCaseBinary.test_init_parent_dirszpatches objectsc                 C   r]   r^   r_   r   r_   r_   rb   r    r  z*ArchiverTestCaseBinary.test_init_interruptc                 C   r]   r^   r_   r   r_   r_   rb   r    r  z0ArchiverTestCaseBinary.test_extract_capabilitiesc                 C   r]   r^   r_   r   r_   r_   rb   r    r  z1ArchiverTestCaseBinary.test_extract_xattrs_errorszLtest_basic_functionality seems incompatible with fakeroot and/or the binary.c                 C   r]   r^   r_   r   r_   r_   rb   ra    r  z/ArchiverTestCaseBinary.test_basic_functionalityzBtest_overwrite seems incompatible with fakeroot and/or the binary.c                 C   r]   r^   r_   r   r_   r_   rb   r    r  z%ArchiverTestCaseBinary.test_overwritec                    s"   t  r
td d S t   d S )Nz9test_fuse with the binary is not compatible with fakeroot)rL   r  r  superr  r   r  r_   rb   r    s   z ArchiverTestCaseBinary.test_fusec                 C   r]   r^   r_   r   r_   r_   rb   r    r  zEArchiverTestCaseBinary.test_do_not_fail_when_percent_is_in_xattr_namec                 C   r]   r^   r_   r   r_   r_   rb   r    r  zDArchiverTestCaseBinary.test_do_not_fail_when_percent_is_in_file_name)r>  r?  r@  r   r   r  r  r|  r  r  r  ra  r  r  r  r  __classcell__r_   r_   r  rb   r    s(    






r  c                       s   e Zd Z f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  ZS )ArchiverCheckTestCasec                    sb   t    ttdd | dd| j | d | d W d    d S 1 s*w   Y  d S )NBUFFER_SIZEr"  r   rD  archive1r  )r  r   r   r  r   r   r   r  r   r  r_   rb   r     s   

"zArchiverCheckTestCase.setUpc                 C   s<  | j ddd| jdd}| d| | d| | d| td	tj | j ddd
| jdd}| d| | d| | d| | j ddd| jdd}| d| | d| | j dddd| jdd}| d| | j dddd| jdd}| d| | d| | j dddd| jdd}| d| | d| d S )Nr   rH  r  r   r  r  z"Starting archive consistency checkzChecking segmentszborg.output.progressz--repository-onlyz--archives-onlyz--glob-archives=archive2r  r  r  r  )r   r   r]  logging	getLoggersetLevelNOTSETr  r  r_   r_   rb   test_check_usage  s(   z&ArchiverCheckTestCase.test_check_usagec              	   C   sl  |  d\}}|/ | D ]}|jdr%|j}|d }||j  nq| d |jdd W d    n1 s;w   Y  | j	d| j
dd	 | j	dd
| j
dd	}| d| | j	d| j
dd	 | j	dd| j
d dd	}| d| dD ]=}|  |\}}|* | D ]}|jdr| ||j | ||j  nq| d W d    n1 sw   Y  qvttdd | d W d    n1 sw   Y  | j	ddd
| j
dd	}| d| | d| dD ]8}|  |\}}|$ | D ]}|jdr| ||j  nq| d W d    n	1 sw   Y  q| j	dd| j
d dd	}| d| d S )Nr  r  r  zshould not happenFr  r   r?   r  r   r   zNew missing file chunk detectedr|   z--format={health}#{path}{LF}r  zbroken#)r  r  r  r"  archive3rH  z$Healed previously missing file chunkzAtestsuite/archiver.py: Completely healed previously damaged file!)r  r  r   r4  r  r  r  Zfailr  r   r   r]  Zassert_not_equalr  r   r  r   r  r   )r   r  r   r%  Zvalid_chunksZkilled_chunkrn   archive_namer_   r_   rb   test_missing_file_chunk  sf   


	
z-ArchiverCheckTestCase.test_missing_file_chunkc                 C   s   |  d\}}| ||jjd  |jdd W d    n1 s#w   Y  | jd| jdd | jdd| jdd | jd| jdd d S )	Nr  r   Fr  r   r?   r  r   )r  r  r  r  r  r   r   r   r  r   r_   r_   rb   test_missing_archive_item_chunk6  s   z5ArchiverCheckTestCase.test_missing_archive_item_chunkc                 C   s   |  d\}}| ||j |jdd W d    n1 s w   Y  | jd| jdd | jdd| jdd | jd| jdd d S )	Nr  Fr  r   r?   r  r   r   )r  r  r  r  r   r   r  r_   r_   rb   test_missing_archive_metadata?  s   z3ArchiverCheckTestCase.test_missing_archive_metadatac                 C   s   |  d\}}| |tj |jdd W d    n1 s w   Y  | jd| jdd | jddd| jd	d}| d| | d
| | jd| jd	d d S )Nr  Fr  r   r?   r  rH  r   r   r  )r  r  r&   MANIFEST_IDr  r   r   r]  )r   r  r   rn   r_   r_   rb   test_missing_manifestH  s   z+ArchiverCheckTestCase.test_missing_manifestc                 C   s   |  d\}}| |tj}|d }|tj| |jdd W d    n1 s+w   Y  | jd| jdd | jddd	| jd
d}| d| | d| | jd| jd
d d S Nr  
   corrupted!Fr  r   r?   r  rH  r   r   r  )	r  r   r&   r  r  r  r   r   r]  )r   r  r   r  corrupted_manifestrn   r_   r_   rb   test_corrupted_manifestS  s   z-ArchiverCheckTestCase.test_corrupted_manifestc                 C   s   |  d\}}|0 |tj}|d }|tj| ||j}|d }||j| |jdd W d    n1 s<w   Y  | jd| jdd | jddd	| jd
d}| 	d| | jd| jd
d d S r  )
r  r   r&   r  r  r  r  r   r   r]  )r   r  r   r  r  chunkZcorrupted_chunkrn   r_   r_   rb   %test_manifest_rebuild_corrupted_chunk`  s   	z;ArchiverCheckTestCase.test_manifest_rebuild_corrupted_chunkc           	   	   C   s   |  d\}}|j}|> |tj}|d }|tj| g g dddddd}|j|dd	}||}|||| |j	d
d W d    n1 sMw   Y  | j
d| jdd | j
dd| jdd | 
d| j}| d| | d| | d| d S )Nr  r  foobarz2016-12-15T18:49:51.849711r?   )cmdliner  hostnameusernamer   r9  rk  s   archive)contextFr  r   r  r   r   r|   z
archive1.1r  )r  rP   r   r&   r  r  Zpack_and_authenticate_metadatar  encryptr  r   r   r]  )	r   r  r   rP   r  r  Zarchive_dictrr  rn   r_   r_   rb   'test_manifest_rebuild_duplicate_archivep  s2   	
z=ArchiverCheckTestCase.test_manifest_rebuild_duplicate_archivec                 C   s   | j d| jdd t| jdd}|dd |jdd	 W d    n1 s'w   Y  | j d| jd
d | j d| jd
d | j dd| jdd | j d| jdd | j dd| jd dd d S )Nr   r   r  Tr  s    01234567890123456789012345678901s   xxxxFr  r?   r   r   r  r  )r   r   r>   r  r  r   r   r_   r_   rb   test_extra_chunks  s   z'ArchiverCheckTestCase.test_extra_chunksc                 G   s(  t | j | jd| jg|R   | d | d\}}|1 | D ]}|j	drB|j
d }||jd }||j|  nq$|jdd W d    n1 sSw   Y  | jd| jd	d
 | jdd| jdd
}t|jd |v svJ | jddd| jd	d
}t|jd |v sJ d|v sJ d S )Nr   r  r  r     1234Fr  r   r   r  r  r?   z, integrity errorr   z6testsuite/archiver.py: New missing file chunk detected)r   r   r   r   r   r  r  r  r   r4  r  r   r  r  r  r,   )r   Z	init_argsr  r   r%  r  r   rn   r_   r_   rb   _test_verify_data  s(   

z'ArchiverCheckTestCase._test_verify_datac                 C      |  dd d S )NrQ  r  r  r   r_   r_   rb   test_verify_data     z&ArchiverCheckTestCase.test_verify_datac                 C   r  )NrQ  r  r  r   r_   r_   rb   test_verify_data_unencrypted  r  z2ArchiverCheckTestCase.test_verify_data_unencryptedc                 C   sh   t | jdd}| D ]}|| q|jdd W d    n1 s$w   Y  | jd| jdd d S )NTr  Fr  r   r?   r  )r>   r   r|   r  r  r   )r   r   Zid_r_   r_   rb   test_empty_repository  s   z+ArchiverCheckTestCase.test_empty_repositoryc              
   C   s   G dd d}|  d\}}|< t|tj\}}t|||}t|||d|dd}|j|  |  W d    n1 s@w   Y  W d    n1 sOw   Y  | j	d| j
dd	 | j	d
| j
d dd	 d S )Nc                   @   s   e Zd Zdd ZdS )zAArchiverCheckTestCase.test_attic013_acl_bug.<locals>.Attic013Itemc              	   S   s   dddddddd dS )NZ1234r      0)s   paths   mtimes   modes   users   groups   uids   gids   aclr_   r   r_   r_   rb   as_dict  s   zIArchiverCheckTestCase.test_attic013_acl_bug.<locals>.Attic013Item.as_dictN)r>  r?  r@  r  r_   r_   r_   rb   Attic013Item  s    r  r  z0.13T)r   r   r   r   r  r|   z::0.13)r  r&   r  r  r   r   Zitems_bufferr  saver   r   )r   r  r  r   r  rP   r   r_   r_   rb   test_attic013_acl_bug  s   
z+ArchiverCheckTestCase.test_attic013_acl_bug)r>  r?  r@  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r_   r_   r  rb   r    s     2		r  c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )ManifestAuthenticationTestc                 C   s~   |3 t |t j\}}|t j|tdi i t t	dd 
td |jdd W d    d S 1 s8w   Y  d S )Nr?   days)rk  r2  r  rj  Fr  )r&   r  r  r  r  r  r.   packbr1   r   rD  r  r  )r   r   r  rP   r_   r_   rb   spoof_manifest  s   "z)ManifestAuthenticationTest.spoof_manifestc                 C   s   |  dd| j t| jdd}|1 t|tj\}}|tj|	t
di t tdd td |jdd	 W d    n1 sEw   Y  tt |  d
| j W d    d S 1 sbw   Y  d S )Nr   rD  Tr  r?   r  )rk  r2  rj  Fr  r|   )r   r   r>   r   r&   r  r  r  r  r  r.   r  r1   r   rD  r  r  ry  rz  r   r  r_   r_   rb   test_fresh_init_tam_required  s   	"z7ManifestAuthenticationTest.test_fresh_init_tam_requiredc              	   C   s  |  dd| j | d t| jdd}|G ttt|j	 t
|t
j\}}d|_||j t|d |t
j}|d= |t
j|t| |jdd W d    n1 s`w   Y  |  d	d
| j}d|v ssJ d|v syJ |  dd| j |  d	d
| j}d|v sJ d|v sJ | | tt |  d	| j W d    n1 sw   Y  |  ddd| j |  d	| j d S )Nr   rD  archive1234Tr  Fs   tamr  r|   r  z'Manifest TAM not found and not requiredupgradez--tamzTAM-verified manifestr  )r   r   r  r>   r   r   r   r%   r,   r  r&   r  r  Ztam_requiredZchange_passphraseZ_passphraser.   ZunpackbZdecryptr   r  r  r  r  r  r  ry  rz  r   )r   r   r  rP   r  rn   r_   r_   rb   test_not_required  s4   


z,ManifestAuthenticationTest.test_not_requiredc                 C   sX   |  dd| j | d |  dd| j t| jdd}| | |  d| jr*J d S )	Nr   rD  r  r  --disable-tamTr  r|   r   r   r  r>   r   r  r  r_   r_   rb   test_disable  s   

z'ManifestAuthenticationTest.test_disablec                 C   sX   |  dd| j | d t| jdd}| | |  dd| j |  d| jr*J d S )	Nr   rD  r  Tr  r  r  r|   r  r  r_   r_   rb   test_disable2  s   

z(ManifestAuthenticationTest.test_disable2N)r>  r?  r@  r  r  r  r  r  r_   r_   r_   rb   r    s     r  c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
ArchiveAuthenticationTestc                 C   sz   t |t j\}}td|g dddt td}||}|	||
| |t f|j|< |  |jdd d S )Nr?   rY   )rk  r   r  r  r  r  r9  Fr  )r&   r  r  r.   r  r1   rD  r  r  r  r  r   rC  r2  r   r  )r   r   r  r  rP   Zarchive_datarr  r_   r_   rb   write_archive_without_tam%  s   

	z3ArchiveAuthenticationTest.write_archive_without_tamc                 C   s   |  dd| j | d t| jdd}| | |d W d    n1 s'w   Y  |  dd| j}d	|v s:J d
|v s@J |  dd| j |  dd| j}d	|v sVJ d|v s\J d S )Nr   rD  archive_tamTr  archive_no_tamr|   --format="{name} tam:{tam}{NL}"archive_tam tam:verifiedarchive_no_tam tam:noner  z--archives-tamzarchive_no_tam tam:verifiedr   r   r  r>   r   r  r   r   rn   r_   r_   rb   test_upgrade_archives_tam6  s   
z3ArchiveAuthenticationTest.test_upgrade_archives_tamc                 C   s   |  dd| j | d t| jdd}| | |d |tj |j	dd W d    n1 s3w   Y  |  d	d
| j |  dd| j}d|v sNJ d|vsTJ d S )Nr   rD  r  Tr  r  Fr  r   r   r|   r  r  )
r   r   r  r>   r   r  r  r&   r  r  r  r_   r_   rb   test_check_rebuild_manifestD  s   
z5ArchiveAuthenticationTest.test_check_rebuild_manifestc                 C   s   |  dd| j | d |  dd| j}t| jdd}| | |d W d    n1 s/w   Y  |  dd	| j}d
|v sBJ d|v sHJ |  dd| j |  dd	| j}d
|v s^J d|vsdJ |  dd| j}||ksrJ d S )Nr   rD  r  r|   z--format="{name} {id}{NL}"Tr  r  r  r  r  r   r   r  )r   Zarchive_id_pre_checkr   rn   Zarchive_id_post_checkr_   r_   rb   test_check_rebuild_refcountsQ  s    
z6ArchiveAuthenticationTest.test_check_rebuild_refcountsN)r>  r?  r@  r  r  r  r  r_   r_   r_   rb   r  #  s
    r  c                   @   sf   e Zd ZdZdd Zdd Zdd Zedd	d
 Z	eddd Z
eddd Zdd ZdS )RemoteArchiverTestCasez__testsuite__:c                 C   s   t t| jS r^   )r<   r$   r   r   r_   r_   rb   r	  f  r
  z&RemoteArchiverTestCase.open_repositoryc              	   C   s  t tdd| jg | dd| j W d    n1 sw   Y  t tdd| jg' tt | dd| jd  W d    n1 sGw   Y  W d    n1 sVw   Y  t tdddg' tt | dd| jd  W d    n1 sw   Y  W d    n1 sw   Y  t	j
| j}t tdd|g | dd| jd  W d    n1 sw   Y  t tdddd|g | dd| jd	  W d    d S 1 sw   Y  d S )
Nextra_test_argsz--restrict-to-pathr   rD  Z_0z/fooZ_1Z_2Z_3)r   r  r<   r   r   r   ry  rz  r=   rr   r   r  )r   Zpath_prefixr_   r_   rb   !test_remote_repo_restrict_to_pathi  s,   "z8RemoteArchiverTestCase.test_remote_repo_restrict_to_pathc              	   C   s   t tdd| jg | dd| j W d    n1 sw   Y  tj| jd}t tdd|g. t	
t | dd| j W d    n1 sLw   Y  W d    d S W d    d S 1 sdw   Y  d S )Nr  z--restrict-to-repositoryr   rD  rQ   )r   r  r<   r   r   r   rr   r   r   ry  rz  r=   )r   r{  r_   r_   rb   'test_remote_repo_restrict_to_repository~  s   "z>RemoteArchiverTestCase.test_remote_repo_restrict_to_repositoryzonly works locallyc                 C   r]   r^   r_   r   r_   r_   rb   r    r  z4RemoteArchiverTestCase.test_debug_put_get_delete_objc                 C   r]   r^   r_   r   r_   r_   rb   rz    r  z"RemoteArchiverTestCase.test_configc                 C   r]   r^   r_   r   r_   r_   rb   r    r  z.RemoteArchiverTestCase.test_migrate_lock_alivec              	   C   s  |  dd| j | jddd | jddd | jdd	d | jd
dd | jddd |  d| jd d d}td |  dd| jd dd}||vsNJ | d |  dd| jd dd}||vsfJ W d    n1 spw   Y  | d |  dd| jd dd}||vsJ W d    n1 sw   Y  | d |  dd| jd dd}||vsJ W d    n1 sw   Y  W d    d S W d    d S 1 sw   Y  d S )Nr   rD  r  s   test file contents 1re  z	dir/file2s   test file contents 2zskipped-file1s   test file contents 3zskipped-file2s   test file contents 4zskipped-file3s   test file contents 5r   rI  rV   z)cached responses left in RemoteRepositoryrn   r   r  r  r  r  r  r  r  r  )r   r   r  rC   r  )r   markerresr_   r_   rb   -test_remote_repo_strip_components_doesnt_leak  s4   
	"zDRemoteArchiverTestCase.test_remote_repo_strip_components_doesnt_leakN)r>  r?  r@  r   r	  r  r  r  r  r  rz  r  r   r_   r_   r_   rb   r  c  s    	


r  c                       sF   e Zd Z fddZdddZdd Zdd	 Zd
d Zdd Z  Z	S )ArchiverCorruptionTestCasec                    sF   t    |   | dd| j t| d| jdd d | _d S )Nr   rD  rS  r1  r   r   )r  r   r=  r   r   rj  rk  r   r   r  r_   rb   r     s   
$z ArchiverCorruptionTestCase.setUpr?   c                 C   sr   t |d*}|| tj tdd ||D }|| tj || W d    d S 1 s2w   Y  d S )Nr  c                 s   s    | ]}d | V  qdS )   Nr_   )r   cr_   r_   rb   r     r  z5ArchiverCorruptionTestCase.corrupt.<locals>.<genexpr>)r   r  rx   SEEK_ENDbytesr  r   )r   r  amountr   Z	corruptedr_   r_   rb   corrupt  s   "z"ArchiverCorruptionTestCase.corruptc                 C   s|   |  tj| jd | jr| jd| jdd}d|v sJ d S t	t
 | d| j W d    d S 1 s7w   Y  d S )Nr  rS  r   r  zfailed integrity check)r  rr   r   r   r   r   r   r   ry  rz  r#   r   r   r_   r_   rb   test_cache_chunks  s   "z,ArchiverCorruptionTestCase.test_cache_chunksc                 C   sN   |  d| jd d | tj| jd |  d| jd d}d|v s%J d S )Nr   rI  rV   r  r  zfiles cache is corrupted)r   r   r  rr   r   r   r   r  r_   r_   rb   test_cache_files  s   z+ArchiverCorruptionTestCase.test_cache_filesc                 C   sJ  |  d| jd d |  d| jd }|  d| jd d |  dd| j |  d	| jd
 tj| jd}tt|dksAJ | 	tj||d  tj| jd}t
d d}|| |ddttd t|d}|| W d    n1 sw   Y  | j dd| jd ddd}d|v sJ d|v sJ d|v sJ d S )Nr   r  rV   r|   z--format={id}{LF}rg  r  r  rS  r1  zchunks.archive.drT  z.compactr  r  r   r      r  rH  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  rr   r   r   r   r  r  r  r   r  r  r,   r  r   r   )r   Z	target_idZchunks_archiveconfig_pathr  r   r   r_   r_   rb   test_chunks_archive  s&   

z.ArchiverCorruptionTestCase.test_chunks_archivec                 C   s   t j| jd}td d}|| |ddttd t	|d}|
| W d    n1 s2w   Y  | d| j}d|v sDJ d S )	Nr  r  r   r  r  r  rS  zHCache integrity data not available: old Borg version modified the cache.)rr   r   r   r   r   r  r  r,   r  r   r   r   r   )r   r  r  r   r   r_   r_   rb   test_old_version_interfered  s   

z6ArchiverCorruptionTestCase.test_old_version_interfered)r?   )
r>  r?  r@  r   r  r	  r
  r  r  r  r_   r_   r  rb   r    s    

r  c                   @   s$   e Zd Zdd Zdd Zdd ZdS )DiffArchiverTestCasec                    s    j ddd  j ddd  j ddd  j dd	d  j d
dd td tdtjdB  td t r\td tdd tdd tdd tdd tdd t rwt	dd t	dd t	dd t	dd  
dd j  
d  jd! d"  j d#d$d  j d%dd td  j d
d&d' td td td  j d(d)d tdtjdB  td* td t rtd td*d td td*d td*d+ td  j d,d-d td t rtd t	d.d/ tdd0}|d1 W d    n	1 s!w   Y   
d  jd2 d"  
d d3d4 jd5 d" dD fd7d8	}dDd9d:} 
d; jd! d<}||d=  j
d; jd! d>d?d@dA}||d6d=dB  
d; jd! d<dC}||d=  
d; jd! d<dCd?}||d=d=dB d S )ENr   r   r  Zfile_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_removedzinput/file_removed2input/link_target_removedrN  "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   rD  r   r(  rV   Z
file_added   Zfile_empty_addeds   0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000re  Zdir_replaced_with_filer7  input/dir_addedinput/link_addedZlink_replaced_by_filei @  input/file_addedinput/hardlink_addedabs   appended_dataz::test1ar1  z16,18,17,4095z::test1bFc                    s  |rdnd d}|  }d| v sJ  || d d| vs"J dtjvr1ts1|s1 |d d	| v s7J d
| v s=J t rd |d  |d  |d d| v sXJ d| v s^J d| vsdJ |rhdnd d} || d t r || d t rd| vsJ d| v sJ t rd| v sJ d| v sJ d| v sJ t rd| v sJ t r|rd| vsJ d| vsJ d S d S d S )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_changedzadded link.*input/link_addedz removed link.*input/link_removedr  r  r  z0 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   Zassert_line_existsrr   r   rN   rG   rH   )rn   can_compare_idscontent_onlyZchangelinesr   r_   rb   
do_asserts1  sD   
	zADiffArchiverTestCase.test_basic_functionality.<locals>.do_assertsc                 S   s|  dd }dd |  dD }|rdddd	nd
di}||d|v s#J t|d|r,J dtjvr@|s@dddd|d|v s@J d
di|d|v sKJ d
di|d|v sVJ t rd
di|d|v sdJ d
di|d|v soJ d
di|d|v szJ |stdd |d|D sJ |d|td d |d!|D sJ |d!|t|d"|rJ |rdd#d$d	nd
di}||d%|v sJ t r||d&|v sJ t rt|d'|rJ d(d)d*|d+|v sJ t rd(d)d*|d,|v sJ d(d$d*|d-|v sJ d.d/d*|d0|v sJ t rd.d/d*|d1|v sJ t r8|r:t|d2|r.J t|d3|r<J d S d S d S )4Nc                    s0    fdd|D }t |dk sJ dd |D S )Nc                    s    g | ]}|d   kr|d qS )r   changesr_   )r   r   r  r_   rb   rl  w  s     zoDiffArchiverTestCase.test_basic_functionality.<locals>.do_json_asserts.<locals>.get_changes.<locals>.<listcomp>r   c                 S   s   g | ]	}|D ]}|qqS r_   r_   )r   Zchgsetchgr_   r_   rb   rl  z      )r  )r  r   Zchgsetsr_   r0  rb   get_changesv  s   z[DiffArchiverTestCase.test_basic_functionality.<locals>.do_json_asserts.<locals>.get_changesc                 S   s   g | ]	}|rt |qS r_   ri  r   r_   r_   rb   rl  }  r2  zZDiffArchiverTestCase.test_basic_functionality.<locals>.do_json_asserts.<locals>.<listcomp>rW  r)  i   r  )r  addedremovedr  r  r  r  r  z
drwxr-xr-xz
-rwxr-xr-x)r  old_modenew_moder  zadded directoryr#  zremoved directoryr  zchanged linkr  z
added linkr$  zremoved linkr  c                 s   *    | ]}|d  dko|d  dV  qdS )r  r  r7  lNr  r   r1  r_   r_   rb   r     
    
zYDiffArchiverTestCase.test_basic_functionality.<locals>.do_json_asserts.<locals>.<genexpr>r  c                 s   r8  )r  r  r6  r9  Nr  r:  r_   r_   rb   r     r;  r  r     r   rN  r  r  r4  r"  )r  r   r%  r&  zinput/file_empty_addedr5  r  r  r   r!  r  )rp  rF  rr   r   rG   rH   )rn   r+  r,  r3  Zjoutputr_  r_   r_   rb   do_json_assertsu  sZ   


	zFDiffArchiverTestCase.test_basic_functionality.<locals>.do_json_assertsr  Ztest1aTZtest1b--content-onlyr?   r  )r,  rf  )F)r  rr   r   r   r0  S_IFDIRrG   r)  rH   r(  r   r   r  rmdirS_IFREGr   r   )r   r   r.  r=  rn   r_   r   rb   ra    sx   














DR

z-DiffArchiverTestCase.test_basic_functionalityc                 C   s  |  dd| j | jddd | jddd | jdd	d | jd
dd |  d| jd d td td td td | jddd | jd
dd | jddd | jddd |  d| jd d |  dd| jd dd}g d}tdd  t|| D sJ d S )!Nr   rD  a_file_removedrY  r  f_file_removedrh  c_file_changedr  e_file_changedr  r   r(  rV   zinput/a_file_removedzinput/f_file_removedzinput/c_file_changedzinput/e_file_changedr  r  b_file_addedr  d_file_addedr  r  r  z--sortr:  r>  )rB  rF  rD  rG  rE  rC  c                 s   s    | ]	\}}||v V  qd S r^   r_   )r   xr   r_   r_   rb   r     s    z8DiffArchiverTestCase.test_sort_option.<locals>.<genexpr>)r   r   r  rr   r  r  zipr   )r   rn   r_  r_   r_   rb   test_sort_option  s$   



$	z%DiffArchiverTestCase.test_sort_optionc                 C   s$  |  dd| j | jddd |  d| jd d td	 td
 tr+td ntr2td | jddd |  d| jd d |  d| jd d}| 	d| | 	d| tr`td t
d
d |  d| jd d |  d| jd d}| d| ts| 	d| d S | d| d S )Nr   rD  r   r"  r  r   r  rV   r  zinput/test_fileri  r?   r  r  r  r  ctimer   z
::archive3r  )r   r   r  r9  r:  rr   r  rN   rM   r]  r   r  r  r_   r_   rb   test_time_diffs  s.   



z$DiffArchiverTestCase.test_time_diffsN)r>  r?  r@  ra  rJ  rL  r_   r_   r_   rb   r    s
     ^r  c                  C   s   t  } | g dd}|j| jksJ |jddgksJ |jdks#J |jdks*J | g dd}|jd	d
gks;J | g dd}|jddgksLJ | g dd}|jd	d
gks]J | g dd}|jd	d
gksnJ | g dd}|j| jks~J | ddgd}|j| jksJ d S )N)r   servez--umask=0027--restrict-to-path=/p1--restrict-to-path=/p2zborg serve --infoz/p1z/p2ra  rS  )r   rM  z--restrict-to-repository=/r1z--restrict-to-repository=/r2zborg serve --info --umask=0027z/r1z/r2)r   rM  rN  rO  zborg serve --restrict-to-path=/z%borg serve --restrict-to-repository=/z-borg serve --restrict-to-repository=/r1/belowz borg init --encryption=repokey /r   rM  zBORG_FOO=bar borg serve --info)r   get_argsfuncZdo_serveZrestrict_to_pathsumask	log_levelZrestrict_to_repositories)rS   ra   r_   r_   rb   test_get_args  s@   






rT  c                  C   sb   dd } | g dg dsJ | dgddgrJ | ddgddgr$J | ddgdd	gr/J d S )
Nc                 S   sP   dd | D }dd |D }t t|t|}t t|t|}||ks&J |S )Nc                 S      g | ]}|qS r_   r_   r   r   r_   r_   rb   rl  8      z9test_chunk_content_equal.<locals>.ccc.<locals>.<listcomp>c                 S   rU  r_   r_   rV  r_   r_   rb   rl  9  rW  )r9   iter)rb  rc  Zchunks_aZchunks_bZcompare1Zcompare2r_   r_   rb   ccc7  s   z%test_chunk_content_equal.<locals>.ccc)r  s   567As   bC)   1s   23s   4567A   b   Cs   12345r  s   56s   65s   565r_   )rY  r_   r_   rb   test_chunk_content_equal6  s,   r]  c                   @   s0   e Zd Zedd Zdd Zdd Zdd Zd	S )
TestBuildFilterc                 C   r]   r^   r_   )r%  Zmatchedr_   r_   rb   peek_and_store_hardlink_mastersX  r  z/TestBuildFilter.peek_and_store_hardlink_mastersc                 C   sd   t  }|tdgtj t|| jd}|tddsJ |tdds'J |tddr0J d S )NZincludedr   rh  zincluded/filezsomething else)	r5   r  r6   r4   Includer   build_filterr_  r7   r   Zmatcherr\  r_   r_   rb   
test_basic\  s   zTestBuildFilter.test_basicc                 C   s0   t dd}t|| jd}|tddsJ d S )NTfallbackr   Zanythingrh  r5   r   ra  r_  r7   rb  r_   r_   rb   
test_emptyd  s   
zTestBuildFilter.test_emptyc                 C   sh   t dd}tj|| jdd}|tddrJ |tddr J |tdds)J |td	ds2J d S )
NTrd  r?   )Zstrip_componentsZshallowrh  zshallow/zdeep enough/filezsomething/dir/filerf  rb  r_   r_   rb   r  i  s   
z%TestBuildFilter.test_strip_componentsN)r>  r?  r@  staticmethodr_  rc  rg  r  r_   r_   r_   rb   r^  W  s    
r^  c                   @   s   e Zd Zedd Zejdd Zejdd Zejdd Z	ejd	d
 Z
ejdd Zdd Zejddejdddd ZdS )TestCommonOptionsc                 C   sv   | ddddd | dddd	d
dd | dddd	ddd | dddddg d | dddddd | ddt dddd d S )Nr  z--helpr   zshow this help message and exit)actionr   
--criticalrS  r  Zstore_constcriticalwarning)destr   rj  constr3  re  error--appendrY  ZTOPIC)rn  r   rj  metavarr3  -pr  progress
store_true)rn  rj  r   z--lock-wait	lock_waitNr?   z(default: %(default)d).)rn  r  rr  r3  r   )r  )Zadd_common_optionr_   r_   rb   define_common_optionss  s   
z'TestCommonOptions.define_common_optionsc                 C   s&   t jdddd}tj| jdd|_|S )NrM  ztest parserF)progdescriptionadd_help)_level0_level1)Zsuffix_precedence)argparseArgumentParserr   ZCommonOptionsrx  common_options)r   parserr_   r_   rb   basic_parser  s
   zTestCommonOptions.basic_parserc                 C   s   |j dddS )Nzrequired argumentsz	<command>)titlerr  )Zadd_subparsersr   r  r_   r_   rb   
subparsers  s   zTestCommonOptions.subparsersc                 C   s   |j j|ddd |S )Nr|  T)Zprovide_defaults)r  add_common_groupr  r_   r_   rb   r    s   zTestCommonOptions.parserc                 C   s    t jddd}|j|d |S )NFrM  )r{  ry  r}  )r~  r  r  r  )r   r  common_parserr_   r_   rb   r    s   zTestCommonOptions.common_parserc              	      sH   |j d|gddddtjd}|jdd |jd	d
dd  fdd}|S )N
subcommandFr  r  baz)parentsr{  rz  epilogr   Zformatter_class  )rQ  --append-onlyrx  ru  )rn  rj  c                     s&   t |   | } j| t|S r^   )r   r{   r  resolvevars)r   ra   r  r_   rb   parse_vars_from_line  s   
zDTestCommonOptions.parse_vars_from_line.<locals>.parse_vars_from_line)Z
add_parserr~  ZRawDescriptionHelpFormatterset_defaultsadd_argument)r   r  r  r  Z	subparserr  r_   r  rb   r    s   z&TestCommonOptions.parse_vars_from_linec                 C   s   |dg ddddksJ |dddg ddddd	d
ksJ t t |dd W d    n1 s3w   Y  |ddddddg dddddd	d
ksNJ d S )Nre  r?   rp  F)rY  rv  rS  rt  r  rk  rl  r  rY  rv  rS  rt  rx  rQ  r  z--append=foorq  r  r  )r  r  r  rm  )ry  rz  rp   )r   r  r_   r_   rb   test_simple  s2   
	zTestCommonOptions.test_simpleposition)r  r  bothzflag,args_key,args_value))rs  rt  T)z--lock-wait=3rv  r  c                 C   s`   g }|dv r| | | d |dv r| | g dddddd}|||< || |ks.J d S )	N)r  r  r  )r  r  r?   rm  Fr  r  )rY  )r   r  r  flagZargs_keyZ
args_valuer   r[  r_   r_   rb   test_flag_position_independence  s   


z1TestCommonOptions.test_flag_position_independenceN)r>  r?  r@  rh  rx  ry  fixturer  r  r  r  r  r  r  parametrizer  r_   r_   r_   rb   ri  r  s"    





ri  c                   C   sJ   t ddksJ ttj t d W d    d S 1 sw   Y  d S )NZ50MiZ5M)r   ry  rz  r~  ZArgumentTypeErrorr_   r_   r_   rb   test_parse_storage_quota  s   
"r  c                     sF   t dd } t dd }i d fdd	  d| t d|i S )	z0
    Return dict mapping command to parser.
    r   )ry  borgfsNc                    s   i }|j D ]}|jd ur#dt|jv r#|j D ]
\}}||| | < qq|d ur-|| | r3|s3d S t| D ]\}} |d || ||< q9d S )NSubParsersActionr  )_actionschoicesrg   r  r  r  rq  )r   r  r   extra_choicesr  rj  r   commanddiscover_levelparsersr_   rb   r    s   


z'get_all_parsers.<locals>.discover_levelrY   r^   )r   build_parser)r  borgfs_parserr_   r  rb   get_all_parsers  s   r  zcommand, parserc                 C   s    t |jtr|jjsJ d S d S r^   )rf   r  r2   rst)r  r  r_   r_   rb   test_help_formatting  s   r  topicc                 C   s   t j|  }tt|sJ d S r^   )r   helptextrg   r3   )r  r  r_   r_   rb   test_help_formatting_helptexts  s   
r  )r~  Zdateutil.tzr@  r   rx   rj  r  rr   r  r   r=  r   r  r0  rj   rd   r   r9  r  binasciir   r   configparserr   r   r   r   Zhashlibr   r	   r
   Zunittest.mockr   ry  r   Zborg.helpers.errorsrY   r   r   r   r  r   r   rS   r   r   r   r   r   r   Zchunkerr   	constantsZcrypto.low_levelr   r   Z
crypto.keyr   r   r   r   r   r    Zcrypto.keymanagerr!   r"   Zcrypto.file_integrityr#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   Znanorstr2   r3   r   r4   r5   r6   r%  r7   r8   r9   r  r:   loggerr;   Zremoter<   r=   r   r>   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   ZupgraderrO   rP   r   r  r   r  __file__r   r   r   Z	BORG_EXESFileNotFoundErrorr  r   r   r   r  r  r   r   r   rA  r  r  r  r  r  r  r  r  rT  r]  r^  ri  r  r  r  r|   r  r  r  r   r  r_   r_   r_   rb   <module>   s     1	



>                           L+ tL@GJ  (!k
