o
    +ke>                     @   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mZ d dl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mZmZmZmZ dd
lmZmZmZmZmZmZmZ ddl m!Z! ddl	m"Z" e# Z$G dd de!Z%G dd de%Z&G dd de%Z'G dd de%Z(G dd de%Z)G dd de%Z*G dd de%Z+G dd de%Z,G dd de%Z-G d d! d!e%Z.G d"d# d#e%Z/G d$d% d%e&Z0G d&d' d'e%Z1G d(d) d)e.Z2G d*d+ d+e!Z3dS ),    N)patch   )NSIndex)Location)IntegrityError)msgpack)Lock
LockFailed)RemoteRepositoryInvalidRPCMethodPathNotAllowedConnectionClosedWithHinthandle_remote_line)
RepositoryLoggedIOMAGICMAX_DATA_SIZE
TAG_DELETETAG_PUT
TAG_COMMIT   )BaseTestCaseHc                   @   sP   e Zd ZdZdZdefddZdd Zdd	 Zefd
dZ	dd Z
dddZdS )RepositoryTestCaseBase    TFc                 C   s(   |t u r| j}ttj| jd||dS )N
repository	exclusivecreate)UNSPECIFIEDr   r   ospathjointmppath)selfr   r    r&   =usr/lib/python3.10/site-packages/borg/testsuite/repository.pyopen   s   zRepositoryTestCaseBase.openc                 C   s&   t  | _| jdd| _| j  d S )NT)r   )tempfilemkdtempr$   r(   r   	__enter__r%   r&   r&   r'   setUp"   s   
zRepositoryTestCaseBase.setUpc                 C   s    | j d d d  t| j d S N)r   __exit__shutilrmtreer$   r,   r&   r&   r'   tearDown'   s   zRepositoryTestCaseBase.tearDownc                 C   s,   | j d d d  | j|d| _ | j   d S )Nr   )r   r/   r(   r+   )r%   r   r&   r&   r'   reopen+   s   zRepositoryTestCaseBase.reopenc                 C   s|   | j tdd | j tdd | j tdd | j jdd | j tdd | j td	d
 | j td d S )Nr      foor      bar   Fcompacts   bar2r   s   boo)r   putr   commitdeleter,   r&   r&   r'   add_keys0   s   zRepositoryTestCaseBase.add_keysNc           
   
   C   s   |d ur|d nd}dd t dD }d|d < tdtdtd	i}| jj D ]"\}}| jj|D ]\}}}}	td
||| || |||	f  q0q%t  d S )Nz:  c                 S   s   i | ]}t ||qS r&   r   ).0ir&   r&   r'   
<dictcomp>;       z4RepositoryTestCaseBase.repo_dump.<locals>.<dictcomp>
   r:   delZcommz%s%s H(%d) -> %s[%d..+%d])	ranger   r   r   r   iosegment_iteratoriter_objectsprint)
r%   labelZH_transZ	tag_transsegmentfntagkeyoffsetsizer&   r&   r'   	repo_dump9   s   "
z RepositoryTestCaseBase.repo_dumpr.   )__name__
__module____qualname__Zkey_sizer   r    r(   r-   r2   r4   r=   rR   r&   r&   r&   r'   r      s    	r   c                   @   sT   e Z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S )RepositoryTestCasec                    s   t dD ]}jt|d qtd j d j  tj	 fdd jj
dd j   ,tj	 fdd t dD ]}|dkrXqQt|d qQW d    d S 1 sow   Y  d S )	Nd      SOMEDATA2   c                      s   j  S r.   )r   getr&   )key50r%   r&   r'   <lambda>L   s    z*RepositoryTestCase.test1.<locals>.<lambda>Fr8   c                      s
     S r.   )rZ   r&   )r[   repository2r&   r'   r\   P      
 )rF   r   r:   r   assert_equalrZ   r<   assert_raisesr   ObjectNotFoundr;   closer(   )r%   xr&   )r[   r]   r%   r'   test1F   s    

"zRepositoryTestCase.test1c                 C   s~   | j tdd | j tdd | j jdd | j td | j tdd | j jdd | | j tdd dS )z.Test multiple sequential transactions
        r   r5   r   Fr8   r6   N)r   r:   r   r;   r<   r_   rZ   r,   r&   r&   r'   test2V   s   zRepositoryTestCase.test2c                    s    j tdd   j tdd  j tdd   j tdd  j tdd   j tdd  j td  tj fdd dS )zTest cache consistency
        r   r5      foo2r6   c                      s    j tdS Nr   r   rZ   r   r&   r,   r&   r'   r\   k   s    z5RepositoryTestCase.test_consistency.<locals>.<lambda>N)	r   r:   r   r_   rZ   r<   r`   r   ra   r,   r&   r,   r'   test_consistencya   s   z#RepositoryTestCase.test_consistencyc                 C   s   | j tdd | | j tdd | j jdd | j tdd | | j tdd | j   | | j tdd dS ) Test cache consistency2
        r   r5   Fr8   rf   N)r   r:   r   r_   rZ   r;   rollbackr,   r&   r&   r'   test_consistency2m   s   
z$RepositoryTestCase.test_consistency2c                 C   sN   | j tdd | j tdd | j jdd | | j tdd dS )rj   r   r5   rf   Fr8   N)r   r:   r   r;   r_   rZ   r,   r&   r&   r'   "test_overwrite_in_same_transactionx   s   z5RepositoryTestCase.test_overwrite_in_same_transactionc                 C      | j tdd | j jdd | j   |  | _ | j  | j tdd | j jdd W d    n1 s8w   Y  |  | _ | j  | j td | j jdd W d    d S 1 s`w   Y  d S Nr   r5   Fr8   r6   r   r:   r   r;   rb   r(   r<   r,   r&   r&   r'   test_single_kind_transactions      


