a
    äzezœ  ã                   @   sP  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 zd dlZW n eyv   dZY n0 e 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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G dd„ dejƒZe edu d¡G d d!„ d!ejƒƒZ e!d"krLe "¡  dS )#é    N)Úpatch)Úassert_python_okÚassert_python_failureÚ interpreter_requires_environment)Úsupportó    )éÿÿÿÿi   @c                 C   sZ   g }t  d¡}t| ƒD ]:}|j}|j| }| |j|f¡ d}|j}|d u r qRq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.9/test/test_tracemalloc.pyÚ
get_frames   s    

r   c                 C   s<   t  ¡ }| t }t|dƒ}d| }|t  |tt|ƒ|ƒ¡fS )Nr	   ó   x)ÚtracemallocÚget_traceback_limitÚEMPTY_STRING_SIZEr   Ú	TracebackÚminÚlen)Úsizer   Z	bytes_lenr   Údatar   r   r   Úallocate_bytes"   s
    
r%   c                  C   s4   d} g d¢}t  || ¡}g d¢}t  || ¡}||fS )Né   )©r   é
   )©úa.pyr&   ©úb.pyé   é   r'   r'   ©r	   r&   ©©r*   é   r+   r.   ©r&   éB   )©r,   r	   r	   ©r.   é   ©©ú	<unknown>r   r	   )r'   r'   r'   )r&   r&   r0   r.   )r&   éˆ  r0   r.   )r-   é  )©úc.pyéB  r	   )r   ÚSnapshot)Útraceback_limitÚ
raw_tracesÚsnapshotZraw_traces2Ú	snapshot2r   r   r   Úcreate_snapshots)   s    
rE   c                 C   s   t  | |f¡S ©N)r   Z_Frame©Úfilenamer   r   r   r   r   J   s    r   c                  G   s
   t  | ¡S rF   )r   r    )r   r   r   r   Ú	tracebackM   s    rI   c                 C   s   t | |fƒS rF   )rI   rG   r   r   r   Útraceback_linenoP   s    rJ   c                 C   s
   t | dƒS ©Nr   )rJ   )rH   r   r   r   Útraceback_filenameS   s    rL   c                   @   s   e Zd Zdd„ ZdS )ÚTestTracebackc                 C   sn   t dœdd„}|  |dƒd¡ |  |ddƒd¡ d}d	}|  ||ƒd
|› d¡ |  ||dƒd
|› d¡ d S )N)Úreturnc                  W   s   t tj| Ž ƒS rF   )Úreprr   r    )Úargsr   r   r   Úget_reprY   s    z)TestTraceback.test_repr.<locals>.get_reprr   z<Traceback ()>r   z<Traceback () total_nframe=0>))Úf1r	   )Úf2r&   z@(<Frame filename='f2' lineno=2>, <Frame filename='f1' lineno=1>)z<Traceback ú>r&   z total_nframe=2>)ÚstrÚassertEqual)ÚselfrQ   r   Zexp_repr_framesr   r   r   Ú	test_reprX   s    ÿ

ÿ
ÿzTestTraceback.test_reprN)Ú__name__Ú
__module__Ú__qualname__rX   r   r   r   r   rM   W   s   rM   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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 )Nú+tracemalloc must be stopped before the testr	   )r   Ú
is_tracingÚskipTestÚstart©rW   r   r   r   ÚsetUpk   s    
zTestTracemallocEnabled.setUpc                 C   s   t  ¡  d S rF   ©r   Ústopra   r   r   r   ÚtearDownq   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>u   r   zFTestTracemallocEnabled.test_get_tracemalloc_memory.<locals>.<listcomp>iè  r   )r   r   Zget_tracemalloc_memoryÚassertGreaterEqualÚclear_tracesÚassertLessEqual)rW   r$   r#   Úsize2r   r   r   Útest_get_tracemalloc_memoryt   s    z2TestTracemallocEnabled.test_get_tracemalloc_memoryc                 C   s2   t  ¡  d}t|ƒ\}}t  |¡}|  ||¡ d S ©Né90  )r   rl   r%   Úget_object_tracebackrV   ©rW   Úobj_sizeÚobjÚobj_tracebackrI   r   r   r   Útest_get_object_traceback~   s
    
