U
    +d3                  
   @   s  d dl Z d dlZd dl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	d dl
Z
d dlZd dl
mZmZmZ G dd de
jZee
_dd ZG dd	 d	e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G dd dejZG dd deZG dd deZG dd deZG dd dejZ zd dl!Z!W n e"k
rT   Y nJX ze!#  W n: e$k
r Z% zdZ&e'e&j(e%d W 5 dZ%[%X Y nX dS )    N)StringIO)resultrunnersignalsc                       s\   e Zd ZdZdZdZdZ fddZ fddZ fddZ	 fd	d
Z
 fddZ  ZS )NumbaTestProgramz
    A TestProgram subclass adding the following options:
    * a -R option to enable reference leak detection
    * a --profile option to enable profiling of the test run

    Currently the options are only added in 3.4+.
    Fc                    s0   | dd | _tjd tt| j|| d S )NZsuitez:x)popdiscovered_suitesyswarnoptionsappendsuperr   __init__)selfargskwargs	__class__ </tmp/pip-unpacked-wheel-stw2luzp/llvmlite/tests/customize.pyr   !   s    zNumbaTestProgram.__init__c                    s&   | j d k	r| j | _ntt|   d S N)r   testr   r   createTestsr   r   r   r   r   (   s    

zNumbaTestProgram.createTestsc                    sV   t t|  }| jd kr,|jdddddd |jddd	dd
d |jddddd |S )N-Rz	--refleakrefleak
store_truezDetect reference / memory leaks)destactionhelp-mz--multiprocessmultiprocesszParallelize testsz	--profileprofilezProfile the test run)r   r   _getParentArgParser
testRunneradd_argument)r   parserr   r   r   r"   .   s    


z$NumbaTestProgram._getParentArgParserc                    s^   t jdk r:d|kr"|d d| _d|kr:|d d| _tt| | | jdkrZd| _	d S )N)      r   Tr   r   )
r	   version_inforemover   r    r   r   	parseArgs	verbositybuffer)r   argvr   r   r   r*   ?   s    



zNumbaTestProgram.parseArgsc              	      s    j r"t _ttds4td n jd kr4tj _ j	rTt
 j j j jd _ fdd} jrtjtjtjd jd d }tjtjd	}|  z|| W 5 |  td
|f  || X n|  d S )Ngettotalrefcountz^detecting reference leaks requires a debug build of Python, only memory leaks will be detected)r+   failfastr,   c                      s   t t  d S r   )r   r   runTestsr   )r   r   r   r   run_tests_real`   s    z1NumbaTestProgram.runTests.<locals>.run_tests_real__main__r   z.prof)Ztimerz!Writing test profile data into %r)r   RefleakTestRunnerr#   hasattrr	   warningswarnunittestTextTestRunnerr    ParallelTestRunnerr+   r/   r,   r!   ospathsplitextbasenamemodules__file__cProfileZProfiletimeperf_counterenabledisableprintZ
dump_statsZruncall)r   r1   filenamepr   r   r   r0   N   s:    

zNumbaTestProgram.runTests)__name__
__module____qualname____doc__r   r!   r    r   r   r"   r*   r0   __classcell__r   r   r   r   r      s   r   c                  C   s   z
t j} W n tk
r&   dd } Y nX z
t j}W n tk
rN   dd }Y nX t jt jt jt jfD ]}|d k	rd|  qdt 	  t
  |  | fS )Nc                   S   s   dS N*   r   r   r   r   r   func1   s    z_refleak_cleanup.<locals>.func1c                   S   s   dS rM   r   r   r   r   r   func2   s    z_refleak_cleanup.<locals>.func2)r	   getallocatedblocksAttributeErrorr.   stdoutstderr
__stdout__
__stderr__flush_clear_type_cachegcZcollect)rO   rP   streamr   r   r   _refleak_cleanup{   s    


r[   c                   @   s   e Zd ZdS )ReferenceLeakErrorN)rH   rI   rJ   r   r   r   r   r\      s   r\   c                   @   s   e Zd Zdd ZdS )IntPoolc                 C   s   |S r   r   )r   keyr   r   r   __missing__   s    zIntPool.__missing__N)rH   rI   rJ   r_   r   r   r   r   r]      s   r]   c                       s,   e Zd ZdZdZdd Z fddZ  ZS )RefleakTestResultr&      c                 C   s   | j   | j}| j}dg||  }dg||  }t }tddD ]}||  qBd }}	t|D ]}t }
||
 |
	 s| j
|
j
 | j|
j t~
t \}}||kr|||	  ||| < |||  ||| < || }}	q`||fS )Nr   i8   )rZ   rW   repetitionswarmupr]   ranger   Z
TestResultrunwasSuccessfulfailuresextenderrorsAssertionErrorr[   )r   r   ZrepcountZnwarmup	rc_deltasalloc_deltasZ	_int_pooliZalloc_beforeZ	rc_beforeresZalloc_afterZrc_afterr   r   r   
_huntLeaks   s8    



zRefleakTestResult._huntLeaksc              	      s   z|  |\}}W n" tk
r4   |  r.tY d S X dd }dd }d}|d|f|d|ffD ]z\}}}	|	|r^d|||t|f }
d	}zt|
W n tk
r   t }Y nX | jr| j	
d
||f  | || q^|stt| | d S )Nc                 S   s   t | S r   )anydeltasr   r   r   check_rc_deltas   s    z5RefleakTestResult.addSuccess.<locals>.check_rc_deltasc                 S   s2   d|  d t| k rdS t| tdks.dS dS )Nr&   r   T)   r   F)countlensetrr   r   r   r   check_alloc_deltas   s
    z8RefleakTestResult.addSuccess.<locals>.check_alloc_deltasFZ
