[LTP] [PATCH] [v2, 5/6] syscalls/sysfs: Convert sysfs05 to the new API

sujiaxun sujiaxun@uniontech.com
Fri Aug 13 04:34:25 CEST 2021


Okay thank you. I will carefully modify and resubmit.

在 2021/8/12 下午8:57, Cyril Hrubis 写道:
> 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
> 

-- 
Kind regards,

sujiaxun




More information about the ltp mailing list