| # Copyright (c) 2013 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. |
| |
| """Classes for holding autoupdate_EndToEnd test parameters.""" |
| |
| import common |
| |
| import test_control |
| |
| |
| _DEFAULT_AU_SUITE_NAME = 'au' |
| _additional_suite_names = ', push_to_prod' |
| |
| |
| class TestEnv(object): |
| """Contains and formats the environment arguments of a test.""" |
| |
| def __init__(self, args): |
| """Initial environment arguments object. |
| |
| @param args: parsed program arguments, including test environment ones |
| |
| """ |
| self._env_args_str_local = None |
| self._env_args_str_afe = None |
| |
| # Distill environment arguments from all input arguments. |
| self._env_args = {} |
| omaha_host = vars(args).get('omaha_host') |
| if omaha_host is not None: |
| self._env_args['omaha_host'] = omaha_host |
| |
| |
| def is_var_set(self, var): |
| """Returns true if a variable is set in this environment. |
| |
| @param var: the variable we are interested in |
| |
| """ |
| return var in self._env_args |
| |
| |
| def get_cmdline_args(self): |
| """Return formatted environment arguments for command-line invocation. |
| |
| The formatted string is cached for repeated use. |
| |
| """ |
| if self._env_args_str_local is None: |
| self._env_args_str_local = '' |
| for key, val in self._env_args.iteritems(): |
| # Convert Booleans to 'yes' / 'no'. |
| if val is True: |
| val = 'yes' |
| elif val is False: |
| val = 'no' |
| |
| self._env_args_str_local += ' %s=%s' % (key, val) |
| |
| return self._env_args_str_local |
| |
| |
| def get_code_args(self): |
| """Return formatted environment arguments for inline assignment. |
| |
| The formatted string is cached for repeated use. |
| |
| """ |
| if self._env_args_str_afe is None: |
| self._env_args_str_afe = '' |
| for key, val in self._env_args.iteritems(): |
| # Everything becomes a string, except for Booleans. |
| if type(val) is bool: |
| self._env_args_str_afe += "%s = %s\n" % (key, val) |
| else: |
| self._env_args_str_afe += "%s = '%s'\n" % (key, val) |
| |
| return self._env_args_str_afe |
| |
| |
| class TestConfig(object): |
| """A single test configuration. |
| |
| Stores and generates arguments for running autotest_EndToEndTest. |
| |
| """ |
| def __init__(self, board, name, is_delta_update, source_release, |
| target_release, source_payload_uri, target_payload_uri, |
| suite_name=_DEFAULT_AU_SUITE_NAME, source_archive_uri=None): |
| """Initialize a test configuration. |
| |
| @param board: the board being tested (e.g. 'x86-alex') |
| @param name: a descriptive name of the test |
| @param is_delta_update: whether this is a delta update test (Boolean) |
| @param source_release: the source image version (e.g. '2672.0.0') |
| @param target_release: the target image version (e.g. '2673.0.0') |
| @param source_payload_uri: source payload URI ('gs://...') or None |
| @param target_payload_uri: target payload URI ('gs://...') |
| @param suite_name: the name of the test suite (default: 'au') |
| @param source_archive_uri: location of source build artifacts |
| |
| """ |
| self.board = board |
| self.name = name |
| self.is_delta_update = is_delta_update |
| self.source_release = source_release |
| self.target_release = target_release |
| self.source_payload_uri = source_payload_uri |
| self.target_payload_uri = target_payload_uri |
| self.suite_name = suite_name |
| self.source_archive_uri = source_archive_uri |
| |
| |
| def get_update_type(self): |
| return 'delta' if self.is_delta_update else 'full' |
| |
| |
| def unique_name_suffix(self): |
| """Unique name suffix for the test config given the target version.""" |
| return '%s_%s_%s' % (self.name, |
| 'delta' if self.is_delta_update else 'full', |
| self.source_release) |
| |
| |
| def get_autotest_name(self): |
| """Returns job name to use when creating an autotest job. |
| |
| Returns a job name that conforms to the suite naming style. |
| |
| """ |
| return '%s-release/%s/%s/%s.%s' % ( |
| self.board, self.target_release, self.suite_name, |
| test_control.get_test_name(), self.unique_name_suffix()) |
| |
| |
| def get_control_file_name(self): |
| """Returns the name of the name of the control file to store this in. |
| |
| Returns the control file name that should be generated for this test. |
| A unique name suffix is used to keep from collisions per target |
| release/board. |
| """ |
| return 'control.%s' % self.unique_name_suffix() |
| |
| |
| def __str__(self): |
| """Short textual representation w/o image/payload URIs.""" |
| return ('[%s/%s/%s/%s -> %s]' % |
| (self.board, self.name, self.get_update_type(), |
| self.source_release, self.target_release)) |
| |
| |
| def __repr__(self): |
| """Full textual representation w/ image/payload URIs.""" |
| return '\n'.join([str(self), |
| 'source payload : %s' % self.source_payload_uri, |
| 'target payload : %s' % self.target_payload_uri]) |
| |
| |
| def _get_args(self, assign, delim, is_quote_val): |
| template = "%s%s'%s'" if is_quote_val else "%s%s%s" |
| arg_values = [ |
| ('name', self.name), |
| ('update_type', self.get_update_type()), |
| ('source_release', self.source_release), |
| ('target_release', self.target_release), |
| ('target_payload_uri', self.target_payload_uri), |
| ('SUITE', self.suite_name) |
| ] |
| if self.source_payload_uri: |
| arg_values.append(('source_payload_uri', self.source_payload_uri)) |
| if self.source_archive_uri: |
| arg_values.append(('source_archive_uri', self.source_archive_uri)) |
| |
| return delim.join( |
| [template % (key, assign, val) for key, val in arg_values]) |
| |
| |
| def get_cmdline_args(self): |
| return self._get_args('=', ' ', False) |
| |
| |
| def get_code_args(self): |
| args = self._get_args(' = ', '\n', True) |
| return args + '\n' if args else '' |