| #!/usr/bin/env python |
| # |
| # $Id: _windows.py 798 2010-11-12 20:52:57Z g.rodola $ |
| # |
| |
| |
| import os |
| import unittest |
| import platform |
| import subprocess |
| import signal |
| import time |
| import warnings |
| import atexit |
| |
| import psutil |
| from test_psutil import reap_children, get_test_subprocess, wait_for_pid |
| try: |
| import wmi |
| except ImportError, err: |
| atexit.register(warnings.warn, "Couldn't run wmi tests: %s" % str(err), |
| RuntimeWarning) |
| wmi = None |
| |
| WIN2000 = platform.win32_ver()[0] == '2000' |
| |
| |
| class WindowsSpecificTestCase(unittest.TestCase): |
| |
| def setUp(self): |
| sproc = get_test_subprocess() |
| wait_for_pid(sproc.pid) |
| self.pid = sproc.pid |
| |
| def tearDown(self): |
| reap_children() |
| |
| def test_issue_24(self): |
| p = psutil.Process(0) |
| self.assertRaises(psutil.AccessDenied, p.kill) |
| |
| def test_special_pid(self): |
| if not WIN2000: |
| p = psutil.Process(4) |
| else: |
| p = psutil.Process(8) |
| self.assertEqual(p.name, 'System') |
| # use __str__ to access all common Process properties to check |
| # that nothing strange happens |
| str(p) |
| p.username |
| self.assertTrue(p.create_time >= 0.0) |
| try: |
| rss, vms = p.get_memory_info() |
| except psutil.AccessDenied: |
| # expected on Windows Vista and Windows 7 |
| if not platform.uname()[1] in ('vista', 'win-7', 'win7'): |
| raise |
| else: |
| self.assertTrue(rss > 0) |
| if not WIN2000: |
| self.assertEqual(vms, 0) |
| |
| def test_signal(self): |
| p = psutil.Process(self.pid) |
| self.assertRaises(ValueError, p.send_signal, signal.SIGINT) |
| |
| if wmi is not None: |
| |
| # --- Process class tests |
| |
| def test_process_name(self): |
| w = wmi.WMI().Win32_Process(ProcessId=self.pid)[0] |
| p = psutil.Process(self.pid) |
| self.assertEqual(p.name, w.Caption) |
| |
| def test_process_path(self): |
| w = wmi.WMI().Win32_Process(ProcessId=self.pid)[0] |
| p = psutil.Process(self.pid) |
| self.assertEqual(p.exe, w.ExecutablePath) |
| |
| if not WIN2000: |
| def test_process_cmdline(self): |
| w = wmi.WMI().Win32_Process(ProcessId=self.pid)[0] |
| p = psutil.Process(self.pid) |
| self.assertEqual(' '.join(p.cmdline), w.CommandLine.replace('"', '')) |
| |
| def test_process_username(self): |
| w = wmi.WMI().Win32_Process(ProcessId=self.pid)[0] |
| p = psutil.Process(self.pid) |
| domain, _, username = w.GetOwner() |
| username = "%s\\%s" %(domain, username) |
| self.assertEqual(p.username, username) |
| |
| def test_process_rss_memory(self): |
| time.sleep(0.1) |
| w = wmi.WMI().Win32_Process(ProcessId=self.pid)[0] |
| p = psutil.Process(self.pid) |
| rss = p.get_memory_info().rss |
| self.assertEqual(rss, int(w.WorkingSetSize)) |
| |
| def test_process_vms_memory(self): |
| time.sleep(0.1) |
| w = wmi.WMI().Win32_Process(ProcessId=self.pid)[0] |
| p = psutil.Process(self.pid) |
| vms = p.get_memory_info().vms |
| # http://msdn.microsoft.com/en-us/library/aa394372(VS.85).aspx |
| # ...claims that PageFileUsage is represented in Kilo |
| # bytes but funnily enough on certain platforms bytes are |
| # returned instead. |
| wmi_usage = int(w.PageFileUsage) |
| if (vms != wmi_usage) and (vms != wmi_usage * 1024): |
| self.fail("wmi=%s, psutil=%s" % (wmi_usage, vms)) |
| |
| def test_process_create_time(self): |
| w = wmi.WMI().Win32_Process(ProcessId=self.pid)[0] |
| p = psutil.Process(self.pid) |
| wmic_create = str(w.CreationDate.split('.')[0]) |
| psutil_create = time.strftime("%Y%m%d%H%M%S", |
| time.localtime(p.create_time)) |
| self.assertEqual(wmic_create, psutil_create) |
| |
| |
| # --- psutil namespace functions and constants tests |
| |
| def test_NUM_CPUS(self): |
| num_cpus = int(os.environ['NUMBER_OF_PROCESSORS']) |
| self.assertEqual(num_cpus, psutil.NUM_CPUS) |
| |
| def test_TOTAL_PHYMEM(self): |
| w = wmi.WMI().Win32_ComputerSystem()[0] |
| self.assertEqual(int(w.TotalPhysicalMemory), psutil.TOTAL_PHYMEM) |
| |
| def test__UPTIME(self): |
| # _UPTIME constant is not public but it is used internally |
| # as value to return for pid 0 creation time. |
| # WMI behaves the same. |
| w = wmi.WMI().Win32_Process(ProcessId=self.pid)[0] |
| p = psutil.Process(0) |
| wmic_create = str(w.CreationDate.split('.')[0]) |
| psutil_create = time.strftime("%Y%m%d%H%M%S", |
| time.localtime(p.create_time)) |
| |
| def test_get_pids(self): |
| # Note: this test might fail if the OS is starting/killing |
| # other processes in the meantime |
| w = wmi.WMI().Win32_Process() |
| wmi_pids = [x.ProcessId for x in w] |
| wmi_pids.sort() |
| psutil_pids = psutil.get_pid_list() |
| psutil_pids.sort() |
| if wmi_pids != psutil_pids: |
| difference = filter(lambda x:x not in wmi_pids, psutil_pids) + \ |
| filter(lambda x:x not in psutil_pids, wmi_pids) |
| self.fail("difference: " + str(difference)) |
| |
| |
| if __name__ == '__main__': |
| test_suite = unittest.TestSuite() |
| test_suite.addTest(unittest.makeSuite(WindowsSpecificTestCase)) |
| unittest.TextTestRunner(verbosity=2).run(test_suite) |
| |