[LTP] [RFC PATCH 4/5] shell lib: Add basic support for test cleanup

Petr Vorel pvorel@suse.cz
Fri Feb 28 18:24:37 CET 2025


Add basic support for test cleanup in shell loader.

This solves the problem of the order the scripts are sourced. Before it
was:

    test.sh
     . tst_loader.sh
      tst_run_shell test.sh
       . tst_loader.sh
	. tst_env.sh <- at this point in the execution you haven't even started
			parsing test.sh so you cannot run functions from there
			at all

Now new script tst_exec.sh is used to load load the test (loaded itself
by tst_run_shell):

    test.sh
     . tst_loader.sh
     tst_run_shell tst_exec.sh test.sh
      . test.sh
	. tst_env.sh

'. tst_loader.sh' (loading a script) was moved to the end, calling test
function (now forced to be tst_test) and tst_env.sh was moved to
tst_exec.sh.

There will be more improvements in the future, at least adding TST_CNT
support (will require changes in tst_test.c to handle timeouts).

Suggested-by: Cyril Hrubis <chrubis@suse.cz>
Co-developed-by: Cyril Hrubis <chrubis@suse.cz>
Signed-off-by: Petr Vorel <pvorel@suse.cz>
---
Maybe variables in tst_run_shell.c could be renamed?

 testcases/kernel/mem/vma/vma05.sh             |  4 +---
 testcases/lib/tests/shell_loader.sh           |  4 +---
 .../lib/tests/shell_loader_all_filesystems.sh |  4 +---
 .../lib/tests/shell_loader_brk_cleanup.sh     |  4 +---
 testcases/lib/tests/shell_loader_c_child.sh   |  4 +---
 testcases/lib/tests/shell_loader_cleanup.sh   |  4 +---
 .../lib/tests/shell_loader_filesystems.sh     |  4 +---
 .../lib/tests/shell_loader_invalid_block.sh   |  4 +---
 .../tests/shell_loader_invalid_metadata.sh    |  4 +---
 testcases/lib/tests/shell_loader_kconfigs.sh  |  4 +---
 .../lib/tests/shell_loader_no_metadata.sh     |  4 +---
 .../lib/tests/shell_loader_supported_archs.sh |  4 +---
 testcases/lib/tests/shell_loader_tags.sh      |  4 +---
 testcases/lib/tests/shell_loader_tcnt.sh      |  4 +---
 .../lib/tests/shell_loader_wrong_metadata.sh  |  4 +---
 testcases/lib/tst_env.sh                      |  4 ----
 testcases/lib/tst_exec.sh                     | 19 +++++++++++++++++++
 testcases/lib/tst_loader.sh                   |  5 +----
 testcases/lib/tst_run_shell.c                 | 16 +++++++++++-----
 19 files changed, 46 insertions(+), 58 deletions(-)
 create mode 100755 testcases/lib/tst_exec.sh

diff --git a/testcases/kernel/mem/vma/vma05.sh b/testcases/kernel/mem/vma/vma05.sh
index 11d6b2ad86..5f8940581b 100755
--- a/testcases/kernel/mem/vma/vma05.sh
+++ b/testcases/kernel/mem/vma/vma05.sh
@@ -39,8 +39,6 @@
 # }
 # ---
 
-. tst_loader.sh
-
 tst_test()
 {
 	ulimit -c unlimited
@@ -71,4 +69,4 @@ tst_test()
 	fi
 }
 
-tst_test
+. tst_loader.sh
diff --git a/testcases/lib/tests/shell_loader.sh b/testcases/lib/tests/shell_loader.sh
index 73812c3e23..eeed122c1e 100755
--- a/testcases/lib/tests/shell_loader.sh
+++ b/testcases/lib/tests/shell_loader.sh
@@ -14,8 +14,6 @@
 # }
 # ---
 
-. tst_loader.sh
-
 tst_test()
 {
 	tst_res TPASS "Shell loader works fine!"
@@ -27,4 +25,4 @@ tst_test()
 	esac
 }
 
