o
    ±ó®gÄ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 dS )3é    N)Úimport_helper)Úthreading_helperÚ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   úE/Users/admin/.pyenv/versions/3.10.0/lib/python3.10/test/test_queue.pyÚqfull   s   r   c                   @   ó   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                   @   r   )ÚBlockingTestMixinc              	   C   sT   t ||ƒ}| ¡  z||Ž | _|j ¡ s|  d| ¡ | jW t |¡ S t |¡ w )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_test9   s   


ÿz"BlockingTestMixin.do_blocking_testc              	   C   sŠ   t ||ƒ}| ¡  z*z||Ž  W n |y   ‚ w |  d| ¡ W t |¡ |j ¡ s2|  d¡ d S d S t |¡ |j ¡ sD|  d¡ w w )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_testG   s&   
ÿÿ

ÿ
ÿ
ÿz.BlockingTestMixin.do_exceptional_blocking_testN)r   r    r!   r-   r.   r   r   r   r   r"   7   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   ÚsetUpZ   s   zBaseQueueTestMixin.setUpc                 C   sh  |  ¡ rtdƒ‚|  | ¡ ¡ |  | ¡ ¡ | d¡ | d¡ | d¡ tg d¢g d¢g d¢d}| ¡ | ¡ | ¡ g}|  	|||j
j d	¡ ttd
 ƒD ]}| |¡ |  |  ¡ d¡ qN|  t|ƒ d¡ dt }dt }| |¡ |  t|ƒd¡ |  | ¡ ¡ |  | ¡ ¡ z|j|dd |  d¡ W n | jjy£   Y nw z|j|dd |  d¡ W n | jjy½   Y nw |  |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w z|jdd |  d¡ W n | jjy   Y nw |  |jd|jd¡ |  |jd|jd¡ d S )Nú&Call this function with an empty queueéo   éM  éÞ   )r5   r6   r7   )r7   r6   r5   )r5   r7   r6   )Ú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)TrE   )r	   ÚRuntimeErrorÚ
assertTruerH   ÚassertFalseÚfullÚputÚdictÚgetÚassertEqualÚ	__class__r   ÚrangeÚ
QUEUE_SIZEr   r&   r   ÚFullr-   ÚEmpty)r   r
   Ztarget_orderZactual_orderÚiÚlastrL   r   r   r   Úbasic_queue_test^   sp   


þÿ

ÿÿ
ÿÿz#BaseQueueTestMixin.basic_queue_testc                 C   s\   	 |  ¡ }|dk r| ¡  d S | j |  j|7  _W d   ƒ n1 s$w   Y  | ¡  q)NTr   )rO   Ú	task_doner2   r0   )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¡ q:| ¡  |D ]}| ¡  qHd S )Nr   )r   r;   ©Útargetr   éd   z0q.join() did not block until all tasks were doneéÿÿÿÿ)r0   r   r   r[   r#   ÚappendrR   rM   ÚjoinrP   Úsum)r   r
   ÚthreadsrV   r,   r   r   r   Úqueue_join_test¡   s$   ÿ
ÿz"BaseQueueTestMixin.queue_join_testc                 C   s8   |   ¡ }z| ¡  W n
 ty   Y d S w |  d¡ d S ©Nz(Did not detect task count going negative)Ú	type2testrY   Ú
ValueErrorr&   ©r   r
   r   r   r   Útest_queue_task_done³   s   ÿz'BaseQueueTestMixin.test_queue_task_donec                 C   sL   |   ¡ }|  |¡ |  |¡ z| ¡  W n
 ty   Y d S w |  d¡ d S re   )rf   rd   rY   rg   r&   rh   r   r   r   Útest_queue_join½   s   

ÿz"BaseQueueTestMixin.test_queue_joinc                 C   ó"   |   t¡}|  |¡ |  |¡ d S r   )rf   rS   rX   rh   r   r   r   Ú
test_basicÊ   s   

zBaseQueueTestMixin.test_basicc                 C   s€   |   t¡}|  t¡ |jddd W d   ƒ n1 sw   Y  |  t¡ |jddd W d   ƒ d S 1 s9w   Y  d S ©Nr;   r_   rC   )rf   rS   ÚassertRaisesrg   rM   rO   rh   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 s(w   Y  ttƒD ]}| ¡  q1|  | jj¡ | ¡  W d   ƒ d S 1 sOw   Y  d S )Nr;   )	rf   rS   rR   Ú
put_nowaitrn   r   rT   Ú
get_nowaitrU   ©r   r
   rV   r   r   r   Útest_nowaitØ   s   
ÿ

"ÿzBaseQueueTestMixin.test_nowaitc                 C   s´   |   d¡}| d¡ | d¡ | d¡ |  | jj¡ | d¡ W d   ƒ n1 s+w   Y  |  | ¡ d¡ d|_|  | jj¡ | d¡ W d   ƒ d S 1 sSw   Y  d S )Né   r;   r>   é   )	rf   rM   rn   r   rT   rp   rP   r	   r   rh   r   r   r   Útest_shrinking_queueä   s   



