diff --git a/taskcluster/ci/source-test/python.yml b/taskcluster/ci/source-test/python.yml index 36f3e987f8c3..8f349e57993a 100644 --- a/taskcluster/ci/source-test/python.yml +++ b/taskcluster/ci/source-test/python.yml @@ -36,6 +36,7 @@ job-defaults: firefox-ci: description: taskcluster/gecko_taskgraph unit tests + always-target: false python-version: [3] treeherder: symbol: ci diff --git a/taskcluster/test/python.ini b/taskcluster/test/python.ini index 0e343ccca3a4..c33cf6ac3a5e 100644 --- a/taskcluster/test/python.ini +++ b/taskcluster/test/python.ini @@ -4,5 +4,6 @@ skip-if = python == 2 [test_autoland.py] [test_autoland_backstop.py] +[test_generate_params.py] [test_mach_try_auto.py] [test_mozilla_central.py] diff --git a/taskcluster/test/test_generate_params.py b/taskcluster/test/test_generate_params.py new file mode 100644 index 000000000000..8a4b235f48f4 --- /dev/null +++ b/taskcluster/test/test_generate_params.py @@ -0,0 +1,58 @@ +import json +import os +import subprocess + +import pytest +from mozunit import main + +from gecko_taskgraph import GECKO +from gecko_taskgraph.taskgraph import TaskGraph + +pytestmark = pytest.mark.slow +PARAMS_DIR = os.path.join(GECKO, "taskcluster", "test", "params") + + +@pytest.fixture(scope="module") +def get_graph_from_spec(tmpdir_factory): + outdir = tmpdir_factory.mktemp("graphs") + + # Use a mach subprocess to leverage the auto parallelization of + # parameters when specifying a directory. + cmd = [ + "./mach", + "taskgraph", + "morphed", + "--json", + f"--parameters={PARAMS_DIR}", + f"--output-file={outdir}/graph.json", + ] + subprocess.run(cmd, cwd=GECKO) + assert len(outdir.listdir()) > 0 + + def inner(param_spec): + outfile = f"{outdir}/graph_{param_spec}.json" + with open(outfile) as fh: + output = fh.read() + try: + return TaskGraph.from_json(json.loads(output))[1] + except ValueError: + return output + + return inner + + +@pytest.mark.parametrize( + "param_spec", [os.path.splitext(p)[0] for p in os.listdir(PARAMS_DIR)] +) +def test_generate_graphs(get_graph_from_spec, param_spec): + ret = get_graph_from_spec(param_spec) + if isinstance(ret, str): + print(ret) + pytest.fail("An exception was raised during graph generation!") + + assert isinstance(ret, TaskGraph) + assert len(ret.tasks) > 0 + + +if __name__ == "__main__": + main()