referenceszmemory blocksz%s leaked %s %s, sum=%sTz%s = %r )rp   rk   rg   sumr\   	Exceptionr	   exc_infoZshowAllrZ   writeZ
addFailurer   r`   
addSuccess)r   r   rl   rm   rt   rz   failedrs   Z	item_namecheckermsgr}   r   r   r   r      s8    	   zRefleakTestResult.addSuccess)rH   rI   rJ   rd   rc   rp   r   rL   r   r   r   r   r`      s   "r`   c                   @   s   e Zd ZeZdS )r3   N)rH   rI   rJ   r`   resultclassr   r   r   r   r3      s   r3   c                 C   s6   t | tjr,g }| D ]}|t| q|S | gS dS )z$Expand suite into list of tests
    N)
isinstancer7   Z	TestSuiteri   _flatten_suite)r   testsxr   r   r   r      s    r   c                   @   s   e Zd ZdZdd ZdS )ParallelTestResultzA
    A TestResult able to inject results from other results.
    c                 C   sv   | j |j   | j   |  j|j7  _| j|j | j|j | j|j | j	|j	 | j
|j
 dS )zI
        Add the results from the other *result* to this result.
        N)rZ   r~   getvaluerW   testsRunrh   ri   rj   skippedexpectedFailuresunexpectedSuccesses)r   r   r   r   r   add_results  s    
zParallelTestResult.add_resultsN)rH   rI   rJ   rK   r   r   r   r   r   r      s   r   c                   @   s$   e Zd ZdZdZdd Zdd ZdS )_MinimalResultz7
    A minimal, picklable TestResult-alike object.
    )rh   rj   r   r   r   rZ   
shouldStopr   c                 C   s
   d|_ dS )zR
        Remove any unpicklable attributes from TestCase instance *case*.
        N)Z_outcomeForDoCleanups)r   caser   r   r   
fixup_case  s    z_MinimalResult.fixup_casec                 C   sp   | j D ]}t| |t|| q| jD ]\}}| | q$| jD ]\}}| | q>| jD ]\}}| | qXd S r   )	__slots__setattrgetattrr   r   rj   rh   )r   Zoriginal_resultattrr   _r   r   r   r   "  s    
z_MinimalResult.__init__N)rH   rI   rJ   rK   r   r   r   r   r   r   r   r     s   r   c                   @   s    e Zd ZdZdd Zdd ZdS )_FakeStringIOz:
    A trivial picklable StringIO-alike for Python 2.
    c                 C   s
   || _ d S r   _value)r   valuer   r   r   r   2  s    z_FakeStringIO.__init__c                 C   s   | j S r   r   r   r   r   r   r   5  s    z_FakeStringIO.getvalueN)rH   rI   rJ   rK   r   r   r   r   r   r   r   -  s   r   c                   @   s.   e Zd ZdZdd Zdd Zejdd ZdS )	_MinimalRunnerzu
    A minimal picklable object able to instantiate a runner in a
    child process and run a test case with it.
    c                 C   s   || _ || _d S r   )
runner_clsrunner_args)r   r   r   r   r   r   r   ?  s    z_MinimalRunner.__init__c              	   C   s|   | j }t |d< | jf |}| }t  t| |j|_|j|_| 	| || W 5 Q R X t
|j |_t|S )NrZ   )r   r   r   Z_makeResultr   ZinstallHandlerZregisterResultr/   r,   cleanup_objectr   rZ   r   r   )r   r   r   r   r   r   r   r   __call__F  s    

z_MinimalRunner.__call__c              	   c   s<   t |j}z
|V  W 5 t |j| }|D ]}|j|= q(X dS )zu
        A context manager which cleans up unwanted attributes on a test case
        (or any other object).
        N)ry   __dict__)r   r   Zvanilla_attrsZspurious_attrsnamer   r   r   r   Y  s    

z_MinimalRunner.cleanup_objectN)	rH   rI   rJ   rK   r   r   
contextlibcontextmanagerr   r   r   r   r   r   9  s
   r   c                       s4   e Zd ZdZeZdd Zdd Z fddZ  Z	S )r9   z\
    A test runner which delegates the actual running to a pool of child
    processes.
    c                 K   s    t jj| f| || _|| _d S r   )r   r8   r   r   r   )r   r   r   r   r   r   r   p  s    zParallelTestRunner.__init__c                 C   sb   t | j| j}t }|j}z.||| jD ]}|	| |j
r* qDq*|W S |  |  X d S r   )r   r   r   multiprocessingZPoolZimap_unordered	terminatejoin
_test_listr   r   )r   r   Zchild_runnerpoolimapZchild_resultr   r   r   
_run_inneru  s    
zParallelTestRunner._run_innerc                    s   t || _tt| | jS r   )r   r   r   r9   rf   r   )r   r   r   r   r   rf     s    
zParallelTestRunner.run)
rH   rI   rJ   rK   r   r   r   r   rf   rL   r   r   r   r   r9   h  s
   r9   z+Failed to enable faulthandler due to:
{err})err))collectionsr   r@   ior   rY   r:   r   r	   rA   r7   r5   r   r   r   mainr   r[   RuntimeErrorr\   defaultdictr]   ZTextTestResultr`   r8   r3   r   r   objectr   r   r   r9   faulthandlerImportErrorrC   BaseExceptioner   r6   formatr   r   r   r   <module>   sB   aQ/%