a
    RîhW·  ã                   @   s¦  d dl Z d dlZ d dlmZmZmZmZmZmZm	Z	m
Z
 d dlmZm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zd dlmZ W n eyª   dd„ ZY n0 zd dlmZ W n eyÒ   dZY n0 G dd	„ d	eƒZG d
d„ deƒZeG dd„ deƒƒZe ¡  dd¡r,de ¡ d v Zne edƒ ZG dd„ de j!ƒZ"G dd„ de j!ƒZ#G dd„ de j!ƒZ$G dd„ de j!ƒZ%dd„ Z&dd„ Z'e(dkr¢e  )¡  dS )é    N)ÚverboseÚrefcount_testÚcpython_onlyÚstart_threadsÚtemp_dirÚTESTFNÚunlinkÚimport_module)Úassert_python_okÚmake_script)Úwith_tp_delc                 C   s   G dd„ dt ƒ}|S )Nc                   @   s   e Zd Zdd„ ZdS )zwith_tp_del.<locals>.Cc                 _   s   t dƒ‚d S )Nzrequires _testcapi.with_tp_del)Ú	TypeError)ÚclsÚargsÚkwargs© r   ú4/opt/python-3.9.24/usr/lib/python3.9/test/test_gc.pyÚ__new__   s    zwith_tp_del.<locals>.C.__new__N)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   ÚC   s   r   )Úobject)r   r   r   r   r   r      s    r   )ÚContainerNoGCc                   @   s   e Zd Zdd„ ZdS )ÚC1055820c                 C   s   || _ | | _d S ©N)ÚiÚloop)Úselfr   r   r   r   Ú__init__(   s    zC1055820.__init__N©r   r   r   r   r   r   r   r   r   '   s   r   c                   @   s   e Zd Zdd„ ZdS )ÚGC_Detectorc                    s(   dˆ _ ‡ fdd„}t tdƒ|¡ˆ _d S )NFc                    s
   dˆ _ d S )NT)Úgc_happened©Zignored©r   r   r   Úit_happened3   s    z)GC_Detector.__init__.<locals>.it_happenedéš  )r"   ÚweakrefÚrefr   Úwr)r   r%   r   r$   r   r   0   s    zGC_Detector.__init__Nr    r   r   r   r   r!   ,   s   r!   c                   @   s"   e Zd ZdZddd„Zdd„ ZdS )ÚUncollectablea)  Create a reference cycle with multiple __del__ methods.

    An object in a reference cycle will never have zero references,
    and so must be garbage collected.  If one or more objects in the
    cycle have __del__ methods, the gc refuses to guess an order,
    and leaves the cycle uncollected.Nc                 C   s    |d u rt | d| _n|| _d S )N)Úpartner)r*   r+   )r   r+   r   r   r   r   B   s    zUncollectable.__init__c                 C   s   d S r   r   r$   r   r   r   Ú
__tp_del__G   s    zUncollectable.__tp_del__)N)r   r   r   Ú__doc__r   r,   r   r   r   r   r*   :   s   
r*   Z	PY_CFLAGSÚ z-DNDEBUGZgettotalrefcountc                   @   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
edd„ ƒZedd„ ƒZdd„ Zedd„ ƒZdd„ Zdd„ Zdd„ Zedd „ ƒZed!d"„ ƒZd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Z ed9d:„ ƒZ!d;d<„ Z"d=d>„ Z#d?d@„ Z$dAdB„ Z%dCdD„ Z&dEdF„ Z'dGdH„ Z(dIdJ„ Z)dKdL„ Z*dMdN„ Z+e, -e.dOu dP¡dQdR„ ƒZ/dOS )SÚGCTestsc                 C   s,   g }|  |¡ t ¡  ~|  t ¡ d¡ d S ©Né   ©ÚappendÚgcÚcollectÚassertEqual)r   Úlr   r   r   Ú	test_listV   s
    
zGCTests.test_listc                 C   s*   i }||d< t  ¡  ~|  t  ¡ d¡ d S r0   ©r4   r5   r6   ©r   Údr   r   r   Ú	test_dict]   s
    zGCTests.test_dictc                 C   s4   g }|f}|  |¡ t ¡  ~~|  t ¡ d¡ d S )Né   r2   )r   r7   Útr   r   r   Ú
