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


Signed-off-by: DAN LI <[email protected]>
---
 testcases/kernel/syscalls/ipc/shmctl/shmctl01.c | 83 ++++++++++++++++++++++---
 1 file changed, 75 insertions(+), 8 deletions(-)

diff --git a/testcases/kernel/syscalls/ipc/shmctl/shmctl01.c 
b/testcases/kernel/syscalls/ipc/shmctl/shmctl01.c
index 34ff30c..c0f2c81 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,12 +69,24 @@ 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(void);
 static void stat_cleanup(void);

 /* Setup and check routines for IPC_SET */
 static void set_setup(void), func_set(void);

+/* Check routine for IPC_INFO */
+static void func_info(void);
+
+/* Check routine for SHM_STAT */
+static void func_sstat(void);
+
+/* Check routine for SHM_LOCK */
+static void func_lock(void);
+
+/* Check routine for SHM_UNLOCK */
+static void func_unlock(void);
+
 /* Check routine for IPC_RMID */
 static void func_rmid(void);

@@ -77,21 +94,27 @@ static void func_rmid(void);
 static void do_child(void);

 static struct test_case_t {
+       int *shmid;
        int cmd;
+       struct shmid_ds *arg;
        void (*func_test) ();
        void (*func_setup) ();
 } 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, &buf, func_lock, NULL},
+       {&shm_id_1, SHM_UNLOCK, &buf, func_unlock, NULL},
+       {&shm_id_1, IPC_RMID, &buf, 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 "
@@ -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(void)
 {
        int fail = 0;
        pid_t pid;
@@ -419,6 +442,50 @@ void func_set(void)
        tst_resm(TPASS, "new mode and change time are correct");
 }

+
+static void func_info(void)
+{
+       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(void)
+{
+       if (buf.shm_segsz != SHM_SIZE)
+               tst_resm(TFAIL, "segment size is incorrect");
+       else
+               tst_resm(TPASS, "size of attache is correct");
+}
+
+static void func_lock(void)
+{
+       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 setted");
+       else
+               tst_resm(TFAIL, "SHM_LOCK is not setted");
+}
+
+static void func_unlock(void)
+{
+       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 not cleared");
+       else
+               tst_resm(TPASS, "SHM_LOCK is cleared");
+}
+
+
 /*
  * func_rmid() - check the functionality of the IPC_RMID command with shmctl()
  */
-- 
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list

Reply via email to