#!/bin/bash

#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
# 
#   http://www.apache.org/licenses/LICENSE-2.0
# 
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
#

export LC_ALL=C

# Driver script to verify installed examples (also used for build tests.)
#
# Usage: verify example_dir [ example_dir ...]
# Where each example_dir must contain a verify sub-script to include.
#
# If $QPIDD is set, run a private QPIDD and use it.
# If $QPID_HOST or $QPID_PORT are set, use them to connect.
#

QPID_NO_MODULE_DIR=1
QPID_DATA_DIR=

# Use temporary directory if $HOME does not exist
if [ ! -e "$HOME" ]; then
    QPID_DATA_DIR=/tmp/qpid
    QPID_PID_DIR=/tmp/qpid
fi

export QPID_DATA_DIR QPID_NO_MODULE_DIR QPID_PID_DIR

cleanup() {
    test -n "$QPIDD" &&  $QPIDD -q # Private broker
    kill %% > /dev/null 2>&1	# Leftover background jobs
}

trap cleanup EXIT

ARGS="${QPID_HOST:-localhost} $QPID_PORT"

outfile() {
    file=$1
    while [ -f $file.out ]; do file="${file}X"; done
    echo $file.out
 }

fail() { test -n "$*" && echo $* 1>&2 ; FAIL=1; return 1; }

client() { "$@" $ARGS > `outfile $*` || fail; }

clients() { for cmd in "$@"; do client $cmd; done; }

waitfor() { until grep -a -l "$2" $1 >/dev/null 2>&1 ; do sleep 1 ; done ; } 

background() {
    pattern=$1; shift
    out=`outfile $*`
    eval "$* $ARGS > $out &" || { fail; return 1; }
    waitfor $out "$pattern"
}

name() {
    for x in $*; do name="$name `basename $x`"; done
    echo $name;
}

outputs() {
    wait 2> /dev/null		# Wait for all backgroud processes to complete
    rm -f $script.out
    for f in "$@"; do
	{ echo "==== `name $f`"; eval "cat $f"; } >> $script.out || fail
    done
}

normalize() { echo `cd $1 && pwd`; }

verify() {
    FAIL=
    arg=$1
    srcdir=$(normalize $2)
    builddir=$(normalize $3)
    if [ -d $arg ]; then dir=$(normalize $arg); script=verify;
    else dir=$(normalize `dirname $arg`); script=`basename $arg`; fi

    # if the example is in the "cpp" area, make sure we run from the build directory, not the source dir.
    rundir=${dir/$srcdir\/cpp/$builddir/}
    cd $rundir || return 1
    rm -f *.out
    { source $dir/$script && diff -ac $script.out $dir/$script.in ; } || fail
    test -z "$FAIL" && rm -f *.out
    return $FAIL
}

HEX="[a-fA-F0-9]"
remove_uuid() {
    sed "s/$HEX\{8\}-$HEX\{4\}-$HEX\{4\}-$HEX\{4\}-$HEX\{12\}//g" $*
}
remove_uuid64() {
    sed 's/[-A-Za-z0-9_]\{22\}==//g' $*
}

# Start private broker if QPIDD is set.
if [ -n "$QPIDD" ] ; then
    export QPID_PORT=`$QPIDD -dp0` || { echo "Cannot start $QPIDD" ; exit 1; }
    trap "$QPIDD -q" EXIT
fi

topsrcdir=$1
topbuilddir=$2
shift 2

for example in "$@"; do
    echo "== $example"
    if ( verify $example $topsrcdir $topbuilddir; ) then echo "PASS";  else echo "FAIL"; RET=1; fi
     done
exit $RET
