# Copyright (c) 2020 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import json
import logging
import os

from autotest_lib.client.common_lib import error
from autotest_lib.server import autotest
from autotest_lib.server import test
from autotest_lib.server.cros.crosperf import device_setup_utils

WAIT_TIME_LOG = 'wait_time.log'

class crosperf_Wrapper(test.test):
    """
    Client test wrapper for crosperf.

    This is a class to run client tests under the crosperf script.

    """
    version = 1

    def run_once(self, test_name, test_args, dut_config_str, dut=None):
        """
        Run a single telemetry test.

        @param test_name: Name of the client test.
        @param test_args: Arguments need to be passed to test.
        @param dut_config_str: A string dumped from json representing DUT
                               configurations.
        @param dut: The autotest host object representing DUT.

        @returns A result of this execution.

        """
        if not test_name:
            raise RuntimeError('Missing client test name to run.')

        if dut_config_str:
            dut_config = json.loads(dut_config_str)
            # Setup device with dut_config arguments before running test.
            wait_time = device_setup_utils.setup_device(dut, dut_config)
            # Wait time can be used to accumulate cooldown time in Crosperf.
            with open(os.path.join(self.resultsdir, WAIT_TIME_LOG), 'w') as f:
                f.write(str(wait_time))

        try:
            # Execute the client side test.
            client_at = autotest.Autotest(dut)
            result = client_at.run_test(test_name, args=test_args)
        except (error.TestFail, error.TestWarn):
            logging.debug('Test did not succeed while executing client test.')
            raise
        except:
            logging.debug('Unexpected failure on client test %s.', test_name)
            raise

        return result
