[LTP] [PATCH v3 00/10] shell: nfs: $TST_ALL_FILESYSTEMS (.all_filesystems)

Petr Vorel pvorel@suse.cz
Thu Aug 4 14:19:36 CEST 2022


Hi,

changes v2->v3:
* add $TST_SKIP_FILESYSTEMS implementation
* various fixes for tst_test.sh + tests
  - tst_test.sh: Fix tst_mkfs() for tmpfs

Diff to v2:

diff --git doc/shell-test-api.txt doc/shell-test-api.txt
index 93073be13..ecadb8e32 100644
--- doc/shell-test-api.txt
+++ doc/shell-test-api.txt
@@ -200,6 +200,8 @@ simply by setting right '$TST_FOO'.
 |=============================================================================
 | Variable name            | Action done
 | 'TST_ALL_FILESYSTEMS'    | Testing on all available filesystems (tst_test.all_filesystems equivalent).
+                             When 'TST_SKIP_FILESYSTEMS' any listed filesystem is not
+                             included in the resulting list of supported filesystems.
 | 'TST_DEV_EXTRA_OPTS'     | Pass extra 'mkfs' options _after_ device name,
                              to 'tst_mkfs', use with 'TST_FORMAT_DEVICE=1'.
 | 'TST_DEV_FS_OPTS'        | Pass 'mkfs' options _before_ the device name,
@@ -230,6 +232,8 @@ simply by setting right '$TST_FOO'.
 | 'TST_NEEDS_KCONFIGS'     | Checks kernel kconfigs support for the test (see below).
 | 'TST_NEEDS_KCONFIGS_IFS' | Used for splitting '$TST_NEEDS_KCONFIGS' variable,
                              default value is comma, it only supports single character.
+| 'TST_SKIP_FILESYSTEMS'   | Comma separated list of filesystems on which test will be skipped
+                             (tst_test.skip_filesystems equivalent).
 | 'TST_TIMEOUT'            | Maximum timeout set for the test in sec. Must be int >= 1,
                              or -1 (special value to disable timeout), default is 300.
                              Variable is meant be set in tests, not by user.
