On 03/14/2011 05:24 PM, Jan Safranek wrote:
> Various tests for cgclassify tool, including error cases and testing with
> /etc/cgrules.conf. The tests will produce error messages to output, but it's
> expected, reaction of cgclassify to wrong input is being tested as well.
>
> Signed-off-by: Jan Safranek<[email protected]>
I have only minor problems with this patch otherwise it looks ok.
> ---
>
> tests/tools/Makefile.am | 2
> tests/tools/cgclassify/Makefile.am | 3 +
> tests/tools/cgclassify/cgclassify | 134 ++++++++++++++++++++++++
> tests/tools/cgclassify/cgclassify-rules | 171
> +++++++++++++++++++++++++++++++
> tests/tools/cgclassify/simple.conf | 24 ++++
> 5 files changed, 333 insertions(+), 1 deletions(-)
> create mode 100644 tests/tools/cgclassify/Makefile.am
> create mode 100755 tests/tools/cgclassify/cgclassify
> create mode 100755 tests/tools/cgclassify/cgclassify-rules
> create mode 100644 tests/tools/cgclassify/simple.conf
>
> diff --git a/configure.in b/configure.in
> index ba8e1b1..03b2731 100644
> --- a/configure.in
> +++ b/configure.in
> @@ -196,6 +196,7 @@ AC_CONFIG_FILES([Makefile
> tests/tools/testenv.sh
> tests/tools/Makefile
> tests/tools/cgconfigparser/Makefile
> + tests/tools/cgclassify/Makefile
> src/Makefile
> src/daemon/Makefile
> src/tools/Makefile
> diff --git a/tests/tools/Makefile.am b/tests/tools/Makefile.am
> index 5c08525..4f2b1b0 100644
> --- a/tests/tools/Makefile.am
> +++ b/tests/tools/Makefile.am
> @@ -1,2 +1,2 @@
> -SUBDIRS = cgconfigparser
> +SUBDIRS = cgconfigparser cgclassify
>
> diff --git a/tests/tools/cgclassify/Makefile.am
> b/tests/tools/cgclassify/Makefile.am
> new file mode 100644
> index 0000000..c504e7f
> --- /dev/null
> +++ b/tests/tools/cgclassify/Makefile.am
> @@ -0,0 +1,3 @@
> +EXTRA_DIST = cgclassify cgclassify-rules simple.conf
> +
> +TESTS = cgclassify cgclassify-rules
> diff --git a/tests/tools/cgclassify/cgclassify
> b/tests/tools/cgclassify/cgclassify
> new file mode 100755
> index 0000000..9560a15
> --- /dev/null
> +++ b/tests/tools/cgclassify/cgclassify
> @@ -0,0 +1,134 @@
> +#!/bin/bash
> +#
> +# Test cgclassify with various arguments, without /etc/cgrules.conf.
> +# cglassify is tested with exact destination group, multiple PIDs, groups
> +# specified by '*', multiple target groups, lot of PIDs on command line
> +# and various error cases.
> +
> +. `dirname $0`/../testenv.sh
> +
> +function checkpid()
> +{
> + # check that given process is in given groups
> + local PID=$1
> + # delete hierarchy number, ignore systemd
> + cat /proc/$PID/cgroup | sed 's/^[0-9]*://' | grep -v systemd>
> $TMP/pid-$PID.group
> + printf>$TMP/pid-$PID.expected "$2"
> + diff -u -w $TMP/pid-$PID.group $TMP/pid-$PID.expected
> + return $?
> +}
> +
> +function resetgroup()
> +{
> + # move given processes back to root group
> + $TOOLSDIR/cgclassify -g "*:/" $*
> +}
> +
> +# prepare some hierarchy
> +$TOOLSDIR/cgconfigparser -l `prepare_config simple.conf` || \
> + die "cannot parse simple.conf"
> +
> +# start few processes to torture
> +/bin/sleep 10000&
> +PID1=$!
> +/bin/sleep 10000&
> +PID2=$!
> +/bin/sleep 10000&
> +PID3=$!
> +
> +# STEP1: simple cgclassify to exact groups
> +$TOOLSDIR/cgclassify -g net_cls,cpu:common $PID1 || \
> + die "STEP1: cgclassify PID1 failed"
> +$TOOLSDIR/cgclassify -g net_cls:net1 $PID2 || \
> + die "STEP1: cgclassify PID2 failed"
> +$TOOLSDIR/cgclassify -g cpu:cpu1 $PID3 || \
> + die "STEP1: cgclassify PID3 failed"
> +
> +checkpid $PID1 "net_cls,freezer:/common\ncpuacct,cpu:/common\n" || \
> + die "STEP1: unexpected group of pid1"
> +checkpid $PID2 "net_cls,freezer:/net1\ncpuacct,cpu:/\n" || \
> + die "STEP!: unexpected group of pid2"
> +checkpid $PID3 "net_cls,freezer:/\ncpuacct,cpu:/cpu1\n" || \
> + die "STEP!: unexpected group of pid3"
> +
> +# STEP2: try * and more PIDs
> +$TOOLSDIR/cgclassify -g "*:/" $PID1 $PID2 $PID3 || \
> + die "cgclassify 2 failed"
> +checkpid $PID1 "net_cls,freezer:/\ncpuacct,cpu:/\n" || \
> + die "STEP2: unexpected group of pid1"
> +checkpid $PID2 "net_cls,freezer:/\ncpuacct,cpu:/\n" || \
> + die "STEP2: unexpected group of pid2"
> +checkpid $PID3 "net_cls,freezer:/\ncpuacct,cpu:/\n" || \
> + die "STEP2: unexpected group of pid3"
> +
> +# STEP3: try different groups
> +resetgroup $PID1 $PID2 $PID3
> +$TOOLSDIR/cgclassify -g cpu:cpu1 -g net_cls:net1 $PID1
> +checkpid $PID1 "net_cls,freezer:/net1\ncpuacct,cpu:/cpu1\n" || \
> + die "STEP3: unexpected group of pid1"
> +
> +# STEP4: different groups multiple times (tha last should win)
> +resetgroup $PID1 $PID2 $PID3
> +$TOOLSDIR/cgclassify -g "*:/" -g cpu:common -g net_cls:common -g cpu:cpu1 -g
> net_cls:net1 $PID1 || \
> + die "STEP4: cgclassify pid1 failed"
> +checkpid $PID1 "net_cls,freezer:/net1\ncpuacct,cpu:/cpu1\n" || \
> + die "STEP4: unexpected group of pid1"
> +$TOOLSDIR/cgclassify -g "*:/" -g cpu:common -g net_cls:common -g cpu:cpu1
> $PID2 || \
> + die "STEP4: cgclassify pid2 failed"
> +checkpid $PID2 "net_cls,freezer:/common\ncpuacct,cpu:/cpu1\n" || \
> + die "STEP4: unexpected group of pid2"
> +
> +# STEP5: some error cases
I preffer here to have the error messages redirected to /dev/null, the
output is less readable with them
> +# group does not exist
> +echo "Testing error cases, error messages will appear!"
> +$TOOLSDIR/cgclassify -g cpu:invalid_group $PID1&& \
> + die "STEP5: cgclassify with invalig_group succeeded"
> +# parameter is not a PID
> +$TOOLSDIR/cgclassify -g cpu:/ xxx&& \
> + die "STEP5: cgclassify with xxx pid succeeded"
> +# let's hope process 1234567 does not exist
> +$TOOLSDIR/cgclassify -g cpu:/ 1234567&& \
> + die "STEP5: cgclassify with 1234567 succeeded"
> +# not-mounted controller
> +$TOOLSDIR/cgclassify -g xxx:/ $PID1&& \
> + die "STEP5: cgclassify with xxx controller succeeded"
> +# no -g parameter
> +$TOOLSDIR/cgclassify -g $PID1&& \
> + die "STEP5: cgclassify without -g succeeded"
> +# invalid -g format
> +$TOOLSDIR/cgclassify -g cpu/cpu1 $PID1&& \
> + die "STEP5: cgclassify -g cpu/cpu1 succeeded"
> +
> +# some existing processes among unexisting
> +resetgroup $PID1 $PID2 $PID3
> +$TOOLSDIR/cgclassify -g cpu,net_cls:common $PID1 1234567 $PID2 1234568
> $PID3&& \
> + die "STEP5: cgclassify with mixed processed succeeded"
> +checkpid $PID1 "net_cls,freezer:/common\ncpuacct,cpu:/common\n" || \
> + die "STEP5: unexpected group of pid1"
> +checkpid $PID2 "net_cls,freezer:/common\ncpuacct,cpu:/common\n" || \
> + die "STEP5: unexpected group of pid2"
> +checkpid $PID3 "net_cls,freezer:/common\ncpuacct,cpu:/common\n" || \
> + die "STEP5: unexpected group of pid3"
> +
> +echo "End of error cases"
> +
> +# STEP6: *lot of* processes on command line
> +echo "Testing lot of arguments, this will take some time"
> +COUNT=1000
Not sure whether the variable is necessary it is used only one time
> +echo>$TMP/pids
> +(
> + for i in `seq $COUNT`; do
> + sleep 100000&
> + echo $!>>$TMP/pids
> + done
> +)> /dev/null
> +$TOOLSDIR/cgclassify -g net_cls,cpu:common `cat $TMP/pids` || \
> + die "STEP6: cgclassify failed"
> +
> +kill `cat $TMP/pids`
> +sleep 1 # to settle down the sleep load - sigterm does not kill sleep
> immediatelly
> +
> +kill $PID1 $PID2 $PID3
> +$TOOLSDIR/cgclear
> +cleanup
> +exit 0
> diff --git a/tests/tools/cgclassify/cgclassify-rules
> b/tests/tools/cgclassify/cgclassify-rules
> new file mode 100755
> index 0000000..b2b2cd8
> --- /dev/null
> +++ b/tests/tools/cgclassify/cgclassify-rules
> @@ -0,0 +1,171 @@
> +#!/bin/bash
> +#
> +# Test cgclassify with various /etc/cgrules.conf settings, like
> +# simple rules, multiple matching rules, using @groups, executable
> +# names and default rules.
> +# The test relies on testenv.sh to backup/restore /etc/cgrules.conf.
> +#
> +
> +. `dirname $0`/../testenv.sh
> +
> +# The test need sto start few processes with non-root UID/GID. Which should
> be
> +# used?
> +TESTUSER=nobody
> +TESTGROUP=nobody
> +
> +function checkpid()
> +{
> + # check that given process is in given groups
> + local PID=$1
> + # delete hierarchy number, ignore systemd
> + cat /proc/$PID/cgroup | sed 's/^[0-9]*://' | grep -v systemd>
> $TMP/pid-$PID.group
> + printf>$TMP/pid-$PID.expected "$2"
> + diff -u -w $TMP/pid-$PID.group $TMP/pid-$PID.expected
> + return $?
> +}
> +
> +function resetgroup()
> +{
> + # move given processes back to root group
> + $TOOLSDIR/cgclassify -g "*:/" $*
> +}
> +
> +# prepare some hierarchy
> +$TOOLSDIR/cgconfigparser -l `prepare_config simple.conf` || \
> + die "cannot parse simple.conf"
> +
> +# prepare specific process names
> +ln -s /bin/sleep $TMP/sleep1
> +$TMP/sleep1 10000&
> +PID1=$!
> +ln -s /bin/sleep $TMP/sleep2
> +$TMP/sleep2 10000&
> +PID2=$!
> +
> +# start some processes as $TESTUSER
> +chmod o+rwX $TMP
> +su $TESTUSER -s /bin/bash -c "$TMP/sleep1 10000"&
> +su $TESTUSER -s /bin/bash -c "$TMP/sleep2 10000"&
> +sleep 0.1
> +NPID1=`ps h -u $TESTUSER | grep sleep1 | awk '{ print $1; }' | tail -n 1`
> +NPID2=`ps h -u $TESTUSER | grep sleep2 | awk '{ print $1; }' | tail -n 1`
> +
> +# STEP1: simple global rule
> +cat<<EOF>/etc/cgrules.conf
> +unused * /
> +* * common
> +EOF
> +$TOOLSDIR/cgclassify $PID1
> +checkpid $PID1 "net_cls,freezer:/common\ncpuacct,cpu:/common\n" || \
> + die "STEP1: unexpected group of pid1"
> +resetgroup $PID1
> +
> +# STEP2: two destination groups
> +cat<<EOF>/etc/cgrules.conf
> +unused * /
> +* cpu cpu1
> +% net_cls net1
> +EOF
> +$TOOLSDIR/cgclassify $PID1
> +checkpid $PID1 "net_cls,freezer:/net1\ncpuacct,cpu:/cpu1\n" || \
> + die "STEP2: unexpected group of pid1"
> +resetgroup $PID1
> +
> +# STEP3: two matching rules, only the first is executed
> +cat<<EOF>/etc/cgrules.conf
> +unused * /
> +* cpu cpu1
> +* net_cls net1
> +EOF
> +$TOOLSDIR/cgclassify $PID1
> +checkpid $PID1 "net_cls,freezer:/\ncpuacct,cpu:/cpu1\n" || \
> + die "STEP3: unexpected group of pid1"
> +resetgroup $PID1
> +
> +# STEP4: process name in a rule
> +cat<<EOF>/etc/cgrules.conf
> +unused * /
> +*:sleep1 cpu cpu1
> +*:sleep2 net_cls net1
> +EOF
> +$TOOLSDIR/cgclassify $PID1
> +checkpid $PID1 "net_cls,freezer:/\ncpuacct,cpu:/cpu1\n" || \
> + die "STEP4: unexpected group of pid1"
> +$TOOLSDIR/cgclassify $PID2
> +checkpid $PID2 "net_cls,freezer:/net1\ncpuacct,cpu:/\n" || \
> + die "STEP4: unexpected group of pid2"
> +resetgroup $PID1 $PID2
> +
> +# STEP5: full path
> +cat<<EOF>/etc/cgrules.conf
> +unused * /
> +*:$TMP/sleep1 cpu cpu1
> +*:$TMP/sleep2 net_cls net1
> +EOF
> +$TOOLSDIR/cgclassify $PID1
> +checkpid $PID1 "net_cls,freezer:/\ncpuacct,cpu:/cpu1\n" || \
> + die "STEP5: unexpected group of pid1"
> +$TOOLSDIR/cgclassify $PID2
> +checkpid $PID2 "net_cls,freezer:/net1\ncpuacct,cpu:/\n" || \
> + die "STEP5: unexpected group of pid2"
> +resetgroup $PID1 $PID2
> +
> +#STEP6: username
> +cat<<EOF>/etc/cgrules.conf
> +unused * /
> +$TESTUSER cpu cpu1
> +* net_cls net1
> +EOF
> +$TOOLSDIR/cgclassify $PID1 $NPID1
> +checkpid $NPID1 "net_cls,freezer:/\ncpuacct,cpu:/cpu1\n" || \
> + die "STEP6: unexpected group of npid1"
> +checkpid $PID1 "net_cls,freezer:/net1\ncpuacct,cpu:/\n" || \
> + die "STEP6: unexpected group of pid1"
> +resetgroup $PID1 $NPID1
> +
> +#STEP7: username + processname
> +cat<<EOF>/etc/cgrules.conf
> +unused * /
> +$TESTUSER:$TMP/sleep1 cpu cpu1
> +*:$TMP/sleep1 net_cls net1
> +EOF
> +$TOOLSDIR/cgclassify $PID1 $NPID1
> +checkpid $NPID1 "net_cls,freezer:/\ncpuacct,cpu:/cpu1\n" || \
> + die "STEP7: unexpected group of npid1"
> +checkpid $PID1 "net_cls,freezer:/net1\ncpuacct,cpu:/\n" || \
> + die "STEP7: unexpected group of pid1"
> +resetgroup $PID1 $NPID1
> +
> +#STEP8: groupname + processname
> +cat<<EOF>/etc/cgrules.conf
> +unused * /
> +@$TESTGROUP:$TMP/sleep1 cpu cpu1
> +*:$TMP/sleep1 net_cls net1
> +EOF
> +$TOOLSDIR/cgclassify $PID1 $NPID1
> +checkpid $NPID1 "net_cls,freezer:/\ncpuacct,cpu:/cpu1\n" || \
> + die "STEP8: unexpected group of npid1"
> +checkpid $PID1 "net_cls,freezer:/net1\ncpuacct,cpu:/\n" || \
> + die "STEP8: unexpected group of pid1"
> +resetgroup $PID1 $NPID1
> +
> +#STEP9: processname + default
> +cat<<EOF>/etc/cgrules.conf
> +unused * /
> +*:$TMP/sleep1 cpu cpu1
> +* net_cls net1
> +EOF
> +$TOOLSDIR/cgclassify $PID1 $PID2
> +checkpid $PID1 "net_cls,freezer:/\ncpuacct,cpu:/cpu1\n" || \
> + die "STEP9: unexpected group of pid1"
> +checkpid $PID2 "net_cls,freezer:/net1\ncpuacct,cpu:/\n" || \
> + die "STEP9: unexpected group of pid2"
> +resetgroup $PID1 $NPID1
> +
> +kill -9 $PID1 $PID2 $NPID1 $NPID2
> +
> +sleep 0.1
> +$TOOLSDIR/cgclear
> +
> +cleanup
> +exit 0
> diff --git a/tests/tools/cgclassify/simple.conf
> b/tests/tools/cgclassify/simple.conf
> new file mode 100644
> index 0000000..07f8ccd
> --- /dev/null
> +++ b/tests/tools/cgclassify/simple.conf
> @@ -0,0 +1,24 @@
> +# Two hierarchies, two controllers each:
> +
> +mount {
> + cpu = TMP/cgroup/cpu;
> + cpuacct = TMP/cgroup/cpu;
> + net_cls = TMP/cgroup/net;
> + freezer = TMP/cgroup/net;
> +}
> +
> +# One group common for all hierarchies:
> +
> +group common {
> + cpu {}
> + net_cls {}
> +}
> +
> +# Two separate groups:
> +group net1 {
> + net_cls{}
> +}
> +
> +group cpu1 {
> + cpu {}
> +}
>
>
> ------------------------------------------------------------------------------
> Colocation vs. Managed Hosting
> A question and answer guide to determining the best fit
> for your organization - today and in the future.
> http://p.sf.net/sfu/internap-sfd2d
> _______________________________________________
> Libcg-devel mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/libcg-devel
------------------------------------------------------------------------------
Xperia(TM) PLAY
It's a major breakthrough. An authentic gaming
smartphone on the nation's most reliable network.
And it wants your games.
http://p.sf.net/sfu/verizon-sfdev
_______________________________________________
Libcg-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/libcg-devel