£Á°èZ¨Ä…–K§‚«“ô4“ÒÙ´dîfUÙÃÅ WKbyÊ¦•êŽ…È®FÒ¿ÊÎóCozá¬S@6{Í:›œêZÌ:Š•_%:¢¾¾~;‘Ã~èŠ©ÊÇí`ÔÑ©úë™µ'5I¿fš×WO%ø9¾«¾DK|€ùÍD”Ýs]nHÕ¶ê×Ó¼ãžªéUWŸÈË%DÒÕ¬ï‘]/Åcx  ‰ï2ß]ä6G[]S£ÔÏ¯rs{úëóµmÒï#UQxo·õÞCe]"±/aÙ&Eã4ú9Jé_ÞåëdãöKë)AÞ                  ¯¹ægƒÛowÐø^d™ý½ßB7áyMä9ÜÖUã
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
<html>
B
    =_0                 @   s<  d 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Zerd!d" Zd#d$ Z'G d%d& d&eZ(e e&)ed'e&)eoe d(G d)d* d*e(Z*e&)ed+G d,d- d-e*Z+G d.d/ d/e(Z,e-d0kr8dd1l.m/Z/ e/e0 dS )2a:	  
Notes about unicode handling in psutil
======================================

Starting from version 5.3.0 psutil adds unicode support, see:
https://github.com/giampaolo/psutil/issues/1040
The notes below apply to *any* API returning a string such as
process exe(), cwd() or username():

* all strings are encoded by using the OS filesystem encoding
  (sys.getfilesystemencoding()) which varies depending on the platform
  (e.g. "UTF-8" on macOS, "mbcs" on Win)
* no API call is supposed to crash with UnicodeDecodeError
* instead, in case of badly encoded data returned by the OS, the
  following error handlers are used to replace the corrupted characters in
  the string:
    * Python 3: sys.getfilesystemencodeerrors() (PY 3.6+) or
      "surrogatescape" on POSIX and "replace" on Windows
    * Python 2: "replace"
* on Python 2 all APIs return bytes (str type), never unicode
* on Python 2, you can go back to unicode by doing:

    >>> unicode(p.exe(), sys.getdefaultencoding(), errors="replace")

For a detailed explanation of how psutil handles unicode see #1040.

Tests
=====

List of APIs returning or dealing with a string:
('not tested' means they are not tested to deal with non-ASCII strings):

* Process.cmdline()
* Process.connections('unix')
* Process.cwd()
* Process.environ()
* Process.exe()
* Process.memory_maps()
* Process.name()
* Process.open_files()
* Process.username()             (not tested)

* disk_io_counters()             (not tested)
* disk_partitions()              (not tested)
* disk_usage(str)
* net_connections('unix')
* net_if_addrs()                 (not tested)
* net_if_stats()                 (not tested)
* net_io_counters()              (not tested)
* sensors_fans()                 (not tested)
* sensors_temperatures()         (not tested)
* users()                        (not tested)

* WindowsService.binpath()       (not tested)
* WindowsService.description()   (not tested)
* WindowsService.display_name()  (not tested)
* WindowsService.name()          (not tested)
* WindowsService.status()        (not tested)
* WindowsService.username()      (not tested)

In here we create a unicode path with a funky non-ASCII name and (where
possible) make psutil return it back (e.g. on name(), exe(), open_files(),
etc.) and make sure that:

* psutil never crashes with UnicodeDecodeError
* the returned path matches
    N)closing)BSD)OPENBSD)POSIX)WINDOWS)PY3)u)APPVEYOR)ASCII_FS)bind_unix_socket)chdir)
CI_TESTING)copyload_shared_lib)
create_exe)
get_testfn)HAS_CONNECTIONS_UNIX)HAS_ENVIRON)HAS_MEMORY_MAPS)INVALID_UNICODE_SUFFIX)PsutilTestCase)PYPY)
safe_mkdir)safe_rmpath)	serialrun)skip_on_access_denied)spawn_testproc)	terminate)TESTFN_PREFIX)UNICODE_SUFFIX)unittestc             C   s6   ddl m} y|| S  tk
r0   t  Y nX d S )Nr   )r   )psutil.testsr   ZWindowsError	traceback	print_exc)pathZrm r$   L/opt/alt/python37/lib64/python3.7/site-packages/psutil/tests/test_unicode.pyr   s   s
    r   c          	   C   s   d}t | d}z^y<t| t| t|gd}t||d  t|d  W n ttfk
rd   dS X dS W d|dk	r~t| t| X dS )z`Return True if both the fs and the subprocess module can
    deal with a unicode file name.
    N)suffix)cmdz-2FT)	r   r   r   r   shutilcopyfileUnicodeEncodeErrorIOErrorr   )r&   sprocZtestfnr$   r$   r%   try_unicode   s    
