#!/bin/sh
set -u

BASEDIR=${AUTOPKGTEST_TMP:-${TMPDIR:-/tmp}}
SQFSIMAGES="${BASEDIR}/images"
MOUNTPOINTS="${BASEDIR}/mounts"

oneTimeSetUp() {
	# Define global variables for command output.
	stdoutF="${AUTOPKGTEST_TMP}/stdout"
	stderrF="${AUTOPKGTEST_TMP}/stderr"

	# directory infrastructure
	mkdir "${SQFSIMAGES}"
	mkdir "${MOUNTPOINTS}"

	# squashfs images
	for name in a b c; do
		dir=$(mktemp -p "${BASEDIR}" -d)
		mkdir "${dir}/${name}"
		echo "This is ${name}" > "${dir}/${name}/file_${name}.txt"
		mksquashfs "${dir}/${name}" "${SQFSIMAGES}/${name}.sqfs" -quiet -noappend
	done

	# mountpoints
	for dir in a b c; do
		mkdir "${MOUNTPOINTS}/${dir}"
	done
}

setUp() {
	# Truncate the output files.
	cp /dev/null "${stdoutF}"
	cp /dev/null "${stderrF}"
}

test_mount_single_image() {
	( squashfs-mount "${SQFSIMAGES}/a.sqfs":"${MOUNTPOINTS}/a" -- cat "${MOUNTPOINTS}/a/file_a.txt" ) >"${stdoutF}" 2>"${stderrF}"
	rtrn=$?

	assertEquals "squashfs-mount single-mount exit value" "0" "${rtrn}"

	assertEquals 'cat file_a.txt file content' 'This is a' "$(cat ${stdoutF})"
}

test_mount_images() {
	( squashfs-mount "${SQFSIMAGES}/a.sqfs":"${MOUNTPOINTS}/a" "${SQFSIMAGES}/b.sqfs":"${MOUNTPOINTS}/b" "${SQFSIMAGES}/c.sqfs":"${MOUNTPOINTS}/c" -- cat "${MOUNTPOINTS}/a/file_a.txt" ) >"${stdoutF}" 2>"${stderrF}"
	rtrn=$?

	assertEquals "squashfs-mount multi-mounts exit value" "0" "${rtrn}"

	assertEquals 'cat file_a.txt file content' 'This is a' "$(cat ${stdoutF})"
}

test_invalid_argument() {
	( squashfs-mount invalid_argument -- true ) >"${stdoutF}" 2>"${stderrF}"
	rtrn=$?

	assertEquals "squashfs-mount invalid argument exit value" "1" "${rtrn}"

	grep -q 'squashfs-mount: invalid format invalid_argument' "${stderrF}"
	assertTrue 'squashfs-mount output' $?
}

# Load shUnit2.
. shunit2
