From c46f31a62b60ba85713493ad87262015a0a74f61 Mon Sep 17 00:00:00 2001 From: Ping Fang Date: Tue, 15 Jun 2021 18:36:12 +0800 Subject: [PATCH] Initial commit to enable RHEL-9 gating for smc-tools Resolves: rhbz#1972137 Signed-off-by: Ping Fang --- gating.yaml | 7 ++ tests/sanity/Makefile | 90 +++++++++++++++++ tests/sanity/_env | 9 ++ tests/sanity/common-tests.sh | 148 +++++++++++++++++++++++++++ tests/sanity/runtest.sh | 149 ++++++++++++++++++++++++++++ tests/sanity/test-smc-tools-help.sh | 43 ++++++++ tests/tests.yml | 12 +++ 7 files changed, 458 insertions(+) create mode 100644 gating.yaml create mode 100644 tests/sanity/Makefile create mode 100644 tests/sanity/_env create mode 100644 tests/sanity/common-tests.sh create mode 100755 tests/sanity/runtest.sh create mode 100644 tests/sanity/test-smc-tools-help.sh create mode 100644 tests/tests.yml 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..831932c --- /dev/null +++ b/tests/sanity/Makefile @@ -0,0 +1,90 @@ +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Makefile of smc-tools/sanity +# Description: smc-tools 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 + +.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: smc-tools tests">> $(METADATA) + @echo "Type: Regression" >> $(METADATA) + @echo "TestTime: 1h" >> $(METADATA) + @echo "RunFor: smc-tools" >> $(METADATA) + @echo "Requires: bash" >> $(METADATA) + @echo "Requires: coreutils" >> $(METADATA) + @echo "Requires: kernel" >> $(METADATA) + @echo "Requires: kmod" >> $(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 "ExclusiveArch: s390x" >> $(METADATA) + @echo "Requires: $(PACKAGE_NAME) rpm wget iputils" >> $(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..bcf39ef --- /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=smc-tools/sanity +export PACKAGE=general +export PACKAGE_NAME=general +export PKG_LIST= +export TEST=/kernel/general/smc-tools/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..a56afbb --- /dev/null +++ b/tests/sanity/runtest.sh @@ -0,0 +1,149 @@ +#!/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=() + +# The following can be overriden to force a particular setting. + +# RPM_BIN_DIR is not defined +# RPM_DATA_DIR is not defined +# KSC_BIN is not defined +# MOD_PATH is not defined +# MANUAL is not defined + +# --- Initialization ---------------------------------------------------------- + +echo +echo " :: smc-tools Gating for RHEL" +echo + +# 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 smc-tools-test-stdout.XXXXX) +TEMPFILES+=("$__stdout_log") + +__stderr_log=$(mktemp -p /tmp smc-tools-test-stderr.XXXXX) +TEMPFILES+=("$__stderr_log") + +# --- Evaluate RPM-specific macros -------------------------------------------- +# This is required not to hardcode 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 + +if test -z "$RPM_LIB_DIR" +then + RPM_LIB_DIR="$(rpm --eval '%{_libdir}')" + echo " * RPM %{_libdir} determined as: $RPM_LIB_DIR" +fi + +# --- Determine scm location -------------------------------------------------- + +if test -z "$PLD_LD" +then + PLD_LD="$RPM_LIB_DIR/libsmc-preload.so" + echo ":: libsmc-preload.so determined as: $PLD_LD" +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-smc-tools-help.sh b/tests/sanity/test-smc-tools-help.sh new file mode 100644 index 0000000..4e9c2d2 --- /dev/null +++ b/tests/sanity/test-smc-tools-help.sh @@ -0,0 +1,43 @@ +#!/usr/bin/env sh +# +# smc-tools gating +# +# verify that LD_PRELOAD works +# + + +TESTS+=(test_smc_tools_ld_preload) + +DESCRIPTION_test_smc_tools_ld_preload=( + "Verify that smc-tools's libsmc-preload.so can be LD_PRELOAD-ed." +) + +function test_smc_tools_ld_preload() +{ + local stdout_log="$1" + local stderr_log="$2" + shift 2 + + echo > $stdout_log + echo > $stderr_log + + echo "# Calling LD_PRELOAD=\"$PLD_LD\" ping -4 google.com -c 1" \ + >> $stdout_log + LD_PRELOAD="$PLD_LD" ping -4 google.com -c 1 >> $stdout_log 2>> $stderr_log + + if test $? -gt 0 + then + echo + echo "ERROR: Failed with non-zero return code." >&2 + + echo "STDOUT {" + cat $stdout_log + echo "}" + + echo "STDERR {" + cat $stderr_log + echo "}" + + return 1 + fi +} diff --git a/tests/tests.yml b/tests/tests.yml new file mode 100644 index 0000000..a4d6570 --- /dev/null +++ b/tests/tests.yml @@ -0,0 +1,12 @@ +- hosts: localhost + tags: + - classic + roles: + - role: standard-test-beakerlib + tests: + - sanity + required_packages: + - bash + - coreutils + - iputils +