summaryrefslogtreecommitdiffstats
path: root/tests/runlibcgrouptest.sh
diff options
context:
space:
mode:
Diffstat (limited to 'tests/runlibcgrouptest.sh')
-rw-r--r--tests/runlibcgrouptest.sh211
1 files changed, 211 insertions, 0 deletions
diff --git a/tests/runlibcgrouptest.sh b/tests/runlibcgrouptest.sh
new file mode 100644
index 0000000..4e74cb5
--- /dev/null
+++ b/tests/runlibcgrouptest.sh
@@ -0,0 +1,211 @@
+#!/bin/bash
+# usage ./runlibcgrouptest.sh
+# Copyright IBM Corporation. 2008
+#
+# Author: Sudhir Kumar <skumar@linux.vnet.ibm.com>
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of version 2.1 of the GNU Lesser General Public License
+# as published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it would be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+#
+# Description: This script runs the the basic tests for testing libcgroup apis.
+#
+
+DEBUG=true # for debug messages
+FS_MOUNTED=0; # 0 for not mounted, 1 for mounted, 2 for multimounted
+MOUNTPOINT="/tmp"; # Just to initialize
+TARGET=/dev/cgroup_controllers;
+CONTROLLERS=cpu,memory;
+
+debug()
+{
+ # Function parameter is the string to print out
+ if [ $DEBUG ]
+ then
+ echo SH:DBG: $1;
+ fi
+}
+
+umount_fs ()
+{
+ PROC_ENTRY=`cat /proc/mounts|grep cgroup|tr -s [:space:]|cut -d" " -f2`;
+
+ # Need to handle multiple mount points ?
+ if [ -n "$PROC_ENTRY" ] && [ "$PROC_ENTRY" != "$TARGET" ]
+ then
+ TARGET=$PROC_ENTRY;
+ fi;
+
+ # Need to take care if there are tasks running in any group ??
+ # Also need to take care if there are groups in the hierarchy ?
+ rmdir $TARGET/* 2> /dev/null ;
+ umount $TARGET;
+ rmdir $TARGET;
+ FS_MOUNTED=0;
+ TARGET=/dev/cgroup_controllers;
+ echo "Cleanup done";
+}
+
+check_mount_fs()
+{
+ CGROUP=`cat /proc/mounts|grep -w cgroup|tr -s [:space:]|cut -d" " -f3`;
+ if [ "$CGROUP" = "cgroup" ]
+ then
+ FS_MOUNTED=1;
+ else
+ FS_MOUNTED=0;
+ fi
+}
+
+# Check if kernel is not having any of the controllers enabled
+no_controllers()
+{
+ local CPU;
+ local MEMORY;
+ if [ -e /proc/cgroups ]
+ then
+ CPU=`cat /proc/cgroups|grep -w cpu|cut -f1`;
+ MEMORY=`cat /proc/cgroups|grep -w memory|cut -f1`;
+ fi;
+
+ if [ -n $CPU ] && [ -n $MEMORY ]
+ then
+ CONTROLLERS=$CPU,$MEMORY ;
+ return 1; # false
+ elif [ -n $CPU ]
+ then
+ CONTROLLERS=$CPU ;
+ return 1; # false
+ elif [ -n $MEMORY ]
+ then
+ CONTROLLERS=$MEMORY ;
+ return 1; # false
+ fi;
+ # Kernel has no controllers enabled
+ return 0; # true
+}
+
+mount_fs ()
+{
+ if no_controllers
+ then
+ echo "Kernel has no controllers enabled";
+ echo "Recompile your kernel with controllers enabled"
+ echo "Exiting the tests.....";
+ exit 1;
+ fi;
+
+ # Proceed further as kernel has controllers support
+ if [ -e $TARGET ]
+ then
+ echo "WARN: $TARGET already exist..overwriting"; # any issue ?
+ umount_fs;
+ fi;
+
+ mkdir $TARGET;
+
+ mount -t cgroup -o $CONTROLLERS cgroup $TARGET; # 2> /dev/null?
+ if [ $? -ne 0 ]
+ then
+ echo "ERROR: Could not mount cgroup filesystem on $TARGET."
+ echo "Exiting test";
+ umount_fs;
+ exit -1;
+ fi
+
+ # Group created earlier may again be visible if not cleaned properly.
+ # So clean them all
+ if [ -e $TARGET/group1 ] # first group that is created
+ then
+ rmdir $TARGET/* 2>/dev/null
+ echo "WARN: Earlier groups found and removed...";
+ fi
+ FS_MOUNTED=1;
+ debug "INFO: cgroup filesystem mounted on $TARGET directory"
+}
+
+get_mountpoint()
+{
+ # ??? need to handle multiple mount point
+ MOUNTPOINT=`cat /proc/mounts|grep -w cgroup|tr -s [:space:]| \
+ cut -d" " -f2`;
+ debug "mountpoint is $MOUNTPOINT"
+}
+runtest()
+{
+ MOUNT_INFO=$1;
+ TEST_EXEC=$2;
+ if [ -f $TEST_EXEC ]
+ then
+ ./$TEST_EXEC $MOUNT_INFO $MOUNTPOINT;
+ if [ $? -ne 0 ]
+ then
+ echo Error in running ./$TEST_EXEC
+ echo Exiting tests.
+ else
+ PID=$!;
+ fi;
+ else
+ echo Sources not compiled. please run make;
+ fi
+}
+# TestSet01: Run tests without mounting cgroup filesystem
+ echo;
+ echo Running first set of testcases;
+ echo ==============================
+ FS_MOUNTED=0;
+ FILE=libcgrouptest01;
+ check_mount_fs;
+ # unmount fs if already mounted
+ if [ $FS_MOUNTED -eq 1 ]
+ then
+ umount_fs;
+ fi;
+ debug "FS_MOUNTED = $FS_MOUNTED"
+ runtest $FS_MOUNTED $FILE
+
+ wait $PID;
+ RC=$?;
+ if [ $RC -ne 0 ]
+ then
+ echo Test binary $FILE exited abnormaly with return value $RC;
+ # Do not exit here. Failure in this case does not imply
+ # failure in other cases also
+ fi;
+
+# TestSet02: Run tests with mounting cgroup filesystem
+ echo;
+ echo Running second set of testcases;
+ echo ==============================
+ FILE=libcgrouptest01;
+ check_mount_fs;
+ # mount fs if not already mounted
+ if [ $FS_MOUNTED -eq 0 ]
+ then
+ mount_fs;
+ fi;
+ debug "FS_MOUNTED = $FS_MOUNTED"
+ get_mountpoint;
+ runtest $FS_MOUNTED $FILE
+
+ wait $PID;
+ RC=$?;
+ if [ $RC -ne 0 ]
+ then
+ echo Test binary $FILE exited abnormaly with return value $RC;
+ # Same commments as above
+ fi;
+
+
+# TestSet03: Run tests with mounting cgroup filesystem at multiple points
+ echo;
+ echo Running third set of testcases;
+ echo ==============================
+ # To be done
+
+ umount_fs;
+ exit 0;