B
    u9aÁ‘  ã               @   sB  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 d dlmZm	Z	m
Z
 d dlmZ yd dlZW n ek
rx   dZY nX e d¡Zdd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Zdd„ Zd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e edkd¡G dd„ dejƒƒZdd „ Ze d!kr>eƒ  dS )"é    N)Úpatch)Úassert_python_okÚassert_python_failureÚ interpreter_requires_environment)Úsupportó    c             C   s\   g }t  d¡}xDt| ƒD ]8}|j}|j| }| |j|f¡ d}|j}|d krP qW t|ƒS )Né   r   )	ÚsysÚ	_getframeÚrangeÚf_codeÚf_linenoÚappendÚco_filenameÚf_backÚtuple)ÚnframeZlineno_deltaÚframesÚframeÚindexÚcodeÚlineno© r   ú&/usr/lib/python3.7/test_tracemalloc.pyÚ
get_frames   s    

r   c             C   s0   t  ¡ }| t }t|dƒ}d| }|t  |¡fS )Nr   ó   x)ÚtracemallocÚget_traceback_limitÚEMPTY_STRING_SIZEr   Ú	Traceback)Úsizer   Z	bytes_lenr   Údatar   r   r   Úallocate_bytes!   s
    
r"   c              C   sD   d} ddddddg}t  || ¡}ddddddg}t  || ¡}||fS )	Né   )r   é
   ))za.pyr#   )zb.pyé   )r   r#   ))za.pyé   )zb.pyr%   )r#   éB   ))zb.pyr   )é   é   ))z	<unknown>r   )r#   r#   ))za.pyr&   )zb.pyr%   )r#   iˆ  ))za.pyr&   )zb.pyr%   )r%   i  ))zc.pyiB  )r   ÚSnapshot)Útraceback_limitÚ
raw_tracesÚsnapshotZraw_traces2Ú	snapshot2r   r   r   Úcreate_snapshots(   s     r/   c             C   s   t  | |f¡S )N)r   Z_Frame)Úfilenamer   r   r   r   r   I   s    r   c              G   s
   t  | ¡S )N)r   r   )r   r   r   r   Ú	tracebackL   s    r1   c             C   s   t | |fƒS )N)r1   )r0   r   r   r   r   Útraceback_linenoO   s    r2   c             C   s
   t | dƒS )Nr   )r2   )r0   r   r   r   Útraceback_filenameR   s    r3   c               @   s–   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d„ Ze eedƒd¡dd „ ƒZd!S )"ÚTestTracemallocEnabledc             C   s    t  ¡ r|  d¡ t  d¡ d S )Nz+tracemalloc must be stopped before the testr   )r   Ú