z0TestTracemallocEnabled.test_get_object_tracebackc                 C   sh   t  ¡  t ¡  g }d }g }t  ¡ }t|dƒ}t  |tt|ƒ|ƒ¡}t  	|¡}|  
|¡ |  ||¡ d S )Néýÿÿÿ)r   rl   r   Ú
gc_collectr   r   r    r!   r"   rr   ÚassertIsNotNonerV   )rW   ru   r   r   rv   rI   r   r   r   Útest_new_reference…   s    


z)TestTracemallocEnabled.test_new_referencec                 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   rd   ÚassertRaisesÚ
ValueErrorr`   r%   rr   rV   r"   )rW   rt   Úobj2Úobj2_tracebackrI   ru   rv   r   r   r   Útest_set_traceback_limit™   s    



z/TestTracemallocEnabled.test_set_traceback_limitc                 C   s.   |D ]}|d |j kr|  S q|  d¡ d S )Nr&   ztrace not found)Ú_framesÚfail)rW   ÚtracesrI   Útracer   r   r   Ú
find_trace­   s    
z!TestTracemallocEnabled.find_tracec           
      C   sz   t  ¡  d}t|ƒ\}}t  ¡ }|  ||¡}|  |t¡ |\}}}}	|  ||¡ |  ||j¡ t  	¡  |  t  ¡ g ¡ d S rp   )
r   rl   r%   Ú_get_tracesr…   ZassertIsInstancer   rV   r   rd   )
rW   rt   ru   rv   rƒ   r„   Údomainr#   rI   Úlengthr   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 rF   rg   ©r#   r   r   r   Úallocate_bytes2Æ   s    zPTestTracemallocEnabled.test_get_traces_intern_traceback.<locals>.allocate_bytes2c                    s   ˆ | ƒS rF   r   rŠ   )r‹   r   r   Úallocate_bytes3È   s    zPTestTracemallocEnabled.test_get_traces_intern_traceback.<locals>.allocate_bytes3c                    s   ˆ | ƒS rF   r   rŠ   )rŒ   r   r   Úallocate_bytes4Ê   s    zPTestTracemallocEnabled.test_get_traces_intern_traceback.<locals>.allocate_bytes4r-   rf   )	r   rd   r`   r†   r   Úreversedr   r…   ZassertIs)rW   r   rt   Zobj1Zobj1_tracebackr~   r   rƒ   Ztrace1Ztrace2Zdomain1Úsize1Z
traceback1Zlength1Zdomain2rn   Ú
traceback2Zlength2r   )r‹   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 )Né   é   )r   r   )	r   rl   r%   Úget_traced_memoryrk   rm   Ú
assertLessrV   rd   )	rW   Z	max_errorrt   ru   rv   r#   Z	peak_sizern   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 )Nrf   )r%   r   rr   rz   rl   ÚassertIsNone)rW   ru   rv   rI   r   r   r   r   Útest_clear_traces  s    


