Bug 1333114 - Update to latest wptrunner, a=testonly draft
authorJames Graham <james@hoppipolla.co.uk>
Thu, 19 Jan 2017 16:07:24 +0000
changeset 468013 eabfc4dce6edb05793ed89ec833e6c7e61abb931
parent 468012 c1cc45eb50c4e001b62db5f1fcd5459e3f9dd72f
child 468014 256788d3ca9d9d2a29038b0868ff6cb3f15332c4
push id43335
push userbmo:james@hoppipolla.co.uk
push dateMon, 30 Jan 2017 16:23:59 +0000
reviewerstestonly
bugs1333114
milestone54.0a1
Bug 1333114 - Update to latest wptrunner, a=testonly MozReview-Commit-ID: DE87Ulhpcey
testing/web-platform/harness/setup.py
testing/web-platform/harness/test/testdata/reftest/reftest_wait_0.html
testing/web-platform/harness/wptrunner/browsers/servo.py
testing/web-platform/harness/wptrunner/browsers/servodriver.py
testing/web-platform/harness/wptrunner/environment.py
testing/web-platform/harness/wptrunner/executors/executormarionette.py
testing/web-platform/harness/wptrunner/executors/executorservo.py
testing/web-platform/harness/wptrunner/executors/executorservodriver.py
testing/web-platform/harness/wptrunner/executors/pytestrunner/fixtures.py
testing/web-platform/harness/wptrunner/executors/pytestrunner/runner.py
testing/web-platform/harness/wptrunner/executors/reftest-wait_servodriver.js
testing/web-platform/harness/wptrunner/tests/test_chunker.py
testing/web-platform/harness/wptrunner/tests/test_testloader.py
testing/web-platform/harness/wptrunner/update/update.py
testing/web-platform/harness/wptrunner/webdriver_server.py
testing/web-platform/harness/wptrunner/wptcommandline.py
--- a/testing/web-platform/harness/setup.py
+++ b/testing/web-platform/harness/setup.py
@@ -14,17 +14,17 @@ here = os.path.split(__file__)[0]
 PACKAGE_NAME = 'wptrunner'
 PACKAGE_VERSION = '1.14'
 
 # Dependencies
 with open(os.path.join(here, "requirements.txt")) as f:
     deps = f.read().splitlines()
 
 # Browser-specific requirements
-requirements_files = glob.glob(os.path.join(here, "requirements_*.txt"))
+requirements_files = glob.glob("requirements_*.txt")
 
 profile_dest = None
 dest_exists = False
 
 setup(name=PACKAGE_NAME,
       version=PACKAGE_VERSION,
       description="Harness for running the W3C web-platform-tests against various products",
       author='Mozilla Automation and Testing Team',
--- a/testing/web-platform/harness/test/testdata/reftest/reftest_wait_0.html
+++ b/testing/web-platform/harness/test/testdata/reftest/reftest_wait_0.html
@@ -1,11 +1,13 @@
+<html class="reftest-wait">
 <title>rel=match that should fail</title>
 <link rel=match href=red.html>
 <style>
 :root {background-color:red}
 </style>
-<body class="reftest-wait">
 <script>
 setTimeout(function() {
   document.documentElement.style.backgroundColor = "green";
-  body.className = "";
-}, 2000);
\ No newline at end of file
+  document.documentElement.className = "";
+}, 2000);
+</script>
+</html>
--- a/testing/web-platform/harness/wptrunner/browsers/servo.py
+++ b/testing/web-platform/harness/wptrunner/browsers/servo.py
@@ -5,39 +5,43 @@
 import os
 
 from .base import NullBrowser, ExecutorBrowser, require_arg
 from ..executors import executor_kwargs as base_executor_kwargs
 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",
