linux-perf-users.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Namhyung Kim <namhyung@kernel.org>
To: Jakub Brnak <jbrnak@redhat.com>
Cc: vmolnaro@redhat.com, acme@kernel.org, acme@redhat.com,
	irogers@google.com, linux-perf-users@vger.kernel.org,
	mpetlan@redhat.com
Subject: Re: [PATCH v3 3/7] perf test: Provide setup for the shell test suite
Date: Fri, 25 Jul 2025 23:07:45 -0700	[thread overview]
Message-ID: <aIRwscmIfCHQkeVS@google.com> (raw)
In-Reply-To: <20250721132642.40906-4-jbrnak@redhat.com>

On Mon, Jul 21, 2025 at 03:26:38PM +0200, Jakub Brnak wrote:
> From: Veronika Molnarova <vmolnaro@redhat.com>
> 
> Some of the perftool-testsuite test cases require a setup to be done
> beforehand as may be recording data, setting up cache or restoring sample
> rate. The setup file also provides the possibility to set the name of
> the test suite, if the name of the directory is not good enough.
> 
> Check for the existence of the "setup.sh" script for the shell test
> suites and run it before the any of the test cases. If the setup fails,
> skip all of the test cases of the test suite as the setup may be
> required for the result to be valid.

Looks like better to be documented somewhere.  Maybe you can add a
section like "Add a new (shell) test" in the perf-test man page or so.

Thanks,
Namhyung

