| Index: build/android/devil/android/fastboot_utils.py
 | 
| diff --git a/build/android/devil/android/fastboot_utils.py b/build/android/devil/android/fastboot_utils.py
 | 
| deleted file mode 100644
 | 
| index 587f42fd02ce0bec28a2521c5afa9c65d30c0bbc..0000000000000000000000000000000000000000
 | 
| --- a/build/android/devil/android/fastboot_utils.py
 | 
| +++ /dev/null
 | 
| @@ -1,245 +0,0 @@
 | 
| -# Copyright 2015 The Chromium Authors. All rights reserved.
 | 
| -# Use of this source code is governed by a BSD-style license that can be
 | 
| -# found in the LICENSE file.
 | 
| -
 | 
| -"""Provides a variety of device interactions based on fastboot."""
 | 
| -# pylint: disable=unused-argument
 | 
| -
 | 
| -import contextlib
 | 
| -import fnmatch
 | 
| -import logging
 | 
| -import os
 | 
| -import re
 | 
| -
 | 
| -from devil.android import decorators
 | 
| -from devil.android import device_errors
 | 
| -from devil.android.sdk import fastboot
 | 
| -from devil.utils import timeout_retry
 | 
| -
 | 
| -_DEFAULT_TIMEOUT = 30
 | 
| -_DEFAULT_RETRIES = 3
 | 
| -_FASTBOOT_REBOOT_TIMEOUT = 10 * _DEFAULT_TIMEOUT
 | 
| -ALL_PARTITIONS = [
 | 
| -    'bootloader',
 | 
| -    'radio',
 | 
| -    'boot',
 | 
| -    'recovery',
 | 
| -    'system',
 | 
| -    'userdata',
 | 
| -    'cache',
 | 
| -]
 | 
| -
 | 
| -class FastbootUtils(object):
 | 
| -
 | 
| -  _FASTBOOT_WAIT_TIME = 1
 | 
| -  _RESTART_WHEN_FLASHING = ['bootloader', 'radio']
 | 
| -  _BOARD_VERIFICATION_FILE = 'android-info.txt'
 | 
| -  _FLASH_IMAGE_FILES = {
 | 
| -      'bootloader': 'bootloader*.img',
 | 
| -      'radio': 'radio*.img',
 | 
| -      'boot': 'boot.img',
 | 
| -      'recovery': 'recovery.img',
 | 
| -      'system': 'system.img',
 | 
| -      'userdata': 'userdata.img',
 | 
| -      'cache': 'cache.img',
 | 
| -  }
 | 
| -
 | 
| -  def __init__(self, device, fastbooter=None, default_timeout=_DEFAULT_TIMEOUT,
 | 
| -               default_retries=_DEFAULT_RETRIES):
 | 
| -    """FastbootUtils constructor.
 | 
| -
 | 
| -    Example Usage to flash a device:
 | 
| -      fastboot = fastboot_utils.FastbootUtils(device)
 | 
| -      fastboot.FlashDevice('/path/to/build/directory')
 | 
| -
 | 
| -    Args:
 | 
| -      device: A DeviceUtils instance.
 | 
| -      fastbooter: Optional fastboot object. If none is passed, one will
 | 
| -        be created.
 | 
| -      default_timeout: An integer containing the default number of seconds to
 | 
| -        wait for an operation to complete if no explicit value is provided.
 | 
| -      default_retries: An integer containing the default number or times an
 | 
| -        operation should be retried on failure if no explicit value is provided.
 | 
| -    """
 | 
| -    self._device = device
 | 
| -    self._board = device.product_board
 | 
| -    self._serial = str(device)
 | 
| -    self._default_timeout = default_timeout
 | 
| -    self._default_retries = default_retries
 | 
| -    if fastbooter:
 | 
| -      self.fastboot = fastbooter
 | 
| -    else:
 | 
| -      self.fastboot = fastboot.Fastboot(self._serial)
 | 
| -
 | 
| -  @decorators.WithTimeoutAndRetriesFromInstance()
 | 
| -  def WaitForFastbootMode(self, timeout=None, retries=None):
 | 