-tst_test
+. tst_loader.sh
diff --git a/testcases/lib/tests/shell_loader_all_filesystems.sh b/testcases/lib/tests/shell_loader_all_filesystems.sh
index 33c73dfb41..caa4c75ff4 100755
--- a/testcases/lib/tests/shell_loader_all_filesystems.sh
+++ b/testcases/lib/tests/shell_loader_all_filesystems.sh
@@ -12,8 +12,6 @@
 # }
 # ---
 
-. tst_loader.sh
-
 tst_test()
 {
 	local mntpath=$(realpath ltp_mntpoint)
@@ -32,4 +30,4 @@ tst_test()
 	fi
 }
 
-tst_test
+. tst_loader.sh
diff --git a/testcases/lib/tests/shell_loader_brk_cleanup.sh b/testcases/lib/tests/shell_loader_brk_cleanup.sh
index ff33345ce3..c6286176c5 100755
--- a/testcases/lib/tests/shell_loader_brk_cleanup.sh
+++ b/testcases/lib/tests/shell_loader_brk_cleanup.sh
@@ -10,8 +10,6 @@
 
 TST_CLEANUP=cleanup
 
-. tst_loader.sh
-
 cleanup()
 {
 	tst_res TINFO "Cleanup runs"
@@ -22,4 +20,4 @@ tst_test()
 	tst_brk TBROK "Test exits"
 }
 
-tst_test
+. tst_loader.sh
diff --git a/testcases/lib/tests/shell_loader_c_child.sh b/testcases/lib/tests/shell_loader_c_child.sh
index b2b8f3d057..9acc212145 100755
--- a/testcases/lib/tests/shell_loader_c_child.sh
+++ b/testcases/lib/tests/shell_loader_c_child.sh
@@ -13,8 +13,6 @@
 # }
 # ---
 
-. tst_loader.sh
-
 tst_test()
 {
 	if [ -n "LTP_IPC_PATH" ]; then
@@ -25,4 +23,4 @@ tst_test()
 	shell_c_child
 }
 
-tst_test
+. tst_loader.sh
diff --git a/testcases/lib/tests/shell_loader_cleanup.sh b/testcases/lib/tests/shell_loader_cleanup.sh
index 684901b51f..a59301a15b 100755
--- a/testcases/lib/tests/shell_loader_cleanup.sh
+++ b/testcases/lib/tests/shell_loader_cleanup.sh
@@ -10,8 +10,6 @@
 
 TST_CLEANUP=do_cleanup
 
-. tst_loader.sh
-
 do_cleanup()
 {
 	tst_res TINFO "Cleanup executed"
@@ -22,4 +20,4 @@ tst_test()
 	tst_res TPASS "Test is executed"
 }
 
-tst_test
+. tst_loader.sh
diff --git a/testcases/lib/tests/shell_loader_filesystems.sh b/testcases/lib/tests/shell_loader_filesystems.sh
index 155cc4d9f6..c23590d26a 100755
--- a/testcases/lib/tests/shell_loader_filesystems.sh
+++ b/testcases/lib/tests/shell_loader_filesystems.sh
@@ -19,8 +19,6 @@
 # }
 # ---
 
-. tst_loader.sh
-
 tst_test()
 {
 	tst_res TINFO "In shell"
@@ -37,4 +35,4 @@ tst_test()
 	fi
 }
 
-tst_test
+. tst_loader.sh
diff --git a/testcases/lib/tests/shell_loader_invalid_block.sh b/testcases/lib/tests/shell_loader_invalid_block.sh
index 370c9043bc..7df25c95dd 100755
--- a/testcases/lib/tests/shell_loader_invalid_block.sh
+++ b/testcases/lib/tests/shell_loader_invalid_block.sh
@@ -20,11 +20,9 @@
 # This is an invalid block that breaks the test.
 # ---
 
-. tst_loader.sh
-
 tst_test()
 {
 	tst_res TPASS "This should pass!"
 }
 
