All of lore.kernel.org
 help / color / mirror / Atom feed
From: Richard Palethorpe <rpalethorpe@suse.de>
To: Li Wang <liwang@redhat.com>
Cc: ltp@lists.linux.it
Subject: Re: [LTP] [PATCH v2 2/2] setitimer01: rewrite using new API
Date: Mon, 24 Oct 2022 07:58:44 +0100	[thread overview]
Message-ID: <87edux1z0l.fsf@suse.de> (raw)
In-Reply-To: <20221024024009.3553633-2-liwang@redhat.com>

Hello,

Li Wang <liwang@redhat.com> writes:

>  
> -#include "test.h"
> -
>  #include <errno.h>
>  #include <sys/time.h>
> +#include <stdlib.h>
> +#include "tst_test.h"
> +#include "lapi/syscalls.h"
> +
> +#define USEC1	10000
> +#define USEC2	20000
> +
> +static struct itimerval *value, *ovalue;
> +
> +static struct tcase {
> +	int which;
> +	char *des;
> +	int signo;
> +} tcases[] = {
> +	{ITIMER_REAL,    "ITIMER_REAL",    SIGALRM},
> +	{ITIMER_VIRTUAL, "ITIMER_VIRTUAL", SIGVTALRM},
> +	{ITIMER_PROF,    "ITIMER_PROF",    SIGPROF},
> +};
> +
> +static int sys_setitimer(int which, void *new_value, void *old_value)
> +{
> +	return tst_syscall(__NR_setitimer, which, new_value, old_value);
> +}
> +
> +static void set_setitimer_value(int usec, int o_usec)
> +{
> +	value->it_value.tv_sec = 0;
> +	value->it_value.tv_usec = usec;
> +	value->it_interval.tv_sec = 0;
> +	value->it_interval.tv_usec = 0;
> +
> +	ovalue->it_value.tv_sec = o_usec;
> +	ovalue->it_value.tv_usec = o_usec;
> +	ovalue->it_interval.tv_sec = 0;
> +	ovalue->it_interval.tv_usec = 0;
> +}
>  
> -void cleanup(void);
> -void setup(void);
> +static void verify_setitimer(unsigned int i)
> +{
> +	pid_t pid;
> +	int status;
> +	struct tcase *tc = &tcases[i];
>  
> -char *TCID = "setitimer01";
> -int TST_TOTAL = 1;
> +	pid = SAFE_FORK();
>  
> -#define SEC0	0
> -#define SEC1	20
> -#define SEC2	40
> +	if (pid == 0) {
> +		tst_res(TINFO, "tc->which = %s", tc->des);
>  
> -int main(int ac, char **av)
> -{
> -	int lc;
> -	struct itimerval *value, *ovalue;
> -
> -	tst_parse_opts(ac, av, NULL, NULL);
> -
> -	setup();		/* global setup */
> -
> -	/* The following loop checks looping state if -i option given */
> -
> -	for (lc = 0; TEST_LOOPING(lc); lc++) {
> -		/* reset tst_count in case we are looping */
> -		tst_count = 0;
> -
> -		/* allocate some space for the timer structures */
> -
> -		if ((value = malloc((size_t)sizeof(struct itimerval))) ==
> -		    NULL) {
> -			tst_brkm(TBROK, cleanup, "value malloc failed");
> -		}
> -
> -		if ((ovalue = malloc((size_t)sizeof(struct itimerval))) ==
> -		    NULL) {
> -			tst_brkm(TBROK, cleanup, "ovalue malloc failed");
> -		}
> -
> -		/* set up some reasonable values */
> -
> -		value->it_value.tv_sec = SEC1;
> -		value->it_value.tv_usec = SEC0;
> -		value->it_interval.tv_sec = 0;
> -		value->it_interval.tv_usec = 0;
> -		/*
> -		 * issue the system call with the TEST() macro
> -		 * ITIMER_REAL = 0, ITIMER_VIRTUAL = 1 and ITIMER_PROF = 2
> -		 */
> -
> -		TEST(setitimer(ITIMER_REAL, value, ovalue));
> -
> -		if (TEST_RETURN != 0) {
> -			tst_resm(TFAIL, "call failed - errno = %d - %s",
> -				 TEST_ERRNO, strerror(TEST_ERRNO));
> -			continue;
> -		}
> -
> -		/*
> -		 * call setitimer again with new values.
> -		 * the old values should be stored in ovalue
> -		 */
> -		value->it_value.tv_sec = SEC2;
> -		value->it_value.tv_usec = SEC0;
> -
> -		if ((setitimer(ITIMER_REAL, value, ovalue)) == -1) {
> -			tst_brkm(TBROK, cleanup, "second setitimer "
> -				 "call failed");
> -		}
> -
> -		if (ovalue->it_value.tv_sec <= SEC1) {
> -			tst_resm(TPASS, "functionality is correct");
> -		} else {
> -			tst_brkm(TFAIL, cleanup, "old timer value is "
> -				 "not equal to expected value");
> -		}
> -	}
> +		tst_no_corefile(0);
>  
> -	cleanup();
> -	tst_exit();
> -}
> +		set_setitimer_value(USEC1, 0);
> +		TST_EXP_PASS(sys_setitimer(tc->which, value, NULL));
>  
> -/*
> - * setup() - performs all the ONE TIME setup for this test.
> - */
> -void setup(void)
> -{
> +		set_setitimer_value(USEC2, USEC2);
> +		TST_EXP_PASS(sys_setitimer(tc->which, value, ovalue));
>  
> -	tst_sig(NOFORK, DEF_HANDLER, cleanup);
> +		if (ovalue->it_value.tv_sec != 0 || ovalue->it_value.tv_usec >= USEC2)
> +			tst_brk(TFAIL, "old timer value is not within
> the expected range");

Maybe we could split testing the return value and ovalue from testing
the signal is delivered?

When testing the return value and ovalue; a very long timeout can be
used (which is never hit). When testing the signal a very short one can
be used.

This way, the test is not racing with the signal and the loop below
won't be executed much.

In any case LGTM

Reviewed-by: Richard Palethorpe <rpalethorpe@suse.com>

>  
> -	TEST_PAUSE;
> -}
> +		for (;;)
> +			;
> +	}
>  
> -/*
> - * cleanup() - performs all the ONE TIME cleanup for this test at completion
> - * 	       or premature exit.
> - */
> -void cleanup(void)
> -{
> +	SAFE_WAITPID(pid, &status, 0);
>  
> +	if (WIFSIGNALED(status) && WTERMSIG(status) == tc->signo)
> +		tst_res(TPASS, "Child received signal: %s", tst_strsig(tc->signo));
> +	else
> +		tst_res(TFAIL, "Child: %s", tst_strstatus(status));
>  }
> +
> +static struct tst_test test = {
> +	.tcnt = ARRAY_SIZE(tcases),
> +	.forks_child = 1,
> +	.test = verify_setitimer,
> +	.bufs = (struct tst_buffers[]) {
> +		{&value,  .size = sizeof(struct itimerval)},
> +		{&ovalue, .size = sizeof(struct itimerval)},
> +		{}
> +	}
> +};
> -- 
> 2.35.3


-- 
Thank you,
Richard.

-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

  reply	other threads:[~2022-10-24  7:06 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-10-09  8:57 [LTP] [PATCH] setitimer01: rewrite using new API Li Wang
2022-10-20  8:42 ` Richard Palethorpe
2022-10-20 10:00   ` Li Wang
2022-10-24  2:23   ` Li Wang
2022-10-24  2:40 ` [LTP] [PATCH v2 1/2] setitimer03: convert to " Li Wang
2022-10-24  2:40   ` [LTP] [PATCH v2 2/2] setitimer01: rewrite using " Li Wang
2022-10-24  6:58     ` Richard Palethorpe [this message]
2022-10-24  8:41       ` Li Wang
2022-10-24  6:52   ` [LTP] [PATCH v2 1/2] setitimer03: convert to " Richard Palethorpe

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87edux1z0l.fsf@suse.de \
    --to=rpalethorpe@suse.de \
    --cc=liwang@redhat.com \
    --cc=ltp@lists.linux.it \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.