wave.py (4190B)
1 # The ./wpt serve-wave command is broken, so mypy errors are ignored instead of 2 # making untestable changes to the problematic imports. 3 # See https://github.com/web-platform-tests/wpt/issues/29024. 4 # mypy: ignore-errors 5 6 import subprocess 7 from manifest import manifest 8 import localpaths 9 import os 10 11 try: 12 from serve import serve 13 except ImportError: 14 import serve 15 16 from tools.wpt import wpt 17 18 19 class WaveHandler: 20 def __init__(self, server): 21 self.server = server 22 23 def __call__(self, request, response): 24 self.server.handle_request(request, response) 25 26 27 def get_route_builder_func(report): 28 def get_route_builder(logger, aliases, config): 29 wave_cfg = None 30 if config is not None and "wave" in config: 31 wave_cfg = config["wave"] 32 builder = serve.get_route_builder(logger, aliases, config) 33 logger.debug("Loading manifest ...") 34 data = load_manifest() 35 from ..wave.wave_server import WaveServer 36 wave_server = WaveServer() 37 wave_server.initialize( 38 configuration_file_path=os.path.abspath("./config.json"), 39 reports_enabled=report, 40 tests=data["items"]) 41 42 web_root = "wave" 43 if wave_cfg is not None and "web_root" in wave_cfg: 44 web_root = wave_cfg["web_root"] 45 if not web_root.startswith("/"): 46 web_root = "/" + web_root 47 48 wave_handler = WaveHandler(wave_server) 49 builder.add_handler("*", web_root + "*", wave_handler) 50 # serving wave specific testharnessreport.js 51 file_path = os.path.join(wpt.localpaths.repo_root, "tools/wave/resources/testharnessreport.js") 52 builder.add_static( 53 file_path, 54 {}, 55 "text/javascript;charset=utf8", 56 "/resources/testharnessreport.js") 57 58 return builder 59 return get_route_builder 60 61 62 class ConfigBuilder(serve.ConfigBuilder): 63 _default = serve.ConfigBuilder._default 64 _default.update({ 65 "wave": { # wave specific configuration parameters 66 "results": "./results", 67 "timeouts": { 68 "automatic": 60000, 69 "manual": 300000 70 }, 71 "enable_results_import": False, 72 "web_root": "/_wave", 73 "persisting_interval": 20, 74 "api_titles": [] 75 } 76 }) 77 78 79 def get_parser(): 80 parser = serve.get_parser() 81 # Added wave specific arguments 82 parser.add_argument("--report", action="store_true", 83 help="Flag for enabling the WPTReporting server") 84 return parser 85 86 87 def run(venv=None, **kwargs): 88 if venv is not None: 89 venv.start() 90 else: 91 raise Exception("Missing virtualenv for serve-wave.") 92 93 if kwargs["report"] is True: 94 if not is_wptreport_installed(): 95 raise Exception("wptreport is not installed. Please install it from https://github.com/w3c/wptreport") 96 97 serve.run(config_cls=ConfigBuilder, 98 route_builder=get_route_builder_func(kwargs["report"]), 99 log_handlers=None, 100 **kwargs) 101 102 103 # execute wptreport version check 104 def is_wptreport_installed(): 105 try: 106 subprocess.check_output(["wptreport", "--help"]) 107 return True 108 except Exception: 109 return False 110 111 112 def load_manifest(): 113 root = localpaths.repo_root 114 path = os.path.join(root, "MANIFEST.json") 115 manifest_file = manifest.load_and_update(root, path, "/", parallel=False) 116 117 supported_types = ["testharness", "manual"] 118 data = {"items": {}, 119 "url_base": "/"} 120 for item_type in supported_types: 121 data["items"][item_type] = {} 122 for item_type, path, tests in manifest_file.itertypes(*supported_types): 123 tests_data = [] 124 for item in tests: 125 test_data = [item.url[1:]] 126 if item_type == "reftest": 127 test_data.append(item.references) 128 test_data.append({}) 129 if item_type != "manual": 130 test_data[-1]["timeout"] = item.timeout 131 tests_data.append(test_data) 132 assert path not in data["items"][item_type] 133 data["items"][item_type][path] = tests_data 134 return data