devstack/tools/xen/test_functions.sh
Sean Dague 16dd8b3ed9 introduce if/then & for/do rules
we mostly have a consistent style on if/then & for/do in devstack,
except when we don't. This attempts to build a set of rules to
enforce this.

Because there are times when lines are legitimately long, and there
is a continuation, this starts off ignoring if and for loops with
continuations. But for short versions, we should enforce this.

Changes to make devstack pass are included. The fact that the
cleanup patch was so small is pretty solid reason that this is
actually the style we've all agreed to.

Part of a git stash from hong kong that I finally cleaned up.

Change-Id: I6376d7afd59cc5ebba9ed69e5ee784a3d5934a10
2014-02-05 07:52:54 +01:00

247 lines
5.1 KiB
Bash
Executable File

#!/bin/bash
# Tests for functions.
#
# The tests are sourcing the mocks file to mock out various functions. The
# mocking-out always happens in a sub-shell, thus it does not have impact on
# the functions defined here.
# To run the tests, please run:
#
# ./test_functions.sh run_tests
#
# To only print out the discovered test functions, run:
#
# ./test_functions.sh
. functions
# Setup
function before_each_test {
LIST_OF_DIRECTORIES=$(mktemp)
truncate -s 0 $LIST_OF_DIRECTORIES
LIST_OF_ACTIONS=$(mktemp)
truncate -s 0 $LIST_OF_ACTIONS
XE_RESPONSE=$(mktemp)
truncate -s 0 $XE_RESPONSE
XE_CALLS=$(mktemp)
truncate -s 0 $XE_CALLS
DEAD_MESSAGES=$(mktemp)
truncate -s 0 $DEAD_MESSAGES
}
# Teardown
function after_each_test {
rm -f $LIST_OF_DIRECTORIES
rm -f $LIST_OF_ACTIONS
rm -f $XE_RESPONSE
rm -f $XE_CALLS
}
# Helpers
function setup_xe_response {
echo "$1" > $XE_RESPONSE
}
function given_directory_exists {
echo "$1" >> $LIST_OF_DIRECTORIES
}
function assert_directory_exists {
grep "$1" $LIST_OF_DIRECTORIES
}
function assert_previous_command_failed {
[ "$?" != "0" ] || exit 1
}
function assert_xe_min {
grep -qe "^--minimal\$" $XE_CALLS
}
function assert_xe_param {
grep -qe "^$1\$" $XE_CALLS
}
function assert_died_with {
diff -u <(echo "$1") $DEAD_MESSAGES
}
function mock_out {
local FNNAME="$1"
local OUTPUT="$2"
. <(cat << EOF
function $FNNAME {
echo "$OUTPUT"
}
EOF
)
}
function assert_symlink {
grep -qe "^ln -s $2 $1\$" $LIST_OF_ACTIONS
}
# Tests
function test_plugin_directory_on_xenserver {
given_directory_exists "/etc/xapi.d/plugins/"
PLUGDIR=$(. mocks && xapi_plugin_location)
[ "/etc/xapi.d/plugins/" = "$PLUGDIR" ]
}
function test_plugin_directory_on_xcp {
given_directory_exists "/usr/lib/xcp/plugins/"
PLUGDIR=$(. mocks && xapi_plugin_location)
[ "/usr/lib/xcp/plugins/" = "$PLUGDIR" ]
}
function test_no_plugin_directory_found {
set +e
local IGNORE
IGNORE=$(. mocks && xapi_plugin_location)
assert_previous_command_failed
grep "[ -d /etc/xapi.d/plugins/ ]" $LIST_OF_ACTIONS
grep "[ -d /usr/lib/xcp/plugins/ ]" $LIST_OF_ACTIONS
}
function test_zip_snapshot_location_http {
diff \
<(zip_snapshot_location "http://github.com/openstack/nova.git" "master") \
<(echo "http://github.com/openstack/nova/zipball/master")
}
function test_zip_snapsot_location_git {
diff \
<(zip_snapshot_location "git://github.com/openstack/nova.git" "master") \
<(echo "http://github.com/openstack/nova/zipball/master")
}
function test_create_directory_for_kernels {
(
. mocks
mock_out get_local_sr_path /var/run/sr-mount/uuid1
create_directory_for_kernels
)
assert_directory_exists "/var/run/sr-mount/uuid1/os-guest-kernels"
assert_symlink "/boot/guest" "/var/run/sr-mount/uuid1/os-guest-kernels"
}
function test_create_directory_for_kernels_existing_dir {
(
. mocks
given_directory_exists "/boot/guest"
create_directory_for_kernels
)
diff -u $LIST_OF_ACTIONS - << EOF
[ -d /boot/guest ]
EOF
}
function test_create_directory_for_images {
(
. mocks
mock_out get_local_sr_path /var/run/sr-mount/uuid1
create_directory_for_images
)
assert_directory_exists "/var/run/sr-mount/uuid1/os-images"
assert_symlink "/images" "/var/run/sr-mount/uuid1/os-images"
}
function test_create_directory_for_images_existing_dir {
(
. mocks
given_directory_exists "/images"
create_directory_for_images
)
diff -u $LIST_OF_ACTIONS - << EOF
[ -d /images ]
EOF
}
function test_extract_remote_zipball {
local RESULT=$(. mocks && extract_remote_zipball "someurl")
diff <(cat $LIST_OF_ACTIONS) - << EOF
wget -nv someurl -O tempfile --no-check-certificate
unzip -q -o tempfile -d tempdir
rm -f tempfile
EOF
[ "$RESULT" = "tempdir" ]
}
function test_extract_remote_zipball_wget_fail {
set +e
local IGNORE
IGNORE=$(. mocks && extract_remote_zipball "failurl")
assert_died_with "Failed to download [failurl]"
}
function test_find_nova_plugins {
local tmpdir=$(mktemp -d)
mkdir -p "$tmpdir/blah/blah/u/xapi.d/plugins"
[ "$tmpdir/blah/blah/u/xapi.d/plugins" = $(find_xapi_plugins_dir $tmpdir) ]
rm -rf $tmpdir
}
function test_get_local_sr {
setup_xe_response "uuid123"
local RESULT=$(. mocks && get_local_sr)
[ "$RESULT" == "uuid123" ]
assert_xe_param "pool-list" params=default-SR minimal=true
}
function test_get_local_sr_path {
local RESULT=$(mock_out get_local_sr "uuid1" && get_local_sr_path)
[ "/var/run/sr-mount/uuid1" == "$RESULT" ]
}
# Test runner
[ "$1" = "" ] && {
grep -e "^function *test_" $0 | cut -d" " -f2
}
[ "$1" = "run_tests" ] && {
for testname in $($0); do
echo "$testname"
before_each_test
(
set -eux
$testname
)
if [ "$?" != "0" ]; then
echo "FAIL"
exit 1
else
echo "PASS"
fi
after_each_test
done
}