#! /bin/sh # Library for dtf tests. # dtf_skip [REASON] # ----------------- dtf_skip () { test -n "$1" && echo >&2 "SKIP: $1" exit 77 } dtf_fail () { test -n "$1" && echo >&2 "$1" test -z "$dtf_fail_hooks" && exit 1 echo >& "running dtf_fail hooks $dtf_fail_hooks" for _i_hook in $dtf_fail_hooks do $_i_hook done exit 1 } dtf_debug () { for _d_i in $1 do case " $DTF_DBG_KEYWORDS " in *\ $_d_i\ *) shift echo >&4 " ~ $*" return 0 ;; esac done } __dtf_debug () { dtf_debug dtf_lib "$*" } __dtf_method_not_implemented () { dtf_fail "'$1' method is not implemented" } # dtf_pkg_installed PKGNAME # ------------------------- dtf_pkg_installed () { __dtf_debug "checking whether '$1' is installed" # {% if config.os.id in ["fedora", "rhel", "centos"] %} rpm -q "$1" &>/dev/null # {% else %} __dtf_method_not_implemented "dtf_pkg_installed" # {% endif %} } __dtf_assert_nargs () { _d_nargs=$1 ; shift _d_method=$1 ; shift test $# -ge "$_d_nargs" && return _d_tr="$# given ($*)" if test "$_d_nargs" -eq 1; then dtf_fail "method '$_d_method' requires at least 1 argument, $_d_tr" else dtf_fail "method '$_d_method' requires at least $_d_nargs arguments, $_d_tr" fi } dtf_is_root () { _d_uid=`id -u` test x"$_d_uid" = x0 } dtf_assert () { __dtf_assert_nargs 1 'dtf_pkg_install' ${1+"$@"} case $1 in root|ROOT) dtf_is_root || dtf_fail "root accout required" ;; cmd) shift __dtf_assert_cmd "$@" ;; *) dtf_fail "dtf_assert '$1' not implemented" ;; esac } dtf_pkg () { __dtf_assert_nargs 2 'dtf_pkg' ${1+"$@"} _d_action=$1 ; shift _d_pkg=$1 ; shift dtf_assert root case $_d_action in remove) # {{ "\n " + commands.pkginstaller.remove(['"$_d_pkg"'], {'docs': True}) }} ;; install) # {{ "\n " + commands.pkginstaller.install(['"$_d_pkg"'], {'docs': True}) }} ;; *) dtf_fail "dtf_pkg: unimplemented action '$_d_action'" ;; esac } dtf_pkg_install () { __dtf_assert_nargs 1 'dtf_pkg_install' ${1+"$@"} dtf_pkg install "$1" test $? -eq 0 || dtf_fail "can't install '$1' package" } dtf_pkg_remove () { __dtf_assert_nargs 1 'dtf_pkg_remove' ${1+"$@"} dtf_pkg remove "$1" test $? -eq 0 || dtf_fail "can't remove '$1' package" } __dtf_prereq_pkg () { __dtf_assert_nargs 2 'dtf_prereq pkg' ${1+"$@"} _d_subaction=$1 ; shift _d_pkg=$1 ; shift __dtf_debug "making sure $_d_pkg is $_d_subaction" case $_d_subaction in installed) dtf_pkg_installed "$_d_pkg" && return 0 dtf_pkg_install "$_d_pkg" ;; missing) dtf_pkg_installed "$_d_pkg" || return 0 dtf_pkg_remove "$_d_pkg" ;; *) dtf_fail "dtf_prereq pkg: not implemented action $_d_subaction" ;; esac } __dtf_cmd () { __dtf_debug "running $1" _d_cmd=$1 ; shift eval "$_d_cmd" __dtf_cmd_result_status=$? } __dtf_assert_cmd () { _d_a_cmd=$1 ; shift _d_ok_statuses=$1 ; shift __dtf_cmd "$_d_a_cmd" case " $_d_ok_statuses " in *"$__dtf_cmd_result_status "*) ;; *) _d_f_msg="cmd '$_d_a_cmd' ended with '$__dtf_cmd_result_status' while " _d_f_msg="$_d_f_msg it should end with one of { $_d_ok_statuses }" dtf_fail "$_d_f_msg" ;; esac } # dtf_prereq REQUIREMENT [ARGS..] # ------------------------------- # Make sure the requirement is met or fail. dtf_prereq () { __dtf_assert_nargs 1 dtf_prereq ${1+"$@"} _d_requirement=$1 ; shift case $_d_requirement in pkg) __dtf_prereq_pkg "$@" ;; *) dtf_fail "dtf_prereq: action '$_d_requirement' not implemented" ;; esac }