B
    18™\GL  ã               @   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Zd dlZd dlZd dl	m
Z
 yd dlZW n ek
rx   dZY nX dZdd„ ZG dd„ dejƒZG dd	„ d	ƒZG d
d„ deƒZG dd„ deejƒZG dd„ deejƒZG dd„ deejƒZG dd„ deƒZG dd„ dejƒZG dd„ deejƒZG dd„ dƒZG dd„ deejƒZe edkd¡G dd„ deejƒƒZe dkr€e !¡  dS ) é    N)Úsupporté   c             C   s   | j dko|  ¡ | j kS )Nr   )ÚmaxsizeÚqsize)Úq© r   úS/oak/stanford/groups/akundaje/marinovg/programs/Python-3.7.3/Lib/test/test_queue.pyÚqfull   s    r	   c               @   s   e Zd Zdd„ Zdd„ ZdS )Ú_TriggerThreadc             C   s&   || _ || _t ¡ | _tj | ¡ d S )N)ÚfnÚargsÚ	threadingÚEventÚstartedEventÚThreadÚ__init__)Úselfr   r   r   r   r   r      s    
z_TriggerThread.__init__c             C   s$   t  d¡ | j ¡  | j| jŽ  d S )Ngš™™™™™¹?)ÚtimeÚsleepr   Úsetr   r   )r   r   r   r   Úrun!   s    	

z_TriggerThread.runN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r
      s   r
   c               @   s   e Zd Zdd„ Zdd„ ZdS )ÚBlockingTestMixinc          
   C   sN   t ||ƒ}| ¡  z(||Ž | _|j ¡ s6|  d| ¡ | jS t |d¡ X d S )Nz*blocking function %r appeared not to blocké
   )r
   ÚstartÚresultr   Úis_setÚfailr   Újoin_thread)r   Ú
block_funcÚ
block_argsÚtrigger_funcÚtrigger_argsÚthreadr   r   r   Údo_blocking_test<   s    


z"BlockingTestMixin.do_blocking_testc          
   C   sp   t ||ƒ}| ¡  z6y||Ž  W n |k
r6   ‚ Y nX |  d| ¡ W d t |d¡ |j ¡ sj|  d¡ X d S )Nzexpected exception of kind %rr   z(trigger thread ended but event never set)r
   r   r   r   r    r   r   )r   r!   r"   r#   r$   Zexpected_exception_classr%   r   r   r   Údo_exceptional_blocking_testJ   s    

z.BlockingTestMixin.do_exceptional_blocking_testN)r   r   r   r&   r'   r   r   r   r   r   :   s   r   c               @   s\   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S )ÚBaseQueueTestMixinc             C   s   d| _ t ¡ | _d S )Nr   )Úcumr   ÚLockÚcumlock)r   r   r   r   ÚsetUp]   s    zBaseQueueTestMixin.setUpc             C   s|  |  ¡ rtdƒ‚|  | ¡ ¡ |  | ¡ ¡ | d¡ | d¡ | d¡ tdddgdddgdddgd}| ¡ | ¡ | ¡ g}|  	|||j
j d¡ x.ttd ƒD ]}| |¡ |  |  ¡ d¡ q¤W |  t|ƒ d	¡ d
t }dt }| |¡ |  t|ƒd¡ |  | ¡ ¡ |  | ¡ ¡ y|j|dd |  d¡ W n tjk
rR   Y nX y|j|dd |  d¡ W n tjk
rˆ   Y nX |  |j|f|jd¡ |  |j|ddf|jd¡ xttƒD ]}| ¡  qÄW |  |  ¡  d¡ y|jdd |  d¡ W n tjk
r   Y nX y|jdd |  d¡ W n tjk
rN   Y nX |  |jd|jd¡ |  |jd|jd¡ d S )Nz&Call this function with an empty queueéo   iM  éÞ   )ÚQueueÚ	LifoQueueÚPriorityQueuez&Didn't seem to queue the correct data!é   zQueue should not be emptyzQueue should not be fullé   é   zQueue should be fullr   )Úblockz(Didn't appear to block with a full queueg{®Gáz„?)Útimeoutz+Didn't appear to time-out with a full queuer   Tr   zQueue should be emptyz*Didn't appear to block with an empty queuez-Didn't appear to time-out with an empty queue)Úempty)Tr   )r   ÚRuntimeErrorÚ
assertTruer7   ÚassertFalseÚfullÚputÚdictÚgetÚassertEqualÚ	__class__r   ÚrangeÚ
QUEUE_SIZEr	   r   ÚqueueÚFullr&   ÚEmpty)r   r   Ztarget_orderZactual_orderÚiÚlastr;   r   r   r   Úbasic_queue_testa   sd    





