#!/usr/bin/env atf-sh

. $(atf_get_srcdir)/test_env.sh
init_tests \
	persistent_storage_cdrom \
	persistent_storage_cdrom_removable \
	persistent_storage_nvme_wwid \
	persistent_storage_sda_wwid \
	persistent_storage_sda_wwid_partition_symlink \
	persistent_storage_nvme_model_serial \
	persistent_storage_virtio_blk_serial \
	persistent_storage_block \
	persistent_storage_by_label \
	persistent_storage_by_partlabel \
	persistent_storage_by_partuuid \
	persistent_storage_by_uuid \
	persistent_storage_ebs \
	persistent_storage_usbdisk_symlink \
	persistent_storage_usbdisk_partition_symlink

mdevscript=$(atf_get_srcdir)/../persistent-storage
export SYSFS=sys

persistent_storage_cdrom_body() {
	for dev in sr0 xvdc; do
		mkdir -p sys/block/$dev
		echo 109 > sys/block/$dev/capability

		MDEV=$dev ACTION=add atf_check \
			sh $mdevscript
		atf_check -o match:"$dev" \
			readlink cdrom

		MDEV=$dev ACTION=remove atf_check \
			sh $mdevscript
		atf_check -s not-exit:0 -o not-match:"$dev" \
			readlink cdrom
	done
}

persistent_storage_cdrom_removable_body() {
	for dev in sr0 xvdc; do
		# newer kernels does not set the CDROM capability bit
		# https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=1a827ce1b9f2c740d2c6a228afd972970c18bc21
		mkdir -p sys/block/$dev
		echo 5 > sys/block/$dev/capability
		echo 1 > sys/block/$dev/removable

		MDEV=$dev ACTION=add atf_check \
			sh $mdevscript
		atf_check -o match:"$dev" \
			readlink cdrom

		MDEV=$dev ACTION=remove atf_check \
			sh $mdevscript
		atf_check -s not-exit:0 -o not-match:"$dev" \
			readlink cdrom
	done
}

persistent_storage_nvme_wwid_body() {
	mkdir -p sys/class/block/nvme0n1
	echo eui.0025386b61b01dcd > sys/class/block/nvme0n1/wwid

	MDEV=nvme0n1 ACTION=add atf_check \
		sh $mdevscript
	atf_check -o match:"nvme0n1" \
		readlink disk/by-id/nvme-eui.0025386b61b01dcd

	MDEV=nvme0n1 ACTION=remove atf_check \
		sh $mdevscript
	atf_check -s not-exit:0 \
		readlink disk/by-id/nvme-eui.0025386b61b01dcd
}

persistent_storage_sda_wwid_body() {
	mkdir -p sys/class/block/sda/device
	echo naa.5002538f4158fd7b > sys/class/block/sda/device/wwid

	MDEV=sda ACTION=add atf_check \
		sh $mdevscript
	atf_check -o match:"sda" \
		readlink disk/by-id/wwn-0x5002538f4158fd7b

	MDEV=sda ACTION=remove atf_check \
		sh $mdevscript
	atf_check -s not-exit:0 \
		readlink disk/by-id/wwn-0x5002538f4158fd7b
}

persistent_storage_sda_wwid_partition_symlink_body() {
	mkdir -p sys/class/block
	mkdir -p sys/devices/pci0000:00/0000:00:1f.2/ata1/host0/target0:0:0/0:0:0:0/block/sda/sda1
	ln -s ../../devices/pci0000:00/0000:00:1f.2/ata1/host0/target0:0:0/0:0:0:0/block/sda/sda1 sys/class/block/sda1
	
	mkdir -p sys/class/block/sda/device
	echo naa.5000cca03e99fea4 > sys/class/block/sda/device/wwid
	
	mkdir -p sys/class/block/sda1
	echo '1' > sys/class/block/sda1/partition

	MDEV=sda1 ACTION=add atf_check \
		sh $mdevscript
	atf_check -o match:"sda1" \
		readlink disk/by-id/wwn-0x5000cca03e99fea4-part1

	MDEV=sda1 ACTION=remove atf_check \
		sh $mdevscript
	atf_check -s not-exit:0 \
		readlink disk/by-id/wwn-0x5000cca03e99fea4-part1
}


persistent_storage_nvme_model_serial_body() {
	mkdir -p sys/class/block/nvme0n1/device
	echo 'Samsung SSD 960 EVO 500GB               ' > sys/class/block/nvme0n1/device/model
	echo 'S3EUNX0HB01245Y     ' > sys/class/block/nvme0n1/device/serial

	MDEV=nvme0n1 ACTION=add atf_check \
		sh $mdevscript
	atf_check -o match:"nvme0n1" \
		readlink disk/by-id/nvme-Samsung_SSD_960_EVO_500GB_S3EUNX0HB01245Y
}

persistent_storage_virtio_blk_serial_body() {
	mkdir -p sys/class/block/vda
	echo 'foobar' > sys/class/block/vda/serial

	MDEV=vda ACTION=add atf_check \
		sh $mdevscript
	atf_check -o match:"vda" \
		readlink disk/by-id/virtio-foobar
}

persistent_storage_block_body() {
	mkdir -p sys/class/block/sda
	echo '8:0' > sys/class/block/sda/dev

	MDEV=sda ACTION=add atf_check \
		sh $mdevscript
	atf_check -o match:"sda" \
		readlink block/8:0
}

