summaryrefslogtreecommitdiffstats
path: root/testing/mozbase/mozpower/mozpower/powerbase.py
diff options
context:
space:
mode:
Diffstat (limited to 'testing/mozbase/mozpower/mozpower/powerbase.py')
-rw-r--r--testing/mozbase/mozpower/mozpower/powerbase.py122
1 files changed, 122 insertions, 0 deletions
diff --git a/testing/mozbase/mozpower/mozpower/powerbase.py b/testing/mozbase/mozpower/mozpower/powerbase.py
new file mode 100644
index 0000000000..3eb91e3e3b
--- /dev/null
+++ b/testing/mozbase/mozpower/mozpower/powerbase.py
@@ -0,0 +1,122 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+import os
+
+from .mozpowerutils import get_logger
+
+
+class IPGExecutableMissingError(Exception):
+ """IPGExecutableMissingError is raised when we cannot find
+ the executable for Intel Power Gadget at the expected location.
+ """
+
+ pass
+
+
+class PlatformUnsupportedError(Exception):
+ """PlatformUnsupportedError is raised when we cannot find
+ an expected IPG path for the OS being tested.
+ """
+
+ pass
+
+
+class PowerBase(object):
+ """PowerBase provides an interface for power measurement objects
+ that depend on the os and cpu. When using this class as a base class
+ the `initialize_power_measurements`, `finalize_power_measurements`,
+ and `get_perfherder_data` functions must be implemented, otherwise
+ a NotImplementedError will be raised.
+
+ PowerBase should only be used as the base class for other
+ classes and should not be instantiated directly. To enforce this
+ restriction calling PowerBase's constructor will raise a
+ NonImplementedError exception.
+
+ ::
+
+ from mozpower.powerbase import PowerBase
+
+ try:
+ pb = PowerBase()
+ except NotImplementedError:
+ print "PowerBase cannot be instantiated."
+
+ """
+
+ def __init__(self, logger_name="mozpower", os=None, cpu=None):
+ """Initializes the PowerBase object.
+
+ :param str logger_name: logging logger name. Defaults to 'mozpower'.
+ :param str os: operating system being tested. Defaults to None.
+ :param str cpu: cpu type being tested (either intel or arm64). Defaults to None.
+ :raises: * NotImplementedError
+ """
+ if self.__class__ == PowerBase:
+ raise NotImplementedError
+
+ self._logger_name = logger_name
+ self._logger = get_logger(logger_name)
+ self._os = os
+ self._cpu = cpu
+ self._ipg_path = self.get_ipg_path()
+
+ @property
+ def ipg_path(self):
+ return self._ipg_path
+
+ @property
+ def logger_name(self):
+ return self._logger_name
+
+ def initialize_power_measurements(self):
+ """Starts power measurement gathering, must be implemented by subclass.
+
+ :raises: * NotImplementedError
+ """
+ raise NotImplementedError
+
+ def finalize_power_measurements(self, test_name="power-testing", **kwargs):
+ """Stops power measurement gathering, must be implemented by subclass.
+
+ :raises: * NotImplementedError
+ """
+ raise NotImplementedError
+
+ def get_perfherder_data(self):
+ """Returns the perfherder data output produced from the tests, must
+ be implemented by subclass.
+
+ :raises: * NotImplementedError
+ """
+ raise NotImplementedError
+
+ def get_ipg_path(self):
+ """Returns the path to where we expect to find Intel Power Gadget
+ depending on the OS being tested. Raises a PlatformUnsupportedError
+ if the OS being tested is unsupported, and raises a IPGExecutableMissingError
+ if the Intel Power Gadget executable cannot be found at the expected
+ location.
+
+ :returns: str
+ :raises: * IPGExecutableMissingError
+ * PlatformUnsupportedError
+ """
+ if self._cpu != "intel":
+ return None
+
+ if self._os == "darwin":
+ exe_path = "/Applications/Intel Power Gadget/PowerLog"
+ else:
+ raise PlatformUnsupportedError(
+ "%s platform currently not supported for Intel Power Gadget measurements"
+ % self._os
+ )
+ if not os.path.exists(exe_path):
+ raise IPGExecutableMissingError(
+ "Intel Power Gadget is not installed, or cannot be found at the location %s"
+ % exe_path
+ )
+
+ return exe_path