[LTP] [PATCH 1/1] testcases/mq_notify01: convert to use new test library API

Petr Vorel pvorel@suse.cz
Mon Nov 21 09:13:27 CET 2016


Signed-off-by: Petr Vorel <pvorel@suse.cz>
---
Debug switch was broken. It might be better just to remove the flag and
print it all the time.
I should have rewritten it more (goto is ugly).
---
 testcases/kernel/syscalls/mq_notify/mq_notify01.c | 277 +++++++---------------
 1 file changed, 92 insertions(+), 185 deletions(-)

diff --git a/testcases/kernel/syscalls/mq_notify/mq_notify01.c b/testcases/kernel/syscalls/mq_notify/mq_notify01.c
index 1f1d4f6..9dd073f 100644
--- a/testcases/kernel/syscalls/mq_notify/mq_notify01.c
+++ b/testcases/kernel/syscalls/mq_notify/mq_notify01.c
@@ -1,31 +1,20 @@
-/******************************************************************************/
-/* Copyright (c) Crackerjack Project., 2007-2008 ,Hitachi, Ltd		      */
-/*	  Author(s): Takahiro Yasui <takahiro.yasui.mp@hitachi.com>,	      */
-/*		       Yumiko Sugita <yumiko.sugita.yf@hitachi.com>,          */
-/*		       Satoshi Fujiwara <sa-fuji@sdl.hitachi.co.jp>	      */
-/* Porting from Crackerjack to LTP is done by		                      */
-/*         Manas Kumar Nayak maknayak@in.ibm.com>			      */
-/*								              */
-/* 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.			      */
-/*									      */
-/* 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           */
-/*									      */
-/******************************************************************************/
-/******************************************************************************/
-/*									      */
-/* Description: This tests the mq_notify() syscall			      */
-/*									      */
-/******************************************************************************/
+/*
+ * Copyright (c) Crackerjack Project., 2007-2008 ,Hitachi, Ltd
+ *          Author(s): Takahiro Yasui <takahiro.yasui.mp@hitachi.com>,
+ *		       Yumiko Sugita <yumiko.sugita.yf@hitachi.com>,
+ *		       Satoshi Fujiwara <sa-fuji@sdl.hitachi.co.jp>
+ * Copyright (c) 2016 Linux Test Project
+ *
+ * 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.
+ */
 #define _XOPEN_SOURCE 600
 #include <sys/syscall.h>
 #include <sys/types.h>
@@ -43,30 +32,12 @@
 #include <stdlib.h>
 #include <fcntl.h>
 
-#include "../utils/include_j_h.h"
-
-#include "test.h"
 #include "linux_syscall_numbers.h"
+#include "tst_test.h"
 
-char *TCID = "mq_notify01";
-int testno;
-int TST_TOTAL = 1;
-
-static void cleanup(void)
-{
-	tst_rmdir();
-}
-
-static void setup(void)
-{
-	TEST_PAUSE;
-	tst_tmpdir();
-}
-
-#define SYSCALL_NAME    "mq_notify"
-
+static char *str_debug;
 static int opt_debug;
-static char *progname;
+
 static int notified;
 static int cmp_ok;
 
