a
    QIh(                     @   s  d Z ddlZddlZddlZddlm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 Z G dd deZ!ej"j#d d!ej"j$ed"d#G d$d% d%e!Z%ej"j$ed&d#G d'd( d(e%Z&G d)d* d*e!Z'dS )+aY  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:
    * sys.getfilesystemencodeerrors() or "surrogatescape" on POSIX and
      "replace" on Windows.

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.cwd()
* Process.environ()
* Process.exe()
* Process.memory_maps()
* Process.name()
* Process.net_connections('unix')
* 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)POSIX)WINDOWS)ASCII_FS)
CI_TESTING)HAS_ENVIRON)HAS_MEMORY_MAPS)HAS_NET_CONNECTIONS_UNIX)INVALID_UNICODE_SUFFIX)PYPYTESTFN_PREFIX)UNICODE_SUFFIX)PsutilTestCase)bind_unix_socket)chdir)copyload_shared_lib)create_py_exe)
get_testfn)pytest)
safe_mkdir)safe_rmpath)skip_on_access_denied)spawn_testproc)	terminatec              	   C   s   d}t | d}zz<t| t| t|gd}t||d  t|d  W n2 ttfy~   Y W |durrt| t| dS 0 W |durt| t| dS W |durt| t| n|durt| t| 0 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OSErrorr   )r   sprocZtestfn r$   S/var/www/html/venv_bot_3.9/lib/python3.9/site-packages/psutil/tests/test_unicode.pytry_unicodee   s2    

r&   c                       s0   e Zd ZdZe fddZ fddZ  ZS )BaseUnicodeTestNc                    sN   t    d| _d | _| jd urJt| js2d| _nt| jd| _t| j d S )NFTr   )super
setUpClass
skip_tests
funky_namefunky_suffixr&   r   r   )cls	__class__r$   r%   r)      s    


zBaseUnicodeTest.setUpClassc                    s   t    | jrtdd S )Nzcan't handle unicode str)r(   setUpr*   r   skipselfr.   r$   r%   r0      s    
zBaseUnicodeTest.setUp)__name__
__module____qualname__r,   classmethodr)   r0   __classcell__r$   r$   r.   r%   r'      s   r'   serial)namezASCII fsreasonc                   @   s   e Zd ZdZeZdd Zdd Zdd Zdd	 Z	d
d Z
ejjeoDedddd Zejje dddd Zejje ddejje dde dd Zdd Zejje ddejjedddd ZdS )
TestFSAPIsz1Test FS APIs with a funky, valid, UTF8 path name.c                 C   sF   t  * t d | jtdv W  d    S 1 s80    Y  d S )Nignore.)warningscatch_warningssimplefilterr+   oslistdirr2   r$   r$   r%   expect_exact_path_match   s    

z"TestFSAPIs.expect_exact_path_matchc                 C   sb   | j ddg}| |}t|j}| }t|ts8J |  r^t	j
|t	j
| j ks^J d S Nz-cz2import time; [time.sleep(0.1) for x in range(100)])r+   r   psutilProcesspidexe
isinstancestrrE   rC   pathnormcase)r3   r   subpprJ   r$   r$   r%   test_proc_exe   s    
zTestFSAPIs.test_proc_exec                 C   sV   | j ddg}| |}t|j }t|ts4J |  rR|t	j
| j ksRJ d S rF   )r+   r   rG   rH   rI   r:   rK   rL   rE   rC   rM   basename)r3   r   rO   r:   r$   r$   r%   test_proc_name   s    
zTestFSAPIs.test_proc_namec                 C   sZ   | j ddg}| |}t|j}| }|D ]}t|ts.J q.|  rV||ksVJ d S rF   )	r+   r   rG   rH   rI   cmdlinerK   rL   rE   )r3   r   rO   rP   rT   partr$   r$   r%   test_proc_cmdline   s    
zTestFSAPIs.test_proc_cmdlinec                 C   s   | j d }| t| t| t|  t }| }W d    n1 sL0    Y  t| t	shJ | 
 r|||ks|J d S N2)r+   
addCleanupr   r   r   rG   rH   cwdrK   rL   rE   )r3   dnamerP   rZ   r$   r$   r%   test_proc_cwd   s    

