Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / tools / telemetry / telemetry / core / backends / chrome / cros_browser_backend.py
index 843ce6c..ca802fb 100644 (file)
@@ -1,14 +1,18 @@
 # 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
@@ -32,12 +36,16 @@ class CrOSBrowserBackend(chrome_browser_backend.ChromeBrowserBackend):
     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())
 
@@ -186,7 +194,9 @@ class CrOSBrowserBackend(chrome_browser_backend.ChromeBrowserBackend):
     """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):
@@ -208,15 +218,12 @@ class CrOSBrowserBackend(chrome_browser_backend.ChromeBrowserBackend):
     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)
@@ -255,10 +262,9 @@ class CrOSBrowserBackend(chrome_browser_backend.ChromeBrowserBackend):
 
     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)
@@ -269,6 +275,11 @@ class CrOSBrowserBackend(chrome_browser_backend.ChromeBrowserBackend):
 
     self._cri = None
 
+  @property
+  @decorators.Cache
+  def forwarder_factory(self):
+    return cros_forwarder.CrOsForwarderFactory(self._cri)
+
   def IsBrowserRunning(self):
     return bool(self.pid)
 
@@ -278,11 +289,6 @@ class CrOSBrowserBackend(chrome_browser_backend.ChromeBrowserBackend):
   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)')
@@ -389,7 +395,8 @@ class CrOSBrowserBackend(chrome_browser_backend.ChromeBrowserBackend):
 
   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()
@@ -398,7 +405,8 @@ class CrOSBrowserBackend(chrome_browser_backend.ChromeBrowserBackend):
     """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)
@@ -444,43 +452,3 @@ class CrOSBrowserBackend(chrome_browser_backend.ChromeBrowserBackend):
                        '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
-