o
    +ke.                     @   s8  d dl mZ d dlZd dlZd dlZddlmZ ddlmZmZm	Z	m
Z
 ddlT dZd e de d	fde de d
fde de d	fde de d
fgZd e de d
fde de d	fde de d
fde de d	fgZd e de d	fgZd e de d
fgZd"ddZd"ddZdd Zejje  ddejddefdefdefdefgdd Zejje  ddejdded d
fded d	fdeed
fdeed	fded d
fded d	fdeed
fdeed	fded d
fded d	fdeed
fdeed	fded d
fded d	fdeed
fdeed	fgdd Zd d! ZdS )#    )BytesION   )cf   )ChunkerChunkerFixed	sparsemaphas_seek_hole)*   TF         c                 C   s   t | d9}d}|r|d|  ||7 }|D ]\}}}|r&|d|  n||tj ||7 }q|| W d    n1 sAw   Y  tj| |ksPJ d S )Nwbr      H   X)openwriteseekosSEEK_CURtruncatepathgetsize)fnamer   header_sizefdtotaloffsetsizeis_data r!   Ausr/lib/python3.10/site-packages/borg/testsuite/chunker_pytest.pymake_sparsefile%   s   
r#   c                 C   s\   g }d}|r| d|  ||7 }| D ]\}}}|r"| d|  n| | ||7 }q|S )Nr   r   r   )append)r   r   resultr   r   r   r    r!   r!   r"   make_content5   s   

r&   c               
   C   s   t sdS t `} tj| d}t|dtdfttdfg t|d/}z|	dtj
}|	dtj}W n tyI   Y W d    W d    dS w W d    n1 sTw   Y  |dko`|tkW  d    S 1 skw   Y  d S )NFZtest_sparser   Trb)r	   tempfileTemporaryDirectoryr   r   joinr#   BSr   r   	SEEK_HOLE	SEEK_DATAOSError)tmpdirfnfZoffset_holeoffset_datar!   r!   r"   fs_supports_sparseD   s$   
$r3   z fs does not support sparse files)reasonzfname, sparse_mapZsparse1Zsparse2Z
onlysparseZ	notsparsec                 C   sJ   dd }dd }t | | }t|| |||ksJ |||ks#J d S )Nc              	   S   s8   t j| t jd}ztt|dW t | S t | w )N)flags)fh)r   r   O_RDONLYlistr   close)r   r6   r!   r!   r"   get_sparsemap_fh]   s   z(test_sparsemap.<locals>.get_sparsemap_fhc                 S   s<   t | d}tt|dW  d    S 1 sw   Y  d S )Nr'   )r   )r   r8   r   )r   r   r!   r!   r"   get_sparsemap_fdd   s   $z(test_sparsemap.<locals>.get_sparsemap_fd)strr#   )r/   r   
sparse_mapr:   r;   r0   r!   r!   r"   test_sparsemapT   s   	
r>   z&fname, sparse_map, header_size, sparsec                 C   s@   dd }t | | }t|||d ||||dt||dk d S )Nc                 S   sJ   t d||d}t| d}t||W  d    S 1 sw   Y  d S )Nr   )r   sparser'   )r   r   r   chunkify)r   r?   r   chunkerr   r!   r!   r"   
get_chunks   s   $z(test_chunkify_sparse.<locals>.get_chunks)r   )r?   r   )r<   r#   r&   )r/   r   r=   r   r?   rB   r0   r!   r!   r"   test_chunkify_sparsen   s   rC   c                     s  t d} d\ }td |d}t| }t||}|d= dd |D }t|}t|}t|}t	fdd	|D }	t	 fd
d	|D }
t
d| d| d| d|	 d|
 
 d|  k rgdk sjJ  J |d ksrJ |d  kszJ |	dk sJ |
dk sJ d S )Ni   )
         r   i  c                 S   s   g | ]}t |qS r!   )len).0chunkr!   r!   r"   
<listcomp>   s    z7test_buzhash_chunksize_distribution.<locals>.<listcomp>c                 3        | ]}t |d   kV  qdS r   NintrI   r   )min_expr!   r"   	<genexpr>       z6test_buzhash_chunksize_distribution.<locals>.<genexpr>c                 3   rL   rM   rN   rP   )max_expr!   r"   rR      rS   zcount: z min: z max: z min count: z max count:        r   rD   )r   urandomr   r   r   r@   rH   minmaxsumprint)datamaskrA   r1   chunksZchunk_sizesZchunks_countZmin_chunksize_observedZmax_chunksize_observedZ	min_count	max_countr!   )rT   rQ   r"   #test_buzhash_chunksize_distribution   s,   

r`   )r   )ior   r   r(   ZpytestrA   r   r   r   r   r	   	constantsr+   Zmap_sparse1Zmap_sparse2Zmap_notsparseZmap_onlysparser#   r&   r3   ZmarkZskipifZparametrizer>   rC   r`   r!   r!   r!   r"   <module>   sh    	

