z#BaseQueueTestMixin.basic_queue_testc          	   C   sN   xH|  ¡ }|dk r| ¡  d S | j |  j|7  _W d Q R X | ¡  qW d S )Nr   )r>   Ú	task_doner+   r)   )r   r   Úxr   r   r   Úworkerš   s    zBaseQueueTestMixin.workerc             C   s²   d| _ g }x0dD ](}tj| j|fd}| ¡  | |¡ qW xtdƒD ]}| |¡ qFW | ¡  |  	| j t
tdƒƒd¡ xdD ]}| d¡ q~W | ¡  x|D ]}| ¡  qžW d S )Nr   )r   r2   )Útargetr   éd   z0q.join() did not block until all tasks were doneéÿÿÿÿ)r)   r   r   rK   r   ÚappendrA   r<   Újoinr?   Úsum)r   r   ÚthreadsrF   r%   r   r   r   Úqueue_join_test¤   s     


z"BaseQueueTestMixin.queue_join_testc             C   s8   |   ¡ }y| ¡  W n tk
r(   Y nX |  d¡ d S )Nz(Did not detect task count going negative)Ú	type2testrI   Ú
ValueErrorr   )r   r   r   r   r   Útest_queue_task_done¶   s    z'BaseQueueTestMixin.test_queue_task_donec             C   sL   |   ¡ }|  |¡ |  |¡ y| ¡  W n tk
r<   Y nX |  d¡ d S )Nz(Did not detect task count going negative)rT   rS   rI   rU   r   )r   r   r   r   r   Útest_queue_joinÀ   s    

z"BaseQueueTestMixin.test_queue_joinc             C   s"   |   t¡}|  |¡ |  |¡ d S )N)rT   rB   rH   )r   r   r   r   r   Ú
test_basicÍ   s    

zBaseQueueTestMixin.test_basicc          	   C   sV   |   t¡}|  t¡ |jddd W d Q R X |  t¡ |jddd W d Q R X d S )Nr2   rN   )r6   )rT   rB   ÚassertRaisesrU   r<   r>   )r   r   r   r   r   Ú&test_negative_timeout_raises_exceptionÔ   s
    
z9BaseQueueTestMixin.test_negative_timeout_raises_exceptionc          	   C   s†   |   t¡}xttƒD ]}| d¡ qW |  tj¡ | d¡ W d Q R X xttƒD ]}| ¡  qRW |  tj¡ | ¡  W d Q R X d S )Nr2   )	rT   rB   rA   Ú
put_nowaitrY   rC   rD   Ú
get_nowaitrE   )r   r   rF   r   r   r   Útest_nowaitÛ   s    
zBaseQueueTestMixin.test_nowaitc          	   C   s†   |   d¡}| d¡ | d¡ | d¡ |  tj¡ | d¡ W d Q R X |  | ¡ d¡ d|_|  tj¡ | d¡ W d Q R X d S )Né   r2   r3   é   )	rT   r<   rY   rC   rD   r[   r?   r   r   )r   r   r   r   r   Útest_shrinking_queueç   s    



z'BaseQueueTestMixin.test_shrinking_queueN)r   r   r   r,   rH   rK   rS   rV   rW   rX   rZ   r]   r`   r   r   r   r   r(   \   s   9

