#!/bin/sh # # 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. # # Test reliability of the replication feature in the face of link # failures: srcdir=`dirname $0` source ./test_env.sh trap stop_brokers EXIT fail() { echo $1 exit 1 } stop_brokers() { if [[ $BROKER_A ]] ; then ../qpidd --no-module-dir -q --port $BROKER_A unset BROKER_A fi if [[ $NODE_1 ]] ; then ../qpidd --no-module-dir -q --port $NODE_1 unset NODE_1 fi if [[ $NODE_2 ]] ; then ../qpidd --no-module-dir -q --port $NODE_2 unset NODE_2 fi if [ -f cluster.ports ]; then rm cluster.ports fi } start_brokers() { #start single node... BROKER_A=`../qpidd --daemon --port 0 --no-data-dir --no-module-dir --auth no --log-enable info+` || fail "BROKER_A failed to start" #...and start cluster $srcdir/start_cluster 2 || fail "Could not start cluster" NODE_1=$(head -1 cluster.ports) NODE_2=$(tail -1 cluster.ports) test -n "$NODE_1" || fail "NODE_1 failed to start" test -n "$NODE_2" || fail "NODE_2 failed to start" } setup() { #create exchange on both cluster and single broker $PYTHON_COMMANDS/qpid-config -a "localhost:$BROKER_A" add exchange direct test-exchange $PYTHON_COMMANDS/qpid-config -a "localhost:$NODE_1" add exchange direct test-exchange #create dynamic routes for test exchange $PYTHON_COMMANDS/qpid-route dynamic add "localhost:$NODE_2" "localhost:$BROKER_A" test-exchange $PYTHON_COMMANDS/qpid-route dynamic add "localhost:$BROKER_A" "localhost:$NODE_2" test-exchange #create test queue on cluster and bind it to the test exchange $PYTHON_COMMANDS/qpid-config -a "localhost:$NODE_1" add queue test-queue $PYTHON_COMMANDS/qpid-config -a "localhost:$NODE_1" bind test-exchange test-queue to-cluster #create test queue on single broker and bind it to the test exchange $PYTHON_COMMANDS/qpid-config -a "localhost:$BROKER_A" add queue test-queue $PYTHON_COMMANDS/qpid-config -a "localhost:$BROKER_A" bind test-exchange test-queue from-cluster } run_test_pull_to_cluster_two_consumers() { #start consumers on each of the two nodes of the cluster ./receiver --port $NODE_1 --queue test-queue --credit-window 1 > fed1.out.tmp & ./receiver --port $NODE_2 --queue test-queue --credit-window 1 > fed2.out.tmp & #send stream of messages to test exchange on single broker for i in `seq 1 1000`; do echo Message $i >> fed.in.tmp; done ./sender --port $BROKER_A --exchange test-exchange --routing-key to-cluster --send-eos 2 < fed.in.tmp #combine output of the two consumers, sort it and compare with the expected stream wait sort -g -k 2 fed1.out.tmp fed2.out.tmp > fed.out.tmp diff fed.in.tmp fed.out.tmp || fail "federated link to cluster failed: expectations not met!" rm -f fed*.tmp #cleanup } run_test_pull_to_cluster() { #send stream of messages to test exchange on single broker for i in `seq 1 1000`; do echo Message $i >> fed.in.tmp; done ./sender --port $BROKER_A --exchange test-exchange --routing-key to-cluster --send-eos 1 < fed.in.tmp #consume from remaining node of the cluster ./receiver --port $NODE_2 --queue test-queue > fed.out.tmp #verify all messages are received diff fed.in.tmp fed.out.tmp || fail "federated link to cluster failed: expectations not met!" rm -f fed*.tmp #cleanup } run_test_pull_from_cluster() { #start consumer on single broker ./receiver --port $BROKER_A --queue test-queue --credit-window 1 > fed.out.tmp & #send stream of messages to test exchange on cluster for i in `seq 1 1000`; do echo Message $i >> fed.in.tmp; done ./sender --port $NODE_2 --exchange test-exchange --routing-key from-cluster --send-eos 1 < fed.in.tmp #verify all messages are received wait diff fed.in.tmp fed.out.tmp || fail "federated link from cluster failed: expectations not met!" rm -f fed*.tmp #cleanup } if test -d ${PYTHON_DIR}; then . $srcdir/ais_check rm -f fed*.tmp #cleanup any files left from previous run start_brokers echo "brokers started" setup echo "setup completed" run_test_pull_to_cluster_two_consumers echo "federated link to cluster verified" run_test_pull_from_cluster echo "federated link from cluster verified" if [[ $TEST_NODE_FAILURE ]] ; then #kill first cluster node and retest kill -9 $(../qpidd --check --port $NODE_1) && unset NODE_1 echo "killed first cluster node; waiting for links to re-establish themselves..." sleep 5 echo "retesting..." run_test_pull_to_cluster echo "federated link to cluster verified" run_test_pull_from_cluster echo "federated link from cluster verified" fi fi