From 0e5ba5c858a3bd9159139ec5640e688525817c13 Mon Sep 17 00:00:00 2001 From: Kenneth Hoste Date: Wed, 18 Jan 2023 21:23:17 +0100 Subject: [PATCH] check type of versionsuffix value in det_full_ec_version, and raise useful error message if it's not a string (fixes #4181) --- easybuild/tools/module_naming_scheme/utilities.py | 13 ++++++++++++- test/framework/easyconfig.py | 9 +++++++++ test/framework/module_generator.py | 11 +++++++++++ 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/easybuild/tools/module_naming_scheme/utilities.py b/easybuild/tools/module_naming_scheme/utilities.py index 2380ef2af4..8e8f3e919e 100644 --- a/easybuild/tools/module_naming_scheme/utilities.py +++ b/easybuild/tools/module_naming_scheme/utilities.py @@ -38,6 +38,7 @@ import string from easybuild.base import fancylogger +from easybuild.tools.build_log import EasyBuildError from easybuild.tools.module_naming_scheme.mns import ModuleNamingScheme from easybuild.tools.py2vs3 import string_type from easybuild.tools.toolchain.toolchain import SYSTEM_TOOLCHAIN_NAME, is_system_toolchain @@ -62,7 +63,17 @@ def det_full_ec_version(ec): ecver = "%s-%s-%s" % (ec['version'], toolchain['name'], toolchain['version']) # prepend/append version prefix/suffix - ecver = ''.join([x for x in [ec.get('versionprefix', ''), ecver, ec.get('versionsuffix', '')] if x]) + versionprefix = ec.get('versionprefix', '') + if not isinstance(versionprefix, string_type): + raise EasyBuildError("versionprefix value should be a string, found '%s': %s (full spec: %s)", + type(versionprefix).__name__, versionprefix, ec) + + versionsuffix = ec.get('versionsuffix', '') + if not isinstance(versionsuffix, string_type): + raise EasyBuildError("versionsuffix value should be a string, found '%s': %s (full spec: %s)", + type(versionsuffix).__name__, versionsuffix, ec) + + ecver = ''.join([x for x in [versionprefix, ecver, versionsuffix] if x]) return ecver diff --git a/test/framework/easyconfig.py b/test/framework/easyconfig.py index 8050ec66dd..80f2525cac 100644 --- a/test/framework/easyconfig.py +++ b/test/framework/easyconfig.py @@ -760,6 +760,15 @@ def test_installversion(self): # only version key is strictly needed self.assertEqual(det_full_ec_version({'version': '1.2.3'}), '1.2.3') + # check how faulty dep spec is handled + faulty_dep_spec = { + 'name': 'test', + 'version': '1.2.3', + 'versionsuffix': {'name': 'system', 'version': 'system'}, + } + error_pattern = "versionsuffix value should be a string, found 'dict'" + self.assertErrorRegex(EasyBuildError, error_pattern, det_full_ec_version, faulty_dep_spec) + def test_obtain_easyconfig(self): """test obtaining an easyconfig file given certain specifications""" init_config(build_options={'silent': True}) diff --git a/test/framework/module_generator.py b/test/framework/module_generator.py index 9220c70a55..450388275b 100644 --- a/test/framework/module_generator.py +++ b/test/framework/module_generator.py @@ -1239,6 +1239,17 @@ def test_mns(): ec2mod_map = default_ec2mod_map test_mns() + # check how an incorrect dependency specification is handled; + # accidentally using SYSTEM as 3rd tuple element should trigger a useful error, + # not a nasty crash; cfr. https://github.com/easybuilders/easybuild-framework/issues/4181 + faulty_dep_spec = { + 'name': 'test', + 'version': '1.2.3', + 'versionsuffix': {'name': 'system', 'version': 'system'}, + } + error_pattern = "versionsuffix value should be a string, found 'dict'" + self.assertErrorRegex(EasyBuildError, error_pattern, ActiveMNS().det_full_module_name, faulty_dep_spec) + def test_mod_name_validation(self): """Test module naming validation.""" # module name must be a string