From c03b922e118a4de25464b305b9196eefbd58b194 Mon Sep 17 00:00:00 2001 From: Alexander Grund Date: Fri, 26 Sep 2025 17:23:47 +0200 Subject: [PATCH 1/5] Test that report_test_failure shows formatted text Some exception texts have formatting such as quotes, newlines, tabs. Those should be preserved when reporting the error. --- test/framework/sandbox/easybuild/easyblocks/t/toy.py | 2 +- test/framework/toy_build.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/framework/sandbox/easybuild/easyblocks/t/toy.py b/test/framework/sandbox/easybuild/easyblocks/t/toy.py index da631b2390..9fde1a3783 100644 --- a/test/framework/sandbox/easybuild/easyblocks/t/toy.py +++ b/test/framework/sandbox/easybuild/easyblocks/t/toy.py @@ -135,7 +135,7 @@ def build_step(self, name=None, cfg=None): def test_step(self, *args, **kwargs): """Test toy.""" if self.cfg['runtest'] == 'RAISE_ERROR': - raise EasyBuildError("TOY_TEST_FAIL") + raise EasyBuildError("TOY_TEST_FAIL\nDescription on new line") else: super().test_step(*args, **kwargs) diff --git a/test/framework/toy_build.py b/test/framework/toy_build.py index 9045494bc7..7fb232494c 100644 --- a/test/framework/toy_build.py +++ b/test/framework/toy_build.py @@ -4842,7 +4842,7 @@ def test_toy_failing_test_step(self): test_ec_txt += '\nruntest = "RAISE_ERROR"' write_file(test_ec, test_ec_txt) - error_pattern = r"An error was raised during test step: 'TOY_TEST_FAIL'" + error_pattern = "An error was raised during test step: TOY_TEST_FAIL\nDescription" self.assertErrorRegex(EasyBuildError, error_pattern, self.run_test_toy_build_with_output, ec_file=test_ec, raise_error=True) From e83556b24f2909a4e53b54ad0ba2ff583414958a Mon Sep 17 00:00:00 2001 From: Alexander Grund Date: Fri, 26 Sep 2025 17:25:34 +0200 Subject: [PATCH 2/5] Use `EasyBuildError.msg` for `report_test_failure` This ensures that formatting is kept --- easybuild/framework/easyblock.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/easybuild/framework/easyblock.py b/easybuild/framework/easyblock.py index dd7f65fc37..df905f3aa9 100644 --- a/easybuild/framework/easyblock.py +++ b/easybuild/framework/easyblock.py @@ -3037,7 +3037,7 @@ def _test_step(self): try: self.test_step() except EasyBuildError as err: - self.report_test_failure(f"An error was raised during test step: {err}") + self.report_test_failure(f"An error was raised during test step: {err.msg}") except RunShellCmdError as err: err.print() ec_path = os.path.basename(self.cfg.path) From 8cfea98d30f31ad6775dd36f7bef683eb8508bfc Mon Sep 17 00:00:00 2001 From: Alexander Grund Date: Fri, 26 Sep 2025 17:31:28 +0200 Subject: [PATCH 3/5] Revert "Use `EasyBuildError.msg` for `report_test_failure`" This reverts commit e83556b24f2909a4e53b54ad0ba2ff583414958a. --- easybuild/framework/easyblock.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/easybuild/framework/easyblock.py b/easybuild/framework/easyblock.py index df905f3aa9..dd7f65fc37 100644 --- a/easybuild/framework/easyblock.py +++ b/easybuild/framework/easyblock.py @@ -3037,7 +3037,7 @@ def _test_step(self): try: self.test_step() except EasyBuildError as err: - self.report_test_failure(f"An error was raised during test step: {err.msg}") + self.report_test_failure(f"An error was raised during test step: {err}") except RunShellCmdError as err: err.print() ec_path = os.path.basename(self.cfg.path) From c6bf21ca7926ef578ce16081f5bbde8b9422193a Mon Sep 17 00:00:00 2001 From: Alexander Grund Date: Fri, 26 Sep 2025 17:31:42 +0200 Subject: [PATCH 4/5] Return message when converting `EasyBuildError` to string This ensures any formatting like newlines is kept. --- easybuild/tools/build_log.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/easybuild/tools/build_log.py b/easybuild/tools/build_log.py index 044f53faac..712c3ea4e7 100644 --- a/easybuild/tools/build_log.py +++ b/easybuild/tools/build_log.py @@ -139,7 +139,7 @@ def __init__(self, msg, *args, exit_code=EasyBuildExit.ERROR, **kwargs): def __str__(self): """Return string representation of this EasyBuildError instance.""" - return repr(self.msg) + return self.msg def raise_easybuilderror(msg, *args): From 8be2c5de5716187e0f7d460226ae346d02de7bae Mon Sep 17 00:00:00 2001 From: Alexander Grund Date: Mon, 29 Sep 2025 09:47:40 +0200 Subject: [PATCH 5/5] Adapt tests --- test/framework/hooks.py | 2 +- test/framework/toy_build.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/test/framework/hooks.py b/test/framework/hooks.py index b460842e33..ccb9722958 100644 --- a/test/framework/hooks.py +++ b/test/framework/hooks.py @@ -271,7 +271,7 @@ def run_hooks(): "== Running pre-single_extension hook...", "this is run before installing an extension", "== Running fail hook...", - "EasyBuild FAIL: 'oops'", + "EasyBuild FAIL: oops", "== Running crash hook...", "EasyBuild CRASHED, oh no! => boom!", "== Running post-easyblock hook...", diff --git a/test/framework/toy_build.py b/test/framework/toy_build.py index 7fb232494c..6edf4f3258 100644 --- a/test/framework/toy_build.py +++ b/test/framework/toy_build.py @@ -1778,7 +1778,7 @@ def test_external_dependencies(self): write_file(toy_ec, ectxt + extraectxt) if isinstance(self.modtool, Lmod): - err_msg = r"Module command \\'.*load nosuchbuilddep/0.0.0\\' failed" + err_msg = r"Module command '.*load nosuchbuilddep/0.0.0' failed" else: err_msg = r"Unable to locate a modulefile for 'nosuchbuilddep/0.0.0'" @@ -1791,7 +1791,7 @@ def test_external_dependencies(self): write_file(toy_ec, ectxt + extraectxt) if isinstance(self.modtool, Lmod): - err_msg = r"Module command \\'.*load nosuchmodule/1.2.3\\' failed" + err_msg = r"Module command '.*load nosuchmodule/1.2.3' failed" else: err_msg = r"Unable to locate a modulefile for 'nosuchmodule/1.2.3'"