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