On 06.11.2016 17:38, Robert Elz wrote: > Date: Sun, 6 Nov 2016 15:03:31 +0000 > From: "Kamil Rytarowski" <kamil%netbsd.org@localhost> > Message-ID: <20161106150331.25FB2FBA6%cvs.NetBSD.org@localhost> > > | The t_wait_noproc_wnohang adds to options (except wait(2), wait3(2)) > > Why exclude wait3() ? (Not that it really matters, wait3() and wait4() > are the same thing modulo the pid paramater, which isn't being used here) > This was my mistake, I will correct it. > Could you also add tests (for wait4() and later, not wait() or wait3()) > where the process has a child, but the pid parameter (which is why not > wait() or wait3() as there isn't one) is not the pid of the child ? > > Also test (for wait3() and later) the WNOHANG case where the child > exists, but has not exited yet ... > > When you do that you also need to do a wait to clean up the child when > it exits ... you get to also test wait returning a value, as the child > should just sleep, then once the first waits (not expected to fetch > the process are finished) kill() the child to avoid waiting for the > sleep() to finish (delaying the test needlessly and perhaps getting > caught up in the qemu timing issues) and what's more you get to check > that the exit reason and signal number are correct (note that for waitid() > you need to supply, and use, a siginfo_t to get the values, and should > for wait6() as well - and verify both it, and wait6's status arg). > > The basic model should be ... > > child = fork(); /* test for -1 ... */ > if (child == 0) { > sleep(10); /* plenty long enough */ > _exit(0); > } > pid = waitpid(child+10, ...); /* expect error */ > pid = waitpid(child, WNOHANG); /* expect 0 */ > kill(child, SIGTERM); > pid = waitpid(child, &status, ...); /* expect child */ > /* expect WIFSIGNALLED(status), and WTERMSIG(status)==SIGTERM) > > you can deal with this in one generic function to do the work, > and N helper functions that do the waits using their different arg > sequences - where all the helper funcs have the same arg lists (even > down to a siginfo_t inall of them) so you can then just call the > generic routine N times, with each of the N different wait funcs > as an arg, like > > int generic_func( int waitfunc(int, int, int *, siginfo_t *), > int flags, int *status, siginfo_t *si) { > { > /* then as above, except instead of calling waitpid() > you would do > pid = (*waitfunc)(child+10, flags, status, si); /* + checks */ > pid = (*waitfunc)(child, flags|WNOHANG, status, si); /* +...*/ > pid = (*waitfunc)(child, flags, status, si); /* check pid==child */ > return pid; /* then return as rest of checking > depends on which wait func was used */ > > } > > or something along those lines, and call that as > > then implement > waitpid_func(int child, int flags, int *status, siginfo_t *si) > { > return waitpid(child, status, flags); /* si is unused here */ > } > (and so on for the others), and then call > > pid = generic_func(waitpid, WNOHANG, &status, &si); > /* validate results in status - si ignored of course */ > pid = generic_func(waitid, WNOHANG, &status, &si); > /* validate results (from si), expect 0 from final pid, > ignore unused status */ > /*etc etc*/ > > (details need to be fleshed out!) > > > I am not yet certain that the current behaviour of wait6() and waitid() > is actually wrong, so the expected result, and expect_fail for those ones > might be premature. > > kre > Thank you for good suggestions. I will add them once t_ptrace_wait* family of tests will land the sources. I have also other tests in mind in the t_wait* family and I will add them too. I need to go out for few hours and unless there will be issues in the code I plan to finish everything mentioned above tonight.
Attachment:
signature.asc
Description: OpenPGP digital signature