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