summaryrefslogtreecommitdiff
path: root/tests/conftest.py
diff options
context:
space:
mode:
authorTristan Van Berkom <tristan.vanberkom@codethink.co.uk>2019-03-20 15:25:07 +0900
committerTristan Van Berkom <tristan.vanberkom@codethink.co.uk>2019-03-20 15:25:07 +0900
commitf1edb51d83611bb24ddb4934160a558cf926aa0b (patch)
tree81350141dba5455b580d4fb971a54f06bf7503a5 /tests/conftest.py
parent964261032b8ad1864680a9a38da9c27d8e1bf3c7 (diff)
downloadbuildstream-f1edb51d83611bb24ddb4934160a558cf926aa0b.tar.gz
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.
Diffstat (limited to 'tests/conftest.py')
-rwxr-xr-xtests/conftest.py109
1 files changed, 109 insertions, 0 deletions
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 <http://www.gnu.org/licenses/>.
+#
+# Authors:
+# Tristan Maat <tristan.maat@codethink.co.uk>
+#
+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()