mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-25 23:25:24 +00:00
df5944ff02
The max path length for unix sockets is pretty small (108, see man 7 unix). If 'make check' is run from a directory that exceeds this, one of the tests will fail, and in such a way that requires manually editting the test to determine why. There are certainly other ways to handle this, but I've chosen just to skip the offending test if we will exceed the length limitation. v2: Drop bashism, use test infrastructure to warn and skip
106 lines
3.1 KiB
Bash
Executable File
106 lines
3.1 KiB
Bash
Executable File
#!/bin/sh
|
|
# Get coverage of libvirtd's config-parsing code.
|
|
|
|
test -z "$srcdir" && srcdir=$(pwd)
|
|
LC_ALL=C
|
|
. "$srcdir/test-lib.sh"
|
|
|
|
if test "$verbose" = yes; then
|
|
$abs_top_builddir/daemon/libvirtd --version
|
|
fi
|
|
|
|
test_intro "$this_test"
|
|
|
|
test -z "$CONFIG_HEADER" && CONFIG_HEADER="$abs_top_builddir/config.h"
|
|
|
|
grep '^#define WITH_QEMU 1' "$CONFIG_HEADER" > /dev/null ||
|
|
skip_test_ "configured without QEMU support"
|
|
|
|
conf="$abs_top_srcdir/daemon/libvirtd.conf"
|
|
|
|
# Ensure that each commented out PARAMETER = VALUE line has the expected form.
|
|
grep -v '\"PARAMETER = VALUE\"' "$conf" | grep '[a-z_] *= *[^ ]' | grep -vE '^#[a-z_]+ = ' \
|
|
&& { echo "$0: found unexpected lines (above) in $conf" 1>&2; exit 1; }
|
|
|
|
# Start with the sample libvirtd.conf file, uncommenting all real directives.
|
|
sed -n 's/^#\([^ #]\)/\1/p' "$conf" > tmp.conf
|
|
|
|
# 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)
|
|
i=0
|
|
fail=0
|
|
while :; do
|
|
i=$(expr $i + 1)
|
|
|
|
param_name=$(sed -n "$i"'s/ = .*//p' tmp.conf)
|
|
rhs=$(sed -n "$i"'s/.* = \(.*\)/\1/p' tmp.conf)
|
|
f=in$i.conf
|
|
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.
|
|
$abs_top_builddir/daemon/libvirtd --pid-file=pid-file --config=$f 2> err && fail=1
|
|
|
|
case $rhs in
|
|
# '"'*) msg='should be a string';;
|
|
'"'*) msg='invalid type: got long; expected string';;
|
|
[0-9]*) msg='invalid type: got string; expected long';;
|
|
'['*) msg='must be a string or list of strings';;
|
|
*) echo "unexpected RHS: $rhs" 1>&2; fail=1;;
|
|
esac
|
|
|
|
test $i = $n && break
|
|
|
|
# Check that the diagnostic we want appears
|
|
grep "$msg" err 1>/dev/null 2>&1
|
|
RET=$?
|
|
test_result $i "corrupted config $param_name" $RET
|
|
test "$RET" = "0" || fail=1
|
|
done
|
|
|
|
# Run with the unmodified config file.
|
|
sleep_secs=2
|
|
|
|
# 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
|
|
|
|
# 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
|
|
|
|
$abs_top_builddir/daemon/libvirtd --pid-file=pid-file --config=tmp.conf > log 2>&1 & pid=$!
|
|
sleep $sleep_secs
|
|
kill $pid
|
|
|
|
RET=0
|
|
# Expect an orderly shut-down and successful exit.
|
|
wait $pid || RET=1
|
|
|
|
test_result $i "valid config file (sleeping $sleep_secs seconds)" $RET
|
|
test $RET = 0 || fail=1
|
|
|
|
test_final $i $fail
|
|
|
|
# "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
|