r(   c               @   s   e Zd ZejZdS )Ú	QueueTestN)r   r   r   rC   r/   rT   r   r   r   r   ra   ô   s   ra   c               @   s   e Zd ZejZdS )ÚLifoQueueTestN)r   r   r   rC   r0   rT   r   r   r   r   rb   ÷   s   rb   c               @   s   e Zd ZejZdS )ÚPriorityQueueTestN)r   r   r   rC   r1   rT   r   r   r   r   rc   ú   s   rc   c               @   s   e Zd ZdS )ÚFailingQueueExceptionN)r   r   r   r   r   r   r   rd      s   rd   c               @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚFailingQueuec             G   s"   d| _ d| _tjj| f|žŽ  d S )NF)Úfail_next_putÚfail_next_getrC   r/   r   )r   r   r   r   r   r     s    zFailingQueue.__init__c             C   s"   | j rd| _ tdƒ‚tj | |¡S )NFzYou Lose)rf   rd   rC   r/   Ú_put)r   Úitemr   r   r   rh     s    zFailingQueue._putc             C   s    | j rd| _ tdƒ‚tj | ¡S )NFzYou Lose)rg   rd   rC   r/   Ú_get)r   r   r   r   rj     s    zFailingQueue._getN)r   r   r   r   rh   rj   r   r   r   r   re     s   re   c               @   s   e Zd Zdd„ Zdd„ ZdS )ÚFailingQueueTestc             C   sô  |  ¡ rtdƒ‚xttd ƒD ]}| |¡ qW d|_y|jddd |  d¡ W n tk
rf   Y nX d|_y|jddd	 |  d¡ W n tk
rž   Y nX | d
¡ |  t	|ƒd¡ d|_y"|  
|jd|jd¡ |  d¡ W n tk
rö   Y nX | d
¡ d|_y$|  |jd|jdt¡ |  d¡ W n tk
rB   Y nX | d
¡ |  t	|ƒd¡ | ¡  |  t	|ƒ d¡ | d
¡ |  t	|ƒd¡ |  
|jd|jd¡ xttƒD ]}| ¡  q°W |  |  ¡  d¡ | d¡ d|_y| ¡  |  d¡ W n tk
r   Y nX |  |  ¡ d¡ d|_y|jdd	 |  d¡ W n tk
rX   Y nX |  |  ¡ d¡ | ¡  |  |  ¡  d¡ d|_y$|  |jd|jdt¡ |  d¡ W n tk
rÄ   Y nX |  |  ¡ d¡ | ¡  |  |  ¡  d¡ d S )Nz&Call this function with an empty queuer2   TZoopsr   )r5   z)The queue didn't fail when it should havegš™™™™™¹?)r6   rG   zQueue should be full)r;   r   )r;   Tr   zQueue should not be fullzQueue should be emptyÚfirstzQueue should not be empty)r7   )r   r8   rA   rB   r<   rf   r   rd   r9   r	   r&   r>   r'   rg   )r   r   rF   r   r   r   Úfailing_queue_test  sŠ    




z#FailingQueueTest.failing_queue_testc             C   s    t tƒ}|  |¡ |  |¡ d S )N)re   rB   rm   )r   r   r   r   r   Útest_failing_queuef  s    
z#FailingQueueTest.test_failing_queueN)r   r   r   rm   rn   r   r   r   r   rk     s   Qrk   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 )ÚBaseSimpleQueueTestc             C   s   |   ¡ | _d S )N)rT   r   )r   r   r   r   r,   p  s    zBaseSimpleQueueTest.setUpc             C   sT   xNy|  ¡ }W n tk
r"   d S X | |¡ | ¡ dkrt | ¡ d ¡ qW d S )Ng      à?gü©ñÒMbP?)ÚpopÚ
IndexErrorr<   Úrandomr   r   )r   r   ÚseqÚrndÚvalr   r   r   Úfeeds  s    
zBaseSimpleQueueTest.feedc             C   s(   x"|  ¡ }||krd S | |¡ qW d S )N)r>   rO   )r   r   ÚresultsÚsentinelru   r   r   r   Úconsume}  s
    zBaseSimpleQueueTest.consumec             C   sZ   xTx8y|j dd}W n  tjk
