Re: [PATCH v6] power_management: rewrite runpwtests04.sh in C

Cyril Hrubis <[email protected]>
Newsgroups gmane.linux.ltp
Message-ID <alD_qLh0SzW-2oJC@rei>
>  runtest/power_management_tests                |  2 +-
>  testcases/kernel/power_management/.gitignore  |  1 +
>  testcases/kernel/power_management/cpuidle01.c | 90 +++++++++++++++++++
>  .../kernel/power_management/runpwtests04.sh   | 58 ------------
>  4 files changed, 92 insertions(+), 59 deletions(-)
>  create mode 100644 testcases/kernel/power_management/cpuidle01.c
>  delete mode 100755 testcases/kernel/power_management/runpwtests04.sh
> 
> diff --git a/runtest/power_management_tests b/runtest/power_management_tests
> index 4da57ee72..0f2656b52 100644
> --- a/runtest/power_management_tests
> +++ b/runtest/power_management_tests
> @@ -1,5 +1,5 @@
>  #POWER_MANAGEMENT
>  high_freq_hwp_cap_cppc high_freq_hwp_cap_cppc
> +cpuidle01 cpuidle01
>  runpwtests03 runpwtests03.sh
> -runpwtests04 runpwtests04.sh
>  runpwtests06 runpwtests06.sh
> diff --git a/testcases/kernel/power_management/.gitignore b/testcases/kernel/power_management/.gitignore
> index 03f0c83e4..e237df1c8 100644
> --- a/testcases/kernel/power_management/.gitignore
> +++ b/testcases/kernel/power_management/.gitignore
> @@ -1 +1,2 @@
>  high_freq_hwp_cap_cppc
> +cpuidle01
> diff --git a/testcases/kernel/power_management/cpuidle01.c b/testcases/kernel/power_management/cpuidle01.c
> new file mode 100644
> index 000000000..919dd2b7c
> --- /dev/null
> +++ b/testcases/kernel/power_management/cpuidle01.c
> @@ -0,0 +1,90 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +/*
> + * Copyright (C) 2026 Jinseok Kim <[email protected]>
> + */
> +
> +/*\
> + * Basic cpuidle sysfs smoke test.
> + *
> + * Verify that selected cpuidle sysfs files are readable.
> + */
> +
> +#include <fcntl.h>
> +#include <unistd.h>
> +
> +#include "tst_test.h"
> +
> +#define CPUIDLE_PATH "/sys/devices/system/cpu/cpuidle"
> +
> +static struct tcase {
> +	const char *name;
> +	bool is_writable;
> +} tcases[] = {
> +	{ "available_governors", false },
> +	{ "current_driver", false },
> +	{ "current_governor", true },
> +	{ "current_governor_ro", false },
> +};
> +
> +static int fd = -1;
> +
> +static void verify_cpuidle(unsigned int i)
> +{
> +	int ret;
> +	char path[PATH_MAX];
> +	char buf[32];
> +
> +	snprintf(path, sizeof(path), "%s/%s", CPUIDLE_PATH, tcases[i].name);
> +
> +	if (tcases[i].is_writable)
> +		fd = open(path, O_RDWR);
> +	else
> +		fd = open(path, O_RDONLY);
> +
> +	if (fd < 0) {
> +		if (errno == ENOENT)
> +			tst_res(TCONF, "%s not available", path);
> +		else
> +			tst_res(TFAIL | TERRNO, "open(%s) failed", path);
> +		return;
> +	}
> +
> +	ret = read(fd, buf, sizeof(buf));
> +
> +	if (ret < 0)
> +		tst_res(TFAIL | TERRNO, "%s read() failed", path);
> +	else if (ret == 0)
> +		tst_res(TFAIL, "%s read() returned 0", path);
> +	else
> +		tst_res(TPASS, "%s read() successfully", path);

When we actually bother writing tests maybe we should not do it with the
array style, but rather add a function per sysfs file that would
actually check that the data are correct.

E.g. we could write a function that would read and parse
available_governors and then check that current_governor is in the set
of the available_governors.

> +	if (tcases[i].is_writable) {
> +		if (write(fd, "invalid_governor", 16) < 0) {
> +			if (errno == EINVAL)
> +				tst_res(TPASS, "%s rejected invalid input with EINVAL", path);
> +			else
> +				tst_res(TFAIL | TERRNO, "%s rejected invalid input with unexpected errno", path);
> +		} else {
> +			tst_res(TFAIL, "%s accepted invalid input successfully", path);
> +		}

	This can be just TST_EXP_FAIL2();

> +	}
> +
> +	SAFE_CLOSE(fd);
> +}
> +
> +static void cleanup(void)
> +{
> +	if (fd != -1)
> +		SAFE_CLOSE(fd);
> +}
> +
> +static struct tst_test test = {
> +	.cleanup = cleanup,
> +	.needs_root = 1,
> +	.tcnt = ARRAY_SIZE(tcases),
> +	.test = verify_cpuidle,
> +	.save_restore = (const struct tst_path_val[]) {
> +		{ CPUIDLE_PATH "/current_governor", NULL, TST_SR_TCONF },
> +		{}
> +	},
> +};
> diff --git a/testcases/kernel/power_management/runpwtests04.sh b/testcases/kernel/power_management/runpwtests04.sh
> deleted file mode 100755
> index 6565320d2..000000000
> --- a/testcases/kernel/power_management/runpwtests04.sh
> +++ /dev/null
> @@ -1,58 +0,0 @@
> -#! /bin/sh
> -#
> -# Copyright (c) International Business Machines  Corp., 2001
> -# Author: Nageswara R Sastry <[email protected]>
> -#
> -# This program is free software;  you can redistribute it and#or modify
> -# it under the terms of the GNU General Public License as published by
> -# the Free Software Foundation; either version 2 of the License, or
> -# (at your option) any later version.
> -#
> -# This program is distributed in the hope that it will be useful, but
> -# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
> -# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
> -# for more details.
> -#
> -# You should have received a copy of the GNU General Public License
> -# along with this program;  if not, write to the Free Software Foundation,
> -# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
> -#
> -
> -export TCID="Power_Management04"
> -export TST_TOTAL=1
> -
> -. test.sh
> -. pm_include.sh
> -
> -check_cpuidle_sysfs_files() {
> -	RC=0
> -	if [ -d /sys/devices/system/cpu/cpuidle ] ; then
> -		for files in current_governor_ro current_driver
> -		do
> -			cat /sys/devices/system/cpu/cpuidle/${files} \
> -				>/dev/null 2>&1
> -			if [ $? -ne 0 ] ; then
> -				echo "${0}: FAIL: cat ${files}"
> -				RC=1
> -			fi
> -		done
> -	fi
> -	if [ ${RC} -eq 0 ] ; then
> -		echo "${0}: PASS: Checking cpu idle sysfs files"
> -	else
> -		echo "${0}: FAIL: Checking cpu idle sysfs files"
> -	fi
> -	return $RC
> -}
> -
> -# Checking test environment
> -check_arch
> -
> -# Checking cpuidle sysfs interface files
> -if check_cpuidle_sysfs_files ; then
> -	tst_resm TPASS "CPUIDLE sysfs tests passed"
> -else
> -    tst_resm TFAIL "CPUIDLE sysfs tests failed"
> -fi
> -
> -tst_exit
> --
> 2.43.0
> 
> -- 
> Mailing list info: https://lists.linux.it/listinfo/ltp

-- 
Cyril Hrubis
[email protected]

-- 
Mailing list info: https://lists.linux.it/listinfo/ltp
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.