1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
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
|