104 lines
2.9 KiB
Python
104 lines
2.9 KiB
Python
# 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 os
|
|
from unittest.mock import MagicMock
|
|
|
|
import mach_initialize
|
|
import pytest
|
|
import yaml
|
|
from moztest.resolve import TestResolver
|
|
from responses import RequestsMock
|
|
from taskgraph.graph import Graph
|
|
from taskgraph.task import Task
|
|
from taskgraph.taskgraph import TaskGraph
|
|
from tryselect import push, tasks
|
|
|
|
|
|
@pytest.fixture
|
|
def responses():
|
|
with RequestsMock() as rsps:
|
|
yield rsps
|
|
|
|
|
|
@pytest.fixture
|
|
def tg(request):
|
|
if not hasattr(request.module, "TASKS"):
|
|
pytest.fail(
|
|
"'tg' fixture used from a module that didn't define the TASKS variable"
|
|
)
|
|
|
|
tasks = request.module.TASKS
|
|
for task in tasks:
|
|
task.setdefault("task", {})
|
|
task["task"].setdefault("tags", {})
|
|
|
|
tasks = {t["label"]: Task(**t) for t in tasks}
|
|
return TaskGraph(tasks, Graph(tasks.keys(), set()))
|
|
|
|
|
|
@pytest.fixture
|
|
def patch_resolver(monkeypatch):
|
|
def inner(suites, tests):
|
|
def fake_test_metadata(*args, **kwargs):
|
|
return suites, tests
|
|
|
|
monkeypatch.setattr(TestResolver, "resolve_metadata", fake_test_metadata)
|
|
|
|
return inner
|
|
|
|
|
|
@pytest.fixture(autouse=True)
|
|
def patch_vcs(monkeypatch):
|
|
attrs = {
|
|
"path": push.vcs.path,
|
|
}
|
|
mock = MagicMock()
|
|
mock.configure_mock(**attrs)
|
|
monkeypatch.setattr(push, "vcs", mock)
|
|
|
|
|
|
@pytest.fixture(scope="session")
|
|
def run_mach():
|
|
mach = mach_initialize.initialize(tasks.build.topsrcdir)
|
|
|
|
def inner(args):
|
|
return mach.run(args)
|
|
|
|
return inner
|
|
|
|
|
|
def pytest_generate_tests(metafunc):
|
|
if all(
|
|
fixture in metafunc.fixturenames
|
|
for fixture in ("task_config", "args", "expected")
|
|
):
|
|
|
|
def load_tests():
|
|
for task_config, tests in metafunc.module.TASK_CONFIG_TESTS.items():
|
|
for args, expected in tests:
|
|
yield (task_config, args, expected)
|
|
|
|
tests = list(load_tests())
|
|
ids = ["{} {}".format(t[0], " ".join(t[1])).strip() for t in tests]
|
|
metafunc.parametrize("task_config,args,expected", tests, ids=ids)
|
|
|
|
elif all(
|
|
fixture in metafunc.fixturenames for fixture in ("shared_name", "shared_preset")
|
|
):
|
|
preset_path = os.path.join(
|
|
push.build.topsrcdir, "tools", "tryselect", "try_presets.yml"
|
|
)
|
|
with open(preset_path) as fh:
|
|
presets = list(yaml.safe_load(fh).items())
|
|
|
|
ids = [p[0] for p in presets]
|
|
|
|
# Mark fuzzy presets on Windows xfail due to fzf not being installed.
|
|
if os.name == "nt":
|
|
for i, preset in enumerate(presets):
|
|
if preset[1]["selector"] == "fuzzy":
|
|
presets[i] = pytest.param(*preset, marks=pytest.mark.xfail)
|
|
|
|
metafunc.parametrize("shared_name,shared_preset", presets, ids=ids)
|