"z0RepositoryTestCase.test_single_kind_transactionsc                 C   s   t dD ]}| jt|d q| jjdd | j }| t|d | jjdd}| t|d | ||d d  | jj|d d}| t|d | ||dd   | t| jjddd d S 	NrW   rX   Fr8   rY   )limitrD   )marker)rF   r   r:   r   r;   listr_   lenr%   rc   allZ
first_halfZsecond_halfr&   r&   r'   	test_list   s   
zRepositoryTestCase.test_listc                 C   s   t dD ]}| jt|d q| jjdd | j }t|dks$J | jjdd}t|dks3J ||d d ks=J | jj|d d}t|dksNJ ||dd  ksXJ t| jjdddkseJ t dD ]}|| t|ksuJ qid S rs   )rF   r   r:   r   r;   scanrw   rx   r&   r&   r'   	test_scan   s   
zRepositoryTestCase.test_scanc                    sL   dt   jtd  jtd  t fdd d S )N   xr   c                      s   j td d S )Nr   r}   )r   r:   r   r&   Zmax_datar%   r&   r'   r\      rB   z7RepositoryTestCase.test_max_data_size.<locals>.<lambda>)r   r   r:   r   r_   rZ   r`   r   r,   r&   r~   r'   test_max_data_size   s   z%RepositoryTestCase.test_max_data_sizeN)rS   rT   rU   rd   re   ri   rl   rm   rq   rz   r|   r   r&   r&   r&   r'   rV   D   s    rV   c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )LocalRepositoryTestCasec                 C   s`   | j jd dks
J | j jd dksJ | j jd dksJ | j d | j jd dks.J d S )Nr   rY   r   	   r   )   )r   r9   _rebuild_sparser,   r&   r&   r'   _assert_sparse   s
   z&LocalRepositoryTestCase._assert_sparsec                 C   sP   | j tdd | j tdd | j jdd | j tdd |   d S )Nr   r5   r   	   123456789Fr8   r6   )r   r:   r   r;   r   r,   r&   r&   r'   test_sparse1   s
   z$LocalRepositoryTestCase.test_sparse1c                 C   sN   | j tdd | j tdd | j jdd | j td |   d S )Nr   r5   r   r   Fr8   )r   r:   r   r;   r<   r   r,   r&   r&   r'   test_sparse2   s
   z$LocalRepositoryTestCase.test_sparse2c                 C   s   | j tdd | j td | j jj  | j jd dks"J | j d | j jd dt	t
 ks6J | j jdd ddd | j j D vsLJ d S )Nr   s   1245V   Tr8   c                 S   s   g | ]\}}|qS r&   r&   )r?   rL   _r&   r&   r'   
<listcomp>       z>LocalRepositoryTestCase.test_sparse_delete.<locals>.<listcomp>)r   r:   r   r<   rG   Z	_write_fdsyncr9   r   rw   r   r;   rH   r,   r&   r&   r'   test_sparse_delete   s   "z*LocalRepositoryTestCase.test_sparse_deletec                 C   s   | j tdd | j jdd | j j }t| j j|d d}|t	d  W d    n1 s4w   Y  | j 
  |  | _ | j  | j tdd | j jd	d W d    d S 1 sbw   Y  d S )
Nr   r5   Fr8   r   wbs   crapcrapcrapr6   T)r   r:   r   r;   rG   get_latest_segmentr(   Zsegment_filenamewriter   rb   )r%   last_segmentfr&   r&   r'   test_uncommitted_garbage   s   

"z0LocalRepositoryTestCase.test_uncommitted_garbageN)rS   rT   rU   r   r   r   r   r   r&   r&   r&   r'   r      s    
r   c                   @   sd   e Z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S )RepositoryCommitTestCasec                 C   sn   |    t| jjD ]}|drttj| jj| q|   | 	t
| jd | 	| j d d S )Nindex.r7   T)r=   r!   listdirr   r"   
startswithunlinkr#   r4   r_   rw   check)r%   namer&   r&   r'   test_replay_of_missing_index   s   
z5RepositoryCommitTestCase.test_replay_of_missing_indexc                 C   sf   |    d | j_z	| jjdd W n	 ty   Y nw |   | t| jd | | j d d S )NTr8   r7   )	r=   r   compact_segmentsr;   	TypeErrorr4   r_   rw   r   r,   r&   r&   r'   "test_crash_before_compact_segments      z;RepositoryCommitTestCase.test_crash_before_compact_segmentsc                 C   sf   |    d | j_z	| jjdd W n	 ty   Y nw |   | t| jd | | j d d S NFr8   r7   T)	r=   r   Zwrite_indexr;   r   r4   r_   rw   r   r,   r&   r&   r'   test_crash_before_write_index  r   z6RepositoryCommitTestCase.test_crash_before_write_indexc              	      s       t jjD ]}|drttj jj| qtj	t
dtd8} jd d  j  t fdd |  W d    n1 sJw   Y  W d    d S W d    d S 1 sbw   Y  d S )Nr   upgradeside_effectr3   c                      
   t  jS r.   rw   r   r&   r,   r&   r'   r\     r^   zGRepositoryCommitTestCase.test_replay_lock_upgrade_old.<locals>.<lambda>r=   r!   r   r   r"   r   r   r#   r   objectr   r	   r4   r`   assert_called_once_withr%   r   r   r&   r,   r'   test_replay_lock_upgrade_old     

