| # 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 |