[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