Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

# 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/.
import json
import os
import mozunit
import pytest
from mozfile import load_source
from tryselect.tasks import build, resolve_tests_by_suite
MOZHARNESS_SCRIPTS = {
"android_emulator_unittest": {
"class_name": "AndroidEmulatorTest",
"configs": [
"android/android_common.py",
],
"xfail": [
"cppunittest",
"crashtest-qr",
"gtest",
"geckoview-junit",
"jittest",
"jsreftest",
"reftest-qr",
],
},
"desktop_unittest": {
"class_name": "DesktopUnittest",
"configs": [
"unittests/linux_unittest.py",
"unittests/mac_unittest.py",
"unittests/win_unittest.py",
],
"xfail": [
"cppunittest",
"gtest",
"jittest",
"jittest-chunked",
"jittest1",
"jittest2",
"jsreftest",
"mochitest-valgrind-plain",
"reftest-no-accel",
"reftest-snapshot",
"xpcshell-msix",
],
},
}
"""A suite being listed in a script's `xfail` list means it won't work
properly with MOZHARNESS_TEST_PATHS (the mechanism |mach try fuzzy <path>|
uses).
"""
def get_mozharness_test_paths(name):
scriptdir = os.path.join(build.topsrcdir, "testing", "mozharness")
mod = load_source(
"scripts." + name, os.path.join(scriptdir, "scripts", name + ".py")
)
class_name = MOZHARNESS_SCRIPTS[name]["class_name"]
cls = getattr(mod, class_name)
return cls(require_config_file=False)._get_mozharness_test_paths
@pytest.fixture(scope="module")
def all_suites():
from moztest.resolve import _test_flavors, _test_subsuites
all_suites = []
for flavor in _test_flavors:
all_suites.append({"flavor": flavor, "srcdir_relpath": "test"})
for flavor, subsuite in _test_subsuites:
all_suites.append(
{"flavor": flavor, "subsuite": subsuite, "srcdir_relpath": "test"}
)
return all_suites
def generate_suites_from_config(path):
parent, name = os.path.split(path)
name = os.path.splitext(name)[0]
configdir = os.path.join(
build.topsrcdir, "testing", "mozharness", "configs", parent
)
mod = load_source(name, os.path.join(configdir, name + ".py"))
config = mod.config
for category in sorted(config["suite_definitions"]):
key = "all_{}_suites".format(category)
if key not in config:
yield category,
continue
for suite in sorted(config["all_{}_suites".format(category)]):
yield category, suite
def generate_suites():
for name, script in MOZHARNESS_SCRIPTS.items():
seen = set()
for path in script["configs"]:
for suite in generate_suites_from_config(path):
if suite in seen:
continue
seen.add(suite)
item = (name, suite)
if suite[-1] in script["xfail"]:
item = pytest.param(item, marks=pytest.mark.xfail)
yield item
def idfn(item):
name, suite = item
return "{}/{}".format(name, suite[-1])
@pytest.mark.parametrize("item", generate_suites(), ids=idfn)
def test_suites(item, patch_resolver, all_suites):
"""An integration test to make sure the suites returned by
`tasks.resolve_tests_by_suite` match up with the names defined in
mozharness.
"""
patch_resolver([], all_suites)
suites = resolve_tests_by_suite(["test"])
os.environ["MOZHARNESS_TEST_PATHS"] = json.dumps(suites)
name, suite = item
func = get_mozharness_test_paths(name)
assert func(*suite)
if __name__ == "__main__":
mozunit.main()