Skip to content
This repository has been archived by the owner on Dec 18, 2018. It is now read-only.

Commit

Permalink
Implement support for multi-global tests. (#88)
Browse files Browse the repository at this point in the history
* Implement support for multi-global tests.

CC <web-platform-tests/wpt#2558>.

* Make the .any.js and .worker.js handlers more robust against unexpected file names.
  • Loading branch information
Ms2ger authored and jgraham committed Jul 26, 2016
1 parent 2f34984 commit 4574b2e
Show file tree
Hide file tree
Showing 3 changed files with 90 additions and 3 deletions.
23 changes: 22 additions & 1 deletion manifest/sourcefile.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,15 @@

wd_pattern = "*.py"

def replace_end(s, old, new):
"""
Given a string `s` that ends with `old`, replace that occurrence of `old`
with `new`.
"""
assert s.endswith(old)
return s[:-len(old)] + new


class SourceFile(object):
parsers = {"html":lambda x:html5lib.parse(x, treebuilder="etree"),
"xhtml":ElementTree.parse,
Expand Down Expand Up @@ -102,6 +111,12 @@ def name_is_manual(self):
be a manual test file"""
return self.type_flag == "manual"

@property
def name_is_multi_global(self):
"""Check if the file name matches the conditions for the file to
be a multi-global js test file"""
return "any" in self.meta_flags and self.ext == ".js"

@property
def name_is_worker(self):
"""Check if the file name matches the conditions for the file to
Expand Down Expand Up @@ -296,8 +311,14 @@ def manifest_items(self):
elif self.name_is_manual:
rv = [ManualTest(self, self.url)]

elif self.name_is_multi_global:
rv = [
TestharnessTest(self, replace_end(self.url, ".any.js", ".any.html")),
TestharnessTest(self, replace_end(self.url, ".any.js", ".any.worker")),
]

elif self.name_is_worker:
rv = [TestharnessTest(self, self.url[:-3])]
rv = [TestharnessTest(self, replace_end(self.url, ".worker.js", ".worker"))]

elif self.name_is_webdriver:
rv = [WebdriverSpecTest(self, self.url)]
Expand Down
7 changes: 7 additions & 0 deletions manifest/tests/test_manifest.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,3 +53,10 @@ def test_manifest_to_json():
assert list(loaded) == list(m)

assert loaded.to_json() == json_str

def test_multi_global():
s = sourcefile.SourceFile("/", "test.any.js", "/")
assert s.name_is_multi_global
assert not s.name_is_manual
assert not s.name_is_reference
assert not s.name_is_worker
63 changes: 61 additions & 2 deletions serve/serve.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,15 @@

repo_root = localpaths.repo_root

def replace_end(s, old, new):
"""
Given a string `s` that ends with `old`, replace that occurrence of `old`
with `new`.
"""
assert s.endswith(old)
return s[:-len(old)] + new


class WorkersHandler(object):
def __init__(self):
self.handler = handlers.handler(self.handle_request)
Expand All @@ -31,7 +40,7 @@ def __call__(self, request, response):
return self.handler(request, response)

def handle_request(self, request, response):
worker_path = request.url_parts.path.replace(".worker", ".worker.js")
worker_path = replace_end(request.url_parts.path, ".worker", ".worker.js")
return """<!doctype html>
<meta charset=utf-8>
<script src="/resources/testharness.js"></script>
Expand All @@ -42,6 +51,52 @@ def handle_request(self, request, response):
</script>
""" % (worker_path,)


class AnyHtmlHandler(object):
def __init__(self):
self.handler = handlers.handler(self.handle_request)

def __call__(self, request, response):
return self.handler(request, response)

def handle_request(self, request, response):
test_path = replace_end(request.url_parts.path, ".any.html", ".any.js")
return """\
<!doctype html>
<meta charset=utf-8>
<script>
self.GLOBAL = {
isWindow: function() { return true; },
isWorker: function() { return false; },
};
</script>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id=log></div>
<script src="%s"></script>
""" % (test_path,)


class AnyWorkerHandler(object):
def __init__(self):
self.handler = handlers.handler(self.handle_request)

def __call__(self, request, response):
return self.handler(request, response)

def handle_request(self, request, response):
test_path = replace_end(request.url_parts.path, ".any.worker.js", ".any.js")
return """\
self.GLOBAL = {
isWindow: function() { return false; },
isWorker: function() { return true; },
};
importScripts("/resources/testharness.js");
importScripts("%s");
done();
""" % (test_path,)


rewrites = [("GET", "/resources/WebIDLParser.js", "/resources/webidl2/lib/webidl2.js")]

subdomains = [u"www",
Expand All @@ -61,7 +116,11 @@ def __init__(self):
("*", "{spec}/tools/*", handlers.ErrorHandler(404)),
("*", "/serve.py", handlers.ErrorHandler(404))]

self.static = [("GET", "*.worker", WorkersHandler())]
self.static = [
("GET", "*.worker", WorkersHandler()),
("GET", "*.any.html", AnyHtmlHandler()),
("GET", "*.any.worker.js", AnyWorkerHandler()),
]

self.mountpoint_routes = OrderedDict()

Expand Down

0 comments on commit 4574b2e

Please sign in to comment.