diff options
Diffstat (limited to 'tests/cachekey')
-rw-r--r-- | tests/cachekey/cachekey.py | 107 | ||||
-rwxr-xr-x | tests/cachekey/update.py | 76 |
2 files changed, 5 insertions, 178 deletions
diff --git a/tests/cachekey/cachekey.py b/tests/cachekey/cachekey.py index 08870f2a0..951972206 100644 --- a/tests/cachekey/cachekey.py +++ b/tests/cachekey/cachekey.py @@ -44,108 +44,13 @@ import os import pytest +from buildstream.testing._cachekeys import check_cache_key_stability, _parse_output_keys from buildstream.testing.runcli import cli # pylint: disable=unused-import from buildstream.testing._utils.site import HAVE_BZR, HAVE_GIT, IS_LINUX, MACHINE_ARCH from buildstream.plugin import CoreWarnings from buildstream import _yaml -############################################## -# Some Helpers # -############################################## - -# Get whole filename in the temp project with -# the option of changing the .bst suffix to something else -# -def element_filename(project_dir, element_name, alt_suffix=None): - - if alt_suffix: - - # Just in case... - assert element_name.endswith(".bst") - - # Chop off the 'bst' in '.bst' and add the new suffix - element_name = element_name[:-3] - element_name = element_name + alt_suffix - - return os.path.join(project_dir, element_name) - - -# Returns an OrderedDict of element names -# and their cache keys -# -def parse_output_keys(output): - actual_keys = OrderedDict() - lines = output.splitlines() - for line in lines: - split = line.split("::") - name = split[0] - key = split[1] - actual_keys[name] = key - - return actual_keys - - -# Returns an OrderedDict of element names -# and their cache keys -# -def load_expected_keys(project_dir, actual_keys, raise_error=True): - - expected_keys = OrderedDict() - for element_name in actual_keys: - expected = element_filename(project_dir, element_name, "expected") - try: - with open(expected, "r") as f: - expected_key = f.read() - expected_key = expected_key.strip() - except FileNotFoundError: - expected_key = None - if raise_error: - raise Exception( - "Cache key test needs update, " - + "expected file {} not found.\n\n".format(expected) - + "Use tests/cachekey/update.py to automatically " - + "update this test case" - ) - - expected_keys[element_name] = expected_key - - return expected_keys - - -def assert_cache_keys(project_dir, output): - - # Read in the expected keys from the cache key test directory - # and parse the actual keys from the `bst show` output - # - actual_keys = parse_output_keys(output) - expected_keys = load_expected_keys(project_dir, actual_keys) - mismatches = [] - - for element_name in actual_keys: - if actual_keys[element_name] != expected_keys[element_name]: - mismatches.append(element_name) - - if mismatches: - info = "" - for element_name in mismatches: - info += ( - " Element: {}\n".format(element_name) - + " Expected: {}\n".format(expected_keys[element_name]) - + " Actual: {}\n".format(actual_keys[element_name]) - ) - - raise AssertionError( - "Cache key mismatches occurred:\n{}\n".format(info) - + "Use tests/cachekey/update.py to automatically " - + "update this test case" - ) - - -############################################## -# Test Entry Point # -############################################## - # Project directory DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "project",) @@ -172,9 +77,7 @@ def test_cache_key(datafiles, cli): # https://github.com/omarkohl/pytest-datafiles/issues/11 os.chmod(goodbye_link, 0o755) - result = cli.run(project=project, silent=True, args=["show", "--format", "%{name}::%{full-key}", "target.bst"]) - result.assert_success() - assert_cache_keys(project, result.output) + check_cache_key_stability(project, cli) @pytest.mark.datafiles(DATA_DIR) @@ -228,15 +131,15 @@ def test_keys_stable_over_targets(cli, datafiles): project = str(datafiles) full_graph_result = cli.run(project=project, args=["show", "--format", "%{name}::%{full-key}", root_element]) full_graph_result.assert_success() - all_cache_keys = parse_output_keys(full_graph_result.output) + all_cache_keys = _parse_output_keys(full_graph_result.output) ordering1_result = cli.run(project=project, args=["show", "--format", "%{name}::%{full-key}", target1, target2]) ordering1_result.assert_success() - ordering1_cache_keys = parse_output_keys(ordering1_result.output) + ordering1_cache_keys = _parse_output_keys(ordering1_result.output) ordering2_result = cli.run(project=project, args=["show", "--format", "%{name}::%{full-key}", target2, target1]) ordering2_result.assert_success() - ordering2_cache_keys = parse_output_keys(ordering2_result.output) + ordering2_cache_keys = _parse_output_keys(ordering2_result.output) elements = ordering1_cache_keys.keys() diff --git a/tests/cachekey/update.py b/tests/cachekey/update.py deleted file mode 100755 index 49af39fe1..000000000 --- a/tests/cachekey/update.py +++ /dev/null @@ -1,76 +0,0 @@ -#!/usr/bin/env python3 -# -# Automatically create or update the .expected files in the -# cache key test directory. -# -# Simply run without any arguments, from anywhere, e.g.: -# -# PYTHONPATH=. ./tests/cachekey/update.py -# -# After this, add any files which were newly created and commit -# the result in order to adjust the cache key test to changed -# keys. -# -import os -import tempfile -from unittest import mock -from buildstream.testing.runcli import Cli - -# This weird try / except is needed, because this will be imported differently -# when pytest runner imports them vs when you run the updater directly from -# this directory. -try: - from cachekey import element_filename, parse_output_keys, load_expected_keys -except ImportError: - from .cachekey import element_filename, parse_output_keys, load_expected_keys - -# Project directory -PROJECT_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "project",) - - -def write_expected_key(element_name, actual_key): - expected_file = element_filename(PROJECT_DIR, element_name, "expected") - with open(expected_file, "w") as f: - f.write(actual_key) - - -def update_keys(): - - with tempfile.TemporaryDirectory(dir=PROJECT_DIR) as tmpdir: - directory = os.path.join(tmpdir, "cache") - os.makedirs(directory) - cli = Cli(directory, verbose=True) - - # Run bst show - result = cli.run( - project=PROJECT_DIR, - silent=True, - args=["--no-colors", "show", "--format", "%{name}::%{full-key}", "target.bst"], - ) - - # Load the actual keys, and the expected ones if they exist - if not result.output: - print("No results from parsing {}:target.bst".format(PROJECT_DIR)) - return - actual_keys = parse_output_keys(result.output) - expected_keys = load_expected_keys(PROJECT_DIR, actual_keys, raise_error=False) - - for element_name in actual_keys: - expected = element_filename(PROJECT_DIR, element_name, "expected") - - if actual_keys[element_name] != expected_keys[element_name]: - if not expected_keys[element_name]: - print("Creating new expected file: {}".format(expected)) - else: - print("Updating expected file: {}".format(expected)) - - write_expected_key(element_name, actual_keys[element_name]) - - -if __name__ == "__main__": - # patch the environment BST_TEST_SUITE value to something if it's not - # present. This avoids an exception thrown at the cli level - bst = "BST_TEST_SUITE" - mock_bst = os.environ.get(bst, "True") - with mock.patch.dict(os.environ, {**os.environ, bst: mock_bst}): - update_keys() |