U
    /e.                  
   @   s  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m	Z	 d dl
mZ dd Zdd	 Zd
d Zdd Zdd Zdd Zejddejddejddddddgejdddd Zejdddd  Zejddejd!d"d#d$gej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"d#d$gejd%d&d'gd.d/ Zejjejejejd%d&d'gd0d1 Zejjejejejd%d&d'gd2d3 ZdS )4    N)UserDict)ThreadPoolExecutor)CacheWeakValueMapping)
utils_testc               	   C   s  t i i } tt | d  W 5 Q R X | j| jfi i fks@td| d< | j| jfddiddifksht| d dksxt| j| jfddiddifkst| j  | d dkst| j| jfddiddifkstd| d< | j| jfddiddifkst| j  d| d< | j| jfddiddifks.t| d= | j| jfi i fksNtd| d< | j  | d= | j| jfi i fksttt | d= W 5 Q R X | j| jfi i fkstd S )Nr   
            )r   pytestraisesKeyErrordatacacheAssertionErrorcleard r   9/tmp/pip-unpacked-wheel-z3s6s24u/zict/tests/test_cache.pytest_cache_get_set_del   s2    
  
  
"
r   c                  C   s   G dd dt } t| dddi }t|dks4tt|ddgksHtd|ksTtd|ks`t| ddhkstt|ji kstd	S )
zE__len__, __iter__, __contains__, and keys() do not populate the cachec                   @   s   e Zd Zdd ZdS )z%test_do_not_read_from_data.<locals>.Dc                 S   s
   t  d S )N)r   )selfkeyr   r   r   __getitem__>   s    z1test_do_not_read_from_data.<locals>.D.__getitem__N__name__
__module____qualname__r   r   r   r   r   D=   s   r   r   r	   r      r    r      N)r   r   lenr   listkeysr   r   r   r   r   r   test_do_not_read_from_data:   s    r&   c                  C   s   t i i dd} d| d< | j| jfddii fks2t| d dksBt| j| jfddiddifksbtd| d< | j| jfddii fkst| d dkst| j| jfddiddifkstd S )NFupdate_on_setr   r   r	   )r   r   r   r   r   r   r   r   test_no_update_on_setJ   s     r)   c               	   C   s$  G dd dt } t|  i }tt d|d< W 5 Q R X |jj|jfi i fksTtd|d< |j  |jj|jfddii fksttt d|d< W 5 Q R X |jj|jfi i fkstd|d< |jj|jfddiddifksttt d|d< W 5 Q R X |jj|jfi i fks tdS )z'data.__setitem__ raises; e.g. disk fullc                       s   e Zd Z fddZ  ZS )ztest_slow_fails.<locals>.Dc                    s,   |dkr|  |d  t t || d S )Nfail)pop
ValueErrorsuper__setitem__)r   r   value	__class__r   r   r.   Z   s    z&test_slow_fails.<locals>.D.__setitem__)r   r   r   r.   __classcell__r   r   r0   r   r   Y   s   r   r*   r   r   N)	r   r   r   r   r,   r   r   r   r   r%   r   r   r   test_slow_failsV   s     
"r3   c                  C   sd   G dd d} t  }|  }||d< |d |ks2t~t  d|ksHtd}||d< d|ks`td S )Nc                   @   s   e Zd ZdS )z test_weakvaluemapping.<locals>.CN)r   r   r   r   r   r   r   Cx   s   r4   abbbb)r   r   gcZcollect)r4   r   r5   r7   r   r   r   test_weakvaluemappingw   s    r9   c                  C   sH   t i i } t|  t|  |   | jr0t| jr:t| jrDtdS )z-
    Test mapping interface for Cache().
    N)	r   r   check_mappingZcheck_closingr   r   r   r   _last_updated)buffr   r   r   test_mapping   s    




r=   get_when)beforeafterset_whenzstarts_first,seed,update_on_set)getTF)setFF)rC   FT)rC   TF)rC   TT
ends_first)rB   rC   c              	      sD  t  t   t  t  G  fdddt}t| i |d}|r  d|d<     |jjddikstt|jdhkst|r|j	ddikstn|j	i kstt
d,}|dkr||jd}	jdd	st||jdd}
jdd	sZtnB||jdd}
jdd	s:t||jd}	jdd	sZt|dkr   z|	 d
kstW n tk
r   Y nX   |
  nF  |
     z|	 d
