tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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