#!/bin/sh
################################################################################
##                                                                            ##
## Copyright (c) International Business Machines  Corp., 2001                 ##
## Author:       Manoj Iyer, manjo@mail.utexas.edu                            ##
##                                                                            ##
## 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           ##
##                                                                            ##
################################################################################
#
# Description:  Test basic functionality of mv command
#		- Test #1:  mv <dir1> <dir2>
#		  move dir1 to dir2 and all its contents.
#		- Test #2:  mv -b <file1> <file2>
#		  move file1 to file2 and backup the file2.
#

TCID=mv01
TST_TOTAL=2
. test.sh

setup()
{
	tst_check_cmds mv

	tst_tmpdir

	tst_resm TINFO "INIT: Inititalizing tests."

	ROD_SILENT mkdir -p tst_mv.old
}

cleanup()
{
	tst_rmdir
}

creat_dirnfiles()
{
	local numdirs=$2
	local numfiles=$3
	local dirname=$4
	local dircnt=0
	local fcnt=0

	tst_resm TINFO "Test #$1: Creating $numdirs directories."
	tst_resm TINFO "Test #$1: filling each dir with $numfiles files."
	while [ $dircnt -lt $numdirs ]
	do
		dirname=$dirname/d.$dircnt
		ROD_SILENT mkdir -p $dirname

		fcnt=0
		while [ $fcnt -lt $numfiles ]
		do
			ROD_SILENT touch $dirname/f.$fcnt
			fcnt=$(($fcnt+1))
		done
		dircnt=$(($dircnt+1))
	done
}

creat_expout()
{
	local numdir=$1
	local numfile=$2
	local dirname=$3
	local dircnt=0
	local fcnt=0

	echo "$dirname:"  1>>tst_mv.exp
	echo "d.$dircnt"  1>>tst_mv.exp
	while [ $dircnt -lt $numdirs ]
	do
		dirname=$dirname/d.$dircnt
		dircnt=$(($dircnt+1))
		echo "$dirname:"  1>>tst_mv.exp
		if [ $dircnt -lt $numdirs ]; then
			echo "d.$dircnt" 1>>tst_mv.exp
		fi

		fcnt=0
		while [ $fcnt -lt $numfiles ]
		do
			echo "f.$fcnt " 1>>tst_mv.exp
			fcnt=$(($fcnt+1))
		done
		printf "\n\n" 1>>tst_mv.exp
	done
}

test01()
{
	numdirs=10
	numfiles=10
	dircnt=0
	fcnt=0

	tst_resm TINFO "Test #1: mv <dir1> <dir2> will move dir1 to dir2 and" \
		       "all its contents"

	creat_dirnfiles 1 $numdirs $numfiles tst_mv.old

	mv tst_mv.old tst_mv.new > tst_mv.err 2>&1
	if [ $? -ne 0 ]; then
		cat tst_mv.err
		tst_brkm TFAIL "Test #1: 'mv tst_mv.old tst_mv.new' failed"
	fi

	tst_resm TINFO "Test #1: creating output file"
	ls -R tst_mv.new > tst_mv.out 2>&1

	tst_resm TINFO "Test #1: creating expected output file"
	creat_expout $numdirs $numfiles tst_mv.new

	tst_resm TINFO "Test #1: comparing expected out and actual output file"
	diff -w -B -q tst_mv.out tst_mv.exp > tst_mv.err 2>&1
	if [ $? -ne 0 ]; then
		cat tst_mv.err
		tst_resm TFAIL "Test #1: mv failed."
	else
		tst_resm TINFO "Test #1: expected same as actual"
		if [ -f tst_mv.old ]; then
			tst_resm TFAIL "Test #1: mv did not delete old" \
				       "directory"
		else
			tst_resm TPASS "Test #1: mv success"
		fi
	fi
}

test02()
{
	tst_resm TINFO "Test #2: mv -b <file1> <file2> will move dir1 to dir2"

	ROD_SILENT touch tmpfile1 tmpfile2

	MD5_old=$(md5sum tmpfile2 | awk '{print $1}')
	if [ $? -ne 0 ]; then
		tst_brkm TBROK "Test #2: can't get the MD5 message of file2."
	fi

	if [ -f "tmpfile2~" ]; then
		tst_brkm TBROK "Test #2: file tmpfile2~ should not exists."
	fi

	mv -b tmpfile1 tmpfile2
	if [ $? -ne 0 ]; then
		tst_brkm TBROK "Test #2: 'mv -b tmpfile1 tmpfile2' failed."
	fi

	# if 'mv -b file1 file2' succeed, there will be "tmpfile2~" file.

	MD5_backup=$(md5sum tmpfile2 | awk '{print $1}')
	if [ $? -ne 0 ]; then
		tst_brkm TBROK "Test #2: can not get the MD5 message of" \
			       "backup file2."
	fi

	if [ "$MD5_old" == "$MD5_backup" -a -f "tmpfile2~" ]; then
		tst_resm TPASS "Test #2: mv -b success"
	else
		tst_resm TFAIL "Test #2: mv -b failed"
	fi
}

setup
TST_CLEANUP=cleanup

test01
test02

tst_exit
