
    g                         d Z ddlZddlZddlZddlZ G d dej
                        Z G d de      Z e	ed      rd Z
ej                  Zyd	 Z
d
 Zy)a[  A subclass of unittest.TestCase which checks for reference leaks.

To use:
- Use testing_refleak.BaseTestCase instead of unittest.TestCase
- Configure and compile Python with --with-pydebug

If sys.gettotalrefcount() is not available (because Python was built without
the Py_DEBUG option), then this module is a no-op and tests will run normally.
    Nc                   (    e Zd ZdZd Zd Zd Zd Zy)LocalTestResultzHA TestResult which forwards events to a parent object, except for Skips.c                 P    t         j                  j                  |        || _        y N)unittest
TestResult__init__parent_result)selfr
   s     ^/var/www/openai/venv/lib/python3.12/site-packages/google/protobuf/internal/testing_refleaks.pyr	   zLocalTestResult.__init__   s      &&D    c                 <    | j                   j                  ||       y r   )r
   addErrorr   testerrors      r   r   zLocalTestResult.addError   s    e,r   c                 <    | j                   j                  ||       y r   )r
   
addFailurer   s      r   r   zLocalTestResult.addFailure"   s    !!$.r   c                      y r    )r   r   reasons      r   addSkipzLocalTestResult.addSkip%   s    r   N)__name__
__module____qualname____doc__r	   r   r   r   r   r   r   r   r      s    P'-/	r   r   c                   .     e Zd ZdZdZd fd	Zd Z xZS )ReferenceLeakCheckerMixinz:A mixin class for TestCase, which checks reference counts.   c                    t        | | j                        }t        |dd      }t        | dd      }|s|ry t        j                  j	                         | _        t        t        | #  |       t        t        | #  |       d}t        |      }d}g }t        |      | j                  k  rs| j                         }t        t        | #  |       | j                         }	|	|k  r|dk  r|dz  }\d}|j                  |	|z
         t        |      | j                  k  rst        ||        	 | j                  |dg| j                  z         y # t         $ r' |j#                  | t%        j&                                Y y w xY w)N__unittest_expecting_failure__F)resultr         )getattr_testMethodNamecopyregdispatch_tablecopy_saved_pickle_registrysuperr   runr   lenNB_RUNS_getRefcountsappendprintassertEqual	Exceptionr   sysexc_info)r   r"   
testMethodexpecting_failure_methodexpecting_failure_classoldrefcountlocal_result
num_flakesrefcount_deltasnewrefcount	__class__s             r   r,   zReferenceLeakCheckerMixin.run.   sq   t334J&z3SUZ[%d,LeT":
 #*"8"8"="="?D 

#T.f.=	
#T.f.=K"6*LJO
o

-&&(k%t00E&&(k 
{	"zA~
 	a
j[;67 o

- 
/4 ,
dll(:; ,oodCLLN+,s   + E -E<;E<c                 0   t         j                  j                          t         j                  j                  | j                         t        j                          t        j                          t        j                          t        j                         S r   )	r'   r(   clearupdater*   gccollectr4   gettotalrefcount)r   s    r   r/   z'ReferenceLeakCheckerMixin._getRefcountsY   sZ      "!!$"="=> JJLJJLJJL!!r   r   )r   r   r   r   r.   r,   r/   __classcell__)r>   s   @r   r   r   )   s    B'),V"r   r   rD   c                     t         f| j                  z   } t        |       | j                  |t	        | j
                              }|S r   )r   	__bases__typer   dict__dict__)
test_class	new_bases	new_classs      r   TestCaserN   f   sE    *,z/C/CCI Z YZ-@-@(ACIr   c                     | S r   r   )rK   s    r   rN   rN   p   s    r   c                     ~ d }|S )Nc                     | S r   r   )funcs    r   Samez&SkipReferenceLeakChecker.<locals>.Sameu   s    kr   r   )r   rS   s     r   SkipReferenceLeakCheckerrT   s   s    Kr   )r   r'   rB   r4   r   r   r   objectr   hasattrrN   skiprT   r   r   r   <module>rX      s_     	 
 	h)) 	"8" 8"v 3"#
 &]]
r   