o
    ˆ¶¹aôŠ  ã                   @   s~  d 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Zddl	Z	ddl
Z
ddlZddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlm Z  ddlm!Z! ddlm"Z" ddlm#Z# ddlm$Z$ ddlm%Z% ddlm&Z& ddlm'Z' ddlm(Z( ddlm)Z) ddlm*Z* dd lm+Z+ dd!lm,Z, dd"lm-Z- dd#lm.Z. G d$d%„ d%e)ƒZ/G d&d'„ d'e)ƒZ0G d(d)„ d)e)ƒZ1G d*d+„ d+e)ƒZ2G d,d-„ d-e)ƒZ3G d.d/„ d/e)ƒZ4G d0d1„ d1e)ƒZ5e6d2k�r=dd3l7m8Z8 e8e9ƒ dS dS )4zTests for system APIS.é    N)ÚAIX)ÚBSD)ÚFREEBSD)ÚLINUX)ÚMACOS)ÚNETBSD)ÚOPENBSD)ÚPOSIX)ÚSUNOS)ÚWINDOWS)ÚFileNotFoundError)Úlong)ÚASCII_FS)Ú
CI_TESTING)ÚDEVNULL)ÚGITHUB_ACTIONS)ÚGLOBAL_TIMEOUT)ÚHAS_BATTERY)ÚHAS_CPU_FREQ)ÚHAS_GETLOADAVG)ÚHAS_NET_IO_COUNTERS)ÚHAS_SENSORS_BATTERY)ÚHAS_SENSORS_FANS)ÚHAS_SENSORS_TEMPERATURES)ÚIS_64BIT)ÚPYPY)ÚUNICODE_SUFFIX)ÚPsutilTestCase)Úcheck_net_address)Úenum)Úmock)Úretry_on_failure)Úunittestc                   @   s\   e Zd Zdd„ Zdd„ Ze eoed¡dd„ ƒZ	e eoed¡dd	„ ƒZ
d
d„ Zdd„ ZdS )ÚTestProcessAPIsc              	   C   sL  |   t ¡ dd„ t ¡ D ƒ¡ |  ¡ }|   |jdd„ t ¡ D ƒ¡ t |j¡}| ¡  | 	¡  |  
|jdd„ t ¡ D ƒ¡ tjdt t ¡ ¡d�� |  tt ¡ ƒg ¡ W d   ƒ n1 s^w   Y  tjdt t ¡ ¡d��- |  tj¡� tt ¡ ƒ W d   ƒ n1 s‡w   Y  W d   ƒ d S W d   ƒ d S 1 sŸw   Y  d S )Nc                 S   ó   g | ]}|j ‘qS © ©Úpid©Ú.0Úxr%   r%   ú:/usr/lib/python3/dist-packages/psutil/tests/test_system.pyÚ
<listcomp>@   ó    z5TestProcessAPIs.test_process_iter.<locals>.<listcomp>c                 S   r$   r%   r&   r(   r%   r%   r+   r,   B   r-   c                 S   r$   r%   r&   r(   r%   r%   r+   r,   F   r-   zpsutil.Process©Úside_effect)ÚassertInÚosÚgetpidÚpsutilÚprocess_iterÚspawn_testprocr'   ÚProcessÚkillÚwaitÚassertNotInr    ÚpatchÚNoSuchProcessÚassertEqualÚlistÚAccessDeniedÚassertRaises©ÚselfÚsprocÚpr%   r%   r+   Útest_process_iter?   s*   ÿþÿÿþ"þz!TestProcessAPIs.test_process_iterc                 C   sh  t jdgd�D ]}|  t|j ¡ ƒdg¡ q|  t¡� tt jdgd�ƒ W d   ƒ n1 s/w   Y  tj	dt  
dd¡d��)}t jddgd�D ]}|  |jd ¡ |  |jd d¡ qH|jsaJ ‚W d   ƒ n1 skw   Y  tj	dt  
dd¡d��/}tƒ }t jddg|d	�D ]}|  |jd |¡ |  |jd d¡ qˆ|js¢J ‚W d   ƒ d S 1 s­w   Y  d S )
Nr'   )ÚattrsÚfooz$psutil._psplatform.Process.cpu_timesr   Ú r.   Ú	cpu_times)rE   Úad_value)r3   r4   r<   r=   ÚinfoÚkeysr?   Ú
ValueErrorr    r:   r>   ÚassertIsNoneÚassertGreaterEqualÚcalledÚobjectÚassertIs)rA   rC   ÚmÚflagr%   r%   r+   Útest_prcess_iter_w_attrsP   s4   ÿ
ÿû
ÿ
ÿ"ùz(TestProcessAPIs.test_prcess_iter_w_attrsz-spawn_testproc() unreliable on PYPY + WINDOWSc                    sà  ‡ fdd„}g ‰ ˆ  ¡ }ˆ  ¡ }ˆ  ¡ }dd„ |||fD ƒ}ˆjttj|dd� ˆjttj|dd� t ¡ }tj|d	|d
�\}}ˆ t ¡ | d¡ ˆ |g ¡ ˆ t	|ƒd¡ ˆ ˆ g ¡ |D ]
}	ˆ 
t|	dƒ¡ q`tdƒ‡fdd„ƒ}
| ¡  |
||ƒ\}}ˆ |jdd„ |D ƒ¡ tršˆ | ¡ jtj ¡ n	ˆ | ¡ jd¡ ˆ ˆ |jg¡ |D ]
}	ˆ 
t|	dƒ¡ q­tdƒ‡fdd„ƒ}
| ¡  | ¡  |
||ƒ\}}ˆ tˆ ƒt|j|j|jgƒ¡ |D ]
}	ˆ t|	dƒ¡ qãd S )Nc                    s   ˆ   | j¡ d S ©N)Úappendr'   )rC   )Úpidsr%   r+   Úcallbackg   s   z1TestProcessAPIs.test_wait_procs.<locals>.callbackc                 S   ó   g | ]}t  |j¡‘qS r%   ©r3   r6   r'   r(   r%   r%   r+   r,   n   ó    z3TestProcessAPIs.test_wait_procs.<locals>.<listcomp>éÿÿÿÿ)Útimeouté   )rX   g{®Gáz„?©r]   rX   g      à?é   Ú
returncodeé   c                    ó<   t j| d|d�\}}ˆ  t|ƒd¡ ˆ  t|ƒd¡ ||fS )Nç¸…ëQ¸ž?r_   r^   é   ©r3   Ú
wait_procsr<   Úlen©ÚprocsrX   ÚgoneÚalive©rA   r%   r+   Útest{   ó   
ÿz-TestProcessAPIs.test_wait_procs.<locals>.testc                 S   r$   r%   r&   r(   r%   r%   r+   r,   …   r-   c                    rc   )Nrd   r_   r`   r   rf   ri   rm   r%   r+   rn   Ž   ro   )r5   r?   rL   r3   rg   Ú	TypeErrorÚtimeÚ
assertLessr<   rh   ÚassertFalseÚhasattrr!   Ú	terminater0   r'   r	   Úpopra   ÚsignalÚSIGTERMÚsetÚ
assertTrue)rA   rX   Úsproc1Úsproc2Úsproc3rj   Útrk   rl   rC   rn   r%   )rW   rA   r+   Útest_wait_procsd   sH    ÿzTestProcessAPIs.test_wait_procsc                 C   sP   |   ¡ }|   ¡ }|   ¡ }dd„ |||fD ƒ}|D ]}| ¡  qt |¡\}}d S )Nc                 S   rY   r%   rZ   r(   r%   r%   r+   r,   £   r[   z>TestProcessAPIs.test_wait_procs_no_timeout.<locals>.<listcomp>)r5   ru   r3   rg   )rA   r{   r|   r}   rj   rC   rk   rl   r%   r%   r+   Útest_wait_procs_no_timeout�   s   
z*TestProcessAPIs.test_wait_procs_no_timeoutc                 C   sv   |   ¡ }|  t |j¡¡ t |j¡}| ¡  | ¡  |  t |j¡¡ |  t d¡¡ |  	t d¡dt 
¡ v ¡ d S )Nr\   r   )r5   rz   r3   Ú
pid_existsr'   r6   r7   r8   rs   r<   rW   r@   r%   r%   r+   Útest_pid_exists¨   s   zTestProcessAPIs.test_pid_existsc              	   C   s’   t  ¡ }|D ]$}z	t  |¡sJ ‚W q ty*   t d¡ |t  ¡ v r(|  |¡ Y qw tt|ƒd t|ƒd ƒ}|D ]}| j	t  |¡|d� q:d S )Ngš™™™™™¹?iˆ  ip  ©Úmsg)
r3   rW   r�   ÚAssertionErrorrq   ÚsleepÚfailÚrangeÚmaxrs   )rA   rW   r'   r%   r%   r+   Útest_pid_exists_2²   s   

