[LTP] [RFC PATCH 1/6] exit02: Rewrite to new library

Cyril Hrubis chrubis@suse.cz
Thu Apr 5 16:50:10 CEST 2018


We get rid of the ridiculous sleep(2) in the test as a side effect.

Signed-off-by: Cyril Hrubis <chrubis@suse.cz>
---
 testcases/kernel/syscalls/exit/exit02.c | 249 ++++++++------------------------
 1 file changed, 60 insertions(+), 189 deletions(-)

diff --git a/testcases/kernel/syscalls/exit/exit02.c b/testcases/kernel/syscalls/exit/exit02.c
index 7858c894d..8143870e8 100644
--- a/testcases/kernel/syscalls/exit/exit02.c
+++ b/testcases/kernel/syscalls/exit/exit02.c
@@ -1,212 +1,83 @@
 /*
+ * Copyright (c) International Business Machines  Corp., 2001
+ *    07/2001 Ported by Wayne Boyer
+ * Copyright (c) 2018 Cyril Hrubis <chrubis@suse.cz>
  *
- *   Copyright (c) International Business Machines  Corp., 2001
+ * 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
  */
-
 /*
- * NAME
- * 	exit02.c
- *
- * DESCRIPTION
- *	Check that exit flushes output file buffers and closes files upon
- *	exitting
- *
- * ALGORITHM
- * 	Fork a process that creates a file and writes a few bytes, and
- * 	calls exit WITHOUT calling close(). The parent then reads the
- * 	file.  If everything that was written is present in the file, then
- *	the test passes.
- *
- * USAGE
- * 	exit02
- *
- * HISTORY
- *	07/2001 Ported by Wayne Boyer
- *
- * RESTRICTIONS
- * 	None
+ * Fork a process that creates a file and writes a few bytes, and
+ * calls exit WITHOUT calling close(). The parent then reads the
+ * file.  If everything that was written is present in the file, then
+ * the test passes.
  */
-#include <sys/types.h>
-#include <sys/wait.h>
-#include <sys/stat.h>
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-#include <signal.h>
-#include <fcntl.h>
-#include <string.h>
-#include "test.h"
-
-void cleanup(void);
-void setup(void);
-
-char *TCID = "exit02";
-int TST_TOTAL = 1;
-
-#define READ  0
-#define WRITE 1
-#define MODE 0666
-
-char filen[40];
-
-int main(int ac, char **av)
+
+#include <stdlib.h>
+#include "tst_test.h"
+
+#define FNAME "test_file"
+
+static void child_write(void)
 {
-	int pid, npid, sig, nsig, exno, nexno, status;
-	int filed;
-	char wbuf[BUFSIZ], rbuf[BUFSIZ];
-	int len, rlen;
-	int rval = 0;
-	int lc;
-
-	/*
-	 * parse standard options
-	 */
-	tst_parse_opts(ac, av, NULL, NULL);
-
-	setup();		/* global setup for test */
-
-	/*
-	 * 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;
-
-		strcpy(wbuf, "abcd");
-		len = strlen(wbuf);
-
-		exno = sig = 0;
-
-		if ((pid = FORK_OR_VFORK()) == -1)
-			tst_brkm(TBROK | TERRNO, cleanup, "fork() failed");
-
-		if (pid == 0) {	/* child */
-			sleep(1);
-			if ((filed = creat(filen, MODE)) == -1) {
-				tst_resm(TINFO, "creat error: unable to"
-					 "open output file");
-				exit(2);
-			}
-			if (write(filed, wbuf, len) != len) {
-				tst_resm(TINFO, "write error");
-				exit(2);
-			}
-			exit(exno);
-		} else {	/* parent */
-			npid = wait(&status);
-
-			if (npid != pid) {
-				tst_resm(TFAIL, "wait error: "
-					 "unexpected pid returned");
-				rval = 1;
-			}
-
-			nsig = status % 256;
-
-			/*
-			 * to check if the core dump bit has been
-			 * set, bit # 7
-			 */
-			if (nsig >= 128)
-				nsig = nsig - 128;
-
-			/*
-			 * nsig is the signal number returned by
-			 * wait
-			 */
-			if (nsig != sig) {
-				tst_resm(TFAIL, "wait error: unexpected "
-					 "signal returned %d", nsig);
-				rval = 1;
-			}
-
-			/*
-			 * nexno is the exit number returned by wait
-			 */
-			nexno = status / 256;
-			if (nexno != exno) {
-				tst_resm(TFAIL, "wait error: unexpected exit "
-					 "number %d", nexno);
-				rval = 1;
-			}
-
-			sleep(2);	/* let child's exit close opened file */
-
-			filed = open(filen, O_RDONLY, READ);
-			if (filed == -1) {
-				tst_resm(TFAIL, "open error: "
-					 "unable to open input file");
-				rval = 1;
-			} else {
-				rlen = read(filed, rbuf, len);
-				if (len != rlen) {
-					tst_resm(TFAIL, "exit error: file "
-						 "buffer was not flushed");
-					rval = 1;
-				} else if (strncmp(rbuf, wbuf, len) != 0) {
-					tst_resm(TFAIL, "exit error: file "
-						 "buffer was not flushed");
-					rval = 1;
-				}
-			}
-			close(filed);
-			unlink(filen);
-		}
-		if (!rval) {
-			tst_resm(TPASS, "exit() test PASSED");
-		}
-	}
-	cleanup();
-	tst_exit();
+	int fd;
+
+	fd = SAFE_CREAT(FNAME, 0666);
+	SAFE_WRITE(1, fd, FNAME, sizeof(FNAME));
+	exit(0);
 }
 
-/*
- * setup() - perform all ONE TIME setup for this test
- */
-void setup(void)
+static void check_file(void)
 {
+	int fd, len;
+	char buf[256];
 
-	tst_sig(FORK, DEF_HANDLER, cleanup);
+	fd = SAFE_OPEN(FNAME, O_RDONLY);
+	len = SAFE_READ(0, fd, buf, sizeof(buf));
 
-	umask(0);
+	if (len != sizeof(FNAME)) {
+		tst_res(TFAIL, "Wrong length %i expected %zu", len, sizeof(buf));
+		return;
+	}
 
-	TEST_PAUSE;
+	if (memcmp(buf, FNAME, sizeof(FNAME))) {
+		tst_res(TFAIL, "Wrong data read back");
+		return;
+	}
 
-	tst_tmpdir();
+	SAFE_CLOSE(fd);
 
-	sprintf(filen, "tfile_%d", getpid());
+	tst_res(TPASS, "File written by child read back correctly");
 }
 
-/*
- * cleanup() - performs all ONE TIME cleanup for this test at completion or
- *	       premature exit.
- */
-void cleanup(void)
+static void run(void)
 {
+	int pid;
 
-	/*
-	 * Remove tmp dir and all files in it
-	 */
-	tst_rmdir();
+	pid = SAFE_FORK();
+	if (!pid)
+		child_write();
 
-	/*
-	 * exit with return code appropriate for results
-	 */
+	tst_reap_children();
 
+	check_file();
+
+	SAFE_UNLINK(FNAME);
 }
+
+static struct tst_test test = {
+	.needs_tmpdir = 1,
+	.forks_child = 1,
+	.test_all = run,
+};
-- 
2.13.6



More information about the ltp mailing list