Skip to content

Commit

Permalink
Added support for Servo webdriver. (#188)
Browse files Browse the repository at this point in the history
Added support for Servo webdriver.
  • Loading branch information
Alan Jeffrey authored and jgraham committed May 12, 2016
1 parent bd8b09c commit e6fa267
Show file tree
Hide file tree
Showing 4 changed files with 115 additions and 7 deletions.
5 changes: 3 additions & 2 deletions wptrunner/browsers/servo.py
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
90 changes: 87 additions & 3 deletions wptrunner/executors/executorservo.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -19,15 +21,23 @@
Protocol,
RefTestImplementation,
testharness_result_converter,
reftest_result_converter)
reftest_result_converter,
WdspecExecutor)
from .process import ProcessTestExecutor
from ..browsers.base import browser_command
render_arg = None
from ..wpttest import WdspecResult, WdspecSubtestResult
from ..webdriver_server import ServoDriverServer
from .executormarionette import WdspecRun
from . import pytestrunner

render_arg = None
webdriver = None
extra_timeout = 5 # seconds

def do_delayed_imports():
global render_arg
global render_arg, webdriver
from ..browsers.servo import render_arg
import webdriver

hosts_text = """127.0.0.1 web-platform.test
127.0.0.1 www.web-platform.test
Expand Down Expand Up @@ -273,3 +283,77 @@ def on_output(self, line):
self.logger.process_output(self.proc.pid,
line,
" ".join(self.command))

class ServoWdspecProtocol(Protocol):
def __init__(self, executor, browser):
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

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)
25 changes: 24 additions & 1 deletion wptrunner/webdriver_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@


__all__ = ["SeleniumServer", "ChromeDriverServer",
"GeckoDriverServer", "WebDriverServer"]
"GeckoDriverServer", "ServoDriverServer",
"WebDriverServer"]


class WebDriverServer(object):
Expand Down Expand Up @@ -154,6 +155,28 @@ def make_command(self):
"--webdriver-port", str(self.port)]


class ServoDriverServer(WebDriverServer):
def __init__(self, logger, binary="servo", binary_args=None, host="127.0.0.1", port=None, render_backend=None):
env = os.environ.copy()
env["RUST_BACKTRACE"] = "1"
WebDriverServer.__init__(self, logger, binary, host=host, port=port, env=env)
self.binary_args = binary_args
self.render_backend = render_backend

def make_command(self):
command = [self.binary,
"--webdriver", str(self.port),
"--hard-fail",
"--headless"]
if self.binary_args:
command += self.binary_args
if self.render_backend == "cpu":
command += ["--cpu"]
elif self.render_backend == "webrender":
command += ["--webrender"]
return command


def cmd_arg(name, value=None):
prefix = "-" if platform.system() == "Windows" else "--"
rv = prefix + name
Expand Down
2 changes: 1 addition & 1 deletion wptrunner/wpttest.py
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ def from_manifest(cls, manifest_item, inherit_metadata, test_metadata):
inherit_metadata,
test_metadata,
timeout=timeout,
path=manifest_item.path,
path=manifest_item.source_file.path,
protocol="https" if hasattr(manifest_item, "https") and manifest_item.https else "http")

@property
Expand Down

0 comments on commit e6fa267

Please sign in to comment.