public inbox for ltp@lists.linux.it
 help / color / mirror / Atom feed
From: DAN LI <li.dan@cn.fujitsu.com>
To: ltp-list@lists.sourceforge.net
Subject: [LTP]  [PATCH V3 2/2] shmctl/shmctl01.c: Test features IPC_INFO, SHM_STAT, SHM_LOCK and SHM_UNLOCK.
Date: Fri, 24 May 2013 17:50:07 +0800	[thread overview]
Message-ID: <519F37CF.4030209@cn.fujitsu.com> (raw)
In-Reply-To: <519DD4ED.3090907@cn.fujitsu.com>



Additional tests for features IPC_INFO, SHM_STAT, SHM_LOCK and SHM_UNLOCK.


Signed-off-by: DAN LI <li.dan@cn.fujitsu.com>
---
 testcases/kernel/syscalls/ipc/shmctl/shmctl01.c | 96 +++++++++++++++++++++----
 1 file changed, 81 insertions(+), 15 deletions(-)

Hi,
Jan

How about this V3?

Regards,
DAN LI


diff --git a/testcases/kernel/syscalls/ipc/shmctl/shmctl01.c b/testcases/kernel/syscalls/ipc/shmctl/shmctl01.c
index 34ff30c..cba1a1d 100644
--- a/testcases/kernel/syscalls/ipc/shmctl/shmctl01.c
+++ b/testcases/kernel/syscalls/ipc/shmctl/shmctl01.c
@@ -43,13 +43,18 @@
  *	call cleanup
  */

+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
 #include "ipcshm.h"
 #include "libtestsuite.h"

 char *TCID = "shmctl01";

 static int shm_id_1 = -1;
+static int shm_index;
 static struct shmid_ds buf;
+static struct shminfo info;
 static long save_time;

 #define FIRST	0
@@ -64,34 +69,52 @@ static pid_t pid_arr[N_ATTACH];
 static int sync_pipes[2];

 /* Setup, cleanup and check routines for IPC_STAT */
-static void stat_setup(void), func_stat(void);
+static void stat_setup(void), func_istat(int ret);
 static void stat_cleanup(void);

 /* Setup and check routines for IPC_SET */
-static void set_setup(void), func_set(void);
+static void set_setup(void), func_set(int ret);
+
+/* Check routine for IPC_INFO */
+static void func_info(int ret);
+
+/* Check routine for SHM_STAT */
+static void func_sstat(int ret);
+
+/* Check routine for SHM_LOCK */
+static void func_lock(int ret);
+
+/* Check routine for SHM_UNLOCK */
+static void func_unlock(int ret);

 /* Check routine for IPC_RMID */
-static void func_rmid(void);
+static void func_rmid(int ret);

 /* Child function */
 static void do_child(void);

 static struct test_case_t {
+	int *shmid;
 	int cmd;
-	void (*func_test) ();
-	void (*func_setup) ();
+	struct shmid_ds *arg;
+	void (*func_test) (int);
+	void (*func_setup) (void);
 } TC[] = {
-	{IPC_STAT, func_stat, stat_setup},
+	{&shm_id_1, IPC_STAT, &buf, func_istat, stat_setup},
 #ifndef UCLINUX
 	    /*
 	     * The second test is not applicable to uClinux;
 	     * shared memory segments are detached on exec(),
 	     * so cannot be passed to uClinux children.
 	     */
-	{IPC_STAT, func_stat, stat_setup},
+	{&shm_id_1, IPC_STAT, &buf, func_istat, stat_setup},
 #endif
-	{IPC_SET, func_set, set_setup},
-	{IPC_RMID, func_rmid, NULL},
+	{&shm_id_1, IPC_SET, &buf, func_set, set_setup},
+	{&shm_id_1, IPC_INFO, (struct shmid_ds *) &info, func_info, NULL},
+	{&shm_index, SHM_STAT, &buf, func_sstat, NULL},
+	{&shm_id_1, SHM_LOCK, NULL, func_lock, NULL},
+	{&shm_id_1, SHM_UNLOCK, NULL, func_unlock, NULL},
+	{&shm_id_1, IPC_RMID, NULL, func_rmid, NULL},
 };

 static int TST_TOTAL = ARRAY_SIZE(TC);
@@ -146,7 +169,7 @@ int main(int argc, char *argv[])
 			if (TC[i].func_setup != NULL)
 				(*TC[i].func_setup) ();

