o
    +ke.$                     @   s   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 dd
lmZ ddlmZmZ ddlmZ ddlmZ G dd dZG dd dZdS )    N   )packb   )H)TestKey)
Statistics
AdHocCache)CompressionSpec)RepoKey)
ChunkIndexCacheSynchronizer)Manifest)
Repositoryc                   @   s:  e Zd Zejdd Zejdd Zdd Zdd Zd	d
 Z	ej
jdddidfedddgfdddddfg ddej
ddd dd dd fdd Zej
d d!ed"dd#d$fgid%fd!ed"dfgid%fd!d&gid'fd!ded"dfgid'fd!ed"d(dfgid)ffd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4S )5TestCacheSynchronizerc                 C   s   t  S N)r   )self r   8usr/lib/python3.10/site-packages/borg/testsuite/cache.pyindex   s   zTestCacheSynchronizer.indexc                 C   s   t |S r   )r   )r   r   r   r   r   sync   s   zTestCacheSynchronizer.syncc                 C   s.   t ddddg d}|| t|rJ d S )Nbar  .  chunksZfooZbazr   userr   )r   feedlenr   r   r   datar   r   r   test_no_chunks   s   
z$TestCacheSynchronizer.test_no_chunksc              	   C   sr   t ddddtdddftdddfgd}|| t|dks#J |td d	ks-J |td d
ks7J d S )Nr   r   r   r   r   r      r   r   r   r   r   r   r"   r   r   r   r   r   r   r   r   test_simple'   s   

z!TestCacheSynchronizer.test_simplec              	   C   sD  t ddddtdddftdddfgd}|t dd	d
dgd7 }|t dd	d
tdddftdddfgdgd7 }|t dtdddfgi7 }|t dtdddfgi7 }|d d }|dd }|dd  }|| || || t|dksJ |td dksJ |td dksJ |td dksJ d S )Nr   r   r   r   r   r   r"   r   Z123456)zsecurity.foor   r$   )xattrsstuff)r'   r   r(   F   x   )r"   r   r   )r   r   r"   r#   r%   )r   r   r   r    Zpart1Zpart2Zpart3r   r   r   test_multiple7   s\   

	



z#TestCacheSynchronizer.test_multiplez
elem,errorr   r   zUnexpected object: map   z$Unexpected bytes in chunks structurezIncorrect key length)r   Unexpected object: integer)      ?Unexpected object: double)TzUnexpected object: true)FzUnexpected object: false)NzUnexpected object: nil)mapbytesintZdoubletruefalsenone)Zids	structurec                 C   s   d| iS Nr   r   elemr   r   r   <lambda>z   s    zTestCacheSynchronizer.<lambda>c                 C   s
   d| giS r7   r   r8   r   r   r   r:   {   s   
 c                 C   s   d| ddfgiS )Nr   r   r   r   r8   r   r   r   r:   |   s    c                 C   st   t ||}tt}|| W d    n1 sw   Y  t|tr(|g}dd |D }t|j|v s8J d S )Nc                 S   s   g | ]}d | qS )cache_sync_feed failed: r   ).0errorr   r   r   
<listcomp>   s    z8TestCacheSynchronizer.test_corrupted.<locals>.<listcomp>)r   pytestraises
ValueErrorr   
isinstancestrvalue)r   r   r6   r9   r=   packedexcinfoZpossible_errorsr   r   r   test_corruptedn   s   
z$TestCacheSynchronizer.test_corruptedz
data,errorr       r"      zInvalid chunk list entry lengthr$   r-   r.   r/   c                 C   sV   t |}tt}|| W d    n1 sw   Y  t|jd| ks)J d S )Nr;   )r   r?   r@   rA   r   rC   rD   )r   r   r   r    r=   rE   rF   r   r   r   test_corrupted_ancillary   s
   
z.TestCacheSynchronizer.test_corrupted_ancillaryc                 C   s   t  }|d |ddd |ddd |ddd |ddd |td ||dd |ddd |d	dd |d t|}|S )
Ns   BORG_IDXr   rI   littlerH      r   r   r   )ioBytesIOwriteto_bytesr   seekr   read)r   ZrefcountZ
index_datar   r   r   r   make_index_with_refcount   s   


z.TestCacheSynchronizer.make_index_with_refcountc                 C   sz   |  tjd }t|}tdtdddfgi}tt}|	| W d    n1 s-w   Y  t
|jdks;J d S )Nr   r   r   r   z/cache_sync_feed failed: invalid reference count)rS   r   	MAX_VALUEr   r   r   r?   r@   rA   r   rC   rD   )r   r   r   r    rF   r   r   r   test_corrupted_refcount   s   z-TestCacheSynchronizer.test_corrupted_refcountc                 C   sV   |  tj}t|}tdtdddfgi}|| |td tjddfks)J d S )Nr   r   r   r   r   r   rS   r   rT   r   r   r   r   r   r   r   r   test_refcount_max_value   s   
 z-TestCacheSynchronizer.test_refcount_max_valuec                 C   s   |  tjd }t|}tdtdddfgi}|| |td tjddfks+J || |td tjddfks>J d S )Nr   r   r   r   r   r   rV   r   r   r   r   !test_refcount_one_below_max_value   s   

 z7TestCacheSynchronizer.test_refcount_one_below_max_valueN)__name__
