
    [e.              
          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 Zd Zd Zd	 Zd
 Zd Zej                            dd          ej                            dd          ej                            dg d          ej                            dd          d                                                 Zej                            dd          d             Zej                            dd          ej                            dg d          ej                            dddg          d                                     Zej                            dd          ej                            dd          ej                            dd          ej                            dd          ej                            dg d          ej                            dddg          d                                                                         Zej        j        ej                            ej                  ej                            dddg          d                                      Zej        j        ej                            ej                  ej                            dddg          d!                                     ZdS )"    N)UserDict)ThreadPoolExecutor)CacheWeakValueMapping)
utils_testc                     t          i i           } t          j        t                    5  | d          d d d            n# 1 swxY w Y   | j        | j        fi i fk    sJ d| d<   | j        | j        fddiddifk    sJ | d         dk    sJ | j        | j        fddiddifk    sJ | j                                         | d         dk    sJ | j        | j        fddiddifk    sJ d| d<   | j        | j        fddiddifk    sJ | j                                         d| d<   | j        | j        fddiddifk    sJ | d= | j        | j        fi i fk    sJ d| d<   | j                                         | d= | j        | j        fi i fk    sJ t          j        t                    5  | d= d d d            n# 1 swxY w Y   | j        | j        fi i fk    sJ d S )Nr   
            )r   pytestraisesKeyErrordatacachecleards    5lib/python3.11/site-packages/zict/tests/test_cache.pytest_cache_get_set_delr      s   b"A 
