139 lines
4.0 KiB
Python
139 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 __future__ import annotations
|
|
|
|
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)
|