[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