test_tupled   s    
zGCTests.test_tuplec                 C   s2   G dd„ dƒ}||_ t ¡  ~|  t ¡ d¡ d S )Nc                   @   s   e Zd ZdS )zGCTests.test_class.<locals>.AN©r   r   r   r   r   r   r   ÚAo   s   rA   r   ©Úar4   r5   ÚassertNotEqual©r   rA   r   r   r   Ú
test_classn   s
    zGCTests.test_classc                 C   s.   G dd„ dt ƒ}t ¡  ~|  t ¡ d¡ d S )Nc                   @   s   e Zd ZdS )z%GCTests.test_newstyleclass.<locals>.ANr@   r   r   r   r   rA   w   s   rA   r   )r   r4   r5   rD   rE   r   r   r   Útest_newstyleclassv   s    zGCTests.test_newstyleclassc                 C   s8   G dd„ dƒ}|ƒ }||_ t ¡  ~|  t ¡ d¡ d S )Nc                   @   s   e Zd ZdS )z GCTests.test_instance.<locals>.ANr@   r   r   r   r   rA   ~   s   rA   r   rB   ©r   rA   rC   r   r   r   Útest_instance}   s    zGCTests.test_instancec                 C   sÀ   G dd„ dt ƒ}|ƒ }||_t ¡  ~|  t ¡ d¡ G dd„ dtƒ}G dd„ d||ƒ}|ƒ }||_t ¡  ~|  t ¡ d¡ ~~|  t ¡ d¡ |ƒ |_~|  t ¡ d¡ |  t ¡ d¡ d S )Nc                   @   s   e Zd ZdS )z#GCTests.test_newinstance.<locals>.ANr@   r   r   r   r   rA   ‡   s   rA   r   c                   @   s   e Zd ZdS )z#GCTests.test_newinstance.<locals>.BNr@   r   r   r   r   ÚBŽ   s   rJ   c                   @   s   e Zd ZdS )z#GCTests.test_newinstance.<locals>.CNr@   r   r   r   r   r      s   r   )r   rC   r4   r5   rD   Úlistr6   )r   rA   rC   rJ   r   r   r   r   Útest_newinstance†   s&    zGCTests.test_newinstancec                 C   s2   G dd„ dƒ}|ƒ }t  ¡  ~|  t  ¡ d¡ d S )Nc                   @   s   e Zd Zdd„ ZdS )zGCTests.test_method.<locals>.Ac                 S   s   | j | _d S r   )r   Úinitr$   r   r   r   r   ¡   s    z'GCTests.test_method.<locals>.A.__init__Nr    r   r   r   r   rA       s   rA   r   )r4   r5   rD   rH   r   r   r   Útest_methodž   s
    zGCTests.test_methodc                 C   s–   t G dd„ dƒƒ}G dd„ dƒ}|ƒ }||_t|ƒ}|ƒ }||_t ¡  ~~|  t ¡ d¡ tjD ]}t|ƒ|krb|` q†qb|  d¡ tj 	|¡ d S )Nc                   @   s   e Zd Zdd„ ZdS )z(GCTests.test_legacy_finalizer.<locals>.Ac                 S   s   d S r   r   r$   r   r   r   r,   ®   ó    z3GCTests.test_legacy_finalizer.<locals>.A.__tp_del__N©r   r   r   r,   r   r   r   r   rA   ¬   s   rA   c                   @   s   e Zd ZdS )z(GCTests.test_legacy_finalizer.<locals>.BNr@   r   r   r   r   rJ   ¯   s   rJ   r   ú&didn't find obj in garbage (finalizer))
r   rC   ÚidÚbr4   r5   rD   ÚgarbageÚfailÚremove©r   rA   rJ   rC   Zid_arS   Úobjr   r   r   Útest_legacy_finalizer¨   s$    

zGCTests.test_legacy_finalizerc                 C   sš   t G dd„ dtƒƒ}G dd„ dtƒ}|ƒ }||_t|ƒ}|ƒ }||_t ¡  ~~|  t ¡ d¡ tjD ]}t|ƒ|krf|` qŠqf|  	d¡ tj 
|¡ d S )Nc                   @   s   e Zd Zdd„ ZdS )z1GCTests.test_legacy_finalizer_newclass.<locals>.Ac                 S   s   d S r   r   r$   r   r   r   r,   È   rO   z<GCTests.test_legacy_finalizer_newclass.<locals>.A.__tp_del__NrP   r   r   r   r   rA   Æ   s   rA   c                   @   s   e Zd ZdS )z1GCTests.test_legacy_finalizer_newclass.<locals>.BNr@   r   r   r   r   rJ   É   s   rJ   r   rQ   )r   r   rC   rR   rS   r4   r5   rD   rT   rU   rV   rW   r   r   r   Útest_legacy_finalizer_newclassÂ   s$    

z&GCTests.test_legacy_finalizer_newclassc                 C   s,   i }t d|ƒ t ¡  ~|  t ¡ d¡ d S )Nzdef f(): pass
r=   )Úexecr4   r5   r6   r:   r   r   r   Útest_functionÜ   s
    
