| # Copyright 2012 The ChromiumOS Authors |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import logging |
| from autotest_lib.client.common_lib import error |
| from autotest_lib.client.common_lib import utils |
| |
| AUTHOR = "dhaddock@, ahassani@" |
| NAME = "autoupdate_EndToEndTest" |
| METADATA = { |
| "contacts": [ |
| "chromeos-core-services@google.com", |
| "chromeos-sw-engprod@google.com" |
| ], |
| "bug_component": "b:908319", |
| "criteria": "Tests autoupdate between two given versions." |
| } |
| TIME = "MEDIUM" |
| TEST_TYPE = "server" |
| |
| DOC = """ |
| This is an end-to-end update test of ChromeOS releases. Given a test |
| configuration, it will perform an end-to-end test of a ChromeOS update |
| payload. A test configuration can be given as command-line arguments (see |
| below) or instantiated inline as local varibles. |
| |
| To invoke this test locally: |
| |
| test_that <DUT-IPADDR> autoupdate_EndToEndTest --args="<ARGLIST>" |
| |
| where ARGLIST is a whitespace separated list of the following key=value pairs. |
| Values pertaining to the test case include: |
| |
| name=TAG name tag for the test (e.g. 'nmo', 'npo' or 'fsi') |
| update_type=full|delta type of update being applied, either 'full' or 'delta' |
| source_release=REL source image release version (e.g. 2672.0.0) |
| target_release=REL target image release version (e.g. 2673.0.0) |
| source_payload_uri=URI URI of the source full payload. None means don't |
| install a source image (assume it's preinstalled). |
| source_archive_uri=URI (optional) URI of where the artifacts for the source |
| image (e.g. stateful update) are located. If not |
| provided, the test will attempt using the same |
| location as source_payload_uri. This is required for |
| any test where the location of the full (source) |
| payload is separate from that of its build artifacts |
| (e.g. it is in gs://chromeos-releases/). |
| target_payload_uri=URI URI of the target payload |
| target_archive_uri=URI (optional) URI of where the artifacts for the target |
| image (e.g. stateful update) are located. If not |
| provided, the test will attempt using the test job's |
| repo ID (if present), otherwise default to the same |
| location as target_payload_uri. Normally, this is |
| only needed for local (non-AFE) runs where the |
| payload location is separate from that of the build |
| artifacts (e.g. it is in gs://chromeos-releases). |
| |
| |
| To run locally: |
| 1. Find the Google Storage URIs of the images you want to use during the test. |
| You can choose payloads from this bucket: gs://chromeos-releases/ |
| (https://pantheon.corp.google.com/storage/browser/chromeos-releases/) |
| |
| Sample from gs://chromeos-releases: |
| gs://chromeos-releases/dev-channel/samus/9433.0.0/payloads/chromeos_9433.0 |
| .0_samus_dev-channel_full_test.bin-1e2db02f3bd9d9ebe74dc81fc7038919 |
| |
| 2. Choose the DUT you want to use for the test. |
| You can use a DUT on your desk connected to corp or you can lock a DUT |
| in the lab for use in the test. |
| |
| 3. Setup ssh correctly. |
| Follow go/chromeos-lab-duts-ssh to set up password-less SSH for test image |
| DUTs and SSH access to the CrOS labs. |
| |
| 4. Make sure you have your gsutil permissions (your .boto file). |
| Your .boto file must be available inside the chroot. |
| cp ~/.boto chroot/home/<user>/ |
| |
| Make sure the gsutil command is available outside the chroot (note: |
| the gsutil package in Ubuntu is not what you're looking for.) |
| |
| 5. Kick off the test with test_that from a chroot. e.g |
| test_that <IP OF DUT> autoupdate_EndToEndTest |
| --args="target_release=10906.0.0 |
| source_payload_uri='gs://chromeos-releases/canary-channel/nami/10760.0 |
| .0/payloads/chromeos_10760.0.0_nami_canary-channel_full_test |
| .bin-cee25d306d164f7514e26efb34f8f57d' |
| target_payload_uri='gs://chromeos-releases/canary-channel/nami/10906.0 |
| .0/payloads/chromeos_10760.0.0-10906.0.0_nami_canary-channel_delta_test |
| .bin-98f9af8d919605fc3ee1391eaa79c7e6' |
| source_release=10760.0.0 update_type=delta" |
| |
| 6. Unlock any DUTs you locked for debugging when you are done. |
| |
| """ |
| |
| TEST_CONF_KEYS = ( |
| 'name', 'update_type', 'source_release', 'target_release', |
| 'source_payload_uri', 'source_archive_uri', 'target_payload_uri', |
| 'target_archive_uri', 'payload_type') |
| |
| |
| args_dict = utils.args_to_dict(args) |
| |
| # Create test configuration based on command-line arguments (higher precedence, |
| # for test_that invocation) and local variables (lower precedence, |
| # for Autotest front-end invocation). |
| test_conf = {} |
| for key in TEST_CONF_KEYS: |
| test_conf[key] = args_dict.get(key) or locals().get(key) |
| |
| |
| def run_test(machine): |
| """Execute a test configuration on a given machine.""" |
| host = hosts.create_host(machine) |
| try: |
| job.run_test( |
| "autoupdate_EndToEndTest", |
| tag='%s_%s' % (test_conf['name'], test_conf['update_type']), |
| host=host, test_conf=test_conf) |
| except Exception as e: |
| if not issubclass(type(e), error.TestBaseException): |
| error_msg = 'Received test error: %s' % e |
| logging.error(error_msg) |
| raise error.TestError(error_msg) |
| raise |
| |
| |
| # Invoke parallel tests. |
| parallel_simple(run_test, machines) |