| -    """Wait for device to boot into fastboot mode.
 | 
| -
 | 
| -    This waits for the device serial to show up in fastboot devices output.
 | 
| -    """
 | 
| -    def fastboot_mode():
 | 
| -      return self._serial in self.fastboot.Devices()
 | 
| -
 | 
| -    timeout_retry.WaitFor(fastboot_mode, wait_period=self._FASTBOOT_WAIT_TIME)
 | 
| -
 | 
| -  @decorators.WithTimeoutAndRetriesFromInstance(
 | 
| -      min_default_timeout=_FASTBOOT_REBOOT_TIMEOUT)
 | 
| -  def EnableFastbootMode(self, timeout=None, retries=None):
 | 
| -    """Reboots phone into fastboot mode.
 | 
| -
 | 
| -    Roots phone if needed, then reboots phone into fastboot mode and waits.
 | 
| -    """
 | 
| -    self._device.EnableRoot()
 | 
| -    self._device.adb.Reboot(to_bootloader=True)
 | 
| -    self.WaitForFastbootMode()
 | 
| -
 | 
| -  @decorators.WithTimeoutAndRetriesFromInstance(
 | 
| -      min_default_timeout=_FASTBOOT_REBOOT_TIMEOUT)
 | 
| -  def Reboot(self, bootloader=False, timeout=None, retries=None):
 | 
| -    """Reboots out of fastboot mode.
 | 
| -
 | 
| -    It reboots the phone either back into fastboot, or to a regular boot. It
 | 
| -    then blocks until the device is ready.
 | 
| -
 | 
| -    Args:
 | 
| -      bootloader: If set to True, reboots back into bootloader.
 | 
| -    """
 | 
| -    if bootloader:
 | 
| -      self.fastboot.RebootBootloader()
 | 
| -      self.WaitForFastbootMode()
 | 
| -    else:
 | 
| -      self.fastboot.Reboot()
 | 
| -      self._device.WaitUntilFullyBooted(timeout=_FASTBOOT_REBOOT_TIMEOUT)
 | 
| -
 | 
| -  def _VerifyBoard(self, directory):
 | 
| -    """Validate as best as possible that the android build matches the device.
 | 
| -
 | 
| -    Goes through build files and checks if the board name is mentioned in the
 | 
| -    |self._BOARD_VERIFICATION_FILE| or in the build archive.
 | 
| -
 | 
| -    Args:
 | 
| -      directory: directory where build files are located.
 | 
| -    """
 | 
| -    files = os.listdir(directory)
 | 
| -    board_regex = re.compile(r'require board=(\w+)')
 | 
| -    if self._BOARD_VERIFICATION_FILE in files:
 | 
| -      with open(os.path.join(directory, self._BOARD_VERIFICATION_FILE)) as f:
 | 
| -        for line in f:
 | 
| -          m = board_regex.match(line)
 | 
| -          if m:
 | 
| -            board_name = m.group(1)
 | 
| -            if board_name == self._board:
 | 
| -              return True
 | 
| -            elif board_name:
 | 
| -              return False
 | 
| -            else:
 | 
| -              logging.warning('No board type found in %s.',
 | 
| -                              self._BOARD_VERIFICATION_FILE)
 | 
| -    else:
 | 
| -      logging.warning('%s not found. Unable to use it to verify device.',
 | 
| -                      self._BOARD_VERIFICATION_FILE)
 | 
| -
 | 
| -    zip_regex = re.compile(r'.*%s.*\.zip' % re.escape(self._board))
 | 
| -    for f in files:
 | 
| -      if zip_regex.match(f):
 | 
| -        return True
 | 
| -
 | 
| -    return False
 | 
| -
 | 
| -  def _FindAndVerifyPartitionsAndImages(self, partitions, directory):
 | 
| -    """Validate partitions and images.
 | 
| -
 | 
| -    Validate all partition names and partition directories. Cannot stop mid
 | 
| -    flash so its important to validate everything first.
 | 
| -
 | 
| -    Args:
 | 
| -      Partitions: partitions to be tested.
 | 
| -      directory: directory containing the images.
 | 
| -
 | 
| -    Returns:
 | 
| -      Dictionary with exact partition, image name mapping.
 | 
| -    """
 | 
