
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
3
ybpP                 @   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mZm	Z	 ddl
mZ ddlmZmZ ddl
mZ dd	 Zd
d 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dS )     N   )NSIndex
ChunkIndexChunkIndexEntry)	hashindex)IntegrityCheckedFileFileIntegrityError   )BaseTestCasec             C   s   t d|  dS )Nz%-0.32dascii)bytes)x r   !/usr/lib64/python3.6/hashindex.pyH   s    r   c             C   s   t jt| j S )N)hashlibsha256r   digest)r   r   r   r   H2   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S )HashIndexTestCasec             C   s  | }| j t|d x tdD ]}|||t|< q W | j t|d x(tdD ]}| j |t| || qRW x$tdD ]}||d |t|< q|W | j t|d x,tdD ] }| j |t| ||d  qW xtdD ]}|t|= qW x"tddD ]}t||kstqW x$tdD ]}t||ks tq W x&tdD ]}| jt|jt| qFW | j t|d tj	 }|j
|j ~t|jd }| j tj|j j | W d Q R X |j|j}| j t|d x0tddD ]"}| j |t| ||d  qW |j  | j t|d |j
|j ~| j t|j|jd | }|jtd|d td|kstt|td |dkst|jtd|d td|kst|td |dkst|jtd|d|dkst|jtd|d|dkst~d S )	Nr   d   r   2   rb*      r	   )assert_equallenranger   AssertionErrorassert_raisesKeyError__delitem__tempfileNamedTemporaryFilewritenameopenr   r   readZ	hexdigestclear
setdefault)selfclsZ
make_valueZshaidxr   idx_namefdr   r   r   _generic_test   sZ     $"""zHashIndexTestCase._generic_testc             C   s   | j tdd d d S )Nc             S   s   | | fS )Nr   )r   r   r   r   <lambda>[   s    z0HashIndexTestCase.test_nsindex.<locals>.<lambda>Z@85f72b036c692c8266e4f51ccf0cff2147204282b5e316ae508d30a448d88fef)r/   r   )r*   r   r   r   test_nsindexZ   s    zHashIndexTestCase.test_nsindexc             C   s   | j tdd d d S )Nc             S   s
   | | | fS )Nr   )r   r   r   r   r0   _   s    z3HashIndexTestCase.test_chunkindex.<locals>.<lambda>Z@c83fdf33755fc37879285f2ecfc5d1f63b97577494902126b6fb6f3e4d852488)r/   r   )r*   r   r   r   test_chunkindex^   s    z!HashIndexTestCase.test_chunkindexc             C   s   d}t j }t }|j|j tjj|j}| jt	|d x t
|D ]}||f|t|< qFW |j|j |tjj|jk stxt
|D ]}|t|= qW | jt	|d |j|j | j|tjj|j d S )Ni  r   )r"   r#   r   r$   r%   ospathgetsizer   r   r   r   r   )r*   nr-   r,   Zinitial_sizer   r   r   r   test_resizeb   s    zHashIndexTestCase.test_resizec             C   s   t  }x tdD ]}||f|t|< qW |j }t|}| jt|d | jtt	| t|j|d d d}| jt|d | j||dd   d S )Nr   1   r   )Zmarkerr   )
r   r   r   	iteritemslistr   r   r   StopIterationnext)r*   r,   r   iteratorallZsecond_halfr   r   r   test_iteritemss   s    z HashIndexTestCase.test_iteritemsc             C   s   t  }d|td< d|td< d|td< t  }d|td< d|td< d|td< |j| |td dksrt|td dkst|td dkst|td dkstd S )Nr	   r   r         ,                )r	   r   r   )r   r@   r@   )rA   rB   rB   )rC   r   r   )rD   r@   r@   )rE   rF   rF   )rD   r   r   )rG   r@   r@   )rA   rB   rB   )rE   rF   rF   )r   r   merger   )r*   idx1idx2r   r   r   test_chunkindex_merge   s    
z'HashIndexTestCase.test_chunkindex_mergec             C   s   t  }d
|td< d|td< d|td< |j \}}}}}}|dksJt|dksVt|dksbt|dksnt|dkszt|dkstd S )Nr	     r   r     r@   rA     ,  )r	   rL   r   )r   rM   r@   )rA   rN   rO   i  i  i(#  i6  i  i  i  ix  i  ip  i,  iX  rA   rE   )r   r   Z	summarizer   )r*   r,   sizeZcsizeZunique_sizeZunique_csizeZunique_chunksZchunksr   r   r   test_chunkindex_summarize   s    z+HashIndexTestCase.test_chunkindex_summarizeN)
__name__
__module____qualname__r/   r1   r2   r7   r?   rK   rQ   r   r   r   r   r      s   =r   c               @   s   e Zd ZdZdd ZdS )HashIndexExtraTestCasezRThese tests are separate because they should not become part of the selftest.
    c             C   s.  t dtj d }t|}dd t|D }|dd| d  |d| d d   }}x"t|D ]\}}|||f||< q`W x"t|D ]\}}|||f||< qW x|D ]
}||= qW x*t|D ]\}}|| |||fkstqW x|D ]}|j|d kstqW x|D ]}||= qW t|j g ks*td S )Ni  
   c             S   s   g | ]}t jt|j qS r   )r   r   r   r   ).0kr   r   r   
<listcomp>   s    z=HashIndexExtraTestCase.test_chunk_indexer.<locals>.<listcomp>r   r   rA   )	intr   MAX_LOAD_FACTORr   	enumerater   getr:   r9   )r*   Z	key_countindexZall_keyskeysZto_delete_keysikeyr   r   r   test_chunk_indexer   s"    *



z)HashIndexExtraTestCase.test_chunk_indexerN)rR   rS   rT   __doc__rb   r   r   r   r   rU      s   rU   c               @   s   e Zd Zdd Zdd ZdS )HashIndexSizeTestCasec             C   s   t  }|j d	kstd S )
N   i      rA   rC      ,   i4  iF  )r   rP   r   )r*   r,   r   r   r   test_size_on_disk   s    z'HashIndexSizeTestCase.test_size_on_diskc          	   C   st   t  }x*tdD ]}||d |d f|t|< qW tj  }|j|j tjj	|j}W d Q R X |j
 |ksptd S )Ni  r   rA   )r   r   r   r"   r#   r$   r%   r3   r4   r5   rP   r   )r*   r,   r`   filerP   r   r   r   test_size_on_disk_accurate   s    
z0HashIndexSizeTestCase.test_size_on_disk_accurateN)rR   rS   rT   ri   rk   r   r   r   r   rd      s   rd   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d Zdd Zdd Zdd ZdS )HashIndexRefcountingTestCasec             C   s   t  }t jd ddf|td< x0tdD ]$}|jtd^}}|t jks(tq(W x0tdD ]$}|jtd^}}|t jksZtqZW d S )Nr	   r   rD   )r   	MAX_VALUEr   r   increfr   decref)r*   r,   r`   refcount_r   r   r   test_chunkindex_limit   s    z2HashIndexRefcountingTestCase.test_chunkindex_limitc             C   s(   dd }|||}||||ks$t |S )Nc             S   sN   t  }| ddf|td< t  }|ddf|td< |j| |td ^}}|S )Nr	   r   )r   r   rH   )Z	refcount1Z	refcount2rI   rJ   rp   rq   r   r   r   rH      s    
z2HashIndexRefcountingTestCase._merge.<locals>.merge)r   )r*   Z	refcountaZ	refcountbrH   resultr   r   r   _merge   s    
z#HashIndexRefcountingTestCase._mergec             C   s(   t jd }| j||t jd ks$td S )Nr   r	   )r   rm   rt   r   )r*   halfr   r   r   test_chunkindex_merge_limit1   s    
z9HashIndexRefcountingTestCase.test_chunkindex_merge_limit1c             C   s   | j ddtjkstd S )Nl    ^e i 5w)rt   r   rm   r   )r*   r   r   r   test_chunkindex_merge_limit2   s    z9HashIndexRefcountingTestCase.test_chunkindex_merge_limit2c             C   s(   t jd }| j|d |t jks$td S )Nr   r	   )r   rm   rt   r   )r*   ru   r   r   r   test_chunkindex_merge_limit3   s    
z9HashIndexRefcountingTestCase.test_chunkindex_merge_limit3c             C   sF   t jd }| j|d |t jks$t| j|d |d t jksBtd S )Nr   r	   )r   rm   rt   r   )r*   ru   r   r   r   test_chunkindex_merge_limit4   s    
z9HashIndexRefcountingTestCase.test_chunkindex_merge_limit4c             C   sZ   t  }|jtdddd |td dks.t|jtdddd |td dksVtd S )	Nr	   rD   rE   rG   r   rA   )rD   rE   rG   )rE   r   rA   )r   addr   r   )r*   rI   r   r   r   test_chunkindex_add   s
    z0HashIndexRefcountingTestCase.test_chunkindex_addc             C   sJ   t  }t jddf|td< |jtd |td ^}}|t jksFtd S )NrE   rG   r	   )r   rm   r   rn   r   )r*   rI   rp   rq   r   r   r   test_incref_limit  s
    z.HashIndexRefcountingTestCase.test_incref_limitc             C   sJ   t  }t jddf|td< |jtd |td ^}}|t jksFtd S )NrE   rG   r	   )r   rm   r   ro   r   )r*   rI   rp   rq   r   r   r   test_decref_limit  s
    z.HashIndexRefcountingTestCase.test_decref_limitc          
   C   s:   t  }d|td< | jt |jtd W d Q R X d S )Nr   r	   )r   r   r   )r   r   r   r   ro   )r*   rI   r   r   r   test_decref_zero  s    z-HashIndexRefcountingTestCase.test_decref_zeroc             C   sv   t  }|jtdddd |td dks.t|jtd |td dksPt|jtd |td dksrtd S )Nr	   rD   rE   rG   )rD   rE   rG   )rE   rE   rG   )rD   rE   rG   )r   rz   r   r   rn   ro   )r*   rI   r   r   r   test_incref_decref  s    z/HashIndexRefcountingTestCase.test_incref_decrefc             C   s8   t  }| jt t jd ddf|td< W d Q R X d S )Nr	   r   )r   r   r   rm   r   )r*   rI   r   r   r   test_setitem_raises#  s    z0HashIndexRefcountingTestCase.test_setitem_raisesc          !   C   s   t  }| jt |jtd W d Q R X | jt |jtd W d Q R X | jt |td  W d Q R X | jt |jtdddd W d Q R X d S )Nr	   r   )r   r   r    rn   r   ro   OverflowErrorrz   )r*   r,   r   r   r   test_keyerror(  s    z*HashIndexRefcountingTestCase.test_keyerrorN)rR   rS   rT   rr   rt   rv   rw   rx   ry   r{   r|   r}   r~   r   r   r   r   r   r   r   rl      s   	rl   c               @   s@   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dS )HashIndexDataTestCases(  eJzt0L0NgmAUhtHLT0LDEI6AuAEhMVYmVnSuYefC7AB3Aj9KNedJbnfyFne6P67P27w0EdG1Eac+Cm1ZybAsy7Isy7Isy7Isy7Isy7Isy7Isy7Isy7Isy7Isy7Isy7Isy7Isy7Isy7Isy7Isy7Isy7Isy7Isy7Isy7Isy7Isy7Isy7Isy7Isy7Isy7LsL9nhc+cqTZ3XlO2Ys++Du5fX+l1/YFmWZVmWZVmWZVmWZVmWZVmWZVmWZVmWZVmWZVmWZVmWZVmWZVmWZVmWZVmWZVmWZVn2/+0O2rYccw==c             C   sP   t j >}tjj|d}|j| t|d}| j|j S Q R X W d Q R X d S )Nr,   r   )	r"   TemporaryDirectoryr3   r4   joinr$   r&   _packr'   )r*   r,   tempdirrj   fr   r   r   _serialize_hashindex:  s
    

z*HashIndexDataTestCase._serialize_hashindexc             C   sR   t j @}tjj|d}t|d}|j| j| W d Q R X tj	|S Q R X d S )Nr,   wb)
r"   r   r3   r4   r   r&   r$   _unpackr   r'   )r*   
bytestringr   rj   r   r   r   r   _deserialize_hashindexA  s
    
z,HashIndexDataTestCase._deserialize_hashindexc             C   s   t jtj|S )N)base64Z	b64encodezlibcompress)r*   r   r   r   r   r   H  s    zHashIndexDataTestCase._packc             C   s   t jtj|S )N)r   Z
decompressr   Z	b64decode)r*   r   r   r   r   r   K  s    zHashIndexDataTestCase._unpackc             C   sR   t  }d|td< d
|td< d|td< | j|}| j|| j| jksNtd S )Nr	   r   rA      r      xl )r	   r   rA   l        )r   r   r   )r   r   r   )r   r   r   r   	HASHINDEXr   )r*   rI   Z
serializedr   r   r   test_identical_creationN  s    
z-HashIndexDataTestCase.test_identical_creationc             C   s   | j | j}|td dks t|td dks4t|td dksHtt }d|td< |j| |td tjd	d
fkstd S )Nr	   r   rA   r   r      xl rf   i@ rE   rG   )r	   r   rA   l        )r   r   r   )r   r   r   l            )r   rE   rG   )r   r   r   r   r   rH   rm   )r*   rI   rJ   r   r   r   test_read_known_goodW  s    
z*HashIndexDataTestCase.test_read_known_goodN)
rR   rS   rT   r   r   r   r   r   r   r   r   r   r   r   r   4  s   	r   c               @   s   e Zd Zdd Zdd ZdS )HashIndexIntegrityTestCasec          	   C   sb   | j | j}tjj|d}t|dd}|j| W d Q R X |j}d|ksNtd|ksZt||fS )Nr,   T)r4   r$   finalZ
HashHeader)	r   r   r3   r4   r   r   r$   integrity_datar   )r*   r   r,   rj   r.   r   r   r   r   write_integrity_checked_indexd  s    z8HashIndexIntegrityTestCase.write_integrity_checked_indexc             C   s   t j n}| j|\}}t|d}|jd W d Q R X | jt* t|d|d}tj	| W d Q R X W d Q R X W d Q R X d S )Nzr+bs   FooF)r4   r$   r   )
r"   r   r   r&   r$   r   r   r   r   r'   )r*   r   rj   r   r.   r   r   r   test_integrity_checked_filen  s    
z6HashIndexIntegrityTestCase.test_integrity_checked_fileN)rR   rS   rT   r   r   r   r   r   r   r   c  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d Zdd Zdd Zdd ZdS )HashIndexCompactTestCasec             C   sd   t j }|jd |j|jdd |j|jdd |jdjdd |jdjdd || _d S )Ns   BORG_IDXrC   littlerf   r	   rA   rg   )ioBytesIOr$   to_bytes
index_data)r*   num_entriesnum_bucketsr   r   r   r   r^   y  s    
zHashIndexCompactTestCase.indexc             C   s   | j jd tj| j }|S )Nr   )r   seekr   r'   )r*   r^   r   r   r   index_from_data  s    z(HashIndexCompactTestCase.index_from_datac             C   s   t j }|j| |j S )N)r   r   r$   getvalue)r*   r^   datar   r   r   index_to_data  s    
z&HashIndexCompactTestCase.index_to_datac             C   s   | j  }|j  | j|}|S )N)r   compactr   )r*   r^   compact_indexr   r   r   index_from_data_compact_to_data  s    
z8HashIndexCompactTestCase.index_from_data_compact_to_datac             G   s2   | j j| x |D ]}| j j|jdd qW d S )NrC   r   )r   r$   r   )r*   ra   valuesvaluer   r   r   write_entry  s    
z$HashIndexCompactTestCase.write_entryc             C   s   | j |ddd d S )Nl    r   )r   )r*   ra   r   r   r   write_empty  s    z$HashIndexCompactTestCase.write_emptyc             C   s   | j |ddd d S )Nl    r   )r   )r*   ra   r   r   r   write_deleted  s    z&HashIndexCompactTestCase.write_deletedc             C   s   | j ddd | jtdddd | jtd | jtd | jtdddd | jtd	d
dd | jtd | j }| j ddd | jtdddd | jtdddd | jtd	d
dd || jj kstd S )NrA   rE   )r   r   r   r	   r   rD   rG   rC      	   rV   )	r^   r   r   r   r   r   r   r   r   )r*   r   r   r   r   test_simple  s    z$HashIndexCompactTestCase.test_simplec             C   s   | j ddd | jtd | jtdddd | jtd | jtdddd | jtd	d
dd | jtd | j }| j ddd | jtdddd | jtdddd | jtd	d
dd || jj kstd S )NrA   rE   )r   r   r	   r   r   rD   rG   rC   r   r   rV   )	r^   r   r   r   r   r   r   r   r   )r*   r   r   r   r   test_first_empty  s    z)HashIndexCompactTestCase.test_first_emptyc             C   s   | j ddd | jtd | jtdddd | jtd | jtdddd | jtd | jtd	d
dd | j }| j ddd | jtdddd | jtdddd | jtd	d
dd || jj kstd S )NrA   rE   )r   r   r	   r   r   rD   rG   rC   r   r   rV   )	r^   r   r   r   r   r   r   r   r   )r*   r   r   r   r   test_last_used  s    z'HashIndexCompactTestCase.test_last_usedc             C   s   | j ddd | jtd | jtdddd | jtdddd | jtd | jtd | jtd	d
dd | j }| j ddd | jtdddd | jtdddd | jtd	d
dd || jj kstd S )NrA   rE   )r   r   r	   r   r   rD   rG   rC   r   r   rV   )	r^   r   r   r   r   r   r   r   r   )r*   r   r   r   r   test_too_few_empty_slots  s    z1HashIndexCompactTestCase.test_too_few_empty_slotsc             C   s   | j ddd | jtd | jtd | jtd | jtd | jtd | jtd | j }| j ddd || jj kstd S )	Nr   rE   )r   r   r	   rA   r   rD   rC   )r^   r   r   r   r   r   r   r   )r*   r   r   r   r   
test_empty  s    z#HashIndexCompactTestCase.test_emptyc             C   s   t  }t  }d
|td< d|td< d|td< |j  |j dksHt|j| |td dksft|td dkszt|td dkstd S )Nr	   r   r   r@   rA   ,  re   rf   rC   )r	   r   r   )r   r@   r@   )rA   r   r   rg   rh         )r	   r   r   )r   r@   r@   )rA   r   r   )r   r   r   rP   r   rH   )r*   ZmasterrI   r   r   r   
test_merge  s    
z#HashIndexCompactTestCase.test_mergeN)rR   rS   rT   r^   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   x  s   r   c               @   s   e Zd Zdd ZdS )NSIndexTestCasec             C   sh   t  }| jt t jd df|td< W d Q R X td|ksBtt jdf|td< td|ksdtd S )Nr	   r   r   )r   r   r   rm   r   )r*   r,   r   r   r   test_nsindex_segment_limit  s     z*NSIndexTestCase.test_nsindex_segment_limitN)rR   rS   rT   r   r   r   r   r   r     s   r   c               @   s   e Zd Zdd ZdS )AllIndexTestCasec             C   s    t jdk sttjdk std S )Ng      ?)r   r[   r   r   )r*   r   r   r   test_max_load_factor  s    z%AllIndexTestCase.test_max_load_factorN)rR   rS   rT   r   r   r   r   r   r     s   r   c               @   s   e Zd Zdd ZdS )IndexCorruptionTestCasec                s(  ddl m fdd t x"tdD ]}d|f d|< q(W j dksRtxtd	D ]} d|= q\W x"td
D ]}d|f d|< qzW  fddtd	dD dd td	dD kst fddtd	D dd td	D kst fddtd
D dd td
D ks$td S )Nr   )packc                s    d| |dddS )Nz<IIQQQr   r   )r   y)r   r   r   HH  s    z1IndexCorruptionTestCase.test_bug_4829.<locals>.HHi  i  (   re   i  iJ  iX  c                s   g | ]}j  d |qS )r   )r]   )rW   r   )r   r,   r   r   rY   5  s    z9IndexCorruptionTestCase.test_bug_4829.<locals>.<listcomp>c             S   s   g | ]}d |fqS )r   r   )rW   r   r   r   r   rY   5  s    c                s   g | ]} d |kqS )r   r   )rW   r   )r   r,   r   r   rY   7  s    c             S   s   g | ]}d qS )Fr   )rW   r   r   r   r   rY   7  s    c                s   g | ]}j  d |qS )iX  )r]   )rW   r   )r   r,   r   r   rY   :  s    c             S   s   g | ]}d |fqS )iX  r   )rW   r   r   r   r   rY   :  s    i  i*  )structr   r   r   rP   r   )r*   r   r   )r   r,   r   r   test_bug_4829  s    2.z%IndexCorruptionTestCase.test_bug_4829N)rR   rS   rT   r   r   r   r   r   r     s   r   )r   r   r   r3   r"   r   r   r   r   r    Zcrypto.file_integrityr   r   r
   r   r   r   rU   rd   rl   r   r   r   r   r   r   r   r   r   r   <module>   s.    f/ 
