U
    Sd?                     @   st   d Z ddlZddlZddlZddlZG dd dejZG dd deZe	edr`dd	 Z
ejZnd
d	 Z
dd ZdS )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                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )LocalTestResultzHA TestResult which forwards events to a parent object, except for Skips.c                 C   s   t j|  || _d S N)unittest
TestResult__init__parent_result)selfr    r	   M/tmp/pip-unpacked-wheel-1ori_g8k/google/protobuf/internal/testing_refleaks.pyr   2   s    zLocalTestResult.__init__c                 C   s   | j || d S r   )r   addErrorr   testerrorr	   r	   r
   r   6   s    zLocalTestResult.addErrorc                 C   s   | j || d S r   )r   
addFailurer   r	   r	   r
   r   9   s    zLocalTestResult.addFailurec                 C   s   d S r   r	   )r   r   reasonr	   r	   r
   addSkip<   s    zLocalTestResult.addSkipN)__name__
__module____qualname____doc__r   r   r   r   r	   r	   r	   r
   r   /   s
   r   c                       s.   e Zd ZdZdZd fdd	Zdd Z  ZS )	ReferenceLeakCheckerMixinz:A mixin class for TestCase, which checks reference counts.   Nc           
         s   t | | j}t |dd}t | dd}|s,|r0d S tj | _tt| j|d tt| j|d d}t	|}d}g }t
|| jk r|  }tt| j|d |  }	|	|k r|dk r|d7 }qtd}||	|  qtt||  z| |dg| j  W n& tk
r   || t  Y nX d S )NZ__unittest_expecting_failure__F)resultr         )getattrZ_testMethodNamecopyregdispatch_tablecopy_saved_pickle_registrysuperr   runr   lenNB_RUNS_getRefcountsappendprintassertEqual	Exceptionr   sysexc_info)
r   r   Z
testMethodZexpecting_failure_methodZexpecting_failure_classZoldrefcountZlocal_resultZ
num_flakesZrefcount_deltasZnewrefcount	__class__r	   r
   r!   E   s4    
zReferenceLeakCheckerMixin.runc                 C   s8   t j  t j| j t  t  t  t S r   )	r   r   clearupdater   gcZcollectr)   gettotalrefcount)r   r	   r	   r
   r$   p   s    
z'ReferenceLeakCheckerMixin._getRefcounts)N)r   r   r   r   r#   r!   r$   __classcell__r	   r	   r+   r
   r   @   s   +r   r0   c                 C   s(   t f| j }t| | j|t| j}|S r   )r   	__bases__typer   dict__dict__)
test_class	new_bases	new_classr	   r	   r
   TestCase}   s      r9   c                 C   s   | S r   r	   )r6   r	   r	   r
   r9      s    c                 C   s   ~ dd }|S )Nc                 S   s   | S r   r	   )funcr	   r	   r
   Same   s    z&SkipReferenceLeakChecker.<locals>.Samer	   )r   r;   r	   r	   r
   SkipReferenceLeakChecker   s    r<   )r   r   r/   r)   r   r   r   objectr   hasattrr9   skipr<   r	   r	   r	   r
   <module>   s   
;