kstW n tk
r   Y nX W 5 Q R X |jjddikst|j	i ddifks*tt|jdhks@tdS )zHTest race conditions between __setitem__ and __getitem__ on the same keyc                       s,   e Zd Z fddZfddZdS )z5test_multithread_race_condition_set_get.<locals>.Slowc                    s\   dkr6z| j| }W 5    X  jdds2t|S     jddsNt| j| S d S Nr?      timeout)rC   r   waitr   r   kv	block_getr>   in_getr   r   r      s    
zAtest_multithread_race_condition_set_get.<locals>.Slow.__getitem__c                    sR   dkr,|| j |<    jddsNtn"   jddsDt|| j |< d S rE   r   rC   rI   r   rJ   	block_setin_setrA   r   r   r.      s    
zAtest_multithread_race_condition_set_get.<locals>.Slow.__setitem__N)r   r   r   r   r.   r   rN   rR   r>   rO   rS   rA   r   r   Slow   s   rU   r'   r   xr    rB   rF   rG   r   N)	threadingEventr   r   rC   r   r   r   r;   r   r   submitr   rI   r.   resultr   )r>   rA   starts_firstseedr(   rD   rU   zexget_futset_futr   rT   r   'test_multithread_race_condition_set_get   sX    


ra   c              
      s  t  t   G  fdddt}t| i dd}d|d< |jjddiksTtt|jdhksht|ji ksvtt	dj}|
|jd}jddst|d=    d	kr| dkstntt |  W 5 Q R X W 5 Q R X |jjrt|jrt|jrtd
S )zHTest race conditions between __delitem__ and __getitem__ on the same keyc                       s   e Zd Z fddZdS )z5test_multithread_race_condition_del_get.<locals>.Slowc                    sT   dkr.| j | }   jdds*t|S    jddsFt| j | S d S rE   rP   rJ   rM   r   r   r      s    
zAtest_multithread_race_condition_del_get.<locals>.Slow.__getitem__Nr   r   rM   r   r   rU      s   rU   Fr'   r   rV   rF   rG   r?   N)rW   rX   r   r   r   r   rC   r;   r   r   rY   r   rI   rZ   r   r   r   )r>   rU   r]   r^   r_   r   rM   r   'test_multithread_race_condition_del_get   s(    
rb   zseed_data,seed_cache)FF)TF)TTr(   FTc           	   	      s  t  t   G  fdddt}t| i |d}|rl   d|d<      |rl|sl|d }tdV}||jdd}j	ddst
z
|d= W n tk
r   Y nX    |  W 5 Q R X |jjddii fkst
|j|jji fkst
|j |jj kst
d	S )
zHTest race conditions between __delitem__ and __setitem__ 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 rE   rP   rJ   rQ   r   r   r.   +  s    
zAtest_multithread_race_condition_del_set.<locals>.Slow.__setitem__Nr   r   r   r.   r   rQ   r   r   rU   *  s   rU   r'   r   rV   r    rF   rG   N)rW   rX   r   r   rC   r   r   rY   r.   rI   r   r   rZ   r   r   r;   r$   )	rA   	seed_data
seed_cacher(   rU   r]   _r^   r`   r   rQ   r   'test_multithread_race_condition_del_set  s.    	

rg   	set1_when	set2_whenr[   r   c              	      s|  | |dt  t  dt  t  d G  fdddt}t| i |d}|rrd|d< |rr|sr|d }	td}
i }|
|jd|||< | jdd	st|d
krdnd
}|
|jd|||< | jdd	st | 	  || 
  |d
krdnd
} | 	  || 
  W 5 Q R X |jjdd
iddifksJt|j|jji fksbtt	|jdhksxtdS )z.Test __setitem__ in race condition with itselfr   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krN|| j |< |    | jddsxtn*|    | jddsnt|| j |< d S )Nr   r?   rF   rG   rP   rJ   rR   rS   whenr   r   r.   ^  s    

zAtest_multithread_race_condition_set_set.<locals>.Slow.__setitem__Nrc   r   rj   r   r   rU   ]  s   rU   r'   r   rV   r    rF   rG   r   N)rW   rX   r   r   r   rY   r.   rI   r   rC   rZ   r   r   r;   )rh   ri   r[   rD   rd   re   r(   rU   r]   rf   r^   ZfuturesZstarts_secondZends_secondr   rj   r   'test_multithread_race_condition_set_setM  s0    

rl   c                 C   sJ   t tdi | d}t| |jr(t|jr2t|jr<tt| d S NgMbP?r'   )	r   r   SlowDictZcheck_different_keys_threadsafer   r   r   r;   r:   r(   r<   r   r   r   %test_stress_different_keys_threadsafe  s    



rp   c                 C   sJ   t tdi | d}t| |jr(t|jr2t|jr<tt| d S rm   )	r   r   rn   Zcheck_same_key_threadsafer   r   r   r;   r:   ro   r   r   r   test_stress_same_key_threadsafe  s    



rq   )r8   rW   collectionsr   concurrent.futuresr   r   Zzictr   r   Z
zict.testsr   r   r&   r)   r3   r9   r=   markZparametrizera   rb   rg   rl   ZstressrepeatZREPEAT_STRESS_TESTSrp   rq   r   r   r   r   <module>   sh   .!
Q
( * 1	