is_tracingÚskipTestÚstart)Úselfr   r   r   ÚsetUpW   s    
zTestTracemallocEnabled.setUpc             C   s   t  ¡  d S )N)r   Ústop)r8   r   r   r   ÚtearDown]   s    zTestTracemallocEnabled.tearDownc             C   sR   dd„ t dƒD ƒ}t ¡ }|  |d¡ t ¡  t ¡ }|  |d¡ |  ||¡ d S )Nc             S   s   g | ]}t d ƒ‘qS )é{   )r"   )Ú.0Úcountr   r   r   ú
<listcomp>a   s    zFTestTracemallocEnabled.test_get_tracemalloc_memory.<locals>.<listcomp>iè  r   )r   r   Zget_tracemalloc_memoryÚassertGreaterEqualÚclear_tracesÚassertLessEqual)r8   r!   r    Úsize2r   r   r   Útest_get_tracemalloc_memory`   s    z2TestTracemallocEnabled.test_get_tracemalloc_memoryc             C   s2   t  ¡  d}t|ƒ\}}t  |¡}|  ||¡ d S )Ni90  )r   rA   r"   Úget_object_tracebackÚassertEqual)r8   Úobj_sizeÚobjÚobj_tracebackr1   r   r   r   Útest_get_object_tracebackj   s
    
z0TestTracemallocEnabled.test_get_object_tracebackc             C   s¨   d}t  ¡  |  tt jd¡ t  ¡  t  d¡ t|ƒ\}}t  |¡}|  t|ƒd¡ |  ||¡ t  ¡  t  d¡ t|ƒ\}}t  |¡}|  t|ƒd¡ |  ||¡ d S )Nr$   éÿÿÿÿr   )	r   r:   ÚassertRaisesÚ
ValueErrorr7   r"   rE   rF   Úlen)r8   rG   Úobj2Úobj2_tracebackr1   rH   rI   r   r   r   Útest_set_traceback_limitq   s    



z/TestTracemallocEnabled.test_set_traceback_limitc             C   s.   x|D ]}|d |j kr|S qW |  d¡ d S )Nr#   ztrace not found)Ú_framesÚfail)r8   Útracesr1   Útracer   r   r   Ú
find_trace…   s    
z!TestTracemallocEnabled.find_tracec       	      C   sx   t  ¡  d}t|ƒ\}}t  ¡ }|  ||¡}|  |t¡ |\}}}|  ||¡ |  ||j¡ t  	¡  |  t  ¡ g ¡ d S )Ni90  )
r   rA   r"   Ú_get_tracesrV   ZassertIsInstancer   rF   rR   r:   )	r8   rG   rH   rI   rT   rU   Údomainr    r1   r   r   r   Útest_get_tracesŒ   s    
z&TestTracemallocEnabled.test_get_tracesc                s²   dd„ ‰ ‡ fdd„‰‡fdd„}t  ¡  t  d¡ d}||ƒ\}}||ƒ\}}t  ¡ }tt|jƒƒ|_tt|jƒƒ|_|  ||¡}|  ||¡}	|\}
}}|	\}}}|  ||¡ d S )	Nc             S   s   t | ƒS )N)r"   )r    r   r   r   Úallocate_bytes2ž   s    zPTestTracemallocEnabled.test_get_traces_intern_traceback.<locals>.allocate_bytes2c                s   ˆ | ƒS )Nr   )r    )rZ   r   r   Úallocate_bytes3    s    zPTestTracemallocEnabled.test_get_traces_intern_traceback.<locals>.allocate_bytes3c                s   ˆ | ƒS )Nr   )r    )r[   r   r   Úallocate_bytes4¢   s    zPTestTracemallocEnabled.test_get_traces_intern_traceback.<locals>.allocate_bytes4r%   r<   )	r   r:   r7   rW   r   ÚreversedrR   rV   ZassertIs)r8   r\   rG   Zobj1Zobj1_tracebackrO   rP   rT   Ztrace1Ztrace2Zdomain1Zsize1Z
traceback1Zdomain2rC   Ú
traceback2r   )rZ   r[   r   Ú test_get_traces_intern_tracebackœ   s     


z7TestTracemallocEnabled.test_get_traces_intern_tracebackc       	      C   sô   d}d}t  ¡  t|ƒ\}}t  ¡ \}}|  ||¡ |  ||¡ |  || |¡ |  || |¡ d }t  ¡ \}}|  ||¡ |  || || ¡ |  ||¡ t  ¡  |  t  ¡ d¡ t|ƒ\}}t  ¡ \}}|  ||¡ t  ¡  |  t  ¡ d¡ d S )Ni   i   )r   r   )	r   rA   r"   Úget_traced_memoryr@   rB   Z
assertLessrF   r:   )	r8   Z	max_errorrG   rH   rI   r    Z	peak_sizerC   Z
peak_size2r   r   r   Útest_get_traced_memory·   s*    z-TestTracemallocEnabled.test_get_traced_memoryc             C   s@   t dƒ\}}t |¡}|  |¡ t ¡  t |¡}|  |¡ d S )Nr<   )r"   r   rE   ÚassertIsNotNonerA   ÚassertIsNone)r8   rH   rI   r1   r^   r   r   r   Útest_clear_tracesÛ   s    


z(TestTracemallocEnabled.test_clear_tracesc             C   s0   t  ¡  |  t  ¡ ¡ t  ¡  |  t  ¡ ¡ d S )N)r   r:   ÚassertFalser5   r7   Ú
assertTrue)r8   r   r   r   Útest_is_tracingä   s    z&TestTracemallocEnabled.test_is_tracingc          	   C   sŠ   t dƒ\}}t ¡ }| tj¡ |  tjtj¡ tj 	tj¡}|  
|j|j¡ t ¡  |  t¡}t ¡  W d Q R X |  
t|jƒd¡ d S )Nr<   zLthe tracemalloc module must be tracing memory allocations to take a snapshot)r"   r   Útake_snapshotÚdumpr   ÚTESTFNÚ
addCleanupÚunlinkr*   ÚloadrF   rT   r:   rL   ÚRuntimeErrorÚstrZ	exception)r8   rH   Úsourcer-   r.   Úcmr   r   r   Útest_snapshotë   s    z$TestTracemallocEnabled.test_snapshotc             C   sJ   t  ¡ }d|_| tj¡ |  tjtj¡ t j 	tj¡}|  
|jd¡ d S )NÚnew)r   rh   Z	test_attrri   r   rj   rk   rl   r*   rm   rF   )r8   r-   r.   r   r   r   Útest_snapshot_save_attr  s    z.TestTracemallocEnabled.test_snapshot_save_attrc             C   s6   t  ¡ sdS d}t|ƒ\}}t  |¡}|d kr2dS dS )Nr#   i90  r(   r   )r   r5   r"   rE   )r8   rG   rH   rI   r1   r   r   r   Ú
fork_child  s    
z!TestTracemallocEnabled.fork_childÚforkzneed os.fork()c          	   C   sf   t  ¡ }|s,d}z|  ¡ }W d t  |¡ X n6t  |d¡\}}|  t  |¡¡ t  |¡}|  |d¡ d S )Nr   r   )	Úosrv   ru   Ú_exitÚwaitpidrf   Ú	WIFEXITEDÚWEXITSTATUSrF   )r8   ÚpidZexitcodeZpid2Ústatusr   r   r   Ú	test_fork  s    
z TestTracemallocEnabled.test_forkN)Ú__name__Ú
__module__Ú__qualname__r9   r;   rD   rJ   rQ   rV   rY   r_   ra   rd   rg   rr   rt   ru   ÚunittestZ
skipUnlessÚhasattrrw   r~   r   r   r   r   r4   V   s   
$	r4   c               @   sx   e Zd 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 )ÚTestSnapshoti   c          	   C   sÚ   dg}t  ¡ Â}| tjtddd¡ | tjtddd¡ | tjtd|d¡ t ¡ }|  |jd¡ |  t	|j
ƒd¡ |j
d	 }|  |jd¡ |  t	|jƒd¡ |  |jd	 jd
¡ |  |jd	 jd¡ W d Q R X d S )N)r   r&   ))za.pyr#   r5   T)Zreturn_valuer   r&   rW   r   r   za.pyr#   )Ú
contextlibÚ	ExitStackÚenter_contextr   Úobjectr   rh   rF   r+   rN   rT   r    r1   r0   r   )r8   r,   Ústackr-   rU   r   r   r   Útest_create_snapshot.  s     




z!TestSnapshot.test_create_snapshotc       
      C   sä   t ƒ \}}t dd¡}t ddd¡}t ddd¡}t|jjƒ}| |f¡}|  |jjddddd	g¡ |  |jj|¡ | ||f¡}|  |jjddddg¡ | d
¡}	|  |	|¡ |  |	j|j¡ |  |	j|j¡ |  	t
|j|¡ d S )NFzb.pyTza.pyr#   r&   )r   r$   ))za.pyr#   )zb.pyr%   )r   r#   ))za.pyr&   )zb.pyr%   )r(   r)   ))z	<unknown>r   r   )r/   r   ÚFilterÚlistrT   Ú_tracesÚfilter_tracesrF   ZassertIsNotrL   Ú	TypeError)
r8   r-   r.   Úfilter1Úfilter2Zfilter3Úoriginal_tracesÚ	snapshot3Z	snapshot4Z	snapshot5r   r   r   Útest_filter_tracesB  s0    



zTestSnapshot.test_filter_tracesc             C   s†   t ƒ \}}tjdddd}tjdddd}t|jjƒ}| |f¡}|  |jjdddddg¡ | |f¡}|  |jjdddddg¡ d S )	NFza.pyr   )rX   T)r   r$   ))za.pyr#   )zb.pyr%   )r#   r'   ))zb.pyr   )r(   r)   ))z	<unknown>r   )r/   r   r‹   rŒ   rT   r   rŽ   rF   )r8   r-   r.   r   r‘   r’   r“   r   r   r   Útest_filter_traces_domainh  s$    


z&TestSnapshot.test_filter_traces_domainc             C   sn   t ƒ \}}tjddd}tjddd}| |f¡}|  |jjdddddg¡ | |f¡}|  |jjdg¡ d S )	NFr(   )rX   T)r   r$   ))za.pyr#   )zb.pyr%   )r   r#   ))za.pyr&   )zb.pyr%   )r#   r'   ))zb.pyr   )r(   r)   ))z	<unknown>r   )r/   r   ÚDomainFilterrŽ   rF   rT   r   )r8   r-   r.   r   r‘   r“   r   r   r   Ú test_filter_traces_domain_filterƒ  s    


z-TestSnapshot.test_filter_traces_domain_filterc             C   s(  t ƒ \}}tddƒ}tddƒ}tddƒ}tddƒ}tdd	ƒ}| d
¡}|  |t |dd¡t |dd¡t |dd¡t |dd¡g¡ | d
¡}	|  |	t |dd¡t |dd¡t |dd¡g¡ | |d
¡}
|  |
t |dddd¡t |dddd¡t |dddd¡t |dddd¡t |dddd¡g¡ d S )Nz	<unknown>r   za.pyr#   r&   zb.pyr   zc.pyiB  r   r'   é   r(   r)   iŠ  i  iˆ  i¾ÿÿÿrK   iùÿÿÿ)r/   r2   Ú
statisticsrF   r   Ú	StatisticÚ
compare_toÚStatisticDiff)r8   r-   r.   Útb_0Útb_a_2Útb_a_5Útb_b_1Ztb_c_578Ústats1Ústats2r™   r   r   r   Útest_snapshot_group_by_line˜  s0    







z(TestSnapshot.test_snapshot_group_by_linec       
      C   sî   t ƒ \}}tdƒ}tdƒ}tdƒ}tdƒ}| d¡}|  |t |dd¡t |dd	¡t |d
d¡g¡ | d¡}|  |t |dd¡t |dd¡g¡ | |d¡}	|  |	t |dddd¡t |dddd¡t |dddd¡t |dddd¡g¡ d S )Nz	<unknown>za.pyzb.pyzc.pyr0   r'   r   é    r%   r)   i¨  r&   i  iˆ  r   i¾ÿÿÿrK   iùÿÿÿ)r/   r3   r™   rF   r   rš   r›   rœ   )
r8   r-   r.   r   Útb_aÚtb_bZtb_cr¡   r¢   Údiffr   r   r   Útest_snapshot_group_by_file»  s(    


z(TestSnapshot.test_snapshot_group_by_filec             C   s6  t ƒ \}}tddƒ}tddƒ}tdƒ}tdƒ}| d¡}|  |t |dd¡t |d	d
¡t |dd¡t |dd¡g¡ tdƒ}| d¡}	|  |	t |dd¡t |dd¡t |d	d
¡g¡ | |d¡}
|  |
t |dddd¡t |dddd¡t |dddd¡t |dddd¡t |d	dd
d¡g¡ | jt	|jddd d S )N)za.pyr#   )zb.pyr%   )za.pyr&   )zb.pyr   )z	<unknown>r   r1   r'   r   r˜   r(   r)   r#   )zc.pyiB  iŠ  i  iˆ  r   i¾ÿÿÿrK   iùÿÿÿT)Z
cumulative)
r/   r1   r™   rF   r   rš   r›   rœ   rL   rM   )r8   r-   r.   Ztb1Ztb2Ztb3Ztb4r¡   Ztb5r¢   r§   r   r   r   Ú test_snapshot_group_by_tracebackÚ  s4    




z-TestSnapshot.test_snapshot_group_by_tracebackc             C   sÞ   t ƒ \}}tdƒ}tdƒ}tdƒ}tddƒ}tddƒ}tddƒ}tddƒ}	| dd	¡}
|  |
t |d
d¡t |dd¡t |dd¡g¡ | dd	¡}
|  |
t |dd¡t |	dd¡t |dd¡t |dd¡t |dd¡g¡ d S )Nz	<unknown>za.pyzb.pyr#   r&   r   r%   r0   Téb   r¤   r)   r   r'   r˜   r(   )r/   r3   r2   r™   rF   r   rš   )r8   r-   r.   r   r¥   r¦   rž   rŸ   r    Ztb_b_4Ústatsr   r   r   Ú!test_snapshot_group_by_cumulative   s(    




z.TestSnapshot.test_snapshot_group_by_cumulativec             C   sV   t ƒ \}}|jd }|  t|ƒd¡ |j}|  t|ƒd¡ |d }|  t|ƒd¡ d S )Nr   zb.py:4: 10 Bzb.py:4)r/   rT   rF   ro   r1   )r8   r-   r.   rU   r1   r   r   r   r   Útest_trace_format  s    

zTestSnapshot.test_trace_formatc             C   s0   t ƒ \}}| d¡}|d }|  t|ƒd¡ d S )Nr   r   z(b.py:1: size=66 B, count=1, average=66 B)r/   r™   rF   ro   )r8   r-   r.   r«   Ústatr   r   r   Útest_statistic_format%  s
    


z"TestSnapshot.test_statistic_formatc             C   s2   t ƒ \}}| |d¡}|d }|  t|ƒd¡ d S )Nr   r   z;a.py:5: size=5002 B (+5000 B), count=2 (+1), average=2501 B)r/   r›   rF   ro   )r8   r-   r.   r«   r®   r   r   r   Útest_statistic_diff_format,  s
    

z'TestSnapshot.test_statistic_diff_formatc             C   s`   t ƒ \}}|  |jd d… |jd |jd f¡ |jd j}|  |d d… |d |d f¡ d S )Nr#   r   r   )r/   rF   rT   r1   )r8   r-   r.   r1   r   r   r   Útest_slices3  s    
zTestSnapshot.test_slicesc          	   C   sÖ   t ƒ \}}dd„ }tjjd|dª |jd j}|  | ¡ dddd	g¡ |  |jd
ddd	g¡ |  |jddddg¡ |  |jdddd	ddg¡ |  |jd
dddd	g¡ |  |jdddddg¡ W d Q R X d S )Nc             S   s   d| |f S )Nz
  <%s, %s>r   )r0   r   r   r   r   Úgetline>  s    z3TestSnapshot.test_format_traceback.<locals>.getlineztracemalloc.linecache.getline)Zside_effectr   z  File "b.py", line 4z    <b.py, 4>z  File "a.py", line 2z    <a.py, 2>r   )ÚlimitrK   T)Úmost_recent_first)r³   r´   )r/   r‚   Zmockr   rT   r1   rF   Úformat)r8   r-   r.   r²   Útbr   r   r   Útest_format_traceback<  s6    