z(TestTracemallocEnabled.test_clear_tracesc                 C   s˜   t  ¡  tttdƒƒƒ}t  ¡ \}}t  ¡  t  ¡ \}}|  ||¡ |  ||¡ d}t	|ƒ\}}t  ¡ \}	}
|  |
|	¡ |  
|
|¡ |  |
| |¡ d S )Ni † r“   )r   rl   ÚsumÚlistr   r”   Z
reset_peakrk   r•   r%   ÚassertGreater)rW   Z	large_sumr   Zpeak1rn   Zpeak2rt   ru   rv   Zsize3Zpeak3r   r   r   Útest_reset_peak  s    z&TestTracemallocEnabled.test_reset_peakc                 C   s0   t  ¡  |  t  ¡ ¡ t  ¡  |  t  ¡ ¡ d S rF   )r   rd   ÚassertFalser^   r`   Ú
assertTruera   r   r   r   Útest_is_tracing$  s    z&TestTracemallocEnabled.test_is_tracingc                 C   s´   t dƒ\}}t ¡ }|  |jd jjd¡ | tj	¡ |  
tjtj	¡ tj tj	¡}|  |j|j¡ t ¡  |  t¡}t ¡  W d   ƒ n1 s”0    Y  |  t|jƒd¡ d S )Nrf   r	   r(   zLthe tracemalloc module must be tracing memory allocations to take a snapshot)r%   r   Útake_snapshotr›   rƒ   rI   Útotal_nframeÚdumpr   ÚTESTFNÚ
addCleanupÚunlinkr@   ÚloadrV   rd   r|   ÚRuntimeErrorrU   Ú	exception)rW   ru   ÚsourcerC   rD   Ú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   r    Z	test_attrr¢   r   r£   r¤   r¥   r@   r¦   rV   )rW   rC   rD   r   r   r   Útest_snapshot_save_attrD  s    z.TestTracemallocEnabled.test_snapshot_save_attrc                 C   s6   t  ¡ sdS d}t|ƒ\}}t  |¡}|d u r2dS dS )Nr&   rq   r.   r   )r   r^   r%   rr   rs   r   r   r   Ú
fork_childO  s    
z!TestTracemallocEnabled.fork_childÚforkzneed os.fork()c              	   C   sH   t  ¡ }|s6d}z|  ¡ }W t  |¡ qDt  |¡ 0 ntj|dd d S )Nr	   r   )Úexitcode)Úosr¯   r®   Ú_exitr   Zwait_process)rW   Úpidr°   r   r   r   Ú	test_fork\  s    
z TestTracemallocEnabled.test_forkN)rY   rZ   r[   rb   re   ro   rw   r{   r€   r…   r‰   r‘   r–   r˜   rœ   rŸ   r«   r­   r®   ÚunittestZ
skipUnlessÚhasattrr±   r´   r   r   r   r   r\   j   s$   
$	r\   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¡ |  |jjd
¡ |  t	|jƒd¡ |  |jd	 jd¡ |  |jd	 jd¡ W d   ƒ n1 sð0    Y  d S )N)r   r2   )r)   r(   r^   T)Zreturn_valuer   r2   r†   r	   r   r(   r*   r&   )Ú
contextlibÚ	ExitStackÚenter_contextr   Úobjectr   r    rV   rA   r"   rƒ   r#   rI   r¡   rH   r   )rW   rB   ÚstackrC   r„   r   r   r   Útest_create_snapshotn  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g d¢¡ |  |jj|¡ | ||f¡}|  |jjg d¢¡ | d	¡}	|  |	|¡ |  |	j|j¡ |  |	j|j¡ |  	t
|j|¡ d S )
NFr,   Tr*   r&   r2   )r'   r'   r'   r/   r6   )r'   r'   r'   r/   r   )rE   r   ÚFilterrš   rƒ   Ú_tracesÚfilter_tracesrV   ZassertIsNotr|   Ú	TypeError)
rW   rC   rD   Úfilter1Úfilter2Zfilter3Úoriginal_tracesÚ	snapshot3Z	snapshot4Z	snapshot5r   r   r   Útest_filter_tracesƒ  s    
	
zTestSnapshot.test_filter_tracesc                 C   sz   t ƒ \}}tjdddd}tjdddd}t|jjƒ}| |f¡}|  |jjg d¢¡ | |f¡}|  |jjg d¢¡ d S )NFr*   r	   ©r‡   T)r'   r'   r'   r3   r6   )rE   r   r¾   rš   rƒ   r¿   rÀ   rV   )rW   rC   rD   rÂ   rÃ   rÄ   rÅ   r   r   r   Útest_filter_traces_domain©  s    
	z&TestSnapshot.test_filter_traces_domainc                 C   sh   t ƒ \}}tjddd}tjddd}| |f¡}|  |jjg d¢¡ | |f¡}|  |jjdg¡ d S )NFr.   rÇ   T)r'   r'   r'   r/   r3   r6   )rE   r   ÚDomainFilterrÀ   rV   rƒ   r¿   )rW   rC   rD   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 )Nr:   r   r*   r&   r2   r,   r	   r>   r?   r   r4   é   r.   r7   éŠ  r<   r;   é¾ÿÿÿr   éùÿÿÿ)rE   rJ   Ú
statisticsrV   r   Ú	StatisticÚ
compare_toÚStatisticDiff)rW   rC   rD   Útb_0Útb_a_2Útb_a_5Útb_b_1Ztb_c_578Ústats1Ústats2rÏ   r   r   r   Útest_snapshot_group_by_lineÙ  s6    






ü
ýû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 )Nr:   r*   r,   r>   rH   r4   r	   é    r-   r7   i¨  r2   r<   r;   r   rÍ   r   rÎ   )rE   rL   rÏ   rV   r   rÐ   rÑ   rÒ   )
rW   rC   rD   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 )Nr)   r+   r1   r5   r9   rI   r4   r	   rË   r.   r7   r&   r=   rÌ   r<   r;   r   rÍ   r   rÎ   T)Z
cumulative)
rE   rI   rÏ   rV   r   rÐ   rÑ   rÒ   r|   r}   )rW   rC   rD   Ztb1Ztb2Ztb3Ztb4r×   Ztb5rØ   rÝ   r   r   r   Ú test_snapshot_group_by_traceback  s<    



ü
ýûÿ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 )Nr:   r*   r,   r&   r2   r	   r-   rH   Téb   rÚ   r7   r   r4   rË   r.   )rE   rL   rJ   rÏ   rV   r   rÐ   )rW   rC   rD   rÓ   rÛ   rÜ   rÔ   rÕ   rÖ   Ztb_b_4Ústatsr   r   r   Ú!test_snapshot_group_by_cumulativeA  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)rE   rƒ   rV   rU   rI   )rW   rC   rD   r„   rI   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)rE   rÏ   rV   rU   ©rW   rC   rD   rá   Ústatr   r   r   Útest_statistic_formatf  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)rE   rÑ   rV   rU   rä   r   r   r   Útest_statistic_diff_formatm  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	   )rE   rV   rƒ   rI   )rW   rC   rD   rI   r   r   r   Útest_slicest  s    
ÿÿzTestSnapshot.test_slicesc                 C   sâ   t ƒ \}}dd„ }tjjd|d¬ |jd j}|  | ¡ g d¢¡ |  |jddd	d
g¡ |  |jddddg¡ |  |jddg d¢¡ |  |jdddd	d
g¡ |  |jdddddg¡ W d   ƒ n1 sÔ0    Y  d S )Nc                 S   s   d| |f S )Nz
  <%s, %s>r   rG   r   r   r   Úgetline  s    z3TestSnapshot.test_format_traceback.<locals>.getlineztracemalloc.linecache.getline)Zside_effectr   )ú  File "b.py", line 4ú    <b.py, 4>ú  File "a.py", line 2ú    <a.py, 2>r	   )Úlimitrì   rí   r   rê   rë   T)Úmost_recent_first)rì   rí   rê   rë   )rî   rï   )rE   rµ   Zmockr   rƒ   rI   rV   Úformat)rW   rC   rD   ré   Útbr   r   r   Útest_format_traceback}  s@    
ÿ
ÿÿÿÿÿÿÿÿÿÿz"TestSnapshot.test_format_tracebackN)rY   rZ   r[   ÚmaxDiffr½   rÆ   rÈ   rÊ   rÙ   rÞ   rß   râ   rã   ræ   rç   rè   rò   r   r   r   r   r·   k  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 )ÚTestFiltersr’   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.pyrf   )Ú	inclusiveÚfilename_patternr   Ú
all_framesr÷   )r   r¾   rV   rö   r÷   r—   r   rø   r|   ÚAttributeErrorÚsetattr©rW   Úfr   r   r   Útest_filter_attributes¤  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   r2   r(   Ú12356F)r   r¾   rž   Ú_match_framer   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 rK   ©r   r¾   rÿ   )rö   rH   Úpatternrü   r   r   r   Úfnmatchò  s    z7TestFilters.test_filter_match_filename.<locals>.fnmatchTrõ   rþ   r:   F)rž   r   ©rW   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  )rH   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.pycr*   Ú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)r   rž   r±   Únamer  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)r)   )r,   r.   )r+   )r,   r2   ))r>   r2   r9   r8   Tr,   )rø   Fr:   )r   r¾   rž   Z_match_tracebackr   )rW   Út1Út2Zt3Úunknownrü   r   r   r   Útest_filter_match_traceC  sN    z#TestFilters.test_filter_match_traceN)	rY   rZ   r[   ró   rý   r   r  r  r  r   r   r   r   rô   ¡  s   4Erô   c                   @   s‚   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dd„ Ze edu d¡dd„ ƒZdS )ÚTestCommandLinec                 C   s,   d}t d|ƒ\}}}| ¡ }|  |d¡ d S )Nú3import tracemalloc; print(tracemalloc.is_tracing())ú-có   False©r   ÚrstriprV   ©rW   r   ÚokÚstdoutÚstderrr   r   r   Ú test_env_var_disabled_by_defaultu  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 )zAPYTHON* environment variables must be ignored when -E is present.r  z-Er  Ú1©ZPYTHONTRACEMALLOCr  Nr  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 )Nr  r  Ú0r  r  r  r  r   r   r   Útest_env_var_disabled…  s    z%TestCommandLine.test_env_var_disabledc                 C   s0   d}t d|dd\}}}| ¡ }|  |d¡ d S )Nr  r  r  r  s   Truer  r  r   r   r   Útest_env_var_enabled_at_startupŒ  s    z/TestCommandLine.test_env_var_enabled_at_startupc                 C   s0   d}t d|dd\}}}| ¡ }|  |d¡ d S )Nú<import tracemalloc; print(tracemalloc.get_traceback_limit())r  Z10r  s   10r  r  r   r   r   Útest_env_limit“  s    zTestCommandLine.test_env_limitc                 C   sl   t  ¡ ( tddt|ƒd\}}}W d   ƒ n1 s60    Y  d|v rLd S d|v rXd S |  d|›¡ d S )Nr  Úpassr  ó1   ValueError: the number of frames must be in ranges+   PYTHONTRACEMALLOC: invalid number of framesúunexpected output: )r   ÚSuppressCrashReportr   rU   r‚   )rW   r   r  r  r  r   r   r   Úcheck_env_var_invalidš  s    
þ*z%TestCommandLine.check_env_var_invalidc              	   C   sD   t D ]:}| j|d |  |¡ W d   ƒ q1 s40    Y  qd S ©N©r   )ÚINVALID_NFRAMEÚsubTestr(  ©rW   r   r   r   r   Útest_env_var_invalid§  s    z$TestCommandLine.test_env_var_invalidc              	   C   sv   dD ]l\}}| j ||dF d}td|d|ƒ\}}}| ¡ }|  |t|ƒ d¡¡ W d   ƒ q1 sf0    Y  qd S )N))r   r	   )ztracemalloc=1r	   )ztracemalloc=15é   )Úxoptionsr   r"  ú-Xr  Úascii)r,  r   r  rV   rU   Úencode)rW   r0  r   r   r  r  r  r   r   r   Útest_sys_xoptions¬  s    z!TestCommandLine.test_sys_xoptionsc                 C   sr   dd| ddf}t  ¡  t|Ž \}}}W d   ƒ n1 s<0    Y  d|v rRd S d|v r^d S |  d|›¡ d S )Nr1  ztracemalloc=%sr  r$  r%  s/   -X tracemalloc=NFRAME: invalid number of framesr&  )r   r'  r   r‚   )rW   r   rP   r  r  r  r   r   r   Úcheck_sys_xoptions_invalid¸  s    
,z*TestCommandLine.check_sys_xoptions_invalidc              	   C   sD   t D ]:}| j|d |  |¡ W d   ƒ q1 s40    Y  qd S r)  )r+  r,  r5  r-  r   r   r   Útest_sys_xoptions_invalidÃ  s    z)TestCommandLine.test_sys_xoptions_invalidNúneed _testcapic                 C   s   d}t ddd|ƒ d S )Nz2import _testcapi; _testcapi.test_pymem_alloc0(); 1r1  r   r  )r   )rW   r   r   r   r   Útest_pymem_alloc0È  s    z!TestCommandLine.test_pymem_alloc0)rY   rZ   r[   r  rµ   ÚskipIfr   r  r   r!  r#  r(  r.  r4  r5  r6  Ú	_testcapir8  r   r   r   r   r  t  s   ÿ
r  r7  c                   @   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 )Nr]   r2   rf   r   )	r   r^   r_   r‡   r#   r%   ru   ÚidÚptrra   r   r   r   rb   Ô  s    
zTestCAPI.setUpc                 C   s   t  ¡  d S rF   rc   ra   r   r   r   re   à  s    zTestCAPI.tearDownc                 C   s*   t  | j| j¡}|d ur"t |¡S d S d S rF   )r:  Ztracemalloc_get_tracebackr‡   r=  r   r    )rW   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_trackr‡   r=  r#   )rW   Úrelease_gilr   r   r   r   r   Útrackê  s
    
ÿzTestCAPI.trackc                 C   s   t  | j| j¡ d S rF   )r:  Ztracemalloc_untrackr‡   r=  ra   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 rF   rŠ   )rh   r„   r   r   r   Ú	<genexpr>ø  r   z-TestCAPI.get_traced_memory.<locals>.<genexpr>)r   r    rÉ   r‡   rÀ   r™   rƒ   )rW   rC   Zdomain_filterr   r   r   r”   ó  s    zTestCAPI.get_traced_memoryc                 C   sR   d}t  |¡ t  ¡ d }|  ||¡}|  |  ¡ t  |¡¡ |  |  ¡ | j¡ d S )Nr2   r   )r   r`   r”   r@  rV   r>  r    r#   )rW   r?  r   r#   r   r   r   r   Úcheck_trackú  s    

