#!/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 acl tests. $srcdir is set by the Makefile.
source ./test_env.sh
DATA_DIR=`pwd`/data_dir
DATA_DIRI=`pwd`/data_diri
DATA_DIRU=`pwd`/data_diru
DATA_DIRQ=`pwd`/data_dirq

trap stop_brokers INT TERM QUIT

start_brokers() {
    ../qpidd --daemon --port 0 --no-module-dir --data-dir $DATA_DIR --load-module $ACL_LIB --acl-file policy.acl --auth no                               --log-to-file local.log > qpidd.port
    LOCAL_PORT=`cat qpidd.port`
    ../qpidd --daemon --port 0 --no-module-dir --data-dir $DATA_DIRI --load-module $ACL_LIB --acl-file policy.acl --auth no --connection-limit-per-ip 2   --log-to-file locali.log > qpiddi.port
    LOCAL_PORTI=`cat qpiddi.port`
    ../qpidd --daemon --port 0 --no-module-dir --data-dir $DATA_DIRU --load-module $ACL_LIB --acl-file policy.acl --auth no --connection-limit-per-user 2 --log-to-file localu.log > qpiddu.port
    LOCAL_PORTU=`cat qpiddu.port`
    ../qpidd --daemon --port 0 --no-module-dir --data-dir $DATA_DIRQ --load-module $ACL_LIB --acl-file policy.acl --auth no --max-queues-per-user 2      --log-to-file localq.log > qpiddq.port
    LOCAL_PORTQ=`cat qpiddq.port`
}

stop_brokers() {
        $QPIDD_EXEC --no-module-dir -q --port $LOCAL_PORT
        $QPIDD_EXEC --no-module-dir -q --port $LOCAL_PORTI
        $QPIDD_EXEC --no-module-dir -q --port $LOCAL_PORTU
        $QPIDD_EXEC --no-module-dir -q --port $LOCAL_PORTQ
}

test_loading_acl_from_absolute_path(){
    POLICY_FILE=$srcdir/policy.acl
    rm -f temp.log
    PORT=`../qpidd --daemon --port 0 --no-module-dir --no-data-dir --auth no --load-module $ACL_LIB --acl-file $POLICY_FILE -t --log-to-file temp.log  2>/dev/null`
    ACL_FILE=`grep "notice ACL: Read file" temp.log | sed 's/^.*Read file //'`
   $QPIDD_EXEC --no-module-dir -q --port $PORT
   if test "$ACL_FILE" != "\"$POLICY_FILE\""; then
     echo "unable to load policy file from an absolute path";
     return 1;
   fi
   rm temp.log
}

if test -d ${PYTHON_DIR} ;  then
    rm -rf $DATA_DIR
    rm -rf $DATA_DIRI
    rm -rf $DATA_DIRU
    rm -rf $DATA_DIRQ
    mkdir -p $DATA_DIR
    mkdir -p $DATA_DIRI
    mkdir -p $DATA_DIRU
    mkdir -p $DATA_DIRQ
    cp $srcdir/policy.acl $DATA_DIR
    cp $srcdir/policy.acl $DATA_DIRI
    cp $srcdir/policy.acl $DATA_DIRU
    cp $srcdir/policy.acl $DATA_DIRQ
    start_brokers
    echo "Running acl tests using brokers on ports $LOCAL_PORT, $LOCAL_PORTI, $LOCAL_PORTU, and $LOCAL_PORTQ"
    $QPID_PYTHON_TEST -b localhost:$LOCAL_PORT -m acl -Dport-i=$LOCAL_PORTI -Dport-u=$LOCAL_PORTU -Dport-q=$LOCAL_PORTQ || EXITCODE=1
    stop_brokers || EXITCODE=1
    test_loading_acl_from_absolute_path || EXITCODE=1
    rm -rf $DATA_DIR
    rm -rf $DATA_DIRI
    rm -rf $DATA_DIRU
    rm -rf $DATA_DIRQ
    exit $EXITCODE
fi

