Bug 1293295 - Replace all mochitest 'flavor' options with a single --flavor argument, r=jmaher

This accomplishes three things:

1) Easier to use CLI when running without the benefit of testing/mochitest/mach_commands.py
2) Guarantees these arguments are mutually exclusive
3) Simplifies a bunch of logic in the test harness

The primary motivation for this change is to slightly improve the UX when running mochitest
from a taskcluster interactive loaner. However, this is more of a bandaid solution that was
easy to implement before the proper fix in bug 1293259 can be landed.

MozReview-Commit-ID: IeHBGrJ0Sji

--HG--
extra : rebase_source : ba1b7e437881e363fe0051dccd3d732221311c59
This commit is contained in:
Andrew Halberstadt 2016-08-08 11:48:49 -04:00
Родитель b22f612021
Коммит 795728d89d
16 изменённых файлов: 129 добавлений и 165 удалений

Просмотреть файл

@ -21,7 +21,7 @@ ifdef ENABLE_TESTS
# Implemented in testing/testsuite-targets.mk
mochitest-browser-chrome:
$(RUN_MOCHITEST) --browser-chrome
$(RUN_MOCHITEST) --flavor=browser
$(CHECK_TEST_ERROR)
mochitest:: mochitest-browser-chrome

Просмотреть файл

@ -45,7 +45,7 @@ ifdef ENABLE_TESTS
# Implemented in testing/testsuite-targets.mk
mochitest-browser-chrome:
$(RUN_MOCHITEST) --browser-chrome
$(RUN_MOCHITEST) --flavor=browser
$(CHECK_TEST_ERROR)
mochitest:: mochitest-browser-chrome

Просмотреть файл

@ -53,7 +53,7 @@ ifdef ENABLE_TESTS
# Implemented in testing/testsuite-targets.mk
mochitest-browser-chrome:
$(RUN_MOCHITEST) --browser-chrome
$(RUN_MOCHITEST) --flavor=browser
$(CHECK_TEST_ERROR)
mochitest:: mochitest-browser-chrome

Просмотреть файл

