[PATCH v2] metadata: automatically detect groups via tags
Andrea Cervesato <[email protected]>
| Newsgroups | gmane.linux.ltp |
|---|---|
| Message-ID | <[email protected]> |
From: Andrea Cervesato <andrea.cervesato-IBi9RG/[email protected]> Automatically assign a 'cve' group to test metadata when we are tagging it with a CVE number and assign a 'regression' group to test metadata when we are tagging it with a linux git commit. Signed-off-by: Andrea Cervesato <andrea.cervesato-IBi9RG/[email protected]> --- Changes in v2: - add linux-git to tags - Link to v1: https://lore.kernel.org/r/20260622-metadata_cve-v1-1-c8d43e0db19e-IBi9RG/[email protected] --- metadata/metaparse.c | 46 +++++++++++++++++++++++++++++++++++----- metadata/tests/cve.c | 12 +++++++++++ metadata/tests/cve.c.json | 15 +++++++++++++ metadata/tests/regression.c | 12 +++++++++++ metadata/tests/regression.c.json | 15 +++++++++++++ 5 files changed, 95 insertions(+), 5 deletions(-) diff --git a/metadata/metaparse.c b/metadata/metaparse.c index a0f94511db36e42e6174774dfa8340cb4dce113a..cb141c383142142491f802e51afd29bc014f0e6e 100644 --- a/metadata/metaparse.c +++ b/metadata/metaparse.c @@ -52,12 +52,14 @@ static char *eat_asterisk_space(char *c) } /* - * Add a group to the groups array, skipping 'kernel' as it's too generic. - * Returns 0 if no group was added, 1 otherwise. + * Add a group to the groups array, skipping path components that are too + * generic ('kernel') or assigned from a more reliable source ('cve', which + * is derived from the CVE tag instead). Returns 0 if no group was added, + * 1 otherwise. */ static int add_group(struct data_node *groups, const char *name) { - if (name && strcmp(name, "kernel")) { + if (name && strcmp(name, "kernel") && strcmp(name, "cve")) { data_node_array_add(groups, data_node_string(name)); return 1; } @@ -971,11 +973,11 @@ static void load_internal_macros(void) * 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: + * first), skipping 'kernel' (too generic) and 'cve' (assigned from the + * CVE tag instead, see add_tag_groups()): * * 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) { @@ -1010,6 +1012,38 @@ static void add_path_groups(struct data_node *groups, const char *fname) free(buf); } +/* + * Add group to specific test tags. + */ +static void add_tag_groups(struct data_node *groups, struct data_node *res) +{ + struct data_node *tags = data_node_hash_get(res, "tags"); + int has_cve = 0, has_regression = 0; + + if (!tags || tags->type != DATA_ARRAY) + return; + + for (unsigned int i = 0; i < data_node_array_len(tags); i++) { + struct data_node *tag = tags->array.array[i]; + struct data_node *name; + + if (tag->type != DATA_ARRAY || !data_node_array_len(tag)) + continue; + + name = tag->array.array[0]; + if (name->type != DATA_STRING) + continue; + + if (!has_cve && !strcmp(name->string.val, "CVE")) { + data_node_array_add(groups, data_node_string("cve")); + has_cve = 1; + } else if (!has_regression && !strcmp(name->string.val, "linux-git")) { + data_node_array_add(groups, data_node_string("regression")); + has_regression = 1; + } + } +} + static struct data_node *parse_file(const char *fname) { int state = 0, found = 0; @@ -1064,6 +1098,8 @@ static struct data_node *parse_file(const char *fname) data_node_free(doc); } + add_tag_groups(groups, res); + /* * Always emit groups, even when empty: tests outside testcases/ * and files whose only parent dir is 'kernel' produce no groups. diff --git a/metadata/tests/cve.c b/metadata/tests/cve.c new file mode 100644 index 0000000000000000000000000000000000000000..c2b0e551f111ae87f3c6dcb50ef25c66967443f4 --- /dev/null +++ b/metadata/tests/cve.c @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +/*\ + * Test for cve group derived from the CVE tag. + */ + +static struct tst_test test = { + .tags = (const struct tst_tag[]) { + {"CVE", "2017-16939"}, + {} + } +}; diff --git a/metadata/tests/cve.c.json b/metadata/tests/cve.c.json new file mode 100644 index 0000000000000000000000000000000000000000..543d9e58a3e78d296cc4247659d1b26f2a103245 --- /dev/null +++ b/metadata/tests/cve.c.json @@ -0,0 +1,15 @@ + "cve": { + "tags": [ + [ + "CVE", + "2017-16939" + ] + ], + "doc": [ + "Test for cve group derived from the CVE tag." + ], + "groups": [ + "cve" + ], + "fname": "cve.c" + } \ No newline at end of file diff --git a/metadata/tests/regression.c b/metadata/tests/regression.c new file mode 100644 index 0000000000000000000000000000000000000000..e02683dedce13b7579ec874c64476f09f34707de --- /dev/null +++ b/metadata/tests/regression.c @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +/*\ + * Test for regression group derived from the linux-git tag. + */ + +static struct tst_test test = { + .tags = (const struct tst_tag[]) { + {"linux-git", "1137b5e2529a"}, + {} + } +}; diff --git a/metadata/tests/regression.c.json b/metadata/tests/regression.c.json new file mode 100644 index 0000000000000000000000000000000000000000..21f818888301cd982ca9e52861f7ea0fc2e570be --- /dev/null +++ b/metadata/tests/regression.c.json @@ -0,0 +1,15 @@ + "regression": { + "tags": [ + [ + "linux-git", + "1137b5e2529a" + ] + ], + "doc": [ + "Test for regression group derived from the linux-git tag." + ], + "groups": [ + "regression" + ], + "fname": "regression.c" + } \ No newline at end of file --- base-commit: b2184c0f2debb976414b294b8527298bdac0a877 change-id: 20260622-metadata_cve-25cf42b4f38d Best regards, -- Andrea Cervesato <andrea.cervesato-IBi9RG/[email protected]> -- Mailing list info: https://lists.linux.it/listinfo/ltp