r-   c               @   s   e Zd ZdZdd ZdS )BaseUnicodeTestNc             C   s"   | j d k	rt| j s| dd S )Nzcan't handle unicode str)funky_suffixr-   skipTest)selfr$   r$   r%   setUp   s    

zBaseUnicodeTest.setUp)__name__
__module____qualname__r/   r2   r$   r$   r$   r%   r.      s   r.   zASCII fsztoo much trouble on PYPY2c               @   s   e Zd ZdZeZedd Zedd Zdd Z	dd	 Z
d
d Zdd Zdd ZeeoZeddd Zee ddd Zee dee de dd Zdd Zee dee deeddd Zd S )!
TestFSAPIsz1Test FS APIs with a funky, valid, UTF8 path name.c             C   s   t | jd| _t| j d S )N)r&   )r   r/   
funky_namer   )clsr$   r$   r%   
setUpClass   s    zTestFSAPIs.setUpClassc             C   s   t | j d S )N)r   r7   )r8   r$   r$   r%   tearDownClass   s    zTestFSAPIs.tearDownClassc          	   C   sF   t | jtrdntd}t  td | jt|kS Q R X d S )N.ignore)	
isinstancer7   strr   warningscatch_warningssimplefilteroslistdir)r1   herer$   r$   r%   expect_exact_path_match   s    

z"TestFSAPIs.expect_exact_path_matchc             C   sZ   | j | jgd}t|j}| }| |t |  rV| 	t
j|t
j| j d S )N)r'   )r   r7   psutilProcesspidexeassertIsInstancer>   rE   assertEqualrB   r#   normcase)r1   subpprI   r$   r$   r%   test_proc_exe   s    zTestFSAPIs.test_proc_exec             C   sN   | j | jgd}t|j }| |t |  rJ| 	|t
j| j d S )N)r'   )r   r7   rF   rG   rH   namerJ   r>   rE   rK   rB   r#   basename)r1   rM   rP   r$   r$   r%   test_proc_name   s
    zTestFSAPIs.test_proc_namec             C   sZ   | j | jgd}t|j}| }x|D ]}| |t q*W |  rV| 	|| jg d S )N)r'   )
r   r7   rF   rG   rH   cmdlinerJ   r>   rE   rK   )r1   rM   rN   rS   partr$   r$   r%   test_proc_cmdline   s    
zTestFSAPIs.test_proc_cmdlinec          	   C   sj   | j d }| t| t| t| t }| }W d Q R X | | t	 | 
 rf| || d S )N2)r7   
addCleanupr   r   r   rF   rG   cwdrJ   r>   rE   rK   )r1   dnamerN   rX   r$   r$   r%   test_proc_cwd   s    

