Veerendra [EMAIL PROTECTED] wrote:
> Hi
>
>  Please find the testcase for the below assertion.
>
<begin>
> Assertions 1:
> Steps:
> a) Create a  container .
> b) Create many levels of child containers inside this container.
> c) Now do kill -9 init , outside of the contaier.
> d) This should kill all the child containers . (containers created at
> the level below )
<end>

This information could be in the patch description below. The rest
could be just in the email and stripped out from patch.

>
> In this testcase , I am creating containers upto 5 levels. And I am
> killing the container created at level 3.
> And verifying that the containers created at level 4 and level 5 are 
> destroyed.
>
> Regards
> Veerendra C

| Results:
| [EMAIL PROTECTED] pidns]# ./pidns05 
| pidns05     0  INFO  :   5 Nested Containers are created
| pidns05     1  PASS  :  The number of containers killed are 2
| 
| Signed-off-by: Veerendra C <[EMAIL PROTECTED]>

Have a minor optimization below, but otherwise,
Acked-by: Sukadev Bhattiprolu <[EMAIL PROTECTED]>

| 
| Index: root/new/ltp-full-20080930/testcases/kernel/containers/pidns/pidns05.c
| ===================================================================
| --- /dev/null
| +++ root/new/ltp-full-20080930/testcases/kernel/containers/pidns/pidns05.c
| @@ -0,0 +1,264 @@
| +/*
| +* Copyright (c) International Business Machines Corp., 2007
| +* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
| +*
| +***************************************************************************
| +*
| +* Description:
| +*  This testcase creates 5 nested containers.
| +*  And it will destroy a container, and verifies that the child
| +*  containers are also destroyed when the parent container is killed.
| +*
| +* 1. Parent process clone a process with flag CLONE_NEWPID
| +* 2. The container will recursively loop and creates 4 more containers.
| +* 3. All the container init's  goes into sleep(), waiting to be terminated.
| +* 4. The parent process will kill child[3] by passing SIGKILL
| +* 5. Now parent process, verifies the child containers 4 & 5 are destroyed.
| +* 6. If they are killed then
| +*    Test PASSed
| +*  else Test FAILed.
| +*
| +* Test Name: pidns05
| +*
| +* History:
| +*
| +* FLAG DATE          NAME                            DESCRIPTION
| +* 31/10/08  Veerendra C <[EMAIL PROTECTED]>  Verifies killing of NestedCont's
| +*
| 
+*******************************************************************************/
| +#define _GNU_SOURCE 1
| +#include <sys/wait.h>
| +#include <assert.h>
| +#include <stdio.h>
| +#include <stdlib.h>
| +#include <unistd.h>
| +#include <string.h>
| +#include <errno.h>
| +#include <usctest.h>
| +#include <test.h>
| +#include <libclone.h>
| +
| +#define INIT_PID     1
| +#define CINIT_PID    1
| +#define PARENT_PID   0
| +#define MAX_DEPTH    5
| +
| +char *TCID = "pidns05";
| +int TST_TOTAL = 1;
| +int fd[2];
| +
| +void cleanup(void);
| +int create_nested_container(void *);
| +
| +int max_pid()
| +{
| +     FILE *fp;
| +     int ret;
| +
| +     fp = fopen("/proc/sys/kernel/pid_max", "r") ;
| +     if (fp != NULL) {
| +             fscanf(fp, "%d", &ret);
| +             fclose(fp);
| +     } else {
| +             tst_resm(TBROK, "Cannot open /proc/sys/kernel/pid_max \n");
| +             ret = -1;
| +     }
| +     return ret;
| +}
| +
| +/* find_cinit_pids() goes through the procfs for each of the pid,
| + * and checks if it matches the 'name' and 'PGID' of the parent
| + * process that created the containers.
| + * Input : Accepts an integer array pids[], which stores the pid's matching
| + * Returns count of the pids matched.
| +*/
| +int find_cinit_pids(pid_t *pids)
| +{
| +     int ret, next = 0, pid, pid_max, i, tmp1, tmp3;
| +     pid_t parentpid, pgid;
| +     FILE *fp;
| +     char progname[FILENAME_MAX+2];
| +     char proc_file[FILENAME_MAX];
| +     char tmp2;
| +
| +     pid_max = max_pid();
| +     parentpid = getpid();
| +     pgid = getpgid(parentpid);
| +
| +     /* To wrap around if the pid has reached the max_pid */
| +     if (parentpid != pid_max)
| +             i = parentpid + 1;
| +     else
| +             i = 2;

Rather than checking against pid_max twice, you could simplify:

        for (i = parent_pid + 1; i != parent_pid; i++) {
                if (i >= pid_max) {
                        i = 1;
                        continue;
                }

                sprintf(proc_file, ...);
        }
| +
| +     /* The loop breaks, when the loop counter reaches the parentpid value */
| +     while (i != parentpid) {
| +             sprintf(proc_file, "/proc/%d/stat", i);
| +             fp = fopen(proc_file, "r");
| +
| +             /* The  name and the PGID for each of the process should match*
| +              * the 'pidns05' and parent groupid for the parent process   */
| +             if (fp != NULL) {
| +                     fscanf(fp, "%d %s %c %d %d", &tmp1, progname, &tmp2,
| +                             &tmp3, &pid);
| +                     ret = strcmp("(pidns05)", progname);
| +                     if (ret == 0 && pid == pgid) {
| +                             pids[next] = i;
| +                             next++;
| +                     }
| +                     fclose(fp);
| +             }
| +             if (i == pid_max)
| +                     i = 2;
| +             else
| +                     i++;
| +     }
| +     return next;
| +}
| +
| +/*
| +* create_nested_container() Recursively create MAX_DEPTH nested containers
| +*/
| +int create_nested_container(void *vtest)
| +{
| +     int ret, count, *level ;
| +     pid_t cpid, ppid;
| +     cpid = getpid();
| +     ppid = getppid();
| +     char mesg[] = "Nested Containers are created";
| +
| +     level = (int *)vtest;
| +     count = *level;
| +
| +     /* Child process closes up read side of pipe */
| +     close(fd[0]);
| +
| +     /* Comparing the values to make sure pidns is created correctly */
| +     if ((cpid != CINIT_PID) || (ppid != PARENT_PID)) {
| +             tst_resm(TFAIL, "FAIL: Got unexpected result of"
| +             " cpid=%d ppid=%d\n", cpid, ppid);
| +             cleanup();
| +     }
| +     if (count > 1) {
| +             count--;
| +             ret = do_clone_unshare_test(T_CLONE, CLONE_NEWPID,
| +                             create_nested_container, (void *) &count);
| +             if (ret == -1) {
| +                     tst_resm(TFAIL, "clone() Failed, errno = %d : %s\n" ,
| +                              ret, strerror(ret));
| +                     cleanup();
| +             }
| +     } else {
| +             /* Sending mesg, 'Nested containers created' through the pipe */
| +             write(fd[1], mesg, (strlen(mesg)+1));
| +     }
| +
| +     close(fd[1]);
| +     pause();
| +
| +     /* NOT REACHED */
| +     return 0;
| +}
| +
| +/*
| + * cleanup() - performs all ONE TIME cleanup for this test at
| + *             completion or premature exit.
| + */
| +void cleanup()
| +{
| +     /* Clean the test testcase as LTP wants*/
| +     TEST_CLEANUP;
| +
| +     /* exit with return code appropriate for results */
| +     tst_exit();
| +}
| +
| +void kill_nested_containers()
| +{
| +     int orig_count, new_count, status = 0, i;
| +     pid_t pids[MAX_DEPTH];
| +     pid_t pids_new[MAX_DEPTH];
| +
| +     orig_count = find_cinit_pids(pids);
| +     kill(pids[MAX_DEPTH - 3], SIGKILL) ;
| +     sleep(1);
| +
| +     /* After killing child container, getting the New PID list */
| +     new_count = find_cinit_pids(pids_new);
| +
| +     /*Verifyng if the child containers are destroyed when parent is killed*/
| +     if (orig_count - 2 != new_count)
| +             status = -1;
| +
| +     for (i = 0; i < new_count; i++) {
| +             if (pids[i] != pids_new[i])
| +                     status = -1;
| +     }
| +
| +     if (status == 0)
| +             tst_resm(TPASS, "The number of containers killed are %d\n" ,
| +                             orig_count - new_count);
| +     else
| +             tst_resm(TFAIL, "Failed to kill the sub-containers of "
| +                             "the container %d\n", pids[MAX_DEPTH - 3]);
| +
| +     /* Loops through the containers created,  to exit from sleep() */
| +     for (i = 0; i < MAX_DEPTH; i++) {
| +             kill(pids[i], SIGKILL);
| +             waitpid(pids[i], &status, 0);
| +     }
| +}
| +
| +
| +/***********************************************************************
| +*   M A I N
| +***********************************************************************/
| +
| +int main(int argc, char *argv[])
| +{
| +     int ret, nbytes;
| +     char readbuffer[80];
| +     int count = MAX_DEPTH;
| +
| +     ret = pipe(fd);
| +     if (ret == -1)
| +             tst_brkm(TBROK, cleanup, "pipe() failed, errno %d", errno);
| +
| +     ret = do_clone_unshare_test(T_CLONE, CLONE_NEWPID,
| +                             create_nested_container, (void *) &count);
| +     if (ret == -1) {
| +             tst_resm(TFAIL, "clone() Failed, errno = %d : %s\n" ,
| +                      ret, strerror(ret));
| +             cleanup();
| +     }
| +
| +     close(fd[1]);
| +     /* Waiting for the MAX_DEPTH number of containers to be created */
| +     nbytes = read(fd[0], readbuffer, sizeof(readbuffer));
| +     close(fd[0]);
| +     if (nbytes > 0)
| +             tst_resm(TINFO, " %d %s", MAX_DEPTH, readbuffer);
| +     else {
| +             tst_resm(TFAIL, "Unable to create %d containers\n", MAX_DEPTH);
| +             cleanup();
| +     }
| +
| +     /* Kill the container created  */
| +     kill_nested_containers();
| +     /* cleanup and exit */
| +     cleanup();
| +
| +     /*NOTREACHED*/
| +     return 0;
| +}
| +


-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list

Reply via email to