diff options
author | Giampaolo Rodola <g.rodola@gmail.com> | 2017-05-16 19:54:23 +0200 |
---|---|---|
committer | Giampaolo Rodola <g.rodola@gmail.com> | 2017-05-16 19:54:23 +0200 |
commit | ee3b71211b40c97e0d8fcac4a323b18fabc7c080 (patch) | |
tree | 819540ad26f337cc5ce7c9540d059ad7dca466b3 | |
parent | 96e1881c535dc7518cb4dc211a0c26aee5ad2b1c (diff) | |
download | psutil-ee3b71211b40c97e0d8fcac4a323b18fabc7c080.tar.gz |
fix #1074: [FreeBSD] sensors_battery() raises OSError in case of no battery.
-rw-r--r-- | HISTORY.rst | 1 | ||||
-rw-r--r-- | psutil/_psbsd.py | 6 | ||||
-rw-r--r-- | psutil/arch/freebsd/specific.c | 7 | ||||
-rwxr-xr-x | psutil/tests/test_bsd.py | 13 |
4 files changed, 25 insertions, 2 deletions
diff --git a/HISTORY.rst b/HISTORY.rst index 33f8db8e..080aaa86 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -58,6 +58,7 @@ - 1067_: [NetBSD] Process.cmdline() leaks memory if proces has terminated. - 1069_: [FreeBSD] Process.cpu_num() may return 255 for certain kernel processes. +- 1074_: [FreeBSD] sensors_battery() raises OSError in case of no battery. **Porting notes** diff --git a/psutil/_psbsd.py b/psutil/_psbsd.py index 8b44deeb..7de6b73d 100644 --- a/psutil/_psbsd.py +++ b/psutil/_psbsd.py @@ -408,7 +408,11 @@ if FREEBSD: def sensors_battery(): """Return battery info.""" - percent, minsleft, power_plugged = cext.sensors_battery() + try: + percent, minsleft, power_plugged = cext.sensors_battery() + except NotImplementedError: + # see: https://github.com/giampaolo/psutil/issues/1074 + return None power_plugged = power_plugged == 1 if power_plugged: secsleft = _common.POWER_TIME_UNLIMITED diff --git a/psutil/arch/freebsd/specific.c b/psutil/arch/freebsd/specific.c index 46bf3868..8d09ad89 100644 --- a/psutil/arch/freebsd/specific.c +++ b/psutil/arch/freebsd/specific.c @@ -1000,5 +1000,10 @@ psutil_sensors_battery(PyObject *self, PyObject *args) { return Py_BuildValue("iii", percent, minsleft, power_plugged); error: - return PyErr_SetFromErrno(PyExc_OSError); + // see: https://github.com/giampaolo/psutil/issues/1074 + if (errno == ENOENT) + PyErr_SetString(PyExc_NotImplementedError, "no battery"); + else + PyErr_SetFromErrno(PyExc_OSError); + return NULL; } diff --git a/psutil/tests/test_bsd.py b/psutil/tests/test_bsd.py index 3d644c92..aa7ad3d2 100755 --- a/psutil/tests/test_bsd.py +++ b/psutil/tests/test_bsd.py @@ -21,6 +21,7 @@ from psutil import FREEBSD from psutil import NETBSD from psutil import OPENBSD from psutil.tests import get_test_subprocess +from psutil.tests import HAS_BATTERY from psutil.tests import MEMORY_TOLERANCE from psutil.tests import reap_children from psutil.tests import retry_before_failing @@ -354,6 +355,7 @@ class FreeBSDSpecificTestCase(unittest.TestCase): # --- sensors_battery + @unittest.skipIf(not HAS_BATTERY, "no battery") def test_sensors_battery(self): def secs2hours(secs): m, s = divmod(secs, 60) @@ -372,6 +374,7 @@ class FreeBSDSpecificTestCase(unittest.TestCase): else: self.assertEqual(secs2hours(metrics.secsleft), remaining_time) + @unittest.skipIf(not HAS_BATTERY, "no battery") def test_sensors_battery_against_sysctl(self): self.assertEqual(psutil.sensors_battery().percent, sysctl("hw.acpi.battery.life")) @@ -383,6 +386,16 @@ class FreeBSDSpecificTestCase(unittest.TestCase): else: self.assertEqual(secsleft, sysctl("hw.acpi.battery.time") * 60) + @unittest.skipIf(HAS_BATTERY, "has battery") + def test_sensors_battery_no_battery(self): + # If no battery is present one of these calls is supposed + # to fail, see: + # https://github.com/giampaolo/psutil/issues/1074 + with self.assertRaises(RuntimeError): + sysctl("hw.acpi.battery.life") + sysctl("hw.acpi.battery.time") + sysctl("hw.acpi.acline") + # ===================================================================== # --- OpenBSD |