diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 09:22:09 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 09:22:09 +0000 |
commit | 43a97878ce14b72f0981164f87f2e35e14151312 (patch) | |
tree | 620249daf56c0258faa40cbdcf9cfba06de2a846 /testing/web-platform/tests/tools/serve/wave.py | |
parent | Initial commit. (diff) | |
download | firefox-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.py | 134 |
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 |