mirror of
https://github.com/servo/servo.git
synced 2025-08-03 20:50:07 +01:00
Auto merge of #26437 - servo:reftest-report, r=jdm
Generalize the 2020 regression report to show local unexpected failures Example usage: ``` ./mach test-wpt --release --layout-2020 --log-raw /tmp/servo.log ./tests/wpt/reftests-report/gen.py /tmp/servo.log firefox ./tests/wpt/reftests-report/report.html ``` Produces a report similar https://community-tc.services.mozilla.com/api/index/v1/task/project.servo.layout-2020-regressions-report/artifacts/public/regressions.html, but showing unexpected reftest failures. The CI-generated one shows Layout 2020 failures (expected or not) that succeed in Layout 2013.
This commit is contained in:
commit
856f03ae75
7 changed files with 55 additions and 29 deletions
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -6,7 +6,7 @@
|
||||||
/.vs
|
/.vs
|
||||||
/android-toolchains
|
/android-toolchains
|
||||||
/target
|
/target
|
||||||
/etc/layout-2020-regressions/regressions.html
|
/tests/wpt/reftests-report/report.html
|
||||||
/ports/android/bin
|
/ports/android/bin
|
||||||
/ports/android/libs
|
/ports/android/libs
|
||||||
/ports/android/local.properties
|
/ports/android/local.properties
|
||||||
|
|
|
@ -260,12 +260,13 @@ def layout_2020_regressions_report():
|
||||||
.with_dockerfile(dockerfile_path("base"))
|
.with_dockerfile(dockerfile_path("base"))
|
||||||
.with_repo_bundle()
|
.with_repo_bundle()
|
||||||
.with_script(
|
.with_script(
|
||||||
"python3 etc/layout-2020-regressions/gen.py %s %s"
|
"python3 tests/wpt/reftests-report/gen.py %s %s"
|
||||||
% (CONFIG.tree_hash(), CONFIG.git_sha)
|
% (CONFIG.tree_hash(), CONFIG.git_sha)
|
||||||
)
|
)
|
||||||
.with_index_and_artifacts_expire_in(log_artifacts_expire_in)
|
.with_index_and_artifacts_expire_in(log_artifacts_expire_in)
|
||||||
.with_artifacts("/repo/etc/layout-2020-regressions/regressions.html")
|
.with_artifacts("/repo/tests/wpt/reftests-report/report.html")
|
||||||
.find_or_create("layout-2020-regressions-report")
|
.with_index_at("layout-2020-regressions-report")
|
||||||
|
.create()
|
||||||
)
|
)
|
||||||
|
|
||||||
def macos_unit():
|
def macos_unit():
|
||||||
|
|
|
@ -157,6 +157,10 @@ class Task:
|
||||||
|
|
||||||
with_extra = chaining(update_attr, "extra")
|
with_extra = chaining(update_attr, "extra")
|
||||||
|
|
||||||
|
def with_index_at(self, index_path):
|
||||||
|
self.routes.append("index.%s.%s" % (CONFIG.index_prefix, index_path))
|
||||||
|
return self
|
||||||
|
|
||||||
def with_treeherder_required(self):
|
def with_treeherder_required(self):
|
||||||
self.treeherder_required = True
|
self.treeherder_required = True
|
||||||
return self
|
return self
|
||||||
|
@ -291,7 +295,7 @@ class Task:
|
||||||
if e.status_code != 404: # pragma: no cover
|
if e.status_code != 404: # pragma: no cover
|
||||||
raise
|
raise
|
||||||
if not CONFIG.index_read_only:
|
if not CONFIG.index_read_only:
|
||||||
self.routes.append("index.%s.%s" % (CONFIG.index_prefix, index_path))
|
self.with_index_at(index_path)
|
||||||
task_id = self.create()
|
task_id = self.create()
|
||||||
|
|
||||||
SHARED.found_or_created_indexed_tasks[index_path] = task_id
|
SHARED.found_or_created_indexed_tasks[index_path] = task_id
|
||||||
|
|
|
@ -84,6 +84,7 @@ files = [
|
||||||
# Python 3 syntax causes "E901 SyntaxError" when flake8 runs in Python 2
|
# Python 3 syntax causes "E901 SyntaxError" when flake8 runs in Python 2
|
||||||
"./etc/taskcluster/decision_task.py",
|
"./etc/taskcluster/decision_task.py",
|
||||||
"./etc/taskcluster/decisionlib.py",
|
"./etc/taskcluster/decisionlib.py",
|
||||||
|
"./tests/wpt/reftests-report/gen.py",
|
||||||
"./components/style/properties/build.py",
|
"./components/style/properties/build.py",
|
||||||
]
|
]
|
||||||
# Directories that are ignored for the non-WPT tidy check.
|
# Directories that are ignored for the non-WPT tidy check.
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#!/usr/bin/env python
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
# This Source Code Form is subject to the terms of the Mozilla Public
|
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
@ -41,33 +41,49 @@ def failing_reftests(platform, key):
|
||||||
|
|
||||||
for chunk in range(1, total_chunks + 1):
|
for chunk in range(1, total_chunks + 1):
|
||||||
with fetch(task(platform, chunk, key) + "/artifacts/public/test-wpt.log") as response:
|
with fetch(task(platform, chunk, key) + "/artifacts/public/test-wpt.log") as response:
|
||||||
for line in response:
|
yield from parse(response)
|
||||||
|
|
||||||
|
|
||||||
|
def parse(file_like):
|
||||||
|
seen = set()
|
||||||
|
for line in file_like:
|
||||||
message = json.loads(line)
|
message = json.loads(line)
|
||||||
if message.get("status") not in {None, "OK", "PASS"}:
|
status = message.get("status")
|
||||||
|
if status not in {None, "OK", "PASS"}:
|
||||||
screenshots = message.get("extra", {}).get("reftest_screenshots")
|
screenshots = message.get("extra", {}).get("reftest_screenshots")
|
||||||
if screenshots:
|
if screenshots:
|
||||||
yield message["test"], screenshots
|
url = message["test"]
|
||||||
|
|
||||||
|
|
||||||
def main(index_key, commit_sha):
|
|
||||||
failures_2013 = {url for url, _ in failing_reftests("linux_x64", index_key)}
|
|
||||||
failures_2020 = Directory()
|
|
||||||
for url, screenshots in failing_reftests("linux_x64_2020", index_key):
|
|
||||||
if url not in failures_2013:
|
|
||||||
assert url.startswith("/")
|
assert url.startswith("/")
|
||||||
failures_2020.add(url[1:], screenshots)
|
yield url[1:], message.get("expected") == "PASS", screenshots
|
||||||
|
|
||||||
|
|
||||||
|
def main(source, commit_sha=None):
|
||||||
|
failures = Directory()
|
||||||
|
|
||||||
|
if commit_sha:
|
||||||
|
title = "<h1>Layout 2020 regressions in commit <code>%s</code></h1>" % commit_sha
|
||||||
|
failures_2013 = {url for url, _ in failing_reftests("linux_x64", source)}
|
||||||
|
for url, _expected_pass, screenshots in failing_reftests("linux_x64_2020", source):
|
||||||
|
if url not in failures_2013:
|
||||||
|
failures.add(url, screenshots)
|
||||||
|
else:
|
||||||
|
title = "Unexpected failures"
|
||||||
|
with open(source, "rb") as file_obj:
|
||||||
|
for url, expected_pass, screenshots in parse(file_obj):
|
||||||
|
if expected_pass:
|
||||||
|
failures.add(url, screenshots)
|
||||||
|
|
||||||
here = os.path.dirname(__file__)
|
here = os.path.dirname(__file__)
|
||||||
with open(os.path.join(here, "prism.js")) as f:
|
with open(os.path.join(here, "prism.js")) as f:
|
||||||
prism_js = f.read()
|
prism_js = f.read()
|
||||||
with open(os.path.join(here, "prism.css")) as f:
|
with open(os.path.join(here, "prism.css")) as f:
|
||||||
prism_css = f.read()
|
prism_css = f.read()
|
||||||
with open(os.path.join(here, "regressions.html"), "w", encoding="utf-8") as html:
|
with open(os.path.join(here, "report.html"), "w", encoding="utf-8") as html:
|
||||||
os.chdir(os.path.join(here, "../../tests/wpt"))
|
os.chdir(os.path.join(here, ".."))
|
||||||
html.write("""
|
html.write("""
|
||||||
<!doctype html>
|
<!doctype html>
|
||||||
<meta charset=utf-8>
|
<meta charset=utf-8>
|
||||||
<title>Layout 2020 regressions</title>
|
<title>WPT reftests failures report</title>
|
||||||
<link rel=stylesheet href=prism.css>
|
<link rel=stylesheet href=prism.css>
|
||||||
<style>
|
<style>
|
||||||
ul { padding-left: 1em }
|
ul { padding-left: 1em }
|
||||||
|
@ -80,11 +96,11 @@ def main(index_key, commit_sha):
|
||||||
li > div > img:hover { transform: scale(3); transform-origin: 0 0 }
|
li > div > img:hover { transform: scale(3); transform-origin: 0 0 }
|
||||||
li > div > pre { grid-row: 3; font-size: 12px !important }
|
li > div > pre { grid-row: 3; font-size: 12px !important }
|
||||||
pre code { white-space: pre-wrap !important }
|
pre code { white-space: pre-wrap !important }
|
||||||
%s
|
<h1>%s</h1>
|
||||||
</style>
|
</style>
|
||||||
<h1>Layout 2020 regressions in tree <code>%s</code></h1>
|
%s
|
||||||
""" % (prism_css, commit_sha))
|
""" % (prism_css, title))
|
||||||
failures_2020.write(html)
|
failures.write(html)
|
||||||
html.write("""
|
html.write("""
|
||||||
<script>
|
<script>
|
||||||
for (let li of document.getElementsByTagName("li")) {
|
for (let li of document.getElementsByTagName("li")) {
|
||||||
|
@ -129,8 +145,12 @@ class Directory:
|
||||||
prefix = "/_mozilla/"
|
prefix = "/_mozilla/"
|
||||||
if url.startswith(prefix):
|
if url.startswith(prefix):
|
||||||
filename = "mozilla/tests/" + url[len(prefix):]
|
filename = "mozilla/tests/" + url[len(prefix):]
|
||||||
|
elif url == "about:blank":
|
||||||
|
src = ""
|
||||||
|
filename = None
|
||||||
else:
|
else:
|
||||||
filename = "web-platform-tests" + url
|
filename = "web-platform-tests" + url
|
||||||
|
if filename:
|
||||||
with open(filename, encoding="utf-8") as f:
|
with open(filename, encoding="utf-8") as f:
|
||||||
src = html_escape(f.read())
|
src = html_escape(f.read())
|
||||||
html.write("<pre><code class=language-html>%s</code></pre>\n" % src)
|
html.write("<pre><code class=language-html>%s</code></pre>\n" % src)
|
Loading…
Add table
Add a link
Reference in a new issue