Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(454)

Unified Diff: tools/telemetry/telemetry/core/backends/android_command_line_backend.py

Issue 811703007: Create AndroidCommandLineBackend to handle setting up cmdline args (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: add context manager for command line backend Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: tools/telemetry/telemetry/core/backends/android_command_line_backend.py
diff --git a/tools/telemetry/telemetry/core/backends/android_command_line_backend.py b/tools/telemetry/telemetry/core/backends/android_command_line_backend.py
new file mode 100644
index 0000000000000000000000000000000000000000..e2c3e1a1d4b6983732bbe1226638ac6601ad0e66
--- /dev/null
+++ b/tools/telemetry/telemetry/core/backends/android_command_line_backend.py
@@ -0,0 +1,98 @@
+# Copyright 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.
+
+import logging
+import pipes
+import sys
+
+from telemetry.core import util
+
+util.AddDirToPythonPath(util.GetChromiumSrcDir(), 'build', 'android')
+from pylib.device import device_errors # pylint: disable=F0401
+
+
+def _QuoteIfNeeded(arg):
+ # Properly escape "key=valueA valueB" to "key='valueA valueB'"
+ # Values without spaces, or that seem to be quoted are left untouched.
+ # This is required so CommandLine.java can parse valueB correctly rather
+ # than as a separate switch.
+ params = arg.split('=', 1)
+ if len(params) != 2:
+ return arg
+ key, values = params
+ if ' ' not in values:
+ return arg
+ if values[0] in '"\'' and values[-1] == values[0]:
+ return arg
+ return '%s=%s' % (key, pipes.quote(values))
+
+
+class SetUpCommandLineFlags(object):
+ """A context manager for setting up the android command line flags.
+
+ This provides a readable way of using the android command line backend class.
+ Example usage:
+
+ with android_command_line_backend.SetUpCommandLineFlags(
+ adb, backend_settings, startup_args):
+ # Something to run while the command line flags are set appropriately.
+ """
+ def __init__(self, adb, backend_settings, startup_args):
+ self._android_command_line_backend = _AndroidCommandLineBackend(
+ adb, backend_settings, startup_args)
+
+ def __enter__(self):
+ self._android_command_line_backend.SetUpCommandLineFlags()
+
+ def __exit__(self, *args):
+ self._android_command_line_backend.RestoreCommandLineFlags()
+
+
+class _AndroidCommandLineBackend(object):
+ """The backend for providing command line flags on android.
+
+ There are command line flags that Chromium accept in order to enable
+ particular features or modify otherwise default functionality. To set the
+ flags for Chrome on Android, specific files on the device must be updated
+ with the flags to enable. This class provides a wrapper around this
+ functionality.
+ """
+
+ def __init__(self, adb, backend_settings, startup_args):
+ self._adb = adb
+ self._backend_settings = backend_settings
+ self._startup_args = startup_args
+ self._saved_command_line_file_contents = ''
+
+ @property
+ def command_line_file(self):
+ return self._backend_settings.GetCommandLineFile(self._adb.IsUserBuild())
+
+ def SetUpCommandLineFlags(self):
+ args = [self._backend_settings.pseudo_exec_name]
+ args.extend(self._startup_args)
+ content = ' '.join(_QuoteIfNeeded(arg) for arg in args)
+
+ try:
+ # Save the current command line to restore later, except if it appears to
+ # be a Telemetry created one. This is to prevent a common bug where
+ # --host-resolver-rules borks people's browsers if something goes wrong
+ # with Telemetry.
+ self._saved_command_line_file_contents = ''.join(self._ReadFile())
+ if '--host-resolver-rules' in self._saved_command_line_file_contents:
+ self._saved_command_line_file_contents = ''
+ self._WriteFile(content)
+ except device_errors.CommandFailedError:
+ logging.critical('Cannot set Chrome command line. '
+ 'Fix this by flashing to a userdebug build.')
+ sys.exit(1)
+
+ def RestoreCommandLineFlags(self):
+ self._WriteFile(self._saved_command_line_file_contents)
+
+ def _ReadFile(self):
+ return self._adb.device().ReadFile(self.command_line_file)
+
+ def _WriteFile(self, contents):
+ self._adb.device().WriteFile(self.command_line_file, contents, as_root=True)

Powered by Google App Engine
This is Rietveld 408576698