You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
89 lines
3.4 KiB
89 lines
3.4 KiB
# Lint as: python2, python3
|
|
# Copyright 2018 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.
|
|
|
|
"""Class for running test inside wrapper tests."""
|
|
|
|
from __future__ import absolute_import
|
|
from __future__ import division
|
|
from __future__ import print_function
|
|
|
|
import json
|
|
import logging
|
|
import six
|
|
|
|
from autotest_lib.client.common_lib import error
|
|
from autotest_lib.server import autotest
|
|
from autotest_lib.server.cros.dynamic_suite import suite
|
|
|
|
|
|
class WrapperTestRunner(object):
|
|
"""A helper class for running test inside wrapper tests.
|
|
|
|
This class takes the tagged test name and finds the test in the autotest
|
|
directory. It also runs the test on the given DUT.
|
|
"""
|
|
|
|
def __init__(self, config, test_dir):
|
|
"""Init WrapperTestRunner.
|
|
|
|
The test to run inside the wrapper test is usually a client side
|
|
autotest. Look up the control file of the inner test, and then prepend
|
|
the args to to the control file to pass the args to the inner test.
|
|
|
|
@param config: the args argument from test_that in a dict, contains the
|
|
test to look up in the autotest directory and the args to
|
|
prepend to the control file.
|
|
required data: {'test': 'test_TestName.tag'}
|
|
@param test_dir: the directory to retrieve the test from.
|
|
"""
|
|
if not config:
|
|
msg = 'Wrapper test must run with args input.'
|
|
raise error.TestNAError(msg)
|
|
if 'test' not in config:
|
|
msg = 'User did not specify client side test to run in wrapper.'
|
|
raise error.TestNAError(msg)
|
|
# test_name is tagged test name.
|
|
self._test_name = config['test']
|
|
|
|
# Find the test in autotest file system.
|
|
fs_getter = suite.create_fs_getter(test_dir)
|
|
predicate = suite.test_name_equals_predicate(self._test_name)
|
|
test = suite.find_and_parse_tests(fs_getter, predicate)
|
|
if not test:
|
|
msg = '%s is not a valid test name.' % self._test_name
|
|
raise error.TestNAError(msg)
|
|
|
|
# If multiple tests with the same name are found, run the first one.
|
|
if len(test) > 1:
|
|
logging.warning('Found %d tests with name %s, running the first '
|
|
'one.', len(test), self._test_name)
|
|
control_file_no_args = test[0].text
|
|
|
|
# Prepend the args.
|
|
args_list = ['='.join((k, str(v))) for k, v in six.iteritems(config)]
|
|
args_string = 'args = ' + json.dumps(args_list)
|
|
args_dict_string = 'args_dict = ' + json.dumps(config)
|
|
control_file_list = [args_string, args_dict_string]
|
|
control_file_list.extend(
|
|
['%s = "%s"' % (k, str(v)) for k, v in six.iteritems(config)])
|
|
control_file_list.append(control_file_no_args)
|
|
|
|
self._test_control_file = '\n'.join(control_file_list)
|
|
|
|
def run_test(self, host):
|
|
"""Run the autotest from its control file on the specified DUT.
|
|
|
|
@param host: CrosHost object representing the DUT.
|
|
"""
|
|
autotest_client = autotest.Autotest(host)
|
|
autotest_client.run(self._test_control_file)
|
|
|
|
def get_tagged_test_name(self):
|
|
"""Return the tagged test name to be run inside the wrapper.
|
|
|
|
@return the tagged test name to be run inside the wrapper.
|
|
"""
|
|
return self._test_name
|