diff options
Diffstat (limited to 'python/mach/mach/test/conftest.py')
-rw-r--r-- | python/mach/mach/test/conftest.py | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/python/mach/mach/test/conftest.py b/python/mach/mach/test/conftest.py new file mode 100644 index 0000000000..d8a109c678 --- /dev/null +++ b/python/mach/mach/test/conftest.py @@ -0,0 +1,85 @@ +# 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 sys +import unittest +from collections.abc import Iterable +from pathlib import Path +from typing import List, Optional, Union + +import pytest +from buildconfig import topsrcdir + +try: + from StringIO import StringIO +except ImportError: + # TODO io.StringIO causes failures with Python 2 (needs to be sorted out) + from io import StringIO + +from mach.command_util import load_commands_from_entry_point, load_commands_from_file +from mach.main import Mach + +PROVIDER_DIR = Path(__file__).resolve().parent / "providers" + + +@pytest.fixture(scope="class") +def get_mach(request): + def _populate_context(key): + if key == "topdir": + return topsrcdir + + def inner( + provider_files: Optional[Union[Path, List[Path]]] = None, + entry_point=None, + context_handler=None, + ): + m = Mach(str(Path.cwd())) + m.define_category("testing", "Mach unittest", "Testing for mach core", 10) + m.define_category("misc", "Mach misc", "Testing for mach core", 20) + m.populate_context_handler = context_handler or _populate_context + + if provider_files: + if not isinstance(provider_files, Iterable): + provider_files = [provider_files] + + for path in provider_files: + load_commands_from_file(PROVIDER_DIR / path) + + if entry_point: + load_commands_from_entry_point(entry_point) + + return m + + if request.cls and issubclass(request.cls, unittest.TestCase): + request.cls.get_mach = lambda cls, *args, **kwargs: inner(*args, **kwargs) + return inner + + +@pytest.fixture(scope="class") +def run_mach(request, get_mach): + def inner(argv, *args, **kwargs): + m = get_mach(*args, **kwargs) + + stdout = StringIO() + stderr = StringIO() + + if sys.version_info < (3, 0): + stdout.encoding = "UTF-8" + stderr.encoding = "UTF-8" + + try: + result = m.run(argv, stdout=stdout, stderr=stderr) + except SystemExit: + result = None + + return (result, stdout.getvalue(), stderr.getvalue()) + + if request.cls and issubclass(request.cls, unittest.TestCase): + request.cls._run_mach = lambda cls, *args, **kwargs: inner(*args, **kwargs) + return inner + + +@pytest.mark.usefixtures("get_mach", "run_mach") +class TestBase(unittest.TestCase): + pass |