#!/bin/sh
#
# Copyright (c) International Business Machines  Corp., 2000
#  06/01 Robbie Williamson (robbiew@us.ibm.com)
# 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
#
#-----------------------------------------------------------------------
#
# This is a basic ar command test.
#
AR="${AR:=ar}"
TST_CNT=17
TST_TESTFUNC=test
TST_NEEDS_TMPDIR=1
TST_NEEDS_CMDS="$AR"

. tst_test.sh

test1()
{
	ROD ar -cr lib.a $TST_DATAROOT/file1.in $TST_DATAROOT/file3.in
	ROD ar -ra file1.in lib.a $TST_DATAROOT/file2.in
	ROD ar -t lib.a \> ar.out

	printf "file1.in\nfile2.in\nfile3.in\n" > ar.exp

	if diff ar.out ar.exp >/dev/null; then
		tst_res TPASS "ar added new file after another (-a)"
	else
		tst_res TFAIL "ar failed to add new file after another (-a)"
		cat ar.out
	fi

	ROD rm lib.a
}

test2()
{
	ROD ar -cr lib.a $TST_DATAROOT/file1.in $TST_DATAROOT/file2.in \
		         $TST_DATAROOT/file3.in $TST_DATAROOT/file4.in
	ROD ar -ma file1.in lib.a file4.in
	ROD ar -t lib.a \> ar.out

	printf "file1.in\nfile4.in\nfile2.in\nfile3.in\n" > ar.exp

	if diff ar.out ar.exp > /dev/null; then
		tst_res TPASS "ar moved file correctly (-ma)"
	else
		tst_res TFAIL "ar failed to move file (-ma)"
		cat ar.out
	fi

	ROD rm lib.a
}

test3()
{
	ROD ar -cr lib.a $TST_DATAROOT/file1.in $TST_DATAROOT/file3.in
	ROD ar -rb file3.in lib.a $TST_DATAROOT/file2.in
	ROD ar -t lib.a \> ar.out

	printf "file1.in\nfile2.in\nfile3.in\n" > ar.exp

	if diff ar.out ar.exp; then
		tst_res TPASS "ar added new file before another (-b)"
	else
		tst_res TFAIL "ar failed to add new file before another (-b)"
		cat ar.out
	fi

	ROD rm lib.a
}

test4()
{
	ROD ar -cr lib.a $TST_DATAROOT/file1.in $TST_DATAROOT/file3.in \
	                 $TST_DATAROOT/file2.in
	ROD ar -mb file3.in lib.a file2.in
	ROD ar -t lib.a \> ar.out

	printf "file1.in\nfile2.in\nfile3.in\n" > ar.exp

	if diff ar.out ar.exp > /dev/null; then
		tst_res TPASS "ar moved file correctly (-mb)"
	else
		tst_res TFAIL "ar failed to move file (-mb)"
		cat ar.out
	fi

	ROD rm lib.a
}

test5()
{
	ROD ar -cr lib.a $TST_DATAROOT/file1.in \> ar.out

	if [ -s ar.out ]; then
		tst_res TFAIL "ar produced output unexpectedly (-c)"
		cat ar.out
	else
		tst_res TPASS "ar haven't produced output (-c)"
	fi

	ROD rm lib.a
}

test6()
{
	ROD ar -qc lib.a $TST_DATAROOT/file1.in \> ar.out

	if [ -s ar.out ]; then
		tst_res TFAIL "ar produced output unexpectedly (-qc)"
		cat ar.out
	else
		tst_res TPASS "ar haven't produced output (-qc)"
	fi

	ROD rm lib.a
}

test7()
{
	ROD ar -cr lib.a $TST_DATAROOT/file1.in $TST_DATAROOT/file2.in \
	                 $TST_DATAROOT/file3.in
	ROD ar -d lib.a file1.in file2.in
	ROD ar -t lib.a \> ar.out

	printf "file3.in\n" > ar.exp

	if diff ar.out ar.exp > /dev/null; then
		tst_res TPASS "ar deleted files correctly (-d)"
	else
		tst_res TFAIL "ar messed up when deleting files (-d)"
		cat ar.out
	fi

	ROD rm lib.a
}

test8()
{
	ROD ar -cr lib.a $TST_DATAROOT/file1.in $TST_DATAROOT/file2.in \
	                 $TST_DATAROOT/file3.in
	ROD ar -d lib.a
	ROD ar -t lib.a \> ar.out

	printf "file1.in\nfile2.in\nfile3.in\n" > ar.exp

	if diff ar.out ar.exp > /dev/null; then
		tst_res TPASS "ar deleted nothing (-d with empty list)"
	else
		tst_res TFAIL "ar deleted files (-d with empty list)"
		cat ar.out
	fi

	ROD rm lib.a
}

test9()
{
	ROD ar -cr lib.a $TST_DATAROOT/file1.in $TST_DATAROOT/file3.in
	ROD ar -ri file3.in lib.a $TST_DATAROOT/file2.in
	ROD ar -t lib.a \> ar.out

	printf "file1.in\nfile2.in\nfile3.in\n" > ar.exp

	if diff ar.out ar.exp >/dev/null; then
		tst_res TPASS "ar added new file before another (-i)"
	else
		tst_res TFAIL "ar failed to add new file before another (-i"
		cat ar.out
	fi

	ROD rm lib.a
}

