#! /bin/sh
# PCP QA Test No. 243
# Multiple PMCDs test
#
# Copyright (c) 1995-2002 Silicon Graphics, Inc.  All Rights Reserved.
#

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

# get standard filters
. ./common.product
. ./common.filter
. ./common.check

[ $PCP_PLATFORM = darwin ] && _notrun "Who knows what the darwin networking code is doing, don't bother with this test"

rm -f $seq.out
_get_libpcp_config
if $ipv6 ; then
    ln $seq.out.ipv6 $seq.out || exit 1
else
    ln $seq.out.nonipv6 $seq.out || exit 1
fi

_filter_info()
{
    sed -e '/PMNS file "DEFAULT" is unchanged/d'
}

_filter_err()
{
    _filter_pmcd_log \
    | _filter_info \
    | sed \
	-e 's/ __pmBind: / bind: /g' \
	-e 's/may already be running/is already running/g' \
	-e '/Log for pmcd/,/INADDR_ANY/c\
... boring stuff deleted' \
	-e '/ok FD 44321 ipv6 INADDR_ANY/d' \
	-e '/OpenRequestSocket.*unix.*bind: Address already in use/{
N
d
}' \
	-e 's/ INADDR_ANY/ 0x0/g' \
	-e "s@$tmp@TMP@g" \
	#end
}

signal=$PCP_BINADM_DIR/pmsignal
_needclean=true

mkdir $tmp
chmod ugo+rwx $tmp
cd $tmp

_cleanup()
{
    cd $here
    if $_needclean
    then
	_needclean=false
	$signal -s TERM $my_pmcd_pid
	pmsleep 1.5
	unset PMCD_SOCKET
	echo "Restart and ping pmcd ..."
	_service pmcd restart 2>&1 | _filter_pcp_restart
	_wait_for_pmcd
	_restore_auto_restart pmcd
	_service pmlogger restart 2>&1 | _filter_pcp_restart
	_wait_for_pmlogger
	pmprobe pmcd.control.debug
    fi
    rm -rf $tmp $tmp.*
}

status=1
trap "_cleanup; exit \$status" 0 1 2 3 15

_stop_auto_restart pmcd

# real QA test starts here
if ! _service pmlogger stop 2>&1; then _exit 1; fi \
| _filter_pcp_stop
_wait_pmlogger_end || _exit 1
if ! _service pmcd stop 2>&1; then _exit 1; fi \
| _filter_pcp_stop
_wait_pmcd_end || _exit 1

# Note: start pmcd with -f so that its PID stays the same (no daemon)
#
export PMCD_SOCKET=$tmp/pmcd.socket
$PCP_PMCD_PROG -f -x err1 &
my_pmcd_pid=$!

_wait_for_pmcd || _exit 1

echo "Checking for startup errors ..."
[ -f err1 ] && _filter_err <err1

# Save pmcd log file to date ...
#
# Although _wait_for_pmcd() returns and pmcd is alive, the log file
# may not have been created yet ... be a little patient
#
for i in 1 2 3 4 5 6 7 8 9 10
do
    [ -f pmcd.log ] && break
    pmsleep 0.2
done
if [ -f pmcd.log ]
then
    _filter_info < pmcd.log > pmcd.log1.$$
else
    echo "No pmcd.log, pmcd failed to start?"
    $PCP_PS_PROG $PCP_PS_ALL_FLAGS | grep -E '[P]PID|/[p]mcd( |$)'
    exit
fi

# Try to start another pmcd.  This should fail because the socket is
# already in use.
#
echo
echo "Trying to start another PMCD over the top of the first one."
echo "Expect \"bind:  Address already in use\"...:"
$PCP_PMCD_PROG -f -x err2 -l $tmp.log 2>&1 | _filter_err &

# EADDRINUSE errors now have 4x250 msec delay while we retry before giving
# up, and this happens once per socket type, so up to 3 times ... and then
# wait a little longer ...
pmsleep 3.5

ls -l err2 >>$seq_full 2>&1
echo "Checking for startup errors ..."
if [ -f err2 ]
then
    echo "+++ err for second pmcd +++" >>$seq_full
    cat err2 >>$seq_full 2>&1
    _filter_err <err2
fi
ls -l $tmp.log >>$seq_full 2>&1
echo "+++ log file for second pmcd +++" >>$seq_full
cat $tmp.log >>$seq_full 2>&1

# Make sure that there are no changes to the pmcd log file
#
echo "Checking that the original pmcd log hasn't changed ..."
_filter_info < pmcd.log > pmcd.log2.$$
if diff pmcd.log2.$$ pmcd.log1.$$
then
    status=0
else
    echo "+++ log file for first pmcd (1) +++" >>$seq_full
    cat pmcd.log2.$$ >>$seq_full
    echo "+++ log file for first pmcd (2) +++" >>$seq_full
    cat pmcd.log1.$$ >>$seq_full
fi