-tst_test
+. tst_loader.sh
diff --git a/testcases/lib/tests/shell_loader_invalid_metadata.sh b/testcases/lib/tests/shell_loader_invalid_metadata.sh
index 3834f1b9ed..2b7f86c5b5 100755
--- a/testcases/lib/tests/shell_loader_invalid_metadata.sh
+++ b/testcases/lib/tests/shell_loader_invalid_metadata.sh
@@ -12,11 +12,9 @@
 # ---
 #
 
-. tst_loader.sh
-
 tst_test()
 {
 	tst_res TFAIL "Shell loader should TBROK the test"
 }
 
-tst_test
+. tst_loader.sh
diff --git a/testcases/lib/tests/shell_loader_kconfigs.sh b/testcases/lib/tests/shell_loader_kconfigs.sh
index e1b6187554..8fdf3e16c5 100755
--- a/testcases/lib/tests/shell_loader_kconfigs.sh
+++ b/testcases/lib/tests/shell_loader_kconfigs.sh
@@ -9,11 +9,9 @@
 # }
 # ---
 
-. tst_loader.sh
-
 tst_test()
 {
 	tst_res TPASS "Shell loader works fine!"
 }
 
-tst_test
+. tst_loader.sh
diff --git a/testcases/lib/tests/shell_loader_no_metadata.sh b/testcases/lib/tests/shell_loader_no_metadata.sh
index b664b48b57..4c55afabfe 100755
--- a/testcases/lib/tests/shell_loader_no_metadata.sh
+++ b/testcases/lib/tests/shell_loader_no_metadata.sh
@@ -5,11 +5,9 @@
 # This test has no metadata and should not be executed
 #
 
-. tst_loader.sh
-
 tst_test()
 {
 	tst_res TFAIL "Shell loader should TBROK the test"
 }
 
-tst_test
+. tst_loader.sh
diff --git a/testcases/lib/tests/shell_loader_supported_archs.sh b/testcases/lib/tests/shell_loader_supported_archs.sh
index 9ad24f9c03..99c387d248 100755
--- a/testcases/lib/tests/shell_loader_supported_archs.sh
+++ b/testcases/lib/tests/shell_loader_supported_archs.sh
@@ -9,11 +9,9 @@
 # }
 # ---
 
-. tst_loader.sh
-
 tst_test()
 {
 	tst_res TPASS "We are running on supported architecture"
 }
 
-tst_test
+. tst_loader.sh
diff --git a/testcases/lib/tests/shell_loader_tags.sh b/testcases/lib/tests/shell_loader_tags.sh
index c780a66c57..b8f78b61b4 100755
--- a/testcases/lib/tests/shell_loader_tags.sh
+++ b/testcases/lib/tests/shell_loader_tags.sh
@@ -12,11 +12,9 @@
 # }
 # ---
 
-. tst_loader.sh
-
 tst_test()
 {
 	tst_res TFAIL "Fails the test so that tags are shown."
 }
 
-tst_test
+. tst_loader.sh
diff --git a/testcases/lib/tests/shell_loader_tcnt.sh b/testcases/lib/tests/shell_loader_tcnt.sh
index 93bd612ee2..c29c0558d2 100755
--- a/testcases/lib/tests/shell_loader_tcnt.sh
+++ b/testcases/lib/tests/shell_loader_tcnt.sh
@@ -12,11 +12,9 @@
 # ---
 #
 
-. tst_loader.sh
-
 tst_test()
 {
 	tst_res TPASS "Iteration $1"
 }
 
-tst_test
+. tst_loader.sh
diff --git a/testcases/lib/tests/shell_loader_wrong_metadata.sh b/testcases/lib/tests/shell_loader_wrong_metadata.sh
index 8f18741100..cf5e577947 100755
--- a/testcases/lib/tests/shell_loader_wrong_metadata.sh
+++ b/testcases/lib/tests/shell_loader_wrong_metadata.sh
@@ -12,11 +12,9 @@
 # ---
 #
 
