diff options
Diffstat (limited to 'trunk/qpid/cpp/src/tests/federated_cluster_test')
-rwxr-xr-x | trunk/qpid/cpp/src/tests/federated_cluster_test | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/trunk/qpid/cpp/src/tests/federated_cluster_test b/trunk/qpid/cpp/src/tests/federated_cluster_test new file mode 100755 index 0000000000..70bec5e703 --- /dev/null +++ b/trunk/qpid/cpp/src/tests/federated_cluster_test @@ -0,0 +1,152 @@ +#!/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 |