Merge "Rework functional test runner"
This commit is contained in:
commit
8e9c54d01a
@ -372,6 +372,14 @@ In order to create a test case, follow these steps:
|
|||||||
* To exit early and indicate a success, touch a file
|
* To exit early and indicate a success, touch a file
|
||||||
``/tmp/dib-test-should-fail`` in the image chroot, then exit 1.
|
``/tmp/dib-test-should-fail`` in the image chroot, then exit 1.
|
||||||
|
|
||||||
|
Tests are run with ``tools/run_functests.sh``. Running
|
||||||
|
``run_functests.sh -l`` will show available tests (the example above
|
||||||
|
would be called ``apt-sources/test-case-1``, for example). Specify
|
||||||
|
your test (or a series of tests as separate arguments) on the command
|
||||||
|
line to run it. If it should not be run as part of the default CI
|
||||||
|
run, you can submit a change with it added to ``DEFAULT_SKIP_TESTS``
|
||||||
|
in that file.
|
||||||
|
|
||||||
python
|
python
|
||||||
""""""
|
""""""
|
||||||
|
|
||||||
|
12
tests/README.rst
Normal file
12
tests/README.rst
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
DIB Testing
|
||||||
|
===========
|
||||||
|
|
||||||
|
There are several interfaces for testing various parts of DIB
|
||||||
|
|
||||||
|
* run_dib_library_tests.sh : run unit-tests for internal
|
||||||
|
diskimage-builder library functions
|
||||||
|
|
||||||
|
* run_functests.sh : run functional testing provided by elements
|
||||||
|
|
||||||
|
* run_output_format_test.sh : run a test of image conversion
|
||||||
|
(requires docker)
|
@ -1,23 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
set -eux
|
|
||||||
set -o pipefail
|
|
||||||
|
|
||||||
source $(dirname $0)/test_functions.bash
|
|
||||||
|
|
||||||
test_formats="tar raw qcow2 docker aci"
|
|
||||||
for binary in qemu-img docker ; do
|
|
||||||
if [ -z "$(which $binary)" ]; then
|
|
||||||
echo "Warning: No $binary binary found, cowardly refusing to run tests."
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
for format in '' $test_formats; do
|
|
||||||
build_test_image $format
|
|
||||||
echo "Test passed for output formats '$format'."
|
|
||||||
done
|
|
||||||
|
|
||||||
combined_format=$(echo $test_formats | tr ' ' ',')
|
|
||||||
build_test_image $combined_format
|
|
||||||
echo "Test passed for output format '$combined_format'."
|
|
@ -1,13 +1,179 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
set -eux
|
set -eu
|
||||||
set -o pipefail
|
set -o pipefail
|
||||||
|
|
||||||
element=${1:-}
|
BASE_DIR=$(cd $(dirname "$0")/.. && pwd)
|
||||||
|
export DIB_ELEMENTS=$BASE_DIR/elements
|
||||||
|
export DIB_CMD=$BASE_DIR/bin/disk-image-create
|
||||||
|
|
||||||
if [ -z $element ]; then
|
#
|
||||||
$(dirname $0)/image_output_formats.bash
|
# Default skip tests
|
||||||
|
#
|
||||||
|
# For time reasons, we do not run these tests by default; i.e. these
|
||||||
|
# tests are not run by "tox -e func" in the gate.
|
||||||
|
#
|
||||||
|
DEFAULT_SKIP_TESTS=(
|
||||||
|
# we run version pinned test in gate (this just runs latest)
|
||||||
|
fedora/build-succeeds
|
||||||
|
)
|
||||||
|
|
||||||
|
# run_disk_element_test <test_element> <element>
|
||||||
|
# Run a disk-image-build .tar build of ELEMENT including any elements
|
||||||
|
# specified by TEST_ELEMENT
|
||||||
|
function run_disk_element_test() {
|
||||||
|
local test_element=$1
|
||||||
|
local element=$2
|
||||||
|
local dest_dir=$(mktemp -d)
|
||||||
|
|
||||||
|
trap "rm -rf $dest_dir /tmp/dib-test-should-fail" EXIT
|
||||||
|
|
||||||
|
if break="after-error" break_outside_target=1 \
|
||||||
|
break_cmd="cp \$TMP_MOUNT_PATH/tmp/dib-test-should-fail /tmp/ 2>&1 > /dev/null || true" \
|
||||||
|
ELEMENTS_PATH=$DIB_ELEMENTS:$DIB_ELEMENTS/$element/test-elements \
|
||||||
|
$DIB_CMD -t tar -o $dest_dir/image -n $element $test_element; then
|
||||||
|
if ! [ -f "$dest_dir/image.tar" ]; then
|
||||||
|
echo "Error: Build failed for element: $element, test-element: $test_element."
|
||||||
|
echo "No image $dest_dir/image.tar found!"
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
if tar -tf $dest_dir/image.tar | grep -q /tmp/dib-test-should-fail; then
|
||||||
|
echo "Error: Element: $element, test-element $test_element should have failed, but passed."
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
echo "PASS: Element $element, test-element: $test_element"
|
||||||
fi
|
fi
|
||||||
$(dirname $0)/test_elements.bash $element
|
fi
|
||||||
|
else
|
||||||
|
if [ -f "/tmp/dib-test-should-fail" ]; then
|
||||||
|
echo "PASS: Element $element, test-element: $test_element"
|
||||||
|
else
|
||||||
|
echo "Error: Build failed for element: $element, test-element: $test_element."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
trap EXIT
|
||||||
|
rm -rf $dest_dir /tmp/dib-test-should-fail
|
||||||
|
}
|
||||||
|
|
||||||
|
# run_ramdisk_element_test <test_element> <element>
|
||||||
|
# Run a disk-image-builder default build of ELEMENT including any
|
||||||
|
# elements specified by TEST_ELEMENT
|
||||||
|
function run_ramdisk_element_test() {
|
||||||
|
local test_element=$1
|
||||||
|
local element=$2
|
||||||
|
local dest_dir=$(mktemp -d)
|
||||||
|
|
||||||
|
if ELEMENTS_PATH=$DIB_ELEMENTS/$element/test-elements \
|
||||||
|
$DIB_CMD -o $dest_dir/image $element $test_element; then
|
||||||
|
# TODO(dtantsur): test also kernel presence once we sort out its naming
|
||||||
|
# problem (vmlinuz vs kernel)
|
||||||
|
if ! [ -f "$dest_dir/image.initramfs" ]; then
|
||||||
|
echo "Error: Build failed for element: $element, test-element: $test_element."
|
||||||
|
echo "No image $dest_dir/image.initramfs found!"
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
echo "PASS: Element $element, test-element: $test_element"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "Error: Build failed for element: $element, test-element: $test_element."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# run_functests.sh
|
||||||
|
# run the functional tests for dib elements
|
||||||
|
#
|
||||||
|
|
||||||
|
# find elements that have functional test elements. TESTS will be an
|
||||||
|
# array with each value being "element/test-element"
|
||||||
|
TESTS=()
|
||||||
|
for e in $DIB_ELEMENTS/*/test-elements/*; do
|
||||||
|
test_element=$(echo $e | awk 'BEGIN {FS="/"}{print $NF}')
|
||||||
|
element=$(echo $e | awk 'BEGIN {FS="/"}{print $(NF-2)}')
|
||||||
|
TESTS+=("$element/$test_element")
|
||||||
|
done
|
||||||
|
|
||||||
|
while getopts ":hl" opt; do
|
||||||
|
case $opt in
|
||||||
|
h)
|
||||||
|
echo "run_functests.sh [-h] [-l] <test> <test> ..."
|
||||||
|
echo " -h : show this help"
|
||||||
|
echo " -l : list available tests"
|
||||||
|
echo " <test> : functional test to run"
|
||||||
|
echo " Special test 'all' will run all tests"
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
l)
|
||||||
|
echo "The available functional tests are:"
|
||||||
|
echo
|
||||||
|
for t in ${TESTS[@]}; do
|
||||||
|
echo " $t"
|
||||||
|
done
|
||||||
|
echo
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
\?)
|
||||||
|
echo "Invalid option: -$OPTARG"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
shift $((OPTIND-1))
|
||||||
|
|
||||||
|
# cull the list of tests to run into TESTS_TO_RUN
|
||||||
|
TESTS_TO_RUN=()
|
||||||
|
title=""
|
||||||
|
if [[ -z "$@" ]]; then
|
||||||
|
# remove the skipped tests
|
||||||
|
title="Running default tests:"
|
||||||
|
for test in "${TESTS[@]}"; do
|
||||||
|
if [[ " ${DEFAULT_SKIP_TESTS[@]} " =~ " ${test} " ]]; then
|
||||||
|
continue
|
||||||
|
else
|
||||||
|
TESTS_TO_RUN+=("${test}")
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
elif [[ $1 == "all" ]]; then
|
||||||
|
title="Running all tests:"
|
||||||
|
TESTS_TO_RUN=("${TESTS[@]}")
|
||||||
|
else
|
||||||
|
title="Running specified tests:"
|
||||||
|
for test in $@; do
|
||||||
|
if [[ ! " ${TESTS[@]} " =~ " ${test} " ]]; then
|
||||||
|
echo "${test} : not a known test (see -l)"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
TESTS_TO_RUN+=("${test}")
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
# print a little status info
|
||||||
|
echo "------"
|
||||||
|
echo ${title}
|
||||||
|
for test in "${TESTS_TO_RUN[@]}"; do
|
||||||
|
echo " ${test}"
|
||||||
|
done
|
||||||
|
echo "------"
|
||||||
|
|
||||||
|
for test in "${TESTS_TO_RUN[@]}"; do
|
||||||
|
# from above; each array value is element/test_element. split it
|
||||||
|
# back up
|
||||||
|
element=${test%/*}
|
||||||
|
test_element=${test#*/}
|
||||||
|
|
||||||
|
# tests default to disk-based, but "element-type" can optionally
|
||||||
|
# override that
|
||||||
|
element_type=disk
|
||||||
|
element_type_override=$DIB_ELEMENTS/${element}/test-elements/${test_element}/element-type
|
||||||
|
if [ -f ${element_type_override} ]; then
|
||||||
|
element_type=$(cat ${element_type_override})
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Running $test ($element_type)"
|
||||||
|
run_${element_type}_element_test $test_element $element
|
||||||
|
done
|
||||||
|
|
||||||
echo "Tests passed!"
|
echo "Tests passed!"
|
||||||
|
77
tests/run_output_format_test.sh
Executable file
77
tests/run_output_format_test.sh
Executable file
@ -0,0 +1,77 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -eu
|
||||||
|
set -o pipefail
|
||||||
|
|
||||||
|
#
|
||||||
|
# run_output_format_test.sh
|
||||||
|
#
|
||||||
|
# Use docker to test generation of various output formats.
|
||||||
|
#
|
||||||
|
|
||||||
|
BASE_DIR=$(cd $(dirname "$0")/.. && pwd)
|
||||||
|
export DIB_ELEMENTS=$BASE_DIR/elements
|
||||||
|
export TEST_ELEMENTS=$BASE_DIR/tests/elements
|
||||||
|
export DIB_CMD=$BASE_DIR/bin/disk-image-create
|
||||||
|
|
||||||
|
function build_test_image() {
|
||||||
|
format=${1:-}
|
||||||
|
|
||||||
|
if [ -n "$format" ]; then
|
||||||
|
type_arg="-t $format"
|
||||||
|
else
|
||||||
|
type_arg=
|
||||||
|
format="qcow2"
|
||||||
|
fi
|
||||||
|
dest_dir=$(mktemp -d)
|
||||||
|
base_dest=$(basename $dest_dir)
|
||||||
|
|
||||||
|
trap "rm -rf $dest_dir; docker rmi $base_dest/image" EXIT
|
||||||
|
|
||||||
|
ELEMENTS_PATH=$DIB_ELEMENTS:$TEST_ELEMENTS \
|
||||||
|
$DIB_CMD -x $type_arg --docker-target=$base_dest/image \
|
||||||
|
-o $dest_dir/image -n fake-os
|
||||||
|
|
||||||
|
format=$(echo $format | tr ',' ' ')
|
||||||
|
for format in $format; do
|
||||||
|
if [ $format != 'docker' ]; then
|
||||||
|
img_path="$dest_dir/image.$format"
|
||||||
|
if ! [ -f "$img_path" ]; then
|
||||||
|
echo "Error: No image with name $img_path found!"
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
echo "Found image $img_path."
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
if ! docker images | grep $base_dest/image ; then
|
||||||
|
echo "Error: No docker image with name $base_dest/image found!"
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
echo "Found docker image $base_dest/image"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
trap EXIT
|
||||||
|
rm -rf $dest_dir
|
||||||
|
if docker images | grep $base_dest/image ; then
|
||||||
|
docker rmi $base_dest/image
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
test_formats="tar raw qcow2 docker aci"
|
||||||
|
for binary in qemu-img docker ; do
|
||||||
|
if [ -z "$(which $binary)" ]; then
|
||||||
|
echo "Warning: No $binary binary found, cowardly refusing to run tests."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
for format in '' $test_formats; do
|
||||||
|
build_test_image $format
|
||||||
|
echo "Test passed for output formats '$format'."
|
||||||
|
done
|
||||||
|
|
||||||
|
combined_format=$(echo $test_formats | tr ' ' ',')
|
||||||
|
build_test_image $combined_format
|
||||||
|
echo "Test passed for output format '$combined_format'."
|
@ -1,33 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
set -eux
|
|
||||||
set -o pipefail
|
|
||||||
|
|
||||||
basedir=$(dirname $0)
|
|
||||||
requested_element=${1:-}
|
|
||||||
source $basedir/test_functions.bash
|
|
||||||
|
|
||||||
function run_on_element {
|
|
||||||
test_element=$1
|
|
||||||
# our element name is two dirs up
|
|
||||||
local element_name=$(basename $(dirname $(dirname $test_element)))
|
|
||||||
local element_type=disk
|
|
||||||
if [ -f "$test_element/element-type" ]; then
|
|
||||||
element_type=$(cat "$test_element/element-type")
|
|
||||||
fi
|
|
||||||
run_${element_type}_element_test "$(basename $test_element)" "$element_name"
|
|
||||||
}
|
|
||||||
|
|
||||||
if [ -z $requested_element ]; then
|
|
||||||
for test_element in $basedir/../elements/*/test-elements/*; do
|
|
||||||
if [ -d "$test_element" ]; then
|
|
||||||
run_on_element "$test_element"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
else
|
|
||||||
for test_element in $basedir/../elements/$requested_element/test-elements/*; do
|
|
||||||
if [ -d "$test_element" ]; then
|
|
||||||
run_on_element "$test_element"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
fi
|
|
@ -1,108 +0,0 @@
|
|||||||
export TEST_ELEMENTS=$(dirname $0)/elements
|
|
||||||
export DIB_ELEMENTS=$(dirname $0)/../elements
|
|
||||||
export DIB_CMD=$(dirname $0)/../bin/disk-image-create
|
|
||||||
|
|
||||||
function build_test_image() {
|
|
||||||
format=${1:-}
|
|
||||||
|
|
||||||
if [ -n "$format" ]; then
|
|
||||||
type_arg="-t $format"
|
|
||||||
else
|
|
||||||
type_arg=
|
|
||||||
format="qcow2"
|
|
||||||
fi
|
|
||||||
dest_dir=$(mktemp -d)
|
|
||||||
base_dest=$(basename $dest_dir)
|
|
||||||
|
|
||||||
trap "rm -rf $dest_dir; docker rmi $base_dest/image" EXIT
|
|
||||||
|
|
||||||
ELEMENTS_PATH=$DIB_ELEMENTS:$TEST_ELEMENTS \
|
|
||||||
$DIB_CMD -x $type_arg --docker-target=$base_dest/image \
|
|
||||||
-o $dest_dir/image -n fake-os
|
|
||||||
|
|
||||||
format=$(echo $format | tr ',' ' ')
|
|
||||||
for format in $format; do
|
|
||||||
if [ $format != 'docker' ]; then
|
|
||||||
img_path="$dest_dir/image.$format"
|
|
||||||
if ! [ -f "$img_path" ]; then
|
|
||||||
echo "Error: No image with name $img_path found!"
|
|
||||||
exit 1
|
|
||||||
else
|
|
||||||
echo "Found image $img_path."
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
if ! docker images | grep $base_dest/image ; then
|
|
||||||
echo "Error: No docker image with name $base_dest/image found!"
|
|
||||||
exit 1
|
|
||||||
else
|
|
||||||
echo "Found docker image $base_dest/image"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
trap EXIT
|
|
||||||
rm -rf $dest_dir
|
|
||||||
if docker images | grep $base_dest/image ; then
|
|
||||||
docker rmi $base_dest/image
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
function run_disk_element_test() {
|
|
||||||
test_element=$1
|
|
||||||
element=$2
|
|
||||||
|
|
||||||
dest_dir=$(mktemp -d)
|
|
||||||
|
|
||||||
trap "rm -rf $dest_dir /tmp/dib-test-should-fail" EXIT
|
|
||||||
|
|
||||||
if break="after-error" break_outside_target=1 \
|
|
||||||
break_cmd="cp \$TMP_MOUNT_PATH/tmp/dib-test-should-fail /tmp/ 2>&1 > /dev/null || true" \
|
|
||||||
ELEMENTS_PATH=$DIB_ELEMENTS:$DIB_ELEMENTS/$element/test-elements \
|
|
||||||
$DIB_CMD -t tar -o $dest_dir/image -n $element $test_element; then
|
|
||||||
if ! [ -f "$dest_dir/image.tar" ]; then
|
|
||||||
echo "Error: Build failed for element: $element, test-element: $test_element."
|
|
||||||
echo "No image $dest_dir/image.tar found!"
|
|
||||||
exit 1
|
|
||||||
else
|
|
||||||
if tar -tf $dest_dir/image.tar | grep -q /tmp/dib-test-should-fail; then
|
|
||||||
echo "Error: Element: $element, test-element $test_element should have failed, but passed."
|
|
||||||
exit 1
|
|
||||||
else
|
|
||||||
echo "PASS: Element $element, test-element: $test_element"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
if [ -f "/tmp/dib-test-should-fail" ]; then
|
|
||||||
echo "PASS: Element $element, test-element: $test_element"
|
|
||||||
else
|
|
||||||
echo "Error: Build failed for element: $element, test-element: $test_element."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
trap EXIT
|
|
||||||
rm -rf $dest_dir /tmp/dib-test-should-fail
|
|
||||||
}
|
|
||||||
|
|
||||||
function run_ramdisk_element_test() {
|
|
||||||
test_element=$1
|
|
||||||
element=$2
|
|
||||||
|
|
||||||
dest_dir=$(mktemp -d)
|
|
||||||
|
|
||||||
if ELEMENTS_PATH=$DIB_ELEMENTS/$element/test-elements \
|
|
||||||
$DIB_CMD -o $dest_dir/image $element $test_element; then
|
|
||||||
# TODO(dtantsur): test also kernel presence once we sort out its naming
|
|
||||||
# problem (vmlinuz vs kernel)
|
|
||||||
if ! [ -f "$dest_dir/image.initramfs" ]; then
|
|
||||||
echo "Error: Build failed for element: $element, test-element: $test_element."
|
|
||||||
echo "No image $dest_dir/image.initramfs found!"
|
|
||||||
exit 1
|
|
||||||
else
|
|
||||||
echo "PASS: Element $element, test-element: $test_element"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo "Error: Build failed for element: $element, test-element: $test_element."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user