€ûÿz!TestProcessAPIs.test_pid_exists_2N)Ú__name__Ú
__module__Ú__qualname__rD   rT   r"   ÚskipIfr   r   r   r€   r‚   rŠ   r%   r%   r%   r+   r#   =   s    
ÿ

7ÿ
	
r#   c                   @   sB   e Zd Zdd„ Ze eoe ¡  d¡dd„ ƒZ	dd„ Z
dd	„ Zd
S )ÚTestMiscAPIsc                 C   s4   t  ¡ }|  |t¡ |  |d¡ |  |t ¡ ¡ d S ©Nr   )r3   Ú	boot_timeÚassertIsInstanceÚfloatÚassertGreaterrr   rq   )rA   Úbtr%   r%   r+   Útest_boot_timeÄ   s   zTestMiscAPIs.test_boot_timeúunreliable on CIc                 C   sÂ   t  ¡ }|  |g ¡ |D ]R}|jsJ |ƒ‚|  |jt¡ |  |jttd ƒf¡ |jd ur7|  |jttd ƒf¡ |j |j |j	dksFJ |ƒ‚t
j
 |j	¡ tsQtrX|  |j¡ qt  |j¡ qd S )Nç        )r3   ÚusersÚassertNotEqualÚnamer’   ÚstrÚterminalÚtypeÚhostÚstartedÚdatetimeÚfromtimestampr   r   rM   r'   r6   )rA   r™   Úuserr%   r%   r+   Ú