ÿzTestCAPI.check_trackc                 C   s   |   d¡ d S )NF©rC  ra   r   r   r   Ú
test_track  s    zTestCAPI.test_trackc                 C   s   |   d¡ d S )NTrD  ra   r   r   r   Útest_track_without_gil	  s    zTestCAPI.test_track_without_gilc                 C   s<   d}t  |¡ |  ¡  | j|d}|  |  ¡ t  |¡¡ d S )Nr2   r*  )r   r`   r@  rV   r>  r    )rW   r   r   r   r   r   Útest_track_already_tracked  s    

ÿz#TestCAPI.test_track_already_trackedc                 C   sj   t  ¡  |  ¡  |  |  ¡ ¡ |  |  ¡ | j¡ |  ¡  |  	|  ¡ ¡ |  |  ¡ d¡ |  ¡  |  ¡  d S rK   )
r   r`   r@  rz   r>  rV   r”   r#   rA  r—   ra   r   r   r   Útest_untrack  s    zTestCAPI.test_untrackc                 C   sT   t  ¡  t  ¡  |  t¡ |  ¡  W d   ƒ n1 s80    Y  |  |  ¡ ¡ d S rF   )r   r`   rd   r|   r§   r@  r—   r>  ra   r   r   r   Útest_stop_track+  s
    &zTestCAPI.test_stop_trackc                 C   sN   t  ¡  |  ¡  t  ¡  |  t¡ |  ¡  W d   ƒ n1 s@0    Y  d S rF   )r   r`   r@  rd   r|   r§   rA  ra   r   r   r   Útest_stop_untrack3  s
    zTestCAPI.test_stop_untrackN)Fr	   )rY   rZ   r[   ró   rb   re   r>  r@  rA  r”   rC  rE  rF  rG  rH  rI  rJ  r   r   r   r   r;  Ð  s   
r;  Ú__main__)#r¸   r±   r
   r   rµ   Zunittest.mockr   Ztest.support.script_helperr   r   r   Útestr   r:  ÚImportErrorÚ	getsizeofr   r+  r   r%   rE   r   rI   rJ   rL   ZTestCaserM   r\   r·   rô   r  r9  r;  rY   Úmainr   r   r   r   Ú<module>   sD   

!    8 T\k
