U
    /e                     @   sB  d dl Z d dlZd dlmZ d dlmZ d dlZd dlmZ d dl	m
Z
 dd Zdd	 Zejd
dejddejddddgdd Zejddejddejddejddejddejddejddd ddgdd Zejjeje
jdd  Zejjeje
jd!d" ZdS )#    N)UserDict)ThreadPoolExecutor)Sieve)
utils_testc                  C   s>  i } i }i }dd }| ||d}t ||}t|dks:td|d< d|d< d	|d
< d|d< d|d< d|d< |d dkszt|d dkstt|dkstt|ddd
dddgkstt| ddd
dddgkstt| tddd	dddgkst| ddddkst|ddiks"t|d	ddks6td|d
< d|d< |d
 dksXt|d dksjtt|dks|tt| tddddddgkst| ddddkst|dddkst|ddikst|d= |d
= t|dkstd|ks
td
|kstt| tddddgks:td S )Nc                 S   s   t |d S N   )lenkv r   9/tmp/pip-unpacked-wheel-z3s6s24u/zict/tests/test_sieve.pyselector   s    ztest_simple.<locals>.selectorr         r   s   theus   bigr   s   brownws   foxxs   jumpsys   overz   )r   r   r   )r   r   s   lazys   dog)r   r      )r   r   AssertionErrorsortedkeysvalues)abcr   mappingsdr   r   r   test_simple   sR    
 
r"   c                  C   sb   i } i }dd }| |d}t ||}t| t| |  |ji i dksTt|jr^tdS )z-
    Test mapping interface for Sieve().
    c                 S   s   t t|d@ S )Nr   )sum	bytearray)keyvaluer   r   r   r   K   s    ztest_mapping.<locals>.selectorr   r   N)r   r   check_mappingZcheck_closingclearr    r   key_to_mapping)r   r   r   r    r   r   r   r   test_mappingD   s    



r+   method)__setitem__updateset_when)beforeafterseedFsame	differentc              	      s6  t  t   G  fdddt}ti | ddd d}|dkrj   d|d	<      n|d
krzd|d	< td~}| dkr||jd	d}n| dkst	||j
d	di}jddst	z
|d	= W n tk
r   Y nX    |  W 5 Q R X |jd rt	|jd r&t	|jr2t	dS )zOTest race conditions between __delitem__ and __setitem__/update on the same keyc                       s   e Zd Z fddZdS )z5test_multithread_race_condition_del_set.<locals>.Slowc                    sR   dkr,|| j |<    jddsNtn"   jddsDt|| j |< d S )Nr0      timeoutdatasetwaitr   )selfr
   r   	block_setin_setr/   r   r   r-   a   s    
zAtest_multithread_race_condition_del_set.<locals>.Slow.__setitem__N__name__
__module____qualname__r-   r   r=   r   r   Slow`   s   rD   r'   c                 S   s   |d S )Nr   r   r	   r   r   r   <lambda>k       z9test_multithread_race_condition_del_set.<locals>.<lambda>r   r3   r   r   r4   r   r-   r   r.   r5   r6   N)	threadingEventr   r   r:   r)   r   submitr-   r   r.   r;   KeyErrorresultr    r*   )r,   r/   r2   rD   r   exZset_futr   r=   r   'test_multithread_race_condition_del_setX   s4    


rN   	set1_when	set2_whenset1_methodset2_methodstarts_firstr   r   
ends_firstr   r   c              	      s*  | |d||d}t  t  dt  t  d G  fdddt}ti | | ddd d}	|dk	r|||	d	< td
}
i }|dkrd
nd}||fD ]h}|| dkr|
|	jd	|d ||< n*|| dkst|
|	jd	|d i||< | j	ddstq | 
  ||   |dkr2d
nd} | 
  ||   W 5 Q R X t|	d	did	difksvt|	jd i kst|	d	 dkr|	jd d	dikst|	jd
 i kst|	jd	|	jd iks&tnF|	jd i kst|	jd
 d	dikst|	jd	|	jd
 iks&tdS )zATest __setitem__/update in race condition with __setitem__/updaterT   c                       s   e Zd Z fddZdS )z5test_multithread_race_condition_set_set.<locals>.Slowc                    s   |dk r|| j |< d S |d }| dkrV|| j |< |    | jddstn*|    | jddsvt|| j |< d S )Nr   r0   r5   r6   r8   )r<   r
   r   Zmkeyr>   r?   whenr   r   r-      s    

zAtest_multithread_race_condition_set_set.<locals>.Slow.__setitem__Nr@   r   rV   r   r   rD      s   rD   r   c                 S   s   |d S r   r   r	   r   r   r   rE      rF   z9test_multithread_race_condition_set_set.<locals>.<lambda>rG   Fr   r   r   r-   r   r.   r5   r6   r   r   N)rH   rI   r   r   r   rJ   r-   r   r.   r;   r:   rL   dictr    r*   )rO   rP   rQ   rR   rS   rU   r2   r,   rD   r   rM   ZfuturesZstarts_secondidxZends_secondr   rV   r   'test_multithread_race_condition_set_set   s>    


rZ   c                  C   sN   i } i }t | |ddd }t| | r.t|r6t|jr@tt| d S )Nr'   c                 S   s   t ddgS Nr   r   randomchoicer	   r   r   r   rE      rF   z7test_stress_different_keys_threadsafe.<locals>.<lambda>)r   r   Zcheck_different_keys_threadsafer   r*   r(   r   r   r   r   r   r   %test_stress_different_keys_threadsafe   s    

r`   c                  C   sZ   t d} t d}t| |ddd }t | | r:t|rBt|jrLtt | d S )NgMbP?r'   c                 S   s   t ddgS r[   r\   r	   r   r   r   rE      rF   z1test_stress_same_key_threadsafe.<locals>.<lambda>)r   ZSlowDictr   Zcheck_same_key_threadsafer   r*   r(   r_   r   r   r   test_stress_same_key_threadsafe   s    



ra   )r]   rH   collectionsr   concurrent.futuresr   ZpytestZzictr   Z
zict.testsr   r"   r+   markZparametrizerN   rZ   ZstressrepeatZREPEAT_STRESS_TESTSr`   ra   r   r   r   r   <module>   s4   8,;