# setup paths for BATS test units
setup() {
	[ ! -f ${BATS_PARENT_TMPNAME}.skip ] || skip "skip remaining tests"
    bats_require_minimum_version 1.5.0
    R="$BATS_TEST_DIRNAME"
    # R=`cd "$T"/.. && pwd`
    TMP="$BATS_FILE_TMPDIR"
    load test_helper/bats-support/load
    load test_helper/bats-assert/load
    load test_helper/bats-file/load
    ZTMP="$BATS_FILE_TMPDIR"
    if [ "$ZENROOM_EXECUTABLE" == "" ]; then
	ZENROOM_EXECUTABLE="/usr/local/bin/zenroom"
    fi

	PATH="$PATH:/usr/local/bin:/usr/local/sbin"
	MNT="/media/`basename $BATS_TEST_FILENAME`"
	PIM=42
	# max password stdin size to veracrypt is 128 bytes
	PW="91cd69b2caab05cb64f8e1c8ae22a7c5a25564e7fc5116d0303dce1ffd26861ea0483c25bdb85adb216718c19815eb59ac14ec9783bfbbb57786ca7d9038c845"
	# `openssl rand -hex 64`"
	FS='ext4'
	SIZE='20M'
	[ "$TOMB" = "" ] && TOMB=test.tomb

	# default on freebsd is 1001
	user_uid=1000
	user_gid=1000

	system="`uname -s`"
	f_create=""
	f_format=""
	f_map=""
	f_mount=""
	f_close=""

	case "$system" in
		FreeBSD)
			f_create=portable_create
			f_format=freebsd_format
			f_map=portable_map
			f_mount=freebsd_mount
			f_close=freebsd_close
			user_uid=1001
			user_gid=1001
			;;
		Linux)
			f_create=portable_create
			f_format=linux_format
			f_map=portable_map
			f_mount=linux_mount
			f_close=portable_close
			user_uid=1000
			user_gid=1000
			;;
		*)
			>&2 echo "Unsupported system: $system"
			exit 1
	esac

	#    cd $ZTMP
}

teardown() {
	[ -n "$BATS_TEST_COMPLETED" ] || touch ${BATS_PARENT_TMPNAME}.skip
	>&3 echo
}




# usage: echo PASSWORD | portable_create file size pim
portable_create() {
	local file="$1" # must not exist
	local size="$2" # veracrypt format (accepts M or G)
	local pim="$3" # any number
	# >&2 echo "portable_create $file $size $pim"
	veracrypt --non-interactive --text --stdin \
		 -m nokernelcrypto \
		 -c ${file} --volume-type normal \
		 --hash sha512 --encryption serpent-aes \
		 --filesystem none --size ${size} --pim ${pim} \
		 --random-source /dev/urandom -k ''
	return $?
}

# usage: echo PASSWORD | portable_map file pim
portable_map() {
	local file="$1"
	local pim="$2"
	# >&2 echo "portable_map $file $pim"
	veracrypt --non-interactive --text --stdin \
			  --protect-hidden no -m nokernelcrypto \
			  -k '' --pim ${pim} --filesystem none \
			  ${file}
	local loop=`veracrypt -l "$file" | awk '{print $3}'`
	return $?
}

portable_close() {
	local file="$1"
	veracrypt -d ${file}
	return $?
}

linux_format() {
	local file="$1"
	# loop="`losetup -j ${vera}/volume | cut -d: -f1`"
	local loop=`veracrypt -l "$FILE" | awk '{print $3}'`
	# losetup -l
	>&2 echo "veramap format: ${loop}"
	sync
	sudo mkfs.ext4 -E root_owner="${user_uid}:${user_gid}" "$loop"
	return $?
}

# usage: _mount /tmp/.veracrypt_ mountpoint
linux_mount() {
	local file="$1"
	local mnt="$2"
	# local loop="`losetup -j ${vera}/volume | cut -d: -f1`"
	local loop=`veracrypt -l "$file" | awk '{print $3}'`
	>&3 echo "fsck $loop"
	fsck.ext4 -p -C0 "$loop"
	sudo mount ${loop} "$mnt"
	return $?
}

freebsd_format() {
    file="$1"
    local loop=`veracrypt -l "$FILE" | awk '{print $3}'`
    mkfs.ext4 -E root_owner="${user_uid}:${user_gid}" "${loop}"
	return $?
}

freebsd_mount() {
	local file="$1"
	local mnt="$2"
	>&2 echo `veracrypt -l "$file"`
	local loop=`veracrypt -l "$file" | awk '{print $3}'`
	>&3 echo "fsck $loop"
	fsck.ext4 -p -C0 "$loop"
	lklfuse -o type=ext4 "${loop}" "$mnt"
	return $?
}

freebsd_close() {
	local file="$1"
	local md=`veracrypt -l "$file" | awk '{print $3}'`
	# umount "$mnt"
	>&2 echo "md: $md"
	local mnt=`pgrep -lf "lklfuse.*$md" | awk '{print $6}'`
	>&2 echo "mnt: $mnt"
	lkl=`pgrep -f "lklfuse.*$md" | awk '{print $1}'`
	>&3 echo "kill $lkl (lklfuse on $md)"
	# trying to deail with lklfuse bug
	# https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=239831
	renice -20 $lkl
	kill $lkl
	sync
	sleep 1
	kill -9 $lkl
	# lkl should have really exited now
	>&3 echo "veracrypt -d $file"
	veracrypt -d "$file"
	return $?
}

Z() {
    tmptmp=0
    if ! [ "$TMP" ]; then
	TMP=`mktemp -d`; tmptmp=1
    fi
    script=$1
    if [ "$script" == "-" ]; then
	cat > $TMP/script_stdin
	script=$TMP/script_stdin
    else
	if ! [ -r "$script" ]; then
	    script=$T/$script
	fi
    fi
    if ! [ -r $script ]; then
	>&2 echo "Error - script not found: $script"
	return 1
    fi
    shift 1
    if [ "${1##*.}"  == "zen" ]; then
	$ZENROOM_EXECUTABLE $@ -z $script
    else
	$ZENROOM_EXECUTABLE $@ $script
    fi
    if [ $tmptmp = 1 ]; then
	rm -f $TMP/*
	rmdir $TMP
    fi
}
