[LTP] [PATCH 1/2] metadata: add tests grouping support
Andrea Cervesato
andrea.cervesato@suse.de
Fri Jun 12 15:54:14 CEST 2026
From: Andrea Cervesato <andrea.cervesato@suse.com>
Add groups field to metaparse JSON output, so we can filter out tests
in kirk. Groups are derived from:
1. Source file path - the two nearest parent directories (immediate
parent first), skipping 'kernel' as too generic. For example:
- testcases/kernel/syscalls/clone/clone01.c -> clone, syscalls
- testcases/kernel/kvm/kvm_pagefault01.c -> kvm
- testcases/cve/cve-2017-16939.c -> cve
2. @group tags in the doc comment block, e.g.:
/* * Test description.
*
* @group stress
*/
Add test case for @group tag parsing.
Signed-off-by: Andrea Cervesato <andrea.cervesato@suse.com>
---
metadata/metaparse.c | 88 ++++++++++++++++++++++++++++++++++++++++++++
metadata/tests/groups.c | 11 ++++++
metadata/tests/groups.c.json | 13 +++++++
3 files changed, 112 insertions(+)
diff --git a/metadata/metaparse.c b/metadata/metaparse.c
index 561cbb9d2d54689988c9aa49d591628696bcf847..6bc4b7af60c7449d4b60a1252fa58fed77e03066 100644
--- a/metadata/metaparse.c
+++ b/metadata/metaparse.c
@@ -1168,6 +1168,92 @@ static void print_help(const char *prgname)
exit(0);
}
+/*
+ * Add groups derived from the source file path.
+ *
+ * Groups are the two nearest parent directories (immediate parent
+ * first), skipping 'kernel' as it's too generic:
+ *
+ * testcases/kernel/syscalls/clone/clone01.c -> clone, syscalls
+ * testcases/kernel/kvm/kvm_pagefault01.c -> kvm
+ * testcases/cve/cve-2017-16939.c -> cve
+ */
+static void add_path_groups(struct data_node *groups, const char *fname)
+{
+ char buf[256];
+ int offsets[8];
+ int ndirs = 0;
+ int ngroups = 0;
+ char *p;
+
+ if (strncmp(fname, "testcases/", 10))
+ return;
+
+ snprintf(buf, sizeof(buf), "%s", fname + 10);
+
+ p = strtok(buf, "/");
+ while (p && ndirs < 8) {
+ offsets[ndirs++] = p - buf;
+ p = strtok(NULL, "/");
+ }
+
+ /* Last element is the filename, skip it */
+ ndirs--;
+
+ for (int j = ndirs - 1; j >= 0 && ngroups < 2; j--) {
+ if (!strcmp(buf + offsets[j], "kernel"))
+ continue;
+
+ data_node_array_add(groups, data_node_string(buf + offsets[j]));
+ ngroups++;
+ }
+}
+
+/*
+ * Add groups from @group tags in the doc comment block.
+ */
+static void add_doc_groups(struct data_node *groups, struct data_node *doc)
+{
+ if (!doc || doc->type != DATA_ARRAY)
+ return;
+
+ for (unsigned int i = 0; i < data_node_array_len(doc); i++) {
+ struct data_node *line = doc->array.array[i];
+ const char *s;
+
+ if (line->type != DATA_STRING)
+ continue;
+
+ s = line->string.val;
+
+ while (*s && (*s == ' ' || *s == '\t'))
+ s++;
+
+ if (strncmp(s, "@group ", 7))
+ continue;
+
+ s += 7;
+ while (*s && (*s == ' ' || *s == '\t'))
+ s++;
+
+ if (*s)
+ data_node_array_add(groups, data_node_string(s));
+ }
+}
+
+static void build_groups(struct data_node *res, const char *fname)
+{
+ struct data_node *groups = data_node_array();
+
+ add_path_groups(groups, fname);
+ add_doc_groups(groups, data_node_hash_get(res, "doc"));
+
+ if (data_node_array_len(groups))
+ data_node_hash_add(res, "groups", groups);
+ else
+ data_node_free(groups);
+}
+
int main(int argc, char *argv[])
{
unsigned int i, j;
@@ -1238,6 +1324,8 @@ int main(int argc, char *argv[])
}
data_node_hash_add(res, "fname", data_node_string(argv[optind]));
+ build_groups(res, argv[optind]);
+
printf(" \"%s\": ", strip_name(argv[optind]));
data_to_json(res, stdout, 2);
data_node_free(res);
diff --git a/metadata/tests/groups.c b/metadata/tests/groups.c
new file mode 100644
index 0000000000000000000000000000000000000000..82f07111c1506c634f13822ee6aa95f574eb19a5
--- /dev/null
+++ b/metadata/tests/groups.c
@@ -0,0 +1,11 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+/*\
+ * Test for @group tag parsing.
+ *
+ * @group stress
+ * @group regression
+ */
+
+static struct tst_test test = {
+};
diff --git a/metadata/tests/groups.c.json b/metadata/tests/groups.c.json
new file mode 100644
index 0000000000000000000000000000000000000000..4683e6cf07eeebc60faefb9aead9370dc3f631aa
--- /dev/null
+++ b/metadata/tests/groups.c.json
@@ -0,0 +1,13 @@
+ "groups": {
+ "doc": [
+ "Test for @group tag parsing.",
+ "",
+ "@group stress",
+ "@group regression"
+ ],
+ "fname": "groups.c",
+ "groups": [
+ "stress",
+ "regression"
+ ]
+ }
\ No newline at end of file
--
2.51.0
More information about the ltp
mailing list