git: 7affbeeab1c9 - main - virstor: basic functional test

From: Ryan Libby <rlibby_at_FreeBSD.org>
Date: Mon, 10 Jun 2024 17:34:41 UTC
The branch main has been updated by rlibby:

URL: https://cgit.FreeBSD.org/src/commit/?id=7affbeeab1c99685012df0d72df2d7a87e09e472

commit 7affbeeab1c99685012df0d72df2d7a87e09e472
Author:     Ryan Libby <rlibby@FreeBSD.org>
AuthorDate: 2024-06-10 17:32:22 +0000
Commit:     Ryan Libby <rlibby@FreeBSD.org>
CommitDate: 2024-06-10 17:32:22 +0000

    virstor: basic functional test
    
    Reviewed by:    asomers, markj
    Sponsored by:   Dell EMC Isilon
    Differential Revision:  https://reviews.freebsd.org/D45535
---
 tests/sys/geom/class/Makefile                |  1 +
 tests/sys/geom/class/virstor/Makefile        |  9 ++++
 tests/sys/geom/class/virstor/conf.sh         | 31 ++++++++++++
 tests/sys/geom/class/virstor/virstor_test.sh | 73 ++++++++++++++++++++++++++++
 4 files changed, 114 insertions(+)

diff --git a/tests/sys/geom/class/Makefile b/tests/sys/geom/class/Makefile
index 10b01a043ddf..b640b0b46859 100644
--- a/tests/sys/geom/class/Makefile
+++ b/tests/sys/geom/class/Makefile
@@ -19,6 +19,7 @@ TESTS_SUBDIRS+=	shsec
 TESTS_SUBDIRS+=	stripe
 TESTS_SUBDIRS+=	union
 TESTS_SUBDIRS+=	uzip
+TESTS_SUBDIRS+=	virstor
 
 ${PACKAGE}FILES+=	geom_subr.sh
 
diff --git a/tests/sys/geom/class/virstor/Makefile b/tests/sys/geom/class/virstor/Makefile
new file mode 100644
index 000000000000..67242879e33f
--- /dev/null
+++ b/tests/sys/geom/class/virstor/Makefile
@@ -0,0 +1,9 @@
+PACKAGE=	tests
+
+TESTSDIR=	${TESTSBASE}/sys/geom/class/${.CURDIR:T}
+
+ATF_TESTS_SH+=	virstor_test
+
+${PACKAGE}FILES+=	conf.sh
+
+.include <bsd.test.mk>
diff --git a/tests/sys/geom/class/virstor/conf.sh b/tests/sys/geom/class/virstor/conf.sh
new file mode 100644
index 000000000000..46b0fd1308a3
--- /dev/null
+++ b/tests/sys/geom/class/virstor/conf.sh
@@ -0,0 +1,31 @@
+#!/bin/sh
+
+class="virstor"
+base=$(atf_get ident)
+TEST_VIRSTOR_DEVS_FILE="${TMPDIR}/test_virstor_devs.$(basename $0)"
+
+gvirstor_dev_setup()
+{
+	# Pick a random name and record it for cleanup.
+	local vdevbase="$(mktemp -u virstor.XXXXXX)" || aft_fail "mktemp"
+	echo "$vdevbase" >> "$TEST_VIRSTOR_DEVS_FILE"
+	eval "${1}='${vdevbase}'"
+}
+
+gvirstor_test_cleanup()
+{
+	local vdevbase
+	if [ -f "$TEST_VIRSTOR_DEVS_FILE" ]; then
+		while read vdevbase; do
+			if [ -c "/dev/$class/$vdevbase" ]; then
+				echo "# Destroying test virstor device:" \
+				    "$vdevbase"
+				gvirstor destroy "$vdevbase"
+			fi
+		done < "$TEST_VIRSTOR_DEVS_FILE"
+	fi
+	geom_test_cleanup
+}
+
+ATF_TEST=true
+. `dirname $0`/../geom_subr.sh
diff --git a/tests/sys/geom/class/virstor/virstor_test.sh b/tests/sys/geom/class/virstor/virstor_test.sh
new file mode 100644
index 000000000000..4f2047bffe97
--- /dev/null
+++ b/tests/sys/geom/class/virstor/virstor_test.sh
@@ -0,0 +1,73 @@
+#
+# Copyright (c) 2024 Dell Inc. or its subsidiaries.  All Rights Reserved.
+#
+# SPDX-License-Identifier: BSD-2-Clause
+#
+
+. $(atf_get_srcdir)/conf.sh
+
+atf_test_case basic cleanup
+basic_head()
+{
+	atf_set "descr" "geom virstor basic functional test"
+	atf_set "require.user" "root"
+}
+basic_body()
+{
+	geom_atf_test_setup
+	# Choose a virstor device name
+	gvirstor_dev_setup name
+
+	# Create an md backing device and initialize it with junk
+	psecsize=512
+	attach_md md -t swap -S $psecsize -s 5M || atf_fail "attach_md"
+	jot -b uninitialized 0 | dd status=none of=/dev/$md 2> /dev/null
+
+	# Create a virstor device
+	vsizemb=64
+	vsize=$((vsizemb * 1024 * 1024))
+	atf_check -o ignore -e ignore \
+	    gvirstor label -v -s ${vsizemb}M -m 512 $name /dev/$md
+	devwait
+	vdev="/dev/$class/$name"
+
+	ssize=$(diskinfo $vdev | awk '{print $2}')
+	atf_check_equal $psecsize $ssize
+
+	size=$(diskinfo $vdev | awk '{print $3}')
+	atf_check_equal $vsize $size
+
+	# Write the first and last sectors of the virtual address space
+	hasha=$(jot -b a 0 | head -c $ssize | sha1)
+	hashz=$(jot -b z 0 | head -c $ssize | sha1)
+	zsector=$((vsize / ssize - 1))
+	jot -b a 0 | dd status=none of=$vdev bs=$ssize count=1 conv=notrunc
+	jot -b z 0 | dd status=none of=$vdev bs=$ssize count=1 conv=notrunc \
+	    seek=$zsector
+
+	# Read back and compare
+	hashx=$(dd status=none if=$vdev bs=$ssize count=1 | sha1)
+	atf_check_equal $hasha $hashx
+	hashx=$(dd status=none if=$vdev bs=$ssize count=1 skip=$zsector | sha1)
+	atf_check_equal $hashz $hashx
+
+	# Destroy, then retaste and reload
+	atf_check -o ignore gvirstor destroy $name
+	true > /dev/$md
+	devwait
+
+	# Read back and compare
+	hashx=$(dd status=none if=$vdev bs=$ssize count=1 | sha1)
+	atf_check_equal $hasha $hashx
+	hashx=$(dd status=none if=$vdev bs=$ssize count=1 skip=$zsector | sha1)
+	atf_check_equal $hashz $hashx
+}
+basic_cleanup()
+{
+	gvirstor_test_cleanup
+}
+
+atf_init_test_cases()
+{
+	atf_add_test_case basic
+}