test_usersÊ   s    
ózTestMiscAPIs.test_usersc                 C   s*   t j}tt _z
t ¡  W |t _d S |t _w rU   )ÚsysÚstdoutr   r3   rn   )rA   r¦   r%   r%   r+   Ú	test_testÝ   s
   
zTestMiscAPIs.test_testc                 C   sl  g d¢}|D ]}| j tt|ƒt|d� qtjdkr•tjsJ ‚tjr#J ‚| d¡ dt	j
 ¡ v r:tjs4J ‚| d¡ njdt	j
 ¡ v rjtjsFJ ‚|  tjtjtjg d¡d	¡ | d
¡ | d¡ | d¡ | d¡ n:dt	j
 ¡ v sxdt	j
 ¡ v rƒtjs}J ‚| d¡ n!dt	j
 ¡ v r”tjs�J ‚| d¡ ntjsšJ ‚tjrŸJ ‚| d¡ |D ]}| jtt|ƒd|d� q¦d S )N)	r	   r   r   r   r   r   r   r   r
   rƒ   Úposixr	   Úlinuxr   ÚbsdTr^   r   r   r   r   ÚsunosÚsolarisr
   Údarwinr   r   F)r’   Úgetattrr3   Úboolr1   r›   r	   r   Úremover¥   ÚplatformÚlowerr   r   r<   r   r   r   Úcountr
   r   rQ   )rA   Únamesr›   r%   r%   r+   Útest_os_constantsæ   sF   





ÿÿ





€


ÿzTestMiscAPIs.test_os_constantsN)r‹   rŒ   r�   r–   r"   rŽ   r   r3   r™   r¤   r§   rµ   r%   r%   r%   r+   r�   Â   s    
	r�   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚTestMemoryAPIsc                 C   sì   t  ¡ }|jdksJ |ƒ‚|jdksJ |ƒ‚d|j  kr$dks)J |ƒ‚ J |ƒ‚|jdks2J |ƒ‚|jdks;J |ƒ‚|jD ]5}t||ƒ}|dkrQ|  	|t
tf¡ |dkrs|dksb|  d||f ¡ ||jkrs|  d||j||f ¡ q>d S )Nr   éd   ÚpercentÚtotalz%r < 0 (%s)z%r > total (total=%s, %s=%s))r3   Úvirtual_memoryr¹   Ú	availabler¸   ÚusedÚfreeÚ_fieldsr®   r’   Úintr   r‡   )rA   Úmemr›   Úvaluer%   r%   r+   Útest_virtual_memory  s&   &


ÿ€øz"TestMemoryAPIs.test_virtual_memoryc                 C   s¸   t  ¡ }|  |jd¡ |jdksJ |ƒ‚|jdksJ |ƒ‚|jdkr,|jdks+J |ƒ‚n	|jdks5J |ƒ‚d|j  krCdksHJ |ƒ‚ J |ƒ‚|jdksQJ |ƒ‚|j	dksZJ |ƒ‚d S )N)r¹   r¼   r½   r¸   ÚsinÚsoutr   r·   )
r3   Úswap_memoryr<   r¾   r¹   r¼   r½   r¸   rÃ   rÄ   )rA   rÀ   r%   r%   r+   Útest_swap_memory   s   ÿ
&zTestMemoryAPIs.test_swap_memoryN)r‹   rŒ   r�   rÂ   rÆ   r%   r%   r%   r+   r¶     s    r¶   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e e d¡d d!„ ƒZe e d"¡d#d$„ ƒZd%S )&ÚTestCpuAPIsc                 C   sŒ   t  ¡ }|  |¡ |  |tt jdd�ƒ¡ |  |d¡ tj 	d¡rBt
dƒ�}| ¡ }W d   ƒ n1 s4w   Y  d|vrDt d¡‚d S d S )NT©Úpercpur^   z/proc/cpuinfozphysical idz#cpuinfo doesn't include physical id)r3   Ú	cpu_countÚassertIsNotNoner<   rh   rH   rN   r1   ÚpathÚexistsÚopenÚreadr"   ÚSkipTest)rA   ÚlogicalÚfdÚcpuinfo_datar%   r%   r+   Útest_cpu_count_logical3  s   


