o
    HXîhR  ã                   @   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 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/d0„ d0e$ejƒZ%eG d1d2„ d2e$ejƒƒZ&e'd3kre (¡  dS dS )4é    N)Ú
gc_collect)Ú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   ú9/opt/python-3.10.19/usr/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_test:   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_testH   s&   
ÿÿ

ÿ
ÿ
ÿz.BlockingTestMixin.do_exceptional_blocking_testN)r    r!   r"   r.   r/   r   r   r   r   r#   8   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   ÚsetUp[   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  éÞ   )r6   r7   r8   )r8   r7   r6   )r6   r8   r7   )Ú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)TrF   )r
   ÚRuntimeErrorÚ
assertTruerI   ÚassertFalseÚfullÚputÚdictÚgetÚassertEqualÚ	__class__r    ÚrangeÚ
QUEUE_SIZEr   r'   r   ÚFullr.   ÚEmpty)r   r   Ztarget_orderZactual_orderÚiÚlastrM   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   )rP   Ú	task_doner3   r1   )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éÿÿÿÿ)r1   r   r   r\   r$   ÚappendrS   rN   ÚjoinrQ   Úsum)r   r   ÚthreadsrW   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)Ú	type2testrZ   Ú
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 rf   )rg   re   rZ   rh   r'   ri   r   r   r   Útest_queue_join¾   s   

