#!/bin/sh
################################################################################
##                                                                            ##
## Copyright (c) International Business Machines  Corp., 2001                 ##
##  Author: Manoj Iyer, manjo@mail.utexas.edu                                 ##
## Copyright (c) 2016 Cyril Hrubis <chrubis@suse.cz>                          ##
##                                                                            ##
## This program is free software;  you can redistribute it and#or modify      ##
## it under the terms of the GNU General Public License as published by       ##
## the Free Software Foundation; either version 2 of the License, or          ##
## (at your option) any later version.                                        ##
##                                                                            ##
## This program is distributed in the hope that it will be useful, but        ##
## WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY ##
## or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License   ##
## for more details.                                                          ##
##                                                                            ##
## You should have received a copy of the GNU General Public License          ##
## along with this program;  if not, write to the Free Software Foundation,   ##
## Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA           ##
##                                                                            ##
################################################################################
#
# Creates, lists and extracts an plain, gzip and bzip tar archive.
#

TST_CNT=6
TST_TESTFUNC=do_test
TST_NEEDS_TMPDIR=1
TST_NEEDS_CMDS="gzip bzip2"

. tst_test.sh

TAR_FILES="file1 file2 file3"

check_listing()
{
	local i
	local verbose=$1
	shift

	if [ -z "$verbose" ]; then
		if [ -s tar.out ]; then
			tst_res TFAIL "Tar produced unexpected output"
			cat tar.out
		else
			tst_res TPASS "Tar produced no output"
		fi

		return
	fi

	if [ $(wc -l < tar.out) != $# ]; then
		tst_res TFAIL "Unexpected number of lines in tar.out"
		cat tar.out
		return
	fi

	for i in $@; do
		if ! grep -q $i tar.out; then
			tst_res TFAIL "File $i missing in listing"
			return
		fi
	done

	tst_res TPASS "Listing in tar.out is correct"
}

check_content()
{
	local fname="$1"
	local verbose="$2"
	shift 2

	EXPECT_PASS tar t${verbose}f "$fname" \> tar.out
	check_listing v $@
}

check_files()
{
	for i in $@; do
		if ! [ -f $i ]; then
			tst_res TFAIL "Missing file $i in extracted archive"
			cat tar.out
			return
		fi
	done

	tst_res TPASS "Files were uncompressed correctly"
}

check_extraction()
{
	local fname="$1"
	local verbose="$2"
	shift 2

	EXPECT_PASS tar x${verbose}f $fname \> tar.out
	check_listing "${verbose}" $@
	check_files $@
	ROD rm $@
}

test_tar()
{
	local comp="$1"
	local verbose="$2"
	local fname="$3"
	local i

	# Create archive
	ROD touch $TAR_FILES
	EXPECT_PASS tar c${verbose}f$comp $fname $TAR_FILES \> tar.out
	check_listing "$verbose" $TAR_FILES

	# Diff filesystem against the archive, should be the same at this point
	EXPECT_PASS tar d${verbose}f $fname \> tar.out
	check_listing "$verbose" $TAR_FILES

	ROD rm $TAR_FILES

	# Check content listing
	check_content $fname "$verbose" $TAR_FILES

	# Check decompression
	check_extraction $fname "$verbose" $TAR_FILES

	# Append to an archive, only possible for uncompressed archive
	if [ -z "$comp" ]; then
		ROD touch file4
		EXPECT_PASS tar r${verbose}f $fname file4 \> tar.out
		check_listing "$verbose" file4
		check_content $fname "$verbose" $TAR_FILES file4
		ROD rm file4

		check_extraction $fname "$verbose" $TAR_FILES file4
	fi

	ROD rm $fname
}

do_test()
{
	case $1 in
	1) test_tar ""  "v" "test.tar";;
	2) test_tar "z" "v" "test.tar.gz";;
	3) test_tar "j" "v" "test.tar.bz2";;
	4) test_tar ""  ""  "test.tar";;
	5) test_tar "z" ""  "test.tar.gz";;
	6) test_tar "j" ""  "test.tar.bz2";;
	esac
}

tst_run