zGCTests.test_functionc                 C   s*   dd„ }t  ¡  |ƒ  |  t  ¡ d¡ d S )Nc                  S   s   t  ¡ } d S r   )ÚsysÚ	_getframe)Úframer   r   r   Úfç   s    zGCTests.test_frame.<locals>.fr1   r9   )r   r`   r   r   r   Ú
test_frameå   s    zGCTests.test_framec                 C   sˆ   t  ¡  |  t jg ¡ g }| |¡ t|ƒ}t  ¡ }t  |t jB ¡ ~t  ¡  t  |¡ |  t	t jƒd¡ t j 
¡ }|  t|ƒ|¡ d S r0   )r4   r5   r6   rT   r3   rR   Ú	get_debugÚ	set_debugZDEBUG_SAVEALLÚlenÚpop)r   ÚLZid_LÚdebugrX   r   r   r   Útest_saveallí   s    


zGCTests.test_saveallc                 C   sF   t  ¡ }t  ¡  t  d¡ G dd„ dƒ}|ƒ }~t  ¡  t j|Ž  d S )Nr1   c                   @   s   e Zd Zdd„ ZdS )zGCTests.test_del.<locals>.Ac                 S   s   t | ƒ d S r   ©Údirr$   r   r   r   Ú__del__  s    z#GCTests.test_del.<locals>.A.__del__N©r   r   r   rk   r   r   r   r   rA     s   rA   )r4   Úget_thresholdÚenableÚset_thresholdÚdisable©r   Z
thresholdsrA   rC   r   r   r   Útest_del  s    
zGCTests.test_delc                 C   sH   t  ¡ }t  ¡  t  d¡ G dd„ dtƒ}|ƒ }~t  ¡  t j|Ž  d S )Nr1   c                   @   s   e Zd Zdd„ ZdS )z$GCTests.test_del_newclass.<locals>.Ac                 S   s   t | ƒ d S r   ri   r$   r   r   r   rk     s    z,GCTests.test_del_newclass.<locals>.A.__del__Nrl   r   r   r   r   rA     s   rA   )r4   rm   rn   ro   r   rp   rq   r   r   r   Útest_del_newclass  s    
zGCTests.test_del_newclassc                 C   sd   t  ¡  t  ¡ \}}}g }t  ¡ \}}}|  ||fd¡ |  ||fd¡ |  |d¡ |  ||¡ d S )N©r   r   é   )r4   r5   Ú	get_countr6   Z
assertLessÚassertGreater)r   rC   rS   ÚcÚxr;   Úer`   r   r   r   Útest_get_count)  s    zGCTests.test_get_countc                 C   sˆ   t  ¡  g }t  d¡ t  ¡ \}}}t  d¡ t  ¡ \}}}t  d¡ t  ¡ \}}	}
|  ||fd¡ |  ||fd¡ |  |	|
fd¡ d S )Nr   r1   r=   )r1   r   )r   r1   rt   )r4   r5   rv   r6   )r   ry   rC   rS   rx   r;   rz   r`   ÚgÚhr   r   r   r   Útest_collect_generations7  s    


z GCTests.test_collect_generationsc                    sŽ   G ‡ fdd„dƒ‰ t  ¡  d}tdƒD ]Z}g }t|ƒD ]}|ˆ ƒ g}q6g }t|ƒD ]}|ˆ ƒ g}qRi }t|ƒD ]}|ˆ ƒ dœ}qnq&t  ¡  d S )Nc                       s   e Zd ZdZ‡ fdd„ZdS )z#GCTests.test_trashcan.<locals>.Ouchr   c                    s&   ˆ j d ˆ _ ˆ j d dkr"t ¡  d S )Nr1   é   r   )Únr4   r5   r$   ©ÚOuchr   r   rk   O  s    z+GCTests.test_trashcan.<locals>.Ouch.__del__N)r   r   r   r€   rk   r   r   r   r   r‚   M  s   r‚   é–   r=   )r1   r=   )r4   rn   Úrangerp   )r   ÚNÚcountr>   r   ÚuÚvr   r   r   Útest_trashcanL  s    zGCTests.test_trashcanc              	      sü   d‰d}dd„ ‰G ‡ ‡fdd„dt ƒ‰ ‡ ‡fdd„‰‡‡fd	d
„}t ¡ }t d¡ zvg ‰g }t|ƒD ]}tj|d}| |¡ qft|‡fdd„ƒ t	 
d¡ W d   ƒ n1 s´0    Y  W t |¡ nt |¡ 0 t ¡  |  tˆ jƒtˆ jƒ¡ d S )Né<   r=   c                	   s   s&   zdV  W t  d¡ nt  d¡ 0 dS )z<A generator that releases the GIL when closed or dealloc'ed.Ngíµ ÷Æ°>)ÚtimeÚsleepr   r   r   r   Úsleeper_gent  s    z2GCTests.test_trashcan_threads.<locals>.sleeper_genc                       s.   e Zd Zg Zg Z‡ fdd„Z‡ ‡fdd„ZdS )z(GCTests.test_trashcan_threads.<locals>.Cc                    s   || d d …< ˆ j  d ¡ d S r   )Úinitsr3   )r   Úalist)r   r   r   r     s    z1GCTests.test_trashcan_threads.<locals>.C.__init__c                    s   ˆ j  d ¡ ˆƒ }t|ƒ d S r   )Údelsr3   Únext)r   r|   ©r   r   r   r   rk   ‚  s    z0GCTests.test_trashcan_threads.<locals>.C.__del__N)r   r   r   rŽ   r   r   rk   r   r’   r   r   r   {  s   r   c                     s(   ˆ g ƒ} t ˆƒD ]}ˆ | gƒg} q~ dS )zyCreate a sufficiently nested container object so that the
            trashcan mechanism is invoked when deallocating it.N)r„   )ry   r   )r   ÚNESTINGr   r   Úmake_nested  s    z2GCTests.test_trashcan_threads.<locals>.make_nestedc                      s   ˆ sˆƒ  q dS )z!Exercise make_nested() in a loop.Nr   r   )Úexitr”   r   r   Ú
run_thread•  s    z1GCTests.test_trashcan_threads.<locals>.run_threadgñhãˆµøä>)Útargetc                      s
   ˆ   d¡S r0   ©r3   r   )r•   r   r   Ú<lambda>¢  rO   z/GCTests.test_trashcan_threads.<locals>.<lambda>ç      ð?)rK   r]   ÚgetswitchintervalÚsetswitchintervalr„   Ú	threadingÚThreadr3   r   r‹   rŒ   r4   r5   r6   rd   rŽ   r   )r   Z	N_THREADSr–   Zold_switchintervalÚthreadsr   r>   r   )r   r“   r•   r”   r   r   Útest_trashcan_threadso  s&    
*zGCTests.test_trashcan_threadsc                 C   sb   G dd„ dƒ}|ƒ }|ƒ }||_ ||_ t ¡  ttjƒ}~~|  t ¡ d¡ |  ttjƒ|¡ d S )Nc                   @   s   e Zd Zdd„ ZdS )zGCTests.test_boom.<locals>.Boomc                 S   s   | ` t‚d S r   ©ÚattrÚAttributeError©r   Zsomeattributer   r   r   Ú__getattr__«  s    z+GCTests.test_boom.<locals>.Boom.__getattr__N©r   r   r   r¥   r   r   r   r   ÚBoomª  s   r§   é   ©r¢   r4   r5   rd   rT   r6   )r   r§   rC   rS   Ú
garbagelenr   r   r   Ú	test_boom©  s    
zGCTests.test_boomc                 C   sb   G dd„ dƒ}|ƒ }|ƒ }||_ ||_ t ¡  ttjƒ}~~|  t ¡ d¡ |  ttjƒ|¡ d S )Nc                   @   s   e Zd Zdd„ Zdd„ ZdS )z!GCTests.test_boom2.<locals>.Boom2c                 S   s
   d| _ d S ©Nr   ©ry   r$   r   r   r   r   Ã  s    z*GCTests.test_boom2.<locals>.Boom2.__init__c                 S   s$   |  j d7  _ | j dkr| `t‚d S r0   ©ry   r¢   r£   r¤   r   r   r   r¥   Æ  s    
z-GCTests.test_boom2.<locals>.Boom2.__getattr__N©r   r   r   r   r¥   r   r   r   r   ÚBoom2Â  s   r°   r¨   r©   )r   r°   rC   rS   rª   r   r   r   Ú
test_boom2Á  s    

zGCTests.test_boom2c                 C   sd   G dd„ dt ƒ}|ƒ }|ƒ }||_||_t ¡  ttjƒ}~~|  t ¡ d¡ |  ttjƒ|¡ d S )Nc                   @   s   e Zd Zdd„ ZdS )z'GCTests.test_boom_new.<locals>.Boom_Newc                 S   s   | ` t‚d S r   r¡   r¤   r   r   r   r¥   á  s    z3GCTests.test_boom_new.<locals>.Boom_New.__getattr__Nr¦   r   r   r   r   ÚBoom_Newà  s   r²   r¨   ©r   r¢   r4   r5   rd   rT   r6   )r   r²   rC   rS   rª   r   r   r   Útest_boom_newÜ  s    
zGCTests.test_boom_newc                 C   sd   G dd„ dt ƒ}|ƒ }|ƒ }||_||_t ¡  ttjƒ}~~|  t ¡ d¡ |  ttjƒ|¡ d S )Nc                   @   s   e Zd Zdd„ Zdd„ ZdS )z)GCTests.test_boom2_new.<locals>.Boom2_Newc                 S   s
   d| _ d S r¬   r­   r$   r   r   r   r   ò  s    z2GCTests.test_boom2_new.<locals>.Boom2_New.__init__c                 S   s$   |  j d7  _ | j dkr| `t‚d S r0   r®   r¤   r   r   r   r¥   õ  s    
z5GCTests.test_boom2_new.<locals>.Boom2_New.__getattr__Nr¯   r   r   r   r   Ú	Boom2_Newñ  s   rµ   r¨   r³   )r   rµ   rC   rS   rª   r   r   r   Útest_boom2_newð  s    

zGCTests.test_boom2_newc                 C   sÐ   g d¢}t  |¡}| ¡  |  ||¡ t|ƒ}t  |¡}| ¡  |  ||¡ dddœ}g d¢}t  |¡}| ¡  |  ||¡ t  ddgddid	¡}| ¡  |  |d
d
gttdƒƒ ¡ |  t  ddd¡g ¡ d S )N)r1   é   ru   r·   é   )r1   ru   )r1   r·   ru   r¸   r1   r=   r¨   )r   r   r   r   ru   rC   y              @)r4   Zget_referentsÚsortr6   ÚtuplerK   r„   )r   r   ZgotZatupleZadictZexpectedr   r   r   Útest_get_referents  s"    



zGCTests.test_get_referentsc                 C   sÂ  |   t d ¡¡ |   t d¡¡ |   t d¡¡ |   t d¡¡ |   t d¡¡ |   t d¡¡ |   t d¡¡ |   t d¡¡ |   t tdƒ¡¡ |   t t¡¡ |   t t¡¡ |   t t¡¡ |   t tƒ ¡¡ G dd	„ d	ƒ}G d
d„ dtƒ}G dd„ dƒ}G dd„ dtƒ}G dd„ dtƒ}|  t t¡¡ |  t |¡¡ |  t |ƒ ¡¡ |  t |ƒ ¡¡ |  t g ¡¡ |  t t	ƒ ¡¡ |  t |ƒ ¡¡ |  t |ƒ ¡¡ |  t |ƒ ¡¡ d S )Nr1   rš   y      ð?      @TFó   arC   c                   @   s   e Zd ZdS )z*GCTests.test_is_tracked.<locals>.UserClassNr@   r   r   r   r   Ú	UserClass0  s   r½   c                   @   s   e Zd ZdS )z(GCTests.test_is_tracked.<locals>.UserIntNr@   r   r   r   r   ÚUserInt3  s   r¾   c                   @   s   e Zd ZdZdS )z/GCTests.test_is_tracked.<locals>.UserClassSlotsr   N©r   r   r   Ú	__slots__r   r   r   r   ÚUserClassSlots7  s   rÁ   c                   @   s   e Zd ZdZdS )z/GCTests.test_is_tracked.<locals>.UserFloatSlotsr   Nr¿   r   r   r   r   ÚUserFloatSlots;  s   rÂ   c                   @   s   e Zd ZdZdS )z-GCTests.test_is_tracked.<locals>.UserIntSlotsr   Nr¿   r   r   r   r   ÚUserIntSlots?  s   rÃ   )
ÚassertFalser4   Z
is_trackedÚ	bytearrayÚtypeÚintr   ÚfloatÚ
assertTrueÚset)r   r½   r¾   rÁ   rÂ   rÃ   r   r   r   Útest_is_tracked  s6    zGCTests.test_is_trackedc                    sb   |   t d¡¡ g ‰ G ‡ fdd„dƒ}|ƒ }|   t |¡¡ ~t ¡  ˆ  ¡ }|  t |¡¡ d S )Nr·   c                       s   e Zd Z‡ fdd„ZdS )z*GCTests.test_is_finalized.<locals>.Lazarusc                    s   ˆ   | ¡ d S r   r˜   r$   ©Zstorager   r   rk   R  s    z2GCTests.test_is_finalized.<locals>.Lazarus.__del__Nrl   r   rÌ   r   r   ÚLazarusQ  s   rÍ   )rÄ   r4   Zis_finalizedr5   re   rÉ   )r   rÍ   Zlazarusr   rÌ   r   Útest_is_finalizedL  s    zGCTests.test_is_finalizedc                    sˆ   g ‰‡ ‡fdd„‰dd„ t dƒD ƒ}‡fdd„|D ƒ‰ d }t ¡  |  tˆƒd¡ d }t ¡  |  tˆƒd¡ ˆD ]}|  |d ¡ qrd S )Nc                    s   dd„ ˆ D ƒˆd d …< d S )Nc                 S   s   g | ]
}|ƒ ‘qS r   r   )Ú.0r)   r   r   r   Ú
<listcomp>c  rO   z>GCTests.test_bug1055820b.<locals>.callback.<locals>.<listcomp>r   r#   )ÚWRsÚouchr   r   Úcallbackb  s    z*GCTests.test_bug1055820b.<locals>.callbackc                 S   s   g | ]}t |ƒ‘qS r   )r   ©rÏ   r   r   r   r   rÐ   e  rO   z,GCTests.test_bug1055820b.<locals>.<listcomp>r=   c                    s   g | ]}t  |ˆ ¡‘qS r   )r'   r(   )rÏ   rx   )rÓ   r   r   rÐ   f  rO   r   )r„   r4   r5   r6   rd   )r   ZCsrx   ry   r   )rÑ   rÓ   rÒ   r   Útest_bug1055820b^  s    zGCTests.test_bug1055820bc                    sD   t  ¡  G dd„ dƒ‰ G dd„ dƒ‰‡ ‡fdd„}|ƒ  t  ¡  d S )Nc                   @   s   e Zd ZdS )z GCTests.test_bug21435.<locals>.ANr@   r   r   r   r   rA   ‚  s   rA   c                   @   s   e Zd Zdd„ Zdd„ ZdS )z GCTests.test_bug21435.<locals>.Bc                 S   s
   || _ d S r   r­   )r   ry   r   r   r   r   †  s    z)GCTests.test_bug21435.<locals>.B.__init__c                 S   s
   d | _ d S r   ©r¢   r$   r   r   r   rk   ‰  s    z(GCTests.test_bug21435.<locals>.B.__del__N)r   r   r   r   rk   r   r   r   r   rJ   …  s   rJ   c                     s    ˆ ƒ } ˆˆ ƒ ƒ}|| _ | |_ d S r   rÖ   )rC   rS   ©rA   rJ   r   r   Údo_workŒ  s    
z&GCTests.test_bug21435.<locals>.do_work)r4   r5   )r   rØ   r   r×   r   Útest_bug21435v  s    
zGCTests.test_bug21435c                    sŠ   dd l ‰d}‡ ‡fdd„}||d ƒ}ˆ  d|¡ ˆ  d|¡ ||d ƒ}ˆ  d	|¡ ˆ  d
|v phd|v |¡ ||d ƒ}ˆ  d|¡ d S )Nr   aÚ  if 1:
            import gc
            import _testcapi
            @_testcapi.with_tp_del
            class X:
                def __init__(self, name):
                    self.name = name
                def __repr__(self):
                    return "<X %%r>" %% self.name
                def __tp_del__(self):
                    pass

            x = X('first')
            x.x = x
            x.y = X('second')
            del x
            gc.set_debug(%s)
        c                    s\   ˆj tjdd| gˆjˆjd}| ¡ \}}|j ¡  |j ¡  ˆ  |j	d¡ ˆ  |d¡ |S )Nz-Wdú-c©ÚstdoutÚstderrr   rO   )
ÚPopenr]   Ú
executableÚPIPEÚcommunicaterÜ   ÚcloserÝ   r6   Ú
returncode)ÚcodeÚprÜ   rÝ   ©r   Ú
subprocessr   r   Úrun_command«  s    þ

z5GCTests.test_garbage_at_shutdown.<locals>.run_commandÚ0s=   ResourceWarning: gc: 2 uncollectable objects at shutdown; uses   <X 'first'>zgc.DEBUG_UNCOLLECTABLEs8   ResourceWarning: gc: 2 uncollectable objects at shutdowns   [<X 'first'>, <X 'second'>]s   [<X 'second'>, <X 'first'>]zgc.DEBUG_SAVEALLs!   uncollectable objects at shutdown)rç   ZassertInZassertNotInrÉ   )r   rä   rè   rÝ   r   ræ   r   Útest_garbage_at_shutdown–  s$    ÿÿþz GCTests.test_garbage_at_shutdownc                 C   s(   d}t d|ƒ\}}}|  | ¡ d¡ d S )Nz¤if 1:
            class C:
                def __del__(self):
                    print('__del__ called')
            l = [C()]
            l.append(l)
            rÚ   ó   __del__ called)r
   r6   Ústrip)r   rä   ÚrcÚoutÚerrr   r   r   Útest_gc_main_module_at_shutdownÇ  s    z'GCTests.test_gc_main_module_at_shutdownc                 C   sd   t ƒ J}d}d|f }t|d|ƒ td|ƒ\}}}|  | ¡ d¡ W d   ƒ n1 sV0    Y  d S )Nz¼if 1:
                class C:
                    def __del__(self):
                        print('__del__ called')
                l = [C()]
                l.append(l)
                zvif 1:
                import sys
                sys.path.insert(0, %r)
                import gctest
                ZgctestrÚ   rë   )r   r   r
   r6   rì   )r   Z
script_dirÚmodulerä   rí   rî   rï   r   r   r   Ú#test_gc_ordinary_module_at_shutdownÔ  s    üz+GCTests.test_gc_ordinary_module_at_shutdownc                 C   sf   d}|   tt¡ ttdƒ}| |¡ W d   ƒ n1 s:0    Y  ttƒ\}}}|  | ¡ d¡ d S )NzÊif 1:
            class ClassWithDel:
                def __del__(self):
                    print('__del__ called')
            a = ClassWithDel()
            a.link = a
            raise SystemExit(0)Úwrë   )Ú
addCleanupr   r   ÚopenÚwriter
   r6   rì   )r   rä   Zscriptrí   rî   rï   r   r   r   Útest_global_del_SystemExitç  s    (z"GCTests.test_global_del_SystemExitc                 C   sr  t  ¡ }|  t|ƒd¡ |D ]T}|  |t¡ |  t|ƒh d£¡ |  |d d¡ |  |d d¡ |  |d d¡ qt  ¡ rŽ|  	t j
¡ t  ¡  t  ¡ }t  d¡ t  ¡ }|  |d d |d d d ¡ |  |d d |d d ¡ |  |d d |d d ¡ t  d¡ t  ¡ }|  |d d |d d d ¡ |  |d d |d d ¡ |  |d d |d d d ¡ d S )	Nr·   >   Ú	collectedÚcollectionsÚuncollectablerø   r   rù   rú   r1   r=   )r4   Ú	get_statsr6   rd   ÚassertIsInstanceÚdictrÊ   ZassertGreaterEqualÚ	isenabledrô   rn   rp   r5   )r   ZstatsÚstÚoldÚnewr   r   r   Útest_get_statsõ  s0    
ÿ
 
 zGCTests.test_get_statsc                 C   s4   t  ¡  |  t  ¡ d¡ t  ¡  |  t  ¡ d¡ d S r¬   )r4   Zfreezerw   Zget_freeze_countZunfreezer6   r$   r   r   r   Útest_freeze  s    zGCTests.test_freezec                    sø  t  ¡  g ‰ ˆ  ˆ ¡ |  t‡ fdd„t jddD ƒƒ¡ |  t‡ fdd„t jddD ƒƒ¡ |  t‡ fdd„t jddD ƒƒ¡ t jdd |  t‡ fd	d„t jddD ƒƒ¡ |  t‡ fd
d„t jddD ƒƒ¡ |  t‡ fdd„t jddD ƒƒ¡ t jdd |  t‡ fdd„t jddD ƒƒ¡ |  t‡ fdd„t jddD ƒƒ¡ |  t‡ fdd„t jddD ƒƒ¡ t jdd |  t‡ fdd„t jddD ƒƒ¡ |  t‡ fdd„t jddD ƒƒ¡ |  t‡ fdd„t jddD ƒƒ¡ Š t  ¡  d S )Nc                 3   s   | ]}ˆ |u V  qd S r   r   ©rÏ   Úelement©r7   r   r   Ú	<genexpr>  rO   z+GCTests.test_get_objects.<locals>.<genexpr>r   ©Ú
generationc                 3   s   | ]}ˆ |u V  qd S r   r   r  r  r   r   r    rO   r1   c                 3   s   | ]}ˆ |u V  qd S r   r   r  r  r   r   r     rO   r=   c                 3   s   | ]}ˆ |u V  qd S r   r   r  r  r   r   r  $  rO   c                 3   s   | ]}ˆ |u V  qd S r   r   r  r  r   r   r  '  rO   c                 3   s   | ]}ˆ |u V  qd S r   r   r  r  r   r   r  *  rO   c                 3   s   | ]}ˆ |u V  qd S r   r   r  r  r   r   r  .  rO   c                 3   s   | ]}ˆ |u V  qd S r   r   r  r  r   r   r  1  rO   c                 3   s   | ]}ˆ |u V  qd S r   r   r  r  r   r   r  4  rO   c                 3   s   | ]}ˆ |u V  qd S r   r   r  r  r   r   r  8  rO   c                 3   s   | ]}ˆ |u V  qd S r   r   r  r  r   r   r  ;  rO   c                 3   s   | ]}ˆ |u V  qd S r   r   r  r  r   r   r  >  rO   )r4   r5   r3   rÉ   ÚanyÚget_objectsrÄ   r$   r   r  r   Útest_get_objects  sX    
ÿÿÿÿÿÿÿÿÿÿÿÿzGCTests.test_get_objectsc                 C   sl   t  ¡  |  tt  ¡ ƒtt jd dƒ¡ |  tt jd¡ |  tt jd¡ |  tt jd¡ |  tt jd¡ d S )Nr  iè  iüÿÿÚ1gX9´Èv¾ó?)r4   r5   r6   rd   r  ZassertRaisesÚ
ValueErrorr   r$   r   r   r   Útest_get_objects_argumentsC  s    ÿz"GCTests.test_get_objects_argumentsc                    sª   G dd„ dƒ}G ‡ fdd„d|ƒ‰ t  ¡  t  ¡  ˆ ƒ }|  ˆ jd¡ ~t  ¡  |  ˆ jd¡ |  tˆ jƒd¡ ˆ j ¡  |  ˆ jd¡ t  ¡  |  ˆ jd¡ t  ¡  d S )Nc                   @   s   e Zd Zdd„ ZdS )zAGCTests.test_resurrection_only_happens_once_per_object.<locals>.Ac                 S   s
   | | _ d S r   ©Úmer$   r   r   r   r   O  s    zJGCTests.test_resurrection_only_happens_once_per_object.<locals>.A.__init__Nr    r   r   r   r   rA   N  s   rA   c                       s    e Zd ZdZg Z‡ fdd„ZdS )zGGCTests.test_resurrection_only_happens_once_per_object.<locals>.Lazarusr   c                    s   ˆ  j d7  _ ˆ j | ¡ d S r0   )ÚresurrectedÚresurrected_instancesr3   r$   ©rÍ   r   r   rk   V  s    zOGCTests.test_resurrection_only_happens_once_per_object.<locals>.Lazarus.__del__N)r   r   r   r  r  rk   r   r  r   r   rÍ   R  s   rÍ   r   r1   )	r4   r5   rp   r6   r  rd   r  Úclearrn   )r   rA   Úlazr   r  r   Ú.test_resurrection_only_happens_once_per_objectM  s    
z6GCTests.test_resurrection_only_happens_once_per_objectc                    s®   G dd„ dƒ}G ‡ fdd„dƒ‰ t  ¡  t  ¡  ˆ ƒ }|ƒ }t|ƒ}||_||_~~t  ¡  |  tˆ jƒd¡ ˆ j 	¡ }|  
t|dƒ¡ |  t|jƒ|¡ t  ¡  t  ¡  d S )Nc                   @   s   e Zd Zdd„ ZdS )z6GCTests.test_resurrection_is_transitive.<locals>.Cargoc                 S   s
   | | _ d S r   r  r$   r   r   r   r   s  s    z?GCTests.test_resurrection_is_transitive.<locals>.Cargo.__init__Nr    r   r   r   r   ÚCargor  s   r  c                       s   e Zd Zg Z‡ fdd„ZdS )z8GCTests.test_resurrection_is_transitive.<locals>.Lazarusc                    s   ˆ j  | ¡ d S r   )r  r3   r$   r  r   r   rk   y  s    z@GCTests.test_resurrection_is_transitive.<locals>.Lazarus.__del__N)r   r   r   r  rk   r   r  r   r   rÍ   v  s   rÍ   r1   Úcargo)r4   r5   rp   rR   r  r  r6   rd   r  re   rÉ   Úhasattrrn   )r   r  r  r  Zcargo_idÚinstancer   r  r   Útest_resurrection_is_transitiveq  s"    
z'GCTests.test_resurrection_is_transitivec                    s¼  d}G dd„ dƒ}G ‡ fdd„d|ƒ}g ‰ dd„ }t  ¡  t  ¡  |ƒ \}}t|ƒD ]
}|ƒ  qTt  ¡ }|ƒ \}	}
|  |d| ¡ |  |	| d| ¡ |  |
| d	¡ |	|
 }}|ƒ  t  ¡ }|ƒ \}	}
|  |d	¡ |  |	| d	¡ |  |
| d	¡ |	|
 }}t|ƒD ]}|ƒ  q|ƒ  t  ¡ }|ƒ \}	}
|  |d| ¡ |  |	| d| ¡ |  |
| d	¡ |	|
 }}ˆ  ¡  t  ¡ }|ƒ \}	}
|  |d
¡ |  |	| d
¡ |  |
| d	¡ t  ¡  d S )Néd   c                   @   s   e Zd Zdd„ ZdS )zLGCTests.test_resurrection_does_not_block_cleanup_of_other_objects.<locals>.Ac                 S   s
   | | _ d S r   r  r$   r   r   r   r   ›  s    zUGCTests.test_resurrection_does_not_block_cleanup_of_other_objects.<locals>.A.__init__Nr    r   r   r   r   rA   š  s   rA   c                       s   e Zd Z‡ fdd„ZdS )zLGCTests.test_resurrection_does_not_block_cleanup_of_other_objects.<locals>.Zc                    s   ˆ   | ¡ d S r   r˜   r$   ©Zzsr   r   rk   Ÿ  s    zTGCTests.test_resurrection_does_not_block_cleanup_of_other_objects.<locals>.Z.__del__Nrl   r   r  r   r   ÚZž  s   r  c                  S   s   t  ¡ d } | d | d fS )Néÿÿÿÿrø   rú   )r4   rû   )r;   r   r   r   Úgetstats¤  s    zSGCTests.test_resurrection_does_not_block_cleanup_of_other_objects.<locals>.getstatsr=   r   r¨   )r4   r5   rp   r„   r6   r  rn   )r   r…   rA   r  r!  ZoldcZoldncr   r>   rx   Zncr   r  r   Ú9test_resurrection_does_not_block_cleanup_of_other_objects“  sN    








zAGCTests.test_resurrection_does_not_block_cleanup_of_other_objectsNz%requires ContainerNoGC extension typec                 C   s’   t j ¡ }G dd„ dƒ}G dd„ dƒ}|ƒ }||_t|ƒ ƒ|_t |jj|¡|_	|j	g}| 
|¡ t ¡  t ¡  ~~t ¡  | ¡  t ¡  d S )Nc                   @   s   e Zd Zg d¢ZdS )z+GCTests.test_trash_weakref_clear.<locals>.A)rC   ÚyÚwzNr¿   r   r   r   r   rA   ø  s   rA   c                   @   s   e Zd ZdS )z+GCTests.test_trash_weakref_clear.<locals>.ZNr@   r   r   r   r   r  û  s   r  )ÚunittestZmockZMockrC   r   r#  r'   r(   Úvaluer$  r3   r4   r5   rp   Zassert_not_calledrn   )r   rÓ   rA   r  rC   Zwr_cycler   r   r   Útest_trash_weakref_clearÖ  s     

z GCTests.test_trash_weakref_clear)0r   r   r   r8   r<   r?   rF   rG   rI   rL   rN   r   rY   rZ   r\   r   ra   rh   rr   rs   r{   r~   r‰   r    r«   r±   r´   r¶   r»   rË   rÎ   rÕ   rÙ   rê   rð   rò   r÷   r  r  r  r  r  r  r"  r%  ÚskipIfr   r'  r   r   r   r   r/   U   sb   
	


	


#:/ 
0.
$"C
ÿr/   c                   @   sd   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	e
dd„ ƒZe ed¡dd„ ƒZdS )ÚGCCallbackTestsc                 C   sL   t  ¡ | _t  ¡  t  ¡ | _t  d¡ t j | j	¡ t j | j
¡ g | _d S r¬   )r4   rþ   Úenabledrp   rb   rg   rc   Ú	callbacksr3   Úcb1Úcb2Úothergarbager$   r   r   r   ÚsetUp  s    


zGCCallbackTests.setUpc                 C   sz   | ` tj | j¡ tj | j¡ t | j¡ | jr:t 	¡  t 
¡  tjD ]}t|tƒrHd |_qHtjd d …= | `t 
¡  d S r   )Úvisitr4   r+  rV   r,  r-  rc   rg   r*  rn   r5   rT   Ú
isinstancer*   r+   r.  )r   rX   r   r   r   ÚtearDown  s    

zGCCallbackTests.tearDownc                 C   sB   g | _ t ¡  tjd d … g  }tjd d …< | j |¡ g | _ d S r   )r0  r4   r5   rT   r.  r3   )r   rT   r   r   r   Úpreclean.  s
    zGCCallbackTests.precleanc                 C   s   | j  d|t|ƒf¡ d S r0   )r0  r3   rý   )r   ÚphaseÚinfor   r   r   r,  8  s    zGCCallbackTests.cb1c                 C   sf   | j  d|t|ƒf¡ |dkrbt| dƒrbdd„ tjD ƒ}dd„ tjD ƒtjd d …< |D ]
}d |_qVd S )Nr=   ÚstopÚcleanupc                 S   s   g | ]}t |tƒr|‘qS r   ©r1  r*   ©rÏ   rz   r   r   r   rÐ   ?  rO   z'GCCallbackTests.cb2.<locals>.<listcomp>c                 S   s   g | ]}t |tƒs|‘qS r   r8  r9  r   r   r   rÐ   @  s   
ÿ)r0  r3   rý   r  r4   rT   r+   )r   r4  r5  Zucrz   r   r   r   r-  ;  s    zGCCallbackTests.cb2c                 C   sò   |   ¡  t ¡  dd„ | jD ƒ}dd„ |D ƒ}dd„ |D ƒ}|  |dgd ¡ |  |dgd ¡ dd„ | jD ƒ}dd„ |D ƒ}d	d„ |D ƒ}|  |d
gd ¡ |  |dgd ¡ | jD ]6}|d }|  d|v ¡ |  d|v ¡ |  d|v ¡ q¶d S )Nc                 S   s   g | ]}|d  ‘qS )r   r   ©rÏ   rˆ   r   r   r   rÐ   L  rO   z0GCCallbackTests.test_collect.<locals>.<listcomp>c                 S   s   g | ]}|d kr|‘qS ©r1   r   rÔ   r   r   r   rÐ   M  rO   c                 S   s   g | ]}|d kr|‘qS )r=   r   rÔ   r   r   r   rÐ   N  rO   r1   r=   c                 S   s   g | ]}|d  ‘qS r;  r   r:  r   r   r   rÐ   S  rO   c                 S   s   g | ]}|d kr|‘qS )Ústartr   rÔ   r   r   r   rÐ   T  rO   c                 S   s   g | ]}|d kr|‘qS )r6  r   rÔ   r   r   r   rÐ   U  rO   r<  r6  r	  rø   rú   )r3  r4   r5   r0  r6   rÉ   )r   r€   Zn1Zn2rˆ   r5  r   r   r   Útest_collectE  s"    
zGCCallbackTests.test_collectc                 C   s:   |   ¡  t d¡ | jD ]}|d }|  |d d¡ qd S )Nr=   r	  )r3  r4   r5   r0  r6   )r   rˆ   r5  r   r   r   Útest_collect_generation`  s
    