@ -90,7 +90,7 @@ ALL_FLAVORS = {
'aliases': ('chrome', 'mochitest-chrome'),
'enabled_apps': ('firefox', 'mulet', 'b2g', 'android'),
'extra_args': {
'chrome': True,
'flavor': 'chrome',
}
},
'browser-chrome': {
@ -98,7 +98,7 @@ ALL_FLAVORS = {
'aliases': ('browser', 'browser-chrome', 'mochitest-browser-chrome', 'bc'),
'enabled_apps': ('firefox',),
'extra_args': {
'browserChrome': True,
'flavor': 'browser',
}
},
'jetpack-package': {
@ -106,7 +106,7 @@ ALL_FLAVORS = {
'aliases': ('jetpack-package', 'mochitest-jetpack-package', 'jpp'),
'enabled_apps': ('firefox',),
'extra_args': {
'jetpackPackage': True,
'flavor': 'jetpack-package',
}
},
'jetpack-addon': {
@ -114,7 +114,7 @@ ALL_FLAVORS = {
'aliases': ('jetpack-addon', 'mochitest-jetpack-addon', 'jpa'),
'enabled_apps': ('firefox',),
'extra_args': {
'jetpackAddon': True,
'flavor': 'jetpack-addon',
}
},
'a11y': {
@ -122,7 +122,7 @@ ALL_FLAVORS = {
'aliases': ('a11y', 'mochitest-a11y', 'accessibility'),
'enabled_apps': ('firefox',),
'extra_args': {
'a11y': True,
'flavor': 'a11y',
}
},
}

Просмотреть файл

@ -86,8 +86,8 @@ class ArgumentContainer():
class MochitestArguments(ArgumentContainer):
"""General mochitest arguments."""
FLAVORS = ('a11y', 'browser', 'chrome', 'jetpack-addon', 'jetpack-package', 'plain')
LOG_LEVELS = ("DEBUG", "INFO", "WARNING", "ERROR", "FATAL")
LEVEL_STRING = ", ".join(LOG_LEVELS)
args = [
[["test_paths"],
@ -97,6 +97,12 @@ class MochitestArguments(ArgumentContainer):
"help": "Test to run. Can be a single test file or a directory of tests "
"(to run recursively). If omitted, the entire suite is run.",
}],
[["-f", "--flavor"],
{"default": "plain",
"choices": FLAVORS,
"help": "Mochitest flavor to run, one of {}. Defaults to 'plain'.".format(FLAVORS),
"suppress": build_obj is not None,
}],
[["--keep-open"],
{"nargs": "?",
"type": strtobool,
@ -182,13 +188,8 @@ class MochitestArguments(ArgumentContainer):
{"dest": "consoleLevel",
"choices": LOG_LEVELS,
"default": "INFO",
"help": "One of %s to determine the level of console logging." % LEVEL_STRING,
"suppress": True,
}],
[["--chrome"],
{"action": "store_true",
"default": False,
"help": "Run chrome mochitests.",
"help": "One of {} to determine the level of console logging.".format(
', '.join(LOG_LEVELS)),
"suppress": True,
}],
[["--bisect-chunk"],
@ -207,38 +208,11 @@ class MochitestArguments(ArgumentContainer):
"default": "",
"help": "Stop running the test sequence at this test.",
}],
[["--browser-chrome"],
{"action": "store_true",
"dest": "browserChrome",
"default": False,
"help": "run browser chrome Mochitests",
"suppress": True,
}],
[["--subsuite"],
{"default": None,
"help": "Subsuite of tests to run. Unlike tags, subsuites also remove tests from "
"the default set. Only one can be specified at once.",
}],
[["--jetpack-package"],
{"action": "store_true",
"dest": "jetpackPackage",
"help": "Run jetpack package tests.",
"default": False,
"suppress": True,
}],
[["--jetpack-addon"],
{"action": "store_true",
"dest": "jetpackAddon",
"help": "Run jetpack addon tests.",
"default": False,
"suppress": True,
}],
[["--a11y"],
{"action": "store_true",
"help": "Run accessibility Mochitests.",
"default": False,
"suppress": True,
}],
[["--setenv"],
{"action": "append",
"dest": "environment",

Просмотреть файл

@ -5,8 +5,8 @@
<script type="text/javascript">
function redirect(aURL)
{
// We create a listener for this event in browser-test.js
// which will get picked up when specifying --chrome or --a11y
// We create a listener for this event in browser-test.js which will
// get picked up when specifying --flavor=chrome or --flavor=a11y
var event = new CustomEvent("contentEvent", {
bubbles: true,
detail: {

Просмотреть файл

@ -619,8 +619,7 @@ class MochitestBase(object):
if options.logFile:
options.logFile = self.getLogFilePath(options.logFile)
if options.browserChrome or options.chrome or \
options.a11y or options.jetpackPackage or options.jetpackAddon:
if options.flavor in ('a11y', 'browser', 'chrome', 'jetpack-addon', 'jetpack-package'):
self.makeTestConfig(options)
else:
if options.autorun:
@ -689,32 +688,31 @@ class MochitestBase(object):
if options.debugger:
self.urlOpts.append("interactiveDebugger=true")
def getTestFlavor(self, options):
if options.browserChrome:
return "browser-chrome"
elif options.jetpackPackage:
return "jetpack-package"
elif options.jetpackAddon:
return "jetpack-addon"
elif options.chrome:
return "chrome"
elif options.a11y:
return "a11y"
else:
return "mochitest"
def normflavor(self, flavor):
"""
In some places the string 'browser-chrome' is expected instead of
'browser' and 'mochitest' instead of 'plain'. Normalize the flavor
strings for those instances.
"""
# TODO Use consistent flavor strings everywhere and remove this
if flavor == 'browser':
return 'browser-chrome'
elif flavor == 'plain':
return 'mochitest'
return flavor
# This check can be removed when bug 983867 is fixed.
def isTest(self, options, filename):
allow_js_css = False
if options.browserChrome:
if options.flavor == 'browser':
allow_js_css = True
testPattern = re.compile(r"browser_.+\.js")
elif options.jetpackPackage:
elif options.flavor == 'jetpack-package':
allow_js_css = True
testPattern = re.compile(r"test-.+\.js")
elif options.jetpackAddon:
elif options.flavor == 'jetpack-addon':
testPattern = re.compile(r".+\.xpi")
elif options.chrome or options.a11y:
elif options.flavor in ('a11y', 'chrome'):
testPattern = re.compile(r"(browser|test)_.+\.(xul|html|js|xhtml)")
else:
testPattern = re.compile(r"test_")
@ -728,19 +726,11 @@ class MochitestBase(object):
not re.search(r'\^headers\^$', filename))
def setTestRoot(self, options):
if options.browserChrome:
if options.immersiveMode:
if options.flavor != 'plain':
self.testRoot = options.flavor
if options.flavor == 'browser' and options.immersiveMode:
self.testRoot = 'metro'
else:
self.testRoot = 'browser'
elif options.jetpackPackage:
self.testRoot = 'jetpack-package'
elif options.jetpackAddon:
self.testRoot = 'jetpack-addon'
elif options.a11y:
self.testRoot = 'a11y'
elif options.chrome:
self.testRoot = 'chrome'
else:
self.testRoot = self.TEST_PATH
self.testRootAbs = os.path.join(SCRIPT_DIR, self.testRoot)
@ -760,9 +750,9 @@ class MochitestBase(object):
else:
testURL = "/".join([testURL, options.test_paths[0]])
if options.chrome or options.a11y:
if options.flavor in ('a11y', 'chrome'):
testURL = "/".join([testHost, self.CHROME_PATH])
elif options.browserChrome or options.jetpackPackage or options.jetpackAddon:
elif options.flavor in ('browser', 'jetpack-addon', 'jetpack-package'):
testURL = "about:blank"
if options.nested_oop:
testURL = "/".join([testHost, self.NESTED_OOP_TEST_PATH])
@ -1066,8 +1056,7 @@ toolbar#nav-bar {
self.log.warning("runtime file %s not found; defaulting to chunk-by-dir" %
runtime_file)
options.chunkByRuntime = None
flavor = self.getTestFlavor(options)
if flavor in ('browser-chrome', 'devtools-chrome'):
if options.flavor == 'browser':
# these values match current mozharness configs
options.chunkbyDir = 5
else:
@ -1154,7 +1143,7 @@ toolbar#nav-bar {
assert manifestFileAbs.startswith(SCRIPT_DIR)
manifest = TestManifest([manifestFileAbs], strict=False)
else:
masterName = self.getTestFlavor(options) + '.ini'
masterName = self.normflavor(options.flavor) + '.ini'
masterPath = os.path.join(SCRIPT_DIR, self.testRoot, masterName)
if os.path.exists(masterPath):
@ -1210,7 +1199,7 @@ toolbar#nav-bar {
# inheriting all other inheritable handles as well.
# We need to inherit them for plain mochitests for test logging purposes, so
# we do so on the basis of a specific environment variable.
if self.getTestFlavor(options) == "mochitest":
if options.flavor == 'plain':
browserEnv["MOZ_WIN_INHERIT_STD_HANDLES_PRE_VISTA"] = "1"
# interpolate environment passed with options
@ -1634,7 +1623,7 @@ class MochitestDesktop(MochitestBase):
def buildProfile(self, options):
""" create the profile and add optional chrome bits and files if requested """
if options.browserChrome and options.timeout:
if options.flavor == 'browser' and options.timeout:
options.extraPrefs.append(
"testing.browserTestHarness.timeout=%d" %
options.timeout)
@ -2111,21 +2100,28 @@ class MochitestDesktop(MochitestBase):
self.urlOpts = []
def resolve_runtime_file(self, options):
"""
Return a path to the runtimes file for a given flavor and
subsuite.
"""
template = "mochitest{e10s}-{suite_slug}.runtimes.json"
data_dir = os.path.join(SCRIPT_DIR, 'runtimes')
flavor = self.getTestFlavor(options)
if flavor == 'browser-chrome' and options.subsuite == 'devtools':
flavor = 'devtools-chrome'
elif flavor == 'mochitest':
flavor = 'plain'
# Determine the suite slug in the runtimes file name
slug = self.normflavor(options.flavor)
if slug == 'browser-chrome' and options.subsuite == 'devtools':
slug = 'devtools-chrome'
elif slug == 'mochitest':
slug = 'plain'
if options.subsuite:
flavor = options.subsuite
slug = options.subsuite
base = 'mochitest'
e10s = ''
if options.e10s:
base = '{}-e10s'.format(base)
return os.path.join(data_dir, '{}-{}.runtimes.json'.format(
base, flavor))
e10s = '-e10s'
return os.path.join(data_dir, template.format(
e10s=e10s, suite_slug=slug))
def normalize_paths(self, paths):
# Normalize test paths so they are relative to test root
@ -2195,7 +2191,7 @@ class MochitestDesktop(MochitestBase):
# a11y and chrome tests don't run with e10s enabled in CI. Need to set
# this here since |mach mochitest| sets the flavor after argument parsing.
if options.a11y or options.chrome:
if options.flavor in ('a11y', 'chrome'):
options.e10s = False
mozinfo.update({"e10s": options.e10s}) # for test manifest parsing.
@ -2241,7 +2237,7 @@ class MochitestDesktop(MochitestBase):
e10s_mode = "e10s" if options.e10s else "non-e10s"
# printing total number of tests
if options.browserChrome:
if options.flavor == 'browser':
print "TEST-INFO | checking window state"
print "Browser Chrome Test Summary"
print "\tPassed: %s" % self.countpass
@ -2386,9 +2382,9 @@ class MochitestDesktop(MochitestBase):
# detect shutdown leaks for m-bc runs
detectShutdownLeaks = mozinfo.info[
"debug"] and options.browserChrome
"debug"] and options.flavor == 'browser'
self.start_script_args.append(self.getTestFlavor(options))
self.start_script_args.append(self.normflavor(options.flavor))
marionette_args = {
'symbols_path': options.symbolsPath,
'socket_timeout': options.marionette_socket_timeout,
@ -2677,13 +2673,7 @@ def run_test_harness(parser, options):
options.runByDir = False
if runner.getTestFlavor(options) == 'mochitest':
options.runByDir = True
if runner.getTestFlavor(options) == 'browser-chrome':
options.runByDir = True
if runner.getTestFlavor(options) == 'chrome':
if options.flavor in ('plain', 'browser', 'chrome'):
options.runByDir = True
if mozinfo.info.get('buildapp') == 'mulet':

Просмотреть файл

@ -157,7 +157,7 @@ class MochitestB2G(MochitestBase):
self.remote_log)):
self.app_ctx.dm.mkDirs(self.remote_log)
if options.chrome:
if options.flavor == 'chrome':
# Update chrome manifest file in profile with correct path.
self.writeChromeManifest(options)
@ -200,7 +200,7 @@ class MochitestB2G(MochitestBase):
self.start_script_args.append(not options.emulator)
self.start_script_args.append(options.wifi)
self.start_script_args.append(options.chrome)
self.start_script_args.append(options.flavor == 'chrome')
self.runner.start(outputTimeout=timeout)
@ -232,7 +232,7 @@ class MochitestB2G(MochitestBase):
}
""")
if options.chrome:
if options.flavor == 'chrome':
self.app_ctx.dm.removeDir(self.remote_chrome_test_dir)
self.app_ctx.dm.mkDir(self.remote_chrome_test_dir)
local = MochitestBase.getChromeTestDir(self, options)

Просмотреть файл

@ -192,7 +192,7 @@ class MochiRemote(MochitestDesktop):
# Support Firefox (browser), B2G (shell), SeaMonkey (navigator), and Webapp
# Runtime (webapp).
if options.chrome:
if options.flavor == 'chrome':
# append overlay to chrome.manifest
chrome = "overlay chrome://browser/content/browser.xul chrome://mochikit/content/browser-test-overlay.xul"
path = os.path.join(options.profilePath, 'extensions', 'staged',
@ -226,7 +226,7 @@ class MochiRemote(MochitestDesktop):
local = super(MochiRemote, self).getChromeTestDir(options)
local = os.path.join(local, "chrome")
remote = self.remoteChromeTestDir
if options.chrome:
if options.flavor == 'chrome':
self.log.info("pushing %s to %s on device..." % (local, remote))
self._dm.pushDir(local, remote)
return remote
@ -306,7 +306,7 @@ def run_test_harness(parser, options):
options.runByDir = False
# roboextender is used by mochitest-chrome tests like test_java_addons.html,
# but not by any plain mochitests
if not options.chrome:
if options.flavor != 'chrome':
options.extensionsToExclude.append('roboextender@mozilla.org')
dm = options.dm

Просмотреть файл

@ -325,7 +325,7 @@ config = {
},
"mochitest-chrome": {
"category": "mochitest",
"extra_args": ["--chrome"],
"extra_args": ["--flavor=chrome"],
},
"mochitest-media-1": {
"category": "mochitest-media",

Просмотреть файл

@ -123,7 +123,7 @@ config = {
"--extra-profile-file=fonts",
"--extra-profile-file=hyphenation",
"--screenshot-on-fail",
"--chrome",
"--flavor=chrome",
],
},
"mochitest-plain-gpu": {

Просмотреть файл

@ -140,7 +140,7 @@ config = {
"--total-chunks=%(total_chunks)s",
"--this-chunk=%(this_chunk)s",
"--quiet",
"--chrome",
"--flavor=chrome",
"--log-raw=%(raw_log_file)s",
"--log-errorsummary=%(error_summary_file)s",
"--certificate-path=%(certificate_path)s",

Просмотреть файл

@ -128,7 +128,7 @@ config = {
"--total-chunks=%(total_chunks)s",
"--this-chunk=%(this_chunk)s",
"--quiet",
"--chrome",
"--flavor=chrome",
"--log-raw=%(raw_log_file)s",
"--log-errorsummary=%(error_summary_file)s",
"--certificate-path=%(certificate_path)s",
@ -192,4 +192,4 @@ config = {
}
},
"vcs_output_timeout": 1760,
}
}

Просмотреть файл

@ -201,24 +201,24 @@ config = {
"plain-clipboard": ["--subsuite=clipboard"],
"plain-chunked": ["--chunk-by-dir=4"],
"mochitest-media": ["--subsuite=media"],
"chrome": ["--chrome"],
"chrome-gpu": ["--chrome", "--subsuite=gpu"],
"chrome-clipboard": ["--chrome", "--subsuite=clipboard"],
"chrome-chunked": ["--chrome", "--chunk-by-dir=4"],
"browser-chrome": ["--browser-chrome"],
"browser-chrome-gpu": ["--browser-chrome", "--subsuite=gpu"],
"browser-chrome-clipboard": ["--browser-chrome", "--subsuite=clipboard"],
"browser-chrome-chunked": ["--browser-chrome", "--chunk-by-runtime"],
"browser-chrome-addons": ["--browser-chrome", "--chunk-by-runtime", "--tag=addons"],
"browser-chrome-coverage": ["--browser-chrome", "--chunk-by-runtime", "--timeout=1200"],
"browser-chrome-screenshots": ["--browser-chrome", "--subsuite=screenshots"],
"chrome": ["--flavor=chrome"],
"chrome-gpu": ["--flavor=chrome", "--subsuite=gpu"],
"chrome-clipboard": ["--flavor=chrome", "--subsuite=clipboard"],
"chrome-chunked": ["--flavor=chrome", "--chunk-by-dir=4"],
"browser-chrome": ["--flavor=browser"],
"browser-chrome-gpu": ["--flavor=browser", "--subsuite=gpu"],
"browser-chrome-clipboard": ["--flavor=browser", "--subsuite=clipboard"],
"browser-chrome-chunked": ["--flavor=browser", "--chunk-by-runtime"],
"browser-chrome-addons": ["--flavor=browser", "--chunk-by-runtime", "--tag=addons"],
"browser-chrome-coverage": ["--flavor=browser", "--chunk-by-runtime", "--timeout=1200"],
"browser-chrome-screenshots": ["--flavor=browser", "--subsuite=screenshots"],
"mochitest-gl": ["--subsuite=webgl"],
"mochitest-devtools-chrome": ["--browser-chrome", "--subsuite=devtools"],
"mochitest-devtools-chrome-chunked": ["--browser-chrome", "--subsuite=devtools", "--chunk-by-runtime"],
"jetpack-package": ["--jetpack-package"],
"jetpack-package-clipboard": ["--jetpack-package", "--subsuite=clipboard"],
"jetpack-addon": ["--jetpack-addon"],
"a11y": ["--a11y"],
"mochitest-devtools-chrome": ["--flavor=browser", "--subsuite=devtools"],
"mochitest-devtools-chrome-chunked": ["--flavor=browser", "--subsuite=devtools", "--chunk-by-runtime"],
"jetpack-package": ["--flavor=jetpack-package"],
"jetpack-package-clipboard": ["--flavor=jetpack-package", "--subsuite=clipboard"],
"jetpack-addon": ["--flavor=jetpack-addon"],
"a11y": ["--flavor=a11y"],
},
# local reftest suites
"all_reftest_suites": {

Просмотреть файл

@ -149,23 +149,23 @@ config = {
"plain-clipboard": ["--subsuite=clipboard"],
"plain-chunked": ["--chunk-by-dir=4"],
"mochitest-media": ["--subsuite=media"],
"chrome": ["--chrome"],
"chrome-gpu": ["--chrome", "--subsuite=gpu"],
"chrome-clipboard": ["--chrome", "--subsuite=clipboard"],
"chrome-chunked": ["--chrome", "--chunk-by-dir=4"],
"browser-chrome": ["--browser-chrome"],
"browser-chrome-gpu": ["--browser-chrome", "--subsuite=gpu"],
"browser-chrome-clipboard": ["--browser-chrome", "--subsuite=clipboard"],
"browser-chrome-chunked": ["--browser-chrome", "--chunk-by-runtime"],
"browser-chrome-addons": ["--browser-chrome", "--chunk-by-runtime", "--tag=addons"],
"browser-chrome-screenshots": ["--browser-chrome", "--subsuite=screenshots"],
"chrome": ["--flavor=chrome"],
"chrome-gpu": ["--flavor=chrome", "--subsuite=gpu"],
"chrome-clipboard": ["--flavor=chrome", "--subsuite=clipboard"],
"chrome-chunked": ["--flavor=chrome", "--chunk-by-dir=4"],
"browser-chrome": ["--flavor=browser"],
"browser-chrome-gpu": ["--flavor=browser", "--subsuite=gpu"],
"browser-chrome-clipboard": ["--flavor=browser", "--subsuite=clipboard"],
"browser-chrome-chunked": ["--flavor=browser", "--chunk-by-runtime"],
"browser-chrome-addons": ["--flavor=browser", "--chunk-by-runtime", "--tag=addons"],
"browser-chrome-screenshots": ["--flavor=browser", "--subsuite=screenshots"],
"mochitest-gl": ["--subsuite=webgl"],
"mochitest-devtools-chrome": ["--browser-chrome", "--subsuite=devtools"],
"mochitest-devtools-chrome-chunked": ["--browser-chrome", "--subsuite=devtools", "--chunk-by-runtime"],
"jetpack-package": ["--jetpack-package"],
"jetpack-package-clipboard": ["--jetpack-package", "--subsuite=clipboard"],
"jetpack-addon": ["--jetpack-addon"],
"a11y": ["--a11y"],
"mochitest-devtools-chrome": ["--flavor=browser", "--subsuite=devtools"],
"mochitest-devtools-chrome-chunked": ["--flavor=browser", "--subsuite=devtools", "--chunk-by-runtime"],
"jetpack-package": ["--flavor=jetpack-package"],
"jetpack-package-clipboard": ["--flavor=jetpack-package", "--subsuite=clipboard"],
"jetpack-addon": ["--flavor=jetpack-addon"],
"a11y": ["--flavor=a11y"],
},
# local reftest suites
"all_reftest_suites": {

Просмотреть файл

@ -163,24 +163,24 @@ config = {
"plain-clipboard": ["--subsuite=clipboard"],
"plain-chunked": ["--chunk-by-dir=4"],
"mochitest-media": ["--subsuite=media"],
"chrome": ["--chrome"],
"chrome-gpu": ["--chrome", "--subsuite=gpu"],
"chrome-clipboard": ["--chrome", "--subsuite=clipboard"],
"chrome-chunked": ["--chrome", "--chunk-by-dir=4"],
"browser-chrome": ["--browser-chrome"],
"browser-chrome-gpu": ["--browser-chrome", "--subsuite=gpu"],
"browser-chrome-clipboard": ["--browser-chrome", "--subsuite=clipboard"],
"browser-chrome-chunked": ["--browser-chrome", "--chunk-by-runtime"],
"browser-chrome-addons": ["--browser-chrome", "--chunk-by-runtime", "--tag=addons"],
"browser-chrome-screenshots": ["--browser-chrome", "--subsuite=screenshots"],
"chrome": ["--flavor=chrome"],
"chrome-gpu": ["--flavor=chrome", "--subsuite=gpu"],
"chrome-clipboard": ["--flavor=chrome", "--subsuite=clipboard"],
"chrome-chunked": ["--flavor=chrome", "--chunk-by-dir=4"],
"browser-chrome": ["--flavor=browser"],
"browser-chrome-gpu": ["--flavor=browser", "--subsuite=gpu"],
"browser-chrome-clipboard": ["--flavor=browser", "--subsuite=clipboard"],
"browser-chrome-chunked": ["--flavor=browser", "--chunk-by-runtime"],
"browser-chrome-addons": ["--flavor=browser", "--chunk-by-runtime", "--tag=addons"],
"browser-chrome-screenshots": ["--flavor=browser", "--subsuite=screenshots"],
"mochitest-gl": ["--subsuite=webgl"],
"mochitest-devtools-chrome": ["--browser-chrome", "--subsuite=devtools"],
"mochitest-devtools-chrome-chunked": ["--browser-chrome", "--subsuite=devtools", "--chunk-by-runtime"],
"mochitest-metro-chrome": ["--browser-chrome", "--metro-immersive"],
"jetpack-package": ["--jetpack-package"],
"jetpack-package-clipboard": ["--jetpack-package", "--subsuite=clipboard"],
"jetpack-addon": ["--jetpack-addon"],
"a11y": ["--a11y"],
"mochitest-devtools-chrome": ["--flavor=browser", "--subsuite=devtools"],
"mochitest-devtools-chrome-chunked": ["--flavor=browser", "--subsuite=devtools", "--chunk-by-runtime"],
"mochitest-metro-chrome": ["--flavor=browser", "--metro-immersive"],
"jetpack-package": ["--flavor=jetpack-package"],
"jetpack-package-clipboard": ["--flavor=jetpack-package", "--subsuite=clipboard"],
"jetpack-addon": ["--flavor=jetpack-addon"],
"a11y": ["--flavor=a11y"],
},
# local reftest suites
"all_reftest_suites": {