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