diff --git a/gating.yaml b/gating.yaml new file mode 100644 index 0000000..5d120c8 --- /dev/null +++ b/gating.yaml @@ -0,0 +1,7 @@ +--- !Policy +product_versions: + - rhel-9 +decision_context: osci_compose_gate +rules: + - !PassingTestCaseRule {test_case_name: osci.brew-build.tier0.functional} + diff --git a/tests/sanity/Makefile b/tests/sanity/Makefile new file mode 100644 index 0000000..4c6b661 --- /dev/null +++ b/tests/sanity/Makefile @@ -0,0 +1,93 @@ +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Makefile of kabi-dw/sanity +# Description: kabi-dw test +# +# 2019-04-01 +# Author: Čestmír Kalina +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2019 Red Hat, Inc. +# +# This copyrighted material is made available to anyone wishing +# to use, modify, copy, or redistribute it subject to the terms +# and conditions of the GNU General Public License version 2. +# +# 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. +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +TENV=_env +ifeq ($(PKG_TOP_DIR),) + export PKG_TOP_DIR := $(shell p=$$PWD; while :; do \ + [ -e $$p/env.mk -o -z "$$p" ] && { echo $$p; break; }; p=$${p%/*}; done) + export _TOP_DIR := $(shell p=$$PWD; while :; do \ + [ -d $$p/.git -o -z "$$p" ] && { echo $$p; break; }; p=$${p%/*}; done) + -include $(PKG_TOP_DIR)/env.mk +endif +include $(TENV) +ifeq ($(_TOP_DIR),) + _TOP_DIR=/mnt/tests/$(TOPLEVEL_NAMESPACE) +endif + +export TESTVERSION=1.0 + +BUILT_FILES= + +FILES=$(TENV) $(METADATA) Makefile common-tests.sh runtest.sh test-kabi-dw.sh testsuite.tar + +.PHONY: all install download clean + +run: $(FILES) build + ( set +o posix; . /usr/bin/rhts_environment.sh; \ + . /usr/share/beakerlib/beakerlib.sh; \ + . runtest.sh ) + +build: $(BUILT_FILES) + test -x runtest.sh || chmod a+x runtest.sh + +clean: + rm -fr *~ $(BUILT_FILES) + +include /usr/share/rhts/lib/rhts-make.include + +$(METADATA): Makefile + @echo "Owner: Čestmír Kalina " > $(METADATA) + @echo "Name: $(TEST)" >> $(METADATA) + @echo "TestVersion: $(TESTVERSION)" >> $(METADATA) + @echo "Path: $(TEST_DIR)" >> $(METADATA) + @echo "Description: kabi-dw tests">> $(METADATA) + @echo "Type: Regression" >> $(METADATA) + @echo "TestTime: 1h" >> $(METADATA) + @echo "RunFor: kabi-dw" >> $(METADATA) + @echo "Requires: bash" >> $(METADATA) + @echo "Requires: coreutils" >> $(METADATA) + @echo "Requires: make" >> $(METADATA) + @echo "Requires: kernel" >> $(METADATA) + @echo "Requires: kmod" >> $(METADATA) + @echo "Requires: grep" >> $(METADATA) + @echo "Requires: tar" >> $(METADATA) + @echo "Requires: findutils" >> $(METADATA) + @echo "Requires: kernel-devel" >> $(METADATA) + @echo "Requires: kernel-modules" >> $(METADATA) + @echo "Requires: kernel-abi-whitelists" >> $(METADATA) + @echo "Requires: xz" >> $(METADATA) + @echo "Requires: bzip2" >> $(METADATA) + @echo "Requires: gzip" >> $(METADATA) + @echo "Requires: $(PACKAGE_NAME) rpm wget" >> $(METADATA) + @echo "Priority: Normal" >> $(METADATA) + @echo "License: GPLv2" >> $(METADATA) + @echo "Confidential: no" >> $(METADATA) + @echo "Destructive: no" >> $(METADATA) + rhts-lint $(METADATA) + + diff --git a/tests/sanity/_env b/tests/sanity/_env new file mode 100644 index 0000000..ff831d8 --- /dev/null +++ b/tests/sanity/_env @@ -0,0 +1,9 @@ +#This file was generated automatically,do not manually change it. +export TOPLEVEL_NAMESPACE=kernel +export PKG_NAMESPACE=kernel/general +export RELATIVE_PATH=kabi-dw/sanity +export PACKAGE=general +export PACKAGE_NAME=general +export PKG_LIST= +export TEST=/kernel/general/kabi-dw/sanity + diff --git a/tests/sanity/common-tests.sh b/tests/sanity/common-tests.sh new file mode 100644 index 0000000..6d2ec7e --- /dev/null +++ b/tests/sanity/common-tests.sh @@ -0,0 +1,148 @@ +if test -z "$MANUAL" +then + export COLOR_NC= + export COLOR_WHITE= + export COLOR_BLACK= + export COLOR_BLUE= + export COLOR_LIGHT_BLUE= + export COLOR_GREEN= + export COLOR_LIGHT_GREEN= + export COLOR_CYAN= + export COLOR_LIGHT_CYAN= + export COLOR_RED= + export COLOR_LIGHT_RED= + export COLOR_PURPLE= + export COLOR_LIGHT_PURPLE= + export COLOR_BROWN= + export COLOR_YELLOW= + export COLOR_GRAY= + export COLOR_LIGHT_GRAY= +else + export COLOR_NC='\e[0m' + export COLOR_WHITE='\e[1;37m' + export COLOR_BLACK='\e[0;30m' + export COLOR_BLUE='\e[0;34m' + export COLOR_LIGHT_BLUE='\e[1;34m' + export COLOR_GREEN='\e[0;32m' + export COLOR_LIGHT_GREEN='\e[1;32m' + export COLOR_CYAN='\e[0;36m' + export COLOR_LIGHT_CYAN='\e[1;36m' + export COLOR_RED='\e[0;31m' + export COLOR_LIGHT_RED='\e[1;31m' + export COLOR_PURPLE='\e[0;35m' + export COLOR_LIGHT_PURPLE='\e[1;35m' + export COLOR_BROWN='\e[0;33m' + export COLOR_YELLOW='\e[1;33m' + export COLOR_GRAY='\e[0;30m' + export COLOR_LIGHT_GRAY='\e[0;37m' +fi + +function pass() +{ + if ! test -z "$MANUAL" + then + echo -en " $COLOR_GRAY$(printf "%0.s-" {1..35})" + echo -en "[ ${COLOR_GREEN}PASS ]" + echo -e "$COLOR_GRAY$(printf "%0.s-" {1..36})$COLOR_NC" + else + rlPass + fi +} + +function fail() +{ + if ! test -z "$MANUAL" + then + echo -en " $COLOR_GRAY$(printf "%0.s-" {1..35})" + echo -en "[ ${COLOR_RED}FAIL ]" + echo -e "$COLOR_GRAY$(printf "%0.s-" {1..36})$COLOR_NC" + else + rlFail + fi +} + +function print_test_case() +{ + if test -z "$MANUAL" + then + return 0 + fi + echo + local msg=" $COLOR_GRAY[${COLOR_BLUE}TEST $1$COLOR_GRAY]" + eval msg="\$msg\$(printf "%0.s-" {1..$[80-${#msg}+${#COLOR_BLUE}+2*${#COLOR_GRAY}]})" + echo -e "$msg$COLOR_NC" +} + +function print_description() +{ + desc=() + eval desc=\(\"\${DESCRIPTION_$1[@]}\"\) + for desc_line in "${desc[@]}" + do + echo " $desc_line" + done + echo +} + +# +# Perform a test +# +# $1 test function +# +function run_test() +{ + rlPhaseStartTest "$1" + + if test $# -eq 0 -o -z $1 + then + rlFail "ERROR: Expected test name to be passed to run_test" \ + "function." >&2 + exit 1 + fi + + local stdout_log="$2" + local stderr_log="$3" + + if test -z $stdout_log -o ! -e $stdout_log + then + rlFail "ERROR: Test inconsistency, STDOUT log file missing or" \ + "non-existent." >&2 + exit 1 + fi + + if test -z $stderr_log -o ! -e $stderr_log + then + rlFail "ERROR: Test inconsistency, STDERR log file missing or" \ + "non-existent." >&2 + exit 1 + fi + + echo > $stdout_log + echo > $stderr_log + + print_test_case "$1" + + $1 "$stdout_log" "$stderr_log" + ret=$? + + print_description "$1" + + if test $ret -eq 0 + then + pass + else + fail + + echo "STDOUT {" + cat $stdout_log + echo "}" + + echo "STDERR {" + cat $stderr_log + echo "}" + + return 1 + fi + + rlPhaseEnd +} diff --git a/tests/sanity/runtest.sh b/tests/sanity/runtest.sh new file mode 100755 index 0000000..4f7565e --- /dev/null +++ b/tests/sanity/runtest.sh @@ -0,0 +1,131 @@ +#!/usr/bin/env bash + +function cleanup() +{ + rlPhaseStartCleanup + rm -rf "${TEMPFILES[@]}" + rlPhaseEnd +} +trap cleanup 0 1 9 15 + +# --- Globals ----------------------------------------------------------------- + +SCRIPT_ROOT="$(dirname "$(realpath "${BASH_SOURCE[0]}")")" + +# A list of temporary files; used by cleanup to delete on signals 0 1 9 15. +TEMPFILES=() + +# A list of dependencies to include. +INCLUDES=() + +# A list of files containing test definitions. +# These are auto-discovered using test-*.sh pattern. +TESTS_FILES=() + +# A list of tests to run. +# These are automatically added by test files. +TESTS=() + +# --- Initialization ---------------------------------------------------------- + +# Requires: restraint-rhts +. /usr/bin/rhts-environment.sh || exit 1 +# Requires: beakerlib +. /usr/share/beakerlib/beakerlib.sh || exit 1 + +INCLUDES+=("$SCRIPT_ROOT/common-tests.sh") + +TESTS_FILES+=("$SCRIPT_ROOT/test-"*".sh") + +# --- bkr journal ------------------------------------------------------------- + +rlJournalStart + +rlPhaseStartSetup + +# --- Load dependencies ------------------------------------------------------- + +for path in ${INCLUDES[@]} ${TESTS_FILES[@]} +do + if ! test -r $path + then + rlFail "Path \`$path' does not exist or is not readable" + exit 1 + fi + source $path && { + rlPass "File \`$(basename "$path")' loaded." + } || { + rlFail "Unable to load \`$path'." + exit 1 + } +done + +# --- Temporary files --------------------------------------------------------- + +echo ":: Initialization: Temporary files." + +__stdout_log=$(mktemp -p /tmp kabidw-test-stdout.XXXXX) +TEMPFILES+=("$__stdout_log") + +__stderr_log=$(mktemp -p /tmp kabidw-test-stderr.XXXXX) +TEMPFILES+=("$__stderr_log") + +# --- Evaluate RPM-specific macros -------------------------------------------- +# This is required not to hardcode kabidw install location should %{_bindir} and +# %{_datadir} be changed. + +echo ":: Initialization: Evaluating RPM macros." + +if test -z "$RPM_BIN_DIR" +then + RPM_BIN_DIR="$(rpm --eval '%{_bindir}')" + echo " * RPM %{_bindir} determined as: $RPM_BIN_DIR" +fi + +if test -z "$RPM_DATA_DIR" +then + RPM_DATA_DIR="$(rpm --eval '%{_datadir}')" + echo " * RPM %{_datadir} determined as: $RPM_DATA_DIR" +fi + +# --- Determine kabidw location -------------------------------------------------- + +if test -z "$KABI_DW_BIN" +then + KABI_DW_BIN="$RPM_BIN_DIR/kabi-dw" + echo ":: kabidw path determined as: $KABI_DW_BIN" +fi + +rlPass "Initialization passed." + +rlPhaseEnd + +# --- Run tests --------------------------------------------------------------- + +overall_status=0 +for test in ${TESTS[@]} +do + run_test $test "$__stdout_log" "$__stderr_log" + if test $? -gt 0 + then + overall_status=1 + fi +done + +rlPhaseStartTest + +if test $overall_status -gt 0 +then + rlFail "Some tests failed." + exit 1 +else + rlPass "All tests passed." +fi +echo + +rlPhaseEnd + +rlJournalPrintText + +rlJournalEnd + diff --git a/tests/sanity/test-kabi-dw.sh b/tests/sanity/test-kabi-dw.sh new file mode 100644 index 0000000..d78c370 --- /dev/null +++ b/tests/sanity/test-kabi-dw.sh @@ -0,0 +1,49 @@ +#!/usr/bin/env sh + +TESTS+=(test_kabidw) + +DESCRIPTION_test_kabidw=( + "Invoke kabi-dw test suite." +) + +function test_kabidw() +{ + local stdout_log="$1" + local stderr_log="$2" + shift 2 + + OLDCWD="$(pwd)" + + tar xf testsuite.tar + cd testsuite + + make clean all KABI_DW="$KABI_DW_BIN" 2> $stderr_log | tee $stdout_log + + # Strip away paths + sed -i 's/^File:.*$//' $(find . -path "*/output/*" -type f -iname "*.txt") + + comm -12 \ + <(find . -type d -iname "output" -exec dirname {} \; | sort | uniq) \ + <(find . -type d -iname "reference" -exec dirname {} \; | sort | uniq) \ + | xargs -I% bash -c '[[ $(grep -rh "^Version:" %/{output,reference}/ | sort | uniq | wc -l) != 1 ]] && { echo "[VERSION MISMATCH] Test Case: $(basename %)"; exit; } ; diff -qr %/{output,reference}/ || false' + + if test $? -gt 0 + then + echo + echo "$? ERROR: failed with non-zero code." + + echo "STDOUT {" + cat $stdout_log + echo "}" + + echo "STDERR {" + cat $stderr_log + echo "}" + + return 1 + fi + + cd "$CWD" + + return 0 +} diff --git a/tests/sanity/testsuite.tar b/tests/sanity/testsuite.tar new file mode 100644 index 0000000..010693b Binary files /dev/null and b/tests/sanity/testsuite.tar differ diff --git a/tests/tests.yml b/tests/tests.yml new file mode 100644 index 0000000..ba7cb19 --- /dev/null +++ b/tests/tests.yml @@ -0,0 +1,18 @@ +- hosts: localhost + tags: + - classic + roles: + - role: standard-test-beakerlib + tests: + - sanity + required_packages: + - bash + - coreutils + - kernel + - kernel-devel + - kernel-modules + - kernel-abi-whitelists + - xz + - bzip2 + - gzip +