diff options
Diffstat (limited to 'qpid/cpp/src/tests')
-rw-r--r-- | qpid/cpp/src/tests/ClusterMapTest.cpp | 74 | ||||
-rw-r--r-- | qpid/cpp/src/tests/DumpClientTest.cpp | 122 | ||||
-rw-r--r-- | qpid/cpp/src/tests/cluster.mk | 2 | ||||
-rw-r--r-- | qpid/cpp/src/tests/cluster_test.cpp | 90 |
4 files changed, 174 insertions, 114 deletions
diff --git a/qpid/cpp/src/tests/ClusterMapTest.cpp b/qpid/cpp/src/tests/ClusterMapTest.cpp index cce0efb69f..f8ac2e22e6 100644 --- a/qpid/cpp/src/tests/ClusterMapTest.cpp +++ b/qpid/cpp/src/tests/ClusterMapTest.cpp @@ -38,13 +38,13 @@ Url url(const char* host) { return Url(TcpAddress(host)); } QPID_AUTO_TEST_CASE(testNotice) { ClusterMap m; - BOOST_CHECK(!m.urlNotice(id(0), url("0-ready"))); // id(0) member, no dump. + m.ready(id(0), url("0-ready")); // id(0) member, no dump. BOOST_CHECK(m.isMember(id(0))); BOOST_CHECK_EQUAL(m.dumps(id(0)), 0); BOOST_CHECK_EQUAL(m.memberCount(), (unsigned)1); BOOST_CHECK_EQUAL(m.dumpeeCount(), (unsigned)0); - BOOST_CHECK_EQUAL(id(0), m.urlNotice(id(1), url("1-dump"))); // Newbie, needs dump + BOOST_CHECK_EQUAL(id(0), m.dumpRequest(id(1), url("1-dump"))); // Newbie, needs dump BOOST_CHECK(m.isMember(id(0))); BOOST_CHECK(m.isDumpee(id(1))); BOOST_CHECK_EQUAL(m.dumps(id(0)), 1); @@ -52,7 +52,7 @@ QPID_AUTO_TEST_CASE(testNotice) { BOOST_CHECK_EQUAL(m.memberCount(), (unsigned)1); BOOST_CHECK_EQUAL(m.dumpeeCount(), (unsigned)1); - BOOST_CHECK(!m.urlNotice(id(1), url("1-ready"))); // id(1) is ready. + m.ready(id(1), url("1-ready")); // id(1) is ready. BOOST_CHECK(m.isMember(id(0))); BOOST_CHECK(m.isMember(id(1))); BOOST_CHECK_EQUAL(m.dumps(id(0)), 0); @@ -60,25 +60,25 @@ QPID_AUTO_TEST_CASE(testNotice) { BOOST_CHECK_EQUAL(m.memberCount(), (unsigned)2); BOOST_CHECK_EQUAL(m.dumpeeCount(), (unsigned)0); - BOOST_CHECK_EQUAL(id(0), m.urlNotice(id(2), url("2-dump"))); // id(2) needs dump + BOOST_CHECK_EQUAL(id(0), m.dumpRequest(id(2), url("2-dump"))); // id(2) needs dump BOOST_CHECK(m.isDumpee(id(2))); BOOST_CHECK_EQUAL(m.dumps(id(0)), 1); BOOST_CHECK_EQUAL(m.dumpeeCount(), (unsigned)1); - BOOST_CHECK_EQUAL(id(1), m.urlNotice(id(3), url("3-dump"))); // 0 busy, dump to id(1). + BOOST_CHECK_EQUAL(id(1), m.dumpRequest(id(3), url("3-dump"))); // 0 busy, dump to id(1). BOOST_CHECK(m.isDumpee(id(3))); BOOST_CHECK_EQUAL(m.dumps(id(0)), 1); BOOST_CHECK_EQUAL(m.dumps(id(1)), 1); BOOST_CHECK_EQUAL(m.dumpeeCount(), (unsigned)2); - BOOST_CHECK_EQUAL(id(0), m.urlNotice(id(4), url("4-dump"))); // Equally busy, 0 is first on list. + BOOST_CHECK_EQUAL(id(0), m.dumpRequest(id(4), url("4-dump"))); // Equally busy, 0 is first on list. BOOST_CHECK_EQUAL(m.dumps(id(0)), 2); BOOST_CHECK_EQUAL(m.dumps(id(1)), 1); BOOST_CHECK_EQUAL(m.dumpeeCount(), (unsigned)3); // My dumpees both complete - BOOST_CHECK(!m.urlNotice(id(2), url("2-ready"))); - BOOST_CHECK(!m.urlNotice(id(4), url("4-ready"))); + m.ready(id(2), url("2-ready")); + m.ready(id(4), url("4-ready")); BOOST_CHECK(m.isMember(id(2))); BOOST_CHECK(m.isMember(id(4))); BOOST_CHECK_EQUAL(m.dumps(id(0)), 0); @@ -86,7 +86,7 @@ QPID_AUTO_TEST_CASE(testNotice) { BOOST_CHECK_EQUAL(m.dumpeeCount(), (unsigned)1); // Final dumpee completes. - BOOST_CHECK(!m.urlNotice(id(3), url("3-ready"))); + m.ready(id(3), url("3-ready")); BOOST_CHECK(m.isMember(id(3))); BOOST_CHECK_EQUAL(m.dumps(id(0)), 0); BOOST_CHECK_EQUAL(m.dumps(id(1)), 0); @@ -96,11 +96,11 @@ QPID_AUTO_TEST_CASE(testNotice) { QPID_AUTO_TEST_CASE(testLeave) { ClusterMap m; - BOOST_CHECK(!m.urlNotice(id(0), url("0-ready"))); - BOOST_CHECK_EQUAL(id(0), m.urlNotice(id(1), url("1-dump"))); - BOOST_CHECK(!m.urlNotice(id(1), url("1-ready"))); - BOOST_CHECK_EQUAL(id(0), m.urlNotice(id(2), url("2-dump"))); - BOOST_CHECK(!m.urlNotice(id(2), url("2-ready"))); + m.ready(id(0), url("0-ready")); + BOOST_CHECK_EQUAL(id(0), m.dumpRequest(id(1), url("1-dump"))); + m.ready(id(1), url("1-ready")); + BOOST_CHECK_EQUAL(id(0), m.dumpRequest(id(2), url("2-dump"))); + m.ready(id(2), url("2-ready")); BOOST_CHECK_EQUAL(m.memberCount(), (unsigned)3); BOOST_CHECK_EQUAL(m.dumpeeCount(), (unsigned)0); @@ -110,13 +110,13 @@ QPID_AUTO_TEST_CASE(testLeave) { BOOST_CHECK(m.isMember(id(0))); BOOST_CHECK(m.isMember(id(2))); - BOOST_CHECK_EQUAL(id(0), m.urlNotice(id(4), url("4-dump"))); + BOOST_CHECK_EQUAL(id(0), m.dumpRequest(id(4), url("4-dump"))); BOOST_CHECK_EQUAL(m.dumps(id(0)), 1); BOOST_CHECK(m.isDumpee(id(4))); BOOST_CHECK_EQUAL(m.memberCount(), (unsigned)2); BOOST_CHECK_EQUAL(m.dumpeeCount(), (unsigned)1); - m.dumpFailed(id(4)); // Dumper detected a failure. + m.dumpError(id(4)); // Dumper detected a failure. BOOST_CHECK_EQUAL(m.dumps(id(0)), 0); BOOST_CHECK(!m.isDumpee(id(4))); BOOST_CHECK(!m.isMember(id(4))); @@ -127,7 +127,7 @@ QPID_AUTO_TEST_CASE(testLeave) { BOOST_CHECK_EQUAL(m.memberCount(), (unsigned)2); BOOST_CHECK_EQUAL(m.dumpeeCount(), (unsigned)0); - BOOST_CHECK_EQUAL(id(0), m.urlNotice(id(5), url("5-dump"))); + BOOST_CHECK_EQUAL(id(0), m.dumpRequest(id(5), url("5-dump"))); BOOST_CHECK_EQUAL(m.dumps(id(0)), 1); BOOST_CHECK(m.isDumpee(id(5))); BOOST_CHECK_EQUAL(m.memberCount(), (unsigned)2); @@ -140,19 +140,19 @@ QPID_AUTO_TEST_CASE(testLeave) { BOOST_CHECK_EQUAL(m.memberCount(), (unsigned)2); BOOST_CHECK_EQUAL(m.dumpeeCount(), (unsigned)0); - m.dumpFailed(id(5)); // Dumper reports failure - no op, we already know. + m.dumpError(id(5)); // Dumper reports failure - no op, we already know. BOOST_CHECK_EQUAL(m.memberCount(), (unsigned)2); BOOST_CHECK_EQUAL(m.dumpeeCount(), (unsigned)0); } QPID_AUTO_TEST_CASE(testToControl) { ClusterMap m; - m.urlNotice(id(0), url("0")); - m.urlNotice(id(1), url("1dump")); - m.urlNotice(id(1), url("1")); - m.urlNotice(id(2), url("2dump")); - m.urlNotice(id(3), url("3dump")); - m.urlNotice(id(4), url("4dump")); + m.ready(id(0), url("0")); + m.dumpRequest(id(1), url("1dump")); + m.ready(id(1), url("1")); + m.dumpRequest(id(2), url("2dump")); + m.dumpRequest(id(3), url("3dump")); + m.dumpRequest(id(4), url("4dump")); BOOST_CHECK_EQUAL(m.memberCount(), (unsigned)2); BOOST_CHECK_EQUAL(m.dumpeeCount(), (unsigned)3); @@ -188,4 +188,30 @@ QPID_AUTO_TEST_CASE(testToControl) { BOOST_CHECK_EQUAL(s,s2); } +QPID_AUTO_TEST_CASE(testStall) { + ClusterMap m; + m.ready(id(0), url("0")); + BOOST_CHECK_EQUAL(m.memberCount(), 1); + BOOST_CHECK_EQUAL(m.dumpeeCount(), 0); + m.stall(); + + m.dumpRequest(id(1), url("1dump")); + m.ready(id(1), url("1")); + m.leave(id(0)); + m.dumpRequest(id(2), url("2dump")); + m.ready(id(2), url("2")); + m.dumpRequest(id(3), url("3dump")); + BOOST_CHECK_EQUAL(m.memberCount(), 1); + BOOST_CHECK_EQUAL(m.dumpeeCount(), 0); + + m.unstall(); + BOOST_CHECK_EQUAL(m.memberCount(), 2); + BOOST_CHECK_EQUAL(m.dumpeeCount(), 1); + BOOST_CHECK(!m.isMember(id(0))); + BOOST_CHECK(m.isMember(id(1))); + BOOST_CHECK(m.isMember(id(2))); + BOOST_CHECK(m.isDumpee(id(3))); +} + + QPID_AUTO_TEST_SUITE_END() diff --git a/qpid/cpp/src/tests/DumpClientTest.cpp b/qpid/cpp/src/tests/DumpClientTest.cpp new file mode 100644 index 0000000000..27c4174ffe --- /dev/null +++ b/qpid/cpp/src/tests/DumpClientTest.cpp @@ -0,0 +1,122 @@ +/* + * + * Copyright (c) 2006 The Apache Software Foundation + * + * Licensed 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. + * + */ + + +#include "unit_test.h" +#include "test_tools.h" +#include "BrokerFixture.h" +#include "qpid/cluster/DumpClient.h" +#include "qpid/framing/Buffer.h" +#include "qpid/framing/FieldTable.h" +#include "qpid/Url.h" +#include <boost/assign.hpp> + +QPID_AUTO_TEST_SUITE(DumpClientTest) + +using namespace std; +using namespace qpid; +using namespace framing; +using namespace client; +using namespace cluster; +using namespace sys; + +// Verify we can copy shared state - wiring + messages - from one +// broker to another via the DumpClient. +// +QPID_AUTO_TEST_CASE(testDumpClientSharedState) { + BrokerFixture donor, receiver; + { + Client c(donor.getPort()); + FieldTable args; + args.setString("x", "y"); + c.session.queueDeclare("qa", arg::arguments=args); + c.session.queueDeclare("qb", arg::alternateExchange="amq.direct"); + + c.session.exchangeDeclare(arg::exchange="exd", arg::type="direct", arg::arguments=args); + c.session.exchangeBind(arg::exchange="exd", arg::queue="qa", arg::bindingKey="foo"); + c.session.messageTransfer(arg::destination="exd", arg::content=Message("one", "foo")); + + c.session.exchangeDeclare("ext", arg::type="topic"); + c.session.exchangeBind(arg::exchange="ext", arg::queue="qb", arg::bindingKey="bar"); + c.subs.subscribe(c.lq, "qa", FlowControl::messageCredit(0)); + c.session.messageTransfer(arg::destination="ext", arg::content=Message("one", "bar")); + c.session.messageTransfer(arg::destination="ext", arg::content=Message("two", "bar")); + + c.session.close(); + c.connection.close(); + } + Url url(Url::getIpAddressesUrl(receiver.getPort())); + qpid::cluster::DumpClient dump(url, *donor.broker, 0); + dump.dump(); + { + Client r(receiver.getPort()); + // Verify exchanges + ExchangeQueryResult ex=r.session.exchangeQuery("exd"); + BOOST_CHECK_EQUAL(ex.getType(), "direct"); + BOOST_CHECK_EQUAL(ex.getDurable(), false); + BOOST_CHECK_EQUAL(ex.getNotFound(), false); + BOOST_CHECK_EQUAL(ex.getArguments().getString("x"), "y"); + + ex = r.session.exchangeQuery("ext"); + BOOST_CHECK_EQUAL(ex.getType(), "topic"); + BOOST_CHECK_EQUAL(ex.getNotFound(), false); + + // Verify queues + QueueQueryResult qq = r.session.queueQuery("qa"); + BOOST_CHECK_EQUAL(qq.getQueue(), "qa"); + BOOST_CHECK_EQUAL(qq.getAlternateExchange(), ""); + BOOST_CHECK_EQUAL(qq.getArguments().getString("x"), "y"); + BOOST_CHECK_EQUAL(qq.getMessageCount(), (unsigned)1); + + qq = r.session.queueQuery("qb"); + BOOST_CHECK_EQUAL(qq.getQueue(), "qb"); + BOOST_CHECK_EQUAL(qq.getAlternateExchange(), "amq.direct"); + BOOST_CHECK_EQUAL(qq.getMessageCount(), (unsigned)2); + + // Verify messages + Message m; + BOOST_CHECK(r.subs.get(m, "qa", TIME_SEC)); + BOOST_CHECK_EQUAL(m.getData(), "one"); + BOOST_CHECK_EQUAL(m.getDeliveryProperties().getExchange(), "exd"); + BOOST_CHECK_EQUAL(m.getDeliveryProperties().getRoutingKey(), "foo"); + + BOOST_CHECK(r.subs.get(m, "qb", TIME_SEC)); + BOOST_CHECK_EQUAL(m.getData(), "one"); + BOOST_CHECK_EQUAL(m.getDeliveryProperties().getExchange(), "ext"); + BOOST_CHECK_EQUAL(m.getDeliveryProperties().getRoutingKey(), "bar"); + + BOOST_CHECK(r.subs.get(m, "qb", TIME_SEC)); + BOOST_CHECK_EQUAL(m.getData(), "two"); + BOOST_CHECK_EQUAL(m.getDeliveryProperties().getExchange(), "ext"); + BOOST_CHECK_EQUAL(m.getDeliveryProperties().getRoutingKey(), "bar"); + + // Verify bindings + r.session.messageTransfer(arg::destination="exd", arg::content=Message("xxx", "foo")); + BOOST_CHECK(r.subs.get(m, "qa")); + BOOST_CHECK_EQUAL(m.getData(), "xxx"); + + r.session.messageTransfer(arg::destination="ext", arg::content=Message("yyy", "bar")); + BOOST_CHECK(r.subs.get(m, "qb")); + BOOST_CHECK_EQUAL(m.getData(), "yyy"); + + r.session.close(); + r.connection.close(); + } +} + +QPID_AUTO_TEST_SUITE_END() diff --git a/qpid/cpp/src/tests/cluster.mk b/qpid/cpp/src/tests/cluster.mk index 40d1c0df3e..0fc95b3c7d 100644 --- a/qpid/cpp/src/tests/cluster.mk +++ b/qpid/cpp/src/tests/cluster.mk @@ -18,7 +18,7 @@ check_PROGRAMS+=cluster_test cluster_test_SOURCES=unit_test.cpp cluster_test.cpp cluster_test_LDADD=$(lib_client) $(lib_cluster) -lboost_unit_test_framework -unit_test_SOURCES+=ClusterMapTest.cpp unit_test_LDADD+=$(lib_cluster) +unit_test_SOURCES+=ClusterMapTest.cpp DumpClientTest.cpp endif diff --git a/qpid/cpp/src/tests/cluster_test.cpp b/qpid/cpp/src/tests/cluster_test.cpp index 28ee439a5d..af380c629d 100644 --- a/qpid/cpp/src/tests/cluster_test.cpp +++ b/qpid/cpp/src/tests/cluster_test.cpp @@ -140,94 +140,6 @@ ostream& operator<<(ostream& o, const pair<T*, int>& array) { return o; } -// FIXME aconway 2008-09-11: This test has to be first otherwise -// it picks up the cluster name from a previous test and runs the -// brokers as cluster nodes. Something wrong with option parsing... -// -QPID_AUTO_TEST_CASE(testDumpClientSharedState) { - // In this test we don't want the cluster plugin to initialize, so set --cluster-name="" - const char* argv[] = { "--cluster-name", "" }; - Broker::Options opts = parseOpts(sizeof(argv)/sizeof(*argv), argv); - - BrokerFixture donor(opts), receiver(opts); - { - Client c(donor.getPort()); - FieldTable args; - args.setString("x", "y"); - c.session.queueDeclare("qa", arg::arguments=args); - c.session.queueDeclare("qb", arg::alternateExchange="amq.direct"); - - c.session.exchangeDeclare(arg::exchange="exd", arg::type="direct", arg::arguments=args); - c.session.exchangeBind(arg::exchange="exd", arg::queue="qa", arg::bindingKey="foo"); - c.session.messageTransfer(arg::destination="exd", arg::content=Message("one", "foo")); - - c.session.exchangeDeclare("ext", arg::type="topic"); - c.session.exchangeBind(arg::exchange="ext", arg::queue="qb", arg::bindingKey="bar"); - c.subs.subscribe(c.lq, "qa", FlowControl::messageCredit(0)); - c.session.messageTransfer(arg::destination="ext", arg::content=Message("one", "bar")); - c.session.messageTransfer(arg::destination="ext", arg::content=Message("two", "bar")); - - c.session.close(); - c.connection.close(); - } - qpid::cluster::DumpClient dump(Url::getIpAddressesUrl(receiver.getPort())); - dump.dump(*donor.broker); - { - Client r(receiver.getPort()); - // Verify exchanges - ExchangeQueryResult ex=r.session.exchangeQuery("exd"); - BOOST_CHECK_EQUAL(ex.getType(), "direct"); - BOOST_CHECK_EQUAL(ex.getDurable(), false); - BOOST_CHECK_EQUAL(ex.getNotFound(), false); - BOOST_CHECK_EQUAL(ex.getArguments().getString("x"), "y"); - - ex = r.session.exchangeQuery("ext"); - BOOST_CHECK_EQUAL(ex.getType(), "topic"); - BOOST_CHECK_EQUAL(ex.getNotFound(), false); - - // Verify queues - QueueQueryResult qq = r.session.queueQuery("qa"); - BOOST_CHECK_EQUAL(qq.getQueue(), "qa"); - BOOST_CHECK_EQUAL(qq.getAlternateExchange(), ""); - BOOST_CHECK_EQUAL(qq.getArguments().getString("x"), "y"); - BOOST_CHECK_EQUAL(qq.getMessageCount(), (unsigned)1); - - qq = r.session.queueQuery("qb"); - BOOST_CHECK_EQUAL(qq.getQueue(), "qb"); - BOOST_CHECK_EQUAL(qq.getAlternateExchange(), "amq.direct"); - BOOST_CHECK_EQUAL(qq.getMessageCount(), (unsigned)2); - - // Verify messages - Message m; - BOOST_CHECK(r.subs.get(m, "qa", TIME_SEC)); - BOOST_CHECK_EQUAL(m.getData(), "one"); - BOOST_CHECK_EQUAL(m.getDeliveryProperties().getExchange(), "exd"); - BOOST_CHECK_EQUAL(m.getDeliveryProperties().getRoutingKey(), "foo"); - - BOOST_CHECK(r.subs.get(m, "qb", TIME_SEC)); - BOOST_CHECK_EQUAL(m.getData(), "one"); - BOOST_CHECK_EQUAL(m.getDeliveryProperties().getExchange(), "ext"); - BOOST_CHECK_EQUAL(m.getDeliveryProperties().getRoutingKey(), "bar"); - - BOOST_CHECK(r.subs.get(m, "qb", TIME_SEC)); - BOOST_CHECK_EQUAL(m.getData(), "two"); - BOOST_CHECK_EQUAL(m.getDeliveryProperties().getExchange(), "ext"); - BOOST_CHECK_EQUAL(m.getDeliveryProperties().getRoutingKey(), "bar"); - - // Verify bindings - r.session.messageTransfer(arg::destination="exd", arg::content=Message("xxx", "foo")); - BOOST_CHECK(r.subs.get(m, "qa")); - BOOST_CHECK_EQUAL(m.getData(), "xxx"); - - r.session.messageTransfer(arg::destination="ext", arg::content=Message("yyy", "bar")); - BOOST_CHECK(r.subs.get(m, "qb")); - BOOST_CHECK_EQUAL(m.getData(), "yyy"); - - r.session.close(); - r.connection.close(); - } -} - // FIXME aconway 2008-09-12: finish the new join protocol. QPID_AUTO_TEST_CASE_EXPECTED_FAILURES(testCatchUpSharedState, 1) { @@ -278,7 +190,7 @@ QPID_AUTO_TEST_CASE(testStall) { BOOST_REQUIRE(q0); BOOST_CHECK_EQUAL(q0->getMessageCount(), (unsigned)0); // Now unstall and we should get the message. - getGlobalCluster().unStall(); + getGlobalCluster().ready(); Message m; BOOST_CHECK(c0.subs.get(m, "q", TIME_SEC)); BOOST_CHECK_EQUAL(m.getData(), "foo"); |