#!/bin/bash - # libguestfs # Copyright (C) 2014-2025 Red Hat Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # Most of the tests written in shell script source this file for # useful functions. # # To include this file, the test should do: # # source ./functions.sh # set -e # set -x # Clean up the environment in every test script. unset CDPATH export LANG=C # Various variables defined by autoconf that test scripts might want # to use. top_srcdir="@top_srcdir@" top_builddir="@top_builddir@" abs_top_srcdir="@abs_top_srcdir@" abs_top_builddir="@abs_top_builddir@" abs_builddir="$PWD" abs_srcdir="$(cd "@srcdir@" && pwd)" # Configure check results. source $abs_top_builddir/config.sh # Skip if $SKIP_ environment variable is set. # Every test should call this function first. skip_if_skipped () { local v if [ -n "$1" ]; then v="SKIP_$(basename $1 | tr a-z.- A-Z__)" else v="SKIP_$(basename $0 | tr a-z.- A-Z__)" fi if [ -n "${!v}" ]; then echo "$(basename $0): test skipped because \$$v is set" exit 77 fi echo "$(basename $0): info: you can skip this test by setting $v=1" } # Skip if the current libguestfs backend is $1. # eg. skip_if_backend libvirt skip_if_backend () { local b="$(guestfish get-backend)" case "$1" in # Some magic happens for $1 == libvirt. libvirt) if [ "$b" = "libvirt" ] || [[ "$b" =~ ^libvirt: ]]; then echo "$(basename $0): test skipped because the current backend is $b" exit 77 fi ;; *) if [ "$b" = "$1" ]; then echo "$(basename $0): test skipped because the current backend is $b" exit 77 fi ;; esac } # Skip if the current libguestfs backend is NOT $1. skip_unless_backend () { local b="$(guestfish get-backend)" case "$1" in # Some magic happens for $1 == libvirt. libvirt) if [ "$b" != "libvirt" ] && [[ ! "$b" =~ ^libvirt: ]]; then echo "$(basename $0): this test only runs if the backend is libvirt, but the current backend is $b" exit 77 fi ;; *) if [ "$b" != "$1" ]; then echo "$(basename $0): this test only runs if the backend is $1, but the current backend is $b" exit 77 fi ;; esac } # Skip if the named ($1) disk image in test-data/phony-guests was not # created. skip_unless_phony_guest () { local f="$abs_top_builddir/test-data/phony-guests/$1" if ! test -f $f || ! test -s $f; then echo "$(basename $0): test skipped because disk image '$1' was not created" echo "$(basename $0): try running: make -C test-data check" exit 77 fi } # Skip if test.iso was not created. skip_unless_test_iso () { local f="$abs_top_builddir/test-data/test.iso" if ! test -f $f || ! test -s $f; then echo "$(basename $0): test skipped because test-data/test.iso was not created" echo "$(basename $0): try running: make -C test-data check" exit 77 fi } # Skip if the current arch = $1. skip_if_arch () { local m="$(uname -m)" case "$1" in # Some magic happens for some architectures. arm) if [[ "$m" =~ ^arm ]]; then echo "$(basename $0): test skipped because the current architecture ($m) is arm (32 bit)" exit 77 fi ;; i?86) if [[ "$m" =~ ^i?86 ]]; then echo "$(basename $0): test skipped because the current architecture ($m) is $1" exit 77 fi ;; *) if [ "$m" = "$1" ]; then echo "$(basename $0): test skipped because the current architecture ($m) is $1" exit 77 fi ;; esac } # Skip if the current arch != $1. skip_unless_arch () { local m="$(uname -m)" case "$1" in # Some magic happens for some architectures. arm) if [[ ! "$m" =~ ^arm ]]; then echo "$(basename $0): test skipped because the current architecture ($m) is not arm (32 bit)" exit 77 fi ;; i?86) if [[ ! "$m" =~ ^i?86 ]]; then echo "$(basename $0): test skipped because the current architecture ($m) is not $1" exit 77 fi ;; *) if [ "$m" != "$1" ]; then echo "$(basename $0): test skipped because the current architecture ($m) is not $1" exit 77 fi ;; esac } # Skip if $1 is not known to virt-builder. skip_unless_virt_builder_guest () { if ! virt-builder -l "$1" >/dev/null 2>&1; then echo "$(basename $0): test skipped because $1 is not known to virt-builder" exit 77 fi } # Skip if FUSE is not available in the host kernel. skip_unless_fuse () { if ! test -w /dev/fuse; then echo "$(basename $0): test skipped because the host kernel does not support FUSE" echo "$(basename $0): /dev/fuse is missing or not writable by the current user" exit 77 fi } # Skip if a feature is not available in the daemon. skip_unless_feature_available () { if ! guestfish -a /dev/null run : available "$1"; then echo "$(basename $0): test skipped because feature $1 is not available" exit 77 fi } # Skip if a filesystem is unavailable in the daemon. skip_unless_filesystem_available () { r="$(guestfish -a /dev/null run : filesystem_available "$1")" if [ "$r" != "true" ] ; then echo "$(basename $0): test skipped because $1 filesystem is not available" exit 77 fi } # Skip unless the libvirt minimum version is met. skip_unless_libvirt_minimum_version () { if ! test -x $abs_top_builddir/lib/libvirt-is-version; then echo "$(basename $0): test skipped because lib/libvirt-is-version is not built yet" exit 77 fi if ! $abs_top_builddir/lib/libvirt-is-version "$@"; then echo "$(basename $0): test skipped because libvirt is too old, <" "$@" exit 77 fi } # Skip unless the environment variable named is set to a non-empty value. skip_unless_environment_variable_set () { if [ -z "${!1}" ]; then echo "$(basename $0): test skipped because \$$1 is not set" exit 77 fi } # Run an external command and skip if the command fails. This can be # used to test if a command exists. Normally you should use # `cmd --help' or `cmd --version' or similar. skip_unless () { if ! "$@"; then echo "$(basename $0): test skipped because $1 is not available" exit 77 fi } # Use this if a test is broken. "$1" should contain the reason. skip_because () { echo "$(basename $0): test skipped because: $1" exit 77 } # Skip if the user is trying to run a test as root. # Tests shouldn't be run as root, but a few are especially dangerous. skip_if_root () { if [ "$(id -u)" -eq 0 ]; then echo "$(basename $0): test skipped because you're running tests as root." echo "$(basename $0): it is NEVER a good idea to run libguestfs tests as root." exit 77 fi } # Slow tests should always call this function. (See guestfs-hacking(1)). slow_test () { if [ -z "$SLOW" ]; then echo "$(basename $0): use 'make check-slow' to run this test" exit 77 fi } # Root tests should always call this function. (See guestfs-hacking(1)). root_test () { if test "$(id -u)" -ne 0; then echo "$(basename $0): use 'sudo make check-root' to run this test" exit 77 fi } do_md5 () { case "$(uname)" in Linux) md5sum "$1" | awk '{print $1}' ;; *) echo "$(basename $0): unknown method to calculate MD5 of file on $(uname)" exit 1 ;; esac } do_sha1 () { case "$(uname)" in Linux) sha1sum "$1" | awk '{print $1}' ;; *) echo "$(basename $0): unknown method to calculate SHA1 of file on $(uname)" exit 1 ;; esac } do_sha256 () { case "$(uname)" in Linux) sha256sum "$1" | awk '{print $1}' ;; *) echo "$(basename $0): unknown method to calculate SHA256 of file on $(uname)" exit 1 ;; esac }