summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/tools/serve/wave.py
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 09:22:09 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 09:22:09 +0000
commit43a97878ce14b72f0981164f87f2e35e14151312 (patch)
tree620249daf56c0258faa40cbdcf9cfba06de2a846 /testing/web-platform/tests/tools/serve/wave.py
parentInitial commit. (diff)
downloadfirefox-43a97878ce14b72f0981164f87f2e35e14151312.tar.xz
firefox-43a97878ce14b72f0981164f87f2e35e14151312.zip
Adding upstream version 110.0.1.upstream/110.0.1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'testing/web-platform/tests/tools/serve/wave.py')
-rw-r--r--testing/web-platform/tests/tools/serve/wave.py134
1 files changed, 134 insertions, 0 deletions
diff --git a/testing/web-platform/tests/tools/serve/wave.py b/testing/web-platform/tests/tools/serve/wave.py
new file mode 100644
index 0000000000..b24ec1cc81
--- /dev/null
+++ b/testing/web-platform/tests/tools/serve/wave.py
@@ -0,0 +1,134 @@
+# The ./wpt serve-wave command is broken, so mypy errors are ignored instead of
+# making untestable changes to the problematic imports.
+# See https://github.com/web-platform-tests/wpt/issues/29024.
+# 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