ÿ
üz"TestCpuAPIs.test_cpu_count_logicalc                 C   sh   t  ¡ }t jdd�}|d u r|  d¡‚tr&t ¡ d d… dkr&|  |¡ d S |  |d¡ |  ||¡ d S )NF©rÑ   zcpu_count_cores() is Nonere   )é   r^   r^   )r3   rÊ   ÚskipTestr   r¥   ÚgetwindowsversionrM   rN   )rA   rÑ   Úcoresr%   r%   r+   Útest_cpu_count_cores?  s   
z TestCpuAPIs.test_cpu_count_coresc              	   C   sž   dD ]J}t jd|d��}|  t ¡ ¡ |jsJ ‚W d   ƒ n1 s"w   Y  t jd|d��}|  tjdd�¡ |js=J ‚W d   ƒ n1 sGw   Y  qd S )N)r\   r   Nz$psutil._psplatform.cpu_count_logical©Úreturn_valuez"psutil._psplatform.cpu_count_coresFrÕ   )r    r:   rM   r3   rÊ   rO   )rA   ÚvalrR   r%   r%   r+   Útest_cpu_count_noneJ  s"   ÿýÿý€ûzTestCpuAPIs.test_cpu_count_nonec                 C   sZ   d}t  ¡ }t|ƒ |D ]}|  |t¡ |  |d¡ ||7 }q|  |t|ƒ¡ t|ƒ d S )Nr   r˜   )r3   rH   Úsumr’   r“   rN   r<   rœ   )rA   r¹   ÚtimesÚcp_timer%   r%   r+   Útest_cpu_timesV  s   
zTestCpuAPIs.test_cpu_timesc                 C   sV   t t ¡ ƒ}t ¡ t }t ¡ |k r$t t ¡ ƒ}||krd S t ¡ |k s|  d¡ d S )Nztime remained the same)rß   r3   rH   rq   r   r‡   )rA   Út1Ústop_atÚt2r%   r%   r+   Útest_cpu_times_time_increasess  s   ýz)TestCpuAPIs.test_cpu_times_time_increasesc                 C   sŒ   t jdd�D ])}d}t|ƒ |D ]}|  |t¡ |  |d¡ ||7 }q|  |t|ƒ¡ t|ƒ q|  tt jdd�d ƒtt jdd�ƒ¡ d S )NTrÈ   r   r˜   F)	r3   rH   rß   r’   r“   rN   r<   rœ   rh   )rA   rà   r¹   rá   r%   r%   r+   Útest_per_cpu_times}  s   

ÿzTestCpuAPIs.test_per_cpu_timesc                 C   s~   t jdd�}t ¡ t }	 t ¡ |kr|  d¡S t jdd�}t||ƒD ]\}}t  |¡t  |¡}}|| }|dkr= d S q#q)NTrÈ   r]   gš™™™™™©?)r3   rH   rq   r   r‡   ÚzipÚ_cpu_busy_time)rA   Útot1Ú	giveup_atÚtot2rã   rå   Ú
differencer%   r%   r+   Útest_per_cpu_times_2ž  s   
ÿùz TestCpuAPIs.test_per_cpu_times_2c                 C   sX   t  ¡ }t jdd�}| dd„ t|Ž D ƒ¡}|jD ]}| jt||ƒt||ƒdd� qd S )NTrÈ   c                 S   s   g | ]}t |ƒ‘qS r%   )rß   )r)   Únumr%   r%   r+   r,   ²  s    z9TestCpuAPIs.test_cpu_times_comparison.<locals>.<listcomp>r^   ©Údelta)r3   rH   Ú_makerè   r¾   ÚassertAlmostEqualr®   )rA   ÚbaseÚper_cpuÚsummed_valuesÚfieldr%   r%   r+   Útest_cpu_times_comparison­  s   
ÿÿz%TestCpuAPIs.test_cpu_times_comparisonc              
   C   sv   z|   |t¡ |  |d¡ |  |d¡ |  |dt ¡  ¡ W d S  ty: } ztd|t 	|¡t 	|¡f ƒ‚d }~ww )Nr˜   g       €g      Y@z
