在基于 manifestparser 的清单中添加上下文

使用 manifestparser 的测试套件(如 Mochitest 和 XPCShell)具有测试清单,这些清单根据一组上下文来指示是否应该跳过给定的测试。

Gecko 构建会生成一个包含有关构建元数据的 target.mozinfo.json。一个示例 target.mozinfo.json 可能如下所示 this。然后,这些键可以在测试清单中用于 skip-if

skip-if = e10s && os == 'win'

在这种情况下,e10s 是一个布尔值。

测试将下载构建的 target.mozinfo.json,然后根据任务或运行时环境使用其他运行时信息更新 mozinfo 字典。此逻辑位于 mozinfo 中。

如何添加关键字

添加新键的位置取决于它是什么类型的信息。

  1. 如果键是构建的属性,则需要修补 此文件

  2. 如果键是测试环境的属性,则需要修补 mozinfo

  3. 如果键是运行时配置,例如基于通过 mach 或任务配置传递的首选项,则需要更新各个测试 harness。例如,对于 Mochitest,此位置。目前没有共享位置可以在测试 harness 中设置运行时键。

在 Reftest 样式清单中添加上下文

Reftests 和 Crashtests 使用不同类型的清单,但总体思路相同。

与之前一样,Gecko 构建会生成一个包含有关构建元数据的 target.mozinfo.json。一个示例 target.mozinfo.json 可能如下所示 this。它在 Reftest harness 中被使用并转换为可用于以下用途的关键字

fuzzyIf(cocoaWidget&&isDebugBuild,1-1,85-88)

在这种情况下,cocoaWidgetisDebugbuild 是布尔值。

测试将下载构建的 target.mozinfo.json,然后除了 mozinfo 之外,还会查询来自浏览器的运行时信息以构建关键字沙箱。此逻辑位于 manifest.sys.mjs 中。

如何添加关键字

添加新键的位置取决于它是什么类型的信息。

  1. 如果键是构建的属性,则需要修补 此文件

  2. 如果键是测试环境的属性或运行时配置,则需要更新清单沙箱。

例如,对于 Apple Silicon,我们可以使用类似这样的补丁添加一个 apple_silicon 关键字

--- a/layout/tools/reftest/manifest.sys.mjs
+++ b/layout/tools/reftest/manifest.sys.mjs
@@ -572,16 +572,18 @@ function BuildConditionSandbox(aURL) {

    // Set OSX to be the Mac OS X version, as an integer, or undefined
    // for other platforms.  The integer is formed by 100 times the
    // major version plus the minor version, so 1006 for 10.6, 1010 for
    // 10.10, etc.
    var osxmatch = /Mac OS X (\d+).(\d+)$/.exec(hh.oscpu);
    sandbox.OSX = osxmatch ? parseInt(osxmatch[1]) * 100 + parseInt(osxmatch[2]) : undefined;

+   sandbox.apple_silicon = sandbox.cocoaWidget && sandbox.OSX>=11;
+
    // Plugins are no longer supported.  Don't try to use TestPlugin.
    sandbox.haveTestPlugin = false;

    // Set a flag on sandbox if the windows default theme is active
    sandbox.windowsDefaultTheme = g.containingWindow.matchMedia("(-moz-windows-default-theme)").matches;

    try {
        sandbox.nativeThemePref = !prefs.getBoolPref("widget.disable-native-theme-for-content");

然后使用它

fuzzy-if(apple_silicon,1-1,281-281) == frame_above_rules_none.html frame_above_rules_none_ref.html