#!/bin/sh
# PCP QA Test No. 934
# Check mkdir_and_chown() from rc-proc
#
# Copyright (c) 2017 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

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

# for mkdir_and_chown()
#
_filter()
{
    sed \
	-e "s/\`/'/g" \
	-e '/^mkdir: foo/{
s/: foo/: cannot create directory "foo/
s/bar:/bar":/
s/"/'"'"'/g
}' \
	-e '/^chown: foo/{
s/: foo/: changing ownership of "foo"/
s/"/'"'"'/g
}' \
    # end
}


_report()
{
    # ./: lines are there for Linux, not for ls(1) on other platforms
    # like Mac OS X
    #
    ls -lR | $PCP_AWK_PROG '
NF < 4		{ print; next }
$3 != "'"$PCP_USER"'" || $4 != "'"$PCP_GROUP"'"	{ print "mode=" $1 " name=" $NF; next }
		{ print "mode= " $1 " user=pcp group=pcp name=" $NF }' \
    | sed \
	-e '/^\.:$/d' \
	-e '/^total /d' \
	-e 's/\. user=/ user=/' \
	-e 's/\. name=/ name=/' \
    # end
}

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

. $PCP_SHARE_DIR/lib/rc-proc.sh
mkdir $tmp
cd $tmp

# let the scripts under test set all of the owner and group mode bits
# and pick something sane for other ...
#
umask 2

# for error messages from mkdir(1) ...
#
export LANG=POSIX

# real QA test starts here
echo "Absolute path ... no chown"
mkdir_and_chown $tmp/foo/bar/foobar 755
echo return status=$?
_report
$sudo rm -rf foo

echo
echo "Absolute path ... with chown"
$sudo sh -c ". $PCP_SHARE_DIR/lib/rc-proc.sh; mkdir_and_chown $tmp/foo/bar/foobar 775 $PCP_USER:$PCP_GROUP"
echo return status=$?
_report
$sudo rm -rf foo

echo "Relative path ... no chown"
mkdir_and_chown foo/bar/foobar 755
echo return status=$?
_report
$sudo rm -rf foo

echo
echo "Relative path ... with chown"
$sudo sh -c ". $PCP_SHARE_DIR/lib/rc-proc.sh; mkdir_and_chown foo/bar/foobar 775 $PCP_USER:$PCP_GROUP"
echo return status=$?
_report
$sudo rm -rf foo

echo "Relative ./path, one level already exists ... no chown"
mkdir foo
mkdir_and_chown foo/bar/foobar 775
echo return status=$?
_report
$sudo rm -rf foo

echo
echo "Relative ./path, two levels already exist ... with chown"
mkdir -p foo/bar
$sudo sh -c ". $PCP_SHARE_DIR/lib/rc-proc.sh; mkdir_and_chown foo/bar/foobar 755 $PCP_USER:$PCP_GROUP"
echo return status=$?
_report
$sudo rm -rf foo

echo
echo "Error cases ..."

echo
echo "Permissions for mkdir ..."
mkdir foo
chmod 555 foo
mkdir_and_chown foo/bar/foobar 755 >$tmp.out 2>&1
sts=$?
_filter <$tmp.out
echo return status=$sts
_report
chmod 777 foo
$sudo rm -rf foo

echo
echo "Not root for chown ..."
mkdir_and_chown foo/bar/foobar 755 $PCP_USER:$PCP_GROUP >$tmp.out 2>&1
sts=$?
_filter <$tmp.out
echo return status=$sts
_report
$sudo rm -rf foo

echo
echo "Middle level path component exists and is not a directory ..."
mkdir foo
touch foo/bar
chmod 644 foo/bar
mkdir_and_chown foo/bar/foobar $PCP_USER:$PCP_GROUP 755 >$tmp.out 2>&1
sts=$?
_filter <$tmp.out
echo return status=$sts
_report
$sudo rm -rf foo

echo
echo "Target path exists and is not a directory ..."
mkdir -p foo/bar
touch foo/bar/foobar
mkdir_and_chown foo/bar/foobar $PCP_USER:$PCP_GROUP 755 >$tmp.out 2>&1
sts=$?
_filter <$tmp.out
echo return status=$sts
_report
$sudo rm -rf foo

# success, all done
status=0
exit
