diff options
-rw-r--r-- | Makefile.in | 4 | ||||
-rw-r--r-- | tests/Makefile | 10 | ||||
-rw-r--r-- | tests/libcgrouptest.h | 38 | ||||
-rw-r--r-- | tests/libcgrouptest01.c | 75 | ||||
-rw-r--r-- | tests/runlibcgrouptest.sh | 211 |
5 files changed, 337 insertions, 1 deletions
diff --git a/Makefile.in b/Makefile.in index 172b225..5bef04e 100644 --- a/Makefile.in +++ b/Makefile.in @@ -44,6 +44,9 @@ libcgroup.so: api.c libcgroup.h wrapper.c wrapper.c ln -sf $@ $@.$(VERSION) +test: + $(MAKE) -C tests + install: libcgroup.so $(INSTALL_DATA) -D libcgroup.h $(DESTDIR)$(includedir)/libcgroup.h $(INSTALL) -D libcgroup.so $(DESTDIR)$(libdir)/libcgroup-$(PACKAGE_VERSION).so @@ -59,3 +62,4 @@ uninstall: libcgroup.so clean: \rm -f y.tab.c y.tab.h lex.yy.c y.output cgconfig libcgroup.so \ libcgroup.so.$(VERSION) + $(MAKE) -C tests clean diff --git a/tests/Makefile b/tests/Makefile index 707302a..1c57de7 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -3,8 +3,16 @@ LIBS = -lcgroup INC = -I .. CXXFLAGS = -g -O2 -Wall -DDEBUG $(INC) +TARGET= libcgrouptest01 \ + libcg_ba + +all: $(TARGET) + +libcgrouptest01: libcgrouptest01.c + $(CXX) $(CXXFLAGS) -o $@ $< $(LDFLAGS) $(LIBS) + libcg_ba: libcg_ba.cpp $(CXX) $(CXXFLAGS) -o $@ $< $(LDFLAGS) $(LIBS) clean: - \rm libcg_ba + \rm -f $(TARGET) diff --git a/tests/libcgrouptest.h b/tests/libcgrouptest.h new file mode 100644 index 0000000..b35c7a9 --- /dev/null +++ b/tests/libcgrouptest.h @@ -0,0 +1,38 @@ + +/* + * 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 file is the header file for libcgroup test programs. + */ + +#ifndef __LIBCGROUPTEST_H +#define __LIBCGROUPTEST_H + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/syscall.h> + +#include <libcgroup.h> + +enum cgroup_mount_t { + FS_NOT_MOUNTED, + FS_MOUNTED, + FS_MULTI_MOUNTED, +}; + +static inline pid_t cgrouptest_gettid() +{ + return syscall(__NR_gettid); +} +#endif diff --git a/tests/libcgrouptest01.c b/tests/libcgrouptest01.c new file mode 100644 index 0000000..fd4b915 --- /dev/null +++ b/tests/libcgrouptest01.c @@ -0,0 +1,75 @@ +/* + * 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 file contains the test code for testing libcgroup apis. + */ + +#include "libcgrouptest.h" + +int main(int argc, char *argv[]) +{ + int fs_mounted; + + if ((argc < 3) || (atoi(argv[1]) < 0)) { + printf("ERROR: Wrong no of parameters recieved from script\n"); + printf("Exiting the libcgroup testset\n"); + exit(1); + } + fs_mounted = atoi(argv[1]); + + /* + * Testsets: Testcases are broadly devided into 3 categories based on + * filesystem(fs) mount scenario. fs not mounted, fs mounted, fs multi + * mounted. Call different apis in these different scenarios. + */ + + switch (fs_mounted) { + + case FS_NOT_MOUNTED: + /* + * Test01: call apis and check return values + * Exp outcome: + */ + printf("First set\n"); + + break; + + case FS_MOUNTED: + /* + * Test01: call apis and check return values + * Exp outcome: + */ + printf("Second set\n"); + + break; + + case FS_MULTI_MOUNTED: + /* + * Test01: call apis and check return values + * Exp outcome: + */ + printf("Third set\n"); + /* + * Will add testcases once multiple mount patch is in + */ + + break; + + default: + fprintf(stderr, "ERROR: Wrong parameters recieved from script. \ + Exiting tests\n"); + exit(1); + break; + } + return 0; +} 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; |