a
    äze¬Q  ã                   @   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mZ d dlm	Z	 ej
ddgdZej
ddgdZe ed¡Z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ƒZG dd„ deejƒZeG dd„ deejƒƒZG dd„ deƒZG dd„ deejƒZeG dd„ deejƒƒZG dd„ deƒZG d d!„ d!eejƒZeG d"d#„ d#eejƒƒZG d$d%„ d%eƒZ G d&d'„ d'eƒZ!G d(d)„ d)e!ejƒZ"eG d*d+„ d+e!ejƒƒZ#G d,d-„ d-ƒZ$G d.d/„ d/e$ejƒZ%eG d0d1„ d1e$ejƒƒZ&e'd2krüe (¡  dS )3é    N)Úsupport)Ú
gc_collectÚqueueÚ_queue)Zblocked)ZfreshzNo _queue module foundé   c                 C   s   | j dko|  ¡ | j kS ©Nr   )ÚmaxsizeÚqsize)Úq© r   ú%/usr/lib/python3.9/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 )Nçš™™™™™¹?)Ú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   sX   t ||ƒ}| ¡  z4||Ž | _|j ¡ s6|  d| ¡ | jW t |¡ S t |¡ 0 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_test8   s    


ÿ
þz"BlockingTestMixin.do_blocking_testc              	   C   sŠ   t ||ƒ}| ¡  zRz||Ž  W n |y4   ‚ Y n0 |  d| ¡ W t |¡ |j ¡ s†|  d¡ n t |¡ |j ¡ s„|  d¡ 0 d S )Nzexpected exception of kind %rz(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_testF   s     
ÿ

þ

z.BlockingTestMixin.do_exceptional_blocking_testN)r   r   r    r,   r-   r   r   r   r   r!   6   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 r   )Úcumr   ÚLockÚcumlockr   r   r   r   ÚsetUpY   s    zBaseQueueTestMixin.setUpc                 C   sn  |  ¡ rtdƒ‚|  | ¡ ¡ |  | ¡ ¡ | d¡ | d¡ | d¡ tg d¢g d¢g d¢d}| ¡ | ¡ | ¡ g}|  	|||j
j d	¡ ttd
 ƒD ]}| |¡ |  |  ¡ d¡ qœ|  t|ƒ d¡ dt }dt }| |¡ |  t|ƒd¡ |  | ¡ ¡ |  | ¡ ¡ z|j|dd |  d¡ W n | jjyH   Y n0 z|j|dd |  d¡ W n | jjy~   Y n0 |  |j|f|jd¡ |  |j|ddf|jd¡ ttƒD ]}| ¡  q¸|  |  ¡  d¡ z|jdd |  d¡ W n | jjy   Y n0 z|jdd |  d¡ W n | jjy@   Y n0 |  |jd|jd¡ |  |jd|jd¡ d S )Nú&Call this function with an empty queueéo   éM  éÞ   )r4   r5   r6   )r6   r5   r4   )r4   r6   r5   )ÚQueueÚ	LifoQueueÚPriorityQueuez&Didn't seem to queue the correct data!é   úQueue should not be emptyúQueue should not be fullé   é   ú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   Té
   úQueue should be emptyz*Didn't appear to block with an empty queuez-Didn't appear to time-out with an empty queue©Úempty)TrD   )r	   ÚRuntimeErrorÚ
assertTruerG   ÚassertFalseÚfullÚputÚdictÚgetÚassertEqualÚ	__class__r   ÚrangeÚ
QUEUE_SIZEr   r%   r   ÚFullr,   ÚEmpty)r   r
   Ztarget_orderZactual_orderÚiÚlastrK   r   r   r   Úbasic_queue_test]   sh    


þÿ

z#BaseQueueTestMixin.basic_queue_testc                 C   s^   |  ¡ }|dk r| ¡  d S | j |  j|7  _W d   ƒ n1 sF0    Y  | ¡  q d S r   )rN   Ú	task_doner1   r/   )r   r
   Úxr   r   r   Úworker–   s    ,zBaseQueueTestMixin.workerc                 C   s¢   d| _ g }dD ](}tj| j|fd}| ¡  | |¡ qtdƒD ]}| |¡ q@| ¡  |  	| j t