%s
last=%s
new=%s)
r’   r“   rN   ÚassertIsNotÚassertLessEqualr3   rÊ   r…   ÚpprintÚpformat)rA   r¸   Úlast_retÚnew_retÚerrr%   r%   r+   Ú_test_cpu_percent·  s   ÿ€ÿzTestCpuAPIs._test_cpu_percentc                 C   st   t jdd�}tdƒD ]}t jd d�}|  |||¡ |}q
|  t¡� t jdd� W d   ƒ d S 1 s3w   Y  d S ©Nçü©ñÒMbP?)Úintervalr·   r\   )r3   Úcpu_percentrˆ   r   r?   rL   )rA   Úlastr*   Únewr%   r%   r+   Útest_cpu_percentÁ  s   "ÿzTestCpuAPIs.test_cpu_percentc                 C   s˜   t jddd�}|  t|ƒt  ¡ ¡ tdƒD ]}t jd dd�}|D ]	}|  |||¡ q |}q|  t¡� t jddd� W d   ƒ d S 1 sEw   Y  d S )Nr  T©r  rÉ   r·   r\   )	r3   r  r<   rh   rÊ   rˆ   r   r?   rL   ©rA   r  r*   r  r¸   r%   r%   r+   Útest_per_cpu_percentÊ  s   "ÿz TestCpuAPIs.test_per_cpu_percentc                 C   s�   t jdd�}tdƒD ]}t jd d�}|D ]	}|  |||¡ q|  t|ƒ||¡ |}q
|  t¡� t jdd� W d   ƒ d S 1 sAw   Y  d S r  )r3   Úcpu_times_percentrˆ   r   rß   r?   rL   r	  r%   r%   r+   Útest_cpu_times_percentÕ  s   "ÿz"TestCpuAPIs.test_cpu_times_percentc                 C   sz   t jddd�}|  t|ƒt  ¡ ¡ tdƒD ]%}t jd dd�}|D ]}|D ]	}|  |||¡ q$|  t|ƒ||¡ q |}qd S )Nr  Tr  r·   )r3   r  r<   rh   rÊ   rˆ   r   rß   )rA   r  r*   r  Úcpur¸   r%   r%   r+   Útest_per_cpu_times_percentà  s   úz&TestCpuAPIs.test_per_cpu_times_percentc                 C   s€   t jdd� dd„ t jdd�D ƒ}tjd|d�� t jdd�D ]}|D ]	}|  |d d ¡ q#qW d   ƒ d S 1 s9w   Y  d S )NTrÈ   c                 S   s*   g | ]}|  d d„ tt|jƒƒD ƒ¡‘qS )c                 S   s   g | ]}d ‘qS )r   r%   r(   r%   r%   r+   r,   î  s    zNTestCpuAPIs.test_per_cpu_times_percent_negative.<locals>.<listcomp>.<listcomp>)rò   rˆ   rh   r¾   r(   r%   r%   r+   r,   î  s    "ÿzCTestCpuAPIs.test_per_cpu_times_percent_negative.<locals>.<listcomp>zpsutil.cpu_timesrÛ   )r3   r  rH   r    r:   r   )rA   Ú
zero_timesr  r¸   r%   r%   r+   Ú#test_per_cpu_times_percent_negativeë  s   
ÿÿÿ"ÿz/TestCpuAPIs.test_per_cpu_times_percent_negativec                 C   sT   t  ¡ }|  |jd¡ |jD ]}t||ƒ}|  |d¡ ts'|dv r'|  |d¡ qd S )N)Úctx_switchesÚ
interruptsÚsoft_interruptsÚsyscallsr   )r  r  )r3   Ú	cpu_statsr<   r¾   r®   rN   r   r”   )rA   Úinfosr›   rÁ   r%   r%   r+   Útest_cpu_statsõ  s   þ

€ûzTestCpuAPIs.test_cpu_statsznot suportedc                    sh   ‡ fdd„}t jdd�}tr|sˆ  d¡‚|sJ |ƒ‚|t jdd�gƒ tr2ˆ  t|ƒt  ¡ ¡ d S d S )Nc                    sj   | D ]0}ˆ   |jd¡ |jdkrˆ  |j|j¡ |jD ]}t||ƒ}ˆ  |ttt	f¡ ˆ  
|d¡ qqd S )N)ÚcurrentÚminr‰   r˜   r   )r<   r¾   r‰   rú   r  r®   r’   r¿   r   r“   rN   )ÚlsÚntr›   rÁ   rm   r%   r+   Úcheck_ls  s   


ýüz+TestCpuAPIs.test_cpu_freq.<locals>.check_lsTrÈ   zreturns empty list on FreeBSDF)r3   Úcpu_freqr   r×   r   r<   rh   rÊ   )rA   r  r  r%   rm   r+   Útest_cpu_freq  s   