zTestFSAPIs.test_proc_cwdzfails on PYPY + WINDOWSc          	   C   s   t  }t| }t| jd t| }W d Q R X ||  j}| |t	 t
rd|sd| dS |  r| tj|tj| j d S )Nrbzopen_files on BSD is broken)rF   rG   setZ
open_filesopenr7   popr#   rJ   r>   r   r0   rE   rK   rB   rL   )r1   rN   startnewr#   r$   r$   r%   test_proc_open_files   s    
zTestFSAPIs.test_proc_open_filesz
POSIX onlyc          	   C   s   | j | jd}yt|}W n& tk
r@   tr2 n
tdY nX t|8 t	 
dd }| |jt ts~| |j| W d Q R X d S )N)r&   znot supportedunixr   )r   r/   r   r*   r   r   SkipTestr   rF   rG   ZconnectionsrJ   laddrr>   r   rK   )r1   rP   sockconnr$   r$   r%   test_proc_connections   s    
z TestFSAPIs.test_proc_connectionszcan't list UNIX socketsc          	   C   s   dd }| j | jd}yt|}W n& tk
rH   tr: n
tdY nX t|: tj	dd}t
s||}| |jt | |j| W d Q R X d S )Nc             S   s2   x$| D ]}t j|jtr|S qW tdd S )Nzconnection not found)rB   r#   rQ   rd   
startswithr   
ValueError)consrf   r$   r$   r%   	find_sock  s    
z2TestFSAPIs.test_net_connections.<locals>.find_sock)r&   znot supportedrb   )kind)r   r/   r   r*   r   r   rc   r   rF   Znet_connectionsr   rJ   rd   r>   rK   )r1   rk   rP   re   rj   rf   r$   r$   r%   test_net_connections  s    
zTestFSAPIs.test_net_connectionsc             C   s,   | j d }| t| t| t| d S )NrV   )r7   rW   r   r   rF   
disk_usage)r1   rY   r$   r$   r%   test_disk_usage"  s    
zTestFSAPIs.test_disk_usageznot supportedz&ctypes does not support unicode on PY2zunstable on PYPYc          	      sv   t | jd`}dd   fddt  D }dd |D }|  || x|D ]}| |t qTW W d Q R X d S )N)r&   c             S   s   t jt j| S )N)rB   r#   realpathrL   )rN   r$   r$   r%   normpath/  s    z-TestFSAPIs.test_memory_maps.<locals>.normpathc                s   g | ]} |j qS r$   )r#   ).0x)rq   r$   r%   
<listcomp>1  s   z/TestFSAPIs.test_memory_maps.<locals>.<listcomp>c             S   s   g | ]}t |kr|qS r$   )r   )rr   rs   r$   r$   r%   rt   4  s    )r   r/   rF   rG   Zmemory_mapsZassertInrJ   r>   )r1   Z
funky_pathZlibpathsr#   r$   )rq   r%   test_memory_maps(  s    

zTestFSAPIs.test_memory_mapsN)r3   r4   r5   __doc__r   r/   classmethodr9   r:   rE   rO   rR   rU   rZ   r   skipIfr   r   ra   r   rg   r   r   rm   ro   r   r   ru   r$   r$   r$   r%   r6      s$   
		r6   zunreliable on CIc               @   s    e Zd ZdZeZedd ZdS )TestFSAPIsWithInvalidPathz-Test FS APIs with a funky, invalid path name.c             C   s   dS )NTr$   )r8   r$   r$   r%   rE   ?  s    z1TestFSAPIsWithInvalidPath.expect_exact_path_matchN)r3   r4   r5   rv   r   r/   rw   rE   r$   r$   r$   r%   ry   :  s   ry   c               @   sB   e Zd ZdZerendZee	 dee
o.eddd ZdS )TestNonFSAPISz&Unicode tests for non fs-related APIs.   èznot supportedzsegfaults on PYPY + WINDOWSc             C   sx   t j }| j|d< | j|d}t|j}| }x,| D ] \}}| 	|t
 | 	|t
 q>W | |d | j d S )NZ	FUNNY_ARG)env)rB   environcopyr/   r   rF   rG   rH   itemsrJ   r>   rK   )r1   r|   r,   rN   kvr$   r$   r%   test_proc_environN  s    

zTestNonFSAPIS.test_proc_environN)r3   r4   r5   rv   r   r   r/   r   rx   r   r   r   r   r$   r$   r$   r%   rz   J  s   rz   __main__)run_from_name)1rv   rB   r(   r!   r?   
contextlibr   rF   r   r   r   r   Zpsutil._compatr   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.   rx   r6   ry   rz   r3   Zpsutil.tests.runnerr   __file__r$   r$   r$   r%   <module>J   sd   	
 