| -    files = os.listdir(directory)
 | 
| -
 | 
| -    def find_file(pattern):
 | 
| -      for filename in files:
 | 
| -        if fnmatch.fnmatch(filename, pattern):
 | 
| -          return os.path.join(directory, filename)
 | 
| -      raise device_errors.FastbootCommandFailedError(
 | 
| -          'Failed to flash device. Counld not find image for %s.', pattern)
 | 
| -
 | 
| -    return {name: find_file(self._FLASH_IMAGE_FILES[name])
 | 
| -            for name in partitions}
 | 
| -
 | 
| -  def _FlashPartitions(self, partitions, directory, wipe=False, force=False):
 | 
| -    """Flashes all given partiitons with all given images.
 | 
| -
 | 
| -    Args:
 | 
| -      partitions: List of partitions to flash.
 | 
| -      directory: Directory where all partitions can be found.
 | 
| -      wipe: If set to true, will automatically detect if cache and userdata
 | 
| -          partitions are sent, and if so ignore them.
 | 
| -      force: boolean to decide to ignore board name safety checks.
 | 
| -
 | 
| -    Raises:
 | 
| -      device_errors.CommandFailedError(): If image cannot be found or if bad
 | 
| -          partition name is give.
 | 
| -    """
 | 
| -    if not self._VerifyBoard(directory):
 | 
| -      if force:
 | 
| -        logging.warning('Could not verify build is meant to be installed on '
 | 
| -                        'the current device type, but force flag is set. '
 | 
| -                        'Flashing device. Possibly dangerous operation.')
 | 
| -      else:
 | 
| -        raise device_errors.CommandFailedError(
 | 
| -            'Could not verify build is meant to be installed on the current '
 | 
| -            'device type. Run again with force=True to force flashing with an '
 | 
| -            'unverified board.')
 | 
| -
 | 
| -    flash_image_files = self._FindAndVerifyPartitionsAndImages(partitions,
 | 
| -                                                               directory)
 | 
| -    for partition in partitions:
 | 
| -      if partition in ['cache', 'userdata'] and not wipe:
 | 
| -        logging.info(
 | 
| -            'Not flashing in wipe mode. Skipping partition %s.', partition)
 | 
| -      else:
 | 
| -        logging.info(
 | 
| -            'Flashing %s with %s', partition, flash_image_files[partition])
 | 
| -        self.fastboot.Flash(partition, flash_image_files[partition])
 | 
| -        if partition in self._RESTART_WHEN_FLASHING:
 | 
| -          self.Reboot(bootloader=True)
 | 
| -
 | 
| -  @contextlib.contextmanager
 | 
| -  def FastbootMode(self, timeout=None, retries=None):
 | 
| -    """Context manager that enables fastboot mode, and reboots after.
 | 
| -
 | 
| -    Example usage:
 | 
| -      with FastbootMode():
 | 
| -        Flash Device
 | 
| -      # Anything that runs after flashing.
 | 
| -    """
 | 
| -    self.EnableFastbootMode()
 | 
| -    self.fastboot.SetOemOffModeCharge(False)
 | 
| -    try:
 | 
| -      yield self
 | 
| -    finally:
 | 
| -      self.fastboot.SetOemOffModeCharge(True)
 | 
| -      self.Reboot()
 | 
| -
 | 
| -  def FlashDevice(self, directory, partitions=None, wipe=False):
 | 
| -    """Flash device with build in |directory|.
 | 
| -
 | 
| -    Directory must contain bootloader, radio, boot, recovery, system, userdata,
 | 
| -    and cache .img files from an android build. This is a dangerous operation so
 | 
| -    use with care.
 | 
| -
 | 
| -    Args:
 | 
| -      fastboot: A FastbootUtils instance.
 | 
| -      directory: Directory with build files.
 | 
| -      wipe: Wipes cache and userdata if set to true.
 | 
| -      partitions: List of partitions to flash. Defaults to all.
 | 
| -    """
 | 
| -    if partitions is None:
 | 
| -      partitions = ALL_PARTITIONS
 | 
| -    with self.FastbootMode():
 | 
| -      self._FlashPartitions(partitions, directory, wipe=wipe)
 | 
| 
 |