File size: 4,408 Bytes
9c6594c |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 |
#!/usr/bin/env python3
# Copyright (c) 2009, Giampaolo Rodola'
# Copyright (c) 2017, Arnon Yaari
# All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""AIX specific tests."""
import re
import psutil
from psutil import AIX
from psutil.tests import PsutilTestCase
from psutil.tests import pytest
from psutil.tests import sh
@pytest.mark.skipif(not AIX, reason="AIX only")
class AIXSpecificTestCase(PsutilTestCase):
def test_virtual_memory(self):
out = sh('/usr/bin/svmon -O unit=KB')
re_pattern = r"memory\s*"
for field in [
"size",
"inuse",
"free",
"pin",
"virtual",
"available",
"mmode",
]:
re_pattern += rf"(?P<{field}>\S+)\s+"
matchobj = re.search(re_pattern, out)
assert matchobj is not None
KB = 1024
total = int(matchobj.group("size")) * KB
available = int(matchobj.group("available")) * KB
used = int(matchobj.group("inuse")) * KB
free = int(matchobj.group("free")) * KB
psutil_result = psutil.virtual_memory()
# TOLERANCE_SYS_MEM from psutil.tests is not enough. For some reason
# we're seeing differences of ~1.2 MB. 2 MB is still a good tolerance
# when compared to GBs.
TOLERANCE_SYS_MEM = 2 * KB * KB # 2 MB
assert psutil_result.total == total
assert abs(psutil_result.used - used) < TOLERANCE_SYS_MEM
assert abs(psutil_result.available - available) < TOLERANCE_SYS_MEM
assert abs(psutil_result.free - free) < TOLERANCE_SYS_MEM
def test_swap_memory(self):
out = sh('/usr/sbin/lsps -a')
# From the man page, "The size is given in megabytes" so we assume
# we'll always have 'MB' in the result
# TODO maybe try to use "swap -l" to check "used" too, but its units
# are not guaranteed to be "MB" so parsing may not be consistent
matchobj = re.search(
r"(?P<space>\S+)\s+"
r"(?P<vol>\S+)\s+"
r"(?P<vg>\S+)\s+"
r"(?P<size>\d+)MB",
out,
)
assert matchobj is not None
total_mb = int(matchobj.group("size"))
MB = 1024**2
psutil_result = psutil.swap_memory()
# we divide our result by MB instead of multiplying the lsps value by
# MB because lsps may round down, so we round down too
assert int(psutil_result.total / MB) == total_mb
def test_cpu_stats(self):
out = sh('/usr/bin/mpstat -a')
re_pattern = r"ALL\s*"
for field in [
"min",
"maj",
"mpcs",
"mpcr",
"dev",
"soft",
"dec",
"ph",
"cs",
"ics",
"bound",
"rq",
"push",
"S3pull",
"S3grd",
"S0rd",
"S1rd",
"S2rd",
"S3rd",
"S4rd",
"S5rd",
"sysc",
]:
re_pattern += rf"(?P<{field}>\S+)\s+"
matchobj = re.search(re_pattern, out)
assert matchobj is not None
# numbers are usually in the millions so 1000 is ok for tolerance
CPU_STATS_TOLERANCE = 1000
psutil_result = psutil.cpu_stats()
assert (
abs(psutil_result.ctx_switches - int(matchobj.group("cs")))
< CPU_STATS_TOLERANCE
)
assert (
abs(psutil_result.syscalls - int(matchobj.group("sysc")))
< CPU_STATS_TOLERANCE
)
assert (
abs(psutil_result.interrupts - int(matchobj.group("dev")))
< CPU_STATS_TOLERANCE
)
assert (
abs(psutil_result.soft_interrupts - int(matchobj.group("soft")))
< CPU_STATS_TOLERANCE
)
def test_cpu_count_logical(self):
out = sh('/usr/bin/mpstat -a')
mpstat_lcpu = int(re.search(r"lcpu=(\d+)", out).group(1))
psutil_lcpu = psutil.cpu_count(logical=True)
assert mpstat_lcpu == psutil_lcpu
def test_net_if_addrs_names(self):
out = sh('/etc/ifconfig -l')
ifconfig_names = set(out.split())
psutil_names = set(psutil.net_if_addrs().keys())
assert ifconfig_names == psutil_names
|