@@ -81,6 +52,7 @@ enum test_type {
 struct test_case {
 	int notify;
 	int ttype;
+	const char *desc;	   /* test description (name) */
 	int ret;
 	int err;
 };
@@ -88,63 +60,70 @@ struct test_case {
 #define MAX_MSGSIZE     8192
 #define MSG_SIZE	16
 #define USER_DATA       0x12345678
+#define QUEUE_NAME	"/test_mqueue"
+
+
+#define TYPE_NAME(x) .ttype = x, .desc = #x
 
 static struct test_case tcase[] = {
-	{			// case00
-	 .ttype = NORMAL,
+	{
+	 TYPE_NAME(NORMAL),
 	 .notify = SIGEV_NONE,
 	 .ret = 0,
 	 .err = 0,
 	 },
-	{			// case01
-	 .ttype = NORMAL,
+	{
+	 TYPE_NAME(NORMAL),
 	 .notify = SIGEV_SIGNAL,
 	 .ret = 0,
 	 .err = 0,
 	 },
-	{			// case02
-	 .ttype = NORMAL,
+	{
+	 TYPE_NAME(NORMAL),
 	 .notify = SIGEV_THREAD,
 	 .ret = 0,
 	 .err = 0,
 	 },
-	{			// case03
-	 .ttype = FD_NONE,
+	{
+	 TYPE_NAME(FD_NONE),
 	 .notify = SIGEV_NONE,
 	 .ret = -1,
 	 .err = EBADF,
 	 },
-	{			// case04
-	 .ttype = FD_NOT_EXIST,
+	{
+	 TYPE_NAME(FD_NOT_EXIST),
 	 .notify = SIGEV_NONE,
 	 .ret = -1,
 	 .err = EBADF,
 	 },
-	{			// case05
-	 .ttype = FD_FILE,
+	{
+	 TYPE_NAME(FD_FILE),
 	 .notify = SIGEV_NONE,
 	 .ret = -1,
 	 .err = EBADF,
 	 },
-	{			// case06
-	 .ttype = ALREADY_REGISTERED,
+	{
+	 TYPE_NAME(ALREADY_REGISTERED),
 	 .notify = SIGEV_NONE,
 	 .ret = -1,
 	 .err = EBUSY,
 	 },
 };
 
+static void setup(void)
+{
+	opt_debug = str_debug ? 1 : 0;
+}
+
 static void sigfunc(int signo, siginfo_t * info, void *data)
 {
 	if (opt_debug) {
-		tst_resm(TINFO, "si_code  E:%d,\tR:%d", info->si_code,
-			 SI_MESGQ);
-		tst_resm(TINFO, "si_signo E:%d,\tR:%d", info->si_signo,
-			 SIGUSR1);
-		tst_resm(TINFO, "si_value E:0x%x,\tR:0x%x",
+		tst_res(TINFO, "si_code  E:%d,\tR:%d", info->si_code, SI_MESGQ);
+		tst_res(TINFO, "si_signo E:%d,\tR:%d", info->si_signo, SIGUSR1);
+		tst_res(TINFO, "si_value E:0x%x,\tR:0x%x",
 			 info->si_value.sival_int, USER_DATA);
-		tst_resm(TINFO, "si_pid   E:%d,\tR:%d", info->si_pid, getpid());
-		tst_resm(TINFO, "si_uid   E:%d,\tR:%d", info->si_uid, getuid());
+		tst_res(TINFO, "si_pid   E:%d,\tR:%d", info->si_pid, getpid());
+		tst_res(TINFO, "si_uid   E:%d,\tR:%d", info->si_uid, getuid());
 	}
 	cmp_ok = info->si_code == SI_MESGQ &&
 	    info->si_signo == SIGUSR1 &&
@@ -159,16 +138,16 @@ static void tfunc(union sigval sv)
 	notified = 1;
 }
 
-static int do_test(struct test_case *tc)
+static void do_test(unsigned int i)
 {
 	int sys_ret;
 	int sys_errno;
-	int result = RESULT_OK;
-	int rc, i, fd = -1;
+	int rc, j, fd = -1;
 	struct sigevent ev;
 	struct sigaction sigact;
 	struct timespec abs_timeout;
 	char smsg[MAX_MSGSIZE];
+	struct test_case *tc = &tcase[i];
 
 	notified = cmp_ok = 1;
 
@@ -191,28 +170,20 @@ static int do_test(struct test_case *tc)
 	case FD_FILE:
 		TEST(fd = open("/", O_RDONLY));
 		if (TEST_RETURN < 0) {
-			tst_resm(TFAIL, "can't open \"/\".");
-			result = 1;
-			goto EXIT;
+			tst_res(TFAIL, "can't open \"/\".");
+			goto CLEANUP;
 		}
 		break;
 	default:
-		/*
-		 * Open message queue
-		 */
 		TEST(fd =
 		     mq_open(QUEUE_NAME, O_CREAT | O_EXCL | O_RDWR, S_IRWXU,
 			     NULL));
 		if (TEST_RETURN < 0) {
-			tst_resm(TFAIL | TTERRNO, "mq_open failed");
-			result = 1;
-			goto EXIT;
+			tst_res(TFAIL | TTERRNO, "mq_open failed");
+			goto CLEANUP;
 		}
 	}
 
-	/*
-	 * Set up struct sigevent
-	 */
 	ev.sigev_notify = tc->notify;
 
 	switch (tc->notify) {
@@ -237,9 +208,8 @@ static int do_test(struct test_case *tc)
 	if (tc->ttype == ALREADY_REGISTERED) {
 		TEST(rc = mq_notify(fd, &ev));
 		if (TEST_RETURN < 0) {
-			tst_resm(TFAIL | TTERRNO, "mq_notify failed");
-			result = 1;
-			goto EXIT;
+			tst_res(TFAIL | TTERRNO, "mq_notify failed");
+			goto CLEANUP;
 		}
 	}
 
@@ -249,111 +219,48 @@ static int do_test(struct test_case *tc)
 	errno = 0;
 	sys_ret = mq_notify(fd, &ev);
 	sys_errno = errno;
-	if (sys_ret < 0)
-		goto TEST_END;
+	if (sys_ret >= 0) {
+		/*
+		 * Prepare send message
+		 */
+		for (j = 0; j < MSG_SIZE; j++)
+			smsg[j] = j;
+		TEST(rc = mq_timedsend(fd, smsg, MSG_SIZE, 0, &abs_timeout));
+		if (rc < 0) {
+			tst_res(TFAIL | TTERRNO, "mq_timedsend failed");
+			goto CLEANUP;
+		}
 
-	/*
-	 * Prepare send message
-	 */
-	for (i = 0; i < MSG_SIZE; i++)
-		smsg[i] = i;
-	TEST(rc = mq_timedsend(fd, smsg, MSG_SIZE, 0, &abs_timeout));
-	if (rc < 0) {
-		tst_resm(TFAIL | TTERRNO, "mq_timedsend failed");
-		result = 1;
-		goto EXIT;
+		while (!notified)
+			usleep(10000);
 	}
 
-	while (!notified)
-		usleep(10000);
-
-TEST_END:
-	/*
-	 * Check results
-	 */
-	result |= (sys_ret != 0 && sys_errno != tc->err) || !cmp_ok;
-	PRINT_RESULT_CMP(sys_ret >= 0, tc->ret, tc->err, sys_ret, sys_errno,
-			 cmp_ok);
+	if ((sys_ret != 0 && sys_errno != tc->err) || !cmp_ok) {
+		tst_res(TFAIL, "%s r/w check returned: %d, expected: %d,"
+			" returned errno: %s (%d), expected errno: %s (%d)",
+			tc->desc, sys_ret, tc->ret, tst_strerrno(sys_errno),
+			sys_errno, tst_strerrno(tc->err), tc->err);
+	} else {
+		tst_res(TPASS, "%s returned: %d", tc->desc, sys_ret);
+	}
 
-EXIT:
+CLEANUP:
 	if (fd >= 0) {
 		close(fd);
 		mq_unlink(QUEUE_NAME);
 	}
-
-	return result;
 }
 
-static void usage(const char *progname)
-{
-	tst_resm(TINFO, "usage: %s [options]", progname);
-	tst_resm(TINFO, "This is a regression test program of %s system call.",
-		 SYSCALL_NAME);
-	tst_resm(TINFO, "options:");
-	tst_resm(TINFO, "    -d --debug	   Show debug messages");
-	tst_resm(TINFO, "    -h --help	    Show this message");
-}
-
-int main(int ac, char **av)
-{
-	int result = RESULT_OK;
-	int c;
-	int i;
-	int lc;
-
-	struct option long_options[] = {
-		{"debug", no_argument, 0, 'd'},
-		{"help", no_argument, 0, 'h'},
-		{NULL, 0, NULL, 0}
-	};
-
-	progname = basename(av[0]);
-
-	tst_parse_opts(ac, av, NULL, NULL);
-
-	setup();
-
-	for (lc = 0; TEST_LOOPING(lc); ++lc) {
-		tst_count = 0;
-		for (testno = 0; testno < TST_TOTAL; ++testno) {
-			TEST(c = getopt_long(ac, av, "dh", long_options, NULL));
-			while (TEST_RETURN != -1) {
-				switch (c) {
-				case 'd':
-					opt_debug = 1;
-					break;
-				default:
-					usage(progname);
-				}
-			}
-
-			if (ac != optind) {
-				tst_resm(TINFO, "Options are not match.");
-				usage(progname);
-			}
-
-			for (i = 0; i < (int)(sizeof(tcase) / sizeof(tcase[0]));
-			     i++) {
-				int ret;
-				tst_resm(TINFO, "(case%02d) START", i);
-				ret = do_test(&tcase[i]);
-				tst_resm(TINFO, "(case%02d) END => %s",
-					 i, (ret == 0) ? "OK" : "NG");
-				result |= ret;
-			}
-
-			switch (result) {
-			case RESULT_OK:
-				tst_resm(TPASS, "mq_notify call succeeded");
-				break;
-
-			default:
-				tst_brkm(TFAIL, cleanup, "mq_notify failed");
-				break;
-			}
+static struct tst_option options[] = {
+	{"d", &str_debug, "Print debug messages"},
+	{NULL, NULL, NULL}
+};
 
-		}
-	}
-	cleanup();
-	tst_exit();
-}
+static struct tst_test test = {
+	.tid = "mq_notify01",
+	.tcnt = ARRAY_SIZE(tcase),
+	.test = do_test,
+	.options = options,
+	.needs_tmpdir = 1,
+	.setup = setup,
+};
-- 
2.10.2



More information about the ltp mailing list