2007-12-12 00:20:13 +03:00
#!/bin/sh
# Get coverage of libvirtd's config-parsing code.
2009-09-23 11:32:10 +04:00
test -z "$srcdir" && srcdir=$(pwd)
2009-11-30 22:01:31 +03:00
LC_ALL=C
. "$srcdir/test-lib.sh"
2009-09-23 11:32:10 +04:00
2009-11-30 22:01:31 +03:00
if test "$verbose" = yes; then
2009-09-23 11:32:10 +04:00
$abs_top_builddir/daemon/libvirtd --version
2008-12-01 18:04:28 +03:00
fi
2009-11-30 22:01:31 +03:00
test_intro "$this_test"
2009-09-23 11:32:10 +04:00
test -z "$CONFIG_HEADER" && CONFIG_HEADER="$abs_top_builddir/config.h"
2009-02-17 13:23:48 +03:00
2009-09-23 11:32:10 +04:00
grep '^#define WITH_QEMU 1' "$CONFIG_HEADER" > /dev/null ||
2009-02-17 13:23:48 +03:00
skip_test_ "configured without QEMU support"
2007-12-12 00:20:13 +03:00
2009-09-15 18:49:29 +04:00
conf="$abs_top_srcdir/daemon/libvirtd.conf"
2008-12-01 18:04:28 +03:00
# Ensure that each commented out PARAMETER = VALUE line has the expected form.
2010-02-19 20:37:00 +03:00
grep -v '\"PARAMETER = VALUE\"' "$conf" | grep '[a-z_] *= *[^ ]' | grep -vE '^#[a-z_]+ = ' \
2008-12-01 18:04:28 +03:00
&& { echo "$0: found unexpected lines (above) in $conf" 1>&2; exit 1; }
2007-12-12 00:20:13 +03:00
# Start with the sample libvirtd.conf file, uncommenting all real directives.
2008-12-01 18:04:28 +03:00
sed -n 's/^#\([^ #]\)/\1/p' "$conf" > tmp.conf
2007-12-12 00:20:13 +03:00
2010-11-03 13:43:11 +03:00
sed -e "s/^\(unix_sock_group =\).*/\1 \"$USER\"/g" tmp.conf > k
mv k tmp.conf
2007-12-12 00:20:13 +03:00
# Iterate through that list of directives, corrupting one RHS at a
# time and running libvirtd with the resulting config. Each libvirtd
# invocation must fail.
n=$(wc -l < tmp.conf)
2009-11-30 22:01:31 +03:00
i=0
fail=0
2007-12-12 00:20:13 +03:00
while :; do
2009-11-30 22:01:31 +03:00
i=$(expr $i + 1)
2007-12-12 00:20:13 +03:00
param_name=$(sed -n "$i"'s/ = .*//p' tmp.conf)
rhs=$(sed -n "$i"'s/.* = \(.*\)/\1/p' tmp.conf)
f=in$i.conf
2008-12-01 18:04:28 +03:00
case $rhs in
# Change an RHS that starts with '"' or '[' to "3".
[[\"]*) sed "$i"'s/ = [["].*/ = 3/' tmp.conf > $f;;
# Change an RHS that starts with a digit to the string '"foo"'.
[0-9]*) sed "$i"'s/ = [0-9].*/ = "foo"/' tmp.conf > $f;;
esac
# Run libvirtd, expecting it to fail.
2010-02-19 20:37:00 +03:00
$abs_top_builddir/daemon/libvirtd --pid-file=pid-file --config=$f 2> err && fail=1
2008-12-01 18:04:28 +03:00
2007-12-12 00:20:13 +03:00
case $rhs in
# '"'*) msg='should be a string';;
'"'*) msg='invalid type: got long; expected string';;
2008-12-01 18:04:28 +03:00
[0-9]*) msg='invalid type: got string; expected long';;
2007-12-12 00:20:13 +03:00
'['*) msg='must be a string or list of strings';;
*) echo "unexpected RHS: $rhs" 1>&2; fail=1;;
esac
test $i = $n && break
2009-03-04 16:04:06 +03:00
# Check that the diagnostic we want appears
grep "$msg" err 1>/dev/null 2>&1
RET=$?
2009-11-30 22:01:31 +03:00
test_result $i "corrupted config $param_name" $RET
2009-03-04 16:04:06 +03:00
test "$RET" = "0" || fail=1
2007-12-12 00:20:13 +03:00
done
# Run with the unmodified config file.
2008-12-01 18:04:28 +03:00
sleep_secs=2
2009-03-02 23:01:26 +03:00
# Be careful to specify a non-default socket directory:
sed 's,^unix_sock_dir.*,unix_sock_dir="'"$(pwd)"'",' tmp.conf > k || fail=1
mv k tmp.conf || fail=1
# Also, specify a test-specific log directory:
sed 's,^log_outputs.*,log_outputs="3:file:'"$(pwd)/log"'",' tmp.conf > k \
|| fail=1
mv k tmp.conf || fail=1
2010-05-17 20:32:45 +04:00
# Unix socket max path size is 108 on linux. If the generated sock path
# exceeds this, the test will fail, so skip it if CWD is too long
SOCKPATH=`pwd`/libvirt-sock
if test 108 -lt `echo $SOCKPATH | wc -c`; then
skip_test_ "CWD too long"
fi
2010-10-19 22:27:51 +04:00
# Replace the invalid host_uuid with one that is valid and
# relax audit_level from 2 to 1, otherwise libvirtd will report an error
# when auditing is disabled on the host or during compilation
sed 's/^\(host_uuid =.*\)0"$/\11"/; s/^\(audit_level =.*\)2$/\1 1/' tmp.conf > k
mv k tmp.conf
2010-05-25 23:12:01 +04:00
$abs_top_builddir/daemon/libvirtd --pid-file=pid-file --config=tmp.conf \
> log 2>&1 & pid=$!
2008-12-01 18:04:28 +03:00
sleep $sleep_secs
2007-12-12 00:20:13 +03:00
kill $pid
2009-11-30 22:01:31 +03:00
RET=0
2007-12-12 00:20:13 +03:00
# Expect an orderly shut-down and successful exit.
2009-11-30 22:01:31 +03:00
wait $pid || RET=1
test_result $i "valid config file (sleeping $sleep_secs seconds)" $RET
test $RET = 0 || fail=1
test_final $i $fail
2007-12-12 00:20:13 +03:00
# "cat log" would print this for non-root:
# Cannot set group when not running as root
# Shutting down on signal 15
# And normally, we'd require that output, but obviously
# it'd be different for root.
exit $fail