ÿ"ÿz'BaseQueueTestMixin.test_shrinking_queueN)r   r    r!   r3   rX   r[   rd   ri   rj   rl   ro   rs   rv   r   r   r   r   r/   Y   s    9

r/   c                       ó   e Zd Z‡ fdd„Z‡  ZS )Ú	QueueTestc                    ó   | j j| _tƒ  ¡  d S r   )r   r8   rf   Úsuperr3   r   ©rQ   r   r   r3   ó   ó   
zQueueTest.setUp©r   r    r!   r3   Ú__classcell__r   r   r{   r   rx   ñ   ó    rx   c                   @   ó   e Zd ZeZdS )ÚPyQueueTestN©r   r    r!   Úpy_queuer   r   r   r   r   r   ÷   ó    r   c                   @   r€   )Ú
CQueueTestN©r   r    r!   Úc_queuer   r   r   r   r   r…   û   ó    r…   c                       rw   )ÚLifoQueueTestc                    ry   r   )r   r9   rf   rz   r3   r   r{   r   r   r3     r|   zLifoQueueTest.setUpr}   r   r   r{   r   r‰      r   r‰   c                   @   r€   )ÚPyLifoQueueTestNr‚   r   r   r   r   rŠ     r„   rŠ   c                   @   r€   )ÚCLifoQueueTestNr†   r   r   r   r   r‹     rˆ   r‹   c                       rw   )ÚPriorityQueueTestc                    ry   r   )r   r:   rf   rz   r3   r   r{   r   r   r3     r|   zPriorityQueueTest.setUpr}   r   r   r{   r   rŒ     r   rŒ   c                   @   r€   )ÚPyPriorityQueueTestNr‚   r   r   r   r   r     r„   r   c                   @   r€   )ÚCPriorityQueueTestNr†   r   r   r   r   rŽ     rˆ   rŽ   c                   @   ó   e Zd ZdS )ÚFailingQueueExceptionN©r   r    r!   r   r   r   r   r   !  s    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   ©r8   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™   3  s   
z1FailingQueueTest.setUp.<locals>.FailingQueue._getN)r   r    r!   r   r—   r™   r   r•   r   r   ÚFailingQueue)  s    rš   )r   r8   rš   rz   r3   )r   rš   r{   r•   r   r3   %  s   zFailingQueueTest.setUpc                 C   sØ  |  ¡ rtdƒ‚ttd ƒD ]}| |¡ qd|_z|jddd |  d¡ W n	 ty0   Y nw d|_z|jddd	 |  d¡ W n	 tyK   Y nw | d
¡ |  t	|ƒd¡ d|_z|  
|jd|jd¡ |  d¡ W n	 tyv   Y nw | d
¡ d|_z|  |jd|jdt¡ |  d¡ W n	 tyš   Y nw | 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w |  |  ¡ d¡ d|_z|jdd	 |  d¡ W n
 ty   Y nw |  |  ¡ d¡ | ¡  |  |  ¡  d¡ d|_z|  |jd|jdt¡ |  d¡ W n
 tyT   Y nw |  |  ¡ d¡ | ¡  |  |  ¡  d¡ d S )Nr4   r;   TZoopsr   rA   z)The queue didn't fail when it should haver   rC   rW   r@   )rL   r   )rL   TrE   r=   rF   Úfirstr<   rG   )r	   rI   rR   rS   rM   r“   r&   r   rJ   r   r-   rO   r.   r”   rr   r   r   r   Úfailing_queue_test=  sœ   ÿÿ
ÿ
ÿÿ



ÿÿÿÿz#FailingQueueTest.failing_queue_testc                 C   rk   r   )rš   rS   rœ   rh   r   r   r   Útest_failing_queueŽ  s   

z#FailingQueueTest.test_failing_queue)r   r    r!   r3   rœ   r   r~   r   r   r{   r   r’   #  s    Qr’   c                   @   r€   )ÚPyFailingQueueTestNr‚   r   r   r   r   rž   ˜  r„   rž   c                   @   r€   )ÚCFailingQueueTestNr†   r   r   r   r   rŸ   œ  rˆ   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   )rf   r
   r   r   r   r   r3   £  s   zBaseSimpleQueueTest.setUpc                 C   sN   	 z|  ¡ }W n
 ty   Y d S w | |¡ | ¡ dkr&t | ¡ d ¡ q)NTg      à?çü©ñÒMbP?)ÚpopÚ
IndexErrorrM   Úrandomr   r   )r   r
   ÚseqÚrndÚvalr   r   r   Úfeed¦  s   ÿ
ùzBaseSimpleQueueTest.feedc                 C   s"   	 |  ¡ }||krd S | |¡ q)NT)rO   r`   ©r   r
   ÚresultsÚsentinelr§   r   r   r   Úconsume°  s   
