| Index: blimp/tools/client_engine_integration.py
|
| diff --git a/blimp/tools/client_engine_integration.py b/blimp/tools/client_engine_integration.py
|
| deleted file mode 100755
|
| index f1fabec8c858b86f40e2d1b0ace53292ebb4e113..0000000000000000000000000000000000000000
|
| --- a/blimp/tools/client_engine_integration.py
|
| +++ /dev/null
|
| @@ -1,341 +0,0 @@
|
| -#!/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.
|
| -
|
| -"""Blimp Client + Engine integration test system
|
| -
|
| - Set up Client and Engine
|
| - Set up Forward to connect machine host with client device.
|
| - Start Engine and run blimp on Android Client.
|
| -"""
|
| -
|
| -import argparse
|
| -import json
|
| -import logging
|
| -import posixpath
|
| -import os
|
| -import re
|
| -import signal
|
| -import subprocess
|
| -import sys
|
| -
|
| -SRC_PATH = os.path.abspath(
|
| - os.path.join(os.path.dirname(__file__), '..', '..'))
|
| -
|
| -DEVIL_PATH = os.path.join(SRC_PATH, 'third_party', 'catapult',
|
| - 'devil')
|
| -DEVIL_CHROMIUM_PATH = os.path.join(SRC_PATH, 'build', 'android')
|
| -
|
| -if DEVIL_CHROMIUM_PATH not in sys.path:
|
| - sys.path.append(DEVIL_CHROMIUM_PATH)
|
| -
|
| -import devil_chromium
|
| -
|
| -if DEVIL_PATH not in sys.path:
|
| - sys.path.append(DEVIL_PATH)
|
| -
|
| -from devil.android import device_blacklist
|
| -from devil.android import device_utils
|
| -from devil.android import forwarder
|
| -from devil.android.sdk import intent
|
| -from devil.android.sdk import version_codes
|
| -from devil.utils import cmd_helper
|
| -
|
| -_CLIENT_TOKEN_PATH = posixpath.join('/', 'data', 'data',
|
| - 'org.chromium.chrome',
|
| - 'blimp_client_token')
|
| -_TOKEN_FILE_PATH = os.path.join(SRC_PATH, 'blimp', 'test', 'data',
|
| - 'test_client_token')
|
| -PORT_PATTERN = re.compile(r'.*Engine port #: (\d+)')
|
| -ARGS_JSON_FILE = 'blimp_script_args.json'
|
| -
|
| -def AddStartArguments(parser):
|
| - parser.add_argument('-d',
|
| - '--device',
|
| - help='Serial number of device we should use.')
|
| - parser.add_argument('--blacklist-file',
|
| - default=None,
|
| - help='Device blacklist JSON file.')
|
| - parser.add_argument('--engine-ip',
|
| - default='127.0.0.1',
|
| - help='Blimp engine IP.')
|
| -
|
| -
|
| -def _IsNonEmptyFile(fpath):
|
| - return os.path.isfile(fpath) and os.path.getsize(fpath) > 0
|
| -
|
| -
|
| -def RunClient(device, optional_url):
|
| - """Run Blimp client.
|
| -
|
| - Args:
|
| - device: (DeviceUtils) device to run the tests on.
|
| - optional_url: (str) URL to navigate to.
|
| - """
|
| - run_client_intent = intent.Intent(
|
| - action='android.intent.action.VIEW',
|
| - package='org.chromium.chrome',
|
| - activity='com.google.android.apps.chrome.Main',
|
| - data=optional_url)
|
| - device.StartActivity(run_client_intent, blocking=True)
|
| -
|
| -
|
| -def RunEngine(output_linux_directory, token_file_path, device):
|
| - """Start running engine
|
| -
|
| - Args:
|
| - output_linux_directory: (str) Path to the root linux build directory.
|
| - token_file_path: (str) Path to the client auth token file.
|
| -
|
| - Returns:
|
| - port: (str) Engine port number generated by engine session.
|
| - """
|
| - port = '0'
|
| - blimp_engine_app = os.path.join(output_linux_directory,
|
| - 'blimp_engine_app')
|
| -
|
| - sub_dir = "marshmallow"
|
| - if device.build_version_sdk == version_codes.KITKAT:
|
| - sub_dir = "kitkat"
|
| - blimp_fonts_path = os.path.join(output_linux_directory, 'gen',
|
| - 'third_party', 'blimp_fonts',
|
| - 'font_bundle', sub_dir)
|
| -
|
| - run_engine_cmd = [
|
| - blimp_engine_app +
|
| - ' --android-fonts-path=' + blimp_fonts_path +
|
| - ' --blimp-client-token-path=' + token_file_path +
|
| - ' --enable-logging=stderr' +
|
| - ' -v=0' +
|
| - ' --vmodule="blimp*=1"']
|
| - p = subprocess.Popen(run_engine_cmd, shell=True,
|
| - stdout=subprocess.PIPE,
|
| - stderr=subprocess.STDOUT,
|
| - preexec_fn=os.setsid)
|
| -
|
| - for line in iter(p.stdout.readline, ''):
|
| - sys.stdout.write(line)
|
| - l = line.rstrip()
|
| - match = re.match(PORT_PATTERN, l)
|
| - if match:
|
| - port = match.group(1)
|
| - break
|
| -
|
| - return port, p
|
| -
|
| -
|
| -def SetCommandFlag(device, engine_ip, engine_port):
|
| - """Set up adb Chrome command line flags
|
| -
|
| - Args:
|
| - device: (str) Serial number of device we should use.
|
| - engine_ip: (str) Blimp engine IP address.
|
| - engine_port: (str) Port on the engine.
|
| - """
|
| - cmd_helper.GetCmdStatusAndOutput([
|
| - os.path.join(SRC_PATH, 'build', 'android',
|
| - 'adb_chrome_public_command_line'),
|
| - '--device=' + str(device),
|
| - '--enable-blimp',
|
| - '--engine-ip=' + engine_ip,
|
| - '--engine-port=' + engine_port,
|
| - '--engine-transport=tcp',
|
| - '-v=0',
|
| - '--vmodule=*blimp*=1',
|
| - '--blimp-client-token-path=' + _CLIENT_TOKEN_PATH])
|
| -
|
| -
|
| -def _JsonEncodeDefault(obj):
|
| - if isinstance(obj, argparse.Namespace):
|
| - result = obj.__dict__
|
| - result.update({'_type': 'args'})
|
| - return result
|
| - raise TypeError("Json object must be an instance of argparse.Namespace")
|
| -
|
| -
|
| -def _FromJson(json_object):
|
| - if json_object.get('_type') == 'args':
|
| - result = argparse.Namespace()
|
| - for key, value in json_object.iteritems():
|
| - setattr(result, key, value)
|
| - return result
|
| - return json_object
|
| -
|
| -
|
| -def _Start(args, json_file_path, device):
|
| - """Start engine and forwarder
|
| -
|
| - Args:
|
| - args: parsed command line arguments.
|
| - json_file_path: json file path which keeps the script variables.
|
| - device: (DeviceUtils) device to run the tests on.
|
| - """
|
| - if _IsNonEmptyFile(json_file_path):
|
| - logging.error('Error: An engine instance is already running.')
|
| - sys.exit(1)
|
| -
|
| - json_args = argparse.Namespace()
|
| - for k in args.__dict__:
|
| - if not k == "func":
|
| - setattr(json_args, k, args.__dict__[k])
|
| - json_object = {'args': json_args}
|
| - device.EnableRoot()
|
| - host_device_tuples = [(_TOKEN_FILE_PATH, _CLIENT_TOKEN_PATH)]
|
| - device.PushChangedFiles(host_device_tuples)
|
| -
|
| - port_number, engine_process = RunEngine(
|
| - args.output_linux_directory, _TOKEN_FILE_PATH, device)
|
| - json_object['port_number'] = port_number
|
| - json_object['pid'] = engine_process.pid
|
| - logging.info('Engine port number: %s', port_number)
|
| - logging.info('Engine running PID: %d', engine_process.pid)
|
| -
|
| - if engine_process.poll() is not None:
|
| - logging.error('Engine failed to start. Return code: %d',
|
| - engine_process.poll())
|
| - else:
|
| - try:
|
| - port_pairs = [(port_number, port_number)]
|
| - SetCommandFlag(device, args.engine_ip, port_number)
|
| - forwarder.Forwarder.Map(port_pairs, device)
|
| - print "Blimp engine started"
|
| - return engine_process
|
| -
|
| - finally:
|
| - with open(json_file_path, 'w') as f:
|
| - json.dump(json_object, f, default=_JsonEncodeDefault)
|
| -
|
| -
|
| -def _Run(args, json_file_path, device):
|
| - """Start engine and forwarder and keep runnning.
|
| -
|
| - Args:
|
| - args: parsed command line arguments.
|
| - json_file_path: json file path which keeps the script variables.
|
| - device: (DeviceUtils) device to run the tests on.
|
| - """
|
| - try:
|
| - engine_process = _Start(args, json_file_path, device)
|
| - while True:
|
| - nextline = engine_process.stdout.readline()
|
| - if nextline == '' and engine_process.poll() is not None:
|
| - # The engine died.
|
| - sys.exit(1)
|
| - sys.stdout.write(nextline)
|
| - sys.stdout.flush()
|
| -
|
| - except KeyboardInterrupt:
|
| - sys.exit(0)
|
| - finally:
|
| - _Stop(args, json_file_path, device)
|
| -
|
| -
|
| -def _Load(args, json_file_path, device): # pylint: disable=unused-argument
|
| - """Start client and load the url
|
| -
|
| - Args:
|
| - args: parsed command line arguments.
|
| - json_file_path: json file path which keeps the script variables.
|
| - device: (DeviceUtils) device to run the tests on.
|
| - """
|
| - device.Install(os.path.join(SRC_PATH, args.apk_path),
|
| - reinstall=True)
|
| - run_client_intent = intent.Intent(
|
| - action='android.intent.action.VIEW',
|
| - package='org.chromium.chrome',
|
| - activity='com.google.android.apps.chrome.Main',
|
| - data=args.optional_url)
|
| - device.StartActivity(run_client_intent, blocking=True)
|
| -
|
| -
|
| -def _Stop(args, json_file_path, device): # pylint: disable=unused-argument
|
| - """Stop engine and forwarder
|
| -
|
| - Args:
|
| - args: (unused) parsed command line arguments.
|
| - json_file_path: json file path which keeps the script variables.
|
| - device: (DeviceUtils) device to run the tests on.
|
| - """
|
| - if not _IsNonEmptyFile(json_file_path):
|
| - logging.error('Error: cannot find json file: ' + json_file_path)
|
| - sys.exit(1)
|
| - try:
|
| - with open(json_file_path, 'r') as f:
|
| - jsonarg = json.load(f, object_hook=_FromJson)
|
| - pid = int(jsonarg['pid'])
|
| - try:
|
| - forwarder.Forwarder.UnmapAllDevicePorts(device)
|
| - finally:
|
| - os.kill(pid, signal.SIGKILL)
|
| - finally:
|
| - os.remove(json_file_path)
|
| -
|
| -
|
| -def main():
|
| - parser = argparse.ArgumentParser()
|
| - parser.add_argument('-l',
|
| - '--output-linux-directory',
|
| - required=True,
|
| - help='Path to the root linux build directory.'
|
| - ' Example: "out-linux/Debug"')
|
| - parser.add_argument('--adb-path',
|
| - type=os.path.abspath,
|
| - help='Path to the adb binary.')
|
| - subparsers = parser.add_subparsers(dest="subparser_name")
|
| -
|
| - start_parser = subparsers.add_parser('start')
|
| - start_parser.set_defaults(func=_Start)
|
| - AddStartArguments(start_parser)
|
| -
|
| - run_parser = subparsers.add_parser('run')
|
| - run_parser.set_defaults(func=_Run)
|
| - AddStartArguments(run_parser)
|
| -
|
| - load_parser = subparsers.add_parser('load')
|
| - load_parser.set_defaults(func=_Load)
|
| - load_parser.add_argument('-p',
|
| - '--apk-path',
|
| - required=True,
|
| - help='The path to the APK to install. '
|
| - 'Including the name of the apk containing '
|
| - 'the application (with the .apk extension).')
|
| - load_parser.add_argument('-u',
|
| - '--optional-url',
|
| - help='URL to navigate to.')
|
| -
|
| - stop_parser = subparsers.add_parser('stop')
|
| - stop_parser.set_defaults(func=_Stop)
|
| -
|
| - args = parser.parse_args()
|
| - devil_chromium.Initialize(adb_path=args.adb_path)
|
| -
|
| - json_file_path = os.path.join(SRC_PATH, args.output_linux_directory,
|
| - ARGS_JSON_FILE)
|
| - blacklist_file = ''
|
| - serial = ''
|
| - if args.subparser_name == 'start' or args.subparser_name == 'run':
|
| - blacklist_file = args.blacklist_file
|
| - serial = args.device
|
| - else:
|
| - if not _IsNonEmptyFile(json_file_path):
|
| - logging.error('Cannot find json file: %s' + json_file_path)
|
| - logging.error('Run `client_engine_integration.py {run,start}` first.')
|
| - sys.exit(1)
|
| - with open(json_file_path, 'r') as f:
|
| - file_lines = f.readlines()
|
| - jsonarg = json.loads(file_lines[0], object_hook=_FromJson)
|
| - blacklist_file = jsonarg['args'].blacklist_file
|
| - serial = jsonarg['args'].device
|
| -
|
| - blacklist = (device_blacklist.Blacklist(blacklist_file)
|
| - if blacklist_file
|
| - else None)
|
| - device = device_utils.DeviceUtils.HealthyDevices(
|
| - blacklist=blacklist, device_arg=serial)[0]
|
| -
|
| - args.func(args, json_file_path, device)
|
| -
|
| -
|
| -if __name__ == '__main__':
|
| - main()
|
|
|