Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Start running webdriver tests #13261

Closed
wants to merge 9 commits into from

Upgrade wptrunner to e7e40be.

  • Loading branch information
jdm committed Sep 13, 2016
commit 3245293c003d4a6fa29742b534c4e92beb59e814
@@ -28,6 +28,7 @@

product_list = ["b2g",
"chrome",
"edge",
"firefox",
"servo",
"servodriver"]
@@ -3,6 +3,7 @@
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

import os
import platform
import subprocess
import sys

@@ -128,10 +129,16 @@ def start(self):
self.profile.set_preferences({"marionette.defaultPrefs.enabled": True,
"marionette.defaultPrefs.port": self.marionette_port,
"dom.disable_open_during_load": False,
"network.dns.localDomains": ",".join(hostnames)})
"network.dns.localDomains": ",".join(hostnames),
"places.history.enabled": False})
if self.e10s:
self.profile.set_preferences({"browser.tabs.remote.autostart": True})

# Bug 1262954: winxp + e10s, disable hwaccel
if (self.e10s and platform.system() in ("Windows", "Microsoft") and
'5.1' in platform.version()):
self.profile.set_preferences({"layers.acceleration.disabled": True})

if self.ca_certificate_path is not None:
self.setup_ssl()

@@ -6,15 +6,16 @@

from .base import NullBrowser, ExecutorBrowser, require_arg
from ..executors import executor_kwargs as base_executor_kwargs
from ..executors.executorservo import ServoTestharnessExecutor, ServoRefTestExecutor
from ..executors.executorservo import ServoTestharnessExecutor, ServoRefTestExecutor, ServoWdspecExecutor

here = os.path.join(os.path.split(__file__)[0])

__wptrunner__ = {"product": "servo",
"check_args": "check_args",
"browser": "ServoBrowser",
"executor": {"testharness": "ServoTestharnessExecutor",
"reftest": "ServoRefTestExecutor"},
"reftest": "ServoRefTestExecutor",
"wdspec": "ServoWdspecExecutor"},
"browser_kwargs": "browser_kwargs",
"executor_kwargs": "executor_kwargs",
"env_options": "env_options",
@@ -17,11 +17,11 @@

errors = None
marionette = None
pytestrunner = None
webdriver = None

here = os.path.join(os.path.split(__file__)[0])

from . import pytestrunner
from .base import (ExecutorException,
Protocol,
RefTestExecutor,
@@ -41,7 +41,7 @@


def do_delayed_imports():
global errors, marionette, webdriver
global errors, marionette

# Marionette client used to be called marionette, recently it changed
# to marionette_driver for unfathomable reasons
@@ -51,8 +51,6 @@ def do_delayed_imports():
except ImportError:
from marionette_driver import marionette, errors

import webdriver


class MarionetteProtocol(Protocol):
def __init__(self, executor, browser):
@@ -292,7 +290,7 @@ def is_alive(self):
class ExecuteAsyncScriptRun(object):
def __init__(self, logger, func, marionette, url, timeout):
self.logger = logger
self.result = None
self.result = (None, None)
self.marionette = marionette
self.func = func
self.url = url
@@ -323,11 +321,9 @@ def run(self):
wait_timeout = None

flag = self.result_flag.wait(wait_timeout)
if self.result is None:
if self.result[1] is None:
self.logger.debug("Timed out waiting for a result")
assert not flag
self.result = False, ("EXTERNAL-TIMEOUT", None)

return self.result

def _run(self):
@@ -409,7 +405,8 @@ def do_testharness(self, marionette, url, timeout):
"timeout": timeout_ms,
"explicit_timeout": timeout is None}

return marionette.execute_async_script(script, new_sandbox=False)
rv = marionette.execute_async_script(script, new_sandbox=False)
return rv


class MarionetteRefTestExecutor(RefTestExecutor):
@@ -487,7 +484,7 @@ def _screenshot(self, marionette, url, timeout):
class WdspecRun(object):
def __init__(self, func, session, path, timeout):
self.func = func
self.result = None
self.result = (None, None)
self.session = session
self.path = path
self.timeout = timeout
@@ -504,8 +501,7 @@ def run(self):
executor.start()

flag = self.result_flag.wait(self.timeout)
if self.result is None:
assert not flag
if self.result[1] is None:
self.result = False, ("EXTERNAL-TIMEOUT", None)

return self.result
@@ -528,6 +524,7 @@ def _run(self):
class MarionetteWdspecExecutor(WdspecExecutor):
def __init__(self, browser, server_config, webdriver_binary,
timeout_multiplier=1, close_after_done=True, debug_info=None):
self.do_delayed_imports()
WdspecExecutor.__init__(self, browser, server_config,
timeout_multiplier=timeout_multiplier,
debug_info=debug_info)
@@ -557,3 +554,8 @@ def do_wdspec(self, session, path, timeout):
harness_result = ("OK", None)
subtest_results = pytestrunner.run(path, session, timeout=timeout)
return (harness_result, subtest_results)

def do_delayed_imports(self):
global pytestrunner, webdriver
from . import pytestrunner
from tools import webdriver
@@ -22,20 +22,21 @@
strip_server)
from ..testrunner import Stop


here = os.path.join(os.path.split(__file__)[0])

webdriver = None
exceptions = None
RemoteConnection = None

extra_timeout = 5