r4   t d¡ Y qX P qW ||krHd S | |¡ qW d S )NF)r5   gñhãˆµøä>)r>   rC   rE   r   r   rO   )r   r   rw   rx   ru   r   r   r   Úconsume_nonblock„  s    z$BaseSimpleQueueTest.consume_nonblockc             C   sP   xJx.y|j dd}W n tjk
r*   Y qX P qW ||kr>d S | |¡ qW d S )Ngñhãˆµøä>)r6   )r>   rC   rE   rO   )r   r   rw   rx   ru   r   r   r   Úconsume_timeout‘  s    z#BaseSimpleQueueTest.consume_timeoutc       	   	      sº   g ‰d ‰|ˆg|  ‰ˆ  ¡  t d¡‰g ‰‡fdd„‰‡‡‡‡‡fdd„t|ƒD ƒ}‡ ‡‡‡‡fdd„t|ƒD ƒ}t || ¡ W d Q R X |  ˆ¡ |  ˆ ¡ ¡ |  	ˆ 
¡ d¡ ˆS )Né*   c                s   ‡‡ fdd„}|S )Nc           
      s@   yˆ| |Ž W n, t k
r: } zˆ  |¡ W d d }~X Y nX d S )N)ÚBaseExceptionrO   )r   ÚkwargsÚe)Ú
exceptionsÚfr   r   Úwrapper¨  s    zHBaseSimpleQueueTest.run_threads.<locals>.log_exceptions.<locals>.wrapperr   )r   r‚   )r€   )r   r   Úlog_exceptions§  s    z7BaseSimpleQueueTest.run_threads.<locals>.log_exceptionsc                s$   g | ]}t jˆˆ ƒˆˆˆfd ‘qS ))rL   r   )r   r   )Ú.0rF   )Ú	feed_funcrƒ   r   rt   rs   r   r   ú
<listcomp>¯  s   z3BaseSimpleQueueTest.run_threads.<locals>.<listcomp>c                s$   g | ]}t jˆˆ ƒˆˆˆfd ‘qS ))rL   r   )r   r   )r„   rF   )Úconsume_funcrƒ   r   rw   rx   r   r   r†   ²  s   r   )Úreverserr   ÚRandomrA   r   Ústart_threadsr:   r9   r7   r?   r   )	r   Z	n_feedersZn_consumersr   Úinputsr…   r‡   ZfeedersZ	consumersr   )	r‡   r€   r…   rƒ   r   rw   rt   rx   rs   r   Úrun_threadsž  s"    


zBaseSimpleQueueTest.run_threadsc          	   C   s¶  | j }|  | ¡ ¡ |  | ¡ d¡ | d¡ |  | ¡ ¡ |  | ¡ d¡ | d¡ | d¡ | d¡ |  | ¡ ¡ |  | ¡ d¡ |  | ¡ d¡ |  | ¡ d¡ |  | 	¡ d¡ |  | ¡ d¡ |  |jddd¡ |  | ¡ ¡ |  | ¡ d¡ |  |jdd	d¡ |  | ¡ ¡ |  | ¡ d¡ |  
tj¡ |jdd W d Q R X |  
tj¡ |jd
d	 W d Q R X |  
tj¡ | 	¡  W d Q R X |  | ¡ ¡ |  | ¡ d¡ d S )Nr   r2   r3   r^   r_   F)r5   gš™™™™™¹?)r6   gü©ñÒMbP?)r   r9   r7   r?   r   r<   r:   r[   r>   r\   rY   rC   rE   )r   r   r   r   r   rX   ¿  s:    