"z5RepositoryCommitTestCase.test_replay_lock_upgrade_oldc              	      s       t jjD ]}|drttj jj| qtj	t
dtd8} jdd  j  t fdd |  W d    n1 sJw   Y  W d    d S W d    d S 1 sbw   Y  d S )Nr   r   r   Fr3   c                      r   r.   r   r&   r,   r&   r'   r\   *  r^   zCRepositoryCommitTestCase.test_replay_lock_upgrade.<locals>.<lambda>r   r   r&   r,   r'   test_replay_lock_upgrade   r   z1RepositoryCommitTestCase.test_replay_lock_upgradec                 C   sz   |    d | jj_z	| jjdd W n	 ty   Y nw |   | t| jd | | j	 d | t| jd d S r   )
r=   r   rG   delete_segmentr;   r   r4   r_   rw   r   r,   r&   r&   r'   -test_crash_before_deleting_compacted_segments-  s   
zFRepositoryCommitTestCase.test_crash_before_deleting_compacted_segmentsc                 C   s:   | j tdtj |   | j j}|| rJ d S rg   )	r   r:   r   r   ZCOMMITr4   rG   Zis_committed_segmentr   )r%   rG   r&   r&   r'   test_ignores_commit_tag_in_data9  s   z8RepositoryCommitTestCase.test_ignores_commit_tag_in_datac           	      C   s  | j tdd | j tdd | j jdd | d | j td | j jdd | d	 | j j d }d
}| j j|D ]\}}}}|t	krY|tdksUJ |d7 }qC|dks`J || j j
v shJ | j tdd | j jdd | d || j j
vsJ | j j|rJ | j j D ] \}}| j j|D ]\}}}}|t	ksJ |tdksJ qqtd| j jvsJ d S )Nr      1r      2Fr8   zp1 p2 cTzd1 ccr   r7      3zp3 cc)r   r:   r   r;   rR   r<   rG   r   rI   r   r9   segment_existsrH   shadow_index)	r%   r   Znum_deletesrN   rO   rP   rQ   rL   r   r&   r&   r'   test_moved_deletes_are_tracked?  s6   


z7RepositoryCommitTestCase.test_moved_deletes_are_trackedc                 C   s  | j jj}| j tdd | }| j jdd | j td | j tdd | }| j j|= | j j|= | j jdd | j td | j jdd | j j|sUJ | j j|r^J td| j vsgJ t	
t	j| j jd|   td| j vsJ d S Nr   r   Fr8   r   Tzindex.%dr   rG   r   r:   r   r;   r<   r9   r   r!   r   r"   r#   r%   r   Zput_segmentr   r&   r&   r'   $test_shadowed_entries_are_preserved1\  s"   


z=RepositoryCommitTestCase.test_shadowed_entries_are_preserved1c                 C   s  | j jj}| j tdd | }| j jdd | j tdd | j td | j tdd | }| j j|= | j j|= | j jdd | j td | j jdd | j j|s^J | j j|rgJ td| j vspJ t	
t	j| j jd|   td| j vsJ d S r   r   r   r&   r&   r'   $test_shadowed_entries_are_preserved2  s$   


z=RepositoryCommitTestCase.test_shadowed_entries_are_preserved2c                 C   s   | j tdd | j td | j jtd dgksJ | j jdd | d | j jtd g ks6J | j tdd | j td | d | j jtd dgksYJ | j   | d	 | j td
d | j jtd g ksxJ d S )Nr   r   r   Tr8   zp1 d1 cczp1 d1   rr   )r   r:   r   r<   r   r;   rR   rk   r,   r&   r&   r'   test_shadow_index_rollback  s   



z3RepositoryCommitTestCase.test_shadow_index_rollbackN)rS   rT   rU   r   r   r   r   r   r   r   r   r   r   r   r&   r&   r&   r'   r      s    	#0r   c                   @   s&   e Zd Zd	ddZdd Zdd ZdS )
RepositoryAppendOnlyTestCaseFc                 C   s   t tj| jdd|ddS )Nr   T)r   r   append_only)r   r!   r"   r#   r$   r%   r   r&   r&   r'   r(     s   z!RepositoryAppendOnlyTestCase.openc                 C   sD   |  t | j  W d    n1 sw   Y  | jjs J d S r.   )r`   
ValueErrorr   Zdestroyr   r,   r&   r&   r'   test_destroy_append_only  s   z5RepositoryAppendOnlyTestCase.test_destroy_append_onlyc                    s    fdd} j tdd  j jdd d j _| dks!J  j tdd  j jdd | dks8J d j _| dksCJ  j tdd  j jdd | d	ksZJ d S )
Nc                      s   t t jj S r.   )rw   rv   r   rG   rH   r&   r,   r&   r'   segments_in_repository     zMRepositoryAppendOnlyTestCase.test_append_only.<locals>.segments_in_repositoryr   r5   Fr8   r   Tr   )r   r:   r   r;   r   )r%   r   r&   r,   r'   test_append_only  s   z-RepositoryAppendOnlyTestCase.test_append_onlyNF)rS   rT   rU   r(   r   r   r&   r&   r&   r'   r     s    
r   c                   @      e Zd Zdd Zdd ZdS )RepositoryFreeSpaceTestCasec                 C   s   |    | jjddd | jd |   | jtdd t	t
j | jjdd W d    n1 s8w   Y  tj| jjsGJ d S )	Nr   additional_free_spaceZ1000Ts   shortcut to save_configr      foobarFr8   )r=   r   configsetZsave_keyr4   r:   r   pytestraisesr   InsufficientFreeSpaceErrorr;   r!   r"   existsr,   r&   r&   r'   test_additional_free_space  s   z6RepositoryFreeSpaceTestCase.test_additional_free_spacec                 C   sT   d| j _ttj |   W d    n1 sw   Y  tj	| j jr(J d S )Ng@xD)
r   r   r   r   r   r   r=   r!   r"   r   r,   r&   r&   r'   test_create_free_space  s
   
