Home | History | Annotate | Download | only in android
      1 # Copyright 2017 The Chromium 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 
      6 import logging
      7 
      8 from devil import base_error
      9 from devil.android import device_errors
     10 
     11 logger = logging.getLogger(__name__)
     12 
     13 
     14 def RetryOnSystemCrash(f, device, retries=3):
     15   """Retries the given function on a device crash.
     16 
     17   If the provided function fails with a DeviceUnreachableError, this will wait
     18   for the device to come back online, then retry the function.
     19 
     20   Note that this uses the same retry scheme as timeout_retry.Run.
     21 
     22   Args:
     23     f: a unary callable that takes an instance of device_utils.DeviceUtils.
     24     device: an instance of device_utils.DeviceUtils.
     25     retries: the number of retries.
     26   Returns:
     27     Whatever f returns.
     28   """
     29   num_try = 1
     30   while True:
     31     try:
     32       return f(device)
     33     except device_errors.DeviceUnreachableError:
     34       if num_try > retries:
     35         logger.error('%d consecutive device crashes. No longer retrying.',
     36                       num_try)
     37         raise
     38       try:
     39         logger.warning('Device is unreachable. Waiting for recovery...')
     40         device.WaitUntilFullyBooted()
     41       except base_error.BaseError:
     42         logger.exception('Device never recovered. X(')
     43     num_try += 1
     44