tdƒƒd¡ dD ]}| d¡ qt| ¡  |D ]}| ¡  qd S )Nr   )r   r:   ©Útargetr   éd   z0q.join() did not block until all tasks were doneéÿÿÿÿ)r/   r   r   rZ   r"   ÚappendrQ   rL   ÚjoinrO   Úsum)r   r
   ÚthreadsrU   r+   r   r   r   Úqueue_join_test    s"    ÿz"BaseQueueTestMixin.queue_join_testc                 C   s6   |   ¡ }z| ¡  W n ty&   Y n0 |  d¡ d S ©Nz(Did not detect task count going negative)Ú	type2testrX   Ú
ValueErrorr%   ©r   r
   r   r   r   Útest_queue_task_done²   s    z'BaseQueueTestMixin.test_queue_task_donec                 C   sJ   |   ¡ }|  |¡ |  |¡ z| ¡  W n ty:   Y n0 |  d¡ d S rd   )re   rc   rX   rf   r%   rg   r   r   r   Útest_queue_join¼   s    

z"BaseQueueTestMixin.test_queue_joinc                 C   s"   |   t¡}|  |¡ |  |¡ d S r   )re   rR   rW   rg   r   r   r   Ú
test_basicÉ   s    

zBaseQueueTestMixin.test_basicc                 C   s~   |   t¡}|  t¡ |jddd W d   ƒ n1 s80    Y  |  t¡ |jddd W d   ƒ n1 sp0    Y  d S ©Nr:   r^   rB   )re   rR   ÚassertRaisesrf   rL   rN   rg   r   r   r   Ú&test_negative_timeout_raises_exceptionÐ   s
    
,z9BaseQueueTestMixin.test_negative_timeout_raises_exceptionc                 C   sª   |   t¡}ttƒD ]}| d¡ q|  | jj¡ | d¡ W d   ƒ n1 sP0    Y  ttƒD ]}| ¡  qb|  | jj¡ | ¡  W d   ƒ n1 sœ0    Y  d S )Nr:   )	re   rR   rQ   Ú
put_nowaitrl   r   rS   Ú
get_nowaitrT   ©r   r
   rU   r   r   r   Útest_nowait×   s    
(
zBaseQueueTestMixin.test_nowaitc                 C   s²   |   d¡}| d¡ | d¡ | d¡ |  | jj¡ | d¡ W d   ƒ n1 sV0    Y  |  | ¡ d¡ d|_|  | jj¡ | d¡ W d   ƒ n1 s¤0    Y  d S )Né   r:   r=   é   )	re   rL   rl   r   rS   rn   rO   r	   r   rg   r   r   r   Útest_shrinking_queueã   s    



(z'BaseQueueTestMixin.test_shrinking_queueN)r   r   r    r2   rW   rZ   rc   rh   ri   rj   rm   rq   rt   r   r   r   r   r.   X   s   9

r.   c                       s   e Zd Z‡ fdd„Z‡  ZS )Ú	QueueTestc                    s   | j j| _tƒ  ¡  d S r   )r   r7   re   Úsuperr2   r   ©rP   r   r   r2   ò   s    
zQueueTest.setUp©r   r   r    r2   Ú__classcell__r   r   rw   r   ru   ð   s   ru   c                   @   s   e Zd ZeZdS )ÚPyQueueTestN©r   r   r    Úpy_queuer   r   r   r   r   rz   ö   s   rz   c                   @   s   e Zd ZeZdS )Ú
CQueueTestN©r   r   r    Úc_queuer   r   r   r   r   r}   ú   s   r}   c                       s   e Zd Z‡ fdd„Z‡  ZS )ÚLifoQueueTestc                    s   | j j| _tƒ  ¡  d S r   )r   r8   re   rv   r2   r   rw   r   r   r2     s    
zLifoQueueTest.setUprx   r   r   rw   r   r€   ÿ   s   r€   c                   @   s   e Zd ZeZdS )ÚPyLifoQueueTestNr{   r   r   r   r   r     s   r   c                   @   s   e Zd ZeZdS )ÚCLifoQueueTestNr~   r   r   r   r   r‚   
  s   r‚   c                       s   e Zd Z‡ fdd„Z‡  ZS )ÚPriorityQueueTestc                    s   | j j| _tƒ  ¡  d S r   )r   r9   re   rv   r2   r   rw   r   r   r2     s    
