From 1fa54e295dda9bb2dccb66f816b7c4332aefb453 Mon Sep 17 00:00:00 2001 From: Filip Valder Date: Jan 26 2022 10:28:04 +0000 Subject: Fix the test suite - Move the prints so it's clear in which phase we're in. - Support obsoletes module:stream.yaml format. - Merge obsoletes into a separate index (don't mix with the defaults). - Exclude test obsoletes. - Pre-tested with perl:5.30.yaml, see PR#229. Signed-off-by: Filip Valder --- diff --git a/tests/exclusions.txt b/tests/exclusions.txt index d388574..22895c7 100644 --- a/tests/exclusions.txt +++ b/tests/exclusions.txt @@ -28,3 +28,4 @@ tests/missingstream.yaml tests/module.yaml tests/modulewithnames.yaml tests/nodejs.yaml +tests/obsoletes/nodejs:11.yaml diff --git a/tests/obsoletes/nodejs.yaml b/tests/obsoletes/nodejs.yaml deleted file mode 100644 index 1b849b3..0000000 --- a/tests/obsoletes/nodejs.yaml +++ /dev/null @@ -1,10 +0,0 @@ -document: modulemd-obsoletes -version: 1 -data: - modified: 2018-05-23T14:25Z - module: nodejs - stream: "11" - message: "Module stream nodejs:11 is no longer supported. It is recommended to switch to nodejs:12" - obsoleted_by: - module: nodejs - stream: "12" diff --git a/tests/obsoletes/nodejs:11.yaml b/tests/obsoletes/nodejs:11.yaml new file mode 100644 index 0000000..1b849b3 --- /dev/null +++ b/tests/obsoletes/nodejs:11.yaml @@ -0,0 +1,10 @@ +document: modulemd-obsoletes +version: 1 +data: + modified: 2018-05-23T14:25Z + module: nodejs + stream: "11" + message: "Module stream nodejs:11 is no longer supported. It is recommended to switch to nodejs:12" + obsoleted_by: + module: nodejs + stream: "12" diff --git a/tests/validate.py b/tests/validate.py index 7d4df7b..c7028f9 100755 --- a/tests/validate.py +++ b/tests/validate.py @@ -79,8 +79,24 @@ def do_validate(filename, obsoletes=False): # Filenames must match their contents expected_name = os.path.basename(filename).rsplit(".", maxsplit=1)[0] + if obsoletes: + if ":" not in expected_name: + error( + "Module obsoletes filename must be in the form of " + ":.yaml" + ) + return False, None + expected_module_name, expected_stream = expected_name.rsplit(":", maxsplit=1) + if (expected_module_name != mmd.props.module_name + or expected_stream != mmd.props.module_stream): + error( + 'Module name/stream "{}:{}" doesn\'t match filename "{}.yaml"'.format( + mmd.props.module_name, mmd.props.module_stream, expected_name + ) + ) + return False, None - if expected_name != mmd.props.module_name: + elif expected_name != mmd.props.module_name: error( 'Module name "{}" doesn\'t match filename "{}.yaml"'.format( mmd.props.module_name, expected_name @@ -123,6 +139,7 @@ def main(): script_dir = os.path.dirname(os.path.realpath(__file__)) defaults_dir = os.path.abspath(os.path.join(script_dir, '..')) overrides_dir = os.path.join(defaults_dir, 'overrides') + obsoletes_dir = os.path.abspath(os.path.join(script_dir, '..', 'obsoletes')) # Get the repo we're running in repo = git.Repo(defaults_dir, search_parent_directories=True) @@ -153,6 +170,12 @@ def main(): else: defaults_files.append(x) + print("\nValidation of modulemd documents:\n" + "=================================") + + if defaults_files: + print("\nModule defaults:\n" + "----------------") # Validate module defaults files for file in defaults_files: (valid, _) = do_validate(file) @@ -160,6 +183,9 @@ def main(): error("{} failed to validate".format(file)) result = os.EX_DATAERR + if obsoletes_test_files: + print("\nModule obsoletes (testing):\n" + "---------------------------") # Validate module obsoletes test files for file in obsoletes_test_files: (valid, _) = do_validate(file, obsoletes=True) @@ -170,6 +196,8 @@ def main(): if result == os.EX_DATAERR: return result + print("\nDefault streams (Runtime):\n" + "==========================") # For sanity's sake, also do a merge of all the defaults to make sure no # conflicts arise that weren't detected by the above tests. This should be # impossible. @@ -177,11 +205,6 @@ def main(): idx_runtime = Modulemd.ModuleIndex() idx_runtime.update_from_defaults_directory(path=defaults_dir, strict=True) - # for obsoletes tests, because simple index copy is not possible - # due to: GObject descendants' instances are non-copyable - idx_tests = Modulemd.ModuleIndex() - idx_tests.update_from_defaults_directory(path=defaults_dir, - strict=True) except GLib.Error as e: error("Could not merge all defaults: {}".format(e.message)) result = os.EX_DATAERR @@ -189,11 +212,11 @@ def main(): if result == os.EX_OK: info("Merging all of the documents encountered no errors.") - print("\nDefault streams (Runtime):\n" - "==========================") for m, s in idx_runtime.get_default_streams().items(): print("{}:{}".format(m, s)) + print("\nDefault streams (Buildroot):\n" + "============================") try: idx_buildroot = Modulemd.ModuleIndex() idx_buildroot.update_from_defaults_directory(path=defaults_dir, @@ -206,44 +229,37 @@ def main(): if result == os.EX_OK: info("Merging all of the documents encountered no errors.") - print("\nDefault streams (Buildroot):\n" - "============================") for m, s in idx_buildroot.get_default_streams().items(): print("{}:{}".format(m, s)) - # Try merging TEST module obsoletes into the module defaults index. - for file in obsoletes_test_files: - (_, mmd) = do_validate(file, obsoletes=True) - idx_tests.add_obsoletes(mmd) + print("\nObsoletes:\n" + "==========") - print("\nObsoletes (tests):\n" - "==================") - for module_name in idx_tests.get_module_names(): - module = idx_tests.get_module(module_name) - obsoletes = module.get_obsoletes() - if not obsoletes: - continue - if len(obsoletes) > 1: - result = os.EX_DATAERR - break - print("{}:{}".format(module_name, obsoletes[0].props.module_stream)) + try: + idx_obsoletes = Modulemd.ModuleIndex() + idx_obsoletes.update_from_defaults_directory(path=obsoletes_dir, + strict=True) + # Try merging module obsoletes into the module obsoletes index. + for file in obsoletes_files: + (_, mmd) = do_validate(file, obsoletes=True) + if not mmd: + result = os.EX_DATAERR + break + idx_obsoletes.add_obsoletes(mmd) + except GLib.Error as e: + error("Could not merge all obsoletes: {}".format(e.message)) + result = os.EX_DATAERR - # Try merging module obsoletes into the module defaults index. - for file in obsoletes_files: - (_, mmd) = do_validate(file, obsoletes=True) - idx_runtime.add_obsoletes(mmd) + if result == os.EX_OK: + info("Merging all of the documents encountered no errors.") - print("\nObsoletes:\n" - "==========") - for module_name in idx_runtime.get_module_names(): - module = idx_runtime.get_module(module_name) + for module_name in idx_obsoletes.get_module_names(): + module = idx_obsoletes.get_module(module_name) obsoletes = module.get_obsoletes() if not obsoletes: - continue - if len(obsoletes) > 1: + error("Module {} has no obsoletes.".format(module_name)) result = os.EX_DATAERR break - print("{}:{}".format(module_name, obsoletes[0].props.module_stream)) return result