Linux Test Project
 help / color / mirror / Atom feed
* [LTP] [PATCH 0/2] Add shell test metadata parser
@ 2025-02-12 13:16 Cyril Hrubis
  2025-02-12 13:16 ` [LTP] [PATCH 1/2] metaparse: Add shell test parser Cyril Hrubis
                   ` (3 more replies)
  0 siblings, 4 replies; 9+ messages in thread
From: Cyril Hrubis @ 2025-02-12 13:16 UTC (permalink / raw)
  To: ltp

As promised this adds metadata parser for the shell testcases. In the
end I wrote it in about 100 lines of C because the ekvivalent awk script
would be too complicated.

Cyril Hrubis (2):
  metaparse: Add shell test parser
  metaparse: data_storage: Fix warning

 metadata/.gitignore     |   1 +
 metadata/Makefile       |   4 +-
 metadata/data_storage.h |   2 +-
 metadata/metaparse-sh.c | 127 ++++++++++++++++++++++++++++++++++++++++
 metadata/parse.sh       |  13 ++++
 5 files changed, 144 insertions(+), 3 deletions(-)
 create mode 100644 metadata/metaparse-sh.c

-- 
2.45.3


-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [LTP] [PATCH 1/2] metaparse: Add shell test parser
  2025-02-12 13:16 [LTP] [PATCH 0/2] Add shell test metadata parser Cyril Hrubis
@ 2025-02-12 13:16 ` Cyril Hrubis
  2025-02-12 14:03   ` Petr Vorel
  2025-02-13 12:48   ` Ricardo B. Marlière
  2025-02-12 13:16 ` [LTP] [PATCH 2/2] metaparse: data_storage: Fix warning Cyril Hrubis
                   ` (2 subsequent siblings)
  3 siblings, 2 replies; 9+ messages in thread
From: Cyril Hrubis @ 2025-02-12 13:16 UTC (permalink / raw)
  To: ltp

Signed-off-by: Cyril Hrubis <chrubis@suse.cz>
---
 metadata/.gitignore     |   1 +
 metadata/Makefile       |   4 +-
 metadata/metaparse-sh.c | 127 ++++++++++++++++++++++++++++++++++++++++
 metadata/parse.sh       |  13 ++++
 4 files changed, 143 insertions(+), 2 deletions(-)
 create mode 100644 metadata/metaparse-sh.c

diff --git a/metadata/.gitignore b/metadata/.gitignore
index 07d2fd6ff..bb6399e5c 100644
--- a/metadata/.gitignore
+++ b/metadata/.gitignore
@@ -1,2 +1,3 @@
 metaparse
+metaparse-sh
 ltp.json
diff --git a/metadata/Makefile b/metadata/Makefile
index 522af4270..641657318 100644
--- a/metadata/Makefile
+++ b/metadata/Makefile
@@ -7,12 +7,12 @@ include $(top_srcdir)/include/mk/env_pre.mk
 include $(top_srcdir)/include/mk/functions.mk
 
 MAKE_TARGETS		:= ltp.json
-HOST_MAKE_TARGETS	:= metaparse
+HOST_MAKE_TARGETS	:= metaparse metaparse-sh
 INSTALL_DIR		= metadata
 
 .PHONY: ltp.json
 
-ltp.json: metaparse
+ltp.json: metaparse metaparse-sh
 	$(abs_srcdir)/parse.sh > ltp.json
 ifeq ($(WITH_METADATA),yes)
 	mkdir -p $(abs_top_builddir)/docparse
diff --git a/metadata/metaparse-sh.c b/metadata/metaparse-sh.c
new file mode 100644
index 000000000..9eb38f583
--- /dev/null
+++ b/metadata/metaparse-sh.c
@@ -0,0 +1,127 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (c) 2025 Cyril Hrubis <chrubis@suse.cz>
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <libgen.h>
+
+#include "data_storage.h"
+
+static int started;
+
+static void json_start(char *path)
+{
+	if (started)
+		return;
+
+	started = 1;
+
+	printf("   \"%s\": {\n", basename(path));
+}
+
+static void json_finish(const char *path)
+{
+	if (!started)
+		return;
+
+	printf("   \"fname\": \"%s\"\n", path);
+	printf("  }");
+}
+
+enum state {
+	NONE,
+	START,
+	DOC_FIRST,
+	DOC,
+	ENV_START,
+	ENV_FIRST,
+	ENV
+};
+
+static void parse_shell(char *path)
+{
+	char line[4096];
+	FILE *f = fopen(path, "r");
+	enum state state = NONE;
+
+	while (fgets(line, sizeof(line), f)) {
+		/* Strip newline */
+		line[strlen(line)-1] = 0;
+
+		switch (state) {
+		case NONE:
+			if (!strcmp(line, "# ---"))
+				state = START;
+		break;
+		case START:
+			if (!strcmp(line, "# doc")) {
+				json_start(path);
+				state = DOC_FIRST;
+				printf("   \"doc\": [\n");
+			} else if (!strcmp(line, "# env")) {
+				json_start(path);
+				state = ENV_START;
+			} else {
+				state = NONE;
+			}
+		break;
+		case DOC:
+		case DOC_FIRST:
+			if (!strcmp(line, "# ---")) {
+				state = NONE;
+				printf("\n   ],\n");
+				continue;
+			}
+
+			if (state == DOC_FIRST)
+				state = DOC;
+			else
+				printf(",\n");
+
+			data_fprintf_esc(stdout, 4, line+2);
+		break;
+		case ENV_START:
+			if (!strcmp(line, "# {")) {
+				state = ENV_FIRST;
+			} else {
+				fprintf(stderr,
+				        "%s: Invalid line in JSON block '%s'",
+					path, line);
+			}
+		break;
+		case ENV:
+		case ENV_FIRST:
+			if (!strcmp(line, "# }")) {
+				state = NONE;
+				printf(",\n");
+				continue;
+			}
+
+
+			if (state == ENV_FIRST)
+				state = ENV;
+			else
+				printf("\n");
+
+			line[0] = ' ';
+			line[1] = ' ';
+
+			printf("%s", line);
+		break;
+		}
+	}
+
+	json_finish(path);
+}
+
+int main(int argc, char *argv[])
+{
+	int i;
+
+	for (i = 1; i < argc; i++)
+		parse_shell(argv[i]);
+
+	return 0;
+}
diff --git a/metadata/parse.sh b/metadata/parse.sh
index 7db2e2415..45776e4d0 100755
--- a/metadata/parse.sh
+++ b/metadata/parse.sh
@@ -42,6 +42,19 @@ EOF
 	fi
 done
 
+for test in `find testcases/ -not -path "testcases/lib/*" -name '*.sh'|sort`; do
+	a=$($top_builddir/metadata/metaparse-sh "$test")
+	if [ -n "$a" ]; then
+		if [ -z "$first" ]; then
+			echo ','
+		fi
+		first=
+		cat <<EOF
+$a
+EOF
+	fi
+done
+
 echo
 echo ' }'
 echo '}'
-- 
2.45.3


-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [LTP] [PATCH 2/2] metaparse: data_storage: Fix warning
  2025-02-12 13:16 [LTP] [PATCH 0/2] Add shell test metadata parser Cyril Hrubis
  2025-02-12 13:16 ` [LTP] [PATCH 1/2] metaparse: Add shell test parser Cyril Hrubis
