# 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 os
-import subprocess
+
+from telemetry import decorators
from telemetry.core import exceptions
+from telemetry.core import forwarders
from telemetry.core import util
-from telemetry.core.backends import browser_backend
from telemetry.core.backends.chrome import chrome_browser_backend
+from telemetry.core.forwarders import cros_forwarder
+
class CrOSBrowserBackend(chrome_browser_backend.ChromeBrowserBackend):
# Some developers' workflow includes running the Chrome process from
self._browser_type = browser_type
self._cri = cri
self._is_guest = is_guest
+ self._forwarder = None
- self.wpr_http_port_pair.remote_port = self._cri.GetRemotePort()
- self.wpr_https_port_pair.remote_port = self._cri.GetRemotePort()
+ self.wpr_port_pairs = forwarders.PortPairs(
+ http=forwarders.PortPair(self.wpr_port_pairs.http.local_port,
+ self._cri.GetRemotePort()),
+ https=forwarders.PortPair(self.wpr_port_pairs.https.local_port,
+ self._cri.GetRemotePort()),
+ dns=None)
self._remote_debugging_port = self._cri.GetRemotePort()
self._port = self._remote_debugging_port
- self._forwarder = None
self._SetBranchNumber(self._GetChromeVersion())
"""Oobe.LoginForTesting was introduced after branch 1599."""
return self.chrome_branch_number > 1599
- def GetRemotePort(self, _):
+ def GetRemotePort(self, port):
+ if self._cri.local:
+ return port
return self._cri.GetRemotePort()
def __del__(self):
self._cri.RunCmdOnDevice(args)
if not self._cri.local:
- # Find a free local port.
self._port = util.GetUnreservedAvailableLocalPort()
-
- # Forward the remote debugging port.
- logging.info('Forwarding remote debugging port %d to local port %d',
- self._remote_debugging_port, self._port)
- self._forwarder = SSHForwarder(
- self._cri, 'L',
- util.PortPair(self._port, self._remote_debugging_port))
+ self._forwarder = self.forwarder_factory.Create(
+ forwarders.PortPairs(
+ http=forwarders.PortPair(self._port, self._remote_debugging_port),
+ https=None,
+ dns=None), forwarding_flag='L')
try:
self._WaitForBrowserToComeUp(wait_for_extensions=False)
self._RestartUI() # Logs out.
- if not self._cri.local:
- if self._forwarder:
- self._forwarder.Close()
- self._forwarder = None
+ if self._forwarder:
+ self._forwarder.Close()
+ self._forwarder = None
if self._login_ext_dir:
self._cri.RmRF(self._login_ext_dir)
self._cri = None
+ @property
+ @decorators.Cache
+ def forwarder_factory(self):
+ return cros_forwarder.CrOsForwarderFactory(self._cri)
+
def IsBrowserRunning(self):
return bool(self.pid)
def GetStackTrace(self):
return 'Cannot get stack trace on CrOS'
- def CreateForwarder(self, *port_pairs):
- assert self._cri
- return (browser_backend.DoNothingForwarder(*port_pairs) if self._cri.local
- else SSHForwarder(self._cri, 'R', *port_pairs))
-
def _RestartUI(self):
if self._cri:
logging.info('(Re)starting the ui (logs the user out)')
def _NavigateGuestLogin(self):
"""Navigates through oobe login screen as guest"""
- assert self.oobe_exists
+ if not self.oobe_exists:
+ raise exceptions.LoginException('Oobe missing')
self._WaitForSigninScreen()
self._ClickBrowseAsGuest()
self._WaitForGuestFsMounted()
"""Navigates through oobe login screen"""
if self._use_oobe_login_for_testing:
logging.info('Invoking Oobe.loginForTesting')
- assert self.oobe_exists
+ if not self.oobe_exists:
+ raise exceptions.LoginException('Oobe missing')
oobe = self.oobe
util.WaitFor(lambda: oobe.EvaluateJavaScript(
'typeof Oobe !== \'undefined\''), 10)
'remaining retries %d' % retries)
if not retries:
raise
-
-class SSHForwarder(object):
- def __init__(self, cri, forwarding_flag, *port_pairs):
- self._proc = None
-
- if forwarding_flag == 'R':
- self._host_port = port_pairs[0].remote_port
- command_line = ['-%s%i:localhost:%i' % (forwarding_flag,
- port_pair.remote_port,
- port_pair.local_port)
- for port_pair in port_pairs]
- else:
- self._host_port = port_pairs[0].local_port
- command_line = ['-%s%i:localhost:%i' % (forwarding_flag,
- port_pair.local_port,
- port_pair.remote_port)
- for port_pair in port_pairs]
-
- self._device_port = port_pairs[0].remote_port
-
- self._proc = subprocess.Popen(
- cri.FormSSHCommandLine(['sleep', '999999999'], command_line),
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE,
- stdin=subprocess.PIPE,
- shell=False)
-
- util.WaitFor(lambda: cri.IsHTTPServerRunningOnPort(self._device_port), 60)
- logging.debug('ssh forwarder created: %s', command_line)
-
- @property
- def url(self):
- assert self._proc
- return 'http://localhost:%i' % self._host_port
-
- def Close(self):
- if self._proc:
- self._proc.kill()
- self._proc = None
-