#!/bin/sh
# PCP QA Test No. 630
# exercise _save_prev_file() from utilproc.sh
#
# Copyright (c) 2018 Ken McDonell.  All Rights Reserved.
#

seq=`basename $0`
echo "QA output created by $seq"

# get standard environment, filters and checks
. ./common.product
. ./common.filter
. ./common.check

. $PCP_SHARE_DIR/lib/utilproc.sh

_cleanup()
{
    cd $here
    $sudo rm -rf $tmp $tmp.*
}

status=1	# failure is the default!
trap "_cleanup; exit \$status" 0 1 2 3 15
mkdir $tmp
cd $tmp

me=`id -un`

_do_it()
{
    _save_prev_file target >$tmp.out 2>&1
    _sts=$?
    sed <$tmp.out \
	-e '/^.[rwx-][rwx-][rwx-]/s/.*/<ls output>/' \
    # end
    if [ "$_sts" = 0 ]
    then
	echo "returns: pass"
    else
	echo "returns: fail"
    fi
    echo -n "files:"
    for file in *
    do
	if [ "$file" != "*" ]
	then
	    echo -n " $file"
	    owner=`ls -ld $file | $PCP_AWK_PROG '{print $3}'`
	    [ "$owner" != $me ] && echo " (owner $owner)"
	fi
    done
    echo
    [ -f target ] && ( echo -n "target: "; cat target )
    [ -f target.prev ] && ( echo -n "target.prev: "; cat target.prev )
}

# real QA test starts here
echo "=== target is a directory ==="
mkdir target
_do_it
rmdir target

echo
echo "=== target is a symlink ==="
touch there
ln -s there target
_do_it
rm -f target there

for mode in - rw r
do
    echo
    $sudo rm -f target target.prev
    case $mode
    in
	-)
	    echo "=== target does not exist, target.prev does not exist ==="
	    ;;
	rw)
	    echo "=== target is writeable, target.prev does not exist ==="
	    echo prior >target
	    chmod 644 target
	    ;;
	r)
	    echo "=== target is not writeable, target.prev does not exist ==="
	    echo prior >target
	    chmod 444 target
	    ;;
    esac
    _do_it
done

for mode in - rw r
do
    echo
    $sudo rm -f target target.prev
    echo "prior-prior" >target.prev
    chmod 644 target.prev
    case $mode
    in
	-)
	    echo "=== target does not exist, target.prev is writeable ==="
	    ;;
	rw)
	    echo "=== target is writeable, target.prev is writeable ==="
	    echo prior >target
	    chmod 644 target
	    ;;
	r)
	    echo "=== target is not writeable, target.prev is writeable ==="
	    echo prior >target
	    chmod 444 target
	    ;;
    esac
    _do_it
done

for mode in - rw r
do
    echo
    $sudo rm -f target target.prev
    echo "prior-prior" >target.prev
    chmod 444 target.prev
    case $mode
    in
	-)
	    echo "=== target does not exist, target.prev is writeable ==="
	    ;;
	rw)
	    echo "=== target is writeable, target.prev is writeable ==="
	    echo prior >target
	    chmod 644 target
	    ;;
	r)
	    echo "=== target is not writeable, target.prev is writeable ==="
	    echo prior >target
	    chmod 444 target
	    ;;
    esac
    _do_it
done

echo
echo "=== non-root owned target and root owned target.prev ==="
$sudo rm -f target target.prev
echo "prior" >target
echo "prior-prior" >target.prev
$sudo chown root target.prev
_do_it

echo
echo "=== root owned target and non-root owned target.prev ==="
$sudo rm -f target target.prev
echo "prior" >target
$sudo chown root target
echo "prior-prior" >target.prev
_do_it

echo
echo "=== root owned target and root owned target.prev ==="
$sudo rm -f target target.prev
echo "prior" >target
$sudo chown root target
echo "prior-prior" >target.prev
$sudo chown root target.prev
_do_it

# success, all done
status=0
exit