x	 	   	!              FAGR(((( AaDFAG!R1b' 22222 Q42::::FAG!R1b' 22222 GMMOOOQ42::::FAG!R1b' 22222 AaDFAG!R1b' 22222 GMMOOOAaDFAG!R1b' 22222 	
!FAGR(((( AaDGMMOOO	!FAGR(((( 
x	 	   aD              FAGR((((((s!   	?AA(F88F<?F<c                  &    G d dt                     } t           | ddd          i           }t          |          dk    sJ t          |          ddgk    sJ d|v sJ d|vsJ |                                ddhk    sJ |j        i k    sJ d	S )
zE__len__, __iter__, __contains__, and keys() do not populate the cachec                       e Zd Zd ZdS )%test_do_not_read_from_data.<locals>.Dc                     t                      )N)AssertionError)selfkeys     r   __getitem__z1test_do_not_read_from_data.<locals>.D.__getitem__>   s     """    N__name__
__module____qualname__r    r   r   Dr   =   s#        	# 	# 	# 	# 	#r   r%   r	   r   r
      r'   r
      N)r   r   lenlistkeysr   r%   r   s     r   test_do_not_read_from_datar-   :   s    # # # # #H # # # 	aaB2$$Aq66Q;;;;77q!f6666A::::66881v7b======r   c                  >   t          i i d          } d| d<   | j        | j        fddii fk    sJ | d         dk    sJ | j        | j        fddiddifk    sJ d| d<   | j        | j        fddii fk    sJ | d         dk    sJ | j        | j        fddiddifk    sJ d S )NFupdate_on_setr	   r
   r   )r   r   r   r   s    r   test_no_update_on_setr1   J   s    b"E***AAaDFAG!R"----Q42::::FAG!R1b' 22222AaDFAG!R"----Q42::::FAG!R1b' 2222222r   c                       G d dt                     } t           |             i           }t          j        t                    5  d|d<   ddd           n# 1 swxY w Y   |j        j        |j        fi i fk    sJ d|d<   |j                                         |j        j        |j        fddii fk    sJ t          j        t                    5  d|d<   ddd           n# 1 swxY w Y   |j        j        |j        fi i fk    sJ d|d<   |j        j        |j        fddiddifk    sJ t          j        t                    5  d|d<   ddd           n# 1 swxY w Y   |j        j        |j        fi i fk    sJ dS )z'data.__setitem__ raises; e.g. disk fullc                        e Zd Z fdZ xZS )test_slow_fails.<locals>.Dc                     |dk    r$|                      |d            t                      t                                          ||           d S )Nfail)pop
ValueErrorsuper__setitem__)r   r   value	__class__s      r   r:   z&test_slow_fails.<locals>.D.__setitem__Z   sJ    d### ll"GGU+++++r   )r!   r"   r#   r:   __classcell__)r<   s   @r   r%   r4   Y   s8        	, 	, 	, 	, 	, 	, 	, 	, 	,r   r%   r6   r
   Nr	   )r   r   r   r   r8   r   r   r   r,   s     r   test_slow_failsr>   V   se   , , , , ,H , , , 	aacc2A 
z	"	"  !              FK!b"X---- AaDGMMOOOFK!q"gr]2222	z	"	"  !              FK!b"X---- AaDFK!q"g2w%77777	z	"	"  !              FK!b"X------s6   AAAC##C'*C'EEEc                       G d d          } t                      } |             }||d<   |d         |u sJ ~t          j                     d|vsJ d}||d<   d|vsJ d S )Nc                       e Zd ZdS ) test_weakvaluemapping.<locals>.CN)r!   r"   r#   r$   r   r   CrA   x   s        r   rB   abbbb)r   gccollect)rB   r   rC   rE   s       r   test_weakvaluemappingrH   w   s            	A	AAcFS6Q;;;;	JLLLa<<<< 	AAcFa<<<<<<r   c                      t          i i           } t          j        |            t          j        |            |                                  | j        rJ | j        rJ | j        rJ dS )z-
    Test mapping interface for Cache().
    N)r   r   check_mappingcheck_closingr   r   r   _last_updated)buffs    r   test_mappingrN      sq     R==DT"""T"""JJLLLzy!!!!!!r   get_when)beforeafterset_whenzstarts_first,seed,update_on_set))getTF)setFF)rT   FT)rT   TF)rT   TT
ends_first)rS   rT   c                 N    t          j                    t          j                    t          j                    t          j                     G  fddt                    }t           |            i |          }|r                                 d|d<                                                                     |j        j        ddik    sJ t	          |j                  dhk    sJ |r|j        ddik    sJ n|j        i k    sJ t          d          5 }|dk    rh|
                    |j        d          }	                    d	          sJ |
                    |j        dd          }
                    d	          sJ ng|
                    |j        dd          }
                    d	          sJ |
                    |j        d          }	                    d	          sJ |dk    rg                                 	 |	                                d
v sJ n# t          $ r Y nw xY w                                 |
                                 nf                                 |
                                                                  	 |	                                d
v sJ n# t          $ r Y nw xY wddd           n# 1 swxY w Y   |j        j        ddik    sJ |j        i ddifv sJ t	          |j                  dhk    sJ dS )zHTest race conditions between __setitem__ and __getitem__ on the same keyc                   ,    e Zd Z fdZfdZdS )5test_multithread_race_condition_set_get.<locals>.Slowc                 .   dk    rV	 | j         |         }                                 n#                                  w xY w                    d          sJ |S                                                      d          sJ | j         |         S NrP      timeoutr   rT   waitr   kv	block_getrO   in_gets      r   r   zAtest_multithread_race_condition_set_get.<locals>.Slow.__getitem__   s    8##!	!AJJLLLLFJJLLLL ~~a~00000

 ~~a~00000y|#s	   + Ac                     dk    r8|| j         |<                                                        d          sJ d S                                                      d          sJ || j         |<   d S rZ   r^   r   ra   rb   	block_setin_setrR   s      r   r:   zAtest_multithread_race_condition_set_get.<locals>.Slow.__setitem__   |    8## 	!

 ~~a~0000000

 ~~a~00000 	!r   N)r!   r"   r#   r   r:   )rc   rg   rO   rd   rh   rR   s   r   SlowrX      s[        	$ 	$ 	$ 	$ 	$ 	$ 	$	! 	! 	! 	! 	! 	! 	! 	! 	!r   rj   r/   r
   xr'   rS   r[   r\   r&   N)	threadingEventr   r   rT   r   r   rL   r   r   submitr   r_   r:   resultr   )rO   rR   starts_firstseedr0   rU   rj   zexget_futset_futrc   rg   rd   rh   s   ``         @@@@r   'test_multithread_race_condition_set_getrv      s   " _F!!I_F!!I! ! ! ! ! ! ! ! ! ! ! !x ! ! !0 	ddffb666A 
!#v{sAh&&&&1?##u,,,, 	!7sAh&&&&&7b====	A		 "5  iis33G;;q;)))))iisA66G;;q;))))))iisA66G;;q;)))))iis33G;;q;)))))MMOOO~~''611111   MMOOONNMMOOONNMMOOO~~''611111   5              : 6;3(""""7rC8n$$$$qC5((((((s\   'C0KH10K1
H>;K=H>>A(K'K ?K 
K
KKKK #K c                 *    t          j                    t          j                     G  fddt                    }t           |            i d          }d|d<   |j        j        ddik    sJ t          |j                  dhk    sJ |j        i k    sJ t          d          5 }|	                    |j
        d          }                    d          sJ |d=                                   d	k    r|                                dk    sJ nEt          j        t                    5  |                                 d
d
d
           n# 1 swxY w Y   d
d
d
           n# 1 swxY w Y   |j        j        rJ |j        rJ |j        rJ d
S )zHTest race conditions between __delitem__ and __getitem__ on the same keyc                       e Zd Z fdZdS )5test_multithread_race_condition_del_get.<locals>.Slowc                     dk    r;| j         |         }                                                     d          sJ |S                                                      d          sJ | j         |         S rZ   r^   r`   s      r   r   zAtest_multithread_race_condition_del_get.<locals>.Slow.__getitem__   sx    8##IaL

 ~~a~00000

 ~~a~00000y|#r   Nr    )rc   rO   rd   s   r   rj   ry      s8        		$ 		$ 		$ 		$ 		$ 		$ 		$ 		$ 		$r   rj   Fr/   r
   rk   r[   r\   rP   N)rl   rm   r   r   r   rT   rL   r   r   rn   r   r_   ro   r   r   r   )rO   rj   rr   rs   rt   rc   rd   s   `    @@r   'test_multithread_race_condition_del_getr{      s>    _F!!I
$ 
$ 
$ 
$ 
$ 
$ 
$ 
$ 
$x 
$ 
$ 
$ 	ddffb...AAcF6;3(""""qC5((((7b====	A		 
!"))AM3//{{1{%%%%%cFx>>##q(((((x(( ! !   ! ! ! ! ! ! ! ! ! ! ! ! ! ! !
! 
! 
! 
! 
! 
! 
! 
! 
! 
! 
! 
! 
! 
! 
! v{ws7   +BE(0EE(E	E(E	E((E,/E,zseed_data,seed_cache))FF)TF)TTr0   FTc                 T   	
 t          j                    
t          j                    	 G 	
 fddt                    }t           |            i |          }|rM	                                 d|d<   
                                 	                                 |r
|s|d         }t          d          5 }|                    |j        dd          }
	                    d          sJ 	 |d= n# t          $ r Y nw xY w	                                 |                                 d	d	d	           n# 1 swxY w Y   |j        j        ddii fv sJ |j        |j        j        i fv sJ |j                                        |j        j                                        k    sJ d	S )
zHTest race conditions between __delitem__ and __setitem__ on the same keyc                       e Zd Z fdZdS )5test_multithread_race_condition_del_set.<locals>.Slowc                     dk    r8|| j         |<                                                        d          sJ d S                                                      d          sJ || j         |<   d S rZ   r^   rf   s      r   r:   zAtest_multithread_race_condition_del_set.<locals>.Slow.__setitem__+  ri   r   Nr!   r"   r#   r:   )rg   rh   rR   s   r   rj   r~   *  s8        	! 	! 	! 	! 	! 	! 	! 	! 	!r   rj   r/   r
   rk   r'   r[   r\   N)rl   rm   r   r   rT   r   r   rn   r:   r_   r   ro   r   r   rL   r+   )rR   	seed_data
seed_cacher0   rj   rr   _rs   ru   rg   rh   s   `        @@r   'test_multithread_race_condition_del_setr     s    _F!!I	! 	! 	! 	! 	! 	! 	! 	! 	!x 	! 	! 	! 	ddffb666A # 	m 	#A	A		 "))AM322{{1{%%%%%	# 	 	 	D	               6;C8R.((((7qv{B'''''?!!QV[%5%5%7%7777777s6   95D7/C32D73
D =D7?D  +D77D;>D;	set1_when	set2_whenrp   r&   c                    | |dt          j                    t          j                    dt          j                    t          j                    d G fddt                    }t           |            i |          }|rd|d<   |r
|s|d         }	t	          d          5 }
i }|
                    |j        d|          ||<   |                             d	          sJ |d
k    rdnd
}|
                    |j        d|          ||<   |                             d	          sJ |                                          ||         	                                 |d
k    rdnd
}|                                          ||         	                                 ddd           n# 1 swxY w Y   |j
        j
        dd
iddifv sJ |j        |j
        j
        i fv sJ t          |j                  dhk    sJ dS )z.Test __setitem__ in race condition with itselfr&   c                       e Zd Z fdZdS )5test_multithread_race_condition_set_set.<locals>.Slowc                 P   |dk    r|| j         |<   d S |         dk    rD|| j         |<   |                                          |                             d          sJ d S |                                          |                             d          sJ || j         |<   d S )Nr   rP   r[   r\   r^   )r   ra   rb   rg   rh   whens      r   r:   zAtest_multithread_race_condition_set_set.<locals>.Slow.__setitem__^  s    Avv 	!Aw("" 	!q	 |(((3333333q	 |(((33333 	!r   Nr   )rg   rh   r   s   r   rj   r   ]  s8        	! 	! 	! 	! 	! 	! 	! 	! 	!r   rj   r/   r   rk   r'   r[   r\   r
   N)rl   rm   r   r   r   rn   r:   r_   rT   ro   r   r   rL   )r   r   rp   rU   r   r   r0   rj   rr   r   rs   futuresstarts_secondends_secondrg   rh   r   s                 @@@r   'test_multithread_race_condition_set_setr   M  s    Y''D""y'8'899FO%%)/*;*;<<I! ! ! ! ! ! ! ! !x ! ! !  	ddffb666A # 	m 	#A	A		 &" "		!-l K Kl#(((33333)Q..A!#1=#}!M!Mm$))!)44444*!!###
""$$$%??aa+""$$$##%%%& & & & & & & & & & & & & & & 6;C8c1X.....7qv{B'''''qC5((((((s   *C9F//F36F3c                     t          t          j        d          i |           }t          j        |           |j        rJ |j        rJ |j        rJ t          j        |           d S NgMbP?r/   )r   r   SlowDictcheck_different_keys_threadsafer   r   rL   rJ   r0   rM   s     r   %test_stress_different_keys_threadsafer     sv     $U++R}MMMD.t444zy!!!!T"""""r   c                     t          t          j        d          i |           }t          j        |           |j        rJ |j        rJ |j        rJ t          j        |           d S r   )r   r   r   check_same_key_threadsafer   r   rL   rJ   r   s     r   test_stress_same_key_threadsafer     sv     $U++R}MMMD(...zy!!!!T"""""r   )rF   rl   collectionsr   concurrent.futuresr   r   zictr   r   
zict.testsr   r   r-   r1   r>   rH   rN   markparametrizerv   r{   r   r   stressrepeatREPEAT_STRESS_TESTSr   r   r$   r   r   <module>r      s   				                 1 1 1 1 1 1  ( ( ( ( ( ( ( ( ! ! ! ! ! !+) +) +)\   	3 	3 	3. . .B  $" " " %899%899%  	 	 ~66N) N) 76	 	 :9 :9N)b %899% % :9%P %899III  5$-88'8 '8 98  :9
'8T &9::&9::00v..III  5$-88.) .) 98  /. 10 ;: ;:.)b J2335$-88# # 98 43 # J2335$-88# # 98 43 # # #r   