z'GCCallbackTests.test_collect_generationc                 C   s
  |   ¡  tƒ  tƒ  tdƒ t ¡  | jD ]:}|d dkr<q*|d }|  |d d¡ |  |d d¡ q*|  ttjƒd¡ tjD ]}|  	|t¡ q~d	| _
g | _g tjd d …< t ¡  | jD ]:}|d dkrÊq¸|d }|  |d d
¡ |  |d d¡ q¸|  ttjƒd
¡ d S )Nr&   r1   r6  r=   rø   rú   é   r¨   Tr   )r3  r*   r   r4   r5   r0  r6   rd   rT   rü   r7  )r   rˆ   r5  rz   r   r   r   Útest_collect_garbageg  s2    


z$GCCallbackTests.test_collect_garbagezbuilt with -NDEBUGc                 C   sÂ   |   ¡  tdƒ dd l}t d¡}|jtjd|g|j|jd}| 	¡ \}}|j
 ¡  |j ¡  |  |d¡ |  |d¡ d}|  |d	| ¡ |  |d
¡ |  |d| ¡ |  |d¡ |  |d¡ d S )NZctypesr   a  
            from test.support import gc_collect, SuppressCrashReport

            a = [1, 2, 3]
            b = [a]

            # Avoid coredump when Py_FatalError() calls abort()
            SuppressCrashReport().__enter__()

            # Simulate the refcount of "a" being too low (compared to the
            # references held on it by live data), but keeping it above zero
            # (to avoid deallocating it):
            import ctypes
            ctypes.pythonapi.Py_DecRef(ctypes.py_object(a))

            # The garbage collector should now have a fatal error
            # when it reaches the broken object
            gc_collect()
        rÚ   rÛ   sG   gcmodule\.c:[0-9]+: gc_decref: Assertion "gc_get_refs\(g\) > 0" failed.s   refcount is too smalls   [0-9a-fA-Fx]+s   object address  : s   object refcount : 1s   object type     : s   object type name: lists   object repr     : \[1, 2, 3\])r3  r	   rç   ÚtextwrapÚdedentrÞ   r]   rß   rà   rá   rÜ   râ   rÝ   ZassertRegex)r   rç   rä   rå   rÜ   rÝ   Zaddress_regexr   r   r   Útest_refcount_errorsŒ  sB    
