Skip to content

Commit

Permalink
Add logdog_butler cipd package to every swarming gtest_test on androi…
Browse files Browse the repository at this point in the history
…d tryservers (linux_android_rel_ng, android_n5x_swarming_rel).

Add wrapper around android test runner for swarming tasks. This wrapper calls logdog to stream logcats after the completion of the python executable calling test_runner.

Adding device serials to every line of logcat logs.

Sample of unified logcats: https://luci-logdog.appspot.com/v/?s=chromium%2Fswarming%2F301f0f97eea1a511%2Flogcats%2F%2B%2Ffile:_b_swarm_slave_w_ioVXQmGw_logcats

BUG=448050

Review-Url: https://codereview.chromium.org/2163833003
Cr-Commit-Position: refs/heads/master@{#411530}
  • Loading branch information
nicholaslin authored and Commit bot committed Aug 12, 2016
1 parent d0b75c3 commit 3dbe50f
Show file tree
Hide file tree
Showing 6 changed files with 2,026 additions and 45 deletions.
1 change: 1 addition & 0 deletions build/android/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,7 @@ group("test_runner_py") {
data = sources + [
"devil_chromium.json",
"pylib/gtest/filter/",
"test_wrapper/logdog_wrapper.py",
"//third_party/android_tools/sdk/build-tools/23.0.1/aapt",
"//third_party/android_tools/sdk/build-tools/23.0.1/dexdump",
"//third_party/android_tools/sdk/build-tools/23.0.1/lib/libc++.so",
Expand Down
9 changes: 9 additions & 0 deletions build/android/pylib/local/device/local_device_environment.py
Original file line number Diff line number Diff line change
Expand Up @@ -188,9 +188,18 @@ def tear_down_device(d):
try:
m.Stop()
m.Close()
_, temp_path = tempfile.mkstemp()
with open(m.output_file, 'r') as infile:
with open(temp_path, 'w') as outfile:
for line in infile:
outfile.write('Device(%s) %s' % (m.adb.GetDeviceSerial(), line))
shutil.move(temp_path, m.output_file)
except base_error.BaseError:
logging.exception('Failed to stop logcat monitor for %s',
m.adb.GetDeviceSerial())
except IOError:
logging.exception('Failed to locate logcat for device %s',
m.adb.GetDeviceSerial())

if self._logcat_output_file:
file_utils.MergeFiles(
Expand Down
66 changes: 66 additions & 0 deletions build/android/test_wrapper/logdog_wrapper.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
#!/usr/bin/env python
# Copyright 2016 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.

"""Wrapper for adding logdog streaming support to swarming tasks."""

import argparse
import logging
import os
import subprocess
import sys
import urllib


def CommandParser():
# Parses the command line arguments being passed in
parser = argparse.ArgumentParser()
parser.add_argument('--logdog-bin-cmd', required=True,
help='Command for running logdog butler binary')
parser.add_argument('--project', required=True,
help='Name of logdog project')
parser.add_argument('--logdog-server',
default='services-dot-luci-logdog.appspot.com',
help='URL of logdog server, https:// is assumed.')
parser.add_argument('--service-account-json', required=True,
help='Location of authentication json')
parser.add_argument('--prefix', required=True,
help='Prefix to be used for logdog stream')
parser.add_argument('--source', required=True,
help='Location of file for logdog to stream')
parser.add_argument('--name', required=True,
help='Name to be used for logdog stream')
return parser


def CreateUrl(server, project, prefix, name):
stream_name = '%s/%s/+/%s' % (project, prefix, name)
return 'https://%s/v/?s=%s' % (server, urllib.quote_plus(stream_name))


def main():
parser = CommandParser()
args, test_cmd = parser.parse_known_args(sys.argv[1:])
logging.basicConfig(level=logging.INFO)
if not test_cmd:
parser.error('Must specify command to run after the logdog flags')
result = subprocess.call(test_cmd)
if '${SWARMING_TASK_ID}' in args.prefix:
args.prefix = args.prefix.replace('${SWARMING_TASK_ID}',
os.environ.get('SWARMING_TASK_ID'))
url = CreateUrl('luci-logdog.appspot.com', args.project, args.prefix,
args.name)
logdog_cmd = [args.logdog_bin_cmd, '-project', args.project,
'-output', 'logdog,host=%s' % args.logdog_server,
'-prefix', args.prefix,
'-service-account-json', args.service_account_json,
'stream', '-source', args.source,
'-stream', '-name=%s' % args.name]
subprocess.call(logdog_cmd)
logging.info('Logcats are located at: %s', url)
return result


if __name__ == '__main__':
sys.exit(main())
Loading

0 comments on commit 3dbe50f

Please sign in to comment.