summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGiampaolo Rodola <g.rodola@gmail.com>2017-05-16 19:54:23 +0200
committerGiampaolo Rodola <g.rodola@gmail.com>2017-05-16 19:54:23 +0200
commitee3b71211b40c97e0d8fcac4a323b18fabc7c080 (patch)
tree819540ad26f337cc5ce7c9540d059ad7dca466b3
parent96e1881c535dc7518cb4dc211a0c26aee5ad2b1c (diff)
downloadpsutil-ee3b71211b40c97e0d8fcac4a323b18fabc7c080.tar.gz
fix #1074: [FreeBSD] sensors_battery() raises OSError in case of no battery.
-rw-r--r--HISTORY.rst1
-rw-r--r--psutil/_psbsd.py6
-rw-r--r--psutil/arch/freebsd/specific.c7
-rwxr-xr-xpsutil/tests/test_bsd.py13
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