diff --git include/tst_fs.h include/tst_fs.h
index 8159b99eb..2fe97f174 100644
--- include/tst_fs.h
+++ include/tst_fs.h
@@ -182,6 +182,16 @@ enum tst_fs_impl {
  */
 enum tst_fs_impl tst_fs_is_supported(const char *fs_type);
 
+/*
+ * Check filesystem support (@see tst_fs_is_supported()), but consider also
+ * filesystems to skip.
+ *
+ * @fs_type A filesystem name to check the support for.
+ * @skiplist A NULL terminated array of filesystems to skip.
+ */
+enum tst_fs_impl tst_fs_is_supported_skiplist(const char *fs_type, const char
+					      *const *skiplist);
+
 /*
  * Returns NULL-terminated array of kernel-supported filesystems.
  *
diff --git lib/newlib_tests/shell/tst_mount_device.sh lib/newlib_tests/shell/tst_mount_device.sh
index c8f185626..561f878d2 100755
--- lib/newlib_tests/shell/tst_mount_device.sh
+++ lib/newlib_tests/shell/tst_mount_device.sh
@@ -5,7 +5,7 @@
 TST_MOUNT_DEVICE=1
 TST_FS_TYPE=ext4
 TST_TESTFUNC=test
-TST_CNT=2
+TST_CNT=3
 
 test1()
 {
@@ -17,5 +17,10 @@ test2()
 	EXPECT_PASS "grep '$TST_MNTPOINT $TST_FS_TYPE' /proc/mounts"
 }
 
+test3()
+{
+	tst_brk TCONF "quit early to test early tst_umount"
+}
+
 . tst_test.sh
 tst_run
diff --git lib/newlib_tests/shell/tst_mount_device_tmpfs.sh lib/newlib_tests/shell/tst_mount_device_tmpfs.sh
new file mode 100755
index 000000000..36a78bc85
--- /dev/null
+++ lib/newlib_tests/shell/tst_mount_device_tmpfs.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+# SPDX-License-Identifier: GPL-2.0-or-later
+# Copyright (c) 2022 Petr Vorel <pvorel@suse.cz>
+
+TST_MOUNT_DEVICE=1
+TST_FS_TYPE=tmpfs
+TST_TESTFUNC=test
+
+test()
+{
+	EXPECT_PASS "cd $TST_MNTPOINT"
+}
+
+. tst_test.sh
+tst_run
diff --git lib/newlib_tests/shell/tst_skip_filesystems.sh lib/newlib_tests/shell/tst_skip_filesystems.sh
new file mode 100755
index 000000000..dd57d6b42
--- /dev/null
+++ lib/newlib_tests/shell/tst_skip_filesystems.sh
@@ -0,0 +1,34 @@
+#!/bin/sh
+# SPDX-License-Identifier: GPL-2.0-or-later
+# Copyright (c) 2022 Petr Vorel <pvorel@suse.cz>
+
+TST_MOUNT_DEVICE=1
+TST_FS_TYPE=ext4
+TST_TESTFUNC=test
+TST_SKIP_FILESYSTEMS="btrfs,ext2,ext3,xfs,vfat,exfat,ntfs,tmpfs"
+TST_CNT=3
+
+test1()
+{
+	EXPECT_PASS "cd $TST_MNTPOINT"
+}
+
+test2()
+{
+	EXPECT_PASS "grep '$TST_MNTPOINT $TST_FS_TYPE' /proc/mounts"
+}
+
+test3()
+{
+	local fs fs_skip
+
+	fs=$(grep "$TST_MNTPOINT $TST_FS_TYPE" /proc/mounts | cut -d ' ' -f3)
+	EXPECT_PASS "[ '$fs' = '$TST_FS_TYPE' ]"
+
+	for fs_skip in $TST_SKIP_FILESYSTEMS; do
+		EXPECT_FAIL "[ $fs = $fs_skip ]"
+	done
+}
+
+. tst_test.sh
+tst_run
diff --git lib/newlib_tests/shell/tst_skip_filesystems_skip.sh lib/newlib_tests/shell/tst_skip_filesystems_skip.sh
new file mode 100755
index 000000000..0d291a0a0
--- /dev/null
+++ lib/newlib_tests/shell/tst_skip_filesystems_skip.sh
@@ -0,0 +1,16 @@
+#!/bin/sh
+# SPDX-License-Identifier: GPL-2.0-or-later
+# Copyright (c) 2022 Petr Vorel <pvorel@suse.cz>
+
+TST_MOUNT_DEVICE=1
+TST_FS_TYPE=ext4
+TST_TESTFUNC=test
+TST_SKIP_FILESYSTEMS="ext4"
+
+test()
+{
+	tst_res TFAIL "test should be skipped with TCONF"
+}
+
+. tst_test.sh
+tst_run
diff --git lib/tst_supported_fs_types.c lib/tst_supported_fs_types.c
index 9726d193a..8c9379c1b 100644
--- lib/tst_supported_fs_types.c
+++ lib/tst_supported_fs_types.c
@@ -134,6 +134,24 @@ enum tst_fs_impl tst_fs_is_supported(const char *fs_type)
 	return TST_FS_UNSUPPORTED;
 }
 
+enum tst_fs_impl tst_fs_is_supported_skiplist(const char *fs_type, const char
+					      *const *skiplist)
+{
+	int ret;
+
+	ret = tst_fs_is_supported(fs_type);
+
+	if (!ret)
+		return ret;
+
+	if (tst_fs_in_skiplist(fs_type, skiplist)) {
+		tst_brk(TCONF, "%s is not supported by the test",
+			fs_type);
+	}
+
+	return ret;
+}
+
 const char **tst_get_supported_fs_types(const char *const *skiplist)
 {
 	unsigned int i, j = 0;
diff --git testcases/lib/tst_supported_fs.c testcases/lib/tst_supported_fs.c
index 43eac194f..75945c809 100644
--- testcases/lib/tst_supported_fs.c
+++ testcases/lib/tst_supported_fs.c
@@ -5,42 +5,74 @@
  */
 
 #include <stdio.h>
+#include <stdlib.h>
 #include <string.h>
 
+#define SKIP_DELIMITER ','
+
 #define TST_NO_DEFAULT_MAIN
 #include "tst_test.h"
 #include "tst_fs.h"
 
 static void usage(void)
 {
-	fprintf(stderr, "Usage: tst_supported_fs [fs_type]\n");
+	fprintf(stderr, "Usage: tst_supported_fs [-s skip_list] [fs_type]\n");
 	fprintf(stderr, "   If fs_type is supported, return 0\n");
 	fprintf(stderr, "   If fs_type isn't supported, return 1\n");
 	fprintf(stderr, "   If fs_type isn't specified, print the list of supported filesystems\n");
 	fprintf(stderr, "   fs_type - a specified filesystem type\n");
+	fprintf(stderr, "   skip_list - filesystems to skip, delimiter: '%c'\n",
+			SKIP_DELIMITER);
 }
 
 int main(int argc, char *argv[])
 {
-	const char *skiplist[] = {"tmpfs", NULL};
 	const char *const *filesystems;
-	int i;
+	int i, ret, cnt = 1;
+	char **skiplist = NULL;
+	char *fs;
 
-	if (argc > 2) {
-		fprintf(stderr, "Can't specify multiple fs_type\n");
-		usage();
-		return 2;
+	while ((ret = getopt(argc, argv, "hs:"))) {
+		if (ret < 0)
+			break;
+
+		switch (ret) {
+		case '?':
+			return 1;
+
+		case 'h':
+			usage();
+			return 0;
+
+		case 's':
+			fs = optarg;
+			for (i = 0; fs[i]; i++) {
+				if (optarg[i] == SKIP_DELIMITER)
+					cnt++;
+			}
+			skiplist = malloc(++cnt * sizeof(char *));
+			if (!skiplist) {
+				fprintf(stderr, "malloc() failed\n");
+				return 1;
+			}
+
+			fs = optarg;
+			for (i = 0; i < cnt; i++)
+				skiplist[i] = strtok_r(fs, TST_TO_STR(SKIP_DELIMITER), &fs);
+			break;
+		}
 	}
 
-	if (argv[1] && !strcmp(argv[1], "-h")) {
+	if (argc - optind > 1) {
+		fprintf(stderr, "Can't specify multiple fs_type\n");
 		usage();
-		return 0;
+		return 2;
 	}
 
-	if (argv[1])
-		return !tst_fs_is_supported(argv[1]);
+	if (optind < argc)
+		return !tst_fs_is_supported_skiplist(argv[optind], (const char * const*)skiplist);
 
-	filesystems = tst_get_supported_fs_types(skiplist);
+	filesystems = tst_get_supported_fs_types((const char * const*)skiplist);
 	for (i = 0; filesystems[i]; i++)
 		printf("%s\n", filesystems[i]);
 
diff --git testcases/lib/tst_test.sh testcases/lib/tst_test.sh
index 54b505e44..b679339a0 100644
--- testcases/lib/tst_test.sh
+++ testcases/lib/tst_test.sh
@@ -28,12 +28,13 @@ fi
 trap "tst_brk TBROK 'test interrupted'" INT
 trap "unset _tst_setup_timer_pid; tst_brk TBROK 'test terminated'" TERM
 
-# FIXME: debug called more times => check things moved out of it
 _tst_do_exit()
 {
 	local ret=0
 	TST_DO_EXIT=1
 
+	[ "$TST_MOUNT_FLAG" = 1 ] && tst_umount
+
 	if [ "$TST_NEEDS_DEVICE" = 1 -a "$TST_DEVICE_FLAG" = 1 ]; then
 		if ! tst_device release "$TST_DEVICE"; then
 			tst_res TWARN "Failed to release device '$TST_DEVICE'"
@@ -50,6 +51,8 @@ _tst_do_exit()
 		rm $LTP_IPC_PATH
 	fi
 
+	_tst_cleanup_timer
+
 	if [ $TST_FAIL -gt 0 ]; then
 		ret=$((ret|1))
 	fi
@@ -338,6 +341,11 @@ tst_mkfs()
 
 	opts="$@"
 
+	if [ "$fs_type" = tmpfs ]; then
+		tst_res TINFO "Skipping mkfs for TMPFS filesystem"
+		return
+	fi
+
 	if [ -z "$opts" ]; then
 		if [ "$TST_NEEDS_DEVICE" != 1 ]; then
 			tst_brk "Using default parameters in tst_mkfs requires TST_NEEDS_DEVICE=1"
@@ -461,6 +469,7 @@ LTPROOT              Prefix for installed LTP (default: /opt/ltp)
 LTP_COLORIZE_OUTPUT  Force colorized output behaviour (y/1 always, n/0: never)
 LTP_DEV              Path to the block device to be used (for .needs_device)
 LTP_DEV_FS_TYPE      Filesystem used for testing (default: ext2)
+LTP_SINGLE_FS_TYPE   Testing only - specifies filesystem instead all supported (for TST_ALL_FILESYSTEMS=1)
 LTP_TIMEOUT_MUL      Timeout multiplier (must be a number >=1, ceiled to int)
 TMPDIR               Base directory for template directory (for .needs_tmpdir, default: /tmp)
 EOF
@@ -616,10 +625,9 @@ _prepare_device()
 
 _tst_run_tcases_per_fs()
 {
-	for _tst_fs in $(tst_supported_fs); do
-		tst_res TINFO "Testing on $_tst_fs"
+	for _tst_fs in $(tst_supported_fs -s "$TST_SKIP_FILESYSTEMS"); do
+		tst_res TINFO "=== Testing on $_tst_fs ==="
 		TST_FS_TYPE="$_tst_fs"
-		_prepare_device
 		_tst_run_iterations
 	done
 }
@@ -631,9 +639,11 @@ tst_run()
 	local _tst_fs
 	local _tst_max
 	local _tst_name
+	local _tst_pattern='[='\''"} \t\/:`$\;].*'
+	local ret
 
 	if [ -n "$TST_TEST_PATH" ]; then
-		for _tst_i in $(grep '^[^#]*\bTST_' "$TST_TEST_PATH" | sed 's/.*TST_//; s/[='\''"} \t\/:`].*//'); do
+		for _tst_i in $(grep '^[^#]*\bTST_' "$TST_TEST_PATH" | sed "s/.*TST_//; s/$_tst_pattern//"); do
 			case "$_tst_i" in
 			ALL_FILESYSTEMS|DISABLE_APPARMOR|DISABLE_SELINUX);;
 			SETUP|CLEANUP|TESTFUNC|ID|CNT|MIN_KVER);;
@@ -649,11 +659,12 @@ tst_run()
 			CHECKPOINT_WAIT|CHECKPOINT_WAKE);;
 			CHECKPOINT_WAKE2|CHECKPOINT_WAKE_AND_WAIT);;
 			DEV_EXTRA_OPTS|DEV_FS_OPTS|FORMAT_DEVICE|MOUNT_DEVICE);;
+			SKIP_FILESYSTEMS);;
 			*) tst_res TWARN "Reserved variable TST_$_tst_i used!";;
 			esac
 		done
 
