a
    zey                     @   s   d dl Z d dlZd dlmZ d dlmZ d dlZd dlZd dlZd dl	Z	d dl
Z
G dd deZdd ZG dd	 d	ZG d
d dejeZG dd dejeZdd Zedkre  dS )    N)DocTestSuite)supportc                   @   s   e Zd ZdS )WeakN__name__
__module____qualname__ r	   r	   //usr/lib/python3.9/test/test_threading_local.pyr      s   r   c                 C   s    t  }|| _|t| d S N)r   weakappendweakrefref)localweaklistr   r	   r	   r
   target   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 )BaseLocalTestc                 C   s"   |  d |  d |  d d S )N   2   d   )_local_refsselfr	   r	   r
   test_local_refs   s    

zBaseLocalTest.test_local_refsc                 C   s   |   }g }t|D ]&}tjt||fd}|  |  q~t  | 	t
|| dd |D }| t
||d |f d |_t  dd |D }| t
||d |f|t
|f d S )Nr   argsc                 S   s   g | ]}| d u r|qS r   r	   .0r   r	   r	   r
   
<listcomp>+       z-BaseLocalTest._local_refs.<locals>.<listcomp>   c                 S   s   g | ]}| d u r|qS r   r	   r   r	   r	   r
   r   1   r    )_localrange	threadingThreadr   startjoinr   
gc_collectassertEquallenZassertInZsomeothervar)r   nr   r   itZdeadlistr	   r	   r
   r      s    
zBaseLocalTest._local_refsc                    sr   dd l G fdddj}| fdd t fddtdD  W d    n1 sd0    Y  d S )	Nr   c                       s   e Zd Z fddZdS )z)BaseLocalTest.test_derived.<locals>.Localc                    s     d d S )Ng{Gz?)sleepr   timer	   r
   __init__;   s    z2BaseLocalTest.test_derived.<locals>.Local.__init__Nr   r   r   r1   r	   r/   r	   r
   Local:   s   r3   c                    s   |  _  j |  d S r   )xr)   )r,   )r   r   r	   r
   f?   s    z%BaseLocalTest.test_derived.<locals>.fc                 3   s   | ]}t j |fd V  qdS )r   N)r$   r%   r   r,   )r5   r	   r
   	<genexpr>D   s   z-BaseLocalTest.test_derived.<locals>.<genexpr>
   )r0   r"   r   Zstart_threadsr#   )r   r3   r	   )r5   r   r   r0   r
   test_derived4   s    
zBaseLocalTest.test_derivedc                    s   G dd d| j  d dt t  fdd}tj|d}|     fddtd	D   |  | 	 d S )
Nc                   @   s   e Zd ZdS )z7BaseLocalTest.test_derived_cycle_dealloc.<locals>.LocalNr   r	   r	   r	   r
   r3   J   s   r3   Fc                     sL     g} |  |  d| d _~ t      tdd D d S )Nbarr   c                 s   s   | ]}t |d  V  qdS )fooN)hasattr)r   r   r	   r	   r
   r7   `   r    zFBaseLocalTest.test_derived_cycle_dealloc.<locals>.f.<locals>.<genexpr>)r   r;   r   r(   setwaitall)cycler3   e1e2localsZpassedr	   r
   r5   Q   s    

z3BaseLocalTest.test_derived_cycle_dealloc.<locals>.fr   c                    s   g | ]
}  qS r	   r	   r6   )r3   r	   r
   r   i   r    z<BaseLocalTest.test_derived_cycle_dealloc.<locals>.<listcomp>r8   )
r"   r$   Eventr%   r&   r>   r#   r=   r'   Z
assertTrue)r   r5   r-   r	   rA   r
   test_derived_cycle_deallocH   s    z(BaseLocalTest.test_derived_cycle_deallocc                 C   sJ   G dd d| j }|dd |d | jt| j dd | t| j d d S )Nc                   @   s   e Zd Zdd ZdS )z-BaseLocalTest.test_arguments.<locals>.MyLocalc                 _   s   d S r   r	   )r   r   kwargsr	   r	   r
   r1   r   s    z6BaseLocalTest.test_arguments.<locals>.MyLocal.__init__Nr2   r	   r	   r	   r
   MyLocalq   s   rI   r!   )a)r"   assertRaises	TypeError)r   rI   r	   r	   r
   test_argumentso   s
    
zBaseLocalTest.test_argumentsc                    s   d_   t t fdd} fdd}tj|d}|    tj|d}|  |    |  j j  d S )Nz No error message set or cleared.c                      s$   d_ d_`     d S )Nr;   r:   )r4   yr=   r>   r	   )rB   rC   objr	   r
   f1   s
    z)BaseLocalTest._test_one_class.<locals>.f1c                     sD   z
