[LTP] [PATCH] [v2, 5/6] syscalls/sysfs: Convert sysfs05 to the new API
Cyril Hrubis
chrubis@suse.cz
Thu Aug 12 14:57:41 CEST 2021
Hi!
> -char *TCID = "sysfs05";
> -static int option[3] = { 1, 4, 1 }; /* valid and invalid option */
> -static char *fsname[] = { "ext0", " ext2", (char *)-1 };
> -
> -static struct test_case_t {
> - char *err_desc; /*error description */
> - int exp_errno; /* expected error number */
> - char *exp_errval; /*Expected errorvalue string */
> -} testcase[] = {
> - {
> - "Invalid option", EINVAL, "EINVAL"}, {
> - "Invalid filesystem name", EINVAL, "EINVAL "}, {
> - "Address is out of your address space", EFAULT, "EFAULT "}
> +
> +char *bad_addr;
> +
> +static struct test_case {
> + int option;
> + char *fsname;
> + int fsindex;
> + char *err_desc;
> + int exp_errno;
> +} tcases[] = {
> + {1, "ext0", 0, "Invalid filesystem name", EINVAL},
> + {4, "ext4", 0, "Invalid option", EINVAL},
> + {1, (char *)-1, 0, "Address is out of your address space", EFAULT},
> + {2, NULL, 1000, "fs_index is out of bounds", EINVAL}
> };
>
> -int TST_TOTAL = ARRAY_SIZE(testcase);
> -
> -int main(int ac, char **av)
> +static void verify_sysfs05(unsigned int nr)
> {
> - int lc, i;
> -
> - tst_parse_opts(ac, av, NULL, NULL);
> -
> - setup();
> -
> - for (lc = 0; TEST_LOOPING(lc); lc++) {
> -
> - for (i = 0; i < TST_TOTAL; i++) {
> -
> - tst_count = 0;
> - TEST(ltp_syscall(__NR_sysfs, option[i], fsname[i]));
> +
> + if (nr < 3)
> + TST_EXP_FAIL(tst_syscall(__NR_sysfs, tcases[nr].option, tcases[nr].fsname),
> + tcases[nr].exp_errno, "%s", tcases[nr].err_desc);
> + else
> + TST_EXP_FAIL(tst_syscall(__NR_sysfs, tcases[nr].option, tcases[nr].fsindex, bad_addr),
> + tcases[nr].exp_errno, "%s", tcases[nr].err_desc);
Depending on the index here is ugly hack and there is absolutelly no
reason to do so. We can switch on the option easily instead with:
if (tcases[nr].option == 1) {
/* call with fsname */
} else {
/* call with fs index */
}
Also tests usually store a pointer to the current testcases at the start
of the verify function to make the code slightly shorter as:
static void verify_foo(unsigned int n)
{
struct tcase *tc = &tcases[n];
if (tc->option == 1) {
...
}
> - /* check return code */
> - if ((TEST_RETURN == -1)
> - && (TEST_ERRNO == testcase[i].exp_errno)) {
> - tst_resm(TPASS,
> - "sysfs(2) expected failure;"
> - " Got errno - %s : %s",
> - testcase[i].exp_errval,
> - testcase[i].err_desc);
> - } else {
> - tst_resm(TFAIL, "sysfs(2) failed to produce"
> - " expected error; %d, errno"
> - ": %s and got %d",
> - testcase[i].exp_errno,
> - testcase[i].exp_errval, TEST_ERRNO);
> - }
> -
> - } /*End of TEST LOOPS */
> - }
> -
> - /*Clean up and exit */
> - cleanup();
> -
> - tst_exit();
> -} /*End of main */
> +}
>
> -/* setup() - performs all ONE TIME setup for this test */
> void setup(void)
missing static
> {
> -
> - tst_sig(NOFORK, DEF_HANDLER, cleanup);
> -
> - TEST_PAUSE;
> + bad_addr = tst_get_bad_addr(NULL);
Isn't the bad address unused here?
What we should do instead is to loop over the tcases array here and set
the fsname to the bad address when exp_errno is set to EFAULT.
> }
>
> -/*
> -* cleanup() - Performs one time cleanup for this test at
> -* completion or premature exit
> -*/
> -void cleanup(void)
> -{
> +static struct tst_test test = {
> + .setup = setup,
> + .tcnt = ARRAY_SIZE(tcases),
> + .test = verify_sysfs05,
> +};
>
> -}
> --
> 2.20.1
>
>
>
>
> --
> Mailing list info: https://lists.linux.it/listinfo/ltp
--
Cyril Hrubis
chrubis@suse.cz
More information about the ltp
mailing list