-		for _tst_i in $(grep '^[^#]*\b_tst_' "$TST_TEST_PATH" | sed 's/.*_tst_//; s/[="} \t\/:`].*//'); do
+		for _tst_i in $(grep '^[^#]*\b_tst_' "$TST_TEST_PATH" | sed "s/.*_tst_//; s/$_tst_pattern//"); do
 			tst_res TWARN "Private variable or function _tst_$_tst_i used!"
 		done
 	fi
@@ -687,6 +698,12 @@ tst_run()
 	[ "$TST_FORMAT_DEVICE" = 1 ] && TST_NEEDS_DEVICE=1
 	[ "$TST_NEEDS_DEVICE" = 1 ] && TST_NEEDS_TMPDIR=1
 
+	if [ "$TST_ALL_FILESYSTEMS" != 1 ]; then
+		tst_supported_fs -s "$TST_SKIP_FILESYSTEMS" $TST_FS_TYPE
+		ret=$?
+		[ $ret -ne 0 ] && return $ret
+	fi
+
 	if [ "$TST_NEEDS_DEVICE" = 1 ]; then
 		TST_DEVICE=$(tst_device acquire)
 
@@ -713,9 +730,8 @@ tst_run()
 	[ -n "$TST_NEEDS_CHECKPOINTS" ] && _tst_init_checkpoints
 
 	TST_MNTPOINT="${TST_MNTPOINT:-$PWD/mntpoint}"
