[OS-BUILD PATCH 3/3] redhat/self-test: Provide better failure output

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Prarit Bhargava <prarit@xxxxxxxxxx>

redhat/self-test: Provide better failure output

Currently when the tests fail there isn't a lot of information on which
test failed.  This has resulted in confusion by developers.

Add a general bash function, check_status, that outputs some basic
information on which test failed and how to run the test to reproduce the
error.

Signed-off-by: Prarit Bhargava <prarit@xxxxxxxxxx>

diff --git a/redhat/self-test/0001-shellcheck.bats b/redhat/self-test/0001-shellcheck.bats
index blahblah..blahblah 100644
--- a/redhat/self-test/0001-shellcheck.bats
+++ b/redhat/self-test/0001-shellcheck.bats
@@ -1,9 +1,12 @@
 #!/usr/bin/env bats
 # Purpose: This test runs shellcheck on all .sh files in the redhat directory.
 
+load test-lib.bash
+
 @test "shellcheck" {
 	if ! test -x /usr/bin/shellcheck; then
 		skip "The ShellCheck package is not installed"
 	fi
-	shellcheck $(find $BATS_TEST_DIRNAME/.. -name "*.sh" -not -path "$BATS_TEST_DIRNAME/../rpm/*")
+	run shellcheck $(find $BATS_TEST_DIRNAME/.. -name "*.sh" -not -path "$BATS_TEST_DIRNAME/../rpm/*")
+	check_status
 }
diff --git a/redhat/self-test/1001-rpmlint.bats b/redhat/self-test/1001-rpmlint.bats
index blahblah..blahblah 100644
--- a/redhat/self-test/1001-rpmlint.bats
+++ b/redhat/self-test/1001-rpmlint.bats
@@ -1,6 +1,8 @@
 #!/usr/bin/env bats
 # Purpose: This test runs rpmlint on the source rpm.
 
+load test-lib.bash
+
 @test "rpmlint" {
 	if ! test -x /usr/bin/rpmlint; then
 		skip "The rpmlint package is not installed"
@@ -15,6 +17,5 @@
 
 	srpm=$(find "$BATS_TEST_DIRNAME"/.. -name "*.rpm")
 	run rpmlint $srpm
-	status=$?
-	[ "$status" = 0 ]
+	check_result
 }
diff --git a/redhat/self-test/1002-basic-structural-test.bats b/redhat/self-test/1002-basic-structural-test.bats
index blahblah..blahblah 100644
--- a/redhat/self-test/1002-basic-structural-test.bats
+++ b/redhat/self-test/1002-basic-structural-test.bats
@@ -1,6 +1,12 @@
 #!/usr/bin/env bats
 # Purpose: This test runs tests on the SRPM.
 
+load test-lib.bash
+
+_SRPM_unpacks_OK() {
+	rpm2cpio "$srpm" | cpio -idm
+}
+
 @test "SRPM unpacks OK" {
 	numsrpms=$(find "$BATS_TEST_DIRNAME"/.. -name "*.rpm" | wc -l)
 	if [ "$numsrpms" != "1" ]; then
@@ -14,9 +20,8 @@
 	fi
 	mkdir SRPMS
 	cd SRPMS
-	rpm2cpio "$srpm" | cpio -idm
-	status=$?
-	[ "$status" = 0 ]
+	run _SRPM_unpacks_OK
+	check_status
 	popd >& /dev/null
 }
 
@@ -30,7 +35,7 @@ numsrpms=$(find "$BATS_TEST_DIRNAME"/.. -name "*.rpm" | wc -l)
 	ls | wc
 	linuxname=$(ls linux*.tar.xz)
 	run tar --extract --xz -f "$linuxname"
-	[ "$status" = 0 ]
+	check_status
 	popd >& /dev/null
 }
 
@@ -44,7 +49,7 @@ numsrpms=$(find "$BATS_TEST_DIRNAME"/.. -name "*.rpm" | wc -l)
 	linuxtree=$(ls linux*.tar.xz)
 	linuxtree=${linuxtree/.tar.xz}
 	cd $linuxtree
-	test -d arch	&& \
+	run test -d arch	&& \
 	test -d block	&& \
 	test -d certs	&& \
 	test -d crypto	&& \
@@ -66,7 +71,6 @@ numsrpms=$(find "$BATS_TEST_DIRNAME"/.. -name "*.rpm" | wc -l)
 	test -d tools	&& \
 	test -d usr		&& \
 	test -d virt
-	status=$?
+	check_status
 	popd >& /dev/null
-	[ "$status" = 0 ]
 }