þ

ÿÿÿÿÿÿÿz$GCCallbackTests.test_refcount_errorsN)r   r   r   r/  r2  r3  r,  r-  r=  r>  r   r@  r%  r(  ÚBUILD_WITH_NDEBUGrC  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	S )
ÚGCTogglingTestsc                 C   s   t  ¡  d S r   )r4   rn   r$   r   r   r   r/  Ä  s    zGCTogglingTests.setUpc                 C   s   t  ¡  d S r   )r4   rp   r$   r   r   r   r2  Ç  s    zGCTogglingTests.tearDownc           
         sÒ   t dƒ}t ¡  t dƒ}||_|`t dƒ}t |¡‰ g ‰‡ ‡fdd„}t ||¡}d  } }}g }d}tƒ }|js¨|d7 }|dkrŒ|  	d¡ |  
tˆƒd¡ | g ¡ ql|  
tˆƒd¡ ˆD ]}	|  
|	d ¡ q¼d S )Nr   r1   r=   c                    s   ˆ ƒ gˆd d …< d S r   r   r#   ©Zc2wrrÒ   r   r   rÓ   Ú  s    z2GCTogglingTests.test_bug1055820c.<locals>.callbacké'  ú'gc didn't happen after 10000 iterations)r   r4   r5   Zkeep_c0_aliver   r'   r(   r!   r"   rU   r6   rd   r3   )
r   Zc0Úc1Úc2rÓ   Zc0wrÚjunkr   Údetectorry   r   rF  r   Útest_bug1055820cÊ  s.    
 
z GCTogglingTests.test_bug1055820cc           	         sÎ   g ‰G ‡ ‡fdd„dt ƒ}|dƒ}t ¡  t dƒ}||_|`t dƒ}t |¡‰ d  } }}tƒ }g }d}|js¤|d7 }|dkrˆ|  	d¡ |  
tˆƒd¡ | g ¡ qh|  
tˆƒd¡ ˆD ]}|  
|d ¡ q¸d S )Nc                       s   e Zd Z‡ ‡fdd„ZdS )z+GCTogglingTests.test_bug1055820d.<locals>.Dc                    s   ˆ ƒ gˆd d …< d S r   r   r$   rF  r   r   rk     s    z3GCTogglingTests.test_bug1055820d.<locals>.D.__del__Nrl   r   rF  r   r   ÚD  s   rN  r   r1   r=   rG  rH  )r   r4   r5   Zkeep_d0_aliver   r'   r(   r!   r"   rU   r6   rd   r3   )	r   rN  Zd0rI  rJ  rL  rK  r   ry   r   rF  r   Útest_bug1055820d  s,    

