#!/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 a simple test over IPv6
source ./test_env.sh

CONFIG=$(dirname $0)/config.null
TEST_HOSTNAME=::1
COUNT=10

trap cleanup EXIT

error() { echo $*; exit 1; }

# Don't need --no-module-dir or --no-data-dir as they are set as env vars in test_env.sh
COMMON_OPTS="--daemon --auth no --config $CONFIG"

# Record all broker ports started
unset PORTS
declare -a PORTS

# Start new brokers:
#   $1 must be integer
#   $2 = extra opts
# Append used ports to PORTS variable
start_brokers() {
    local -a ports
    for (( i=0; $i<$1; i++)) do
        ports[$i]=$($QPIDD_EXEC --port 0 $COMMON_OPTS $2)
    done
    PORTS=( ${PORTS[@]} ${ports[@]} )
}

stop_brokers() {
    for port in "${PORTS[@]}";
    do
        $QPIDD_EXEC -qp $port
    done
    PORTS=()
}

cleanup() {
    stop_brokers
}

start_brokers 1
PORT=${PORTS[0]}
echo "Started IPv6 smoke perftest on broker port $PORT"

## Test connection via connection settings
./qpid-perftest --count ${COUNT} --port ${PORT} -b $TEST_HOSTNAME --summary

## Test connection with a URL
URL="amqp:[$TEST_HOSTNAME]:$PORT"

./qpid-send -b $URL --content-string=hello -a "foo;{create:always}"
MSG=`./qpid-receive -b $URL -a "foo;{create:always}" --messages 1`
test "$MSG" = "hello" || { echo "receive failed '$MSG' != 'hello'"; exit 1; }

stop_brokers

# Federation smoke test follows

# Start 2 brokers

# In a distribution, the python tools will be absent.
if [ ! -f $QPID_CONFIG_EXEC ] || [ ! -f $QPID_ROUTE_EXEC ] ; then
    echo "python tools absent - skipping federation test."
else

    start_brokers 2
    echo "Started Federated brokers on ports ${PORTS[*]}"
    # Make broker urls
    BROKER0="[::1]:${PORTS[0]}"
    BROKER1="[::1]:${PORTS[1]}"
    TEST_QUEUE=ipv6-fed-test

    $QPID_CONFIG_EXEC -b $BROKER0 add queue $TEST_QUEUE
    $QPID_CONFIG_EXEC -b $BROKER1 add queue $TEST_QUEUE
    $QPID_ROUTE_EXEC dynamic add $BROKER1 $BROKER0 amq.direct
    $QPID_CONFIG_EXEC -b $BROKER1 bind amq.direct $TEST_QUEUE $TEST_QUEUE
    $QPID_ROUTE_EXEC route map $BROKER1

    ./datagen --count 100 | tee rdata-in |
        ./qpid-send -b amqp:$BROKER0 -a amq.direct/$TEST_QUEUE --content-stdin
    ./qpid-receive -b amqp:$BROKER1 -a $TEST_QUEUE --print-content yes -m 0 > rdata-out

    cmp rdata-in rdata-out || { echo "Federated data over IPv6 does not compare"; exit 1; }

    stop_brokers
    rm rdata-in rdata-out
fi

# Cluster smoke test follows
test -z $CLUSTER_LIB && exit 0	# Exit if cluster not supported.

## Test failover in a cluster using IPv6 only
. $srcdir/ais_check		# Will exit if clustering not enabled.

pick_port() {
    # We need a fixed port to set --cluster-url. Use qpidd to pick a free port.
    # Note this method is racy
    PICK=$($QPIDD_EXEC -dp0)
    $QPIDD_EXEC -qp $PICK
    echo $PICK
}

ssl_cluster_broker() {		# $1 = port
    $QPIDD_EXEC $COMMON_OPTS --load-module  $CLUSTER_LIB --cluster-name ipv6_test.$HOSTNAME.$$ --cluster-url amqp:[$TEST_HOSTNAME]:$1 --port $1
    # Wait for broker to be ready
    ./qpid-ping -b $TEST_HOSTNAME -qp $1 || { echo "Cannot connect to broker on $1"; exit 1; }
    echo "Running IPv6 cluster broker on port $1"
}

PORT1=`pick_port`; ssl_cluster_broker $PORT1
PORT2=`pick_port`; ssl_cluster_broker $PORT2

# Pipe receive output to uniq to remove duplicates
./qpid-receive --connection-options "{reconnect:true, reconnect-timeout:5}" --failover-updates -b amqp:[$TEST_HOSTNAME]:$PORT1 -a "foo;{create:always}" -f | uniq > ssl_test_receive.tmp &

./qpid-send -b amqp:[$TEST_HOSTNAME]:$PORT2 --content-string=one -a "foo;{create:always}"

$QPIDD_EXEC -qp $PORT1 # Kill broker 1 receiver should fail-over.
./qpid-send -b amqp:[$TEST_HOSTNAME]:$PORT2 --content-string=two -a "foo;{create:always}" --send-eos 1
wait				# Wait for qpid-receive
{ echo one; echo two; } > ssl_test_receive.cmp
diff  ssl_test_receive.tmp ssl_test_receive.cmp || { echo "Failover failed"; exit 1; }

$QPIDD_EXEC -qp $PORT2

rm -f ssl_test_receive.*

