Home | History | Annotate | Download | only in autoupdate_EndToEndTest
      1 # Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
      2 # Use of this source code is governed by a BSD-style license that can be
      3 # found in the LICENSE file.
      4 
      5 import logging
      6 from autotest_lib.client.common_lib import error, utils
      7 from autotest_lib.client.cros import constants
      8 from autotest_lib.server import host_attributes
      9 
     10 AUTHOR = "Chromium OS"
     11 NAME = "autoupdate_EndToEndTest"
     12 TIME = "MEDIUM"
     13 TEST_CATEGORY = "Functional"
     14 TEST_CLASS = "platform"
     15 TEST_TYPE = "server"
     16 JOB_RETRIES = 1
     17 BUG_TEMPLATE = {
     18     'cc': ['chromeos-installer-alerts (a] google.com'],
     19     'labels': ['Cr-Internals-Installer'],
     20 }
     21 
     22 # Disable server-side packaging support for this test.
     23 # This control file is used as the template for paygen_au_canary suite, which
     24 # creates the control files during paygen. Therefore, autotest server package
     25 # does not have these test control files for paygen_au_canary suite.
     26 REQUIRE_SSP = False
     27 
     28 DOC = """
     29 This is an end-to-end update test of Chrome OS releases. Given a test
     30 configuration, it will perform an end-to-end test of a Chrome OS update
     31 payload. A test configuration can be given as command-line arguments (see
     32 below) or instantiated inline as local varibles.
     33 
     34 To invoke this test locally:
     35 
     36   test_that --args="<ARGLIST>" <DUT-IPADDR> autoupdate_EndToEndTest
     37 
     38 where ARGLIST is a whitespace separated list of the following key=value pairs.
     39 Values pertaining to the test case include:
     40 
     41   name=TAG           name tag for the test (e.g. 'nmo', 'npo' or 'fsi')
     42   update_type=full|delta  type of update being applied, either 'full' or 'delta'
     43   source_release=REL      source image release version (e.g. 2672.0.0)
     44   target_release=REL      target image release version (e.g. 2673.0.0)
     45   source_payload_uri=URI  URI of the source full payload. None means don't
     46                           install a source image (assume it's preinstalled).
     47   source_archive_uri=URI  (optional) URI of where the artifacts for the source
     48                           image (e.g.  stateful update) are located. If not
     49                           provided, the test will attempt using the same
     50                           location as source_payload_uri.  This is required for
     51                           any test where the location of the full (source)
     52                           payload is separate from that of its build artifacts
     53                           (e.g. it is in gs://chromeos-releases/).
     54   target_payload_uri=URI  URI of the target payload
     55   target_archive_uri=URI  (optional) URI of where the artifacts for the target
     56                           image (e.g. stateful update) are located. If not
     57                           provided, the test will attempt using the test job's
     58                           repo ID (if present), otherwise default to the same
     59                           location as target_payload_uri.  Normally, this is
     60                           only needed for local (non-AFE) runs where the
     61                           payload location is separate from that of the build
     62                           artifacts (e.g. it is in gs://chromeos-releases).
     63 
     64 Please note, this test spawns omaha server instances (devserver) on a devserver
     65 configured in your global_config using autotest's ssh mechanism. This means that
     66 if you are running this locally and intend to use a local devserver, you will
     67 need to setup your ssh keys for public key authentication e.g. create keys,
     68 ssh-add the private key, add the public key to your authorized keys and finally
     69 enable public key authentication in your sshd config.
     70 
     71 To run locally:
     72   Create src/third_party/autotest/files/shadow_config.ini:
     73     [CROS]
     74     devserver_dir = <full repo path>/src/platform/dev
     75     dev_server = http://<hostname>:8080
     76 
     77   Configure SSH for passwordless loopback access to your account.
     78     ssh-keygen (If you don't already have SSH keys setup)
     79     cp ~/.ssh/id_rsa chroot/home/<user>/.ssh/
     80 
     81     # This is NOT permanent, you'll have to redo it about once a day.
     82     sudo sed -i 's/PubkeyAuthentication no/PubkeyAuthentication yes/' \
     83         /etc/ssh/sshd_config
     84     sudo /etc/init.d/ssh restart
     85 
     86     Enter a chroot, and ssh to <hostname>. If it doesn't work, fix that.
     87 
     88   Make sure you have your gsutil permissions (your .boto file).
     89     Your .boto file must be available inside the chroot.
     90     cp ~/.boto chroot/home/<user>/
     91 
     92   Make sure the gsutil command is available outside the chroot (note:
     93   the gsutil package in Ubuntu is not what you're looking for.)
     94 
     95   Start a devserver (outside the chroot):
     96     src/platform/dev/devserver.py
     97 
     98   (Note: DO NOT use start_devserver! Even though it gives the impression of
     99   running the server outside the chroot, it actually starts a chroot and runs
    100   the server inside of it.)
    101 
    102   To make sure your test edits are used:
    103     cros_sdk
    104     cros_workon start autotest
    105 
    106   Example:
    107     cros_sdk
    108     test_that <dut_ip> autoupdate_EndToEndTest \
    109       --args="target_release=<Target Build Id> \
    110               source_payload_uri=<Full Payload URI> \
    111               target_payload_uri=<Tested Payload URI>"
    112 
    113   Sample full payload URL:
    114     gs://chromeos-image-archive/lumpy-release/R30-4462.0.0/
    115     chromeos_R30-4462.0.0_lumpy_full_dev.bin
    116 
    117   Sample target build id:
    118     4463.0.0
    119 
    120   Sample test payload URL:
    121     gs://chromeos-image-archive/lumpy-release/R30-4463.0.0/
    122     chromeos_R30-4462.0.0_R30-4463.0.0_lumpy_delta_dev.bin
    123 """
    124 
    125 TEST_CONF_KEYS = (
    126     'name', 'update_type', 'source_release', 'target_release',
    127     'source_payload_uri', 'source_archive_uri', 'target_payload_uri',
    128     'target_archive_uri')
    129 
    130 
    131 args_dict = utils.args_to_dict(args)
    132 
    133 # Create test configuration based on command-line arguments (higher precedence,
    134 # for test_that invocation) and local variables (lower precedence,
    135 # for Autotest front-end invocation).
    136 test_conf = {}
    137 for key in TEST_CONF_KEYS:
    138     test_conf[key] = args_dict.get(key) or locals().get(key)
    139 
    140 
    141 def run_test(machine):
    142     """Execute a test configuration on a given machine."""
    143     host = hosts.create_host(machine)
    144     # Save preserved log after autoupdate is completed.
    145     job.sysinfo.add_logdir(constants.AUTOUPDATE_PRESERVE_LOG)
    146     try:
    147         job.run_test(
    148                 "autoupdate_EndToEndTest",
    149                 tag='%s_%s' % (test_conf['name'], test_conf['update_type']),
    150                 host=host, test_conf=test_conf)
    151     except Exception as e:
    152         if not issubclass(type(e), error.TestBaseException):
    153             error_msg = 'Received test error: %s' % e
    154             logging.error(error_msg)
    155             raise error.TestError(error_msg)
    156 
    157         raise
    158 
    159 
    160 # Invoke parallel tests.
    161 parallel_simple(run_test, machines)
    162