ÿzTestCpuAPIs.test_cpu_freqúnot supportedc                 C   s>   t  ¡ }|  t|ƒd¡ |D ]}|  |t¡ |  |d¡ qd S )Nr`   r˜   )r3   Ú
getloadavgr<   rh   r’   r“   rN   )rA   ÚloadavgÚloadr%   r%   r+   Útest_getloadavg  s   þzTestCpuAPIs.test_getloadavgN)r‹   rŒ   r�   rÔ   rÚ   rÞ   râ   ræ   rç   rî   rø   r   r  r
  r  r  r  r  r"   rŽ   r   r  r   r#  r%   r%   r%   r+   rÇ   1  s(    
!

	

rÇ   c                   @   sŒ   e Zd Ze eo
e d¡dd„ ƒZe e d¡dd„ ƒZ	dd„ Z
d	d
„ Ze eo.ej d¡ d¡e eo8e ¡  d¡dd„ ƒƒZdd„ ZdS )ÚTestDiskAPIszunreliable on PYPY32 + 32BITc                 C   s2  t  t ¡ ¡}|  |jd¡ |jdksJ |ƒ‚|jdks J |ƒ‚|jdks)J |ƒ‚|j|jks3J |ƒ‚|j|jks=J |ƒ‚d|j	  krHdksNn J |j	ƒ‚t
tdƒrxt t ¡ ¡}d}|  |j|j¡ | j|j|j|d� | j|j|j|d� |  ¡ }|  t¡� t  |¡ W d   ƒ d S 1 s’w   Y  d S )N)r¹   r¼   r½   r¸   r   r·   Ú
disk_usagei  P rð   )r3   r%  r1   Úgetcwdr<   r¾   r¹   r¼   r½   r¸   rt   Úshutilró   Ú
get_testfnr?   r   )rA   ÚusageÚshutil_usageÚ	toleranceÚfnamer%   r%   r+   Útest_disk_usage#  s,   "
ÿÿ"ÿzTestDiskAPIs.test_disk_usageznot an ASCII fsc                 C   s:   |   t¡� t t¡ W d   ƒ d S 1 sw   Y  d S rU   )r?   ÚUnicodeEncodeErrorr3   r%  r   rm   r%   r%   r+   Útest_disk_usage_unicode>  s   "ÿz$TestDiskAPIs.test_disk_usage_unicodec                 C   s   t  d¡ d S )Nó   .)r3   r%  rm   r%   r%   r+   Útest_disk_usage_bytesD  s   z"TestDiskAPIs.test_disk_usage_bytesc                    s‚  ‡ fdd„}t jdd�}ˆ j||d� |D ]1}||ƒ tr#d|jv r#qts1tj |j	¡s0J |ƒ‚n|j	 tj |j
¡s?J |ƒ‚|jsFJ |ƒ‚qt jdd�}ˆ j||d� t jdd�D ]K}||ƒ ts¥|j
r¥zt |j
¡ W n, ty™ } z tr…tr…|jtjkr…W Y d }~qZ|jtjtjfvr�‚ W Y d }~qZd }~ww tj |j
¡s¥J |ƒ‚qZdd	„ }|tƒ}d
d„ t jdd�D ƒ}ˆ  ||¡ d S )Nc                    s    ˆ   | jt¡ ˆ   | jt¡ ˆ   | jt¡ ˆ   | jt¡ ˆ   | jttd ƒf¡ ˆ   | j	ttd ƒf¡ | jd ur@t
s@ˆ  | jd¡ | j	d urNˆ  | j	d¡ d S d S r�   )r’   Údevicerœ   Ú
mountpointÚfstypeÚoptsÚmaxfiler¿   rž   Úmaxpathr   r”   ©r  rm   r%   r+   Úcheck_ntupleH  s   
ÿz7TestDiskAPIs.test_disk_partitions.<locals>.check_ntupleF)Úallrƒ   ÚcdromTc                 S   s8   t j | ¡} t j | ¡st j | ¡} t j | ¡r|  ¡ S rU   )r1   rÌ   ÚabspathÚismountÚdirnamer²   )rÌ   r%   r%   r+   Úfind_mount_pointy  s
   ÿz;TestDiskAPIs.test_disk_partitions.<locals>.find_mount_pointc                 S   s   g | ]
}|j r|j  ¡ ‘qS r%   )r3  r²   r(   r%   r%   r+   r,   €  s    ÿz5TestDiskAPIs.test_disk_partitions.<locals>.<listcomp>)r3   Údisk_partitionsrz   r   r5  r	   r1   rÌ   rÍ   r2  r3  r4  ÚstatÚOSErrorr   r   ÚerrnoÚEIOÚEPERMÚEACCESÚ__file__r0   )rA   r9  r  Údiskrÿ   r?  ÚmountÚmountsr%   rm   r+   Útest_disk_partitionsG  sF   
ÿ€û€
ÿz!TestDiskAPIs.test_disk_partitionsz/proc/diskstatsz3/proc/diskstats not available on this linux versionr—   c                    sz   ‡ fdd„}t jdd�}|d usJ dƒ‚||ƒ t jdd�}ˆ  t|ƒtt|ƒƒ¡ |D ]}|s4J |ƒ‚||| ƒ q,d S )Nc                    sì   ˆ   | d | j¡ ˆ   | d | j¡ ˆ   | d | j¡ ˆ   | d | j¡ tsctscˆ   | d | j¡ ˆ   | d | j¡ t	rXˆ   | d | j
¡ ˆ   | d | j¡ ˆ   | d	 | j¡ ntrcˆ   | d | j¡ | jD ]}t| |ƒdkssJ | ƒ‚qfd S )
Nr   r^   re   r`   é   é   rÖ   é   é   )r<   Ú
read_countÚwrite_countÚ
read_bytesÚwrite_bytesr   r   Ú	read_timeÚ
write_timer   Úread_merged_countÚwrite_merged_countÚ	busy_timer   r¾   r®   )r  r›   rm   r%   r+   r9  ‰  s    
ÿz8TestDiskAPIs.test_disk_io_counters.<locals>.check_ntupleF©Úperdiskzno disks on this system?T)r3   Údisk_io_countersr<   rh   ry   ©rA   r9  ÚretÚkeyr%   rm   r+   Útest_disk_io_counters„  s   þz"TestDiskAPIs.test_disk_io_countersc                 C   ód   t jdi d��!}|  tjdd�¡ |  tjdd�i ¡ |js J ‚W d   ƒ d S 1 s+w   Y  d S )Nz#psutil._psplatform.disk_io_countersrÛ   FrY  T)r    r:   rM   r3   r[  r<   rO   ©rA   rR   r%   r%   r+   Útest_disk_io_counters_no_disks¤  s   ÿ"üz+TestDiskAPIs.test_disk_io_counters_no_disksN)r‹   rŒ   r�   r"   rŽ   r   r   r-  r   r/  r1  rK  r   r1   rÌ   rÍ   r   r3   r[  r_  rb  r%   r%   r%   r+   r$  !  s    

