Index: tools/telemetry/telemetry/internal/backends/mandoline/android_mandoline_backend.py |
diff --git a/tools/telemetry/telemetry/internal/backends/mandoline/android_mandoline_backend.py b/tools/telemetry/telemetry/internal/backends/mandoline/android_mandoline_backend.py |
deleted file mode 100644 |
index 4065546a62437faa195f82bdbe1bfe39f7f35b66..0000000000000000000000000000000000000000 |
--- a/tools/telemetry/telemetry/internal/backends/mandoline/android_mandoline_backend.py |
+++ /dev/null |
@@ -1,196 +0,0 @@ |
-# Copyright 2015 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 os |
-import random |
-import re |
-import sys |
- |
-from telemetry.core import exceptions |
-from telemetry.core import util |
-from telemetry.internal.backends.mandoline import android |
-from telemetry.internal.backends.mandoline import config |
-from telemetry.internal.backends.mandoline import mandoline_browser_backend |
-from telemetry.internal.platform import android_platform_backend as \ |
- android_platform_backend_module |
- |
-try: |
- from devil.android.sdk import keyevent |
-except ImportError: |
- pass |
- |
-class AndroidMandolineBackend( |
- mandoline_browser_backend.MandolineBrowserBackend): |
- """The backend for controlling a mandoline browser instance running on |
- Android.""" |
- |
- def __init__(self, android_platform_backend, browser_options, target_arch, |
- browser_type, build_path, package, chrome_root): |
- assert isinstance(android_platform_backend, |
- android_platform_backend_module.AndroidPlatformBackend) |
- super(AndroidMandolineBackend, self).__init__( |
- android_platform_backend, |
- browser_options=browser_options) |
- |
- self._target_arch = target_arch |
- self._browser_type = browser_type |
- self._build_path = build_path |
- self._package = package |
- self._device_port = None |
- self._chrome_root = chrome_root |
- |
- # TODO(wuhu): Move to network controller backend. |
- self.platform_backend.InstallTestCa() |
- |
- # Kill old browser. |
- self._KillBrowser() |
- |
- @property |
- def device(self): |
- return self.platform_backend.device |
- |
- def _KillBrowser(self): |
- if self.device.IsUserBuild(): |
- self.platform_backend.StopApplication(self._package) |
- else: |
- self.platform_backend.KillApplication(self._package) |
- |
- def Start(self): |
- self.device.RunShellCommand('logcat -c') |
- |
- self.platform_backend.DismissCrashDialogIfNeeded() |
- |
- self._port = util.GetUnreservedAvailableLocalPort() |
- self._device_port = self._GetAvailableDevicePort() |
- |
- self.device.adb.Forward('tcp:%d' % self._port, 'tcp:%d' % self._device_port) |
- logging.info('Forwarded host port %d to device port %d.' % |
- (self._port, self._device_port)) |
- |
- args = self.GetBrowserStartupArgs() |
- |
- if self.browser_options.startup_url: |
- args.append(self.browser_options.startup_url) |
- |
- logging.debug('Starting Mandoline %s', args) |
- |
- is_debug = 'debug' in self._browser_type |
- mandoline_config = config.Config(build_dir=self._build_path, |
- target_os=config.Config.OS_ANDROID, |
- target_cpu=self._target_arch, |
- is_debug=is_debug, |
- apk_name='Mandoline.apk') |
- shell = android.AndroidShell(mandoline_config, self._chrome_root) |
- shell.InitShell(self.device) |
- |
- output = sys.stdout |
- if not self.browser_options.show_stdout: |
- output = open(os.devnull, 'w') |
- logging_process = shell.ShowLogs(output) |
- |
- # Unlock device screen. |
- self.device.SendKeyEvent(keyevent.KEYCODE_MENU) |
- shell.StartActivity(self.activity, args, output, logging_process.terminate) |
- |
- try: |
- self._WaitForBrowserToComeUp() |
- self._InitDevtoolsClientBackend(self._port) |
- except exceptions.BrowserGoneException: |
- logging.critical('Failed to connect to browser.') |
- self.Close() |
- raise |
- except: |
- self.Close() |
- raise |
- |
- def GetBrowserStartupArgs(self): |
- args = super(AndroidMandolineBackend, self).GetBrowserStartupArgs() |
- # TODO(yzshen): Mandoline on Android doesn't support excessively long |
- # command line yet. Remove fieldtrial-related flags as a temp fix because |
- # they are long and not processed by Mandoline anyway. |
- # http://crbug.com/514285 |
- args = [arg for arg in args if arg.find('--force-fieldtrials=') == -1 and |
- arg.find('--force-fieldtrial-params=') == -1] |
- args.append('--remote-debugging-port=%i' % self._device_port) |
- return args |
- |
- @property |
- def pid(self): |
- pids = self.device.GetPids(self._package) |
- if not pids or self._package not in pids: |
- raise exceptions.BrowserGoneException(self.browser) |
- return int(pids[self._package]) |
- |
- @property |
- def browser_directory(self): |
- return None |
- |
- @property |
- def profile_directory(self): |
- raise NotImplementedError() |
- |
- @property |
- def package(self): |
- return self._package |
- |
- @property |
- def activity(self): |
- return 'MandolineActivity' |
- |
- def __del__(self): |
- self.Close() |
- |
- def Close(self): |
- super(AndroidMandolineBackend, self).Close() |
- |
- self.platform_backend.RemoveTestCa() |
- |
- self._KillBrowser() |
- |
- if self._port: |
- self.platform_backend.StopForwardingHost(self._port) |
- self._port = None |
- self._device_port = None |
- |
- def IsBrowserRunning(self): |
- return self.platform_backend.IsAppRunning(self._package) |
- |
- def GetStandardOutput(self): |
- return self.platform_backend.GetStandardOutput() |
- |
- def GetStackTrace(self): |
- return self.platform_backend.GetStackTrace(self._target_arch) |
- |
- @property |
- def should_ignore_certificate_errors(self): |
- return not self.platform_backend.is_test_ca_installed |
- |
- def _GetAvailableDevicePort(self): |
- used_ports = [] |
- netstat_results = self.device.RunShellCommand( |
- ['netstat', '-a'], check_return=True, large_output=True) |
- pattern = re.compile(r"^(127\.0\.0\.1:|localhost:)(\d+)$") |
- for single_connect in netstat_results: |
- # Column 3 is the local address which we want to check with. |
- connect_results = single_connect.split() |
- if connect_results[0] != 'tcp': |
- continue |
- if len(connect_results) < 6: |
- raise Exception('Unexpected format while parsing netstat line: ' + |
- single_connect) |
- result = re.match(pattern, connect_results[3]) |
- if result: |
- used_ports.append(int(result.group(2))) |
- |
- # The range of ephemeral ports on Android. |
- dynamic_port_begin = 32768 |
- dynamic_port_end = 61000 |
- assert len(used_ports) < dynamic_port_end - dynamic_port_begin + 1 |
- |
- available_port = random.randint(dynamic_port_begin, dynamic_port_end) |
- while available_port in used_ports: |
- available_port = random.randint(dynamic_port_begin, dynamic_port_end) |
- |
- return available_port |