Mercurial > repos > shellac > guppy_basecaller
comparison env/lib/python3.7/site-packages/psutil/tests/test_bsd.py @ 2:6af9afd405e9 draft
"planemo upload commit 0a63dd5f4d38a1f6944587f52a8cd79874177fc1"
author | shellac |
---|---|
date | Thu, 14 May 2020 14:56:58 -0400 |
parents | 26e78fe6e8c4 |
children |
comparison
equal
deleted
inserted
replaced
1:75ca89e9b81c | 2:6af9afd405e9 |
---|---|
1 #!/usr/bin/env python3 | |
2 | |
3 # Copyright (c) 2009, Giampaolo Rodola'. All rights reserved. | |
4 # Use of this source code is governed by a BSD-style license that can be | |
5 # found in the LICENSE file. | |
6 | |
7 # TODO: (FreeBSD) add test for comparing connections with 'sockstat' cmd. | |
8 | |
9 | |
10 """Tests specific to all BSD platforms.""" | |
11 | |
12 | |
13 import datetime | |
14 import os | |
15 import re | |
16 import time | |
17 | |
18 import psutil | |
19 from psutil import BSD | |
20 from psutil import FREEBSD | |
21 from psutil import NETBSD | |
22 from psutil import OPENBSD | |
23 from psutil.tests import get_test_subprocess | |
24 from psutil.tests import HAS_BATTERY | |
25 from psutil.tests import MEMORY_TOLERANCE | |
26 from psutil.tests import reap_children | |
27 from psutil.tests import retry_on_failure | |
28 from psutil.tests import sh | |
29 from psutil.tests import unittest | |
30 from psutil.tests import which | |
31 | |
32 | |
33 if BSD: | |
34 PAGESIZE = os.sysconf("SC_PAGE_SIZE") | |
35 if os.getuid() == 0: # muse requires root privileges | |
36 MUSE_AVAILABLE = which('muse') | |
37 else: | |
38 MUSE_AVAILABLE = False | |
39 else: | |
40 MUSE_AVAILABLE = False | |
41 | |
42 | |
43 def sysctl(cmdline): | |
44 """Expects a sysctl command with an argument and parse the result | |
45 returning only the value of interest. | |
46 """ | |
47 result = sh("sysctl " + cmdline) | |
48 if FREEBSD: | |
49 result = result[result.find(": ") + 2:] | |
50 elif OPENBSD or NETBSD: | |
51 result = result[result.find("=") + 1:] | |
52 try: | |
53 return int(result) | |
54 except ValueError: | |
55 return result | |
56 | |
57 | |
58 def muse(field): | |
59 """Thin wrapper around 'muse' cmdline utility.""" | |
60 out = sh('muse') | |
61 for line in out.split('\n'): | |
62 if line.startswith(field): | |
63 break | |
64 else: | |
65 raise ValueError("line not found") | |
66 return int(line.split()[1]) | |
67 | |
68 | |
69 # ===================================================================== | |
70 # --- All BSD* | |
71 # ===================================================================== | |
72 | |
73 | |
74 @unittest.skipIf(not BSD, "BSD only") | |
75 class BSDTestCase(unittest.TestCase): | |
76 """Generic tests common to all BSD variants.""" | |
77 | |
78 @classmethod | |
79 def setUpClass(cls): | |
80 cls.pid = get_test_subprocess().pid | |
81 | |
82 @classmethod | |
83 def tearDownClass(cls): | |
84 reap_children() | |
85 | |
86 @unittest.skipIf(NETBSD, "-o lstart doesn't work on NETBSD") | |
87 def test_process_create_time(self): | |
88 output = sh("ps -o lstart -p %s" % self.pid) | |
89 start_ps = output.replace('STARTED', '').strip() | |
90 start_psutil = psutil.Process(self.pid).create_time() | |
91 start_psutil = time.strftime("%a %b %e %H:%M:%S %Y", | |
92 time.localtime(start_psutil)) | |
93 self.assertEqual(start_ps, start_psutil) | |
94 | |
95 def test_disks(self): | |
96 # test psutil.disk_usage() and psutil.disk_partitions() | |
97 # against "df -a" | |
98 def df(path): | |
99 out = sh('df -k "%s"' % path).strip() | |
100 lines = out.split('\n') | |
101 lines.pop(0) | |
102 line = lines.pop(0) | |
103 dev, total, used, free = line.split()[:4] | |
104 if dev == 'none': | |
105 dev = '' | |
106 total = int(total) * 1024 | |
107 used = int(used) * 1024 | |
108 free = int(free) * 1024 | |
109 return dev, total, used, free | |
110 | |
111 for part in psutil.disk_partitions(all=False): | |
112 usage = psutil.disk_usage(part.mountpoint) | |
113 dev, total, used, free = df(part.mountpoint) | |
114 self.assertEqual(part.device, dev) | |
115 self.assertEqual(usage.total, total) | |
116 # 10 MB tollerance | |
117 if abs(usage.free - free) > 10 * 1024 * 1024: | |
118 self.fail("psutil=%s, df=%s" % (usage.free, free)) | |
119 if abs(usage.used - used) > 10 * 1024 * 1024: | |
120 self.fail("psutil=%s, df=%s" % (usage.used, used)) | |
121 | |
122 @unittest.skipIf(not which('sysctl'), "sysctl cmd not available") | |
123 def test_cpu_count_logical(self): | |
124 syst = sysctl("hw.ncpu") | |
125 self.assertEqual(psutil.cpu_count(logical=True), syst) | |
126 | |
127 @unittest.skipIf(not which('sysctl'), "sysctl cmd not available") | |
128 def test_virtual_memory_total(self): | |
129 num = sysctl('hw.physmem') | |
130 self.assertEqual(num, psutil.virtual_memory().total) | |
131 | |
132 def test_net_if_stats(self): | |
133 for name, stats in psutil.net_if_stats().items(): | |
134 try: | |
135 out = sh("ifconfig %s" % name) | |
136 except RuntimeError: | |
137 pass | |
138 else: | |
139 self.assertEqual(stats.isup, 'RUNNING' in out, msg=out) | |
140 if "mtu" in out: | |
141 self.assertEqual(stats.mtu, | |
142 int(re.findall(r'mtu (\d+)', out)[0])) | |
143 | |
144 | |
145 # ===================================================================== | |
146 # --- FreeBSD | |
147 # ===================================================================== | |
148 | |
149 | |
150 @unittest.skipIf(not FREEBSD, "FREEBSD only") | |
151 class FreeBSDProcessTestCase(unittest.TestCase): | |
152 | |
153 @classmethod | |
154 def setUpClass(cls): | |
155 cls.pid = get_test_subprocess().pid | |
156 | |
157 @classmethod | |
158 def tearDownClass(cls): | |
159 reap_children() | |
160 | |
161 @retry_on_failure() | |
162 def test_memory_maps(self): | |
163 out = sh('procstat -v %s' % self.pid) | |
164 maps = psutil.Process(self.pid).memory_maps(grouped=False) | |
165 lines = out.split('\n')[1:] | |
166 while lines: | |
167 line = lines.pop() | |
168 fields = line.split() | |
169 _, start, stop, perms, res = fields[:5] | |
170 map = maps.pop() | |
171 self.assertEqual("%s-%s" % (start, stop), map.addr) | |
172 self.assertEqual(int(res), map.rss) | |
173 if not map.path.startswith('['): | |
174 self.assertEqual(fields[10], map.path) | |
175 | |
176 def test_exe(self): | |
177 out = sh('procstat -b %s' % self.pid) | |
178 self.assertEqual(psutil.Process(self.pid).exe(), | |
179 out.split('\n')[1].split()[-1]) | |
180 | |
181 def test_cmdline(self): | |
182 out = sh('procstat -c %s' % self.pid) | |
183 self.assertEqual(' '.join(psutil.Process(self.pid).cmdline()), | |
184 ' '.join(out.split('\n')[1].split()[2:])) | |
185 | |
186 def test_uids_gids(self): | |
187 out = sh('procstat -s %s' % self.pid) | |
188 euid, ruid, suid, egid, rgid, sgid = out.split('\n')[1].split()[2:8] | |
189 p = psutil.Process(self.pid) | |
190 uids = p.uids() | |
191 gids = p.gids() | |
192 self.assertEqual(uids.real, int(ruid)) | |
193 self.assertEqual(uids.effective, int(euid)) | |
194 self.assertEqual(uids.saved, int(suid)) | |
195 self.assertEqual(gids.real, int(rgid)) | |
196 self.assertEqual(gids.effective, int(egid)) | |
197 self.assertEqual(gids.saved, int(sgid)) | |
198 | |
199 @retry_on_failure() | |
200 def test_ctx_switches(self): | |
201 tested = [] | |
202 out = sh('procstat -r %s' % self.pid) | |
203 p = psutil.Process(self.pid) | |
204 for line in out.split('\n'): | |
205 line = line.lower().strip() | |
206 if ' voluntary context' in line: | |
207 pstat_value = int(line.split()[-1]) | |
208 psutil_value = p.num_ctx_switches().voluntary | |
209 self.assertEqual(pstat_value, psutil_value) | |
210 tested.append(None) | |
211 elif ' involuntary context' in line: | |
212 pstat_value = int(line.split()[-1]) | |
213 psutil_value = p.num_ctx_switches().involuntary | |
214 self.assertEqual(pstat_value, psutil_value) | |
215 tested.append(None) | |
216 if len(tested) != 2: | |
217 raise RuntimeError("couldn't find lines match in procstat out") | |
218 | |
219 @retry_on_failure() | |
220 def test_cpu_times(self): | |
221 tested = [] | |
222 out = sh('procstat -r %s' % self.pid) | |
223 p = psutil.Process(self.pid) | |
224 for line in out.split('\n'): | |
225 line = line.lower().strip() | |
226 if 'user time' in line: | |
227 pstat_value = float('0.' + line.split()[-1].split('.')[-1]) | |
228 psutil_value = p.cpu_times().user | |
229 self.assertEqual(pstat_value, psutil_value) | |
230 tested.append(None) | |
231 elif 'system time' in line: | |
232 pstat_value = float('0.' + line.split()[-1].split('.')[-1]) | |
233 psutil_value = p.cpu_times().system | |
234 self.assertEqual(pstat_value, psutil_value) | |
235 tested.append(None) | |
236 if len(tested) != 2: | |
237 raise RuntimeError("couldn't find lines match in procstat out") | |
238 | |
239 | |
240 @unittest.skipIf(not FREEBSD, "FREEBSD only") | |
241 class FreeBSDSystemTestCase(unittest.TestCase): | |
242 | |
243 @staticmethod | |
244 def parse_swapinfo(): | |
245 # the last line is always the total | |
246 output = sh("swapinfo -k").splitlines()[-1] | |
247 parts = re.split(r'\s+', output) | |
248 | |
249 if not parts: | |
250 raise ValueError("Can't parse swapinfo: %s" % output) | |
251 | |
252 # the size is in 1k units, so multiply by 1024 | |
253 total, used, free = (int(p) * 1024 for p in parts[1:4]) | |
254 return total, used, free | |
255 | |
256 def test_cpu_frequency_against_sysctl(self): | |
257 # Currently only cpu 0 is frequency is supported in FreeBSD | |
258 # All other cores use the same frequency. | |
259 sensor = "dev.cpu.0.freq" | |
260 try: | |
261 sysctl_result = int(sysctl(sensor)) | |
262 except RuntimeError: | |
263 self.skipTest("frequencies not supported by kernel") | |
264 self.assertEqual(psutil.cpu_freq().current, sysctl_result) | |
265 | |
266 sensor = "dev.cpu.0.freq_levels" | |
267 sysctl_result = sysctl(sensor) | |
268 # sysctl returns a string of the format: | |
269 # <freq_level_1>/<voltage_level_1> <freq_level_2>/<voltage_level_2>... | |
270 # Ordered highest available to lowest available. | |
271 max_freq = int(sysctl_result.split()[0].split("/")[0]) | |
272 min_freq = int(sysctl_result.split()[-1].split("/")[0]) | |
273 self.assertEqual(psutil.cpu_freq().max, max_freq) | |
274 self.assertEqual(psutil.cpu_freq().min, min_freq) | |
275 | |
276 # --- virtual_memory(); tests against sysctl | |
277 | |
278 @retry_on_failure() | |
279 def test_vmem_active(self): | |
280 syst = sysctl("vm.stats.vm.v_active_count") * PAGESIZE | |
281 self.assertAlmostEqual(psutil.virtual_memory().active, syst, | |
282 delta=MEMORY_TOLERANCE) | |
283 | |
284 @retry_on_failure() | |
285 def test_vmem_inactive(self): | |
286 syst = sysctl("vm.stats.vm.v_inactive_count") * PAGESIZE | |
287 self.assertAlmostEqual(psutil.virtual_memory().inactive, syst, | |
288 delta=MEMORY_TOLERANCE) | |
289 | |
290 @retry_on_failure() | |
291 def test_vmem_wired(self): | |
292 syst = sysctl("vm.stats.vm.v_wire_count") * PAGESIZE | |
293 self.assertAlmostEqual(psutil.virtual_memory().wired, syst, | |
294 delta=MEMORY_TOLERANCE) | |
295 | |
296 @retry_on_failure() | |
297 def test_vmem_cached(self): | |
298 syst = sysctl("vm.stats.vm.v_cache_count") * PAGESIZE | |
299 self.assertAlmostEqual(psutil.virtual_memory().cached, syst, | |
300 delta=MEMORY_TOLERANCE) | |
301 | |
302 @retry_on_failure() | |
303 def test_vmem_free(self): | |
304 syst = sysctl("vm.stats.vm.v_free_count") * PAGESIZE | |
305 self.assertAlmostEqual(psutil.virtual_memory().free, syst, | |
306 delta=MEMORY_TOLERANCE) | |
307 | |
308 @retry_on_failure() | |
309 def test_vmem_buffers(self): | |
310 syst = sysctl("vfs.bufspace") | |
311 self.assertAlmostEqual(psutil.virtual_memory().buffers, syst, | |
312 delta=MEMORY_TOLERANCE) | |
313 | |
314 # --- virtual_memory(); tests against muse | |
315 | |
316 @unittest.skipIf(not MUSE_AVAILABLE, "muse not installed") | |
317 def test_muse_vmem_total(self): | |
318 num = muse('Total') | |
319 self.assertEqual(psutil.virtual_memory().total, num) | |
320 | |
321 @unittest.skipIf(not MUSE_AVAILABLE, "muse not installed") | |
322 @retry_on_failure() | |
323 def test_muse_vmem_active(self): | |
324 num = muse('Active') | |
325 self.assertAlmostEqual(psutil.virtual_memory().active, num, | |
326 delta=MEMORY_TOLERANCE) | |
327 | |
328 @unittest.skipIf(not MUSE_AVAILABLE, "muse not installed") | |
329 @retry_on_failure() | |
330 def test_muse_vmem_inactive(self): | |
331 num = muse('Inactive') | |
332 self.assertAlmostEqual(psutil.virtual_memory().inactive, num, | |
333 delta=MEMORY_TOLERANCE) | |
334 | |
335 @unittest.skipIf(not MUSE_AVAILABLE, "muse not installed") | |
336 @retry_on_failure() | |
337 def test_muse_vmem_wired(self): | |
338 num = muse('Wired') | |
339 self.assertAlmostEqual(psutil.virtual_memory().wired, num, | |
340 delta=MEMORY_TOLERANCE) | |
341 | |
342 @unittest.skipIf(not MUSE_AVAILABLE, "muse not installed") | |
343 @retry_on_failure() | |
344 def test_muse_vmem_cached(self): | |
345 num = muse('Cache') | |
346 self.assertAlmostEqual(psutil.virtual_memory().cached, num, | |
347 delta=MEMORY_TOLERANCE) | |
348 | |
349 @unittest.skipIf(not MUSE_AVAILABLE, "muse not installed") | |
350 @retry_on_failure() | |
351 def test_muse_vmem_free(self): | |
352 num = muse('Free') | |
353 self.assertAlmostEqual(psutil.virtual_memory().free, num, | |
354 delta=MEMORY_TOLERANCE) | |
355 | |
356 @unittest.skipIf(not MUSE_AVAILABLE, "muse not installed") | |
357 @retry_on_failure() | |
358 def test_muse_vmem_buffers(self): | |
359 num = muse('Buffer') | |
360 self.assertAlmostEqual(psutil.virtual_memory().buffers, num, | |
361 delta=MEMORY_TOLERANCE) | |
362 | |
363 def test_cpu_stats_ctx_switches(self): | |
364 self.assertAlmostEqual(psutil.cpu_stats().ctx_switches, | |
365 sysctl('vm.stats.sys.v_swtch'), delta=1000) | |
366 | |
367 def test_cpu_stats_interrupts(self): | |
368 self.assertAlmostEqual(psutil.cpu_stats().interrupts, | |
369 sysctl('vm.stats.sys.v_intr'), delta=1000) | |
370 | |
371 def test_cpu_stats_soft_interrupts(self): | |
372 self.assertAlmostEqual(psutil.cpu_stats().soft_interrupts, | |
373 sysctl('vm.stats.sys.v_soft'), delta=1000) | |
374 | |
375 @retry_on_failure() | |
376 def test_cpu_stats_syscalls(self): | |
377 # pretty high tolerance but it looks like it's OK. | |
378 self.assertAlmostEqual(psutil.cpu_stats().syscalls, | |
379 sysctl('vm.stats.sys.v_syscall'), delta=200000) | |
380 | |
381 # def test_cpu_stats_traps(self): | |
382 # self.assertAlmostEqual(psutil.cpu_stats().traps, | |
383 # sysctl('vm.stats.sys.v_trap'), delta=1000) | |
384 | |
385 # --- swap memory | |
386 | |
387 def test_swapmem_free(self): | |
388 total, used, free = self.parse_swapinfo() | |
389 self.assertAlmostEqual( | |
390 psutil.swap_memory().free, free, delta=MEMORY_TOLERANCE) | |
391 | |
392 def test_swapmem_used(self): | |
393 total, used, free = self.parse_swapinfo() | |
394 self.assertAlmostEqual( | |
395 psutil.swap_memory().used, used, delta=MEMORY_TOLERANCE) | |
396 | |
397 def test_swapmem_total(self): | |
398 total, used, free = self.parse_swapinfo() | |
399 self.assertAlmostEqual( | |
400 psutil.swap_memory().total, total, delta=MEMORY_TOLERANCE) | |
401 | |
402 # --- others | |
403 | |
404 def test_boot_time(self): | |
405 s = sysctl('sysctl kern.boottime') | |
406 s = s[s.find(" sec = ") + 7:] | |
407 s = s[:s.find(',')] | |
408 btime = int(s) | |
409 self.assertEqual(btime, psutil.boot_time()) | |
410 | |
411 # --- sensors_battery | |
412 | |
413 @unittest.skipIf(not HAS_BATTERY, "no battery") | |
414 def test_sensors_battery(self): | |
415 def secs2hours(secs): | |
416 m, s = divmod(secs, 60) | |
417 h, m = divmod(m, 60) | |
418 return "%d:%02d" % (h, m) | |
419 | |
420 out = sh("acpiconf -i 0") | |
421 fields = dict([(x.split('\t')[0], x.split('\t')[-1]) | |
422 for x in out.split("\n")]) | |
423 metrics = psutil.sensors_battery() | |
424 percent = int(fields['Remaining capacity:'].replace('%', '')) | |
425 remaining_time = fields['Remaining time:'] | |
426 self.assertEqual(metrics.percent, percent) | |
427 if remaining_time == 'unknown': | |
428 self.assertEqual(metrics.secsleft, psutil.POWER_TIME_UNLIMITED) | |
429 else: | |
430 self.assertEqual(secs2hours(metrics.secsleft), remaining_time) | |
431 | |
432 @unittest.skipIf(not HAS_BATTERY, "no battery") | |
433 def test_sensors_battery_against_sysctl(self): | |
434 self.assertEqual(psutil.sensors_battery().percent, | |
435 sysctl("hw.acpi.battery.life")) | |
436 self.assertEqual(psutil.sensors_battery().power_plugged, | |
437 sysctl("hw.acpi.acline") == 1) | |
438 secsleft = psutil.sensors_battery().secsleft | |
439 if secsleft < 0: | |
440 self.assertEqual(sysctl("hw.acpi.battery.time"), -1) | |
441 else: | |
442 self.assertEqual(secsleft, sysctl("hw.acpi.battery.time") * 60) | |
443 | |
444 @unittest.skipIf(HAS_BATTERY, "has battery") | |
445 def test_sensors_battery_no_battery(self): | |
446 # If no battery is present one of these calls is supposed | |
447 # to fail, see: | |
448 # https://github.com/giampaolo/psutil/issues/1074 | |
449 with self.assertRaises(RuntimeError): | |
450 sysctl("hw.acpi.battery.life") | |
451 sysctl("hw.acpi.battery.time") | |
452 sysctl("hw.acpi.acline") | |
453 self.assertIsNone(psutil.sensors_battery()) | |
454 | |
455 # --- sensors_temperatures | |
456 | |
457 def test_sensors_temperatures_against_sysctl(self): | |
458 num_cpus = psutil.cpu_count(True) | |
459 for cpu in range(num_cpus): | |
460 sensor = "dev.cpu.%s.temperature" % cpu | |
461 # sysctl returns a string in the format 46.0C | |
462 try: | |
463 sysctl_result = int(float(sysctl(sensor)[:-1])) | |
464 except RuntimeError: | |
465 self.skipTest("temperatures not supported by kernel") | |
466 self.assertAlmostEqual( | |
467 psutil.sensors_temperatures()["coretemp"][cpu].current, | |
468 sysctl_result, delta=10) | |
469 | |
470 sensor = "dev.cpu.%s.coretemp.tjmax" % cpu | |
471 sysctl_result = int(float(sysctl(sensor)[:-1])) | |
472 self.assertEqual( | |
473 psutil.sensors_temperatures()["coretemp"][cpu].high, | |
474 sysctl_result) | |
475 | |
476 # ===================================================================== | |
477 # --- OpenBSD | |
478 # ===================================================================== | |
479 | |
480 | |
481 @unittest.skipIf(not OPENBSD, "OPENBSD only") | |
482 class OpenBSDTestCase(unittest.TestCase): | |
483 | |
484 def test_boot_time(self): | |
485 s = sysctl('kern.boottime') | |
486 sys_bt = datetime.datetime.strptime(s, "%a %b %d %H:%M:%S %Y") | |
487 psutil_bt = datetime.datetime.fromtimestamp(psutil.boot_time()) | |
488 self.assertEqual(sys_bt, psutil_bt) | |
489 | |
490 | |
491 # ===================================================================== | |
492 # --- NetBSD | |
493 # ===================================================================== | |
494 | |
495 | |
496 @unittest.skipIf(not NETBSD, "NETBSD only") | |
497 class NetBSDTestCase(unittest.TestCase): | |
498 | |
499 @staticmethod | |
500 def parse_meminfo(look_for): | |
501 with open('/proc/meminfo', 'rt') as f: | |
502 for line in f: | |
503 if line.startswith(look_for): | |
504 return int(line.split()[1]) * 1024 | |
505 raise ValueError("can't find %s" % look_for) | |
506 | |
507 def test_vmem_total(self): | |
508 self.assertEqual( | |
509 psutil.virtual_memory().total, self.parse_meminfo("MemTotal:")) | |
510 | |
511 def test_vmem_free(self): | |
512 self.assertAlmostEqual( | |
513 psutil.virtual_memory().free, self.parse_meminfo("MemFree:"), | |
514 delta=MEMORY_TOLERANCE) | |
515 | |
516 def test_vmem_buffers(self): | |
517 self.assertAlmostEqual( | |
518 psutil.virtual_memory().buffers, self.parse_meminfo("Buffers:"), | |
519 delta=MEMORY_TOLERANCE) | |
520 | |
521 def test_vmem_shared(self): | |
522 self.assertAlmostEqual( | |
523 psutil.virtual_memory().shared, self.parse_meminfo("MemShared:"), | |
524 delta=MEMORY_TOLERANCE) | |
525 | |
526 def test_swapmem_total(self): | |
527 self.assertAlmostEqual( | |
528 psutil.swap_memory().total, self.parse_meminfo("SwapTotal:"), | |
529 delta=MEMORY_TOLERANCE) | |
530 | |
531 def test_swapmem_free(self): | |
532 self.assertAlmostEqual( | |
533 psutil.swap_memory().free, self.parse_meminfo("SwapFree:"), | |
534 delta=MEMORY_TOLERANCE) | |
535 | |
536 def test_swapmem_used(self): | |
537 smem = psutil.swap_memory() | |
538 self.assertEqual(smem.used, smem.total - smem.free) | |
539 | |
540 def test_cpu_stats_interrupts(self): | |
541 with open('/proc/stat', 'rb') as f: | |
542 for line in f: | |
543 if line.startswith(b'intr'): | |
544 interrupts = int(line.split()[1]) | |
545 break | |
546 else: | |
547 raise ValueError("couldn't find line") | |
548 self.assertAlmostEqual( | |
549 psutil.cpu_stats().interrupts, interrupts, delta=1000) | |
550 | |
551 def test_cpu_stats_ctx_switches(self): | |
552 with open('/proc/stat', 'rb') as f: | |
553 for line in f: | |
554 if line.startswith(b'ctxt'): | |
555 ctx_switches = int(line.split()[1]) | |
556 break | |
557 else: | |
558 raise ValueError("couldn't find line") | |
559 self.assertAlmostEqual( | |
560 psutil.cpu_stats().ctx_switches, ctx_switches, delta=1000) | |
561 | |
562 | |
563 if __name__ == '__main__': | |
564 from psutil.tests.runner import run | |
565 run(__file__) |