zPriorityQueueTest.setUprx   r   r   rw   r   rƒ     s   rƒ   c                   @   s   e Zd ZeZdS )ÚPyPriorityQueueTestNr{   r   r   r   r   r„     s   r„   c                   @   s   e Zd ZeZdS )ÚCPriorityQueueTestNr~   r   r   r   r   r…     s   r…   c                   @   s   e Zd ZdS )ÚFailingQueueExceptionN©r   r   r    r   r   r   r   r†      ó    r†   c                       s,   e Zd Z‡ fdd„Zdd„ Zdd„ Z‡  ZS )ÚFailingQueueTestc                    s0   | j j‰ G ‡ fdd„dˆ ƒ}|| _tƒ  ¡  d S )Nc                       s0   e Zd Z‡ fdd„Z‡ fdd„Z‡ fdd„ZdS )z,FailingQueueTest.setUp.<locals>.FailingQueuec                    s"   d| _ d| _ˆ j| g|¢R Ž  d S )NF)Úfail_next_putÚfail_next_getr   )r   r   ©r7   r   r   r   )  s    z5FailingQueueTest.setUp.<locals>.FailingQueue.__init__c                    s    | j rd| _ tdƒ‚ˆ  | |¡S ©NFzYou Lose)rŠ   r†   Ú_put)r   ÚitemrŒ   r   r   rŽ   -  s    z1FailingQueueTest.setUp.<locals>.FailingQueue._putc                    s   | j rd| _ tdƒ‚ˆ  | ¡S r   )r‹   r†   Ú_getr   rŒ   r   r   r   2  s    z1FailingQueueTest.setUp.<locals>.FailingQueue._getN)r   r   r    r   rŽ   r   r   rŒ   r   r   ÚFailingQueue(  s   r‘   )r   r7   r‘   rv   r2   )r   r‘   rw   rŒ   r   r2   $  s    zFailingQueueTest.setUpc                 C   sÞ  |  ¡ rtdƒ‚ttd ƒD ]}| |¡ qd|_z|jddd |  d¡ W n ty`   Y n0 d|_z|jddd	 |  d¡ W n ty–   Y n0 | d
¡ |  t	|ƒd¡ d|_z"|  
|jd|jd¡ |  d¡ W n tyì   Y n0 | d
¡ d|_z$|  |jd|jdt¡ |  d¡ W n ty6   Y n0 | d
¡ |  t	|ƒd¡ | ¡  |  t	|ƒ d¡ | d
¡ |  t	|ƒd¡ |  
|jd|jd¡ ttƒD ]}| ¡  q¢|  |  ¡  d¡ | d¡ d|_z| ¡  |  d¡ W n tyþ   Y n0 |  |  ¡ d¡ d|_z|jdd	 |  d¡ W n tyD   Y n0 |  |  ¡ d¡ | ¡  |  |  ¡  d¡ d|_z$|  |jd|jdt¡ |  d¡ W n ty®   Y n0 |  |  ¡ d¡ | ¡  |  |  ¡  d¡ d S )Nr3   r:   TZoopsr   r@   z)The queue didn't fail when it should haver   rB   rV   r?   )rK   r   )rK   TrD   r<   rE   Úfirstr;   rF   )r	   rH   rQ   rR   rL   rŠ   r%   r†   rI   r   r,   rN   r-   r‹   rp   r   r   r   Úfailing_queue_test<  sŽ    

ÿ


ÿz#FailingQueueTest.failing_queue_testc                 C   s"   |   t¡}|  |¡ |  |¡ d S r   )r‘   rR   r“   rg   r   r   r   Útest_failing_queue  s    

z#FailingQueueTest.test_failing_queue)r   r   r    r2   r“   r”   ry   r   r   rw   r   r‰   "  s   Qr‰   c                   @   s   e Zd ZeZdS )ÚPyFailingQueueTestNr{   r   r   r   r   r•   —  s   r•   c                   @   s   e Zd ZeZdS )ÚCFailingQueueTestNr~   r   r   r   r   r–   ›  s   r–   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 r   )re   r
   r   r   r   r   r2   ¢  s    zBaseSimpleQueueTest.setUpc                 C   sZ   z|  ¡ }W n ty*   | |¡ Y d S 0 | |¡ | ¡ dkr t | ¡ d ¡ q d S )Ng      à?çü©ñÒMbP?)ÚpopÚ
