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

Cyril Hrubis chrubis@suse.cz
Fri Jul 10 16:20:24 CEST 2026


>  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 <always.starving0@gmail.com>
> + */
> +
> +/*\
> + * 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 <nasastry@in.ibm.com>
> -#
> -# 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
chrubis@suse.cz


More information about the ltp mailing list