Added new flags for mach manifest skip-fails: --new-failures --replace-tbd (full functionality still WIP) Improvements to skipfails.py Added more type hinting Added SkipfailsMode helper class for different modes Added Action class for deferred actions More performance optimizations (caching treeherder queries) Bug comments now include +/- 10 lines of the error log Improved add_skip_if in toml.py by returning status when not adding redundant conditions Updated design document SKIP-FAILS.txt Signed-off-by: Tom Marble <tmarble@info9.net> Differential Revision: https://phabricator.services.mozilla.com/D269302
137 lines
4.0 KiB
Python
137 lines
4.0 KiB
Python
# 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
|
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
"""
|
|
Utilities for working with Web Platform Test (WPT) paths.
|
|
"""
|
|
|
|
from typing import Dict, Optional # noqa EP035
|
|
|
|
OptJs = Optional[Dict[str, bool]] # noqa UP006
|
|
|
|
WP = "testing/web-platform/"
|
|
WPT0 = WP + "tests/infrastructure"
|
|
WPT_META0 = WP + "tests/infrastructure/metadata"
|
|
WPT_META0_CLASSIC = WP + "meta/infrastructure"
|
|
WPT1 = WP + "tests"
|
|
WPT_META1 = WPT1.replace("tests", "meta")
|
|
WPT2 = WP + "mozilla/tests"
|
|
WPT_META2 = WPT2.replace("tests", "meta")
|
|
WPT_MOZILLA = "/_mozilla"
|
|
|
|
|
|
def resolve_wpt_path(shortpath: str) -> str:
|
|
"""
|
|
Resolves a short WPT path to its full path in the Firefox tree.
|
|
|
|
Args:
|
|
shortpath: A short WPT path like "/css/foo.html" or "/_mozilla/bar.html"
|
|
|
|
Returns:
|
|
The full path like "testing/web-platform/tests/css/foo.html"
|
|
"""
|
|
if shortpath.startswith(WPT0):
|
|
return shortpath
|
|
elif shortpath.startswith(WPT1):
|
|
return shortpath
|
|
elif shortpath.startswith(WPT2):
|
|
return shortpath
|
|
elif shortpath.startswith(WPT_MOZILLA):
|
|
shortpath = shortpath[len(WPT_MOZILLA) :]
|
|
return WPT2 + shortpath
|
|
else:
|
|
return WPT1 + shortpath
|
|
|
|
|
|
def get_wpt_metadata_path(path: str) -> str:
|
|
"""
|
|
Gets the metadata path for a given WPT path.
|
|
|
|
Args:
|
|
path: A WPT path (can be short or full)
|
|
|
|
Returns:
|
|
The corresponding metadata path
|
|
"""
|
|
if path.startswith(WPT0):
|
|
return path.replace(WPT0, WPT_META0, 1)
|
|
elif path.startswith(WPT1):
|
|
return path.replace(WPT1, WPT_META1, 1)
|
|
elif path.startswith(WPT2):
|
|
return path.replace(WPT2, WPT_META2, 1)
|
|
elif path.startswith(WPT_MOZILLA):
|
|
shortpath = path[len(WPT_MOZILLA) :]
|
|
return WPT_META2 + shortpath
|
|
else:
|
|
return WPT_META1 + path
|
|
|
|
|
|
def get_wpt_path_and_metadata(shortpath: str) -> tuple[str, str]:
|
|
"""
|
|
Gets both the resolved WPT path and its metadata path.
|
|
|
|
Args:
|
|
shortpath: A short or full WPT path
|
|
|
|
Returns:
|
|
A tuple of (path, metadata_path)
|
|
"""
|
|
path = resolve_wpt_path(shortpath)
|
|
meta = get_wpt_metadata_path(shortpath)
|
|
return (path, meta)
|
|
|
|
|
|
def parse_wpt_path(
|
|
shortpath: str, isdir_fn: Optional[callable] = None
|
|
) -> tuple[Optional[str], Optional[str], Optional[str], Optional[str]]:
|
|
"""
|
|
Analyzes the WPT short path for a test and returns detailed information.
|
|
|
|
Args:
|
|
shortpath: A WPT path that may include query parameters
|
|
isdir_fn: Optional function to check if a path is a directory
|
|
|
|
Returns:
|
|
A tuple of (path, manifest, query, anyjs) where:
|
|
- path is the relative path to the test file
|
|
- manifest is the relative path to the file metadata
|
|
- query is the test file query parameters (or None)
|
|
- anyjs is the html test file as reported by mozci (or None)
|
|
"""
|
|
query: Optional[str] = None
|
|
anyjs: OptJs = None
|
|
|
|
i = shortpath.find("?")
|
|
if i > 0:
|
|
query = shortpath[i:]
|
|
shortpath = shortpath[0:i]
|
|
|
|
path, manifest = get_wpt_path_and_metadata(shortpath)
|
|
|
|
failure_type = True
|
|
if isdir_fn:
|
|
failure_type = not isdir_fn(path)
|
|
|
|
if failure_type:
|
|
i = path.find(".any.")
|
|
if i > 0:
|
|
anyjs = {path: False}
|
|
manifest = manifest.replace(path[i:], ".any.js")
|
|
path = path[0:i] + ".any.js"
|
|
else:
|
|
i = path.find(".window.")
|
|
if i > 0:
|
|
anyjs = {path: False}
|
|
manifest = manifest.replace(path[i:], ".window.js")
|
|
path = path[0:i] + ".window.js"
|
|
else:
|
|
i = path.find(".worker.")
|
|
if i > 0:
|
|
anyjs = {path: False}
|
|
manifest = manifest.replace(path[i:], ".worker.js")
|
|
path = path[0:i] + ".worker.js"
|
|
manifest += ".ini"
|
|
|
|
return (path, manifest, query, anyjs)
|