ÿz"BaseQueueTestMixin.test_queue_joinc                 C   ó"   |   t¡}|  |¡ |  |¡ d S r   )rg   rT   rY   ri   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`   rD   )rg   rT   ÚassertRaisesrh   rN   rP   ri   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<   )	rg   rT   rS   Ú
put_nowaitro   r   rU   Ú
get_nowaitrV   ©r   r   rW   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?   é   )	rg   rN   ro   r   rU   rq   rQ   r
   r	   ri   r   r   r   Útest_shrinking_queueå   s   



ÿ"ÿz'BaseQueueTestMixin.test_shrinking_queueN)r    r!   r"   r4   rY   r\   re   rj   rk   rm   rp   rt   rw   r   r   r   r   r0   Z   s    9

r0   c                       ó   e Zd Z‡ fdd„Z‡  ZS )Ú	QueueTestc                    ó   | j j| _tƒ  ¡  d S r   )r   r9   rg   Úsuperr4   r   ©rR   r   r   r4   ô   ó   
zQueueTest.setUp©r    r!   r"   r4   Ú__classcell__r   r   r|   r   ry   ò   ó    ry   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                       rx   )ÚLifoQueueTestc                    rz   r   )r   r:   rg   r{   r4   r   r|   r   r   r4     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                       rx   )ÚPriorityQueueTestc                    rz   r   )r   r;   rg   r{   r4   r   r|   r   r   r4     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   ©r9   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š   4  s   
z1FailingQueueTest.setUp.<locals>.FailingQueue._getN)r    r!   r"   r   r˜   rš   r   r–   r   r   ÚFailingQueue*  s    r›   )r   r9   r›   r{   r4   )r   r›   r|   r–   r   r4   &  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 )Nr5   r<   TZoopsr   rB   z)The queue didn't fail when it should haver   rD   rX   rA   )rM   r   )rM   TrF   r>   rG   Úfirstr=   rH   )r
   rJ   rS   rT   rN   r”   r'   r‘   rK   r   r.   rP   r/   r•   rs   r   r   r   Úfailing_queue_test>  sœ   ÿÿ
ÿ
ÿÿ



ÿÿÿÿz#FailingQueueTest.failing_queue_testc                 C   rl   r   )r›   rT   r   ri   r   r   r   Útest_failing_queue  s   

z#FailingQueueTest.test_failing_queue)r    r!   r"   r4   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   )rg   r   r   r   r   r   r4   ¤  s   zBaseSimpleQueueTest.setUpc                 C   sX   	 z|  ¡ }W n ty   | |¡ Y d S w | |¡ | ¡ dkr+t | ¡ d ¡ q)NTg      à?çü©ñÒMbP?)ÚpopÚ
IndexErrorrN   Úrandomr   r   )r   r   ÚseqÚrndÚsentinelÚvalr   r   r   Úfeed§  s   
þ
øzBaseSimpleQueueTest.feedc                 C   s"   	 |  ¡ }||krd S | |¡ qr   )rP   ra   ©r   r   Úresultsr¨   r©   r   r   r   Úconsume²  s   
üzBaseSimpleQueueTest.consumec                 C   sR   	 	 z|j dd}W n | jjy   t d¡ Y nw nq||kr#d S | |¡ q)NTFrB   çñhãˆµøä>)rP   r   rV   r   r   ra   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 nq||krd S | |¡ q)NTr®   rD   )rP   r   rV   ra   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 sJw   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   )ÚBaseExceptionra   )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   ©Ú.0rW   )Ú	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¥   ÚRandomrS   r   Zstart_threadsrL   rK   rI   rQ   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®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?   ru   rv   FrB   r   rD   r¢   )r   rK   rI   rQ   r
   rN   rL   rq   rP   rr   ro   r   rV   ri   r   r   r   rm   ó  s@   



ÿÿ
ÿzBaseSimpleQueueTest.test_basicc                 C   sL   | j }| d¡ |  t¡ |jdd W d   ƒ d S 1 sw   Y  d S rn   )r   rN   ro   rh   rP   ri   r   r   r   rp     s
   
"ÿz:BaseSimpleQueueTest.test_negative_timeout_raises_exceptionc                 C   s8   | j }ttdƒƒ}|  d||| j| j¡}|  ||¡ d S )Nr_   r<   )r   ÚlistrS   rÄ   rª   r­   rQ   )r   r   rÃ   r¬   r   r   r   Ú
test_order  s   zBaseSimpleQueueTest.test_orderc                 C   ó@   d}| j }ttdƒƒ}|  |||| j| j¡}|  t|ƒ|¡ d S ©Né2   é'  )r   rÅ   rS   rÄ   rª   r­   rQ   Úsorted©r   ÚNr   rÃ   r¬   r   r   r   Útest_many_threads'  s
   z%BaseSimpleQueueTest.test_many_threadsc                 C   rÇ   rÈ   )r   rÅ   rS   rÄ   rª   r¯   rQ   rË   rÌ   r   r   r   Útest_many_threads_nonblock2  ó   
ÿz.BaseSimpleQueueTest.test_many_threads_nonblockc                 C   rÇ   )NrÉ   iè  )r   rÅ   rS   rÄ   rª   r°   rQ   rË   rÌ   r   r   r   Útest_many_threads_timeout<  rÐ   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                   @   r   )z.BaseSimpleQueueTest.test_references.<locals>.CNr’   r   r   r   r   ÚCI  s    rÒ   é   )r   rS   rN   ÚweakrefÚrefrP   r   ZassertIsNone)r   rÒ   rÍ   r   rW   Úwrr   r   r   Útest_referencesF  s   ýz#BaseSimpleQueueTest.test_referencesN)r    r!   r"   r4   rª   r­   r¯   r°   rÄ   rm   rp   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                    rz   r   )r   Ú_PySimpleQueuerg   r{   r4   r   r|   r   r   r4   Y  r}   zPySimpleQueueTest.setUp)r    r!   r"   r„   r   r4   r   r   r   r|   r   rØ   V  s    rØ   c                       s0   e Zd ZeZ‡ fdd„Zdd„ Zdd„ Z‡  ZS )ÚCSimpleQueueTestc                    rz   r   )r   ÚSimpleQueuerg   r{   r4   r   r|   r   r   r4   c  r}   zCSimpleQueueTest.setUpc                 C   s(   |   | j| jj¡ |   | j| jj¡ d S r   )ZassertIsrg   r   rÛ   r   r   r   r   Útest_is_defaultg  s   z CSimpleQueueTest.test_is_defaultc                    s~   | j ‰t ¡ ‰ d}g }G ‡ ‡fdd„dtƒ}	 |ƒ }ˆ tˆ ƒ¡ ~| ˆ ¡ ¡ |d |kr0n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   w  s   
z;CSimpleQueueTest.test_reentrancy.<locals>.Circular.__init__c                    s   ˆ  tˆ ƒ¡ d S r   )rN   Únextr   ©Úgenr   r   r   Ú__del__z  s   z:CSimpleQueueTest.test_reentrancy.<locals>.Circular.__del__N)r    r!   r"   r   rà   r   rÞ   r   r   ÚCircularv  s    rá   Tr`   r<   )r   Ú	itertoolsÚcountÚobjectrN   rÝ   ra   rP   rQ   rÅ   rS   )r   rÍ   r¬   rá   Úor   rÞ   r   Útest_reentrancyk  s   úz CSimpleQueueTest.test_reentrancy)	r    r!   r"   rˆ   r   r4   rÜ   ræ   r   r   r   r|   r   rÚ   ^  s
    rÚ   Ú__main__))râ   r¥   r   r   ZunittestrÔ   Ztest.supportr   r   r   Zimport_fresh_moduler„   rˆ   Z
skipUnlessZneed_c_queuerT   r   r   r   r#   r0   ry   ZTestCaser‚   r†   rŠ   r‹   rŒ   r   rŽ   r   Ú	Exceptionr‘   r“   rŸ   r    r¡   rØ   rÚ   r    Úmainr   r   r   r   Ú<module>   sV    " u 5
)ÿ