-                              "wdspec": "ServoWdspecExecutor"},
-                 "browser_kwargs": "browser_kwargs",
-                 "executor_kwargs": "executor_kwargs",
-                 "env_options": "env_options",
-                 "run_info_extras": "run_info_extras",
-                 "update_properties": "update_properties"}
+__wptrunner__ = {
+    "product": "servo",
+    "check_args": "check_args",
+    "browser": "ServoBrowser",
+    "executor": {
+        "testharness": "ServoTestharnessExecutor",
+        "reftest": "ServoRefTestExecutor",
+        "wdspec": "ServoWdspecExecutor",
+    },
+    "browser_kwargs": "browser_kwargs",
+    "executor_kwargs": "executor_kwargs",
+    "env_options": "env_options",
+    "update_properties": "update_properties",
+}
 
 
 def check_args(**kwargs):
     require_arg(kwargs, "binary")
 
 
 def browser_kwargs(**kwargs):
-    return {"binary": kwargs["binary"],
-            "debug_info": kwargs["debug_info"],
-            "binary_args": kwargs["binary_args"],
-            "user_stylesheets": kwargs.get("user_stylesheets"),
-            "render_backend": kwargs.get("servo_backend")}
+    return {
+        "binary": kwargs["binary"],
+        "debug_info": kwargs["debug_info"],
+        "binary_args": kwargs["binary_args"],
+        "user_stylesheets": kwargs.get("user_stylesheets"),
+    }
 
 
 def executor_kwargs(test_type, server_config, cache_manager, run_info_data,
                     **kwargs):
     rv = base_executor_kwargs(test_type, server_config,
                               cache_manager, **kwargs)
     rv["pause_after_test"] = kwargs["pause_after_test"]
     return rv
@@ -46,36 +50,28 @@ def executor_kwargs(test_type, server_co
 def env_options():
     return {"host": "127.0.0.1",
             "external_host": "web-platform.test",
             "bind_hostname": "true",
             "testharnessreport": "testharnessreport-servo.js",
             "supports_debugger": True}
 
 
-def run_info_extras(**kwargs):
-    return {"backend": kwargs["servo_backend"]}
-
-
 def update_properties():
-    return ["debug", "os", "version", "processor", "bits", "backend"], None
-
-
-def render_arg(render_backend):
-    return {"cpu": "--cpu", "webrender": "-w"}[render_backend]
+    return ["debug", "os", "version", "processor", "bits"], None
 
 
 class ServoBrowser(NullBrowser):
     def __init__(self, logger, binary, debug_info=None, binary_args=None,
-                 user_stylesheets=None, render_backend="webrender"):
+                 user_stylesheets=None):
         NullBrowser.__init__(self, logger)
         self.binary = binary
         self.debug_info = debug_info
         self.binary_args = binary_args or []
         self.user_stylesheets = user_stylesheets or []
-        self.render_backend = render_backend
 
     def executor_browser(self):
-        return ExecutorBrowser, {"binary": self.binary,
-                                 "debug_info": self.debug_info,
-                                 "binary_args": self.binary_args,
-                                 "user_stylesheets": self.user_stylesheets,
-                                 "render_backend": self.render_backend}
+        return ExecutorBrowser, {
+            "binary": self.binary,
+            "debug_info": self.debug_info,
+            "binary_args": self.binary_args,
+            "user_stylesheets": self.user_stylesheets,
+        }
--- a/testing/web-platform/harness/wptrunner/browsers/servodriver.py
+++ b/testing/web-platform/harness/wptrunner/browsers/servodriver.py
@@ -4,112 +4,114 @@
 
 import os
 import subprocess
 import tempfile
 
 from mozprocess import ProcessHandler
 
 from .base import Browser, require_arg, get_free_port, browser_command, ExecutorBrowser
-from .servo import render_arg
 from ..executors import executor_kwargs as base_executor_kwargs
 from ..executors.executorservodriver import (ServoWebDriverTestharnessExecutor,
                                              ServoWebDriverRefTestExecutor)
 
 here = os.path.join(os.path.split(__file__)[0])
 
