# 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 ''