=ÿÿr$  c                   @   sn   e Zd Ze e d¡dd„ ƒZe e d¡dd„ ƒZdd„ Zdd	„ Z	d
d„ Z
e ep-ep-e d¡dd„ ƒZdS )ÚTestNetAPIsr  c                    sh   ‡ fdd„}t jdd�}||ƒ t jdd�}ˆ  |g ¡ |D ]}ˆ  |¡ ˆ  |t¡ ||| ƒ qd S )Nc                    s$  ˆ   | d | j¡ ˆ   | d | j¡ ˆ   | d | j¡ ˆ   | d | j¡ ˆ   | d | j¡ ˆ   | d | j¡ ˆ   | d | j¡ ˆ   | d | j¡ | jdksQJ | ƒ‚| jdksZJ | ƒ‚| jdkscJ | ƒ‚| jdkslJ | ƒ‚| jdksuJ | ƒ‚| jdks~J | ƒ‚| jdks‡J | ƒ‚| jdks�J | ƒ‚d S )	Nr   r^   re   r`   rL  rM  rÖ   rN  )	r<   Ú
bytes_sentÚ
bytes_recvÚpackets_sentÚpackets_recvÚerrinÚerroutÚdropinÚdropoutr8  rm   r%   r+   r9  ²  s    z6TestNetAPIs.test_net_io_counters.<locals>.check_ntupleF©ÚpernicT)r3   Únet_io_countersrš   rz   r’   rœ   r\  r%   rm   r+   Útest_net_io_counters°  s   
ýz TestNetAPIs.test_net_io_countersc                 C   r`  )Nz"psutil._psplatform.net_io_countersrÛ   Frl  T)r    r:   rM   r3   rn  r<   rO   ra  r%   r%   r+   Útest_net_io_counters_no_nicsÍ  s   ÿ"üz(TestNetAPIs.test_net_io_counters_no_nicsc              
   C   sŽ  t  ¡ }|s
J |ƒ‚t  ¡ }ttjtjt jgƒ}| ¡ D ]ô\}}|  	|t
¡ |  tt|ƒƒt|ƒ¡ |D ]Û}|  	|jt¡ |  	|jt
¡ |  	|jt
td ƒf¡ |  	|jt
td ƒf¡ |  |j|¡ tjdkrptsp|  	|jtj¡ || jrÝ|jtjkrŸt |j¡}t |¡� | |jdf¡ W d   ƒ n1 s™w   Y  n>|jtjkrÝt |jdtjtjdtj¡d }|\}	}
}}}t |	|
|¡}t |¡� | |¡ W d   ƒ n1 sØw   Y  |j|j|j|j fD ]}|d urù|jtjkrùt!||jƒ qç|j�r|  "|j ¡ q4|j �r|  "|j¡ q4qt#�st$�st%�r,t&tdƒ�r*|  t jtj¡ d S d S t'�r9|  t jtj(¡ d S t)�rE|  t jd¡ d S d S )N)r`   rL  r   ÚAF_LINKr\   )*r3   Únet_if_addrsÚnet_if_statsry   ÚsocketÚAF_INETÚAF_INET6rq  Úitemsr’   rœ   r<   rh   Úfamilyr¿   ÚaddressÚnetmaskrž   Ú	broadcastr0   r¥   Úversion_infor   r   ÚIntEnumÚisupÚ
contextlibÚclosingÚbindÚgetaddrinfoÚSOCK_STREAMÚ
AI_PASSIVEÚptpr   rM   r   r   r
   rt   r   Ú	AF_PACKETr   )rA   ÚnicsÚ	nic_statsÚfamiliesÚnicÚaddrsÚaddrÚsrJ   ÚafÚsocktypeÚprotoÚ	canonnameÚsaÚipr%   r%   r+   Útest_net_if_addrs×  sp   
ÿ€