-__wptrunner__ = {"product": "servodriver",
-                 "check_args": "check_args",
-                 "browser": "ServoWebDriverBrowser",
-                 "executor": {"testharness": "ServoWebDriverTestharnessExecutor",
-                              "reftest": "ServoWebDriverRefTestExecutor"},
-                 "browser_kwargs": "browser_kwargs",
-                 "executor_kwargs": "executor_kwargs",
-                 "env_options": "env_options",
-                 "run_info_extras": "run_info_extras",
-                 "update_properties": "update_properties"}
+__wptrunner__ = {
+    "product": "servodriver",
+    "check_args": "check_args",
+    "browser": "ServoWebDriverBrowser",
+    "executor": {
+        "testharness": "ServoWebDriverTestharnessExecutor",
+        "reftest": "ServoWebDriverRefTestExecutor",
+    },
+    "browser_kwargs": "browser_kwargs",
+    "executor_kwargs": "executor_kwargs",
+    "env_options": "env_options",
+    "update_properties": "update_properties",
+}
 
 hosts_text = """127.0.0.1 web-platform.test
 127.0.0.1 www.web-platform.test
 127.0.0.1 www1.web-platform.test
 127.0.0.1 www2.web-platform.test
 127.0.0.1 xn--n8j6ds53lwwkrqhv28a.web-platform.test
 127.0.0.1 xn--lve-6lad.web-platform.test
 """
 
 
 def check_args(**kwargs):
     require_arg(kwargs, "binary")
 
 
 def browser_kwargs(**kwargs):
-    return {"binary": kwargs["binary"],
-            "debug_info": kwargs["debug_info"],
-            "user_stylesheets": kwargs.get("user_stylesheets"),
-            "render_backend": kwargs.get("servo_backend")}
+    return {
+        "binary": kwargs["binary"],
+        "debug_info": kwargs["debug_info"],
+        "user_stylesheets": kwargs.get("user_stylesheets"),
+    }
 
 
 def executor_kwargs(test_type, server_config, cache_manager, run_info_data, **kwargs):
     rv = base_executor_kwargs(test_type, server_config,
                               cache_manager, **kwargs)
     return rv
 
 
 def env_options():
     return {"host": "127.0.0.1",
             "external_host": "web-platform.test",
             "bind_hostname": "true",
             "testharnessreport": "testharnessreport-servodriver.js",
             "supports_debugger": True}
 
 
-def run_info_extras(**kwargs):
-    return {"backend": kwargs["servo_backend"]}
-
-
 def update_properties():
-    return ["debug", "os", "version", "processor", "bits", "backend"], None
+    return ["debug", "os", "version", "processor", "bits"], None
 
 
 def make_hosts_file():
     hosts_fd, hosts_path = tempfile.mkstemp()
     with os.fdopen(hosts_fd, "w") as f:
         f.write(hosts_text)
     return hosts_path
 
 
 class ServoWebDriverBrowser(Browser):
     used_ports = set()
 
     def __init__(self, logger, binary, debug_info=None, webdriver_host="127.0.0.1",
-                 user_stylesheets=None, render_backend="webrender"):
+                 user_stylesheets=None):
         Browser.__init__(self, logger)
         self.binary = binary
         self.webdriver_host = webdriver_host
         self.webdriver_port = None
         self.proc = None
         self.debug_info = debug_info
         self.hosts_path = make_hosts_file()
         self.command = None
         self.user_stylesheets = user_stylesheets if user_stylesheets else []
-        self.render_backend = render_backend
 
     def start(self):
         self.webdriver_port = get_free_port(4444, exclude=self.used_ports)
         self.used_ports.add(self.webdriver_port)
 
         env = os.environ.copy()
         env["HOST_FILE"] = self.hosts_path
         env["RUST_BACKTRACE"] = "1"
 
-        debug_args, command = browser_command(self.binary,
-                                              [render_arg(self.render_backend), "--hard-fail",
-                                               "--webdriver", str(self.webdriver_port),
-                                               "about:blank"],
-                                              self.debug_info)
+        debug_args, command = browser_command(
+            self.binary,
+            [
+                "--hard-fail",
+                "--webdriver", str(self.webdriver_port),
+                "about:blank",
+            ],
+            self.debug_info
+        )
 
         for stylesheet in self.user_stylesheets:
             command += ["--user-stylesheet", stylesheet]
 
         self.command = command
 
         self.command = debug_args + self.command
 
