120257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat# Copyright 2016 The Chromium OS Authors. All rights reserved. 220257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat# Use of this source code is governed by a BSD-style license that can be 320257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat# found in the LICENSE file. 420257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat# 520257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat# This file contains things that are shared by arc.py and arc_util.py. 620257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat 720257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichatimport logging 820257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat 920257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichatfrom autotest_lib.client.bin import utils 1020257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichatfrom autotest_lib.client.common_lib import error 1120257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat 1220257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat 1320257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat# Ask Chrome to start ARC instance and the script will block until ARC's boot 1420257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat# completed event. 1520257f0b6214b283f4821cde39425dfffba8b3b6Nicolas BoichatARC_MODE_ENABLED = "enabled" 1620257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat# Similar to "enabled", except that it will not block. 1720257f0b6214b283f4821cde39425dfffba8b3b6Nicolas BoichatARC_MODE_ENABLED_ASYNC = "enabled_async" 1820257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat# Ask Chrome to not start ARC instance. This is the default. 1920257f0b6214b283f4821cde39425dfffba8b3b6Nicolas BoichatARC_MODE_DISABLED = "disabled" 2020257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat# All available ARC options. 2120257f0b6214b283f4821cde39425dfffba8b3b6Nicolas BoichatARC_MODES = [ARC_MODE_ENABLED, ARC_MODE_ENABLED_ASYNC, ARC_MODE_DISABLED] 2220257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat 2320257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat_BOOT_CHECK_INTERVAL_SECONDS = 2 2420257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat_WAIT_FOR_ANDROID_BOOT_SECONDS = 120 2520257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat 2620257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat 2720257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichatdef wait_for_android_boot(timeout=None): 2820257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat """Sleep until Android has completed booting or timeout occurs.""" 2920257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat if timeout is None: 3020257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat timeout = _WAIT_FOR_ANDROID_BOOT_SECONDS 3120257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat 3220257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat def _is_android_booted(): 3320257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat output = utils.system_output( 3420257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat 'android-sh -c "getprop sys.boot_completed"', ignore_status=True) 3520257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat return output.strip() == '1' 3620257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat 3720257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat logging.info('Waiting for Android to boot completely.') 3820257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat utils.poll_for_condition(condition=_is_android_booted, 3920257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat desc='Android has booted', 4020257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat timeout=timeout, 4120257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat exception=error.TestFail('Android did not boot!'), 4220257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat sleep_interval=_BOOT_CHECK_INTERVAL_SECONDS) 4320257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat logging.info('Android has booted completely.') 44