j } W n ty"   d_Y n0 d|  f _tjj d S )N z'Incorrectly got value %r from class %r
)r4   AttributeError_failedsysstderrwrite)r;   )crO   r   r	   r
   f2   s    
z)BaseLocalTest._test_one_class.<locals>.f2rE   )	rS   r$   rF   r%   r&   r>   r'   r=   ZassertFalse)r   rW   rP   rX   t1t2r	   )rW   rB   rC   rO   r   r
   _test_one_classz   s    zBaseLocalTest._test_one_classc                 C   s   |  | j d S r   )r[   r"   r   r	   r	   r
   test_threading_local   s    z"BaseLocalTest.test_threading_localc                 C   s    G dd d| j }| | d S )Nc                   @   s   e Zd ZdZdS )zBBaseLocalTest.test_threading_local_subclass.<locals>.LocalSubclass(To test that subclasses behave properly.Nr   r   r   __doc__r	   r	   r	   r
   LocalSubclass   s   r`   )r"   r[   r   r`   r	   r	   r
   test_threading_local_subclass   s    z+BaseLocalTest.test_threading_local_subclassc                 C   s   | }d|_ | |jddi | t i |_W d    n1 sD0    Y  | t |`W d    n1 sr0    Y  d S )N   r4   )r4   r)   __dict__rK   rR   )r   clsrO   r	   r	   r
   _test_dict_attribute   s    $z"BaseLocalTest._test_dict_attributec                 C   s   |  | j d S r   )rf   r"   r   r	   r	   r
   test_dict_attribute   s    z!BaseLocalTest.test_dict_attributec                 C   s    G dd d| j }| | d S )Nc                   @   s   e Zd ZdZdS )zABaseLocalTest.test_dict_attribute_subclass.<locals>.LocalSubclassr]   Nr^   r	   r	   r	   r
   r`      s   r`   )r"   rf   ra   r	   r	   r
   test_dict_attribute_subclass   s    z*BaseLocalTest.test_dict_attribute_subclassc                 C   sJ   G dd d}| }|   |_||j_t|}~t  | |  d S )Nc                   @   s   e Zd ZdS )z.BaseLocalTest.test_cycle_collection.<locals>.XNr   r	   r	   r	   r
   X   s   ri   )r"   r   r4   r   r   r   r(   ZassertIsNone)r   ri   r4   wrr	   r	   r
   test_cycle_collection   s    

z#BaseLocalTest.test_cycle_collectionc                 C   s\   zdd l }W n ty(   td Y n0 |dd d tdD ]}t }qB|  d S )Nr   zrequires _testcapic                   S   s   d S r   r	   r	   r	   r	   r
   <lambda>   r    z?BaseLocalTest.test_threading_local_clear_race.<locals>.<lambda>Fi  )		_testcapiImportErrorunittestskipZcall_in_temporary_c_threadr#   r$   r   Zjoin_temporary_c_thread)r   rm   _r	   r	   r
   test_threading_local_clear_race   s    
z-BaseLocalTest.test_threading_local_clear_raceN)r   r   r   r   r   r9   rG   rM   r[   r\   rb   rf   rg   rh   rk   rr   r	   r	   r	   r
   r      s   '$	r   c                   @   s   e Zd ZejZdS )ThreadLocalTestN)r   r   r   _threadr"   r	   r	   r	   r
   rs      s   rs   c                   @   s   e Zd ZejZdS )PyThreadingLocalTestN)r   r   r   _threading_localr   r"   r	   r	   r	   r
   ru      s   ru   c                     sr   t  } | td | t t | t t tj dd } fdd}| td||d t	
|  d S )Nrv   c                 S   s   t jt_d S r   )rt   r"   rv   r   testr	   r	   r
   setUp   s    ztest_main.<locals>.setUpc                    s
    t _d S r   )rv   r   rw   Z
local_origr	   r
   tearDown   s    ztest_main.<locals>.tearDown)ry   r{   )ro   Z	TestSuiteZaddTestr   Z	makeSuiters   ru   rv   r   r   Zrun_unittest)Zsuitery   r{   r	   rz   r
   	test_main   s    r|   __main__)rT   ro   doctestr   rx   r   r   gcrt   r$   rv   objectr   r   r   ZTestCasers   ru   r|   r   r	   r	   r	   r
   <module>   s"    >