• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/usr/bin/env python
2# Copyright 2013 The Chromium Authors. All rights reserved.
3# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
5
6import collections
7import logging
8import optparse
9import os
10import sys
11
12BUILD_ANDROID_DIR = os.path.join(os.path.dirname(__file__),
13                                 os.pardir,
14                                 os.pardir,
15                                 'build',
16                                 'android')
17sys.path.append(BUILD_ANDROID_DIR)
18from pylib import android_commands
19from pylib import constants
20from pylib import flag_changer
21from pylib.device import device_errors
22from pylib.device import device_utils
23
24# Browser Constants
25DEFAULT_BROWSER = 'chrome'
26
27# Action Constants
28ACTION_PACKAGE = 'org.chromium.base'
29ACTION_TRIM = {
30    'moderate' : ACTION_PACKAGE + '.ACTION_TRIM_MEMORY_MODERATE',
31    'critical' : ACTION_PACKAGE + '.ACTION_TRIM_MEMORY_RUNNING_CRITICAL',
32    'complete' : ACTION_PACKAGE + '.ACTION_TRIM_MEMORY'
33}
34ACTION_LOW = ACTION_PACKAGE + '.ACTION_LOW_MEMORY'
35
36# Command Line Constants
37ENABLE_TEST_INTENTS_FLAG = '--enable-test-intents'
38
39def main(argv):
40  option_parser = optparse.OptionParser()
41  option_parser.add_option('-l',
42                           '--low',
43                           help='Simulate Activity#onLowMemory()',
44                           action='store_true')
45  option_parser.add_option('-t',
46                           '--trim',
47                           help=('Simulate Activity#onTrimMemory(...) with ' +
48                                 ', '.join(ACTION_TRIM.keys())),
49                           type='string')
50  option_parser.add_option('-b',
51                           '--browser',
52                           default=DEFAULT_BROWSER,
53                           help=('Which browser to use. One of ' +
54                                 ', '.join(constants.PACKAGE_INFO.keys()) +
55                                 ' [default: %default]'),
56                           type='string')
57
58  (options, args) = option_parser.parse_args(argv)
59
60  if len(args) > 1:
61    print 'Unknown argument: ', args[1:]
62    option_parser.print_help()
63    sys.exit(1)
64
65  if options.low and options.trim:
66    option_parser.error('options --low and --trim are mutually exclusive')
67
68  if not options.low and not options.trim:
69    option_parser.print_help()
70    sys.exit(1)
71
72  action = None
73  if options.low:
74    action = ACTION_LOW
75  elif options.trim in ACTION_TRIM.keys():
76    action = ACTION_TRIM[options.trim]
77
78  if action is None:
79    option_parser.print_help()
80    sys.exit(1)
81
82  if not options.browser in constants.PACKAGE_INFO.keys():
83    option_parser.error('Unknown browser option ' + options.browser)
84
85  package_info = constants.PACKAGE_INFO[options.browser]
86
87  package = package_info.package
88  activity = package_info.activity
89
90  devices = android_commands.GetAttachedDevices()
91  if not devices:
92    raise device_errors.NoDevicesError()
93  elif len(devices) > 1:
94    logging.warning('Multiple devices attached. Using %s.' % devices[0])
95  device = device_utils.DeviceUtils(devices[0])
96
97  try:
98    device.EnableRoot()
99  except device_errors.CommandFailedError as e:
100    # Try to change the flags and start the activity anyway.
101    # TODO(jbudorick) Handle this exception appropriately after interface
102    #                 conversions are finished.
103    logging.error(str(e))
104  flags = flag_changer.FlagChanger(device, package_info.cmdline_file)
105  if ENABLE_TEST_INTENTS_FLAG not in flags.Get():
106    flags.AddFlags([ENABLE_TEST_INTENTS_FLAG])
107
108  device.StartActivity(intent.Intent(package=package, activity=activity,
109                                     action=action))
110
111if __name__ == '__main__':
112  sys.exit(main(sys.argv))
113