Provision Android devices after the 'device_status_check' step.

BUG=169338


Review URL: https://chromiumcodereview.appspot.com/12733012

git-svn-id: http://src.chromium.org/svn/trunk/src/build@191315 4ff67af0-8c30-449e-8e8b-ad334ec8d88c
This commit is contained in:
sivachandra@chromium.org 2013-03-29 06:21:13 +00:00
Родитель 2ddf6003dc
Коммит 5b7206cd04
4 изменённых файлов: 138 добавлений и 1 удалений

Просмотреть файл

@ -271,6 +271,12 @@ def MainTestWrapper(options):
buildbot_report.PrintNamedStep('device_status_check')
RunCmd(['build/android/device_status_check.py'])
# Provision devices
if options.auto_reconnect:
buildbot_report.PrintNamedStep('provision_devices')
target = options.factory_properties.get('target', 'Debug')
RunCmd(['build/android/provision_devices.py', '-t', target])
if options.install:
test_obj = INSTRUMENTATION_TESTS[options.install]
InstallApk(options, test_obj, print_step=True)
@ -334,6 +340,9 @@ def main(argv):
help='Reboot devices before running tests')
parser.add_option('--upload-to-flakiness-server', action='store_true',
help='Upload the results to the flakiness dashboard.')
parser.add_option(
'--auto-reconnect', action='store_true',
help='Push script to device which restarts adbd on disconnections.')
options, args = parser.parse_args(argv[1:])
def ParserError(msg):

Просмотреть файл

@ -113,7 +113,8 @@ def GetBotStepMap():
['bb_compile', 'bb_compile_experimental', 'bb_zip_build'], None, None),
B('fyi-tests', std_test_steps,
T(std_tests, ['--experimental', flakiness_server]), None),
B('perf-tests-rel', std_test_steps, T([], ['--install=ContentShell']),
B('perf-tests-rel', std_test_steps,
T([], ['--install=ContentShell', '--auto-reconnect']),
None),
B('webkit-latest-webkit-tests', std_test_steps,
T(['webkit_layout', 'webkit']), None),

33
android/host_heartbeat.py Executable file
Просмотреть файл

@ -0,0 +1,33 @@
#!/usr/bin/env python
#
# Copyright (c) 2013 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.
"""Sends a heart beat pulse to the currently online Android devices.
This heart beat lets the devices know that they are connected to a host.
"""
import os
import sys
import time
from pylib import android_commands
PULSE_PERIOD = 20
def main():
while True:
try:
devices = android_commands.GetAttachedDevices()
for device in devices:
android_cmd = android_commands.AndroidCommands(device)
android_cmd.RunShellCommand('touch /sdcard/host_heartbeat')
except:
# Keep the heatbeat running bypassing all errors.
pass
time.sleep(PULSE_PERIOD)
if __name__ == '__main__':
sys.exit(main())

94
android/provision_devices.py Executable file
Просмотреть файл

@ -0,0 +1,94 @@
#!/usr/bin/env python
#
# Copyright (c) 2013 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.
"""Provisions Android devices with settings required for bots.
Usage:
./provision_devices.py [-d <device serial number>]
"""
import optparse
import os
import re
import subprocess
import sys
import time
from pylib import android_commands
from pylib import constants
def PushAndLaunchAdbReboot(device, target):
"""Pushes and launches the adb_reboot binary on the device.
Arguments:
device: The serial number of the device to which the
adb_reboot binary should be pushed.
target: The build target (example, Debug or Release) which helps in
locating the adb_reboot binary.
"""
print 'Will push and launch adb_reboot on %s' % device
android_cmd = android_commands.AndroidCommands(device)
# Kill if adb_reboot is already running.
android_cmd.KillAllBlocking('adb_reboot', 2)
# Push adb_reboot
print ' Pushing adb_reboot ...'
adb_reboot = os.path.join(constants.CHROME_DIR,
'out/%s/adb_reboot' % target)
android_cmd.PushIfNeeded(adb_reboot, '/data/local/')
# Launch adb_reboot
print ' Launching adb_reboot ...'
p = subprocess.Popen(['adb', '-s', device, 'shell'], stdin=subprocess.PIPE)
p.communicate('/data/local/adb_reboot; exit\n')
def LaunchHostHeartbeat():
ps = subprocess.Popen(['ps', 'aux'], stdout = subprocess.PIPE)
stdout, _ = ps.communicate()
matches = re.findall('\\n.*host_heartbeat.*', stdout)
for match in matches:
print 'An instance of host heart beart already running... will kill'
pid = re.findall('(\d+)', match)[1]
subprocess.call(['kill', str(pid)])
# Launch a new host_heartbeat
print 'Spawing host heartbeat...'
subprocess.Popen([os.path.join(constants.CHROME_DIR,
'build/android/host_heartbeat.py')])
def ProvisionDevices(options):
if options.device is not None:
devices = [options.device]
else:
devices = android_commands.GetAttachedDevices()
for device in devices:
android_cmd = android_commands.AndroidCommands(device)
android_cmd.RunShellCommand('su -c date -u %f' % time.time())
PushAndLaunchAdbReboot(device, options.target)
LaunchHostHeartbeat()
def main(argv):
parser = optparse.OptionParser()
parser.add_option('-d', '--device',
help='The serial number of the device to be provisioned')
parser.add_option('-t', '--target',
help='Path to the adb_reboot binary')
options, args = parser.parse_args(argv[1:])
if args:
print >> sys.stderr, 'Unused args %s' % args
return 1
if not options.target:
print >> sys.stderr, 'Build target not specified'
return 1
ProvisionDevices(options)
if __name__ == '__main__':
sys.exit(main(sys.argv))