z GCTogglingTests.test_bug1055820dN)r   r   r   r/  r2  rM  rO  r   r   r   r   rE  Ã  s   FrE  c                   @   s   e Zd Zdd„ ZdS )ÚPythonFinalizationTestsc                 C   s   t  d¡}td|ƒ d S )Na   
            import ast
            import codecs

            # Small AST tree to keep their AST types alive
            tree = ast.parse("def f(x, y): return 2*x-y")
            x = [tree]
            x.append(x)

            # Put the cycle somewhere to survive until the last GC collection.
            # Codec search functions are only cleared at the end of
            # interpreter_clear().
            def search_func(encoding):
                return None
            search_func.a = x
            codecs.register(search_func)
        rÚ   )rA  rB  r
   )r   rä   r   r   r   Útest_ast_finiU  s    
z%PythonFinalizationTests.test_ast_finiN)r   r   r   rQ  r   r   r   r   rP  T  s   rP  c                   C   s6   t  ¡ at  ¡  t  ¡ at  tt j @ ¡ t  ¡  d S r   )	r4   rþ   r*  rp   rb   rg   rc   Z
DEBUG_LEAKr5   r   r   r   r   ÚsetUpModuleo  s
    rR  c                   C   s.   t  t¡ trtdƒ t  ¡  ts*t  ¡  d S )Nzrestoring automatic collection)r4   rc   rg   r   Úprintrn   r*  rp   r   r   r   r   ÚtearDownModuley  s    
rT  Ú__main__)*r%  Zunittest.mockZtest.supportr   r   r   r   r   r   r   r	   Ztest.support.script_helperr
   r   r4   r]   Z	sysconfigrA  r   r‹   r'   Z	_testcapir   ÚImportErrorr   r   r   r!   r*   Zget_config_varsÚgetrD  r  ZTestCaser/   r)  rE  rP  rR  rT  r   Úmainr   r   r   r   Ú<module>   sT   (

       D 2 

