From f1edb51d83611bb24ddb4934160a558cf926aa0b Mon Sep 17 00:00:00 2001 From: Tristan Van Berkom Date: Wed, 20 Mar 2019 15:25:07 +0900 Subject: tests: Move conftest.py into tests/ subdirectory Pytest implicitly loads this file from the CWD where it runs, which is usually the project toplevel directory, but also supports loading it from the `tests/` subdirectory where tests are run from. Placing it into the `tests/` subdirectory is not perfectly explicit, but is at least a hint to the unsuspecting developer that this file is related to tests. --- tests/conftest.py | 109 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100755 tests/conftest.py (limited to 'tests/conftest.py') diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100755 index 000000000..7f8da3633 --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,109 @@ +#!/usr/bin/env python3 +# +# Copyright (C) 2018 Codethink Limited +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see . +# +# Authors: +# Tristan Maat +# +import os +import shutil +import tempfile +import pytest +from buildstream._platform.platform import Platform + +# +# This file is loaded by pytest, we use it to add a custom +# `--integration` option to our test suite, and to install +# a session scope fixture. +# + + +################################################# +# Implement pytest option # +################################################# +def pytest_addoption(parser): + parser.addoption('--integration', action='store_true', default=False, + help='Run integration tests') + + +def pytest_runtest_setup(item): + if item.get_closest_marker('integration') and not item.config.getvalue('integration'): + pytest.skip('skipping integration test') + + +################################################# +# integration_cache fixture # +################################################# +# +# This is yielded by the `integration_cache` fixture +# +class IntegrationCache(): + + def __init__(self, cache): + self.root = os.path.abspath(cache) + os.makedirs(cache, exist_ok=True) + + # Use the same sources every time + self.sources = os.path.join(self.root, 'sources') + + # Create a temp directory for the duration of the test for + # the artifacts directory + try: + self.cachedir = tempfile.mkdtemp(dir=self.root, prefix='cache-') + except OSError as e: + raise AssertionError("Unable to create test directory !") from e + + +@pytest.fixture(scope='session') +def integration_cache(request): + + # Set the cache dir to the INTEGRATION_CACHE variable, or the + # default if that is not set. + if 'INTEGRATION_CACHE' in os.environ: + cache_dir = os.environ['INTEGRATION_CACHE'] + else: + cache_dir = os.path.abspath('./integration-cache') + + cache = IntegrationCache(cache_dir) + + yield cache + + # Clean up the artifacts after each test run - we only want to + # cache sources between runs + try: + shutil.rmtree(cache.cachedir) + except FileNotFoundError: + pass + try: + shutil.rmtree(os.path.join(cache.root, 'cas')) + except FileNotFoundError: + pass + + +################################################# +# Automatically reset the platform # +################################################# +# +# This might need some refactor, maybe buildstream +# needs to cleanup more gracefully and we could remove this. +# +def clean_platform_cache(): + Platform._instance = None + + +@pytest.fixture(autouse=True) +def ensure_platform_cache_is_clean(): + clean_platform_cache() -- cgit v1.2.1