zBaseSimpleQueueTest.test_basicc          	   C   s6   | j }| d¡ |  t¡ |jdd W d Q R X d S )Nr2   rN   )r6   )r   r<   rY   rU   r>   )r   r   r   r   r   rZ   ä  s    
z:BaseSimpleQueueTest.test_negative_timeout_raises_exceptionc             C   s:   | j }ttdƒƒ}|  dd||| j| j¡}|  ||¡ d S )NrM   r2   )r   ÚlistrA   rŒ   rv   ry   r?   )r   r   r‹   rw   r   r   r   Ú
test_orderê  s    zBaseSimpleQueueTest.test_orderc             C   sB   d}| j }ttdƒƒ}|  ||||| j| j¡}|  t|ƒ|¡ d S )Né2   i'  )r   r   rA   rŒ   rv   ry   r?   Úsorted)r   ÚNr   r‹   rw   r   r   r   Útest_many_threadsó  s
    z%BaseSimpleQueueTest.test_many_threadsc             C   sB   d}| j }ttdƒƒ}|  ||||| j| j¡}|  t|ƒ|¡ d S )Nr   i'  )r   r   rA   rŒ   rv   rz   r?   r   )r   r‘   r   r‹   rw   r   r   r   Útest_many_threads_nonblockþ  s    z.BaseSimpleQueueTest.test_many_threads_nonblockc             C   sB   d}| j }ttdƒƒ}|  ||||| j| j¡}|  t|ƒ|¡ d S )Nr   iè  )r   r   rA   rŒ   rv   r{   r?   r   )r   r‘   r   r‹   rw   r   r   r   Útest_many_threads_timeout  s    z-BaseSimpleQueueTest.test_many_threads_timeoutc             C   sf   G dd„ dƒ}d}| j }xt|ƒD ]}| |ƒ ¡ q"W x*t|ƒD ]}t | ¡ ¡}|  |ƒ ¡ q@W d S )Nc               @   s   e Zd ZdS )z.BaseSimpleQueueTest.test_references.<locals>.CN)r   r   r   r   r   r   r   ÚC  s   r•   é   )r   rA   r<   ÚweakrefÚrefr>   ÚassertIsNone)r   r•   r‘   r   rF   Úwrr   r   r   Útest_references  s    z#BaseSimpleQueueTest.test_referencesN)r   r   r   r,   rv   ry   rz   r{   rŒ   rX   rZ   rŽ   r’   r“   r”   r›   r   r   r   r   ro   n  s   
!%	

ro   c               @   s   e Zd ZejZdS )ÚPySimpleQueueTestN)r   r   r   rC   Ú_PySimpleQueuerT   r   r   r   r   rœ   !  s   rœ   zNo _queue module foundc                   s,   e Zd Z‡ fdd„Zdd„ Zdd„ Z‡  ZS )ÚCSimpleQueueTestc                s   t j| _tƒ  ¡  d S )N)Ú_queueÚSimpleQueuerT   Úsuperr,   )r   )r@   r   r   r,   (  s    zCSimpleQueueTest.setUpc             C   s   |   | jtj¡ d S )N)ÚassertIsrT   rC   r    )r   r   r   r   Útest_is_default,  s    z CSimpleQueueTest.test_is_defaultc                s€   | j ‰t ¡ ‰ d}g }G ‡ ‡fdd„dtƒ}x6|ƒ }ˆ tˆ ƒ¡ ~| ˆ ¡ ¡ |d |kr.P q.W |  |t	t
|d ƒƒ¡ d S )Ni'  c                   s"   e Zd Zdd„ Z‡ ‡fdd„ZdS )z2CSimpleQueueTest.test_reentrancy.<locals>.Circularc             S   s
   | | _ d S )N)Zcircular)r   r   r   r   r   ;  s    z;CSimpleQueueTest.test_reentrancy.<locals>.Circular.__init__c                s   ˆ  tˆ ƒ¡ d S )N)r<   Únext)r   )Úgenr   r   r   Ú__del__>  s    z:CSimpleQueueTest.test_reentrancy.<locals>.Circular.__del__N)r   r   r   r   r¦   r   )r¥   r   r   r   ÚCircular:  s   r§   rN   r2   )r   Ú	itertoolsÚcountÚobjectr<   r¤   rO   r>   r?   r   rA   )r   r‘   rw   r§   Úor   )r¥   r   r   Útest_reentrancy/  s    z CSimpleQueueTest.test_reentrancy)r   r   r   r,   r£   r¬   Ú__classcell__r   r   )r@   r   rž   %  s   rž   Ú__main__)"Úcollectionsr¨   rC   rr   Úsysr   r   Úunittestr—   Útestr   rŸ   ÚImportErrorrB   r	   r   r
   r   r(   ÚTestCasera   rb   rc   Ú	Exceptionrd   r/   re   rk   ro   rœ   ÚskipIfrž   r   Úmainr   r   r   r   Ú<module>   s@   
 " [ 4&