z2RepositoryFreeSpaceTestCase.test_create_free_spaceN)rS   rT   rU   r   r   r&   r&   r&   r'   r     s    
r   c                   @   r   )QuotaTestCasec                 C   s   | j jdksJ | j tdtd | j jdksJ | j tdtd | j jdks.J | j td | j jdks>J | j jdd	 | j jdksMJ |   | j td
d | j td
 | j jdksjJ | j jdd	 | j jdksyJ d S )Nr   r   i  i  r   i.  iR  Fr8   r7       i{  TiW  )r   storage_quota_user:   r   bytesr<   r;   r4   r,   r&   r&   r'   test_tracking  s   zQuotaTestCase.test_trackingc                 C   s4  | j jdksJ d| j _| j tdd | j jdksJ | j jdd ttj	 | j tdd W d    n1 s>w   Y  | j jd	ksKJ ttj	 | j jdd W d    n1 scw   Y  | j jd	kspJ | 
  d
| j _| j tdd | j jd	ksJ | j jdd | j jdksJ d S )Nr   rY   r   r   r   Fr8   r   R   rW   T)r   r   storage_quotar:   r   r;   r   r   r   ZStorageQuotaExceededr4   r,   r&   r&   r'   test_exceed_quota  s&   zQuotaTestCase.test_exceed_quotaN)rS   rT   rU   r   r   r&   r&   r&   r'   r     s    r   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
NonceReservationc              	   C   s|   | j dd tt) | j | j  W d    n1 sw   Y  W d    d S W d    d S 1 s7w   Y  d S )NFr3   )r4   r   r   AssertionErrorr   get_free_noncer,   r&   r&   r'   test_get_free_nonce_asserts  s   "z,NonceReservation.test_get_free_nonce_assertsc              	   C   s   | j f | j  d u sJ ttj| j jdd}|d W d    n1 s)w   Y  | j  dks7J ttj| j jdd}|d W d    n1 sSw   Y  | j  dksaJ W d    d S 1 slw   Y  d S )NnoncewZ0000000000000000r   Z5000000000000000l            )r   r   r(   r!   r"   r#   r   r%   fdr&   r&   r'   test_get_free_nonce#  s   "z$NonceReservation.test_get_free_noncec              	   C   s   | j dd tt+ | j | jdd W d    n1 s!w   Y  W d    d S W d    d S 1 s9w   Y  d S )NFr3         )r4   r   r   r   r   commit_nonce_reservationr,   r&   r&   r'   %test_commit_nonce_reservation_asserts/  s   "z6NonceReservation.test_commit_nonce_reservation_assertsc              	   C   sT  | j  tt | j dd W d    n1 sw   Y  | j dd  ttj| j jd}|	 dks;J W d    n1 sEw   Y  tt | j dd W d    n1 saw   Y  | j dd ttj| j jd}|	 dksJ W d    n1 sw   Y  W d    d S W d    d S 1 sw   Y  d S )Nr      r   Z0000000000000200i   Z0000000000000400)
r   r   r   	Exceptionr   r(   r!   r"   r#   readr   r&   r&   r'   test_commit_nonce_reservation5  s$   "z.NonceReservation.test_commit_nonce_reservationN)rS   rT   rU   r   r   r   r   r&   r&   r&   r'   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dd  Z  ZS )!%RepositoryAuxiliaryCorruptionTestCasec                    s8   t    | jtdd | jjdd | j  d S )Nr   r5   Fr8   )superr-   r   r:   r   r;   rb   r,   	__class__r&   r'   r-   G  s   
z+RepositoryAuxiliaryCorruptionTestCase.setUpc                 C   sL   | j  | j tdd | j jdd W d    d S 1 sw   Y  d S )Nr   s   foxFr8   r   r:   r   r;   r,   r&   r&   r'   	do_commitM  s   "z/RepositoryAuxiliaryCorruptionTestCase.do_commitc                 C   N   t tj| jjdd}|d W d    n1 sw   Y  |   d S )Nhints.1abr   r(   r!   r"   r#   r   r   r   r   r&   r&   r'   test_corrupted_hintsR     z:RepositoryAuxiliaryCorruptionTestCase.test_corrupted_hintsc                 C   $   t t j| jjd |   d S Nr   r!   r   r"   r#   r   r   r,   r&   r&   r'   test_deleted_hintsW     z8RepositoryAuxiliaryCorruptionTestCase.test_deleted_hintsc                 C   r   Nindex.1r   r,   r&   r&   r'   test_deleted_index[  r   z8RepositoryAuxiliaryCorruptionTestCase.test_deleted_indexc                 C   ^   t j| jjd}t | t | | t |   W d    d S 1 s(w   Y  d S r   	r!   r"   r#   r   r   mkdirr`   OSErrorr   )r%   hintsr&   r&   r'   test_unreadable_hints_     


