U
    /e!                     @   s   d dl 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 d dl	Z	d dl
mZmZ d dlmZ e	jj dd Ze	jj dd	 Ze	jj d
d Ze	jj dd Ze	jj dd Ze	jj e	jdddgdd Ze	jj dd Ze	jj dd ZdS )    N)UserDict)ExecutorFuture)AsyncBufferFunc)
utils_testc              
      s  t i tddd}d|d< d|d< d|d< t|jdddhksHt|jrRt|jr\td	|d
< t|jdddd
hks~t|jrt|jstt	|jI d H  t|jddd
hkstt|jdhkst|
  |jrt|
d |jrt|
d |jstt	|jI d H  t|jdd
hks6tt|jddhksNtt|jjdd
gksht|dg}| st|I d H ddikstt|jjd
dgksttjtdd |jd
dgdd}W 5 Q R X t|jjd
dgkst|jd
dgdd}| st|I d H d
d	iks2tt|jjdd
gksLttt |jdgdd}W 5 Q R X |ddg}| rt||jkst|I d H dddkst|jrtt|jd
ddhkstt|jdhkstW 5 Q R X d S )N{Gz?   n   a   bc   d
   m)matchraisemissingomitZmisspell)r   r   )r   r   SlowDictsetfastAssertionErrorslowfuturesasynciowaitasync_evict_until_below_targetlistorder	async_getdonepytestraisesKeyError
ValueError)check_thread_leaksbufffuture_ r/   @/tmp/pip-unpacked-wheel-z3s6s24u/zict/tests/test_async_buffer.pytest_simple   sX    







r1   c              	      s  t i tddd}d|d< d|d< d|d< t|jdksBt|jrLt|d t|jdkshtt|j	
 dgkst|d t|jdkstt|j	
 dgkst|d t|jdkstt|j	
 ddgksttj|jtjd	I d
H  t|jdkstt|j	
 dgks0tt|jI d
H  |jrNt|j	rZt|jddiksnt|jjdddkst|d |d |jrt|j	rtW 5 Q R X d
S )zMUser calls async_evict_until_below_target() while the same is already runningr   r	   r
   r   xr   yz)Zreturn_whenN)r2   r3   r   )r   r   r   lenr   r   r   r"   r#   Zevictingvaluesr    r!   ZFIRST_COMPLETEDr   dataevict_until_below_targetr+   r,   r/   r/   r0   test_double_evictH   s6    





r;   c                    s   t i tddd}|dd tdD  |jr6tt|jdksHt|	d |j
sjtdI d H  qR|jstt|js~t|  t|jI d H  |jrt|jst|j
std S )Nr   d   r
   c                 S   s   i | ]
}||qS r/   r/   .0ir/   r/   r0   
<dictcomp>t   s      z+test_close_during_evict.<locals>.<dictcomp>r   )r   r   r   updateranger   r   r6   r   r"   r   r    sleepcloser!   r:   r/   r/   r0   test_close_during_evictq   s    





rE   c              	      s   t i tddd}|jjdd tdD  t|dks@t|j	rJt|
ttd}|jsft|j	s~tdI d H  qf|  ttj |I d H  W 5 Q R X t|jI d H  |jrt|j	st|jstd S )Nr   r<   r
   c                 S   s   i | ]
}||qS r/   r/   r=   r/   r/   r0   r@      s      z)test_close_during_get.<locals>.<dictcomp>)r   r   r   r   r8   rA   rB   r6   r   r   r%   r#   r   r    rC   rD   r'   r(   ZCancelledErrorr!   )r+   r,   r-   r/   r/   r0   test_close_during_get   s    



rF   c              	      s  t jdddt t t  t  fdd}fdd}ti t||i dd	}d
 d|d< |jstj	ddstd    t
	|jI d H  |jjddikst|dg}j	ddstd   |I d H ddikstW 5 Q R X d S )Nvr   )defaultc                    s$       jddst|   S N   timeoutr   r!   r   getrG   )
