diff --git a/.gitignore b/.gitignore index 1c0cfa2..bf0c45b 100644 --- a/.gitignore +++ b/.gitignore @@ -27,3 +27,7 @@ cscope.* coverage/ src/*.gcno src/*.gcda +tap-driver.sh +test/functional/*.log +test/functional/*.trs +test-suite.log diff --git a/Makefile.am b/Makefile.am index 5e5d22a..1e8cb02 100644 --- a/Makefile.am +++ b/Makefile.am @@ -96,6 +96,25 @@ noinst_HEADERS = \ include/swupd.h \ include/xattrs.h +TEST_EXTENSIONS = .sh + +if ENABLE_TESTS +tap_driver = env AM_TAP_AWK='$(AWK)' $(SHELL) \ + $(top_srcdir)/tap-driver.sh + +LOG_DRIVER = $(tap_driver) +SH_LOG_DRIVER = $(tap_driver) + +TESTS = $(dist_check_SCRIPTS) + +dist_check_SCRIPTS = \ + test/functional/basic.bats \ + test/functional/update.bats \ + test/functional/fullfiles.bats \ + test/functional/pack.bats \ + test/functional/full-run.bats +endif + if COVERAGE AM_CFLAGS += --coverage diff --git a/configure.ac b/configure.ac index f56d49f..d34aa98 100644 --- a/configure.ac +++ b/configure.ac @@ -28,6 +28,11 @@ AC_ARG_ENABLE( AC_DEFINE(SWUPD_WITH_STATELESS,1,[OS is stateless]) ) +AC_ARG_ENABLE( + [tests], + [AS_HELP_STRING([--disable-tests], [Do not enable functional test framework (enabled by default)])] +) + have_coverage=no AC_ARG_ENABLE(coverage, AS_HELP_STRING([--enable-coverage], [enable test coverage])) if test "$enable_coverage" = "yes" ; then @@ -47,6 +52,14 @@ if test "$enable_coverage" = "yes" ; then fi AM_CONDITIONAL([COVERAGE], [test "$have_coverage" = "yes"]) +AS_IF([test "$enable_tests" != "no"], [ + AC_PATH_PROG([have_bats], [bats]) + AS_IF([test -z "${have_bats}"], [ + AC_MSG_ERROR([Must have the Bash Automated Testing System (bats) installed to run functional tests]) + ]) +]) +AM_CONDITIONAL([ENABLE_TESTS], [test "$enable_tests" != "no"]) + AS_IF([test "$enable_bzip2" != "no"], [ AC_CHECK_LIB([bz2], [BZ2_bzBuffToBuffCompress], [], [AC_MSG_ERROR([the libbz2 library is missing])]) AC_CHECK_PROGS(BZIP2, bzip2) @@ -61,4 +74,5 @@ AS_IF([test "$enable_lzma" != "no"], [ AM_CONDITIONAL([ENABLE_LZMA], [test "$enable_lzma" != "no"]) AC_CONFIG_FILES([Makefile]) +AC_REQUIRE_AUX_FILE([tap-driver.sh]) AC_OUTPUT diff --git a/test/functional/basic.bats b/test/functional/basic.bats new file mode 100755 index 0000000..898538c --- /dev/null +++ b/test/functional/basic.bats @@ -0,0 +1,24 @@ +#!/usr/bin/env bats + +@test "create_update help output" { + run $srcdir/swupd_create_update --help + [ "$status" -eq 1 ] + run $srcdir/swupd_create_update -h + [ "$status" -eq 1 ] +} + +@test "make_fullfiles help output" { + run $srcdir/swupd_make_fullfiles --help + [ "$status" -eq 1 ] + run $srcdir/swupd_make_fullfiles -h + [ "$status" -eq 1 ] +} + +@test "make_pack help output" { + run $srcdir/swupd_make_pack --help + [ "$status" -eq 1 ] + run $srcdir/swupd_make_pack -h + [ "$status" -eq 1 ] +} + +# vi: ft=sh ts=8 sw=2 sts=2 et tw=80 diff --git a/test/functional/full-run.bats b/test/functional/full-run.bats new file mode 100755 index 0000000..d5fa258 --- /dev/null +++ b/test/functional/full-run.bats @@ -0,0 +1,31 @@ +#!/usr/bin/env bats + +# common functions +load swupdlib + +setup() { + DIR=$(init_web_dir "$srcdir/web-dir") + export DIR + + init_server_ini + init_latest_ver 0 + init_groups_ini os-core test-bundle + + set_os_release 10 os-core + set_os_release 10 test-bundle + track_bundle 10 os-core + track_bundle 10 test-bundle +} + +@test "full run update creation" { + sudo $srcdir/swupd_create_update --osversion 10 --statedir $DIR + sudo $srcdir/swupd_make_fullfiles --statedir $DIR 10 + sudo $srcdir/swupd_make_pack --statedir $DIR 0 10 os-core + sudo $srcdir/swupd_make_pack --statedir $DIR 0 10 test-bundle +} + +teardown() { + sudo rm -rf $DIR +} + +# vi: ft=sh ts=8 sw=2 sts=2 et tw=80 diff --git a/test/functional/fullfiles.bats b/test/functional/fullfiles.bats new file mode 100755 index 0000000..01ea6b9 --- /dev/null +++ b/test/functional/fullfiles.bats @@ -0,0 +1,20 @@ +#!/usr/bin/env bats + +@test "make_fullfiles required arg" { + run $srcdir/swupd_make_fullfiles + [ "$status" -eq 1 ] +} + +@test "make_fullfiles too many arguments" { + # exactly one argument must be passed + run $srcdir/swupd_make_fullfiles foo bar + [ "$status" -eq 1 ] +} + +@test "make_fullfiles root priv check" { + run $srcdir/swupd_make_fullfiles foo + [ "$status" -eq 1 ] + [[ "$output" =~ "not being run as root.. exiting" ]] +} + +# vi: ft=sh ts=8 sw=2 sts=2 et tw=80 diff --git a/test/functional/pack.bats b/test/functional/pack.bats new file mode 100755 index 0000000..70ce030 --- /dev/null +++ b/test/functional/pack.bats @@ -0,0 +1,26 @@ +#!/usr/bin/env bats + +@test "make_pack required arg" { + run $srcdir/swupd_make_pack + [ "$status" -eq 1 ] +} + +@test "make_pack too few arguments" { + run $srcdir/swupd_make_pack foo + [ "$status" -eq 1 ] + run $srcdir/swupd_make_pack foo bar + [ "$status" -eq 1 ] +} + +@test "make_pack too many arguments" { + run $srcdir/swupd_make_pack foo bar foo bar + [ "$status" -eq 1 ] +} + +@test "make_pack root priv check" { + run $srcdir/swupd_make_pack foo bar foo + [ "$status" -eq 1 ] + [[ "$output" =~ "not being run as root.. exiting" ]] +} + +# vi: ft=sh ts=8 sw=2 sts=2 et tw=80 diff --git a/test/functional/swupdlib.bash b/test/functional/swupdlib.bash new file mode 100644 index 0000000..e424308 --- /dev/null +++ b/test/functional/swupdlib.bash @@ -0,0 +1,42 @@ +# NOTE: source this file from a *.bats file + +init_web_dir() { + # absolute path is a hard requirement right now + local dir=$(realpath $1) + mkdir -p $dir/{image,www} + echo $dir +} + +init_server_ini() { + cp $srcdir/server.ini $DIR + sed -i "s|/var/lib/update|$DIR|" $DIR/server.ini +} + +init_latest_ver() { + echo "$1" > $DIR/image/latest.version +} + +init_groups_ini() { + for bundle in "$@"; do + cat >> $DIR/groups.ini << EOF +[$bundle] +group=$bundle +EOF + done +} + +set_os_release() { + local ver=$1 + local bundle=$2 + mkdir -p $DIR/image/$ver/$bundle/usr/lib/ + echo "VERSION_ID=$ver" > $DIR/image/$ver/$bundle/usr/lib/os-release +} + +track_bundle() { + local ver=$1 + local bundle=$2 + mkdir -p $DIR/image/$ver/$bundle/usr/share/clear/bundles + touch $DIR/image/$ver/$bundle/usr/share/clear/bundles/$bundle +} + +# vi: ft=sh ts=8 sw=2 sts=2 et tw=80 diff --git a/test/functional/update.bats b/test/functional/update.bats new file mode 100755 index 0000000..2f9244d --- /dev/null +++ b/test/functional/update.bats @@ -0,0 +1,15 @@ +#!/usr/bin/env bats + +@test "create_update required arg" { + run $srcdir/swupd_create_update + [ "$status" -eq 1 ] + [[ "$output" =~ "Missing version parameter:" ]] +} + +@test "create_update root priv check" { + run $srcdir/swupd_create_update -o 10 + [ "$status" -eq 1 ] + [[ "$output" =~ "not being run as root.. exiting" ]] +} + +# vi: ft=sh ts=8 sw=2 sts=2 et tw=80