"z;RepositoryAuxiliaryCorruptionTestCase.test_unreadable_hintsc                 C   r   )Nr   r   r   r   r   r&   r&   r'   
test_indexf  r   z0RepositoryAuxiliaryCorruptionTestCase.test_indexc                 C   s   t tj| jjdd}|d W d    n1 sw   Y  | j t| jdks.J W d    d S 1 s9w   Y  d S )Nr   r   r   r   )r(   r!   r"   r#   r   r   rw   r   r&   r&   r'   test_index_outside_transactionk  s   "zDRepositoryAuxiliaryCorruptionTestCase.test_index_outside_transactionc                 C   s   t j| jjd}t|d=}| }ttdddA 	dd}|
td|}||ks/J t|t|ks9J |d || W d    d S 1 sNw   Y  d S )Nr   r+br   littler   r   )r!   r"   r#   r   r(   r   int
from_bytesr   to_bytesreplacerw   seekr   )r%   Z
index_pathr   Z
index_dataZcorrupted_keyZcorrupted_index_datar&   r&   r'   _corrupt_indexq  s   
"z4RepositoryAuxiliaryCorruptionTestCase._corrupt_indexc                 C   s^   |    | j t| jdksJ | jtddksJ W d    d S 1 s(w   Y  d S )Nr   r   r5   )r  r   rw   rZ   r   r,   r&   r&   r'   test_index_corrupted  s
   "z:RepositoryAuxiliaryCorruptionTestCase.test_index_corruptedc              	   C   s   |    tj| jjd}t| | j8 t| jdksJ tt	j
 | jtd W d    n1 s8w   Y  W d    d S W d    d S 1 sPw   Y  d S )Nintegrity.1r   r   )r  r!   r"   r#   r   r   rw   r   r   r   ra   rZ   r   )r%   integrity_pathr&   r&   r'   &test_index_corrupted_without_integrity  s   
"zLRepositoryAuxiliaryCorruptionTestCase.test_index_corrupted_without_integrityc                 C   r  r   r  )r%   indexr&   r&   r'   test_unreadable_index  r  z;RepositoryAuxiliaryCorruptionTestCase.test_unreadable_indexc                 C   s   t j| jjd}t|d}tddi| |  W d    n1 s%w   Y  | j t| jdks7J | j	t
ddksCJ W d    d S 1 sNw   Y  d S )Nr  r
  s   versiong@r   r   r5   )r!   r"   r#   r   r(   r   packtruncaterw   rZ   r   )r%   r  r   r&   r&   r'   test_unknown_integrity_version  s   
"zDRepositoryAuxiliaryCorruptionTestCase.test_unknown_integrity_versionc                 C   s4  | j J d| j _t| j dksJ | j tddksJ | j tdd | j tdd | j jdd	 | j tdd
 | j jdd	 W d    n1 sPw   Y  tj	| j jd}t
|d-}t|}|d |d d dksxJ d|d d< t|| |  W d    d S 1 sw   Y  d S )NTr   r   r5   r6   r   s   bazFr8      bazzzhints.5r
  s   segments)r   r   rw   rZ   r   r:   r;   r!   r"   r#   r(   r   unpackr  r  r  )r%   Z
hints_pathr   r  r&   r&   r'   _subtly_corrupted_hints_setup  s&   



"zCRepositoryAuxiliaryCorruptionTestCase._subtly_corrupted_hints_setupc                 C   s   |    | jJ d| j_| jtdd | jjdd t| jdks%J | jtddks1J | jtd	d
ks=J | jtddksIJ W d    d S 1 sTw   Y  d S )NFr7      1234Tr8   r   r   r5   r   r6   r   r  )r  r   r   r:   r   r;   rw   rZ   r,   r&   r&   r'   test_subtly_corrupted_hints  s   "zARepositoryAuxiliaryCorruptionTestCase.test_subtly_corrupted_hintsc              	   C   s   |    tj| jjd}t| | j; d| j_| jtdd t	
t}| jjdd W d    n1 s:w   Y  dt|jv sHJ W d    d S 1 sSw   Y  d S )Nzintegrity.5Fr7   r  Tr8   z!Corrupted segment reference count)r  r!   r"   r#   r   r   r   r:   r   r   r   r   r;   strvalue)r%   r  exc_infor&   r&   r'   -test_subtly_corrupted_hints_without_integrity  s   
"zSRepositoryAuxiliaryCorruptionTestCase.test_subtly_corrupted_hints_without_integrity)rS   rT   rU   r-   r   r   r   r   r  r  r	  r  r  r  r  r  r  r  r#  __classcell__r&   r&   r   r'   r   F  s"    
r   c                   @   s   e Zd Zdd Zd*ddZdd Zd	d
 Zdd Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)S )+RepositoryCheckTestCasec                 C   s    dd t t j| jdD S )Nc                 S   s   g | ]	}| d r|qS )r   )r   r?   r   r&   r&   r'   r     s    z8RepositoryCheckTestCase.list_indices.<locals>.<listcomp>r   )r!   r   r"   r#   r$   r,   r&   r&   r'   list_indices  s    z$RepositoryCheckTestCase.list_indicesFTc              	   C   sD   |  | jj|d| |  dd ttj| jdD g d d S )Nrepairc                 S   s   g | ]}d |v r|qS )tmpr&   r&  r&   r&   r'   r     s    z1RepositoryCheckTestCase.check.<locals>.<listcomp>r   zFound tmp files)r_   r   r   r!   r   r"   r#   r$   )r%   r)  statusr&   r&   r'   r     s   .zRepositoryCheckTestCase.checkc                 G   s   |D ]
}| j t| qd S r.   rh   )r%   idsid_r&   r&   r'   get_objects  s   z#RepositoryCheckTestCase.get_objectsc                 C   s8   |D ]}|D ]}| j t|d q| j jdd qd S )N   dataFr8   r   )r%   segmentsr,  r-  r&   r&   r'   add_objects  s
   z#RepositoryCheckTestCase.add_objectsc              
   C   s,   t dd ttj| jdddD d S )Nc                 s   s     | ]}|  rt|V  qd S r.   )isdigitr  )r?   nr&   r&   r'   	<genexpr>  s    z3RepositoryCheckTestCase.get_head.<locals>.<genexpr>r   data0rD   )sortedr!   r   r"   r#   r$   r,   r&   r&   r'   get_head  s   ,z RepositoryCheckTestCase.get_headc              	   C   s"   t tj| jdd|   S Nr   r   )r   r   r!   r"   r#   r$   r8  r,   r&   r&   r'   