-	[ -z "$TST_ALL_FILESYSTEMS" ] && _prepare_device
 
-	if [ -n "$TST_ALL_FILESYSTEMS" ]; then
+	if [ "$TST_ALL_FILESYSTEMS" = 1 ]; then
 		_tst_run_tcases_per_fs
 	else
 		_tst_run_iterations
@@ -727,9 +743,12 @@ tst_run()
 _tst_run_iterations()
 {
 	local _tst_i=$TST_ITERATIONS
+	local _tst_j
 
 	[ "$TST_NEEDS_TMPDIR" = 1 ] && cd "$TST_TMPDIR"
 
+	_prepare_device
+
 	_tst_setup_timer
 
 	if [ -n "$TST_SETUP" ]; then
@@ -746,8 +765,8 @@ _tst_run_iterations()
 		if [ -n "$TST_TEST_DATA" ]; then
 			tst_require_cmds cut tr wc
 			_tst_max=$(( $(echo $TST_TEST_DATA | tr -cd "$TST_TEST_DATA_IFS" | wc -c) +1))
-			for _tst_i in $(seq $_tst_max); do
-				_tst_data="$(echo "$TST_TEST_DATA" | cut -d"$TST_TEST_DATA_IFS" -f$_tst_i)"
+			for _tst_j in $(seq $_tst_max); do
+				_tst_data="$(echo "$TST_TEST_DATA" | cut -d"$TST_TEST_DATA_IFS" -f$_tst_j)"
 				_tst_run_tests "$_tst_data"
 			done
 		else
@@ -766,9 +785,8 @@ _tst_run_iterations()
 
 	if [ "$TST_MOUNT_FLAG" = 1 ]; then
 		tst_umount
+		TST_MOUNT_FLAG=
 	fi
-
-	_tst_cleanup_timer
 }
 
 _tst_run_tests()