IndexErrorrL   Úrandomr   r   )r   r
   ÚseqÚrndÚsentinelÚvalr   r   r   Úfeed¥  s    

zBaseSimpleQueueTest.feedc                 C   s$   |  ¡ }||krd S | |¡ q d S r   )rN   r_   ©r   r
   Úresultsrž   rŸ   r   r   r   Úconsume°  s    zBaseSimpleQueueTest.consumec                 C   sR   z|j dd}W q6 | jjy0   t d¡ Y q 0 q6q ||krBd S | |¡ q d S )NFr@   çñhãˆµøä>)rN   r   rT   r   r   r_   r¡   r   r   r   Úconsume_nonblock·  s    z$BaseSimpleQueueTest.consume_nonblockc                 C   sH   z|j dd}W q, | jjy&   Y q 0 q,q ||kr8d S | |¡ q d S )Nr¤   rB   )rN   r   rT   r_   r¡   r   r   r   Úconsume_timeoutÄ  s    z#BaseSimpleQueueTest.consume_timeoutc                    sÊ   g ‰d ‰|  ¡ ‰ˆ ¡  t d¡‰g ‰‡fdd„‰‡‡‡‡‡‡fdd„t|ƒD ƒ}‡ ‡‡‡‡fdd„t|ƒD ƒ}t || ¡ W d   ƒ n1 s”0    Y  |  ˆ¡ |  ˆ 	¡ ¡ |  
ˆ ¡ d¡ ˆS )Né*   c                    s   ‡‡ fdd„}|S )Nc               
      sF   zˆ| i |¤Ž W n. t y@ } zˆ  |¡ W Y d }~n
d }~0 0 d S r   )ÚBaseExceptionr_   )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 ©r[   ©r   r   ©Ú.0rU   )Ú	feed_funcr®   r
   r   rž   rœ   r   r   Ú
<listcomp>á  s   þ

ÿz3BaseSimpleQueueTest.run_threads.<locals>.<listcomp>c                    s$   g | ]}t jˆˆ ƒˆˆˆfd ‘qS r¯   r°   r±   )Úconsume_funcr®   r
   r¢   rž   r   r   r´   ä  s   þ
ÿr   )ÚcopyÚreverser›   ÚRandomrQ   r   Zstart_threadsrJ   rI   rG   rO   r	   )r   Z	n_threadsr
   Úinputsr³   rµ   ZfeedersZ	consumersr   )	rµ   r«   r³   r®   r
   r¢   r   rž   rœ   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¡ |  
| jj¡ |jdd W d   ƒ n1 s^0    Y  |  
| jj¡ |jd
d	 W d   ƒ n1 sš0    Y  |  
| jj¡ | 	¡  W d   ƒ n1 sÒ0    Y  |  | ¡ ¡ |  | ¡ d¡ d S )Nr   r:   r=   rr   rs   Fr@   r   rB   r˜   )r
   rI   rG   rO   r	   rL   rJ   rn   rN   ro   rl   r   rT   rg   r   r   r   rj   ñ  s:    



,,(zBaseSimpleQueueTest.test_basicc                 C   sJ   | j }| d¡ |  t¡ |jdd W d   ƒ n1 s<0    Y  d S rk   )r
   rL   rl   rf   rN   rg   r   r   r   rm     s    
z:BaseSimpleQueueTest.test_negative_timeout_raises_exceptionc                 C   s8   | j }ttdƒƒ}|  d||| j| j¡}|  ||¡ d S )Nr]   r:   )r
   ÚlistrQ   rº   r    r£   rO   )r   r
   r¹   r¢   r   r   r   Ú
test_order  s    zBaseSimpleQueueTest.test_orderc                 C   s@   d}| j }ttdƒƒ}|  |||| j| j¡}|  t|ƒ|¡ d S ©Né2   é'  )r
   r»   rQ   rº   r    r£   rO   Úsorted©r   ÚNr
   r¹   r¢   r   r   r   Útest_many_threads%  s
    z%BaseSimpleQueueTest.test_many_threadsc                 C   s@   d}| j }ttdƒƒ}|  |||| j| j¡}|  t|ƒ|¡ d S r½   )r
   r»   rQ   rº   r    r¥   rO   rÀ   rÁ   r   r   r   Útest_many_threads_nonblock0  s    