open_index  s   "z"RepositoryCheckTestCase.open_indexc              	   C   sr   |   }|t| \}}ttj| jdddt|d}|| |	d W d    d S 1 s2w   Y  d S )Nr   r5  r6  r
  s   BOOM)
r:  r   r(   r!   r"   r#   r$   r   r  r   )r%   r-  idxrL   rP   r   r&   r&   r'   corrupt_object  s   "
"z&RepositoryCheckTestCase.corrupt_objectc                 C   s   | j j| d S r.   )r   rG   r   )r%   rL   r&   r&   r'   r     s   z&RepositoryCheckTestCase.delete_segmentc              	   C   s&   t t j| jdd|    d S r9  )r!   r   r"   r#   r$   r8  r,   r&   r&   r'   delete_index  s   &z$RepositoryCheckTestCase.delete_indexc              	   C   s6   t t j| jdd|   t j| jd| d S r9  )r!   renamer"   r#   r$   r8  )r%   new_namer&   r&   r'   rename_index   s   z$RepositoryCheckTestCase.rename_indexc                 C   s   dd | j  D S )Nc                 S   s   h | ]}t |qS r&   )r  )r?   rO   r&   r&   r'   	<setcomp>  r   z7RepositoryCheckTestCase.list_objects.<locals>.<setcomp>)r   rv   r,   r&   r&   r'   list_objects  r   z$RepositoryCheckTestCase.list_objectsc                    s     g dddgdgg  h d    jdd  d  t fdd	  j   jd
d  jd
d  jddd  	d  jdd  h d   d S )Nr   r   r7   r            r   r   r7   r   rD  rE  Tr+  c                      
     dS )NrD  r.  r&   r,   r&   r'   r\     r^   zGRepositoryCheckTestCase.test_repair_corrupted_segment.<locals>.<lambda>Fr)  r+  >   r   r   r7   r   rE  )
r1  r_   rB  r   r<  r`   r   r   rk   r.  r,   r&   r,   r'   test_repair_corrupted_segment  s   


z5RepositoryCheckTestCase.test_repair_corrupted_segmentc                 C   sp   |  g dg dg | h d|   | jdd | d | j  | jddd | h d|   d S )	NrC  r   rD  rE  rF  TrG  r   rJ     r   r   r7   )r1  r_   rB  r   r   r   rk   r,   r&   r&   r'   test_repair_missing_segment  s   

z3RepositoryCheckTestCase.test_repair_missing_segmentc                    sN     g dg dg  d  tj fdd  h d   d S )NrC  rL  r7   c                      rH  Nr   rI  r&   r,   r&   r'   r\   #  r^   zLRepositoryCheckTestCase.test_repair_missing_commit_segment.<locals>.<lambda>rM  )r1  r   r`   r   ra   r_   rB  r,   r&   r,   r'   "test_repair_missing_commit_segment   s   
z:RepositoryCheckTestCase.test_repair_missing_commit_segmentc                    s     g dg dg ttj jddddd}|dtj |d	 W d    n1 s0w   Y   	t
j fd
d  jdd  d  h d   d S )NrC  rL  r   r5  r6  3r
  rD      Xc                      rH  rO  rI  r&   r,   r&   r'   r\   +  r^   zNRepositoryCheckTestCase.test_repair_corrupted_commit_segment.<locals>.<lambda>TrG  r7   rM  )r1  r(   r!   r"   r#   r$   r  SEEK_ENDr   r`   r   ra   r   r.  r_   rB  r   r&   r,   r'   $test_repair_corrupted_commit_segment&  s   
z<RepositoryCheckTestCase.test_repair_corrupted_commit_segmentc                    s     g dg ttj jddddd}|dtj |d W d    n1 s-w   Y   	t
j fd	d
  jdd  jdd    dg  jddd    dg  jdd  d  h d   d S )NrC  r   r5  r6  1r
  rD   rR  c                      rH  rO  rI  r&   r,   r&   r'   r\   5  r^   z@RepositoryCheckTestCase.test_repair_no_commits.<locals>.<lambda>FrG  r   TrJ  zindex.2r7   rM  )r1  r(   r!   r"   r#   r$   r  rS  r   r`   r   CheckNeededr   r_   r'  r.  rB  r   r&   r,   r'   test_repair_no_commits0  s   
z.RepositoryCheckTestCase.test_repair_no_commitsc                 C   sL   |  g dg dg |   | jdd | d | h d|   d S )NrC  rL  TrG  r   rF  )r1  r=  r   r.  r_   rB  r,   r&   r&   r'   test_repair_missing_index?  s
   
z1RepositoryCheckTestCase.test_repair_missing_indexc                 C   sr   |  g dg dg | |  dg | d | jdd | |  dg | d | h d|   d S )	NrC  rL  zindex.3z	index.100TrG  r   rF  )r1  r_   r'  r@  r   r.  rB  r,   r&   r&   r'   test_repair_index_too_newF  s   