def do_delayed_imports():
global webdriver
global exceptions
global RemoteConnection
from selenium import webdriver
from selenium.common import exceptions

from selenium.webdriver.remote.remote_connection import RemoteConnection

class SeleniumProtocol(Protocol):
def __init__(self, executor, browser, capabilities, **kwargs):
@@ -53,8 +54,9 @@ def setup(self, runner):

session_started = False
try:
self.webdriver = webdriver.Remote(
self.url, desired_capabilities=self.capabilities)
self.webdriver = webdriver.Remote(command_executor=RemoteConnection(self.url.strip("/"),
resolve_ip=False),
desired_capabilities=self.capabilities)
except:
self.logger.warning(
"Connecting to Selenium failed:\n%s" % traceback.format_exc())
@@ -231,17 +233,7 @@ def is_alive(self):
def do_test(self, test):
self.logger.info("Test requires OS-level window focus")

if self.close_after_done and self.has_window:
self.protocol.webdriver.close()
self.protocol.webdriver.switch_to_window(
self.protocol.webdriver.window_handles[-1])
self.has_window = False

if not self.has_window:
self.protocol.webdriver.execute_script(self.script)
self.protocol.webdriver.switch_to_window(
self.protocol.webdriver.window_handles[-1])
self.has_window = True
self.protocol.webdriver.set_window_size(600, 600)

result = self.implementation.run_test(test)

@@ -4,11 +4,13 @@

import base64
import hashlib
import httplib
import json
import os
import subprocess
import tempfile
import threading
import traceback
import urlparse
import uuid
from collections import defaultdict
@@ -19,11 +21,19 @@
Protocol,
RefTestImplementation,
testharness_result_converter,
reftest_result_converter)
reftest_result_converter,
WdspecExecutor)
from .process import ProcessTestExecutor
from ..browsers.base import browser_command
from ..wpttest import WdspecResult, WdspecSubtestResult
from ..webdriver_server import ServoDriverServer
from .executormarionette import WdspecRun

pytestrunner = None
render_arg = None
webdriver = None

extra_timeout = 5 # seconds

def do_delayed_imports():
global render_arg
@@ -214,10 +224,7 @@ def screenshot(self, test, viewport_size, dpi):
for pref, value in test.environment.get('prefs', {}).iteritems():
command += ["--pref", "%s=%s" % (pref, value)]

if viewport_size:
command += ["--resolution", viewport_size]
else:
command += ["--resolution", "800x600"]
command += ["--resolution", viewport_size or "800x600"]

if dpi:
command += ["--device-pixel-ratio", dpi]
@@ -275,3 +282,83 @@ def on_output(self, line):
self.logger.process_output(self.proc.pid,
line,
" ".join(self.command))

class ServoWdspecProtocol(Protocol):
def __init__(self, executor, browser):
self.do_delayed_imports()
Protocol.__init__(self, executor, browser)
self.session = None
self.server = None

def setup(self, runner):
try:
self.server = ServoDriverServer(self.logger, binary=self.browser.binary, binary_args=self.browser.binary_args, render_backend=self.browser.render_backend)
self.server.start(block=False)
self.logger.info(
"WebDriver HTTP server listening at %s" % self.server.url)

self.logger.info(
"Establishing new WebDriver session with %s" % self.server.url)
self.session = webdriver.Session(
self.server.host, self.server.port, self.server.base_path)
except Exception:
self.logger.error(traceback.format_exc())
self.executor.runner.send_message("init_failed")
else:
self.executor.runner.send_message("init_succeeded")

def teardown(self):
if self.server is not None:
try:
if self.session.session_id is not None:
self.session.end()
except Exception:
pass
if self.server.is_alive:
self.server.stop()

@property
def is_alive(self):
conn = httplib.HTTPConnection(self.server.host, self.server.port)
conn.request("HEAD", self.server.base_path + "invalid")
res = conn.getresponse()
return res.status == 404

def do_delayed_imports(self):
global pytestrunner, webdriver
from . import pytestrunner
import webdriver


class ServoWdspecExecutor(WdspecExecutor):
def __init__(self, browser, server_config,
timeout_multiplier=1, close_after_done=True, debug_info=None,
**kwargs):
WdspecExecutor.__init__(self, browser, server_config,
timeout_multiplier=timeout_multiplier,
debug_info=debug_info)
self.protocol = ServoWdspecProtocol(self, browser)

def is_alive(self):
return self.protocol.is_alive

def on_environment_change(self, new_environment):
pass

def do_test(self, test):
timeout = test.timeout * self.timeout_multiplier + extra_timeout

success, data = WdspecRun(self.do_wdspec,
self.protocol.session,
test.path,
timeout).run()

if success:
return self.convert_result(test, data)

return (test.result_cls(*data), [])

def do_wdspec(self, session, path, timeout):
harness_result = ("OK", None)
subtest_results = pytestrunner.run(path, session, timeout=timeout)
return (harness_result, subtest_results)
@@ -14,7 +14,6 @@
RefTestImplementation,
TestharnessExecutor,
strip_server)
from .. import webdriver
from ..testrunner import Stop

webdriver = None
@@ -26,7 +25,7 @@

def do_delayed_imports():
global webdriver
import webdriver
from tools import webdriver


class ServoWebDriverProtocol(Protocol):
ProTip! Use n and p to navigate between commits in a pull request.
You can’t perform that action at this time.