block_dumpctxin_dumpr/   r0   dump   s    ztest_contextvars.<locals>.dumpc                    s$       jddst|   S rI   rM   rO   )
block_loadrQ   in_loadr/   r0   load   s    ztest_contextvars.<locals>.loadg?r
      r   r2   rJ   rK   i,     i  iA  )contextvarsZ
ContextVar	threadingEventr   r   r   r   r   r!   r    r   r   r%   )r+   rS   rV   r,   Zfutr/   )rP   rT   rQ   rR   rU   r0   test_contextvars   s*    



r\   r   r   r   c              
      s  G dd dt }ti | dd}|jdd tdD  t|dksLt|jttd|d}|j	szt
dI d	H  qb|jsttdD ]
}||= q|j	rt|jrt| rt|d
krtt |I d	H  W 5 Q R X n,|I d	H }dt|  k rdk sn tW 5 Q R X d	S )zAll required keys exist in slow when you call get_async(); however some are
    deleted by the time the offloaded thread retrieves their values.
    c                       s   e Zd Z fddZ  ZS )z3test_race_condition_get_async_delitem.<locals>.Slowc                    s   || krt d t |S )Nr   )timerC   super__getitem__selfkey	__class__r/   r0   r_      s    
z?test_race_condition_get_async_delitem.<locals>.Slow.__getitem____name__
__module____qualname__r_   __classcell__r/   r/   rc   r0   Slow   s   rj   r<   r
   c                 S   s   i | ]
}||qS r/   r/   r=   r/   r/   r0   r@      s      z9test_race_condition_get_async_delitem.<locals>.<dictcomp>r   r   Nr   r   )r   r   r   rA   rB   r6   r   r%   r#   r   r    rC   r&   r'   r(   r)   )r+   r   rj   r,   r-   r?   outr/   r/   r0   %test_race_condition_get_async_delitem   s$    



rl   c               	      s   t d G  fdddt} ti |  dddz}d|d< d|d< |d	 |jrVtt|jddhksltt	
|dg|dgI d H }|ddiddigkstW 5 Q R X d S )
Nr   c                       s   e Zd Z fddZ  ZS )z+test_multiple_offload_threads.<locals>.Slowc                    s   j dd t |S rI   )r!   r^   r_   r`   )rd   barrierr/   r0   r_      s    z7test_multiple_offload_threads.<locals>.Slow.__getitem__re   r/   rm   rc   r0   rj      s   rj   r<   )r   Znthreadsr   r2   r3   r   )rZ   Barrierr   r   r9   r   r   r   r   r    Zgatherr%   )rj   r,   rk   r/   rn   r0   test_multiple_offload_threads   s    


"rp   c                     s   d G  fdddt } |  }ti i d|d}d|d< d|d< |jjddiksRt|jddiksdt|dgI d H ddikst|jjddikst|jddikst dkst|  d S )	Nr   c                       s    e Zd Z fddZdd ZdS )z*test_external_executor.<locals>.MyExecutorc                   s&    d7  |||}t  }|| |S )Nr   )r   Z
set_result)ra   fnargskwargsrk   fZn_submitr/   r0   submit   s
    

z1test_external_executor.<locals>.MyExecutor.submitc                 _   s   t dd S )Nz.AsyncBuffer.close() called executor.shutdown())r   )ra   rr   rs   r/   r/   r0   shutdown  s    z3test_external_executor.<locals>.MyExecutor.shutdownN)rf   rg   rh   rv   rw   r/   ru   r/   r0   
MyExecutor   s   rx   r   )r   executorr2   r   r3   )r   r   r   r   r   r   r%   rD   )rx   exr,   r/   ru   r0   test_external_executor   s    r{   )r    rY   rZ   r]   collectionsr   concurrent.futuresr   r   r'   Zzictr   r   Z
zict.testsr   markr1   r;   rE   rF   r\   Zparametrizerl   rp   r{   r/   r/   r/   r0   <module>   s2   
9
(


!#