&zTestFSAPIs.test_proc_cwdzfails on PYPY + WINDOWSr;   c                 C   s   t  }t| }t| jd t| }W d    n1 sB0    Y  ||  j}t|t	shJ t
rz|sztd|  rtj|tj| jksJ d S )Nrbzopen_files on BSD is broken)rG   rH   setZ
open_filesopenr+   poprM   rK   rL   r   r   r1   rE   rC   rN   )r3   rP   startnewrM   r$   r$   r%   test_proc_open_files   s    *
zTestFSAPIs.test_proc_open_filesz
POSIX onlyc                 C   sr   | j | jd}t|}t|@ t dd }t|jt	sBJ |j|ksPJ W d    n1 sd0    Y  d S )Nr   unixr   )
r   r,   r   r   rG   rH   net_connectionsrK   laddrrL   )r3   r:   sockconnr$   r$   r%   test_proc_net_connections   s    
z$TestFSAPIs.test_proc_net_connectionszcan't list UNIX socketsc                 C   s|   dd }| j | jd}t|}t|B tjdd}||}t|jtsLJ |j|ksZJ W d    n1 sn0    Y  d S )Nc                 S   s2   | D ] }t j|jtr|  S qtdd S )Nzconnection not found)rC   rM   rR   rf   
startswithr   
ValueError)consrh   r$   r$   r%   	find_sock   s    
z2TestFSAPIs.test_net_connections.<locals>.find_sockr   rd   )kind)	r   r,   r   r   rG   re   rK   rf   rL   )r3   rm   r:   rg   rl   rh   r$   r$   r%   test_net_connections   s    
zTestFSAPIs.test_net_connectionsc                 C   s,   | j d }| t| t| t| d S rW   )r+   rY   r   r   rG   
disk_usage)r3   r[   r$   r$   r%   test_disk_usage   s    
zTestFSAPIs.test_disk_usagenot supportedzunstable on PYPYc                    s   t | jdh}dd   fddt  D }dd |D } ||v sNJ |D ]}t|tsRJ qRW d    n1 sz0    Y  d S )Nr   c                 S   s   t jt j| S )N)rC   rM   realpathrN   )rP   r$   r$   r%   normpath  s    z-TestFSAPIs.test_memory_maps.<locals>.normpathc                    s   g | ]} |j qS r$   )rM   .0xrt   r$   r%   
<listcomp>  s   z/TestFSAPIs.test_memory_maps.<locals>.<listcomp>c                 S   s   g | ]}t |v r|qS r$   r   ru   r$   r$   r%   ry         )r   r,   rG   rH   Zmemory_mapsrK   rL   )r3   Z
funky_pathZlibpathsrM   r$   rx   r%   test_memory_maps  s    

zTestFSAPIs.test_memory_mapsN)r4   r5   r6   __doc__r   r,   rE   rQ   rS   rV   r\   r   markskipifr   r   rc   r   ri   r
   r   ro   rq   r	   r{   r$   r$   r$   r%   r=      s*   

r=   zunreliable on CIc                   @   s   e Zd ZdZeZdd ZdS )TestFSAPIsWithInvalidPathz-Test FS APIs with a funky, invalid path name.c                 C   s   dS )NTr$   r2   r$   r$   r%   rE     s    z1TestFSAPIsWithInvalidPath.expect_exact_path_matchN)r4   r5   r6   r|   r   r,   rE   r$   r$   r$   r%   r     s   r   c                   @   sB   e Zd ZdZeZejje	 ddejje
o,edddd ZdS )TestNonFSAPISz&Unicode tests for non fs-related APIs.rr   r;   zsegfaults on PYPY + WINDOWSc                 C   sx   t j }| j|d< | j|d}t|j}| }| D ]$\}}t	|t
sRJ t	|t
s<J q<|d | jkstJ d S )NZ	FUNNY_ARG)env)rC   environcopyr,   r   rG   rH   rI   itemsrK   rL   )r3   r   r#   rP   kvr$   r$   r%   test_proc_environ,  s    

zTestNonFSAPIS.test_proc_environN)r4   r5   r6   r|   r   r,   r   r}   r~   r   r   r   r   r$   r$   r$   r%   r   '  s
   r   )(r|   rC   r   r@   
contextlibr   rG   r   r   r   Z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}   Zxdist_groupr~   r=   r   r   r$   r$   r$   r%   <module>   sL   > 