-. tst_loader.sh
-
 tst_test()
 {
 	tst_res TFAIL "Shell loader should TBROK the test"
 }
 
-tst_test
+. tst_loader.sh
diff --git a/testcases/lib/tst_env.sh b/testcases/lib/tst_env.sh
index b13bab37c3..68f9a0daa9 100644
--- a/testcases/lib/tst_env.sh
+++ b/testcases/lib/tst_env.sh
@@ -35,7 +35,3 @@ tst_brk_()
 
 alias tst_res="tst_res_ $tst_script_name \$LINENO"
 alias tst_brk="tst_brk_ $tst_script_name \$LINENO"
-
-if [ -n "$TST_CLEANUP" ]; then
-	trap $TST_CLEANUP EXIT
-fi
diff --git a/testcases/lib/tst_exec.sh b/testcases/lib/tst_exec.sh
new file mode 100755
index 0000000000..dcf40fd5bb
--- /dev/null
+++ b/testcases/lib/tst_exec.sh
@@ -0,0 +1,19 @@
+#!/bin/sh
+# Copyright (c) 2025 Cyril Hrubis <chrubis@suse.cz>
+# Copyright (c) 2025 Petr Vorel <pvorel@suse.cz>
+
+. tst_env.sh
+
+. "$1"
+
+if [ -n "$TST_CLEANUP" ]; then
+	trap $TST_CLEANUP EXIT
+fi
+
+if [ -n "$TST_SETUP" ]; then
+    $TST_SETUP
+fi
+
+tst_test
+
+# vim: set ft=sh ts=4 sts=4 sw=4 expandtab :
diff --git a/testcases/lib/tst_loader.sh b/testcases/lib/tst_loader.sh
index 62c9cc6d8f..e2d1bd7daf 100644
--- a/testcases/lib/tst_loader.sh
+++ b/testcases/lib/tst_loader.sh
@@ -3,11 +3,8 @@
 # Copyright (c) 2024-2025 Cyril Hrubis <chrubis@suse.cz>
 #
 # This is a loader for shell tests that use the C test library.
-#
 
 if [ -z "$LTP_IPC_PATH" ]; then
-	tst_run_shell $(basename "$0") "$@"
+	tst_run_shell tst_exec.sh $(basename "$0") "$@"
 	exit $?
-else
-	. tst_env.sh
 fi
diff --git a/testcases/lib/tst_run_shell.c b/testcases/lib/tst_run_shell.c
index 7a446e0040..96e9bee4f5 100644
--- a/testcases/lib/tst_run_shell.c
+++ b/testcases/lib/tst_run_shell.c
@@ -9,30 +9,35 @@
 #include "tst_safe_stdio.h"
 #include "ujson.h"
 
+static char *shell_loader;
+
+/* shell test filename */
 static char *shell_filename;
 
 static void run_shell(void)
 {
-	tst_run_script(shell_filename, NULL);
+	char *const params[] = {shell_filename, NULL};
+	tst_run_script(shell_loader, params);
 }
 
 static void run_shell_tcnt(unsigned int n)
 {
 	char buf[128];
-	char *const params[] = {buf, NULL};
+	char *const params[] = {shell_filename, buf, NULL};
 
 	snprintf(buf, sizeof(buf), "%u", n);
 
-	tst_run_script(shell_filename, params);
+	tst_run_script(shell_loader, params);
 }
 
 static struct tst_test test = {
 	.runs_script = 1,
+	.pos_args = 1,
 };
 
 static void print_help(void)
 {
-	printf("Usage: tst_shell_loader ltp_shell_test.sh ...\n");
+	printf("Usage: tst_run_shell tst_exec.sh ltp_shell_test.sh ...\n");
 }
 
 static char *metadata;
@@ -589,7 +594,8 @@ int main(int argc, char *argv[])
 	if (argc < 2)
 		goto help;
 
-	shell_filename = argv[1];
+	shell_loader = argv[1];
+	shell_filename = argv[2];
 
 	prepare_test_struct();
 
-- 
2.47.2



More information about the ltp mailing list