xref: /freebsd/tests/conftest.py (revision 513ce835b55831d343185e03a51efa2901405ac8)
18eb2bee6SAlexander V. Chernikovimport pytest
28eb2bee6SAlexander V. Chernikovfrom atf_python.atf_pytest import ATFHandler
3*513ce835SAlexander V. Chernikovfrom typing import Dict
48eb2bee6SAlexander V. Chernikov
58eb2bee6SAlexander V. Chernikov
68eb2bee6SAlexander V. ChernikovPLUGIN_ENABLED = False
78eb2bee6SAlexander V. ChernikovDEFAULT_HANDLER = None
88eb2bee6SAlexander V. Chernikov
98eb2bee6SAlexander V. Chernikov
108eb2bee6SAlexander V. Chernikovdef get_handler():
118eb2bee6SAlexander V. Chernikov    global DEFAULT_HANDLER
128eb2bee6SAlexander V. Chernikov    if DEFAULT_HANDLER is None:
138eb2bee6SAlexander V. Chernikov        DEFAULT_HANDLER = ATFHandler()
148eb2bee6SAlexander V. Chernikov    return DEFAULT_HANDLER
158eb2bee6SAlexander V. Chernikov
168eb2bee6SAlexander V. Chernikov
178eb2bee6SAlexander V. Chernikovdef pytest_addoption(parser):
188eb2bee6SAlexander V. Chernikov    """Add file output"""
198eb2bee6SAlexander V. Chernikov    # Add meta-values
208eb2bee6SAlexander V. Chernikov    group = parser.getgroup("general", "Running and selection options")
218eb2bee6SAlexander V. Chernikov    group.addoption(
228eb2bee6SAlexander V. Chernikov        "--atf-source-dir",
238eb2bee6SAlexander V. Chernikov        type=str,
248eb2bee6SAlexander V. Chernikov        dest="atf_source_dir",
258eb2bee6SAlexander V. Chernikov        help="Path to the test source directory",
268eb2bee6SAlexander V. Chernikov    )
278eb2bee6SAlexander V. Chernikov    group.addoption(
288eb2bee6SAlexander V. Chernikov        "--atf-cleanup",
298eb2bee6SAlexander V. Chernikov        default=False,
308eb2bee6SAlexander V. Chernikov        action="store_true",
318eb2bee6SAlexander V. Chernikov        dest="atf_cleanup",
328eb2bee6SAlexander V. Chernikov        help="Call cleanup procedure for a given test",
338eb2bee6SAlexander V. Chernikov    )
348eb2bee6SAlexander V. Chernikov    group = parser.getgroup("terminal reporting", "reporting", after="general")
358eb2bee6SAlexander V. Chernikov    group.addoption(
368eb2bee6SAlexander V. Chernikov        "--atf",
378eb2bee6SAlexander V. Chernikov        default=False,
388eb2bee6SAlexander V. Chernikov        action="store_true",
398eb2bee6SAlexander V. Chernikov        help="Enable test listing/results output in atf format",
408eb2bee6SAlexander V. Chernikov    )
418eb2bee6SAlexander V. Chernikov    group.addoption(
428eb2bee6SAlexander V. Chernikov        "--atf-file",
438eb2bee6SAlexander V. Chernikov        type=str,
448eb2bee6SAlexander V. Chernikov        dest="atf_file",
458eb2bee6SAlexander V. Chernikov        help="Path to the status file provided by atf runtime",
468eb2bee6SAlexander V. Chernikov    )
478eb2bee6SAlexander V. Chernikov
488eb2bee6SAlexander V. Chernikov
49*513ce835SAlexander V. Chernikov@pytest.fixture(autouse=True, scope="session")
50*513ce835SAlexander V. Chernikovdef atf_vars() -> Dict[str, str]:
51*513ce835SAlexander V. Chernikov    return ATFHandler.get_atf_vars()
52*513ce835SAlexander V. Chernikov
53*513ce835SAlexander V. Chernikov
548eb2bee6SAlexander V. Chernikov@pytest.mark.trylast
558eb2bee6SAlexander V. Chernikovdef pytest_configure(config):
568eb2bee6SAlexander V. Chernikov    if config.option.help:
578eb2bee6SAlexander V. Chernikov        return
588eb2bee6SAlexander V. Chernikov
598eb2bee6SAlexander V. Chernikov    # Register markings anyway to avoid warnings
608eb2bee6SAlexander V. Chernikov    config.addinivalue_line("markers", "require_user(name): user to run the test with")
618eb2bee6SAlexander V. Chernikov    config.addinivalue_line(
628eb2bee6SAlexander V. Chernikov        "markers", "require_arch(names): List[str] of support archs"
638eb2bee6SAlexander V. Chernikov    )
648eb2bee6SAlexander V. Chernikov    # config.addinivalue_line("markers", "require_config(config): List[Tuple[str,Any]] of k=v pairs")
658eb2bee6SAlexander V. Chernikov    config.addinivalue_line(
668eb2bee6SAlexander V. Chernikov        "markers", "require_diskspace(amount): str with required diskspace"
678eb2bee6SAlexander V. Chernikov    )
688eb2bee6SAlexander V. Chernikov    config.addinivalue_line(
698eb2bee6SAlexander V. Chernikov        "markers", "require_files(space): List[str] with file paths"
708eb2bee6SAlexander V. Chernikov    )
718eb2bee6SAlexander V. Chernikov    config.addinivalue_line(
728eb2bee6SAlexander V. Chernikov        "markers", "require_machine(names): List[str] of support machine types"
738eb2bee6SAlexander V. Chernikov    )
748eb2bee6SAlexander V. Chernikov    config.addinivalue_line(
758eb2bee6SAlexander V. Chernikov        "markers", "require_memory(amount): str with required memory"
768eb2bee6SAlexander V. Chernikov    )
778eb2bee6SAlexander V. Chernikov    config.addinivalue_line(
788eb2bee6SAlexander V. Chernikov        "markers", "require_progs(space): List[str] with file paths"
798eb2bee6SAlexander V. Chernikov    )
808eb2bee6SAlexander V. Chernikov    config.addinivalue_line(
818eb2bee6SAlexander V. Chernikov        "markers", "timeout(dur): int/float with max duration in sec"
828eb2bee6SAlexander V. Chernikov    )
838eb2bee6SAlexander V. Chernikov
848eb2bee6SAlexander V. Chernikov    global PLUGIN_ENABLED
858eb2bee6SAlexander V. Chernikov    PLUGIN_ENABLED = config.option.atf
868eb2bee6SAlexander V. Chernikov    if not PLUGIN_ENABLED:
878eb2bee6SAlexander V. Chernikov        return
888eb2bee6SAlexander V. Chernikov    get_handler()
898eb2bee6SAlexander V. Chernikov
908eb2bee6SAlexander V. Chernikov    if config.option.collectonly:
918eb2bee6SAlexander V. Chernikov        # Need to output list of tests to stdout, hence override
928eb2bee6SAlexander V. Chernikov        # standard reporter plugin
938eb2bee6SAlexander V. Chernikov        reporter = config.pluginmanager.getplugin("terminalreporter")
948eb2bee6SAlexander V. Chernikov        if reporter:
958eb2bee6SAlexander V. Chernikov            config.pluginmanager.unregister(reporter)
968eb2bee6SAlexander V. Chernikov
978eb2bee6SAlexander V. Chernikov
988eb2bee6SAlexander V. Chernikovdef pytest_collection_modifyitems(session, config, items):
998eb2bee6SAlexander V. Chernikov    """If cleanup is requested, replace collected tests with their cleanups (if any)"""
1008eb2bee6SAlexander V. Chernikov    if PLUGIN_ENABLED and config.option.atf_cleanup:
1018eb2bee6SAlexander V. Chernikov        new_items = []
1028eb2bee6SAlexander V. Chernikov        handler = get_handler()
1038eb2bee6SAlexander V. Chernikov        for obj in items:
1048eb2bee6SAlexander V. Chernikov            if handler.has_object_cleanup(obj):
1058eb2bee6SAlexander V. Chernikov                handler.override_runtest(obj)
1068eb2bee6SAlexander V. Chernikov                new_items.append(obj)
1078eb2bee6SAlexander V. Chernikov        items.clear()
1088eb2bee6SAlexander V. Chernikov        items.extend(new_items)
1098eb2bee6SAlexander V. Chernikov
1108eb2bee6SAlexander V. Chernikov
1118eb2bee6SAlexander V. Chernikovdef pytest_collection_finish(session):
1128eb2bee6SAlexander V. Chernikov    if PLUGIN_ENABLED and session.config.option.collectonly:
1138eb2bee6SAlexander V. Chernikov        handler = get_handler()
1148eb2bee6SAlexander V. Chernikov        handler.list_tests(session.items)
1158eb2bee6SAlexander V. Chernikov
1168eb2bee6SAlexander V. Chernikov
1178eb2bee6SAlexander V. Chernikovdef pytest_runtest_logreport(report):
1188eb2bee6SAlexander V. Chernikov    if PLUGIN_ENABLED:
1198eb2bee6SAlexander V. Chernikov        handler = get_handler()
1208eb2bee6SAlexander V. Chernikov        handler.add_report(report)
1218eb2bee6SAlexander V. Chernikov
1228eb2bee6SAlexander V. Chernikov
1238eb2bee6SAlexander V. Chernikovdef pytest_unconfigure(config):
1248eb2bee6SAlexander V. Chernikov    if PLUGIN_ENABLED and config.option.atf_file:
1258eb2bee6SAlexander V. Chernikov        handler = get_handler()
1268eb2bee6SAlexander V. Chernikov        handler.write_report(config.option.atf_file)
127