Source code
Revision control
Copy as Markdown
Other Tools
# The ./wpt serve-wave command is broken, so mypy errors are ignored instead of
# making untestable changes to the problematic imports.
# mypy: ignore-errors
import subprocess
from manifest import manifest
import localpaths
import os
try:
from serve import serve
except ImportError:
import serve
from tools.wpt import wpt
class WaveHandler:
def __init__(self, server):
self.server = server
def __call__(self, request, response):
self.server.handle_request(request, response)
def get_route_builder_func(report):
def get_route_builder(logger, aliases, config):
wave_cfg = None
if config is not None and "wave" in config:
wave_cfg = config["wave"]
builder = serve.get_route_builder(logger, aliases, config)
logger.debug("Loading manifest ...")
data = load_manifest()
from ..wave.wave_server import WaveServer
wave_server = WaveServer()
wave_server.initialize(
configuration_file_path=os.path.abspath("./config.json"),
reports_enabled=report,
tests=data["items"])
web_root = "wave"
if wave_cfg is not None and "web_root" in wave_cfg:
web_root = wave_cfg["web_root"]
if not web_root.startswith("/"):
web_root = "/" + web_root
wave_handler = WaveHandler(wave_server)
builder.add_handler("*", web_root + "*", wave_handler)
# serving wave specifc testharnessreport.js
file_path = os.path.join(wpt.localpaths.repo_root, "tools/wave/resources/testharnessreport.js")
builder.add_static(
file_path,
{},
"text/javascript;charset=utf8",
"/resources/testharnessreport.js")
return builder
return get_route_builder
class ConfigBuilder(serve.ConfigBuilder):
_default = serve.ConfigBuilder._default
_default.update({
"wave": { # wave specific configuration parameters
"results": "./results",
"timeouts": {
"automatic": 60000,
"manual": 300000
},
"enable_results_import": False,
"web_root": "/_wave",
"persisting_interval": 20,
"api_titles": []
}
})
def get_parser():
parser = serve.get_parser()
# Added wave specific arguments
parser.add_argument("--report", action="store_true", dest="report",
help="Flag for enabling the WPTReporting server")
return parser
def run(venv=None, **kwargs):
if venv is not None:
venv.start()
else:
raise Exception("Missing virtualenv for serve-wave.")
if kwargs['report'] is True:
if not is_wptreport_installed():
raise Exception("wptreport is not installed. Please install it from https://github.com/w3c/wptreport")
serve.run(config_cls=ConfigBuilder,
route_builder=get_route_builder_func(kwargs["report"]),
log_handlers=None,
**kwargs)
# execute wptreport version check
def is_wptreport_installed():
try:
subprocess.check_output(["wptreport", "--help"])
return True
except Exception:
return False
def load_manifest():
root = localpaths.repo_root
path = os.path.join(root, "MANIFEST.json")
manifest_file = manifest.load_and_update(root, path, "/", parallel=False)
supported_types = ["testharness", "manual"]
data = {"items": {},
"url_base": "/"}
for item_type in supported_types:
data["items"][item_type] = {}
for item_type, path, tests in manifest_file.itertypes(*supported_types):
tests_data = []
for item in tests:
test_data = [item.url[1:]]
if item_type == "reftest":
test_data.append(item.references)
test_data.append({})
if item_type != "manual":
test_data[-1]["timeout"] = item.timeout
tests_data.append(test_data)
assert path not in data["items"][item_type]
data["items"][item_type][path] = tests_data
return data