test10()
{
	ROD ar -cr lib.a $TST_DATAROOT/file1.in $TST_DATAROOT/file3.in \
	                 $TST_DATAROOT/file2.in
	ROD ar -mi file3.in lib.a file2.in
	ROD ar -t lib.a \> ar.out

	printf "file1.in\nfile2.in\nfile3.in\n" > ar.exp

	if diff ar.out ar.exp > /dev/null; then
		tst_res TPASS "ar moved file correctly (-mi)"
	else
		tst_res TFAIL "ar failed to move file (-mi)"
		cat ar.out
	fi

	ROD rm lib.a
}

test11()
{
	ROD ar -cr lib.a $TST_DATAROOT/file1.in $TST_DATAROOT/file3.in \
	                 $TST_DATAROOT/file2.in
	ROD ar -m lib.a file3.in
	ROD ar -t lib.a \> ar.out

	printf "file1.in\nfile2.in\nfile3.in\n" > ar.exp

	if diff ar.out ar.exp > /dev/null; then
		tst_res TPASS "ar moved file correctly (-m)"
	else
		tst_res TFAIL "ar failed to move file (-m)"
		cat ar.out
	fi

	ROD rm lib.a
}

test12()
{
	ROD ar -cr lib.a $TST_DATAROOT/file1.in $TST_DATAROOT/file2.in \
	                 $TST_DATAROOT/file3.in
	ROD ar -p lib.a \> ar.out

	printf "This is file one\nThis is file two\nThis is file three\n" > ar.exp

	if diff ar.out ar.exp > /dev/null; then
		tst_res TPASS "ar printed file content correctly (-p)"
	else
		tst_res TFAIL "ar failed to print file content (-p)"
		cat ar.out
	fi

	ROD rm lib.a
}

test13()
{

	ROD ar -cr lib.a $TST_DATAROOT/file1.in $TST_DATAROOT/file2.in \
	                 $TST_DATAROOT/file3.in
	ROD ar -q lib.a $TST_DATAROOT/file4.in
	ROD ar -t lib.a \> ar.out

	printf "file1.in\nfile2.in\nfile3.in\nfile4.in\n" > ar.exp

	if diff ar.out ar.exp > /dev/null; then
		tst_res TPASS "ar appended file correctly (-q)"
	else
		tst_res TFAIL "ar failed to append file (-q)"
		cat ar.out
	fi

	ROD rm lib.a
}

test14()
{
	ROD touch file0.in
	ROD ar -cr lib.a file0.in $TST_DATAROOT/file1.in

	file0_mtime1=$(ar -tv lib.a | grep file0.in)
	file1_mtime1=$(ar -tv lib.a | grep file1.in)

	touch -c -t $(date --date='next day' +"%Y%m%d%H%M") file0.in

	ROD ar -ru lib.a file0.in $TST_DATAROOT/file1.in

	file0_mtime2=$(ar -tv lib.a | grep file0.in)
	file1_mtime2=$(ar -tv lib.a | grep file1.in)

	if [ "$file0_mtime1" = "$file0_mtime2" ]; then
		tst_res TFAIL "ar haven't updated modified file0 (-u)"
	else
		tst_res TPASS "ar updated modified file0 (-u)"
	fi

	if [ "$file1_mtime1" = "$file1_mtime2" ]; then
		tst_res TPASS "ar haven't updated unmodified file1 (-u)"
	else
		tst_res TFAIL "ar updated unmodified file1 (-u)"
	fi

	ROD rm lib.a file0.in
}

test15()
{
	ROD ar -cr lib.a $TST_DATAROOT/file1.in
	ROD ar -tv lib.a \> ar.out

	if grep -q '[rwx-]\{9\} [0-9].*/[0-9].*\s*[0-9].*.*file1.in' ar.out; then
		tst_res TPASS "ar verbose listing works (-tv)"
	else
		tst_res TFAIL "ar verbose listing failed (-tv)"
		cat ar.out
	fi

	ROD rm lib.a
}

test16()
{
	ROD ar -cr lib.a $TST_DATAROOT/file1.in $TST_DATAROOT/file2.in \
	                 $TST_DATAROOT/file3.in
	ROD ar -xv lib.a \> ar.out

	printf "x - file1.in\nx - file2.in\nx - file3.in\n" > ar.exp

	if diff ar.out ar.exp > /dev/null; then
		tst_res TPASS "ar printed extracted filenames (-xv)"
	else
		tst_res TFAIL "ar failed to print extracted filenames (-xv)"
		cat ar.out
	fi

	if [ -e file1.in -a -e file2.in -a -e file3.in ]; then
		tst_res TPASS "ar extracted files correctly"
	else
		tst_res TFAIL "ar failed to extract files"
	fi

	ROD rm -f lib.a file1.in file2.in file3.in
}

test17()
{
	ROD ar -cr lib.a $TST_DATAROOT/file1.in $TST_DATAROOT/file2.in
	ROD ar -xv lib.a file2.in \> ar.out

	printf "x - file2.in\n" > ar.exp

	if diff ar.out ar.exp > /dev/null; then
		tst_res TPASS "ar printed extracted filename (-xv)"
	else
		tst_res TFAIL "ar failed to print extracted filename (-xv)"
		cat ar.out
	fi

	if [ -e file2.in ]; then
		tst_res TPASS "ar extracted file correctly"
	else
		tst_res TFAIL "ar failed to extract file"
	fi

	ROD rm -f lib.a file2.in
}

tst_run