þþÿÿ€€Ý%ÿÿzTestNetAPIs.test_net_if_addrsc                 C   s    t rdtjdd d d fg}ndg}tjd|d��/}t ¡ d d }|js%J ‚t r/|  |jd¡ n|  |jd¡ W d   ƒ d S W d   ƒ d S 1 sIw   Y  d S )	NÚem1z06:3d:29)r•  r\   z06-3d-29NNNzpsutil._psplatform.net_if_addrsrÛ   r   z06:3d:29:00:00:00z06-3d-29-00-00-00)	r	   r3   rq  r    r:   rr  rO   r<   ry  )rA   r]  rR   rŒ  r%   r%   r+   Ú test_net_if_addrs_mac_null_bytes  s   ÿ
ù"ûz,TestNetAPIs.test_net_if_addrs_mac_null_bytesc           	      C   sŽ   t  ¡ }|s
J |ƒ‚t jt jt jf}| ¡ D ].\}}|  |t¡ |\}}}}|  |t¡ |  	||¡ |  	||¡ |  
|d¡ |  
|d¡ qd S r�   )r3   rs  ÚNIC_DUPLEX_FULLÚNIC_DUPLEX_HALFÚNIC_DUPLEX_UNKNOWNrw  r’   rœ   r¯   r0   rN   )	rA   r‡  Úall_duplexesr›   Ústatsr~  ÚduplexÚspeedÚmtur%   r%   r+   Útest_net_if_stats$  s   þùzTestNetAPIs.test_net_if_statszLINUX or BSD or MACOS specificc                 C   sZ   t jdttjdƒd��}t ¡ }|  |i ¡ |jsJ ‚W d   ƒ d S 1 s&w   Y  d S )Nzpsutil._psutil_posix.net_if_mturG   r.   )	r    r:   rB  rC  ÚENODEVr3   rs  r<   rO   )rA   rR   r]  r%   r%   r+   Útest_net_if_stats_enodev3  s   
ÿ"üz$TestNetAPIs.test_net_if_stats_enodevN)r‹   rŒ   r�   r"   rŽ   r   ro  rp  r”  r–  rŸ  r   r   r   r¡  r%   r%   r%   r+   rc  ®  s    

	<ÿrc  c                   @   sr   e Zd Ze e d¡dd„ ƒZe e d¡dd„ ƒZe e d¡e e	 d¡dd„ ƒƒZ
e e d¡d	d
„ ƒZdS )ÚTestSensorsAPIsr  c                 C   sŠ   t  ¡ }| ¡ D ]:\}}|  |t¡ |D ]-}|  |jt¡ |jd ur)|  |jd¡ |jd ur5|  |jd¡ |j	d urA|  |j	d¡ qqd S r�   )
r3   Úsensors_temperaturesrw  r’   rœ   Úlabelr  rN   ÚhighÚcritical)rA   Útempsr›   ÚentriesÚentryr%   r%   r+   Útest_sensors_temperatures@  s   


€ùþz)TestSensorsAPIs.test_sensors_temperaturesc                 C   s†   ddgi}t jd|d��-}tjdd�d d }|jsJ ‚|  |jd¡ |  |jd	¡ |  |jd
¡ W d   ƒ d S 1 s<w   Y  d S )NÚcoretemp)r¤  g      I@g      N@g     €Q@z'psutil._psplatform.sensors_temperaturesrÛ   T)Ú
fahrenheitr   g     €^@g     €a@g     Àc@)	r    r:   r3   r£  rO   r<   r  r¥  r¦  )rA   ÚdrR   r§  r%   r%   r+   Ú#test_sensors_temperatures_fahreneitN  s"   
ÿÿÿÿ
"ùz3TestSensorsAPIs.test_sensors_temperatures_fahreneitz
no batteryc                 C   sp   t  ¡ }|  |jd¡ |  |jd¡ |jt jt jfvr#|  |jd¡ n|jt jkr/|  |j	¡ |  
|j	t¡ d S )Nr   r·   )r3   Úsensors_batteryrN   r¸   rú   ÚsecsleftÚPOWER_TIME_UNKNOWNÚPOWER_TIME_UNLIMITEDrz   Úpower_pluggedr’   r¯   )rA   r]  r%   r%   r+   Útest_sensors_batteryZ  s   ÿz$TestSensorsAPIs.test_sensors_batteryc                 C   sb   t  ¡ }| ¡ D ]&\}}|  |t¡ |D ]}|  |jt¡ |  |jttf¡ |  	|jd¡ qqd S r�   )
r3   Úsensors_fansrw  r’   rœ   r¤  r  r¿   r   rN   )rA   Úfansr›   r¨  r©  r%   r%   r+   Útest_sensors_fansh  s   ýþz!TestSensorsAPIs.test_sensors_fansN)r‹   rŒ   r�   r"   rŽ   r   rª  r®  r   r   r´  r   r·  r%   r%   r%   r+   r¢  >  s    

r¢  Ú__main__)Úrun_from_name):Ú__doc__r  r¡   rC  r1   rû   r'  rw   rt  r¥   rq   r3   r   r   r   r   r   r   r   r	   r
   r   Úpsutil._compatr   r   Úpsutil.testsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r�   r¶   rÇ   r$  rc  r¢  r‹   Úpsutil.tests.runnerr¹  rG  r%   r%   r%   r+   Ú<module>   sx    J% q  
5þ