-			TEST(shmctl(shm_id_1, TC[i].cmd, &buf));
+			TEST(shmctl(*(TC[i].shmid), TC[i].cmd, TC[i].arg));

 			if (TEST_RETURN == -1) {
 				tst_resm(TFAIL, "%s call failed - errno "
@@ -155,7 +178,7 @@ int main(int argc, char *argv[])
 				continue;
 			}
 			if (STD_FUNCTIONAL_TEST) {
-				(*TC[i].func_test) ();
+				(*TC[i].func_test) (TEST_RETURN);
 			} else {
 				tst_resm(TPASS, "call succeeded");

@@ -294,11 +317,11 @@ void do_child(void)
 }

 /*
- * func_stat() - check the functionality of the IPC_STAT command with shmctl()
+ * func_istat() - check the functionality of the IPC_STAT command with shmctl()
  *		 by looking at the pid of the creator, the segement size,
  *		 the number of attaches and the mode.
  */
-void func_stat(void)
+void func_istat(int ret)
 {
 	int fail = 0;
 	pid_t pid;
@@ -392,7 +415,7 @@ void set_setup(void)
 /*
  * func_set() - check the functionality of the IPC_SET command with shmctl()
  */
-void func_set(void)
+void func_set(int ret)
 {
 	int fail = 0;

@@ -419,10 +442,53 @@ void func_set(void)
 	tst_resm(TPASS, "new mode and change time are correct");
 }

+static void func_info(int ret)
+{
+	if (info.shmmin != 1)
+		tst_resm(TFAIL, "value of shmmin is incorrect");
+	else
+		tst_resm(TPASS, "get correct shared memory limits");
+}
+
+static void func_sstat(int ret)
+{
+	if (ret >= 0)
+		tst_resm(TPASS, "get correct shared memory id");
+	else
+		tst_resm(TFAIL, "shared memory id is incorrect");
+}
+
+static void func_lock(int ret)
+{
+	if (shmctl(shm_id_1, IPC_STAT, &buf) == -1) {
+		tst_resm(TBROK, "stat failed in func_lock()");
+		return;
+	}
+
+	if (buf.shm_perm.mode & SHM_LOCKED)
+		tst_resm(TPASS, "SHM_LOCK is set");
+	else
+		tst_resm(TFAIL, "SHM_LOCK is cleared");
+}
+
+static void func_unlock(int ret)
+{
+	if (shmctl(shm_id_1, IPC_STAT, &buf) == -1) {
+		tst_resm(TBROK, "stat failed in func_unlock()");
+		return;
+	}
+
+	if (buf.shm_perm.mode & SHM_LOCKED)
+		tst_resm(TFAIL, "SHM_LOCK is set");
+	else
+		tst_resm(TPASS, "SHM_LOCK is cleared");
+}
+
+
 /*
  * func_rmid() - check the functionality of the IPC_RMID command with shmctl()
  */
-void func_rmid(void)
+void func_rmid(int ret)
 {
 	/* Do another shmctl() - we should get EINVAL */
 	if (shmctl(shm_id_1, IPC_STAT, &buf) != -1)
-- 
1.8.1

------------------------------------------------------------------------------
Try New Relic Now & We'll Send You this Cool Shirt
New Relic is the only SaaS-based application performance monitoring service 
that delivers powerful full stack analytics. Optimize and monitor your
browser, app, & servers with just a few lines of code. Try New Relic
and get this awesome Nerd Life shirt! http://p.sf.net/sfu/newrelic_d2d_may
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list

  parent reply	other threads:[~2013-05-24  9:52 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-05-23  8:35 [LTP] [PATCH 1/2] shmctl/shmctl01.c: cleanup DAN LI
2013-05-23  8:39 ` [LTP] [PATCH 2/2] shmctl/shmctl01.c: Test features IPC_INFO, SHM_STAT, SHM_LOCK and SHM_UNLOCK DAN LI
2013-05-23 13:01   ` Jan Stancek
2013-05-24  5:18     ` DAN LI
2013-05-24  5:23 ` [LTP] [PATCH V2 " DAN LI
2013-05-24  8:02   ` Jan Stancek
2013-05-24  9:50 ` DAN LI [this message]
2013-05-24 12:13   ` [LTP] [PATCH V3 " Jan Stancek
2013-05-24 12:47   ` Wanlong Gao
2013-05-24 12:46 ` [LTP] [PATCH 1/2] shmctl/shmctl01.c: cleanup Wanlong Gao

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=519F37CF.4030209@cn.fujitsu.com \
    --to=li.dan@cn.fujitsu.com \
    --cc=ltp-list@lists.sourceforge.net \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox