# Copyright 2018 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Base class for power measurement tests with telemetry devices."""

import os

from autotest_lib.server import test
from autotest_lib.server.cros.power import wrapper_test_runner


class PowerBaseWrapper(test.test):
    """Base class for a wrapper test around a client test.

    This wrapper test runs 1 client test given by user, and measures DUT power
    with external power measurement tools.
    """
    version = 1

    def run_once(self, host, config):
        """Measure power while running the client side test.

        @param host: CrosHost object representing the DUT.
        @param config: the args argument from test_that in a dict.
                       required data: {'test': 'test_TestName.tag'}
        """
        test_runner = wrapper_test_runner.WrapperTestRunner(
                config, self.autodir)
        client_test_name = test_runner.get_tagged_test_name()
        ptl = self._get_power_telemetry_logger(host, config, self.resultsdir)
        try:
            ptl.start_measurement()
            test_runner.run_test(host)
        finally:
            client_test_dir = os.path.join(self.outputdir, client_test_name)
            # If client test name is not tagged in its own control file.
            if not os.path.isdir(client_test_dir):
                client_test_name = client_test_name.split('.', 1)[0]
                client_test_dir = os.path.join(self.outputdir, client_test_name)
            ptl.end_measurement(client_test_dir)

        return

    def _get_power_telemetry_logger(self, host, config, resultsdir):
        """Return the corresponding power telemetry logger.

        @param host: CrosHost object representing the DUT.
        @param config: the args argument from test_that in a dict. Settings for
                       power telemetry devices.
                       required data: {'test': 'test_TestName.tag'}
        @param resultsdir: path to directory where current autotest results are
                           stored, e.g. /tmp/test_that_results/
                           results-1-test_TestName.tag/test_TestName.tag/
                           results/
        """
        raise NotImplementedError('Subclasses must implement '
                '_get_power_telemetry_logger and return the corresponding '
                'power telemetry logger.')