z"TestSnapshot.test_format_tracebackN)r   r€   r   ÚmaxDiffrŠ   r”   r•   r—   r£   r¨   r©   r¬   r­   r¯   r°   r±   r·   r   r   r   r   r„   +  s   &#&		r„   c               @   s8   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ ZdS )ÚTestFiltersi   c             C   sê   t  dd¡}|  |jd¡ |  |jd¡ |  |j¡ |  |jd¡ t  dddd¡}|  |jd¡ |  |jd¡ |  |jd¡ |  |jd¡ t jddddd}|  |jd¡ |  |jd¡ |  |jd¡ |  |jd¡ |  t	t
|dd¡ d S )NTÚabcFztest.pyr<   )Ú	inclusiveÚfilename_patternr   Ú
all_framesr¼   )r   r‹   rF   r»   r¼   rc   r   r½   rL   ÚAttributeErrorÚsetattr)r8   Úfr   r   r   Útest_filter_attributesc  s     z"TestFilters.test_filter_attributesc             C   sÜ  t  dd¡}|  | dd¡¡ |  | dd¡¡ |  | dd¡¡ |  | dd¡¡ |  | dd¡¡ |  | dd¡¡ t  dd¡}|  | dd¡¡ |  | dd¡¡ |  | dd¡¡ |  | dd¡¡ |  | dd¡¡ |  | dd¡¡ t  ddd¡}|  | dd¡¡ |  | dd¡¡ |  | dd¡¡ |  | dd¡¡ |  | dd¡¡ |  | dd¡¡ t  ddd¡}|  | dd¡¡ |  | dd¡¡ |  | dd¡¡ |  | dd¡¡ |  | dd¡¡ |  | dd¡¡ t  ddd¡}|  | dd¡¡ |  | dd¡¡ |  | dd¡¡ |  | dd¡¡ |  | dd¡¡ |  | dd¡¡ t  ddd¡}|  | dd¡¡ |  | dd¡¡ |  | dd¡¡ |  | dd¡¡ |  | dd¡¡ |  | dd¡¡ d S )NTrº   r   r&   r$   Ú12356F)r   r‹   rf   Ú_match_framere   )r8   rÀ   r   r   r   Útest_filter_match|  sT    zTestFilters.test_filter_matchc             C   sx   dd„ }|   |dddƒ¡ |  |dddƒ¡ |  |dddƒ¡ |  |dddƒ¡ |   |dddƒ¡ |   |dddƒ¡ d S )Nc             S   s   t  | |¡}| |d¡S )Nr   )r   r‹   rÃ   )r»   r0   ÚpatternrÀ   r   r   r   Úfnmatch±  s    z7TestFilters.test_filter_match_filename.<locals>.fnmatchTrº   rÂ   z	<unknown>F)rf   re   )r8   rÆ   r   r   r   Útest_filter_match_filename°  s    z&TestFilters.test_filter_match_filenamec             C   sˆ  dd„ }|   |ddƒ¡ |   |ddƒ¡ |  |ddƒ¡ |  |ddƒ¡ |  |ddƒ¡ |   |ddƒ¡ |   |ddƒ¡ |  |ddƒ¡ |  |dd	ƒ¡ |   |dd
ƒ¡ |   |ddƒ¡ |  |ddƒ¡ |  |ddƒ¡ |   |ddƒ¡ |   |ddƒ¡ |  |ddƒ¡ |  |ddƒ¡ |   |ddƒ¡ |   |ddƒ¡ |  |ddƒ¡ |  |ddƒ¡ tjdkr¦|  |ddƒ¡ |  |ddƒ¡ |  |ddƒ¡ |  |ddƒ¡ n@|   |ddƒ¡ |   |ddƒ¡ |   |ddƒ¡ |   |ddƒ¡ tjdkr4|  |d d!ƒ¡ |  |d!d ƒ¡ |  |d"d#ƒ¡ |  |d$d%ƒ¡ n@|   |d d!ƒ¡ |   |d!d ƒ¡ |   |d"d#ƒ¡ |   |d$d%ƒ¡ |   |d&dƒ¡ d S )'Nc             S   s   t  d|¡}| | d¡S )NTr   )r   r‹   rÃ   )r0   rÅ   Úfilterr   r   r   rÆ   ¾  s    z=TestFilters.test_filter_match_filename_joker.<locals>.fnmatchrº   Ú Ú*ZabcdÚdefza*zabc*zb*zabcd*za*cZabcdcxza*cxZabbZabcdceZabcdeza*c*eZ	abcbdefegza*bd*egZabcddZ	abcbdefefza.pycza.pyÚntZaBCZABcZaBcDezAb*dEza.PYza.PYCza/bza\bza/b\cza\b/cza/b/cza\b\cza.pyo)re   rf   rw   Úname)r8   rÆ   r   r   r   Ú test_filter_match_filename_joker½  sR    z,TestFilters.test_filter_match_filename_jokerc             C   sD  d}d}d}d}t jdddd}|  | |¡¡ |  | |¡¡ |  | |¡¡ |  | |¡¡ t jdddd}|  | |¡¡ |  | |¡¡ |  | |¡¡ |  | |¡¡ t jdddd}|  | |¡¡ |  | |¡¡ |  | |¡¡ |  | |¡¡ t jdddd}|  | |¡¡ |  | |¡¡ |  | |¡¡ |  | |¡¡ t jdd	dd}|  | |¡¡ |  | |¡¡ |  | |¡¡ |  | |¡¡ t jdd	dd}|  | |¡¡ |  | |¡¡ |  | |¡¡ |  | |¡¡ t jdd	dd}|  | |¡¡ |  | |¡¡ |  | |¡¡ |  | |¡¡ d S )
N))za.pyr#   )zb.pyr(   ))zb.pyr%   )zb.pyr&   ))zc.pyr&   )z	<unknown>r   ))z	<unknown>r   Tzb.py)r½   Fz	<unknown>)r   r‹   rf   Z_match_tracebackre   )r8   Zt1Zt2Zt3ÚunknownrÀ   r   r   r   Útest_filter_match_trace  sN    z#TestFilters.test_filter_match_traceN)	r   r€   r   r¸   rÁ   rÄ   rÇ   rÎ   rÐ   r   r   r   r   r¹   `  s   4Er¹   c               @   sz   e Zd Zdd„ Ze eƒ d¡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 edkd¡dd„ ƒZdS )ÚTestCommandLinec             C   s,   d}t d|ƒ\}}}| ¡ }|  |d¡ d S )Nz3import tracemalloc; print(tracemalloc.is_tracing())z-cs   False)r   ÚrstriprF   )r8   r   ÚokÚstdoutÚstderrr   r   r   Ú test_env_var_disabled_by_default4  s    z0TestCommandLine.test_env_var_disabled_by_defaultz6Cannot run -E tests when PYTHON env vars are required.c             C   s2   d}t dd|dd\}}}| ¡ }|  |d¡ d S )Nz3import tracemalloc; print(tracemalloc.is_tracing())z-Ez-cÚ1)ÚPYTHONTRACEMALLOCs   False)r   rÒ   rF   )r8   r   rÓ   rÔ   rÕ   r   r   r   Útest_env_var_ignored_with_E;  s    z+TestCommandLine.test_env_var_ignored_with_Ec             C   s0   d}t d|dd\}}}| ¡ }|  |d¡ d S )Nz3import tracemalloc; print(tracemalloc.is_tracing())z-cr×   )rØ   s   True)r   rÒ   rF   )r8   r   rÓ   rÔ   rÕ   r   r   r   Útest_env_var_enabled_at_startupD  s    z/TestCommandLine.test_env_var_enabled_at_startupc             C   s0   d}t d|dd\}}}| ¡ }|  |d¡ d S )Nz<import tracemalloc; print(tracemalloc.get_traceback_limit())z-cZ10)rØ   s   10)r   rÒ   rF   )r8   r   rÓ   rÔ   rÕ   r   r   r   Útest_env_limitK  s    zTestCommandLine.test_env_limitc          	   C   sX   t  ¡  tddt|ƒd\}}}W d Q R X d|kr8d S d|krDd S |  d|›¡ d S )Nz-cÚpass)rØ   s1   ValueError: the number of frames must be in ranges+   PYTHONTRACEMALLOC: invalid number of frameszunexpeced output: )r   ÚSuppressCrashReportr   ro   rS   )r8   r   rÓ   rÔ   rÕ   r   r   r   Úcheck_env_var_invalidR  s    
z%TestCommandLine.check_env_var_invalidc          
   C   s4   x.dD ]&}| j |d |  |¡ W d Q R X qW d S )N)rK   r   i   @)r   )ÚsubTestrÞ   )r8   r   r   r   r   Útest_env_var_invalid_  s    
