普通文本  |  95行  |  3.59 KB

# Copyright (c) 2012 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.


""" The autotest performing FW update, both EC and AP."""


import logging
import sys

from autotest_lib.client.common_lib import error
from autotest_lib.server import test


class provision_FirmwareUpdate(test.test):
    """A test that can provision a machine to the correct firmware version."""

    version = 1


    def stage_image_to_usb(self, host):
        """Stage the current ChromeOS image on the USB stick connected to the
        servo.

        @param host:  a CrosHost object of the machine to update.
        """
        info = host.host_info_store.get()
        if not info.build:
            logging.warning('Failed to get build label from the DUT, skip '
                            'staging ChromeOS image on the servo USB stick.')
        else:
            host.servo.image_to_servo_usb(
                    host.stage_image_for_servo(info.build))
            logging.debug('ChromeOS image %s is staged on the USB stick.',
                          info.build)

    def get_ro_firmware_ver(self, host):
        """Get the RO firmware version from the host."""
        result = host.run('crossystem ro_fwid', ignore_status=True)
        if result.exit_status == 0:
            # The firmware ID is something like "Google_Board.1234.56.0".
            # Remove the prefix "Google_Board".
            return result.stdout.split('.', 1)[1]
        else:
            return None

    def get_rw_firmware_ver(self, host):
        """Get the RW firmware version from the host."""
        result = host.run('crossystem fwid', ignore_status=True)
        if result.exit_status == 0:
            # The firmware ID is something like "Google_Board.1234.56.0".
            # Remove the prefix "Google_Board".
            return result.stdout.split('.', 1)[1]
        else:
            return None

    def run_once(self, host, value, rw_only=False, stage_image_to_usb=False):
        """The method called by the control file to start the test.

        @param host:  a CrosHost object of the machine to update.
        @param value: the provisioning value, which is the build version
                      to which we want to provision the machine,
                      e.g. 'link-firmware/R22-2695.1.144'.
        @param rw_only: True to only update the RW firmware.
        @param stage_image_to_usb: True to stage the current ChromeOS image on
                the USB stick connected to the servo. Default is False.
        """
        try:
            host.repair_servo()

            # Stage the current CrOS image to servo USB stick.
            if stage_image_to_usb:
                self.stage_image_to_usb(host)

            host.firmware_install(build=value, rw_only=rw_only)
        except Exception as e:
            logging.error(e)
            raise error.TestFail, str(e), sys.exc_info()[2]

        # DUT reboots after the above firmware_install(). Wait it to boot.
        host.test_wait_for_boot()

        # Only care about the version number.
        firmware_ver = value.rsplit('-', 1)[1]
        if not rw_only:
            current_ro_ver = self.get_ro_firmware_ver(host)
            if current_ro_ver != firmware_ver:
                raise error.TestFail('Failed to update RO, still version %s' %
                                     current_ro_ver)
        current_rw_ver = self.get_rw_firmware_ver(host)
        if current_rw_ver != firmware_ver:
            raise error.TestFail('Failed to update RW, still version %s' %
                                 current_rw_ver)