üzBaseSimpleQueueTest.consumec                 C   sR   	 	 z|j dd}W n | jjy   t d¡ Y nw qq||kr#d S | |¡ q)NTFrA   çñhãˆµøä>)rO   r   rU   r   r   r`   r©   r   r   r   Úconsume_nonblock·  s   ÿú
öz$BaseSimpleQueueTest.consume_nonblockc                 C   sH   	 	 z|j dd}W n | jjy   Y nw qq||krd S | |¡ q)NTr­   rC   )rO   r   rU   r`   r©   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   ƒ n1 sLw   Y  |  ˆ¡ |  ˆ ¡ ¡ |  	ˆ 
¡ d¡ ˆS )Né*   c                    s   ‡‡ fdd„}|S )Nc               
      sF   z
ˆ| i |¤Ž W d S  t y" } zˆ  |¡ W Y d }~d S d }~ww 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   ©Ú.0rV   )Ú	feed_funcr·   r
   r¦   r¥   r   r   Ú
<listcomp>â  ó
    
þ
ÿ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½   å  r¾   r   )Úreverser¤   ÚRandomrR   r   Zstart_threadsrK   rJ   rH   rP   r	   )	r   Z	n_feedersZn_consumersr
   Ú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®w   Y  |  
| jj¡ |jd
d	 W d   ƒ n1 sËw   Y  |  
| jj¡ | 	¡  W d   ƒ n1 sæw   Y  |  | ¡ ¡ |  | ¡ d¡ d S )Nr   r;   r>   rt   ru   FrA   r   rC   r¡   )r
   rJ   rH   rP   r	   rM   rK   rp   rO   rq   rn   r   rU   rh   r   r   r   rl   ò  s@   



ÿÿ
ÿzBaseSimpleQueueTest.test_basicc                 C   sL   | j }| d¡ |  t¡ |jdd W d   ƒ d S 1 sw   Y  d S rm   )r
   rM   rn   rg   rO   rh   r   r   r   ro     s
   
"ÿz:BaseSimpleQueueTest.test_negative_timeout_raises_exceptionc                 C   s:   | j }ttdƒƒ}|  dd||| j| j¡}|  ||¡ d S )Nr^   r;   )r
   ÚlistrR   rÃ   r¨   r¬   rP   )r   r
   rÂ   rª   r   r   r   Ú
test_order  s   zBaseSimpleQueueTest.test_orderc                 C   óB   d}| j }ttdƒƒ}|  ||||| j| j¡}|  t|ƒ|¡ d S ©Né2   é'  )r
   rÄ   rR   rÃ   r¨   r¬   rP   Úsorted©r   ÚNr
   rÂ   rª   r   r   r   Útest_many_threads&  s
   z%BaseSimpleQueueTest.test_many_threadsc                 C   rÆ   rÇ   )r
   rÄ   rR   rÃ   r¨   r®   rP   rÊ   rË   r   r   r   Útest_many_threads_nonblock1  ó   ÿz.BaseSimpleQueueTest.test_many_threads_nonblockc                 C   rÆ   )NrÈ   iè  )r
   rÄ   rR   rÃ   r¨   r¯   rP   rÊ   rË   r   r   r   Útest_many_threads_timeout;  rÏ   z-BaseSimpleQueueTest.test_many_threads_timeoutc                 C   s^   G dd„ dƒ}d}| j }t|ƒD ]}| |ƒ ¡ qt|ƒD ]}t | ¡ ¡}|  |ƒ ¡ qd S )Nc                   @   r   )z.BaseSimpleQueueTest.test_references.<locals>.CNr‘   r   r   r   r   ÚCH  s    rÑ   é   )r
   rR   rM   ÚweakrefÚrefrO   ZassertIsNone)r   rÑ   rÌ   r
   rV   Úwrr   r   r   Útest_referencesE  s   þz#BaseSimpleQueueTest.test_referencesN)r   r    r!   r3   r¨   r¬   r®   r¯   rÃ   rl   ro   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                    ry   r   )r   Ú_PySimpleQueuerf   rz   r3   r   r{   r   r   r3   W  r|   zPySimpleQueueTest.setUp)r   r    r!   rƒ   r   r3   r~   r   r   r{   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                    ry   r   )r   ÚSimpleQueuerf   rz   r3   r   r{   r   r   r3   a  r|   zCSimpleQueueTest.setUpc                 C   s(   |   | j| jj¡ |   | j| jj¡ d S r   )ZassertIsrf   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r0q1q|  |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   )rM   Ú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à   Tr_   r;   )r
   Ú	itertoolsÚcountÚobjectrM   rÜ   r`   rO   rP   rÄ   rR   )r   rÌ   rª   rà   Úor   rÝ   r   Útest_reentrancyi  s   úz CSimpleQueueTest.test_reentrancy)	r   r    r!   r‡   r   r3   rÛ   rå   r~   r   r   r{   r   rÙ   \  s
    rÙ   Ú__main__)(rá   r¤   r   r   ZunittestrÓ   Ztest.supportr   r   Zimport_fresh_modulerƒ   r‡   Z
skipUnlessZneed_c_queuerS   r   r   r   r"   r/   rx   ZTestCaser   r…   r‰   rŠ   r‹   rŒ   r   rŽ   Ú	Exceptionr   r’   rž   rŸ   r    r×   rÙ   r   Úmainr   r   r   r   Ú<module>   sT    " u 4)ÿ