diff --git testcases/misc/lvm/generate_lvm_runfile.sh testcases/misc/lvm/generate_lvm_runfile.sh
index 72b286a69..843dd6bb8 100755
--- testcases/misc/lvm/generate_lvm_runfile.sh
+++ testcases/misc/lvm/generate_lvm_runfile.sh
@@ -16,7 +16,7 @@ generate_runfile()
 	trap 'tst_brk TBROK "Cannot create LVM runfile"' ERR
 	INFILE="$LTPROOT/testcases/data/lvm/runfile.tpl"
 	OUTFILE="$LTPROOT/runtest/lvm.local"
-	FS_LIST=`tst_supported_fs`
+	FS_LIST=$(tst_supported_fs -s tmpfs)
 	echo -n "" >"$OUTFILE"
 
 	for fsname in $FS_LIST; do
diff --git testcases/misc/lvm/prepare_lvm.sh testcases/misc/lvm/prepare_lvm.sh
index d3ae4b23f..29f386df8 100755
--- testcases/misc/lvm/prepare_lvm.sh
+++ testcases/misc/lvm/prepare_lvm.sh
@@ -70,7 +70,7 @@ prepare_mounts()
 
 prepare_lvm()
 {
-	FS_LIST=`tst_supported_fs | sort -u`
+	FS_LIST=$(tst_supported_fs -s tmpfs | sort -u)
 	ROD mkdir -p "$LVM_TMPDIR"
 	ROD mkdir -p "$LVM_IMGDIR"
 	chmod 777 "$LVM_TMPDIR"
diff --git testcases/network/nfs/nfs_stress/nfs_lib.sh testcases/network/nfs/nfs_stress/nfs_lib.sh
index a6557177b..b9872bb31 100644
--- testcases/network/nfs/nfs_stress/nfs_lib.sh
+++ testcases/network/nfs/nfs_stress/nfs_lib.sh
@@ -8,6 +8,7 @@ VERSION=${VERSION:=3}
 NFILES=${NFILES:=1000}
 SOCKET_TYPE="${SOCKET_TYPE:-udp}"
 NFS_TYPE=${NFS_TYPE:=nfs}
+TST_SKIP_FILESYSTEMS="ntfs,vfat"
 
 nfs_usage()
 {
@@ -205,7 +206,9 @@ nfs_cleanup()
 		n=$(( n + 1 ))
 	done
 
-	systemctl restart nfs-server
+	restart_daemon nfs-server
+	tst_sleep 500ms
 }
 
+. daemonlib.sh
 . tst_net.sh

Petr Vorel (10):
  tst_test.sh: Fix tst_mkfs() for tmpfs
  tst_device: Add clear command
  tst_test.sh: Allow $ ; after whitelisted variable
  tst_mount_device.sh: Cover early tst_umount call
  tst_supported_fs: Implement skip list
  tst_supported_fs: Support skip list when query single fs
  shell: Add $TST_SKIP_FILESYSTEMS + tests
  tst_test.sh: Add $TST_ALL_FILESYSTEMS
  shell: Add test for TST_ALL_FILESYSTEMS=1
  nfs: Use TST_ALL_FILESYSTEMS=1

 doc/shell-test-api.txt                        |   5 +
 include/tst_fs.h                              |  10 ++
 lib/newlib_tests/shell/tst_all_filesystems.sh |  27 ++++
 lib/newlib_tests/shell/tst_mount_device.sh    |   7 +-
 .../shell/tst_mount_device_tmpfs.sh           |  15 +++
 .../shell/tst_skip_filesystems.sh             |  34 +++++
 .../shell/tst_skip_filesystems_skip.sh        |  16 +++
 lib/tst_supported_fs_types.c                  |  18 +++
 testcases/lib/tst_device.c                    |  20 ++-
 testcases/lib/tst_supported_fs.c              |  56 ++++++--
 testcases/lib/tst_test.sh                     | 126 ++++++++++++------
 testcases/misc/lvm/generate_lvm_runfile.sh    |   2 +-
 testcases/misc/lvm/prepare_lvm.sh             |   2 +-
 testcases/network/nfs/nfs_stress/nfs_lib.sh   |  28 ++--
 14 files changed, 299 insertions(+), 67 deletions(-)
 create mode 100755 lib/newlib_tests/shell/tst_all_filesystems.sh
 create mode 100755 lib/newlib_tests/shell/tst_mount_device_tmpfs.sh
 create mode 100755 lib/newlib_tests/shell/tst_skip_filesystems.sh
 create mode 100755 lib/newlib_tests/shell/tst_skip_filesystems_skip.sh

-- 
2.37.1



More information about the ltp mailing list