#!/bin/sh

# this runs a simple tarmode test

if [ $# -lt 7 ]; then
	cat <<EOF
Usage: test_smbclient_tarmode.sh SERVER SERVER_IP USERNAME PASSWORD LOCAL_PATH PREFIX SMBCLIENT [create|extract] <smbclient arguments>
EOF
	exit 1
fi

SERVER="$1"
SERVER_IP="$2"
USERNAME="$3"
PASSWORD="$4"
LOCAL_PATH="$5"
PREFIX="$6"
SMBCLIENT="$7"
SMBCLIENT="$VALGRIND ${SMBCLIENT}"
shift 7
ADDARGS="$*"

incdir=$(dirname $0)/../../../testprogs/blackbox
. $incdir/subunit.sh

FAILCOUNT=0

# Check command is available
have_command()
{
	type "$1" >/dev/null 2>&1
	return $?
}

# Create a test corpus
create_test_data()
{

	local DIR="$1"
	local BS=1024
	local NUM_FILES=10
	local NORND_COUNT=25

	# Bomb if dir exists
	if [ -e "$DIR" ]; then
		echo "Test data directory '$DIR' already exists!"
		false
		return
	fi

	if ! mkdir -p "$DIR" >/dev/null 2>&1; then
		echo "Couldn't create test data directory '$DIR'"
		false
		return
	fi

	local I=1
	if have_command "od"; then # Use random file sizes
		local RND_COUNT
		for RND_COUNT in $(od -An -N$NUM_FILES -tu1 </dev/urandom); do
			if ! dd if=/dev/urandom of="$DIR/file.$I" bs=$BS count=$RND_COUNT >/dev/null 2>&1; then
				echo "Couldn't create test file '$DIR/file.$I' (random size)"
				false
				return
			fi
			I=$(expr $I + 1)
		done
	else # Fallback to same file sizes
		while [ $I -le $NUM_FILES ]; do
			if ! dd if=/dev/urandom of="$DIR/file.$I" bs=$BS count=$NORND_COUNT >/dev/null 2>&1; then
				echo "Couldn't create test file '$DIR/file.$I' (static size)"
				false
				return
			fi
			I=$(expr $I + 1)
		done
	fi

	true
	return

}

# Check that two directories are equivalent (In Data content)
validate_data()
{
	local DIR1="$1"
	local DIR2="$2"

	diff -r "$DIR1" "$DIR2"
	return $?
}

# Test tarmode -Tc
test_tarmode_creation()
{

	# Clear temp data
	rm -rf -- "$PREFIX"/tarmode >/dev/null 2>&1
	rm -f "$PREFIX"/tarmode.tar >/dev/null 2>&1
	$SMBCLIENT //$SERVER/tarmode $CONFIGURATION -U$USERNAME%$PASSWORD -c "deltree smbclient_tar"

	# Build the test data
	if ! create_test_data "$LOCAL_PATH"; then
		echo "Test data creation failed"
		false
		return
	fi

	# Create tarfile with smbclient
	if ! $SMBCLIENT //$SERVER/tarmode $CONFIGURATION -U$USERNAME%$PASSWORD -I $SERVER_IP -p 139 \
		$ADDARGS -c "tarmode full" -Tc "$PREFIX/tarmode.tar" "/smbclient_tar"; then
		echo "Couldn't create tar file with tarmode -Tc"
		false
		return
	fi

	# Extract data to verify - this puts it into $PREFIX/smbclient_tar/
	# but we must leave it there as it's used to verify in test_tarmode_extraction()
	if ! tar -xf "$PREFIX/tarmode.tar" -C "$PREFIX"; then
		echo "Couldn't extract data from created tarfile"
		false
		return
	fi

	# Verify data
	if ! validate_data "$PREFIX/smbclient_tar" "$LOCAL_PATH"; then
		echo "Data not equivalent"
		false
		return
	fi

	# Clear temp data
	rm -rf -- "$PREFIX"/tarmode >/dev/null 2>&1
	rm -f "$PREFIX"/tarmode.tar >/dev/null 2>&1
	$SMBCLIENT //$SERVER/tarmode $CONFIGURATION -U$USERNAME%$PASSWORD -c "deltree smbclient_tar"
	true
	return

}

# Test tarmode -Tx
test_tarmode_extraction()
{

	# Clear temp data
	rm -rf -- "$PREFIX"/tarmode >/dev/null 2>&1
	rm -f "$PREFIX"/tarmode.tar >/dev/null 2>&1
	$SMBCLIENT //$SERVER/tarmode $CONFIGURATION -U$USERNAME%$PASSWORD -c "deltree smbclient_tar"

	# Build the test data
	if ! create_test_data "$PREFIX/tarmode"; then
		echo "Test data creation failed"
		false
		return
	fi

	# Create tarfile to extract on client
	if ! tar -cf "$PREFIX/tarmode.tar" -C "$PREFIX" smbclient_tar; then
		echo "Couldn't create tar archive"
		false
		return
	fi

	# Extract tarfile with smbclient
	if ! $SMBCLIENT //$SERVER/tarmode $CONFIGURATION -U$USERNAME%$PASSWORD -I $SERVER_IP -p 139 \
		$ADDARGS -c "tarmode full" -Tx "$PREFIX/tarmode.tar"; then
		echo "Couldn't extract tar file with tarmode -Tx"
		false
		return
	fi

	# Verify data
	if ! validate_data "$PREFIX/smbclient_tar" "$LOCAL_PATH"; then
		echo "Data not equivalent"
		false
		return
	fi

	# Clear temp data
	rm -rf -- "$PREFIX"/tarmode >/dev/null 2>&1
	rm -f "$PREFIX"/tarmode.tar >/dev/null 2>&1
	$SMBCLIENT //$SERVER/tarmode $CONFIGURATION -U$USERNAME%$PASSWORD -c "deltree smbclient_tar"
	# Cleanup the verification data created by test_tarmode_creation().
	rm -rf "$PREFIX"/smbclient_tar >/dev/null 2>&1
	true
	return

}

testit "test_tarmode_creation" \
	test_tarmode_creation || FAILCOUNT=$(expr $FAILCOUNT + 1)

testit "test_tarmode_extraction" \
	test_tarmode_extraction || FAILCOUNT=$(expr $FAILCOUNT + 1)

testok $0 $FAILCOUNT
