[RFC,6/6] syscalls/wait401: Rewrite to the new library

Message ID 20180405145015.7633-7-chrubis@suse.cz
State Accepted
Headers show
Series
  • [RFC,1/6] exit02: Rewrite to new library
Related show

Commit Message

Cyril Hrubis April 5, 2018, 2:50 p.m.
+ Get rid of the sleep(1) in the process

Signed-off-by: Cyril Hrubis <chrubis@suse.cz>
---
 testcases/kernel/syscalls/wait4/wait401.c | 122 +++++++++++-------------------
 1 file changed, 45 insertions(+), 77 deletions(-)

Comments

Jan Stancek April 6, 2018, 8:54 a.m. | #1
----- Original Message -----
> + Get rid of the sleep(1) in the process
> 
> Signed-off-by: Cyril Hrubis <chrubis@suse.cz>

> +	pid = SAFE_FORK();
> +	if (!pid)
> +		exit(0);

This doesn't seem to test that wait4() waits. The child can
end before call to wait4().

What if added call to tst_process_state_wait() to child,
so it waits on parent to sleep? If parent sleeps, then
it's likely waiting on child.

Regards,
Jan
Cyril Hrubis April 9, 2018, 9:44 a.m. | #2
Hi!
> This doesn't seem to test that wait4() waits. The child can
> end before call to wait4().
> 
> What if added call to tst_process_state_wait() to child,
> so it waits on parent to sleep? If parent sleeps, then
> it's likely waiting on child.

That's a good idea, I've changed the test to do exactly that.

OK to commit with the changes you requested or should I resend the fixed
patchset?
Jan Stancek April 13, 2018, 1:40 p.m. | #3
----- Original Message -----
> From: "Cyril Hrubis" <chrubis@suse.cz>
> To: "Jan Stancek" <jstancek@redhat.com>
> Cc: ltp@lists.linux.it
> Sent: Monday, 9 April, 2018 11:44:40 AM
> Subject: Re: [LTP] [RFC PATCH 6/6] syscalls/wait401: Rewrite to the new library
> 
> Hi!
> > This doesn't seem to test that wait4() waits. The child can
> > end before call to wait4().
> > 
> > What if added call to tst_process_state_wait() to child,
> > so it waits on parent to sleep? If parent sleeps, then
> > it's likely waiting on child.
> 
> That's a good idea, I've changed the test to do exactly that.
> 
> OK to commit with the changes you requested or should I resend the fixed
> patchset?

Sorry for delay, I overlooked this email. No need to resend, ACK.

Regards,
Jan

> 
> --
> Cyril Hrubis
> chrubis@suse.cz
>

Patch

diff --git a/testcases/kernel/syscalls/wait4/wait401.c b/testcases/kernel/syscalls/wait4/wait401.c
index 26a5c7002..eb5f41f42 100644
--- a/testcases/kernel/syscalls/wait4/wait401.c
+++ b/testcases/kernel/syscalls/wait4/wait401.c
@@ -1,106 +1,74 @@ 
 /*
+ * Copyright (c) International Business Machines  Corp., 2001
+ * Copyright (c) 2012-2018 Cyril Hrubis <chrubis@suse.cz>
  *
- *   Copyright (c) International Business Machines  Corp., 2001
- *   Copyright (c) 2012 Cyril Hrubis <chrubis@suse.cz>
+ * This program is free software;  you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
  *
- *   This program is free software;  you can redistribute it and/or modify
- *   it under the terms of the GNU General Public License as published by
- *   the Free Software Foundation; either version 2 of the License, or
- *   (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY;  without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
+ * the GNU General Public License for more details.
  *
- *   This program is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
- *   the GNU General Public License for more details.
- *
- *   You should have received a copy of the GNU General Public License
- *   along with this program;  if not, write to the Free Software
- *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * You should have received a copy of the GNU General Public License
+ * along with this program;  if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 /*
- *	wait401 - check that a call to wait4() correctly waits for a child
- *		  process to exit
+ * wait401 - check that a call to wait4() correctly waits for a child
+ *           process to exit
  */
 
-#include "test.h"
-
+#include <stdlib.h>
 #include <errno.h>
 #define _USE_BSD
 #include <sys/types.h>
 #include <sys/resource.h>
 #include <sys/wait.h>
+#include "tst_test.h"
 
-char *TCID = "wait401";
-int TST_TOTAL = 1;
-
-static void cleanup(void);
-static void setup(void);
-
-int main(int ac, char **av)
+static void run(void)
 {
-	int lc;
 	pid_t pid;
 	int status = 1;
 	struct rusage rusage;
 
-	tst_parse_opts(ac, av, NULL, NULL);
-
-	setup();
-
-	for (lc = 0; TEST_LOOPING(lc); lc++) {
-		tst_count = 0;
-
-		pid = FORK_OR_VFORK();
-
-		switch (pid) {
-		case -1:
-			tst_brkm(TBROK, cleanup, "fork() failed");
-			break;
-		case 0:
-			sleep(1);
-			exit(0);
-			break;
-		default:
-			TEST(wait4(pid, &status, 0, &rusage));
-			break;
-		}
+	pid = SAFE_FORK();
+	if (!pid)
+		exit(0);
 
-		if (TEST_RETURN == -1) {
-			tst_brkm(TFAIL, cleanup, "%s call failed - errno = %d "
-				 ": %s", TCID, TEST_ERRNO,
-				 strerror(TEST_ERRNO));
-		}
-
-		if (WIFEXITED(status) == 0) {
-			tst_brkm(TFAIL, cleanup,
-				 "%s call succeeded but "
-				 "WIFEXITED() did not return expected value "
-				 "- %d", TCID, WIFEXITED(status));
-		} else if (TEST_RETURN != pid) {
-			tst_resm(TFAIL, "%s did not return the "
-				 "expected value (%d), actual: %ld",
-				 TCID, pid, TEST_RETURN);
-		} else {
+	TEST(wait4(pid, &status, 0, &rusage));
+	if (TEST_RETURN == -1) {
+		tst_res(TFAIL | TERRNO, "wait4() failed");
+		return;
+	}
 
-			tst_resm(TPASS,
-				 "Received child pid as expected.");
-		}
+	if (TEST_RETURN != pid) {
+		tst_res(TFAIL, "waitpid() returned wrong pid %li, expected %i",
+		        TEST_RETURN, pid);
+	} else {
+		tst_res(TPASS, "waitpid() returned correct pid %i", pid);
+	}
 
-		tst_resm(TPASS, "%s call succeeded", TCID);
+	if (!WIFEXITED(status)) {
+		tst_res(TFAIL, "WIFEXITED() not set in status (%s)",
+		        tst_strstatus(status));
+		return;
 	}
 
-	cleanup();
-	tst_exit();
-}
+	tst_res(TPASS, "WIFEXITED() is set in status");
 
-static void setup(void)
-{
-	tst_sig(FORK, DEF_HANDLER, cleanup);
+	if (WEXITSTATUS(status))
+		tst_res(TFAIL, "WEXITSTATUS() != 0 but %i", WEXITSTATUS(status));
+	else
+		tst_res(TPASS, "WEXITSTATUS() == 0");
 
-	TEST_PAUSE;
 }
 
-static void cleanup(void)
-{
-}
+static struct tst_test test = {
+	.forks_child = 1,
+	.test_all = run,
+};