persistent_storage_by_label_body() {
	local fs_label="EFI System"
	local fs_encoded_label="$(echo $fs_label | sed -e 's| |\\x20|g')"

	cat <<-EOF > blkid
	#!/bin/sh
	# blkid mock
	case \$1 in
		/dev/sda1)
		echo "/dev/sda1: UUID=\"00283cf5-01\" LABEL=\"$fs_encoded_label\" TYPE=\"ext4\""
		;;
	esac
	EOF
	chmod +x blkid
	export PATH="$PWD:$PATH"

	MDEV=sda1 ACTION=add atf_check \
		sh $mdevscript
	atf_check -o match:"sda1" \
		readlink disk/by-label/"$fs_encoded_label"
}

persistent_storage_by_partlabel_body() {
	local partlabel="LUKS"

	cat <<-EOF > blkid
	#!/bin/sh
	# blkid mock
	case \$1 in
		/dev/sda1)
		echo "/dev/sda1: UUID=\"00283cf5-01\" LABEL=\"testing\" PARTLABEL=\"$partlabel\" TYPE=\"ext4\""
		;;
	esac
	EOF
	chmod +x blkid
	export PATH="$PWD:$PATH"

	MDEV=sda1 ACTION=add atf_check \
		sh $mdevscript
	atf_check -o match:"sda1" \
		readlink disk/by-partlabel/"$partlabel"
}

persistent_storage_by_partuuid_body() {
	local partuuid="f6daa453-3150-46a2-b6f9-863e38fcd2aa"
	mkdir bin

	cat <<-EOF > bin/blkid
	#!/bin/sh
	# blkid mock
	case \$1 in
		/dev/vda1)
		echo '/dev/vda1: LABEL="testlabel" UUID="9850e420-fecd-4d61-bf8e-50c8babebbb2" BLOCK_SIZE="512" TYPE="xfs" PARTLABEL="Linux filesystem" PARTUUID="$partuuid"'
		;;
	esac
	EOF
	chmod +x bin/blkid
	export PATH="$PWD/bin:$PATH"

	MDEV=vda1 ACTION=add atf_check \
		sh $mdevscript
	atf_check -o match:"vda1" \
		readlink disk/by-partuuid/"$partuuid"
}

persistent_storage_by_uuid_body() {
	local fs_uuid="2022-05-15-22-31-31-00"

	cat <<-EOF > blkid
	#!/bin/sh
	# blkid mock
	case \$1 in
		/dev/sr0)
		echo "/dev/sr0: BLOCK_SIZE=\"2048\" UUID=\"$fs_uuid\" LABEL=\"cidata\" TYPE=\"iso9660\""
		;;
	esac
	EOF
	chmod +x blkid
	export PATH="$PWD:$PATH"

	MDEV=sr0 ACTION=add atf_check \
		sh $mdevscript
	atf_check -o match:"sr0" \
		readlink disk/by-uuid/"$fs_uuid"
}

persistent_storage_ebs_body() {
	mkdir -p bin sys/class/block \
		sys/devices/pci0000:00/0000:00:1b.0/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p2 \
		sys/devices/pci0000:00/0000:00:1b.0/0000:01:00.0/nvme/nvme0/nvme0n1/device
	ln -s ../../devices/pci0000:00/0000:00:1b.0/0000:01:00.0/nvme/nvme0/nvme0n1 sys/class/block/nvme0n1
	ln -s ../../devices/pci0000:00/0000:00:1b.0/0000:01:00.0/nvme/nvme0/nvme0n1/nvme0n1p2 sys/class/block/nvme0n1p2
	echo "Amazon Elastic Block Store" > sys/class/block/nvme0n1/device/model
	echo 2 > sys/class/block/nvme0n1p2/partition

	cat <<-EOF > bin/nvme
	#!/bin/sh
	# mock nvme
	base64 -d <<-EOF2
Dx0PHXZvbDA1OGQxMDlkZWE1NjRiNGQwQW1hem9uIEVsYXN0aWMgQmxvY2sgU3RvcmUgICAgICAg
ICAgICAgIDEuMCAgICAgINwCoAAGAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAADAD8AAQBXAQAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABm
RAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA
QEIPAEBCDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeHZkYSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
	EOF2
	EOF
	chmod +x bin/nvme
	export PATH="$PWD/bin:$PATH"

	MDEV=nvme0n1 ACTION=add atf_check \
		sh $mdevscript
	atf_check -o match:"nvme0n1" \
		readlink xvda

	MDEV=nvme0n1p2 ACTION=add atf_check \
		sh $mdevscript
	atf_check -o match:"nvme0n1p2" \
		readlink xvda2
}

persistent_storage_usbdisk_symlink_body() {
	mkdir -p sys/class/block sys/block bin
	ln -s ../../devices/pci0000:00/0000:00:14.0/usb2/2-10/2-10:1.0/host4/target4:0:0/4:0:0:0 sys/class/block/sdc
	ln -s ../devices/pci0000:00/0000:00:14.0/usb2/2-10/2-10:1.0/host4/target4:0:0/4:0:0:0 sys/block/sdc

	cat <<-EOF > bin/blkid
	#!/bin/sh
	# blkid mock
	case \$1 in
		/dev/sdc)
		echo '/dev/sdc: UUID="436D-F3F4" BLOCK_SIZE="512" TYPE="vfat"'
		;;
	esac
	EOF
	chmod +x bin/blkid
	export PATH="$PWD/bin:$PATH"

	MDEV=sdc ACTION=add atf_check \
		sh $mdevscript
	atf_check -o match:"sdc" \
		readlink usbdisk
}

persistent_storage_usbdisk_partition_symlink_body() {
	mkdir -p sys/class/block
	ln -s ../../devices/pci0000:00/0000:00:14.0/usb2/2-10/2-10:1.0/host4/target4:0:0/4:0:0:0 sys/class/block/sdc1

	MDEV=sdc1 ACTION=add atf_check \
		sh $mdevscript
	atf_check -o match:"sdc1" \
		readlink usbdisk
}