ÿz.BaseSimpleQueueTest.test_many_threads_nonblockc                 C   s@   d}| j }ttdƒƒ}|  |||| j| j¡}|  t|ƒ|¡ d S )Nr¾   iè  )r
   r»   rQ   rº   r    r¦   rO   rÀ   rÁ   r   r   r   Útest_many_threads_timeout:  s    
ÿz-BaseSimpleQueueTest.test_many_threads_timeoutc                 C   sd   G dd„ dƒ}d}| j }t|ƒD ]}| |ƒ ¡ q t|ƒD ]$}t | ¡ ¡}tƒ  |  |ƒ ¡ q:d S )Nc                   @   s   e Zd ZdS )z.BaseSimpleQueueTest.test_references.<locals>.CNr‡   r   r   r   r   ÚCG  s   rÆ   é   )r
   rQ   rL   ÚweakrefÚrefrN   r   ZassertIsNone)r   rÆ   rÂ   r
   rU   Úwrr   r   r   Útest_referencesD  s    z#BaseSimpleQueueTest.test_referencesN)r   r   r    r2   r    r£   r¥   r¦   rº   rj   rm   r¼   rÃ   rÄ   rÅ   rË   r   r   r   r   r—      s    %	

r—   c                       s    e Zd ZeZ‡ fdd„Z‡  ZS )ÚPySimpleQueueTestc                    s   | j j| _tƒ  ¡  d S r   )r   Ú_PySimpleQueuere   rv   r2   r   rw   r   r   r2   W  s    
zPySimpleQueueTest.setUp)r   r   r    r|   r   r2   ry   r   r   rw   r   rÌ   T  s   rÌ   c                       s0   e Zd ZeZ‡ fdd„Zdd„ Zdd„ Z‡  ZS )ÚCSimpleQueueTestc                    s   | j j| _tƒ  ¡  d S r   )r   ÚSimpleQueuere   rv   r2   r   rw   r   r   r2   a  s    
zCSimpleQueueTest.setUpc                 C   s(   |   | j| jj¡ |   | j| jj¡ d S r   )ZassertIsre   r   rÏ   r   r   r   r   Útest_is_defaulte  s    z CSimpleQueueTest.test_is_defaultc                    s|   | j ‰t ¡ ‰ d}g }G ‡ ‡fdd„dtƒ}|ƒ }ˆ tˆ ƒ¡ ~| ˆ ¡ ¡ |d |kr,q`q,|  |t	t
|d ƒƒ¡ d S )Nr¿   c                       s"   e Zd Zdd„ Z‡ ‡fdd„ZdS )z2CSimpleQueueTest.test_reentrancy.<locals>.Circularc                 S   s
   | | _ d S r   )Zcircularr   r   r   r   r   u  s    z;CSimpleQueueTest.test_reentrancy.<locals>.Circular.__init__c                    s   ˆ  tˆ ƒ¡ d S r   )rL   Únextr   ©Úgenr
   r   r   Ú__del__x  s    z:CSimpleQueueTest.test_reentrancy.<locals>.Circular.__del__N)r   r   r    r   rÔ   r   rÒ   r   r   ÚCirculart  s   rÕ   r^   r:   )r
   Ú	itertoolsÚcountÚobjectrL   rÑ   r_   rN   rO   r»   rQ   )r   rÂ   r¢   rÕ   Úor   rÒ   r   Útest_reentrancyi  s    z CSimpleQueueTest.test_reentrancy)	r   r   r    r   r   r2   rÐ   rÚ   ry   r   r   rw   r   rÎ   \  s   rÎ   Ú__main__))rÖ   r›   r   r   ZunittestrÈ   Útestr   Ztest.supportr   Zimport_fresh_moduler|   r   Z
skipUnlessZneed_c_queuerR   r   r   r   r!   r.   ru   ZTestCaserz   r}   r€   r   r‚   rƒ   r„   r…   Ú	Exceptionr†   r‰   r•   r–   r—   rÌ   rÎ   r   Úmainr   r   r   r   Ú<module>   sP    " u 5)
