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