z$TestCommandLine.test_env_var_invalidc          
   C   sf   x`dD ]X\}}| j ||d< d}td|d|ƒ\}}}| ¡ }|  |t|ƒ d¡¡ W d Q R X qW d S )N))r   r   )ztracemalloc=1r   )ztracemalloc=15é   )Úxoptionsr   z<import tracemalloc; print(tracemalloc.get_traceback_limit())z-Xz-cÚascii)rß   r   rÒ   rF   ro   Úencode)r8   râ   r   r   rÓ   rÔ   rÕ   r   r   r   Útest_sys_xoptionsd  s    z!TestCommandLine.test_sys_xoptionsc          	   C   s^   dd| ddf}t  ¡  t|Ž \}}}W d Q R X d|kr>d S d|krJd S |  d|›¡ d S )Nz-Xztracemalloc=%sz-crÜ   s1   ValueError: the number of frames must be in ranges/   -X tracemalloc=NFRAME: invalid number of frameszunexpeced output: )r   rÝ   r   rS   )r8   r   ÚargsrÓ   rÔ   rÕ   r   r   r   Úcheck_sys_xoptions_invalidp  s    
z*TestCommandLine.check_sys_xoptions_invalidc          
   C   s4   x.dD ]&}| j |d |  |¡ W d Q R X qW d S )N)rK   r   i   @)r   )rß   rç   )r8   r   r   r   r   Útest_sys_xoptions_invalid{  s    
z)TestCommandLine.test_sys_xoptions_invalidNzneed _testcapic             C   s   d}t ddd|ƒ d S )Nz2import _testcapi; _testcapi.test_pymem_alloc0(); 1z-Xr   z-c)r   )r8   r   r   r   r   Útest_pymem_alloc0€  s    z!TestCommandLine.test_pymem_alloc0)r   r€   r   rÖ   r‚   ÚskipIfr   rÙ   rÚ   rÛ   rÞ   rà   rå   rç   rè   Ú	_testcapiré   r   r   r   r   rÑ   3  s   rÑ   zneed _testcapic               @   sz   e Zd ZdZdd„ Zdd„ Zdd„ Zd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 ) ÚTestCAPIi@  c             C   s>   t  ¡ r|  d¡ d| _d| _t| jƒd | _t| jƒ| _d S )Nz+tracemalloc must be stopped before the testr&   r<   r   )	r   r5   r6   rX   r    r"   rH   ÚidÚptr)r8   r   r   r   r9   Œ  s    
zTestCAPI.setUpc             C   s   t  ¡  d S )N)r   r:   )r8   r   r   r   r;   ˜  s    zTestCAPI.tearDownc             C   s*   t  | j| j¡}|d k	r"t |¡S d S d S )N)rë   Ztracemalloc_get_tracebackrX   rî   r   r   )r8   r   r   r   r   Úget_traceback›  s    
zTestCAPI.get_tracebackFr   c             C   s$   t |dƒ}t | j| j| j|¡ |S )Nr#   )r   rë   Ztracemalloc_trackrX   rî   r    )r8   Úrelease_gilr   r   r   r   r   Útrack¢  s    
zTestCAPI.trackc             C   s   t  | j| j¡ d S )N)rë   Ztracemalloc_untrackrX   rî   )r8   r   r   r   Úuntrack¨  s    zTestCAPI.untrackc             C   s6   t  ¡ }t  d| j¡}| |g¡}tdd„ |jD ƒƒS )NTc             s   s   | ]}|j V  qd S )N)r    )r=   rU   r   r   r   ú	<genexpr>°  s    z-TestCAPI.get_traced_memory.<locals>.<genexpr>)r   rh   r–   rX   rŽ   ÚsumrT   )r8   r-   Zdomain_filterr   r   r   r`   «  s    zTestCAPI.get_traced_memoryc             C   sR   d}t  |¡ t  ¡ d }|  ||¡}|  |  ¡ t  |¡¡ |  |  ¡ | j¡ d S )Nr&   r   )r   r7   r`   rñ   rF   rï   r   r    )r8   rð   r   r    r   r   r   r   Úcheck_track²  s    

zTestCAPI.check_trackc             C   s   |   d¡ d S )NF)rõ   )r8   r   r   r   Ú
test_track¾  s    zTestCAPI.test_trackc             C   s   |   d¡ d S )NT)rõ   )r8   r   r   r   Útest_track_without_gilÁ  s    zTestCAPI.test_track_without_gilc             C   s<   d}t  |¡ |  ¡  | j|d}|  |  ¡ t  |¡¡ d S )Nr&   )r   )r   r7   rñ   rF   rï   r   )r8   r   r   r   r   r   Útest_track_already_trackedÆ  s    

z#TestCAPI.test_track_already_trackedc             C   sj   t  ¡  |  ¡  |  |  ¡ ¡ |  |  ¡ | j¡ |  ¡  |  	|  ¡ ¡ |  |  ¡ d¡ |  ¡  |  ¡  d S )Nr   )
r   r7   rñ   rb   rï   rF   r`   r    rò   rc   )r8   r   r   r   Útest_untrackÓ  s    zTestCAPI.test_untrackc          	   C   s@   t  ¡  t  ¡  |  t¡ |  ¡  W d Q R X |  |  ¡ ¡ d S )N)r   r7   r:   rL   rn   rñ   rc   rï   )r8   r   r   r   Útest_stop_trackã  s
    zTestCAPI.test_stop_trackc          	   C   s:   t  ¡  |  ¡  t  ¡  |  t¡ |  ¡  W d Q R X d S )N)r   r7   rñ   r:   rL   rn   rò   )r8   r   r   r   Útest_stop_untrackë  s
    zTestCAPI.test_stop_untrackN)Fr   )r   r€   r   r¸   r9   r;   rï   rñ   rò   r`   rõ   rö   r÷   rø   rù   rú   rû   r   r   r   r   rì   ˆ  s   
rì   c               C   s   t  ttttt¡ d S )N)r   Zrun_unittestr4   r„   r¹   rÑ   rì   r   r   r   r   Ú	test_mainô  s    rü   Ú__main__)!r…   rw   r	   r   r‚   Zunittest.mockr   Ztest.support.script_helperr   r   r   Ztestr   rë   ÚImportErrorÚ	getsizeofr   r   r"   r/   r   r1   r2   r3   ZTestCaser4   r„   r¹   rÑ   rê   rì   rü   r   r   r   r   r   Ú<module>   s@   

! V  7 TU
k	
