#!/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.
#

# Run the federation tests.

source ./test_env.sh
#set -x
trap stop_brokers INT TERM QUIT

if [ -f ../.libs/xml.so ] ; then
    MODULES="--load-module xml" # Load the XML exchange and run XML exchange federation tests
    SKIPTESTS=
else
    MODULES="--no-module-dir"
    SKIPTESTS='-i *_xml'    # note: single quotes prevent expansion of *
fi

QPIDD_CMD="../qpidd --daemon --port 0 --no-data-dir $MODULES --auth no --log-enable=info+ --log-enable=debug+:Bridge --log-to-file"
start_brokers() {
    rm -f fed_local.log fed_remote.log fed_b1.log fed_b2.log
    LOCAL_PORT=$($QPIDD_CMD fed_local.log --federation-tag LOCAL)
    REMOTE_PORT=$($QPIDD_CMD fed_remote.log --federation-tag REMOTE)
    REMOTE_B1=$($QPIDD_CMD fed_b1.log --federation-tag B1)
    REMOTE_B2=$($QPIDD_CMD fed_b2.log --federation-tag B2)
}

stop_brokers() {
        $QPIDD_EXEC $MODULES -q --port $LOCAL_PORT
        $QPIDD_EXEC $MODULES -q --port $REMOTE_PORT
        $QPIDD_EXEC $MODULES -q --port $REMOTE_B1
        $QPIDD_EXEC $MODULES -q --port $REMOTE_B2
}

if test -d ${PYTHON_DIR} ;  then
    start_brokers
    echo "Running federation tests using brokers on ports $LOCAL_PORT $REMOTE_PORT $REMOTE_B1 $REMOTE_B2"
    $QPID_PYTHON_TEST -m federation ${SKIPTESTS} -b localhost:$LOCAL_PORT -Dremote-port=$REMOTE_PORT -Dextra-brokers="$REMOTE_B1 $REMOTE_B2" $@
    RETCODE=$?
    stop_brokers
    if test x$RETCODE != x0; then
        echo "FAIL federation tests"; exit 1;
    fi
fi
