U |f1@s,dZddlZddlZddlZddlZddlZddlmZddlZddlm Z ddlm Z ddlm Z ddl m Z ddl mZdd lmZdd lmZdd lmZdd lmZdd lmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlm Z ddlm!Z!ddlm"Z"ddlm#Z#ddlm$Z$ddlm%Z%erdd Z!d!d"Z&Gd#d$d$eZ'e"e(ed%e(eoe d&Gd'd(d(e'Z)e(ed)Gd*d+d+e)Z*Gd,d-d-e'Z+e,d.kr(dd/l-m.Z.e.e/dS)0a> 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.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)PY3)super)APPVEYOR)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) safe_mkdir safe_rmpath) serialrun)skip_on_access_denied)spawn_testproc) terminatecCs8ddlm}z ||WStk r2tYnXdS)Nrr) psutil.testsrZ WindowsError traceback print_exc)pathZrmr$L/opt/alt/python38/lib64/python3.8/site-packages/psutil/tests/test_unicode.pyrrs  rc Csd}t|d}zhz.find_sockr&rkrl)kind)rr3rr+rr8r9rrNrmrRrnrErS)r;rurXrortrpr$r$r%test_net_connectionss   zTestFSAPIs.test_net_connectionscCs,|jd}|t|t|t|dSr^)r2r`rrrN disk_usage)r;rbr$r$r%test_disk_usage2s  zTestFSAPIs.test_disk_usagerkz&ctypes does not support unicode on PY2zunstable on PYPYc srt|jd\}ddfddtD}dd|D}||||D]}||tqRW5QRXdS)Nr&cSstjtj|S)N)rIr#realpathrT)rVr$r$r%normpath@sz-TestFSAPIs.test_memory_maps..normpathcsg|]}|jqSr$)r#.0xr{r$r% Csz/TestFSAPIs.test_memory_maps..cSsg|]}t|kr|qSr$rr|r$r$r%rGs)rr3rNrOZ memory_mapsZassertInrRrE)r;Z funky_pathZlibpathsr#r$rr%test_memory_maps8s  zTestFSAPIs.test_memory_mapsN)r<r=r>__doc__rr3rLrWrZr]rcr8skipIfrrrjrrqr rrwryr rrr$r$r$r%rAs(           rAzunreliable on CIc@seZdZdZeZddZdS)TestFSAPIsWithInvalidPathz-Test FS APIs with a funky, invalid path name.cCsdS)NTr$r:r$r$r%rLSsz1TestFSAPIsWithInvalidPath.expect_exact_path_matchN)r<r=r>rrr3rLr$r$r$r%rMsrc@sBeZdZdZerendZee dee o.e dddZ dS) TestNonFSAPISz&Unicode tests for non fs-related APIs.èrkzsegfaults on PYPY + WINDOWScCsttj}|j|d<|j|d}t|j}|}|D] \}}| |t | |t q<| |d|jdS)NZ FUNNY_ARG)env) rIenvironcopyr3rrNrOrPitemsrRrErS)r;rr-rVkvr$r$r%test_proc_environbs     zTestNonFSAPIS.test_proc_environN) r<r=r>rrrr3r8rr rrrr$r$r$r%r]s   r__main__) run_from_name)0rrIr)r!r8rF contextlibrrNrrrZpsutil._compatrrr rr r r r r rrrrrrrrrrrrrrrrr.r/rrArrr<Zpsutil.tests.runnerr__file__r$r$r$r%sbC