Source code

Revision control

Copy as Markdown

Other Tools

# 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