| # Copyright lowRISC contributors. | |
| # Licensed under the Apache License, Version 2.0, see LICENSE for details. | |
| # SPDX-License-Identifier: Apache-2.0 | |
| import logging | |
| import os | |
| from pathlib import Path | |
| import pytest | |
| import yaml | |
| from . import utils | |
| log = logging.getLogger(__name__) | |
| @pytest.hookimpl(tryfirst=True) | |
| def pytest_exception_interact(node, call, report): | |
| """Dump all log files in case of a test failure.""" | |
| try: | |
| if not report.failed: | |
| return | |
| if 'tmp_path_factory' not in node.funcargs: | |
| return | |
| except Exception: | |
| return | |
| utils.dump_temp_files(node.funcargs['tmp_path_factory'].getbasetemp()) | |
| @pytest.fixture(scope="session") | |
| def localconf(): | |
| """Host-local configuration.""" | |
| if 'OPENTITAN_TEST_LOCALCONF' in os.environ: | |
| localconf_yaml_file = Path(os.environ['OPENTITAN_TEST_LOCALCONF']) | |
| log.info("Attempting to use configuration file set in " | |
| "OPENTITAN_TEST_LOCALCONF.") | |
| else: | |
| XDG_CONFIG_HOME = Path(os.getenv( | |
| 'XDG_CONFIG_HOME', os.path.join(os.environ['HOME'], '.config'))) | |
| localconf_yaml_file = XDG_CONFIG_HOME / 'opentitan' / 'test-localconf.yaml' | |
| log.info('Reading configuration from ' + str(localconf_yaml_file)) | |
| with open(str(localconf_yaml_file), 'r') as fp: | |
| return yaml.load(fp, Loader=yaml.SafeLoader) | |
| @pytest.fixture(scope="session") | |
| def topsrcdir(): | |
| """Return the top-level source directory as Path object.""" | |
| # TODO: Consider making this configurable using a pytest arg. | |
| path = (Path(os.path.dirname(__file__)) / '..' / '..').resolve() | |
| assert path.is_dir() | |
| return path | |
| @pytest.fixture(scope="session") | |
| def bin_dir(topsrcdir): | |
| """ Return the BIN_DIR (build output directory) """ | |
| if 'BIN_DIR' in os.environ: | |
| bin_dir = Path(os.environ['BIN_DIR']) | |
| log.info("Using build outputs from environment variable BIN_DIR={}".format(str(bin_dir))) | |
| else: | |
| bin_dir = topsrcdir / 'build-bin' | |
| log.info("Using build outputs from $REPO_TOP/build-bin ({})".format(str(bin_dir))) | |
| assert bin_dir.is_dir() | |
| return bin_dir |