__module____qualname__r?   fixturer   r   r!   r&   r+   ZmarkZparametrizer1   rG   rJ   rS   rU   rW   rX   r   r   r   r   r      sP    

7

	
	r   c                   @   s   e Z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	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 )TestAdHocCachec                 c   sp    t jt|d| _t| jddd}|tdd |tj	d |V  W d    d S 1 s1w   Y  d S )N
repositoryT)Z	exclusivecreater      1234   5678)
ospathjoinrC   Zrepository_locationr   putr   r   MANIFEST_ID)r   Ztmpdirr^   r   r   r   r^      s   "zTestAdHocCache.repositoryc                 C   s,   | dd t|t }tdj|_|S )NZBORG_PASSPHRASEtestr5   )Zsetenvr   r_   r   ZMockArgsr
   Z
compressor)r   r^   Zmonkeypatchkeyr   r   r   rh      s   zTestAdHocCache.keyc                 C   s$   t ||  t j||t jdd S )N)rh   Z
operationsr   )r   rO   loadZNO_OPERATION_CHECK)r   r^   rh   r   r   r   manifest   s   zTestAdHocCache.manifestc                 C   s   t |||S r   r   )r   r^   rh   rj   r   r   r   cache   s   zTestAdHocCache.cachec                 C   s   | tjrJ d S r   )
seen_chunkr   rf   r   rk   r   r   r   test_does_not_contain_manifest   s   z-TestAdHocCache.test_does_not_contain_manifestc                 C   sD   | tdtjksJ |tdt  |tddks J d S )Nr   r`   )rl   r   r   rT   chunk_decrefr   get)r   r^   rk   r   r   r   $test_does_not_delete_existing_chunks   s   z3TestAdHocCache.test_does_not_delete_existing_chunksc                 C   sH   t t |jtddt dd W d    d S 1 sw   Y  d S )Nr   ra   T)Z	overwrite)r?   r@   AssertionError	add_chunkr   r   rm   r   r   r   test_does_not_overwrite   s   "z&TestAdHocCache.test_does_not_overwritec                 C   s*   | tddt tdddfksJ d S )Nr   ra   rI   r   )rs   r   r   rm   r   r   r   test_seen_chunk_add_chunk_size   s   *z-TestAdHocCache.test_seen_chunk_add_chunk_sizec                 C   s   | tddt  |tddksJ |tdt  |tdr'J ttj |	td W d   dS 1 s@w   Y  dS )zE.g. checkpoint archives   s   1010r   N)
rs   r   r   rl   ro   r?   r@   r   ZObjectNotFoundrp   )r   rk   r^   r   r   r   #test_deletes_chunks_during_lifetime   s   "z2TestAdHocCache.test_deletes_chunks_during_lifetimec                 C   s:   | dtdd dksJ |jdksJ |jd u sJ d S )Ns   foorH   )FNd)Zfile_known_and_unchangedr1   Z
cache_modefilesrm   r   r   r   test_files_cache  s   zTestAdHocCache.test_files_cachec                 C   sP   |j rJ |td |j sJ |jsJ |  |j rJ t|dr&J d S )Nrv   r   )Z_txn_activerl   r   r   Zrollbackhasattrrm   r   r   r   test_txn  s   



zTestAdHocCache.test_txnc                 C   sN   | tddt tdddfksJ |tdt tdddfks%J d S )Nr"   ra   rI   /   rs   r   r   Zchunk_increfrm   r   r   r   test_incref_after_add_chunk  s   &(z*TestAdHocCache.test_incref_after_add_chunkc                 C   sN   | tddt tdddfksJ |tdt tdddfks%J dS )z9This case occurs with part files, see Archive.chunk_file.r   ra   rI   r   Nr~   rm   r   r   r   $test_existing_incref_after_add_chunk  s   &(z3TestAdHocCache.test_existing_incref_after_add_chunkN)rY   rZ   r[   r?   r\   r^   rh   rj   rk   rn   rq   rt   ru   rw   rz   r|   r   r   r   r   r   r   r]      s$    



		r]   )rM   os.pathrb   Zhelpers.msgpackr   r?   Z	hashindexr   rh   r   archiver   rk   r	   compressr
   Z
crypto.keyr   r   r   helpersr   r^   r   r   r]   r   r   r   r   <module>   s      ?