z1RepositoryCheckTestCase.test_repair_index_too_newc                 C   s   | j tdd | j tdd ttd}| j jdd |d W d    n1 s/w   Y  |   | j	dd | 
| j tdd d S )	Nr   r/  s   data2r   Tr8   g?r(  )r   r:   r   r   r   r   r;   r   r4   r   r_   rZ   )r%   r9   r&   r&   r'   test_crash_before_compactO  s   z1RepositoryCheckTestCase.test_crash_before_compactN)FT)rS   rT   rU   r'  r   r.  r1  r8  r:  r<  r   r=  r@  rB  rK  rN  rP  rT  rW  rX  rY  rZ  r&   r&   r&   r'   r%    s(    
	
	r%  c                   @   r   )RepositoryHintsTestCasec                 C   s  | j tdd | j td | j jdd | j j}| j j}| j j}|   | j tdd | 	|| j j | 	|| j j | j jd= | 	|| j j |   | 	| j j
dd	d |   | j tdd | 	|| j j | j jd= | 	|| j j d S )
Nr   r/  Fr8   *   r   r   Tr(  )r   r:   r   r<   r;   r   r9   r0  r4   r_   r   )r%   Zshadow_index_expectedZcompact_expectedZsegments_expectedr&   r&   r'   test_hints_persistence]  s&   

z.RepositoryHintsTestCase.test_hints_persistencec                 C   s   | j tdd | | j ji  t| j jdksJ | j td | j jdd | 	td| j j | t| j jtd d | 	d| j j | j tdd | j jdd	d
 | 
td| j j | 
d| j j | 
d| j j d S )Nr   r/  Fr8   r   r\  r   Tg        )r9   	threshold)r   r:   r   r_   r   rw   r9   r<   r;   Z	assert_inZassert_not_inr0  r,   r&   r&   r'   test_hints_behaviourx  s   z,RepositoryHintsTestCase.test_hints_behaviourN)rS   rT   rU   r]  r_  r&   r&   r&   r'   r[  [  s    r[  c                   @   sB   e Zd ZdZdddZdd Zdd Zd	d
 Zdd Zdd Z	dS )RemoteRepositoryTestCaseNFc                 C   "   t tdtj| jd d|dS N__testsuite__:r   Tr   r
   r   r!   r"   r#   r$   r   r&   r&   r'   r(        zRemoteRepositoryTestCase.openc                 C   s   G dd d}| S )Nc                   @   s$   e Zd ZdZdZg ZdZdd ZdS )z9RemoteRepositoryTestCase._get_mock_args.<locals>.MockArgsborg?   Nc                 S   s
   t | |S r.   )hasattr)r%   itemr&   r&   r'   __contains__  s   
