#!/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=False) # 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 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()