summaryrefslogtreecommitdiff
path: root/cpp/src/tests
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src/tests')
-rw-r--r--cpp/src/tests/.valgrind.supp202
-rw-r--r--cpp/src/tests/AccumulatedAckTest.cpp237
-rw-r--r--cpp/src/tests/Address.cpp124
-rw-r--r--cpp/src/tests/Array.cpp84
-rw-r--r--cpp/src/tests/AsyncCompletion.cpp120
-rw-r--r--cpp/src/tests/AtomicValue.cpp54
-rw-r--r--cpp/src/tests/Blob.cpp21
-rw-r--r--cpp/src/tests/BrokerFixture.h154
-rw-r--r--cpp/src/tests/BrokerMgmtAgent.cpp792
-rw-r--r--cpp/src/tests/BrokerMgmtAgent.xml38
-rw-r--r--cpp/src/tests/CMakeLists.txt356
-rw-r--r--cpp/src/tests/ClientMessage.cpp46
-rw-r--r--cpp/src/tests/ClientMessageTest.cpp51
-rw-r--r--cpp/src/tests/ClientSessionTest.cpp677
-rw-r--r--cpp/src/tests/ClusterFailover.cpp115
-rw-r--r--cpp/src/tests/ClusterFixture.cpp160
-rw-r--r--cpp/src/tests/ClusterFixture.h115
-rw-r--r--cpp/src/tests/ConnectionOptions.h62
-rw-r--r--cpp/src/tests/ConsoleTest.cpp46
-rw-r--r--cpp/src/tests/DeliveryRecordTest.cpp67
-rw-r--r--cpp/src/tests/DispatcherTest.cpp241
-rw-r--r--cpp/src/tests/DtxWorkRecordTest.cpp193
-rw-r--r--cpp/src/tests/ExchangeTest.cpp289
-rw-r--r--cpp/src/tests/FieldTable.cpp213
-rw-r--r--cpp/src/tests/FieldValue.cpp95
-rw-r--r--cpp/src/tests/ForkedBroker.cpp158
-rw-r--r--cpp/src/tests/ForkedBroker.h82
-rw-r--r--cpp/src/tests/Frame.cpp85
-rw-r--r--cpp/src/tests/FrameDecoder.cpp78
-rw-r--r--cpp/src/tests/FramingTest.cpp167
-rw-r--r--cpp/src/tests/HeaderTest.cpp114
-rw-r--r--cpp/src/tests/HeadersExchangeTest.cpp120
-rw-r--r--cpp/src/tests/InitialStatusMap.cpp235
-rw-r--r--cpp/src/tests/InlineAllocator.cpp68
-rw-r--r--cpp/src/tests/InlineVector.cpp128
-rw-r--r--cpp/src/tests/Makefile.am398
-rw-r--r--cpp/src/tests/ManagementTest.cpp124
-rw-r--r--cpp/src/tests/MessageBuilderTest.cpp190
-rw-r--r--cpp/src/tests/MessageReplayTracker.cpp102
-rw-r--r--cpp/src/tests/MessageTest.cpp92
-rw-r--r--cpp/src/tests/MessageUtils.h63
-rw-r--r--cpp/src/tests/MessagingFixture.h345
-rw-r--r--cpp/src/tests/MessagingSessionTests.cpp997
-rw-r--r--cpp/src/tests/MessagingThreadTests.cpp144
-rw-r--r--cpp/src/tests/PartialFailure.cpp291
-rw-r--r--cpp/src/tests/PollableCondition.cpp109
-rw-r--r--cpp/src/tests/PollerTest.cpp263
-rw-r--r--cpp/src/tests/ProxyTest.cpp56
-rw-r--r--cpp/src/tests/Qmf2.cpp320
-rw-r--r--cpp/src/tests/QueueEvents.cpp238
-rw-r--r--cpp/src/tests/QueueFlowLimitTest.cpp463
-rw-r--r--cpp/src/tests/QueueOptionsTest.cpp102
-rw-r--r--cpp/src/tests/QueuePolicyTest.cpp406
-rw-r--r--cpp/src/tests/QueueRegistryTest.cpp100
-rw-r--r--cpp/src/tests/QueueTest.cpp1124
-rw-r--r--cpp/src/tests/README.txt54
-rw-r--r--cpp/src/tests/RangeSet.cpp146
-rw-r--r--cpp/src/tests/RateFlowcontrolTest.cpp71
-rw-r--r--cpp/src/tests/RefCounted.cpp55
-rw-r--r--cpp/src/tests/ReplicationTest.cpp144
-rw-r--r--cpp/src/tests/RetryList.cpp111
-rw-r--r--cpp/src/tests/SequenceNumberTest.cpp209
-rw-r--r--cpp/src/tests/SequenceSet.cpp187
-rw-r--r--cpp/src/tests/SessionState.cpp304
-rw-r--r--cpp/src/tests/Shlib.cpp77
-rw-r--r--cpp/src/tests/SocketProxy.h181
-rw-r--r--cpp/src/tests/Statistics.cpp131
-rw-r--r--cpp/src/tests/Statistics.h111
-rw-r--r--cpp/src/tests/StoreStatus.cpp117
-rw-r--r--cpp/src/tests/StringUtils.cpp77
-rw-r--r--cpp/src/tests/TestMessageStore.h63
-rw-r--r--cpp/src/tests/TestOptions.h79
-rw-r--r--cpp/src/tests/TimerTest.cpp130
-rw-r--r--cpp/src/tests/TopicExchangeTest.cpp406
-rw-r--r--cpp/src/tests/TxBufferTest.cpp181
-rw-r--r--cpp/src/tests/TxMocks.h235
-rw-r--r--cpp/src/tests/TxPublishTest.cpp99
-rw-r--r--cpp/src/tests/Url.cpp90
-rw-r--r--cpp/src/tests/Uuid.cpp137
-rw-r--r--cpp/src/tests/Variant.cpp775
-rw-r--r--cpp/src/tests/XmlClientSessionTest.cpp297
-rwxr-xr-xcpp/src/tests/acl.py1077
-rwxr-xr-xcpp/src/tests/ais_check34
-rw-r--r--cpp/src/tests/ais_test.cpp23
-rwxr-xr-xcpp/src/tests/allhosts77
-rw-r--r--cpp/src/tests/amqp_0_10/Map.cpp98
-rw-r--r--cpp/src/tests/amqp_0_10/ProxyTemplate.cpp49
-rw-r--r--cpp/src/tests/amqp_0_10/apply.cpp99
-rw-r--r--cpp/src/tests/amqp_0_10/handlers.cpp125
-rw-r--r--cpp/src/tests/amqp_0_10/serialize.cpp429
-rw-r--r--cpp/src/tests/background.ps155
-rwxr-xr-xcpp/src/tests/benchmark95
-rw-r--r--cpp/src/tests/brokermgmt.mk44
-rw-r--r--cpp/src/tests/brokertest.py671
-rwxr-xr-xcpp/src/tests/cli_tests.py475
-rw-r--r--cpp/src/tests/cluster.cmake90
-rw-r--r--cpp/src/tests/cluster.mk100
-rw-r--r--cpp/src/tests/cluster_authentication_soak.cpp310
-rwxr-xr-xcpp/src/tests/cluster_python_tests27
-rw-r--r--cpp/src/tests/cluster_python_tests_failing.txt32
-rwxr-xr-xcpp/src/tests/cluster_read_credit27
-rw-r--r--cpp/src/tests/cluster_test.cpp1231
-rwxr-xr-xcpp/src/tests/cluster_test_logs.py119
-rw-r--r--cpp/src/tests/cluster_test_scripts/README.txt20
-rwxr-xr-xcpp/src/tests/cluster_test_scripts/cluster_check37
-rwxr-xr-xcpp/src/tests/cluster_test_scripts/cluster_start56
-rwxr-xr-xcpp/src/tests/cluster_test_scripts/cluster_stop38
-rwxr-xr-xcpp/src/tests/cluster_test_scripts/config_example.sh44
-rwxr-xr-xcpp/src/tests/cluster_test_scripts/perftest54
-rw-r--r--cpp/src/tests/cluster_tests.fail3
-rwxr-xr-xcpp/src/tests/cluster_tests.py1057
-rwxr-xr-xcpp/src/tests/clustered_replication_test110
-rw-r--r--cpp/src/tests/config.null1
-rw-r--r--cpp/src/tests/consume.cpp131
-rw-r--r--cpp/src/tests/datagen.cpp103
-rw-r--r--cpp/src/tests/declare_queues.cpp101
-rw-r--r--cpp/src/tests/dlclose_noop.c30
-rwxr-xr-xcpp/src/tests/dynamic_log_level_test57
-rw-r--r--cpp/src/tests/echotest.cpp158
-rw-r--r--cpp/src/tests/exception_test.cpp127
-rw-r--r--cpp/src/tests/failover_soak.cpp827
-rwxr-xr-xcpp/src/tests/fanout_perftest22
-rwxr-xr-xcpp/src/tests/federated_cluster_test152
-rwxr-xr-xcpp/src/tests/federated_cluster_test_with_node_failure23
-rwxr-xr-xcpp/src/tests/federated_topic_test129
-rwxr-xr-xcpp/src/tests/federation.py2091
-rw-r--r--cpp/src/tests/find_prog.ps136
-rw-r--r--cpp/src/tests/header_test.cpp59
-rwxr-xr-xcpp/src/tests/header_test.py86
-rw-r--r--cpp/src/tests/headers_federation.py99
-rw-r--r--cpp/src/tests/install_env.sh.in26
-rw-r--r--cpp/src/tests/logging.cpp385
-rwxr-xr-xcpp/src/tests/long_cluster_tests.py38
-rwxr-xr-xcpp/src/tests/multiq_perftest22
-rwxr-xr-xcpp/src/tests/perfdist87
-rw-r--r--cpp/src/tests/policy.acl1
-rw-r--r--cpp/src/tests/publish.cpp135
-rwxr-xr-xcpp/src/tests/python_tests29
-rw-r--r--cpp/src/tests/python_tests.ps145
-rwxr-xr-xcpp/src/tests/qpid-build-rinstall28
-rw-r--r--cpp/src/tests/qpid-client-test.cpp139
-rwxr-xr-xcpp/src/tests/qpid-cluster-benchmark58
-rwxr-xr-xcpp/src/tests/qpid-cluster-lag.py93
-rwxr-xr-xcpp/src/tests/qpid-cpp-benchmark260
-rwxr-xr-xcpp/src/tests/qpid-ctrl120
-rw-r--r--cpp/src/tests/qpid-latency-test.cpp469
-rw-r--r--cpp/src/tests/qpid-perftest.cpp746
-rw-r--r--cpp/src/tests/qpid-ping.cpp76
-rw-r--r--cpp/src/tests/qpid-receive.cpp269
-rw-r--r--cpp/src/tests/qpid-send.cpp375
-rwxr-xr-xcpp/src/tests/qpid-src-rinstall31
-rw-r--r--cpp/src/tests/qpid-stream.cpp193
-rwxr-xr-xcpp/src/tests/qpid-test-cluster109
-rw-r--r--cpp/src/tests/qpid-topic-listener.cpp209
-rw-r--r--cpp/src/tests/qpid-topic-publisher.cpp230
-rw-r--r--cpp/src/tests/qpid-txtest.cpp340
-rw-r--r--cpp/src/tests/queue_flow_limit_tests.py371
-rwxr-xr-xcpp/src/tests/quick_perftest22
-rwxr-xr-xcpp/src/tests/quick_topictest30
-rw-r--r--cpp/src/tests/quick_topictest.ps130
-rwxr-xr-xcpp/src/tests/quick_txtest22
-rw-r--r--cpp/src/tests/receiver.cpp140
-rwxr-xr-xcpp/src/tests/reliable_replication_test93
-rw-r--r--cpp/src/tests/replaying_sender.cpp165
-rwxr-xr-xcpp/src/tests/replication_test182
-rwxr-xr-xcpp/src/tests/restart_cluster38
-rw-r--r--cpp/src/tests/resuming_receiver.cpp193
-rwxr-xr-xcpp/src/tests/ring_queue_test174
-rwxr-xr-xcpp/src/tests/rsynchosts49
-rwxr-xr-xcpp/src/tests/run-unit-tests48
-rwxr-xr-xcpp/src/tests/run_acl_tests62
-rw-r--r--cpp/src/tests/run_acl_tests.ps1102
-rwxr-xr-xcpp/src/tests/run_cli_tests81
-rwxr-xr-xcpp/src/tests/run_cluster_authentication_soak26
-rwxr-xr-xcpp/src/tests/run_cluster_authentication_test26
-rwxr-xr-xcpp/src/tests/run_cluster_test26
-rwxr-xr-xcpp/src/tests/run_cluster_tests37
-rwxr-xr-xcpp/src/tests/run_failover_soak38
-rwxr-xr-xcpp/src/tests/run_federation_tests64
-rw-r--r--cpp/src/tests/run_federation_tests.ps184
-rwxr-xr-xcpp/src/tests/run_header_test37
-rw-r--r--cpp/src/tests/run_header_test.ps147
-rw-r--r--cpp/src/tests/run_headers_federation_tests49
-rwxr-xr-xcpp/src/tests/run_long_cluster_tests24
-rwxr-xr-xcpp/src/tests/run_perftest28
-rwxr-xr-xcpp/src/tests/run_queue_flow_limit_tests57
-rwxr-xr-xcpp/src/tests/run_ring_queue_test36
-rw-r--r--cpp/src/tests/run_store_tests.ps1133
-rwxr-xr-xcpp/src/tests/run_test82
-rw-r--r--cpp/src/tests/run_test.ps169
-rw-r--r--cpp/src/tests/sasl.mk49
-rwxr-xr-xcpp/src/tests/sasl_fed166
-rwxr-xr-xcpp/src/tests/sasl_fed_ex361
-rwxr-xr-xcpp/src/tests/sasl_fed_ex_dynamic27
-rwxr-xr-xcpp/src/tests/sasl_fed_ex_dynamic_cluster28
-rwxr-xr-xcpp/src/tests/sasl_fed_ex_link27
-rwxr-xr-xcpp/src/tests/sasl_fed_ex_link_cluster28
-rwxr-xr-xcpp/src/tests/sasl_fed_ex_queue27
-rwxr-xr-xcpp/src/tests/sasl_fed_ex_queue_cluster28
-rwxr-xr-xcpp/src/tests/sasl_fed_ex_route27
-rwxr-xr-xcpp/src/tests/sasl_fed_ex_route_cluster28
-rwxr-xr-xcpp/src/tests/sasl_test_setup.sh41
-rw-r--r--cpp/src/tests/sasl_version.cpp48
-rw-r--r--cpp/src/tests/sender.cpp157
-rwxr-xr-xcpp/src/tests/shared_perftest22
-rw-r--r--cpp/src/tests/shlibtest.cpp34
-rw-r--r--cpp/src/tests/ssl.mk22
-rwxr-xr-xcpp/src/tests/ssl_test142
-rwxr-xr-xcpp/src/tests/start_broker24
-rw-r--r--cpp/src/tests/start_broker.ps160
-rwxr-xr-xcpp/src/tests/start_cluster42
-rwxr-xr-xcpp/src/tests/start_cluster_hosts70
-rwxr-xr-xcpp/src/tests/stop_broker41
-rw-r--r--cpp/src/tests/stop_broker.ps156
-rwxr-xr-xcpp/src/tests/stop_cluster33
-rwxr-xr-xcpp/src/tests/store.py197
-rw-r--r--cpp/src/tests/test.xquery6
-rw-r--r--cpp/src/tests/test_env.sh.in79
-rw-r--r--cpp/src/tests/test_store.cpp178
-rw-r--r--cpp/src/tests/test_tools.h106
-rwxr-xr-xcpp/src/tests/test_watchdog36
-rwxr-xr-xcpp/src/tests/test_wrap48
-rw-r--r--cpp/src/tests/testagent.cpp203
-rw-r--r--cpp/src/tests/testagent.mk51
-rw-r--r--cpp/src/tests/testagent.xml64
-rw-r--r--cpp/src/tests/testlib.py766
-rwxr-xr-xcpp/src/tests/topic_perftest22
-rwxr-xr-xcpp/src/tests/topictest61
-rw-r--r--cpp/src/tests/topictest.ps173
-rw-r--r--cpp/src/tests/txjob.cpp102
-rw-r--r--cpp/src/tests/txshift.cpp193
-rw-r--r--cpp/src/tests/unit_test.cpp23
-rw-r--r--cpp/src/tests/unit_test.h70
-rwxr-xr-xcpp/src/tests/verify_cluster_objects107
-rw-r--r--cpp/src/tests/vg_check43
-rw-r--r--cpp/src/tests/windows/DisableWin32ErrorWindows.cpp76
236 files changed, 0 insertions, 38389 deletions
diff --git a/cpp/src/tests/.valgrind.supp b/cpp/src/tests/.valgrind.supp
deleted file mode 100644
index 2c6a1509ff..0000000000
--- a/cpp/src/tests/.valgrind.supp
+++ /dev/null
@@ -1,202 +0,0 @@
-{
- Leak in TCPConnector: https://bugzilla.redhat.com/show_bug.cgi?id=520600
- Memcheck:Leak
- fun:_vgrZU_libcZdsoZa_calloc
- fun:_dl_allocate_tls
- fun:*
- fun:*
- fun:*
- fun:_ZN4qpid6client12TCPConnector7connectERKSsi
-}
-
-{
- Leak in TCPConnector: https://bugzilla.redhat.com/show_bug.cgi?id=520600
- Memcheck:Leak
- fun:_vgrZU_libcZdsoZa_calloc
- fun:_dl_allocate_tls
- fun:*
- fun:*
- fun:_ZN4qpid6client12TCPConnector7connectERKSsi
-}
-
-{
- Reported on FC5 and RHEL5 when md5 sasl libs are installed
- Memcheck:Leak
- fun:*
- fun:_dl_map_object_from_fd
- fun:_dl_map_object
- fun:openaux
- fun:_dl_catch_error
- fun:_dl_map_object_deps
- fun:dl_open_worker
- fun:_dl_catch_error
- fun:_dl_open
- fun:dlopen_doit
- fun:_dl_catch_error
- fun:_dlerror_run
- fun:*
- fun:_sasl_get_plugin
- fun:_sasl_load_plugins
- fun:sasl_client_init
-}
-{
- Benign leak in CPG - patched version.
- Memcheck:Leak
- fun:*
- fun:openais_service_connect
- fun:cpg_initialize
-}
-
-{
- Benign error in libcpg.
- Memcheck:Param
- socketcall.sendmsg(msg.msg_iov[i])
- obj:*/libpthread-2.5.so
- obj:*/libcpg.so.2.0.0
-}
-
-{
- Uninitialised value problem in _dl_relocate (F7, F8)
- Memcheck:Cond
- fun:_dl_relocate_object
- fun:*dl_*
-}
-
-{
- False "possibly leaked" in boost program_options - global std::string var.
- Memcheck:Leak
- fun:_Znwj
- fun:_ZNSs4_Rep9_S_createEjjRKSaIcE
- obj:/usr/lib/libstdc++.so.6.0.8
- fun:_ZNSsC1EPKcRKSaIcE
- obj:/usr/lib/libboost_program_options.so.1.33.1
-}
-
-{
- INVESTIGATE
- Memcheck:Leak
- fun:calloc
- fun:_dl_allocate_tls
- fun:pthread_create@@GLIBC_2.2.5
- fun:_ZN4qpid6client9Connector4initEv
- fun:_ZN4qpid6client14ConnectionImpl4openERKSsiS3_S3_S3_
-}
-
-{
- INVESTIGATE
- Memcheck:Param
- write(buf)
- obj:/lib64/tls/libc-2.3.4.so
- fun:_ZNK4qpid3sys6Socket5writeEPKvm
- fun:_ZN4qpid3sys8AsynchIO9writeableERNS0_14DispatchHandleE
-}
-
-{
- "Conditional jump or move depends on uninitialised value(s)" from Xerces parser
- Memcheck:Cond
- fun:_ZN11xercesc_2_717XMLUTF8Transcoder13transcodeFromEPKhjPtjRjPh
- fun:_ZN11xercesc_2_79XMLReader14xcodeMoreCharsEPtPhj
- fun:_ZN11xercesc_2_79XMLReader17refreshCharBufferEv
-}
-
-{
- INVESTIGATE
- Memcheck:Param
- socketcall.sendto(msg)
- fun:send
- fun:get_mapping
- fun:__nscd_get_map_ref
- fun:nscd_gethst_r
- fun:__nscd_gethostbyname_r
- fun:gethostbyname_r@@GLIBC_2.2.5
- fun:gethostbyname
- fun:_ZNK4qpid3sys6Socket7connectERKSsi
-}
-
-{
- INVESTIGATE
- Memcheck:Leak
- fun:calloc
- fun:_dl_allocate_tls
- fun:pthread_create@@GLIBC_2.2.5
- fun:_ZN4qpid6broker5Timer5startEv
- fun:_ZN4qpid6broker5TimerC1Ev
- fun:_ZN4qpid6broker10DtxManagerC1Ev
- fun:_ZN4qpid6broker6BrokerC1ERKNS1_7OptionsE
- fun:_ZN4qpid6broker6Broker6createERKNS1_7OptionsE
- fun:_ZN20ClientSessionFixtureC1Ev
- fun:_Z14testQueueQueryv
- fun:_ZN5boost9unit_test9ut_detail17unit_test_monitor8functionEv
- obj:/usr/lib64/libboost_unit_test_framework.so.1.32.0
- fun:_ZN5boost17execution_monitor7executeEbi
- fun:_ZN5boost9unit_test9ut_detail17unit_test_monitor21execute_and_translateEPNS0_9test_caseEMS3_FvvEi
- fun:_ZN5boost9unit_test9test_case3runEv
- fun:_ZN5boost9unit_test10test_suite6do_runEv
- fun:_ZN5boost9unit_test9test_case3runEv
- fun:main
-}
-
-{
- INVESTIGATE
- Memcheck:Leak
- fun:calloc
- fun:_dl_allocate_tls
- fun:pthread_create@@GLIBC_2.2.5
- fun:_ZN4qpid6client9Connector4initEv
-}
-
-{
- MICK -- FIX
- Memcheck:Leak
- fun:_Znam
- fun:_ZN4qpid7Options5parseEiPPcRKSsb
-}
-
-{
- MICK -- FIX
- Memcheck:Leak
- fun:malloc
- fun:strdup
- fun:_ZN4qpid7Options5parseEiPPcRKSsb
-}
-
-{
- CPG error - seems benign.
- Memcheck:Param
- socketcall.sendmsg(msg.msg_iov[i])
- obj:*
- obj:*/libcpg.so.2.0.0
-}
-
-{
- Known leak in boost.thread 1.33.1. Wildcards for 64/32 bit diffs.
- Memcheck:Leak
- fun:*
- obj:/usr/*/libboost_thread.so.1.33.1
- fun:_ZN5boost6detail3tss3setEPv
-}
-
-{
- Shows up on RHEL5: believed benign
- Memcheck:Cond
- fun:__strcpy_chk
- fun:_sasl_load_plugins
- fun:sasl_client_init
-}
-
-{
- Seems like a use after delete issue in boost unit_test
- Memcheck:Addr8
- fun:_ZN5boost9unit_test14framework_implD1Ev
- fun:exit
- fun:(below main)
-}
-
-{
- Seems like a use after delete issue in boost unit_test
- Memcheck:Addr4
- fun:_ZN5boost9unit_test14framework_implD1Ev
- fun:exit
- fun:(below main)
-}
-
diff --git a/cpp/src/tests/AccumulatedAckTest.cpp b/cpp/src/tests/AccumulatedAckTest.cpp
deleted file mode 100644
index c736a519d2..0000000000
--- a/cpp/src/tests/AccumulatedAckTest.cpp
+++ /dev/null
@@ -1,237 +0,0 @@
-
-/*
- *
- * 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.
- *
- */
-#include "qpid/framing/AccumulatedAck.h"
-#include "unit_test.h"
-#include <iostream>
-#include <list>
-
-using std::list;
-using namespace qpid::framing;
-
-
-namespace qpid {
-namespace tests {
-
-bool covers(const AccumulatedAck& ack, int i)
-{
- return ack.covers(SequenceNumber(i));
-}
-
-void update(AccumulatedAck& ack, int start, int end)
-{
- ack.update(SequenceNumber(start), SequenceNumber(end));
-}
-
-QPID_AUTO_TEST_SUITE(AccumulatedAckTestSuite)
-
-QPID_AUTO_TEST_CASE(testGeneral)
-{
- AccumulatedAck ack(0);
- ack.clear();
- update(ack, 3,3);
- update(ack, 7,7);
- update(ack, 9,9);
- update(ack, 1,2);
- update(ack, 4,5);
- update(ack, 6,6);
-
- for(int i = 1; i <= 7; i++) BOOST_CHECK(covers(ack, i));
- BOOST_CHECK(covers(ack, 9));
-
- BOOST_CHECK(!covers(ack, 8));
- BOOST_CHECK(!covers(ack, 10));
-
- ack.consolidate();
-
- for(int i = 1; i <= 7; i++) BOOST_CHECK(covers(ack, i));
- BOOST_CHECK(covers(ack, 9));
-
- BOOST_CHECK(!covers(ack, 8));
- BOOST_CHECK(!covers(ack, 10));
-}
-
-QPID_AUTO_TEST_CASE(testCovers)
-{
- AccumulatedAck ack(5);
- update(ack, 7, 7);
- update(ack, 9, 9);
-
- BOOST_CHECK(covers(ack, 1));
- BOOST_CHECK(covers(ack, 2));
- BOOST_CHECK(covers(ack, 3));
- BOOST_CHECK(covers(ack, 4));
- BOOST_CHECK(covers(ack, 5));
- BOOST_CHECK(covers(ack, 7));
- BOOST_CHECK(covers(ack, 9));
-
- BOOST_CHECK(!covers(ack, 6));
- BOOST_CHECK(!covers(ack, 8));
- BOOST_CHECK(!covers(ack, 10));
-}
-
-QPID_AUTO_TEST_CASE(testUpdateFromCompletionData)
-{
- AccumulatedAck ack(0);
- SequenceNumber mark(2);
- SequenceNumberSet ranges;
- ranges.addRange(SequenceNumber(5), SequenceNumber(8));
- ranges.addRange(SequenceNumber(10), SequenceNumber(15));
- ranges.addRange(SequenceNumber(9), SequenceNumber(9));
- ranges.addRange(SequenceNumber(3), SequenceNumber(4));
-
- ack.update(mark, ranges);
-
- for(int i = 0; i <= 15; i++) {
- BOOST_CHECK(covers(ack, i));
- }
- BOOST_CHECK(!covers(ack, 16));
- BOOST_CHECK_EQUAL((uint32_t) 15, ack.mark.getValue());
-}
-
-QPID_AUTO_TEST_CASE(testCase1)
-{
- AccumulatedAck ack(3);
- update(ack, 1,2);
- for(int i = 1; i <= 3; i++) BOOST_CHECK(covers(ack, i));
- BOOST_CHECK(!covers(ack, 4));
-}
-
-QPID_AUTO_TEST_CASE(testCase2)
-{
- AccumulatedAck ack(3);
- update(ack, 3,6);
- for(int i = 1; i <= 6; i++) BOOST_CHECK(covers(ack, i));
- BOOST_CHECK(!covers(ack, 7));
-}
-
-QPID_AUTO_TEST_CASE(testCase3)
-{
- AccumulatedAck ack(3);
- update(ack, 4,6);
- for(int i = 1; i <= 6; i++) {
- BOOST_CHECK(covers(ack, i));
- }
- BOOST_CHECK(!covers(ack, 7));
-}
-
-QPID_AUTO_TEST_CASE(testCase4)
-{
- AccumulatedAck ack(3);
- update(ack, 5,6);
- for(int i = 1; i <= 6; i++) {
- if (i == 4) BOOST_CHECK(!covers(ack, i));
- else BOOST_CHECK(covers(ack, i));
- }
- BOOST_CHECK(!covers(ack, 7));
-}
-
-QPID_AUTO_TEST_CASE(testConsolidation1)
-{
- AccumulatedAck ack(3);
- update(ack, 7,7);
- BOOST_CHECK_EQUAL((uint32_t) 3, ack.mark.getValue());
- BOOST_CHECK_EQUAL((size_t) 1, ack.ranges.size());
-
- update(ack, 8,9);
- BOOST_CHECK_EQUAL((uint32_t) 3, ack.mark.getValue());
- BOOST_CHECK_EQUAL((size_t) 1, ack.ranges.size());
-
- update(ack, 1,2);
- BOOST_CHECK_EQUAL((uint32_t) 3, ack.mark.getValue());
- BOOST_CHECK_EQUAL((size_t) 1, ack.ranges.size());
-
- update(ack, 4,5);
- BOOST_CHECK_EQUAL((uint32_t) 5, ack.mark.getValue());
- BOOST_CHECK_EQUAL((size_t) 1, ack.ranges.size());
-
- update(ack, 6,6);
- BOOST_CHECK_EQUAL((uint32_t) 9, ack.mark.getValue());
- BOOST_CHECK_EQUAL((size_t) 0, ack.ranges.size());
-
- for(int i = 1; i <= 9; i++) BOOST_CHECK(covers(ack, i));
- BOOST_CHECK(!covers(ack, 10));
-}
-
-QPID_AUTO_TEST_CASE(testConsolidation2)
-{
- AccumulatedAck ack(0);
- update(ack, 10,12);
- BOOST_CHECK_EQUAL((uint32_t) 0, ack.mark.getValue());
- BOOST_CHECK_EQUAL((size_t) 1, ack.ranges.size());
-
- update(ack, 7,9);
- BOOST_CHECK_EQUAL((uint32_t) 0, ack.mark.getValue());
- BOOST_CHECK_EQUAL((size_t) 1, ack.ranges.size());
- BOOST_CHECK_EQUAL((uint32_t) 7, ack.ranges.front().start.getValue());
- BOOST_CHECK_EQUAL((uint32_t) 12, ack.ranges.front().end.getValue());
-
- update(ack, 5,7);
- BOOST_CHECK_EQUAL((uint32_t) 0, ack.mark.getValue());
- BOOST_CHECK_EQUAL((size_t) 1, ack.ranges.size());
- BOOST_CHECK_EQUAL((uint32_t) 5, ack.ranges.front().start.getValue());
- BOOST_CHECK_EQUAL((uint32_t) 12, ack.ranges.front().end.getValue());
-
- update(ack, 3,4);
- BOOST_CHECK_EQUAL((uint32_t) 0, ack.mark.getValue());
- BOOST_CHECK_EQUAL((size_t) 1, ack.ranges.size());
- BOOST_CHECK_EQUAL((uint32_t) 3, ack.ranges.front().start.getValue());
- BOOST_CHECK_EQUAL((uint32_t) 12, ack.ranges.front().end.getValue());
-
- update(ack, 1,2);
- BOOST_CHECK_EQUAL((uint32_t) 12, ack.mark.getValue());
- BOOST_CHECK_EQUAL((size_t) 0, ack.ranges.size());
-
- for(int i = 1; i <= 12; i++) BOOST_CHECK(covers(ack, i));
- BOOST_CHECK(!covers(ack, 13));
-}
-
-QPID_AUTO_TEST_CASE(testConsolidation3)
-{
- AccumulatedAck ack(0);
- update(ack, 10,12);
- update(ack, 6,7);
- update(ack, 3,4);
- update(ack, 1,15);
- BOOST_CHECK_EQUAL((uint32_t) 15, ack.mark.getValue());
- BOOST_CHECK_EQUAL((size_t) 0, ack.ranges.size());
-}
-
-QPID_AUTO_TEST_CASE(testConsolidation4)
-{
- AccumulatedAck ack(0);
- ack.update(SequenceNumber(0), SequenceNumber(2));
- ack.update(SequenceNumber(5), SequenceNumber(8));
- ack.update(SequenceNumber(10), SequenceNumber(15));
- ack.update(SequenceNumber(9), SequenceNumber(9));
- ack.update(SequenceNumber(3), SequenceNumber(4));
-
- for(int i = 0; i <= 15; i++) {
- BOOST_CHECK(covers(ack, i));
- }
- BOOST_CHECK(!covers(ack, 16));
- BOOST_CHECK_EQUAL((uint32_t) 15, ack.mark.getValue());
-}
-
-QPID_AUTO_TEST_SUITE_END()
-
-
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/Address.cpp b/cpp/src/tests/Address.cpp
deleted file mode 100644
index f41f27b6df..0000000000
--- a/cpp/src/tests/Address.cpp
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- *
- * 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.
- *
- */
-#include <iostream>
-#include "qpid/messaging/Address.h"
-#include "qpid/types/Variant.h"
-
-#include "unit_test.h"
-
-using namespace qpid::messaging;
-using namespace qpid::types;
-
-namespace qpid {
-namespace tests {
-
-QPID_AUTO_TEST_SUITE(AddressSuite)
-
-QPID_AUTO_TEST_CASE(testParseNameOnly)
-{
- Address address("my-topic");
- BOOST_CHECK_EQUAL(std::string("my-topic"), address.getName());
-}
-
-QPID_AUTO_TEST_CASE(testParseSubject)
-{
- Address address("my-topic/my-subject");
- BOOST_CHECK_EQUAL(std::string("my-topic"), address.getName());
- BOOST_CHECK_EQUAL(std::string("my-subject"), address.getSubject());
-}
-
-QPID_AUTO_TEST_CASE(testParseOptions)
-{
- Address address("my-topic; {a:bc, x:101, y:'a string'}");
- BOOST_CHECK_EQUAL(std::string("my-topic"), address.getName());
-
- BOOST_CHECK_EQUAL(std::string("bc"), address.getOptions()["a"]);
- BOOST_CHECK_EQUAL(101, static_cast<int>(address.getOptions()["x"]));
- BOOST_CHECK_EQUAL(std::string("a string"), address.getOptions()["y"]);
-
- // Test asString() and asInt64() once here
-
- BOOST_CHECK_EQUAL(std::string("bc"), address.getOptions()["a"].asString());
- BOOST_CHECK_EQUAL(static_cast<uint16_t>(101), address.getOptions()["x"].asInt64());
- BOOST_CHECK_EQUAL(std::string("a string"), address.getOptions()["y"].asString());
-}
-
-QPID_AUTO_TEST_CASE(testParseSubjectAndOptions)
-{
- Address address("my-topic/my-subject; {a:bc, x:101, y:'a string'}");
- BOOST_CHECK_EQUAL(std::string("my-topic"), address.getName());
- BOOST_CHECK_EQUAL(std::string("my-subject"), address.getSubject());
-
- BOOST_CHECK_EQUAL(std::string("bc"), address.getOptions()["a"]);
- BOOST_CHECK_EQUAL(101, static_cast<int>(address.getOptions()["x"]));
- BOOST_CHECK_EQUAL(std::string("a string"), address.getOptions()["y"]);
-}
-
-QPID_AUTO_TEST_CASE(testParseNestedOptions)
-{
- Address address("my-topic; {a:{p:202, q:'another string'}, x:101, y:'a string'}");
- BOOST_CHECK_EQUAL(std::string("my-topic"), address.getName());
- BOOST_CHECK_EQUAL(202, static_cast<int>(address.getOptions()["a"].asMap()["p"]));
- BOOST_CHECK_EQUAL(std::string("another string"), address.getOptions()["a"].asMap()["q"]);
- BOOST_CHECK_EQUAL(std::string("a string"), address.getOptions()["y"]);
-}
-
-QPID_AUTO_TEST_CASE(testParseOptionsWithList)
-{
- Address address("my-topic; {a:[202, 'another string'], x:101}");
- BOOST_CHECK_EQUAL(std::string("my-topic"), address.getName());
- Variant::List& list = address.getOptions()["a"].asList();
- Variant::List::const_iterator i = list.begin();
- BOOST_CHECK(i != list.end());
- BOOST_CHECK_EQUAL((uint16_t) 202, i->asInt64());
- BOOST_CHECK(++i != list.end());
- BOOST_CHECK_EQUAL(std::string("another string"), i->asString());
- BOOST_CHECK_EQUAL((uint16_t) 101, address.getOptions()["x"].asInt64());
-}
-
-QPID_AUTO_TEST_CASE(testParseOptionsWithEmptyList)
-{
- Address address("my-topic; {a:[], x:101}");
- BOOST_CHECK_EQUAL(std::string("my-topic"), address.getName());
- Variant::List& list = address.getOptions()["a"].asList();
- BOOST_CHECK_EQUAL(list.size(), (size_t) 0);
- BOOST_CHECK_EQUAL((uint16_t) 101, address.getOptions()["x"].asInt64());
-}
-
-QPID_AUTO_TEST_CASE(testParseOptionsWithEmptyMap)
-{
- Address address("my-topic; {a:{}, x:101}");
- BOOST_CHECK_EQUAL(std::string("my-topic"), address.getName());
- Variant::Map& map = address.getOptions()["a"].asMap();
- BOOST_CHECK_EQUAL(map.size(), (size_t) 0);
- BOOST_CHECK_EQUAL((uint16_t) 101, address.getOptions()["x"].asInt64());
-}
-
-QPID_AUTO_TEST_CASE(testParseQuotedNameAndSubject)
-{
- Address address("'my topic with / in it'/'my subject with ; in it'");
- BOOST_CHECK_EQUAL(std::string("my topic with / in it"), address.getName());
- BOOST_CHECK_EQUAL(std::string("my subject with ; in it"), address.getSubject());
-}
-
-QPID_AUTO_TEST_SUITE_END()
-
-}}
diff --git a/cpp/src/tests/Array.cpp b/cpp/src/tests/Array.cpp
deleted file mode 100644
index 7622b89d15..0000000000
--- a/cpp/src/tests/Array.cpp
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- *
- * 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.
- *
- */
-#include <iostream>
-#include <sstream>
-#include "qpid/framing/Array.h"
-#include "qpid/framing/FieldValue.h"
-
-#include "unit_test.h"
-
-namespace qpid {
-namespace tests {
-
-QPID_AUTO_TEST_SUITE(ArrayTestSuite)
-
-using namespace qpid::framing;
-
-void populate(std::vector<std::string>& data, int count = 10)
-{
- for (int i = 0; i < count; i++) {
- std::stringstream out;
- out << "item-" << i;
- data.push_back(out.str());
- }
-}
-
-QPID_AUTO_TEST_CASE(testEncodeDecode)
-{
- std::vector<std::string> data;
- populate(data);
-
- Array a(data);
-
- char buff[200];
- Buffer wbuffer(buff, 200);
- a.encode(wbuffer);
-
- Array b;
- Buffer rbuffer(buff, 200);
- b.decode(rbuffer);
- BOOST_CHECK_EQUAL(a, b);
-
- std::vector<std::string> data2;
- b.collect(data2);
- //BOOST_CHECK_EQUAL(data, data2);
- BOOST_CHECK(data == data2);
-}
-
-QPID_AUTO_TEST_CASE(testArrayAssignment)
-{
- std::vector<std::string> data;
- populate(data);
- Array b;
- {
- Array a(data);
- b = a;
- BOOST_CHECK_EQUAL(a, b);
- }
- std::vector<std::string> data2;
- b.collect(data2);
- //BOOST_CHECK_EQUAL(data, data2);
- BOOST_CHECK(data == data2);
-}
-
-QPID_AUTO_TEST_SUITE_END()
-
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/AsyncCompletion.cpp b/cpp/src/tests/AsyncCompletion.cpp
deleted file mode 100644
index e32097106f..0000000000
--- a/cpp/src/tests/AsyncCompletion.cpp
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- *
- * 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/broker/NullMessageStore.h"
-#include "qpid/sys/BlockingQueue.h"
-#include "qpid/client/AsyncSession.h"
-#include "qpid/sys/Time.h"
-#include "qpid/framing/QueueQueryResult.h"
-#include "qpid/client/TypedResult.h"
-
-using namespace std;
-using namespace qpid;
-using namespace client;
-using namespace framing;
-
-namespace qpid { namespace broker {
-class TransactionContext;
-class PersistableQueue;
-}}
-
-using broker::PersistableMessage;
-using broker::NullMessageStore;
-using broker::TransactionContext;
-using broker::PersistableQueue;
-using sys::TIME_SEC;
-using boost::intrusive_ptr;
-
-/** @file Unit tests for async completion.
- * Using a dummy store, verify that the broker indicates async completion of
- * message enqueues at the correct time.
- */
-
-namespace qpid {
-namespace tests {
-
-class AsyncCompletionMessageStore : public NullMessageStore {
- public:
- sys::BlockingQueue<boost::intrusive_ptr<PersistableMessage> > enqueued;
-
- AsyncCompletionMessageStore() : NullMessageStore() {}
- ~AsyncCompletionMessageStore(){}
-
- void enqueue(TransactionContext*,
- const boost::intrusive_ptr<PersistableMessage>& msg,
- const PersistableQueue& )
- {
- enqueued.push(msg);
- }
-};
-
-QPID_AUTO_TEST_SUITE(AsyncCompletionTestSuite)
-
-QPID_AUTO_TEST_CASE(testWaitTillComplete) {
- SessionFixture fix;
- AsyncCompletionMessageStore* store = new AsyncCompletionMessageStore;
- boost::shared_ptr<qpid::broker::MessageStore> p;
- p.reset(store);
- fix.broker->setStore(p);
- AsyncSession s = fix.session;
-
- static const int count = 3;
-
- s.queueDeclare("q", arg::durable=true);
- Completion transfers[count];
- for (int i = 0; i < count; ++i) {
- Message msg(boost::lexical_cast<string>(i), "q");
- msg.getDeliveryProperties().setDeliveryMode(PERSISTENT);
- transfers[i] = s.messageTransfer(arg::content=msg);
- }
-
- // Get hold of the broker-side messages.
- typedef vector<intrusive_ptr<PersistableMessage> > BrokerMessages;
- BrokerMessages enqueued;
- for (int j = 0; j < count; ++j)
- enqueued.push_back(store->enqueued.pop(TIME_SEC));
-
- // Send a sync, make sure it does not complete till all messages are complete.
- // In reverse order for fun.
- Completion sync = s.executionSync(arg::sync=true);
- for (int k = count-1; k >= 0; --k) {
- BOOST_CHECK(!transfers[k].isComplete()); // Should not be complete yet.
- BOOST_CHECK(!sync.isComplete()); // Should not be complete yet.
- enqueued[k]->enqueueComplete();
- }
- sync.wait(); // Should complete now, all messages are completed.
-}
-
-QPID_AUTO_TEST_CASE(testGetResult) {
- SessionFixture fix;
- AsyncSession s = fix.session;
-
- s.queueDeclare("q", arg::durable=true);
- TypedResult<QueueQueryResult> tr = s.queueQuery("q");
- QueueQueryResult qq = tr.get();
- BOOST_CHECK_EQUAL(qq.getQueue(), "q");
- BOOST_CHECK_EQUAL(qq.getMessageCount(), 0U);
-}
-
-QPID_AUTO_TEST_SUITE_END()
-
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/AtomicValue.cpp b/cpp/src/tests/AtomicValue.cpp
deleted file mode 100644
index d855d993a7..0000000000
--- a/cpp/src/tests/AtomicValue.cpp
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- *
- * 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 "qpid/sys/AtomicValue.h"
-
-namespace qpid {
-namespace tests {
-
-QPID_AUTO_TEST_SUITE(AtomicValueTestSuite)
-
-QPID_AUTO_TEST_CASE(test) {
- qpid::sys::AtomicValue<int> x(0);
- BOOST_CHECK_EQUAL(++x, 1);
- BOOST_CHECK_EQUAL(--x,0);
- BOOST_CHECK_EQUAL(x+=5,5);
- BOOST_CHECK_EQUAL(x-=10,-5);
- BOOST_CHECK_EQUAL(x.fetchAndAdd(7), -5);
- BOOST_CHECK_EQUAL(x.get(),2);
- BOOST_CHECK_EQUAL(x.fetchAndSub(3), 2);
- BOOST_CHECK_EQUAL(x.get(),-1);
-
- BOOST_CHECK_EQUAL(x.valueCompareAndSwap(-1,10), -1);
- BOOST_CHECK_EQUAL(x.get(), 10);
- BOOST_CHECK_EQUAL(x.valueCompareAndSwap(5, 6), 10);
- BOOST_CHECK_EQUAL(x.get(), 10);
-
- BOOST_CHECK(!x.boolCompareAndSwap(5, 6));
- BOOST_CHECK_EQUAL(x.get(), 10);
- BOOST_CHECK(x.boolCompareAndSwap(10, 6));
- BOOST_CHECK_EQUAL(x.get(), 6);
-}
-
-
-QPID_AUTO_TEST_SUITE_END()
-
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/Blob.cpp b/cpp/src/tests/Blob.cpp
deleted file mode 100644
index 9878d92fe4..0000000000
--- a/cpp/src/tests/Blob.cpp
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- *
- * 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.
- *
- */
-
diff --git a/cpp/src/tests/BrokerFixture.h b/cpp/src/tests/BrokerFixture.h
deleted file mode 100644
index 672d954572..0000000000
--- a/cpp/src/tests/BrokerFixture.h
+++ /dev/null
@@ -1,154 +0,0 @@
-#ifndef TESTS_BROKERFIXTURE_H
-#define TESTS_BROKERFIXTURE_H
-
-/*
- *
- * 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.
- *
- */
-
-#include "SocketProxy.h"
-
-#include "qpid/broker/Broker.h"
-#include "qpid/client/Connection.h"
-#include "qpid/client/ConnectionImpl.h"
-#include "qpid/client/Session.h"
-#include "qpid/client/SubscriptionManager.h"
-#include "qpid/client/LocalQueue.h"
-#include "qpid/log/Logger.h"
-#include "qpid/log/Options.h"
-#include "qpid/sys/Thread.h"
-#include <boost/noncopyable.hpp>
-
-namespace qpid {
-namespace tests {
-
-/**
- * A fixture with an in-process broker.
- */
-struct BrokerFixture : private boost::noncopyable {
- typedef qpid::broker::Broker Broker;
- typedef boost::intrusive_ptr<Broker> BrokerPtr;
-
- BrokerPtr broker;
- qpid::sys::Thread brokerThread;
-
- BrokerFixture(Broker::Options opts=Broker::Options(), bool enableMgmt=false) {
- // Keep the tests quiet unless logging env. vars have been set by user.
- if (!::getenv("QPID_LOG_ENABLE") && !::getenv("QPID_TRACE")) {
- qpid::log::Options logOpts;
- logOpts.selectors.clear();
- logOpts.selectors.push_back("error+");
- qpid::log::Logger::instance().configure(logOpts);
- }
- opts.port=0;
- // Management doesn't play well with multiple in-process brokers.
- opts.enableMgmt=enableMgmt;
- opts.workerThreads=1;
- opts.dataDir="";
- opts.auth=false;
- broker = Broker::create(opts);
- // TODO aconway 2007-12-05: At one point BrokerFixture
- // tests could hang in Connection ctor if the following
- // line is removed. This may not be an issue anymore.
- broker->accept();
- broker->getPort(qpid::broker::Broker::TCP_TRANSPORT);
- brokerThread = qpid::sys::Thread(*broker);
- };
-
- void shutdownBroker()
- {
- broker->shutdown();
- broker = BrokerPtr();
- }
-
- ~BrokerFixture() {
- if (broker) broker->shutdown();
- brokerThread.join();
- }
-
- /** Open a connection to the broker. */
- void open(qpid::client::Connection& c) {
- c.open("localhost", broker->getPort(qpid::broker::Broker::TCP_TRANSPORT));
- }
-
- uint16_t getPort() { return broker->getPort(qpid::broker::Broker::TCP_TRANSPORT); }
-};
-
-/** Connection that opens in its constructor */
-struct LocalConnection : public qpid::client::Connection {
- LocalConnection(uint16_t port) { open("localhost", port); }
- LocalConnection(const qpid::client::ConnectionSettings& s) { open(s); }
- ~LocalConnection() { close(); }
-};
-
-/** A local client connection via a socket proxy. */
-struct ProxyConnection : public qpid::client::Connection {
- SocketProxy proxy;
- ProxyConnection(int brokerPort) : proxy(brokerPort) {
- open("localhost", proxy.getPort());
- }
- ProxyConnection(const qpid::client::ConnectionSettings& s) : proxy(s.port) {
- qpid::client::ConnectionSettings proxySettings(s);
- proxySettings.port = proxy.getPort();
- open(proxySettings);
- }
- ~ProxyConnection() { close(); }
-};
-
-/** Convenience class to create and open a connection and session
- * and some related useful objects.
- */
-template <class ConnectionType=LocalConnection, class SessionType=qpid::client::Session>
-struct ClientT {
- ConnectionType connection;
- SessionType session;
- qpid::client::SubscriptionManager subs;
- qpid::client::LocalQueue lq;
- std::string name;
-
- ClientT(uint16_t port, const std::string& name_=std::string(), int timeout=0)
- : connection(port), session(connection.newSession(name_,timeout)), subs(session), name(name_) {}
- ClientT(const qpid::client::ConnectionSettings& settings, const std::string& name_=std::string(), int timeout=0)
- : connection(settings), session(connection.newSession(name_, timeout)), subs(session), name(name_) {}
-
- ~ClientT() { close(); }
- void close() { session.close(); connection.close(); }
-};
-
-typedef ClientT<> Client;
-
-/**
- * A BrokerFixture and ready-connected BrokerFixture::Client all in one.
- */
-template <class ConnectionType, class SessionType=qpid::client::Session>
-struct SessionFixtureT : BrokerFixture, ClientT<ConnectionType,SessionType> {
-
- SessionFixtureT(Broker::Options opts=Broker::Options()) :
- BrokerFixture(opts),
- ClientT<ConnectionType,SessionType>(broker->getPort(qpid::broker::Broker::TCP_TRANSPORT))
- {}
-
-};
-
-typedef SessionFixtureT<LocalConnection> SessionFixture;
-typedef SessionFixtureT<ProxyConnection> ProxySessionFixture;
-
-}} // namespace qpid::tests
-
-#endif /*!TESTS_BROKERFIXTURE_H*/
diff --git a/cpp/src/tests/BrokerMgmtAgent.cpp b/cpp/src/tests/BrokerMgmtAgent.cpp
deleted file mode 100644
index d0c6668b72..0000000000
--- a/cpp/src/tests/BrokerMgmtAgent.cpp
+++ /dev/null
@@ -1,792 +0,0 @@
-/*
- *
- * 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.
- *
- */
-
-#include "unit_test.h"
-#include "MessagingFixture.h"
-#include "qpid/management/Buffer.h"
-#include "qpid/messaging/Message.h"
-#include "qpid/amqp_0_10/Codecs.h"
-#include "qpid/log/Logger.h"
-#include "qpid/log/Options.h"
-
-#include "qmf/org/apache/qpid/broker/mgmt/test/TestObject.h"
-
-#include <iomanip>
-
-
-using qpid::management::Mutex;
-using qpid::management::Manageable;
-using qpid::management::Buffer;
-using namespace qpid::messaging;
-using namespace qpid::types;
-
-
-
-namespace qpid {
- namespace tests {
-
- namespace _qmf = qmf::org::apache::qpid::broker::mgmt::test;
- namespace {
-
- typedef boost::shared_ptr<_qmf::TestObject> TestObjectPtr;
- typedef std::vector<TestObjectPtr> TestObjectVector;
-
- // Instantiates a broker and its internal management agent. Provides
- // factories for constructing Receivers for object indication messages.
- //
- class AgentFixture
- {
- MessagingFixture *mFix;
-
- public:
- AgentFixture( unsigned int pubInterval=10,
- bool qmfV2=false,
- qpid::broker::Broker::Options opts = qpid::broker::Broker::Options())
- {
- opts.enableMgmt=true;
- opts.qmf2Support=qmfV2;
- opts.mgmtPubInterval=pubInterval;
- mFix = new MessagingFixture(opts, true);
-
- _qmf::TestObject::registerSelf(getBrokerAgent());
- };
- ~AgentFixture()
- {
- delete mFix;
- };
- ::qpid::management::ManagementAgent *getBrokerAgent() { return mFix->broker->getManagementAgent(); }
- Receiver createV1DataIndRcvr( const std::string package, const std::string klass )
- {
- return mFix->session.createReceiver(std::string("kqueue; {create: always, delete: always, "
- "node: {type: queue, "
- "x-bindings: [{exchange: qpid.management, "
- "key: 'console.obj.1.0.")
- + package + std::string(".") + klass
- + std::string("'}]}}"));
- };
- Receiver createV2DataIndRcvr( const std::string package, const std::string klass )
- {
- std::string p(package);
- std::replace(p.begin(), p.end(), '.', '_');
- std::string k(klass);
- std::replace(k.begin(), k.end(), '.', '_');
-
- return mFix->session.createReceiver(std::string("kqueue; {create: always, delete: always, "
- "node: {type: queue, "
- "x-bindings: [{exchange: qmf.default.topic, "
- "key: 'agent.ind.data.")
- + p + std::string(".") + k
- + std::string("'}]}}"));
- };
- };
-
-
- // A "management object" that supports the TestObject
- //
- class TestManageable : public qpid::management::Manageable
- {
- management::ManagementObject* mgmtObj;
- const std::string key;
- public:
- TestManageable(management::ManagementAgent *agent, std::string _key)
- : key(_key)
- {
- _qmf::TestObject *tmp = new _qmf::TestObject(agent, this);
-
- // seed it with some default values...
- tmp->set_string1(key);
- tmp->set_bool1(true);
- qpid::types::Variant::Map vMap;
- vMap["one"] = qpid::types::Variant(1);
- vMap["two"] = qpid::types::Variant("two");
- vMap["three"] = qpid::types::Variant("whatever");
- tmp->set_map1(vMap);
-
- mgmtObj = tmp;
- };
- ~TestManageable() { mgmtObj = 0; /* deleted by agent on shutdown */ };
- management::ManagementObject* GetManagementObject() const { return mgmtObj; };
- static void validateTestObjectProperties(_qmf::TestObject& to)
- {
- // verify the default values are as expected. We don't check 'string1',
- // as it is the object key, and is unique for each object (no default value).
- BOOST_CHECK(to.get_bool1() == true);
- BOOST_CHECK(to.get_map1().size() == 3);
- qpid::types::Variant::Map mappy = to.get_map1();
- BOOST_CHECK(1 == (unsigned int)mappy["one"]);
- BOOST_CHECK(mappy["two"].asString() == std::string("two"));
- BOOST_CHECK(mappy["three"].asString() == std::string("whatever"));
- };
- };
-
-
- // decode a V1 Content Indication message
- //
- void decodeV1ObjectUpdates(const Message& inMsg, TestObjectVector& objs, const size_t objLen)
- {
- const size_t MAX_BUFFER_SIZE=65536;
- char tmp[MAX_BUFFER_SIZE];
-
- objs.clear();
-
- BOOST_CHECK(inMsg.getContent().size() <= MAX_BUFFER_SIZE);
-
- ::memcpy(tmp, inMsg.getContent().data(), inMsg.getContent().size());
- Buffer buf(tmp, inMsg.getContent().size());
-
- while (buf.available() > 8) { // 8 == qmf v1 header size
- BOOST_CHECK_EQUAL(buf.getOctet(), 'A');
- BOOST_CHECK_EQUAL(buf.getOctet(), 'M');
- BOOST_CHECK_EQUAL(buf.getOctet(), '2');
- BOOST_CHECK_EQUAL(buf.getOctet(), 'c'); // opcode == content indication
- // @@todo: kag: how do we skip 'i' entries???
- buf.getLong(); // ignore sequence
-
- std::string str1; // decode content body as string
- buf.getRawData(str1, objLen);
-
- TestObjectPtr fake(new _qmf::TestObject(0,0));
- fake->readProperties( str1 );
- objs.push_back(fake);
- }
- }
-
-
- // decode a V2 Content Indication message
- //
- void decodeV2ObjectUpdates(const qpid::messaging::Message& inMsg, TestObjectVector& objs)
- {
- objs.clear();
-
- BOOST_CHECK_EQUAL(inMsg.getContentType(), std::string("amqp/list"));
-
- const ::qpid::types::Variant::Map& m = inMsg.getProperties();
- Variant::Map::const_iterator iter = m.find(std::string("qmf.opcode"));
- BOOST_CHECK(iter != m.end());
- BOOST_CHECK_EQUAL(iter->second.asString(), std::string("_data_indication"));
-
- Variant::List vList;
- ::qpid::amqp_0_10::ListCodec::decode(inMsg.getContent(), vList);
-
- for (Variant::List::iterator lIter = vList.begin(); lIter != vList.end(); lIter++) {
- TestObjectPtr fake(new _qmf::TestObject(0,0));
- fake->readTimestamps(lIter->asMap());
- fake->mapDecodeValues((lIter->asMap())["_values"].asMap());
- objs.push_back(fake);
- }
- }
- }
-
- QPID_AUTO_TEST_SUITE(BrokerMgmtAgent)
-
- // verify that an object that is added to the broker's management database is
- // published correctly. Furthermore, verify that it is published once after
- // it has been deleted.
- //
- QPID_AUTO_TEST_CASE(v1ObjPublish)
- {
- AgentFixture* fix = new AgentFixture(3);
- management::ManagementAgent* agent;
- agent = fix->getBrokerAgent();
-
- // create a manageable test object
- TestManageable *tm = new TestManageable(agent, std::string("obj1"));
- uint32_t objLen = tm->GetManagementObject()->writePropertiesSize();
-
- Receiver r1 = fix->createV1DataIndRcvr("org.apache.qpid.broker.mgmt.test", "#");
-
- agent->addObject(tm->GetManagementObject(), 1);
-
- // wait for the object to be published
- Message m1;
- BOOST_CHECK(r1.fetch(m1, Duration::SECOND * 6));
-
- TestObjectVector objs;
- decodeV1ObjectUpdates(m1, objs, objLen);
- BOOST_CHECK(objs.size() > 0);
-
- for (TestObjectVector::iterator oIter = objs.begin(); oIter != objs.end(); oIter++) {
-
- TestManageable::validateTestObjectProperties(**oIter);
-
- qpid::types::Variant::Map mappy;
- (*oIter)->writeTimestamps(mappy);
- BOOST_CHECK(0 == mappy["_delete_ts"].asUint64()); // not deleted
- }
-
- // destroy the object
-
- tm->GetManagementObject()->resourceDestroy();
-
- // wait for the deleted object to be published
-
- bool isDeleted = false;
- while (!isDeleted && r1.fetch(m1, Duration::SECOND * 6)) {
-
- decodeV1ObjectUpdates(m1, objs, objLen);
- BOOST_CHECK(objs.size() > 0);
-
- for (TestObjectVector::iterator oIter = objs.begin(); oIter != objs.end(); oIter++) {
-
- TestManageable::validateTestObjectProperties(**oIter);
-
- qpid::types::Variant::Map mappy;
- (*oIter)->writeTimestamps(mappy);
- if (mappy["_delete_ts"].asUint64() != 0)
- isDeleted = true;
- }
- }
-
- BOOST_CHECK(isDeleted);
-
- r1.close();
- delete fix;
- delete tm;
- }
-
- // Repeat the previous test, but with V2-based object support
- //
- QPID_AUTO_TEST_CASE(v2ObjPublish)
- {
- AgentFixture* fix = new AgentFixture(3, true);
- management::ManagementAgent* agent;
- agent = fix->getBrokerAgent();
-
- TestManageable *tm = new TestManageable(agent, std::string("obj2"));
-
- Receiver r1 = fix->createV2DataIndRcvr(tm->GetManagementObject()->getPackageName(), "#");
-
- agent->addObject(tm->GetManagementObject(), "testobj-1");
-
- // wait for the object to be published
- Message m1;
- BOOST_CHECK(r1.fetch(m1, Duration::SECOND * 6));
-
- TestObjectVector objs;
- decodeV2ObjectUpdates(m1, objs);
- BOOST_CHECK(objs.size() > 0);
-
- for (TestObjectVector::iterator oIter = objs.begin(); oIter != objs.end(); oIter++) {
-
- TestManageable::validateTestObjectProperties(**oIter);
-
- qpid::types::Variant::Map mappy;
- (*oIter)->writeTimestamps(mappy);
- BOOST_CHECK(0 == mappy["_delete_ts"].asUint64());
- }
-
- // destroy the object
-
- tm->GetManagementObject()->resourceDestroy();
-
- // wait for the deleted object to be published
-
- bool isDeleted = false;
- while (!isDeleted && r1.fetch(m1, Duration::SECOND * 6)) {
-
- decodeV2ObjectUpdates(m1, objs);
- BOOST_CHECK(objs.size() > 0);
-
- for (TestObjectVector::iterator oIter = objs.begin(); oIter != objs.end(); oIter++) {
-
- TestManageable::validateTestObjectProperties(**oIter);
-
- qpid::types::Variant::Map mappy;
- (*oIter)->writeTimestamps(mappy);
- if (mappy["_delete_ts"].asUint64() != 0)
- isDeleted = true;
- }
- }
-
- BOOST_CHECK(isDeleted);
-
- r1.close();
- delete fix;
- delete tm;
- }
-
-
- // verify that a deleted object is exported correctly using the
- // exportDeletedObjects() method. V1 testcase.
- //
- QPID_AUTO_TEST_CASE(v1ExportDelObj)
- {
- AgentFixture* fix = new AgentFixture(3);
- management::ManagementAgent* agent;
- agent = fix->getBrokerAgent();
-
- // create a manageable test object
- TestManageable *tm = new TestManageable(agent, std::string("myObj"));
- uint32_t objLen = tm->GetManagementObject()->writePropertiesSize();
-
- Receiver r1 = fix->createV1DataIndRcvr("org.apache.qpid.broker.mgmt.test", "#");
-
- agent->addObject(tm->GetManagementObject(), 1);
-
- // wait for the object to be published
- Message m1;
- BOOST_CHECK(r1.fetch(m1, Duration::SECOND * 6));
-
- TestObjectVector objs;
- decodeV1ObjectUpdates(m1, objs, objLen);
- BOOST_CHECK(objs.size() > 0);
-
- // destroy the object, then immediately export (before the next poll cycle)
-
- ::qpid::management::ManagementAgent::DeletedObjectList delObjs;
- tm->GetManagementObject()->resourceDestroy();
- agent->exportDeletedObjects( delObjs );
- BOOST_CHECK(delObjs.size() == 1);
-
- // wait for the deleted object to be published
-
- bool isDeleted = false;
- while (!isDeleted && r1.fetch(m1, Duration::SECOND * 6)) {
-
- decodeV1ObjectUpdates(m1, objs, objLen);
- BOOST_CHECK(objs.size() > 0);
-
- for (TestObjectVector::iterator oIter = objs.begin(); oIter != objs.end(); oIter++) {
-
- TestManageable::validateTestObjectProperties(**oIter);
-
- qpid::types::Variant::Map mappy;
- (*oIter)->writeTimestamps(mappy);
- if (mappy["_delete_ts"].asUint64() != 0)
- isDeleted = true;
- }
- }
-
- BOOST_CHECK(isDeleted);
-
- // verify there are no deleted objects to export now.
-
- agent->exportDeletedObjects( delObjs );
- BOOST_CHECK(delObjs.size() == 0);
-
- r1.close();
- delete fix;
- delete tm;
- }
-
-
- // verify that a deleted object is imported correctly using the
- // importDeletedObjects() method. V1 testcase.
- //
- QPID_AUTO_TEST_CASE(v1ImportDelObj)
- {
- AgentFixture* fix = new AgentFixture(3);
- management::ManagementAgent* agent;
- agent = fix->getBrokerAgent();
-
- // create a manageable test object
- TestManageable *tm = new TestManageable(agent, std::string("anObj"));
- uint32_t objLen = tm->GetManagementObject()->writePropertiesSize();
-
- Receiver r1 = fix->createV1DataIndRcvr("org.apache.qpid.broker.mgmt.test", "#");
-
- agent->addObject(tm->GetManagementObject(), 1);
-
- // wait for the object to be published
- Message m1;
- BOOST_CHECK(r1.fetch(m1, Duration::SECOND * 6));
-
- TestObjectVector objs;
- decodeV1ObjectUpdates(m1, objs, objLen);
- BOOST_CHECK(objs.size() > 0);
-
- // destroy the object, then immediately export (before the next poll cycle)
-
- ::qpid::management::ManagementAgent::DeletedObjectList delObjs;
- tm->GetManagementObject()->resourceDestroy();
- agent->exportDeletedObjects( delObjs );
- BOOST_CHECK(delObjs.size() == 1);
-
- // destroy the broker, and reinistantiate a new one without populating it
- // with a TestObject.
-
- r1.close();
- delete fix;
- delete tm; // should no longer be necessary
-
- fix = new AgentFixture(3);
- r1 = fix->createV1DataIndRcvr("org.apache.qpid.broker.mgmt.test", "#");
- agent = fix->getBrokerAgent();
- agent->importDeletedObjects( delObjs );
-
- // wait for the deleted object to be published
-
- bool isDeleted = false;
- while (!isDeleted && r1.fetch(m1, Duration::SECOND * 6)) {
-
- decodeV1ObjectUpdates(m1, objs, objLen);
- BOOST_CHECK(objs.size() > 0);
-
- for (TestObjectVector::iterator oIter = objs.begin(); oIter != objs.end(); oIter++) {
-
- TestManageable::validateTestObjectProperties(**oIter);
-
- qpid::types::Variant::Map mappy;
- (*oIter)->writeTimestamps(mappy);
- if (mappy["_delete_ts"].asUint64() != 0)
- isDeleted = true;
- }
- }
-
- BOOST_CHECK(isDeleted);
-
- // verify there are no deleted objects to export now.
-
- agent->exportDeletedObjects( delObjs );
- BOOST_CHECK(delObjs.size() == 0);
-
- r1.close();
- delete fix;
- }
-
-
- // verify that an object that is added and deleted prior to the
- // first poll cycle is accounted for by the export
- //
- QPID_AUTO_TEST_CASE(v1ExportFastDelObj)
- {
- AgentFixture* fix = new AgentFixture(3);
- management::ManagementAgent* agent;
- agent = fix->getBrokerAgent();
-
- // create a manageable test object
- TestManageable *tm = new TestManageable(agent, std::string("objectifyMe"));
-
- // add, then immediately delete and export the object...
-
- ::qpid::management::ManagementAgent::DeletedObjectList delObjs;
- agent->addObject(tm->GetManagementObject(), 999);
- tm->GetManagementObject()->resourceDestroy();
- agent->exportDeletedObjects( delObjs );
- BOOST_CHECK(delObjs.size() == 1);
-
- delete fix;
- delete tm;
- }
-
-
- // Verify that we can export and import multiple deleted objects correctly.
- //
- QPID_AUTO_TEST_CASE(v1ImportMultiDelObj)
- {
- AgentFixture* fix = new AgentFixture(3);
- management::ManagementAgent* agent;
- agent = fix->getBrokerAgent();
-
- Receiver r1 = fix->createV1DataIndRcvr("org.apache.qpid.broker.mgmt.test", "#");
-
- // populate the agent with multiple test objects
- const size_t objCount = 50;
- std::vector<TestManageable *> tmv;
- uint32_t objLen;
-
- for (size_t i = 0; i < objCount; i++) {
- std::stringstream key;
- key << "testobj-" << std::setfill('x') << std::setw(4) << i;
- // (no, seriously, I didn't just do that.)
- // Note well: we have to keep the key string length EXACTLY THE SAME
- // FOR ALL OBJECTS, so objLen will be the same. Otherwise the
- // decodeV1ObjectUpdates() will fail (v1 lacks explict encoded length).
- TestManageable *tm = new TestManageable(agent, key.str());
- objLen = tm->GetManagementObject()->writePropertiesSize();
- agent->addObject(tm->GetManagementObject(), i + 1);
- tmv.push_back(tm);
- }
-
- // wait for the objects to be published
- Message m1;
- uint32_t msgCount = 0;
- while(r1.fetch(m1, Duration::SECOND * 6)) {
- TestObjectVector objs;
- decodeV1ObjectUpdates(m1, objs, objLen);
- msgCount += objs.size();
- }
-
- BOOST_CHECK_EQUAL(msgCount, objCount);
-
- // destroy some of the objects, then immediately export (before the next poll cycle)
-
- uint32_t delCount = 0;
- for (size_t i = 0; i < objCount; i += 2) {
- tmv[i]->GetManagementObject()->resourceDestroy();
- delCount++;
- }
-
- ::qpid::management::ManagementAgent::DeletedObjectList delObjs;
- agent->exportDeletedObjects( delObjs );
- BOOST_CHECK_EQUAL(delObjs.size(), delCount);
-
- // destroy the broker, and reinistantiate a new one without populating it
- // with TestObjects.
-
- r1.close();
- delete fix;
- while (tmv.size()) {
- delete tmv.back();
- tmv.pop_back();
- }
-
- fix = new AgentFixture(3);
- r1 = fix->createV1DataIndRcvr("org.apache.qpid.broker.mgmt.test", "#");
- agent = fix->getBrokerAgent();
- agent->importDeletedObjects( delObjs );
-
- // wait for the deleted object to be published, verify the count
-
- uint32_t countDels = 0;
- while (r1.fetch(m1, Duration::SECOND * 6)) {
- TestObjectVector objs;
- decodeV1ObjectUpdates(m1, objs, objLen);
- BOOST_CHECK(objs.size() > 0);
-
-
- for (TestObjectVector::iterator oIter = objs.begin(); oIter != objs.end(); oIter++) {
-
- TestManageable::validateTestObjectProperties(**oIter);
-
- qpid::types::Variant::Map mappy;
- (*oIter)->writeTimestamps(mappy);
- if (mappy["_delete_ts"].asUint64() != 0)
- countDels++;
- }
- }
-
- // make sure we get the correct # of deleted objects
- BOOST_CHECK_EQUAL(countDels, delCount);
-
- // verify there are no deleted objects to export now.
-
- agent->exportDeletedObjects( delObjs );
- BOOST_CHECK(delObjs.size() == 0);
-
- r1.close();
- delete fix;
- }
-
- // Verify that we can export and import multiple deleted objects correctly.
- // QMF V2 variant
- QPID_AUTO_TEST_CASE(v2ImportMultiDelObj)
- {
- AgentFixture* fix = new AgentFixture(3, true);
- management::ManagementAgent* agent;
- agent = fix->getBrokerAgent();
-
- Receiver r1 = fix->createV2DataIndRcvr("org.apache.qpid.broker.mgmt.test", "#");
-
- // populate the agent with multiple test objects
- const size_t objCount = 50;
- std::vector<TestManageable *> tmv;
- uint32_t objLen;
-
- for (size_t i = 0; i < objCount; i++) {
- std::stringstream key;
- key << "testobj-" << i;
- TestManageable *tm = new TestManageable(agent, key.str());
- objLen = tm->GetManagementObject()->writePropertiesSize();
- agent->addObject(tm->GetManagementObject(), key.str());
- tmv.push_back(tm);
- }
-
- // wait for the objects to be published
- Message m1;
- uint32_t msgCount = 0;
- while(r1.fetch(m1, Duration::SECOND * 6)) {
- TestObjectVector objs;
- decodeV2ObjectUpdates(m1, objs);
- msgCount += objs.size();
- }
-
- BOOST_CHECK_EQUAL(msgCount, objCount);
-
- // destroy some of the objects, then immediately export (before the next poll cycle)
-
- uint32_t delCount = 0;
- for (size_t i = 0; i < objCount; i += 2) {
- tmv[i]->GetManagementObject()->resourceDestroy();
- delCount++;
- }
-
- ::qpid::management::ManagementAgent::DeletedObjectList delObjs;
- agent->exportDeletedObjects( delObjs );
- BOOST_CHECK_EQUAL(delObjs.size(), delCount);
-
- // destroy the broker, and reinistantiate a new one without populating it
- // with TestObjects.
-
- r1.close();
- delete fix;
- while (tmv.size()) {
- delete tmv.back();
- tmv.pop_back();
- }
-
- fix = new AgentFixture(3, true);
- r1 = fix->createV2DataIndRcvr("org.apache.qpid.broker.mgmt.test", "#");
- agent = fix->getBrokerAgent();
- agent->importDeletedObjects( delObjs );
-
- // wait for the deleted object to be published, verify the count
-
- uint32_t countDels = 0;
- while (r1.fetch(m1, Duration::SECOND * 6)) {
- TestObjectVector objs;
- decodeV2ObjectUpdates(m1, objs);
- BOOST_CHECK(objs.size() > 0);
-
- for (TestObjectVector::iterator oIter = objs.begin(); oIter != objs.end(); oIter++) {
-
- TestManageable::validateTestObjectProperties(**oIter);
-
- qpid::types::Variant::Map mappy;
- (*oIter)->writeTimestamps(mappy);
- if (mappy["_delete_ts"].asUint64() != 0)
- countDels++;
- }
- }
-
- // make sure we get the correct # of deleted objects
- BOOST_CHECK_EQUAL(countDels, delCount);
-
- // verify there are no deleted objects to export now.
-
- agent->exportDeletedObjects( delObjs );
- BOOST_CHECK(delObjs.size() == 0);
-
- r1.close();
- delete fix;
- }
-
- // See QPID-2997
- QPID_AUTO_TEST_CASE(v2RapidRestoreObj)
- {
- AgentFixture* fix = new AgentFixture(3, true);
- management::ManagementAgent* agent;
- agent = fix->getBrokerAgent();
-
- // two objects, same ObjID
- TestManageable *tm1 = new TestManageable(agent, std::string("obj2"));
- TestManageable *tm2 = new TestManageable(agent, std::string("obj2"));
-
- Receiver r1 = fix->createV2DataIndRcvr(tm1->GetManagementObject()->getPackageName(), "#");
-
- // add, then immediately delete and re-add a copy of the object
- agent->addObject(tm1->GetManagementObject(), "testobj-1");
- tm1->GetManagementObject()->resourceDestroy();
- agent->addObject(tm2->GetManagementObject(), "testobj-1");
-
- // expect: a delete notification, then an update notification
- TestObjectVector objs;
- bool isDeleted = false;
- bool isAdvertised = false;
- size_t count = 0;
- Message m1;
- while (r1.fetch(m1, Duration::SECOND * 6)) {
-
- decodeV2ObjectUpdates(m1, objs);
- BOOST_CHECK(objs.size() > 0);
-
- for (TestObjectVector::iterator oIter = objs.begin(); oIter != objs.end(); oIter++) {
- count++;
- TestManageable::validateTestObjectProperties(**oIter);
-
- qpid::types::Variant::Map mappy;
- (*oIter)->writeTimestamps(mappy);
- if (mappy["_delete_ts"].asUint64() != 0) {
- isDeleted = true;
- BOOST_CHECK(isAdvertised == false); // delete must be first
- } else {
- isAdvertised = true;
- BOOST_CHECK(isDeleted == true); // delete must be first
- }
- }
- }
-
- BOOST_CHECK(isDeleted);
- BOOST_CHECK(isAdvertised);
- BOOST_CHECK(count == 2);
-
- r1.close();
- delete fix;
- delete tm1;
- delete tm2;
- }
-
- // See QPID-2997
- QPID_AUTO_TEST_CASE(v2DuplicateErrorObj)
- {
- AgentFixture* fix = new AgentFixture(3, true);
- management::ManagementAgent* agent;
- agent = fix->getBrokerAgent();
-
- // turn off the expected error log message
- qpid::log::Options logOpts;
- logOpts.selectors.clear();
- logOpts.selectors.push_back("critical+");
- qpid::log::Logger::instance().configure(logOpts);
-
- // two objects, same ObjID
- TestManageable *tm1 = new TestManageable(agent, std::string("obj2"));
- TestManageable *tm2 = new TestManageable(agent, std::string("obj2"));
- // Keep a pointer to the ManagementObject. This test simulates a user-caused error
- // case (duplicate objects) where the broker has no choice but to leak a management
- // object (safest assumption). To prevent valgrind from flagging this leak, we
- // manually clean up the object at the end of the test.
- management::ManagementObject *save = tm2->GetManagementObject();
-
- Receiver r1 = fix->createV2DataIndRcvr(tm1->GetManagementObject()->getPackageName(), "#");
-
- // add, then immediately delete and re-add a copy of the object
- agent->addObject(tm1->GetManagementObject(), "testobj-1");
- agent->addObject(tm2->GetManagementObject(), "testobj-1");
-
- TestObjectVector objs;
- size_t count = 0;
- Message m1;
- while (r1.fetch(m1, Duration::SECOND * 6)) {
-
- decodeV2ObjectUpdates(m1, objs);
- BOOST_CHECK(objs.size() > 0);
-
- for (TestObjectVector::iterator oIter = objs.begin(); oIter != objs.end(); oIter++) {
- count++;
- TestManageable::validateTestObjectProperties(**oIter);
- }
- }
-
- BOOST_CHECK(count == 1); // only one should be accepted.
-
- r1.close();
- delete fix;
- delete tm1;
- delete tm2;
- delete save;
- }
-
- QPID_AUTO_TEST_SUITE_END()
- }
-}
-
-
diff --git a/cpp/src/tests/BrokerMgmtAgent.xml b/cpp/src/tests/BrokerMgmtAgent.xml
deleted file mode 100644
index 202b8debf3..0000000000
--- a/cpp/src/tests/BrokerMgmtAgent.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<schema package="org.apache.qpid.broker.mgmt.test">
-
-<!--
- 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.
--->
-
- <!--
- ===============================================================
- TestObject
- ===============================================================
- -->
- <class name="TestObject">
-
- A test object defined for the BrokerMgmtAgent unit test.
-
- <property name="string1" type="lstr" access="RW" index="y"/>
- <property name="bool1" type="bool" access="RW"/>
- <property name="map1" type="map" access="RW"/>
-
- </class>
-
-</schema>
-
diff --git a/cpp/src/tests/CMakeLists.txt b/cpp/src/tests/CMakeLists.txt
deleted file mode 100644
index 405718f12b..0000000000
--- a/cpp/src/tests/CMakeLists.txt
+++ /dev/null
@@ -1,356 +0,0 @@
-#
-# 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.
-#
-
-# Enable dashboard reporting.
-include (CTest)
-
-# Make sure that everything get built before the tests
-# Need to create a var with all the necessary top level targets
-
-add_definitions(-DBOOST_TEST_DYN_LINK)
-include_directories( ${CMAKE_CURRENT_SOURCE_DIR} )
-
-include (FindPythonInterp)
-
-# Create the environment scripts for tests
-set (abs_srcdir ${CMAKE_CURRENT_SOURCE_DIR})
-set (abs_builddir ${CMAKE_CURRENT_BINARY_DIR})
-set (abs_top_srcdir ${CMAKE_SOURCE_DIR})
-set (abs_top_builddir ${CMAKE_BINARY_DIR})
-set (builddir_lib_suffix "")
-configure_file (${CMAKE_CURRENT_SOURCE_DIR}/test_env.sh.in
- ${CMAKE_CURRENT_BINARY_DIR}/test_env.sh)
-
-
-# If valgrind is selected in the configuration step, set up the path to it
-# for CTest.
-if (ENABLE_VALGRIND)
- set (MEMORYCHECK_COMMAND ${VALGRIND})
- set (MEMORYCHECK_COMMAND_OPTIONS "--gen-suppressions=all
---leak-check=full
---demangle=yes
---suppressions=${CMAKE_CURRENT_SOURCE_DIR}/.valgrind.supp
---num-callers=25
---log-file=ctest_valgrind.vglog")
-endif (ENABLE_VALGRIND)
-
-# Using the Boost DLLs triggers warning 4275 on Visual Studio
-# (non dll-interface class used as base for dll-interface class).
-# This is ok, so suppress the warning.
-# Also, boost lengthy names trigger warning 4503, decorated name length exceeded
-# and using getenv() triggers insecure CRT warnings which we can silence in the
-# test environment.
-if (MSVC)
- add_definitions( /wd4275 /wd4503 /D_CRT_SECURE_NO_WARNINGS)
-endif (MSVC)
-
-# Like this to work with cmake 2.4 on Unix
-set (qpid_test_boost_libs
- ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY} ${Boost_SYSTEM_LIBRARY})
-
-# Macro to make it easier to remember where the tests are built
-macro(remember_location testname)
- set (${testname}_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/${testname}${CMAKE_EXECUTABLE_SUFFIX})
-endmacro(remember_location)
-
-# Windows uses some process-startup calls to ensure that errors, etc. don't
-# result in error boxes being thrown up. Since it's expected that most test
-# runs will be in scripts, the default is to force these outputs to stderr
-# instead of windows. If you want to remove this code, build without the
-# QPID_WINDOWS_DEFAULT_TEST_OUTPUTS ON.
-if (CMAKE_SYSTEM_NAME STREQUAL Windows)
- option(QPID_WINDOWS_DEFAULT_TEST_OUTPUTS "Use default error-handling on Windows tests" OFF)
- if (NOT QPID_WINDOWS_DEFAULT_TEST_OUTPUTS)
- set(platform_test_additions windows/DisableWin32ErrorWindows.cpp)
- endif (NOT QPID_WINDOWS_DEFAULT_TEST_OUTPUTS)
-endif (CMAKE_SYSTEM_NAME STREQUAL Windows)
-
-#
-# Unit test program
-#
-# Unit tests are built as a single program to reduce valgrind overhead
-# when running the tests. If you want to build a subset of the tests run
-# ccmake and set unit_tests_to_build to the set you want to build.
-
-set(unit_tests_to_build
- exception_test
- RefCounted
- SessionState
- logging
- AsyncCompletion
- Url
- Uuid
- Shlib
- FieldValue
- FieldTable
- Array
- QueueOptionsTest
- InlineAllocator
- InlineVector
- ClientSessionTest
- MessagingSessionTests
- SequenceSet
- StringUtils
- RangeSet
- AtomicValue
- QueueTest
- AccumulatedAckTest
- DtxWorkRecordTest
- DeliveryRecordTest
- ExchangeTest
- HeadersExchangeTest
- MessageTest
- QueueRegistryTest
- QueuePolicyTest
- QueueFlowLimitTest
- FramingTest
- HeaderTest
- SequenceNumberTest
- TimerTest
- TopicExchangeTest
- TxBufferTest
- TxPublishTest
- MessageBuilderTest
- ManagementTest
- MessageReplayTracker
- ConsoleTest
- QueueEvents
- ProxyTest
- RetryList
- RateFlowcontrolTest
- FrameDecoder
- ReplicationTest
- ClientMessageTest
- PollableCondition
- Variant
- ClientMessage
- ${xml_tests}
- CACHE STRING "Which unit tests to build"
- )
-
-mark_as_advanced(unit_tests_to_build)
-
-# Disabled till we move to amqp_0_10 codec.
-# amqp_0_10/serialize.cpp allSegmentTypes.h \
-# amqp_0_10/ProxyTemplate.cpp \
-# amqp_0_10/apply.cpp \
-# amqp_0_10/Map.cpp \
-# amqp_0_10/handlers.cpp
-
-add_executable (unit_test unit_test
- ${unit_tests_to_build} ${platform_test_additions})
-target_link_libraries (unit_test
- ${qpid_test_boost_libs}
- qpidmessaging qpidbroker qmfconsole)
-remember_location(unit_test)
-
-add_library (shlibtest MODULE shlibtest.cpp)
-
-if (BUILD_CLUSTER)
- include (cluster.cmake)
-endif (BUILD_CLUSTER)
-
-# FIXME aconway 2009-11-30: enable SSL
-#if SSL
-#include ssl.mk
-#endif
-
-#
-# Other test programs
-#
-add_executable (qpid-perftest qpid-perftest.cpp ${platform_test_additions})
-target_link_libraries (qpid-perftest qpidclient)
-#qpid_perftest_SOURCES=qpid-perftest.cpp test_tools.h TestOptions.h ConnectionOptions.h
-remember_location(qpid-perftest)
-
-add_executable (qpid-txtest qpid-txtest.cpp ${platform_test_additions})
-target_link_libraries (qpid-txtest qpidclient)
-#qpid_txtest_SOURCES=qpid-txtest.cpp TestOptions.h ConnectionOptions.h
-remember_location(qpid-txtest)
-
-add_executable (qpid-latency-test qpid-latency-test.cpp ${platform_test_additions})
-target_link_libraries (qpid-latency-test qpidclient)
-#qpid_latencytest_SOURCES=qpid-latency-test.cpp TestOptions.h ConnectionOptions.h
-remember_location(qpid-latency-test)
-
-add_executable (echotest echotest.cpp ${platform_test_additions})
-target_link_libraries (echotest qpidclient)
-#echotest_SOURCES=echotest.cpp TestOptions.h ConnectionOptions.h
-remember_location(echotest)
-
-add_executable (qpid-client-test qpid-client-test.cpp ${platform_test_additions})
-target_link_libraries (qpid-client-test qpidclient)
-#qpid_client_test_SOURCES=qpid-client-test.cpp TestOptions.h ConnectionOptions.h
-remember_location(qpid-client-test)
-
-add_executable (qpid-topic-listener qpid-topic-listener.cpp ${platform_test_additions})
-target_link_libraries (qpid-topic-listener qpidclient)
-#qpid_topic_listener_SOURCES=qpid-topic-listener.cpp TestOptions.h ConnectionOptions.h
-remember_location(qpid-topic-listener)
-
-add_executable (qpid-topic-publisher qpid-topic-publisher.cpp ${platform_test_additions})
-target_link_libraries (qpid-topic-publisher qpidclient)
-#qpid_topic_publisher_SOURCES=qpid-topic-publisher.cpp TestOptions.h ConnectionOptions.h
-remember_location(qpid-topic-publisher)
-
-add_executable (publish publish.cpp ${platform_test_additions})
-target_link_libraries (publish qpidclient)
-#publish_SOURCES=publish.cpp TestOptions.h ConnectionOptions.h
-remember_location(publish)
-
-add_executable (consume consume.cpp ${platform_test_additions})
-target_link_libraries (consume qpidclient)
-#consume_SOURCES=consume.cpp TestOptions.h ConnectionOptions.h
-remember_location(consume)
-
-add_executable (header_test header_test.cpp ${platform_test_additions})
-target_link_libraries (header_test qpidclient)
-#header_test_SOURCES=header_test.cpp TestOptions.h ConnectionOptions.h
-remember_location(header_test)
-
-add_executable (declare_queues declare_queues.cpp ${platform_test_additions})
-target_link_libraries (declare_queues qpidclient)
-remember_location(declare_queues)
-
-add_executable (replaying_sender replaying_sender.cpp ${platform_test_additions})
-target_link_libraries (replaying_sender qpidclient)
-remember_location(replaying_sender)
-
-add_executable (resuming_receiver resuming_receiver.cpp ${platform_test_additions})
-target_link_libraries (resuming_receiver qpidclient)
-remember_location(resuming_receiver)
-
-add_executable (txshift txshift.cpp ${platform_test_additions})
-target_link_libraries (txshift qpidclient)
-#txshift_SOURCES=txshift.cpp TestOptions.h ConnectionOptions.h
-remember_location(txshift)
-
-add_executable (txjob txjob.cpp ${platform_test_additions})
-target_link_libraries (txjob qpidclient)
-#txjob_SOURCES=txjob.cpp TestOptions.h ConnectionOptions.h
-remember_location(txjob)
-
-add_executable (receiver receiver.cpp ${platform_test_additions})
-target_link_libraries (receiver qpidclient)
-#receiver_SOURCES=receiver.cpp TestOptions.h ConnectionOptions.h
-remember_location(receiver)
-
-add_executable (sender sender.cpp Statistics.cpp ${platform_test_additions})
-target_link_libraries (sender qpidmessaging)
-#sender_SOURCES=sender.cpp TestOptions.h ConnectionOptions.h
-remember_location(sender)
-
-add_executable (qpid-receive qpid-receive.cpp Statistics.cpp ${platform_test_additions})
-target_link_libraries (qpid-receive qpidmessaging)
-remember_location(qpid-receive)
-
-add_executable (qpid-send qpid-send.cpp Statistics.cpp ${platform_test_additions})
-target_link_libraries (qpid-send qpidmessaging)
-remember_location(qpid-send)
-
-# qpid-perftest and qpid-latency-test are generally useful so install them
-install (TARGETS qpid-perftest qpid-latency-test RUNTIME
- DESTINATION ${QPID_INSTALL_BINDIR})
-
-if (CMAKE_SYSTEM_NAME STREQUAL Windows)
- set (ENV{OUTDIR} ${EXECUTABLE_OUTPUT_PATH})
- set (test_script_suffix ".ps1")
- set (shell "powershell")
-endif (CMAKE_SYSTEM_NAME STREQUAL Windows)
-
-set(test_wrap ${shell} ${CMAKE_CURRENT_SOURCE_DIR}/run_test${test_script_suffix})
-
-add_test (unit_test ${test_wrap} ${unit_test_LOCATION})
-add_test (start_broker ${shell} ${CMAKE_CURRENT_SOURCE_DIR}/start_broker${test_script_suffix})
-add_test (qpid-client-test ${test_wrap} ${qpid-client_test_LOCATION})
-add_test (quick_perftest ${test_wrap} ${qpid-perftest_LOCATION} --summary --count 100)
-add_test (quick_topictest ${test_wrap} ${CMAKE_CURRENT_SOURCE_DIR}/quick_topictest${test_script_suffix})
-add_test (quick_txtest ${test_wrap} ${qpid-txtest_LOCATION} --queues 4 --tx-count 10 --quiet)
-if (PYTHON_EXECUTABLE)
- add_test (run_header_test ${shell} ${CMAKE_CURRENT_SOURCE_DIR}/run_header_test${test_script_suffix})
- add_test (python_tests ${test_wrap} ${CMAKE_CURRENT_SOURCE_DIR}/python_tests${test_script_suffix})
-endif (PYTHON_EXECUTABLE)
-add_test (stop_broker ${shell} ${CMAKE_CURRENT_SOURCE_DIR}/stop_broker${test_script_suffix})
-if (PYTHON_EXECUTABLE)
- add_test (federation_tests ${shell} ${CMAKE_CURRENT_SOURCE_DIR}/run_federation_tests${test_script_suffix})
-if (BUILD_ACL)
- add_test (acl_tests ${shell} ${CMAKE_CURRENT_SOURCE_DIR}/run_acl_tests${test_script_suffix})
-endif (BUILD_ACL)
-add_test (dynamic_log_level_test ${shell} ${CMAKE_CURRENT_SOURCE_DIR}/dynamic_log_level_test${test_script_suffix})
-if (BUILD_MSSQL)
- add_test (store_tests ${shell} ${CMAKE_CURRENT_SOURCE_DIR}/run_store_tests${test_script_suffix} MSSQL)
-endif (BUILD_MSSQL)
-if (BUILD_MSCLFS)
- add_test (store_tests ${shell} ${CMAKE_CURRENT_SOURCE_DIR}/run_store_tests${test_script_suffix} MSSQL-CLFS)
-endif (BUILD_MSCLFS)
-endif (PYTHON_EXECUTABLE)
-
-add_library(test_store MODULE test_store.cpp)
-target_link_libraries (test_store qpidbroker qpidcommon)
-set_target_properties (test_store PROPERTIES PREFIX "")
-
-#EXTRA_DIST += \
-# run_test vg_check \
-# run-unit-tests start_broker python_tests stop_broker \
-# quick_topictest \
-# quick_perftest \
-# quick_txtest \
-# topictest \
-# run_header_test \
-# header_test.py \
-# ssl_test \
-# config.null \
-# ais_check \
-# run_federation_tests \
-# run_acl_tests \
-# .valgrind.supp \
-# MessageUtils.h \
-# TestMessageStore.h \
-# TxMocks.h \
-# start_cluster stop_cluster restart_cluster
-
-add_library (dlclose_noop MODULE dlclose_noop.c)
-#libdlclose_noop_la_LDFLAGS = -module -rpath $(abs_builddir)
-
-#CLEANFILES+=valgrind.out *.log *.vglog* dummy_test $(unit_wrappers)
-#
-## FIXME aconway 2008-05-23: Disabled interop_runner because it uses
-## the obsolete Channel class. Convert to Session and re-enable.
-##
-## check_PROGRAMS += interop_runner
-#
-## interop_runner_SOURCES = \
-## interop_runner.cpp \
-## SimpleTestCaseBase.cpp \
-## BasicP2PTest.cpp \
-## BasicPubSubTest.cpp \
-## SimpleTestCaseBase.h \
-## BasicP2PTest.h \
-## BasicPubSubTest.h \
-## TestCase.h \
-## TestOptions.h ConnectionOptions.h
-## interop_runner_LDADD = $(lib_client) $(lib_common) $(extra_libs)
-#
-#
-## Longer running stability tests, not run by default check: target.
-## Not run under valgrind, too slow
-#LONG_TESTS=fanout_perftest shared_perftest multiq_perftest topic_perftest run_failover_soak
-#EXTRA_DIST+=$(LONG_TESTS) run_perftest
-#check-long:
-# $(MAKE) check TESTS="start_broker $(LONG_TESTS) stop_broker" VALGRIND=
diff --git a/cpp/src/tests/ClientMessage.cpp b/cpp/src/tests/ClientMessage.cpp
deleted file mode 100644
index 994c46552c..0000000000
--- a/cpp/src/tests/ClientMessage.cpp
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- *
- * 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.
- *
- */
-#include <iostream>
-#include "qpid/messaging/Message.h"
-
-#include "unit_test.h"
-
-using namespace qpid::messaging;
-
-namespace qpid {
-namespace tests {
-
-QPID_AUTO_TEST_SUITE(ClientMessageSuite)
-
-QPID_AUTO_TEST_CASE(testCopyConstructor)
-{
- Message m("my-data");
- m.setSubject("my-subject");
- m.getProperties()["a"] = "ABC";
- Message c(m);
- BOOST_CHECK_EQUAL(m.getContent(), c.getContent());
- BOOST_CHECK_EQUAL(m.getSubject(), c.getSubject());
- BOOST_CHECK_EQUAL(m.getProperties()["a"], c.getProperties()["a"]);
-}
-
-QPID_AUTO_TEST_SUITE_END()
-
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/ClientMessageTest.cpp b/cpp/src/tests/ClientMessageTest.cpp
deleted file mode 100644
index f925f1c234..0000000000
--- a/cpp/src/tests/ClientMessageTest.cpp
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- *
- * 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.
- *
- */
-
-
-/**@file Unit tests for the client::Message class. */
-
-#include "unit_test.h"
-#include "qpid/client/Message.h"
-
-using namespace qpid::client;
-
-namespace qpid {
-namespace tests {
-
-QPID_AUTO_TEST_SUITE(ClientMessageTestSuite)
-
-QPID_AUTO_TEST_CASE(MessageCopyAssign) {
- // Verify that message has normal copy semantics.
- Message m("foo");
- BOOST_CHECK_EQUAL("foo", m.getData());
- Message c(m);
- BOOST_CHECK_EQUAL("foo", c.getData());
- Message a;
- BOOST_CHECK_EQUAL("", a.getData());
- a = m;
- BOOST_CHECK_EQUAL("foo", a.getData());
- a.setData("a");
- BOOST_CHECK_EQUAL("a", a.getData());
- c.setData("c");
- BOOST_CHECK_EQUAL("c", c.getData());
- BOOST_CHECK_EQUAL("foo", m.getData());
-}
-
-QPID_AUTO_TEST_SUITE_END()
-
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/ClientSessionTest.cpp b/cpp/src/tests/ClientSessionTest.cpp
deleted file mode 100644
index 939f8f2b88..0000000000
--- a/cpp/src/tests/ClientSessionTest.cpp
+++ /dev/null
@@ -1,677 +0,0 @@
-/*
- *
- * 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.
- *
- */
-#include "unit_test.h"
-#include "test_tools.h"
-#include "BrokerFixture.h"
-#include "qpid/client/QueueOptions.h"
-#include "qpid/client/MessageListener.h"
-#include "qpid/client/SubscriptionManager.h"
-#include "qpid/client/AsyncSession.h"
-#include "qpid/sys/Monitor.h"
-#include "qpid/sys/Thread.h"
-#include "qpid/sys/Runnable.h"
-#include "qpid/sys/Time.h"
-#include "qpid/client/Session.h"
-#include "qpid/client/Message.h"
-#include "qpid/framing/reply_exceptions.h"
-
-#include <boost/optional.hpp>
-#include <boost/lexical_cast.hpp>
-#include <boost/bind.hpp>
-#include <boost/ptr_container/ptr_vector.hpp>
-
-#include <vector>
-
-namespace qpid {
-namespace tests {
-
-QPID_AUTO_TEST_SUITE(ClientSessionTest)
-
-using namespace qpid::client;
-using namespace qpid::framing;
-using namespace qpid;
-using qpid::sys::Monitor;
-using qpid::sys::Thread;
-using qpid::sys::TIME_SEC;
-using qpid::broker::Broker;
-using std::string;
-using std::cout;
-using std::endl;
-
-
-struct DummyListener : public sys::Runnable, public MessageListener {
- std::vector<Message> messages;
- string name;
- uint expected;
- SubscriptionManager submgr;
-
- DummyListener(Session& session, const string& n, uint ex) :
- name(n), expected(ex), submgr(session) {}
-
- void run()
- {
- submgr.subscribe(*this, name);
- submgr.run();
- }
-
- void received(Message& msg)
- {
- messages.push_back(msg);
- if (--expected == 0) {
- submgr.stop();
- }
- }
-};
-
-struct SimpleListener : public MessageListener
-{
- Monitor lock;
- std::vector<Message> messages;
-
- void received(Message& msg)
- {
- Monitor::ScopedLock l(lock);
- messages.push_back(msg);
- lock.notifyAll();
- }
-
- void waitFor(const uint n)
- {
- Monitor::ScopedLock l(lock);
- while (messages.size() < n) {
- lock.wait();
- }
- }
-};
-
-struct ClientSessionFixture : public ProxySessionFixture
-{
- ClientSessionFixture(Broker::Options opts = Broker::Options()) : ProxySessionFixture(opts) {
- session.queueDeclare(arg::queue="my-queue");
- }
-};
-
-QPID_AUTO_TEST_CASE(testQueueQuery) {
- ClientSessionFixture fix;
- fix.session = fix.connection.newSession();
- fix.session.queueDeclare(arg::queue="q", arg::alternateExchange="amq.fanout",
- arg::exclusive=true, arg::autoDelete=true);
- QueueQueryResult result = fix.session.queueQuery("q");
- BOOST_CHECK_EQUAL(false, result.getDurable());
- BOOST_CHECK_EQUAL(true, result.getExclusive());
- BOOST_CHECK_EQUAL("amq.fanout", result.getAlternateExchange());
-}
-
-QPID_AUTO_TEST_CASE(testDispatcher)
-{
- ClientSessionFixture fix;
- fix.session =fix.connection.newSession();
- size_t count = 100;
- for (size_t i = 0; i < count; ++i)
- fix.session.messageTransfer(arg::content=Message(boost::lexical_cast<string>(i), "my-queue"));
- DummyListener listener(fix.session, "my-queue", count);
- listener.run();
- BOOST_CHECK_EQUAL(count, listener.messages.size());
- for (size_t i = 0; i < count; ++i)
- BOOST_CHECK_EQUAL(boost::lexical_cast<string>(i), listener.messages[i].getData());
-}
-
-QPID_AUTO_TEST_CASE(testDispatcherThread)
-{
- ClientSessionFixture fix;
- fix.session =fix.connection.newSession();
- size_t count = 10;
- DummyListener listener(fix.session, "my-queue", count);
- sys::Thread t(listener);
- for (size_t i = 0; i < count; ++i) {
- fix.session.messageTransfer(arg::content=Message(boost::lexical_cast<string>(i), "my-queue"));
- }
- t.join();
- BOOST_CHECK_EQUAL(count, listener.messages.size());
- for (size_t i = 0; i < count; ++i)
- BOOST_CHECK_EQUAL(boost::lexical_cast<string>(i), listener.messages[i].getData());
-}
-
-// FIXME aconway 2009-06-17: test for unimplemented feature, enable when implemented.
-void testSuspend0Timeout() {
- ClientSessionFixture fix;
- fix.session.suspend(); // session has 0 timeout.
- try {
- fix.connection.resume(fix.session);
- BOOST_FAIL("Expected InvalidArgumentException.");
- } catch(const InternalErrorException&) {}
-}
-
-QPID_AUTO_TEST_CASE(testUseSuspendedError)
-{
- ClientSessionFixture fix;
- fix.session.timeout(60);
- fix.session.suspend();
- try {
- fix.session.exchangeQuery(arg::exchange="amq.fanout");
- BOOST_FAIL("Expected session suspended exception");
- } catch(const NotAttachedException&) {}
-}
-
-// FIXME aconway 2009-06-17: test for unimplemented feature, enable when implemented.
-void testSuspendResume() {
- ClientSessionFixture fix;
- fix.session.timeout(60);
- fix.session.suspend();
- // Make sure we are still subscribed after resume.
- fix.connection.resume(fix.session);
- fix.session.messageTransfer(arg::content=Message("my-message", "my-queue"));
- BOOST_CHECK_EQUAL("my-message", fix.subs.get("my-queue", TIME_SEC).getData());
-}
-
-
-QPID_AUTO_TEST_CASE(testSendToSelf) {
- ClientSessionFixture fix;
- SimpleListener mylistener;
- fix.session.queueDeclare(arg::queue="myq", arg::exclusive=true, arg::autoDelete=true);
- fix.subs.subscribe(mylistener, "myq");
- sys::Thread runner(fix.subs);//start dispatcher thread
- string data("msg");
- Message msg(data, "myq");
- const uint count=10;
- for (uint i = 0; i < count; ++i) {
- fix.session.messageTransfer(arg::content=msg);
- }
- mylistener.waitFor(count);
- fix.subs.cancel("myq");
- fix.subs.stop();
- runner.join();
- fix.session.close();
- BOOST_CHECK_EQUAL(mylistener.messages.size(), count);
- for (uint j = 0; j < count; ++j) {
- BOOST_CHECK_EQUAL(mylistener.messages[j].getData(), data);
- }
-}
-
-QPID_AUTO_TEST_CASE(testLocalQueue) {
- ClientSessionFixture fix;
- fix.session.queueDeclare(arg::queue="lq", arg::exclusive=true, arg::autoDelete=true);
- LocalQueue lq;
- fix.subs.subscribe(lq, "lq", FlowControl(2, FlowControl::UNLIMITED, false));
- fix.session.messageTransfer(arg::content=Message("foo0", "lq"));
- fix.session.messageTransfer(arg::content=Message("foo1", "lq"));
- fix.session.messageTransfer(arg::content=Message("foo2", "lq"));
- BOOST_CHECK_EQUAL("foo0", lq.pop().getData());
- BOOST_CHECK_EQUAL("foo1", lq.pop().getData());
- BOOST_CHECK(lq.empty()); // Credit exhausted.
- fix.subs.getSubscription("lq").setFlowControl(FlowControl::unlimited());
- BOOST_CHECK_EQUAL("foo2", lq.pop().getData());
-}
-
-struct DelayedTransfer : sys::Runnable
-{
- ClientSessionFixture& fixture;
-
- DelayedTransfer(ClientSessionFixture& f) : fixture(f) {}
-
- void run()
- {
- qpid::sys::sleep(1);
- fixture.session.messageTransfer(arg::content=Message("foo2", "getq"));
- }
-};
-
-QPID_AUTO_TEST_CASE(testGet) {
- ClientSessionFixture fix;
- fix.session.queueDeclare(arg::queue="getq", arg::exclusive=true, arg::autoDelete=true);
- fix.session.messageTransfer(arg::content=Message("foo0", "getq"));
- fix.session.messageTransfer(arg::content=Message("foo1", "getq"));
- Message got;
- BOOST_CHECK(fix.subs.get(got, "getq", TIME_SEC));
- BOOST_CHECK_EQUAL("foo0", got.getData());
- BOOST_CHECK(fix.subs.get(got, "getq", TIME_SEC));
- BOOST_CHECK_EQUAL("foo1", got.getData());
- BOOST_CHECK(!fix.subs.get(got, "getq"));
- DelayedTransfer sender(fix);
- Thread t(sender);
- //test timed get where message shows up after a short delay
- BOOST_CHECK(fix.subs.get(got, "getq", 5*TIME_SEC));
- BOOST_CHECK_EQUAL("foo2", got.getData());
- t.join();
-}
-
-QPID_AUTO_TEST_CASE(testOpenFailure) {
- BrokerFixture b;
- Connection c;
- string host("unknowable-host");
- try {
- c.open(host);
- } catch (const Exception&) {
- BOOST_CHECK(!c.isOpen());
- }
- b.open(c);
- BOOST_CHECK(c.isOpen());
- c.close();
- BOOST_CHECK(!c.isOpen());
-}
-
-QPID_AUTO_TEST_CASE(testPeriodicExpiration) {
- Broker::Options opts;
- opts.queueCleanInterval = 1;
- ClientSessionFixture fix(opts);
- fix.session.queueDeclare(arg::queue="my-queue", arg::exclusive=true, arg::autoDelete=true);
-
- for (uint i = 0; i < 10; i++) {
- Message m((boost::format("Message_%1%") % (i+1)).str(), "my-queue");
- if (i % 2) m.getDeliveryProperties().setTtl(500);
- fix.session.messageTransfer(arg::content=m);
- }
-
- BOOST_CHECK_EQUAL(fix.session.queueQuery(string("my-queue")).getMessageCount(), 10u);
- qpid::sys::sleep(2);
- BOOST_CHECK_EQUAL(fix.session.queueQuery(string("my-queue")).getMessageCount(), 5u);
-}
-
-QPID_AUTO_TEST_CASE(testExpirationOnPop) {
- ClientSessionFixture fix;
- fix.session.queueDeclare(arg::queue="my-queue", arg::exclusive=true, arg::autoDelete=true);
-
- for (uint i = 0; i < 10; i++) {
- Message m((boost::format("Message_%1%") % (i+1)).str(), "my-queue");
- if (i % 2) m.getDeliveryProperties().setTtl(200);
- fix.session.messageTransfer(arg::content=m);
- }
-
- qpid::sys::usleep(300* 1000);
-
- for (uint i = 0; i < 10; i++) {
- if (i % 2) continue;
- Message m;
- BOOST_CHECK(fix.subs.get(m, "my-queue", TIME_SEC));
- BOOST_CHECK_EQUAL((boost::format("Message_%1%") % (i+1)).str(), m.getData());
- }
-}
-
-QPID_AUTO_TEST_CASE(testRelease) {
- ClientSessionFixture fix;
-
- const uint count=10;
- for (uint i = 0; i < count; i++) {
- Message m((boost::format("Message_%1%") % (i+1)).str(), "my-queue");
- fix.session.messageTransfer(arg::content=m);
- }
-
- fix.subs.setAutoStop(false);
- fix.subs.start();
- SubscriptionSettings settings;
- settings.autoAck = 0;
-
- SimpleListener l1;
- Subscription s1 = fix.subs.subscribe(l1, "my-queue", settings);
- l1.waitFor(count);
- s1.cancel();
-
- for (uint i = 0; i < count; i++) {
- BOOST_CHECK_EQUAL((boost::format("Message_%1%") % (i+1)).str(), l1.messages[i].getData());
- }
- s1.release(s1.getUnaccepted());
-
- //check that released messages are redelivered
- settings.autoAck = 1;
- SimpleListener l2;
- Subscription s2 = fix.subs.subscribe(l2, "my-queue", settings);
- l2.waitFor(count);
- for (uint i = 0; i < count; i++) {
- BOOST_CHECK_EQUAL((boost::format("Message_%1%") % (i+1)).str(), l2.messages[i].getData());
- }
-
- fix.subs.stop();
- fix.subs.wait();
- fix.session.close();
-}
-
-QPID_AUTO_TEST_CASE(testCompleteOnAccept) {
- ClientSessionFixture fix;
- const uint count = 8;
- const uint chunk = 4;
- for (uint i = 0; i < count; i++) {
- Message m((boost::format("Message_%1%") % (i+1)).str(), "my-queue");
- fix.session.messageTransfer(arg::content=m);
- }
-
- SubscriptionSettings settings;
- settings.autoAck = 0;
- settings.completionMode = COMPLETE_ON_ACCEPT;
- settings.flowControl = FlowControl::messageWindow(chunk);
-
- LocalQueue q;
- Subscription s = fix.subs.subscribe(q, "my-queue", settings);
- fix.session.messageFlush(arg::destination=s.getName());
- SequenceSet accepted;
- for (uint i = 0; i < chunk; i++) {
- Message m;
- BOOST_CHECK(q.get(m));
- BOOST_CHECK_EQUAL((boost::format("Message_%1%") % (i+1)).str(), m.getData());
- accepted.add(m.getId());
- }
- Message m;
- BOOST_CHECK(!q.get(m));
-
- s.accept(accepted);
- fix.session.messageFlush(arg::destination=s.getName());
- accepted.clear();
-
- for (uint i = chunk; i < count; i++) {
- Message m;
- BOOST_CHECK(q.get(m));
- BOOST_CHECK_EQUAL((boost::format("Message_%1%") % (i+1)).str(), m.getData());
- accepted.add(m.getId());
- }
- fix.session.messageAccept(accepted);
-}
-
-namespace
-{
-struct Publisher : qpid::sys::Runnable
-{
- AsyncSession session;
- Message message;
- uint count;
- Thread thread;
-
- Publisher(Connection& con, Message m, uint c) : session(con.newSession()), message(m), count(c) {}
-
- void start()
- {
- thread = Thread(*this);
- }
-
- void join()
- {
- thread.join();
- }
-
- void run()
- {
- for (uint i = 0; i < count; i++) {
- session.messageTransfer(arg::content=message);
- }
- session.sync();
- session.close();
- }
-};
-}
-
-QPID_AUTO_TEST_CASE(testConcurrentSenders)
-{
- //Ensure concurrent publishing sessions on a connection don't
- //cause assertions, deadlocks or other undesirables:
- BrokerFixture fix;
- Connection connection;
- ConnectionSettings settings;
- settings.maxFrameSize = 1024;
- settings.port = fix.broker->getPort(qpid::broker::Broker::TCP_TRANSPORT);
- connection.open(settings);
- AsyncSession session = connection.newSession();
- Message message(string(512, 'X'));
-
- boost::ptr_vector<Publisher> publishers;
- for (size_t i = 0; i < 5; i++) {
- publishers.push_back(new Publisher(connection, message, 100));
- }
- std::for_each(publishers.begin(), publishers.end(), boost::bind(&Publisher::start, _1));
- std::for_each(publishers.begin(), publishers.end(), boost::bind(&Publisher::join, _1));
- connection.close();
-}
-
-
-QPID_AUTO_TEST_CASE(testExclusiveSubscribe)
-{
- ClientSessionFixture fix;
- fix.session.queueDeclare(arg::queue="myq", arg::exclusive=true, arg::autoDelete=true);
- SubscriptionSettings settings;
- settings.exclusive = true;
- LocalQueue q;
- fix.subs.subscribe(q, "myq", settings, "first");
- //attempt to create new subscriber should fail
- ScopedSuppressLogging sl;
- BOOST_CHECK_THROW(fix.subs.subscribe(q, "myq", "second"), ResourceLockedException);
- ;
-
-}
-
-QPID_AUTO_TEST_CASE(testExclusiveBinding) {
- FieldTable options;
- options.setString("qpid.exclusive-binding", "anything");
- ClientSessionFixture fix;
- fix.session.queueDeclare(arg::queue="queue-1", arg::exclusive=true, arg::autoDelete=true);
- fix.session.queueDeclare(arg::queue="queue-2", arg::exclusive=true, arg::autoDelete=true);
- fix.session.exchangeBind(arg::exchange="amq.direct", arg::queue="queue-1", arg::bindingKey="my-key", arg::arguments=options);
- fix.session.messageTransfer(arg::destination="amq.direct", arg::content=Message("message1", "my-key"));
- fix.session.exchangeBind(arg::exchange="amq.direct", arg::queue="queue-2", arg::bindingKey="my-key", arg::arguments=options);
- fix.session.messageTransfer(arg::destination="amq.direct", arg::content=Message("message2", "my-key"));
-
- Message got;
- BOOST_CHECK(fix.subs.get(got, "queue-1"));
- BOOST_CHECK_EQUAL("message1", got.getData());
- BOOST_CHECK(!fix.subs.get(got, "queue-1"));
-
- BOOST_CHECK(fix.subs.get(got, "queue-2"));
- BOOST_CHECK_EQUAL("message2", got.getData());
- BOOST_CHECK(!fix.subs.get(got, "queue-2"));
-}
-
-QPID_AUTO_TEST_CASE(testResubscribeWithLocalQueue) {
- ClientSessionFixture fix;
- fix.session.queueDeclare(arg::queue="some-queue", arg::exclusive=true, arg::autoDelete=true);
- LocalQueue p, q;
- fix.subs.subscribe(p, "some-queue");
- fix.subs.cancel("some-queue");
- fix.subs.subscribe(q, "some-queue");
-
- fix.session.messageTransfer(arg::content=Message("some-data", "some-queue"));
- fix.session.messageFlush(arg::destination="some-queue");
-
- Message got;
- BOOST_CHECK(!p.get(got));
-
- BOOST_CHECK(q.get(got));
- BOOST_CHECK_EQUAL("some-data", got.getData());
- BOOST_CHECK(!q.get(got));
-}
-
-QPID_AUTO_TEST_CASE(testReliableDispatch) {
- ClientSessionFixture fix;
- std::string queue("a-queue");
- fix.session.queueDeclare(arg::queue=queue, arg::autoDelete=true);
-
- ConnectionSettings settings;
- settings.port = fix.broker->getPort(qpid::broker::Broker::TCP_TRANSPORT);
-
- Connection c1;
- c1.open(settings);
- Session s1 = c1.newSession();
- SubscriptionManager subs1(s1);
- LocalQueue q1;
- subs1.subscribe(q1, queue, FlowControl());//first subscriber has no credit
-
- Connection c2;
- c2.open(settings);
- Session s2 = c2.newSession();
- SubscriptionManager subs2(s2);
- LocalQueue q2;
- subs2.subscribe(q2, queue);//second subscriber has credit
-
- fix.session.messageTransfer(arg::content=Message("my-message", queue));
-
- //check that the second consumer gets the message
- Message got;
- BOOST_CHECK(q2.get(got, 1*TIME_SEC));
- BOOST_CHECK_EQUAL("my-message", got.getData());
-
- c1.close();
- c2.close();
-}
-
-QPID_AUTO_TEST_CASE(testSessionCloseOnInvalidSession) {
- Session session;
- session.close();
-}
-
-QPID_AUTO_TEST_CASE(testLVQVariedSize) {
- ClientSessionFixture fix;
- std::string queue("my-lvq");
- QueueOptions args;
- args.setOrdering(LVQ_NO_BROWSE);
- fix.session.queueDeclare(arg::queue=queue, arg::exclusive=true, arg::autoDelete=true, arg::arguments=args);
-
- std::string key;
- args.getLVQKey(key);
-
- for (size_t i = 0; i < 10; i++) {
- std::ostringstream data;
- size_t size = 100 - ((i % 10) * 10);
- data << std::string(size, 'x');
-
- Message m(data.str(), queue);
- m.getHeaders().setString(key, "abc");
- fix.session.messageTransfer(arg::content=m);
- }
-}
-
-QPID_AUTO_TEST_CASE(testSessionManagerSetFlowControl) {
- ClientSessionFixture fix;
- std::string name("dummy");
- LocalQueue queue;
- SubscriptionSettings settings;
- settings.flowControl = FlowControl();
- fix.session.queueDeclare(arg::queue=name, arg::exclusive=true, arg::autoDelete=true);
- fix.subs.subscribe(queue, name, settings);
- fix.session.messageTransfer(arg::content=Message("my-message", name));
- fix.subs.setFlowControl(name, 1, FlowControl::UNLIMITED, false);
- fix.session.messageFlush(name);
- Message got;
- BOOST_CHECK(queue.get(got, 0));
- BOOST_CHECK_EQUAL("my-message", got.getData());
-}
-
-QPID_AUTO_TEST_CASE(testGetThenSubscribe) {
- ClientSessionFixture fix;
- std::string name("myqueue");
- fix.session.queueDeclare(arg::queue=name, arg::exclusive=true, arg::autoDelete=true);
- fix.session.messageTransfer(arg::content=Message("one", name));
- fix.session.messageTransfer(arg::content=Message("two", name));
- Message got;
- BOOST_CHECK(fix.subs.get(got, name));
- BOOST_CHECK_EQUAL("one", got.getData());
-
- DummyListener listener(fix.session, name, 1);
- listener.run();
- BOOST_CHECK_EQUAL(1u, listener.messages.size());
- if (!listener.messages.empty()) {
- BOOST_CHECK_EQUAL("two", listener.messages[0].getData());
- }
-}
-
-QPID_AUTO_TEST_CASE(testSessionIsValid) {
- ClientSessionFixture fix;
- BOOST_CHECK(fix.session.isValid());
- Session session;
- BOOST_CHECK(!session.isValid());
-}
-
-QPID_AUTO_TEST_CASE(testExpirationNotAltered) {
- ClientSessionFixture fix;
- fix.session.queueDeclare(arg::queue="my-queue", arg::exclusive=true, arg::autoDelete=true);
-
- Message m("my-message", "my-queue");
- m.getDeliveryProperties().setTtl(60000);
- m.getDeliveryProperties().setExpiration(12345);
- fix.session.messageTransfer(arg::content=m);
- Message got;
- BOOST_CHECK(fix.subs.get(got, "my-queue"));
- BOOST_CHECK_EQUAL("my-message", got.getData());
- BOOST_CHECK_EQUAL(12345u, got.getDeliveryProperties().getExpiration());
-}
-
-QPID_AUTO_TEST_CASE(testGetConnectionFromSession) {
- ClientSessionFixture fix;
- FieldTable options;
- options.setInt("no-local", 1);
- fix.session.queueDeclare(arg::queue="a", arg::exclusive=true, arg::autoDelete=true, arg::arguments=options);
- fix.session.queueDeclare(arg::queue="b", arg::exclusive=true, arg::autoDelete=true);
-
- Connection c = fix.session.getConnection();
- Session s = c.newSession();
- //If this new session was created as expected on the same connection as
- //fix.session, then the no-local behaviour means that queue 'a'
- //will not enqueue messages from this new session but queue 'b'
- //will.
- s.messageTransfer(arg::content=Message("a", "a"));
- s.messageTransfer(arg::content=Message("b", "b"));
-
- Message got;
- BOOST_CHECK(fix.subs.get(got, "b"));
- BOOST_CHECK_EQUAL("b", got.getData());
- BOOST_CHECK(!fix.subs.get(got, "a"));
-}
-
-
-QPID_AUTO_TEST_CASE(testQueueDeleted)
-{
- ClientSessionFixture fix;
- fix.session.queueDeclare(arg::queue="my-queue");
- LocalQueue queue;
- fix.subs.subscribe(queue, "my-queue");
-
- ScopedSuppressLogging sl;
- fix.session.queueDelete(arg::queue="my-queue");
- BOOST_CHECK_THROW(queue.get(1*qpid::sys::TIME_SEC), qpid::framing::ResourceDeletedException);
-}
-
-QPID_AUTO_TEST_CASE(testTtl)
-{
- const uint64_t ms = 1000ULL; // convert sec to ms
- const uint64_t us = 1000ULL * 1000ULL; // convert sec to us
-
- ClientSessionFixture fix;
- fix.session.queueDeclare(arg::queue="ttl-test", arg::exclusive=true, arg::autoDelete=true);
- Message msg1 = Message("AAA", "ttl-test");
- uint64_t ttl = 2 * ms; // 2 sec
- msg1.getDeliveryProperties().setTtl(ttl);
- Connection c = fix.session.getConnection();
- Session s = c.newSession();
- s.messageTransfer(arg::content=msg1);
-
- Message msg2 = Message("BBB", "ttl-test");
- ttl = 10 * ms; // 10 sec
- msg2.getDeliveryProperties().setTtl(ttl);
- s.messageTransfer(arg::content=msg2);
-
- qpid::sys::usleep(5 * us); // 5 sec
-
- // Message "AAA" should be expired and never be delivered
- // Check "BBB" has ttl somewhere between 1 and 5 secs
- Message got;
- BOOST_CHECK(fix.subs.get(got, "ttl-test"));
- BOOST_CHECK_EQUAL("BBB", got.getData());
- BOOST_CHECK(got.getDeliveryProperties().getTtl() > 1 * ms);
- BOOST_CHECK(got.getDeliveryProperties().getTtl() < ttl - (5 * ms));
-}
-
-QPID_AUTO_TEST_SUITE_END()
-
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/ClusterFailover.cpp b/cpp/src/tests/ClusterFailover.cpp
deleted file mode 100644
index bf5c147f19..0000000000
--- a/cpp/src/tests/ClusterFailover.cpp
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- *
- * 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.
- *
- */
-
-/**@file Tests for partial failure in a cluster.
- * Partial failure means some nodes experience a failure while others do not.
- * In this case the failed nodes must shut down.
- */
-
-#include "test_tools.h"
-#include "unit_test.h"
-#include "ClusterFixture.h"
-#include "qpid/client/FailoverManager.h"
-#include <boost/assign.hpp>
-#include <boost/algorithm/string.hpp>
-#include <boost/bind.hpp>
-
-namespace qpid {
-namespace tests {
-
-QPID_AUTO_TEST_SUITE(ClusterFailoverTestSuite)
-
-using namespace std;
-using namespace qpid;
-using namespace qpid::cluster;
-using namespace qpid::framing;
-using namespace qpid::client;
-using namespace qpid::client::arg;
-using namespace boost::assign;
-using broker::Broker;
-using boost::shared_ptr;
-
-// Timeout for tests that wait for messages
-const sys::Duration TIMEOUT=sys::TIME_SEC/4;
-
-ClusterFixture::Args getArgs(bool durable=std::getenv("STORE_LIB"))
-{
- ClusterFixture::Args args;
- args += "--auth", "no", "--no-module-dir",
- "--load-module", getLibPath("CLUSTER_LIB");
- if (durable)
- args += "--load-module", getLibPath("STORE_LIB"), "TMP_DATA_DIR";
- else
- args += "--no-data-dir";
- return args;
-}
-
-// Test re-connecting with same session name after a failure.
-QPID_AUTO_TEST_CASE(testReconnectSameSessionName) {
- ClusterFixture cluster(2, getArgs(), -1);
- // Specify a timeout to make sure it is ignored, session resume is
- // not implemented so sessions belonging to dead brokers should
- // not be kept.
- Client c0(cluster[0], "foo", 5);
- BOOST_CHECK_EQUAL(2u, knownBrokerPorts(c0.connection, 2).size()); // wait for both.
- c0.session.queueDeclare("q");
- c0.session.messageTransfer(arg::content=Message("sendme", "q"));
- BOOST_CHECK_EQUAL(c0.subs.get("q").getData(), "sendme");
- cluster.killWithSilencer(0, c0.connection, 9);
- Client c1(cluster[1], "foo", 5);
- c1.session.queueQuery(); // Try to use the session.
-}
-
-QPID_AUTO_TEST_CASE(testReconnectExclusiveQueue) {
- // Regresion test. Session timeouts should be ignored
- // by the broker as session resume is not implemented.
- ClusterFixture cluster(2, getArgs(), -1);
- Client c0(cluster[0], "foo", 5);
- c0.session.queueDeclare("exq", arg::exclusive=true);
- SubscriptionSettings settings;
- settings.exclusive = true;
- settings.autoAck = 0;
- Subscription s0 = c0.subs.subscribe(c0.lq, "exq", settings, "exsub");
- c0.session.messageTransfer(arg::content=Message("sendme", "exq"));
- BOOST_CHECK_EQUAL(c0.lq.get().getData(), "sendme");
-
- // Regression: core dump on exit if unacked messages were left in
- // a session with a timeout.
- cluster.killWithSilencer(0, c0.connection);
-
- // Regression: session timeouts prevented re-connecting to
- // exclusive queue.
- Client c1(cluster[1]);
- c1.session.queueDeclare("exq", arg::exclusive=true);
- Subscription s1 = c1.subs.subscribe(c1.lq, "exq", settings, "exsub");
- s1.cancel();
-
- // Regression: session timeouts prevented new member joining
- // cluster with exclusive queues.
- cluster.add();
- Client c2(cluster[2]);
- c2.session.queueQuery();
-}
-
-
-QPID_AUTO_TEST_SUITE_END()
-
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/ClusterFixture.cpp b/cpp/src/tests/ClusterFixture.cpp
deleted file mode 100644
index 6b62cb6fc7..0000000000
--- a/cpp/src/tests/ClusterFixture.cpp
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- *
- * 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 "test_tools.h"
-#include "unit_test.h"
-#include "ForkedBroker.h"
-#include "BrokerFixture.h"
-
-#include "qpid/client/Connection.h"
-#include "qpid/client/ConnectionAccess.h"
-#include "qpid/client/Session.h"
-#include "qpid/client/FailoverListener.h"
-#include "qpid/cluster/Cluster.h"
-#include "qpid/cluster/Cpg.h"
-#include "qpid/cluster/UpdateClient.h"
-#include "qpid/framing/AMQBody.h"
-#include "qpid/framing/Uuid.h"
-#include "qpid/framing/reply_exceptions.h"
-#include "qpid/framing/enum.h"
-#include "qpid/log/Logger.h"
-
-#include <boost/bind.hpp>
-#include <boost/shared_ptr.hpp>
-#include <boost/assign.hpp>
-
-#include <string>
-#include <iostream>
-#include <iterator>
-#include <vector>
-#include <set>
-#include <algorithm>
-#include <iterator>
-
-
-using namespace std;
-using namespace qpid;
-using namespace qpid::cluster;
-using namespace qpid::framing;
-using namespace qpid::client;
-using qpid::sys::TIME_SEC;
-using qpid::broker::Broker;
-using boost::shared_ptr;
-using qpid::cluster::Cluster;
-using boost::assign::list_of;
-
-
-#include "ClusterFixture.h"
-
-namespace qpid {
-namespace tests {
-
-ClusterFixture::ClusterFixture(size_t n, const Args& args_, int localIndex_)
- : name(Uuid(true).str()), localIndex(localIndex_), userArgs(args_)
-{
- add(n);
-}
-
-ClusterFixture::ClusterFixture(size_t n, boost::function<void (Args&, size_t)> updateArgs_, int localIndex_)
- : name(Uuid(true).str()), localIndex(localIndex_), updateArgs(updateArgs_)
-{
- add(n);
-}
-
-ClusterFixture::Args ClusterFixture::makeArgs(const std::string& prefix, size_t index) {
- Args args = list_of<string>("qpidd ")
- ("--cluster-name")(name)
- ("--log-prefix")(prefix);
- args.insert(args.end(), userArgs.begin(), userArgs.end());
- if (updateArgs) updateArgs(args, index);
- return args;
-}
-
-void ClusterFixture::add() {
- if (size() != size_t(localIndex)) { // fork a broker process.
- std::ostringstream os; os << "fork" << size();
- std::string prefix = os.str();
- forkedBrokers.push_back(shared_ptr<ForkedBroker>(new ForkedBroker(makeArgs(prefix, size()))));
- push_back(forkedBrokers.back()->getPort());
- }
- else { // Run in this process
- addLocal();
- }
-}
-
-namespace {
-/** Parse broker & cluster options */
-Broker::Options parseOpts(size_t argc, const char* argv[]) {
- Broker::Options opts;
- Plugin::addOptions(opts); // Pick up cluster options.
- opts.parse(argc, argv, "", true); // Allow-unknown for --load-module
- return opts;
-}
-}
-
-void ClusterFixture::addLocal() {
- assert(int(size()) == localIndex);
- ostringstream os; os << "local" << localIndex;
- string prefix = os.str();
- Args args(makeArgs(prefix, localIndex));
- vector<const char*> argv(args.size());
- transform(args.begin(), args.end(), argv.begin(), boost::bind(&string::c_str, _1));
- qpid::log::Logger::instance().setPrefix(prefix);
- localBroker.reset(new BrokerFixture(parseOpts(argv.size(), &argv[0])));
- push_back(localBroker->getPort());
- forkedBrokers.push_back(shared_ptr<ForkedBroker>());
-}
-
-bool ClusterFixture::hasLocal() const { return localIndex >= 0 && size_t(localIndex) < size(); }
-
-/** Kill a forked broker with sig, or shutdown localBroker if n==0. */
-void ClusterFixture::kill(size_t n, int sig) {
- if (n == size_t(localIndex))
- localBroker->broker->shutdown();
- else
- forkedBrokers[n]->kill(sig);
-}
-
-/** Kill a broker and suppress errors from closing connection c. */
-void ClusterFixture::killWithSilencer(size_t n, client::Connection& c, int sig) {
- ScopedSuppressLogging sl;
- try { c.close(); } catch(...) {}
- kill(n,sig);
-}
-
-/**
- * Get the known broker ports from a Connection.
- *@param n if specified wait for the cluster size to be n, up to a timeout.
- */
-std::set<int> knownBrokerPorts(qpid::client::Connection& c, int n) {
- FailoverListener fl(c, false);
- std::vector<qpid::Url> urls = fl.getKnownBrokers();
- if (n >= 0 && unsigned(n) != urls.size()) {
- // Retry up to 10 secs in .1 second intervals.
- for (size_t retry=100; urls.size() != unsigned(n) && retry != 0; --retry) {
- qpid::sys::usleep(1000*100); // 0.1 secs
- urls = fl.getKnownBrokers();
- }
- }
- std::set<int> s;
- for (std::vector<qpid::Url>::const_iterator i = urls.begin(); i != urls.end(); ++i)
- s.insert((*i)[0].port);
- return s;
-}
-
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/ClusterFixture.h b/cpp/src/tests/ClusterFixture.h
deleted file mode 100644
index f548ff9376..0000000000
--- a/cpp/src/tests/ClusterFixture.h
+++ /dev/null
@@ -1,115 +0,0 @@
-#ifndef CLUSTER_FIXTURE_H
-#define CLUSTER_FIXTURE_H
-
-/*
- *
- * 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 "test_tools.h"
-#include "unit_test.h"
-#include "ForkedBroker.h"
-#include "BrokerFixture.h"
-
-#include "qpid/client/Connection.h"
-#include "qpid/client/ConnectionAccess.h"
-#include "qpid/client/Session.h"
-#include "qpid/client/FailoverListener.h"
-#include "qpid/cluster/Cluster.h"
-#include "qpid/cluster/Cpg.h"
-#include "qpid/cluster/UpdateClient.h"
-#include "qpid/framing/AMQBody.h"
-#include "qpid/framing/Uuid.h"
-#include "qpid/framing/reply_exceptions.h"
-#include "qpid/framing/enum.h"
-#include "qpid/log/Logger.h"
-
-#include <boost/bind.hpp>
-#include <boost/function.hpp>
-#include <boost/shared_ptr.hpp>
-
-#include <string>
-#include <iostream>
-#include <iterator>
-#include <vector>
-#include <set>
-#include <algorithm>
-#include <iterator>
-
-
-using namespace std;
-using namespace qpid;
-using namespace qpid::cluster;
-using namespace qpid::framing;
-using namespace qpid::client;
-using qpid::sys::TIME_SEC;
-using qpid::broker::Broker;
-using boost::shared_ptr;
-using qpid::cluster::Cluster;
-
-namespace qpid {
-namespace tests {
-
-/** Cluster fixture is a vector of ports for the replicas.
- *
- * At most one replica (by default replica 0) is in the current
- * process, all others are forked as children.
- */
-class ClusterFixture : public vector<uint16_t> {
- public:
- typedef std::vector<std::string> Args;
-
- /** @param localIndex can be -1 meaning don't automatically start a local broker.
- * A local broker can be started with addLocal().
- */
- ClusterFixture(size_t n, const Args& args, int localIndex=-1);
-
- /**@param updateArgs function is passed the index of the cluster member and can update the arguments. */
- ClusterFixture(size_t n, boost::function<void (Args&, size_t)> updateArgs, int localIndex=-1);
-
- void add(size_t n) { for (size_t i=0; i < n; ++i) add(); }
- void add(); // Add a broker.
- void setup();
-
- bool hasLocal() const;
-
- /** Kill a forked broker with sig, or shutdown localBroker. */
- void kill(size_t n, int sig=SIGINT);
-
- /** Kill a broker and suppress errors from closing connection c. */
- void killWithSilencer(size_t n, client::Connection& c, int sig=SIGINT);
-
- private:
-
- void addLocal(); // Add a local broker.
- Args makeArgs(const std::string& prefix, size_t index);
- string name;
- std::auto_ptr<BrokerFixture> localBroker;
- int localIndex;
- std::vector<shared_ptr<ForkedBroker> > forkedBrokers;
- Args userArgs;
- boost::function<void (Args&, size_t)> updateArgs;
-};
-
-/**
- * Get the known broker ports from a Connection.
- *@param n if specified wait for the cluster size to be n, up to a timeout.
- */
-std::set<int> knownBrokerPorts(qpid::client::Connection& source, int n=-1);
-
-}} // namespace qpid::tests
-
-#endif /*!CLUSTER_FIXTURE_H*/
diff --git a/cpp/src/tests/ConnectionOptions.h b/cpp/src/tests/ConnectionOptions.h
deleted file mode 100644
index fe945e9ddd..0000000000
--- a/cpp/src/tests/ConnectionOptions.h
+++ /dev/null
@@ -1,62 +0,0 @@
-#ifndef QPID_CLIENT_CONNECTIONOPTIONS_H
-#define QPID_CLIENT_CONNECTIONOPTIONS_H
-
-/*
- *
- * 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.
- *
- */
-
-#include "qpid/client/ConnectionSettings.h"
-#include "qpid/Options.h"
-
-namespace qpid {
-
-/**
- * Options parser for ConnectionOptions.
- */
-struct ConnectionOptions : public qpid::Options,
- public qpid::client::ConnectionSettings
-{
- ConnectionOptions() : qpid::Options("Connection Settings")
- {
- using namespace qpid;
- addOptions()
- ("broker,b", optValue(host, "HOST"), "Broker host to connect to")
- ("port,p", optValue(port, "PORT"), "Broker port to connect to")
- ("protocol,P", optValue(protocol, "tcp|ssl|rdma"), "Protocol to use for broker connection")
- ("virtualhost,v", optValue(virtualhost, "VHOST"), "virtual host")
- ("username", optValue(username, "USER"), "user name for broker log in.")
- ("password", optValue(password, "PASSWORD"), "password for broker log in.")
- ("mechanism", optValue(mechanism, "MECH"), "SASL mechanism to use when authenticating.")
- ("locale", optValue(locale, "LOCALE"), "locale to use.")
- ("max-channels", optValue(maxChannels, "N"), "the maximum number of channels the client requires.")
- ("heartbeat", optValue(heartbeat, "N"), "Desired heartbeat interval in seconds.")
- ("max-frame-size", optValue(maxFrameSize, "N"), "the maximum frame size to request.")
- ("bounds-multiplier", optValue(bounds, "N"),
- "bound size of write queue (as a multiple of the max frame size).")
- ("tcp-nodelay", optValue(tcpNoDelay), "Turn on tcp-nodelay")
- ("service", optValue(service, "SERVICE-NAME"), "SASL service name.")
- ("min-ssf", optValue(minSsf, "N"), "Minimum acceptable strength for SASL security layer")
- ("max-ssf", optValue(maxSsf, "N"), "Maximum acceptable strength for SASL security layer");
- }
-};
-
-} // namespace qpid
-
-#endif /*!QPID_CLIENT_CONNECTIONOPTIONS_H*/
diff --git a/cpp/src/tests/ConsoleTest.cpp b/cpp/src/tests/ConsoleTest.cpp
deleted file mode 100644
index 107472ed9e..0000000000
--- a/cpp/src/tests/ConsoleTest.cpp
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- *
- * 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.
- *
- */
-
-#include "qpid/console/Package.h"
-#include "qpid/console/ClassKey.h"
-#include "unit_test.h"
-
-namespace qpid {
-namespace tests {
-
-QPID_AUTO_TEST_SUITE(ConsoleTestSuite)
-
-using namespace qpid::framing;
-using namespace qpid::console;
-
-QPID_AUTO_TEST_CASE(testClassKey) {
- uint8_t hash[16] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
- ClassKey k("com.redhat.test", "class", hash);
-
- BOOST_CHECK_EQUAL(k.getPackageName(), "com.redhat.test");
- BOOST_CHECK_EQUAL(k.getClassName(), "class");
- BOOST_CHECK_EQUAL(k.getHashString(), "00010203-04050607-08090a0b-0c0d0e0f");
- BOOST_CHECK_EQUAL(k.str(), "com.redhat.test:class(00010203-04050607-08090a0b-0c0d0e0f)");
-}
-
-QPID_AUTO_TEST_SUITE_END()
-
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/DeliveryRecordTest.cpp b/cpp/src/tests/DeliveryRecordTest.cpp
deleted file mode 100644
index f7013014ff..0000000000
--- a/cpp/src/tests/DeliveryRecordTest.cpp
+++ /dev/null
@@ -1,67 +0,0 @@
-
-/*
- *
- * 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.
- *
- */
-#include "qpid/broker/DeliveryRecord.h"
-#include "qpid/broker/Queue.h"
-#include "unit_test.h"
-#include <iostream>
-#include <memory>
-#include <boost/format.hpp>
-
-using namespace qpid::broker;
-using namespace qpid::sys;
-using namespace qpid::framing;
-using boost::dynamic_pointer_cast;
-using std::list;
-
-namespace qpid {
-namespace tests {
-
-QPID_AUTO_TEST_SUITE(DeliveryRecordTestSuite)
-
-QPID_AUTO_TEST_CASE(testSort)
-{
- list<SequenceNumber> ids;
- ids.push_back(SequenceNumber(6));
- ids.push_back(SequenceNumber(2));
- ids.push_back(SequenceNumber(4));
- ids.push_back(SequenceNumber(5));
- ids.push_back(SequenceNumber(1));
- ids.push_back(SequenceNumber(3));
-
- list<DeliveryRecord> records;
- for (list<SequenceNumber>::iterator i = ids.begin(); i != ids.end(); i++) {
- DeliveryRecord r(QueuedMessage(0), Queue::shared_ptr(), "tag", false, false, false);
- r.setId(*i);
- records.push_back(r);
- }
- records.sort();
-
- SequenceNumber expected(0);
- for (list<DeliveryRecord>::iterator i = records.begin(); i != records.end(); i++) {
- BOOST_CHECK(i->getId() == ++expected);
- }
-}
-
-
-QPID_AUTO_TEST_SUITE_END()
-
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/DispatcherTest.cpp b/cpp/src/tests/DispatcherTest.cpp
deleted file mode 100644
index e1691db584..0000000000
--- a/cpp/src/tests/DispatcherTest.cpp
+++ /dev/null
@@ -1,241 +0,0 @@
-/*
- *
- * 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.
- *
- */
-
-#include "qpid/sys/Poller.h"
-#include "qpid/sys/IOHandle.h"
-#include "qpid/sys/Dispatcher.h"
-#include "qpid/sys/DispatchHandle.h"
-#include "qpid/sys/posix/PrivatePosix.h"
-#include "qpid/sys/Thread.h"
-
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <errno.h>
-#include <signal.h>
-
-#include <iostream>
-#include <boost/bind.hpp>
-
-using namespace std;
-using namespace qpid::sys;
-
-namespace qpid {
-namespace tests {
-
-int writeALot(int fd, const string& s) {
- int bytesWritten = 0;
- do {
- errno = 0;
- int lastWrite = ::write(fd, s.c_str(), s.size());
- if ( lastWrite >= 0) {
- bytesWritten += lastWrite;
- }
- } while (errno != EAGAIN);
- return bytesWritten;
-}
-
-int readALot(int fd) {
- int bytesRead = 0;
- char buf[10240];
-
- do {
- errno = 0;
- int lastRead = ::read(fd, buf, sizeof(buf));
- if ( lastRead >= 0) {
- bytesRead += lastRead;
- }
- } while (errno != EAGAIN);
- return bytesRead;
-}
-
-int64_t writtenBytes = 0;
-int64_t readBytes = 0;
-
-void writer(DispatchHandle& h, int fd, const string& s) {
- writtenBytes += writeALot(fd, s);
- h.rewatch();
-}
-
-void reader(DispatchHandle& h, int fd) {
- readBytes += readALot(fd);
- h.rewatch();
-}
-
-void rInterrupt(DispatchHandle&) {
- cerr << "R";
-}
-
-void wInterrupt(DispatchHandle&) {
- cerr << "W";
-}
-
-DispatchHandle::Callback rcb = rInterrupt;
-DispatchHandle::Callback wcb = wInterrupt;
-
-DispatchHandleRef *volatile rh = 0;
-DispatchHandleRef *volatile wh = 0;
-
-volatile bool stopWait = false;
-volatile bool phase1finished = false;
-
-timer_t timer;
-
-void stop_handler(int /*signo*/, siginfo_t* /*info*/, void* /*context*/) {
- stopWait = true;
-}
-
-void timer_handler(int /*signo*/, siginfo_t* /*info*/, void* /*context*/) {
- static int count = 0;
- if (count++ < 10) {
- rh->call(rcb);
- wh->call(wcb);
- } else {
- phase1finished = true;
- assert(::timer_delete(timer) == 0);
- }
-}
-
-}} // namespace qpid::tests
-
-using namespace qpid::tests;
-
-int main(int /*argc*/, char** /*argv*/)
-{
- // Create poller
- Poller::shared_ptr poller(new Poller);
-
- // Create dispatcher thread
- Thread dt(*poller);
- Thread dt1(*poller);
- Thread dt2(*poller);
- Thread dt3(*poller);
-
- // Setup sender and receiver
- int sv[2];
- int rc = ::socketpair(AF_UNIX, SOCK_STREAM, 0, sv);
- assert(rc >= 0);
-
- // Set non-blocking
- rc = ::fcntl(sv[0], F_SETFL, O_NONBLOCK);
- assert(rc >= 0);
-
- rc = ::fcntl(sv[1], F_SETFL, O_NONBLOCK);
- assert(rc >= 0);
-
- // Make up a large string
- string testString = "This is only a test ... 1,2,3,4,5,6,7,8,9,10;";
- for (int i = 0; i < 8; i++)
- testString += testString;
-
- PosixIOHandle f0(sv[0]);
- PosixIOHandle f1(sv[1]);
-
- rh = new DispatchHandleRef(f0, boost::bind(reader, _1, sv[0]), 0, 0);
- wh = new DispatchHandleRef(f1, 0, boost::bind(writer, _1, sv[1], testString), 0);
-
- rh->startWatch(poller);
- wh->startWatch(poller);
-
- // Set up a regular itimer interupt
- // We assume that this thread will handle the signals whilst sleeping
- // as the Poller threads have signal handling blocked
-
- // Signal handling
- struct ::sigaction sa;
- sa.sa_sigaction = timer_handler;
- sa.sa_flags = SA_RESTART | SA_SIGINFO;
- ::sigemptyset(&sa.sa_mask);
- rc = ::sigaction(SIGRTMIN, &sa,0);
- assert(rc == 0);
-
- ::sigevent se;
- ::memset(&se, 0, sizeof(se)); // Clear to make valgrind happy (this *is* the neatest way to do this portably - sigh)
- se.sigev_notify = SIGEV_SIGNAL;
- se.sigev_signo = SIGRTMIN;
- rc = ::timer_create(CLOCK_REALTIME, &se, &timer);
- assert(rc == 0);
-
- itimerspec ts = {
- /*.it_value = */ {2, 0}, // s, ns
- /*.it_interval = */ {2, 0}}; // s, ns
-
- rc = ::timer_settime(timer, 0, &ts, 0);
- assert(rc == 0);
-
- // wait
- while (!phase1finished) {
- ::sleep(1);
- }
-
- // Now test deleting/creating DispatchHandles in tight loop, so that we are likely to still be using the
- // attached PollerHandles after deleting the DispatchHandle
- DispatchHandleRef* t = wh;
- wh = 0;
- delete t;
- t = rh;
- rh = 0;
- delete t;
-
- sa.sa_sigaction = stop_handler;
- rc = ::sigaction(SIGRTMIN, &sa,0);
- assert(rc == 0);
-
- itimerspec nts = {
- /*.it_value = */ {30, 0}, // s, ns
- /*.it_interval = */ {30, 0}}; // s, ns
-
- rc = ::timer_create(CLOCK_REALTIME, &se, &timer);
- assert(rc == 0);
- rc = ::timer_settime(timer, 0, &nts, 0);
- assert(rc == 0);
-
- DispatchHandleRef* rh1;
- DispatchHandleRef* wh1;
-
- struct timespec w = {0, 1000000};
- while (!stopWait) {
- rh1 = new DispatchHandleRef(f0, boost::bind(reader, _1, sv[0]), 0, 0);
- wh1 = new DispatchHandleRef(f1, 0, boost::bind(writer, _1, sv[1], testString), 0);
- rh1->startWatch(poller);
- wh1->startWatch(poller);
-
- ::nanosleep(&w, 0);
-
- delete wh1;
- delete rh1;
- }
-
- rc = ::timer_delete(timer);
- assert(rc == 0);
-
- poller->shutdown();
- dt.join();
- dt1.join();
- dt2.join();
- dt3.join();
-
- cout << "\nWrote: " << writtenBytes << "\n";
- cout << "Read: " << readBytes << "\n";
-
- return 0;
-}
diff --git a/cpp/src/tests/DtxWorkRecordTest.cpp b/cpp/src/tests/DtxWorkRecordTest.cpp
deleted file mode 100644
index 9d7666dca4..0000000000
--- a/cpp/src/tests/DtxWorkRecordTest.cpp
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- *
- * 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.
- *
- */
-#include "qpid/broker/DtxWorkRecord.h"
-#include "unit_test.h"
-#include <iostream>
-#include <vector>
-#include "TxMocks.h"
-
-using namespace qpid::broker;
-using boost::static_pointer_cast;
-
-namespace qpid {
-namespace tests {
-
-QPID_AUTO_TEST_SUITE(DtxWorkRecordTestSuite)
-
-QPID_AUTO_TEST_CASE(testOnePhaseCommit){
- MockTransactionalStore store;
- store.expectBegin().expectCommit();
-
- MockTxOp::shared_ptr opA(new MockTxOp());
- opA->expectPrepare().expectCommit();
- MockTxOp::shared_ptr opB(new MockTxOp());
- opB->expectPrepare().expectCommit();
-
- DtxBuffer::shared_ptr bufferA(new DtxBuffer());
- bufferA->enlist(static_pointer_cast<TxOp>(opA));
- bufferA->markEnded();
- DtxBuffer::shared_ptr bufferB(new DtxBuffer());
- bufferB->enlist(static_pointer_cast<TxOp>(opB));
- bufferB->markEnded();
-
- DtxWorkRecord work("my-xid", &store);
- work.add(bufferA);
- work.add(bufferB);
-
- work.commit(true);
-
- store.check();
- BOOST_CHECK(store.isCommitted());
- opA->check();
- opB->check();
-}
-
-QPID_AUTO_TEST_CASE(testFailOnOnePhaseCommit){
- MockTransactionalStore store;
- store.expectBegin().expectAbort();
-
- MockTxOp::shared_ptr opA(new MockTxOp());
- opA->expectPrepare().expectRollback();
- MockTxOp::shared_ptr opB(new MockTxOp(true));
- opB->expectPrepare().expectRollback();
- MockTxOp::shared_ptr opC(new MockTxOp());
- opC->expectRollback();
-
- DtxBuffer::shared_ptr bufferA(new DtxBuffer());
- bufferA->enlist(static_pointer_cast<TxOp>(opA));
- bufferA->markEnded();
- DtxBuffer::shared_ptr bufferB(new DtxBuffer());
- bufferB->enlist(static_pointer_cast<TxOp>(opB));
- bufferB->markEnded();
- DtxBuffer::shared_ptr bufferC(new DtxBuffer());
- bufferC->enlist(static_pointer_cast<TxOp>(opC));
- bufferC->markEnded();
-
- DtxWorkRecord work("my-xid", &store);
- work.add(bufferA);
- work.add(bufferB);
- work.add(bufferC);
-
- work.commit(true);
-
- BOOST_CHECK(store.isAborted());
- store.check();
-
- opA->check();
- opB->check();
- opC->check();
-}
-
-QPID_AUTO_TEST_CASE(testTwoPhaseCommit){
- MockTransactionalStore store;
- store.expectBegin2PC().expectPrepare().expectCommit();
-
- MockTxOp::shared_ptr opA(new MockTxOp());
- opA->expectPrepare().expectCommit();
- MockTxOp::shared_ptr opB(new MockTxOp());
- opB->expectPrepare().expectCommit();
-
- DtxBuffer::shared_ptr bufferA(new DtxBuffer());
- bufferA->enlist(static_pointer_cast<TxOp>(opA));
- bufferA->markEnded();
- DtxBuffer::shared_ptr bufferB(new DtxBuffer());
- bufferB->enlist(static_pointer_cast<TxOp>(opB));
- bufferB->markEnded();
-
- DtxWorkRecord work("my-xid", &store);
- work.add(bufferA);
- work.add(bufferB);
-
- BOOST_CHECK(work.prepare());
- BOOST_CHECK(store.isPrepared());
- work.commit(false);
- store.check();
- BOOST_CHECK(store.isCommitted());
- opA->check();
- opB->check();
-}
-
-QPID_AUTO_TEST_CASE(testFailOnTwoPhaseCommit){
- MockTransactionalStore store;
- store.expectBegin2PC().expectAbort();
-
- MockTxOp::shared_ptr opA(new MockTxOp());
- opA->expectPrepare().expectRollback();
- MockTxOp::shared_ptr opB(new MockTxOp(true));
- opB->expectPrepare().expectRollback();
- MockTxOp::shared_ptr opC(new MockTxOp());
- opC->expectRollback();
-
- DtxBuffer::shared_ptr bufferA(new DtxBuffer());
- bufferA->enlist(static_pointer_cast<TxOp>(opA));
- bufferA->markEnded();
- DtxBuffer::shared_ptr bufferB(new DtxBuffer());
- bufferB->enlist(static_pointer_cast<TxOp>(opB));
- bufferB->markEnded();
- DtxBuffer::shared_ptr bufferC(new DtxBuffer());
- bufferC->enlist(static_pointer_cast<TxOp>(opC));
- bufferC->markEnded();
-
- DtxWorkRecord work("my-xid", &store);
- work.add(bufferA);
- work.add(bufferB);
- work.add(bufferC);
-
- BOOST_CHECK(!work.prepare());
- BOOST_CHECK(store.isAborted());
- store.check();
- opA->check();
- opB->check();
- opC->check();
-}
-
-QPID_AUTO_TEST_CASE(testRollback){
- MockTransactionalStore store;
- store.expectBegin2PC().expectPrepare().expectAbort();
-
- MockTxOp::shared_ptr opA(new MockTxOp());
- opA->expectPrepare().expectRollback();
- MockTxOp::shared_ptr opB(new MockTxOp());
- opB->expectPrepare().expectRollback();
-
- DtxBuffer::shared_ptr bufferA(new DtxBuffer());
- bufferA->enlist(static_pointer_cast<TxOp>(opA));
- bufferA->markEnded();
- DtxBuffer::shared_ptr bufferB(new DtxBuffer());
- bufferB->enlist(static_pointer_cast<TxOp>(opB));
- bufferB->markEnded();
-
- DtxWorkRecord work("my-xid", &store);
- work.add(bufferA);
- work.add(bufferB);
-
- BOOST_CHECK(work.prepare());
- BOOST_CHECK(store.isPrepared());
- work.rollback();
- store.check();
- BOOST_CHECK(store.isAborted());
- opA->check();
- opB->check();
-}
-
-QPID_AUTO_TEST_SUITE_END()
-
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/ExchangeTest.cpp b/cpp/src/tests/ExchangeTest.cpp
deleted file mode 100644
index 88a1cd99c2..0000000000
--- a/cpp/src/tests/ExchangeTest.cpp
+++ /dev/null
@@ -1,289 +0,0 @@
-/*
- *
- * 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.
- *
- */
-
-#include "qpid/Exception.h"
-#include "qpid/broker/Exchange.h"
-#include "qpid/broker/Queue.h"
-#include "qpid/broker/DeliverableMessage.h"
-#include "qpid/broker/DirectExchange.h"
-#include "qpid/broker/ExchangeRegistry.h"
-#include "qpid/broker/FanOutExchange.h"
-#include "qpid/broker/HeadersExchange.h"
-#include "qpid/broker/TopicExchange.h"
-#include "qpid/framing/reply_exceptions.h"
-#include "unit_test.h"
-#include <iostream>
-#include "MessageUtils.h"
-
-using boost::intrusive_ptr;
-using namespace qpid::broker;
-using namespace qpid::framing;
-using namespace qpid::sys;
-using namespace qpid;
-
-namespace qpid {
-namespace tests {
-
-QPID_AUTO_TEST_SUITE(ExchangeTestSuite)
-
-QPID_AUTO_TEST_CASE(testMe)
-{
- Queue::shared_ptr queue(new Queue("queue", true));
- Queue::shared_ptr queue2(new Queue("queue2", true));
-
- TopicExchange topic("topic");
- topic.bind(queue, "abc", 0);
- topic.bind(queue2, "abc", 0);
-
- DirectExchange direct("direct");
- direct.bind(queue, "abc", 0);
- direct.bind(queue2, "abc", 0);
-
- queue.reset();
- queue2.reset();
-
- intrusive_ptr<Message> msgPtr(MessageUtils::createMessage("exchange", "key", false, "id"));
- DeliverableMessage msg(msgPtr);
- topic.route(msg, "abc", 0);
- direct.route(msg, "abc", 0);
-
-}
-
-QPID_AUTO_TEST_CASE(testIsBound)
-{
- Queue::shared_ptr a(new Queue("a", true));
- Queue::shared_ptr b(new Queue("b", true));
- Queue::shared_ptr c(new Queue("c", true));
- Queue::shared_ptr d(new Queue("d", true));
-
- string k1("abc");
- string k2("def");
- string k3("xyz");
-
- FanOutExchange fanout("fanout");
- BOOST_CHECK(fanout.bind(a, "", 0));
- BOOST_CHECK(fanout.bind(b, "", 0));
- BOOST_CHECK(fanout.bind(c, "", 0));
-
- BOOST_CHECK(fanout.isBound(a, 0, 0));
- BOOST_CHECK(fanout.isBound(b, 0, 0));
- BOOST_CHECK(fanout.isBound(c, 0, 0));
- BOOST_CHECK(!fanout.isBound(d, 0, 0));
-
- DirectExchange direct("direct");
- BOOST_CHECK(direct.bind(a, k1, 0));
- BOOST_CHECK(direct.bind(a, k3, 0));
- BOOST_CHECK(direct.bind(b, k2, 0));
- BOOST_CHECK(direct.bind(c, k1, 0));
-
- BOOST_CHECK(direct.isBound(a, 0, 0));
- BOOST_CHECK(direct.isBound(a, &k1, 0));
- BOOST_CHECK(direct.isBound(a, &k3, 0));
- BOOST_CHECK(!direct.isBound(a, &k2, 0));
- BOOST_CHECK(direct.isBound(b, 0, 0));
- BOOST_CHECK(direct.isBound(b, &k2, 0));
- BOOST_CHECK(direct.isBound(c, &k1, 0));
- BOOST_CHECK(!direct.isBound(d, 0, 0));
- BOOST_CHECK(!direct.isBound(d, &k1, 0));
- BOOST_CHECK(!direct.isBound(d, &k2, 0));
- BOOST_CHECK(!direct.isBound(d, &k3, 0));
-
- TopicExchange topic("topic");
- BOOST_CHECK(topic.bind(a, k1, 0));
- BOOST_CHECK(topic.bind(a, k3, 0));
- BOOST_CHECK(topic.bind(b, k2, 0));
- BOOST_CHECK(topic.bind(c, k1, 0));
-
- BOOST_CHECK(topic.isBound(a, 0, 0));
- BOOST_CHECK(topic.isBound(a, &k1, 0));
- BOOST_CHECK(topic.isBound(a, &k3, 0));
- BOOST_CHECK(!topic.isBound(a, &k2, 0));
- BOOST_CHECK(topic.isBound(b, 0, 0));
- BOOST_CHECK(topic.isBound(b, &k2, 0));
- BOOST_CHECK(topic.isBound(c, &k1, 0));
- BOOST_CHECK(!topic.isBound(d, 0, 0));
- BOOST_CHECK(!topic.isBound(d, &k1, 0));
- BOOST_CHECK(!topic.isBound(d, &k2, 0));
- BOOST_CHECK(!topic.isBound(d, &k3, 0));
-
- HeadersExchange headers("headers");
- FieldTable args1;
- args1.setString("x-match", "all");
- args1.setString("a", "A");
- args1.setInt("b", 1);
- FieldTable args2;
- args2.setString("x-match", "any");
- args2.setString("a", "A");
- args2.setInt("b", 1);
- FieldTable args3;
- args3.setString("x-match", "any");
- args3.setString("c", "C");
- args3.setInt("b", 6);
-
- headers.bind(a, "", &args1);
- headers.bind(a, "", &args3);
- headers.bind(b, "", &args2);
- headers.bind(c, "", &args1);
-
- BOOST_CHECK(headers.isBound(a, 0, 0));
- BOOST_CHECK(headers.isBound(a, 0, &args1));
- BOOST_CHECK(headers.isBound(a, 0, &args3));
- BOOST_CHECK(!headers.isBound(a, 0, &args2));
- BOOST_CHECK(headers.isBound(b, 0, 0));
- BOOST_CHECK(headers.isBound(b, 0, &args2));
- BOOST_CHECK(headers.isBound(c, 0, &args1));
- BOOST_CHECK(!headers.isBound(d, 0, 0));
- BOOST_CHECK(!headers.isBound(d, 0, &args1));
- BOOST_CHECK(!headers.isBound(d, 0, &args2));
- BOOST_CHECK(!headers.isBound(d, 0, &args3));
-}
-
-QPID_AUTO_TEST_CASE(testDeleteGetAndRedeclare)
-{
- ExchangeRegistry exchanges;
- exchanges.declare("my-exchange", "direct", false, FieldTable());
- exchanges.destroy("my-exchange");
- try {
- exchanges.get("my-exchange");
- } catch (const NotFoundException&) {}
- std::pair<Exchange::shared_ptr, bool> response = exchanges.declare("my-exchange", "direct", false, FieldTable());
- BOOST_CHECK_EQUAL(string("direct"), response.first->getType());
-}
-
-intrusive_ptr<Message> cmessage(std::string exchange, std::string routingKey) {
- intrusive_ptr<Message> msg(new Message());
- AMQFrame method((MessageTransferBody(ProtocolVersion(), exchange, 0, 0)));
- AMQFrame header((AMQHeaderBody()));
- msg->getFrames().append(method);
- msg->getFrames().append(header);
- msg->getFrames().getHeaders()->get<DeliveryProperties>(true)->setRoutingKey(routingKey);
- return msg;
-}
-
-QPID_AUTO_TEST_CASE(testSequenceOptions)
-{
- FieldTable args;
- args.setInt("qpid.msg_sequence",1);
- char* buff = new char[10000];
- framing::Buffer buffer(buff,10000);
- {
- DirectExchange direct("direct1", false, args);
-
- intrusive_ptr<Message> msg1 = cmessage("e", "A");
- intrusive_ptr<Message> msg2 = cmessage("e", "B");
- intrusive_ptr<Message> msg3 = cmessage("e", "C");
-
- DeliverableMessage dmsg1(msg1);
- DeliverableMessage dmsg2(msg2);
- DeliverableMessage dmsg3(msg3);
-
- direct.route(dmsg1, "abc", 0);
- direct.route(dmsg2, "abc", 0);
- direct.route(dmsg3, "abc", 0);
-
- BOOST_CHECK_EQUAL(1, msg1->getApplicationHeaders()->getAsInt64("qpid.msg_sequence"));
- BOOST_CHECK_EQUAL(2, msg2->getApplicationHeaders()->getAsInt64("qpid.msg_sequence"));
- BOOST_CHECK_EQUAL(3, msg3->getApplicationHeaders()->getAsInt64("qpid.msg_sequence"));
-
- FanOutExchange fanout("fanout1", false, args);
- HeadersExchange header("headers1", false, args);
- TopicExchange topic ("topic1", false, args);
-
- // check other exchanges, that they preroute
- intrusive_ptr<Message> msg4 = cmessage("e", "A");
- intrusive_ptr<Message> msg5 = cmessage("e", "B");
- intrusive_ptr<Message> msg6 = cmessage("e", "C");
-
- DeliverableMessage dmsg4(msg4);
- DeliverableMessage dmsg5(msg5);
- DeliverableMessage dmsg6(msg6);
-
- fanout.route(dmsg4, "abc", 0);
- BOOST_CHECK_EQUAL(1, msg4->getApplicationHeaders()->getAsInt64("qpid.msg_sequence"));
-
- FieldTable headers;
- header.route(dmsg5, "abc", &headers);
- BOOST_CHECK_EQUAL(1, msg5->getApplicationHeaders()->getAsInt64("qpid.msg_sequence"));
-
- topic.route(dmsg6, "abc", 0);
- BOOST_CHECK_EQUAL(1, msg6->getApplicationHeaders()->getAsInt64("qpid.msg_sequence"));
- direct.encode(buffer);
- }
- {
-
- ExchangeRegistry exchanges;
- buffer.reset();
- DirectExchange::shared_ptr exch_dec = Exchange::decode(exchanges, buffer);
-
- intrusive_ptr<Message> msg1 = cmessage("e", "A");
- DeliverableMessage dmsg1(msg1);
- exch_dec->route(dmsg1, "abc", 0);
-
- BOOST_CHECK_EQUAL(4, msg1->getApplicationHeaders()->getAsInt64("qpid.msg_sequence"));
-
- }
- delete [] buff;
-}
-
-QPID_AUTO_TEST_CASE(testIVEOption)
-{
- FieldTable args;
- args.setInt("qpid.ive",1);
- DirectExchange direct("direct1", false, args);
- FanOutExchange fanout("fanout1", false, args);
- HeadersExchange header("headers1", false, args);
- TopicExchange topic ("topic1", false, args);
-
- intrusive_ptr<Message> msg1 = cmessage("direct1", "abc");
- msg1->getProperties<MessageProperties>()->getApplicationHeaders().setString("a", "abc");
- DeliverableMessage dmsg1(msg1);
-
- FieldTable args2;
- args2.setString("x-match", "any");
- args2.setString("a", "abc");
-
- direct.route(dmsg1, "abc", 0);
- fanout.route(dmsg1, "abc", 0);
- header.route(dmsg1, "abc", &args2);
- topic.route(dmsg1, "abc", 0);
- Queue::shared_ptr queue(new Queue("queue", true));
- Queue::shared_ptr queue1(new Queue("queue1", true));
- Queue::shared_ptr queue2(new Queue("queue2", true));
- Queue::shared_ptr queue3(new Queue("queue3", true));
-
- BOOST_CHECK(HeadersExchange::match(args2, msg1->getProperties<MessageProperties>()->getApplicationHeaders()));
-
- BOOST_CHECK(direct.bind(queue, "abc", 0));
- BOOST_CHECK(fanout.bind(queue1, "abc", 0));
- BOOST_CHECK(header.bind(queue2, "", &args2));
- BOOST_CHECK(topic.bind(queue3, "abc", 0));
-
- BOOST_CHECK_EQUAL(1u,queue->getMessageCount());
- BOOST_CHECK_EQUAL(1u,queue1->getMessageCount());
- BOOST_CHECK_EQUAL(1u,queue2->getMessageCount());
- BOOST_CHECK_EQUAL(1u,queue3->getMessageCount());
-
-}
-
-
-QPID_AUTO_TEST_SUITE_END()
-
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/FieldTable.cpp b/cpp/src/tests/FieldTable.cpp
deleted file mode 100644
index fe2a14ec03..0000000000
--- a/cpp/src/tests/FieldTable.cpp
+++ /dev/null
@@ -1,213 +0,0 @@
-/*
- *
- * 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.
- *
- */
-#include <iostream>
-#include "qpid/framing/Array.h"
-#include "qpid/framing/FieldTable.h"
-#include "qpid/framing/FieldValue.h"
-#include "qpid/framing/List.h"
-#include "qpid/sys/alloca.h"
-
-#include "unit_test.h"
-
-using namespace qpid::framing;
-
-namespace qpid {
-namespace tests {
-
-QPID_AUTO_TEST_SUITE(FieldTableTestSuite)
-
-QPID_AUTO_TEST_CASE(testMe)
-{
- FieldTable ft;
- ft.setString("A", "BCDE");
- BOOST_CHECK(string("BCDE") == ft.getAsString("A"));
-
- char buff[100];
- Buffer wbuffer(buff, 100);
- wbuffer.put(ft);
-
- Buffer rbuffer(buff, 100);
- FieldTable ft2;
- rbuffer.get(ft2);
- BOOST_CHECK(string("BCDE") == ft2.getAsString("A"));
-
-}
-
-QPID_AUTO_TEST_CASE(testAssignment)
-{
- FieldTable a;
- FieldTable b;
-
- a.setString("A", "BBBB");
- a.setInt("B", 1234);
- b = a;
- a.setString("A", "CCCC");
-
- BOOST_CHECK(string("CCCC") == a.getAsString("A"));
- BOOST_CHECK(string("BBBB") == b.getAsString("A"));
- BOOST_CHECK_EQUAL(1234, a.getAsInt("B"));
- BOOST_CHECK_EQUAL(1234, b.getAsInt("B"));
- BOOST_CHECK(IntegerValue(1234) == *a.get("B"));
- BOOST_CHECK(IntegerValue(1234) == *b.get("B"));
-
- FieldTable d;
- {
- FieldTable c;
- c = a;
-
- char* buff = static_cast<char*>(::alloca(c.encodedSize()));
- Buffer wbuffer(buff, c.encodedSize());
- wbuffer.put(c);
-
- Buffer rbuffer(buff, c.encodedSize());
- rbuffer.get(d);
- BOOST_CHECK_EQUAL(c, d);
- BOOST_CHECK(string("CCCC") == c.getAsString("A"));
- BOOST_CHECK(IntegerValue(1234) == *c.get("B"));
- }
- BOOST_CHECK(string("CCCC") == d.getAsString("A"));
- BOOST_CHECK(IntegerValue(1234) == *d.get("B"));
-}
-
-
-QPID_AUTO_TEST_CASE(testNestedValues)
-{
- double d = 1.2345;
- uint32_t u = 101;
- char buff[1000];
- {
- FieldTable a;
- FieldTable b;
- std::vector<std::string> items;
- items.push_back("one");
- items.push_back("two");
- Array c(items);
- List list;
- list.push_back(List::ValuePtr(new Str16Value("red")));
- list.push_back(List::ValuePtr(new Unsigned32Value(u)));
- list.push_back(List::ValuePtr(new Str8Value("yellow")));
- list.push_back(List::ValuePtr(new DoubleValue(d)));
-
- a.setString("id", "A");
- b.setString("id", "B");
- a.setTable("B", b);
- a.setArray("C", c);
- a.set("my-list", FieldTable::ValuePtr(new ListValue(list)));
-
-
- Buffer wbuffer(buff, 100);
- wbuffer.put(a);
- }
- {
- Buffer rbuffer(buff, 100);
- FieldTable a;
- FieldTable b;
- Array c;
- rbuffer.get(a);
- BOOST_CHECK(string("A") == a.getAsString("id"));
- a.getTable("B", b);
- BOOST_CHECK(string("B") == b.getAsString("id"));
- a.getArray("C", c);
- std::vector<std::string> items;
- c.collect(items);
- BOOST_CHECK((uint) 2 == items.size());
- BOOST_CHECK(string("one") == items[0]);
- BOOST_CHECK(string("two") == items[1]);
-
- List list;
- BOOST_CHECK(a.get("my-list")->get<List>(list));
- List::const_iterator i = list.begin();
- BOOST_CHECK(i != list.end());
- BOOST_CHECK_EQUAL(std::string("red"), (*i)->get<std::string>());
-
- i++;
- BOOST_CHECK(i != list.end());
- BOOST_CHECK_EQUAL(u, (uint32_t) (*i)->get<int>());
-
- i++;
- BOOST_CHECK(i != list.end());
- BOOST_CHECK_EQUAL(std::string("yellow"), (*i)->get<std::string>());
-
- i++;
- BOOST_CHECK(i != list.end());
- BOOST_CHECK_EQUAL(d, (*i)->get<double>());
-
- i++;
- BOOST_CHECK(i == list.end());
- }
-}
-
-QPID_AUTO_TEST_CASE(testFloatAndDouble)
-{
- char buff[100];
- float f = 5.672f;
- double d = 56.720001;
- {
- FieldTable a;
- a.setString("string", "abc");
- a.setInt("int", 5672);
- a.setFloat("float", f);
- a.setDouble("double", d);
-
- Buffer wbuffer(buff, 100);
- wbuffer.put(a);
- }
- {
- Buffer rbuffer(buff, 100);
- FieldTable a;
- rbuffer.get(a);
- BOOST_CHECK(string("abc") == a.getAsString("string"));
- BOOST_CHECK(5672 == a.getAsInt("int"));
- float f2;
- BOOST_CHECK(!a.getFloat("string", f2));
- BOOST_CHECK(!a.getFloat("int", f2));
- BOOST_CHECK(a.getFloat("float", f2));
- BOOST_CHECK(f2 == f);
-
- double d2;
- BOOST_CHECK(!a.getDouble("string", d2));
- BOOST_CHECK(!a.getDouble("int", d2));
- BOOST_CHECK(a.getDouble("double", d2));
- BOOST_CHECK(d2 == d);
- }
-}
-
-QPID_AUTO_TEST_CASE(test64GetAndSetConverts)
-{
- FieldTable args;
- args.setInt64("a",100);
- args.setInt64("b",-(int64_t) ((int64_t) 1<<34));
-
- args.setUInt64("c",1u);
- args.setUInt64("d",(uint64_t) ((uint64_t) 1<<34));
- BOOST_CHECK_EQUAL(1u, args.getAsUInt64("c"));
- BOOST_CHECK_EQUAL(100u, args.getAsUInt64("a"));
- BOOST_CHECK_EQUAL(1, args.getAsInt64("c"));
- BOOST_CHECK_EQUAL(100, args.getAsInt64("a"));
- BOOST_CHECK_EQUAL(-(int64_t) ((int64_t) 1<<34), args.getAsInt64("b"));
- BOOST_CHECK_EQUAL((uint64_t) ((uint64_t) 1<<34), args.getAsUInt64("d"));
- BOOST_CHECK_EQUAL((int64_t) ((int64_t) 1<<34), args.getAsInt64("d"));
-
-}
-
-QPID_AUTO_TEST_SUITE_END()
-
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/FieldValue.cpp b/cpp/src/tests/FieldValue.cpp
deleted file mode 100644
index 0ebd0d7d44..0000000000
--- a/cpp/src/tests/FieldValue.cpp
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * 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.
- */
-#include "qpid/framing/FieldValue.h"
-
-#include "unit_test.h"
-
-namespace qpid {
-namespace tests {
-
-QPID_AUTO_TEST_SUITE(FieldValueTestSuite)
-
-using namespace qpid::framing;
-
-Str16Value s("abc");
-IntegerValue i(42);
-//DecimalValue d(1234,2);
-//FieldTableValue ft;
-//EmptyValue e;
-
-QPID_AUTO_TEST_CASE(testStr16ValueEquals)
-{
-
- BOOST_CHECK(Str16Value("abc") == s);
- BOOST_CHECK(Str16Value("foo") != s);
- BOOST_CHECK(s != i);
- BOOST_CHECK(s.convertsTo<std::string>() == true);
- BOOST_CHECK(s.convertsTo<int>() == false);
- BOOST_CHECK(s.get<std::string>() == "abc");
- BOOST_CHECK_THROW(s.get<int>(), InvalidConversionException);
-// BOOST_CHECK(s != ft);
-
-}
-
-QPID_AUTO_TEST_CASE(testIntegerValueEquals)
-{
- BOOST_CHECK(IntegerValue(42) == i);
- BOOST_CHECK(IntegerValue(5) != i);
- BOOST_CHECK(i != s);
- BOOST_CHECK(i.convertsTo<std::string>() == false);
- BOOST_CHECK(i.convertsTo<int>() == true);
- BOOST_CHECK_THROW(i.get<std::string>(), InvalidConversionException);
- BOOST_CHECK(i.get<int>() == 42);
-// BOOST_CHECK(i != ft);
-}
-
-#if 0
-QPID_AUTO_TEST_CASE(testDecimalValueEquals)
-{
- BOOST_CHECK(DecimalValue(1234, 2) == d);
- BOOST_CHECK(DecimalValue(12345, 2) != d);
- BOOST_CHECK(DecimalValue(1234, 3) != d);
- BOOST_CHECK(d != s);
-}
-
-QPID_AUTO_TEST_CASE(testFieldTableValueEquals)
-{
- ft.getValue().setString("foo", "FOO");
- ft.getValue().setInt("magic", 7);
-
- BOOST_CHECK_EQUAL(std::string("FOO"),
- ft.getValue().getString("foo"));
- BOOST_CHECK_EQUAL(7, ft.getValue().getInt("magic"));
-
- FieldTableValue f2;
- BOOST_CHECK(ft != f2);
- f2.getValue().setString("foo", "FOO");
- BOOST_CHECK(ft != f2);
- f2.getValue().setInt("magic", 7);
- BOOST_CHECK_EQUAL(ft,f2);
- BOOST_CHECK(ft == f2);
- f2.getValue().setString("foo", "BAR");
- BOOST_CHECK(ft != f2);
- BOOST_CHECK(ft != i);
-}
-#endif
-
-QPID_AUTO_TEST_SUITE_END()
-
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/ForkedBroker.cpp b/cpp/src/tests/ForkedBroker.cpp
deleted file mode 100644
index 53eaa7e1ce..0000000000
--- a/cpp/src/tests/ForkedBroker.cpp
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- *
- * 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.
- *
- */
-
-#include "ForkedBroker.h"
-#include "qpid/log/Statement.h"
-#include <boost/bind.hpp>
-#include <algorithm>
-#include <stdlib.h>
-#include <sys/types.h>
-#include <signal.h>
-
-using namespace std;
-using qpid::ErrnoException;
-
-namespace std {
-static ostream& operator<<(ostream& o, const qpid::tests::ForkedBroker::Args& a) {
-copy(a.begin(), a.end(), ostream_iterator<string>(o, " "));
-return o;
-}
-}
-
-namespace qpid {
-namespace tests {
-
-ForkedBroker::ForkedBroker(const Args& constArgs) : running(false), exitStatus(0) {
- Args args(constArgs);
- // Substitute the special value "TMP_DATA_DIR" with a temporary data dir.
- Args::iterator i = find(args.begin(), args.end(), string("TMP_DATA_DIR"));
- if (i != args.end()) {
- args.erase(i);
- char dd[] = "/tmp/ForkedBroker.XXXXXX";
- if (!mkdtemp(dd))
- throw qpid::ErrnoException("Can't create data dir");
- dataDir = dd;
- args.push_back("--data-dir");
- args.push_back(dataDir);
- }
- // Never use the default data directory, set --no-data-dir if no other data-dir arg.
- Args::iterator j = find(args.begin(), args.end(), string("--data-dir"));
- Args::iterator k = find(args.begin(), args.end(), string("--no-data-dir"));
- if (j == args.end() && k == args.end())
- args.push_back("--no-data-dir");
- init(args);
-}
-
-ForkedBroker::~ForkedBroker() {
- try { kill(); }
- catch (const std::exception& e) {
- QPID_LOG(error, QPID_MSG("Killing forked broker: " << e.what()));
- }
- if (!dataDir.empty())
- {
- int unused_ret; // Suppress warnings about ignoring return value.
- unused_ret = ::system(("rm -rf "+dataDir).c_str());
- }
-}
-
-void ForkedBroker::kill(int sig) {
- if (pid == 0) return;
- int savePid = pid;
- pid = 0; // Reset pid here in case of an exception.
- using qpid::ErrnoException;
- if (::kill(savePid, sig) < 0)
- throw ErrnoException("kill failed");
- int status;
- if (::waitpid(savePid, &status, 0) < 0 && sig != 9)
- throw ErrnoException("wait for forked process failed");
- if (WEXITSTATUS(status) != 0 && sig != 9)
- throw qpid::Exception(QPID_MSG("Forked broker exited with: " << WEXITSTATUS(status)));
- running = false;
- exitStatus = status;
-}
-
-bool isLogOption(const std::string& s) {
- const char * log_enable = "--log-enable",
- * trace = "--trace";
- return( (! strncmp(s.c_str(), log_enable, strlen(log_enable))) ||
- (! strncmp(s.c_str(), trace, strlen(trace)))
- );
-}
-
-namespace {
- void ignore_signal(int)
- {
- }
-}
-
-void ForkedBroker::init(const Args& userArgs) {
- using qpid::ErrnoException;
- port = 0;
- int pipeFds[2];
- if(::pipe(pipeFds) < 0) throw ErrnoException("Can't create pipe");
-
- // Ignore the SIGCHLD signal generated by an exitting child
- // We will clean up any exitting children in the waitpid above
- // This should really be neater (like only once not per fork)
- struct ::sigaction sa;
- sa.sa_handler = ignore_signal;
- ::sigemptyset(&sa.sa_mask);
- ::sigaddset(&sa.sa_mask, SIGCHLD);
- sa.sa_flags = SA_NOCLDSTOP | SA_RESTART;
- ::sigaction(SIGCHLD, &sa, 0);
-
- pid = ::fork();
- if (pid < 0) throw ErrnoException("Fork failed");
- if (pid) { // parent
- ::close(pipeFds[1]);
- FILE* f = ::fdopen(pipeFds[0], "r");
- if (!f) throw ErrnoException("fopen failed");
- if (::fscanf(f, "%d", &port) != 1) {
- if (ferror(f)) throw ErrnoException("Error reading port number from child.");
- else throw qpid::Exception("EOF reading port number from child.");
- }
- ::fclose(f);
- running = true;
- }
- else { // child
- ::close(pipeFds[0]);
- int fd = ::dup2(pipeFds[1], 1); // pipe stdout to the parent.
- if (fd < 0) throw ErrnoException("dup2 failed");
- const char* prog = ::getenv("QPIDD_EXEC");
- if (!prog) prog = "../qpidd"; // This only works from within svn checkout
- Args args(userArgs);
- args.push_back("--port=0");
- // Keep quiet except for errors.
- if (!::getenv("QPID_TRACE") && !::getenv("QPID_LOG_ENABLE")
- && find_if(userArgs.begin(), userArgs.end(), isLogOption) == userArgs.end())
- args.push_back("--log-enable=error+");
- std::vector<const char*> argv(args.size());
- std::transform(args.begin(), args.end(), argv.begin(), boost::bind(&std::string::c_str, _1));
- argv.push_back(0);
- QPID_LOG(debug, "ForkedBroker exec " << prog << ": " << args);
-
- execv(prog, const_cast<char* const*>(&argv[0]));
- QPID_LOG(critical, "execv failed to start broker: prog=\"" << prog << "\"; args=\"" << args << "\"; errno=" << errno << " (" << std::strerror(errno) << ")");
- ::exit(1);
- }
-}
-
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/ForkedBroker.h b/cpp/src/tests/ForkedBroker.h
deleted file mode 100644
index 87e141a425..0000000000
--- a/cpp/src/tests/ForkedBroker.h
+++ /dev/null
@@ -1,82 +0,0 @@
-#ifndef TESTS_FORKEDBROKER_H
-#define TESTS_FORKEDBROKER_H
-
-
-/*
- *
- * 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.
- *
- */
-
-#include "qpid/Exception.h"
-#include "qpid/log/Statement.h"
-#include "qpid/broker/Broker.h"
-#include <boost/lexical_cast.hpp>
-#include <string>
-#include <stdio.h>
-#include <sys/wait.h>
-
-namespace qpid {
-namespace tests {
-
-/**
- * Class to fork a broker child process.
- *
- * For most tests a BrokerFixture may be more convenient as it starts
- * a broker in the same process which allows you to easily debug into
- * the broker.
- *
- * This useful for tests that need to start multiple brokers where
- * those brokers can't coexist in the same process (e.g. for cluster
- * tests where CPG doesn't allow multiple group members in a single
- * process.)
- *
- */
-class ForkedBroker {
- public:
- typedef std::vector<std::string> Args;
-
- // argv args are passed to broker.
- //
- // Special value "TMP_DATA_DIR" is substituted with a temporary
- // data directory for the broker.
- //
- ForkedBroker(const Args& argv);
- ~ForkedBroker();
-
- void kill(int sig=SIGINT);
- int wait(); // Wait for exit, return exit status.
- uint16_t getPort() { return port; }
- pid_t getPID() { return pid; }
- bool isRunning() { return running; }
-
- private:
-
- void init(const Args& args);
-
- bool running;
- int exitStatus;
-
- pid_t pid;
- int port;
- std::string dataDir;
-};
-
-}} // namespace qpid::tests
-
-#endif /*!TESTS_FORKEDBROKER_H*/
diff --git a/cpp/src/tests/Frame.cpp b/cpp/src/tests/Frame.cpp
deleted file mode 100644
index 1270eabba3..0000000000
--- a/cpp/src/tests/Frame.cpp
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- *
- * 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.
- *
- */
-#include "qpid/framing/Frame.h"
-
-#include <boost/lexical_cast.hpp>
-#include "unit_test.h"
-
-namespace qpid {
-namespace tests {
-
-QPID_AUTO_TEST_SUITE(FrameTestSuite)
-
-using namespace std;
-using namespace qpid::framing;
-using namespace boost;
-
-QPID_AUTO_TEST_CASE(testContentBody) {
- Frame f(42, AMQContentBody("foobar"));
- AMQBody* body=f.getBody();
- BOOST_CHECK(dynamic_cast<AMQContentBody*>(body));
- Buffer b(f.encodedSize();
- f.encode(b);
- b.flip();
- Frame g;
- g.decode(b);
- AMQContentBody* content=dynamic_cast<AMQContentBody*>(g.getBody());
- BOOST_REQUIRE(content);
- BOOST_CHECK_EQUAL(content->getData(), "foobar");
-}
-
-QPID_AUTO_TEST_CASE(testMethodBody) {
- FieldTable args;
- args.setString("foo", "bar");
- Frame f(
- 42, QueueDeclareBody(ProtocolVersion(), 1, "q", "altex",
- true, false, true, false, true, args));
- BOOST_CHECK_EQUAL(f.getChannel(), 42);
- Buffer b(f.encodedSize();
- f.encode(b);
- b.flip();
- Frame g;
- g.decode(b);
- BOOST_CHECK_EQUAL(f.getChannel(), g.getChannel());
- QueueDeclareBody* declare=dynamic_cast<QueueDeclareBody*>(g.getBody());
- BOOST_REQUIRE(declare);
- BOOST_CHECK_EQUAL(declare->getAlternateExchange(), "altex");
- BOOST_CHECK_EQUAL(lexical_cast<string>(*f.getBody()), lexical_cast<string>(*g.getBody()));
-}
-
-QPID_AUTO_TEST_CASE(testLoop) {
- // Run in a loop so heap profiler can spot any allocations.
- Buffer b(1024);
- for (int i = 0; i < 100; ++i) {
- Frame ctor(2, AccessRequestOkBody(ProtocolVersion(), 42));
- Frame assign(3);
- assign.body = AccessRequestOkBody(ProtocolVersion(), 42);
- assign.encode(b);
- b.flip();
- Frame g;
- g.decode(b);
- BOOST_REQUIRE(dynamic_cast<AccessRequestOkBody*>(g.getBody())->getTicket() == 42);
- }
-}
-
-QPID_AUTO_TEST_SUITE_END()
-
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/FrameDecoder.cpp b/cpp/src/tests/FrameDecoder.cpp
deleted file mode 100644
index 9eeff2a41e..0000000000
--- a/cpp/src/tests/FrameDecoder.cpp
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- *
- * 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.
- *
- */
-
-#include "unit_test.h"
-#include "qpid/framing/AMQFrame.h"
-#include "qpid/framing/FrameDecoder.h"
-#include "qpid/framing/AMQContentBody.h"
-#include "qpid/framing/Buffer.h"
-#include <string>
-
-
-namespace qpid {
-namespace tests {
-
-QPID_AUTO_TEST_SUITE(FrameDecoderTest)
-
-using namespace std;
-using namespace qpid::framing;
-
-
-string makeData(int size) {
- string data;
- data.resize(size);
- for (int i =0; i < size; ++i)
- data[i] = 'a' + (i%26);
- return data;
-}
-string encodeFrame(string data) {
- AMQFrame f((AMQContentBody(data)));
- string encoded;
- encoded.resize(f.encodedSize());
- Buffer b(&encoded[0], encoded.size());
- f.encode(b);
- return encoded;
-}
-
-string getData(const AMQFrame& frame) {
- const AMQContentBody* content = dynamic_cast<const AMQContentBody*>(frame.getBody());
- BOOST_CHECK(content);
- return content->getData();
-}
-
-QPID_AUTO_TEST_CASE(testByteFragments) {
- string data = makeData(42);
- string encoded = encodeFrame(data);
- FrameDecoder decoder;
- for (size_t i = 0; i < encoded.size()-1; ++i) {
- Buffer buf(&encoded[i], 1);
- BOOST_CHECK(!decoder.decode(buf));
- }
- Buffer buf(&encoded[encoded.size()-1], 1);
- BOOST_CHECK(decoder.decode(buf));
- BOOST_CHECK_EQUAL(data, getData(decoder.getFrame()));
-}
-
-
-
-QPID_AUTO_TEST_SUITE_END()
-
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/FramingTest.cpp b/cpp/src/tests/FramingTest.cpp
deleted file mode 100644
index f8795316cc..0000000000
--- a/cpp/src/tests/FramingTest.cpp
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- *
- * 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.
- *
- */
-#include "qpid/client/Connection.h"
-#include "qpid/client/Connector.h"
-#include "qpid/framing/AMQP_HighestVersion.h"
-#include "qpid/framing/ProtocolVersion.h"
-#include "qpid/framing/all_method_bodies.h"
-#include "qpid/framing/amqp_framing.h"
-#include "qpid/framing/reply_exceptions.h"
-#include "unit_test.h"
-
-#include <boost/bind.hpp>
-#include <boost/lexical_cast.hpp>
-#include <iostream>
-
-#include <memory>
-#include <sstream>
-#include <typeinfo>
-
-using namespace qpid;
-using namespace qpid::framing;
-using namespace std;
-
-namespace qpid {
-namespace tests {
-
-template <class T>
-std::string tostring(const T& x)
-{
- std::ostringstream out;
- out << x;
- return out.str();
-}
-
-QPID_AUTO_TEST_SUITE(FramingTestSuite)
-
-QPID_AUTO_TEST_CASE(testMessageTransferBody)
-{
- char buffer[1024];
- ProtocolVersion version(highestProtocolVersion);
- Buffer wbuff(buffer, sizeof(buffer));
- MessageTransferBody in(version, "my-exchange", 1, 1);
- in.encode(wbuff);
-
- Buffer rbuff(buffer, sizeof(buffer));
- MessageTransferBody out(version);
- out.decode(rbuff);
- BOOST_CHECK_EQUAL(tostring(in), tostring(out));
-}
-
-QPID_AUTO_TEST_CASE(testConnectionSecureBody)
-{
- char buffer[1024];
- ProtocolVersion version(highestProtocolVersion);
- Buffer wbuff(buffer, sizeof(buffer));
- std::string s = "security credential";
- ConnectionSecureBody in(version, s);
- in.encode(wbuff);
-
- Buffer rbuff(buffer, sizeof(buffer));
- ConnectionSecureBody out(version);
- out.decode(rbuff);
- BOOST_CHECK_EQUAL(tostring(in), tostring(out));
-}
-
-QPID_AUTO_TEST_CASE(testConnectionRedirectBody)
-{
- char buffer[1024];
- ProtocolVersion version(highestProtocolVersion);
- Buffer wbuff(buffer, sizeof(buffer));
- std::string a = "hostA";
- std::string b = "hostB";
- Array hosts(0x95);
- hosts.add(boost::shared_ptr<FieldValue>(new Str16Value(a)));
- hosts.add(boost::shared_ptr<FieldValue>(new Str16Value(b)));
-
- ConnectionRedirectBody in(version, a, hosts);
- in.encode(wbuff);
-
- Buffer rbuff(buffer, sizeof(buffer));
- ConnectionRedirectBody out(version);
- out.decode(rbuff);
- BOOST_CHECK_EQUAL(tostring(in), tostring(out));
-}
-
-QPID_AUTO_TEST_CASE(testQueueDeclareBody)
-{
- char buffer[1024];
- ProtocolVersion version(highestProtocolVersion);
- Buffer wbuff(buffer, sizeof(buffer));
- QueueDeclareBody in(version, "name", "dlq", true, false, true, false, FieldTable());
- in.encode(wbuff);
-
- Buffer rbuff(buffer, sizeof(buffer));
- QueueDeclareBody out(version);
- out.decode(rbuff);
- BOOST_CHECK_EQUAL(tostring(in), tostring(out));
-}
-
-QPID_AUTO_TEST_CASE(testConnectionRedirectBodyFrame)
-{
- char buffer[1024];
- ProtocolVersion version(highestProtocolVersion);
- Buffer wbuff(buffer, sizeof(buffer));
- std::string a = "hostA";
- std::string b = "hostB";
- Array hosts(0x95);
- hosts.add(boost::shared_ptr<FieldValue>(new Str16Value(a)));
- hosts.add(boost::shared_ptr<FieldValue>(new Str16Value(b)));
-
- AMQFrame in((ConnectionRedirectBody(version, a, hosts)));
- in.setChannel(999);
- in.encode(wbuff);
-
- Buffer rbuff(buffer, sizeof(buffer));
- AMQFrame out;
- out.decode(rbuff);
- BOOST_CHECK_EQUAL(tostring(in), tostring(out));
-}
-
-QPID_AUTO_TEST_CASE(testMessageCancelBodyFrame)
-{
- char buffer[1024];
- ProtocolVersion version(highestProtocolVersion);
- Buffer wbuff(buffer, sizeof(buffer));
- AMQFrame in((MessageCancelBody(version, "tag")));
- in.setChannel(999);
- in.encode(wbuff);
-
- Buffer rbuff(buffer, sizeof(buffer));
- AMQFrame out;
- out.decode(rbuff);
- BOOST_CHECK_EQUAL(tostring(in), tostring(out));
-}
-
-QPID_AUTO_TEST_CASE(badStrings) {
- char data[(65535 + 2) + (255 + 1)];
- Buffer b(data, sizeof(data));
- BOOST_CHECK_THROW(b.putShortString(std::string(256, 'X')),
- Exception);
- BOOST_CHECK_THROW(b.putMediumString(std::string(65536, 'X')),
- Exception);
- b.putShortString(std::string(255, 'X'));
- b.putMediumString(std::string(65535, 'X'));
-}
-
-QPID_AUTO_TEST_SUITE_END()
-
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/HeaderTest.cpp b/cpp/src/tests/HeaderTest.cpp
deleted file mode 100644
index 4b16f3c793..0000000000
--- a/cpp/src/tests/HeaderTest.cpp
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- *
- * 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.
- *
- */
-#include <iostream>
-#include "qpid/framing/amqp_framing.h"
-#include "qpid/framing/FieldValue.h"
-#include "unit_test.h"
-
-using namespace qpid::framing;
-using namespace std;
-
-namespace qpid {
-namespace tests {
-
-QPID_AUTO_TEST_SUITE(HeaderTestSuite)
-
-QPID_AUTO_TEST_CASE(testGenericProperties)
-{
- AMQHeaderBody body;
- body.get<MessageProperties>(true)->getApplicationHeaders().setString(
- "A", "BCDE");
- char buff[100];
- Buffer wbuffer(buff, 100);
- body.encode(wbuffer);
-
- Buffer rbuffer(buff, 100);
- AMQHeaderBody body2;
- body2.decode(rbuffer, body.encodedSize());
- MessageProperties* props =
- body2.get<MessageProperties>(true);
- BOOST_CHECK_EQUAL(
- string("BCDE"),
- props->getApplicationHeaders().get("A")->get<string>());
-}
-
-QPID_AUTO_TEST_CASE(testMessageProperties)
-{
- AMQFrame out((AMQHeaderBody()));
- MessageProperties* props1 =
- out.castBody<AMQHeaderBody>()->get<MessageProperties>(true);
-
- props1->setContentLength(42);
- props1->setMessageId(Uuid(true));
- props1->setCorrelationId("correlationId");
- props1->setReplyTo(ReplyTo("ex","key"));
- props1->setContentType("contentType");
- props1->setContentEncoding("contentEncoding");
- props1->setUserId("userId");
- props1->setAppId("appId");
-
- char buff[10000];
- Buffer wbuffer(buff, 10000);
- out.encode(wbuffer);
-
- Buffer rbuffer(buff, 10000);
- AMQFrame in;
- in.decode(rbuffer);
- MessageProperties* props2 =
- in.castBody<AMQHeaderBody>()->get<MessageProperties>(true);
-
- BOOST_CHECK_EQUAL(props1->getContentLength(), props2->getContentLength());
- BOOST_CHECK_EQUAL(props1->getMessageId(), props2->getMessageId());
- BOOST_CHECK_EQUAL(props1->getCorrelationId(), props2->getCorrelationId());
- BOOST_CHECK_EQUAL(props1->getContentType(), props2->getContentType());
- BOOST_CHECK_EQUAL(props1->getContentEncoding(), props2->getContentEncoding());
- BOOST_CHECK_EQUAL(props1->getUserId(), props2->getUserId());
- BOOST_CHECK_EQUAL(props1->getAppId(), props2->getAppId());
-
-}
-
-QPID_AUTO_TEST_CASE(testDeliveryProperies)
-{
- AMQFrame out((AMQHeaderBody()));
- DeliveryProperties* props1 =
- out.castBody<AMQHeaderBody>()->get<DeliveryProperties>(true);
-
- props1->setDiscardUnroutable(true);
- props1->setExchange("foo");
-
- char buff[10000];
- Buffer wbuffer(buff, 10000);
- out.encode(wbuffer);
-
- Buffer rbuffer(buff, 10000);
- AMQFrame in;
- in.decode(rbuffer);
- DeliveryProperties* props2 =
- in.castBody<AMQHeaderBody>()->get<DeliveryProperties>(true);
-
- BOOST_CHECK(props2->getDiscardUnroutable());
- BOOST_CHECK_EQUAL(string("foo"), props2->getExchange());
- BOOST_CHECK(!props2->hasTimestamp());
-}
-
-QPID_AUTO_TEST_SUITE_END()
-
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/HeadersExchangeTest.cpp b/cpp/src/tests/HeadersExchangeTest.cpp
deleted file mode 100644
index 40deb59c86..0000000000
--- a/cpp/src/tests/HeadersExchangeTest.cpp
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- *
- * 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.
- *
- */
-
-#include "qpid/Exception.h"
-#include "qpid/broker/HeadersExchange.h"
-#include "qpid/framing/FieldTable.h"
-#include "qpid/framing/FieldValue.h"
-#include "unit_test.h"
-
-using namespace qpid::broker;
-using namespace qpid::framing;
-
-namespace qpid {
-namespace tests {
-
-QPID_AUTO_TEST_SUITE(HeadersExchangeTestSuite)
-
-QPID_AUTO_TEST_CASE(testMatchAll)
-{
- FieldTable b, m, n;
- b.setString("x-match", "all");
- b.setString("foo", "FOO");
- b.setInt("n", 42);
- m.setString("foo", "FOO");
- m.setInt("n", 42);
- BOOST_CHECK(HeadersExchange::match(b, m));
-
- // Ignore extras.
- m.setString("extra", "x");
- BOOST_CHECK(HeadersExchange::match(b, m));
-
- // Fail mismatch, wrong value.
- m.setString("foo", "NotFoo");
- BOOST_CHECK(!HeadersExchange::match(b, m));
-
- // Fail mismatch, missing value
- n.setInt("n", 42);
- n.setString("extra", "x");
- BOOST_CHECK(!HeadersExchange::match(b, n));
-}
-
-QPID_AUTO_TEST_CASE(testMatchAny)
-{
- FieldTable b, m, n;
- b.setString("x-match", "any");
- b.setString("foo", "FOO");
- b.setInt("n", 42);
- m.setString("foo", "FOO");
- BOOST_CHECK(!HeadersExchange::match(b, n));
- BOOST_CHECK(HeadersExchange::match(b, m));
- m.setInt("n", 42);
- BOOST_CHECK(HeadersExchange::match(b, m));
-}
-
-QPID_AUTO_TEST_CASE(testMatchEmptyValue)
-{
- FieldTable b, m;
- b.setString("x-match", "all");
- b.set("foo", FieldTable::ValuePtr());
- b.set("n", FieldTable::ValuePtr());
- BOOST_CHECK(!HeadersExchange::match(b, m));
- m.setString("foo", "blah");
- m.setInt("n", 123);
-}
-
-QPID_AUTO_TEST_CASE(testMatchEmptyArgs)
-{
- FieldTable b, m;
- m.setString("foo", "FOO");
-
- b.setString("x-match", "all");
- BOOST_CHECK(HeadersExchange::match(b, m));
- b.setString("x-match", "any");
- BOOST_CHECK(!HeadersExchange::match(b, m));
-}
-
-
-QPID_AUTO_TEST_CASE(testMatchNoXMatch)
-{
- FieldTable b, m;
- b.setString("foo", "FOO");
- m.setString("foo", "FOO");
- BOOST_CHECK(!HeadersExchange::match(b, m));
-}
-
-QPID_AUTO_TEST_CASE(testBindNoXMatch)
-{
- HeadersExchange exchange("test");
- Queue::shared_ptr queue;
- std::string key;
- FieldTable args;
- try {
- //just checking this doesn't cause assertion etc
- exchange.bind(queue, key, &args);
- } catch(qpid::Exception&) {
- //expected
- }
-}
-
-QPID_AUTO_TEST_SUITE_END()
-
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/InitialStatusMap.cpp b/cpp/src/tests/InitialStatusMap.cpp
deleted file mode 100644
index ecbe2d4161..0000000000
--- a/cpp/src/tests/InitialStatusMap.cpp
+++ /dev/null
@@ -1,235 +0,0 @@
-/*
- *
- * 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 "qpid/cluster/InitialStatusMap.h"
-#include "qpid/framing/Uuid.h"
-#include <boost/assign.hpp>
-
-using namespace std;
-using namespace qpid::cluster;
-using namespace qpid::framing;
-using namespace qpid::framing::cluster;
-using namespace boost::assign;
-
-namespace qpid {
-namespace tests {
-
-QPID_AUTO_TEST_SUITE(InitialStatusMapTestSuite)
-
-typedef InitialStatusMap::Status Status;
-
-Status activeStatus(const Uuid& id=Uuid(), const MemberSet& ms=MemberSet()) {
- return Status(ProtocolVersion(), 0, true, id, STORE_STATE_NO_STORE, Uuid(),
- encodeMemberSet(ms));
-}
-
-Status newcomerStatus(const Uuid& id=Uuid(), const MemberSet& ms=MemberSet()) {
- return Status(ProtocolVersion(), 0, false, id, STORE_STATE_NO_STORE, Uuid(),
- encodeMemberSet(ms));
-}
-
-Status storeStatus(bool active, StoreState state, Uuid start=Uuid(), Uuid stop=Uuid(),
- const MemberSet& ms=MemberSet())
-{
- return Status(ProtocolVersion(), 0, active, start, state, stop,
- encodeMemberSet(ms));
-}
-
-QPID_AUTO_TEST_CASE(testFirstInCluster) {
- // Single member is first in cluster.
- InitialStatusMap map(MemberId(0), 1);
- Uuid id(true);
- BOOST_CHECK(!map.isComplete());
- MemberSet members = list_of(MemberId(0));
- map.configChange(members);
- BOOST_CHECK(!map.isComplete());
- map.received(MemberId(0), newcomerStatus(id, list_of<MemberId>(0)));
- BOOST_CHECK(map.isComplete());
- BOOST_CHECK(map.transitionToComplete());
- BOOST_CHECK(map.getElders().empty());
- BOOST_CHECK(!map.isUpdateNeeded());
- BOOST_CHECK_EQUAL(id, map.getClusterId());
-}
-
-QPID_AUTO_TEST_CASE(testJoinExistingCluster) {
- // Single member 0 joins existing cluster 1,2
- InitialStatusMap map(MemberId(0), 1);
- Uuid id(true);
- MemberSet members = list_of(MemberId(0))(MemberId(1))(MemberId(2));
- map.configChange(members);
- BOOST_CHECK(map.isResendNeeded());
- BOOST_CHECK(!map.isComplete());
- map.received(MemberId(0), newcomerStatus());
- map.received(MemberId(1), activeStatus(id));
- BOOST_CHECK(!map.isComplete());
- map.received(MemberId(2), activeStatus(id));
- BOOST_CHECK(map.isComplete());
- BOOST_CHECK(map.transitionToComplete());
- BOOST_CHECK_EQUAL(map.getElders(), list_of<MemberId>(1)(2));
- BOOST_CHECK(map.isUpdateNeeded());
- BOOST_CHECK_EQUAL(map.getClusterId(), id);
-
- // Check that transitionToComplete is reset.
- map.configChange(list_of<MemberId>(0)(1));
- BOOST_CHECK(!map.transitionToComplete());
-}
-
-QPID_AUTO_TEST_CASE(testMultipleFirstInCluster) {
- // Multiple members 0,1,2 join at same time.
- InitialStatusMap map(MemberId(1), 1); // self is 1
- Uuid id(true);
- MemberSet members = list_of(MemberId(0))(MemberId(1))(MemberId(2));
- map.configChange(members);
- BOOST_CHECK(map.isResendNeeded());
-
- // All new members
- map.received(MemberId(0), newcomerStatus(id, list_of<MemberId>(0)(1)(2)));
- map.received(MemberId(1), newcomerStatus(id, list_of<MemberId>(0)(1)(2)));
- map.received(MemberId(2), newcomerStatus(id, list_of<MemberId>(0)(1)(2)));
- BOOST_CHECK(!map.isResendNeeded());
- BOOST_CHECK(map.isComplete());
- BOOST_CHECK(map.transitionToComplete());
- BOOST_CHECK_EQUAL(map.getElders(), list_of(MemberId(2)));
- BOOST_CHECK(!map.isUpdateNeeded());
- BOOST_CHECK_EQUAL(map.getClusterId(), id);
-}
-
-QPID_AUTO_TEST_CASE(testMultipleJoinExisting) {
- // Multiple members 2,3 join simultaneously a cluster containing 0,1.
- InitialStatusMap map(MemberId(2), 1); // self is 2
- Uuid id(true);
- MemberSet members = list_of(MemberId(0))(MemberId(1))(MemberId(2))(MemberId(3));
- map.configChange(members);
- BOOST_CHECK(map.isResendNeeded());
- map.received(MemberId(0), activeStatus(id, list_of<MemberId>(0)));
- map.received(MemberId(1), newcomerStatus(id, list_of<MemberId>(0)(1)));
- map.received(MemberId(2), newcomerStatus(id, list_of<MemberId>(0)(1)(2)(3)));
- map.received(MemberId(3), newcomerStatus(id, list_of<MemberId>(0)(1)(2)(3)));
- BOOST_CHECK(!map.isResendNeeded());
- BOOST_CHECK(map.isComplete());
- BOOST_CHECK(map.transitionToComplete());
- BOOST_CHECK_EQUAL(map.getElders(), list_of<MemberId>(0)(1)(3));
- BOOST_CHECK(map.isUpdateNeeded());
- BOOST_CHECK_EQUAL(map.getClusterId(), id);
-}
-
-QPID_AUTO_TEST_CASE(testMembersLeave) {
- // Test that map completes if members leave rather than send status.
- InitialStatusMap map(MemberId(0), 1);
- Uuid id(true);
- map.configChange(list_of(MemberId(0))(MemberId(1))(MemberId(2)));
- map.received(MemberId(0), newcomerStatus());
- map.received(MemberId(1), activeStatus(id));
- BOOST_CHECK(!map.isComplete());
- map.configChange(list_of(MemberId(0))(MemberId(1))); // 2 left
- BOOST_CHECK(map.isComplete());
- BOOST_CHECK(map.transitionToComplete());
- BOOST_CHECK_EQUAL(map.getElders(), list_of(MemberId(1)));
- BOOST_CHECK_EQUAL(map.getClusterId(), id);
-}
-
-QPID_AUTO_TEST_CASE(testInteveningConfig) {
- // Multiple config changes arrives before we complete the map.
- InitialStatusMap map(MemberId(0), 1);
- Uuid id(true);
-
- map.configChange(list_of<MemberId>(0)(1));
- BOOST_CHECK(map.isResendNeeded());
- map.received(MemberId(0), newcomerStatus());
- BOOST_CHECK(!map.isComplete());
- BOOST_CHECK(!map.isResendNeeded());
- // New member 2 joins before we receive 1
- map.configChange(list_of<MemberId>(0)(1)(2));
- BOOST_CHECK(!map.isComplete());
- BOOST_CHECK(map.isResendNeeded());
- map.received(1, activeStatus(id));
- map.received(2, newcomerStatus());
- // We should not be complete as we haven't received 0 since new member joined
- BOOST_CHECK(!map.isComplete());
- BOOST_CHECK(!map.isResendNeeded());
-
- map.received(0, newcomerStatus());
- BOOST_CHECK(map.isComplete());
- BOOST_CHECK(map.transitionToComplete());
- BOOST_CHECK_EQUAL(map.getElders(), list_of<MemberId>(1));
- BOOST_CHECK_EQUAL(map.getClusterId(), id);
-}
-
-QPID_AUTO_TEST_CASE(testAllCleanNoUpdate) {
- InitialStatusMap map(MemberId(0), 3);
- map.configChange(list_of<MemberId>(0)(1)(2));
- map.received(MemberId(0), storeStatus(false, STORE_STATE_CLEAN_STORE));
- map.received(MemberId(1), storeStatus(false, STORE_STATE_CLEAN_STORE));
- map.received(MemberId(2), storeStatus(false, STORE_STATE_CLEAN_STORE));
- BOOST_CHECK(!map.isUpdateNeeded());
-}
-
-QPID_AUTO_TEST_CASE(testAllEmptyNoUpdate) {
- InitialStatusMap map(MemberId(0), 3);
- map.configChange(list_of<MemberId>(0)(1)(2));
- map.received(MemberId(0), storeStatus(false, STORE_STATE_EMPTY_STORE));
- map.received(MemberId(1), storeStatus(false, STORE_STATE_EMPTY_STORE));
- map.received(MemberId(2), storeStatus(false, STORE_STATE_EMPTY_STORE));
- BOOST_CHECK(map.isComplete());
- BOOST_CHECK(!map.isUpdateNeeded());
-}
-
-QPID_AUTO_TEST_CASE(testAllNoStoreNoUpdate) {
- InitialStatusMap map(MemberId(0), 3);
- map.configChange(list_of<MemberId>(0)(1)(2));
- map.received(MemberId(0), storeStatus(false, STORE_STATE_NO_STORE));
- map.received(MemberId(1), storeStatus(false, STORE_STATE_NO_STORE));
- map.received(MemberId(2), storeStatus(false, STORE_STATE_NO_STORE));
- BOOST_CHECK(map.isComplete());
- BOOST_CHECK(!map.isUpdateNeeded());
-}
-
-QPID_AUTO_TEST_CASE(testDirtyNeedUpdate) {
- InitialStatusMap map(MemberId(0), 3);
- map.configChange(list_of<MemberId>(0)(1)(2));
- map.received(MemberId(0), storeStatus(false, STORE_STATE_DIRTY_STORE));
- map.received(MemberId(1), storeStatus(false, STORE_STATE_CLEAN_STORE));
- map.received(MemberId(2), storeStatus(false, STORE_STATE_CLEAN_STORE));
- BOOST_CHECK(map.transitionToComplete());
- BOOST_CHECK(map.isUpdateNeeded());
-}
-
-QPID_AUTO_TEST_CASE(testEmptyNeedUpdate) {
- InitialStatusMap map(MemberId(0), 3);
- map.configChange(list_of<MemberId>(0)(1)(2));
- map.received(MemberId(0), storeStatus(false, STORE_STATE_EMPTY_STORE));
- map.received(MemberId(1), storeStatus(false, STORE_STATE_CLEAN_STORE));
- map.received(MemberId(2), storeStatus(false, STORE_STATE_CLEAN_STORE));
- BOOST_CHECK(map.transitionToComplete());
- BOOST_CHECK(map.isUpdateNeeded());
-}
-
-QPID_AUTO_TEST_CASE(testEmptyAlone) {
- InitialStatusMap map(MemberId(0), 1);
- map.configChange(list_of<MemberId>(0));
- map.received(MemberId(0), storeStatus(false, STORE_STATE_EMPTY_STORE));
- BOOST_CHECK(map.transitionToComplete());
- BOOST_CHECK(!map.isUpdateNeeded());
-}
-
-QPID_AUTO_TEST_SUITE_END()
-
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/InlineAllocator.cpp b/cpp/src/tests/InlineAllocator.cpp
deleted file mode 100644
index a4c4d64cea..0000000000
--- a/cpp/src/tests/InlineAllocator.cpp
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- *
- * 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.
- *
- */
-
-#include "qpid/InlineAllocator.h"
-#include "unit_test.h"
-
-namespace qpid {
-namespace tests {
-
-QPID_AUTO_TEST_SUITE(InlineAllocatorTestSuite)
-
-using namespace qpid;
-using namespace std;
-
-QPID_AUTO_TEST_CASE(testAllocate) {
- InlineAllocator<std::allocator<char>, 2> alloc;
-
- char* p = alloc.allocate(1);
- BOOST_CHECK(p == (char*)&alloc);
- alloc.deallocate(p,1);
-
- p = alloc.allocate(2);
- BOOST_CHECK(p == (char*)&alloc);
- alloc.deallocate(p,2);
-
- p = alloc.allocate(3);
- BOOST_CHECK(p != (char*)&alloc);
- alloc.deallocate(p,3);
-}
-
-QPID_AUTO_TEST_CASE(testAllocateFull) {
- InlineAllocator<std::allocator<char>, 1> alloc;
-
- char* p = alloc.allocate(1);
- BOOST_CHECK(p == (char*)&alloc);
-
- char* q = alloc.allocate(1);
- BOOST_CHECK(q != (char*)&alloc);
-
- alloc.deallocate(p,1);
- p = alloc.allocate(1);
- BOOST_CHECK(p == (char*)&alloc);
-
- alloc.deallocate(p,1);
- alloc.deallocate(q,1);
-}
-
-QPID_AUTO_TEST_SUITE_END()
-
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/InlineVector.cpp b/cpp/src/tests/InlineVector.cpp
deleted file mode 100644
index ba5165886d..0000000000
--- a/cpp/src/tests/InlineVector.cpp
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- *
- * 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.
- *
- */
-
-#include "qpid/InlineVector.h"
-#include "unit_test.h"
-
-namespace qpid {
-namespace tests {
-
-QPID_AUTO_TEST_SUITE(InlineVectorTestSuite)
-
-using namespace qpid;
-using namespace std;
-
-typedef InlineVector<int, 3> Vec;
-
-bool isInline(const Vec& v) {
- // If nothing, give it the benefit of the doubt;
- // can't take address of nothing.
- if (v.size() <= 0)
- return true;
- return (const char*)&v <= (const char*)(&v[0]) &&
- (const char*)(&v[0]) < (const char*)&v+sizeof(v);
-}
-
-QPID_AUTO_TEST_CASE(testCtor) {
- {
- Vec v;
- BOOST_CHECK(isInline(v));
- BOOST_CHECK(v.empty());
- }
- {
- Vec v(3, 42);
- BOOST_CHECK(isInline(v));
- BOOST_CHECK_EQUAL(3u, v.size());
- BOOST_CHECK_EQUAL(v[0], 42);
- BOOST_CHECK_EQUAL(v[2], 42);
-
- Vec u(v);
- BOOST_CHECK(isInline(u));
- BOOST_CHECK_EQUAL(3u, u.size());
- BOOST_CHECK_EQUAL(u[0], 42);
- BOOST_CHECK_EQUAL(u[2], 42);
- }
-
- {
- Vec v(4, 42);
-
- BOOST_CHECK_EQUAL(v.size(), 4u);
- BOOST_CHECK(!isInline(v));
- Vec u(v);
- BOOST_CHECK_EQUAL(u.size(), 4u);
- BOOST_CHECK(!isInline(u));
- }
-}
-
-QPID_AUTO_TEST_CASE(testInsert) {
- {
- Vec v;
- v.push_back(1);
- BOOST_CHECK_EQUAL(v.size(), 1u);
- BOOST_CHECK_EQUAL(v.back(), 1);
- BOOST_CHECK(isInline(v));
-
- v.insert(v.begin(), 2);
- BOOST_CHECK_EQUAL(v.size(), 2u);
- BOOST_CHECK_EQUAL(v.back(), 1);
- BOOST_CHECK(isInline(v));
-
- v.push_back(3);
- BOOST_CHECK(isInline(v));
-
- v.push_back(4);
-
- BOOST_CHECK(!isInline(v));
- }
- {
- Vec v(3,42);
- v.insert(v.begin(), 9);
- BOOST_CHECK_EQUAL(v.size(), 4u);
- BOOST_CHECK(!isInline(v));
- }
- {
- Vec v(3,42);
- v.insert(v.begin()+1, 9);
- BOOST_CHECK(!isInline(v));
- BOOST_CHECK_EQUAL(v.size(), 4u);
- }
-}
-
-QPID_AUTO_TEST_CASE(testAssign) {
- Vec v(3,42);
- Vec u;
- u = v;
- BOOST_CHECK(isInline(u));
- u.push_back(4);
- BOOST_CHECK(!isInline(u));
- v = u;
- BOOST_CHECK(!isInline(v));
-}
-
-QPID_AUTO_TEST_CASE(testResize) {
- Vec v;
- v.resize(5);
- BOOST_CHECK(!isInline(v));
-}
-
-QPID_AUTO_TEST_SUITE_END()
-
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/Makefile.am b/cpp/src/tests/Makefile.am
deleted file mode 100644
index ed97c41bff..0000000000
--- a/cpp/src/tests/Makefile.am
+++ /dev/null
@@ -1,398 +0,0 @@
-#
-# 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.
-#
-
-AM_CXXFLAGS = $(WARNING_CFLAGS) -DBOOST_TEST_DYN_LINK
-INCLUDES = -I$(top_srcdir)/include -I$(top_builddir)/include -I$(top_srcdir)/src -I$(top_builddir)/src
-PUBLIC_INCLUDES = -I$(top_srcdir)/include -I$(top_builddir)/include # Use public API only
-QMF_GEN=$(top_srcdir)/managementgen/qmf-gen
-
-abs_builddir=@abs_builddir@
-abs_srcdir=@abs_srcdir@
-
-extra_libs =
-lib_client = $(abs_builddir)/../libqpidclient.la
-lib_messaging = $(abs_builddir)/../libqpidmessaging.la
-lib_common = $(abs_builddir)/../libqpidcommon.la
-lib_broker = $(abs_builddir)/../libqpidbroker.la
-lib_console = $(abs_builddir)/../libqmfconsole.la
-lib_qmf2 = $(abs_builddir)/../libqmf2.la
-# lib_amqp_0_10 = $(abs_builddir)/../libqpidamqp_0_10.la
-
-#
-# Initialize variables that are incremented with +=
-#
-check_PROGRAMS=
-check_LTLIBRARIES=
-TESTS=
-EXTRA_DIST=
-CLEANFILES=
-LONG_TESTS=
-CLEAN_LOCAL=
-
-#
-# Destination for intalled programs and tests defined here
-#
-qpidexecdir = $(libexecdir)/qpid
-qpidexec_PROGRAMS =
-qpidexec_SCRIPTS =
-qpidtestdir = $(qpidexecdir)/tests
-qpidtest_PROGRAMS =
-qpidtest_SCRIPTS =
-tmoduledir = $(libdir)/qpid/tests
-tmodule_LTLIBRARIES=
-
-#
-# Unit test program
-#
-# Unit tests are built as a single program to reduce valgrind overhead
-# when running the tests. If you want to build a subset of the tests do
-# rm -f unit_test; make unit_test unit_test_OBJECTS="unit_test.o SelectedTest.o"
-#
-
-TESTS+=unit_test
-check_PROGRAMS+=unit_test
-unit_test_LDADD=-lboost_unit_test_framework \
- $(lib_messaging) $(lib_broker) $(lib_console) $(lib_qmf2)
-
-unit_test_SOURCES= unit_test.cpp unit_test.h \
- MessagingSessionTests.cpp \
- MessagingThreadTests.cpp \
- MessagingFixture.h \
- ClientSessionTest.cpp \
- BrokerFixture.h SocketProxy.h \
- exception_test.cpp \
- RefCounted.cpp \
- SessionState.cpp logging.cpp \
- AsyncCompletion.cpp \
- Url.cpp Uuid.cpp \
- Shlib.cpp FieldValue.cpp FieldTable.cpp Array.cpp \
- QueueOptionsTest.cpp \
- InlineAllocator.cpp \
- InlineVector.cpp \
- SequenceSet.cpp \
- StringUtils.cpp \
- RangeSet.cpp \
- AtomicValue.cpp \
- QueueTest.cpp \
- AccumulatedAckTest.cpp \
- DtxWorkRecordTest.cpp \
- DeliveryRecordTest.cpp \
- ExchangeTest.cpp \
- HeadersExchangeTest.cpp \
- MessageTest.cpp \
- QueueRegistryTest.cpp \
- QueuePolicyTest.cpp \
- QueueFlowLimitTest.cpp \
- FramingTest.cpp \
- HeaderTest.cpp \
- SequenceNumberTest.cpp \
- TimerTest.cpp \
- TopicExchangeTest.cpp \
- TxBufferTest.cpp \
- TxPublishTest.cpp \
- MessageBuilderTest.cpp \
- ConnectionOptions.h \
- ForkedBroker.h \
- ForkedBroker.cpp \
- ManagementTest.cpp \
- MessageReplayTracker.cpp \
- ConsoleTest.cpp \
- QueueEvents.cpp \
- ProxyTest.cpp \
- RetryList.cpp \
- RateFlowcontrolTest.cpp \
- FrameDecoder.cpp \
- ReplicationTest.cpp \
- ClientMessageTest.cpp \
- PollableCondition.cpp \
- Variant.cpp \
- Address.cpp \
- ClientMessage.cpp \
- Qmf2.cpp
-
-if HAVE_XML
-unit_test_SOURCES+= XmlClientSessionTest.cpp
-endif
-
-TESTLIBFLAGS = -module -rpath $(abs_builddir)
-
-check_LTLIBRARIES += libshlibtest.la
-libshlibtest_la_LDFLAGS = $(TESTLIBFLAGS)
-libshlibtest_la_SOURCES = shlibtest.cpp
-
-tmodule_LTLIBRARIES += test_store.la
-test_store_la_SOURCES = test_store.cpp
-test_store_la_LIBADD = $(lib_broker)
-test_store_la_LDFLAGS = -module
-
-include cluster.mk
-include sasl.mk
-if SSL
-include ssl.mk
-endif
-
-# Test programs that are installed and therefore built as part of make, not make check
-
-qpidtest_SCRIPTS += qpid-cpp-benchmark install_env.sh
-EXTRA_DIST += qpid-cpp-benchmark install_env.sh
-
-qpidtest_PROGRAMS += receiver
-receiver_SOURCES = \
- receiver.cpp \
- TestOptions.h \
- ConnectionOptions.h
-receiver_LDADD = $(lib_client)
-
-qpidtest_PROGRAMS += sender
-sender_SOURCES = \
- sender.cpp \
- TestOptions.h \
- ConnectionOptions.h \
- Statistics.cpp
-sender_LDADD = $(lib_messaging)
-
-qpidtest_PROGRAMS += qpid-receive
-qpid_receive_SOURCES = \
- qpid-receive.cpp \
- TestOptions.h \
- ConnectionOptions.h \
- Statistics.h \
- Statistics.cpp
-qpid_receive_LDADD = $(lib_messaging)
-
-qpidtest_PROGRAMS += qpid-send
-qpid_send_SOURCES = \
- qpid-send.cpp \
- TestOptions.h \
- ConnectionOptions.h \
- Statistics.h \
- Statistics.cpp
-qpid_send_LDADD = $(lib_messaging)
-
-qpidtest_PROGRAMS+=qpid-perftest
-qpid_perftest_SOURCES=qpid-perftest.cpp test_tools.h TestOptions.h ConnectionOptions.h
-qpid_perftest_INCLUDES=$(PUBLIC_INCLUDES)
-qpid_perftest_LDADD=$(lib_client)
-
-qpidtest_PROGRAMS+=qpid-txtest
-qpid_txtest_INCLUDES=$(PUBLIC_INCLUDES)
-qpid_txtest_SOURCES=qpid-txtest.cpp TestOptions.h ConnectionOptions.h
-qpid_txtest_LDADD=$(lib_client)
-
-qpidtest_PROGRAMS+=qpid-latency-test
-qpid_latency_test_INCLUDES=$(PUBLIC_INCLUDES)
-qpid_latency_test_SOURCES=qpid-latency-test.cpp TestOptions.h ConnectionOptions.h
-qpid_latency_test_LDADD=$(lib_client)
-
-qpidtest_PROGRAMS+=qpid-client-test
-qpid_client_test_INCLUDES=$(PUBLIC_INCLUDES)
-qpid_client_test_SOURCES=qpid-client-test.cpp TestOptions.h ConnectionOptions.h
-qpid_client_test_LDADD=$(lib_client)
-
-qpidtest_PROGRAMS+=qpid-topic-listener
-qpid_topic_listener_INCLUDES=$(PUBLIC_INCLUDES)
-qpid_topic_listener_SOURCES=qpid-topic-listener.cpp TestOptions.h ConnectionOptions.h
-qpid_topic_listener_LDADD=$(lib_client)
-
-qpidtest_PROGRAMS+=qpid-topic-publisher
-qpid_topic_publisher_INCLUDES=$(PUBLIC_INCLUDES)
-qpid_topic_publisher_SOURCES=qpid-topic-publisher.cpp TestOptions.h ConnectionOptions.h
-qpid_topic_publisher_LDADD=$(lib_client)
-
-qpidtest_PROGRAMS+=qpid-ping
-qpid_ping_INCLUDES=$(PUBLIC_INCLUDES)
-qpid_ping_SOURCES=qpid-ping.cpp test_tools.h TestOptions.h ConnectionOptions.h
-qpid_ping_LDADD=$(lib_client)
-
-#
-# Other test programs
-#
-
-check_PROGRAMS+=echotest
-echotest_INCLUDES=$(PUBLIC_INCLUDES)
-echotest_SOURCES=echotest.cpp TestOptions.h ConnectionOptions.h
-echotest_LDADD=$(lib_client)
-
-check_PROGRAMS+=publish
-publish_INCLUDES=$(PUBLIC_INCLUDES)
-publish_SOURCES=publish.cpp TestOptions.h ConnectionOptions.h
-publish_LDADD=$(lib_client)
-
-check_PROGRAMS+=consume
-consume_INCLUDES=$(PUBLIC_INCLUDES)
-consume_SOURCES=consume.cpp TestOptions.h ConnectionOptions.h
-consume_LDADD=$(lib_client)
-
-check_PROGRAMS+=header_test
-header_test_INCLUDES=$(PUBLIC_INCLUDES)
-header_test_SOURCES=header_test.cpp TestOptions.h ConnectionOptions.h
-header_test_LDADD=$(lib_client)
-
-check_PROGRAMS+=failover_soak
-failover_soak_INCLUDES=$(PUBLIC_INCLUDES)
-failover_soak_SOURCES=failover_soak.cpp ForkedBroker.h ForkedBroker.cpp
-failover_soak_LDADD=$(lib_client) $(lib_broker)
-
-check_PROGRAMS+=declare_queues
-declare_queues_INCLUDES=$(PUBLIC_INCLUDES)
-declare_queues_SOURCES=declare_queues.cpp
-declare_queues_LDADD=$(lib_client)
-
-check_PROGRAMS+=replaying_sender
-replaying_sender_INCLUDES=$(PUBLIC_INCLUDES)
-replaying_sender_SOURCES=replaying_sender.cpp
-replaying_sender_LDADD=$(lib_client)
-
-check_PROGRAMS+=resuming_receiver
-resuming_receiver_INCLUDES=$(PUBLIC_INCLUDES)
-resuming_receiver_SOURCES=resuming_receiver.cpp
-resuming_receiver_LDADD=$(lib_client)
-
-check_PROGRAMS+=txshift
-txshift_INCLUDES=$(PUBLIC_INCLUDES)
-txshift_SOURCES=txshift.cpp TestOptions.h ConnectionOptions.h
-txshift_LDADD=$(lib_client)
-
-check_PROGRAMS+=txjob
-txjob_INCLUDES=$(PUBLIC_INCLUDES)
-txjob_SOURCES=txjob.cpp TestOptions.h ConnectionOptions.h
-txjob_LDADD=$(lib_client)
-
-check_PROGRAMS+=PollerTest
-PollerTest_SOURCES=PollerTest.cpp
-PollerTest_LDADD=$(lib_common) $(lib_client) $(SOCKLIBS)
-
-check_PROGRAMS+=DispatcherTest
-DispatcherTest_SOURCES=DispatcherTest.cpp
-DispatcherTest_LDADD=$(lib_common) $(lib_client) $(SOCKLIBS)
-
-check_PROGRAMS+=datagen
-datagen_SOURCES=datagen.cpp
-datagen_LDADD=$(lib_common) $(lib_client)
-
-check_PROGRAMS+=qpid-stream
-qpid_stream_INCLUDES=$(PUBLIC_INCLUDES)
-qpid_stream_SOURCES=qpid-stream.cpp
-qpid_stream_LDADD=$(lib_messaging)
-
-TESTS_ENVIRONMENT = \
- VALGRIND=$(VALGRIND) \
- LIBTOOL="$(LIBTOOL)" \
- QPID_DATA_DIR= \
- $(srcdir)/run_test
-
-system_tests = qpid-client-test quick_perftest quick_topictest run_header_test quick_txtest
-TESTS += start_broker $(system_tests) python_tests stop_broker run_federation_tests \
- run_acl_tests run_cli_tests replication_test dynamic_log_level_test \
- run_queue_flow_limit_tests
-
-EXTRA_DIST += \
- run_test vg_check \
- run-unit-tests start_broker python_tests stop_broker \
- quick_topictest \
- quick_perftest \
- quick_txtest \
- topictest \
- run_header_test \
- header_test.py \
- ssl_test \
- config.null \
- ais_check \
- run_federation_tests \
- run_cli_tests \
- run_acl_tests \
- .valgrind.supp \
- MessageUtils.h \
- TestMessageStore.h \
- TxMocks.h \
- replication_test \
- run_perftest \
- ring_queue_test \
- run_ring_queue_test \
- dynamic_log_level_test \
- qpid-ctrl \
- CMakeLists.txt \
- cluster.cmake \
- windows/DisableWin32ErrorWindows.cpp \
- background.ps1 \
- find_prog.ps1 \
- python_tests.ps1 \
- quick_topictest.ps1 \
- run_federation_tests.ps1 \
- run_header_test.ps1 \
- run_test.ps1 \
- start_broker.ps1 \
- stop_broker.ps1 \
- topictest.ps1 \
- run_queue_flow_limit_tests
-
-check_LTLIBRARIES += libdlclose_noop.la
-libdlclose_noop_la_LDFLAGS = -module -rpath $(abs_builddir)
-libdlclose_noop_la_SOURCES = dlclose_noop.c
-
-CLEANFILES+=valgrind.out *.log *.vglog* dummy_test qpidd.port $(unit_wrappers)
-
-# Longer running stability tests, not run by default check: target.
-# Not run under valgrind, too slow
-
-LONG_TESTS+=start_broker fanout_perftest shared_perftest multiq_perftest topic_perftest run_ring_queue_test stop_broker \
- run_failover_soak reliable_replication_test \
- federated_cluster_test_with_node_failure
-
-EXTRA_DIST+= \
- fanout_perftest \
- shared_perftest \
- multiq_perftest \
- topic_perftest \
- run_failover_soak \
- reliable_replication_test \
- federated_cluster_test_with_node_failure \
- sasl_test_setup.sh
-
-check-long:
- $(MAKE) check TESTS="$(LONG_TESTS)" VALGRIND=
-
-# Things that should be built before the check target runs.
-check-am: python_prep test_env.sh install_env.sh sasl_config
-
-PYTHON_SRC_DIR=$(abs_srcdir)/../../../python
-PYTHON_BLD_DIR=$(abs_builddir)/python
-
-# Generate python client as part of the all-am target so it gets built before tests.
-all-am: python_prep
-
-python_prep:
- if test -d $(PYTHON_SRC_DIR); \
- then cd $(PYTHON_SRC_DIR) && python $(PYTHON_SRC_DIR)/setup.py install \
- --prefix=$(PYTHON_BLD_DIR) --install-lib=$(PYTHON_BLD_DIR) \
- --install-scripts=$(PYTHON_BLD_DIR)/commands; \
- else echo "WARNING: python client not built, missing $(PYTHON_SRC_DIR)"; fi
-
-sasl_config: sasl_test_setup.sh
- sh $(srcdir)/sasl_test_setup.sh
- touch sasl_config
-
-CLEAN_LOCAL += sasl_config
-
-clean-local:
- rm -rf $(CLEAN_LOCAL)
-
-include testagent.mk
-include brokermgmt.mk
-
diff --git a/cpp/src/tests/ManagementTest.cpp b/cpp/src/tests/ManagementTest.cpp
deleted file mode 100644
index 8944c084c0..0000000000
--- a/cpp/src/tests/ManagementTest.cpp
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- *
- * 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.
- *
- */
-
-#include "qpid/management/ManagementObject.h"
-#include "qpid/framing/Buffer.h"
-#include "qpid/console/ObjectId.h"
-#include "unit_test.h"
-
-namespace qpid {
-namespace tests {
-
-QPID_AUTO_TEST_SUITE(ManagementTestSuite)
-
-using namespace qpid::framing;
-using namespace qpid::management;
-
-QPID_AUTO_TEST_CASE(testObjectIdSerializeStream) {
- std::string text("0-10-4-2500-80000000000()");
- std::stringstream input(text);
-
- ObjectId oid(input);
-
- std::stringstream output;
- output << oid;
-
- BOOST_CHECK_EQUAL(text, output.str());
-}
-
-QPID_AUTO_TEST_CASE(testObjectIdSerializeString) {
- std::string text("0-10-4-2500-80000000000()");
-
- ObjectId oid(text);
-
- std::stringstream output;
- output << oid;
-
- BOOST_CHECK_EQUAL(text, output.str());
-}
-
-QPID_AUTO_TEST_CASE(testObjectIdEncode) {
- qpid::types::Variant::Map oidMap;
-
- ObjectId oid(1, 2, 3, 9999);
- oid.setV2Key("testkey");
- oid.setAgentName("myAgent");
-
- std::stringstream out1;
- out1 << oid;
-
- BOOST_CHECK_EQUAL(out1.str(), "1-2-3-myAgent-9999(testkey)");
-}
-
-QPID_AUTO_TEST_CASE(testObjectIdAttach) {
- AgentAttachment agent;
- ObjectId oid(&agent, 10, 20);
- oid.setV2Key("GabbaGabbaHey");
- oid.setAgentName("MrSmith");
-
- std::stringstream out1;
- out1 << oid;
-
- BOOST_CHECK_EQUAL(out1.str(), "10-20-0-MrSmith-0(GabbaGabbaHey)");
-
- agent.setBanks(30, 40);
- std::stringstream out2;
- out2 << oid;
-
- BOOST_CHECK_EQUAL(out2.str(), "10-20-30-MrSmith-0(GabbaGabbaHey)");
-}
-
-QPID_AUTO_TEST_CASE(testObjectIdCreate) {
- ObjectId oid("some-agent-name", "an-object-name");
-
- BOOST_CHECK_EQUAL(oid.getAgentName(), "some-agent-name");
- BOOST_CHECK_EQUAL(oid.getV2Key(), "an-object-name");
-}
-
-QPID_AUTO_TEST_CASE(testConsoleObjectId) {
- qpid::console::ObjectId oid1, oid2;
-
- oid1.setValue(1, 2);
- oid2.setValue(3, 4);
-
- BOOST_CHECK(oid1 < oid2);
- BOOST_CHECK(oid1 <= oid2);
- BOOST_CHECK(oid2 > oid1);
- BOOST_CHECK(oid2 >= oid1);
- BOOST_CHECK(oid1 != oid2);
- BOOST_CHECK(oid1 == oid1);
-
- oid1.setValue(3, 6);
- oid2.setValue(3, 4);
-
- BOOST_CHECK(oid1 > oid2);
- BOOST_CHECK(oid1 >= oid2);
- BOOST_CHECK(oid2 < oid1);
- BOOST_CHECK(oid2 <= oid1);
- BOOST_CHECK(oid1 != oid2);
-
- oid2.setValue(3, 6);
- BOOST_CHECK(oid1 == oid2);
-}
-
-QPID_AUTO_TEST_SUITE_END()
-
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/MessageBuilderTest.cpp b/cpp/src/tests/MessageBuilderTest.cpp
deleted file mode 100644
index c3d40ed88a..0000000000
--- a/cpp/src/tests/MessageBuilderTest.cpp
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- *
- * 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.
- *
- */
-#include "qpid/broker/Message.h"
-#include "qpid/broker/MessageBuilder.h"
-#include "qpid/broker/NullMessageStore.h"
-#include "qpid/framing/frame_functors.h"
-#include "qpid/framing/MessageTransferBody.h"
-#include "qpid/framing/TypeFilter.h"
-#include "unit_test.h"
-#include <list>
-
-using namespace qpid::broker;
-using namespace qpid::framing;
-using namespace qpid::sys;
-
-namespace qpid {
-namespace tests {
-
-class MockMessageStore : public NullMessageStore
-{
- enum Op {STAGE=1, APPEND=2};
-
- uint64_t id;
- boost::intrusive_ptr<PersistableMessage> expectedMsg;
- string expectedData;
- std::list<Op> ops;
-
- void checkExpectation(Op actual)
- {
- BOOST_CHECK_EQUAL(ops.front(), actual);
- ops.pop_front();
- }
-
- public:
- MockMessageStore() : id(0), expectedMsg(0) {}
-
- void expectStage(PersistableMessage& msg)
- {
- expectedMsg = &msg;
- ops.push_back(STAGE);
- }
-
- void expectAppendContent(PersistableMessage& msg, const string& data)
- {
- expectedMsg = &msg;
- expectedData = data;
- ops.push_back(APPEND);
- }
-
- void stage(const boost::intrusive_ptr<PersistableMessage>& msg)
- {
- checkExpectation(STAGE);
- BOOST_CHECK_EQUAL(expectedMsg, msg);
- msg->setPersistenceId(++id);
- }
-
- void appendContent(const boost::intrusive_ptr<const PersistableMessage>& msg,
- const string& data)
- {
- checkExpectation(APPEND);
- BOOST_CHECK_EQUAL(boost::static_pointer_cast<const PersistableMessage>(expectedMsg), msg);
- BOOST_CHECK_EQUAL(expectedData, data);
- }
-
- bool expectationsMet()
- {
- return ops.empty();
- }
-
- //don't treat this store as a null impl
- bool isNull() const
- {
- return false;
- }
-
-};
-
-QPID_AUTO_TEST_SUITE(MessageBuilderTestSuite)
-
-QPID_AUTO_TEST_CASE(testHeaderOnly)
-{
- MessageBuilder builder(0);
- builder.start(SequenceNumber());
-
- std::string exchange("builder-exchange");
- std::string key("builder-exchange");
-
- AMQFrame method((MessageTransferBody(ProtocolVersion(), exchange, 0, 0)));
- AMQFrame header((AMQHeaderBody()));
-
- header.castBody<AMQHeaderBody>()->get<MessageProperties>(true)->setContentLength(0);
- header.castBody<AMQHeaderBody>()->get<DeliveryProperties>(true)->setRoutingKey(key);
-
- builder.handle(method);
- builder.handle(header);
-
- BOOST_CHECK(builder.getMessage());
- BOOST_CHECK_EQUAL(exchange, builder.getMessage()->getExchangeName());
- BOOST_CHECK_EQUAL(key, builder.getMessage()->getRoutingKey());
- BOOST_CHECK(builder.getMessage()->getFrames().isComplete());
-}
-
-QPID_AUTO_TEST_CASE(test1ContentFrame)
-{
- MessageBuilder builder(0);
- builder.start(SequenceNumber());
-
- std::string data("abcdefg");
- std::string exchange("builder-exchange");
- std::string key("builder-exchange");
-
- AMQFrame method((MessageTransferBody(ProtocolVersion(), exchange, 0, 0)));
- AMQFrame header((AMQHeaderBody()));
- AMQFrame content((AMQContentBody(data)));
- method.setEof(false);
- header.setBof(false);
- header.setEof(false);
- content.setBof(false);
-
- header.castBody<AMQHeaderBody>()->get<MessageProperties>(true)->setContentLength(data.size());
- header.castBody<AMQHeaderBody>()->get<DeliveryProperties>(true)->setRoutingKey(key);
-
- builder.handle(method);
- BOOST_CHECK(builder.getMessage());
- BOOST_CHECK(!builder.getMessage()->getFrames().isComplete());
-
- builder.handle(header);
- BOOST_CHECK(builder.getMessage());
- BOOST_CHECK(!builder.getMessage()->getFrames().isComplete());
-
- builder.handle(content);
- BOOST_CHECK(builder.getMessage());
- BOOST_CHECK(builder.getMessage()->getFrames().isComplete());
-}
-
-QPID_AUTO_TEST_CASE(test2ContentFrames)
-{
- MessageBuilder builder(0);
- builder.start(SequenceNumber());
-
- std::string data1("abcdefg");
- std::string data2("hijklmn");
- std::string exchange("builder-exchange");
- std::string key("builder-exchange");
-
- AMQFrame method((MessageTransferBody(ProtocolVersion(), exchange, 0, 0)));
- AMQFrame header((AMQHeaderBody()));
- AMQFrame content1((AMQContentBody(data1)));
- AMQFrame content2((AMQContentBody(data2)));
- method.setEof(false);
- header.setBof(false);
- header.setEof(false);
- content1.setBof(false);
- content1.setEof(false);
- content2.setBof(false);
-
- header.castBody<AMQHeaderBody>()->get<MessageProperties>(true)->setContentLength(data1.size() + data2.size());
- header.castBody<AMQHeaderBody>()->get<DeliveryProperties>(true)->setRoutingKey(key);
-
- builder.handle(method);
- builder.handle(header);
- builder.handle(content1);
- BOOST_CHECK(builder.getMessage());
- BOOST_CHECK(!builder.getMessage()->getFrames().isComplete());
-
- builder.handle(content2);
- BOOST_CHECK(builder.getMessage());
- BOOST_CHECK(builder.getMessage()->getFrames().isComplete());
-}
-QPID_AUTO_TEST_SUITE_END()
-
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/MessageReplayTracker.cpp b/cpp/src/tests/MessageReplayTracker.cpp
deleted file mode 100644
index 3d79ee53c2..0000000000
--- a/cpp/src/tests/MessageReplayTracker.cpp
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- *
- * 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.
- *
- */
-#include "unit_test.h"
-#include "BrokerFixture.h"
-#include "qpid/client/MessageReplayTracker.h"
-#include "qpid/sys/Time.h"
-
-namespace qpid {
-namespace tests {
-
-QPID_AUTO_TEST_SUITE(MessageReplayTrackerTests)
-
-using namespace qpid::client;
-using namespace qpid::sys;
-using std::string;
-
-class ReplayBufferChecker
-{
- public:
-
- ReplayBufferChecker(uint from, uint to) : end(to), i(from) {}
-
- void operator()(const Message& m)
- {
- if (i > end) BOOST_FAIL("Extra message found: " + m.getData());
- BOOST_CHECK_EQUAL((boost::format("Message_%1%") % (i++)).str(), m.getData());
- }
- private:
- const uint end;
- uint i;
-
-};
-
-QPID_AUTO_TEST_CASE(testReplay)
-{
- ProxySessionFixture fix;
- fix.session.queueDeclare(arg::queue="my-queue", arg::exclusive=true, arg::autoDelete=true);
-
- MessageReplayTracker tracker(10);
- tracker.init(fix.session);
- for (uint i = 0; i < 5; i++) {
- Message message((boost::format("Message_%1%") % (i+1)).str(), "my-queue");
- tracker.send(message);
- }
- ReplayBufferChecker checker(1, 10);
- tracker.foreach(checker);
-
- tracker.replay(fix.session);
- for (uint j = 0; j < 2; j++) {//each message should have been sent twice
- for (uint i = 0; i < 5; i++) {
- Message m;
- BOOST_CHECK(fix.subs.get(m, "my-queue", TIME_SEC));
- BOOST_CHECK_EQUAL((boost::format("Message_%1%") % (i+1)).str(), m.getData());
- }
- }
- Message m;
- BOOST_CHECK(!fix.subs.get(m, "my-queue"));
-}
-
-QPID_AUTO_TEST_CASE(testCheckCompletion)
-{
- ProxySessionFixture fix;
- fix.session.queueDeclare(arg::queue="my-queue", arg::exclusive=true, arg::autoDelete=true);
-
- MessageReplayTracker tracker(10);
- tracker.init(fix.session);
- for (uint i = 0; i < 5; i++) {
- Message message((boost::format("Message_%1%") % (i+1)).str(), "my-queue");
- tracker.send(message);
- }
- fix.session.sync();//ensures all messages are complete
- tracker.checkCompletion();
- tracker.replay(fix.session);
- Message received;
- for (uint i = 0; i < 5; i++) {
- BOOST_CHECK(fix.subs.get(received, "my-queue"));
- BOOST_CHECK_EQUAL((boost::format("Message_%1%") % (i+1)).str(), received.getData());
- }
- BOOST_CHECK(!fix.subs.get(received, "my-queue"));
-}
-
-QPID_AUTO_TEST_SUITE_END()
-
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/MessageTest.cpp b/cpp/src/tests/MessageTest.cpp
deleted file mode 100644
index 7d67c92b37..0000000000
--- a/cpp/src/tests/MessageTest.cpp
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- *
- * 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.
- *
- */
-#include "qpid/broker/Message.h"
-#include "qpid/framing/AMQP_HighestVersion.h"
-#include "qpid/framing/AMQFrame.h"
-#include "qpid/framing/MessageTransferBody.h"
-#include "qpid/framing/FieldValue.h"
-#include "qpid/framing/Uuid.h"
-#include "qpid/sys/alloca.h"
-
-#include "unit_test.h"
-
-#include <iostream>
-
-using namespace qpid::broker;
-using namespace qpid::framing;
-
-namespace qpid {
-namespace tests {
-
-QPID_AUTO_TEST_SUITE(MessageTestSuite)
-
-QPID_AUTO_TEST_CASE(testEncodeDecode)
-{
- string exchange = "MyExchange";
- string routingKey = "MyRoutingKey";
- Uuid messageId(true);
- string data1("abcdefg");
- string data2("hijklmn");
-
- boost::intrusive_ptr<Message> msg(new Message());
-
- AMQFrame method((MessageTransferBody(ProtocolVersion(), exchange, 0, 0)));
- AMQFrame header((AMQHeaderBody()));
- AMQFrame content1((AMQContentBody(data1)));
- AMQFrame content2((AMQContentBody(data2)));
-
- msg->getFrames().append(method);
- msg->getFrames().append(header);
- msg->getFrames().append(content1);
- msg->getFrames().append(content2);
-
- MessageProperties* mProps = msg->getFrames().getHeaders()->get<MessageProperties>(true);
- mProps->setContentLength(data1.size() + data2.size());
- mProps->setMessageId(messageId);
- FieldTable applicationHeaders;
- applicationHeaders.setString("abc", "xyz");
- mProps->setApplicationHeaders(applicationHeaders);
- DeliveryProperties* dProps = msg->getFrames().getHeaders()->get<DeliveryProperties>(true);
- dProps->setRoutingKey(routingKey);
- dProps->setDeliveryMode(PERSISTENT);
- BOOST_CHECK(msg->isPersistent());
-
- char* buff = static_cast<char*>(::alloca(msg->encodedSize()));
- Buffer wbuffer(buff, msg->encodedSize());
- msg->encode(wbuffer);
-
- Buffer rbuffer(buff, msg->encodedSize());
- msg = new Message();
- msg->decodeHeader(rbuffer);
- msg->decodeContent(rbuffer);
- BOOST_CHECK_EQUAL(exchange, msg->getExchangeName());
- BOOST_CHECK_EQUAL(routingKey, msg->getRoutingKey());
- BOOST_CHECK_EQUAL((uint64_t) data1.size() + data2.size(), msg->contentSize());
- BOOST_CHECK_EQUAL((uint64_t) data1.size() + data2.size(), msg->getProperties<MessageProperties>()->getContentLength());
- BOOST_CHECK_EQUAL(messageId, msg->getProperties<MessageProperties>()->getMessageId());
- BOOST_CHECK_EQUAL(string("xyz"), msg->getProperties<MessageProperties>()->getApplicationHeaders().getAsString("abc"));
- BOOST_CHECK_EQUAL((uint8_t) PERSISTENT, msg->getProperties<DeliveryProperties>()->getDeliveryMode());
- BOOST_CHECK(msg->isPersistent());
-}
-
-QPID_AUTO_TEST_SUITE_END()
-
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/MessageUtils.h b/cpp/src/tests/MessageUtils.h
deleted file mode 100644
index a1b140d484..0000000000
--- a/cpp/src/tests/MessageUtils.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- *
- * 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.
- *
- */
-
-#include "qpid/broker/Message.h"
-#include "qpid/framing/AMQFrame.h"
-#include "qpid/framing/MessageTransferBody.h"
-#include "qpid/framing/Uuid.h"
-
-using namespace qpid;
-using namespace broker;
-using namespace framing;
-
-namespace qpid {
-namespace tests {
-
-struct MessageUtils
-{
- static boost::intrusive_ptr<Message> createMessage(const string& exchange="", const string& routingKey="",
- const bool durable = false, const Uuid& messageId=Uuid(true),
- uint64_t contentSize = 0)
- {
- boost::intrusive_ptr<broker::Message> msg(new broker::Message());
-
- AMQFrame method(( MessageTransferBody(ProtocolVersion(), exchange, 0, 0)));
- AMQFrame header((AMQHeaderBody()));
-
- msg->getFrames().append(method);
- msg->getFrames().append(header);
- MessageProperties* props = msg->getFrames().getHeaders()->get<MessageProperties>(true);
- props->setContentLength(contentSize);
- props->setMessageId(messageId);
- msg->getFrames().getHeaders()->get<DeliveryProperties>(true)->setRoutingKey(routingKey);
- if (durable)
- msg->getFrames().getHeaders()->get<DeliveryProperties>(true)->setDeliveryMode(2);
- return msg;
- }
-
- static void addContent(boost::intrusive_ptr<Message> msg, const string& data)
- {
- AMQFrame content((AMQContentBody(data)));
- msg->getFrames().append(content);
- }
-};
-
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/MessagingFixture.h b/cpp/src/tests/MessagingFixture.h
deleted file mode 100644
index 2312a87e9d..0000000000
--- a/cpp/src/tests/MessagingFixture.h
+++ /dev/null
@@ -1,345 +0,0 @@
-#ifndef TESTS_MESSAGINGFIXTURE_H
-#define TESTS_MESSAGINGFIXTURE_H
-
-/*
- *
- * 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.
- *
- */
-#include "BrokerFixture.h"
-#include "unit_test.h"
-#include "test_tools.h"
-#include "qpid/client/Connection.h"
-#include "qpid/client/Session.h"
-#include "qpid/framing/Uuid.h"
-#include "qpid/messaging/Address.h"
-#include "qpid/messaging/Connection.h"
-#include "qpid/messaging/Session.h"
-#include "qpid/messaging/Sender.h"
-#include "qpid/messaging/Receiver.h"
-#include "qpid/messaging/Message.h"
-#include "qpid/types/Variant.h"
-
-namespace qpid {
-namespace tests {
-
-using qpid::types::Variant;
-
-struct BrokerAdmin
-{
- qpid::client::Connection connection;
- qpid::client::Session session;
-
- BrokerAdmin(uint16_t port)
- {
- connection.open("localhost", port);
- session = connection.newSession();
- }
-
- void createQueue(const std::string& name)
- {
- session.queueDeclare(qpid::client::arg::queue=name);
- }
-
- void deleteQueue(const std::string& name)
- {
- session.queueDelete(qpid::client::arg::queue=name);
- }
-
- void createExchange(const std::string& name, const std::string& type)
- {
- session.exchangeDeclare(qpid::client::arg::exchange=name, qpid::client::arg::type=type);
- }
-
- void deleteExchange(const std::string& name)
- {
- session.exchangeDelete(qpid::client::arg::exchange=name);
- }
-
- bool checkQueueExists(const std::string& name)
- {
- return session.queueQuery(name).getQueue() == name;
- }
-
- bool checkExchangeExists(const std::string& name, std::string& type)
- {
- qpid::framing::ExchangeQueryResult result = session.exchangeQuery(name);
- type = result.getType();
- return !result.getNotFound();
- }
-
- void send(qpid::client::Message& message, const std::string& exchange=std::string())
- {
- session.messageTransfer(qpid::client::arg::destination=exchange, qpid::client::arg::content=message);
- }
-
- ~BrokerAdmin()
- {
- session.close();
- connection.close();
- }
-};
-
-struct MessagingFixture : public BrokerFixture
-{
- messaging::Connection connection;
- messaging::Session session;
- BrokerAdmin admin;
-
- MessagingFixture(Broker::Options opts = Broker::Options(), bool mgmtEnabled=false) :
- BrokerFixture(opts, mgmtEnabled),
- connection(open(broker->getPort(Broker::TCP_TRANSPORT))),
- session(connection.createSession()),
- admin(broker->getPort(Broker::TCP_TRANSPORT))
- {
- }
-
- static messaging::Connection open(uint16_t port)
- {
- messaging::Connection connection(
- (boost::format("amqp:tcp:localhost:%1%") % (port)).str());
- connection.open();
- return connection;
- }
-
- /** Open a connection to the broker. */
- qpid::messaging::Connection newConnection()
- {
- qpid::messaging::Connection connection(
- (boost::format("amqp:tcp:localhost:%1%") % (broker->getPort(qpid::broker::Broker::TCP_TRANSPORT))).str());
- return connection;
- }
-
- void ping(const qpid::messaging::Address& address)
- {
- messaging::Receiver r = session.createReceiver(address);
- messaging::Sender s = session.createSender(address);
- messaging::Message out(framing::Uuid(true).str());
- s.send(out);
- messaging::Message in;
- BOOST_CHECK(r.fetch(in, 5*messaging::Duration::SECOND));
- BOOST_CHECK_EQUAL(out.getContent(), in.getContent());
- r.close();
- s.close();
- }
-
- ~MessagingFixture()
- {
- session.close();
- connection.close();
- }
-};
-
-struct QueueFixture : MessagingFixture
-{
- std::string queue;
-
- QueueFixture(const std::string& name = "test-queue") : queue(name)
- {
- admin.createQueue(queue);
- }
-
- ~QueueFixture()
- {
- admin.deleteQueue(queue);
- }
-
-};
-
-struct TopicFixture : MessagingFixture
-{
- std::string topic;
-
- TopicFixture(const std::string& name = "test-topic", const std::string& type="fanout") : topic(name)
- {
- admin.createExchange(topic, type);
- }
-
- ~TopicFixture()
- {
- admin.deleteExchange(topic);
- }
-
-};
-
-struct MultiQueueFixture : MessagingFixture
-{
- typedef std::vector<std::string>::const_iterator const_iterator;
- std::vector<std::string> queues;
-
- MultiQueueFixture(const std::vector<std::string>& names = boost::assign::list_of<std::string>("q1")("q2")("q3")) : queues(names)
- {
- for (const_iterator i = queues.begin(); i != queues.end(); ++i) {
- admin.createQueue(*i);
- }
- }
-
- ~MultiQueueFixture()
- {
- connection.close();
- for (const_iterator i = queues.begin(); i != queues.end(); ++i) {
- admin.deleteQueue(*i);
- }
- }
-
-};
-
-inline std::vector<std::string> fetch(messaging::Receiver& receiver, int count, messaging::Duration timeout=messaging::Duration::SECOND*5)
-{
- std::vector<std::string> data;
- messaging::Message message;
- for (int i = 0; i < count && receiver.fetch(message, timeout); i++) {
- data.push_back(message.getContent());
- }
- return data;
-}
-
-
-inline void send(messaging::Sender& sender, uint count = 1, uint start = 1,
- const std::string& base = "Message")
-{
- for (uint i = start; i < start + count; ++i) {
- sender.send(messaging::Message((boost::format("%1%_%2%") % base % i).str()));
- }
-}
-
-inline void receive(messaging::Receiver& receiver, uint count = 1, uint start = 1,
- const std::string& base = "Message",
- messaging::Duration timeout=messaging::Duration::SECOND*5)
-{
- for (uint i = start; i < start + count; ++i) {
- BOOST_CHECK_EQUAL(receiver.fetch(timeout).getContent(), (boost::format("%1%_%2%") % base % i).str());
- }
-}
-
-
-class MethodInvoker
-{
- public:
- MethodInvoker(messaging::Session& session) : replyTo("#; {create:always, node:{x-declare:{auto-delete:true}}}"),
- sender(session.createSender("qmf.default.direct/broker")),
- receiver(session.createReceiver(replyTo)) {}
-
- void createExchange(const std::string& name, const std::string& type, bool durable=false)
- {
- Variant::Map params;
- params["name"]=name;
- params["type"]="exchange";
- params["properties"] = Variant::Map();
- params["properties"].asMap()["exchange-type"] = type;
- params["properties"].asMap()["durable"] = durable;
- methodRequest("create", params);
- }
-
- void deleteExchange(const std::string& name)
- {
- Variant::Map params;
- params["name"]=name;
- params["type"]="exchange";
- methodRequest("delete", params);
- }
-
- void createQueue(const std::string& name, bool durable=false, bool autodelete=false,
- const Variant::Map& options=Variant::Map())
- {
- Variant::Map params;
- params["name"]=name;
- params["type"]="queue";
- params["properties"] = options;
- params["properties"].asMap()["durable"] = durable;
- params["properties"].asMap()["auto-delete"] = autodelete;
- methodRequest("create", params);
- }
-
- void deleteQueue(const std::string& name)
- {
- Variant::Map params;
- params["name"]=name;
- params["type"]="queue";
- methodRequest("delete", params);
- }
-
- void bind(const std::string& exchange, const std::string& queue, const std::string& key,
- const Variant::Map& options=Variant::Map())
- {
- Variant::Map params;
- params["name"]=(boost::format("%1%/%2%/%3%") % (exchange) % (queue) % (key)).str();
- params["type"]="binding";
- params["properties"] = options;
- methodRequest("create", params);
- }
-
- void unbind(const std::string& exchange, const std::string& queue, const std::string& key)
- {
- Variant::Map params;
- params["name"]=(boost::format("%1%/%2%/%3%") % (exchange) % (queue) % (key)).str();
- params["type"]="binding";
- methodRequest("delete", params);
- }
-
- void methodRequest(const std::string& method, const Variant::Map& inParams, Variant::Map* outParams = 0)
- {
- Variant::Map content;
- Variant::Map objectId;
- objectId["_object_name"] = "org.apache.qpid.broker:broker:amqp-broker";
- content["_object_id"] = objectId;
- content["_method_name"] = method;
- content["_arguments"] = inParams;
-
- messaging::Message request;
- request.setReplyTo(replyTo);
- request.getProperties()["x-amqp-0-10.app-id"] = "qmf2";
- request.getProperties()["qmf.opcode"] = "_method_request";
- encode(content, request);
-
- sender.send(request);
-
- messaging::Message response;
- if (receiver.fetch(response, messaging::Duration::SECOND*5)) {
- if (response.getProperties()["x-amqp-0-10.app-id"] == "qmf2") {
- std::string opcode = response.getProperties()["qmf.opcode"];
- if (opcode == "_method_response") {
- if (outParams) {
- Variant::Map m;
- decode(response, m);
- *outParams = m["_arguments"].asMap();
- }
- } else if (opcode == "_exception") {
- Variant::Map m;
- decode(response, m);
- throw Exception(QPID_MSG("Error: " << m["_values"]));
- } else {
- throw Exception(QPID_MSG("Invalid response received, unexpected opcode: " << opcode));
- }
- } else {
- throw Exception(QPID_MSG("Invalid response received, not a qmfv2 message: app-id="
- << response.getProperties()["x-amqp-0-10.app-id"]));
- }
- } else {
- throw Exception(QPID_MSG("No response received"));
- }
- }
- private:
- messaging::Address replyTo;
- messaging::Sender sender;
- messaging::Receiver receiver;
-};
-
-}} // namespace qpid::tests
-
-#endif /*!TESTS_MESSAGINGFIXTURE_H*/
diff --git a/cpp/src/tests/MessagingSessionTests.cpp b/cpp/src/tests/MessagingSessionTests.cpp
deleted file mode 100644
index 6aa4c63ed7..0000000000
--- a/cpp/src/tests/MessagingSessionTests.cpp
+++ /dev/null
@@ -1,997 +0,0 @@
-/*
- *
- * 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.
- *
- */
-#include "MessagingFixture.h"
-#include "unit_test.h"
-#include "test_tools.h"
-#include "qpid/messaging/Address.h"
-#include "qpid/messaging/Connection.h"
-#include "qpid/messaging/Message.h"
-#include "qpid/messaging/Receiver.h"
-#include "qpid/messaging/Sender.h"
-#include "qpid/messaging/Session.h"
-#include "qpid/client/Connection.h"
-#include "qpid/client/Session.h"
-#include "qpid/framing/ExchangeQueryResult.h"
-#include "qpid/framing/reply_exceptions.h"
-#include "qpid/framing/Uuid.h"
-#include "qpid/sys/Time.h"
-#include <boost/assign.hpp>
-#include <boost/format.hpp>
-#include <string>
-#include <vector>
-
-namespace qpid {
-namespace tests {
-
-QPID_AUTO_TEST_SUITE(MessagingSessionTests)
-
-using namespace qpid::messaging;
-using namespace qpid::types;
-using namespace qpid;
-using qpid::broker::Broker;
-using qpid::framing::Uuid;
-
-
-QPID_AUTO_TEST_CASE(testSimpleSendReceive)
-{
- QueueFixture fix;
- Sender sender = fix.session.createSender(fix.queue);
- Message out("test-message");
- out.setSubject("test-subject");
- sender.send(out);
- Receiver receiver = fix.session.createReceiver(fix.queue);
- Message in = receiver.fetch(Duration::SECOND * 5);
- fix.session.acknowledge();
- BOOST_CHECK_EQUAL(in.getContent(), out.getContent());
- BOOST_CHECK_EQUAL(in.getSubject(), out.getSubject());
-}
-
-QPID_AUTO_TEST_CASE(testSyncSendReceive)
-{
- QueueFixture fix;
- Sender sender = fix.session.createSender(fix.queue);
- Message out("test-message");
- sender.send(out, true);
- Receiver receiver = fix.session.createReceiver(fix.queue);
- Message in = receiver.fetch(Duration::IMMEDIATE);
- fix.session.acknowledge(true);
- BOOST_CHECK_EQUAL(in.getContent(), out.getContent());
-}
-
-QPID_AUTO_TEST_CASE(testSendReceiveHeaders)
-{
- QueueFixture fix;
- Sender sender = fix.session.createSender(fix.queue);
- Message out("test-message");
- for (uint i = 0; i < 10; ++i) {
- out.getProperties()["a"] = i;
- out.setProperty("b", i + 100);
- sender.send(out);
- }
- Receiver receiver = fix.session.createReceiver(fix.queue);
- Message in;
- for (uint i = 0; i < 10; ++i) {
- BOOST_CHECK(receiver.fetch(in, Duration::SECOND * 5));
- BOOST_CHECK_EQUAL(in.getContent(), out.getContent());
- BOOST_CHECK_EQUAL(in.getProperties()["a"].asUint32(), i);
- BOOST_CHECK_EQUAL(in.getProperties()["b"].asUint32(), i + 100);
- fix.session.acknowledge();
- }
-}
-
-QPID_AUTO_TEST_CASE(testSenderError)
-{
- MessagingFixture fix;
- ScopedSuppressLogging sl;
- BOOST_CHECK_THROW(fix.session.createSender("NonExistentAddress"), qpid::messaging::NotFound);
- fix.session = fix.connection.createSession();
- BOOST_CHECK_THROW(fix.session.createSender("NonExistentAddress; {create:receiver}"),
- qpid::messaging::NotFound);
-}
-
-QPID_AUTO_TEST_CASE(testReceiverError)
-{
- MessagingFixture fix;
- ScopedSuppressLogging sl;
- BOOST_CHECK_THROW(fix.session.createReceiver("NonExistentAddress"), qpid::messaging::NotFound);
- fix.session = fix.connection.createSession();
- BOOST_CHECK_THROW(fix.session.createReceiver("NonExistentAddress; {create:sender}"),
- qpid::messaging::NotFound);
-}
-
-QPID_AUTO_TEST_CASE(testSimpleTopic)
-{
- TopicFixture fix;
-
- Sender sender = fix.session.createSender(fix.topic);
- Message msg("one");
- sender.send(msg);
- Receiver sub1 = fix.session.createReceiver(fix.topic);
- sub1.setCapacity(10u);
- msg.setContent("two");
- sender.send(msg);
- Receiver sub2 = fix.session.createReceiver(fix.topic);
- sub2.setCapacity(10u);
- msg.setContent("three");
- sender.send(msg);
- Receiver sub3 = fix.session.createReceiver(fix.topic);
- sub3.setCapacity(10u);
- msg.setContent("four");
- sender.send(msg);
- BOOST_CHECK_EQUAL(fetch(sub2, 2), boost::assign::list_of<std::string>("three")("four"));
- sub2.close();
-
- msg.setContent("five");
- sender.send(msg);
- BOOST_CHECK_EQUAL(fetch(sub1, 4), boost::assign::list_of<std::string>("two")("three")("four")("five"));
- BOOST_CHECK_EQUAL(fetch(sub3, 2), boost::assign::list_of<std::string>("four")("five"));
- Message in;
- BOOST_CHECK(!sub2.fetch(in, Duration::IMMEDIATE));//TODO: or should this raise an error?
-
-
- //TODO: check pending messages...
-}
-
-QPID_AUTO_TEST_CASE(testNextReceiver)
-{
- MultiQueueFixture fix;
-
- for (uint i = 0; i < fix.queues.size(); i++) {
- Receiver r = fix.session.createReceiver(fix.queues[i]);
- r.setCapacity(10u);
- }
-
- for (uint i = 0; i < fix.queues.size(); i++) {
- Sender s = fix.session.createSender(fix.queues[i]);
- Message msg((boost::format("Message_%1%") % (i+1)).str());
- s.send(msg);
- }
-
- for (uint i = 0; i < fix.queues.size(); i++) {
- Message msg;
- BOOST_CHECK(fix.session.nextReceiver().fetch(msg, Duration::SECOND));
- BOOST_CHECK_EQUAL(msg.getContent(), (boost::format("Message_%1%") % (i+1)).str());
- }
-}
-
-QPID_AUTO_TEST_CASE(testMapMessage)
-{
- QueueFixture fix;
- Sender sender = fix.session.createSender(fix.queue);
- Message out;
- Variant::Map content;
- content["abc"] = "def";
- content["pi"] = 3.14f;
- Variant utf8("A utf 8 string");
- utf8.setEncoding("utf8");
- content["utf8"] = utf8;
- Variant utf16("\x00\x61\x00\x62\x00\x63");
- utf16.setEncoding("utf16");
- content["utf16"] = utf16;
- encode(content, out);
- sender.send(out);
- Receiver receiver = fix.session.createReceiver(fix.queue);
- Message in = receiver.fetch(5 * Duration::SECOND);
- Variant::Map view;
- decode(in, view);
- BOOST_CHECK_EQUAL(view["abc"].asString(), "def");
- BOOST_CHECK_EQUAL(view["pi"].asFloat(), 3.14f);
- BOOST_CHECK_EQUAL(view["utf8"].asString(), utf8.asString());
- BOOST_CHECK_EQUAL(view["utf8"].getEncoding(), utf8.getEncoding());
- BOOST_CHECK_EQUAL(view["utf16"].asString(), utf16.asString());
- BOOST_CHECK_EQUAL(view["utf16"].getEncoding(), utf16.getEncoding());
- fix.session.acknowledge();
-}
-
-QPID_AUTO_TEST_CASE(testMapMessageWithInitial)
-{
- QueueFixture fix;
- Sender sender = fix.session.createSender(fix.queue);
- Message out;
- Variant::Map imap;
- imap["abc"] = "def";
- imap["pi"] = 3.14f;
- encode(imap, out);
- sender.send(out);
- Receiver receiver = fix.session.createReceiver(fix.queue);
- Message in = receiver.fetch(5 * Duration::SECOND);
- Variant::Map view;
- decode(in, view);
- BOOST_CHECK_EQUAL(view["abc"].asString(), "def");
- BOOST_CHECK_EQUAL(view["pi"].asFloat(), 3.14f);
- fix.session.acknowledge();
-}
-
-QPID_AUTO_TEST_CASE(testListMessage)
-{
- QueueFixture fix;
- Sender sender = fix.session.createSender(fix.queue);
- Message out;
- Variant::List content;
- content.push_back(Variant("abc"));
- content.push_back(Variant(1234));
- content.push_back(Variant("def"));
- content.push_back(Variant(56.789));
- encode(content, out);
- sender.send(out);
- Receiver receiver = fix.session.createReceiver(fix.queue);
- Message in = receiver.fetch(5 * Duration::SECOND);
- Variant::List view;
- decode(in, view);
- BOOST_CHECK_EQUAL(view.size(), content.size());
- BOOST_CHECK_EQUAL(view.front().asString(), "abc");
- BOOST_CHECK_EQUAL(view.back().asDouble(), 56.789);
-
- Variant::List::const_iterator i = view.begin();
- BOOST_CHECK(i != view.end());
- BOOST_CHECK_EQUAL(i->asString(), "abc");
- BOOST_CHECK(++i != view.end());
- BOOST_CHECK_EQUAL(i->asInt64(), 1234);
- BOOST_CHECK(++i != view.end());
- BOOST_CHECK_EQUAL(i->asString(), "def");
- BOOST_CHECK(++i != view.end());
- BOOST_CHECK_EQUAL(i->asDouble(), 56.789);
- BOOST_CHECK(++i == view.end());
-
- fix.session.acknowledge();
-}
-
-QPID_AUTO_TEST_CASE(testListMessageWithInitial)
-{
- QueueFixture fix;
- Sender sender = fix.session.createSender(fix.queue);
- Message out;
- Variant::List ilist;
- ilist.push_back(Variant("abc"));
- ilist.push_back(Variant(1234));
- ilist.push_back(Variant("def"));
- ilist.push_back(Variant(56.789));
- encode(ilist, out);
- sender.send(out);
- Receiver receiver = fix.session.createReceiver(fix.queue);
- Message in = receiver.fetch(5 * Duration::SECOND);
- Variant::List view;
- decode(in, view);
- BOOST_CHECK_EQUAL(view.size(), ilist.size());
- BOOST_CHECK_EQUAL(view.front().asString(), "abc");
- BOOST_CHECK_EQUAL(view.back().asDouble(), 56.789);
-
- Variant::List::const_iterator i = view.begin();
- BOOST_CHECK(i != view.end());
- BOOST_CHECK_EQUAL(i->asString(), "abc");
- BOOST_CHECK(++i != view.end());
- BOOST_CHECK_EQUAL(i->asInt64(), 1234);
- BOOST_CHECK(++i != view.end());
- BOOST_CHECK_EQUAL(i->asString(), "def");
- BOOST_CHECK(++i != view.end());
- BOOST_CHECK_EQUAL(i->asDouble(), 56.789);
- BOOST_CHECK(++i == view.end());
-
- fix.session.acknowledge();
-}
-
-QPID_AUTO_TEST_CASE(testReject)
-{
- QueueFixture fix;
- Sender sender = fix.session.createSender(fix.queue);
- Message m1("reject-me");
- sender.send(m1);
- Message m2("accept-me");
- sender.send(m2);
- Receiver receiver = fix.session.createReceiver(fix.queue);
- Message in = receiver.fetch(5 * Duration::SECOND);
- BOOST_CHECK_EQUAL(in.getContent(), m1.getContent());
- fix.session.reject(in);
- in = receiver.fetch(5 * Duration::SECOND);
- BOOST_CHECK_EQUAL(in.getContent(), m2.getContent());
- fix.session.acknowledge();
-}
-
-QPID_AUTO_TEST_CASE(testAvailable)
-{
- MultiQueueFixture fix;
-
- Receiver r1 = fix.session.createReceiver(fix.queues[0]);
- r1.setCapacity(100);
-
- Receiver r2 = fix.session.createReceiver(fix.queues[1]);
- r2.setCapacity(100);
-
- Sender s1 = fix.session.createSender(fix.queues[0]);
- Sender s2 = fix.session.createSender(fix.queues[1]);
-
- for (uint i = 0; i < 10; ++i) {
- s1.send(Message((boost::format("A_%1%") % (i+1)).str()));
- }
- for (uint i = 0; i < 5; ++i) {
- s2.send(Message((boost::format("B_%1%") % (i+1)).str()));
- }
- qpid::sys::sleep(1);//is there any avoid an arbitrary sleep while waiting for messages to be dispatched?
- for (uint i = 0; i < 5; ++i) {
- BOOST_CHECK_EQUAL(fix.session.getReceivable(), 15u - 2*i);
- BOOST_CHECK_EQUAL(r1.getAvailable(), 10u - i);
- BOOST_CHECK_EQUAL(r1.fetch().getContent(), (boost::format("A_%1%") % (i+1)).str());
- BOOST_CHECK_EQUAL(r2.getAvailable(), 5u - i);
- BOOST_CHECK_EQUAL(r2.fetch().getContent(), (boost::format("B_%1%") % (i+1)).str());
- fix.session.acknowledge();
- }
- for (uint i = 5; i < 10; ++i) {
- BOOST_CHECK_EQUAL(fix.session.getReceivable(), 10u - i);
- BOOST_CHECK_EQUAL(r1.getAvailable(), 10u - i);
- BOOST_CHECK_EQUAL(r1.fetch().getContent(), (boost::format("A_%1%") % (i+1)).str());
- }
-}
-
-QPID_AUTO_TEST_CASE(testUnsettledAcks)
-{
- QueueFixture fix;
- Sender sender = fix.session.createSender(fix.queue);
- for (uint i = 0; i < 10; ++i) {
- sender.send(Message((boost::format("Message_%1%") % (i+1)).str()));
- }
- Receiver receiver = fix.session.createReceiver(fix.queue);
- for (uint i = 0; i < 10; ++i) {
- BOOST_CHECK_EQUAL(receiver.fetch().getContent(), (boost::format("Message_%1%") % (i+1)).str());
- }
- BOOST_CHECK_EQUAL(fix.session.getUnsettledAcks(), 0u);
- fix.session.acknowledge();
- BOOST_CHECK_EQUAL(fix.session.getUnsettledAcks(), 10u);
- fix.session.sync();
- BOOST_CHECK_EQUAL(fix.session.getUnsettledAcks(), 0u);
-}
-
-QPID_AUTO_TEST_CASE(testUnsettledSend)
-{
- QueueFixture fix;
- Sender sender = fix.session.createSender(fix.queue);
- send(sender, 10);
- //Note: this test relies on 'inside knowledge' of the sender
- //implementation and the fact that the simple test case makes it
- //possible to predict when completion information will be sent to
- //the client. TODO: is there a better way of testing this?
- BOOST_CHECK_EQUAL(sender.getUnsettled(), 10u);
- fix.session.sync();
- BOOST_CHECK_EQUAL(sender.getUnsettled(), 0u);
-
- Receiver receiver = fix.session.createReceiver(fix.queue);
- receive(receiver, 10);
- fix.session.acknowledge();
-}
-
-QPID_AUTO_TEST_CASE(testBrowse)
-{
- QueueFixture fix;
- Sender sender = fix.session.createSender(fix.queue);
- send(sender, 10);
- Receiver browser1 = fix.session.createReceiver(fix.queue + "; {mode:browse}");
- receive(browser1, 10);
- Receiver browser2 = fix.session.createReceiver(fix.queue + "; {mode:browse}");
- receive(browser2, 10);
- Receiver consumer = fix.session.createReceiver(fix.queue);
- receive(consumer, 10);
- fix.session.acknowledge();
-}
-
-struct QueueCreatePolicyFixture : public MessagingFixture
-{
- qpid::messaging::Address address;
-
- QueueCreatePolicyFixture(const std::string& a) : address(a) {}
-
- void test()
- {
- ping(address);
- BOOST_CHECK(admin.checkQueueExists(address.getName()));
- }
-
- ~QueueCreatePolicyFixture()
- {
- admin.deleteQueue(address.getName());
- }
-};
-
-QPID_AUTO_TEST_CASE(testCreatePolicyQueueAlways)
-{
- QueueCreatePolicyFixture fix("#; {create:always, node:{type:queue}}");
- fix.test();
-}
-
-QPID_AUTO_TEST_CASE(testCreatePolicyQueueReceiver)
-{
- QueueCreatePolicyFixture fix("#; {create:receiver, node:{type:queue}}");
- Receiver r = fix.session.createReceiver(fix.address);
- fix.test();
- r.close();
-}
-
-QPID_AUTO_TEST_CASE(testCreatePolicyQueueSender)
-{
- QueueCreatePolicyFixture fix("#; {create:sender, node:{type:queue}}");
- Sender s = fix.session.createSender(fix.address);
- fix.test();
- s.close();
-}
-
-struct ExchangeCreatePolicyFixture : public MessagingFixture
-{
- qpid::messaging::Address address;
- const std::string exchangeType;
-
- ExchangeCreatePolicyFixture(const std::string& a, const std::string& t) :
- address(a), exchangeType(t) {}
-
- void test()
- {
- ping(address);
- std::string actualType;
- BOOST_CHECK(admin.checkExchangeExists(address.getName(), actualType));
- BOOST_CHECK_EQUAL(exchangeType, actualType);
- }
-
- ~ExchangeCreatePolicyFixture()
- {
- admin.deleteExchange(address.getName());
- }
-};
-
-QPID_AUTO_TEST_CASE(testCreatePolicyTopic)
-{
- ExchangeCreatePolicyFixture fix("#; {create:always, node:{type:topic}}",
- "topic");
- fix.test();
-}
-
-QPID_AUTO_TEST_CASE(testCreatePolicyTopicReceiverFanout)
-{
- ExchangeCreatePolicyFixture fix("#/my-subject; {create:receiver, node:{type:topic, x-declare:{type:fanout}}}", "fanout");
- Receiver r = fix.session.createReceiver(fix.address);
- fix.test();
- r.close();
-}
-
-QPID_AUTO_TEST_CASE(testCreatePolicyTopicSenderDirect)
-{
- ExchangeCreatePolicyFixture fix("#/my-subject; {create:sender, node:{type:topic, x-declare:{type:direct}}}", "direct");
- Sender s = fix.session.createSender(fix.address);
- fix.test();
- s.close();
-}
-
-struct DeletePolicyFixture : public MessagingFixture
-{
- enum Mode {RECEIVER, SENDER, ALWAYS, NEVER};
-
- std::string getPolicy(Mode mode)
- {
- switch (mode) {
- case SENDER:
- return "{delete:sender}";
- case RECEIVER:
- return "{delete:receiver}";
- case ALWAYS:
- return "{delete:always}";
- case NEVER:
- return "{delete:never}";
- }
- return "";
- }
-
- void testAll()
- {
- test(RECEIVER);
- test(SENDER);
- test(ALWAYS);
- test(NEVER);
- }
-
- virtual ~DeletePolicyFixture() {}
- virtual void create(const qpid::messaging::Address&) = 0;
- virtual void destroy(const qpid::messaging::Address&) = 0;
- virtual bool exists(const qpid::messaging::Address&) = 0;
-
- void test(Mode mode)
- {
- qpid::messaging::Address address("#; " + getPolicy(mode));
- create(address);
-
- Sender s = session.createSender(address);
- Receiver r = session.createReceiver(address);
- switch (mode) {
- case RECEIVER:
- s.close();
- BOOST_CHECK(exists(address));
- r.close();
- BOOST_CHECK(!exists(address));
- break;
- case SENDER:
- r.close();
- BOOST_CHECK(exists(address));
- s.close();
- BOOST_CHECK(!exists(address));
- break;
- case ALWAYS:
- s.close();
- BOOST_CHECK(!exists(address));
- break;
- case NEVER:
- r.close();
- BOOST_CHECK(exists(address));
- s.close();
- BOOST_CHECK(exists(address));
- destroy(address);
- }
- }
-};
-
-struct QueueDeletePolicyFixture : DeletePolicyFixture
-{
- void create(const qpid::messaging::Address& address)
- {
- admin.createQueue(address.getName());
- }
- void destroy(const qpid::messaging::Address& address)
- {
- admin.deleteQueue(address.getName());
- }
- bool exists(const qpid::messaging::Address& address)
- {
- return admin.checkQueueExists(address.getName());
- }
-};
-
-struct ExchangeDeletePolicyFixture : DeletePolicyFixture
-{
- const std::string exchangeType;
- ExchangeDeletePolicyFixture(const std::string type = "topic") : exchangeType(type) {}
-
- void create(const qpid::messaging::Address& address)
- {
- admin.createExchange(address.getName(), exchangeType);
- }
- void destroy(const qpid::messaging::Address& address)
- {
- admin.deleteExchange(address.getName());
- }
- bool exists(const qpid::messaging::Address& address)
- {
- std::string actualType;
- return admin.checkExchangeExists(address.getName(), actualType) && actualType == exchangeType;
- }
-};
-
-QPID_AUTO_TEST_CASE(testDeletePolicyQueue)
-{
- QueueDeletePolicyFixture fix;
- fix.testAll();
-}
-
-QPID_AUTO_TEST_CASE(testDeletePolicyExchange)
-{
- ExchangeDeletePolicyFixture fix;
- fix.testAll();
-}
-
-QPID_AUTO_TEST_CASE(testAssertPolicyQueue)
-{
- MessagingFixture fix;
- std::string a1 = "q; {create:always, assert:always, node:{type:queue, durable:false, x-declare:{arguments:{qpid.max-count:100}}}}";
- Sender s1 = fix.session.createSender(a1);
- s1.close();
- Receiver r1 = fix.session.createReceiver(a1);
- r1.close();
-
- std::string a2 = "q; {assert:receiver, node:{durable:true, x-declare:{arguments:{qpid.max-count:100}}}}";
- Sender s2 = fix.session.createSender(a2);
- s2.close();
- BOOST_CHECK_THROW(fix.session.createReceiver(a2), qpid::messaging::AssertionFailed);
-
- std::string a3 = "q; {assert:sender, node:{x-declare:{arguments:{qpid.max-count:99}}}}";
- BOOST_CHECK_THROW(fix.session.createSender(a3), qpid::messaging::AssertionFailed);
- Receiver r3 = fix.session.createReceiver(a3);
- r3.close();
-
- fix.admin.deleteQueue("q");
-}
-
-QPID_AUTO_TEST_CASE(testGetSender)
-{
- QueueFixture fix;
- std::string name = fix.session.createSender(fix.queue).getName();
- Sender sender = fix.session.getSender(name);
- BOOST_CHECK_EQUAL(name, sender.getName());
- Message out(Uuid(true).str());
- sender.send(out);
- Message in;
- BOOST_CHECK(fix.session.createReceiver(fix.queue).fetch(in));
- BOOST_CHECK_EQUAL(out.getContent(), in.getContent());
- BOOST_CHECK_THROW(fix.session.getSender("UnknownSender"), qpid::messaging::KeyError);
-}
-
-QPID_AUTO_TEST_CASE(testGetReceiver)
-{
- QueueFixture fix;
- std::string name = fix.session.createReceiver(fix.queue).getName();
- Receiver receiver = fix.session.getReceiver(name);
- BOOST_CHECK_EQUAL(name, receiver.getName());
- Message out(Uuid(true).str());
- fix.session.createSender(fix.queue).send(out);
- Message in;
- BOOST_CHECK(receiver.fetch(in));
- BOOST_CHECK_EQUAL(out.getContent(), in.getContent());
- BOOST_CHECK_THROW(fix.session.getReceiver("UnknownReceiver"), qpid::messaging::KeyError);
-}
-
-QPID_AUTO_TEST_CASE(testGetSessionFromConnection)
-{
- QueueFixture fix;
- fix.connection.createSession("my-session");
- Session session = fix.connection.getSession("my-session");
- Message out(Uuid(true).str());
- session.createSender(fix.queue).send(out);
- Message in;
- BOOST_CHECK(session.createReceiver(fix.queue).fetch(in));
- BOOST_CHECK_EQUAL(out.getContent(), in.getContent());
- BOOST_CHECK_THROW(fix.connection.getSession("UnknownSession"), qpid::messaging::KeyError);
-}
-
-QPID_AUTO_TEST_CASE(testGetConnectionFromSession)
-{
- QueueFixture fix;
- Message out(Uuid(true).str());
- Sender sender = fix.session.createSender(fix.queue);
- sender.send(out);
- Message in;
- sender.getSession().getConnection().createSession("incoming");
- BOOST_CHECK(fix.connection.getSession("incoming").createReceiver(fix.queue).fetch(in));
- BOOST_CHECK_EQUAL(out.getContent(), in.getContent());
-}
-
-QPID_AUTO_TEST_CASE(testTx)
-{
- QueueFixture fix;
- Session ssn1 = fix.connection.createTransactionalSession();
- Session ssn2 = fix.connection.createTransactionalSession();
- Sender sender1 = ssn1.createSender(fix.queue);
- Sender sender2 = ssn2.createSender(fix.queue);
- Receiver receiver1 = ssn1.createReceiver(fix.queue);
- Receiver receiver2 = ssn2.createReceiver(fix.queue);
- Message in;
-
- send(sender1, 5, 1, "A");
- send(sender2, 5, 1, "B");
- ssn2.commit();
- receive(receiver1, 5, 1, "B");//(only those from sender2 should be received)
- BOOST_CHECK(!receiver1.fetch(in, Duration::IMMEDIATE));//check there are no more messages
- ssn1.rollback();
- receive(receiver2, 5, 1, "B");
- BOOST_CHECK(!receiver2.fetch(in, Duration::IMMEDIATE));//check there are no more messages
- ssn2.rollback();
- receive(receiver1, 5, 1, "B");
- BOOST_CHECK(!receiver1.fetch(in, Duration::IMMEDIATE));//check there are no more messages
- ssn1.commit();
- //check neither receiver gets any more messages:
- BOOST_CHECK(!receiver1.fetch(in, Duration::IMMEDIATE));
- BOOST_CHECK(!receiver2.fetch(in, Duration::IMMEDIATE));
-}
-
-QPID_AUTO_TEST_CASE(testRelease)
-{
- QueueFixture fix;
- Sender sender = fix.session.createSender(fix.queue);
- Message out("test-message");
- sender.send(out, true);
- Receiver receiver = fix.session.createReceiver(fix.queue);
- Message m1 = receiver.fetch(Duration::IMMEDIATE);
- fix.session.release(m1);
- Message m2 = receiver.fetch(Duration::SECOND * 1);
- BOOST_CHECK_EQUAL(m1.getContent(), out.getContent());
- BOOST_CHECK_EQUAL(m1.getContent(), m2.getContent());
- fix.session.acknowledge(true);
-}
-
-QPID_AUTO_TEST_CASE(testOptionVerification)
-{
- MessagingFixture fix;
- fix.session.createReceiver("my-queue; {create: always, assert: always, delete: always, node: {type: queue, durable: false, x-declare: {arguments: {a: b}}, x-bindings: [{exchange: amq.fanout}]}, link: {name: abc, durable: false, reliability: exactly-once, x-subscribe: {arguments:{a:b}}, x-bindings:[{exchange: amq.fanout}]}, mode: browse}");
- BOOST_CHECK_THROW(fix.session.createReceiver("my-queue; {invalid-option:blah}"), qpid::messaging::AddressError);
-}
-
-QPID_AUTO_TEST_CASE(testReceiveSpecialProperties)
-{
- QueueFixture fix;
-
- qpid::client::Message out;
- out.getDeliveryProperties().setRoutingKey(fix.queue);
- out.getMessageProperties().setAppId("my-app-id");
- out.getMessageProperties().setMessageId(qpid::framing::Uuid(true));
- out.getMessageProperties().setContentEncoding("my-content-encoding");
- fix.admin.send(out);
-
- Receiver receiver = fix.session.createReceiver(fix.queue);
- Message in = receiver.fetch(Duration::SECOND * 5);
- BOOST_CHECK_EQUAL(in.getProperties()["x-amqp-0-10.routing-key"].asString(), out.getDeliveryProperties().getRoutingKey());
- BOOST_CHECK_EQUAL(in.getProperties()["x-amqp-0-10.app-id"].asString(), out.getMessageProperties().getAppId());
- BOOST_CHECK_EQUAL(in.getProperties()["x-amqp-0-10.content-encoding"].asString(), out.getMessageProperties().getContentEncoding());
- BOOST_CHECK_EQUAL(in.getMessageId(), out.getMessageProperties().getMessageId().str());
- fix.session.acknowledge(true);
-}
-
-QPID_AUTO_TEST_CASE(testSendSpecialProperties)
-{
- QueueFixture fix;
- Sender sender = fix.session.createSender(fix.queue);
- Message out("test-message");
- std::string appId = "my-app-id";
- std::string contentEncoding = "my-content-encoding";
- out.getProperties()["x-amqp-0-10.app-id"] = appId;
- out.getProperties()["x-amqp-0-10.content-encoding"] = contentEncoding;
- out.setMessageId(qpid::framing::Uuid(true).str());
- sender.send(out, true);
-
- qpid::client::LocalQueue q;
- qpid::client::SubscriptionManager subs(fix.admin.session);
- qpid::client::Subscription s = subs.subscribe(q, fix.queue);
- qpid::client::Message in = q.get();
- s.cancel();
- fix.admin.session.sync();
-
- BOOST_CHECK_EQUAL(in.getMessageProperties().getAppId(), appId);
- BOOST_CHECK_EQUAL(in.getMessageProperties().getContentEncoding(), contentEncoding);
- BOOST_CHECK_EQUAL(in.getMessageProperties().getMessageId().str(), out.getMessageId());
-}
-
-QPID_AUTO_TEST_CASE(testExclusiveSubscriber)
-{
- QueueFixture fix;
- std::string address = (boost::format("%1%; { link: { x-subscribe : { exclusive:true } } }") % fix.queue).str();
- Receiver receiver = fix.session.createReceiver(address);
- ScopedSuppressLogging sl;
- try {
- fix.session.createReceiver(address);
- fix.session.sync();
- BOOST_FAIL("Expected exception.");
- } catch (const MessagingException& /*e*/) {}
-}
-
-
-QPID_AUTO_TEST_CASE(testExclusiveQueueSubscriberAndBrowser)
-{
- MessagingFixture fix;
-
- std::string address = "exclusive-queue; { create: receiver, node : { x-declare : { auto-delete: true, exclusive: true } } }";
- std::string browseAddress = "exclusive-queue; { mode: browse }";
-
- Receiver receiver = fix.session.createReceiver(address);
- fix.session.sync();
-
- Connection c2 = fix.newConnection();
- c2.open();
- Session s2 = c2.createSession();
-
- BOOST_CHECK_NO_THROW(Receiver browser = s2.createReceiver(browseAddress));
- c2.close();
-}
-
-
-QPID_AUTO_TEST_CASE(testDeleteQueueWithUnackedMessages)
-{
- MessagingFixture fix;
- const uint capacity = 5;
-
- Sender sender = fix.session.createSender("test.ex;{create:always,node:{type:topic}}");
- Receiver receiver2 = fix.session.createReceiver("alternate.ex;{create:always,node:{type:topic}}");
- Receiver receiver1 = fix.session.createReceiver("test.q;{create:always, delete:always,node:{type:queue, x-declare:{alternate-exchange:alternate.ex}},link:{x-bindings:[{exchange:test.ex,queue:test.q,key:#}]}}");
-
- receiver1.setCapacity(capacity);
- receiver2.setCapacity(capacity*2);
-
- Message out("test-message");
- for (uint i = 0; i < capacity*2; ++i) {
- sender.send(out);
- }
-
- receiver1.close();
-
- // Make sure all pending messages were sent to the alternate
- // exchange when the queue was deleted.
- Message in;
- for (uint i = 0; i < capacity*2; ++i) {
- in = receiver2.fetch(Duration::SECOND * 5);
- BOOST_CHECK_EQUAL(in.getContent(), out.getContent());
- }
-}
-
-QPID_AUTO_TEST_CASE(testAuthenticatedUsername)
-{
- MessagingFixture fix;
- Connection connection = fix.newConnection();
- connection.setOption("sasl-mechanism", "PLAIN");
- connection.setOption("username", "test-user");
- connection.setOption("password", "ignored");
- connection.open();
- BOOST_CHECK_EQUAL(connection.getAuthenticatedUsername(), std::string("test-user"));
-}
-
-QPID_AUTO_TEST_CASE(testExceptionOnClosedConnection)
-{
- MessagingFixture fix;
- fix.connection.close();
- BOOST_CHECK_THROW(fix.connection.createSession(), MessagingException);
- Connection connection("blah");
- BOOST_CHECK_THROW(connection.createSession(), MessagingException);
-}
-
-QPID_AUTO_TEST_CASE(testAcknowledge)
-{
- QueueFixture fix;
- Sender sender = fix.session.createSender(fix.queue);
- const uint count(20);
- for (uint i = 0; i < count; ++i) {
- sender.send(Message((boost::format("Message_%1%") % (i+1)).str()));
- }
-
- Session other = fix.connection.createSession();
- Receiver receiver = other.createReceiver(fix.queue);
- std::vector<Message> messages;
- for (uint i = 0; i < count; ++i) {
- Message msg = receiver.fetch();
- BOOST_CHECK_EQUAL(msg.getContent(), (boost::format("Message_%1%") % (i+1)).str());
- messages.push_back(msg);
- }
- const uint batch(10); //acknowledge first 10 messages only
- for (uint i = 0; i < batch; ++i) {
- other.acknowledge(messages[i]);
- }
- messages.clear();
- other.sync();
- other.close();
-
- other = fix.connection.createSession();
- receiver = other.createReceiver(fix.queue);
- for (uint i = 0; i < (count-batch); ++i) {
- Message msg = receiver.fetch();
- BOOST_CHECK_EQUAL(msg.getContent(), (boost::format("Message_%1%") % (i+1+batch)).str());
- if (i % 2) other.acknowledge(msg); //acknowledge every other message
- }
- other.sync();
- other.close();
-
- //check unacknowledged messages are still enqueued
- other = fix.connection.createSession();
- receiver = other.createReceiver(fix.queue);
- for (uint i = 0; i < ((count-batch)/2); ++i) {
- Message msg = receiver.fetch();
- BOOST_CHECK_EQUAL(msg.getContent(), (boost::format("Message_%1%") % ((i*2)+1+batch)).str());
- }
- other.acknowledge();//acknowledge all messages
- other.sync();
- other.close();
-
- Message m;
- //check queue is empty
- BOOST_CHECK(!fix.session.createReceiver(fix.queue).fetch(m, Duration::IMMEDIATE));
-}
-
-QPID_AUTO_TEST_CASE(testQmfCreateAndDelete)
-{
- MessagingFixture fix(Broker::Options(), true/*enable management*/);
- MethodInvoker control(fix.session);
- control.createQueue("my-queue");
- control.createExchange("my-exchange", "topic");
- control.bind("my-exchange", "my-queue", "subject1");
-
- Sender sender = fix.session.createSender("my-exchange");
- Receiver receiver = fix.session.createReceiver("my-queue");
- Message out;
- out.setSubject("subject1");
- out.setContent("one");
- sender.send(out);
- Message in;
- BOOST_CHECK(receiver.fetch(in, Duration::SECOND*5));
- BOOST_CHECK_EQUAL(out.getContent(), in.getContent());
- control.unbind("my-exchange", "my-queue", "subject1");
- control.bind("my-exchange", "my-queue", "subject2");
-
- out.setContent("two");
- sender.send(out);//should be dropped
-
- out.setSubject("subject2");
- out.setContent("three");
- sender.send(out);//should not be dropped
-
- BOOST_CHECK(receiver.fetch(in, Duration::SECOND*5));
- BOOST_CHECK_EQUAL(out.getContent(), in.getContent());
- BOOST_CHECK(!receiver.fetch(in, Duration::IMMEDIATE));
- sender.close();
- receiver.close();
-
- control.deleteExchange("my-exchange");
- messaging::Session other = fix.connection.createSession();
- {
- ScopedSuppressLogging sl;
- BOOST_CHECK_THROW(other.createSender("my-exchange"), qpid::messaging::NotFound);
- }
- control.deleteQueue("my-queue");
- other = fix.connection.createSession();
- {
- ScopedSuppressLogging sl;
- BOOST_CHECK_THROW(other.createReceiver("my-queue"), qpid::messaging::NotFound);
- }
-}
-
-QPID_AUTO_TEST_CASE(testRejectAndCredit)
-{
- //Ensure credit is restored on completing rejected messages
- QueueFixture fix;
- Sender sender = fix.session.createSender(fix.queue);
- Receiver receiver = fix.session.createReceiver(fix.queue);
-
- const uint count(10);
- receiver.setCapacity(count);
- for (uint i = 0; i < count; i++) {
- sender.send(Message((boost::format("Message_%1%") % (i+1)).str()));
- }
-
- Message in;
- for (uint i = 0; i < count; ++i) {
- if (receiver.fetch(in, Duration::SECOND)) {
- BOOST_CHECK_EQUAL(in.getContent(), (boost::format("Message_%1%") % (i+1)).str());
- fix.session.reject(in);
- } else {
- BOOST_FAIL((boost::format("Message_%1% not received as expected") % (i+1)).str());
- break;
- }
- }
- //send another batch of messages
- for (uint i = 0; i < count; i++) {
- sender.send(Message((boost::format("Message_%1%") % (i+count)).str()));
- }
-
- for (uint i = 0; i < count; ++i) {
- if (receiver.fetch(in, Duration::SECOND)) {
- BOOST_CHECK_EQUAL(in.getContent(), (boost::format("Message_%1%") % (i+count)).str());
- } else {
- BOOST_FAIL((boost::format("Message_%1% not received as expected") % (i+count)).str());
- break;
- }
- }
- fix.session.acknowledge();
- receiver.close();
- sender.close();
-}
-
-QPID_AUTO_TEST_CASE(testTtlForever)
-{
- QueueFixture fix;
- Sender sender = fix.session.createSender(fix.queue);
- Message out("I want to live forever!");
- out.setTtl(Duration::FOREVER);
- sender.send(out, true);
- Receiver receiver = fix.session.createReceiver(fix.queue);
- Message in = receiver.fetch(Duration::IMMEDIATE);
- fix.session.acknowledge();
- BOOST_CHECK_EQUAL(in.getContent(), out.getContent());
- BOOST_CHECK(in.getTtl() == Duration::FOREVER);
-}
-
-QPID_AUTO_TEST_SUITE_END()
-
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/MessagingThreadTests.cpp b/cpp/src/tests/MessagingThreadTests.cpp
deleted file mode 100644
index 48264735b1..0000000000
--- a/cpp/src/tests/MessagingThreadTests.cpp
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- *
- * 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.
- *
- */
-#include "MessagingFixture.h"
-#include "qpid/sys/Runnable.h"
-#include "qpid/sys/Thread.h"
-#include <boost/lexical_cast.hpp>
-
-namespace qpid {
-namespace tests {
-QPID_AUTO_TEST_SUITE(MessagingThreadTests)
-
-using namespace messaging;
-using namespace boost::assign;
-using namespace std;
-
-struct ReceiveThread : public sys::Runnable {
- Receiver receiver;
- vector<string> received;
- string error;
-
- ReceiveThread(Receiver s) : receiver(s) {}
- void run() {
- try {
- while(true) {
- Message m = receiver.fetch(Duration::SECOND*5);
- if (m.getContent() == "END") break;
- received.push_back(m.getContent());
- }
- } catch (const NoMessageAvailable& e) {
- // Indicates that fetch timed out OR receiver was closed by other thread.
- if (!receiver.isClosed()) // timeout
- error = e.what();
- } catch (const std::exception& e) {
- error = e.what();
- }
- }
-};
-
-struct NextReceiverThread : public sys::Runnable {
- Session session;
- vector<string> received;
- string error;
-
- NextReceiverThread(Session s) : session(s) {}
- void run() {
- try {
- while(true) {
- Message m = session.nextReceiver(Duration::SECOND*5).fetch();
- if (m.getContent() == "END") break;
- received.push_back(m.getContent());
- }
- } catch (const std::exception& e) {
- error = e.what();
- }
- }
-};
-
-
-QPID_AUTO_TEST_CASE(testConcurrentSendReceive) {
- MessagingFixture fix;
- Sender s = fix.session.createSender("concurrent;{create:always}");
- Receiver r = fix.session.createReceiver("concurrent;{create:always,link:{reliability:unreliable}}");
- ReceiveThread rt(r);
- sys::Thread thread(rt);
- const size_t COUNT=100;
- for (size_t i = 0; i < COUNT; ++i) {
- s.send(Message());
- }
- s.send(Message("END"));
- thread.join();
- BOOST_CHECK_EQUAL(rt.error, string());
- BOOST_CHECK_EQUAL(COUNT, rt.received.size());
-}
-
-QPID_AUTO_TEST_CASE(testCloseBusyReceiver) {
- MessagingFixture fix;
- Receiver r = fix.session.createReceiver("closeReceiver;{create:always}");
- ReceiveThread rt(r);
- sys::Thread thread(rt);
- sys::usleep(1000); // Give the receive thread time to block.
- r.close();
- thread.join();
- BOOST_CHECK_EQUAL(rt.error, string());
-
- // Fetching on closed receiver should fail.
- Message m;
- BOOST_CHECK(!r.fetch(m, Duration(0)));
- BOOST_CHECK_THROW(r.fetch(Duration(0)), NoMessageAvailable);
-}
-
-QPID_AUTO_TEST_CASE(testCloseSessionBusyReceiver) {
- MessagingFixture fix;
- Receiver r = fix.session.createReceiver("closeSession;{create:always}");
- ReceiveThread rt(r);
- sys::Thread thread(rt);
- sys::usleep(1000); // Give the receive thread time to block.
- fix.session.close();
- thread.join();
- BOOST_CHECK_EQUAL(rt.error, string());
-
- // Fetching on closed receiver should fail.
- Message m;
- BOOST_CHECK(!r.fetch(m, Duration(0)));
- BOOST_CHECK_THROW(r.fetch(Duration(0)), NoMessageAvailable);
-}
-
-QPID_AUTO_TEST_CASE(testConcurrentSendNextReceiver) {
- MessagingFixture fix;
- Receiver r = fix.session.createReceiver("concurrent;{create:always,link:{reliability:unreliable}}");
- const size_t COUNT=100;
- r.setCapacity(COUNT);
- NextReceiverThread rt(fix.session);
- sys::Thread thread(rt);
- sys::usleep(1000); // Give the receive thread time to block.
- Sender s = fix.session.createSender("concurrent;{create:always}");
- for (size_t i = 0; i < COUNT; ++i) {
- s.send(Message());
- }
- s.send(Message("END"));
- thread.join();
- BOOST_CHECK_EQUAL(rt.error, string());
- BOOST_CHECK_EQUAL(COUNT, rt.received.size());
-}
-
-QPID_AUTO_TEST_SUITE_END()
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/PartialFailure.cpp b/cpp/src/tests/PartialFailure.cpp
deleted file mode 100644
index 63ee28017a..0000000000
--- a/cpp/src/tests/PartialFailure.cpp
+++ /dev/null
@@ -1,291 +0,0 @@
-/*
- *
- * 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.
- *
- */
-
-/**@file Tests for partial failure in a cluster.
- * Partial failure means some nodes experience a failure while others do not.
- * In this case the failed nodes must shut down.
- */
-
-#include "test_tools.h"
-#include "unit_test.h"
-#include "ClusterFixture.h"
-#include <boost/assign.hpp>
-#include <boost/algorithm/string.hpp>
-#include <boost/bind.hpp>
-
-namespace qpid {
-namespace tests {
-
-QPID_AUTO_TEST_SUITE(PartialFailureTestSuite)
-
-using namespace std;
-using namespace qpid;
-using namespace qpid::cluster;
-using namespace qpid::framing;
-using namespace qpid::client;
-using namespace qpid::client::arg;
-using namespace boost::assign;
-using broker::Broker;
-using boost::shared_ptr;
-
-// Timeout for tests that wait for messages
-const sys::Duration TIMEOUT=sys::TIME_SEC/4;
-
-static bool isLogOption(const std::string& s) { return boost::starts_with(s, "--log-enable"); }
-
-void updateArgs(ClusterFixture::Args& args, size_t index) {
- ostringstream clusterLib, testStoreLib, storeName;
- clusterLib << getLibPath("CLUSTER_LIB");
- testStoreLib << getLibPath("TEST_STORE_LIB");
- storeName << "s" << index;
- args.push_back("--auth");
- args.push_back("no");
- args.push_back("--no-module-dir");
- args.push_back("--load-module");
- args.push_back(clusterLib.str());
- args.push_back("--load-module");
- args.push_back(testStoreLib.str());
- args.push_back("--test-store-name");
- args.push_back(storeName.str());
- args.push_back("TMP_DATA_DIR");
-
- // These tests generate errors deliberately, disable error logging unless a log env var is set.
- if (!::getenv("QPID_TRACE") && !::getenv("QPID_LOG_ENABLE")) {
- remove_if(args.begin(), args.end(), isLogOption);
- args.push_back("--log-enable=critical+:DISABLED"); // hacky way to disable logs.
- }
-}
-
-Message pMessage(string data, string q) {
- Message msg(data, q);
- msg.getDeliveryProperties().setDeliveryMode(PERSISTENT);
- return msg;
-}
-
-void queueAndSub(Client& c) {
- c.session.queueDeclare(c.name, durable=true);
- c.subs.subscribe(c.lq, c.name);
-}
-
-// Handle near-simultaneous errors
-QPID_AUTO_TEST_CASE(testCoincidentErrors) {
- ClusterFixture cluster(2, updateArgs, -1);
- Client c0(cluster[0], "c0");
- Client c1(cluster[1], "c1");
-
- c0.session.queueDeclare("q", durable=true);
- {
- ScopedSuppressLogging allQuiet;
- async(c0.session).messageTransfer(content=pMessage("TEST_STORE_DO: s0[exception]", "q"));
- async(c1.session).messageTransfer(content=pMessage("TEST_STORE_DO: s1[exception]", "q"));
-
- int alive=0;
- try { Client c00(cluster[0], "c00"); ++alive; c00.close(); } catch (...) {}
- try { Client c11(cluster[1], "c11"); ++alive; c11.close(); } catch (...) {}
-
- BOOST_CHECK_EQUAL(alive, 1);
-
- // Close inside ScopedSuppressLogging to avoid warnings
- c0.close();
- c1.close();
- }
-}
-
-// Verify normal cluster-wide errors.
-QPID_AUTO_TEST_CASE(testNormalErrors) {
- // FIXME aconway 2009-04-10: Would like to put a scope just around
- // the statements expected to fail (in BOOST_CHECK_yTHROW) but that
- // sproadically lets out messages, possibly because they're in
- // Connection thread.
-
- ClusterFixture cluster(3, updateArgs, -1);
- Client c0(cluster[0], "c0");
- Client c1(cluster[1], "c1");
- Client c2(cluster[2], "c2");
-
- {
- ScopedSuppressLogging allQuiet;
- queueAndSub(c0);
- c0.session.messageTransfer(content=Message("x", "c0"));
- BOOST_CHECK_EQUAL(c0.lq.get(TIMEOUT).getData(), "x");
-
- // Session error.
- BOOST_CHECK_THROW(c0.session.exchangeBind(), SessionException);
- c1.session.messageTransfer(content=Message("stay", "c0")); // Will stay on queue, session c0 is dead.
-
- // Connection error, kill c1 on all members.
- queueAndSub(c1);
- BOOST_CHECK_THROW(
- c1.session.messageTransfer(
- content=pMessage("TEST_STORE_DO: s0[exception] s1[exception] s2[exception] testNormalErrors", "c1")),
- ConnectionException);
- c2.session.messageTransfer(content=Message("stay", "c1")); // Will stay on queue, session/connection c1 is dead.
-
- BOOST_CHECK_EQUAL(3u, knownBrokerPorts(c2.connection, 3).size());
- BOOST_CHECK_EQUAL(c2.subs.get("c0", TIMEOUT).getData(), "stay");
- BOOST_CHECK_EQUAL(c2.subs.get("c1", TIMEOUT).getData(), "stay");
-
- // Close inside ScopedSuppressLogging to avoid warnings
- c0.close();
- c1.close();
- c2.close();
- }
-}
-
-
-// Test errors after a new member joins to verify frame-sequence-numbers are ok in update.
-QPID_AUTO_TEST_CASE(testErrorAfterJoin) {
- ClusterFixture cluster(1, updateArgs, -1);
- Client c0(cluster[0]);
- {
- ScopedSuppressLogging allQuiet;
-
- c0.session.queueDeclare("q", durable=true);
- c0.session.messageTransfer(content=pMessage("a", "q"));
-
- // Kill the new guy
- cluster.add();
- Client c1(cluster[1]);
- c0.session.messageTransfer(content=pMessage("TEST_STORE_DO: s1[exception] testErrorAfterJoin", "q"));
- BOOST_CHECK_THROW(c1.session.messageTransfer(content=pMessage("xxx", "q")), TransportFailure);
- BOOST_CHECK_EQUAL(1u, knownBrokerPorts(c0.connection, 1).size());
-
- // Kill the old guy
- cluster.add();
- Client c2(cluster[2]);
- c2.session.messageTransfer(content=pMessage("TEST_STORE_DO: s0[exception] testErrorAfterJoin2", "q"));
- BOOST_CHECK_THROW(c0.session.messageTransfer(content=pMessage("xxx", "q")), TransportFailure);
-
- BOOST_CHECK_EQUAL(1u, knownBrokerPorts(c2.connection, 1).size());
-
- // Close inside ScopedSuppressLogging to avoid warnings
- c0.close();
- c1.close();
- c2.close();
- }
-}
-
-// Test that if one member fails and others do not, the failure leaves the cluster.
-QPID_AUTO_TEST_CASE(testSinglePartialFailure) {
- ClusterFixture cluster(3, updateArgs, -1);
- Client c0(cluster[0], "c0");
- Client c1(cluster[1], "c1");
- Client c2(cluster[2], "c2");
-
- {
- ScopedSuppressLogging allQuiet;
-
- c0.session.queueDeclare("q", durable=true);
- c0.session.messageTransfer(content=pMessage("a", "q"));
- // Cause partial failure on c1
- c0.session.messageTransfer(content=pMessage("TEST_STORE_DO: s1[exception] testSinglePartialFailure", "q"));
- BOOST_CHECK_THROW(c1.session.queueQuery("q"), TransportFailure);
-
- c0.session.messageTransfer(content=pMessage("b", "q"));
- BOOST_CHECK_EQUAL(c0.session.queueQuery("q").getMessageCount(), 3u);
- BOOST_CHECK_EQUAL(2u, knownBrokerPorts(c0.connection, 2).size());
-
- // Cause partial failure on c2
- c0.session.messageTransfer(content=pMessage("TEST_STORE_DO: s2[exception] testSinglePartialFailure2", "q"));
- BOOST_CHECK_THROW(c2.session.queueQuery("q"), TransportFailure);
-
- c0.session.messageTransfer(content=pMessage("c", "q"));
- BOOST_CHECK_EQUAL(c0.session.queueQuery("q").getMessageCount(), 5u);
- BOOST_CHECK_EQUAL(1u, knownBrokerPorts(c0.connection, 1).size());
-
- // Close inside ScopedSuppressLogging to avoid warnings
- c0.close();
- c1.close();
- c2.close();
- }
-}
-
-// Test multiple partial falures: 2 fail 2 pass
-QPID_AUTO_TEST_CASE(testMultiPartialFailure) {
- ClusterFixture cluster(4, updateArgs, -1);
- Client c0(cluster[0], "c0");
- Client c1(cluster[1], "c1");
- Client c2(cluster[2], "c2");
- Client c3(cluster[3], "c3");
-
- {
- ScopedSuppressLogging allQuiet;
-
- c0.session.queueDeclare("q", durable=true);
- c0.session.messageTransfer(content=pMessage("a", "q"));
-
- // Cause partial failure on c1, c2
- c0.session.messageTransfer(content=pMessage("TEST_STORE_DO: s1[exception] s2[exception] testMultiPartialFailure", "q"));
- BOOST_CHECK_THROW(c1.session.queueQuery("q"), TransportFailure);
- BOOST_CHECK_THROW(c2.session.queueQuery("q"), TransportFailure);
-
- c0.session.messageTransfer(content=pMessage("b", "q"));
- c3.session.messageTransfer(content=pMessage("c", "q"));
- BOOST_CHECK_EQUAL(c3.session.queueQuery("q").getMessageCount(), 4u);
- // FIXME aconway 2009-06-30: This check fails sporadically with 2 != 3.
- // It should pass reliably.
- // BOOST_CHECK_EQUAL(2u, knownBrokerPorts(c0.connection, 2).size());
-
- // Close inside ScopedSuppressLogging to avoid warnings
- c0.close();
- c1.close();
- c2.close();
- c3.close();
- }
-}
-
-/** FIXME aconway 2009-04-10:
- * The current approach to shutting down a process in test_store
- * sometimes leads to assertion failures and errors in the shut-down
- * process. Need a cleaner solution
- */
-#if 0
-QPID_AUTO_TEST_CASE(testPartialFailureMemberLeaves) {
- ClusterFixture cluster(2, updateArgs, -1);
- Client c0(cluster[0], "c0");
- Client c1(cluster[1], "c1");
-
- {
- ScopedSuppressLogging allQuiet;
-
- c0.session.queueDeclare("q", durable=true);
- c0.session.messageTransfer(content=pMessage("a", "q"));
-
- // Cause failure on member 0 and simultaneous crash on member 1.
- BOOST_CHECK_THROW(
- c0.session.messageTransfer(
- content=pMessage("TEST_STORE_DO: s0[exception] s1[exit_process] testPartialFailureMemberLeaves", "q")),
- ConnectionException);
- cluster.wait(1);
-
- Client c00(cluster[0], "c00"); // Old connection is dead.
- BOOST_CHECK_EQUAL(c00.session.queueQuery("q").getMessageCount(), 1u);
- BOOST_CHECK_EQUAL(1u, knownBrokerPorts(c00.connection, 1).size());
-
- // Close inside ScopedSuppressLogging to avoid warnings
- c0.close();
- }
-}
-#endif
-
-QPID_AUTO_TEST_SUITE_END()
-
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/PollableCondition.cpp b/cpp/src/tests/PollableCondition.cpp
deleted file mode 100644
index f9b3c25c93..0000000000
--- a/cpp/src/tests/PollableCondition.cpp
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- *
- * 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.
- *
- */
-
-#include "test_tools.h"
-#include "unit_test.h"
-#include "qpid/sys/Poller.h"
-#include "qpid/sys/PollableCondition.h"
-#include "qpid/sys/Monitor.h"
-#include "qpid/sys/Time.h"
-#include "qpid/sys/Thread.h"
-#include <boost/bind.hpp>
-
-namespace qpid {
-namespace tests {
-
-QPID_AUTO_TEST_SUITE(PollableConditionTest)
-
-using namespace qpid::sys;
-
-const Duration SHORT = TIME_SEC/100;
-const Duration LONG = TIME_SEC/10;
-
-class Callback {
- public:
- enum Action { NONE, CLEAR };
-
- Callback() : count(), action(NONE) {}
-
- void call(PollableCondition& pc) {
- Mutex::ScopedLock l(lock);
- ++count;
- switch(action) {
- case NONE: break;
- case CLEAR: pc.clear(); break;
- }
- action = NONE;
- lock.notify();
- }
-
- bool isCalling() { Mutex::ScopedLock l(lock); return wait(LONG); }
-
- bool isNotCalling() { Mutex::ScopedLock l(lock); return !wait(SHORT); }
-
- bool nextCall(Action a=NONE) {
- Mutex::ScopedLock l(lock);
- action = a;
- return wait(LONG);
- }
-
- private:
- bool wait(Duration timeout) {
- int n = count;
- AbsTime deadline(now(), timeout);
- while (n == count && lock.wait(deadline))
- ;
- return n != count;
- }
-
- Monitor lock;
- int count;
- Action action;
-};
-
-QPID_AUTO_TEST_CASE(testPollableCondition) {
- boost::shared_ptr<Poller> poller(new Poller());
- Callback callback;
- PollableCondition pc(boost::bind(&Callback::call, &callback, _1), poller);
-
- Thread runner = Thread(*poller);
-
- BOOST_CHECK(callback.isNotCalling()); // condition is not set.
-
- pc.set();
- BOOST_CHECK(callback.isCalling()); // Set.
- BOOST_CHECK(callback.isCalling()); // Still set.
-
- callback.nextCall(Callback::CLEAR);
- BOOST_CHECK(callback.isNotCalling()); // Cleared
-
- pc.set();
- BOOST_CHECK(callback.isCalling()); // Set.
- callback.nextCall(Callback::CLEAR);
- BOOST_CHECK(callback.isNotCalling()); // Cleared.
-
- poller->shutdown();
- runner.join();
-}
-
-QPID_AUTO_TEST_SUITE_END()
-
-}} //namespace qpid::tests
diff --git a/cpp/src/tests/PollerTest.cpp b/cpp/src/tests/PollerTest.cpp
deleted file mode 100644
index 9fa5689c5f..0000000000
--- a/cpp/src/tests/PollerTest.cpp
+++ /dev/null
@@ -1,263 +0,0 @@
-/*
- *
- * 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.
- *
- */
-
-/**
- * Use socketpair to test the poller
- */
-
-#include "qpid/sys/IOHandle.h"
-#include "qpid/sys/Poller.h"
-#include "qpid/sys/posix/PrivatePosix.h"
-
-#include <string>
-#include <iostream>
-#include <memory>
-#include <exception>
-
-#include <assert.h>
-
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <errno.h>
-
-using namespace std;
-using namespace qpid::sys;
-
-int writeALot(int fd, const string& s) {
- int bytesWritten = 0;
- do {
- errno = 0;
- int lastWrite = ::write(fd, s.c_str(), s.size());
- if ( lastWrite >= 0) {
- bytesWritten += lastWrite;
- }
- } while (errno != EAGAIN);
- return bytesWritten;
-}
-
-int readALot(int fd) {
- int bytesRead = 0;
- char buf[1024];
-
- do {
- errno = 0;
- int lastRead = ::read(fd, buf, sizeof(buf));
- if ( lastRead >= 0) {
- bytesRead += lastRead;
- }
- } while (errno != EAGAIN);
- return bytesRead;
-}
-
-void makesocketpair(int (&sv)[2]) {
- int rc = ::socketpair(AF_UNIX, SOCK_STREAM, 0, sv);
- assert(rc >= 0);
-
- // Set non-blocking
- rc = ::fcntl(sv[0], F_SETFL, O_NONBLOCK);
- assert(rc >= 0);
-
- rc = ::fcntl(sv[1], F_SETFL, O_NONBLOCK);
- assert(rc >= 0);
-}
-
-int main(int /*argc*/, char** /*argv*/)
-{
- try
- {
- int sv[2];
- makesocketpair(sv);
-
- // Make up a large string
- string testString = "This is only a test ... 1,2,3,4,5,6,7,8,9,10;";
- for (int i = 0; i < 6; i++)
- testString += testString;
-
- // Read as much as we can from socket 0
- int bytesRead = readALot(sv[0]);
- assert(bytesRead == 0);
-
- // Write as much as we can to socket 0
- int bytesWritten = writeALot(sv[0], testString);
-
- // Read as much as we can from socket 1
- bytesRead = readALot(sv[1]);
- assert(bytesRead == bytesWritten);
-
- auto_ptr<Poller> poller(new Poller);
-
- PosixIOHandle f0(sv[0]);
- PosixIOHandle f1(sv[1]);
-
- PollerHandle h0(f0);
- PollerHandle h1(f1);
-
- poller->registerHandle(h0);
- poller->monitorHandle(h0, Poller::INOUT);
-
- // h0 should be writable
- Poller::Event event = poller->wait();
- assert(event.handle == &h0);
- assert(event.type == Poller::WRITABLE);
-
- // Write as much as we can to socket 0
- bytesWritten = writeALot(sv[0], testString);
-
- // Wait for 500ms - h0 no longer writable
- event = poller->wait(500000000);
- assert(event.handle == 0);
-
- // Test we can read it all now
- poller->registerHandle(h1);
- poller->monitorHandle(h1, Poller::INOUT);
- event = poller->wait();
- assert(event.handle == &h1);
- assert(event.type == Poller::READ_WRITABLE);
-
- bytesRead = readALot(sv[1]);
- assert(bytesRead == bytesWritten);
-
- // Test poller interrupt
- assert(poller->interrupt(h0) == true);
- event = poller->wait();
- assert(event.handle == &h0);
- assert(event.type == Poller::INTERRUPTED);
-
- // Test multiple interrupts
- assert(poller->interrupt(h0) == true);
- assert(poller->interrupt(h1) == true);
-
- // Make sure we can interrupt them again
- assert(poller->interrupt(h0) == true);
- assert(poller->interrupt(h1) == true);
-
- // Make sure that they both come out
- event = poller->wait();
- assert(event.type == Poller::INTERRUPTED);
- assert(event.handle == &h0 || event.handle == &h1);
- if (event.handle == &h0) {
- event = poller->wait();
- assert(event.type == Poller::INTERRUPTED);
- assert(event.handle == &h1);
- } else {
- event = poller->wait();
- assert(event.type == Poller::INTERRUPTED);
- assert(event.handle == &h0);
- }
-
- poller->unmonitorHandle(h1, Poller::INOUT);
-
- event = poller->wait();
- assert(event.handle == &h0);
- assert(event.type == Poller::WRITABLE);
-
- // We didn't write anything so it should still be writable
- event = poller->wait();
- assert(event.handle == &h0);
- assert(event.type == Poller::WRITABLE);
-
- poller->unmonitorHandle(h0, Poller::INOUT);
-
- event = poller->wait(500000000);
- assert(event.handle == 0);
-
- poller->unregisterHandle(h1);
- assert(poller->interrupt(h1) == false);
-
- // close the other end to force a disconnect
- ::close(sv[1]);
-
- // Now make sure that we are readable followed by disconnected
- // and after that we never return again
- poller->monitorHandle(h0, Poller::INOUT);
- event = poller->wait(500000000);
- assert(event.handle == &h0);
- assert(event.type == Poller::READABLE);
- event = poller->wait(500000000);
- assert(event.handle == &h0);
- assert(event.type == Poller::DISCONNECTED);
- event = poller->wait(1500000000);
- assert(event.handle == 0);
-
- // Now we're disconnected monitoring should have no effect at all
- poller->unmonitorHandle(h0, Poller::INOUT);
- event = poller->wait(1500000000);
- assert(event.handle == 0);
-
- poller->unregisterHandle(h0);
- assert(poller->interrupt(h0) == false);
-
- // Test shutdown
- poller->shutdown();
- event = poller->wait();
- assert(event.handle == 0);
- assert(event.type == Poller::SHUTDOWN);
-
- event = poller->wait();
- assert(event.handle == 0);
- assert(event.type == Poller::SHUTDOWN);
-
- ::close(sv[0]);
-
- // Test for correct interaction of shutdown and interrupts - need to have new poller
- // etc. for this
- makesocketpair(sv);
-
- auto_ptr<Poller> poller1(new Poller);
-
- PosixIOHandle f2(sv[0]);
- PosixIOHandle f3(sv[1]);
-
- PollerHandle h2(f2);
- PollerHandle h3(f3);
-
- poller1->registerHandle(h2);
- poller1->monitorHandle(h2, Poller::INOUT);
- event = poller1->wait();
- assert(event.handle == &h2);
- assert(event.type == Poller::WRITABLE);
-
- // Shutdown
- poller1->shutdown();
- event = poller1->wait();
- assert(event.handle == 0);
- assert(event.type == Poller::SHUTDOWN);
-
- assert(poller1->interrupt(h2) == true);
- event = poller1->wait();
- assert(event.handle == &h2);
- assert(event.type == Poller::INTERRUPTED);
- poller1->unmonitorHandle(h2, Poller::INOUT);
-
- event = poller1->wait();
- assert(event.handle == 0);
- assert(event.type == Poller::SHUTDOWN);
-
- poller1->unregisterHandle(h2);
- return 0;
- } catch (exception& e) {
- cout << "Caught exception " << e.what() << "\n";
- }
-}
-
-
diff --git a/cpp/src/tests/ProxyTest.cpp b/cpp/src/tests/ProxyTest.cpp
deleted file mode 100644
index a926b28395..0000000000
--- a/cpp/src/tests/ProxyTest.cpp
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- *
- * 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.
- *
- */
-#include <iostream>
-#include "qpid/framing/AMQFrame.h"
-#include "qpid/framing/AMQMethodBody.h"
-#include "qpid/framing/ExecutionSyncBody.h"
-#include "qpid/framing/Proxy.h"
-
-#include "unit_test.h"
-
-using namespace qpid::framing;
-
-namespace qpid {
-namespace tests {
-
-QPID_AUTO_TEST_SUITE(ProxyTestSuite)
-
-
-QPID_AUTO_TEST_CASE(testScopedSync)
-{
- struct DummyHandler : FrameHandler
- {
- void handle(AMQFrame& f) {
- AMQMethodBody* m = f.getMethod();
- BOOST_CHECK(m);
- BOOST_CHECK(m->isA<ExecutionSyncBody>());
- BOOST_CHECK(m->isSync());
- }
- };
- DummyHandler f;
- Proxy p(f);
- Proxy::ScopedSync s(p);
- p.send(ExecutionSyncBody(p.getVersion()));
-}
-
-QPID_AUTO_TEST_SUITE_END()
-
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/Qmf2.cpp b/cpp/src/tests/Qmf2.cpp
deleted file mode 100644
index 66c774accd..0000000000
--- a/cpp/src/tests/Qmf2.cpp
+++ /dev/null
@@ -1,320 +0,0 @@
-/*
- *
- * 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.
- *
- */
-#include <iostream>
-#include "qpid/types/Variant.h"
-#include "qmf/QueryImpl.h"
-#include "qmf/SchemaImpl.h"
-#include "qmf/exceptions.h"
-
-#include "unit_test.h"
-
-using namespace qpid::types;
-using namespace qmf;
-
-namespace qpid {
-namespace tests {
-
-QPID_AUTO_TEST_SUITE(Qmf2Suite)
-
-QPID_AUTO_TEST_CASE(testQuery)
-{
- Query query(QUERY_OBJECT, "class_name", "package_name", "[and, [eq, name, [quote, smith]], [lt, age, [quote, 27]]]");
- Query newQuery(new QueryImpl(QueryImplAccess::get(query).asMap()));
-
- BOOST_CHECK_EQUAL(newQuery.getTarget(), QUERY_OBJECT);
- BOOST_CHECK_EQUAL(newQuery.getSchemaId().getName(), "class_name");
- BOOST_CHECK_EQUAL(newQuery.getSchemaId().getPackageName(), "package_name");
-
- Variant::List pred(newQuery.getPredicate());
- BOOST_CHECK_EQUAL(pred.size(), size_t(3));
-
- Variant::List::iterator iter(pred.begin());
- BOOST_CHECK_EQUAL(iter->asString(), "and");
- iter++;
- BOOST_CHECK_EQUAL(iter->getType(), VAR_LIST);
- iter++;
- BOOST_CHECK_EQUAL(iter->getType(), VAR_LIST);
- iter = iter->asList().begin();
- BOOST_CHECK_EQUAL(iter->asString(), "lt");
- iter++;
- BOOST_CHECK_EQUAL(iter->asString(), "age");
- iter++;
- BOOST_CHECK_EQUAL(iter->getType(), VAR_LIST);
- iter = iter->asList().begin();
- BOOST_CHECK_EQUAL(iter->asString(), "quote");
- iter++;
- BOOST_CHECK_EQUAL(iter->asUint32(), uint32_t(27));
-
- Query query2(QUERY_OBJECT_ID);
- Query newQuery2(new QueryImpl(QueryImplAccess::get(query2).asMap()));
- BOOST_CHECK_EQUAL(newQuery2.getTarget(), QUERY_OBJECT_ID);
-
- Query query3(QUERY_SCHEMA);
- Query newQuery3(new QueryImpl(QueryImplAccess::get(query3).asMap()));
- BOOST_CHECK_EQUAL(newQuery3.getTarget(), QUERY_SCHEMA);
-
- Query query4(QUERY_SCHEMA_ID);
- Query newQuery4(new QueryImpl(QueryImplAccess::get(query4).asMap()));
- BOOST_CHECK_EQUAL(newQuery4.getTarget(), QUERY_SCHEMA_ID);
-
- DataAddr addr("name", "agent_name", 34);
- Query query5(addr);
- Query newQuery5(new QueryImpl(QueryImplAccess::get(query5).asMap()));
- BOOST_CHECK_EQUAL(newQuery5.getTarget(), QUERY_OBJECT);
- BOOST_CHECK_EQUAL(newQuery5.getDataAddr().getName(), "name");
- BOOST_CHECK_EQUAL(newQuery5.getDataAddr().getAgentName(), "agent_name");
- BOOST_CHECK_EQUAL(newQuery5.getDataAddr().getAgentEpoch(), uint32_t(34));
-}
-
-QPID_AUTO_TEST_CASE(testQueryPredicateErrors)
-{
- Query query;
- Variant::Map map;
-
- BOOST_CHECK_THROW(Query(QUERY_OBJECT, "INVALID"), QmfException);
- query = Query(QUERY_OBJECT, "[unknown, one, two]");
- BOOST_CHECK_THROW(query.matchesPredicate(map), QmfException);
-
- query = Query(QUERY_OBJECT, "[eq, first]");
- BOOST_CHECK_THROW(query.matchesPredicate(map), QmfException);
-
- query = Query(QUERY_OBJECT, "[exists]");
- BOOST_CHECK_THROW(query.matchesPredicate(map), QmfException);
-
- query = Query(QUERY_OBJECT, "[eq, first, [quote, 1, 2, 3]]]");
- BOOST_CHECK_THROW(query.matchesPredicate(map), QmfException);
-
- query = Query(QUERY_OBJECT, "[eq, first, [unexpected, 3]]]");
- BOOST_CHECK_THROW(query.matchesPredicate(map), QmfException);
-
- query = Query(QUERY_OBJECT, "[eq, first, {}]]");
- BOOST_CHECK_THROW(query.matchesPredicate(map), QmfException);
-
- query = Query(QUERY_OBJECT, "[eq, first, second, third]");
- BOOST_CHECK_THROW(query.matchesPredicate(map), QmfException);
-
- query = Query(QUERY_OBJECT, "[and, first, second, third]");
- BOOST_CHECK_THROW(query.matchesPredicate(map), QmfException);
-}
-
-QPID_AUTO_TEST_CASE(testQueryPredicate)
-{
- Query query;
- Variant::Map map;
-
- map["forty"] = 40;
- map["fifty"] = 50;
- map["minus_ten"] = -10;
- map["pos_float"] = 100.05;
- map["neg_float"] = -1000.33;
- map["name"] = "jones";
- map["bool_t"] = true;
- map["bool_f"] = false;
-
- BOOST_CHECK_THROW(Query(QUERY_OBJECT, "INVALID"), QmfException);
-
- query = Query(QUERY_OBJECT);
- BOOST_CHECK_EQUAL(query.matchesPredicate(Variant::Map()), true);
-
- query = Query(QUERY_OBJECT, "[eq, forty, [quote, 40]]");
- BOOST_CHECK_EQUAL(query.matchesPredicate(map), true);
-
- query = Query(QUERY_OBJECT, "[eq, forty, [quote, 41]]");
- BOOST_CHECK_EQUAL(query.matchesPredicate(map), false);
-
- query = Query(QUERY_OBJECT, "[le, forty, fifty]");
- BOOST_CHECK_EQUAL(query.matchesPredicate(map), true);
-
- query = Query(QUERY_OBJECT, "[and, [eq, forty, [quote, 40]], [eq, name, [quote, jones]]]");
- BOOST_CHECK_EQUAL(query.matchesPredicate(map), true);
-
- query = Query(QUERY_OBJECT, "[and, [eq, forty, [quote, 40]], [eq, name, [quote, smith]]]");
- BOOST_CHECK_EQUAL(query.matchesPredicate(map), false);
-
- query = Query(QUERY_OBJECT, "[or, [eq, forty, [quote, 40]], [eq, name, [quote, smith]]]");
- BOOST_CHECK_EQUAL(query.matchesPredicate(map), true);
-
- query = Query(QUERY_OBJECT, "[or, [eq, forty, [quote, 41]], [eq, name, [quote, smith]]]");
- BOOST_CHECK_EQUAL(query.matchesPredicate(map), false);
-
- query = Query(QUERY_OBJECT, "[not, [le, forty, [quote, 40]]]");
- BOOST_CHECK_EQUAL(query.matchesPredicate(map), false);
-
- query = Query(QUERY_OBJECT, "[le, forty, [quote, 40]]");
- BOOST_CHECK_EQUAL(query.matchesPredicate(map), true);
-
- query = Query(QUERY_OBJECT, "[ge, forty, [quote, 40]]");
- BOOST_CHECK_EQUAL(query.matchesPredicate(map), true);
-
- query = Query(QUERY_OBJECT, "[lt, forty, [quote, 45]]");
- BOOST_CHECK_EQUAL(query.matchesPredicate(map), true);
-
- query = Query(QUERY_OBJECT, "[lt, [quote, 45], forty]");
- BOOST_CHECK_EQUAL(query.matchesPredicate(map), false);
-
- query = Query(QUERY_OBJECT, "[gt, forty, [quote, 45]]");
- BOOST_CHECK_EQUAL(query.matchesPredicate(map), false);
-
- query = Query(QUERY_OBJECT, "[gt, [quote, 45], forty]");
- BOOST_CHECK_EQUAL(query.matchesPredicate(map), true);
-
- query = Query(QUERY_OBJECT, "[eq, bool_t, [quote, True]]");
- BOOST_CHECK_EQUAL(query.matchesPredicate(map), true);
-
- query = Query(QUERY_OBJECT, "[eq, bool_t, [quote, False]]");
- BOOST_CHECK_EQUAL(query.matchesPredicate(map), false);
-
- query = Query(QUERY_OBJECT, "[eq, bool_f, [quote, True]]");
- BOOST_CHECK_EQUAL(query.matchesPredicate(map), false);
-
- query = Query(QUERY_OBJECT, "[eq, bool_f, [quote, False]]");
- BOOST_CHECK_EQUAL(query.matchesPredicate(map), true);
-
- query = Query(QUERY_OBJECT, "[eq, minus_ten, [quote, -10]]");
- BOOST_CHECK_EQUAL(query.matchesPredicate(map), true);
-
- query = Query(QUERY_OBJECT, "[lt, minus_ten, [quote, -20]]");
- BOOST_CHECK_EQUAL(query.matchesPredicate(map), false);
-
- query = Query(QUERY_OBJECT, "[lt, [quote, -20], minus_ten]");
- BOOST_CHECK_EQUAL(query.matchesPredicate(map), true);
-
- query = Query(QUERY_OBJECT, "[exists, name]");
- BOOST_CHECK_EQUAL(query.matchesPredicate(map), true);
-
- query = Query(QUERY_OBJECT, "[exists, nonexfield]");
- BOOST_CHECK_EQUAL(query.matchesPredicate(map), false);
-
- query = Query(QUERY_OBJECT, "[eq, pos_float, [quote, 100.05]]");
- BOOST_CHECK_EQUAL(query.matchesPredicate(map), true);
-}
-
-QPID_AUTO_TEST_CASE(testSchema)
-{
- Schema in(SCHEMA_TYPE_DATA, "package", "class");
- in.addProperty(SchemaProperty("prop1", SCHEMA_DATA_BOOL, "{desc:'Property One'}"));
- in.addProperty(SchemaProperty("prop2", SCHEMA_DATA_INT, "{desc:'Property Two',unit:'Furlong'}"));
- in.addProperty(SchemaProperty("prop3", SCHEMA_DATA_STRING, "{desc:'Property Three'}"));
-
- SchemaMethod method1("method1", "{desc:'Method One'}");
- method1.addArgument(SchemaProperty("arg1", SCHEMA_DATA_BOOL, "{desc:'Argument One',dir:IN}"));
- method1.addArgument(SchemaProperty("arg2", SCHEMA_DATA_INT, "{desc:'Argument Two',dir:OUT}"));
- method1.addArgument(SchemaProperty("arg3", SCHEMA_DATA_FLOAT, "{desc:'Argument Three',dir:INOUT}"));
- in.addMethod(method1);
-
- SchemaMethod method2("method2", "{desc:'Method Two'}");
- method2.addArgument(SchemaProperty("arg21", SCHEMA_DATA_BOOL, "{desc:'Argument One',dir:IN}"));
- method2.addArgument(SchemaProperty("arg22", SCHEMA_DATA_INT, "{desc:'Argument Two',dir:OUT}"));
- method2.addArgument(SchemaProperty("arg23", SCHEMA_DATA_FLOAT, "{desc:'Argument Three',dir:INOUT}"));
- in.addMethod(method2);
-
- BOOST_CHECK(!in.isFinalized());
- in.finalize();
- BOOST_CHECK(in.isFinalized());
-
- Variant::Map map(SchemaImplAccess::get(in).asMap());
- Schema out(new SchemaImpl(map));
-
- BOOST_CHECK(out.isFinalized());
- BOOST_CHECK_EQUAL(out.getSchemaId().getType(), SCHEMA_TYPE_DATA);
- BOOST_CHECK_EQUAL(out.getSchemaId().getPackageName(), "package");
- BOOST_CHECK_EQUAL(out.getSchemaId().getName(), "class");
- BOOST_CHECK_EQUAL(out.getSchemaId().getHash(), in.getSchemaId().getHash());
-
- BOOST_CHECK_EQUAL(out.getPropertyCount(), uint32_t(3));
- SchemaProperty prop;
-
- prop = out.getProperty(0);
- BOOST_CHECK_EQUAL(prop.getName(), "prop1");
- BOOST_CHECK_EQUAL(prop.getType(), SCHEMA_DATA_BOOL);
- BOOST_CHECK_EQUAL(prop.getDesc(), "Property One");
-
- prop = out.getProperty(1);
- BOOST_CHECK_EQUAL(prop.getName(), "prop2");
- BOOST_CHECK_EQUAL(prop.getType(), SCHEMA_DATA_INT);
- BOOST_CHECK_EQUAL(prop.getDesc(), "Property Two");
- BOOST_CHECK_EQUAL(prop.getUnit(), "Furlong");
- BOOST_CHECK(!prop.isIndex());
-
- prop = out.getProperty(2);
- BOOST_CHECK_EQUAL(prop.getName(), "prop3");
- BOOST_CHECK_EQUAL(prop.getType(), SCHEMA_DATA_STRING);
- BOOST_CHECK_EQUAL(prop.getDesc(), "Property Three");
-
- BOOST_CHECK_THROW(out.getProperty(3), QmfException);
-
- BOOST_CHECK_EQUAL(out.getMethodCount(), uint32_t(2));
- SchemaMethod method;
-
- method = out.getMethod(0);
- BOOST_CHECK_EQUAL(method.getName(), "method1");
- BOOST_CHECK_EQUAL(method.getDesc(), "Method One");
- BOOST_CHECK_EQUAL(method.getArgumentCount(), uint32_t(3));
-
- prop = method.getArgument(0);
- BOOST_CHECK_EQUAL(prop.getName(), "arg1");
- BOOST_CHECK_EQUAL(prop.getType(), SCHEMA_DATA_BOOL);
- BOOST_CHECK_EQUAL(prop.getDesc(), "Argument One");
- BOOST_CHECK_EQUAL(prop.getDirection(), DIR_IN);
-
- prop = method.getArgument(1);
- BOOST_CHECK_EQUAL(prop.getName(), "arg2");
- BOOST_CHECK_EQUAL(prop.getType(), SCHEMA_DATA_INT);
- BOOST_CHECK_EQUAL(prop.getDesc(), "Argument Two");
- BOOST_CHECK_EQUAL(prop.getDirection(), DIR_OUT);
-
- prop = method.getArgument(2);
- BOOST_CHECK_EQUAL(prop.getName(), "arg3");
- BOOST_CHECK_EQUAL(prop.getType(), SCHEMA_DATA_FLOAT);
- BOOST_CHECK_EQUAL(prop.getDesc(), "Argument Three");
- BOOST_CHECK_EQUAL(prop.getDirection(), DIR_IN_OUT);
-
- BOOST_CHECK_THROW(method.getArgument(3), QmfException);
-
- method = out.getMethod(1);
- BOOST_CHECK_EQUAL(method.getName(), "method2");
- BOOST_CHECK_EQUAL(method.getDesc(), "Method Two");
- BOOST_CHECK_EQUAL(method.getArgumentCount(), uint32_t(3));
-
- prop = method.getArgument(0);
- BOOST_CHECK_EQUAL(prop.getName(), "arg21");
- BOOST_CHECK_EQUAL(prop.getType(), SCHEMA_DATA_BOOL);
- BOOST_CHECK_EQUAL(prop.getDesc(), "Argument One");
- BOOST_CHECK_EQUAL(prop.getDirection(), DIR_IN);
-
- prop = method.getArgument(1);
- BOOST_CHECK_EQUAL(prop.getName(), "arg22");
- BOOST_CHECK_EQUAL(prop.getType(), SCHEMA_DATA_INT);
- BOOST_CHECK_EQUAL(prop.getDesc(), "Argument Two");
- BOOST_CHECK_EQUAL(prop.getDirection(), DIR_OUT);
-
- prop = method.getArgument(2);
- BOOST_CHECK_EQUAL(prop.getName(), "arg23");
- BOOST_CHECK_EQUAL(prop.getType(), SCHEMA_DATA_FLOAT);
- BOOST_CHECK_EQUAL(prop.getDesc(), "Argument Three");
- BOOST_CHECK_EQUAL(prop.getDirection(), DIR_IN_OUT);
-
- BOOST_CHECK_THROW(method.getArgument(3), QmfException);
-}
-
-QPID_AUTO_TEST_SUITE_END()
-
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/QueueEvents.cpp b/cpp/src/tests/QueueEvents.cpp
deleted file mode 100644
index bd18fa45fb..0000000000
--- a/cpp/src/tests/QueueEvents.cpp
+++ /dev/null
@@ -1,238 +0,0 @@
-/*
- *
- * 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.
- *
- */
-
-#include "MessageUtils.h"
-#include "unit_test.h"
-#include "BrokerFixture.h"
-#include "qpid/broker/Message.h"
-#include "qpid/broker/Queue.h"
-#include "qpid/broker/QueueEvents.h"
-#include "qpid/client/QueueOptions.h"
-#include "qpid/framing/SequenceNumber.h"
-#include "qpid/sys/Dispatcher.h"
-#include <boost/bind.hpp>
-#include <boost/format.hpp>
-
-namespace qpid {
-namespace tests {
-
-QPID_AUTO_TEST_SUITE(QueueEventsSuite)
-
-using namespace qpid::client;
-using namespace qpid::broker;
-using namespace qpid::sys;
-using qpid::framing::SequenceNumber;
-
-struct EventChecker
-{
- typedef std::deque<QueueEvents::Event> Events;
-
- Events events;
- boost::shared_ptr<Poller> poller;
-
- void handle(QueueEvents::Event e)
- {
- if (events.empty()) {
- BOOST_FAIL("Unexpected event received");
- } else {
- BOOST_CHECK_EQUAL(events.front().type, e.type);
- BOOST_CHECK_EQUAL(events.front().msg.queue, e.msg.queue);
- BOOST_CHECK_EQUAL(events.front().msg.payload, e.msg.payload);
- BOOST_CHECK_EQUAL(events.front().msg.position, e.msg.position);
- events.pop_front();
- }
- if (events.empty() && poller) poller->shutdown();
- }
-
- void expect(QueueEvents::Event e)
- {
- events.push_back(e);
- }
-};
-
-QPID_AUTO_TEST_CASE(testBasicEventProcessing)
-{
- boost::shared_ptr<Poller> poller(new Poller());
- sys::Dispatcher dispatcher(poller);
- Thread dispatchThread(dispatcher);
- QueueEvents events(poller);
- EventChecker listener;
- listener.poller = poller;
- events.registerListener("dummy", boost::bind(&EventChecker::handle, &listener, _1));
- //signal occurence of some events:
- Queue queue("queue1");
- SequenceNumber id;
- QueuedMessage event1(&queue, MessageUtils::createMessage(), id);
- QueuedMessage event2(&queue, MessageUtils::createMessage(), ++id);
-
- //define events expected by listener:
- listener.expect(QueueEvents::Event(QueueEvents::ENQUEUE, event1));
- listener.expect(QueueEvents::Event(QueueEvents::ENQUEUE, event2));
- listener.expect(QueueEvents::Event(QueueEvents::DEQUEUE, event1));
-
- events.enqueued(event1);
- events.enqueued(event2);
- events.dequeued(event1);
-
- dispatchThread.join();
- events.shutdown();
- events.unregisterListener("dummy");
-}
-
-
-struct EventRecorder
-{
- struct EventRecord
- {
- QueueEvents::EventType type;
- std::string queue;
- std::string content;
- SequenceNumber position;
- };
-
- typedef std::deque<EventRecord> Events;
-
- Events events;
-
- void handle(QueueEvents::Event event)
- {
- EventRecord record;
- record.type = event.type;
- record.queue = event.msg.queue->getName();
- event.msg.payload->getFrames().getContent(record.content);
- record.position = event.msg.position;
- events.push_back(record);
- }
-
- void check(QueueEvents::EventType type, const std::string& queue, const std::string& content, const SequenceNumber& position)
- {
- if (events.empty()) {
- BOOST_FAIL("Missed event");
- } else {
- BOOST_CHECK_EQUAL(events.front().type, type);
- BOOST_CHECK_EQUAL(events.front().queue, queue);
- BOOST_CHECK_EQUAL(events.front().content, content);
- BOOST_CHECK_EQUAL(events.front().position, position);
- events.pop_front();
- }
- }
- void checkEnqueue(const std::string& queue, const std::string& data, const SequenceNumber& position)
- {
- check(QueueEvents::ENQUEUE, queue, data, position);
- }
-
- void checkDequeue(const std::string& queue, const std::string& data, const SequenceNumber& position)
- {
- check(QueueEvents::DEQUEUE, queue, data, position);
- }
-};
-
-QPID_AUTO_TEST_CASE(testSystemLevelEventProcessing)
-{
- ProxySessionFixture fixture;
- //register dummy event listener to broker
- EventRecorder listener;
- fixture.broker->getQueueEvents().registerListener("recorder", boost::bind(&EventRecorder::handle, &listener, _1));
-
- //declare queue with event options specified
- QueueOptions options;
- options.enableQueueEvents(false);
- std::string q("queue-events-test");
- fixture.session.queueDeclare(arg::queue=q, arg::arguments=options);
- //send and consume some messages
- LocalQueue incoming;
- Subscription sub = fixture.subs.subscribe(incoming, q);
- for (int i = 0; i < 5; i++) {
- fixture.session.messageTransfer(arg::content=client::Message((boost::format("%1%_%2%") % "Message" % (i+1)).str(), q));
- }
- for (int i = 0; i < 3; i++) {
- BOOST_CHECK_EQUAL(incoming.pop().getData(), (boost::format("%1%_%2%") % "Message" % (i+1)).str());
- }
- for (int i = 5; i < 10; i++) {
- fixture.session.messageTransfer(arg::content=client::Message((boost::format("%1%_%2%") % "Message" % (i+1)).str(), q));
- }
- for (int i = 3; i < 10; i++) {
- BOOST_CHECK_EQUAL(incoming.pop().getData(), (boost::format("%1%_%2%") % "Message" % (i+1)).str());
- }
- fixture.connection.close();
- fixture.broker->getQueueEvents().shutdown();
-
- //check listener was notified of all events, and in correct order
- SequenceNumber enqueueId(1);
- SequenceNumber dequeueId(1);
- for (int i = 0; i < 5; i++) {
- listener.checkEnqueue(q, (boost::format("%1%_%2%") % "Message" % (i+1)).str(), enqueueId++);
- }
- for (int i = 0; i < 3; i++) {
- listener.checkDequeue(q, (boost::format("%1%_%2%") % "Message" % (i+1)).str(), dequeueId++);
- }
- for (int i = 5; i < 10; i++) {
- listener.checkEnqueue(q, (boost::format("%1%_%2%") % "Message" % (i+1)).str(), enqueueId++);
- }
- for (int i = 3; i < 10; i++) {
- listener.checkDequeue(q, (boost::format("%1%_%2%") % "Message" % (i+1)).str(), dequeueId++);
- }
-}
-
-QPID_AUTO_TEST_CASE(testSystemLevelEventProcessing_enqueuesOnly)
-{
- ProxySessionFixture fixture;
- //register dummy event listener to broker
- EventRecorder listener;
- fixture.broker->getQueueEvents().registerListener("recorder", boost::bind(&EventRecorder::handle, &listener, _1));
-
- //declare queue with event options specified
- QueueOptions options;
- options.enableQueueEvents(true);
- std::string q("queue-events-test");
- fixture.session.queueDeclare(arg::queue=q, arg::arguments=options);
- //send and consume some messages
- LocalQueue incoming;
- Subscription sub = fixture.subs.subscribe(incoming, q);
- for (int i = 0; i < 5; i++) {
- fixture.session.messageTransfer(arg::content=client::Message((boost::format("%1%_%2%") % "Message" % (i+1)).str(), q));
- }
- for (int i = 0; i < 3; i++) {
- BOOST_CHECK_EQUAL(incoming.pop().getData(), (boost::format("%1%_%2%") % "Message" % (i+1)).str());
- }
- for (int i = 5; i < 10; i++) {
- fixture.session.messageTransfer(arg::content=client::Message((boost::format("%1%_%2%") % "Message" % (i+1)).str(), q));
- }
- for (int i = 3; i < 10; i++) {
- BOOST_CHECK_EQUAL(incoming.pop().getData(), (boost::format("%1%_%2%") % "Message" % (i+1)).str());
- }
- fixture.connection.close();
- fixture.broker->getQueueEvents().shutdown();
-
- //check listener was notified of all events, and in correct order
- SequenceNumber enqueueId(1);
- SequenceNumber dequeueId(1);
- for (int i = 0; i < 5; i++) {
- listener.checkEnqueue(q, (boost::format("%1%_%2%") % "Message" % (i+1)).str(), enqueueId++);
- }
- for (int i = 5; i < 10; i++) {
- listener.checkEnqueue(q, (boost::format("%1%_%2%") % "Message" % (i+1)).str(), enqueueId++);
- }
-}
-
-QPID_AUTO_TEST_SUITE_END()
-
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/QueueFlowLimitTest.cpp b/cpp/src/tests/QueueFlowLimitTest.cpp
deleted file mode 100644
index 8a6923fb09..0000000000
--- a/cpp/src/tests/QueueFlowLimitTest.cpp
+++ /dev/null
@@ -1,463 +0,0 @@
-/*
- *
- * 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.
- *
- */
-#include <sstream>
-#include <deque>
-#include "unit_test.h"
-#include "test_tools.h"
-
-#include "qpid/broker/QueuePolicy.h"
-#include "qpid/broker/QueueFlowLimit.h"
-#include "qpid/sys/Time.h"
-#include "qpid/framing/reply_exceptions.h"
-#include "MessageUtils.h"
-#include "BrokerFixture.h"
-
-using namespace qpid::broker;
-using namespace qpid::framing;
-
-namespace qpid {
-namespace tests {
-
-QPID_AUTO_TEST_SUITE(QueueFlowLimitTestSuite)
-
-namespace {
-
-class TestFlow : public QueueFlowLimit
-{
-public:
- TestFlow(uint32_t flowStopCount, uint32_t flowResumeCount,
- uint64_t flowStopSize, uint64_t flowResumeSize) :
- QueueFlowLimit(0, flowStopCount, flowResumeCount, flowStopSize, flowResumeSize)
- {}
- virtual ~TestFlow() {}
-
- static TestFlow *createTestFlow(const qpid::framing::FieldTable& settings)
- {
- FieldTable::ValuePtr v;
-
- v = settings.get(flowStopCountKey);
- uint32_t flowStopCount = (v) ? (uint32_t)v->get<int64_t>() : 0;
- v = settings.get(flowResumeCountKey);
- uint32_t flowResumeCount = (v) ? (uint32_t)v->get<int64_t>() : 0;
- v = settings.get(flowStopSizeKey);
- uint64_t flowStopSize = (v) ? (uint64_t)v->get<int64_t>() : 0;
- v = settings.get(flowResumeSizeKey);
- uint64_t flowResumeSize = (v) ? (uint64_t)v->get<int64_t>() : 0;
-
- return new TestFlow(flowStopCount, flowResumeCount, flowStopSize, flowResumeSize);
- }
-
- static QueueFlowLimit *getQueueFlowLimit(const qpid::framing::FieldTable& settings)
- {
- return QueueFlowLimit::createLimit(0, settings);
- }
-};
-
-
-
-QueuedMessage createMessage(uint32_t size)
-{
- static uint32_t seqNum;
- QueuedMessage msg;
- msg.payload = MessageUtils::createMessage();
- msg.position = ++seqNum;
- MessageUtils::addContent(msg.payload, std::string (size, 'x'));
- return msg;
-}
-}
-
-QPID_AUTO_TEST_CASE(testFlowCount)
-{
- FieldTable args;
- args.setInt(QueueFlowLimit::flowStopCountKey, 7);
- args.setInt(QueueFlowLimit::flowResumeCountKey, 5);
-
- std::auto_ptr<TestFlow> flow(TestFlow::createTestFlow(args));
-
- BOOST_CHECK_EQUAL((uint32_t) 7, flow->getFlowStopCount());
- BOOST_CHECK_EQUAL((uint32_t) 5, flow->getFlowResumeCount());
- BOOST_CHECK_EQUAL((uint32_t) 0, flow->getFlowStopSize());
- BOOST_CHECK_EQUAL((uint32_t) 0, flow->getFlowResumeSize());
- BOOST_CHECK(!flow->isFlowControlActive());
- BOOST_CHECK(flow->monitorFlowControl());
-
- std::deque<QueuedMessage> msgs;
- for (size_t i = 0; i < 6; i++) {
- msgs.push_back(createMessage(10));
- flow->enqueued(msgs.back());
- BOOST_CHECK(!flow->isFlowControlActive());
- }
- BOOST_CHECK(!flow->isFlowControlActive()); // 6 on queue
- msgs.push_back(createMessage(10));
- flow->enqueued(msgs.back());
- BOOST_CHECK(!flow->isFlowControlActive()); // 7 on queue
- msgs.push_back(createMessage(10));
- flow->enqueued(msgs.back());
- BOOST_CHECK(flow->isFlowControlActive()); // 8 on queue, ON
- msgs.push_back(createMessage(10));
- flow->enqueued(msgs.back());
- BOOST_CHECK(flow->isFlowControlActive()); // 9 on queue, no change to flow control
-
- flow->dequeued(msgs.front());
- msgs.pop_front();
- BOOST_CHECK(flow->isFlowControlActive()); // 8 on queue
- flow->dequeued(msgs.front());
- msgs.pop_front();
- BOOST_CHECK(flow->isFlowControlActive()); // 7 on queue
- flow->dequeued(msgs.front());
- msgs.pop_front();
- BOOST_CHECK(flow->isFlowControlActive()); // 6 on queue
- flow->dequeued(msgs.front());
- msgs.pop_front();
- BOOST_CHECK(flow->isFlowControlActive()); // 5 on queue, no change
-
- flow->dequeued(msgs.front());
- msgs.pop_front();
- BOOST_CHECK(!flow->isFlowControlActive()); // 4 on queue, OFF
-}
-
-
-QPID_AUTO_TEST_CASE(testFlowSize)
-{
- FieldTable args;
- args.setUInt64(QueueFlowLimit::flowStopSizeKey, 70);
- args.setUInt64(QueueFlowLimit::flowResumeSizeKey, 50);
-
- std::auto_ptr<TestFlow> flow(TestFlow::createTestFlow(args));
-
- BOOST_CHECK_EQUAL((uint32_t) 0, flow->getFlowStopCount());
- BOOST_CHECK_EQUAL((uint32_t) 0, flow->getFlowResumeCount());
- BOOST_CHECK_EQUAL((uint32_t) 70, flow->getFlowStopSize());
- BOOST_CHECK_EQUAL((uint32_t) 50, flow->getFlowResumeSize());
- BOOST_CHECK(!flow->isFlowControlActive());
- BOOST_CHECK(flow->monitorFlowControl());
-
- std::deque<QueuedMessage> msgs;
- for (size_t i = 0; i < 6; i++) {
- msgs.push_back(createMessage(10));
- flow->enqueued(msgs.back());
- BOOST_CHECK(!flow->isFlowControlActive());
- }
- BOOST_CHECK(!flow->isFlowControlActive()); // 60 on queue
- BOOST_CHECK_EQUAL(6u, flow->getFlowCount());
- BOOST_CHECK_EQUAL(60u, flow->getFlowSize());
-
- QueuedMessage msg_9 = createMessage(9);
- flow->enqueued(msg_9);
- BOOST_CHECK(!flow->isFlowControlActive()); // 69 on queue
- QueuedMessage tinyMsg_1 = createMessage(1);
- flow->enqueued(tinyMsg_1);
- BOOST_CHECK(!flow->isFlowControlActive()); // 70 on queue
-
- QueuedMessage tinyMsg_2 = createMessage(1);
- flow->enqueued(tinyMsg_2);
- BOOST_CHECK(flow->isFlowControlActive()); // 71 on queue, ON
- msgs.push_back(createMessage(10));
- flow->enqueued(msgs.back());
- BOOST_CHECK(flow->isFlowControlActive()); // 81 on queue
- BOOST_CHECK_EQUAL(10u, flow->getFlowCount());
- BOOST_CHECK_EQUAL(81u, flow->getFlowSize());
-
- flow->dequeued(msgs.front());
- msgs.pop_front();
- BOOST_CHECK(flow->isFlowControlActive()); // 71 on queue
- flow->dequeued(msgs.front());
- msgs.pop_front();
- BOOST_CHECK(flow->isFlowControlActive()); // 61 on queue
- flow->dequeued(msgs.front());
- msgs.pop_front();
- BOOST_CHECK(flow->isFlowControlActive()); // 51 on queue
-
- flow->dequeued(tinyMsg_1);
- BOOST_CHECK(flow->isFlowControlActive()); // 50 on queue
- flow->dequeued(tinyMsg_2);
- BOOST_CHECK(!flow->isFlowControlActive()); // 49 on queue, OFF
-
- flow->dequeued(msg_9);
- BOOST_CHECK(!flow->isFlowControlActive()); // 40 on queue
- flow->dequeued(msgs.front());
- msgs.pop_front();
- BOOST_CHECK(!flow->isFlowControlActive()); // 30 on queue
- flow->dequeued(msgs.front());
- msgs.pop_front();
- BOOST_CHECK(!flow->isFlowControlActive()); // 20 on queue
- BOOST_CHECK_EQUAL(2u, flow->getFlowCount());
- BOOST_CHECK_EQUAL(20u, flow->getFlowSize());
-}
-
-QPID_AUTO_TEST_CASE(testFlowArgs)
-{
- FieldTable args;
- const uint64_t stop(0x2FFFFFFFFull);
- const uint64_t resume(0x1FFFFFFFFull);
- args.setInt(QueueFlowLimit::flowStopCountKey, 30);
- args.setInt(QueueFlowLimit::flowResumeCountKey, 21);
- args.setUInt64(QueueFlowLimit::flowStopSizeKey, stop);
- args.setUInt64(QueueFlowLimit::flowResumeSizeKey, resume);
-
- std::auto_ptr<TestFlow> flow(TestFlow::createTestFlow(args));
-
- BOOST_CHECK_EQUAL((uint32_t) 30, flow->getFlowStopCount());
- BOOST_CHECK_EQUAL((uint32_t) 21, flow->getFlowResumeCount());
- BOOST_CHECK_EQUAL(stop, flow->getFlowStopSize());
- BOOST_CHECK_EQUAL(resume, flow->getFlowResumeSize());
- BOOST_CHECK(!flow->isFlowControlActive());
- BOOST_CHECK(flow->monitorFlowControl());
-}
-
-
-QPID_AUTO_TEST_CASE(testFlowCombo)
-{
- FieldTable args;
- args.setInt(QueueFlowLimit::flowStopCountKey, 10);
- args.setInt(QueueFlowLimit::flowResumeCountKey, 5);
- args.setUInt64(QueueFlowLimit::flowStopSizeKey, 200);
- args.setUInt64(QueueFlowLimit::flowResumeSizeKey, 100);
-
- std::deque<QueuedMessage> msgs_1;
- std::deque<QueuedMessage> msgs_10;
- std::deque<QueuedMessage> msgs_50;
- std::deque<QueuedMessage> msgs_100;
-
- QueuedMessage msg;
-
- std::auto_ptr<TestFlow> flow(TestFlow::createTestFlow(args));
- BOOST_CHECK(!flow->isFlowControlActive()); // count:0 size:0
-
- // verify flow control comes ON when only count passes its stop point.
-
- for (size_t i = 0; i < 10; i++) {
- msgs_10.push_back(createMessage(10));
- flow->enqueued(msgs_10.back());
- BOOST_CHECK(!flow->isFlowControlActive());
- }
- // count:10 size:100
-
- msgs_1.push_back(createMessage(1));
- flow->enqueued(msgs_1.back()); // count:11 size: 101 ->ON
- BOOST_CHECK(flow->isFlowControlActive());
-
- for (size_t i = 0; i < 6; i++) {
- flow->dequeued(msgs_10.front());
- msgs_10.pop_front();
- BOOST_CHECK(flow->isFlowControlActive());
- }
- // count:5 size: 41
-
- flow->dequeued(msgs_1.front()); // count: 4 size: 40 ->OFF
- msgs_1.pop_front();
- BOOST_CHECK(!flow->isFlowControlActive());
-
- for (size_t i = 0; i < 4; i++) {
- flow->dequeued(msgs_10.front());
- msgs_10.pop_front();
- BOOST_CHECK(!flow->isFlowControlActive());
- }
- // count:0 size:0
-
- // verify flow control comes ON when only size passes its stop point.
-
- msgs_100.push_back(createMessage(100));
- flow->enqueued(msgs_100.back()); // count:1 size: 100
- BOOST_CHECK(!flow->isFlowControlActive());
-
- msgs_50.push_back(createMessage(50));
- flow->enqueued(msgs_50.back()); // count:2 size: 150
- BOOST_CHECK(!flow->isFlowControlActive());
-
- msgs_50.push_back(createMessage(50));
- flow->enqueued(msgs_50.back()); // count:3 size: 200
- BOOST_CHECK(!flow->isFlowControlActive());
-
- msgs_1.push_back(createMessage(1));
- flow->enqueued(msgs_1.back()); // count:4 size: 201 ->ON
- BOOST_CHECK(flow->isFlowControlActive());
-
- flow->dequeued(msgs_100.front()); // count:3 size:101
- msgs_100.pop_front();
- BOOST_CHECK(flow->isFlowControlActive());
-
- flow->dequeued(msgs_1.front()); // count:2 size:100
- msgs_1.pop_front();
- BOOST_CHECK(flow->isFlowControlActive());
-
- flow->dequeued(msgs_50.front()); // count:1 size:50 ->OFF
- msgs_50.pop_front();
- BOOST_CHECK(!flow->isFlowControlActive());
-
- // verify flow control remains ON until both thresholds drop below their
- // resume point.
-
- for (size_t i = 0; i < 8; i++) {
- msgs_10.push_back(createMessage(10));
- flow->enqueued(msgs_10.back());
- BOOST_CHECK(!flow->isFlowControlActive());
- }
- // count:9 size:130
-
- msgs_10.push_back(createMessage(10));
- flow->enqueued(msgs_10.back()); // count:10 size: 140
- BOOST_CHECK(!flow->isFlowControlActive());
-
- msgs_1.push_back(createMessage(1));
- flow->enqueued(msgs_1.back()); // count:11 size: 141 ->ON
- BOOST_CHECK(flow->isFlowControlActive());
-
- msgs_100.push_back(createMessage(100));
- flow->enqueued(msgs_100.back()); // count:12 size: 241 (both thresholds crossed)
- BOOST_CHECK(flow->isFlowControlActive());
-
- // at this point: 9@10 + 1@50 + 1@100 + 1@1 == 12@241
-
- flow->dequeued(msgs_50.front()); // count:11 size:191
- msgs_50.pop_front();
- BOOST_CHECK(flow->isFlowControlActive());
-
- for (size_t i = 0; i < 9; i++) {
- flow->dequeued(msgs_10.front());
- msgs_10.pop_front();
- BOOST_CHECK(flow->isFlowControlActive());
- }
- // count:2 size:101
- flow->dequeued(msgs_1.front()); // count:1 size:100
- msgs_1.pop_front();
- BOOST_CHECK(flow->isFlowControlActive()); // still active due to size
-
- flow->dequeued(msgs_100.front()); // count:0 size:0 ->OFF
- msgs_100.pop_front();
- BOOST_CHECK(!flow->isFlowControlActive());
-}
-
-
-QPID_AUTO_TEST_CASE(testFlowDefaultArgs)
-{
- QueueFlowLimit::setDefaults(2950001, // max queue byte count
- 80, // 80% stop threshold
- 70); // 70% resume threshold
- FieldTable args;
- QueueFlowLimit *ptr = TestFlow::getQueueFlowLimit(args);
-
- BOOST_CHECK(ptr);
- std::auto_ptr<QueueFlowLimit> flow(ptr);
- BOOST_CHECK_EQUAL((uint64_t) 2360001, flow->getFlowStopSize());
- BOOST_CHECK_EQUAL((uint64_t) 2065000, flow->getFlowResumeSize());
- BOOST_CHECK_EQUAL( 0u, flow->getFlowStopCount());
- BOOST_CHECK_EQUAL( 0u, flow->getFlowResumeCount());
- BOOST_CHECK(!flow->isFlowControlActive());
- BOOST_CHECK(flow->monitorFlowControl());
-}
-
-
-QPID_AUTO_TEST_CASE(testFlowOverrideArgs)
-{
- QueueFlowLimit::setDefaults(2950001, // max queue byte count
- 80, // 80% stop threshold
- 70); // 70% resume threshold
- {
- FieldTable args;
- args.setInt(QueueFlowLimit::flowStopCountKey, 35000);
- args.setInt(QueueFlowLimit::flowResumeCountKey, 30000);
-
- QueueFlowLimit *ptr = TestFlow::getQueueFlowLimit(args);
- BOOST_CHECK(ptr);
- std::auto_ptr<QueueFlowLimit> flow(ptr);
-
- BOOST_CHECK_EQUAL((uint32_t) 35000, flow->getFlowStopCount());
- BOOST_CHECK_EQUAL((uint32_t) 30000, flow->getFlowResumeCount());
- BOOST_CHECK_EQUAL((uint64_t) 0, flow->getFlowStopSize());
- BOOST_CHECK_EQUAL((uint64_t) 0, flow->getFlowResumeSize());
- BOOST_CHECK(!flow->isFlowControlActive());
- BOOST_CHECK(flow->monitorFlowControl());
- }
- {
- FieldTable args;
- args.setInt(QueueFlowLimit::flowStopSizeKey, 350000);
- args.setInt(QueueFlowLimit::flowResumeSizeKey, 300000);
-
- QueueFlowLimit *ptr = TestFlow::getQueueFlowLimit(args);
- BOOST_CHECK(ptr);
- std::auto_ptr<QueueFlowLimit> flow(ptr);
-
- BOOST_CHECK_EQUAL((uint32_t) 0, flow->getFlowStopCount());
- BOOST_CHECK_EQUAL((uint32_t) 0, flow->getFlowResumeCount());
- BOOST_CHECK_EQUAL((uint64_t) 350000, flow->getFlowStopSize());
- BOOST_CHECK_EQUAL((uint64_t) 300000, flow->getFlowResumeSize());
- BOOST_CHECK(!flow->isFlowControlActive());
- BOOST_CHECK(flow->monitorFlowControl());
- }
- {
- FieldTable args;
- args.setInt(QueueFlowLimit::flowStopCountKey, 35000);
- args.setInt(QueueFlowLimit::flowResumeCountKey, 30000);
- args.setInt(QueueFlowLimit::flowStopSizeKey, 350000);
- args.setInt(QueueFlowLimit::flowResumeSizeKey, 300000);
-
- QueueFlowLimit *ptr = TestFlow::getQueueFlowLimit(args);
- BOOST_CHECK(ptr);
- std::auto_ptr<QueueFlowLimit> flow(ptr);
-
- BOOST_CHECK_EQUAL((uint32_t) 35000, flow->getFlowStopCount());
- BOOST_CHECK_EQUAL((uint32_t) 30000, flow->getFlowResumeCount());
- BOOST_CHECK_EQUAL((uint64_t) 350000, flow->getFlowStopSize());
- BOOST_CHECK_EQUAL((uint64_t) 300000, flow->getFlowResumeSize());
- BOOST_CHECK(!flow->isFlowControlActive());
- BOOST_CHECK(flow->monitorFlowControl());
- }
-}
-
-
-QPID_AUTO_TEST_CASE(testFlowOverrideDefaults)
-{
- QueueFlowLimit::setDefaults(2950001, // max queue byte count
- 97, // stop threshold
- 73); // resume threshold
- FieldTable args;
- QueueFlowLimit *ptr = TestFlow::getQueueFlowLimit(args);
- BOOST_CHECK(ptr);
- std::auto_ptr<QueueFlowLimit> flow(ptr);
-
- BOOST_CHECK_EQUAL((uint32_t) 2861501, flow->getFlowStopSize());
- BOOST_CHECK_EQUAL((uint32_t) 2153500, flow->getFlowResumeSize());
- BOOST_CHECK(!flow->isFlowControlActive());
- BOOST_CHECK(flow->monitorFlowControl());
-}
-
-
-QPID_AUTO_TEST_CASE(testFlowDisable)
-{
- {
- FieldTable args;
- args.setInt(QueueFlowLimit::flowStopCountKey, 0);
- QueueFlowLimit *ptr = TestFlow::getQueueFlowLimit(args);
- BOOST_CHECK(!ptr);
- }
- {
- FieldTable args;
- args.setInt(QueueFlowLimit::flowStopSizeKey, 0);
- QueueFlowLimit *ptr = TestFlow::getQueueFlowLimit(args);
- BOOST_CHECK(!ptr);
- }
-}
-
-
-QPID_AUTO_TEST_SUITE_END()
-
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/QueueOptionsTest.cpp b/cpp/src/tests/QueueOptionsTest.cpp
deleted file mode 100644
index f2fbaba2c1..0000000000
--- a/cpp/src/tests/QueueOptionsTest.cpp
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- *
- * 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.
- *
- */
-#include <iostream>
-#include "qpid/framing/Array.h"
-#include "qpid/client/QueueOptions.h"
-
-#include "unit_test.h"
-
-using namespace qpid::client;
-
-
-namespace qpid {
-namespace tests {
-
-QPID_AUTO_TEST_SUITE(QueueOptionsTestSuite)
-
-QPID_AUTO_TEST_CASE(testSizePolicy)
-{
- QueueOptions ft;
-
- ft.setSizePolicy(REJECT,1,2);
-
- BOOST_CHECK(QueueOptions::strREJECT == ft.getAsString(QueueOptions::strTypeKey));
- BOOST_CHECK(1 == ft.getAsInt(QueueOptions::strMaxSizeKey));
- BOOST_CHECK(2 == ft.getAsInt(QueueOptions::strMaxCountKey));
-
- ft.setSizePolicy(FLOW_TO_DISK,0,2);
- BOOST_CHECK(QueueOptions::strFLOW_TO_DISK == ft.getAsString(QueueOptions::strTypeKey));
- BOOST_CHECK(1 == ft.getAsInt(QueueOptions::strMaxSizeKey));
- BOOST_CHECK(2 == ft.getAsInt(QueueOptions::strMaxCountKey));
-
- ft.setSizePolicy(RING,1,0);
- BOOST_CHECK(QueueOptions::strRING == ft.getAsString(QueueOptions::strTypeKey));
-
- ft.setSizePolicy(RING_STRICT,1,0);
- BOOST_CHECK(QueueOptions::strRING_STRICT == ft.getAsString(QueueOptions::strTypeKey));
-
- ft.clearSizePolicy();
- BOOST_CHECK(!ft.isSet(QueueOptions::strTypeKey));
- BOOST_CHECK(!ft.isSet(QueueOptions::strMaxSizeKey));
- BOOST_CHECK(!ft.isSet(QueueOptions::strMaxCountKey));
-}
-
-QPID_AUTO_TEST_CASE(testFlags)
-{
- QueueOptions ft;
-
- ft.setPersistLastNode();
- ft.setOrdering(LVQ);
-
- BOOST_CHECK(1 == ft.getAsInt(QueueOptions::strPersistLastNode));
- BOOST_CHECK(1 == ft.getAsInt(QueueOptions::strLastValueQueue));
-
- ft.clearPersistLastNode();
- ft.setOrdering(FIFO);
-
- BOOST_CHECK(!ft.isSet(QueueOptions::strPersistLastNode));
- BOOST_CHECK(!ft.isSet(QueueOptions::strLastValueQueue));
-
-}
-
-QPID_AUTO_TEST_CASE(testSetOrdering)
-{
- //ensure setOrdering(FIFO) works even if not preceded by a call to
- //setOrdering(LVQ)
- QueueOptions ft;
- ft.setOrdering(FIFO);
- BOOST_CHECK(!ft.isSet(QueueOptions::strLastValueQueue));
-
-}
-
-QPID_AUTO_TEST_CASE(testClearPersistLastNode)
-{
- //ensure clear works even if not preceded by the setting on the
- //option
- QueueOptions ft;
- ft.clearPersistLastNode();
- BOOST_CHECK(!ft.isSet(QueueOptions::strPersistLastNode));
-}
-
-
-QPID_AUTO_TEST_SUITE_END()
-
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/QueuePolicyTest.cpp b/cpp/src/tests/QueuePolicyTest.cpp
deleted file mode 100644
index 5455105078..0000000000
--- a/cpp/src/tests/QueuePolicyTest.cpp
+++ /dev/null
@@ -1,406 +0,0 @@
-/*
- *
- * 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.
- *
- */
-#include <sstream>
-#include "unit_test.h"
-#include "test_tools.h"
-
-#include "qpid/broker/QueuePolicy.h"
-#include "qpid/broker/QueueFlowLimit.h"
-#include "qpid/client/QueueOptions.h"
-#include "qpid/sys/Time.h"
-#include "qpid/framing/reply_exceptions.h"
-#include "MessageUtils.h"
-#include "BrokerFixture.h"
-
-using namespace qpid::broker;
-using namespace qpid::client;
-using namespace qpid::framing;
-
-namespace qpid {
-namespace tests {
-
-QPID_AUTO_TEST_SUITE(QueuePolicyTestSuite)
-
-namespace {
-QueuedMessage createMessage(uint32_t size)
-{
- QueuedMessage msg;
- msg.payload = MessageUtils::createMessage();
- MessageUtils::addContent(msg.payload, std::string (size, 'x'));
- return msg;
-}
-}
-
-QPID_AUTO_TEST_CASE(testCount)
-{
- std::auto_ptr<QueuePolicy> policy(QueuePolicy::createQueuePolicy("test", 5, 0));
- BOOST_CHECK_EQUAL((uint64_t) 0, policy->getMaxSize());
- BOOST_CHECK_EQUAL((uint32_t) 5, policy->getMaxCount());
-
- QueuedMessage msg = createMessage(10);
- for (size_t i = 0; i < 5; i++) {
- policy->tryEnqueue(msg.payload);
- }
- try {
- policy->tryEnqueue(msg.payload);
- BOOST_FAIL("Policy did not fail on enqueuing sixth message");
- } catch (const ResourceLimitExceededException&) {}
-
- policy->dequeued(msg);
- policy->tryEnqueue(msg.payload);
-
- try {
- policy->tryEnqueue(msg.payload);
- BOOST_FAIL("Policy did not fail on enqueuing sixth message (after dequeue)");
- } catch (const ResourceLimitExceededException&) {}
-}
-
-QPID_AUTO_TEST_CASE(testSize)
-{
- std::auto_ptr<QueuePolicy> policy(QueuePolicy::createQueuePolicy("test", 0, 50));
- QueuedMessage msg = createMessage(10);
-
- for (size_t i = 0; i < 5; i++) {
- policy->tryEnqueue(msg.payload);
- }
- try {
- policy->tryEnqueue(msg.payload);
- BOOST_FAIL("Policy did not fail on aggregate size exceeding 50. " << *policy);
- } catch (const ResourceLimitExceededException&) {}
-
- policy->dequeued(msg);
- policy->tryEnqueue(msg.payload);
-
- try {
- policy->tryEnqueue(msg.payload);
- BOOST_FAIL("Policy did not fail on aggregate size exceeding 50 (after dequeue). " << *policy);
- } catch (const ResourceLimitExceededException&) {}
-}
-
-QPID_AUTO_TEST_CASE(testBoth)
-{
- std::auto_ptr<QueuePolicy> policy(QueuePolicy::createQueuePolicy("test", 5, 50));
- try {
- QueuedMessage msg = createMessage(51);
- policy->tryEnqueue(msg.payload);
- BOOST_FAIL("Policy did not fail on single message exceeding 50. " << *policy);
- } catch (const ResourceLimitExceededException&) {}
-
- std::vector<QueuedMessage> messages;
- messages.push_back(createMessage(15));
- messages.push_back(createMessage(10));
- messages.push_back(createMessage(11));
- messages.push_back(createMessage(2));
- messages.push_back(createMessage(7));
- for (size_t i = 0; i < messages.size(); i++) {
- policy->tryEnqueue(messages[i].payload);
- }
- //size = 45 at this point, count = 5
- try {
- QueuedMessage msg = createMessage(5);
- policy->tryEnqueue(msg.payload);
- BOOST_FAIL("Policy did not fail on count exceeding 6. " << *policy);
- } catch (const ResourceLimitExceededException&) {}
- try {
- QueuedMessage msg = createMessage(10);
- policy->tryEnqueue(msg.payload);
- BOOST_FAIL("Policy did not fail on aggregate size exceeding 50. " << *policy);
- } catch (const ResourceLimitExceededException&) {}
-
-
- policy->dequeued(messages[0]);
- try {
- QueuedMessage msg = createMessage(20);
- policy->tryEnqueue(msg.payload);
- } catch (const ResourceLimitExceededException&) {
- BOOST_FAIL("Policy failed incorrectly after dequeue. " << *policy);
- }
-}
-
-QPID_AUTO_TEST_CASE(testSettings)
-{
- //test reading and writing the policy from/to field table
- std::auto_ptr<QueuePolicy> a(QueuePolicy::createQueuePolicy("test", 101, 303));
- FieldTable settings;
- a->update(settings);
- std::auto_ptr<QueuePolicy> b(QueuePolicy::createQueuePolicy("test", settings));
- BOOST_CHECK_EQUAL(a->getMaxCount(), b->getMaxCount());
- BOOST_CHECK_EQUAL(a->getMaxSize(), b->getMaxSize());
-}
-
-QPID_AUTO_TEST_CASE(testRingPolicyCount)
-{
- FieldTable args;
- std::auto_ptr<QueuePolicy> policy = QueuePolicy::createQueuePolicy("test", 5, 0, QueuePolicy::RING);
- policy->update(args);
-
- ProxySessionFixture f;
- std::string q("my-ring-queue");
- f.session.queueDeclare(arg::queue=q, arg::exclusive=true, arg::autoDelete=true, arg::arguments=args);
- for (int i = 0; i < 10; i++) {
- f.session.messageTransfer(arg::content=client::Message((boost::format("%1%_%2%") % "Message" % (i+1)).str(), q));
- }
- client::Message msg;
- for (int i = 5; i < 10; i++) {
- BOOST_CHECK(f.subs.get(msg, q, qpid::sys::TIME_SEC));
- BOOST_CHECK_EQUAL((boost::format("%1%_%2%") % "Message" % (i+1)).str(), msg.getData());
- }
- BOOST_CHECK(!f.subs.get(msg, q));
-
- for (int i = 10; i < 20; i++) {
- f.session.messageTransfer(arg::content=client::Message((boost::format("%1%_%2%") % "Message" % (i+1)).str(), q));
- }
- for (int i = 15; i < 20; i++) {
- BOOST_CHECK(f.subs.get(msg, q, qpid::sys::TIME_SEC));
- BOOST_CHECK_EQUAL((boost::format("%1%_%2%") % "Message" % (i+1)).str(), msg.getData());
- }
- BOOST_CHECK(!f.subs.get(msg, q));
-}
-
-QPID_AUTO_TEST_CASE(testRingPolicySize)
-{
- std::string hundredBytes = std::string(100, 'h');
- std::string fourHundredBytes = std::string (400, 'f');
- std::string thousandBytes = std::string(1000, 't');
-
- // Ring queue, 500 bytes maxSize
-
- FieldTable args;
- std::auto_ptr<QueuePolicy> policy = QueuePolicy::createQueuePolicy("test", 0, 500, QueuePolicy::RING);
- policy->update(args);
-
- ProxySessionFixture f;
- std::string q("my-ring-queue");
- f.session.queueDeclare(arg::queue=q, arg::exclusive=true, arg::autoDelete=true, arg::arguments=args);
-
- // A. Send messages 0 .. 5, each 100 bytes
-
- client::Message m(hundredBytes, q);
-
- for (int i = 0; i < 6; i++) {
- std::stringstream id;
- id << i;
- m.getMessageProperties().setCorrelationId(id.str());
- f.session.messageTransfer(arg::content=m);
- }
-
- // should find 1 .. 5 on the queue, 0 is displaced by 5
- client::Message msg;
- for (int i = 1; i < 6; i++) {
- std::stringstream id;
- id << i;
- BOOST_CHECK(f.subs.get(msg, q, qpid::sys::TIME_SEC));
- BOOST_CHECK_EQUAL(msg.getMessageProperties().getCorrelationId(), id.str());
- }
- BOOST_CHECK(!f.subs.get(msg, q));
-
- // B. Now make sure that one 400 byte message displaces four 100 byte messages
-
- // Send messages 0 .. 5, each 100 bytes
- for (int i = 0; i < 6; i++) {
- client::Message m(hundredBytes, q);
- std::stringstream id;
- id << i;
- m.getMessageProperties().setCorrelationId(id.str());
- f.session.messageTransfer(arg::content=m);
- }
-
- // Now send one 400 byte message
- client::Message m2(fourHundredBytes, q);
- m2.getMessageProperties().setCorrelationId("6");
- f.session.messageTransfer(arg::content=m2);
-
- // expect to see 5, 6 on the queue
- for (int i = 5; i < 7; i++) {
- std::stringstream id;
- id << i;
- BOOST_CHECK(f.subs.get(msg, q, qpid::sys::TIME_SEC));
- BOOST_CHECK_EQUAL(msg.getMessageProperties().getCorrelationId(), id.str());
- }
- BOOST_CHECK(!f.subs.get(msg, q));
-
-
- // C. Try sending a 1000-byte message, should fail - exceeds maxSize of queue
-
- client::Message m3(thousandBytes, q);
- m3.getMessageProperties().setCorrelationId("6");
- try {
- ScopedSuppressLogging sl;
- f.session.messageTransfer(arg::content=m3);
- BOOST_FAIL("Ooops - successfully added a 1000 byte message to a 512 byte ring queue ...");
- }
- catch (...) {
- }
-
-}
-
-
-QPID_AUTO_TEST_CASE(testStrictRingPolicy)
-{
- FieldTable args;
- std::auto_ptr<QueuePolicy> policy = QueuePolicy::createQueuePolicy("test", 5, 0, QueuePolicy::RING_STRICT);
- policy->update(args);
-
- ProxySessionFixture f;
- std::string q("my-ring-queue");
- f.session.queueDeclare(arg::queue=q, arg::exclusive=true, arg::autoDelete=true, arg::arguments=args);
- LocalQueue incoming;
- SubscriptionSettings settings(FlowControl::unlimited());
- settings.autoAck = 0; // no auto ack.
- Subscription sub = f.subs.subscribe(incoming, q, settings);
- for (int i = 0; i < 5; i++) {
- f.session.messageTransfer(arg::content=client::Message((boost::format("%1%_%2%") % "Message" % (i+1)).str(), q));
- }
- for (int i = 0; i < 5; i++) {
- BOOST_CHECK_EQUAL(incoming.pop().getData(), (boost::format("%1%_%2%") % "Message" % (i+1)).str());
- }
- try {
- ScopedSuppressLogging sl; // Suppress messages for expected errors.
- f.session.messageTransfer(arg::content=client::Message("Message_6", q));
- BOOST_FAIL("expecting ResourceLimitExceededException.");
- } catch (const ResourceLimitExceededException&) {}
-}
-
-QPID_AUTO_TEST_CASE(testPolicyWithDtx)
-{
- FieldTable args;
- std::auto_ptr<QueuePolicy> policy = QueuePolicy::createQueuePolicy("test", 5, 0, QueuePolicy::REJECT);
- policy->update(args);
-
- ProxySessionFixture f;
- std::string q("my-policy-queue");
- f.session.queueDeclare(arg::queue=q, arg::exclusive=true, arg::autoDelete=true, arg::arguments=args);
- LocalQueue incoming;
- SubscriptionSettings settings(FlowControl::unlimited());
- settings.autoAck = 0; // no auto ack.
- Subscription sub = f.subs.subscribe(incoming, q, settings);
- f.session.dtxSelect();
- Xid tx1(1, "test-dtx-mgr", "tx1");
- f.session.dtxStart(arg::xid=tx1);
- for (int i = 0; i < 5; i++) {
- f.session.messageTransfer(arg::content=client::Message((boost::format("%1%_%2%") % "Message" % (i+1)).str(), q));
- }
- f.session.dtxEnd(arg::xid=tx1);
- f.session.dtxCommit(arg::xid=tx1, arg::onePhase=true);
-
- Xid tx2(1, "test-dtx-mgr", "tx2");
- f.session.dtxStart(arg::xid=tx2);
- for (int i = 0; i < 5; i++) {
- BOOST_CHECK_EQUAL(incoming.pop().getData(), (boost::format("%1%_%2%") % "Message" % (i+1)).str());
- }
- SequenceSet accepting=sub.getUnaccepted();
- f.session.messageAccept(accepting);
- f.session.dtxEnd(arg::xid=tx2);
- f.session.dtxPrepare(arg::xid=tx2);
- f.session.dtxRollback(arg::xid=tx2);
- f.session.messageRelease(accepting);
-
- Xid tx3(1, "test-dtx-mgr", "tx3");
- f.session.dtxStart(arg::xid=tx3);
- for (int i = 0; i < 5; i++) {
- incoming.pop();
- }
- accepting=sub.getUnaccepted();
- f.session.messageAccept(accepting);
- f.session.dtxEnd(arg::xid=tx3);
- f.session.dtxPrepare(arg::xid=tx3);
-
- Session other = f.connection.newSession();
- try {
- ScopedSuppressLogging sl; // Suppress messages for expected errors.
- other.messageTransfer(arg::content=client::Message("Message_6", q));
- BOOST_FAIL("expecting ResourceLimitExceededException.");
- } catch (const ResourceLimitExceededException&) {}
-
- f.session.dtxCommit(arg::xid=tx3);
- //now retry and this time should succeed
- other = f.connection.newSession();
- other.messageTransfer(arg::content=client::Message("Message_6", q));
-}
-
-QPID_AUTO_TEST_CASE(testFlowToDiskWithNoStore)
-{
- //Ensure that with no store loaded, we don't flow to disk but
- //fallback to rejecting messages
- QueueOptions args;
- args.setSizePolicy(FLOW_TO_DISK, 0, 5);
- // Disable flow control, or else we'll never hit the max limit
- args.setInt(QueueFlowLimit::flowStopCountKey, 0);
-
- ProxySessionFixture f;
- std::string q("my-queue");
- f.session.queueDeclare(arg::queue=q, arg::exclusive=true, arg::autoDelete=true, arg::arguments=args);
- LocalQueue incoming;
- SubscriptionSettings settings(FlowControl::unlimited());
- settings.autoAck = 0; // no auto ack.
- Subscription sub = f.subs.subscribe(incoming, q, settings);
- for (int i = 0; i < 5; i++) {
- f.session.messageTransfer(arg::content=client::Message((boost::format("%1%_%2%") % "Message" % (i+1)).str(), q));
- }
- for (int i = 0; i < 5; i++) {
- BOOST_CHECK_EQUAL(incoming.pop().getData(), (boost::format("%1%_%2%") % "Message" % (i+1)).str());
- }
- try {
- ScopedSuppressLogging sl; // Suppress messages for expected errors.
- f.session.messageTransfer(arg::content=client::Message("Message_6", q));
- BOOST_FAIL("expecting ResourceLimitExceededException.");
- } catch (const ResourceLimitExceededException&) {}
-}
-
-QPID_AUTO_TEST_CASE(testPolicyFailureOnCommit)
-{
- FieldTable args;
- std::auto_ptr<QueuePolicy> policy = QueuePolicy::createQueuePolicy("test", 5, 0, QueuePolicy::REJECT);
- policy->update(args);
-
- ProxySessionFixture f;
- std::string q("q");
- f.session.queueDeclare(arg::queue=q, arg::exclusive=true, arg::autoDelete=true, arg::arguments=args);
- f.session.txSelect();
- for (int i = 0; i < 10; i++) {
- f.session.messageTransfer(arg::content=client::Message((boost::format("%1%_%2%") % "Message" % (i+1)).str(), q));
- }
- ScopedSuppressLogging sl; // Suppress messages for expected errors.
- BOOST_CHECK_THROW(f.session.txCommit(), InternalErrorException);
-}
-
-QPID_AUTO_TEST_CASE(testCapacityConversion)
-{
- FieldTable args;
- args.setString("qpid.max_count", "5");
- args.setString("qpid.flow_stop_count", "0");
-
- ProxySessionFixture f;
- std::string q("q");
- f.session.queueDeclare(arg::queue=q, arg::exclusive=true, arg::autoDelete=true, arg::arguments=args);
- for (int i = 0; i < 5; i++) {
- f.session.messageTransfer(arg::content=client::Message((boost::format("%1%_%2%") % "Message" % (i+1)).str(), q));
- }
- try {
- ScopedSuppressLogging sl; // Suppress messages for expected errors.
- f.session.messageTransfer(arg::content=client::Message("Message_6", q));
- BOOST_FAIL("expecting ResourceLimitExceededException.");
- } catch (const ResourceLimitExceededException&) {}
-}
-
-QPID_AUTO_TEST_SUITE_END()
-
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/QueueRegistryTest.cpp b/cpp/src/tests/QueueRegistryTest.cpp
deleted file mode 100644
index ae555539a4..0000000000
--- a/cpp/src/tests/QueueRegistryTest.cpp
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * 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.
- */
-
-#include "qpid/broker/QueueRegistry.h"
-#include "qpid/broker/Queue.h"
-#include "unit_test.h"
-#include <string>
-
-using namespace qpid::broker;
-
-namespace qpid {
-namespace tests {
-
-QPID_AUTO_TEST_SUITE(QueueRegistryTest)
-
-QPID_AUTO_TEST_CASE(testDeclare)
-{
- std::string foo("foo");
- std::string bar("bar");
- QueueRegistry reg;
- std::pair<Queue::shared_ptr, bool> qc;
-
- qc = reg.declare(foo, false, 0, 0);
- Queue::shared_ptr q = qc.first;
- BOOST_CHECK(q);
- BOOST_CHECK(qc.second); // New queue
- BOOST_CHECK_EQUAL(foo, q->getName());
-
- qc = reg.declare(foo, false, 0, 0);
- BOOST_CHECK_EQUAL(q, qc.first);
- BOOST_CHECK(!qc.second);
-
- qc = reg.declare(bar, false, 0, 0);
- q = qc.first;
- BOOST_CHECK(q);
- BOOST_CHECK_EQUAL(true, qc.second);
- BOOST_CHECK_EQUAL(bar, q->getName());
-}
-
-QPID_AUTO_TEST_CASE(testDeclareTmp)
-{
- QueueRegistry reg;
- std::pair<Queue::shared_ptr, bool> qc;
-
- qc = reg.declare(std::string(), false, 0, 0);
- BOOST_CHECK(qc.second);
- BOOST_CHECK_EQUAL(std::string("tmp_1"), qc.first->getName());
-}
-
-QPID_AUTO_TEST_CASE(testFind)
-{
- std::string foo("foo");
- std::string bar("bar");
- QueueRegistry reg;
- std::pair<Queue::shared_ptr, bool> qc;
-
- BOOST_CHECK(reg.find(foo) == 0);
-
- reg.declare(foo, false, 0, 0);
- reg.declare(bar, false, 0, 0);
- Queue::shared_ptr q = reg.find(bar);
- BOOST_CHECK(q);
- BOOST_CHECK_EQUAL(bar, q->getName());
-}
-
-QPID_AUTO_TEST_CASE(testDestroy)
-{
- std::string foo("foo");
- QueueRegistry reg;
- std::pair<Queue::shared_ptr, bool> qc;
-
- qc = reg.declare(foo, false, 0, 0);
- reg.destroy(foo);
- // Queue is gone from the registry.
- BOOST_CHECK(reg.find(foo) == 0);
- // Queue is not actually destroyed till we drop our reference.
- BOOST_CHECK_EQUAL(foo, qc.first->getName());
- // We shoud be the only reference.
- BOOST_CHECK_EQUAL(1L, qc.first.use_count());
-}
-
-QPID_AUTO_TEST_SUITE_END()
-
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/QueueTest.cpp b/cpp/src/tests/QueueTest.cpp
deleted file mode 100644
index 34e4592a15..0000000000
--- a/cpp/src/tests/QueueTest.cpp
+++ /dev/null
@@ -1,1124 +0,0 @@
- /*
- *
- * 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.
- *
- */
-#include "MessageUtils.h"
-#include "unit_test.h"
-#include "test_tools.h"
-#include "qpid/Exception.h"
-#include "qpid/broker/Broker.h"
-#include "qpid/broker/DeliverableMessage.h"
-#include "qpid/broker/FanOutExchange.h"
-#include "qpid/broker/Queue.h"
-#include "qpid/broker/Deliverable.h"
-#include "qpid/broker/ExchangeRegistry.h"
-#include "qpid/broker/QueueRegistry.h"
-#include "qpid/broker/NullMessageStore.h"
-#include "qpid/broker/ExpiryPolicy.h"
-#include "qpid/framing/MessageTransferBody.h"
-#include "qpid/client/QueueOptions.h"
-#include "qpid/framing/AMQFrame.h"
-#include "qpid/framing/MessageTransferBody.h"
-#include "qpid/framing/reply_exceptions.h"
-#include "qpid/broker/QueuePolicy.h"
-#include "qpid/broker/QueueFlowLimit.h"
-
-#include <iostream>
-#include "boost/format.hpp"
-
-using boost::intrusive_ptr;
-using namespace qpid;
-using namespace qpid::broker;
-using namespace qpid::client;
-using namespace qpid::framing;
-using namespace qpid::sys;
-
-namespace qpid {
-namespace tests {
-
-class TestConsumer : public virtual Consumer{
-public:
- typedef boost::shared_ptr<TestConsumer> shared_ptr;
-
- intrusive_ptr<Message> last;
- bool received;
- TestConsumer(bool acquire = true):Consumer(acquire), received(false) {};
-
- virtual bool deliver(QueuedMessage& msg){
- last = msg.payload;
- received = true;
- return true;
- };
- void notify() {}
- OwnershipToken* getSession() { return 0; }
-};
-
-class FailOnDeliver : public Deliverable
-{
- boost::intrusive_ptr<Message> msg;
-public:
- FailOnDeliver() : msg(MessageUtils::createMessage()) {}
- void deliverTo(const boost::shared_ptr<Queue>& queue)
- {
- throw Exception(QPID_MSG("Invalid delivery to " << queue->getName()));
- }
- Message& getMessage() { return *(msg.get()); }
-};
-
-intrusive_ptr<Message> create_message(std::string exchange, std::string routingKey) {
- intrusive_ptr<Message> msg(new Message());
- AMQFrame method((MessageTransferBody(ProtocolVersion(), exchange, 0, 0)));
- AMQFrame header((AMQHeaderBody()));
- msg->getFrames().append(method);
- msg->getFrames().append(header);
- msg->getFrames().getHeaders()->get<DeliveryProperties>(true)->setRoutingKey(routingKey);
- return msg;
-}
-
-QPID_AUTO_TEST_SUITE(QueueTestSuite)
-
-QPID_AUTO_TEST_CASE(testAsyncMessage) {
- Queue::shared_ptr queue(new Queue("my_test_queue", true));
- intrusive_ptr<Message> received;
-
- TestConsumer::shared_ptr c1(new TestConsumer());
- queue->consume(c1);
-
-
- //Test basic delivery:
- intrusive_ptr<Message> msg1 = create_message("e", "A");
- msg1->enqueueAsync(queue, 0);//this is done on enqueue which is not called from process
- queue->process(msg1);
- sleep(2);
-
- BOOST_CHECK(!c1->received);
- msg1->enqueueComplete();
-
- received = queue->get().payload;
- BOOST_CHECK_EQUAL(msg1.get(), received.get());
-}
-
-
-QPID_AUTO_TEST_CASE(testAsyncMessageCount){
- Queue::shared_ptr queue(new Queue("my_test_queue", true));
- intrusive_ptr<Message> msg1 = create_message("e", "A");
- msg1->enqueueAsync(queue, 0);//this is done on enqueue which is not called from process
-
- queue->process(msg1);
- sleep(2);
- uint32_t compval=0;
- BOOST_CHECK_EQUAL(compval, queue->getEnqueueCompleteMessageCount());
- msg1->enqueueComplete();
- compval=1;
- BOOST_CHECK_EQUAL(compval, queue->getEnqueueCompleteMessageCount());
- BOOST_CHECK_EQUAL(compval, queue->getMessageCount());
-}
-
-QPID_AUTO_TEST_CASE(testConsumers){
- Queue::shared_ptr queue(new Queue("my_queue", true));
-
- //Test adding consumers:
- TestConsumer::shared_ptr c1(new TestConsumer());
- TestConsumer::shared_ptr c2(new TestConsumer());
- queue->consume(c1);
- queue->consume(c2);
-
- BOOST_CHECK_EQUAL(uint32_t(2), queue->getConsumerCount());
-
- //Test basic delivery:
- intrusive_ptr<Message> msg1 = create_message("e", "A");
- intrusive_ptr<Message> msg2 = create_message("e", "B");
- intrusive_ptr<Message> msg3 = create_message("e", "C");
-
- queue->deliver(msg1);
- BOOST_CHECK(queue->dispatch(c1));
- BOOST_CHECK_EQUAL(msg1.get(), c1->last.get());
-
- queue->deliver(msg2);
- BOOST_CHECK(queue->dispatch(c2));
- BOOST_CHECK_EQUAL(msg2.get(), c2->last.get());
-
- c1->received = false;
- queue->deliver(msg3);
- BOOST_CHECK(queue->dispatch(c1));
- BOOST_CHECK_EQUAL(msg3.get(), c1->last.get());
-
- //Test cancellation:
- queue->cancel(c1);
- BOOST_CHECK_EQUAL(uint32_t(1), queue->getConsumerCount());
- queue->cancel(c2);
- BOOST_CHECK_EQUAL(uint32_t(0), queue->getConsumerCount());
-}
-
-QPID_AUTO_TEST_CASE(testRegistry){
- //Test use of queues in registry:
- QueueRegistry registry;
- registry.declare("queue1", true, true);
- registry.declare("queue2", true, true);
- registry.declare("queue3", true, true);
-
- BOOST_CHECK(registry.find("queue1"));
- BOOST_CHECK(registry.find("queue2"));
- BOOST_CHECK(registry.find("queue3"));
-
- registry.destroy("queue1");
- registry.destroy("queue2");
- registry.destroy("queue3");
-
- BOOST_CHECK(!registry.find("queue1"));
- BOOST_CHECK(!registry.find("queue2"));
- BOOST_CHECK(!registry.find("queue3"));
-}
-
-QPID_AUTO_TEST_CASE(testDequeue){
- Queue::shared_ptr queue(new Queue("my_queue", true));
- intrusive_ptr<Message> msg1 = create_message("e", "A");
- intrusive_ptr<Message> msg2 = create_message("e", "B");
- intrusive_ptr<Message> msg3 = create_message("e", "C");
- intrusive_ptr<Message> received;
-
- queue->deliver(msg1);
- queue->deliver(msg2);
- queue->deliver(msg3);
-
- BOOST_CHECK_EQUAL(uint32_t(3), queue->getMessageCount());
-
- received = queue->get().payload;
- BOOST_CHECK_EQUAL(msg1.get(), received.get());
- BOOST_CHECK_EQUAL(uint32_t(2), queue->getMessageCount());
-
- received = queue->get().payload;
- BOOST_CHECK_EQUAL(msg2.get(), received.get());
- BOOST_CHECK_EQUAL(uint32_t(1), queue->getMessageCount());
-
- TestConsumer::shared_ptr consumer(new TestConsumer());
- queue->consume(consumer);
- queue->dispatch(consumer);
- if (!consumer->received)
- sleep(2);
-
- BOOST_CHECK_EQUAL(msg3.get(), consumer->last.get());
- BOOST_CHECK_EQUAL(uint32_t(0), queue->getMessageCount());
-
- received = queue->get().payload;
- BOOST_CHECK(!received);
- BOOST_CHECK_EQUAL(uint32_t(0), queue->getMessageCount());
-
-}
-
-QPID_AUTO_TEST_CASE(testBound){
- //test the recording of bindings, and use of those to allow a queue to be unbound
- string key("my-key");
- FieldTable args;
-
- Queue::shared_ptr queue(new Queue("my-queue", true));
- ExchangeRegistry exchanges;
- //establish bindings from exchange->queue and notify the queue as it is bound:
- Exchange::shared_ptr exchange1 = exchanges.declare("my-exchange-1", "direct").first;
- exchange1->bind(queue, key, &args);
- queue->bound(exchange1->getName(), key, args);
-
- Exchange::shared_ptr exchange2 = exchanges.declare("my-exchange-2", "fanout").first;
- exchange2->bind(queue, key, &args);
- queue->bound(exchange2->getName(), key, args);
-
- Exchange::shared_ptr exchange3 = exchanges.declare("my-exchange-3", "topic").first;
- exchange3->bind(queue, key, &args);
- queue->bound(exchange3->getName(), key, args);
-
- //delete one of the exchanges:
- exchanges.destroy(exchange2->getName());
- exchange2.reset();
-
- //unbind the queue from all exchanges it knows it has been bound to:
- queue->unbind(exchanges);
-
- //ensure the remaining exchanges don't still have the queue bound to them:
- FailOnDeliver deliverable;
- exchange1->route(deliverable, key, &args);
- exchange3->route(deliverable, key, &args);
-}
-
-QPID_AUTO_TEST_CASE(testPersistLastNodeStanding){
- client::QueueOptions args;
- args.setPersistLastNode();
-
- Queue::shared_ptr queue(new Queue("my-queue", true));
- queue->configure(args);
-
- intrusive_ptr<Message> msg1 = create_message("e", "A");
- intrusive_ptr<Message> msg2 = create_message("e", "B");
- intrusive_ptr<Message> msg3 = create_message("e", "C");
-
- //enqueue 2 messages
- queue->deliver(msg1);
- queue->deliver(msg2);
-
- //change mode
- queue->setLastNodeFailure();
-
- //enqueue 1 message
- queue->deliver(msg3);
-
- //check all have persistent ids.
- BOOST_CHECK(msg1->isPersistent());
- BOOST_CHECK(msg2->isPersistent());
- BOOST_CHECK(msg3->isPersistent());
-
-}
-
-
-QPID_AUTO_TEST_CASE(testSeek){
-
- Queue::shared_ptr queue(new Queue("my-queue", true));
-
- intrusive_ptr<Message> msg1 = create_message("e", "A");
- intrusive_ptr<Message> msg2 = create_message("e", "B");
- intrusive_ptr<Message> msg3 = create_message("e", "C");
-
- //enqueue 2 messages
- queue->deliver(msg1);
- queue->deliver(msg2);
- queue->deliver(msg3);
-
- TestConsumer::shared_ptr consumer(new TestConsumer(false));
- SequenceNumber seq(2);
- consumer->position = seq;
-
- QueuedMessage qm;
- queue->dispatch(consumer);
-
- BOOST_CHECK_EQUAL(msg3.get(), consumer->last.get());
- queue->dispatch(consumer);
- queue->dispatch(consumer); // make sure over-run is safe
-
-}
-
-QPID_AUTO_TEST_CASE(testSearch){
-
- Queue::shared_ptr queue(new Queue("my-queue", true));
-
- intrusive_ptr<Message> msg1 = create_message("e", "A");
- intrusive_ptr<Message> msg2 = create_message("e", "B");
- intrusive_ptr<Message> msg3 = create_message("e", "C");
-
- //enqueue 2 messages
- queue->deliver(msg1);
- queue->deliver(msg2);
- queue->deliver(msg3);
-
- SequenceNumber seq(2);
- QueuedMessage qm = queue->find(seq);
-
- BOOST_CHECK_EQUAL(seq.getValue(), qm.position.getValue());
-
- queue->acquire(qm);
- BOOST_CHECK_EQUAL(queue->getMessageCount(), 2u);
- SequenceNumber seq1(3);
- QueuedMessage qm1 = queue->find(seq1);
- BOOST_CHECK_EQUAL(seq1.getValue(), qm1.position.getValue());
-
-}
-const std::string nullxid = "";
-
-class SimpleDummyCtxt : public TransactionContext {};
-
-class DummyCtxt : public TPCTransactionContext
-{
- const std::string xid;
- public:
- DummyCtxt(const std::string& _xid) : xid(_xid) {}
- static std::string getXid(TransactionContext& ctxt)
- {
- DummyCtxt* c(dynamic_cast<DummyCtxt*>(&ctxt));
- return c ? c->xid : nullxid;
- }
-};
-
-class TestMessageStoreOC : public MessageStore
-{
- std::set<std::string> prepared;
- uint64_t nextPersistenceId;
- public:
-
- uint enqCnt;
- uint deqCnt;
- bool error;
-
- TestMessageStoreOC() : MessageStore(),nextPersistenceId(1),enqCnt(0),deqCnt(0),error(false) {}
- ~TestMessageStoreOC(){}
-
- virtual void dequeue(TransactionContext*,
- const boost::intrusive_ptr<PersistableMessage>& /*msg*/,
- const PersistableQueue& /*queue*/)
- {
- if (error) throw Exception("Dequeue error test");
- deqCnt++;
- }
-
- virtual void enqueue(TransactionContext*,
- const boost::intrusive_ptr<PersistableMessage>& msg,
- const PersistableQueue& /* queue */)
- {
- if (error) throw Exception("Enqueue error test");
- enqCnt++;
- msg->enqueueComplete();
- }
-
- void createError()
- {
- error=true;
- }
-
- bool init(const Options*) { return true; }
- void truncateInit(const bool) {}
- void create(PersistableQueue& queue, const framing::FieldTable&) { queue.setPersistenceId(nextPersistenceId++); }
- void destroy(PersistableQueue&) {}
- void create(const PersistableExchange& exchange, const framing::FieldTable&) { exchange.setPersistenceId(nextPersistenceId++); }
- void destroy(const PersistableExchange&) {}
- void bind(const PersistableExchange&, const PersistableQueue&, const std::string&, const framing::FieldTable&) {}
- void unbind(const PersistableExchange&, const PersistableQueue&, const std::string&, const framing::FieldTable&) {}
- void create(const PersistableConfig& config) { config.setPersistenceId(nextPersistenceId++); }
- void destroy(const PersistableConfig&) {}
- void stage(const boost::intrusive_ptr<PersistableMessage>&) {}
- void destroy(PersistableMessage&) {}
- void appendContent(const boost::intrusive_ptr<const PersistableMessage>&, const std::string&) {}
- void loadContent(const qpid::broker::PersistableQueue&, const boost::intrusive_ptr<const PersistableMessage>&,
- std::string&, uint64_t, uint32_t) { throw qpid::framing::InternalErrorException("Can't load content; persistence not enabled"); }
- void flush(const qpid::broker::PersistableQueue&) {}
- uint32_t outstandingQueueAIO(const PersistableQueue&) { return 0; }
-
- std::auto_ptr<TransactionContext> begin() { return std::auto_ptr<TransactionContext>(new SimpleDummyCtxt()); }
- std::auto_ptr<TPCTransactionContext> begin(const std::string& xid) { return std::auto_ptr<TPCTransactionContext>(new DummyCtxt(xid)); }
- void prepare(TPCTransactionContext& ctxt) { prepared.insert(DummyCtxt::getXid(ctxt)); }
- void commit(TransactionContext& ctxt) { prepared.erase(DummyCtxt::getXid(ctxt)); }
- void abort(TransactionContext& ctxt) { prepared.erase(DummyCtxt::getXid(ctxt)); }
- void collectPreparedXids(std::set<std::string>& out) { out.insert(prepared.begin(), prepared.end()); }
-
- void recover(RecoveryManager&) {}
-};
-
-
-QPID_AUTO_TEST_CASE(testLVQOrdering){
-
- client::QueueOptions args;
- // set queue mode
- args.setOrdering(client::LVQ);
-
- Queue::shared_ptr queue(new Queue("my-queue", true ));
- queue->configure(args);
-
- intrusive_ptr<Message> msg1 = create_message("e", "A");
- intrusive_ptr<Message> msg2 = create_message("e", "B");
- intrusive_ptr<Message> msg3 = create_message("e", "C");
- intrusive_ptr<Message> msg4 = create_message("e", "D");
- intrusive_ptr<Message> received;
-
- //set deliever match for LVQ a,b,c,a
-
- string key;
- args.getLVQKey(key);
- BOOST_CHECK_EQUAL(key, "qpid.LVQ_key");
-
-
- msg1->getProperties<MessageProperties>()->getApplicationHeaders().setString(key,"a");
- msg2->getProperties<MessageProperties>()->getApplicationHeaders().setString(key,"b");
- msg3->getProperties<MessageProperties>()->getApplicationHeaders().setString(key,"c");
- msg4->getProperties<MessageProperties>()->getApplicationHeaders().setString(key,"a");
-
- //enqueue 4 message
- queue->deliver(msg1);
- queue->deliver(msg2);
- queue->deliver(msg3);
- queue->deliver(msg4);
-
- BOOST_CHECK_EQUAL(queue->getMessageCount(), 3u);
-
- received = queue->get().payload;
- BOOST_CHECK_EQUAL(msg4.get(), received.get());
-
- received = queue->get().payload;
- BOOST_CHECK_EQUAL(msg2.get(), received.get());
-
- received = queue->get().payload;
- BOOST_CHECK_EQUAL(msg3.get(), received.get());
-
- intrusive_ptr<Message> msg5 = create_message("e", "A");
- intrusive_ptr<Message> msg6 = create_message("e", "B");
- intrusive_ptr<Message> msg7 = create_message("e", "C");
- msg5->getProperties<MessageProperties>()->getApplicationHeaders().setString(key,"a");
- msg6->getProperties<MessageProperties>()->getApplicationHeaders().setString(key,"b");
- msg7->getProperties<MessageProperties>()->getApplicationHeaders().setString(key,"c");
- queue->deliver(msg5);
- queue->deliver(msg6);
- queue->deliver(msg7);
-
- BOOST_CHECK_EQUAL(queue->getMessageCount(), 3u);
-
- received = queue->get().payload;
- BOOST_CHECK_EQUAL(msg5.get(), received.get());
-
- received = queue->get().payload;
- BOOST_CHECK_EQUAL(msg6.get(), received.get());
-
- received = queue->get().payload;
- BOOST_CHECK_EQUAL(msg7.get(), received.get());
-
-}
-
-QPID_AUTO_TEST_CASE(testLVQEmptyKey){
-
- client::QueueOptions args;
- // set queue mode
- args.setOrdering(client::LVQ);
-
- Queue::shared_ptr queue(new Queue("my-queue", true ));
- queue->configure(args);
-
- intrusive_ptr<Message> msg1 = create_message("e", "A");
- intrusive_ptr<Message> msg2 = create_message("e", "B");
-
- string key;
- args.getLVQKey(key);
- BOOST_CHECK_EQUAL(key, "qpid.LVQ_key");
-
-
- msg1->getProperties<MessageProperties>()->getApplicationHeaders().setString(key,"a");
- queue->deliver(msg1);
- queue->deliver(msg2);
- BOOST_CHECK_EQUAL(queue->getMessageCount(), 2u);
-
-}
-
-QPID_AUTO_TEST_CASE(testLVQAcquire){
-
- client::QueueOptions args;
- // set queue mode
- args.setOrdering(client::LVQ);
- // disable flow control, as this test violates the enqueue/dequeue sequence.
- args.setInt(QueueFlowLimit::flowStopCountKey, 0);
-
- Queue::shared_ptr queue(new Queue("my-queue", true ));
- queue->configure(args);
-
- intrusive_ptr<Message> msg1 = create_message("e", "A");
- intrusive_ptr<Message> msg2 = create_message("e", "B");
- intrusive_ptr<Message> msg3 = create_message("e", "C");
- intrusive_ptr<Message> msg4 = create_message("e", "D");
- intrusive_ptr<Message> msg5 = create_message("e", "F");
- intrusive_ptr<Message> msg6 = create_message("e", "G");
-
- //set deliever match for LVQ a,b,c,a
-
- string key;
- args.getLVQKey(key);
- BOOST_CHECK_EQUAL(key, "qpid.LVQ_key");
-
-
- msg1->getProperties<MessageProperties>()->getApplicationHeaders().setString(key,"a");
- msg2->getProperties<MessageProperties>()->getApplicationHeaders().setString(key,"b");
- msg3->getProperties<MessageProperties>()->getApplicationHeaders().setString(key,"c");
- msg4->getProperties<MessageProperties>()->getApplicationHeaders().setString(key,"a");
- msg5->getProperties<MessageProperties>()->getApplicationHeaders().setString(key,"b");
- msg6->getProperties<MessageProperties>()->getApplicationHeaders().setString(key,"c");
-
- //enqueue 4 message
- queue->deliver(msg1);
- queue->deliver(msg2);
- queue->deliver(msg3);
- queue->deliver(msg4);
-
- BOOST_CHECK_EQUAL(queue->getMessageCount(), 3u);
-
- framing::SequenceNumber sequence(1);
- QueuedMessage qmsg(queue.get(), msg1, sequence);
- QueuedMessage qmsg2(queue.get(), msg2, ++sequence);
- framing::SequenceNumber sequence1(10);
- QueuedMessage qmsg3(queue.get(), 0, sequence1);
-
- BOOST_CHECK(!queue->acquire(qmsg));
- BOOST_CHECK(queue->acquire(qmsg2));
- // Acquire the massage again to test failure case.
- BOOST_CHECK(!queue->acquire(qmsg2));
- BOOST_CHECK(!queue->acquire(qmsg3));
-
- BOOST_CHECK_EQUAL(queue->getMessageCount(), 2u);
-
- queue->deliver(msg5);
- BOOST_CHECK_EQUAL(queue->getMessageCount(), 3u);
-
- // set mode to no browse and check
- args.setOrdering(client::LVQ_NO_BROWSE);
- queue->configure(args);
- TestConsumer::shared_ptr c1(new TestConsumer(false));
-
- queue->dispatch(c1);
- queue->dispatch(c1);
- queue->dispatch(c1);
-
- queue->deliver(msg6);
- BOOST_CHECK_EQUAL(queue->getMessageCount(), 3u);
-
- intrusive_ptr<Message> received;
- received = queue->get().payload;
- BOOST_CHECK_EQUAL(msg4.get(), received.get());
-
-}
-
-QPID_AUTO_TEST_CASE(testLVQMultiQueue){
-
- client::QueueOptions args;
- // set queue mode
- args.setOrdering(client::LVQ);
-
- Queue::shared_ptr queue1(new Queue("my-queue", true ));
- Queue::shared_ptr queue2(new Queue("my-queue", true ));
- intrusive_ptr<Message> received;
- queue1->configure(args);
- queue2->configure(args);
-
- intrusive_ptr<Message> msg1 = create_message("e", "A");
- intrusive_ptr<Message> msg2 = create_message("e", "A");
-
- string key;
- args.getLVQKey(key);
- BOOST_CHECK_EQUAL(key, "qpid.LVQ_key");
-
- msg1->getProperties<MessageProperties>()->getApplicationHeaders().setString(key,"a");
- msg2->getProperties<MessageProperties>()->getApplicationHeaders().setString(key,"a");
-
- queue1->deliver(msg1);
- queue2->deliver(msg1);
- queue1->deliver(msg2);
-
- received = queue1->get().payload;
- BOOST_CHECK_EQUAL(msg2.get(), received.get());
-
- received = queue2->get().payload;
- BOOST_CHECK_EQUAL(msg1.get(), received.get());
-
-}
-
-QPID_AUTO_TEST_CASE(testLVQRecover){
-
-/* simulate this
- 1. start 2 nodes
- 2. create cluster durable lvq
- 3. send a transient message to the queue
- 4. kill one of the nodes (to trigger force persistent behaviour)...
- 5. then restart it (to turn off force persistent behaviour)
- 6. send another transient message with same lvq key as in 3
- 7. kill the second node again (retrigger force persistent)
- 8. stop and recover the first node
-*/
- TestMessageStoreOC testStore;
- client::QueueOptions args;
- // set queue mode
- args.setOrdering(client::LVQ);
- args.setPersistLastNode();
-
- Queue::shared_ptr queue1(new Queue("my-queue", true, &testStore));
- intrusive_ptr<Message> received;
- queue1->create(args);
-
- intrusive_ptr<Message> msg1 = create_message("e", "A");
- intrusive_ptr<Message> msg2 = create_message("e", "A");
- // 2
- string key;
- args.getLVQKey(key);
- BOOST_CHECK_EQUAL(key, "qpid.LVQ_key");
-
- msg1->getProperties<MessageProperties>()->getApplicationHeaders().setString(key,"a");
- msg2->getProperties<MessageProperties>()->getApplicationHeaders().setString(key,"a");
- // 3
- queue1->deliver(msg1);
- // 4
- queue1->setLastNodeFailure();
- BOOST_CHECK_EQUAL(testStore.enqCnt, 1u);
- // 5
- queue1->clearLastNodeFailure();
- BOOST_CHECK_EQUAL(testStore.enqCnt, 1u);
- // 6
- queue1->deliver(msg2);
- BOOST_CHECK_EQUAL(testStore.enqCnt, 1u);
- queue1->setLastNodeFailure();
- BOOST_CHECK_EQUAL(testStore.enqCnt, 2u);
- BOOST_CHECK_EQUAL(testStore.deqCnt, 1u);
-}
-
-void addMessagesToQueue(uint count, Queue& queue, uint oddTtl = 200, uint evenTtl = 0)
-{
- for (uint i = 0; i < count; i++) {
- intrusive_ptr<Message> m = create_message("exchange", "key");
- if (i % 2) {
- if (oddTtl) m->getProperties<DeliveryProperties>()->setTtl(oddTtl);
- } else {
- if (evenTtl) m->getProperties<DeliveryProperties>()->setTtl(evenTtl);
- }
- m->setTimestamp(new broker::ExpiryPolicy);
- queue.deliver(m);
- }
-}
-
-QPID_AUTO_TEST_CASE(testPurgeExpired) {
- Queue queue("my-queue");
- addMessagesToQueue(10, queue);
- BOOST_CHECK_EQUAL(queue.getMessageCount(), 10u);
- ::usleep(300*1000);
- queue.purgeExpired();
- BOOST_CHECK_EQUAL(queue.getMessageCount(), 5u);
-}
-
-QPID_AUTO_TEST_CASE(testQueueCleaner) {
- Timer timer;
- QueueRegistry queues;
- Queue::shared_ptr queue = queues.declare("my-queue").first;
- addMessagesToQueue(10, *queue, 200, 400);
- BOOST_CHECK_EQUAL(queue->getMessageCount(), 10u);
-
- QueueCleaner cleaner(queues, timer);
- cleaner.start(100 * qpid::sys::TIME_MSEC);
- ::usleep(300*1000);
- BOOST_CHECK_EQUAL(queue->getMessageCount(), 5u);
- ::usleep(300*1000);
- BOOST_CHECK_EQUAL(queue->getMessageCount(), 0u);
-}
-
-QPID_AUTO_TEST_CASE(testMultiQueueLastNode){
-
- TestMessageStoreOC testStore;
- client::QueueOptions args;
- args.setPersistLastNode();
-
- Queue::shared_ptr queue1(new Queue("queue1", true, &testStore ));
- queue1->create(args);
- Queue::shared_ptr queue2(new Queue("queue2", true, &testStore ));
- queue2->create(args);
-
- intrusive_ptr<Message> msg1 = create_message("e", "A");
-
- queue1->deliver(msg1);
- queue2->deliver(msg1);
-
- //change mode
- queue1->setLastNodeFailure();
- BOOST_CHECK_EQUAL(testStore.enqCnt, 1u);
- queue2->setLastNodeFailure();
- BOOST_CHECK_EQUAL(testStore.enqCnt, 2u);
-
- // check they don't get stored twice
- queue1->setLastNodeFailure();
- queue2->setLastNodeFailure();
- BOOST_CHECK_EQUAL(testStore.enqCnt, 2u);
-
- intrusive_ptr<Message> msg2 = create_message("e", "B");
- queue1->deliver(msg2);
- queue2->deliver(msg2);
-
- queue1->clearLastNodeFailure();
- queue2->clearLastNodeFailure();
- // check only new messages get forced
- queue1->setLastNodeFailure();
- queue2->setLastNodeFailure();
- BOOST_CHECK_EQUAL(testStore.enqCnt, 4u);
-
- // check no failure messages are stored
- queue1->clearLastNodeFailure();
- queue2->clearLastNodeFailure();
-
- intrusive_ptr<Message> msg3 = create_message("e", "B");
- queue1->deliver(msg3);
- queue2->deliver(msg3);
- BOOST_CHECK_EQUAL(testStore.enqCnt, 4u);
- queue1->setLastNodeFailure();
- queue2->setLastNodeFailure();
- BOOST_CHECK_EQUAL(testStore.enqCnt, 6u);
-
- // check requeue 1
- intrusive_ptr<Message> msg4 = create_message("e", "C");
- intrusive_ptr<Message> msg5 = create_message("e", "D");
-
- framing::SequenceNumber sequence(1);
- QueuedMessage qmsg1(queue1.get(), msg4, sequence);
- QueuedMessage qmsg2(queue2.get(), msg5, ++sequence);
-
- queue1->requeue(qmsg1);
- BOOST_CHECK_EQUAL(testStore.enqCnt, 7u);
-
- // check requeue 2
- queue2->clearLastNodeFailure();
- queue2->requeue(qmsg2);
- BOOST_CHECK_EQUAL(testStore.enqCnt, 7u);
- queue2->setLastNodeFailure();
- BOOST_CHECK_EQUAL(testStore.enqCnt, 8u);
-
- queue2->clearLastNodeFailure();
- queue2->setLastNodeFailure();
- BOOST_CHECK_EQUAL(testStore.enqCnt, 8u);
-}
-
-QPID_AUTO_TEST_CASE(testLastNodeRecoverAndFail){
-/*
-simulate this:
- 1. start two nodes
- 2. create cluster durable queue and add some messages
- 3. kill one node (trigger force-persistent behaviour)
- 4. stop and recover remaining node
- 5. add another node
- 6. kill that new node again
-make sure that an attempt to re-enqueue a message does not happen which will
-result in the last man standing exiting with an error.
-
-we need to make sure that recover is safe, i.e. messages are
-not requeued to the store.
-*/
- TestMessageStoreOC testStore;
- client::QueueOptions args;
- // set queue mode
- args.setPersistLastNode();
-
- Queue::shared_ptr queue1(new Queue("my-queue", true, &testStore));
- intrusive_ptr<Message> received;
- queue1->create(args);
-
- // check requeue 1
- intrusive_ptr<Message> msg1 = create_message("e", "C");
- intrusive_ptr<Message> msg2 = create_message("e", "D");
-
- queue1->recover(msg1);
-
- queue1->setLastNodeFailure();
- BOOST_CHECK_EQUAL(testStore.enqCnt, 0u);
-
- queue1->clearLastNodeFailure();
- BOOST_CHECK_EQUAL(testStore.enqCnt, 0u);
-
- queue1->deliver(msg2);
- BOOST_CHECK_EQUAL(testStore.enqCnt, 0u);
- queue1->setLastNodeFailure();
- BOOST_CHECK_EQUAL(testStore.enqCnt, 1u);
-
-}
-
-QPID_AUTO_TEST_CASE(testLastNodeJournalError){
-/*
-simulate store exception going into last node standing
-
-*/
- TestMessageStoreOC testStore;
- client::QueueOptions args;
- // set queue mode
- args.setPersistLastNode();
-
- Queue::shared_ptr queue1(new Queue("my-queue", true, &testStore));
- intrusive_ptr<Message> received;
- queue1->configure(args);
-
- // check requeue 1
- intrusive_ptr<Message> msg1 = create_message("e", "C");
-
- queue1->deliver(msg1);
- testStore.createError();
-
- ScopedSuppressLogging sl; // Suppress messages for expected errors.
- queue1->setLastNodeFailure();
- BOOST_CHECK_EQUAL(testStore.enqCnt, 0u);
-
-}
-
-intrusive_ptr<Message> mkMsg(MessageStore& store, std::string content = "", bool durable = false)
-{
- intrusive_ptr<Message> msg = MessageUtils::createMessage("", "", durable);
- if (content.size()) MessageUtils::addContent(msg, content);
- msg->setStore(&store);
- return msg;
-}
-
-QPID_AUTO_TEST_CASE(testFlowToDiskBlocking){
-
- TestMessageStoreOC testStore;
- client::QueueOptions args0; // No size policy
- client::QueueOptions args1;
- args1.setSizePolicy(FLOW_TO_DISK, 0, 1);
- client::QueueOptions args2;
- args2.setSizePolicy(FLOW_TO_DISK, 0, 2);
-
- // --- Fanout exchange bound to single transient queue -------------------------------------------------------------
-
- FanOutExchange sbtFanout1("sbtFanout1", false, args0); // single binding to transient queue
- Queue::shared_ptr tq1(new Queue("tq1", true)); // transient w/ limit
- tq1->configure(args1);
- sbtFanout1.bind(tq1, "", 0);
-
- intrusive_ptr<Message> msg01 = mkMsg(testStore, std::string(5, 'X')); // transient w/ content
- DeliverableMessage dmsg01(msg01);
- sbtFanout1.route(dmsg01, "", 0); // Brings queue 1 to capacity limit
- msg01->tryReleaseContent();
- BOOST_CHECK_EQUAL(msg01->isContentReleased(), false);
- BOOST_CHECK_EQUAL(1u, tq1->getMessageCount());
-
- intrusive_ptr<Message> msg02 = mkMsg(testStore, std::string(5, 'X')); // transient w/ content
- DeliverableMessage dmsg02(msg02);
- {
- ScopedSuppressLogging sl; // suppress expected error messages.
- BOOST_CHECK_THROW(sbtFanout1.route(dmsg02, "", 0), ResourceLimitExceededException);
- }
- msg02->tryReleaseContent();
- BOOST_CHECK_EQUAL(msg02->isContentReleased(), false);
- BOOST_CHECK_EQUAL(1u, tq1->getMessageCount());
-
- intrusive_ptr<Message> msg03 = mkMsg(testStore, std::string(5, 'X'), true); // durable w/ content
- DeliverableMessage dmsg03(msg03);
- {
- ScopedSuppressLogging sl; // suppress expected error messages.
- BOOST_CHECK_THROW(sbtFanout1.route(dmsg03, "", 0), ResourceLimitExceededException);
- }
- msg03->tryReleaseContent();
- BOOST_CHECK_EQUAL(msg03->isContentReleased(), false);
- BOOST_CHECK_EQUAL(1u, tq1->getMessageCount());
-
- intrusive_ptr<Message> msg04 = mkMsg(testStore); // transient no content
- DeliverableMessage dmsg04(msg04);
- {
- ScopedSuppressLogging sl; // suppress expected error messages.
- BOOST_CHECK_THROW(sbtFanout1.route(dmsg04, "", 0), ResourceLimitExceededException);
- }
- msg04->tryReleaseContent();
- BOOST_CHECK_EQUAL(msg04->isContentReleased(), false);
- BOOST_CHECK_EQUAL(1u, tq1->getMessageCount());
-
- intrusive_ptr<Message> msg05 = mkMsg(testStore, "", true); // durable no content
- DeliverableMessage dmsg05(msg05);
- {
- ScopedSuppressLogging sl; // suppress expected error messages.
- BOOST_CHECK_THROW(sbtFanout1.route(dmsg05, "", 0), ResourceLimitExceededException);
- }
- msg05->tryReleaseContent();
- BOOST_CHECK_EQUAL(msg05->isContentReleased(), false);
- BOOST_CHECK_EQUAL(1u, tq1->getMessageCount());
-
- // --- Fanout exchange bound to single durable queue ---------------------------------------------------------------
-
- FanOutExchange sbdFanout2("sbdFanout2", false, args0); // single binding to durable queue
- Queue::shared_ptr dq2(new Queue("dq2", true, &testStore)); // durable w/ limit
- dq2->configure(args1);
- sbdFanout2.bind(dq2, "", 0);
-
- intrusive_ptr<Message> msg06 = mkMsg(testStore, std::string(5, 'X')); // transient w/ content
- DeliverableMessage dmsg06(msg06);
- sbdFanout2.route(dmsg06, "", 0); // Brings queue 2 to capacity limit
- msg06->tryReleaseContent();
- BOOST_CHECK_EQUAL(msg06->isContentReleased(), false);
- BOOST_CHECK_EQUAL(1u, dq2->getMessageCount());
-
- intrusive_ptr<Message> msg07 = mkMsg(testStore, std::string(5, 'X')); // transient w/ content
- DeliverableMessage dmsg07(msg07);
- sbdFanout2.route(dmsg07, "", 0);
- msg07->tryReleaseContent();
- BOOST_CHECK_EQUAL(msg07->isContentReleased(), true);
- BOOST_CHECK_EQUAL(2u, dq2->getMessageCount());
-
- intrusive_ptr<Message> msg08 = mkMsg(testStore, std::string(5, 'X'), true); // durable w/ content
- DeliverableMessage dmsg08(msg08);
- sbdFanout2.route(dmsg08, "", 0);
- msg08->tryReleaseContent();
- BOOST_CHECK_EQUAL(msg08->isContentReleased(), true);
- BOOST_CHECK_EQUAL(3u, dq2->getMessageCount());
-
- intrusive_ptr<Message> msg09 = mkMsg(testStore); // transient no content
- DeliverableMessage dmsg09(msg09);
- sbdFanout2.route(dmsg09, "", 0);
- msg09->tryReleaseContent();
- BOOST_CHECK_EQUAL(msg09->isContentReleased(), true);
- BOOST_CHECK_EQUAL(4u, dq2->getMessageCount());
-
- intrusive_ptr<Message> msg10 = mkMsg(testStore, "", true); // durable no content
- DeliverableMessage dmsg10(msg10);
- sbdFanout2.route(dmsg10, "", 0);
- msg10->tryReleaseContent();
- BOOST_CHECK_EQUAL(msg10->isContentReleased(), true);
- BOOST_CHECK_EQUAL(5u, dq2->getMessageCount());
-
- // --- Fanout exchange bound to multiple durable queues ------------------------------------------------------------
-
- FanOutExchange mbdFanout3("mbdFanout3", false, args0); // multiple bindings to durable queues
- Queue::shared_ptr dq3(new Queue("dq3", true, &testStore)); // durable w/ limit 2
- dq3->configure(args2);
- mbdFanout3.bind(dq3, "", 0);
- Queue::shared_ptr dq4(new Queue("dq4", true, &testStore)); // durable w/ limit 1
- dq4->configure(args1);
- mbdFanout3.bind(dq4, "", 0);
- Queue::shared_ptr dq5(new Queue("dq5", true, &testStore)); // durable no limit
- dq5->configure(args0);
- mbdFanout3.bind(dq5, "", 0);
-
- intrusive_ptr<Message> msg11 = mkMsg(testStore, std::string(5, 'X')); // transient w/ content
- DeliverableMessage dmsg11(msg11);
- mbdFanout3.route(dmsg11, "", 0); // Brings queues 3 and 4 to capacity limit
- msg11->tryReleaseContent();
- BOOST_CHECK_EQUAL(msg11->isContentReleased(), false);
- BOOST_CHECK_EQUAL(1u, dq3->getMessageCount());
- BOOST_CHECK_EQUAL(1u, dq4->getMessageCount());
- BOOST_CHECK_EQUAL(1u, dq5->getMessageCount());
-
- intrusive_ptr<Message> msg12 = mkMsg(testStore, std::string(5, 'X')); // transient w/ content
- DeliverableMessage dmsg12(msg12);
- mbdFanout3.route(dmsg12, "", 0);
- msg12->tryReleaseContent();
- BOOST_CHECK_EQUAL(msg12->isContentReleased(), false); // XXXX - consequence of transient msg multi-queue ftd policy-handling limitations, fix in broker at some point!
- BOOST_CHECK_EQUAL(2u, dq3->getMessageCount());
- BOOST_CHECK_EQUAL(2u, dq4->getMessageCount());
- BOOST_CHECK_EQUAL(2u, dq5->getMessageCount());
-
- intrusive_ptr<Message> msg13 = mkMsg(testStore, std::string(5, 'X'), true); // durable w/ content
- DeliverableMessage dmsg13(msg13);
- mbdFanout3.route(dmsg13, "", 0);
- msg13->tryReleaseContent();
- BOOST_CHECK_EQUAL(msg13->isContentReleased(), true);
- BOOST_CHECK_EQUAL(3u, dq3->getMessageCount());
- BOOST_CHECK_EQUAL(3u, dq4->getMessageCount());
- BOOST_CHECK_EQUAL(3u, dq5->getMessageCount());
-
- intrusive_ptr<Message> msg14 = mkMsg(testStore); // transient no content
- DeliverableMessage dmsg14(msg14);
- mbdFanout3.route(dmsg14, "", 0);
- msg14->tryReleaseContent();
- BOOST_CHECK_EQUAL(msg14->isContentReleased(), false); // XXXX - consequence of transient msg multi-queue ftd policy-handling limitations, fix in broker at some point!
- BOOST_CHECK_EQUAL(4u, dq3->getMessageCount());
- BOOST_CHECK_EQUAL(4u, dq4->getMessageCount());
- BOOST_CHECK_EQUAL(4u, dq5->getMessageCount());
-
- intrusive_ptr<Message> msg15 = mkMsg(testStore, "", true); // durable no content
- DeliverableMessage dmsg15(msg15);
- mbdFanout3.route(dmsg15, "", 0);
- msg15->tryReleaseContent();
- BOOST_CHECK_EQUAL(msg15->isContentReleased(), true);
- BOOST_CHECK_EQUAL(5u, dq3->getMessageCount());
- BOOST_CHECK_EQUAL(5u, dq4->getMessageCount());
- BOOST_CHECK_EQUAL(5u, dq5->getMessageCount());
-
- // Bind a transient queue, this should block the release of any further messages.
- // Note: this will result in a violation of the count policy of dq3 and dq4 - but this
- // is expected until a better overall multi-queue design is implemented. Similarly
- // for the other tests in this section.
-
- Queue::shared_ptr tq6(new Queue("tq6", true)); // transient no limit
- tq6->configure(args0);
- mbdFanout3.bind(tq6, "", 0);
-
- intrusive_ptr<Message> msg16 = mkMsg(testStore, std::string(5, 'X')); // transient w/ content
- DeliverableMessage dmsg16(msg16);
- mbdFanout3.route(dmsg16, "", 0);
- msg16->tryReleaseContent();
- BOOST_CHECK_EQUAL(msg16->isContentReleased(), false);
- BOOST_CHECK_EQUAL(6u, dq3->getMessageCount());
- BOOST_CHECK_EQUAL(6u, dq4->getMessageCount());
- BOOST_CHECK_EQUAL(6u, dq5->getMessageCount());
-
- intrusive_ptr<Message> msg17 = mkMsg(testStore, std::string(5, 'X'), true); // durable w/ content
- DeliverableMessage dmsg17(msg17);
- mbdFanout3.route(dmsg17, "", 0);
- msg17->tryReleaseContent();
- BOOST_CHECK_EQUAL(msg17->isContentReleased(), false);
- BOOST_CHECK_EQUAL(7u, dq3->getMessageCount());
- BOOST_CHECK_EQUAL(7u, dq4->getMessageCount());
- BOOST_CHECK_EQUAL(7u, dq5->getMessageCount());
-
- intrusive_ptr<Message> msg18 = mkMsg(testStore); // transient no content
- DeliverableMessage dmsg18(msg18);
- mbdFanout3.route(dmsg18, "", 0);
- msg18->tryReleaseContent();
- BOOST_CHECK_EQUAL(msg18->isContentReleased(), false);
- BOOST_CHECK_EQUAL(8u, dq3->getMessageCount());
- BOOST_CHECK_EQUAL(8u, dq4->getMessageCount());
- BOOST_CHECK_EQUAL(8u, dq5->getMessageCount());
-
- intrusive_ptr<Message> msg19 = mkMsg(testStore, "", true); // durable no content
- DeliverableMessage dmsg19(msg19);
- mbdFanout3.route(dmsg19, "", 0);
- msg19->tryReleaseContent();
- BOOST_CHECK_EQUAL(msg19->isContentReleased(), false);
- BOOST_CHECK_EQUAL(9u, dq3->getMessageCount());
- BOOST_CHECK_EQUAL(9u, dq4->getMessageCount());
- BOOST_CHECK_EQUAL(9u, dq5->getMessageCount());
-
-
- // --- Fanout exchange bound to multiple durable and transient queues ----------------------------------------------
-
- FanOutExchange mbmFanout4("mbmFanout4", false, args0); // multiple bindings to durable/transient queues
- Queue::shared_ptr dq7(new Queue("dq7", true, &testStore)); // durable no limit
- dq7->configure(args0);
- mbmFanout4.bind(dq7, "", 0);
- Queue::shared_ptr dq8(new Queue("dq8", true, &testStore)); // durable w/ limit
- dq8->configure(args1);
- mbmFanout4.bind(dq8, "", 0);
- Queue::shared_ptr tq9(new Queue("tq9", true)); // transient no limit
- tq9->configure(args0);
- mbmFanout4.bind(tq9, "", 0);
-
- intrusive_ptr<Message> msg20 = mkMsg(testStore, std::string(5, 'X')); // transient w/ content
- DeliverableMessage dmsg20(msg20);
- mbmFanout4.route(dmsg20, "", 0); // Brings queue 7 to capacity limit
- msg20->tryReleaseContent();
- BOOST_CHECK_EQUAL(msg20->isContentReleased(), false);
- BOOST_CHECK_EQUAL(1u, dq7->getMessageCount());
- BOOST_CHECK_EQUAL(1u, dq8->getMessageCount());
- BOOST_CHECK_EQUAL(1u, tq9->getMessageCount());
-
- intrusive_ptr<Message> msg21 = mkMsg(testStore, std::string(5, 'X')); // transient w/ content
- DeliverableMessage dmsg21(msg21);
- mbmFanout4.route(dmsg21, "", 0);
- msg21->tryReleaseContent();
- BOOST_CHECK_EQUAL(msg21->isContentReleased(), false);
- BOOST_CHECK_EQUAL(2u, dq7->getMessageCount()); // over limit
- BOOST_CHECK_EQUAL(2u, dq8->getMessageCount());
- BOOST_CHECK_EQUAL(2u, tq9->getMessageCount());
-
- intrusive_ptr<Message> msg22 = mkMsg(testStore, std::string(5, 'X'), true); // durable w/ content
- DeliverableMessage dmsg22(msg22);
- mbmFanout4.route(dmsg22, "", 0);
- msg22->tryReleaseContent();
- BOOST_CHECK_EQUAL(msg22->isContentReleased(), false);
- BOOST_CHECK_EQUAL(3u, dq7->getMessageCount()); // over limit
- BOOST_CHECK_EQUAL(3u, dq8->getMessageCount()); // over limit
- BOOST_CHECK_EQUAL(3u, tq9->getMessageCount());
-
- intrusive_ptr<Message> msg23 = mkMsg(testStore); // transient no content
- DeliverableMessage dmsg23(msg23);
- mbmFanout4.route(dmsg23, "", 0);
- msg23->tryReleaseContent();
- BOOST_CHECK_EQUAL(msg23->isContentReleased(), false);
- BOOST_CHECK_EQUAL(4u, dq7->getMessageCount()); // over limit
- BOOST_CHECK_EQUAL(4u, dq8->getMessageCount()); // over limit
- BOOST_CHECK_EQUAL(4u, tq9->getMessageCount());
-
- intrusive_ptr<Message> msg24 = mkMsg(testStore, "", true); // durable no content
- DeliverableMessage dmsg24(msg24);
- mbmFanout4.route(dmsg24, "", 0);
- msg24->tryReleaseContent();
- BOOST_CHECK_EQUAL(msg24->isContentReleased(), false);
- BOOST_CHECK_EQUAL(5u, dq7->getMessageCount()); // over limit
- BOOST_CHECK_EQUAL(5u, dq8->getMessageCount()); // over limit
- BOOST_CHECK_EQUAL(5u, tq9->getMessageCount());
-}
-
-
-QPID_AUTO_TEST_SUITE_END()
-
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/README.txt b/cpp/src/tests/README.txt
deleted file mode 100644
index 0f4edee493..0000000000
--- a/cpp/src/tests/README.txt
+++ /dev/null
@@ -1,54 +0,0 @@
-= Running Qpid C++ tests =
-
-General philosophy is that "make check" run all tests by default, but
-developers can run tests selectively as explained below.
-
-== Valgrind ==
-
-By default we run tests under valgrind to detect memory errors if valgrind
-is present. ./configure --disable-valgrind will disable it.
-
-Default valgrind options are specified in .valgrindrc-default, which a
-checked-in file. The actual options used are in .valgrindrc which is a
-local file. Normally it is a copy of valgrindrc-default but you can
-modify at will.
-
-Supressed errors are listed in .valgrind.supp. If you want to change
-suppressions for local testing, just modify .valgrindrc to point to a
-different file. Do NOT add suppressions to .valgrindrc.supp unless
-they are known problems outside of Qpid that can't reasonably be
-worked around in Qpid.
-
-
-== Unit Tests ==
-Unit tests use the boost test framework, and are compiled to rogram
- unit_test
-There are several options to control how test results are displayed,
-see
- http://www.boost.org/doc/libs/1_35_0/libs/test/doc/components/utf/parameters/index.html
-
-NOTE: some unit tests are written as CppUnit plug-ins, we are moving away
-from CppUnit so new tests should use the boost framework.
-
-CppUnit tests are run by the script run-unit-tests.
-
-== System Tests ==
-
-System tests are self contained AMQP client executables or scripts.
-They are listed in the TESTS make variable, which can be over-ridden.
-
-The ./start_broker "test" launches the broker, ./stop_broker" stops it.
-Tests in between assume the broker is running.
-
-./python_tests: runs ../python/run_tests. This is the main set of
-system testss for the broker.
-
-Other C++ client test executables and scripts under client/test are
-system tests for the client.
-
-By setting TESTS in a make command you can run a different subset of tests
-against an already-running broker.
-
-
-
-
diff --git a/cpp/src/tests/RangeSet.cpp b/cpp/src/tests/RangeSet.cpp
deleted file mode 100644
index db3a964086..0000000000
--- a/cpp/src/tests/RangeSet.cpp
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- *
- * 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 "qpid/RangeSet.h"
-
-using namespace std;
-using namespace qpid;
-
-namespace qpid {
-namespace tests {
-
-QPID_AUTO_TEST_SUITE(RangeSetTestSuite)
-
-typedef qpid::Range<int> TestRange;
-typedef qpid::RangeSet<int> TestRangeSet;
-
-QPID_AUTO_TEST_CASE(testEmptyRange) {
- TestRange r;
- BOOST_CHECK(r.empty());
- BOOST_CHECK(!r.contains(0));
- // BOOST_CHECK(r.contiguous(0));
-}
-
-QPID_AUTO_TEST_CASE(testRangeSetAddPoint) {
- TestRangeSet r;
- BOOST_CHECK(r.empty());
- r += 3;
- BOOST_CHECK_MESSAGE(r.contains(3), r);
- BOOST_CHECK_MESSAGE(r.contains(TestRange(3,4)), r);
- BOOST_CHECK(!r.empty());
- r += 5;
- BOOST_CHECK_MESSAGE(r.contains(5), r);
- BOOST_CHECK_MESSAGE(r.contains(TestRange(5,6)), r);
- BOOST_CHECK_MESSAGE(!r.contains(TestRange(3,6)), r);
- r += 4;
- BOOST_CHECK_MESSAGE(r.contains(TestRange(3,6)), r);
-}
-
-QPID_AUTO_TEST_CASE(testRangeSetAddRange) {
- TestRangeSet r;
- r += TestRange(0,3);
- BOOST_CHECK(r.contains(TestRange(0,3)));
- r += TestRange(4,6);
- BOOST_CHECK_MESSAGE(r.contains(TestRange(4,6)), r);
- r += 3;
- BOOST_CHECK_MESSAGE(r.contains(TestRange(0,6)), r);
- BOOST_CHECK(r.front() == 0);
- BOOST_CHECK(r.back() == 6);
-}
-
-QPID_AUTO_TEST_CASE(testRangeSetAddSet) {
- TestRangeSet r;
- TestRangeSet s = TestRangeSet(0,3)+TestRange(5,10);
- r += s;
- BOOST_CHECK_EQUAL(r,s);
- r += TestRangeSet(3,5) + TestRange(7,12) + 15;
- BOOST_CHECK_EQUAL(r, TestRangeSet(0,12) + 15);
-
- r.clear();
- BOOST_CHECK(r.empty());
- r += TestRange::makeClosed(6,10);
- BOOST_CHECK_EQUAL(r, TestRangeSet(6,11));
- r += TestRangeSet(2,6)+8;
- BOOST_CHECK_EQUAL(r, TestRangeSet(2,11));
-}
-
-QPID_AUTO_TEST_CASE(testRangeSetIterate) {
- TestRangeSet r;
- (((r += 1) += 10) += TestRange(4,7)) += 2;
- BOOST_MESSAGE(r);
- std::vector<int> actual;
- std::copy(r.begin(), r.end(), std::back_inserter(actual));
- std::vector<int> expect = boost::assign::list_of(1)(2)(4)(5)(6)(10);
- BOOST_CHECK_EQUAL(expect, actual);
-}
-
-QPID_AUTO_TEST_CASE(testRangeSetRemove) {
- // points
- BOOST_CHECK_EQUAL(TestRangeSet(0,5)-3, TestRangeSet(0,3)+TestRange(4,5));
- BOOST_CHECK_EQUAL(TestRangeSet(1,5)-5, TestRangeSet(1,5));
- BOOST_CHECK_EQUAL(TestRangeSet(1,5)-0, TestRangeSet(1,5));
-
- TestRangeSet r(TestRangeSet(0,5)+TestRange(10,15)+TestRange(20,25));
-
- // TestRanges
- BOOST_CHECK_EQUAL(r-TestRange(0,5), TestRangeSet(10,15)+TestRange(20,25));
- BOOST_CHECK_EQUAL(r-TestRange(10,15), TestRangeSet(0,5)+TestRange(20,25));
- BOOST_CHECK_EQUAL(r-TestRange(20,25), TestRangeSet(0,5)+TestRange(10,15));
-
- BOOST_CHECK_EQUAL(r-TestRange(-5, 30), TestRangeSet());
-
- BOOST_CHECK_EQUAL(r-TestRange(-5, 7), TestRangeSet(10,15)+TestRange(20,25));
- BOOST_CHECK_EQUAL(r-TestRange(8,19), TestRangeSet(0,5)+TestRange(20,25));
- BOOST_CHECK_EQUAL(r-TestRange(17,30), TestRangeSet(0,5)+TestRange(10,15));
- BOOST_CHECK_EQUAL(r-TestRange(17,30), TestRangeSet(0,5)+TestRange(10,15));
-
- BOOST_CHECK_EQUAL(r-TestRange(-5, 5), TestRangeSet(10,15)+TestRange(20,25));
- BOOST_CHECK_EQUAL(r-TestRange(10,19), TestRangeSet(0,5)+TestRange(20,25));
- BOOST_CHECK_EQUAL(r-TestRange(18,25), TestRangeSet(0,5)+TestRange(10,15));
- BOOST_CHECK_EQUAL(r-TestRange(23,25), TestRangeSet(0,5)+TestRange(10,15)+TestRange(20,23));
-
- BOOST_CHECK_EQUAL(r-TestRange(-3, 3), TestRangeSet(3,5)+TestRange(10,15)+TestRange(20,25));
- BOOST_CHECK_EQUAL(r-TestRange(3, 7), TestRangeSet(0,2)+TestRange(10,15)+TestRange(20,25));
- BOOST_CHECK_EQUAL(r-TestRange(3, 12), TestRangeSet(0,3)+TestRange(12,15)+TestRange(20,25));
- BOOST_CHECK_EQUAL(r-TestRange(3, 22), TestRangeSet(12,15)+TestRange(22,25));
- BOOST_CHECK_EQUAL(r-TestRange(12, 22), TestRangeSet(0,5)+TestRange(10,11)+TestRange(22,25));
-
- // Sets
- BOOST_CHECK_EQUAL(r-(TestRangeSet(-1,6)+TestRange(11,14)+TestRange(23,25)),
- TestRangeSet(10,11)+TestRange(14,15)+TestRange(20,23));
-}
-
-QPID_AUTO_TEST_CASE(testRangeContaining) {
- TestRangeSet r;
- (((r += 1) += TestRange(3,5)) += 7);
- BOOST_CHECK_EQUAL(r.rangeContaining(0), TestRange(0,0));
- BOOST_CHECK_EQUAL(r.rangeContaining(1), TestRange(1,2));
- BOOST_CHECK_EQUAL(r.rangeContaining(2), TestRange(2,2));
- BOOST_CHECK_EQUAL(r.rangeContaining(3), TestRange(3,5));
- BOOST_CHECK_EQUAL(r.rangeContaining(4), TestRange(3,5));
- BOOST_CHECK_EQUAL(r.rangeContaining(5), TestRange(5,5));
- BOOST_CHECK_EQUAL(r.rangeContaining(6), TestRange(6,6));
- BOOST_CHECK_EQUAL(r.rangeContaining(7), TestRange(7,8));
-}
-
-QPID_AUTO_TEST_SUITE_END()
-
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/RateFlowcontrolTest.cpp b/cpp/src/tests/RateFlowcontrolTest.cpp
deleted file mode 100644
index 80ad06af8c..0000000000
--- a/cpp/src/tests/RateFlowcontrolTest.cpp
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- *
- * 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.
- *
- */
-
-#include "unit_test.h"
-
-#include "qpid/broker/RateFlowcontrol.h"
-#include "qpid/sys/Time.h"
-
-using namespace qpid::broker;
-using namespace qpid::sys;
-
-namespace qpid {
-namespace tests {
-
-QPID_AUTO_TEST_SUITE(RateFlowcontrolTestSuite)
-
-QPID_AUTO_TEST_CASE(RateFlowcontrolTest)
-{
- // BOOST_CHECK(predicate);
- // BOOST_CHECK_EQUAL(a, b);
-
- RateFlowcontrol fc(100);
- AbsTime n=AbsTime::now();
-
- BOOST_CHECK_EQUAL( fc.receivedMessage(n, 0), 0U );
-
- fc.sentCredit(n, 0);
-
- BOOST_CHECK_EQUAL( fc.receivedMessage(n, 0), 0U );
- fc.sentCredit(n, 50);
-
- Duration d=250*TIME_MSEC;
-
- n = AbsTime(n,d);
- BOOST_CHECK_EQUAL( fc.receivedMessage(n, 25), 0U );
- BOOST_CHECK_EQUAL( fc.availableCredit(n), 25U );
-
- n = AbsTime(n,d);
- BOOST_CHECK_EQUAL( fc.receivedMessage(n, 23), 48U );
- BOOST_CHECK_EQUAL( fc.availableCredit(n), 48U );
- fc.sentCredit(n, 48);
- BOOST_CHECK_EQUAL( fc.receivedMessage(n, 50), 0U);
- BOOST_CHECK(fc.flowStopped());
-
- n = AbsTime(n,d);
- BOOST_CHECK_EQUAL( fc.receivedMessage(n, 0), 25U);
- n = AbsTime(n,d);
- BOOST_CHECK_EQUAL( fc.receivedMessage(n, 0), 50U);
-}
-
-QPID_AUTO_TEST_SUITE_END()
-
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/RefCounted.cpp b/cpp/src/tests/RefCounted.cpp
deleted file mode 100644
index e4c1da5696..0000000000
--- a/cpp/src/tests/RefCounted.cpp
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- *
- * 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 "qpid/RefCounted.h"
-#include <boost/intrusive_ptr.hpp>
-
-#include "unit_test.h"
-
-QPID_AUTO_TEST_SUITE(RefCountedTestSuiteTestSuite)
-
-using boost::intrusive_ptr;
-using namespace std;
-using namespace qpid;
-
-namespace qpid {
-namespace tests {
-
-struct CountMe : public RefCounted {
- static int instances;
- CountMe() { ++instances; }
- ~CountMe() { --instances; }
-};
-
-int CountMe::instances=0;
-
-QPID_AUTO_TEST_CASE(testRefCounted) {
- BOOST_CHECK_EQUAL(0, CountMe::instances);
- intrusive_ptr<CountMe> p(new CountMe());
- BOOST_CHECK_EQUAL(1, CountMe::instances);
- intrusive_ptr<CountMe> q(p);
- BOOST_CHECK_EQUAL(1, CountMe::instances);
- q=0;
- BOOST_CHECK_EQUAL(1, CountMe::instances);
- p=0;
- BOOST_CHECK_EQUAL(0, CountMe::instances);
-}
-
-QPID_AUTO_TEST_SUITE_END()
-
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/ReplicationTest.cpp b/cpp/src/tests/ReplicationTest.cpp
deleted file mode 100644
index 7310a3fe20..0000000000
--- a/cpp/src/tests/ReplicationTest.cpp
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- *
- * 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.
- *
- */
-#include "unit_test.h"
-#include "test_tools.h"
-#include "config.h"
-#include "BrokerFixture.h"
-
-#include "qpid/Plugin.h"
-#include "qpid/broker/Broker.h"
-#include "qpid/client/QueueOptions.h"
-#include "qpid/framing/reply_exceptions.h"
-#include "qpid/framing/SequenceNumber.h"
-#include "qpid/replication/constants.h"
-#include "qpid/sys/Shlib.h"
-
-#include <string>
-#include <sstream>
-#include <vector>
-
-#include <boost/assign.hpp>
-#include <boost/bind.hpp>
-
-using namespace qpid::client;
-using namespace qpid::framing;
-using namespace qpid::replication::constants;
-using boost::assign::list_of;
-
-namespace qpid {
-namespace tests {
-
-QPID_AUTO_TEST_SUITE(ReplicationTestSuite)
-
-// FIXME aconway 2009-11-26: clean this up.
-// The CMake-based build passes in the module suffix; if it's not there, this
-// is a Linux/UNIX libtool-based build.
-#if defined (QPID_MODULE_PREFIX) && defined (QPID_MODULE_SUFFIX)
-static const char *default_shlib =
- QPID_MODULE_PREFIX "replicating_listener" QPID_MODULE_POSTFIX QPID_MODULE_SUFFIX;
-#else
-static const char *default_shlib = ".libs/replicating_listener.so";
-#endif
-qpid::sys::Shlib plugin(getLibPath("REPLICATING_LISTENER_LIB", default_shlib));
-
-qpid::broker::Broker::Options getBrokerOpts(const std::vector<std::string>& args)
-{
- std::vector<const char*> argv(args.size());
- transform(args.begin(), args.end(), argv.begin(), boost::bind(&string::c_str, _1));
-
- qpid::broker::Broker::Options opts;
- qpid::Plugin::addOptions(opts);
- opts.parse(argv.size(), &argv[0], "", true);
- return opts;
-}
-
-QPID_AUTO_TEST_CASE(testReplicationExchange)
-{
- qpid::broker::Broker::Options brokerOpts(getBrokerOpts(list_of<string>("qpidd")
- ("--replication-exchange-name=qpid.replication")));
- ProxySessionFixture f(brokerOpts);
-
-
- std::string dataQ("queue-1");
- std::string eventQ("event-queue-1");
- std::string dataQ2("queue-2");
- std::string eventQ2("event-queue-2");
- FieldTable eventQopts;
- eventQopts.setString("qpid.insert_sequence_numbers", REPLICATION_EVENT_SEQNO);
-
- f.session.queueDeclare(arg::queue=eventQ, arg::exclusive=true, arg::autoDelete=true, arg::arguments=eventQopts);
- f.session.exchangeBind(arg::exchange="qpid.replication", arg::queue=eventQ, arg::bindingKey=dataQ);
-
- f.session.queueDeclare(arg::queue=eventQ2, arg::exclusive=true, arg::autoDelete=true, arg::arguments=eventQopts);
- f.session.exchangeBind(arg::exchange="qpid.replication", arg::queue=eventQ2, arg::bindingKey=dataQ2);
-
- QueueOptions args;
- args.enableQueueEvents(false);
- f.session.queueDeclare(arg::queue=dataQ, arg::exclusive=true, arg::autoDelete=true, arg::arguments=args);
- f.session.queueDeclare(arg::queue=dataQ2, arg::exclusive=true, arg::autoDelete=true, arg::arguments=args);
- for (int i = 0; i < 10; i++) {
- f.session.messageTransfer(arg::content=Message((boost::format("%1%_%2%") % "Message" % (i+1)).str(), dataQ));
- f.session.messageTransfer(arg::content=Message((boost::format("%1%_%2%") % "Message" % (i+1)).str(), dataQ2));
- }
- Message msg;
- LocalQueue incoming;
- Subscription sub = f.subs.subscribe(incoming, dataQ);
- for (int i = 0; i < 10; i++) {
- BOOST_CHECK(incoming.get(msg, qpid::sys::TIME_SEC));
- BOOST_CHECK_EQUAL((boost::format("%1%_%2%") % "Message" % (i+1)).str(), msg.getData());
- }
- BOOST_CHECK(!f.subs.get(msg, dataQ));
-
- sub.cancel();
- sub = f.subs.subscribe(incoming, eventQ);
- //check that we received enqueue events for first queue:
- for (int i = 0; i < 10; i++) {
- BOOST_CHECK(incoming.get(msg, qpid::sys::TIME_SEC));
- BOOST_CHECK_EQUAL(msg.getHeaders().getAsString(REPLICATION_TARGET_QUEUE), dataQ);
- BOOST_CHECK_EQUAL(msg.getHeaders().getAsInt(REPLICATION_EVENT_TYPE), ENQUEUE);
- BOOST_CHECK_EQUAL(msg.getHeaders().getAsInt64(REPLICATION_EVENT_SEQNO), (i+1));
- BOOST_CHECK_EQUAL((boost::format("%1%_%2%") % "Message" % (i+1)).str(), msg.getData());
- }
- //check that we received dequeue events for first queue:
- for (int i = 0; i < 10; i++) {
- BOOST_CHECK(incoming.get(msg, qpid::sys::TIME_SEC));
- BOOST_CHECK_EQUAL(msg.getHeaders().getAsString(REPLICATION_TARGET_QUEUE), dataQ);
- BOOST_CHECK_EQUAL(msg.getHeaders().getAsInt(REPLICATION_EVENT_TYPE), DEQUEUE);
- BOOST_CHECK_EQUAL(msg.getHeaders().getAsInt(DEQUEUED_MESSAGE_POSITION), (i+1));
- BOOST_CHECK_EQUAL(msg.getHeaders().getAsInt64(REPLICATION_EVENT_SEQNO), (i+11));
- }
-
- sub.cancel();
- sub = f.subs.subscribe(incoming, eventQ2);
- //check that we received enqueue events for second queue:
- for (int i = 0; i < 10; i++) {
- BOOST_CHECK(incoming.get(msg, qpid::sys::TIME_SEC));
- BOOST_CHECK_EQUAL(msg.getHeaders().getAsString(REPLICATION_TARGET_QUEUE), dataQ2);
- BOOST_CHECK_EQUAL(msg.getHeaders().getAsInt(REPLICATION_EVENT_TYPE), ENQUEUE);
- BOOST_CHECK_EQUAL(msg.getHeaders().getAsInt64(REPLICATION_EVENT_SEQNO), (i+1));
- BOOST_CHECK_EQUAL((boost::format("%1%_%2%") % "Message" % (i+1)).str(), msg.getData());
- }
-}
-
-
-QPID_AUTO_TEST_SUITE_END()
-
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/RetryList.cpp b/cpp/src/tests/RetryList.cpp
deleted file mode 100644
index 50cd5edfe8..0000000000
--- a/cpp/src/tests/RetryList.cpp
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- *
- * 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 "qpid/broker/RetryList.h"
-
-using namespace qpid;
-using namespace qpid::broker;
-
-namespace qpid {
-namespace tests {
-
-QPID_AUTO_TEST_SUITE(RetryListTestSuite)
-
-struct RetryListFixture
-{
- RetryList list;
- std::vector<Url> urls;
- std::vector<Address> expected;
-
- void addUrl(const std::string& s)
- {
- urls.push_back(Url(s));
- }
-
- void addExpectation(const std::string& host, uint16_t port)
- {
- expected.push_back(Address("tcp", host, port));
- }
-
- void check()
- {
- list.reset(urls);
- for (int t = 0; t < 2; t++) {
- Address next;
- for (std::vector<Address>::const_iterator i = expected.begin(); i != expected.end(); ++i) {
- BOOST_CHECK(list.next(next));
- BOOST_CHECK_EQUAL(i->host, next.host);
- BOOST_CHECK_EQUAL(i->port, next.port);
- }
- BOOST_CHECK(!list.next(next));
- }
- }
-};
-
-QPID_AUTO_TEST_CASE(testWithSingleAddress)
-{
- RetryListFixture test;
- test.addUrl("amqp:host:5673");
- test.addExpectation("host", 5673);
- test.check();
-}
-
-QPID_AUTO_TEST_CASE(testWithSingleUrlOfMultipleAddresses)
-{
- RetryListFixture test;
- test.addUrl("amqp:host1,host2:2222,tcp:host3:5673,host4:1");
-
- test.addExpectation("host1", 5672);
- test.addExpectation("host2", 2222);
- test.addExpectation("host3", 5673);
- test.addExpectation("host4", 1);
-
- test.check();
-}
-
-QPID_AUTO_TEST_CASE(testWithMultipleUrlsOfMultipleAddresses)
-{
- RetryListFixture test;
- test.addUrl("amqp:my-host");
- test.addUrl("amqp:host1:6666,host2:2222,tcp:host3:5673,host4:1");
- test.addUrl("amqp:host5,host6:2222,tcp:host7:5673");
-
- test.addExpectation("my-host", 5672);
- test.addExpectation("host1", 6666);
- test.addExpectation("host2", 2222);
- test.addExpectation("host3", 5673);
- test.addExpectation("host4", 1);
- test.addExpectation("host5", 5672);
- test.addExpectation("host6", 2222);
- test.addExpectation("host7", 5673);
-
- test.check();
-}
-
-QPID_AUTO_TEST_CASE(testEmptyList)
-{
- RetryListFixture test;
- test.check();
-}
-
-QPID_AUTO_TEST_SUITE_END()
-
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/SequenceNumberTest.cpp b/cpp/src/tests/SequenceNumberTest.cpp
deleted file mode 100644
index f3c934e3ca..0000000000
--- a/cpp/src/tests/SequenceNumberTest.cpp
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
- *
- * 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.
- *
- */
-
-#include "unit_test.h"
-#include <iostream>
-#include "qpid/framing/SequenceNumber.h"
-#include "qpid/framing/SequenceNumberSet.h"
-
-using namespace qpid::framing;
-
-namespace qpid {
-namespace tests {
-
-void checkDifference(SequenceNumber& a, SequenceNumber& b, int gap)
-{
- BOOST_CHECK_EQUAL(gap, a - b);
- BOOST_CHECK_EQUAL(-gap, b - a);
-
- //increment until b wraps around
- for (int i = 0; i < (gap + 2); i++, ++a, ++b) {
- BOOST_CHECK_EQUAL(gap, a - b);
- }
- //keep incrementing until a also wraps around
- for (int i = 0; i < (gap + 2); i++, ++a, ++b) {
- BOOST_CHECK_EQUAL(gap, a - b);
- }
- //let b catch up and overtake
- for (int i = 0; i < (gap*2); i++, ++b) {
- BOOST_CHECK_EQUAL(gap - i, a - b);
- BOOST_CHECK_EQUAL(i - gap, b - a);
- }
-}
-
-void checkComparison(SequenceNumber& a, SequenceNumber& b, int gap)
-{
- //increment until b wraps around
- for (int i = 0; i < (gap + 2); i++) {
- BOOST_CHECK(++a < ++b);//test prefix
- }
- //keep incrementing until a also wraps around
- for (int i = 0; i < (gap + 2); i++) {
- BOOST_CHECK(a++ < b++);//test postfix
- }
- //let a 'catch up'
- for (int i = 0; i < gap; i++) {
- a++;
- }
- BOOST_CHECK(a == b);
- BOOST_CHECK(++a > b);
-}
-
-
-QPID_AUTO_TEST_SUITE(SequenceNumberTestSuite)
-
-QPID_AUTO_TEST_CASE(testIncrementPostfix)
-{
- SequenceNumber a;
- SequenceNumber b;
- BOOST_CHECK(!(a > b));
- BOOST_CHECK(!(b < a));
- BOOST_CHECK(a == b);
-
- SequenceNumber c = a++;
- BOOST_CHECK(a > b);
- BOOST_CHECK(b < a);
- BOOST_CHECK(a != b);
- BOOST_CHECK(c < a);
- BOOST_CHECK(a != c);
-
- b++;
- BOOST_CHECK(!(a > b));
- BOOST_CHECK(!(b < a));
- BOOST_CHECK(a == b);
- BOOST_CHECK(c < b);
- BOOST_CHECK(b != c);
-}
-
-QPID_AUTO_TEST_CASE(testIncrementPrefix)
-{
- SequenceNumber a;
- SequenceNumber b;
- BOOST_CHECK(!(a > b));
- BOOST_CHECK(!(b < a));
- BOOST_CHECK(a == b);
-
- SequenceNumber c = ++a;
- BOOST_CHECK(a > b);
- BOOST_CHECK(b < a);
- BOOST_CHECK(a != b);
- BOOST_CHECK(a == c);
-
- ++b;
- BOOST_CHECK(!(a > b));
- BOOST_CHECK(!(b < a));
- BOOST_CHECK(a == b);
-}
-
-QPID_AUTO_TEST_CASE(testWrapAround)
-{
- const uint32_t max = 0xFFFFFFFF;
- SequenceNumber a(max - 10);
- SequenceNumber b(max - 5);
- checkComparison(a, b, 5);
-
- const uint32_t max_signed = 0x7FFFFFFF;
- SequenceNumber c(max_signed - 10);
- SequenceNumber d(max_signed - 5);
- checkComparison(c, d, 5);
-}
-
-QPID_AUTO_TEST_CASE(testCondense)
-{
- SequenceNumberSet set;
- for (uint i = 0; i < 6; i++) {
- set.push_back(SequenceNumber(i));
- }
- set.push_back(SequenceNumber(7));
- for (uint i = 9; i < 13; i++) {
- set.push_back(SequenceNumber(i));
- }
- set.push_back(SequenceNumber(13));
- SequenceNumberSet actual = set.condense();
-
- SequenceNumberSet expected;
- expected.addRange(SequenceNumber(0), SequenceNumber(5));
- expected.addRange(SequenceNumber(7), SequenceNumber(7));
- expected.addRange(SequenceNumber(9), SequenceNumber(13));
- BOOST_CHECK_EQUAL(expected, actual);
-}
-
-QPID_AUTO_TEST_CASE(testCondenseSingleRange)
-{
- SequenceNumberSet set;
- for (uint i = 0; i < 6; i++) {
- set.push_back(SequenceNumber(i));
- }
- SequenceNumberSet actual = set.condense();
-
- SequenceNumberSet expected;
- expected.addRange(SequenceNumber(0), SequenceNumber(5));
- BOOST_CHECK_EQUAL(expected, actual);
-}
-
-QPID_AUTO_TEST_CASE(testCondenseSingleItem)
-{
- SequenceNumberSet set;
- set.push_back(SequenceNumber(1));
- SequenceNumberSet actual = set.condense();
-
- SequenceNumberSet expected;
- expected.addRange(SequenceNumber(1), SequenceNumber(1));
- BOOST_CHECK_EQUAL(expected, actual);
-}
-
-QPID_AUTO_TEST_CASE(testDifference)
-{
- SequenceNumber a;
- SequenceNumber b;
-
- for (int i = 0; i < 10; i++, ++a) {
- BOOST_CHECK_EQUAL(i, a - b);
- BOOST_CHECK_EQUAL(-i, b - a);
- }
-
- b = a;
-
- for (int i = 0; i < 10; i++, ++b) {
- BOOST_CHECK_EQUAL(-i, a - b);
- BOOST_CHECK_EQUAL(i, b - a);
- }
-}
-
-QPID_AUTO_TEST_CASE(testDifferenceWithWrapAround1)
-{
- const uint32_t max = 0xFFFFFFFF;
- SequenceNumber a(max - 5);
- SequenceNumber b(max - 10);
- checkDifference(a, b, 5);
-}
-
-QPID_AUTO_TEST_CASE(testDifferenceWithWrapAround2)
-{
- const uint32_t max_signed = 0x7FFFFFFF;
- SequenceNumber c(max_signed - 5);
- SequenceNumber d(max_signed - 10);
- checkDifference(c, d, 5);
-}
-
-QPID_AUTO_TEST_SUITE_END()
-
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/SequenceSet.cpp b/cpp/src/tests/SequenceSet.cpp
deleted file mode 100644
index bc0a8ea509..0000000000
--- a/cpp/src/tests/SequenceSet.cpp
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- *
- * 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 "qpid/framing/SequenceSet.h"
-#include "unit_test.h"
-#include <list>
-
-namespace qpid {
-namespace tests {
-
-QPID_AUTO_TEST_SUITE(SequenceSetTestSuite)
-
-using namespace qpid::framing;
-
-struct RangeExpectations
-{
- typedef std::pair<SequenceNumber, SequenceNumber> Range;
- typedef std::list<Range> Ranges;
-
- Ranges ranges;
-
- RangeExpectations& expect(const SequenceNumber& start, const SequenceNumber& end) {
- ranges.push_back(Range(start, end));
- return *this;
- }
-
- void operator()(const SequenceNumber& start, const SequenceNumber& end) {
- BOOST_CHECK(!ranges.empty());
- if (!ranges.empty()) {
- BOOST_CHECK_EQUAL(start, ranges.front().first);
- BOOST_CHECK_EQUAL(end, ranges.front().second);
- ranges.pop_front();
- }
- }
-
- void check(SequenceSet& set) {
- set.for_each(*this);
- BOOST_CHECK(ranges.empty());
- }
-};
-
-QPID_AUTO_TEST_CASE(testAdd) {
- SequenceSet s;
- s.add(2);
- s.add(8,8);
- s.add(3,5);
-
- for (uint32_t i = 0; i <= 1; i++)
- BOOST_CHECK(!s.contains(i));
-
- for (uint32_t i = 2; i <= 5; i++)
- BOOST_CHECK(s.contains(i));
-
- for (uint32_t i = 6; i <= 7; i++)
- BOOST_CHECK(!s.contains(i));
-
- BOOST_CHECK(s.contains(8));
-
- for (uint32_t i = 9; i <= 10; i++)
- BOOST_CHECK(!s.contains(i));
-
- RangeExpectations().expect(2, 5).expect(8, 8).check(s);
-
- SequenceSet t;
- t.add(6, 10);
- t.add(s);
-
- for (uint32_t i = 0; i <= 1; i++)
- BOOST_CHECK(!t.contains(i));
-
- for (uint32_t i = 2; i <= 10; i++)
- BOOST_CHECK_MESSAGE(t.contains(i), t << " contains " << i);
-
- RangeExpectations().expect(2, 10).check(t);
-}
-
-QPID_AUTO_TEST_CASE(testAdd2) {
- SequenceSet s;
- s.add(7,6);
- s.add(4,4);
- s.add(3,10);
- s.add(2);
- RangeExpectations().expect(2, 10).check(s);
-}
-
-QPID_AUTO_TEST_CASE(testRemove) {
- SequenceSet s;
- SequenceSet t;
- s.add(0, 10);
- t.add(0, 10);
-
- s.remove(7);
- s.remove(3, 5);
- s.remove(9, 10);
-
- t.remove(s);
-
- for (uint32_t i = 0; i <= 2; i++) {
- BOOST_CHECK(s.contains(i));
- BOOST_CHECK(!t.contains(i));
- }
-
- for (uint32_t i = 3; i <= 5; i++) {
- BOOST_CHECK(!s.contains(i));
- BOOST_CHECK(t.contains(i));
- }
-
- BOOST_CHECK(s.contains(6));
- BOOST_CHECK(!t.contains(6));
-
- BOOST_CHECK(!s.contains(7));
- BOOST_CHECK(t.contains(7));
-
- BOOST_CHECK(s.contains(8));
- BOOST_CHECK(!t.contains(8));
-
- for (uint32_t i = 9; i <= 10; i++) {
- BOOST_CHECK(!s.contains(i));
- BOOST_CHECK(t.contains(i));
- }
-
- RangeExpectations().expect(0, 2).expect(6, 6).expect(8, 8).check(s);
- RangeExpectations().expect(3, 5).expect(7, 7).expect(9, 10).check(t);
-}
-
-
-QPID_AUTO_TEST_CASE(testOutOfOrderRemove) {
-
- SequenceSet s(2, 20);
-
- // test remove from middle:
- s.remove(7);
- RangeExpectations().expect(2, 6).expect(8, 20).check(s);
- s.remove(14);
- RangeExpectations().expect(2, 6).expect(8, 13).expect(15, 20).check(s);
-
- // remove from front of subrange:
- s.remove(8, 8);
- RangeExpectations().expect(2, 6).expect(9, 13).expect(15, 20).check(s);
-
- // remove from tail of subrange:
- s.remove(6);
- RangeExpectations().expect(2, 5).expect(9, 13).expect(15, 20).check(s);
-
- // remove across subrange:
- s.remove(13, 15);
- RangeExpectations().expect(2, 5).expect(9, 12).expect(16, 20).check(s);
-
- // remove within subrange:
- s.remove(6, 8);
- RangeExpectations().expect(2, 5).expect(9, 12).expect(16, 20).check(s);
-
- // remove overlap subrange tail:
- s.remove(11, 15);
- RangeExpectations().expect(2, 5).expect(9, 10).expect(16, 20).check(s);
-
- // remove overlap subrange head:
- s.remove(14, 17);
- RangeExpectations().expect(2, 5).expect(9, 10).expect(18, 20).check(s);
-
- // remove overlap sequence tail:
- s.remove(20, 22);
- RangeExpectations().expect(2, 5).expect(9, 10).expect(18, 19).check(s);
-
- // remove overlap sequence head:
- s.remove(1, 3);
- RangeExpectations().expect(4, 5).expect(9, 10).expect(18, 19).check(s);
-}
-
-QPID_AUTO_TEST_SUITE_END()
-
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/SessionState.cpp b/cpp/src/tests/SessionState.cpp
deleted file mode 100644
index 157cabfb63..0000000000
--- a/cpp/src/tests/SessionState.cpp
+++ /dev/null
@@ -1,304 +0,0 @@
-/*
- *
- * 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 "qpid/SessionState.h"
-#include "qpid/Exception.h"
-#include "qpid/framing/MessageTransferBody.h"
-#include "qpid/framing/SessionFlushBody.h"
-
-#include <boost/bind.hpp>
-#include <algorithm>
-#include <functional>
-#include <numeric>
-
-namespace qpid {
-namespace tests {
-
-QPID_AUTO_TEST_SUITE(SessionStateTestSuite)
-
-using namespace std;
-using namespace boost;
-using namespace qpid::framing;
-
-// ================================================================
-// Utility functions.
-
-// Apply f to [begin, end) and accumulate the result
-template <class Iter, class T, class F>
-T applyAccumulate(Iter begin, Iter end, T seed, const F& f) {
- return std::accumulate(begin, end, seed, bind(std::plus<T>(), _1, bind(f, _2)));
-}
-
-// Create a frame with a one-char string.
-AMQFrame& frame(char s) {
- static AMQFrame frame((AMQContentBody(string(&s, 1))));
- return frame;
-}
-
-// Simple string representation of a frame.
-string str(const AMQFrame& f) {
- if (f.getMethod()) return "C"; // Command or Control
- const AMQContentBody* c = dynamic_cast<const AMQContentBody*>(f.getBody());
- if (c) return c->getData(); // Return data for content frames.
- return "H"; // Must be a header.
-}
-// Make a string from a range of frames.
-string str(const boost::iterator_range<vector<AMQFrame>::const_iterator>& frames) {
- string (*strFrame)(const AMQFrame&) = str;
- return applyAccumulate(frames.begin(), frames.end(), string(), ptr_fun(strFrame));
-}
-// Make a transfer command frame.
-AMQFrame transferFrame(bool hasContent) {
- AMQFrame t((MessageTransferBody()));
- t.setFirstFrame(true);
- t.setLastFrame(true);
- t.setFirstSegment(true);
- t.setLastSegment(!hasContent);
- return t;
-}
-// Make a content frame
-AMQFrame contentFrame(string content, bool isLast=true) {
- AMQFrame f((AMQContentBody(content)));
- f.setFirstFrame(true);
- f.setLastFrame(true);
- f.setFirstSegment(false);
- f.setLastSegment(isLast);
- return f;
-}
-AMQFrame contentFrameChar(char content, bool isLast=true) {
- return contentFrame(string(1, content), isLast);
-}
-
-// Send frame & return size of frame.
-size_t send(qpid::SessionState& s, const AMQFrame& f) { s.senderRecord(f); return f.encodedSize(); }
-// Send transfer command with no content.
-size_t transfer0(qpid::SessionState& s) { return send(s, transferFrame(false)); }
-// Send transfer frame with single content frame.
-size_t transfer1(qpid::SessionState& s, string content) {
- return send(s,transferFrame(true)) + send(s,contentFrame(content));
-}
-size_t transfer1Char(qpid::SessionState& s, char content) {
- return transfer1(s, string(1,content));
-}
-
-// Send transfer frame with multiple single-byte content frames.
-size_t transferN(qpid::SessionState& s, string content) {
- size_t size=send(s, transferFrame(!content.empty()));
- if (!content.empty()) {
- char last = content[content.size()-1];
- content.resize(content.size()-1);
- size += applyAccumulate(content.begin(), content.end(), 0,
- bind(&send, ref(s),
- bind(contentFrameChar, _1, false)));
- size += send(s, contentFrameChar(last, true));
- }
- return size;
-}
-
-// Send multiple transfers with single-byte content.
-size_t transfers(qpid::SessionState& s, string content) {
- return applyAccumulate(content.begin(), content.end(), 0,
- bind(transfer1Char, ref(s), _1));
-}
-
-size_t contentFrameSize(size_t n=1) { return AMQFrame(( AMQContentBody())).encodedSize() + n; }
-size_t transferFrameSize() { return AMQFrame((MessageTransferBody())).encodedSize(); }
-
-// ==== qpid::SessionState test classes
-
-using qpid::SessionId;
-using qpid::SessionPoint;
-
-
-QPID_AUTO_TEST_CASE(testSendGetReplyList) {
- qpid::SessionState s;
- s.setTimeout(1);
- s.senderGetCommandPoint();
- transfer1(s, "abc");
- transfers(s, "def");
- transferN(s, "xyz");
- BOOST_CHECK_EQUAL(str(s.senderExpected(SessionPoint(0,0))),"CabcCdCeCfCxyz");
- // Ignore controls.
- s.senderRecord(AMQFrame(new SessionFlushBody()));
- BOOST_CHECK_EQUAL(str(s.senderExpected(SessionPoint(2,0))),"CeCfCxyz");
-}
-
-QPID_AUTO_TEST_CASE(testNeedFlush) {
- qpid::SessionState::Configuration c;
- // sync after 2 1-byte transfers or equivalent bytes.
- c.replayFlushLimit = 2*(transferFrameSize()+contentFrameSize());
- qpid::SessionState s(SessionId(), c);
- s.setTimeout(1);
- s.senderGetCommandPoint();
- transfers(s, "a");
- BOOST_CHECK(!s.senderNeedFlush());
- transfers(s, "b");
- BOOST_CHECK(s.senderNeedFlush());
- s.senderRecordFlush();
- BOOST_CHECK(!s.senderNeedFlush());
- transfers(s, "c");
- BOOST_CHECK(!s.senderNeedFlush());
- transfers(s, "d");
- BOOST_CHECK(s.senderNeedFlush());
- BOOST_CHECK_EQUAL(str(s.senderExpected(SessionPoint())), "CaCbCcCd");
-}
-
-QPID_AUTO_TEST_CASE(testPeerConfirmed) {
- qpid::SessionState::Configuration c;
- // sync after 2 1-byte transfers or equivalent bytes.
- c.replayFlushLimit = 2*(transferFrameSize()+contentFrameSize());
- qpid::SessionState s(SessionId(), c);
- s.setTimeout(1);
- s.senderGetCommandPoint();
- transfers(s, "ab");
- BOOST_CHECK(s.senderNeedFlush());
- transfers(s, "cd");
- BOOST_CHECK_EQUAL(str(s.senderExpected(SessionPoint(0,0))), "CaCbCcCd");
- s.senderConfirmed(SessionPoint(3));
- BOOST_CHECK_EQUAL(str(s.senderExpected(SessionPoint(3,0))), "Cd");
- BOOST_CHECK(!s.senderNeedFlush());
-
- // Multi-frame transfer.
- transfer1(s, "efg");
- transfers(s, "xy");
- BOOST_CHECK_EQUAL(str(s.senderExpected(SessionPoint(3,0))), "CdCefgCxCy");
- BOOST_CHECK(s.senderNeedFlush());
-
- s.senderConfirmed(SessionPoint(4));
- BOOST_CHECK_EQUAL(str(s.senderExpected(SessionPoint(4,0))), "CefgCxCy");
- BOOST_CHECK(s.senderNeedFlush());
-
- s.senderConfirmed(SessionPoint(5));
- BOOST_CHECK_EQUAL(str(s.senderExpected(SessionPoint(5,0))), "CxCy");
- BOOST_CHECK(s.senderNeedFlush());
-
- s.senderConfirmed(SessionPoint(6));
- BOOST_CHECK_EQUAL(str(s.senderExpected(SessionPoint(6,0))), "Cy");
- BOOST_CHECK(!s.senderNeedFlush());
-}
-
-QPID_AUTO_TEST_CASE(testPeerCompleted) {
- qpid::SessionState s;
- s.setTimeout(1);
- s.senderGetCommandPoint();
- // Completion implies confirmation
- transfers(s, "abc");
- BOOST_CHECK_EQUAL(str(s.senderExpected(SessionPoint(0,0))), "CaCbCc");
- SequenceSet set(SequenceSet() + 0 + 1);
- s.senderCompleted(set);
- BOOST_CHECK_EQUAL(str(s.senderExpected(SessionPoint(2,0))), "Cc");
-
- transfers(s, "def");
- // We dont do out-of-order confirmation, so this will only confirm up to 3:
- set = SequenceSet(SequenceSet() + 2 + 3 + 5);
- s.senderCompleted(set);
- BOOST_CHECK_EQUAL(str(s.senderExpected(SessionPoint(4,0))), "CeCf");
-}
-
-QPID_AUTO_TEST_CASE(testReceive) {
- // Advance expected/received correctly
- qpid::SessionState s;
- s.receiverSetCommandPoint(SessionPoint());
- BOOST_CHECK_EQUAL(s.receiverGetExpected(), SessionPoint(0));
- BOOST_CHECK_EQUAL(s.receiverGetReceived(), SessionPoint(0));
-
- BOOST_CHECK(s.receiverRecord(transferFrame(false)));
- BOOST_CHECK_EQUAL(s.receiverGetExpected(), SessionPoint(1));
- BOOST_CHECK_EQUAL(s.receiverGetReceived(), SessionPoint(1));
-
- BOOST_CHECK(s.receiverRecord(transferFrame(true)));
- SessionPoint point = SessionPoint(1, transferFrameSize());
- BOOST_CHECK_EQUAL(s.receiverGetExpected(), point);
- BOOST_CHECK_EQUAL(s.receiverGetReceived(), point);
- BOOST_CHECK(s.receiverRecord(contentFrame("", false)));
- point.offset += contentFrameSize(0);
- BOOST_CHECK_EQUAL(s.receiverGetExpected(), point);
- BOOST_CHECK_EQUAL(s.receiverGetReceived(), point);
- BOOST_CHECK(s.receiverRecord(contentFrame("", true)));
- BOOST_CHECK_EQUAL(s.receiverGetExpected(), SessionPoint(2));
- BOOST_CHECK_EQUAL(s.receiverGetReceived(), SessionPoint(2));
-
- // Idempotence barrier, rewind expected & receive some duplicates.
- s.receiverSetCommandPoint(SessionPoint(1));
- BOOST_CHECK(!s.receiverRecord(transferFrame(false)));
- BOOST_CHECK_EQUAL(s.receiverGetExpected(), SessionPoint(2));
- BOOST_CHECK_EQUAL(s.receiverGetReceived(), SessionPoint(2));
- BOOST_CHECK(s.receiverRecord(transferFrame(false)));
- BOOST_CHECK_EQUAL(s.receiverGetExpected(), SessionPoint(3));
- BOOST_CHECK_EQUAL(s.receiverGetReceived(), SessionPoint(3));
-}
-
-QPID_AUTO_TEST_CASE(testCompleted) {
- // completed & unknownCompleted
- qpid::SessionState s;
- s.receiverSetCommandPoint(SessionPoint());
- s.receiverRecord(transferFrame(false));
- s.receiverRecord(transferFrame(false));
- s.receiverRecord(transferFrame(false));
- s.receiverCompleted(1);
- BOOST_CHECK_EQUAL(s.receiverGetUnknownComplete(), SequenceSet(SequenceSet()+1));
- s.receiverCompleted(0);
- BOOST_CHECK_EQUAL(s.receiverGetUnknownComplete(),
- SequenceSet(SequenceSet() + qpid::Range<SequenceNumber>(0,2)));
- s.receiverKnownCompleted(SequenceSet(SequenceSet()+1));
- BOOST_CHECK_EQUAL(s.receiverGetUnknownComplete(), SequenceSet(SequenceSet()+2));
- // TODO aconway 2008-04-30: missing tests for known-completed.
-}
-
-QPID_AUTO_TEST_CASE(testNeedKnownCompleted) {
- size_t flushInterval= 2*(transferFrameSize()+contentFrameSize())+1;
- qpid::SessionState::Configuration c(flushInterval);
- qpid::SessionState s(qpid::SessionId(), c);
- s.senderGetCommandPoint();
- transfers(s, "a");
- SequenceSet set(SequenceSet() + 0);
- s.senderCompleted(set);
- BOOST_CHECK(!s.senderNeedKnownCompleted());
-
- transfers(s, "b");
- set += 1;
- s.senderCompleted(set);
- BOOST_CHECK(!s.senderNeedKnownCompleted());
-
- transfers(s, "c");
- set += 2;
- s.senderCompleted(set);
- BOOST_CHECK(s.senderNeedKnownCompleted());
- s.senderRecordKnownCompleted();
- BOOST_CHECK(!s.senderNeedKnownCompleted());
-
- transfers(s, "de");
- set += 3;
- set += 4;
- s.senderCompleted(set);
- BOOST_CHECK(!s.senderNeedKnownCompleted());
-
- transfers(s, "f");
- set += 2;
- s.senderCompleted(set);
- BOOST_CHECK(s.senderNeedKnownCompleted());
- s.senderRecordKnownCompleted();
- BOOST_CHECK(!s.senderNeedKnownCompleted());
-}
-
-
-QPID_AUTO_TEST_SUITE_END()
-
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/Shlib.cpp b/cpp/src/tests/Shlib.cpp
deleted file mode 100644
index d8ad4c14d8..0000000000
--- a/cpp/src/tests/Shlib.cpp
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * 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.
- *
- */
-
-#include "test_tools.h"
-#include "config.h"
-#include "qpid/sys/Shlib.h"
-#include "qpid/Exception.h"
-
-#include "unit_test.h"
-
-namespace qpid {
-namespace tests {
-
-QPID_AUTO_TEST_SUITE(ShlibTestSuite)
-
-using namespace qpid::sys;
-typedef void (*CallMe)(int*);
-
-
-QPID_AUTO_TEST_CASE(testShlib) {
- // The CMake-based build passes in the shared lib suffix; if it's not
- // there, this is a Linux/UNIX libtool-based build.
-#if defined (QPID_SHLIB_PREFIX) && defined (QPID_SHLIB_SUFFIX)
- Shlib sh("./" QPID_SHLIB_PREFIX "shlibtest" QPID_SHLIB_POSTFIX QPID_SHLIB_SUFFIX);
-#else
- Shlib sh(".libs/libshlibtest.so");
-#endif
- // Double cast to avoid ISO warning.
- CallMe callMe=sh.getSymbol<CallMe>("callMe");
- BOOST_REQUIRE(callMe != 0);
- int unloaded=0;
- callMe(&unloaded);
- sh.unload();
- BOOST_CHECK_EQUAL(42, unloaded);
- try {
- sh.getSymbol("callMe");
- BOOST_FAIL("Expected exception");
- }
- catch (const qpid::Exception&) {}
-}
-
-QPID_AUTO_TEST_CASE(testAutoShlib) {
- int unloaded = 0;
- {
-#if defined (QPID_SHLIB_PREFIX) && defined (QPID_SHLIB_SUFFIX)
- AutoShlib sh("./" QPID_SHLIB_PREFIX "shlibtest" QPID_SHLIB_POSTFIX QPID_SHLIB_SUFFIX);
-#else
- AutoShlib sh(".libs/libshlibtest.so");
-#endif
- CallMe callMe=sh.getSymbol<CallMe>("callMe");
- BOOST_REQUIRE(callMe != 0);
- callMe(&unloaded);
- }
- BOOST_CHECK_EQUAL(42, unloaded);
-}
-
-
-QPID_AUTO_TEST_SUITE_END()
-
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/SocketProxy.h b/cpp/src/tests/SocketProxy.h
deleted file mode 100644
index 0c6f39d62e..0000000000
--- a/cpp/src/tests/SocketProxy.h
+++ /dev/null
@@ -1,181 +0,0 @@
-#ifndef SOCKETPROXY_H
-#define SOCKETPROXY_H
-
-/*
- * 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.
- *
- */
-
-#include "qpid/sys/IOHandle.h"
-#ifdef _WIN32
-# include "qpid/sys/windows/IoHandlePrivate.h"
- typedef SOCKET FdType;
-#else
-# include "qpid/sys/posix/PrivatePosix.h"
- typedef int FdType;
-#endif
-#include "qpid/sys/Socket.h"
-#include "qpid/sys/Runnable.h"
-#include "qpid/sys/Thread.h"
-#include "qpid/sys/Mutex.h"
-#include "qpid/log/Statement.h"
-
-namespace qpid {
-namespace tests {
-
-/**
- * A simple socket proxy that forwards to another socket.
- * Used between client & local broker to simulate network failures.
- */
-class SocketProxy : private qpid::sys::Runnable
-{
- // Need a Socket we can get the fd from
- class LowSocket : public qpid::sys::Socket {
- public:
-#ifdef _WIN32
- FdType getFd() { return toSocketHandle(*this); }
-#else
- FdType getFd() { return toFd(impl); }
-#endif
- };
-
- public:
- /** Connect to connectPort on host, start a forwarding thread.
- * Listen for connection on getPort().
- */
- SocketProxy(int connectPort, const std::string host="localhost")
- : closed(false), joined(true),
- port(listener.listen()), dropClient(), dropServer()
- {
- client.connect(host, connectPort);
- joined = false;
- thread = qpid::sys::Thread(static_cast<qpid::sys::Runnable*>(this));
- }
-
- ~SocketProxy() { close(); if (!joined) thread.join(); }
-
- /** Simulate a network disconnect. */
- void close() {
- {
- qpid::sys::Mutex::ScopedLock l(lock);
- if (closed) { return; }
- closed=true;
- }
- if (thread && thread != qpid::sys::Thread::current()) {
- thread.join();
- joined = true;
- }
- client.close();
- }
-
- /** Simulate lost packets, drop data from client */
- void dropClientData(bool drop=true) { dropClient=drop; }
-
- /** Simulate lost packets, drop data from server */
- void dropServerData(bool drop=true) { dropServer=drop; }
-
- bool isClosed() const {
- qpid::sys::Mutex::ScopedLock l(lock);
- return closed;
- }
-
- uint16_t getPort() const { return port; }
-
- private:
- static void throwErrno(const std::string& msg) {
- throw qpid::Exception(msg+":"+qpid::sys::strError(errno));
- }
- static void throwIf(bool condition, const std::string& msg) {
- if (condition) throw qpid::Exception(msg);
- }
-
- void run() {
- std::auto_ptr<LowSocket> server;
- try {
- fd_set socks;
- FdType maxFd = listener.getFd();
- struct timeval tmo;
- for (;;) {
- FD_ZERO(&socks);
- FD_SET(maxFd, &socks);
- tmo.tv_sec = 0;
- tmo.tv_usec = 500 * 1000;
- if (select(maxFd+1, &socks, 0, 0, &tmo) == 0) {
- qpid::sys::Mutex::ScopedLock l(lock);
- throwIf(closed, "SocketProxy: Closed by close()");
- continue;
- }
- throwIf(!FD_ISSET(maxFd, &socks), "SocketProxy: Accept failed");
- break; // Accept ready... go to next step
- }
- server.reset(reinterpret_cast<LowSocket *>(listener.accept()));
- maxFd = server->getFd();
- if (client.getFd() > maxFd)
- maxFd = client.getFd();
- char buffer[1024];
- for (;;) {
- FD_ZERO(&socks);
- tmo.tv_sec = 0;
- tmo.tv_usec = 500 * 1000;
- FD_SET(client.getFd(), &socks);
- FD_SET(server->getFd(), &socks);
- if (select(maxFd+1, &socks, 0, 0, &tmo) == 0) {
- qpid::sys::Mutex::ScopedLock l(lock);
- throwIf(closed, "SocketProxy: Closed by close()");
- continue;
- }
- // Something is set; relay data as needed until something closes
- if (FD_ISSET(server->getFd(), &socks)) {
- int n = server->read(buffer, sizeof(buffer));
- throwIf(n <= 0, "SocketProxy: server disconnected");
- if (!dropServer) client.write(buffer, n);
- }
- if (FD_ISSET(client.getFd(), &socks)) {
- int n = client.read(buffer, sizeof(buffer));
- throwIf(n <= 0, "SocketProxy: client disconnected");
- if (!dropServer) server->write(buffer, n);
- }
- if (!FD_ISSET(client.getFd(), &socks) &&
- !FD_ISSET(server->getFd(), &socks))
- throwIf(true, "SocketProxy: No handle ready");
- }
- }
- catch (const std::exception& e) {
- QPID_LOG(debug, "SocketProxy::run exception: " << e.what());
- }
- try {
- if (server.get()) server->close();
- close();
- }
- catch (const std::exception& e) {
- QPID_LOG(debug, "SocketProxy::run exception in client/server close()" << e.what());
- }
- }
-
- mutable qpid::sys::Mutex lock;
- mutable bool closed;
- bool joined;
- LowSocket client, listener;
- uint16_t port;
- qpid::sys::Thread thread;
- bool dropClient, dropServer;
-};
-
-}} // namespace qpid::tests
-
-#endif
diff --git a/cpp/src/tests/Statistics.cpp b/cpp/src/tests/Statistics.cpp
deleted file mode 100644
index 19531762b1..0000000000
--- a/cpp/src/tests/Statistics.cpp
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- *
- * 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.
- *
- */
-#include "Statistics.h"
-#include <qpid/messaging/Message.h>
-#include <ostream>
-#include <iomanip>
-
-namespace qpid {
-namespace tests {
-
-using namespace std;
-
-Statistic::~Statistic() {}
-
-Throughput::Throughput() : messages(0), started(false) {}
-
-void Throughput::message(const messaging::Message&) {
- ++messages;
- if (!started) {
- start = sys::now();
- started = true;
- }
-}
-
-void Throughput::header(ostream& o) const {
- o << "tp(m/s)";
-}
-
-void Throughput::report(ostream& o) const {
- double elapsed(int64_t(sys::Duration(start, sys::now()))/double(sys::TIME_SEC));
- o << fixed << setprecision(0) << messages/elapsed;
-}
-
-ThroughputAndLatency::ThroughputAndLatency() :
- total(0),
- min(numeric_limits<double>::max()),
- max(numeric_limits<double>::min()),
- samples(0)
-{}
-
-const std::string TS = "ts";
-
-void ThroughputAndLatency::message(const messaging::Message& m) {
- Throughput::message(m);
- types::Variant::Map::const_iterator i = m.getProperties().find(TS);
- if (i != m.getProperties().end()) {
- ++samples;
- int64_t start(i->second.asInt64());
- int64_t end(sys::Duration(sys::EPOCH, sys::now()));
- double latency = double(end - start)/sys::TIME_MSEC;
- if (latency > 0) {
- total += latency;
- if (latency < min) min = latency;
- if (latency > max) max = latency;
- }
- }
-}
-
-void ThroughputAndLatency::header(ostream& o) const {
- Throughput::header(o);
- o << '\t' << "l-min" << '\t' << "l-max" << '\t' << "l-avg";
-}
-
-void ThroughputAndLatency::report(ostream& o) const {
- Throughput::report(o);
- if (samples) {
- o << fixed << setprecision(2)
- << '\t' << min << '\t' << max << '\t' << total/samples;
- }
-}
-
-ReporterBase::ReporterBase(ostream& o, int batch, bool wantHeader)
- : batchSize(batch), batchCount(0), headerPrinted(!wantHeader), out(o)
-{}
-
-ReporterBase::~ReporterBase() {}
-
-/** Count message in the statistics */
-void ReporterBase::message(const messaging::Message& m) {
- if (!overall.get()) overall = create();
- overall->message(m);
- if (batchSize) {
- if (!batch.get()) batch = create();
- batch->message(m);
- if (++batchCount == batchSize) {
- header();
- batch->report(out);
- out << endl;
- batch = create();
- batchCount = 0;
- }
- }
-}
-
-/** Print overall report. */
-void ReporterBase::report() {
- if (!overall.get()) overall = create();
- header();
- overall->report(out);
- out << endl;
-}
-
-void ReporterBase::header() {
- if (!headerPrinted) {
- if (!overall.get()) overall = create();
- overall->header(out);
- out << endl;
- headerPrinted = true;
- }
-}
-
-
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/Statistics.h b/cpp/src/tests/Statistics.h
deleted file mode 100644
index 091046a17f..0000000000
--- a/cpp/src/tests/Statistics.h
+++ /dev/null
@@ -1,111 +0,0 @@
-#ifndef TESTS_STATISTICS_H
-#define TESTS_STATISTICS_H
-
-/*
- *
- * 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.
- *
- */
-
-
-#include <qpid/sys/Time.h>
-#include <limits>
-#include <iosfwd>
-#include <memory>
-
-namespace qpid {
-
-namespace messaging {
-class Message;
-}
-
-namespace tests {
-
-class Statistic {
- public:
- virtual ~Statistic();
- virtual void message(const messaging::Message&) = 0;
- virtual void report(std::ostream&) const = 0;
- virtual void header(std::ostream&) const = 0;
-};
-
-class Throughput : public Statistic {
- public:
- Throughput();
- virtual void message(const messaging::Message&);
- virtual void report(std::ostream&) const;
- virtual void header(std::ostream&) const;
-
- protected:
- int messages;
-
- private:
- bool started;
- sys::AbsTime start;
-};
-
-class ThroughputAndLatency : public Throughput {
- public:
- ThroughputAndLatency();
- virtual void message(const messaging::Message&);
- virtual void report(std::ostream&) const;
- virtual void header(std::ostream&) const;
-
- private:
- double total, min, max; // Milliseconds
- int samples;
-};
-
-/** Report batch and overall statistics */
-class ReporterBase {
- public:
- virtual ~ReporterBase();
-
- /** Count message in the statistics */
- void message(const messaging::Message& m);
-
- /** Print overall report. */
- void report();
-
- protected:
- ReporterBase(std::ostream& o, int batchSize, bool wantHeader);
- virtual std::auto_ptr<Statistic> create() = 0;
-
- private:
- void header();
- void report(const Statistic& s);
- std::auto_ptr<Statistic> overall;
- std::auto_ptr<Statistic> batch;
- int batchSize, batchCount;
- bool stopped, headerPrinted;
- std::ostream& out;
-};
-
-template <class Stats> class Reporter : public ReporterBase {
- public:
- Reporter(std::ostream& o, int batchSize, bool wantHeader)
- : ReporterBase(o, batchSize, wantHeader) {}
-
- virtual std::auto_ptr<Statistic> create() {
- return std::auto_ptr<Statistic>(new Stats);
- }
-};
-
-}} // namespace qpid::tests
-
-#endif /*!TESTS_STATISTICS_H*/
diff --git a/cpp/src/tests/StoreStatus.cpp b/cpp/src/tests/StoreStatus.cpp
deleted file mode 100644
index 43d4cfd920..0000000000
--- a/cpp/src/tests/StoreStatus.cpp
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- *
- * 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 "qpid/cluster/StoreStatus.h"
-#include "qpid/framing/Uuid.h"
-#include <boost/assign.hpp>
-#include <boost/filesystem/operations.hpp>
-
-using namespace std;
-using namespace qpid::cluster;
-using namespace qpid::framing;
-using namespace qpid::framing::cluster;
-using namespace boost::assign;
-using namespace boost::filesystem;
-
-
-namespace qpid {
-namespace tests {
-
-QPID_AUTO_TEST_SUITE(StoreStatusTestSuite)
-
-const char* TEST_DIR = "StoreStatus.tmp";
-
-struct TestDir {
- TestDir() {
- remove_all(TEST_DIR);
- create_directory(TEST_DIR);
- }
- ~TestDir() {
- remove_all(TEST_DIR);
- }
-};
-
-QPID_AUTO_TEST_CASE(testLoadEmpty) {
- TestDir td;
- StoreStatus ss(TEST_DIR);
- BOOST_CHECK_EQUAL(ss.getState(), STORE_STATE_NO_STORE);
- BOOST_CHECK(!ss.getClusterId());
- BOOST_CHECK(!ss.getShutdownId());
- ss.load();
- BOOST_CHECK_EQUAL(ss.getState(), STORE_STATE_EMPTY_STORE);
- BOOST_CHECK(!ss.getShutdownId());
-}
-
-QPID_AUTO_TEST_CASE(testSaveLoadDirty) {
- TestDir td;
- Uuid clusterId = Uuid(true);
- StoreStatus ss(TEST_DIR);
- ss.load();
- ss.setClusterId(clusterId);
- ss.dirty();
- BOOST_CHECK_EQUAL(ss.getState(), STORE_STATE_DIRTY_STORE);
-
- StoreStatus ss2(TEST_DIR);
- ss2.load();
- BOOST_CHECK_EQUAL(ss2.getState(), STORE_STATE_DIRTY_STORE);
- BOOST_CHECK_EQUAL(ss2.getClusterId(), clusterId);
- BOOST_CHECK(!ss2.getShutdownId());
-}
-
-QPID_AUTO_TEST_CASE(testSaveLoadClean) {
- TestDir td;
- Uuid clusterId = Uuid(true);
- Uuid shutdownId = Uuid(true);
- StoreStatus ss(TEST_DIR);
- ss.load();
- ss.setClusterId(clusterId);
- ss.clean(shutdownId);
- BOOST_CHECK_EQUAL(ss.getState(), STORE_STATE_CLEAN_STORE);
-
- StoreStatus ss2(TEST_DIR);
- ss2.load();
- BOOST_CHECK_EQUAL(ss2.getState(), STORE_STATE_CLEAN_STORE);
- BOOST_CHECK_EQUAL(ss2.getClusterId(), clusterId);
- BOOST_CHECK_EQUAL(ss2.getShutdownId(), shutdownId);
-}
-
-QPID_AUTO_TEST_CASE(testMarkDirty) {
- // Save clean then mark to dirty.
- TestDir td;
- Uuid clusterId = Uuid(true);
- Uuid shutdownId = Uuid(true);
- StoreStatus ss(TEST_DIR);
- ss.load();
- ss.setClusterId(clusterId);
- ss.dirty();
- ss.clean(shutdownId);
- ss.dirty();
-
- StoreStatus ss2(TEST_DIR);
- ss2.load();
- BOOST_CHECK_EQUAL(ss2.getState(), STORE_STATE_DIRTY_STORE);
- BOOST_CHECK_EQUAL(ss2.getClusterId(), clusterId);
- BOOST_CHECK(!ss2.getShutdownId());
-}
-
-QPID_AUTO_TEST_SUITE_END()
-
- }} // namespace qpid::tests
diff --git a/cpp/src/tests/StringUtils.cpp b/cpp/src/tests/StringUtils.cpp
deleted file mode 100644
index 6a19119288..0000000000
--- a/cpp/src/tests/StringUtils.cpp
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- *
- * 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.
- *
- */
-#include <iostream>
-#include "qpid/StringUtils.h"
-
-#include "unit_test.h"
-
-QPID_AUTO_TEST_SUITE(StringUtilsTestSuite)
-
-using namespace qpid;
-using std::string;
-
-QPID_AUTO_TEST_CASE(testSplit_general)
-{
- std::vector<std::string> results = split("a bbbb, car,d123,,,e", ", ");
- BOOST_CHECK_EQUAL(5u, results.size());
- BOOST_CHECK_EQUAL(string("a"), results[0]);
- BOOST_CHECK_EQUAL(string("bbbb"), results[1]);
- BOOST_CHECK_EQUAL(string("car"), results[2]);
- BOOST_CHECK_EQUAL(string("d123"), results[3]);
- BOOST_CHECK_EQUAL(string("e"), results[4]);
-}
-
-QPID_AUTO_TEST_CASE(testSplit_noDelims)
-{
- std::vector<std::string> results = split("abc", ", ");
- BOOST_CHECK_EQUAL(1u, results.size());
- BOOST_CHECK_EQUAL(string("abc"), results[0]);
-}
-
-QPID_AUTO_TEST_CASE(testSplit_delimAtEnd)
-{
- std::vector<std::string> results = split("abc def,,", ", ");
- BOOST_CHECK_EQUAL(2u, results.size());
- BOOST_CHECK_EQUAL(string("abc"), results[0]);
- BOOST_CHECK_EQUAL(string("def"), results[1]);
-}
-
-QPID_AUTO_TEST_CASE(testSplit_delimAtStart)
-{
- std::vector<std::string> results = split(",,abc def", ", ");
- BOOST_CHECK_EQUAL(2u, results.size());
- BOOST_CHECK_EQUAL(string("abc"), results[0]);
- BOOST_CHECK_EQUAL(string("def"), results[1]);
-}
-
-QPID_AUTO_TEST_CASE(testSplit_onlyDelims)
-{
- std::vector<std::string> results = split(",, , ", ", ");
- BOOST_CHECK_EQUAL(0u, results.size());
-}
-
-QPID_AUTO_TEST_CASE(testSplit_empty)
-{
- std::vector<std::string> results = split("", ", ");
- BOOST_CHECK_EQUAL(0u, results.size());
-}
-
-QPID_AUTO_TEST_SUITE_END()
diff --git a/cpp/src/tests/TestMessageStore.h b/cpp/src/tests/TestMessageStore.h
deleted file mode 100644
index 20e0b755b2..0000000000
--- a/cpp/src/tests/TestMessageStore.h
+++ /dev/null
@@ -1,63 +0,0 @@
-#ifndef _tests_TestMessageStore_h
-#define _tests_TestMessageStore_h
-
-/*
- *
- * 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.
- *
- */
-#include "qpid/broker/NullMessageStore.h"
-#include <vector>
-
-using namespace qpid;
-using namespace qpid::broker;
-using namespace qpid::framing;
-
-namespace qpid {
-namespace tests {
-
-typedef std::pair<string, boost::intrusive_ptr<PersistableMessage> > msg_queue_pair;
-
-class TestMessageStore : public NullMessageStore
-{
- public:
- std::vector<boost::intrusive_ptr<PersistableMessage> > dequeued;
- std::vector<msg_queue_pair> enqueued;
-
- void dequeue(TransactionContext*,
- const boost::intrusive_ptr<PersistableMessage>& msg,
- const PersistableQueue& /*queue*/)
- {
- dequeued.push_back(msg);
- }
-
- void enqueue(TransactionContext*,
- const boost::intrusive_ptr<PersistableMessage>& msg,
- const PersistableQueue& queue)
- {
- msg->enqueueComplete();
- enqueued.push_back(msg_queue_pair(queue.getName(), msg));
- }
-
- TestMessageStore() : NullMessageStore() {}
- ~TestMessageStore(){}
-};
-
-}} // namespace qpid::tests
-
-#endif
diff --git a/cpp/src/tests/TestOptions.h b/cpp/src/tests/TestOptions.h
deleted file mode 100644
index f8da0f59cf..0000000000
--- a/cpp/src/tests/TestOptions.h
+++ /dev/null
@@ -1,79 +0,0 @@
-#ifndef _TestOptions_
-#define _TestOptions_
-/*
- *
- * 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.
- *
- */
-
-#include "qpid/Options.h"
-#include "qpid/log/Options.h"
-#include "qpid/Url.h"
-#include "qpid/log/Logger.h"
-#include "qpid/client/Connection.h"
-#include "ConnectionOptions.h"
-
-#include <iostream>
-#include <exception>
-
-namespace qpid {
-
-struct TestOptions : public qpid::Options
-{
- TestOptions(const std::string& helpText_=std::string(),
- const std::string& argv0=std::string())
- : Options("Test Options"), help(false), log(argv0), helpText(helpText_)
- {
- addOptions()
- ("help", optValue(help), "print this usage statement");
- add(con);
- add(log);
- }
-
- /** As well as parsing, throw help message if requested. */
- void parse(int argc, char** argv) {
- try {
- qpid::Options::parse(argc, argv);
- } catch (const std::exception& e) {
- std::ostringstream msg;
- msg << *this << std::endl << std::endl << e.what() << std::endl;
- throw qpid::Options::Exception(msg.str());
- }
- qpid::log::Logger::instance().configure(log);
- if (help) {
- std::ostringstream msg;
- msg << *this << std::endl << std::endl << helpText << std::endl;
- throw qpid::Options::Exception(msg.str());
- }
- }
-
- /** Open a connection using option values */
- void open(qpid::client::Connection& connection) {
- connection.open(con);
- }
-
-
- bool help;
- ConnectionOptions con;
- qpid::log::Options log;
- std::string helpText;
-};
-
-}
-
-#endif
diff --git a/cpp/src/tests/TimerTest.cpp b/cpp/src/tests/TimerTest.cpp
deleted file mode 100644
index 6a0a196f4e..0000000000
--- a/cpp/src/tests/TimerTest.cpp
+++ /dev/null
@@ -1,130 +0,0 @@
-
-/*
- *
- * 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.
- *
- */
-#include "qpid/sys/Timer.h"
-#include "qpid/sys/Monitor.h"
-#include "unit_test.h"
-#include <math.h>
-#include <iostream>
-#include <memory>
-#include <boost/format.hpp>
-#include <boost/lexical_cast.hpp>
-
-using namespace qpid::sys;
-using boost::intrusive_ptr;
-using boost::dynamic_pointer_cast;
-
-namespace qpid {
-namespace tests {
-
-class Counter
-{
- Mutex lock;
- uint counter;
- public:
- Counter() : counter(0) {}
- uint next()
- {
- Mutex::ScopedLock l(lock);
- return ++counter;
- }
-};
-
-class TestTask : public TimerTask
-{
- const AbsTime start;
- const Duration expected;
- AbsTime end;
- bool fired;
- uint position;
- Monitor monitor;
- Counter& counter;
-
- public:
- TestTask(Duration timeout, Counter& _counter)
- : TimerTask(timeout, "Test"), start(now()), expected(timeout), end(start), fired(false), counter(_counter) {}
-
- void fire()
- {
- Monitor::ScopedLock l(monitor);
- fired = true;
- position = counter.next();
- end = now();
- monitor.notify();
- }
-
- void check(uint expected_position, uint64_t tolerance = 500 * TIME_MSEC)
- {
- Monitor::ScopedLock l(monitor);
- BOOST_CHECK(fired);
- BOOST_CHECK_EQUAL(expected_position, position);
- Duration actual(start, end);
-#ifdef _MSC_VER
- uint64_t difference = _abs64(expected - actual);
-#elif defined(_WIN32)
- uint64_t difference = labs(expected - actual);
-#else
- uint64_t difference = abs(expected - actual);
-#endif
- std::string msg(boost::lexical_cast<std::string>(boost::format("tolerance = %1%, difference = %2%") % tolerance % difference));
- BOOST_CHECK_MESSAGE(difference < tolerance, msg);
- }
-
- void wait(Duration d)
- {
- Monitor::ScopedLock l(monitor);
- monitor.wait(AbsTime(now(), d));
- }
-};
-
-class DummyRunner : public Runnable
-{
- public:
- void run() {}
-};
-
-QPID_AUTO_TEST_SUITE(TimerTestSuite)
-
-QPID_AUTO_TEST_CASE(testGeneral)
-{
- Counter counter;
- Timer timer;
- intrusive_ptr<TestTask> task1(new TestTask(Duration(3 * TIME_SEC), counter));
- intrusive_ptr<TestTask> task2(new TestTask(Duration(1 * TIME_SEC), counter));
- intrusive_ptr<TestTask> task3(new TestTask(Duration(4 * TIME_SEC), counter));
- intrusive_ptr<TestTask> task4(new TestTask(Duration(2 * TIME_SEC), counter));
-
- timer.add(task1);
- timer.add(task2);
- timer.add(task3);
- timer.add(task4);
-
- dynamic_pointer_cast<TestTask>(task3)->wait(Duration(6 * TIME_SEC));
-
- dynamic_pointer_cast<TestTask>(task1)->check(3);
- dynamic_pointer_cast<TestTask>(task2)->check(1);
- dynamic_pointer_cast<TestTask>(task3)->check(4);
- dynamic_pointer_cast<TestTask>(task4)->check(2);
-}
-
-QPID_AUTO_TEST_SUITE_END()
-
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/TopicExchangeTest.cpp b/cpp/src/tests/TopicExchangeTest.cpp
deleted file mode 100644
index ff8931f9c9..0000000000
--- a/cpp/src/tests/TopicExchangeTest.cpp
+++ /dev/null
@@ -1,406 +0,0 @@
-/*
- * 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.
- */
-#include "qpid/broker/TopicExchange.h"
-#include "unit_test.h"
-#include "test_tools.h"
-
-using namespace qpid::broker;
-using namespace std;
-
-
-namespace qpid {
-namespace broker {
-
-// Class for exercising the pattern match code in the TopicExchange
-class TopicExchange::TopicExchangeTester {
-
-public:
- typedef std::vector<std::string> BindingVec;
-
-private:
- // binding node iterator that collects all routes that are bound
- class TestFinder : public TopicExchange::BindingNode::TreeIterator {
- public:
- TestFinder(BindingVec& m) : bv(m) {};
- ~TestFinder() {};
- bool visit(BindingNode& node) {
- if (!node.bindings.bindingVector.empty())
- bv.push_back(node.routePattern);
- return true;
- }
-
- BindingVec& bv;
- };
-
-public:
- TopicExchangeTester() {};
- ~TopicExchangeTester() {};
- bool addBindingKey(const std::string& bKey) {
- string routingPattern = normalize(bKey);
- BindingKey *bk = bindingTree.addBindingKey(routingPattern);
- if (bk) {
- // push a dummy binding to mark this node as "non-leaf"
- bk->bindingVector.push_back(Binding::shared_ptr());
- return true;
- }
- return false;
- }
-
- bool removeBindingKey(const std::string& bKey){
- string routingPattern = normalize(bKey);
- BindingKey *bk = bindingTree.getBindingKey(routingPattern);
- if (bk) {
- bk->bindingVector.pop_back();
- if (bk->bindingVector.empty()) {
- // no more bindings - remove this node
- bindingTree.removeBindingKey(routingPattern);
- }
- return true;
- }
- return false;
- }
-
- void findMatches(const std::string& rKey, BindingVec& matches) {
- TestFinder testFinder(matches);
- bindingTree.iterateMatch( rKey, testFinder );
- }
-
- void getAll(BindingVec& bindings) {
- TestFinder testFinder(bindings);
- bindingTree.iterateAll( testFinder );
- }
-
-private:
- TopicExchange::BindingNode bindingTree;
-};
-} // namespace broker
-
-
-namespace tests {
-
-QPID_AUTO_TEST_SUITE(TopicExchangeTestSuite)
-
-#define CHECK_NORMALIZED(expect, pattern) BOOST_CHECK_EQUAL(expect, TopicExchange::normalize(pattern));
-
-namespace {
- // return the count of bindings that match 'pattern'
- int match(TopicExchange::TopicExchangeTester &tt,
- const std::string& pattern)
- {
- TopicExchange::TopicExchangeTester::BindingVec bv;
- tt.findMatches(pattern, bv);
- return int(bv.size());
- }
-
- // return true if expected contains exactly all bindings that match
- // against pattern.
- bool compare(TopicExchange::TopicExchangeTester& tt,
- const std::string& pattern,
- const TopicExchange::TopicExchangeTester::BindingVec& expected)
- {
- TopicExchange::TopicExchangeTester::BindingVec bv;
- tt.findMatches(pattern, bv);
- if (expected.size() != bv.size()) {
- // std::cout << "match failed 1 f=[" << bv << "]" << std::endl;
- // std::cout << "match failed 1 e=[" << expected << "]" << std::endl;
- return false;
- }
- TopicExchange::TopicExchangeTester::BindingVec::const_iterator i;
- for (i = expected.begin(); i != expected.end(); i++) {
- TopicExchange::TopicExchangeTester::BindingVec::iterator j;
- for (j = bv.begin(); j != bv.end(); j++) {
- // std::cout << "matched [" << *j << "]" << std::endl;
- if (*i == *j) break;
- }
- if (j == bv.end()) {
- // std::cout << "match failed 2 [" << bv << "]" << std::endl;
- return false;
- }
- }
- return true;
- }
-}
-
-
-QPID_AUTO_TEST_CASE(testNormalize)
-{
- CHECK_NORMALIZED("", "");
- CHECK_NORMALIZED("a.b.c", "a.b.c");
- CHECK_NORMALIZED("a.*.c", "a.*.c");
- CHECK_NORMALIZED("#", "#");
- CHECK_NORMALIZED("#", "#.#.#.#");
- CHECK_NORMALIZED("*.*.*.#", "#.*.#.*.#.#.*");
- CHECK_NORMALIZED("a.*.*.*.#", "a.*.#.*.#.*.#");
- CHECK_NORMALIZED("a.*.*.*.#", "a.*.#.*.#.*");
- CHECK_NORMALIZED("*.*.*.#", "*.#.#.*.*.#");
-}
-
-QPID_AUTO_TEST_CASE(testPlain)
-{
- TopicExchange::TopicExchangeTester tt;
- string pattern("ab.cd.e");
-
- BOOST_CHECK(tt.addBindingKey(pattern));
- BOOST_CHECK_EQUAL(1, match(tt, "ab.cd.e"));
- BOOST_CHECK_EQUAL(0, match(tt, "abx.cd.e"));
- BOOST_CHECK_EQUAL(0, match(tt, "ab.cd"));
- BOOST_CHECK_EQUAL(0, match(tt, "ab.cd..e."));
- BOOST_CHECK_EQUAL(0, match(tt, "ab.cd.e."));
- BOOST_CHECK_EQUAL(0, match(tt, ".ab.cd.e"));
- BOOST_CHECK(tt.removeBindingKey(pattern));
-
- pattern = "";
- BOOST_CHECK(tt.addBindingKey(pattern));
- BOOST_CHECK_EQUAL(1, match(tt, ""));
- BOOST_CHECK(tt.removeBindingKey(pattern));
-
- pattern = ".";
- BOOST_CHECK(tt.addBindingKey(pattern));
- BOOST_CHECK_EQUAL(1, match(tt, "."));
- BOOST_CHECK(tt.removeBindingKey(pattern));
-}
-
-
-QPID_AUTO_TEST_CASE(testStar)
-{
- TopicExchange::TopicExchangeTester tt;
- string pattern("a.*.b");
- BOOST_CHECK(tt.addBindingKey(pattern));
- BOOST_CHECK_EQUAL(1, match(tt, "a.xx.b"));
- BOOST_CHECK_EQUAL(0, match(tt, "a.b"));
- BOOST_CHECK(tt.removeBindingKey(pattern));
-
- pattern = "*.x";
- BOOST_CHECK(tt.addBindingKey(pattern));
- BOOST_CHECK_EQUAL(1, match(tt, "y.x"));
- BOOST_CHECK_EQUAL(1, match(tt, ".x"));
- BOOST_CHECK_EQUAL(0, match(tt, "x"));
- BOOST_CHECK(tt.removeBindingKey(pattern));
-
- pattern = "x.x.*";
- BOOST_CHECK(tt.addBindingKey(pattern));
- BOOST_CHECK_EQUAL(1, match(tt, "x.x.y"));
- BOOST_CHECK_EQUAL(1, match(tt, "x.x."));
- BOOST_CHECK_EQUAL(0, match(tt, "x.x"));
- BOOST_CHECK_EQUAL(0, match(tt, "q.x.y"));
- BOOST_CHECK(tt.removeBindingKey(pattern));
-}
-
-QPID_AUTO_TEST_CASE(testHash)
-{
- TopicExchange::TopicExchangeTester tt;
- string pattern("a.#.b");
- BOOST_CHECK(tt.addBindingKey(pattern));
- BOOST_CHECK_EQUAL(1, match(tt, "a.b"));
- BOOST_CHECK_EQUAL(1, match(tt, "a.x.b"));
- BOOST_CHECK_EQUAL(1, match(tt, "a..x.y.zz.b"));
- BOOST_CHECK_EQUAL(0, match(tt, "a.b."));
- BOOST_CHECK_EQUAL(0, match(tt, "q.x.b"));
- BOOST_CHECK(tt.removeBindingKey(pattern));
-
- pattern = "a.#";
- BOOST_CHECK(tt.addBindingKey(pattern));
- BOOST_CHECK_EQUAL(1, match(tt, "a"));
- BOOST_CHECK_EQUAL(1, match(tt, "a.b"));
- BOOST_CHECK_EQUAL(1, match(tt, "a.b.c"));
- BOOST_CHECK(tt.removeBindingKey(pattern));
-
- pattern = "#.a";
- BOOST_CHECK(tt.addBindingKey(pattern));
- BOOST_CHECK_EQUAL(1, match(tt, "a"));
- BOOST_CHECK_EQUAL(1, match(tt, "x.y.a"));
- BOOST_CHECK(tt.removeBindingKey(pattern));
-
- pattern = "a.#.b.#.c";
- BOOST_CHECK(tt.addBindingKey(pattern));
- BOOST_CHECK_EQUAL(1, match(tt, "a.b.c"));
- BOOST_CHECK_EQUAL(1, match(tt, "a.x.b.y.c"));
- BOOST_CHECK_EQUAL(1, match(tt, "a.x.x.b.y.y.c"));
- BOOST_CHECK(tt.removeBindingKey(pattern));
-}
-
-QPID_AUTO_TEST_CASE(testMixed)
-{
- TopicExchange::TopicExchangeTester tt;
- string pattern("*.x.#.y");
- BOOST_CHECK(tt.addBindingKey(pattern));
- BOOST_CHECK_EQUAL(1, match(tt, "a.x.y"));
- BOOST_CHECK_EQUAL(1, match(tt, "a.x.p.qq.y"));
- BOOST_CHECK_EQUAL(0, match(tt, "a.a.x.y"));
- BOOST_CHECK_EQUAL(0, match(tt, "aa.x.b.c"));
- BOOST_CHECK(tt.removeBindingKey(pattern));
-
- pattern = "a.#.b.*";
- BOOST_CHECK(tt.addBindingKey(pattern));
- BOOST_CHECK_EQUAL(1, match(tt, "a.b.x"));
- BOOST_CHECK_EQUAL(1, match(tt, "a.x.x.x.b.x"));
- BOOST_CHECK(tt.removeBindingKey(pattern));
-
- pattern = "*.*.*.#";
- BOOST_CHECK(tt.addBindingKey(pattern));
- BOOST_CHECK_EQUAL(1, match(tt, "x.y.z"));
- BOOST_CHECK_EQUAL(1, match(tt, "x.y.z.a.b.c"));
- BOOST_CHECK_EQUAL(0, match(tt, "x.y"));
- BOOST_CHECK_EQUAL(0, match(tt, "x"));
- BOOST_CHECK(tt.removeBindingKey(pattern));
-}
-
-
-QPID_AUTO_TEST_CASE(testMultiple)
-{
- TopicExchange::TopicExchangeTester tt;
- const std::string bindings[] =
- { "a", "b",
- "a.b", "b.c",
- "a.b.c.d", "b.c.d.e",
- "a.*", "a.#", "a.*.#",
- "#.b", "*.b", "*.#.b",
- "a.*.b", "a.#.b", "a.*.#.b",
- "*.b.*", "#.b.#",
- };
- const size_t nBindings = sizeof(bindings)/sizeof(bindings[0]);
-
- // setup bindings
- for (size_t idx = 0; idx < nBindings; idx++) {
- BOOST_CHECK(tt.addBindingKey(bindings[idx]));
- }
-
- {
- // read all bindings, and verify all are present
- TopicExchange::TopicExchangeTester::BindingVec b;
- tt.getAll(b);
- BOOST_CHECK_EQUAL(b.size(), nBindings);
- for (size_t idx = 0; idx < nBindings; idx++) {
- bool found = false;
- for (TopicExchange::TopicExchangeTester::BindingVec::iterator i = b.begin();
- i != b.end(); i++) {
- if (*i == bindings[idx]) {
- found = true;
- break;
- }
- }
- BOOST_CHECK(found);
- }
- }
-
- { // test match on pattern "a"
- const std::string matches[] = { "a", "a.#" };
- const size_t nMatches = 2;
- TopicExchange::TopicExchangeTester::BindingVec expected(matches, matches + nMatches);
- BOOST_CHECK(compare(tt, "a", expected));
- }
-
- { // test match on pattern "a.z"
- const std::string matches[] = { "a.*", "a.#", "a.*.#" };
- const size_t nMatches = 3;
- TopicExchange::TopicExchangeTester::BindingVec expected(matches, matches + nMatches);
- BOOST_CHECK(compare(tt, "a.z", expected));
- }
-
- { // test match on pattern "a.b"
- const std::string matches[] = {
- "a.b", "a.*", "a.#", "a.*.#",
- "#.b", "#.b.#", "*.#.b", "*.b",
- "a.#.b"
- };
- const size_t nMatches = 9;
- TopicExchange::TopicExchangeTester::BindingVec expected(matches, matches + nMatches);
- BOOST_CHECK(compare(tt, "a.b", expected));
- }
-
- { // test match on pattern "a.c.c.b"
-
- const std::string matches[] = {
- "#.b", "#.b.#", "*.#.b", "a.#.b",
- "a.#", "a.*.#.b", "a.*.#"
- };
- const size_t nMatches = 7;
- TopicExchange::TopicExchangeTester::BindingVec expected(matches, matches + nMatches);
- BOOST_CHECK(compare(tt, "a.c.c.b", expected));
- }
-
- { // test match on pattern "a.b.c"
-
- const std::string matches[] = {
- "#.b.#", "*.b.*", "a.#", "a.*.#"
- };
- const size_t nMatches = 4;
- TopicExchange::TopicExchangeTester::BindingVec expected(matches, matches + nMatches);
- BOOST_CHECK(compare(tt, "a.b.c", expected));
- }
-
- { // test match on pattern "b"
-
- const std::string matches[] = {
- "#.b", "#.b.#", "b"
- };
- const size_t nMatches = 3;
- TopicExchange::TopicExchangeTester::BindingVec expected(matches, matches + nMatches);
- BOOST_CHECK(compare(tt, "b", expected));
- }
-
- { // test match on pattern "x.b"
-
- const std::string matches[] = {
- "#.b", "#.b.#", "*.#.b", "*.b"
- };
- const size_t nMatches = 4;
- TopicExchange::TopicExchangeTester::BindingVec expected(matches, matches + nMatches);
- BOOST_CHECK(compare(tt, "x.b", expected));
- }
-
- { // test match on pattern "x.y.z.b"
-
- const std::string matches[] = {
- "#.b", "#.b.#", "*.#.b"
- };
- const size_t nMatches = 3;
- TopicExchange::TopicExchangeTester::BindingVec expected(matches, matches + nMatches);
- BOOST_CHECK(compare(tt, "x.y.z.b", expected));
- }
-
- { // test match on pattern "x.y.z.b.a.b.c"
-
- const std::string matches[] = {
- "#.b.#", "#.b.#"
- };
- const size_t nMatches = 2;
- TopicExchange::TopicExchangeTester::BindingVec expected(matches, matches + nMatches);
- BOOST_CHECK(compare(tt, "x.y.z.b.a.b.c", expected));
- }
-
- { // test match on pattern "a.b.c.d"
-
- const std::string matches[] = {
- "#.b.#", "a.#", "a.*.#", "a.b.c.d",
- };
- const size_t nMatches = 4;
- TopicExchange::TopicExchangeTester::BindingVec expected(matches, matches + nMatches);
- BOOST_CHECK(compare(tt, "a.b.c.d", expected));
- }
-
- // cleanup bindings
- for (size_t idx = 0; idx < nBindings; idx++) {
- BOOST_CHECK(tt.removeBindingKey(bindings[idx]));
- }
-}
-
-QPID_AUTO_TEST_SUITE_END()
-
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/TxBufferTest.cpp b/cpp/src/tests/TxBufferTest.cpp
deleted file mode 100644
index 4807026ab7..0000000000
--- a/cpp/src/tests/TxBufferTest.cpp
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
- *
- * 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.
- *
- */
-#include "qpid/broker/TxBuffer.h"
-#include "unit_test.h"
-#include <iostream>
-#include <vector>
-#include "TxMocks.h"
-
-using namespace qpid::broker;
-using boost::static_pointer_cast;
-
-namespace qpid {
-namespace tests {
-
-QPID_AUTO_TEST_SUITE(TxBufferTestSuite)
-
-QPID_AUTO_TEST_CASE(testCommitLocal)
-{
- MockTransactionalStore store;
- store.expectBegin().expectCommit();
-
- MockTxOp::shared_ptr opA(new MockTxOp());
- opA->expectPrepare().expectCommit();
- MockTxOp::shared_ptr opB(new MockTxOp());
- opB->expectPrepare().expectPrepare().expectCommit().expectCommit();//opB enlisted twice to test relative order
- MockTxOp::shared_ptr opC(new MockTxOp());
- opC->expectPrepare().expectCommit();
-
- TxBuffer buffer;
- buffer.enlist(static_pointer_cast<TxOp>(opA));
- buffer.enlist(static_pointer_cast<TxOp>(opB));
- buffer.enlist(static_pointer_cast<TxOp>(opB));//opB enlisted twice
- buffer.enlist(static_pointer_cast<TxOp>(opC));
-
- BOOST_CHECK(buffer.commitLocal(&store));
- store.check();
- BOOST_CHECK(store.isCommitted());
- opA->check();
- opB->check();
- opC->check();
-}
-
-QPID_AUTO_TEST_CASE(testFailOnCommitLocal)
-{
- MockTransactionalStore store;
- store.expectBegin().expectAbort();
-
- MockTxOp::shared_ptr opA(new MockTxOp());
- opA->expectPrepare().expectRollback();
- MockTxOp::shared_ptr opB(new MockTxOp(true));
- opB->expectPrepare().expectRollback();
- MockTxOp::shared_ptr opC(new MockTxOp());//will never get prepare as b will fail
- opC->expectRollback();
-
- TxBuffer buffer;
- buffer.enlist(static_pointer_cast<TxOp>(opA));
- buffer.enlist(static_pointer_cast<TxOp>(opB));
- buffer.enlist(static_pointer_cast<TxOp>(opC));
-
- BOOST_CHECK(!buffer.commitLocal(&store));
- BOOST_CHECK(store.isAborted());
- store.check();
- opA->check();
- opB->check();
- opC->check();
-}
-
-QPID_AUTO_TEST_CASE(testPrepare)
-{
- MockTxOp::shared_ptr opA(new MockTxOp());
- opA->expectPrepare();
- MockTxOp::shared_ptr opB(new MockTxOp());
- opB->expectPrepare();
- MockTxOp::shared_ptr opC(new MockTxOp());
- opC->expectPrepare();
-
- TxBuffer buffer;
- buffer.enlist(static_pointer_cast<TxOp>(opA));
- buffer.enlist(static_pointer_cast<TxOp>(opB));
- buffer.enlist(static_pointer_cast<TxOp>(opC));
-
- BOOST_CHECK(buffer.prepare(0));
- opA->check();
- opB->check();
- opC->check();
-}
-
-QPID_AUTO_TEST_CASE(testFailOnPrepare)
-{
- MockTxOp::shared_ptr opA(new MockTxOp());
- opA->expectPrepare();
- MockTxOp::shared_ptr opB(new MockTxOp(true));
- opB->expectPrepare();
- MockTxOp::shared_ptr opC(new MockTxOp());//will never get prepare as b will fail
-
- TxBuffer buffer;
- buffer.enlist(static_pointer_cast<TxOp>(opA));
- buffer.enlist(static_pointer_cast<TxOp>(opB));
- buffer.enlist(static_pointer_cast<TxOp>(opC));
-
- BOOST_CHECK(!buffer.prepare(0));
- opA->check();
- opB->check();
- opC->check();
-}
-
-QPID_AUTO_TEST_CASE(testRollback)
-{
- MockTxOp::shared_ptr opA(new MockTxOp());
- opA->expectRollback();
- MockTxOp::shared_ptr opB(new MockTxOp(true));
- opB->expectRollback();
- MockTxOp::shared_ptr opC(new MockTxOp());
- opC->expectRollback();
-
- TxBuffer buffer;
- buffer.enlist(static_pointer_cast<TxOp>(opA));
- buffer.enlist(static_pointer_cast<TxOp>(opB));
- buffer.enlist(static_pointer_cast<TxOp>(opC));
-
- buffer.rollback();
- opA->check();
- opB->check();
- opC->check();
-}
-
-QPID_AUTO_TEST_CASE(testBufferIsClearedAfterRollback)
-{
- MockTxOp::shared_ptr opA(new MockTxOp());
- opA->expectRollback();
- MockTxOp::shared_ptr opB(new MockTxOp());
- opB->expectRollback();
-
- TxBuffer buffer;
- buffer.enlist(static_pointer_cast<TxOp>(opA));
- buffer.enlist(static_pointer_cast<TxOp>(opB));
-
- buffer.rollback();
- buffer.commit();//second call should not reach ops
- opA->check();
- opB->check();
-}
-
-QPID_AUTO_TEST_CASE(testBufferIsClearedAfterCommit)
-{
- MockTxOp::shared_ptr opA(new MockTxOp());
- opA->expectCommit();
- MockTxOp::shared_ptr opB(new MockTxOp());
- opB->expectCommit();
-
- TxBuffer buffer;
- buffer.enlist(static_pointer_cast<TxOp>(opA));
- buffer.enlist(static_pointer_cast<TxOp>(opB));
-
- buffer.commit();
- buffer.rollback();//second call should not reach ops
- opA->check();
- opB->check();
-}
-
-QPID_AUTO_TEST_SUITE_END()
-
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/TxMocks.h b/cpp/src/tests/TxMocks.h
deleted file mode 100644
index 72cb50cd21..0000000000
--- a/cpp/src/tests/TxMocks.h
+++ /dev/null
@@ -1,235 +0,0 @@
-/*
- *
- * 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.
- *
- */
-#ifndef _tests_TxMocks_h
-#define _tests_TxMocks_h
-
-
-#include "qpid/Exception.h"
-#include "qpid/Msg.h"
-#include "qpid/broker/TransactionalStore.h"
-#include "qpid/broker/TxOp.h"
-#include <iostream>
-#include <vector>
-
-using namespace qpid::broker;
-using boost::static_pointer_cast;
-using std::string;
-
-namespace qpid {
-namespace tests {
-
-template <class T> void assertEqualVector(std::vector<T>& expected, std::vector<T>& actual){
- unsigned int i = 0;
- while(i < expected.size() && i < actual.size()){
- BOOST_CHECK_EQUAL(expected[i], actual[i]);
- i++;
- }
- if (i < expected.size()) {
- throw qpid::Exception(QPID_MSG("Missing " << expected[i]));
- } else if (i < actual.size()) {
- throw qpid::Exception(QPID_MSG("Extra " << actual[i]));
- }
- BOOST_CHECK_EQUAL(expected.size(), actual.size());
-}
-
-class TxOpConstants{
-protected:
- const string PREPARE;
- const string COMMIT;
- const string ROLLBACK;
-
- TxOpConstants() : PREPARE("PREPARE"), COMMIT("COMMIT"), ROLLBACK("ROLLBACK") {}
-};
-
-class MockTxOp : public TxOp, public TxOpConstants{
- std::vector<string> expected;
- std::vector<string> actual;
- bool failOnPrepare;
- string debugName;
-public:
- typedef boost::shared_ptr<MockTxOp> shared_ptr;
-
- MockTxOp() : failOnPrepare(false) {}
- MockTxOp(bool _failOnPrepare) : failOnPrepare(_failOnPrepare) {}
-
- void setDebugName(string name){
- debugName = name;
- }
-
- void printExpected(){
- std::cout << std::endl << "MockTxOp[" << debugName << "] expects: ";
- for (std::vector<string>::iterator i = expected.begin(); i < expected.end(); i++) {
- if(i != expected.begin()) std::cout << ", ";
- std::cout << *i;
- }
- std::cout << std::endl;
- }
-
- void printActual(){
- std::cout << std::endl << "MockTxOp[" << debugName << "] actual: ";
- for (std::vector<string>::iterator i = actual.begin(); i < actual.end(); i++) {
- if(i != actual.begin()) std::cout << ", ";
- std::cout << *i;
- }
- std::cout << std::endl;
- }
-
- bool prepare(TransactionContext*) throw(){
- actual.push_back(PREPARE);
- return !failOnPrepare;
- }
- void commit() throw(){
- actual.push_back(COMMIT);
- }
- void rollback() throw(){
- if(!debugName.empty()) std::cout << std::endl << "MockTxOp[" << debugName << "]::rollback()" << std::endl;
- actual.push_back(ROLLBACK);
- }
- MockTxOp& expectPrepare(){
- expected.push_back(PREPARE);
- return *this;
- }
- MockTxOp& expectCommit(){
- expected.push_back(COMMIT);
- return *this;
- }
- MockTxOp& expectRollback(){
- expected.push_back(ROLLBACK);
- return *this;
- }
- void check(){
- assertEqualVector(expected, actual);
- }
-
- void accept(TxOpConstVisitor&) const {}
-
- ~MockTxOp(){}
-};
-
-class MockTransactionalStore : public TransactionalStore{
- const string BEGIN;
- const string BEGIN2PC;
- const string PREPARE;
- const string COMMIT;
- const string ABORT;
- std::vector<string> expected;
- std::vector<string> actual;
-
- enum states {OPEN = 1, PREPARED = 2, COMMITTED = 3, ABORTED = 4};
- int state;
-
- class TestTransactionContext : public TPCTransactionContext{
- MockTransactionalStore* store;
- public:
- TestTransactionContext(MockTransactionalStore* _store) : store(_store) {}
- void prepare(){
- if(!store->isOpen()) throw "txn already completed";
- store->state = PREPARED;
- }
-
- void commit(){
- if(!store->isOpen() && !store->isPrepared()) throw "txn already completed";
- store->state = COMMITTED;
- }
-
- void abort(){
- if(!store->isOpen() && !store->isPrepared()) throw "txn already completed";
- store->state = ABORTED;
- }
- ~TestTransactionContext(){}
- };
-
-public:
- MockTransactionalStore() :
- BEGIN("BEGIN"), BEGIN2PC("BEGIN2PC"), PREPARE("PREPARE"), COMMIT("COMMIT"), ABORT("ABORT"), state(OPEN){}
-
- void collectPreparedXids(std::set<std::string>&)
- {
- throw "Operation not supported";
- }
-
- std::auto_ptr<TPCTransactionContext> begin(const std::string&){
- actual.push_back(BEGIN2PC);
- std::auto_ptr<TPCTransactionContext> txn(new TestTransactionContext(this));
- return txn;
- }
- std::auto_ptr<TransactionContext> begin(){
- actual.push_back(BEGIN);
- std::auto_ptr<TransactionContext> txn(new TestTransactionContext(this));
- return txn;
- }
- void prepare(TPCTransactionContext& ctxt){
- actual.push_back(PREPARE);
- dynamic_cast<TestTransactionContext&>(ctxt).prepare();
- }
- void commit(TransactionContext& ctxt){
- actual.push_back(COMMIT);
- dynamic_cast<TestTransactionContext&>(ctxt).commit();
- }
- void abort(TransactionContext& ctxt){
- actual.push_back(ABORT);
- dynamic_cast<TestTransactionContext&>(ctxt).abort();
- }
- MockTransactionalStore& expectBegin(){
- expected.push_back(BEGIN);
- return *this;
- }
- MockTransactionalStore& expectBegin2PC(){
- expected.push_back(BEGIN2PC);
- return *this;
- }
- MockTransactionalStore& expectPrepare(){
- expected.push_back(PREPARE);
- return *this;
- }
- MockTransactionalStore& expectCommit(){
- expected.push_back(COMMIT);
- return *this;
- }
- MockTransactionalStore& expectAbort(){
- expected.push_back(ABORT);
- return *this;
- }
- void check(){
- assertEqualVector(expected, actual);
- }
-
- bool isPrepared(){
- return state == PREPARED;
- }
-
- bool isCommitted(){
- return state == COMMITTED;
- }
-
- bool isAborted(){
- return state == ABORTED;
- }
-
- bool isOpen() const{
- return state == OPEN;
- }
- ~MockTransactionalStore(){}
-};
-
-}} // namespace qpid::tests
-
-#endif
diff --git a/cpp/src/tests/TxPublishTest.cpp b/cpp/src/tests/TxPublishTest.cpp
deleted file mode 100644
index 210abf0a5b..0000000000
--- a/cpp/src/tests/TxPublishTest.cpp
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- *
- * 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.
- *
- */
-#include "qpid/broker/NullMessageStore.h"
-#include "qpid/broker/RecoveryManager.h"
-#include "qpid/broker/TxPublish.h"
-#include "unit_test.h"
-#include <iostream>
-#include <list>
-#include <vector>
-#include "MessageUtils.h"
-#include "TestMessageStore.h"
-
-using std::list;
-using std::pair;
-using std::vector;
-using boost::intrusive_ptr;
-using namespace qpid::broker;
-using namespace qpid::framing;
-
-namespace qpid {
-namespace tests {
-
-struct TxPublishTest
-{
-
- TestMessageStore store;
- Queue::shared_ptr queue1;
- Queue::shared_ptr queue2;
- intrusive_ptr<Message> msg;
- TxPublish op;
-
- TxPublishTest() :
- queue1(new Queue("queue1", false, &store, 0)),
- queue2(new Queue("queue2", false, &store, 0)),
- msg(MessageUtils::createMessage("exchange", "routing_key", false, "id")),
- op(msg)
- {
- msg->getProperties<DeliveryProperties>()->setDeliveryMode(PERSISTENT);
- op.deliverTo(queue1);
- op.deliverTo(queue2);
- }
-};
-
-
-QPID_AUTO_TEST_SUITE(TxPublishTestSuite)
-
-QPID_AUTO_TEST_CASE(testPrepare)
-{
- TxPublishTest t;
-
- intrusive_ptr<PersistableMessage> pmsg = boost::static_pointer_cast<PersistableMessage>(t.msg);
- //ensure messages are enqueued in store
- t.op.prepare(0);
- BOOST_CHECK_EQUAL((size_t) 2, t.store.enqueued.size());
- BOOST_CHECK_EQUAL(string("queue1"), t.store.enqueued[0].first);
- BOOST_CHECK_EQUAL(pmsg, t.store.enqueued[0].second);
- BOOST_CHECK_EQUAL(string("queue2"), t.store.enqueued[1].first);
- BOOST_CHECK_EQUAL(pmsg, t.store.enqueued[1].second);
- BOOST_CHECK_EQUAL( true, ( boost::static_pointer_cast<PersistableMessage>(t.msg))->isIngressComplete());
-}
-
-QPID_AUTO_TEST_CASE(testCommit)
-{
- TxPublishTest t;
-
- //ensure messages are delivered to queue
- t.op.prepare(0);
- t.op.commit();
- BOOST_CHECK_EQUAL((uint32_t) 1, t.queue1->getMessageCount());
- intrusive_ptr<Message> msg_dequeue = t.queue1->get().payload;
-
- BOOST_CHECK_EQUAL( true, (boost::static_pointer_cast<PersistableMessage>(msg_dequeue))->isIngressComplete());
- BOOST_CHECK_EQUAL(t.msg, msg_dequeue);
-
- BOOST_CHECK_EQUAL((uint32_t) 1, t.queue2->getMessageCount());
- BOOST_CHECK_EQUAL(t.msg, t.queue2->get().payload);
-}
-
-QPID_AUTO_TEST_SUITE_END()
-
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/Url.cpp b/cpp/src/tests/Url.cpp
deleted file mode 100644
index 234a62ee91..0000000000
--- a/cpp/src/tests/Url.cpp
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- *
- * 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 "qpid/Url.h"
-#include <boost/assign.hpp>
-
-using namespace std;
-using namespace qpid;
-using namespace boost::assign;
-
-namespace qpid {
-namespace tests {
-
-QPID_AUTO_TEST_SUITE(UrlTestSuite)
-
-#define URL_CHECK_STR(STR) BOOST_CHECK_EQUAL(Url(STR).str(), STR)
-#define URL_CHECK_INVALID(STR) BOOST_CHECK_THROW(Url(STR), Url::Invalid)
-
-QPID_AUTO_TEST_CASE(TestParseTcp) {
- URL_CHECK_STR("amqp:tcp:host:42");
- URL_CHECK_STR("amqp:tcp:host-._~%ff%23:42"); // unreserved chars and pct encoded hex.
- // Check defaults
- BOOST_CHECK_EQUAL(Url("amqp:host:42").str(), "amqp:tcp:host:42");
- BOOST_CHECK_EQUAL(Url("amqp:tcp:host").str(), "amqp:tcp:host:5672");
- BOOST_CHECK_EQUAL(Url("host").str(), "amqp:tcp:host:5672");
-}
-
-QPID_AUTO_TEST_CASE(TestParseInvalid) {
- //host is required:
- URL_CHECK_INVALID("amqp:tcp:");
- URL_CHECK_INVALID("amqp:");
- URL_CHECK_INVALID("amqp::42");
- URL_CHECK_INVALID("");
-
- // Port must be numeric
- URL_CHECK_INVALID("host:badPort");
-}
-
-QPID_AUTO_TEST_CASE(TestParseXyz) {
- Url::addProtocol("xyz");
- URL_CHECK_STR("amqp:xyz:host:123");
- BOOST_CHECK_EQUAL(Url("xyz:host").str(), "amqp:xyz:host:5672");
-}
-
-QPID_AUTO_TEST_CASE(TestParseMultiAddress) {
- Url::addProtocol("xyz");
- URL_CHECK_STR("amqp:tcp:host:0,xyz:foo:123,tcp:foo:0,xyz:bar:1");
- URL_CHECK_STR("amqp:xyz:foo:222,tcp:foo:0");
- URL_CHECK_INVALID("amqp:tcp:h:0,");
- URL_CHECK_INVALID(",amqp:tcp:h");
-}
-
-QPID_AUTO_TEST_CASE(TestParseUserPass) {
- URL_CHECK_STR("amqp:user/pass@tcp:host:123");
- URL_CHECK_STR("amqp:user@tcp:host:123");
- BOOST_CHECK_EQUAL(Url("user/pass@host").str(), "amqp:user/pass@tcp:host:5672");
- BOOST_CHECK_EQUAL(Url("user@host").str(), "amqp:user@tcp:host:5672");
-
- Url u("user/pass@host");
- BOOST_CHECK_EQUAL(u.getUser(), "user");
- BOOST_CHECK_EQUAL(u.getPass(), "pass");
- Url v("foo@host");
- BOOST_CHECK_EQUAL(v.getUser(), "foo");
- BOOST_CHECK_EQUAL(v.getPass(), "");
- u = v;
- BOOST_CHECK_EQUAL(u.getUser(), "foo");
- BOOST_CHECK_EQUAL(u.getPass(), "");
-}
-
-QPID_AUTO_TEST_SUITE_END()
-
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/Uuid.cpp b/cpp/src/tests/Uuid.cpp
deleted file mode 100644
index 0195455ca3..0000000000
--- a/cpp/src/tests/Uuid.cpp
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- *
- * 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 "qpid/framing/Uuid.h"
-#include "qpid/framing/Buffer.h"
-#include "qpid/types/Uuid.h"
-#include "qpid/sys/alloca.h"
-
-#include "unit_test.h"
-
-#include <set>
-
-namespace qpid {
-namespace tests {
-
-QPID_AUTO_TEST_SUITE(UuidTestSuite)
-
-using namespace std;
-using namespace qpid::framing;
-
-struct UniqueSet : public std::set<Uuid> {
- void operator()(const Uuid& uuid) {
- BOOST_REQUIRE(find(uuid) == end());
- insert(uuid);
- }
-};
-
-QPID_AUTO_TEST_CASE(testUuidCtor) {
- // Uniqueness
- boost::array<Uuid,1000> uuids;
- for_each(uuids.begin(), uuids.end(), mem_fun_ref(&Uuid::generate));
- UniqueSet unique;
- for_each(uuids.begin(), uuids.end(), unique);
-}
-
-boost::array<uint8_t, 16> sample = {{'\x1b', '\x4e', '\x28', '\xba', '\x2f', '\xa1', '\x11', '\xd2', '\x88', '\x3f', '\xb9', '\xa7', '\x61', '\xbd', '\xe3', '\xfb'}};
-const string sampleStr("1b4e28ba-2fa1-11d2-883f-b9a761bde3fb");
-const string zeroStr("00000000-0000-0000-0000-000000000000");
-
-QPID_AUTO_TEST_CASE(testUuidIstream) {
- Uuid uuid;
- istringstream in(sampleStr);
- in >> uuid;
- BOOST_CHECK(!in.fail());
- BOOST_CHECK(uuid == sample);
-
- istringstream is(zeroStr);
- Uuid zero;
- is >> zero;
- BOOST_CHECK(!in.fail());
- BOOST_CHECK_EQUAL(zero, Uuid());
-}
-
-QPID_AUTO_TEST_CASE(testUuidOstream) {
- Uuid uuid(sample.c_array());
- ostringstream out;
- out << uuid;
- BOOST_CHECK(out.good());
- BOOST_CHECK_EQUAL(out.str(), sampleStr);
-
- ostringstream os;
- os << Uuid();
- BOOST_CHECK(out.good());
- BOOST_CHECK_EQUAL(os.str(), zeroStr);
-}
-
-QPID_AUTO_TEST_CASE(testUuidIOstream) {
- Uuid a(true), b(true);
- ostringstream os;
- os << a << endl << b;
- Uuid aa, bb;
- istringstream is(os.str());
- is >> aa >> ws >> bb;
- BOOST_CHECK(os.good());
- BOOST_CHECK_EQUAL(a, aa);
- BOOST_CHECK_EQUAL(b, bb);
-}
-
-QPID_AUTO_TEST_CASE(testUuidEncodeDecode) {
- char* buff = static_cast<char*>(::alloca(Uuid::size()));
- Buffer wbuf(buff, Uuid::size());
- Uuid uuid(sample.c_array());
- uuid.encode(wbuf);
-
- Buffer rbuf(buff, Uuid::size());
- Uuid decoded;
- decoded.decode(rbuf);
- BOOST_CHECK_EQUAL(string(sample.begin(), sample.end()),
- string(decoded.begin(), decoded.end()));
-}
-
-QPID_AUTO_TEST_CASE(testTypesUuid)
-{
- //tests for the Uuid class in the types namespace (introduced
- //to avoid pulling in dependencies from framing)
- types::Uuid a;
- types::Uuid b(true);
- types::Uuid c(true);
- types::Uuid d(b);
- types::Uuid e;
- e = c;
-
- BOOST_CHECK(!a);
- BOOST_CHECK(b);
-
- BOOST_CHECK(a != b);
- BOOST_CHECK(b != c);
-
- BOOST_CHECK_EQUAL(b, d);
- BOOST_CHECK_EQUAL(c, e);
-
- ostringstream out;
- out << b;
- istringstream in(out.str());
- in >> a;
- BOOST_CHECK(!in.fail());
- BOOST_CHECK_EQUAL(a, b);
-}
-
-QPID_AUTO_TEST_SUITE_END()
-
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/Variant.cpp b/cpp/src/tests/Variant.cpp
deleted file mode 100644
index 40f1c0cf75..0000000000
--- a/cpp/src/tests/Variant.cpp
+++ /dev/null
@@ -1,775 +0,0 @@
-/*
- *
- * 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.
- *
- */
-#include <iostream>
-#include "qpid/types/Variant.h"
-#include "qpid/amqp_0_10/Codecs.h"
-
-#include "unit_test.h"
-
-using namespace qpid::types;
-using namespace qpid::amqp_0_10;
-
-namespace qpid {
-namespace tests {
-
-QPID_AUTO_TEST_SUITE(VariantSuite)
-
-QPID_AUTO_TEST_CASE(testConversions)
-{
- Variant value;
-
- //string to float/double
- value = "1.5";
- BOOST_CHECK_EQUAL((float) 1.5, value.asFloat());
- BOOST_CHECK_EQUAL((double) 1.5, value.asDouble());
-
- //float to string or double
- value = 1.5f;
- BOOST_CHECK_EQUAL((float) 1.5, value.asFloat());
- BOOST_CHECK_EQUAL((double) 1.5, value.asDouble());
- BOOST_CHECK_EQUAL(std::string("1.5"), value.asString());
-
- //double to string (conversion to float not valid)
- value = 1.5;
- BOOST_CHECK_THROW(value.asFloat(), InvalidConversion);
- BOOST_CHECK_EQUAL((double) 1.5, value.asDouble());
- BOOST_CHECK_EQUAL(std::string("1.5"), value.asString());
-
- //uint8 to larger unsigned ints and string
- value = (uint8_t) 7;
- BOOST_CHECK_EQUAL((uint8_t) 7, value.asUint8());
- BOOST_CHECK_EQUAL((uint16_t) 7, value.asUint16());
- BOOST_CHECK_EQUAL((uint32_t) 7, value.asUint32());
- BOOST_CHECK_EQUAL((uint64_t) 7, value.asUint64());
- BOOST_CHECK_EQUAL(std::string("7"), value.asString());
-
- value = (uint16_t) 8;
- BOOST_CHECK_EQUAL(std::string("8"), value.asString());
- value = (uint32_t) 9;
- BOOST_CHECK_EQUAL(std::string("9"), value.asString());
-
- //uint32 to larger unsigned ints and string
- value = (uint32_t) 9999999;
- BOOST_CHECK_EQUAL((uint32_t) 9999999, value.asUint32());
- BOOST_CHECK_EQUAL((uint64_t) 9999999, value.asUint64());
- BOOST_CHECK_EQUAL(std::string("9999999"), value.asString());
- BOOST_CHECK_THROW(value.asUint8(), InvalidConversion);
- BOOST_CHECK_THROW(value.asUint16(), InvalidConversion);
-
- value = "true";
- BOOST_CHECK(value.asBool());
- value = "false";
- BOOST_CHECK(!value.asBool());
- value = "1";
- BOOST_CHECK(value.asBool());
- value = "0";
- BOOST_CHECK(!value.asBool());
- value = "other";
- BOOST_CHECK_THROW(value.asBool(), InvalidConversion);
-}
-
-QPID_AUTO_TEST_CASE(testConversionsFromString)
-{
- Variant value;
- value = "5";
- BOOST_CHECK_EQUAL(5, value.asInt16());
- BOOST_CHECK_EQUAL(5u, value.asUint16());
-
- value = "-5";
- BOOST_CHECK_EQUAL(-5, value.asInt16());
- BOOST_CHECK_THROW(value.asUint16(), InvalidConversion);
-
- value = "18446744073709551615";
- BOOST_CHECK_EQUAL(18446744073709551615ull, value.asUint64());
- BOOST_CHECK_THROW(value.asInt64(), InvalidConversion);
-
- value = "9223372036854775808";
- BOOST_CHECK_EQUAL(9223372036854775808ull, value.asUint64());
- BOOST_CHECK_THROW(value.asInt64(), InvalidConversion);
-
- value = "-9223372036854775809";
- BOOST_CHECK_THROW(value.asUint64(), InvalidConversion);
- BOOST_CHECK_THROW(value.asInt64(), InvalidConversion);
-
- value = "2147483648";
- BOOST_CHECK_EQUAL(2147483648ul, value.asUint32());
- BOOST_CHECK_THROW(value.asInt32(), InvalidConversion);
-
- value = "-2147483649";
- BOOST_CHECK_THROW(value.asUint32(), InvalidConversion);
- BOOST_CHECK_THROW(value.asInt32(), InvalidConversion);
-
- value = "32768";
- BOOST_CHECK_EQUAL(32768u, value.asUint16());
- BOOST_CHECK_THROW(value.asInt16(), InvalidConversion);
-
- value = "-32769";
- BOOST_CHECK_THROW(value.asUint16(), InvalidConversion);
- BOOST_CHECK_THROW(value.asInt16(), InvalidConversion);
-
- value = "-2.5";
- BOOST_CHECK_EQUAL(-2.5, value.asFloat());
-
- value = "-0.875432e10";
- BOOST_CHECK_EQUAL(-0.875432e10, value.asDouble());
-
- value = "-0";
- BOOST_CHECK_EQUAL(0, value.asInt16());
- BOOST_CHECK_EQUAL(0u, value.asUint16());
-
- value = "-000";
- BOOST_CHECK_EQUAL(0, value.asInt16());
- BOOST_CHECK_EQUAL(0u, value.asUint16());
-
- value = "-0010";
- BOOST_CHECK_EQUAL(-10, value.asInt16());
- BOOST_CHECK_THROW(value.asUint16(), InvalidConversion);
-}
-
-QPID_AUTO_TEST_CASE(testSizeConversionsUint)
-{
- Variant value;
-
- //uint8 (in 7 bits) to other uints, ints
- value = (uint8_t) 7;
- BOOST_CHECK_EQUAL((uint8_t) 7, value.asUint8());
- BOOST_CHECK_EQUAL((uint16_t) 7, value.asUint16());
- BOOST_CHECK_EQUAL((uint32_t) 7, value.asUint32());
- BOOST_CHECK_EQUAL((uint64_t) 7, value.asUint64());
- BOOST_CHECK_EQUAL((int8_t) 7, value.asInt8());
- BOOST_CHECK_EQUAL((int16_t) 7, value.asInt16());
- BOOST_CHECK_EQUAL((int32_t) 7, value.asInt32());
- BOOST_CHECK_EQUAL((int64_t) 7, value.asInt64());
-
- //uint8 (in 8 bits) to other uints, ints
- value = (uint8_t) 200;
- BOOST_CHECK_EQUAL((uint8_t) 200, value.asUint8());
- BOOST_CHECK_EQUAL((uint16_t) 200, value.asUint16());
- BOOST_CHECK_EQUAL((uint32_t) 200, value.asUint32());
- BOOST_CHECK_EQUAL((uint64_t) 200, value.asUint64());
- BOOST_CHECK_THROW(value.asInt8(), InvalidConversion);
- BOOST_CHECK_EQUAL((int16_t) 200, value.asInt16());
- BOOST_CHECK_EQUAL((int32_t) 200, value.asInt32());
- BOOST_CHECK_EQUAL((int64_t) 200, value.asInt64());
-
-
-
- //uint16 (in 7 bits) to other uints, ints
- value = (uint16_t) 120;
- BOOST_CHECK_EQUAL((uint8_t) 120, value.asUint8());
- BOOST_CHECK_EQUAL((uint16_t) 120, value.asUint16());
- BOOST_CHECK_EQUAL((uint32_t) 120, value.asUint32());
- BOOST_CHECK_EQUAL((uint64_t) 120, value.asUint64());
- BOOST_CHECK_EQUAL((int8_t) 120, value.asInt8());
- BOOST_CHECK_EQUAL((int16_t) 120, value.asInt16());
- BOOST_CHECK_EQUAL((int32_t) 120, value.asInt32());
- BOOST_CHECK_EQUAL((int64_t) 120, value.asInt64());
-
- //uint16 (more than 7 bits) to other uints, ints
- value = (uint16_t) 240;
- BOOST_CHECK_EQUAL((uint8_t) 240, value.asUint8());
- BOOST_CHECK_EQUAL((uint16_t) 240, value.asUint16());
- BOOST_CHECK_EQUAL((uint32_t) 240, value.asUint32());
- BOOST_CHECK_EQUAL((uint64_t) 240, value.asUint64());
- BOOST_CHECK_THROW(value.asInt8(), InvalidConversion);
- BOOST_CHECK_EQUAL((int16_t) 240, value.asInt16());
- BOOST_CHECK_EQUAL((int32_t) 240, value.asInt32());
- BOOST_CHECK_EQUAL((int64_t) 240, value.asInt64());
-
- //uint16 (more than 8 bits) to other uints, ints
- value = (uint16_t) 1000;
- BOOST_CHECK_THROW(value.asUint8(), InvalidConversion);
- BOOST_CHECK_EQUAL((uint16_t) 1000, value.asUint16());
- BOOST_CHECK_EQUAL((uint32_t) 1000, value.asUint32());
- BOOST_CHECK_EQUAL((uint64_t) 1000, value.asUint64());
- BOOST_CHECK_THROW(value.asInt8(), InvalidConversion);
- BOOST_CHECK_EQUAL((int16_t) 1000, value.asInt16());
- BOOST_CHECK_EQUAL((int32_t) 1000, value.asInt32());
- BOOST_CHECK_EQUAL((int64_t) 1000, value.asInt64());
-
- //uint16 (more than 15 bits) to other uints, ints
- value = (uint16_t) 32770;
- BOOST_CHECK_THROW(value.asUint8(), InvalidConversion);
- BOOST_CHECK_EQUAL((uint16_t) 32770, value.asUint16());
- BOOST_CHECK_EQUAL((uint32_t) 32770, value.asUint32());
- BOOST_CHECK_EQUAL((uint64_t) 32770, value.asUint64());
- BOOST_CHECK_THROW(value.asInt8(), InvalidConversion);
- BOOST_CHECK_THROW(value.asInt16(), InvalidConversion);
- BOOST_CHECK_EQUAL((int32_t) 32770, value.asInt32());
- BOOST_CHECK_EQUAL((int64_t) 32770, value.asInt64());
-
-
-
- //uint32 (in 7 bits) to other uints, ints
- value = (uint32_t) 120;
- BOOST_CHECK_EQUAL((uint8_t) 120, value.asUint8());
- BOOST_CHECK_EQUAL((uint16_t) 120, value.asUint16());
- BOOST_CHECK_EQUAL((uint32_t) 120, value.asUint32());
- BOOST_CHECK_EQUAL((uint64_t) 120, value.asUint64());
- BOOST_CHECK_EQUAL((int8_t) 120, value.asInt8());
- BOOST_CHECK_EQUAL((int16_t) 120, value.asInt16());
- BOOST_CHECK_EQUAL((int32_t) 120, value.asInt32());
- BOOST_CHECK_EQUAL((int64_t) 120, value.asInt64());
-
- //uint32 (more than 7 bits) to other uints, ints
- value = (uint32_t) 240;
- BOOST_CHECK_EQUAL((uint8_t) 240, value.asUint8());
- BOOST_CHECK_EQUAL((uint16_t) 240, value.asUint16());
- BOOST_CHECK_EQUAL((uint32_t) 240, value.asUint32());
- BOOST_CHECK_EQUAL((uint64_t) 240, value.asUint64());
- BOOST_CHECK_THROW(value.asInt8(), InvalidConversion);
- BOOST_CHECK_EQUAL((int16_t) 240, value.asInt16());
- BOOST_CHECK_EQUAL((int32_t) 240, value.asInt32());
- BOOST_CHECK_EQUAL((int64_t) 240, value.asInt64());
-
- //uint32 (more than 8 bits) to other uints, ints
- value = (uint32_t) 1000;
- BOOST_CHECK_THROW(value.asUint8(), InvalidConversion);
- BOOST_CHECK_EQUAL((uint16_t) 1000, value.asUint16());
- BOOST_CHECK_EQUAL((uint32_t) 1000, value.asUint32());
- BOOST_CHECK_EQUAL((uint64_t) 1000, value.asUint64());
- BOOST_CHECK_THROW(value.asInt8(), InvalidConversion);
- BOOST_CHECK_EQUAL((int16_t) 1000, value.asInt16());
- BOOST_CHECK_EQUAL((int32_t) 1000, value.asInt32());
- BOOST_CHECK_EQUAL((int64_t) 1000, value.asInt64());
-
- //uint32 (more than 15 bits) to other uints, ints
- value = (uint32_t) 32770;
- BOOST_CHECK_THROW(value.asUint8(), InvalidConversion);
- BOOST_CHECK_EQUAL((uint16_t) 32770, value.asUint16());
- BOOST_CHECK_EQUAL((uint32_t) 32770, value.asUint32());
- BOOST_CHECK_EQUAL((uint64_t) 32770, value.asUint64());
- BOOST_CHECK_THROW(value.asInt8(), InvalidConversion);
- BOOST_CHECK_THROW(value.asInt16(), InvalidConversion);
- BOOST_CHECK_EQUAL((int32_t) 32770, value.asInt32());
- BOOST_CHECK_EQUAL((int64_t) 32770, value.asInt64());
-
- //uint32 (more than 16 bits) to other uints, ints
- value = (uint32_t) 66000;
- BOOST_CHECK_THROW(value.asUint8(), InvalidConversion);
- BOOST_CHECK_THROW(value.asUint16(), InvalidConversion);
- BOOST_CHECK_EQUAL((uint32_t) 66000, value.asUint32());
- BOOST_CHECK_EQUAL((uint64_t) 66000, value.asUint64());
- BOOST_CHECK_THROW(value.asInt8(), InvalidConversion);
- BOOST_CHECK_THROW(value.asInt16(), InvalidConversion);
- BOOST_CHECK_EQUAL((int32_t) 66000, value.asInt32());
- BOOST_CHECK_EQUAL((int64_t) 66000, value.asInt64());
-
-
-
- //uint64 (in 7 bits) to other uints, ints
- value = (uint64_t) 120;
- BOOST_CHECK_EQUAL((uint8_t) 120, value.asUint8());
- BOOST_CHECK_EQUAL((uint16_t) 120, value.asUint16());
- BOOST_CHECK_EQUAL((uint32_t) 120, value.asUint32());
- BOOST_CHECK_EQUAL((uint64_t) 120, value.asUint64());
- BOOST_CHECK_EQUAL((int8_t) 120, value.asInt8());
- BOOST_CHECK_EQUAL((int16_t) 120, value.asInt16());
- BOOST_CHECK_EQUAL((int32_t) 120, value.asInt32());
- BOOST_CHECK_EQUAL((int64_t) 120, value.asInt64());
-
- //uint64 (more than 7 bits) to other uints, ints
- value = (uint64_t) 240;
- BOOST_CHECK_EQUAL((uint8_t) 240, value.asUint8());
- BOOST_CHECK_EQUAL((uint16_t) 240, value.asUint16());
- BOOST_CHECK_EQUAL((uint32_t) 240, value.asUint32());
- BOOST_CHECK_EQUAL((uint64_t) 240, value.asUint64());
- BOOST_CHECK_THROW(value.asInt8(), InvalidConversion);
- BOOST_CHECK_EQUAL((int16_t) 240, value.asInt16());
- BOOST_CHECK_EQUAL((int32_t) 240, value.asInt32());
- BOOST_CHECK_EQUAL((int64_t) 240, value.asInt64());
-
- //uint64 (more than 8 bits) to other uints, ints
- value = (uint64_t) 1000;
- BOOST_CHECK_THROW(value.asUint8(), InvalidConversion);
- BOOST_CHECK_EQUAL((uint16_t) 1000, value.asUint16());
- BOOST_CHECK_EQUAL((uint32_t) 1000, value.asUint32());
- BOOST_CHECK_EQUAL((uint64_t) 1000, value.asUint64());
- BOOST_CHECK_THROW(value.asInt8(), InvalidConversion);
- BOOST_CHECK_EQUAL((int16_t) 1000, value.asInt16());
- BOOST_CHECK_EQUAL((int32_t) 1000, value.asInt32());
- BOOST_CHECK_EQUAL((int64_t) 1000, value.asInt64());
-
- //uint64 (more than 15 bits) to other uints, ints
- value = (uint64_t) 32770;
- BOOST_CHECK_THROW(value.asUint8(), InvalidConversion);
- BOOST_CHECK_EQUAL((uint16_t) 32770, value.asUint16());
- BOOST_CHECK_EQUAL((uint32_t) 32770, value.asUint32());
- BOOST_CHECK_EQUAL((uint64_t) 32770, value.asUint64());
- BOOST_CHECK_THROW(value.asInt8(), InvalidConversion);
- BOOST_CHECK_THROW(value.asInt16(), InvalidConversion);
- BOOST_CHECK_EQUAL((int32_t) 32770, value.asInt32());
- BOOST_CHECK_EQUAL((int64_t) 32770, value.asInt64());
-
- //uint64 (more than 16 bits) to other uints, ints
- value = (uint64_t) 66000;
- BOOST_CHECK_THROW(value.asUint8(), InvalidConversion);
- BOOST_CHECK_THROW(value.asUint16(), InvalidConversion);
- BOOST_CHECK_EQUAL((uint32_t) 66000, value.asUint32());
- BOOST_CHECK_EQUAL((uint64_t) 66000, value.asUint64());
- BOOST_CHECK_THROW(value.asInt8(), InvalidConversion);
- BOOST_CHECK_THROW(value.asInt16(), InvalidConversion);
- BOOST_CHECK_EQUAL((int32_t) 66000, value.asInt32());
- BOOST_CHECK_EQUAL((int64_t) 66000, value.asInt64());
-
- //uint64 (more than 31 bits) to other uints, ints
- value = (uint64_t) 3000000000ul;
- BOOST_CHECK_THROW(value.asUint8(), InvalidConversion);
- BOOST_CHECK_THROW(value.asUint16(), InvalidConversion);
- BOOST_CHECK_EQUAL((uint32_t) 3000000000ul, value.asUint32());
- BOOST_CHECK_EQUAL((uint64_t) 3000000000ul, value.asUint64());
- BOOST_CHECK_THROW(value.asInt8(), InvalidConversion);
- BOOST_CHECK_THROW(value.asInt16(), InvalidConversion);
- BOOST_CHECK_THROW(value.asInt32(), InvalidConversion);
- BOOST_CHECK_EQUAL((int64_t) 3000000000ul, value.asInt64());
-
- //uint64 (more than 32 bits) to other uints, ints
- value = (uint64_t) 7000000000ull;
- BOOST_CHECK_THROW(value.asUint8(), InvalidConversion);
- BOOST_CHECK_THROW(value.asUint16(), InvalidConversion);
- BOOST_CHECK_THROW(value.asUint32(), InvalidConversion);
- BOOST_CHECK_EQUAL((uint64_t) 7000000000ull, value.asUint64());
- BOOST_CHECK_THROW(value.asInt8(), InvalidConversion);
- BOOST_CHECK_THROW(value.asInt16(), InvalidConversion);
- BOOST_CHECK_THROW(value.asInt32(), InvalidConversion);
- BOOST_CHECK_EQUAL((int64_t) 7000000000ull, value.asInt64());
-
- //uint64 (more than 63 bits) to other uints, ints
- value = (uint64_t) 0x8000000000000000ull;
- BOOST_CHECK_THROW(value.asUint8(), InvalidConversion);
- BOOST_CHECK_THROW(value.asUint16(), InvalidConversion);
- BOOST_CHECK_THROW(value.asUint32(), InvalidConversion);
- BOOST_CHECK_EQUAL((uint64_t) 0x8000000000000000ull, value.asUint64());
- BOOST_CHECK_THROW(value.asInt8(), InvalidConversion);
- BOOST_CHECK_THROW(value.asInt16(), InvalidConversion);
- BOOST_CHECK_THROW(value.asInt32(), InvalidConversion);
- BOOST_CHECK_THROW(value.asInt64(), InvalidConversion);
-}
-
-QPID_AUTO_TEST_CASE(testSizeConversionsInt)
-{
- Variant value;
-
- //int8 (positive in 7 bits)
- value = (int8_t) 100;
- BOOST_CHECK_EQUAL((uint8_t) 100, value.asUint8());
- BOOST_CHECK_EQUAL((uint16_t) 100, value.asUint16());
- BOOST_CHECK_EQUAL((uint32_t) 100, value.asUint32());
- BOOST_CHECK_EQUAL((uint64_t) 100, value.asUint64());
- BOOST_CHECK_EQUAL((int8_t) 100, value.asInt8());
- BOOST_CHECK_EQUAL((int16_t) 100, value.asInt16());
- BOOST_CHECK_EQUAL((int32_t) 100, value.asInt32());
- BOOST_CHECK_EQUAL((int64_t) 100, value.asInt64());
-
- //int8 (negative)
- value = (int8_t) -100;
- BOOST_CHECK_THROW(value.asUint8(), InvalidConversion);
- BOOST_CHECK_THROW(value.asUint16(), InvalidConversion);
- BOOST_CHECK_THROW(value.asUint32(), InvalidConversion);
- BOOST_CHECK_THROW(value.asUint64(), InvalidConversion);
- BOOST_CHECK_EQUAL((int8_t) -100, value.asInt8());
- BOOST_CHECK_EQUAL((int16_t) -100, value.asInt16());
- BOOST_CHECK_EQUAL((int32_t) -100, value.asInt32());
- BOOST_CHECK_EQUAL((int64_t) -100, value.asInt64());
-
-
-
- //int16 (positive in 7 bits)
- value = (int16_t) 100;
- BOOST_CHECK_EQUAL((uint8_t) 100, value.asUint8());
- BOOST_CHECK_EQUAL((uint16_t) 100, value.asUint16());
- BOOST_CHECK_EQUAL((uint32_t) 100, value.asUint32());
- BOOST_CHECK_EQUAL((uint64_t) 100, value.asUint64());
- BOOST_CHECK_EQUAL((int8_t) 100, value.asInt8());
- BOOST_CHECK_EQUAL((int16_t) 100, value.asInt16());
- BOOST_CHECK_EQUAL((int32_t) 100, value.asInt32());
- BOOST_CHECK_EQUAL((int64_t) 100, value.asInt64());
-
- //int16 (positive in 8 bits)
- value = (int16_t) 200;
- BOOST_CHECK_EQUAL((uint8_t) 200, value.asUint8());
- BOOST_CHECK_EQUAL((uint16_t) 200, value.asUint16());
- BOOST_CHECK_EQUAL((uint32_t) 200, value.asUint32());
- BOOST_CHECK_EQUAL((uint64_t) 200, value.asUint64());
- BOOST_CHECK_THROW(value.asInt8(), InvalidConversion);
- BOOST_CHECK_EQUAL((int16_t) 200, value.asInt16());
- BOOST_CHECK_EQUAL((int32_t) 200, value.asInt32());
- BOOST_CHECK_EQUAL((int64_t) 200, value.asInt64());
-
- //int16 (positive in more than 8 bits)
- value = (int16_t) 1000;
- BOOST_CHECK_THROW(value.asUint8(), InvalidConversion);
- BOOST_CHECK_EQUAL((uint16_t) 1000, value.asUint16());
- BOOST_CHECK_EQUAL((uint32_t) 1000, value.asUint32());
- BOOST_CHECK_EQUAL((uint64_t) 1000, value.asUint64());
- BOOST_CHECK_THROW(value.asInt8(), InvalidConversion);
- BOOST_CHECK_EQUAL((int16_t) 1000, value.asInt16());
- BOOST_CHECK_EQUAL((int32_t) 1000, value.asInt32());
- BOOST_CHECK_EQUAL((int64_t) 1000, value.asInt64());
-
- //int16 (negative in 7 bits)
- value = (int16_t) -100;
- BOOST_CHECK_THROW(value.asUint8(), InvalidConversion);
- BOOST_CHECK_THROW(value.asUint16(), InvalidConversion);
- BOOST_CHECK_THROW(value.asUint32(), InvalidConversion);
- BOOST_CHECK_THROW(value.asUint64(), InvalidConversion);
- BOOST_CHECK_EQUAL((int8_t) -100, value.asInt8());
- BOOST_CHECK_EQUAL((int16_t) -100, value.asInt16());
- BOOST_CHECK_EQUAL((int32_t) -100, value.asInt32());
- BOOST_CHECK_EQUAL((int64_t) -100, value.asInt64());
-
- //int16 (negative in more than 7 bits)
- value = (int16_t) -1000;
- BOOST_CHECK_THROW(value.asUint8(), InvalidConversion);
- BOOST_CHECK_THROW(value.asUint16(), InvalidConversion);
- BOOST_CHECK_THROW(value.asUint32(), InvalidConversion);
- BOOST_CHECK_THROW(value.asUint64(), InvalidConversion);
- BOOST_CHECK_THROW(value.asInt8(), InvalidConversion);
- BOOST_CHECK_EQUAL((int16_t) -1000, value.asInt16());
- BOOST_CHECK_EQUAL((int32_t) -1000, value.asInt32());
- BOOST_CHECK_EQUAL((int64_t) -1000, value.asInt64());
-
-
-
- //int32 (positive in 7 bits)
- value = (int32_t) 100;
- BOOST_CHECK_EQUAL((uint8_t) 100, value.asUint8());
- BOOST_CHECK_EQUAL((uint16_t) 100, value.asUint16());
- BOOST_CHECK_EQUAL((uint32_t) 100, value.asUint32());
- BOOST_CHECK_EQUAL((uint64_t) 100, value.asUint64());
- BOOST_CHECK_EQUAL((int8_t) 100, value.asInt8());
- BOOST_CHECK_EQUAL((int16_t) 100, value.asInt16());
- BOOST_CHECK_EQUAL((int32_t) 100, value.asInt32());
- BOOST_CHECK_EQUAL((int64_t) 100, value.asInt64());
-
- //int32 (positive in 8 bits)
- value = (int32_t) 200;
- BOOST_CHECK_EQUAL((uint8_t) 200, value.asUint8());
- BOOST_CHECK_EQUAL((uint16_t) 200, value.asUint16());
- BOOST_CHECK_EQUAL((uint32_t) 200, value.asUint32());
- BOOST_CHECK_EQUAL((uint64_t) 200, value.asUint64());
- BOOST_CHECK_THROW(value.asInt8(), InvalidConversion);
- BOOST_CHECK_EQUAL((int16_t) 200, value.asInt16());
- BOOST_CHECK_EQUAL((int32_t) 200, value.asInt32());
- BOOST_CHECK_EQUAL((int64_t) 200, value.asInt64());
-
- //int32 (positive in more than 8 bits)
- value = (int32_t) 1000;
- BOOST_CHECK_THROW(value.asUint8(), InvalidConversion);
- BOOST_CHECK_EQUAL((uint16_t) 1000, value.asUint16());
- BOOST_CHECK_EQUAL((uint32_t) 1000, value.asUint32());
- BOOST_CHECK_EQUAL((uint64_t) 1000, value.asUint64());
- BOOST_CHECK_THROW(value.asInt8(), InvalidConversion);
- BOOST_CHECK_EQUAL((int16_t) 1000, value.asInt16());
- BOOST_CHECK_EQUAL((int32_t) 1000, value.asInt32());
- BOOST_CHECK_EQUAL((int64_t) 1000, value.asInt64());
-
- //int32 (positive in more than 15 bits)
- value = (int32_t) 40000;
- BOOST_CHECK_THROW(value.asUint8(), InvalidConversion);
- BOOST_CHECK_EQUAL((uint16_t) 40000, value.asUint16());
- BOOST_CHECK_EQUAL((uint32_t) 40000, value.asUint32());
- BOOST_CHECK_EQUAL((uint64_t) 40000, value.asUint64());
- BOOST_CHECK_THROW(value.asInt8(), InvalidConversion);
- BOOST_CHECK_THROW(value.asInt16(), InvalidConversion);
- BOOST_CHECK_EQUAL((int32_t) 40000, value.asInt32());
- BOOST_CHECK_EQUAL((int64_t) 40000, value.asInt64());
-
- //int32 (negative in 7 bits)
- value = (int32_t) -100;
- BOOST_CHECK_THROW(value.asUint8(), InvalidConversion);
- BOOST_CHECK_THROW(value.asUint16(), InvalidConversion);
- BOOST_CHECK_THROW(value.asUint32(), InvalidConversion);
- BOOST_CHECK_THROW(value.asUint64(), InvalidConversion);
- BOOST_CHECK_EQUAL((int8_t) -100, value.asInt8());
- BOOST_CHECK_EQUAL((int16_t) -100, value.asInt16());
- BOOST_CHECK_EQUAL((int32_t) -100, value.asInt32());
- BOOST_CHECK_EQUAL((int64_t) -100, value.asInt64());
-
- //int32 (negative in more than 7 bits)
- value = (int32_t) -1000;
- BOOST_CHECK_THROW(value.asUint8(), InvalidConversion);
- BOOST_CHECK_THROW(value.asUint16(), InvalidConversion);
- BOOST_CHECK_THROW(value.asUint32(), InvalidConversion);
- BOOST_CHECK_THROW(value.asUint64(), InvalidConversion);
- BOOST_CHECK_THROW(value.asInt8(), InvalidConversion);
- BOOST_CHECK_EQUAL((int16_t) -1000, value.asInt16());
- BOOST_CHECK_EQUAL((int32_t) -1000, value.asInt32());
- BOOST_CHECK_EQUAL((int64_t) -1000, value.asInt64());
-
- //int32 (negative in more than 15 bits)
- value = (int32_t) -40000;
- BOOST_CHECK_THROW(value.asUint8(), InvalidConversion);
- BOOST_CHECK_THROW(value.asUint16(), InvalidConversion);
- BOOST_CHECK_THROW(value.asUint32(), InvalidConversion);
- BOOST_CHECK_THROW(value.asUint64(), InvalidConversion);
- BOOST_CHECK_THROW(value.asInt8(), InvalidConversion);
- BOOST_CHECK_THROW(value.asInt16(), InvalidConversion);
- BOOST_CHECK_EQUAL((int32_t) -40000, value.asInt32());
- BOOST_CHECK_EQUAL((int64_t) -40000, value.asInt64());
-
-
-
- //int64 (positive in 7 bits)
- value = (int64_t) 100;
- BOOST_CHECK_EQUAL((uint8_t) 100, value.asUint8());
- BOOST_CHECK_EQUAL((uint16_t) 100, value.asUint16());
- BOOST_CHECK_EQUAL((uint32_t) 100, value.asUint32());
- BOOST_CHECK_EQUAL((uint64_t) 100, value.asUint64());
- BOOST_CHECK_EQUAL((int8_t) 100, value.asInt8());
- BOOST_CHECK_EQUAL((int16_t) 100, value.asInt16());
- BOOST_CHECK_EQUAL((int32_t) 100, value.asInt32());
- BOOST_CHECK_EQUAL((int64_t) 100, value.asInt64());
-
- //int64 (positive in 8 bits)
- value = (int64_t) 200;
- BOOST_CHECK_EQUAL((uint8_t) 200, value.asUint8());
- BOOST_CHECK_EQUAL((uint16_t) 200, value.asUint16());
- BOOST_CHECK_EQUAL((uint32_t) 200, value.asUint32());
- BOOST_CHECK_EQUAL((uint64_t) 200, value.asUint64());
- BOOST_CHECK_THROW(value.asInt8(), InvalidConversion);
- BOOST_CHECK_EQUAL((int16_t) 200, value.asInt16());
- BOOST_CHECK_EQUAL((int32_t) 200, value.asInt32());
- BOOST_CHECK_EQUAL((int64_t) 200, value.asInt64());
-
- //int64 (positive in more than 8 bits)
- value = (int64_t) 1000;
- BOOST_CHECK_THROW(value.asUint8(), InvalidConversion);
- BOOST_CHECK_EQUAL((uint16_t) 1000, value.asUint16());
- BOOST_CHECK_EQUAL((uint32_t) 1000, value.asUint32());
- BOOST_CHECK_EQUAL((uint64_t) 1000, value.asUint64());
- BOOST_CHECK_THROW(value.asInt8(), InvalidConversion);
- BOOST_CHECK_EQUAL((int16_t) 1000, value.asInt16());
- BOOST_CHECK_EQUAL((int32_t) 1000, value.asInt32());
- BOOST_CHECK_EQUAL((int64_t) 1000, value.asInt64());
-
- //int64 (positive in more than 15 bits)
- value = (int64_t) 40000;
- BOOST_CHECK_THROW(value.asUint8(), InvalidConversion);
- BOOST_CHECK_EQUAL((uint16_t) 40000, value.asUint16());
- BOOST_CHECK_EQUAL((uint32_t) 40000, value.asUint32());
- BOOST_CHECK_EQUAL((uint64_t) 40000, value.asUint64());
- BOOST_CHECK_THROW(value.asInt8(), InvalidConversion);
- BOOST_CHECK_THROW(value.asInt16(), InvalidConversion);
- BOOST_CHECK_EQUAL((int32_t) 40000, value.asInt32());
- BOOST_CHECK_EQUAL((int64_t) 40000, value.asInt64());
-
- //int64 (positive in more than 31 bits)
- value = (int64_t) 3000000000ll;
- BOOST_CHECK_THROW(value.asUint8(), InvalidConversion);
- BOOST_CHECK_THROW(value.asUint16(), InvalidConversion);
- BOOST_CHECK_EQUAL((uint32_t) 3000000000ll, value.asUint32());
- BOOST_CHECK_EQUAL((uint64_t) 3000000000ll, value.asUint64());
- BOOST_CHECK_THROW(value.asInt8(), InvalidConversion);
- BOOST_CHECK_THROW(value.asInt16(), InvalidConversion);
- BOOST_CHECK_THROW(value.asInt32(), InvalidConversion);
- BOOST_CHECK_EQUAL((int64_t) 3000000000ll, value.asInt64());
-
- //int64 (positive in more than 32 bits)
- value = (int64_t) 5000000000ll;
- BOOST_CHECK_THROW(value.asUint8(), InvalidConversion);
- BOOST_CHECK_THROW(value.asUint16(), InvalidConversion);
- BOOST_CHECK_THROW(value.asUint32(), InvalidConversion);
- BOOST_CHECK_EQUAL((uint64_t) 5000000000ll, value.asUint64());
- BOOST_CHECK_THROW(value.asInt8(), InvalidConversion);
- BOOST_CHECK_THROW(value.asInt16(), InvalidConversion);
- BOOST_CHECK_THROW(value.asInt32(), InvalidConversion);
- BOOST_CHECK_EQUAL((int64_t) 5000000000ll, value.asInt64());
-
- //int64 (negative in 7 bits)
- value = (int64_t) -100;
- BOOST_CHECK_THROW(value.asUint8(), InvalidConversion);
- BOOST_CHECK_THROW(value.asUint16(), InvalidConversion);
- BOOST_CHECK_THROW(value.asUint32(), InvalidConversion);
- BOOST_CHECK_THROW(value.asUint64(), InvalidConversion);
- BOOST_CHECK_EQUAL((int8_t) -100, value.asInt8());
- BOOST_CHECK_EQUAL((int16_t) -100, value.asInt16());
- BOOST_CHECK_EQUAL((int32_t) -100, value.asInt32());
- BOOST_CHECK_EQUAL((int64_t) -100, value.asInt64());
-
- //int64 (negative in more than 7 bits)
- value = (int64_t) -1000;
- BOOST_CHECK_THROW(value.asUint8(), InvalidConversion);
- BOOST_CHECK_THROW(value.asUint16(), InvalidConversion);
- BOOST_CHECK_THROW(value.asUint32(), InvalidConversion);
- BOOST_CHECK_THROW(value.asUint64(), InvalidConversion);
- BOOST_CHECK_THROW(value.asInt8(), InvalidConversion);
- BOOST_CHECK_EQUAL((int16_t) -1000, value.asInt16());
- BOOST_CHECK_EQUAL((int32_t) -1000, value.asInt32());
- BOOST_CHECK_EQUAL((int64_t) -1000, value.asInt64());
-
- //int64 (negative in more than 15 bits)
- value = (int64_t) -40000;
- BOOST_CHECK_THROW(value.asUint8(), InvalidConversion);
- BOOST_CHECK_THROW(value.asUint16(), InvalidConversion);
- BOOST_CHECK_THROW(value.asUint32(), InvalidConversion);
- BOOST_CHECK_THROW(value.asUint64(), InvalidConversion);
- BOOST_CHECK_THROW(value.asInt8(), InvalidConversion);
- BOOST_CHECK_THROW(value.asInt16(), InvalidConversion);
- BOOST_CHECK_EQUAL((int32_t) -40000, value.asInt32());
- BOOST_CHECK_EQUAL((int64_t) -40000, value.asInt64());
-
- //int64 (negative in more than 31 bits)
- value = (int64_t) -3000000000ll;
- BOOST_CHECK_THROW(value.asUint8(), InvalidConversion);
- BOOST_CHECK_THROW(value.asUint16(), InvalidConversion);
- BOOST_CHECK_THROW(value.asUint32(), InvalidConversion);
- BOOST_CHECK_THROW(value.asUint64(), InvalidConversion);
- BOOST_CHECK_THROW(value.asInt8(), InvalidConversion);
- BOOST_CHECK_THROW(value.asInt16(), InvalidConversion);
- BOOST_CHECK_THROW(value.asInt32(), InvalidConversion);
- BOOST_CHECK_EQUAL((int64_t) -3000000000ll, value.asInt64());
-}
-
-QPID_AUTO_TEST_CASE(testAssignment)
-{
- Variant value("abc");
- Variant other = value;
- BOOST_CHECK_EQUAL(VAR_STRING, value.getType());
- BOOST_CHECK_EQUAL(other.getType(), value.getType());
- BOOST_CHECK_EQUAL(other.asString(), value.asString());
-
- const uint32_t i(1000);
- value = i;
- BOOST_CHECK_EQUAL(VAR_UINT32, value.getType());
- BOOST_CHECK_EQUAL(VAR_STRING, other.getType());
-}
-
-QPID_AUTO_TEST_CASE(testList)
-{
- const std::string s("abc");
- const float f(9.876f);
- const int16_t x(1000);
-
- Variant value = Variant::List();
- value.asList().push_back(Variant(s));
- value.asList().push_back(Variant(f));
- value.asList().push_back(Variant(x));
- BOOST_CHECK_EQUAL(3u, value.asList().size());
- Variant::List::const_iterator i = value.asList().begin();
-
- BOOST_CHECK(i != value.asList().end());
- BOOST_CHECK_EQUAL(VAR_STRING, i->getType());
- BOOST_CHECK_EQUAL(s, i->asString());
- i++;
-
- BOOST_CHECK(i != value.asList().end());
- BOOST_CHECK_EQUAL(VAR_FLOAT, i->getType());
- BOOST_CHECK_EQUAL(f, i->asFloat());
- i++;
-
- BOOST_CHECK(i != value.asList().end());
- BOOST_CHECK_EQUAL(VAR_INT16, i->getType());
- BOOST_CHECK_EQUAL(x, i->asInt16());
- i++;
-
- BOOST_CHECK(i == value.asList().end());
-}
-
-QPID_AUTO_TEST_CASE(testMap)
-{
- const std::string red("red");
- const float pi(3.14f);
- const int16_t x(1000);
- const Uuid u(true);
-
- Variant value = Variant::Map();
- value.asMap()["colour"] = red;
- value.asMap()["pi"] = pi;
- value.asMap()["my-key"] = x;
- value.asMap()["id"] = u;
- BOOST_CHECK_EQUAL(4u, value.asMap().size());
-
- BOOST_CHECK_EQUAL(VAR_STRING, value.asMap()["colour"].getType());
- BOOST_CHECK_EQUAL(red, value.asMap()["colour"].asString());
-
- BOOST_CHECK_EQUAL(VAR_FLOAT, value.asMap()["pi"].getType());
- BOOST_CHECK_EQUAL(pi, value.asMap()["pi"].asFloat());
-
- BOOST_CHECK_EQUAL(VAR_INT16, value.asMap()["my-key"].getType());
- BOOST_CHECK_EQUAL(x, value.asMap()["my-key"].asInt16());
-
- BOOST_CHECK_EQUAL(VAR_UUID, value.asMap()["id"].getType());
- BOOST_CHECK_EQUAL(u, value.asMap()["id"].asUuid());
-
- value.asMap()["my-key"] = "now it's a string";
- BOOST_CHECK_EQUAL(VAR_STRING, value.asMap()["my-key"].getType());
- BOOST_CHECK_EQUAL(std::string("now it's a string"), value.asMap()["my-key"].asString());
-}
-
-QPID_AUTO_TEST_CASE(testIsEqualTo)
-{
- BOOST_CHECK_EQUAL(Variant("abc"), Variant("abc"));
- BOOST_CHECK_EQUAL(Variant(1234), Variant(1234));
-
- Variant a = Variant::Map();
- a.asMap()["colour"] = "red";
- a.asMap()["pi"] = 3.14f;
- a.asMap()["my-key"] = 1234;
- Variant b = Variant::Map();
- b.asMap()["colour"] = "red";
- b.asMap()["pi"] = 3.14f;
- b.asMap()["my-key"] = 1234;
- BOOST_CHECK_EQUAL(a, b);
-}
-
-QPID_AUTO_TEST_CASE(testEncoding)
-{
- Variant a("abc");
- a.setEncoding("utf8");
- Variant b = a;
- Variant map = Variant::Map();
- map.asMap()["a"] = a;
- map.asMap()["b"] = b;
- BOOST_CHECK_EQUAL(a.getEncoding(), std::string("utf8"));
- BOOST_CHECK_EQUAL(a.getEncoding(), b.getEncoding());
- BOOST_CHECK_EQUAL(a.getEncoding(), map.asMap()["a"].getEncoding());
- BOOST_CHECK_EQUAL(b.getEncoding(), map.asMap()["b"].getEncoding());
- BOOST_CHECK_EQUAL(map.asMap()["a"].getEncoding(), map.asMap()["b"].getEncoding());
-}
-
-QPID_AUTO_TEST_CASE(testBufferEncoding)
-{
- Variant a("abc");
- a.setEncoding("utf8");
- std::string buffer;
-
- Variant::Map inMap, outMap;
- inMap["a"] = a;
-
- MapCodec::encode(inMap, buffer);
- MapCodec::decode(buffer, outMap);
- BOOST_CHECK_EQUAL(inMap, outMap);
-
- inMap["b"] = Variant(std::string(65535, 'X'));
- inMap["b"].setEncoding("utf16");
- MapCodec::encode(inMap, buffer);
- MapCodec::decode(buffer, outMap);
- BOOST_CHECK_EQUAL(inMap, outMap);
-
- inMap["fail"] = Variant(std::string(65536, 'X'));
- inMap["fail"].setEncoding("utf16");
- BOOST_CHECK_THROW(MapCodec::encode(inMap, buffer), std::exception);
-}
-
-QPID_AUTO_TEST_SUITE_END()
-
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/XmlClientSessionTest.cpp b/cpp/src/tests/XmlClientSessionTest.cpp
deleted file mode 100644
index b3b7f12b53..0000000000
--- a/cpp/src/tests/XmlClientSessionTest.cpp
+++ /dev/null
@@ -1,297 +0,0 @@
-/*
- *
- * Licensed to the Apachef 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.
- *
- */
-
-#include "unit_test.h"
-#include "test_tools.h"
-#include "BrokerFixture.h"
-#include "qpid/sys/Shlib.h"
-#include "qpid/sys/Monitor.h"
-#include "qpid/sys/Thread.h"
-#include "qpid/sys/Runnable.h"
-#include "qpid/client/Message.h"
-#include "qpid/framing/reply_exceptions.h"
-#include "qpid/client/Connection.h"
-#include "qpid/client/SubscriptionManager.h"
-#include "qpid/client/LocalQueue.h"
-#include "qpid/client/Session.h"
-#include "qpid/client/SubscriptionManager.h"
-
-#include <boost/optional.hpp>
-#include <boost/lexical_cast.hpp>
-
-#include <vector>
-
-namespace qpid {
-namespace tests {
-
-QPID_AUTO_TEST_SUITE(XmlClientSessionTest)
-
-using namespace qpid::client;
-
-using namespace qpid::client::arg;
-using namespace qpid::framing;
-using namespace qpid;
-using qpid::sys::Shlib;
-using qpid::sys::Monitor;
-using std::string;
-using std::cout;
-using std::endl;
-
-
-Shlib shlib(getLibPath("XML_LIB"));
-
-class SubscribedLocalQueue : public LocalQueue {
- private:
- SubscriptionManager& subscriptions;
- public:
- SubscribedLocalQueue(SubscriptionManager& subs) : subscriptions(subs) {}
- Message get () { return pop(); }
- Message get (sys::Duration timeout) { return pop(timeout); }
- virtual ~SubscribedLocalQueue() {}
-};
-
-
-struct SimpleListener : public MessageListener
-{
- Monitor lock;
- std::vector<Message> messages;
-
- void received(Message& msg)
- {
- Monitor::ScopedLock l(lock);
- messages.push_back(msg);
- lock.notifyAll();
- }
-
- void waitFor(const uint n)
- {
- Monitor::ScopedLock l(lock);
- while (messages.size() < n) {
- lock.wait();
- }
- }
-};
-
-struct ClientSessionFixture : public ProxySessionFixture
-{
- void declareSubscribe(const string& q="odd_blue",
- const string& dest="xml")
- {
- session.queueDeclare(queue=q);
- session.messageSubscribe(queue=q, destination=dest, acquireMode=1);
- session.messageFlow(destination=dest, unit=0, value=0xFFFFFFFF);//messages
- session.messageFlow(destination=dest, unit=1, value=0xFFFFFFFF);//bytes
- }
-};
-
-// ########### START HERE ####################################
-
-QPID_AUTO_TEST_CASE(testXmlBinding) {
- ClientSessionFixture f;
-
- SubscriptionManager subscriptions(f.session);
- SubscribedLocalQueue localQueue(subscriptions);
-
- f.session.exchangeDeclare(qpid::client::arg::exchange="xml", qpid::client::arg::type="xml");
- f.session.queueDeclare(qpid::client::arg::queue="odd_blue");
- subscriptions.subscribe(localQueue, "odd_blue");
-
- FieldTable binding;
- binding.setString("xquery", "declare variable $color external;"
- "(./message/id mod 2 = 1) and ($color = 'blue')");
- f.session.exchangeBind(qpid::client::arg::exchange="xml", qpid::client::arg::queue="odd_blue", qpid::client::arg::bindingKey="query_name", qpid::client::arg::arguments=binding);
-
- Message message;
- message.getDeliveryProperties().setRoutingKey("query_name");
-
- message.getHeaders().setString("color", "blue");
- string m = "<message><id>1</id></message>";
- message.setData(m);
-
- f.session.messageTransfer(qpid::client::arg::content=message, qpid::client::arg::destination="xml");
-
- Message m2 = localQueue.get(1*qpid::sys::TIME_SEC);
- BOOST_CHECK_EQUAL(m, m2.getData());
-}
-
-/**
- * Ensure that multiple queues can be bound using the same routing key
- */
-QPID_AUTO_TEST_CASE(testXMLBindMultipleQueues) {
- ClientSessionFixture f;
-
-
- f.session.exchangeDeclare(arg::exchange="xml", arg::type="xml");
- f.session.queueDeclare(arg::queue="blue", arg::exclusive=true, arg::autoDelete=true);
- f.session.queueDeclare(arg::queue="red", arg::exclusive=true, arg::autoDelete=true);
-
- FieldTable blue;
- blue.setString("xquery", "./colour = 'blue'");
- f.session.exchangeBind(arg::exchange="xml", arg::queue="blue", arg::bindingKey="by-colour", arg::arguments=blue);
- FieldTable red;
- red.setString("xquery", "./colour = 'red'");
- f.session.exchangeBind(arg::exchange="xml", arg::queue="red", arg::bindingKey="by-colour", arg::arguments=red);
-
- Message sent1("<colour>blue</colour>", "by-colour");
- f.session.messageTransfer(arg::content=sent1, arg::destination="xml");
-
- Message sent2("<colour>red</colour>", "by-colour");
- f.session.messageTransfer(arg::content=sent2, arg::destination="xml");
-
- Message received;
- BOOST_CHECK(f.subs.get(received, "blue"));
- BOOST_CHECK_EQUAL(sent1.getData(), received.getData());
- BOOST_CHECK(f.subs.get(received, "red"));
- BOOST_CHECK_EQUAL(sent2.getData(), received.getData());
-}
-
-//### Test: Bad XML does not kill the server - and does not even
-// raise an exception, the content is not required to be XML.
-
-QPID_AUTO_TEST_CASE(testXMLSendBadXML) {
- ClientSessionFixture f;
-
- f.session.exchangeDeclare(arg::exchange="xml", arg::type="xml");
- f.session.queueDeclare(arg::queue="blue", arg::exclusive=true, arg::autoDelete=true)\
- ;
- f.session.queueDeclare(arg::queue="red", arg::exclusive=true, arg::autoDelete=true);
-
- FieldTable blue;
- blue.setString("xquery", "./colour = 'blue'");
- f.session.exchangeBind(arg::exchange="xml", arg::queue="blue", arg::bindingKey="by-c\
-olour", arg::arguments=blue);
- FieldTable red;
- red.setString("xquery", "./colour = 'red'");
- f.session.exchangeBind(arg::exchange="xml", arg::queue="red", arg::bindingKey="by-co\
-lour", arg::arguments=red);
-
- Message sent1("<>colour>blue</colour>", "by-colour");
- f.session.messageTransfer(arg::content=sent1, arg::destination="xml");
-
- BOOST_CHECK_EQUAL(1, 1);
-}
-
-
-//### Test: Bad XQuery does not kill the server, but does raise an exception
-
-QPID_AUTO_TEST_CASE(testXMLBadXQuery) {
- ClientSessionFixture f;
-
- f.session.exchangeDeclare(arg::exchange="xml", arg::type="xml");
- f.session.queueDeclare(arg::queue="blue", arg::exclusive=true, arg::autoDelete=true)\
- ;
-
- try {
- ScopedSuppressLogging sl; // Supress logging of error messages for expected error.
- FieldTable blue;
- blue.setString("xquery", "./colour $=! 'blue'");
- f.session.exchangeBind(arg::exchange="xml", arg::queue="blue", arg::bindingKey="by-c\
-olour", arg::arguments=blue);
- }
- catch (const InternalErrorException& e) {
- return;
- }
- BOOST_ERROR("A bad XQuery must raise an exception when used in an XML Binding.");
-
-}
-
-
-//### Test: double, string, and integer field values can all be bound to queries
-
-QPID_AUTO_TEST_CASE(testXmlBindingUntyped) {
- ClientSessionFixture f;
-
- SubscriptionManager subscriptions(f.session);
- SubscribedLocalQueue localQueue(subscriptions);
-
- f.session.exchangeDeclare(qpid::client::arg::exchange="xml", qpid::client::arg::type="xml");
- f.session.queueDeclare(qpid::client::arg::queue="odd_blue");
- subscriptions.subscribe(localQueue, "odd_blue");
-
- FieldTable binding;
- binding.setString("xquery",
- "declare variable $s external;"
- "declare variable $i external;"
- "declare variable $d external;"
- "$s = 'string' and $i = 1 and $d < 1");
- f.session.exchangeBind(qpid::client::arg::exchange="xml", qpid::client::arg::queue="odd_blue", qpid::client::arg::bindingKey="query_name", qpid::client::arg::arguments=binding);
-
- Message message;
- message.getDeliveryProperties().setRoutingKey("query_name");
-
- message.getHeaders().setString("s", "string");
- message.getHeaders().setInt("i", 1);
- message.getHeaders().setDouble("d", 0.5);
- string m = "<message>Hi, Mom!</message>";
- message.setData(m);
-
- f.session.messageTransfer(qpid::client::arg::content=message, qpid::client::arg::destination="xml");
-
- Message m2 = localQueue.get(1*qpid::sys::TIME_SEC);
- BOOST_CHECK_EQUAL(m, m2.getData());
-}
-
-
-//### Test: double, string, and integer field values can all be bound to queries
-
-QPID_AUTO_TEST_CASE(testXmlBindingTyped) {
- ClientSessionFixture f;
-
- SubscriptionManager subscriptions(f.session);
- SubscribedLocalQueue localQueue(subscriptions);
-
- f.session.exchangeDeclare(qpid::client::arg::exchange="xml", qpid::client::arg::type="xml");
- f.session.queueDeclare(qpid::client::arg::queue="odd_blue");
- subscriptions.subscribe(localQueue, "odd_blue");
-
- FieldTable binding;
- binding.setString("xquery",
- "declare variable $s as xs:string external;"
- "declare variable $i as xs:integer external;"
- "declare variable $d external;" // XQilla bug when declaring xs:float, xs:double types? Fine if untyped, acts as float.
- "$s = 'string' and $i = 1 and $d < 1");
- f.session.exchangeBind(qpid::client::arg::exchange="xml", qpid::client::arg::queue="odd_blue", qpid::client::arg::bindingKey="query_name", qpid::client::arg::arguments=binding);
-
- Message message;
- message.getDeliveryProperties().setRoutingKey("query_name");
-
- message.getHeaders().setString("s", "string");
- message.getHeaders().setInt("i", 1);
- message.getHeaders().setDouble("d", 0.5);
- string m = "<message>Hi, Mom!</message>";
- message.setData(m);
-
- f.session.messageTransfer(qpid::client::arg::content=message, qpid::client::arg::destination="xml");
-
- Message m2 = localQueue.get(1*qpid::sys::TIME_SEC);
- BOOST_CHECK_EQUAL(m, m2.getData());
-}
-
-
-//### Test: Each session can provide its own definition for a query name
-
-
-
-//### Test: Bindings persist, surviving broker restart
-
-QPID_AUTO_TEST_SUITE_END()
-
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/acl.py b/cpp/src/tests/acl.py
deleted file mode 100755
index 5e9a150d8f..0000000000
--- a/cpp/src/tests/acl.py
+++ /dev/null
@@ -1,1077 +0,0 @@
-#!/usr/bin/env python
-#
-# 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.
-#
-
-import sys
-import qpid
-from qpid.util import connect
-from qpid.connection import Connection
-from qpid.datatypes import uuid4
-from qpid.testlib import TestBase010
-from qmf.console import Session
-from qpid.datatypes import Message
-import qpid.messaging
-
-class ACLFile:
- def __init__(self, policy='data_dir/policy.acl'):
- self.f = open(policy,'w')
-
- def write(self,line):
- self.f.write(line)
-
- def close(self):
- self.f.close()
-
-class ACLTests(TestBase010):
-
- def get_session(self, user, passwd):
- socket = connect(self.broker.host, self.broker.port)
- connection = Connection (sock=socket, username=user, password=passwd,
- mechanism="PLAIN")
- connection.start()
- return connection.session(str(uuid4()))
-
- def reload_acl(self):
- acl = self.qmf.getObjects(_class="acl")[0]
- return acl.reloadACLFile()
-
- def get_acl_file(self):
- return ACLFile(self.config.defines.get("policy-file", "data_dir/policy.acl"))
-
- def setUp(self):
- aclf = self.get_acl_file()
- aclf.write('acl allow all all\n')
- aclf.close()
- TestBase010.setUp(self)
- self.startQmf()
- self.reload_acl()
-
- def tearDown(self):
- aclf = self.get_acl_file()
- aclf.write('acl allow all all\n')
- aclf.close()
- self.reload_acl()
- TestBase010.tearDown(self)
-
- #=====================================
- # ACL general tests
- #=====================================
-
- def test_deny_mode(self):
- """
- Test the deny all mode
- """
- aclf = self.get_acl_file()
- aclf.write('acl allow anonymous all all\n')
- aclf.write('acl allow bob@QPID create queue\n')
- aclf.write('acl deny all all')
- aclf.close()
-
- result = self.reload_acl()
- if (result.text.find("format error",0,len(result.text)) != -1):
- self.fail(result)
-
- session = self.get_session('bob','bob')
- try:
- session.queue_declare(queue="deny_queue")
- except qpid.session.SessionException, e:
- if (403 == e.args[0].error_code):
- self.fail("ACL should allow queue create request");
- self.fail("Error during queue create request");
-
- try:
- session.exchange_bind(exchange="amq.direct", queue="deny_queue", binding_key="routing_key")
- self.fail("ACL should deny queue bind request");
- except qpid.session.SessionException, e:
- self.assertEqual(403,e.args[0].error_code)
-
- def test_allow_mode(self):
- """
- Test the allow all mode
- """
- aclf = self.get_acl_file()
- aclf.write('acl deny bob@QPID bind exchange\n')
- aclf.write('acl allow all all')
- aclf.close()
-
- result = self.reload_acl()
- if (result.text.find("format error",0,len(result.text)) != -1):
- self.fail(result)
-
- session = self.get_session('bob','bob')
- try:
- session.queue_declare(queue="allow_queue")
- except qpid.session.SessionException, e:
- if (403 == e.args[0].error_code):
- self.fail("ACL should allow queue create request");
- self.fail("Error during queue create request");
-
- try:
- session.exchange_bind(exchange="amq.direct", queue="allow_queue", binding_key="routing_key")
- self.fail("ACL should deny queue bind request");
- except qpid.session.SessionException, e:
- self.assertEqual(403,e.args[0].error_code)
-
-
- #=====================================
- # ACL file format tests
- #=====================================
-
- def test_empty_groups(self):
- """
- Test empty groups
- """
- aclf = self.get_acl_file()
- aclf.write('acl group\n')
- aclf.write('acl group admins bob@QPID joe@QPID\n')
- aclf.write('acl allow all all')
- aclf.close()
-
- result = self.reload_acl()
- if (result.text.find("Insufficient tokens for acl definition",0,len(result.text)) == -1):
- self.fail("ACL Reader should reject the acl file due to empty group name")
-
- def test_illegal_acl_formats(self):
- """
- Test illegal acl formats
- """
- aclf = self.get_acl_file()
- aclf.write('acl group admins bob@QPID joe@QPID\n')
- aclf.write('acl allow all all')
- aclf.close()
-
- result = self.reload_acl()
- if (result.text.find("Unknown ACL permission",0,len(result.text)) == -1):
- self.fail(result)
-
- def test_illegal_extension_lines(self):
- """
- Test illegal extension lines
- """
-
- aclf = self.get_acl_file()
- aclf.write('group admins bob@QPID \n')
- aclf.write(' \ \n')
- aclf.write('joe@QPID \n')
- aclf.write('acl allow all all')
- aclf.close()
-
- result = self.reload_acl()
- if (result.text.find("contains an illegal extension",0,len(result.text)) == -1):
- self.fail(result)
-
- if (result.text.find("Non-continuation line must start with \"group\" or \"acl\"",0,len(result.text)) == -1):
- self.fail(result)
-
- def test_llegal_extension_lines(self):
- """
- Test proper extention lines
- """
- aclf = self.get_acl_file()
- aclf.write('group test1 joe@EXAMPLE.com \\ \n') # should be allowed
- aclf.write(' jack@EXAMPLE.com \\ \n') # should be allowed
- aclf.write('jill@TEST.COM \\ \n') # should be allowed
- aclf.write('host/123.example.com@TEST.COM\n') # should be allowed
- aclf.write('acl allow all all')
- aclf.close()
-
- result = self.reload_acl()
- if (result.text.find("ACL format error",0,len(result.text)) != -1):
- self.fail(result)
-
- def test_user_realm(self):
- """
- Test a user defined without a realm
- Ex. group admin rajith
- """
- aclf = self.get_acl_file()
- aclf.write('group admin bob\n') # shouldn't be allowed
- aclf.write('acl deny admin bind exchange\n')
- aclf.write('acl allow all all')
- aclf.close()
-
- result = self.reload_acl()
- if (result.text.find("Username 'bob' must contain a realm",0,len(result.text)) == -1):
- self.fail(result)
-
- def test_allowed_chars_for_username(self):
- """
- Test a user defined without a realm
- Ex. group admin rajith
- """
- aclf = self.get_acl_file()
- aclf.write('group test1 joe@EXAMPLE.com\n') # should be allowed
- aclf.write('group test2 jack_123-jill@EXAMPLE.com\n') # should be allowed
- aclf.write('group test4 host/somemachine.example.com@EXAMPLE.COM\n') # should be allowed
- aclf.write('acl allow all all')
- aclf.close()
-
- result = self.reload_acl()
- if (result.text.find("ACL format error",0,len(result.text)) != -1):
- self.fail(result)
-
- aclf = self.get_acl_file()
- aclf.write('group test1 joe$H@EXAMPLE.com\n') # shouldn't be allowed
- aclf.write('acl allow all all')
- aclf.close()
-
- result = self.reload_acl()
- if (result.text.find("Username \"joe$H@EXAMPLE.com\" contains illegal characters",0,len(result.text)) == -1):
- self.fail(result)
-
- #=====================================
- # ACL validation tests
- #=====================================
-
- def test_illegal_queue_policy(self):
- """
- Test illegal queue policy
- """
-
- aclf = self.get_acl_file()
- aclf.write('acl deny bob@QPID create queue name=q2 exclusive=true policytype=ding\n')
- aclf.write('acl allow all all')
- aclf.close()
-
- result = self.reload_acl()
- expected = "ding is not a valid value for 'policytype', possible values are one of" \
- " { 'ring' 'ring_strict' 'flow_to_disk' 'reject' }";
- if (result.text != expected):
- self.fail(result)
-
- def test_illegal_queue_size(self):
- """
- Test illegal queue policy
- """
-
- aclf = self.get_acl_file()
- aclf.write('acl deny bob@QPID create queue name=q2 maxqueuesize=-1\n')
- aclf.write('acl allow all all')
- aclf.close()
-
- result = self.reload_acl()
- expected = "-1 is not a valid value for 'maxqueuesize', " \
- "values should be between 0 and 9223372036854775807";
- if (result.text != expected):
- self.fail(result)
-
- aclf = self.get_acl_file()
- aclf.write('acl deny bob@QPID create queue name=q2 maxqueuesize=9223372036854775808\n')
- aclf.write('acl allow all all')
- aclf.close()
-
- result = self.reload_acl()
- expected = "9223372036854775808 is not a valid value for 'maxqueuesize', " \
- "values should be between 0 and 9223372036854775807";
- if (result.text != expected):
- self.fail(result)
-
-
- def test_illegal_queue_count(self):
- """
- Test illegal queue policy
- """
-
- aclf = self.get_acl_file()
- aclf.write('acl deny bob@QPID create queue name=q2 maxqueuecount=-1\n')
- aclf.write('acl allow all all')
- aclf.close()
-
- result = self.reload_acl()
- expected = "-1 is not a valid value for 'maxqueuecount', " \
- "values should be between 0 and 9223372036854775807";
- if (result.text != expected):
- self.fail(result)
-
- aclf = self.get_acl_file()
- aclf.write('acl deny bob@QPID create queue name=q2 maxqueuecount=9223372036854775808\n')
- aclf.write('acl allow all all')
- aclf.close()
-
- result = self.reload_acl()
- expected = "9223372036854775808 is not a valid value for 'maxqueuecount', " \
- "values should be between 0 and 9223372036854775807";
- if (result.text != expected):
- self.fail(result)
-
-
- #=====================================
- # ACL queue tests
- #=====================================
-
- def test_queue_allow_mode(self):
- """
- Test cases for queue acl in allow mode
- """
- aclf = self.get_acl_file()
- aclf.write('acl deny bob@QPID create queue name=q1 durable=true passive=true\n')
- aclf.write('acl deny bob@QPID create queue name=q2 exclusive=true policytype=ring\n')
- aclf.write('acl deny bob@QPID access queue name=q3\n')
- aclf.write('acl deny bob@QPID purge queue name=q3\n')
- aclf.write('acl deny bob@QPID delete queue name=q4\n')
- aclf.write('acl deny bob@QPID create queue name=q5 maxqueuesize=1000 maxqueuecount=100\n')
- aclf.write('acl allow all all')
- aclf.close()
-
- result = self.reload_acl()
- if (result.text.find("format error",0,len(result.text)) != -1):
- self.fail(result)
-
- session = self.get_session('bob','bob')
-
- try:
- session.queue_declare(queue="q1", durable=True, passive=True)
- self.fail("ACL should deny queue create request with name=q1 durable=true passive=true");
- except qpid.session.SessionException, e:
- self.assertEqual(403,e.args[0].error_code)
- session = self.get_session('bob','bob')
-
- try:
- queue_options = {}
- queue_options["qpid.policy_type"] = "ring"
- session.queue_declare(queue="q2", exclusive=True, arguments=queue_options)
- self.fail("ACL should deny queue create request with name=q2 exclusive=true qpid.policy_type=ring");
- except qpid.session.SessionException, e:
- self.assertEqual(403,e.args[0].error_code)
- session = self.get_session('bob','bob')
-
- try:
- queue_options = {}
- queue_options["qpid.policy_type"] = "ring_strict"
- session.queue_declare(queue="q2", exclusive=True, arguments=queue_options)
- except qpid.session.SessionException, e:
- if (403 == e.args[0].error_code):
- self.fail("ACL should allow queue create request with name=q2 exclusive=true qpid.policy_type=ring_strict");
-
- try:
- queue_options = {}
- queue_options["qpid.max_count"] = 200
- queue_options["qpid.max_size"] = 500
- session.queue_declare(queue="q5", exclusive=True, arguments=queue_options)
- self.fail("ACL should deny queue create request with name=q2, qpid.max_size=500 and qpid.max_count=200");
- except qpid.session.SessionException, e:
- self.assertEqual(403,e.args[0].error_code)
- session = self.get_session('bob','bob')
-
- try:
- queue_options = {}
- queue_options["qpid.max_count"] = 200
- queue_options["qpid.max_size"] = 100
- session.queue_declare(queue="q2", exclusive=True, arguments=queue_options)
- except qpid.session.SessionException, e:
- if (403 == e.args[0].error_code):
- self.fail("ACL should allow queue create request with name=q2, qpid.max_size=100 and qpid.max_count=200 ");
- try:
- session.queue_declare(queue="q3", exclusive=True)
- session.queue_declare(queue="q4", durable=True)
- except qpid.session.SessionException, e:
- if (403 == e.args[0].error_code):
- self.fail("ACL should allow queue create request for q3 and q4 with any parameter");
-
- try:
- session.queue_query(queue="q3")
- self.fail("ACL should deny queue query request for q3");
- except qpid.session.SessionException, e:
- self.assertEqual(403,e.args[0].error_code)
- session = self.get_session('bob','bob')
-
- try:
- session.queue_purge(queue="q3")
- self.fail("ACL should deny queue purge request for q3");
- except qpid.session.SessionException, e:
- self.assertEqual(403,e.args[0].error_code)
- session = self.get_session('bob','bob')
-
- try:
- session.queue_purge(queue="q4")
- except qpid.session.SessionException, e:
- if (403 == e.args[0].error_code):
- self.fail("ACL should allow queue purge request for q4");
-
- try:
- session.queue_delete(queue="q4")
- self.fail("ACL should deny queue delete request for q4");
- except qpid.session.SessionException, e:
- self.assertEqual(403,e.args[0].error_code)
- session = self.get_session('bob','bob')
-
- try:
- session.queue_delete(queue="q3")
- except qpid.session.SessionException, e:
- if (403 == e.args[0].error_code):
- self.fail("ACL should allow queue delete request for q3");
-
-
- def test_queue_deny_mode(self):
- """
- Test cases for queue acl in deny mode
- """
- aclf = self.get_acl_file()
- aclf.write('acl allow bob@QPID create queue name=q1 durable=true passive=true\n')
- aclf.write('acl allow bob@QPID create queue name=q2 exclusive=true policytype=ring\n')
- aclf.write('acl allow bob@QPID access queue name=q3\n')
- aclf.write('acl allow bob@QPID purge queue name=q3\n')
- aclf.write('acl allow bob@QPID create queue name=q3\n')
- aclf.write('acl allow bob@QPID create queue name=q4\n')
- aclf.write('acl allow bob@QPID delete queue name=q4\n')
- aclf.write('acl allow bob@QPID create queue name=q5 maxqueuesize=1000 maxqueuecount=100\n')
- aclf.write('acl allow anonymous all all\n')
- aclf.write('acl deny all all')
- aclf.close()
-
- result = self.reload_acl()
- if (result.text.find("format error",0,len(result.text)) != -1):
- self.fail(result)
-
- session = self.get_session('bob','bob')
-
- try:
- session.queue_declare(queue="q1", durable=True, passive=True)
- except qpid.session.SessionException, e:
- if (403 == e.args[0].error_code):
- self.fail("ACL should allow queue create request with name=q1 durable=true passive=true");
-
- try:
- session.queue_declare(queue="q1", durable=False, passive=False)
- self.fail("ACL should deny queue create request with name=q1 durable=true passive=false");
- except qpid.session.SessionException, e:
- self.assertEqual(403,e.args[0].error_code)
- session = self.get_session('bob','bob')
-
- try:
- session.queue_declare(queue="q2", exclusive=False)
- self.fail("ACL should deny queue create request with name=q2 exclusive=false");
- except qpid.session.SessionException, e:
- self.assertEqual(403,e.args[0].error_code)
- session = self.get_session('bob','bob')
-
- try:
- queue_options = {}
- queue_options["qpid.max_count"] = 200
- queue_options["qpid.max_size"] = 500
- session.queue_declare(queue="q5", arguments=queue_options)
- self.fail("ACL should deny queue create request with name=q2 maxqueuesize=500 maxqueuecount=200");
- except qpid.session.SessionException, e:
- self.assertEqual(403,e.args[0].error_code)
- session = self.get_session('bob','bob')
-
- try:
- queue_options = {}
- queue_options["qpid.max_count"] = 100
- queue_options["qpid.max_size"] = 500
- session.queue_declare(queue="q5", arguments=queue_options)
- except qpid.session.SessionException, e:
- if (403 == e.args[0].error_code):
- self.fail("ACL should allow queue create request with name=q2 maxqueuesize=500 maxqueuecount=200");
-
- try:
- queue_options = {}
- queue_options["qpid.policy_type"] = "ring"
- session.queue_declare(queue="q2", exclusive=True, arguments=queue_options)
- except qpid.session.SessionException, e:
- if (403 == e.args[0].error_code):
- self.fail("ACL should allow queue create request for q2 with exclusive=true policytype=ring");
-
- try:
- session.queue_declare(queue="q3")
- session.queue_declare(queue="q4")
- except qpid.session.SessionException, e:
- if (403 == e.args[0].error_code):
- self.fail("ACL should allow queue create request for q3 and q4");
-
- try:
- session.queue_query(queue="q4")
- self.fail("ACL should deny queue query request for q4");
- except qpid.session.SessionException, e:
- self.assertEqual(403,e.args[0].error_code)
- session = self.get_session('bob','bob')
-
- try:
- session.queue_purge(queue="q4")
- self.fail("ACL should deny queue purge request for q4");
- except qpid.session.SessionException, e:
- self.assertEqual(403,e.args[0].error_code)
- session = self.get_session('bob','bob')
-
- try:
- session.queue_purge(queue="q3")
- except qpid.session.SessionException, e:
- if (403 == e.args[0].error_code):
- self.fail("ACL should allow queue purge request for q3");
-
- try:
- session.queue_query(queue="q3")
- except qpid.session.SessionException, e:
- if (403 == e.args[0].error_code):
- self.fail("ACL should allow queue query request for q3");
-
- try:
- session.queue_delete(queue="q3")
- self.fail("ACL should deny queue delete request for q3");
- except qpid.session.SessionException, e:
- self.assertEqual(403,e.args[0].error_code)
- session = self.get_session('bob','bob')
-
- try:
- session.queue_delete(queue="q4")
- except qpid.session.SessionException, e:
- if (403 == e.args[0].error_code):
- self.fail("ACL should allow queue delete request for q4");
-
- #=====================================
- # ACL exchange tests
- #=====================================
-
- def test_exchange_acl_allow_mode(self):
- session = self.get_session('bob','bob')
- session.queue_declare(queue="baz")
-
- """
- Test cases for exchange acl in allow mode
- """
- aclf = self.get_acl_file()
- aclf.write('acl deny bob@QPID create exchange name=testEx durable=true passive=true\n')
- aclf.write('acl deny bob@QPID create exchange name=ex1 type=direct\n')
- aclf.write('acl deny bob@QPID access exchange name=myEx queuename=q1 routingkey=rk1.*\n')
- aclf.write('acl deny bob@QPID bind exchange name=myEx queuename=q1 routingkey=rk1\n')
- aclf.write('acl deny bob@QPID unbind exchange name=myEx queuename=q1 routingkey=rk1\n')
- aclf.write('acl deny bob@QPID delete exchange name=myEx\n')
- aclf.write('acl allow all all')
- aclf.close()
-
- result = self.reload_acl()
- if (result.text.find("format error",0,len(result.text)) != -1):
- self.fail(result)
-
- session = self.get_session('bob','bob')
- session.queue_declare(queue='q1')
- session.queue_declare(queue='q2')
- session.exchange_declare(exchange='myEx', type='direct')
-
- try:
- session.exchange_declare(exchange='testEx', durable=True, passive=True)
- self.fail("ACL should deny exchange create request with name=testEx durable=true passive=true");
- except qpid.session.SessionException, e:
- self.assertEqual(403,e.args[0].error_code)
- session = self.get_session('bob','bob')
-
- try:
- session.exchange_declare(exchange='testEx', type='direct', durable=True, passive=False)
- except qpid.session.SessionException, e:
- print e
- if (403 == e.args[0].error_code):
- self.fail("ACL should allow exchange create request for testEx with any parameter other than durable=true and passive=true");
-
- try:
- session.exchange_declare(exchange='ex1', type='direct')
- self.fail("ACL should deny exchange create request with name=ex1 type=direct");
- except qpid.session.SessionException, e:
- self.assertEqual(403,e.args[0].error_code)
- session = self.get_session('bob','bob')
-
- try:
- session.exchange_declare(exchange='myXml', type='direct')
- except qpid.session.SessionException, e:
- if (403 == e.args[0].error_code):
- self.fail("ACL should allow exchange create request for myXml with any parameter");
-
- try:
- session.exchange_query(name='myEx')
- self.fail("ACL should deny exchange query request for myEx");
- except qpid.session.SessionException, e:
- self.assertEqual(403,e.args[0].error_code)
- session = self.get_session('bob','bob')
-
- try:
- session.exchange_bound(exchange='myEx', queue='q1', binding_key='rk1.*')
- self.fail("ACL should deny exchange bound request for myEx with queuename=q1 and routing_key='rk1.*' ");
- except qpid.session.SessionException, e:
- self.assertEqual(403,e.args[0].error_code)
- session = self.get_session('bob','bob')
-
- try:
- session.exchange_query(name='amq.topic')
- except qpid.session.SessionException, e:
- if (403 == e.args[0].error_code):
- self.fail("ACL should allow exchange query request for exchange='amq.topic'");
-
- try:
- session.exchange_bound(exchange='myEx', queue='q1', binding_key='rk2.*')
- except qpid.session.SessionException, e:
- if (403 == e.args[0].error_code):
- self.fail("ACL should allow exchange bound request for myEx with queuename=q1 and binding_key='rk2.*'");
-
- try:
- session.exchange_bind(exchange='myEx', queue='q1', binding_key='rk1')
- self.fail("ACL should deny exchange bind request with exchange='myEx' queuename='q1' bindingkey='rk1'");
- except qpid.session.SessionException, e:
- self.assertEqual(403,e.args[0].error_code)
- session = self.get_session('bob','bob')
-
- try:
- session.exchange_bind(exchange='myEx', queue='q1', binding_key='x')
- except qpid.session.SessionException, e:
- if (403 == e.args[0].error_code):
- self.fail("ACL should allow exchange bind request for exchange='myEx', queue='q1', binding_key='x'");
-
- try:
- session.exchange_bind(exchange='myEx', queue='q2', binding_key='rk1')
- except qpid.session.SessionException, e:
- if (403 == e.args[0].error_code):
- self.fail("ACL should allow exchange bind request for exchange='myEx', queue='q2', binding_key='rk1'");
-
- try:
- session.exchange_unbind(exchange='myEx', queue='q1', binding_key='rk1')
- self.fail("ACL should deny exchange unbind request with exchange='myEx' queuename='q1' bindingkey='rk1'");
- except qpid.session.SessionException, e:
- self.assertEqual(403,e.args[0].error_code)
- session = self.get_session('bob','bob')
-
- try:
- session.exchange_unbind(exchange='myEx', queue='q1', binding_key='x')
- except qpid.session.SessionException, e:
- if (403 == e.args[0].error_code):
- self.fail("ACL should allow exchange unbind request for exchange='myEx', queue='q1', binding_key='x'");
-
- try:
- session.exchange_unbind(exchange='myEx', queue='q2', binding_key='rk1')
- except qpid.session.SessionException, e:
- if (403 == e.args[0].error_code):
- self.fail("ACL should allow exchange unbind request for exchange='myEx', queue='q2', binding_key='rk1'");
-
- try:
- session.exchange_delete(exchange='myEx')
- self.fail("ACL should deny exchange delete request for myEx");
- except qpid.session.SessionException, e:
- self.assertEqual(403,e.args[0].error_code)
- session = self.get_session('bob','bob')
-
- try:
- session.exchange_delete(exchange='myXml')
- except qpid.session.SessionException, e:
- if (403 == e.args[0].error_code):
- self.fail("ACL should allow exchange delete request for myXml");
-
-
- def test_exchange_acl_deny_mode(self):
- session = self.get_session('bob','bob')
- session.queue_declare(queue='bar')
-
- """
- Test cases for exchange acl in deny mode
- """
- aclf = self.get_acl_file()
- aclf.write('acl allow bob@QPID create exchange name=myEx durable=true passive=false\n')
- aclf.write('acl allow bob@QPID bind exchange name=amq.topic queuename=bar routingkey=foo.*\n')
- aclf.write('acl allow bob@QPID unbind exchange name=amq.topic queuename=bar routingkey=foo.*\n')
- aclf.write('acl allow bob@QPID access exchange name=myEx queuename=q1 routingkey=rk1.*\n')
- aclf.write('acl allow bob@QPID delete exchange name=myEx\n')
- aclf.write('acl allow anonymous all all\n')
- aclf.write('acl deny all all')
- aclf.close()
-
- result = self.reload_acl()
- if (result.text.find("format error",0,len(result.text)) != -1):
- self.fail(result)
-
- session = self.get_session('bob','bob')
-
- try:
- session.exchange_declare(exchange='myEx', type='direct', durable=True, passive=False)
- except qpid.session.SessionException, e:
- if (403 == e.args[0].error_code):
- self.fail("ACL should allow exchange create request for myEx with durable=true and passive=false");
-
- try:
- session.exchange_declare(exchange='myEx', type='direct', durable=False)
- self.fail("ACL should deny exchange create request with name=myEx durable=false");
- except qpid.session.SessionException, e:
- self.assertEqual(403,e.args[0].error_code)
- session = self.get_session('bob','bob')
-
- try:
- session.exchange_bind(exchange='amq.topic', queue='bar', binding_key='foo.bar')
- except qpid.session.SessionException, e:
- if (403 == e.args[0].error_code):
- self.fail("ACL should allow exchange bind request for exchange='amq.topic', queue='bar', binding_key='foor.bar'");
-
- try:
- session.exchange_bind(exchange='amq.topic', queue='baz', binding_key='foo.bar')
- self.fail("ACL should deny exchange bind request for exchange='amq.topic', queue='baz', binding_key='foo.bar'");
- except qpid.session.SessionException, e:
- self.assertEqual(403,e.args[0].error_code)
- session = self.get_session('bob','bob')
-
- try:
- session.exchange_bind(exchange='amq.topic', queue='bar', binding_key='fooz.bar')
- self.fail("ACL should deny exchange bind request for exchange='amq.topic', queue='bar', binding_key='fooz.bar'");
- except qpid.session.SessionException, e:
- self.assertEqual(403,e.args[0].error_code)
- session = self.get_session('bob','bob')
-
- try:
- session.exchange_unbind(exchange='amq.topic', queue='bar', binding_key='foo.bar')
- except qpid.session.SessionException, e:
- if (403 == e.args[0].error_code):
- self.fail("ACL should allow exchange unbind request for exchange='amq.topic', queue='bar', binding_key='foor.bar'");
- try:
- session.exchange_unbind(exchange='amq.topic', queue='baz', binding_key='foo.bar')
- self.fail("ACL should deny exchange unbind request for exchange='amq.topic', queue='baz', binding_key='foo.bar'");
- except qpid.session.SessionException, e:
- self.assertEqual(403,e.args[0].error_code)
- session = self.get_session('bob','bob')
-
- try:
- session.exchange_unbind(exchange='amq.topic', queue='bar', binding_key='fooz.bar')
- self.fail("ACL should deny exchange unbind request for exchange='amq.topic', queue='bar', binding_key='fooz.bar'");
- except qpid.session.SessionException, e:
- self.assertEqual(403,e.args[0].error_code)
- session = self.get_session('bob','bob')
-
- try:
- session.exchange_query(name='amq.topic')
- self.fail("ACL should deny exchange query request for amq.topic");
- except qpid.session.SessionException, e:
- self.assertEqual(403,e.args[0].error_code)
- session = self.get_session('bob','bob')
-
- try:
- session.exchange_bound(exchange='myEx', queue='q1', binding_key='rk2.*')
- self.fail("ACL should deny exchange bound request for amq.topic with queuename=q1 and routing_key='rk2.*' ");
- except qpid.session.SessionException, e:
- self.assertEqual(403,e.args[0].error_code)
- session = self.get_session('bob','bob')
-
- try:
- session.exchange_query(name='myEx')
- except qpid.session.SessionException, e:
- if (403 == e.args[0].error_code):
- self.fail("ACL should allow exchange query request for exchange='myEx'");
-
- try:
- session.exchange_bound(exchange='myEx', queue='q1', binding_key='rk1.*')
- except qpid.session.SessionException, e:
- if (403 == e.args[0].error_code):
- self.fail("ACL should allow exchange bound request for myEx with queuename=q1 and binding_key='rk1.*'");
-
- try:
- session.exchange_delete(exchange='myXml')
- self.fail("ACL should deny exchange delete request for myXml");
- except qpid.session.SessionException, e:
- self.assertEqual(403,e.args[0].error_code)
- session = self.get_session('bob','bob')
-
- try:
- session.exchange_delete(exchange='myEx')
- except qpid.session.SessionException, e:
- if (403 == e.args[0].error_code):
- self.fail("ACL should allow exchange delete request for myEx");
-
- def test_create_and_delete_exchange_via_qmf(self):
- """
- Test acl is enforced when creating/deleting via QMF
- methods. Note that in order to be able to send the QMF methods
- and receive the responses a significant amount of permissions
- need to be enabled (TODO: can the set below be narrowed down
- at all?)
- """
- aclf = self.get_acl_file()
- aclf.write('acl allow bob@QPID create exchange\n')
- aclf.write('acl allow admin@QPID delete exchange\n')
- aclf.write('acl allow all access exchange\n')
- aclf.write('acl allow all bind exchange\n')
- aclf.write('acl allow all create queue\n')
- aclf.write('acl allow all access queue\n')
- aclf.write('acl allow all delete queue\n')
- aclf.write('acl allow all consume queue\n')
- aclf.write('acl allow all access method\n')
- aclf.write('acl deny all all')
- aclf.close()
-
- result = self.reload_acl()
- if (result.text.find("format error",0,len(result.text)) != -1):
- self.fail(result)
-
- bob = BrokerAdmin(self.config.broker, "bob", "bob")
- bob.create_exchange("my-exchange") #should pass
- #cleanup by deleting exchange
- try:
- bob.delete_exchange("my-exchange") #should fail
- self.fail("ACL should deny exchange delete request for my-exchange");
- except Exception, e:
- self.assertEqual(7,e.args[0]["error_code"])
- assert e.args[0]["error_text"].find("unauthorized-access") == 0
- admin = BrokerAdmin(self.config.broker, "admin", "admin")
- admin.delete_exchange("my-exchange") #should pass
-
- anonymous = BrokerAdmin(self.config.broker)
- try:
- anonymous.create_exchange("another-exchange") #should fail
- self.fail("ACL should deny exchange create request for another-exchange");
- except Exception, e:
- self.assertEqual(7,e.args[0]["error_code"])
- assert e.args[0]["error_text"].find("unauthorized-access") == 0
-
-
- #=====================================
- # ACL consume tests
- #=====================================
-
- def test_consume_allow_mode(self):
- """
- Test cases for consume in allow mode
- """
- aclf = self.get_acl_file()
- aclf.write('acl deny bob@QPID consume queue name=q1\n')
- aclf.write('acl deny bob@QPID consume queue name=q2\n')
- aclf.write('acl allow all all')
- aclf.close()
-
- result = self.reload_acl()
- if (result.text.find("format error",0,len(result.text)) != -1):
- self.fail(result)
-
- session = self.get_session('bob','bob')
-
-
- try:
- session.queue_declare(queue='q1')
- session.queue_declare(queue='q2')
- session.queue_declare(queue='q3')
- except qpid.session.SessionException, e:
- if (403 == e.args[0].error_code):
- self.fail("ACL should allow create queue request");
-
- try:
- session.message_subscribe(queue='q1', destination='myq1')
- self.fail("ACL should deny subscription for queue='q1'");
- except qpid.session.SessionException, e:
- self.assertEqual(403,e.args[0].error_code)
- session = self.get_session('bob','bob')
-
- try:
- session.message_subscribe(queue='q2', destination='myq1')
- self.fail("ACL should deny subscription for queue='q2'");
- except qpid.session.SessionException, e:
- self.assertEqual(403,e.args[0].error_code)
- session = self.get_session('bob','bob')
-
- try:
- session.message_subscribe(queue='q3', destination='myq1')
- except qpid.session.SessionException, e:
- if (403 == e.args[0].error_code):
- self.fail("ACL should allow subscription for q3");
-
-
- def test_consume_deny_mode(self):
- """
- Test cases for consume in allow mode
- """
- aclf = self.get_acl_file()
- aclf.write('acl allow bob@QPID consume queue name=q1\n')
- aclf.write('acl allow bob@QPID consume queue name=q2\n')
- aclf.write('acl allow bob@QPID create queue\n')
- aclf.write('acl allow anonymous all\n')
- aclf.write('acl deny all all')
- aclf.close()
-
- result = self.reload_acl()
- if (result.text.find("format error",0,len(result.text)) != -1):
- self.fail(result)
-
- session = self.get_session('bob','bob')
-
-
- try:
- session.queue_declare(queue='q1')
- session.queue_declare(queue='q2')
- session.queue_declare(queue='q3')
- except qpid.session.SessionException, e:
- if (403 == e.args[0].error_code):
- self.fail("ACL should allow create queue request");
-
- try:
- session.message_subscribe(queue='q1', destination='myq1')
- session.message_subscribe(queue='q2', destination='myq2')
- except qpid.session.SessionException, e:
- if (403 == e.args[0].error_code):
- self.fail("ACL should allow subscription for q1 and q2");
-
- try:
- session.message_subscribe(queue='q3', destination='myq3')
- self.fail("ACL should deny subscription for queue='q3'");
- except qpid.session.SessionException, e:
- self.assertEqual(403,e.args[0].error_code)
- session = self.get_session('bob','bob')
-
-
- #=====================================
- # ACL publish tests
- #=====================================
-
- def test_publish_acl_allow_mode(self):
- """
- Test various publish acl
- """
- aclf = self.get_acl_file()
- aclf.write('acl deny bob@QPID publish exchange name=amq.direct routingkey=rk1\n')
- aclf.write('acl deny bob@QPID publish exchange name=amq.topic\n')
- aclf.write('acl deny bob@QPID publish exchange name=myEx routingkey=rk2\n')
- aclf.write('acl allow all all')
- aclf.close()
-
- result = self.reload_acl()
- if (result.text.find("format error",0,len(result.text)) != -1):
- self.fail(result)
-
- session = self.get_session('bob','bob')
-
- props = session.delivery_properties(routing_key="rk1")
-
- try:
- session.message_transfer(destination="amq.direct", message=Message(props,"Test"))
- self.fail("ACL should deny message transfer to name=amq.direct routingkey=rk1");
- except qpid.session.SessionException, e:
- self.assertEqual(403,e.args[0].error_code)
- session = self.get_session('bob','bob')
-
- try:
- session.message_transfer(destination="amq.topic", message=Message(props,"Test"))
- self.fail("ACL should deny message transfer to name=amq.topic");
- except qpid.session.SessionException, e:
- self.assertEqual(403,e.args[0].error_code)
- session = self.get_session('bob','bob')
-
- try:
- session.exchange_declare(exchange='myEx', type='direct', durable=False)
- session.message_transfer(destination="myEx", message=Message(props,"Test"))
- except qpid.session.SessionException, e:
- if (403 == e.args[0].error_code):
- self.fail("ACL should allow message transfer to exchange myEx with routing key rk1");
-
-
- props = session.delivery_properties(routing_key="rk2")
- try:
- session.message_transfer(destination="amq.direct", message=Message(props,"Test"))
- except qpid.session.SessionException, e:
- if (403 == e.args[0].error_code):
- self.fail("ACL should allow message transfer to exchange amq.direct with routing key rk2");
-
-
- def test_publish_acl_deny_mode(self):
- """
- Test various publish acl
- """
- aclf = self.get_acl_file()
- aclf.write('acl allow bob@QPID publish exchange name=amq.direct routingkey=rk1\n')
- aclf.write('acl allow bob@QPID publish exchange name=amq.topic\n')
- aclf.write('acl allow bob@QPID publish exchange name=myEx routingkey=rk2\n')
- aclf.write('acl allow bob@QPID create exchange\n')
- aclf.write('acl allow anonymous all all \n')
- aclf.write('acl deny all all')
- aclf.close()
-
- result = self.reload_acl()
- if (result.text.find("format error",0,len(result.text)) != -1):
- self.fail(result)
-
- session = self.get_session('bob','bob')
-
- props = session.delivery_properties(routing_key="rk2")
-
- try:
- session.message_transfer(destination="amq.direct", message=Message(props,"Test"))
- self.fail("ACL should deny message transfer to name=amq.direct routingkey=rk2");
- except qpid.session.SessionException, e:
- self.assertEqual(403,e.args[0].error_code)
- session = self.get_session('bob','bob')
-
- try:
- session.message_transfer(destination="amq.topic", message=Message(props,"Test"))
- except qpid.session.SessionException, e:
- if (403 == e.args[0].error_code):
- self.fail("ACL should allow message transfer to exchange amq.topic with any routing key");
-
- try:
- session.exchange_declare(exchange='myEx', type='direct', durable=False)
- session.message_transfer(destination="myEx", message=Message(props,"Test"))
- except qpid.session.SessionException, e:
- if (403 == e.args[0].error_code):
- self.fail("ACL should allow message transfer to exchange myEx with routing key=rk2");
-
- props = session.delivery_properties(routing_key="rk1")
-
- try:
- session.message_transfer(destination="myEx", message=Message(props,"Test"))
- self.fail("ACL should deny message transfer to name=myEx routingkey=rk1");
- except qpid.session.SessionException, e:
- self.assertEqual(403,e.args[0].error_code)
- session = self.get_session('bob','bob')
-
- try:
- session.message_transfer(destination="amq.direct", message=Message(props,"Test"))
- except qpid.session.SessionException, e:
- if (403 == e.args[0].error_code):
- self.fail("ACL should allow message transfer to exchange amq.direct with routing key rk1");
-
-class BrokerAdmin:
- def __init__(self, broker, username=None, password=None):
- self.connection = qpid.messaging.Connection(broker)
- if username:
- self.connection.username = username
- self.connection.password = password
- self.connection.sasl_mechanisms = "PLAIN"
- self.connection.open()
- self.session = self.connection.session()
- self.sender = self.session.sender("qmf.default.direct/broker")
- self.reply_to = "responses-#; {create:always}"
- self.receiver = self.session.receiver(self.reply_to)
-
- def invoke(self, method, arguments):
- content = {
- "_object_id": {"_object_name": "org.apache.qpid.broker:broker:amqp-broker"},
- "_method_name": method,
- "_arguments": arguments
- }
- request = qpid.messaging.Message(reply_to=self.reply_to, content=content)
- request.properties["x-amqp-0-10.app-id"] = "qmf2"
- request.properties["qmf.opcode"] = "_method_request"
- self.sender.send(request)
- response = self.receiver.fetch()
- self.session.acknowledge()
- if response.properties['x-amqp-0-10.app-id'] == 'qmf2':
- if response.properties['qmf.opcode'] == '_method_response':
- return response.content['_arguments']
- elif response.properties['qmf.opcode'] == '_exception':
- raise Exception(response.content['_values'])
- else: raise Exception("Invalid response received, unexpected opcode: %s" % response.properties['qmf.opcode'])
- else: raise Exception("Invalid response received, not a qmfv2 method: %s" % response.properties['x-amqp-0-10.app-id'])
- def create_exchange(self, name, exchange_type=None, options={}):
- properties = options
- if exchange_type: properties["exchange_type"] = exchange_type
- self.invoke("create", {"type": "exchange", "name":name, "properties":properties})
-
- def create_queue(self, name, properties={}):
- self.invoke("create", {"type": "queue", "name":name, "properties":properties})
-
- def delete_exchange(self, name):
- self.invoke("delete", {"type": "exchange", "name":name})
-
- def delete_queue(self, name):
- self.invoke("delete", {"type": "queue", "name":name})
diff --git a/cpp/src/tests/ais_check b/cpp/src/tests/ais_check
deleted file mode 100755
index 92eaa9dd39..0000000000
--- a/cpp/src/tests/ais_check
+++ /dev/null
@@ -1,34 +0,0 @@
-#!/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.
-#
-
-srcdir=`dirname $0`
-
-# Check AIS requirements and run tests if found.
-ps -u root | grep 'aisexec\|corosync' >/dev/null || {
- echo WARNING: Skipping cluster tests, the aisexec or corosync daemon is not running.
- exit 0; # A warning, not a failure.
-}
-
-# Execute command with the ais group set if user is a member.
-with_ais_group() {
- if id -nG | grep '\<ais\>' >/dev/null; then sg ais -c "$*"
- else "$@"
- fi
-}
diff --git a/cpp/src/tests/ais_test.cpp b/cpp/src/tests/ais_test.cpp
deleted file mode 100644
index 00c61242e4..0000000000
--- a/cpp/src/tests/ais_test.cpp
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- *
- * 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.
- *
- */
-
-// Defines test_main function to link with actual unit test code.
-#define BOOST_AUTO_TEST_MAIN // Boost 1.33
-#define BOOST_TEST_MAIN
-#include "unit_test.h"
-
diff --git a/cpp/src/tests/allhosts b/cpp/src/tests/allhosts
deleted file mode 100755
index e43571aed4..0000000000
--- a/cpp/src/tests/allhosts
+++ /dev/null
@@ -1,77 +0,0 @@
-#!/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.
-#
-
-usage() {
- echo "Usage: $0 [options] command.
-Run a command on each host in \$HOSTS.
-Options:
- -l USER passed to ssh - run as USER.
- -t passed to ssh - create a terminal.
- -b run in background, wait for commands to complete.
- -d run in background, don't wait for commands to complete.
- -s SECONDS sleep between starting commands.
- -q don't print banner lines for each host.
- -o SUFFIX log output of each command to <host>.SUFFIX
-"
- exit 1
-}
-
-while getopts "tl:bs:dqo:" opt; do
- case $opt in
- l) SSHOPTS="-l$OPTARG $SSHOPTS" ;;
- t) SSHOPTS="-t $SSHOPTS" ;;
- b) BACKGROUND=1 ;;
- d) BACKGROUND=1; DISOWN=1 ;;
- s) SLEEP="sleep $OPTARG" ;;
- q) NOBANNER=1 ;;
- o) SUFFIX=$OPTARG ;;
- *) usage;;
- esac
-done
-shift `expr $OPTIND - 1`
-test "$*" || usage;
-
-OK_FILE=`mktemp` # Will be deleted if anything goes wrong.
-trap "rm -f $OK_FILE" EXIT
-
-do_ssh() {
- h=$1; shift
- if test $SUFFIX ; then ssh $SSHOPTS $h "$@" &> $h.$SUFFIX
- else ssh $SSHOPTS $h "$@"; fi || rm -rf $OK_FILE;
-}
-
-for h in $HOSTS ; do
- test "$NOBANNER" || echo "== ssh $SSHOPTS $h $@ =="
- if [ "$BACKGROUND" = 1 ]; then
- do_ssh $h "$@" &
- CHILDREN="$! $CHILDREN"
- else
- do_ssh $h "$@"
- fi
- $SLEEP
-done
-
-if [ "$DISOWN" = 1 ]; then
- for c in $CHILDREN; do disown $c; done
-else
- wait
-fi
-
-test -f $OK_FILE
diff --git a/cpp/src/tests/amqp_0_10/Map.cpp b/cpp/src/tests/amqp_0_10/Map.cpp
deleted file mode 100644
index ffb235829e..0000000000
--- a/cpp/src/tests/amqp_0_10/Map.cpp
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- *
- * 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.
- *
- */
-#include "amqp_0_10/unit_test.h"
-#include "qpid/amqp_0_10/Map.h"
-#include "qpid/amqp_0_10/Array.h"
-#include "qpid/amqp_0_10/Struct32.h"
-#include "qpid/amqp_0_10/UnknownType.h"
-#include "qpid/amqp_0_10/Codec.h"
-#include <iostream>
-
-using namespace qpid::amqp_0_10;
-using namespace std;
-
-QPID_AUTO_TEST_SUITE(MapTestSuite)
-
- QPID_AUTO_TEST_CASE(testGetSet) {
- MapValue v;
- v = Str8("foo");
- BOOST_CHECK(v.get<Str8>());
- BOOST_CHECK(!v.get<uint8_t>());
- BOOST_CHECK_EQUAL(*v.get<Str8>(), "foo");
-
- v = uint8_t(42);
- BOOST_CHECK(!v.get<Str8>());
- BOOST_CHECK(v.get<uint8_t>());
- BOOST_CHECK_EQUAL(*v.get<uint8_t>(), 42);
-
- v = uint16_t(12);
- BOOST_CHECK(v.get<uint16_t>());
- BOOST_CHECK_EQUAL(*v.get<uint16_t>(), 12);
-}
-
-template <class R> struct TestVisitor : public MapValue::Visitor<R> {
- template <class T> R operator()(const T&) const { throw MapValue::BadTypeException(); }
- R operator()(const R& r) const { return r; }
-};
-
-QPID_AUTO_TEST_CASE(testVisit) {
- MapValue v;
- v = Str8("foo");
- BOOST_CHECK_EQUAL(v.apply_visitor(TestVisitor<Str8>()), "foo");
- v = Uint16(42);
- BOOST_CHECK_EQUAL(v.apply_visitor(TestVisitor<Uint16>()), 42);
- try {
- v.apply_visitor(TestVisitor<bool>());
- BOOST_FAIL("Expecting exception");
- }
- catch(const MapValue::BadTypeException&) {}
-}
-
-
-QPID_AUTO_TEST_CASE(testEncodeMapValue) {
- MapValue mv;
- std::string data;
- mv = Str8("hello");
- Codec::encode(back_inserter(data))(mv);
- BOOST_CHECK_EQUAL(data.size(), Codec::size(mv));
- MapValue mv2;
- Codec::decode(data.begin())(mv2);
- BOOST_CHECK_EQUAL(mv2.getCode(), 0x85);
- BOOST_REQUIRE(mv2.get<Str8>());
- BOOST_CHECK_EQUAL(*mv2.get<Str8>(), "hello");
-}
-
-QPID_AUTO_TEST_CASE(testEncode) {
- Map map;
- std::string data;
- map["A"] = true;
- map["b"] = Str8("hello");
- Codec::encode(back_inserter(data))(map);
- BOOST_CHECK_EQUAL(Codec::size(map), data.size());
- Map map2;
- Codec::decode(data.begin())(map2);
- BOOST_CHECK_EQUAL(map.size(), 2u);
- BOOST_CHECK(map["A"].get<bool>());
- BOOST_CHECK_EQUAL(*map["b"].get<Str8>(), "hello");
-}
-
-
-QPID_AUTO_TEST_SUITE_END()
diff --git a/cpp/src/tests/amqp_0_10/ProxyTemplate.cpp b/cpp/src/tests/amqp_0_10/ProxyTemplate.cpp
deleted file mode 100644
index f54ee0da22..0000000000
--- a/cpp/src/tests/amqp_0_10/ProxyTemplate.cpp
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- *
- * 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.
- *
- */
-
-#include "amqp_0_10/unit_test.h"
-#include "qpid/amqp_0_10/ProxyTemplate.h"
-#include <boost/any.hpp>
-
-QPID_AUTO_TEST_SUITE(ProxyTemplateTestSuite)
-
-using namespace qpid::amqp_0_10;
-
-struct ToAny {
- template <class T>
- boost::any operator()(const T& t) { return boost::any(t); }
-};
-
-struct AnyProxy : public ProxyTemplate<ToAny, boost::any> {};
-
-QPID_AUTO_TEST_CASE(testAnyProxy) {
- AnyProxy p;
- boost::any a=p.connectionTune(1,2,3,4);
- BOOST_CHECK_EQUAL(a.type().name(), typeid(connection::Tune).name());
- connection::Tune* tune=boost::any_cast<connection::Tune>(&a);
- BOOST_REQUIRE(tune);
- BOOST_CHECK_EQUAL(tune->channelMax, 1u);
- BOOST_CHECK_EQUAL(tune->maxFrameSize, 2u);
- BOOST_CHECK_EQUAL(tune->heartbeatMin, 3u);
- BOOST_CHECK_EQUAL(tune->heartbeatMax, 4u);
-}
-
-QPID_AUTO_TEST_SUITE_END()
diff --git a/cpp/src/tests/amqp_0_10/apply.cpp b/cpp/src/tests/amqp_0_10/apply.cpp
deleted file mode 100644
index 0aa4421791..0000000000
--- a/cpp/src/tests/amqp_0_10/apply.cpp
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- *
- * 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.
- *
- */
-#include "amqp_0_10/unit_test.h"
-#include "qpid/amqp_0_10/specification.h"
-#include "qpid/amqp_0_10/ApplyControl.h"
-
-QPID_AUTO_TEST_SUITE(VisitorTestSuite)
-
-using namespace qpid::amqp_0_10;
-
-struct GetCode : public ApplyFunctor<uint8_t> {
- template <class T> uint8_t operator()(const T&) const { return T::CODE; }
-};
-
-struct SetChannelMax : ApplyFunctor<void> {
- template <class T> void operator()(T&) const { BOOST_FAIL(""); }
- void operator()(connection::Tune& t) const { t.channelMax=42; }
-};
-
-struct TestFunctor {
- typedef bool result_type;
- bool operator()(const connection::Tune& tune) {
- BOOST_CHECK_EQUAL(tune.channelMax, 1u);
- BOOST_CHECK_EQUAL(tune.maxFrameSize, 2u);
- BOOST_CHECK_EQUAL(tune.heartbeatMin, 3u);
- BOOST_CHECK_EQUAL(tune.heartbeatMax, 4u);
- return true;
- }
- template <class T>
- bool operator()(const T&) { return false; }
-};
-
-QPID_AUTO_TEST_CASE(testApply) {
- connection::Tune tune(1,2,3,4);
- Control* p = &tune;
-
- // boost oddity - without the cast we get undefined symbol errors.
- BOOST_CHECK_EQUAL(apply(GetCode(), *p), (uint8_t)connection::Tune::CODE);
-
- TestFunctor tf;
- BOOST_CHECK(apply(tf, *p));
-
- connection::Start start;
- p = &start;
- BOOST_CHECK(!apply(tf, *p));
-
- apply(SetChannelMax(), tune);
- BOOST_CHECK_EQUAL(tune.channelMax, 42);
-}
-
-struct VoidTestFunctor {
- typedef void result_type;
-
- int code;
- VoidTestFunctor() : code() {}
-
- void operator()(const connection::Tune& tune) {
- BOOST_CHECK_EQUAL(tune.channelMax, 1u);
- BOOST_CHECK_EQUAL(tune.maxFrameSize, 2u);
- BOOST_CHECK_EQUAL(tune.heartbeatMin, 3u);
- BOOST_CHECK_EQUAL(tune.heartbeatMax, 4u);
- code=connection::Tune::CODE;
- }
- template <class T>
- void operator()(const T&) { code=0xFF; }
-};
-
-QPID_AUTO_TEST_CASE(testApplyVoid) {
- connection::Tune tune(1,2,3,4);
- Control* p = &tune;
- VoidTestFunctor tf;
- apply(tf, *p);
- BOOST_CHECK_EQUAL(uint8_t(connection::Tune::CODE), tf.code);
-
- connection::Start start;
- p = &start;
- apply(tf, *p);
- BOOST_CHECK_EQUAL(0xFF, tf.code);
-}
-
-QPID_AUTO_TEST_SUITE_END()
diff --git a/cpp/src/tests/amqp_0_10/handlers.cpp b/cpp/src/tests/amqp_0_10/handlers.cpp
deleted file mode 100644
index 91bb304a17..0000000000
--- a/cpp/src/tests/amqp_0_10/handlers.cpp
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- *
- * 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.
- *
- */
-
-#include "amqp_0_10/unit_test.h"
-#include "qpid/Exception.h"
-#include "qpid/amqp_0_10/Unit.h"
-#include "qpid/amqp_0_10/ControlHolder.h"
-#include "qpid/amqp_0_10/CommandHolder.h"
-#include "qpid/amqp_0_10/handlers.h"
-#include "qpid/amqp_0_10/specification.h"
-
-QPID_AUTO_TEST_SUITE(handler_tests)
-
-using namespace qpid::amqp_0_10;
-using namespace std;
-
-string called; // Set by called handler function
-
-// Note on handlers:
-//
-// Control and Command handlers are separate, both behave the same way,
-// so substitute "control or command" for command in the following.
-//
-// Command handlers derive from CommandHandler and implement functions
-// for all the commands they handle. Handling an unimplemented command
-// will raise NotImplementedException.
-//
-// Using virtual inheritance from CommandHandler allows multiple
-// handlers to be aggregated into one with multiple inheritance,
-// See test code for example.
-//
-// E.g. the existing broker model would have two control handlers:
-// - ConnectionHandler: ControlHandler for connection controls.
-// - SessionHandler: ControlHandler for session controls.
-// It would have class-command handlers for each AMQP class:
-// - QueueHandler, MessageHandler etc.. handle each class.
-// And an aggregate handler in place of BrokerAdapter
-// - BrokerCommandHandler: public QueueHandler, MessageHandler ...
-//
-// In other applications (e.g. cluster) any combination of commands
-// can be handled by a given handler. It _might_ simplify the code
-// to collaps ConnectionHandler and SessionHandler into a single
-// ControlHandler (or it might not.)
-
-struct TestExecutionHandler : public virtual CommandHandler {
- void executionSync() { called = "executionSync"; }
- // ... etc. for all execution commands
-};
-
-struct TestMessageHandler : public virtual CommandHandler {
- void messageCancel(const Str8&) { called="messageCancel"; }
- // ... etc.
-};
-
-// Aggregate handler for all recognised commands.
-struct TestCommandHandler :
- public TestExecutionHandler,
- public TestMessageHandler
- // ... etc. handlers for all command classes.
-{}; // Nothing to do.
-
-
-// Sample unit handler, written as a static_visitor.
-// Note it could equally be written with if/else statements
-// in handle.
-//
-struct TestUnitHandler : public boost::static_visitor<void> {
- TestCommandHandler handler;
- void handle(const Unit& u) { u.applyVisitor(*this); }
-
- void operator()(const Body&) { called="Body"; }
- void operator()(const Header&) { called="Header"; }
- void operator()(const ControlHolder&) { throw qpid::Exception("I don't do controls."); }
- void operator()(const CommandHolder& c) { c.invoke(handler); }
-};
-
-QPID_AUTO_TEST_CASE(testHandlers) {
- TestUnitHandler handler;
- Unit u;
-
- u = Body();
- handler.handle(u);
- BOOST_CHECK_EQUAL("Body", called);
-
- u = Header();
- handler.handle(u);
- BOOST_CHECK_EQUAL("Header", called);
-
- // in_place<Foo>(...) is equivalent to Foo(...) but
- // constructs Foo directly in the holder, avoiding
- // a copy.
-
- u = CommandHolder(in_place<execution::Sync>());
- handler.handle(u);
- BOOST_CHECK_EQUAL("executionSync", called);
-
- u = ControlHolder(in_place<connection::Start>(Map(), Str16Array(), Str16Array()));
- try {
- handler.handle(u);
- } catch (const qpid::Exception&) {}
-
- u = CommandHolder(in_place<message::Cancel>(Str8()));
- handler.handle(u);
- BOOST_CHECK_EQUAL("messageCancel", called);
-}
-
-QPID_AUTO_TEST_SUITE_END()
diff --git a/cpp/src/tests/amqp_0_10/serialize.cpp b/cpp/src/tests/amqp_0_10/serialize.cpp
deleted file mode 100644
index 975d6206ec..0000000000
--- a/cpp/src/tests/amqp_0_10/serialize.cpp
+++ /dev/null
@@ -1,429 +0,0 @@
-/*
- *
- * 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.
- *
- */
-
-#include "amqp_0_10/unit_test.h"
-#include "amqp_0_10/allSegmentTypes.h"
-
-#include "qpid/framing/AMQFrame.h"
-#include "qpid/framing/Buffer.h"
-
-#include "qpid/amqp_0_10/Packer.h"
-#include "qpid/amqp_0_10/built_in_types.h"
-#include "qpid/amqp_0_10/Codec.h"
-#include "qpid/amqp_0_10/specification.h"
-#include "qpid/amqp_0_10/ControlHolder.h"
-#include "qpid/amqp_0_10/Struct32.h"
-#include "qpid/amqp_0_10/FrameHeader.h"
-#include "qpid/amqp_0_10/Map.h"
-#include "qpid/amqp_0_10/Unit.h"
-#include "allSegmentTypes.h"
-
-#include <boost/test/test_case_template.hpp>
-#include <boost/type_traits/is_arithmetic.hpp>
-#include <boost/utility/enable_if.hpp>
-#include <boost/optional.hpp>
-#include <boost/mpl/vector.hpp>
-#include <boost/mpl/back_inserter.hpp>
-#include <boost/mpl/copy.hpp>
-#include <boost/mpl/empty_sequence.hpp>
-#include <boost/current_function.hpp>
-#include <iterator>
-#include <string>
-#include <sstream>
-#include <iostream>
-#include <netinet/in.h>
-
-// Missing operators needed for tests.
-namespace boost {
-template <class T, size_t N>
-std::ostream& operator<<(std::ostream& out, const array<T,N>& a) {
- std::ostream_iterator<T> o(out, " ");
- std::copy(a.begin(), a.end(), o);
- return out;
-}
-} // boost
-
-QPID_AUTO_TEST_SUITE(SerializeTestSuite)
-
-using namespace std;
-namespace mpl=boost::mpl;
-using namespace qpid::amqp_0_10;
-using qpid::framing::in_place;
-
-template <class A, class B> struct concat2 { typedef typename mpl::copy<B, typename mpl::back_inserter<A> >::type type; };
-template <class A, class B, class C> struct concat3 { typedef typename concat2<A, typename concat2<B, C>::type>::type type; };
-template <class A, class B, class C, class D> struct concat4 { typedef typename concat2<A, typename concat3<B, C, D>::type>::type type; };
-
-typedef mpl::vector<Boolean, Char, Int32, Int64, Int8, Uint16, CharUtf32, Uint32, Uint64, Bin8, Uint8>::type IntegralTypes;
-typedef mpl::vector<Bin1024, Bin128, Bin16, Bin256, Bin32, Bin40, Bin512, Bin64, Bin72>::type BinTypes;
-typedef mpl::vector<Double, Float>::type FloatTypes;
-typedef mpl::vector<SequenceNo, Uuid, Datetime, Dec32, Dec64> FixedSizeClassTypes;
-typedef mpl::vector<Map, Vbin8, Str8Latin, Str8, Str8Utf16, Vbin16, Str16Latin, Str16, Str16Utf16, Vbin32> VariableSizeTypes;
-
-typedef concat4<IntegralTypes, BinTypes, FloatTypes, FixedSizeClassTypes>::type FixedSizeTypes;
-typedef concat2<FixedSizeTypes, VariableSizeTypes>::type AllTypes;
-
-// TODO aconway 2008-02-20: should test 64 bit integrals for order also.
-QPID_AUTO_TEST_CASE(testNetworkByteOrder) {
- string data;
-
- uint32_t l = 0x11223344;
- Codec::encode(std::back_inserter(data))(l);
- uint32_t enc=reinterpret_cast<const uint32_t&>(*data.data());
- uint32_t l2 = ntohl(enc);
- BOOST_CHECK_EQUAL(l, l2);
-
- data.clear();
- uint16_t s = 0x1122;
- Codec::encode(std::back_inserter(data))(s);
- uint32_t s2 = ntohs(*reinterpret_cast<const uint32_t*>(data.data()));
- BOOST_CHECK_EQUAL(s, s2);
-}
-
-QPID_AUTO_TEST_CASE(testSetLimit) {
- typedef Codec::Encoder<back_insert_iterator<string> > Encoder;
- string data;
- Encoder encode(back_inserter(data), 3);
- encode('1')('2')('3');
- try {
- encode('4');
- BOOST_FAIL("Expected exception");
- } catch (...) {} // FIXME aconway 2008-04-03: catch proper exception
- BOOST_CHECK_EQUAL(data, "123");
-}
-
-QPID_AUTO_TEST_CASE(testScopedLimit) {
- typedef Codec::Encoder<back_insert_iterator<string> > Encoder;
- string data;
- Encoder encode(back_inserter(data), 10);
- encode(Str8("123")); // 4 bytes
- {
- Encoder::ScopedLimit l(encode, 3);
- encode('a')('b')('c');
- try {
- encode('d');
- BOOST_FAIL("Expected exception");
- } catch(...) {} // FIXME aconway 2008-04-03: catch proper exception
- }
- BOOST_CHECK_EQUAL(data, "\003123abc");
- encode('x')('y')('z');
- try {
- encode('!');
- BOOST_FAIL("Expected exception");
- } catch(...) {} // FIXME aconway 2008-04-03: catch proper exception
- BOOST_CHECK_EQUAL(data.size(), 10u);
-}
-
-// Assign test values to the various types.
-void testValue(bool& b) { b = true; }
-void testValue(Bit&) { }
-template <class T> typename boost::enable_if<boost::is_arithmetic<T> >::type testValue(T& n) { n=42; }
-void testValue(CharUtf32& c) { c = 43; }
-void testValue(long long& l) { l = 0x012345; }
-void testValue(Datetime& dt) { dt = qpid::sys::now(); }
-void testValue(Uuid& uuid) { uuid=Uuid(true); }
-template <class E, class M> void testValue(Decimal<E,M>& d) { d.exponent=2; d.mantissa=0x1122; }
-void testValue(SequenceNo& s) { s = 42; }
-template <size_t N> void testValue(Bin<N>& a) { a.assign(42); }
-template <class T, class S, int Unique> void testValue(SerializableString<T, S, Unique>& s) {
- char msg[]="foobar";
- s.assign(msg, msg+sizeof(msg));
-}
-void testValue(Str16& s) { s = "the quick brown fox jumped over the lazy dog"; }
-void testValue(Str8& s) { s = "foobar"; }
-void testValue(Map& m) { m["s"] = Str8("foobar"); m["b"] = true; m["c"] = uint16_t(42); }
-
-//typedef mpl::vector<Str8, Str16>::type TestTypes;
-/*BOOST_AUTO_TEST_CASE_TEMPLATE(testEncodeDecode, T, AllTypes)
-{
- string data;
- T t;
- testValue(t);
- Codec::encode(std::back_inserter(data))(t);
-
- BOOST_CHECK_EQUAL(Codec::size(t), data.size());
-
- T t2;
- Codec::decode(data.begin())(t2);
- BOOST_CHECK_EQUAL(t,t2);
-}
-*/
-
-struct TestMe {
- bool encoded, decoded;
- char value;
- TestMe(char v) : encoded(), decoded(), value(v) {}
- template <class S> void encode(S& s) const {
- const_cast<TestMe*>(this)->encoded=true; s(value);
- }
- template <class S> void decode(S& s) { decoded=true; s(value); }
- template <class S> void serialize(S& s) { s.split(*this); }
-};
-
-QPID_AUTO_TEST_CASE(testSplit) {
- string data;
- TestMe t1('x');
- Codec::encode(std::back_inserter(data))(t1);
- BOOST_CHECK(t1.encoded);
- BOOST_CHECK(!t1.decoded);
- BOOST_CHECK_EQUAL(data, "x");
-
- TestMe t2('y');
- Codec::decode(data.begin())(t2);
- BOOST_CHECK(!t2.encoded);
- BOOST_CHECK(t2.decoded);
- BOOST_CHECK_EQUAL(t2.value, 'x');
-}
-
-QPID_AUTO_TEST_CASE(testControlEncodeDecode) {
- string data;
- Control::Holder h(in_place<connection::Tune>(1,2,3,4));
- Codec::encode(std::back_inserter(data))(h);
-
- BOOST_CHECK_EQUAL(data.size(), Codec::size(h));
-
- Codec::Decoder<string::iterator> decode(data.begin());
- Control::Holder h2;
- decode(h2);
-
- BOOST_REQUIRE(h2.get());
- BOOST_CHECK_EQUAL(h2.get()->getClassCode(), connection::CODE);
- BOOST_CHECK_EQUAL(h2.get()->getCode(), uint8_t(connection::Tune::CODE));
- connection::Tune& tune=static_cast<connection::Tune&>(*h2.get());
- BOOST_CHECK_EQUAL(tune.channelMax, 1u);
- BOOST_CHECK_EQUAL(tune.maxFrameSize, 2u);
- BOOST_CHECK_EQUAL(tune.heartbeatMin, 3u);
- BOOST_CHECK_EQUAL(tune.heartbeatMax, 4u);
-}
-
-QPID_AUTO_TEST_CASE(testStruct32) {
- message::DeliveryProperties dp;
- dp.priority=message::MEDIUM;
- dp.routingKey="foo";
- Struct32 s(dp);
- string data;
- Codec::encode(back_inserter(data))(s);
-
- uint32_t structSize; // Starts with size
- Codec::decode(data.begin())(structSize);
- BOOST_CHECK_EQUAL(structSize, Codec::size(dp) + 2); // +2 for code
- BOOST_CHECK_EQUAL(structSize, data.size()-4); // encoded body
-
- BOOST_CHECK_EQUAL(data.size(), Codec::size(s));
- Struct32 s2;
- Codec::decode(data.begin())(s2);
- message::DeliveryProperties* dp2 = s2.getIf<message::DeliveryProperties>();
- BOOST_REQUIRE(dp2);
- BOOST_CHECK_EQUAL(dp2->priority, message::MEDIUM);
- BOOST_CHECK_EQUAL(dp2->routingKey, "foo");
-}
-
-QPID_AUTO_TEST_CASE(testStruct32Unknown) {
- // Verify we can recode an unknown struct unchanged.
- Struct32 s;
- string data;
- Codec::encode(back_inserter(data))(uint32_t(10));
- data.append(10, 'X');
- Codec::decode(data.begin())(s);
- string data2;
- Codec::encode(back_inserter(data2))(s);
- BOOST_CHECK_EQUAL(data.size(), data2.size());
- BOOST_CHECK_EQUAL(data, data2);
-}
-
-struct DummyPacked {
- static const uint8_t PACK=1;
- boost::optional<char> i, j;
- char k;
- Bit l,m;
- DummyPacked(char a=0, char b=0, char c=0) : i(a), j(b), k(c), l(), m() {}
- template <class S> void serialize(S& s) { s(i)(j)(k)(l)(m); }
-};
-
-Packer<DummyPacked> serializable(DummyPacked& d) { return Packer<DummyPacked>(d); }
-
-QPID_AUTO_TEST_CASE(testPackBits) {
- DummyPacked d('a','b','c');
- BOOST_CHECK_EQUAL(packBits(d), 7u);
- d.j = boost::none;
- BOOST_CHECK_EQUAL(packBits(d), 5u);
- d.m = true;
- BOOST_CHECK_EQUAL(packBits(d), 0x15u);
-}
-
-
-QPID_AUTO_TEST_CASE(testPacked) {
- string data;
-
- Codec::encode(back_inserter(data))('a')(boost::optional<char>('b'))(boost::optional<char>())('c');
- BOOST_CHECK_EQUAL(data, "abc");
- data.clear();
-
- DummyPacked dummy('a','b','c');
-
- Codec::encode(back_inserter(data))(dummy);
- BOOST_CHECK_EQUAL(data.size(), 4u);
- BOOST_CHECK_EQUAL(data, string("\007abc"));
- data.clear();
-
- dummy.i = boost::none;
- Codec::encode(back_inserter(data))(dummy);
- BOOST_CHECK_EQUAL(data, string("\6bc"));
- data.clear();
-
- const char* missing = "\5xy";
- Codec::decode(missing)(dummy);
- BOOST_CHECK(dummy.i);
- BOOST_CHECK_EQUAL(*dummy.i, 'x');
- BOOST_CHECK(!dummy.j);
- BOOST_CHECK_EQUAL(dummy.k, 'y');
-}
-
-QPID_AUTO_TEST_CASE(testUnitControl) {
- string data;
- Control::Holder h(in_place<connection::Tune>(1,2,3,4));
- Codec::encode(std::back_inserter(data))(h);
-
- Unit unit(FrameHeader(FIRST_FRAME|LAST_FRAME, CONTROL));
- Codec::decode(data.begin())(unit);
-
- BOOST_REQUIRE(unit.get<ControlHolder>());
-
- string data2;
- Codec::encode(back_inserter(data2))(unit);
-
- BOOST_CHECK_EQUAL(data, data2);
-}
-
-QPID_AUTO_TEST_CASE(testArray) {
- ArrayDomain<char> a;
- a.resize(3, 'x');
- string data;
- Codec::encode(back_inserter(data))(a);
-
- ArrayDomain<char> b;
- Codec::decode(data.begin())(b);
- BOOST_CHECK_EQUAL(b.size(), 3u);
- string data3;
- Codec::encode(back_inserter(data3))(a);
- BOOST_CHECK_EQUAL(data, data3);
-
- Array x;
- Codec::decode(data.begin())(x);
- BOOST_CHECK_EQUAL(x.size(), 3u);
- BOOST_CHECK_EQUAL(x[0].size(), 1u);
- BOOST_CHECK_EQUAL(*x[0].begin(), 'x');
- BOOST_CHECK_EQUAL(*x[2].begin(), 'x');
-
- string data2;
- Codec::encode(back_inserter(data2))(x);
- BOOST_CHECK_EQUAL(data,data2);
-}
-
-QPID_AUTO_TEST_CASE(testStruct) {
- string data;
-
- message::DeliveryProperties dp;
- BOOST_CHECK(!dp.discardUnroutable);
- dp.immediate = true;
- dp.redelivered = false;
- dp.priority = message::MEDIUM;
- dp.exchange = "foo";
-
- Codec::encode(back_inserter(data))(dp);
- // Skip 4 bytes size, little-endian decode for pack bits.
- uint16_t encodedBits=uint8_t(data[5]);
- encodedBits <<= 8;
- encodedBits += uint8_t(data[4]);
- BOOST_CHECK_EQUAL(encodedBits, packBits(dp));
-
- data.clear();
- Struct32 h(dp);
- Codec::encode(back_inserter(data))(h);
-
- Struct32 h2;
- Codec::decode(data.begin())(h2);
- BOOST_CHECK_EQUAL(h2.getClassCode(), Uint8(message::DeliveryProperties::CLASS_CODE));
- BOOST_CHECK_EQUAL(h2.getCode(), Uint8(message::DeliveryProperties::CODE));
- message::DeliveryProperties* dp2 =
- dynamic_cast<message::DeliveryProperties*>(h2.get());
- BOOST_CHECK(dp2);
- BOOST_CHECK(!dp2->discardUnroutable);
- BOOST_CHECK(dp2->immediate);
- BOOST_CHECK(!dp2->redelivered);
- BOOST_CHECK_EQUAL(dp2->priority, message::MEDIUM);
- BOOST_CHECK_EQUAL(dp2->exchange, "foo");
-}
-
-struct RecodeUnit {
- template <class T>
- void operator() (const T& t) {
- BOOST_MESSAGE(BOOST_CURRENT_FUNCTION << " called with: " << t);
- using qpid::framing::Buffer;
- using qpid::framing::AMQFrame;
-
- session::Header sh;
- BOOST_CHECK_EQUAL(Codec::size(sh), 2u);
-
- // Encode unit.
- Unit u(t);
- string data;
- Codec::encode(back_inserter(data))(u.getHeader())(u);
- data.push_back(char(0xCE)); // Preview end-of-frame
-
- // Decode AMQFrame
- Buffer buf(&data[0], data.size());
- AMQFrame f;
- f.decode(buf);
- BOOST_MESSAGE("AMQFrame decoded: " << f);
- // Encode AMQFrame
- string data2(f.size(), ' ');
- Buffer buf2(&data2[0], data.size());
- f.encode(buf2);
-
- // Verify encoded by unit == encoded by AMQFrame
- BOOST_CHECK_MESSAGE(data == data2, BOOST_CURRENT_FUNCTION);
-
- // Decode unit
- // FIXME aconway 2008-04-15: must set limit to decode a header.
- Codec::Decoder<string::iterator> decode(data2.begin(), data2.size()-1);
-
- FrameHeader h;
- decode(h);
- BOOST_CHECK_EQUAL(u.getHeader(), h);
- Unit u2(h);
- decode(u2);
-
- // Re-encode unit
- string data3;
- Codec::encode(back_inserter(data3))(u2.getHeader())(u2);
- data3.push_back(char(0xCE)); // Preview end-of-frame
-
- BOOST_CHECK_MESSAGE(data3 == data2, BOOST_CURRENT_FUNCTION);
- }
-};
-
-QPID_AUTO_TEST_CASE(testSerializeAllSegmentTypes) {
- RecodeUnit recode;
- allSegmentTypes(recode);
-}
-
-QPID_AUTO_TEST_SUITE_END()
diff --git a/cpp/src/tests/background.ps1 b/cpp/src/tests/background.ps1
deleted file mode 100644
index 36e9e4e6e9..0000000000
--- a/cpp/src/tests/background.ps1
+++ /dev/null
@@ -1,55 +0,0 @@
-#
-# 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 PowerShell scriptblock in a background process.
-param(
- [scriptblock] $script # scriptblock to run
-)
-
-# break out of the script on any errors
-trap { break }
-
-# In order to pass a scriptblock to another powershell instance, it must
-# be encoded to pass through the command line.
-$encodedScript = [convert]::ToBase64String(
- [Text.Encoding]::Unicode.GetBytes([string] $script))
-
-#$p = new-object System.Diagnostics.Process
-$si = new-object System.Diagnostics.ProcessStartInfo
-$si.WorkingDirectory = $pwd
-$si.FileName = (get-command powershell.exe).Definition
-$si.Arguments = "-encodedCommand $encodedScript"
-
-###### debugging setup
-#$si.CreateNoWindow = $true
-# UseShellExecute false required for RedirectStandard(Error, Output)
-#$si.UseShellExecute = $false
-#$si.RedirectStandardError = $true
-#$si.RedirectStandardOutput = $true
-######
-$si.UseShellExecute = $true
-
-##### Debugging, instead of the plain Start() above.
-#$output = [io.File]::AppendText("start.out")
-#$error = [io.File]::AppendText("start.err")
-$p = [System.Diagnostics.Process]::Start($si)
-#$output.WriteLine($p.StandardOutput.ReadToEnd())
-#$error.WriteLine($p.StandardError.ReadToEnd())
-#$p.WaitForExit()
-#$output.Close()
diff --git a/cpp/src/tests/benchmark b/cpp/src/tests/benchmark
deleted file mode 100755
index c075837847..0000000000
--- a/cpp/src/tests/benchmark
+++ /dev/null
@@ -1,95 +0,0 @@
-#!/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.
-#
-# A basic "benchmark" to generate performacne samples of throughput
-# and latency against a single cluster member while they are replicating.
-#
-# Must be run in the qpid src/tests build directory.
-#
-
-usage() {
-cat <<EOF
-Usage: $0 [options] -- client hosts --- broker hosts
-Read the script for options.
-EOF
-}
-# Defaults
-TESTDIR=${TESTDIR:-$PWD} # Absolute path to test exes on all hosts.
-SCRIPTDIR=${SCRIPTDIR:-`dirname $0`} # Path to local test scripts directory.
-SAMPLES=10 # Runs of each test.
-COUNT=${COUNT:-10000} # Count for pub/sub tests.
-SIZE=${SIZE:-600} # Size of messages
-ECHO=${ECHO:-1000} # Count for echo test.
-NSUBS=${NSUBS:-4}
-NPUBS=${NPUBS:-4}
-
-collect() { eval $COLLECT=\""\$$COLLECT $*"\"; }
-COLLECT=ARGS
-while test $# -gt 0; do
- case $1 in
- --testdir) TESTDIR=$2 ; shift 2 ;;
- --samples) SAMPLES=$2 ; shift 2 ;;
- --count) COUNT=$2 ; shift 2 ;;
- --echos) ECHO=$2 ; shift 2 ;;
- --size) SIZE=$2 ; shift 2 ;;
- --nsubs) NSUBS=$2 ; shift 2 ;;
- --npubs) NPUBS=$2 ; shift 2 ;;
- --) COLLECT=CLIENTARG; shift ;;
- ---) COLLECT=BROKERARG; shift;;
- *) collect $1; shift ;;
- esac
-done
-
-CLIENTS=${CLIENTARG:-$CLIENTS}
-BROKERS=${BROKERARG:-$BROKERS}
-test -z "$CLIENTS" && { echo "Must specify at least one client host."; exit 1; }
-test -z "$BROKERS" && { echo "Must specify at least one broker host."; exit 1; }
-
-export TESTDIR # For perfdist
-CLIENTS=($CLIENTS) # Convert to array
-BROKERS=($BROKERS)
-trap "rm -f $FILES" EXIT
-
-dosamples() {
- FILE=`mktemp`
- FILES="$FILES $FILE"
- TABS=`echo "$HEADING" | sed s'/[^ ]//g'`
- {
- echo "\"$*\"$TABS"
- echo "$HEADING"
- for (( i=0; i<$SAMPLES; ++i)) ; do echo "`$*`" ; done
- echo
- } | tee $FILE
-}
-
-HEADING="pub sub total Mb"
-dosamples $SCRIPTDIR/perfdist --size $SIZE --count $COUNT --nsubs $NSUBS --npubs $NPUBS -s -- ${CLIENTS[*]} --- ${BROKERS[*]}
-HEADING="pub"
-dosamples ssh -A ${CLIENTS[0]} $TESTDIR/publish --routing-key perftest0 --size $SIZE --count $COUNT -s -b ${BROKERS[0]}
-HEADING="sub"
-dosamples ssh -A ${CLIENTS[0]} $TESTDIR/consume --queue perftest0 -s --count $COUNT -b ${BROKERS[0]}
-HEADING="min max avg"
-dosamples ssh -A ${CLIENTS[0]} $TESTDIR/echotest --count $ECHO -s -b ${BROKERS[0]}
-
-echo
-echo "Tab separated spreadsheet (also saved as benchmark.tab):"
-echo
-
-echo "benchmark -- ${CLIENTS[*]} --- ${BROKERS[*]} " | tee benchmark.tab
-paste $FILES | tee -a benchmark.tab
diff --git a/cpp/src/tests/brokermgmt.mk b/cpp/src/tests/brokermgmt.mk
deleted file mode 100644
index cf9a47200c..0000000000
--- a/cpp/src/tests/brokermgmt.mk
+++ /dev/null
@@ -1,44 +0,0 @@
-#
-# 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.
-#
-
-# Build a unit test for the broker's internal management agent.
-
-BROKERMGMT_GEN_SRC= \
- brokermgmt_gen/qmf/org/apache/qpid/broker/mgmt/test/Package.cpp \
- brokermgmt_gen/qmf/org/apache/qpid/broker/mgmt/test/Package.h \
- brokermgmt_gen/qmf/org/apache/qpid/broker/mgmt/test/TestObject.h \
- brokermgmt_gen/qmf/org/apache/qpid/broker/mgmt/test/TestObject.cpp
-
-$(BROKERMGMT_GEN_SRC): brokermgmt_gen.timestamp
-
-if GENERATE
-BROKERMGMT_DEPS=../mgen.timestamp
-endif # GENERATE
-brokermgmt_gen.timestamp: BrokerMgmtAgent.xml ${BROKERMGMT_DEPS}
- $(QMF_GEN) -b -o brokermgmt_gen/qmf $(srcdir)/BrokerMgmtAgent.xml
- touch $@
-
-BrokerMgmtAgent.$(OBJEXT): $(BROKERMGMT_GEN_SRC)
-
-CLEANFILES+=$(BROKERMGMT_GEN_SRC) brokermgmt_gen.timestamp
-
-unit_test_SOURCES+=BrokerMgmtAgent.cpp ${BROKERMGMT_GEN_SRC}
-INCLUDES+= -Ibrokermgmt_gen
-
-EXTRA_DIST+=BrokerMgmtAgent.xml
diff --git a/cpp/src/tests/brokertest.py b/cpp/src/tests/brokertest.py
deleted file mode 100644
index a19dd305e5..0000000000
--- a/cpp/src/tests/brokertest.py
+++ /dev/null
@@ -1,671 +0,0 @@
-#
-# 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.
-#
-
-# Support library for tests that start multiple brokers, e.g. cluster
-# or federation
-
-import os, signal, string, tempfile, subprocess, socket, threading, time, imp, re
-import qpid, traceback, signal
-from qpid import connection, messaging, util
-from qpid.compat import format_exc
-from qpid.harness import Skipped
-from unittest import TestCase
-from copy import copy
-from threading import Thread, Lock, Condition
-from logging import getLogger
-import qmf.console
-
-log = getLogger("qpid.brokertest")
-
-# Values for expected outcome of process at end of test
-EXPECT_EXIT_OK=1 # Expect to exit with 0 status before end of test.
-EXPECT_EXIT_FAIL=2 # Expect to exit with non-0 status before end of test.
-EXPECT_RUNNING=3 # Expect to still be running at end of test
-EXPECT_UNKNOWN=4 # No expectation, don't check exit status.
-
-def find_exe(program):
- """Find an executable in the system PATH"""
- def is_exe(fpath):
- return os.path.isfile(fpath) and os.access(fpath, os.X_OK)
- mydir, name = os.path.split(program)
- if mydir:
- if is_exe(program): return program
- else:
- for path in os.environ["PATH"].split(os.pathsep):
- exe_file = os.path.join(path, program)
- if is_exe(exe_file): return exe_file
- return None
-
-def is_running(pid):
- try:
- os.kill(pid, 0)
- return True
- except:
- return False
-
-class BadProcessStatus(Exception):
- pass
-
-def error_line(filename, n=1):
- """Get the last n line(s) of filename for error messages"""
- result = []
- try:
- f = open(filename)
- try:
- for l in f:
- if len(result) == n: result.pop(0)
- result.append(" "+l)
- finally:
- f.close()
- except: return ""
- return ":\n" + "".join(result)
-
-def retry(function, timeout=10, delay=.01):
- """Call function until it returns True or timeout expires.
- Double the delay for each retry. Return True if function
- returns true, False if timeout expires."""
- deadline = time.time() + timeout
- while not function():
- remaining = deadline - time.time()
- if remaining <= 0: return False
- delay = min(delay, remaining)
- time.sleep(delay)
- delay *= 2
- return True
-
-class AtomicCounter:
- def __init__(self):
- self.count = 0
- self.lock = Lock()
-
- def next(self):
- self.lock.acquire();
- ret = self.count
- self.count += 1
- self.lock.release();
- return ret
-
-_popen_id = AtomicCounter() # Popen identifier for use in output file names.
-
-# Constants for file descriptor arguments to Popen
-FILE = "FILE" # Write to file named after process
-PIPE = subprocess.PIPE
-
-class Popen(subprocess.Popen):
- """
- Can set and verify expectation of process status at end of test.
- Dumps command line, stdout, stderr to data dir for debugging.
- """
-
- def __init__(self, cmd, expect=EXPECT_EXIT_OK, stdin=None, stdout=FILE, stderr=FILE):
- """Run cmd (should be a list of program and arguments)
- expect - if set verify expectation at end of test.
- stdout, stderr - can have the same values as for subprocess.Popen as well as
- FILE (the default) which means write to a file named after the process.
- stdin - like subprocess.Popen but defauts to PIPE
- """
- self._clean = False
- self._clean_lock = Lock()
- assert find_exe(cmd[0]), "executable not found: "+cmd[0]
- if type(cmd) is type(""): cmd = [cmd] # Make it a list.
- self.cmd = [ str(x) for x in cmd ]
- self.expect = expect
- self.id = _popen_id.next()
- self.pname = "%s-%d" % (os.path.split(self.cmd[0])[1], self.id)
- if stdout == FILE: stdout = open(self.outfile("out"), "w")
- if stderr == FILE: stderr = open(self.outfile("err"), "w")
- try:
- subprocess.Popen.__init__(self, self.cmd, bufsize=0, executable=None,
- stdin=stdin, stdout=stdout, stderr=stderr,
- close_fds=True)
- except ValueError: # Windows can't do close_fds
- subprocess.Popen.__init__(self, self.cmd, bufsize=0, executable=None,
- stdin=stdin, stdout=stdout, stderr=stderr)
-
- f = open(self.outfile("cmd"), "w")
- try: f.write("%s\n%d"%(self.cmd_str(), self.pid))
- finally: f.close()
- log.debug("Started process %s: %s" % (self.pname, " ".join(self.cmd)))
-
- def __str__(self): return "Popen<%s>"%(self.pname)
-
- def outfile(self, ext): return "%s.%s" % (self.pname, ext)
-
- def unexpected(self,msg):
- err = error_line(self.outfile("err")) or error_line(self.outfile("out"))
- raise BadProcessStatus("%s %s%s" % (self.pname, msg, err))
-
- def stop(self): # Clean up at end of test.
- try:
- if self.expect == EXPECT_UNKNOWN:
- try: self.kill() # Just make sure its dead
- except: pass
- elif self.expect == EXPECT_RUNNING:
- try: self.kill()
- except: self.unexpected("expected running, exit code %d" % self.wait())
- else:
- retry(lambda: self.poll() is not None)
- if self.returncode is None: # Still haven't stopped
- self.kill()
- self.unexpected("still running")
- elif self.expect == EXPECT_EXIT_OK and self.returncode != 0:
- self.unexpected("exit code %d" % self.returncode)
- elif self.expect == EXPECT_EXIT_FAIL and self.returncode == 0:
- self.unexpected("expected error")
- finally:
- self.wait() # Clean up the process.
-
- def communicate(self, input=None):
- ret = subprocess.Popen.communicate(self, input)
- self.cleanup()
- return ret
-
- def is_running(self): return self.poll() is None
-
- def assert_running(self):
- if not self.is_running(): self.unexpected("Exit code %d" % self.returncode)
-
- def wait(self):
- ret = subprocess.Popen.wait(self)
- self._cleanup()
- return ret
-
- def terminate(self):
- try: subprocess.Popen.terminate(self)
- except AttributeError: # No terminate method
- try:
- os.kill( self.pid , signal.SIGTERM)
- except AttributeError: # no os.kill, using taskkill.. (Windows only)
- os.popen('TASKKILL /PID ' +str(self.pid) + ' /F')
- self._cleanup()
-
- def kill(self):
- try: subprocess.Popen.kill(self)
- except AttributeError: # No terminate method
- try:
- os.kill( self.pid , signal.SIGKILL)
- except AttributeError: # no os.kill, using taskkill.. (Windows only)
- os.popen('TASKKILL /PID ' +str(self.pid) + ' /F')
- self._cleanup()
-
- def _cleanup(self):
- """Clean up after a dead process"""
- self._clean_lock.acquire()
- if not self._clean:
- self._clean = True
- try: self.stdin.close()
- except: pass
- try: self.stdout.close()
- except: pass
- try: self.stderr.close()
- except: pass
- self._clean_lock.release()
-
- def cmd_str(self): return " ".join([str(s) for s in self.cmd])
-
-def checkenv(name):
- value = os.getenv(name)
- if not value: raise Exception("Environment variable %s is not set" % name)
- return value
-
-def find_in_file(str, filename):
- if not os.path.exists(filename): return False
- f = open(filename)
- try: return str in f.read()
- finally: f.close()
-
-class Broker(Popen):
- "A broker process. Takes care of start, stop and logging."
- _broker_count = 0
-
- def __str__(self): return "Broker<%s %s>"%(self.name, self.pname)
-
- def find_log(self):
- self.log = "%s.log" % self.name
- i = 1
- while (os.path.exists(self.log)):
- self.log = "%s-%d.log" % (self.name, i)
- i += 1
-
- def get_log(self):
- return os.path.abspath(self.log)
-
- def __init__(self, test, args=[], name=None, expect=EXPECT_RUNNING, port=0, log_level=None, wait=None):
- """Start a broker daemon. name determines the data-dir and log
- file names."""
-
- self.test = test
- self._port=port
- if BrokerTest.store_lib:
- args = args + ['--load-module', BrokerTest.store_lib]
- if BrokerTest.sql_store_lib:
- args = args + ['--load-module', BrokerTest.sql_store_lib]
- args = args + ['--catalog', BrokerTest.sql_catalog]
- if BrokerTest.sql_clfs_store_lib:
- args = args + ['--load-module', BrokerTest.sql_clfs_store_lib]
- args = args + ['--catalog', BrokerTest.sql_catalog]
- cmd = [BrokerTest.qpidd_exec, "--port", port, "--no-module-dir"] + args
- if not "--auth" in args: cmd.append("--auth=no")
- if wait != None:
- cmd += ["--wait", str(wait)]
- if name: self.name = name
- else:
- self.name = "broker%d" % Broker._broker_count
- Broker._broker_count += 1
- self.find_log()
- cmd += ["--log-to-file", self.log]
- cmd += ["--log-to-stderr=no"]
- if log_level != None:
- cmd += ["--log-enable=%s" % log_level]
- self.datadir = self.name
- cmd += ["--data-dir", self.datadir]
- Popen.__init__(self, cmd, expect, stdout=PIPE)
- test.cleanup_stop(self)
- self._host = "127.0.0.1"
- log.debug("Started broker %s (%s, %s)" % (self.name, self.pname, self.log))
- self._log_ready = False
-
- def startQmf(self, handler=None):
- self.qmf_session = qmf.console.Session(handler)
- self.qmf_broker = self.qmf_session.addBroker("%s:%s" % (self.host(), self.port()))
-
- def host(self): return self._host
-
- def port(self):
- # Read port from broker process stdout if not already read.
- if (self._port == 0):
- try: self._port = int(self.stdout.readline())
- except ValueError:
- raise Exception("Can't get port for broker %s (%s)%s" %
- (self.name, self.pname, error_line(self.log,5)))
- return self._port
-
- def unexpected(self,msg):
- raise BadProcessStatus("%s: %s (%s)" % (msg, self.name, self.pname))
-
- def connect(self, **kwargs):
- """New API connection to the broker."""
- return messaging.Connection.establish(self.host_port(), **kwargs)
-
- def connect_old(self):
- """Old API connection to the broker."""
- socket = qpid.util.connect(self.host(),self.port())
- connection = qpid.connection.Connection (sock=socket)
- connection.start()
- return connection;
-
- def declare_queue(self, queue):
- c = self.connect_old()
- s = c.session(str(qpid.datatypes.uuid4()))
- s.queue_declare(queue=queue)
- c.close()
-
- def _prep_sender(self, queue, durable, xprops):
- s = queue + "; {create:always, node:{durable:" + str(durable)
- if xprops != None: s += ", x-declare:{" + xprops + "}"
- return s + "}}"
-
- def send_message(self, queue, message, durable=True, xprops=None, session=None):
- if session == None:
- s = self.connect().session()
- else:
- s = session
- s.sender(self._prep_sender(queue, durable, xprops)).send(message)
- if session == None:
- s.connection.close()
-
- def send_messages(self, queue, messages, durable=True, xprops=None, session=None):
- if session == None:
- s = self.connect().session()
- else:
- s = session
- sender = s.sender(self._prep_sender(queue, durable, xprops))
- for m in messages: sender.send(m)
- if session == None:
- s.connection.close()
-
- def get_message(self, queue):
- s = self.connect().session()
- m = s.receiver(queue+"; {create:always}", capacity=1).fetch(timeout=1)
- s.acknowledge()
- s.connection.close()
- return m
-
- def get_messages(self, queue, n):
- s = self.connect().session()
- receiver = s.receiver(queue+"; {create:always}", capacity=n)
- m = [receiver.fetch(timeout=1) for i in range(n)]
- s.acknowledge()
- s.connection.close()
- return m
-
- def host_port(self): return "%s:%s" % (self.host(), self.port())
-
- def log_ready(self):
- """Return true if the log file exists and contains a broker ready message"""
- if not self._log_ready:
- self._log_ready = find_in_file("notice Broker running", self.log)
- return self._log_ready
-
- def ready(self, **kwargs):
- """Wait till broker is ready to serve clients"""
- # First make sure the broker is listening by checking the log.
- if not retry(self.log_ready, timeout=60):
- raise Exception(
- "Timed out waiting for broker %s%s"%(self.name, error_line(self.log,5)))
- # Create a connection and a session. For a cluster broker this will
- # return after cluster init has finished.
- try:
- c = self.connect(**kwargs)
- try: c.session()
- finally: c.close()
- except Exception,e: raise RethrownException(
- "Broker %s not responding: (%s)%s"%(self.name,e,error_line(self.log, 5)))
-
- def store_state(self):
- f = open(os.path.join(self.datadir, "cluster", "store.status"))
- try: uuids = f.readlines()
- finally: f.close()
- null_uuid="00000000-0000-0000-0000-000000000000\n"
- if len(uuids) < 2: return "unknown" # we looked while the file was being updated.
- if uuids[0] == null_uuid: return "empty"
- if uuids[1] == null_uuid: return "dirty"
- return "clean"
-
-class Cluster:
- """A cluster of brokers in a test."""
-
- _cluster_count = 0
-
- def __init__(self, test, count=0, args=[], expect=EXPECT_RUNNING, wait=True):
- self.test = test
- self._brokers=[]
- self.name = "cluster%d" % Cluster._cluster_count
- Cluster._cluster_count += 1
- # Use unique cluster name
- self.args = copy(args)
- self.args += [ "--cluster-name", "%s-%s:%d" % (self.name, socket.gethostname(), os.getpid()) ]
- self.args += [ "--log-enable=info+", "--log-enable=debug+:cluster"]
- assert BrokerTest.cluster_lib, "Cannot locate cluster plug-in"
- self.args += [ "--load-module", BrokerTest.cluster_lib ]
- self.start_n(count, expect=expect, wait=wait)
-
- def start(self, name=None, expect=EXPECT_RUNNING, wait=True, args=[], port=0):
- """Add a broker to the cluster. Returns the index of the new broker."""
- if not name: name="%s-%d" % (self.name, len(self._brokers))
- self._brokers.append(self.test.broker(self.args+args, name, expect, wait, port=port))
- return self._brokers[-1]
-
- def start_n(self, count, expect=EXPECT_RUNNING, wait=True, args=[]):
- for i in range(count): self.start(expect=expect, wait=wait, args=args)
-
- # Behave like a list of brokers.
- def __len__(self): return len(self._brokers)
- def __getitem__(self,index): return self._brokers[index]
- def __iter__(self): return self._brokers.__iter__()
-
-class BrokerTest(TestCase):
- """
- Tracks processes started by test and kills at end of test.
- Provides a well-known working directory for each test.
- """
-
- # Environment settings.
- qpidd_exec = os.path.abspath(checkenv("QPIDD_EXEC"))
- cluster_lib = os.getenv("CLUSTER_LIB")
- xml_lib = os.getenv("XML_LIB")
- qpid_config_exec = os.getenv("QPID_CONFIG_EXEC")
- qpid_route_exec = os.getenv("QPID_ROUTE_EXEC")
- receiver_exec = os.getenv("RECEIVER_EXEC")
- sender_exec = os.getenv("SENDER_EXEC")
- sql_store_lib = os.getenv("STORE_SQL_LIB")
- sql_clfs_store_lib = os.getenv("STORE_SQL_CLFS_LIB")
- sql_catalog = os.getenv("STORE_CATALOG")
- store_lib = os.getenv("STORE_LIB")
- test_store_lib = os.getenv("TEST_STORE_LIB")
- rootdir = os.getcwd()
-
- def configure(self, config): self.config=config
-
- def setUp(self):
- outdir = self.config.defines.get("OUTDIR") or "brokertest.tmp"
- self.dir = os.path.join(self.rootdir, outdir, self.id())
- os.makedirs(self.dir)
- os.chdir(self.dir)
- self.stopem = [] # things to stop at end of test
-
- def tearDown(self):
- err = []
- for p in self.stopem:
- try: p.stop()
- except Exception, e: err.append(str(e))
- self.stopem = [] # reset in case more processes start
- os.chdir(self.rootdir)
- if err: raise Exception("Unexpected process status:\n "+"\n ".join(err))
-
- def cleanup_stop(self, stopable):
- """Call thing.stop at end of test"""
- self.stopem.append(stopable)
-
- def popen(self, cmd, expect=EXPECT_EXIT_OK, stdin=None, stdout=FILE, stderr=FILE):
- """Start a process that will be killed at end of test, in the test dir."""
- os.chdir(self.dir)
- p = Popen(cmd, expect, stdin=stdin, stdout=stdout, stderr=stderr)
- self.cleanup_stop(p)
- return p
-
- def broker(self, args=[], name=None, expect=EXPECT_RUNNING, wait=True, port=0, log_level=None):
- """Create and return a broker ready for use"""
- b = Broker(self, args=args, name=name, expect=expect, port=port, log_level=log_level)
- if (wait):
- try: b.ready()
- except Exception, e:
- raise RethrownException("Failed to start broker %s(%s): %s" % (b.name, b.log, e))
- return b
-
- def cluster(self, count=0, args=[], expect=EXPECT_RUNNING, wait=True):
- """Create and return a cluster ready for use"""
- cluster = Cluster(self, count, args, expect=expect, wait=wait)
- return cluster
-
- def browse(self, session, queue, timeout=0):
- """Assert that the contents of messages on queue (as retrieved
- using session and timeout) exactly match the strings in
- expect_contents"""
- r = session.receiver("%s;{mode:browse}"%(queue))
- try:
- contents = []
- try:
- while True: contents.append(r.fetch(timeout=timeout).content)
- except messaging.Empty: pass
- finally: pass #FIXME aconway 2011-04-14: r.close()
- return contents
-
- def assert_browse(self, session, queue, expect_contents, timeout=0):
- """Assert that the contents of messages on queue (as retrieved
- using session and timeout) exactly match the strings in
- expect_contents"""
- actual_contents = self.browse(session, queue, timeout)
- self.assertEqual(expect_contents, actual_contents)
-
-def join(thread, timeout=10):
- thread.join(timeout)
- if thread.isAlive(): raise Exception("Timed out joining thread %s"%thread)
-
-class RethrownException(Exception):
- """Captures the stack trace of the current exception to be thrown later"""
- def __init__(self, msg=""):
- Exception.__init__(self, msg+"\n"+format_exc())
-
-class StoppableThread(Thread):
- """
- Base class for threads that do something in a loop and periodically check
- to see if they have been stopped.
- """
- def __init__(self):
- self.stopped = False
- self.error = None
- Thread.__init__(self)
-
- def stop(self):
- self.stopped = True
- join(self)
- if self.error: raise self.error
-
-class NumberedSender(Thread):
- """
- Thread to run a sender client and send numbered messages until stopped.
- """
-
- def __init__(self, broker, max_depth=None, queue="test-queue"):
- """
- max_depth: enable flow control, ensure sent - received <= max_depth.
- Requires self.notify_received(n) to be called each time messages are received.
- """
- Thread.__init__(self)
- self.sender = broker.test.popen(
- ["qpid-send",
- "--broker", "localhost:%s"%broker.port(),
- "--address", "%s;{create:always}"%queue,
- "--failover-updates",
- "--content-stdin"
- ],
- expect=EXPECT_RUNNING,
- stdin=PIPE)
- self.condition = Condition()
- self.max = max_depth
- self.received = 0
- self.stopped = False
- self.error = None
-
- def write_message(self, n):
- self.sender.stdin.write(str(n)+"\n")
- self.sender.stdin.flush()
-
- def run(self):
- try:
- self.sent = 0
- while not self.stopped:
- if self.max:
- self.condition.acquire()
- while not self.stopped and self.sent - self.received > self.max:
- self.condition.wait()
- self.condition.release()
- self.write_message(self.sent)
- self.sent += 1
- except Exception: self.error = RethrownException(self.sender.pname)
-
- def notify_received(self, count):
- """Called by receiver to enable flow control. count = messages received so far."""
- self.condition.acquire()
- self.received = count
- self.condition.notify()
- self.condition.release()
-
- def stop(self):
- self.condition.acquire()
- try:
- self.stopped = True
- self.condition.notify()
- finally: self.condition.release()
- join(self)
- self.write_message(-1) # end-of-messages marker.
- if self.error: raise self.error
-
-class NumberedReceiver(Thread):
- """
- Thread to run a receiver client and verify it receives
- sequentially numbered messages.
- """
- def __init__(self, broker, sender = None, queue="test-queue"):
- """
- sender: enable flow control. Call sender.received(n) for each message received.
- """
- Thread.__init__(self)
- self.test = broker.test
- self.receiver = self.test.popen(
- ["qpid-receive",
- "--broker", "localhost:%s"%broker.port(),
- "--address", "%s;{create:always}"%queue,
- "--failover-updates",
- "--forever"
- ],
- expect=EXPECT_RUNNING,
- stdout=PIPE)
- self.lock = Lock()
- self.error = None
- self.sender = sender
-
- def read_message(self):
- return int(self.receiver.stdout.readline())
-
- def run(self):
- try:
- self.received = 0
- m = self.read_message()
- while m != -1:
- assert(m <= self.received) # Check for missing messages
- if (m == self.received): # Ignore duplicates
- self.received += 1
- if self.sender:
- self.sender.notify_received(self.received)
- m = self.read_message()
- except Exception:
- self.error = RethrownException(self.receiver.pname)
-
- def stop(self):
- """Returns when termination message is received"""
- join(self)
- if self.error: raise self.error
-
-class ErrorGenerator(StoppableThread):
- """
- Thread that continuously generates errors by trying to consume from
- a non-existent queue. For cluster regression tests, error handling
- caused issues in the past.
- """
-
- def __init__(self, broker):
- StoppableThread.__init__(self)
- self.broker=broker
- broker.test.cleanup_stop(self)
- self.start()
-
- def run(self):
- c = self.broker.connect_old()
- try:
- while not self.stopped:
- try:
- c.session(str(qpid.datatypes.uuid4())).message_subscribe(
- queue="non-existent-queue")
- assert(False)
- except qpid.session.SessionException: pass
- time.sleep(0.01)
- except: pass # Normal if broker is killed.
-
-def import_script(path):
- """
- Import executable script at path as a module.
- Requires some trickery as scripts are not in standard module format
- """
- f = open(path)
- try:
- name=os.path.split(path)[1].replace("-","_")
- return imp.load_module(name, f, path, ("", "r", imp.PY_SOURCE))
- finally: f.close()
diff --git a/cpp/src/tests/cli_tests.py b/cpp/src/tests/cli_tests.py
deleted file mode 100755
index 6c75927461..0000000000
--- a/cpp/src/tests/cli_tests.py
+++ /dev/null
@@ -1,475 +0,0 @@
-#!/usr/bin/env python
-#
-# 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.
-#
-
-import sys
-import os
-import imp
-from qpid.testlib import TestBase010
-# from brokertest import import_script, checkenv
-from qpid.datatypes import Message
-from qpid.queue import Empty
-from time import sleep
-
-def import_script(path):
- """
- Import executable script at path as a module.
- Requires some trickery as scripts are not in standard module format
- """
- f = open(path)
- try:
- name=os.path.split(path)[1].replace("-","_")
- return imp.load_module(name, f, path, ("", "r", imp.PY_SOURCE))
- finally: f.close()
-
-def checkenv(name):
- value = os.getenv(name)
- if not value: raise Exception("Environment variable %s is not set" % name)
- return value
-
-class CliTests(TestBase010):
-
- def remote_host(self):
- return self.defines.get("remote-host", "localhost")
-
- def remote_port(self):
- return int(self.defines["remote-port"])
-
- def cli_dir(self):
- return self.defines["cli-dir"]
-
- def makeQueue(self, qname, arguments, api=False):
- if api:
- ret = self.qpid_config_api(" add queue " + qname + " " + arguments)
- else:
- ret = os.system(self.qpid_config_command(" add queue " + qname + " " + arguments))
-
- self.assertEqual(ret, 0)
- queues = self.qmf.getObjects(_class="queue")
- for queue in queues:
- if queue.name == qname:
- return queue
- assert False
-
- def test_queue_params(self):
- self.startQmf()
- queue1 = self.makeQueue("test_queue_params1", "--limit-policy none")
- queue2 = self.makeQueue("test_queue_params2", "--limit-policy reject")
- queue3 = self.makeQueue("test_queue_params3", "--limit-policy flow-to-disk")
- queue4 = self.makeQueue("test_queue_params4", "--limit-policy ring")
- queue5 = self.makeQueue("test_queue_params5", "--limit-policy ring-strict")
-
- LIMIT = "qpid.policy_type"
- assert LIMIT not in queue1.arguments
- self.assertEqual(queue2.arguments[LIMIT], "reject")
- self.assertEqual(queue3.arguments[LIMIT], "flow_to_disk")
- self.assertEqual(queue4.arguments[LIMIT], "ring")
- self.assertEqual(queue5.arguments[LIMIT], "ring_strict")
-
- queue6 = self.makeQueue("test_queue_params6", "--order fifo")
- queue7 = self.makeQueue("test_queue_params7", "--order lvq")
- queue8 = self.makeQueue("test_queue_params8", "--order lvq-no-browse")
-
- LVQ = "qpid.last_value_queue"
- LVQNB = "qpid.last_value_queue_no_browse"
-
- assert LVQ not in queue6.arguments
- assert LVQ in queue7.arguments
- assert LVQ not in queue8.arguments
-
- assert LVQNB not in queue6.arguments
- assert LVQNB not in queue7.arguments
- assert LVQNB in queue8.arguments
-
-
- def test_queue_params_api(self):
- self.startQmf()
- queue1 = self.makeQueue("test_queue_params1", "--limit-policy none", True)
- queue2 = self.makeQueue("test_queue_params2", "--limit-policy reject", True)
- queue3 = self.makeQueue("test_queue_params3", "--limit-policy flow-to-disk", True)
- queue4 = self.makeQueue("test_queue_params4", "--limit-policy ring", True)
- queue5 = self.makeQueue("test_queue_params5", "--limit-policy ring-strict", True)
-
- LIMIT = "qpid.policy_type"
- assert LIMIT not in queue1.arguments
- self.assertEqual(queue2.arguments[LIMIT], "reject")
- self.assertEqual(queue3.arguments[LIMIT], "flow_to_disk")
- self.assertEqual(queue4.arguments[LIMIT], "ring")
- self.assertEqual(queue5.arguments[LIMIT], "ring_strict")
-
- queue6 = self.makeQueue("test_queue_params6", "--order fifo", True)
- queue7 = self.makeQueue("test_queue_params7", "--order lvq", True)
- queue8 = self.makeQueue("test_queue_params8", "--order lvq-no-browse", True)
-
- LVQ = "qpid.last_value_queue"
- LVQNB = "qpid.last_value_queue_no_browse"
-
- assert LVQ not in queue6.arguments
- assert LVQ in queue7.arguments
- assert LVQ not in queue8.arguments
-
- assert LVQNB not in queue6.arguments
- assert LVQNB not in queue7.arguments
- assert LVQNB in queue8.arguments
-
-
- def test_qpid_config(self):
- self.startQmf();
- qmf = self.qmf
- qname = "test_qpid_config"
-
- ret = os.system(self.qpid_config_command(" add queue " + qname))
- self.assertEqual(ret, 0)
- queues = qmf.getObjects(_class="queue")
- found = False
- for queue in queues:
- if queue.name == qname:
- self.assertEqual(queue.durable, False)
- found = True
- self.assertEqual(found, True)
-
- ret = os.system(self.qpid_config_command(" del queue " + qname))
- self.assertEqual(ret, 0)
- queues = qmf.getObjects(_class="queue")
- found = False
- for queue in queues:
- if queue.name == qname:
- found = True
- self.assertEqual(found, False)
-
- def test_qpid_config_api(self):
- self.startQmf();
- qmf = self.qmf
- qname = "test_qpid_config_api"
-
- ret = self.qpid_config_api(" add queue " + qname)
- self.assertEqual(ret, 0)
- queues = qmf.getObjects(_class="queue")
- found = False
- for queue in queues:
- if queue.name == qname:
- self.assertEqual(queue.durable, False)
- found = True
- self.assertEqual(found, True)
-
- ret = self.qpid_config_api(" del queue " + qname)
- self.assertEqual(ret, 0)
- queues = qmf.getObjects(_class="queue")
- found = False
- for queue in queues:
- if queue.name == qname:
- found = True
- self.assertEqual(found, False)
-
-
- def test_qpid_config_sasl_plain_expect_succeed(self):
- self.startQmf();
- qmf = self.qmf
- qname = "test_qpid_config_sasl_plain_expect_succeed"
- cmd = " --sasl-mechanism PLAIN -a guest/guest@localhost:"+str(self.broker.port) + " add queue " + qname
- ret = self.qpid_config_api(cmd)
- self.assertEqual(ret, 0)
-
- def test_qpid_config_sasl_plain_expect_fail(self):
- """Fails because no user name and password is supplied"""
- self.startQmf();
- qmf = self.qmf
- qname = "test_qpid_config_sasl_plain_expect_succeed"
- cmd = " --sasl-mechanism PLAIN -a localhost:"+str(self.broker.port) + " add queue " + qname
- ret = self.qpid_config_api(cmd)
- assert ret != 0
-
- # helpers for some of the test methods
- def helper_find_exchange(self, xchgname, typ, expected=True):
- xchgs = self.qmf.getObjects(_class = "exchange")
- found = False
- for xchg in xchgs:
- if xchg.name == xchgname:
- if typ:
- self.assertEqual(xchg.type, typ)
- found = True
- self.assertEqual(found, expected)
-
- def helper_create_exchange(self, xchgname, typ="direct", opts=""):
- foo = self.qpid_config_command(opts + " add exchange " + typ + " " + xchgname)
- # print foo
- ret = os.system(foo)
- self.assertEqual(ret, 0)
- self.helper_find_exchange(xchgname, typ, True)
-
- def helper_destroy_exchange(self, xchgname):
- foo = self.qpid_config_command(" del exchange " + xchgname)
- # print foo
- ret = os.system(foo)
- self.assertEqual(ret, 0)
- self.helper_find_exchange(xchgname, False, expected=False)
-
- def helper_find_queue(self, qname, expected=True):
- queues = self.qmf.getObjects(_class="queue")
- found = False
- for queue in queues:
- if queue.name == qname:
- self.assertEqual(queue.durable, False)
- found = True
- self.assertEqual(found, expected)
-
- def helper_create_queue(self, qname):
- foo = self.qpid_config_command(" add queue " + qname)
- # print foo
- ret = os.system(foo)
- self.assertEqual(ret, 0)
- self.helper_find_queue(qname, True)
-
- def helper_destroy_queue(self, qname):
- foo = self.qpid_config_command(" del queue " + qname)
- # print foo
- ret = os.system(foo)
- self.assertEqual(ret, 0)
- self.helper_find_queue(qname, False)
-
-
- # test the bind-queue-to-header-exchange functionality
- def test_qpid_config_headers(self):
- self.startQmf();
- qmf = self.qmf
- qname = "test_qpid_config"
- xchgname = "test_xchg"
-
- # first create a header xchg
- self.helper_create_exchange(xchgname, typ="headers")
-
- # create the queue
- self.helper_create_queue(qname)
-
- # now bind the queue to the xchg
- foo = self.qpid_config_command(" bind " + xchgname + " " + qname +
- " key all foo=bar baz=quux")
- # print foo
- ret = os.system(foo)
- self.assertEqual(ret, 0)
-
- # he likes it, mikey. Ok, now tear it all down. first the binding
- ret = os.system(self.qpid_config_command(" unbind " + xchgname + " " + qname +
- " key"))
- self.assertEqual(ret, 0)
-
- # then the queue
- self.helper_destroy_queue(qname)
-
- # then the exchange
- self.helper_destroy_exchange(xchgname)
-
-
- def test_qpid_config_xml(self):
- self.startQmf();
- qmf = self.qmf
- qname = "test_qpid_config"
- xchgname = "test_xchg"
-
- # first create a header xchg
- self.helper_create_exchange(xchgname, typ="xml")
-
- # create the queue
- self.helper_create_queue(qname)
-
- # now bind the queue to the xchg
- foo = self.qpid_config_command("-f test.xquery bind " + xchgname + " " + qname)
- # print foo
- ret = os.system(foo)
- self.assertEqual(ret, 0)
-
- # he likes it, mikey. Ok, now tear it all down. first the binding
- ret = os.system(self.qpid_config_command(" unbind " + xchgname + " " + qname +
- " key"))
- self.assertEqual(ret, 0)
-
- # then the queue
- self.helper_destroy_queue(qname)
-
- # then the exchange
- self.helper_destroy_exchange(xchgname)
-
- def test_qpid_config_durable(self):
- self.startQmf();
- qmf = self.qmf
- qname = "test_qpid_config"
-
- ret = os.system(self.qpid_config_command(" add queue --durable " + qname))
- self.assertEqual(ret, 0)
- queues = qmf.getObjects(_class="queue")
- found = False
- for queue in queues:
- if queue.name == qname:
- self.assertEqual(queue.durable, True)
- found = True
- self.assertEqual(found, True)
-
- ret = os.system(self.qpid_config_command(" del queue " + qname))
- self.assertEqual(ret, 0)
- queues = qmf.getObjects(_class="queue")
- found = False
- for queue in queues:
- if queue.name == qname:
- found = True
- self.assertEqual(found, False)
-
- def test_qpid_config_altex(self):
- self.startQmf();
- qmf = self.qmf
- exName = "testalt"
- qName = "testqalt"
- altName = "amq.direct"
-
- ret = os.system(self.qpid_config_command(" add exchange topic %s --alternate-exchange=%s" % (exName, altName)))
- self.assertEqual(ret, 0)
-
- exchanges = qmf.getObjects(_class="exchange")
- found = False
- for exchange in exchanges:
- if exchange.name == altName:
- self.assertEqual(exchange.altExchange, None)
-
- if exchange.name == exName:
- found = True
- if not exchange.altExchange:
- self.fail("Alternate exchange not set")
- self.assertEqual(exchange._altExchange_.name, altName)
- self.assertEqual(found, True)
-
- ret = os.system(self.qpid_config_command(" add queue %s --alternate-exchange=%s" % (qName, altName)))
- self.assertEqual(ret, 0)
-
- queues = qmf.getObjects(_class="queue")
- found = False
- for queue in queues:
- if queue.name == qName:
- found = True
- if not queue.altExchange:
- self.fail("Alternate exchange not set")
- self.assertEqual(queue._altExchange_.name, altName)
- self.assertEqual(found, True)
-
- def test_qpid_config_list_queues_arguments(self):
- """
- Test to verify that when the type of a policy limit is
- actually a string (though still a valid value), it does not
- upset qpid-config
- """
- self.startQmf();
- qmf = self.qmf
-
- names = ["queue_capacity%s" % (i) for i in range(1, 6)]
- for name in names:
- self.session.queue_declare(queue=name, exclusive=True,
- arguments={'qpid.max_count' : str(i), 'qpid.max_size': '100'})
-
- output = os.popen(self.qpid_config_command(" queues")).readlines()
- queues = [line.split()[0] for line in output[2:len(output)]] #ignore first two lines (header)
-
- for name in names:
- assert name in queues, "%s not in %s" % (name, queues)
-
- def test_qpid_route(self):
- self.startQmf();
- qmf = self.qmf
-
- command = self.cli_dir() + "/qpid-route dynamic add guest/guest@localhost:%d %s:%d amq.topic" %\
- (self.broker.port, self.remote_host(), self.remote_port())
- ret = os.system(command)
- self.assertEqual(ret, 0)
-
- links = qmf.getObjects(_class="link")
- found = False
- for link in links:
- if link.port == self.remote_port():
- found = True
- self.assertEqual(found, True)
-
- def test_qpid_route_api(self):
- self.startQmf();
- qmf = self.qmf
-
- ret = self.qpid_route_api("dynamic add "
- + "guest/guest@localhost:"+str(self.broker.port) + " "
- + str(self.remote_host())+":"+str(self.remote_port()) + " "
- +"amq.direct")
-
- self.assertEqual(ret, 0)
-
- links = qmf.getObjects(_class="link")
- found = False
- for link in links:
- if link.port == self.remote_port():
- found = True
- self.assertEqual(found, True)
-
-
- def test_qpid_route_api(self):
- self.startQmf();
- qmf = self.qmf
-
- ret = self.qpid_route_api("dynamic add "
- + " --client-sasl-mechanism PLAIN "
- + "guest/guest@localhost:"+str(self.broker.port) + " "
- + str(self.remote_host())+":"+str(self.remote_port()) + " "
- +"amq.direct")
-
- self.assertEqual(ret, 0)
-
- links = qmf.getObjects(_class="link")
- found = False
- for link in links:
- if link.port == self.remote_port():
- found = True
- self.assertEqual(found, True)
-
- def test_qpid_route_api_expect_fail(self):
- self.startQmf();
- qmf = self.qmf
-
- ret = self.qpid_route_api("dynamic add "
- + " --client-sasl-mechanism PLAIN "
- + "localhost:"+str(self.broker.port) + " "
- + str(self.remote_host())+":"+str(self.remote_port()) + " "
- +"amq.direct")
- assert ret != 0
-
-
- def getProperty(self, msg, name):
- for h in msg.headers:
- if hasattr(h, name): return getattr(h, name)
- return None
-
- def getAppHeader(self, msg, name):
- headers = self.getProperty(msg, "application_headers")
- if headers:
- return headers[name]
- return None
-
- def qpid_config_command(self, arg = ""):
- return self.cli_dir() + "/qpid-config -a localhost:%d" % self.broker.port + " " + arg
-
- def qpid_config_api(self, arg = ""):
- script = import_script(checkenv("QPID_CONFIG_EXEC"))
- broker = ["-a", "localhost:"+str(self.broker.port)]
- return script.main(broker + arg.split())
-
- def qpid_route_api(self, arg = ""):
- script = import_script(checkenv("QPID_ROUTE_EXEC"))
- return script.main(arg.split())
diff --git a/cpp/src/tests/cluster.cmake b/cpp/src/tests/cluster.cmake
deleted file mode 100644
index 3471173e97..0000000000
--- a/cpp/src/tests/cluster.cmake
+++ /dev/null
@@ -1,90 +0,0 @@
-#
-# 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.
-#
-
-#
-# Cluster tests cmake fragment, to be included in CMakeLists.txt
-#
-
-add_executable (failover_soak failover_soak.cpp ForkedBroker.cpp ${platform_test_additions})
-target_link_libraries (failover_soak qpidclient)
-remember_location(failover_soak)
-
-add_executable (cluster_authentication_soak cluster_authentication_soak.cpp ForkedBroker.cpp ${platform_test_additions})
-target_link_libraries (cluster_authentication_soak qpidclient)
-remember_location(cluster_authentication_soak)
-
-set (cluster_test_SOURCES
- cluster_test
- unit_test
- ClusterFixture
- ForkedBroker
- PartialFailure
- ClusterFailover
- InitialStatusMap
- StoreStatus
- )
-add_executable (cluster_test ${cluster_test_SOURCES} ${platform_test_additions})
-target_link_libraries (cluster_test ${qpid_test_boost_libs} qpidclient qpidbroker cluster_shared)
-remember_location(cluster_test)
-
-add_test (cluster_test ${CMAKE_CURRENT_SOURCE_DIR}/run_cluster_test${test_script_suffix})
-add_test (cluster_tests ${CMAKE_CURRENT_SOURCE_DIR}/run_cluster_tests${test_script_suffix})
-add_test (cluster_read_credit ${CMAKE_CURRENT_SOURCE_DIR}/cluster_read_credit${test_script_suffix})
-add_test (cluster_test_watchdog ${CMAKE_CURRENT_SOURCE_DIR}/test_watchdog${test_script_suffix})
-add_test (federated_cluster_test ${CMAKE_CURRENT_SOURCE_DIR}/federated_cluster_test${test_script_suffix})
-add_test (clustered_replication_test ${CMAKE_CURRENT_SOURCE_DIR}/clustered_replication_test${test_script_suffix})
-
-# FIXME aconway 2009-12-01: translate to cmake
-# # Clean up after cluster_test and start_cluster
-# CLEANFILES += cluster_test.acl cluster.ports
-
-# EXTRA_DIST += \
-# ais_check \
-# run_cluster_test \
-# cluster_read_credit \
-# test_watchdog \
-# start_cluster \
-# stop_cluster \
-# restart_cluster \
-# cluster_python_tests \
-# cluster_python_tests_failing.txt \
-# federated_cluster_test \
-# clustered_replication_test \
-# run_cluster_tests \
-# run_long_cluster_tests \
-# testlib.py \
-# cluster_tests.py \
-# long_cluster_tests.py \
-# cluster_tests.fail
-
-# LONG_TESTS += \
-# run_long_cluster_tests \
-# start_cluster \
-# cluster_python_tests \
-# stop_cluster
-
-# qpidtest_PROGRAMS += cluster_test
-
-# cluster_test_SOURCES = \
-
-# cluster_test_LDADD=$(lib_client) $(lib_broker) ../cluster.la -lboost_unit_test_framework
-
-# qpidtest_SCRIPTS += run_cluster_tests cluster_tests.py run_long_cluster_tests long_cluster_tests.py testlib.py cluster_tests.fail
-
-# endif
diff --git a/cpp/src/tests/cluster.mk b/cpp/src/tests/cluster.mk
deleted file mode 100644
index 7d17dd7bde..0000000000
--- a/cpp/src/tests/cluster.mk
+++ /dev/null
@@ -1,100 +0,0 @@
-#
-# 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.
-#
-
-
-# Include cluster scripts and extra files in distribution even if
-# we're not configured for cluster.
-
-# Useful scripts for doing cluster testing.
-CLUSTER_TEST_SCRIPTS_LIST= \
- allhosts rsynchosts \
- qpid-build-rinstall qpid-src-rinstall \
- qpid-test-cluster \
- qpid-cluster-benchmark
-
-EXTRA_DIST += \
- $(CLUSTER_TEST_SCRIPTS_LIST) \
- ais_check \
- run_cluster_test \
- cluster_read_credit \
- test_watchdog \
- start_cluster \
- stop_cluster \
- restart_cluster \
- cluster_python_tests \
- cluster_python_tests_failing.txt \
- federated_cluster_test \
- clustered_replication_test \
- run_cluster_tests \
- run_long_cluster_tests \
- testlib.py \
- brokertest.py \
- cluster_tests.py \
- cluster_test_logs.py \
- long_cluster_tests.py \
- cluster_tests.fail
-
-
-if HAVE_LIBCPG
-
-#
-# Cluster tests makefile fragment, to be included in Makefile.am
-#
-
-# NOTE: Programs using the openais library must be run with gid=ais
-# You should do "newgrp ais" before running the tests to run these.
-#
-
-
-# ais_check checks pre-requisites for cluster tests and runs them if ok.
-TESTS += \
- run_cluster_test \
- cluster_read_credit \
- test_watchdog \
- run_cluster_tests \
- federated_cluster_test \
- clustered_replication_test
-
-# Clean up after cluster_test and start_cluster
-CLEANFILES += cluster_test.acl cluster.ports
-
-LONG_TESTS += \
- run_long_cluster_tests \
- start_cluster \
- cluster_python_tests \
- stop_cluster
-
-qpidtest_PROGRAMS += cluster_test
-
-cluster_test_SOURCES = \
- cluster_test.cpp \
- unit_test.cpp \
- ClusterFixture.cpp \
- ClusterFixture.h \
- ForkedBroker.h \
- ForkedBroker.cpp \
- PartialFailure.cpp \
- ClusterFailover.cpp
-
-cluster_test_LDADD=$(lib_client) $(lib_broker) ../cluster.la -lboost_unit_test_framework
-
-qpidtest_SCRIPTS += run_cluster_tests brokertest.py cluster_tests.py cluster_test_logs.py run_long_cluster_tests long_cluster_tests.py testlib.py cluster_tests.fail
-qpidtest_SCRIPTS += $(CLUSTER_TEST_SCRIPTS_LIST)
-
-endif
diff --git a/cpp/src/tests/cluster_authentication_soak.cpp b/cpp/src/tests/cluster_authentication_soak.cpp
deleted file mode 100644
index b8e8a22693..0000000000
--- a/cpp/src/tests/cluster_authentication_soak.cpp
+++ /dev/null
@@ -1,310 +0,0 @@
-/*
- *
- * 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.
- *
- */
-
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <signal.h>
-#include <fcntl.h>
-
-#include <sys/wait.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/time.h>
-
-#include <string>
-#include <iostream>
-#include <sstream>
-#include <vector>
-
-#include <boost/assign.hpp>
-
-#include "qpid/framing/Uuid.h"
-
-#include <ForkedBroker.h>
-#include <qpid/client/Connection.h>
-
-#include <sasl/sasl.h>
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-
-
-
-using namespace std;
-using boost::assign::list_of;
-using namespace qpid::framing;
-using namespace qpid::client;
-
-
-namespace qpid {
-namespace tests {
-
-vector<pid_t> brokerPids;
-
-typedef vector<ForkedBroker *> brokerVector;
-
-
-
-
-
-int runSilent = 1;
-int newbiePort = 0;
-
-
-void
-makeClusterName ( string & s ) {
- stringstream ss;
- ss << "authenticationSoakCluster_" << Uuid(true).str();
- s = ss.str();
-}
-
-
-
-void
-startBroker ( brokerVector & brokers , int brokerNumber, string const & clusterName ) {
- stringstream prefix, clusterArg;
- prefix << "soak-" << brokerNumber;
- clusterArg << "--cluster-name=" << clusterName;
-
- std::vector<std::string> argv;
-
- argv.push_back ("../qpidd");
- argv.push_back ("--no-module-dir");
- argv.push_back ("--load-module=../.libs/cluster.so");
- argv.push_back (clusterArg.str());
- argv.push_back ("--cluster-username=zig");
- argv.push_back ("--cluster-password=zig");
- argv.push_back ("--cluster-mechanism=ANONYMOUS");
- argv.push_back ("--sasl-config=./sasl_config");
- argv.push_back ("--auth=yes");
- argv.push_back ("--mgmt-enable=yes");
- argv.push_back ("--log-prefix");
- argv.push_back (prefix.str());
- argv.push_back ("--log-to-file");
- argv.push_back (prefix.str()+".log");
- argv.push_back ("TMP_DATA_DIR");
-
- ForkedBroker * newbie = new ForkedBroker (argv);
- newbiePort = newbie->getPort();
- brokers.push_back ( newbie );
-}
-
-
-
-
-bool
-runPerftest ( bool hangTest ) {
- stringstream portSs;
- portSs << newbiePort;
- string portStr = portSs.str();
- char const * path = "./qpid-perftest";
-
- vector<char const *> argv;
- argv.push_back ( "./qpid-perftest" );
- argv.push_back ( "-p" );
- argv.push_back ( portStr.c_str() );
- argv.push_back ( "--username" );
- argv.push_back ( "zig" );
- argv.push_back ( "--password" );
- argv.push_back ( "zig" );
- argv.push_back ( "--mechanism" );
- argv.push_back ( "DIGEST-MD5" );
- argv.push_back ( "--count" );
- argv.push_back ( "20000" );
- argv.push_back ( 0 );
-
- pid_t pid = fork();
-
- if ( ! pid ) {
- int i=open("/dev/null",O_RDWR);
- dup2 ( i, fileno(stdout) );
- dup2 ( i, fileno(stderr) );
-
- execv ( path, const_cast<char * const *>(&argv[0]) );
- // The exec failed: we are still in parent process.
- perror ( "error running qpid-perftest: " );
- return false;
- }
- else {
- if ( hangTest ) {
- if ( ! runSilent )
- cerr << "Pausing perftest " << pid << endl;
- kill ( pid, 19 );
- }
-
- struct timeval startTime,
- currentTime,
- duration;
-
- gettimeofday ( & startTime, 0 );
-
- while ( 1 ) {
- sleep ( 2 );
- int status;
- int returned_pid = waitpid ( pid, &status, WNOHANG );
- if ( returned_pid == pid ) {
- int exit_status = WEXITSTATUS(status);
- if ( exit_status ) {
- cerr << "qpid-perftest failed. exit_status was: " << exit_status << endl;
- return false;
- }
- else {
- return true; // qpid-perftest succeeded.
- }
- }
- else { // qpid-perftest has not yet completed.
- gettimeofday ( & currentTime, 0 );
- timersub ( & currentTime, & startTime, & duration );
- if ( duration.tv_sec > 60 ) {
- kill ( pid, 9 );
- cerr << "qpid-perftest pid " << pid << " hanging: killed.\n";
- return false;
- }
- }
- }
-
- }
-}
-
-
-
-bool
-allBrokersAreAlive ( brokerVector & brokers ) {
- for ( unsigned int i = 0; i < brokers.size(); ++ i )
- if ( ! brokers[i]->isRunning() )
- return false;
-
- return true;
-}
-
-
-
-
-
-void
-killAllBrokers ( brokerVector & brokers ) {
- for ( unsigned int i = 0; i < brokers.size(); ++ i ) {
- brokers[i]->kill ( 9 );
- }
-}
-
-
-
-
-void
-killOneBroker ( brokerVector & brokers ) {
- int doomedBroker = getpid() % brokers.size();
- cout << "Killing broker " << brokers[doomedBroker]->getPID() << endl;
- brokers[doomedBroker]->kill ( 9 );
- sleep ( 2 );
-}
-
-
-
-
-}} // namespace qpid::tests
-
-using namespace qpid::tests;
-
-
-
-/*
- * Please note that this test has self-test capability.
- * It is intended to detect
- * 1. perftest hangs.
- * 2. broker deaths
- * Both of these condtions can be forced when running manually
- * to ensure that the test really does detect them.
- * See command-line arguments 3 and 4.
- */
-int
-main ( int argc, char ** argv )
-{
- // I need the SASL_PATH_TYPE_CONFIG feature, which did not appear until SASL 2.1.22
-#if (SASL_VERSION_FULL < ((2<<16)|(1<<8)|22))
- cout << "Skipping SASL test, SASL version too low." << endl;
- return 0;
-#endif
-
- int n_iterations = argc > 1 ? atoi(argv[1]) : 1;
- runSilent = argc > 2 ? atoi(argv[2]) : 1; // default to silent
- int killBroker = argc > 3 ? atoi(argv[3]) : 0; // Force the kill of one broker.
- int hangTest = argc > 4 ? atoi(argv[4]) : 0; // Force the first perftest to hang.
- int n_brokers = 3;
- brokerVector brokers;
-
- srand ( getpid() );
- string clusterName;
- makeClusterName ( clusterName );
- for ( int i = 0; i < n_brokers; ++ i ) {
- startBroker ( brokers, i, clusterName );
- }
-
- sleep ( 3 );
-
- /* Run all qpid-perftest iterations, and only then check for brokers
- * still being up. If you just want a quick check for the failure
- * mode in which a single iteration would kill all brokers except
- * the client-connected one, just run it with the iterations arg
- * set to 1.
- */
- for ( int iteration = 0; iteration < n_iterations; ++ iteration ) {
- if ( ! runPerftest ( hangTest ) ) {
- if ( ! runSilent )
- cerr << "qpid-perftest " << iteration << " failed.\n";
- return 1;
- }
- if ( ! ( iteration % 10 ) ) {
- if ( ! runSilent )
- cerr << "qpid-perftest " << iteration << " complete. -------------- \n";
- }
- }
- if ( ! runSilent )
- cerr << "\nqpid-perftest " << n_iterations << " iterations complete. -------------- \n\n";
-
- /* If the command-line tells us to kill a broker, do
- * it now. Use this option to prove that this test
- * really can detect broker-deaths.
- */
- if ( killBroker ) {
- killOneBroker ( brokers );
- }
-
- if ( ! allBrokersAreAlive ( brokers ) ) {
- if ( ! runSilent )
- cerr << "not all brokers are alive.\n";
- killAllBrokers ( brokers );
- return 2;
- }
-
- killAllBrokers ( brokers );
- if ( ! runSilent )
- cout << "success.\n";
-
- return 0;
-}
-
-
-
diff --git a/cpp/src/tests/cluster_python_tests b/cpp/src/tests/cluster_python_tests
deleted file mode 100755
index 9d9137ed57..0000000000
--- a/cpp/src/tests/cluster_python_tests
+++ /dev/null
@@ -1,27 +0,0 @@
-#!/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.
-#
-
-# Skip if cluster services not running.
-. `dirname $0`/ais_check
-
-FAILING=`dirname $0`/cluster_python_tests_failing.txt
-source `dirname $0`/python_tests
-
diff --git a/cpp/src/tests/cluster_python_tests_failing.txt b/cpp/src/tests/cluster_python_tests_failing.txt
deleted file mode 100644
index 7ba8089946..0000000000
--- a/cpp/src/tests/cluster_python_tests_failing.txt
+++ /dev/null
@@ -1,32 +0,0 @@
-qpid_tests.broker_0_10.management.ManagementTest.test_purge_queue
-qpid_tests.broker_0_10.management.ManagementTest.test_connection_close
-qpid_tests.broker_0_10.dtx.DtxTests.test_bad_resume
-qpid_tests.broker_0_10.dtx.DtxTests.test_commit_unknown
-qpid_tests.broker_0_10.dtx.DtxTests.test_end
-qpid_tests.broker_0_10.dtx.DtxTests.test_end_suspend_and_fail
-qpid_tests.broker_0_10.dtx.DtxTests.test_end_unknown_xid
-qpid_tests.broker_0_10.dtx.DtxTests.test_forget_xid_on_completion
-qpid_tests.broker_0_10.dtx.DtxTests.test_get_timeout
-qpid_tests.broker_0_10.dtx.DtxTests.test_get_timeout_unknown
-qpid_tests.broker_0_10.dtx.DtxTests.test_implicit_end
-qpid_tests.broker_0_10.dtx.DtxTests.test_invalid_commit_not_ended
-qpid_tests.broker_0_10.dtx.DtxTests.test_invalid_commit_one_phase_false
-qpid_tests.broker_0_10.dtx.DtxTests.test_invalid_commit_one_phase_true
-qpid_tests.broker_0_10.dtx.DtxTests.test_invalid_prepare_not_ended
-qpid_tests.broker_0_10.dtx.DtxTests.test_invalid_rollback_not_ended
-qpid_tests.broker_0_10.dtx.DtxTests.test_prepare_unknown
-qpid_tests.broker_0_10.dtx.DtxTests.test_recover
-qpid_tests.broker_0_10.dtx.DtxTests.test_rollback_unknown
-qpid_tests.broker_0_10.dtx.DtxTests.test_select_required
-qpid_tests.broker_0_10.dtx.DtxTests.test_set_timeout
-qpid_tests.broker_0_10.dtx.DtxTests.test_simple_commit
-qpid_tests.broker_0_10.dtx.DtxTests.test_simple_prepare_commit
-qpid_tests.broker_0_10.dtx.DtxTests.test_simple_prepare_rollback
-qpid_tests.broker_0_10.dtx.DtxTests.test_simple_rollback
-qpid_tests.broker_0_10.dtx.DtxTests.test_start_already_known
-qpid_tests.broker_0_10.dtx.DtxTests.test_start_join
-qpid_tests.broker_0_10.dtx.DtxTests.test_start_join_and_resume
-qpid_tests.broker_0_10.dtx.DtxTests.test_suspend_resume
-qpid_tests.broker_0_10.dtx.DtxTests.test_suspend_start_end_resume
-qpid_tests.broker_0_10.message.MessageTests.test_ttl
-qpid_tests.broker_0_10.management.ManagementTest.test_broker_connectivity_oldAPI
diff --git a/cpp/src/tests/cluster_read_credit b/cpp/src/tests/cluster_read_credit
deleted file mode 100755
index 370d4098c5..0000000000
--- a/cpp/src/tests/cluster_read_credit
+++ /dev/null
@@ -1,27 +0,0 @@
-#!/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.
-#
-
-# Regression test for http://issues.apache.org/jira/browse/QPID-2086
-
-srcdir=`dirname $0`
-. $srcdir/ais_check
-$srcdir/start_cluster 1 --cluster-read-max=2 || exit 1
-trap $srcdir/stop_cluster EXIT
-seq 1 10000 | ./sender --port `cat cluster.ports` --routing-key no-such-queue
diff --git a/cpp/src/tests/cluster_test.cpp b/cpp/src/tests/cluster_test.cpp
deleted file mode 100644
index f2ccd0ba84..0000000000
--- a/cpp/src/tests/cluster_test.cpp
+++ /dev/null
@@ -1,1231 +0,0 @@
-/*
- *
- * 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 "test_tools.h"
-#include "unit_test.h"
-#include "ForkedBroker.h"
-#include "BrokerFixture.h"
-#include "ClusterFixture.h"
-
-#include "qpid/client/Connection.h"
-#include "qpid/client/ConnectionSettings.h"
-#include "qpid/client/ConnectionAccess.h"
-#include "qpid/client/Session.h"
-#include "qpid/client/FailoverListener.h"
-#include "qpid/client/FailoverManager.h"
-#include "qpid/client/QueueOptions.h"
-#include "qpid/cluster/Cluster.h"
-#include "qpid/cluster/Cpg.h"
-#include "qpid/cluster/UpdateClient.h"
-#include "qpid/framing/AMQBody.h"
-#include "qpid/framing/Uuid.h"
-#include "qpid/framing/reply_exceptions.h"
-#include "qpid/framing/enum.h"
-#include "qpid/framing/MessageTransferBody.h"
-#include "qpid/log/Logger.h"
-#include "qpid/sys/Monitor.h"
-#include "qpid/sys/Thread.h"
-
-#include <boost/bind.hpp>
-#include <boost/shared_ptr.hpp>
-#include <boost/assign.hpp>
-
-#include <string>
-#include <iostream>
-#include <fstream>
-#include <iterator>
-#include <vector>
-#include <set>
-#include <algorithm>
-#include <iterator>
-
-
-using namespace std;
-using namespace qpid;
-using namespace qpid::cluster;
-using namespace qpid::framing;
-using namespace qpid::client;
-using namespace boost::assign;
-using broker::Broker;
-using boost::shared_ptr;
-
-namespace qpid {
-namespace tests {
-
-QPID_AUTO_TEST_SUITE(cluster_test)
-
-bool durableFlag = std::getenv("STORE_LIB") != 0;
-
-void prepareArgs(ClusterFixture::Args& args, const bool durableFlag = false) {
- ostringstream clusterLib;
- clusterLib << getLibPath("CLUSTER_LIB");
- args += "--auth", "no", "--no-module-dir", "--load-module", clusterLib.str();
- if (durableFlag)
- args += "--load-module", getLibPath("STORE_LIB"), "TMP_DATA_DIR";
- else
- args += "--no-data-dir";
-}
-
-ClusterFixture::Args prepareArgs(const bool durableFlag = false) {
- ClusterFixture::Args args;
- prepareArgs(args, durableFlag);
- return args;
-}
-
-// Timeout for tests that wait for messages
-const sys::Duration TIMEOUT=2*sys::TIME_SEC;
-
-
-ostream& operator<<(ostream& o, const cpg_name* n) {
- return o << Cpg::str(*n);
-}
-
-ostream& operator<<(ostream& o, const cpg_address& a) {
- return o << "(" << a.nodeid <<","<<a.pid<<","<<a.reason<<")";
-}
-
-template <class T>
-ostream& operator<<(ostream& o, const pair<T*, int>& array) {
- o << "{ ";
- ostream_iterator<cpg_address> i(o, " ");
- copy(array.first, array.first+array.second, i);
- o << "}";
- return o;
-}
-
-template <class C> set<int> makeSet(const C& c) {
- set<int> s;
- copy(c.begin(), c.end(), inserter(s, s.begin()));
- return s;
-}
-
-class Sender {
- public:
- Sender(boost::shared_ptr<ConnectionImpl> ci, uint16_t ch) : connection(ci), channel(ch) {}
- void send(const AMQBody& body, bool firstSeg, bool lastSeg, bool firstFrame, bool lastFrame) {
- AMQFrame f(body);
- f.setChannel(channel);
- f.setFirstSegment(firstSeg);
- f.setLastSegment(lastSeg);
- f.setFirstFrame(firstFrame);
- f.setLastFrame(lastFrame);
- connection->expand(f.encodedSize(), false);
- connection->handle(f);
- }
-
- private:
- boost::shared_ptr<ConnectionImpl> connection;
- uint16_t channel;
-};
-
-int64_t getMsgSequence(const Message& m) {
- return m.getMessageProperties().getApplicationHeaders().getAsInt64("qpid.msg_sequence");
-}
-
-Message ttlMessage(const string& data, const string& key, uint64_t ttl, bool durable = false) {
- Message m(data, key);
- m.getDeliveryProperties().setTtl(ttl);
- if (durable) m.getDeliveryProperties().setDeliveryMode(framing::PERSISTENT);
- return m;
-}
-
-Message makeMessage(const string& data, const string& key, bool durable = false) {
- Message m(data, key);
- if (durable) m.getDeliveryProperties().setDeliveryMode(framing::PERSISTENT);
- return m;
-}
-
-vector<string> browse(Client& c, const string& q, int n) {
- SubscriptionSettings browseSettings(
- FlowControl::messageCredit(n),
- ACCEPT_MODE_NONE,
- ACQUIRE_MODE_NOT_ACQUIRED,
- 0 // No auto-ack.
- );
- LocalQueue lq;
- c.subs.subscribe(lq, q, browseSettings);
- c.session.messageFlush(q);
- vector<string> result;
- for (int i = 0; i < n; ++i) {
- Message m;
- if (!lq.get(m, TIMEOUT))
- break;
- result.push_back(m.getData());
- }
- c.subs.getSubscription(q).cancel();
- return result;
-}
-
-ConnectionSettings aclSettings(int port, const std::string& id) {
- ConnectionSettings settings;
- settings.port = port;
- settings.mechanism = "PLAIN";
- settings.username = id;
- settings.password = id;
- return settings;
-}
-
-// An illegal frame body
-struct PoisonPill : public AMQBody {
- virtual uint8_t type() const { return 0xFF; }
- virtual void encode(Buffer& ) const {}
- virtual void decode(Buffer& , uint32_t=0) {}
- virtual uint32_t encodedSize() const { return 0; }
-
- virtual void print(std::ostream&) const {};
- virtual void accept(AMQBodyConstVisitor&) const {};
-
- virtual AMQMethodBody* getMethod() { return 0; }
- virtual const AMQMethodBody* getMethod() const { return 0; }
-
- /** Match if same type and same class/method ID for methods */
- static bool match(const AMQBody& , const AMQBody& ) { return false; }
- virtual boost::intrusive_ptr<AMQBody> clone() const { return new PoisonPill; }
-};
-
-QPID_AUTO_TEST_CASE(testBadClientData) {
- // Ensure that bad data on a client connection closes the
- // connection but does not stop the broker.
- ClusterFixture::Args args;
- prepareArgs(args, false);
- args += "--log-enable=critical"; // Supress expected errors
- ClusterFixture cluster(2, args, -1);
- Client c0(cluster[0]);
- Client c1(cluster[1]);
- boost::shared_ptr<client::ConnectionImpl> ci =
- client::ConnectionAccess::getImpl(c0.connection);
- AMQFrame poison(boost::intrusive_ptr<AMQBody>(new PoisonPill));
- ci->expand(poison.encodedSize(), false);
- ci->handle(poison);
- {
- ScopedSuppressLogging sl;
- BOOST_CHECK_THROW(c0.session.queueQuery("q0"), Exception);
- }
- Client c00(cluster[0]);
- BOOST_CHECK_EQUAL(c00.session.queueQuery("q00").getQueue(), "");
- BOOST_CHECK_EQUAL(c1.session.queueQuery("q1").getQueue(), "");
-}
-
-QPID_AUTO_TEST_CASE(testAcl) {
- ofstream policyFile("cluster_test.acl");
- policyFile << "acl allow foo@QPID create queue name=foo" << endl
- << "acl allow foo@QPID create queue name=foo2" << endl
- << "acl deny foo@QPID create queue name=bar" << endl
- << "acl allow all all" << endl;
- policyFile.close();
- char cwd[1024];
- BOOST_CHECK(::getcwd(cwd, sizeof(cwd)));
- ostringstream aclLib;
- aclLib << getLibPath("ACL_LIB");
- ClusterFixture::Args args;
- prepareArgs(args, durableFlag);
- args += "--log-enable=critical"; // Supress expected errors
- args += "--acl-file", string(cwd) + "/cluster_test.acl",
- "--cluster-mechanism", "PLAIN",
- "--cluster-username", "cluster",
- "--cluster-password", "cluster",
- "--load-module", aclLib.str();
- ClusterFixture cluster(2, args, -1);
-
- Client c0(aclSettings(cluster[0], "c0"), "c0");
- Client c1(aclSettings(cluster[1], "c1"), "c1");
- Client foo(aclSettings(cluster[1], "foo"), "foo");
-
- foo.session.queueDeclare("foo", arg::durable=durableFlag);
- BOOST_CHECK_EQUAL(c0.session.queueQuery("foo").getQueue(), "foo");
-
- {
- ScopedSuppressLogging sl;
- BOOST_CHECK_THROW(foo.session.queueDeclare("bar", arg::durable=durableFlag), framing::UnauthorizedAccessException);
- }
- BOOST_CHECK(c0.session.queueQuery("bar").getQueue().empty());
- BOOST_CHECK(c1.session.queueQuery("bar").getQueue().empty());
-
- cluster.add();
- Client c2(aclSettings(cluster[2], "c2"), "c2");
- {
- ScopedSuppressLogging sl;
- BOOST_CHECK_THROW(foo.session.queueDeclare("bar", arg::durable=durableFlag), framing::UnauthorizedAccessException);
- }
- BOOST_CHECK(c2.session.queueQuery("bar").getQueue().empty());
-}
-
-QPID_AUTO_TEST_CASE(testMessageTimeToLive) {
- ClusterFixture::Args args;
- prepareArgs(args, durableFlag);
- ClusterFixture cluster(2, args, -1);
- Client c0(cluster[0], "c0");
- Client c1(cluster[1], "c1");
- c0.session.queueDeclare("p", arg::durable=durableFlag);
- c0.session.queueDeclare("q", arg::durable=durableFlag);
- c0.session.messageTransfer(arg::content=ttlMessage("a", "q", 200, durableFlag));
- c0.session.messageTransfer(arg::content=makeMessage("b", "q", durableFlag));
- c0.session.messageTransfer(arg::content=ttlMessage("x", "p", 100000, durableFlag));
- c0.session.messageTransfer(arg::content=makeMessage("y", "p", durableFlag));
- cluster.add();
- Client c2(cluster[1], "c2");
-
- BOOST_CHECK_EQUAL(browse(c0, "p", 1), list_of<string>("x"));
- BOOST_CHECK_EQUAL(browse(c1, "p", 1), list_of<string>("x"));
- BOOST_CHECK_EQUAL(browse(c2, "p", 1), list_of<string>("x"));
-
- sys::usleep(200*1000);
- BOOST_CHECK_EQUAL(browse(c0, "q", 1), list_of<string>("b"));
- BOOST_CHECK_EQUAL(browse(c1, "q", 1), list_of<string>("b"));
- BOOST_CHECK_EQUAL(browse(c2, "q", 1), list_of<string>("b"));
-}
-
-QPID_AUTO_TEST_CASE(testSequenceOptions) {
- // Make sure the exchange qpid.msg_sequence property is properly replicated.
- ClusterFixture::Args args;
- prepareArgs(args, durableFlag);
- ClusterFixture cluster(1, args, -1);
- Client c0(cluster[0], "c0");
- FieldTable ftargs;
- ftargs.setInt("qpid.msg_sequence", 1);
- c0.session.queueDeclare(arg::queue="q", arg::durable=durableFlag);
- c0.session.exchangeDeclare(arg::exchange="ex", arg::type="direct", arg::arguments=ftargs);
- c0.session.exchangeBind(arg::exchange="ex", arg::queue="q", arg::bindingKey="k");
- c0.session.messageTransfer(arg::content=makeMessage("1", "k", durableFlag), arg::destination="ex");
- c0.session.messageTransfer(arg::content=makeMessage("2", "k", durableFlag), arg::destination="ex");
- BOOST_CHECK_EQUAL(1, getMsgSequence(c0.subs.get("q", TIMEOUT)));
- BOOST_CHECK_EQUAL(2, getMsgSequence(c0.subs.get("q", TIMEOUT)));
-
- cluster.add();
- Client c1(cluster[1]);
- c1.session.messageTransfer(arg::content=makeMessage("3", "k", durableFlag), arg::destination="ex");
- BOOST_CHECK_EQUAL(3, getMsgSequence(c1.subs.get("q", TIMEOUT)));
-}
-
-QPID_AUTO_TEST_CASE(testTxTransaction) {
- ClusterFixture::Args args;
- prepareArgs(args, durableFlag);
- ClusterFixture cluster(1, args, -1);
- Client c0(cluster[0], "c0");
- c0.session.queueDeclare(arg::queue="q", arg::durable=durableFlag);
- c0.session.messageTransfer(arg::content=makeMessage("A", "q", durableFlag));
- c0.session.messageTransfer(arg::content=makeMessage("B", "q", durableFlag));
-
- // Start a transaction that will commit.
- Session commitSession = c0.connection.newSession("commit");
- SubscriptionManager commitSubs(commitSession);
- commitSession.txSelect();
- commitSession.messageTransfer(arg::content=makeMessage("a", "q", durableFlag));
- commitSession.messageTransfer(arg::content=makeMessage("b", "q", durableFlag));
- BOOST_CHECK_EQUAL(commitSubs.get("q", TIMEOUT).getData(), "A");
-
- // Start a transaction that will roll back.
- Session rollbackSession = c0.connection.newSession("rollback");
- SubscriptionManager rollbackSubs(rollbackSession);
- rollbackSession.txSelect();
- rollbackSession.messageTransfer(arg::content=makeMessage("1", "q", durableFlag));
- Message rollbackMessage = rollbackSubs.get("q", TIMEOUT);
- BOOST_CHECK_EQUAL(rollbackMessage.getData(), "B");
-
- BOOST_CHECK_EQUAL(c0.session.queueQuery("q").getMessageCount(), 0u);
- // Add new member mid transaction.
- cluster.add();
- Client c1(cluster[1], "c1");
-
- // More transactional work
- BOOST_CHECK_EQUAL(c1.session.queueQuery("q").getMessageCount(), 0u);
- rollbackSession.messageTransfer(arg::content=makeMessage("2", "q", durableFlag));
- commitSession.messageTransfer(arg::content=makeMessage("c", "q", durableFlag));
- rollbackSession.messageTransfer(arg::content=makeMessage("3", "q", durableFlag));
-
- BOOST_CHECK_EQUAL(c1.session.queueQuery("q").getMessageCount(), 0u);
-
- // Commit/roll back.
- commitSession.txCommit();
- rollbackSession.txRollback();
- rollbackSession.messageRelease(rollbackMessage.getId());
-
- // Verify queue status: just the comitted messages and dequeues should remain.
- BOOST_CHECK_EQUAL(c1.session.queueQuery("q").getMessageCount(), 4u);
- BOOST_CHECK_EQUAL(c1.subs.get("q", TIMEOUT).getData(), "B");
- BOOST_CHECK_EQUAL(c1.subs.get("q", TIMEOUT).getData(), "a");
- BOOST_CHECK_EQUAL(c1.subs.get("q", TIMEOUT).getData(), "b");
- BOOST_CHECK_EQUAL(c1.subs.get("q", TIMEOUT).getData(), "c");
-
- commitSession.close();
- rollbackSession.close();
-}
-
-QPID_AUTO_TEST_CASE(testUnacked) {
- // Verify replication of unacknowledged messages.
- ClusterFixture::Args args;
- prepareArgs(args, durableFlag);
- ClusterFixture cluster(1, args, -1);
- Client c0(cluster[0], "c0");
-
- Message m;
-
- // Create unacked message: acquired but not accepted.
- SubscriptionSettings manualAccept(FlowControl::unlimited(), ACCEPT_MODE_EXPLICIT, ACQUIRE_MODE_PRE_ACQUIRED, 0);
- c0.session.queueDeclare("q1", arg::durable=durableFlag);
- c0.session.messageTransfer(arg::content=makeMessage("11","q1", durableFlag));
- LocalQueue q1;
- c0.subs.subscribe(q1, "q1", manualAccept);
- BOOST_CHECK_EQUAL(q1.get(TIMEOUT).getData(), "11"); // Acquired but not accepted
- BOOST_CHECK_EQUAL(c0.session.queueQuery("q1").getMessageCount(), 0u); // Gone from queue
-
- // Create unacked message: not acquired, accepted or completeed.
- SubscriptionSettings manualAcquire(FlowControl::unlimited(), ACCEPT_MODE_EXPLICIT, ACQUIRE_MODE_NOT_ACQUIRED, 0);
- c0.session.queueDeclare("q2", arg::durable=durableFlag);
- c0.session.messageTransfer(arg::content=makeMessage("21","q2", durableFlag));
- c0.session.messageTransfer(arg::content=makeMessage("22","q2", durableFlag));
- LocalQueue q2;
- c0.subs.subscribe(q2, "q2", manualAcquire);
- m = q2.get(TIMEOUT); // Not acquired or accepted, still on queue
- BOOST_CHECK_EQUAL(m.getData(), "21");
- BOOST_CHECK_EQUAL(c0.session.queueQuery("q2").getMessageCount(), 2u); // Not removed
- c0.subs.getSubscription("q2").acquire(m); // Acquire manually
- BOOST_CHECK_EQUAL(c0.session.queueQuery("q2").getMessageCount(), 1u); // Removed
- BOOST_CHECK_EQUAL(q2.get(TIMEOUT).getData(), "22"); // Not acquired or accepted, still on queue
- BOOST_CHECK_EQUAL(c0.session.queueQuery("q2").getMessageCount(), 1u); // 1 not acquired.
-
- // Create empty credit record: acquire and accept but don't complete.
- SubscriptionSettings manualComplete(FlowControl::messageWindow(1), ACCEPT_MODE_EXPLICIT, ACQUIRE_MODE_PRE_ACQUIRED, 1, MANUAL_COMPLETION);
- c0.session.queueDeclare("q3", arg::durable=durableFlag);
- c0.session.messageTransfer(arg::content=makeMessage("31", "q3", durableFlag));
- c0.session.messageTransfer(arg::content=makeMessage("32", "q3", durableFlag));
- LocalQueue q3;
- c0.subs.subscribe(q3, "q3", manualComplete);
- Message m31=q3.get(TIMEOUT);
- BOOST_CHECK_EQUAL(m31.getData(), "31"); // Automatically acquired & accepted but not completed.
- BOOST_CHECK_EQUAL(c0.session.queueQuery("q3").getMessageCount(), 1u);
-
- // Add new member while there are unacked messages.
- cluster.add();
- Client c1(cluster[1], "c1");
-
- // Check queue counts
- BOOST_CHECK_EQUAL(c1.session.queueQuery("q1").getMessageCount(), 0u);
- BOOST_CHECK_EQUAL(c1.session.queueQuery("q2").getMessageCount(), 1u);
- BOOST_CHECK_EQUAL(c1.session.queueQuery("q3").getMessageCount(), 1u);
-
- // Complete the empty credit message, should unblock the message behind it.
- BOOST_CHECK_THROW(q3.get(0), Exception);
- c0.session.markCompleted(SequenceSet(m31.getId()), true);
- BOOST_CHECK_EQUAL(q3.get(TIMEOUT).getData(), "32");
- BOOST_CHECK_EQUAL(c0.session.queueQuery("q3").getMessageCount(), 0u);
- BOOST_CHECK_EQUAL(c1.session.queueQuery("q3").getMessageCount(), 0u);
-
- // Close the original session - unacked messages should be requeued.
- c0.session.close();
- BOOST_CHECK_EQUAL(c1.session.queueQuery("q1").getMessageCount(), 1u);
- BOOST_CHECK_EQUAL(c1.session.queueQuery("q2").getMessageCount(), 2u);
-
- BOOST_CHECK_EQUAL(c1.subs.get("q1", TIMEOUT).getData(), "11");
- BOOST_CHECK_EQUAL(c1.subs.get("q2", TIMEOUT).getData(), "21");
- BOOST_CHECK_EQUAL(c1.subs.get("q2", TIMEOUT).getData(), "22");
-}
-
-// FIXME aconway 2009-06-17: test for unimplemented feature, enable when implemented.
-void testUpdateTxState() {
- // Verify that we update transaction state correctly to new members.
- ClusterFixture::Args args;
- prepareArgs(args, durableFlag);
- ClusterFixture cluster(1, args, -1);
- Client c0(cluster[0], "c0");
-
- // Do work in a transaction.
- c0.session.txSelect();
- c0.session.queueDeclare("q", arg::durable=durableFlag);
- c0.session.messageTransfer(arg::content=makeMessage("1","q", durableFlag));
- c0.session.messageTransfer(arg::content=makeMessage("2","q", durableFlag));
- Message m;
- BOOST_CHECK(c0.subs.get(m, "q", TIMEOUT));
- BOOST_CHECK_EQUAL(m.getData(), "1");
-
- // New member, TX not comitted, c1 should see nothing.
- cluster.add();
- Client c1(cluster[1], "c1");
- BOOST_CHECK_EQUAL(c1.session.queueQuery(arg::queue="q").getMessageCount(), 0u);
-
- // After commit c1 shoudl see results of tx.
- c0.session.txCommit();
- BOOST_CHECK_EQUAL(c1.session.queueQuery(arg::queue="q").getMessageCount(), 1u);
- BOOST_CHECK(c1.subs.get(m, "q", TIMEOUT));
- BOOST_CHECK_EQUAL(m.getData(), "2");
-
- // Another transaction with both members active.
- c0.session.messageTransfer(arg::content=makeMessage("3","q", durableFlag));
- BOOST_CHECK_EQUAL(c1.session.queueQuery(arg::queue="q").getMessageCount(), 0u);
- c0.session.txCommit();
- BOOST_CHECK_EQUAL(c1.session.queueQuery(arg::queue="q").getMessageCount(), 1u);
- BOOST_CHECK(c1.subs.get(m, "q", TIMEOUT));
- BOOST_CHECK_EQUAL(m.getData(), "3");
-}
-
-QPID_AUTO_TEST_CASE(testUpdateMessageBuilder) {
- // Verify that we update a partially recieved message to a new member.
- ClusterFixture::Args args;
- prepareArgs(args, durableFlag);
- ClusterFixture cluster(1, args, -1);
- Client c0(cluster[0], "c0");
- c0.session.queueDeclare("q", arg::durable=durableFlag);
- Sender sender(ConnectionAccess::getImpl(c0.connection), c0.session.getChannel());
-
- // Send first 2 frames of message.
- MessageTransferBody transfer(
- ProtocolVersion(), string(), // default exchange.
- framing::message::ACCEPT_MODE_NONE,
- framing::message::ACQUIRE_MODE_PRE_ACQUIRED);
- sender.send(transfer, true, false, true, true);
- AMQHeaderBody header;
- header.get<DeliveryProperties>(true)->setRoutingKey("q");
- if (durableFlag)
- header.get<DeliveryProperties>(true)->setDeliveryMode(DELIVERY_MODE_PERSISTENT);
- else
- header.get<DeliveryProperties>(true)->setDeliveryMode(DELIVERY_MODE_NON_PERSISTENT);
- sender.send(header, false, false, true, true);
-
- // No reliable way to ensure the partial message has arrived
- // before we start the new broker, so we sleep.
- sys::usleep(2500);
- cluster.add();
-
- // Send final 2 frames of message.
- sender.send(AMQContentBody("ab"), false, true, true, false);
- sender.send(AMQContentBody("cd"), false, true, false, true);
-
- // Verify message is enqued correctly on second member.
- Message m;
- Client c1(cluster[1], "c1");
- BOOST_CHECK(c1.subs.get(m, "q", TIMEOUT));
- BOOST_CHECK_EQUAL(m.getData(), "abcd");
- BOOST_CHECK_EQUAL(2u, knownBrokerPorts(c1.connection, 2).size());
-}
-
-QPID_AUTO_TEST_CASE(testConnectionKnownHosts) {
- ClusterFixture::Args args;
- prepareArgs(args, durableFlag);
- ClusterFixture cluster(1, args, -1);
- Client c0(cluster[0], "c0");
- set<int> kb0 = knownBrokerPorts(c0.connection, 1);
- BOOST_CHECK_EQUAL(kb0.size(), 1u);
- BOOST_CHECK_EQUAL(kb0, makeSet(cluster));
-
- cluster.add();
- Client c1(cluster[1], "c1");
- set<int> kb1 = knownBrokerPorts(c1.connection, 2);
- kb0 = knownBrokerPorts(c0.connection, 2);
- BOOST_CHECK_EQUAL(kb1.size(), 2u);
- BOOST_CHECK_EQUAL(kb1, makeSet(cluster));
- BOOST_CHECK_EQUAL(kb1,kb0);
-
- cluster.add();
- Client c2(cluster[2], "c2");
- set<int> kb2 = knownBrokerPorts(c2.connection, 3);
- kb1 = knownBrokerPorts(c1.connection, 3);
- kb0 = knownBrokerPorts(c0.connection, 3);
- BOOST_CHECK_EQUAL(kb2.size(), 3u);
- BOOST_CHECK_EQUAL(kb2, makeSet(cluster));
- BOOST_CHECK_EQUAL(kb2,kb0);
- BOOST_CHECK_EQUAL(kb2,kb1);
-
- cluster.killWithSilencer(1,c1.connection,9);
- kb0 = knownBrokerPorts(c0.connection, 2);
- kb2 = knownBrokerPorts(c2.connection, 2);
- BOOST_CHECK_EQUAL(kb0.size(), 2u);
- BOOST_CHECK_EQUAL(kb0, kb2);
-}
-
-QPID_AUTO_TEST_CASE(testUpdateConsumers) {
- ClusterFixture::Args args;
- prepareArgs(args, durableFlag);
- ClusterFixture cluster(1, args, -1);
-
- Client c0(cluster[0], "c0");
- c0.session.queueDeclare("p", arg::durable=durableFlag);
- c0.session.queueDeclare("q", arg::durable=durableFlag);
- c0.subs.subscribe(c0.lq, "q", FlowControl::zero());
- LocalQueue lp;
- c0.subs.subscribe(lp, "p", FlowControl::messageCredit(1));
- c0.session.sync();
-
- // Start new members
- cluster.add(); // Local
- Client c1(cluster[1], "c1");
- cluster.add();
- Client c2(cluster[2], "c2");
-
- // Transfer messages
- c0.session.messageTransfer(arg::content=makeMessage("aaa", "q", durableFlag));
-
- c0.session.messageTransfer(arg::content=makeMessage("bbb", "p", durableFlag));
- c0.session.messageTransfer(arg::content=makeMessage("ccc", "p", durableFlag));
-
- // Activate the subscription, ensure message removed on all queues.
- c0.subs.setFlowControl("q", FlowControl::unlimited());
- Message m;
- BOOST_CHECK(c0.lq.get(m, TIMEOUT));
- BOOST_CHECK_EQUAL(m.getData(), "aaa");
- BOOST_CHECK_EQUAL(c0.session.queueQuery("q").getMessageCount(), 0u);
- BOOST_CHECK_EQUAL(c1.session.queueQuery("q").getMessageCount(), 0u);
- BOOST_CHECK_EQUAL(c2.session.queueQuery("q").getMessageCount(), 0u);
-
- // Check second subscription's flow control: gets first message, not second.
- BOOST_CHECK(lp.get(m, TIMEOUT));
- BOOST_CHECK_EQUAL(m.getData(), "bbb");
- BOOST_CHECK_EQUAL(c0.session.queueQuery("p").getMessageCount(), 1u);
- BOOST_CHECK_EQUAL(c1.session.queueQuery("p").getMessageCount(), 1u);
- BOOST_CHECK_EQUAL(c2.session.queueQuery("p").getMessageCount(), 1u);
-
- BOOST_CHECK(c0.subs.get(m, "p", TIMEOUT));
- BOOST_CHECK_EQUAL(m.getData(), "ccc");
-
- // Kill the subscribing member, ensure further messages are not removed.
- cluster.killWithSilencer(0,c0.connection,9);
- BOOST_REQUIRE_EQUAL(knownBrokerPorts(c1.connection, 2).size(), 2u);
- for (int i = 0; i < 10; ++i) {
- c1.session.messageTransfer(arg::content=makeMessage("xxx", "q", durableFlag));
- BOOST_REQUIRE(c1.subs.get(m, "q", TIMEOUT));
- BOOST_REQUIRE_EQUAL(m.getData(), "xxx");
- }
-}
-
-// Test that message data and delivery properties are updated properly.
-QPID_AUTO_TEST_CASE(testUpdateMessages) {
- ClusterFixture::Args args;
- prepareArgs(args, durableFlag);
- ClusterFixture cluster(1, args, -1);
- Client c0(cluster[0], "c0");
-
- // Create messages with different delivery properties
- c0.session.queueDeclare("q", arg::durable=durableFlag);
- c0.session.exchangeBind(arg::exchange="amq.fanout", arg::queue="q");
- c0.session.messageTransfer(arg::content=makeMessage("foo","q", durableFlag));
- c0.session.messageTransfer(arg::content=makeMessage("bar","q", durableFlag),
- arg::destination="amq.fanout");
-
- while (c0.session.queueQuery("q").getMessageCount() != 2)
- sys::usleep(1000); // Wait for message to show up on broker 0.
-
- // Add a new broker, it will catch up.
- cluster.add();
-
- // Do some work post-add
- c0.session.queueDeclare("p", arg::durable=durableFlag);
- c0.session.messageTransfer(arg::content=makeMessage("pfoo","p", durableFlag));
-
- // Do some work post-join
- BOOST_REQUIRE_EQUAL(knownBrokerPorts(c0.connection, 2).size(), 2u);
- c0.session.messageTransfer(arg::content=makeMessage("pbar","p", durableFlag));
-
- // Verify new brokers have state.
- Message m;
-
- Client c1(cluster[1], "c1");
-
- BOOST_CHECK(c1.subs.get(m, "q", TIMEOUT));
- BOOST_CHECK_EQUAL(m.getData(), "foo");
- BOOST_CHECK(m.getDeliveryProperties().hasExchange());
- BOOST_CHECK_EQUAL(m.getDeliveryProperties().getExchange(), "");
- BOOST_CHECK(c1.subs.get(m, "q", TIMEOUT));
- BOOST_CHECK_EQUAL(m.getData(), "bar");
- BOOST_CHECK(m.getDeliveryProperties().hasExchange());
- BOOST_CHECK_EQUAL(m.getDeliveryProperties().getExchange(), "amq.fanout");
- BOOST_CHECK_EQUAL(c1.session.queueQuery("q").getMessageCount(), 0u);
-
- // Add another broker, don't wait for join - should be stalled till ready.
- cluster.add();
- Client c2(cluster[2], "c2");
- BOOST_CHECK(c2.subs.get(m, "p", TIMEOUT));
- BOOST_CHECK_EQUAL(m.getData(), "pfoo");
- BOOST_CHECK(c2.subs.get(m, "p", TIMEOUT));
- BOOST_CHECK_EQUAL(m.getData(), "pbar");
- BOOST_CHECK_EQUAL(c2.session.queueQuery("p").getMessageCount(), 0u);
-}
-
-QPID_AUTO_TEST_CASE(testWiringReplication) {
- ClusterFixture::Args args;
- prepareArgs(args, durableFlag);
- ClusterFixture cluster(3, args, -1);
- Client c0(cluster[0]);
- BOOST_CHECK(c0.session.queueQuery("q").getQueue().empty());
- BOOST_CHECK(c0.session.exchangeQuery("ex").getType().empty());
- c0.session.queueDeclare("q", arg::durable=durableFlag);
- c0.session.exchangeDeclare("ex", arg::type="direct");
- c0.session.close();
- c0.connection.close();
- // Verify all brokers get wiring update.
- for (size_t i = 0; i < cluster.size(); ++i) {
- BOOST_MESSAGE("i == "<< i);
- Client c(cluster[i]);
- BOOST_CHECK_EQUAL("q", c.session.queueQuery("q").getQueue());
- BOOST_CHECK_EQUAL("direct", c.session.exchangeQuery("ex").getType());
- }
-}
-
-QPID_AUTO_TEST_CASE(testMessageEnqueue) {
- // Enqueue on one broker, dequeue on another.
- ClusterFixture::Args args;
- prepareArgs(args, durableFlag);
- ClusterFixture cluster(2, args, -1);
- Client c0(cluster[0]);
- c0.session.queueDeclare("q", arg::durable=durableFlag);
- c0.session.messageTransfer(arg::content=makeMessage("foo", "q", durableFlag));
- c0.session.messageTransfer(arg::content=makeMessage("bar", "q", durableFlag));
- c0.session.close();
- Client c1(cluster[1]);
- Message msg;
- BOOST_CHECK(c1.subs.get(msg, "q", TIMEOUT));
- BOOST_CHECK_EQUAL(string("foo"), msg.getData());
- BOOST_CHECK(c1.subs.get(msg, "q", TIMEOUT));
- BOOST_CHECK_EQUAL(string("bar"), msg.getData());
-}
-
-QPID_AUTO_TEST_CASE(testMessageDequeue) {
- // Enqueue on one broker, dequeue on two others.
- ClusterFixture::Args args;
- prepareArgs(args, durableFlag);
- ClusterFixture cluster(3, args, -1);
- Client c0(cluster[0], "c0");
- c0.session.queueDeclare("q", arg::durable=durableFlag);
- c0.session.messageTransfer(arg::content=makeMessage("foo", "q", durableFlag));
- c0.session.messageTransfer(arg::content=makeMessage("bar", "q", durableFlag));
-
- Message msg;
-
- // Dequeue on 2 others, ensure correct order.
- Client c1(cluster[1], "c1");
- BOOST_CHECK(c1.subs.get(msg, "q"));
- BOOST_CHECK_EQUAL("foo", msg.getData());
-
- Client c2(cluster[2], "c2");
- BOOST_CHECK(c1.subs.get(msg, "q"));
- BOOST_CHECK_EQUAL("bar", msg.getData());
-
- // Queue should be empty on all cluster members.
- BOOST_CHECK_EQUAL(0u, c0.session.queueQuery("q").getMessageCount());
- BOOST_CHECK_EQUAL(0u, c1.session.queueQuery("q").getMessageCount());
- BOOST_CHECK_EQUAL(0u, c2.session.queueQuery("q").getMessageCount());
-}
-
-QPID_AUTO_TEST_CASE(testDequeueWaitingSubscription) {
- ClusterFixture::Args args;
- prepareArgs(args, durableFlag);
- ClusterFixture cluster(3, args, -1);
- Client c0(cluster[0]);
- BOOST_REQUIRE_EQUAL(knownBrokerPorts(c0.connection, 3).size(), 3u); // Wait for brokers.
-
- // First start a subscription.
- c0.session.queueDeclare("q", arg::durable=durableFlag);
- c0.subs.subscribe(c0.lq, "q", FlowControl::messageCredit(2));
-
- // Now send messages
- Client c1(cluster[1]);
- c1.session.messageTransfer(arg::content=makeMessage("foo", "q", durableFlag));
- c1.session.messageTransfer(arg::content=makeMessage("bar", "q", durableFlag));
-
- // Check they arrived
- Message m;
- BOOST_CHECK(c0.lq.get(m, TIMEOUT));
- BOOST_CHECK_EQUAL("foo", m.getData());
- BOOST_CHECK(c0.lq.get(m, TIMEOUT));
- BOOST_CHECK_EQUAL("bar", m.getData());
-
- // Queue should be empty on all cluster members.
- Client c2(cluster[2]);
- BOOST_CHECK_EQUAL(0u, c0.session.queueQuery("q").getMessageCount());
- BOOST_CHECK_EQUAL(0u, c1.session.queueQuery("q").getMessageCount());
- BOOST_CHECK_EQUAL(0u, c2.session.queueQuery("q").getMessageCount());
-}
-
-QPID_AUTO_TEST_CASE(queueDurabilityPropagationToNewbie)
-{
- /*
- Start with a single broker.
- Set up two queues: one durable, and one not.
- Add a new broker to the cluster.
- Make sure it has one durable and one non-durable queue.
- */
- ClusterFixture::Args args;
- prepareArgs(args, durableFlag);
- ClusterFixture cluster(1, args, -1);
- Client c0(cluster[0]);
- c0.session.queueDeclare("durable_queue", arg::durable=true);
- c0.session.queueDeclare("non_durable_queue", arg::durable=false);
- cluster.add();
- Client c1(cluster[1]);
- QueueQueryResult durable_query = c1.session.queueQuery ( "durable_queue" );
- QueueQueryResult non_durable_query = c1.session.queueQuery ( "non_durable_queue" );
- BOOST_CHECK_EQUAL(durable_query.getQueue(), std::string("durable_queue"));
- BOOST_CHECK_EQUAL(non_durable_query.getQueue(), std::string("non_durable_queue"));
-
- BOOST_CHECK_EQUAL ( durable_query.getDurable(), true );
- BOOST_CHECK_EQUAL ( non_durable_query.getDurable(), false );
-}
-
-
-QPID_AUTO_TEST_CASE(testHeartbeatCancelledOnFailover)
-{
-
- struct Sender : FailoverManager::Command
- {
- std::string queue;
- std::string content;
-
- Sender(const std::string& q, const std::string& c) : queue(q), content(c) {}
-
- void execute(AsyncSession& session, bool)
- {
- session.messageTransfer(arg::content=makeMessage(content, queue, durableFlag));
- }
- };
-
- struct Receiver : FailoverManager::Command, MessageListener, qpid::sys::Runnable
- {
- FailoverManager& mgr;
- std::string queue;
- std::string expectedContent;
- qpid::client::Subscription subscription;
- qpid::sys::Monitor lock;
- bool ready, failed;
-
- Receiver(FailoverManager& m, const std::string& q, const std::string& c) : mgr(m), queue(q), expectedContent(c), ready(false), failed(false) {}
-
- void received(Message& message)
- {
- BOOST_CHECK_EQUAL(expectedContent, message.getData());
- subscription.cancel();
- }
-
- void execute(AsyncSession& session, bool)
- {
- session.queueDeclare(arg::queue=queue, arg::durable=durableFlag);
- SubscriptionManager subs(session);
- subscription = subs.subscribe(*this, queue);
- session.sync();
- setReady();
- subs.run();
- //cleanup:
- session.queueDelete(arg::queue=queue);
- }
-
- void run()
- {
- try {
- mgr.execute(*this);
- }
- catch (const std::exception& e) {
- BOOST_MESSAGE("Exception in mgr.execute: " << e.what());
- failed = true;
- }
- }
-
- void waitForReady()
- {
- qpid::sys::Monitor::ScopedLock l(lock);
- while (!ready) {
- lock.wait();
- }
- }
-
- void setReady()
- {
- qpid::sys::Monitor::ScopedLock l(lock);
- ready = true;
- lock.notify();
- }
- };
-
- ClusterFixture::Args args;
- prepareArgs(args, durableFlag);
- ClusterFixture cluster(2, args, -1);
- ConnectionSettings settings;
- settings.port = cluster[1];
- settings.heartbeat = 1;
- FailoverManager fmgr(settings);
- Sender sender("my-queue", "my-data");
- Receiver receiver(fmgr, "my-queue", "my-data");
- qpid::sys::Thread runner(receiver);
- receiver.waitForReady();
- {
- ScopedSuppressLogging allQuiet; // suppress connection closed messages
- cluster.kill(1);
- //sleep for 2 secs to allow the heartbeat task to fire on the now dead connection:
- ::usleep(2*1000*1000);
- }
- fmgr.execute(sender);
- runner.join();
- BOOST_CHECK(!receiver.failed);
- fmgr.close();
-}
-
-QPID_AUTO_TEST_CASE(testPolicyUpdate) {
- //tests that the policys internal state is accurate on newly
- //joined nodes
- ClusterFixture::Args args;
- args += "--log-enable", "critical";
- prepareArgs(args, durableFlag);
- ClusterFixture cluster(1, args, -1);
- Client c1(cluster[0], "c1");
- {
- ScopedSuppressLogging allQuiet;
- QueueOptions options;
- options.setSizePolicy(REJECT, 0, 2);
- c1.session.queueDeclare("q", arg::arguments=options, arg::durable=durableFlag);
- c1.session.messageTransfer(arg::content=makeMessage("one", "q", durableFlag));
- cluster.add();
- Client c2(cluster[1], "c2");
- c2.session.messageTransfer(arg::content=makeMessage("two", "q", durableFlag));
-
- BOOST_CHECK_THROW(c2.session.messageTransfer(arg::content=makeMessage("three", "q", durableFlag)), framing::ResourceLimitExceededException);
-
- Message received;
- BOOST_CHECK(c1.subs.get(received, "q"));
- BOOST_CHECK_EQUAL(received.getData(), std::string("one"));
- BOOST_CHECK(c1.subs.get(received, "q"));
- BOOST_CHECK_EQUAL(received.getData(), std::string("two"));
- BOOST_CHECK(!c1.subs.get(received, "q"));
- }
-}
-
-QPID_AUTO_TEST_CASE(testExclusiveQueueUpdate) {
- //tests that exclusive queues are accurately replicated on newly
- //joined nodes
- ClusterFixture::Args args;
- args += "--log-enable", "critical";
- prepareArgs(args, durableFlag);
- ClusterFixture cluster(1, args, -1);
- Client c1(cluster[0], "c1");
- {
- ScopedSuppressLogging allQuiet;
- c1.session.queueDeclare("q", arg::exclusive=true, arg::autoDelete=true, arg::alternateExchange="amq.fanout");
- cluster.add();
- Client c2(cluster[1], "c2");
- QueueQueryResult result = c2.session.queueQuery("q");
- BOOST_CHECK_EQUAL(result.getQueue(), std::string("q"));
- BOOST_CHECK(result.getExclusive());
- BOOST_CHECK(result.getAutoDelete());
- BOOST_CHECK(!result.getDurable());
- BOOST_CHECK_EQUAL(result.getAlternateExchange(), std::string("amq.fanout"));
- BOOST_CHECK_THROW(c2.session.queueDeclare(arg::queue="q", arg::exclusive=true, arg::passive=true), framing::ResourceLockedException);
- c1.session.close();
- c1.connection.close();
- c2.session = c2.connection.newSession();
- BOOST_CHECK_THROW(c2.session.queueDeclare(arg::queue="q", arg::passive=true), framing::NotFoundException);
- }
-}
-
-/**
- * Subscribes to specified queue and acquires up to the specified
- * number of message but does not accept or release them. These
- * message are therefore 'locked' by the clients session.
- */
-Subscription lockMessages(Client& client, const std::string& queue, int count)
-{
- LocalQueue q;
- SubscriptionSettings settings(FlowControl::messageCredit(count));
- settings.autoAck = 0;
- Subscription sub = client.subs.subscribe(q, queue, settings);
- client.session.messageFlush(sub.getName());
- return sub;
-}
-
-/**
- * check that the specified queue contains the expected set of
- * messages (matched on content) for all nodes in the cluster
- */
-void checkQueue(ClusterFixture& cluster, const std::string& queue, const std::vector<std::string>& messages)
-{
- for (size_t i = 0; i < cluster.size(); i++) {
- Client client(cluster[i], (boost::format("%1%_%2%") % "c" % (i+1)).str());
- BOOST_CHECK_EQUAL(browse(client, queue, messages.size()), messages);
- client.close();
- }
-}
-
-void send(Client& client, const std::string& queue, int count, int start=1, const std::string& base="m",
- const std::string& lvqKey="")
-{
- for (int i = 0; i < count; i++) {
- Message message = makeMessage((boost::format("%1%_%2%") % base % (i+start)).str(), queue, durableFlag);
- if (!lvqKey.empty()) message.getHeaders().setString(QueueOptions::strLVQMatchProperty, lvqKey);
- client.session.messageTransfer(arg::content=message);
- }
-}
-
-QPID_AUTO_TEST_CASE(testRingQueueUpdate) {
- //tests that ring queues are accurately replicated on newly
- //joined nodes
- ClusterFixture::Args args;
- args += "--log-enable", "critical";
- prepareArgs(args, durableFlag);
- ClusterFixture cluster(1, args, -1);
- Client c1(cluster[0], "c1");
- {
- ScopedSuppressLogging allQuiet;
- QueueOptions options;
- options.setSizePolicy(RING, 0, 5);
- c1.session.queueDeclare("q", arg::arguments=options, arg::durable=durableFlag);
- send(c1, "q", 5);
- lockMessages(c1, "q", 1);
- //add new node
- cluster.add();
- BOOST_CHECK_EQUAL(2u, knownBrokerPorts(c1.connection, 2).size());//wait till joined
- //send one more message
- send(c1, "q", 1, 6);
- //release locked message
- c1.close();
- //check state of queue on both nodes
- checkQueue(cluster, "q", list_of<string>("m_2")("m_3")("m_4")("m_5")("m_6"));
- }
-}
-
-QPID_AUTO_TEST_CASE(testRingQueueUpdate2) {
- //tests that ring queues are accurately replicated on newly joined
- //nodes; just like testRingQueueUpdate, but new node joins after
- //the sixth message has been sent.
- ClusterFixture::Args args;
- args += "--log-enable", "critical";
- prepareArgs(args, durableFlag);
- ClusterFixture cluster(1, args, -1);
- Client c1(cluster[0], "c1");
- {
- ScopedSuppressLogging allQuiet;
- QueueOptions options;
- options.setSizePolicy(RING, 0, 5);
- c1.session.queueDeclare("q", arg::arguments=options, arg::durable=durableFlag);
- send(c1, "q", 5);
- lockMessages(c1, "q", 1);
- //send sixth message
- send(c1, "q", 1, 6);
- //add new node
- cluster.add();
- BOOST_CHECK_EQUAL(2u, knownBrokerPorts(c1.connection, 2).size());//wait till joined
- //release locked message
- c1.close();
- //check state of queue on both nodes
- checkQueue(cluster, "q", list_of<string>("m_2")("m_3")("m_4")("m_5")("m_6"));
- }
-}
-
-QPID_AUTO_TEST_CASE(testLvqUpdate) {
- //tests that lvqs are accurately replicated on newly joined nodes
- ClusterFixture::Args args;
- args += "--log-enable", "critical";
- prepareArgs(args, durableFlag);
- ClusterFixture cluster(1, args, -1);
- Client c1(cluster[0], "c1");
- {
- ScopedSuppressLogging allQuiet;
- QueueOptions options;
- options.setOrdering(LVQ);
- c1.session.queueDeclare("q", arg::arguments=options, arg::durable=durableFlag);
-
- send(c1, "q", 5, 1, "a", "a");
- send(c1, "q", 2, 1, "b", "b");
- send(c1, "q", 1, 1, "c", "c");
- send(c1, "q", 1, 3, "b", "b");
-
- //add new node
- cluster.add();
- BOOST_CHECK_EQUAL(2u, knownBrokerPorts(c1.connection, 2).size());//wait till joined
-
- //check state of queue on both nodes
- checkQueue(cluster, "q", list_of<string>("a_5")("b_3")("c_1"));
- }
-}
-
-
-QPID_AUTO_TEST_CASE(testBrowsedLvqUpdate) {
- //tests that lvqs are accurately replicated on newly joined nodes
- //if the lvq state has been affected by browsers
- ClusterFixture::Args args;
- args += "--log-enable", "critical";
- prepareArgs(args, durableFlag);
- ClusterFixture cluster(1, args, -1);
- Client c1(cluster[0], "c1");
- {
- ScopedSuppressLogging allQuiet;
- QueueOptions options;
- options.setOrdering(LVQ);
- c1.session.queueDeclare("q", arg::arguments=options, arg::durable=durableFlag);
-
- send(c1, "q", 1, 1, "a", "a");
- send(c1, "q", 2, 1, "b", "b");
- send(c1, "q", 1, 1, "c", "c");
- checkQueue(cluster, "q", list_of<string>("a_1")("b_2")("c_1"));
- send(c1, "q", 4, 2, "a", "a");
- send(c1, "q", 1, 3, "b", "b");
-
- //add new node
- cluster.add();
- BOOST_CHECK_EQUAL(2u, knownBrokerPorts(c1.connection, 2).size());//wait till joined
-
- //check state of queue on both nodes
- checkQueue(cluster, "q", list_of<string>("a_1")("b_2")("c_1")("a_5")("b_3"));
- }
-}
-
-QPID_AUTO_TEST_CASE(testRelease) {
- //tests that releasing a messages that was unacked when one node
- //joined works correctly
- ClusterFixture::Args args;
- args += "--log-enable", "critical";
- prepareArgs(args, durableFlag);
- ClusterFixture cluster(1, args, -1);
- Client c1(cluster[0], "c1");
- {
- ScopedSuppressLogging allQuiet;
- c1.session.queueDeclare("q", arg::durable=durableFlag);
- for (int i = 0; i < 5; i++) {
- c1.session.messageTransfer(arg::content=makeMessage((boost::format("%1%_%2%") % "m" % (i+1)).str(), "q", durableFlag));
- }
- //receive but don't ack a message
- LocalQueue lq;
- SubscriptionSettings lqSettings(FlowControl::messageCredit(1));
- lqSettings.autoAck = 0;
- Subscription lqSub = c1.subs.subscribe(lq, "q", lqSettings);
- c1.session.messageFlush("q");
- Message received;
- BOOST_CHECK(lq.get(received));
- BOOST_CHECK_EQUAL(received.getData(), std::string("m_1"));
-
- //add new node
- cluster.add();
-
- lqSub.release(lqSub.getUnaccepted());
-
- //check state of queue on both nodes
- vector<string> expected = list_of<string>("m_1")("m_2")("m_3")("m_4")("m_5");
- Client c3(cluster[0], "c3");
- BOOST_CHECK_EQUAL(browse(c3, "q", 5), expected);
- Client c2(cluster[1], "c2");
- BOOST_CHECK_EQUAL(browse(c2, "q", 5), expected);
- }
-}
-
-
-// Browse for 1 message with byte credit, return true if a message was
-// received false if not.
-bool browseByteCredit(Client& c, const string& q, int n, Message& m) {
- SubscriptionSettings browseSettings(
- FlowControl(1, n, false), // 1 message, n bytes credit, no window
- ACCEPT_MODE_NONE,
- ACQUIRE_MODE_NOT_ACQUIRED,
- 0 // No auto-ack.
- );
- LocalQueue lq;
- Subscription s = c.subs.subscribe(lq, q, browseSettings);
- c.session.messageFlush(arg::destination=q, arg::sync=true);
- c.session.sync();
- c.subs.getSubscription(q).cancel();
- return lq.get(m, 0); // No timeout, flush should push message thru.
-}
-
-// Ensure cluster update preserves exact message size, use byte credt as test.
-QPID_AUTO_TEST_CASE(testExactByteCredit) {
- ClusterFixture cluster(1, prepareArgs(), -1);
- Client c0(cluster[0], "c0");
- c0.session.queueDeclare("q");
- c0.session.messageTransfer(arg::content=Message("MyMessage", "q"));
- cluster.add();
-
- int size=36; // Size of message on broker: headers+body
- Client c1(cluster[1], "c1");
- Message m;
-
- // Ensure we get the message with exact credit.
- BOOST_CHECK(browseByteCredit(c0, "q", size, m));
- BOOST_CHECK(browseByteCredit(c1, "q", size, m));
- // and not with one byte less.
- BOOST_CHECK(!browseByteCredit(c0, "q", size-1, m));
- BOOST_CHECK(!browseByteCredit(c1, "q", size-1, m));
-}
-
-// Test that consumer positions are updated correctly.
-// Regression test for https://bugzilla.redhat.com/show_bug.cgi?id=541927
-//
-QPID_AUTO_TEST_CASE(testUpdateConsumerPosition) {
- ClusterFixture::Args args;
- prepareArgs(args, durableFlag);
- ClusterFixture cluster(1, args, -1);
- Client c0(cluster[0], "c0");
-
- c0.session.queueDeclare("q", arg::durable=durableFlag);
- SubscriptionSettings settings;
- settings.autoAck = 0;
- // Set the acquire mode to 'not-acquired' the consumer moves along the queue
- // but does not acquire (remove) messages.
- settings.acquireMode = ACQUIRE_MODE_NOT_ACQUIRED;
- Subscription s = c0.subs.subscribe(c0.lq, "q", settings);
- c0.session.messageTransfer(arg::content=makeMessage("1", "q", durableFlag));
- BOOST_CHECK_EQUAL("1", c0.lq.get(TIMEOUT).getData());
-
- // Add another member, send/receive another message and acquire
- // the messages. With the bug, this creates an inconsistency
- // because the browse position was not updated to the new member.
- cluster.add();
- c0.session.messageTransfer(arg::content=makeMessage("2", "q", durableFlag));
- BOOST_CHECK_EQUAL("2", c0.lq.get(TIMEOUT).getData());
- s.acquire(s.getUnacquired());
- s.accept(s.getUnaccepted());
-
- // In the bug we now have 0 messages on cluster[0] and 1 message on cluster[1]
- // Subscribing on cluster[1] provokes an error that shuts down cluster[0]
- Client c1(cluster[1], "c1");
- Subscription s1 = c1.subs.subscribe(c1.lq, "q"); // Default auto-ack=1
- Message m;
- BOOST_CHECK(!c1.lq.get(m, TIMEOUT/10));
- BOOST_CHECK_EQUAL(c1.session.queueQuery("q").getMessageCount(), 0u);
- BOOST_CHECK_EQUAL(c0.session.queueQuery("q").getMessageCount(), 0u);
-}
-
-QPID_AUTO_TEST_CASE(testFairsharePriorityDelivery) {
- ClusterFixture::Args args;
- prepareArgs(args, durableFlag);
- ClusterFixture cluster(1, args, -1);
- Client c0(cluster[0], "c0");
-
- FieldTable arguments;
- arguments.setInt("x-qpid-priorities", 10);
- arguments.setInt("x-qpid-fairshare", 5);
- c0.session.queueDeclare("q", arg::durable=durableFlag, arg::arguments=arguments);
-
- //send messages of different priorities
- for (int i = 0; i < 20; i++) {
- Message msg = makeMessage((boost::format("msg-%1%") % i).str(), "q", durableFlag);
- msg.getDeliveryProperties().setPriority(i % 2 ? 9 : 5);
- c0.session.messageTransfer(arg::content=msg);
- }
-
- //pull off a couple of the messages (first four should be the top priority messages
- for (int i = 0; i < 4; i++) {
- BOOST_CHECK_EQUAL((boost::format("msg-%1%") % ((i*2)+1)).str(), c0.subs.get("q", TIMEOUT).getData());
- }
-
- // Add another member
- cluster.add();
- Client c1(cluster[1], "c1");
-
- //pull off some more messages
- BOOST_CHECK_EQUAL((boost::format("msg-%1%") % 9).str(), c0.subs.get("q", TIMEOUT).getData());
- BOOST_CHECK_EQUAL((boost::format("msg-%1%") % 0).str(), c1.subs.get("q", TIMEOUT).getData());
- BOOST_CHECK_EQUAL((boost::format("msg-%1%") % 2).str(), c0.subs.get("q", TIMEOUT).getData());
-
- //check queue has same content on both nodes
- BOOST_CHECK_EQUAL(browse(c0, "q", 12), browse(c1, "q", 12));
-}
-
-QPID_AUTO_TEST_SUITE_END()
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/cluster_test_logs.py b/cpp/src/tests/cluster_test_logs.py
deleted file mode 100755
index 9f7d1e2f6c..0000000000
--- a/cpp/src/tests/cluster_test_logs.py
+++ /dev/null
@@ -1,119 +0,0 @@
-#!/usr/bin/env python
-
-# 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.
-#
-
-# Functions for comparing broker log files, used by cluster_tests.py.
-
-import os, os.path, re, glob
-from itertools import izip
-
-def split_log(log):
- """Split a broker log at checkpoints where a member joins.
- Return the set of checkpoints discovered."""
- checkpoint_re = re.compile("Member joined, frameSeq=([0-9]+), queue snapshot:")
- outfile = None
- checkpoints = []
- for l in open(log):
- match = checkpoint_re.search(l)
- if match:
- checkpoint = match.groups()[0]
- checkpoints.append(checkpoint)
- if outfile: outfile.close()
- outfile = open("%s.%s"%(log, checkpoint), 'w')
-
- if outfile: outfile.write(l)
- if outfile: outfile.close()
- return checkpoints
-
-def filter_log(log):
- """Filter the contents of a log file to remove data that is expected
- to differ between brokers in a cluster. Filtered log contents between
- the same checkpoints should match across the cluster."""
- out = open("%s.filter"%(log), 'w')
- # Lines to skip entirely, expected differences
- skip = "|".join([
- 'local connection', # Only on local broker
- 'UPDATER|UPDATEE', # Ignore update process
- 'stall for update|unstall, ignore update|cancelled offer .* unstall',
- 'caught up',
- 'active for links|Passivating links|Activating links',
- 'info Connection.* connected to', # UpdateClient connection
- 'warning Connection [\d+ [0-9.:]+] closed', # UpdateClient connection
- 'warning Broker closed connection: 200, OK',
- 'task late',
- 'task overran',
- 'warning CLOSING .* unsent data',
- 'Inter-broker link ',
- 'Running in a cluster, marking store',
- 'debug Sending keepalive signal to watchdog', # Watchdog timer thread
- 'last broker standing joined by 1 replicas, updating queue policies.',
- 'Connection .* timed out: closing' # heartbeat connection close
- ])
- # Regex to match a UUID
- uuid='\w\w\w\w\w\w\w\w-\w\w\w\w-\w\w\w\w-\w\w\w\w-\w\w\w\w\w\w\w\w\w\w\w\w'
- # Substitutions to remove expected differences
- subs = [
- (r'\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d ', ''), # Remove timestamp
- (r'cluster\([0-9.: ]*', 'cluster('), # Remove cluster node id
- (r' local\)| shadow\)', ')'), # Remove local/shadow indication
- (r'CATCHUP', 'READY'), # Treat catchup as equivalent to ready.
- (r'OFFER', 'READY'), # Treat offer as equivalent to ready.
- # System UUID expected to be different
- (r'(org.apache.qpid.broker:system[:(])%s(\)?)'%(uuid), r'\1UUID\2'),
-
- # TODO aconway 2010-12-20: review if these should be expected:
- (r' len=\d+', ' len=NN'), # buffer lengths
- (r' map={.*_object_name:([^,}]*)[,}].*', r' \1'), # V2 map - just keep name
- (r'\d+-\d+-\d+--\d+', 'X-X-X--X'), # V1 Object IDs
- ]
- # Substitutions to mask known issue: durable test shows inconsistent "changed stats for com.redhat.rhm.store:journal" messages.
- skip += '|Changed V[12] statistics com.redhat.rhm.store:journal'
- subs += [(r'to=console.obj.1.0.com.redhat.rhm.store.journal props=\d+ stats=\d+',
- 'to=console.obj.1.0.com.redhat.rhm.store.journal props=NN stats=NN')]
-
- skip_re = re.compile(skip)
- subs = [(re.compile(pattern), subst) for pattern, subst in subs]
- for l in open(log):
- if skip_re.search(l): continue
- for pattern,subst in subs: l = re.sub(pattern,subst,l)
- out.write(l)
- out.close()
-
-def verify_logs():
- """Compare log files from cluster brokers, verify that they correspond correctly."""
- for l in glob.glob("*.log"): filter_log(l)
- checkpoints = set()
- for l in glob.glob("*.filter"): checkpoints = checkpoints.union(set(split_log(l)))
- errors=[]
- for c in checkpoints:
- fragments = glob.glob("*.filter.%s"%(c))
- fragments.sort(reverse=True, key=os.path.getsize)
- while len(fragments) >= 2:
- a = fragments.pop(0)
- b = fragments[0]
- for ab in izip(open(a), open(b)):
- if ab[0] != ab[1]:
- errors.append("\n %s %s"%(a, b))
- break
- if errors:
- raise Exception("Files differ in %s"%(os.getcwd())+"".join(errors))
-
-# Can be run as a script.
-if __name__ == "__main__":
- verify_logs()
diff --git a/cpp/src/tests/cluster_test_scripts/README.txt b/cpp/src/tests/cluster_test_scripts/README.txt
deleted file mode 100644
index e861a2f397..0000000000
--- a/cpp/src/tests/cluster_test_scripts/README.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-Cluster test scripts.
-
-A set of scripts to start and stop cluster and test clients on
-multiple hosts using ssh.
-
-Pre-requisites: You must be
- - set up for password-free ssh access to the test hosts.
- - a member of the ais group on all the test hosts.
-
-Configuration:
-
-Copy defaults.sh to config.sh and edit the values as necessary.
-
-Test scripts:
-
-Test scripts use the functions in functions.sh to start & monitor
-cluster and clients.
-A test script can collect other scripts.
-
-
diff --git a/cpp/src/tests/cluster_test_scripts/cluster_check b/cpp/src/tests/cluster_test_scripts/cluster_check
deleted file mode 100755
index 05fcc1bcd2..0000000000
--- a/cpp/src/tests/cluster_test_scripts/cluster_check
+++ /dev/null
@@ -1,37 +0,0 @@
-#!/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.
-#
-
-# Check that all members of a cluster are running
-
-source config.sh
-
-HOSTS=(`cat $CLUSTER_HOME/hosts`)
-PORTS=(`cat $CLUSTER_HOME/ports`)
-
-for ((i=0; i<${#HOSTS[*]}; ++i)); do
- host=${HOSTS[$i]}
- port=${PORTS[$i]}
- ssh $host "$QPIDD -cp $port" > /dev/null || {
- ret=1
- echo "ERROR: broker not running $host:$port"
- }
-done
-exit $ret
diff --git a/cpp/src/tests/cluster_test_scripts/cluster_start b/cpp/src/tests/cluster_test_scripts/cluster_start
deleted file mode 100755
index 8911358f7e..0000000000
--- a/cpp/src/tests/cluster_test_scripts/cluster_start
+++ /dev/null
@@ -1,56 +0,0 @@
-#!/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.
-#
-
-# Start a cluster
-#
-# Arguments: NAME HOST [host...]
-# Start a cluster called NAME with N nodes running on the given HOSTs
-# repeat the host name to run multiple brokers on one host. Use dynamic
-# ports.
-#
-# Log files, data directories and hosts/ports files are all stored under
-# $HOME/cluster_test/$NAME
-#
-
-source config.sh
-
-CLUSTER_NAME=`date +"${USER}_%F_%T"`
-HOSTS=($BROKER_HOSTS)
-for ((i = 0; i < ${#HOSTS[*]}; ++i)) ; do
- host=${HOSTS[$i]}
- datadir=$CLUSTER_HOME/broker$i
- log=$datadir/qpidd.log
- ssh $host "rm -rf $datadir; mkdir -p $datadir" || {
- echo "ERROR: can't make data dir $datadir"; exit 1
- }
- port=`ssh $host "echo $QPIDD -dp0 --cluster-name=$CLUSTER_NAME \
- --data-dir=$datadir \
- --log-to-file=$log --log-prefix=broker$i \
- $QPIDD_OPTS | newgrp ais"` || {
- error "ERROR: can't start broker $i on $host"; exit 1;
- }
- PORTS="$PORTS $port"
-done
-
-echo "$BROKER_HOSTS" > $CLUSTER_HOME/hosts
-echo "$PORTS" > $CLUSTER_HOME/ports
-
-`dirname $0`/cluster_check $NAME
diff --git a/cpp/src/tests/cluster_test_scripts/cluster_stop b/cpp/src/tests/cluster_test_scripts/cluster_stop
deleted file mode 100755
index 09aa8f3b21..0000000000
--- a/cpp/src/tests/cluster_test_scripts/cluster_stop
+++ /dev/null
@@ -1,38 +0,0 @@
-#!/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.
-#
-
-# Stop the cluster.
-
-source config.sh
-
-HOSTS=(`cat $CLUSTER_HOME/hosts`)
-PORTS=(`cat $CLUSTER_HOME/ports`)
-
-for ((i=0; i<${#HOSTS[*]}; ++i)); do
- host=${HOSTS[$i]}
- port=${PORTS[$i]}
- ssh $host "$QPIDD -qp $port" > /dev/null || {
- ret=1
- echo "ERROR: stopping broker at $host:$port"
- }
-done
-
-exit $ret
diff --git a/cpp/src/tests/cluster_test_scripts/config_example.sh b/cpp/src/tests/cluster_test_scripts/config_example.sh
deleted file mode 100755
index d47c9a9c77..0000000000
--- a/cpp/src/tests/cluster_test_scripts/config_example.sh
+++ /dev/null
@@ -1,44 +0,0 @@
-# Cluster configuration.
-
-#
-# 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.
-#
-
-# All output stored under $HOME/$CLUSTER_HOME.
-CLUSTER_HOME=$HOME/cluster_test
-
-# Hosts where brokers will be run. Repeat hostname to run multiple brokers on 1 host.
-BROKER_HOSTS="mrg22 mrg23 mrg24 mrg25 mrg26"
-
-# Hosts where clients will be run.
-CLIENT_HOSTS="$BROKER_HOSTS"
-
-# Paths to executables
-QPIDD=qpidd
-PERFTEST=perftest
-
-# Directory containing tests
-TESTDIR=/usr/bin
-
-# Options for qpidd, must be sufficient to load the cluster plugin.
-# Scripts will add --cluster-name, --daemon, --port and --log-to-file options here.
-QPIDD_OPTS=" \
---auth=no \
---log-enable=notice+ \
---log-enable=debug+:cluster \
-"
diff --git a/cpp/src/tests/cluster_test_scripts/perftest b/cpp/src/tests/cluster_test_scripts/perftest
deleted file mode 100755
index 984761eb5f..0000000000
--- a/cpp/src/tests/cluster_test_scripts/perftest
+++ /dev/null
@@ -1,54 +0,0 @@
-#!/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.
-#
-
-# Run a distributed perftest against a cluster.
-# Args: npubs nsubs [perftest-options]
-
-source config.sh
-
-NPUBS=${1:-4} ; shift
-NSUBS=${1:-4} ; shift
-OPTS="--npubs $NPUBS --nsubs $NSUBS $*"
-
-CLIENTS=($CLIENT_HOSTS)
-BROKERS=(`cat $CLUSTER_HOME/hosts`)
-PORTS=(`cat $CLUSTER_HOME/ports`)
-
-start() {
- client=${CLIENTS[i % ${#CLIENTS[*]}]}
- broker=${BROKERS[i % ${#BROKERS[*]}]}
- port=${PORTS[i % ${#PORTS[*]}]}
- ssh -n $client $PERFTEST $OPTS $* -b $broker -p $port &
- PIDS="$PIDS $!"
-}
-
-ssh ${CLIENTS[0]} $PERFTEST $OPTS --setup -b ${BROKERS[0]} -p${PORTS[0]}
-for (( i=0 ; i < $NPUBS ; ++i)); do start --publish; done
-for (( ; i < $NPUBS+$NSUBS ; ++i)); do start --subscribe; done
-ssh ${CLIENTS[0]} $PERFTEST $OPTS --control -b ${BROKERS[0]} -p${PORTS[0]}
-
-for pid in $PIDS; do
- wait $pid || echo "ERROR: client process $pid failed"
-done
-
-`dirname $0`/cluster_check
-
-
diff --git a/cpp/src/tests/cluster_tests.fail b/cpp/src/tests/cluster_tests.fail
deleted file mode 100644
index b28b04f643..0000000000
--- a/cpp/src/tests/cluster_tests.fail
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
diff --git a/cpp/src/tests/cluster_tests.py b/cpp/src/tests/cluster_tests.py
deleted file mode 100755
index 593791297a..0000000000
--- a/cpp/src/tests/cluster_tests.py
+++ /dev/null
@@ -1,1057 +0,0 @@
-#!/usr/bin/env python
-
-# 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.
-#
-
-import os, signal, sys, time, imp, re, subprocess, glob, cluster_test_logs
-from qpid import datatypes, messaging
-from brokertest import *
-from qpid.harness import Skipped
-from qpid.messaging import Message, Empty, Disposition, REJECTED
-from threading import Thread, Lock, Condition
-from logging import getLogger
-from itertools import chain
-from tempfile import NamedTemporaryFile
-
-log = getLogger("qpid.cluster_tests")
-
-# Note: brokers that shut themselves down due to critical error during
-# normal operation will still have an exit code of 0. Brokers that
-# shut down because of an error found during initialize will exit with
-# a non-0 code. Hence the apparently inconsistent use of EXPECT_EXIT_OK
-# and EXPECT_EXIT_FAIL in some of the tests below.
-
-# TODO aconway 2010-03-11: resolve this - ideally any exit due to an error
-# should give non-0 exit status.
-
-# Import scripts as modules
-qpid_cluster=import_script(checkenv("QPID_CLUSTER_EXEC"))
-
-def readfile(filename):
- """Returns te content of file named filename as a string"""
- f = file(filename)
- try: return f.read()
- finally: f.close()
-
-class ShortTests(BrokerTest):
- """Short cluster functionality tests."""
-
- def test_message_replication(self):
- """Test basic cluster message replication."""
- # Start a cluster, send some messages to member 0.
- cluster = self.cluster(2)
- s0 = cluster[0].connect().session()
- s0.sender("q; {create:always}").send(Message("x"))
- s0.sender("q; {create:always}").send(Message("y"))
- s0.connection.close()
-
- # Verify messages available on member 1.
- s1 = cluster[1].connect().session()
- m = s1.receiver("q", capacity=1).fetch(timeout=1)
- s1.acknowledge()
- self.assertEqual("x", m.content)
- s1.connection.close()
-
- # Start member 2 and verify messages available.
- s2 = cluster.start().connect().session()
- m = s2.receiver("q", capacity=1).fetch(timeout=1)
- s2.acknowledge()
- self.assertEqual("y", m.content)
- s2.connection.close()
-
- def test_store_direct_update_match(self):
- """Verify that brokers stores an identical message whether they receive it
- direct from clients or during an update, no header or other differences"""
- cluster = self.cluster(0, args=["--load-module", self.test_store_lib])
- cluster.start(args=["--test-store-dump", "direct.dump"])
- # Try messages with various headers
- cluster[0].send_message("q", Message(durable=True, content="foobar",
- subject="subject",
- reply_to="reply_to",
- properties={"n":10}))
- # Try messages of different sizes
- for size in range(0,10000,100):
- cluster[0].send_message("q", Message(content="x"*size, durable=True))
- # Try sending via named exchange
- c = cluster[0].connect_old()
- s = c.session(str(qpid.datatypes.uuid4()))
- s.exchange_bind(exchange="amq.direct", binding_key="foo", queue="q")
- props = s.delivery_properties(routing_key="foo", delivery_mode=2)
- s.message_transfer(
- destination="amq.direct",
- message=qpid.datatypes.Message(props, "content"))
-
- # Now update a new member and compare their dumps.
- cluster.start(args=["--test-store-dump", "updatee.dump"])
- assert readfile("direct.dump") == readfile("updatee.dump")
- os.remove("direct.dump")
- os.remove("updatee.dump")
-
- def test_sasl(self):
- """Test SASL authentication and encryption in a cluster"""
- sasl_config=os.path.join(self.rootdir, "sasl_config")
- acl=os.path.join(os.getcwd(), "policy.acl")
- aclf=file(acl,"w")
- aclf.write("""
-acl deny zag@QPID create queue
-acl allow all all
-""")
- aclf.close()
- cluster = self.cluster(2, args=["--auth", "yes",
- "--sasl-config", sasl_config,
- "--load-module", os.getenv("ACL_LIB"),
- "--acl-file", acl])
-
- # Valid user/password, ensure queue is created.
- c = cluster[0].connect(username="zig", password="zig")
- c.session().sender("ziggy;{create:always}")
- c.close()
- c = cluster[1].connect(username="zig", password="zig")
- c.session().receiver("ziggy;{assert:always}")
- c.close()
- for b in cluster: b.ready() # Make sure all brokers still running.
-
- # Valid user, bad password
- try:
- cluster[0].connect(username="zig", password="foo").close()
- self.fail("Expected exception")
- except messaging.exceptions.ConnectionError: pass
- for b in cluster: b.ready() # Make sure all brokers still running.
-
- # Bad user ID
- try:
- cluster[0].connect(username="foo", password="bar").close()
- self.fail("Expected exception")
- except messaging.exceptions.ConnectionError: pass
- for b in cluster: b.ready() # Make sure all brokers still running.
-
- # Action disallowed by ACL
- c = cluster[0].connect(username="zag", password="zag")
- try:
- s = c.session()
- s.sender("zaggy;{create:always}")
- s.close()
- self.fail("Expected exception")
- except messaging.exceptions.UnauthorizedAccess: pass
- # make sure the queue was not created at the other node.
- c = cluster[0].connect(username="zag", password="zag")
- try:
- s = c.session()
- s.sender("zaggy;{assert:always}")
- s.close()
- self.fail("Expected exception")
- except messaging.exceptions.NotFound: pass
-
- def test_user_id_update(self):
- """Ensure that user-id of an open session is updated to new cluster members"""
- sasl_config=os.path.join(self.rootdir, "sasl_config")
- cluster = self.cluster(1, args=["--auth", "yes", "--sasl-config", sasl_config,])
- c = cluster[0].connect(username="zig", password="zig")
- s = c.session().sender("q;{create:always}")
- s.send(Message("x", user_id="zig")) # Message sent before start new broker
- cluster.start()
- s.send(Message("y", user_id="zig")) # Messsage sent after start of new broker
- # Verify brokers are healthy and messages are on the queue.
- self.assertEqual("x", cluster[0].get_message("q").content)
- self.assertEqual("y", cluster[1].get_message("q").content)
-
- def test_link_events(self):
- """Regression test for https://bugzilla.redhat.com/show_bug.cgi?id=611543"""
- args = ["--mgmt-pub-interval", 1] # Publish management information every second.
- broker1 = self.cluster(1, args)[0]
- broker2 = self.cluster(1, args)[0]
- qp = self.popen(["qpid-printevents", broker1.host_port()], EXPECT_RUNNING)
- qr = self.popen(["qpid-route", "route", "add",
- broker1.host_port(), broker2.host_port(),
- "amq.fanout", "key"
- ], EXPECT_EXIT_OK)
- # Look for link event in printevents output.
- retry(lambda: find_in_file("brokerLinkUp", qp.outfile("out")))
- broker1.ready()
- broker2.ready()
-
- def test_queue_cleaner(self):
- """ Regression test to ensure that cleanup of expired messages works correctly """
- cluster = self.cluster(2, args=["--queue-purge-interval", 3])
-
- s0 = cluster[0].connect().session()
- sender = s0.sender("my-lvq; {create: always, node:{x-declare:{arguments:{'qpid.last_value_queue':1}}}}")
- #send 10 messages that will all expire and be cleaned up
- for i in range(1, 10):
- msg = Message("message-%s" % i)
- msg.properties["qpid.LVQ_key"] = "a"
- msg.ttl = 0.1
- sender.send(msg)
- #wait for queue cleaner to run
- time.sleep(3)
-
- #test all is ok by sending and receiving a message
- msg = Message("non-expiring")
- msg.properties["qpid.LVQ_key"] = "b"
- sender.send(msg)
- s0.connection.close()
- s1 = cluster[1].connect().session()
- m = s1.receiver("my-lvq", capacity=1).fetch(timeout=1)
- s1.acknowledge()
- self.assertEqual("non-expiring", m.content)
- s1.connection.close()
-
- for b in cluster: b.ready() # Make sure all brokers still running.
-
-
- def test_amqfailover_visible(self):
- """Verify that the amq.failover exchange can be seen by
- QMF-based tools - regression test for BZ615300."""
- broker1 = self.cluster(1)[0]
- broker2 = self.cluster(1)[0]
- qs = subprocess.Popen(["qpid-stat", "-e", broker1.host_port()], stdout=subprocess.PIPE)
- out = qs.communicate()[0]
- assert out.find("amq.failover") > 0
-
- def evaluate_address(self, session, address):
- """Create a receiver just to evaluate an address for its side effects"""
- r = session.receiver(address)
- r.close()
-
- def test_expire_fanout(self):
- """Regression test for QPID-2874: Clustered broker crashes in assertion in
- cluster/ExpiryPolicy.cpp.
- Caused by a fan-out message being updated as separate messages"""
- cluster = self.cluster(1)
- session0 = cluster[0].connect().session()
- # Create 2 queues bound to fanout exchange.
- self.evaluate_address(session0, "q1;{create:always,node:{x-bindings:[{exchange:'amq.fanout',queue:q1}]}}")
- self.evaluate_address(session0, "q2;{create:always,node:{x-bindings:[{exchange:'amq.fanout',queue:q2}]}}")
- queues = ["q1", "q2"]
- # Send a fanout message with a long timeout
- s = session0.sender("amq.fanout")
- s.send(Message("foo", ttl=100), sync=False)
- # Start a new member, check the messages
- cluster.start()
- session1 = cluster[1].connect().session()
- for q in queues: self.assert_browse(session1, "q1", ["foo"])
-
- def test_route_update(self):
- """Regression test for https://issues.apache.org/jira/browse/QPID-2982
- Links and bridges associated with routes were not replicated on update.
- This meant extra management objects and caused an exit if a management
- client was attached.
- """
- args=["--mgmt-pub-interval=1","--log-enable=trace+:management"]
- cluster0 = self.cluster(1, args=args)
- cluster1 = self.cluster(1, args=args)
- assert 0 == subprocess.call(
- ["qpid-route", "route", "add", cluster0[0].host_port(),
- cluster1[0].host_port(), "dummy-exchange", "dummy-key", "-d"])
- cluster0.start()
-
- # Wait for qpid-tool:list on cluster0[0] to generate expected output.
- pattern = re.compile("org.apache.qpid.broker.*link")
- qpid_tool = subprocess.Popen(["qpid-tool", cluster0[0].host_port()],
- stdin=subprocess.PIPE, stdout=subprocess.PIPE)
- class Scanner(Thread):
- def __init__(self): self.found = False; Thread.__init__(self)
- def run(self):
- for l in qpid_tool.stdout:
- if pattern.search(l): self.found = True; return
- scanner = Scanner()
- scanner.start()
- start = time.time()
- try:
- # Wait up to 5 second timeout for scanner to find expected output
- while not scanner.found and time.time() < start + 5:
- qpid_tool.stdin.write("list\n") # Ask qpid-tool to list
- for b in cluster0: b.ready() # Raise if any brokers are down
- finally:
- qpid_tool.stdin.write("quit\n")
- qpid_tool.wait()
- scanner.join()
- assert scanner.found
- # Regression test for https://issues.apache.org/jira/browse/QPID-3235
- # Inconsistent stats when changing elder.
-
- # Force a change of elder
- cluster0.start()
- cluster0[0].kill()
- time.sleep(2) # Allow a management interval to pass.
- # Verify logs are consistent
- cluster_test_logs.verify_logs()
-
- def test_redelivered(self):
- """Verify that redelivered flag is set correctly on replayed messages"""
- cluster = self.cluster(2, expect=EXPECT_EXIT_FAIL)
- url = "amqp:tcp:%s,tcp:%s" % (cluster[0].host_port(), cluster[1].host_port())
- queue = "my-queue"
- cluster[0].declare_queue(queue)
- self.sender = self.popen(
- ["qpid-send",
- "--broker", url,
- "--address", queue,
- "--sequence=true",
- "--send-eos=1",
- "--messages=100000",
- "--connection-options={reconnect:true}"
- ])
- self.receiver = self.popen(
- ["qpid-receive",
- "--broker", url,
- "--address", queue,
- "--ignore-duplicates",
- "--check-redelivered",
- "--connection-options={reconnect:true}",
- "--forever"
- ])
- time.sleep(1)#give sender enough time to have some messages to replay
- cluster[0].kill()
- self.sender.wait()
- self.receiver.wait()
- cluster[1].kill()
-
- class BlockedSend(Thread):
- """Send a message, send is expected to block.
- Verify that it does block (for a given timeout), then allow
- waiting till it unblocks when it is expected to do so."""
- def __init__(self, sender, msg):
- self.sender, self.msg = sender, msg
- self.blocked = True
- self.condition = Condition()
- self.timeout = 0.1 # Time to wait for expected results.
- Thread.__init__(self)
- def run(self):
- try:
- self.sender.send(self.msg, sync=True)
- self.condition.acquire()
- try:
- self.blocked = False
- self.condition.notify()
- finally: self.condition.release()
- except Exception,e: print "BlockedSend exception: %s"%e
- def start(self):
- Thread.start(self)
- time.sleep(self.timeout)
- assert self.blocked # Expected to block
- def assert_blocked(self): assert self.blocked
- def wait(self): # Now expecting to unblock
- self.condition.acquire()
- try:
- while self.blocked:
- self.condition.wait(self.timeout)
- if self.blocked: raise Exception("Timed out waiting for send to unblock")
- finally: self.condition.release()
- self.join()
-
- def queue_flowlimit_test(self, brokers):
- """Verify that the queue's flowlimit configuration and state are
- correctly replicated.
- The brokers argument allows this test to run on single broker,
- cluster of 2 pre-startd brokers or cluster where second broker
- starts after queue is in flow control.
- """
- # configure a queue with a specific flow limit on first broker
- ssn0 = brokers.first().connect().session()
- s0 = ssn0.sender("flq; {create:always, node:{type:queue, x-declare:{arguments:{'qpid.flow_stop_count':5, 'qpid.flow_resume_count':3}}}}")
- brokers.first().startQmf()
- q1 = [q for q in brokers.first().qmf_session.getObjects(_class="queue") if q.name == "flq"][0]
- oid = q1.getObjectId()
- self.assertEqual(q1.name, "flq")
- self.assertEqual(q1.arguments, {u'qpid.flow_stop_count': 5L, u'qpid.flow_resume_count': 3L})
- assert not q1.flowStopped
- self.assertEqual(q1.flowStoppedCount, 0)
-
- # fill the queue on one broker until flow control is active
- for x in range(5): s0.send(Message(str(x)))
- sender = ShortTests.BlockedSend(s0, Message(str(6)))
- sender.start() # Tests that sender does block
- # Verify the broker queue goes into a flowStopped state
- deadline = time.time() + 1
- while not q1.flowStopped and time.time() < deadline: q1.update()
- assert q1.flowStopped
- self.assertEqual(q1.flowStoppedCount, 1)
- sender.assert_blocked() # Still blocked
-
- # Now verify the both brokers in cluster have same configuration
- brokers.second().startQmf()
- qs = brokers.second().qmf_session.getObjects(_objectId=oid)
- self.assertEqual(len(qs), 1)
- q2 = qs[0]
- self.assertEqual(q2.name, "flq")
- self.assertEqual(q2.arguments, {u'qpid.flow_stop_count': 5L, u'qpid.flow_resume_count': 3L})
- assert q2.flowStopped
- self.assertEqual(q2.flowStoppedCount, 1)
-
- # now drain the queue using a session to the other broker
- ssn1 = brokers.second().connect().session()
- r1 = ssn1.receiver("flq", capacity=6)
- for x in range(4):
- r1.fetch(timeout=0)
- ssn1.acknowledge()
- sender.wait() # Verify no longer blocked.
-
- # and re-verify state of queue on both brokers
- q1.update()
- assert not q1.flowStopped
- q2.update()
- assert not q2.flowStopped
-
- ssn0.connection.close()
- ssn1.connection.close()
- cluster_test_logs.verify_logs()
-
- def test_queue_flowlimit(self):
- """Test flow limits on a standalone broker"""
- broker = self.broker()
- class Brokers:
- def first(self): return broker
- def second(self): return broker
- self.queue_flowlimit_test(Brokers())
-
- def test_queue_flowlimit_cluster(self):
- cluster = self.cluster(2)
- class Brokers:
- def first(self): return cluster[0]
- def second(self): return cluster[1]
- self.queue_flowlimit_test(Brokers())
-
- def test_queue_flowlimit_cluster_join(self):
- cluster = self.cluster(1)
- class Brokers:
- def first(self): return cluster[0]
- def second(self):
- if len(cluster) == 1: cluster.start()
- return cluster[1]
- self.queue_flowlimit_test(Brokers())
-
- def test_queue_flowlimit_replicate(self):
- """ Verify that a queue which is in flow control BUT has drained BELOW
- the flow control 'stop' threshold, is correctly replicated when a new
- broker is added to the cluster.
- """
-
- class AsyncSender(Thread):
- """Send a fixed number of msgs from a sender in a separate thread
- so it may block without blocking the test.
- """
- def __init__(self, broker, address, count=1, size=4):
- Thread.__init__(self)
- self.daemon = True
- self.broker = broker
- self.queue = address
- self.count = count
- self.size = size
- self.done = False
-
- def run(self):
- self.sender = subprocess.Popen(["qpid-send",
- "--capacity=1",
- "--content-size=%s" % self.size,
- "--messages=%s" % self.count,
- "--failover-updates",
- "--connection-options={reconnect:true}",
- "--address=%s" % self.queue,
- "--broker=%s" % self.broker.host_port()])
- self.sender.wait()
- self.done = True
-
- cluster = self.cluster(2)
- # create a queue with rather draconian flow control settings
- ssn0 = cluster[0].connect().session()
- s0 = ssn0.sender("flq; {create:always, node:{type:queue, x-declare:{arguments:{'qpid.flow_stop_count':100, 'qpid.flow_resume_count':20}}}}")
-
- # fire off the sending thread to broker[0], and wait until the queue
- # hits flow control on broker[1]
- sender = AsyncSender(cluster[0], "flq", count=110);
- sender.start();
-
- cluster[1].startQmf()
- q_obj = [q for q in cluster[1].qmf_session.getObjects(_class="queue") if q.name == "flq"][0]
- deadline = time.time() + 10
- while not q_obj.flowStopped and time.time() < deadline:
- q_obj.update()
- assert q_obj.flowStopped
- assert not sender.done
- assert q_obj.msgDepth < 110
-
- # Now drain enough messages on broker[1] to drop below the flow stop
- # threshold, but not relieve flow control...
- receiver = subprocess.Popen(["qpid-receive",
- "--messages=15",
- "--timeout=1",
- "--print-content=no",
- "--failover-updates",
- "--connection-options={reconnect:true}",
- "--ack-frequency=1",
- "--address=flq",
- "--broker=%s" % cluster[1].host_port()])
- receiver.wait()
- q_obj.update()
- assert q_obj.flowStopped
- assert not sender.done
- current_depth = q_obj.msgDepth
-
- # add a new broker to the cluster, and verify that the queue is in flow
- # control on that broker
- cluster.start()
- cluster[2].startQmf()
- q_obj = [q for q in cluster[2].qmf_session.getObjects(_class="queue") if q.name == "flq"][0]
- assert q_obj.flowStopped
- assert q_obj.msgDepth == current_depth
-
- # now drain the queue on broker[2], and verify that the sender becomes
- # unblocked
- receiver = subprocess.Popen(["qpid-receive",
- "--messages=95",
- "--timeout=1",
- "--print-content=no",
- "--failover-updates",
- "--connection-options={reconnect:true}",
- "--ack-frequency=1",
- "--address=flq",
- "--broker=%s" % cluster[2].host_port()])
- receiver.wait()
- q_obj.update()
- assert not q_obj.flowStopped
- assert q_obj.msgDepth == 0
-
- # verify that the sender has become unblocked
- sender.join(timeout=5)
- assert not sender.isAlive()
- assert sender.done
-
- def test_blocked_queue_delete(self):
- """Verify that producers which are blocked on a queue due to flow
- control are unblocked when that queue is deleted.
- """
-
- cluster = self.cluster(2)
- cluster[0].startQmf()
- cluster[1].startQmf()
-
- # configure a queue with a specific flow limit on first broker
- ssn0 = cluster[0].connect().session()
- s0 = ssn0.sender("flq; {create:always, node:{type:queue, x-declare:{arguments:{'qpid.flow_stop_count':5, 'qpid.flow_resume_count':3}}}}")
- q1 = [q for q in cluster[0].qmf_session.getObjects(_class="queue") if q.name == "flq"][0]
- oid = q1.getObjectId()
- self.assertEqual(q1.name, "flq")
- self.assertEqual(q1.arguments, {u'qpid.flow_stop_count': 5L, u'qpid.flow_resume_count': 3L})
- assert not q1.flowStopped
- self.assertEqual(q1.flowStoppedCount, 0)
-
- # fill the queue on one broker until flow control is active
- for x in range(5): s0.send(Message(str(x)))
- sender = ShortTests.BlockedSend(s0, Message(str(6)))
- sender.start() # Tests that sender does block
- # Verify the broker queue goes into a flowStopped state
- deadline = time.time() + 1
- while not q1.flowStopped and time.time() < deadline: q1.update()
- assert q1.flowStopped
- self.assertEqual(q1.flowStoppedCount, 1)
- sender.assert_blocked() # Still blocked
-
- # Now verify the both brokers in cluster have same configuration
- qs = cluster[1].qmf_session.getObjects(_objectId=oid)
- self.assertEqual(len(qs), 1)
- q2 = qs[0]
- self.assertEqual(q2.name, "flq")
- self.assertEqual(q2.arguments, {u'qpid.flow_stop_count': 5L, u'qpid.flow_resume_count': 3L})
- assert q2.flowStopped
- self.assertEqual(q2.flowStoppedCount, 1)
-
- # now delete the blocked queue from other broker
- ssn1 = cluster[1].connect().session()
- self.evaluate_address(ssn1, "flq;{delete:always}")
- sender.wait() # Verify no longer blocked.
-
- ssn0.connection.close()
- ssn1.connection.close()
- cluster_test_logs.verify_logs()
-
-
- def test_alternate_exchange_update(self):
- """Verify that alternate-exchange on exchanges and queues is propagated to new members of a cluster. """
- cluster = self.cluster(1)
- s0 = cluster[0].connect().session()
- # create alt queue bound to amq.fanout exchange, will be destination for alternate exchanges
- self.evaluate_address(s0, "alt;{create:always,node:{x-bindings:[{exchange:'amq.fanout',queue:alt}]}}")
- # create direct exchange ex with alternate-exchange amq.fanout and no queues bound
- self.evaluate_address(s0, "ex;{create:always,node:{type:topic, x-declare:{type:'direct', alternate-exchange:'amq.fanout'}}}")
- # create queue q with alternate-exchange amq.fanout
- self.evaluate_address(s0, "q;{create:always,node:{type:queue, x-declare:{alternate-exchange:'amq.fanout'}}}")
-
- def verify(broker):
- s = broker.connect().session()
- # Verify unmatched message goes to ex's alternate.
- s.sender("ex").send("foo")
- self.assertEqual("foo", s.receiver("alt").fetch(timeout=0).content)
- # Verify rejected message goes to q's alternate.
- s.sender("q").send("bar")
- msg = s.receiver("q").fetch(timeout=0)
- self.assertEqual("bar", msg.content)
- s.acknowledge(msg, Disposition(REJECTED)) # Reject the message
- self.assertEqual("bar", s.receiver("alt").fetch(timeout=0).content)
-
- verify(cluster[0])
- cluster.start()
- verify(cluster[1])
-
- def test_binding_order(self):
- """Regression test for binding order inconsistency in cluster"""
- cluster = self.cluster(1)
- c0 = cluster[0].connect()
- s0 = c0.session()
- # Declare multiple queues bound to same key on amq.topic
- def declare(q,max=0):
- if max: declare = 'x-declare:{arguments:{"qpid.max_count":%d, "qpid.flow_stop_count":0}}'%max
- else: declare = 'x-declare:{}'
- bind='x-bindings:[{queue:%s,key:key,exchange:"amq.topic"}]'%(q)
- s0.sender("%s;{create:always,node:{%s,%s}}" % (q,declare,bind))
- declare('d',max=4) # Only one with a limit
- for q in ['c', 'b','a']: declare(q)
- # Add a cluster member, send enough messages to exceed the max count
- cluster.start()
- try:
- s = s0.sender('amq.topic/key')
- for m in xrange(1,6): s.send(Message(str(m)))
- self.fail("Expected capacity exceeded exception")
- except messaging.exceptions.TargetCapacityExceeded: pass
- c1 = cluster[1].connect()
- s1 = c1.session()
- s0 = c0.session() # Old session s0 is broken by exception.
- # Verify queue contents are consistent.
- for q in ['a','b','c','d']:
- self.assertEqual(self.browse(s0, q), self.browse(s1, q))
- # Verify queue contents are "best effort"
- for q in ['a','b','c']: self.assert_browse(s1,q,[str(n) for n in xrange(1,6)])
- self.assert_browse(s1,'d',[str(n) for n in xrange(1,5)])
-
- def test_deleted_exchange(self):
- """QPID-3215: cached exchange reference can cause cluster inconsistencies
- if exchange is deleted/recreated
- Verify stand-alone case
- """
- cluster = self.cluster()
- # Verify we do not route message via an exchange that has been destroyed.
- cluster.start()
- s0 = cluster[0].connect().session()
- self.evaluate_address(s0, "ex;{create:always,node:{type:topic}}")
- self.evaluate_address(s0, "q;{create:always,node:{x-bindings:[{exchange:'ex',queue:q,key:foo}]}}")
- send0 = s0.sender("ex/foo")
- send0.send("foo")
- self.assert_browse(s0, "q", ["foo"])
- self.evaluate_address(s0, "ex;{delete:always}")
- try:
- send0.send("bar") # Should fail, exchange is deleted.
- self.fail("Expected not-found exception")
- except qpid.messaging.NotFound: pass
- self.assert_browse(cluster[0].connect().session(), "q", ["foo"])
-
- def test_deleted_exchange_inconsistent(self):
- """QPID-3215: cached exchange reference can cause cluster inconsistencies
- if exchange is deleted/recreated
-
- Verify cluster inconsistency.
- """
- cluster = self.cluster()
- cluster.start()
- s0 = cluster[0].connect().session()
- self.evaluate_address(s0, "ex;{create:always,node:{type:topic}}")
- self.evaluate_address(s0, "q;{create:always,node:{x-bindings:[{exchange:'ex',queue:q,key:foo}]}}")
- send0 = s0.sender("ex/foo")
- send0.send("foo")
- self.assert_browse(s0, "q", ["foo"])
-
- cluster.start()
- s1 = cluster[1].connect().session()
- self.evaluate_address(s0, "ex;{delete:always}")
- try:
- send0.send("bar")
- self.fail("Expected not-found exception")
- except qpid.messaging.NotFound: pass
-
- self.assert_browse(s1, "q", ["foo"])
-
-
-class LongTests(BrokerTest):
- """Tests that can run for a long time if -DDURATION=<minutes> is set"""
- def duration(self):
- d = self.config.defines.get("DURATION")
- if d: return float(d)*60
- else: return 3 # Default is to be quick
-
- def test_failover(self):
- """Test fail-over during continuous send-receive with errors"""
-
- # Original cluster will all be killed so expect exit with failure
- cluster = self.cluster(3, expect=EXPECT_EXIT_FAIL)
- for b in cluster: ErrorGenerator(b)
-
- # Start sender and receiver threads
- cluster[0].declare_queue("test-queue")
- sender = NumberedSender(cluster[1], 1000) # Max queue depth
- receiver = NumberedReceiver(cluster[2], sender)
- receiver.start()
- sender.start()
-
- # Kill original brokers, start new ones for the duration.
- endtime = time.time() + self.duration()
- i = 0
- while time.time() < endtime:
- cluster[i].kill()
- i += 1
- b = cluster.start(expect=EXPECT_EXIT_FAIL)
- ErrorGenerator(b)
- time.sleep(5)
- sender.stop()
- receiver.stop()
- for i in range(i, len(cluster)): cluster[i].kill()
-
- def test_management(self, args=[]):
- """
- Stress test: Run management clients and other clients concurrently
- while killing and restarting brokers.
- """
-
- class ClientLoop(StoppableThread):
- """Run a client executable in a loop."""
- def __init__(self, broker, cmd):
- StoppableThread.__init__(self)
- self.broker=broker
- self.cmd = cmd # Client command.
- self.lock = Lock()
- self.process = None # Client process.
- self.start()
-
- def run(self):
- try:
- while True:
- self.lock.acquire()
- try:
- if self.stopped: break
- self.process = self.broker.test.popen(
- self.cmd, expect=EXPECT_UNKNOWN)
- finally:
- self.lock.release()
- try:
- exit = self.process.wait()
- except OSError, e:
- # Process may already have been killed by self.stop()
- break
- except Exception, e:
- self.process.unexpected(
- "client of %s: %s"%(self.broker.name, e))
- self.lock.acquire()
- try:
- if self.stopped: break
- if exit != 0:
- self.process.unexpected(
- "client of %s exit code %s"%(self.broker.name, exit))
- finally:
- self.lock.release()
- except Exception, e:
- self.error = RethrownException("Error in ClientLoop.run")
-
- def stop(self):
- """Stop the running client and wait for it to exit"""
- self.lock.acquire()
- try:
- if self.stopped: return
- self.stopped = True
- if self.process:
- try: self.process.kill() # Kill the client.
- except OSError: pass # The client might not be running.
- finally: self.lock.release()
- StoppableThread.stop(self)
-
- # body of test_management()
-
- args += ["--mgmt-pub-interval", 1]
- args += ["--log-enable=trace+:management"]
- # Use store if present.
- if BrokerTest.store_lib: args +=["--load-module", BrokerTest.store_lib]
- cluster = self.cluster(3, args)
-
- clients = [] # Per-broker list of clients that only connect to one broker.
- mclients = [] # Management clients that connect to every broker in the cluster.
-
- def start_clients(broker):
- """Start ordinary clients for a broker."""
- cmds=[
- ["qpid-tool", "localhost:%s"%(broker.port())],
- ["qpid-perftest", "--count=5000", "--durable=yes",
- "--base-name", str(qpid.datatypes.uuid4()), "--port", broker.port()],
- ["qpid-txtest", "--queue-base-name", "tx-%s"%str(qpid.datatypes.uuid4()),
- "--port", broker.port()],
- ["qpid-queue-stats", "-a", "localhost:%s" %(broker.port())],
- ["testagent", "localhost", str(broker.port())] ]
- clients.append([ClientLoop(broker, cmd) for cmd in cmds])
-
- def start_mclients(broker):
- """Start management clients that make multiple connections."""
- cmd = ["qpid-stat", "-b", "localhost:%s" %(broker.port())]
- mclients.append(ClientLoop(broker, cmd))
-
- endtime = time.time() + self.duration()
- # For long duration, first run is a quarter of the duration.
- runtime = max(5, self.duration() / 4.0)
- alive = 0 # First live cluster member
- for i in range(len(cluster)): start_clients(cluster[i])
- start_mclients(cluster[alive])
-
- while time.time() < endtime:
- time.sleep(runtime)
- runtime = 5 # Remaining runs 5 seconds, frequent broker kills
- for b in cluster[alive:]: b.ready() # Check if a broker crashed.
- # Kill the first broker, expect the clients to fail.
- b = cluster[alive]
- b.expect = EXPECT_EXIT_FAIL
- b.kill()
- # Stop the brokers clients and all the mclients.
- for c in clients[alive] + mclients:
- try: c.stop()
- except: pass # Ignore expected errors due to broker shutdown.
- clients[alive] = []
- mclients = []
- # Start another broker and clients
- alive += 1
- cluster.start()
- start_clients(cluster[-1])
- start_mclients(cluster[alive])
- for c in chain(mclients, *clients):
- c.stop()
- # Verify that logs are consistent
- cluster_test_logs.verify_logs()
-
- def test_management_qmf2(self):
- self.test_management(args=["--mgmt-qmf2=yes"])
-
- def test_connect_consistent(self):
- args=["--mgmt-pub-interval=1","--log-enable=trace+:management"]
- cluster = self.cluster(2, args=args)
- end = time.time() + self.duration()
- while (time.time() < end): # Get a management interval
- for i in xrange(1000): cluster[0].connect().close()
- cluster_test_logs.verify_logs()
-
- def test_flowlimit_failover(self):
- """Test fail-over during continuous send-receive with flow control
- active.
- """
-
- # Original cluster will all be killed so expect exit with failure
- cluster = self.cluster(3, expect=EXPECT_EXIT_FAIL)
- #for b in cluster: ErrorGenerator(b)
-
- # create a queue with rather draconian flow control settings
- ssn0 = cluster[0].connect().session()
- s0 = ssn0.sender("test-queue; {create:always, node:{type:queue, x-declare:{arguments:{'qpid.flow_stop_count':2000, 'qpid.flow_resume_count':100}}}}")
-
- receiver = NumberedReceiver(cluster[2])
- receiver.start()
- senders = [NumberedSender(cluster[i]) for i in range(1,3)]
- for s in senders:
- s.start()
-
- # Kill original brokers, start new ones for the duration.
- endtime = time.time() + self.duration();
- i = 0
- while time.time() < endtime:
- cluster[i].kill()
- i += 1
- b = cluster.start(expect=EXPECT_EXIT_FAIL)
- #ErrorGenerator(b)
- time.sleep(5)
- #b = cluster[0]
- #b.startQmf()
- for s in senders:
- s.stop()
- receiver.stop()
- for i in range(i, len(cluster)): cluster[i].kill()
-
-
-class StoreTests(BrokerTest):
- """
- Cluster tests that can only be run if there is a store available.
- """
- def args(self):
- assert BrokerTest.store_lib
- return ["--load-module", BrokerTest.store_lib]
-
- def test_store_loaded(self):
- """Ensure we are indeed loading a working store"""
- broker = self.broker(self.args(), name="recoverme", expect=EXPECT_EXIT_FAIL)
- m = Message("x", durable=True)
- broker.send_message("q", m)
- broker.kill()
- broker = self.broker(self.args(), name="recoverme")
- self.assertEqual("x", broker.get_message("q").content)
-
- def test_kill_restart(self):
- """Verify we can kill/resetart a broker with store in a cluster"""
- cluster = self.cluster(1, self.args())
- cluster.start("restartme", expect=EXPECT_EXIT_FAIL).kill()
-
- # Send a message, retrieve from the restarted broker
- cluster[0].send_message("q", "x")
- m = cluster.start("restartme").get_message("q")
- self.assertEqual("x", m.content)
-
- def stop_cluster(self,broker):
- """Clean shut-down of a cluster"""
- self.assertEqual(0, qpid_cluster.main(
- ["-kf", broker.host_port()]))
-
- def test_persistent_restart(self):
- """Verify persistent cluster shutdown/restart scenarios"""
- cluster = self.cluster(0, args=self.args() + ["--cluster-size=3"])
- a = cluster.start("a", expect=EXPECT_EXIT_OK, wait=False)
- b = cluster.start("b", expect=EXPECT_EXIT_OK, wait=False)
- c = cluster.start("c", expect=EXPECT_EXIT_FAIL, wait=True)
- a.send_message("q", Message("1", durable=True))
- # Kill & restart one member.
- c.kill()
- self.assertEqual(a.get_message("q").content, "1")
- a.send_message("q", Message("2", durable=True))
- c = cluster.start("c", expect=EXPECT_EXIT_OK)
- self.assertEqual(c.get_message("q").content, "2")
- # Shut down the entire cluster cleanly and bring it back up
- a.send_message("q", Message("3", durable=True))
- self.stop_cluster(a)
- a = cluster.start("a", wait=False)
- b = cluster.start("b", wait=False)
- c = cluster.start("c", wait=True)
- self.assertEqual(a.get_message("q").content, "3")
-
- def test_persistent_partial_failure(self):
- # Kill 2 members, shut down the last cleanly then restart
- # Ensure we use the clean database
- cluster = self.cluster(0, args=self.args() + ["--cluster-size=3"])
- a = cluster.start("a", expect=EXPECT_EXIT_FAIL, wait=False)
- b = cluster.start("b", expect=EXPECT_EXIT_FAIL, wait=False)
- c = cluster.start("c", expect=EXPECT_EXIT_OK, wait=True)
- a.send_message("q", Message("4", durable=True))
- a.kill()
- b.kill()
- self.assertEqual(c.get_message("q").content, "4")
- c.send_message("q", Message("clean", durable=True))
- self.stop_cluster(c)
- a = cluster.start("a", wait=False)
- b = cluster.start("b", wait=False)
- c = cluster.start("c", wait=True)
- self.assertEqual(a.get_message("q").content, "clean")
-
- def test_wrong_cluster_id(self):
- # Start a cluster1 broker, then try to restart in cluster2
- cluster1 = self.cluster(0, args=self.args())
- a = cluster1.start("a", expect=EXPECT_EXIT_OK)
- a.terminate()
- cluster2 = self.cluster(1, args=self.args())
- try:
- a = cluster2.start("a", expect=EXPECT_EXIT_FAIL)
- a.ready()
- self.fail("Expected exception")
- except: pass
-
- def test_wrong_shutdown_id(self):
- # Start 2 members and shut down.
- cluster = self.cluster(0, args=self.args()+["--cluster-size=2"])
- a = cluster.start("a", expect=EXPECT_EXIT_OK, wait=False)
- b = cluster.start("b", expect=EXPECT_EXIT_OK, wait=False)
- self.stop_cluster(a)
- self.assertEqual(a.wait(), 0)
- self.assertEqual(b.wait(), 0)
-
- # Restart with a different member and shut down.
- a = cluster.start("a", expect=EXPECT_EXIT_OK, wait=False)
- c = cluster.start("c", expect=EXPECT_EXIT_OK, wait=False)
- self.stop_cluster(a)
- self.assertEqual(a.wait(), 0)
- self.assertEqual(c.wait(), 0)
- # Mix members from both shutdown events, they should fail
- # TODO aconway 2010-03-11: can't predict the exit status of these
- # as it depends on the order of delivery of initial-status messages.
- # See comment at top of this file.
- a = cluster.start("a", expect=EXPECT_UNKNOWN, wait=False)
- b = cluster.start("b", expect=EXPECT_UNKNOWN, wait=False)
- self.assertRaises(Exception, lambda: a.ready())
- self.assertRaises(Exception, lambda: b.ready())
-
- def test_solo_store_clean(self):
- # A single node cluster should always leave a clean store.
- cluster = self.cluster(0, self.args())
- a = cluster.start("a", expect=EXPECT_EXIT_FAIL)
- a.send_message("q", Message("x", durable=True))
- a.kill()
- a = cluster.start("a")
- self.assertEqual(a.get_message("q").content, "x")
-
- def test_last_store_clean(self):
- # Verify that only the last node in a cluster to shut down has
- # a clean store. Start with cluster of 3, reduce to 1 then
- # increase again to ensure that a node that was once alone but
- # finally did not finish as the last node does not get a clean
- # store.
- cluster = self.cluster(0, self.args())
- a = cluster.start("a", expect=EXPECT_EXIT_FAIL)
- self.assertEqual(a.store_state(), "clean")
- b = cluster.start("b", expect=EXPECT_EXIT_FAIL)
- c = cluster.start("c", expect=EXPECT_EXIT_FAIL)
- self.assertEqual(b.store_state(), "dirty")
- self.assertEqual(c.store_state(), "dirty")
- retry(lambda: a.store_state() == "dirty")
-
- a.send_message("q", Message("x", durable=True))
- a.kill()
- b.kill() # c is last man, will mark store clean
- retry(lambda: c.store_state() == "clean")
- a = cluster.start("a", expect=EXPECT_EXIT_FAIL) # c no longer last man
- retry(lambda: c.store_state() == "dirty")
- c.kill() # a is now last man
- retry(lambda: a.store_state() == "clean")
- a.kill()
- self.assertEqual(a.store_state(), "clean")
- self.assertEqual(b.store_state(), "dirty")
- self.assertEqual(c.store_state(), "dirty")
-
- def test_restart_clean(self):
- """Verify that we can re-start brokers one by one in a
- persistent cluster after a clean oshutdown"""
- cluster = self.cluster(0, self.args())
- a = cluster.start("a", expect=EXPECT_EXIT_OK)
- b = cluster.start("b", expect=EXPECT_EXIT_OK)
- c = cluster.start("c", expect=EXPECT_EXIT_OK)
- a.send_message("q", Message("x", durable=True))
- self.stop_cluster(a)
- a = cluster.start("a")
- b = cluster.start("b")
- c = cluster.start("c")
- self.assertEqual(c.get_message("q").content, "x")
-
- def test_join_sub_size(self):
- """Verify that after starting a cluster with cluster-size=N,
- we can join new members even if size < N-1"""
- cluster = self.cluster(0, self.args()+["--cluster-size=3"])
- a = cluster.start("a", wait=False, expect=EXPECT_EXIT_FAIL)
- b = cluster.start("b", wait=False, expect=EXPECT_EXIT_FAIL)
- c = cluster.start("c")
- a.send_message("q", Message("x", durable=True))
- a.send_message("q", Message("y", durable=True))
- a.kill()
- b.kill()
- a = cluster.start("a")
- self.assertEqual(c.get_message("q").content, "x")
- b = cluster.start("b")
- self.assertEqual(c.get_message("q").content, "y")
diff --git a/cpp/src/tests/clustered_replication_test b/cpp/src/tests/clustered_replication_test
deleted file mode 100755
index d6c72d9d1b..0000000000
--- a/cpp/src/tests/clustered_replication_test
+++ /dev/null
@@ -1,110 +0,0 @@
-#!/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:
-source ./test_env.sh
-
-trap stop_brokers INT EXIT
-
-fail() {
- echo $1
- exit 1
-}
-
-stop_brokers() {
- if [[ $PRIMARY1 ]] ; then
- $QPIDD_EXEC --no-module-dir -q --port $PRIMARY1
- unset PRIMARY1
- fi
- if [[ $PRIMARY2 ]] ; then
- $QPIDD_EXEC --no-module-dir -q --port $PRIMARY2
- unset PRIMARY2
- fi
- if [[ $DR1 ]] ; then
- $QPIDD_EXEC --no-module-dir -q --port $DR1
- unset DR1
- fi
- if [[ $DR2 ]] ; then
- $QPIDD_EXEC --no-module-dir -q --port $DR2
- unset DR2
- fi
-}
-
-if test -d $PYTHON_DIR; then
- . $srcdir/ais_check
-
- #todo: these cluster names need to be unique to prevent clashes
- PRIMARY_CLUSTER=PRIMARY_$(hostname)_$$
- DR_CLUSTER=DR_$(hostname)_$$
-
- GENERAL_OPTS="--auth no --no-module-dir --no-data-dir --daemon --port 0 --log-to-stderr false"
- PRIMARY_OPTS="--load-module $REPLICATING_LISTENER_LIB --create-replication-queue true --replication-queue REPLICATION_QUEUE --load-module $CLUSTER_LIB --cluster-name $PRIMARY_CLUSTER"
- DR_OPTS="--load-module $REPLICATION_EXCHANGE_LIB --load-module $CLUSTER_LIB --cluster-name $DR_CLUSTER"
-
- rm -f repl*.tmp #cleanup any files left from previous run
-
- #start first node of primary cluster and set up test queue
- echo Starting primary cluster
- PRIMARY1=$(with_ais_group $QPIDD_EXEC $GENERAL_OPTS $PRIMARY_OPTS --log-to-file repl.primary.1.tmp) || fail "Could not start PRIMARY1"
- $PYTHON_COMMANDS/qpid-config -a "localhost:$PRIMARY1" add queue test-queue --generate-queue-events 2
- $PYTHON_COMMANDS/qpid-config -a "localhost:$PRIMARY1" add queue control-queue --generate-queue-events 1
-
- #send 10 messages, consume 5 of them
- for i in `seq 1 10`; do echo Message$i; done | ./sender --port $PRIMARY1
- ./receiver --port $PRIMARY1 --messages 5 > /dev/null
-
- #add new node to primary cluster, testing correct transfer of state:
- echo Adding node to primary cluster
- PRIMARY2=$(with_ais_group $QPIDD_EXEC $GENERAL_OPTS $PRIMARY_OPTS --log-to-file repl.primary.2.tmp) || fail "Could not start PRIMARY2 "
-
- #start DR cluster, set up test queue there and establish replication bridge
- echo Starting DR cluster
- DR1=$(with_ais_group $QPIDD_EXEC $GENERAL_OPTS $DR_OPTS --log-to-file repl.dr.1.tmp) || fail "Could not start DR1"
- DR2=$(with_ais_group $QPIDD_EXEC $GENERAL_OPTS $DR_OPTS --log-to-file repl.dr.2.tmp) || fail "Could not start DR2"
-
- $PYTHON_COMMANDS/qpid-config -a "localhost:$DR1" add queue test-queue
- $PYTHON_COMMANDS/qpid-config -a "localhost:$DR1" add queue control-queue
- $PYTHON_COMMANDS/qpid-config -a "localhost:$DR1" add exchange replication REPLICATION_EXCHANGE
- $PYTHON_COMMANDS/qpid-route queue add localhost:$DR2 localhost:$PRIMARY2 REPLICATION_EXCHANGE REPLICATION_QUEUE || fail "Could not add route."
-
- #send more messages to primary
- for i in `seq 11 20`; do echo Message$i; done | ./sender --port $PRIMARY1 --send-eos 1
-
- #wait for replication events to all be processed:
- echo Waiting for replication to complete
- echo Done | ./sender --port $PRIMARY1 --routing-key control-queue --send-eos 1
- ./receiver --queue control-queue --port $DR1 > /dev/null
-
- #verify contents of test queue on dr cluster:
- echo Verifying...
- ./receiver --port $DR2 > repl.out.tmp
- for i in `seq 6 20`; do echo Message$i; done | diff repl.out.tmp - || FAIL=1
-
- if [[ $FAIL ]]; then
- echo Clustered replication test failed: expectations not met!
- exit 1
- else
- echo Clustered replication test passed
- rm -f repl*.tmp
- fi
-
-fi
diff --git a/cpp/src/tests/config.null b/cpp/src/tests/config.null
deleted file mode 100644
index 565c7da435..0000000000
--- a/cpp/src/tests/config.null
+++ /dev/null
@@ -1 +0,0 @@
-# empty config
diff --git a/cpp/src/tests/consume.cpp b/cpp/src/tests/consume.cpp
deleted file mode 100644
index 69110d151f..0000000000
--- a/cpp/src/tests/consume.cpp
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- *
- * 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.
- *
- */
-
-#include <algorithm>
-#include <iostream>
-#include <memory>
-#include <sstream>
-#include <vector>
-
-#include "TestOptions.h"
-#include "qpid/client/Connection.h"
-#include "qpid/client/Message.h"
-#include "qpid/client/Session.h"
-#include "qpid/client/SubscriptionManager.h"
-
-using namespace qpid;
-using namespace qpid::client;
-using namespace qpid::sys;
-using namespace std;
-
-namespace qpid {
-namespace tests {
-
-typedef vector<string> StringSet;
-
-struct Args : public qpid::TestOptions {
- uint count;
- uint ack;
- string queue;
- bool declare;
- bool summary;
- bool print;
- bool durable;
-
- Args() : count(1000), ack(0), queue("publish-consume"),
- declare(false), summary(false), print(false)
- {
- addOptions()
- ("count", optValue(count, "N"), "number of messages to publish")
- ("ack-frequency", optValue(ack, "N"), "ack every N messages (0 means use no-ack mode)")
- ("queue", optValue(queue, "<queue name>"), "queue to consume from")
- ("declare", optValue(declare), "declare the queue")
- ("durable", optValue(durable), "declare the queue durable, use with declare")
- ("print-data", optValue(print), "Print the recieved data at info level")
- ("s,summary", optValue(summary), "Print undecorated rate.");
- }
-};
-
-Args opts;
-
-struct Client
-{
- Connection connection;
- Session session;
-
- Client()
- {
- opts.open(connection);
- session = connection.newSession();
- }
-
- void consume()
- {
- if (opts.declare)
- session.queueDeclare(arg::queue=opts.queue, arg::durable=opts.durable);
- SubscriptionManager subs(session);
- LocalQueue lq;
- SubscriptionSettings settings;
- settings.acceptMode = opts.ack > 0 ? ACCEPT_MODE_EXPLICIT : ACCEPT_MODE_NONE;
- settings.flowControl = FlowControl(opts.count, SubscriptionManager::UNLIMITED,false);
- Subscription sub = subs.subscribe(lq, opts.queue, settings);
- Message msg;
- AbsTime begin=now();
- for (size_t i = 0; i < opts.count; ++i) {
- msg=lq.pop();
- QPID_LOG(info, "Received: " << msg.getMessageProperties().getCorrelationId());
- if (opts.print) QPID_LOG(info, "Data: " << msg.getData());
- }
- if (opts.ack != 0)
- sub.accept(sub.getUnaccepted()); // Cumulative ack for final batch.
- AbsTime end=now();
- double secs(double(Duration(begin,end))/TIME_SEC);
- if (opts.summary) cout << opts.count/secs << endl;
- else cout << "Time: " << secs << "s Rate: " << opts.count/secs << endl;
- }
-
- ~Client()
- {
- try{
- session.close();
- connection.close();
- } catch(const exception& e) {
- cout << e.what() << endl;
- }
- }
-};
-
-}} // namespace qpid::tests
-
-using namespace qpid::tests;
-
-int main(int argc, char** argv)
-{
- try {
- opts.parse(argc, argv);
- Client client;
- client.consume();
- return 0;
- } catch(const exception& e) {
- cout << e.what() << endl;
- }
- return 1;
-}
diff --git a/cpp/src/tests/datagen.cpp b/cpp/src/tests/datagen.cpp
deleted file mode 100644
index acbc07d63c..0000000000
--- a/cpp/src/tests/datagen.cpp
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- *
- * 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.
- *
- */
-
-#include <exception>
-#include <iostream>
-#include <stdlib.h>
-#include <time.h>
-#include "qpid/Options.h"
-
-namespace qpid {
-namespace tests {
-
-struct Args : public qpid::Options
-{
- uint count;
- uint minSize;
- uint maxSize;
- uint minChar;
- uint maxChar;
- bool help;
-
- Args() : qpid::Options("Random data generator"),
- count(1), minSize(8), maxSize(4096),
- minChar(32), maxChar(126),//safely printable ascii chars
- help(false)
- {
- addOptions()
- ("count", qpid::optValue(count, "N"), "number of data strings to generate")
- ("min-size", qpid::optValue(minSize, "N"), "minimum size of data string")
- ("max-size", qpid::optValue(maxSize, "N"), "maximum size of data string")
- ("min-char", qpid::optValue(minChar, "N"), "minimum char value used in data string")
- ("max-char", qpid::optValue(maxChar, "N"), "maximum char value used in data string")
- ("help", qpid::optValue(help), "print this usage statement");
- }
-
- bool parse(int argc, char** argv) {
- try {
- qpid::Options::parse(argc, argv);
- if (maxSize < minSize) throw qpid::Options::Exception("max-size must be greater than min-size");
- if (maxChar < minChar) throw qpid::Options::Exception("max-char must be greater than min-char");
-
- if (help) {
- std::cerr << *this << std::endl << std::endl;
- } else {
- return true;
- }
- } catch (const std::exception& e) {
- std::cerr << *this << std::endl << std::endl << e.what() << std::endl;
- }
- return false;
- }
-
-};
-
-uint random(uint min, uint max)
-{
- return (rand() % (max-min+1)) + min;
-}
-
-std::string generateData(uint size, uint min, uint max)
-{
- std::string data;
- for (uint i = 0; i < size; i++) {
- data += (char) random(min, max);
- }
- return data;
-}
-
-}} // namespace qpid::tests
-
-using namespace qpid::tests;
-
-int main(int argc, char** argv)
-{
- Args opts;
- if (opts.parse(argc, argv)) {
- srand(time(0));
- for (uint i = 0; i < opts.count; i++) {
- std::cout << generateData(random(opts.minSize, opts.maxSize), opts.minChar, opts.maxChar) << std::endl;
- }
- return 0;
- } else {
- return 1;
- }
-}
diff --git a/cpp/src/tests/declare_queues.cpp b/cpp/src/tests/declare_queues.cpp
deleted file mode 100644
index bf85b9c04b..0000000000
--- a/cpp/src/tests/declare_queues.cpp
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- *
- * 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.
- *
- */
-
-#include <qpid/client/FailoverManager.h>
-#include <qpid/client/Session.h>
-#include <qpid/sys/Time.h>
-#include <qpid/Exception.h>
-
-#include <cstdlib>
-#include <iostream>
-#include <sstream>
-
-using namespace qpid::client;
-
-using namespace std;
-
-int
-main(int argc, char ** argv)
-{
- ConnectionSettings settings;
- if ( argc != 6 )
- {
- cerr << "Usage: declare_queues host port durability queue_name_prefix n_queues\n";
- return 1;
- }
-
- settings.host = argv[1];
- settings.port = atoi(argv[2]);
- int durability = atoi(argv[3]);
- char const * queue_name_prefix = argv[4];
- int n_queues = atoi(argv[5]);
-
- FailoverManager connection(settings);
-
- int max_fail = 13;
- for ( int i = 0; i < n_queues; ++ i ) {
- stringstream queue_name;
- queue_name << queue_name_prefix << '_' << i;
-
- bool queue_created = false;
- int failure_count;
-
- // Any non-transport failure is Bad.
- try
- {
- while ( ! queue_created ) {
- Session session = connection.connect().newSession();
- // TransportFailures aren't too bad -- they might happen because
- // we are doing a cluster failover test. But if we get too many,
- // we will still bug out.
- failure_count = 0;
- try {
- if ( durability )
- session.queueDeclare(arg::queue=queue_name.str(), arg::durable=true);
- else
- session.queueDeclare(arg::queue=queue_name.str());
- queue_created = true;
- cout << "declare_queues: Created queue " << queue_name.str() << endl;
- }
- catch ( const qpid::TransportFailure& ) {
- if ( ++ failure_count >= max_fail ) {
- cerr << "declare_queues failed: too many transport errors.\n";
- cerr << " host: " << settings.host
- << " port: " << settings.port << endl;
- return 1;
- }
- qpid::sys::sleep ( 1 );
- }
- }
- }
- catch ( const exception & error) {
- cerr << "declare_queues failed:" << error.what() << endl;
- cerr << " host: " << settings.host
- << " port: " << settings.port << endl;
- return 1;
- }
- }
-}
-
-
-
-
-
diff --git a/cpp/src/tests/dlclose_noop.c b/cpp/src/tests/dlclose_noop.c
deleted file mode 100644
index b78cf486d8..0000000000
--- a/cpp/src/tests/dlclose_noop.c
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- *
- * 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.
- *
- */
-
-/*
- * Loaded via LD_PRELOAD this will turn dlclose into a no-op.
- *
- * Allows valgrind to generate useful reports from programs that
- * dynamically unload libraries before exit, such as CppUnit's
- * DllPlugInTester.
- *
- */
-
-#include <stdio.h>
-void* dlclose(void* handle) { return 0; }
-
diff --git a/cpp/src/tests/dynamic_log_level_test b/cpp/src/tests/dynamic_log_level_test
deleted file mode 100755
index 990e56b1b1..0000000000
--- a/cpp/src/tests/dynamic_log_level_test
+++ /dev/null
@@ -1,57 +0,0 @@
-#!/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.
-#
-
-# Run a simple test to verify dynamic log level changes
-source ./test_env.sh
-test -d $PYTHON_DIR || { echo "Skipping python tests, no python dir."; exit 0; }
-
-LOG_FILE=log_test.log
-trap cleanup EXIT
-
-cleanup() {
- test -n "$PORT" && $QPIDD_EXEC --no-module-dir --quit --port $PORT
-}
-
-error() {
- echo $*;
- exit 1;
-}
-
-rm -rf $LOG_FILE
-PORT=$($QPIDD_EXEC --auth=no --no-module-dir --daemon --port=0 --log-to-file $LOG_FILE) || error "Could not start broker"
-
-echo Broker for log level test started on $PORT, pid is $($QPIDD_EXEC --no-module-dir --check --port $PORT)
-
-$srcdir/qpid-ctrl -b localhost:$PORT setLogLevel level='notice+' > /dev/null
-$srcdir/qpid-ctrl -b localhost:$PORT echo sequence=1 body=HIDDEN > /dev/null
-$srcdir/qpid-ctrl -b localhost:$PORT setLogLevel level='debug+:Broker' > /dev/null
-$srcdir/qpid-ctrl -b localhost:$PORT echo sequence=2 body=VISIBLE > /dev/null
-$srcdir/qpid-ctrl -b localhost:$PORT setLogLevel level='notice+' > /dev/null
-
-#check log includes debug statement for last echo, but not the first
-if [[ $(grep echo $LOG_FILE | wc -l) -ne 1 ]]; then
- cat $LOG_FILE
- error "Log contents not as expected"
-else
- rm -rf $LOG_FILE
- echo OK
-fi
-
diff --git a/cpp/src/tests/echotest.cpp b/cpp/src/tests/echotest.cpp
deleted file mode 100644
index 5114ab883d..0000000000
--- a/cpp/src/tests/echotest.cpp
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- *
- * 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.
- *
- */
-
-#include <qpid/client/Connection.h>
-#include <qpid/client/SubscriptionManager.h>
-#include <qpid/client/AsyncSession.h>
-#include <qpid/client/Message.h>
-#include <qpid/client/MessageListener.h>
-#include <qpid/sys/Time.h>
-#include <qpid/Options.h>
-
-#include <iostream>
-
-using namespace qpid::client;
-using namespace qpid::framing;
-using namespace qpid::sys;
-using namespace std;
-
-namespace qpid {
-namespace tests {
-
-struct Args : public qpid::Options,
- public qpid::client::ConnectionSettings
-{
- bool help;
- uint count;
- uint size;
- bool summary;
-
- Args() : qpid::Options("Simple latency test optins"), help(false), count(20), size(0), summary()
- {
- using namespace qpid;
- addOptions()
- ("help", optValue(help), "Print this usage statement")
- ("count", optValue(count, "N"), "Number of messages to send")
- ("size", optValue(count, "N"), "Size of messages")
- ("broker,b", optValue(host, "HOST"), "Broker host to connect to")
- ("port,p", optValue(port, "PORT"), "Broker port to connect to")
- ("username", optValue(username, "USER"), "user name for broker log in.")
- ("password", optValue(password, "PASSWORD"), "password for broker log in.")
- ("mechanism", optValue(mechanism, "MECH"), "SASL mechanism to use when authenticating.")
- ("tcp-nodelay", optValue(tcpNoDelay), "Turn on tcp-nodelay")
- ("s,summary", optValue(summary), "Print only average latency.");
- }
-};
-
-uint64_t current_time()
-{
- Duration t(EPOCH, now());
- return t;
-}
-
-class Listener : public MessageListener
-{
- private:
- Session session;
- SubscriptionManager subscriptions;
- uint counter;
- const uint limit;
- std::string queue;
- Message request;
- double total, min, max;
- bool summary;
-
- public:
- Listener(Session& session, uint limit, bool summary);
- void start(uint size);
- void received(Message& message);
-};
-
-Listener::Listener(Session& s, uint l, bool summary_) :
- session(s), subscriptions(s), counter(0), limit(l),
- queue(session.getId().getName()), total(),
- min(std::numeric_limits<double>::max()), max(), summary(summary_)
-{}
-
-void Listener::start(uint size)
-{
- session.queueDeclare(arg::queue=queue, arg::exclusive=true, arg::autoDelete=true);
- request.getDeliveryProperties().setRoutingKey(queue);
- subscriptions.subscribe(*this, queue, SubscriptionSettings(FlowControl::unlimited(), ACCEPT_MODE_NONE));
-
- request.getDeliveryProperties().setTimestamp(current_time());
- if (size) request.setData(std::string(size, 'X'));
- async(session).messageTransfer(arg::content=request);
- subscriptions.run();
-}
-
-void Listener::received(Message& response)
-{
- //extract timestamp and compute latency:
- uint64_t sentAt = response.getDeliveryProperties().getTimestamp();
- uint64_t receivedAt = current_time();
-
- double latency = ((double) (receivedAt - sentAt)) / TIME_MSEC;
- if (!summary) cout << "Latency: " << latency << "ms" << endl;
- min = std::min(latency, min);
- max = std::max(latency, max);
- total += latency;
-
- if (++counter < limit) {
- request.getDeliveryProperties().setTimestamp(current_time());
- async(session).messageTransfer(arg::content=request);
- } else {
- subscriptions.cancel(queue);
- if (summary) cout << min << "\t" << max << "\t" << total/limit << endl;
- else cout << "min: " << min << " max: " << max << " average: " << total/limit << endl;
- }
-}
-
-}} // namespace qpid::tests
-
-using namespace qpid::tests;
-
-int main(int argc, char** argv)
-{
- Args opts;
- opts.parse(argc, argv);
-
- if (opts.help) {
- std::cout << opts << std::endl;
- return 0;
- }
-
- Connection connection;
- try {
- connection.open(opts);
- Session session = connection.newSession();
- Listener listener(session, opts.count, opts.summary);
- listener.start(opts.size);
-
- connection.close();
- return 0;
- } catch(const std::exception& error) {
- std::cout << error.what() << std::endl;
- }
- return 1;
-}
-
-
diff --git a/cpp/src/tests/exception_test.cpp b/cpp/src/tests/exception_test.cpp
deleted file mode 100644
index 3536ffddbe..0000000000
--- a/cpp/src/tests/exception_test.cpp
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- *
- * 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.
- *
- */
-
-#include "unit_test.h"
-#include "test_tools.h"
-#include "BrokerFixture.h"
-#include "qpid/client/SubscriptionManager.h"
-#include "qpid/client/MessageListener.h"
-#include "qpid/sys/Runnable.h"
-#include "qpid/sys/Thread.h"
-#include "qpid/framing/reply_exceptions.h"
-
-namespace qpid {
-namespace tests {
-
-QPID_AUTO_TEST_SUITE(exception_test)
-
-// FIXME aconway 2008-06-12: need to update our exception handling to
-// 0-10 handling and extend this test to provoke all the exceptional
-// conditions we know of and verify the correct exception is thrown.
-
-using namespace std;
-using namespace qpid;
-using namespace sys;
-using namespace client;
-using namespace framing;
-
-using qpid::broker::Broker;
-using boost::bind;
-using boost::function;
-
-template <class Ex>
-struct Catcher : public Runnable {
- function<void ()> f;
- bool caught;
- Thread thread;
-
- Catcher(function<void ()> f_) : f(f_), caught(false), thread(this) {}
- ~Catcher() { join(); }
-
- void run() {
- try {
- ScopedSuppressLogging sl; // Suppress messages for expected errors.
- f();
- }
- catch(const Ex& e) {
- caught=true;
- BOOST_MESSAGE(string("Caught expected exception: ")+e.what()+"["+typeid(e).name()+"]");
- }
- catch(const std::exception& e) {
- BOOST_ERROR(string("Bad exception: ")+e.what()+"["+typeid(e).name()+"] expected: "+typeid(Ex).name());
- }
- catch(...) {
- BOOST_ERROR(string("Bad exception: unknown"));
- }
- }
-
- bool join() {
- if (thread) {
- thread.join();
- thread=Thread();
- }
- return caught;
- }
-};
-
-QPID_AUTO_TEST_CASE(TestSessionBusy) {
- SessionFixture f;
- try {
- ScopedSuppressLogging sl; // Suppress messages for expected errors.
- f.connection.newSession(f.session.getId().getName());
- BOOST_FAIL("Expected SessionBusyException for " << f.session.getId().getName());
- } catch (const SessionBusyException&) {} // FIXME aconway 2008-09-22: client is not throwing correct exception.
-}
-
-QPID_AUTO_TEST_CASE(DisconnectedPop) {
- ProxySessionFixture fix;
- ProxyConnection c(fix.broker->getPort(Broker::TCP_TRANSPORT));
- fix.session.queueDeclare(arg::queue="q");
- fix.subs.subscribe(fix.lq, "q");
- Catcher<TransportFailure> pop(bind(&LocalQueue::pop, &fix.lq, sys::TIME_SEC));
- fix.connection.proxy.close();
- BOOST_CHECK(pop.join());
-}
-
-QPID_AUTO_TEST_CASE(DisconnectedListen) {
- ProxySessionFixture fix;
- struct NullListener : public MessageListener {
- void received(Message&) { BOOST_FAIL("Unexpected message"); }
- } l;
- ProxyConnection c(fix.broker->getPort(Broker::TCP_TRANSPORT));
- fix.session.queueDeclare(arg::queue="q");
- fix.subs.subscribe(l, "q");
-
- Catcher<TransportFailure> runner(bind(&SubscriptionManager::run, boost::ref(fix.subs)));
- fix.connection.proxy.close();
- runner.join();
- BOOST_CHECK_THROW(fix.session.queueDeclare(arg::queue="x"), TransportFailure);
-}
-
-QPID_AUTO_TEST_CASE(NoSuchQueueTest) {
- ProxySessionFixture fix;
- ScopedSuppressLogging sl; // Suppress messages for expected errors.
- BOOST_CHECK_THROW(fix.subs.subscribe(fix.lq, "no such queue"), NotFoundException);
-}
-
-QPID_AUTO_TEST_SUITE_END()
-
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/failover_soak.cpp b/cpp/src/tests/failover_soak.cpp
deleted file mode 100644
index c2ac36a757..0000000000
--- a/cpp/src/tests/failover_soak.cpp
+++ /dev/null
@@ -1,827 +0,0 @@
-/*
- *
- * 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.
- *
- */
-
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <sys/wait.h>
-#include <sys/time.h>
-#include <string.h>
-#include <sys/types.h>
-#include <signal.h>
-
-#include <string>
-#include <iostream>
-#include <sstream>
-#include <vector>
-
-#include <boost/assign.hpp>
-
-#include "qpid/framing/Uuid.h"
-
-#include <ForkedBroker.h>
-#include <qpid/client/Connection.h>
-
-
-
-
-
-using namespace std;
-using boost::assign::list_of;
-using namespace qpid::framing;
-using namespace qpid::client;
-
-
-namespace qpid {
-namespace tests {
-
-vector<pid_t> pids;
-
-typedef vector<ForkedBroker *> brokerVector;
-
-typedef enum
-{
- NO_STATUS,
- RUNNING,
- COMPLETED
-}
-childStatus;
-
-
-typedef enum
-{
- NO_TYPE,
- DECLARING_CLIENT,
- SENDING_CLIENT,
- RECEIVING_CLIENT
-}
-childType;
-
-
-ostream& operator<< ( ostream& os, const childType& ct ) {
- switch ( ct ) {
- case DECLARING_CLIENT: os << "Declaring Client"; break;
- case SENDING_CLIENT: os << "Sending Client"; break;
- case RECEIVING_CLIENT: os << "Receiving Client"; break;
- default: os << "No Client"; break;
- }
-
- return os;
-}
-
-
-
-
-struct child
-{
- child ( string & name, pid_t pid, childType type )
- : name(name), pid(pid), retval(-999), status(RUNNING), type(type)
- {
- gettimeofday ( & startTime, 0 );
- }
-
-
- void
- done ( int _retval )
- {
- retval = _retval;
- status = COMPLETED;
- gettimeofday ( & stopTime, 0 );
- }
-
-
- void
- setType ( childType t )
- {
- type = t;
- }
-
-
- string name;
- pid_t pid;
- int retval;
- childStatus status;
- childType type;
- struct timeval startTime,
- stopTime;
-};
-
-
-
-
-struct children : public vector<child *>
-{
-
- void
- add ( string & name, pid_t pid, childType type )
- {
- push_back ( new child ( name, pid, type ) );
- }
-
-
- child *
- get ( pid_t pid )
- {
- vector<child *>::iterator i;
- for ( i = begin(); i != end(); ++ i )
- if ( pid == (*i)->pid )
- return *i;
-
- return 0;
- }
-
-
- void
- exited ( pid_t pid, int retval )
- {
- child * kid = get ( pid );
- if(! kid)
- {
- if ( verbosity > 1 )
- {
- cerr << "children::exited warning: Can't find child with pid "
- << pid
- << endl;
- }
- return;
- }
-
- kid->done ( retval );
- }
-
-
- int
- unfinished ( )
- {
- int count = 0;
-
- vector<child *>::iterator i;
- for ( i = begin(); i != end(); ++ i )
- if ( COMPLETED != (*i)->status )
- ++ count;
-
- return count;
- }
-
-
- int
- checkChildren ( )
- {
- for ( unsigned int i = 0; i < pids.size(); ++ i )
- {
- int pid = pids[i];
- int returned_pid;
- int status;
-
- child * kid = get ( pid );
-
- if ( kid->status != COMPLETED )
- {
- returned_pid = waitpid ( pid, &status, WNOHANG );
-
- if ( returned_pid == pid )
- {
- int exit_status = WEXITSTATUS(status);
- exited ( pid, exit_status );
- if ( exit_status ) // this is a child error.
- return exit_status;
- }
- }
- }
-
- return 0;
- }
-
-
- void
- killEverybody ( )
- {
- vector<child *>::iterator i;
- for ( i = begin(); i != end(); ++ i )
- kill ( (*i)->pid, 9 );
- }
-
-
-
- void
- print ( )
- {
- cout << "--- status of all children --------------\n";
- vector<child *>::iterator i;
- for ( i = begin(); i != end(); ++ i )
- cout << "child: " << (*i)->name
- << " status: " << (*i)->status
- << endl;
- cout << "\n\n\n\n";
- }
-
- int verbosity;
-};
-
-
-children allMyChildren;
-
-
-void
-childExit ( int )
-{
- int childReturnCode;
- pid_t pid = waitpid ( 0, & childReturnCode, WNOHANG);
-
- if ( pid > 0 )
- allMyChildren.exited ( pid, childReturnCode );
-}
-
-
-
-int
-mrand ( int maxDesiredVal ) {
- double zeroToOne = (double) rand() / (double) RAND_MAX;
- return (int) (zeroToOne * (double) maxDesiredVal);
-}
-
-
-
-int
-mrand ( int minDesiredVal, int maxDesiredVal ) {
- int interval = maxDesiredVal - minDesiredVal;
- return minDesiredVal + mrand ( interval );
-}
-
-
-
-void
-makeClusterName ( string & s ) {
- stringstream ss;
- ss << "soakTestCluster_" << Uuid(true).str();
- s = ss.str();
-}
-
-
-
-
-
-void
-printBrokers ( brokerVector & brokers )
-{
- cout << "Broker List ------------ size: " << brokers.size() << "\n";
- for ( brokerVector::iterator i = brokers.begin(); i != brokers.end(); ++ i) {
- cout << "pid: "
- << (*i)->getPID()
- << " port: "
- << (*i)->getPort()
- << endl;
- }
- cout << "end Broker List ------------\n";
-}
-
-
-
-
-ForkedBroker * newbie = 0;
-int newbie_port = 0;
-
-
-
-bool
-wait_for_newbie ( )
-{
- if ( ! newbie )
- return true;
-
- try
- {
- Connection connection;
- connection.open ( "127.0.0.1", newbie_port );
- connection.close();
- newbie = 0; // He's no newbie anymore!
- return true;
- }
- catch ( const std::exception& error )
- {
- std::cerr << "wait_for_newbie error: "
- << error.what()
- << endl;
- return false;
- }
-}
-
-bool endsWith(const char* str, const char* suffix) {
- return (strlen(suffix) < strlen(str) && 0 == strcmp(str+strlen(str)-strlen(suffix), suffix));
-}
-
-
-void
-startNewBroker ( brokerVector & brokers,
- char const * moduleOrDir,
- string const clusterName,
- int verbosity,
- int durable )
-{
- static int brokerId = 0;
- stringstream path, prefix;
- prefix << "soak-" << brokerId;
- std::vector<std::string> argv = list_of<string>
- ("qpidd")
- ("--cluster-name")(clusterName)
- ("--auth=no")
- ("--mgmt-enable=no")
- ("--log-prefix")(prefix.str())
- ("--log-to-file")(prefix.str()+".log")
- ("--log-enable=info+")
- ("--log-enable=debug+:cluster")
- ("TMP_DATA_DIR");
-
- if (endsWith(moduleOrDir, "cluster.so")) {
- // Module path specified, load only that module.
- argv.push_back(string("--load-module=")+moduleOrDir);
- argv.push_back("--no-module-dir");
- if ( durable ) {
- std::cerr << "failover_soak warning: durable arg hass no effect. Use \"dir\" option of \"moduleOrDir\".\n";
- }
- }
- else {
- // Module directory specified, load all modules in dir.
- argv.push_back(string("--module-dir=")+moduleOrDir);
- }
-
- newbie = new ForkedBroker (argv);
- newbie_port = newbie->getPort();
- ForkedBroker * broker = newbie;
-
- if ( verbosity > 0 )
- std::cerr << "new broker created: pid == "
- << broker->getPID()
- << " log-prefix == "
- << "soak-" << brokerId
- << endl;
- brokers.push_back ( broker );
-
- ++ brokerId;
-}
-
-
-
-
-
-bool
-killFrontBroker ( brokerVector & brokers, int verbosity )
-{
- cerr << "killFrontBroker: waiting for newbie sync...\n";
- if ( ! wait_for_newbie() )
- return false;
- cerr << "killFrontBroker: newbie synced.\n";
-
- if ( verbosity > 0 )
- cout << "killFrontBroker pid: " << brokers[0]->getPID() << " on port " << brokers[0]->getPort() << endl;
- try { brokers[0]->kill(9); }
- catch ( const exception& error ) {
- if ( verbosity > 0 )
- {
- cout << "error killing broker: "
- << error.what()
- << endl;
- }
-
- return false;
- }
- delete brokers[0];
- brokers.erase ( brokers.begin() );
- return true;
-}
-
-
-
-
-
-/*
- * The optional delay is to avoid killing newbie brokers that have just
- * been added and are still in the process of updating. This causes
- * spurious, test-generated errors that scare everybody.
- */
-void
-killAllBrokers ( brokerVector & brokers, int delay )
-{
- if ( delay > 0 )
- {
- std::cerr << "Killing all brokers after delay of " << delay << endl;
- sleep ( delay );
- }
-
- for ( uint i = 0; i < brokers.size(); ++ i )
- try { brokers[i]->kill(9); }
- catch ( const exception& error )
- {
- std::cerr << "killAllBrokers Warning: exception during kill on broker "
- << i
- << " "
- << error.what()
- << endl;
- }
-}
-
-
-
-
-
-pid_t
-runDeclareQueuesClient ( brokerVector brokers,
- char const * host,
- char const * path,
- int verbosity,
- int durable,
- char const * queue_prefix,
- int n_queues
- )
-{
- string name("declareQueues");
- int port = brokers[0]->getPort ( );
-
- if ( verbosity > 1 )
- cout << "startDeclareQueuesClient: host: "
- << host
- << " port: "
- << port
- << endl;
- stringstream portSs;
- portSs << port;
-
- vector<const char*> argv;
- argv.push_back ( "declareQueues" );
- argv.push_back ( host );
- string portStr = portSs.str();
- argv.push_back ( portStr.c_str() );
- if ( durable )
- argv.push_back ( "1" );
- else
- argv.push_back ( "0" );
-
- argv.push_back ( queue_prefix );
-
- char n_queues_str[20];
- sprintf ( n_queues_str, "%d", n_queues );
- argv.push_back ( n_queues_str );
-
- argv.push_back ( 0 );
- pid_t pid = fork();
-
- if ( ! pid ) {
- execv ( path, const_cast<char * const *>(&argv[0]) );
- perror ( "error executing declareQueues: " );
- return 0;
- }
-
- allMyChildren.add ( name, pid, DECLARING_CLIENT );
- return pid;
-}
-
-
-
-
-
-pid_t
-startReceivingClient ( brokerVector brokers,
- char const * host,
- char const * receiverPath,
- char const * reportFrequency,
- int verbosity,
- char const * queue_name
- )
-{
- string name("receiver");
- int port = brokers[0]->getPort ( );
-
- if ( verbosity > 1 )
- cout << "startReceivingClient: port " << port << endl;
-
- // verbosity has to be > 1 to let clients talk.
- int client_verbosity = (verbosity > 1 ) ? 1 : 0;
-
- char portStr[100];
- char verbosityStr[100];
- sprintf(portStr, "%d", port);
- sprintf(verbosityStr, "%d", client_verbosity);
-
-
- vector<const char*> argv;
- argv.push_back ( "resumingReceiver" );
- argv.push_back ( host );
- argv.push_back ( portStr );
- argv.push_back ( reportFrequency );
- argv.push_back ( verbosityStr );
- argv.push_back ( queue_name );
- argv.push_back ( 0 );
-
- pid_t pid = fork();
- pids.push_back ( pid );
-
- if ( ! pid ) {
- execv ( receiverPath, const_cast<char * const *>(&argv[0]) );
- perror ( "error executing receiver: " );
- return 0;
- }
-
- allMyChildren.add ( name, pid, RECEIVING_CLIENT );
- return pid;
-}
-
-
-
-
-
-pid_t
-startSendingClient ( brokerVector brokers,
- char const * host,
- char const * senderPath,
- char const * nMessages,
- char const * reportFrequency,
- int verbosity,
- int durability,
- char const * queue_name
- )
-{
- string name("sender");
- int port = brokers[0]->getPort ( );
-
- if ( verbosity > 1)
- cout << "startSenderClient: port " << port << endl;
- char portStr[100];
- char verbosityStr[100];
- //
- // verbosity has to be > 1 to let clients talk.
- int client_verbosity = (verbosity > 1 ) ? 1 : 0;
-
- sprintf ( portStr, "%d", port);
- sprintf ( verbosityStr, "%d", client_verbosity);
-
- vector<const char*> argv;
- argv.push_back ( "replayingSender" );
- argv.push_back ( host );
- argv.push_back ( portStr );
- argv.push_back ( nMessages );
- argv.push_back ( reportFrequency );
- argv.push_back ( verbosityStr );
- if ( durability )
- argv.push_back ( "1" );
- else
- argv.push_back ( "0" );
- argv.push_back ( queue_name );
- argv.push_back ( 0 );
-
- pid_t pid = fork();
- pids.push_back ( pid );
-
- if ( ! pid ) {
- execv ( senderPath, const_cast<char * const *>(&argv[0]) );
- perror ( "error executing sender: " );
- return 0;
- }
-
- allMyChildren.add ( name, pid, SENDING_CLIENT );
- return pid;
-}
-
-
-
-#define HUNKY_DORY 0
-#define BAD_ARGS 1
-#define CANT_FORK_DQ 2
-#define CANT_FORK_RECEIVER 3
-#define CANT_FORK_SENDER 4
-#define DQ_FAILED 5
-#define ERROR_ON_CHILD 6
-#define HANGING 7
-#define ERROR_KILLING_BROKER 8
-
-}} // namespace qpid::tests
-
-using namespace qpid::tests;
-
-// If you want durability, use the "dir" option of "moduleOrDir" .
-int
-main ( int argc, char const ** argv )
-{
- int brokerKills = 0;
- if ( argc != 11 ) {
- cerr << "Usage: "
- << argv[0]
- << "moduleOrDir declareQueuesPath senderPath receiverPath nMessages reportFrequency verbosity durable n_queues n_brokers"
- << endl;
- cerr << "\tverbosity is an integer, durable is 0 or 1\n";
- return BAD_ARGS;
- }
- signal ( SIGCHLD, childExit );
-
- int i = 1;
- char const * moduleOrDir = argv[i++];
- char const * declareQueuesPath = argv[i++];
- char const * senderPath = argv[i++];
- char const * receiverPath = argv[i++];
- char const * nMessages = argv[i++];
- char const * reportFrequency = argv[i++];
- int verbosity = atoi(argv[i++]);
- int durable = atoi(argv[i++]);
- int n_queues = atoi(argv[i++]);
- int n_brokers = atoi(argv[i++]);
-
- char const * host = "127.0.0.1";
-
- allMyChildren.verbosity = verbosity;
-
- string clusterName;
-
- srand ( getpid() );
-
- makeClusterName ( clusterName );
-
- brokerVector brokers;
-
- if ( verbosity > 1 )
- cout << "Starting initial cluster...\n";
-
- for ( int i = 0; i < n_brokers; ++ i ) {
- startNewBroker ( brokers,
- moduleOrDir,
- clusterName,
- verbosity,
- durable );
- }
-
-
- if ( verbosity > 0 )
- printBrokers ( brokers );
-
- // Get prefix for each queue name.
- stringstream queue_prefix;
- queue_prefix << "failover_soak_" << getpid();
- string queue_prefix_str(queue_prefix.str());
-
- // Run the declareQueues child.
- int childStatus;
- pid_t dqClientPid =
- runDeclareQueuesClient ( brokers,
- host,
- declareQueuesPath,
- verbosity,
- durable,
- queue_prefix_str.c_str(),
- n_queues
- );
- if ( -1 == dqClientPid ) {
- cerr << "END_OF_TEST ERROR_START_DECLARE_1\n";
- return CANT_FORK_DQ;
- }
-
- // Don't continue until declareQueues is finished.
- pid_t retval = waitpid ( dqClientPid, & childStatus, 0);
- if ( retval != dqClientPid) {
- cerr << "END_OF_TEST ERROR_START_DECLARE_2\n";
- return DQ_FAILED;
- }
- allMyChildren.exited ( dqClientPid, childStatus );
-
-
- /*
- Start one receiving and one sending client for each queue.
- */
- for ( int i = 0; i < n_queues; ++ i ) {
-
- stringstream queue_name;
- queue_name << queue_prefix.str() << '_' << i;
- string queue_name_str(queue_name.str());
-
- // Receiving client ---------------------------
- pid_t receivingClientPid =
- startReceivingClient ( brokers,
- host,
- receiverPath,
- reportFrequency,
- verbosity,
- queue_name_str.c_str() );
- if ( -1 == receivingClientPid ) {
- cerr << "END_OF_TEST ERROR_START_RECEIVER\n";
- return CANT_FORK_RECEIVER;
- }
-
-
- // Sending client ---------------------------
- pid_t sendingClientPid =
- startSendingClient ( brokers,
- host,
- senderPath,
- nMessages,
- reportFrequency,
- verbosity,
- durable,
- queue_name_str.c_str() );
- if ( -1 == sendingClientPid ) {
- cerr << "END_OF_TEST ERROR_START_SENDER\n";
- return CANT_FORK_SENDER;
- }
- }
-
-
- int minSleep = 2,
- maxSleep = 6;
-
- int totalBrokers = n_brokers;
-
- int loop = 0;
-
- while ( 1 )
- {
- ++ loop;
-
- /*
- if ( verbosity > 1 )
- std::cerr << "------- loop " << loop << " --------\n";
-
- if ( verbosity > 0 )
- cout << totalBrokers << " brokers have been added to the cluster.\n\n\n";
- */
-
- // Sleep for a while. -------------------------
- int sleepyTime = mrand ( minSleep, maxSleep );
- sleep ( sleepyTime );
-
- int bullet = mrand ( 100 );
- if ( bullet >= 95 )
- {
- fprintf ( stderr, "Killing oldest broker...\n" );
-
- // Kill the oldest broker. --------------------------
- if ( ! killFrontBroker ( brokers, verbosity ) )
- {
- allMyChildren.killEverybody();
- killAllBrokers ( brokers, 5 );
- std::cerr << "END_OF_TEST ERROR_BROKER\n";
- return ERROR_KILLING_BROKER;
- }
- ++ brokerKills;
-
- // Start a new broker. --------------------------
- if ( verbosity > 0 )
- cout << "Starting new broker.\n\n";
-
- startNewBroker ( brokers,
- moduleOrDir,
- clusterName,
- verbosity,
- durable );
- ++ totalBrokers;
- printBrokers ( brokers );
- cerr << brokerKills << " brokers have been killed.\n\n\n";
- }
-
- int retval = allMyChildren.checkChildren();
- if ( retval )
- {
- std::cerr << "END_OF_TEST ERROR_CLIENT\n";
- allMyChildren.killEverybody();
- killAllBrokers ( brokers, 5 );
- return ERROR_ON_CHILD;
- }
-
- // If all children have exited, quit.
- int unfinished = allMyChildren.unfinished();
- if ( unfinished == 0 ) {
- killAllBrokers ( brokers, 5 );
-
- if ( verbosity > 1 )
- cout << "failoverSoak: all children have exited.\n";
-
- std::cerr << "END_OF_TEST SUCCESSFUL\n";
- return HUNKY_DORY;
- }
-
- }
-
- allMyChildren.killEverybody();
- killAllBrokers ( brokers, 5 );
-
- std::cerr << "END_OF_TEST SUCCESSFUL\n";
-
- return HUNKY_DORY;
-}
-
-
-
diff --git a/cpp/src/tests/fanout_perftest b/cpp/src/tests/fanout_perftest
deleted file mode 100755
index d8a7661f49..0000000000
--- a/cpp/src/tests/fanout_perftest
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/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.
-#
-
-exec `dirname $0`/run_perftest 10000 --mode fanout --npubs 16 --nsubs 16 --size 64
diff --git a/cpp/src/tests/federated_cluster_test b/cpp/src/tests/federated_cluster_test
deleted file mode 100755
index 70bec5e703..0000000000
--- a/cpp/src/tests/federated_cluster_test
+++ /dev/null
@@ -1,152 +0,0 @@
-#!/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
diff --git a/cpp/src/tests/federated_cluster_test_with_node_failure b/cpp/src/tests/federated_cluster_test_with_node_failure
deleted file mode 100755
index f144a676de..0000000000
--- a/cpp/src/tests/federated_cluster_test_with_node_failure
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/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.
-#
-
-srcdir=`dirname $0`
-TEST_NODE_FAILURE=1 $srcdir/federated_cluster_test
diff --git a/cpp/src/tests/federated_topic_test b/cpp/src/tests/federated_topic_test
deleted file mode 100755
index b1063c7e8c..0000000000
--- a/cpp/src/tests/federated_topic_test
+++ /dev/null
@@ -1,129 +0,0 @@
-#!/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.
-#
-
-# Run the topic test on a federated setup
-
-# Clean up old log files
-rm -f subscriber_*.log
-
-# Defaults values
-SUBSCRIBERS=2
-MESSAGES=1000
-BATCHES=1
-VERBOSE=1
-
-while getopts "s:m:b:" opt ; do
- case $opt in
- s) SUBSCRIBERS=$OPTARG ;;
- m) MESSAGES=$OPTARG ;;
- b) BATCHES=$OPTARG ;;
- ?)
- echo "Usage: %0 [-s <subscribers>] [-m <messages.] [-b <batches>]"
- exit 1
- ;;
- esac
-done
-
-MY_DIR=$(dirname $(which $0))
-source ./test_env.sh
-
-trap stop_brokers EXIT
-
-start_broker() {
- ${MY_DIR}/../qpidd --daemon --port 0 --no-module-dir --no-data-dir --auth no > qpidd.port
-}
-
-start_brokers() {
- start_broker
- PORT_A=`cat qpidd.port`
- start_broker
- PORT_B=`cat qpidd.port`
- start_broker
- PORT_C=`cat qpidd.port`
-}
-
-stop_brokers() {
- for p in $PORT_A $PORT_B $PORT_C; do
- $QPIDD_EXEC --no-module-dir -q --port $p
- done
-}
-
-subscribe() {
- #which broker should we connect to?
- if (( $1 % 2 )); then
- MY_PORT=$PORT_C;
- else
- MY_PORT=$PORT_A;
- fi
-
- echo Subscriber $1 connecting on $MY_PORT
- LOG="subscriber_$1.log"
- ${MY_DIR}/topic_listener -p $MY_PORT > $LOG 2>&1 && rm -f $LOG
-}
-
-publish() {
- ${MY_DIR}/topic_publisher --messages $MESSAGES --batches $BATCHES --subscribers $SUBSCRIBERS -p $PORT_A
-}
-
-setup_routes() {
- BROKER_A="localhost:$PORT_A"
- BROKER_B="localhost:$PORT_B"
- BROKER_C="localhost:$PORT_C"
- if (($VERBOSE)); then
- echo "Establishing routes for topic..."
- fi
- $PYTHON_COMMANDS/qpid-route route add $BROKER_B $BROKER_A amq.topic topic_control B B
- $PYTHON_COMMANDS/qpid-route route add $BROKER_C $BROKER_B amq.topic topic_control C C
- if (($VERBOSE)); then
- echo "linked A->B->C"
- fi
- $PYTHON_COMMANDS/qpid-route route add $BROKER_B $BROKER_C amq.topic topic_control B B
- $PYTHON_COMMANDS/qpid-route route add $BROKER_A $BROKER_B amq.topic topic_control A A
- if (($VERBOSE)); then
- echo "linked C->B->A"
- echo "Establishing routes for response queue..."
- fi
-
- $PYTHON_COMMANDS/qpid-route route add $BROKER_B $BROKER_C amq.direct response B B
- $PYTHON_COMMANDS/qpid-route route add $BROKER_A $BROKER_B amq.direct response A A
- if (($VERBOSE)); then
- echo "linked C->B->A"
- for b in $BROKER_A $BROKER_B $BROKER_C; do
- echo "Routes for $b"
- $PYTHON_COMMANDS/qpid-route route list $b
- done
- fi
-}
-
-if test -d ${PYTHON_DIR} ; then
- start_brokers
- if (($VERBOSE)); then
- echo "Running federated topic test against brokers on ports $PORT_A $PORT_B $PORT_C"
- fi
-
- for ((i=$SUBSCRIBERS ; i--; )); do
- subscribe $i &
- done
-
- setup_routes
-
- publish || exit 1
-fi
diff --git a/cpp/src/tests/federation.py b/cpp/src/tests/federation.py
deleted file mode 100755
index 201b06a4a2..0000000000
--- a/cpp/src/tests/federation.py
+++ /dev/null
@@ -1,2091 +0,0 @@
-#!/usr/bin/env python
-#
-# 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.
-#
-
-import sys
-from qpid.testlib import TestBase010
-from qpid.datatypes import Message
-from qpid.queue import Empty
-from qpid.util import URL
-from time import sleep, time
-
-
-class _FedBroker(object):
- """
- A proxy object for a remote broker. Contains connection and management
- state.
- """
- def __init__(self, host, port,
- conn=None, session=None, qmf_broker=None):
- self.host = host
- self.port = port
- self.url = "%s:%d" % (host, port)
- self.client_conn = None
- self.client_session = None
- self.qmf_broker = None
- self.qmf_object = None
- if conn is not None:
- self.client_conn = conn
- if session is not None:
- self.client_session = session
- if qmf_broker is not None:
- self.qmf_broker = qmf_broker
-
-
-class FederationTests(TestBase010):
-
- def remote_host(self):
- return self.defines.get("remote-host", "localhost")
-
- def remote_port(self):
- return int(self.defines["remote-port"])
-
- def verify_cleanup(self):
- attempts = 0
- total = len(self.qmf.getObjects(_class="bridge")) + len(self.qmf.getObjects(_class="link"))
- while total > 0:
- attempts += 1
- if attempts >= 10:
- self.fail("Bridges and links didn't clean up")
- return
- sleep(1)
- total = len(self.qmf.getObjects(_class="bridge")) + len(self.qmf.getObjects(_class="link"))
-
- def _setup_brokers(self):
- ports = [self.remote_port()]
- extra = self.defines.get("extra-brokers")
- if extra:
- for p in extra.split():
- ports.append(int(p))
-
- # broker[0] has already been set up.
- self._brokers = [_FedBroker(self.broker.host,
- self.broker.port,
- self.conn,
- self.session,
- self.qmf_broker)]
- self._brokers[0].qmf_object = self.qmf.getObjects(_class="broker")[0]
-
- # setup remaining brokers
- for _p in ports:
- _b = _FedBroker(self.remote_host(), _p)
- _b.client_conn = self.connect(host=self.remote_host(), port=_p)
- _b.client_session = _b.client_conn.session("Fed_client_session_" + str(_p))
- _b.qmf_broker = self.qmf.addBroker(_b.url)
- for _bo in self.qmf.getObjects(_class="broker"):
- if _bo.getBroker().getUrl() == _b.qmf_broker.getUrl():
- _b.qmf_object = _bo
- break
- self._brokers.append(_b)
-
- def _teardown_brokers(self):
- """ Un-does _setup_brokers()
- """
- # broker[0] is configured at test setup, so it must remain configured
- for _b in self._brokers[1:]:
- self.qmf.delBroker(_b.qmf_broker)
- if not _b.client_session.error():
- _b.client_session.close(timeout=10)
- _b.client_conn.close(timeout=10)
-
-
- def test_bridge_create_and_close(self):
- self.startQmf();
- qmf = self.qmf
-
- broker = qmf.getObjects(_class="broker")[0]
- result = broker.connect(self.remote_host(), self.remote_port(), False, "PLAIN", "guest", "guest", "tcp")
- self.assertEqual(result.status, 0)
-
- link = qmf.getObjects(_class="link")[0]
- result = link.bridge(False, "amq.direct", "amq.direct", "my-key", "", "", False, False, False, 0)
- self.assertEqual(result.status, 0)
-
- bridge = qmf.getObjects(_class="bridge")[0]
- result = bridge.close()
- self.assertEqual(result.status, 0)
-
- result = link.close()
- self.assertEqual(result.status, 0)
-
- self.verify_cleanup()
-
- def test_pull_from_exchange(self):
- session = self.session
-
- self.startQmf()
- qmf = self.qmf
- broker = qmf.getObjects(_class="broker")[0]
- result = broker.connect(self.remote_host(), self.remote_port(), False, "PLAIN", "guest", "guest", "tcp")
- self.assertEqual(result.status, 0)
-
- link = qmf.getObjects(_class="link")[0]
- result = link.bridge(False, "amq.direct", "amq.fanout", "my-key", "", "", False, False, False, 0)
- self.assertEqual(result.status, 0)
-
- bridge = qmf.getObjects(_class="bridge")[0]
-
- #setup queue to receive messages from local broker
- session.queue_declare(queue="fed1", exclusive=True, auto_delete=True)
- session.exchange_bind(queue="fed1", exchange="amq.fanout")
- self.subscribe(queue="fed1", destination="f1")
- queue = session.incoming("f1")
- sleep(6)
-
- #send messages to remote broker and confirm it is routed to local broker
- r_conn = self.connect(host=self.remote_host(), port=self.remote_port())
- r_session = r_conn.session("test_pull_from_exchange")
-
- for i in range(1, 11):
- dp = r_session.delivery_properties(routing_key="my-key")
- r_session.message_transfer(destination="amq.direct", message=Message(dp, "Message %d" % i))
-
- for i in range(1, 11):
- msg = queue.get(timeout=5)
- self.assertEqual("Message %d" % i, msg.body)
- try:
- extra = queue.get(timeout=1)
- self.fail("Got unexpected message in queue: " + extra.body)
- except Empty: None
-
- result = bridge.close()
- self.assertEqual(result.status, 0)
- result = link.close()
- self.assertEqual(result.status, 0)
-
- self.verify_cleanup()
-
- def test_push_to_exchange(self):
- session = self.session
-
- self.startQmf()
- qmf = self.qmf
- broker = qmf.getObjects(_class="broker")[0]
- result = broker.connect(self.remote_host(), self.remote_port(), False, "PLAIN", "guest", "guest", "tcp")
- self.assertEqual(result.status, 0)
-
- link = qmf.getObjects(_class="link")[0]
- result = link.bridge(False, "amq.direct", "amq.fanout", "my-key", "", "", False, True, False, 0)
- self.assertEqual(result.status, 0)
-
- bridge = qmf.getObjects(_class="bridge")[0]
-
- #setup queue to receive messages from remote broker
- r_conn = self.connect(host=self.remote_host(), port=self.remote_port())
- r_session = r_conn.session("test_push_to_exchange")
- r_session.queue_declare(queue="fed1", exclusive=True, auto_delete=True)
- r_session.exchange_bind(queue="fed1", exchange="amq.fanout")
- self.subscribe(session=r_session, queue="fed1", destination="f1")
- queue = r_session.incoming("f1")
- sleep(6)
-
- #send messages to local broker and confirm it is routed to remote broker
- for i in range(1, 11):
- dp = session.delivery_properties(routing_key="my-key")
- session.message_transfer(destination="amq.direct", message=Message(dp, "Message %d" % i))
-
- for i in range(1, 11):
- msg = queue.get(timeout=5)
- self.assertEqual("Message %d" % i, msg.body)
- try:
- extra = queue.get(timeout=1)
- self.fail("Got unexpected message in queue: " + extra.body)
- except Empty: None
-
- result = bridge.close()
- self.assertEqual(result.status, 0)
- result = link.close()
- self.assertEqual(result.status, 0)
-
- self.verify_cleanup()
-
- def test_pull_from_queue(self):
- session = self.session
-
- #setup queue on remote broker and add some messages
- r_conn = self.connect(host=self.remote_host(), port=self.remote_port())
- r_session = r_conn.session("test_pull_from_queue")
- r_session.queue_declare(queue="my-bridge-queue", auto_delete=True)
- for i in range(1, 6):
- dp = r_session.delivery_properties(routing_key="my-bridge-queue")
- r_session.message_transfer(message=Message(dp, "Message %d" % i))
-
- #setup queue to receive messages from local broker
- session.queue_declare(queue="fed1", exclusive=True, auto_delete=True)
- session.exchange_bind(queue="fed1", exchange="amq.fanout")
- self.subscribe(queue="fed1", destination="f1")
- queue = session.incoming("f1")
-
- self.startQmf()
- qmf = self.qmf
- broker = qmf.getObjects(_class="broker")[0]
- result = broker.connect(self.remote_host(), self.remote_port(), False, "PLAIN", "guest", "guest", "tcp")
- self.assertEqual(result.status, 0)
-
- link = qmf.getObjects(_class="link")[0]
- result = link.bridge(False, "my-bridge-queue", "amq.fanout", "my-key", "", "", True, False, False, 1)
- self.assertEqual(result.status, 0)
-
- bridge = qmf.getObjects(_class="bridge")[0]
- sleep(3)
-
- #add some more messages (i.e. after bridge was created)
- for i in range(6, 11):
- dp = r_session.delivery_properties(routing_key="my-bridge-queue")
- r_session.message_transfer(message=Message(dp, "Message %d" % i))
-
- for i in range(1, 11):
- try:
- msg = queue.get(timeout=5)
- self.assertEqual("Message %d" % i, msg.body)
- except Empty:
- self.fail("Failed to find expected message containing 'Message %d'" % i)
- try:
- extra = queue.get(timeout=1)
- self.fail("Got unexpected message in queue: " + extra.body)
- except Empty: None
-
- result = bridge.close()
- self.assertEqual(result.status, 0)
- result = link.close()
- self.assertEqual(result.status, 0)
-
- self.verify_cleanup()
-
- def test_tracing_automatic(self):
- remoteUrl = "%s:%d" % (self.remote_host(), self.remote_port())
- self.startQmf()
- l_broker = self.qmf_broker
- r_broker = self.qmf.addBroker(remoteUrl)
-
- l_brokerObj = self.qmf.getObjects(_class="broker", _broker=l_broker)[0]
- r_brokerObj = self.qmf.getObjects(_class="broker", _broker=r_broker)[0]
-
- l_res = l_brokerObj.connect(self.remote_host(), self.remote_port(), False, "PLAIN", "guest", "guest", "tcp")
- r_res = r_brokerObj.connect(self.broker.host, self.broker.port, False, "PLAIN", "guest", "guest", "tcp")
-
- self.assertEqual(l_res.status, 0)
- self.assertEqual(r_res.status, 0)
-
- l_link = self.qmf.getObjects(_class="link", _broker=l_broker)[0]
- r_link = self.qmf.getObjects(_class="link", _broker=r_broker)[0]
-
- l_res = l_link.bridge(False, "amq.direct", "amq.direct", "key", "", "", False, False, False, 0)
- r_res = r_link.bridge(False, "amq.direct", "amq.direct", "key", "", "", False, False, False, 0)
-
- self.assertEqual(l_res.status, 0)
- self.assertEqual(r_res.status, 0)
-
- count = 0
- while l_link.state != "Operational" or r_link.state != "Operational":
- count += 1
- if count > 10:
- self.fail("Fed links didn't become operational after 10 seconds")
- sleep(1)
- l_link = self.qmf.getObjects(_class="link", _broker=l_broker)[0]
- r_link = self.qmf.getObjects(_class="link", _broker=r_broker)[0]
- sleep(3)
-
- #setup queue to receive messages from local broker
- session = self.session
- session.queue_declare(queue="fed1", exclusive=True, auto_delete=True)
- session.exchange_bind(queue="fed1", exchange="amq.direct", binding_key="key")
- self.subscribe(queue="fed1", destination="f1")
- queue = session.incoming("f1")
-
- #setup queue on remote broker and add some messages
- r_conn = self.connect(host=self.remote_host(), port=self.remote_port())
- r_session = r_conn.session("test_trace")
- for i in range(1, 11):
- dp = r_session.delivery_properties(routing_key="key")
- r_session.message_transfer(destination="amq.direct", message=Message(dp, "Message %d" % i))
-
- for i in range(1, 11):
- try:
- msg = queue.get(timeout=5)
- self.assertEqual("Message %d" % i, msg.body)
- except Empty:
- self.fail("Failed to find expected message containing 'Message %d'" % i)
- try:
- extra = queue.get(timeout=1)
- self.fail("Got unexpected message in queue: " + extra.body)
- except Empty: None
-
- def test_tracing(self):
- session = self.session
-
- self.startQmf()
- qmf = self.qmf
- broker = qmf.getObjects(_class="broker")[0]
- result = broker.connect(self.remote_host(), self.remote_port(), False, "PLAIN", "guest", "guest", "tcp")
- self.assertEqual(result.status, 0)
-
- link = qmf.getObjects(_class="link")[0]
- result = link.bridge(False, "amq.direct", "amq.fanout", "my-key", "my-bridge-id",
- "exclude-me,also-exclude-me", False, False, False, 0)
- self.assertEqual(result.status, 0)
- bridge = qmf.getObjects(_class="bridge")[0]
-
- #setup queue to receive messages from local broker
- session.queue_declare(queue="fed1", exclusive=True, auto_delete=True)
- session.exchange_bind(queue="fed1", exchange="amq.fanout")
- self.subscribe(queue="fed1", destination="f1")
- queue = session.incoming("f1")
- sleep(6)
-
- #send messages to remote broker and confirm it is routed to local broker
- r_conn = self.connect(host=self.remote_host(), port=self.remote_port())
- r_session = r_conn.session("test_tracing")
-
- trace = [None, "exclude-me", "a,exclude-me,b", "also-exclude-me,c", "dont-exclude-me"]
- body = ["yes", "first-bad", "second-bad", "third-bad", "yes"]
- for b, t in zip(body, trace):
- headers = {}
- if (t): headers["x-qpid.trace"]=t
- dp = r_session.delivery_properties(routing_key="my-key", ttl=1000*60*5)
- mp = r_session.message_properties(application_headers=headers)
- r_session.message_transfer(destination="amq.direct", message=Message(dp, mp, b))
-
- for e in ["my-bridge-id", "dont-exclude-me,my-bridge-id"]:
- msg = queue.get(timeout=5)
- self.assertEqual("yes", msg.body)
- self.assertEqual(e, self.getAppHeader(msg, "x-qpid.trace"))
- assert(msg.get("delivery_properties").ttl > 0)
- assert(msg.get("delivery_properties").ttl < 1000*60*50)
-
- try:
- extra = queue.get(timeout=1)
- self.fail("Got unexpected message in queue: " + extra.body)
- except Empty: None
-
- result = bridge.close()
- self.assertEqual(result.status, 0)
- result = link.close()
- self.assertEqual(result.status, 0)
-
- self.verify_cleanup()
-
- def test_dynamic_fanout(self):
- session = self.session
- r_conn = self.connect(host=self.remote_host(), port=self.remote_port())
- r_session = r_conn.session("test_dynamic_fanout")
-
- session.exchange_declare(exchange="fed.fanout", type="fanout")
- r_session.exchange_declare(exchange="fed.fanout", type="fanout")
-
- self.startQmf()
- qmf = self.qmf
- broker = qmf.getObjects(_class="broker")[0]
- result = broker.connect(self.remote_host(), self.remote_port(), False, "PLAIN", "guest", "guest", "tcp")
- self.assertEqual(result.status, 0)
-
- link = qmf.getObjects(_class="link")[0]
- result = link.bridge(False, "fed.fanout", "fed.fanout", "", "", "", False, False, True, 0)
- self.assertEqual(result.status, 0)
- bridge = qmf.getObjects(_class="bridge")[0]
- sleep(5)
-
- session.queue_declare(queue="fed1", exclusive=True, auto_delete=True)
- session.exchange_bind(queue="fed1", exchange="fed.fanout")
- self.subscribe(queue="fed1", destination="f1")
- queue = session.incoming("f1")
-
- for i in range(1, 11):
- dp = r_session.delivery_properties()
- r_session.message_transfer(destination="fed.fanout", message=Message(dp, "Message %d" % i))
-
- for i in range(1, 11):
- msg = queue.get(timeout=5)
- self.assertEqual("Message %d" % i, msg.body)
- try:
- extra = queue.get(timeout=1)
- self.fail("Got unexpected message in queue: " + extra.body)
- except Empty: None
-
- result = bridge.close()
- self.assertEqual(result.status, 0)
- result = link.close()
- self.assertEqual(result.status, 0)
-
- self.verify_cleanup()
-
-
- def test_dynamic_direct(self):
- session = self.session
- r_conn = self.connect(host=self.remote_host(), port=self.remote_port())
- r_session = r_conn.session("test_dynamic_direct")
-
- session.exchange_declare(exchange="fed.direct", type="direct")
- r_session.exchange_declare(exchange="fed.direct", type="direct")
-
- self.startQmf()
- qmf = self.qmf
- broker = qmf.getObjects(_class="broker")[0]
- result = broker.connect(self.remote_host(), self.remote_port(), False, "PLAIN", "guest", "guest", "tcp")
- self.assertEqual(result.status, 0)
-
- link = qmf.getObjects(_class="link")[0]
- result = link.bridge(False, "fed.direct", "fed.direct", "", "", "", False, False, True, 0)
- self.assertEqual(result.status, 0)
- bridge = qmf.getObjects(_class="bridge")[0]
- sleep(5)
-
- session.queue_declare(queue="fed1", exclusive=True, auto_delete=True)
- session.exchange_bind(queue="fed1", exchange="fed.direct", binding_key="fd-key")
- self.subscribe(queue="fed1", destination="f1")
- queue = session.incoming("f1")
-
- for i in range(1, 11):
- dp = r_session.delivery_properties(routing_key="fd-key")
- r_session.message_transfer(destination="fed.direct", message=Message(dp, "Message %d" % i))
-
- for i in range(1, 11):
- msg = queue.get(timeout=5)
- self.assertEqual("Message %d" % i, msg.body)
- try:
- extra = queue.get(timeout=1)
- self.fail("Got unexpected message in queue: " + extra.body)
- except Empty: None
-
- result = bridge.close()
- self.assertEqual(result.status, 0)
- result = link.close()
- self.assertEqual(result.status, 0)
-
- self.verify_cleanup()
-
- def test_dynamic_topic(self):
- session = self.session
- r_conn = self.connect(host=self.remote_host(), port=self.remote_port())
- r_session = r_conn.session("test_dynamic_topic")
-
- session.exchange_declare(exchange="fed.topic", type="topic")
- r_session.exchange_declare(exchange="fed.topic", type="topic")
-
- self.startQmf()
- qmf = self.qmf
- broker = qmf.getObjects(_class="broker")[0]
- result = broker.connect(self.remote_host(), self.remote_port(), False, "PLAIN", "guest", "guest", "tcp")
- self.assertEqual(result.status, 0)
-
- link = qmf.getObjects(_class="link")[0]
- result = link.bridge(False, "fed.topic", "fed.topic", "", "", "", False, False, True, 0)
- self.assertEqual(result.status, 0)
- bridge = qmf.getObjects(_class="bridge")[0]
- sleep(5)
-
- session.queue_declare(queue="fed1", exclusive=True, auto_delete=True)
- session.exchange_bind(queue="fed1", exchange="fed.topic", binding_key="ft-key.#")
- self.subscribe(queue="fed1", destination="f1")
- queue = session.incoming("f1")
-
- for i in range(1, 11):
- dp = r_session.delivery_properties(routing_key="ft-key.one.two")
- r_session.message_transfer(destination="fed.topic", message=Message(dp, "Message %d" % i))
-
- for i in range(1, 11):
- msg = queue.get(timeout=5)
- self.assertEqual("Message %d" % i, msg.body)
- try:
- extra = queue.get(timeout=1)
- self.fail("Got unexpected message in queue: " + extra.body)
- except Empty: None
-
- result = bridge.close()
- self.assertEqual(result.status, 0)
- result = link.close()
- self.assertEqual(result.status, 0)
-
- self.verify_cleanup()
-
- def test_dynamic_topic_reorigin(self):
- session = self.session
- r_conn = self.connect(host=self.remote_host(), port=self.remote_port())
- r_session = r_conn.session("test_dynamic_topic_reorigin")
-
- session.exchange_declare(exchange="fed.topic_reorigin", type="topic")
- r_session.exchange_declare(exchange="fed.topic_reorigin", type="topic")
-
- session.exchange_declare(exchange="fed.topic_reorigin_2", type="topic")
- r_session.exchange_declare(exchange="fed.topic_reorigin_2", type="topic")
-
- self.startQmf()
- qmf = self.qmf
- broker = qmf.getObjects(_class="broker")[0]
- result = broker.connect(self.remote_host(), self.remote_port(), False, "PLAIN", "guest", "guest", "tcp")
- self.assertEqual(result.status, 0)
-
- session.queue_declare(queue="fed2", exclusive=True, auto_delete=True)
- session.exchange_bind(queue="fed2", exchange="fed.topic_reorigin_2", binding_key="ft-key.one.#")
- self.subscribe(queue="fed2", destination="f2")
- queue2 = session.incoming("f2")
-
- link = qmf.getObjects(_class="link")[0]
- result = link.bridge(False, "fed.topic_reorigin", "fed.topic_reorigin", "", "", "", False, False, True, 0)
- self.assertEqual(result.status, 0)
- result = link.bridge(False, "fed.topic_reorigin_2", "fed.topic_reorigin_2", "", "", "", False, False, True, 0)
- self.assertEqual(result.status, 0)
-
- bridge = qmf.getObjects(_class="bridge")[0]
- bridge2 = qmf.getObjects(_class="bridge")[1]
- sleep(5)
-
- session.queue_declare(queue="fed1", exclusive=True, auto_delete=True)
- session.exchange_bind(queue="fed1", exchange="fed.topic_reorigin", binding_key="ft-key.#")
- self.subscribe(queue="fed1", destination="f1")
- queue = session.incoming("f1")
-
- for i in range(1, 11):
- dp = r_session.delivery_properties(routing_key="ft-key.one.two")
- r_session.message_transfer(destination="fed.topic_reorigin", message=Message(dp, "Message %d" % i))
-
- for i in range(1, 11):
- msg = queue.get(timeout=5)
- self.assertEqual("Message %d" % i, msg.body)
- try:
- extra = queue.get(timeout=1)
- self.fail("Got unexpected message in queue: " + extra.body)
- except Empty: None
-
- result = bridge.close()
- self.assertEqual(result.status, 0)
- result = bridge2.close()
- self.assertEqual(result.status, 0)
-
- # extra check: verify we don't leak bridge objects - keep the link
- # around and verify the bridge count has gone to zero
-
- attempts = 0
- bridgeCount = len(qmf.getObjects(_class="bridge"))
- while bridgeCount > 0:
- attempts += 1
- if attempts >= 5:
- self.fail("Bridges didn't clean up")
- return
- sleep(1)
- bridgeCount = len(qmf.getObjects(_class="bridge"))
-
- result = link.close()
- self.assertEqual(result.status, 0)
-
- self.verify_cleanup()
-
- def test_dynamic_direct_reorigin(self):
- session = self.session
- r_conn = self.connect(host=self.remote_host(), port=self.remote_port())
- r_session = r_conn.session("test_dynamic_direct_reorigin")
-
- session.exchange_declare(exchange="fed.direct_reorigin", type="direct")
- r_session.exchange_declare(exchange="fed.direct_reorigin", type="direct")
-
- session.exchange_declare(exchange="fed.direct_reorigin_2", type="direct")
- r_session.exchange_declare(exchange="fed.direct_reorigin_2", type="direct")
-
- self.startQmf()
- qmf = self.qmf
- broker = qmf.getObjects(_class="broker")[0]
- result = broker.connect(self.remote_host(), self.remote_port(), False, "PLAIN", "guest", "guest", "tcp")
- self.assertEqual(result.status, 0)
-
- session.queue_declare(queue="fed2", exclusive=True, auto_delete=True)
- session.exchange_bind(queue="fed2", exchange="fed.direct_reorigin_2", binding_key="ft-key.two")
- self.subscribe(queue="fed2", destination="f2")
- queue2 = session.incoming("f2")
-
- link = qmf.getObjects(_class="link")[0]
- result = link.bridge(False, "fed.direct_reorigin", "fed.direct_reorigin", "", "", "", False, False, True, 0)
- self.assertEqual(result.status, 0)
- result = link.bridge(False, "fed.direct_reorigin_2", "fed.direct_reorigin_2", "", "", "", False, False, True, 0)
- self.assertEqual(result.status, 0)
-
- bridge = qmf.getObjects(_class="bridge")[0]
- bridge2 = qmf.getObjects(_class="bridge")[1]
- sleep(5)
-
- session.queue_declare(queue="fed1", exclusive=True, auto_delete=True)
- session.exchange_bind(queue="fed1", exchange="fed.direct_reorigin", binding_key="ft-key.one")
- self.subscribe(queue="fed1", destination="f1")
- queue = session.incoming("f1")
-
- for i in range(1, 11):
- dp = r_session.delivery_properties(routing_key="ft-key.one")
- r_session.message_transfer(destination="fed.direct_reorigin", message=Message(dp, "Message %d" % i))
-
- for i in range(1, 11):
- msg = queue.get(timeout=5)
- self.assertEqual("Message %d" % i, msg.body)
- try:
- extra = queue.get(timeout=1)
- self.fail("Got unexpected message in queue: " + extra.body)
- except Empty: None
-
- result = bridge.close()
- self.assertEqual(result.status, 0)
-
- # Extra test: don't explicitly close() bridge2. When the link is closed,
- # it should clean up bridge2 automagically. verify_cleanup() will detect
- # if bridge2 isn't cleaned up and will fail the test.
- #
- #result = bridge2.close()
- #self.assertEqual(result.status, 0)
- result = link.close()
- self.assertEqual(result.status, 0)
-
- self.verify_cleanup()
-
- def test_dynamic_headers(self):
- session = self.session
- r_conn = self.connect(host=self.remote_host(), port=self.remote_port())
- r_session = r_conn.session("test_dynamic_headers")
-
- session.exchange_declare(exchange="fed.headers", type="headers")
- r_session.exchange_declare(exchange="fed.headers", type="headers")
-
- self.startQmf()
- qmf = self.qmf
-
- broker = qmf.getObjects(_class="broker")[0]
- result = broker.connect(self.remote_host(), self.remote_port(), False, "PLAIN", "guest", "guest", "tcp")
- self.assertEqual(result.status, 0)
-
- link = qmf.getObjects(_class="link")[0]
- result = link.bridge(False, "fed.headers", "fed.headers", "", "", "", False, False, True, 0)
- self.assertEqual(result.status, 0)
- bridge = qmf.getObjects(_class="bridge")[0]
- sleep(5)
-
- session.queue_declare(queue="fed1", exclusive=True, auto_delete=True)
- session.exchange_bind(queue="fed1", exchange="fed.headers", binding_key="key1", arguments={'x-match':'any', 'class':'first'})
- self.subscribe(queue="fed1", destination="f1")
- queue = session.incoming("f1")
-
- props = r_session.message_properties(application_headers={'class':'first'})
- for i in range(1, 11):
- r_session.message_transfer(destination="fed.headers", message=Message(props, "Message %d" % i))
-
- for i in range(1, 11):
- msg = queue.get(timeout=5)
- content = msg.body
- self.assertEqual("Message %d" % i, msg.body)
- try:
- extra = queue.get(timeout=1)
- self.fail("Got unexpected message in queue: " + extra.body)
- except Empty: None
-
- result = bridge.close()
- self.assertEqual(result.status, 0)
- result = link.close()
- self.assertEqual(result.status, 0)
-
- self.verify_cleanup()
-
- def test_dynamic_headers_reorigin(self):
- session = self.session
- r_conn = self.connect(host=self.remote_host(), port=self.remote_port())
- r_session = r_conn.session("test_dynamic_headers_reorigin")
-
- session.exchange_declare(exchange="fed.headers_reorigin", type="headers")
- r_session.exchange_declare(exchange="fed.headers_reorigin", type="headers")
-
- session.exchange_declare(exchange="fed.headers_reorigin_2", type="headers")
- r_session.exchange_declare(exchange="fed.headers_reorigin_2", type="headers")
-
- self.startQmf()
- qmf = self.qmf
- broker = qmf.getObjects(_class="broker")[0]
- result = broker.connect(self.remote_host(), self.remote_port(), False, "PLAIN", "guest", "guest", "tcp")
- self.assertEqual(result.status, 0)
-
- session.queue_declare(queue="fed2", exclusive=True, auto_delete=True)
- session.exchange_bind(queue="fed2", exchange="fed.headers_reorigin_2", binding_key="key2", arguments={'x-match':'any', 'class':'second'})
- self.subscribe(queue="fed2", destination="f2")
- queue2 = session.incoming("f2")
-
- link = qmf.getObjects(_class="link")[0]
- result = link.bridge(False, "fed.headers_reorigin", "fed.headers_reorigin", "", "", "", False, False, True, 0)
- self.assertEqual(result.status, 0)
- result = link.bridge(False, "fed.headers_reorigin_2", "fed.headers_reorigin_2", "", "", "", False, False, True, 0)
- self.assertEqual(result.status, 0)
-
- bridge = qmf.getObjects(_class="bridge")[0]
- bridge2 = qmf.getObjects(_class="bridge")[1]
- sleep(5)
-
- session.queue_declare(queue="fed1", exclusive=True, auto_delete=True)
- session.exchange_bind(queue="fed1", exchange="fed.headers_reorigin", binding_key="key1", arguments={'x-match':'any', 'class':'first'})
- self.subscribe(queue="fed1", destination="f1")
- queue = session.incoming("f1")
-
- props = r_session.message_properties(application_headers={'class':'first'})
- for i in range(1, 11):
- r_session.message_transfer(destination="fed.headers_reorigin", message=Message(props, "Message %d" % i))
-
- for i in range(1, 11):
- msg = queue.get(timeout=5)
- self.assertEqual("Message %d" % i, msg.body)
- try:
- extra = queue.get(timeout=1)
- self.fail("Got unexpected message in queue: " + extra.body)
- except Empty: None
-
- result = bridge.close()
- self.assertEqual(result.status, 0)
-
- # Extra test: don't explicitly close() bridge2. When the link is closed,
- # it should clean up bridge2 automagically. verify_cleanup() will detect
- # if bridge2 isn't cleaned up and will fail the test.
- #
- #result = bridge2.close()
- #self.assertEqual(result.status, 0)
- result = link.close()
- self.assertEqual(result.status, 0)
-
- self.verify_cleanup()
-
- def test_dynamic_headers_unbind(self):
- session = self.session
- r_conn = self.connect(host=self.remote_host(), port=self.remote_port())
- r_session = r_conn.session("test_dynamic_headers_unbind")
-
- session.exchange_declare(exchange="fed.headers_unbind", type="headers")
- r_session.exchange_declare(exchange="fed.headers_unbind", type="headers")
-
- self.startQmf()
- qmf = self.qmf
-
- broker = qmf.getObjects(_class="broker")[0]
- result = broker.connect(self.remote_host(), self.remote_port(), False, "PLAIN", "guest", "guest", "tcp")
- self.assertEqual(result.status, 0)
-
- link = qmf.getObjects(_class="link")[0]
- result = link.bridge(False, "fed.headers_unbind", "fed.headers_unbind", "", "", "", False, False, True, 0)
- self.assertEqual(result.status, 0)
- bridge = qmf.getObjects(_class="bridge")[0]
- sleep(5)
-
- session.queue_declare(queue="fed1", exclusive=True, auto_delete=True)
- queue = qmf.getObjects(_class="queue", name="fed1")[0]
- queue.update()
- self.assertEqual(queue.bindingCount, 1,
- "bindings not accounted for (expected 1, got %d)" % queue.bindingCount)
-
- session.exchange_bind(queue="fed1", exchange="fed.headers_unbind", binding_key="key1", arguments={'x-match':'any', 'class':'first'})
- queue.update()
- self.assertEqual(queue.bindingCount, 2,
- "bindings not accounted for (expected 2, got %d)" % queue.bindingCount)
-
- session.exchange_unbind(queue="fed1", exchange="fed.headers_unbind", binding_key="key1")
- queue.update()
- self.assertEqual(queue.bindingCount, 1,
- "bindings not accounted for (expected 1, got %d)" % queue.bindingCount)
-
- result = bridge.close()
- self.assertEqual(result.status, 0)
- result = link.close()
- self.assertEqual(result.status, 0)
-
- self.verify_cleanup()
-
-
- def test_dynamic_headers_xml(self):
- session = self.session
- r_conn = self.connect(host=self.remote_host(), port=self.remote_port())
- r_session = r_conn.session("test_dynamic_headers_xml")
-
- session.exchange_declare(exchange="fed.xml", type="xml")
- r_session.exchange_declare(exchange="fed.xml", type="xml")
-
- self.startQmf()
- qmf = self.qmf
-
- broker = qmf.getObjects(_class="broker")[0]
- result = broker.connect(self.remote_host(), self.remote_port(), False, "PLAIN", "guest", "guest", "tcp")
- self.assertEqual(result.status, 0)
-
- link = qmf.getObjects(_class="link")[0]
- result = link.bridge(False, "fed.xml", "fed.xml", "", "", "", False, False, True, 0)
-
- self.assertEqual(result.status, 0)
- bridge = qmf.getObjects(_class="bridge")[0]
- sleep(5)
-
- session.queue_declare(queue="fed1", exclusive=True, auto_delete=True)
- session.exchange_bind(queue="fed1", exchange="fed.xml", binding_key="key1", arguments={'xquery':'true()'})
- self.subscribe(queue="fed1", destination="f1")
- queue = session.incoming("f1")
-
- props = r_session.delivery_properties(routing_key="key1")
- for i in range(1, 11):
- r_session.message_transfer(destination="fed.xml", message=Message(props, "Message %d" % i))
-
- for i in range(1, 11):
- msg = queue.get(timeout=5)
- content = msg.body
- self.assertEqual("Message %d" % i, msg.body)
- try:
- extra = queue.get(timeout=1)
- self.fail("Got unexpected message in queue: " + extra.body)
- except Empty: None
-
- result = bridge.close()
- self.assertEqual(result.status, 0)
- result = link.close()
- self.assertEqual(result.status, 0)
-
- self.verify_cleanup()
-
- def test_dynamic_headers_reorigin_xml(self):
- session = self.session
- r_conn = self.connect(host=self.remote_host(), port=self.remote_port())
- r_session = r_conn.session("test_dynamic_headers_reorigin_xml")
-
- session.exchange_declare(exchange="fed.xml_reorigin", type="xml")
- r_session.exchange_declare(exchange="fed.xml_reorigin", type="xml")
-
- session.exchange_declare(exchange="fed.xml_reorigin_2", type="xml")
- r_session.exchange_declare(exchange="fed.xml_reorigin_2", type="xml")
-
- self.startQmf()
- qmf = self.qmf
- broker = qmf.getObjects(_class="broker")[0]
- result = broker.connect(self.remote_host(), self.remote_port(), False, "PLAIN", "guest", "guest", "tcp")
- self.assertEqual(result.status, 0)
-
- session.queue_declare(queue="fed2", exclusive=True, auto_delete=True)
- session.exchange_bind(queue="fed2", exchange="fed.xml_reorigin_2", binding_key="key2", arguments={'xquery':'true()'})
- self.subscribe(queue="fed2", destination="f2")
- queue2 = session.incoming("f2")
-
- link = qmf.getObjects(_class="link")[0]
- result = link.bridge(False, "fed.xml_reorigin", "fed.xml_reorigin", "", "", "", False, False, True, 0)
-
- self.assertEqual(result.status, 0)
- result = link.bridge(False, "fed.xml_reorigin_2", "fed.xml_reorigin_2", "", "", "", False, False, True, 0)
- self.assertEqual(result.status, 0)
-
- bridge = qmf.getObjects(_class="bridge")[0]
- bridge2 = qmf.getObjects(_class="bridge")[1]
- sleep(5)
-
- foo=qmf.getObjects(_class="link")
- session.queue_declare(queue="fed1", exclusive=True, auto_delete=True)
- session.exchange_bind(queue="fed1", exchange="fed.xml_reorigin", binding_key="key1", arguments={'xquery':'true()'})
- self.subscribe(queue="fed1", destination="f1")
- queue = session.incoming("f1")
-
- props = r_session.delivery_properties(routing_key="key1")
- for i in range(1, 11):
- r_session.message_transfer(destination="fed.xml_reorigin", message=Message(props, "Message %d" % i))
-
- for i in range(1, 11):
- msg = queue.get(timeout=5)
- self.assertEqual("Message %d" % i, msg.body)
- try:
- extra = queue.get(timeout=1)
- self.fail("Got unexpected message in queue: " + extra.body)
- except Empty: None
-
- result = bridge.close()
- self.assertEqual(result.status, 0)
-
- # Extra test: don't explicitly close() bridge2. When the link is closed,
- # it should clean up bridge2 automagically. verify_cleanup() will detect
- # if bridge2 isn't cleaned up and will fail the test.
- #
- #result = bridge2.close()
- #self.assertEqual(result.status, 0)
- result = link.close()
- self.assertEqual(result.status, 0)
-
- self.verify_cleanup()
-
- def test_dynamic_headers_unbind_xml(self):
- session = self.session
- r_conn = self.connect(host=self.remote_host(), port=self.remote_port())
- r_session = r_conn.session("test_dynamic_xml_unbind")
-
- session.exchange_declare(exchange="fed.xml_unbind", type="xml")
- r_session.exchange_declare(exchange="fed.xml_unbind", type="xml")
-
- self.startQmf()
- qmf = self.qmf
-
- broker = qmf.getObjects(_class="broker")[0]
- result = broker.connect(self.remote_host(), self.remote_port(), False, "PLAIN", "guest", "guest", "tcp")
- self.assertEqual(result.status, 0)
-
- link = qmf.getObjects(_class="link")[0]
- result = link.bridge(False, "fed.xml_unbind", "fed.xml_unbind", "", "", "", False, False, True, 0)
-
- self.assertEqual(result.status, 0)
- bridge = qmf.getObjects(_class="bridge")[0]
- sleep(5)
-
- session.queue_declare(queue="fed1", exclusive=True, auto_delete=True)
- queue = qmf.getObjects(_class="queue", name="fed1")[0]
- queue.update()
- self.assertEqual(queue.bindingCount, 1,
- "bindings not accounted for (expected 1, got %d)" % queue.bindingCount)
-
- session.exchange_bind(queue="fed1", exchange="fed.xml_unbind", binding_key="key1", arguments={'xquery':'true()'})
- queue.update()
- self.assertEqual(queue.bindingCount, 2,
- "bindings not accounted for (expected 2, got %d)" % queue.bindingCount)
-
- session.exchange_unbind(queue="fed1", exchange="fed.xml_unbind", binding_key="key1")
- queue.update()
- self.assertEqual(queue.bindingCount, 1,
- "bindings not accounted for (expected 1, got %d)" % queue.bindingCount)
-
- result = bridge.close()
- self.assertEqual(result.status, 0)
- result = link.close()
- self.assertEqual(result.status, 0)
-
- self.verify_cleanup()
-
-
- def test_dynamic_topic_nodup(self):
- """Verify that a message whose routing key matches more than one
- binding does not get duplicated to the same queue.
- """
- session = self.session
- r_conn = self.connect(host=self.remote_host(), port=self.remote_port())
- r_session = r_conn.session("test_dynamic_topic_nodup")
-
- session.exchange_declare(exchange="fed.topic", type="topic")
- r_session.exchange_declare(exchange="fed.topic", type="topic")
-
- self.startQmf()
- qmf = self.qmf
- broker = qmf.getObjects(_class="broker")[0]
- result = broker.connect(self.remote_host(), self.remote_port(), False, "PLAIN", "guest", "guest", "tcp")
- self.assertEqual(result.status, 0)
-
- link = qmf.getObjects(_class="link")[0]
- result = link.bridge(False, "fed.topic", "fed.topic", "", "", "", False, False, True, 0)
- self.assertEqual(result.status, 0)
- bridge = qmf.getObjects(_class="bridge")[0]
- sleep(5)
-
- session.queue_declare(queue="fed1", exclusive=True, auto_delete=True)
- session.exchange_bind(queue="fed1", exchange="fed.topic", binding_key="red.*")
- session.exchange_bind(queue="fed1", exchange="fed.topic", binding_key="*.herring")
-
- self.subscribe(queue="fed1", destination="f1")
- queue = session.incoming("f1")
-
- for i in range(1, 11):
- dp = r_session.delivery_properties(routing_key="red.herring")
- r_session.message_transfer(destination="fed.topic", message=Message(dp, "Message %d" % i))
-
- for i in range(1, 11):
- msg = queue.get(timeout=5)
- self.assertEqual("Message %d" % i, msg.body)
- try:
- extra = queue.get(timeout=1)
- self.fail("Got unexpected message in queue: " + extra.body)
- except Empty: None
-
- result = bridge.close()
- self.assertEqual(result.status, 0)
- result = link.close()
- self.assertEqual(result.status, 0)
-
- self.verify_cleanup()
-
-
- def test_dynamic_direct_route_prop(self):
- """ Set up a tree of uni-directional routes across the direct exchange.
- Bind the same key to the same queues on the leaf nodes. Verify a
- message sent with the routing key transverses the tree an arrives at
- each leaf. Remove one leaf's queue, and verify that messages still
- reach the other leaf.
-
- Route Topology:
-
- +---> B2 queue:"test-queue", binding key:"spudboy"
- B0 --> B1 --+
- +---> B3 queue:"test-queue", binding key:"spudboy"
- """
- session = self.session
-
- # create the federation
-
- self.startQmf()
- qmf = self.qmf
-
- self._setup_brokers()
-
- # create direct exchange on each broker, and retrieve the corresponding
- # management object for that exchange
-
- exchanges=[]
- for _b in self._brokers:
- _b.client_session.exchange_declare(exchange="fedX.direct", type="direct")
- self.assertEqual(_b.client_session.exchange_query(name="fedX.direct").type,
- "direct", "exchange_declare failed!")
- # pull the exchange out of qmf...
- retries = 0
- my_exchange = None
- while my_exchange is None:
- objs = qmf.getObjects(_broker=_b.qmf_broker, _class="exchange")
- for ooo in objs:
- if ooo.name == "fedX.direct":
- my_exchange = ooo
- break
- if my_exchange is None:
- retries += 1
- self.failIfEqual(retries, 10,
- "QMF failed to find new exchange!")
- sleep(1)
- exchanges.append(my_exchange)
-
- self.assertEqual(len(exchanges), len(self._brokers), "Exchange creation failed!")
-
- # connect B0 --> B1
- result = self._brokers[1].qmf_object.connect(self._brokers[0].host,
- self._brokers[0].port,
- False, "PLAIN", "guest", "guest", "tcp")
- self.assertEqual(result.status, 0)
-
- # connect B1 --> B2
- result = self._brokers[2].qmf_object.connect(self._brokers[1].host,
- self._brokers[1].port,
- False, "PLAIN", "guest", "guest", "tcp")
- self.assertEqual(result.status, 0)
-
- # connect B1 --> B3
- result = self._brokers[3].qmf_object.connect(self._brokers[1].host,
- self._brokers[1].port,
- False, "PLAIN", "guest", "guest", "tcp")
- self.assertEqual(result.status, 0)
-
- # for each link, bridge the "fedX.direct" exchanges:
-
- for _l in qmf.getObjects(_class="link"):
- # print("Link=%s:%s %s" % (_l.host, _l.port, str(_l.getBroker())))
- result = _l.bridge(False, # durable
- "fedX.direct", # src
- "fedX.direct", # dst
- "", # key
- "", # tag
- "", # excludes
- False, # srcIsQueue
- False, # srcIsLocal
- True, # dynamic
- 0) # sync
- self.assertEqual(result.status, 0)
-
- # wait for the inter-broker links to become operational
- retries = 0
- operational = False
- while not operational:
- operational = True
- for _l in qmf.getObjects(_class="link"):
- #print("Link=%s:%s %s" % (_l.host, _l.port, str(_l.state)))
- if _l.state != "Operational":
- operational = False
- if not operational:
- retries += 1
- self.failIfEqual(retries, 10,
- "inter-broker links failed to become operational.")
- sleep(1)
-
- # @todo - There is no way to determine when the bridge objects become
- # active. Hopefully, this is long enough!
- sleep(6)
-
- # create a queue on B2, bound to "spudboy"
- self._brokers[2].client_session.queue_declare(queue="fedX1", exclusive=True, auto_delete=True)
- self._brokers[2].client_session.exchange_bind(queue="fedX1", exchange="fedX.direct", binding_key="spudboy")
-
- # create a queue on B3, bound to "spudboy"
- self._brokers[3].client_session.queue_declare(queue="fedX1", exclusive=True, auto_delete=True)
- self._brokers[3].client_session.exchange_bind(queue="fedX1", exchange="fedX.direct", binding_key="spudboy")
-
- # subscribe to messages arriving on B2's queue
- self.subscribe(self._brokers[2].client_session, queue="fedX1", destination="f1")
- queue_2 = self._brokers[2].client_session.incoming("f1")
-
- # subscribe to messages arriving on B3's queue
- self.subscribe(self._brokers[3].client_session, queue="fedX1", destination="f1")
- queue_3 = self._brokers[3].client_session.incoming("f1")
-
- # wait until the binding key has propagated to each broker (twice at
- # broker B1). Work backwards from binding brokers.
-
- binding_counts = [1, 2, 1, 1]
- self.assertEqual(len(binding_counts), len(exchanges), "Update Test!")
- for i in range(3,-1,-1):
- retries = 0
- exchanges[i].update()
- while exchanges[i].bindingCount < binding_counts[i]:
- retries += 1
- self.failIfEqual(retries, 10,
- "binding failed to propagate to broker %d"
- % i)
- sleep(3)
- exchanges[i].update()
-
- # send 10 msgs from B0
- for i in range(1, 11):
- dp = self._brokers[0].client_session.delivery_properties(routing_key="spudboy")
- self._brokers[0].client_session.message_transfer(destination="fedX.direct", message=Message(dp, "Message_drp %d" % i))
-
- # wait for 10 messages to be forwarded from B0->B1,
- # 10 messages from B1->B2,
- # and 10 messages from B1->B3
- retries = 0
- for ex in exchanges:
- ex.update()
- while (exchanges[0].msgReceives != 10 or exchanges[0].msgRoutes != 10 or
- exchanges[1].msgReceives != 10 or exchanges[1].msgRoutes != 20 or
- exchanges[2].msgReceives != 10 or exchanges[2].msgRoutes != 10 or
- exchanges[3].msgReceives != 10 or exchanges[3].msgRoutes != 10):
- retries += 1
- self.failIfEqual(retries, 10,
- "federation failed to route msgs %d:%d %d:%d %d:%d %d:%d"
- % (exchanges[0].msgReceives,
- exchanges[0].msgRoutes,
- exchanges[1].msgReceives,
- exchanges[1].msgRoutes,
- exchanges[2].msgReceives,
- exchanges[2].msgRoutes,
- exchanges[3].msgReceives,
- exchanges[3].msgRoutes))
- sleep(1)
- for ex in exchanges:
- ex.update()
-
- # get exactly 10 msgs on B2 and B3
- for i in range(1, 11):
- msg = queue_2.get(timeout=5)
- self.assertEqual("Message_drp %d" % i, msg.body)
- msg = queue_3.get(timeout=5)
- self.assertEqual("Message_drp %d" % i, msg.body)
-
- try:
- extra = queue_2.get(timeout=1)
- self.fail("Got unexpected message in queue_2: " + extra.body)
- except Empty: None
-
- try:
- extra = queue_3.get(timeout=1)
- self.fail("Got unexpected message in queue_3: " + extra.body)
- except Empty: None
-
-
- # tear down the queue on B2
- self._brokers[2].client_session.exchange_unbind(queue="fedX1", exchange="fedX.direct", binding_key="spudboy")
- self._brokers[2].client_session.message_cancel(destination="f1")
- self._brokers[2].client_session.queue_delete(queue="fedX1")
-
- # @todo - restore code when QPID-2499 fixed!!
- sleep(6)
- # wait for the binding count on B1 to drop from 2 to 1
- retries = 0
- exchanges[1].update()
- while exchanges[1].bindingCount != 1:
- retries += 1
- self.failIfEqual(retries, 10,
- "unbinding failed to propagate to broker B1: %d"
- % exchanges[1].bindingCount)
- sleep(1)
- exchanges[1].update()
-
- # send 10 msgs from B0
- for i in range(11, 21):
- dp = self._brokers[0].client_session.delivery_properties(routing_key="spudboy")
- self._brokers[0].client_session.message_transfer(destination="fedX.direct", message=Message(dp, "Message_drp %d" % i))
-
- # verify messages are forwarded to B3 only
- retries = 0
- for ex in exchanges:
- ex.update()
- while (exchanges[0].msgReceives != 20 or exchanges[0].msgRoutes != 20 or
- exchanges[1].msgReceives != 20 or exchanges[1].msgRoutes != 30 or
- exchanges[2].msgReceives != 10 or exchanges[2].msgRoutes != 10 or
- exchanges[3].msgReceives != 20 or exchanges[3].msgRoutes != 20):
- retries += 1
- self.failIfEqual(retries, 10,
- "federation failed to route more msgs %d:%d %d:%d %d:%d %d:%d"
- % (exchanges[0].msgReceives,
- exchanges[0].msgRoutes,
- exchanges[1].msgReceives,
- exchanges[1].msgRoutes,
- exchanges[2].msgReceives,
- exchanges[2].msgRoutes,
- exchanges[3].msgReceives,
- exchanges[3].msgRoutes))
- sleep(1)
- for ex in exchanges:
- ex.update()
-
- # get exactly 10 msgs on B3 only
- for i in range(11, 21):
- msg = queue_3.get(timeout=5)
- self.assertEqual("Message_drp %d" % i, msg.body)
-
- try:
- extra = queue_3.get(timeout=1)
- self.fail("Got unexpected message in queue_3: " + extra.body)
- except Empty: None
-
- # cleanup
-
- self._brokers[3].client_session.exchange_unbind(queue="fedX1", exchange="fedX.direct", binding_key="spudboy")
- self._brokers[3].client_session.message_cancel(destination="f1")
- self._brokers[3].client_session.queue_delete(queue="fedX1")
-
- for _b in qmf.getObjects(_class="bridge"):
- result = _b.close()
- self.assertEqual(result.status, 0)
-
- for _l in qmf.getObjects(_class="link"):
- result = _l.close()
- self.assertEqual(result.status, 0)
-
- for _b in self._brokers:
- _b.client_session.exchange_delete(exchange="fedX.direct")
-
- self._teardown_brokers()
-
- self.verify_cleanup()
-
- def test_dynamic_topic_route_prop(self):
- """ Set up a tree of uni-directional routes across a topic exchange.
- Bind the same key to the same queues on the leaf nodes. Verify a
- message sent with the routing key transverses the tree an arrives at
- each leaf. Remove one leaf's queue, and verify that messages still
- reach the other leaf.
-
- Route Topology:
-
- +---> B2 queue:"test-queue", binding key:"spud.*"
- B0 --> B1 --+
- +---> B3 queue:"test-queue", binding key:"spud.*"
- """
- session = self.session
-
- # create the federation
-
- self.startQmf()
- qmf = self.qmf
-
- self._setup_brokers()
-
- # create exchange on each broker, and retrieve the corresponding
- # management object for that exchange
-
- exchanges=[]
- for _b in self._brokers:
- _b.client_session.exchange_declare(exchange="fedX.topic", type="topic")
- self.assertEqual(_b.client_session.exchange_query(name="fedX.topic").type,
- "topic", "exchange_declare failed!")
- # pull the exchange out of qmf...
- retries = 0
- my_exchange = None
- while my_exchange is None:
- objs = qmf.getObjects(_broker=_b.qmf_broker, _class="exchange")
- for ooo in objs:
- if ooo.name == "fedX.topic":
- my_exchange = ooo
- break
- if my_exchange is None:
- retries += 1
- self.failIfEqual(retries, 10,
- "QMF failed to find new exchange!")
- sleep(1)
- exchanges.append(my_exchange)
-
- self.assertEqual(len(exchanges), len(self._brokers), "Exchange creation failed!")
-
- # connect B0 --> B1
- result = self._brokers[1].qmf_object.connect(self._brokers[0].host,
- self._brokers[0].port,
- False, "PLAIN", "guest", "guest", "tcp")
- self.assertEqual(result.status, 0)
-
- # connect B1 --> B2
- result = self._brokers[2].qmf_object.connect(self._brokers[1].host,
- self._brokers[1].port,
- False, "PLAIN", "guest", "guest", "tcp")
- self.assertEqual(result.status, 0)
-
- # connect B1 --> B3
- result = self._brokers[3].qmf_object.connect(self._brokers[1].host,
- self._brokers[1].port,
- False, "PLAIN", "guest", "guest", "tcp")
- self.assertEqual(result.status, 0)
-
- # for each link, bridge the "fedX.topic" exchanges:
-
- for _l in qmf.getObjects(_class="link"):
- # print("Link=%s:%s %s" % (_l.host, _l.port, str(_l.getBroker())))
- result = _l.bridge(False, # durable
- "fedX.topic", # src
- "fedX.topic", # dst
- "", # key
- "", # tag
- "", # excludes
- False, # srcIsQueue
- False, # srcIsLocal
- True, # dynamic
- 0) # sync
- self.assertEqual(result.status, 0)
-
- # wait for the inter-broker links to become operational
- retries = 0
- operational = False
- while not operational:
- operational = True
- for _l in qmf.getObjects(_class="link"):
- #print("Link=%s:%s %s" % (_l.host, _l.port, str(_l.state)))
- if _l.state != "Operational":
- operational = False
- if not operational:
- retries += 1
- self.failIfEqual(retries, 10,
- "inter-broker links failed to become operational.")
- sleep(1)
-
- # @todo - There is no way to determine when the bridge objects become
- # active.
- sleep(6)
-
- # create a queue on B2, bound to "spudboy"
- self._brokers[2].client_session.queue_declare(queue="fedX1", exclusive=True, auto_delete=True)
- self._brokers[2].client_session.exchange_bind(queue="fedX1", exchange="fedX.topic", binding_key="spud.*")
-
- # create a queue on B3, bound to "spudboy"
- self._brokers[3].client_session.queue_declare(queue="fedX1", exclusive=True, auto_delete=True)
- self._brokers[3].client_session.exchange_bind(queue="fedX1", exchange="fedX.topic", binding_key="spud.*")
-
- # subscribe to messages arriving on B2's queue
- self.subscribe(self._brokers[2].client_session, queue="fedX1", destination="f1")
- queue_2 = self._brokers[2].client_session.incoming("f1")
-
- # subscribe to messages arriving on B3's queue
- self.subscribe(self._brokers[3].client_session, queue="fedX1", destination="f1")
- queue_3 = self._brokers[3].client_session.incoming("f1")
-
- # wait until the binding key has propagated to each broker (twice at
- # broker B1). Work backwards from binding brokers.
-
- binding_counts = [1, 2, 1, 1]
- self.assertEqual(len(binding_counts), len(exchanges), "Update Test!")
- for i in range(3,-1,-1):
- retries = 0
- exchanges[i].update()
- while exchanges[i].bindingCount < binding_counts[i]:
- retries += 1
- self.failIfEqual(retries, 10,
- "binding failed to propagate to broker %d"
- % i)
- sleep(3)
- exchanges[i].update()
-
- # send 10 msgs from B0
- for i in range(1, 11):
- dp = self._brokers[0].client_session.delivery_properties(routing_key="spud.boy")
- self._brokers[0].client_session.message_transfer(destination="fedX.topic", message=Message(dp, "Message_trp %d" % i))
-
- # wait for 10 messages to be forwarded from B0->B1,
- # 10 messages from B1->B2,
- # and 10 messages from B1->B3
- retries = 0
- for ex in exchanges:
- ex.update()
- while (exchanges[0].msgReceives != 10 or exchanges[0].msgRoutes != 10 or
- exchanges[1].msgReceives != 10 or exchanges[1].msgRoutes != 20 or
- exchanges[2].msgReceives != 10 or exchanges[2].msgRoutes != 10 or
- exchanges[3].msgReceives != 10 or exchanges[3].msgRoutes != 10):
- retries += 1
- self.failIfEqual(retries, 10,
- "federation failed to route msgs %d:%d %d:%d %d:%d %d:%d"
- % (exchanges[0].msgReceives,
- exchanges[0].msgRoutes,
- exchanges[1].msgReceives,
- exchanges[1].msgRoutes,
- exchanges[2].msgReceives,
- exchanges[2].msgRoutes,
- exchanges[3].msgReceives,
- exchanges[3].msgRoutes))
- sleep(1)
- for ex in exchanges:
- ex.update()
-
- # get exactly 10 msgs on B2 and B3
- for i in range(1, 11):
- msg = queue_2.get(timeout=5)
- self.assertEqual("Message_trp %d" % i, msg.body)
- msg = queue_3.get(timeout=5)
- self.assertEqual("Message_trp %d" % i, msg.body)
-
- try:
- extra = queue_2.get(timeout=1)
- self.fail("Got unexpected message in queue_2: " + extra.body)
- except Empty: None
-
- try:
- extra = queue_3.get(timeout=1)
- self.fail("Got unexpected message in queue_3: " + extra.body)
- except Empty: None
-
- # tear down the queue on B2
- self._brokers[2].client_session.exchange_unbind(queue="fedX1", exchange="fedX.topic", binding_key="spud.*")
- self._brokers[2].client_session.message_cancel(destination="f1")
- self._brokers[2].client_session.queue_delete(queue="fedX1")
-
- # wait for the binding count on B1 to drop from 2 to 1
- retries = 0
- exchanges[1].update()
- while exchanges[1].bindingCount != 1:
- retries += 1
- self.failIfEqual(retries, 10,
- "unbinding failed to propagate to broker B1: %d"
- % exchanges[1].bindingCount)
- sleep(1)
- exchanges[1].update()
-
- # send 10 msgs from B0
- for i in range(11, 21):
- dp = self._brokers[0].client_session.delivery_properties(routing_key="spud.boy")
- self._brokers[0].client_session.message_transfer(destination="fedX.topic", message=Message(dp, "Message_trp %d" % i))
-
- # verify messages are forwarded to B3 only
- retries = 0
- for ex in exchanges:
- ex.update()
- while (exchanges[0].msgReceives != 20 or exchanges[0].msgRoutes != 20 or
- exchanges[1].msgReceives != 20 or exchanges[1].msgRoutes != 30 or
- exchanges[2].msgReceives != 10 or exchanges[2].msgRoutes != 10 or
- exchanges[3].msgReceives != 20 or exchanges[3].msgRoutes != 20):
- retries += 1
- self.failIfEqual(retries, 10,
- "federation failed to route more msgs %d:%d %d:%d %d:%d %d:%d"
- % (exchanges[0].msgReceives,
- exchanges[0].msgRoutes,
- exchanges[1].msgReceives,
- exchanges[1].msgRoutes,
- exchanges[2].msgReceives,
- exchanges[2].msgRoutes,
- exchanges[3].msgReceives,
- exchanges[3].msgRoutes))
- sleep(1)
- for ex in exchanges:
- ex.update()
-
- # get exactly 10 msgs on B3 only
- for i in range(11, 21):
- msg = queue_3.get(timeout=5)
- self.assertEqual("Message_trp %d" % i, msg.body)
-
- try:
- extra = queue_3.get(timeout=1)
- self.fail("Got unexpected message in queue_3: " + extra.body)
- except Empty: None
-
- # cleanup
-
- self._brokers[3].client_session.exchange_unbind(queue="fedX1", exchange="fedX.topic", binding_key="spud.*")
- self._brokers[3].client_session.message_cancel(destination="f1")
- self._brokers[3].client_session.queue_delete(queue="fedX1")
-
- for _b in qmf.getObjects(_class="bridge"):
- result = _b.close()
- self.assertEqual(result.status, 0)
-
- for _l in qmf.getObjects(_class="link"):
- result = _l.close()
- self.assertEqual(result.status, 0)
-
- for _b in self._brokers:
- _b.client_session.exchange_delete(exchange="fedX.topic")
-
- self._teardown_brokers()
-
- self.verify_cleanup()
-
-
- def test_dynamic_fanout_route_prop(self):
- """ Set up a tree of uni-directional routes across a fanout exchange.
- Bind the same key to the same queues on the leaf nodes. Verify a
- message sent with the routing key transverses the tree an arrives at
- each leaf. Remove one leaf's queue, and verify that messages still
- reach the other leaf.
-
- Route Topology:
-
- +---> B2 queue:"test-queue", binding key:"spud.*"
- B0 --> B1 --+
- +---> B3 queue:"test-queue", binding key:"spud.*"
- """
- session = self.session
-
- # create the federation
-
- self.startQmf()
- qmf = self.qmf
-
- self._setup_brokers()
-
- # create fanout exchange on each broker, and retrieve the corresponding
- # management object for that exchange
-
- exchanges=[]
- for _b in self._brokers:
- _b.client_session.exchange_declare(exchange="fedX.fanout", type="fanout")
- self.assertEqual(_b.client_session.exchange_query(name="fedX.fanout").type,
- "fanout", "exchange_declare failed!")
- # pull the exchange out of qmf...
- retries = 0
- my_exchange = None
- while my_exchange is None:
- objs = qmf.getObjects(_broker=_b.qmf_broker, _class="exchange")
- for ooo in objs:
- if ooo.name == "fedX.fanout":
- my_exchange = ooo
- break
- if my_exchange is None:
- retries += 1
- self.failIfEqual(retries, 10,
- "QMF failed to find new exchange!")
- sleep(1)
- exchanges.append(my_exchange)
-
- self.assertEqual(len(exchanges), len(self._brokers), "Exchange creation failed!")
-
- # connect B0 --> B1
- result = self._brokers[1].qmf_object.connect(self._brokers[0].host,
- self._brokers[0].port,
- False, "PLAIN", "guest", "guest", "tcp")
- self.assertEqual(result.status, 0)
-
- # connect B1 --> B2
- result = self._brokers[2].qmf_object.connect(self._brokers[1].host,
- self._brokers[1].port,
- False, "PLAIN", "guest", "guest", "tcp")
- self.assertEqual(result.status, 0)
-
- # connect B1 --> B3
- result = self._brokers[3].qmf_object.connect(self._brokers[1].host,
- self._brokers[1].port,
- False, "PLAIN", "guest", "guest", "tcp")
- self.assertEqual(result.status, 0)
-
- # for each link, bridge the "fedX.fanout" exchanges:
-
- for _l in qmf.getObjects(_class="link"):
- # print("Link=%s:%s %s" % (_l.host, _l.port, str(_l.getBroker())))
- result = _l.bridge(False, # durable
- "fedX.fanout", # src
- "fedX.fanout", # dst
- "", # key
- "", # tag
- "", # excludes
- False, # srcIsQueue
- False, # srcIsLocal
- True, # dynamic
- 0) # sync
- self.assertEqual(result.status, 0)
-
- # wait for the inter-broker links to become operational
- retries = 0
- operational = False
- while not operational:
- operational = True
- for _l in qmf.getObjects(_class="link"):
- # print("Link=%s:%s %s" % (_l.host, _l.port, str(_l.state)))
- if _l.state != "Operational":
- operational = False
- if not operational:
- retries += 1
- self.failIfEqual(retries, 10,
- "inter-broker links failed to become operational.")
- sleep(1)
-
- # @todo - There is no way to determine when the bridge objects become
- # active.
- sleep(6)
-
- # create a queue on B2, bound to the exchange
- self._brokers[2].client_session.queue_declare(queue="fedX1", exclusive=True, auto_delete=True)
- self._brokers[2].client_session.exchange_bind(queue="fedX1", exchange="fedX.fanout")
-
- # create a queue on B3, bound to the exchange
- self._brokers[3].client_session.queue_declare(queue="fedX1", exclusive=True, auto_delete=True)
- self._brokers[3].client_session.exchange_bind(queue="fedX1", exchange="fedX.fanout")
-
- # subscribe to messages arriving on B2's queue
- self.subscribe(self._brokers[2].client_session, queue="fedX1", destination="f1")
- queue_2 = self._brokers[2].client_session.incoming("f1")
-
- # subscribe to messages arriving on B3's queue
- self.subscribe(self._brokers[3].client_session, queue="fedX1", destination="f1")
- queue_3 = self._brokers[3].client_session.incoming("f1")
-
- # wait until the binding key has propagated to each broker (twice at
- # broker B1). Work backwards from binding brokers.
-
- binding_counts = [1, 2, 1, 1]
- self.assertEqual(len(binding_counts), len(exchanges), "Update Test!")
- for i in range(3,-1,-1):
- retries = 0
- exchanges[i].update()
- while exchanges[i].bindingCount < binding_counts[i]:
- retries += 1
- self.failIfEqual(retries, 10,
- "binding failed to propagate to broker %d"
- % i)
- sleep(3)
- exchanges[i].update()
-
- # send 10 msgs from B0
- for i in range(1, 11):
- dp = self._brokers[0].client_session.delivery_properties()
- self._brokers[0].client_session.message_transfer(destination="fedX.fanout", message=Message(dp, "Message_frp %d" % i))
-
- # wait for 10 messages to be forwarded from B0->B1,
- # 10 messages from B1->B2,
- # and 10 messages from B1->B3
- retries = 0
- for ex in exchanges:
- ex.update()
- while (exchanges[0].msgReceives != 10 or exchanges[0].msgRoutes != 10 or
- exchanges[1].msgReceives != 10 or exchanges[1].msgRoutes != 20 or
- exchanges[2].msgReceives != 10 or exchanges[2].msgRoutes != 10 or
- exchanges[3].msgReceives != 10 or exchanges[3].msgRoutes != 10):
- retries += 1
- self.failIfEqual(retries, 10,
- "federation failed to route msgs %d:%d %d:%d %d:%d %d:%d"
- % (exchanges[0].msgReceives,
- exchanges[0].msgRoutes,
- exchanges[1].msgReceives,
- exchanges[1].msgRoutes,
- exchanges[2].msgReceives,
- exchanges[2].msgRoutes,
- exchanges[3].msgReceives,
- exchanges[3].msgRoutes))
- sleep(1)
- for ex in exchanges:
- ex.update()
-
- # get exactly 10 msgs on B2 and B3
- for i in range(1, 11):
- msg = queue_2.get(timeout=5)
- self.assertEqual("Message_frp %d" % i, msg.body)
- msg = queue_3.get(timeout=5)
- self.assertEqual("Message_frp %d" % i, msg.body)
-
- try:
- extra = queue_2.get(timeout=1)
- self.fail("Got unexpected message in queue_2: " + extra.body)
- except Empty: None
-
- try:
- extra = queue_3.get(timeout=1)
- self.fail("Got unexpected message in queue_3: " + extra.body)
- except Empty: None
-
- # tear down the queue on B2
- self._brokers[2].client_session.exchange_unbind(queue="fedX1", exchange="fedX.fanout")
- self._brokers[2].client_session.message_cancel(destination="f1")
- self._brokers[2].client_session.queue_delete(queue="fedX1")
-
- # wait for the binding count on B1 to drop from 2 to 1
- retries = 0
- exchanges[1].update()
- while exchanges[1].bindingCount != 1:
- retries += 1
- self.failIfEqual(retries, 10,
- "unbinding failed to propagate to broker B1: %d"
- % exchanges[1].bindingCount)
- sleep(1)
- exchanges[1].update()
-
- # send 10 msgs from B0
- for i in range(11, 21):
- dp = self._brokers[0].client_session.delivery_properties()
- self._brokers[0].client_session.message_transfer(destination="fedX.fanout", message=Message(dp, "Message_frp %d" % i))
-
- # verify messages are forwarded to B3 only
- retries = 0
- for ex in exchanges:
- ex.update()
- while (exchanges[0].msgReceives != 20 or exchanges[0].msgRoutes != 20 or
- exchanges[1].msgReceives != 20 or exchanges[1].msgRoutes != 30 or
- exchanges[2].msgReceives != 10 or exchanges[2].msgRoutes != 10 or
- exchanges[3].msgReceives != 20 or exchanges[3].msgRoutes != 20):
- retries += 1
- self.failIfEqual(retries, 10,
- "federation failed to route more msgs %d:%d %d:%d %d:%d %d:%d"
- % (exchanges[0].msgReceives,
- exchanges[0].msgRoutes,
- exchanges[1].msgReceives,
- exchanges[1].msgRoutes,
- exchanges[2].msgReceives,
- exchanges[2].msgRoutes,
- exchanges[3].msgReceives,
- exchanges[3].msgRoutes))
- sleep(1)
- for ex in exchanges:
- ex.update()
-
- # get exactly 10 msgs on B3 only
- for i in range(11, 21):
- msg = queue_3.get(timeout=5)
- self.assertEqual("Message_frp %d" % i, msg.body)
-
- try:
- extra = queue_3.get(timeout=1)
- self.fail("Got unexpected message in queue_3: " + extra.body)
- except Empty: None
-
- # cleanup
-
- self._brokers[3].client_session.exchange_unbind(queue="fedX1", exchange="fedX.fanout")
- self._brokers[3].client_session.message_cancel(destination="f1")
- self._brokers[3].client_session.queue_delete(queue="fedX1")
-
- for _b in qmf.getObjects(_class="bridge"):
- result = _b.close()
- self.assertEqual(result.status, 0)
-
- for _l in qmf.getObjects(_class="link"):
- result = _l.close()
- self.assertEqual(result.status, 0)
-
- for _b in self._brokers:
- _b.client_session.exchange_delete(exchange="fedX.fanout")
-
- self._teardown_brokers()
-
- self.verify_cleanup()
-
-
- def getProperty(self, msg, name):
- for h in msg.headers:
- if hasattr(h, name): return getattr(h, name)
- return None
-
- def getAppHeader(self, msg, name):
- headers = self.getProperty(msg, "application_headers")
- if headers:
- return headers[name]
- return None
-
- def test_dynamic_topic_bounce(self):
- """ Bounce the connection between federated Topic Exchanges.
- """
- class Params:
- def exchange_type(self): return "topic"
- def bind_queue(self, ssn, qname, ename):
- ssn.exchange_bind(queue=qname, exchange=ename,
- binding_key="spud.*")
- def unbind_queue(self, ssn, qname, ename):
- ssn.exchange_unbind(queue=qname, exchange=ename, binding_key="spud.*")
- def delivery_properties(self, ssn):
- return ssn.delivery_properties(routing_key="spud.boy")
-
- self.generic_dynamic_bounce_test(Params())
-
- def test_dynamic_direct_bounce(self):
- """ Bounce the connection between federated Direct Exchanges.
- """
- class Params:
- def exchange_type(self): return "direct"
- def bind_queue(self, ssn, qname, ename):
- ssn.exchange_bind(queue=qname, exchange=ename, binding_key="spud")
- def unbind_queue(self, ssn, qname, ename):
- ssn.exchange_unbind(queue=qname, exchange=ename, binding_key="spud")
- def delivery_properties(self, ssn):
- return ssn.delivery_properties(routing_key="spud")
- self.generic_dynamic_bounce_test(Params())
-
- def test_dynamic_fanout_bounce(self):
- """ Bounce the connection between federated Fanout Exchanges.
- """
- class Params:
- def exchange_type(self): return "fanout"
- def bind_queue(self, ssn, qname, ename):
- ssn.exchange_bind(queue=qname, exchange=ename)
- def unbind_queue(self, ssn, qname, ename):
- ssn.exchange_unbind(queue=qname, exchange=ename)
- def delivery_properties(self, ssn):
- return ssn.delivery_properties(routing_key="spud")
- self.generic_dynamic_bounce_test(Params())
-
- def test_dynamic_headers_bounce(self):
- """ Bounce the connection between federated Headers Exchanges.
- """
- class Params:
- def exchange_type(self): return "headers"
- def bind_queue(self, ssn, qname, ename):
- ssn.exchange_bind(queue=qname, exchange=ename,
- binding_key="spud", arguments={'x-match':'any', 'class':'first'})
- def unbind_queue(self, ssn, qname, ename):
- ssn.exchange_unbind(queue=qname, exchange=ename, binding_key="spud")
- def delivery_properties(self, ssn):
- return ssn.message_properties(application_headers={'class':'first'})
- ## @todo KAG - re-enable once federation bugs with headers exchanges
- ## are fixed.
- #self.generic_dynamic_bounce_test(Params())
- return
-
-
- def generic_dynamic_bounce_test(self, params):
- """ Verify that a federated broker can maintain a binding to a local
- queue using the same key as a remote binding. Destroy and reconnect
- the federation link, and verify routes are restored correctly.
- See QPID-3170.
- Topology:
-
- Queue1 <---"Key"---B0<==[Federated Exchange]==>B1---"Key"--->Queue2
- """
- session = self.session
-
- # create the federation
-
- self.startQmf()
- qmf = self.qmf
-
- self._setup_brokers()
-
- # create exchange on each broker, and retrieve the corresponding
- # management object for that exchange
-
- exchanges=[]
- for _b in self._brokers[0:2]:
- _b.client_session.exchange_declare(exchange="fedX", type=params.exchange_type())
- self.assertEqual(_b.client_session.exchange_query(name="fedX").type,
- params.exchange_type(), "exchange_declare failed!")
- # pull the exchange out of qmf...
- retries = 0
- my_exchange = None
- timeout = time() + 10
- while my_exchange is None and time() <= timeout:
- objs = qmf.getObjects(_broker=_b.qmf_broker, _class="exchange")
- for ooo in objs:
- if ooo.name == "fedX":
- my_exchange = ooo
- break
- if my_exchange is None:
- self.fail("QMF failed to find new exchange!")
- exchanges.append(my_exchange)
-
- #
- # on each broker, create a local queue bound to the exchange with the
- # same key value.
- #
-
- self._brokers[0].client_session.queue_declare(queue="fedX1", exclusive=True, auto_delete=True)
- params.bind_queue(self._brokers[0].client_session, "fedX1", "fedX")
- self.subscribe(self._brokers[0].client_session, queue="fedX1", destination="f1")
- queue_0 = self._brokers[0].client_session.incoming("f1")
-
- self._brokers[1].client_session.queue_declare(queue="fedX1", exclusive=True, auto_delete=True)
- params.bind_queue(self._brokers[1].client_session, "fedX1", "fedX")
- self.subscribe(self._brokers[1].client_session, queue="fedX1", destination="f1")
- queue_1 = self._brokers[1].client_session.incoming("f1")
-
- # now federate the two brokers
-
- # connect B0 --> B1
- result = self._brokers[1].qmf_object.connect(self._brokers[0].host,
- self._brokers[0].port,
- False, "PLAIN", "guest", "guest", "tcp")
- self.assertEqual(result.status, 0)
-
- # connect B1 --> B0
- result = self._brokers[0].qmf_object.connect(self._brokers[1].host,
- self._brokers[1].port,
- False, "PLAIN", "guest", "guest", "tcp")
- self.assertEqual(result.status, 0)
-
- # for each link, bridge the "fedX" exchanges:
-
- for _l in qmf.getObjects(_class="link"):
- # print("Link=%s:%s %s" % (_l.host, _l.port, str(_l.getBroker())))
- result = _l.bridge(False, # durable
- "fedX", # src
- "fedX", # dst
- "", # key
- "", # tag
- "", # excludes
- False, # srcIsQueue
- False, # srcIsLocal
- True, # dynamic
- 0) # sync
- self.assertEqual(result.status, 0)
-
- # wait for all the inter-broker links to become operational
- operational = False
- timeout = time() + 10
- while not operational and time() <= timeout:
- operational = True
- for _l in qmf.getObjects(_class="link"):
- #print("Link=%s:%s %s" % (_l.host, _l.port, str(_l.state)))
- if _l.state != "Operational":
- operational = False
- self.failUnless(operational, "inter-broker links failed to become operational.")
-
- # @todo - There is no way to determine when the bridge objects become
- # active.
-
- # wait until the binding key has propagated to each broker - each
- # broker should see 2 bindings (1 local, 1 remote)
-
- binding_counts = [2, 2]
- self.assertEqual(len(binding_counts), len(exchanges), "Update Test!")
- for i in range(2):
- exchanges[i].update()
- timeout = time() + 10
- while exchanges[i].bindingCount < binding_counts[i] and time() <= timeout:
- exchanges[i].update()
- self.failUnless(exchanges[i].bindingCount == binding_counts[i])
-
- # send 10 msgs to B0
- for i in range(1, 11):
- # dp = self._brokers[0].client_session.delivery_properties(routing_key=params.routing_key())
- dp = params.delivery_properties(self._brokers[0].client_session)
- self._brokers[0].client_session.message_transfer(destination="fedX", message=Message(dp, "Message_trp %d" % i))
-
- # get exactly 10 msgs on B0's local queue and B1's queue
- for i in range(1, 11):
- try:
- msg = queue_0.get(timeout=5)
- self.assertEqual("Message_trp %d" % i, msg.body)
- msg = queue_1.get(timeout=5)
- self.assertEqual("Message_trp %d" % i, msg.body)
- except Empty:
- self.fail("Only got %d msgs - expected 10" % i)
- try:
- extra = queue_0.get(timeout=1)
- self.fail("Got unexpected message in queue_0: " + extra.body)
- except Empty: None
-
- try:
- extra = queue_1.get(timeout=1)
- self.fail("Got unexpected message in queue_1: " + extra.body)
- except Empty: None
-
- #
- # Tear down the bridges between the two exchanges, then wait
- # for the bindings to be cleaned up
- #
-
- for _b in qmf.getObjects(_class="bridge"):
- result = _b.close()
- self.assertEqual(result.status, 0)
-
- binding_counts = [1, 1]
- self.assertEqual(len(binding_counts), len(exchanges), "Update Test!")
- for i in range(2):
- exchanges[i].update()
- timeout = time() + 10
- while exchanges[i].bindingCount != binding_counts[i] and time() <= timeout:
- exchanges[i].update()
- self.failUnless(exchanges[i].bindingCount == binding_counts[i])
-
- #
- # restore the bridges between the two exchanges, and wait for the
- # bindings to propagate.
- #
-
- for _l in qmf.getObjects(_class="link"):
- # print("Link=%s:%s %s" % (_l.host, _l.port, str(_l.getBroker())))
- result = _l.bridge(False, # durable
- "fedX", # src
- "fedX", # dst
- "", # key
- "", # tag
- "", # excludes
- False, # srcIsQueue
- False, # srcIsLocal
- True, # dynamic
- 0) # sync
- self.assertEqual(result.status, 0)
-
- binding_counts = [2, 2]
- self.assertEqual(len(binding_counts), len(exchanges), "Update Test!")
- for i in range(2):
- exchanges[i].update()
- timeout = time() + 10
- while exchanges[i].bindingCount != binding_counts[i] and time() <= timeout:
- exchanges[i].update()
- self.failUnless(exchanges[i].bindingCount == binding_counts[i])
-
- #
- # verify traffic flows correctly
- #
-
- for i in range(1, 11):
- #dp = self._brokers[1].client_session.delivery_properties(routing_key=params.routing_key())
- dp = params.delivery_properties(self._brokers[1].client_session)
- self._brokers[1].client_session.message_transfer(destination="fedX", message=Message(dp, "Message_trp %d" % i))
-
- # get exactly 10 msgs on B0's queue and B1's queue
- for i in range(1, 11):
- try:
- msg = queue_0.get(timeout=5)
- self.assertEqual("Message_trp %d" % i, msg.body)
- msg = queue_1.get(timeout=5)
- self.assertEqual("Message_trp %d" % i, msg.body)
- except Empty:
- self.fail("Only got %d msgs - expected 10" % i)
- try:
- extra = queue_0.get(timeout=1)
- self.fail("Got unexpected message in queue_0: " + extra.body)
- except Empty: None
-
- try:
- extra = queue_1.get(timeout=1)
- self.fail("Got unexpected message in queue_1: " + extra.body)
- except Empty: None
-
-
- #
- # cleanup
- #
- params.unbind_queue(self._brokers[0].client_session, "fedX1", "fedX")
- self._brokers[0].client_session.message_cancel(destination="f1")
- self._brokers[0].client_session.queue_delete(queue="fedX1")
-
- params.unbind_queue(self._brokers[1].client_session, "fedX1", "fedX")
- self._brokers[1].client_session.message_cancel(destination="f1")
- self._brokers[1].client_session.queue_delete(queue="fedX1")
-
- for _b in qmf.getObjects(_class="bridge"):
- result = _b.close()
- self.assertEqual(result.status, 0)
-
- for _l in qmf.getObjects(_class="link"):
- result = _l.close()
- self.assertEqual(result.status, 0)
-
- for _b in self._brokers[0:2]:
- _b.client_session.exchange_delete(exchange="fedX")
-
- self._teardown_brokers()
-
- self.verify_cleanup()
-
-
diff --git a/cpp/src/tests/find_prog.ps1 b/cpp/src/tests/find_prog.ps1
deleted file mode 100644
index 5c482debbf..0000000000
--- a/cpp/src/tests/find_prog.ps1
+++ /dev/null
@@ -1,36 +0,0 @@
-#
-# 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.
-#
-
-# Locate the subdirectory where the specified program resides; the program
-# must have a directory and a file name, even if the directory is .
-param(
- [string] $prog # program to look for somewhere below cwd
-)
-
-$dir = Split-Path $prog
-$exe = Split-Path $prog -leaf
-$sub = ""
-$subs = "Debug","Release","MinSizeRel","RelWithDebInfo"
-foreach ($try in $subs) {
- $prog = "$dir\$try\$exe"
- if (Test-Path $prog) {
- $sub = $try
- break
- }
-}
diff --git a/cpp/src/tests/header_test.cpp b/cpp/src/tests/header_test.cpp
deleted file mode 100644
index c36b4f3bc3..0000000000
--- a/cpp/src/tests/header_test.cpp
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- *
- * 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.
- *
- */
-
-#include <iostream>
-
-#include "TestOptions.h"
-#include "qpid/client/Connection.h"
-#include "qpid/client/Message.h"
-#include "qpid/client/Session.h"
-#include "qpid/client/SubscriptionManager.h"
-
-using namespace qpid;
-using namespace qpid::client;
-using namespace std;
-
-int main(int argc, char** argv)
-{
- TestOptions opts;
- try {
- opts.parse(argc, argv);
- Connection connection;
- connection.open(opts.con);
- Session session = connection.newSession();
- std::string q("header_interop_test_queue");
- session.queueDeclare(arg::queue=q);
- double pi = 3.14159265;
- float e = 2.71828f;
- Message msg("", q);
- msg.getMessageProperties().getApplicationHeaders().setDouble("pi", pi);
- msg.getMessageProperties().getApplicationHeaders().setFloat("e", e);
- session.messageTransfer(arg::content=msg);
-
- session.close();
- connection.close();
-
- return 0;
- } catch(const exception& e) {
- cout << e.what() << endl;
- }
- return 1;
-}
diff --git a/cpp/src/tests/header_test.py b/cpp/src/tests/header_test.py
deleted file mode 100755
index d5a2c16c01..0000000000
--- a/cpp/src/tests/header_test.py
+++ /dev/null
@@ -1,86 +0,0 @@
-#!/usr/bin/env python
-#
-# 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.
-#
-
-import qpid
-import sys
-import os
-from qpid.util import connect
-from qpid.connection import Connection
-from qpid.datatypes import Message, RangedSet, uuid4
-from qpid.queue import Empty
-from math import fabs
-
-def getApplicationHeaders(msg):
- for h in msg.headers:
- if hasattr(h, 'application_headers'): return getattr(h, 'application_headers')
- return None
-
-# Set parameters for login
-
-host="127.0.0.1"
-port=5672
-user="guest"
-password="guest"
-
-if len(sys.argv) > 1 :
- host=sys.argv[1]
-if len(sys.argv) > 2 :
- port=int(sys.argv[2])
-
-# Create a connection.
-socket = connect(host, port)
-connection = Connection (sock=socket)
-connection.start()
-session = connection.session(str(uuid4()))
-
-q = "header_interop_test_queue"
-session.queue_declare(queue=q)
-
-session.message_subscribe(queue=q, destination="received")
-queue = session.incoming("received")
-queue.start()
-
-msg = queue.get(timeout=10)
-pi = 3.14159265
-e = 2.71828
-
-headers = getApplicationHeaders(msg)
-pi_ = headers["pi"]
-e_ = headers["e"]
-session.close(timeout=10)
-
-failed = False
-
-if pi != pi_:
- print "got incorrect value for pi: ", pi_, " expected:", pi
- failed = True
-
-if fabs(e - e_) > 0.0001:
- print "got incorrect value for e: ", e_, " expected:", e
- failed = True
-
-if failed:
- sys.exit(1)
-else:
- print "Correct header values received."
- sys.exit(0)
-
-
-
diff --git a/cpp/src/tests/headers_federation.py b/cpp/src/tests/headers_federation.py
deleted file mode 100644
index 60cff1da54..0000000000
--- a/cpp/src/tests/headers_federation.py
+++ /dev/null
@@ -1,99 +0,0 @@
-#!/usr/bin/env python
-#
-# 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.
-#
-
-import sys
-from qpid.testlib import TestBase010
-from qpid.datatypes import Message
-from qpid.queue import Empty
-from time import sleep
-
-class HeadersFederationTests(TestBase010):
-
- def remote_host(self):
- return self.defines.get("remote-host", "localhost")
-
- def remote_port(self):
- return int(self.defines["remote-port"])
-
- def verify_cleanup(self):
- attempts = 0
- total = len(self.qmf.getObjects(_class="bridge")) + len(self.qmf.getObjects(_class="link"))
- while total > 0:
- attempts += 1
- if attempts >= 10:
- self.fail("Bridges and links didn't clean up")
- return
- sleep(1)
- total = len(self.qmf.getObjects(_class="bridge")) + len(self.qmf.getObjects(_class="link"))
-
- def test_dynamic_headers_unbind(self):
- session = self.session
- r_conn = self.connect(host=self.remote_host(), port=self.remote_port())
- r_session = r_conn.session("test_dynamic_headers_unbind")
-
- session.exchange_declare(exchange="fed.headers_unbind", type="headers")
- r_session.exchange_declare(exchange="fed.headers_unbind", type="headers")
-
- self.startQmf()
- qmf = self.qmf
-
- broker = qmf.getObjects(_class="broker")[0]
- result = broker.connect(self.remote_host(), self.remote_port(), False, "PLAIN", "guest", "guest", "tcp")
- self.assertEqual(result.status, 0)
-
- link = qmf.getObjects(_class="link")[0]
- result = link.bridge(False, "fed.headers_unbind", "fed.headers_unbind", "", "", "", False, False, True, 0)
- self.assertEqual(result.status, 0)
- bridge = qmf.getObjects(_class="bridge")[0]
- sleep(5)
-
- session.queue_declare(queue="fed1", exclusive=True, auto_delete=True)
- queue = qmf.getObjects(_class="queue", name="fed1")[0]
- queue.update()
- self.assertEqual(queue.bindingCount, 1,
- "bindings not accounted for (expected 1, got %d)" % queue.bindingCount)
-
- session.exchange_bind(queue="fed1", exchange="fed.headers_unbind", binding_key="key1", arguments={'x-match':'any', 'class':'first'})
- queue.update()
- self.assertEqual(queue.bindingCount, 2,
- "bindings not accounted for (expected 2, got %d)" % queue.bindingCount)
-
- session.exchange_unbind(queue="fed1", exchange="fed.headers_unbind", binding_key="key1")
- queue.update()
- self.assertEqual(queue.bindingCount, 1,
- "bindings not accounted for (expected 1, got %d)" % queue.bindingCount)
-
- result = bridge.close()
- self.assertEqual(result.status, 0)
- result = link.close()
- self.assertEqual(result.status, 0)
-
- self.verify_cleanup()
-
- def getProperty(self, msg, name):
- for h in msg.headers:
- if hasattr(h, name): return getattr(h, name)
- return None
-
- def getAppHeader(self, msg, name):
- headers = self.getProperty(msg, "application_headers")
- if headers:
- return headers[name]
- return None
diff --git a/cpp/src/tests/install_env.sh.in b/cpp/src/tests/install_env.sh.in
deleted file mode 100644
index 2231954cb8..0000000000
--- a/cpp/src/tests/install_env.sh.in
+++ /dev/null
@@ -1,26 +0,0 @@
-#
-# 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.
-#
-
-absdir() { echo `cd $1 && pwd`; }
-
-prefix=`absdir @prefix@`
-export QPID_INSTALL_PREFIX=$prefix
-export PATH=$prefix/bin:$prefix/sbin:$prefix/libexec/qpid/tests:$PATH
-export LD_LIBRARY_PATH=$prefix/lib:$LD_LIBRARY_PATH
-export PYTHONPATH=$prefix/lib/python2.4/site-packages:$PYTHONPATH
diff --git a/cpp/src/tests/logging.cpp b/cpp/src/tests/logging.cpp
deleted file mode 100644
index fc55d642c3..0000000000
--- a/cpp/src/tests/logging.cpp
+++ /dev/null
@@ -1,385 +0,0 @@
-/*
- *
- * 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 "test_tools.h"
-#include "qpid/log/Logger.h"
-#include "qpid/log/Options.h"
-#include "qpid/log/OstreamOutput.h"
-#include "qpid/memory.h"
-#include "qpid/Options.h"
-#if defined (_WIN32)
-# include "qpid/log/windows/SinkOptions.h"
-#else
-# include "qpid/log/posix/SinkOptions.h"
-#endif
-
-#include <boost/test/floating_point_comparison.hpp>
-#include <boost/format.hpp>
-#include "unit_test.h"
-
-#include <exception>
-#include <fstream>
-#include <time.h>
-
-
-namespace qpid {
-namespace tests {
-
-QPID_AUTO_TEST_SUITE(loggingTestSuite)
-
-using namespace std;
-using namespace boost;
-using namespace qpid::log;
-
-QPID_AUTO_TEST_CASE(testStatementInit) {
- Statement s=QPID_LOG_STATEMENT_INIT(debug); int line=__LINE__;
- BOOST_CHECK(!s.enabled);
- BOOST_CHECK_EQUAL(string(__FILE__), s.file);
- BOOST_CHECK_EQUAL(line, s.line);
- BOOST_CHECK_EQUAL(debug, s.level);
-}
-
-
-QPID_AUTO_TEST_CASE(testSelector_enable) {
- Selector s;
- // Simple enable
- s.enable(debug,"foo");
- BOOST_CHECK(s.isEnabled(debug,"foo"));
- BOOST_CHECK(!s.isEnabled(error,"foo"));
- BOOST_CHECK(!s.isEnabled(error,"bar"));
-
- // Substring match
- BOOST_CHECK(s.isEnabled(debug, "bazfoobar"));
- BOOST_CHECK(!s.isEnabled(debug, "bazbar"));
-
- // Different levels for different substrings.
- s.enable(info, "bar");
- BOOST_CHECK(s.isEnabled(debug, "foobar"));
- BOOST_CHECK(s.isEnabled(info, "foobar"));
- BOOST_CHECK(!s.isEnabled(debug, "bar"));
- BOOST_CHECK(!s.isEnabled(info, "foo"));
-
- // Enable-strings
- s.enable("notice:blob");
- BOOST_CHECK(s.isEnabled(notice, "blob"));
- s.enable("error+:oops");
- BOOST_CHECK(s.isEnabled(error, "oops"));
- BOOST_CHECK(s.isEnabled(critical, "oops"));
-}
-
-QPID_AUTO_TEST_CASE(testStatementEnabled) {
- // Verify that the singleton enables and disables static
- // log statements.
- Logger& l = Logger::instance();
- ScopedSuppressLogging ls(l);
- l.select(Selector(debug));
- static Statement s=QPID_LOG_STATEMENT_INIT(debug);
- BOOST_CHECK(!s.enabled);
- static Statement::Initializer init(s);
- BOOST_CHECK(s.enabled);
-
- static Statement s2=QPID_LOG_STATEMENT_INIT(warning);
- static Statement::Initializer init2(s2);
- BOOST_CHECK(!s2.enabled);
-
- l.select(Selector(warning));
- BOOST_CHECK(!s.enabled);
- BOOST_CHECK(s2.enabled);
-}
-
-struct TestOutput : public Logger::Output {
- vector<string> msg;
- vector<Statement> stmt;
-
- TestOutput(Logger& l) {
- l.output(std::auto_ptr<Logger::Output>(this));
- }
-
- void log(const Statement& s, const string& m) {
- msg.push_back(m);
- stmt.push_back(s);
- }
- string last() { return msg.back(); }
-};
-
-using boost::assign::list_of;
-
-QPID_AUTO_TEST_CASE(testLoggerOutput) {
- Logger l;
- l.clear();
- l.select(Selector(debug));
- Statement s=QPID_LOG_STATEMENT_INIT(debug);
-
- TestOutput* out=new TestOutput(l);
-
- // Verify message is output.
- l.log(s, "foo");
- vector<string> expect=list_of("foo\n");
- BOOST_CHECK_EQUAL(expect, out->msg);
-
- // Verify multiple outputs
- TestOutput* out2=new TestOutput(l);
- l.log(Statement(), "baz");
- expect.push_back("baz\n");
- BOOST_CHECK_EQUAL(expect, out->msg);
- expect.erase(expect.begin());
- BOOST_CHECK_EQUAL(expect, out2->msg);
-}
-
-QPID_AUTO_TEST_CASE(testMacro) {
- Logger& l=Logger::instance();
- ScopedSuppressLogging ls(l);
- l.select(Selector(info));
- TestOutput* out=new TestOutput(l);
- QPID_LOG(info, "foo");
- vector<string> expect=list_of("foo\n");
- BOOST_CHECK_EQUAL(expect, out->msg);
- BOOST_CHECK_EQUAL(__FILE__, out->stmt.front().file);
-
- // Not enabled:
- QPID_LOG(debug, "bar");
- BOOST_CHECK_EQUAL(expect, out->msg);
-
- QPID_LOG(info, 42 << " bingo");
- expect.push_back("42 bingo\n");
- BOOST_CHECK_EQUAL(expect, out->msg);
-}
-
-QPID_AUTO_TEST_CASE(testLoggerFormat) {
- Logger& l = Logger::instance();
- ScopedSuppressLogging ls(l);
- l.select(Selector(critical));
- TestOutput* out=new TestOutput(l);
-
- l.format(Logger::FILE);
- QPID_LOG(critical, "foo");
- BOOST_CHECK_EQUAL(out->last(), string(__FILE__)+": foo\n");
-
- l.format(Logger::FILE|Logger::LINE);
- QPID_LOG(critical, "foo");
- BOOST_CHECK_EQUAL(out->last().find(__FILE__), 0u);
-
- l.format(Logger::FUNCTION);
- QPID_LOG(critical, "foo");
- BOOST_CHECK_EQUAL(string(BOOST_CURRENT_FUNCTION) + ": foo\n", out->last());
-
- l.format(Logger::LEVEL);
- QPID_LOG(critical, "foo");
- BOOST_CHECK_EQUAL("critical foo\n", out->last());
-}
-
-QPID_AUTO_TEST_CASE(testOstreamOutput) {
- Logger& l=Logger::instance();
- ScopedSuppressLogging ls(l);
- l.select(Selector(error));
- ostringstream os;
- l.output(qpid::make_auto_ptr<Logger::Output>(new OstreamOutput(os)));
- QPID_LOG(error, "foo");
- QPID_LOG(error, "bar");
- QPID_LOG(error, "baz");
- BOOST_CHECK_EQUAL("foo\nbar\nbaz\n", os.str());
-}
-
-#if 0 // This test requires manual intervention. Normally disabled.
-QPID_AUTO_TEST_CASE(testSyslogOutput) {
- Logger& l=Logger::instance();
- Logger::StateSaver ls(l);
- l.clear();
- l.select(Selector(info));
- l.syslog("qpid_test");
- QPID_LOG(info, "Testing QPID");
- BOOST_ERROR("Manually verify that /var/log/messages contains a recent line 'Testing QPID'");
-}
-#endif // 0
-
-int count() {
- static int n = 0;
- return n++;
-}
-
-int loggedCount() {
- static int n = 0;
- QPID_LOG(debug, "counting: " << n);
- return n++;
-}
-
-
-using namespace qpid::sys;
-
-// Measure CPU time.
-clock_t timeLoop(int times, int (*fp)()) {
- clock_t start=clock();
- while (times-- > 0)
- (*fp)();
- return clock() - start;
-}
-
-// Overhead test disabled because it consumes a ton of CPU and takes
-// forever under valgrind. Not friendly for regular test runs.
-//
-#if 0
-QPID_AUTO_TEST_CASE(testOverhead) {
- // Ensure that the ratio of CPU time for an incrementing loop
- // with and without disabled log statements is in acceptable limits.
- //
- int times=100000000;
- clock_t noLog=timeLoop(times, count);
- clock_t withLog=timeLoop(times, loggedCount);
- double ratio=double(withLog)/double(noLog);
-
- // NB: in initial tests the ratio was consistently below 1.5,
- // 2.5 is reasonable and should avoid spurios failures
- // due to machine load.
- //
- BOOST_CHECK_SMALL(ratio, 2.5);
-}
-#endif // 0
-
-Statement statement(
- Level level, const char* file="", int line=0, const char* fn=0)
-{
- Statement s={0, file, line, fn, level};
- return s;
-}
-
-
-#define ARGC(argv) (sizeof(argv)/sizeof(char*))
-
-QPID_AUTO_TEST_CASE(testOptionsParse) {
- const char* argv[]={
- 0,
- "--log-enable", "error+:foo",
- "--log-enable", "debug:bar",
- "--log-enable", "info",
- "--log-to-stderr", "no",
- "--log-to-file", "logout",
- "--log-level", "yes",
- "--log-source", "1",
- "--log-thread", "true",
- "--log-function", "YES"
- };
- qpid::log::Options opts("");
-#ifdef _WIN32
- qpid::log::windows::SinkOptions sinks("test");
-#else
- qpid::log::posix::SinkOptions sinks("test");
-#endif
- opts.parse(ARGC(argv), const_cast<char**>(argv));
- sinks = *opts.sinkOptions;
- vector<string> expect=list_of("error+:foo")("debug:bar")("info");
- BOOST_CHECK_EQUAL(expect, opts.selectors);
- BOOST_CHECK(!sinks.logToStderr);
- BOOST_CHECK(!sinks.logToStdout);
- BOOST_CHECK(sinks.logFile == "logout");
- BOOST_CHECK(opts.level);
- BOOST_CHECK(opts.source);
- BOOST_CHECK(opts.function);
- BOOST_CHECK(opts.thread);
-}
-
-QPID_AUTO_TEST_CASE(testOptionsDefault) {
- qpid::log::Options opts("");
-#ifdef _WIN32
- qpid::log::windows::SinkOptions sinks("test");
-#else
- qpid::log::posix::SinkOptions sinks("test");
-#endif
- sinks = *opts.sinkOptions;
- BOOST_CHECK(sinks.logToStderr);
- BOOST_CHECK(!sinks.logToStdout);
- BOOST_CHECK(sinks.logFile.length() == 0);
- vector<string> expect=list_of("notice+");
- BOOST_CHECK_EQUAL(expect, opts.selectors);
- BOOST_CHECK(opts.time && opts.level);
- BOOST_CHECK(!(opts.source || opts.function || opts.thread));
-}
-
-QPID_AUTO_TEST_CASE(testSelectorFromOptions) {
- const char* argv[]={
- 0,
- "--log-enable", "error+:foo",
- "--log-enable", "debug:bar",
- "--log-enable", "info"
- };
- qpid::log::Options opts("");
- opts.parse(ARGC(argv), const_cast<char**>(argv));
- vector<string> expect=list_of("error+:foo")("debug:bar")("info");
- BOOST_CHECK_EQUAL(expect, opts.selectors);
- Selector s(opts);
- BOOST_CHECK(!s.isEnabled(warning, "x"));
- BOOST_CHECK(!s.isEnabled(debug, "x"));
- BOOST_CHECK(s.isEnabled(debug, "bar"));
- BOOST_CHECK(s.isEnabled(error, "foo"));
- BOOST_CHECK(s.isEnabled(critical, "foo"));
-}
-
-QPID_AUTO_TEST_CASE(testLoggerStateure) {
- Logger& l=Logger::instance();
- ScopedSuppressLogging ls(l);
- qpid::log::Options opts("test");
- const char* argv[]={
- 0,
- "--log-time", "no",
- "--log-source", "yes",
- "--log-to-stderr", "no",
- "--log-to-file", "logging.tmp",
- "--log-enable", "critical"
- };
- opts.parse(ARGC(argv), const_cast<char**>(argv));
- l.configure(opts);
- QPID_LOG(critical, "foo"); int srcline=__LINE__;
- ifstream log("logging.tmp");
- string line;
- getline(log, line);
- string expect=(format("critical %s:%d: foo")%__FILE__%srcline).str();
- BOOST_CHECK_EQUAL(expect, line);
- log.close();
- unlink("logging.tmp");
-}
-
-QPID_AUTO_TEST_CASE(testQuoteNonPrintable) {
- Logger& l=Logger::instance();
- ScopedSuppressLogging ls(l);
- qpid::log::Options opts("test");
- opts.time=false;
-#ifdef _WIN32
- qpid::log::windows::SinkOptions *sinks =
- dynamic_cast<qpid::log::windows::SinkOptions *>(opts.sinkOptions.get());
-#else
- qpid::log::posix::SinkOptions *sinks =
- dynamic_cast<qpid::log::posix::SinkOptions *>(opts.sinkOptions.get());
-#endif
- sinks->logToStderr = false;
- sinks->logFile = "logging.tmp";
- l.configure(opts);
-
- char s[] = "null\0tab\tspace newline\nret\r\x80\x99\xff";
- string str(s, sizeof(s));
- QPID_LOG(critical, str);
- ifstream log("logging.tmp");
- string line;
- getline(log, line, '\0');
- string expect="critical null\\x00tab\tspace newline\nret\r\\x80\\x99\\xFF\\x00\n";
- BOOST_CHECK_EQUAL(expect, line);
- log.close();
- unlink("logging.tmp");
-}
-
-QPID_AUTO_TEST_SUITE_END()
-
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/long_cluster_tests.py b/cpp/src/tests/long_cluster_tests.py
deleted file mode 100755
index f77837f0c4..0000000000
--- a/cpp/src/tests/long_cluster_tests.py
+++ /dev/null
@@ -1,38 +0,0 @@
-#!/usr/bin/env python
-
-# 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.
-#
-
-import os, signal, sys, unittest
-from testlib import TestBaseCluster
-
-class LongClusterTests(TestBaseCluster):
- """Long/Soak cluster tests with async store ability"""
-
-
- def test_LongCluster_01_DummyTest(self):
- """Dummy test - a placeholder for the first of the long/soak python cluster tests"""
- pass
-
-# Start the test here
-
-if __name__ == '__main__':
- if os.getenv("STORE_LIB") != None:
- print "NOTE: Store enabled for the following tests:"
- if not unittest.main(): sys.exit(1)
-
diff --git a/cpp/src/tests/multiq_perftest b/cpp/src/tests/multiq_perftest
deleted file mode 100755
index 10f9edd2a6..0000000000
--- a/cpp/src/tests/multiq_perftest
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/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.
-#
-
-exec `dirname $0`/run_perftest 10000 --mode shared --qt 16
diff --git a/cpp/src/tests/perfdist b/cpp/src/tests/perfdist
deleted file mode 100755
index 59548b23f7..0000000000
--- a/cpp/src/tests/perfdist
+++ /dev/null
@@ -1,87 +0,0 @@
-#!/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.
-#
-
-
-#
-# Distributed perftest.
-# Runs perftest clients on multiple hosts using ssh.
-#
-
-set -e
-usage() {
-cat <<EOF
-usage: $0 <perftest-args> -- <client-hosts ...> [ --- <broker hosts...> ]
-Client & broker hosts can also be set in env vars CLIENTS and BROKERS.
-
-Run perftest clients on the client hosts against brokers on the broker
-hosts Clients are assigned to client hosts round robin: publishers
-first, then subscribers. If there are multiple brokers (for cluster
-tests) clients connect to them round robin.
-
-Broker hosts can be listed with -b in perftest-args or after ---
-at the end of the arguments.
-
-Error: $*
-EOF
-exit 1
-}
-
-TESTDIR=${TESTDIR:-$PWD} # Absolute path to test exes on all hosts.
-
-collect() { eval $COLLECT=\""\$$COLLECT $*"\"; }
-NPUBS=1
-NSUBS=1
-COLLECT=ARGS
-while test $# -gt 0; do
- case $1 in
- --publish|--subscribe|--setup|--control) usage "Don't pass perftest action flags: $1" ;;
- --npubs) collect $1 $2; NPUBS=$2; shift 2 ;;
- --nsubs) collect $1 $2; NSUBS=$2; shift 2 ;;
- -s|--summary) collect $1; QUIET=yes; shift 1 ;;
- -b|--broker) BROKERS="$BROKERS $2"; shift 2;;
- --) COLLECT=CLIENTARG; shift ;;
- ---) COLLECT=BROKERARG; shift;;
- *) collect $1; shift ;;
- esac
-done
-
-CLIENTS=${CLIENTARG:-$CLIENTS}
-if [ -z "$CLIENTS" ]; then usage "No client hosts listed after --"; fi
-BROKERS=${BROKERARG:-$BROKERS}
-if [ -z "$BROKERS" ]; then usage "No brokers specified"; fi
-
-PERFTEST="$TESTDIR/perftest $ARGS"
-
-CLIENTS=($CLIENTS)
-BROKERS=($BROKERS)
-start() {
- CLIENT=${CLIENTS[i % ${#CLIENTS[*]}]}
- BROKER=${BROKERS[i % ${#BROKERS[*]}]}
- ARGS="$* --broker $BROKER"
- cmd="ssh -n $CLIENT $PERFTEST $ARGS"
- test -z "$QUIET" && echo "Client $i: $cmd"
- $cmd &
-}
-
-$PERFTEST --setup -b ${BROKERS[0]}
-for (( i=0 ; i < $NPUBS ; ++i)); do start --publish; done
-for (( ; i < $NPUBS+$NSUBS ; ++i)); do start --subscribe; done
-$PERFTEST --control -b ${BROKERS[0]}
diff --git a/cpp/src/tests/policy.acl b/cpp/src/tests/policy.acl
deleted file mode 100644
index ef46026555..0000000000
--- a/cpp/src/tests/policy.acl
+++ /dev/null
@@ -1 +0,0 @@
-acl allow all all
diff --git a/cpp/src/tests/publish.cpp b/cpp/src/tests/publish.cpp
deleted file mode 100644
index 3f456e7588..0000000000
--- a/cpp/src/tests/publish.cpp
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- *
- * 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.
- *
- */
-
-#include <algorithm>
-#include <iostream>
-#include <memory>
-#include <sstream>
-#include <vector>
-
-#include "TestOptions.h"
-#include "qpid/client/Connection.h"
-#include "qpid/client/Message.h"
-#include "qpid/client/AsyncSession.h"
-#include "qpid/client/SubscriptionManager.h"
-
-using namespace qpid;
-using namespace qpid::client;
-using namespace qpid::sys;
-using namespace std;
-
-namespace qpid {
-namespace tests {
-
-typedef vector<string> StringSet;
-
-struct Args : public qpid::TestOptions {
- uint size;
- uint count;
- bool durable;
- string destination;
- string routingKey;
- bool summary;
- bool id;
-
- Args() : size(256), count(1000), durable(true), routingKey("publish-consume"), summary(false), id(false) {
- addOptions()
- ("size", optValue(size, "N"), "message size")
- ("count", optValue(count, "N"), "number of messages to publish")
- ("durable", optValue(durable, "yes|no"), "use durable messages")
- ("destination", optValue(destination, "<exchange name>"), "destination to publish to")
- ("routing-key", optValue(routingKey, "<key>"), "routing key to publish with")
- ("summary,s", optValue(summary), "Output only the rate.")
- ("id", optValue(id), "Add unique correlation ID");
- }
-};
-
-Args opts;
-
-struct Client
-{
- Connection connection;
- AsyncSession session;
-
- Client()
- {
- opts.open(connection);
- session = connection.newSession();
- }
-
- // Cheap hex calculation, avoid expensive ostrstream and string
- // creation to generate correlation ids in message loop.
- char hex(char i) { return i<10 ? '0'+i : 'A'+i-10; }
- void hex(char i, string& s) {
- s[0]=hex(i>>24); s[1]=hex(i>>16); s[2]=hex(i>>8); s[3]=i;
- }
-
- void publish()
- {
- AbsTime begin=now();
- Message msg(string(opts.size, 'X'), opts.routingKey);
- string correlationId = "0000";
- if (opts.durable)
- msg.getDeliveryProperties().setDeliveryMode(framing::PERSISTENT);
-
- for (uint i = 0; i < opts.count; i++) {
- if (opts.id) {
- hex(i+1, correlationId);
- msg.getMessageProperties().setCorrelationId(correlationId);
- }
- session.messageTransfer(arg::destination=opts.destination,
- arg::content=msg,
- arg::acceptMode=1);
- }
- session.sync();
- AbsTime end=now();
- double secs(double(Duration(begin,end))/TIME_SEC);
- if (opts.summary) cout << opts.count/secs << endl;
- else cout << "Time: " << secs << "s Rate: " << opts.count/secs << endl;
- }
-
- ~Client()
- {
- try{
- session.close();
- connection.close();
- } catch(const exception& e) {
- cout << e.what() << endl;
- }
- }
-};
-
-}} // namespace qpid::tests
-
-using namespace qpid::tests;
-
-int main(int argc, char** argv)
-{
- try {
- opts.parse(argc, argv);
- Client client;
- client.publish();
- return 0;
- } catch(const exception& e) {
- cout << e.what() << endl;
- }
- return 1;
-}
diff --git a/cpp/src/tests/python_tests b/cpp/src/tests/python_tests
deleted file mode 100755
index 0216b5ca7b..0000000000
--- a/cpp/src/tests/python_tests
+++ /dev/null
@@ -1,29 +0,0 @@
-#!/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 python tests.
-source ./test_env.sh
-test -d $PYTHON_DIR || { echo "Skipping python tests, no python dir."; exit 0; }
-QPID_PORT=${QPID_PORT:-5672}
-PYTHON_TESTS=${PYTHON_TESTS:-$*}
-FAILING=${FAILING:-/dev/null}
-
-python $QPID_PYTHON_TEST -m qpid_tests.broker_0_10 -m qpid.tests -b localhost:$QPID_PORT -I $FAILING $PYTHON_TESTS || exit 1
diff --git a/cpp/src/tests/python_tests.ps1 b/cpp/src/tests/python_tests.ps1
deleted file mode 100644
index 9f8b9890c4..0000000000
--- a/cpp/src/tests/python_tests.ps1
+++ /dev/null
@@ -1,45 +0,0 @@
-#
-# 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 python tests; intended to be run by run_test.ps1 which sets up
-# QPID_PORT
-$srcdir = Split-Path $myInvocation.InvocationName
-$PYTHON_DIR = "$srcdir\..\..\..\python"
-if (!(Test-Path $PYTHON_DIR -pathType Container)) {
- "Skipping python tests as python libs not found"
- exit 1
-}
-
-$PYTHON_TEST_DIR = "$srcdir\..\..\..\tests\src\py"
-$QMF_LIB = "$srcdir\..\..\..\extras\qmf\src\py"
-
-if (Test-Path env:FAILING) {
- $fails = "-I $env:FAILING"
-}
-if (Test-Path env:PYTHON_TESTS) {
- $tests = "$env:PYTHON_TESTS"
-}
-else {
- $tests = "$args"
-}
-
-#cd $PYTHON_DIR
-$env:PYTHONPATH="$PYTHON_DIR;$PYTHON_TEST_DIR;$env:PYTHONPATH;$QMF_LIB"
-python $PYTHON_DIR/qpid-python-test -m qpid_tests.broker_0_10 -m qpid.tests -b localhost:$env:QPID_PORT $fails $tests
-exit $LASTEXITCODE
diff --git a/cpp/src/tests/qpid-build-rinstall b/cpp/src/tests/qpid-build-rinstall
deleted file mode 100755
index 1a92f8750a..0000000000
--- a/cpp/src/tests/qpid-build-rinstall
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/bin/sh
-#
-# Licensed to the Apache Software Foundation (ASF) under onemake
-# 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 "make install"" locally then copy the install tree to each of $HOSTS
-# Must be run in a configured qpid build directory.
-#
-test -f config.status || { echo "Not in a configured build directory."; usage; }
-. src/tests/install_env.sh
-set -ex
-make && make -j1 install
-rsynchosts $QPID_INSTALL_PREFIX
diff --git a/cpp/src/tests/qpid-client-test.cpp b/cpp/src/tests/qpid-client-test.cpp
deleted file mode 100644
index 2f5e8e5afe..0000000000
--- a/cpp/src/tests/qpid-client-test.cpp
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- *
- * 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.
- *
- */
-
-/**
- * This file provides a simple test (and example) of basic
- * functionality including declaring an exchange and a queue, binding
- * these together, publishing a message and receiving that message
- * asynchronously.
- */
-
-#include <iostream>
-
-#include "TestOptions.h"
-#include "qpid/client/Connection.h"
-#include "qpid/client/Message.h"
-#include "qpid/client/Session.h"
-#include "qpid/client/SubscriptionManager.h"
-
-
-using namespace qpid;
-using namespace qpid::client;
-using namespace qpid::framing;
-using std::string;
-
-namespace qpid {
-namespace tests {
-
-struct Args : public TestOptions {
- uint msgSize;
- bool verbose;
-
- Args() : TestOptions("Simple test of Qpid c++ client; sends and receives a single message."), msgSize(26)
- {
- addOptions()
- ("size", optValue(msgSize, "N"), "message size")
- ("verbose", optValue(verbose), "print out some status messages");
- }
-};
-
-const std::string chars("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ");
-
-std::string generateData(uint size)
-{
- if (size < chars.length()) {
- return chars.substr(0, size);
- }
- std::string data;
- for (uint i = 0; i < (size / chars.length()); i++) {
- data += chars;
- }
- data += chars.substr(0, size % chars.length());
- return data;
-}
-
-void print(const std::string& text, const Message& msg)
-{
- std::cout << text;
- if (msg.getData().size() > 16) {
- std::cout << msg.getData().substr(0, 16) << "...";
- } else {
- std::cout << msg.getData();
- }
- std::cout << std::endl;
-}
-
-}} // namespace qpid::tests
-
-using namespace qpid::tests;
-
-int main(int argc, char** argv)
-{
- try {
- Args opts;
- opts.parse(argc, argv);
-
- //Connect to the broker:
- Connection connection;
- opts.open(connection);
- if (opts.verbose) std::cout << "Opened connection." << std::endl;
-
- //Create and open a session on the connection through which
- //most functionality is exposed:
- Session session = connection.newSession();
- if (opts.verbose) std::cout << "Opened session." << std::endl;
-
-
- //'declare' the exchange and the queue, which will create them
- //as they don't exist
- session.exchangeDeclare(arg::exchange="MyExchange", arg::type="direct");
- if (opts.verbose) std::cout << "Declared exchange." << std::endl;
- session.queueDeclare(arg::queue="MyQueue", arg::autoDelete=true, arg::exclusive=true);
- if (opts.verbose) std::cout << "Declared queue." << std::endl;
-
- //now bind the queue to the exchange
- session.exchangeBind(arg::exchange="MyExchange", arg::queue="MyQueue", arg::bindingKey="MyKey");
- if (opts.verbose) std::cout << "Bound queue to exchange." << std::endl;
-
- //create and send a message to the exchange using the routing
- //key we bound our queue with:
- Message msgOut(generateData(opts.msgSize));
- msgOut.getDeliveryProperties().setRoutingKey("MyKey");
- session.messageTransfer(arg::destination="MyExchange", arg::content=msgOut, arg::acceptMode=1);
- if (opts.verbose) print("Published message: ", msgOut);
-
- // Using the SubscriptionManager, get the message from the queue.
- SubscriptionManager subs(session);
- Message msgIn = subs.get("MyQueue");
- if (msgIn.getData() == msgOut.getData())
- if (opts.verbose) std::cout << "Received the exepected message." << std::endl;
-
- //close the session & connection
- session.close();
- if (opts.verbose) std::cout << "Closed session." << std::endl;
- connection.close();
- if (opts.verbose) std::cout << "Closed connection." << std::endl;
- return 0;
- } catch(const std::exception& e) {
- std::cout << e.what() << std::endl;
- }
- return 1;
-}
diff --git a/cpp/src/tests/qpid-cluster-benchmark b/cpp/src/tests/qpid-cluster-benchmark
deleted file mode 100755
index ff787a46dd..0000000000
--- a/cpp/src/tests/qpid-cluster-benchmark
+++ /dev/null
@@ -1,58 +0,0 @@
-#!/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.
-#
-
-# Benchmark script for comparing cluster performance.
-
-# Default values
-PORT="5672"
-COUNT=10000
-FLOW=100 # Flow control limit on queue depth for latency.
-REPEAT=10
-QUEUES=4
-CLIENTS=3
-
-while getopts "p:c:f:r:t:b:q:c" opt; do
- case $opt in
- p) PORT=$OPTARG;;
- c) COUNT=$OPTARG;;
- f) FLOW=$OPTARG;;
- r) REPEAT=$OPTARG;;
- s) SCALE=$OPTARG;;
- b) BROKERS=$OPTARG;;
- q) QUEUES=$OPTARG;;
- c) CLIENTS=$OPTARG;;
- *) echo "Unknown option"; exit 1;;
- esac
-done
-
-BROKERS=${BROKERS:-$(echo $HOSTS | sed "s/\>/:$PORT/g;s/ /,/g")} # Broker URL list
-BROKER=`echo $BROKERS | awk -F, '{print $1}'` # First broker
-
-run_test() { echo $*; shift; "$@"; echo; echo; echo; }
-
-# Multiple pubs/subs connect via multiple brokers (active-active)
-run_test "multi-host-thruput" qpid-cpp-benchmark --repeat $REPEAT -b $BROKERS --no-timestamp --summarize -q$QUEUES -s$CLIENTS -r$CLIENTS -m $COUNT
-
-# Multiple pubs/subs connect via single broker (active-passive)
-run_test "single-host-thruput" qpid-cpp-benchmark --repeat $REPEAT -b $BROKER --no-timestamp --summarize -q$QUEUES -s$CLIENTS -r$CLIENTS -m $COUNT
-
-# Latency
-run_test "latency" qpid-cpp-benchmark --repeat $REPEAT -b $BROKER --connection-options '{tcp-nodelay:true}' -m $COUNT --flow-control $FLOW
-
diff --git a/cpp/src/tests/qpid-cluster-lag.py b/cpp/src/tests/qpid-cluster-lag.py
deleted file mode 100755
index 5b24353241..0000000000
--- a/cpp/src/tests/qpid-cluster-lag.py
+++ /dev/null
@@ -1,93 +0,0 @@
-#!/usr/bin/env python
-
-# 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.
-#
-
-"""%prog [options] broker...
-Check for brokers that lag behind other brokers in a cluster."""
-
-import os, os.path, sys, socket, time, re
-from qpid.messaging import *
-from optparse import OptionParser
-from threading import Thread
-
-class Browser(Thread):
- def __init__(self, broker, queue, timeout):
- Thread.__init__(self)
- self.broker = broker
- self.queue = queue
- self.timeout = timeout
- self.error = None
- self.time = None
-
- def run(self):
- try:
- self.connection = Connection(self.broker)
- self.connection.open()
- self.session = self.connection.session()
- self.receiver = self.session.receiver("%s;{mode:browse}"%self.queue)
- self.msg = self.receiver.fetch(timeout=self.timeout)
- self.time = time.time()
- if (self.msg.content != self.queue):
- raise Exception("Wrong message content, expected '%s' found '%s'"%
- (self.queue, self.msg.content))
- except Empty:
- self.error = "No message on queue %s"%self.queue
- except Exception, e:
- self.error = "Error: %s"%e
-
-def main(argv):
- op = OptionParser(usage=__doc__)
- op.add_option("--timeout", type="float", default=None, metavar="TIMEOUT",
- help="Give up after TIMEOUT milliseconds, default never timeout")
- (opts, args) = op.parse_args(argv)
- if (len(args) <= 1): op.error("No brokers were specified")
- brokers = args[1:]
-
- # Put a message on a uniquely named queue.
- queue = "%s:%s:%s"%(os.path.basename(args[0]), socket.gethostname(), os.getpid())
- connection = Connection(brokers[0])
- connection.open()
- session = connection.session()
- sender = session.sender(
- "%s;{create:always,delete:always,node:{durable:False}}"%queue)
- sender.send(Message(content=queue))
- start = time.time()
- # Browse for the message on each broker
- if opts.timeout: opts.timeout
- threads = [Browser(b, queue, opts.timeout) for b in brokers]
- for t in threads: t.start()
- delays=[]
-
- for t in threads:
- t.join()
- if t.error:
- delay=t.error
- else:
- delay = t.time-start
- delays.append([delay, t.broker])
- print "%s: %s"%(t.broker,delay)
- if delays:
- delays.sort()
- print "lag: %s (%s-%s)"%(delays[-1][0] - delays[0][0], delays[-1][1], delays[0][1])
- # Clean up
- sender.close()
- session.close()
- connection.close()
-
-if __name__ == "__main__": sys.exit(main(sys.argv))
diff --git a/cpp/src/tests/qpid-cpp-benchmark b/cpp/src/tests/qpid-cpp-benchmark
deleted file mode 100755
index 6138108558..0000000000
--- a/cpp/src/tests/qpid-cpp-benchmark
+++ /dev/null
@@ -1,260 +0,0 @@
-#!/usr/bin/env python
-#
-# 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.
-#
-
-import optparse, time, qpid.messaging, re
-from threading import Thread
-from subprocess import Popen, PIPE, STDOUT
-
-op = optparse.OptionParser(usage="usage: %prog [options]",
- description="simple performance benchmarks")
-op.add_option("-b", "--broker", default=[], action="append", type="str",
- help="url of broker(s) to connect to, round robin on multiple brokers")
-op.add_option("-c", "--client-host", default=[], action="append", type="str",
- help="host(s) to run clients on via ssh, round robin on mulple hosts")
-op.add_option("-q", "--queues", default=1, type="int", metavar="N",
- help="create N queues (default %default)")
-op.add_option("-s", "--senders", default=1, type="int", metavar="N",
- help="start N senders per queue (default %default)")
-op.add_option("-r", "--receivers", default=1, type="int", metavar="N",
- help="start N receivers per queue (default %default)")
-op.add_option("-m", "--messages", default=100000, type="int", metavar="N",
- help="send N messages per sender (default %default)")
-op.add_option("--queue-name", default="benchmark", metavar="NAME",
- help="base name for queues (default %default)")
-op.add_option("--send-rate", default=0, metavar="N",
- help="send rate limited to N messages/second, 0 means no limit (default %default)")
-op.add_option("--receive-rate", default=0, metavar="N",
- help="receive rate limited to N messages/second, 0 means no limit (default %default)")
-op.add_option("--content-size", default=1024, type="int", metavar="BYTES",
- help="message size in bytes (default %default)")
-op.add_option("--ack-frequency", default=100, metavar="N", type="int",
- help="receiver ack's every N messages, 0 means unconfirmed (default %default)")
-op.add_option("--no-report-header", dest="report_header", default=True,
- action="store_false", help="don't print header on report")
-op.add_option("--summarize", default=False, action="store_true",
- help="print summary statistics for multiple senders/receivers: total throughput, average latency")
-op.add_option("--repeat", default=1, metavar="N", help="repeat N times", type="int")
-op.add_option("--send-option", default=[], action="append", type="str",
- help="Additional option for sending addresses")
-op.add_option("--receive-option", default=[], action="append", type="str",
- help="Additional option for receiving addresses")
-op.add_option("--send-arg", default=[], action="append", type="str",
- help="Additional argument for qpid-send")
-op.add_option("--receive-arg", default=[], action="append", type="str",
- help="Additional argument for qpid-receive")
-op.add_option("--no-timestamp", dest="timestamp", default=True,
- action="store_false", help="don't add a timestamp, no latency results")
-op.add_option("--connection-options", type="str",
- help="Connection options for senders & receivers")
-op.add_option("--flow-control", default=0, type="int", metavar="N",
- help="Flow control each sender to limit queue depth to 2*N. 0 means no flow control.")
-op.add_option("--durable", default=False, action="store_true",
- help="Use durable queues and messages")
-
-single_quote_re = re.compile("'")
-def posix_quote(string):
- """ Quote a string for use as an argument in a posix shell"""
- return "'" + single_quote_re.sub("\\'", string) + "'";
-
-def ssh_command(host, command):
- """Convert command into an ssh command on host with quoting"""
- return ["ssh", host] + [posix_quote(arg) for arg in command]
-
-class Clients:
- def __init__(self): self.clients=[]
-
- def add(self, client):
- self.clients.append(client)
- return client
-
- def kill(self):
- for c in self.clients:
- try: c.kill()
- except: pass
-
-clients = Clients()
-
-def start_receive(queue, index, opts, ready_queue, broker, host):
- address_opts=["create:receiver"] + opts.receive_option
- if opts.durable: address_opts += ["node:{durable:true}"]
- address="%s;{%s}"%(queue,",".join(address_opts))
- msg_total=opts.senders*opts.messages
- messages = msg_total/opts.receivers;
- if (index < msg_total%opts.receivers): messages += 1
- if (messages == 0): return None
- command = ["qpid-receive",
- "-b", broker,
- "-a", address,
- "-m", str(messages),
- "--forever",
- "--print-content=no",
- "--receive-rate", str(opts.receive_rate),
- "--report-total",
- "--ack-frequency", str(opts.ack_frequency),
- "--ready-address", ready_queue,
- "--report-header=no"
- ]
- command += opts.receive_arg
- if opts.connection_options:
- command += ["--connection-options",opts.connection_options]
- if host: command = ssh_command(host, command)
- return clients.add(Popen(command, stdout=PIPE))
-
-def start_send(queue, opts, broker, host):
- address="%s;{%s}"%(queue,",".join(opts.send_option))
- command = ["qpid-send",
- "-b", broker,
- "-a", address,
- "--messages", str(opts.messages),
- "--content-size", str(opts.content_size),
- "--send-rate", str(opts.send_rate),
- "--report-total",
- "--report-header=no",
- "--timestamp=%s"%(opts.timestamp and "yes" or "no"),
- "--sequence=no",
- "--flow-control", str(opts.flow_control),
- "--durable", str(opts.durable)
- ]
- command += opts.send_arg
- if opts.connection_options:
- command += ["--connection-options",opts.connection_options]
- if host: command = ssh_command(host, command)
- return clients.add(Popen(command, stdout=PIPE))
-
-def first_line(p):
- out,err=p.communicate()
- if p.returncode != 0: raise Exception("Process failed: %s"%(out.strip()))
- return out.split("\n")[0]
-
-def delete_queues(queues, broker):
- c = qpid.messaging.Connection(broker)
- c.open()
- for q in queues:
- try:
- s = c.session()
- snd = s.sender("%s;{delete:always}"%(q))
- snd.close()
- s.sync()
- except qpid.messaging.exceptions.NotFound: pass # Ignore "no such queue"
- c.close()
-
-def print_header(timestamp):
- if timestamp: latency_header="\tl-min\tl-max\tl-avg"
- else: latency_header=""
- print "send-tp\t\trecv-tp%s"%latency_header
-
-def parse(parser, lines): # Parse sender/receiver output
- for l in lines:
- fn_val = zip(parser, l)
- return [map(lambda p: p[0](p[1]), zip(parser,line.split())) for line in lines]
-
-def parse_senders(senders):
- return parse([int],[first_line(p) for p in senders])
-
-def parse_receivers(receivers):
- return parse([int,float,float,float],[first_line(p) for p in receivers if p])
-
-def print_data(send_stats, recv_stats):
- for send,recv in map(None, send_stats, recv_stats):
- line=""
- if send: line += "%d"%send[0]
- if recv:
- line += "\t\t%d"%recv[0]
- if len(recv) == 4: line += "\t%.2f\t%.2f\t%.2f"%tuple(recv[1:])
- print line
-
-def print_summary(send_stats, recv_stats):
- def avg(s): sum(s) / len(s)
- send_tp = sum([l[0] for l in send_stats])
- recv_tp = sum([l[0] for l in recv_stats])
- summary = "%d\t\t%d"%(send_tp, recv_tp)
- if recv_stats and len(recv_stats[0]) == 4:
- l_min = sum(l[1] for l in recv_stats)/len(recv_stats)
- l_max = sum(l[2] for l in recv_stats)/len(recv_stats)
- l_avg = sum(l[3] for l in recv_stats)/len(recv_stats)
- summary += "\t%.2f\t%.2f\t%.2f"%(l_min, l_max, l_avg)
- print summary
-
-
-class ReadyReceiver:
- """A receiver for ready messages"""
- def __init__(self, queue, broker):
- delete_queues([queue], broker)
- self.connection = qpid.messaging.Connection(broker)
- self.connection.open()
- self.receiver = self.connection.session().receiver(
- "%s;{create:receiver,delete:receiver,node:{durable:false}}"%(queue))
- self.receiver.session.sync()
- self.timeout=10
-
- def wait(self, receivers):
- try:
- for i in receivers: self.receiver.fetch(self.timeout)
- self.connection.close()
- except qpid.messaging.Empty:
- for r in receivers:
- if (r.poll() is not None):
- out,err=r.communicate()
- raise Exception("Receiver error: %s"%(out))
- raise Exception("Timed out waiting for receivers to be ready")
-
-def flatten(l): return sum(map(lambda s: s.split(","), l),[])
-
-class RoundRobin:
- def __init__(self,items):
- self.items = items
- self.index = 0
-
- def next(self):
- if not self.items: return None
- ret = self.items[self.index]
- self.index = (self.index+1)%len(self.items)
- return ret
-
-def main():
- opts, args = op.parse_args()
- if not opts.broker: opts.broker = ["127.0.0.1"] # Deafult to local broker
- opts.broker = flatten(opts.broker)
- opts.client_host = flatten(opts.client_host)
- brokers = RoundRobin(opts.broker)
- client_hosts = RoundRobin(opts.client_host)
- send_out = ""
- receive_out = ""
- ready_queue="%s-ready"%(opts.queue_name)
- queues = ["%s-%s"%(opts.queue_name, i) for i in xrange(opts.queues)]
- try:
- for i in xrange(opts.repeat):
- delete_queues(queues, opts.broker[0])
- ready_receiver = ReadyReceiver(ready_queue, opts.broker[0])
- receivers = [start_receive(q, j, opts, ready_queue, brokers.next(), client_hosts.next())
- for q in queues for j in xrange(opts.receivers)]
- ready_receiver.wait(filter(None, receivers)) # Wait for receivers to be ready.
- senders = [start_send(q, opts,brokers.next(), client_hosts.next())
- for q in queues for j in xrange(opts.senders)]
- if opts.report_header and i == 0: print_header(opts.timestamp)
- send_stats=parse_senders(senders)
- recv_stats=parse_receivers(receivers)
- if opts.summarize: print_summary(send_stats, recv_stats)
- else: print_data(send_stats, recv_stats)
- delete_queues(queues, opts.broker[0])
- finally: clients.kill() # No strays
-
-if __name__ == "__main__": main()
-
diff --git a/cpp/src/tests/qpid-ctrl b/cpp/src/tests/qpid-ctrl
deleted file mode 100755
index 4246c57898..0000000000
--- a/cpp/src/tests/qpid-ctrl
+++ /dev/null
@@ -1,120 +0,0 @@
-#!/usr/bin/env python
-#
-# 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.
-#
-
-import optparse
-from qpid.messaging import *
-from qpid.util import URL
-from qpid.log import enable, DEBUG, WARN
-
-def nameval(st):
- idx = st.find("=")
- if idx >= 0:
- name = st[0:idx]
- value = st[idx+1:]
- else:
- name = st
- value = None
- return name, value
-
-def list_map_entries(m):
- r = ""
- for t in m:
- r += "%s=%s " % (t, m[t])
- return r
-
-def get_qmfv2_result(m):
- if m.properties['x-amqp-0-10.app-id'] == 'qmf2':
- if m.properties['qmf.opcode'] == '_method_response':
- return m.content['_arguments']
- elif m.properties['qmf.opcode'] == '_exception':
- raise Exception("Error: %s" % list_map_entries(m.content['_values']))
- else: raise Exception("Invalid response received, unexpected opcode: %s" % m)
- else: raise Exception("Invalid response received, not a qmfv2 method: %s" % m)
-
-
-parser = optparse.OptionParser(usage="usage: %prog [options] COMMAND ...",
- description="Invoke the specified command.")
-parser.add_option("-b", "--broker", default="localhost",
- help="connect to specified BROKER (default %default)")
-parser.add_option("-c", "--class", dest="qmfclass", default="broker",
- help="class of object on which command is being invoked (default %default)")
-parser.add_option("-p", "--package", default="org.apache.qpid.broker",
- help="package of object on which command is being invoked (default %default)")
-parser.add_option("-i", "--id", default="amqp-broker",
- help="identifier of object on which command is being invoked (default %default)")
-parser.add_option("-a", "--address", default="qmf.default.direct/broker",
- help="address to send commands to (default %default)")
-parser.add_option("-t", "--timeout", type="float", default=5,
- help="timeout in seconds to wait for response before exiting (default %default)")
-parser.add_option("-v", dest="verbose", action="store_true",
- help="enable logging")
-
-opts, args = parser.parse_args()
-
-if opts.verbose:
- enable("qpid", DEBUG)
-else:
- enable("qpid", WARN)
-
-if args:
- command = args.pop(0)
-else:
- parser.error("command is required")
-
-
-conn = Connection(opts.broker)
-try:
- conn.open()
- ssn = conn.session()
- snd = ssn.sender(opts.address)
- reply_to = "qmf.default.direct/%s; {node: {type: topic}}" % str(uuid4())
- rcv = ssn.receiver(reply_to)
-
- object_name = "%s:%s:%s" % (opts.package, opts.qmfclass, opts.id)
- method_name = command
- arguments = {}
- for a in args:
- name, val = nameval(a)
- if val[0] == '{' or val[0] == '[':
- arguments[name] = eval(val)
- else:
- arguments[name] = val
- content = {
- "_object_id": {"_object_name": object_name},
- "_method_name": method_name,
- "_arguments": arguments
- }
- msg = Message(reply_to=reply_to, content=content)
- msg.properties["x-amqp-0-10.app-id"] = "qmf2"
- msg.properties["qmf.opcode"] = "_method_request"
- snd.send(msg)
-
- try:
- print list_map_entries(get_qmfv2_result(rcv.fetch(timeout=opts.timeout)))
- except Empty:
- print "No response received!"
- except Exception, e:
- print e
-except ReceiverError, e:
- print e
-except KeyboardInterrupt:
- pass
-
-conn.close()
diff --git a/cpp/src/tests/qpid-latency-test.cpp b/cpp/src/tests/qpid-latency-test.cpp
deleted file mode 100644
index 20eb4568f3..0000000000
--- a/cpp/src/tests/qpid-latency-test.cpp
+++ /dev/null
@@ -1,469 +0,0 @@
-/*
- *
- * 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.
- *
- */
-
-
-#include <algorithm>
-#include <limits>
-#include <iostream>
-#include <memory>
-#include <sstream>
-#include <vector>
-
-#include "TestOptions.h"
-#include "qpid/sys/Thread.h"
-#include "qpid/client/Connection.h"
-#include "qpid/client/Message.h"
-#include "qpid/client/AsyncSession.h"
-#include "qpid/client/SubscriptionManager.h"
-#include "qpid/sys/Time.h"
-
-using namespace qpid;
-using namespace qpid::client;
-using namespace qpid::sys;
-using std::string;
-
-namespace qpid {
-namespace tests {
-
-typedef std::vector<std::string> StringSet;
-
-struct Args : public qpid::TestOptions {
- uint size;
- uint count;
- uint rate;
- bool sync;
- uint reportFrequency;
- uint timeLimit;
- uint concurrentConnections;
- uint prefetch;
- uint ack;
- bool cumulative;
- bool csv;
- bool durable;
- string base;
- bool singleConnect;
-
- Args() : size(256), count(1000), rate(0), reportFrequency(1000),
- timeLimit(0), concurrentConnections(1),
- prefetch(100), ack(0),
- durable(false), base("latency-test"), singleConnect(false)
-
- {
- addOptions()
-
- ("size", optValue(size, "N"), "message size")
- ("concurrentTests", optValue(concurrentConnections, "N"), "number of concurrent test setups, will create another publisher,\
- subcriber, queue, and connections")
- ("single-connection", optValue(singleConnect, "yes|no"), "Use one connection for multiple sessions.")
- ("count", optValue(count, "N"), "number of messages to send")
- ("rate", optValue(rate, "N"), "target message rate (causes count to be ignored)")
- ("sync", optValue(sync), "send messages synchronously")
- ("report-frequency", optValue(reportFrequency, "N"),
- "number of milliseconds to wait between reports (ignored unless rate specified)")
- ("time-limit", optValue(timeLimit, "N"),
- "test duration, in seconds")
- ("prefetch", optValue(prefetch, "N"), "prefetch count (0 implies no flow control, and no acking)")
- ("ack", optValue(ack, "N"), "Ack frequency in messages (defaults to half the prefetch value)")
- ("durable", optValue(durable, "yes|no"), "use durable messages")
- ("csv", optValue(csv), "print stats in csv format (rate,min,max,avg)")
- ("cumulative", optValue(cumulative), "cumulative stats in csv format")
- ("queue-base-name", optValue(base, "<name>"), "base name for queues");
- }
-};
-
-const std::string chars("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ");
-
-Args opts;
-double c_min, c_avg, c_max;
-Connection globalConnection;
-
-uint64_t current_time()
-{
- Duration t(EPOCH, now());
- return t;
-}
-
-struct Stats
-{
- Mutex lock;
- uint count;
- double minLatency;
- double maxLatency;
- double totalLatency;
-
- Stats();
- void update(double l);
- void print();
- void reset();
-};
-
-class Client : public Runnable
-{
-protected:
- Connection* connection;
- Connection localConnection;
- AsyncSession session;
- Thread thread;
- string queue;
-
-public:
- Client(const string& q);
- virtual ~Client();
-
- void start();
- void join();
- void run();
- virtual void test() = 0;
-};
-
-class Receiver : public Client, public MessageListener
-{
- SubscriptionManager mgr;
- uint count;
- Stats& stats;
-
-public:
- Receiver(const string& queue, Stats& stats);
- void test();
- void received(Message& msg);
- Stats getStats();
- uint getCount() { return count; }
- void stop() { mgr.stop(); mgr.cancel(queue); }
-};
-
-
-class Sender : public Client
-{
- string generateData(uint size);
- void sendByRate();
- void sendByCount();
- Receiver& receiver;
- const string data;
-
-public:
- Sender(const string& queue, Receiver& receiver);
- void test();
-};
-
-
-class Test
-{
- const string queue;
- Stats stats;
- Receiver receiver;
- Sender sender;
- AbsTime begin;
-
-public:
- Test(const string& q) : queue(q), receiver(queue, stats), sender(queue, receiver), begin(now()) {}
- void start();
- void join();
- void report();
-};
-
-
-Client::Client(const string& q) : queue(q)
-{
- if (opts.singleConnect){
- connection = &globalConnection;
- if (!globalConnection.isOpen()) opts.open(globalConnection);
- }else{
- connection = &localConnection;
- opts.open(localConnection);
- }
- session = connection->newSession();
-}
-
-void Client::start()
-{
- thread = Thread(this);
-}
-
-void Client::join()
-{
- thread.join();
-}
-
-void Client::run()
-{
- try{
- test();
- } catch(const std::exception& e) {
- std::cout << "Error in receiver: " << e.what() << std::endl;
- }
-}
-
-Client::~Client()
-{
- try{
- session.close();
- connection->close();
- } catch(const std::exception& e) {
- std::cout << "Error in receiver: " << e.what() << std::endl;
- }
-}
-
-Receiver::Receiver(const string& q, Stats& s) : Client(q), mgr(session), count(0), stats(s)
-{
- session.queueDeclare(arg::queue=queue, arg::durable=opts.durable, arg::autoDelete=true);
- uint msgCount = session.queueQuery(arg::queue=queue).get().getMessageCount();
- if (msgCount) {
- std::cout << "Warning: found " << msgCount << " msgs on " << queue << ". Purging..." << std::endl;
- session.queuePurge(arg::queue=queue);
- session.sync();
- }
- SubscriptionSettings settings;
- if (opts.prefetch) {
- settings.autoAck = (opts.ack ? opts.ack : (opts.prefetch / 2));
- settings.flowControl = FlowControl::messageWindow(opts.prefetch);
- } else {
- settings.acceptMode = ACCEPT_MODE_NONE;
- settings.flowControl = FlowControl::unlimited();
- }
- mgr.subscribe(*this, queue, settings);
-}
-
-void Receiver::test()
-{
- mgr.run();
- mgr.cancel(queue);
-}
-
-void Receiver::received(Message& msg)
-{
- ++count;
- uint64_t receivedAt = current_time();
- uint64_t sentAt = msg.getDeliveryProperties().getTimestamp();
-
- stats.update(((double) (receivedAt - sentAt)) / TIME_MSEC);
-
- if (!opts.rate && count >= opts.count) {
- mgr.stop();
- }
-}
-
-void Stats::update(double latency)
-{
- Mutex::ScopedLock l(lock);
- count++;
- minLatency = std::min(minLatency, latency);
- maxLatency = std::max(maxLatency, latency);
- totalLatency += latency;
-}
-
-Stats::Stats() : count(0), minLatency(std::numeric_limits<double>::max()), maxLatency(0), totalLatency(0) {}
-
-void Stats::print()
-{
- static bool already_have_stats = false;
- uint value;
-
- if (opts.rate)
- value = opts.rate;
- else
- value = opts.count;
- Mutex::ScopedLock l(lock);
- double aux_avg = (totalLatency / count);
- if (!opts.cumulative) {
- if (!opts.csv) {
- if (count) {
- std::cout << "Latency(ms): min=" << minLatency << ", max=" <<
- maxLatency << ", avg=" << aux_avg;
- } else {
- std::cout << "Stalled: no samples for interval";
- }
- } else {
- if (count) {
- std::cout << value << "," << minLatency << "," << maxLatency <<
- "," << aux_avg;
- } else {
- std::cout << value << "," << minLatency << "," << maxLatency <<
- ", Stalled";
- }
- }
- } else {
- if (count) {
- if (already_have_stats) {
- c_avg = (c_min + aux_avg) / 2;
- if (c_min > minLatency) c_min = minLatency;
- if (c_max < maxLatency) c_max = maxLatency;
- } else {
- c_avg = aux_avg;
- c_min = minLatency;
- c_max = maxLatency;
- already_have_stats = true;
- }
- std::cout << value << "," << c_min << "," << c_max <<
- "," << c_avg;
- } else {
- std::cout << "Stalled: no samples for interval";
- }
- }
-}
-
-void Stats::reset()
-{
- Mutex::ScopedLock l(lock);
- count = 0;
- totalLatency = maxLatency = 0;
- minLatency = std::numeric_limits<double>::max();
-}
-
-Sender::Sender(const string& q, Receiver& receiver) : Client(q), receiver(receiver), data(generateData(opts.size)) {}
-
-void Sender::test()
-{
- if (opts.rate) sendByRate();
- else sendByCount();
-}
-
-void Sender::sendByCount()
-{
- Message msg(data, queue);
- if (opts.durable) {
- msg.getDeliveryProperties().setDeliveryMode(framing::PERSISTENT);
- }
-
- for (uint i = 0; i < opts.count; i++) {
- uint64_t sentAt(current_time());
- msg.getDeliveryProperties().setTimestamp(sentAt);
- async(session).messageTransfer(arg::content=msg, arg::acceptMode=1);
- if (opts.sync) session.sync();
- }
- session.sync();
-}
-
-void Sender::sendByRate()
-{
- Message msg(data, queue);
- if (opts.durable) {
- msg.getDeliveryProperties().setDeliveryMode(framing::PERSISTENT);
- }
- uint64_t interval = TIME_SEC/opts.rate;
- int64_t timeLimit = opts.timeLimit * TIME_SEC;
- uint64_t sent = 0, missedRate = 0;
- AbsTime start = now();
- while (true) {
- AbsTime sentAt=now();
- msg.getDeliveryProperties().setTimestamp(Duration(EPOCH, sentAt));
- async(session).messageTransfer(arg::content=msg, arg::acceptMode=1);
- if (opts.sync) session.sync();
- ++sent;
- AbsTime waitTill(start, sent*interval);
- Duration delay(sentAt, waitTill);
- if (delay < 0)
- ++missedRate;
- else
- sys::usleep(delay / TIME_USEC);
- if (timeLimit != 0 && Duration(start, now()) > timeLimit) {
- session.sync();
- receiver.stop();
- break;
- }
- }
-}
-
-string Sender::generateData(uint size)
-{
- if (size < chars.length()) {
- return chars.substr(0, size);
- }
- std::string data;
- for (uint i = 0; i < (size / chars.length()); i++) {
- data += chars;
- }
- data += chars.substr(0, size % chars.length());
- return data;
-}
-
-
-void Test::start()
-{
- receiver.start();
- begin = AbsTime(now());
- sender.start();
-}
-
-void Test::join()
-{
- sender.join();
- receiver.join();
- AbsTime end = now();
- Duration time(begin, end);
- double msecs(time / TIME_MSEC);
- if (!opts.csv) {
- std::cout << "Sent " << receiver.getCount() << " msgs through " << queue
- << " in " << msecs << "ms (" << (receiver.getCount() * 1000 / msecs) << " msgs/s) ";
- }
- stats.print();
- std::cout << std::endl;
-}
-
-void Test::report()
-{
- stats.print();
- std::cout << std::endl;
- stats.reset();
-}
-
-}} // namespace qpid::tests
-
-using namespace qpid::tests;
-
-int main(int argc, char** argv)
-{
- try {
- opts.parse(argc, argv);
- if (opts.cumulative)
- opts.csv = true;
-
- Connection localConnection;
- AsyncSession session;
-
- boost::ptr_vector<Test> tests(opts.concurrentConnections);
- for (uint i = 0; i < opts.concurrentConnections; i++) {
- std::ostringstream out;
- out << opts.base << "-" << (i+1);
- tests.push_back(new Test(out.str()));
- }
- for (boost::ptr_vector<Test>::iterator i = tests.begin(); i != tests.end(); i++) {
- i->start();
- }
- if (opts.rate && !opts.timeLimit) {
- while (true) {
- qpid::sys::usleep(opts.reportFrequency * 1000);
- //print latency report:
- for (boost::ptr_vector<Test>::iterator i = tests.begin(); i != tests.end(); i++) {
- i->report();
- }
- }
- } else {
- for (boost::ptr_vector<Test>::iterator i = tests.begin(); i != tests.end(); i++) {
- i->join();
- }
- }
-
- return 0;
- } catch(const std::exception& e) {
- std::cout << e.what() << std::endl;
- }
- return 1;
-}
diff --git a/cpp/src/tests/qpid-perftest.cpp b/cpp/src/tests/qpid-perftest.cpp
deleted file mode 100644
index 8a5cf05775..0000000000
--- a/cpp/src/tests/qpid-perftest.cpp
+++ /dev/null
@@ -1,746 +0,0 @@
-/*
- *
- * 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.
- *
- */
-
-#include "TestOptions.h"
-
-#include "qpid/client/AsyncSession.h"
-#include "qpid/client/SubscriptionManager.h"
-#include "qpid/client/Connection.h"
-#include "qpid/client/Completion.h"
-#include "qpid/client/Message.h"
-#include "qpid/framing/FieldTable.h"
-#include "qpid/sys/Time.h"
-#include "qpid/sys/Thread.h"
-
-#include <boost/lexical_cast.hpp>
-#include <boost/bind.hpp>
-#include <boost/function.hpp>
-#include <boost/ptr_container/ptr_vector.hpp>
-
-#include <iostream>
-#include <sstream>
-#include <numeric>
-#include <algorithm>
-#include <math.h>
-
-
-using namespace std;
-using namespace qpid;
-using namespace client;
-using namespace sys;
-using boost::lexical_cast;
-using boost::bind;
-
-namespace qpid {
-namespace tests {
-
-enum Mode { SHARED, FANOUT, TOPIC };
-const char* modeNames[] = { "shared", "fanout", "topic" };
-
-// istream/ostream ops so Options can read/display Mode.
-istream& operator>>(istream& in, Mode& mode) {
- string s;
- in >> s;
- int i = find(modeNames, modeNames+3, s) - modeNames;
- if (i >= 3) throw Exception("Invalid mode: "+s);
- mode = Mode(i);
- return in;
-}
-
-ostream& operator<<(ostream& out, Mode mode) {
- return out << modeNames[mode];
-}
-
-
-struct Opts : public TestOptions {
-
- // Actions
- bool setup, control, publish, subscribe;
-
- // Queue policy
- uint32_t queueMaxCount;
- uint64_t queueMaxSize;
- std::string baseName;
- bool queueDurable;
-
- // Publisher
- size_t pubs;
- size_t count ;
- size_t size;
- bool confirm;
- bool durable;
- bool uniqueData;
- bool syncPub;
-
- // Subscriber
- size_t subs;
- size_t ack;
-
- // General
- size_t qt;
- bool singleConnect;
- size_t iterations;
- Mode mode;
- bool summary;
- uint32_t intervalSub;
- uint32_t intervalPub;
- size_t tx;
- size_t txPub;
- size_t txSub;
- bool commitAsync;
-
- static const std::string helpText;
-
- Opts() :
- TestOptions(helpText),
- setup(false), control(false), publish(false), subscribe(false), baseName("qpid-perftest"),
- pubs(1), count(500000), size(1024), confirm(true), durable(false), uniqueData(false), syncPub(false),
- subs(1), ack(0),
- qt(1),singleConnect(false), iterations(1), mode(SHARED), summary(false),
- intervalSub(0), intervalPub(0), tx(0), txPub(0), txSub(0), commitAsync(false)
- {
- addOptions()
- ("setup", optValue(setup), "Create shared queues.")
- ("control", optValue(control), "Run test, print report.")
- ("publish", optValue(publish), "Publish messages.")
- ("subscribe", optValue(subscribe), "Subscribe for messages.")
-
- ("mode", optValue(mode, "shared|fanout|topic"), "Test mode."
- "\nshared: --qt queues, --npubs publishers and --nsubs subscribers per queue.\n"
- "\nfanout: --npubs publishers, --nsubs subscribers, fanout exchange."
- "\ntopic: --qt topics, --npubs publishers and --nsubs subscribers per topic.\n")
-
- ("npubs", optValue(pubs, "N"), "Create N publishers.")
- ("count", optValue(count, "N"), "Each publisher sends N messages.")
- ("size", optValue(size, "BYTES"), "Size of messages in bytes.")
- ("pub-confirm", optValue(confirm, "yes|no"), "Publisher use confirm-mode.")
- ("durable", optValue(durable, "yes|no"), "Publish messages as durable.")
- ("unique-data", optValue(uniqueData, "yes|no"), "Make data for each message unique.")
- ("sync-publish", optValue(syncPub, "yes|no"), "Wait for confirmation of each message before sending the next one.")
-
- ("nsubs", optValue(subs, "N"), "Create N subscribers.")
- ("sub-ack", optValue(ack, "N"), "N>0: Subscriber acks batches of N.\n"
- "N==0: Subscriber uses unconfirmed mode")
-
- ("qt", optValue(qt, "N"), "Create N queues or topics.")
- ("single-connection", optValue(singleConnect, "yes|no"), "Use one connection for multiple sessions.")
-
- ("iterations", optValue(iterations, "N"), "Desired number of iterations of the test.")
- ("summary,s", optValue(summary), "Summary output: pubs/sec subs/sec transfers/sec Mbytes/sec")
-
- ("queue-max-count", optValue(queueMaxCount, "N"), "queue policy: count to trigger 'flow to disk'")
- ("queue-max-size", optValue(queueMaxSize, "N"), "queue policy: accumulated size to trigger 'flow to disk'")
- ("base-name", optValue(baseName, "NAME"), "base name used for queues or topics")
- ("queue-durable", optValue(queueDurable, "N"), "Make queue durable (implied if durable set)")
-
- ("interval_sub", optValue(intervalSub, "ms"), ">=0 delay between msg consume")
- ("interval_pub", optValue(intervalPub, "ms"), ">=0 delay between msg publish")
-
- ("tx", optValue(tx, "N"), "if non-zero, the transaction batch size for publishing and consuming")
- ("pub-tx", optValue(txPub, "N"), "if non-zero, the transaction batch size for publishing")
- ("async-commit", optValue(commitAsync, "yes|no"), "Don't wait for completion of commit")
- ("sub-tx", optValue(txSub, "N"), "if non-zero, the transaction batch size for consuming");
- }
-
- // Computed values
- size_t totalPubs;
- size_t totalSubs;
- size_t transfers;
- size_t subQuota;
-
- void parse(int argc, char** argv) {
- TestOptions::parse(argc, argv);
- switch (mode) {
- case SHARED:
- if (count % subs) {
- count += subs - (count % subs);
- cout << "WARNING: Adjusted --count to " << count
- << " the nearest multiple of --nsubs" << endl;
- }
- totalPubs = pubs*qt;
- totalSubs = subs*qt;
- subQuota = (pubs*count)/subs;
- break;
- case FANOUT:
- if (qt != 1) cerr << "WARNING: Fanout mode, ignoring --qt="
- << qt << endl;
- qt=1;
- totalPubs = pubs;
- totalSubs = subs;
- subQuota = totalPubs*count;
- break;
- case TOPIC:
- totalPubs = pubs*qt;
- totalSubs = subs*qt;
- subQuota = pubs*count;
- break;
- }
- transfers=(totalPubs*count) + (totalSubs*subQuota);
- if (tx) {
- if (txPub) {
- cerr << "WARNING: Using overriden tx value for publishers: " << txPub << std::endl;
- } else {
- txPub = tx;
- }
- if (txSub) {
- cerr << "WARNING: Using overriden tx value for subscribers: " << txSub << std::endl;
- } else {
- txSub = tx;
- }
- }
- }
-};
-
-const std::string Opts::helpText=
-"There are two ways to use qpid-perftest: single process or multi-process.\n\n"
-"If none of the --setup, --publish, --subscribe or --control options\n"
-"are given qpid-perftest will run a single-process test.\n"
-"For a multi-process test first run:\n"
-" qpid-perftest --setup <other options>\n"
-"and wait for it to complete. The remaining process should run concurrently::\n"
-"Run --npubs times: qpid-perftest --publish <other options>\n"
-"Run --nsubs times: qpid-perftest --subscribe <other options>\n"
-"Run once: qpid-perftest --control <other options>\n"
-"Note the <other options> must be identical for all processes.\n";
-
-Opts opts;
-Connection globalConnection;
-
-std::string fqn(const std::string& name)
-{
- ostringstream fqn;
- fqn << opts.baseName << "_" << name;
- return fqn.str();
-}
-
-struct Client : public Runnable {
- Connection* connection;
- Connection localConnection;
- AsyncSession session;
- Thread thread;
-
- Client() {
- if (opts.singleConnect){
- connection = &globalConnection;
- if (!globalConnection.isOpen()) opts.open(globalConnection);
- }else{
- connection = &localConnection;
- opts.open(localConnection);
- }
- session = connection->newSession();
- }
-
- ~Client() {
- try {
- if (connection->isOpen()) {
- session.close();
- connection->close();
- }
- } catch (const std::exception& e) {
- std::cerr << "Error in shutdown: " << e.what() << std::endl;
- }
- }
-};
-
-struct Setup : public Client {
-
- void queueInit(string name, bool durable=false, const framing::FieldTable& settings=framing::FieldTable()) {
- session.queueDeclare(arg::queue=name, arg::durable=durable, arg::arguments=settings);
- session.queuePurge(arg::queue=name);
- session.sync();
- }
-
- void run() {
- queueInit(fqn("pub_start"));
- queueInit(fqn("pub_done"));
- queueInit(fqn("sub_ready"));
- queueInit(fqn("sub_done"));
- if (opts.iterations > 1) queueInit(fqn("sub_iteration"));
- if (opts.mode==SHARED) {
- framing::FieldTable settings;//queue policy settings
- settings.setInt("qpid.max_count", opts.queueMaxCount);
- settings.setInt("qpid.max_size", opts.queueMaxSize);
- for (size_t i = 0; i < opts.qt; ++i) {
- ostringstream qname;
- qname << opts.baseName << i;
- queueInit(qname.str(), opts.durable || opts.queueDurable, settings);
- }
- }
- }
-};
-
-void expect(string actual, string expect) {
- if (expect != actual)
- throw Exception("Expecting "+expect+" but received "+actual);
-
-}
-
-double secs(Duration d) { return double(d)/TIME_SEC; }
-double secs(AbsTime start, AbsTime finish) {
- return secs(Duration(start,finish));
-}
-
-
-// Collect rates & print stats.
-class Stats {
- vector<double> values;
- double sum;
-
- public:
- Stats() : sum(0) {}
-
- // Functor to collect rates.
- void operator()(const string& data) {
- try {
- double d=lexical_cast<double>(data);
- values.push_back(d);
- sum += d;
- } catch (const std::exception&) {
- throw Exception("Bad report: "+data);
- }
- }
-
- double mean() const {
- return sum/values.size();
- }
-
- double stdev() const {
- if (values.size() <= 1) return 0;
- double avg = mean();
- double ssq = 0;
- for (vector<double>::const_iterator i = values.begin();
- i != values.end(); ++i) {
- double x=*i;
- x -= avg;
- ssq += x*x;
- }
- return sqrt(ssq/(values.size()-1));
- }
-
- ostream& print(ostream& out) {
- ostream_iterator<double> o(out, "\n");
- copy(values.begin(), values.end(), o);
- out << "Average: " << mean();
- if (values.size() > 1)
- out << " (std.dev. " << stdev() << ")";
- return out << endl;
- }
-};
-
-
-// Manage control queues, collect and print reports.
-struct Controller : public Client {
-
- SubscriptionManager subs;
-
- Controller() : subs(session) {}
-
- /** Process messages from queue by applying a functor. */
- void process(size_t n, string queue,
- boost::function<void (const string&)> msgFn)
- {
- if (!opts.summary)
- cout << "Processing " << n << " messages from "
- << queue << " " << flush;
- LocalQueue lq;
- subs.setFlowControl(n, SubscriptionManager::UNLIMITED, false);
- subs.subscribe(lq, queue);
- for (size_t i = 0; i < n; ++i) {
- if (!opts.summary) cout << "." << flush;
- msgFn(lq.pop().getData());
- }
- if (!opts.summary) cout << " done." << endl;
- }
-
- void process(size_t n, LocalQueue lq, string queue,
- boost::function<void (const string&)> msgFn)
- {
- session.messageFlow(queue, 0, n);
- if (!opts.summary)
- cout << "Processing " << n << " messages from "
- << queue << " " << flush;
- for (size_t i = 0; i < n; ++i) {
- if (!opts.summary) cout << "." << flush;
- msgFn(lq.pop().getData());
- }
- if (!opts.summary) cout << " done." << endl;
- }
-
- void send(size_t n, string queue, string data) {
- if (!opts.summary)
- cout << "Sending " << data << " " << n << " times to " << queue
- << endl;
- Message msg(data, queue);
- for (size_t i = 0; i < n; ++i)
- session.messageTransfer(arg::content=msg, arg::acceptMode=1);
- }
-
- void run() { // Controller
- try {
- // Wait for subscribers to be ready.
- process(opts.totalSubs, fqn("sub_ready"), bind(expect, _1, "ready"));
-
- LocalQueue pubDone;
- LocalQueue subDone;
- subs.setFlowControl(0, SubscriptionManager::UNLIMITED, false);
- subs.subscribe(pubDone, fqn("pub_done"));
- subs.subscribe(subDone, fqn("sub_done"));
-
- double txrateTotal(0);
- double mbytesTotal(0);
- double pubRateTotal(0);
- double subRateTotal(0);
-
- for (size_t j = 0; j < opts.iterations; ++j) {
- AbsTime start=now();
- send(opts.totalPubs, fqn("pub_start"), "start"); // Start publishers
- if (j) {
- send(opts.totalPubs, fqn("sub_iteration"), "next"); // Start subscribers on next iteration
- }
-
- Stats pubRates;
- Stats subRates;
-
- process(opts.totalPubs, pubDone, fqn("pub_done"), boost::ref(pubRates));
- process(opts.totalSubs, subDone, fqn("sub_done"), boost::ref(subRates));
-
- AbsTime end=now();
- double time=secs(start, end);
- if (time <= 0.0) {
- throw Exception("ERROR: Test completed in zero seconds. Try again with a larger message count.");
- }
- double txrate=opts.transfers/time;
- double mbytes=(txrate*opts.size)/(1024*1024);
-
- if (!opts.summary) {
- cout << endl << "Total " << opts.transfers << " transfers of "
- << opts.size << " bytes in "
- << time << " seconds." << endl;
- cout << endl << "Publish transfers/sec: " << endl;
- pubRates.print(cout);
- cout << endl << "Subscribe transfers/sec: " << endl;
- subRates.print(cout);
- cout << endl
- << "Total transfers/sec: " << txrate << endl
- << "Total Mbytes/sec: " << mbytes << endl;
- }
- else {
- cout << pubRates.mean() << "\t"
- << subRates.mean() << "\t"
- << txrate << "\t"
- << mbytes << endl;
- }
-
- txrateTotal += txrate;
- mbytesTotal += mbytes;
- pubRateTotal += pubRates.mean();
- subRateTotal += subRates.mean();
- }
- if (opts.iterations > 1) {
- cout << "Averages: "<< endl
- << (pubRateTotal / opts.iterations) << "\t"
- << (subRateTotal / opts.iterations) << "\t"
- << (txrateTotal / opts.iterations) << "\t"
- << (mbytesTotal / opts.iterations) << endl;
- }
- }
- catch (const std::exception& e) {
- cout << "Controller exception: " << e.what() << endl;
- }
- }
-};
-
-
-struct PublishThread : public Client {
- string destination;
- string routingKey;
-
- PublishThread() {};
-
- PublishThread(string key, string dest=string()) {
- destination=dest;
- routingKey=key;
- }
-
- void run() { // Publisher
- try {
- string data;
- size_t offset(0);
- if (opts.uniqueData) {
- offset = 5;
- data += "data:";//marker (requested for latency testing tool scripts)
- data += string(sizeof(size_t), 'X');//space for seq no
- data += session.getId().str();
- if (opts.size > data.size()) {
- data += string(opts.size - data.size(), 'X');
- } else if(opts.size < data.size()) {
- cout << "WARNING: Increased --size to " << data.size()
- << " to honour --unique-data" << endl;
- }
- } else {
- size_t msgSize=max(opts.size, sizeof(size_t));
- data = string(msgSize, 'X');
- }
-
- Message msg(data, routingKey);
- if (opts.durable)
- msg.getDeliveryProperties().setDeliveryMode(framing::PERSISTENT);
-
-
- if (opts.txPub){
- session.txSelect();
- }
- SubscriptionManager subs(session);
- LocalQueue lq;
- subs.setFlowControl(1, SubscriptionManager::UNLIMITED, true);
- subs.subscribe(lq, fqn("pub_start"));
-
- for (size_t j = 0; j < opts.iterations; ++j) {
- expect(lq.pop().getData(), "start");
- AbsTime start=now();
- for (size_t i=0; i<opts.count; i++) {
- // Stamp the iteration into the message data, avoid
- // any heap allocation.
- const_cast<std::string&>(msg.getData()).replace(offset, sizeof(size_t),
- reinterpret_cast<const char*>(&i), sizeof(size_t));
- if (opts.syncPub) {
- sync(session).messageTransfer(
- arg::destination=destination,
- arg::content=msg,
- arg::acceptMode=1);
- } else {
- session.messageTransfer(
- arg::destination=destination,
- arg::content=msg,
- arg::acceptMode=1);
- }
- if (opts.txPub && ((i+1) % opts.txPub == 0)){
- if (opts.commitAsync){
- session.txCommit();
- } else {
- sync(session).txCommit();
- }
- }
- if (opts.intervalPub)
- qpid::sys::usleep(opts.intervalPub*1000);
- }
- if (opts.confirm) session.sync();
- AbsTime end=now();
- double time=secs(start,end);
- if (time <= 0.0) {
- throw Exception("ERROR: Test completed in zero seconds. Try again with a larger message count.");
- }
-
- // Send result to controller.
- Message report(lexical_cast<string>(opts.count/time), fqn("pub_done"));
- session.messageTransfer(arg::content=report, arg::acceptMode=1);
- if (opts.txPub){
- sync(session).txCommit();
- }
- }
- session.close();
- }
- catch (const std::exception& e) {
- cout << "PublishThread exception: " << e.what() << endl;
- }
- }
-};
-
-struct SubscribeThread : public Client {
-
- string queue;
-
- SubscribeThread() {}
-
- SubscribeThread(string q) { queue = q; }
-
- SubscribeThread(string key, string ex) {
- queue=session.getId().str(); // Unique name.
- session.queueDeclare(arg::queue=queue,
- arg::exclusive=true,
- arg::autoDelete=true,
- arg::durable=opts.durable);
- session.exchangeBind(arg::queue=queue,
- arg::exchange=ex,
- arg::bindingKey=key);
- }
-
- void verify(bool cond, const char* test, uint32_t expect, uint32_t actual) {
- if (!cond) {
- Message error(
- QPID_MSG("Sequence error: expected n" << test << expect << " but got " << actual),
- "sub_done");
- session.messageTransfer(arg::content=error, arg::acceptMode=1);
- throw Exception(error.getData());
- }
- }
-
- void run() { // Subscribe
- try {
- if (opts.txSub) sync(session).txSelect();
- SubscriptionManager subs(session);
- SubscriptionSettings settings;
- settings.autoAck = opts.txSub ? opts.txSub : opts.ack;
- settings.acceptMode = (opts.txSub || opts.ack ? ACCEPT_MODE_EXPLICIT : ACCEPT_MODE_NONE);
- settings.flowControl = FlowControl::messageCredit(opts.subQuota);
- LocalQueue lq;
- Subscription subscription = subs.subscribe(lq, queue, settings);
- // Notify controller we are ready.
- session.messageTransfer(arg::content=Message("ready", fqn("sub_ready")), arg::acceptMode=1);
- if (opts.txSub) {
- if (opts.commitAsync) session.txCommit();
- else sync(session).txCommit();
- }
-
- LocalQueue iterationControl;
- if (opts.iterations > 1) {
- subs.subscribe(iterationControl, fqn("sub_iteration"), SubscriptionSettings(FlowControl::messageCredit(0)));
- }
-
- for (size_t j = 0; j < opts.iterations; ++j) {
- if (j > 0) {
- //need to wait here until all subs are done
- session.messageFlow(fqn("sub_iteration"), 0, 1);
- iterationControl.pop();
-
- //need to allocate some more credit for subscription
- session.messageFlow(queue, 0, opts.subQuota);
- }
- Message msg;
- AbsTime start=now();
- size_t expect=0;
- for (size_t i = 0; i < opts.subQuota; ++i) {
- msg=lq.pop();
- if (opts.txSub && ((i+1) % opts.txSub == 0)) {
- if (opts.commitAsync) session.txCommit();
- else sync(session).txCommit();
- }
- if (opts.intervalSub)
- qpid::sys::usleep(opts.intervalSub*1000);
- // TODO aconway 2007-11-23: check message order for.
- // multiple publishers. Need an array of counters,
- // one per publisher and a publisher ID in the
- // message. Careful not to introduce a lot of overhead
- // here, e.g. no std::map, std::string etc.
- //
- // For now verify order only for a single publisher.
- size_t offset = opts.uniqueData ? 5 /*marker is 'data:'*/ : 0;
- size_t n = *reinterpret_cast<const size_t*>(msg.getData().data() + offset);
- if (opts.pubs == 1) {
- if (opts.subs == 1 || opts.mode == FANOUT) verify(n==expect, "==", expect, n);
- else verify(n>=expect, ">=", expect, n);
- expect = n+1;
- }
- }
- if (opts.txSub || opts.ack)
- subscription.accept(subscription.getUnaccepted());
- if (opts.txSub) {
- if (opts.commitAsync) session.txCommit();
- else sync(session).txCommit();
- }
- AbsTime end=now();
-
- // Report to publisher.
- Message result(lexical_cast<string>(opts.subQuota/secs(start,end)),
- fqn("sub_done"));
- session.messageTransfer(arg::content=result, arg::acceptMode=1);
- if (opts.txSub) sync(session).txCommit();
- }
- session.close();
- }
- catch (const std::exception& e) {
- cout << "SubscribeThread exception: " << e.what() << endl;
- }
- }
-};
-
-}} // namespace qpid::tests
-
-using namespace qpid::tests;
-
-int main(int argc, char** argv) {
- int exitCode = 0;
- boost::ptr_vector<Client> subs(opts.subs);
- boost::ptr_vector<Client> pubs(opts.pubs);
-
- try {
- opts.parse(argc, argv);
-
- string exchange;
- switch (opts.mode) {
- case FANOUT: exchange="amq.fanout"; break;
- case TOPIC: exchange="amq.topic"; break;
- case SHARED: break;
- }
-
- bool singleProcess=
- (!opts.setup && !opts.control && !opts.publish && !opts.subscribe);
- if (singleProcess)
- opts.setup = opts.control = opts.publish = opts.subscribe = true;
-
- if (opts.setup) Setup().run(); // Set up queues
-
- // Start pubs/subs for each queue/topic.
- for (size_t i = 0; i < opts.qt; ++i) {
- ostringstream key;
- key << opts.baseName << i; // Queue or topic name.
- if (opts.publish) {
- size_t n = singleProcess ? opts.pubs : 1;
- for (size_t j = 0; j < n; ++j) {
- pubs.push_back(new PublishThread(key.str(), exchange));
- pubs.back().thread=Thread(pubs.back());
- }
- }
- if (opts.subscribe) {
- size_t n = singleProcess ? opts.subs : 1;
- for (size_t j = 0; j < n; ++j) {
- if (opts.mode==SHARED)
- subs.push_back(new SubscribeThread(key.str()));
- else
- subs.push_back(new SubscribeThread(key.str(),exchange));
- subs.back().thread=Thread(subs.back());
- }
- }
- }
-
- if (opts.control) Controller().run();
- }
- catch (const std::exception& e) {
- cout << endl << e.what() << endl;
- exitCode = 1;
- }
-
- // Wait for started threads.
- if (opts.publish) {
- for (boost::ptr_vector<Client>::iterator i=pubs.begin();
- i != pubs.end();
- ++i)
- i->thread.join();
- }
-
- if (opts.subscribe) {
- for (boost::ptr_vector<Client>::iterator i=subs.begin();
- i != subs.end();
- ++i)
- i->thread.join();
- }
- return exitCode;
-}
diff --git a/cpp/src/tests/qpid-ping.cpp b/cpp/src/tests/qpid-ping.cpp
deleted file mode 100644
index 0cb4afa0ee..0000000000
--- a/cpp/src/tests/qpid-ping.cpp
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- *
- * 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.
- *
-
- */
-
-#include "TestOptions.h"
-#include "qpid/client/SubscriptionManager.h"
-#include "qpid/client/Connection.h"
-#include "qpid/client/AsyncSession.h"
-#include "qpid/sys/Time.h"
-#include "qpid/sys/Thread.h"
-#include "qpid/sys/Runnable.h"
-#include "qpid/sys/Monitor.h"
-#include "qpid/framing/Uuid.h"
-#include <string>
-#include <iostream>
-
-using namespace std;
-using namespace qpid::sys;
-using namespace qpid::framing;
-using namespace qpid::client;
-using namespace qpid;
-
-struct PingOptions : public qpid::TestOptions {
- int timeout; // Timeout in seconds.
- bool quiet; // No output
- PingOptions() : timeout(1), quiet(false) {
- addOptions()
- ("timeout,t", optValue(timeout, "SECONDS"), "Max time to wait.")
- ("quiet,q", optValue(quiet), "Don't print anything to stderr/stdout.");
- }
-};
-
-int main(int argc, char** argv) {
- try {
- PingOptions opts;
- opts.parse(argc, argv);
- opts.con.heartbeat = (opts.timeout+1)/2;
- Connection connection;
- opts.open(connection);
- if (!opts.quiet) cout << "Opened connection." << endl;
- AsyncSession s = connection.newSession();
- string qname(Uuid(true).str());
- s.queueDeclare(arg::queue=qname,arg::autoDelete=true,arg::exclusive=true);
- s.messageTransfer(arg::content=Message("hello", qname));
- if (!opts.quiet) cout << "Sent message." << endl;
- SubscriptionManager subs(s);
- subs.get(qname);
- if (!opts.quiet) cout << "Received message." << endl;
- s.sync();
- s.close();
- connection.close();
- if (!opts.quiet) cout << "Success." << endl;
- return 0;
- } catch (const exception& e) {
- cerr << "Error: " << e.what() << endl;
- return 1;
- }
-}
diff --git a/cpp/src/tests/qpid-receive.cpp b/cpp/src/tests/qpid-receive.cpp
deleted file mode 100644
index 9c713e872a..0000000000
--- a/cpp/src/tests/qpid-receive.cpp
+++ /dev/null
@@ -1,269 +0,0 @@
-/*
- *
- * 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.
- *
- */
-
-#include <qpid/messaging/Address.h>
-#include <qpid/messaging/Connection.h>
-#include <qpid/messaging/Receiver.h>
-#include <qpid/messaging/Sender.h>
-#include <qpid/messaging/Session.h>
-#include <qpid/messaging/Message.h>
-#include <qpid/messaging/FailoverUpdates.h>
-#include <qpid/Options.h>
-#include <qpid/log/Logger.h>
-#include <qpid/log/Options.h>
-#include "qpid/sys/Time.h"
-#include "TestOptions.h"
-#include "Statistics.h"
-
-#include <iostream>
-#include <memory>
-
-using namespace qpid::messaging;
-using namespace qpid::types;
-using namespace std;
-
-namespace qpid {
-namespace tests {
-
-struct Options : public qpid::Options
-{
- bool help;
- std::string url;
- std::string address;
- std::string connectionOptions;
- int64_t timeout;
- bool forever;
- uint messages;
- bool ignoreDuplicates;
- bool checkRedelivered;
- uint capacity;
- uint ackFrequency;
- uint tx;
- uint rollbackFrequency;
- bool printContent;
- bool printHeaders;
- bool failoverUpdates;
- qpid::log::Options log;
- bool reportTotal;
- uint reportEvery;
- bool reportHeader;
- string readyAddress;
- uint receiveRate;
-
- Options(const std::string& argv0=std::string())
- : qpid::Options("Options"),
- help(false),
- url("amqp:tcp:127.0.0.1"),
- timeout(0),
- forever(false),
- messages(0),
- ignoreDuplicates(false),
- checkRedelivered(false),
- capacity(1000),
- ackFrequency(100),
- tx(0),
- rollbackFrequency(0),
- printContent(true),
- printHeaders(false),
- failoverUpdates(false),
- log(argv0),
- reportTotal(false),
- reportEvery(0),
- reportHeader(true),
- receiveRate(0)
- {
- addOptions()
- ("broker,b", qpid::optValue(url, "URL"), "url of broker to connect to")
- ("address,a", qpid::optValue(address, "ADDRESS"), "address to receive from")
- ("connection-options", qpid::optValue(connectionOptions, "OPTIONS"), "options for the connection")
- ("timeout", qpid::optValue(timeout, "TIMEOUT"), "timeout in seconds to wait before exiting")
- ("forever,f", qpid::optValue(forever), "ignore timeout and wait forever")
- ("messages,m", qpid::optValue(messages, "N"), "Number of messages to receive; 0 means receive indefinitely")
- ("ignore-duplicates", qpid::optValue(ignoreDuplicates), "Detect and ignore duplicates (by checking 'sn' header)")
- ("check-redelivered", qpid::optValue(checkRedelivered), "Fails with exception if a duplicate is not marked as redelivered (only relevant when ignore-duplicates is selected)")
- ("capacity", qpid::optValue(capacity, "N"), "Pre-fetch window (0 implies no pre-fetch)")
- ("ack-frequency", qpid::optValue(ackFrequency, "N"), "Ack frequency (0 implies none of the messages will get accepted)")
- ("tx", qpid::optValue(tx, "N"), "batch size for transactions (0 implies transaction are not used)")
- ("rollback-frequency", qpid::optValue(rollbackFrequency, "N"), "rollback frequency (0 implies no transaction will be rolledback)")
- ("print-content", qpid::optValue(printContent, "yes|no"), "print out message content")
- ("print-headers", qpid::optValue(printHeaders, "yes|no"), "print out message headers")
- ("failover-updates", qpid::optValue(failoverUpdates), "Listen for membership updates distributed via amq.failover")
- ("report-total", qpid::optValue(reportTotal), "Report total throughput and latency statistics")
- ("report-every", qpid::optValue(reportEvery,"N"), "Report throughput and latency statistics every N messages.")
- ("report-header", qpid::optValue(reportHeader, "yes|no"), "Headers on report.")
- ("ready-address", qpid::optValue(readyAddress, "ADDRESS"), "send a message to this address when ready to receive")
- ("receive-rate", qpid::optValue(receiveRate,"N"), "Receive at rate of N messages/second. 0 means receive as fast as possible.")
- ("help", qpid::optValue(help), "print this usage statement");
- add(log);
- }
-
- Duration getTimeout()
- {
- if (forever) return Duration::FOREVER;
- else return Duration::SECOND*timeout;
-
- }
- bool parse(int argc, char** argv)
- {
- try {
- qpid::Options::parse(argc, argv);
- if (address.empty()) throw qpid::Exception("Address must be specified!");
- qpid::log::Logger::instance().configure(log);
- if (help) {
- std::ostringstream msg;
- std::cout << msg << *this << std::endl << std::endl
- << "Drains messages from the specified address" << std::endl;
- return false;
- } else {
- return true;
- }
- } catch (const std::exception& e) {
- std::cerr << *this << std::endl << std::endl << e.what() << std::endl;
- return false;
- }
- }
-};
-
-const string EOS("eos");
-const string SN("sn");
-
-class SequenceTracker
-{
- uint lastSn;
- public:
- SequenceTracker() : lastSn(0) {}
-
- bool isDuplicate(Message& message)
- {
- uint sn = message.getProperties()[SN];
- if (lastSn < sn) {
- lastSn = sn;
- return false;
- } else {
- return true;
- }
- }
-};
-
-}} // namespace qpid::tests
-
-using namespace qpid::tests;
-
-int main(int argc, char ** argv)
-{
- Connection connection;
- try {
- Options opts;
- if (opts.parse(argc, argv)) {
- connection = Connection(opts.url, opts.connectionOptions);
- connection.open();
- std::auto_ptr<FailoverUpdates> updates(opts.failoverUpdates ? new FailoverUpdates(connection) : 0);
- Session session = opts.tx ? connection.createTransactionalSession() : connection.createSession();
- Receiver receiver = session.createReceiver(opts.address);
- receiver.setCapacity(opts.capacity);
- Message msg;
- uint count = 0;
- uint txCount = 0;
- SequenceTracker sequenceTracker;
- Duration timeout = opts.getTimeout();
- bool done = false;
- Reporter<ThroughputAndLatency> reporter(std::cout, opts.reportEvery, opts.reportHeader);
- if (!opts.readyAddress.empty())
- session.createSender(opts.readyAddress).send(msg);
-
- // For receive rate calculation
- qpid::sys::AbsTime start = qpid::sys::now();
- int64_t interval = 0;
- if (opts.receiveRate) interval = qpid::sys::TIME_SEC/opts.receiveRate;
-
- std::map<std::string,Sender> replyTo;
-
- while (!done && receiver.fetch(msg, timeout)) {
- reporter.message(msg);
- if (!opts.ignoreDuplicates || !sequenceTracker.isDuplicate(msg)) {
- if (msg.getContent() == EOS) {
- done = true;
- } else {
- ++count;
- if (opts.printHeaders) {
- if (msg.getSubject().size()) std::cout << "Subject: " << msg.getSubject() << std::endl;
- if (msg.getReplyTo()) std::cout << "ReplyTo: " << msg.getReplyTo() << std::endl;
- if (msg.getCorrelationId().size()) std::cout << "CorrelationId: " << msg.getCorrelationId() << std::endl;
- if (msg.getUserId().size()) std::cout << "UserId: " << msg.getUserId() << std::endl;
- if (msg.getTtl().getMilliseconds()) std::cout << "TTL: " << msg.getTtl().getMilliseconds() << std::endl;
- if (msg.getPriority()) std::cout << "Priority: " << msg.getPriority() << std::endl;
- if (msg.getDurable()) std::cout << "Durable: true" << std::endl;
- if (msg.getRedelivered()) std::cout << "Redelivered: true" << std::endl;
- std::cout << "Properties: " << msg.getProperties() << std::endl;
- std::cout << std::endl;
- }
- if (opts.printContent)
- std::cout << msg.getContent() << std::endl;//TODO: handle map or list messages
- if (opts.messages && count >= opts.messages) done = true;
- }
- } else if (opts.checkRedelivered && !msg.getRedelivered()) {
- throw qpid::Exception("duplicate sequence number received, message not marked as redelivered!");
- }
- if (opts.tx && (count % opts.tx == 0)) {
- if (opts.rollbackFrequency && (++txCount % opts.rollbackFrequency == 0)) {
- session.rollback();
- } else {
- session.commit();
- }
- } else if (opts.ackFrequency && (count % opts.ackFrequency == 0)) {
- session.acknowledge();
- }
- if (msg.getReplyTo()) { // Echo message back to reply-to address.
- Sender& s = replyTo[msg.getReplyTo().str()];
- if (s.isNull()) {
- s = session.createSender(msg.getReplyTo());
- s.setCapacity(opts.capacity);
- }
- s.send(msg);
- }
- if (opts.receiveRate) {
- qpid::sys::AbsTime waitTill(start, count*interval);
- int64_t delay = qpid::sys::Duration(qpid::sys::now(), waitTill);
- if (delay > 0) qpid::sys::usleep(delay/qpid::sys::TIME_USEC);
- }
- // Clear out message properties & content for next iteration.
- msg = Message(); // TODO aconway 2010-12-01: should be done by fetch
- }
- if (opts.reportTotal) reporter.report();
- if (opts.tx) {
- if (opts.rollbackFrequency && (++txCount % opts.rollbackFrequency == 0)) {
- session.rollback();
- } else {
- session.commit();
- }
- } else {
- session.acknowledge();
- }
- session.close();
- connection.close();
- return 0;
- }
- } catch(const std::exception& error) {
- std::cerr << "qpid-receive: " << error.what() << std::endl;
- connection.close();
- return 1;
- }
-}
diff --git a/cpp/src/tests/qpid-send.cpp b/cpp/src/tests/qpid-send.cpp
deleted file mode 100644
index ef5e98e2a0..0000000000
--- a/cpp/src/tests/qpid-send.cpp
+++ /dev/null
@@ -1,375 +0,0 @@
-/*
- *
- * 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.
- *
- */
-
-#include <qpid/messaging/Address.h>
-#include <qpid/messaging/Connection.h>
-#include <qpid/messaging/Message.h>
-#include <qpid/messaging/Sender.h>
-#include <qpid/messaging/Receiver.h>
-#include <qpid/messaging/Session.h>
-#include <qpid/messaging/FailoverUpdates.h>
-#include <qpid/sys/Time.h>
-#include <qpid/sys/Monitor.h>
-#include "TestOptions.h"
-#include "Statistics.h"
-
-#include <fstream>
-#include <iostream>
-#include <memory>
-
-using namespace std;
-using namespace qpid::messaging;
-using namespace qpid::types;
-
-typedef std::vector<std::string> string_vector;
-
-namespace qpid {
-namespace tests {
-
-struct Options : public qpid::Options
-{
- bool help;
- std::string url;
- std::string connectionOptions;
- std::string address;
- uint messages;
- std::string id;
- std::string replyto;
- uint sendEos;
- bool durable;
- uint ttl;
- uint priority;
- std::string userid;
- std::string correlationid;
- string_vector properties;
- string_vector entries;
- std::string contentString;
- uint contentSize;
- bool contentStdin;
- uint tx;
- uint rollbackFrequency;
- uint capacity;
- bool failoverUpdates;
- qpid::log::Options log;
- bool reportTotal;
- uint reportEvery;
- bool reportHeader;
- uint sendRate;
- uint flowControl;
- bool sequence;
- bool timestamp;
-
- Options(const std::string& argv0=std::string())
- : qpid::Options("Options"),
- help(false),
- url("amqp:tcp:127.0.0.1"),
- messages(1),
- sendEos(0),
- durable(false),
- ttl(0),
- priority(0),
- contentString(),
- contentSize(0),
- contentStdin(false),
- tx(0),
- rollbackFrequency(0),
- capacity(1000),
- failoverUpdates(false),
- log(argv0),
- reportTotal(false),
- reportEvery(0),
- reportHeader(true),
- sendRate(0),
- flowControl(0),
- sequence(true),
- timestamp(true)
- {
- addOptions()
- ("broker,b", qpid::optValue(url, "URL"), "url of broker to connect to")
- ("address,a", qpid::optValue(address, "ADDRESS"), "address to send to")
- ("connection-options", qpid::optValue(connectionOptions, "OPTIONS"), "options for the connection")
- ("messages,m", qpid::optValue(messages, "N"), "stop after N messages have been sent, 0 means no limit")
- ("id,i", qpid::optValue(id, "ID"), "use the supplied id instead of generating one")
- ("reply-to", qpid::optValue(replyto, "REPLY-TO"), "specify reply-to address")
- ("send-eos", qpid::optValue(sendEos, "N"), "Send N EOS messages to mark end of input")
- ("durable", qpid::optValue(durable, "yes|no"), "Mark messages as durable.")
- ("ttl", qpid::optValue(ttl, "msecs"), "Time-to-live for messages, in milliseconds")
- ("priority", qpid::optValue(priority, "PRIORITY"), "Priority for messages (higher value implies higher priority)")
- ("property,P", qpid::optValue(properties, "NAME=VALUE"), "specify message property")
- ("correlation-id", qpid::optValue(correlationid, "ID"), "correlation-id for message")
- ("user-id", qpid::optValue(userid, "USERID"), "userid for message")
- ("content-string", qpid::optValue(contentString, "CONTENT"), "use CONTENT as message content")
- ("content-size", qpid::optValue(contentSize, "N"), "create an N-byte message content")
- ("content-map,M", qpid::optValue(entries, "NAME=VALUE"), "specify entry for map content")
- ("content-stdin", qpid::optValue(contentStdin), "read message content from stdin, one line per message")
- ("capacity", qpid::optValue(capacity, "N"), "size of the senders outgoing message queue")
- ("tx", qpid::optValue(tx, "N"), "batch size for transactions (0 implies transaction are not used)")
- ("rollback-frequency", qpid::optValue(rollbackFrequency, "N"), "rollback frequency (0 implies no transaction will be rolledback)")
- ("failover-updates", qpid::optValue(failoverUpdates), "Listen for membership updates distributed via amq.failover")
- ("report-total", qpid::optValue(reportTotal), "Report total throughput statistics")
- ("report-every", qpid::optValue(reportEvery,"N"), "Report throughput statistics every N messages")
- ("report-header", qpid::optValue(reportHeader, "yes|no"), "Headers on report.")
- ("send-rate", qpid::optValue(sendRate,"N"), "Send at rate of N messages/second. 0 means send as fast as possible.")
- ("flow-control", qpid::optValue(flowControl,"N"), "Do end to end flow control to limit queue depth to 2*N. 0 means no flow control.")
- ("sequence", qpid::optValue(sequence, "yes|no"), "Add a sequence number messages property (required for duplicate/lost message detection)")
- ("timestamp", qpid::optValue(timestamp, "yes|no"), "Add a time stamp messages property (required for latency measurement)")
- ("help", qpid::optValue(help), "print this usage statement");
- add(log);
- }
-
- bool parse(int argc, char** argv)
- {
- try {
- qpid::Options::parse(argc, argv);
- if (address.empty()) throw qpid::Exception("Address must be specified!");
- qpid::log::Logger::instance().configure(log);
- if (help) {
- std::ostringstream msg;
- std::cout << msg << *this << std::endl << std::endl
- << "Drains messages from the specified address" << std::endl;
- return false;
- } else {
- return true;
- }
- } catch (const std::exception& e) {
- std::cerr << *this << std::endl << std::endl << e.what() << std::endl;
- return false;
- }
- }
-
- static bool nameval(const std::string& in, std::string& name, std::string& value)
- {
- std::string::size_type i = in.find("=");
- if (i == std::string::npos) {
- name = in;
- return false;
- } else {
- name = in.substr(0, i);
- if (i+1 < in.size()) {
- value = in.substr(i+1);
- return true;
- } else {
- return false;
- }
- }
- }
-
- static void setProperty(Message& message, const std::string& property)
- {
- std::string name;
- std::string value;
- if (nameval(property, name, value)) {
- message.getProperties()[name] = value;
- } else {
- message.getProperties()[name] = Variant();
- }
- }
-
- void setProperties(Message& message) const
- {
- for (string_vector::const_iterator i = properties.begin(); i != properties.end(); ++i) {
- setProperty(message, *i);
- }
- }
-
- void setEntries(Variant::Map& content) const
- {
- for (string_vector::const_iterator i = entries.begin(); i != entries.end(); ++i) {
- std::string name;
- std::string value;
- if (nameval(*i, name, value)) {
- content[name] = value;
- } else {
- content[name] = Variant();
- }
- }
- }
-};
-
-const string EOS("eos");
-const string SN("sn");
-const string TS("ts");
-
-}} // namespace qpid::tests
-
-using namespace qpid::tests;
-
-class ContentGenerator {
- public:
- virtual ~ContentGenerator() {}
- virtual bool setContent(Message& msg) = 0;
-};
-
-class GetlineContentGenerator : public ContentGenerator {
- public:
- virtual bool setContent(Message& msg) {
- string content;
- bool got = getline(std::cin, content);
- if (got) msg.setContent(content);
- return got;
- }
-};
-
-class FixedContentGenerator : public ContentGenerator {
- public:
- FixedContentGenerator(const string& s) : content(s) {}
- virtual bool setContent(Message& msg) {
- msg.setContent(content);
- return true;
- }
- private:
- std::string content;
-};
-
-class MapContentGenerator : public ContentGenerator {
- public:
- MapContentGenerator(const Options& opt) : opts(opt) {}
- virtual bool setContent(Message& msg) {
- Variant::Map map;
- opts.setEntries(map);
- encode(map, msg);
- return true;
- }
- private:
- const Options& opts;
-};
-
-int main(int argc, char ** argv)
-{
- Connection connection;
- Options opts;
- try {
- if (opts.parse(argc, argv)) {
- connection = Connection(opts.url, opts.connectionOptions);
- connection.open();
- std::auto_ptr<FailoverUpdates> updates(opts.failoverUpdates ? new FailoverUpdates(connection) : 0);
- Session session = opts.tx ? connection.createTransactionalSession() : connection.createSession();
- Sender sender = session.createSender(opts.address);
- if (opts.capacity) sender.setCapacity(opts.capacity);
- Message msg;
- msg.setDurable(opts.durable);
- if (opts.ttl) {
- msg.setTtl(Duration(opts.ttl));
- }
- if (opts.priority) {
- msg.setPriority(opts.priority);
- }
- if (!opts.replyto.empty()) {
- if (opts.flowControl)
- throw Exception("Can't use reply-to and flow-control together");
- msg.setReplyTo(Address(opts.replyto));
- }
- if (!opts.userid.empty()) msg.setUserId(opts.userid);
- if (!opts.correlationid.empty()) msg.setCorrelationId(opts.correlationid);
- opts.setProperties(msg);
- uint sent = 0;
- uint txCount = 0;
- Reporter<Throughput> reporter(std::cout, opts.reportEvery, opts.reportHeader);
-
- std::auto_ptr<ContentGenerator> contentGen;
- if (opts.contentStdin) {
- opts.messages = 0; // Don't limit # messages sent.
- contentGen.reset(new GetlineContentGenerator);
- }
- else if (opts.entries.size() > 0)
- contentGen.reset(new MapContentGenerator(opts));
- else if (opts.contentSize > 0)
- contentGen.reset(new FixedContentGenerator(string(opts.contentSize, 'X')));
- else
- contentGen.reset(new FixedContentGenerator(opts.contentString));
-
- qpid::sys::AbsTime start = qpid::sys::now();
- int64_t interval = 0;
- if (opts.sendRate) interval = qpid::sys::TIME_SEC/opts.sendRate;
-
- Receiver flowControlReceiver;
- Address flowControlAddress("flow-"+Uuid(true).str()+";{create:always,delete:always}");
- uint flowSent = 0;
- if (opts.flowControl) {
- flowControlReceiver = session.createReceiver(flowControlAddress);
- flowControlReceiver.setCapacity(2);
- }
-
- while (contentGen->setContent(msg)) {
- ++sent;
- if (opts.sequence)
- msg.getProperties()[SN] = sent;
- if (opts.timestamp)
- msg.getProperties()[TS] = int64_t(
- qpid::sys::Duration(qpid::sys::EPOCH, qpid::sys::now()));
- if (opts.flowControl) {
- if ((sent % opts.flowControl) == 0) {
- msg.setReplyTo(flowControlAddress);
- ++flowSent;
- }
- else
- msg.setReplyTo(Address()); // Clear the reply address.
- }
- sender.send(msg);
- reporter.message(msg);
-
- if (opts.tx && (sent % opts.tx == 0)) {
- if (opts.rollbackFrequency &&
- (++txCount % opts.rollbackFrequency == 0))
- session.rollback();
- else
- session.commit();
- }
- if (opts.messages && sent >= opts.messages) break;
-
- if (opts.flowControl && flowSent == 2) {
- flowControlReceiver.get(Duration::SECOND);
- --flowSent;
- }
-
- if (opts.sendRate) {
- qpid::sys::AbsTime waitTill(start, sent*interval);
- int64_t delay = qpid::sys::Duration(qpid::sys::now(), waitTill);
- if (delay > 0) qpid::sys::usleep(delay/qpid::sys::TIME_USEC);
- }
- }
- for ( ; flowSent>0; --flowSent)
- flowControlReceiver.get(Duration::SECOND);
- if (opts.reportTotal) reporter.report();
- for (uint i = opts.sendEos; i > 0; --i) {
- if (opts.sequence)
- msg.getProperties()[SN] = ++sent;
- msg.setContent(EOS); //TODO: add in ability to send digest or similar
- sender.send(msg);
- }
- if (opts.tx) {
- if (opts.rollbackFrequency && (++txCount % opts.rollbackFrequency == 0)) {
- session.rollback();
- } else {
- session.commit();
- }
- }
- session.sync();
- session.close();
- connection.close();
- return 0;
- }
- } catch(const std::exception& error) {
- std::cerr << "qpid-send: " << error.what() << std::endl;
- connection.close();
- return 1;
- }
-}
diff --git a/cpp/src/tests/qpid-src-rinstall b/cpp/src/tests/qpid-src-rinstall
deleted file mode 100755
index 5e69e0ade1..0000000000
--- a/cpp/src/tests/qpid-src-rinstall
+++ /dev/null
@@ -1,31 +0,0 @@
-#!/bin/sh
-#
-# Licensed to the Apache Software Foundation (ASF) under onemake
-# 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.
-#
-
-# Copy the source tree and run "make install" on each of $HOSTS
-# Must be run in a configured qpid build directory.
-
-absdir() { echo `cd $1 && pwd`; }
-
-test -f config.status || { echo "Not in a configured build directory."; }
-CONFIGURE=`./config.status -V | grep '^configured by' | sed 's/^configured by \([^,]*\),.*$/\1/'`
-CONFIG_OPTIONS=`./config.status -V | grep 'with options' | sed 's/^.*with options "\([^"]*\)".*$/\1/'`
-set -ex
-rsynchosts `absdir $(dirname $CONFIGURE)/..` # Copy cpp srcdir and siblings.
-allhosts -bo rbuild.log "mkdir -p $PWD && cd $PWD && { test -f config.status || $CONFIGURE $CONFIG_OPTIONS; } && make && make -j1 install"
diff --git a/cpp/src/tests/qpid-stream.cpp b/cpp/src/tests/qpid-stream.cpp
deleted file mode 100644
index f02a484750..0000000000
--- a/cpp/src/tests/qpid-stream.cpp
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- *
- * 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.
- *
- */
-
-#include <qpid/messaging/Connection.h>
-#include <qpid/messaging/Message.h>
-#include <qpid/messaging/Receiver.h>
-#include <qpid/messaging/Sender.h>
-#include <qpid/messaging/Session.h>
-#include <qpid/sys/Runnable.h>
-#include <qpid/sys/Thread.h>
-#include <qpid/sys/Time.h>
-#include <qpid/Options.h>
-#include <iostream>
-#include <string>
-
-using namespace qpid::messaging;
-using namespace qpid::types;
-
-namespace qpid {
-namespace tests {
-
-struct Args : public qpid::Options
-{
- std::string url;
- std::string address;
- uint size;
- uint rate;
- bool durable;
- uint receiverCapacity;
- uint senderCapacity;
- uint ackFrequency;
-
- Args() :
- url("amqp:tcp:127.0.0.1:5672"),
- address("test-queue"),
- size(512),
- rate(1000),
- durable(false),
- receiverCapacity(0),
- senderCapacity(0),
- ackFrequency(1)
- {
- addOptions()
- ("url", qpid::optValue(url, "URL"), "Url to connect to.")
- ("address", qpid::optValue(address, "ADDRESS"), "Address to stream messages through.")
- ("size", qpid::optValue(size, "bytes"), "Message size in bytes (content only, not headers).")
- ("rate", qpid::optValue(rate, "msgs/sec"), "Rate at which to stream messages.")
- ("durable", qpid::optValue(durable, "true|false"), "Mark messages as durable.")
- ("sender-capacity", qpid::optValue(senderCapacity, "N"), "Credit window (0 implies infinite window)")
- ("receiver-capacity", qpid::optValue(receiverCapacity, "N"), "Credit window (0 implies infinite window)")
- ("ack-frequency", qpid::optValue(ackFrequency, "N"),
- "Ack frequency (0 implies none of the messages will get accepted)");
- }
-};
-
-Args opts;
-
-const std::string TS = "ts";
-
-uint64_t timestamp(const qpid::sys::AbsTime& time)
-{
- qpid::sys::Duration t(qpid::sys::EPOCH, time);
- return t;
-}
-
-struct Client : qpid::sys::Runnable
-{
- virtual ~Client() {}
- virtual void doWork(Session&) = 0;
-
- void run()
- {
- Connection connection(opts.url);
- try {
- connection.open();
- Session session = connection.createSession();
- doWork(session);
- session.close();
- connection.close();
- } catch(const std::exception& error) {
- std::cout << error.what() << std::endl;
- connection.close();
- }
- }
-
- qpid::sys::Thread thread;
-
- void start() { thread = qpid::sys::Thread(this); }
- void join() { thread.join(); }
-};
-
-struct Publish : Client
-{
- void doWork(Session& session)
- {
- Sender sender = session.createSender(opts.address);
- if (opts.senderCapacity) sender.setCapacity(opts.senderCapacity);
- Message msg(std::string(opts.size, 'X'));
- uint64_t interval = qpid::sys::TIME_SEC / opts.rate;
- uint64_t sent = 0, missedRate = 0;
- qpid::sys::AbsTime start = qpid::sys::now();
- while (true) {
- qpid::sys::AbsTime sentAt = qpid::sys::now();
- msg.getProperties()[TS] = timestamp(sentAt);
- sender.send(msg);
- ++sent;
- qpid::sys::AbsTime waitTill(start, sent*interval);
- qpid::sys::Duration delay(sentAt, waitTill);
- if (delay < 0) {
- ++missedRate;
- } else {
- qpid::sys::usleep(delay / qpid::sys::TIME_USEC);
- }
- }
- }
-};
-
-struct Consume : Client
-{
- void doWork(Session& session)
- {
- Message msg;
- uint64_t received = 0;
- double minLatency = std::numeric_limits<double>::max();
- double maxLatency = 0;
- double totalLatency = 0;
- Receiver receiver = session.createReceiver(opts.address);
- if (opts.receiverCapacity) receiver.setCapacity(opts.receiverCapacity);
- while (receiver.fetch(msg)) {
- ++received;
- if (opts.ackFrequency && (received % opts.ackFrequency == 0)) {
- session.acknowledge();
- }
- //calculate latency
- uint64_t receivedAt = timestamp(qpid::sys::now());
- uint64_t sentAt = msg.getProperties()[TS].asUint64();
- double latency = ((double) (receivedAt - sentAt)) / qpid::sys::TIME_MSEC;
-
- //update avg, min & max
- minLatency = std::min(minLatency, latency);
- maxLatency = std::max(maxLatency, latency);
- totalLatency += latency;
-
- if (received % opts.rate == 0) {
- std::cout << "count=" << received
- << ", avg=" << (totalLatency/received)
- << ", min=" << minLatency
- << ", max=" << maxLatency << std::endl;
- }
- }
- }
-};
-
-}} // namespace qpid::tests
-
-using namespace qpid::tests;
-
-int main(int argc, char** argv)
-{
- try {
- opts.parse(argc, argv);
- Publish publish;
- Consume consume;
- publish.start();
- consume.start();
- consume.join();
- publish.join();
- return 0;
- } catch(const std::exception& error) {
- std::cout << error.what() << std::endl;
- }
- return 1;
-}
-
-
diff --git a/cpp/src/tests/qpid-test-cluster b/cpp/src/tests/qpid-test-cluster
deleted file mode 100755
index 9887406ef9..0000000000
--- a/cpp/src/tests/qpid-test-cluster
+++ /dev/null
@@ -1,109 +0,0 @@
-#!/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.
-#
-
-usage() {
- echo "Usage: `basename $0` [options] start|stop|restart|check [hosts]
-Start/stop/restart a cluster on specified hosts or on \$HOSTS via ssh.
-
-Options:
- -l USER Run qpidd and copy files as USER.
- -e SCRIPT Source SCRIPT for environment settings. Copies SCRIPT to each host.
- Default is $DEFAULT_ENV.
- -c CONFIG Use CONFIG as qpidd config file. Copies CONFIG to each host.
- Default is $DEFAULT_CONF
- -d Delete data-dir and log file before starting broker.
-"
- exit 1
-}
-
-DEFAULT_CONF=~/qpid-test-qpidd.conf
-DEFAULT_ENV=~/qpid-test-env.sh
-
-test -f $DEFAULT_CONF && CONF_FILE=$DEFAULT_CONF
-test -f $DEFAULT_ENV && ENV_FILE=$DEFAULT_ENV
-
-while getopts "l:e:c:d" opt; do
- case $opt in
- l) SSHOPTS="-l$OPTARG $SSHOPTS" ; RSYNC_USER="$OPTARG@" ;;
- e) ENV_FILE=$OPTARG ;;
- c) CONF_FILE=$OPTARG ;;
- d) DO_DELETE=1 ;;
- *) usage;;
- esac
-done
-shift `expr $OPTIND - 1`
-test "$*" || usage
-CMD=$1; shift
-HOSTS=${*:-$HOSTS}
-
-conf_value() { test -f "$CONF_FILE" && awk -F= "/^$1=/ {print \$2}" $CONF_FILE; }
-
-if test -n "$CONF_FILE"; then
- test -f "$CONF_FILE" || { echo Config file not found: $CONF_FILE; exit 1; }
- RSYNCFILES="$RSYNCFILES $CONF_FILE"
- QPIDD_ARGS="$QPIDD_ARGS --config $CONF_FILE"
- CONF_PORT=`conf_value port`
- CONF_DATA_DIR=`conf_value data-dir`
- CONF_LOG_FILE=`conf_value log-to-file`
-fi
-
-if test -n "$ENV_FILE"; then
- test -f "$ENV_FILE" || { echo Environment file not found: $ENV_FILE; exit 1; }
- RSYNCFILES="$RSYNCFILES $ENV_FILE"
- SOURCE_ENV="source $ENV_FILE ; "
-fi
-
-test -n "$RSYNCFILES" && rsynchosts $RSYNCFILES # Copy conf/env files to all hosts
-
-do_start() {
- for h in $HOSTS; do
- COMMAND="qpidd -d $QPIDD_ARGS"
- id -nG | grep '\<ais\>' >/dev/null && COMMAND="sg ais -c '$COMMAND'"
- if test "$DO_DELETE"; then COMMAND="rm -rf $CONF_DATA_DIR $CONF_LOG_FILE; $COMMAND"; fi
- ssh $h "$SOURCE_ENV $COMMAND" || { echo "Failed to start on $h"; exit 1; }
- done
-}
-
-do_stop() {
- for h in $HOSTS; do
- ssh $h "$SOURCE_ENV qpidd -q --no-module-dir --no-data-dir $QPIDD_ARGS"
- done
-}
-
-do_status() {
- for h in $HOSTS; do
- if ssh $h "$SOURCE_ENV qpidd -c --no-module-dir --no-data-dir $QPIDD_ARGS > /dev/null"; then
- echo "$h ok"
- else
- echo "$h not running"
- STATUS=1
- fi
- done
-}
-
-case $CMD in
- start) do_start ;;
- stop) do_stop ;;
- restart) do_stop ; do_start ;;
- status) do_status ;;
- *) usage;;
-esac
-
-exit $STATUS
diff --git a/cpp/src/tests/qpid-topic-listener.cpp b/cpp/src/tests/qpid-topic-listener.cpp
deleted file mode 100644
index c42e76d760..0000000000
--- a/cpp/src/tests/qpid-topic-listener.cpp
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
- *
- * 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.
- *
- */
-
-/**
- * This file provides one half of a test and example of a pub-sub
- * style of interaction. See qpid-topic-publisher.cpp for the other half,
- * in which the logic for publishing is defined.
- *
- * This file contains the listener logic. A listener will subscribe to
- * a logical 'topic'. It will count the number of messages it receives
- * and the time elapsed between the first one and the last one. It
- * recognises two types of 'special' message that tell it to (a) send
- * a report containing this information, (b) shutdown (i.e. stop
- * listening).
- */
-
-#include "TestOptions.h"
-#include "qpid/client/Connection.h"
-#include "qpid/client/MessageListener.h"
-#include "qpid/client/Session.h"
-#include "qpid/client/AsyncSession.h"
-#include "qpid/client/SubscriptionManager.h"
-#include "qpid/sys/SystemInfo.h"
-#include "qpid/sys/Time.h"
-#include "qpid/framing/FieldValue.h"
-#include <iostream>
-#include <sstream>
-
-using namespace qpid;
-using namespace qpid::client;
-using namespace qpid::sys;
-using namespace qpid::framing;
-using namespace std;
-
-namespace qpid {
-namespace tests {
-
-/**
- * A message listener implementation in which the runtime logic is
- * defined.
- */
-class Listener : public MessageListener{
- Session session;
- SubscriptionManager& mgr;
- const string responseQueue;
- const bool transactional;
- bool init;
- int count;
- AbsTime start;
-
- void shutdown();
- void report();
-public:
- Listener(const Session& session, SubscriptionManager& mgr, const string& reponseQueue, bool tx);
- virtual void received(Message& msg);
- Subscription subscription;
-};
-
-/**
- * A utility class for managing the options passed in.
- */
-struct Args : public qpid::TestOptions {
- int ack;
- bool transactional;
- bool durable;
- int prefetch;
- string statusqueue;
-
- Args() : ack(0), transactional(false), durable(false), prefetch(0) {
- addOptions()
- ("ack", optValue(ack, "MODE"), "Ack frequency in messages (defaults to half the prefetch value)")
- ("transactional", optValue(transactional), "Use transactions")
- ("durable", optValue(durable), "subscribers should use durable queues")
- ("prefetch", optValue(prefetch, "N"), "prefetch count (0 implies no flow control, and no acking)")
- ("status-queue", optValue(statusqueue, "QUEUE-NAME"), "Message queue to put status messages on");
- }
-};
-
-Listener::Listener(const Session& s, SubscriptionManager& m, const string& _responseq, bool tx) :
- session(s), mgr(m), responseQueue(_responseq), transactional(tx), init(false), count(0){}
-
-void Listener::received(Message& message){
- if(!init){
- start = now();
- count = 0;
- init = true;
- cout << "Batch started." << endl;
- }
- string type = message.getHeaders().getAsString("TYPE");
-
- if(string("TERMINATION_REQUEST") == type){
- shutdown();
- }else if(string("REPORT_REQUEST") == type){
- subscription.accept(subscription.getUnaccepted()); // Accept everything upto this point
- cout <<"Batch ended, sending report." << endl;
- //send a report:
- report();
- init = false;
- }else if (++count % 1000 == 0){
- cout <<"Received " << count << " messages." << endl;
- }
-}
-
-void Listener::shutdown(){
- mgr.stop();
-}
-
-void Listener::report(){
- AbsTime finish = now();
- Duration time(start, finish);
- stringstream reportstr;
- reportstr << "Received " << count << " messages in "
- << time/TIME_MSEC << " ms.";
- Message msg(reportstr.str(), responseQueue);
- msg.getHeaders().setString("TYPE", "REPORT");
- session.messageTransfer(arg::destination="amq.direct", arg::content=msg, arg::acceptMode=1);
- if(transactional){
- sync(session).txCommit();
- }
-}
-
-}} // namespace qpid::tests
-
-using namespace qpid::tests;
-
-/**
- * The main routine creates a Listener instance and sets it up to
- * consume from a private queue bound to the exchange with the
- * appropriate topic name.
- */
-int main(int argc, char** argv){
- try{
- Args args;
- args.parse(argc, argv);
- if(args.help)
- cout << args << endl;
- else {
- Connection connection;
- args.open(connection);
- AsyncSession session = connection.newSession();
-
- //declare exchange, queue and bind them:
- session.queueDeclare(arg::queue="response");
- std::string control = "control_" + session.getId().str();
- if (args.durable) {
- session.queueDeclare(arg::queue=control, arg::durable=true);
- } else {
- session.queueDeclare(arg::queue=control, arg::exclusive=true, arg::autoDelete=true);
- }
- session.exchangeBind(arg::exchange="amq.topic", arg::queue=control, arg::bindingKey="topic_control");
-
- //set up listener
- SubscriptionManager mgr(session);
- Listener listener(session, mgr, "response", args.transactional);
- SubscriptionSettings settings;
- if (args.prefetch) {
- settings.autoAck = (args.ack ? args.ack : (args.prefetch / 2));
- settings.flowControl = FlowControl::messageCredit(args.prefetch);
- } else {
- settings.acceptMode = ACCEPT_MODE_NONE;
- settings.flowControl = FlowControl::unlimited();
- }
- listener.subscription = mgr.subscribe(listener, control, settings);
- session.sync();
-
- if( args.statusqueue.length() > 0 ) {
- stringstream msg_str;
- msg_str << "qpid-topic-listener: " << qpid::sys::SystemInfo::getProcessId();
- session.messageTransfer(arg::content=Message(msg_str.str(), args.statusqueue));
- cout << "Ready status put on queue '" << args.statusqueue << "'" << endl;
- }
-
- if (args.transactional) {
- session.txSelect();
- }
-
- cout << "qpid-topic-listener: listening..." << endl;
- mgr.run();
- if (args.durable) {
- session.queueDelete(arg::queue=control);
- }
- session.close();
- cout << "closing connection" << endl;
- connection.close();
- }
- return 0;
- } catch (const std::exception& error) {
- cout << "qpid-topic-listener: " << error.what() << endl;
- }
- return 1;
-}
diff --git a/cpp/src/tests/qpid-topic-publisher.cpp b/cpp/src/tests/qpid-topic-publisher.cpp
deleted file mode 100644
index f9107b90d0..0000000000
--- a/cpp/src/tests/qpid-topic-publisher.cpp
+++ /dev/null
@@ -1,230 +0,0 @@
-/*
- *
- * 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.
- *
- */
-
-/**
- * This file provides one half of a test and example of a pub-sub
- * style of interaction. See qpid-topic-listener.cpp for the other half, in
- * which the logic for subscribers is defined.
- *
- * This file contains the publisher logic. The publisher will send a
- * number of messages to the exchange with the appropriate routing key
- * for the logical 'topic'. Once it has done this it will then send a
- * request that each subscriber report back with the number of message
- * it has received and the time that elapsed between receiving the
- * first one and receiving the report request. Once the expected
- * number of reports are received, it sends out a request that each
- * subscriber shutdown.
- */
-
-#include "TestOptions.h"
-#include "qpid/client/Connection.h"
-#include "qpid/client/MessageListener.h"
-#include "qpid/client/AsyncSession.h"
-#include "qpid/client/SubscriptionManager.h"
-#include "qpid/sys/Monitor.h"
-#include "qpid/sys/Time.h"
-#include <cstdlib>
-#include <iostream>
-
-using namespace qpid;
-using namespace qpid::client;
-using namespace qpid::sys;
-using namespace std;
-
-namespace qpid {
-namespace tests {
-
-/**
- * The publishing logic is defined in this class. It implements
- * message listener and can therfore be used to receive messages sent
- * back by the subscribers.
- */
-class Publisher {
- AsyncSession session;
- SubscriptionManager mgr;
- LocalQueue queue;
- const string controlTopic;
- const bool transactional;
- const bool durable;
-
- string generateData(int size);
-
-public:
- Publisher(const AsyncSession& session, const string& controlTopic, bool tx, bool durable);
- int64_t publish(int msgs, int listeners, int size);
- void terminate();
-};
-
-/**
- * A utility class for managing the options passed in to the test
- */
-struct Args : public TestOptions {
- int messages;
- int subscribers;
- bool transactional;
- bool durable;
- int batches;
- int delay;
- int size;
- string statusqueue;
-
- Args() : messages(1000), subscribers(1),
- transactional(false), durable(false),
- batches(1), delay(0), size(256)
- {
- addOptions()
- ("messages", optValue(messages, "N"), "how many messages to send")
- ("subscribers", optValue(subscribers, "N"), "how many subscribers to expect reports from")
- ("transactional", optValue(transactional), "client should use transactions")
- ("durable", optValue(durable), "messages should be durable")
- ("batches", optValue(batches, "N"), "how many batches to run")
- ("delay", optValue(delay, "SECONDS"), "Causes a delay between each batch")
- ("size", optValue(size, "BYTES"), "size of the published messages")
- ("status-queue", optValue(statusqueue, "QUEUE-NAME"), "Message queue to read status messages from");
- }
-};
-
-Publisher::Publisher(const AsyncSession& _session, const string& _controlTopic, bool tx, bool d) :
- session(_session), mgr(session), controlTopic(_controlTopic), transactional(tx), durable(d)
-{
- mgr.subscribe(queue, "response");
-}
-
-int64_t Publisher::publish(int msgs, int listeners, int size){
- Message msg(generateData(size), controlTopic);
- if (durable) {
- msg.getDeliveryProperties().setDeliveryMode(framing::PERSISTENT);
- }
- AbsTime start = now();
-
- for(int i = 0; i < msgs; i++){
- session.messageTransfer(arg::content=msg, arg::destination="amq.topic", arg::acceptMode=1);
- }
- //send report request
- Message reportRequest("", controlTopic);
- reportRequest.getHeaders().setString("TYPE", "REPORT_REQUEST");
- session.messageTransfer(arg::content=reportRequest, arg::destination="amq.topic", arg::acceptMode=1);
- if(transactional){
- sync(session).txCommit();
- }
- //wait for a response from each listener (TODO, could log these)
- for (int i = 0; i < listeners; i++) {
- Message report = queue.pop();
- }
-
- if(transactional){
- sync(session).txCommit();
- }
-
- AbsTime finish = now();
- return Duration(start, finish);
-}
-
-string Publisher::generateData(int size){
- string data;
- for(int i = 0; i < size; i++){
- data += ('A' + (i / 26));
- }
- return data;
-}
-
-void Publisher::terminate(){
- //send termination request
- Message terminationRequest("", controlTopic);
- terminationRequest.getHeaders().setString("TYPE", "TERMINATION_REQUEST");
- session.messageTransfer(arg::content=terminationRequest, arg::destination="amq.topic", arg::acceptMode=1);
- if(transactional){
- session.txCommit();
- }
-}
-
-}} // namespace qpid::tests
-
-using namespace qpid::tests;
-
-int main(int argc, char** argv) {
- try{
- Args args;
- args.parse(argc, argv);
- if(args.help)
- cout << args << endl;
- else {
- Connection connection;
- args.open(connection);
- AsyncSession session = connection.newSession();
-
- // If status-queue is defined, wait for all expected listeners to join in before we start
- if( args.statusqueue.length() > 0 ) {
- cout << "Waiting for " << args.subscribers << " listeners..." << endl;
- SubscriptionManager statusSubs(session);
- LocalQueue statusQ;
- statusSubs.subscribe(statusQ, args.statusqueue);
- for (int i = 0; i < args.subscribers; i++) {
- Message m = statusQ.get();
- if( m.getData().find("topic_listener: ", 0) == 0 ) {
- cout << "Listener " << (i+1) << " of " << args.subscribers
- << " is ready (pid " << m.getData().substr(16, m.getData().length() - 16)
- << ")" << endl;
- } else {
- throw Exception(QPID_MSG("Unexpected message received on status queue: " << m.getData()));
- }
- }
- }
-
- if (args.transactional) {
- session.txSelect();
- }
- session.queueDeclare(arg::queue="response");
- session.exchangeBind(arg::exchange="amq.direct", arg::queue="response", arg::bindingKey="response");
-
- Publisher publisher(session, "topic_control", args.transactional, args.durable);
-
- int batchSize(args.batches);
- int64_t max(0);
- int64_t min(0);
- int64_t sum(0);
- for(int i = 0; i < batchSize; i++){
- if(i > 0 && args.delay) qpid::sys::sleep(args.delay);
- int64_t msecs =
- publisher.publish(args.messages,
- args.subscribers,
- args.size) / TIME_MSEC;
- if(!max || msecs > max) max = msecs;
- if(!min || msecs < min) min = msecs;
- sum += msecs;
- cout << "Completed " << (i+1) << " of " << batchSize
- << " in " << msecs << "ms" << endl;
- }
- publisher.terminate();
- int64_t avg = sum / batchSize;
- if(batchSize > 1){
- cout << batchSize << " batches completed. avg=" << avg <<
- ", max=" << max << ", min=" << min << endl;
- }
- session.close();
- connection.close();
- }
- return 0;
- }catch(exception& error) {
- cout << error.what() << endl;
- }
- return 1;
-}
diff --git a/cpp/src/tests/qpid-txtest.cpp b/cpp/src/tests/qpid-txtest.cpp
deleted file mode 100644
index d0ba2f1245..0000000000
--- a/cpp/src/tests/qpid-txtest.cpp
+++ /dev/null
@@ -1,340 +0,0 @@
-/*
- *
- * 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.
- *
- */
-
-#include <algorithm>
-#include <iomanip>
-#include <iostream>
-#include <memory>
-#include <sstream>
-#include <vector>
-
-#include "TestOptions.h"
-#include "qpid/client/Connection.h"
-#include "qpid/client/Message.h"
-#include "qpid/client/AsyncSession.h"
-#include "qpid/client/SubscriptionManager.h"
-#include "qpid/framing/Array.h"
-#include "qpid/framing/Buffer.h"
-#include "qpid/framing/Uuid.h"
-#include "qpid/sys/Thread.h"
-
-using namespace qpid;
-using namespace qpid::client;
-using namespace qpid::sys;
-using std::string;
-
-namespace qpid {
-namespace tests {
-
-typedef std::vector<std::string> StringSet;
-
-struct Args : public qpid::TestOptions {
- bool init, transfer, check;//actions
- uint size;
- bool durable;
- uint queues;
- string base;
- uint msgsPerTx;
- uint txCount;
- uint totalMsgCount;
- bool dtx;
- bool quiet;
-
- Args() : init(true), transfer(true), check(true),
- size(256), durable(true), queues(2),
- base("tx-test"), msgsPerTx(1), txCount(1), totalMsgCount(10),
- dtx(false), quiet(false)
- {
- addOptions()
-
- ("init", optValue(init, "yes|no"), "Declare queues and populate one with the initial set of messages.")
- ("transfer", optValue(transfer, "yes|no"), "'Move' messages from one queue to another using transactions to ensure no message loss.")
- ("check", optValue(check, "yes|no"), "Check that the initial messages are all still available.")
- ("size", optValue(size, "N"), "message size")
- ("durable", optValue(durable, "yes|no"), "use durable messages")
- ("queues", optValue(queues, "N"), "number of queues")
- ("queue-base-name", optValue(base, "<name>"), "base name for queues")
- ("messages-per-tx", optValue(msgsPerTx, "N"), "number of messages transferred per transaction")
- ("tx-count", optValue(txCount, "N"), "number of transactions per 'agent'")
- ("total-messages", optValue(totalMsgCount, "N"), "total number of messages in 'circulation'")
- ("dtx", optValue(dtx, "yes|no"), "use distributed transactions")
- ("quiet", optValue(quiet), "reduce output from test");
- }
-};
-
-const std::string chars("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ");
-
-std::string generateData(uint size)
-{
- if (size < chars.length()) {
- return chars.substr(0, size);
- }
- std::string data;
- for (uint i = 0; i < (size / chars.length()); i++) {
- data += chars;
- }
- data += chars.substr(0, size % chars.length());
- return data;
-}
-
-void generateSet(const std::string& base, uint count, StringSet& collection)
-{
- for (uint i = 0; i < count; i++) {
- std::ostringstream out;
- out << base << "-" << (i+1);
- collection.push_back(out.str());
- }
-}
-
-Args opts;
-
-struct Client
-{
- Connection connection;
- AsyncSession session;
-
- Client()
- {
- opts.open(connection);
- session = connection.newSession();
- }
-
- ~Client()
- {
- try{
- session.close();
- connection.close();
- } catch(const std::exception& e) {
- std::cout << e.what() << std::endl;
- }
- }
-};
-
-struct Transfer : public Client, public Runnable
-{
- std::string src;
- std::string dest;
- Thread thread;
- framing::Xid xid;
-
- Transfer(const std::string& to, const std::string& from) : src(to), dest(from), xid(0x4c414e47, "", from) {}
-
- void run()
- {
- try {
-
- if (opts.dtx) session.dtxSelect();
- else session.txSelect();
- SubscriptionManager subs(session);
-
- LocalQueue lq;
- SubscriptionSettings settings(FlowControl::messageWindow(opts.msgsPerTx));
- settings.autoAck = 0; // Disabled
- Subscription sub = subs.subscribe(lq, src, settings);
-
- for (uint t = 0; t < opts.txCount; t++) {
- Message in;
- Message out("", dest);
- if (opts.dtx) {
- setNewXid(xid);
- session.dtxStart(arg::xid=xid);
- }
- for (uint m = 0; m < opts.msgsPerTx; m++) {
- in = lq.pop();
- std::string& data = in.getData();
- if (data.size() != opts.size) {
- std::ostringstream oss;
- oss << "Message size incorrect: size=" << in.getData().size() << "; expected " << opts.size;
- throw std::runtime_error(oss.str());
- }
- out.setData(data);
- out.getMessageProperties().setCorrelationId(in.getMessageProperties().getCorrelationId());
- out.getDeliveryProperties().setDeliveryMode(in.getDeliveryProperties().getDeliveryMode());
- session.messageTransfer(arg::content=out, arg::acceptMode=1);
- }
- sub.accept(sub.getUnaccepted());
- if (opts.dtx) {
- session.dtxEnd(arg::xid=xid);
- session.dtxPrepare(arg::xid=xid);
- session.dtxCommit(arg::xid=xid);
- } else {
- session.txCommit();
- }
- }
- } catch(const std::exception& e) {
- std::cout << "Transfer interrupted: " << e.what() << std::endl;
- }
- }
-
- void setNewXid(framing::Xid& xid) {
- framing::Uuid uuid(true);
- xid.setGlobalId(uuid.str());
- }
-};
-
-struct Controller : public Client
-{
- StringSet ids;
- StringSet queues;
-
- Controller()
- {
- generateSet(opts.base, opts.queues, queues);
- generateSet("msg", opts.totalMsgCount, ids);
- }
-
- void init()
- {
- //declare queues
- for (StringSet::iterator i = queues.begin(); i != queues.end(); i++) {
- session.queueDeclare(arg::queue=*i, arg::durable=opts.durable);
- session.sync();
- }
-
- Message msg(generateData(opts.size), *queues.begin());
- if (opts.durable) {
- msg.getDeliveryProperties().setDeliveryMode(framing::PERSISTENT);
- }
-
- //publish messages
- for (StringSet::iterator i = ids.begin(); i != ids.end(); i++) {
- msg.getMessageProperties().setCorrelationId(*i);
- session.messageTransfer(arg::content=msg, arg::acceptMode=1);
- }
- }
-
- void transfer()
- {
- boost::ptr_vector<Transfer> agents(opts.queues);
- //launch transfer agents
- for (StringSet::iterator i = queues.begin(); i != queues.end(); i++) {
- StringSet::iterator next = i + 1;
- if (next == queues.end()) next = queues.begin();
-
- if (!opts.quiet) std::cout << "Transfering from " << *i << " to " << *next << std::endl;
- agents.push_back(new Transfer(*i, *next));
- agents.back().thread = Thread(agents.back());
- }
-
- for (boost::ptr_vector<Transfer>::iterator i = agents.begin(); i != agents.end(); i++) {
- i->thread.join();
- }
- }
-
- int check()
- {
- SubscriptionManager subs(session);
-
- // Recover DTX transactions (if any)
- if (opts.dtx) {
- std::vector<std::string> inDoubtXids;
- framing::DtxRecoverResult dtxRes = session.dtxRecover().get();
- const framing::Array& xidArr = dtxRes.getInDoubt();
- xidArr.collect(inDoubtXids);
-
- if (inDoubtXids.size()) {
- if (!opts.quiet) std::cout << "Recovering DTX in-doubt transaction(s):" << std::endl;
- framing::StructHelper decoder;
- framing::Xid xid;
- // abort even, commit odd transactions
- for (unsigned i = 0; i < inDoubtXids.size(); i++) {
- decoder.decode(xid, inDoubtXids[i]);
- if (!opts.quiet) std::cout << (i%2 ? " * aborting " : " * committing ");
- xid.print(std::cout);
- std::cout << std::endl;
- if (i%2) {
- session.dtxRollback(arg::xid=xid);
- } else {
- session.dtxCommit(arg::xid=xid);
- }
- }
- }
- }
-
- StringSet drained;
- //drain each queue and verify the correct set of messages are available
- for (StringSet::iterator i = queues.begin(); i != queues.end(); i++) {
- //subscribe, allocate credit and flushn
- LocalQueue lq;
- SubscriptionSettings settings(FlowControl::unlimited(), ACCEPT_MODE_NONE);
- subs.subscribe(lq, *i, settings);
- session.messageFlush(arg::destination=*i);
- session.sync();
-
- uint count(0);
- while (!lq.empty()) {
- Message m = lq.pop();
- //add correlation ids of received messages to drained
- drained.push_back(m.getMessageProperties().getCorrelationId());
- ++count;
- }
- if (!opts.quiet) std::cout << "Drained " << count << " messages from " << *i << std::endl;
- }
-
- sort(ids.begin(), ids.end());
- sort(drained.begin(), drained.end());
-
- //check that drained == ids
- StringSet missing;
- set_difference(ids.begin(), ids.end(), drained.begin(), drained.end(), back_inserter(missing));
-
- StringSet extra;
- set_difference(drained.begin(), drained.end(), ids.begin(), ids.end(), back_inserter(extra));
-
- if (missing.empty() && extra.empty()) {
- std::cout << "All expected messages were retrieved." << std::endl;
- return 0;
- } else {
- if (!missing.empty()) {
- std::cout << "The following ids were missing:" << std::endl;
- for (StringSet::iterator i = missing.begin(); i != missing.end(); i++) {
- std::cout << " '" << *i << "'" << std::endl;
- }
- }
- if (!extra.empty()) {
- std::cout << "The following extra ids were encountered:" << std::endl;
- for (StringSet::iterator i = extra.begin(); i != extra.end(); i++) {
- std::cout << " '" << *i << "'" << std::endl;
- }
- }
- return 1;
- }
- }
-};
-
-}} // namespace qpid::tests
-
-using namespace qpid::tests;
-
-int main(int argc, char** argv)
-{
- try {
- opts.parse(argc, argv);
- Controller controller;
- if (opts.init) controller.init();
- if (opts.transfer) controller.transfer();
- if (opts.check) return controller.check();
- return 0;
- } catch(const std::exception& e) {
- std::cout << e.what() << std::endl;
- }
- return 2;
-}
diff --git a/cpp/src/tests/queue_flow_limit_tests.py b/cpp/src/tests/queue_flow_limit_tests.py
deleted file mode 100644
index dec7cfb3af..0000000000
--- a/cpp/src/tests/queue_flow_limit_tests.py
+++ /dev/null
@@ -1,371 +0,0 @@
-#!/usr/bin/env python
-#
-# 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.
-#
-
-import sys
-from qpid.testlib import TestBase010
-from qpid import datatypes, messaging
-from qpid.messaging import Message, Empty
-from threading import Thread, Lock
-from logging import getLogger
-from time import sleep, time
-from os import environ, popen
-
-class QueueFlowLimitTests(TestBase010):
-
- def __getattr__(self, name):
- if name == "assertGreater":
- return lambda a, b: self.failUnless(a > b)
- else:
- raise AttributeError
-
- def _create_queue(self, name,
- stop_count=None, resume_count=None,
- stop_size=None, resume_size=None,
- max_size=None, max_count=None):
- """ Create a queue with the given flow settings via the queue.declare
- command.
- """
- args={}
- if (stop_count is not None):
- args["qpid.flow_stop_count"] = stop_count;
- if (resume_count is not None):
- args["qpid.flow_resume_count"] = resume_count;
- if (stop_size is not None):
- args["qpid.flow_stop_size"] = stop_size;
- if (resume_size is not None):
- args["qpid.flow_resume_size"] = resume_size;
- if (max_size is not None):
- args["qpid.max_size"] = max_size;
- if (max_count is not None):
- args["qpid.max_count"] = max_count;
-
-
- self.session.queue_declare(queue=name, arguments=args)
-
- qs = self.qmf.getObjects(_class="queue")
- for i in qs:
- if i.name == name:
- # verify flow settings
- if (stop_count is not None):
- self.assertEqual(i.arguments.get("qpid.flow_stop_count"), stop_count)
- if (resume_count is not None):
- self.assertEqual(i.arguments.get("qpid.flow_resume_count"), resume_count)
- if (stop_size is not None):
- self.assertEqual(i.arguments.get("qpid.flow_stop_size"), stop_size)
- if (resume_size is not None):
- self.assertEqual(i.arguments.get("qpid.flow_resume_size"), resume_size)
- if (max_size is not None):
- self.assertEqual(i.arguments.get("qpid.max_size"), max_size)
- if (max_count is not None):
- self.assertEqual(i.arguments.get("qpid.max_count"), max_count)
- self.failIf(i.flowStopped)
- return i.getObjectId()
- self.fail("Unable to create queue '%s'" % name)
- return None
-
-
- def _delete_queue(self, name):
- """ Delete a named queue
- """
- self.session.queue_delete(queue=name)
-
-
- def _start_qpid_send(self, queue, count, content="X", capacity=100):
- """ Use the qpid-send client to generate traffic to a queue.
- """
- command = "qpid-send" + \
- " -b" + " %s:%s" % (self.broker.host, self.broker.port) \
- + " -a " + str(queue) \
- + " --messages " + str(count) \
- + " --content-string " + str(content) \
- + " --capacity " + str(capacity)
- return popen(command)
-
- def _start_qpid_receive(self, queue, count, timeout=5):
- """ Use the qpid-receive client to consume from a queue.
- Note well: prints one line of text to stdout for each consumed msg.
- """
- command = "qpid-receive" + \
- " -b " + "%s:%s" % (self.broker.host, self.broker.port) \
- + " -a " + str(queue) \
- + " --messages " + str(count) \
- + " --timeout " + str(timeout) \
- + " --print-content yes"
- return popen(command)
-
- def test_qpid_config_cmd(self):
- """ Test the qpid-config command's ability to configure a queue's flow
- control thresholds.
- """
- tool = environ.get("QPID_CONFIG_EXEC")
- if tool:
- command = tool + \
- " --broker-addr=%s:%s " % (self.broker.host, self.broker.port) \
- + "add queue test01 --flow-stop-count=999" \
- + " --flow-resume-count=55 --flow-stop-size=5000000" \
- + " --flow-resume-size=100000"
- cmd = popen(command)
- rc = cmd.close()
- self.assertEqual(rc, None)
-
- # now verify the settings
- self.startQmf();
- qs = self.qmf.getObjects(_class="queue")
- for i in qs:
- if i.name == "test01":
- self.assertEqual(i.arguments.get("qpid.flow_stop_count"), 999)
- self.assertEqual(i.arguments.get("qpid.flow_resume_count"), 55)
- self.assertEqual(i.arguments.get("qpid.flow_stop_size"), 5000000)
- self.assertEqual(i.arguments.get("qpid.flow_resume_size"), 100000)
- self.failIf(i.flowStopped)
- break;
- self.assertEqual(i.name, "test01")
- self._delete_queue("test01")
-
-
- def test_flow_count(self):
- """ Create a queue with count-based flow limit. Spawn several
- producers which will exceed the limit. Verify limit exceeded. Consume
- all messages. Verify flow control released.
- """
- self.startQmf();
- oid = self._create_queue("test-q", stop_count=373, resume_count=229)
- self.assertEqual(self.qmf.getObjects(_objectId=oid)[0].flowStoppedCount, 0)
-
- sndr1 = self._start_qpid_send("test-q", count=1213, content="XXX", capacity=50);
- sndr2 = self._start_qpid_send("test-q", count=797, content="Y", capacity=13);
- sndr3 = self._start_qpid_send("test-q", count=331, content="ZZZZZ", capacity=149);
- totalMsgs = 1213 + 797 + 331
-
- # wait until flow control is active
- deadline = time() + 10
- while (not self.qmf.getObjects(_objectId=oid)[0].flowStopped) and \
- time() < deadline:
- pass
- self.failUnless(self.qmf.getObjects(_objectId=oid)[0].flowStopped)
- depth = self.qmf.getObjects(_objectId=oid)[0].msgDepth
- self.assertGreater(depth, 373)
-
- # now wait until the enqueues stop happening - ensure that
- # not all msgs have been sent (senders are blocked)
- sleep(1)
- newDepth = self.qmf.getObjects(_objectId=oid)[0].msgDepth
- while depth != newDepth:
- depth = newDepth;
- sleep(1)
- newDepth = self.qmf.getObjects(_objectId=oid)[0].msgDepth
- self.assertGreater(totalMsgs, depth)
-
- # drain the queue
- rcvr = self._start_qpid_receive("test-q",
- count=totalMsgs)
- count = 0;
- x = rcvr.readline() # prints a line for each received msg
- while x:
- count += 1;
- x = rcvr.readline()
-
- sndr1.close();
- sndr2.close();
- sndr3.close();
- rcvr.close();
-
- self.assertEqual(count, totalMsgs)
- self.failIf(self.qmf.getObjects(_objectId=oid)[0].flowStopped)
- self.failUnless(self.qmf.getObjects(_objectId=oid)[0].flowStoppedCount)
-
- self._delete_queue("test-q")
-
-
- def test_flow_size(self):
- """ Create a queue with size-based flow limit. Spawn several
- producers which will exceed the limit. Verify limit exceeded. Consume
- all messages. Verify flow control released.
- """
- self.startQmf();
- oid = self._create_queue("test-q", stop_size=351133, resume_size=251143)
-
- sndr1 = self._start_qpid_send("test-q", count=1699, content="X"*439, capacity=53);
- sndr2 = self._start_qpid_send("test-q", count=1129, content="Y"*631, capacity=13);
- sndr3 = self._start_qpid_send("test-q", count=881, content="Z"*823, capacity=149);
- totalMsgs = 1699 + 1129 + 881
-
- # wait until flow control is active
- deadline = time() + 10
- while (not self.qmf.getObjects(_objectId=oid)[0].flowStopped) and \
- time() < deadline:
- pass
- self.failUnless(self.qmf.getObjects(_objectId=oid)[0].flowStopped)
- self.assertGreater(self.qmf.getObjects(_objectId=oid)[0].byteDepth, 351133)
-
- # now wait until the enqueues stop happening - ensure that
- # not all msgs have been sent (senders are blocked)
- depth = self.qmf.getObjects(_objectId=oid)[0].msgDepth
- sleep(1)
- newDepth = self.qmf.getObjects(_objectId=oid)[0].msgDepth
- while depth != newDepth:
- depth = newDepth;
- sleep(1)
- newDepth = self.qmf.getObjects(_objectId=oid)[0].msgDepth
- self.assertGreater(totalMsgs, depth)
-
- # drain the queue
- rcvr = self._start_qpid_receive("test-q",
- count=totalMsgs)
- count = 0;
- x = rcvr.readline() # prints a line for each received msg
- while x:
- count += 1;
- x = rcvr.readline()
-
- sndr1.close();
- sndr2.close();
- sndr3.close();
- rcvr.close();
-
- self.assertEqual(count, totalMsgs)
- self.failIf(self.qmf.getObjects(_objectId=oid)[0].flowStopped)
-
- self._delete_queue("test-q")
-
-
- def verify_limit(self, testq):
- """ run a limit check against the testq object
- """
-
- testq.mgmt = self.qmf.getObjects(_objectId=testq.oid)[0]
-
- # fill up the queue, waiting until flow control is active
- sndr1 = self._start_qpid_send(testq.mgmt.name, count=testq.sendCount, content=testq.content)
- deadline = time() + 10
- while (not testq.mgmt.flowStopped) and time() < deadline:
- testq.mgmt.update()
-
- self.failUnless(testq.verifyStopped())
-
- # now consume enough messages to drop below the flow resume point, and
- # verify flow control is released.
- rcvr = self._start_qpid_receive(testq.mgmt.name, count=testq.consumeCount)
- rcvr.readlines() # prints a line for each received msg
- rcvr.close();
-
- # we should now be below the resume threshold
- self.failUnless(testq.verifyResumed())
-
- self._delete_queue(testq.mgmt.name)
- sndr1.close();
-
-
- def test_default_flow_count(self):
- """ Create a queue with count-based size limit, and verify the computed
- thresholds using the broker's default ratios.
- """
- class TestQ:
- def __init__(self, oid):
- # Use the broker-wide default flow thresholds of 80%/70% (see
- # run_queue_flow_limit_tests) to base the thresholds off the
- # queue's max_count configuration parameter
- # max_count == 1000 -> stop == 800, resume == 700
- self.oid = oid
- self.sendCount = 1000
- self.consumeCount = 301 # (send - resume) + 1 to reenable flow
- self.content = "X"
- def verifyStopped(self):
- self.mgmt.update()
- return self.mgmt.flowStopped and (self.mgmt.msgDepth > 800)
- def verifyResumed(self):
- self.mgmt.update()
- return (not self.mgmt.flowStopped) and (self.mgmt.msgDepth < 700)
-
- self.startQmf();
- oid = self._create_queue("test-X", max_count=1000)
- self.verify_limit(TestQ(oid))
-
-
- def test_default_flow_size(self):
- """ Create a queue with byte-based size limit, and verify the computed
- thresholds using the broker's default ratios.
- """
- class TestQ:
- def __init__(self, oid):
- # Use the broker-wide default flow thresholds of 80%/70% (see
- # run_queue_flow_limit_tests) to base the thresholds off the
- # queue's max_count configuration parameter
- # max_size == 10000 -> stop == 8000 bytes, resume == 7000 bytes
- self.oid = oid
- self.sendCount = 2000
- self.consumeCount = 601 # (send - resume) + 1 to reenable flow
- self.content = "XXXXX" # 5 bytes per message sent.
- def verifyStopped(self):
- self.mgmt.update()
- return self.mgmt.flowStopped and (self.mgmt.byteDepth > 8000)
- def verifyResumed(self):
- self.mgmt.update()
- return (not self.mgmt.flowStopped) and (self.mgmt.byteDepth < 7000)
-
- self.startQmf();
- oid = self._create_queue("test-Y", max_size=10000)
- self.verify_limit(TestQ(oid))
-
-
- def test_blocked_queue_delete(self):
- """ Verify that blocked senders are unblocked when a queue that is flow
- controlled is deleted.
- """
-
- class BlockedSender(Thread):
- def __init__(self, tester, queue, count, capacity=10):
- self.tester = tester
- self.queue = queue
- self.count = count
- self.capacity = capacity
- Thread.__init__(self)
- self.done = False
- self.start()
- def run(self):
- # spawn qpid-send
- p = self.tester._start_qpid_send(self.queue,
- self.count,
- self.capacity)
- p.close() # waits for qpid-send to complete
- self.done = True
-
- self.startQmf();
- oid = self._create_queue("kill-q", stop_size=10, resume_size=2)
- q = self.qmf.getObjects(_objectId=oid)[0]
- self.failIf(q.flowStopped)
-
- sender = BlockedSender(self, "kill-q", count=100)
- # wait for flow control
- deadline = time() + 10
- while (not q.flowStopped) and time() < deadline:
- q.update()
-
- self.failUnless(q.flowStopped)
- self.failIf(sender.done) # sender blocked
-
- self._delete_queue("kill-q")
- sender.join(5)
- self.failIf(sender.isAlive())
- self.failUnless(sender.done)
-
-
-
-
diff --git a/cpp/src/tests/quick_perftest b/cpp/src/tests/quick_perftest
deleted file mode 100755
index 362f9ee96a..0000000000
--- a/cpp/src/tests/quick_perftest
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/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.
-#
-
-exec `dirname $0`/run_test ./qpid-perftest --summary --count 100
diff --git a/cpp/src/tests/quick_topictest b/cpp/src/tests/quick_topictest
deleted file mode 100755
index 0a6b29b33f..0000000000
--- a/cpp/src/tests/quick_topictest
+++ /dev/null
@@ -1,30 +0,0 @@
-#!/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.
-#
-
-
-# Quick and quiet topic test for make check.
-test -z "$srcdir" && srcdir=`dirname $0`
-$srcdir/topictest -s2 -m2 -b1 > topictest.log 2>&1 || {
- echo $0 FAILED:
- cat topictest.log
- exit 1
-}
-rm topictest.log
diff --git a/cpp/src/tests/quick_topictest.ps1 b/cpp/src/tests/quick_topictest.ps1
deleted file mode 100644
index 8f5b2caff7..0000000000
--- a/cpp/src/tests/quick_topictest.ps1
+++ /dev/null
@@ -1,30 +0,0 @@
-#
-# 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.
-#
-
-# Quick and quiet topic test for make check.
-[string]$me = $myInvocation.InvocationName
-$srcdir = Split-Path $me
-Invoke-Expression "$srcdir\topictest.ps1 -subscribers 2 -messages 2 -batches 1" > topictest.log 2>&1
-if (!$?) {
- "$me FAILED:"
- cat topictest.log
- exit 1
-}
-Remove-Item topictest.log
-exit 0
diff --git a/cpp/src/tests/quick_txtest b/cpp/src/tests/quick_txtest
deleted file mode 100755
index c872fcec12..0000000000
--- a/cpp/src/tests/quick_txtest
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/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.
-#
-
-exec `dirname $0`/run_test ./qpid-txtest --queues 4 --tx-count 10 --quiet
diff --git a/cpp/src/tests/receiver.cpp b/cpp/src/tests/receiver.cpp
deleted file mode 100644
index f1b462d6e4..0000000000
--- a/cpp/src/tests/receiver.cpp
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- *
- * 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.
- *
- */
-
-#include <qpid/client/FailoverManager.h>
-#include <qpid/client/Session.h>
-#include <qpid/client/Message.h>
-#include <qpid/client/SubscriptionManager.h>
-#include <qpid/client/SubscriptionSettings.h>
-#include "TestOptions.h"
-
-#include <iostream>
-#include <fstream>
-
-
-using namespace qpid;
-using namespace qpid::client;
-using namespace qpid::framing;
-
-using namespace std;
-
-namespace qpid {
-namespace tests {
-
-struct Args : public qpid::TestOptions
-{
- string queue;
- uint messages;
- bool ignoreDuplicates;
- uint creditWindow;
- uint ackFrequency;
- bool browse;
-
- Args() : queue("test-queue"), messages(0), ignoreDuplicates(false), creditWindow(0), ackFrequency(1), browse(false)
- {
- addOptions()
- ("queue", qpid::optValue(queue, "QUEUE NAME"), "Queue from which to request messages")
- ("messages", qpid::optValue(messages, "N"), "Number of messages to receive; 0 means receive indefinitely")
- ("ignore-duplicates", qpid::optValue(ignoreDuplicates), "Detect and ignore duplicates (by checking 'sn' header)")
- ("credit-window", qpid::optValue(creditWindow, "N"), "Credit window (0 implies infinite window)")
- ("ack-frequency", qpid::optValue(ackFrequency, "N"), "Ack frequency (0 implies none of the messages will get accepted)")
- ("browse", qpid::optValue(browse), "Browse rather than consuming");
- }
-};
-
-const string EOS("eos");
-const string SN("sn");
-
-class Receiver : public MessageListener, public FailoverManager::Command
-{
- public:
- Receiver(const string& queue, uint messages, bool ignoreDuplicates, uint creditWindow, uint ackFrequency, bool browse);
- void received(Message& message);
- void execute(AsyncSession& session, bool isRetry);
- private:
- const string queue;
- const uint count;
- const bool skipDups;
- SubscriptionSettings settings;
- Subscription subscription;
- uint processed;
- uint lastSn;
-
- bool isDuplicate(Message& message);
-};
-
-Receiver::Receiver(const string& q, uint messages, bool ignoreDuplicates, uint creditWindow, uint ackFrequency, bool browse) :
- queue(q), count(messages), skipDups(ignoreDuplicates), processed(0), lastSn(0)
-{
- if (browse) settings.acquireMode = ACQUIRE_MODE_NOT_ACQUIRED;
- if (creditWindow) settings.flowControl = FlowControl::messageWindow(creditWindow);
- settings.autoAck = ackFrequency;
-}
-
-void Receiver::received(Message& message)
-{
- if (!(skipDups && isDuplicate(message))) {
- bool eos = message.getData() == EOS;
- if (!eos) std::cout << message.getData() << std::endl;
- if (eos || ++processed == count) subscription.cancel();
- }
-}
-
-bool Receiver::isDuplicate(Message& message)
-{
- uint sn = message.getHeaders().getAsInt(SN);
- if (lastSn < sn) {
- lastSn = sn;
- return false;
- } else {
- return true;
- }
-}
-
-void Receiver::execute(AsyncSession& session, bool /*isRetry*/)
-{
- SubscriptionManager subs(session);
- subscription = subs.subscribe(*this, queue, settings);
- subs.run();
- if (settings.autoAck) {
- subscription.accept(subscription.getUnaccepted());
- }
-}
-
-}} // namespace qpid::tests
-
-using namespace qpid::tests;
-
-int main(int argc, char ** argv)
-{
- Args opts;
- try {
- opts.parse(argc, argv);
- FailoverManager connection(opts.con);
- Receiver receiver(opts.queue, opts.messages, opts.ignoreDuplicates, opts.creditWindow, opts.ackFrequency, opts.browse);
- connection.execute(receiver);
- connection.close();
- return 0;
- } catch(const std::exception& error) {
- std::cerr << "Failure: " << error.what() << std::endl;
- }
- return 1;
-}
diff --git a/cpp/src/tests/reliable_replication_test b/cpp/src/tests/reliable_replication_test
deleted file mode 100755
index f57d11a263..0000000000
--- a/cpp/src/tests/reliable_replication_test
+++ /dev/null
@@ -1,93 +0,0 @@
-#!/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:
-
-source ./test_env.sh
-
-trap stop_brokers EXIT
-
-stop_brokers() {
- if [[ $BROKER_A ]] ; then
- $QPIDD_EXEC --no-module-dir -q --port $BROKER_A
- unset BROKER_A
- fi
- if [[ $BROKER_B ]] ; then
- $QPIDD_EXEC --no-module-dir -q --port $BROKER_B
- unset BROKER_B
- fi
-}
-
-setup() {
- rm -f replication-source.log replication-dest.log
- $QPIDD_EXEC --daemon --port 0 --no-data-dir --no-module-dir --auth no --load-module $REPLICATING_LISTENER_LIB --replication-queue replication --create-replication-queue true --log-enable trace+ --log-to-file replication-source.log --log-to-stderr 0 > qpidd-repl.port
- BROKER_A=`cat qpidd-repl.port`
-
- $QPIDD_EXEC --daemon --port 0 --no-data-dir --no-module-dir --auth no --load-module $REPLICATION_EXCHANGE_LIB --log-enable info+ --log-to-file replication-dest.log --log-to-stderr 0 > qpidd-repl.port
- BROKER_B=`cat qpidd-repl.port`
-
- echo "Testing replication from port $BROKER_A to port $BROKER_B"
-
- $PYTHON_COMMANDS/qpid-config -a "localhost:$BROKER_B" add exchange replication replication
- $PYTHON_COMMANDS/qpid-route --ack 500 queue add "localhost:$BROKER_B" "localhost:$BROKER_A" replication replication
-
- #create test queue (only replicate enqueues for this test):
- $PYTHON_COMMANDS/qpid-config -a "localhost:$BROKER_A" add queue queue-a --generate-queue-events 1
- $PYTHON_COMMANDS/qpid-config -a "localhost:$BROKER_B" add queue queue-a
-}
-
-send() {
- ./sender --port $BROKER_A --routing-key queue-a --send-eos 1 < replicated.expected
-}
-
-receive() {
- rm -f replicated.actual
- ./receiver --port $BROKER_B --queue queue-a > replicated.actual
-}
-
-bounce_link() {
- echo "Destroying link..."
- $PYTHON_COMMANDS/qpid-route link del "localhost:$BROKER_B" "localhost:$BROKER_A"
- echo "Link destroyed; recreating route..."
- sleep 2
- $PYTHON_COMMANDS/qpid-route --ack 500 queue add "localhost:$BROKER_B" "localhost:$BROKER_A" replication replication
- echo "Route re-established"
-}
-
-if test -d ${PYTHON_DIR} && test -e $REPLICATING_LISTENER_LIB && test -e $REPLICATION_EXCHANGE_LIB ; then
- setup
- for i in `seq 1 100000`; do echo Message $i; done > replicated.expected
- send &
- receive &
- for i in `seq 1 5`; do sleep 10; bounce_link; done;
- wait
- #check that received list is identical to sent list
- diff replicated.actual replicated.expected || FAIL=1
- if [[ $FAIL ]]; then
- echo reliable replication test failed: expectations not met!
- exit 1
- else
- echo replication reliable in the face of link failures
- rm -f replication.actual replication.expected replication-source.log replication-dest.log qpidd-repl.port
- fi
-fi
-
diff --git a/cpp/src/tests/replaying_sender.cpp b/cpp/src/tests/replaying_sender.cpp
deleted file mode 100644
index a5549bfdf2..0000000000
--- a/cpp/src/tests/replaying_sender.cpp
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- *
- * 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.
- *
- */
-
-#include <qpid/client/FailoverManager.h>
-#include <qpid/client/Session.h>
-#include <qpid/client/AsyncSession.h>
-#include <qpid/client/Message.h>
-#include <qpid/client/MessageReplayTracker.h>
-#include <qpid/Exception.h>
-
-#include <iostream>
-#include <sstream>
-
-using namespace qpid;
-using namespace qpid::client;
-using namespace qpid::framing;
-
-using namespace std;
-
-namespace qpid {
-namespace tests {
-
-class Sender : public FailoverManager::Command
-{
- public:
- Sender(const std::string& queue, uint count, uint reportFreq);
- void execute(AsyncSession& session, bool isRetry);
- uint getSent();
-
- void setVerbosity ( int v ) { verbosity = v; }
- void setPersistence ( int p ) { persistence = p; }
-
- private:
- MessageReplayTracker sender;
- const uint count;
- uint sent;
- const uint reportFrequency;
- Message message;
- int verbosity;
- int persistence;
- string queueName;
-};
-
-Sender::Sender(const std::string& queue, uint count_, uint reportFreq )
- : sender(10),
- count(count_),
- sent(0),
- reportFrequency(reportFreq),
- verbosity(0),
- persistence(0),
- queueName ( queue )
-{
- message.getDeliveryProperties().setRoutingKey(queueName.c_str());
-}
-
-const string SN("sn");
-
-void Sender::execute(AsyncSession& session, bool isRetry)
-{
- if (verbosity > 0)
- std::cout << "replaying_sender " << (isRetry ? "first " : "re-") << "connect." << endl;
- if (isRetry) sender.replay(session);
- else sender.init(session);
- while (sent < count) {
- stringstream message_data;
- message_data << ++sent;
- message.setData(message_data.str());
- message.getHeaders().setInt(SN, sent);
- if ( persistence )
- message.getDeliveryProperties().setDeliveryMode(PERSISTENT);
-
- sender.send(message);
- if (count > reportFrequency && !(sent % reportFrequency)) {
- if ( verbosity > 0 )
- std::cout << "Sender sent "
- << sent
- << " of "
- << count
- << " on queue "
- << queueName
- << std::endl;
- }
- }
- message.setData("That's all, folks!");
- sender.send(message);
-
- if ( verbosity > 0 )
- std::cout << "SENDER COMPLETED\n";
-}
-
-uint Sender::getSent()
-{
- return sent;
-}
-
-}} // namespace qpid::tests
-
-using namespace qpid::tests;
-
-int main(int argc, char ** argv)
-{
- ConnectionSettings settings;
-
- if ( argc != 8 )
- {
- std::cerr << "Usage: replaying_sender host port n_messages report_frequency verbosity persistence queue_name\n";
- return 1;
- }
-
- settings.host = argv[1];
- settings.port = atoi(argv[2]);
- int n_messages = atoi(argv[3]);
- int reportFrequency = atoi(argv[4]);
- int verbosity = atoi(argv[5]);
- int persistence = atoi(argv[6]);
- char * queue_name = argv[7];
-
- FailoverManager connection(settings);
- Sender sender(queue_name, n_messages, reportFrequency );
- sender.setVerbosity ( verbosity );
- sender.setPersistence ( persistence );
- try {
- connection.execute ( sender );
- if ( verbosity > 0 )
- {
- std::cout << "Sender finished. Sent "
- << sender.getSent()
- << " messages on queue "
- << queue_name
- << endl;
- }
- connection.close();
- return 0;
- }
- catch(const std::exception& error)
- {
- cerr << "Sender (host: "
- << settings.host
- << " port: "
- << settings.port
- << " ) "
- << " Failed: "
- << error.what()
- << std::endl;
- }
- return 1;
-}
diff --git a/cpp/src/tests/replication_test b/cpp/src/tests/replication_test
deleted file mode 100755
index 8c37568875..0000000000
--- a/cpp/src/tests/replication_test
+++ /dev/null
@@ -1,182 +0,0 @@
-#!/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 test of the replication feature
-
-source ./test_env.sh
-
-trap stop_brokers INT TERM QUIT
-
-stop_brokers() {
- if [ x$BROKER_A != x ]; then
- $QPIDD_EXEC --no-module-dir -q --port $BROKER_A
- unset BROKER_A
- fi
- if [ x$BROKER_B != x ]; then
- $QPIDD_EXEC --no-module-dir -q --port $BROKER_B
- unset BROKER_B
- fi
-}
-
-if test -d ${PYTHON_DIR} && test -f "$REPLICATING_LISTENER_LIB" && test -f "$REPLICATION_EXCHANGE_LIB"; then
- rm -f queue-*.repl replication-*.log #cleanup from any earlier runs
-
- $QPIDD_EXEC --daemon --port 0 --no-data-dir --no-module-dir --auth no --load-module $REPLICATING_LISTENER_LIB --replication-queue replication --create-replication-queue true --log-enable info+ --log-to-file replication-source.log --log-to-stderr 0 > qpidd.port
- BROKER_A=`cat qpidd.port`
-
- $QPIDD_EXEC --daemon --port 0 --no-data-dir --no-module-dir --auth no --load-module $REPLICATION_EXCHANGE_LIB --log-enable info+ --log-to-file replication-dest.log --log-to-stderr 0 > qpidd.port
- BROKER_B=`cat qpidd.port`
- echo "Running replication test between localhost:$BROKER_A and localhost:$BROKER_B"
-
- $PYTHON_COMMANDS/qpid-config -a "localhost:$BROKER_B" add exchange replication replication
- $PYTHON_COMMANDS/qpid-route --ack 5 queue add "localhost:$BROKER_B" "localhost:$BROKER_A" replication replication
-
- #create test queues
-
- $PYTHON_COMMANDS/qpid-config -a "localhost:$BROKER_A" add queue queue-a --generate-queue-events 2
- $PYTHON_COMMANDS/qpid-config -a "localhost:$BROKER_A" add queue queue-b --generate-queue-events 2
- $PYTHON_COMMANDS/qpid-config -a "localhost:$BROKER_A" add queue queue-c --generate-queue-events 1
- $PYTHON_COMMANDS/qpid-config -a "localhost:$BROKER_A" add queue queue-d --generate-queue-events 2
- $PYTHON_COMMANDS/qpid-config -a "localhost:$BROKER_A" add queue queue-e --generate-queue-events 1
-
- $PYTHON_COMMANDS/qpid-config -a "localhost:$BROKER_B" add queue queue-a
- $PYTHON_COMMANDS/qpid-config -a "localhost:$BROKER_B" add queue queue-b
- $PYTHON_COMMANDS/qpid-config -a "localhost:$BROKER_B" add queue queue-c
- $PYTHON_COMMANDS/qpid-config -a "localhost:$BROKER_B" add queue queue-e
- #queue-d deliberately not declared on DR; this error case should be handled
-
- #publish and consume from test queues on broker A:
- i=1
- while [ $i -le 10 ]; do
- echo Message $i for A >> queue-a-input.repl
- i=`expr $i + 1`
- done
- i=1
- while [ $i -le 20 ]; do
- echo Message $i for B >> queue-b-input.repl
- i=`expr $i + 1`
- done
- i=1
- while [ $i -le 15 ]; do
- echo Message $i for C >> queue-c-input.repl
- i=`expr $i + 1`
- done
-
- ./sender --port $BROKER_A --routing-key queue-a --send-eos 1 < queue-a-input.repl
- ./sender --port $BROKER_A --routing-key queue-b --send-eos 1 < queue-b-input.repl
- ./sender --port $BROKER_A --routing-key queue-c --send-eos 1 < queue-c-input.repl
- echo dummy | ./sender --port $BROKER_A --routing-key queue-d --send-eos 1
-
- ./receiver --port $BROKER_A --queue queue-a --messages 5 > /dev/null
- ./receiver --port $BROKER_A --queue queue-b --messages 10 > /dev/null
- ./receiver --port $BROKER_A --queue queue-c --messages 10 > /dev/null
- ./receiver --port $BROKER_A --queue queue-d > /dev/null
-
-
- # What we are doing is putting a message on the end of repliaction queue & waiting for it on remote side
- # making sure all the messages have been flushed from the replication queue.
- echo dummy | ./sender --port $BROKER_A --routing-key queue-e --send-eos 1
- ./receiver --port $BROKER_B --queue queue-e --messages 1 > /dev/null
-
- #shutdown broker A then check that broker Bs versions of the queues are as expected
- $QPIDD_EXEC --no-module-dir -q --port $BROKER_A
- unset BROKER_A
-
- #validate replicated queues:
- ./receiver --port $BROKER_B --queue queue-a > queue-a-backup.repl
- ./receiver --port $BROKER_B --queue queue-b > queue-b-backup.repl
- ./receiver --port $BROKER_B --queue queue-c > queue-c-backup.repl
-
-
- tail -5 queue-a-input.repl > queue-a-expected.repl
- tail -10 queue-b-input.repl > queue-b-expected.repl
- diff queue-a-backup.repl queue-a-expected.repl || FAIL=1
- diff queue-b-backup.repl queue-b-expected.repl || FAIL=1
- diff queue-c-backup.repl queue-c-input.repl || FAIL=1
-
- grep 'queue-d does not exist' replication-dest.log > /dev/null || echo "WARNING: Expected error to be logged!"
-
- stop_brokers
-
- # now check offsets working (enqueue based on position being set, not queue abs position)
-
- $QPIDD_EXEC --daemon --port 0 --no-data-dir --no-module-dir --auth no --load-module $REPLICATING_LISTENER_LIB --replication-queue replication --create-replication-queue true --log-enable info+ --log-to-file replication-source.log --log-to-stderr 0 > qpidd.port
- BROKER_A=`cat qpidd.port`
-
- $QPIDD_EXEC --daemon --port 0 --no-data-dir --no-module-dir --auth no --load-module $REPLICATION_EXCHANGE_LIB --log-enable info+ --log-to-file replication-dest.log --log-to-stderr 0 > qpidd.port
- BROKER_B=`cat qpidd.port`
-
- $PYTHON_COMMANDS/qpid-config -a "localhost:$BROKER_B" add exchange replication replication
- $PYTHON_COMMANDS/qpid-route --ack 5 queue add "localhost:$BROKER_B" "localhost:$BROKER_A" replication replication
-
- $PYTHON_COMMANDS/qpid-config -a "localhost:$BROKER_A" add queue queue-e --generate-queue-events 2
- $PYTHON_COMMANDS/qpid-config -a "localhost:$BROKER_B" add queue queue-e
- $PYTHON_COMMANDS/qpid-config -a "localhost:$BROKER_A" add queue queue-d --generate-queue-events 1
- $PYTHON_COMMANDS/qpid-config -a "localhost:$BROKER_B" add queue queue-d
-
- i=1
- while [ $i -le 10 ]; do
- echo Message $i for A >> queue-e-input.repl
- i=`expr $i + 1`
- done
-
- ./sender --port $BROKER_A --routing-key queue-e --send-eos 1 < queue-e-input.repl
- ./receiver --port $BROKER_A --queue queue-e --messages 10 > /dev/null
-
- # What we are doing is putting a message on the end of repliaction queue & waiting for it on remote side
- # making sure all the messages have been flushed from the replication queue.
- echo dummy | ./sender --port $BROKER_A --routing-key queue-d --send-eos 1
- ./receiver --port $BROKER_B --queue queue-d --messages 1 > /dev/null
-
- # now check offsets working
- $QPIDD_EXEC --no-module-dir -q --port $BROKER_B
- unset BROKER_B
- $QPIDD_EXEC --daemon --port 0 --no-data-dir --no-module-dir --auth no --load-module $REPLICATION_EXCHANGE_LIB --log-enable info+ --log-to-file replication-dest.log --log-to-stderr 0 > qpidd.port
- BROKER_B=`cat qpidd.port`
-
- $PYTHON_COMMANDS/qpid-config -a "localhost:$BROKER_B" add queue queue-e
- $PYTHON_COMMANDS/qpid-config -a "localhost:$BROKER_B" add exchange replication replication
- $PYTHON_COMMANDS/qpid-route --ack 5 queue add "localhost:$BROKER_B" "localhost:$BROKER_A" replication replication
- # now send another 15
- i=11
- while [ $i -le 15 ]; do
- echo Message $i for A >> queue-e1-input.repl
- i=`expr $i + 1`
- done
- ./sender --port $BROKER_A --routing-key queue-e --send-eos 1 < queue-e1-input.repl
-
- ./receiver --port $BROKER_B --queue queue-e > queue-e-backup.repl
- diff queue-e-backup.repl queue-e1-input.repl || FAIL=1
-
- stop_brokers
-
- if [ x$FAIL != x ]; then
- echo replication test failed: expectations not met!
- exit 1
- else
- echo queue state replicated as expected
- rm -f queue-*.repl replication-*.log
- fi
-
-else
- echo "Skipping replication test, plugins not built or python utils not located"
-fi
-
diff --git a/cpp/src/tests/restart_cluster b/cpp/src/tests/restart_cluster
deleted file mode 100755
index 6a6abc8042..0000000000
--- a/cpp/src/tests/restart_cluster
+++ /dev/null
@@ -1,38 +0,0 @@
-#!/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.
-#
-
-# Re-start a cluster on the local host.
-
-srcdir=`dirname $0`
-$srcdir/stop_cluster
-exec $srcdir/start_cluster "$@"
-#!/bin/sh
-# Re-start a cluster on the local host.
-
-srcdir=`dirname $0`
-$srcdir/stop_cluster
-exec $srcdir/start_cluster "$@"
-#!/bin/sh
-# Re-start a cluster on the local host.
-
-srcdir=`dirname $0`
-$srcdir/stop_cluster
-exec $srcdir/start_cluster "$@"
diff --git a/cpp/src/tests/resuming_receiver.cpp b/cpp/src/tests/resuming_receiver.cpp
deleted file mode 100644
index 2e22a7c572..0000000000
--- a/cpp/src/tests/resuming_receiver.cpp
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- *
- * 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.
- *
- */
-
-#include <qpid/client/FailoverManager.h>
-#include <qpid/client/Session.h>
-#include <qpid/client/Message.h>
-#include <qpid/client/SubscriptionManager.h>
-
-#include <iostream>
-#include <fstream>
-
-using namespace qpid;
-using namespace qpid::client;
-using namespace qpid::framing;
-
-using namespace std;
-
-
-
-namespace qpid {
-namespace tests {
-
-class Listener : public MessageListener,
- public FailoverManager::Command,
- public FailoverManager::ReconnectionStrategy
-{
- public:
- Listener ( int report_frequency = 1000,
- int verbosity = 0,
- char const * queue_name = "message_queue" );
- void received(Message& message);
- void execute(AsyncSession& session, bool isRetry);
- void check();
- void editUrlList(vector<Url>& urls);
- private:
- Subscription subscription;
- uint count;
- vector<int> received_twice;
- uint lastSn;
- bool gaps;
- uint reportFrequency;
- int verbosity;
- bool done;
- string queueName;
-};
-
-
-Listener::Listener ( int freq, int verbosity, char const * name )
- : count(0),
- lastSn(0),
- gaps(false),
- reportFrequency(freq),
- verbosity(verbosity),
- done(false),
- queueName ( name )
-{}
-
-const std::string SN("sn");
-
-void Listener::received(Message & message)
-{
- if (message.getData() == "That's all, folks!")
- {
- done = true;
- if(verbosity > 0 )
- {
- cout << "Shutting down listener for "
- << message.getDestination() << endl;
-
- cout << "Listener received "
- << count
- << " messages ("
- << received_twice.size()
- << " received_twice)"
- << endl;
-
- }
- subscription.cancel();
- if ( verbosity > 0 )
- cout << "LISTENER COMPLETED\n";
-
- if ( ! gaps ) {
- cout << "no gaps were detected\n";
- cout << received_twice.size() << " messages were received twice.\n";
- }
- else {
- cout << "gaps detected\n";
- for ( unsigned int i = 0; i < received_twice.size(); ++ i )
- cout << "received_twice "
- << received_twice[i]
- << endl;
- }
- } else {
- uint sn = message.getHeaders().getAsInt(SN);
- if (lastSn < sn) {
- if (sn - lastSn > 1) {
- cerr << "Error: gap in sequence between " << lastSn << " and " << sn << endl;
- gaps = true;
- }
- lastSn = sn;
- ++count;
- if ( ! ( count % reportFrequency ) ) {
- if ( verbosity > 0 )
- cout << "Listener has received "
- << count
- << " messages on queue "
- << queueName
- << endl;
- }
- } else {
- received_twice.push_back ( sn );
- }
- }
-}
-
-void Listener::check()
-{
- if (gaps) throw Exception("Detected gaps in sequence; messages appear to have been lost.");
-}
-
-void Listener::execute(AsyncSession& session, bool isRetry) {
- if (verbosity > 0)
- cout << "resuming_receiver " << (isRetry ? "first " : "re-") << "connect." << endl;
- if (!done) {
- SubscriptionManager subs(session);
- subscription = subs.subscribe(*this, queueName);
- subs.run();
- }
-}
-
-void Listener::editUrlList(vector<Url>& urls)
-{
- /**
- * A more realistic algorithm would be to search through the list
- * for prefered hosts and ensure they come first in the list.
- */
- if (urls.size() > 1) rotate(urls.begin(), urls.begin() + 1, urls.end());
-}
-
-}} // namespace qpid::tests
-
-using namespace qpid::tests;
-
-int main(int argc, char ** argv)
-{
- ConnectionSettings settings;
-
- if ( argc != 6 )
- {
- cerr << "Usage: resuming_receiver host port report_frequency verbosity queue_name\n";
- return 1;
- }
-
- settings.host = argv[1];
- settings.port = atoi(argv[2]);
- int reportFrequency = atoi(argv[3]);
- int verbosity = atoi(argv[4]);
- char * queue_name = argv[5];
-
- Listener listener ( reportFrequency, verbosity, queue_name );
- FailoverManager connection(settings, &listener);
-
- try {
- connection.execute(listener);
- connection.close();
- listener.check();
- return 0;
- } catch(const exception& error) {
- cerr << "Receiver failed: " << error.what() << endl;
- }
- return 1;
-}
-
-
-
diff --git a/cpp/src/tests/ring_queue_test b/cpp/src/tests/ring_queue_test
deleted file mode 100755
index 553746eb49..0000000000
--- a/cpp/src/tests/ring_queue_test
+++ /dev/null
@@ -1,174 +0,0 @@
-#!/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.
-#
-
-# Test script for validating the behaviour of a ring queue
-
-QUEUE_NAME=ring-queue
-LIMIT=100
-DURABLE=0
-MESSAGES=10000
-SENDERS=1
-RECEIVERS=1
-CONCURRENT=0
-BROKER_URL="-a ${QPID_BROKER:-localhost}:${QPID_PORT:-5672}"
-
-setup() {
- if [[ $DURABLE -gt 0 ]]; then
- EXTRA_ARGS=" --durable"
- fi
- qpid-config $BROKER_URL add queue $QUEUE_NAME --max-queue-count $LIMIT --limit-policy ring $EXTRA_ARGS
-}
-
-send() {
- datagen --count $MESSAGES | tee sender_${QUEUE_NAME}_${1} | sender --durable $DURABLE --routing-key $QUEUE_NAME
-}
-
-receive() {
- #TODO: allow a variety of receiver options to be passed in (ack-frequency, credit-window etc)
- receiver --queue $QUEUE_NAME > receiver_${QUEUE_NAME}_${1}
-}
-
-cleanup() {
- rm -f sender_${QUEUE_NAME}_* receiver_${QUEUE_NAME}_*
- qpid-config $BROKER_URL del queue $QUEUE_NAME --force
-}
-
-log() {
- echo $1
-}
-
-fail() {
- echo $1
- FAILED=1
-}
-
-validate() {
- if [[ $RECEIVERS -eq 0 ]]; then
- #queue should have $LIMIT messages on it, but need to send an eos also
- sender --routing-key $QUEUE_NAME --send-eos 1 < /dev/null
- received=$(receiver --queue $QUEUE_NAME --browse | wc -l)
- if [[ received -eq $(( $LIMIT - 1)) ]]; then
- log "queue contains $LIMIT messages as expected"
- else
- fail "queue does not contain the expected $LIMIT messages (received $received)"
- fi
- elif [[ $CONCURRENT -eq 0 ]]; then
- #sum of length of all output files should be equal to $LIMIT - $RECEIVERS (1 eos message each)
- received=$(cat receiver_${QUEUE_NAME}_* | wc -l)
- expected=$(( $LIMIT - $RECEIVERS ))
- if [[ $received -eq $expected ]]; then
- log "received $LIMIT messages as expected"
- else
- fail "received $received messages, expected $expected"
- fi
- #if there were only a single sender and receiver (executed serially) we can check the
- #actual received contents
- if [[ $RECEIVERS -eq 1 ]] && [[ $SENDERS -eq 1 ]]; then
- tail -n $(($LIMIT - 1)) sender_${QUEUE_NAME}_1 | diff - receiver_${QUEUE_NAME}_1 || FAILED=1
- if [[ $FAILED -eq 1 ]]; then
- fail "did not receive expected messages"
- else
- log "received messages matched expectations"
- fi
- fi
- else
- #multiple receivers, concurrent with senders; ring queue functionality cannot be validated in this case
- if [[ $(cat receiver_${QUEUE_NAME}_* | wc -l) -le $(cat sender_${QUEUE_NAME}_* | wc -l) ]]; then
- log "sent at least as many messages as were received"
- else
- #Note: if any receiver was browsing, this would be valid (would need to add 'sort | uniq')
- # to pipeline above
- fail "received more messages than were sent"
- fi
- fi
-
- if [[ $FAILED ]]; then
- echo $(basename $0): FAILED
- exit 1
- else
- cleanup
- fi
-}
-
-run_test() {
- if [[ $CONCURRENT -eq 0 ]]; then
- echo "Starting $SENDERS senders followed by $RECEIVERS receivers "
- else
- echo "Starting $SENDERS senders concurrently with $RECEIVERS receivers"
- fi
- for ((i=1; i <= $SENDERS; i++)); do
- send $i &
- sender_pids[$i]=$!
- done
- if [[ $CONCURRENT -eq 0 ]] && [[ $RECEIVERS -gt 0 ]]; then
- wait
- sender --routing-key $QUEUE_NAME --send-eos $RECEIVERS < /dev/null
- fi
- for ((i=1; i <= $RECEIVERS; i++)); do
- receive $i &
- done
- if [[ $CONCURRENT -gt 0 ]]; then
- for ((i=1; i <= $SENDERS; i++)); do
- wait ${sender_pids[$i]}
- done
- sender --routing-key $QUEUE_NAME --send-eos $RECEIVERS < /dev/null
- fi
- wait
-}
-
-usage() {
- cat <<EOF
-$(basename $0): Test script for validating the behaviour of a ring queue
-
-Options:
- -q <queue> the name of the queue to use
- -s <senders> the number of senders to start
- -r <receivers> the number of receivers to start
- -l <limit> the limit for the ring queue
- -m <messages> the number of messages to send
- -c if specified, receivers will run concurrently with senders
- -d if specified the queue and messages will be durable
-EOF
- exit 1
-}
-
-while getopts "s:r:m:u:dch" opt ; do
- case $opt in
- q) QUEUE_NAME=$OPTARG ;;
- l) LIMIT=$OPTARG ;;
- s) SENDERS=$OPTARG ;;
- r) RECEIVERS=$OPTARG ;;
- m) MESSAGES=$OPTARG ;;
- d) DURABLE=1 ;;
- c) CONCURRENT=1 ;;
- h) usage;;
- ?) usage;;
- esac
-done
-
-if [[ $SENDERS -gt 0 ]]; then
- setup
- run_test
- validate
-else
- echo "Nothing can be done if there are no senders"
-fi
-
diff --git a/cpp/src/tests/rsynchosts b/cpp/src/tests/rsynchosts
deleted file mode 100755
index 56ee57e898..0000000000
--- a/cpp/src/tests/rsynchosts
+++ /dev/null
@@ -1,49 +0,0 @@
-#!/bin/sh
-#
-# Licensed to the Apache Software Foundation (ASF) under onemake
-# 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.
-#
-
-absdir() { echo `cd $1 && pwd`; }
-
-abspath() {
- if test -d "$1"; then absdir "$1";
- else echo $(absdir $(dirname "$1"))/$(basename "$1")
- fi
-}
-
-usage() {
- echo "Usage: $(basename $0) file [file...]
-Synchronize the contents of each file or directory to the same absolute path on
-each host in \$HOSTS.
-"
- exit 1
-}
-
-test "$*" || usage
-
-for f in $*; do FILES="$FILES $(abspath $f)" || exit 1; done
-
-OK_FILE=`mktemp` # Will be deleted if anything goes wrong.
-trap "rm -f $OK_FILE" EXIT
-
-for h in $HOSTS; do
- rsync -aRO --delete $FILES $h:/ || { echo "rsync to $h failed"; rm -f $OK_FILE; } &
-done
-wait
-test -f $OK_FILE
-
diff --git a/cpp/src/tests/run-unit-tests b/cpp/src/tests/run-unit-tests
deleted file mode 100755
index 862a76c4f5..0000000000
--- a/cpp/src/tests/run-unit-tests
+++ /dev/null
@@ -1,48 +0,0 @@
-#!/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.
-#
-
-#
-# Library names (without path or .so) and CppUnit test paths can be
-# specified on the command line or in env var UNIT_TESTS. For example:
-#
-# Selected test classes:
-# ./run-unit-tests ValueTest ClientChannelTest
-#
-# Individual test method
-# ./run-unit-tests ValueTest :ValueTest::testStringValueEquals
-#
-# Build and run selected tests:
-# make check TESTS=run-unit-tests UNIT_TESTS=ClientChannelTest
-#
-
-for u in $* $UNIT_TESTS ; do
- case $u in
- :*) TEST_ARGS="$TEST_ARGS $u" ;; # A test path.
- *) TEST_ARGS="$TEST_ARGS .libs/$u.so" ;; # A test library.
- esac
-done
-test -z "$TEST_ARGS" && TEST_ARGS=".libs/*Test.so"
-
-test -z "$srcdir" && srcdir=.
-
-# libdlclose_noop prevents unloading symbols needed for valgrind output.
-export LD_PRELOAD=.libs/libdlclose_noop.so
-source $srcdir/run_test DllPlugInTester -c -b $TEST_ARGS
diff --git a/cpp/src/tests/run_acl_tests b/cpp/src/tests/run_acl_tests
deleted file mode 100755
index 41f41e20e1..0000000000
--- a/cpp/src/tests/run_acl_tests
+++ /dev/null
@@ -1,62 +0,0 @@
-#!/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
-
-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 > qpidd.port
- LOCAL_PORT=`cat qpidd.port`
-}
-
-stop_brokers() {
- $QPIDD_EXEC --no-module-dir -q --port $LOCAL_PORT
-}
-
-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 Read ACL file" temp.log | sed 's/^.*Read ACL 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
- mkdir -p $DATA_DIR
- cp $srcdir/policy.acl $DATA_DIR
- start_brokers
- echo "Running acl tests using brokers on ports $LOCAL_PORT"
- $QPID_PYTHON_TEST -b localhost:$LOCAL_PORT -m acl || EXITCODE=1
- stop_brokers || EXITCODE=1
- test_loading_acl_from_absolute_path || EXITCODE=1
- rm -rf $DATA_DIR
- exit $EXITCODE
-fi
-
diff --git a/cpp/src/tests/run_acl_tests.ps1 b/cpp/src/tests/run_acl_tests.ps1
deleted file mode 100644
index a1848779c7..0000000000
--- a/cpp/src/tests/run_acl_tests.ps1
+++ /dev/null
@@ -1,102 +0,0 @@
-#
-# 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 = Split-Path $myInvocation.InvocationName
-$PYTHON_DIR = "$srcdir\..\..\..\python"
-if (!(Test-Path $PYTHON_DIR -pathType Container)) {
- "Skipping acl tests as python libs not found"
- exit 1
-}
-
-$PYTHON_TEST_DIR = "$srcdir\..\..\..\tests\src\py"
-$QMF_LIB = "$srcdir\..\..\..\extras\qmf\src\py"
-$env:PYTHONPATH="$PYTHON_DIR;$srcdir;$PYTHON_TEST_DIR;$QMF_LIB"
-$Global:BROKER_EXE = ""
-
-Function start_broker($acl_options)
-{
- # Test runs from the tests directory but the broker executable is one level
- # up, and most likely in a subdirectory from there based on what build type.
- # Look around for it before trying to start it.
- . $srcdir\find_prog.ps1 ..\qpidd.exe
- if (!(Test-Path $prog)) {
- "Cannot locate qpidd.exe"
- exit 1
- }
- $Global:BROKER_EXE = $prog
- if (Test-Path qpidd.port) {
- Remove-Item qpidd.port
- }
- $cmdline = "$prog --auth=no --no-module-dir --port=0 --log-to-file qpidd.log $acl_options | foreach { set-content qpidd.port `$_ }"
- $cmdblock = $executioncontext.invokecommand.NewScriptBlock($cmdline)
- . $srcdir\background.ps1 $cmdblock
- # Wait for the broker to start
- $wait_time = 0
- while (!(Test-Path qpidd.port) -and ($wait_time -lt 10)) {
- Start-Sleep 2
- $wait_time += 2
- }
- if (!(Test-Path qpidd.port)) {
- "Timeout waiting for broker to start"
- exit 1
- }
- set-item -path env:BROKER_PORT -value (get-content -path qpidd.port -totalcount 1)
-}
-
-Function stop_broker
-{
- "Stopping $Global:BROKER_EXE"
- Invoke-Expression "$Global:BROKER_EXE --no-module-dir -q --port $env:BROKER_PORT" | Write-Output
- Remove-Item qpidd.port
-}
-
-$DATA_DIR = [IO.Directory]::GetCurrentDirectory() + "\data_dir"
-Remove-Item $DATA_DIR -recurse
-New-Item $DATA_DIR -type directory
-Copy-Item $srcdir\policy.acl $DATA_DIR
-start_broker("--data-dir $DATA_DIR --acl-file policy.acl")
-"Running acl tests using broker on port $env:BROKER_PORT"
-Invoke-Expression "python $PYTHON_DIR/qpid-python-test -m acl -b localhost:$env:BROKER_PORT" | Out-Default
-$RETCODE=$LASTEXITCODE
-stop_broker
-
-# Now try reading the acl file from an absolute path.
-Remove-Item qpidd.log
-$policy_full_path = "$srcdir\policy.acl"
-start_broker("--no-data-dir --acl-file $policy_full_path")
-#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 Read ACL file" temp.log | sed 's/^.*Read ACL 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
-#}
-#
-# test_loading_acl_from_absolute_path || EXITCODE=1
-# rm -rf $DATA_DIR
-# exit $EXITCODE
-stop_broker
-exit $RETCODE
diff --git a/cpp/src/tests/run_cli_tests b/cpp/src/tests/run_cli_tests
deleted file mode 100755
index ec5c71b646..0000000000
--- a/cpp/src/tests/run_cli_tests
+++ /dev/null
@@ -1,81 +0,0 @@
-#!/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 cli-utility tests.
-
-source ./test_env.sh
-CLI_DIR=$PYTHON_COMMANDS
-
-trap stop_brokers INT TERM QUIT
-
-# helper function to create test.xquery in the current directory, so
-# that the python test program can find it. yes, it leaves a turd.
-create_test_xquery() {
- cat <<EOF > ./test.xquery
- let \$w := ./weather
- return \$w/station = 'Raleigh-Durham International Airport (KRDU)'
- and \$w/temperature_f > 50
- and \$w/temperature_f - \$w/dewpoint > 5
- and \$w/wind_speed_mph > 7
- and \$w/wind_speed_mph < 20
-EOF
-}
-
-start_brokers() {
- # if the xml lib is present, use it. if not, disable any tests which
- # look like they're xml related.
- # if we start supporting xml on windows, it will need something similar
- # here
- if [ -f ../.libs/xml.so ] ; then
- xargs="--load-module ../.libs/xml.so"
- if [ ! -f test.xquery ] ; then
- create_test_xquery
- fi
- targs=""
- else
- echo "Ignoring XML tests"
- xargs=""
- targs="--ignore=*xml*"
- fi
-
- ../qpidd --daemon --port 0 --no-data-dir --no-module-dir --auth no $xargs > qpidd.port
- LOCAL_PORT=`cat qpidd.port`
- ../qpidd --daemon --port 0 --no-data-dir --no-module-dir --auth no $xargs > qpidd.port
- REMOTE_PORT=`cat qpidd.port`
-}
-
-stop_brokers() {
- $QPIDD_EXEC --no-module-dir -q --port $LOCAL_PORT
- $QPIDD_EXEC --no-module-dir -q --port $REMOTE_PORT
-}
-
-if test -d ${PYTHON_DIR} ; then
- start_brokers
- echo "Running CLI tests using brokers on ports $LOCAL_PORT $REMOTE_PORT"
- PYTHON_TESTS=${PYTHON_TESTS:-$*}
- $QPID_PYTHON_TEST -m cli_tests -b localhost:$LOCAL_PORT -Dremote-port=$REMOTE_PORT -Dcli-dir=$CLI_DIR $targs $PYTHON_TESTS $@
- RETCODE=$?
- stop_brokers
- if test x$RETCODE != x0; then
- echo "FAIL CLI tests"; exit 1;
- fi
-fi
-
diff --git a/cpp/src/tests/run_cluster_authentication_soak b/cpp/src/tests/run_cluster_authentication_soak
deleted file mode 100755
index 7bc406c4ca..0000000000
--- a/cpp/src/tests/run_cluster_authentication_soak
+++ /dev/null
@@ -1,26 +0,0 @@
-#! /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.
-
-
-source ./test_env.sh
-source $srcdir/ais_check
-source sasl_test_setup.sh
-
-with_ais_group ./cluster_authentication_soak 500
-
diff --git a/cpp/src/tests/run_cluster_authentication_test b/cpp/src/tests/run_cluster_authentication_test
deleted file mode 100755
index 647200b869..0000000000
--- a/cpp/src/tests/run_cluster_authentication_test
+++ /dev/null
@@ -1,26 +0,0 @@
-#! /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.
-
-
-source ./test_env.sh
-source $srcdir/ais_check
-source sasl_test_setup.sh
-
-with_ais_group ./cluster_authentication_soak
-
diff --git a/cpp/src/tests/run_cluster_test b/cpp/src/tests/run_cluster_test
deleted file mode 100755
index c022eea1fe..0000000000
--- a/cpp/src/tests/run_cluster_test
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/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 tests
-srcdir=`dirname $0`
-. $srcdir/ais_check
-with_ais_group $srcdir/run_test ./cluster_test
diff --git a/cpp/src/tests/run_cluster_tests b/cpp/src/tests/run_cluster_tests
deleted file mode 100755
index e136d3810a..0000000000
--- a/cpp/src/tests/run_cluster_tests
+++ /dev/null
@@ -1,37 +0,0 @@
-#!/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.
-#
-
-source ./test_env.sh
-source $srcdir/ais_check
-
-test -x $QPID_PYTHON_TEST || { echo Skipping test, $QPID_PYTHON_TEST not found; exit 0; }
-
-# Delete old cluster test data
-OUTDIR=${OUTDIR:-brokertest.tmp}
-rm -rf $OUTDIR
-mkdir -p $OUTDIR
-
-# Ignore tests requiring a store by default.
-CLUSTER_TESTS_IGNORE=${CLUSTER_TESTS_IGNORE:--i cluster_tests.StoreTests.* -I $srcdir/cluster_tests.fail}
-CLUSTER_TESTS=${CLUSTER_TESTS:-$*}
-
-with_ais_group $QPID_PYTHON_TEST -DOUTDIR=$OUTDIR -m cluster_tests $CLUSTER_TESTS_IGNORE $CLUSTER_TESTS || exit 1
-rm -rf $OUTDIR
diff --git a/cpp/src/tests/run_failover_soak b/cpp/src/tests/run_failover_soak
deleted file mode 100755
index cce8b07a26..0000000000
--- a/cpp/src/tests/run_failover_soak
+++ /dev/null
@@ -1,38 +0,0 @@
-#!/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.
-#
-
-source ./test_env.sh
-. $srcdir/ais_check
-
-host=127.0.0.1
-
-unset QPID_NO_MODULE_DIR # failover_soak uses --module-dir, dont want clash
-MODULES=${MODULES:-$moduledir}
-MESSAGES=${MESSAGES:-500000}
-REPORT_FREQUENCY=${REPORT_FREQUENCY:-20000}
-VERBOSITY=${VERBOSITY:-0}
-DURABILITY=${DURABILITY:-0}
-N_QUEUES=${N_QUEUES:-1}
-N_BROKERS=${N_BROKERS:-4}
-
-rm -f soak-*.log
-exec ./failover_soak $MODULES ./declare_queues ./replaying_sender ./resuming_receiver $MESSAGES $REPORT_FREQUENCY $VERBOSITY $DURABILITY $N_QUEUES $N_BROKERS
-
diff --git a/cpp/src/tests/run_federation_tests b/cpp/src/tests/run_federation_tests
deleted file mode 100755
index 590f74746e..0000000000
--- a/cpp/src/tests/run_federation_tests
+++ /dev/null
@@ -1,64 +0,0 @@
-#!/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 federation tests.
-
-source ./test_env.sh
-
-trap stop_brokers INT TERM QUIT
-
-if [ -f ../.libs/xml.so ] ; then
- MODULES="--load-module xml" # Load the XML exchange and run XML exchange federation tests
- SKIPTESTS=""
-else
- MODULES="--no-module-dir"
- SKIPTESTS="-i *xml"
-fi
-
-start_brokers() {
- ../qpidd --daemon --port 0 --no-data-dir $MODULES --auth no > qpidd.port
- LOCAL_PORT=`cat qpidd.port`
- ../qpidd --daemon --port 0 --no-data-dir $MODULES --auth no > qpidd.port
- REMOTE_PORT=`cat qpidd.port`
-
- ../qpidd --daemon --port 0 --no-data-dir $MODULES --auth no > qpidd.port
- REMOTE_B1=`cat qpidd.port`
- ../qpidd --daemon --port 0 --no-data-dir $MODULES --auth no > qpidd.port
- REMOTE_B2=`cat qpidd.port`
-}
-
-stop_brokers() {
- $QPIDD_EXEC $MODULES -q --port $LOCAL_PORT
- $QPIDD_EXEC $MODULES -q --port $REMOTE_PORT
- $QPIDD_EXEC $MODULES -q --port $REMOTE_B1
- $QPIDD_EXEC $MODULES -q --port $REMOTE_B2
-}
-
-if test -d ${PYTHON_DIR} ; then
- start_brokers
- echo "Running federation tests using brokers on ports $LOCAL_PORT $REMOTE_PORT $REMOTE_B1 $REMOTE_B2"
- $QPID_PYTHON_TEST -m federation $SKIPTESTS -b localhost:$LOCAL_PORT -Dremote-port=$REMOTE_PORT -Dextra-brokers="$REMOTE_B1 $REMOTE_B2" $@
- RETCODE=$?
- stop_brokers
- if test x$RETCODE != x0; then
- echo "FAIL federation tests"; exit 1;
- fi
-fi
diff --git a/cpp/src/tests/run_federation_tests.ps1 b/cpp/src/tests/run_federation_tests.ps1
deleted file mode 100644
index 35353a870f..0000000000
--- a/cpp/src/tests/run_federation_tests.ps1
+++ /dev/null
@@ -1,84 +0,0 @@
-#
-# 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 federation tests.
-
-$srcdir = Split-Path $myInvocation.InvocationName
-$PYTHON_DIR = "$srcdir\..\..\..\python"
-if (!(Test-Path $PYTHON_DIR -pathType Container)) {
- "Skipping federation tests as python libs not found"
- exit 1
-}
-
-$PYTHON_TEST_DIR = "$srcdir\..\..\..\tests\src\py"
-$QMF_LIB = "$srcdir\..\..\..\extras\qmf\src\py"
-
-# Test runs from the tests directory but the broker executable is one level
-# up, and most likely in a subdirectory from there based on what build type.
-# Look around for it before trying to start it.
-$subs = "Debug","Release","MinSizeRel","RelWithDebInfo"
-foreach ($sub in $subs) {
- $prog = "..\$sub\qpidd.exe"
- if (Test-Path $prog) {
- break
- }
-}
-if (!(Test-Path $prog)) {
- "Cannot locate qpidd.exe"
- exit 1
-}
-$cmdline = "$prog --auth=no --no-module-dir --no-data-dir --port=0 --ssl-port=0 --log-to-file qpidd.log $args | foreach { set-content qpidd.port `$_ }"
-$cmdblock = $executioncontext.invokecommand.NewScriptBlock($cmdline)
-
-function start_brokers {
- # Start 2 brokers, saving the port numbers in LOCAL_PORT, REMOTE_PORT.
- . $srcdir\background.ps1 $cmdblock
- while (!(Test-Path qpidd.port)) {
- Start-Sleep 2
- }
- set-item -path env:LOCAL_PORT -value (get-content -path qpidd.port -totalcount 1)
- Remove-Item qpidd.port
- . $srcdir\background.ps1 $cmdblock
- while (!(Test-Path qpidd.port)) {
- Start-Sleep 2
- }
- set-item -path env:REMOTE_PORT -value (get-content -path qpidd.port -totalcount 1)
-}
-
-function stop_brokers {
- Invoke-Expression "$prog -q --port $env:LOCAL_PORT" | Out-Default
- Invoke-Expression "$prog -q --port $env:REMOTE_PORT" | Out-Default
-}
-
-trap {
- &stop_brokers
- break
-}
-
-&start_brokers
-"Running federation tests using brokers on ports $env:LOCAL_PORT $env:REMOTE_PORT"
-$env:PYTHONPATH="$srcdir;$PYTHON_DIR;$PYTHON_TEST_DIR;$env:PYTHONPATH;$QMF_LIB"
-$tests = "*"
-Invoke-Expression "python $PYTHON_DIR/qpid-python-test -m federation -b localhost:$env:LOCAL_PORT -Dremote-port=$env:REMOTE_PORT $tests" | Out-Default
-$RETCODE=$LASTEXITCODE
-&stop_brokers
-if ($RETCODE -ne 0) {
- "FAIL federation tests"
- exit 1
-}
diff --git a/cpp/src/tests/run_header_test b/cpp/src/tests/run_header_test
deleted file mode 100755
index 34008132cc..0000000000
--- a/cpp/src/tests/run_header_test
+++ /dev/null
@@ -1,37 +0,0 @@
-#!/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.
-#
-
-# Simple test of encode/decode of a double in application headers
-# TODO: this should be expanded to cover a wider set of types and go
-# in both directions
-
-srcdir=`dirname $0`
-source ./test_env.sh
-
-test -f qpidd.port && QPID_PORT=`cat qpidd.port`
-
-if test -d ${PYTHON_DIR} ; then
- ./header_test -p $QPID_PORT
- $srcdir/header_test.py "localhost" $QPID_PORT
-else
- echo "Skipping header test as python libs not found"
-fi
-
diff --git a/cpp/src/tests/run_header_test.ps1 b/cpp/src/tests/run_header_test.ps1
deleted file mode 100644
index 7d3e43a30f..0000000000
--- a/cpp/src/tests/run_header_test.ps1
+++ /dev/null
@@ -1,47 +0,0 @@
-#
-# 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.
-#
-
-# Simple test of encode/decode of a double in application headers
-# TODO: this should be expanded to cover a wider set of types and go
-# in both directions
-
-$srcdir = Split-Path $myInvocation.InvocationName
-$PYTHON_DIR = "$srcdir\..\..\..\python"
-if (!(Test-Path $PYTHON_DIR -pathType Container)) {
- "Skipping header test as python libs not found"
- exit 0
-}
-
-if (Test-Path qpidd.port) {
- set-item -path env:QPID_PORT -value (get-content -path qpidd.port -totalcount 1)
-}
-
-# Test runs from the tests directory but the test executables are in a
-# subdirectory based on the build type. Look around for it before trying
-# to start it.
-. $srcdir\find_prog.ps1 .\header_test.exe
-if (!(Test-Path $prog)) {
- "Cannot locate header_test.exe"
- exit 1
-}
-
-Invoke-Expression "$prog -p $env:QPID_PORT" | Write-Output
-$env:PYTHONPATH="$PYTHON_DIR;$env:PYTHONPATH"
-Invoke-Expression "python $srcdir/header_test.py localhost $env:QPID_PORT" | Write-Output
-exit $LASTEXITCODE
diff --git a/cpp/src/tests/run_headers_federation_tests b/cpp/src/tests/run_headers_federation_tests
deleted file mode 100644
index a4584e6884..0000000000
--- a/cpp/src/tests/run_headers_federation_tests
+++ /dev/null
@@ -1,49 +0,0 @@
-#!/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.
-#
-
-# Run the federation tests for the Headers Exchange.
-
-source ./test_env.sh
-
-trap stop_brokers INT TERM QUIT
-
-start_brokers() {
- ../qpidd --daemon --port 0 --no-data-dir --no-module-dir --auth no > qpidd.port
- LOCAL_PORT=`cat qpidd.port`
- ../qpidd --daemon --port 0 --no-data-dir --no-module-dir --auth no > qpidd.port
- REMOTE_PORT=`cat qpidd.port`
-}
-
-stop_brokers() {
- $QPIDD_EXEC --no-module-dir -q --port $LOCAL_PORT
- $QPIDD_EXEC --no-module-dir -q --port $REMOTE_PORT
-}
-
-if test -d ${PYTHON_DIR} ; then
- start_brokers
- echo "Running HeadersExchange federation tests using brokers on ports $LOCAL_PORT $REMOTE_PORT"
- $QPID_PYTHON_TEST -m headers_federation -b localhost:$LOCAL_PORT -Dremote-port=$REMOTE_PORT $@
- RETCODE=$?
- stop_brokers
- if test x$RETCODE != x0; then
- echo "FAIL federation tests"; exit 1;
- fi
-fi
diff --git a/cpp/src/tests/run_long_cluster_tests b/cpp/src/tests/run_long_cluster_tests
deleted file mode 100755
index 5dce0be585..0000000000
--- a/cpp/src/tests/run_long_cluster_tests
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/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.
-#
-
-srcdir=`dirname $0`
-$srcdir/run_cluster_tests 'cluster_tests.LongTests.*' -DDURATION=4
-
diff --git a/cpp/src/tests/run_perftest b/cpp/src/tests/run_perftest
deleted file mode 100755
index 5ad7c1ff4f..0000000000
--- a/cpp/src/tests/run_perftest
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/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.
-#
-
-# Args: count [qpid-perftest options...]
-# Run a qpid-perftest with count multiplied.
-#
-MULTIPLIER=3
-COUNT=`expr $1 \* $MULTIPLIER`
-shift
-exec `dirname $0`/run_test ./qpid-perftest --summary --count $COUNT "$@"
diff --git a/cpp/src/tests/run_queue_flow_limit_tests b/cpp/src/tests/run_queue_flow_limit_tests
deleted file mode 100755
index f921cf5e7e..0000000000
--- a/cpp/src/tests/run_queue_flow_limit_tests
+++ /dev/null
@@ -1,57 +0,0 @@
-#!/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.
-#
-
-# Run tests against Queue producer flow control.
-
-source ./test_env.sh
-test -d $PYTHON_DIR || { echo "Skipping queue flow control tests, no python dir."; exit 0; }
-
-LOG_FILE=queue_flow_limit_test.log
-PORT=""
-
-trap stop_broker INT TERM QUIT
-
-error() {
- echo $*
- exit 1;
-}
-
-start_broker() {
- # Note: if you change the DEFAULT_THRESHOLDS, you will need to update queue_flow_limit_tests.py
- DEFAULT_THRESHOLDS="--default-flow-stop-threshold=80 --default-flow-resume-threshold=70"
- rm -rf $LOG_FILE
- PORT=$($QPIDD_EXEC $DEFAULT_THRESHOLDS --auth=no --no-module-dir --daemon --port=0 -t --log-to-file $LOG_FILE) || error "Could not start broker"
-}
-
-stop_broker() {
- test -n "$PORT" && $QPIDD_EXEC --no-module-dir --quit --port $PORT
-}
-
-start_broker
-echo "Running Queue flow limit tests using broker on port $PORT"
-$QPID_PYTHON_TEST -m queue_flow_limit_tests $SKIPTESTS -b localhost:$PORT $@
-RETCODE=$?
-stop_broker
-if test x$RETCODE != x0; then
- echo "FAIL queue flow limit tests"; exit 1;
-fi
-rm -rf $LOG_FILE
-
diff --git a/cpp/src/tests/run_ring_queue_test b/cpp/src/tests/run_ring_queue_test
deleted file mode 100755
index 7ca870841e..0000000000
--- a/cpp/src/tests/run_ring_queue_test
+++ /dev/null
@@ -1,36 +0,0 @@
-#!/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.
-#
-#script to run a sequence of ring queue tests via make
-
-#setup path to find qpid-config and sender/receiver test progs
-source ./test_env.sh
-
-export PATH=$PWD:$srcdir:$PYTHON_COMMANDS:$PATH
-
-#set port to connect to via env var
-test -s qpidd.port && QPID_PORT=`cat qpidd.port`
-export QPID_PORT
-
-ring_queue_test -c -s 4 -r 4
-ring_queue_test -s 4 -r 0
-ring_queue_test -s 1 -r 1
-
-
diff --git a/cpp/src/tests/run_store_tests.ps1 b/cpp/src/tests/run_store_tests.ps1
deleted file mode 100644
index 76b46737f0..0000000000
--- a/cpp/src/tests/run_store_tests.ps1
+++ /dev/null
@@ -1,133 +0,0 @@
-#
-# 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 store tests.
-# There are two sets of tests:
-# 1. A subset of the normal broker python tests, dtx and persistence, but
-# run again with the desired store loaded.
-# 2. store.py, which tests recovering things across broker restarts.
-
-$test_store = $args[0]
-if ($test_store -ne "MSSQL" -and $test_store -ne "MSSQL-CLFS") {
- "Invalid store test type $test_store - must be MSSQL or MSSQL-CLFS"
- exit 1
-}
-
-$srcdir = Split-Path $myInvocation.InvocationName
-$PYTHON_DIR = "$srcdir\..\..\..\python"
-if (!(Test-Path $PYTHON_DIR -pathType Container)) {
- "Skipping store tests as python libs not found"
- exit 1
-}
-
-$QMF_LIB = "$srcdir\..\..\..\extras\qmf\src\py"
-
-# Test runs from the tests directory but the broker executable is one level
-# up, and most likely in a subdirectory from there based on what build type.
-# Look around for it before trying to start it.
-$subs = "Debug","Release","MinSizeRel","RelWithDebInfo"
-foreach ($sub in $subs) {
- $prog = "..\$sub\qpidd.exe"
- if (Test-Path $prog) {
- break
- }
-}
-if (!(Test-Path $prog)) {
- "Cannot locate qpidd.exe"
- exit 1
-}
-
-# The store to test is the same build type as the broker.
-$store_dir = "..\qpid\store\$sub"
-if (!([string]::Compare($sub, "Debug", $True))) {
- $suffix = "d"
-}
-
-$stamp = Get-Date -format %dMMMyyyy_HHmmss
-$env:STORE_LIB="$store_dir\store$suffix.dll"
-if ($test_store -eq "MSSQL") {
- $test_store_module="$store_dir\mssql_store$suffix.dll"
- $env:STORE_SQL_LIB=$test_store_module
- $env:STORE_CATALOG="store_recovery_sql_test_$stamp"
- $cat1="store_sql_test_$stamp"
- $out = "sql_store_test_$stamp"
-}
-else {
- $test_store_module="$store_dir\msclfs_store$suffix.dll"
- $env:STORE_SQL_CLFS_LIB=$test_store_module
- $env:STORE_CATALOG="store_recovery_clfs_test_$stamp"
- $cat1="store_clfs_test_$stamp"
- $out = "clfs_store_test_$stamp"
-}
-
-$FAILCODE = 0
-
-# Test 1... re-run some of the regular python broker tests against a broker
-# with the store module loaded.
-$cmdline = "$prog --auth=no --port=0 --log-to-file qpidd-store.log --no-module-dir --load-module $env:STORE_LIB --load-module $test_store_module --catalog $cat1 | foreach { set-content qpidd-store.port `$_ }"
-$cmdblock = $executioncontext.invokecommand.NewScriptBlock($cmdline)
-. $srcdir\background.ps1 $cmdblock
-
-$wait_time = 0
-while (!(Test-Path qpidd-store.port) -and ($wait_time -lt 90)) {
- Start-Sleep 2
- $wait_time += 2
-}
-if (!(Test-Path qpidd-store.port)) {
- "Time out waiting for broker to start"
- exit 1
-}
-set-item -path env:QPID_PORT -value (get-content -path qpidd-store.port -totalcount 1)
-Remove-Item qpidd-store.port
-
-$PYTHON_TEST_DIR = "$srcdir\..\..\..\tests\src\py\qpid_tests\broker_0_10"
-$env:PYTHONPATH="$PYTHON_DIR;$PYTHON_TEST_DIR;$env:PYTHONPATH;$QMF_LIB"
-python $PYTHON_DIR/qpid-python-test -m dtx -m persistence -b localhost:$env:QPID_PORT $fails $tests
-$RETCODE=$LASTEXITCODE
-if ($RETCODE -ne 0) {
- $FAILCODE = 1
-}
-
-# Piping the output makes the script wait for qpidd to finish.
-Invoke-Expression "$prog --quit --port $env:QPID_PORT" | Write-Output
-
-
-# Test 2... store.py starts/stops/restarts its own brokers
-
-$tests = "*"
-$env:PYTHONPATH="$PYTHON_DIR;$srcdir"
-$env:QPIDD_EXEC="$prog"
-$env:STORE_LIB="$store_dir\store$suffix.dll"
-if ($test_store -eq "MSSQL") {
- $env:STORE_SQL_LIB="$store_dir\mssql_store$suffix.dll"
- $env:STORE_CATALOG="store_recovery_sql_test_$stamp"
- $out = "sql_store_test_$stamp"
-}
-else {
- $env:STORE_SQL_CLFS_LIB="$store_dir\msclfs_store$suffix.dll"
- $env:STORE_CATALOG="store_recovery_clfs_test_$stamp"
- $out = "clfs_store_test_$stamp"
-}
-Invoke-Expression "python $PYTHON_DIR/qpid-python-test -m store -D OUTDIR=$out $tests" | Out-Default
-$RETCODE=$LASTEXITCODE
-if ($RETCODE -ne 0) {
- "FAIL $test_store store tests"
- $FAILCODE = 1
-}
-exit $FAILCODE
diff --git a/cpp/src/tests/run_test b/cpp/src/tests/run_test
deleted file mode 100755
index 6ec1fd892b..0000000000
--- a/cpp/src/tests/run_test
+++ /dev/null
@@ -1,82 +0,0 @@
-#!/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.
-#
-
-#
-# Set up environment and run a test executable or script.
-#
-# Output nothing if test passes, show the output if it fails and
-# leave output in <test>.log for examination.
-#
-# If qpidd.port exists and is not empty run test with QPID_PORT=`cat qpidd.port`
-#
-# If $VALGRIND if is set run under valgrind. If there are valgrind
-# erros show valgrind output, also leave it in <test>.valgrind for
-# examination.
-#
-
-srcdir=`dirname $0`
-source ./test_env.sh
-source $srcdir/vg_check
-
-# Export variables from makefile.
-export srcdir
-
-# Set QPID_PORT if qpidd.port exists.
-test -s qpidd.port && QPID_PORT=`cat qpidd.port`
-export QPID_PORT
-
-# Avoid silly libtool error messages if these are not defined
-test -z "$LC_ALL" && LC_ALL=
-test -z "$LC_CTYPE" && LC_CTYPE=
-test -z "$LC_COLLATE" && LC_COLLATE=
-test -z "$LC_MESSAGES" && LC_MESSAGES=
-export LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
-
-VG_LOG="`basename $1`.vglog"
-rm -f $VG_LOG*
-
-# Use VALGRIND_OPTS="--gen-suppressions=all" to generated suppressions
-VALGRIND_OPTS="$VALGRIND_OPTS
---leak-check=full
---demangle=yes
---suppressions=$srcdir/.valgrind.supp
---num-callers=25
---log-file=$VG_LOG --
-"
-ERROR=0
-if grep -l "^# Generated by .*libtool" "$1" >/dev/null 2>&1; then
- # This is a libtool "executable". Valgrind it if VALGRIND specified.
- test -n "$VALGRIND" && VALGRIND="$VALGRIND $VALGRIND_OPTS"
- # Hide output unless there's an error.
- $LIBTOOL --mode=execute $VALGRIND "$@" 2>&1 || ERROR=1
- test -n "$VALGRIND" && { vg_check $VG_LOG* || ERROR=1 ; }
-elif file $1 | grep -q text; then
- # This is a non-libtool shell script, just execute it.
- exec "$@"
-else
- # This is a real executable, valgrind it.
- test -n "$VALGRIND" && VALGRIND="$VALGRIND $VALGRIND_OPTS"
- # Hide output unless there's an error.
- $VALGRIND "$@" 2>&1 || ERROR=1
- test -n "$VALGRIND" && { vg_check $VG_LOG* || ERROR=1 ; }
-fi
-
-exit $ERROR
-
diff --git a/cpp/src/tests/run_test.ps1 b/cpp/src/tests/run_test.ps1
deleted file mode 100644
index ca990bc057..0000000000
--- a/cpp/src/tests/run_test.ps1
+++ /dev/null
@@ -1,69 +0,0 @@
-#
-# 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.
-#
-
-$srcdir = Split-Path $myInvocation.InvocationName
-
-# Set up environment and run a test executable or script.
-$env:QPID_DATA_DIR = ""
-$env:BOOST_TEST_SHOW_PROGRESS = "yes"
-
-# The test exe is probably not in the current binary dir - it's usually
-# placed in a subdirectory based on the configuration built in Visual Studio.
-# So check around to see where it is - when located, set the QPID_LIB_DIR
-# and PATH to look in the corresponding configuration off the src directory,
-# one level up.
-$prog = $args[0]
-$is_script = $prog -match ".ps1$"
-if (!$is_script) {
- . $srcdir\find_prog.ps1 $prog
- $args[0] = $prog
- $env:QPID_LIB_DIR = "..\$sub"
- $env:PATH += ";$dir\$sub;..\$sub"
-}
-
-# If qpidd.port exists and is not empty run test with QPID_PORT set.
-if (Test-Path qpidd.port) {
- set-item -path env:QPID_PORT -value (get-content -path qpidd.port -totalcount 1)
-}
-
-$si = new-object System.Diagnostics.ProcessStartInfo
-$si.WorkingDirectory = $pwd
-$si.UseShellExecute = $false
-$si.CreateNoWindow = $true
-$si.RedirectStandardOutput = $true
-if ($is_script) {
- $si.FileName = (get-command powershell.exe).Definition
- $si.Arguments = $args
-}
-else {
- $si.FileName = $args[0]
- if ($args.length -gt 1) {
- $si.Arguments = $args[1..($args.length-1)]
- }
-}
-$p = [System.Diagnostics.Process]::Start($si)
-$line = ""
-while (($line = $p.StandardOutput.ReadLine()) -ne $null) {
- $line
-}
-# ReadToEnd() works, but doesn't show any output until the program exits.
-#$p.StandardOutput.ReadToEnd()
-$p.WaitForExit()
-$status = $p.ExitCode
-exit $status
diff --git a/cpp/src/tests/sasl.mk b/cpp/src/tests/sasl.mk
deleted file mode 100644
index 20eaa7c7a5..0000000000
--- a/cpp/src/tests/sasl.mk
+++ /dev/null
@@ -1,49 +0,0 @@
-#
-# 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 that are only relevant if SASL is enabled.
-if HAVE_SASL
-
-check_PROGRAMS+=cluster_authentication_soak
-cluster_authentication_soak_INCLUDES=$(PUBLIC_INCLUDES)
-cluster_authentication_soak_SOURCES=cluster_authentication_soak.cpp ForkedBroker.h ForkedBroker.cpp
-cluster_authentication_soak_LDADD=$(lib_client) $(lib_broker)
-
-# Note: sasl_version is not a test -- it is a tool used by tests.
-check_PROGRAMS+=sasl_version
-sasl_version_SOURCES=sasl_version.cpp
-sasl_version_LDADD=$(lib_client)
-
-TESTS += run_cluster_authentication_test sasl_fed sasl_fed_ex_dynamic sasl_fed_ex_link sasl_fed_ex_queue sasl_fed_ex_route sasl_fed_ex_route_cluster sasl_fed_ex_link_cluster sasl_fed_ex_queue_cluster sasl_fed_ex_dynamic_cluster
-LONG_TESTS += run_cluster_authentication_soak
-EXTRA_DIST += run_cluster_authentication_test \
- sasl_fed \
- sasl_fed_ex \
- run_cluster_authentication_soak \
- sasl_fed_ex_dynamic \
- sasl_fed_ex_link \
- sasl_fed_ex_queue \
- sasl_fed_ex_route \
- sasl_fed_ex_dynamic_cluster \
- sasl_fed_ex_link_cluster \
- sasl_fed_ex_queue_cluster \
- sasl_fed_ex_route_cluster
-
-
-endif # HAVE_SASL
diff --git a/cpp/src/tests/sasl_fed b/cpp/src/tests/sasl_fed
deleted file mode 100755
index 884c44177c..0000000000
--- a/cpp/src/tests/sasl_fed
+++ /dev/null
@@ -1,166 +0,0 @@
-#! /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.
-#
-
-source ./test_env.sh
-
-# This minimum value corresponds to sasl version 2.1.22
-minimum_sasl_version=131350
-
-sasl_version=`$QPID_TEST_EXEC_DIR/sasl_version`
-
-# This test is necessary becasue this sasl version is the first one that permits
-# redirection of the sasl config file path.
-if [ "$sasl_version" -lt "$minimum_sasl_version" ]; then
- echo "sasl_fed: must have sasl version 2.1.22 or greater. ( Integer value: $minimum_sasl_version ) Version is: $sasl_version"
- exit 0
-fi
-
-# In a distribution, the python tools will be absent.
-if [ ! -f $QPID_CONFIG_EXEC ] || [ ! -f $QPID_ROUTE_EXEC ] ; then
- echo "python tools absent - skipping sasl_fed."
- exit 0
-fi
-
-
-sasl_config_file=$builddir/sasl_config
-
-my_random_number=$RANDOM
-tmp_root=/tmp/sasl_fed_$my_random_number
-mkdir -p $tmp_root
-
-
-#--------------------------------------------------
-#echo " Starting broker 1"
-#--------------------------------------------------
-$QPIDD_EXEC \
- -p 0 \
- --data-dir $tmp_root/data_1 \
- --auth=yes \
- --mgmt-enable=yes \
- --log-enable info+ \
- --log-source yes \
- --log-to-file $tmp_root/qpidd_1.log \
- --sasl-config=$sasl_config_file \
- -d > $tmp_root/broker_1_port
-
-broker_1_port=`cat $tmp_root/broker_1_port`
-
-
-#--------------------------------------------------
-#echo " Starting broker 2"
-#--------------------------------------------------
-$QPIDD_EXEC \
- -p 0 \
- --data-dir $tmp_root/data_2 \
- --auth=yes \
- --mgmt-enable=yes \
- --log-enable info+ \
- --log-source yes \
- --log-to-file $tmp_root/qpidd_2.log \
- --sasl-config=$sasl_config_file \
- -d > $tmp_root/broker_2_port
-
-broker_2_port=`cat $tmp_root/broker_2_port`
-
-sleep 2
-
-# I am not randomizing these names, because the test creates its own brokers.
-QUEUE_NAME=sasl_fed_queue
-ROUTING_KEY=sasl_fed_queue
-EXCHANGE_NAME=sasl_fedex
-
-#--------------------------------------------------
-#echo " add exchanges"
-#--------------------------------------------------
-$QPID_CONFIG_EXEC -a localhost:$broker_1_port add exchange direct $EXCHANGE_NAME
-$QPID_CONFIG_EXEC -a localhost:$broker_2_port add exchange direct $EXCHANGE_NAME
-
-
-#--------------------------------------------------
-#echo " add queues"
-#--------------------------------------------------
-$QPID_CONFIG_EXEC -a localhost:$broker_1_port add queue $QUEUE_NAME
-$QPID_CONFIG_EXEC -a localhost:$broker_2_port add queue $QUEUE_NAME
-
-sleep 5
-
-#--------------------------------------------------
-#echo " create bindings"
-#--------------------------------------------------
-$QPID_CONFIG_EXEC -a localhost:$broker_1_port bind $EXCHANGE_NAME $QUEUE_NAME $ROUTING_KEY
-$QPID_CONFIG_EXEC -a localhost:$broker_2_port bind $EXCHANGE_NAME $QUEUE_NAME $ROUTING_KEY
-
-sleep 5
-
-
-#--------------------------------------------------
-#echo " qpid-route route add"
-#--------------------------------------------------
-$QPID_ROUTE_EXEC route add zag/zag@localhost:$broker_2_port zag/zag@localhost:$broker_1_port $EXCHANGE_NAME $ROUTING_KEY "" "" DIGEST-MD5
-
-sleep 5
-
-
-n_messages=100
-#--------------------------------------------------
-#echo " Sending 100 messages to $broker_1_port "
-#--------------------------------------------------
-$builddir/datagen --count $n_messages | $SENDER_EXEC --mechanism DIGEST-MD5 --username zag --password zag --exchange $EXCHANGE_NAME --routing-key $ROUTING_KEY --port $broker_1_port
-
-sleep 5
-
-#--------------------------------------------------
-#echo " Examine Broker $broker_1_port"
-#--------------------------------------------------
-broker_1_message_count=`$PYTHON_COMMANDS/qpid-stat -q localhost:$broker_1_port | grep sasl_fed_queue | awk '{print $2}'`
-#echo " "
-
-#--------------------------------------------------
-#echo " Examine Broker $broker_2_port"
-#--------------------------------------------------
-broker_2_message_count=`$PYTHON_COMMANDS/qpid-stat -q localhost:$broker_2_port | grep sasl_fed_queue | awk '{print $2}'`
-#echo " "
-
-#--------------------------------------------------
-#echo " Asking brokers to quit."
-#--------------------------------------------------
-$QPIDD_EXEC --port $broker_1_port --quit
-$QPIDD_EXEC --port $broker_2_port --quit
-
-
-#--------------------------------------------------
-#echo "Removing temporary directory $tmp_root"
-#--------------------------------------------------
-rm -rf $tmp_root
-
-if [ "$broker_2_message_count" -eq "$n_messages" ]; then
- # echo "good: |$broker_2_message_count| == |$n_messages|"
- exit 0
-else
- # echo "not ideal: |$broker_1_message_count| != |$n_messages|"
- exit 1
-fi
-
-
-
-
-
-
diff --git a/cpp/src/tests/sasl_fed_ex b/cpp/src/tests/sasl_fed_ex
deleted file mode 100755
index 716a806874..0000000000
--- a/cpp/src/tests/sasl_fed_ex
+++ /dev/null
@@ -1,361 +0,0 @@
-#! /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.
-#
-
-#===============================================================================
-# These tests create federated links between two brokers using SASL security.
-# The SASL mechanism used is EXTERNAL, which is satisfied by SSL
-# transport-layer security.
-#===============================================================================
-
-source ./test_env.sh
-
-script_name=`basename $0`
-
-if [ $# -lt 1 ] || [ $# -gt 2 ]
-then
- echo
- # These are the four different ways of creating links ( or routes+links )
- # that the qpid-route command provides.
- echo "Usage: ${script_name} dynamic|link|queue|route [cluster]"
- echo
- exit 1
-fi
-
-# Has the user told us to do clustering ? -----------
-clustering_flag=
-if [ $# -eq "2" ] && [ "$2" == "cluster" ]; then
- clustering_flag=true
-fi
-
-qpid_route_method=$1
-
-# Debugging print. --------------------------
-debug=
-function print {
- if [ "$debug" ]; then
- echo "${script_name}: $1"
- fi
-}
-
-print "=========== start sasl_fed_ex $* ============"
-
-
-
-# This minimum value corresponds to sasl version 2.1.22
-minimum_sasl_version=131350
-
-sasl_version=`$QPID_TEST_EXEC_DIR/sasl_version`
-
-# This test is necessary because this sasl version is the first one that permits
-# redirection of the sasl config file path.
-if [ "$sasl_version" -lt "$minimum_sasl_version" ]; then
- echo "sasl_fed: must have sasl version 2.1.22 or greater. ( Integer value: $minimum_sasl_version ) Version is: $sasl_version"
- exit 0
-fi
-
-# In a distribution, the python tools will be absent.
-if [ ! -f $QPID_CONFIG_EXEC ] || [ ! -f $QPID_ROUTE_EXEC ] ; then
- echo "python tools absent - skipping sasl_fed_ex."
- exit 0
-fi
-
-CERT_DIR=`pwd`/test_cert_db
-CERT_PW_FILE=`pwd`/cert.password
-TEST_HOSTNAME=127.0.0.1
-
-create_certs() {
- #create certificate and key databases with single, simple, self-signed certificate in it
- mkdir ${CERT_DIR}
- certutil -N -d ${CERT_DIR} -f ${CERT_PW_FILE}
- certutil -S -d ${CERT_DIR} -n ${TEST_HOSTNAME} -s "CN=${TEST_HOSTNAME}" -t "CT,," -x -f ${CERT_PW_FILE} -z /usr/bin/certutil 2> /dev/null
-}
-
-delete_certs() {
- if [[ -e ${CERT_DIR} ]] ; then
- print "removing cert dir ${CERT_DIR}"
- rm -rf ${CERT_DIR}
- fi
-}
-
-
-CERTUTIL=$(type -p certutil)
-if [[ !(-x $CERTUTIL) ]] ; then
- echo "No certutil, skipping ssl test";
- exit 0;
-fi
-
-delete_certs
-create_certs 2> /dev/null
-if [ ! $? ]; then
- error "Could not create test certificate"
- exit 1
-fi
-
-sasl_config_dir=$builddir/sasl_config
-
-tmp_root=${builddir}/sasl_fed_ex_temp
-print "results dir is ${tmp_root}"
-rm -rf ${tmp_root}
-mkdir -p $tmp_root
-
-SRC_SSL_PORT=6667
-DST_SSL_PORT=6666
-
-SRC_SSL_PORT_2=6668
-DST_SSL_PORT_2=6669
-
-SRC_TCP_PORT=5801
-DST_TCP_PORT=5807
-
-SRC_TCP_PORT_2=5802
-DST_TCP_PORT_2=5803
-
-CLUSTER_NAME_SUFFIX=`hostname | tr '.' ' ' | awk '{print $1}'`
-CLUSTER_1_NAME=sasl_fed_ex_cluster_1_${CLUSTER_NAME_SUFFIX}
-CLUSTER_2_NAME=sasl_fed_ex_cluster_2_${CLUSTER_NAME_SUFFIX}
-
-print "CLUSTER_1_NAME == ${CLUSTER_1_NAME}"
-print "CLUSTER_2_NAME == ${CLUSTER_2_NAME}"
-
-SSL_LIB=${moduledir}/ssl.so
-CLUSTER_LIB=${moduledir}/cluster.so
-
-export QPID_SSL_CERT_NAME=${TEST_HOSTNAME}
-
-export QPID_NO_MODULE_DIR=1
-export QPID_LOAD_MODULE=$SSLCONNECTOR_LIB
-export QPID_SSL_CERT_DB=${CERT_DIR}
-export QPID_SSL_CERT_PASSWORD_FILE=${CERT_PW_FILE}
-export QPID_SSL_CERT_NAME=${TEST_HOSTNAME}
-
-
-
-#######################################
-# Understanding this Plumbing
-#######################################
-# 1. when you establish the route with qpid-route,
-# here is the best termiology to use:
-#
-# qpid-route route add DST SRC
-#
-# 2. DST will connect to SRC through the ssl port of SRC.
-#
-# 3. sender client connects to the tcp port of SRC.
-#
-# 4. sender specifies mechanism ANONYMOUS.
-#
-# 5. DST pulls messages off the temp queue on SRC to itself.
-#
-
-COMMON_BROKER_OPTIONS=" \
- --ssl-sasl-no-dict \
- --sasl-config=$sasl_config_dir \
- --ssl-require-client-authentication \
- --auth yes \
- --ssl-cert-db $CERT_DIR \
- --ssl-cert-password-file $CERT_PW_FILE \
- --ssl-cert-name $TEST_HOSTNAME \
- --no-data-dir \
- --no-module-dir \
- --load-module ${SSL_LIB} \
- --mgmt-enable=yes \
- --log-enable info+ \
- --log-source yes \
- --daemon "
-
-
-function start_brokers {
- if [ $1 ]; then
- # clustered ----------------------------------------
- print "Starting SRC cluster"
-
- print " src broker 1"
- $QPIDD_EXEC \
- --port=${SRC_TCP_PORT} \
- --ssl-port ${SRC_SSL_PORT} \
- ${COMMON_BROKER_OPTIONS} \
- --load-module ${CLUSTER_LIB} \
- --cluster-name ${CLUSTER_1_NAME} \
- --log-to-file $tmp_root/qpidd_src.log 2> /dev/null
-
- broker_ports[0]=${SRC_TCP_PORT}
-
- print " src broker 2"
- $QPIDD_EXEC \
- --port=${SRC_TCP_PORT_2} \
- --ssl-port ${SRC_SSL_PORT_2} \
- ${COMMON_BROKER_OPTIONS} \
- --load-module ${CLUSTER_LIB} \
- --cluster-name ${CLUSTER_1_NAME} \
- --log-to-file $tmp_root/qpidd_src_2.log 2> /dev/null
-
- broker_ports[1]=${SRC_TCP_PORT_2}
-
-
- print "Starting DST cluster"
-
- print " dst broker 1"
- $QPIDD_EXEC \
- --port=${DST_TCP_PORT} \
- --ssl-port ${DST_SSL_PORT} \
- ${COMMON_BROKER_OPTIONS} \
- --load-module ${CLUSTER_LIB} \
- --cluster-name ${CLUSTER_2_NAME} \
- --log-to-file $tmp_root/qpidd_dst.log 2> /dev/null
-
- broker_ports[2]=${DST_TCP_PORT}
-
- print " dst broker 2"
- $QPIDD_EXEC \
- --port=${DST_TCP_PORT_2} \
- --ssl-port ${DST_SSL_PORT_2} \
- ${COMMON_BROKER_OPTIONS} \
- --load-module ${CLUSTER_LIB} \
- --cluster-name ${CLUSTER_2_NAME} \
- --log-to-file $tmp_root/qpidd_dst_2.log 2> /dev/null
-
- broker_ports[3]=${DST_TCP_PORT_2}
-
- else
- # vanilla brokers --------------------------------
- print "Starting SRC broker"
- $QPIDD_EXEC \
- --port=${SRC_TCP_PORT} \
- --ssl-port ${SRC_SSL_PORT} \
- ${COMMON_BROKER_OPTIONS} \
- --log-to-file $tmp_root/qpidd_src.log 2> /dev/null
-
- broker_ports[0]=${SRC_TCP_PORT}
-
- print "Starting DST broker"
- $QPIDD_EXEC \
- --port=${DST_TCP_PORT} \
- --ssl-port ${DST_SSL_PORT} \
- ${COMMON_BROKER_OPTIONS} \
- --log-to-file $tmp_root/qpidd_dst.log 2> /dev/null
-
- broker_ports[1]=${DST_TCP_PORT}
- fi
-}
-
-
-function halt_brokers {
- n_brokers=${#broker_ports[@]}
- print "Halting ${n_brokers} brokers."
- for i in $(seq 0 $((${n_brokers} - 1)))
- do
- halt_port=${broker_ports[$i]}
- print "Halting broker $i on port ${halt_port}"
- $QPIDD_EXEC --port ${halt_port} --quit
- done
-
-}
-
-
-start_brokers $clustering_flag
-
-
-# I am not randomizing these names, because this test creates its own brokers.
-QUEUE_NAME=sasl_fed_queue
-ROUTING_KEY=sasl_fed_queue
-EXCHANGE_NAME=sasl_fedex
-
-
-print "add exchanges"
-$QPID_CONFIG_EXEC -a localhost:${SRC_TCP_PORT} add exchange direct $EXCHANGE_NAME
-$QPID_CONFIG_EXEC -a localhost:${DST_TCP_PORT} add exchange direct $EXCHANGE_NAME
-
-
-print "add queues"
-$QPID_CONFIG_EXEC -a localhost:${SRC_TCP_PORT} add queue $QUEUE_NAME
-$QPID_CONFIG_EXEC -a localhost:${DST_TCP_PORT} add queue $QUEUE_NAME
-
-
-print "create bindings"
-$QPID_CONFIG_EXEC -a localhost:${SRC_TCP_PORT} bind $EXCHANGE_NAME $QUEUE_NAME $ROUTING_KEY
-$QPID_CONFIG_EXEC -a localhost:${DST_TCP_PORT} bind $EXCHANGE_NAME $QUEUE_NAME $ROUTING_KEY
-
-
-#
-# NOTE: The SRC broker *must* be referred to as $TEST_HOSTNAME, and not as "localhost".
-# It must be referred to by the exact string given as the Common Name (CN) in the cert,
-# which was created in the function create_certs, above.
-
-
-
-#----------------------------------------------------------------
-# Use qpid-route to create the link, or the link+route, depending
-# on which of its several methods was requested.
-#----------------------------------------------------------------
-if [ ${qpid_route_method} == "dynamic" ]; then
- print "dynamic add"
- $QPID_ROUTE_EXEC -t ssl dynamic add localhost:${DST_TCP_PORT} $TEST_HOSTNAME:${SRC_SSL_PORT} $EXCHANGE_NAME "" "" EXTERNAL
-elif [ ${qpid_route_method} == "link" ]; then
- print "link add"
- $QPID_ROUTE_EXEC -t ssl link add localhost:${DST_TCP_PORT} $TEST_HOSTNAME:${SRC_SSL_PORT} EXTERNAL
-elif [ ${qpid_route_method} == "queue" ]; then
- print "queue add"
- $QPID_ROUTE_EXEC -t ssl queue add localhost:${DST_TCP_PORT} $TEST_HOSTNAME:${SRC_SSL_PORT} $EXCHANGE_NAME $ROUTING_KEY EXTERNAL
-elif [ ${qpid_route_method} == "route" ]; then
- print "route add"
- $QPID_ROUTE_EXEC -t ssl route add localhost:${DST_TCP_PORT} $TEST_HOSTNAME:${SRC_SSL_PORT} $EXCHANGE_NAME $ROUTING_KEY "" "" EXTERNAL
-else
- echo "unknown method: |${qpid_route_method}|"
- echo " choices are: dynamic|link|queue|route "
- halt_brokers
- exit 1
-fi
-
-
-# I don't know how to avoid this sleep yet. It has to come after route-creation
-# to avoid false negatives.
-sleep 5
-
-# This should work the same whether or not we are running a clustered test.
-# In the case of clustered tests, the status is not printed by qpid_route.
-# So in either case, I will look only at the transport field, which should be "ssl".
-print "check the link"
-link_status=$($QPID_ROUTE_EXEC link list localhost:${DST_TCP_PORT} | tail -1 | awk '{print $3}')
-
-halt_brokers
-
-sleep 1
-
-if [ ! ${link_status} ]; then
- print "link_status is empty"
- print "result: fail"
- exit 2
-fi
-
-if [ ${link_status} == "ssl" ]; then
- print "result: good"
- # Only remove the tmp_root on success, to permit debugging.
- print "Removing temporary directory $tmp_root"
- rm -rf $tmp_root
- exit 0
-fi
-
-print "link_status has a bad value: ${link_status}"
-print "result: fail"
-exit 3
-
-
-
diff --git a/cpp/src/tests/sasl_fed_ex_dynamic b/cpp/src/tests/sasl_fed_ex_dynamic
deleted file mode 100755
index c20b8d69a0..0000000000
--- a/cpp/src/tests/sasl_fed_ex_dynamic
+++ /dev/null
@@ -1,27 +0,0 @@
-#! /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.
-#
-
-
-source ./test_env.sh
-
-${srcdir}/sasl_fed_ex dynamic
-
-
diff --git a/cpp/src/tests/sasl_fed_ex_dynamic_cluster b/cpp/src/tests/sasl_fed_ex_dynamic_cluster
deleted file mode 100755
index b0cceccecb..0000000000
--- a/cpp/src/tests/sasl_fed_ex_dynamic_cluster
+++ /dev/null
@@ -1,28 +0,0 @@
-#! /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.
-#
-
-
-source ./test_env.sh
-source $srcdir/ais_check
-
-with_ais_group ${srcdir}/sasl_fed_ex dynamic cluster
-
-
diff --git a/cpp/src/tests/sasl_fed_ex_link b/cpp/src/tests/sasl_fed_ex_link
deleted file mode 100755
index 7b232d4874..0000000000
--- a/cpp/src/tests/sasl_fed_ex_link
+++ /dev/null
@@ -1,27 +0,0 @@
-#! /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.
-#
-
-
-source ./test_env.sh
-
-${srcdir}/sasl_fed_ex link
-
-
diff --git a/cpp/src/tests/sasl_fed_ex_link_cluster b/cpp/src/tests/sasl_fed_ex_link_cluster
deleted file mode 100755
index 4139300b12..0000000000
--- a/cpp/src/tests/sasl_fed_ex_link_cluster
+++ /dev/null
@@ -1,28 +0,0 @@
-#! /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.
-#
-
-
-source ./test_env.sh
-source $srcdir/ais_check
-
-with_ais_group ${srcdir}/sasl_fed_ex link cluster
-
-
diff --git a/cpp/src/tests/sasl_fed_ex_queue b/cpp/src/tests/sasl_fed_ex_queue
deleted file mode 100755
index be0c10cf63..0000000000
--- a/cpp/src/tests/sasl_fed_ex_queue
+++ /dev/null
@@ -1,27 +0,0 @@
-#! /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.
-#
-
-
-source ./test_env.sh
-
-${srcdir}/sasl_fed_ex queue
-
-
diff --git a/cpp/src/tests/sasl_fed_ex_queue_cluster b/cpp/src/tests/sasl_fed_ex_queue_cluster
deleted file mode 100755
index f251420e08..0000000000
--- a/cpp/src/tests/sasl_fed_ex_queue_cluster
+++ /dev/null
@@ -1,28 +0,0 @@
-#! /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.
-#
-
-
-source ./test_env.sh
-source ${srcdir}/ais_check
-
-with_ais_group ${srcdir}/sasl_fed_ex queue cluster
-
-
diff --git a/cpp/src/tests/sasl_fed_ex_route b/cpp/src/tests/sasl_fed_ex_route
deleted file mode 100755
index dd5c4f3cac..0000000000
--- a/cpp/src/tests/sasl_fed_ex_route
+++ /dev/null
@@ -1,27 +0,0 @@
-#! /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.
-#
-
-
-source ./test_env.sh
-
-${srcdir}/sasl_fed_ex route
-
-
diff --git a/cpp/src/tests/sasl_fed_ex_route_cluster b/cpp/src/tests/sasl_fed_ex_route_cluster
deleted file mode 100755
index a5d1542def..0000000000
--- a/cpp/src/tests/sasl_fed_ex_route_cluster
+++ /dev/null
@@ -1,28 +0,0 @@
-#! /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.
-#
-
-
-source ./test_env.sh
-source ${srcdir}/ais_check
-
-with_ais_group ${srcdir}/sasl_fed_ex route cluster
-
-
diff --git a/cpp/src/tests/sasl_test_setup.sh b/cpp/src/tests/sasl_test_setup.sh
deleted file mode 100755
index 6395ba6ec3..0000000000
--- a/cpp/src/tests/sasl_test_setup.sh
+++ /dev/null
@@ -1,41 +0,0 @@
-#! /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.
-#
-
-SASL_PW=/usr/sbin/saslpasswd2
-test -x $SASL_PW || { echo Skipping SASL test, saslpasswd2 not found; exit 0; }
-
-mkdir -p sasl_config
-
-# Create configuration file.
-cat > sasl_config/qpidd.conf <<EOF
-pwcheck_method: auxprop
-auxprop_plugin: sasldb
-sasldb_path: $PWD/sasl_config/qpidd.sasldb
-sql_select: dummy select
-EOF
-
-# Populate temporary sasl db.
-SASLTEST_DB=./sasl_config/qpidd.sasldb
-rm -f $SASLTEST_DB
-echo guest | $SASL_PW -c -p -f $SASLTEST_DB -u QPID guest
-echo zig | $SASL_PW -c -p -f $SASLTEST_DB -u QPID zig
-echo zag | $SASL_PW -c -p -f $SASLTEST_DB -u QPID zag
-
diff --git a/cpp/src/tests/sasl_version.cpp b/cpp/src/tests/sasl_version.cpp
deleted file mode 100644
index db3efe4181..0000000000
--- a/cpp/src/tests/sasl_version.cpp
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- *
- * 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.
- *
- */
-
-#include <iostream>
-
-#include "sasl/sasl.h"
-
-
-/*
- Some tests need to distinguish between different versions of
- SASL. This encodes and outputs the version number as an integer
- for easy use in testing scripts.
-*/
-
-int
-main ( )
-{
- // I assume that these are 8-bit quantities....
- int sasl_version = (SASL_VERSION_MAJOR << 16) +
- (SASL_VERSION_MINOR << 8) +
- SASL_VERSION_STEP;
-
- std::cout << sasl_version << std::endl;
-
- return 0;
-}
-
-
-
-
diff --git a/cpp/src/tests/sender.cpp b/cpp/src/tests/sender.cpp
deleted file mode 100644
index 063b5e87dc..0000000000
--- a/cpp/src/tests/sender.cpp
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- *
- * 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.
- *
- */
-
-#include <qpid/client/FailoverManager.h>
-#include <qpid/client/Session.h>
-#include <qpid/client/AsyncSession.h>
-#include <qpid/client/Message.h>
-#include <qpid/client/MessageReplayTracker.h>
-#include <qpid/client/QueueOptions.h>
-#include <qpid/Exception.h>
-#include "TestOptions.h"
-
-#include "qpid/messaging/Message.h" // Only for Statistics
-#include "Statistics.h"
-
-#include <fstream>
-#include <iostream>
-
-using namespace qpid;
-using namespace qpid::client;
-using namespace qpid::framing;
-
-using namespace std;
-
-namespace qpid {
-namespace tests {
-
-struct Args : public qpid::TestOptions
-{
- string destination;
- string key;
- uint sendEos;
- bool durable;
- uint ttl;
- string lvqMatchValue;
- string lvqMatchFile;
- bool reportTotal;
- int reportEvery;
- bool reportHeader;
-
- Args() :
- key("test-queue"), sendEos(0), durable(false), ttl(0),
- reportTotal(false),
- reportEvery(0),
- reportHeader(true)
- {
- addOptions()
- ("exchange", qpid::optValue(destination, "EXCHANGE"), "Exchange to send messages to")
- ("routing-key", qpid::optValue(key, "KEY"), "Routing key to add to messages")
- ("send-eos", qpid::optValue(sendEos, "N"), "Send N EOS messages to mark end of input")
- ("durable", qpid::optValue(durable, "true|false"), "Mark messages as durable.")
- ("ttl", qpid::optValue(ttl, "msecs"), "Time-to-live for messages, in milliseconds")
- ("lvq-match-value", qpid::optValue(lvqMatchValue, "KEY"), "The value to set for the LVQ match key property")
- ("lvq-match-file", qpid::optValue(lvqMatchFile, "FILE"), "A file containing values to set for the LVQ match key property")
- ("report-total", qpid::optValue(reportTotal), "Report total throughput statistics")
- ("report-every", qpid::optValue(reportEvery,"N"), "Report throughput statistics every N messages")
- ("report-header", qpid::optValue(reportHeader, "yes|no"), "Headers on report.")
- ;
- }
-};
-
-const string EOS("eos");
-
-class Sender : public FailoverManager::Command
-{
- public:
- Sender(Reporter<Throughput>& reporter, const std::string& destination, const std::string& key, uint sendEos, bool durable, uint ttl,
- const std::string& lvqMatchValue, const std::string& lvqMatchFile);
- void execute(AsyncSession& session, bool isRetry);
-
- private:
- Reporter<Throughput>& reporter;
- messaging::Message dummyMessage;
- const std::string destination;
- MessageReplayTracker sender;
- Message message;
- const uint sendEos;
- uint sent;
- std::ifstream lvqMatchValues;
-};
-
-Sender::Sender(Reporter<Throughput>& rep, const std::string& dest, const std::string& key, uint eos, bool durable, uint ttl, const std::string& lvqMatchValue, const std::string& lvqMatchFile) :
- reporter(rep), destination(dest), sender(10), message("", key), sendEos(eos), sent(0) , lvqMatchValues(lvqMatchFile.c_str())
-{
- if (durable){
- message.getDeliveryProperties().setDeliveryMode(framing::PERSISTENT);
- }
-
- if (ttl) {
- message.getDeliveryProperties().setTtl(ttl);
- }
-
- if (!lvqMatchValue.empty()) {
- message.getHeaders().setString(QueueOptions::strLVQMatchProperty, lvqMatchValue);
- }
-}
-
-void Sender::execute(AsyncSession& session, bool isRetry)
-{
- if (isRetry) sender.replay(session);
- else sender.init(session);
- string data;
- while (getline(std::cin, data)) {
- message.setData(data);
- //message.getHeaders().setInt("SN", ++sent);
- string matchKey;
- if (lvqMatchValues && getline(lvqMatchValues, matchKey)) {
- message.getHeaders().setString(QueueOptions::strLVQMatchProperty, matchKey);
- }
- reporter.message(dummyMessage); // For statistics
- sender.send(message, destination);
- }
- for (uint i = sendEos; i > 0; --i) {
- message.setData(EOS);
- sender.send(message, destination);
- }
-}
-
-}} // namespace qpid::tests
-
-using namespace qpid::tests;
-
-int main(int argc, char ** argv)
-{
- Args opts;
- try {
- opts.parse(argc, argv);
- Reporter<Throughput> reporter(std::cout, opts.reportEvery, opts.reportHeader);
- FailoverManager connection(opts.con);
- Sender sender(reporter, opts.destination, opts.key, opts.sendEos, opts.durable, opts.ttl, opts.lvqMatchValue, opts.lvqMatchFile);
- connection.execute(sender);
- connection.close();
- if (opts.reportTotal) reporter.report();
- return 0;
- } catch(const std::exception& error) {
- std::cout << "Failed: " << error.what() << std::endl;
- }
- return 1;
-}
diff --git a/cpp/src/tests/shared_perftest b/cpp/src/tests/shared_perftest
deleted file mode 100755
index cc192d25bd..0000000000
--- a/cpp/src/tests/shared_perftest
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/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.
-#
-
-exec `dirname $0`/run_perftest 100000 --mode shared --npubs 16 --nsubs 16
diff --git a/cpp/src/tests/shlibtest.cpp b/cpp/src/tests/shlibtest.cpp
deleted file mode 100644
index 5655eb7e64..0000000000
--- a/cpp/src/tests/shlibtest.cpp
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * 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.
- *
- */
-
-namespace qpid {
-namespace tests {
-
-int* loaderData = 0;
-extern "C"
-#ifdef WIN32
-__declspec(dllexport)
-#endif
-void callMe(int *i) { loaderData=i; }
-
-struct OnUnload { ~OnUnload() { *loaderData=42; } };
-OnUnload unloader; // For destructor.
-
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/ssl.mk b/cpp/src/tests/ssl.mk
deleted file mode 100644
index 435db0c55b..0000000000
--- a/cpp/src/tests/ssl.mk
+++ /dev/null
@@ -1,22 +0,0 @@
-#
-# 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.
-#
-
-TESTS+=ssl_test
-EXTRA_DIST+=ssl_test
-CLEAN_LOCAL += test_cert_db cert.password
diff --git a/cpp/src/tests/ssl_test b/cpp/src/tests/ssl_test
deleted file mode 100755
index cbf75eb237..0000000000
--- a/cpp/src/tests/ssl_test
+++ /dev/null
@@ -1,142 +0,0 @@
-#!/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 SSL
-source ./test_env.sh
-
-CONFIG=$(dirname $0)/config.null
-CERT_DIR=`pwd`/test_cert_db
-CERT_PW_FILE=`pwd`/cert.password
-TEST_HOSTNAME=127.0.0.1
-TEST_CLIENT_CERT=rumplestiltskin
-COUNT=10
-
-trap cleanup EXIT
-
-error() { echo $*; exit 1; }
-
-create_certs() {
- #create certificate and key databases with single, simple, self-signed certificate in it
- mkdir ${CERT_DIR}
- certutil -N -d ${CERT_DIR} -f ${CERT_PW_FILE}
- certutil -S -d ${CERT_DIR} -n ${TEST_HOSTNAME} -s "CN=${TEST_HOSTNAME}" -t "CT,," -x -f ${CERT_PW_FILE} -z /usr/bin/certutil
- certutil -S -d ${CERT_DIR} -n ${TEST_CLIENT_CERT} -s "CN=${TEST_CLIENT_CERT}" -t "CT,," -x -f ${CERT_PW_FILE} -z /usr/bin/certutil
-}
-
-delete_certs() {
- if [[ -e ${CERT_DIR} ]] ; then
- rm -rf ${CERT_DIR}
- fi
-}
-
-COMMON_OPTS="--daemon --no-data-dir --no-module-dir --auth no --config $CONFIG --load-module $SSL_LIB --ssl-cert-db $CERT_DIR --ssl-cert-password-file $CERT_PW_FILE --ssl-cert-name $TEST_HOSTNAME --require-encryption"
-start_broker() { # $1 = extra opts
- ../qpidd --transport ssl --port 0 --ssl-port 0 $COMMON_OPTS $1;
-}
-
-stop_brokers() {
- test -n "$PORT" && ../qpidd --no-module-dir -qp $PORT
- test -n "$PORT2" && ../qpidd --no-module-dir -qp $PORT2
- PORT=""
- PORT2=""
-}
-
-cleanup() {
- stop_brokers
- delete_certs
-}
-
-CERTUTIL=$(type -p certutil)
-if [[ !(-x $CERTUTIL) ]] ; then
- echo "No certutil, skipping ssl test";
- exit 0;
-fi
-
-if [[ !(-e ${CERT_PW_FILE}) ]] ; then
- echo password > ${CERT_PW_FILE}
-fi
-delete_certs
-create_certs || error "Could not create test certificate"
-PORT=`start_broker` || error "Could not start broker"
-echo "Running SSL test on port $PORT"
-export QPID_NO_MODULE_DIR=1
-export QPID_LOAD_MODULE=$SSLCONNECTOR_LIB
-export QPID_SSL_CERT_DB=${CERT_DIR}
-export QPID_SSL_CERT_PASSWORD_FILE=${CERT_PW_FILE}
-
-## Test connection via connection settings
-./qpid-perftest --count ${COUNT} --port ${PORT} -P ssl -b $TEST_HOSTNAME --summary
-
-## Test connection with a URL
-URL=amqp:ssl:$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; }
-
-#### Client Authentication tests
-
-PORT2=`start_broker --ssl-require-client-authentication` || error "Could not start broker"
-echo "Running SSL client authentication test on port $PORT2"
-URL=amqp:ssl:$TEST_HOSTNAME:$PORT2
-
-## See if you can set the SSL cert-name for the connection
-./qpid-send -b $URL --connection-options "{ssl-cert-name: $TEST_CLIENT_CERT }" --content-string=hello -a "bar;{create:always}"
-MSG2=`./qpid-receive -b $URL --connection-options "{ssl-cert-name: $TEST_CLIENT_CERT }" -a "bar;{create:always}" --messages 1`
-test "$MSG2" = "hello" || { echo "receive failed '$MSG2' != 'hello'"; exit 1; }
-
-## Make sure that connect fails with an invalid SSL cert-name
-./qpid-send -b $URL --connection-options "{ssl-cert-name: pignose }" --content-string=hello -a "baz;{create:always}" 2>/dev/null 1>/dev/null
-MSG3=`./qpid-receive -b $URL --connection-options "{ssl-cert-name: pignose }" -a "baz;{create:always}" --messages 1 2>/dev/null`
-test "$MSG3" = "" || { echo "receive succeeded without valid ssl cert '$MSG3' != ''"; exit 1; }
-
-stop_brokers
-
-test -z $CLUSTER_LIB && exit 0 # Exit if cluster not supported.
-
-## Test failover in a cluster using SSL 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.
- PICK=`../qpidd --no-module-dir -dp0`
- ../qpidd --no-module-dir -qp $PICK
- echo $PICK
-}
-ssl_cluster_broker() { # $1 = port
- ../qpidd $COMMON_OPTS --load-module $CLUSTER_LIB --cluster-name ssl_test.$HOSTNAME.$$ --cluster-url amqp:ssl:$TEST_HOSTNAME:$1 --port 0 --ssl-port $1 --transport ssl > /dev/null
- # Wait for broker to be ready
- qpid-ping -Pssl -b $TEST_HOSTNAME -qp $1 || { echo "Cannot connect to broker on $1"; exit 1; }
- echo "Running SSL 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:ssl:$TEST_HOSTNAME:$PORT1 -a "foo;{create:always}" -f | uniq > ssl_test_receive.tmp &
-./qpid-send -b amqp:ssl:$TEST_HOSTNAME:$PORT2 --content-string=one -a "foo;{create:always}"
-../qpidd --no-module-dir -qp $PORT1 # Kill broker 1 receiver should fail-over.
-./qpid-send -b amqp:ssl:$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; }
-rm -f ssl_test_receive.*
-
diff --git a/cpp/src/tests/start_broker b/cpp/src/tests/start_broker
deleted file mode 100755
index 093c44051a..0000000000
--- a/cpp/src/tests/start_broker
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/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.
-#
-
-# Start a test broker.
-srcdir=`dirname $0`
-exec $srcdir/run_test ../qpidd --auth=no --no-module-dir --daemon --port=0 --log-to-file qpidd.log "$@" > qpidd.port
diff --git a/cpp/src/tests/start_broker.ps1 b/cpp/src/tests/start_broker.ps1
deleted file mode 100644
index 9263262b9f..0000000000
--- a/cpp/src/tests/start_broker.ps1
+++ /dev/null
@@ -1,60 +0,0 @@
-#
-# 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.
-#
-
-# Get the directory where this script resides.
-function Get-ScriptPath
- { Split-Path $myInvocation.ScriptName }
-
-# Start a test broker and capture it's port (from stdout) to qpidd.port
-# This script will exit immediately after spawning the broker process. To avoid
-# running more tests before the broker is initialized, wait for the qpidd.port
-# file to appear before exiting.
-if (Test-Path qpidd.port) {
- Remove-Item qpidd.port
-}
-
-# Test runs from the tests directory but the broker executable is one level
-# up, and most likely in a subdirectory from there based on what build type.
-# Look around for it before trying to start it.
-$subs = "Debug","Release","MinSizeRel","RelWithDebInfo"
-foreach ($sub in $subs) {
- $prog = "..\$sub\qpidd.exe"
- if (Test-Path $prog) {
- break
- }
-}
-if (!(Test-Path $prog)) {
- "Cannot locate qpidd.exe"
- exit 1
-}
-$cmdline = "$prog --auth=no --no-module-dir --port=0 --log-to-file qpidd.log $args | foreach { set-content qpidd.port `$_ }"
-$cmdblock = $executioncontext.invokecommand.NewScriptBlock($cmdline)
-$srcdir = Get-ScriptPath
-. $srcdir\background.ps1 $cmdblock
-
-$wait_time = 0
-while (!(Test-Path qpidd.port) -and ($wait_time -lt 10)) {
- Start-Sleep 2
- $wait_time += 2
-}
-if (Test-Path qpidd.port) {
- exit 0
-}
-"Time out waiting for broker to start"
-exit 1
diff --git a/cpp/src/tests/start_cluster b/cpp/src/tests/start_cluster
deleted file mode 100755
index bc35a2eddc..0000000000
--- a/cpp/src/tests/start_cluster
+++ /dev/null
@@ -1,42 +0,0 @@
-#!/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.
-#
-
-# Start a cluster of brokers on local host, put the list of ports for cluster members in cluster.ports
-#
-
-# Execute command with the ais group set.
-source ./test_env.sh
-. `dirname $0`/ais_check
-
-rm -f cluster*.log cluster.ports qpidd.port
-
-SIZE=${1:-3}; shift
-CLUSTER=$HOSTNAME.$$
-OPTS="-d --no-module-dir --load-module $CLUSTER_LIB --cluster-name=$CLUSTER --auth=no --log-enable notice+ --log-enable debug+:cluster $@"
-
-for (( i=0; i<SIZE; ++i )); do
- DDIR=`mktemp -d /tmp/start_cluster.XXXXXXXXXX`
- PORT=`with_ais_group ../qpidd -p0 --log-to-file=cluster$i.log $OPTS --data-dir=$DDIR` || exit 1
- echo $PORT >> cluster.ports
-done
-
-head -n 1 cluster.ports > qpidd.port # First member's port for tests.
-
diff --git a/cpp/src/tests/start_cluster_hosts b/cpp/src/tests/start_cluster_hosts
deleted file mode 100755
index 778b4248da..0000000000
--- a/cpp/src/tests/start_cluster_hosts
+++ /dev/null
@@ -1,70 +0,0 @@
-#!/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.
-#
-
-#
-# Start a cluster of brokers on local host, put the list of host port addresses
-# in cluster.ports
-#
-# Arguments: [-k] [-p port] HOST [HOST...]
-# -p port to start broker on, can be 0. Actual ports recorded in cluster.addr.
-# -k kill any qpidd processes owned by this user before starting.
-#
-# Start a broker on each named host. Name a host twice to start multiple brokers.
-#
-# You must be able to ssh to each host and be in group ais.
-# $QPIDD must be executable on each host.
-# Logs go to syslog on each host, with a unique prefix per broker.
-#
-
-QPIDD=${QPIDD:-$PWD/../qpidd}
-LIBQPIDCLUSTER=${LIBQPIDCLUSTER:-$PWD/../.libs/cluster.so}
-NAME=$USER # User name is default cluster name.
-RESTART=NO
-
-while getopts "kp:n:q:r" ARG ; do
- case $ARG in
- k) KILL=yes ;;
- p) PORT="$OPTARG" ;;
- n) NAME=$OPTARG ;;
- q) QPIDD=$OPTARG ;;
- l) LIBQPIDCLUSTER=$OPTARG ;;
- r) RESTART=yes ;;
- *) echo "Error parsing options: $ARG"; exit 1 ;;
- esac
-done
-shift `expr $OPTIND - 1`
-test -n "$PORT" && PORTOPT="-p $PORT"
-test "$KILL" = yes && KILL="$QPIDD --no-module-dir -q $PORTOPT ;"
-CLUSTER=${*:-$CLUSTER} # Use args or env
-test -z "$CLUSTER" && { echo Must specify at least one host; exit 1; }
-
-
-OPTS="-d $PORTOPT --load-module $LIBQPIDCLUSTER --cluster-name=$NAME --no-data-dir --auth=no --log-to-syslog --log-enable=info+"
-
-num=0
-for h in $CLUSTER; do
- num=`expr $num + 1` # Give a unique log prefix to each node.
- cmd="$KILL $QPIDD $OPTS --log-prefix $num.$h"
- out=`echo "$cmd" | ssh $h newgrp ais` || { echo == $h error: $out ; exit 1; }
- if [ "$PORT" = 0 ] ; then p=$out; else p=$PORT; fi
- echo "$h $p"
-done
-
diff --git a/cpp/src/tests/stop_broker b/cpp/src/tests/stop_broker
deleted file mode 100755
index 248fd1fc5c..0000000000
--- a/cpp/src/tests/stop_broker
+++ /dev/null
@@ -1,41 +0,0 @@
-#!/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.
-#
-
-# Stop the broker, check for errors.
-#
-QPID_PORT=`cat qpidd.port`
-export QPID_PORT
-rm -f qpidd.port
-
-../qpidd --no-module-dir --quit || ERROR=1
-
-# Check qpidd.log.
-egrep 'warning\|error\|critical' qpidd.log && {
- echo "WARNING: Suspicious broker log entries in qpidd.log, above."
-}
-
-# Check valgrind log.
-if test -n "$VALGRIND"; then
- . `dirname $0`/vg_check $VG_LOG*
- vg_check qpidd.vglog* || ERROR=1
-fi
-
-exit $ERROR
diff --git a/cpp/src/tests/stop_broker.ps1 b/cpp/src/tests/stop_broker.ps1
deleted file mode 100644
index 4fdeb26e2b..0000000000
--- a/cpp/src/tests/stop_broker.ps1
+++ /dev/null
@@ -1,56 +0,0 @@
-#
-# 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.
-#
-
-# Stop the broker, check for errors.
-Get-Content -path qpidd.port -totalCount 1 | Set-Variable -name qpid_port
-Remove-Item qpidd.port
-
-# Test runs from the tests directory but the broker executable is one level
-# up, and most likely in a subdirectory from there based on what build type.
-# Look around for it before trying to start it.
-$subs = "Debug","Release","MinSizeRel","RelWithDebInfo"
-foreach ($sub in $subs) {
- $prog = "..\$sub\qpidd.exe"
- if (Test-Path $prog) {
- break
- }
-}
-if (!(Test-Path $prog)) {
- "Cannot locate qpidd.exe"
- exit 1
-}
-
-# Piping the output makes the script wait for qpidd to finish.
-Invoke-Expression "$prog --quit --port $qpid_port" | Write-Output
-$stopped = $?
-
-# Check qpidd.log.
-filter bad_stuff {
- $_ -match "( warning | error | critical )"
-}
-
-$qpidd_errors = $false
-Get-Content -path qpidd.log | where { bad_stuff } | Out-Default | Set-Variable -name qpidd_errors -value $true
-if ($qpidd_errors -eq $true) {
- "WARNING: Suspicious broker log entries in qpidd.log, above."
-}
-if ($stopped -eq $true) {
- exit 0
-}
-exit 1
diff --git a/cpp/src/tests/stop_cluster b/cpp/src/tests/stop_cluster
deleted file mode 100755
index d598a2255a..0000000000
--- a/cpp/src/tests/stop_cluster
+++ /dev/null
@@ -1,33 +0,0 @@
-#!/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.
-#
-
-# Stop brokers on ports listed in cluster.ports
-
-PORTS=`cat cluster.ports`
-for PORT in $PORTS ; do
- $QPIDD_EXEC --no-module-dir -qp $PORT || ERROR="$ERROR $PORT"
-done
-rm -f cluster.ports qpidd.port
-
-if [ -n "$ERROR" ]; then
- echo "Errors stopping brokers on ports: $ERROR"
- exit 1
-fi
diff --git a/cpp/src/tests/store.py b/cpp/src/tests/store.py
deleted file mode 100755
index 77e8a78e5d..0000000000
--- a/cpp/src/tests/store.py
+++ /dev/null
@@ -1,197 +0,0 @@
-#!/usr/bin/env python
-#
-# 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.
-#
-
-import errno, os, time
-from brokertest import *
-from qpid import compat, session
-from qpid.util import connect
-from qpid.connection import Connection
-from qpid.datatypes import Message, uuid4
-from qpid.queue import Empty
-
-class StoreTests(BrokerTest):
-
- XA_RBROLLBACK = 1
- XA_RBTIMEOUT = 2
- XA_OK = 0
- tx_counter = 0
-
- def configure(self, config):
- self.config = config
- self.defines = self.config.defines
- BrokerTest.configure(self, config)
-
- def setup_connection(self):
- socket = connect(self._broker.host(), self._broker.port())
- return Connection(sock=socket)
-
- def setup_session(self):
- self.conn.start()
- return self.conn.session(str(uuid4()))
-
- def start_session(self):
- self.conn = self.setup_connection()
- self.ssn = self.setup_session()
-
- def setUp(self):
- BrokerTest.setUp(self)
- self._broker = self.broker()
- self.start_session()
-
- def cycle_broker(self):
- # tearDown resets working dir; change it back after.
- d = os.getcwd()
- BrokerTest.tearDown(self)
- os.chdir(d)
- self._broker = None
- self._broker = self.broker()
- self.conn = self.setup_connection()
- self.ssn = self.setup_session()
-
- def xid(self, txid):
- StoreTests.tx_counter += 1
- branchqual = "v%s" % StoreTests.tx_counter
- return self.ssn.xid(format=0, global_id=txid, branch_id=branchqual)
-
- def testDurableExchange(self):
- try:
- self.ssn.exchange_delete(exchange="DE1")
- except:
- # restart the session busted from the exception
- self.start_session()
-
- self.ssn.exchange_declare(exchange="DE1", type="direct", durable=True)
- response = self.ssn.exchange_query(name="DE1")
- self.assert_(response.durable)
- self.assert_(not response.not_found)
-
- # Cycle the broker and make sure the exchange recovers
- self.cycle_broker()
- response = self.ssn.exchange_query(name="DE1")
- self.assert_(response.durable)
- self.assert_(not response.not_found)
-
- self.ssn.exchange_delete(exchange="DE1")
-
- def testDurableQueues(self):
- try:
- self.ssn.queue_delete(queue="DQ1")
- except:
- self.start_session()
-
- self.ssn.queue_declare(queue="DQ1", durable=True)
- response = self.ssn.queue_query(queue="DQ1")
- self.assertEqual("DQ1", response.queue)
- self.assert_(response.durable)
-
- # Cycle the broker and make sure the queue recovers
- self.cycle_broker()
- response = self.ssn.queue_query(queue="DQ1")
- self.assertEqual("DQ1", response.queue)
- self.assert_(response.durable)
-
- self.ssn.queue_delete(queue="DQ1")
-
- def testDurableBindings(self):
- try:
- self.ssn.exchange_unbind(queue="DB_Q1", exchange="DB_E1", binding_key="K1")
- except:
- self.start_session()
- try:
- self.ssn.exchange_delete(exchange="DB_E1")
- except:
- self.start_session()
- try:
- self.ssn.queue_delete(queue="DB_Q1")
- except:
- self.start_session()
-
- self.ssn.queue_declare(queue="DB_Q1", durable=True)
- self.ssn.exchange_declare(exchange="DB_E1", type="direct", durable=True)
- self.ssn.exchange_bind(exchange="DB_E1", queue="DB_Q1", binding_key="K1")
-
- # Cycle the broker and make sure the binding recovers
- self.cycle_broker()
- response = self.ssn.exchange_bound(exchange="DB_E1", queue="DB_Q1", binding_key="K1")
- self.assert_(not response.exchange_not_found)
- self.assert_(not response.queue_not_found)
- self.assert_(not response.queue_not_matched)
- self.assert_(not response.key_not_matched)
-
- self.ssn.exchange_unbind(queue="DB_Q1", exchange="DB_E1", binding_key="K1")
- self.ssn.exchange_delete(exchange="DB_E1")
- self.ssn.queue_delete(queue="DB_Q1")
-
- def testDtxRecoverPrepared(self):
- try:
- self.ssn.exchange_unbind(queue="Dtx_Q", exchange="Dtx_E", binding_key="Dtx")
- except:
- self.start_session()
- try:
- self.ssn.exchange_delete(exchange="Dtx_E")
- except:
- self.start_session()
- try:
- self.ssn.queue_delete(queue="Dtx_Q")
- except:
- self.start_session()
-
- self.ssn.queue_declare(queue="Dtx_Q", auto_delete=False, durable=True)
- self.ssn.exchange_declare(exchange="Dtx_E", type="direct", durable=True)
- self.ssn.exchange_bind(exchange="Dtx_E", queue="Dtx_Q", binding_key="Dtx")
- txid = self.xid("DtxRecoverPrepared")
- self.ssn.dtx_select()
- self.ssn.dtx_start(xid=txid)
- # 2 = delivery_mode.persistent
- dp = self.ssn.delivery_properties(routing_key="Dtx_Q", delivery_mode=2)
- self.ssn.message_transfer(message=Message(dp, "transactional message"))
- self.ssn.dtx_end(xid=txid)
- self.assertEqual(self.XA_OK, self.ssn.dtx_prepare(xid=txid).status)
- # Cycle the broker and make sure the xid is there, the message is not
- # queued.
- self.cycle_broker()
- # The txid should be recovered and in doubt
- xids = self.ssn.dtx_recover().in_doubt
- xid_matched = False
- for x in xids:
- self.assertEqual(txid.format, x.format)
- self.assertEqual(txid.global_id, x.global_id)
- self.assertEqual(txid.branch_id, x.branch_id)
- xid_matched = True
- self.assert_(xid_matched)
- self.ssn.message_subscribe(destination="dtx_msgs", queue="Dtx_Q", accept_mode=1, acquire_mode=0)
- self.ssn.message_flow(unit = 1, value = 0xFFFFFFFFL, destination = "dtx_msgs")
- self.ssn.message_flow(unit = 0, value = 10, destination = "dtx_msgs")
- message_arrivals = self.ssn.incoming("dtx_msgs")
- try:
- message_arrivals.get(timeout=1)
- assert False, 'Message present in queue before commit'
- except Empty: pass
- self.ssn.dtx_select()
- self.assertEqual(self.XA_OK, self.ssn.dtx_commit(xid=txid, one_phase=False).status)
- try:
- msg = message_arrivals.get(timeout=1)
- self.assertEqual("transactional message", msg.body)
- except Empty:
- assert False, 'Message should be present after dtx commit but is not'
-
- self.ssn.exchange_unbind(queue="Dtx_Q", exchange="Dtx_E", binding_key="Dtx")
- self.ssn.exchange_delete(exchange="Dtx_E")
- self.ssn.queue_delete(queue="Dtx_Q")
diff --git a/cpp/src/tests/test.xquery b/cpp/src/tests/test.xquery
deleted file mode 100644
index 4cfe3af02d..0000000000
--- a/cpp/src/tests/test.xquery
+++ /dev/null
@@ -1,6 +0,0 @@
- let $w := ./weather
- return $w/station = 'Raleigh-Durham International Airport (KRDU)'
- and $w/temperature_f > 50
- and $w/temperature_f - $w/dewpoint > 5
- and $w/wind_speed_mph > 7
- and $w/wind_speed_mph < 20
diff --git a/cpp/src/tests/test_env.sh.in b/cpp/src/tests/test_env.sh.in
deleted file mode 100644
index 842d7729cb..0000000000
--- a/cpp/src/tests/test_env.sh.in
+++ /dev/null
@@ -1,79 +0,0 @@
-#
-# 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.
-#
-
-absdir() { echo `cd $1 && pwd`; }
-
-# Environment variables substituted by configure/cmake.
-srcdir=`absdir @abs_srcdir@`
-builddir=`absdir @abs_builddir@`
-top_srcdir=`absdir @abs_top_srcdir@`
-top_builddir=`absdir @abs_top_builddir@`
-moduledir=$top_builddir/src@builddir_lib_suffix@
-testmoduledir=$builddir@builddir_lib_suffix@
-export QPID_INSTALL_PREFIX=@prefix@
-
-# Python paths and directories
-export PYTHON_DIR=$builddir/python
-export QPID_PYTHON_TEST=$PYTHON_DIR/commands/qpid-python-test
-if [ ! -d $PYTHON_DIR -a -d $top_srcdir/../python ]; then
- export PYTHON_DIR=$top_srcdir/../python
- export QPID_PYTHON_TEST=$PYTHON_DIR/qpid-python-test
-fi
-export QPID_TESTS=$top_srcdir/../tests
-export QPID_TESTS_PY=$QPID_TESTS/src/py
-export QPID_TOOLS=$top_srcdir/../tools
-export QMF_LIB=$top_srcdir/../extras/qmf/src/py
-export PYTHON_COMMANDS=$QPID_TOOLS/src/py
-export PYTHONPATH=$srcdir:$PYTHON_DIR:$PYTHON_COMMANDS:$QPID_TESTS_PY:$QMF_LIB:$PYTHONPATH
-export QPID_CONFIG_EXEC=$PYTHON_COMMANDS/qpid-config
-export QPID_ROUTE_EXEC=$PYTHON_COMMANDS/qpid-route
-export QPID_CLUSTER_EXEC=$PYTHON_COMMANDS/qpid-cluster
-
-# Executables
-export QPIDD_EXEC=$top_builddir/src/qpidd
-export QPID_WATCHDOG_EXEC=$top_builddir/src/qpidd_watchdog
-
-# Test executables
-export QPID_TEST_EXEC_DIR=$builddir
-export RECEIVER_EXEC=$QPID_TEST_EXEC_DIR/receiver
-export SENDER_EXEC=$QPID_TEST_EXEC_DIR/sender
-
-# Path
-export PATH=$top_builddir/src:$builddir:$srcdir:$PYTHON_COMMANDS:$QPID_TEST_EXEC_DIR:$PATH
-
-# Modules
-export TEST_STORE_LIB=$testmoduledir/test_store.so
-
-exportmodule() { test -f $moduledir/$2 && eval "export $1=$moduledir/$2"; }
-exportmodule ACL_LIB acl.so
-exportmodule CLUSTER_LIB cluster.so
-exportmodule REPLICATING_LISTENER_LIB replicating_listener.so
-exportmodule REPLICATION_EXCHANGE_LIB replication_exchange.so
-exportmodule SSLCONNECTOR_LIB sslconnector.so
-exportmodule SSL_LIB ssl.so
-exportmodule WATCHDOG_LIB watchdog.so
-exportmodule XML_LIB xml.so
-
-# Qpid options
-export QPID_NO_MODULE_DIR=1 # Don't accidentally load installed modules
-export QPID_DATA_DIR= # Default to no data dir, not ~/.qpidd
-
-# Options for boost test framework
-export BOOST_TEST_SHOW_PROGRESS=yes
-export BOOST_TEST_CATCH_SYSTEM_ERRORS=no
diff --git a/cpp/src/tests/test_store.cpp b/cpp/src/tests/test_store.cpp
deleted file mode 100644
index 257e77b6b4..0000000000
--- a/cpp/src/tests/test_store.cpp
+++ /dev/null
@@ -1,178 +0,0 @@
-/*
- *
- * 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.
- *
- */
-
-
-/**@file
- * Plug-in message store for tests.
- *
- * Add functionality as required, build up a comprehensive set of
- * features to support persistent behavior tests.
- *
- * Current features special "action" messages can:
- * - raise exception from enqueue.
- * - force host process to exit.
- * - do async completion after a delay.
- */
-
-#include "qpid/broker/NullMessageStore.h"
-#include "qpid/broker/Broker.h"
-#include "qpid/framing/AMQFrame.h"
-#include "qpid/log/Statement.h"
-#include "qpid/Plugin.h"
-#include "qpid/Options.h"
-#include <boost/cast.hpp>
-#include <boost/lexical_cast.hpp>
-#include <memory>
-#include <fstream>
-
-using namespace qpid;
-using namespace broker;
-using namespace std;
-using namespace qpid::sys;
-
-namespace qpid {
-namespace tests {
-
-struct TestStoreOptions : public Options {
-
- string name;
- string dump;
-
- TestStoreOptions() : Options("Test Store Options") {
- addOptions()
- ("test-store-name", optValue(name, "NAME"), "Name of test store instance.")
- ("test-store-dump", optValue(dump, "FILE"), "File to dump enqueued messages.")
- ;
- }
-};
-
-struct Completer : public Runnable {
- boost::intrusive_ptr<PersistableMessage> message;
- int usecs;
- Completer(boost::intrusive_ptr<PersistableMessage> m, int u) : message(m), usecs(u) {}
- void run() {
- qpid::sys::usleep(usecs);
- message->enqueueComplete();
- delete this;
- }
-};
-
-class TestStore : public NullMessageStore {
- public:
- TestStore(const TestStoreOptions& opts, Broker& broker_)
- : options(opts), name(opts.name), broker(broker_)
- {
- QPID_LOG(info, "TestStore name=" << name << " dump=" << options.dump);
- if (!options.dump.empty())
- dump.reset(new ofstream(options.dump.c_str()));
- }
-
- ~TestStore() {
- for_each(threads.begin(), threads.end(), boost::bind(&Thread::join, _1));
- }
-
- virtual bool isNull() const { return false; }
-
- void enqueue(TransactionContext* ,
- const boost::intrusive_ptr<PersistableMessage>& pmsg,
- const PersistableQueue& )
- {
- Message* msg = dynamic_cast<Message*>(pmsg.get());
- assert(msg);
-
- // Dump the message if there is a dump file.
- if (dump.get()) {
- msg->getFrames().getMethod()->print(*dump);
- *dump << endl << " ";
- msg->getFrames().getHeaders()->print(*dump);
- *dump << endl << " ";
- *dump << msg->getFrames().getContentSize() << endl;
- }
-
- // Check the message for special instructions.
- string data = msg->getFrames().getContent();
- size_t i = string::npos;
- size_t j = string::npos;
- if (strncmp(data.c_str(), TEST_STORE_DO.c_str(), strlen(TEST_STORE_DO.c_str())) == 0
- && (i = data.find(name+"[")) != string::npos
- && (j = data.find("]", i)) != string::npos)
- {
- size_t start = i+name.size()+1;
- string action = data.substr(start, j-start);
-
- if (action == EXCEPTION) {
- throw Exception(QPID_MSG("TestStore " << name << " throwing exception for: " << data));
- }
- else if (action == EXIT_PROCESS) {
- // FIXME aconway 2009-04-10: this is a dubious way to
- // close the process at best, it can cause assertions or seg faults
- // rather than clean exit.
- QPID_LOG(critical, "TestStore " << name << " forcing process exit for: " << data);
- exit(0);
- }
- else if (strncmp(action.c_str(), ASYNC.c_str(), strlen(ASYNC.c_str())) == 0) {
- std::string delayStr(action.substr(ASYNC.size()));
- int delay = boost::lexical_cast<int>(delayStr);
- threads.push_back(Thread(*new Completer(msg, delay)));
- }
- else {
- QPID_LOG(error, "TestStore " << name << " unknown action " << action);
- msg->enqueueComplete();
- }
- }
- else
- msg->enqueueComplete();
- }
-
- private:
- static const string TEST_STORE_DO, EXCEPTION, EXIT_PROCESS, ASYNC;
- TestStoreOptions options;
- string name;
- Broker& broker;
- vector<Thread> threads;
- std::auto_ptr<ofstream> dump;
-};
-
-const string TestStore::TEST_STORE_DO = "TEST_STORE_DO: ";
-const string TestStore::EXCEPTION = "exception";
-const string TestStore::EXIT_PROCESS = "exit_process";
-const string TestStore::ASYNC="async ";
-
-struct TestStorePlugin : public Plugin {
-
- TestStoreOptions options;
-
- Options* getOptions() { return &options; }
-
- void earlyInitialize (Plugin::Target& target)
- {
- Broker* broker = dynamic_cast<Broker*>(&target);
- if (!broker) return;
- boost::shared_ptr<MessageStore> p(new TestStore(options, *broker));
- broker->setStore (p);
- }
-
- void initialize(qpid::Plugin::Target&) {}
-};
-
-static TestStorePlugin pluginInstance;
-
-}} // namespace qpid::tests
diff --git a/cpp/src/tests/test_tools.h b/cpp/src/tests/test_tools.h
deleted file mode 100644
index de672f938a..0000000000
--- a/cpp/src/tests/test_tools.h
+++ /dev/null
@@ -1,106 +0,0 @@
-#ifndef TEST_TOOLS_H
-#define TEST_TOOLS_H
-
-/*
- *
- * 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 "qpid/log/Logger.h"
-
-#include <limits.h> // Include before boost/test headers.
-#include <boost/test/test_tools.hpp>
-#include <boost/assign/list_of.hpp>
-#include <boost/assign/list_of.hpp>
-#include <vector>
-#include <set>
-#include <ostream>
-#include <sstream>
-#include <exception>
-
-// Print a sequence
-template <class T> std::ostream& seqPrint(std::ostream& o, const T& seq) {
- std::copy(seq.begin(), seq.end(), std::ostream_iterator<typename T::value_type>(o, " "));
- return o;
-}
-
-// Compare sequences
-template <class T, class U>
-bool seqEqual(const T& a, const U& b) {
- typename T::const_iterator i = a.begin();
- typename U::const_iterator j = b.begin();
- while (i != a.end() && j != b.end() && *i == *j) { ++i; ++j; }
- return (i == a.end()) && (j == b.end());
-}
-
-// ostream and == operators so we can compare vectors and sets with
-// boost::assign::list_of with BOOST_CHECK_EQUALS
-namespace std { // In namespace std so boost can find them.
-
-template <class T>
-ostream& operator<<(ostream& o, const vector<T>& v) { return seqPrint(o, v); }
-
-template <class T>
-ostream& operator<<(ostream& o, const set<T>& v) { return seqPrint(o, v); }
-
-template <class T>
-ostream& operator<<(ostream& o, const boost::assign_detail::generic_list<T>& l) { return seqPrint(o, l); }
-
-template <class T>
-bool operator == (const vector<T>& a, const boost::assign_detail::generic_list<T>& b) { return seqEqual(a, b); }
-
-template <class T>
-bool operator == (const boost::assign_detail::generic_list<T>& b, const vector<T>& a) { return seqEqual(a, b); }
-
-template <class T>
-bool operator == (const set<T>& a, const boost::assign_detail::generic_list<T>& b) { return seqEqual(a, b); }
-
-template <class T>
-bool operator == (const boost::assign_detail::generic_list<T>& b, const set<T>& a) { return seqEqual(a, b); }
-}
-
-namespace qpid {
-namespace tests {
-
-/** Check if types of two objects (as given by typeinfo::name()) match. */
-#define BOOST_CHECK_TYPEID_EQUAL(a,b) BOOST_CHECK_EQUAL(typeid(a).name(),typeid(b).name())
-
-/**
- * Supress all logging in a scope, restore to previous configuration in destructor.
- */
-struct ScopedSuppressLogging {
- typedef qpid::log::Logger Logger;
- ScopedSuppressLogging(Logger& l=Logger::instance()) : logger(l), opts(l.getOptions()) { l.clear(); }
- ~ScopedSuppressLogging() { logger.configure(opts); }
- Logger& logger;
- qpid::log::Options opts;
-};
-
-inline std::string getLibPath(const char* envName, const char* defaultPath = 0) {
- const char* p = std::getenv(envName);
- if (p != 0)
- return p;
- if (defaultPath == 0) {
- std::ostringstream msg;
- msg << "Environment variable " << envName << " not set.";
- throw std::runtime_error(msg.str());
- }
- return defaultPath;
-}
-
-}} // namespace qpid::tests
-
-#endif /*!TEST_TOOLS_H*/
-
diff --git a/cpp/src/tests/test_watchdog b/cpp/src/tests/test_watchdog
deleted file mode 100755
index 2b4ae9246e..0000000000
--- a/cpp/src/tests/test_watchdog
+++ /dev/null
@@ -1,36 +0,0 @@
-#!/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.
-#
-
-# Tests for the watchdog plug-in
-
-source ./test_env.sh
-# Start a broker with watchdog, freeze it with kill -STOP, verify that it is killed.
-PORT=`$QPIDD_EXEC -dp0 --no-data-dir --auth=no --no-module-dir --load-module $WATCHDOG_LIB --log-to-file=qpidd_watchdog.log --watchdog-interval 2` || exit 1
-PID=`$QPIDD_EXEC --no-module-dir -cp $PORT` || exit 1
-kill -STOP $PID
-sleep 3
-
-if kill -0 $PID 2>/dev/null; then
- echo "Hung process did not die."
- kill $PID
-else
- true
-fi
diff --git a/cpp/src/tests/test_wrap b/cpp/src/tests/test_wrap
deleted file mode 100755
index dd43c5a2e2..0000000000
--- a/cpp/src/tests/test_wrap
+++ /dev/null
@@ -1,48 +0,0 @@
-#!/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.
-#
-
-# Read the started broker port, set appropriate env vars
-# then run the program under test
-
-QPID_PORT=`cat qpidd.port`
-export QPID_PORT
-
-program=$1
-shift
-
-QPID_LOG_TO_FILE=`basename $program`.log
-export QPID_LOG_TO_FILE
-
-ERROR=0
-$program $* || ERROR=1
-
-# Check qpidd.log.
-egrep 'warning\|error\|critical' $QPID_LOG_TO_FILE && {
- echo "WARNING: Suspicious broker log entries in $QPID_LOG_TO_FILE, above."
-}
-
-# Check valgrind log.
-#if test -n "$VALGRIND"; then
-# . `dirname $0`/vg_check $VG_LOG*
-# vg_check qpidd.vglog* || ERROR=1
-#fi
-
-exit $ERROR
diff --git a/cpp/src/tests/testagent.cpp b/cpp/src/tests/testagent.cpp
deleted file mode 100644
index 98520b424a..0000000000
--- a/cpp/src/tests/testagent.cpp
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- *
- * 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.
- *
- */
-
-#include <qpid/management/Manageable.h>
-#include <qpid/management/ManagementObject.h>
-#include <qpid/agent/ManagementAgent.h>
-#include <qpid/sys/Mutex.h>
-#include <qpid/sys/Time.h>
-#include "qmf/org/apache/qpid/agent/example/Parent.h"
-#include "qmf/org/apache/qpid/agent/example/Child.h"
-#include "qmf/org/apache/qpid/agent/example/ArgsParentCreate_child.h"
-#include "qmf/org/apache/qpid/agent/example/EventChildCreated.h"
-#include "qmf/org/apache/qpid/agent/example/Package.h"
-
-#include <signal.h>
-#include <cstdlib>
-#include <iostream>
-
-#include <sstream>
-
-static bool running = true;
-
-using namespace std;
-using qpid::management::ManagementAgent;
-using qpid::management::ManagementObject;
-using qpid::management::Manageable;
-using qpid::management::Args;
-using qpid::sys::Mutex;
-namespace _qmf = qmf::org::apache::qpid::agent::example;
-
-class ChildClass;
-
-//==============================================================
-// CoreClass is the operational class that corresponds to the
-// "Parent" class in the management schema.
-//==============================================================
-class CoreClass : public Manageable
-{
- string name;
- ManagementAgent* agent;
- _qmf::Parent* mgmtObject;
- std::vector<ChildClass*> children;
- Mutex vectorLock;
-
-public:
-
- CoreClass(ManagementAgent* agent, string _name);
- ~CoreClass() { mgmtObject->resourceDestroy(); }
-
- ManagementObject* GetManagementObject(void) const
- { return mgmtObject; }
-
- void doLoop();
- status_t ManagementMethod (uint32_t methodId, Args& args, string& text);
-};
-
-class ChildClass : public Manageable
-{
- string name;
- _qmf::Child* mgmtObject;
-
-public:
-
- ChildClass(ManagementAgent* agent, CoreClass* parent, string name);
- ~ChildClass() { mgmtObject->resourceDestroy(); }
-
- ManagementObject* GetManagementObject(void) const
- { return mgmtObject; }
-
- void doWork()
- {
- mgmtObject->inc_count(2);
- }
-};
-
-CoreClass::CoreClass(ManagementAgent* _agent, string _name) : name(_name), agent(_agent)
-{
- static uint64_t persistId = 0x111222333444555LL;
- mgmtObject = new _qmf::Parent(agent, this, name);
-
- agent->addObject(mgmtObject, persistId++);
- mgmtObject->set_state("IDLE");
-}
-
-void CoreClass::doLoop()
-{
- // Periodically bump a counter to provide a changing statistical value
- while (running) {
- qpid::sys::sleep(1);
- mgmtObject->inc_count();
- mgmtObject->set_state("IN_LOOP");
-
- {
- Mutex::ScopedLock _lock(vectorLock);
-
- for (std::vector<ChildClass*>::iterator iter = children.begin();
- iter != children.end();
- iter++) {
- (*iter)->doWork();
- }
- }
- }
-}
-
-Manageable::status_t CoreClass::ManagementMethod(uint32_t methodId, Args& args, string& /*text*/)
-{
- Mutex::ScopedLock _lock(vectorLock);
-
- switch (methodId) {
- case _qmf::Parent::METHOD_CREATE_CHILD:
- _qmf::ArgsParentCreate_child& ioArgs = (_qmf::ArgsParentCreate_child&) args;
-
- ChildClass *child = new ChildClass(agent, this, ioArgs.i_name);
- ioArgs.o_childRef = child->GetManagementObject()->getObjectId();
-
- children.push_back(child);
-
- agent->raiseEvent(_qmf::EventChildCreated(ioArgs.i_name));
-
- return STATUS_OK;
- }
-
- return STATUS_NOT_IMPLEMENTED;
-}
-
-ChildClass::ChildClass(ManagementAgent* agent, CoreClass* parent, string name)
-{
- mgmtObject = new _qmf::Child(agent, this, parent, name);
-
- agent->addObject(mgmtObject);
-}
-
-
-//==============================================================
-// Main program
-//==============================================================
-
-ManagementAgent::Singleton* singleton;
-
-void shutdown(int)
-{
- running = false;
-}
-
-int main_int(int argc, char** argv)
-{
- singleton = new ManagementAgent::Singleton();
- const char* host = argc>1 ? argv[1] : "127.0.0.1";
- int port = argc>2 ? atoi(argv[2]) : 5672;
-
- signal(SIGINT, shutdown);
-
- // Create the qmf management agent
- ManagementAgent* agent = singleton->getInstance();
-
- // Register the Qmf_example schema with the agent
- _qmf::Package packageInit(agent);
-
- // Start the agent. It will attempt to make a connection to the
- // management broker
- agent->init(host, port, 5, false, ".magentdata");
-
- // Allocate some core objects
- CoreClass core1(agent, "Example Core Object #1");
- CoreClass core2(agent, "Example Core Object #2");
- CoreClass core3(agent, "Example Core Object #3");
-
- core1.doLoop();
-
- // done, cleanup and exit
- delete singleton;
-
- return 0;
-}
-
-int main(int argc, char** argv)
-{
- try {
- return main_int(argc, argv);
- } catch(std::exception& e) {
- cerr << "Top Level Exception: " << e.what() << endl;
- return 1;
- }
-}
-
diff --git a/cpp/src/tests/testagent.mk b/cpp/src/tests/testagent.mk
deleted file mode 100644
index 19d91ccab9..0000000000
--- a/cpp/src/tests/testagent.mk
+++ /dev/null
@@ -1,51 +0,0 @@
-#
-# 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.
-#
-
-# Build a simple qmf agent for test purposes.
-
-TESTAGENT_GEN_SRC= \
- testagent_gen/qmf/org/apache/qpid/agent/example/Parent.h \
- testagent_gen/qmf/org/apache/qpid/agent/example/Child.h \
- testagent_gen/qmf/org/apache/qpid/agent/example/Parent.cpp \
- testagent_gen/qmf/org/apache/qpid/agent/example/Child.cpp \
- testagent_gen/qmf/org/apache/qpid/agent/example/ArgsParentCreate_child.h \
- testagent_gen/qmf/org/apache/qpid/agent/example/EventChildCreated.h \
- testagent_gen/qmf/org/apache/qpid/agent/example/EventChildDestroyed.h \
- testagent_gen/qmf/org/apache/qpid/agent/example/EventChildCreated.cpp \
- testagent_gen/qmf/org/apache/qpid/agent/example/EventChildDestroyed.cpp \
- testagent_gen/qmf/org/apache/qpid/agent/example/Package.h \
- testagent_gen/qmf/org/apache/qpid/agent/example/Package.cpp
-
-$(TESTAGENT_GEN_SRC): testagent_gen.timestamp
-if GENERATE
-TESTAGENT_DEPS=../mgen.timestamp
-endif # GENERATE
-testagent_gen.timestamp: testagent.xml ${TESTAGENT_DEPS}
- $(QMF_GEN) -o testagent_gen/qmf $(srcdir)/testagent.xml
- touch $@
-
-CLEANFILES+=$(TESTAGENT_GEN_SRC) testagent_gen.timestamp
-
-testagent-testagent.$(OBJEXT): $(TESTAGENT_GEN_SRC)
-qpidtest_PROGRAMS+=testagent
-testagent_CXXFLAGS=$(CXXFLAGS) -Itestagent_gen
-testagent_SOURCES=testagent.cpp $(TESTAGENT_GEN_SRC)
-testagent_LDADD=$(top_builddir)/src/libqmf.la
-
-EXTRA_DIST+=testagent.xml
diff --git a/cpp/src/tests/testagent.xml b/cpp/src/tests/testagent.xml
deleted file mode 100644
index 0b1436f999..0000000000
--- a/cpp/src/tests/testagent.xml
+++ /dev/null
@@ -1,64 +0,0 @@
-<schema package="org.apache.qpid.agent.example">
-
-<!--
- 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.
--->
-
- <!--
- ===============================================================
- Parent
- ===============================================================
- -->
- <class name="Parent">
-
- This class represents a parent object
-
- <property name="name" type="lstr" access="RC" index="y"/>
-
- <statistic name="state" type="sstr" desc="Operational state of the link"/>
- <statistic name="count" type="count64" unit="tick" desc="Counter that increases monotonically"/>
-
- <method name="create_child" desc="Create child object">
- <arg name="name" dir="I" type="lstr"/>
- <arg name="childRef" dir="O" type="objId"/>
- </method>
- </class>
-
-
- <!--
- ===============================================================
- Child
- ===============================================================
- -->
- <class name="Child">
- <property name="ParentRef" type="objId" references="Parent" access="RC" index="y" parentRef="y"/>
- <property name="name" type="lstr" access="RC" index="y"/>
-
- <statistic name="count" type="count64" unit="tick" desc="Counter that increases monotonically"/>
-
- <method name="delete"/>
- </class>
-
- <eventArguments>
- <arg name="childName" type="lstr"/>
- </eventArguments>
-
- <event name="ChildCreated" args="childName"/>
- <event name="ChildDestroyed" args="childName"/>
-</schema>
-
diff --git a/cpp/src/tests/testlib.py b/cpp/src/tests/testlib.py
deleted file mode 100644
index fe57a84a81..0000000000
--- a/cpp/src/tests/testlib.py
+++ /dev/null
@@ -1,766 +0,0 @@
-#
-# 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.
-#
-
-#
-# Support library for qpid python tests.
-#
-
-import os, re, signal, subprocess, time, unittest
-
-class TestBase(unittest.TestCase):
- """
- Base class for qpid tests. Provides broker start/stop/kill methods
- """
-
- """
- The following environment vars control if and how the test is run, and determine where many of the helper
- executables/libs are to be found.
- """
- _storeLib = os.getenv("STORE_LIB")
- _storeEnable = _storeLib != None # Must be True for durability to be enabled during the test
- _qpiddExec = os.getenv("QPIDD_EXEC", "/usr/sbin/qpidd")
- _tempStoreDir = os.path.abspath(os.getenv("TMP_DATA_DIR", "/tmp/qpid"))
-
- """Global message counter ensures unique messages"""
- _msgCnt = 0
-
- # --- Helper functions for parameter handling ---
-
- def _paramBool(self, key, val, keyOnly = False):
- if val == None:
- return ""
- if keyOnly:
- if val:
- return " --%s" % key
- else:
- return ""
- else:
- if val:
- return " --%s yes" % key
- else:
- return " --%s no" % key
-
- # --- Helper functions for message creation ---
-
- def _makeMessage(self, msgSize):
- msg = "Message-%04d" % self._msgCnt
- self._msgCnt = self._msgCnt + 1
- msgLen = len(msg)
- if msgSize > msgLen:
- for i in range(msgLen, msgSize):
- if i == msgLen:
- msg += "-"
- else:
- msg += chr(ord('a') + (i % 26))
- return msg
-
- def _makeMessageList(self, numMsgs, msgSize):
- if msgSize == None:
- msgSize = 12
- msgs = ""
- for m in range(0, numMsgs):
- msgs += "%s\n" % self._makeMessage(msgSize)
- return msgs
-
- # --- Starting and stopping a broker ---
-
- def startBroker(self, qpiddArgs, logFile = None):
- """Start a single broker daemon, returns tuple (pid, port)"""
- if self._qpiddExec == None:
- raise Exception("Environment variable QPIDD is not set")
- cmd = "%s --daemon --port=0 %s" % (self._qpiddExec, qpiddArgs)
- portStr = os.popen(cmd).read()
- if len(portStr) == 0:
- err = "Broker daemon startup failed."
- if logFile != None:
- err += " See log file %s" % logFile
- raise Exception(err)
- port = int(portStr)
- pidStr = os.popen("%s -p %d -c" % (self._qpiddExec, port)).read()
- try:
- pid = int(pidStr)
- except:
- raise Exception("Unable to get pid: \"%s -p %d -c\" returned %s" % (self._qpiddExec, port, pidStr))
- #print "started broker: pid=%d, port=%d args: %s" % (pid, port, qpiddArgs)
- return (pid, port)
-
- def killBroker(self, nodeTuple, ignoreFailures = False):
- """Kill a broker using kill -9"""
- try:
- os.kill(nodeTuple[self.PID], signal.SIGKILL)
- try:
- os.waitpid(nodeTuple[self.PID], 0)
- except:
- pass
- #print "killed broker: port=%d pid=%d" % (nodeTuple[self.PORT], nodeTuple[self.PID])
- except:
- if ignoreFailures:
- print "WARNING: killBroker (port=%d pid=%d) failed - ignoring." % (nodeTuple[self.PORT], nodeTuple[self.PID])
- else:
- raise
-
- def stopBroker(self, nodeTuple, ignoreFailures = False):
- """Stop a broker using qpidd -q"""
- try:
- ret = os.spawnl(os.P_WAIT, self._qpiddExec, self._qpiddExec, "--port=%d" % nodeTuple[self.PORT], "--quit", "--no-module-dir")
- if ret != 0:
- raise Exception("stopBroker(): port=%d: qpidd -q returned %d" % (nodeTuple[self.PORT], ret))
- try:
- os.waitpid(nodeTuple[self.PID], 0)
- except:
- pass
- #print "stopped broker: port=%d pid=%d" % (nodeTuple[self.PORT], nodeTuple[self.PID])
- except:
- if ignoreFailures:
- print "WARNING: stopBroker (port=%d pid=%d) failed - ignoring." % (nodeTuple[self.PORT], nodeTuple[self.PID])
- else:
- raise
-
-
-
-class TestBaseCluster(TestBase):
- """
- Base class for cluster tests. Provides methods for starting and stopping clusters and cluster nodes.
- """
-
- """
- The following environment vars control if and how the test is run, and determine where many of the helper
- executables/libs are to be found.
- """
- _clusterLib = os.getenv("CLUSTER_LIB")
- _clusterTestEnable = _clusterLib != None # Must be True for these cluster tests to run
- _xmlLib = os.getenv("XML_LIB")
- _xmlEnable = _xmlLib != None
- _qpidConfigExec = os.getenv("QPID_CONFIG_EXEC", "/usr/bin/qpid-config")
- _qpidRouteExec = os.getenv("QPID_ROUTE_EXEC", "/usr/bin/qpid-route")
- _receiverExec = os.getenv("RECEIVER_EXEC", "/usr/libexec/qpid/test/receiver")
- _senderExec = os.getenv("SENDER_EXEC", "/usr/libexec/qpid/test/sender")
-
-
- """
- _clusterDict is a dictionary of clusters:
- key = cluster name (string)
- val = dictionary of node numbers:
- key = integer node number
- val = tuple containing (pid, port)
- For example, two clusters "TestCluster0" and "TestCluster1" containing several nodes would look as follows:
- {"TestCluster0": {0: (pid0-0, port0-0), 1: (pid0-1, port0-1), ...}, "TestCluster1": {0: (pid1-0, port1-0), 1: (pid1-1, port1-1), ...}}
- where pidm-n and portm-n are the int pid and port for TestCluster m node n respectively.
- """
- _clusterDict = {}
-
- """Index for (pid, port) tuple"""
- PID = 0
- PORT = 1
-
- def run(self, res):
- """ Skip cluster testing if env var RUN_CLUSTER_TESTS is not defined."""
- if not self._clusterTestEnable:
- return
- unittest.TestCase.run(self, res)
-
- # --- Private helper / convenience functions ---
-
- def _checkPids(self, clusterName = None):
- for pid, port in self.getTupleList():
- try:
- os.kill(pid, 0)
- except:
- raise Exception("_checkPids(): Broker with pid %d expected but does not exist! (crashed?)" % pid)
-
-
- # --- Starting cluster node(s) ---
-
- def createClusterNode(self, nodeNumber, clusterName):
- """Create a node and add it to the named cluster"""
- if self._tempStoreDir == None:
- raise Exception("Environment variable TMP_DATA_DIR is not set")
- if self._clusterLib == None:
- raise Exception("Environment variable LIBCLUSTER is not set")
- name = "%s-%d" % (clusterName, nodeNumber)
- dataDir = os.path.join(self._tempStoreDir, "cluster", name)
- logFile = "%s.log" % dataDir
- args = "--no-module-dir --load-module=%s --data-dir=%s --cluster-name=%s --auth=no --log-enable=notice+ --log-to-file=%s" % \
- (self._clusterLib, dataDir, clusterName, logFile)
- if self._storeEnable:
- if self._storeLib == None:
- raise Exception("Environment variable LIBSTORE is not set")
- args += " --load-module %s" % self._storeLib
- self._clusterDict[clusterName][nodeNumber] = self.startBroker(args, logFile)
-
- def createCluster(self, clusterName, numberNodes = 0):
- """Create a cluster containing an initial number of nodes"""
- self._clusterDict[clusterName] = {}
- for n in range(0, numberNodes):
- self.createClusterNode(n, clusterName)
-
- def waitForNodes(self, clusterName):
- """Wait for all nodes to become active (ie finish cluster sync)"""
- # TODO - connect to each known node in cluster
- # Until this is done, wait a bit (hack)
- time.sleep(1)
-
- # --- Cluster and node status ---
-
- def getTupleList(self, clusterName = None):
- """Get list of (pid, port) tuples of all known cluster brokers"""
- tList = []
- for c, l in self._clusterDict.iteritems():
- if clusterName == None or c == clusterName:
- for t in l.itervalues():
- tList.append(t)
- return tList
-
- def getNumBrokers(self):
- """Get total number of brokers in all known clusters"""
- return len(self.getTupleList())
-
- def checkNumBrokers(self, expected = None, checkPids = True):
- """Check that the total number of brokers in all known clusters is the expected value"""
- if expected != None and self.getNumBrokers() != expected:
- raise Exception("Unexpected number of brokers: expected %d, found %d" % (expected, self.getNumBrokers()))
- if checkPids:
- self._checkPids()
-
- def getClusterTupleList(self, clusterName):
- """Get list of (pid, port) tuples of all nodes in named cluster"""
- if clusterName in self._clusterDict:
- return self._clusterDict[clusterName].values()
- return []
-
- def getNumClusterBrokers(self, clusterName):
- """Get total number of brokers in named cluster"""
- return len(self.getClusterTupleList(clusterName))
-
- def getNodeTuple(self, nodeNumber, clusterName):
- """Get the (pid, port) tuple for the given cluster node"""
- return self._clusterDict[clusterName][nodeNumber]
-
- def checkNumClusterBrokers(self, clusterName, expected = None, checkPids = True, waitForNodes = True):
- """Check that the total number of brokers in the named cluster is the expected value"""
- if expected != None and self.getNumClusterBrokers(clusterName) != expected:
- raise Exception("Unexpected number of brokers in cluster %s: expected %d, found %d" % \
- (clusterName, expected, self.getNumClusterBrokers(clusterName)))
- if checkPids:
- self._checkPids(clusterName)
- if waitForNodes:
- self.waitForNodes(clusterName)
-
- def clusterExists(self, clusterName):
- """ Return True if clusterName exists, False otherwise"""
- return clusterName in self._clusterDict.keys()
-
- def clusterNodeExists(self, clusterName, nodeNumber):
- """ Return True if nodeNumber in clusterName exists, False otherwise"""
- if clusterName in self._clusterDict.keys():
- return nodeNumber in self._clusterDict[nodeName]
- return False
-
- def createCheckCluster(self, clusterName, size):
- """Create a cluster using the given name and size, then check the number of brokers"""
- self.createCluster(clusterName, size)
- self.checkNumClusterBrokers(clusterName, size)
-
- # --- Kill cluster nodes using signal 9 ---
-
- def killNode(self, nodeNumber, clusterName, updateDict = True, ignoreFailures = False):
- """Kill the given node in the named cluster using kill -9"""
- self.killBroker(self.getNodeTuple(nodeNumber, clusterName), ignoreFailures)
- if updateDict:
- del(self._clusterDict[clusterName][nodeNumber])
-
- def killCluster(self, clusterName, updateDict = True, ignoreFailures = False):
- """Kill all nodes in the named cluster"""
- for n in self._clusterDict[clusterName].iterkeys():
- self.killNode(n, clusterName, False, ignoreFailures)
- if updateDict:
- del(self._clusterDict[clusterName])
-
- def killClusterCheck(self, clusterName):
- """Kill the named cluster and check that the name is removed from the cluster dictionary"""
- self.killCluster(clusterName)
- if self.clusterExists(clusterName):
- raise Exception("Unable to kill cluster %s; %d nodes still exist" % \
- (clusterName, self.getNumClusterBrokers(clusterName)))
-
- def killAllClusters(self, ignoreFailures = False):
- """Kill all known clusters"""
- for n in self._clusterDict.iterkeys():
- self.killCluster(n, False, ignoreFailures)
- self._clusterDict.clear()
-
- def killAllClustersCheck(self, ignoreFailures = False):
- """Kill all known clusters and check that the cluster dictionary is empty"""
- self.killAllClusters(ignoreFailures)
- self.checkNumBrokers(0)
-
- # --- Stop cluster nodes using qpidd -q ---
-
- def stopNode(self, nodeNumber, clusterName, updateDict = True, ignoreFailures = False):
- """Stop the given node in the named cluster using qpidd -q"""
- self.stopBroker(self.getNodeTuple(nodeNumber, clusterName), ignoreFailures)
- if updateDict:
- del(self._clusterDict[clusterName][nodeNumber])
-
- def stopAllClusters(self, ignoreFailures = False):
- """Stop all known clusters"""
- for n in self._clusterDict.iterkeys():
- self.stopCluster(n, False, ignoreFailures)
- self._clusterDict.clear()
-
-
- def stopCluster(self, clusterName, updateDict = True, ignoreFailures = False):
- """Stop all nodes in the named cluster"""
- for n in self._clusterDict[clusterName].iterkeys():
- self.stopNode(n, clusterName, False, ignoreFailures)
- if updateDict:
- del(self._clusterDict[clusterName])
-
- def stopCheckCluster(self, clusterName, ignoreFailures = False):
- """Stop the named cluster and check that the name is removed from the cluster dictionary"""
- self.stopCluster(clusterName, True, ignoreFailures)
- if self.clusterExists(clusterName):
- raise Exception("Unable to kill cluster %s; %d nodes still exist" % (clusterName, self.getNumClusterBrokers(clusterName)))
-
- def stopAllCheck(self, ignoreFailures = False):
- """Kill all known clusters and check that the cluster dictionary is empty"""
- self.stopAllClusters()
- self.checkNumBrokers(0)
-
- # --- qpid-config functions ---
-
- def _qpidConfig(self, nodeNumber, clusterName, action):
- """Configure some aspect of a qpid broker using the qpid_config executable"""
- port = self.getNodeTuple(nodeNumber, clusterName)[self.PORT]
- #print "%s -a localhost:%d %s" % (self._qpidConfigExec, port, action)
- ret = os.spawnl(os.P_WAIT, self._qpidConfigExec, self._qpidConfigExec, "-a", "localhost:%d" % port, *action.split())
- if ret != 0:
- raise Exception("_qpidConfig(): cluster=\"%s\" nodeNumber=%d port=%d action=\"%s\" returned %d" % \
- (clusterName, nodeNumber, port, action, ret))
-
- def addExchange(self, nodeNumber, clusterName, exchangeType, exchangeName, durable = False, sequence = False, \
- ive = False):
- """Add a named exchange."""
- action = "add exchange %s %s" % (exchangeType, exchangeName)
- action += self._paramBool("durable", durable, True)
- action += self._paramBool("sequence", sequence, True)
- action += self._paramBool("ive", ive, True)
- self._qpidConfig(nodeNumber, clusterName, action)
-
- def deleteExchange(self, nodeNumber, clusterName, exchangeName):
- """Delete a named exchange"""
- self._qpidConfig(nodeNumber, clusterName, "del exchange %s" % exchangeName)
-
- def addQueue(self, nodeNumber, clusterName, queueName, configArgs = None):
- """Add a queue using qpid-config."""
- action = "add queue %s" % queueName
- if self._storeEnable:
- action += " --durable"
- if configArgs != None:
- action += " %s" % configArgs
- self._qpidConfig(nodeNumber, clusterName, action)
-
- def delQueue(self, nodeNumber, clusterName, queueName):
- """Delete a named queue using qpid-config."""
- self._qpidConfig(nodeNumber, clusterName, "del queue %s" % queueName)
-
- def bind(self, nodeNumber, clusterName, exchangeName, queueName, key):
- """Create an exchange-queue binding using qpid-config."""
- self._qpidConfig(nodeNumber, clusterName, "bind %s %s %s" % (exchangeName, queueName, key))
-
- def unbind(self, nodeNumber, clusterName, exchangeName, queueName, key):
- """Remove an exchange-queue binding using qpid-config."""
- self._qpidConfig(nodeNumber, clusterName, "unbind %s %s %s" % (exchangeName, queueName, key))
-
- # --- qpid-route functions (federation) ---
-
- def brokerDict(self, nodeNumber, clusterName, host = "localhost", user = None, password = None):
- """Returns a dictionary containing the broker info to be passed to route functions"""
- port = self.getNodeTuple(nodeNumber, clusterName)[self.PORT]
- return {"cluster": clusterName, "node":nodeNumber, "port":port, "host":host, "user":user, "password":password}
-
- def _brokerStr(self, brokerDict):
- """Set up a broker string in the format [user/password@]host:port"""
- str = ""
- if brokerDict["user"] !=None and brokerDict["password"] != None:
- str = "%s@%s" % (brokerDict["user"], brokerDict["password"])
- str += "%s:%d" % (brokerDict["host"], brokerDict["port"])
- return str
-
- def _qpidRoute(self, action):
- """Set up a route using qpid-route"""
- #print "%s %s" % (self._qpidRouteExec, action)
- ret = os.spawnl(os.P_WAIT, self._qpidRouteExec, self._qpidRouteExec, *action.split())
- if ret != 0:
- raise Exception("_qpidRoute(): action=\"%s\" returned %d" % (action, ret))
-
- def routeDynamicAdd(self, destBrokerDict, srcBrokerDict, exchangeName):
- self._qpidRoute("dynamic add %s %s %s" % (self._brokerStr(destBrokerDict), self._brokerStr(srcBrokerDict), exchangeName))
-
- def routeDynamicDelete(self, destBrokerDict, srcBrokerDict, exchangeName):
- self._qpidRoute("dynamic del %s %s %s" % (self._brokerStr(destBrokerDict), self._brokerStr(srcBrokerDict), exchangeName))
-
- def routeAdd(self, destBrokerDict, srcBrokerDict, exchangeName, routingKey):
- self._qpidRoute("route add %s %s %s %s" % (self._brokerStr(destBrokerDict), self._brokerStr(srcBrokerDict), exchangeName, routingKey))
-
- def routeDelete(self, destBrokerDict, srcBrokerDict, exchangeName, routingKey):
- self._qpidRoute("route del %s %s %s %s" % (self._brokerStr(destBrokerDict), self._brokerStr(srcBrokerDict), exchangeName, routingKey))
-
- def routeQueueAdd(self, destBrokerDict, srcBrokerDict, exchangeName, queueName):
- self._qpidRoute("queue add %s %s %s %s" % (self._brokerStr(destBrokerDict), self._brokerStr(srcBrokerDict), exchangeName, queueName))
-
- def routeQueueDelete(self, destBrokerDict, srcBrokerDict, exchangeName, queueName):
- self._qpidRoute("queue del %s %s %s %s" % (self._brokerStr(destBrokerDict), self._brokerStr(srcBrokerDict), exchangeName, queueName))
-
- def routeLinkAdd(self, destBrokerDict, srcBrokerDict):
- self._qpidRoute("link add %s %s" % (self._brokerStr(destBrokerDict), self._brokerStr(srcBrokerDict)))
-
- def routeLinkDelete(self, destBrokerDict, srcBrokerDict):
- self._qpidRoute("link del %s %s" % (self._brokerStr(destBrokerDict), self._brokerStr(srcBrokerDict)))
-
- # --- Message send and receive functions ---
-
- def _receiver(self, action):
- if self._receiverExec == None:
- raise Exception("Environment variable RECEIVER is not set")
- cmd = "%s %s" % (self._receiverExec, action)
- #print cmd
- return subprocess.Popen(cmd.split(), stdout = subprocess.PIPE)
-
- def _sender(self, action):
- if self._senderExec == None:
- raise Exception("Environment variable SENDER is not set")
- cmd = "%s %s" % (self._senderExec, action)
- #print cmd
- return subprocess.Popen(cmd.split(), stdin = subprocess.PIPE)
-
- def createReciever(self, nodeNumber, clusterName, queueName, numMsgs = None, receiverArgs = None):
- port = self.getNodeTuple(nodeNumber, clusterName)[self.PORT]
- action = "--port %d --queue %s" % (port, queueName)
- if numMsgs != None:
- action += " --messages %d" % numMsgs
- if receiverArgs != None:
- action += " %s" % receiverArgs
- return self._receiver(action)
-
- def createSender(self, nodeNumber, clusterName, exchangeName, routingKey, senderArgs = None):
- port = self.getNodeTuple(nodeNumber, clusterName)[self.PORT]
- action = "--port %d --exchange %s" % (port, exchangeName)
- if routingKey != None and len(routingKey) > 0:
- action += " --routing-key %s" % routingKey
- if self._storeEnable:
- action += " --durable yes"
- if senderArgs != None:
- action += " %s" % senderArgs
- return self._sender(action)
-
- def createBindDirectExchangeQueue(self, nodeNumber, clusterName, exchangeName, queueName):
- self.addExchange(nodeNumber, clusterName, "direct", exchangeName)
- self.addQueue(nodeNumber, clusterName, queueName)
- self.bind(nodeNumber, clusterName, exchangeName, queueName, queueName)
-
- def createBindTopicExchangeQueues(self, nodeNumber, clusterName, exchangeName, queueNameKeyList):
- self.addExchange(nodeNumber, clusterName, "topic", exchangeName)
- for queueName, key in queueNameKeyList.iteritems():
- self.addQueue(nodeNumber, clusterName, queueName)
- self.bind(nodeNumber, clusterName, exchangeName, queueName, key)
-
- def createBindFanoutExchangeQueues(self, nodeNumber, clusterName, exchangeName, queueNameList):
- self.addExchange(nodeNumber, clusterName, "fanout", exchangeName)
- for queueName in queueNameList:
- self.addQueue(nodeNumber, clusterName, queueName)
- self.bind(nodeNumber, clusterName, exchangeName, queueName, "")
-
- def sendMsgs(self, nodeNumber, clusterName, exchangeName, routingKey, numMsgs, msgSize = None, wait = True):
- msgs = self._makeMessageList(numMsgs, msgSize)
- sender = self.createSender(nodeNumber, clusterName, exchangeName, routingKey)
- sender.stdin.write(msgs)
- sender.stdin.close()
- if wait:
- sender.wait()
- return msgs
-
- def receiveMsgs(self, nodeNumber, clusterName, queueName, numMsgs, wait = True):
- receiver = self.createReciever(nodeNumber, clusterName, queueName, numMsgs)
- cnt = 0
- msgs = ""
- while cnt < numMsgs:
- rx = receiver.stdout.readline()
- if rx == "" and receiver.poll() != None: break
- msgs += rx
- cnt = cnt + 1
- if wait:
- receiver.wait()
- return msgs
-
-
- # --- Exchange-specific helper inner classes ---
-
- class TestHelper:
- """
- This is a "virtual" superclass for test helpers, and is not useful on its own, but the
- per-exchange subclasses are designed to keep track of the messages sent to and received
- from queues which have bindings to that exchange type.
- """
-
- def __init__(self, testBaseCluster, clusterName, numNodes, exchangeName, queueNameList):
-
- """Dictionary of queues and lists of messages sent to them."""
- self._txMsgs = {}
- """Dictionary of queues and lists of messages received from them."""
- self._rxMsgs = {}
- """List of node numbers currently in the cluster"""
- self._nodes = []
- """List of node numbers which have been killed and can therefore be recovered"""
- self._deadNodes = []
- """Last node to be used"""
- self._lastNode = None
-
- self._testBaseCluster = testBaseCluster
- self._clusterName = clusterName
- self._exchangeName = exchangeName
- self._queueNameList = queueNameList
- self._addQueues(queueNameList)
- self._testBaseCluster.createCheckCluster(clusterName, numNodes)
- self._nodes.extend(range(0, numNodes))
-
- def _addQueues(self, queueNameList):
- for qn in queueNameList:
- if not qn in self._txMsgs:
- self._txMsgs[qn] = []
- if not qn in self._rxMsgs:
- self._rxMsgs[qn] = []
-
- def _bindQueue(self, queueName, bindingKey, nodeNumber = None):
- """Bind a queue to an exchange using a binding key."""
- if nodeNumber == None:
- nodeNumber = self._nodes[0] # first available node
- self._testBaseCluster.addQueue(nodeNumber, self._clusterName, queueName)
- self._testBaseCluster.bind(nodeNumber, self._clusterName, self._exchangeName, queueName, bindingKey)
-
- def _highestNodeNumber(self):
- """Find the highest node number used so far between the current nodes and those stopped/killed."""
- highestNode = self._nodes[-1]
- if len(self._deadNodes) == 0:
- return highestNode
- highestDeadNode = self._deadNodes[-1]
- if highestNode > highestDeadNode:
- return highestNode
- return highestDeadNode
-
- def killCluster(self):
- """Kill all nodes in the cluster"""
- self._testBaseCluster.killCluster(self._clusterName)
- self._testBaseCluster.checkNumClusterBrokers(self._clusterName, 0)
- self._deadNodes.extend(self._nodes)
- self._deadNodes.sort()
- del self._nodes[:]
-
- def restoreCluster(self, lastNode = None, restoreNodes = True):
- """Restore a previously killed cluster"""
- self._testBaseCluster.createCluster(self._clusterName)
- if restoreNodes:
- numNodes = len(self._deadNodes)
- self.restoreNodes(lastNode)
- self._testBaseCluster.checkNumClusterBrokers(self._clusterName, numNodes)
-
- def addNodes(self, numberOfNodes = 1):
- """Add a fixed number of nodes to the cluster."""
- nodeStart = self._highestNodeNumber() + 1
- for i in range(0, numberOfNodes):
- nodeNumber = nodeStart + i
- self._testBaseCluster.createClusterNode(nodeNumber, self._clusterName)
- self._nodes.append(nodeNumber)
- self._testBaseCluster.checkNumClusterBrokers(self._clusterName, len(self._nodes))
- self._testBaseCluster.waitForNodes(self._clusterName)
-
- def restoreNode(self, nodeNumber):
- """Restore a cluster node that has been previously killed"""
- if nodeNumber not in self._deadNodes:
- raise Exception("restoreNode(): Node number %d not in dead node list %s" % (nodeNumber, self._deadNodes))
- self._testBaseCluster.createClusterNode(nodeNumber, self._clusterName)
- self._deadNodes.remove(nodeNumber)
- self._nodes.append(nodeNumber)
- self._nodes.sort()
-
- def restoreNodes(self, lastNode = None):
- """Restore all known cluster nodes that have been previously killed starting with a known last-used node"""
- if len(self._nodes) == 0: # restore last-used node first
- if lastNode == None:
- lastNode = self._lastNode
- self.restoreNode(lastNode)
- while len(self._deadNodes) > 0:
- self.restoreNode(self._deadNodes[0])
- self._testBaseCluster.waitForNodes(self._clusterName)
-
- def killNode(self, nodeNumber):
- """Kill a cluster node (if it is in the _nodes list)."""
- if nodeNumber not in self._nodes:
- raise Exception("killNode(): Node number %d not in node list %s" % (nodeNumber, self._nodes))
- self._testBaseCluster.killNode(nodeNumber, self._clusterName)
- self._nodes.remove(nodeNumber)
- self._deadNodes.append(nodeNumber)
- self._deadNodes.sort()
-
- def sendMsgs(self, routingKey, numMsgs, nodeNumber = None, msgSize = None, wait = True):
- """Send a fixed number of messages using the given routing key."""
- if nodeNumber == None:
- nodeNumber = self._nodes[0] # Use first available node
- msgs = self._testBaseCluster._makeMessageList(numMsgs, msgSize)
- sender = self._testBaseCluster.createSender(nodeNumber, self._clusterName, self._exchangeName, routingKey)
- sender.stdin.write(msgs)
- sender.stdin.close()
- if wait:
- sender.wait()
- self._lastNode = nodeNumber
- return msgs.split()
-
- # TODO - this i/f is messy: one mumMsgs can be given, but a list of queues
- # so assuming numMsgs for each queue
- # A mechanism is needed to specify a different numMsgs per queue
- def receiveMsgs(self, numMsgs, nodeNumber = None, queueNameList = None, wait = True):
- """Receive a fixed number of messages from a named queue. If numMsgs == None, get all remaining messages."""
- if nodeNumber == None:
- nodeNumber = self._nodes[0] # Use first available node
- if queueNameList == None:
- queueNameList = self._txMsgs.iterkeys()
- for qn in queueNameList:
- nm = numMsgs
- if nm == None:
- nm = len(self._txMsgs[qn]) - len(self._rxMsgs[qn]) # get all remaining messages
- if nm > 0:
- while nm > 0:
- receiver = self._testBaseCluster.createReciever(nodeNumber, self._clusterName, qn, nm)
- cnt = 0
- while cnt < nm:
- rx = receiver.stdout.readline().strip()
- if rx == "":
- if receiver.poll() != None: break
- elif rx not in self._rxMsgs[qn]:
- self._rxMsgs[qn].append(rx)
- cnt = cnt + 1
- nm = nm - cnt
- if wait:
- receiver.wait()
- self._rxMsgs[qn].sort()
- self._lastNode = nodeNumber
-
- def receiveRemainingMsgs(self, nodeNumber = None, queueNameList = None, wait = True):
- """Receive all remaining messages on named queue."""
- self.receiveMsgs(None, nodeNumber, queueNameList, wait)
-
- def checkMsgs(self):
- """Return True if all expected messages have been received (ie the transmit and receive list are identical)."""
- txMsgTot = 0
- rxMsgTot = 0
- for qn, txMsgList in self._txMsgs.iteritems():
- rxMsgList = self._rxMsgs[qn]
- txMsgTot = txMsgTot + len(txMsgList)
- rxMsgTot = rxMsgTot + len(rxMsgList)
- if len(txMsgList) != len(rxMsgList):
- return False
- for i, m in enumerate(txMsgList):
- if m != rxMsgList[i]:
- return False
- if txMsgTot == 0 and rxMsgTot == 0:
- print "WARNING: No messages were either sent or received"
- return True
-
- def finalizeTest(self):
- """Recover all the remaining messages on all queues, then check that all expected messages were received."""
- self.receiveRemainingMsgs()
- self._testBaseCluster.stopAllCheck()
- if not self.checkMsgs():
- self.printMsgs()
- self._testBaseCluster.fail("Send - receive message mismatch")
-
- def printMsgs(self, txMsgs = True, rxMsgs = True):
- """Print all messages transmitted and received."""
- for qn, txMsgList in self._txMsgs.iteritems():
- print "Queue: %s" % qn
- if txMsgs:
- print " txMsgList = %s" % txMsgList
- if rxMsgs:
- rxMsgList = self._rxMsgs[qn]
- print " rxMsgList = %s" % rxMsgList
-
-
- class DirectExchangeTestHelper(TestHelper):
-
- def __init__(self, testBaseCluster, clusterName, numNodes, exchangeName, queueNameList):
- TestBaseCluster.TestHelper.__init__(self, testBaseCluster, clusterName, numNodes, exchangeName, queueNameList)
- self._testBaseCluster.addExchange(0, clusterName, "direct", exchangeName)
- for qn in queueNameList:
- self._bindQueue(qn, qn)
-
- def addQueues(self, queueNameList):
- self._addQueues(queueNameList)
- for qn in queueNameList:
- self._bindQueue(qn, qn)
-
- def sendMsgs(self, numMsgs, nodeNumber = None, queueNameList = None, msgSize = None, wait = True):
- if queueNameList == None:
- queueNameList = self._txMsgs.iterkeys()
- for qn in queueNameList:
- self._txMsgs[qn].extend(TestBaseCluster.TestHelper.sendMsgs(self, qn, numMsgs, nodeNumber, msgSize, wait))
-
-
- class TopicExchangeTestHelper(TestHelper):
-
- def __init__(self, testBaseCluster, clusterName, numNodes, exchangeName, queueNameKeyList):
- self._queueNameKeyList = queueNameKeyList
- TestBaseCluster.TestHelper.__init__(self, testBaseCluster, clusterName, numNodes, exchangeName, queueNameKeyList.iterkeys())
- self._testBaseCluster.addExchange(0, clusterName, "topic", exchangeName)
- for qn, bk in queueNameKeyList.iteritems():
- self._bindQueue(qn, bk)
-
- def addQueues(self, queueNameKeyList):
- self._addQueues(queueNameKeyList.iterkeys())
- for qn, bk in queueNameKeyList.iteritems():
- self._bindQueue(qn, bk)
-
- def _prepareRegex(self, bk):
- # This regex conversion is not very complete - there are other chars that should be escaped too
- return "^%s$" % bk.replace(".", r"\.").replace("*", r"[^.]*").replace("#", ".*")
-
- def sendMsgs(self, routingKey, numMsgs, nodeNumber = None, msgSize = None, wait = True):
- msgList = TestBaseCluster.TestHelper.sendMsgs(self, routingKey, numMsgs, nodeNumber, msgSize, wait)
- for qn, bk in self._queueNameKeyList.iteritems():
- if re.match(self._prepareRegex(bk), routingKey):
- self._txMsgs[qn].extend(msgList)
-
-
- class FanoutExchangeTestHelper(TestHelper):
-
- def __init__(self, testBaseCluster, clusterName, numNodes, exchangeName, queueNameList):
- TestBaseCluster.TestHelper.__init__(self, testBaseCluster, clusterName, numNodes, exchangeName, queueNameList)
- self._testBaseCluster.addExchange(0, clusterName, "fanout", exchangeName)
- for qn in queueNameList:
- self._bindQueue(qn, "")
-
- def addQueues(self, queueNameList):
- self._addQueues(queueNameList)
- for qn in queueNameList:
- self._bindQueue(qn, "")
-
- def sendMsgs(self, numMsgs, nodeNumber = None, msgSize = None, wait = True):
- msgList = TestBaseCluster.TestHelper.sendMsgs(self, "", numMsgs, nodeNumber, msgSize, wait)
- for ml in self._txMsgs.itervalues():
- ml.extend(msgList)
-
diff --git a/cpp/src/tests/topic_perftest b/cpp/src/tests/topic_perftest
deleted file mode 100755
index cd440b2458..0000000000
--- a/cpp/src/tests/topic_perftest
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/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.
-#
-
-exec `dirname $0`/run_perftest 10000 --mode topic --qt 16
diff --git a/cpp/src/tests/topictest b/cpp/src/tests/topictest
deleted file mode 100755
index 257c24bd81..0000000000
--- a/cpp/src/tests/topictest
+++ /dev/null
@@ -1,61 +0,0 @@
-#!/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 C++ topic test
-
-# Clean up old log files
-rm -f subscriber_*.log
-
-# Defaults values
-SUBSCRIBERS=10
-MESSAGES=2000
-BATCHES=10
-
-while getopts "s:m:b:h:t" opt ; do
- case $opt in
- s) SUBSCRIBERS=$OPTARG ;;
- m) MESSAGES=$OPTARG ;;
- b) BATCHES=$OPTARG ;;
- h) HOST=-h$OPTARG ;;
- t) TRANSACTIONAL="--transactional --durable" ;;
- ?)
- echo "Usage: %0 [-s <subscribers>] [-m <messages.] [-b <batches>]"
- exit 1
- ;;
- esac
-done
-
-subscribe() {
- echo Start subscriber $1
- LOG="subscriber_$1.log"
- ./qpid-topic-listener $TRANSACTIONAL > $LOG 2>&1 && rm -f $LOG
-}
-
-publish() {
- ./qpid-topic-publisher --messages $MESSAGES --batches $BATCHES --subscribers $SUBSCRIBERS $HOST $TRANSACTIONAL
-}
-
-for ((i=$SUBSCRIBERS ; i--; )); do
- subscribe $i &
-done
-# FIXME aconway 2007-03-27: Hack around startup race. Fix topic test.
-sleep 2
-publish 2>&1 || exit 1
diff --git a/cpp/src/tests/topictest.ps1 b/cpp/src/tests/topictest.ps1
deleted file mode 100644
index 59a483c2d5..0000000000
--- a/cpp/src/tests/topictest.ps1
+++ /dev/null
@@ -1,73 +0,0 @@
-#
-# 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.
-#
-
-# Parameters with default values: s (subscribers) m (messages) b (batches)
-# h (host) t (false; use transactions)
-param (
- [int]$subscribers = 10,
- [int]$message_count = 2000,
- [int]$batches = 10,
- [string]$broker,
- [switch] $t # transactional
-)
-
-# Run the C++ topic test
-[string]$me = $myInvocation.InvocationName
-$srcdir = Split-Path $me
-#$srcdir = Split-Path $myInvocation.InvocationName
-
-# Clean up old log files
-Get-Item subscriber_*.log | Remove-Item
-
-if ($t) {
- $transactional = "--transactional --durable"
-}
-
-# Find which subdir the exes are in
-. $srcdir\find_prog.ps1 .\topic_listener.exe
-
-function subscribe {
- param ([int]$num, [string]$sub)
- "Start subscriber $num"
- $LOG = "subscriber_$num.log"
- $cmdline = ".\$sub\topic_listener $transactional > $LOG 2>&1
- if (`$LastExitCode -ne 0) { Remove-Item $LOG }"
- $cmdblock = $executioncontext.invokecommand.NewScriptBlock($cmdline)
- . $srcdir\background.ps1 $cmdblock
-}
-
-function publish {
- param ([string]$sub)
- Invoke-Expression ".\$sub\topic_publisher --messages $message_count --batches $batches --subscribers $subscribers $host $transactional" 2>&1
-}
-
-if ($broker.length) {
- $broker = "-h$broker"
-}
-
-$i = $subscribers
-while ($i -gt 0) {
- subscribe $i $sub
- $i--
-}
-
-# FIXME aconway 2007-03-27: Hack around startup race. Fix topic test.
-Start-Sleep 2
-publish $sub
-exit $LastExitCode
diff --git a/cpp/src/tests/txjob.cpp b/cpp/src/tests/txjob.cpp
deleted file mode 100644
index a7a905c1b7..0000000000
--- a/cpp/src/tests/txjob.cpp
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- *
- * 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.
- *
- */
-
-#include <iostream>
-#include <boost/bind.hpp>
-#include <boost/ptr_container/ptr_vector.hpp>
-
-#include "TestOptions.h"
-#include "qpid/client/AsyncSession.h"
-#include "qpid/client/FailoverManager.h"
-#include "qpid/client/Message.h"
-#include "qpid/client/SubscriptionManager.h"
-#include "qpid/sys/Thread.h"
-
-using namespace qpid::client;
-using namespace qpid::sys;
-
-namespace qpid {
-namespace tests {
-
-struct Args : public qpid::TestOptions
-{
- string workQueue;
- string source;
- string dest;
- uint messages;
- uint jobs;
- bool quit;
- bool declareQueues;
-
- Args() : workQueue("txshift-control"), source("txshift-1"), dest("txshift-2"), messages(0), jobs(0),
- quit(false), declareQueues(false)
- {
- addOptions()
- ("messages", qpid::optValue(messages, "N"), "Number of messages to shift")
- ("jobs", qpid::optValue(jobs, "N"), "Number of shift jobs to request")
- ("source", qpid::optValue(source, "QUEUE NAME"), "source queue from which messages will be shifted")
- ("dest", qpid::optValue(dest, "QUEUE NAME"), "dest queue to which messages will be shifted")
- ("work-queue", qpid::optValue(workQueue, "QUEUE NAME"), "work queue from which to take instructions")
- ("add-quit", qpid::optValue(quit), "add a 'quit' instruction to the queue (after any other jobs)")
- ("declare-queues", qpid::optValue(declareQueues), "issue a declare for all queues");
- }
-};
-
-}} // namespace qpid::tests
-
-using namespace qpid::tests;
-
-//TODO: might be nice to make this capable of failover as well at some
-//point; for now its just for the setup phase.
-int main(int argc, char** argv)
-{
- Args opts;
- try {
- opts.parse(argc, argv);
- Connection connection;
- connection.open(opts.con);
- Session session = connection.newSession();
- if (opts.declareQueues) {
- session.queueDeclare(arg::queue=opts.workQueue);
- session.queueDeclare(arg::queue=opts.source);
- session.queueDeclare(arg::queue=opts.dest);
- }
- for (uint i = 0; i < opts.jobs; ++i) {
- Message job("transfer", opts.workQueue);
- job.getHeaders().setString("src", opts.source);
- job.getHeaders().setString("dest", opts.dest);
- job.getHeaders().setInt("count", opts.messages);
- async(session).messageTransfer(arg::content=job);
- }
-
- if (opts.quit) {
- async(session).messageTransfer(arg::content=Message("quit", opts.workQueue));
- }
-
- session.sync();
- session.close();
-
- return 0;
- } catch(const std::exception& e) {
- std::cout << e.what() << std::endl;
- return 1;
- }
-}
diff --git a/cpp/src/tests/txshift.cpp b/cpp/src/tests/txshift.cpp
deleted file mode 100644
index 882d3716d8..0000000000
--- a/cpp/src/tests/txshift.cpp
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- *
- * 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.
- *
- */
-
-#include <iostream>
-#include <boost/bind.hpp>
-#include <boost/ptr_container/ptr_vector.hpp>
-
-#include "TestOptions.h"
-#include "qpid/client/AsyncSession.h"
-#include "qpid/client/FailoverManager.h"
-#include "qpid/client/Message.h"
-#include "qpid/client/SubscriptionManager.h"
-#include "qpid/log/Statement.h"
-#include "qpid/sys/Thread.h"
-
-using namespace qpid::client;
-using namespace qpid::sys;
-
-namespace qpid {
-namespace tests {
-
-struct Args : public qpid::TestOptions
-{
- string workQueue;
- size_t workers;
-
- Args() : workQueue("txshift-control"), workers(1)
- {
- addOptions()
- ("workers", qpid::optValue(workers, "N"), "Number of separate worker sessions to start")
- ("work-queue", qpid::optValue(workQueue, "NAME"), "work queue from which to take instructions");
- }
-};
-
-struct Transfer : MessageListener
-{
- std::string control;
- std::string source;
- std::string destination;
- uint expected;
- uint transfered;
- SubscriptionSettings controlSettings;
- Subscription controlSubscription;
- SubscriptionSettings sourceSettings;
- Subscription sourceSubscription;
-
- Transfer(const std::string control_) : control(control_), expected(0), transfered(0) {}
-
- void subscribeToSource(SubscriptionManager manager)
- {
- sourceSettings.autoAck = 0;//will accept once at the end of the batch
- sourceSettings.flowControl = FlowControl::messageCredit(expected);
- sourceSubscription = manager.subscribe(*this, source, sourceSettings);
- QPID_LOG(info, "Subscribed to source: " << source << " expecting: " << expected);
- }
-
- void subscribeToControl(SubscriptionManager manager)
- {
- controlSettings.flowControl = FlowControl::messageCredit(1);
- controlSubscription = manager.subscribe(*this, control, controlSettings);
- QPID_LOG(info, "Subscribed to job queue");
- }
-
- void received(Message& message)
- {
- QPID_LOG(debug, "received: " << message.getData() << " for " << message.getDestination());
- if (message.getDestination() == source) {
- receivedFromSource(message);
- } else if (message.getDestination() == control) {
- receivedFromControl(message);
- } else {
- QPID_LOG(error, "Unexpected message: " << message.getData() << " to " << message.getDestination());
- }
- }
-
- void receivedFromSource(Message& message)
- {
- QPID_LOG(debug, "transfering " << (transfered+1) << " of " << expected);
- message.getDeliveryProperties().setRoutingKey(destination);
- async(sourceSubscription.getSession()).messageTransfer(arg::content=message);
- if (++transfered == expected) {
- QPID_LOG(info, "completed job: " << transfered << " messages shifted from " <<
- source << " to " << destination);
- sourceSubscription.accept(sourceSubscription.getUnaccepted());
- sourceSubscription.getSession().txCommit();
- sourceSubscription.cancel();
- //grant credit to allow broker to send us another control message
- controlSubscription.grantMessageCredit(1);
- }
- }
-
- void receivedFromControl(Message& message)
- {
- if (message.getData() == "transfer") {
- source = message.getHeaders().getAsString("src");
- destination = message.getHeaders().getAsString("dest");
- expected = message.getHeaders().getAsInt("count");
- transfered = 0;
- QPID_LOG(info, "received transfer request: " << expected << " messages to be shifted from " <<
- source << " to " << destination);
- subscribeToSource(controlSubscription.getSubscriptionManager());
- } else if (message.getData() == "quit") {
- QPID_LOG(info, "received quit request");
- controlSubscription.cancel();
- } else {
- std::cerr << "Rejecting invalid message: " << message.getData() << std::endl;
- controlSubscription.getSession().messageReject(SequenceSet(message.getId()));
- }
- }
-
-};
-
-struct Worker : FailoverManager::Command, Runnable
-{
- FailoverManager& connection;
- Transfer transfer;
- Thread runner;
-
- Worker(FailoverManager& c, const std::string& controlQueue) : connection(c), transfer(controlQueue) {}
-
- void run()
- {
- connection.execute(*this);
- }
-
- void start()
- {
- runner = Thread(this);
- }
-
- void join()
- {
- runner.join();
- }
-
- void execute(AsyncSession& session, bool isRetry)
- {
- if (isRetry) QPID_LOG(info, "Retrying...");
- session.txSelect();
- SubscriptionManager subs(session);
- transfer.subscribeToControl(subs);
- subs.run();
- session.txCommit();//commit accept of control messages
- }
-};
-
-}} // namespace qpid::tests
-
-using namespace qpid::tests;
-
-int main(int argc, char** argv)
-{
- Args opts;
- try {
- opts.parse(argc, argv);
- FailoverManager connection(opts.con);
- connection.connect();
- if (opts.workers == 1) {
- Worker worker(connection, opts.workQueue);
- worker.run();
- } else {
- boost::ptr_vector<Worker> workers;
- for (size_t i = 0; i < opts.workers; i++) {
- workers.push_back(new Worker(connection, opts.workQueue));
- }
- std::for_each(workers.begin(), workers.end(), boost::bind(&Worker::start, _1));
- std::for_each(workers.begin(), workers.end(), boost::bind(&Worker::join, _1));
- }
-
- return 0;
- } catch(const std::exception& e) {
- std::cout << e.what() << std::endl;
- return 1;
- }
-}
diff --git a/cpp/src/tests/unit_test.cpp b/cpp/src/tests/unit_test.cpp
deleted file mode 100644
index 00c61242e4..0000000000
--- a/cpp/src/tests/unit_test.cpp
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- *
- * 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.
- *
- */
-
-// Defines test_main function to link with actual unit test code.
-#define BOOST_AUTO_TEST_MAIN // Boost 1.33
-#define BOOST_TEST_MAIN
-#include "unit_test.h"
-
diff --git a/cpp/src/tests/unit_test.h b/cpp/src/tests/unit_test.h
deleted file mode 100644
index ed9623bcc0..0000000000
--- a/cpp/src/tests/unit_test.h
+++ /dev/null
@@ -1,70 +0,0 @@
-#ifndef QPIPD_TEST_UNIT_TEST_H_
-#define QPIPD_TEST_UNIT_TEST_H_
-
-/*
- *
- * 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.
- *
- */
-
-// Workaround so we can build against boost 1.33 and boost 1.34.
-// Remove when we no longer need to support 1.33.
-//
-#include <boost/version.hpp>
-#include <limits.h> // Must be inclued beofre boost/test headers.
-
-// #include the correct header file.
-//
-#if (BOOST_VERSION < 103400)
-# include <boost/test/auto_unit_test.hpp>
-#else
-# include <boost/test/unit_test.hpp>
-#endif // BOOST_VERSION
-
-// Workarounds for BOOST_AUTO_TEST_CASE|SUITE|SUITE_END
-//
-#if (BOOST_VERSION < 103300)
-
-# define QPID_AUTO_TEST_SUITE(name)
-# define QPID_AUTO_TEST_CASE(name) BOOST_AUTO_UNIT_TEST(name)
-# define QPID_AUTO_TEST_SUITE_END()
-
-#elif (BOOST_VERSION < 103400)
-// Note the trailing ';'
-# define QPID_AUTO_TEST_SUITE(name) BOOST_AUTO_TEST_SUITE(name);
-# define QPID_AUTO_TEST_SUITE_END() BOOST_AUTO_TEST_SUITE_END();
-
-#endif // Workarounds for BOOST_AUTO_TEST_CASE|SUITE|SUITE_END
-
-//
-// Default definitions for latest version of boost.
-//
-
-#ifndef QPID_AUTO_TEST_SUITE
-# define QPID_AUTO_TEST_SUITE(name) BOOST_AUTO_TEST_SUITE(name)
-#endif
-
-#ifndef QPID_AUTO_TEST_CASE
-# define QPID_AUTO_TEST_CASE(name) BOOST_AUTO_TEST_CASE(name)
-#endif
-
-#ifndef QPID_AUTO_TEST_SUITE_END
-# define QPID_AUTO_TEST_SUITE_END() BOOST_AUTO_TEST_SUITE_END()
-#endif
-
-#endif // !QPIPD_TEST_UNIT_TEST_H_
diff --git a/cpp/src/tests/verify_cluster_objects b/cpp/src/tests/verify_cluster_objects
deleted file mode 100755
index 94661cf6b9..0000000000
--- a/cpp/src/tests/verify_cluster_objects
+++ /dev/null
@@ -1,107 +0,0 @@
-#!/usr/bin/env python
-
-# 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.
-#
-
-# Verify managment objects are consistent in a cluster.
-# Arguments: url of one broker in the cluster.
-
-import qmf.console, sys, re
-
-class Session(qmf.console.Session):
- """A qmf.console.Session that caches useful values"""
-
- def __init__(self):
- qmf.console.Session.__init__(self)
- self.classes = None
-
- def all_classes(self):
- if self.classes is None:
- self.classes = [c for p in self.getPackages() for c in self.getClasses(p)]
- return self.classes
-
-class Broker:
- def __init__(self, url, qmf):
- self.url = url
- self.qmf = qmf
- self.broker = self.qmf.addBroker(url)
- self.broker._waitForStable()
- self.objects = None
- self.ignore_list = [ re.compile("org.apache.qpid.broker:system:") ]
-
- def get_objects(self):
- def ignore(name):
- for m in self.ignore_list:
- if m.match(name): return True
- if self.objects is None:
- obj_list = []
- ignored=0
- for c in self.qmf.all_classes():
- for o in self.qmf.getObjects(_key=c, _broker=self.broker):
- name=o.getObjectId().getObject()
- if not ignore(name): obj_list.append(name)
- else: ignored += 1
- self.objects = set(obj_list)
- if (len(obj_list) != len(self.objects)):
- raise Exception("Duplicates in object list for %s"%(self.url))
- print "%d objects on %s, ignored %d."%(len(self.objects), self.url, ignored)
- return self.objects
-
- def compare(self,other):
- def compare1(x,y):
- diff = x.get_objects() - y.get_objects()
- if diff:
- print "ERROR: found on %s but not %s"%(x, y)
- for o in diff: print " %s"%(o)
- return False
- return True
-
- so = compare1(self, other)
- os = compare1(other, self)
- return so and os
-
- def __str__(self): return self.url
-
- def get_cluster(self):
- """Given one Broker, return list of all brokers in its cluster"""
- clusters = self.qmf.getObjects(_class="cluster")
- if not clusters: raise ("%s is not a cluster member"%(self.url))
- def first_address(url):
- """Python doesn't understand the brokers URL syntax. Extract a simple addres"""
- return re.compile("amqp:tcp:([^,]*)").match(url).group(1)
- return [Broker(first_address(url), self.qmf)
- for url in clusters[0].members.split(";")]
-
- def __del__(self): self.qmf.delBroker(self.broker)
-
-def main(argv=None):
- if argv is None: argv = sys.argv
- qmf = Session()
- brokers = Broker(argv[1], qmf).get_cluster()
- print "%d members in cluster."%(len(brokers))
- base = brokers.pop(0)
- try:
- for b in brokers:
- if not base.compare(b): return 1
- print "No differences."
- return 0
- finally:
- del base
- del brokers
-
-if __name__ == "__main__": sys.exit(main())
diff --git a/cpp/src/tests/vg_check b/cpp/src/tests/vg_check
deleted file mode 100644
index 462f4cb5e4..0000000000
--- a/cpp/src/tests/vg_check
+++ /dev/null
@@ -1,43 +0,0 @@
-#
-# 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.
-#
-
-# Check for valgrind errors. Sourced by test scripts.
-
-vg_failed() {
- echo "Valgrind error log in $VG_LOG." 1>&2
- cat $VG_LOG 1>&2
- echo $1 1>&2
- exit 1
-}
-
-vg_check()
-{
- test -z "$1" || VG_LOG=$1
- test -f $VG_LOG || vg_failed Valgrind log file $VG_LOG missing.
- # Ensure there is an ERROR SUMMARY line.
- grep -E '^==[0-9]+== ERROR SUMMARY:' $VG_LOG > /dev/null || \
- vg_failed "No valgrind ERROR SUMMARY line in $VG_LOG."
- # Ensure that the number of errors is 0.
- grep -E '^==[0-9]+== ERROR SUMMARY: [^0]' $VG_LOG > /dev/null && \
- vg_failed "Valgrind reported errors in $VG_LOG; see above."
- # Check for leaks.
- grep -E '^==[0-9]+== +.* lost: [^0]' $VG_LOG && \
- vg_failed "Found memory leaks (see log file, $VG_LOG); see above."
- true
-}
diff --git a/cpp/src/tests/windows/DisableWin32ErrorWindows.cpp b/cpp/src/tests/windows/DisableWin32ErrorWindows.cpp
deleted file mode 100644
index 024f20b147..0000000000
--- a/cpp/src/tests/windows/DisableWin32ErrorWindows.cpp
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- *
- * 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.
- *
- */
-
-// This file intends to prevent Windows from throwing up error boxes and
-// offering to debug when serious errors happen. The errors are displayed
-// on stderr instead. The purpose of this is to allow the tests to proceed
-// scripted and catch the text for logging. If this behavior is desired,
-// include this file with the executable being built. If the default
-// behaviors are desired, don't include this file in the build.
-
-#if defined(_MSC_VER)
-#include <crtdbg.h>
-#endif
-#include <windows.h>
-#include <iostream>
-
-namespace {
-
-// Instead of popping up a window for exceptions, just print something out
-LONG _stdcall UnhandledExceptionFilter (PEXCEPTION_POINTERS pExceptionInfo)
-{
- DWORD dwExceptionCode = pExceptionInfo->ExceptionRecord->ExceptionCode;
-
- if (dwExceptionCode == EXCEPTION_ACCESS_VIOLATION)
- std::cerr << "\nERROR: ACCESS VIOLATION\n" << std::endl;
- else
- std::cerr << "\nERROR: UNHANDLED EXCEPTION\n" << std::endl;
-
- return EXCEPTION_EXECUTE_HANDLER;
-}
-
-struct redirect_errors_to_stderr {
- redirect_errors_to_stderr ();
-};
-
-static redirect_errors_to_stderr block;
-
-redirect_errors_to_stderr::redirect_errors_to_stderr()
-{
-#if defined(_MSC_VER)
- _CrtSetReportMode (_CRT_WARN, _CRTDBG_MODE_FILE);
- _CrtSetReportFile (_CRT_WARN, _CRTDBG_FILE_STDERR);
- _CrtSetReportMode (_CRT_ERROR, _CRTDBG_MODE_FILE);
- _CrtSetReportFile (_CRT_ERROR, _CRTDBG_FILE_STDERR);
- _CrtSetReportMode (_CRT_ASSERT, _CRTDBG_MODE_FILE);
- _CrtSetReportFile (_CRT_ASSERT, _CRTDBG_FILE_STDERR);
-#endif
-
- // Prevent the system from displaying the critical-error-handler
- // and can't-open-file message boxes.
- SetErrorMode(SEM_FAILCRITICALERRORS);
- SetErrorMode(SEM_NOOPENFILEERRORBOX);
-
- // And this will catch all unhandled exceptions.
- SetUnhandledExceptionFilter (&UnhandledExceptionFilter);
-}
-
-} // namespace