zFRemoteRepositoryTestCase._get_mock_args.<locals>.MockArgs.__contains__)rS   rT   rU   remote_pathumaskdebug_topicsrshrj  r&   r&   r&   r'   MockArgs  s    ro  r&   )r%   ro  r&   r&   r'   _get_mock_args  s   
z'RemoteRepositoryTestCase._get_mock_argsc                    s     t fdd d S )Nc                      s    j di S )N__init__)r   callr&   r,   r&   r'   r\     s    z;RemoteRepositoryTestCase.test_invalid_rpc.<locals>.<lambda>)r`   r   r,   r&   r,   r'   test_invalid_rpc  s   z)RemoteRepositoryTestCase.test_invalid_rpcc              
   C   sj  d}z| j dddi W n( tjy5 } zt|jdksJ |jd | j jjks+J W Y d }~nd }~ww z| j dddi W n( tjyi } zt|jdksSJ |jd | j jjks_J W Y d }~nd }~ww z| j dddi W n( tj	y } zt|jdksJ |jd | j jjksJ W Y d }~nd }~ww z| j ddd	i W n$ t
y } zt|jdksJ |jd |ksJ W Y d }~nd }~ww z| j ddd
i W n$ ty } zt|jdksJ |jd dksJ W Y d }~nd }~ww z| j dddi W n5 tjy> } z't|jdksJ |jd |ks'J |jd | j jjks4J W Y d }~nd }~ww z| j dddi W n' tyq } zt|jdks]J |jd |ksgJ W Y d }~nd }~ww z| j dddi W d S  tjy } z(|jsJ | dksJ |jdksJ t|jdksJ W Y d }~d S d }~ww )Nztest stringZinject_exceptionkindDoesNotExistr   r   AlreadyExistsrV  r   r   foora   r   r   dividez6ZeroDivisionError: integer division or modulo by zero
ZeroDivisionError)r   rr  r   ru  rw   argslocation	processedrv  rV  r   r   ra   r   r
   ZRPCErrorZunpackedZget_messageZexception_classZexception_full)r%   s1er&   r&   r'   test_rpc_exception_transport  sx   $$$& "z5RemoteRepositoryTestCase.test_rpc_exception_transportc                 C   s   |   }|| j_| jtdddgksJ | jtdddgks$J | jtdddgks2J | jtdg dks@J d	tjd
< | jtdg dksSJ d S )Nexample.com:foosshexample.comzssh://example.com/foozssh://user@example.com/foouser@example.comzssh://user@example.com:1234/foo)r  z-pZ1234r  z	ssh --fooZBORG_RSH)r  z--foor  )rp  r   _argsssh_cmdr   r!   environr%   rz  r&   r&   r'   test_ssh_cmd  s   
 z%RemoteRepositoryTestCase.test_ssh_cmdc                 C   s  | j jd ddtjdddgksJ |  }t tj | j j|ddg dks+J d|_	| j j|ddg d	ks<J d
dg|_
| j j|ddg dksOJ |  }d|_| j j|ddg dksdJ d|_| j j|ddg dksuJ d|_|| j _| j tdg dksJ d S )NT)testingz-mzborg.archiverserveF)rf  r  --infoborg-0.28.2)r  r  r  Zsomething_client_sideZrepository_compaction)r  r  r  z.--debug-topic=borg.debug.repository_compactionr   i)rf  r  r  z--storage-quota=314159265z
ssh -i foor  )r  z-irw  r  )r   Zborg_cmdsys
executablerp  logging	getLoggersetLevelINFOrk  rm  r   rn  r  r  r   r  r&   r&   r'   test_borg_cmd  s    "
 z&RemoteRepositoryTestCase.test_borg_cmdr   )
rS   rT   rU   r   r(   rp  rs  r  r  r  r&   r&   r&   r'   r`    s    
6
r`  c                   @   s   e Zd ZdddZdd ZdS )RemoteLegacyFreeFc                 C   sT   t tdd ttdtj| jd d|dW  d    S 1 s#w   Y  d S )NZ
dictFormatTrc  r   r   )r   r   r
   r   r!   r"   r#   r$   r   r&   r&   r'   r(     s
   $zRemoteLegacyFree.openc                 C   rn   ro   rp   r,   r&   r&   r'   test_legacy_free  rr   z!RemoteLegacyFree.test_legacy_freeNr   )rS   rT   rU   r(   r  r&   r&   r&   r'   r    s    
r  c                   @   s.   e Zd ZdddZdd Zdd Zdd	 Zd
S )RemoteRepositoryCheckTestCaseFc                 C   ra  rb  rd  r   r&   r&   r'   r(     re  z"RemoteRepositoryCheckTestCase.openc                 C      d S r.   r&   r,   r&   r&   r'   rZ       z7RemoteRepositoryCheckTestCase.test_crash_before_compactc                 C   r  r.   r&   r,   r&   r&   r'   rP    r  z@RemoteRepositoryCheckTestCase.test_repair_missing_commit_segmentc                 C   r  r.   r&   r,   r&   r&   r'   rN     r  z9RemoteRepositoryCheckTestCase.test_repair_missing_segmentNr   )rS   rT   rU   r(   rZ  rP  rN  r&   r&   r&   r'   r    s
    
r  c                   @   sL   e Z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S )RemoteLoggerTestCasec                 C   s|   t  | _t| j| _| jgt jd d < g tdjd d < g tdjd d < tj	
  tj	| _t   | _	t_	d S )Nborg.repositoryborg.repository.foo)rG   StringIOstreamr  StreamHandlerhandlerr  handlersr  stderrflush
old_stderrr,   r&   r&   r'   r-   &  s   

zRemoteLoggerTestCase.setUpc                 C   s   | j t_d S r.   )r  r  r  r,   r&   r&   r'   r2   1  s   zRemoteLoggerTestCase.tearDownc                 C   0   t d | | j d | | j d d S )Nzunstructured stderr message
r>   z$Remote: unstructured stderr message
r   r_   r  getvaluer  r,   r&   r&   r'   test_stderr_messages4     z)RemoteLoggerTestCase.test_stderr_messagesc                 C   r  )Nz%unstructured stderr progress messager>   z-Remote: unstructured stderr progress messager  r,   r&   r&   r'   test_stderr_progress_messages:  r  z2RemoteLoggerTestCase.test_stderr_progress_messagesc                 C   N   | j tj t tj td | | j d | | j	 d d S )Nz,$LOG INFO Remote: borg < 1.1 format message
z"Remote: borg < 1.1 format message
r>   
r  r  r  DEBUGr  r   r_   r  r  r  r,   r&   r&   r'   test_pre11_format_messages@  
   z/RemoteLoggerTestCase.test_pre11_format_messagesc                 C   r  )Nz=$LOG INFO borg.repository Remote: borg >= 1.1 format message
z#Remote: borg >= 1.1 format message
r>   r  r,   r&   r&   r'   test_post11_format_messagesH  r  z0RemoteLoggerTestCase.test_post11_format_messagesc                 C   sN   | j tj t tj td | | j d | | j	 d d S )Nz:$LOG INFO borg.repository Remote: new format info message
r>   )
r  r  r  WARNINGr  r   r_   r  r  r  r,   r&   r&   r'   test_remote_messages_screenedP  s
   z2RemoteLoggerTestCase.test_remote_messages_screenedc                 C   s   t dt j t dt j | jt j t  t j t }t |}|t j |gt dj	d d < t }t |}|t j |gt dj	d d < t
d | | d | | d | | j d | | j d d S )Nr  r  z;$LOG INFO borg.repository Remote: new format child message
r>   z!Remote: new format child message
)r  r  r  r  r  r  rG   r  r  r  r   r_   r  r  r  )r%   Zchild_streamZchild_handlerZ
foo_streamZfoo_handlerr&   r&   r'    test_info_to_correct_local_childY  s"   

z5RemoteLoggerTestCase.test_info_to_correct_local_childN)rS   rT   rU   r-   r2   r  r  r  r  r  r  r&   r&   r&   r'   r  %  s    	r  )4rG   r  r!   r0   r  r)   Zunittest.mockr   r   Z	hashindexr   helpersr   r   r   Zlockingr   r	   Zremoter
   r   r   r   r   r   r   r   r   r   r   r   r   r>   r   r   r   r    r   rV   r   r   r   r   r   r   r   r%  r[  r`  r  r  r  r&   r&   r&   r'   <module>   sH    $+s; R(*  0n