> 
> Signed-off-by: Michael Petlan <mpetlan@redhat.com>
> Signed-off-by: Veronika Molnarova <vmolnaro@redhat.com>
> Signed-off-by: Jakub Brnak <jbrnak@redhat.com>
> ---
>  tools/perf/tests/builtin-test.c  | 30 +++++++++++++++++++++-------
>  tools/perf/tests/tests-scripts.c | 34 ++++++++++++++++++++++++++++++--
>  tools/perf/tests/tests-scripts.h | 10 ++++++++++
>  tools/perf/tests/tests.h         |  8 +++++---
>  4 files changed, 70 insertions(+), 12 deletions(-)
> 
> diff --git a/tools/perf/tests/builtin-test.c b/tools/perf/tests/builtin-test.c
> index 85142dfb3e01..4e3d2f779b01 100644
> --- a/tools/perf/tests/builtin-test.c
> +++ b/tools/perf/tests/builtin-test.c
> @@ -258,6 +258,22 @@ static test_fnptr test_function(const struct test_suite *t, int test_case)
>  	return t->test_cases[test_case].run_case;
>  }
>  
> +/* If setup fails, skip all test cases */
> +static void check_shell_setup(const struct test_suite *t, int ret)
> +{
> +	struct shell_info* test_info;
> +
> +	if (!t->priv)
> +		return;
> +
> +	test_info = t->priv;
> +
> +	if (ret == TEST_SETUP_FAIL)
> +		test_info->has_setup = FAILED_SETUP;
> +	else if (test_info->has_setup == RUN_SETUP)
> +		test_info->has_setup = PASSED_SETUP;
> +}
> +
>  static bool test_exclusive(const struct test_suite *t, int test_case)
>  {
>  	if (test_case <= 0)
> @@ -347,10 +363,8 @@ static int run_test_child(struct child_process *process)
>  	return -err;
>  }
>  
> -#define TEST_RUNNING -3
> -
> -static int print_test_result(struct test_suite *t, int curr_suite, int curr_test_case,
> -			     int result, int width, int running)
> +static int print_test_result(struct test_suite *t, int curr_suite, int curr_test_case, int result, int width,
> +			     int running)
>  {
>  	if (test_suite__num_test_cases(t) > 1) {
>  		int subw = width > 2 ? width - 2 : width;
> @@ -367,7 +381,8 @@ static int print_test_result(struct test_suite *t, int curr_suite, int curr_test
>  	case TEST_OK:
>  		pr_info(" Ok\n");
>  		break;
> -	case TEST_SKIP: {
> +	case TEST_SKIP:
> +	case TEST_SETUP_FAIL:{
>  		const char *reason = skip_reason(t, curr_test_case);
>  
>  		if (reason)
> @@ -482,6 +497,7 @@ static void finish_test(struct child_test **child_tests, int running_test, int c
>  	}
>  	/* Clean up child process. */
>  	ret = finish_command(&child_test->process);
> +	check_shell_setup(t, ret);
>  	if (verbose > 1 || (verbose == 1 && ret == TEST_FAIL))
>  		fprintf(stderr, "%s", err_output.buf);
>  
> @@ -503,8 +519,8 @@ static int start_test(struct test_suite *test, int curr_suite, int curr_test_cas
>  			pr_debug("--- start ---\n");
>  			err = test_function(test, curr_test_case)(test, curr_test_case);
>  			pr_debug("---- end ----\n");
> -			print_test_result(test, curr_suite, curr_test_case, err, width,
> -					  /*running=*/0);
> +			print_test_result(test, curr_suite, curr_test_case, err, width, /*running=*/0);
> +			check_shell_setup(test, err);
>  		}
>  		return 0;
>  	}
> diff --git a/tools/perf/tests/tests-scripts.c b/tools/perf/tests/tests-scripts.c
> index 21a6ede330e9..d680a878800f 100644
> --- a/tools/perf/tests/tests-scripts.c
> +++ b/tools/perf/tests/tests-scripts.c
> @@ -138,6 +138,11 @@ static bool is_test_script(int dir_fd, const char *name)
>  	return is_shell_script(dir_fd, name);
>  }
>  
> +/* Filter for scandir */
> +static int setup_filter(const struct dirent *entry){
> +	return strcmp(entry->d_name, SHELL_SETUP);
> +}
> +
>  /* Duplicate a string and fall over and die if we run out of memory */
>  static char *strdup_check(const char *str)
>  {
> @@ -175,6 +180,7 @@ static void free_suite(struct test_suite *suite) {
>  
>  static int shell_test__run(struct test_suite *test, int subtest)
>  {
> +	struct shell_info *test_info = test->priv;
>  	const char *file;
>  	int err;
>  	char *cmd = NULL;
> @@ -187,6 +193,22 @@ static int shell_test__run(struct test_suite *test, int subtest)
>  		file = test->test_cases[0].name;
>  	}
>  
> +	/* Run setup if needed */
> +	if (test_info->has_setup == RUN_SETUP){
> +		char *setup_script;
> +		if (asprintf(&setup_script, "%s%s%s", test_info->base_path, SHELL_SETUP, verbose ? " -v" : "") < 0)
> +			return TEST_SETUP_FAIL;
> +
> +		err = system(setup_script);
> +		free(setup_script);
> +
> +		if (err)
> +			return TEST_SETUP_FAIL;
> +	}
> +	else if (test_info->has_setup == FAILED_SETUP) {
> +		return TEST_SKIP; /* Skip test suite if setup failed */
> +	}
> +
>  	if (asprintf(&cmd, "%s%s", file, verbose ? " -v" : "") < 0)
>  		return TEST_FAIL;
>  
> @@ -228,6 +250,7 @@ static struct test_suite* prepare_test_suite(int dir_fd)
>  	}
>  
>  	test_info->base_path = strdup_check(dirpath);		/* Absolute path to dir */
> +	test_info->has_setup = NO_SETUP;
>  
>  	test_suite->priv = test_info;
>  	test_suite->desc = NULL;
> @@ -309,7 +332,7 @@ static void append_scripts_in_subdir(int dir_fd,
>  	int n_dirs, i;
>  
>  	/* List files, sorted by alpha */
> -	n_dirs = scandirat(dir_fd, ".", &entlist, NULL, alphasort);
> +	n_dirs = scandirat(dir_fd, ".", &entlist, setup_filter, alphasort);
>  	if (n_dirs == -1)
>  		return;
>  	for (i = 0; i < n_dirs && (ent = entlist[i]); i++) {
> @@ -404,7 +427,14 @@ static void append_suits_in_dir(int dir_fd,
>  			continue;
>  		}
>  
> -		test_suite->desc = strdup_check(ent->d_name);	/* If no setup, set name to the directory */
> +		if (is_test_script(fd, SHELL_SETUP)) {	/* Check for setup existance */
> +			char *desc = shell_test__description(fd, SHELL_SETUP);
> +			test_suite->desc = desc;	/* Set the suite name by the setup description */
> +			((struct shell_info*)(test_suite->priv))->has_setup = RUN_SETUP;
> +		}
> +		else {
> +			test_suite->desc = strdup_check(ent->d_name);	/* If no setup, set name to the directory */
> +		}
>  
>  		append_suite(result, result_sz, test_suite);
>  		close(fd);
> diff --git a/tools/perf/tests/tests-scripts.h b/tools/perf/tests/tests-scripts.h
> index 60a1a19a45c9..da4dcd26140c 100644
> --- a/tools/perf/tests/tests-scripts.h
> +++ b/tools/perf/tests/tests-scripts.h
> @@ -4,8 +4,18 @@
>  
>  #include "tests.h"
>  
> +#define SHELL_SETUP "setup.sh"
> +
> +enum shell_setup {
> +	NO_SETUP     = 0,
> +	RUN_SETUP    = 1,
> +	FAILED_SETUP = 2,
> +	PASSED_SETUP = 3,
> +};
> +
>  struct shell_info {
>  	const char *base_path;
> +	enum shell_setup has_setup;
>  };
>  
>  struct test_suite **create_script_test_suites(void);
> diff --git a/tools/perf/tests/tests.h b/tools/perf/tests/tests.h
> index 97e62db8764a..0545c9429000 100644
> --- a/tools/perf/tests/tests.h
> +++ b/tools/perf/tests/tests.h
> @@ -6,9 +6,11 @@
>  #include "util/debug.h"
>  
>  enum {
> -	TEST_OK   =  0,
> -	TEST_FAIL = -1,
> -	TEST_SKIP = -2,
> +	TEST_OK         =  0,
> +	TEST_FAIL      	= -1,
> +	TEST_SKIP       = -2,
> +	TEST_RUNNING	= -3,
> +	TEST_SETUP_FAIL = -4,
>  };
>  
>  #define TEST_ASSERT_VAL(text, cond)					 \
> -- 
> 2.50.1
> 

  reply	other threads:[~2025-07-26  6:07 UTC|newest]

Thread overview: 43+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-12-20 22:03 [PATCH 00/10] Introduce structure for shell tests vmolnaro
2024-12-20 22:03 ` [PATCH 01/10] perf test perftool_testsuite: Add missing description vmolnaro
2024-12-20 22:03 ` [PATCH 02/10] perf test perftool_testsuite: Return correct value for skipping vmolnaro
2024-12-20 22:03 ` [PATCH 03/10] perf test perftool_testsuite: Use absolute paths vmolnaro
2024-12-20 22:03 ` [PATCH 04/10] perf tests: Create a structure for shell tests vmolnaro
2024-12-20 22:03 ` [PATCH 05/10] perf testsuite: Fix perf-report tests installation vmolnaro
2024-12-20 22:03 ` [PATCH 06/10] perf test: Provide setup for the shell test suite vmolnaro
2024-12-20 22:03 ` [PATCH 07/10] perftool-testsuite: Add empty setup for base_probe vmolnaro
2024-12-20 22:03 ` [PATCH 08/10] perf test: Introduce storing logs for shell tests vmolnaro
2024-12-20 22:03 ` [PATCH 09/10] perf test: Format log directories " vmolnaro
2024-12-20 22:03 ` [PATCH 10/10] perf test: Remove perftool drivers vmolnaro
2025-01-13 15:24 ` [PATCH 00/10] Introduce structure for shell tests Arnaldo Carvalho de Melo
2025-01-13 18:25   ` [PATCH v2 " vmolnaro
2025-07-21 13:26     ` [PATCH v3 0/7] " Jakub Brnak
2025-07-21 13:26       ` [PATCH v3 1/7] perf test perftool_testsuite: Use absolute paths Jakub Brnak
2025-07-26  6:00         ` Namhyung Kim
2025-08-21 11:01           ` Jakub Brnak
2025-07-21 13:26       ` [PATCH v3 2/7] perf tests: Create a structure for shell tests Jakub Brnak
2025-07-21 19:39         ` Ian Rogers
2025-07-26  6:03         ` Namhyung Kim
2025-08-21 11:15           ` Jakub Brnak
2025-07-21 13:26       ` [PATCH v3 3/7] perf test: Provide setup for the shell test suite Jakub Brnak
2025-07-26  6:07         ` Namhyung Kim [this message]
2025-08-04 14:39           ` Michael Petlan
2025-07-21 13:26       ` [PATCH v3 4/7] perftool-testsuite: Add empty setup for base_probe Jakub Brnak
2025-07-21 13:26       ` [PATCH v3 5/7] perf test: Introduce storing logs for shell tests Jakub Brnak
2025-07-21 19:43         ` Ian Rogers
2025-07-26  6:17         ` Namhyung Kim
2025-07-21 13:26       ` [PATCH v3 6/7] perf test: Format log directories " Jakub Brnak
2025-07-26  6:21         ` Namhyung Kim
2025-07-21 13:26       ` [PATCH v3 7/7] perf test: Remove perftool drivers Jakub Brnak
2025-07-21 19:46         ` Ian Rogers
2025-07-31 12:54       ` [PATCH v3 0/7] Introduce structure for shell tests tejas05
2025-01-13 18:25   ` [PATCH v2 01/10] perf test perftool_testsuite: Add missing description vmolnaro
2025-01-13 18:25   ` [PATCH v2 02/10] perf test perftool_testsuite: Return correct value for skipping vmolnaro
2025-01-13 18:25   ` [PATCH v2 03/10] perf test perftool_testsuite: Use absolute paths vmolnaro
2025-01-13 18:25   ` [PATCH v2 04/10] perf tests: Create a structure for shell tests vmolnaro
2025-01-13 18:26   ` [PATCH v2 05/10] perf testsuite: Fix perf-report tests installation vmolnaro
2025-01-13 18:26   ` [PATCH v2 06/10] perf test: Provide setup for the shell test suite vmolnaro
2025-01-13 18:26   ` [PATCH v2 07/10] perftool-testsuite: Add empty setup for base_probe vmolnaro
2025-01-13 18:26   ` [PATCH v2 08/10] perf test: Introduce storing logs for shell tests vmolnaro
2025-01-13 18:26   ` [PATCH v2 09/10] perf test: Format log directories " vmolnaro
2025-01-13 18:26   ` [PATCH v2 10/10] perf test: Remove perftool drivers vmolnaro

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=aIRwscmIfCHQkeVS@google.com \
    --to=namhyung@kernel.org \
    --cc=acme@kernel.org \
    --cc=acme@redhat.com \
    --cc=irogers@google.com \
    --cc=jbrnak@redhat.com \
    --cc=linux-perf-users@vger.kernel.org \
    --cc=mpetlan@redhat.com \
    --cc=vmolnaro@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).