[LTP] [PATCH v4 1/3] lib: adding .supported_archs field in tst_test structure
Li Wang
liwang@redhat.com
Tue Nov 9 14:09:08 CET 2021
Testcases for specific arch should be limited on that only being supported
platform to run, we now involve a .supported_archs to achieve this feature
in LTP library. All you need to run a test on the expected arch is to set
the '.supported_archs' array in the 'struct tst_test' to choose the required
arch list. e.g.
.supported_archs = (const char *const []){"x86_64", "ppc64", NULL}
This helps move the TCONF info from code to tst_test metadata as well.
And, we also export a struct tst_arch to save the system architecture
for using in the whole test cases.
extern const struct tst_arch {
char name[16];
enum tst_arch_type type;
} tst_arch;
Signed-off-by: Li Wang <liwang@redhat.com>
---
doc/c-test-api.txt | 36 ++++++++++++++++++
include/tst_arch.h | 39 +++++++++++++++++++
include/tst_test.h | 7 ++++
lib/tst_arch.c | 94 ++++++++++++++++++++++++++++++++++++++++++++++
lib/tst_test.c | 3 ++
5 files changed, 179 insertions(+)
create mode 100644 include/tst_arch.h
create mode 100644 lib/tst_arch.c
diff --git a/doc/c-test-api.txt b/doc/c-test-api.txt
index 3127018a4..64d0630ce 100644
--- a/doc/c-test-api.txt
+++ b/doc/c-test-api.txt
@@ -2261,6 +2261,42 @@ struct tst_test test = {
};
-------------------------------------------------------------------------------
+1.39 Testing on the specific architecture
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Testcases for specific arch should be limited on that only being supported
+platform to run, we now involve a .supported_archs to achieve this feature
+in LTP library. All you need to run a test on the expected arch is to set
+the '.supported_archs' array in the 'struct tst_test' to choose the required
+arch list. e.g.
+
+ .supported_archs = (const char *const []){"x86_64", "ppc64", NULL}
+
+This helps move the TCONF info from code to tst_test metadata as well.
+
+And, we also export a struct tst_arch to save the system architecture for
+using in the whole test cases.
+
+ extern const struct tst_arch {
+ char name[16];
+ enum tst_arch_type type;
+ } tst_arch;
+
+[source,c]
+-------------------------------------------------------------------------------
+#include "tst_test.h"
+
+static struct tst_test test = {
+ ...
+ .setup = setup,
+ .supported_archs = (const char *const []) {
+ "x86_64",
+ "ppc64",
+ "s390x",
+ NULL
+ },
+};
+-------------------------------------------------------------------------------
+
2. Common problems
------------------
diff --git a/include/tst_arch.h b/include/tst_arch.h
new file mode 100644
index 000000000..e6d0a63d6
--- /dev/null
+++ b/include/tst_arch.h
@@ -0,0 +1,39 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later
+ * Copyright (c) 2021 Li Wang <liwang@redhat.com>
+ */
+
+#ifndef TST_ARCH_H__
+#define TST_ARCH_H__
+
+enum tst_arch_type {
+ TST_UNKNOWN,
+ TST_I386,
+ TST_X86_64,
+ TST_IA64,
+ TST_PPC,
+ TST_PPC64,
+ TST_S390,
+ TST_S390X,
+ TST_ARM,
+ TST_AARCH64,
+ TST_SPARC,
+};
+
+/*
+ * This tst_arch is to save the system architecture for
+ * using in the whole testcase.
+ */
+extern const struct tst_arch {
+ char name[16];
+ enum tst_arch_type type;
+} tst_arch;
+
+/*
+ * Check if test platform is in the given arch list. If yes return 1,
+ * otherwise return 0.
+ *
+ * @archlist A NULL terminated array of architectures to support.
+ */
+int tst_is_on_arch(const char *const *archlist);
+
+#endif /* TST_ARCH_H__ */
diff --git a/include/tst_test.h b/include/tst_test.h
index 3dcb45de0..e3ca3f528 100644
--- a/include/tst_test.h
+++ b/include/tst_test.h
@@ -43,6 +43,7 @@
#include "tst_fips.h"
#include "tst_taint.h"
#include "tst_memutils.h"
+#include "tst_arch.h"
/*
* Reports testcase result.
@@ -139,6 +140,12 @@ struct tst_test {
const char *min_kver;
+ /*
+ * The supported_archs is a NULL terminated list of archs the test
+ * does support.
+ */
+ const char *const *supported_archs;
+
/* If set the test is compiled out */
const char *tconf_msg;
diff --git a/lib/tst_arch.c b/lib/tst_arch.c
new file mode 100644
index 000000000..67a955789
--- /dev/null
+++ b/lib/tst_arch.c
@@ -0,0 +1,94 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later
+ * Copyright (c) 2021 Li Wang <liwang@redhat.com>
+ */
+
+#include <string.h>
+#include <stdlib.h>
+
+#define TST_NO_DEFAULT_MAIN
+#include "tst_arch.h"
+#include "tst_test.h"
+
+const struct tst_arch tst_arch = {
+#if defined(__x86_64__)
+ .name = "x86_64",
+ .type = TST_X86_64,
+#elif defined(__i386__)
+ .name = "i386",
+ .type = TST_I386,
+#elif defined(__ia64__)
+ .name = "ia64",
+ .type = TST_IA64,
+#elif defined(__powerpc64__) || defined(__ppc64__)
+ .name = "ppc64",
+ .type = TST_PPC64,
+#elif defined(__powerpc__) || defined(__ppc__)
+ .name = "ppc",
+ .type = TST_PPC,
+#elif defined(__s390x__)
+ .name = "s390x",
+ .type = TST_S390X,
+#elif defined(__s390__)
+ .name = "s390",
+ .type = TST_S390,
+#elif defined(__aarch64__)
+ .name = "aarch64",
+ .type = TST_AARCH64,
+#elif defined(__arm__)
+ .name = "arm",
+ .type = TST_ARM,
+#elif defined(__sparc__)
+ .name = "sparc",
+ .type = TST_SPARC,
+#else
+ .name = "unknown",
+ .type = TST_UNKNOWN,
+#endif
+};
+
+static const char *const arch_type_list[] = {
+ "i386",
+ "x86_64",
+ "ia64",
+ "ppc",
+ "ppc64",
+ "s390",
+ "s390x",
+ "arm",
+ "aarch64",
+ "sparc",
+ NULL
+};
+
+static int is_valid_arch_name(const char *name)
+{
+ unsigned int i;
+
+ for (i = 0; arch_type_list[i]; i++) {
+ if (!strcmp(arch_type_list[i], name))
+ return 1;
+ }
+
+ return 0;
+}
+
+int tst_is_on_arch(const char *const *archlist)
+{
+ unsigned int i;
+
+ if (!archlist)
+ return 1;
+
+ for (i = 0; archlist[i]; i++) {
+ if (!is_valid_arch_name(archlist[i]))
+ tst_brk(TBROK, "%s is invalid arch, please reset!",
+ archlist[i]);
+ }
+
+ for (i = 0; archlist[i]; i++) {
+ if (!strcmp(tst_arch.name, archlist[i]))
+ return 1;
+ }
+
+ return 0;
+}
diff --git a/lib/tst_test.c b/lib/tst_test.c
index 02ae28335..73b19d3ec 100644
--- a/lib/tst_test.c
+++ b/lib/tst_test.c
@@ -975,6 +975,9 @@ static void do_setup(int argc, char *argv[])
if (tst_test->min_kver)
check_kver();
+ if (tst_test->supported_archs && !tst_is_on_arch(tst_test->supported_archs))
+ tst_brk(TCONF, "This arch '%s' is not supported for test!", tst_arch.name);
+
if (tst_test->skip_in_lockdown && tst_lockdown_enabled())
tst_brk(TCONF, "Kernel is locked down, skipping test");
--
2.31.1
More information about the ltp
mailing list