#
# 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
}