test/*: introduce basic tests
Next step is CI.
This commit is contained in:
		
							
								
								
									
										1
									
								
								test/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								test/README.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| TODO docs | ||||
							
								
								
									
										111
									
								
								test/bare.test
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										111
									
								
								test/bare.test
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,111 @@ | ||||
| #!/bin/sh | ||||
|  | ||||
| . ../lib/common.sh | ||||
|  | ||||
| cleanup() | ||||
| { | ||||
|     umount "${tmpdir}/root" || : | ||||
|     qemu-nbd -d /dev/nbd0 || : | ||||
|     rm -rf "$tmpdir" | ||||
| } | ||||
|  | ||||
| set -ef | ||||
| trap cleanup EXIT INT | ||||
|  | ||||
| devmgr=${DEVMGR:-proc} | ||||
| arch=${ARCH:-$(uname -m)} | ||||
| kernel=${KERNEL:-$(uname -r)} | ||||
| vmlinuz=${VMLINUZ:-"/boot/vmlinuz-${kernel}"} | ||||
|  | ||||
| mkdir -p "${tmpdir:=${TMPDIR:-/tmp}/${0##*/}.$$}" | ||||
|  | ||||
| root="${tmpdir}/root" | ||||
| config="${tmpdir}/config" | ||||
| image="${tmpdir}/root.qcow2" | ||||
| initrd="${tmpdir}/initramfs-$(uname -r)" | ||||
|  | ||||
| qemu-img create -f qcow2 "$image" 1G | ||||
| qemu-nbd -c /dev/nbd0 "$image" | ||||
|  | ||||
| # o: Create MBR table. | ||||
| # n: Add new partition to table. | ||||
| # p: Primary partition. | ||||
| # 1: Partition number. | ||||
| # newline: Use default value for first sector. | ||||
| # newline: Use default value for last sector. | ||||
| # w: Write changes and re-read partition table. | ||||
| fdisk /dev/nbd0 << EOF | ||||
| o | ||||
| n | ||||
| p | ||||
| 1 | ||||
|  | ||||
|  | ||||
| w | ||||
| EOF | ||||
|  | ||||
| cat > "$config" << EOF | ||||
| hooks=$devmgr | ||||
| root=LABEL=root | ||||
| EOF | ||||
|  | ||||
| mkdir -p "$root" | ||||
|  | ||||
| mkfs.ext4 -L root /dev/nbd0p1 | ||||
| mount /dev/nbd0p1 "$root" | ||||
|  | ||||
| ( | ||||
|     tmpdir=$root; cd "$tmpdir" | ||||
|  | ||||
|     mkdir -p \ | ||||
|         dev sys tmp run proc \ | ||||
|         root usr/lib usr/bin | ||||
|  | ||||
|     ln -s usr/lib lib | ||||
|     ln -s usr/bin bin | ||||
|     ln -s usr/bin sbin | ||||
|     ln -s bin     usr/sbin | ||||
|  | ||||
|     copy_exec sh | ||||
|     copy_exec e2label | ||||
|  | ||||
|     cat > sbin/init << EOF | ||||
| #!/bin/sh | ||||
| exec e2label /dev/disk/by-label/root success | ||||
| EOF | ||||
|  | ||||
|     chmod +x sbin/init | ||||
| ) | ||||
|  | ||||
| umount "$root" | ||||
| qemu-nbd -d /dev/nbd0 | ||||
|  | ||||
| (cd .. && ./tinyramfs -lk "$kernel" -c "$config" "$initrd") | ||||
|  | ||||
| set -- \ | ||||
|     -no-reboot \ | ||||
|     -initrd "$initrd" \ | ||||
|     -kernel "$vmlinuz" \ | ||||
|     -device virtio-scsi \ | ||||
|     -drive  file="$image",if=virtio | ||||
|  | ||||
| if [ -c /dev/kvm ]; then | ||||
|     set -- -enable-kvm -cpu host "$@" | ||||
| fi | ||||
|  | ||||
| if [ "$DEBUG" ]; then | ||||
|     set -- -append 'panic=-1 rdpanic debug rddebug console=ttyS0' -nographic "$@" | ||||
| else | ||||
|     set -- -append 'panic=-1 rdpanic' -display none "$@" | ||||
| fi | ||||
|  | ||||
| "qemu-system-${arch}" "$@" | ||||
|  | ||||
| qemu-nbd -c /dev/nbd0 "$image" | ||||
|  | ||||
| # Re-read partition table. | ||||
| fdisk /dev/nbd0 << EOF | ||||
| w | ||||
| EOF | ||||
|  | ||||
| [ "$(e2label /dev/nbd0p1)" = success ] | ||||
							
								
								
									
										49
									
								
								test/check.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										49
									
								
								test/check.sh
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,49 @@ | ||||
| #!/bin/sh | ||||
|  | ||||
| if [ "$(id -u)" != 0 ]; then | ||||
|     printf '%s: must be run as root' "$0" | ||||
|     exit 1 | ||||
| fi | ||||
|  | ||||
| if [ "$DEVMGR" ]; then | ||||
|     : | ||||
| elif command -v mdev; then | ||||
|     DEVMGR=mdev | ||||
| elif command -v mdevd; then | ||||
|     DEVMGR=mdevd | ||||
| elif command -v udevd; then | ||||
|     DEVMGR=eudev | ||||
| elif command -v /lib/systemd/systemd-udevd; then | ||||
|     DEVMGR=systemd-udev | ||||
| elif [ -e /proc/sys/kernel/hotplug ]; then | ||||
|     DEVMGR=proc | ||||
| else | ||||
|     printf '%s: device manager not found' "$0" >&2 | ||||
|     exit 1 | ||||
| fi > /dev/null | ||||
|  | ||||
| export DEVMGR | ||||
|  | ||||
| if command -v modprobe > /dev/null; then | ||||
|     modprobe kvm | ||||
|     modprobe nbd | ||||
|     modprobe zfs | ||||
| fi | ||||
|  | ||||
| [ "$1" ] || set -- *.test | ||||
|  | ||||
| for file; do | ||||
|     if [ "$DEBUG" ]; then | ||||
|         "./${file}" 2>&1 | ||||
|     else | ||||
|         "./${file}" > /dev/null 2>&1 | ||||
|     fi | ||||
|  | ||||
|     case $? in | ||||
|         222) status=SKIP ;; | ||||
|         0)   status=PASS ;; | ||||
|         *)   status=FAIL ;; | ||||
|     esac | ||||
|  | ||||
|     printf '%s: %s\n' "$file" "$status" >&2 | ||||
| done | ||||
							
								
								
									
										125
									
								
								test/luks.test
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										125
									
								
								test/luks.test
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,125 @@ | ||||
| #!/bin/sh | ||||
|  | ||||
| . ../lib/common.sh | ||||
|  | ||||
| cleanup() | ||||
| { | ||||
|     umount "${tmpdir}/root" || : | ||||
|     cryptsetup close "$name" || : | ||||
|     qemu-nbd -d /dev/nbd0 || : | ||||
|     rm -rf "$tmpdir" | ||||
| } | ||||
|  | ||||
| command -v cryptsetup > /dev/null || exit 222 | ||||
|  | ||||
| set -ef | ||||
| trap cleanup EXIT INT | ||||
|  | ||||
| devmgr=${DEVMGR:-proc} | ||||
| arch=${ARCH:-$(uname -m)} | ||||
| kernel=${KERNEL:-$(uname -r)} | ||||
| vmlinuz=${VMLINUZ:-"/boot/vmlinuz-${kernel}"} | ||||
|  | ||||
| mkdir -p "${tmpdir:=${TMPDIR:-/tmp}/${0##*/}.$$}" | ||||
|  | ||||
| name="luks$$" | ||||
| root="${tmpdir}/root" | ||||
| config="${tmpdir}/config" | ||||
| image="${tmpdir}/root.qcow2" | ||||
| initrd="${tmpdir}/initramfs-$(uname -r)" | ||||
|  | ||||
| qemu-img create -f qcow2 "$image" 1G | ||||
| qemu-nbd -c /dev/nbd0 "$image" | ||||
|  | ||||
| # o: Create MBR table. | ||||
| # n: Add new partition to table. | ||||
| # p: Primary partition. | ||||
| # 1: Partition number. | ||||
| # newline: Use default value for first sector. | ||||
| # newline: Use default value for last sector. | ||||
| # w: Write changes and re-read partition table. | ||||
| fdisk /dev/nbd0 << EOF | ||||
| o | ||||
| n | ||||
| p | ||||
| 1 | ||||
|  | ||||
|  | ||||
| w | ||||
| EOF | ||||
|  | ||||
| dd bs=512 count=1 if=/dev/urandom of="${tmpdir}/key" | ||||
|  | ||||
| cryptsetup -qd "${tmpdir}/key" --pbkdf=pbkdf2 luksFormat /dev/nbd0p1 | ||||
| cryptsetup  -d "${tmpdir}/key" open /dev/nbd0p1 "$name" | ||||
|  | ||||
| cat > "$config" << EOF | ||||
| hooks=$devmgr,luks | ||||
| root=LABEL=root | ||||
| luks_root=UUID=$(cryptsetup luksUUID /dev/nbd0p1) | ||||
| luks_key=${tmpdir}/key | ||||
| EOF | ||||
|  | ||||
| mkdir -p "$root" | ||||
|  | ||||
| mkfs.ext4 -L root "/dev/mapper/${name}" | ||||
| mount "/dev/mapper/${name}" "$root" | ||||
|  | ||||
| ( | ||||
|     tmpdir=$root; cd "$tmpdir" | ||||
|  | ||||
|     mkdir -p \ | ||||
|         dev sys tmp run proc \ | ||||
|         root usr/lib usr/bin | ||||
|  | ||||
|     ln -s usr/lib lib | ||||
|     ln -s usr/bin bin | ||||
|     ln -s usr/bin sbin | ||||
|     ln -s bin     usr/sbin | ||||
|  | ||||
|     copy_exec sh | ||||
|     copy_exec e2label | ||||
|  | ||||
|     cat > sbin/init << EOF | ||||
| #!/bin/sh | ||||
| exec e2label /dev/disk/by-label/root success | ||||
| EOF | ||||
|  | ||||
|     chmod +x sbin/init | ||||
| ) | ||||
|  | ||||
| umount "$root" | ||||
| cryptsetup close "$name" | ||||
| qemu-nbd -d /dev/nbd0 | ||||
|  | ||||
| (cd .. && ./tinyramfs -lk "$kernel" -c "$config" "$initrd") | ||||
|  | ||||
| set -- \ | ||||
|     -no-reboot \ | ||||
|     -initrd "$initrd" \ | ||||
|     -kernel "$vmlinuz" \ | ||||
|     -device virtio-scsi \ | ||||
|     -drive  file="$image",if=virtio | ||||
|  | ||||
| if [ -c /dev/kvm ]; then | ||||
|     set -- -enable-kvm -cpu host "$@" | ||||
| fi | ||||
|  | ||||
| if [ "$DEBUG" ]; then | ||||
|     set -- -append 'panic=-1 rdpanic debug rddebug console=ttyS0' -nographic "$@" | ||||
| else | ||||
|     set -- -append 'panic=-1 rdpanic' -display none "$@" | ||||
| fi | ||||
|  | ||||
| "qemu-system-${arch}" "$@" | ||||
|  | ||||
| qemu-nbd -c /dev/nbd0 "$image" | ||||
|  | ||||
| # Re-read partition table. | ||||
| fdisk /dev/nbd0 << EOF | ||||
| w | ||||
| EOF | ||||
|  | ||||
| cryptsetup -d "${tmpdir}/key" open /dev/nbd0p1 "$name" | ||||
|  | ||||
| [ "$(e2label "/dev/mapper/${name}")" = success ] | ||||
							
								
								
									
										125
									
								
								test/lvm.test
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										125
									
								
								test/lvm.test
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,125 @@ | ||||
| #!/bin/sh | ||||
|  | ||||
| . ../lib/common.sh | ||||
|  | ||||
| cleanup() | ||||
| { | ||||
|     umount "${tmpdir}/root" || : | ||||
|     vgchange -an "$vg" || : | ||||
|     qemu-nbd -d /dev/nbd0 || : | ||||
|     rm -rf "$tmpdir" | ||||
| } | ||||
|  | ||||
| command -v lvm > /dev/null || exit 222 | ||||
|  | ||||
| set -ef | ||||
| trap cleanup EXIT INT | ||||
|  | ||||
| devmgr=${DEVMGR:-proc} | ||||
| arch=${ARCH:-$(uname -m)} | ||||
| kernel=${KERNEL:-$(uname -r)} | ||||
| vmlinuz=${VMLINUZ:-"/boot/vmlinuz-${kernel}"} | ||||
|  | ||||
| mkdir -p "${tmpdir:=${TMPDIR:-/tmp}/${0##*/}.$$}" | ||||
|  | ||||
| vg="vg$$" | ||||
| lv="lv$$" | ||||
| root="${tmpdir}/root" | ||||
| config="${tmpdir}/config" | ||||
| image="${tmpdir}/root.qcow2" | ||||
| initrd="${tmpdir}/initramfs-$(uname -r)" | ||||
|  | ||||
| qemu-img create -f qcow2 "$image" 1G | ||||
| qemu-nbd -c /dev/nbd0 "$image" | ||||
|  | ||||
| # o: Create MBR table. | ||||
| # n: Add new partition to table. | ||||
| # p: Primary partition. | ||||
| # 1: Partition number. | ||||
| # newline: Use default value for first sector. | ||||
| # newline: Use default value for last sector. | ||||
| # w: Write changes and re-read partition table. | ||||
| fdisk /dev/nbd0 << EOF | ||||
| o | ||||
| n | ||||
| p | ||||
| 1 | ||||
|  | ||||
|  | ||||
| w | ||||
| EOF | ||||
|  | ||||
| cat > "$config" << EOF | ||||
| hooks=$devmgr,lvm | ||||
| root=LABEL=root | ||||
| lvm_group=$vg | ||||
| lvm_name=$lv | ||||
| EOF | ||||
|  | ||||
| vgcreate "$vg" /dev/nbd0p1 | ||||
| lvcreate -l 100%FREE -n "$lv" "$vg" | ||||
| lvchange -ay "${vg}/${lv}" | ||||
|  | ||||
| mkdir -p "$root" | ||||
|  | ||||
| mkfs.ext4 -L root "/dev/mapper/${vg}-${lv}" | ||||
| mount "/dev/mapper/${vg}-${lv}" "$root" | ||||
|  | ||||
| ( | ||||
|     tmpdir=$root; cd "$tmpdir" | ||||
|  | ||||
|     mkdir -p \ | ||||
|         dev sys tmp run proc \ | ||||
|         root usr/lib usr/bin | ||||
|  | ||||
|     ln -s usr/lib lib | ||||
|     ln -s usr/bin bin | ||||
|     ln -s usr/bin sbin | ||||
|     ln -s bin     usr/sbin | ||||
|  | ||||
|     copy_exec sh | ||||
|     copy_exec e2label | ||||
|  | ||||
|     cat > sbin/init << EOF | ||||
| #!/bin/sh | ||||
| exec e2label /dev/disk/by-label/root success | ||||
| EOF | ||||
|  | ||||
|     chmod +x sbin/init | ||||
| ) | ||||
|  | ||||
| umount "$root" | ||||
| vgchange -an "$vg" | ||||
| qemu-nbd -d /dev/nbd0 | ||||
|  | ||||
| (cd .. && ./tinyramfs -lk "$kernel" -c "$config" "$initrd") | ||||
|  | ||||
| set -- \ | ||||
|     -no-reboot \ | ||||
|     -initrd "$initrd" \ | ||||
|     -kernel "$vmlinuz" \ | ||||
|     -device virtio-scsi \ | ||||
|     -drive  file="$image",if=virtio | ||||
|  | ||||
| if [ -c /dev/kvm ]; then | ||||
|     set -- -enable-kvm -cpu host "$@" | ||||
| fi | ||||
|  | ||||
| if [ "$DEBUG" ]; then | ||||
|     set -- -append 'panic=-1 rdpanic debug rddebug console=ttyS0' -nographic "$@" | ||||
| else | ||||
|     set -- -append 'panic=-1 rdpanic' -display none "$@" | ||||
| fi | ||||
|  | ||||
| "qemu-system-${arch}" "$@" | ||||
|  | ||||
| qemu-nbd -c /dev/nbd0 "$image" | ||||
|  | ||||
| # Re-read partition table. | ||||
| fdisk /dev/nbd0 << EOF | ||||
| w | ||||
| EOF | ||||
|  | ||||
| lvchange -ay "${vg}/${lv}" | ||||
|  | ||||
| [ "$(e2label "/dev/mapper/${vg}-${lv}")" = success ] | ||||
							
								
								
									
										131
									
								
								test/zfs.test
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										131
									
								
								test/zfs.test
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,131 @@ | ||||
| #!/bin/sh | ||||
|  | ||||
| . ../lib/common.sh | ||||
|  | ||||
| cleanup() | ||||
| { | ||||
|     zpool export "$pool" || : | ||||
|     qemu-nbd -d /dev/nbd0 || : | ||||
|     rm -rf "$tmpdir" | ||||
| } | ||||
|  | ||||
| command -v zfs > /dev/null || exit 222 | ||||
|  | ||||
| set -ef | ||||
| trap cleanup EXIT INT | ||||
|  | ||||
| devmgr=${DEVMGR:-proc} | ||||
| arch=${ARCH:-$(uname -m)} | ||||
| kernel=${KERNEL:-$(uname -r)} | ||||
| vmlinuz=${VMLINUZ:-"/boot/vmlinuz-${kernel}"} | ||||
|  | ||||
| mkdir -p "${tmpdir:=${TMPDIR:-/tmp}/${0##*/}.$$}" | ||||
|  | ||||
| pool="pool$$" | ||||
| root="${tmpdir}/root" | ||||
| config="${tmpdir}/config" | ||||
| image="${tmpdir}/root.qcow2" | ||||
| initrd="${tmpdir}/initramfs-$(uname -r)" | ||||
|  | ||||
| qemu-img create -f qcow2 "$image" 1G | ||||
| qemu-nbd -c /dev/nbd0 "$image" | ||||
|  | ||||
| # o: Create MBR table. | ||||
| # n: Add new partition to table. | ||||
| # p: Primary partition. | ||||
| # 1: Partition number. | ||||
| # newline: Use default value for first sector. | ||||
| # newline: Use default value for last sector. | ||||
| # w: Write changes and re-read partition table. | ||||
| fdisk /dev/nbd0 << EOF | ||||
| o | ||||
| n | ||||
| p | ||||
| 1 | ||||
|  | ||||
|  | ||||
| w | ||||
| EOF | ||||
|  | ||||
| dd bs=512 count=1 if=/dev/urandom of="${tmpdir}/key" | ||||
|  | ||||
| zpool create -m none "$pool" /dev/nbd0p1 | ||||
| zfs create \ | ||||
|     -o mountpoint=legacy \ | ||||
|     -o canmount=noauto \ | ||||
|     -o encryption=on \ | ||||
|     -o keyformat=passphrase \ | ||||
|     -o keylocation="file://${tmpdir}/key" \ | ||||
|     "${pool}/root" | ||||
|  | ||||
| cat > "$config" << EOF | ||||
| hooks=$devmgr,zfs | ||||
| root=${pool}/root | ||||
| root_type=zfs | ||||
| # required if mountpoint != legacy | ||||
| #root_opts=zfsutil | ||||
| zfs_key=${tmpdir}/key | ||||
| # toybox/busybox blkid doesn't support zfs. fallback to /dev/* (unstable) | ||||
| zfs_root=/dev/vda1 | ||||
| EOF | ||||
|  | ||||
| mkdir -p "$root" | ||||
| mount -t zfs "${pool}/root" "$root" | ||||
|  | ||||
| ( | ||||
|     tmpdir=$root; cd "$tmpdir" | ||||
|  | ||||
|     mkdir -p \ | ||||
|         dev sys tmp run proc \ | ||||
|         root usr/lib usr/bin | ||||
|  | ||||
|     ln -s usr/lib lib | ||||
|     ln -s usr/bin bin | ||||
|     ln -s usr/bin sbin | ||||
|     ln -s bin     usr/sbin | ||||
|  | ||||
|     copy_exec sh | ||||
|     copy_exec zfs | ||||
|  | ||||
|     cat > sbin/init << EOF | ||||
| #!/bin/sh | ||||
| exec zfs set success:=true "${pool}/root" | ||||
| EOF | ||||
|  | ||||
|     chmod +x sbin/init | ||||
| ) | ||||
|  | ||||
| zpool export "$pool" | ||||
| qemu-nbd -d /dev/nbd0 | ||||
|  | ||||
| (cd .. && ./tinyramfs -lk "$kernel" -c "$config" "$initrd") | ||||
|  | ||||
| set -- \ | ||||
|     -no-reboot \ | ||||
|     -initrd "$initrd" \ | ||||
|     -kernel "$vmlinuz" \ | ||||
|     -device virtio-scsi \ | ||||
|     -drive  file="$image",if=virtio | ||||
|  | ||||
| if [ -c /dev/kvm ]; then | ||||
|     set -- -enable-kvm -cpu host "$@" | ||||
| fi | ||||
|  | ||||
| if [ "$DEBUG" ]; then | ||||
|     set -- -append 'panic=-1 rdpanic debug rddebug console=ttyS0' -nographic "$@" | ||||
| else | ||||
|     set -- -append 'panic=-1 rdpanic' -display none "$@" | ||||
| fi | ||||
|  | ||||
| "qemu-system-${arch}" "$@" | ||||
|  | ||||
| qemu-nbd -c /dev/nbd0 "$image" | ||||
|  | ||||
| # Re-read partition table. | ||||
| fdisk /dev/nbd0 << EOF | ||||
| w | ||||
| EOF | ||||
|  | ||||
| zpool import -Nd /dev/nbd0p1 "$pool" | ||||
|  | ||||
| [ "$(zfs get -Ho value success: "${pool}/root")" = true ] | ||||
		Reference in New Issue
	
	Block a user