@ 2025-02-12 13:16 ` Cyril Hrubis
  2025-02-12 14:04   ` Petr Vorel
  2025-02-13 12:41 ` [LTP] [PATCH 0/2] Add shell test metadata parser Ricardo B. Marlière
  2025-02-25 13:14 ` Cyril Hrubis
  3 siblings, 1 reply; 9+ messages in thread
From: Cyril Hrubis @ 2025-02-12 13:16 UTC (permalink / raw)
  To: ltp

Make data_node_hash_get static inline in order to avoid unused warnings.

Signed-off-by: Cyril Hrubis <chrubis@suse.cz>
---
 metadata/data_storage.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/metadata/data_storage.h b/metadata/data_storage.h
index 6427ea1ed..82d67b829 100644
--- a/metadata/data_storage.h
+++ b/metadata/data_storage.h
@@ -212,7 +212,7 @@ static inline int data_node_hash_del(struct data_node *self, const char *id)
 	return 1;
 }
 
-static struct data_node *data_node_hash_get(struct data_node *self, const char *id)
+static inline struct data_node *data_node_hash_get(struct data_node *self, const char *id)
 {
 	unsigned int i;
 	struct data_node_hash *hash = &self->hash;
-- 
2.45.3


-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [LTP] [PATCH 1/2] metaparse: Add shell test parser
  2025-02-12 13:16 ` [LTP] [PATCH 1/2] metaparse: Add shell test parser Cyril Hrubis
@ 2025-02-12 14:03   ` Petr Vorel
  2025-02-13 12:48   ` Ricardo B. Marlière
  1 sibling, 0 replies; 9+ messages in thread
From: Petr Vorel @ 2025-02-12 14:03 UTC (permalink / raw)
  To: Cyril Hrubis; +Cc: ltp

Hi Cyril,

Great, thank you!
Reviewed-by: Petr Vorel <pvorel@suse.cz>

Quick notes:

* Implementing help under -h would be a bonus (it segfaults on -h, metadata.c
  has it). But this should not block you merging it.

* Please merge with whitespace error
$ make check-metaparse-sh 
CHECK metadata/metaparse-sh.c
metaparse-sh.c:90: ERROR: code indent should use tabs where possible

* Resulting JSON has true, 1 instead would be nice. Again, tiny detail.

   "vma05.sh": {
   "doc": [
    "",
    "[Description]",
    "",
    "Regression test if the vsyscall and vdso VMA regions are reported correctly.",
    "",
    "While [vsyscall] is mostly deprecated with newer systems, there is",
    "still plenty of kernels compiled with CONFIG_LEGACY_VSYSCALL_NATIVE and",
    "CONFIG_LEGACY_VSYSCALL_EMULATE (see linux/arch/x86/Kconfig for option",
    "descriptions). First part of the test will check eligible kernels for",
    "regression for a bug fixed by commit 103efcd9aac1 (fix perms/range of",
    "vsyscall vma in /proc/*/maps).",
    "",
    "Second part of test checks [vdso] VMA permissions (fixed with commits",
    "b6558c4a2378 (fix [vdso] page permissions) and e5b97dde514f (Add",
    "VM_ALWAYSDUMP)). As a consequence of this bug, VMAs were not included",
    "in core dumps which resulted in eg. incomplete backtraces and invalid",
    "core dump files created by gdb."
   ],
   "needs_root": true,
   "needs_tmpdir": true,
   "needs_cmds": ["gdb", "uname"],
   "save_restore": [
    ["/proc/sys/kernel/core_pattern", "core", "TBROK"],
    ["/proc/sys/kernel/core_uses_pid", "0", "TBROK"]
   ],
   "tags": [
    ["linux-git", "103efcd9aac1"],
    ["linux-git", "b6558c4a2378"],
    ["linux-git", "e5b97dde514f"]
   ],
   "fname": "testcases/kernel/mem/vma/vma05.sh"
  }

Kind regards,
Petr

-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [LTP] [PATCH 2/2] metaparse: data_storage: Fix warning
  2025-02-12 13:16 ` [LTP] [PATCH 2/2] metaparse: data_storage: Fix warning Cyril Hrubis
@ 2025-02-12 14:04   ` Petr Vorel
  0 siblings, 0 replies; 9+ messages in thread
From: Petr Vorel @ 2025-02-12 14:04 UTC (permalink / raw)
  To: Cyril Hrubis; +Cc: ltp

Hi Cyril,

> Make data_node_hash_get static inline in order to avoid unused warnings.

Obviously correct, thanks!

Reviewed-by: Petr Vorel <pvorel@suse.cz>

Kind regards,
Petr

-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [LTP] [PATCH 0/2] Add shell test metadata parser
  2025-02-12 13:16 [LTP] [PATCH 0/2] Add shell test metadata parser Cyril Hrubis
  2025-02-12 13:16 ` [LTP] [PATCH 1/2] metaparse: Add shell test parser Cyril Hrubis
  2025-02-12 13:16 ` [LTP] [PATCH 2/2] metaparse: data_storage: Fix warning Cyril Hrubis
@ 2025-02-13 12:41 ` Ricardo B. Marlière
  2025-02-13 14:06   ` Cyril Hrubis
  2025-02-25 13:14 ` Cyril Hrubis
  3 siblings, 1 reply; 9+ messages in thread
From: Ricardo B. Marlière @ 2025-02-13 12:41 UTC (permalink / raw)
  To: Cyril Hrubis, ltp; +Cc: ltp

Hello!

On Wed Feb 12, 2025 at 10:16 AM -03, Cyril Hrubis wrote:
> As promised this adds metadata parser for the shell testcases. In the
> end I wrote it in about 100 lines of C because the ekvivalent awk script
> would be too complicated.
>
> Cyril Hrubis (2):
>   metaparse: Add shell test parser
>   metaparse: data_storage: Fix warning
>
>  metadata/.gitignore     |   1 +
>  metadata/Makefile       |   4 +-
>  metadata/data_storage.h |   2 +-
>  metadata/metaparse-sh.c | 127 ++++++++++++++++++++++++++++++++++++++++
>  metadata/parse.sh       |  13 ++++
>  5 files changed, 144 insertions(+), 3 deletions(-)
>  create mode 100644 metadata/metaparse-sh.c

For the series:

Reviewed-by: Ricardo B. Marlière <ricardo@marliere.net>
Tested-by: Ricardo B. Marlière <ricardo@marliere.net>

So, currently there's only testcases/kernel/mem/vma/vma05.sh and the
goal is to add metadata to all *.sh tests, correct?

Thanks,
-	Ricardo.



-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [LTP] [PATCH 1/2] metaparse: Add shell test parser
  2025-02-12 13:16 ` [LTP] [PATCH 1/2] metaparse: Add shell test parser Cyril Hrubis
  2025-02-12 14:03   ` Petr Vorel
@ 2025-02-13 12:48   ` Ricardo B. Marlière
  1 sibling, 0 replies; 9+ messages in thread
From: Ricardo B. Marlière @ 2025-02-13 12:48 UTC (permalink / raw)
  To: Cyril Hrubis, ltp; +Cc: ltp

On Wed Feb 12, 2025 at 10:16 AM -03, Cyril Hrubis wrote:
> Signed-off-by: Cyril Hrubis <chrubis@suse.cz>
> ---
>  metadata/.gitignore     |   1 +
>  metadata/Makefile       |   4 +-
>  metadata/metaparse-sh.c | 127 ++++++++++++++++++++++++++++++++++++++++
>  metadata/parse.sh       |  13 ++++
>  4 files changed, 143 insertions(+), 2 deletions(-)
>  create mode 100644 metadata/metaparse-sh.c
>
> diff --git a/metadata/.gitignore b/metadata/.gitignore
> index 07d2fd6ff..bb6399e5c 100644
> --- a/metadata/.gitignore
> +++ b/metadata/.gitignore
> @@ -1,2 +1,3 @@
>  metaparse
> +metaparse-sh
>  ltp.json
> diff --git a/metadata/Makefile b/metadata/Makefile
> index 522af4270..641657318 100644
> --- a/metadata/Makefile
> +++ b/metadata/Makefile
> @@ -7,12 +7,12 @@ include $(top_srcdir)/include/mk/env_pre.mk
>  include $(top_srcdir)/include/mk/functions.mk
>  
>  MAKE_TARGETS		:= ltp.json
> -HOST_MAKE_TARGETS	:= metaparse
> +HOST_MAKE_TARGETS	:= metaparse metaparse-sh
>  INSTALL_DIR		= metadata
>  
>  .PHONY: ltp.json
>  
> -ltp.json: metaparse
> +ltp.json: metaparse metaparse-sh
>  	$(abs_srcdir)/parse.sh > ltp.json
>  ifeq ($(WITH_METADATA),yes)
>  	mkdir -p $(abs_top_builddir)/docparse
> diff --git a/metadata/metaparse-sh.c b/metadata/metaparse-sh.c
> new file mode 100644
> index 000000000..9eb38f583
> --- /dev/null
> +++ b/metadata/metaparse-sh.c
> @@ -0,0 +1,127 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +/*
> + * Copyright (c) 2025 Cyril Hrubis <chrubis@suse.cz>
> + */
> +
> +#include <stdio.h>
> +#include <string.h>
> +#include <libgen.h>
> +
> +#include "data_storage.h"
> +
> +static int started;
> +
> +static void json_start(char *path)
> +{
> +	if (started)
> +		return;
> +
> +	started = 1;
> +
> +	printf("   \"%s\": {\n", basename(path));
> +}
> +
> +static void json_finish(const char *path)
> +{
> +	if (!started)
> +		return;
> +
> +	printf("   \"fname\": \"%s\"\n", path);
> +	printf("  }");
> +}
> +
> +enum state {
> +	NONE,
> +	START,
> +	DOC_FIRST,
> +	DOC,
> +	ENV_START,
> +	ENV_FIRST,
> +	ENV
> +};
> +
> +static void parse_shell(char *path)
> +{
> +	char line[4096];
> +	FILE *f = fopen(path, "r");
> +	enum state state = NONE;
> +
> +	while (fgets(line, sizeof(line), f)) {
> +		/* Strip newline */
> +		line[strlen(line)-1] = 0;
> +
> +		switch (state) {
> +		case NONE:
> +			if (!strcmp(line, "# ---"))
> +				state = START;
> +		break;
> +		case START:
> +			if (!strcmp(line, "# doc")) {
> +				json_start(path);
> +				state = DOC_FIRST;
> +				printf("   \"doc\": [\n");
> +			} else if (!strcmp(line, "# env")) {
> +				json_start(path);
> +				state = ENV_START;
> +			} else {
> +				state = NONE;
> +			}
> +		break;
> +		case DOC:
> +		case DOC_FIRST:
> +			if (!strcmp(line, "# ---")) {
> +				state = NONE;
> +				printf("\n   ],\n");
> +				continue;
> +			}
> +
> +			if (state == DOC_FIRST)
> +				state = DOC;
> +			else
> +				printf(",\n");
> +
> +			data_fprintf_esc(stdout, 4, line+2);
> +		break;
> +		case ENV_START:
> +			if (!strcmp(line, "# {")) {
> +				state = ENV_FIRST;
> +			} else {
> +				fprintf(stderr,
> +				        "%s: Invalid line in JSON block '%s'",
> +					path, line);
> +			}
> +		break;
> +		case ENV:
> +		case ENV_FIRST:
> +			if (!strcmp(line, "# }")) {
> +				state = NONE;
> +				printf(",\n");
> +				continue;
> +			}
> +
> +

nit: double blank line here

> +			if (state == ENV_FIRST)
> +				state = ENV;
> +			else
> +				printf("\n");
> +
> +			line[0] = ' ';
> +			line[1] = ' ';
> +
> +			printf("%s", line);
> +		break;
> +		}
> +	}
> +
> +	json_finish(path);
> +}
> +
> +int main(int argc, char *argv[])
> +{
> +	int i;
> +
> +	for (i = 1; i < argc; i++)
> +		parse_shell(argv[i]);
> +
> +	return 0;
> +}
> diff --git a/metadata/parse.sh b/metadata/parse.sh
> index 7db2e2415..45776e4d0 100755
> --- a/metadata/parse.sh
> +++ b/metadata/parse.sh
> @@ -42,6 +42,19 @@ EOF
>  	fi
>  done
>  
> +for test in `find testcases/ -not -path "testcases/lib/*" -name '*.sh'|sort`; do
> +	a=$($top_builddir/metadata/metaparse-sh "$test")
> +	if [ -n "$a" ]; then
> +		if [ -z "$first" ]; then
> +			echo ','
> +		fi
> +		first=
> +		cat <<EOF
> +$a
> +EOF
> +	fi
> +done
> +
>  echo
>  echo ' }'
>  echo '}'


-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [LTP] [PATCH 0/2] Add shell test metadata parser
  2025-02-13 12:41 ` [LTP] [PATCH 0/2] Add shell test metadata parser Ricardo B. Marlière
@ 2025-02-13 14:06   ` Cyril Hrubis
  0 siblings, 0 replies; 9+ messages in thread
From: Cyril Hrubis @ 2025-02-13 14:06 UTC (permalink / raw)
  To: Ricardo B. Marlière; +Cc: ltp, ltp

Hi!
> So, currently there's only testcases/kernel/mem/vma/vma05.sh and the
> goal is to add metadata to all *.sh tests, correct?

Indeed, now I'm looking at how to add setup and cleanup support to the
shell library so that we can convert more tests to it.

-- 
Cyril Hrubis
chrubis@suse.cz

-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [LTP] [PATCH 0/2] Add shell test metadata parser
  2025-02-12 13:16 [LTP] [PATCH 0/2] Add shell test metadata parser Cyril Hrubis
                   ` (2 preceding siblings ...)
  2025-02-13 12:41 ` [LTP] [PATCH 0/2] Add shell test metadata parser Ricardo B. Marlière
@ 2025-02-25 13:14 ` Cyril Hrubis
  3 siblings, 0 replies; 9+ messages in thread
From: Cyril Hrubis @ 2025-02-25 13:14 UTC (permalink / raw)
  To: ltp

Hi!
I've fixed the problems pointed out in the review and pushed, thanks.

- Fixed various whitespaces
- Added check if file was opened succesfully

-- 
Cyril Hrubis
chrubis@suse.cz

-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2025-02-25 13:15 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-02-12 13:16 [LTP] [PATCH 0/2] Add shell test metadata parser Cyril Hrubis
2025-02-12 13:16 ` [LTP] [PATCH 1/2] metaparse: Add shell test parser Cyril Hrubis
2025-02-12 14:03   ` Petr Vorel
2025-02-13 12:48   ` Ricardo B. Marlière
2025-02-12 13:16 ` [LTP] [PATCH 2/2] metaparse: data_storage: Fix warning Cyril Hrubis
2025-02-12 14:04   ` Petr Vorel
2025-02-13 12:41 ` [LTP] [PATCH 0/2] Add shell test metadata parser Ricardo B. Marlière
2025-02-13 14:06   ` Cyril Hrubis
2025-02-25 13:14 ` Cyril Hrubis

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox