~ubuntu-branches/ubuntu/maverick/libvirt/maverick

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#!/bin/sh
# Get coverage of libvirtd's config-parsing code.

if test "$VERBOSE" = yes; then
  set -x
  libvirtd --version
fi

# Boilerplate code to set up a test directory, cd into it,
# and to ensure we remove it upon completion.
this_test_() { echo "./$0" | sed 's,.*/,,'; }
t_=$(this_test_)-$$
init_cwd_=$(pwd)
trap 'st=$?; d='"$t_"';
    cd '"$init_cwd_"' && chmod -R u+rwx "$d" && rm -rf "$d" && exit $st' 0
trap '(exit $?); exit $?' 1 2 13 15
mkdir "$t_" || fail=1
cd "$t_" || fail=1

conf="$abs_top_srcdir/qemud/libvirtd.conf"

# Ensure that each commented out PARAMETER = VALUE line has the expected form.
grep '[a-z_]  *=  *[^ ]' "$conf" | 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=1
while :; do
  param_name=$(sed -n "$i"'s/ = .*//p' tmp.conf)
  printf "testing with corrupted config: $param_name\n" 1>&2
  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.
  libvirtd --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

  # Filter out some ignorable diagnostics and drop timestamps
  sed \
      -e 's/.*: error : //' \
      -e '/^Cannot set group when not running as root$/d' \
      -e '/^libnuma: Warning: .sys not mounted or no numa system/d' \
    err > k && mv k err

  printf '%s\n\n' "remoteReadConfigFile: $f: $param_name: $msg" > expected-err
  diff -u expected-err err || fail=1

  i=$(expr $i + 1)
done

# Run with the unmodified config file.
sleep_secs=2
printf "running libvirtd with a valid config file ($sleep_secs seconds)\n" 1>&2
libvirtd --config=tmp.conf > log 2>&1 & pid=$!
sleep $sleep_secs
kill $pid

# Expect an orderly shut-down and successful exit.
wait $pid || fail=1

# "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