--- a/testing/web-platform/harness/wptrunner/environment.py
+++ b/testing/web-platform/harness/wptrunner/environment.py
@@ -34,16 +34,18 @@ def do_delayed_imports(logger, test_path
     serve_root = serve_path(test_paths)
     sys.path.insert(0, serve_root)
 
     failed = []
 
     try:
         from tools.serve import serve
     except ImportError:
+        from wpt_tools.serve import serve
+    except ImportError:
         failed.append("serve")
 
     try:
         import sslutils
     except ImportError:
         failed.append("sslutils")
 
     if failed:
--- a/testing/web-platform/harness/wptrunner/executors/executormarionette.py
+++ b/testing/web-platform/harness/wptrunner/executors/executormarionette.py
@@ -584,16 +584,15 @@ class MarionetteWdspecExecutor(WdspecExe
 
         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, self.server_url, timeout=timeout)
+        subtest_results = pytestrunner.run(path, session, timeout=timeout)
         return (harness_result, subtest_results)
 
     def do_delayed_imports(self):
         global pytestrunner, webdriver
         from . import pytestrunner
         import webdriver
--- a/testing/web-platform/harness/wptrunner/executors/executorservo.py
+++ b/testing/web-platform/harness/wptrunner/executors/executorservo.py
@@ -25,25 +25,20 @@ from .base import (ExecutorException,
                    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
-    from ..browsers.servo import render_arg
-
 hosts_text = """127.0.0.1 web-platform.test
 127.0.0.1 www.web-platform.test
 127.0.0.1 www1.web-platform.test
 127.0.0.1 www2.web-platform.test
 127.0.0.1 xn--n8j6ds53lwwkrqhv28a.web-platform.test
 127.0.0.1 xn--lve-6lad.web-platform.test
 """
 
@@ -75,18 +70,20 @@ class ServoTestharnessExecutor(ProcessTe
         except OSError:
             pass
         ProcessTestExecutor.teardown(self)
 
     def do_test(self, test):
         self.result_data = None
         self.result_flag = threading.Event()
 
-        args = [render_arg(self.browser.render_backend), "--hard-fail", "-u", "Servo/wptrunner",
-                "-Z", "replace-surrogates", "-z", self.test_url(test)]
+        args = [
+            "--hard-fail", "-u", "Servo/wptrunner",
+            "-Z", "replace-surrogates", "-z", self.test_url(test),
+        ]
         for stylesheet in self.browser.user_stylesheets:
             args += ["--user-stylesheet", stylesheet]
         for pref, value in test.environment.get('prefs', {}).iteritems():
             args += ["--pref", "%s=%s" % (pref, value)]
         args += self.browser.binary_args
         debug_args, command = browser_command(self.binary, args, self.debug_info)
 
         self.command = command
@@ -208,19 +205,22 @@ class ServoRefTestExecutor(ProcessTestEx
         ProcessTestExecutor.teardown(self)
 
     def screenshot(self, test, viewport_size, dpi):
         full_url = self.test_url(test)
 
         with TempFilename(self.tempdir) as output_path:
             debug_args, command = browser_command(
                 self.binary,
-                [render_arg(self.browser.render_backend), "--hard-fail", "--exit",
-                 "-u", "Servo/wptrunner", "-Z", "disable-text-aa,load-webfonts-synchronously,replace-surrogates",
-                 "--output=%s" % output_path, full_url] + self.browser.binary_args,
+                [
+                    "--hard-fail", "--exit",
+                    "-u", "Servo/wptrunner",
+                    "-Z", "disable-text-aa,load-webfonts-synchronously,replace-surrogates",
+                    "--output=%s" % output_path, full_url
+                ] + self.browser.binary_args,
                 self.debug_info)
 
             for stylesheet in self.browser.user_stylesheets:
                 command += ["--user-stylesheet", stylesheet]
 
             for pref, value in test.environment.get('prefs', {}).iteritems():
                 command += ["--pref", "%s=%s" % (pref, value)]
 
@@ -290,17 +290,17 @@ 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 = ServoDriverServer(self.logger, binary=self.browser.binary, binary_args=self.browser.binary_args)
             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)
--- a/testing/web-platform/harness/wptrunner/executors/executorservodriver.py
+++ b/testing/web-platform/harness/wptrunner/executors/executorservodriver.py
@@ -20,17 +20,17 @@ webdriver = None
 
 here = os.path.join(os.path.split(__file__)[0])
 
 extra_timeout = 5
 
 
 def do_delayed_imports():
     global webdriver
-    from tools import webdriver
+    import webdriver
 
 
 class ServoWebDriverProtocol(Protocol):
     def __init__(self, executor, browser, capabilities, **kwargs):
         do_delayed_imports()
         Protocol.__init__(self, executor, browser)
         self.capabilities = capabilities
         self.host = browser.webdriver_host
--- a/testing/web-platform/harness/wptrunner/executors/pytestrunner/fixtures.py
+++ b/testing/web-platform/harness/wptrunner/executors/pytestrunner/fixtures.py
@@ -2,17 +2,16 @@
 # License, v. 2.0. If a copy of the MPL was not distributed with this file,
 # You can obtain one at http://mozilla.org/MPL/2.0/.
 
 import pytest
 import webdriver
 
 import contextlib
 import httplib
-import urlparse
 
 
 """pytest fixtures for use in Python-based WPT tests.
 
 The purpose of test fixtures is to provide a fixed baseline upon which
 tests can reliably and repeatedly execute.
 """
 
@@ -126,27 +125,12 @@ class HTTPRequest(object):
     def _request(self, method, path):
         conn = httplib.HTTPConnection(self.host, self.port)
         try:
             conn.request(method, path)
             yield conn.getresponse()
         finally:
             conn.close()
 
-class Server(object):
-    """Fixture to allow access to wptrunner's base server url.
-
-    :param url_getter: Function to get server url from test environment, given
-        a protocol.
-    """
-    def __init__(self, url_getter):
-        self.server_url = url_getter
-
-    def where_is(self, uri, protocol="http"):
-        return urlparse.urljoin(self.server_url(protocol), uri)
-
-    @pytest.fixture
-    def server(self, request):
-        return self
 
 @pytest.fixture(scope="module")
 def http(session):
     return HTTPRequest(session.transport.host, session.transport.port)
--- a/testing/web-platform/harness/wptrunner/executors/pytestrunner/runner.py
+++ b/testing/web-platform/harness/wptrunner/executors/pytestrunner/runner.py
@@ -22,39 +22,36 @@ from . import fixtures
 pytest = None
 
 
 def do_delayed_imports():
     global pytest
     import pytest
 
 
-def run(path, session, url_getter, timeout=0):
+def run(path, session, timeout=0):
     """Run Python test at ``path`` in pytest.  The provided ``session``
     is exposed as a fixture available in the scope of the test functions.
 
     :param path: Path to the test file.
     :param session: WebDriver session to expose.
-    :param url_getter: Function to get server url from test environment, given
-        a protocol.
     :param timeout: Duration before interrupting potentially hanging
         tests.  If 0, there is no timeout.
 
     :returns: List of subtest results, which are tuples of (test id,
         status, message, stacktrace).
     """
 
     if pytest is None:
         do_delayed_imports()
 
     recorder = SubtestResultRecorder()
     plugins = [recorder,
                fixtures,
-               fixtures.Session(session),
-               fixtures.Server(url_getter)]
+               fixtures.Session(session)]
 
     # TODO(ato): Deal with timeouts
 
     with TemporaryDirectory() as cache:
         pytest.main(["--strict",  # turn warnings into errors
                      "--verbose",  # show each individual subtest
                      "--capture", "no",  # enable stdout/stderr from tests
                      "--basetemp", cache,  # temporary directory
--- a/testing/web-platform/harness/wptrunner/executors/reftest-wait_servodriver.js
+++ b/testing/web-platform/harness/wptrunner/executors/reftest-wait_servodriver.js
@@ -1,17 +1,17 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
  */
 
 callback = arguments[arguments.length - 1];
 
 function check_done() {
-    if (!document.body.classList.contains('reftest-wait')) {
+    if (!document.documentElement.classList.contains('reftest-wait')) {
         callback();
     } else {
         setTimeout(check_done, 50);
     }
 }
 
 if (document.readyState === 'complete') {
     check_done();
--- a/testing/web-platform/harness/wptrunner/tests/test_chunker.py
+++ b/testing/web-platform/harness/wptrunner/tests/test_chunker.py
@@ -19,68 +19,75 @@ class MockTest(object):
     def __init__(self, id, timeout=10):
         self.id = id
         self.item_type = "testharness"
         self.timeout = timeout
 
 
 def make_mock_manifest(*items):
     rv = []
-    for dir_path, num_tests in items:
+    for test_type, dir_path, num_tests in items:
         for i in range(num_tests):
-            rv.append((dir_path + "/%i.test" % i, set([MockTest(i)])))
+            rv.append((test_type,
+                       dir_path + "/%i.test" % i,
+                       set([MockTest(i)])))
     return rv
 
 
 class TestEqualTimeChunker(unittest.TestCase):
 
     def test_include_all(self):
-        tests = make_mock_manifest(("a", 10), ("a/b", 10), ("c", 10))
+        tests = make_mock_manifest(("test", "a", 10), ("test", "a/b", 10),
+                                   ("test", "c", 10))
 
         chunk_1 = list(EqualTimeChunker(3, 1)(tests))
         chunk_2 = list(EqualTimeChunker(3, 2)(tests))
         chunk_3 = list(EqualTimeChunker(3, 3)(tests))
 
         self.assertEquals(tests[:10], chunk_1)
         self.assertEquals(tests[10:20], chunk_2)
         self.assertEquals(tests[20:], chunk_3)
 
     def test_include_all_1(self):
-        tests = make_mock_manifest(("a", 5), ("a/b", 5), ("c", 10), ("d", 10))
+        tests = make_mock_manifest(("test", "a", 5), ("test", "a/b", 5),
+                                   ("test", "c", 10), ("test", "d", 10))
 
         chunk_1 = list(EqualTimeChunker(3, 1)(tests))
         chunk_2 = list(EqualTimeChunker(3, 2)(tests))
         chunk_3 = list(EqualTimeChunker(3, 3)(tests))
 
         self.assertEquals(tests[:10], chunk_1)
         self.assertEquals(tests[10:20], chunk_2)
         self.assertEquals(tests[20:], chunk_3)
 
     def test_long(self):
-        tests = make_mock_manifest(("a", 100), ("a/b", 1), ("c", 1))
+        tests = make_mock_manifest(("test", "a", 100), ("test", "a/b", 1),
+                                   ("test", "c", 1))
 
         chunk_1 = list(EqualTimeChunker(3, 1)(tests))
         chunk_2 = list(EqualTimeChunker(3, 2)(tests))
         chunk_3 = list(EqualTimeChunker(3, 3)(tests))
 
         self.assertEquals(tests[:100], chunk_1)
         self.assertEquals(tests[100:101], chunk_2)
         self.assertEquals(tests[101:102], chunk_3)
 
     def test_long_1(self):
-        tests = make_mock_manifest(("a", 1), ("a/b", 100), ("c", 1))
+        tests = make_mock_manifest(("test", "a", 1), ("test", "a/b", 100),
+                                   ("test", "c", 1))
 
         chunk_1 = list(EqualTimeChunker(3, 1)(tests))
         chunk_2 = list(EqualTimeChunker(3, 2)(tests))
         chunk_3 = list(EqualTimeChunker(3, 3)(tests))
 
         self.assertEquals(tests[:1], chunk_1)
         self.assertEquals(tests[1:101], chunk_2)
         self.assertEquals(tests[101:102], chunk_3)
 
     def test_too_few_dirs(self):
         with self.assertRaises(ValueError):
-            tests = make_mock_manifest(("a", 1), ("a/b", 100), ("c", 1))
+            tests = make_mock_manifest(("test", "a", 1), ("test", "a/b", 100),
+                                       ("test", "c", 1))
             list(EqualTimeChunker(4, 1)(tests))
 
 
 if __name__ == "__main__":
     unittest.main()
--- a/testing/web-platform/harness/wptrunner/tests/test_testloader.py
+++ b/testing/web-platform/harness/wptrunner/tests/test_testloader.py
@@ -18,15 +18,16 @@ structured.set_default_logger(structured
 
 include_ini = """\
 skip: true
 [test_\u53F0]
   skip: false
 """
 
 def test_filter_unicode():
-    tests = make_mock_manifest(("a", 10), ("a/b", 10), ("c", 10))
+    tests = make_mock_manifest(("test", "a", 10), ("test", "a/b", 10),
+                               ("test", "c", 10))
 
     with tempfile.NamedTemporaryFile("wb", suffix=".ini") as f:
         f.write(include_ini.encode('utf-8'))
         f.flush()
 
         Filter(manifest_path=f.name, test_manifests=tests)
--- a/testing/web-platform/harness/wptrunner/update/update.py
+++ b/testing/web-platform/harness/wptrunner/update/update.py
@@ -10,17 +10,20 @@ from sync import SyncFromUpstreamRunner
 from tree import GitTree, HgTree, NoVCSTree
 
 from .. import environment as env
 from base import Step, StepRunner, exit_clean, exit_unclean
 from state import State
 
 def setup_paths(sync_path):
     sys.path.insert(0, os.path.abspath(sync_path))
-    from tools import localpaths
+    try:
+        from tools import localpaths
+    except ImportError:
+        from wpt_tools import localpaths
 
 class LoadConfig(Step):
     """Step for loading configuration from the ini file and kwargs."""
 
     provides = ["sync", "paths", "metadata_path", "tests_path"]
 
     def create(self, state):
         state.sync = {"remote_url": state.kwargs["remote_url"],
--- a/testing/web-platform/harness/wptrunner/webdriver_server.py
+++ b/testing/web-platform/harness/wptrunner/webdriver_server.py
@@ -23,16 +23,20 @@ import mozprocess
 class WebDriverServer(object):
     __metaclass__ = abc.ABCMeta
 
     default_base_path = "/"
     _used_ports = set()
 
     def __init__(self, logger, binary, host="127.0.0.1", port=None,
                  base_path="", env=None):
+        if binary is None:
+            raise ValueError("WebDriver server binary must be given "
+                             "to --webdriver-binary argument")
+
         self.logger = logger
         self.binary = binary
         self.host = host
         if base_path == "":
             self.base_path = self.default_base_path
         else:
             self.base_path = base_path
         self.env = os.environ.copy() if env is None else env
@@ -144,50 +148,45 @@ class EdgeDriverServer(WebDriverServer):
             self, logger, binary, host=host, port=port)
 
     def make_command(self):
         return [self.binary,
                 "--port=%s" % str(self.port)]
 
 
 class GeckoDriverServer(WebDriverServer):
-    def __init__(self, logger, marionette_port=2828, binary="wires",
+    def __init__(self, logger, marionette_port=2828, binary="geckodriver",
                  host="127.0.0.1", port=None):
         env = os.environ.copy()
         env["RUST_BACKTRACE"] = "1"
         WebDriverServer.__init__(self, logger, binary, host=host, port=port, env=env)
         self.marionette_port = marionette_port
 
     def make_command(self):
         return [self.binary,
                 "--connect-existing",
                 "--marionette-port", str(self.marionette_port),
                 "--host", self.host,
                 "--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):
+    def __init__(self, logger, binary="servo", binary_args=None, host="127.0.0.1", port=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
     if value is not None:
         rv += "=" + value
--- a/testing/web-platform/harness/wptrunner/wptcommandline.py
+++ b/testing/web-platform/harness/wptrunner/wptcommandline.py
@@ -175,19 +175,16 @@ scheme host and port.""")
                              help="Run tests without electrolysis preferences")
     gecko_group.add_argument("--stackfix-dir", dest="stackfix_dir", action="store",
                              help="Path to directory containing assertion stack fixing scripts")
 
     servo_group = parser.add_argument_group("Servo-specific")
     servo_group.add_argument("--user-stylesheet",
                              default=[], action="append", dest="user_stylesheets",
                              help="Inject a user CSS stylesheet into every test.")
-    servo_group.add_argument("--servo-backend",
-                             default="webrender", choices=["cpu", "webrender"],
-                             help="Rendering backend to use with Servo.")
 
 
     parser.add_argument("test_list", nargs="*",
                         help="List of URLs for tests to run, or paths including tests to run. "
                              "(equivalent to --include)")
 
     commandline.add_logging_group(parser)
     return parser