diff --git a/redhat/self-test/1003-rpminspect.bats b/redhat/self-test/1003-rpminspect.bats
index blahblah..blahblah 100644
--- a/redhat/self-test/1003-rpminspect.bats
+++ b/redhat/self-test/1003-rpminspect.bats
@@ -1,6 +1,8 @@
 #!/usr/bin/env bats
 # Purpose: This test runs rpminspect on the SRPM.
 
+load test-lib.bash
+
 @test "rpminspect" {
 	if ! test -x /usr/bin/rpminspect; then
 		skip "The rpminspect package is not installed"
@@ -15,5 +17,5 @@
 
 	srpm=$(find "$BATS_TEST_DIRNAME"/.. -name "*.rpm")
 	run rpminspect $srpm
-	[ "$status" = 0 ]
+	check_status
 }
diff --git a/redhat/self-test/1005-dist-dump-variables.bats b/redhat/self-test/1005-dist-dump-variables.bats
index blahblah..blahblah 100644
--- a/redhat/self-test/1005-dist-dump-variables.bats
+++ b/redhat/self-test/1005-dist-dump-variables.bats
@@ -3,6 +3,8 @@
 # variables that are used in the specfile.  This data is diff'd against a
 # "known good" set of data and if there is a difference an error is reported.
 
+load test-lib.bash
+
 @test "self-test-data check" {
 	mkdir -p $BATS_TMPDIR/data
 	RHDISTDATADIR=$BATS_TMPDIR/data make dist-self-test-data
@@ -10,6 +12,7 @@
 	redhat=$(make dist-dump-variables | grep "REDHAT=" | cut -d"=" -f2 | xargs)
 
 	echo "Diffing directories ${redhat}/self-test/data and $BATS_TMPDIR/data"
-	diff -urNp -x create-data.sh ${redhat}/self-test/data $BATS_TMPDIR/data
+	run diff -urNp -x create-data.sh ${redhat}/self-test/data $BATS_TMPDIR/data
 	[ -d $BATS_TMPDIR ] && rm -rf $BATS_TMPDIR/data
+	check_status
 }
diff --git a/redhat/self-test/1006-verify-SPEC-variables.bats b/redhat/self-test/1006-verify-SPEC-variables.bats
index blahblah..blahblah 100644
--- a/redhat/self-test/1006-verify-SPEC-variables.bats
+++ b/redhat/self-test/1006-verify-SPEC-variables.bats
@@ -2,8 +2,9 @@
 # Purpose: This test looks at the spec file variable replacement code in
 # redhat/genspec.sh and confirms that each variable begins with "SPEC".
 
