# 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 | 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()