-@test "verify SPEC variables" {
+load test-lib.bash
 
+_verify_SPEC_variables() {
 # This looks at the code and replaces each / with a new-line character, removes
 # any whitespace and entry entries beginning with valid "%%SPEC" or $"SPEC".
 # "$SOURCES" lines are also okay as it is used to point to the changelog and
@@ -23,3 +24,8 @@ do
 	esac
 done
 }
+
+@test "verify SPEC variables" {
+	run _verify_SPEC_variables
+	check_status
+}
diff --git a/redhat/self-test/2001-dist-release.bats b/redhat/self-test/2001-dist-release.bats
index blahblah..blahblah 100644
--- a/redhat/self-test/2001-dist-release.bats
+++ b/redhat/self-test/2001-dist-release.bats
@@ -2,7 +2,9 @@
 # Purpose: These are general dist-release tests.  They are run from a git
 # worktree created by the first test.
 
-@test "dist-release prologue" {
+load test-lib.bash
+
+@test "dist-release setup worktree" {
 	git worktree add $BATS_TMPDIR/distrelease
 	cd $BATS_TMPDIR/distrelease
 	# All the tests start off with 'make dist-release', so we can pull
@@ -21,7 +23,12 @@
 	logb=($(git log --oneline -n 2 | tail -1))
 	# If SHA1 in loga is the same as the SHA1 in logb, then no
 	# 2nd commit has been created and the test has succeeded:
-	[ ${loga[0]} = ${logb[0]} ]
+	run [ ${loga[0]} = ${logb[0]} ]
+	check_status
+}
+
+_dist-release_test_2() {
+    echo $pkgrelease | grep -q -w "$build"
 }
 
 @test "dist-release test 2" {
@@ -39,11 +46,17 @@
 	((build--))
 	echo "pkgrelease=$pkgrelease"
 	echo "build=$build"
-	echo $pkgrelease | grep -q -w "$build"
-	status=$?
-	[ "$status" = 0 ]
+	run _dist-release_test_2
+	check_status
 }
 
+_dist-release_test_3() {
+	[ "$changelog" = "$gitlog" ]
+}
+
+# Note, when running this test on the command line you may have to specifiy the
+# RHEL_MAJOR and RHEL_MINOR variables, for example,
+#	RHEL_MAJOR=9 RHEL_MINOR=99 bats redhat/self-test/2001-dist-release.bats
 @test "dist-release test 3" {
 	# Test whether the version in the commit message matches
 	# the version in the change log.
@@ -56,11 +69,12 @@
 	gitlog=${commit##*\[redhat\] }
 	# This time, strip off "kernel-" also:
 	gitlog=${gitlog/kernel-/}
-	echo "The kernel version in the changelog ($changelog) differs from the version in the git log ($gitlog)"
-	[ "$changelog" = "$gitlog" ]
+	echo "The kernel version in the changelog-${RHEL_MAJOR}.${RHEL_MINOR} ("${changelog}") differs from the version in the git log ($gitlog)"
+	run _dist-release_test_3
+	check_status
 }
 
-@test "dist-release epilogue" {
+@test "dist-release cleanup worktree" {
 	git worktree remove --force $BATS_TMPDIR/distrelease
 	git branch -D distrelease
 }
diff --git a/redhat/self-test/3001-Makefile-contents.bats b/redhat/self-test/3001-Makefile-contents.bats
index blahblah..blahblah 100755
--- a/redhat/self-test/3001-Makefile-contents.bats
+++ b/redhat/self-test/3001-Makefile-contents.bats
@@ -2,18 +2,28 @@
 # Purpose: This is a test that verifies that Makefile.variable variable
 # declarations are all declared with "?="
 
-@test "Makefile variable declarations" {
-	# By design, only the Makefile.variables file should have ?= declarations
+load test-lib.bash
+
+_Makefile_variable_declarations_1() {
+	git grep "?=" $BATS_TEST_DIRNAME/../Makefile.variables | wc -l
+}
 
-	value=$(git grep "?=" Makefile.variables | wc -l)
-	if [ $value -eq 0 ]; then
+_Makefile_variable_declarations_2() {
+	git grep "?=" $BATS_TEST_DIRNAME/../Makefile | grep -v "\"?=" | wc -l
+}
+
+@test "Makefile variable declarations" {
+	run _Makefile_variable_declarations_1
+	if [ "$output" -eq 0 ]; then
 		echo "Test failed: No ?= variables found in Makefile.variables"
-		exit 1
+		status=1
 	fi
+	check_status
 
-	value=$(git grep "?=" Makefile | grep -v "\"?=" | wc -l)
-	if [ $value -gt 0 ]; then
+	run _Makefile_variable_declarations_2
+	if [ "$output" -ne 0 ]; then
 		echo "Test failed: Makefile should not ?= declarations."
-		exit 1
+		status=1
 	fi
+	check_status
 }
diff --git a/redhat/self-test/test-lib.bash b/redhat/self-test/test-lib.bash
new file mode 100644
index blahblah..blahblah 100644
--- /dev/null
+++ b/redhat/self-test/test-lib.bash
@@ -0,0 +1,16 @@
+#!/usr/bin/bash
+
+# This function makes use of bats built-in run function and its status and output variables.
+check_status() {
+	if [ "$status" -eq 0 ]; then
+		return 0
+	fi
+
+	# report the error
+	echo "$output"
+	echo "------------------"
+	expath=$(echo "$BATS_TEST_FILENAME" | rev | cut -d'/' -f-3 | rev)
+	echo -n "This redhat/self-test test has failed.  You can run all tests by executing 'make dist-self-test', or just this test by executing 'bats $expath'."
+	exit 1
+}
+

--
https://gitlab.com/cki-project/kernel-ark/-/merge_requests/1881
_______________________________________________
kernel mailing list -- kernel@xxxxxxxxxxxxxxxxxxxxxxx
To unsubscribe send an email to kernel-leave@xxxxxxxxxxxxxxxxxxxxxxx
Fedora Code of Conduct: https://docs.fedoraproject.org/en-US/project/code-of-conduct/
List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines
List Archives: https://lists.fedoraproject.org/archives/list/kernel@xxxxxxxxxxxxxxxxxxxxxxx
Do not reply to spam on the list, report it: https://pagure.io/fedora-infrastructure




[Index of Archives]     [Fedora General Discussion]     [Older Fedora Users Archive]     [Fedora Advisory Board]     [Fedora Security]     [Fedora Devel Java]     [Fedora Legacy]     [Fedora Desktop]     [ATA RAID]     [Fedora Marketing]     [Fedora Mentors]     [Fedora Package Announce]     [Fedora Package Review]     [Fedora Music]     [Fedora Packaging]     [Centos]     [Fedora SELinux]     [Coolkey]     [Yum Users]     [Tux]     [Yosemite News]     [KDE Users]     [Fedora Art]     [Fedora Docs]     [USB]     [Asterisk PBX]

  Powered by Linux