diff options
| author | Robert Gemmell <robbie@apache.org> | 2016-07-05 21:55:35 +0000 |
|---|---|---|
| committer | Robert Gemmell <robbie@apache.org> | 2016-07-05 21:55:35 +0000 |
| commit | f160cb6566c17945f7ebc4f3a752b2cc6a051685 (patch) | |
| tree | 809f04fc1967c22e5abc52de07602555bed0e920 /qpid/cpp/src/tests | |
| parent | ebb276cca41582b73223b55eff9f2d4386f4f746 (diff) | |
| download | qpid-python-f160cb6566c17945f7ebc4f3a752b2cc6a051685.tar.gz | |
QPID-7207: remove cpp and python subdirs from svn trunk, they have migrated to their own git repositories
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1751566 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/cpp/src/tests')
273 files changed, 0 insertions, 56228 deletions
diff --git a/qpid/cpp/src/tests/.valgrind.supp b/qpid/cpp/src/tests/.valgrind.supp deleted file mode 100644 index d881c73743..0000000000 --- a/qpid/cpp/src/tests/.valgrind.supp +++ /dev/null @@ -1,242 +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 -} - -{ - 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 -} - -{ - 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) -} - -{ - Leak reported in acl_tests - Memcheck:Cond - fun:_ZN4qpid3acl9AclReader16loadDecisionData* - fun:_ZN4qpid3acl9AclReader4read* - fun:_ZN4qpid3acl3Acl11readAclFile* - ... -} - -{ - Leak reported in acl_tests and queue_redirect_tests - Memcheck:Leak - fun:_Znwm - ... - fun:_ZN4qpid6broker14QueueFlowLimit11createLimit* - ... -} - -{ - Leak reported in python_tests - Memcheck:Leak - fun:_Znwm - ... - fun:_M_get_node - fun:_M_create_node - ... -} - -{ - Leak reported in python_tests - Memcheck:Leak - fun:_Znwm - fun:_ZN4qpid6broker5Queue18scheduleAutoDeleteEb - ... -} - -{ - Leak reported in linearstore_python_tests - Memcheck:Leak - fun:_Znwm - fun:_ZN4qpid11linearstore7journal20EmptyFilePoolManager15insertPartition* - fun:_ZN4qpid11linearstore7journal20EmptyFilePoolManager17findEfpPartitionsEv - ... -} - -{ - Leak reported in acl_tests and python_tests - Memcheck:Leak - fun:_Znwm - ... - fun:_ZN4qpid6broker12QueueFactory6create* - fun:_ZN4qpid6broker13QueueRegistry7declare* - fun:_ZN4qpid6broker6Broker11createQueue* - ... -} - -{ - Leak reported in acl_tests - Memcheck:Leak - fun:_Znwm - fun:_ZNSs4_Rep9_S_createEmmRKSaIcE - ... -} diff --git a/qpid/cpp/src/tests/AccumulatedAckTest.cpp b/qpid/cpp/src/tests/AccumulatedAckTest.cpp deleted file mode 100644 index c736a519d2..0000000000 --- a/qpid/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/qpid/cpp/src/tests/Acl.cpp b/qpid/cpp/src/tests/Acl.cpp deleted file mode 100644 index 9c3de0de62..0000000000 --- a/qpid/cpp/src/tests/Acl.cpp +++ /dev/null @@ -1,166 +0,0 @@ -/* - * - * Copyright (c) 2014 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/acl/AclLexer.h" -#include <boost/assign.hpp> - -using namespace std; -using namespace qpid; -using namespace qpid::acl; -using namespace boost::assign; - -namespace qpid { -namespace tests { - -QPID_AUTO_TEST_SUITE(AclTestSuite) - -#define OBJ_ENUMS(e, s) \ - BOOST_CHECK_EQUAL(AclHelper::getObjectTypeStr((e)),(s)); \ - BOOST_CHECK_EQUAL(AclHelper::getObjectType((s)),(e)) - -QPID_AUTO_TEST_CASE(TestLexerObjectEnums) { - BOOST_CHECK_EQUAL(OBJECTSIZE, 7); - OBJ_ENUMS(OBJ_QUEUE, "queue"); - OBJ_ENUMS(OBJ_EXCHANGE, "exchange"); - OBJ_ENUMS(OBJ_BROKER, "broker"); - OBJ_ENUMS(OBJ_LINK, "link"); - OBJ_ENUMS(OBJ_METHOD, "method"); - OBJ_ENUMS(OBJ_QUERY, "query"); - OBJ_ENUMS(OBJ_CONNECTION, "connection"); - int maxLen = 0; - for (int i=0; i<acl::OBJECTSIZE; i++) { - int thisLen = AclHelper::getObjectTypeStr( ObjectType(i) ).length(); - if (thisLen > maxLen) - maxLen = thisLen; - } - BOOST_CHECK_EQUAL(maxLen, acl::OBJECTTYPE_STR_WIDTH); -} - -#define ACT_ENUMS(e, s) \ - BOOST_CHECK_EQUAL(AclHelper::getActionStr((e)),(s)); \ - BOOST_CHECK_EQUAL(AclHelper::getAction((s)),(e)) - -QPID_AUTO_TEST_CASE(TestLexerActionEnums) { - BOOST_CHECK_EQUAL(ACTIONSIZE, 12); - ACT_ENUMS(ACT_CONSUME, "consume"); - ACT_ENUMS(ACT_PUBLISH, "publish"); - ACT_ENUMS(ACT_CREATE, "create"); - ACT_ENUMS(ACT_ACCESS, "access"); - ACT_ENUMS(ACT_BIND, "bind"); - ACT_ENUMS(ACT_UNBIND, "unbind"); - ACT_ENUMS(ACT_DELETE, "delete"); - ACT_ENUMS(ACT_PURGE, "purge"); - ACT_ENUMS(ACT_UPDATE, "update"); - ACT_ENUMS(ACT_MOVE, "move"); - ACT_ENUMS(ACT_REDIRECT, "redirect"); - ACT_ENUMS(ACT_REROUTE, "reroute"); - int maxLen = 0; - for (int i=0; i<acl::ACTIONSIZE; i++) { - int thisLen = AclHelper::getActionStr( Action(i) ).length(); - if (thisLen > maxLen) - maxLen = thisLen; - } - BOOST_CHECK_EQUAL(maxLen, acl::ACTION_STR_WIDTH); -} - -#define PROP_ENUMS(e, s) \ - BOOST_CHECK_EQUAL(AclHelper::getPropertyStr((e)),(s)); \ - BOOST_CHECK_EQUAL(AclHelper::getProperty((s)),(e)) - -QPID_AUTO_TEST_CASE(TestLexerPropertyEnums) { - BOOST_CHECK_EQUAL(PROPERTYSIZE, 21); - PROP_ENUMS(PROP_NAME, "name"); - PROP_ENUMS(PROP_DURABLE, "durable"); - PROP_ENUMS(PROP_OWNER, "owner"); - PROP_ENUMS(PROP_ROUTINGKEY, "routingkey"); - PROP_ENUMS(PROP_AUTODELETE, "autodelete"); - PROP_ENUMS(PROP_EXCLUSIVE, "exclusive"); - PROP_ENUMS(PROP_TYPE, "type"); - PROP_ENUMS(PROP_ALTERNATE, "alternate"); - PROP_ENUMS(PROP_QUEUENAME, "queuename"); - PROP_ENUMS(PROP_EXCHANGENAME, "exchangename"); - PROP_ENUMS(PROP_SCHEMAPACKAGE, "schemapackage"); - PROP_ENUMS(PROP_SCHEMACLASS, "schemaclass"); - PROP_ENUMS(PROP_POLICYTYPE, "policytype"); - PROP_ENUMS(PROP_PAGING, "paging"); - PROP_ENUMS(PROP_HOST, "host"); - PROP_ENUMS(PROP_MAXPAGES, "maxpages"); - PROP_ENUMS(PROP_MAXPAGEFACTOR, "maxpagefactor"); - PROP_ENUMS(PROP_MAXQUEUESIZE, "maxqueuesize"); - PROP_ENUMS(PROP_MAXQUEUECOUNT, "maxqueuecount"); - PROP_ENUMS(PROP_MAXFILESIZE, "maxfilesize"); - PROP_ENUMS(PROP_MAXFILECOUNT, "maxfilecount"); - -} - -#define SPECPROP_ENUMS(e, s) \ - BOOST_CHECK_EQUAL(AclHelper::getPropertyStr((e)),(s)); \ - BOOST_CHECK_EQUAL(AclHelper::getSpecProperty((s)),(e)) - -QPID_AUTO_TEST_CASE(TestLexerSpecPropertyEnums) { - BOOST_CHECK_EQUAL(SPECPROPSIZE, 27); - SPECPROP_ENUMS(SPECPROP_NAME, "name"); - SPECPROP_ENUMS(SPECPROP_DURABLE, "durable"); - SPECPROP_ENUMS(SPECPROP_OWNER, "owner"); - SPECPROP_ENUMS(SPECPROP_ROUTINGKEY, "routingkey"); - SPECPROP_ENUMS(SPECPROP_AUTODELETE, "autodelete"); - SPECPROP_ENUMS(SPECPROP_EXCLUSIVE, "exclusive"); - SPECPROP_ENUMS(SPECPROP_TYPE, "type"); - SPECPROP_ENUMS(SPECPROP_ALTERNATE, "alternate"); - SPECPROP_ENUMS(SPECPROP_QUEUENAME, "queuename"); - SPECPROP_ENUMS(SPECPROP_EXCHANGENAME, "exchangename"); - SPECPROP_ENUMS(SPECPROP_SCHEMAPACKAGE, "schemapackage"); - SPECPROP_ENUMS(SPECPROP_SCHEMACLASS, "schemaclass"); - SPECPROP_ENUMS(SPECPROP_POLICYTYPE, "policytype"); - SPECPROP_ENUMS(SPECPROP_PAGING, "paging"); - SPECPROP_ENUMS(SPECPROP_HOST, "host"); - SPECPROP_ENUMS(SPECPROP_MAXQUEUESIZELOWERLIMIT, "queuemaxsizelowerlimit"); - SPECPROP_ENUMS(SPECPROP_MAXQUEUESIZEUPPERLIMIT, "queuemaxsizeupperlimit"); - SPECPROP_ENUMS(SPECPROP_MAXQUEUECOUNTLOWERLIMIT, "queuemaxcountlowerlimit"); - SPECPROP_ENUMS(SPECPROP_MAXQUEUECOUNTUPPERLIMIT, "queuemaxcountupperlimit"); - SPECPROP_ENUMS(SPECPROP_MAXFILESIZELOWERLIMIT, "filemaxsizelowerlimit"); - SPECPROP_ENUMS(SPECPROP_MAXFILESIZEUPPERLIMIT, "filemaxsizeupperlimit"); - SPECPROP_ENUMS(SPECPROP_MAXFILECOUNTLOWERLIMIT, "filemaxcountlowerlimit"); - SPECPROP_ENUMS(SPECPROP_MAXFILECOUNTUPPERLIMIT, "filemaxcountupperlimit"); - SPECPROP_ENUMS(SPECPROP_MAXPAGESLOWERLIMIT, "pageslowerlimit"); - SPECPROP_ENUMS(SPECPROP_MAXPAGESUPPERLIMIT, "pagesupperlimit"); - SPECPROP_ENUMS(SPECPROP_MAXPAGEFACTORLOWERLIMIT, "pagefactorlowerlimit"); - SPECPROP_ENUMS(SPECPROP_MAXPAGEFACTORUPPERLIMIT, "pagefactorupperlimit"); - - BOOST_CHECK_EQUAL(AclHelper::getSpecProperty("maxqueuesize"), SPECPROP_MAXQUEUESIZEUPPERLIMIT); - BOOST_CHECK_EQUAL(AclHelper::getSpecProperty("maxqueuecount"), SPECPROP_MAXQUEUECOUNTUPPERLIMIT); -} - -#define RESULT_ENUMS(e, s) \ - BOOST_CHECK_EQUAL(AclHelper::getAclResultStr((e)),(s)); \ - BOOST_CHECK_EQUAL(AclHelper::getAclResult((s)),(e)) - -QPID_AUTO_TEST_CASE(TestLexerResultEnums) { - BOOST_CHECK_EQUAL(RESULTSIZE, 4); - RESULT_ENUMS(ALLOW, "allow"); - RESULT_ENUMS(ALLOWLOG, "allow-log"); - RESULT_ENUMS(DENY, "deny"); - RESULT_ENUMS(DENYLOG, "deny-log"); -} - -QPID_AUTO_TEST_SUITE_END() - -}} // namespace qpid::tests diff --git a/qpid/cpp/src/tests/AclHost.cpp b/qpid/cpp/src/tests/AclHost.cpp deleted file mode 100644 index 7d60c5a63d..0000000000 --- a/qpid/cpp/src/tests/AclHost.cpp +++ /dev/null @@ -1,166 +0,0 @@ -/* - * - * Copyright (c) 2014 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/AclHost.h" -#include "qpid/sys/SocketAddress.h" -#include <boost/assign.hpp> - -using namespace std; -using namespace qpid; -using namespace boost::assign; - -namespace qpid { -namespace tests { - -QPID_AUTO_TEST_SUITE(AclHostTestSuite) - -#define ACLURL_CHECK_INVALID(STR) BOOST_CHECK_THROW(AclHost(STR), AclHost::Invalid) - -#define SENSE_IP_VERSIONS() \ - bool haveIPv4(true); \ - try { \ - sys::SocketAddress sa("1.1.1.1", ""); \ - sa.firstAddress(); \ -} catch (qpid::Exception) { \ - haveIPv4 = false; \ -} \ - bool haveIPv6(true); \ - try { \ - sys::SocketAddress sa("::1", ""); \ - sa.firstAddress(); \ -} catch (qpid::Exception) { \ - haveIPv6 = false; \ -} \ -(void) haveIPv4; \ -(void) haveIPv6; - -QPID_AUTO_TEST_CASE(TestParseTcpIPv4) { - SENSE_IP_VERSIONS(); - if (haveIPv4) { - BOOST_CHECK_EQUAL(AclHost("1.1.1.1").str(), "(1.1.1.1,1.1.1.1)"); - BOOST_CHECK_EQUAL(AclHost("1.1.1.1,2.2.2.2").str(), "(1.1.1.1,2.2.2.2)"); - } -} - -QPID_AUTO_TEST_CASE(TestParseTcpIPv6) { - SENSE_IP_VERSIONS(); - if (haveIPv6) { - BOOST_CHECK_EQUAL(AclHost("[::1]").str(), "([::1],[::1])"); - BOOST_CHECK_EQUAL(AclHost("[::1],::5").str(), "([::1],[::5])"); - } -} - -QPID_AUTO_TEST_CASE(TestParseAll) { - SENSE_IP_VERSIONS(); - if (haveIPv4 || haveIPv6) { - BOOST_CHECK_EQUAL(AclHost("").str(), "(all)"); - } -} - -QPID_AUTO_TEST_CASE(TestInvalidMixedIpFamilies) { - SENSE_IP_VERSIONS(); - if (haveIPv4 && haveIPv6) { - ACLURL_CHECK_INVALID("1.1.1.1,[::1]"); - ACLURL_CHECK_INVALID("[::1],1.1.1.1"); - } -} - -QPID_AUTO_TEST_CASE(TestMalformedIPv4) { - SENSE_IP_VERSIONS(); - if (haveIPv4) { - ACLURL_CHECK_INVALID("1.1.1.1.1"); - ACLURL_CHECK_INVALID("1.1.1.777"); - ACLURL_CHECK_INVALID("1.1.1.1abcd"); - ACLURL_CHECK_INVALID("1.1.1.*"); - } -} - -QPID_AUTO_TEST_CASE(TestRangeWithInvertedSizeOrder) { - SENSE_IP_VERSIONS(); - if (haveIPv4) { - ACLURL_CHECK_INVALID("1.1.1.100,1.1.1.1"); - } - if (haveIPv6) { - ACLURL_CHECK_INVALID("[FF::1],[::1]"); - } -} - -QPID_AUTO_TEST_CASE(TestSingleHostResolvesMultipleAddresses) { - SENSE_IP_VERSIONS(); - AclHost XX("localhost"); -} - -QPID_AUTO_TEST_CASE(TestMatchSingleAddresses) { - SENSE_IP_VERSIONS(); - if (haveIPv4) { - AclHost host1("1.1.1.1"); - BOOST_CHECK(host1.match("1.1.1.1") == true); - BOOST_CHECK(host1.match("1.2.1.1") == false); - } - if (haveIPv6) { - AclHost host2("FF::1"); - BOOST_CHECK(host2.match("00FF:0000::1") == true); - } -} - -QPID_AUTO_TEST_CASE(TestMatchIPv4Range) { - SENSE_IP_VERSIONS(); - if (haveIPv4) { - AclHost host1("192.168.0.0,192.168.255.255"); - BOOST_CHECK(host1.match("128.1.1.1") == false); - BOOST_CHECK(host1.match("192.167.255.255") == false); - BOOST_CHECK(host1.match("192.168.0.0") == true); - BOOST_CHECK(host1.match("192.168.0.1") == true); - BOOST_CHECK(host1.match("192.168.1.0") == true); - BOOST_CHECK(host1.match("192.168.255.254") == true); - BOOST_CHECK(host1.match("192.168.255.255") == true); - BOOST_CHECK(host1.match("192.169.0.0") == false); - if (haveIPv6) { - BOOST_CHECK(host1.match("::1") == false); - } - } -} - -QPID_AUTO_TEST_CASE(TestMatchIPv6Range) { - SENSE_IP_VERSIONS(); - if (haveIPv6) { - AclHost host1("::10,::1:0"); - BOOST_CHECK(host1.match("::1") == false); - BOOST_CHECK(host1.match("::f") == false); - BOOST_CHECK(host1.match("::10") == true); - BOOST_CHECK(host1.match("::11") == true); - BOOST_CHECK(host1.match("::ffff") == true); - BOOST_CHECK(host1.match("::1:0") == true); - BOOST_CHECK(host1.match("::1:1") == false); - if (haveIPv4) { - BOOST_CHECK(host1.match("192.169.0.0") == false); - } - AclHost host2("[fc00::],[fc00::ff]"); - BOOST_CHECK(host2.match("fc00::") == true); - BOOST_CHECK(host2.match("fc00::1") == true); - BOOST_CHECK(host2.match("fc00::ff") == true); - BOOST_CHECK(host2.match("fc00::100") == false); - - } -} -QPID_AUTO_TEST_SUITE_END() - -}} // namespace qpid::tests diff --git a/qpid/cpp/src/tests/Address.cpp b/qpid/cpp/src/tests/Address.cpp deleted file mode 100644 index 0fd3585958..0000000000 --- a/qpid/cpp/src/tests/Address.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 <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_CASE(testParseOptionsWithEmptyStringAsValue) -{ - Address address("my-topic; {a:'', x:101}"); - BOOST_CHECK_EQUAL(std::string("my-topic"), address.getName()); - Variant a = address.getOptions()["a"]; - BOOST_CHECK_EQUAL(VAR_STRING, a.getType()); - std::string aVal = a; - BOOST_CHECK(aVal.size() == 0); - BOOST_CHECK_EQUAL((uint16_t) 101, address.getOptions()["x"].asInt64()); -} - -QPID_AUTO_TEST_SUITE_END() - -}} diff --git a/qpid/cpp/src/tests/Array.cpp b/qpid/cpp/src/tests/Array.cpp deleted file mode 100644 index 8ce7615162..0000000000 --- a/qpid/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; - std::transform(b.begin(), b.end(), std::back_inserter(data2), Array::get<std::string, Array::ValuePtr>); - //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; - std::transform(b.begin(), b.end(), std::back_inserter(data2), Array::get<std::string, Array::ValuePtr>); - //BOOST_CHECK_EQUAL(data, data2); - BOOST_CHECK(data == data2); -} - -QPID_AUTO_TEST_SUITE_END() - -}} // namespace qpid::tests diff --git a/qpid/cpp/src/tests/AsyncCompletion.cpp b/qpid/cpp/src/tests/AsyncCompletion.cpp deleted file mode 100644 index dc43f10156..0000000000 --- a/qpid/cpp/src/tests/AsyncCompletion.cpp +++ /dev/null @@ -1,153 +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) - -/** - * Send a sync after a bunch of incomplete messages, verify the sync completes - * only when all the messages are complete. - */ -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. -} - -/** - * Send a sync after all messages are complete, verify it completes immediately. - */ -QPID_AUTO_TEST_CASE(testSyncAfterComplete) { - 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); - // Transfer and complete all the messages - for (int i = 0; i < count; ++i) { - Message msg(boost::lexical_cast<string>(i), "q"); - msg.getDeliveryProperties().setDeliveryMode(PERSISTENT); - Completion transfer = s.messageTransfer(arg::content=msg, arg::sync=true); - intrusive_ptr<PersistableMessage> enqueued = store->enqueued.pop(TIME_SEC); - enqueued->enqueueComplete(); - transfer.wait(); - } - // Send a sync, make sure it completes immediately - Completion sync = s.executionSync(arg::sync=true); - 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/qpid/cpp/src/tests/AtomicValue.cpp b/qpid/cpp/src/tests/AtomicValue.cpp deleted file mode 100644 index d855d993a7..0000000000 --- a/qpid/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/qpid/cpp/src/tests/Blob.cpp b/qpid/cpp/src/tests/Blob.cpp deleted file mode 100644 index 9878d92fe4..0000000000 --- a/qpid/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/qpid/cpp/src/tests/BrokerFixture.h b/qpid/cpp/src/tests/BrokerFixture.h deleted file mode 100644 index 474b9d747f..0000000000 --- a/qpid/cpp/src/tests/BrokerFixture.h +++ /dev/null @@ -1,168 +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 "qpid/broker/Broker.h" -#include "qpid/broker/BrokerOptions.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; - typedef qpid::broker::BrokerOptions BrokerOptions; - typedef std::vector<std::string> Args; - - BrokerPtr broker; - BrokerOptions opts; - uint16_t port; - qpid::sys::Thread brokerThread; - - BrokerFixture(const Args& args=Args(), const BrokerOptions& opts0=BrokerOptions(), - bool isExternalPort_=false, uint16_t externalPort_=0) : - opts(opts0) - { - init(args, isExternalPort_, externalPort_); - } - - BrokerFixture(const BrokerOptions& opts0, - bool isExternalPort_=false, uint16_t externalPort_=0) : - opts(opts0) - { - init(Args(), isExternalPort_, externalPort_); - } - - void shutdownBroker() { - if (broker) { - broker->shutdown(); - brokerThread.join(); - broker = BrokerPtr(); - } - } - - ~BrokerFixture() { shutdownBroker(); } - - /** Open a connection to the broker. */ - void open(qpid::client::Connection& c) { - c.open("localhost", getPort()); - } - - uint16_t getPort() { return port; } - - private: - void init(const Args& args, bool isExternalPort=false, uint16_t externalPort=0) - { - // 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.deselectors.clear(); - logOpts.selectors.push_back("error+"); - qpid::log::Logger::instance().configure(logOpts); - } - // Default options, may be over-ridden when we parse args. - opts.port=0; - opts.listenInterfaces.push_back("127.0.0.1"); - opts.workerThreads=1; - opts.dataDir=""; - opts.auth=false; - - // Argument parsing - if (args.size() > 0) { - std::vector<const char*> argv(args.size()); - for (size_t i = 0; i<args.size(); ++i) - argv[i] = args[i].c_str(); - Plugin::addOptions(opts); - opts.parse(argv.size(), &argv[0]); - } - 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(); - if (isExternalPort) port = externalPort; - else port = broker->getPort(qpid::broker::Broker::TCP_TRANSPORT); - brokerThread = qpid::sys::Thread(*broker); - }; -}; - -/** 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(); } -}; - -/** 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(const BrokerOptions& opts=BrokerOptions()) : - BrokerFixture(BrokerFixture::Args(), opts), - ClientT<ConnectionType,SessionType>(getPort()) - {} - -}; - -typedef SessionFixtureT<LocalConnection> SessionFixture; - -}} // namespace qpid::tests - -#endif /*!TESTS_BROKERFIXTURE_H*/ diff --git a/qpid/cpp/src/tests/BrokerMgmtAgent.cpp b/qpid/cpp/src/tests/BrokerMgmtAgent.cpp deleted file mode 100644 index bad7e768a6..0000000000 --- a/qpid/cpp/src/tests/BrokerMgmtAgent.cpp +++ /dev/null @@ -1,387 +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/management/ManagementAgent.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.qmf1Support=!qmfV2; - 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::shared_ptr mgmtObj; - const std::string key; - public: - TestManageable(management::ManagementAgent *agent, std::string _key) - : key(_key) - { - _qmf::TestObject::shared_ptr 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.reset(); } - management::ManagementObject::shared_ptr 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; -} - -// 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; -} - -QPID_AUTO_TEST_SUITE_END() -} -} - - diff --git a/qpid/cpp/src/tests/BrokerMgmtAgent.xml b/qpid/cpp/src/tests/BrokerMgmtAgent.xml deleted file mode 100644 index 202b8debf3..0000000000 --- a/qpid/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/qpid/cpp/src/tests/BrokerOptions.cpp b/qpid/cpp/src/tests/BrokerOptions.cpp deleted file mode 100644 index b36d96916a..0000000000 --- a/qpid/cpp/src/tests/BrokerOptions.cpp +++ /dev/null @@ -1,79 +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. - * - */ - -/** Unit tests for various broker configuration options **/ - -#include "unit_test.h" -#include "test_tools.h" -#include "MessagingFixture.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" - -namespace qpid { -namespace tests { - -QPID_AUTO_TEST_SUITE(BrokerOptionsTestSuite) - -using namespace qpid::broker; -using namespace qpid::messaging; -using namespace qpid::types; -using namespace qpid; - -QPID_AUTO_TEST_CASE(testDisabledTimestamp) -{ - // by default, there should be no timestamp added by the broker - MessagingFixture fix; - - Sender sender = fix.session.createSender("test-q; {create:always, delete:sender}"); - messaging::Message msg("hi"); - sender.send(msg); - - Receiver receiver = fix.session.createReceiver("test-q"); - messaging::Message in; - BOOST_CHECK(receiver.fetch(in, Duration::IMMEDIATE)); - Variant::Map props = in.getProperties(); - BOOST_CHECK(props.find("x-amqp-0-10.timestamp") == props.end()); -} - -QPID_AUTO_TEST_CASE(testEnabledTimestamp) -{ - // when enabled, the 0.10 timestamp is added by the broker - Broker::Options opts; - opts.timestampRcvMsgs = true; - MessagingFixture fix(opts, true); - - Sender sender = fix.session.createSender("test-q; {create:always, delete:sender}"); - messaging::Message msg("one"); - sender.send(msg); - - Receiver receiver = fix.session.createReceiver("test-q"); - messaging::Message in; - BOOST_CHECK(receiver.fetch(in, Duration::IMMEDIATE)); - Variant::Map props = in.getProperties(); - BOOST_CHECK(props.find("x-amqp-0-10.timestamp") != props.end()); - BOOST_CHECK(props["x-amqp-0-10.timestamp"]); -} - -QPID_AUTO_TEST_SUITE_END() - -}} diff --git a/qpid/cpp/src/tests/CMakeLists.txt b/qpid/cpp/src/tests/CMakeLists.txt deleted file mode 100644 index d69d2874c4..0000000000 --- a/qpid/cpp/src/tests/CMakeLists.txt +++ /dev/null @@ -1,323 +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. -# - -# Make sure that everything get built before the tests -# Need to create a var with all the necessary top level targets - -# If we're linking Boost for DLLs, turn that on for the unit test too. -if (QPID_LINK_BOOST_DYNAMIC) - add_definitions(-DBOOST_TEST_DYN_LINK) -endif (QPID_LINK_BOOST_DYNAMIC) - -include_directories(${CMAKE_CURRENT_SOURCE_DIR}) - -# 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) - -# If we're using GCC allow variadic macros (even though they're c99 not c++01) -if (CMAKE_COMPILER_IS_GNUCXX) - add_definitions(-Wno-variadic-macros) -endif (CMAKE_COMPILER_IS_GNUCXX) - -# 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) - -# Some generally useful utilities that just happen to be built in the test area -add_executable(qpid-receive qpid-receive.cpp Statistics.cpp ${platform_test_additions}) -target_link_libraries(qpid-receive qpidmessaging qpidtypes qpidcommon) - -add_executable(qpid-send qpid-send.cpp Statistics.cpp ${platform_test_additions}) -target_link_libraries(qpid-send qpidmessaging qpidtypes qpidcommon) - -install(TARGETS qpid-receive qpid-send RUNTIME DESTINATION ${QPID_INSTALL_BINDIR}) - -add_executable(qpid-perftest qpid-perftest.cpp ${platform_test_additions}) -target_link_libraries(qpid-perftest qpidclient qpidcommon ${Boost_PROGRAM_OPTIONS_LIBRARY}) - -add_executable(qpid-latency-test qpid-latency-test.cpp ${platform_test_additions}) -target_link_libraries(qpid-latency-test qpidclient qpidcommon) - -add_executable(qpid-client-test qpid-client-test.cpp ${platform_test_additions}) -target_link_libraries(qpid-client-test qpidclient qpidcommon) - -add_executable(qpid-ping qpid-ping.cpp ${platform_test_additions}) -target_link_libraries(qpid-ping qpidmessaging qpidtypes qpidcommon) - -add_executable(qpid-topic-listener qpid-topic-listener.cpp ${platform_test_additions}) -target_link_libraries(qpid-topic-listener qpidclient qpidcommon) - -add_executable(qpid-topic-publisher qpid-topic-publisher.cpp ${platform_test_additions}) -target_link_libraries(qpid-topic-publisher qpidclient qpidcommon) - -add_executable(receiver receiver.cpp ${platform_test_additions}) -target_link_libraries(receiver qpidclient qpidcommon) - -# This is bizarre - using both messaging and client libraries -add_executable(sender sender.cpp Statistics.cpp ${platform_test_additions}) -target_link_libraries(sender qpidmessaging qpidtypes qpidclient qpidcommon) - -add_executable(qpid-txtest qpid-txtest.cpp ${platform_test_additions}) -target_link_libraries(qpid-txtest qpidclient qpidcommon qpidtypes) - -add_executable(qpid-txtest2 qpid-txtest2.cpp ${platform_test_additions}) -target_link_libraries(qpid-txtest2 qpidmessaging qpidtypes qpidcommon) - -install(TARGETS - qpid-perftest qpid-latency-test qpid-client-test - qpid-ping - qpid-topic-listener qpid-topic-publisher receiver sender - qpid-txtest qpid-txtest2 - RUNTIME DESTINATION ${QPID_INSTALL_TESTDIR}) - -# Only build test code if testing is turned on -if (BUILD_TESTING) - -if (CMAKE_SYSTEM_NAME STREQUAL Windows) - # Windows - - set(ENV{OUTDIR} ${EXECUTABLE_OUTPUT_PATH}) - - configure_file(${CMAKE_CURRENT_SOURCE_DIR}/env.ps1.in - ${CMAKE_CURRENT_BINARY_DIR}/env.ps1 @ONLY) -else (CMAKE_SYSTEM_NAME STREQUAL Windows) - # Posix - - configure_file(${CMAKE_CURRENT_SOURCE_DIR}/env.sh.in - ${CMAKE_CURRENT_BINARY_DIR}/env.sh @ONLY) -endif (CMAKE_SYSTEM_NAME STREQUAL Windows) - -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/check_dependencies.py.in - ${CMAKE_CURRENT_BINARY_DIR}/check_dependencies.py @ONLY) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/env.py.in - ${CMAKE_CURRENT_BINARY_DIR}/env.py @ONLY) - -file(COPY . - DESTINATION . - PATTERN "*.cmake" EXCLUDE - PATTERN "*.in" EXCLUDE - PATTERN "*.c" EXCLUDE - PATTERN "*.h" EXCLUDE - PATTERN "*.cpp" EXCLUDE) - -if (BUILD_TESTING_UNITTESTS) - -# 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. - -# Like this to work with cmake 2.4 on Unix -set(qpid_test_boost_libs - ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY} ${Boost_SYSTEM_LIBRARY}) - -set(all_unit_tests - AccumulatedAckTest - Acl - AclHost - Array - AsyncCompletion - AtomicValue - ClientMessage - ClientMessageTest - ClientSessionTest - DeliveryRecordTest - DtxWorkRecordTest - exception_test - ExchangeTest - FieldTable - FieldValue - FrameDecoder - FramingTest - HeadersExchangeTest - HeaderTest - InlineAllocator - InlineVector - logging - ManagementTest - MessageReplayTracker - MessageTest - MessagingLogger - MessagingSessionTests - PollableCondition - ProxyTest - QueueDepth - QueueFlowLimitTest - QueueOptionsTest - QueuePolicyTest - QueueRegistryTest - QueueTest - RangeSet - RefCounted - RetryList - Selector - SequenceNumberTest - SequenceSet - SessionState - Shlib - StringUtils - SystemInfo - TimerTest - TopicExchangeTest - TxBufferTest - TransactionObserverTest - Url - Uuid - Variant - ${xml_tests}) - -set(unit_tests_to_build "" CACHE STRING "Which unit tests to build") -mark_as_advanced(unit_tests_to_build) - -# If no unit_test specifically set then use all unit tests -if (unit_tests_to_build) - set(actual_unit_tests ${unit_tests_to_build}) -else() - set(actual_unit_tests ${all_unit_tests}) -endif() - -add_executable (unit_test unit_test - ${actual_unit_tests} ${platform_test_additions}) -target_link_libraries (unit_test - ${qpid_test_boost_libs} - qpidmessaging qpidtypes qpidbroker qpidclient qpidcommon) - -endif (BUILD_TESTING_UNITTESTS) - -add_library(shlibtest MODULE shlibtest.cpp) - -if (BUILD_SASL) - add_custom_command(OUTPUT sasl_config/qpidd.conf sasl_config/qpidd.sasldb - COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/sasl_test_setup.sh) - - add_custom_target(sasl_config ALL - DEPENDS sasl_config/qpidd.conf sasl_config/qpidd.sasldb) -endif (BUILD_SASL) - -# Other test programs - -add_executable(echotest echotest.cpp ${platform_test_additions}) -target_link_libraries(echotest qpidclient qpidcommon) - -add_executable(publish publish.cpp ${platform_test_additions}) -target_link_libraries(publish qpidclient qpidcommon) - -add_executable(consume consume.cpp ${platform_test_additions}) -target_link_libraries(consume qpidclient qpidcommon) - -add_executable(header_test header_test.cpp ${platform_test_additions}) -target_link_libraries(header_test qpidclient qpidcommon) - -add_executable(declare_queues declare_queues.cpp ${platform_test_additions}) -target_link_libraries(declare_queues qpidclient qpidcommon) - -add_executable(replaying_sender replaying_sender.cpp ${platform_test_additions}) -target_link_libraries(replaying_sender qpidclient qpidcommon) - -add_executable(resuming_receiver resuming_receiver.cpp ${platform_test_additions}) -target_link_libraries(resuming_receiver qpidclient qpidcommon) - -add_executable(txshift txshift.cpp ${platform_test_additions}) -target_link_libraries(txshift qpidclient qpidcommon) - -add_executable(txjob txjob.cpp ${platform_test_additions}) -target_link_libraries(txjob qpidclient qpidcommon) - -add_executable(datagen datagen.cpp ${platform_test_additions}) -target_link_libraries(datagen qpidclient qpidcommon) - -add_executable(msg_group_test msg_group_test.cpp ${platform_test_additions}) -target_link_libraries(msg_group_test qpidmessaging qpidtypes qpidcommon) - -add_executable(ha_test_max_queues ha_test_max_queues.cpp ${platform_test_additions}) -target_link_libraries(ha_test_max_queues qpidclient qpidcommon) - -add_library(test_store MODULE test_store.cpp) -target_link_libraries(test_store qpidbroker qpidcommon) -set_target_properties(test_store PROPERTIES PREFIX "" COMPILE_DEFINITIONS _IN_QPID_BROKER) - -add_library(dlclose_noop MODULE dlclose_noop.c) - -if (BUILD_SASL) - add_executable(sasl_version sasl_version.cpp ${platform_test_additions}) -endif (BUILD_SASL) - -# Cross-platform tests - -add_test(NAME unit_tests COMMAND ${PYTHON_EXECUTABLE} run_unit_tests) - -add_test(NAME acl_tests COMMAND ${PYTHON_EXECUTABLE} run_acl_tests) -add_test(NAME cli_tests COMMAND ${PYTHON_EXECUTABLE} run_cli_tests) -add_test(NAME client_tests COMMAND ${PYTHON_EXECUTABLE} run_client_tests) -add_test(NAME federation_tests COMMAND ${PYTHON_EXECUTABLE} run_federation_tests) -add_test(NAME flow_control_tests COMMAND ${PYTHON_EXECUTABLE} run_flow_control_tests) -add_test(NAME msg_group_tests COMMAND ${PYTHON_EXECUTABLE} run_msg_group_tests) -add_test(NAME performance_tests COMMAND ${PYTHON_EXECUTABLE} run_performance_tests) -add_test(NAME python_tests COMMAND ${PYTHON_EXECUTABLE} run_python_tests) -add_test(NAME queue_redirect_tests COMMAND ${PYTHON_EXECUTABLE} run_queue_redirect_tests) -add_test(NAME qmf_tests COMMAND ${PYTHON_EXECUTABLE} run_qmf_tests) -add_test(NAME transaction_tests COMMAND ${PYTHON_EXECUTABLE} run_transaction_tests) - -if (BUILD_AMQP) - add_test(NAME idle_timeout_tests COMMAND ${PYTHON_EXECUTABLE} run_idle_timeout_tests) - add_test(NAME interlink_tests COMMAND ${PYTHON_EXECUTABLE} run_interlink_tests) - add_test(NAME interop_tests COMMAND ${PYTHON_EXECUTABLE} run_interop_tests) -endif (BUILD_AMQP) - -if (CMAKE_SYSTEM_NAME STREQUAL Windows) - # Windows-only tests - - add_test(NAME windows_store_tests COMMAND ${PYTHON_EXECUTABLE} run_windows_store_tests) -else (CMAKE_SYSTEM_NAME STREQUAL Windows) - # Posix-only tests - - add_test(NAME ha_tests COMMAND ${PYTHON_EXECUTABLE} run_ha_tests) - add_test(NAME ipv6_tests COMMAND run_ipv6_tests) # Also pretty simple to convert - add_test(NAME logging_tests COMMAND run_logging_tests) # Pretty simple to convert - add_test(NAME paged_queue_tests COMMAND run_paged_queue_tests) - add_test(NAME ring_queue_tests COMMAND run_ring_queue_tests) - add_test(NAME topic_tests COMMAND run_topic_tests) - - if (BUILD_SASL) - add_test(NAME sasl_tests COMMAND run_sasl_tests) - - if (BUILD_SSL) - add_test(NAME ssl_tests COMMAND run_ssl_tests) - endif (BUILD_SSL) - endif (BUILD_SASL) -endif (CMAKE_SYSTEM_NAME STREQUAL Windows) - -endif (BUILD_TESTING) diff --git a/qpid/cpp/src/tests/ClientMessage.cpp b/qpid/cpp/src/tests/ClientMessage.cpp deleted file mode 100644 index 994c46552c..0000000000 --- a/qpid/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/qpid/cpp/src/tests/ClientMessageTest.cpp b/qpid/cpp/src/tests/ClientMessageTest.cpp deleted file mode 100644 index f925f1c234..0000000000 --- a/qpid/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/qpid/cpp/src/tests/ClientSessionTest.cpp b/qpid/cpp/src/tests/ClientSessionTest.cpp deleted file mode 100644 index f35524c0c0..0000000000 --- a/qpid/cpp/src/tests/ClientSessionTest.cpp +++ /dev/null @@ -1,663 +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 <boost/format.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::BrokerOptions; -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 SessionFixture -{ - ClientSessionFixture(const BrokerOptions& opts = BrokerOptions()) : SessionFixture(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()); -} - -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&) {} -} - -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) { - BrokerOptions opts; - opts.queueCleanInterval = 1*TIME_SEC; - opts.queueFlowStopRatio = 0; - opts.queueFlowResumeRatio = 0; - ClientSessionFixture fix(opts); - FieldTable args; - args.setInt("qpid.max_count",10); - fix.session.queueDeclare(arg::queue="my-queue", arg::exclusive=true, arg::autoDelete=true, arg::arguments=args); - - 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); - fix.session.messageTransfer(arg::content=Message("Message_11", "my-queue"));//ensure policy is also updated -} - -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); - //need to reallocate credit as we have flushed it all out - s.setFlowControl(FlowControl::messageWindow(chunk)); - 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/qpid/cpp/src/tests/ConnectionOptions.h b/qpid/cpp/src/tests/ConnectionOptions.h deleted file mode 100644 index fe945e9ddd..0000000000 --- a/qpid/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/qpid/cpp/src/tests/DeliveryRecordTest.cpp b/qpid/cpp/src/tests/DeliveryRecordTest.cpp deleted file mode 100644 index 37b3095f81..0000000000 --- a/qpid/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(QueueCursor(CONSUMER), framing::SequenceNumber(), SequenceNumber(), Queue::shared_ptr(), "tag", Consumer::shared_ptr(), 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/qpid/cpp/src/tests/DispatcherTest.cpp b/qpid/cpp/src/tests/DispatcherTest.cpp deleted file mode 100644 index 7312fe8d2e..0000000000 --- a/qpid/cpp/src/tests/DispatcherTest.cpp +++ /dev/null @@ -1,240 +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/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; - - IOHandle f0(sv[0]); - IOHandle 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/qpid/cpp/src/tests/DtxWorkRecordTest.cpp b/qpid/cpp/src/tests/DtxWorkRecordTest.cpp deleted file mode 100644 index bcb3fc14a1..0000000000 --- a/qpid/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(); - - boost::intrusive_ptr<DtxBuffer> bufferA(new DtxBuffer()); - bufferA->enlist(static_pointer_cast<TxOp>(opA)); - bufferA->markEnded(); - boost::intrusive_ptr<DtxBuffer> 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(); - - boost::intrusive_ptr<DtxBuffer> bufferA(new DtxBuffer()); - bufferA->enlist(static_pointer_cast<TxOp>(opA)); - bufferA->markEnded(); - boost::intrusive_ptr<DtxBuffer> bufferB(new DtxBuffer()); - bufferB->enlist(static_pointer_cast<TxOp>(opB)); - bufferB->markEnded(); - boost::intrusive_ptr<DtxBuffer> 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(); - - boost::intrusive_ptr<DtxBuffer> bufferA(new DtxBuffer()); - bufferA->enlist(static_pointer_cast<TxOp>(opA)); - bufferA->markEnded(); - boost::intrusive_ptr<DtxBuffer> 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(); - - boost::intrusive_ptr<DtxBuffer> bufferA(new DtxBuffer()); - bufferA->enlist(static_pointer_cast<TxOp>(opA)); - bufferA->markEnded(); - boost::intrusive_ptr<DtxBuffer> bufferB(new DtxBuffer()); - bufferB->enlist(static_pointer_cast<TxOp>(opB)); - bufferB->markEnded(); - boost::intrusive_ptr<DtxBuffer> 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(); - - boost::intrusive_ptr<DtxBuffer> bufferA(new DtxBuffer()); - bufferA->enlist(static_pointer_cast<TxOp>(opA)); - bufferA->markEnded(); - boost::intrusive_ptr<DtxBuffer> 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/qpid/cpp/src/tests/ExchangeTest.cpp b/qpid/cpp/src/tests/ExchangeTest.cpp deleted file mode 100644 index df0684e832..0000000000 --- a/qpid/cpp/src/tests/ExchangeTest.cpp +++ /dev/null @@ -1,267 +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 std::string; - -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(); - - DeliverableMessage msg(MessageUtils::createMessage("exchange", "abc"), 0); - topic.route(msg); - direct.route(msg); -} - -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, "other", &args3);//need to use different binding key to correctly identify second binding - 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, 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, false, FieldTable()); - BOOST_CHECK_EQUAL(string("direct"), response.first->getType()); -} - -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, false, args); - - DeliverableMessage msg1(MessageUtils::createMessage("e", "abc"), 0); - DeliverableMessage msg2(MessageUtils::createMessage("e", "abc"), 0); - DeliverableMessage msg3(MessageUtils::createMessage("e", "abc"), 0); - - direct.route(msg1); - direct.route(msg2); - direct.route(msg3); - - BOOST_CHECK_EQUAL(1, msg1.getMessage().getAnnotation("qpid.msg_sequence").asInt64()); - BOOST_CHECK_EQUAL(2, msg2.getMessage().getAnnotation("qpid.msg_sequence").asInt64()); - BOOST_CHECK_EQUAL(3, msg3.getMessage().getAnnotation("qpid.msg_sequence").asInt64()); - - FanOutExchange fanout("fanout1", false, false, args); - HeadersExchange header("headers1", false, false, args); - TopicExchange topic ("topic1", false, false, args); - - // check other exchanges, that they preroute - DeliverableMessage msg4(MessageUtils::createMessage("e", "abc"), 0); - DeliverableMessage msg5(MessageUtils::createMessage("e", "abc"), 0); - DeliverableMessage msg6(MessageUtils::createMessage("e", "abc"), 0); - - fanout.route(msg4); - BOOST_CHECK_EQUAL(1, msg4.getMessage().getAnnotation("qpid.msg_sequence").asInt64()); - - header.route(msg5); - BOOST_CHECK_EQUAL(1, msg5.getMessage().getAnnotation("qpid.msg_sequence").asInt64()); - - topic.route(msg6); - BOOST_CHECK_EQUAL(1, msg6.getMessage().getAnnotation("qpid.msg_sequence").asInt64()); - direct.encode(buffer); - } - { - - ExchangeRegistry exchanges; - buffer.reset(); - DirectExchange::shared_ptr exch_dec = Exchange::decode(exchanges, buffer); - - DeliverableMessage msg1(MessageUtils::createMessage("e", "abc"), 0); - exch_dec->route(msg1); - - BOOST_CHECK_EQUAL(4, msg1.getMessage().getAnnotation("qpid.msg_sequence").asInt64()); - - } - delete [] buff; -} - -QPID_AUTO_TEST_CASE(testIVEOption) -{ - FieldTable args; - args.setInt("qpid.ive",1); - DirectExchange direct("direct1", false, false, args); - FanOutExchange fanout("fanout1", false, false, args); - HeadersExchange header("headers1", false, false, args); - TopicExchange topic ("topic1", false, false, args); - - qpid::types::Variant::Map properties; - properties["routing-key"] = "abc"; - properties["a"] = "abc"; - Message msg1 = MessageUtils::createMessage(properties, "my-message", "direct1"); - DeliverableMessage dmsg1(msg1, 0); - - FieldTable args2; - args2.setString("x-match", "any"); - args2.setString("a", "abc"); - - direct.route(dmsg1); - fanout.route(dmsg1); - header.route(dmsg1); - topic.route(dmsg1); - 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(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/qpid/cpp/src/tests/FieldTable.cpp b/qpid/cpp/src/tests/FieldTable.cpp deleted file mode 100644 index c040f1d433..0000000000 --- a/qpid/cpp/src/tests/FieldTable.cpp +++ /dev/null @@ -1,215 +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 <algorithm> -#include "qpid/framing/Array.h" -#include "qpid/framing/FieldTable.h" -#include "qpid/framing/FieldValue.h" -#include "qpid/framing/List.h" - -#include "unit_test.h" - -using namespace qpid::framing; - -using std::string; - -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; - - std::vector<char> buff(c.encodedSize()); - Buffer wbuffer(&buff[0], c.encodedSize()); - wbuffer.put(c); - - Buffer rbuffer(&buff[0], 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; - std::transform(c.begin(), c.end(), std::back_inserter(items), Array::get<std::string, Array::ValuePtr>); - 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_EQUAL(string("abc"), a.getAsString("string")); - BOOST_CHECK_EQUAL(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_EQUAL(f2, f); - - double d2; - BOOST_CHECK(!a.getDouble("string", d2)); - BOOST_CHECK(!a.getDouble("int", d2)); - BOOST_CHECK(a.getDouble("double", d2)); - BOOST_CHECK_EQUAL(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/qpid/cpp/src/tests/FieldValue.cpp b/qpid/cpp/src/tests/FieldValue.cpp deleted file mode 100644 index 9cea48e3cf..0000000000 --- a/qpid/cpp/src/tests/FieldValue.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 "qpid/framing/FieldValue.h" - -#include "unit_test.h" -#include <boost/test/floating_point_comparison.hpp> - -namespace qpid { -namespace tests { - -QPID_AUTO_TEST_SUITE(FieldValueTestSuite) - -using namespace qpid::framing; - -Str16Value s("abc"); -IntegerValue i(42); -FloatValue f((float)42.42); -DoubleValue df(123.123); - -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); - -} - -QPID_AUTO_TEST_CASE(testIntegerValueEquals) -{ - BOOST_CHECK(i.get<int>() == 42); - 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<float>() == true); - BOOST_CHECK(i.convertsTo<int>() == true); - BOOST_CHECK_THROW(i.get<std::string>(), InvalidConversionException); - BOOST_CHECK_EQUAL(i.get<float>(), 42.0); -} - -QPID_AUTO_TEST_CASE(testFloatValueEquals) -{ - BOOST_CHECK(f.convertsTo<float>() == true); - BOOST_CHECK(FloatValue((float)42.42) == f); - BOOST_CHECK_CLOSE(double(f.get<float>()), 42.42, 0.001); - // Check twice, regression test for QPID-6470 where the value was corrupted during get. - BOOST_CHECK(FloatValue((float)42.42) == f); - BOOST_CHECK_CLOSE(f.get<double>(), 42.42, 0.001); - - // Float to double conversion - BOOST_CHECK(f.convertsTo<double>() == true); - BOOST_CHECK_CLOSE(f.get<double>(), 42.42, 0.001); - - // Double value - BOOST_CHECK(f.convertsTo<float>() == true); - BOOST_CHECK(f.convertsTo<double>() == true); - BOOST_CHECK_CLOSE(double(df.get<float>()), 123.123, 0.001); - BOOST_CHECK_CLOSE(df.get<double>(), 123.123, 0.001); - - // Invalid conversions should fail. - BOOST_CHECK(!f.convertsTo<std::string>()); - BOOST_CHECK(!f.convertsTo<int>()); - BOOST_CHECK_THROW(f.get<std::string>(), InvalidConversionException); - BOOST_CHECK_THROW(f.get<int>(), InvalidConversionException); - - // getFloatingPointValue: check twice, regression test for QPID-6470 - BOOST_CHECK_CLOSE((double(f.getFloatingPointValue<float,sizeof(float)>())), 42.42, 0.001); - BOOST_CHECK_CLOSE((double(f.getFloatingPointValue<float,sizeof(float)>())), 42.42, 0.001); - BOOST_CHECK_CLOSE((df.getFloatingPointValue<double,sizeof(double)>()), 123.123, 0.001); - // getFloatingPointValue should *not* convert float/double, require exact type. - BOOST_CHECK_THROW((f.getFloatingPointValue<double,sizeof(double)>()), InvalidConversionException); - BOOST_CHECK_THROW((double(df.getFloatingPointValue<float,sizeof(float)>())), InvalidConversionException); -} - -QPID_AUTO_TEST_SUITE_END() - -}} // namespace qpid::tests diff --git a/qpid/cpp/src/tests/Frame.cpp b/qpid/cpp/src/tests/Frame.cpp deleted file mode 100644 index cfcfde04a7..0000000000 --- a/qpid/cpp/src/tests/Frame.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 "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; - -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/qpid/cpp/src/tests/FrameDecoder.cpp b/qpid/cpp/src/tests/FrameDecoder.cpp deleted file mode 100644 index 9eeff2a41e..0000000000 --- a/qpid/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/qpid/cpp/src/tests/FramingTest.cpp b/qpid/cpp/src/tests/FramingTest.cpp deleted file mode 100644 index 2392b6fec4..0000000000 --- a/qpid/cpp/src/tests/FramingTest.cpp +++ /dev/null @@ -1,168 +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 "qpid/framing/FieldValue.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/qpid/cpp/src/tests/HeaderTest.cpp b/qpid/cpp/src/tests/HeaderTest.cpp deleted file mode 100644 index 4b16f3c793..0000000000 --- a/qpid/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/qpid/cpp/src/tests/HeadersExchangeTest.cpp b/qpid/cpp/src/tests/HeadersExchangeTest.cpp deleted file mode 100644 index 3e68b84bc3..0000000000 --- a/qpid/cpp/src/tests/HeadersExchangeTest.cpp +++ /dev/null @@ -1,194 +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/broker/Message.h" -#include "qpid/framing/FieldTable.h" -#include "qpid/framing/FieldValue.h" -#include "MessageUtils.h" -#include "unit_test.h" - -using namespace qpid::broker; -using namespace qpid::framing; -using namespace qpid::types; - -namespace qpid { -namespace tests { - -QPID_AUTO_TEST_SUITE(HeadersExchangeTestSuite) - -QPID_AUTO_TEST_CASE(testMatchAll) -{ - FieldTable b; - b.setString("x-match", "all"); - b.setString("foo", "FOO"); - b.setInt("n", 42); - - Variant::Map m; - const int32_t int_n(42); - m["foo"] = "FOO"; - m["n"] = int_n; - BOOST_CHECK(HeadersExchange::match(b, MessageUtils::createMessage(m, "", "", true))); - - // Ignore extras. - m["extra"] = "x"; - BOOST_CHECK(HeadersExchange::match(b, MessageUtils::createMessage(m, "", "", true))); - - // Fail mismatch, wrong value. - m["foo"] = "NotFoo"; - BOOST_CHECK(!HeadersExchange::match(b, MessageUtils::createMessage(m, "", "", true))); - - // Fail mismatch, missing value - Variant::Map n; - n["n"] = int_n; - n["extra"] = "x"; - BOOST_CHECK(!HeadersExchange::match(b, MessageUtils::createMessage(n, "", "", true))); -} - -QPID_AUTO_TEST_CASE(testMatchAny) -{ - FieldTable b; - b.setString("x-match", "any"); - b.setString("foo", "FOO"); - b.setInt("n", 42); - - Variant::Map n; - Variant::Map m; - m["foo"] = "FOO"; - BOOST_CHECK(!HeadersExchange::match(b, MessageUtils::createMessage(n, "", "", true))); - BOOST_CHECK(HeadersExchange::match(b, MessageUtils::createMessage(m, "", "", true))); - const int32_t int_n(42); - m["n"] = int_n; - BOOST_CHECK(HeadersExchange::match(b, MessageUtils::createMessage(m, "", "", true))); -} - -QPID_AUTO_TEST_CASE(testMatchEmptyValue) -{ - FieldTable b; - b.setString("x-match", "all"); - b.set("foo", FieldTable::ValuePtr()); - b.set("n", FieldTable::ValuePtr()); - Variant::Map m; - BOOST_CHECK(!HeadersExchange::match(b, MessageUtils::createMessage(m, "", "", true))); -} - -QPID_AUTO_TEST_CASE(testMatchEmptyArgs) -{ - FieldTable b; - Variant::Map m; - m["foo"] = "FOO"; - Message msg = MessageUtils::createMessage(m, "", "", true); - - b.setString("x-match", "all"); - BOOST_CHECK(HeadersExchange::match(b, msg)); - b.setString("x-match", "any"); - BOOST_CHECK(!HeadersExchange::match(b, msg)); -} - - -QPID_AUTO_TEST_CASE(testMatchNoXMatch) -{ - FieldTable b; - b.setString("foo", "FOO"); - Variant::Map m; - m["foo"] = "FOO"; - BOOST_CHECK(!HeadersExchange::match(b, MessageUtils::createMessage(m, "", "", true))); -} - -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_CASE(testMatchSizedIntUint) -{ - typedef std::list<Variant::Map> vml; - - const int8_t i8(1); - const int16_t i16(1); - const int32_t i32(1); - const int64_t i64(1); - const uint8_t u8(1); - const uint16_t u16(1); - const uint32_t u32(1); - const uint64_t u64(1); - - Variant::Map mi8, mi16, mi32, mi64; - Variant::Map mu8, mu16, mu32, mu64; - - mi8["bk"] = i8; - mi16["bk"] = i16; - mi32["bk"] = i32; - mi64["bk"] = i64; - mu8["bk"] = u8; - mu16["bk"] = u16; - mu32["bk"] = u32; - mu64["bk"] = u64; - - vml mMap; - mMap.push_back(mi8); - mMap.push_back(mi16); - mMap.push_back(mi32); - mMap.push_back(mi64); - mMap.push_back(mu8); - mMap.push_back(mu16); - mMap.push_back(mu32); - mMap.push_back(mu64); - - for (vml::iterator bVal=mMap.begin(); bVal!=mMap.end(); ++bVal) { - FieldTable b; - qpid::amqp_0_10::translate(*bVal, b); - b.setString("x-match", "all"); - for (vml::iterator mVal=mMap.begin(); mVal!=mMap.end(); ++mVal) { - BOOST_CHECK(HeadersExchange::match(b, MessageUtils::createMessage(*mVal, "", "", true))); - } - } -} - -// TODO: Headers exchange match on single - -QPID_AUTO_TEST_CASE(testMatchFloatDouble) -{ - const double iFloat(1.0); - Variant::Map m; - m["bk"] = iFloat; - - FieldTable b; - qpid::amqp_0_10::translate(m, b); - b.setString("x-match", "all"); - BOOST_CHECK(HeadersExchange::match(b, MessageUtils::createMessage(m, "", "", true))); -} - - -QPID_AUTO_TEST_SUITE_END() - -}} // namespace qpid::tests diff --git a/qpid/cpp/src/tests/InlineAllocator.cpp b/qpid/cpp/src/tests/InlineAllocator.cpp deleted file mode 100644 index a4c4d64cea..0000000000 --- a/qpid/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/qpid/cpp/src/tests/InlineVector.cpp b/qpid/cpp/src/tests/InlineVector.cpp deleted file mode 100644 index ba5165886d..0000000000 --- a/qpid/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/qpid/cpp/src/tests/ManagementTest.cpp b/qpid/cpp/src/tests/ManagementTest.cpp deleted file mode 100644 index 98ef591fae..0000000000 --- a/qpid/cpp/src/tests/ManagementTest.cpp +++ /dev/null @@ -1,97 +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 "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_SUITE_END() - -}} // namespace qpid::tests diff --git a/qpid/cpp/src/tests/MessageReplayTracker.cpp b/qpid/cpp/src/tests/MessageReplayTracker.cpp deleted file mode 100644 index c0778247f0..0000000000 --- a/qpid/cpp/src/tests/MessageReplayTracker.cpp +++ /dev/null @@ -1,104 +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" - -#include <boost/format.hpp> - -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) -{ - SessionFixture 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) -{ - SessionFixture 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/qpid/cpp/src/tests/MessageTest.cpp b/qpid/cpp/src/tests/MessageTest.cpp deleted file mode 100644 index a6c5157b47..0000000000 --- a/qpid/cpp/src/tests/MessageTest.cpp +++ /dev/null @@ -1,89 +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/Protocol.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 "MessageUtils.h" - -#include "unit_test.h" - -#include <iostream> - -using namespace qpid::broker; -using namespace qpid::framing; - -using std::string; - -namespace qpid { -namespace tests { - -QPID_AUTO_TEST_SUITE(MessageTestSuite) - -QPID_AUTO_TEST_CASE(testEncodeDecode) -{ - string exchange = "MyExchange"; - string routingKey = "MyRoutingKey"; - uint64_t ttl(60); - Uuid messageId(true); - string data("abcdefghijklmn"); - - qpid::types::Variant::Map properties; - properties["routing-key"] = routingKey; - properties["ttl"] = ttl; - properties["durable"] = true; - properties["message-id"] = qpid::types::Uuid(messageId.data()); - properties["abc"] = "xyz"; - Message msg = MessageUtils::createMessage(properties, data); - - std::vector<char> bytes(msg.getPersistentContext()->encodedSize()); - qpid::framing::Buffer buffer(&bytes[0], bytes.size()); - msg.getPersistentContext()->encode(buffer); - buffer.reset(); - ProtocolRegistry registry(std::set<std::string>(), 0); - msg = registry.decode(buffer); - - BOOST_CHECK_EQUAL(routingKey, msg.getRoutingKey()); - BOOST_CHECK_EQUAL((uint64_t) data.size(), msg.getContent().size()); - BOOST_CHECK_EQUAL(data, msg.getContent()); - //BOOST_CHECK_EQUAL(messageId, msg->getProperties<MessageProperties>()->getMessageId()); - BOOST_CHECK_EQUAL(string("xyz"), msg.getPropertyAsString("abc")); - BOOST_CHECK(msg.isPersistent()); -} - -QPID_AUTO_TEST_CASE(testMessageProperties) -{ - string data("abcdefghijklmn"); - - qpid::types::Variant::Map properties; - properties["abc"] = "xyz"; - Message msg = MessageUtils::createMessage(properties, data); - - // Regression test that looking up a property doesn't return a prefix - BOOST_CHECK_EQUAL(msg.getProperty("abcdef").getType(), qpid::types::VAR_VOID); -} - -QPID_AUTO_TEST_SUITE_END() - -}} // namespace qpid::tests diff --git a/qpid/cpp/src/tests/MessageUtils.h b/qpid/cpp/src/tests/MessageUtils.h deleted file mode 100644 index f05b0d8b20..0000000000 --- a/qpid/cpp/src/tests/MessageUtils.h +++ /dev/null @@ -1,117 +0,0 @@ -#ifndef TESTS_MESSAGEUTILS_H -#define TESTS_MESSAGEUTILS_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/Message.h" -#include "qpid/broker/amqp_0_10/MessageTransfer.h" -#include "qpid/framing/AMQFrame.h" -#include "qpid/framing/MessageTransferBody.h" -#include "qpid/framing/Uuid.h" -#include "qpid/types/Variant.h" -#include "qpid/amqp_0_10/Codecs.h" - -using namespace qpid; -using namespace broker; -using namespace framing; - -namespace qpid { -namespace tests { - -struct MessageUtils -{ - static Message createMessage(const qpid::types::Variant::Map& properties, - const std::string& content="", - const std::string& destination = "", - bool replaceHeaders = false - ) - { - boost::intrusive_ptr<broker::amqp_0_10::MessageTransfer> msg(new broker::amqp_0_10::MessageTransfer()); - - AMQFrame method(( MessageTransferBody(ProtocolVersion(), destination, 0, 0))); - AMQFrame header((AMQHeaderBody())); - - msg->getFrames().append(method); - msg->getFrames().append(header); - if (content.size()) { - msg->getFrames().getHeaders()->get<MessageProperties>(true)->setContentLength(content.size()); - AMQFrame data((AMQContentBody(content))); - msg->getFrames().append(data); - } - if (!replaceHeaders) { - for (qpid::types::Variant::Map::const_iterator i = properties.begin(); i != properties.end(); ++i) { - if (i->first == "routing-key" && !i->second.isVoid()) { - msg->getFrames().getHeaders()->get<DeliveryProperties>(true)->setRoutingKey(i->second); - } else if (i->first == "message-id" && !i->second.isVoid()) { - qpid::types::Uuid id = i->second; - qpid::framing::Uuid id2(id.data()); - msg->getFrames().getHeaders()->get<MessageProperties>(true)->setMessageId(id2); - } else if (i->first == "ttl" && !i->second.isVoid()) { - msg->getFrames().getHeaders()->get<DeliveryProperties>(true)->setTtl(i->second); - } else if (i->first == "priority" && !i->second.isVoid()) { - msg->getFrames().getHeaders()->get<DeliveryProperties>(true)->setPriority(i->second); - } else if (i->first == "durable" && !i->second.isVoid()) { - msg->getFrames().getHeaders()->get<DeliveryProperties>(true)->setDeliveryMode(i->second.asBool() ? 2 : 1); - } else { - msg->getFrames().getHeaders()->get<MessageProperties>(true)->getApplicationHeaders().setString(i->first, i->second); - } - } - } else { - framing::FieldTable newHeaders; - qpid::amqp_0_10::translate(properties, newHeaders); - msg->getFrames().getHeaders()->get<MessageProperties>(true)->getApplicationHeaders() = newHeaders; - } - return Message(msg, msg); - } - - - static Message createMessage(const std::string& exchange="", const std::string& routingKey="", - uint64_t ttl = 0, bool durable = false, const Uuid& messageId=Uuid(true), - const std::string& content="") - { - boost::intrusive_ptr<broker::amqp_0_10::MessageTransfer> msg(new broker::amqp_0_10::MessageTransfer()); - - 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(content.size()); - props->setMessageId(messageId); - msg->getFrames().getHeaders()->get<DeliveryProperties>(true)->setRoutingKey(routingKey); - if (durable) - msg->getFrames().getHeaders()->get<DeliveryProperties>(true)->setDeliveryMode(2); - if (ttl) - msg->getFrames().getHeaders()->get<DeliveryProperties>(true)->setTtl(ttl); - if (content.size()) { - AMQFrame data((AMQContentBody(content))); - msg->getFrames().append(data); - } - if (ttl) msg->computeExpiration(); - return Message(msg, msg); - } -}; - -}} // namespace qpid::tests - -#endif /*!TESTS_MESSAGEUTILS_H*/ diff --git a/qpid/cpp/src/tests/MessagingFixture.h b/qpid/cpp/src/tests/MessagingFixture.h deleted file mode 100644 index 165aefeeec..0000000000 --- a/qpid/cpp/src/tests/MessagingFixture.h +++ /dev/null @@ -1,352 +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" - -#include <boost/format.hpp> - -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(const BrokerOptions& opts = BrokerOptions(), 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, - const std::string& objectName="org.apache.qpid.broker:broker:amqp-broker") - { - Variant::Map content; - Variant::Map objectId; - objectId["_object_name"] = objectName;; - 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/qpid/cpp/src/tests/MessagingLogger.cpp b/qpid/cpp/src/tests/MessagingLogger.cpp deleted file mode 100644 index 195a33db12..0000000000 --- a/qpid/cpp/src/tests/MessagingLogger.cpp +++ /dev/null @@ -1,149 +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/log/Statement.h" -#include "qpid/messaging/Connection.h" -#include "qpid/messaging/exceptions.h" -#include "qpid/messaging/Logger.h" - -#include <iostream> -#include <memory> -#include <stdexcept> - -#include <vector> - -#include "unit_test.h" - -namespace qpid { -namespace tests { - -QPID_AUTO_TEST_SUITE(MessagingLoggerSuite) - -class StringLogger : public qpid::messaging::LoggerOutput { - std::string& outString; - - void log(qpid::messaging::Level /*level*/, bool user, const char* /*file*/, int /*line*/, const char* /*function*/, const std::string& message){ - if (user) outString += "User "; - outString += message; - } - -public: - StringLogger(std::string& os) : - outString(os) - {} -}; - -#define SETUP_LOGGING(logger, ...) \ -do {\ - const char* args[]={"", __VA_ARGS__, 0};\ - qpid::messaging::Logger::configure((sizeof (args)/sizeof (char*))-1, args);\ - logOutput.clear();\ - qpid::messaging::Logger::setOutput(logger);\ -} while (0) -#define LOG_LEVEL(level)\ - QPID_LOG(level, #level " level output") -#define LOG_ALL_LOGGING_LEVELS \ -do { \ - LOG_LEVEL(trace); \ - LOG_LEVEL(debug); \ - LOG_LEVEL(info); \ - LOG_LEVEL(notice); \ - LOG_LEVEL(warning); \ - LOG_LEVEL(critical); \ -} while (0) -#define LOG_USER_LEVEL(level)\ - qpid::messaging::Logger::log(qpid::messaging::level, __FILE__, __LINE__, __FUNCTION__, #level " message") -#define LOG_ALL_USER_LOGGING_LEVELS \ -do { \ - LOG_USER_LEVEL(trace); \ - LOG_USER_LEVEL(debug); \ - LOG_USER_LEVEL(info); \ - LOG_USER_LEVEL(notice); \ - LOG_USER_LEVEL(warning); \ - LOG_USER_LEVEL(critical); \ -} while (0) - -std::string logOutput; - -QPID_AUTO_TEST_CASE(testLoggerLevels) -{ - StringLogger logger(logOutput); - - SETUP_LOGGING(logger, "--log-enable", "debug"); - LOG_ALL_LOGGING_LEVELS; - BOOST_CHECK_EQUAL(logOutput, "debug level output\ncritical level output\n"); - - SETUP_LOGGING(logger, "--log-enable", "trace+", "--log-disable", "notice"); - LOG_ALL_LOGGING_LEVELS; - BOOST_CHECK_EQUAL(logOutput, "trace level output\ndebug level output\ninfo level output\nwarning level output\ncritical level output\n"); - - SETUP_LOGGING(logger, "--log-enable", "info-"); - LOG_ALL_LOGGING_LEVELS; - BOOST_CHECK_EQUAL(logOutput, "trace level output\ndebug level output\ninfo level output\ncritical level output\n"); - - SETUP_LOGGING(logger, "--log-enable", "trace+", "--log-disable", "notice+"); - LOG_ALL_LOGGING_LEVELS; - BOOST_CHECK_EQUAL(logOutput, "trace level output\ndebug level output\ninfo level output\ncritical level output\n"); -} - -QPID_AUTO_TEST_CASE(testUserLoggerLevels) -{ - StringLogger logger(logOutput); - - SETUP_LOGGING(logger, "--log-enable", "debug"); - LOG_ALL_USER_LOGGING_LEVELS; - BOOST_CHECK_EQUAL(logOutput, "User debug message\nUser critical message\n"); - - SETUP_LOGGING(logger, "--log-enable", "trace+", "--log-disable", "notice"); - LOG_ALL_USER_LOGGING_LEVELS; - BOOST_CHECK_EQUAL(logOutput, "User trace message\nUser debug message\nUser info message\nUser warning message\nUser critical message\n"); - - SETUP_LOGGING(logger, "--log-enable", "info-"); - LOG_ALL_USER_LOGGING_LEVELS; - BOOST_CHECK_EQUAL(logOutput, "User trace message\nUser debug message\nUser info message\nUser critical message\n"); - - SETUP_LOGGING(logger, "--log-enable", "trace+", "--log-disable", "notice+"); - LOG_ALL_USER_LOGGING_LEVELS; - BOOST_CHECK_EQUAL(logOutput, "User trace message\nUser debug message\nUser info message\nUser critical message\n"); - - SETUP_LOGGING(logger, "--log-disable", "trace+"); - LOG_ALL_LOGGING_LEVELS; - LOG_ALL_USER_LOGGING_LEVELS; - BOOST_CHECK_EQUAL(logOutput, "critical level output\nUser critical message\n"); -} - -QPID_AUTO_TEST_CASE(testLoggerUsage) -{ - qpid::messaging::Logger::configure(0, 0, "blah"); - std::string u = qpid::messaging::Logger::usage(); - - BOOST_CHECK(!u.empty()); - BOOST_CHECK( u.find("--blah-log-enable")!=u.npos ); -} - -QPID_AUTO_TEST_CASE(testLoggerException) -{ - const char* args[]={"", "--blah-log-enable", "illegal", 0}; - BOOST_CHECK_THROW(qpid::messaging::Logger::configure(3, args, "blah"), qpid::messaging::MessagingException); -} - -QPID_AUTO_TEST_SUITE_END() -}} diff --git a/qpid/cpp/src/tests/MessagingSessionTests.cpp b/qpid/cpp/src/tests/MessagingSessionTests.cpp deleted file mode 100644 index 3b7ba34fe9..0000000000 --- a/qpid/cpp/src/tests/MessagingSessionTests.cpp +++ /dev/null @@ -1,1628 +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::BrokerOptions; -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); - } - uint8_t v1(255u); - int8_t v2(-120); - out.getProperties()["c"] = v1; - out.getProperties()["d"] = v2; - 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(); - } - BOOST_CHECK(receiver.fetch(in, Duration::SECOND * 5)); - Variant& c = in.getProperties()["c"]; - BOOST_CHECK_EQUAL(c.getType(), VAR_UINT8); - BOOST_CHECK_EQUAL(c.asUint8(), v1); - Variant& d = in.getProperties()["d"]; - BOOST_CHECK_EQUAL(d.getType(), VAR_INT8); - BOOST_CHECK_EQUAL(d.asInt8(), v2); -} - -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 releaser1 = fix.session.createReceiver(fix.queue); - Message m1 = releaser1.fetch(messaging::Duration::SECOND*5); - BOOST_CHECK(!m1.getRedelivered()); - fix.session.release(m1); - Receiver releaser2 = fix.session.createReceiver(fix.queue); - Message m2 = releaser2.fetch(messaging::Duration::SECOND*5); - BOOST_CHECK(m2.getRedelivered()); - fix.session.release(m2); - 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("testqueue#; " + 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(testAssertExchangeOption) -{ - MessagingFixture fix; - std::string a1 = "e; {create:always, assert:always, node:{type:topic, x-declare:{type:direct, arguments:{qpid.msg_sequence:True}}}}"; - Sender s1 = fix.session.createSender(a1); - s1.close(); - Receiver r1 = fix.session.createReceiver(a1); - r1.close(); - - std::string a2 = "e; {assert:receiver, node:{type:topic, x-declare:{type:fanout, arguments:{qpid.msg_sequence:True}}}}"; - Sender s2 = fix.session.createSender(a2); - s2.close(); - BOOST_CHECK_THROW(fix.session.createReceiver(a2), qpid::messaging::AssertionFailed); - - std::string a3 = "e; {assert:sender, node:{x-declare:{arguments:{qpid.msg_sequence:False}}}}"; - BOOST_CHECK_THROW(fix.session.createSender(a3), qpid::messaging::AssertionFailed); - Receiver r3 = fix.session.createReceiver(a3); - r3.close(); - - fix.admin.deleteExchange("e"); -} - -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()); - BOOST_CHECK(m2.getRedelivered()); - 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(BrokerOptions(), 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_CASE(testExclusiveTopicSubscriber) -{ - TopicFixture fix; - std::string address = (boost::format("%1%; { link: { name: 'my-subscription', x-declare: { auto-delete: true, exclusive: true }}}") % fix.topic).str(); - Sender sender = fix.session.createSender(fix.topic); - Receiver receiver1 = 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(testNonExclusiveSubscriber) -{ - TopicFixture fix; - std::string address = (boost::format("%1%; {node:{type:topic}, link:{name:'my-subscription', x-declare:{auto-delete:true, exclusive:false}}}") % fix.topic).str(); - Receiver receiver1 = fix.session.createReceiver(address); - Receiver receiver2 = fix.session.createReceiver(address); - Sender sender = fix.session.createSender(fix.topic); - sender.send(Message("one"), true); - Message in = receiver1.fetch(Duration::IMMEDIATE); - BOOST_CHECK_EQUAL(in.getContent(), std::string("one")); - sender.send(Message("two"), true); - in = receiver2.fetch(Duration::IMMEDIATE); - BOOST_CHECK_EQUAL(in.getContent(), std::string("two")); - fix.session.acknowledge(); -} - -QPID_AUTO_TEST_CASE(testAcknowledgeUpTo) -{ - 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; - other.acknowledgeUpTo(messages[batch-1]);//acknowledge first 10 messages only - - messages.clear(); - other.sync(); - other.close(); - - other = fix.connection.createSession(); - receiver = other.createReceiver(fix.queue); - Message msg; - for (uint i = 0; i < (count-batch); ++i) { - msg = receiver.fetch(); - BOOST_CHECK_EQUAL(msg.getContent(), (boost::format("Message_%1%") % (i+1+batch)).str()); - } - other.acknowledgeUpTo(msg); - 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(testCreateBindingsOnStandardExchange) -{ - QueueFixture fix; - Sender sender = fix.session.createSender((boost::format("amq.direct; {create:always, node:{type:topic, x-bindings:[{queue:%1%, key:my-subject}]}}") % fix.queue).str()); - Message out("test-message"); - out.setSubject("my-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(testUnsubscribeOnClose) -{ - MessagingFixture fix; - Sender sender = fix.session.createSender("my-exchange/my-subject; {create: always, delete:sender, node:{type:topic, x-declare:{alternate-exchange:amq.fanout}}}"); - Receiver receiver = fix.session.createReceiver("my-exchange/my-subject"); - Receiver deadletters = fix.session.createReceiver("amq.fanout"); - - sender.send(Message("first")); - Message in = receiver.fetch(Duration::SECOND); - BOOST_CHECK_EQUAL(in.getContent(), std::string("first")); - fix.session.acknowledge(); - receiver.close(); - sender.send(Message("second")); - in = deadletters.fetch(Duration::SECOND); - BOOST_CHECK_EQUAL(in.getContent(), std::string("second")); - fix.session.acknowledge(); -} - -QPID_AUTO_TEST_CASE(testHeadersExchange) -{ - MessagingFixture fix; - //use both quoted and unquoted values - Receiver receiver = fix.session.createReceiver("amq.match; {link:{x-bindings:[{arguments:{x-match:all,qpid.subject:'abc',my-property:abc}}]}}"); - Sender sender = fix.session.createSender("amq.match"); - Message out("test-message"); - out.setSubject("abc"); - Variant& property = out.getProperties()["my-property"]; - property = "abc"; - property.setEncoding("utf8"); - sender.send(out, true); - Message in; - if (receiver.fetch(in, Duration::SECOND)) { - fix.session.acknowledge(); - BOOST_CHECK_EQUAL(in.getContent(), out.getContent()); - } else { - BOOST_FAIL("Message did not match as expected!"); - } -} - -QPID_AUTO_TEST_CASE(testLargeRoutingKey) -{ - MessagingFixture fix; - std::string address = "amq.direct/" + std::string(300, 'x');//routing/binding key can be at most 225 chars in 0-10 - BOOST_CHECK_THROW(fix.session.createReceiver(address), qpid::messaging::MessagingException); -} - -QPID_AUTO_TEST_CASE(testAlternateExchangeInLinkDeclare) -{ - MessagingFixture fix; - Sender s = fix.session.createSender("amq.direct/key"); - Receiver r1 = fix.session.createReceiver("amq.direct/key;{link:{x-declare:{alternate-exchange:'amq.fanout'}}}"); - Receiver r2 = fix.session.createReceiver("amq.fanout"); - - for (uint i = 0; i < 10; ++i) { - s.send(Message((boost::format("Message_%1%") % (i+1)).str()), true); - } - r1.close();//orphans all messages in subscription queue, which should then be routed through alternate exchange - for (uint i = 0; i < 10; ++i) { - Message received; - BOOST_CHECK(r2.fetch(received, Duration::SECOND)); - BOOST_CHECK_EQUAL(received.getContent(), (boost::format("Message_%1%") % (i+1)).str()); - } -} - -QPID_AUTO_TEST_CASE(testBrowseOnly) -{ - /* Set up a queue browse-only, and try to receive - the same messages twice with two different receivers. - This works because the browse-only queue does not - allow message acquisition. */ - - QueueFixture fix; - std::string addr = "q; {create:always, node:{type:queue, durable:false, x-declare:{arguments:{qpid.browse-only:1}}}}"; - Sender sender = fix.session.createSender(addr); - Message out("test-message"); - - int count = 10; - for ( int i = 0; i < count; ++ i ) { - sender.send(out); - } - - Message m; - - Receiver receiver_1 = fix.session.createReceiver(addr); - for ( int i = 0; i < count; ++ i ) { - BOOST_CHECK(receiver_1.fetch(m, Duration::SECOND)); - } - - Receiver receiver_2 = fix.session.createReceiver(addr); - for ( int i = 0; i < count; ++ i ) { - BOOST_CHECK(receiver_2.fetch(m, Duration::SECOND)); - } - - fix.session.acknowledge(); -} - -QPID_AUTO_TEST_CASE(testLinkBindingCleanup) -{ - MessagingFixture fix; - - Sender sender = fix.session.createSender("test.ex;{create:always,node:{type:topic}}"); - - Connection connection = fix.newConnection(); - connection.open(); - - Session session(connection.createSession()); - Receiver receiver1 = session.createReceiver("test.q;{create:always, node:{type:queue, x-bindings:[{exchange:test.ex,queue:test.q,key:#,arguments:{x-scope:session}}]}}"); - Receiver receiver2 = fix.session.createReceiver("test.q;{create:never, delete:always}"); - connection.close(); - - sender.send(Message("test-message"), true); - - // The session-scoped binding should be removed when receiver1's network connection is lost - Message in; - BOOST_CHECK(!receiver2.fetch(in, Duration::IMMEDIATE)); -} - -namespace { -struct Fetcher : public qpid::sys::Runnable { - Receiver receiver; - Message message; - bool result; - qpid::messaging::Duration timeout; - bool timedOut; - - Fetcher(Receiver r) : receiver(r), result(false), timeout(Duration::SECOND*10), timedOut(false) {} - void run() - { - qpid::sys::AbsTime start(qpid::sys::now()); - try { - result = receiver.fetch(message, timeout); - } catch (const MessagingException&) {} - qpid::sys::Duration timeTaken(start, qpid::sys::now()); - timedOut = (uint64_t) timeTaken >= timeout.getMilliseconds() * qpid::sys::TIME_MSEC; - } -}; -} - -QPID_AUTO_TEST_CASE(testConcurrentFetch) -{ - MessagingFixture fix; - Sender sender = fix.session.createSender("my-test-queue;{create:always, node : { x-declare : { auto-delete: true}}}"); - Receiver receiver = fix.session.createReceiver("my-test-queue"); - Fetcher fetcher(fix.session.createReceiver("amq.fanout")); - qpid::sys::Thread runner(fetcher); - Message out("test-message"); - for (int i = 0; i < 10; i++) {//try several times to make sure - sender.send(out, true); - //since the message is now on the queue, it should take less than the timeout to actually fetch it - qpid::sys::AbsTime start = qpid::sys::AbsTime::now(); - Message in; - BOOST_CHECK(receiver.fetch(in, qpid::messaging::Duration::SECOND*2)); - qpid::sys::Duration time(start, qpid::sys::AbsTime::now()); - BOOST_CHECK(time < qpid::sys::TIME_SEC*2); - if (time >= qpid::sys::TIME_SEC*2) break;//if we failed, no need to keep testing - } - fix.session.createSender("amq.fanout").send(out); - runner.join(); - BOOST_CHECK(fetcher.result); -} - -QPID_AUTO_TEST_CASE(testSimpleRequestResponse) -{ - QueueFixture fix; - //create receiver on temp queue for responses (using shorthand for temp queue) - Receiver r1 = fix.session.createReceiver("#"); - //send request - Sender s1 = fix.session.createSender(fix.queue); - Message original("test-message"); - original.setSubject("test-subject"); - original.setReplyTo(r1.getAddress()); - s1.send(original); - - //receive request and send response - Receiver r2 = fix.session.createReceiver(fix.queue); - Message m = r2.fetch(Duration::SECOND * 5); - Sender s2 = fix.session.createSender(m.getReplyTo()); - s2.send(m); - m = r1.fetch(Duration::SECOND * 5); - fix.session.acknowledge(); - BOOST_CHECK_EQUAL(m.getContent(), original.getContent()); - BOOST_CHECK_EQUAL(m.getSubject(), original.getSubject()); -} - -QPID_AUTO_TEST_CASE(testSelfDestructQueue) -{ - MessagingFixture fix; - Session other = fix.connection.createSession(); - Receiver r1 = other.createReceiver("amq.fanout; {link:{reliability:at-least-once, x-declare:{arguments:{qpid.max_count:10,qpid.policy_type:self-destruct}}}}"); - Receiver r2 = fix.session.createReceiver("amq.fanout"); - //send request - Sender s = fix.session.createSender("amq.fanout"); - for (uint i = 0; i < 20; ++i) { - s.send(Message((boost::format("MSG_%1%") % (i+1)).str())); - } - try { - ScopedSuppressLogging sl; - for (uint i = 0; i < 20; ++i) { - r1.fetch(Duration::SECOND); - } - BOOST_FAIL("Expected exception."); - } catch (const qpid::messaging::MessagingException&) { - } - - for (uint i = 0; i < 20; ++i) { - BOOST_CHECK_EQUAL(r2.fetch(Duration::SECOND).getContent(), (boost::format("MSG_%1%") % (i+1)).str()); - } -} - -QPID_AUTO_TEST_CASE(testReroutingRingQueue) -{ - MessagingFixture fix; - Receiver r1 = fix.session.createReceiver("my-queue; {create:always, node:{x-declare:{alternate-exchange:amq.fanout, auto-delete:True, arguments:{qpid.max_count:10,qpid.policy_type:ring}}}}"); - Receiver r2 = fix.session.createReceiver("amq.fanout"); - - Sender s = fix.session.createSender("my-queue"); - for (uint i = 0; i < 20; ++i) { - s.send(Message((boost::format("MSG_%1%") % (i+1)).str())); - } - for (uint i = 10; i < 20; ++i) { - BOOST_CHECK_EQUAL(r1.fetch(Duration::SECOND).getContent(), (boost::format("MSG_%1%") % (i+1)).str()); - } - for (uint i = 0; i < 10; ++i) { - BOOST_CHECK_EQUAL(r2.fetch(Duration::SECOND).getContent(), (boost::format("MSG_%1%") % (i+1)).str()); - } -} - -QPID_AUTO_TEST_CASE(testReleaseOnPriorityQueue) -{ - MessagingFixture fix; - std::string queue("queue; {create:always, node:{x-declare:{auto-delete:True, arguments:{qpid.priorities:10}}}}"); - std::string text("my message"); - Sender sender = fix.session.createSender(queue); - sender.send(Message(text)); - Receiver receiver = fix.session.createReceiver(queue); - Message msg; - for (uint i = 0; i < 10; ++i) { - if (receiver.fetch(msg, Duration::SECOND)) { - BOOST_CHECK_EQUAL(msg.getContent(), text); - fix.session.release(msg); - } else { - BOOST_FAIL("Released message not redelivered as expected."); - } - } - fix.session.acknowledge(); -} - -QPID_AUTO_TEST_CASE(testRollbackWithFullPrefetch) -{ - QueueFixture fix; - std::string first("first"); - std::string second("second"); - Sender sender = fix.session.createSender(fix.queue); - for (uint i = 0; i < 10; ++i) { - sender.send(Message((boost::format("MSG_%1%") % (i+1)).str())); - } - Session txsession = fix.connection.createTransactionalSession(); - Receiver receiver = txsession.createReceiver(fix.queue); - receiver.setCapacity(9); - Message msg; - for (uint i = 0; i < 10; ++i) { - if (receiver.fetch(msg, Duration::SECOND)) { - BOOST_CHECK_EQUAL(msg.getContent(), std::string("MSG_1")); - txsession.rollback(); - } else { - BOOST_FAIL("Released message not redelivered as expected."); - break; - } - } - txsession.acknowledge(); - txsession.commit(); -} - -QPID_AUTO_TEST_CASE(testCloseAndConcurrentFetch) -{ - QueueFixture fix; - Receiver receiver = fix.session.createReceiver(fix.queue); - Fetcher fetcher(receiver); - qpid::sys::Thread runner(fetcher); - qpid::sys::usleep(500); - receiver.close(); - runner.join(); - BOOST_CHECK(!fetcher.timedOut); -} - -QPID_AUTO_TEST_CASE(testCloseAndMultipleConcurrentFetches) -{ - QueueFixture fix; - Receiver receiver = fix.session.createReceiver(fix.queue); - Receiver receiver2 = fix.session.createReceiver("amq.fanout"); - Receiver receiver3 = fix.session.createReceiver("amq.fanout"); - Fetcher fetcher(receiver); - Fetcher fetcher2(receiver2); - Fetcher fetcher3(receiver3); - qpid::sys::Thread runner(fetcher); - qpid::sys::Thread runner2(fetcher2); - qpid::sys::Thread runner3(fetcher3); - qpid::sys::usleep(500); - receiver.close(); - Message message("Test"); - fix.session.createSender("amq.fanout").send(message); - runner2.join(); - BOOST_CHECK(fetcher2.result); - BOOST_CHECK_EQUAL(fetcher2.message.getContent(), message.getContent()); - runner3.join(); - BOOST_CHECK(fetcher3.result); - BOOST_CHECK_EQUAL(fetcher3.message.getContent(), message.getContent()); - runner.join(); - BOOST_CHECK(!fetcher.timedOut); -} - -QPID_AUTO_TEST_CASE(testSessionCheckError) -{ - MessagingFixture fix; - Session session = fix.connection.createSession(); - Sender sender = session.createSender("q; {create:always, node:{x-declare:{auto-delete:True, arguments:{qpid.max_count:1}}}}"); - ScopedSuppressLogging sl; - for (uint i = 0; i < 2; ++i) { - sender.send(Message((boost::format("A_%1%") % (i+1)).str())); - } - try { - while (true) session.checkError(); - } catch (const qpid::types::Exception&) { - //this is ok - } catch (const qpid::Exception&) { - BOOST_FAIL("Wrong exception type thrown"); - } -} - -QPID_AUTO_TEST_CASE(testImmediateNextReceiver) -{ - QueueFixture fix; - Sender sender = fix.session.createSender(fix.queue); - Message out("test message"); - sender.send(out); - fix.session.createReceiver(fix.queue).setCapacity(1); - Receiver next; - qpid::sys::AbsTime start = qpid::sys::now(); - try { - while (!fix.session.nextReceiver(next, qpid::messaging::Duration::IMMEDIATE)) { - qpid::sys::Duration running(start, qpid::sys::now()); - if (running > 5*qpid::sys::TIME_SEC) { - throw qpid::types::Exception("Timed out spinning on nextReceiver(IMMEDIATE)"); - } - qpid::sys::usleep(1); // for valgrind - } - Message in; - BOOST_CHECK(next.fetch(in, qpid::messaging::Duration::IMMEDIATE)); - BOOST_CHECK_EQUAL(in.getContent(), out.getContent()); - next.close(); - } catch (const std::exception& e) { - BOOST_FAIL(e.what()); - } -} - -QPID_AUTO_TEST_CASE(testImmediateNextReceiverNoMessage) -{ - QueueFixture fix; - Receiver r = fix.session.createReceiver(fix.queue); - r.setCapacity(1); - Receiver next; - try { - BOOST_CHECK(!fix.session.nextReceiver(next, qpid::messaging::Duration::IMMEDIATE)); - r.close(); - } catch (const std::exception& e) { - BOOST_FAIL(e.what()); - } -} - -QPID_AUTO_TEST_CASE(testResendEmpty) -{ - QueueFixture fix; - Sender sender = fix.session.createSender(fix.queue); - Message out("test-message"); - 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()); - //set content on received message to empty string and resend - in.setContent(""); - sender.send(in); - in = receiver.fetch(Duration::SECOND * 5); - fix.session.acknowledge(); - BOOST_CHECK_EQUAL(in.getContent(), std::string()); -} - -QPID_AUTO_TEST_CASE(testResendMapAsString) -{ - QueueFixture fix; - Sender sender = fix.session.createSender(fix.queue); - Message out; - qpid::types::Variant::Map content; - content["foo"] = "bar"; - encode(content, out); - 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()); - //change content and resend - std::string newContent("something random"); - in.setContent(newContent); - in.setContentType(std::string());//it is no longer a map - sender.send(in); - in = receiver.fetch(Duration::SECOND * 5); - fix.session.acknowledge(); - BOOST_CHECK_EQUAL(in.getContent(), newContent); -} - -QPID_AUTO_TEST_CASE(testClientExpiration) -{ - QueueFixture fix; - Receiver receiver = fix.session.createReceiver(fix.queue); - receiver.setCapacity(5); - Sender sender = fix.session.createSender(fix.queue); - for (uint i = 0; i < 5000; ++i) { - Message msg((boost::format("a_%1%") % (i+1)).str()); - msg.setSubject("a"); - msg.setTtl(Duration(10)); - sender.send(msg); - } - for (uint i = 0; i < 50; ++i) { - Message msg((boost::format("b_%1%") % (i+1)).str()); - msg.setSubject("b"); - sender.send(msg); - } - Message received; - bool done = false; - uint b_count = 0; - while (!done && receiver.fetch(received, Duration::IMMEDIATE)) { - if (received.getSubject() == "b") { - b_count++; - } - done = received.getContent() == "b_50"; - fix.session.acknowledge(); - } - BOOST_CHECK_EQUAL(b_count, 50); -} - -QPID_AUTO_TEST_CASE(testExpiredPrefetchOnClose) -{ - QueueFixture fix; - Receiver receiver = fix.session.createReceiver(fix.queue); - Session other = fix.connection.createSession(); - Receiver receiver2 = other.createReceiver("amq.fanout"); - receiver.setCapacity(500); - Sender sender = fix.session.createSender(fix.queue); - for (uint i = 0; i < 500; ++i) { - Message msg((boost::format("a_%1%") % (i+1)).str()); - msg.setSubject("a"); - msg.setTtl(Duration(5)); - sender.send(msg); - } - Sender sender2 = other.createSender("amq.fanout"); - sender2.send(Message("done")); - BOOST_CHECK_EQUAL(receiver2.fetch().getContent(), "done"); - qpid::sys::usleep(qpid::sys::TIME_MSEC*5);//sorry Alan, I can't see any way to avoid a sleep; need to ensure messages in prefetch have expired - receiver.close(); -} - -QPID_AUTO_TEST_CASE(testPriorityRingEviction) -{ - MessagingFixture fix; - std::string queue("queue; {create:always, node:{x-declare:{auto-delete:True, arguments:{qpid.priorities:10, qpid.max_count:5, qpid.policy_type:ring}}}}"); - Sender sender = fix.session.createSender(queue); - Receiver receiver = fix.session.createReceiver(queue); - std::vector<Message> acquired; - for (uint i = 0; i < 5; ++i) { - Message msg((boost::format("msg_%1%") % (i+1)).str()); - sender.send(msg); - } - //fetch but don't acknowledge messages, leaving them in acquired state - for (uint i = 0; i < 5; ++i) { - Message msg; - BOOST_CHECK(receiver.fetch(msg, Duration::IMMEDIATE)); - BOOST_CHECK_EQUAL(msg.getContent(), (boost::format("msg_%1%") % (i+1)).str()); - acquired.push_back(msg); - } - //send 5 more messages to the queue, which should cause all the - //acquired messages to be dropped - for (uint i = 5; i < 10; ++i) { - Message msg((boost::format("msg_%1%") % (i+1)).str()); - sender.send(msg); - } - //now release the acquired messages, which should have been evicted... - for (std::vector<Message>::iterator i = acquired.begin(); i != acquired.end(); ++i) { - fix.session.release(*i); - } - acquired.clear(); - //and check that the newest five are received - for (uint i = 5; i < 10; ++i) { - Message msg; - BOOST_CHECK(receiver.fetch(msg, Duration::IMMEDIATE)); - BOOST_CHECK_EQUAL(msg.getContent(), (boost::format("msg_%1%") % (i+1)).str()); - acquired.push_back(msg); - } - Message msg; - BOOST_CHECK(!receiver.fetch(msg, Duration::IMMEDIATE)); -} - -QPID_AUTO_TEST_SUITE_END() - -}} // namespace qpid::tests diff --git a/qpid/cpp/src/tests/MessagingThreadTests.cpp b/qpid/cpp/src/tests/MessagingThreadTests.cpp deleted file mode 100644 index 48264735b1..0000000000 --- a/qpid/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/qpid/cpp/src/tests/PollableCondition.cpp b/qpid/cpp/src/tests/PollableCondition.cpp deleted file mode 100644 index f9b3c25c93..0000000000 --- a/qpid/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/qpid/cpp/src/tests/PollerTest.cpp b/qpid/cpp/src/tests/PollerTest.cpp deleted file mode 100644 index 5a1d02964c..0000000000 --- a/qpid/cpp/src/tests/PollerTest.cpp +++ /dev/null @@ -1,262 +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/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); - - IOHandle f0(sv[0]); - IOHandle 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); - - IOHandle f2(sv[0]); - IOHandle 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/qpid/cpp/src/tests/ProxyTest.cpp b/qpid/cpp/src/tests/ProxyTest.cpp deleted file mode 100644 index a926b28395..0000000000 --- a/qpid/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/qpid/cpp/src/tests/Qmf2.cpp b/qpid/cpp/src/tests/Qmf2.cpp deleted file mode 100644 index bc263d5c6d..0000000000 --- a/qpid/cpp/src/tests/Qmf2.cpp +++ /dev/null @@ -1,422 +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 "qpid/messaging/Connection.h" -#include "qmf/PosixEventNotifierImpl.h" -#include "qmf/AgentSession.h" -#include "qmf/AgentSessionImpl.h" -#include "qmf/ConsoleSession.h" -#include "qmf/ConsoleSessionImpl.h" -#include "unit_test.h" - -using namespace std; -using namespace qpid::types; -using namespace qpid::messaging; -using namespace qmf; - -bool isReadable(int fd) -{ - fd_set rfds; - struct timeval tv; - int nfds, result; - - FD_ZERO(&rfds); - FD_SET(fd, &rfds); - nfds = fd + 1; - tv.tv_sec = 0; - tv.tv_usec = 0; - - result = select(nfds, &rfds, NULL, NULL, &tv); - - return result > 0; -} - -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_CASE(testAgentSessionEventListener) -{ - Connection connection("localhost"); - AgentSession session(connection, ""); - posix::EventNotifier notifier(session); - - AgentSessionImpl& sessionImpl = AgentSessionImplAccess::get(session); - - BOOST_CHECK(sessionImpl.getEventNotifier() != 0); -} - -QPID_AUTO_TEST_CASE(testConsoleSessionEventListener) -{ - Connection connection("localhost"); - ConsoleSession session(connection, ""); - posix::EventNotifier notifier(session); - - ConsoleSessionImpl& sessionImpl = ConsoleSessionImplAccess::get(session); - - BOOST_CHECK(sessionImpl.getEventNotifier() != 0); -} - -QPID_AUTO_TEST_CASE(testGetHandle) -{ - Connection connection("localhost"); - ConsoleSession session(connection, ""); - posix::EventNotifier notifier(session); - - BOOST_CHECK(notifier.getHandle() > 0); -} - -QPID_AUTO_TEST_CASE(testSetReadableToFalse) -{ - Connection connection("localhost"); - ConsoleSession session(connection, ""); - posix::EventNotifier notifier(session); - PosixEventNotifierImplAccess::get(notifier).setReadable(false); - - bool readable(isReadable(notifier.getHandle())); - BOOST_CHECK(!readable); -} - -QPID_AUTO_TEST_CASE(testSetReadable) -{ - Connection connection("localhost"); - ConsoleSession session(connection, ""); - posix::EventNotifier notifier(session); - PosixEventNotifierImplAccess::get(notifier).setReadable(true); - - bool readable(isReadable(notifier.getHandle())); - BOOST_CHECK(readable); -} - -QPID_AUTO_TEST_CASE(testSetReadableMultiple) -{ - Connection connection("localhost"); - ConsoleSession session(connection, ""); - posix::EventNotifier notifier(session); - for (int i = 0; i < 15; i++) - PosixEventNotifierImplAccess::get(notifier).setReadable(true); - PosixEventNotifierImplAccess::get(notifier).setReadable(false); - - bool readable(isReadable(notifier.getHandle())); - BOOST_CHECK(!readable); -} - -QPID_AUTO_TEST_CASE(testDeleteNotifier) -{ - Connection connection("localhost"); - ConsoleSession session(connection, ""); - ConsoleSessionImpl& sessionImpl = ConsoleSessionImplAccess::get(session); - { - posix::EventNotifier notifier(session); - BOOST_CHECK(sessionImpl.getEventNotifier() != 0); - } - BOOST_CHECK(sessionImpl.getEventNotifier() == 0); -} - -QPID_AUTO_TEST_SUITE_END() - -}} // namespace qpid::tests diff --git a/qpid/cpp/src/tests/QueueDepth.cpp b/qpid/cpp/src/tests/QueueDepth.cpp deleted file mode 100644 index 09b221b3a8..0000000000 --- a/qpid/cpp/src/tests/QueueDepth.cpp +++ /dev/null @@ -1,105 +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/broker/QueueDepth.h" - -#include "unit_test.h" - -namespace qpid { -namespace tests { - -QPID_AUTO_TEST_SUITE(QueueDepthTestSuite) - -using namespace qpid::broker; - -QPID_AUTO_TEST_CASE(testCompare) -{ - QueueDepth a(0, 0); - QueueDepth b(1, 1); - QueueDepth c(2, 2); - QueueDepth d(1, 1); - - BOOST_CHECK(a < b); - BOOST_CHECK(b < c); - BOOST_CHECK(a < c); - - BOOST_CHECK(b > a); - BOOST_CHECK(c > b); - BOOST_CHECK(c > a); - - BOOST_CHECK(b == d); - BOOST_CHECK(d == b); - BOOST_CHECK(a != b); - BOOST_CHECK(b != a); - - QueueDepth e; e.setCount(1); - QueueDepth f; f.setCount(2); - BOOST_CHECK(e < f); - BOOST_CHECK(f > e); - - QueueDepth g; g.setSize(1); - QueueDepth h; h.setSize(2); - BOOST_CHECK(g < h); - BOOST_CHECK(h > g); -} - -QPID_AUTO_TEST_CASE(testIncrement) -{ - QueueDepth a(5, 10); - QueueDepth b(3, 6); - QueueDepth c(8, 16); - a += b; - BOOST_CHECK(a == c); - BOOST_CHECK_EQUAL(8u, a.getCount()); - BOOST_CHECK_EQUAL(16u, a.getSize()); -} - -QPID_AUTO_TEST_CASE(testDecrement) -{ - QueueDepth a(5, 10); - QueueDepth b(3, 6); - QueueDepth c(2, 4); - a -= b; - BOOST_CHECK(a == c); - BOOST_CHECK_EQUAL(2u, a.getCount()); - BOOST_CHECK_EQUAL(4u, a.getSize()); -} - -QPID_AUTO_TEST_CASE(testAddition) -{ - QueueDepth a(5, 10); - QueueDepth b(3, 6); - - QueueDepth c = a + b; - BOOST_CHECK_EQUAL(8u, c.getCount()); - BOOST_CHECK_EQUAL(16u, c.getSize()); -} - -QPID_AUTO_TEST_CASE(testSubtraction) -{ - QueueDepth a(5, 10); - QueueDepth b(3, 6); - - QueueDepth c = a - b; - BOOST_CHECK_EQUAL(2u, c.getCount()); - BOOST_CHECK_EQUAL(4u, c.getSize()); -} - -QPID_AUTO_TEST_SUITE_END() - -}} // namespace qpid::tests diff --git a/qpid/cpp/src/tests/QueueFlowLimitTest.cpp b/qpid/cpp/src/tests/QueueFlowLimitTest.cpp deleted file mode 100644 index b35294922d..0000000000 --- a/qpid/cpp/src/tests/QueueFlowLimitTest.cpp +++ /dev/null @@ -1,457 +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/QueueFlowLimit.h" -#include "qpid/broker/QueueSettings.h" -#include "qpid/sys/Time.h" -#include "qpid/framing/reply_exceptions.h" -#include "qpid/framing/FieldValue.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("", 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 boost::shared_ptr<qpid::broker::QueueFlowLimit> getQueueFlowLimit(const qpid::framing::FieldTable& arguments) - { - QueueSettings settings; - settings.populate(arguments, settings.storeSettings); - return QueueFlowLimit::createLimit("", settings); - } -}; - -Message createMessage(uint32_t size) -{ - static uint32_t seqNum; - //Need to compute what data size is required to make a given - //overall size (use one byte of content in test message to ensure - //content frame is added) - Message test = MessageUtils::createMessage(qpid::types::Variant::Map(), std::string("x")); - size_t min = test.getMessageSize() - 1; - if (min > size) throw qpid::Exception("Can't create message that small!"); - Message msg = MessageUtils::createMessage(qpid::types::Variant::Map(), std::string (size - min, 'x')); - msg.setSequence(++seqNum);//this doesn't affect message size - 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<Message> msgs; - for (size_t i = 0; i < 6; i++) { - msgs.push_back(createMessage(100)); - flow->enqueued(msgs.back()); - BOOST_CHECK(!flow->isFlowControlActive()); - } - BOOST_CHECK(!flow->isFlowControlActive()); // 6 on queue - msgs.push_back(createMessage(100)); - flow->enqueued(msgs.back()); - BOOST_CHECK(!flow->isFlowControlActive()); // 7 on queue - msgs.push_back(createMessage(100)); - flow->enqueued(msgs.back()); - BOOST_CHECK(flow->isFlowControlActive()); // 8 on queue, ON - msgs.push_back(createMessage(100)); - 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, 700); - args.setUInt64(QueueFlowLimit::flowResumeSizeKey, 460); - - 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) 700, flow->getFlowStopSize()); - BOOST_CHECK_EQUAL((uint32_t) 460, flow->getFlowResumeSize()); - BOOST_CHECK(!flow->isFlowControlActive()); - BOOST_CHECK(flow->monitorFlowControl()); - - std::deque<Message> msgs; - for (size_t i = 0; i < 6; i++) { - msgs.push_back(createMessage(100)); - flow->enqueued(msgs.back()); - BOOST_CHECK(!flow->isFlowControlActive()); - } - BOOST_CHECK(!flow->isFlowControlActive()); // 600 on queue - BOOST_CHECK_EQUAL(6u, flow->getFlowCount()); - BOOST_CHECK_EQUAL(600u, flow->getFlowSize()); - - Message msg_50 = createMessage(50); - flow->enqueued(msg_50); - BOOST_CHECK(!flow->isFlowControlActive()); // 650 on queue - Message tinyMsg_1 = createMessage(40); - flow->enqueued(tinyMsg_1); - BOOST_CHECK(!flow->isFlowControlActive()); // 690 on queue - - Message tinyMsg_2 = createMessage(40); - flow->enqueued(tinyMsg_2); - BOOST_CHECK(flow->isFlowControlActive()); // 730 on queue, ON - msgs.push_back(createMessage(100)); - flow->enqueued(msgs.back()); - BOOST_CHECK(flow->isFlowControlActive()); // 830 on queue - BOOST_CHECK_EQUAL(10u, flow->getFlowCount()); - BOOST_CHECK_EQUAL(830u, flow->getFlowSize()); - - flow->dequeued(msgs.front()); - msgs.pop_front(); - BOOST_CHECK(flow->isFlowControlActive()); // 730 on queue - flow->dequeued(msgs.front()); - msgs.pop_front(); - BOOST_CHECK(flow->isFlowControlActive()); // 630 on queue - flow->dequeued(msgs.front()); - msgs.pop_front(); - BOOST_CHECK(flow->isFlowControlActive()); // 530 on queue - - flow->dequeued(tinyMsg_1); - BOOST_CHECK(flow->isFlowControlActive()); // 490 on queue - flow->dequeued(tinyMsg_2); - BOOST_CHECK(!flow->isFlowControlActive()); // 450 on queue, OFF - - flow->dequeued(msg_50); - BOOST_CHECK(!flow->isFlowControlActive()); // 400 on queue - flow->dequeued(msgs.front()); - msgs.pop_front(); - BOOST_CHECK(!flow->isFlowControlActive()); // 300 on queue - flow->dequeued(msgs.front()); - msgs.pop_front(); - BOOST_CHECK(!flow->isFlowControlActive()); // 200 on queue - BOOST_CHECK_EQUAL(2u, flow->getFlowCount()); - BOOST_CHECK_EQUAL(200u, 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, 2000); - args.setUInt64(QueueFlowLimit::flowResumeSizeKey, 1000); - - std::deque<Message> msgs_50; - std::deque<Message> msgs_100; - std::deque<Message> msgs_500; - std::deque<Message> msgs_1000; - - Message 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_100.push_back(createMessage(100)); - flow->enqueued(msgs_100.back()); - BOOST_CHECK(!flow->isFlowControlActive()); - } - // count:10 size:1000 - - msgs_50.push_back(createMessage(50)); - flow->enqueued(msgs_50.back()); // count:11 size: 1050 ->ON - BOOST_CHECK(flow->isFlowControlActive()); - - for (size_t i = 0; i < 6; i++) { - flow->dequeued(msgs_100.front()); - msgs_100.pop_front(); - BOOST_CHECK(flow->isFlowControlActive()); - } - // count:5 size: 450 - - flow->dequeued(msgs_50.front()); // count: 4 size: 400 ->OFF - msgs_50.pop_front(); - BOOST_CHECK(!flow->isFlowControlActive()); - - for (size_t i = 0; i < 4; i++) { - flow->dequeued(msgs_100.front()); - msgs_100.pop_front(); - BOOST_CHECK(!flow->isFlowControlActive()); - } - // count:0 size:0 - - // verify flow control comes ON when only size passes its stop point. - - msgs_1000.push_back(createMessage(1000)); - flow->enqueued(msgs_1000.back()); // count:1 size: 1000 - BOOST_CHECK(!flow->isFlowControlActive()); - - msgs_500.push_back(createMessage(500)); - flow->enqueued(msgs_500.back()); // count:2 size: 1500 - BOOST_CHECK(!flow->isFlowControlActive()); - - msgs_500.push_back(createMessage(500)); - flow->enqueued(msgs_500.back()); // count:3 size: 2000 - BOOST_CHECK(!flow->isFlowControlActive()); - - msgs_50.push_back(createMessage(50)); - flow->enqueued(msgs_50.back()); // count:4 size: 2050 ->ON - BOOST_CHECK(flow->isFlowControlActive()); - - flow->dequeued(msgs_1000.front()); // count:3 size:1050 - msgs_1000.pop_front(); - BOOST_CHECK(flow->isFlowControlActive()); - - flow->dequeued(msgs_50.front()); // count:2 size:1000 - msgs_50.pop_front(); - BOOST_CHECK(flow->isFlowControlActive()); - - flow->dequeued(msgs_500.front()); // count:1 size:500 ->OFF - msgs_500.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_100.push_back(createMessage(100)); - flow->enqueued(msgs_100.back()); - BOOST_CHECK(!flow->isFlowControlActive()); - } - // count:9 size:1300 - - msgs_100.push_back(createMessage(100)); - flow->enqueued(msgs_100.back()); // count:10 size: 1400 - BOOST_CHECK(!flow->isFlowControlActive()); - - msgs_50.push_back(createMessage(50)); - flow->enqueued(msgs_50.back()); // count:11 size: 1450 ->ON - BOOST_CHECK(flow->isFlowControlActive()); - - msgs_1000.push_back(createMessage(1000)); - flow->enqueued(msgs_1000.back()); // count:12 size: 2450 (both thresholds crossed) - BOOST_CHECK(flow->isFlowControlActive()); - - // at this point: 9@100 + 1@500 + 1@1000 + 1@50 == 12@2450 - - flow->dequeued(msgs_500.front()); // count:11 size:1950 - msgs_500.pop_front(); - BOOST_CHECK(flow->isFlowControlActive()); - - for (size_t i = 0; i < 9; i++) { - flow->dequeued(msgs_100.front()); - msgs_100.pop_front(); - BOOST_CHECK(flow->isFlowControlActive()); - } - // count:2 size:1050 - flow->dequeued(msgs_50.front()); // count:1 size:1000 - msgs_50.pop_front(); - BOOST_CHECK(flow->isFlowControlActive()); // still active due to size - - flow->dequeued(msgs_1000.front()); // count:0 size:0 ->OFF - msgs_1000.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; - boost::shared_ptr<QueueFlowLimit> flow = TestFlow::getQueueFlowLimit(args); - BOOST_CHECK(flow); - - 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(0, // max queue byte count - 80, // 80% stop threshold - 70); // 70% resume threshold - { - FieldTable args; - args.setInt(QueueFlowLimit::flowStopCountKey, 35000); - args.setInt(QueueFlowLimit::flowResumeCountKey, 30000); -// args.setInt(QueueFlowLimit::flowStopSizeKey, 0); - - boost::shared_ptr<QueueFlowLimit> flow = TestFlow::getQueueFlowLimit(args); - BOOST_CHECK(flow); - - 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); - - boost::shared_ptr<QueueFlowLimit> flow = TestFlow::getQueueFlowLimit(args); - BOOST_CHECK(flow); - - 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); - - boost::shared_ptr<QueueFlowLimit> flow = TestFlow::getQueueFlowLimit(args); - BOOST_CHECK(flow); - - 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; - boost::shared_ptr<QueueFlowLimit> flow = TestFlow::getQueueFlowLimit(args); - BOOST_CHECK(flow); - - 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); - args.setInt(QueueFlowLimit::flowStopSizeKey, 0); - boost::shared_ptr<QueueFlowLimit> flow = TestFlow::getQueueFlowLimit(args); - BOOST_CHECK(!flow); - } -} - -QPID_AUTO_TEST_SUITE_END() - -}} // namespace qpid::tests diff --git a/qpid/cpp/src/tests/QueueOptionsTest.cpp b/qpid/cpp/src/tests/QueueOptionsTest.cpp deleted file mode 100644 index bdb83d7d22..0000000000 --- a/qpid/cpp/src/tests/QueueOptionsTest.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 <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.setOrdering(LVQ); - BOOST_CHECK(1 == ft.getAsInt(QueueOptions::strLastValueQueue)); - ft.setOrdering(FIFO); - 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_SUITE_END() - -}} // namespace qpid::tests diff --git a/qpid/cpp/src/tests/QueuePolicyTest.cpp b/qpid/cpp/src/tests/QueuePolicyTest.cpp deleted file mode 100644 index f61c283fd4..0000000000 --- a/qpid/cpp/src/tests/QueuePolicyTest.cpp +++ /dev/null @@ -1,300 +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/QueueFlowLimit.h" -#include "qpid/client/QueueOptions.h" -#include "qpid/sys/Time.h" -#include "qpid/framing/reply_exceptions.h" -#include "BrokerFixture.h" - -#include <boost/format.hpp> - -using namespace qpid::broker; -using namespace qpid::client; -using namespace qpid::framing; - -namespace qpid { -namespace tests { - -QPID_AUTO_TEST_SUITE(QueuePolicyTestSuite) - -QPID_AUTO_TEST_CASE(testRingPolicyCount) -{ - QueueOptions args; - args.setSizePolicy(RING, 0, 5); - - SessionFixture 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) -{ - //The message size now includes all headers as well as the content - //aka body, so compute the amount of data needed to hit a given - //overall size - std::string q("my-ring-queue"); - size_t minMessageSize = 25/*minimum size of headers*/ + q.size()/*routing key length*/ + 4/*default exchange, added by broker*/; - - std::string hundredBytes = std::string(100 - minMessageSize, 'h'); - std::string fourHundredBytes = std::string (400 - minMessageSize, 'f'); - std::string thousandBytes = std::string(1000 - minMessageSize, 't'); - - // Ring queue, 500 bytes maxSize - - QueueOptions args; - args.setSizePolicy(RING, 500, 0); - - SessionFixture f; - 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) -{ - QueueOptions args; - args.setSizePolicy(RING_STRICT, 0, 5); - args.setString("qpid.flow_stop_count", "0"); - - SessionFixture 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) -{ - QueueOptions args; - args.setSizePolicy(REJECT, 0, 5); - - SessionFixture 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); - - SessionFixture 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) -{ - QueueOptions args; - args.setSizePolicy(REJECT, 0, 5); - - SessionFixture 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"); - - SessionFixture 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/qpid/cpp/src/tests/QueueRegistryTest.cpp b/qpid/cpp/src/tests/QueueRegistryTest.cpp deleted file mode 100644 index 364d66c525..0000000000 --- a/qpid/cpp/src/tests/QueueRegistryTest.cpp +++ /dev/null @@ -1,91 +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 "qpid/broker/QueueSettings.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, QueueSettings()); - 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, QueueSettings()); - BOOST_CHECK_EQUAL(q, qc.first); - BOOST_CHECK(!qc.second); - - qc = reg.declare(bar, QueueSettings()); - q = qc.first; - BOOST_CHECK(q); - BOOST_CHECK_EQUAL(true, qc.second); - BOOST_CHECK_EQUAL(bar, q->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, QueueSettings()); - reg.declare(bar, QueueSettings()); - 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, QueueSettings()); - 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/qpid/cpp/src/tests/QueueTest.cpp b/qpid/cpp/src/tests/QueueTest.cpp deleted file mode 100644 index ee9d37e76d..0000000000 --- a/qpid/cpp/src/tests/QueueTest.cpp +++ /dev/null @@ -1,629 +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/framing/DeliveryProperties.h" -#include "qpid/framing/FieldTable.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/QueueFlowLimit.h" -#include "qpid/broker/QueueSettings.h" -#include "qpid/sys/Thread.h" -#include "qpid/sys/Timer.h" - -#include <iostream> -#include <vector> -#include <boost/format.hpp> -#include <boost/lexical_cast.hpp> - -using namespace std; -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; - - QueueCursor lastCursor; - Message lastMessage; - bool received; - TestConsumer(std::string name="test", bool acquire = true) : Consumer(name, acquire ? CONSUMER : BROWSER, ""), received(false) {}; - - virtual bool deliver(const QueueCursor& cursor, const Message& message){ - lastCursor = cursor; - lastMessage = message; - received = true; - return true; - }; - void notify() {} - void cancel() {} - void acknowledged(const DeliveryRecord&) {} - OwnershipToken* getSession() { return 0; } -}; - -class FailOnDeliver : public Deliverable -{ - 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; } -}; - -QPID_AUTO_TEST_SUITE(QueueTestSuite) - -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")); - 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); - exchange3->route(deliverable); -} - -QPID_AUTO_TEST_CASE(testLVQ){ - - QueueSettings settings; - string key="key"; - settings.lvqKey = key; - QueueFactory factory; - Queue::shared_ptr q(factory.create("my-queue", settings)); - - const char* values[] = { "a", "b", "c", "a"}; - for (size_t i = 0; i < sizeof(values)/sizeof(values[0]); ++i) { - qpid::types::Variant::Map properties; - properties[key] = values[i]; - q->deliver(MessageUtils::createMessage(properties, boost::lexical_cast<string>(i+1))); - } - BOOST_CHECK_EQUAL(q->getMessageCount(), 3u); - - TestConsumer::shared_ptr c(new TestConsumer("test", true)); - BOOST_CHECK(q->dispatch(c)); - BOOST_CHECK_EQUAL(std::string("2"), c->lastMessage.getContent()); - BOOST_CHECK(q->dispatch(c)); - BOOST_CHECK_EQUAL(std::string("3"), c->lastMessage.getContent()); - BOOST_CHECK(q->dispatch(c)); - BOOST_CHECK_EQUAL(std::string("4"), c->lastMessage.getContent()); - - - const char* values2[] = { "a", "b", "c"}; - for (size_t i = 0; i < sizeof(values2)/sizeof(values2[0]); ++i) { - qpid::types::Variant::Map properties; - properties[key] = values[i]; - q->deliver(MessageUtils::createMessage(properties, boost::lexical_cast<string>(i+5))); - } - BOOST_CHECK_EQUAL(q->getMessageCount(), 3u); - - BOOST_CHECK(q->dispatch(c)); - BOOST_CHECK_EQUAL(std::string("5"), c->lastMessage.getContent()); - BOOST_CHECK(q->dispatch(c)); - BOOST_CHECK_EQUAL(std::string("6"), c->lastMessage.getContent()); - BOOST_CHECK(q->dispatch(c)); - BOOST_CHECK_EQUAL(std::string("7"), c->lastMessage.getContent()); -} - -QPID_AUTO_TEST_CASE(testLVQEmptyKey){ - - QueueSettings settings; - string key="key"; - settings.lvqKey = key; - QueueFactory factory; - Queue::shared_ptr q(factory.create("my-queue", settings)); - - - qpid::types::Variant::Map properties; - properties["key"] = "a"; - q->deliver(MessageUtils::createMessage(properties, "one")); - properties.clear(); - q->deliver(MessageUtils::createMessage(properties, "two")); - BOOST_CHECK_EQUAL(q->getMessageCount(), 2u); -} - -void addMessagesToQueue(uint count, Queue& queue, uint oddTtl = 200, uint evenTtl = 0) -{ - for (uint i = 0; i < count; i++) { - Message m = MessageUtils::createMessage("exchange", "key", i % 2 ? oddTtl : evenTtl); - 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(0); - BOOST_CHECK_EQUAL(queue.getMessageCount(), 5u); -} - -QPID_AUTO_TEST_CASE(testQueueCleaner) { - boost::shared_ptr<Poller> poller(new Poller); - Thread runner(poller.get()); - Timer timer; - QueueRegistry queues; - Queue::shared_ptr queue = queues.declare("my-queue", QueueSettings()).first; - addMessagesToQueue(10, *queue, 200, 400); - BOOST_CHECK_EQUAL(queue->getMessageCount(), 10u); - - QueueCleaner cleaner(queues, poller, &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); - poller->shutdown(); - runner.join(); -} -namespace { -int getIntProperty(const Message& message, const std::string& key) -{ - qpid::types::Variant v = message.getProperty(key); - int i(0); - if (!v.isVoid()) i = v; - return i; -} -// helper for group tests -void verifyAcquire( Queue::shared_ptr queue, - TestConsumer::shared_ptr c, - std::deque<QueueCursor>& results, - const std::string& expectedGroup, - const int expectedId ) -{ - bool success = queue->dispatch(c); - BOOST_CHECK(success); - if (success) { - results.push_back(c->lastCursor); - std::string group = c->lastMessage.getPropertyAsString("GROUP-ID"); - int id = getIntProperty(c->lastMessage, "MY-ID"); - BOOST_CHECK_EQUAL( group, expectedGroup ); - BOOST_CHECK_EQUAL( id, expectedId ); - } -} - -Message createGroupMessage(int id, const std::string& group) -{ - qpid::types::Variant::Map properties; - properties["GROUP-ID"] = group; - properties["MY-ID"] = id; - return MessageUtils::createMessage(properties); -} -} - -QPID_AUTO_TEST_CASE(testGroupsMultiConsumer) { - // - // Verify that consumers of grouped messages own the groups once a message is acquired, - // and release the groups once all acquired messages have been dequeued or requeued - // - QueueSettings settings; - settings.shareGroups = 1; - settings.groupKey = "GROUP-ID"; - QueueFactory factory; - Queue::shared_ptr queue(factory.create("my_queue", settings)); - - std::string groups[] = { std::string("a"), std::string("a"), std::string("a"), - std::string("b"), std::string("b"), std::string("b"), - std::string("c"), std::string("c"), std::string("c") }; - for (int i = 0; i < 9; ++i) { - queue->deliver(createGroupMessage(i, groups[i])); - } - - // Queue = a-0, a-1, a-2, b-3, b-4, b-5, c-6, c-7, c-8... - // Owners= ---, ---, ---, ---, ---, ---, ---, ---, ---, - - BOOST_CHECK_EQUAL(uint32_t(9), queue->getMessageCount()); - - TestConsumer::shared_ptr c1(new TestConsumer("C1")); - TestConsumer::shared_ptr c2(new TestConsumer("C2")); - - queue->consume(c1); - queue->consume(c2); - - std::deque<QueueCursor> dequeMeC1; - std::deque<QueueCursor> dequeMeC2; - - - verifyAcquire(queue, c1, dequeMeC1, "a", 0 ); // c1 now owns group "a" (acquire a-0) - verifyAcquire(queue, c2, dequeMeC2, "b", 3 ); // c2 should now own group "b" (acquire b-3) - - // now let c1 complete the 'a-0' message - this should free the 'a' group - queue->dequeue( 0, dequeMeC1.front() ); - dequeMeC1.pop_front(); - - // Queue = a-1, a-2, b-3, b-4, b-5, c-6, c-7, c-8... - // Owners= ---, ---, ^C2, ^C2, ^C2, ---, ---, --- - - // now c2 should pick up the next 'a-1', since it is oldest free - verifyAcquire(queue, c2, dequeMeC2, "a", 1 ); // c2 should now own groups "a" and "b" - - // Queue = a-1, a-2, b-3, b-4, b-5, c-6, c-7, c-8... - // Owners= ^C2, ^C2, ^C2, ^C2, ^C2, ---, ---, --- - - // c1 should only be able to snarf up the first "c" message now... - verifyAcquire(queue, c1, dequeMeC1, "c", 6 ); // should skip to the first "c" - - // Queue = a-1, a-2, b-3, b-4, b-5, c-6, c-7, c-8... - // Owners= ^C2, ^C2, ^C2, ^C2, ^C2, ^C1, ^C1, ^C1 - - // hmmm... what if c2 now dequeues "b-3"? (now only has a-1 acquired) - queue->dequeue( 0, dequeMeC2.front() ); - dequeMeC2.pop_front(); - - // Queue = a-1, a-2, b-4, b-5, c-6, c-7, c-8... - // Owners= ^C2, ^C2, ---, ---, ^C1, ^C1, ^C1 - - // b group is free, c is owned by c1 - c1's next get should grab 'b-4' - verifyAcquire(queue, c1, dequeMeC1, "b", 4 ); - - // Queue = a-1, a-2, b-4, b-5, c-6, c-7, c-8... - // Owners= ^C2, ^C2, ^C1, ^C1, ^C1, ^C1, ^C1 - - // c2 can now only grab a-2, and that's all - verifyAcquire(queue, c2, dequeMeC2, "a", 2 ); - - // now C2 can't get any more, since C1 owns "b" and "c" group... - bool gotOne = queue->dispatch(c2); - BOOST_CHECK( !gotOne ); - - // hmmm... what if c1 now dequeues "c-6"? (now only own's b-4) - queue->dequeue( 0, dequeMeC1.front() ); - dequeMeC1.pop_front(); - - // Queue = a-1, a-2, b-4, b-5, c-7, c-8... - // Owners= ^C2, ^C2, ^C1, ^C1, ---, --- - - // c2 can now grab c-7 - verifyAcquire(queue, c2, dequeMeC2, "c", 7 ); - - // Queue = a-1, a-2, b-4, b-5, c-7, c-8... - // Owners= ^C2, ^C2, ^C1, ^C1, ^C2, ^C2 - - // what happens if C-2 "requeues" a-1 and a-2? - queue->release( dequeMeC2.front() ); - dequeMeC2.pop_front(); - queue->release( dequeMeC2.front() ); - dequeMeC2.pop_front(); // now just has c-7 acquired - - // Queue = a-1, a-2, b-4, b-5, c-7, c-8... - // Owners= ---, ---, ^C1, ^C1, ^C2, ^C2 - - // now c1 will grab a-1 and a-2... - verifyAcquire(queue, c1, dequeMeC1, "a", 1 ); - verifyAcquire(queue, c1, dequeMeC1, "a", 2 ); - - // Queue = a-1, a-2, b-4, b-5, c-7, c-8... - // Owners= ^C1, ^C1, ^C1, ^C1, ^C2, ^C2 - - // c2 can now acquire c-8 only - verifyAcquire(queue, c2, dequeMeC2, "c", 8 ); - - // and c1 can get b-5 - verifyAcquire(queue, c1, dequeMeC1, "b", 5 ); - - // should be no more acquire-able for anyone now: - gotOne = queue->dispatch(c1); - BOOST_CHECK( !gotOne ); - gotOne = queue->dispatch(c2); - BOOST_CHECK( !gotOne ); - - // release all of C1's acquired messages, then cancel C1 - while (!dequeMeC1.empty()) { - queue->release(dequeMeC1.front()); - dequeMeC1.pop_front(); - } - queue->cancel(c1); - - // Queue = a-1, a-2, b-4, b-5, c-7, c-8... - // Owners= ---, ---, ---, ---, ^C2, ^C2 - - // b-4, a-1, a-2, b-5 all should be available, right? - verifyAcquire(queue, c2, dequeMeC2, "a", 1 ); - - while (!dequeMeC2.empty()) { - queue->dequeue(0, dequeMeC2.front()); - dequeMeC2.pop_front(); - } - - // Queue = a-2, b-4, b-5 - // Owners= ---, ---, --- - - TestConsumer::shared_ptr c3(new TestConsumer("C3")); - queue->consume(c3); - std::deque<QueueCursor> dequeMeC3; - - verifyAcquire(queue, c3, dequeMeC3, "a", 2 ); - verifyAcquire(queue, c2, dequeMeC2, "b", 4 ); - - // Queue = a-2, b-4, b-5 - // Owners= ^C3, ^C2, ^C2 - - gotOne = queue->dispatch(c3); - BOOST_CHECK( !gotOne ); - - verifyAcquire(queue, c2, dequeMeC2, "b", 5 ); - - while (!dequeMeC2.empty()) { - queue->dequeue(0, dequeMeC2.front()); - dequeMeC2.pop_front(); - } - - // Queue = a-2, - // Owners= ^C3, - queue->deliver(createGroupMessage(9, "a")); - - // Queue = a-2, a-9 - // Owners= ^C3, ^C3 - - gotOne = queue->dispatch(c2); - BOOST_CHECK( !gotOne ); - - queue->deliver(createGroupMessage(10, "b")); - - // Queue = a-2, a-9, b-10 - // Owners= ^C3, ^C3, ---- - - verifyAcquire(queue, c2, dequeMeC2, "b", 10 ); - verifyAcquire(queue, c3, dequeMeC3, "a", 9 ); - - gotOne = queue->dispatch(c3); - BOOST_CHECK( !gotOne ); - - queue->cancel(c2); - queue->cancel(c3); -} - - -QPID_AUTO_TEST_CASE(testGroupsMultiConsumerDefaults) { - // - // Verify that the same default group name is automatically applied to messages that - // do not specify a group name. - // - QueueSettings settings; - settings.shareGroups = 1; - settings.groupKey = "GROUP-ID"; - QueueFactory factory; - Queue::shared_ptr queue(factory.create("my_queue", settings)); - - for (int i = 0; i < 3; ++i) { - qpid::types::Variant::Map properties; - // no "GROUP-ID" header - properties["MY-ID"] = i; - queue->deliver(MessageUtils::createMessage(properties)); - } - - // Queue = 0, 1, 2 - - BOOST_CHECK_EQUAL(uint32_t(3), queue->getMessageCount()); - - TestConsumer::shared_ptr c1(new TestConsumer("C1")); - TestConsumer::shared_ptr c2(new TestConsumer("C2")); - - queue->consume(c1); - queue->consume(c2); - - std::deque<QueueCursor> dequeMeC1; - std::deque<QueueCursor> dequeMeC2; - - queue->dispatch(c1); // c1 now owns default group (acquired 0) - dequeMeC1.push_back(c1->lastCursor); - int id = getIntProperty(c1->lastMessage, "MY-ID"); - BOOST_CHECK_EQUAL( id, 0 ); - - bool gotOne = queue->dispatch(c2); // c2 should get nothing - BOOST_CHECK( !gotOne ); - - queue->dispatch(c1); // c1 now acquires 1 - dequeMeC1.push_back(c1->lastCursor); - id = getIntProperty(c1->lastMessage, "MY-ID"); - BOOST_CHECK_EQUAL( id, 1 ); - - gotOne = queue->dispatch(c2); // c2 should still get nothing - BOOST_CHECK( !gotOne ); - - while (!dequeMeC1.empty()) { - queue->dequeue(0, dequeMeC1.front()); - dequeMeC1.pop_front(); - } - - // now default group should be available... - queue->dispatch(c2); // c2 now owns default group (acquired 2) - id = c2->lastMessage.getProperty("MY-ID"); - BOOST_CHECK_EQUAL( id, 2 ); - - gotOne = queue->dispatch(c1); // c1 should get nothing - BOOST_CHECK( !gotOne ); - - queue->cancel(c1); - queue->cancel(c2); -} - -QPID_AUTO_TEST_CASE(testSetPositionFifo) { - Queue::shared_ptr q(new Queue("my-queue", true)); - BOOST_CHECK_EQUAL(q->getPosition(), SequenceNumber(0)); - for (int i = 0; i < 10; ++i) - q->deliver(MessageUtils::createMessage(qpid::types::Variant::Map(), boost::lexical_cast<string>(i+1))); - - // Verify the front of the queue - TestConsumer::shared_ptr c(new TestConsumer("test", false)); // Don't acquire - BOOST_CHECK(q->dispatch(c)); - BOOST_CHECK_EQUAL(1u, c->lastMessage.getSequence()); // Numbered from 1 - BOOST_CHECK_EQUAL("1", c->lastMessage.getContent()); - - // Verify the back of the queue - BOOST_CHECK_EQUAL(10u, q->getPosition()); - BOOST_CHECK_EQUAL(10u, q->getMessageCount()); - - // Using setPosition to introduce a gap in sequence numbers. - q->setPosition(15); - BOOST_CHECK_EQUAL(10u, q->getMessageCount()); - BOOST_CHECK_EQUAL(15u, q->getPosition()); - q->deliver(MessageUtils::createMessage(qpid::types::Variant::Map(), "16")); - - q->seek(*c, Queue::MessagePredicate(), 9); - BOOST_CHECK(q->dispatch(c)); - BOOST_CHECK_EQUAL(10u, c->lastMessage.getSequence()); - BOOST_CHECK_EQUAL("10", c->lastMessage.getContent()); - BOOST_CHECK(q->dispatch(c)); - BOOST_CHECK_EQUAL(16u, c->lastMessage.getSequence()); - BOOST_CHECK_EQUAL("16", c->lastMessage.getContent()); - - // Using setPosition to trunkcate the queue - q->setPosition(5); - BOOST_CHECK_EQUAL(5u, q->getMessageCount()); - q->deliver(MessageUtils::createMessage(qpid::types::Variant::Map(), "6a")); - c = boost::shared_ptr<TestConsumer>(new TestConsumer("test", false)); // Don't acquire - q->seek(*c, Queue::MessagePredicate(), 4); - BOOST_CHECK(q->dispatch(c)); - BOOST_CHECK_EQUAL(5u, c->lastMessage.getSequence()); - BOOST_CHECK_EQUAL("5", c->lastMessage.getContent()); - BOOST_CHECK(q->dispatch(c)); - BOOST_CHECK_EQUAL(6u, c->lastMessage.getSequence()); - BOOST_CHECK_EQUAL("6a", c->lastMessage.getContent()); - BOOST_CHECK(!q->dispatch(c)); // No more messages. -} - -QPID_AUTO_TEST_CASE(testSetPositionLvq) { - QueueSettings settings; - string key="key"; - settings.lvqKey = key; - QueueFactory factory; - Queue::shared_ptr q(factory.create("my-queue", settings)); - - const char* values[] = { "a", "b", "c", "a", "b", "c" }; - for (size_t i = 0; i < sizeof(values)/sizeof(values[0]); ++i) { - qpid::types::Variant::Map properties; - properties[key] = values[i]; - q->deliver(MessageUtils::createMessage(properties, boost::lexical_cast<string>(i+1))); - } - BOOST_CHECK_EQUAL(3u, q->getMessageCount()); - // Verify the front of the queue - TestConsumer::shared_ptr c(new TestConsumer("test", false)); // Don't acquire - BOOST_CHECK(q->dispatch(c)); - BOOST_CHECK_EQUAL(4u, c->lastMessage.getSequence()); // Numbered from 1 - BOOST_CHECK_EQUAL("4", c->lastMessage.getContent()); - // Verify the back of the queue - BOOST_CHECK_EQUAL(6u, q->getPosition()); - - q->setPosition(5); - - c = boost::shared_ptr<TestConsumer>(new TestConsumer("test", false)); // Don't acquire - q->seek(*c, Queue::MessagePredicate(), 4); - BOOST_CHECK(q->dispatch(c)); - BOOST_CHECK_EQUAL(5u, c->lastMessage.getSequence()); // Numbered from 1 - BOOST_CHECK(!q->dispatch(c)); -} - -QPID_AUTO_TEST_CASE(testSetPositionPriority) { - QueueSettings settings; - settings.priorities = 10; - QueueFactory factory; - Queue::shared_ptr q(factory.create("my-queue", settings)); - - const int priorities[] = { 1, 2, 3, 2, 1, 3 }; - for (size_t i = 0; i < sizeof(priorities)/sizeof(priorities[0]); ++i) { - qpid::types::Variant::Map properties; - properties["priority"] = priorities[i]; - q->deliver(MessageUtils::createMessage(properties, boost::lexical_cast<string>(i+1))); - } - - // Truncation removes messages in fifo order, not priority order. - q->setPosition(3); - TestConsumer::shared_ptr c(new TestConsumer("test", false)); // Browse in priority order - BOOST_CHECK(q->dispatch(c)); - BOOST_CHECK_EQUAL(3u, c->lastMessage.getSequence()); - BOOST_CHECK(q->dispatch(c)); - BOOST_CHECK_EQUAL(2u, c->lastMessage.getSequence()); - BOOST_CHECK(q->dispatch(c)); - BOOST_CHECK_EQUAL(1u, c->lastMessage.getSequence()); - BOOST_CHECK(!q->dispatch(c)); - - qpid::types::Variant::Map properties; - properties["priority"] = 4; - q->deliver(MessageUtils::createMessage(properties, "4a")); - - BOOST_CHECK(q->dispatch(c)); - BOOST_CHECK_EQUAL(4u, c->lastMessage.getSequence()); - BOOST_CHECK_EQUAL("4a", c->lastMessage.getContent()); - - // But consumers see priority order - c.reset(new TestConsumer("test", true)); - BOOST_CHECK(q->dispatch(c)); - BOOST_CHECK_EQUAL(4u, c->lastMessage.getSequence()); - BOOST_CHECK_EQUAL("4a", c->lastMessage.getContent()); - BOOST_CHECK(q->dispatch(c)); - BOOST_CHECK_EQUAL(3u, c->lastMessage.getSequence()); - BOOST_CHECK_EQUAL("3", c->lastMessage.getContent()); - BOOST_CHECK(q->dispatch(c)); - BOOST_CHECK_EQUAL(2u, c->lastMessage.getSequence()); - BOOST_CHECK_EQUAL("2", c->lastMessage.getContent()); - BOOST_CHECK(q->dispatch(c)); - BOOST_CHECK_EQUAL(1u, c->lastMessage.getSequence()); - BOOST_CHECK_EQUAL("1", c->lastMessage.getContent()); -} - -QPID_AUTO_TEST_SUITE_END() - -}} // namespace qpid::tests diff --git a/qpid/cpp/src/tests/README.txt b/qpid/cpp/src/tests/README.txt deleted file mode 100644 index 50bd181ab0..0000000000 --- a/qpid/cpp/src/tests/README.txt +++ /dev/null @@ -1,30 +0,0 @@ -= Running Qpid C++ tests = - -General philosophy is that "make test" run all tests by default, but -developers can run tests selectively as explained below. - -== Unit Tests == - -Unit tests use the boost test framework, and are compiled to the programd -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. - -== System Tests == - -System tests are executables or scripts. You can run executable tests -directly as well as via "make test" or "ctest". Some tests require -environment settings which are set by src/tests/env.sh on Unix or by -src/tests/env.ps1 on Windows. - -== Running selected tests == - -The make target "make test" simply runs the command "ctest". Running ctest -directly gives you additional options, e.g. - - ctest -R <regexp> -VV - -This runs tests with names matching the regular expression <regexp> and will -print the full output of the tests rather than just listing which tests pass or -fail. diff --git a/qpid/cpp/src/tests/RangeSet.cpp b/qpid/cpp/src/tests/RangeSet.cpp deleted file mode 100644 index 285f432bf7..0000000000 --- a/qpid/cpp/src/tests/RangeSet.cpp +++ /dev/null @@ -1,154 +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> TR; // Test Range -typedef RangeSet<int> TRSet; - -QPID_AUTO_TEST_CASE(testEmptyRange) { - TR r; - BOOST_CHECK_EQUAL(r, TR(0,0)); - BOOST_CHECK(r.empty()); - BOOST_CHECK(!r.contains(0)); -} - -QPID_AUTO_TEST_CASE(testRangeSetAddPoint) { - TRSet r; - BOOST_CHECK(r.empty()); - r += 3; - BOOST_CHECK_MESSAGE(r.contains(3), r); - BOOST_CHECK_MESSAGE(r.contains(TR(3,4)), r); - BOOST_CHECK(!r.empty()); - r += 5; - BOOST_CHECK_MESSAGE(r.contains(5), r); - BOOST_CHECK_MESSAGE(r.contains(TR(5,6)), r); - BOOST_CHECK_MESSAGE(!r.contains(TR(3,6)), r); - r += 4; - BOOST_CHECK_MESSAGE(r.contains(TR(3,6)), r); -} - -QPID_AUTO_TEST_CASE(testRangeSetAddRange) { - TRSet r; - r += TR(0,3); - BOOST_CHECK(r.contains(TR(0,3))); - BOOST_CHECK(r.contiguous()); - r += TR(4,6); - BOOST_CHECK(!r.contiguous()); - BOOST_CHECK_MESSAGE(r.contains(TR(4,6)), r); - r += 3; - BOOST_CHECK_MESSAGE(r.contains(TR(0,6)), r); - BOOST_CHECK(r.front() == 0); - BOOST_CHECK(r.back() == 6); - - // Merging additions - r = TRSet(0,3)+TR(5,6); - TRSet e(0,6); - BOOST_CHECK_EQUAL(r + TR(3,5), e); - BOOST_CHECK(e.contiguous()); - r = TRSet(0,5)+TR(10,15)+TR(20,25)+TR(30,35)+TR(40,45); - BOOST_CHECK_EQUAL(r + TR(11,37), TRSet(0,5)+TR(11,37)+TR(40,45)); -} - -QPID_AUTO_TEST_CASE(testRangeSetAddSet) { - TRSet r; - TRSet s = TRSet(0,3)+TR(5,10); - r += s; - BOOST_CHECK_EQUAL(r,s); - r += TRSet(3,5) + TR(7,12) + 15; - BOOST_CHECK_EQUAL(r, TRSet(0,12) + 15); - - r.clear(); - BOOST_CHECK(r.empty()); - r += TR::makeClosed(6,10); - BOOST_CHECK_EQUAL(r, TRSet(6,11)); - r += TRSet(2,6)+8; - BOOST_CHECK_EQUAL(r, TRSet(2,11)); -} - -QPID_AUTO_TEST_CASE(testRangeSetIterate) { - TRSet r = TRSet(1,3)+TR(4,7)+TR(10,11); - 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(TRSet(0,5)-3, TRSet(0,3)+TR(4,5)); - BOOST_CHECK_EQUAL(TRSet(1,5)-5, TRSet(1,5)); - BOOST_CHECK_EQUAL(TRSet(1,5)-0, TRSet(1,5)); - - TRSet r(TRSet(0,5)+TR(10,15)+TR(20,25)); - - // TRs - BOOST_CHECK_EQUAL(r-TR(0,5), TRSet(10,15)+TR(20,25)); - BOOST_CHECK_EQUAL(r-TR(10,15), TRSet(0,5)+TR(20,25)); - BOOST_CHECK_EQUAL(r-TR(20,25), TRSet(0,5)+TR(10,15)); - - BOOST_CHECK_EQUAL(r-TR(-5, 30), TRSet()); - - BOOST_CHECK_EQUAL(r-TR(-5, 7), TRSet(10,15)+TR(20,25)); - BOOST_CHECK_EQUAL(r-TR(8,19), TRSet(0,5)+TR(20,25)); - BOOST_CHECK_EQUAL(r-TR(17,30), TRSet(0,5)+TR(10,15)); - - BOOST_CHECK_EQUAL(r-TR(-5, 5), TRSet(10,15)+TR(20,25)); - BOOST_CHECK_EQUAL(r-TR(10,19), TRSet(0,5)+TR(20,25)); - BOOST_CHECK_EQUAL(r-TR(18,25), TRSet(0,5)+TR(10,15)); - BOOST_CHECK_EQUAL(r-TR(23,25), TRSet(0,5)+TR(10,15)+TR(20,23)); - - BOOST_CHECK_EQUAL(r-TR(-3, 3), TRSet(3,5)+TR(10,15)+TR(20,25)); - BOOST_CHECK_EQUAL(r-TR(3, 7), TRSet(0,2)+TR(10,15)+TR(20,25)); - BOOST_CHECK_EQUAL(r-TR(3, 12), TRSet(0,3)+TR(12,15)+TR(20,25)); - BOOST_CHECK_EQUAL(r-TR(3, 22), TRSet(12,15)+TR(22,25)); - BOOST_CHECK_EQUAL(r-TR(12, 22), TRSet(0,5)+TR(10,11)+TR(22,25)); - - // Sets - BOOST_CHECK_EQUAL(r-(TRSet(-1,6)+TR(11,14)+TR(23,25)), - TRSet(10,11)+TR(14,15)+TR(20,23)); - // Split the ranges - BOOST_CHECK_EQUAL(r-(TRSet(2,3)+TR(11,13)+TR(21,23)), - TRSet(0,2)+TR(4,5)+ - TR(10,11)+TR(14,15)+ - TR(20,21)+TR(23,25)); - // Truncate the ranges - BOOST_CHECK_EQUAL(r-(TRSet(0,3)+TR(13,15)+TR(19,23)), - TRSet(3,5)+TR(10,13)+TR(20,23)); - // Remove multiple ranges with truncation - BOOST_CHECK_EQUAL(r-(TRSet(3,23)), TRSet(0,3)+TR(23,25)); - // Remove multiple ranges in middle - TRSet r2 = TRSet(0,5)+TR(10,15)+TR(20,25)+TR(30,35); - BOOST_CHECK_EQUAL(r2-TRSet(11,24), - TRSet(0,5)+TR(10,11)+TR(24,25)+TR(30,35)); -} - -QPID_AUTO_TEST_SUITE_END() - -}} // namespace qpid::tests diff --git a/qpid/cpp/src/tests/RefCounted.cpp b/qpid/cpp/src/tests/RefCounted.cpp deleted file mode 100644 index 3ac3895322..0000000000 --- a/qpid/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" - -namespace qpid { -namespace tests { - -QPID_AUTO_TEST_SUITE(RefCountedTestSuiteTestSuite) - -using boost::intrusive_ptr; -using namespace std; -using namespace qpid; - -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/qpid/cpp/src/tests/RetryList.cpp b/qpid/cpp/src/tests/RetryList.cpp deleted file mode 100644 index 50cd5edfe8..0000000000 --- a/qpid/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/qpid/cpp/src/tests/Selector.cpp b/qpid/cpp/src/tests/Selector.cpp deleted file mode 100644 index 6995420f17..0000000000 --- a/qpid/cpp/src/tests/Selector.cpp +++ /dev/null @@ -1,501 +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/SelectorToken.h" -#include "qpid/broker/Selector.h" -#include "qpid/broker/SelectorValue.h" - -#include "unit_test.h" - -#include <string> -#include <map> -#include <boost/ptr_container/ptr_vector.hpp> - -using std::string; -using std::map; -using std::vector; - -namespace qb = qpid::broker; - -using qpid::broker::Token; -using qpid::broker::TokenType; -using qpid::broker::Tokeniser; -using qpid::broker::tokenise; - -namespace qpid { -namespace tests { - -QPID_AUTO_TEST_SUITE(SelectorSuite) - -typedef bool (*TokeniseF)(string::const_iterator&,string::const_iterator&,Token&); - -bool tokeniseEos(std::string::const_iterator& s, std::string::const_iterator& e, Token& tok) -{ - Token t1; - std::string::const_iterator t = s; - bool r = tokenise(t, e, t1); - if (r && (t1.type==qb::T_EOS)) {tok = t1; s = t; return true;} - return false; -} - -bool tokeniseParens(std::string::const_iterator& s, std::string::const_iterator& e, Token& tok) -{ - Token t1; - std::string::const_iterator t = s; - bool r = tokenise(t, e, t1); - if (r && (t1.type==qb::T_LPAREN || t1.type==qb::T_RPAREN)) {tok = t1; s = t; return true;} - return false; -} - -bool tokeniseOperator(std::string::const_iterator& s, std::string::const_iterator& e, Token& tok) -{ - Token t1; - std::string::const_iterator t = s; - bool r = tokenise(t, e, t1); - if (r && (t1.type>=qb::T_PLUS && t1.type<=qb::T_GREQ)) {tok = t1; s = t; return true;} - return false; -} - -bool tokeniseString(std::string::const_iterator& s, std::string::const_iterator& e, Token& tok) -{ - Token t1; - std::string::const_iterator t = s; - bool r = tokenise(t, e, t1); - if (r && (t1.type==qb::T_STRING)) {tok = t1; s = t; return true;} - return false; -} - -bool tokeniseIdentifier(std::string::const_iterator& s, std::string::const_iterator& e, Token& tok) -{ - Token t1; - std::string::const_iterator t = s; - bool r = tokenise(t, e, t1); - if (r && (t1.type==qb::T_IDENTIFIER)) {tok = t1; s = t; return true;} - return false; -} - -bool tokeniseReservedWord(std::string::const_iterator& s, std::string::const_iterator& e, Token& tok) -{ - std::string::const_iterator t = s; - Token t1; - if (tokenise(t, e, t1)) { - switch (t1.type) { - case qb::T_AND: - case qb::T_BETWEEN: - case qb::T_ESCAPE: - case qb::T_FALSE: - case qb::T_IN: - case qb::T_IS: - case qb::T_LIKE: - case qb::T_NOT: - case qb::T_NULL: - case qb::T_OR: - case qb::T_TRUE: - tok = t1; - s = t; - return true; - default: - break; - } - } - return false; -} - -bool tokeniseNumeric(std::string::const_iterator& s, std::string::const_iterator& e, Token& tok) -{ - Token t1; - std::string::const_iterator t = s; - bool r = tokenise(t, e, t1); - if (r && (t1.type==qb::T_NUMERIC_EXACT || t1.type==qb::T_NUMERIC_APPROX)) {tok = t1; s = t; return true;} - return false; -} - - -void verifyTokeniserSuccess(TokeniseF t, const char* ss, TokenType tt, const char* tv, const char* fs) { - Token tok; - string s(ss); - string::const_iterator sb = s.begin(); - string::const_iterator se = s.end(); - BOOST_CHECK(t(sb, se, tok)); - BOOST_CHECK_EQUAL(tok, Token(tt, tv)); - BOOST_CHECK_EQUAL(string(sb, se), fs); -} - -void verifyTokeniserFail(TokeniseF t, const char* c) { - Token tok; - string s(c); - string::const_iterator sb = s.begin(); - string::const_iterator se = s.end(); - BOOST_CHECK(!t(sb, se, tok)); - BOOST_CHECK_EQUAL(string(sb, se), c); -} - -QPID_AUTO_TEST_CASE(tokeniseSuccess) -{ - verifyTokeniserSuccess(&tokenise, "", qb::T_EOS, "", ""); - verifyTokeniserSuccess(&tokenise, " ", qb::T_EOS, "", ""); - verifyTokeniserSuccess(&tokenise, "null_123+blah", qb::T_IDENTIFIER, "null_123", "+blah"); - verifyTokeniserSuccess(&tokenise, "\"null-123\"+blah", qb::T_IDENTIFIER, "null-123", "+blah"); - verifyTokeniserSuccess(&tokenise, "\"This is an \"\"odd!\"\" identifier\"+blah", qb::T_IDENTIFIER, "This is an \"odd!\" identifier", "+blah"); - verifyTokeniserSuccess(&tokenise, "null+blah", qb::T_NULL, "null", "+blah"); - verifyTokeniserSuccess(&tokenise, "null+blah", qb::T_NULL, "null", "+blah"); - verifyTokeniserSuccess(&tokenise, "Is nOt null", qb::T_IS, "Is", " nOt null"); - verifyTokeniserSuccess(&tokenise, "nOt null", qb::T_NOT, "nOt", " null"); - verifyTokeniserSuccess(&tokenise, "Is nOt null", qb::T_IS, "Is", " nOt null"); - verifyTokeniserSuccess(&tokenise, "'Hello World'", qb::T_STRING, "Hello World", ""); - verifyTokeniserSuccess(&tokenise, "'Hello World''s end'a bit more", qb::T_STRING, "Hello World's end", "a bit more"); - verifyTokeniserSuccess(&tokenise, "=blah", qb::T_EQUAL, "=", "blah"); - verifyTokeniserSuccess(&tokenise, "<> Identifier", qb::T_NEQ, "<>", " Identifier"); - verifyTokeniserSuccess(&tokenise, "(a and b) not c", qb::T_LPAREN, "(", "a and b) not c"); - verifyTokeniserSuccess(&tokenise, ") not c", qb::T_RPAREN, ")", " not c"); - verifyTokeniserSuccess(&tokenise, "017kill", qb::T_NUMERIC_EXACT, "017", "kill"); - verifyTokeniserSuccess(&tokenise, "019kill", qb::T_NUMERIC_EXACT, "01", "9kill"); - verifyTokeniserSuccess(&tokenise, "0kill", qb::T_NUMERIC_EXACT, "0", "kill"); - verifyTokeniserSuccess(&tokenise, "0.kill", qb::T_NUMERIC_APPROX, "0.", "kill"); - verifyTokeniserSuccess(&tokenise, "3.1415=pi", qb::T_NUMERIC_APPROX, "3.1415", "=pi"); - verifyTokeniserSuccess(&tokenise, ".25.kill", qb::T_NUMERIC_APPROX, ".25", ".kill"); - verifyTokeniserSuccess(&tokenise, "2e5.kill", qb::T_NUMERIC_APPROX, "2e5", ".kill"); - verifyTokeniserSuccess(&tokenise, "3.e50easy to kill", qb::T_NUMERIC_APPROX, "3.e50", "easy to kill"); - verifyTokeniserSuccess(&tokenise, "34.25e+50easy to kill", qb::T_NUMERIC_APPROX, "34.25e+50", "easy to kill"); - verifyTokeniserSuccess(&tokenise, "34de", qb::T_NUMERIC_APPROX, "34d", "e"); - verifyTokeniserSuccess(&tokenise, "34fuller", qb::T_NUMERIC_APPROX, "34f", "uller"); - verifyTokeniserSuccess(&tokenise, "34Longer", qb::T_NUMERIC_EXACT, "34L", "onger"); - verifyTokeniserSuccess(&tokenise, "34littler", qb::T_NUMERIC_EXACT, "34l", "ittler"); - verifyTokeniserSuccess(&tokenise, "034Longer", qb::T_NUMERIC_EXACT, "034L", "onger"); - verifyTokeniserSuccess(&tokenise, "034littler", qb::T_NUMERIC_EXACT, "034l", "ittler"); - verifyTokeniserSuccess(&tokenise, "0X34littler", qb::T_NUMERIC_EXACT, "0X34l", "ittler"); - verifyTokeniserSuccess(&tokenise, "0X3456_fffflittler", qb::T_NUMERIC_EXACT, "0X3456_ffffl", "ittler"); - verifyTokeniserSuccess(&tokenise, "0xdead_beafittler", qb::T_NUMERIC_EXACT, "0xdead_beaf", "ittler"); -} - -QPID_AUTO_TEST_CASE(tokeniseFailure) -{ - verifyTokeniserFail(&tokeniseEos, "hb23"); - verifyTokeniserFail(&tokeniseIdentifier, "123"); - verifyTokeniserFail(&tokeniseIdentifier, "'Embedded 123'"); - verifyTokeniserFail(&tokeniseReservedWord, "1.2e5"); - verifyTokeniserFail(&tokeniseReservedWord, "'Stringy thing'"); - verifyTokeniserFail(&tokeniseReservedWord, "oR_andsomething"); - verifyTokeniserFail(&tokeniseString, "'Embedded 123"); - verifyTokeniserFail(&tokeniseString, "'This isn''t fair"); - verifyTokeniserFail(&tokeniseOperator, "123"); - verifyTokeniserFail(&tokeniseOperator, "'Stringy thing'"); - verifyTokeniserFail(&tokeniseOperator, "NoT"); - verifyTokeniserFail(&tokeniseOperator, "(a and b)"); - verifyTokeniserFail(&tokeniseOperator, ")"); - verifyTokeniserFail(&tokeniseParens, "="); - verifyTokeniserFail(&tokeniseParens, "what ho!"); - verifyTokeniserFail(&tokeniseNumeric, "kill"); - verifyTokeniserFail(&tokeniseNumeric, "e3"); - verifyTokeniserFail(&tokeniseNumeric, "1.e.5"); - verifyTokeniserFail(&tokeniseNumeric, ".e5"); - verifyTokeniserFail(&tokeniseNumeric, "34e"); - verifyTokeniserFail(&tokeniseNumeric, ".3e+"); - verifyTokeniserFail(&tokeniseNumeric, ".3e-."); - verifyTokeniserFail(&tokenise, "0b34Longer"); - verifyTokeniserFail(&tokenise, "0X_34Longer"); -} - -QPID_AUTO_TEST_CASE(tokenString) -{ - - string exp(" a =b"); - string::const_iterator s = exp.begin(); - string::const_iterator e = exp.end(); - Tokeniser t(s, e); - - BOOST_CHECK_EQUAL(t.nextToken(), Token(qb::T_IDENTIFIER, "a")); - BOOST_CHECK_EQUAL(t.nextToken(), Token(qb::T_EQUAL, "=")); - BOOST_CHECK_EQUAL(t.nextToken(), Token(qb::T_IDENTIFIER, "b")); - BOOST_CHECK_EQUAL(t.nextToken(), Token(qb::T_EOS, "")); - - exp = " not 'hello kitty''s friend' = Is null "; - s = exp.begin(); - e = exp.end(); - Tokeniser u(s, e); - - BOOST_CHECK_EQUAL(u.nextToken(), Token(qb::T_NOT, "not")); - BOOST_CHECK_EQUAL(u.nextToken(), Token(qb::T_STRING, "hello kitty's friend")); - BOOST_CHECK_EQUAL(u.nextToken(), Token(qb::T_EQUAL, "=")); - BOOST_CHECK_EQUAL(u.nextToken(), Token(qb::T_IS, "Is")); - BOOST_CHECK_EQUAL(u.nextToken(), Token(qb::T_NULL, "null")); - BOOST_CHECK_EQUAL(u.nextToken(), Token(qb::T_EOS, "")); - BOOST_CHECK_EQUAL(u.nextToken(), Token(qb::T_EOS, "")); - - u.returnTokens(3); - BOOST_CHECK_EQUAL(u.nextToken(), Token(qb::T_IS, "Is")); - BOOST_CHECK_EQUAL(u.nextToken(), Token(qb::T_NULL, "null")); - BOOST_CHECK_EQUAL(u.nextToken(), Token(qb::T_EOS, "")); - BOOST_CHECK_EQUAL(u.nextToken(), Token(qb::T_EOS, "")); - - exp = "(a+6)*7.5/1e6"; - s = exp.begin(); - e = exp.end(); - Tokeniser v(s, e); - - BOOST_CHECK_EQUAL(v.nextToken(), Token(qb::T_LPAREN, "(")); - BOOST_CHECK_EQUAL(v.nextToken(), Token(qb::T_IDENTIFIER, "a")); - BOOST_CHECK_EQUAL(v.nextToken(), Token(qb::T_PLUS, "+")); - BOOST_CHECK_EQUAL(v.nextToken(), Token(qb::T_NUMERIC_EXACT, "6")); - BOOST_CHECK_EQUAL(v.nextToken(), Token(qb::T_RPAREN, ")")); - BOOST_CHECK_EQUAL(v.nextToken(), Token(qb::T_MULT, "*")); - BOOST_CHECK_EQUAL(v.nextToken(), Token(qb::T_NUMERIC_APPROX, "7.5")); - BOOST_CHECK_EQUAL(v.nextToken(), Token(qb::T_DIV, "/")); - BOOST_CHECK_EQUAL(v.nextToken(), Token(qb::T_NUMERIC_APPROX, "1e6")); -} - -QPID_AUTO_TEST_CASE(parseStringFail) -{ - BOOST_CHECK_THROW(qb::Selector e("hello world"), std::range_error); - BOOST_CHECK_THROW(qb::Selector e("hello ^ world"), std::range_error); - BOOST_CHECK_THROW(qb::Selector e("A is null not"), std::range_error); - BOOST_CHECK_THROW(qb::Selector e("A is null or not"), std::range_error); - BOOST_CHECK_THROW(qb::Selector e("A is null or and"), std::range_error); - BOOST_CHECK_THROW(qb::Selector e("A is null and (B='hello out there'"), std::range_error); - BOOST_CHECK_THROW(qb::Selector e("in='hello kitty'"), std::range_error); - BOOST_CHECK_THROW(qb::Selector e("A like 234"), std::range_error); - BOOST_CHECK_THROW(qb::Selector e("A not 234 escape"), std::range_error); - BOOST_CHECK_THROW(qb::Selector e("A not like 'eclecti_' escape 'happy'"), std::range_error); - BOOST_CHECK_THROW(qb::Selector e("A not like 'eclecti_' escape happy"), std::range_error); - BOOST_CHECK_THROW(qb::Selector e("A not like 'eclecti_' escape '%'"), std::range_error); - BOOST_CHECK_THROW(qb::Selector e("A BETWEEN AND 'true'"), std::range_error); - BOOST_CHECK_THROW(qb::Selector e("A NOT BETWEEN 34 OR 3.9"), std::range_error); - BOOST_CHECK_THROW(qb::Selector e("A IN ()"), std::range_error); - BOOST_CHECK_THROW(qb::Selector e("A NOT IN ()"), std::range_error); - BOOST_CHECK_THROW(qb::Selector e("A IN 'hello', 'there', 1, true, (1-17))"), std::range_error); - BOOST_CHECK_THROW(qb::Selector e("A IN ('hello', 'there' 1, true, (1-17))"), std::range_error); -} - -QPID_AUTO_TEST_CASE(parseString) -{ - BOOST_CHECK_NO_THROW(qb::Selector e("'Daft' is not null")); - BOOST_CHECK_NO_THROW(qb::Selector e("42 is null")); - BOOST_CHECK_NO_THROW(qb::Selector e("A is not null")); - BOOST_CHECK_NO_THROW(qb::Selector e("A is null")); - BOOST_CHECK_NO_THROW(qb::Selector e("A = C")); - BOOST_CHECK_NO_THROW(qb::Selector e("A <> C")); - BOOST_CHECK_NO_THROW(qb::Selector e("A='hello kitty'")); - BOOST_CHECK_NO_THROW(qb::Selector e("A<>'hello kitty'")); - BOOST_CHECK_NO_THROW(qb::Selector e("A=B")); - BOOST_CHECK_NO_THROW(qb::Selector e("A<>B")); - BOOST_CHECK_NO_THROW(qb::Selector e("A='hello kitty' OR B='Bye, bye cruel world'")); - BOOST_CHECK_NO_THROW(qb::Selector e("B='hello kitty' AnD A='Bye, bye cruel world'")); - BOOST_CHECK_NO_THROW(qb::Selector e("A is null or A='Bye, bye cruel world'")); - BOOST_CHECK_NO_THROW(qb::Selector e("Z is null OR A is not null and A<>'Bye, bye cruel world'")); - BOOST_CHECK_NO_THROW(qb::Selector e("(Z is null OR A is not null) and A<>'Bye, bye cruel world'")); - BOOST_CHECK_NO_THROW(qb::Selector e("NOT C is not null OR C is null")); - BOOST_CHECK_NO_THROW(qb::Selector e("Not A='' or B=z")); - BOOST_CHECK_NO_THROW(qb::Selector e("Not A=17 or B=5.6")); - BOOST_CHECK_NO_THROW(qb::Selector e("A<>17 and B=5.6e17")); - BOOST_CHECK_NO_THROW(qb::Selector e("A LIKE 'excep%ional'")); - BOOST_CHECK_NO_THROW(qb::Selector e("B NOT LIKE 'excep%ional'")); - BOOST_CHECK_NO_THROW(qb::Selector e("A LIKE 'excep%ional' EScape '\'")); - BOOST_CHECK_NO_THROW(qb::Selector e("A BETWEEN 13 AND 'true'")); - BOOST_CHECK_NO_THROW(qb::Selector e("A NOT BETWEEN 100 AND 3.9")); - BOOST_CHECK_NO_THROW(qb::Selector e("true")); - BOOST_CHECK_NO_THROW(qb::Selector e("-354")); - BOOST_CHECK_NO_THROW(qb::Selector e("-(X or Y)")); - BOOST_CHECK_NO_THROW(qb::Selector e("-687 or 567")); - BOOST_CHECK_NO_THROW(qb::Selector e("(354.6)")); - BOOST_CHECK_NO_THROW(qb::Selector e("A is null and 'hello out there'")); - BOOST_CHECK_NO_THROW(qb::Selector e("17/4>4")); - BOOST_CHECK_NO_THROW(qb::Selector e("17/4>+4")); - BOOST_CHECK_NO_THROW(qb::Selector e("17/4>-4")); - BOOST_CHECK_NO_THROW(qb::Selector e("A IN ('hello', 'there', 1 , true, (1-17))")); -} - -class TestSelectorEnv : public qpid::broker::SelectorEnv { - mutable map<string, qb::Value> values; - boost::ptr_vector<string> strings; - static const qb::Value EMPTY; - - const qb::Value& value(const string& v) const { - const qb::Value& r = values.find(v)!=values.end() ? values[v] : EMPTY; - return r; - } - -public: - void set(const string& id, const char* value) { - strings.push_back(new string(value)); - values[id] = strings[strings.size()-1]; - } - - void set(const string& id, const qb::Value& value) { - if (value.type==qb::Value::T_STRING) { - strings.push_back(new string(*value.s)); - values[id] = strings[strings.size()-1]; - } else { - values[id] = value; - } - } -}; - -const qb::Value TestSelectorEnv::EMPTY; - -QPID_AUTO_TEST_CASE(simpleEval) -{ - TestSelectorEnv env; - env.set("A", "Bye, bye cruel world"); - env.set("B", "hello kitty"); - - BOOST_CHECK(qb::Selector("").eval(env)); - BOOST_CHECK(qb::Selector(" ").eval(env)); - BOOST_CHECK(qb::Selector("A is not null").eval(env)); - BOOST_CHECK(!qb::Selector("A is null").eval(env)); - BOOST_CHECK(!qb::Selector("A = C").eval(env)); - BOOST_CHECK(!qb::Selector("A <> C").eval(env)); - BOOST_CHECK(!qb::Selector("C is not null").eval(env)); - BOOST_CHECK(qb::Selector("C is null").eval(env)); - BOOST_CHECK(qb::Selector("A='Bye, bye cruel world'").eval(env)); - BOOST_CHECK(!qb::Selector("A<>'Bye, bye cruel world'").eval(env)); - BOOST_CHECK(!qb::Selector("A='hello kitty'").eval(env)); - BOOST_CHECK(qb::Selector("A<>'hello kitty'").eval(env)); - BOOST_CHECK(!qb::Selector("A=B").eval(env)); - BOOST_CHECK(qb::Selector("A<>B").eval(env)); - BOOST_CHECK(!qb::Selector("A='hello kitty' OR B='Bye, bye cruel world'").eval(env)); - BOOST_CHECK(qb::Selector("B='hello kitty' OR A='Bye, bye cruel world'").eval(env)); - BOOST_CHECK(qb::Selector("B='hello kitty' AnD A='Bye, bye cruel world'").eval(env)); - BOOST_CHECK(!qb::Selector("B='hello kitty' AnD B='Bye, bye cruel world'").eval(env)); - BOOST_CHECK(qb::Selector("A is null or A='Bye, bye cruel world'").eval(env)); - BOOST_CHECK(qb::Selector("Z is null OR A is not null and A<>'Bye, bye cruel world'").eval(env)); - BOOST_CHECK(!qb::Selector("(Z is null OR A is not null) and A<>'Bye, bye cruel world'").eval(env)); - BOOST_CHECK(qb::Selector("NOT C is not null OR C is null").eval(env)); - BOOST_CHECK(qb::Selector("Not A='' or B=z").eval(env)); - BOOST_CHECK(qb::Selector("Not A=17 or B=5.6").eval(env)); - BOOST_CHECK(!qb::Selector("A<>17 and B=5.6e17").eval(env)); - BOOST_CHECK(!qb::Selector("C=D").eval(env)); - BOOST_CHECK(qb::Selector("13 is not null").eval(env)); - BOOST_CHECK(!qb::Selector("'boo!' is null").eval(env)); - BOOST_CHECK(qb::Selector("A LIKE '%cru_l%'").eval(env)); - BOOST_CHECK(qb::Selector("'_%%_hello.th_re%' LIKE 'z_%.%z_%z%' escape 'z'").eval(env)); - BOOST_CHECK(qb::Selector("A NOT LIKE 'z_%.%z_%z%' escape 'z'").eval(env)); - BOOST_CHECK(qb::Selector("'{}[]<>,.!\"$%^&*()_-+=?/|\\' LIKE '{}[]<>,.!\"$z%^&*()z_-+=?/|\\' escape 'z'").eval(env)); -} - -QPID_AUTO_TEST_CASE(numericEval) -{ - TestSelectorEnv env; - env.set("A", 42.0); - env.set("B", 39); - - BOOST_CHECK(qb::Selector("A>B").eval(env)); - BOOST_CHECK(qb::Selector("A=42").eval(env)); - BOOST_CHECK(qb::Selector("B=39.0").eval(env)); - BOOST_CHECK(qb::Selector("Not A=17 or B=5.6").eval(env)); - BOOST_CHECK(!qb::Selector("A<>17 and B=5.6e17").eval(env)); - BOOST_CHECK(qb::Selector("3 BETWEEN -17 and 98.5").eval(env)); - BOOST_CHECK(qb::Selector("A BETWEEN B and 98.5").eval(env)); - BOOST_CHECK(!qb::Selector("B NOT BETWEEN 35 AND 100").eval(env)); - BOOST_CHECK(!qb::Selector("A BETWEEN B and 40").eval(env)); - BOOST_CHECK(!qb::Selector("A BETWEEN C and 40").eval(env)); - BOOST_CHECK(!qb::Selector("A BETWEEN 45 and C").eval(env)); - BOOST_CHECK(qb::Selector("(A BETWEEN 40 and C) IS NULL").eval(env)); - BOOST_CHECK(qb::Selector("(A BETWEEN C and 45) IS NULL").eval(env)); - BOOST_CHECK(qb::Selector("17/4=4").eval(env)); - BOOST_CHECK(!qb::Selector("A/0=0").eval(env)); - BOOST_CHECK(qb::Selector("A*B+19<A*(B+19)").eval(env)); - BOOST_CHECK(qb::Selector("-A=0-A").eval(env)); -} - -QPID_AUTO_TEST_CASE(numericLiterals) -{ - TestSelectorEnv env; - - BOOST_CHECK(qb::Selector(" 9223372036854775807>0").eval(env)); - BOOST_CHECK(qb::Selector("-9223372036854775807<0").eval(env)); - BOOST_CHECK_THROW(qb::Selector(" 9223372036854775808>0").eval(env), std::range_error); - BOOST_CHECK(qb::Selector("0x8000_0000_0000_0001=-9223372036854775807").eval(env)); - BOOST_CHECK_THROW(qb::Selector("-9223372036854775809<0").eval(env), std::range_error); - BOOST_CHECK(qb::Selector(" 9223372036854775807L<>0").eval(env)); - BOOST_CHECK(qb::Selector("-9223372036854775807L<>0").eval(env)); - BOOST_CHECK(qb::Selector("-9223372036854775808<>0").eval(env)); - BOOST_CHECK(qb::Selector("-9223372036854775808=0x8000_0000_0000_0000").eval(env)); - BOOST_CHECK(qb::Selector("0x8000_0000_0000_0000<9223372036854775807").eval(env)); - BOOST_CHECK(qb::Selector(" 0.4f>0.3d").eval(env)); - BOOST_CHECK(qb::Selector(" 1000_020.4f>0.3d").eval(env)); - BOOST_CHECK(qb::Selector(" 1000_020.4f>0x800p-3").eval(env)); - BOOST_CHECK(qb::Selector(" 0x1000_0000=0x1000_0000p0").eval(env)); - BOOST_CHECK(qb::Selector(" 0xFF=255L").eval(env)); - BOOST_CHECK(qb::Selector(" 077L=0b111_111").eval(env)); - BOOST_CHECK(qb::Selector(" 077L=63").eval(env)); -} - -QPID_AUTO_TEST_CASE(comparisonEval) -{ - TestSelectorEnv env; - - BOOST_CHECK(!qb::Selector("17 > 19.0").eval(env)); - BOOST_CHECK(!qb::Selector("'hello' > 19.0").eval(env)); - BOOST_CHECK(!qb::Selector("'hello' < 19.0").eval(env)); - BOOST_CHECK(!qb::Selector("'hello' = 19.0").eval(env)); - BOOST_CHECK(!qb::Selector("'hello'>42 and 'hello'<42 and 'hello'=42 and 'hello'<>42").eval(env)); - BOOST_CHECK(qb::Selector("20 >= 19.0 and 20 > 19").eval(env)); - BOOST_CHECK(qb::Selector("42 <= 42.0 and 37.0 >= 37").eval(env)); - BOOST_CHECK(qb::Selector("(A IN ('hello', 'there', 1 , true, (1-17))) IS NULL").eval(env)); - BOOST_CHECK(qb::Selector("(-16 IN ('hello', A, 'there', true)) IS NULL").eval(env)); - BOOST_CHECK(qb::Selector("(-16 NOT IN ('hello', 'there', A, true)) IS NULL").eval(env)); - BOOST_CHECK(qb::Selector("(-16 IN ('hello', 'there', true)) IS NOT NULL").eval(env)); - BOOST_CHECK(!qb::Selector("-16 IN ('hello', 'there', true)").eval(env)); - BOOST_CHECK(qb::Selector("(-16 NOT IN ('hello', 'there', true)) IS NOT NULL").eval(env)); - BOOST_CHECK(!qb::Selector("-16 NOT IN ('hello', 'there', true)").eval(env)); - BOOST_CHECK(qb::Selector("(-16 NOT IN ('hello', 'there', A, 1 , true)) IS NULL").eval(env)); - BOOST_CHECK(qb::Selector("'hello' IN ('hello', 'there', 1 , true, (1-17))").eval(env)); - BOOST_CHECK(qb::Selector("TRUE IN ('hello', 'there', 1 , true, (1-17))").eval(env)); - BOOST_CHECK(qb::Selector("-16 IN ('hello', 'there', 1 , true, (1-17))").eval(env)); - BOOST_CHECK(!qb::Selector("-16 NOT IN ('hello', 'there', 1 , true, (1-17))").eval(env)); - BOOST_CHECK(!qb::Selector("1 IN ('hello', 'there', 'polly')").eval(env)); - BOOST_CHECK(!qb::Selector("1 NOT IN ('hello', 'there', 'polly')").eval(env)); - BOOST_CHECK(!qb::Selector("'hell' IN ('hello', 'there', 1 , true, (1-17))").eval(env)); - BOOST_CHECK(qb::Selector("('hell' IN ('hello', 'there', 1 , true, (1-17), A)) IS NULL").eval(env)); - BOOST_CHECK(qb::Selector("('hell' NOT IN ('hello', 'there', 1 , true, (1-17), A)) IS NULL").eval(env)); - BOOST_CHECK(!qb::Selector("'hello kitty' BETWEEN 30 and 40").eval(env)); - BOOST_CHECK(qb::Selector("'hello kitty' NOT BETWEEN 30 and 40").eval(env)); - BOOST_CHECK(!qb::Selector("14 BETWEEN 'aardvark' and 'zebra'").eval(env)); - BOOST_CHECK(qb::Selector("14 NOT BETWEEN 'aardvark' and 'zebra'").eval(env)); - BOOST_CHECK(!qb::Selector("TRUE BETWEEN 'aardvark' and 'zebra'").eval(env)); - BOOST_CHECK(qb::Selector("TRUE NOT BETWEEN 'aardvark' and 'zebra'").eval(env)); - BOOST_CHECK(qb::Selector("(A BETWEEN 'aardvark' and 14) IS NULL").eval(env)); - BOOST_CHECK(qb::Selector("(A NOT BETWEEN 'aardvark' and 14) IS NULL").eval(env)); - BOOST_CHECK(qb::Selector("(14 BETWEEN A and 17) IS NULL").eval(env)); - BOOST_CHECK(qb::Selector("(14 NOT BETWEEN A and 17) IS NULL").eval(env)); - BOOST_CHECK(qb::Selector("(14 BETWEEN 11 and A) IS NULL").eval(env)); - BOOST_CHECK(qb::Selector("(14 NOT BETWEEN 11 and A) IS NULL").eval(env)); - BOOST_CHECK(qb::Selector("14 NOT BETWEEN 11 and 9").eval(env)); - BOOST_CHECK(qb::Selector("14 BETWEEN -11 and 54367").eval(env)); -} - -QPID_AUTO_TEST_CASE(NullEval) -{ - TestSelectorEnv env; - - BOOST_CHECK(qb::Selector("P > 19.0 or (P is null)").eval(env)); - BOOST_CHECK(qb::Selector("P is null or P=''").eval(env)); - BOOST_CHECK(!qb::Selector("P=Q").eval(env)); - BOOST_CHECK(!qb::Selector("not P=Q").eval(env)); - BOOST_CHECK(!qb::Selector("not P=Q and not P=Q").eval(env)); - BOOST_CHECK(!qb::Selector("P=Q or not P=Q").eval(env)); - BOOST_CHECK(!qb::Selector("P > 19.0 or P <= 19.0").eval(env)); - BOOST_CHECK(qb::Selector("P > 19.0 or 17 <= 19.0").eval(env)); -} - -QPID_AUTO_TEST_SUITE_END() - -}} diff --git a/qpid/cpp/src/tests/SequenceNumberTest.cpp b/qpid/cpp/src/tests/SequenceNumberTest.cpp deleted file mode 100644 index f3c934e3ca..0000000000 --- a/qpid/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/qpid/cpp/src/tests/SequenceSet.cpp b/qpid/cpp/src/tests/SequenceSet.cpp deleted file mode 100644 index bc0a8ea509..0000000000 --- a/qpid/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/qpid/cpp/src/tests/SessionState.cpp b/qpid/cpp/src/tests/SessionState.cpp deleted file mode 100644 index 1cf3415484..0000000000 --- a/qpid/cpp/src/tests/SessionState.cpp +++ /dev/null @@ -1,303 +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 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, boost::bind(std::plus<T>(), _1, boost::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, - boost::bind(&send, boost::ref(s), - boost::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, - boost::bind(transfer1Char, boost::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/qpid/cpp/src/tests/Shlib.cpp b/qpid/cpp/src/tests/Shlib.cpp deleted file mode 100644 index 7f01323e3c..0000000000 --- a/qpid/cpp/src/tests/Shlib.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 "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) { - Shlib sh("./" QPID_SHLIB_PREFIX "shlibtest" QPID_SHLIB_POSTFIX QPID_SHLIB_SUFFIX); - // 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; - { - AutoShlib sh("./" QPID_SHLIB_PREFIX "shlibtest" QPID_SHLIB_POSTFIX QPID_SHLIB_SUFFIX); - 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/qpid/cpp/src/tests/Statistics.cpp b/qpid/cpp/src/tests/Statistics.cpp deleted file mode 100644 index 7cacde8b74..0000000000 --- a/qpid/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::FromEpoch()); - 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/qpid/cpp/src/tests/Statistics.h b/qpid/cpp/src/tests/Statistics.h deleted file mode 100644 index 091046a17f..0000000000 --- a/qpid/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/qpid/cpp/src/tests/StringUtils.cpp b/qpid/cpp/src/tests/StringUtils.cpp deleted file mode 100644 index c50287a4f4..0000000000 --- a/qpid/cpp/src/tests/StringUtils.cpp +++ /dev/null @@ -1,81 +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" - -namespace qpid { -namespace tests { - -QPID_AUTO_TEST_SUITE(StringUtilsTestSuite) - -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/qpid/cpp/src/tests/SystemInfo.cpp b/qpid/cpp/src/tests/SystemInfo.cpp deleted file mode 100644 index 34f1ac408e..0000000000 --- a/qpid/cpp/src/tests/SystemInfo.cpp +++ /dev/null @@ -1,36 +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/SystemInfo.h" -#include <boost/assign.hpp> - -using namespace std; -using namespace qpid::sys; -using namespace boost::assign; - -namespace qpid { -namespace tests { - -QPID_AUTO_TEST_SUITE(SystemInfoTestSuite) - -QPID_AUTO_TEST_SUITE_END() - -}} // namespace qpid::tests diff --git a/qpid/cpp/src/tests/TestMessageStore.h b/qpid/cpp/src/tests/TestMessageStore.h deleted file mode 100644 index 0b63bc9c15..0000000000 --- a/qpid/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<std::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/qpid/cpp/src/tests/TestOptions.h b/qpid/cpp/src/tests/TestOptions.h deleted file mode 100644 index f8da0f59cf..0000000000 --- a/qpid/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/qpid/cpp/src/tests/TimerTest.cpp b/qpid/cpp/src/tests/TimerTest.cpp deleted file mode 100644 index d28eeeffc1..0000000000 --- a/qpid/cpp/src/tests/TimerTest.cpp +++ /dev/null @@ -1,176 +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 "qpid/Options.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); -#elif defined(__SUNPRO_CC) || defined (__IBMCPP__) - uint64_t difference = llabs(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); -} - -std::string toString(Duration d) { return boost::lexical_cast<std::string>(d); } -Duration fromString(const std::string& str) { return boost::lexical_cast<Duration>(str); } - -QPID_AUTO_TEST_CASE(testOstreamInOut) { - std::string empty; - BOOST_CHECK_EQUAL(toString(Duration(int64_t(TIME_SEC))), "1s"); - BOOST_CHECK_EQUAL(toString(Duration(int64_t(TIME_SEC*123.4))), "123.4s"); - BOOST_CHECK_EQUAL(toString(Duration(int64_t(TIME_MSEC*123.4))), "123.4ms"); - BOOST_CHECK_EQUAL(toString(Duration(int64_t(TIME_USEC*123.4))), "123.4us"); - BOOST_CHECK_EQUAL(toString(Duration(int64_t(TIME_NSEC*123))), "123ns"); - - BOOST_CHECK_EQUAL(fromString("123.4"), Duration(int64_t(TIME_SEC*123.4))); - BOOST_CHECK_EQUAL(fromString("123.4s"), Duration(int64_t(TIME_SEC*123.4))); - BOOST_CHECK_EQUAL(fromString("123ms"), Duration(int64_t(TIME_MSEC*123))); - BOOST_CHECK_EQUAL(fromString("123us"), Duration(int64_t(TIME_USEC*123))); - BOOST_CHECK_EQUAL(fromString("123ns"), Duration(int64_t(TIME_NSEC*123))); - - Duration d = 0; - std::istringstream i; - std::string s; - - i.str("123x"); - i >> d; - BOOST_CHECK(i.fail()); - BOOST_CHECK_EQUAL(d, 0); - BOOST_CHECK_EQUAL(i.str(), "123x"); - - i.str("xxx"); - i >> d; - BOOST_CHECK(i.fail()); - BOOST_CHECK_EQUAL(d, 0); - BOOST_CHECK_EQUAL(i.str(), "xxx"); -} - -QPID_AUTO_TEST_CASE(testOptionParse) { - Options opts; - Duration interval; - opts.addOptions()("interval", optValue(interval, "I"), "blah"); - const char *args[] = { "fakeexe", "--interval", "123.4" }; - opts.parse(sizeof(args)/sizeof(args[0]), args); - BOOST_CHECK_EQUAL(interval, Duration(int64_t(TIME_SEC*123.4))); -} - -QPID_AUTO_TEST_SUITE_END() - -}} // namespace qpid::tests diff --git a/qpid/cpp/src/tests/TopicExchangeTest.cpp b/qpid/cpp/src/tests/TopicExchangeTest.cpp deleted file mode 100644 index d57951ea3f..0000000000 --- a/qpid/cpp/src/tests/TopicExchangeTest.cpp +++ /dev/null @@ -1,408 +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/TopicKeyNode.h" -#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; - typedef TopicKeyNode<TopicExchange::BindingKey> TestBindingNode; - -private: - // binding node iterator that collects all routes that are bound - class TestFinder : public TestBindingNode::TreeIterator { - public: - TestFinder(BindingVec& m) : bv(m) {}; - ~TestFinder() {}; - bool visit(TestBindingNode& 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.add(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.get(routingPattern); - if (bk) { - bk->bindingVector.pop_back(); - if (bk->bindingVector.empty()) { - // no more bindings - remove this node - bindingTree.remove(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: - TestBindingNode 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/qpid/cpp/src/tests/TransactionObserverTest.cpp b/qpid/cpp/src/tests/TransactionObserverTest.cpp deleted file mode 100644 index 80ef494c21..0000000000 --- a/qpid/cpp/src/tests/TransactionObserverTest.cpp +++ /dev/null @@ -1,147 +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 "MessagingFixture.h" -#include "qpid/broker/BrokerObserver.h" -#include "qpid/broker/TransactionObserver.h" -#include "qpid/broker/TxBuffer.h" -#include "qpid/broker/Queue.h" -#include "qpid/ha/types.h" - -#include <boost/bind.hpp> -#include <boost/function.hpp> -#include <boost/lexical_cast.hpp> -#include <iostream> -#include <vector> - -namespace qpid { -namespace tests { - -using framing::SequenceSet; -using messaging::Message; -using boost::shared_ptr; - -using namespace boost::assign; -using namespace boost; -using namespace broker; -using namespace std; -using namespace messaging; -using namespace types; - -QPID_AUTO_TEST_SUITE(TransactionalObserverTest) - -Message msg(string content) { return Message(content); } - -struct MockTransactionObserver : public TransactionObserver { - bool prep; - vector<string> events; - - MockTransactionObserver(bool prep_=true) : prep(prep_) {} - - void record(const string& e) { events.push_back(e); } - - void enqueue(const shared_ptr<Queue>& q, const broker::Message& m) { - record("enqueue "+q->getName()+" "+m.getContent()); - } - void dequeue(const Queue::shared_ptr& q, SequenceNumber p, SequenceNumber r) { - record("dequeue "+q->getName()+" "+ - lexical_cast<string>(p)+" "+lexical_cast<string>(r)); - } - bool prepare() { record("prepare"); return prep; } - void commit() { record("commit"); } - void rollback() {record("rollback"); } -}; - -struct MockBrokerObserver : public BrokerObserver { - bool prep; - shared_ptr<MockTransactionObserver> tx; - - MockBrokerObserver(bool prep_=true) : prep(prep_) {} - - void startTx(const intrusive_ptr<TxBuffer>& buffer) { - if (!tx) { // Don't overwrite first tx with automatically started second tx. - tx.reset(new MockTransactionObserver(prep)); - buffer->setObserver(tx); - } - } -}; - -Session simpleTxTransaction(MessagingFixture& fix) { - fix.session.createSender("q1;{create:always}").send(msg("foo")); // Not in TX - // Transaction with 1 enqueue and 1 dequeue. - Session txSession = fix.connection.createTransactionalSession(); - BOOST_CHECK_EQUAL("foo", txSession.createReceiver("q1").fetch().getContent()); - txSession.acknowledge(); - txSession.createSender("q2;{create:always}").send(msg("bar")); - return txSession; -} - -QPID_AUTO_TEST_CASE(testTxCommit) { - MessagingFixture fix; - shared_ptr<MockBrokerObserver> brokerObserver(new MockBrokerObserver); - fix.broker->getBrokerObservers().add(brokerObserver); - Session txSession = simpleTxTransaction(fix); - txSession.commit(); - // Note on ordering: observers see enqueues as they happen, but dequeues just - // before prepare. - BOOST_CHECK_EQUAL( - list_of<string>("enqueue q2 bar")("dequeue q1 1 0")("prepare")("commit"), - brokerObserver->tx->events - ); -} - -QPID_AUTO_TEST_CASE(testTxFail) { - MessagingFixture fix; - shared_ptr<MockBrokerObserver> brokerObserver(new MockBrokerObserver(false)); - fix.broker->getBrokerObservers().add(brokerObserver); - Session txSession = simpleTxTransaction(fix); - try { - ScopedSuppressLogging sl; // Suppress messages for expected error. - txSession.commit(); - BOOST_FAIL("Expected exception"); - } catch(...) {} - - BOOST_CHECK_EQUAL( - list_of<string>("enqueue q2 bar")("dequeue q1 1 0")("prepare")("rollback"), - brokerObserver->tx->events - ); -} - -QPID_AUTO_TEST_CASE(testTxRollback) { - MessagingFixture fix; - shared_ptr<MockBrokerObserver> brokerObserver(new MockBrokerObserver(false)); - fix.broker->getBrokerObservers().add(brokerObserver); - Session txSession = simpleTxTransaction(fix); - txSession.rollback(); - // Note: The dequeue does not appear here. This is because TxAccepts - // (i.e. dequeues) are not enlisted until SemanticState::commit and are - // never enlisted if the transaction is rolled back. - BOOST_CHECK_EQUAL( - list_of<string>("enqueue q2 bar")("rollback"), - brokerObserver->tx->events - ); -} - -QPID_AUTO_TEST_SUITE_END() - -}} // namespace qpid::tests diff --git a/qpid/cpp/src/tests/TxBufferTest.cpp b/qpid/cpp/src/tests/TxBufferTest.cpp deleted file mode 100644 index 3f052d213e..0000000000 --- a/qpid/cpp/src/tests/TxBufferTest.cpp +++ /dev/null @@ -1,188 +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 "test_tools.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)); - - buffer.startCommit(&store); - buffer.endCommit(&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)); - - try { - ScopedSuppressLogging sl; // Suppress messages for expected error. - buffer.startCommit(&store); - buffer.endCommit(&store); - BOOST_FAIL("Expected exception"); - } catch (...) {} - 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/qpid/cpp/src/tests/TxMocks.h b/qpid/cpp/src/tests/TxMocks.h deleted file mode 100644 index 8b54e7484b..0000000000 --- a/qpid/cpp/src/tests/TxMocks.h +++ /dev/null @@ -1,236 +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); - } - - void callObserver(const boost::shared_ptr<TransactionObserver>&) {} - - 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); - } - - ~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/qpid/cpp/src/tests/Url.cpp b/qpid/cpp/src/tests/Url.cpp deleted file mode 100644 index b30de682bc..0000000000 --- a/qpid/cpp/src/tests/Url.cpp +++ /dev/null @@ -1,116 +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(TestParseTricky) { - BOOST_CHECK_EQUAL(Url("amqp").str(), "amqp:tcp:amqp:5672"); - BOOST_CHECK_EQUAL(Url("amqp:tcp").str(), "amqp:tcp:tcp:5672"); - // These are ambiguous parses and arguably not the best result - BOOST_CHECK_EQUAL(Url("amqp:876").str(), "amqp:tcp:876:5672"); - BOOST_CHECK_EQUAL(Url("tcp:567").str(), "amqp:tcp:567:5672"); -} - -QPID_AUTO_TEST_CASE(TestParseIPv6) { - Url u1("[::]"); - BOOST_CHECK_EQUAL(u1[0].host, "::"); - BOOST_CHECK_EQUAL(u1[0].port, 5672); - Url u2("[::1]"); - BOOST_CHECK_EQUAL(u2[0].host, "::1"); - BOOST_CHECK_EQUAL(u2[0].port, 5672); - Url u3("[::127.0.0.1]"); - BOOST_CHECK_EQUAL(u3[0].host, "::127.0.0.1"); - BOOST_CHECK_EQUAL(u3[0].port, 5672); - Url u4("[2002::222:68ff:fe0b:e61a]"); - BOOST_CHECK_EQUAL(u4[0].host, "2002::222:68ff:fe0b:e61a"); - BOOST_CHECK_EQUAL(u4[0].port, 5672); - Url u5("[2002::222:68ff:fe0b:e61a]:123"); - BOOST_CHECK_EQUAL(u5[0].host, "2002::222:68ff:fe0b:e61a"); - BOOST_CHECK_EQUAL(u5[0].port, 123); -} - -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/qpid/cpp/src/tests/Uuid.cpp b/qpid/cpp/src/tests/Uuid.cpp deleted file mode 100644 index f9a67d9db0..0000000000 --- a/qpid/cpp/src/tests/Uuid.cpp +++ /dev/null @@ -1,150 +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 "unit_test.h" - -#include <set> - -#include <boost/array.hpp> - -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 = {{0x1b, 0x4e, 0x28, 0xba, 0x2f, 0xa1, 0x11, 0x02, 0x88, 0x3f, 0xb9, 0xa7, 0x61, 0xbd, 0xe3, 0xfb}}; -const string sampleStr("1b4e28ba-2fa1-1102-883f-b9a761bde3fb"); -const string zeroStr("00000000-0000-0000-0000-000000000000"); -const string badUuid1("1b4e28ba-2fa1-11d2-883f-b9761bde3fb"); -const string badUuid2("1b4e28ba-2fa1-11d23883f-b9761dbde3fb"); - -QPID_AUTO_TEST_CASE(testUuidIstream) { - Uuid uuid; - istringstream in(sampleStr); - in >> uuid; - BOOST_CHECK(!in.fail()); - BOOST_CHECK(::memcmp(uuid.data(), sample.data(), uuid.size())==0); - - istringstream is(zeroStr); - Uuid zero; - is >> zero; - BOOST_CHECK(!is.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(testBadUuidIstream) { - Uuid a; - istringstream is(badUuid1); - is >> a; - BOOST_CHECK(!is.good()); - istringstream is2(badUuid2); - is2 >> a; - BOOST_CHECK(!is2.good()); -} - -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) { - std::vector<char> buff(Uuid::size()); - Buffer wbuf(&buff[0], Uuid::size()); - Uuid uuid(sample.c_array()); - uuid.encode(wbuf); - - Buffer rbuf(&buff[0], Uuid::size()); - Uuid decoded; - decoded.decode(rbuf); - BOOST_CHECK_EQUAL(string(sample.begin(), sample.end()), - string(decoded.data(), decoded.data()+decoded.size())); -} - -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/qpid/cpp/src/tests/Variant.cpp b/qpid/cpp/src/tests/Variant.cpp deleted file mode 100644 index 5ae7fc89eb..0000000000 --- a/qpid/cpp/src/tests/Variant.cpp +++ /dev/null @@ -1,834 +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/types/Variant.h" -#include "qpid/amqp_0_10/Codecs.h" -#include <boost/assign.hpp> -#include <iostream> - -using namespace qpid::types; -using namespace qpid::amqp_0_10; -using boost::assign::list_of; - -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 = "-Blah"; - BOOST_CHECK_THROW(value.asUint16(), InvalidConversion); - BOOST_CHECK_THROW(value.asInt16(), InvalidConversion); - BOOST_CHECK_THROW(value.asUint32(), InvalidConversion); - BOOST_CHECK_THROW(value.asInt32(), InvalidConversion); - BOOST_CHECK_THROW(value.asUint64(), InvalidConversion); - BOOST_CHECK_THROW(value.asInt64(), InvalidConversion); - BOOST_CHECK_THROW(value.asFloat(), InvalidConversion); - BOOST_CHECK_THROW(value.asDouble(), InvalidConversion); - - 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_CASE(parse) -{ - Variant a; - a.parse("What a fine mess"); - BOOST_CHECK(a.getType()==types::VAR_STRING); - a.parse("true"); - BOOST_CHECK(a.getType()==types::VAR_BOOL); - a.parse("FalsE"); - BOOST_CHECK(a.getType()==types::VAR_BOOL); - a.parse("3.1415926"); - BOOST_CHECK(a.getType()==types::VAR_DOUBLE); - a.parse("-7.2e-15"); - BOOST_CHECK(a.getType()==types::VAR_DOUBLE); - a.parse("9223372036854775807"); - BOOST_CHECK(a.getType()==types::VAR_INT64); - a.parse("9223372036854775808"); - BOOST_CHECK(a.getType()==types::VAR_UINT64); - a.parse("-9223372036854775807"); - BOOST_CHECK(a.getType()==types::VAR_INT64); - a.parse("-9223372036854775808"); - BOOST_CHECK(a.getType()==types::VAR_DOUBLE); - a.parse("18446744073709551615"); - BOOST_CHECK(a.getType()==types::VAR_UINT64); - a.parse("18446744073709551616"); - BOOST_CHECK(a.getType()==types::VAR_DOUBLE); -} - -QPID_AUTO_TEST_CASE(described) -{ - Variant a; - BOOST_CHECK(!a.isDescribed()); - a.getDescriptors().push_back("foo"); - BOOST_CHECK(a.isDescribed()); - BOOST_CHECK_EQUAL(a.getDescriptors().size(), 1U); - BOOST_CHECK_EQUAL(a.getDescriptors().front(), Variant("foo")); - a = 42; - BOOST_CHECK(a.isDescribed()); - BOOST_CHECK_EQUAL(a.getDescriptors().size(), 1U); - BOOST_CHECK_EQUAL(a.getDescriptors().front(), Variant("foo")); - a.getDescriptors().push_back(33); - BOOST_CHECK_EQUAL(a.getDescriptors().size(), 2U); - BOOST_CHECK_EQUAL(a.getDescriptors().front(), Variant("foo")); - BOOST_CHECK_EQUAL(*(++a.getDescriptors().begin()), Variant(33)); - a.getDescriptors().clear(); - BOOST_CHECK(!a.isDescribed()); -} - -QPID_AUTO_TEST_SUITE_END() - -}} // namespace qpid::tests diff --git a/qpid/cpp/src/tests/XmlClientSessionTest.cpp b/qpid/cpp/src/tests/XmlClientSessionTest.cpp deleted file mode 100644 index bfa6ed096b..0000000000 --- a/qpid/cpp/src/tests/XmlClientSessionTest.cpp +++ /dev/null @@ -1,301 +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) - -struct XmlFixture { - XmlFixture() { - qpid::sys::Shlib shlib(getLibPath("XML_LIB")); - } - ~XmlFixture() {} -}; - -using namespace qpid::client; -using namespace qpid::client::arg; -using namespace qpid::framing; -using namespace qpid; - -using qpid::sys::Monitor; -using std::string; -using std::cout; -using std::endl; - - -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 SessionFixture -{ - 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_FIXTURE_TEST_CASE(testXmlBinding, XmlFixture) { - 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_FIXTURE_TEST_CASE(testXMLBindMultipleQueues, XmlFixture) { - 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_FIXTURE_TEST_CASE(testXMLSendBadXML, XmlFixture) { - 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_FIXTURE_TEST_CASE(testXMLBadXQuery, XmlFixture) { - 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_FIXTURE_TEST_CASE(testXmlBindingUntyped, XmlFixture) { - 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_FIXTURE_TEST_CASE(testXmlBindingTyped, XmlFixture) { - 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/qpid/cpp/src/tests/acl.py b/qpid/cpp/src/tests/acl.py deleted file mode 100755 index 2838bd3f83..0000000000 --- a/qpid/cpp/src/tests/acl.py +++ /dev/null @@ -1,3959 +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 -from qpidtoollibs import BrokerAgent - -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): - - # required for testing QMF methods - def get_messaging_connection(self, user, passwd): - parms = {'username':user, 'password':passwd, 'sasl_mechanisms':'PLAIN'} - brokerurl="%s:%s" %(self.broker.host, self.broker.port) - connection = qpid.messaging.Connection(brokerurl, **parms) - connection.open() - return connection - - # For connection limit tests this function - # throws if the connection won't start - # returns a connection that the caller can close if he likes. - def get_connection(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 - - 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 port_i(self): - return int(self.defines["port-i"]) - - def port_u(self): - return int(self.defines["port-u"]) - - def port_q(self): - return int(self.defines["port-q"]) - - def get_session_by_port(self, user, passwd, byPort): - socket = connect(self.broker.host, byPort) - connection = Connection (sock=socket, username=user, password=passwd, - mechanism="PLAIN") - connection.start() - return connection.session(str(uuid4())) - - def reload_acl(self): - result = None - try: - self.broker_access.reloadAclFile() - except Exception, e: - result = str(e) - return result - - def acl_lookup(self, userName, action, aclObj, aclObjName, propMap): - result = {} - try: - result = self.broker_access.acl_lookup(userName, action, aclObj, aclObjName, propMap) - except Exception, e: - result['text'] = str(e) - result['result'] = str(e) - return result - - def acl_lookupPublish(self, userName, exchange, key): - result = {} - try: - result = self.broker_access.acl_lookupPublish(userName, exchange, key) - except Exception, e: - result['text'] = str(e) - result['result'] = str(e) - return result - - 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.startBrokerAccess() - 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) - - - def Lookup(self, userName, action, aclObj, aclObjName, propMap, expectedResult): - result = self.acl_lookup(userName, action, aclObj, aclObjName, propMap) - if (result['result'] != expectedResult): - suffix = ', [ERROR: Expected= ' + expectedResult - if (result['result'] is None): - suffix = suffix + ', Exception= ' + result['text'] + ']' - else: - suffix = suffix + ', Actual= ' + result['result'] + ']' - self.fail('Lookup: name=' + userName + ', action=' + action + ', aclObj=' + aclObj + ', aclObjName=' + aclObjName + ', propertyMap=' + str(propMap) + suffix) - - - def LookupPublish(self, userName, exchName, keyName, expectedResult): - result = self.acl_lookupPublish(userName, exchName, keyName) - if (result['result'] != expectedResult): - suffix = ', [ERROR: Expected= ' + expectedResult - if (result['result'] is None): - suffix = suffix + ', Exception= ' + result['text'] + ']' - else: - suffix = suffix + ', Actual= ' + result['result'] + ']' - self.fail('LookupPublish: name=' + userName + ', exchange=' + exchName + ', key=' + keyName + suffix) - - def AllBut(self, allList, removeList): - tmpList = allList[:] - for item in removeList: - try: - tmpList.remove(item) - except Exception, e: - self.fail("ERROR in AllBut() \nallList = %s \nremoveList = %s \nerror = %s " \ - % (allList, removeList, e)) - return tmpList - - #===================================== - # 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): - 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): - 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) - - - def test_allow_mode_with_specfic_allow_override(self): - """ - Specific allow overrides a general deny - """ - aclf = self.get_acl_file() - aclf.write('group admins bob@QPID joe@QPID \n') - aclf.write('acl allow bob@QPID create queue \n') - aclf.write('acl deny admins create queue \n') - aclf.write('acl allow all all') - aclf.close() - - result = self.reload_acl() - if (result): - self.fail(result) - - session = self.get_session('bob','bob') - - try: - session.queue_declare(queue='zed') - except qpid.session.SessionException, e: - if (403 == e.args[0].error_code): - self.fail("ACL should allow create queue request"); - - - #===================================== - # 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.find("Insufficient tokens for acl definition",0,len(result)) == -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.find("Unknown ACL permission",0,len(result)) == -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.find("contains an illegal extension",0,len(result)) == -1): - self.fail(result) - - if (result.find("Non-continuation line must start with \"group\" or \"acl\"",0,len(result)) == -1): - self.fail(result) - - def test_illegal_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): - self.fail(result) - - def test_nested_groups(self): - """ - Test nested groups - """ - - aclf = self.get_acl_file() - aclf.write('group user-consume martin@QPID ted@QPID\n') - aclf.write('group group2 kim@QPID user-consume rob@QPID \n') - aclf.write('acl allow anonymous all all \n') - aclf.write('acl allow group2 create queue \n') - aclf.write('acl deny all all') - aclf.close() - - result = self.reload_acl() - if (result): - self.fail(result) - - session = self.get_session('rob','rob') - try: - session.queue_declare(queue="rob_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"); - - - - def test_user_realm(self): - """ - Test a user defined without a realm - Ex. group admin rajith - Note: a user name without a realm is interpreted as a group name - """ - 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.find("not defined yet.",0,len(result)) == -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): - 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.find("Username \"joe$H@EXAMPLE.com\" contains illegal characters",0,len(result)) == -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" - if (result.find(expected) == -1): - self.fail(result) - - def test_illegal_queuemaxsize_upper_limit_spec(self): - """ - Test illegal queue policy - """ - # - # Use maxqueuesize - # - 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 'queuemaxsizeupperlimit', " \ - "values should be between 0 and 9223372036854775807"; - if (result.find(expected) == -1): - 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 'queuemaxsizeupperlimit', " \ - "values should be between 0 and 9223372036854775807"; - if (result.find(expected) == -1): - self.fail(result) - - # - # Use queuemaxsizeupperlimit - # - aclf = self.get_acl_file() - aclf.write('acl deny bob@QPID create queue name=q2 queuemaxsizeupperlimit=-1\n') - aclf.write('acl allow all all') - aclf.close() - - result = self.reload_acl() - expected = "-1 is not a valid value for 'queuemaxsizeupperlimit', " \ - "values should be between 0 and 9223372036854775807"; - if (result.find(expected) == -1): - self.fail(result) - - aclf = self.get_acl_file() - aclf.write('acl deny bob@QPID create queue name=q2 queuemaxsizeupperlimit=9223372036854775808\n') - aclf.write('acl allow all all') - aclf.close() - - result = self.reload_acl() - expected = "9223372036854775808 is not a valid value for 'queuemaxsizeupperlimit', " \ - "values should be between 0 and 9223372036854775807"; - if (result.find(expected) == -1): - self.fail(result) - - - - def test_illegal_queuemaxcount_upper_limit_spec(self): - """ - Test illegal queue policy - """ - # - # Use maxqueuecount - # - - 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 'queuemaxcountupperlimit', " \ - "values should be between 0 and 9223372036854775807"; - if (result.find(expected) == -1): - 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 'queuemaxcountupperlimit', " \ - "values should be between 0 and 9223372036854775807"; - if (result.find(expected) == -1): - self.fail(result) - - # - # use maxqueuecountupperlimit - # - aclf = self.get_acl_file() - aclf.write('acl deny bob@QPID create queue name=q2 queuemaxcountupperlimit=-1\n') - aclf.write('acl allow all all') - aclf.close() - - result = self.reload_acl() - expected = "-1 is not a valid value for 'queuemaxcountupperlimit', " \ - "values should be between 0 and 9223372036854775807"; - if (result.find(expected) == -1): - self.fail(result) - - aclf = self.get_acl_file() - aclf.write('acl deny bob@QPID create queue name=q2 queuemaxcountupperlimit=9223372036854775808\n') - aclf.write('acl allow all all') - aclf.close() - - result = self.reload_acl() - expected = "9223372036854775808 is not a valid value for 'queuemaxcountupperlimit', " \ - "values should be between 0 and 9223372036854775807"; - if (result.find(expected) == -1): - self.fail(result) - - - def test_illegal_queuemaxsize_lower_limit_spec(self): - """ - Test illegal queue policy - """ - aclf = self.get_acl_file() - aclf.write('acl deny bob@QPID create queue name=q2 queuemaxsizelowerlimit=-1\n') - aclf.write('acl allow all all') - aclf.close() - - result = self.reload_acl() - expected = "-1 is not a valid value for 'queuemaxsizelowerlimit', " \ - "values should be between 0 and 9223372036854775807"; - if (result.find(expected) == -1): - self.fail(result) - - aclf = self.get_acl_file() - aclf.write('acl deny bob@QPID create queue name=q2 queuemaxsizelowerlimit=9223372036854775808\n') - aclf.write('acl allow all all') - aclf.close() - - result = self.reload_acl() - expected = "9223372036854775808 is not a valid value for 'queuemaxsizelowerlimit', " \ - "values should be between 0 and 9223372036854775807"; - if (result.find(expected) == -1): - self.fail(result) - - - - def test_illegal_queuemaxcount_lower_limit_spec(self): - """ - Test illegal queue policy - """ - - aclf = self.get_acl_file() - aclf.write('acl deny bob@QPID create queue name=q2 queuemaxcountlowerlimit=-1\n') - aclf.write('acl allow all all') - aclf.close() - - result = self.reload_acl() - expected = "-1 is not a valid value for 'queuemaxcountlowerlimit', " \ - "values should be between 0 and 9223372036854775807"; - if (result.find(expected) == -1): - self.fail(result) - - aclf = self.get_acl_file() - aclf.write('acl deny bob@QPID create queue name=q2 queuemaxcountlowerlimit=9223372036854775808\n') - aclf.write('acl allow all all') - aclf.close() - - result = self.reload_acl() - expected = "9223372036854775808 is not a valid value for 'queuemaxcountlowerlimit', " \ - "values should be between 0 and 9223372036854775807"; - if (result.find(expected) == -1): - self.fail(result) - - - def test_illegal_filemaxsize_upper_limit_spec(self): - """ - Test illegal file policy - """ - # - # Use filemaxsizeupperlimit - # - aclf = self.get_acl_file() - aclf.write('acl deny bob@QPID create queue name=q2 filemaxsizeupperlimit=-1\n') - aclf.write('acl allow all all') - aclf.close() - - result = self.reload_acl() - expected = "-1 is not a valid value for 'filemaxsizeupperlimit', " \ - "values should be between 0 and 9223372036854775807"; - if (result.find(expected) == -1): - self.fail(result) - - aclf = self.get_acl_file() - aclf.write('acl deny bob@QPID create queue name=q2 filemaxsizeupperlimit=9223372036854775808\n') - aclf.write('acl allow all all') - aclf.close() - - result = self.reload_acl() - expected = "9223372036854775808 is not a valid value for 'filemaxsizeupperlimit', " \ - "values should be between 0 and 9223372036854775807"; - if (result.find(expected) == -1): - self.fail(result) - - - - def test_illegal_filemaxcount_upper_limit_spec(self): - """ - Test illegal file policy - """ - # - # use maxfilecountupperlimit - # - aclf = self.get_acl_file() - aclf.write('acl deny bob@QPID create queue name=q2 filemaxcountupperlimit=-1\n') - aclf.write('acl allow all all') - aclf.close() - - result = self.reload_acl() - expected = "-1 is not a valid value for 'filemaxcountupperlimit', " \ - "values should be between 0 and 9223372036854775807"; - if (result.find(expected) == -1): - self.fail(result) - - aclf = self.get_acl_file() - aclf.write('acl deny bob@QPID create queue name=q2 filemaxcountupperlimit=9223372036854775808\n') - aclf.write('acl allow all all') - aclf.close() - - result = self.reload_acl() - expected = "9223372036854775808 is not a valid value for 'filemaxcountupperlimit', " \ - "values should be between 0 and 9223372036854775807"; - if (result.find(expected) == -1): - self.fail(result) - - - def test_illegal_filemaxsize_lower_limit_spec(self): - """ - Test illegal file policy - """ - aclf = self.get_acl_file() - aclf.write('acl deny bob@QPID create queue name=q2 filemaxsizelowerlimit=-1\n') - aclf.write('acl allow all all') - aclf.close() - - result = self.reload_acl() - expected = "-1 is not a valid value for 'filemaxsizelowerlimit', " \ - "values should be between 0 and 9223372036854775807"; - if (result.find(expected) == -1): - self.fail(result) - - aclf = self.get_acl_file() - aclf.write('acl deny bob@QPID create queue name=q2 filemaxsizelowerlimit=9223372036854775808\n') - aclf.write('acl allow all all') - aclf.close() - - result = self.reload_acl() - expected = "9223372036854775808 is not a valid value for 'filemaxsizelowerlimit', " \ - "values should be between 0 and 9223372036854775807"; - if (result.find(expected) == -1): - self.fail(result) - - - - def test_illegal_filemaxcount_lower_limit_spec(self): - """ - Test illegal file policy - """ - - aclf = self.get_acl_file() - aclf.write('acl deny bob@QPID create queue name=q2 filemaxcountlowerlimit=-1\n') - aclf.write('acl allow all all') - aclf.close() - - result = self.reload_acl() - expected = "-1 is not a valid value for 'filemaxcountlowerlimit', " \ - "values should be between 0 and 9223372036854775807"; - if (result.find(expected) == -1): - self.fail(result) - - aclf = self.get_acl_file() - aclf.write('acl deny bob@QPID create queue name=q2 filemaxcountlowerlimit=9223372036854775808\n') - aclf.write('acl allow all all') - aclf.close() - - result = self.reload_acl() - expected = "9223372036854775808 is not a valid value for 'filemaxcountlowerlimit', " \ - "values should be between 0 and 9223372036854775807"; - if (result.find(expected) == -1): - self.fail(result) - - - def test_illegal_pages_lower_limit_spec(self): - """ - Test illegal paged queue policy - """ - - aclf = self.get_acl_file() - aclf.write('acl deny bob@QPID create queue name=q2 pageslowerlimit=-1\n') - aclf.write('acl allow all all') - aclf.close() - - result = self.reload_acl() - expected = "-1 is not a valid value for 'pageslowerlimit', " \ - "values should be between 0 and 9223372036854775807"; - if (result.find(expected) == -1): - self.fail(result) - - aclf = self.get_acl_file() - aclf.write('acl deny bob@QPID create queue name=q2 pageslowerlimit=9223372036854775808\n') - aclf.write('acl allow all all') - aclf.close() - - result = self.reload_acl() - expected = "9223372036854775808 is not a valid value for 'pageslowerlimit', " \ - "values should be between 0 and 9223372036854775807"; - if (result.find(expected) == -1): - self.fail(result) - - - def test_illegal_pages_upper_limit_spec(self): - """ - Test illegal paged queue policy - """ - - aclf = self.get_acl_file() - aclf.write('acl deny bob@QPID create queue name=q2 pagesupperlimit=-1\n') - aclf.write('acl allow all all') - aclf.close() - - result = self.reload_acl() - expected = "-1 is not a valid value for 'pagesupperlimit', " \ - "values should be between 0 and 9223372036854775807"; - if (result.find(expected) == -1): - self.fail(result) - - aclf = self.get_acl_file() - aclf.write('acl deny bob@QPID create queue name=q2 pagesupperlimit=9223372036854775808\n') - aclf.write('acl allow all all') - aclf.close() - - result = self.reload_acl() - expected = "9223372036854775808 is not a valid value for 'pagesupperlimit', " \ - "values should be between 0 and 9223372036854775807"; - if (result.find(expected) == -1): - self.fail(result) - - - def test_illegal_pagefactor_lower_limit_spec(self): - """ - Test illegal paged queue policy - """ - - aclf = self.get_acl_file() - aclf.write('acl deny bob@QPID create queue name=q2 pagefactorlowerlimit=-1\n') - aclf.write('acl allow all all') - aclf.close() - - result = self.reload_acl() - expected = "-1 is not a valid value for 'pagefactorlowerlimit', " \ - "values should be between 0 and 9223372036854775807"; - if (result.find(expected) == -1): - self.fail(result) - - aclf = self.get_acl_file() - aclf.write('acl deny bob@QPID create queue name=q2 pagefactorlowerlimit=9223372036854775808\n') - aclf.write('acl allow all all') - aclf.close() - - result = self.reload_acl() - expected = "9223372036854775808 is not a valid value for 'pagefactorlowerlimit', " \ - "values should be between 0 and 9223372036854775807"; - if (result.find(expected) == -1): - self.fail(result) - - - def test_illegal_pagefactor_upper_limit_spec(self): - """ - Test illegal paged queue policy - """ - - aclf = self.get_acl_file() - aclf.write('acl deny bob@QPID create queue name=q2 pagefactorupperlimit=-1\n') - aclf.write('acl allow all all') - aclf.close() - - result = self.reload_acl() - expected = "-1 is not a valid value for 'pagefactorupperlimit', " \ - "values should be between 0 and 9223372036854775807"; - if (result.find(expected) == -1): - self.fail(result) - - aclf = self.get_acl_file() - aclf.write('acl deny bob@QPID create queue name=q2 pagefactorupperlimit=9223372036854775808\n') - aclf.write('acl allow all all') - aclf.close() - - result = self.reload_acl() - expected = "9223372036854775808 is not a valid value for 'pagefactorupperlimit', " \ - "values should be between 0 and 9223372036854775807"; - if (result.find(expected) == -1): - 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 access queue name=q1\n') - aclf.write('acl deny bob@QPID create queue name=q1 durable=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 delete queue name=q4\n') - aclf.write('acl deny bob@QPID create queue name=q5 maxqueuesize=1000 maxqueuecount=100\n') - aclf.write('acl deny bob@QPID create queue name=q6 paging=true\n') - aclf.write('acl deny bob@QPID purge queue name=q7\n') - aclf.write('acl deny bob@QPID move queue name=q7\n') - aclf.write('acl deny bob@QPID move queue name=q8 queuename=q7\n') - aclf.write('acl deny bob@QPID redirect queue name=q7\n') - aclf.write('acl deny bob@QPID redirect queue name=q8 queuename=q7\n') - aclf.write('acl deny bob@QPID reroute queue name=q7\n') - aclf.write('acl deny bob@QPID reroute queue name=q8 exchangename=amq.fanout\n') - aclf.write('acl allow all all') - aclf.close() - - result = self.reload_acl() - if (result): - self.fail(result) - - session = self.get_session('bob','bob') - - try: - session.queue_declare(queue="q1", durable=True) - self.fail("ACL should deny queue create request with name=q1 durable=true"); - except qpid.session.SessionException, e: - self.assertEqual(403,e.args[0].error_code) - session = self.get_session('bob','bob') - - try: - session.queue_declare(queue="q1", durable=True, passive=True) - self.fail("ACL should deny queue passive declare request with name=q1 durable=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.paging"] = True - session.queue_declare(queue="q6", arguments=queue_options) - self.fail("ACL should deny queue create request with name=q6, qpid.paging=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.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') - - # some queues needs to be created for testing purge / move / reroute / redirect - session.queue_declare(queue="q7") - session.queue_declare(queue="q8") - session.queue_declare(queue="q9") - try: - session.queue_purge(queue="q7") - self.fail("ACL should deny queue purge request for q7"); - except qpid.session.SessionException, e: - self.assertEqual(403,e.args[0].error_code) - session = self.get_session('bob','bob') - - try: - session.queue_purge(queue="q8") - except qpid.session.SessionException, e: - if (403 == e.args[0].error_code): - self.fail("ACL should allow queue purge request for q8"); - - # as we use QMF methods, it is easier to use BrokerAgent from messaging.connection and not use session object as above - broker_agent = BrokerAgent(self.get_messaging_connection('bob','bob')) - - try: - broker_agent.queueMoveMessages("q7", "q8", 0) - self.fail("ACL should deny queue move request from q7 to q8"); - except Exception, e: - self.assertTrue("'error_code': 7" in e.args[0]) - broker_agent = BrokerAgent(self.get_messaging_connection('bob','bob')) - - try: - broker_agent.queueMoveMessages("q8", "q9", 0) - except Exception, e: - if ("'error_code': 7" in e.args[0]): - self.fail("ACL should allow queue move request from q8 to q9"); - - try: - broker_agent.queueMoveMessages("q9", "q8", 0) - except Exception, e: - if ("'error_code': 7" in e.args[0]): - self.fail("ACL should allow queue move request from q9 to q8"); - - try: - broker_agent.Redirect("q7", "q8") - self.fail("ACL should deny queue redirect request from q7 to q8"); - except Exception, e: - self.assertTrue("'error_code': 7" in e.args[0]) - broker_agent = BrokerAgent(self.get_messaging_connection('bob','bob')) - - try: - broker_agent.Redirect("q8", "q9") - except Exception, e: - if ("'error_code': 7" in e.args[0]): - self.fail("ACL should allow queue redirect request from q8 to q9"); - - try: - broker_agent.Redirect("q9", "q8") - except Exception, e: - if ("'error_code': 7" in e.args[0]): - self.fail("ACL should allow queue redirect request from q9 to q8"); - - try: - broker_agent.getQueue('q7').reroute(0, False, "amq.fanout") - self.fail("ACL should deny queue reroute request from q7 to amq.fanout"); - except Exception, e: - self.assertTrue("'error_code': 7" in e.args[0]) - broker_agent = BrokerAgent(self.get_messaging_connection('bob','bob')) - - try: - broker_agent.getQueue('q8').reroute(0, False, "amq.fanout") - self.fail("ACL should deny queue reroute request from q8 to amq.fanout"); - except Exception, e: - self.assertTrue("'error_code': 7" in e.args[0]) - broker_agent = BrokerAgent(self.get_messaging_connection('bob','bob')) - - try: - broker_agent.getQueue('q8').reroute(0, False, "amq.direct") - except Exception, e: - if ("'error_code': 7" in e.args[0]): - self.fail("ACL should allow queue reroute request from q8 to amq.direct"); - - try: - broker_agent.getQueue('q9').reroute(0, False, "amq.fanout") - except Exception, e: - if ("'error_code': 7" in e.args[0]): - self.fail("ACL should allow queue reroute request from q9 to amq.fanout"); - - 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 access queue name=q1\n') - aclf.write('acl allow bob@QPID create queue name=q1 durable=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 bob@QPID create queue name=q6 queuemaxsizelowerlimit=50 queuemaxsizeupperlimit=100 queuemaxcountlowerlimit=50 queuemaxcountupperlimit=100\n') - aclf.write('acl allow bob@QPID create queue name=q7 policytype=self-destruct\n') - aclf.write('acl allow anonymous all all\n') - aclf.write('acl deny all all') - aclf.close() - - result = self.reload_acl() - if (result): - self.fail(result) - - session = self.get_session('bob','bob') - - try: - session.queue_declare(queue="q1", durable=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"); - - 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 passive declare 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=q5 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=q5 maxqueuesize=500 maxqueuecount=200"); - - try: - queue_options = {} - queue_options["qpid.max_count"] = 49 - queue_options["qpid.max_size"] = 100 - session.queue_declare(queue="q6", arguments=queue_options) - self.fail("ACL should deny queue create request with name=q6 maxqueuesize=100 maxqueuecount=49"); - 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"] = 101 - queue_options["qpid.max_size"] = 100 - session.queue_declare(queue="q6", arguments=queue_options) - self.fail("ACL should allow queue create request with name=q6 maxqueuesize=100 maxqueuecount=101"); - 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"] = 49 - session.queue_declare(queue="q6", arguments=queue_options) - self.fail("ACL should deny queue create request with name=q6 maxqueuesize=49 maxqueuecount=100"); - 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"] =101 - session.queue_declare(queue="q6", arguments=queue_options) - self.fail("ACL should deny queue create request with name=q6 maxqueuesize=101 maxqueuecount=100"); - 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"] = 50 - queue_options["qpid.max_size"] = 50 - session.queue_declare(queue="q6", 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=q6 maxqueuesize=50 maxqueuecount=50"); - - 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="q7", arguments={"qpid.policy_type": "ring"}) - self.fail("ACL should not allow queue create request for q7 with policytype=ring"); - except qpid.session.SessionException, e: - session = self.get_session('bob','bob') - - try: - session.queue_declare(queue="q7", arguments={"qpid.policy_type": "self-destruct"}) - except qpid.session.SessionException, e: - self.fail("ACL should allow queue create request for q7 with policytype=self-destruct"); - - 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 paged tests - #===================================== - - def test_paged_allow_mode(self): - """ - Test cases for paged acl in allow mode - """ - aclf = self.get_acl_file() - aclf.write('acl deny bob@QPID create queue name=qf1 pageslowerlimit=1000\n') - aclf.write('acl deny bob@QPID create queue name=qf2 pagesupperlimit=100\n') - aclf.write('acl deny bob@QPID create queue name=qf3 pagefactorlowerlimit=10\n') - aclf.write('acl deny bob@QPID create queue name=qf4 pagefactorupperlimit=1\n') - aclf.write('acl allow all all') - aclf.close() - - result = self.reload_acl() - if (result): - self.fail(result) - - session = self.get_session('bob','bob') - - try: - queue_options = {} - queue_options["qpid.paging"] = True - queue_options["qpid.max_pages_loaded"] = 500 - session.queue_declare(queue="qf1", arguments=queue_options) - self.fail("ACL should deny queue create request with name=qf1, qpid.paging=True, qpid.max_pages_loaded=500"); - 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.paging"] = True - queue_options["qpid.max_pages_loaded"] = 500 - session.queue_declare(queue="qf2", arguments=queue_options) - self.fail("ACL should deny queue create request with name=qf2, qpid.paging=True, qpid.max_pages_loaded=500"); - 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.paging"] = True - queue_options["qpid.page_factor"] = 5 - session.queue_declare(queue="qf3", arguments=queue_options) - self.fail("ACL should deny queue create request with name=qf3, qpid.paging=True, qpid.page_factor=5"); - 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.paging"] = True - queue_options["qpid.page_factor"] = 5 - session.queue_declare(queue="qf4", arguments=queue_options) - self.fail("ACL should deny queue create request with name=qf4, qpid.paging=True, qpid.page_factor=5"); - except qpid.session.SessionException, e: - self.assertEqual(403,e.args[0].error_code) - session = self.get_session('bob','bob') - - - def test_paged_deny_mode(self): - """ - Test cases for paged acl in deny mode - """ - aclf = self.get_acl_file() - aclf.write('acl allow bob@QPID create queue name=qf1 pageslowerlimit=100 pagesupperlimit=1000\n') - aclf.write('acl allow bob@QPID create queue name=qf2 pagefactorlowerlimit=1 pagefactorupperlimit=10\n') - aclf.write('acl allow anonymous all all\n') - aclf.write('acl deny all all') - aclf.close() - - result = self.reload_acl() - if (result): - self.fail(result) - - session = self.get_session('bob','bob') - - try: - queue_options = {} - queue_options["qpid.paging"] = True - queue_options["qpid.max_pages_loaded"] = 500 - session.queue_declare(queue="qf1", 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=qf1, qpid.paging=True, qpid.max_pages_loaded=500"); - session = self.get_session('bob','bob') - - try: - queue_options = {} - queue_options["qpid.paging"] = True - queue_options["qpid.page_factor"] = 5 - session.queue_declare(queue="qf2", 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=qf2, qpid.paging=True, qpid.page_factor=5"); - session = self.get_session('bob','bob') - - - #===================================== - # ACL file tests - #===================================== - - def test_file_allow_mode(self): - """ - Test cases for file acl in allow mode - """ - aclf = self.get_acl_file() - aclf.write('acl deny bob@QPID access queue name=qf1\n') - aclf.write('acl deny bob@QPID create queue name=qf1 durable=true\n') - aclf.write('acl deny bob@QPID create queue name=qf2 exclusive=true policytype=ring\n') - aclf.write('acl deny bob@QPID access queue name=qf3\n') - aclf.write('acl deny bob@QPID purge queue name=qf3\n') - aclf.write('acl deny bob@QPID delete queue name=qf4\n') - aclf.write('acl deny bob@QPID create queue name=qf5 filemaxsizeupperlimit=1000 filemaxcountupperlimit=100\n') - aclf.write('acl deny bob@QPID create queue name=ABCDE queuemaxsizelowerlimit=900000 queuemaxsizeupperlimit=1024000 queuemaxcountlowerlimit=900 queuemaxcountupperlimit=2000 filemaxsizelowerlimit=0 filemaxsizeupperlimit=32 filemaxcountlowerlimit=0 filemaxcountupperlimit=4 policytype=ring durable=false autodelete=true\n') - aclf.write('acl allow all all') - aclf.close() - - result = self.reload_acl() - if (result): - self.fail(result) - - session = self.get_session('bob','bob') - - self.Lookup("bob@QPID", "create", "queue", "ABCDE", {"durable":"false", - "autodelete":"true", - "exclusive":"false", - "alternate":"", - "policytype":"ring", - "maxqueuesize":"1024000", - "maxqueuecount":"1000", - "maxfilesize":"0", - "maxfilecount":"0" }, "deny") - - try: - queue_options = {} - queue_options["qpid.file_count"] = 200 - queue_options["qpid.file_size"] = 500 - session.queue_declare(queue="qf5", exclusive=True, durable=True, arguments=queue_options) - self.fail("ACL should deny queue create request with name=qf5, qpid.file_size=500 and qpid.file_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.file_count"] = 200 - queue_options["qpid.file_size"] = 100 - session.queue_declare(queue="qf2", 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=qf2, qpid.file_size=100 and qpid.file_count=200 "); - - - def test_file_deny_mode(self): - """ - Test cases for queue acl in deny mode - """ - aclf = self.get_acl_file() - aclf.write('acl allow bob@QPID access queue name=qfd1\n') - aclf.write('acl allow bob@QPID create queue name=qfd1 durable=true\n') - aclf.write('acl allow bob@QPID create queue name=qfd2 exclusive=true policytype=ring\n') - aclf.write('acl allow bob@QPID access queue name=qfd3\n') - aclf.write('acl allow bob@QPID purge queue name=qfd3\n') - aclf.write('acl allow bob@QPID create queue name=qfd3\n') - aclf.write('acl allow bob@QPID create queue name=qfd4\n') - aclf.write('acl allow bob@QPID delete queue name=qfd4\n') - aclf.write('acl allow bob@QPID create queue name=qfd5 filemaxsizeupperlimit=1000 filemaxcountupperlimit=100\n') - aclf.write('acl allow bob@QPID create queue name=qfd6 filemaxsizelowerlimit=50 filemaxsizeupperlimit=100 filemaxcountlowerlimit=50 filemaxcountupperlimit=100\n') - aclf.write('acl allow bob@QPID create queue name=ABCDE queuemaxsizelowerlimit=900000 queuemaxsizeupperlimit=1024000 queuemaxcountlowerlimit=900 queuemaxcountupperlimit=2000 filemaxsizelowerlimit=0 filemaxsizeupperlimit=32 filemaxcountlowerlimit=0 filemaxcountupperlimit=4 policytype=ring durable=false autodelete=true\n') - aclf.write('acl allow bob@QPID create queue name=FGHIJ queuemaxsizelowerlimit=900000 queuemaxsizeupperlimit=1024000 queuemaxcountlowerlimit=900 queuemaxcountupperlimit=2000 filemaxsizelowerlimit=2 filemaxsizeupperlimit=32 filemaxcountlowerlimit=0 filemaxcountupperlimit=4 policytype=ring durable=false autodelete=true\n') - aclf.write('acl allow bob@QPID create queue name=KLMNO queuemaxsizelowerlimit=900000 queuemaxsizeupperlimit=1024000 queuemaxcountlowerlimit=900 queuemaxcountupperlimit=2000 filemaxsizelowerlimit=0 filemaxsizeupperlimit=0 filemaxcountlowerlimit=0 filemaxcountupperlimit=4 policytype=ring durable=false autodelete=true\n') - aclf.write('acl allow anonymous all all\n') - aclf.write('acl deny all all') - aclf.close() - - result = self.reload_acl() - if (result): - self.fail(result) - - session = self.get_session('bob','bob') - - self.Lookup("bob@QPID", "create", "queue", "ABCDE", {"durable":"false", - "autodelete":"true", - "exclusive":"false", - "alternate":"", - "policytype":"ring", - "maxqueuesize":"1024000", - "maxqueuecount":"1000", - "maxfilesize":"0", - "maxfilecount":"0" }, "allow") - - self.Lookup("bob@QPID", "create", "queue", "FGHIJ", {"durable":"false", - "autodelete":"true", - "exclusive":"false", - "alternate":"", - "policytype":"ring", - "maxqueuesize":"1024000", - "maxqueuecount":"1000", - "maxfilesize":"1", - "maxfilecount":"0" }, "deny") - - self.Lookup("bob@QPID", "create", "queue", "FGHIJ", {"durable":"false", - "autodelete":"true", - "exclusive":"false", - "alternate":"", - "policytype":"ring", - "maxqueuesize":"1024000", - "maxqueuecount":"1000", - "maxfilesize":"2", - "maxfilecount":"0" }, "allow") - - self.Lookup("bob@QPID", "create", "queue", "FGHIJ", {"durable":"false", - "autodelete":"true", - "exclusive":"false", - "alternate":"", - "policytype":"ring", - "maxqueuesize":"1024000", - "maxqueuecount":"1000", - "maxfilesize":"32", - "maxfilecount":"0" }, "allow") - - self.Lookup("bob@QPID", "create", "queue", "FGHIJ", {"durable":"false", - "autodelete":"true", - "exclusive":"false", - "alternate":"", - "policytype":"ring", - "maxqueuesize":"1024000", - "maxqueuecount":"1000", - "maxfilesize":"33", - "maxfilecount":"0" }, "deny") - - self.Lookup("bob@QPID", "create", "queue", "KLMNO", {"durable":"false", - "autodelete":"true", - "exclusive":"false", - "alternate":"", - "policytype":"ring", - "maxqueuesize":"1024000", - "maxqueuecount":"1000", - "maxfilesize":"0", - "maxfilecount":"0" }, "allow") - - self.Lookup("bob@QPID", "create", "queue", "KLMNO", {"durable":"false", - "autodelete":"true", - "exclusive":"false", - "alternate":"", - "policytype":"ring", - "maxqueuesize":"1024000", - "maxqueuecount":"1000", - "maxfilesize":"17", - "maxfilecount":"0" }, "allow") - - self.Lookup("bob@QPID", "create", "queue", "KLMNO", {"durable":"false", - "autodelete":"true", - "exclusive":"false", - "alternate":"", - "policytype":"ring", - "maxqueuesize":"1024000", - "maxqueuecount":"1000", - "maxfilesize":"33", - "maxfilecount":"0" }, "allow") - - try: - session.queue_declare(queue="qfd1", durable=True) - except qpid.session.SessionException, e: - if (403 == e.args[0].error_code): - self.fail("ACL should allow queue create request with name=qfd1 durable=true"); - - try: - session.queue_declare(queue="qfd1", durable=True, passive=True) - except qpid.session.SessionException, e: - if (403 == e.args[0].error_code): - self.fail("ACL should allow queue passive declare request with name=qfd1 durable=true passive=true"); - - try: - session.queue_declare(queue="qfd1", durable=False, passive=False) - self.fail("ACL should deny queue create request with name=qfd1 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="qfd2", exclusive=False) - self.fail("ACL should deny queue create request with name=qfd2 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.file_count"] = 200 - queue_options["qpid.file_size"] = 500 - session.queue_declare(queue="qfd5", durable=True, arguments=queue_options) - self.fail("ACL should deny queue create request with name=qfd5 filemaxsizeupperlimit=500 filemaxcountupperlimit=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.file_count"] = 100 - queue_options["qpid.file_size"] = 500 - session.queue_declare(queue="qfd5", durable=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=qfd5 filemaxsizeupperlimit=500 filemaxcountupperlimit=200"); - - try: - queue_options = {} - queue_options["qpid.file_count"] = 49 - queue_options["qpid.file_size"] = 100 - session.queue_declare(queue="qfd6", durable=True, arguments=queue_options) - self.fail("ACL should deny queue create request with name=qfd6 filemaxsizeupperlimit=100 filemaxcountupperlimit=49"); - 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.file_count"] = 101 - queue_options["qpid.file_size"] = 100 - session.queue_declare(queue="qfd6", durable=True, arguments=queue_options) - self.fail("ACL should allow queue create request with name=qfd6 filemaxsizeupperlimit=100 filemaxcountupperlimit=101"); - 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.file_count"] = 100 - queue_options["qpid.file_size"] = 49 - session.queue_declare(queue="qfd6", durable=True, arguments=queue_options) - self.fail("ACL should deny queue create request with name=qfd6 filemaxsizeupperlimit=49 filemaxcountupperlimit=100"); - 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.file_count"] = 100 - queue_options["qpid.file_size"] =101 - session.queue_declare(queue="qfd6", durable=True, arguments=queue_options) - self.fail("ACL should deny queue create request with name=qfd6 filemaxsizeupperlimit=101 filemaxcountupperlimit=100"); - 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.file_count"] = 50 - queue_options["qpid.file_size"] = 50 - session.queue_declare(queue="qfd6", durable=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=qfd6 filemaxsizeupperlimit=50 filemaxcountupperlimit=50"); - - - #===================================== - # 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 access exchange name=testEx\n') - aclf.write('acl deny bob@QPID create exchange name=testEx durable=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): - 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) - self.fail("ACL should deny exchange create request with name=testEx durable=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', durable=True, passive=True) - self.fail("ACL should deny passive exchange declare 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=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"); - - 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\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): - 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='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): - 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 - - def test_qmf_query(self): - aclf = self.get_acl_file() - 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 allow bob@QPID access query name=org.apache.qpid.broker:queue:q1\n') - aclf.write('acl allow bob@QPID access query schemaclass=exchange\n') - aclf.write('acl deny all all') - aclf.close() - - result = self.reload_acl() - if (result): - self.fail(result) - - bob = BrokerAdmin(self.config.broker, "bob", "bob") - - try: - bob.query(object_name="org.apache.qpid.broker:queue:q1") - except Exception, e: - if ("unauthorized-access:" in e.args[0]): - self.fail("ACL should allow queue QMF query for q1"); - - try: - bob.query(object_name="org.apache.qpid.broker:queue:q2") - self.fail("ACL should deny queue QMF query for q2"); - except Exception, e: - self.assertTrue("unauthorized-access:" in e.args[0]) - bob = BrokerAdmin(self.config.broker, "bob", "bob") - - try: - bob.query(class_name="binding") - self.fail("ACL should deny class binding QMF query"); - except Exception, e: - self.assertTrue("unauthorized-access:" in e.args[0]) - bob = BrokerAdmin(self.config.broker, "bob", "bob") - - try: - bob.query(class_name="exchange") - except Exception, e: - if ("unauthorized-access:" in e.args[0]): - self.fail("ACL should allow class exchange QMF query"); - - - #===================================== - # 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): - 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='myq3') - session.message_cancel(destination='myq3') - 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): - 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 deny bob@QPID publish exchange name=amq.default routingkey=restricted\n") - aclf.write('acl allow all all') - aclf.close() - - result = self.reload_acl() - if (result): - 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"); - - self.LookupPublish("bob@QPID", "", "restricted", "deny") - self.LookupPublish("bob@QPID", "", "another", "allow") - self.LookupPublish("joe@QPID", "", "restricted", "allow") - - - 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 bob@QPID publish exchange name=amq.default routingkey=unrestricted\n") - aclf.write('acl allow anonymous all all \n') - aclf.write('acl deny all all') - aclf.close() - - result = self.reload_acl() - if (result): - 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"); - - self.LookupPublish("bob@QPID", "", "unrestricted", "allow") - self.LookupPublish("bob@QPID", "", "another", "deny") - self.LookupPublish("joe@QPID", "", "unrestricted", "deny") - - - #===================================== - # ACL broker configuration tests - #===================================== - - def test_broker_timestamp_config(self): - """ - Test ACL control of the broker timestamp configuration - """ - aclf = self.get_acl_file() - # enable lots of stuff to allow QMF to work - aclf.write('acl allow all create exchange\n') - aclf.write('acl allow all access exchange\n') - aclf.write('acl allow all bind exchange\n') - aclf.write('acl allow all publish 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') - # this should let bob access the timestamp configuration - aclf.write('acl allow bob@QPID access broker\n') - aclf.write('acl allow bob@QPID update broker\n') - aclf.write('acl allow admin@QPID all all\n') - aclf.write('acl deny all all') - aclf.close() - - result = self.reload_acl() - if (result): - self.fail(result) - - ts = None - bob = BrokerAdmin(self.config.broker, "bob", "bob") - ts = bob.get_timestamp_cfg() #should work - bob.set_timestamp_cfg(ts); #should work - - obo = BrokerAdmin(self.config.broker, "obo", "obo") - try: - ts = obo.get_timestamp_cfg() #should fail - failed = False - except Exception, e: - failed = True - self.assertEqual(7,e.args[0]["error_code"]) - assert e.args[0]["error_text"].find("unauthorized-access") == 0 - assert(failed) - - try: - obo.set_timestamp_cfg(ts) #should fail - failed = False - except Exception, e: - failed = True - self.assertEqual(7,e.args[0]["error_code"]) - assert e.args[0]["error_text"].find("unauthorized-access") == 0 - assert(failed) - - admin = BrokerAdmin(self.config.broker, "admin", "admin") - ts = admin.get_timestamp_cfg() #should pass - admin.set_timestamp_cfg(ts) #should pass - - - - #===================================== - # QMF Functional tests - #===================================== - - def test_qmf_functional_tests(self): - """ - Test using QMF method hooks into ACL logic - """ - aclf = self.get_acl_file() - aclf.write('group admins moe@COMPANY.COM \\\n') - aclf.write(' larry@COMPANY.COM \\\n') - aclf.write(' curly@COMPANY.COM \\\n') - aclf.write(' shemp@COMPANY.COM\n') - aclf.write('group auditors aaudit@COMPANY.COM baudit@COMPANY.COM caudit@COMPANY.COM \\\n') - aclf.write(' daudit@COMPANY.COM eaduit@COMPANY.COM eaudit@COMPANY.COM\n') - aclf.write('group tatunghosts tatung01@COMPANY.COM \\\n') - aclf.write(' tatung02/x86.build.company.com@COMPANY.COM \\\n') - aclf.write(' tatung03/x86.build.company.com@COMPANY.COM \\\n') - aclf.write(' tatung04/x86.build.company.com@COMPANY.COM \n') - aclf.write('group publishusers publish@COMPANY.COM x-pubs@COMPANY.COM\n') - aclf.write('acl allow-log admins all all\n') - aclf.write('# begin hack alert: allow anonymous to access the lookup debug functions\n') - aclf.write('acl allow-log anonymous create queue\n') - aclf.write('acl allow-log anonymous all exchange name=qmf.*\n') - aclf.write('acl allow-log anonymous all exchange name=amq.direct\n') - aclf.write('acl allow-log anonymous all exchange name=qpid.management\n') - aclf.write('acl allow-log anonymous access method name=*\n') - aclf.write('# end hack alert\n') - aclf.write('acl allow-log auditors all exchange name=company.topic routingkey=private.audit.*\n') - aclf.write('acl allow-log tatunghosts publish exchange name=company.topic routingkey=tatung.*\n') - aclf.write('acl allow-log tatunghosts publish exchange name=company.direct routingkey=tatung-service-queue\n') - aclf.write('acl allow-log publishusers create queue\n') - aclf.write('acl allow-log publishusers publish exchange name=qpid.management routingkey=broker\n') - aclf.write('acl allow-log publishusers publish exchange name=qmf.default.topic routingkey=*\n') - aclf.write('acl allow-log publishusers publish exchange name=qmf.default.direct routingkey=*\n') - aclf.write('acl allow-log all bind exchange name=company.topic routingkey=tatung.*\n') - aclf.write('acl allow-log all bind exchange name=company.direct routingkey=tatung-service-queue\n') - aclf.write('acl allow-log all consume queue\n') - aclf.write('acl allow-log all access exchange\n') - aclf.write('acl allow-log all access queue\n') - aclf.write('acl allow-log all create queue name=tmp.* durable=false autodelete=true exclusive=true policytype=ring\n') - aclf.write('acl allow mrQ create queue queuemaxsizelowerlimit=100 queuemaxsizeupperlimit=200 queuemaxcountlowerlimit=300 queuemaxcountupperlimit=400\n') - aclf.write('acl deny-log all all\n') - aclf.close() - - result = self.reload_acl() - if (result): - self.fail(result) - - # - # define some group lists - # - g_admins = ['moe@COMPANY.COM', \ - 'larry@COMPANY.COM', \ - 'curly@COMPANY.COM', \ - 'shemp@COMPANY.COM'] - - g_auditors = [ 'aaudit@COMPANY.COM','baudit@COMPANY.COM','caudit@COMPANY.COM', \ - 'daudit@COMPANY.COM','eaduit@COMPANY.COM','eaudit@COMPANY.COM'] - - g_tatunghosts = ['tatung01@COMPANY.COM', \ - 'tatung02/x86.build.company.com@COMPANY.COM', \ - 'tatung03/x86.build.company.com@COMPANY.COM', \ - 'tatung04/x86.build.company.com@COMPANY.COM'] - - g_publishusers = ['publish@COMPANY.COM', 'x-pubs@COMPANY.COM'] - - g_public = ['jpublic@COMPANY.COM', 'me@yahoo.com'] - - g_all = g_admins + g_auditors + g_tatunghosts + g_publishusers + g_public - - action_all = ['consume','publish','create','access','bind','unbind','delete','purge','update'] - - # - # Run some tests verifying against users who are in and who are out of given groups. - # - - for u in g_admins: - self.Lookup(u, "create", "queue", "anything", {"durable":"true"}, "allow-log") - uInTest = g_auditors + g_admins - uOutTest = self.AllBut(g_all, uInTest) - - for u in uInTest: - self.LookupPublish(u, "company.topic", "private.audit.This", "allow-log") - - for u in uInTest: - for a in ['bind', 'unbind', 'access', 'publish']: - self.Lookup(u, a, "exchange", "company.topic", {"routingkey":"private.audit.This"}, "allow-log") - - for u in uOutTest: - self.LookupPublish(u, "company.topic", "private.audit.This", "deny-log") - self.Lookup(u, "bind", "exchange", "company.topic", {"routingkey":"private.audit.This"}, "deny-log") - - uInTest = g_admins + g_tatunghosts - uOutTest = self.AllBut(g_all, uInTest) - - for u in uInTest: - self.LookupPublish(u, "company.topic", "tatung.this2", "allow-log") - self.LookupPublish(u, "company.direct", "tatung-service-queue", "allow-log") - - for u in uOutTest: - self.LookupPublish(u, "company.topic", "tatung.this2", "deny-log") - self.LookupPublish(u, "company.direct", "tatung-service-queue", "deny-log") - - for u in uOutTest: - for a in ["bind", "access"]: - self.Lookup(u, a, "exchange", "company.topic", {"routingkey":"tatung.this2"}, "allow-log") - self.Lookup(u, a, "exchange", "company.direct", {"routingkey":"tatung-service-queue"}, "allow-log") - - uInTest = g_admins + g_publishusers - uOutTest = self.AllBut(g_all, uInTest) - - for u in uInTest: - self.LookupPublish(u, "qpid.management", "broker", "allow-log") - self.LookupPublish(u, "qmf.default.topic", "this3", "allow-log") - self.LookupPublish(u, "qmf.default.direct", "this4", "allow-log") - - for u in uOutTest: - self.LookupPublish(u, "qpid.management", "broker", "deny-log") - self.LookupPublish(u, "qmf.default.topic", "this3", "deny-log") - self.LookupPublish(u, "qmf.default.direct", "this4", "deny-log") - - for u in uOutTest: - for a in ["bind"]: - self.Lookup(u, a, "exchange", "qpid.management", {"routingkey":"broker"}, "deny-log") - self.Lookup(u, a, "exchange", "qmf.default.topic", {"routingkey":"this3"}, "deny-log") - self.Lookup(u, a, "exchange", "qmf.default.direct", {"routingkey":"this4"}, "deny-log") - for a in ["access"]: - self.Lookup(u, a, "exchange", "qpid.management", {"routingkey":"broker"}, "allow-log") - self.Lookup(u, a, "exchange", "qmf.default.topic", {"routingkey":"this3"}, "allow-log") - self.Lookup(u, a, "exchange", "qmf.default.direct", {"routingkey":"this4"}, "allow-log") - - # Test against queue size limits - - self.Lookup('mrQ', 'create', 'queue', 'abc', {"maxqueuesize":"150", "maxqueuecount":"350"}, "allow") - self.Lookup('mrQ', 'create', 'queue', 'def', {"maxqueuesize":"99", "maxqueuecount":"350"}, "deny") - self.Lookup('mrQ', 'create', 'queue', 'uvw', {"maxqueuesize":"201", "maxqueuecount":"350"}, "deny") - self.Lookup('mrQ', 'create', 'queue', 'xyz', {"maxqueuesize":"150", "maxqueuecount":"299"}, "deny") - self.Lookup('mrQ', 'create', 'queue', '', {"maxqueuesize":"150", "maxqueuecount":"401"}, "deny") - self.Lookup('mrQ', 'create', 'queue', '', {"maxqueuesize":"0", "maxqueuecount":"401"}, "deny") - self.Lookup('mrQ', 'create', 'queue', '', {"maxqueuesize":"150", "maxqueuecount":"0" }, "deny") - - - #===================================== - # Routingkey lookup using Topic Exchange tests - #===================================== - - def test_topic_exchange_publish_tests(self): - """ - Test using QMF method hooks into ACL logic - """ - aclf = self.get_acl_file() - aclf.write('# begin hack alert: allow anonymous to access the lookup debug functions\n') - aclf.write('acl allow-log anonymous create queue\n') - aclf.write('acl allow-log anonymous all exchange name=qmf.*\n') - aclf.write('acl allow-log anonymous all exchange name=amq.direct\n') - aclf.write('acl allow-log anonymous all exchange name=qpid.management\n') - aclf.write('acl allow-log anonymous access method name=*\n') - aclf.write('# end hack alert\n') - aclf.write('acl allow-log uPlain1@COMPANY publish exchange name=X routingkey=ab.cd.e\n') - aclf.write('acl allow-log uPlain2@COMPANY publish exchange name=X routingkey=.\n') - aclf.write('acl allow-log uStar1@COMPANY publish exchange name=X routingkey=a.*.b\n') - aclf.write('acl allow-log uStar2@COMPANY publish exchange name=X routingkey=*.x\n') - aclf.write('acl allow-log uStar3@COMPANY publish exchange name=X routingkey=x.x.*\n') - aclf.write('acl allow-log uHash1@COMPANY publish exchange name=X routingkey=a.#.b\n') - aclf.write('acl allow-log uHash2@COMPANY publish exchange name=X routingkey=a.#\n') - aclf.write('acl allow-log uHash3@COMPANY publish exchange name=X routingkey=#.a\n') - aclf.write('acl allow-log uHash4@COMPANY publish exchange name=X routingkey=a.#.b.#.c\n') - aclf.write('acl allow-log uMixed1@COMPANY publish exchange name=X routingkey=*.x.#.y\n') - aclf.write('acl allow-log uMixed2@COMPANY publish exchange name=X routingkey=a.#.b.*\n') - aclf.write('acl allow-log uMixed3@COMPANY publish exchange name=X routingkey=*.*.*.#\n') - - aclf.write('acl allow-log all publish exchange name=X routingkey=MN.OP.Q\n') - aclf.write('acl allow-log all publish exchange name=X routingkey=M.*.N\n') - aclf.write('acl allow-log all publish exchange name=X routingkey=M.#.N\n') - aclf.write('acl allow-log all publish exchange name=X routingkey=*.M.#.N\n') - - aclf.write('acl deny-log all all\n') - aclf.close() - - result = self.reload_acl() - if (result): - self.fail(result) - - # aclKey: "ab.cd.e" - self.LookupPublish("uPlain1@COMPANY", "X", "ab.cd.e", "allow-log") - self.LookupPublish("uPlain1@COMPANY", "X", "abx.cd.e", "deny-log") - self.LookupPublish("uPlain1@COMPANY", "X", "ab.cd", "deny-log") - self.LookupPublish("uPlain1@COMPANY", "X", "ab.cd..e.", "deny-log") - self.LookupPublish("uPlain1@COMPANY", "X", "ab.cd.e.", "deny-log") - self.LookupPublish("uPlain1@COMPANY", "X", ".ab.cd.e", "deny-log") - # aclKey: "." - self.LookupPublish("uPlain2@COMPANY", "X", ".", "allow-log") - - # aclKey: "a.*.b" - self.LookupPublish("uStar1@COMPANY", "X", "a.xx.b", "allow-log") - self.LookupPublish("uStar1@COMPANY", "X", "a.b", "deny-log") - # aclKey: "*.x" - self.LookupPublish("uStar2@COMPANY", "X", "y.x", "allow-log") - self.LookupPublish("uStar2@COMPANY", "X", ".x", "allow-log") - self.LookupPublish("uStar2@COMPANY", "X", "x", "deny-log") - # aclKey: "x.x.*" - self.LookupPublish("uStar3@COMPANY", "X", "x.x.y", "allow-log") - self.LookupPublish("uStar3@COMPANY", "X", "x.x.", "allow-log") - self.LookupPublish("uStar3@COMPANY", "X", "x.x", "deny-log") - self.LookupPublish("uStar3@COMPANY", "X", "q.x.y", "deny-log") - - # aclKey: "a.#.b" - self.LookupPublish("uHash1@COMPANY", "X", "a.b", "allow-log") - self.LookupPublish("uHash1@COMPANY", "X", "a.x.b", "allow-log") - self.LookupPublish("uHash1@COMPANY", "X", "a..x.y.zz.b", "allow-log") - self.LookupPublish("uHash1@COMPANY", "X", "a.b.", "deny-log") - self.LookupPublish("uHash1@COMPANY", "X", "q.x.b", "deny-log") - - # aclKey: "a.#" - self.LookupPublish("uHash2@COMPANY", "X", "a", "allow-log") - self.LookupPublish("uHash2@COMPANY", "X", "a.b", "allow-log") - self.LookupPublish("uHash2@COMPANY", "X", "a.b.c", "allow-log") - - # aclKey: "#.a" - self.LookupPublish("uHash3@COMPANY", "X", "a", "allow-log") - self.LookupPublish("uHash3@COMPANY", "X", "x.y.a", "allow-log") - - # aclKey: "a.#.b.#.c" - self.LookupPublish("uHash4@COMPANY", "X", "a.b.c", "allow-log") - self.LookupPublish("uHash4@COMPANY", "X", "a.x.b.y.c", "allow-log") - self.LookupPublish("uHash4@COMPANY", "X", "a.x.x.b.y.y.c", "allow-log") - - # aclKey: "*.x.#.y" - self.LookupPublish("uMixed1@COMPANY", "X", "a.x.y", "allow-log") - self.LookupPublish("uMixed1@COMPANY", "X", "a.x.p.qq.y", "allow-log") - self.LookupPublish("uMixed1@COMPANY", "X", "a.a.x.y", "deny-log") - self.LookupPublish("uMixed1@COMPANY", "X", "aa.x.b.c", "deny-log") - - # aclKey: "a.#.b.*" - self.LookupPublish("uMixed2@COMPANY", "X", "a.b.x", "allow-log") - self.LookupPublish("uMixed2@COMPANY", "X", "a.x.x.x.b.x", "allow-log") - - # aclKey: "*.*.*.#" - self.LookupPublish("uMixed3@COMPANY", "X", "x.y.z", "allow-log") - self.LookupPublish("uMixed3@COMPANY", "X", "x.y.z.a.b.c", "allow-log") - self.LookupPublish("uMixed3@COMPANY", "X", "x.y", "deny-log") - self.LookupPublish("uMixed3@COMPANY", "X", "x", "deny-log") - - # Repeat the keys with wildcard user spec - self.LookupPublish("uPlain1@COMPANY", "X", "MN.OP.Q", "allow-log") - self.LookupPublish("uStar1@COMPANY" , "X", "M.xx.N", "allow-log") - self.LookupPublish("uHash1@COMPANY" , "X", "M.N", "allow-log") - self.LookupPublish("uHash1@COMPANY" , "X", "M.x.N", "allow-log") - self.LookupPublish("uHash1@COMPANY" , "X", "M..x.y.zz.N", "allow-log") - self.LookupPublish("uMixed1@COMPANY", "X", "a.M.N", "allow-log") - self.LookupPublish("uMixed1@COMPANY", "X", "a.M.p.qq.N", "allow-log") - - self.LookupPublish("dev@QPID", "X", "MN.OP.Q", "allow-log") - self.LookupPublish("dev@QPID", "X", "M.xx.N", "allow-log") - self.LookupPublish("dev@QPID", "X", "M.N", "allow-log") - self.LookupPublish("dev@QPID", "X", "M.x.N", "allow-log") - self.LookupPublish("dev@QPID", "X", "M..x.y.zz.N", "allow-log") - self.LookupPublish("dev@QPID", "X", "a.M.N", "allow-log") - self.LookupPublish("dev@QPID", "X", "a.M.p.qq.N", "allow-log") - - def test_topic_exchange_other_tests(self): - """ - Test using QMF method hooks into ACL logic - """ - action_list = ['access','bind','unbind'] - - aclf = self.get_acl_file() - aclf.write('# begin hack alert: allow anonymous to access the lookup debug functions\n') - aclf.write('acl allow-log anonymous create queue\n') - aclf.write('acl allow-log anonymous all exchange name=qmf.*\n') - aclf.write('acl allow-log anonymous all exchange name=amq.direct\n') - aclf.write('acl allow-log anonymous all exchange name=qpid.management\n') - aclf.write('acl allow-log anonymous access method name=*\n') - aclf.write('# end hack alert\n') - for action in action_list: - aclf.write('acl allow-log uPlain1@COMPANY ' + action + ' exchange name=X routingkey=ab.cd.e\n') - aclf.write('acl allow-log uPlain2@COMPANY ' + action + ' exchange name=X routingkey=.\n') - aclf.write('acl allow-log uStar1@COMPANY ' + action + ' exchange name=X routingkey=a.*.b\n') - aclf.write('acl allow-log uStar2@COMPANY ' + action + ' exchange name=X routingkey=*.x\n') - aclf.write('acl allow-log uStar3@COMPANY ' + action + ' exchange name=X routingkey=x.x.*\n') - aclf.write('acl allow-log uHash1@COMPANY ' + action + ' exchange name=X routingkey=a.#.b\n') - aclf.write('acl allow-log uHash2@COMPANY ' + action + ' exchange name=X routingkey=a.#\n') - aclf.write('acl allow-log uHash3@COMPANY ' + action + ' exchange name=X routingkey=#.a\n') - aclf.write('acl allow-log uHash4@COMPANY ' + action + ' exchange name=X routingkey=a.#.b.#.c\n') - aclf.write('acl allow-log uMixed1@COMPANY ' + action + ' exchange name=X routingkey=*.x.#.y\n') - aclf.write('acl allow-log uMixed2@COMPANY ' + action + ' exchange name=X routingkey=a.#.b.*\n') - aclf.write('acl allow-log uMixed3@COMPANY ' + action + ' exchange name=X routingkey=*.*.*.#\n') - - aclf.write('acl allow-log all ' + action + ' exchange name=X routingkey=MN.OP.Q\n') - aclf.write('acl allow-log all ' + action + ' exchange name=X routingkey=M.*.N\n') - aclf.write('acl allow-log all ' + action + ' exchange name=X routingkey=M.#.N\n') - aclf.write('acl allow-log all ' + action + ' exchange name=X routingkey=*.M.#.N\n') - - aclf.write('acl deny-log all all\n') - aclf.close() - - result = self.reload_acl() - if (result): - self.fail(result) - - for action in action_list: - # aclKey: "ab.cd.e" - self.Lookup("uPlain1@COMPANY", action, "exchange", "X", {"routingkey":"ab.cd.e"}, "allow-log") - self.Lookup("uPlain1@COMPANY", action, "exchange", "X", {"routingkey":"ab.cd.e"}, "allow-log") - - self.Lookup("uPlain1@COMPANY", action, "exchange", "X", {"routingkey":"ab.cd.e"}, "allow-log") - self.Lookup("uPlain1@COMPANY", action, "exchange", "X", {"routingkey":"abx.cd.e"}, "deny-log") - self.Lookup("uPlain1@COMPANY", action, "exchange", "X", {"routingkey":"ab.cd"}, "deny-log") - self.Lookup("uPlain1@COMPANY", action, "exchange", "X", {"routingkey":"ab.cd..e."}, "deny-log") - self.Lookup("uPlain1@COMPANY", action, "exchange", "X", {"routingkey":"ab.cd.e."}, "deny-log") - self.Lookup("uPlain1@COMPANY", action, "exchange", "X", {"routingkey":".ab.cd.e"}, "deny-log") - # aclKey: "." - self.Lookup("uPlain2@COMPANY", action, "exchange", "X", {"routingkey":"."}, "allow-log") - - # aclKey: "a.*.b" - self.Lookup("uStar1@COMPANY", action, "exchange", "X", {"routingkey":"a.xx.b"}, "allow-log") - self.Lookup("uStar1@COMPANY", action, "exchange", "X", {"routingkey":"a.b"}, "deny-log") - # aclKey: "*.x" - self.Lookup("uStar2@COMPANY", action, "exchange", "X", {"routingkey":"y.x"}, "allow-log") - self.Lookup("uStar2@COMPANY", action, "exchange", "X", {"routingkey":".x"}, "allow-log") - self.Lookup("uStar2@COMPANY", action, "exchange", "X", {"routingkey":"x"}, "deny-log") - # aclKey: "x.x.*" - self.Lookup("uStar3@COMPANY", action, "exchange", "X", {"routingkey":"x.x.y"}, "allow-log") - self.Lookup("uStar3@COMPANY", action, "exchange", "X", {"routingkey":"x.x."}, "allow-log") - self.Lookup("uStar3@COMPANY", action, "exchange", "X", {"routingkey":"x.x"}, "deny-log") - self.Lookup("uStar3@COMPANY", action, "exchange", "X", {"routingkey":"q.x.y"}, "deny-log") - - # aclKey: "a.#.b" - self.Lookup("uHash1@COMPANY", action, "exchange", "X", {"routingkey":"a.b"}, "allow-log") - self.Lookup("uHash1@COMPANY", action, "exchange", "X", {"routingkey":"a.x.b"}, "allow-log") - self.Lookup("uHash1@COMPANY", action, "exchange", "X", {"routingkey":"a..x.y.zz.b"}, "allow-log") - self.Lookup("uHash1@COMPANY", action, "exchange", "X", {"routingkey":"a.b."}, "deny-log") - self.Lookup("uHash1@COMPANY", action, "exchange", "X", {"routingkey":"q.x.b"}, "deny-log") - - # aclKey: "a.#" - self.Lookup("uHash2@COMPANY", action, "exchange", "X", {"routingkey":"a"}, "allow-log") - self.Lookup("uHash2@COMPANY", action, "exchange", "X", {"routingkey":"a.b"}, "allow-log") - self.Lookup("uHash2@COMPANY", action, "exchange", "X", {"routingkey":"a.b.c"}, "allow-log") - - # aclKey: "#.a" - self.Lookup("uHash3@COMPANY", action, "exchange", "X", {"routingkey":"a"}, "allow-log") - self.Lookup("uHash3@COMPANY", action, "exchange", "X", {"routingkey":"x.y.a"}, "allow-log") - - # aclKey: "a.#.b.#.c" - self.Lookup("uHash4@COMPANY", action, "exchange", "X", {"routingkey":"a.b.c"}, "allow-log") - self.Lookup("uHash4@COMPANY", action, "exchange", "X", {"routingkey":"a.x.b.y.c"}, "allow-log") - self.Lookup("uHash4@COMPANY", action, "exchange", "X", {"routingkey":"a.x.x.b.y.y.c"}, "allow-log") - - # aclKey: "*.x.#.y" - self.Lookup("uMixed1@COMPANY", action, "exchange", "X", {"routingkey":"a.x.y"}, "allow-log") - self.Lookup("uMixed1@COMPANY", action, "exchange", "X", {"routingkey":"a.x.p.qq.y"}, "allow-log") - self.Lookup("uMixed1@COMPANY", action, "exchange", "X", {"routingkey":"a.a.x.y"}, "deny-log") - self.Lookup("uMixed1@COMPANY", action, "exchange", "X", {"routingkey":"aa.x.b.c"}, "deny-log") - - # aclKey: "a.#.b.*" - self.Lookup("uMixed2@COMPANY", action, "exchange", "X", {"routingkey":"a.b.x"}, "allow-log") - self.Lookup("uMixed2@COMPANY", action, "exchange", "X", {"routingkey":"a.x.x.x.b.x"}, "allow-log") - - # aclKey: "*.*.*.#" - self.Lookup("uMixed3@COMPANY", action, "exchange", "X", {"routingkey":"x.y.z"}, "allow-log") - self.Lookup("uMixed3@COMPANY", action, "exchange", "X", {"routingkey":"x.y.z.a.b.c"}, "allow-log") - self.Lookup("uMixed3@COMPANY", action, "exchange", "X", {"routingkey":"x.y"}, "deny-log") - self.Lookup("uMixed3@COMPANY", action, "exchange", "X", {"routingkey":"x"}, "deny-log") - - # Repeat the keys with wildcard user spec - self.Lookup("uPlain1@COMPANY", action, "exchange", "X", {"routingkey":"MN.OP.Q"}, "allow-log") - self.Lookup("uStar1@COMPANY" , action, "exchange", "X", {"routingkey":"M.xx.N"}, "allow-log") - self.Lookup("uHash1@COMPANY" , action, "exchange", "X", {"routingkey":"M.N"}, "allow-log") - self.Lookup("uHash1@COMPANY" , action, "exchange", "X", {"routingkey":"M.x.N"}, "allow-log") - self.Lookup("uHash1@COMPANY" , action, "exchange", "X", {"routingkey":"M..x.y.zz.N"}, "allow-log") - self.Lookup("uMixed1@COMPANY", action, "exchange", "X", {"routingkey":"a.M.N"}, "allow-log") - self.Lookup("uMixed1@COMPANY", action, "exchange", "X", {"routingkey":"a.M.p.qq.N"}, "allow-log") - - self.Lookup("dev@QPID", action, "exchange", "X", {"routingkey": "MN.OP.Q"}, "allow-log") - self.Lookup("dev@QPID", action, "exchange", "X", {"routingkey": "M.xx.N"}, "allow-log") - self.Lookup("dev@QPID", action, "exchange", "X", {"routingkey": "M.N"}, "allow-log") - self.Lookup("dev@QPID", action, "exchange", "X", {"routingkey": "M.x.N"}, "allow-log") - self.Lookup("dev@QPID", action, "exchange", "X", {"routingkey": "M..x.y.zz.N"}, "allow-log") - self.Lookup("dev@QPID", action, "exchange", "X", {"routingkey": "a.M.N"}, "allow-log") - self.Lookup("dev@QPID", action, "exchange", "X", {"routingkey": "a.M.p.qq.N"}, "allow-log") - - #===================================== - # Connection limits - #===================================== - - def test_connection_limits_cli_sets_all(self): - - try: - sessiona1 = self.get_session_by_port('alice','alice', self.port_u()) - sessiona2 = self.get_session_by_port('alice','alice', self.port_u()) - except Exception, e: - self.fail("Could not create two connections for user alice: " + str(e)) - - # Third session should fail - try: - sessiona3 = self.get_session_by_port('alice','alice', self.port_u()) - self.fail("Should not be able to create third connection for user alice") - except Exception, e: - result = None - - - - def test_connection_limits_by_named_user(self): - """ - Test ACL control connection limits - """ - aclf = self.get_acl_file() - aclf.write('quota connections 2 aliceCL@QPID bobCL@QPID\n') - aclf.write('quota connections 0 evildude@QPID\n') - aclf.write('acl allow all all') - aclf.close() - - result = self.reload_acl() - if (result): - self.fail(result) - - # By username should be able to connect twice per user - try: - conna1 = self.get_connection('aliceCL','aliceCL') - conna2 = self.get_connection('aliceCL','aliceCL') - except Exception, e: - self.fail("Could not create two connections for user aliceCL: " + str(e)) - - # Third session should fail - try: - conna3 = self.get_connection('aliceCL','aliceCL') - self.fail("Should not be able to create third connection for user aliceCL") - except Exception, e: - result = None - - # Disconnecting should allow another session. - conna1.close() - try: - conna3 = self.get_connection('aliceCL','aliceCL') - except Exception, e: - self.fail("Could not recreate second connection for user aliceCL: " + str(e)) - - # By username should be able to connect twice per user - try: - connb1 = self.get_connection('bobCL','bobCL') - connb2 = self.get_connection('bobCL','bobCL') - except Exception, e: - self.fail("Could not create two connections for user bobCL: " + str(e)) - - # Third session should fail - try: - connb3 = self.get_connection('bobCL','bobCL') - self.fail("Should not be able to create third connection for user bobCL") - except Exception, e: - result = None - - - # User with quota of 0 is denied - try: - conne1 = self.get_connection('evildude','evildude') - self.fail("Should not be able to create a connection for user evildude") - except Exception, e: - result = None - - - # User not named in quotas is denied - try: - connc1 = self.get_connection('charlie','charlie') - self.fail("Should not be able to create a connection for user charlie") - except Exception, e: - result = None - - # Clean up the connections - conna2.close() - conna3.close() - connb1.close() - connb2.close() - - - - def test_connection_limits_by_unnamed_all(self): - """ - Test ACL control connection limits - """ - aclf = self.get_acl_file() - aclf.write('quota connections 2 aliceUA@QPID bobUA@QPID\n') - aclf.write('quota connections 1 all\n') - aclf.write('acl allow all all') - aclf.close() - - result = self.reload_acl() - if (result): - self.fail(result) - - # By username should be able to connect twice per user - try: - connectiona1 = self.get_connection('aliceUA','alice') - connectiona2 = self.get_connection('aliceUA','alice') - except Exception, e: - self.fail("Could not create two connections for user alice: " + str(e)) - - # Third connection should fail - try: - connectiona3 = self.get_connection('aliceUA','alice') - self.fail("Should not be able to create third connection for user alice") - except Exception, e: - result = None - - # By username should be able to connect twice per user - try: - connectionb1 = self.get_connection('bobUA','bob') - connectionb2 = self.get_connection('bobUA','bob') - except Exception, e: - self.fail("Could not create two connections for user bob: " + str(e)) - - # Third connection should fail - try: - connectionb3 = self.get_connection('bobUA','bob') - self.fail("Should not be able to create third connection for user bob") - except Exception, e: - result = None - - # User not named in quotas gets 'all' quota - try: - connectionc1 = self.get_connection('charlieUA','charlie') - except Exception, e: - self.fail("Could not create one connection for user charlie: " + str(e)) - - # Next connection should fail - try: - connectionc2 = self.get_connection('charlieUA','charlie') - self.fail("Should not be able to create second connection for user charlie") - except Exception, e: - result = None - - # Clean up the connections - connectiona1.close() - connectiona2.close() - connectionb1.close() - connectionb2.close() - connectionc1.close() - - - def test_connection_limits_by_group(self): - """ - Test ACL control connection limits - """ - aclf = self.get_acl_file() - aclf.write('group stooges moeGR@QPID larryGR@QPID curlyGR@QPID\n') - aclf.write('quota connections 2 aliceGR@QPID bobGR@QPID\n') - aclf.write('quota connections 2 stooges charlieGR@QPID\n') - aclf.write('# user and groups may be overwritten. Should use last value\n') - aclf.write('quota connections 3 bobGR@QPID stooges\n') - aclf.write('acl allow all all') - aclf.close() - - result = self.reload_acl() - if (result): - self.fail(result) - - # Alice gets 2 - try: - connectiona1 = self.get_connection('aliceGR','alice') - connectiona2 = self.get_connection('aliceGR','alice') - except Exception, e: - self.fail("Could not create two connections for user alice: " + str(e)) - - # Third connection should fail - try: - connectiona3 = self.get_connection('aliceGR','alice') - self.fail("Should not be able to create third connection for user alice") - except Exception, e: - result = None - - # Bob gets 3 - try: - connectionb1 = self.get_connection('bobGR','bob') - connectionb2 = self.get_connection('bobGR','bob') - connectionb3 = self.get_connection('bobGR','bob') - except Exception, e: - self.fail("Could not create three connections for user bob: " + str(e)) - - # Fourth connection should fail - try: - connectionb4 = self.get_connection('bobGR','bob') - self.fail("Should not be able to create fourth connection for user bob") - except Exception, e: - result = None - - # Moe gets 3 - try: - connectionm1 = self.get_connection('moeGR','moe') - connectionm2 = self.get_connection('moeGR','moe') - connectionm3 = self.get_connection('moeGR','moe') - except Exception, e: - self.fail("Could not create three connections for user moe: " + str(e)) - - # Fourth connection should fail - try: - connectionb4 = self.get_connection('moeGR','moe') - self.fail("Should not be able to create fourth connection for user ,pe") - except Exception, e: - result = None - - # User not named in quotas is denied - try: - connections1 = self.get_connection('shempGR','shemp') - self.fail("Should not be able to create a connection for user shemp") - except Exception, e: - result = None - - # Clean up the connections - connectiona1.close() - connectiona2.close() - connectionb1.close() - connectionb2.close() - connectionb3.close() - connectionm1.close() - connectionm2.close() - connectionm3.close() - - - def test_connection_limits_by_ip_address(self): - """ - Test ACL control connection limits by ip address - """ - # By IP address should be able to connect twice per client address - try: - sessionb1 = self.get_session_by_port('alice','alice', self.port_i()) - sessionb2 = self.get_session_by_port('bob','bob', self.port_i()) - except Exception, e: - self.fail("Could not create two connections for client address: " + str(e)) - - # Third session should fail - try: - sessionb3 = self.get_session_by_port('charlie','charlie', self.port_i()) - self.fail("Should not be able to create third connection for client address") - except Exception, e: - result = None - - sessionb1.close() - sessionb2.close() - - #===================================== - # User name substitution - #===================================== - - def test_user_name_substitution(self): - """ - Test name substitution internals, limits, and edge cases. - """ - aclf = self.get_acl_file() - aclf.write('# begin hack alert: allow anonymous to access the lookup debug functions\n') - aclf.write('acl allow-log anonymous create queue\n') - aclf.write('acl allow-log anonymous all exchange name=qmf.*\n') - aclf.write('acl allow-log anonymous all exchange name=amq.direct\n') - aclf.write('acl allow-log anonymous all exchange name=qpid.management\n') - aclf.write('acl allow-log anonymous access method name=*\n') - aclf.write('# end hack alert\n') - aclf.write('acl allow all create queue name=tmp-${userdomain}\n') - aclf.write('acl allow all create queue name=${userdomain}-tmp\n') - aclf.write('acl allow all create queue name=tmp-${userdomain}-tmp\n') - aclf.write('acl allow all create queue name=tmp-${userdomain}-tmp-${userdomain}\n') - aclf.write('acl allow all create queue name=temp0-${userdomain}\n') - aclf.write('acl allow all access queue name=temp0-${userdomain}\n') - aclf.write('acl allow all purge queue name=temp0-${userdomain}\n') - aclf.write('acl allow all consume queue name=temp0-${userdomain}\n') - aclf.write('acl allow all delete queue name=temp0-${userdomain}\n') - aclf.write('acl allow all create exchange name=temp0-${userdomain}\n') - aclf.write('acl allow all access exchange name=temp0-${userdomain}\n') - aclf.write('acl allow all bind exchange name=temp0-${userdomain}\n') - aclf.write('acl allow all unbind exchange name=temp0-${userdomain}\n') - aclf.write('acl allow all delete exchange name=temp0-${userdomain}\n') - aclf.write('acl allow all publish exchange name=temp0-${userdomain}\n') - - aclf.write('acl allow all publish exchange name=X routingkey=${userdomain}.cd.e\n') - aclf.write('acl allow all publish exchange name=X routingkey=a.*.${userdomain}\n') - aclf.write('acl allow all publish exchange name=X routingkey=b.#.${userdomain}\n') - aclf.write('acl allow all publish exchange name=X routingkey=*.${userdomain}.#.y\n') - - aclf.write('acl allow all create queue name=user-${user}\n') - aclf.write('acl allow all publish exchange name=U routingkey=${user}.cd.e\n') - aclf.write('acl allow all publish exchange name=U routingkey=a.*.${user}\n') - aclf.write('acl allow all publish exchange name=U routingkey=b.#.${user}\n') - aclf.write('acl allow all publish exchange name=U routingkey=*.${user}.#.y\n') - - aclf.write('acl allow all create queue name=domain-${domain}\n') - aclf.write('acl allow all publish exchange name=D routingkey=${domain}.cd.e\n') - aclf.write('acl allow all publish exchange name=D routingkey=a.*.${domain}\n') - aclf.write('acl allow all publish exchange name=D routingkey=b.#.${domain}\n') - aclf.write('acl allow all publish exchange name=D routingkey=*.${domain}.#.y\n') - - # Resolving ${user}_${domain} into ${userdomain} works for everything but routing keys - aclf.write('acl allow all create queue name=mixed-OK-${user}_${domain}\n') - # For routing keys ${user}_${domain} will be parsed into ${userdomain}. - # Routing keys not be found when the rule specifies ${user}_${domain}. - aclf.write('acl allow all publish exchange name=NOGO routingkey=${user}_${domain}.cd.e\n') - # This works since it is does not conflict with ${userdomain} - aclf.write('acl allow all publish exchange name=OK routingkey=${user}___${domain}.cd.e\n') - - aclf.write('acl deny-log all all\n') - aclf.close() - - result = self.reload_acl() - if (result): - self.fail(result) - - self.Lookup("alice@QPID", "create", "queue", "tmp-alice_QPID", {}, "allow") - self.Lookup("bob@QPID", "create", "queue", "bob_QPID-tmp", {}, "allow") - self.Lookup("charlie@QPID", "create", "queue", "tmp-charlie_QPID-tmp", {}, "allow") - self.Lookup("dave@QPID", "create", "queue", "tmp-dave_QPID-tmp-dave_QPID", {}, "allow") - self.Lookup("ed@BIG.COM", "create", "queue", "tmp-ed_BIG_COM", {}, "allow") - self.Lookup("c.e.r@BIG.GER.COM", "create", "queue", "tmp-c_e_r_BIG_GER_COM", {}, "allow") - self.Lookup("c@", "create", "queue", "tmp-c_", {}, "allow") - self.Lookup("someuser", "create", "queue", "tmp-someuser", {}, "allow") - - self.Lookup("alice@QPID", "create", "queue", "tmp-${user}", {}, "deny-log") - - self.Lookup("bob@QPID", "create", "exchange", "temp0-bob_QPID", {}, "allow") - self.Lookup("bob@QPID", "access", "exchange", "temp0-bob_QPID", {}, "allow") - self.Lookup("bob@QPID", "bind", "exchange", "temp0-bob_QPID", {}, "allow") - self.Lookup("bob@QPID", "unbind", "exchange", "temp0-bob_QPID", {}, "allow") - self.Lookup("bob@QPID", "delete", "exchange", "temp0-bob_QPID", {}, "allow") - self.LookupPublish("bob@QPID", "temp0-bob_QPID", "x", "allow") - - self.Lookup("bob@QPID", "create", "queue", "temp0-bob_QPID", {}, "allow") - self.Lookup("bob@QPID", "access", "queue", "temp0-bob_QPID", {}, "allow") - self.Lookup("bob@QPID", "purge", "queue", "temp0-bob_QPID", {}, "allow") - self.Lookup("bob@QPID", "consume", "queue", "temp0-bob_QPID", {}, "allow") - self.Lookup("bob@QPID", "delete", "queue", "temp0-bob_QPID", {}, "allow") - - self.Lookup("alice@QPID", "access", "queue", "temp0-bob_QPID", {}, "deny-log") - - # aclKey: "${userdomain}.cd.e" - self.LookupPublish("uPlain1@COMPANY", "X", "uPlain1_COMPANY.cd.e", "allow") - # aclKey: "a.*.${userdomain}" - self.LookupPublish("uStar1@COMPANY", "X", "a.xx.uStar1_COMPANY", "allow") - self.LookupPublish("uStar1@COMPANY", "X", "a.b", "deny-log") - # aclKey: "b.#.${userdomain}" - self.LookupPublish("uHash1@COMPANY", "X", "b.uHash1_COMPANY", "allow") - self.LookupPublish("uHash1@COMPANY", "X", "b.x.uHash1_COMPANY", "allow") - self.LookupPublish("uHash1@COMPANY", "X", "b..x.y.zz.uHash1_COMPANY", "allow") - self.LookupPublish("uHash1@COMPANY", "X", "b.uHash1_COMPANY.", "deny-log") - self.LookupPublish("uHash1@COMPANY", "X", "q.x.uHash1_COMPANY", "deny-log") - # aclKey: "*.${userdomain}.#.y" - self.LookupPublish("uMixed1@COMPANY", "X", "a.uMixed1_COMPANY.y", "allow") - self.LookupPublish("uMixed1@COMPANY", "X", "a.uMixed1_COMPANY.p.qq.y", "allow") - self.LookupPublish("uMixed1@COMPANY", "X", "a.a.uMixed1_COMPANY.y", "deny-log") - self.LookupPublish("uMixed1@COMPANY", "X", "aa.uMixed1_COMPANY.b.c", "deny-log") - self.LookupPublish("uMixed1@COMPANY.COM", "X", "a.uMixed1_COMPANY_COM.y", "allow") - - - self.Lookup("bob@QPID", "create", "queue", "user-bob", {}, "allow") - # aclKey: "${user}.cd.e" - self.LookupPublish("uPlain1@COMPANY", "U", "uPlain1.cd.e", "allow") - # aclKey: "a.*.${user}" - self.LookupPublish("uStar1@COMPANY", "U", "a.xx.uStar1", "allow") - self.LookupPublish("uStar1@COMPANY", "U", "a.b", "deny-log") - # aclKey: "b.#.${user}" - self.LookupPublish("uHash1@COMPANY", "U", "b.uHash1", "allow") - self.LookupPublish("uHash1@COMPANY", "U", "b.x.uHash1", "allow") - self.LookupPublish("uHash1@COMPANY", "U", "b..x.y.zz.uHash1", "allow") - self.LookupPublish("uHash1@COMPANY", "U", "b.uHash1.", "deny-log") - self.LookupPublish("uHash1@COMPANY", "U", "q.x.uHash1", "deny-log") - # aclKey: "*.${user}.#.y" - self.LookupPublish("uMixed1@COMPANY", "U", "a.uMixed1.y", "allow") - self.LookupPublish("uMixed1@COMPANY", "U", "a.uMixed1.p.qq.y", "allow") - self.LookupPublish("uMixed1@COMPANY", "U", "a.a.uMixed1.y", "deny-log") - self.LookupPublish("uMixed1@COMPANY", "U", "aa.uMixed1.b.c", "deny-log") - self.LookupPublish("uMixed1@COMPANY.COM", "U", "a.uMixed1.y", "allow") - - - self.Lookup("bob@QPID", "create", "queue", "domain-QPID", {}, "allow") - # aclKey: "${domain}.cd.e" - self.LookupPublish("uPlain1@COMPANY", "D", "COMPANY.cd.e", "allow") - # aclKey: "a.*.${domain}" - self.LookupPublish("uStar1@COMPANY", "D", "a.xx.COMPANY", "allow") - self.LookupPublish("uStar1@COMPANY", "D", "a.b", "deny-log") - # aclKey: "b.#.${domain}" - self.LookupPublish("uHash1@COMPANY", "D", "b.COMPANY", "allow") - self.LookupPublish("uHash1@COMPANY", "D", "b.x.COMPANY", "allow") - self.LookupPublish("uHash1@COMPANY", "D", "b..x.y.zz.COMPANY", "allow") - self.LookupPublish("uHash1@COMPANY", "D", "b.COMPANY.", "deny-log") - self.LookupPublish("uHash1@COMPANY", "D", "q.x.COMPANY", "deny-log") - # aclKey: "*.${domain}.#.y" - self.LookupPublish("uMixed1@COMPANY", "D", "a.COMPANY.y", "allow") - self.LookupPublish("uMixed1@COMPANY", "D", "a.COMPANY.p.qq.y", "allow") - self.LookupPublish("uMixed1@COMPANY", "D", "a.a.COMPANY.y", "deny-log") - self.LookupPublish("uMixed1@COMPANY", "D", "aa.COMPANY.b.c", "deny-log") - self.LookupPublish("uMixed1@COMPANY.COM", "D", "a.COMPANY_COM.y", "allow") - - self.Lookup("uPlain1@COMPANY", "create", "queue", "mixed-OK-uPlain1_COMPANY", {}, "allow") - self.LookupPublish("uPlain1@COMPANY", "NOGO", "uPlain1_COMPANY.cd.e", "deny-log") - self.LookupPublish("uPlain1@COMPANY", "OK", "uPlain1___COMPANY.cd.e", "allow") - - - #===================================== - # User name substitution details - #===================================== - # User name substitution allows for three flavors of keyword in the Acl file. - # Given a user name of bob.user@QPID.COM the keywords are normalized and resolve as follows: - # ${userdomain} - bob_user_QPID_COM - # ${user} - bob_user - # ${domain} - QPID_COM - # - # The following substitution tests are very similar but differ in the flavor of keyword used - # in the rules. The tests results using the different keywords differ slightly in how permissive - # the rules become. - # ${userdomain} limits access to one authenticated user - # ${user} limits access to a user name regardless of user's domain - # ${domain} limits access to a domain regardless of user name - # - - def test_user_name_substitution_userdomain(self): - """ - Test a setup where users can create, bind, and publish to a main exchange and queue. - Allow access to a single alternate exchange and queue. - """ - aclf = self.get_acl_file() - aclf.write('# begin hack alert: allow anonymous to access the lookup debug functions\n') - aclf.write('acl allow-log anonymous create queue\n') - aclf.write('acl allow-log anonymous all exchange name=qmf.*\n') - aclf.write('acl allow-log anonymous all exchange name=amq.direct\n') - aclf.write('acl allow-log anonymous all exchange name=qpid.management\n') - aclf.write('acl allow-log anonymous access method name=*\n') - aclf.write('# end hack alert\n') - # Create primary queue and exchange: - # allow predefined alternate - # deny any other alternate - # allow no alternate - aclf.write('acl allow all create queue name=${userdomain}-work alternate=${userdomain}-work2\n') - aclf.write('acl deny all create queue name=${userdomain}-work alternate=*\n') - aclf.write('acl allow all create queue name=${userdomain}-work\n') - aclf.write('acl allow all create exchange name=${userdomain}-work alternate=${userdomain}-work2\n') - aclf.write('acl deny all create exchange name=${userdomain}-work alternate=*\n') - aclf.write('acl allow all create exchange name=${userdomain}-work\n') - # Create backup queue and exchange - # Deny any alternate - aclf.write('acl deny all create queue name=${userdomain}-work2 alternate=*\n') - aclf.write('acl allow all create queue name=${userdomain}-work2\n') - aclf.write('acl deny all create exchange name=${userdomain}-work2 alternate=*\n') - aclf.write('acl allow all create exchange name=${userdomain}-work2\n') - # Bind/unbind primary exchange - # Use only predefined routingkey and queuename - aclf.write('acl allow all bind exchange name=${userdomain}-work routingkey=${userdomain} queuename=${userdomain}-work\n') - aclf.write('acl allow all unbind exchange name=${userdomain}-work routingkey=${userdomain} queuename=${userdomain}-work\n') - # Bind/unbind backup exchange - # Use only predefined routingkey and queuename - aclf.write('acl allow all bind exchange name=${userdomain}-work2 routingkey=${userdomain} queuename=${userdomain}-work2\n') - aclf.write('acl allow all unbind exchange name=${userdomain}-work2 routingkey=${userdomain} queuename=${userdomain}-work2\n') - # Access primary exchange - # Use only predefined routingkey and queuename - aclf.write('acl allow all access exchange name=${userdomain}-work routingkey=${userdomain} queuename=${userdomain}-work\n') - # Access backup exchange - # Use only predefined routingkey and queuename - aclf.write('acl allow all access exchange name=${userdomain}-work2 routingkey=${userdomain} queuename=${userdomain}-work2\n') - # Publish primary exchange - # Use only predefined routingkey - aclf.write('acl allow all publish exchange name=${userdomain}-work routingkey=${userdomain}\n') - # Publish backup exchange - # Use only predefined routingkey - aclf.write('acl allow all publish exchange name=${userdomain}-work2 routingkey=${userdomain}\n') - # deny mode - aclf.write('acl deny all all\n') - aclf.close() - - result = self.reload_acl() - if (result): - self.fail(result) - - # create queues - self.Lookup("bob@QPID", "create", "queue", "bob_QPID-work", {}, "allow") - self.Lookup("bob@QPID", "create", "queue", "bob_QPID-work2", {}, "allow") - self.Lookup("bob@QPID", "create", "queue", "joe_QPID-work", {}, "deny") - self.Lookup("bob@QPID", "create", "queue", "joe_QPID-work2", {}, "deny") - self.Lookup("bob@QPID", "create", "queue", "bob_QPID-work3", {}, "deny") - self.Lookup("bob@QPID", "create", "queue", "bob_QPID-work", {"alternate":"bob_QPID-work2"}, "allow") - self.Lookup("bob@QPID", "create", "queue", "bob_QPID-work", {"alternate":"joe_QPID-work2"}, "deny") - self.Lookup("bob@QPID", "create", "queue", "bob_QPID-work2", {"alternate":"someexchange"}, "deny") - # create exchanges - self.Lookup("bob@QPID", "create", "exchange", "bob_QPID-work", {}, "allow") - self.Lookup("bob@QPID", "create", "exchange", "bob_QPID-work2",{}, "allow") - self.Lookup("bob@QPID", "create", "exchange", "joe_QPID-work", {}, "deny") - self.Lookup("bob@QPID", "create", "exchange", "joe_QPID-work2",{}, "deny") - self.Lookup("bob@QPID", "create", "exchange", "bob_QPID-work3",{}, "deny") - self.Lookup("bob@QPID", "create", "exchange", "bob_QPID-work", {"alternate":"bob_QPID-work2"}, "allow") - self.Lookup("bob@QPID", "create", "exchange", "bob_QPID-work2",{"alternate":"someexchange"}, "deny") - # bind/unbind/access - self.Lookup("bob@QPID", "bind", "exchange", "bob_QPID-work", {}, "deny") - self.Lookup("bob@QPID", "bind", "exchange", "bob_QPID-work", {"routingkey":"bob_QPID"}, "deny") - self.Lookup("bob@QPID", "bind", "exchange", "bob_QPID-work", { "queuename":"bob_QPID-work"}, "deny") - self.Lookup("bob@QPID", "bind", "exchange", "bob_QPID-work", {"routingkey":"bob_QPID", "queuename":"bob_QPID-work"}, "allow") - self.Lookup("bob@QPID", "bind", "exchange", "joe_QPID-work", {"routingkey":"bob_QPID", "queuename":"bob_QPID-work"}, "deny") - self.Lookup("bob@QPID", "bind", "exchange", "bob_QPID-work", {"routingkey":"joe_QPID", "queuename":"bob_QPID-work"}, "deny") - self.Lookup("bob@QPID", "bind", "exchange", "bob_QPID-work", {"routingkey":"bob_QPID", "queuename":"joe_QPID-work"}, "deny") - - self.Lookup("bob@QPID", "bind", "exchange", "bob_QPID-work2", {}, "deny") - self.Lookup("bob@QPID", "bind", "exchange", "bob_QPID-work2", {"routingkey":"bob_QPID"}, "deny") - self.Lookup("bob@QPID", "bind", "exchange", "bob_QPID-work2", { "queuename":"bob_QPID-work2"}, "deny") - self.Lookup("bob@QPID", "bind", "exchange", "bob_QPID-work2", {"routingkey":"bob_QPID", "queuename":"bob_QPID-work2"}, "allow") - self.Lookup("bob@QPID", "bind", "exchange", "joe_QPID-work2", {"routingkey":"bob_QPID", "queuename":"bob_QPID-work2"}, "deny") - self.Lookup("bob@QPID", "bind", "exchange", "bob_QPID-work2", {"routingkey":"joe_QPID", "queuename":"bob_QPID-work2"}, "deny") - self.Lookup("bob@QPID", "bind", "exchange", "bob_QPID-work2", {"routingkey":"bob_QPID", "queuename":"joe_QPID-work2"}, "deny") - - self.Lookup("bob@QPID", "unbind", "exchange", "bob_QPID-work", {}, "deny") - self.Lookup("bob@QPID", "unbind", "exchange", "bob_QPID-work", {"routingkey":"bob_QPID"}, "deny") - self.Lookup("bob@QPID", "unbind", "exchange", "bob_QPID-work", { "queuename":"bob_QPID-work"}, "deny") - self.Lookup("bob@QPID", "unbind", "exchange", "bob_QPID-work", {"routingkey":"bob_QPID", "queuename":"bob_QPID-work"}, "allow") - self.Lookup("bob@QPID", "unbind", "exchange", "joe_QPID-work", {"routingkey":"bob_QPID", "queuename":"bob_QPID-work"}, "deny") - self.Lookup("bob@QPID", "unbind", "exchange", "bob_QPID-work", {"routingkey":"joe_QPID", "queuename":"bob_QPID-work"}, "deny") - self.Lookup("bob@QPID", "unbind", "exchange", "bob_QPID-work", {"routingkey":"bob_QPID", "queuename":"joe_QPID-work"}, "deny") - - self.Lookup("bob@QPID", "unbind", "exchange", "bob_QPID-work2", {}, "deny") - self.Lookup("bob@QPID", "unbind", "exchange", "bob_QPID-work2", {"routingkey":"bob_QPID"}, "deny") - self.Lookup("bob@QPID", "unbind", "exchange", "bob_QPID-work2", { "queuename":"bob_QPID-work2"}, "deny") - self.Lookup("bob@QPID", "unbind", "exchange", "bob_QPID-work2", {"routingkey":"bob_QPID", "queuename":"bob_QPID-work2"}, "allow") - self.Lookup("bob@QPID", "unbind", "exchange", "joe_QPID-work2", {"routingkey":"bob_QPID", "queuename":"bob_QPID-work2"}, "deny") - self.Lookup("bob@QPID", "unbind", "exchange", "bob_QPID-work2", {"routingkey":"joe_QPID", "queuename":"bob_QPID-work2"}, "deny") - self.Lookup("bob@QPID", "unbind", "exchange", "bob_QPID-work2", {"routingkey":"bob_QPID", "queuename":"joe_QPID-work2"}, "deny") - - self.Lookup("bob@QPID", "access", "exchange", "bob_QPID-work", {}, "deny") - self.Lookup("bob@QPID", "access", "exchange", "bob_QPID-work", {"routingkey":"bob_QPID"}, "deny") - self.Lookup("bob@QPID", "access", "exchange", "bob_QPID-work", { "queuename":"bob_QPID-work"}, "deny") - self.Lookup("bob@QPID", "access", "exchange", "bob_QPID-work", {"routingkey":"bob_QPID", "queuename":"bob_QPID-work"}, "allow") - self.Lookup("bob@QPID", "access", "exchange", "joe_QPID-work", {"routingkey":"bob_QPID", "queuename":"bob_QPID-work"}, "deny") - self.Lookup("bob@QPID", "access", "exchange", "bob_QPID-work", {"routingkey":"joe_QPID", "queuename":"bob_QPID-work"}, "deny") - self.Lookup("bob@QPID", "access", "exchange", "bob_QPID-work", {"routingkey":"bob_QPID", "queuename":"joe_QPID-work"}, "deny") - - self.Lookup("bob@QPID", "access", "exchange", "bob_QPID-work2", {}, "deny") - self.Lookup("bob@QPID", "access", "exchange", "bob_QPID-work2", {"routingkey":"bob_QPID"}, "deny") - self.Lookup("bob@QPID", "access", "exchange", "bob_QPID-work2", { "queuename":"bob_QPID-work2"}, "deny") - self.Lookup("bob@QPID", "access", "exchange", "bob_QPID-work2", {"routingkey":"bob_QPID", "queuename":"bob_QPID-work2"}, "allow") - self.Lookup("bob@QPID", "access", "exchange", "joe_QPID-work2", {"routingkey":"bob_QPID", "queuename":"bob_QPID-work2"}, "deny") - self.Lookup("bob@QPID", "access", "exchange", "bob_QPID-work2", {"routingkey":"joe_QPID", "queuename":"bob_QPID-work2"}, "deny") - self.Lookup("bob@QPID", "access", "exchange", "bob_QPID-work2", {"routingkey":"bob_QPID", "queuename":"joe_QPID-work2"}, "deny") - # publish - self.LookupPublish("bob@QPID", "bob_QPID-work", "bob_QPID", "allow") - self.LookupPublish("bob@QPID", "bob_QPID-work2", "bob_QPID", "allow") - self.LookupPublish("bob@QPID", "joe_QPID-work", "bob_QPID", "deny") - self.LookupPublish("bob@QPID", "joe_QPID-work2", "bob_QPID", "deny") - self.LookupPublish("bob@QPID", "bob_QPID-work", "joe_QPID", "deny") - self.LookupPublish("bob@QPID", "bob_QPID-work2", "joe_QPID", "deny") - - - def test_user_name_substitution_user(self): - """ - Test a setup where users can create, bind, and publish to a main exchange and queue. - Allow access to a single backup exchange and queue. - """ - aclf = self.get_acl_file() - aclf.write('# begin hack alert: allow anonymous to access the lookup debug functions\n') - aclf.write('acl allow-log anonymous create queue\n') - aclf.write('acl allow-log anonymous all exchange name=qmf.*\n') - aclf.write('acl allow-log anonymous all exchange name=amq.direct\n') - aclf.write('acl allow-log anonymous all exchange name=qpid.management\n') - aclf.write('acl allow-log anonymous access method name=*\n') - aclf.write('# end hack alert\n') - # Create primary queue and exchange - # allow predefined alternate - # deny any other alternate - # allow no alternate - aclf.write('acl allow all create queue name=${user}-work alternate=${user}-work2\n') - aclf.write('acl deny all create queue name=${user}-work alternate=*\n') - aclf.write('acl allow all create queue name=${user}-work\n') - aclf.write('acl allow all create exchange name=${user}-work alternate=${user}-work2\n') - aclf.write('acl deny all create exchange name=${user}-work alternate=*\n') - aclf.write('acl allow all create exchange name=${user}-work\n') - # Create backup queue and exchange - # Deny any alternate - aclf.write('acl deny all create queue name=${user}-work2 alternate=*\n') - aclf.write('acl allow all create queue name=${user}-work2\n') - aclf.write('acl deny all create exchange name=${user}-work2 alternate=*\n') - aclf.write('acl allow all create exchange name=${user}-work2\n') - # Bind/unbind primary exchange - # Use only predefined routingkey and queuename - aclf.write('acl allow all bind exchange name=${user}-work routingkey=${user} queuename=${user}-work\n') - aclf.write('acl allow all unbind exchange name=${user}-work routingkey=${user} queuename=${user}-work\n') - # Bind/unbind backup exchange - # Use only predefined routingkey and queuename - aclf.write('acl allow all bind exchange name=${user}-work2 routingkey=${user} queuename=${user}-work2\n') - aclf.write('acl allow all unbind exchange name=${user}-work2 routingkey=${user} queuename=${user}-work2\n') - # Access primary exchange - # Use only predefined routingkey and queuename - aclf.write('acl allow all access exchange name=${user}-work routingkey=${user} queuename=${user}-work\n') - # Access backup exchange - # Use only predefined routingkey and queuename - aclf.write('acl allow all access exchange name=${user}-work2 routingkey=${user} queuename=${user}-work2\n') - # Publish primary exchange - # Use only predefined routingkey - aclf.write('acl allow all publish exchange name=${user}-work routingkey=${user}\n') - # Publish backup exchange - # Use only predefined routingkey - aclf.write('acl allow all publish exchange name=${user}-work2 routingkey=${user}\n') - # deny mode - aclf.write('acl deny all all\n') - aclf.close() - - result = self.reload_acl() - if (result): - self.fail(result) - - # create queues - self.Lookup("bob@QPID", "create", "queue", "bob-work", {}, "allow") - self.Lookup("bob@QPID", "create", "queue", "bob-work2", {}, "allow") - self.Lookup("bob@QPID", "create", "queue", "joe-work", {}, "deny") - self.Lookup("bob@QPID", "create", "queue", "joe-work2", {}, "deny") - self.Lookup("bob@QPID", "create", "queue", "bob-work3", {}, "deny") - self.Lookup("bob@QPID", "create", "queue", "bob-work", {"alternate":"bob-work2"}, "allow") - self.Lookup("bob@QPID", "create", "queue", "bob-work", {"alternate":"joe-work2"}, "deny") - self.Lookup("bob@QPID", "create", "queue", "bob-work2", {"alternate":"someexchange"},"deny") - # create exchanges - self.Lookup("bob@QPID", "create", "exchange", "bob-work", {}, "allow") - self.Lookup("bob@QPID", "create", "exchange", "bob-work2",{}, "allow") - self.Lookup("bob@QPID", "create", "exchange", "joe-work", {}, "deny") - self.Lookup("bob@QPID", "create", "exchange", "joe-work2",{}, "deny") - self.Lookup("bob@QPID", "create", "exchange", "bob-work3",{}, "deny") - self.Lookup("bob@QPID", "create", "exchange", "bob-work", {"alternate":"bob-work2"}, "allow") - self.Lookup("bob@QPID", "create", "exchange", "bob-work2",{"alternate":"someexchange"},"deny") - # bind/unbind/access - self.Lookup("bob@QPID", "bind", "exchange", "bob-work", {}, "deny") - self.Lookup("bob@QPID", "bind", "exchange", "bob-work", {"routingkey":"bob"}, "deny") - self.Lookup("bob@QPID", "bind", "exchange", "bob-work", { "queuename":"bob-work"}, "deny") - self.Lookup("bob@QPID", "bind", "exchange", "bob-work", {"routingkey":"bob", "queuename":"bob-work"}, "allow") - self.Lookup("bob@QPID", "bind", "exchange", "joe-work", {"routingkey":"bob", "queuename":"bob-work"}, "deny") - self.Lookup("bob@QPID", "bind", "exchange", "bob-work", {"routingkey":"joe", "queuename":"bob-work"}, "deny") - self.Lookup("bob@QPID", "bind", "exchange", "bob-work", {"routingkey":"bob", "queuename":"joe-work"}, "deny") - - self.Lookup("bob@QPID", "bind", "exchange", "bob-work2", {}, "deny") - self.Lookup("bob@QPID", "bind", "exchange", "bob-work2", {"routingkey":"bob"}, "deny") - self.Lookup("bob@QPID", "bind", "exchange", "bob-work2", { "queuename":"bob-work2"}, "deny") - self.Lookup("bob@QPID", "bind", "exchange", "bob-work2", {"routingkey":"bob", "queuename":"bob-work2"}, "allow") - self.Lookup("bob@QPID", "bind", "exchange", "joe-work2", {"routingkey":"bob", "queuename":"bob-work2"}, "deny") - self.Lookup("bob@QPID", "bind", "exchange", "bob-work2", {"routingkey":"joe", "queuename":"bob-work2"}, "deny") - self.Lookup("bob@QPID", "bind", "exchange", "bob-work2", {"routingkey":"bob", "queuename":"joe-work2"}, "deny") - - self.Lookup("bob@QPID", "unbind", "exchange", "bob-work", {}, "deny") - self.Lookup("bob@QPID", "unbind", "exchange", "bob-work", {"routingkey":"bob"}, "deny") - self.Lookup("bob@QPID", "unbind", "exchange", "bob-work", { "queuename":"bob-work"}, "deny") - self.Lookup("bob@QPID", "unbind", "exchange", "bob-work", {"routingkey":"bob", "queuename":"bob-work"}, "allow") - self.Lookup("bob@QPID", "unbind", "exchange", "joe-work", {"routingkey":"bob", "queuename":"bob-work"}, "deny") - self.Lookup("bob@QPID", "unbind", "exchange", "bob-work", {"routingkey":"joe", "queuename":"bob-work"}, "deny") - self.Lookup("bob@QPID", "unbind", "exchange", "bob-work", {"routingkey":"bob", "queuename":"joe-work"}, "deny") - - self.Lookup("bob@QPID", "unbind", "exchange", "bob-work2", {}, "deny") - self.Lookup("bob@QPID", "unbind", "exchange", "bob-work2", {"routingkey":"bob"}, "deny") - self.Lookup("bob@QPID", "unbind", "exchange", "bob-work2", { "queuename":"bob-work2"}, "deny") - self.Lookup("bob@QPID", "unbind", "exchange", "bob-work2", {"routingkey":"bob", "queuename":"bob-work2"}, "allow") - self.Lookup("bob@QPID", "unbind", "exchange", "joe-work2", {"routingkey":"bob", "queuename":"bob-work2"}, "deny") - self.Lookup("bob@QPID", "unbind", "exchange", "bob-work2", {"routingkey":"joe", "queuename":"bob-work2"}, "deny") - self.Lookup("bob@QPID", "unbind", "exchange", "bob-work2", {"routingkey":"bob", "queuename":"joe-work2"}, "deny") - - self.Lookup("bob@QPID", "access", "exchange", "bob-work", {}, "deny") - self.Lookup("bob@QPID", "access", "exchange", "bob-work", {"routingkey":"bob"}, "deny") - self.Lookup("bob@QPID", "access", "exchange", "bob-work", { "queuename":"bob-work"}, "deny") - self.Lookup("bob@QPID", "access", "exchange", "bob-work", {"routingkey":"bob", "queuename":"bob-work"}, "allow") - self.Lookup("bob@QPID", "access", "exchange", "joe-work", {"routingkey":"bob", "queuename":"bob-work"}, "deny") - self.Lookup("bob@QPID", "access", "exchange", "bob-work", {"routingkey":"joe", "queuename":"bob-work"}, "deny") - self.Lookup("bob@QPID", "access", "exchange", "bob-work", {"routingkey":"bob", "queuename":"joe-work"}, "deny") - - self.Lookup("bob@QPID", "access", "exchange", "bob-work2", {}, "deny") - self.Lookup("bob@QPID", "access", "exchange", "bob-work2", {"routingkey":"bob"}, "deny") - self.Lookup("bob@QPID", "access", "exchange", "bob-work2", { "queuename":"bob-work2"}, "deny") - self.Lookup("bob@QPID", "access", "exchange", "bob-work2", {"routingkey":"bob", "queuename":"bob-work2"}, "allow") - self.Lookup("bob@QPID", "access", "exchange", "joe-work2", {"routingkey":"bob", "queuename":"bob-work2"}, "deny") - self.Lookup("bob@QPID", "access", "exchange", "bob-work2", {"routingkey":"joe", "queuename":"bob-work2"}, "deny") - self.Lookup("bob@QPID", "access", "exchange", "bob-work2", {"routingkey":"bob", "queuename":"joe-work2"}, "deny") - # publish - self.LookupPublish("bob@QPID", "bob-work", "bob", "allow") - self.LookupPublish("bob@QPID", "bob-work2", "bob", "allow") - self.LookupPublish("bob@QPID", "joe-work", "bob", "deny") - self.LookupPublish("bob@QPID", "joe-work2", "bob", "deny") - self.LookupPublish("bob@QPID", "bob-work", "joe", "deny") - self.LookupPublish("bob@QPID", "bob-work2", "joe", "deny") - - - def test_user_name_substitution_domain(self): - """ - Test a setup where users can create, bind, and publish to a main exchange and queue. - Allow access to a single backup exchange and queue. - """ - aclf = self.get_acl_file() - aclf.write('# begin hack alert: allow anonymous to access the lookup debug functions\n') - aclf.write('acl allow-log anonymous create queue\n') - aclf.write('acl allow-log anonymous all exchange name=qmf.*\n') - aclf.write('acl allow-log anonymous all exchange name=amq.direct\n') - aclf.write('acl allow-log anonymous all exchange name=qpid.management\n') - aclf.write('acl allow-log anonymous access method name=*\n') - aclf.write('# end hack alert\n') - # Create primary queue and exchange - # allow predefined alternate - # deny any other alternate - # allow no alternate - aclf.write('acl allow all create queue name=${domain}-work alternate=${domain}-work2\n') - aclf.write('acl deny all create queue name=${domain}-work alternate=*\n') - aclf.write('acl allow all create queue name=${domain}-work\n') - aclf.write('acl allow all create exchange name=${domain}-work alternate=${domain}-work2\n') - aclf.write('acl deny all create exchange name=${domain}-work alternate=*\n') - aclf.write('acl allow all create exchange name=${domain}-work\n') - # Create backup queue and exchange - # Deny any alternate - aclf.write('acl deny all create queue name=${domain}-work2 alternate=*\n') - aclf.write('acl allow all create queue name=${domain}-work2\n') - aclf.write('acl deny all create exchange name=${domain}-work2 alternate=*\n') - aclf.write('acl allow all create exchange name=${domain}-work2\n') - # Bind/unbind primary exchange - # Use only predefined routingkey and queuename - aclf.write('acl allow all bind exchange name=${domain}-work routingkey=${domain} queuename=${domain}-work\n') - aclf.write('acl allow all unbind exchange name=${domain}-work routingkey=${domain} queuename=${domain}-work\n') - # Bind/unbind backup exchange - # Use only predefined routingkey and queuename - aclf.write('acl allow all bind exchange name=${domain}-work2 routingkey=${domain} queuename=${domain}-work2\n') - aclf.write('acl allow all unbind exchange name=${domain}-work2 routingkey=${domain} queuename=${domain}-work2\n') - # Access primary exchange - # Use only predefined routingkey and queuename - aclf.write('acl allow all access exchange name=${domain}-work routingkey=${domain} queuename=${domain}-work\n') - # Access backup exchange - # Use only predefined routingkey and queuename - aclf.write('acl allow all access exchange name=${domain}-work2 routingkey=${domain} queuename=${domain}-work2\n') - # Publish primary exchange - # Use only predefined routingkey - aclf.write('acl allow all publish exchange name=${domain}-work routingkey=${domain}\n') - # Publish backup exchange - # Use only predefined routingkey - aclf.write('acl allow all publish exchange name=${domain}-work2 routingkey=${domain}\n') - # deny mode - aclf.write('acl deny all all\n') - aclf.close() - - result = self.reload_acl() - if (result): - self.fail(result) - - # create queues - self.Lookup("bob@QPID", "create", "queue", "QPID-work", {}, "allow") - self.Lookup("bob@QPID", "create", "queue", "QPID-work2", {}, "allow") - self.Lookup("bob@QPID", "create", "queue", "QPID-work3", {}, "deny") - self.Lookup("bob@QPID", "create", "queue", "QPID-work", {"alternate":"QPID-work2"}, "allow") - self.Lookup("bob@QPID", "create", "queue", "QPID-work", {"alternate":"bob_QPID-work2"},"deny") - self.Lookup("bob@QPID", "create", "queue", "QPID-work", {"alternate":"joe_QPID-work2"},"deny") - self.Lookup("bob@QPID", "create", "queue", "QPID-work2", {"alternate":"someexchange"}, "deny") - # create exchanges - self.Lookup("bob@QPID", "create", "exchange", "QPID-work", {}, "allow") - self.Lookup("bob@QPID", "create", "exchange", "QPID-work2",{}, "allow") - self.Lookup("bob@QPID", "create", "exchange", "QPID-work3",{}, "deny") - self.Lookup("bob@QPID", "create", "exchange", "QPID-work", {"alternate":"QPID-work2"}, "allow") - self.Lookup("bob@QPID", "create", "exchange", "QPID-work2",{"alternate":"someexchange"}, "deny") - # bind/unbind/access - self.Lookup("bob@QPID", "bind", "exchange", "QPID-work", {}, "deny") - self.Lookup("bob@QPID", "bind", "exchange", "QPID-work", {"routingkey":"QPID"}, "deny") - self.Lookup("bob@QPID", "bind", "exchange", "QPID-work", { "queuename":"QPID-work"}, "deny") - self.Lookup("bob@QPID", "bind", "exchange", "QPID-work", {"routingkey":"QPID", "queuename":"QPID-work"}, "allow") - - self.Lookup("bob@QPID", "bind", "exchange", "QPID-work2", {}, "deny") - self.Lookup("bob@QPID", "bind", "exchange", "QPID-work2", {"routingkey":"QPID"}, "deny") - self.Lookup("bob@QPID", "bind", "exchange", "QPID-work2", { "queuename":"QPID-work2"}, "deny") - self.Lookup("bob@QPID", "bind", "exchange", "QPID-work2", {"routingkey":"QPID", "queuename":"QPID-work2"}, "allow") - - self.Lookup("bob@QPID", "unbind", "exchange", "QPID-work", {}, "deny") - self.Lookup("bob@QPID", "unbind", "exchange", "QPID-work", {"routingkey":"QPID"}, "deny") - self.Lookup("bob@QPID", "unbind", "exchange", "QPID-work", { "queuename":"QPID-work"}, "deny") - self.Lookup("bob@QPID", "unbind", "exchange", "QPID-work", {"routingkey":"QPID", "queuename":"QPID-work"}, "allow") - - self.Lookup("bob@QPID", "unbind", "exchange", "QPID-work2", {}, "deny") - self.Lookup("bob@QPID", "unbind", "exchange", "QPID-work2", {"routingkey":"QPID"}, "deny") - self.Lookup("bob@QPID", "unbind", "exchange", "QPID-work2", { "queuename":"QPID-work2"}, "deny") - self.Lookup("bob@QPID", "unbind", "exchange", "QPID-work2", {"routingkey":"QPID", "queuename":"QPID-work2"}, "allow") - - self.Lookup("bob@QPID", "access", "exchange", "QPID-work", {}, "deny") - self.Lookup("bob@QPID", "access", "exchange", "QPID-work", {"routingkey":"QPID"}, "deny") - self.Lookup("bob@QPID", "access", "exchange", "QPID-work", { "queuename":"QPID-work"}, "deny") - self.Lookup("bob@QPID", "access", "exchange", "QPID-work", {"routingkey":"QPID", "queuename":"QPID-work"}, "allow") - - self.Lookup("bob@QPID", "access", "exchange", "QPID-work2", {}, "deny") - self.Lookup("bob@QPID", "access", "exchange", "QPID-work2", {"routingkey":"QPID"}, "deny") - self.Lookup("bob@QPID", "access", "exchange", "QPID-work2", { "queuename":"QPID-work2"}, "deny") - self.Lookup("bob@QPID", "access", "exchange", "QPID-work2", {"routingkey":"QPID", "queuename":"QPID-work2"}, "allow") - # publish - self.LookupPublish("bob@QPID", "QPID-work", "QPID", "allow") - self.LookupPublish("bob@QPID", "QPID-work2", "QPID", "allow") - self.LookupPublish("joe@QPID", "QPID-work", "QPID", "allow") - self.LookupPublish("joe@QPID", "QPID-work2", "QPID", "allow") - - #===================================== - # Queue per-user quota - #===================================== - - def queue_quota(self, user, passwd, count, byPort=None): - """ Helper method to: - - create a number of queues (should succeed) - - create too many queues (should fail) - - create another queue after deleting a queue (should succeed) - """ - - try: - if byPort: - session = self.get_session_by_port(user, passwd, byPort) - else: - session = self.get_session(user, passwd) - except Exception, e: - self.fail("Unexpected error creating session for %s: %s" % (user, str(e))) - - # Should be able to create count queues per user - try: - for i in range(count): - session.queue_declare(queue="%s%d" % (user, i)) - except Exception, e: - self.fail("Could not create %s for %s: %s" % ("%s%d" % (user, i), user, str(e))) - - # next queue should fail - try: - session.queue_declare(queue="%s%d" % (user, count)) - self.fail("Should not be able to create another queue for user %s" % user) - except Exception, e: - if byPort: - session = self.get_session_by_port(user, passwd, byPort) - else: - session = self.get_session(user, passwd) - - if count > 0: - # Deleting a queue should allow another queue. - session.queue_delete(queue="%s0" % user) - try: - session.queue_declare(queue="%s%d" % (user, count)) - except Exception, e: - self.fail("Could not recreate additional queue for user %s: %s " % (user, str(e))) - - # Clean up - for i in range(1, count+1): - session.queue_delete(queue="%s%d" % (user, i)) - try: - session.close() - except Exception, e: - pass - - def test_queue_per_named_user_quota(self): - """ - Test ACL queue counting limits per named user. - """ - aclf = self.get_acl_file() - aclf.write('quota queues 2 ted@QPID carrol@QPID\n') - aclf.write('quota queues 1 edward@QPID\n') - aclf.write('quota queues 0 mick@QPID\n') - aclf.write('acl allow all all') - aclf.close() - - result = self.reload_acl() - if (result): - self.fail(result) - - # named users should be able to create specified number of queues - self.queue_quota("ted", 'ted', 2) - self.queue_quota("carrol", 'carrol', 2) - self.queue_quota("edward", 'edward', 1) - - # User with quota of 0 is denied - self.queue_quota("mick", 'mick', 0) - - # User not named in quotas is denied - self.queue_quota("dan", 'dan', 0) - - def test_queue_per_user_quota(self): - """ - Test ACL queue counting limits. - port_q has a limit of 2 - """ - # bob should be able to create two queues - self.queue_quota("bob", 'bob', 2, self.port_q()) - - # alice should be able to create two queues - self.queue_quota("alice", 'alice', 2, self.port_q()) - - - def test_queue_limits_by_unnamed_all(self): - """ - Test ACL control queue limits - """ - aclf = self.get_acl_file() - aclf.write('quota queues 2 aliceQUA@QPID bobQUA@QPID\n') - aclf.write('quota queues 1 all\n') - aclf.write('acl allow all all') - aclf.close() - - result = self.reload_acl() - if (result): - self.fail(result) - - # By username should be able to connect twice per user - self.queue_quota('aliceQUA', 'alice', 2) - self.queue_quota('bobQUA', 'bob', 2) - - # User not named in quotas gets 'all' quota - self.queue_quota('charlieQUA', 'charlie', 1) - - - def test_queue_limits_by_group(self): - """ - Test ACL control queue limits - """ - aclf = self.get_acl_file() - aclf.write('group hobbits frodoGR@QPID samGR@QPID merryGR@QPID\n') - aclf.write('quota queues 2 gandalfGR@QPID aragornGR@QPID\n') - aclf.write('quota queues 2 hobbits rosieGR@QPID\n') - aclf.write('# user and groups may be overwritten. Should use last value\n') - aclf.write('quota queues 3 aragornGR@QPID hobbits\n') - aclf.write('acl allow all all') - aclf.close() - - result = self.reload_acl() - if (result): - self.fail(result) - - # gandalf gets 2 - self.queue_quota('gandalfGR', 'gandalf', 2) - - # aragorn gets 3 - self.queue_quota('aragornGR', 'aragorn', 3) - - # frodo gets 3 - self.queue_quota('frodoGR', 'frodo', 3) - - # User not named in quotas is denied - self.queue_quota('bilboGR', 'bilbo', 0) - - def test_queue_delete_with_properties(self): - """ - Test cases for queue delete with properties - """ - aclf = self.get_acl_file() - aclf.write('acl allow bob@QPID access queue\n') - aclf.write('acl allow bob@QPID access exchange\n') - aclf.write('acl allow bob@QPID create queue name=qdaq1 durable=true\n') - aclf.write('acl allow bob@QPID create queue name=qdaq2 exclusive=true\n') - aclf.write('acl allow bob@QPID create queue name=qdaq3 policytype=ring\n') - aclf.write('acl allow bob@QPID create queue name=qdaq4 durable=false\n') - aclf.write('acl allow bob@QPID create queue name=qdaq5 exclusive=false\n') - aclf.write('acl allow bob@QPID create queue name=qdaq6 policytype=reject\n') - aclf.write('acl allow bob@QPID create queue name=qdaq7 autodelete=true\n') - aclf.write('acl allow bob@QPID create queue name=qdaq8 autodelete=false\n') - aclf.write('acl allow bob@QPID create queue name=qdaq9\n') - aclf.write('acl allow bob@QPID create exchange name=qdae9\n') - aclf.write('acl deny bob@QPID delete queue name=qdaq1 durable=true\n') - aclf.write('acl deny bob@QPID delete queue name=qdaq2 exclusive=true\n') - aclf.write('acl deny bob@QPID delete queue name=qdaq3 policytype=ring\n') - aclf.write('acl deny bob@QPID delete queue name=qdaq4 durable=false\n') - aclf.write('acl deny bob@QPID delete queue name=qdaq5 exclusive=false\n') - aclf.write('acl deny bob@QPID delete queue name=qdaq6 policytype=reject\n') - aclf.write('acl deny bob@QPID delete queue name=qdaq7 autodelete=true\n') - aclf.write('acl deny bob@QPID delete queue name=qdaq8 autodelete=false\n') - aclf.write('acl deny bob@QPID delete queue name=qdaq9 alternate=qdaq9a\n') - aclf.write('acl allow all access queue\n') - aclf.write('acl allow anonymous all all\n') - aclf.write('acl deny all all') - aclf.close() - - result = self.reload_acl() - if (result): - self.fail(result) - - session = self.get_session('bob','bob') - - try: - session.queue_declare(queue="qdaq1", durable=True) - except qpid.session.SessionException, e: - if (403 == e.args[0].error_code): - self.fail("ACL should allow queue create request with name=qdaq1 durable=true"); - - try: - session.queue_delete(queue="qdaq1") - self.fail("ACL should deny queue delete request for qdaq1"); - except qpid.session.SessionException, e: - self.assertEqual(403,e.args[0].error_code) - session = self.get_session('bob','bob') - - try: - session.queue_declare(queue="qdaq2", exclusive=True) - except qpid.session.SessionException, e: - if (403 == e.args[0].error_code): - self.fail("ACL should allow queue create request with name=qdaq2 exclusive=true"); - - try: - session.queue_delete(queue="qdaq2") - self.fail("ACL should deny queue delete request for qdaq2"); - 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="qdaq3", arguments=queue_options) - except qpid.session.SessionException, e: - if (403 == e.args[0].error_code): - self.fail("ACL should allow queue create request for qdaq3 with policytype=ring"); - - try: - session.queue_delete(queue="qdaq3") - self.fail("ACL should deny queue delete request for qdaq3"); - except qpid.session.SessionException, e: - self.assertEqual(403,e.args[0].error_code) - session = self.get_session('bob','bob') - - try: - session.queue_declare(queue="qdaq4", durable=False) - except qpid.session.SessionException, e: - if (403 == e.args[0].error_code): - self.fail("ACL should allow queue create request with name=qdaq4 durable=false"); - - try: - session.queue_delete(queue="qdaq4") - self.fail("ACL should deny queue delete request for qdaq4"); - except qpid.session.SessionException, e: - self.assertEqual(403,e.args[0].error_code) - session = self.get_session('bob','bob') - - try: - session.queue_declare(queue="qdaq5", exclusive=False) - except qpid.session.SessionException, e: - if (403 == e.args[0].error_code): - self.fail("ACL should allow queue create request with name=qdaq5 exclusive=false"); - - try: - session.queue_delete(queue="qdaq5") - self.fail("ACL should deny queue delete request for qdaq5"); - 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"] = "reject" - session.queue_declare(queue="qdaq6", arguments=queue_options) - except qpid.session.SessionException, e: - if (403 == e.args[0].error_code): - self.fail("ACL should allow queue create request for qdaq6 with policytype=reject"); - - try: - session.queue_delete(queue="qdaq6") - self.fail("ACL should deny queue delete request for qdaq6"); - except qpid.session.SessionException, e: - self.assertEqual(403,e.args[0].error_code) - session = self.get_session('bob','bob') - - try: - session.queue_declare(queue="qdaq7", auto_delete=True) - except qpid.session.SessionException, e: - if (403 == e.args[0].error_code): - self.fail("ACL should allow queue create request with name=qdaq7 autodelete=true"); - - try: - session.queue_delete(queue="qdaq7") - self.fail("ACL should deny queue delete request for qdaq7"); - except qpid.session.SessionException, e: - self.assertEqual(403,e.args[0].error_code) - session = self.get_session('bob','bob') - - try: - session.queue_declare(queue="qdaq8", auto_delete=False) - except qpid.session.SessionException, e: - if (403 == e.args[0].error_code): - self.fail("ACL should allow queue create request with name=qdaq8 autodelete=false"); - - try: - session.queue_delete(queue="qdaq8") - self.fail("ACL should deny queue delete request for qdaq8"); - except qpid.session.SessionException, e: - self.assertEqual(403,e.args[0].error_code) - session = self.get_session('bob','bob') - - try: - session.exchange_declare(exchange='qdae9', type='direct') - except qpid.session.SessionException, e: - self.fail("ACL should allow exchange create request with name=qdae9"); - - try: - session.queue_declare(queue="qdaq9", alternate_exchange="qdae9") - except qpid.session.SessionException, e: - if (403 == e.args[0].error_code): - self.fail("ACL should allow queue create request with name=qdaq9 alternate=qdaq9a"); - - try: - session.queue_delete(queue="qdaq9") - self.fail("ACL should deny queue delete request for qdaq9"); - except qpid.session.SessionException, e: - self.assertEqual(403,e.args[0].error_code) - session = self.get_session('bob','bob') - - - def test_exchange_delete_with_properties(self): - """ - Test cases for exchange delete with properties - """ - aclf = self.get_acl_file() - aclf.write('acl allow bob@QPID access exchange\n') - aclf.write('acl allow bob@QPID create exchange\n') - aclf.write('acl deny bob@QPID delete exchange name=edae1 durable=true\n') - aclf.write('acl deny bob@QPID delete exchange name=edae2 alternate=edae2a\n') - aclf.write('acl deny bob@QPID delete exchange type=direct\n') - aclf.write('acl allow bob@QPID delete exchange type=headers\n') - aclf.write('acl allow anonymous all all\n') - aclf.write('acl deny all all') - aclf.close() - - result = self.reload_acl() - if (result): - self.fail(result) - - session = self.get_session('bob','bob') - - try: - session.exchange_declare(exchange='edae1', type='direct', durable=True) - except qpid.session.SessionException, e: - self.fail("ACL should allow exchange create request with name=edae1"); - - try: - session.exchange_delete(exchange="edae1") - self.fail("ACL should deny exchange delete request for edae1"); - except qpid.session.SessionException, e: - self.assertEqual(403,e.args[0].error_code) - session = self.get_session('bob','bob') - - try: - session.exchange_declare(exchange='edae2a', type='direct') - except qpid.session.SessionException, e: - self.fail("ACL should allow exchange create request with name=edae2a"); - - try: - session.exchange_declare(exchange='edae2', type='direct', alternate_exchange='edae2a') - except qpid.session.SessionException, e: - self.fail("ACL should allow exchange create request with name=edae2"); - - try: - session.exchange_delete(exchange="edae2") - self.fail("ACL should deny exchange delete request for edae2"); - except qpid.session.SessionException, e: - self.assertEqual(403,e.args[0].error_code) - session = self.get_session('bob','bob') - - try: - session.exchange_declare(exchange='edae3d', type='direct') - except qpid.session.SessionException, e: - self.fail("ACL should allow exchange create request with name=edae3d"); - - try: - session.exchange_declare(exchange='edae3h', type='headers') - except qpid.session.SessionException, e: - self.fail("ACL should allow exchange create request with name=eda3h"); - - try: - session.exchange_delete(exchange="edae3d") - self.fail("ACL should deny exchange delete request for edae3d"); - except qpid.session.SessionException, e: - self.assertEqual(403,e.args[0].error_code) - session = self.get_session('bob','bob') - - try: - session.exchange_delete(exchange="edae3h") - except qpid.session.SessionException, e: - self.assertEqual(403,e.args[0].error_code) - self.fail("ACL should allow exchange delete request for edae3h"); - - #===================================== - # 'create connection' tests - #===================================== -# def test_connect_mode_file_rejects_two_defaults(self): -# """ -# Should reject a file with two connect mode statements -# """ -# aclf = self.get_acl_file() -# aclf.write('acl allow all create connection host=all\n') -# aclf.write('acl allow all create connection host=all\n') -# aclf.close() -# -# result = self.reload_acl() -# if (result): -# pass -# else: -# self.fail(result) - - def test_connect_mode_accepts_host_spec_formats(self): - """ - Should accept host specs of various forms - """ - aclf = self.get_acl_file() - aclf.write('acl allow bob@QPID create connection host=all\n') - aclf.write('acl allow bob@QPID create connection host=1.1.1.1\n') - aclf.write('acl allow bob@QPID create connection host=1.1.1.1,2.2.2.2\n') - aclf.write('acl allow bob@QPID create connection host=localhost\n') - aclf.write('acl allow all all\n') - aclf.close() - - result = self.reload_acl() - if (result): - self.fail(result) - - def test_connect_mode_allow_all_mode(self): - """ - Should allow one 'all', 'all' - """ - aclf = self.get_acl_file() - aclf.write('acl allow all create connection host=all\n') - aclf.write('acl allow all all\n') - aclf.close() - - result = self.reload_acl() - if (result): - self.fail(result) - - session = self.get_session('bob','bob') - - - def test_connect_mode_allow_all_localhost(self): - """ - Should allow 'all' 'localhost' - """ - aclf = self.get_acl_file() - aclf.write('acl allow all create connection host=localhost\n') - aclf.write('acl deny all create connection host=all\n') - aclf.write('acl allow all all\n') - aclf.close() - - result = self.reload_acl() - if (result): - self.fail(result) - - session = self.get_session('bob','bob') - - - def test_connect_mode_global_deny(self): - """ - Should allow 'all' 'localhost' - """ - aclf = self.get_acl_file() - aclf.write('acl allow all create connection host=localhost\n') - aclf.write('acl deny all create connection host=all\n') - aclf.write('acl allow all all\n') - aclf.close() - - result = self.reload_acl() - if (result): - self.fail(result) - - session = self.get_session('bob','bob') - - self.Lookup("bob@QPID", "create", "connection", "", {"host":"127.0.0.1"}, "allow") - self.Lookup("bob@QPID", "create", "connection", "", {"host":"127.0.0.2"}, "deny") - - - def test_connect_mode_global_range(self): - """ - Should allow 'all' 'localhost' - """ - aclf = self.get_acl_file() - aclf.write('acl allow all create connection host=10.0.0.0,10.255.255.255\n') - aclf.write('acl allow all create connection host=localhost\n') - aclf.write('acl deny all create connection host=all\n') - aclf.write('acl allow all all\n') - aclf.close() - - result = self.reload_acl() - if (result): - self.fail(result) - - session = self.get_session('bob','bob') - - self.Lookup("bob@QPID", "create", "connection", "", {"host":"0.0.0.0"}, "deny") - self.Lookup("bob@QPID", "create", "connection", "", {"host":"9.255.255.255"}, "deny") - self.Lookup("bob@QPID", "create", "connection", "", {"host":"10.0.0.0"}, "allow") - self.Lookup("bob@QPID", "create", "connection", "", {"host":"10.255.255.255"}, "allow") - self.Lookup("bob@QPID", "create", "connection", "", {"host":"11.0.0.0"}, "deny") - self.Lookup("bob@QPID", "create", "connection", "", {"host":"255.255.255.255"},"deny") - - - def test_connect_mode_nested_ranges(self): - """ - Tests nested ranges for single user - """ - aclf = self.get_acl_file() - aclf.write('acl deny-log bob@QPID create connection host=10.0.1.0,10.0.1.255\n') - aclf.write('acl allow-log bob@QPID create connection host=10.0.0.0,10.255.255.255\n') - aclf.write('acl deny-log bob@QPID create connection host=all\n') - aclf.write('acl allow all create connection host=localhost\n') - aclf.write('acl allow all all\n') - aclf.close() - - result = self.reload_acl() - if (result): - self.fail(result) - - session = self.get_session('bob','bob') - - self.Lookup("bob@QPID", "create", "connection", "", {"host":"0.0.0.0"}, "deny-log") - self.Lookup("bob@QPID", "create", "connection", "", {"host":"9.255.255.255"}, "deny-log") - self.Lookup("bob@QPID", "create", "connection", "", {"host":"10.0.0.0"}, "allow-log") - self.Lookup("bob@QPID", "create", "connection", "", {"host":"10.0.0.255"}, "allow-log") - self.Lookup("bob@QPID", "create", "connection", "", {"host":"10.0.1.0"}, "deny-log") - self.Lookup("bob@QPID", "create", "connection", "", {"host":"10.0.1.255"}, "deny-log") - self.Lookup("bob@QPID", "create", "connection", "", {"host":"10.0.2.0"}, "allow-log") - self.Lookup("bob@QPID", "create", "connection", "", {"host":"10.255.255.255"}, "allow-log") - self.Lookup("bob@QPID", "create", "connection", "", {"host":"11.0.0.0"}, "deny-log") - self.Lookup("bob@QPID", "create", "connection", "", {"host":"255.255.255.255"},"deny-log") - - - def test_connect_mode_user_ranges(self): - """ - Two user ranges should not interfere with each other - """ - aclf = self.get_acl_file() - aclf.write('acl allow-log bob@QPID create connection host=10.0.0.0,10.255.255.255\n') - aclf.write('acl deny-log bob@QPID create connection host=all\n') - aclf.write('acl allow-log cat@QPID create connection host=192.168.0.0,192.168.255.255\n') - aclf.write('acl deny-log cat@QPID create connection host=all\n') - aclf.write('acl allow all create connection host=localhost\n') - aclf.write('acl allow all all\n') - aclf.close() - - result = self.reload_acl() - if (result): - self.fail(result) - - session = self.get_session('bob','bob') - - self.Lookup("bob@QPID", "create", "connection", "", {"host":"0.0.0.0"}, "deny-log") - self.Lookup("bob@QPID", "create", "connection", "", {"host":"9.255.255.255"}, "deny-log") - self.Lookup("bob@QPID", "create", "connection", "", {"host":"10.0.0.0"}, "allow-log") - self.Lookup("bob@QPID", "create", "connection", "", {"host":"10.255.255.255"}, "allow-log") - self.Lookup("bob@QPID", "create", "connection", "", {"host":"11.0.0.0"}, "deny-log") - self.Lookup("bob@QPID", "create", "connection", "", {"host":"255.255.255.255"},"deny-log") - self.Lookup("cat@QPID", "create", "connection", "", {"host":"0.0.0.0"}, "deny-log") - self.Lookup("cat@QPID", "create", "connection", "", {"host":"192.167.255.255"},"deny-log") - self.Lookup("cat@QPID", "create", "connection", "", {"host":"192.168.0.0"}, "allow-log") - self.Lookup("cat@QPID", "create", "connection", "", {"host":"192.168.255.255"},"allow-log") - self.Lookup("cat@QPID", "create", "connection", "", {"host":"192.169.0.0"}, "deny-log") - self.Lookup("cat@QPID", "create", "connection", "", {"host":"255.255.255.255"},"deny-log") - - -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 query(self, object_name=None, class_name=None): - content = { "_what": "OBJECT" } - if object_name is not None: - content["_object_id"] = {"_object_name": object_name } - if class_name is not None: - content["_schema_id"] = {"_class_name": class_name } - request = qpid.messaging.Message(reply_to=self.reply_to, content=content) - request.properties["x-amqp-0-10.app-id"] = "qmf2" - request.properties["qmf.opcode"] = "_query_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'] == '_query_response': - return - 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}) - - def get_timestamp_cfg(self): - return self.invoke("getTimestampConfig", {}) - - def set_timestamp_cfg(self, receive): - return self.invoke("getTimestampConfig", {"receive":receive}) diff --git a/qpid/cpp/src/tests/acl_1.py b/qpid/cpp/src/tests/acl_1.py deleted file mode 100644 index 79d87fdc6e..0000000000 --- a/qpid/cpp/src/tests/acl_1.py +++ /dev/null @@ -1,396 +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. -# - -from qpid.tests.messaging.implementation import * -from qpid.tests.messaging import VersionTest -from mgmt_1 import Mgmt - -class Policy(object): - def __init__(self): - self.lines = [] - - - def str(self): - return '\n'.join(lines) - -class AclCtrl(object): - def __init__(self, broker, path): - self.policy = path - self.original = self.read() - conn = Connection.establish(broker, protocol='amqp0-10', username='admin', password='admin', sasl_mechanism='PLAIN') - self.agent = Mgmt(conn) - self.agent.create('queue', 'acl_test_queue') - self.lines = [] - - def deny(self, user=None, *args): - self._add_rule('deny', user, *args) - return self - - def allow(self, user=None, *args): - self._add_rule('allow', user, *args) - return self - - def apply(self, allow_admin=True): - if allow_admin: - # admin users needs permission to send a qmf message to - # reload policy - self.lines.insert(0, 'acl allow admin@QPID all all') - self.specify("\n".join(self.lines)) - return self - - def dump(self): - print "\n".join(self.lines) - return self - - def clear(self): - self.lines = [] - return self - - def _add_rule(self, deny_or_allow, user=None, *args): - elements = ['acl', deny_or_allow] - if user: - elements.append("%s@QPID" % user) - else: - elements.append('all') - if len(args) > 0: - for a in args: - elements.append(a) - else: - elements.append('all') - self.lines.append(' '.join(elements)) - - def read(self): - f = open(self.policy,'r') - content = f.read() - f.close() - return content - - def specify(self, acl): - f = open(self.policy,'w') - f.write(acl) - f.close() - self.agent.reload_acl_file() - - def restore(self): - self.agent.delete('queue', 'acl_test_queue') - self.specify(self.original) - self.agent.close() - - -class Acl_AMQP1_Tests (VersionTest): - """ - Tests for acl when accessing qpidd via AMQP 1.0 - """ - def auth_session(self, user): - conn = Connection.establish(self.config.broker, protocol='amqp1.0', username=user, password=user, sasl_mechanism='PLAIN', container_id=user) - return conn.session() - - def setUp(self): - VersionTest.setup(self) - self.acl = AclCtrl(self.config.broker, self.config.defines.get("policy_file")) - self.alice = self.auth_session('alice') - self.bob = self.auth_session('bob') - - def tearDown(self): - self.bob.connection.close() - self.alice.connection.close() - self.acl.restore() - VersionTest.teardown(self) - - def test_deny_sender_to_exchange(self): - self.acl.allow('alice').deny().apply() - try: - self.ssn.sender("amq.topic") - assert False, "anonymous should not be allowed to create sender to amq.topic" - except UnauthorizedAccess: pass - try: - self.bob.sender("amq.topic") - assert False, "bob should not be allowed to create sender to amq.topic" - except UnauthorizedAccess: pass - self.alice.sender("amq.topic") - - def test_deny_sender_to_queue(self): - self.acl.allow('alice').deny().apply() - try: - self.ssn.sender("acl_test_queue") - assert False, "anonymous shound not be allowed to create sender to acl_test_queue" - except UnauthorizedAccess: pass - try: - self.bob.sender("acl_test_queue") - assert False, "bob should not be allowed to create sender to acl_test_queue" - except UnauthorizedAccess: pass - self.alice.sender("acl_test_queue") - - def test_deny_sender_to_unknown(self): - self.acl.allow('alice').deny().apply() - try: - self.ssn.sender("unknown") - assert False, "anonymous should not be allowed to create sender to non-existent node" - except UnauthorizedAccess: pass - try: - self.bob.sender("unknown") - assert False, "bob should not be allowed to create sender to unknown" - except UnauthorizedAccess: pass - try: - self.alice.sender("unknown") - except NotFound: pass - - def test_deny_receiver_to_exchange(self): - self.acl.allow('alice').deny().apply() - try: - self.ssn.receiver("amq.topic") - assert False, "anonymous should not be allowed to create receiver from amq.topic" - except UnauthorizedAccess: pass - try: - self.bob.receiver("amq.topic") - assert False, "bob should not be allowed to create receiver to amq.topic" - except UnauthorizedAccess: pass - self.alice.receiver("amq.topic") - - def test_deny_receiver_to_queue(self): - self.acl.allow('alice').deny().apply() - try: - self.ssn.receiver("acl_test_queue") - assert False, "anonymous should not be allowed to create receiver from acl_test_queue" - except UnauthorizedAccess: pass - try: - self.bob.receiver("acl_test_queue") - assert False, "bob should not be allowed to create receiver to acl_test_queue" - except UnauthorizedAccess: pass - self.alice.receiver("acl_test_queue") - - def test_deny_receiver_to_unknown(self): - self.acl.allow('alice').deny().apply() - try: - self.ssn.receiver("I_dont_exist") - assert False, "anonymous should not be allowed to create receiver from non-existent node" - except UnauthorizedAccess: pass - try: - self.bob.receiver("unknown") - assert False, "bob should not be allowed to create receiver to unknown" - except UnauthorizedAccess: pass - try: - self.alice.receiver("unknown") - except NotFound: pass - - def test_create_for_receiver_from_exchange(self): - self.acl.allow('bob', 'access', 'exchange', 'name=amq.topic') - self.acl.allow('bob', 'access', 'queue', 'name=amq.topic') - self.acl.allow('alice').deny().apply() - try: - self.ssn.receiver("amq.topic") - assert False, "anonymous should not be allowed to create receiver from amq.topic" - except UnauthorizedAccess: pass - try: - self.bob.receiver("amq.topic") - assert False, "bob should not be allowed to create receiver from amq.topic without create permission" - except UnauthorizedAccess: pass - self.alice.receiver("amq.topic") - - def test_bind_for_receiver_from_exchange(self): - self.acl.allow('bob', 'access', 'exchange', 'name=amq.topic') - self.acl.allow('bob', 'access', 'queue', 'name=amq.topic') - self.acl.allow('bob', 'create', 'queue', 'name=bob*') - self.acl.allow('alice').deny().apply() - try: - self.ssn.receiver("amq.topic") - assert False, "anonymous should not be allowed to create receiver from amq.topic" - except UnauthorizedAccess: pass - try: - self.bob.receiver("amq.topic") - assert False, "bob should not be allowed to create receiver from amq.topic without bind permission" - except UnauthorizedAccess: pass - self.alice.receiver("amq.topic") - - def test_consume_for_receiver_from_exchange(self): - self.acl.allow('bob', 'access', 'exchange', 'name=amq.topic') - self.acl.allow('bob', 'access', 'queue', 'name=amq.topic') - self.acl.allow('bob', 'create', 'queue', 'name=bob*') - self.acl.allow('bob', 'bind', 'exchange', 'name=amq.topic') - self.acl.allow('alice').deny().apply() - try: - self.ssn.receiver("amq.topic") - assert False, "anonymous should not be allowed to create receiver from amq.topic" - except UnauthorizedAccess: pass - try: - self.bob.receiver("amq.topic") - assert False, "bob should not be allowed to create receiver from amq.topic without consume permission" - except UnauthorizedAccess: pass - self.alice.receiver("amq.topic") - - def test_required_permissions_for_receiver_from_exchange(self): - self.acl.allow('bob', 'access', 'exchange', 'name=amq.topic') - self.acl.allow('bob', 'access', 'queue', 'name=amq.topic') - self.acl.allow('bob', 'create', 'queue', 'name=bob*') - self.acl.allow('bob', 'bind', 'exchange', 'name=amq.topic') - self.acl.allow('bob', 'consume', 'queue', 'name=bob*') - self.acl.allow('alice').deny().apply() - try: - self.ssn.receiver("amq.topic") - assert False, "anonymous should not be allowed to create receiver from amq.topic" - except UnauthorizedAccess: pass - self.bob.receiver("amq.topic") - try: - self.bob.receiver("amq.direct") - assert False, "bob should not be allowed to create receiver from amq.direct" - except UnauthorizedAccess: pass - - def test_publish_to_exchange(self): - self.acl.allow('bob', 'access', 'exchange', 'name=amq.topic') - self.acl.allow('bob', 'access', 'queue', 'name=amq.topic') - self.acl.allow('bob', 'publish', 'exchange', 'name=amq.topic', 'routingkey=abc') - self.acl.allow('alice').deny().apply() - - sender = self.bob.sender("amq.topic") - sender.send(Message("a message", subject="abc"), sync=True) - try: - sender.send(Message("another", subject="def"), sync=True) - assert False, "bob should not be allowed to send message to amq.topic with subject 'def'" - except UnauthorizedAccess: pass - sender = self.alice.sender("amq.topic") - sender.send(Message("alice's message", subject="abc"), sync=True) - sender.send(Message("another from alice", subject="def"), sync=True) - - def test_publish_to_anonymous_relay(self): - self.acl.allow('bob', 'access', 'exchange', 'name=ANONYMOUS-RELAY') - self.acl.allow('bob', 'access', 'queue', 'name=acl_test_queue') - self.acl.allow('bob', 'access', 'exchange', 'name=acl_test_queue') - self.acl.allow('bob', 'publish', 'exchange', 'routingkey=acl_test_queue') - self.acl.allow('bob', 'access', 'exchange', 'name=amq.topic') - self.acl.allow('bob', 'access', 'queue', 'name=amq.topic') - self.acl.allow('bob', 'publish', 'exchange', 'name=amq.topic', 'routingkey=abc') - self.acl.allow('bob', 'access', 'exchange', 'name=amq.direct') - self.acl.allow('bob', 'access', 'queue', 'name=amq.direct') - self.acl.allow('alice').deny().apply() - - sender = self.bob.sender("<null>") - sender.send(Message("a message", properties={'x-amqp-to':'acl_test_queue'}), sync=True) - sender.send(Message("another", subject='abc', properties={'x-amqp-to':'amq.topic'}), sync=True) - try: - # have access permission, but publish not allowed for given key - sender.send(Message("a third", subject='def', properties={'x-amqp-to':'amq.topic'}), sync=True) - assert False, "bob should not be allowed to send message to amq.topic with key 'def'" - except UnauthorizedAccess: pass - sender = self.bob.sender("<null>") - try: - # have access permission, but no publish - sender.send(Message("a fourth", subject='abc', properties={'x-amqp-to':'amq.direct'}), sync=True) - assert False, "bob should not be allowed to send message to amq.direct" - except UnauthorizedAccess: pass - sender = self.bob.sender("<null>") - try: - # have no access permission - sender.send(Message("a fiftth", subject='abc', properties={'x-amqp-to':'amq.fanout'}), sync=True) - assert False, "bob should not be allowed to send message to amq.fanout" - except UnauthorizedAccess: pass - sender = self.bob.sender("<null>") - try: - # have no access permission - sender.send(Message("a sixth", properties={'x-amqp-to':'somewhereelse'}), sync=True) - assert False, "bob should not be allowed to send message to somewhere else" - except UnauthorizedAccess: pass - sender = self.alice.sender("<null>") - sender.send(Message("alice's message", properties={'x-amqp-to':'abc'}), sync=True) - sender.send(Message("another from alice", properties={'x-amqp-to':'def'}), sync=True) - - def test_resolution_for_sender_to_exchange(self): - self.acl.allow('alice', 'access', 'exchange', 'name=amq.topic') - self.acl.allow('alice', 'access', 'queue', 'name=amq.topic') - self.acl.allow('bob', 'access', 'exchange', 'name=amq.topic') - self.acl.deny().apply() - try: - self.ssn.sender("amq.topic") - assert False, "anonymous should not be allowed to create sender to amq.topic" - except UnauthorizedAccess: pass - self.bob.sender("amq.topic; {node:{type:topic}}") - try: - self.bob.sender("amq.topic") - assert False, "bob should not be allowed to create sender to amq.topic without specifying the node type" - except UnauthorizedAccess: pass - self.alice.sender("amq.topic; {node:{type:topic}}") - self.alice.sender("amq.topic") - try: - self.alice.sender("amq.direct") - assert False, "alice should not be allowed to create sender to amq.direct" - except UnauthorizedAccess: pass - - def test_resolution_for_sender_to_queue(self): - self.acl.allow('alice', 'access', 'exchange', 'name=acl_test_queue') - self.acl.allow('alice', 'access', 'queue', 'name=acl_test_queue') - self.acl.allow('alice', 'publish', 'exchange', 'routingkey=acl_test_queue') - self.acl.allow('bob', 'access', 'queue', 'name=acl_test_queue') - self.acl.allow('bob', 'publish', 'exchange', 'routingkey=acl_test_queue') - self.acl.deny().apply() - try: - self.ssn.sender("acl_test_queue") - assert False, "anonymous should not be allowed to create sender to acl_test_queue" - except UnauthorizedAccess: pass - self.bob.sender("acl_test_queue; {node:{type:queue}}") - try: - self.bob.sender("acl_test_queue") - assert False, "bob should not be allowed to create sender to acl_test_queue without specifying the node type" - except UnauthorizedAccess: pass - self.alice.sender("acl_test_queue; {node:{type:queue}}") - self.alice.sender("acl_test_queue") - - def test_resolution_for_receiver_from_exchange(self): - self.acl.allow('alice', 'access', 'exchange', 'name=amq.topic') - self.acl.allow('alice', 'access', 'queue', 'name=amq.topic') - self.acl.allow('alice', 'create', 'queue') - self.acl.allow('alice', 'consume', 'queue') - self.acl.allow('alice', 'bind', 'exchange', 'name=amq.topic') - self.acl.allow('bob', 'access', 'exchange', 'name=amq.topic') - self.acl.allow('bob', 'bind', 'exchange', 'name=amq.topic') - self.acl.allow('bob', 'create', 'queue', 'name=bob*', 'autodelete=true') - self.acl.allow('bob', 'consume', 'queue', 'name=bob*') - self.acl.deny().apply() - try: - self.ssn.receiver("amq.topic") - assert False, "anonymous should not be allowed to create receiver from amq.topic" - except UnauthorizedAccess: pass - self.bob.receiver("amq.topic; {node:{type:topic}}") - try: - self.bob.receiver("amq.topic") - assert False, "bob should not be allowed to create receiver from amq.topic without specifying the node type" - except UnauthorizedAccess: pass - self.alice.receiver("amq.topic; {node:{type:topic}}") - self.alice.receiver("amq.topic") - try: - self.alice.receiver("amq.direct") - assert False, "alice should not be allowed to create receiver from amq.direct" - except UnauthorizedAccess: pass - - def test_resolution_for_receiver_from_queue(self): - self.acl.allow('alice', 'access', 'exchange', 'name=acl_test_queue') - self.acl.allow('alice', 'access', 'queue', 'name=acl_test_queue') - self.acl.allow('alice', 'consume', 'queue', 'name=acl_test_queue') - self.acl.allow('bob', 'access', 'queue', 'name=acl_test_queue') - self.acl.allow('bob', 'consume', 'queue', 'name=acl_test_queue') - self.acl.deny().apply() - try: - self.ssn.receiver("acl_test_queue") - assert False, "anonymous should not be allowed to create receiver from acl_test_queue" - except UnauthorizedAccess: pass - self.bob.receiver("acl_test_queue; {node:{type:queue}}") - try: - self.bob.receiver("acl_test_queue") - assert False, "bob should not be allowed to create receiver from acl_test_queue without specifying the node type" - except UnauthorizedAccess: pass - self.alice.receiver("acl_test_queue; {node:{type:queue}}") - self.alice.receiver("acl_test_queue") diff --git a/qpid/cpp/src/tests/assertions.py b/qpid/cpp/src/tests/assertions.py deleted file mode 100644 index 179f4ed57d..0000000000 --- a/qpid/cpp/src/tests/assertions.py +++ /dev/null @@ -1,194 +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. -# - -from qpid.tests.messaging.implementation import * -from qpid.tests.messaging import VersionTest - -class AssertionTests (VersionTest): - """ - Tests for assertions with qpidd - """ - def test_queues_alternate_exchange1(self): - name = str(uuid4()) - self.ssn.sender("%s; {create:always, node:{properties:{alternate-exchange:amq.fanout}}}" % name) - self.ssn.sender("%s; {assert:always, node:{properties:{alternate-exchange:amq.fanout}}}" % name) - try: - self.ssn.sender("%s; {assert:always, node:{properties:{alternate-exchange:amq.topic}}}" % name) - assert False, "Expected assertion to fail on alternate-exchange" - except AssertionFailed: None - except MessagingError: None - - def test_queues_alternate_exchange2(self): - name = str(uuid4()) - self.ssn.sender("%s; {create:always, node:{x-declare:{alternate-exchange:amq.fanout}}}" % name) - self.ssn.sender("%s; {assert:always, node:{x-declare:{alternate-exchange:amq.fanout}}}" % name) - try: - self.ssn.sender("%s; {assert:always, node:{x-declare:{alternate-exchange:amq.topic}}}" % name) - assert False, "Expected assertion to fail on alternate-exchange" - except AssertionFailed: None - except MessagingError: None - - def test_queue_type(self): - name = str(uuid4()) - self.ssn.sender("%s; {create:always}" % name) - self.ssn.sender("%s; {assert:always, node:{type:queue}}" % name) - try: - self.ssn.sender("%s; {assert:always, node:{type:topic}}" % name) - assert False, "Expected assertion to fail on type" - except AssertionFailed: None - except MessagingError: None - - def test_queue_not_durable(self): - name = str(uuid4()) - self.ssn.sender("%s; {create:always}" % name) - self.ssn.sender("%s; {assert:always, node:{durable:False}}" % name) - try: - self.ssn.sender("%s; {assert:always, node:{durable:True}}" % name) - assert False, "Expected assertion to fail on durability" - except AssertionFailed: None - except MessagingError: None - - def test_queue_is_durable(self): - name = str(uuid4()) - self.ssn.sender("%s; {create:always, node:{durable:True}}" % name) - self.ssn.sender("%s; {assert:always, node:{durable:True}}" % name) - - def test_queue_is_autodelete(self): - name = str(uuid4()) - self.ssn.sender("%s; {create:always, node:{x-declare:{auto-delete:True}}}" % name) - self.ssn.sender("%s; {assert:always, node:{x-declare:{auto-delete:True}}}" % name) - try: - self.ssn.sender("%s; {assert:always, node:{x-declare:{auto-delete:False}}}" % name) - assert False, "Expected assertion to fail for auto-delete" - except AssertionFailed: None - except MessagingError: None - - def do_test_queue_options(self, name): - self.ssn.sender("%s; {create:always, node:{x-declare:{arguments:{foo:bar,'qpid.last_value_queue_key':abc}}}}" % name) - self.ssn.sender("%s; {assert:always, node:{x-declare:{arguments:{'qpid.last_value_queue_key':abc}}}}" % name) - try: - self.ssn.sender("%s; {assert:always, node:{x-declare:{arguments:{foo:bar}}}}" % name) - assert False, "Expected assertion to fail on unrecognised option" - except AssertionFailed: None - except MessagingError: None - try: - self.ssn.sender("%s; {assert:always, node:{x-declare:{arguments:{'qpid.max_count':10}}}}" % name) - assert False, "Expected assertion to fail on unspecified option" - except AssertionFailed: None - except MessagingError: None - try: - self.ssn.sender("%s; {assert:always, node:{x-declare:{arguments:{'qpid.last_value_key':xyz}}}}" % name) - assert False, "Expected assertion to fail on option with different value" - except AssertionFailed: None - except MessagingError: None - - def test_queue_options(self): - self.do_test_queue_options(str(uuid4())) - - def test_queue_options_from_0_10(self): - name = str(uuid4()) - self.do_test_queue_options(name) - ssn_0_10 = self.create_connection("amqp0-10", True).session() - ssn_0_10.sender("%s; {assert:always, node:{x-declare:{arguments:{'qpid.last_value_queue_key':abc}}}}" % name) - try: - ssn_0_10.sender("%s; {assert:always, node:{x-declare:{arguments:{'qpid.last_value_key':xyz}}}}" % name) - assert False, "Expected assertion to fail on option with different value" - except AssertionFailed: None - except MessagingError: None - - - def test_exchanges_alternate_exchange1(self): - name = str(uuid4()) - self.ssn.sender("%s; {create:always, node:{type:topic, properties:{alternate-exchange:amq.fanout}}}" % name) - self.ssn.sender("%s; {assert:always, node:{type:topic, properties:{alternate-exchange:amq.fanout}}}" % name) - try: - self.ssn.sender("%s; {assert:always, node:{properties:{alternate-exchange:amq.topic}}}" % name) - assert False, "Expected assertion to fail on alternate-exchange" - except AssertionFailed: None - except MessagingError: None - - def test_exchanges_alternate_exchange2(self): - name = str(uuid4()) - self.ssn.sender("%s; {create:always, node:{type:topic, x-declare:{alternate-exchange:amq.fanout}}}" % name) - self.ssn.sender("%s; {assert:always, node:{type:topic, x-declare:{alternate-exchange:amq.fanout}}}" % name) - try: - self.ssn.sender("%s; {assert:always, node:{x-declare:{alternate-exchange:amq.topic}}}" % name) - assert False, "Expected assertion to fail on alternate-exchange" - except AssertionFailed: None - except MessagingError: None - - def test_exchange_type(self): - name = str(uuid4()) - self.ssn.sender("%s; {create:always, node:{type:topic}}" % name) - self.ssn.sender("%s; {assert:always, node:{type:topic}}" % name) - try: - self.ssn.sender("%s; {assert:always, node:{type:queue}}" % name) - assert False, "Expected assertion to fail on type" - except AssertionFailed: None - except MessagingError: None - - def test_exchange_durability(self): - name = str(uuid4()) - self.ssn.sender("%s; {create:always, node:{type:topic}}" % name) - self.ssn.sender("%s; {assert:always, node:{durable:False}}" % name) - try: - self.ssn.sender("%s; {assert:always, node:{durable:True}}" % name) - assert False, "Expected assertion to fail on durability" - except AssertionFailed: None - except MessagingError: None - - def test_exchange_is_autodelete(self): - name = str(uuid4()) - self.ssn.sender("%s; {create:always, node:{type:topic, x-declare:{auto-delete:True}}}" % name) - self.ssn.sender("%s; {assert:always, node:{x-declare:{auto-delete:True}}}" % name) - try: - self.ssn.sender("%s; {assert:always, node:{x-declare:{auto-delete:False}}}" % name) - assert False, "Expected assertion to fail for auto-delete" - except AssertionFailed: None - except MessagingError: None - - def test_exchange_options(self): - name = str(uuid4()) - self.ssn.sender("%s; {create:always, node:{type:topic, x-declare:{arguments:{foo:bar,'qpid.msg_sequence':True}}}}" % name) - self.ssn.sender("%s; {assert:always, node:{x-declare:{arguments:{'qpid.msg_sequence':True}}}}" % name) - try: - self.ssn.sender("%s; {assert:always, node:{x-declare:{arguments:{foo:bar}}}}" % name) - assert False, "Expected assertion to fail on unrecognised option" - except AssertionFailed: None - except MessagingError: None - try: - self.ssn.sender("%s; {assert:always, node:{x-declare:{arguments:{'qpid.ive':True}}}}" % name) - assert False, "Expected assertion to fail on unspecified option" - except AssertionFailed: None - except MessagingError: None - - def test_queue_autodelete_timeout(self): - name = str(uuid4()) - # create subscription queue with 0-10 to be sure of name - ssn_0_10 = self.create_connection("amqp0-10", True).session() - ssn_0_10.receiver("amq.direct; {link:{name:%s,timeout:120}}" % name) - self.ssn.sender("%s; {assert:always, node:{x-declare:{arguments: {qpid.auto_delete_timeout: 120}}}}" % name) - ssn_0_10_other = self.create_connection("amqp0-10", True).session() - ssn_0_10_other.sender("%s; {assert:always, node:{x-declare:{arguments: {qpid.auto_delete_timeout: 120}}}}" % name) - try: - self.ssn.sender("%s; {assert:always, node:{x-declare:{arguments: {qpid.auto_delete_timeout: 180}}}}" % name) - ssn_0_10_other.sender("%s; {assert:always, node:{x-declare:{arguments: {qpid.auto_delete_timeout: 180}}}}" % name) - assert False, "Expected assertion to fail for auto_delete_timeout" - except AssertionFailed: None - except MessagingError: None diff --git a/qpid/cpp/src/tests/background.ps1 b/qpid/cpp/src/tests/background.ps1 deleted file mode 100644 index 36e9e4e6e9..0000000000 --- a/qpid/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/qpid/cpp/src/tests/brokertest.py b/qpid/cpp/src/tests/brokertest.py deleted file mode 100644 index b40e953427..0000000000 --- a/qpid/cpp/src/tests/brokertest.py +++ /dev/null @@ -1,739 +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. HA or federation - -import os, signal, string, tempfile, subprocess, socket, threading, time, imp, re -import qpid, traceback, signal -from qpid import connection, util -from qpid.compat import format_exc -from unittest import TestCase -from copy import copy -from threading import Thread, Lock, Condition -from logging import getLogger -from qpidtoollibs import BrokerAgent - -# NOTE: Always import native client qpid.messaging, import swigged client -# qpid_messaging if possible. qpid_messaing is set to None if not available. -# -# qm is set to qpid_messaging if it is available, qpid.messaging if not. -# Use qm.X to specify names from the default messaging module. -# -# Set environment variable QPID_PY_NO_SWIG=1 to prevent qpid_messaging from loading. -# -# BrokerTest can be configured to determine which protocol is used by default: -# -# -DPROTOCOL="amqpX": Use protocol "amqpX". Defaults to amqp1.0 if available. -# -# The configured defaults can be over-ridden on BrokerTest.connect and some -# other methods by specifying native=True|False and protocol="amqpX" -# - -import qpid.messaging -qm = qpid.messaging -qpid_messaging = None - -def env_has_log_config(): - """True if there are qpid log configuratoin settings in the environment.""" - return "QPID_LOG_ENABLE" in os.environ or "QPID_TRACE" in os.environ - -if not os.environ.get("QPID_PY_NO_SWIG"): - try: - import qpid_messaging - from qpid.datatypes import uuid4 - qm = qpid_messaging - # Silence warnings from swigged messaging library unless enabled in environment. - if not env_has_log_config(): - qm.Logger.configure(["--log-enable=error"]) - except ImportError: - print "Cannot load python SWIG bindings, falling back to native qpid.messaging." - -log = getLogger("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=.001, max_delay=1): - """Call function until it returns a true value or timeout expires. - Double the delay for each retry up to max_delay. - Returns what function returns if true, None if timeout expires.""" - deadline = time.time() + timeout - ret = None - while True: - ret = function() - if ret: return ret - remaining = deadline - time.time() - if remaining <= 0: return False - delay = min(delay, remaining) - time.sleep(delay) - delay = min(delay*2, max_delay) - -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 -from subprocess import PIPE, STDOUT - -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() - 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") - 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 __repr__(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 teardown(self): # Clean up at end of test. - if self.expect == EXPECT_UNKNOWN: - try: self.kill() # Just make sure its dead - except: pass - elif self.expect == EXPECT_RUNNING: - if self.poll() != None: - self.unexpected("expected running, exit code %d" % self.returncode) - else: - try: - self.kill() - except Exception,e: - self.unexpected("exception from kill: %s" % str(e)) - 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") - self.wait() - - - 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 assert_exit_ok(self): - if self.wait() != 0: self.unexpected("Exit code %d" % self.returncode) - - 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.wait() - - def kill(self): - # Set to EXPECT_UNKNOWN, EXPECT_EXIT_FAIL creates a race condition - # if the process exits normally concurrent with the call to kill. - self.expect = EXPECT_UNKNOWN - 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.wait() - - 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 - _log_count = 0 - - def __repr__(self): return "<Broker:%s:%d>"%(self.log, self.port()) - - def get_log(self): - return os.path.abspath(self.log) - - def __init__(self, test, args=[], test_store=False, name=None, expect=EXPECT_RUNNING, port=0, wait=None, show_cmd=False): - """Start a broker daemon. name determines the data-dir and log - file names.""" - - self.test = test - self._port=port - args = copy(args) - if BrokerTest.amqp_lib: args += ["--load-module", BrokerTest.amqp_lib] - if BrokerTest.store_lib and not test_store: - args += ['--load-module', BrokerTest.store_lib] - if BrokerTest.sql_store_lib: - args += ['--load-module', BrokerTest.sql_store_lib] - args += ['--catalog', BrokerTest.sql_catalog] - if BrokerTest.sql_clfs_store_lib: - args += ['--load-module', BrokerTest.sql_clfs_store_lib] - args += ['--catalog', BrokerTest.sql_catalog] - cmd = [BrokerTest.qpidd_exec, "--port", port, "--interface", "127.0.0.1", "--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.log = "%03d:%s.log" % (Broker._log_count, self.name) - self.store_log = "%03d:%s.store.log" % (Broker._log_count, self.name) - Broker._log_count += 1 - - cmd += ["--log-to-file", self.log] - cmd += ["--log-to-stderr=no"] - - # Add default --log-enable arguments unless args already has --log arguments. - if not env_has_log_config() and not [l for l in args if l.startswith("--log")]: - args += ["--log-enable=info+"] - - if test_store: cmd += ["--load-module", BrokerTest.test_store_lib, - "--test-store-events", self.store_log] - - self.datadir = os.path.abspath(self.name) - cmd += ["--data-dir", self.datadir] - if show_cmd: print cmd - Popen.__init__(self, cmd, expect, stdout=PIPE) - test.teardown_add(self) - self._host = "127.0.0.1" - self._agent = None - - log.debug("Started broker %s" % self) - - 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, e: - raise Exception("Can't get port for broker %s (%s)%s: %s" % - (self.name, self.pname, error_line(self.log,5), e)) - return self._port - - def unexpected(self,msg): - raise BadProcessStatus("%s: %s (%s)" % (msg, self.name, self.pname)) - - def connect(self, timeout=5, native=False, **kwargs): - """New API connection to the broker. - @param native if True force use of the native qpid.messaging client - even if swig client is available. - """ - if native: connection_class = qpid.messaging.Connection - else: - connection_class = qm.Connection - if (self.test.protocol and qm == qpid_messaging): - kwargs.setdefault("protocol", self.test.protocol) - return connection_class.establish(self.host_port(), timeout=timeout, **kwargs) - - @property - def agent(self, **kwargs): - """Return a BrokerAgent for this broker""" - if not self._agent: self._agent = BrokerAgent(self.connect(**kwargs)) - return self._agent - - - def declare_queue(self, queue): - self.agent.addQueue(queue) - - 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 ready(self, timeout=10, **kwargs): - """Wait till broker is ready to serve clients""" - deadline = time.time()+timeout - while True: - try: - c = self.connect(timeout=timeout, **kwargs) - try: - c.session() - return # All good - finally: c.close() - except Exception,e: # Retry up to timeout - if time.time() > deadline: - raise RethrownException( - "Broker %s not responding: (%s)%s"%( - self.name,e,error_line(self.log, 5))) - - def assert_log_clean(self, ignore=None): - log = open(self.get_log()) - try: - error = re.compile("] error|] critical") - if ignore: ignore = re.compile(ignore) - else: ignore = re.compile("\000") # Won't match anything - for line in log.readlines(): - assert not error.search(line) or ignore.search(line), "Errors in log file %s: %s"%(log, line) - finally: log.close() - -def receiver_iter(receiver, timeout=0): - """Make an iterator out of a receiver. Returns messages till Empty is raised.""" - try: - while True: - yield receiver.fetch(timeout=timeout) - except qm.Empty: - pass - -def browse(session, queue, timeout=0, transform=lambda m: m.content): - """Return a list with the contents of each message on queue.""" - r = session.receiver("%s;{mode:browse}"%(queue)) - r.capacity = 100 - try: - return [transform(m) for m in receiver_iter(r, timeout)] - finally: - r.close() - -def assert_browse(session, queue, expect_contents, timeout=0, transform=lambda m: m.content, msg=None): - """Assert that the contents of messages on queue (as retrieved - using session and timeout) exactly match the strings in - expect_contents""" - if msg is None: msg = "browse '%s' failed" % queue - actual_contents = browse(session, queue, timeout, transform=transform) - if msg: msg = "%s: %r != %r"%(msg, expect_contents, actual_contents) - assert expect_contents == actual_contents, msg - -def assert_browse_retry(session, queue, expect_contents, timeout=1, delay=.001, transform=lambda m:m.content, msg="browse failed"): - """Wait up to timeout for contents of queue to match expect_contents""" - test = lambda: browse(session, queue, 0, transform=transform) == expect_contents - retry(test, timeout, delay) - actual_contents = browse(session, queue, 0, transform=transform) - if msg: msg = "%s: %r != %r"%(msg, expect_contents, actual_contents) - assert expect_contents == actual_contents, msg - -class BrokerTest(TestCase): - """ - Tracks processes started by test and kills at end of test. - Provides a well-known working directory for each test. - """ - - def __init__(self, *args, **kwargs): - self.longMessage = True # Enable long messages for assert*(..., msg=xxx) - TestCase.__init__(self, *args, **kwargs) - - # Environment settings. - qpidd_exec = "qpidd" - ha_lib = os.getenv("HA_LIB") - xml_lib = os.getenv("XML_LIB") - amqp_lib = os.getenv("AMQP_LIB") - qpid_config_exec = "qpid-config" - qpid_route_exec = "qpid-route" - receiver_exec = "receiver" - sender_exec = "sender" - 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() - - try: - import proton - PN_VERSION = (proton.VERSION_MAJOR, proton.VERSION_MINOR) - except ImportError: - # proton not on path, can't determine version - PN_VERSION = (0, 0) - except AttributeError: - # prior to 0.8 proton did not expose version info - PN_VERSION = (0, 7) - - PN_TX_VERSION = (0, 9) - - amqp_tx_supported = PN_VERSION >= PN_TX_VERSION - - def configure(self, config): self.config=config - - def setUp(self): - defs = self.config.defines - outdir = defs.get("OUTDIR") or "brokertest.tmp" - self.dir = os.path.join(self.rootdir, outdir, self.id()) - os.makedirs(self.dir) - os.chdir(self.dir) - self.teardown_list = [] # things to tear down at end of test - if qpid_messaging and self.amqp_lib: default_protocol="amqp1.0" - else: default_protocol="amqp0-10" - self.protocol = defs.get("PROTOCOL") or default_protocol - self.tx_protocol = self.protocol - if not self.amqp_tx_supported: self.tx_protocol = "amqp0-10" - - def tearDown(self): - err = [] - self.teardown_list.reverse() # Tear down in reverse order - for p in self.teardown_list: - log.debug("Tearing down %s", p) - try: - # Call the first of the methods that is available on p. - for m in ["teardown", "close"]: - a = getattr(p, m, None) - if a: a(); break - else: raise Exception("Don't know how to tear down %s", p) - except Exception, e: - if m != "close": # Ignore connection close errors. - err.append("%s: %s"%(e.__class__.__name__, str(e))) - self.teardown_list = [] # reset in case more processes start - os.chdir(self.rootdir) - if err: raise Exception("Unexpected process status:\n "+"\n ".join(err)) - - def teardown_add(self, thing): - """Call thing.teardown() or thing.close() at end of test""" - self.teardown_list.append(thing) - - 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.teardown_add(p) - return p - - def broker(self, args=[], name=None, expect=EXPECT_RUNNING, wait=True, port=0, show_cmd=False, **kw): - """Create and return a broker ready for use""" - b = Broker(self, args=args, name=name, expect=expect, port=port, show_cmd=show_cmd, **kw) - 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 check_output(self, args, stdin=None): - p = self.popen(args, stdout=PIPE, stderr=STDOUT) - out = p.communicate(stdin) - if p.returncode != 0: - raise Exception("%s exit code %s, output:\n%s" % (args, p.returncode, out[0])) - return out[0] - - def browse(self, *args, **kwargs): browse(*args, **kwargs) - def assert_browse(self, *args, **kwargs): assert_browse(*args, **kwargs) - def assert_browse_retry(self, *args, **kwargs): assert_browse_retry(*args, **kwargs) - - def protocol_option(self, connection_options=""): - if "protocol" in connection_options: return connection_options - else: return ",".join(filter(None, [connection_options,"protocol:'%s'"%self.protocol])) - - -def join(thread, timeout=30): - 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 - -# Options for a client that wants to reconnect automatically. -RECONNECT_OPTIONS="reconnect:true,reconnect-timeout:10,reconnect-urls-replace:true" - -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", - connection_options=RECONNECT_OPTIONS, - failover_updates=False, url=None, args=[]): - """ - 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) - cmd = ["qpid-send", - "--broker", url or broker.host_port(), - "--address", "%s;{create:always}"%queue, - "--connection-options", "{%s}"%(broker.test.protocol_option(connection_options)), - "--content-stdin" - ] + args - if failover_updates: cmd += ["--failover-updates"] - self.sender = broker.test.popen( - cmd, expect=EXPECT_RUNNING, stdin=PIPE) - self.condition = Condition() - self.max = max_depth - self.received = 0 - self.stopped = False - self.error = None - self.queue = queue - - 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: - self.sender.assert_running() - 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, e: - self.error = RethrownException( - "%s: (%s)%s"%(self.sender.pname,e, - error_line(self.sender.outfile("err")))) - - - 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", - connection_options=RECONNECT_OPTIONS, - failover_updates=False, url=None, args=[]): - """ - sender: enable flow control. Call sender.received(n) for each message received. - """ - Thread.__init__(self) - self.test = broker.test - cmd = ["qpid-receive", - "--broker", url or broker.host_port(), - "--address", "%s;{create:always}"%queue, - "--connection-options", "{%s}"%(broker.test.protocol_option(connection_options)), - "--forever" - ] - if failover_updates: cmd += [ "--failover-updates" ] - cmd += args - self.receiver = self.test.popen( - cmd, expect=EXPECT_RUNNING, stdout=PIPE) - self.lock = Lock() - self.error = None - self.sender = sender - self.received = 0 - self.queue = queue - - def read_message(self): - n = int(self.receiver.stdout.readline()) - return n - - def run(self): - try: - m = self.read_message() - while m != -1: - self.receiver.assert_running() - assert m <= self.received, "%s missing message %s>%s"%(self.queue, m, self.received) - if (m == self.received): # Ignore duplicates - self.received += 1 - if self.sender: - self.sender.notify_received(self.received) - m = self.read_message() - except Exception, e: - self.error = RethrownException( - "%s: (%s)%s"%(self.receiver.pname,e, - error_line(self.receiver.outfile("err")))) - - def check(self): - """Raise an exception if there has been an error""" - if self.error: raise self.error - - def stop(self): - """Returns when termination message is received""" - join(self) - self.check() - -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/qpid/cpp/src/tests/check_dependencies.py.in b/qpid/cpp/src/tests/check_dependencies.py.in deleted file mode 100755 index ef69fc1743..0000000000 --- a/qpid/cpp/src/tests/check_dependencies.py.in +++ /dev/null @@ -1,53 +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 -import sys - -def _message(error): - return """ -=============================================================================== -Error! {0} - -The tests require Qpid Python, version 1.33 or greater. Make sure -Qpid Python is installed and available on the Python path: - - - Linux distributions: Install 'python-qpid' - - Other: Install qpid-python from source and update PYTHONPATH - -See the Qpid website for more information: - - - Qpid downloads: http://qpid.apache.org/download.html - - Qpid packages: http://qpid.apache.org/packages.html -=============================================================================== -""".format(error) - -sys.path.insert(0, os.path.join("@CMAKE_SOURCE_DIR@", "management", "python", "lib")) - -try: - import qpid -except ImportError: - exit(_message("Can't find Python 'qpid' module")) - -try: - import qpid_tests -except ImportError: - exit(_message("Can't find Python 'qpid_tests' module")) diff --git a/qpid/cpp/src/tests/cli_tests.py b/qpid/cpp/src/tests/cli_tests.py deleted file mode 100755 index ae0f32d4d1..0000000000 --- a/qpid/cpp/src/tests/cli_tests.py +++ /dev/null @@ -1,482 +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 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) - queue = self.broker_access.getQueue(qname) - if queue: - return queue - assert False - - def test_queue_params(self): - self.startBrokerAccess() - 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 ring") - - LIMIT = "qpid.policy_type" - assert LIMIT not in queue1.arguments - self.assertEqual(queue2.arguments[LIMIT], "reject") - self.assertEqual(queue3.arguments[LIMIT], "ring") - - queue4 = self.makeQueue("test_queue_params4", "--lvq-key lkey") - - LVQKEY = "qpid.last_value_queue_key" - - assert LVQKEY not in queue3.arguments - assert LVQKEY in queue4.arguments - assert queue4.arguments[LVQKEY] == "lkey" - - def test_queue_params_api(self): - self.startBrokerAccess() - queue1 = self.makeQueue("test_queue_params_api1", "--limit-policy none", True) - queue2 = self.makeQueue("test_queue_params_api2", "--limit-policy reject", True) - queue3 = self.makeQueue("test_queue_params_api3", "--limit-policy ring", True) - - LIMIT = "qpid.policy_type" - assert LIMIT not in queue1.arguments - self.assertEqual(queue2.arguments[LIMIT], "reject") - self.assertEqual(queue3.arguments[LIMIT], "ring") - - queue4 = self.makeQueue("test_queue_params_api4", "--lvq-key lkey") - - LVQKEY = "qpid.last_value_queue_key" - - assert LVQKEY not in queue3.arguments - assert LVQKEY in queue4.arguments - assert queue4.arguments[LVQKEY] == "lkey" - - - def test_qpid_config(self): - self.startBrokerAccess(); - qname = "test_qpid_config" - - ret = os.system(self.qpid_config_command(" add queue " + qname)) - self.assertEqual(ret, 0) - queues = self.broker_access.getAllQueues() - 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 = self.broker_access.getAllQueues() - found = False - for queue in queues: - if queue.name == qname: - found = True - self.assertEqual(found, False) - - def test_qpid_config_del_nonempty_queue(self): - self.startBrokerAccess(); - qname = "test_qpid_config_del" - - ret = os.system(self.qpid_config_command(" add queue " + qname)) - self.assertEqual(ret, 0) - queues = self.broker_access.getAllQueues() - found = False - for queue in queues: - if queue.name == qname: - self.assertEqual(queue.durable, False) - found = True - self.assertEqual(found, True) - - self.startBrokerAccess() - - sess = self.broker_conn.session() - tx = sess.sender(qname) - tx.send("MESSAGE") - - ret = os.system(self.qpid_config_command(" del queue " + qname)) - queues = self.broker_access.getAllQueues() - found = False - for queue in queues: - if queue.name == qname: - found = True - self.assertEqual(found, True) - - ret = os.system(self.qpid_config_command(" del queue " + qname + " --force")) - self.assertEqual(ret, 0) - queues = self.broker_access.getAllQueues() - found = False - for queue in queues: - if queue.name == qname: - found = True - self.assertEqual(found, False) - - - def test_qpid_config_api(self): - self.startBrokerAccess(); - qname = "test_qpid_config_api" - - ret = self.qpid_config_api(" add queue " + qname) - self.assertEqual(ret, 0) - queues = self.broker_access.getAllQueues() - 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 = self.broker_access.getAllQueues() - 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.startBrokerAccess(); - qname = "test_qpid_config_sasl_plain_expect_succeed" - cmd = " --sasl-mechanism PLAIN -b 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.startBrokerAccess(); - qname = "test_qpid_config_sasl_plain_expect_fail" - cmd = " --sasl-mechanism PLAIN -b 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.broker_access.getAllExchanges() - 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.broker_access.getAllQueues() - 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.startBrokerAccess(); - 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.startBrokerAccess(); - 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 - xquery_file = self.defines["xquery-file"] - foo = self.qpid_config_command("-f " + xquery_file + " 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.startBrokerAccess(); - qname = "test_qpid_config" - - ret = os.system(self.qpid_config_command(" add queue --durable " + qname)) - self.assertEqual(ret, 0) - queues = self.broker_access.getAllQueues() - 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 = self.broker_access.getAllQueues() - found = False - for queue in queues: - if queue.name == qname: - found = True - self.assertEqual(found, False) - - def test_qpid_config_altex(self): - self.startBrokerAccess(); - 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 = self.broker_access.getAllExchanges() - 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, altName) - self.assertEqual(found, True) - - ret = os.system(self.qpid_config_command(" add queue %s --alternate-exchange=%s" % (qName, altName))) - self.assertEqual(ret, 0) - - ret = os.system(self.qpid_config_command(" queues")) - self.assertEqual(ret, 0) - - queues = self.broker_access.getAllQueues() - 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, 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.startBrokerAccess(); - - 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.startBrokerAccess(); - - 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 = self.broker_access.getAllLinks() - 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.startBrokerAccess(); - - 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 = self.broker_access.getAllLinks() - 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.startBrokerAccess(); - - 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 = self.broker_access.getAllLinks() - 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.startBrokerAccess(); - - 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 -b localhost:%d" % self.broker.port + " " + arg - - def qpid_config_api(self, arg = ""): - path = os.path.join(os.getenv("SOURCE_DIR"), "management", "python", - "bin", "qpid-config") - script = import_script(path) - broker = ["-b", "localhost:"+str(self.broker.port)] - return script.main(broker + arg.split()) - - def qpid_route_api(self, arg = ""): - path = os.path.join(os.getenv("SOURCE_DIR"), "management", "python", - "bin", "qpid-route") - script = import_script(path) - return script.main(arg.split()) diff --git a/qpid/cpp/src/tests/common.py b/qpid/cpp/src/tests/common.py deleted file mode 100644 index d6dc640c5a..0000000000 --- a/qpid/cpp/src/tests/common.py +++ /dev/null @@ -1,298 +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. -# - -from __future__ import print_function - -from env import * - -import atexit as _atexit -import os as _os -import re as _re -import shlex as _shlex -import shutil as _shutil -import signal as _signal -import subprocess as _subprocess -import time as _time -import uuid as _uuid - -def _unique_id(): - return str(_uuid.uuid4())[:4] - -def make_work_dir(): - prog = file_name(ARGS[0]) - name = "{0}_{1}".format(prog, _unique_id()) - - return make_dir(join(BUILD_DIR, name)) - -WORK_DIR = make_work_dir() - -notice("Created work dir '{0}'", WORK_DIR) - -def _init_valgrind_command(command): - if VALGRIND is None: - return command, None - - log_file = join(WORK_DIR, "valgrind_{0}.log".format(_unique_id())) - suppressions_file = join(BUILD_DIR, "src", "tests", ".valgrind.supp") - - valgrind_command = [ - VALGRIND, - "--leak-check=full --num-callers=25 --error-exitcode=100", - "--log-file={0}".format(log_file), - "--gen-suppressions=all", - "--suppressions={0}".format(suppressions_file), - "--", - command, - ] - - return " ".join(valgrind_command), log_file - -def call_with_valgrind(command, *args, **kwargs): - command, valgrind_log_file = _init_valgrind_command(command) - - try: - call(command, *args, **kwargs) - except _subprocess.CalledProcessError as e: - if e.returncode == 100: - error("Valgrind reported errors") - print(read(valgrind_log_file)) - - raise - -def call_for_output_with_valgrind(command, *args, **kwargs): - command, valgrind_log_file = _init_valgrind_command(command) - - try: - return call_for_output(command, *args, **kwargs) - except _subprocess.CalledProcessError as e: - if e.returncode == 100: - error("Valgrind reported errors") - print(read(valgrind_log_file)) - - raise - -_brokers = list() -_brokers_by_port = dict() -_broker_port_expr = _re.compile(r"Listening on TCP/TCP6 port ([0-9]+)") -_broker_config_file = join(BUILD_DIR, "src", "tests", "qpidd-empty.conf") - -class _Broker(object): - def __init__(self, dir): - self.dir = dir - - self.command_file = join(self.dir, "command") - self.log_file = join(self.dir, "log") - self.data_dir = join(self.dir, "data") - - self.port = None - self.proc = None - self.command = None - self.valgrind_log_file = None - - def __repr__(self): - args = self.port, self.proc.pid, self.proc.returncode - return "Broker(port={0}, pid={1}, exit={2})".format(*args) - - def start(self, args): - make_dir(self.dir) - - command = [ - "qpidd", - "--port", "0", - "--interface", "localhost", - "--no-module-dir", - "--log-enable", "info+", - "--log-source", "yes", - "--log-to-stderr", "no", - "--log-to-file", self.log_file, - "--config", _broker_config_file, - "--data-dir", self.data_dir, - ] - - if WINDOWS: - command += [ - "--ssl-cert-store-location", "LocalMachine", - "--ssl-cert-name", "localhost", - "--ssl-port", "0", - ] - - command += [x for x in args if x is not None] - command = " ".join(command) - command, valgrind_log_file = _init_valgrind_command(command) - - self.command = command - self.valgrind_log_file = valgrind_log_file - - notice("Calling '{0}'", self.command) - write(self.command_file, self.command) - - # XXX Workaround for problem terminating subprocesses that use shell=True - command_args = _shlex.split(self.command, posix=False) - - self.proc = _subprocess.Popen(command_args, stdout=_subprocess.PIPE) - self.port = self._wait_for_port() - - assert self.command is not None - assert self.proc is not None - assert self.port is not None - assert self.port not in _brokers_by_port, self.port - - _brokers.append(self) - _brokers_by_port[self.port] = self - - notice("Started {0}", self) - - def _wait_for_port(self): - port = None - - while port is None: - _time.sleep(0.4) - port = self._scan_port() - - return port - - def _scan_port(self): - if not exists(self.log_file): - return - - match = _re.search(_broker_port_expr, read(self.log_file)) - - if match: - return match.group(1) - - def stop(self): - if self.proc.poll() is not None: - return - - notice("Stopping {0}", self) - - if WINDOWS: - call("taskkill /f /t /pid {0}", self.proc.pid) - else: - self.proc.terminate() - - self.proc.wait() - - def check(self): - if WINDOWS: - # Taskkilled windows processes always return 1, so exit - # codes don't mean anything there - return 0 - - notice("Checking {0}", self) - - if self.proc.returncode == 0: - return 0 - - error("{0} exited with code {1}", self, self.proc.returncode) - - if self.proc.returncode == 100: - print("Valgrind reported errors:") - print(read(self.valgrind_log_file)) - else: - print("Last 100 lines of broker log:") - print(tail(self.log_file, 100)) - - flush() - - error("{0} exited with code {1}", self, self.proc.returncode) - - return self.proc.returncode - -def start_broker(dir, *args, **kwargs): - if not is_absolute(dir): - dir = join(WORK_DIR, dir) - - auth_disabled = kwargs.get("auth_disabled", True) - - if auth_disabled: - args = list(args) - args.append("--auth no") - - broker = _Broker(dir) - broker.start(args) - - return broker.port - -def stop_broker(port): - broker = _brokers_by_port[port] - broker.stop() - -def check_broker(port): - broker = _brokers_by_port[port] - - if broker.check() != 0: - exit("Broker failure") - -def check_results(): - for broker in _brokers: - broker.stop() - - errors = False - - for broker in _brokers: - code = broker.check() - - if code == 0: - continue - - errors = True - - if errors: - exit("Broker failure") - - remove(WORK_DIR) - - notice("Tests completed without error") - -def _exit_handler(): - if exists(WORK_DIR): - notice("Output saved in work dir '{0}'", WORK_DIR) - - for broker in _brokers: - broker.stop() - -_atexit.register(_exit_handler) - -def configure_broker(broker_port, *args): - command = [ - "qpid-config", - "--broker localhost:{0}".format(broker_port), - ] - - command += [x for x in args if x is not None] - - call(" ".join(command)) - -def run_broker_tests(broker_port, *args): - command = [ - "qpid-python-test", - "--broker localhost:{0}".format(broker_port), - "--time", - ] - - command += [x for x in args if x is not None] - - call(" ".join(command)) - -def connect_brokers(*args): - command = ["qpid-route"] - command += [x for x in args if x is not None] - - call(" ".join(command)) diff --git a/qpid/cpp/src/tests/consume.cpp b/qpid/cpp/src/tests/consume.cpp deleted file mode 100644 index 69110d151f..0000000000 --- a/qpid/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/qpid/cpp/src/tests/datagen.cpp b/qpid/cpp/src/tests/datagen.cpp deleted file mode 100644 index acbc07d63c..0000000000 --- a/qpid/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/qpid/cpp/src/tests/declare_queues.cpp b/qpid/cpp/src/tests/declare_queues.cpp deleted file mode 100644 index bf85b9c04b..0000000000 --- a/qpid/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/qpid/cpp/src/tests/dlclose_noop.c b/qpid/cpp/src/tests/dlclose_noop.c deleted file mode 100644 index b78cf486d8..0000000000 --- a/qpid/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/qpid/cpp/src/tests/dynamic_log_hires_timestamp b/qpid/cpp/src/tests/dynamic_log_hires_timestamp deleted file mode 100755 index 606286d9c3..0000000000 --- a/qpid/cpp/src/tests/dynamic_log_hires_timestamp +++ /dev/null @@ -1,75 +0,0 @@ -#!/usr/bin/env 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 to verify dynamic log highres timestamp changes - -source ./env.sh - -LOG_FILE=hires_test.log -trap cleanup EXIT - -cleanup() { - test -n "$PORT" && qpidd --no-module-dir --quit --port $PORT -} - -error() { - echo $*; - exit 1; -} - -rm -rf $LOG_FILE -PORT=$(qpidd --auth=no --no-module-dir --daemon --port=0 --interface 127.0.0.1 --log-to-file $LOG_FILE) || error "Could not start broker" - -echo Broker for log highres timestamp test started on $PORT, pid is $(qpidd --no-module-dir --check --port $PORT) - -qpid-ctrl -b localhost:$PORT setLogLevel level='debug+:Broker' > /dev/null -qpid-ctrl -b localhost:$PORT echo sequence=1 body=LOWRES > /dev/null -qpid-ctrl -b localhost:$PORT setLogHiresTimestamp logHires='true' > /dev/null -qpid-ctrl -b localhost:$PORT echo sequence=2 body=HI_RES > /dev/null -qpid-ctrl -b localhost:$PORT setLogHiresTimestamp logHires='false' > /dev/null -qpid-ctrl -b localhost:$PORT echo sequence=3 body=LOWRES > /dev/null - -# Expect 3 log entries with 'echo' in them -if [[ $(grep echo $LOG_FILE | wc -l) -ne 3 ]]; then - cat $LOG_FILE - error "Log content error - expected 3 echo log entries" -fi - -# Lines 1 and 3 are length X -# Line 2 is length X+10 because of timestamp addition -LEN1=$(grep echo $LOG_FILE | grep \(1 | wc -m) -LEN2=$(grep echo $LOG_FILE | grep \(2 | wc -m) -LEN3=$(grep echo $LOG_FILE | grep \(3 | wc -m) -EXPECTED_LEN2=$(( $LEN1 + 10 )) - -if [ $LEN1 -ne $LEN3 ]; then - cat $LOG_FILE - error "Log content error - expected echo 3 to be same line length as echo 1" -fi - -if [ $LEN2 -ne $EXPECTED_LEN2 ]; then - cat $LOG_FILE - error "Log content error - expected echo 2 to be 10 characters longer than echo 1" -fi - -rm -rf $LOG_FILE -echo OK - diff --git a/qpid/cpp/src/tests/dynamic_log_level_test b/qpid/cpp/src/tests/dynamic_log_level_test deleted file mode 100755 index 0ea40d11b6..0000000000 --- a/qpid/cpp/src/tests/dynamic_log_level_test +++ /dev/null @@ -1,90 +0,0 @@ -#!/usr/bin/env 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 to verify dynamic log level changes - -source ./env.sh - -LOG_FILE=log_test.log -trap cleanup EXIT - -cleanup() { - test -n "$PORT" && qpidd --no-module-dir --quit --port $PORT -} - -error() { - echo $*; - exit 1; -} - -checklog() { - if [[ $(grep echo $LOG_FILE | wc -l) -ne $1 ]]; then - cat $LOG_FILE - error "Log contents not as expected - " $2 - fi -} - -rm -rf $LOG_FILE -PORT=$(qpidd --auth=no --no-module-dir --daemon --port=0 --interface 127.0.0.1 --log-to-file $LOG_FILE) || error "Could not start broker" - -echo Broker for log level test started on $PORT, pid is $(qpidd --no-module-dir --check --port $PORT) - -# Set level to notice+ and send an echo request -# The 'echo' in the log is hidden since it is at debug level. -qpid-ctrl -b localhost:$PORT setLogLevel level='notice+' > /dev/null -qpid-ctrl -b localhost:$PORT echo sequence=1 body=HIDDEN > /dev/null -checklog 0 "Step 1 Expected no echo log entries" - -# Next, enable all Broker logs at debug and higher levels and send another echo -# This 'echo' should be in the log. -qpid-ctrl -b localhost:$PORT setLogLevel level='debug+:Broker' > /dev/null -qpid-ctrl -b localhost:$PORT echo sequence=2 body=VISIBLE > /dev/null -checklog 1 "Step 2 Expected one echo log entry" - -# Now turn on Broker debug messages but specifically disable ManagementMethod logs -# The 'echo' should be hidden. -qpid-ctrl -b localhost:$PORT setLogLevel level='debug+:Broker !debug+:broker::Broker::ManagementMethod' > /dev/null -qpid-ctrl -b localhost:$PORT echo sequence=3 body=HIDDEN > /dev/null -checklog 1 "Step 3 Expected one echo log entry" - -# Verify that the management get returns what was just set -qpid-ctrl -b localhost:$PORT getLogLevel > dynamic_log_level.tmp -if [[ $(grep 'level=debug+:Broker,!debug+:broker::Broker::ManagementMethod' dynamic_log_level.tmp | wc -l) -ne 1 ]]; then - error "Step 4 getLogLevel returned unexpected value: " `cat dynamic_log_level.tmp` -fi -rm -rf dynamic_log_level.tmp - -cleanup - -# Start another broker with --log-disable settings and make sure the management string receives them -rm -rf $LOG_FILE -PORT=$(qpidd --auth=no --no-module-dir --daemon --port=0 --interface 127.0.0.1 --log-to-file $LOG_FILE --log-enable debug:foo --log-disable debug:bar) || error "Could not start broker" -echo Broker for log level test started on $PORT, pid is $(qpidd --no-module-dir --check --port $PORT) - -qpid-ctrl -b localhost:$PORT getLogLevel > dynamic_log_level.tmp -if [[ $(grep 'level=debug:foo,!debug:bar' dynamic_log_level.tmp | wc -l) -ne 1 ]]; then - error "Step 5 getLogLevel returned unexpected value: " `cat dynamic_log_level.tmp` -fi -rm -rf dynamic_log_level.tmp - -rm -rf $LOG_FILE -echo OK - diff --git a/qpid/cpp/src/tests/echotest.cpp b/qpid/cpp/src/tests/echotest.cpp deleted file mode 100644 index 7c30989098..0000000000 --- a/qpid/cpp/src/tests/echotest.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/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() -{ - return Duration::FromEpoch(); -} - -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/qpid/cpp/src/tests/env.ps1.in b/qpid/cpp/src/tests/env.ps1.in deleted file mode 100644 index 94834a4b5e..0000000000 --- a/qpid/cpp/src/tests/env.ps1.in +++ /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. -# - -# Environment variables substituted by configure/cmake. -$abs_srcdir="@abs_srcdir@" -$abs_builddir="@abs_builddir@" -$top_srcdir="@abs_top_srcdir@" -$top_builddir="@abs_top_builddir@" -$moduledir="$top_builddir\src@builddir_lib_suffix@" -$testmoduledir="$builddir@builddir_lib_suffix@" -$BOOST_LIBRARYDIR="@BOOST_LIBRARYDIR@" - -# Python paths and directories -$PYTHON_EXE="@PYTHON_EXECUTABLE@" -$PYTHON_DIR="$builddir\python" -$QPID_PYTHON_TEST="$PYTHON_DIR\commands\qpid-python-test" -if ( !(Test-Path "$PYTHON_DIR") -and (Test-Path "$top_srcdir\..\python")) { - $PYTHON_DIR="$top_srcdir\..\python" - $QPID_PYTHON_TEST="$PYTHON_DIR\qpid-python-test" -} -$QPID_TESTS="$top_srcdir\..\tests" -$QPID_TESTS_PY="$QPID_TESTS\src\py" -$QPID_TOOLS="$top_srcdir\..\tools" -$QPID_TOOLS_LIBS="$QPID_TOOLS\src\py" -$QMF_LIB="$top_srcdir\..\extras\qmf\src\py" -$PYTHON_COMMANDS="$QPID_TOOLS\src\py" -$env:PYTHONPATH="$srcdir;$PYTHON_DIR;$PYTHON_COMMANDS;$QPID_TESTS_PY;$QPID_TOOLS_LIBS;$QMF_LIB;$env:PYTHONPATH" -$QPID_CONFIG_EXEC="$PYTHON_COMMANDS\qpid-config" -$QPID_ROUTE_EXEC="$PYTHON_COMMANDS\qpid-route" -$QPID_HA_TOOL_EXEC="$PYTHON_COMMANDS\qpid-ha-tool" - -# Executables -$env:QPIDD_EXEC="$top_builddir\src\@CMAKE_BUILD_TYPE@\qpidd.exe" -$env:QPID_WATCHDOG_EXEC="$top_builddir\src\qpidd_watchdog" - -# Test executables -$QPID_TEST_EXEC_DIR="$builddir\@CMAKE_BUILD_TYPE@" -$RECEIVER_EXEC="$QPID_TEST_EXEC_DIR\receiver" -$SENDER_EXEC="$QPID_TEST_EXEC_DIR\sender" - -# Path -$env:PATH="$top_builddir\src\@CMAKE_BUILD_TYPE@;$builddir\@CMAKE_BUILD_TYPE@;$srcdir;$PYTHON_COMMANDS;$QPID_TEST_EXEC_DIR;@BOOST_LIBRARYDIR@;$env:PATH" - -# Modules -$env: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 SSLCONNECTOR_LIB sslconnector.so -#exportmodule SSL_LIB ssl.so -#exportmodule WATCHDOG_LIB watchdog.so -#exportmodule XML_LIB xml.so - -# Qpid options -$env:QPID_NO_MODULE_DIR="1" # Don't accidentally load installed modules -$env:QPID_DATA_DIR= # Default to no data dir, not ~/.qpidd - -# Options for boost test framework -$env:BOOST_TEST_SHOW_PROGRESS="yes" -$env:BOOST_TEST_CATCH_SYSTEM_ERRORS="no" diff --git a/qpid/cpp/src/tests/env.py.in b/qpid/cpp/src/tests/env.py.in deleted file mode 100644 index 29b8c8739c..0000000000 --- a/qpid/cpp/src/tests/env.py.in +++ /dev/null @@ -1,116 +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. -# - -from __future__ import print_function - -from plano import * - -import platform as _platform - -WINDOWS = _platform.system() == "Windows" - -def _export(name, value): - globals()[name] = value - - if value is not None: - ENV[name] = value - -def _export_module(name, path): - _export(name, None) - - if exists(path): - _export(name, path) - -_cmake_build_type = "RelWithDebInfo" # XXX - -# Variables substituted by cmake - -_export("BUILD_DIR", normalize_path("@CMAKE_BINARY_DIR@")) -_export("SOURCE_DIR", normalize_path("@CMAKE_SOURCE_DIR@")) -_export("SASLPASSWD2", normalize_path("@SASLPASSWD2_EXECUTABLE@")) -_export("PYTHON", normalize_path("@PYTHON_EXECUTABLE@")) -_export("VALGRIND", None) - -if "@ENABLE_VALGRIND@" == "ON": - _export("VALGRIND", normalize_path("@VALGRIND_EXECUTABLE@")) - -# Python path - -_python_path = [ - join(BUILD_DIR, "src", "tests"), - join(BUILD_DIR, "bindings", "qpid", "python"), - join(BUILD_DIR, "management", "python", "lib"), -] - -if "PYTHONPATH" in ENV: - _python_path.extend(ENV["PYTHONPATH"].split(PATH_VAR_SEP)) - -ENV["PYTHONPATH"] = PATH_VAR_SEP.join(_python_path) - -# Path - -_build_src_dir = join(BUILD_DIR, "src") -_build_tests_dir = join(BUILD_DIR, "src", "tests") - -if WINDOWS: - _build_src_dir = join(_build_src_dir, _cmake_build_type) - _build_tests_dir = join(_build_tests_dir, _cmake_build_type) - -_path = [ - _build_src_dir, - _build_tests_dir, - join(BUILD_DIR, "management", "python", "bin"), -] - -if "PATH" in ENV: - _path.extend(ENV["PATH"].split(PATH_VAR_SEP)) - -ENV["PATH"] = PATH_VAR_SEP.join(_path) - -# Modules - -_module_prefix = join(BUILD_DIR, "src") - -if WINDOWS: - _module_prefix = join(_module_prefix, _cmake_build_type) - -_export_module("HA_LIB", join(_module_prefix, "ha@CMAKE_SHARED_LIBRARY_SUFFIX@")) -_export_module("XML_LIB", join(_module_prefix, "xml@CMAKE_SHARED_LIBRARY_SUFFIX@")) -_export_module("AMQP_LIB", join(_module_prefix, "amqp@CMAKE_SHARED_LIBRARY_SUFFIX@")) -_export_module("TEST_STORE_LIB", join(_module_prefix, "tests", "test_store@CMAKE_SHARED_LIBRARY_SUFFIX@")) -_export_module("STORE_LIB", join(_module_prefix, "linearstore@CMAKE_SHARED_LIBRARY_SUFFIX@")) - -if STORE_LIB is None: - _export_module("STORE_LIB", join(_module_prefix, "legacystore@CMAKE_SHARED_LIBRARY_SUFFIX@")) - -# Summarize - -print("PWD: {0}".format(current_dir())) -print("SOURCE_DIR: {0}".format(SOURCE_DIR)) -print("BUILD_DIR: {0}".format(BUILD_DIR)) - -print("PATH:") - -for item in _path: - print(" {0}".format(item)) - -print("PYTHONPATH:") - -for item in _python_path: - print(" {0}".format(item)) diff --git a/qpid/cpp/src/tests/env.sh.in b/qpid/cpp/src/tests/env.sh.in deleted file mode 100644 index 7ff42df1b7..0000000000 --- a/qpid/cpp/src/tests/env.sh.in +++ /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. -# - -# Environment variables substituted by cmake - -export BUILD_DIR=@CMAKE_BINARY_DIR@ -export SOURCE_DIR=@CMAKE_SOURCE_DIR@ - -export SASLPASSWD2=@SASLPASSWD2_EXECUTABLE@ -export PYTHON=@PYTHON_EXECUTABLE@ - -if [[ "@ENABLE_VALGRIND@" == "ON" ]]; then - export VALGRIND=@VALGRIND_EXECUTABLE@ -fi - -# Python path - -export PYTHONPATH=$BUILD_DIR/src/tests:$BUILD_DIR/bindings/qpid/python:$BUILD_DIR/management/python/lib:${PYTHONPATH-} - -# Path - -export PATH=$BUILD_DIR/src:$BUILD_DIR/src/tests:$BUILD_DIR/management/python/bin:${PATH-} - -# Modules - -function export_module { - if [[ -f $BUILD_DIR/src/$2 ]]; then - export $1=$BUILD_DIR/src/$2 - fi -} - -export_module HA_LIB ha.so -export_module XML_LIB xml.so -export_module AMQP_LIB amqp.so - -[[ ${STORE_LIB-} ]] || export_module STORE_LIB linearstore.so -[[ ${STORE_LIB-} ]] || export_module STORE_LIB legacystore.so - -export TEST_STORE_LIB=$BUILD_DIR/src/tests/test_store.so - -# Qpidd options - Eliminate - -export QPID_NO_MODULE_DIR=1 # Don't accidentally load installed modules -export QPID_DATA_DIR= # Disable persistence -export QPID_CONFIG=$SOURCE_DIR/src/tests/qpidd-empty.conf - -# Options for boost test framework - -[[ ${BOOST_TEST_SHOW_PROGRESS-} ]] || export BOOST_TEST_SHOW_PROGRESS=yes -[[ ${BOOST_TEST_CATCH_SYSTEM_ERRORS-} ]] || export BOOST_TEST_CATCH_SYSTEM_ERRORS=no - -echo "PWD: $PWD" -echo "SOURCE_DIR: ${SOURCE_DIR}" -echo "BUILD_DIR: ${BUILD_DIR}" - -echo "PATH:" -echo -n " "; echo $PATH | sed 's/:/\n /g' - -echo "PYTHONPATH:" -echo -n " "; echo $PYTHONPATH | sed 's/:/\n /g' diff --git a/qpid/cpp/src/tests/exception_test.cpp b/qpid/cpp/src/tests/exception_test.cpp deleted file mode 100644 index b880069575..0000000000 --- a/qpid/cpp/src/tests/exception_test.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 "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_TEST_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) { - SessionFixture fix; - fix.session.queueDeclare(arg::queue="q"); - fix.subs.subscribe(fix.lq, "q"); - Catcher<TransportFailure> pop(bind(&LocalQueue::pop, &fix.lq, sys::TIME_SEC)); - fix.shutdownBroker(); - BOOST_CHECK(pop.join()); -} - -QPID_AUTO_TEST_CASE(DisconnectedListen) { - SessionFixture fix; - struct NullListener : public MessageListener { - void received(Message&) { BOOST_FAIL("Unexpected message"); } - } l; - fix.session.queueDeclare(arg::queue="q"); - fix.subs.subscribe(l, "q"); - - Catcher<TransportFailure> runner(bind(&SubscriptionManager::run, boost::ref(fix.subs))); - fix.shutdownBroker(); - runner.join(); - BOOST_CHECK_THROW(fix.session.queueDeclare(arg::queue="x"), TransportFailure); -} - -QPID_AUTO_TEST_CASE(NoSuchQueueTest) { - SessionFixture 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/qpid/cpp/src/tests/failing-amqp0-10-python-tests b/qpid/cpp/src/tests/failing-amqp0-10-python-tests deleted file mode 100644 index afa263217f..0000000000 --- a/qpid/cpp/src/tests/failing-amqp0-10-python-tests +++ /dev/null @@ -1,32 +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. -# - -#The following four tests fail the because pure python client excludes -#the node type for queues from the reply-to address, weheras the swigged -#client does not (as that prevents it resolving the node on every send) -qpid.tests.messaging.message.MessageEchoTests.testReplyTo -qpid.tests.messaging.message.MessageEchoTests.testReplyToQueue -qpid.tests.messaging.message.MessageEchoTests.testReplyToQueueSubject -qpid.tests.messaging.message.MessageEchoTests.testProperties - -# The following test fails because the swig client throws an error -# when creating a sender with a node name that is ambiguous and no -# type specified. By contrast the pure python client defaults to the -# queue in this case. -qpid_tests.broker_0_10.new_api.GeneralTests.test_node_disambiguation_2 diff --git a/qpid/cpp/src/tests/failing-amqp1.0-python-tests b/qpid/cpp/src/tests/failing-amqp1.0-python-tests deleted file mode 100644 index e76d05d7be..0000000000 --- a/qpid/cpp/src/tests/failing-amqp1.0-python-tests +++ /dev/null @@ -1,25 +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. -# - -qpid_tests.broker_0_10.new_api.GeneralTests.test_qpid_3481_acquired_to_alt_exchange_2_consumers -qpid_tests.broker_0_10.new_api.GeneralTests.test_qpid_3481_acquired_to_alt_exchange -qpid_tests.broker_0_10.new_api.GeneralTests.test_nolocal_rerouted -qpid_tests.broker_0_10.new_api.GeneralTests.test_ambiguous_delete_1 -qpid_tests.broker_0_10.new_api.GeneralTests.test_ambiguous_delete_2 -qpid_tests.broker_0_10.new_api.GeneralTests.test_node_disambiguation_2 diff --git a/qpid/cpp/src/tests/federated_topic_test b/qpid/cpp/src/tests/federated_topic_test deleted file mode 100755 index b8356b4b9d..0000000000 --- a/qpid/cpp/src/tests/federated_topic_test +++ /dev/null @@ -1,127 +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 - -source ./env.sh - -trap stop_brokers EXIT - -start_broker() { - qpidd --daemon --port 0 --interface 127.0.0.1 --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 --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" - qpid-topic-listener -p $MY_PORT > $LOG 2>&1 && rm -f $LOG -} - -publish() { - qpid-topic-publisher --messages $MESSAGES --batches $BATCHES --subscribers $SUBSCRIBERS -p $PORT_A -} - -setup_routes() { - BROKER_A="daffodil:$PORT_A" - BROKER_B="daffodil:$PORT_B" - BROKER_C="daffodil:$PORT_C" - if (($VERBOSE)); then - echo "Establishing routes for topic..." - fi - qpid-route route add $BROKER_B $BROKER_A amq.topic topic_control B B - qpid-route route add $BROKER_C $BROKER_B amq.topic topic_control C C - if (($VERBOSE)); then - echo "linked A->B->C" - fi - qpid-route route add $BROKER_B $BROKER_C amq.topic topic_control B B - 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 - - qpid-route route add $BROKER_B $BROKER_C amq.direct response B B - 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" - qpid-route route list $b - done - fi -} - -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 diff --git a/qpid/cpp/src/tests/federation.py b/qpid/cpp/src/tests/federation.py deleted file mode 100755 index f5b62019e5..0000000000 --- a/qpid/cpp/src/tests/federation.py +++ /dev/null @@ -1,2793 +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 -import qpid.messaging -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) - - # add a new-style messaging connection to each broker - for _b in self._brokers: - _b.connection = qpid.messaging.Connection(_b.url) - _b.connection.open() - - 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) - _b.connection.close() - - 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, result) - - link = qmf.getObjects(_class="link")[0] - result = link.bridge(False, "amq.direct", "amq.direct", "my-key", "", - "", False, False, False, 0, 0) - self.assertEqual(result.status, 0, result) - - bridge = qmf.getObjects(_class="bridge")[0] - result = bridge.close() - self.assertEqual(result.status, 0, result) - - result = link.close() - self.assertEqual(result.status, 0, result) - - self.verify_cleanup() - - def test_pull_from_exchange(self): - """ This test uses an alternative method to manage links and bridges - via the broker object. - """ - session = self.session - - self.startQmf() - qmf = self.qmf - broker = qmf.getObjects(_class="broker")[0] - - # create link - link_args = {"host":self.remote_host(), "port":self.remote_port(), "durable":False, - "authMechanism":"PLAIN", "username":"guest", "password":"guest", - "transport":"tcp"} - result = broker.create("link", "test-link-1", link_args, False) - self.assertEqual(result.status, 0, result) - link = qmf.getObjects(_class="link")[0] - - # create bridge - bridge_args = {"link":"test-link-1", "src":"amq.direct", "dest":"amq.fanout", - "key":"my-key"} - result = broker.create("bridge", "test-bridge-1", bridge_args, False); - self.assertEqual(result.status, 0, result) - 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 = broker.delete("bridge", "test-bridge-1", {}) - self.assertEqual(result.status, 0, result) - - result = broker.delete("link", "test-link-1", {}) - self.assertEqual(result.status, 0, result) - - 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, result) - - link = qmf.getObjects(_class="link")[0] - result = link.bridge(False, "amq.direct", "amq.fanout", "my-key", "", "", False, True, False, 0, 0) - self.assertEqual(result.status, 0, result) - - 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) - result = link.close() - self.assertEqual(result.status, 0, result) - - 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, result) - - link = qmf.getObjects(_class="link")[0] - result = link.bridge(False, "my-bridge-queue", "amq.fanout", "my-key", "", "", True, False, False, 1, 0) - self.assertEqual(result.status, 0, result) - - 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) - result = link.close() - self.assertEqual(result.status, 0, result) - - self.verify_cleanup() - - def test_pull_from_queue_recovery(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_recovery") - # disable auto-delete otherwise the detach of the fed session may - # delete the queue right after this test re-creates it. - r_session.queue_declare(queue="my-bridge-queue", auto_delete=False) - 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, result) - - link = qmf.getObjects(_class="link")[0] - result = link.bridge(False, "my-bridge-queue", "amq.fanout", "my-key", "", "", True, False, False, 1, 0) - self.assertEqual(result.status, 0, result) - - bridge = qmf.getObjects(_class="bridge")[0] - sleep(5) - - #recreate the remote bridge queue to invalidate the bridge session - r_session.queue_delete (queue="my-bridge-queue", if_empty=False, if_unused=False) - r_session.queue_declare(queue="my-bridge-queue", auto_delete=False) - - #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() - r_session.queue_delete (queue="my-bridge-queue", if_empty=False, if_unused=False) - - 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, 0) - r_res = r_link.bridge(False, "amq.direct", "amq.direct", "key", "", "", False, False, False, 0, 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) - mp = msg.get("message_properties").application_headers - self.assertEqual(mp.__class__, dict) - self.assertEqual(mp['x-qpid.trace'], 'REMOTE') # check that the federation-tag override works - 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, 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, 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, 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, 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, 0) - self.assertEqual(result.status, 0) - result = link.bridge(False, "fed.topic_reorigin_2", "fed.topic_reorigin_2", "", "", "", False, False, True, 0, 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, 0) - self.assertEqual(result.status, 0) - result = link.bridge(False, "fed.direct_reorigin_2", "fed.direct_reorigin_2", "", "", "", False, False, True, 0, 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_any(self): - self.do_test_dynamic_headers('any') - - def test_dynamic_headers_all(self): - self.do_test_dynamic_headers('all') - - - def do_test_dynamic_headers(self, match_mode): - session = self.session - r_conn = self.connect(host=self.remote_host(), port=self.remote_port()) - r_session = r_conn.session("test_dynamic_headers_%s" % match_mode) - - 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, 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':match_mode, '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, 0) - self.assertEqual(result.status, 0) - result = link.bridge(False, "fed.headers_reorigin_2", "fed.headers_reorigin_2", "", "", "", False, False, True, 0, 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, 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, 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, 0) - - self.assertEqual(result.status, 0) - result = link.bridge(False, "fed.xml_reorigin_2", "fed.xml_reorigin_2", "", "", "", False, False, True, 0, 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, 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, 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 - 0) # credit - 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 - 0) # credit - 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 - 0) # credit - 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 - 0) # credit - 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 - 0) # credit - 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() - - - def test_multilink_direct(self): - """ Verify that two distinct links can be created between federated - brokers. - """ - self.startQmf() - qmf = self.qmf - self._setup_brokers() - src_broker = self._brokers[0] - dst_broker = self._brokers[1] - - # create a direct exchange on each broker - for _b in [src_broker, dst_broker]: - _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!") - - # create destination queues - for _q in [("HiQ", "high"), ("MedQ", "medium"), ("LoQ", "low")]: - dst_broker.client_session.queue_declare(queue=_q[0], auto_delete=True) - dst_broker.client_session.exchange_bind(queue=_q[0], exchange="fedX.direct", binding_key=_q[1]) - - # create two connections, one for high priority traffic - for _q in ["HiPri", "Traffic"]: - result = dst_broker.qmf_object.create("link", _q, - {"host":src_broker.host, - "port":src_broker.port}, - False) - self.assertEqual(result.status, 0); - - links = qmf.getObjects(_broker=dst_broker.qmf_broker, _class="link") - for _l in links: - if _l.name == "HiPri": - hi_link = _l - elif _l.name == "Traffic": - data_link = _l - else: - self.fail("Unexpected Link found: " + _l.name) - - # now create a route for messages sent with key "high" to use the - # hi_link - result = dst_broker.qmf_object.create("bridge", "HiPriBridge", - {"link":hi_link.name, - "src":"fedX.direct", - "dest":"fedX.direct", - "key":"high"}, False) - self.assertEqual(result.status, 0); - - - # create routes for the "medium" and "low" links to use the normal - # data_link - for _b in [("MediumBridge", "medium"), ("LowBridge", "low")]: - result = dst_broker.qmf_object.create("bridge", _b[0], - {"link":data_link.name, - "src":"fedX.direct", - "dest":"fedX.direct", - "key":_b[1]}, False) - self.assertEqual(result.status, 0); - - # now wait for the links to become operational - for _l in [hi_link, data_link]: - expire_time = time() + 30 - while _l.state != "Operational" and time() < expire_time: - _l.update() - self.assertEqual(_l.state, "Operational", "Link failed to become operational") - - # verify each link uses a different connection - self.assertNotEqual(hi_link.connectionRef, data_link.connectionRef, - "Different links using the same connection") - - hi_conn = qmf.getObjects(_broker=dst_broker.qmf_broker, - _objectId=hi_link.connectionRef)[0] - data_conn = qmf.getObjects(_broker=dst_broker.qmf_broker, - _objectId=data_link.connectionRef)[0] - - - # send hi data, verify only goes over hi link - - r_ssn = dst_broker.connection.session() - hi_receiver = r_ssn.receiver("HiQ"); - med_receiver = r_ssn.receiver("MedQ"); - low_receiver = r_ssn.receiver("LoQ"); - - for _c in [hi_conn, data_conn]: - _c.update() - self.assertEqual(_c.msgsToClient, 0, "Unexpected messages received") - - s_ssn = src_broker.connection.session() - hi_sender = s_ssn.sender("fedX.direct/high") - med_sender = s_ssn.sender("fedX.direct/medium") - low_sender = s_ssn.sender("fedX.direct/low") - - try: - hi_sender.send(qpid.messaging.Message(content="hi priority")) - msg = hi_receiver.fetch(timeout=10) - r_ssn.acknowledge() - self.assertEqual(msg.content, "hi priority"); - except: - self.fail("Hi Pri message failure") - - hi_conn.update() - data_conn.update() - self.assertEqual(hi_conn.msgsToClient, 1, "Expected 1 hi pri message") - self.assertEqual(data_conn.msgsToClient, 0, "Expected 0 data messages") - - # send low and medium, verify it does not go over hi link - - try: - med_sender.send(qpid.messaging.Message(content="medium priority")) - msg = med_receiver.fetch(timeout=10) - r_ssn.acknowledge() - self.assertEqual(msg.content, "medium priority"); - except: - self.fail("Medium Pri message failure") - - hi_conn.update() - data_conn.update() - self.assertEqual(hi_conn.msgsToClient, 1, "Expected 1 hi pri message") - self.assertEqual(data_conn.msgsToClient, 1, "Expected 1 data message") - - try: - low_sender.send(qpid.messaging.Message(content="low priority")) - msg = low_receiver.fetch(timeout=10) - r_ssn.acknowledge() - self.assertEqual(msg.content, "low priority"); - except: - self.fail("Low Pri message failure") - - hi_conn.update() - data_conn.update() - self.assertEqual(hi_conn.msgsToClient, 1, "Expected 1 hi pri message") - self.assertEqual(data_conn.msgsToClient, 2, "Expected 2 data message") - - # cleanup - - for _b in qmf.getObjects(_broker=dst_broker.qmf_broker,_class="bridge"): - result = _b.close() - self.assertEqual(result.status, 0) - - for _l in qmf.getObjects(_broker=dst_broker.qmf_broker,_class="link"): - result = _l.close() - self.assertEqual(result.status, 0) - - for _q in [("HiQ", "high"), ("MedQ", "medium"), ("LoQ", "low")]: - dst_broker.client_session.exchange_unbind(queue=_q[0], exchange="fedX.direct", binding_key=_q[1]) - dst_broker.client_session.queue_delete(queue=_q[0]) - - for _b in [src_broker, dst_broker]: - _b.client_session.exchange_delete(exchange="fedX.direct") - - self._teardown_brokers() - - self.verify_cleanup() - - - def test_multilink_shared_queue(self): - """ Verify that two distinct links can be created between federated - brokers. - """ - self.startQmf() - qmf = self.qmf - self._setup_brokers() - src_broker = self._brokers[0] - dst_broker = self._brokers[1] - - # create a topic exchange on the destination broker - dst_broker.client_session.exchange_declare(exchange="fedX.topic", type="topic") - self.assertEqual(dst_broker.client_session.exchange_query(name="fedX.topic").type, - "topic", "exchange_declare failed!") - - # create a destination queue - dst_broker.client_session.queue_declare(queue="destQ", auto_delete=True) - dst_broker.client_session.exchange_bind(queue="destQ", exchange="fedX.topic", binding_key="srcQ") - - # create a single source queue - src_broker.client_session.queue_declare(queue="srcQ", auto_delete=True) - - # create two connections - for _q in ["Link1", "Link2"]: - result = dst_broker.qmf_object.create("link", _q, - {"host":src_broker.host, - "port":src_broker.port}, - False) - self.assertEqual(result.status, 0); - - links = qmf.getObjects(_broker=dst_broker.qmf_broker, _class="link") - self.assertEqual(len(links), 2) - - # now create two "parallel" queue routes from the source queue to the - # destination exchange. - result = dst_broker.qmf_object.create("bridge", "Bridge1", - {"link":"Link1", - "src":"srcQ", - "dest":"fedX.topic", - "srcIsQueue": True}, - False) - self.assertEqual(result.status, 0); - result = dst_broker.qmf_object.create("bridge", "Bridge2", - {"link":"Link2", - "src":"srcQ", - "dest":"fedX.topic", - "srcIsQueue": True}, - False) - self.assertEqual(result.status, 0); - - - # now wait for the links to become operational - for _l in links: - expire_time = time() + 30 - while _l.state != "Operational" and time() < expire_time: - _l.update() - self.assertEqual(_l.state, "Operational", "Link failed to become operational") - - # verify each link uses a different connection - self.assertNotEqual(links[0].connectionRef, links[1].connectionRef, - "Different links using the same connection") - - conn1 = qmf.getObjects(_broker=dst_broker.qmf_broker, - _objectId=links[0].connectionRef)[0] - conn2 = qmf.getObjects(_broker=dst_broker.qmf_broker, - _objectId=links[1].connectionRef)[0] - - # verify messages sent to the queue are pulled by each connection - - r_ssn = dst_broker.connection.session() - receiver = r_ssn.receiver("destQ"); - - for _c in [conn1, conn2]: - _c.update() - self.assertEqual(_c.msgsToClient, 0, "Unexpected messages received") - - s_ssn = src_broker.connection.session() - sender = s_ssn.sender("srcQ") - - try: - for x in range(5): - sender.send(qpid.messaging.Message(content="hello")) - for x in range(5): - msg = receiver.fetch(timeout=10) - self.assertEqual(msg.content, "hello"); - r_ssn.acknowledge() - except: - self.fail("Message failure") - - # expect messages to be split over each connection. - conn1.update() - conn2.update() - self.assertNotEqual(conn1.msgsToClient, 0, "No messages sent") - self.assertNotEqual(conn2.msgsToClient, 0, "No messages sent") - self.assertEqual(conn2.msgsToClient + conn1.msgsToClient, 5, - "Expected 5 messages total") - - for _b in qmf.getObjects(_broker=dst_broker.qmf_broker,_class="bridge"): - result = _b.close() - self.assertEqual(result.status, 0) - - for _l in qmf.getObjects(_broker=dst_broker.qmf_broker,_class="link"): - result = _l.close() - self.assertEqual(result.status, 0) - - dst_broker.client_session.exchange_unbind(queue="destQ", exchange="fedX.topic", binding_key="srcQ") - dst_broker.client_session.exchange_delete(exchange="fedX.topic") - - self._teardown_brokers() - - self.verify_cleanup() - - - def test_dynamic_direct_shared_queue(self): - """ - Route Topology: - - +<--- B1 - B0 <---+<--- B2 - +<--- B3 - """ - 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!") - - # Create 2 links per each source broker (1,2,3) to the downstream - # broker 0: - for _b in range(1,4): - for _l in ["dynamic", "queue"]: - result = self._brokers[0].qmf_object.create( "link", - "Link-%d-%s" % (_b, _l), - {"host":self._brokers[_b].host, - "port":self._brokers[_b].port}, False) - self.assertEqual(result.status, 0) - - # create queue on source brokers for use by the dynamic route - self._brokers[_b].client_session.queue_declare(queue="fedSrcQ", exclusive=False, auto_delete=True) - - for _l in range(1,4): - # for each dynamic link, create a dynamic bridge for the "fedX.direct" - # exchanges, using the fedSrcQ on each upstream source broker - result = self._brokers[0].qmf_object.create("bridge", - "Bridge-%d-dynamic" % _l, - {"link":"Link-%d-dynamic" % _l, - "src":"fedX.direct", - "dest":"fedX.direct", - "dynamic":True, - "queue":"fedSrcQ"}, False) - self.assertEqual(result.status, 0) - - # create a queue route that shares the queue used by the dynamic route - result = self._brokers[0].qmf_object.create("bridge", - "Bridge-%d-queue" % _l, - {"link":"Link-%d-queue" % _l, - "src":"fedSrcQ", - "dest":"fedX.direct", - "srcIsQueue":True}, False) - 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 B0, bound to "spudboy" - self._brokers[0].client_session.queue_declare(queue="DestQ", exclusive=True, auto_delete=True) - self._brokers[0].client_session.exchange_bind(queue="DestQ", exchange="fedX.direct", binding_key="spudboy") - - # subscribe to messages arriving on B2's queue - self.subscribe(self._brokers[0].client_session, queue="DestQ", destination="f1") - queue = self._brokers[0].client_session.incoming("f1") - - # wait until the binding key has propagated to each broker - - binding_counts = [1, 1, 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() - - for _b in range(1,4): - # send 3 msgs from each source broker - for i in range(3): - dp = self._brokers[_b].client_session.delivery_properties(routing_key="spudboy") - self._brokers[_b].client_session.message_transfer(destination="fedX.direct", message=Message(dp, "Message_drp %d" % i)) - - # get exactly 9 (3 per broker) on B0 - for i in range(9): - msg = queue.get(timeout=5) - - try: - extra = queue.get(timeout=1) - self.fail("Got unexpected message in queue: " + extra.body) - except Empty: None - - # verify that messages went across every link - for _l in qmf.getObjects(_broker=self._brokers[0].qmf_broker, - _class="link"): - for _c in qmf.getObjects(_broker=self._brokers[0].qmf_broker, - _objectId=_l.connectionRef): - self.assertNotEqual(_c.msgsToClient, 0, "Messages did not pass over link as expected.") - - # cleanup - - self._brokers[0].client_session.exchange_unbind(queue="DestQ", exchange="fedX.direct", binding_key="spudboy") - self._brokers[0].client_session.message_cancel(destination="f1") - self._brokers[0].client_session.queue_delete(queue="DestQ") - - 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_bounce_unbinds_named_queue(self): - """ Verify that a propagated binding is removed when the connection is - bounced - """ - 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="direct") - self.assertEqual(_b.client_session.exchange_query(name="fedX").type, - "direct", "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 the destination broker, create a binding for propagation - self._brokers[0].client_session.queue_declare(queue="fedDstQ") - self._brokers[0].client_session.exchange_bind(queue="fedDstQ", exchange="fedX", binding_key="spud") - - # on the source broker, create a bridge queue - self._brokers[1].client_session.queue_declare(queue="fedSrcQ") - - # connect B1 --> B0 - result = self._brokers[0].qmf_object.create( "link", - "Link-dynamic", - {"host":self._brokers[1].host, - "port":self._brokers[1].port}, False) - self.assertEqual(result.status, 0) - - # bridge the "fedX" exchange: - result = self._brokers[0].qmf_object.create("bridge", - "Bridge-dynamic", - {"link":"Link-dynamic", - "src":"fedX", - "dest":"fedX", - "dynamic":True, - "queue":"fedSrcQ"}, False) - self.assertEqual(result.status, 0) - - # wait for 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.") - - # wait until the binding key has propagated to the src broker - exchanges[1].update() - timeout = time() + 10 - while exchanges[1].bindingCount < 1 and time() <= timeout: - exchanges[1].update() - self.failUnless(exchanges[1].bindingCount == 1) - - # - # 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) - exchanges[1].update() - timeout = time() + 10 - while exchanges[1].bindingCount != 0 and time() <= timeout: - exchanges[1].update() - self.failUnless(exchanges[1].bindingCount == 0) - - self._brokers[1].client_session.queue_delete(queue="fedSrcQ") - - 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() - - def test_credit(self): - """ Test a federation link configured to use explict acks and a credit - limit - """ - 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_credit") - r_session.queue_declare(queue="my-bridge-queue", auto_delete=True) - - #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, result) - - link = qmf.getObjects(_class="link")[0] - - # now wait for Link to go operational - retries = 0 - operational = False - while not operational: - link.update() - if link.state == "Operational": - operational = True; - if not operational: - retries += 1 - self.failIfEqual(retries, 10, - "inter-broker links failed to become operational.") - sleep(1) - - # create the subscription - result = link.bridge(False, "my-bridge-queue", "amq.fanout", "my-key", - "", "", True, False, False, - 3, # explicit ack, with sync every 3 msgs - 7) # msg credit - self.assertEqual(result.status, 0, result) - bridge = qmf.getObjects(_class="bridge")[0] - - # generate enough traffic to trigger flow control and syncs - for i in range(1000): - dp = r_session.delivery_properties(routing_key="my-bridge-queue") - r_session.message_transfer(message=Message(dp, "Message %d" % i)) - - for i in range(1000): - 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) - result = link.close() - self.assertEqual(result.status, 0, result) - - r_session.close() - r_conn.close() - - self.verify_cleanup() - diff --git a/qpid/cpp/src/tests/federation_sys.py b/qpid/cpp/src/tests/federation_sys.py deleted file mode 100755 index be9613bb9f..0000000000 --- a/qpid/cpp/src/tests/federation_sys.py +++ /dev/null @@ -1,977 +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. -# - -from inspect import stack -from qpid import messaging -from qpid.messaging import Message -from qpid.messaging.exceptions import Empty -from qpid.testlib import TestBase010 -from random import randint -from sys import stdout -from time import sleep - - -class Enum(object): - def __init__(self, **entries): - self.__dict__.update(entries) - def __repr__(self): - args = ['%s=%s' % (k, repr(v)) for (k,v) in vars(self).items()] - return 'Enum(%s)' % ', '.join(args) - - -class QmfTestBase010(TestBase010): - - _brokers = [] - _links = [] - _bridges = [] - _alt_exch_ops = Enum(none=0, create=1, delete=2) - - class _Broker(object): - """ - This broker proxy object holds the Qmf proxy to a broker of known address as well as the QMF broker - object, connection and sessions to the broker. - """ - def __init__(self, url): - self.url = url # format: "host:port" - url_parts = url.split(':') - self.host = url_parts[0] - self.port = int(url_parts[1]) - self.qmf_broker = None - self.connection = messaging.Connection.establish(self.url) - self.sessions = [] - def __str__(self): - return "_Broker %s:%s (%d open sessions)" % (self.host, self.port, len(self.sessions)) - def destroy(self, qmf = None): - if qmf is not None: - qmf.delBroker(self.qmf_broker.getBroker()) - for session in self.sessions: - try: # Session may have been closed by broker error - session.close() - except Exception, e: print "WARNING: %s: Unable to close session %s (%s): %s %s" % (self, session, hex(id(session)), type(e), e) - try: # Connection may have been closed by broker error - self.connection.close() - except Exception, e: print "WARNING: %s: Unable to close connection %s (%s): %s %s" % (self, self.connection, hex(id(self.connection)), type(e), e) - def session(self, name, transactional_flag = False): - session = self.connection.session(name, transactional_flag) - self.sessions.append(session) - return session - - def setUp(self): - """ - Called one before each test starts - """ - TestBase010.setUp(self) - self.startQmf(); - - def tearDown(self): - """ - Called once after each test competes. Close all Qmf objects (bridges, links and brokers) - """ - while len(self._bridges): - self._bridges.pop().close() - while len(self._links): - self._links.pop().close() - while len(self._brokers): - b = self._brokers.pop() - if len(self._brokers) <= 1: - b.destroy(None) - else: - b.destroy(self.qmf) - TestBase010.tearDown(self) - self.qmf.close() - - #--- General test utility functions - - def _get_name(self): - """ - Return the name of method which called this method stripped of "test_" prefix. Used for naming - queues and exchanges on a per-test basis. - """ - return stack()[1][3][5:] - - def _get_broker_port(self, key): - """ - Get the port of a broker defined in the environment using -D<key>=portno - """ - return int(self.defines[key]) - - def _get_send_address(self, exch_name, queue_name): - """ - Get an address to which to send messages based on the exchange name and queue name, but taking into account - that the exchange name may be "" (the default exchange), in whcih case the format changes slightly. - """ - if len(exch_name) == 0: # Default exchange - return queue_name - return "%s/%s" % (exch_name, queue_name) - - def _get_broker(self, broker_port_key): - """ - Read the port numbers for pre-started brokers from the environment using keys, then find or create and return - the Qmf broker proxy for the appropriate broker - """ - port = self._get_broker_port(broker_port_key) - return self._find_create_broker("localhost:%s" % port) - ################ - def _get_msg_subject(self, topic_key): - """ - Return an appropriate subject for sending a message to a known topic. Return None if there is no topic. - """ - if len(topic_key) == 0: return None - if "*" in topic_key: return topic_key.replace("*", "test") - if "#" in topic_key: return topic_key.replace("#", "multipart.test") - return topic_key - - def _send_msgs(self, session_name, broker, addr, msg_count, msg_content = "Message_%03d", topic_key = "", - msg_durable_flag = False, enq_txn_size = 0): - """ - Send messages to a broker using address addr - """ - send_session = broker.session(session_name, transactional_flag = enq_txn_size > 0) - sender = send_session.sender(addr) - txn_cnt = 0 - for i in range(0, msg_count): - sender.send(Message(msg_content % (i + 1), subject = self._get_msg_subject(topic_key), durable = msg_durable_flag)) - if enq_txn_size > 0: - txn_cnt += 1 - if txn_cnt >= enq_txn_size: - send_session.commit() - txn_cnt = 0 - if enq_txn_size > 0 and txn_cnt > 0: - send_session.commit() - sender.close() - send_session.close() - - def _receive_msgs(self, session_name, broker, addr, msg_count, msg_content = "Message_%03d", deq_txn_size = 0, - timeout = 0): - """ - Receive messages from a broker - """ - receive_session = broker.session(session_name, transactional_flag = deq_txn_size > 0) - receiver = receive_session.receiver(addr) - txn_cnt = 0 - for i in range(0, msg_count): - try: - msg = receiver.fetch(timeout = timeout) - if deq_txn_size > 0: - txn_cnt += 1 - if txn_cnt >= deq_txn_size: - receive_session.commit() - txn_cnt = 0 - receive_session.acknowledge() - except Empty: - if deq_txn_size > 0: receive_session.rollback() - receiver.close() - receive_session.close() - if i == 0: - self.fail("Broker %s queue \"%s\" is empty" % (broker.qmf_broker.getBroker().getUrl(), addr)) - else: - self.fail("Unable to receive message %d from broker %s queue \"%s\"" % (i, broker.qmf_broker.getBroker().getUrl(), addr)) - if msg.content != msg_content % (i + 1): - receiver.close() - receive_session.close() - self.fail("Unexpected message \"%s\", was expecting \"%s\"." % (msg.content, msg_content % (i + 1))) - try: - msg = receiver.fetch(timeout = 0) - if deq_txn_size > 0: receive_session.rollback() - receiver.close() - receive_session.close() - self.fail("Extra message \"%s\" found on broker %s address \"%s\"" % (msg.content, broker.qmf_broker.getBroker().getUrl(), addr)) - except Empty: - pass - if deq_txn_size > 0 and txn_cnt > 0: - receive_session.commit() - receiver.close() - receive_session.close() - - #--- QMF-specific utility functions - - def _get_qmf_property(self, props, key): - """ - Get the value of a named property key kj from a property list [(k0, v0), (k1, v1), ... (kn, vn)]. - """ - for k,v in props: - if k.name == key: - return v - return None - - def _check_qmf_return(self, method_result): - """ - Check the result of a Qmf-defined method call - """ - self.assertTrue(method_result.status == 0, method_result.text) - - def _check_optional_qmf_property(self, qmf_broker, type, qmf_object, key, expected_val, obj_ref_flag): - """ - Optional Qmf properties don't show up in the properties list when they are not specified. Checks for - these property types involve searching the properties list and making sure it is present or not as - expected. - """ - val = self._get_qmf_property(qmf_object.getProperties(), key) - if val is None: - if len(expected_val) > 0: - self.fail("%s %s exists, but has does not have %s property. Expected value: \"%s\"" % - (type, qmf_object.name, key, expected_val)) - else: - if len(expected_val) > 0: - if obj_ref_flag: - obj = self.qmf.getObjects(_objectId = val, _broker = qmf_broker.getBroker()) - self.assertEqual(len(obj), 1, "More than one object with the same objectId: %s" % obj) - val = obj[0].name - self.assertEqual(val, expected_val, "%s %s exists, but has incorrect %s property. Found \"%s\", expected \"%s\"" % - (type, qmf_object.name, key, val, expected_val)) - else: - self.fail("%s %s exists, but has an unexpected %s property \"%s\" set." % (type, qmf_object.name, key, val)) - - #--- Find/create Qmf broker objects - - def _find_qmf_broker(self, url): - """ - Find the Qmf broker object for the given broker URL. The broker must have been previously added to Qmf through - addBroker() - """ - for b in self.qmf.getObjects(_class="broker"): - if b.getBroker().getUrl() == url: - return b - return None - - def _find_create_broker(self, url): - """ - Find a running broker through Qmf. If it does not exist, add it (assuming the broker is already running). - """ - broker = self._Broker(url) - self._brokers.append(broker) - if self.qmf is not None: - qmf_broker = self._find_qmf_broker(broker.url) - if qmf_broker is None: - self.qmf.addBroker(broker.url) - broker.qmf_broker = self._find_qmf_broker(broker.url) - else: - broker.qmf_broker = qmf_broker - return broker - - #--- Find/create/delete exchanges - - def _find_qmf_exchange(self, qmf_broker, name, type, alternate, durable, auto_delete): - """ - Find Qmf exchange object - """ - for e in self.qmf.getObjects(_class="exchange", _broker = qmf_broker.getBroker()): - if e.name == name: - if len(name) == 0 or (len(name) >= 4 and name[:4] == "amq."): return e # skip checks for special exchanges - self.assertEqual(e.type, type, - "Exchange \"%s\" exists, but is of unexpected type %s; expected type %s." % - (name, e.type, type)) - self._check_optional_qmf_property(qmf_broker, "Exchange", e, "altExchange", alternate, True) - self.assertEqual(e.durable, durable, - "Exchange \"%s\" exists, but has incorrect durability. Found durable=%s, expected durable=%s" % - (name, e.durable, durable)) - self.assertEqual(e.autoDelete, auto_delete, - "Exchange \"%s\" exists, but has incorrect auto-delete property. Found %s, expected %s" % - (name, e.autoDelete, auto_delete)) - return e - return None - - def _find_create_qmf_exchange(self, qmf_broker, name, type, alternate, durable, auto_delete, args): - """ - Find Qmf exchange object if exchange exists, create exchange and return its Qmf object if not - """ - e = self._find_qmf_exchange(qmf_broker, name, type, alternate, durable, auto_delete) - if e is not None: return e - # Does not exist, so create it - props = dict({"exchange-type": type, "type": type, "durable": durable, "auto-delete": auto_delete, "alternate-exchange": alternate}, **args) - self._check_qmf_return(qmf_broker.create(type="exchange", name=name, properties=props, strict=True)) - e = self._find_qmf_exchange(qmf_broker, name, type, alternate, durable, auto_delete) - self.assertNotEqual(e, None, "Creation of exchange %s on broker %s failed" % (name, qmf_broker.getBroker().getUrl())) - return e - - def _find_delete_qmf_exchange(self, qmf_broker, name, type, alternate, durable, auto_delete): - """ - Find and delete Qmf exchange object if it exists - """ - e = self._find_qmf_exchange(qmf_broker, name, type, alternate, durable, auto_delete) - if e is not None and not auto_delete: - self._check_qmf_return(qmf_broker.delete(type="exchange", name=name, options={})) - - #--- Find/create/delete queues - - def _find_qmf_queue(self, qmf_broker, name, alternate_exchange, durable, exclusive, auto_delete): - """ - Find a Qmf queue object - """ - for q in self.qmf.getObjects(_class="queue", _broker = qmf_broker.getBroker()): - if q.name == name: - self._check_optional_qmf_property(qmf_broker, "Queue", q, "altExchange", alternate_exchange, True) - self.assertEqual(q.durable, durable, - "Queue \"%s\" exists, but has incorrect durable property. Found %s, expected %s" % - (name, q.durable, durable)) - self.assertEqual(q.exclusive, exclusive, - "Queue \"%s\" exists, but has incorrect exclusive property. Found %s, expected %s" % - (name, q.exclusive, exclusive)) - self.assertEqual(q.autoDelete, auto_delete, - "Queue \"%s\" exists, but has incorrect auto-delete property. Found %s, expected %s" % - (name, q.autoDelete, auto_delete)) - return q - return None - - def _find_create_qmf_queue(self, qmf_broker, name, alternate_exchange, durable, exclusive, auto_delete, args): - """ - Find Qmf queue object if queue exists, create queue and return its Qmf object if not - """ - q = self._find_qmf_queue(qmf_broker, name, alternate_exchange, durable, exclusive, auto_delete) - if q is not None: return q - # Queue does not exist, so create it - props = dict({"durable": durable, "auto-delete": auto_delete, "exclusive": exclusive, "alternate-exchange": alternate_exchange}, **args) - self._check_qmf_return(qmf_broker.create(type="queue", name=name, properties=props, strict=True)) - q = self._find_qmf_queue(qmf_broker, name, alternate_exchange, durable, exclusive, auto_delete) - self.assertNotEqual(q, None, "Creation of queue %s on broker %s failed" % (name, qmf_broker.getBroker().getUrl())) - return q - - def _find_delete_qmf_queue(self, qmf_broker, name, alternate_exchange, durable, exclusive, auto_delete, args): - """ - Find and delete Qmf queue object if it exists - """ - q = self._find_qmf_queue(qmf_broker, name, alternate_exchange, durable, exclusive, auto_delete) - if q is not None and not auto_delete: - self._check_qmf_return(qmf_broker.delete(type="queue", name=name, options={})) - - #--- Find/create/delete bindings (between an exchange and a queue) - - def _find_qmf_binding(self, qmf_broker, qmf_exchange, qmf_queue, binding_key, binding_args): - """ - Find a Qmf binding object - """ - for b in self.qmf.getObjects(_class="binding", _broker = qmf_broker.getBroker()): - if b.exchangeRef == qmf_exchange.getObjectId() and b.queueRef == qmf_queue.getObjectId(): - if qmf_exchange.type != "fanout": # Fanout ignores the binding key, and always returns "" as the key - self.assertEqual(b.bindingKey, binding_key, - "Binding between exchange %s and queue %s exists, but has mismatching binding key: Found %s, expected %s." % - (qmf_exchange.name, qmf_queue.name, b.bindingKey, binding_key)) - self.assertEqual(b.arguments, binding_args, - "Binding between exchange %s and queue %s exists, but has mismatching arguments: Found %s, expected %s" % - (qmf_exchange.name, qmf_queue.name, b.arguments, binding_args)) - return b - return None - - def _find_create_qmf_binding(self, qmf_broker, qmf_exchange, qmf_queue, binding_key, binding_args): - """ - Find Qmf binding object if it exists, create binding and return its Qmf object if not - """ - b = self._find_qmf_binding(qmf_broker, qmf_exchange, qmf_queue, binding_key, binding_args) - if b is not None: return b - # Does not exist, so create it - self._check_qmf_return(qmf_broker.create(type="binding", name="%s/%s/%s" % (qmf_exchange.name, qmf_queue.name, binding_key), properties=binding_args, strict=True)) - b = self._find_qmf_binding(qmf_broker, qmf_exchange, qmf_queue, binding_key, binding_args) - self.assertNotEqual(b, None, "Creation of binding between exchange %s and queue %s with key %s failed" % - (qmf_exchange.name, qmf_queue.name, binding_key)) - return b - - def _find_delete_qmf_binding(self, qmf_broker, qmf_exchange, qmf_queue, binding_key, binding_args): - """ - Find and delete Qmf binding object if it exists - """ - b = self._find_qmf_binding(qmf_broker, qmf_exchange, qmf_queue, binding_key, binding_args) - if b is not None: - if len(qmf_exchange.name) > 0: # not default exchange - self._check_qmf_return(qmf_broker.delete(type="binding", name="%s/%s/%s" % (qmf_exchange.name, qmf_queue.name, binding_key), options={})) - - #--- Find/create a link - - def _find_qmf_link(self, qmf_from_broker_proxy, host, port): - """ - Find a Qmf link object - """ - for l in self.qmf.getObjects(_class="link", _broker=qmf_from_broker_proxy): - if l.host == host and l.port == port: - return l - return None - - def _find_create_qmf_link(self, qmf_from_broker, qmf_to_broker_proxy, link_durable_flag, auth_mechanism, user_id, - password, transport, pause_interval, link_ready_timeout): - """ - Find a Qmf link object if it exists, create it and return its Qmf link object if not - """ - to_broker_host = qmf_to_broker_proxy.host - to_broker_port = qmf_to_broker_proxy.port - l = self._find_qmf_link(qmf_from_broker.getBroker(), to_broker_host, to_broker_port) - if l is not None: return l - # Does not exist, so create it - self._check_qmf_return(qmf_from_broker.connect(to_broker_host, to_broker_port, link_durable_flag, auth_mechanism, user_id, password, transport)) - l = self._find_qmf_link(qmf_from_broker.getBroker(), to_broker_host, to_broker_port) - self.assertNotEqual(l, None, "Creation of link from broker %s to broker %s failed" % - (qmf_from_broker.getBroker().getUrl(), qmf_to_broker_proxy.getUrl())) - self._wait_for_link(l, pause_interval, link_ready_timeout) - return l - - def _wait_for_link(self, link, pause_interval, link_ready_timeout): - """ - Wait for link to become active (state=Operational) - """ - tot_time = 0 - link.update() - while link.state != "Operational" and tot_time < link_ready_timeout: - sleep(pause_interval) - tot_time += pause_interval - link.update() - self.assertEqual(link.state, "Operational", "Timeout: Link not operational, state=%s" % link.state) - - #--- Find/create a bridge - - def _find_qmf_bridge(self, qmf_broker_proxy, qmf_link, source, destination, key): - """ - Find a Qmf link object - """ - for b in self.qmf.getObjects(_class="bridge", _broker=qmf_broker_proxy): - if b.linkRef == qmf_link.getObjectId() and b.src == source and b.dest == destination and b.key == key: - return b - return None - - def _find_create_qmf_bridge(self, qmf_broker_proxy, qmf_link, queue_name, exch_name, topic_key, - queue_route_type_flag, bridge_durable_flag): - """ - Find a Qmf bridge object if it exists, create it and return its Qmf object if not - """ - if queue_route_type_flag: - src = queue_name - dest = exch_name - key = "" - else: - src = exch_name - dest = exch_name - if len(topic_key) > 0: - key = topic_key - else: - key = queue_name - b = self._find_qmf_bridge(qmf_broker_proxy, qmf_link, src, dest, key) - if b is not None: - return b - # Does not exist, so create it - self._check_qmf_return(qmf_link.bridge(bridge_durable_flag, src, dest, key, "", "", queue_route_type_flag, False, False, 1, 0)) - b = self._find_qmf_bridge(qmf_broker_proxy, qmf_link, src, dest, key) - self.assertNotEqual(b, None, "Bridge creation failed: src=%s dest=%s key=%s" % (src, dest, key)) - return b - - def _wait_for_bridge(self, bridge, src_broker, dest_broker, exch_name, queue_name, topic_key, pause_interval, - bridge_ready_timeout): - """ - Wait for bridge to become active by sending messages over the bridge at 1 sec intervals until they are - observed at the destination. - """ - tot_time = 0 - active = False - send_session = src_broker.session("tx") - sender = send_session.sender(self._get_send_address(exch_name, queue_name)) - src_receive_session = src_broker.session("src_rx") - src_receiver = src_receive_session.receiver(queue_name) - dest_receive_session = dest_broker.session("dest_rx") - dest_receiver = dest_receive_session.receiver(queue_name) - while not active and tot_time < bridge_ready_timeout: - sender.send(Message("xyz123", subject = self._get_msg_subject(topic_key))) - try: - src_receiver.fetch(timeout = 0) - src_receive_session.acknowledge() - # Keep receiving msgs, as several may have accumulated - while True: - dest_receiver.fetch(timeout = 0) - dest_receive_session.acknowledge() - sleep(1) - active = True - except Empty: - sleep(pause_interval) - tot_time += pause_interval - dest_receiver.close() - dest_receive_session.close() - src_receiver.close() - src_receive_session.close() - sender.close() - send_session.close() - self.assertTrue(active, "Bridge failed to become active after %ds: %s" % (bridge_ready_timeout, bridge)) - - #--- Find/create/delete utility functions - - def _create_and_bind(self, qmf_broker, exchange_args, queue_args, binding_args): - """ - Create a binding between a named exchange and queue on a broker - """ - e = self._find_create_qmf_exchange(qmf_broker, **exchange_args) - q = self._find_create_qmf_queue(qmf_broker, **queue_args) - return self._find_create_qmf_binding(qmf_broker, e, q, **binding_args) - - def _check_alt_exchange(self, qmf_broker, alt_exch_name, alt_exch_type, alt_exch_op): - """ - Check for existence of alternate exchange. Return the Qmf exchange proxy object for the alternate exchange - """ - if len(alt_exch_name) == 0: return None - if alt_exch_op == _alt_exch_ops.create: - return self._find_create_qmf_exchange(qmf_broker=qmf_broker, name=alt_exch_name, type=alt_exch_type, - alternate="", durable=False, auto_delete=False, args={}) - if alt_exch_op == _alt_exch_ops.delete: - return self._find_delete_qmf_exchange(qmf_broker=qmf_broker, name=alt_exch_name, type=alt_exch_type, - alternate="", durable=False, auto_delete=False) - return self._find_qmf_exchange(qmf_broker=qmf_broker, name=alt_exchange_name, type=alt_exchange_type, - alternate="", durable=False, auto_delete=False) - - def _delete_queue_binding(self, qmf_broker, exchange_args, queue_args, binding_args): - """ - Delete a queue and the binding between it and the exchange - """ - e = self._find_qmf_exchange(qmf_broker, exchange_args["name"], exchange_args["type"], exchange_args["alternate"], exchange_args["durable"], exchange_args["auto_delete"]) - q = self._find_qmf_queue(qmf_broker, queue_args["name"], queue_args["alternate_exchange"], queue_args["durable"], queue_args["exclusive"], queue_args["auto_delete"]) - self._find_delete_qmf_binding(qmf_broker, e, q, **binding_args) - self._find_delete_qmf_queue(qmf_broker, **queue_args) - - def _create_route(self, queue_route_type_flag, src_broker, dest_broker, exch_name, queue_name, topic_key, - link_durable_flag, bridge_durable_flag, auth_mechanism, user_id, password, transport, - pause_interval = 1, link_ready_timeout = 20, bridge_ready_timeout = 20): - """ - Create a route from a source broker to a destination broker - """ - l = self._find_create_qmf_link(dest_broker.qmf_broker, src_broker.qmf_broker.getBroker(), link_durable_flag, - auth_mechanism, user_id, password, transport, pause_interval, link_ready_timeout) - self._links.append(l) - b = self._find_create_qmf_bridge(dest_broker.qmf_broker.getBroker(), l, queue_name, exch_name, topic_key, - queue_route_type_flag, bridge_durable_flag) - self._bridges.append(b) - self._wait_for_bridge(b, src_broker, dest_broker, exch_name, queue_name, topic_key, pause_interval, bridge_ready_timeout) - - # Parameterized test - entry point for tests - - def _do_test(self, - test_name, # Name of test - exch_name = "amq.direct", # Remote exchange name - exch_type = "direct", # Remote exchange type - exch_alt_exch = "", # Remote exchange alternate exchange - exch_alt_exch_type = "direct", # Remote exchange alternate exchange type - exch_durable_flag = False, # Remote exchange durability - exch_auto_delete_flag = False, # Remote exchange auto-delete property - exch_x_args = {}, # Remote exchange args - queue_alt_exch = "", # Remote queue alternate exchange - queue_alt_exch_type = "direct", # Remote queue alternate exchange type - queue_durable_flag = False, # Remote queue durability - queue_exclusive_flag = False, # Remote queue exclusive property - queue_auto_delete_flag = False, # Remote queue auto-delete property - queue_x_args = {}, # Remote queue args - binding_durable_flag = False, # Remote binding durability - binding_x_args = {}, # Remote binding args - topic_key = "", # Binding key For remote topic exchanges only - msg_count = 10, # Number of messages to send - msg_durable_flag = False, # Message durability - link_durable_flag = False, # Route link durability - bridge_durable_flag = False, # Route bridge durability - queue_route_type_flag = False, # Route type: false = bridge route, true = queue route - enq_txn_size = 0, # Enqueue transaction size, 0 = no transactions - deq_txn_size = 0, # Dequeue transaction size, 0 = no transactions - alt_exch_op = _alt_exch_ops.create,# Op on alt exch [create (ensure present), delete (ensure not present), none (neither create nor delete)] - auth_mechanism = "", # Authorization mechanism for linked broker - user_id = "", # User ID for authorization on linked broker - password = "", # Password for authorization on linked broker - transport = "tcp" # Transport for route to linked broker - ): - """ - Parameterized federation test. Sets up a federated link between a source broker and a destination broker and - checks that messages correctly pass over the link to the destination. Where appropriate (non-queue-routes), also - checks for the presence of messages on the source broker. - - In these tests, the concept is to create a LOCAL broker, then create a link to a REMOTE broker using federation. - In other words, the messages sent to the LOCAL broker will be replicated on the REMOTE broker, and tests are - performed on the REMOTE broker to check that the required messages are present. In the case of regular routes, - the LOCAL broker will also retain the messages, and a similar test is performed on this broker. - - TODO: There are several items to improve here: - 1. _do_test() is rather general. Rather create a version for each exchange type and test the exchange/queue - interaction in more detail based on the exchange type - 2. Add a headers and an xml exchange type - 3. Restructure the tests to start and stop brokers directly rather than relying on previously - started brokers. Then persistence can be checked by stopping and restarting the brokers. In particular, - test the persistence of links and bridges, both of which take a persistence flag. - 4. Test the behavior of the alternate exchanges when messages are sourced through a link. Also check behavior - when the alternate exchange is not present or is deleted after the reference is made. - 5. Test special queue types (eg LVQ) - """ - local_broker = self._get_broker("local-port") - remote_broker = self._get_broker("remote-port") - - # Check alternate exchanges exist (and create them if not) on both local and remote brokers - self._check_alt_exchange(local_broker.qmf_broker, exch_alt_exch, exch_alt_exch_type, alt_exch_op) - self._check_alt_exchange(local_broker.qmf_broker, queue_alt_exch, queue_alt_exch_type, alt_exch_op) - self._check_alt_exchange(remote_broker.qmf_broker, exch_alt_exch, exch_alt_exch_type, alt_exch_op) - self._check_alt_exchange(remote_broker.qmf_broker, queue_alt_exch, queue_alt_exch_type, alt_exch_op) - - queue_name = "queue_%s" % test_name - exchange_args = {"name": exch_name, "type": exch_type, "alternate": exch_alt_exch, - "durable": exch_durable_flag, "auto_delete": exch_auto_delete_flag, "args": exch_x_args} - queue_args = {"name": queue_name, "alternate_exchange": queue_alt_exch, "durable": queue_durable_flag, - "exclusive": queue_exclusive_flag, "auto_delete": queue_auto_delete_flag, "args": queue_x_args} - binding_args = {"binding_args": binding_x_args} - if exch_type == "topic": - self.assertTrue(len(topic_key) > 0, "Topic exchange selected, but no topic key was set.") - binding_args["binding_key"] = topic_key - elif exch_type == "direct": - binding_args["binding_key"] = queue_name - else: - binding_args["binding_key"] = "" - self._create_and_bind(qmf_broker=local_broker.qmf_broker, exchange_args=exchange_args, queue_args=queue_args, binding_args=binding_args) - self._create_and_bind(qmf_broker=remote_broker.qmf_broker, exchange_args=exchange_args, queue_args=queue_args, binding_args=binding_args) - self._create_route(queue_route_type_flag, local_broker, remote_broker, exch_name, queue_name, topic_key, - link_durable_flag, bridge_durable_flag, auth_mechanism, user_id, password, transport) - - self._send_msgs("send_session", local_broker, addr = self._get_send_address(exch_name, queue_name), - msg_count = msg_count, topic_key = topic_key, msg_durable_flag = msg_durable_flag, enq_txn_size = enq_txn_size) - if not queue_route_type_flag: - self._receive_msgs("local_receive_session", local_broker, addr = queue_name, msg_count = msg_count, deq_txn_size = deq_txn_size) - self._receive_msgs("remote_receive_session", remote_broker, addr = queue_name, msg_count = msg_count, deq_txn_size = deq_txn_size, timeout = 5) - - # Clean up - self._delete_queue_binding(qmf_broker=local_broker.qmf_broker, exchange_args=exchange_args, queue_args=queue_args, binding_args=binding_args) - self._delete_queue_binding(qmf_broker=remote_broker.qmf_broker, exchange_args=exchange_args, queue_args=queue_args, binding_args=binding_args) - -class A_ShortTests(QmfTestBase010): - - def test_route_defaultExch(self): - self._do_test(self._get_name()) - - def test_queueRoute_defaultExch(self): - self._do_test(self._get_name(), queue_route_type_flag=True) - - -class A_LongTests(QmfTestBase010): - - def test_route_amqDirectExch(self): - self._do_test(self._get_name(), exch_name="amq.direct") - - def test_queueRoute_amqDirectExch(self): - self._do_test(self._get_name(), exch_name="amq.direct", queue_route_type_flag=True) - - - def test_route_directExch(self): - self._do_test(self._get_name(), exch_name="testDirectExchange") - - def test_queueRoute_directExch(self): - self._do_test(self._get_name(), exch_name="testDirectExchange", queue_route_type_flag=True) - - - def test_route_fanoutExch(self): - self._do_test(self._get_name(), exch_name="testFanoutExchange", exch_type="fanout") - - def test_queueRoute_fanoutExch(self): - self._do_test(self._get_name(), exch_name="testFanoutExchange", exch_type="fanout", queue_route_type_flag=True) - - - def test_route_topicExch(self): - self._do_test(self._get_name(), exch_name="testTopicExchange", exch_type="topic", topic_key=self._get_name()+".#") - - def test_queueRoute_topicExch(self): - self._do_test(self._get_name(), exch_name="testTopicExchange", exch_type="topic", topic_key=self._get_name()+".#", queue_route_type_flag=True) - - -class B_ShortTransactionTests(QmfTestBase010): - - def test_txEnq01_route_defaultExch(self): - self._do_test(self._get_name(), enq_txn_size=1) - - def test_txEnq01_queueRoute_defaultExch(self): - self._do_test(self._get_name(), queue_route_type_flag=True, enq_txn_size=1) - - def test_txEnq01_txDeq01_route_defaultExch(self): - self._do_test(self._get_name(), enq_txn_size=1, deq_txn_size=1) - - def test_txEnq01_txDeq01_queueRoute_defaultExch(self): - self._do_test(self._get_name(), queue_route_type_flag=True, enq_txn_size=1, deq_txn_size=1) - - -class B_LongTransactionTests(QmfTestBase010): - - def test_txEnq10_route_defaultExch(self): - self._do_test(self._get_name(), enq_txn_size=10, msg_count = 103) - - def test_txEnq10_queueRoute_defaultExch(self): - self._do_test(self._get_name(), queue_route_type_flag=True, enq_txn_size=10, msg_count = 103) - - - - - def test_txEnq01_route_directExch(self): - self._do_test(self._get_name(), exch_name="testDirectExchange", enq_txn_size=1) - - def test_txEnq01_queueRoute_directExch(self): - self._do_test(self._get_name(), exch_name="testDirectExchange", queue_route_type_flag=True, enq_txn_size=1) - - def test_txEnq10_route_directExch(self): - self._do_test(self._get_name(), exch_name="testDirectExchange", enq_txn_size=10, msg_count = 103) - - def test_txEnq10_queueRoute_directExch(self): - self._do_test(self._get_name(), exch_name="testDirectExchange", queue_route_type_flag=True, enq_txn_size=10, msg_count = 103) - - def test_txEnq01_txDeq01_route_directExch(self): - self._do_test(self._get_name(), exch_name="testDirectExchange", enq_txn_size=1, deq_txn_size=1) - - def test_txEnq01_txDeq01_queueRoute_directExch(self): - self._do_test(self._get_name(), exch_name="testDirectExchange", queue_route_type_flag=True, enq_txn_size=1, deq_txn_size=1) - - - def test_txEnq01_route_fanoutExch(self): - self._do_test(self._get_name(), exch_name="testFanoutExchange", exch_type="fanout", enq_txn_size=1) - - def test_txEnq01_queueRoute_fanoutExch(self): - self._do_test(self._get_name(), exch_name="testFanoutExchange", exch_type="fanout", queue_route_type_flag=True, enq_txn_size=1) - - def test_txEnq10_route_fanoutExch(self): - self._do_test(self._get_name(), exch_name="testFanoutExchange", exch_type="fanout", enq_txn_size=10, msg_count = 103) - - def test_txEnq10_queueRoute_fanoutExch(self): - self._do_test(self._get_name(), exch_name="testFanoutExchange", exch_type="fanout", queue_route_type_flag=True, enq_txn_size=10, msg_count = 103) - - def test_txEnq01_txDeq01_route_fanoutExch(self): - self._do_test(self._get_name(), exch_name="testFanoutExchange", exch_type="fanout", enq_txn_size=1, deq_txn_size=1) - - def test_txEnq01_txDeq01_queueRoute_fanoutExch(self): - self._do_test(self._get_name(), exch_name="testFanoutExchange", exch_type="fanout", queue_route_type_flag=True, enq_txn_size=1, deq_txn_size=1) - - - def test_txEnq01_route_topicExch(self): - self._do_test(self._get_name(), exch_name="testTopicExchange", exch_type="topic", topic_key=self._get_name()+".#", enq_txn_size=1) - - def test_txEnq01_queueRoute_topicExch(self): - self._do_test(self._get_name(), exch_name="testTopicExchange", exch_type="topic", topic_key=self._get_name()+".#", queue_route_type_flag=True, enq_txn_size=1) - - def test_txEnq10_route_topicExch(self): - self._do_test(self._get_name(), exch_name="testTopicExchange", exch_type="topic", topic_key=self._get_name()+".#", enq_txn_size=10, msg_count = 103) - - def test_txEnq10_queueRoute_topicExch(self): - self._do_test(self._get_name(), exch_name="testTopicExchange", exch_type="topic", topic_key=self._get_name()+".#", queue_route_type_flag=True, enq_txn_size=10, msg_count = 103) - - def test_txEnq01_txDeq01_route_topicExch(self): - self._do_test(self._get_name(), exch_name="testTopicExchange", exch_type="topic", topic_key=self._get_name()+".#", enq_txn_size=1, deq_txn_size=1) - - def test_txEnq01_txDeq01_queueRoute_topicExch(self): - self._do_test(self._get_name(), exch_name="testTopicExchange", exch_type="topic", topic_key=self._get_name()+".#", queue_route_type_flag=True, enq_txn_size=1, deq_txn_size=1) - - -class E_ShortPersistenceTests(QmfTestBase010): - - def test_route_durQueue_defaultExch(self): - self._do_test(self._get_name(), queue_durable_flag=True) - - def test_route_durMsg_durQueue_defaultExch(self): - self._do_test(self._get_name(), msg_durable_flag=True, queue_durable_flag=True) - - def test_queueRoute_durQueue_defaultExch(self): - self._do_test(self._get_name(), queue_durable_flag=True, queue_route_type_flag=True) - - def test_queueRoute_durMsg_durQueue_defaultExch(self): - self._do_test(self._get_name(), msg_durable_flag=True, queue_durable_flag=True, queue_route_type_flag=True) - - -class E_LongPersistenceTests(QmfTestBase010): - - - def test_route_durQueue_directExch(self): - self._do_test(self._get_name(), exch_name="testDirectExchange", queue_durable_flag=True) - - def test_route_durMsg_durQueue_directExch(self): - self._do_test(self._get_name(), exch_name="testDirectExchange", msg_durable_flag=True, queue_durable_flag=True) - - def test_queueRoute_durQueue_directExch(self): - self._do_test(self._get_name(), exch_name="testDirectExchange", queue_durable_flag=True, queue_route_type_flag=True) - - def test_queueRoute_durMsg_durQueue_directExch(self): - self._do_test(self._get_name(), exch_name="testDirectExchange", msg_durable_flag=True, queue_durable_flag=True, queue_route_type_flag=True) - - - def test_route_durQueue_fanoutExch(self): - self._do_test(self._get_name(), exch_name="testFanoutExchange", exch_type="fanout", queue_durable_flag=True) - - def test_route_durMsg_durQueue_fanoutExch(self): - self._do_test(self._get_name(), exch_name="testFanoutExchange", exch_type="fanout", msg_durable_flag=True, queue_durable_flag=True) - - def test_queueRoute_durQueue_fanoutExch(self): - self._do_test(self._get_name(), exch_name="testFanoutExchange", exch_type="fanout", queue_durable_flag=True, queue_route_type_flag=True) - - def test_queueRoute_durMsg_durQueue_fanoutExch(self): - self._do_test(self._get_name(), exch_name="testFanoutExchange", exch_type="fanout", msg_durable_flag=True, queue_durable_flag=True, queue_route_type_flag=True) - - - def test_route_durQueue_topicExch(self): - self._do_test(self._get_name(), exch_name="testTopicExchange", exch_type="topic", topic_key=self._get_name()+".#", queue_durable_flag=True) - - def test_route_durMsg_durQueue_topicExch(self): - self._do_test(self._get_name(), exch_name="testTopicExchange", exch_type="topic", topic_key=self._get_name()+".#", msg_durable_flag=True, queue_durable_flag=True) - - def test_queueRoute_durQueue_topicExch(self): - self._do_test(self._get_name(), exch_name="testTopicExchange", exch_type="topic", topic_key=self._get_name()+".#", queue_durable_flag=True, queue_route_type_flag=True) - - def test_queueRoute_durMsg_durQueue_topicExch(self): - self._do_test(self._get_name(), exch_name="testTopicExchange", exch_type="topic", topic_key=self._get_name()+".#", msg_durable_flag=True, queue_durable_flag=True, queue_route_type_flag=True) - - -class F_ShortPersistenceTransactionTests(QmfTestBase010): - - def test_txEnq01_route_durQueue_defaultExch(self): - self._do_test(self._get_name(), queue_durable_flag=True, enq_txn_size=1) - - def test_txEnq01_route_durMsg_durQueue_defaultExch(self): - self._do_test(self._get_name(), msg_durable_flag=True, queue_durable_flag=True, enq_txn_size=1) - - def test_txEnq01_queueRoute_durQueue_defaultExch(self): - self._do_test(self._get_name(), queue_durable_flag=True, queue_route_type_flag=True, enq_txn_size=1) - - def test_txEnq01_queueRoute_durMsg_durQueue_defaultExch(self): - self._do_test(self._get_name(), msg_durable_flag=True, queue_durable_flag=True, queue_route_type_flag=True, enq_txn_size=1) - - def test_txEnq01_txDeq01_route_durQueue_defaultExch(self): - self._do_test(self._get_name(), queue_durable_flag=True, enq_txn_size=1, deq_txn_size=1) - - def test_txEnq01_txDeq01_route_durMsg_durQueue_defaultExch(self): - self._do_test(self._get_name(), msg_durable_flag=True, queue_durable_flag=True, enq_txn_size=1, deq_txn_size=1) - - def test_txEnq01_txDeq01_queueRoute_durQueue_defaultExch(self): - self._do_test(self._get_name(), queue_durable_flag=True, queue_route_type_flag=True, enq_txn_size=1, deq_txn_size=1) - - def test_txEnq01_txDeq01_queueRoute_durMsg_durQueue_defaultExch(self): - self._do_test(self._get_name(), msg_durable_flag=True, queue_durable_flag=True, queue_route_type_flag=True, enq_txn_size=1, deq_txn_size=1) - - -class F_LongPersistenceTransactionTests(QmfTestBase010): - - def test_txEnq10_route_durQueue_defaultExch(self): - self._do_test(self._get_name(), queue_durable_flag=True, enq_txn_size=10, msg_count = 103) - - def test_txEnq10_route_durMsg_durQueue_defaultExch(self): - self._do_test(self._get_name(), msg_durable_flag=True, queue_durable_flag=True, enq_txn_size=10, msg_count = 103) - - def test_txEnq10_queueRoute_durQueue_defaultExch(self): - self._do_test(self._get_name(), queue_durable_flag=True, queue_route_type_flag=True, enq_txn_size=10, msg_count = 103) - - def test_txEnq10_queueRoute_durMsg_durQueue_defaultExch(self): - self._do_test(self._get_name(), msg_durable_flag=True, queue_durable_flag=True, queue_route_type_flag=True, enq_txn_size=10, msg_count = 103) - - - - - def test_txEnq01_route_durQueue_directExch(self): - self._do_test(self._get_name(), exch_name="testDirectExchange", queue_durable_flag=True, enq_txn_size=1) - - def test_txEnq01_route_durMsg_durQueue_directExch(self): - self._do_test(self._get_name(), exch_name="testDirectExchange", msg_durable_flag=True, queue_durable_flag=True, enq_txn_size=1) - - def test_txEnq01_queueRoute_durQueue_directExch(self): - self._do_test(self._get_name(), exch_name="testDirectExchange", queue_durable_flag=True, queue_route_type_flag=True, enq_txn_size=1) - - def test_txEnq01_queueRoute_durMsg_durQueue_directExch(self): - self._do_test(self._get_name(), exch_name="testDirectExchange", msg_durable_flag=True, queue_durable_flag=True, queue_route_type_flag=True, enq_txn_size=1) - - def test_txEnq10_route_durQueue_directExch(self): - self._do_test(self._get_name(), exch_name="testDirectExchange", queue_durable_flag=True, enq_txn_size=10, msg_count = 103) - - def test_txEnq10_route_durMsg_durQueue_directExch(self): - self._do_test(self._get_name(), exch_name="testDirectExchange", msg_durable_flag=True, queue_durable_flag=True, enq_txn_size=10, msg_count = 103) - - def test_txEnq10_queueRoute_durQueue_directExch(self): - self._do_test(self._get_name(), exch_name="testDirectExchange", queue_durable_flag=True, queue_route_type_flag=True, enq_txn_size=10, msg_count = 103) - - def test_txEnq10_queueRoute_durMsg_durQueue_directExch(self): - self._do_test(self._get_name(), exch_name="testDirectExchange", msg_durable_flag=True, queue_durable_flag=True, queue_route_type_flag=True, enq_txn_size=10, msg_count = 103) - - def test_txEnq01_txDeq01_route_durQueue_directExch(self): - self._do_test(self._get_name(), exch_name="testDirectExchange", queue_durable_flag=True, enq_txn_size=1, deq_txn_size=1) - - def test_txEnq01_txDeq01_route_durMsg_durQueue_directExch(self): - self._do_test(self._get_name(), exch_name="testDirectExchange", msg_durable_flag=True, queue_durable_flag=True, enq_txn_size=1, deq_txn_size=1) - - def test_txEnq01_txDeq01_queueRoute_durQueue_directExch(self): - self._do_test(self._get_name(), exch_name="testDirectExchange", queue_durable_flag=True, queue_route_type_flag=True, enq_txn_size=1, deq_txn_size=1) - - def test_txEnq01_txDeq01_queueRoute_durMsg_durQueue_directExch(self): - self._do_test(self._get_name(), exch_name="testDirectExchange", msg_durable_flag=True, queue_durable_flag=True, queue_route_type_flag=True, enq_txn_size=1, deq_txn_size=1) - - - def test_txEnq01_route_durQueue_fanoutExch(self): - self._do_test(self._get_name(), exch_name="testFanoutExchange", exch_type="fanout", queue_durable_flag=True, enq_txn_size=1) - - def test_txEnq01_route_durMsg_durQueue_fanoutExch(self): - self._do_test(self._get_name(), exch_name="testFanoutExchange", exch_type="fanout", msg_durable_flag=True, queue_durable_flag=True, enq_txn_size=1) - - def test_txEnq01_queueRoute_durQueue_fanoutExch(self): - self._do_test(self._get_name(), exch_name="testFanoutExchange", exch_type="fanout", queue_durable_flag=True, queue_route_type_flag=True, enq_txn_size=1) - - def test_txEnq01_queueRoute_durMsg_durQueue_fanoutExch(self): - self._do_test(self._get_name(), exch_name="testFanoutExchange", exch_type="fanout", msg_durable_flag=True, queue_durable_flag=True, queue_route_type_flag=True, enq_txn_size=1) - - def test_txEnq10_route_durQueue_fanoutExch(self): - self._do_test(self._get_name(), exch_name="testFanoutExchange", exch_type="fanout", queue_durable_flag=True, enq_txn_size=10, msg_count = 103) - - def test_txEnq10_route_durMsg_durQueue_fanoutExch(self): - self._do_test(self._get_name(), exch_name="testFanoutExchange", exch_type="fanout", msg_durable_flag=True, queue_durable_flag=True, enq_txn_size=10, msg_count = 103) - - def test_txEnq10_queueRoute_durQueue_fanoutExch(self): - self._do_test(self._get_name(), exch_name="testFanoutExchange", exch_type="fanout", queue_durable_flag=True, queue_route_type_flag=True, enq_txn_size=10, msg_count = 103) - - def test_txEnq10_queueRoute_durMsg_durQueue_fanoutExch(self): - self._do_test(self._get_name(), exch_name="testFanoutExchange", exch_type="fanout", msg_durable_flag=True, queue_durable_flag=True, queue_route_type_flag=True, enq_txn_size=10, msg_count = 103) - - def test_txEnq01_txDeq01_route_durQueue_fanoutExch(self): - self._do_test(self._get_name(), exch_name="testFanoutExchange", exch_type="fanout", queue_durable_flag=True, enq_txn_size=1, deq_txn_size=1) - - def test_txEnq01_txDeq01_route_durMsg_durQueue_fanoutExch(self): - self._do_test(self._get_name(), exch_name="testFanoutExchange", exch_type="fanout", msg_durable_flag=True, queue_durable_flag=True, enq_txn_size=1, deq_txn_size=1) - - def test_txEnq01_txDeq01_queueRoute_durQueue_fanoutExch(self): - self._do_test(self._get_name(), exch_name="testFanoutExchange", exch_type="fanout", queue_durable_flag=True, queue_route_type_flag=True, enq_txn_size=1, deq_txn_size=1) - - def test_txEnq01_txDeq01_queueRoute_durMsg_durQueue_fanoutExch(self): - self._do_test(self._get_name(), exch_name="testFanoutExchange", exch_type="fanout", msg_durable_flag=True, queue_durable_flag=True, queue_route_type_flag=True, enq_txn_size=1, deq_txn_size=1) - - - def test_txEnq01_route_durQueue_topicExch(self): - self._do_test(self._get_name(), exch_name="testTopicExchange", exch_type="topic", topic_key=self._get_name()+".#", queue_durable_flag=True, enq_txn_size=1) - - def test_txEnq01_route_durMsg_durQueue_topicExch(self): - self._do_test(self._get_name(), exch_name="testTopicExchange", exch_type="topic", topic_key=self._get_name()+".#", msg_durable_flag=True, queue_durable_flag=True, enq_txn_size=1) - - def test_txEnq01_queueRoute_durQueue_topicExch(self): - self._do_test(self._get_name(), exch_name="testTopicExchange", exch_type="topic", topic_key=self._get_name()+".#", queue_durable_flag=True, queue_route_type_flag=True, enq_txn_size=1) - - def test_txEnq01_queueRoute_durMsg_durQueue_topicExch(self): - self._do_test(self._get_name(), exch_name="testTopicExchange", exch_type="topic", topic_key=self._get_name()+".#", msg_durable_flag=True, queue_durable_flag=True, queue_route_type_flag=True, enq_txn_size=1) - - def test_txEnq10_route_durQueue_topicExch(self): - self._do_test(self._get_name(), exch_name="testTopicExchange", exch_type="topic", topic_key=self._get_name()+".#", queue_durable_flag=True, enq_txn_size=10, msg_count = 103) - - def test_txEnq10_route_durMsg_durQueue_topicExch(self): - self._do_test(self._get_name(), exch_name="testTopicExchange", exch_type="topic", topic_key=self._get_name()+".#", msg_durable_flag=True, queue_durable_flag=True, enq_txn_size=10, msg_count = 103) - - def test_txEnq10_queueRoute_durQueue_topicExch(self): - self._do_test(self._get_name(), exch_name="testTopicExchange", exch_type="topic", topic_key=self._get_name()+".#", queue_durable_flag=True, queue_route_type_flag=True, enq_txn_size=10, msg_count = 103) - - def test_txEnq10_queueRoute_durMsg_durQueue_topicExch(self): - self._do_test(self._get_name(), exch_name="testTopicExchange", exch_type="topic", topic_key=self._get_name()+".#", msg_durable_flag=True, queue_durable_flag=True, queue_route_type_flag=True, enq_txn_size=10, msg_count = 103) - - def test_txEnq01_txDeq01_route_durQueue_topicExch(self): - self._do_test(self._get_name(), exch_name="testTopicExchange", exch_type="topic", topic_key=self._get_name()+".#", queue_durable_flag=True, enq_txn_size=1, deq_txn_size=1) - - def test_txEnq01_txDeq01_route_durMsg_durQueue_topicExch(self): - self._do_test(self._get_name(), exch_name="testTopicExchange", exch_type="topic", topic_key=self._get_name()+".#", msg_durable_flag=True, queue_durable_flag=True, enq_txn_size=1, deq_txn_size=1) - - def test_txEnq01_txDeq01_queueRoute_durQueue_topicExch(self): - self._do_test(self._get_name(), exch_name="testTopicExchange", exch_type="topic", topic_key=self._get_name()+".#", queue_durable_flag=True, queue_route_type_flag=True, enq_txn_size=1, deq_txn_size=1) - - def test_txEnq01_txDeq01_queueRoute_durMsg_durQueue_topicExch(self): - self._do_test(self._get_name(), exch_name="testTopicExchange", exch_type="topic", topic_key=self._get_name()+".#", msg_durable_flag=True, queue_durable_flag=True, queue_route_type_flag=True, enq_txn_size=1, deq_txn_size=1) - - diff --git a/qpid/cpp/src/tests/find_prog.ps1 b/qpid/cpp/src/tests/find_prog.ps1 deleted file mode 100644 index 5c482debbf..0000000000 --- a/qpid/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/qpid/cpp/src/tests/ha_test.py b/qpid/cpp/src/tests/ha_test.py deleted file mode 100755 index 3659185140..0000000000 --- a/qpid/cpp/src/tests/ha_test.py +++ /dev/null @@ -1,401 +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, random, logging, shutil, math, unittest, random -import traceback -from brokertest import * -from threading import Thread, Lock, Condition -from logging import getLogger, WARN, ERROR, DEBUG, INFO -from qpidtoollibs import BrokerAgent -from qpid.harness import Skipped - -log = getLogger(__name__) - -class LogLevel: - """ - Temporarily change the log settings on the root logger. - Used to suppress expected WARN messages from the python client. - """ - def __init__(self, level): - self.save_level = getLogger().getEffectiveLevel() - getLogger().setLevel(level) - - def restore(self): - getLogger().setLevel(self.save_level) - -class QmfAgent(object): - """Access to a QMF broker agent.""" - def __init__(self, address, **kwargs): - self._connection = qm.Connection.establish( - address, client_properties={"qpid.ha-admin":1}, **kwargs) - self._agent = BrokerAgent(self._connection) - - def queues(self): - return [q.values['name'] for q in self._agent.getAllQueues()] - - def repsub_queue(self, sub): - """If QMF subscription sub is a replicating subscription return - the name of the replicated queue, else return None""" - session = self.getSession(sub.sessionRef) - if not session: return None - m = re.search("qpid.ha-q:(.*)\.", session.name) - return m and m.group(1) - - def repsub_queues(self): - """Return queue names for all replicating subscriptions""" - return filter(None, [self.repsub_queue(s) for s in self.getAllSubscriptions()]) - - def tx_queues(self): - """Return names of all tx-queues""" - return [q for q in self.queues() if q.startswith("qpid.ha-tx")] - - def __getattr__(self, name): - a = getattr(self._agent, name) - return a - -class Credentials(object): - """SASL credentials: username, password, and mechanism""" - def __init__(self, username, password, mechanism): - (self.username, self.password, self.mechanism) = (username, password, mechanism) - - def __str__(self): return "Credentials%s"%(self.tuple(),) - - def tuple(self): return (self.username, self.password, self.mechanism) - - def add_user(self, url): return "%s/%s@%s"%(self.username, self.password, url) - -class HaPort: - """Many HA tests need to allocate a broker port dynamically and then kill - and restart a broker on that same port multiple times. qpidd --port=0 only - ensures the port for the initial broker process, subsequent brokers re-using - the same port may fail with "address already in use". - - HaPort binds and listens to the port and returns a file descriptor to pass - to qpidd --socket-fd. It holds on to the port untill the end of the test so - the broker can restart multiple times. - """ - - def __init__(self, test, port=0): - """Bind and listen to port. port=0 allocates a port dynamically. - self.port is the allocated port, self.fileno is the file descriptor for - qpid --socket-fd.""" - - self.test = test - self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - self.socket.bind(("", port)) - self.socket.listen(5) - self.port = self.socket.getsockname()[1] - self.fileno = self.socket.fileno() - self.stopped = False - test.teardown_add(self) # Stop during test.tearDown - - def teardown(self): # Called in tearDown - if not self.stopped: - self.stopped = True - self.socket.shutdown(socket.SHUT_RDWR) - self.socket.close() - - def __str__(self): return "HaPort<port:%s, fileno:%s>"%(self.port, self.fileno) - - -class HaBroker(Broker): - """Start a broker with HA enabled - @param client_cred: (user, password, mechanism) for admin clients started by the HaBroker. - """ - - heartbeat=5 - - def __init__(self, test, ha_port=None, args=[], brokers_url=None, ha_cluster=True, - ha_replicate="all", client_credentials=None, **kwargs): - assert BrokerTest.ha_lib, "Cannot locate HA plug-in" - ha_port = ha_port or HaPort(test) - args = copy(args) - args += ["--load-module", BrokerTest.ha_lib, - # Non-standard settings for faster tests. - "--link-maintenance-interval=0.1", - "--ha-cluster=%s"%ha_cluster] - # Add default --log-enable arguments unless args already has --log arguments. - if not env_has_log_config() and not [l for l in args if l.startswith("--log")]: - args += ["--log-enable=info+", "--log-enable=debug+:ha::"] - if not [h for h in args if h.startswith("--link-heartbeat-interval")]: - args += ["--link-heartbeat-interval=%s"%(HaBroker.heartbeat)] - - if ha_replicate is not None: - args += [ "--ha-replicate=%s"%ha_replicate ] - if brokers_url: args += [ "--ha-brokers-url", brokers_url ] - # Set up default ACL - acl=os.path.join(os.getcwd(), "unrestricted.acl") - if not os.path.exists(acl): - aclf=file(acl,"w") - aclf.write(""" -acl allow all all - """) - aclf.close() - if not "--acl-file" in args: - args += [ "--acl-file", acl, ] - args += ["--socket-fd=%s"%ha_port.fileno, "--listen-disable=tcp"] - self._agent = None - self.client_credentials = client_credentials - self.ha_port = ha_port - Broker.__init__(self, test, args, port=ha_port.port, **kwargs) - - # Do some static setup to locate the qpid-config and qpid-ha tools. - @property - def qpid_ha_script(self): - if not hasattr(self, "_qpid_ha_script"): - qpid_ha_exec = os.path.join(os.getenv("SOURCE_DIR"), "management", - "python", "bin", "qpid-ha") - self._qpid_ha_script = import_script(qpid_ha_exec) - return self._qpid_ha_script - - def __repr__(self): return "<HaBroker:%s:%d>"%(self.log, self.port()) - - def qpid_ha(self, args): - if not self.qpid_ha_script: - raise Skipped("qpid-ha not available") - try: - cred = self.client_credentials - url = self.host_port() - if cred: - url =cred.add_user(url) - args = args + ["--sasl-mechanism", cred.mechanism] - self.qpid_ha_script.main_except(["", "-b", url]+args) - except Exception, e: - raise Exception("Error in qpid_ha -b %s %s: %s"%(url, args,e)) - - def promote(self): self.ready(); self.qpid_ha(["promote", "--cluster-manager"]) - def replicate(self, from_broker, queue): self.qpid_ha(["replicate", from_broker, queue]) - @property - def agent(self): - if not self._agent: - cred = self.client_credentials - if cred: - self._agent = QmfAgent(cred.add_user(self.host_port()), sasl_mechanisms=cred.mechanism) - else: - self._agent = QmfAgent(self.host_port()) - return self._agent - - def qmf(self): - hb = self.agent.getHaBroker() - hb.update() - return hb - - def ha_status(self): return self.qmf().status - - def wait_status(self, status, timeout=10): - - def try_get_status(): - self._status = "<unknown>" - try: - self._status = self.ha_status() - except qm.ConnectionError, e: - # Record the error but don't raise, the broker may not be up yet. - self._status = "%s: %s" % (type(e).__name__, e) - return self._status == status; - assert retry(try_get_status, timeout=timeout), "%s expected=%r, actual=%r"%( - self, status, self._status) - - def wait_queue(self, queue, timeout=10, msg="wait_queue"): - """ Wait for queue to be visible via QMF""" - agent = self.agent - assert retry(lambda: agent.getQueue(queue) is not None, timeout=timeout), \ - "%s queue %s not present" % (msg, queue) - - def wait_no_queue(self, queue, timeout=10, msg="wait_no_queue"): - """ Wait for queue to be invisible via QMF""" - agent = self.agent - assert retry(lambda: agent.getQueue(queue) is None, timeout=timeout), "%s: queue %s still present"%(msg,queue) - - def qpid_config(self, args): - assert subprocess.call( - ["qpid-config", "--broker", self.host_port()]+args, stdout=1, stderr=subprocess.STDOUT - ) == 0, "qpid-config failed" - - def config_replicate(self, from_broker, queue): - self.qpid_config(["add", "queue", "--start-replica", from_broker, queue]) - - def config_declare(self, queue, replication): - self.qpid_config(["add", "queue", queue, "--replicate", replication]) - - def connect_admin(self, **kwargs): - cred = self.client_credentials - if cred: - return Broker.connect( - self, client_properties={"qpid.ha-admin":1}, - username=cred.username, password=cred.password, sasl_mechanisms=cred.mechanism, - **kwargs) - else: - return Broker.connect(self, client_properties={"qpid.ha-admin":1}, **kwargs) - - def wait_address(self, address): - """Wait for address to become valid on the broker.""" - c = self.connect_admin() - try: wait_address(c, address) - finally: c.close() - - wait_backup = wait_address - - def browse(self, queue, timeout=0, transform=lambda m: m.content): - c = self.connect_admin() - try: - return browse(c.session(), queue, timeout, transform) - finally: c.close() - - def assert_browse_backup(self, queue, expected, **kwargs): - """Combines wait_backup and assert_browse_retry.""" - c = self.connect_admin() - try: - wait_address(c, queue) - if not "msg" in kwargs: - kwargs["msg"]=str(self) - assert_browse_retry(c.session(), queue, expected, **kwargs) - finally: c.close() - - assert_browse = assert_browse_backup - - def assert_connect_fail(self): - try: - self.connect() - self.test.fail("Expected qm.ConnectionError") - except qm.ConnectionError: pass - - def try_connect(self): - try: return self.connect() - except qm.ConnectionError: return None - - def ready(self, *args, **kwargs): - if not 'client_properties' in kwargs: kwargs['client_properties'] = {} - kwargs['client_properties']['qpid.ha-admin'] = True - return Broker.ready(self, *args, **kwargs) - - def kill(self, final=True): - if final: self.ha_port.teardown() - self._agent = None - return Broker.kill(self) - - -class HaCluster(object): - _cluster_count = 0 - - def __init__(self, test, n, promote=True, wait=True, args=[], s_args=[], **kwargs): - """Start a cluster of n brokers. - - @test: The test being run - @n: start n brokers - @promote: promote self[0] to primary - @wait: wait for primary active and backups ready. Ignored if promote=False - @args: args for all brokers in the cluster. - @s_args: args for specific brokers: s_args[i] for broker i. - """ - self.test = test - self.args = copy(args) - self.s_args = copy(s_args) - self.kwargs = kwargs - self._ports = [HaPort(test) for i in xrange(n)] - self._set_url() - self._brokers = [] - self.id = HaCluster._cluster_count - self.broker_id = 0 - HaCluster._cluster_count += 1 - for i in xrange(n): self.start() - if promote: - self[0].promote() - if wait: - self[0].wait_status("active") - for b in self[1:]: b.wait_status("ready") - - def next_name(self): - name="cluster%s-%s"%(self.id, self.broker_id) - self.broker_id += 1 - return name - - def _ha_broker(self, i, name): - args = self.args - if i < len(self.s_args): args += self.s_args[i] - ha_port = self._ports[i] - b = HaBroker(ha_port.test, ha_port, brokers_url=self.url, name=name, - args=args, **self.kwargs) - b.ready(timeout=10) - return b - - def start(self): - """Start a new broker in the cluster""" - i = len(self) - assert i <= len(self._ports) - if i == len(self._ports): # Adding new broker after cluster init - self._ports.append(HaPort(self.test)) - self._set_url() - b = self._ha_broker(i, self.next_name()) - self._brokers.append(b) - return b - - def _set_url(self): - self.url = ",".join("127.0.0.1:%s"%(p.port) for p in self._ports) - - def connect(self, i, **kwargs): - """Connect with reconnect_urls""" - c = self[i].connect(reconnect=True, reconnect_urls=self.url.split(","), **kwargs) - self.test.teardown_add(c) # Clean up - return c - - def kill(self, i, promote_next=True, final=True): - """Kill broker i, promote broker i+1""" - self[i].kill(final=final) - if promote_next: self[(i+1) % len(self)].promote() - - def restart(self, i): - """Start a broker with the same port, name and data directory. It will get - a separate log file: foo.n.log""" - if self._ports[i].stopped: raise Exception("Restart after final kill: %s"%(self)) - b = self._brokers[i] - self._brokers[i] = self._ha_broker(i, b.name) - self._brokers[i].ready() - - def bounce(self, i, promote_next=True): - """Stop and restart a broker in a cluster.""" - if (len(self) == 1): - self.kill(i, promote_next=False, final=False) - self.restart(i) - self[i].ready() - if promote_next: self[i].promote() - else: - self.kill(i, promote_next, final=False) - self.restart(i) - - # 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__() - - -def wait_address(connection, address): - """Wait for an address to become valid.""" - assert retry(lambda: valid_address(connection, address)), "Timed out waiting for address %s"%(address) - -def valid_address(connection, address): - """Test if an address is valid""" - try: - s = connection.session().receiver(address) - s.session.close() - return True - except qm.NotFound: - return False - - diff --git a/qpid/cpp/src/tests/ha_test_max_queues.cpp b/qpid/cpp/src/tests/ha_test_max_queues.cpp deleted file mode 100644 index fcce4c3151..0000000000 --- a/qpid/cpp/src/tests/ha_test_max_queues.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/client/Connection.h> -#include <qpid/client/Session.h> -#include <qpid/client/AsyncSession.h> -#include <qpid/Url.h> -#include <qpid/framing/reply_exceptions.h> -#include <sstream> - -using namespace qpid::client; -using namespace std; - -int main(int argc, char** argv) { - if (argc != 2) { - cerr << "Expecing URL of broker as argument" << endl; - exit(1); - } - try { - // We need to create a large number of queues quickly, so we - // use the old API for it's asynchronous commands. - // The qpid::messaging API does not allow async queue creation. - // - Connection c; - c.open(qpid::Url(argv[1])); - AsyncSession s = async(c.newSession()); - // Generate too many queues, make sure we get an exception. - for (uint64_t i = 0; i < 100000; ++i) { - ostringstream os; - os << "q" << i; - string q = os.str(); - s.queueDeclare(q, arg::sync=false); - if (i && i % 1000 == 0) { - s.sync(); // Check for exceptions. - cout << "Declared " << q << endl; - } - } - cout << "Expected resource-limit-exceeded exception" << endl; - return 1; - } - catch (const qpid::framing::ResourceLimitExceededException& e) { - cout << "Resource limit exceeded: " << e.what() << endl; - return 0; - } - catch (const std::exception& e) { - cout << "Error: " << e.what() << endl; - return 1; - } -} diff --git a/qpid/cpp/src/tests/ha_tests.py b/qpid/cpp/src/tests/ha_tests.py deleted file mode 100755 index fdcb314751..0000000000 --- a/qpid/cpp/src/tests/ha_tests.py +++ /dev/null @@ -1,1458 +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, random, logging, shutil, math, unittest -import traceback -from qpid.datatypes import uuid4, UUID -from brokertest import * -from ha_test import * -from threading import Thread, Lock, Condition -from logging import getLogger, WARN, ERROR, DEBUG, INFO -from qpidtoollibs import BrokerAgent, EventHelper - -log = getLogger(__name__) - -class HaBrokerTest(BrokerTest): - """Base class for HA broker tests""" - -class ReplicationTests(HaBrokerTest): - """Correctness tests for HA replication.""" - - def test_replication(self): - """Test basic replication of configuration and messages before and - after backup has connected""" - - def setup(prefix, primary): - """Create config, send messages on the primary p""" - a = primary.agent - - def queue(name, replicate): - a.addQueue(name, options={'qpid.replicate':replicate}) - return name - - def exchange(name, replicate, bindq, key): - a.addExchange("fanout", name, options={'qpid.replicate':replicate}) - a.bind(name, bindq, key) - return name - - # Test replication of messages - p = primary.connect().session() - s = p.sender(queue(prefix+"q1", "all")) - for m in ["a", "b", "1"]: s.send(qm.Message(m)) - # Test replication of dequeue - self.assertEqual(p.receiver(prefix+"q1").fetch(timeout=0).content, "a") - p.acknowledge() - - p.sender(queue(prefix+"q2", "configuration")).send(qm.Message("2")) - p.sender(queue(prefix+"q3", "none")).send(qm.Message("3")) - p.sender(exchange(prefix+"e1", "all", prefix+"q1", "key1")).send(qm.Message("4")) - p.sender(exchange(prefix+"e2", "configuration", prefix+"q2", "key2")).send(qm.Message("5")) - # Test unbind - p.sender(queue(prefix+"q4", "all")).send(qm.Message("6")) - s3 = p.sender(exchange(prefix+"e4", "all", prefix+"q4", "key4")) - s3.send(qm.Message("7")) - a.unbind(prefix+"e4", prefix+"q4", "key4") - p.sender(prefix+"e4").send(qm.Message("drop1")) # Should be dropped - - # Test replication of deletes - queue(prefix+"dq", "all") - exchange(prefix+"de", "all", prefix+"dq", "") - a.delQueue(prefix+"dq") - a.delExchange(prefix+"de") - - # Need a marker so we can wait till sync is done. - queue(prefix+"x", "configuration") - - def verify(b, prefix, p): - """Verify setup was replicated to backup b""" - # Wait for configuration to replicate. - wait_address(b.connection, prefix+"x"); - self.assert_browse_retry(b, prefix+"q1", ["b", "1", "4"]) - - self.assertEqual(p.receiver(prefix+"q1").fetch(timeout=0).content, "b") - p.acknowledge() - self.assert_browse_retry(b, prefix+"q1", ["1", "4"]) - - self.assert_browse_retry(b, prefix+"q2", []) # configuration only - assert not valid_address(b.connection, prefix+"q3") - - # Verify exchange with replicate=all - b.sender(prefix+"e1/key1").send(qm.Message(prefix+"e1")) - self.assert_browse_retry(b, prefix+"q1", ["1", "4", prefix+"e1"]) - - # Verify exchange with replicate=configuration - b.sender(prefix+"e2/key2").send(qm.Message(prefix+"e2")) - self.assert_browse_retry(b, prefix+"q2", [prefix+"e2"]) - - b.sender(prefix+"e4/key4").send(qm.Message("drop2")) # Verify unbind. - self.assert_browse_retry(b, prefix+"q4", ["6","7"]) - - # Verify deletes - assert not valid_address(b.connection, prefix+"dq") - assert not valid_address(b.connection, prefix+"de") - - l = LogLevel(ERROR) # Hide expected WARNING log messages from failover. - try: - cluster = HaCluster(self, 2) - primary = cluster[0] - backup = cluster[1] - - # Send messages before re-starting the backup, test catch-up replication. - cluster.kill(1, promote_next=False, final=False) - setup("1", primary) - cluster.restart(1) - - # Send messages after re-starting the backup, to test steady-state replication. - setup("2", primary) - - p = primary.connect().session() - - # Verify the data on the backup - b = backup.connect_admin().session() - verify(b, "1", p) - verify(b, "2", p) - # Test a series of messages, enqueue all then dequeue all. - primary.agent.addQueue("foo") - s = p.sender("foo") - wait_address(b.connection, "foo") - msgs = [str(i) for i in range(10)] - for m in msgs: s.send(qm.Message(m)) - self.assert_browse_retry(p, "foo", msgs) - self.assert_browse_retry(b, "foo", msgs) - r = p.receiver("foo") - for m in msgs: self.assertEqual(m, r.fetch(timeout=0).content) - p.acknowledge() - self.assert_browse_retry(p, "foo", []) - self.assert_browse_retry(b, "foo", []) - - # Another series, this time verify each dequeue individually. - for m in msgs: s.send(qm.Message(m)) - self.assert_browse_retry(p, "foo", msgs) - self.assert_browse_retry(b, "foo", msgs) - for i in range(len(msgs)): - self.assertEqual(msgs[i], r.fetch(timeout=0).content) - p.acknowledge() - self.assert_browse_retry(p, "foo", msgs[i+1:]) - self.assert_browse_retry(b, "foo", msgs[i+1:]) - finally: l.restore() - - def test_sync(self): - primary = HaBroker(self, name="primary") - primary.promote() - p = primary.connect().session() - s = p.sender("q;{create:always}") - for m in [str(i) for i in range(0,10)]: s.send(m) - s.sync() - backup1 = HaBroker(self, name="backup1", brokers_url=primary.host_port()) - for m in [str(i) for i in range(10,20)]: s.send(m) - s.sync() - backup2 = HaBroker(self, name="backup2", brokers_url=primary.host_port()) - for m in [str(i) for i in range(20,30)]: s.send(m) - s.sync() - - msgs = [str(i) for i in range(30)] - b1 = backup1.connect_admin().session() - backup1.assert_browse_backup("q", msgs) - backup2.assert_browse_backup("q", msgs) - - def test_send_receive(self): - """Verify sequence numbers of messages sent by qpid-send""" - l = LogLevel(ERROR) # Hide expected WARNING log messages from failover. - try: - brokers = HaCluster(self, 3) - sender = self.popen( - ["qpid-send", - "--broker", brokers[0].host_port(), - "--address", "q;{create:always}", - "--messages=1000", - "--content-string=x", - "--connection-options={%s}"%self.protocol_option() - ]) - receiver = self.popen( - ["qpid-receive", - "--broker", brokers[0].host_port(), - "--address", "q;{create:always}", - "--messages=990", - "--timeout=10", - "--connection-options={%s}"%self.protocol_option() - ]) - self.assertEqual(sender.wait(), 0) - self.assertEqual(receiver.wait(), 0) - expect = [long(i) for i in range(991, 1001)] - sn = lambda m: m.properties["sn"] - brokers[1].assert_browse_backup("q", expect, transform=sn) - brokers[2].assert_browse_backup("q", expect, transform=sn) - finally: l.restore() - - def test_failover_python(self): - """Verify that backups rejects connections and that fail-over works in python client""" - l = LogLevel(ERROR) # Hide expected WARNING log messages from failover. - try: - primary = HaBroker(self, name="primary") - primary.promote() - backup = HaBroker(self, name="backup", brokers_url=primary.host_port()) - # Check that backup rejects normal connections - try: - backup.connect().session() - self.fail("Expected connection to backup to fail") - except qm.ConnectionError: pass - # Check that admin connections are allowed to backup. - backup.connect_admin().close() - - # Test discovery: should connect to primary after reject by backup - c = backup.connect(reconnect_urls=[primary.host_port(), backup.host_port()], - reconnect=True) - s = c.session() - sender = s.sender("q;{create:always}") - sender.send("foo", sync=True) - s.sync() - primary.kill() - assert retry(lambda: not is_running(primary.pid)) - backup.promote() - sender.send("bar") - self.assert_browse_retry(s, "q", ["foo", "bar"]) - c.close() - finally: l.restore() - - - def test_heartbeat_python(self): - """Verify that a python client with a heartbeat specified disconnects - from a stalled broker and does not hang indefinitely.""" - - broker = Broker(self) - broker_addr = broker.host_port() - - # Case 1: Connect before stalling the broker, use the connection after stalling. - c = qm.Connection(broker_addr, heartbeat=1) - c.open() - os.kill(broker.pid, signal.SIGSTOP) # Stall the broker - - def make_sender(): c.session().sender("foo") - self.assertRaises(qm.ConnectionError, make_sender) - - # Case 2: Connect to a stalled broker - c = qm.Connection(broker_addr, heartbeat=1) - self.assertRaises(qm.ConnectionError, c.open) - - # Case 3: Re-connect to a stalled broker. - broker2 = Broker(self) - c = qm.Connection(broker2.host_port(), heartbeat=1, reconnect_limit=1, - reconnect=True, reconnect_urls=[broker_addr], - reconnect_log=False) # Hide expected warnings - c.open() - broker2.kill() # Cause re-connection to broker - self.assertRaises(qm.ConnectionError, make_sender) - - def test_failover_cpp(self): - """Verify that failover works in the C++ client.""" - cluster = HaCluster(self, 2) - cluster[0].connect().session().sender("q;{create:always}") - cluster[1].wait_backup("q") - # FIXME aconway 2014-02-21: using 0-10, there is a failover problem with 1.0 - sender = NumberedSender(cluster[0], url=cluster.url, queue="q", - connection_options="reconnect:true,protocol:'amqp0-10'") - receiver = NumberedReceiver(cluster[0], url=cluster.url, queue="q", - connection_options="reconnect:true,protocol:'amqp0-10'") - receiver.start() - sender.start() - assert retry(lambda: receiver.received > 10) # Wait for some messages to get thru - cluster.kill(0) - n = receiver.received - assert retry(lambda: receiver.received > n + 10) # Verify we are still going - sender.stop() - receiver.stop() - - def test_backup_failover(self): - """Verify that a backup broker fails over and recovers queue state""" - brokers = HaCluster(self, 3) - brokers[0].connect().session().sender("q;{create:always}").send("a") - brokers.kill(0) - brokers[1].connect().session().sender("q").send("b") - brokers[2].assert_browse_backup("q", ["a","b"]) - s = brokers[1].connect().session() - self.assertEqual("a", s.receiver("q").fetch().content) - s.acknowledge() - brokers[2].assert_browse_backup("q", ["b"]) - - def test_empty_backup_failover(self): - """Verify that a new primary becomes active with no queues. - Regression test for QPID-5430""" - brokers = HaCluster(self, 3) - brokers.kill(0) - brokers[1].wait_status("active") - - def test_qpid_config_replication(self): - """Set up replication via qpid-config""" - brokers = HaCluster(self,2) - brokers[0].config_declare("q","all") - brokers[0].connect().session().sender("q").send("foo") - brokers[1].assert_browse_backup("q", ["foo"]) - - def test_standalone_queue_replica(self): - """Test replication of individual queues outside of cluster mode""" - primary = HaBroker(self, name="primary", ha_cluster=False, - args=["--ha-queue-replication=yes"]); - pc = primary.connect() - ps = pc.session().sender("q;{create:always}") - pr = pc.session().receiver("q;{create:always}") - backup = HaBroker(self, name="backup", ha_cluster=False, - args=["--ha-queue-replication=yes"]) - bs = backup.connect().session() - br = bs.receiver("q;{create:always}") - - def srange(*args): return [str(i) for i in xrange(*args)] - - for m in srange(3): ps.send(m) - # Set up replication with qpid-ha - backup.replicate(primary.host_port(), "q") - backup.assert_browse_backup("q", srange(3)) - for m in srange(3,6): ps.send(str(m)) - backup.assert_browse_backup("q", srange(6)) - self.assertEqual("0", pr.fetch().content) - pr.session.acknowledge() - backup.assert_browse_backup("q", srange(1,6)) - - # Set up replication with qpid-config - ps2 = pc.session().sender("q2;{create:always}") - backup.config_replicate(primary.host_port(), "q2"); - ps2.send("x") - backup.assert_browse_backup("q2", ["x"]) - - - def test_standalone_queue_replica_failover(self): - """Test individual queue replication from a cluster to a standalone - backup broker, verify it fails over.""" - l = LogLevel(ERROR) # Hide expected WARNING log messages from failover. - try: - cluster = HaCluster(self, 2) - primary = cluster[0] - pc = cluster.connect(0) - ps = pc.session().sender("q;{create:always}") - pr = pc.session().receiver("q;{create:always}") - backup = HaBroker(self, name="backup", ha_cluster=False, - args=["--ha-queue-replication=yes"]) - br = backup.connect().session().receiver("q;{create:always}") - backup.replicate(cluster.url, "q") - ps.send("a") - ps.sync() - backup.assert_browse_backup("q", ["a"]) - cluster.bounce(0) - backup.assert_browse_backup("q", ["a"]) - ps.send("b") - backup.assert_browse_backup("q", ["a", "b"]) - cluster[0].wait_status("ready") - cluster.bounce(1) - # FIXME aconway 2014-02-20: pr does not fail over with 1.0/swig - if qm == qpid_messaging: - print "WARNING: Skipping SWIG client failover bug" - return - self.assertEqual("a", pr.fetch().content) - pr.session.acknowledge() - backup.assert_browse_backup("q", ["b"]) - pc.close() - br.close() - finally: l.restore() - - def test_lvq(self): - """Verify that we replicate to an LVQ correctly""" - cluster = HaCluster(self, 2) - s = cluster[0].connect().session().sender("lvq; {create:always, node:{x-declare:{arguments:{'qpid.last_value_queue_key':lvq-key}}}}") - - def send(key,value,expect): - s.send(qm.Message(content=value,properties={"lvq-key":key})) - cluster[1].assert_browse_backup("lvq", expect) - - send("a", "a-1", ["a-1"]) - send("b", "b-1", ["a-1", "b-1"]) - send("a", "a-2", ["b-1", "a-2"]) - send("a", "a-3", ["b-1", "a-3"]) - send("c", "c-1", ["b-1", "a-3", "c-1"]) - send("c", "c-2", ["b-1", "a-3", "c-2"]) - send("b", "b-2", ["a-3", "c-2", "b-2"]) - send("c", "c-3", ["a-3", "b-2", "c-3"]) - send("d", "d-1", ["a-3", "b-2", "c-3", "d-1"]) - - def test_ring(self): - """Test replication with the ring queue policy""" - """Verify that we replicate to an LVQ correctly""" - cluster = HaCluster(self, 2) - s = cluster[0].connect().session().sender("q; {create:always, node:{x-declare:{arguments:{'qpid.policy_type':ring, 'qpid.max_count':5}}}}") - for i in range(10): s.send(qm.Message(str(i))) - cluster[1].assert_browse_backup("q", [str(i) for i in range(5,10)]) - - def test_reject(self): - """Test replication with the reject queue policy""" - cluster = HaCluster(self, 2) - primary, backup = cluster - s = primary.connect().session().sender("q; {create:always, node:{x-declare:{arguments:{'qpid.policy_type':reject, 'qpid.max_count':5}}}}") - try: - for i in range(10): s.send(qm.Message(str(i)), sync=False) - except qm.LinkError: pass - backup.assert_browse_backup("q", [str(i) for i in range(0,5)]) - try: s.session.connection.close() - except: pass # Expect exception from broken session - - def test_priority(self): - """Verify priority queues replicate correctly""" - cluster = HaCluster(self, 2) - session = cluster[0].connect().session() - s = session.sender("priority-queue; {create:always, node:{x-declare:{arguments:{'qpid.priorities':10}}}}") - priorities = [8,9,5,1,2,2,3,4,9,7,8,9,9,2] - for p in priorities: s.send(qm.Message(priority=p)) - # Can't use browse_backup as browser sees messages in delivery order not priority. - cluster[1].wait_backup("priority-queue") - r = cluster[1].connect_admin().session().receiver("priority-queue") - received = [r.fetch().priority for i in priorities] - self.assertEqual(sorted(priorities, reverse=True), received) - - def test_priority_fairshare(self): - """Verify priority queues replicate correctly""" - cluster = HaCluster(self, 2) - primary, backup = cluster - session = primary.connect().session() - levels = 8 - priorities = [4,5,3,7,8,8,2,8,2,8,8,16,6,6,6,6,6,6,8,3,5,8,3,5,5,3,3,8,8,3,7,3,7,7,7,8,8,8,2,3] - limits={7:0,6:4,5:3,4:2,3:2,2:2,1:2} - limit_policy = ",".join(["'qpid.fairshare':5"] + ["'qpid.fairshare-%s':%s"%(i[0],i[1]) for i in limits.iteritems()]) - s = session.sender("priority-queue; {create:always, node:{x-declare:{arguments:{'qpid.priorities':%s, %s}}}}"%(levels,limit_policy)) - messages = [qm.Message(content=str(uuid4()), priority = p) for p in priorities] - for m in messages: s.send(m) - backup.wait_backup(s.target) - r = backup.connect_admin().session().receiver("priority-queue") - received = [r.fetch().content for i in priorities] - sort = sorted(messages, key=lambda m: priority_level(m.priority, levels), reverse=True) - fair = [m.content for m in fairshare(sort, lambda l: limits.get(l,0), levels)] - self.assertEqual(received, fair) - - def test_priority_ring(self): - cluster = HaCluster(self, 2) - primary, backup = cluster - s = primary.connect().session().sender("q; {create:always, node:{x-declare:{arguments:{'qpid.policy_type':ring, 'qpid.max_count':5, 'qpid.priorities':10}}}}") - priorities = [8,9,5,1,2,2,3,4,9,7,8,9,9,2] - for p in priorities: s.send(qm.Message(priority=p)) - expect = sorted(priorities,reverse=True)[0:5] - primary.assert_browse("q", expect, transform=lambda m: m.priority) - backup.assert_browse_backup("q", expect, transform=lambda m: m.priority) - - def test_backup_acquired(self): - """Verify that acquired messages are backed up, for all queue types.""" - class Test: - def __init__(self, queue, arguments, expect): - self.queue = queue - self.address = "%s;{create:always,node:{x-declare:{arguments:{%s}}}}"%( - self.queue, ",".join(arguments)) - self.expect = [str(i) for i in expect] - - def send(self, connection): - """Send messages, then acquire one but don't acknowledge""" - s = connection.session() - for m in range(10): s.sender(self.address).send(str(m)) - s.receiver(self.address).fetch() - - def verify(self, brokertest, backup): - backup.assert_browse_backup(self.queue, self.expect, msg=self.queue) - - tests = [ - Test("plain",[],range(10)), - Test("ring", ["'qpid.policy_type':ring", "'qpid.max_count':5"], range(5,10)), - Test("priority",["'qpid.priorities':10"], range(10)), - Test("fairshare", ["'qpid.priorities':10,'qpid.fairshare':5"], range(10)), - Test("lvq", ["'qpid.last_value_queue_key':lvq-key"], [9]) - ] - - cluster = HaCluster(self, 3) - cluster.kill(2, final=False) # restart after messages are sent to test catch-up - - c = cluster[0].connect() - for t in tests: t.send(c) # Send messages, leave one unacknowledged. - - cluster.restart(2) - cluster[2].wait_status("ready") - - # Verify acquired message was replicated - for t in tests: t.verify(self, cluster[1]) - for t in tests: t.verify(self, cluster[2]) - - def test_replicate_default(self): - """Make sure we don't replicate if ha-replicate is unspecified or none""" - cluster1 = HaCluster(self, 2, ha_replicate=None) - cluster1[1].wait_status("ready") - c1 = cluster1[0].connect().session().sender("q;{create:always}") - cluster2 = HaCluster(self, 2, ha_replicate="none") - cluster2[1].wait_status("ready") - cluster2[0].connect().session().sender("q;{create:always}") - time.sleep(.1) # Give replication a chance. - # Expect queues not to be found - self.assertRaises(qm.NotFound, cluster1[1].connect_admin().session().receiver, "q") - self.assertRaises(qm.NotFound, cluster2[1].connect_admin().session().receiver, "q") - - def test_replicate_binding(self): - """Verify that binding replication can be disabled""" - cluster = HaCluster(self, 2) - primary, backup = cluster[0], cluster[1] - ps = primary.connect().session() - a = primary.agent - a.addExchange("fanout", "ex") - a.addQueue("q") - a.bind("ex", "q", options={'qpid.replicate':'none'}) - backup.wait_backup("q") - - primary.kill() - assert retry(lambda: not is_running(primary.pid)) # Wait for primary to die - backup.promote() - bs = backup.connect_admin().session() - bs.sender("ex").send(qm.Message("msg")) - self.assert_browse_retry(bs, "q", []) - - def test_invalid_replication(self): - """Verify that we reject an attempt to declare a queue with invalid replication value.""" - cluster = HaCluster(self, 1, ha_replicate="all") - self.assertRaises(Exception, cluster[0].connect().session().sender, - "q;{create:always, node:{x-declare:{arguments:{'qpid.replicate':XXinvalidXX}}}}") - - def test_exclusive_queue(self): - """Ensure that we can back-up exclusive queues, i.e. the replicating - subscriptions are exempt from the exclusivity""" - cluster = HaCluster(self, 2) - def test(addr): - c = cluster[0].connect() - q = addr.split(";")[0] - r = c.session().receiver(addr) - self.assertRaises(qm.LinkError, c.session().receiver, addr) - s = c.session().sender(q).send(q) - cluster[1].assert_browse_backup(q, [q]) - test("excl_queue;{create:always, node:{x-declare:{exclusive:True}}}") - if qm == qpid.messaging: # FIXME aconway 2014-02-20: swig client no exclusive subscribe - test("excl_sub;{create:always, link:{x-subscribe:{exclusive:True}}}"); - - def test_auto_delete_exclusive(self): - """Verify that we ignore auto-delete, exclusive, non-auto-delete-timeout queues""" - cluster = HaCluster(self, 2) - s0 = cluster[0].connect().session() - s0.receiver("exad;{create:always,node:{x-declare:{exclusive:True,auto-delete:True}}}") - s0.receiver("ex;{create:always,node:{x-declare:{exclusive:True}}}") - ad = s0.receiver("ad;{create:always,node:{x-declare:{auto-delete:True}}}") - s0.receiver("time;{create:always,node:{x-declare:{exclusive:True,auto-delete:True,arguments:{'qpid.auto_delete_timeout':1}}}}") - s0.receiver("q;{create:always}") - - s1 = cluster[1].connect_admin().session() - cluster[1].wait_backup("q") - assert not valid_address(s1.connection, "exad") - assert valid_address(s1.connection, "ex") - assert valid_address(s1.connection, "ad") - assert valid_address(s1.connection, "time") - - # Verify that auto-delete queues are not kept alive by - # replicating subscriptions - ad.close() - s0.sync() - assert not valid_address(s0.connection, "ad") - - def test_broker_info(self): - """Check that broker information is correctly published via management""" - cluster = HaCluster(self, 3) - - def ha_broker(broker): - ha_broker = broker.agent.getHaBroker(); - ha_broker.update() - return ha_broker - - for broker in cluster: # Make sure HA system-id matches broker's - self.assertEqual(ha_broker(broker).systemId, UUID(broker.agent.getBroker().systemRef)) - - # Check that all brokers have the same membership as the cluster - def check_ids(broker): - cluster_ids = set([ ha_broker(b).systemId for b in cluster]) - broker_ids = set([m["system-id"] for m in ha_broker(broker).members]) - assert retry(lambda: cluster_ids == broker_ids, 1), "%s != %s on %s"%(cluster_ids, broker_ids, broker) - - for broker in cluster: check_ids(broker) - - # Add a new broker, check it is updated everywhere - b = cluster.start() - for broker in cluster: check_ids(broker) - - def test_auth(self): - """Verify that authentication does not interfere with replication.""" - # TODO aconway 2012-07-09: generate test sasl config portably for cmake - sasl_config=os.path.join(self.rootdir, "sasl_config") - if not os.path.exists(sasl_config): - print "WARNING: Skipping test, SASL test configuration %s not found."%sasl_config - return - acl=os.path.join(os.getcwd(), "policy.acl") - aclf=file(acl,"w") - # Minimum set of privileges required for the HA user. - aclf.write(""" -# HA user -acl allow zag@QPID access queue -acl allow zag@QPID create queue -acl allow zag@QPID consume queue -acl allow zag@QPID delete queue -acl allow zag@QPID access exchange -acl allow zag@QPID create exchange -acl allow zag@QPID bind exchange -acl allow zag@QPID publish exchange -acl allow zag@QPID delete exchange -acl allow zag@QPID access method -acl allow zag@QPID create link -acl allow zag@QPID access query -# Normal user -acl allow zig@QPID all all -acl deny all all - """) - aclf.close() - cluster = HaCluster( - self, 2, - args=["--auth", "yes", "--sasl-config", sasl_config, - "--acl-file", acl, - "--ha-username=zag", "--ha-password=zag", "--ha-mechanism=PLAIN" - ], - client_credentials=Credentials("zag", "zag", "PLAIN")) - c = cluster[0].connect(username="zig", password="zig") - s0 = c.session(); - a = cluster[0].agent - a.addQueue("q") - a.addExchange("fanout", "ex") - a.bind("ex", "q", "") - s0.sender("ex").send("foo"); - - # Transactions should be done over the tx_protocol - c = cluster[0].connect(protocol=self.tx_protocol, username="zig", password="zig") - s1 = c.session(transactional=True) - s1.sender("ex").send("foo-tx"); - cluster[1].assert_browse_backup("q", ["foo"]) - s1.commit() - cluster[1].assert_browse_backup("q", ["foo", "foo-tx"]) - - def test_alternate_exchange(self): - """Verify that alternate-exchange on exchanges and queues is propagated - to new members of a cluster. """ - cluster = HaCluster(self, 2) - s = cluster[0].connect().session() - # altex exchange: acts as alternate exchange - a = cluster[0].agent - a.addExchange("fanout", "altex") - # altq queue bound to altex, collect re-routed messages. - a.addQueue("altq") - a.bind("altex", "altq", "") - # ex exchange with alternate-exchange altex and no queues bound - a.addExchange("direct", "ex", {"alternate-exchange":"altex"}) - # create queue q with alternate-exchange altex - a.addQueue("q", {"alternate-exchange":"altex"}) - # create a bunch of exchanges to ensure we don't clean up prematurely if the - # response comes in multiple fragments. - for i in xrange(200): s.sender("ex.%s;{create:always,node:{type:topic}}"%i) - - def verify(broker): - c = broker.connect() - s = c.session() - # Verify unmatched message goes to ex's alternate. - s.sender("ex").send("foo") - altq = s.receiver("altq") - self.assertEqual("foo", altq.fetch(timeout=0).content) - s.acknowledge() - # 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, qm.Disposition(qm.REJECTED)) # Reject the message - self.assertEqual("bar", altq.fetch(timeout=0).content) - s.acknowledge() - s.sync() # Make sure backups are caught-up. - c.close() - - # Sanity check: alternate exchanges on original broker - verify(cluster[0]) - a = cluster[0].agent - # Altex is in use as an alternate exchange, we should get an exception - self.assertRaises(Exception, a.delExchange, "altex") - # Check backup that was connected during setup. - def wait(broker): - broker.wait_status("ready") - for a in ["q", "ex", "altq", "altex"]: - broker.wait_backup(a) - wait(cluster[1]) - cluster.bounce(0) - verify(cluster[1]) - - # Check a newly started backup. - cluster.start() - wait(cluster[2]) - cluster.bounce(1) - verify(cluster[2]) - - # Check that alt-exchange in-use count is replicated - a = cluster[2].agent - self.assertRaises(Exception, a.delExchange, "altex") - a.delQueue("q") - self.assertRaises(Exception, a.delExchange, "altex") - a.delExchange("ex") - a.delExchange("altex") - - def test_priority_reroute(self): - """Regression test for QPID-4262, rerouting messages from a priority queue - to itself causes a crash""" - cluster = HaCluster(self, 2) - primary = cluster[0] - session = primary.connect().session() - a = primary.agent - a.addQueue("pq", {'qpid.priorities':10}) - a.bind("amq.fanout", "pq") - s = session.sender("pq") - for m in xrange(100): s.send(qm.Message(str(m), priority=m%10)) - pq = QmfAgent(primary.host_port()).getQueue("pq") - pq.reroute(request=0, useAltExchange=False, exchange="amq.fanout") - # Verify that consuming is in priority order - expect = [str(10*i+p) for p in xrange(9,-1,-1) for i in xrange(0,10) ] - actual = [m.content for m in primary.get_messages("pq", 100)] - self.assertEqual(expect, actual) - - def test_delete_missing_response(self): - """Check that a backup correctly deletes leftover queues and exchanges that are - missing from the initial reponse set.""" - # This test is a bit contrived, we set up the situation on backup brokers - # and then promote one. - cluster = HaCluster(self, 2, promote=False) - - # cluster[0] Will be the primary - s = cluster[0].connect_admin().session() - s.sender("q1;{create:always}") - s.sender("e1;{create:always, node:{type:topic}}") - - # cluster[1] will be the backup, has extra queues/exchanges - xdecl = "x-declare:{arguments:{'qpid.replicate':'all'}}" - node = "node:{%s}"%(xdecl) - s = cluster[1].connect_admin().session() - s.sender("q1;{create:always, %s}"%(node)) - s.sender("q2;{create:always, %s}"%(node)) - s.sender("e1;{create:always, node:{type:topic, %s}}"%(xdecl)) - s.sender("e2;{create:always, node:{type:topic, %s}}"%(xdecl)) - for a in ["q1", "q2", "e1", "e2"]: cluster[1].wait_backup(a) - - cluster[0].promote() - # Verify the backup deletes the surplus queue and exchange - cluster[1].wait_status("ready") - s = cluster[1].connect_admin().session() - self.assertRaises(qm.NotFound, s.receiver, ("q2")); - self.assertRaises(qm.NotFound, s.receiver, ("e2")); - - - def test_delete_qpid_4285(self): - """Regression test for QPID-4285: on deleting a queue it gets stuck in a - partially deleted state and causes replication errors.""" - cluster = HaCluster(self,2) - s = cluster[0].connect().session() - s.receiver("q;{create:always}") - cluster[1].wait_backup("q") - cluster.kill(0) # Make the backup take over. - s = cluster[1].connect().session() - cluster[1].agent.delQueue("q") # Delete q on new primary - self.assertRaises(qm.NotFound, s.receiver, "q") - assert not cluster[1].agent.getQueue("q") # Should not be in QMF - - def test_auto_delete_failover(self): - """Test auto-delete queues. Verify that: - - queues auto-deleted on the primary are deleted on the backup. - - auto-delete queues with/without timeout are deleted after a failover correctly - - auto-delete queues never used (subscribe to) to are not deleted - - messages are correctly routed to the alternate exchange. - """ - cluster = HaCluster(self, 3) - s = cluster[0].connect().session() - a = cluster[0].agent - - def setup(q, timeout=None): - # Create alternate exchange, auto-delete queue and queue bound to alt. ex. - a.addExchange("fanout", q+"-altex") - args = {"auto-delete":True, "alternate-exchange":q+"-altex"} - if timeout is not None: args['qpid.auto_delete_timeout'] = timeout - a.addQueue(q, args) - a.addQueue(q+"-altq") - a.bind("%s-altex"%q, "%s-altq"%q) - - for args in [["q1"],["q2",0],["q3",1],["q4"],["q5"]]: setup(*args) - receivers = [] - for i in xrange(1,5): # Don't use q5 - q = "q%s"%i - receivers.append(s.receiver(q)) # Subscribe - qs = s.sender(q); qs.send(q); qs.close() # Send q name as message - - receivers[3].close() # Trigger auto-delete for q4 - for b in cluster[1:3]: b.wait_no_queue("q4") # Verify deleted on backups - - cluster[0].kill(final=False) # Kill primary - cluster[2].promote() - cluster.restart(0) - cluster[2].wait_queue("q3") # Not yet auto-deleted, 1 sec timeout. - for b in cluster: - for q in ["q%s"%i for i in xrange(1,5)]: - b.wait_no_queue(q,timeout=2, msg=str(b)) # auto-deleted - b.assert_browse_backup("%s-altq"%q, [q]) # Routed to alternate - cluster[2].wait_queue("q5") # Not auto-deleted, never subscribed - cluster[2].connect().session().receiver("q5").close() - cluster[2].wait_no_queue("q5") - - def test_auto_delete_close(self): - """Verify auto-delete queues are deleted on backup if auto-deleted - on primary""" - cluster=HaCluster(self, 2) - - # Create altex to use as alternate exchange, with altq bound to it - a = cluster[0].agent - a.addExchange("fanout", "altex") - a.addQueue("altq", {"auto-delete":True}) - a.bind("altex", "altq") - - p = cluster[0].connect().session() - r = p.receiver("adq1;{create:always,node:{x-declare:{auto-delete:True,alternate-exchange:'altex'}}}") - s = p.sender("adq1") - for m in ["aa","bb","cc"]: s.send(m) - s.close() - cluster[1].wait_queue("adq1") - r.close() # trigger auto-delete of adq1 - cluster[1].wait_no_queue("adq1") - cluster[1].assert_browse_backup("altq", ["aa","bb","cc"]) - - def test_expired(self): - """Regression test for QPID-4379: HA does not properly handle expired messages""" - # Race between messages expiring and HA replicating consumer. - cluster = HaCluster(self, 2) - s = cluster[0].connect().session().sender("q;{create:always}", capacity=2) - def send_ttl_messages(): - for i in xrange(100): s.send(qm.Message(str(i), ttl=0.001)) - send_ttl_messages() - cluster.start() - send_ttl_messages() - - def test_missed_recreate(self): - """If a queue or exchange is destroyed and one with the same name re-created - while a backup is disconnected, the backup should also delete/recreate - the object when it re-connects""" - cluster = HaCluster(self, 3) - sn = cluster[0].connect().session() - # Create a queue with messages - s = sn.sender("qq;{create:always}") - msgs = [str(i) for i in xrange(3)] - for m in msgs: s.send(m) - cluster[1].assert_browse_backup("qq", msgs) - cluster[2].assert_browse_backup("qq", msgs) - # Set up an exchange with a binding. - a = cluster[0].agent - a.addExchange("fanout", "xx") - a.addQueue("xxq") - a.bind("xx", "xxq", "xxq") - cluster[1].wait_address("xx") - self.assertEqual(cluster[1].agent.getExchange("xx").values["bindingCount"], 1) - cluster[2].wait_address("xx") - self.assertEqual(cluster[2].agent.getExchange("xx").values["bindingCount"], 1) - - # Simulate the race by re-creating the objects before promoting the new primary - cluster.kill(0, promote_next=False) - xdecl = "x-declare:{arguments:{'qpid.replicate':'all'}}" - node = "node:{%s}"%(xdecl) - sn = cluster[1].connect_admin().session() - a = cluster[1].agent - a.delQueue("qq", if_empty=False) - s = sn.sender("qq;{create:always, %s}"%(node)) - s.send("foo") - a.delExchange("xx") - sn.sender("xx;{create:always,node:{type:topic,%s}}"%(xdecl)) - cluster[1].promote() - cluster[1].wait_status("active") - # Verify we are not still using the old objects on cluster[2] - cluster[2].assert_browse_backup("qq", ["foo"]) - cluster[2].wait_address("xx") - self.assertEqual(cluster[2].agent.getExchange("xx").values["bindingCount"], 0) - - def test_resource_limit_bug(self): - """QPID-5666 Regression test: Incorrect resource limit exception for queue creation.""" - cluster = HaCluster(self, 3) - qs = ["q%s"%i for i in xrange(10)] - a = cluster[0].agent - a.addQueue("q") - cluster[1].wait_backup("q") - cluster.kill(0) - cluster[1].promote() - cluster[1].wait_status("active") - a = cluster[1].agent - a.delQueue("q") - a.addQueue("q") - -def fairshare(msgs, limit, levels): - """ - Generator to return prioritised messages in expected order for a given fairshare limit - """ - count = 0 - last_priority = None - postponed = [] - while msgs or postponed: - if not msgs: - msgs = postponed - count = 0 - last_priority = None - postponed = [ ] - msg = msgs.pop(0) - if last_priority and priority_level(msg.priority, levels) == last_priority: - count += 1 - else: - last_priority = priority_level(msg.priority, levels) - count = 1 - l = limit(last_priority) - if (l and count > l): - postponed.append(msg) - else: - yield msg - return - -def priority_level(value, levels): - """ - Method to determine which of a distinct number of priority levels - a given value falls into. - """ - offset = 5-math.ceil(levels/2.0) - return min(max(value - offset, 0), levels-1) - -class LongTests(HaBrokerTest): - """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_send_receive(self): - """Test failover with continuous send-receive""" - brokers = HaCluster(self, 3) - - # Start sender and receiver threads - n = 10 - senders = [ - NumberedSender( - brokers[0], url=brokers.url,max_depth=50, - queue="test%s"%(i), args=["--capacity=10"]) for i in xrange(n)] - - receivers = [ - NumberedReceiver( - brokers[0], url=brokers.url, sender=senders[i], - queue="test%s"%(i), args=["--capacity=10"]) for i in xrange(n)] - - for r in receivers: r.start() - for s in senders: s.start() - - def wait_passed(r, n): - """Wait for receiver r to pass n""" - def check(): - r.check() # Verify no exceptions - return r.received > n + 100 - assert retry(check), "Stalled %s waiting for %s, sent %s"%( - r.queue, n, [s for s in senders if s.queue==r.queue][0].sent) - - for r in receivers: wait_passed(r, 0) - - # Kill and restart brokers in a cycle: - endtime = time.time() + self.duration() - i = 0 - primary = 0 - try: - try: - while time.time() < endtime or i < 3: # At least 3 iterations - # Precondition: All 3 brokers running, - # primary = index of promoted primary - # one or two backups are running, - for s in senders: s.sender.assert_running() - for r in receivers: r.receiver.assert_running() - checkpoint = [ r.received+10 for r in receivers ] - victim = random.choice([0,1,2,primary]) # Give the primary a better chance. - if victim == primary: - # Don't kill primary till it is active and the next - # backup is ready, otherwise we can lose messages. - brokers[victim].wait_status("active") - next = (victim+1)%3 - brokers[next].wait_status("ready") - brokers.bounce(victim) # Next one is promoted - primary = next - else: - brokers.bounce(victim, promote_next=False) - - # Make sure we are not stalled - map(wait_passed, receivers, checkpoint) - # Run another checkpoint to ensure things work in this configuration - checkpoint = [ r.received+10 for r in receivers ] - map(wait_passed, receivers, checkpoint) - i += 1 - except: - traceback.print_exc() - raise - finally: - for s in senders: s.stop() - for r in receivers: r.stop() - dead = filter(lambda b: not b.is_running(), brokers) - if dead: raise Exception("Brokers not running: %s"%dead) - - def test_tx_send_receive(self): - brokers = HaCluster(self, 3) - sender = self.popen( - ["qpid-send", - "--broker", brokers[0].host_port(), - "--address", "q;{create:always}", - "--messages=1000", - "--tx=10", - "--connection-options={protocol:%s}" % self.tx_protocol - ]) - receiver = self.popen( - ["qpid-receive", - "--broker", brokers[0].host_port(), - "--address", "q;{create:always}", - "--messages=990", - "--timeout=10", - "--tx=10", - "--connection-options={protocol:%s}" % self.tx_protocol - ]) - self.assertEqual(sender.wait(), 0) - self.assertEqual(receiver.wait(), 0) - expect = [long(i) for i in range(991, 1001)] - sn = lambda m: m.properties["sn"] - brokers[0].assert_browse("q", expect, transform=sn) - brokers[1].assert_browse_backup("q", expect, transform=sn) - brokers[2].assert_browse_backup("q", expect, transform=sn) - - - def test_qmf_order(self): - """QPID 4402: HA QMF events can be out of order. - This test mimics the test described in the JIRA. Two threads repeatedly - declare the same auto-delete queue and close their connection. - """ - broker = Broker(self) - class Receiver(Thread): - def __init__(self, qname): - Thread.__init__(self) - self.qname = qname - self.stopped = False - - def run(self): - while not self.stopped: - self.connection = broker.connect() - try: - self.connection.session().receiver( - self.qname+";{create:always,node:{x-declare:{auto-delete:True}}}") - except qm.NotFound: pass # Can occur occasionally, not an error. - try: self.connection.close() - except: pass - - class QmfObject(object): - """Track existance of an object and validate QMF events""" - def __init__(self, type_name, name_field, name): - self.type_name, self.name_field, self.name = type_name, name_field, name - self.exists = False - - def qmf_event(self, event): - content = event.content[0] - event_type = content['_schema_id']['_class_name'] - values = content['_values'] - if event_type == self.type_name+"Declare" and values[self.name_field] == self.name: - disp = values['disp'] - log.debug("Event %s: disp=%s exists=%s"%( - event_type, values['disp'], self.exists)) - if self.exists: assert values['disp'] == 'existing' - else: assert values['disp'] == 'created' - self.exists = True - elif event_type == self.type_name+"Delete" and values[self.name_field] == self.name: - log.debug("Event %s: exists=%s"%(event_type, self.exists)) - assert self.exists - self.exists = False - - # Verify order of QMF events. - helper = EventHelper() - r = broker.connect().session().receiver(helper.eventAddress()) - threads = [Receiver("qq"), Receiver("qq")] - for t in threads: t.start() - queue = QmfObject("queue", "qName", "qq") - finish = time.time() + self.duration() - try: - while time.time() < finish: - queue.qmf_event(r.fetch()) - finally: - for t in threads: t.stopped = True; t.join() - - def test_max_queues(self): - """Verify that we behave properly if we try to exceed the max number - of replicated queues - currently limited by the max number of channels - in the replication link""" - # This test is very slow (3 mins), skip it unless duration() > 1 minute. - if self.duration() < 60: return - # This test is written in C++ for speed, it takes a long time - # to create 64k queues in python. See ha_test_max_queues.cpp. - cluster = HaCluster(self, 2) - test = self.popen(["ha_test_max_queues", cluster[0].host_port()]) - self.assertEqual(test.wait(), 0) - -class RecoveryTests(HaBrokerTest): - """Tests for recovery after a failure.""" - - def test_queue_hold(self): - """Verify that the broker holds queues without sufficient backup, - i.e. does not complete messages sent to those queues.""" - - l = LogLevel(ERROR) # Hide expected WARNING log messages from failover. - try: - # We don't want backups to time out for this test, set long timeout. - cluster = HaCluster(self, 4, args=["--ha-backup-timeout=120"]); - # Wait for the primary to be ready - cluster[0].wait_status("active") - for b in cluster[1:4]: b.wait_status("ready") - # Create a queue before the failure. - # FIXME aconway 2014-02-20: SWIG client doesn't respect sync=False - s1 = cluster.connect(0, native=True).session().sender("q1;{create:always}") - for b in cluster: b.wait_backup("q1") - for i in xrange(10): s1.send(str(i), timeout=0.1) - - # Kill primary and 2 backups - cluster[3].wait_status("ready") - for i in [0,1,2]: cluster.kill(i, promote_next=False, final=False) - cluster[3].promote() # New primary, backups will be 1 and 2 - cluster[3].wait_status("recovering") - - def assertSyncTimeout(s): - self.assertRaises(qpid.messaging.Timeout, s.sync, timeout=.01) - - # Create a queue after the failure - # FIXME aconway 2014-02-20: SWIG client doesn't respect sync=False - s2 = cluster.connect(3, native=True).session().sender("q2;{create:always}") - - # Verify that messages sent are not completed - for i in xrange(10,20): - s1.send(str(i), sync=False, timeout=0.1); - s2.send(str(i), sync=False, timeout=0.1) - - assertSyncTimeout(s1) - self.assertEqual(s1.unsettled(), 10) - assertSyncTimeout(s2) - self.assertEqual(s2.unsettled(), 10) - - # Verify we can receive even if sending is on hold: - cluster[3].assert_browse("q1", [str(i) for i in range(10)]) - - # Restart backups, verify queues are released only when both backups are up - cluster.restart(1) - assertSyncTimeout(s1) - self.assertEqual(s1.unsettled(), 10) - assertSyncTimeout(s2) - self.assertEqual(s2.unsettled(), 10) - cluster.restart(2) - cluster.restart(0) - - # Verify everything is up to date and active - def settled(sender): sender.sync(timeout=1); return sender.unsettled() == 0; - assert retry(lambda: settled(s1)), "Unsetttled=%s"%(s1.unsettled()) - assert retry(lambda: settled(s2)), "Unsetttled=%s"%(s2.unsettled()) - cluster[1].assert_browse_backup("q1", [str(i) for i in range(10)+range(10,20)]) - cluster[1].assert_browse_backup("q2", [str(i) for i in range(10,20)]) - cluster[3].wait_status("active"), - s1.session.connection.close() - s2.session.connection.close() - finally: l.restore() - - def test_expected_backup_timeout(self): - """Verify that we time-out expected backups and release held queues - after a configured interval. Verify backup is demoted to catch-up, - but can still rejoin. - """ - cluster = HaCluster(self, 3, args=["--ha-backup-timeout=0.5"]); - for i in [0,1]: cluster.kill(i, False) - cluster[2].promote() # New primary, expected backup will be 1 - # Should not go active till the expected backup connects or times out. - cluster[2].wait_status("recovering") - # Messages should be held till expected backup times out - ss = cluster[2].connect().session() - s = ss.sender("q;{create:always}") - s.send("foo", sync=False) - self.assertEqual(s.unsettled(), 1) # Verify message not settled immediately. - s.sync(timeout=1) # And settled after timeout. - cluster[2].wait_status("active") - - def test_join_ready_cluster(self): - """If we join a cluster where the primary is dead, the new primary is - not yet promoted and there are ready backups then we should refuse - promotion so that one of the ready backups can be chosen.""" - cluster = HaCluster(self, 2) - cluster[0].wait_status("active") - cluster[1].wait_status("ready") - cluster.bounce(0, promote_next=False) - self.assertRaises(Exception, cluster[0].promote) - os.kill(cluster[1].pid, signal.SIGSTOP) # Test for timeout if unresponsive. - cluster.bounce(0, promote_next=False) - cluster[0].promote() - - def test_stalled_backup(self): - """Make sure that a stalled backup broker does not stall the primary""" - cluster = HaCluster(self, 3, args=["--link-heartbeat-interval=1"]) - os.kill(cluster[1].pid, signal.SIGSTOP) - s = cluster[0].connect().session() - s.sender("q;{create:always}").send("x") - self.assertEqual("x", s.receiver("q").fetch(0).content) - -class StoreTests(HaBrokerTest): - """Test for HA with persistence.""" - - def check_skip(self): - if not BrokerTest.store_lib: - print "WARNING: skipping HA+store tests, no store lib found." - return not BrokerTest.store_lib - - def test_store_recovery(self): - """Verify basic store and recover functionality""" - if self.check_skip(): return - cluster = HaCluster(self, 1) - sn = cluster[0].connect().session() - # Create queue qq, exchange exx and binding between them - s = sn.sender("qq;{create:always,node:{durable:true}}") - sk = sn.sender("exx/k;{create:always,node:{type:topic, durable:true, x-declare:{type:'direct'}}}") - cluster[0].agent.bind("exx", "qq", "k") - for m in ["foo", "bar", "baz"]: s.send(qm.Message(m, durable=True)) - r = cluster[0].connect().session().receiver("qq") - self.assertEqual(r.fetch().content, "foo") - r.session.acknowledge() - # Sending this message is a hack to flush the dequeue operation on qq. - s.send(qm.Message("flush", durable=True)) - - def verify(broker, x_count): - sn = broker.connect().session() - assert_browse(sn, "qq", [ "bar", "baz", "flush" ]+ (x_count)*["x"]) - sn.sender("exx/k").send(qm.Message("x", durable=True)) - assert_browse(sn, "qq", [ "bar", "baz", "flush" ]+ (x_count+1)*["x"]) - - verify(cluster[0], 0) # Sanity check - cluster.bounce(0) - cluster[0].wait_status("active") - verify(cluster[0], 1) # Loaded from store - cluster.start() - cluster[1].wait_status("ready") - cluster.kill(0) - cluster[1].wait_status("active") - verify(cluster[1], 2) - cluster.bounce(1, promote_next=False) - cluster[1].promote() - cluster[1].wait_status("active") - verify(cluster[1], 3) - - def test_catchup_store(self): - """Verify that a backup erases queue data from store recovery before - doing catch-up from the primary.""" - if self.check_skip(): return - cluster = HaCluster(self, 2) - sn = cluster[0].connect(heartbeat=HaBroker.heartbeat).session() - s1 = sn.sender("q1;{create:always,node:{durable:true}}") - for m in ["foo","bar"]: s1.send(qm.Message(m, durable=True)) - s2 = sn.sender("q2;{create:always,node:{durable:true}}") - sk2 = sn.sender("ex/k2;{create:always,node:{type:topic, durable:true, x-declare:{type:'direct'}}}") - cluster[0].agent.bind("ex", "q2", "k2") - sk2.send(qm.Message("hello", durable=True)) - # Wait for backup to catch up. - cluster[1].assert_browse_backup("q1", ["foo","bar"]) - cluster[1].assert_browse_backup("q2", ["hello"]) - # Make changes that the backup doesn't see - cluster.kill(1, promote_next=False, final=False) - r1 = cluster[0].connect(heartbeat=HaBroker.heartbeat).session().receiver("q1") - for m in ["foo", "bar"]: self.assertEqual(r1.fetch().content, m) - r1.session.acknowledge() - for m in ["x","y","z"]: s1.send(qm.Message(m, durable=True)) - cluster[0].agent.unbind("ex", "q2", "k2") - cluster[0].agent.bind("ex", "q1", "k1") - # Restart both brokers from store to get inconsistent sequence numbering. - cluster.bounce(0, promote_next=False) - cluster[0].promote() - cluster[0].wait_status("active") - cluster.restart(1) - cluster[1].wait_status("ready") - - # Verify state - cluster[0].assert_browse("q1", ["x","y","z"]) - cluster[1].assert_browse_backup("q1", ["x","y","z"]) - - sn = cluster[0].connect(heartbeat=HaBroker.heartbeat).session() - sn.sender("ex/k1").send("boo") - cluster[0].assert_browse_backup("q1", ["x","y","z", "boo"]) - cluster[1].assert_browse_backup("q1", ["x","y","z", "boo"]) - sn.sender("ex/k2").send("hoo") # q2 was unbound so this should be dropped. - sn.sender("q2").send("end") # mark the end of the queue for assert_browse - cluster[0].assert_browse("q2", ["hello", "end"]) - cluster[1].assert_browse_backup("q2", ["hello", "end"]) - -def open_read(name): - try: - f = open(name) - return f.read() - finally: f.close() - -class TransactionTests(HaBrokerTest): - - def tx_simple_setup(self, cluster, broker=0): - """Start a transaction, remove messages from queue a, add messages to queue b""" - c = cluster.connect(broker, protocol=self.tx_protocol) - # Send messages to a, no transaction. - sa = c.session().sender("a;{create:always,node:{durable:true}}") - tx_msgs = ["x","y","z"] - for m in tx_msgs: sa.send(qm.Message(content=m, durable=True)) - sa.close() - - # Receive messages from a, in transaction. - tx = c.session(transactional=True) - txr = tx.receiver("a") - tx_msgs2 = [txr.fetch(1).content for i in xrange(3)] - self.assertEqual(tx_msgs, tx_msgs2) - - # Send messages to b, transactional, mixed with non-transactional. - sb = c.session().sender("b;{create:always,node:{durable:true}}") - txs = tx.sender("b") - msgs = [str(i) for i in xrange(3)] - for tx_m,m in zip(tx_msgs2, msgs): - txs.send(tx_m); - sb.send(m) - sb.close() - return tx - - def test_tx_simple_commit(self): - cluster = HaCluster(self, 2, test_store=True, wait=True) - tx = self.tx_simple_setup(cluster) - tx.sync() - tx.acknowledge() - # Pre transaction - messages are acquired on primary but not yet dequeued - # so still there on backup. - cluster[0].assert_browse_backup("a", []) - cluster[1].assert_browse_backup("a", ['x', 'y', 'z']) - for b in cluster: - b.assert_browse_backup("b", ['0', '1', '2']) - tx.commit() - tx.sync() - tx.close() - - # Post transaction: all synced. - for b in cluster: - b.assert_browse_backup("a", []) - b.assert_browse_backup("b", ['0', '1', '2', "x","y","z"]) - - # Verify non-tx dequeue is replicated correctly - c = cluster.connect(0, protocol=self.tx_protocol) - r = c.session().receiver("b") - ri = receiver_iter(r, timeout=1) - self.assertEqual(['0', '1', '2', 'x', 'y', 'z'], [m.content for m in ri]) - r.session.acknowledge() - for b in cluster: b.assert_browse_backup("b", [], msg=b) - c.close() - tx.connection.close() - - def test_tx_simple_rollback(self): - cluster = HaCluster(self, 2, test_store=True) - tx = self.tx_simple_setup(cluster) - tx.sync() - tx.acknowledge() - tx.rollback() - - for b in cluster: - b.assert_browse_backup("a", ["x","y","z"]) - b.assert_browse_backup("b", ['0', '1', '2']) - - tx.close() - tx.connection.close() - - - def test_tx_simple_failure(self): - """Verify we throw TransactionAborted if there is a fail-over during a transaction""" - cluster = HaCluster(self, 3, test_store=True) - tx = self.tx_simple_setup(cluster) - tx.sync() - tx_queues = cluster[0].agent.tx_queues() - tx.acknowledge() - l = LogLevel(ERROR) # Hide expected WARNING log messages from failover. - try: - cluster.bounce(0) # Should cause roll-back - tx.connection.session() # Wait for reconnect - self.assertRaises(qm.TransactionAborted, tx.sync) - self.assertRaises(qm.TransactionAborted, tx.commit) - try: tx.connection.close() - except qm.TransactionAborted: pass # Occasionally get exception on close. - for b in cluster: - b.assert_browse_backup("a", ["x","y","z"]) - b.assert_browse_backup("b", ['0', '1', '2']) - finally: l.restore() - - def test_tx_join_leave(self): - """Test cluster members joining/leaving cluster. - Also check that tx-queues are cleaned up at end of transaction.""" - - cluster = HaCluster(self, 3) - - # Leaving - tx = cluster[0].connect(protocol=self.tx_protocol).session(transactional=True) - s = tx.sender("q;{create:always}") - s.send("a", sync=True) - cluster[1].kill(final=False) - s.send("b") - tx.commit() - tx.connection.close() - for b in [cluster[0],cluster[2]]: - b.assert_browse_backup("q", ["a","b"], msg=b) - # Joining - tx = cluster[0].connect(protocol=self.tx_protocol).session(transactional=True) - s = tx.sender("q;{create:always}") - s.send("foo") - cluster.restart(1) # Not a part of the current transaction. - tx.commit() - tx.connection.close() - # The new member is not in the tx but receives the results normal replication. - for b in cluster: b.assert_browse_backup("q", ["a", "b", "foo"], msg=b) - - def test_tx_block_threads(self): - """Verify that TXs blocked in commit don't deadlock.""" - cluster = HaCluster(self, 2, args=["--worker-threads=2"], test_store=True) - n = 10 # Number of concurrent transactions - sessions = [cluster.connect(0, protocol=self.tx_protocol).session(transactional=True) for i in xrange(n)] - # Have the store delay the response for 10s - for s in sessions: - sn = s.sender("qq;{create:always,node:{durable:true}}") - sn.send(qm.Message("foo", durable=True)) - threads = [ Thread(target=s.commit) for s in sessions] - for t in threads: t.start() - cluster[0].ready(timeout=1) # Check for deadlock - for b in cluster: b.assert_browse_backup('qq', ['foo']*n) - for t in threads: t.join() - for s in sessions: s.connection.close() - - def test_other_tx_tests(self): - try: - import qpid_tests.broker_0_10 - except ImportError: - raise Skipped("Tests not found") - cluster = HaCluster(self, 3) - if "QPID_PORT" in os.environ: del os.environ["QPID_PORT"] - self.popen(["qpid-txtest2", "--broker", cluster[0].host_port()]).assert_exit_ok() - print - self.popen(["qpid-python-test", - "-m", "qpid_tests.broker_0_10", - "-m", "qpid_tests.broker_1_0", - "-b", "localhost:%s"%(cluster[0].port()), - "*.tx.*"], stdout=None, stderr=None).assert_exit_ok() - -if __name__ == "__main__": - outdir = "ha_tests.tmp" - shutil.rmtree(outdir, True) - os.execvp("qpid-python-test", - ["qpid-python-test", "-m", "ha_tests", "-DOUTDIR=%s"%outdir] - + sys.argv[1:]) - diff --git a/qpid/cpp/src/tests/header_test.cpp b/qpid/cpp/src/tests/header_test.cpp deleted file mode 100644 index c36b4f3bc3..0000000000 --- a/qpid/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/qpid/cpp/src/tests/header_test.py b/qpid/cpp/src/tests/header_test.py deleted file mode 100755 index d5a2c16c01..0000000000 --- a/qpid/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/qpid/cpp/src/tests/headers_federation.py b/qpid/cpp/src/tests/headers_federation.py deleted file mode 100644 index 60cff1da54..0000000000 --- a/qpid/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/qpid/cpp/src/tests/idle_timeout_tests.py b/qpid/cpp/src/tests/idle_timeout_tests.py deleted file mode 100755 index 877ec19164..0000000000 --- a/qpid/cpp/src/tests/idle_timeout_tests.py +++ /dev/null @@ -1,96 +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 -import shutil -import signal -import sys - -from brokertest import * -from qpid.harness import Skipped - -class AmqpIdleTimeoutTest(BrokerTest): - """ - Test AMQP 1.0 idle-timeout support - """ - def setUp(self): - BrokerTest.setUp(self) - if not BrokerTest.amqp_lib: - raise Skipped("AMQP 1.0 library not found") - if qm != qpid_messaging: - raise Skipped("AMQP 1.0 client not found") - self._broker = self.broker() - - def test_client_timeout(self): - """Ensure that the client disconnects should the broker stop - responding. - """ - conn = self._broker.connect(native=False, timeout=None, - protocol="amqp1.0", heartbeat=1) - self.assertTrue(conn.isOpen()) - # should disconnect within 2 seconds of broker stop - deadline = time.time() + 8 - os.kill(self._broker.pid, signal.SIGSTOP) - while time.time() < deadline: - if not conn.isOpen(): - break; - self.assertTrue(not conn.isOpen()) - os.kill(self._broker.pid, signal.SIGCONT) - - - def test_broker_timeout(self): - """By default, the broker will adopt the same timeout as the client - (mimics the 0-10 timeout behavior). Verify the broker disconnects - unresponsive clients. - """ - - count = len(self._broker.agent.getAllConnections()) - - # Create a new connection to the broker: - receiver_cmd = ["qpid-receive", - "--broker", self._broker.host_port(), - "--address=amq.fanout", - "--connection-options={protocol:amqp1.0, heartbeat:1}", - "--forever"] - receiver = self.popen(receiver_cmd, stdout=PIPE, stderr=PIPE, - expect=EXPECT_UNKNOWN) - start = time.time() - deadline = time.time() + 10 - while time.time() < deadline: - if count < len(self._broker.agent.getAllConnections()): - break; - self.assertTrue(count < len(self._broker.agent.getAllConnections())) - - # now 'hang' the client, the broker should disconnect - start = time.time() - os.kill(receiver.pid, signal.SIGSTOP) - deadline = time.time() + 10 - while time.time() < deadline: - if count == len(self._broker.agent.getAllConnections()): - break; - self.assertEqual(count, len(self._broker.agent.getAllConnections())) - os.kill(receiver.pid, signal.SIGCONT) - receiver.teardown() - - -if __name__ == "__main__": - shutil.rmtree("brokertest.tmp", True) - os.execvp("qpid-python-test", - ["qpid-python-test", "-m", "idle_timeout_tests"] + sys.argv[1:]) diff --git a/qpid/cpp/src/tests/interlink_tests.py b/qpid/cpp/src/tests/interlink_tests.py deleted file mode 100755 index 8833f06af5..0000000000 --- a/qpid/cpp/src/tests/interlink_tests.py +++ /dev/null @@ -1,331 +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, random, logging, shutil, math, unittest, random -import traceback -from qpid.messaging import Message, SessionError, NotFound, ConnectionError, ReceiverError, Connection, Timeout, Disposition, REJECTED, Empty -from brokertest import * -from ha_test import HaPort -from threading import Thread, Lock, Condition -from logging import getLogger, WARN, ERROR, DEBUG, INFO -from qpidtoollibs import BrokerObject - -class Domain(BrokerObject): - def __init__(self, broker, values): - BrokerObject.__init__(self, broker, values) - -class Config: - def __init__(self, broker, address="q;{create:always}", version="amqp1.0"): - self.url = broker.host_port() - self.address = address - self.version = version - - def __str__(self): - return "url: %s, address: %s, version: %s" % (self.url, self.address, self.version) - -class AmqpBrokerTest(BrokerTest): - """ - Tests using AMQP 1.0 support - """ - def setUp(self): - BrokerTest.setUp(self) - self.port_holder = HaPort(self) - self.broker = self.amqp_broker(port_holder=self.port_holder) - self.default_config = Config(self.broker) - self.agent = self.broker.agent - - def sender(self, config, reply_to=None): - cmd = ["qpid-send", - "--broker", config.url, - "--address", config.address, - "--connection-options", "{protocol:%s}" % config.version, - "--content-stdin", "--send-eos=1" - ] - if reply_to: - cmd.append( "--reply-to=%s" % reply_to) - return self.popen(cmd, stdin=PIPE) - - def receiver(self, config): - cmd = ["qpid-receive", - "--broker", config.url, - "--address", config.address, - "--connection-options", "{protocol:%r}" % config.version, - "--timeout=10" - ] - return self.popen(cmd, stdout=PIPE) - - def ready_receiver(self, config): - s = self.broker.connect().session() - r = s.receiver("readyq; {create:always}") - cmd = ["qpid-receive", - "--broker", config.url, - "--address", config.address, - "--connection-options", "{protocol:%r}" % config.version, - "--timeout=10", "--ready-address=readyq;{create:always}" - ] - result = self.popen(cmd, stdout=PIPE) - r.fetch(timeout=1) # wait until receiver is actually ready - s.acknowledge() - r.close() - s.close() - return result - - def send_and_receive(self, send_config=None, recv_config=None, count=1000, reply_to=None, wait_for_receiver=False, debug=False): - if debug: - print "sender config is %s" % (send_config or self.default_config) - print "receiver config is %s" % (recv_config or self.default_config) - sender = self.sender(send_config or self.default_config, reply_to) - sender._set_cloexec_flag(sender.stdin) #required for older python, see http://bugs.python.org/issue4112 - if wait_for_receiver: - receiver = self.ready_receiver(recv_config or self.default_config) - else: - receiver = self.receiver(recv_config or self.default_config) - - messages = ["message-%s" % (i+1) for i in range(count)] - for m in messages: - sender.stdin.write(m + "\n") - sender.stdin.flush() - sender.stdin.close() - if debug: - c = send_config or self.default_config - print "sent %s messages to %s sn %s" % (len(messages), c.address, c.url) - - if debug: - c = recv_config or self.default_config - print "reading messages from %s sn %s" % (c.address, c.url) - for m in messages: - l = receiver.stdout.readline().rstrip() - if debug: - print l - assert m == l, (m, l) - - sender.wait() - receiver.wait() - - def test_simple(self): - self.send_and_receive() - - def test_translate1(self): - self.send_and_receive(recv_config=Config(self.broker, version="amqp0-10")) - - def test_translate2(self): - self.send_and_receive(send_config=Config(self.broker, version="amqp0-10")) - - def test_translate_with_large_routingkey(self): - self.send_and_receive(send_config=Config(self.broker, address="amq.topic/a.%s" % ("x" * 256), version="amqp1.0"), recv_config=Config(self.broker, address="amq.topic/a.*", version="amqp0-10"), wait_for_receiver=True) - - def send_and_receive_empty(self, send_config=None, recv_config=None): - sconfig = send_config or self.default_config - rconfig = recv_config or self.default_config - send_cmd = ["qpid-send", - "--broker", sconfig.url, - "--address=%s" % sconfig.address, - "--connection-options={protocol:%s}" % sconfig.version, - "--content-size=0", - "--messages=1", - "-P", "my-header=abc" - ] - sender = self.popen(send_cmd) - sender.wait() - receive_cmd = ["qpid-receive", - "--broker", rconfig.url, - "--address=%s" % rconfig.address, - "--connection-options={protocol:%s}" % rconfig.version, - "--messages=1", - "--print-content=false", "--print-headers=true" - ] - receiver = self.popen(receive_cmd, stdout=PIPE) - l = receiver.stdout.read() - assert "my-header:abc" in l - receiver.wait() - - def test_translate_empty_1(self): - self.send_and_receive_empty(recv_config=Config(self.broker, version="amqp0-10")) - - def test_translate_empty_2(self): - self.send_and_receive_empty(send_config=Config(self.broker, version="amqp0-10")) - - def request_response(self, reply_to, send_config=None, request_config=None, response_config=None, count=1000, wait_for_receiver=False): - rconfig = request_config or self.default_config - echo_cmd = ["qpid-receive", - "--broker", rconfig.url, - "--address=%s" % rconfig.address, - "--connection-options={protocol:%s}" % rconfig.version, - "--timeout=10", "--print-content=false", "--print-headers=false" - ] - requests = self.popen(echo_cmd) - self.send_and_receive(send_config, response_config, count, reply_to=reply_to, wait_for_receiver=wait_for_receiver) - requests.wait() - - def request_response_local(self, request_address, response_address, wait_for_receiver=False, request_version="amqp1.0", echo_version="amqp1.0"): - self.request_response(response_address, send_config=Config(self.broker, address=request_address, version=request_version), request_config=Config(self.broker, address=request_address, version=echo_version), response_config=Config(self.broker, address=response_address, version=request_version), wait_for_receiver=wait_for_receiver) - - def test_request_reponse_queue(self): - self.agent.create("queue", "q1") - self.agent.create("queue", "q2") - self.request_response_local("q1", "q2") - - def test_request_reponse_queue_translated1(self): - self.agent.create("queue", "q1") - self.agent.create("queue", "q2") - self.request_response_local("q1", "q2", request_version="amqp0-10", echo_version="amqp1.0") - - def test_request_reponse_queue_translated2(self): - self.agent.create("queue", "q1") - self.agent.create("queue", "q2") - self.request_response_local("q1", "q2", request_version="amqp1.0", echo_version="amqp0-10") - - def test_request_reponse_exchange(self): - self.agent.create("queue", "q1") - self.request_response_local("q1", "amq.fanout", wait_for_receiver=True) - - def test_request_reponse_exchange_translated1(self): - self.agent.create("queue", "q1") - self.request_response_local("q1", "amq.fanout", wait_for_receiver=True, request_version="amqp0-10", echo_version="amqp1.0") - - def test_request_reponse_exchange_translated2(self): - self.agent.create("queue", "q1") - self.request_response_local("q1", "amq.fanout", wait_for_receiver=True, request_version="amqp1.0", echo_version="amqp0-10") - - def test_request_reponse_exchange_with_subject(self): - self.agent.create("queue", "q1") - self.request_response_local("q1", "amq.topic/abc; {node:{type:topic}}", wait_for_receiver=True) - - def test_request_reponse_exchange_with_subject_translated1(self): - self.agent.create("queue", "q1") - self.request_response_local("q1", "amq.topic/abc; {node:{type:topic}}", wait_for_receiver=True, request_version="amqp0-10", echo_version="amqp1.0") - - def test_request_reponse_exchange_with_subject_translated2(self): - self.agent.create("queue", "q1") - self.request_response_local("q1", "amq.topic/abc; {node:{type:topic}}", wait_for_receiver=True, request_version="amqp1.0", echo_version="amqp0-10") - - def test_domain(self): - brokerB = self.amqp_broker() - self.agent.create("domain", "BrokerB", {"url":brokerB.host_port()}) - domains = self.agent._getAllBrokerObjects(Domain) - assert len(domains) == 1 - assert domains[0].name == "BrokerB" - - def incoming_link(self, mechanism): - brokerB = self.amqp_broker() - agentB = brokerB.agent - self.agent.create("queue", "q") - agentB.create("queue", "q") - self.agent.create("domain", "BrokerB", {"url":brokerB.host_port(), "sasl_mechanisms":mechanism}) - self.agent.create("incoming", "Link1", {"domain":"BrokerB","source":"q","target":"q"}) - #send to brokerB, receive from brokerA - self.send_and_receive(send_config=Config(brokerB)) - - def test_incoming_link_anonymous(self): - self.incoming_link("ANONYMOUS") - - def test_incoming_link_nosasl(self): - self.incoming_link("NONE") - - def test_outgoing_link(self): - brokerB = self.amqp_broker() - agentB = brokerB.agent - self.agent.create("queue", "q") - agentB.create("queue", "q") - self.agent.create("domain", "BrokerB", {"url":brokerB.host_port(), "sasl_mechanisms":"NONE"}) - self.agent.create("outgoing", "Link1", {"domain":"BrokerB","source":"q","target":"q"}) - #send to brokerA, receive from brokerB - self.send_and_receive(recv_config=Config(brokerB)) - - def test_relay(self): - brokerB = self.amqp_broker() - agentB = brokerB.agent - agentB.create("queue", "q") - self.agent.create("domain", "BrokerB", {"url":brokerB.host_port(), "sasl_mechanisms":"NONE"}) - #send to q on broker B through brokerA - self.send_and_receive(send_config=Config(self.broker, address="q@BrokerB"), recv_config=Config(brokerB)) - - def test_reconnect(self): - receiver_cmd = ["qpid-receive", - "--broker", self.broker.host_port(), - "--address=amq.fanout", - "--connection-options={protocol:amqp1.0, reconnect:True,container_id:receiver}", - "--timeout=10", "--print-content=true", "--print-headers=false" - ] - receiver = self.popen(receiver_cmd, stdout=PIPE) - - sender_cmd = ["qpid-send", - "--broker", self.broker.host_port(), - "--address=amq.fanout", - "--connection-options={protocol:amqp1.0,reconnect:True,container_id:sender}", - "--content-stdin", "--send-eos=1" - ] - sender = self.popen(sender_cmd, stdin=PIPE) - sender._set_cloexec_flag(sender.stdin) #required for older python, see http://bugs.python.org/issue4112 - - - batch1 = ["message-%s" % (i+1) for i in range(10000)] - for m in batch1: - sender.stdin.write(m + "\n") - sender.stdin.flush() - - self.broker.kill() - self.broker = self.amqp_broker(port_holder=self.port_holder) - - batch2 = ["message-%s" % (i+1) for i in range(10000, 20000)] - for m in batch2: - sender.stdin.write(m + "\n") - sender.stdin.flush() - - sender.stdin.close() - - last = None - m = receiver.stdout.readline().rstrip() - while len(m): - last = m - m = receiver.stdout.readline().rstrip() - assert last == "message-20000", (last) - - """ Create and return a broker with AMQP 1.0 support """ - def amqp_broker(self): - assert BrokerTest.amqp_lib, "Cannot locate AMQP 1.0 plug-in" - self.port_holder = HaPort(self) #reserve port - args = ["--load-module", BrokerTest.amqp_lib, - "--socket-fd=%s" % self.port_holder.fileno, - "--listen-disable=tcp", - "--log-enable=trace+:Protocol", - "--log-enable=info+"] - return BrokerTest.broker(self, args, port=self.port_holder.port) - - def amqp_broker(self, port_holder=None): - assert BrokerTest.amqp_lib, "Cannot locate AMQP 1.0 plug-in" - if port_holder: - args = ["--load-module", BrokerTest.amqp_lib, - "--socket-fd=%s" % port_holder.fileno, - "--listen-disable=tcp", - "--log-enable=trace+:Protocol", - "--log-enable=info+"] - return BrokerTest.broker(self, args, port=port_holder.port) - else: - args = ["--load-module", BrokerTest.amqp_lib, - "--log-enable=trace+:Protocol", - "--log-enable=info+"] - return BrokerTest.broker(self, args) - - -if __name__ == "__main__": - shutil.rmtree("brokertest.tmp", True) - os.execvp("qpid-python-test", - ["qpid-python-test", "-m", "interlink_tests"] + sys.argv[1:]) diff --git a/qpid/cpp/src/tests/interop_tests.py b/qpid/cpp/src/tests/interop_tests.py deleted file mode 100755 index 31182f324a..0000000000 --- a/qpid/cpp/src/tests/interop_tests.py +++ /dev/null @@ -1,217 +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. -# - -""" -A set of tests that can be run against a foreign AMQP 1.0 broker. - -RUNNING WITH A FOREIGN BROKER: - -1. Start the broker -2. Create persistent queues named: interop-a interop-b interop-q tx-1 tx-2 -3. Export the environment variable QPID_INTEROP_URL with the URL to connect to your broker - in the form [user[:password]@]host[:port] -4. From the build directory run this test: - ctest -VV -R interop_tests - -If QPID_INTEROP_URL is not set, a qpidd broker will be started for the test. -""" - -import os, sys, shutil, subprocess -import qpid_messaging as qm -from brokertest import * - -URL='QPID_INTEROP_URL' - -class InteropTest(BrokerTest): - - def setUp(self): - super(InteropTest, self).setUp() - self.url = os.environ[URL] - self.connect_opts = ['--broker', self.url, '--connection-options', '{protocol:amqp1.0}'] - - def connect(self, **kwargs): - """Python connection to interop URL""" - c = qm.Connection.establish(self.url, protocol='amqp1.0', **kwargs) - self.teardown_add(c) - return c - - def drain(self, queue, connection=None): - """ - Drain a queue to make sure it is empty. Throw away the messages. - """ - c = connection or self.connect() - r = c.session().receiver(queue) - try: - while True: - r.fetch(timeout=0) - r.session.acknowledge() - except qm.Empty: - pass - r.close() - - def clear_queue(self, queue, connection=None, properties=None, durable=False): - """ - Make empty queue, prefix with self.id(). Create if needed, drain if needed - @return queue name. - """ - queue = "interop-%s" % queue - c = connection or self.connect() - props = {'create':'always'} - if durable: props['node'] = {'durable':True} - if properties: props.update(properties) - self.drain("%s;%s" % (queue, props), c) - return queue - - -class SimpleTest(InteropTest): - """Simple test to check the broker is responding.""" - - def test_send_receive_python(self): - c = self.connect() - q = self.clear_queue('q', c) - s = c.session() - s.sender(q).send('foo') - self.assertEqual('foo', s.receiver(q).fetch().content) - - def test_send_receive_cpp(self): - q = self.clear_queue('q') - args = ['-b', self.url, '-a', q] - self.check_output(['qpid-send', '--content-string=cpp_foo'] + args) - self.assertEqual('cpp_foo', self.check_output(['qpid-receive'] + args).strip()) - - -class PythonTxTest(InteropTest): - - def tx_simple_setup(self): - """Start a transaction, remove messages from queue a, add messages to queue b""" - c = self.connect() - qa, qb = self.clear_queue('a', c, durable=True), self.clear_queue('b', c, durable=True) - - # Send messages to a, no transaction. - sa = c.session().sender(qa+";{create:always,node:{durable:true}}") - tx_msgs = ['x', 'y', 'z'] - for m in tx_msgs: sa.send(qm.Message(content=m, durable=True)) - - # Receive messages from a, in transaction. - tx = c.session(transactional=True) - txr = tx.receiver(qa) - self.assertEqual(tx_msgs, [txr.fetch(1).content for i in xrange(3)]) - tx.acknowledge() - - # Send messages to b, transactional, mixed with non-transactional. - sb = c.session().sender(qb+";{create:always,node:{durable:true}}") - txs = tx.sender(qb) - msgs = [str(i) for i in xrange(3)] - for tx_m, m in zip(tx_msgs, msgs): - txs.send(tx_m); - sb.send(m) - tx.sync() - return tx, qa, qb - - def test_tx_simple_commit(self): - tx, qa, qb = self.tx_simple_setup() - s = self.connect().session() - assert_browse(s, qa, []) - assert_browse(s, qb, ['0', '1', '2']) - tx.commit() - assert_browse(s, qa, []) - assert_browse(s, qb, ['0', '1', '2', 'x', 'y', 'z']) - - def test_tx_simple_rollback(self): - tx, qa, qb = self.tx_simple_setup() - s = self.connect().session() - assert_browse(s, qa, []) - assert_browse(s, qb, ['0', '1', '2']) - tx.rollback() - assert_browse(s, qa, ['x', 'y', 'z']) - assert_browse(s, qb, ['0', '1', '2']) - - def test_tx_sequence(self): - tx = self.connect().session(transactional=True) - notx = self.connect().session() - q = self.clear_queue('q', tx.connection, durable=True) - s = tx.sender(q) - r = tx.receiver(q) - s.send('a') - tx.commit() - assert_browse(notx, q, ['a']) - s.send('b') - tx.commit() - assert_browse(notx, q, ['a', 'b']) - self.assertEqual('a', r.fetch().content) - tx.acknowledge(); - tx.commit() - assert_browse(notx, q, ['b']) - s.send('z') - tx.rollback() - assert_browse(notx, q, ['b']) - self.assertEqual('b', r.fetch().content) - tx.acknowledge(); - tx.rollback() - assert_browse(notx, q, ['b']) - - -class CppTxTest(InteropTest): - - def test_txtest2(self): - self.popen(["qpid-txtest2"] + self.connect_opts).assert_exit_ok() - - def test_send_receive(self): - q = self.clear_queue('q', durable=True) - sender = self.popen(["qpid-send", - "--address", q, - "--messages=100", - "--tx=10", - "--durable=yes"] + self.connect_opts) - receiver = self.popen(["qpid-receive", - "--address", q, - "--messages=90", - "--timeout=10", - "--tx=10"] + self.connect_opts) - sender.assert_exit_ok() - receiver.assert_exit_ok() - expect = [long(i) for i in range(91, 101)] - sn = lambda m: m.properties["sn"] - assert_browse(self.connect().session(), q, expect, transform=sn) - - -if __name__ == "__main__": - from env import * - outdir = "interop_tests.tmp" - shutil.rmtree(outdir, True) - cmd = ["qpid-python-test", "-m", "interop_tests", "-DOUTDIR=%s"%outdir] + sys.argv[1:] - if "QPID_PORT" in os.environ: del os.environ["QPID_PORT"] - if os.environ.get(URL): - os.execvp(cmd[0], cmd) - else: - dir = os.getcwd() - class StartBroker(BrokerTest): - def start_qpidd(self): pass - test = StartBroker('start_qpidd') - class Config: - def __init__(self): - self.defines = { 'OUTDIR': outdir } - test.configure(Config()) - test.setUp() - os.environ[URL] = test.broker().host_port() - os.chdir(dir) - p = subprocess.Popen(cmd) - status = p.wait() - test.tearDown() - sys.exit(status) diff --git a/qpid/cpp/src/tests/legacystore/.valgrind.supp b/qpid/cpp/src/tests/legacystore/.valgrind.supp deleted file mode 100644 index 5c1c5377bf..0000000000 --- a/qpid/cpp/src/tests/legacystore/.valgrind.supp +++ /dev/null @@ -1,35 +0,0 @@ -{ - <insert_a_suppression_name_here> - Memcheck:Leak - fun:_Znwm - fun:_ZNSs4_Rep9_S_createEmmRKSaIcE - fun:_ZNSs12_S_constructIPKcEEPcT_S3_RKSaIcESt20forward_iterator_tag - fun:_ZNSsC1EPKcRKSaIcE -} - -{ - <insert_a_suppression_name_here> - Memcheck:Leak - fun:_Znwm - fun:_ZNSs4_Rep9_S_createEmmRKSaIcE - fun:_ZNSs4_Rep8_M_cloneERKSaIcEm - fun:_ZNSs7reserveEm -} - -{ - <insert_a_suppression_name_here> - Memcheck:Leak - fun:_Znwm - fun:_ZNSs4_Rep9_S_createEmmRKSaIcE - fun:_ZNSs9_M_mutateEmmm - fun:_ZNSs15_M_replace_safeEmmPKcm -} - -{ - <insert_a_suppression_name_here> - Memcheck:Leak - fun:_Znwm - fun:_ZNSs4_Rep9_S_createEmmRKSaIcE - fun:_ZNSsC1IPcEET_S1_RKSaIcE -} - diff --git a/qpid/cpp/src/tests/legacystore/.valgrindrc b/qpid/cpp/src/tests/legacystore/.valgrindrc deleted file mode 100644 index 4aba7661de..0000000000 --- a/qpid/cpp/src/tests/legacystore/.valgrindrc +++ /dev/null @@ -1,7 +0,0 @@ ---gen-suppressions=all ---leak-check=full ---demangle=yes ---suppressions=.valgrind.supp ---num-callers=25 ---trace-children=yes - diff --git a/qpid/cpp/src/tests/legacystore/CMakeLists.txt b/qpid/cpp/src/tests/legacystore/CMakeLists.txt deleted file mode 100644 index 20a242b415..0000000000 --- a/qpid/cpp/src/tests/legacystore/CMakeLists.txt +++ /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. -# - -if(BUILD_LEGACYSTORE AND BUILD_TESTING) - -message(STATUS "Building legacystore tests") - -# If we're linking Boost for DLLs, turn that on for the tests too. -if (QPID_LINK_BOOST_DYNAMIC) - add_definitions(-DBOOST_TEST_DYN_LINK) -endif (QPID_LINK_BOOST_DYNAMIC) - -include_directories( ${CMAKE_CURRENT_SOURCE_DIR} ) - -if (BUILD_TESTING_UNITTESTS) - -# Like this to work with cmake 2.4 on Unix -set (qpid_test_boost_libs - ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY} ${Boost_SYSTEM_LIBRARY}) - -# Journal tests -MACRO (define_journal_test mainSourceFile) -if ("${ARGV1}" STREQUAL "LONG") - set (testname "journal_long_${mainSourceFile}") -else () - set (testname "journal_${mainSourceFile}") -endif () -add_executable (${testname} - jrnl/${mainSourceFile} - unit_test - ${platform_test_additions}) -target_link_libraries (${testname} - ${qpid_test_boost_libs} - ${clock_gettime_LIB} legacystore_shared) -if ("${ARGV1}" STREQUAL "LONG") - set_target_properties(${testname} PROPERTIES COMPILE_DEFINITIONS LONG_TEST) -endif () -add_test (NAME ${testname} COMMAND ${CMAKE_BINARY_DIR}/src/tests/run.sh $<TARGET_FILE:${testname}>) -unset (testname) -ENDMACRO (define_journal_test) - -define_journal_test (_ut_time_ns) -define_journal_test (_ut_jexception) -define_journal_test (_ut_jerrno) -define_journal_test (_ut_rec_hdr) -define_journal_test (_ut_jinf) -define_journal_test (_ut_jdir) -define_journal_test (_ut_enq_map) -define_journal_test (_ut_txn_map) -define_journal_test (_ut_lpmgr) -define_journal_test (_st_basic) -define_journal_test (_st_basic_txn) -define_journal_test (_st_read) -define_journal_test (_st_read_txn) -define_journal_test (_st_auto_expand) -define_journal_test (_ut_lpmgr LONG) -define_journal_test (_st_basic LONG) -define_journal_test (_st_read LONG) - -add_executable (jtt__ut - jrnl/jtt/_ut_data_src.cpp - jrnl/jtt/_ut_jrnl_init_params.cpp - jrnl/jtt/_ut_read_arg.cpp - jrnl/jtt/_ut_jrnl_instance.cpp - jrnl/jtt/_ut_test_case.cpp - jrnl/jtt/_ut_test_case_result.cpp - jrnl/jtt/_ut_test_case_result_agregation.cpp - jrnl/jtt/_ut_test_case_set.cpp - jrnl/jtt/args.cpp - jrnl/jtt/data_src.cpp - jrnl/jtt/jrnl_init_params.cpp - jrnl/jtt/jrnl_instance.cpp - jrnl/jtt/read_arg.cpp - jrnl/jtt/test_case.cpp - jrnl/jtt/test_case_set.cpp - jrnl/jtt/test_case_result.cpp - jrnl/jtt/test_case_result_agregation.cpp - unit_test.cpp) - -target_link_libraries (jtt__ut - ${qpid_test_boost_libs} - ${Boost_PROGRAM_OPTIONS_LIBRARY} - ${clock_gettime_LIB} legacystore_shared) - -add_test(journal_jtt_ut ${CMAKE_BINARY_DIR}/src/tests/run.sh ${CMAKE_CURRENT_BINARY_DIR}/jtt__ut) - -endif (BUILD_TESTING_UNITTESTS) - -# -# Other test programs -# - -add_executable(jtt - jrnl/jtt/args.cpp - jrnl/jtt/data_src.cpp - jrnl/jtt/jrnl_init_params.cpp - jrnl/jtt/jrnl_instance.cpp - jrnl/jtt/main.cpp - jrnl/jtt/read_arg.cpp - jrnl/jtt/test_case.cpp - jrnl/jtt/test_case_result.cpp - jrnl/jtt/test_case_result_agregation.cpp - jrnl/jtt/test_case_set.cpp - jrnl/jtt/test_mgr.cpp) - -target_link_libraries (jtt - ${Boost_PROGRAM_OPTIONS_LIBRARY} - ${clock_gettime_LIB} legacystore_shared) - -add_test(journal_jtt ${CMAKE_CURRENT_BINARY_DIR}/jtt -c ${CMAKE_CURRENT_SOURCE_DIR}/jrnl/jtt/jtt.csv) - -add_test(legacystore_python_tests ${PYTHON_EXECUTABLE} run_python_tests) - -endif (BUILD_LEGACYSTORE AND BUILD_TESTING) diff --git a/qpid/cpp/src/tests/legacystore/MessageUtils.h b/qpid/cpp/src/tests/legacystore/MessageUtils.h deleted file mode 100644 index cd23244293..0000000000 --- a/qpid/cpp/src/tests/legacystore/MessageUtils.h +++ /dev/null @@ -1,105 +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/Queue.h> -#include <qpid/broker/amqp_0_10/MessageTransfer.h> -#include <qpid/framing/AMQFrame.h> -#include <qpid/framing/all_method_bodies.h> -#include <qpid/framing/Uuid.h> - -using namespace qpid::broker; -using namespace qpid::framing; - -struct MessageUtils -{ - static Message createMessage(const std::string& exchange, const std::string& routingKey, - const Uuid& messageId=Uuid(), const bool durable = false, - const uint64_t contentSize = 0, const std::string& correlationId = std::string()) - { - boost::intrusive_ptr<qpid::broker::amqp_0_10::MessageTransfer> msg(new qpid::broker::amqp_0_10::MessageTransfer()); - - 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); - props->setCorrelationId(correlationId); - msg->getFrames().getHeaders()->get<DeliveryProperties>(true)->setRoutingKey(routingKey); - if (durable) - msg->getFrames().getHeaders()->get<DeliveryProperties>(true)->setDeliveryMode(PERSISTENT); - return Message(msg, msg); - } - - static void addContent(Message msg, const std::string& data) - { - AMQFrame content((AMQContentBody(data))); - qpid::broker::amqp_0_10::MessageTransfer::get(msg).getFrames().append(content); - } - - struct MessageRetriever : public Consumer - { - MessageRetriever(Queue& q) : Consumer("test", CONSUMER), queue(q) {}; - - bool deliver(const QueueCursor& c, const Message& m) - { - message = m; - cursor = c; - return true; - }; - void notify() {} - void cancel() {} - void acknowledged(const DeliveryRecord&) {} - OwnershipToken* getSession() { return 0; } - - const Queue& queue; - Message message; - QueueCursor cursor; - }; - - static Message get(Queue& queue, QueueCursor* cursor = 0) - { - boost::shared_ptr<MessageRetriever> consumer(new MessageRetriever(queue)); - if (!queue.dispatch(consumer))throw qpid::Exception("No message found!"); - if (cursor) *cursor = consumer->cursor; - return consumer->message; - } - - static Uuid getMessageId(const Message& message) - { - return qpid::broker::amqp_0_10::MessageTransfer::get(message).getProperties<MessageProperties>()->getMessageId(); - } - - static std::string getCorrelationId(const Message& message) - { - return qpid::broker::amqp_0_10::MessageTransfer::get(message).getProperties<MessageProperties>()->getCorrelationId(); - } - - static void deliver(Message& msg, FrameHandler& h, uint16_t framesize) - { - qpid::broker::amqp_0_10::MessageTransfer::get(msg).sendHeader(h, framesize, false, 0, qpid::types::Variant::Map()); - qpid::broker::amqp_0_10::MessageTransfer::get(msg).sendContent(h, framesize); - } - -}; diff --git a/qpid/cpp/src/tests/legacystore/TestFramework.cpp b/qpid/cpp/src/tests/legacystore/TestFramework.cpp deleted file mode 100644 index 2f7faf7682..0000000000 --- a/qpid/cpp/src/tests/legacystore/TestFramework.cpp +++ /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. - * - */ - -// Defines broker to be used by tests - -#include "unit_test.h" -#include "TestFramework.h" -#include "qpid/broker/Broker.h" - -#include <iostream> - -//BOOST_GLOBAL_FIXTURE( testBroker ) diff --git a/qpid/cpp/src/tests/legacystore/TestFramework.h b/qpid/cpp/src/tests/legacystore/TestFramework.h deleted file mode 100644 index f3066db602..0000000000 --- a/qpid/cpp/src/tests/legacystore/TestFramework.h +++ /dev/null @@ -1,37 +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. - * - */ - -// Defines broker to be used by tests - -#include "unit_test.h" - -#include <qpid/broker/Broker.h> - -namespace { - // test broker - qpid::broker::Broker::Options opts; - qpid::broker::Broker br(opts); -/* - struct testBroker { - testBroker() {} - ~testBroker() {} - };*/ -} diff --git a/qpid/cpp/src/tests/legacystore/clean.sh b/qpid/cpp/src/tests/legacystore/clean.sh deleted file mode 100644 index 838f246232..0000000000 --- a/qpid/cpp/src/tests/legacystore/clean.sh +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/env 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. -# - -# This script cleans up any previous database and journal files, and should -# be run prior to the store system tests, as these are prone to crashing or -# hanging under some circumstances if the database is old or inconsistent. - -if [ -d ${TMP_DATA_DIR} ]; then - rm -rf ${TMP_DATA_DIR} -fi -if [ -d ${TMP_PYTHON_TEST_DIR} ]; then - rm -rf ${TMP_PYTHON_TEST_DIR} -fi -rm -f ${abs_srcdir}/*.vglog* diff --git a/qpid/cpp/src/tests/legacystore/federation/Makefile.am b/qpid/cpp/src/tests/legacystore/federation/Makefile.am deleted file mode 100644 index c48e861a65..0000000000 --- a/qpid/cpp/src/tests/legacystore/federation/Makefile.am +++ /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. -# - - -abs_srcdir=@abs_srcdir@ - -TMP_DATA_DIR=$(abs_srcdir)/../tmp_data_dir - -TESTS = \ - run_federation_sys_tests - -LONG_TESTS = \ - run_long_federation_sys_tests - -EXTRA_DIST = \ - federation_tests_env.sh \ - run_federation_sys_tests \ - run_long_federation_sys_tests - -TESTS_ENVIRONMENT = \ - QPID_DIR=$(QPID_DIR) \ - QPID_BLD=$(QPID_BLD) \ - TMP_DATA_DIR=$(TMP_DATA_DIR) \ - abs_srcdir=$(abs_srcdir) - -check-long: all - $(MAKE) check TESTS="$(LONG_TESTS)" SUBDIRS=. - -# END - diff --git a/qpid/cpp/src/tests/legacystore/federation/federation_tests_env.sh b/qpid/cpp/src/tests/legacystore/federation/federation_tests_env.sh deleted file mode 100755 index be4504f3bf..0000000000 --- a/qpid/cpp/src/tests/legacystore/federation/federation_tests_env.sh +++ /dev/null @@ -1,313 +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. -# - - -# --- Function definitions --- - -func_check_required_env () -#------------------------- -# Check that EITHER: -# QPID_DIR is set (for running against svn QPID) -# OR -# QPID_PREFIX is set (for running against installed QPID -# Will exit with error code 1 if neither of these is defined. -# Params: None -# Returns: 0 if env vars ok, 1 otherwise -{ - if test -z "${QPID_DIR}" -a -z "${QPID_PREFIX}"; then - # Try to find qpidd in the normal installed location - if test -x /usr/sbin/qpidd; then - QPID_PREFIX=/usr - else - echo "ERROR: Could not find installed Qpid" - echo "Either of the following must be set in the environment for this script to run:" - echo " QPID_DIR for running against a Qpid svn build" - echo " QPID_PREFIX for running against an installed Qpid" - return 1 - fi - fi - return 0 -} - - -func_check_clustering () -#----------------------- -# Check openAIS/corosync is running and user has correct privileges -# Params: None -# Returns: 0 if openAIS/corosync is running, 1 otherwise -# Sets env var COROSYNC to 1 if corosync is running, not set otherwise -{ - # Check either aisexec or corosync is running as root - cluster_prog=`ps -u root | grep 'aisexec\|corosync'` - test -n "$cluster_prog" || NODAEMON="Neither aisexec nor corosync is running as root" - if test -z "$NODAEMON"; then - # Test for corosync running - echo $cluster_prog | grep "aisexec" > /dev/null || COROSYNC=1 - if test -n "$COROSYNC"; then - # Corosync auth test - user=`whoami` - ls /etc/corosync/uidgid.d | grep $user > /dev/null || NOAUTH="You are not authorized to use corosync." - else - # OpenAis auth test - id -nG | grep '\<ais\>' >/dev/null || NOAUTH="You are not a member of the ais group." - fi - fi - - if test -n "$NODAEMON" -o -n "$NOAUTH"; then - cat <<EOF - - ========== WARNING: NOT RUNNING CLUSTER TESTS ============ - - Cluster tests will not be run because: - - $NODAEMON - $NOAUTH - - ========================================================== - -EOF - return 1 - fi - CLUSTERING_ENABLED=1 - return 0 -} - - -func_check_qpid_python () -#------------------------ -# Check that Qpid python environment is ok -# Params: None -# Returns: 0 if Python environment is ok; 1 otherwise -{ - if ! python -c "import qpid" ; then - cat <<EOF - - =========== WARNING: PYTHON TESTS DISABLED ============== - - Unable to load python qpid module - skipping python tests. - - PYTHONPATH=${PYTHONPATH} - - =========================================================== - -EOF - return 1 - fi - return 0 -} - -func_set_python_env() -#-------------------- -# Set up the python path -# Params: None -# Returns: Nothing -{ - if test "${QPID_DIR}" -a -d "${QPID_DIR}" ; then - QPID_PYTHON=${QPID_DIR}/python - QPID_TOOLS=${QPID_DIR}/tools/src/py - QMF_LIB=${QPID_DIR}/extras/qmf/src/py - export PYTHONPATH=${QPID_PYTHON}:${QMF_LIB}:${QPID_TOOLS}:$PYTHONPATH - fi -} - -func_set_env () -#-------------- -# Set up the environment based on value of ${QPID_DIR}: if ${QPID_DIR} exists, assume a svn checkout, -# otherwise set up for an installed or prefix test. -# Params: None -# Returns: Nothing -{ - if test "${QPID_DIR}" -a -d "${QPID_DIR}" ; then - # QPID_DIR is defined for source tree builds by the --with-qpid-checkout configure option. - # QPID_BLD is defined as the build directory, either $QPID_DIR/cpp or separately specified with - # the --with-qpid-build option for VPATH builds. - - # Check QPID_BLD is also set - if test -z ${QPID_BLD}; then - QPID_BLD="${QPID_DIR}/cpp" - fi - source $QPID_BLD/src/tests/env.sh -# CPP_CLUSTER_EXEC="${QPID_BLD}/src/tests/cluster_test" -# PYTHON_CLUSTER_EXEC="${QPID_DIR}/cpp/src/tests/$PYTHON_TESTNAME" - FEDERATION_SYS_TESTS_FAIL="${QPID_DIR}/cpp/src/tests/federation_sys_tests.fail" - if test -z ${STORE_LIB}; then - STORE_LIB="../../lib/.libs/msgstore.so" - fi -# export STORE_ENABLE=1 - else - # Set up the environment based on value of ${QPID_PREFIX} for testing against an installed qpid - # Alternatively, make sure ${QPID_BIN_DIR}, ${QPID_SBIN_DIR}, ${QPID_LIB_DIR} and ${QPID_LIBEXEC_DIR} are set for - # the installed location. - if test "${QPID_PREFIX}" -a -d "${QPID_PREFIX}" ; then - QPID_BIN_DIR=${QPID_PREFIX}/bin - QPID_SBIN_DIR=${QPID_PREFIX}/sbin - QPID_LIB_DIR=${QPID_PREFIX}/lib - QPID_LIBEXEC_DIR=${QPID_PREFIX}/libexec - export PATH="$QPID_BIN_DIR:$QPID_SBIN_DIR:$QPID_LIBEXEC_DIR/qpid/tests:$PATH" - fi - - # These four env vars must be set prior to calling this script - func_checkpaths QPID_BIN_DIR QPID_SBIN_DIR QPID_LIB_DIR QPID_LIBEXEC_DIR - - # Paths and dirs - export PYTHON_DIR="${QPID_BIN_DIR}" - export PYTHONPATH="${QPID_LIB_DIR}/python:${QPID_LIBEXEC_DIR}/qpid/tests:${QPID_LIB_DIR}/python2.4:${QPID_LIB_DIR}/python2.4/site-packages:${PYTHONPATH}" - # Libraries - export CLUSTER_LIB="${QPID_LIB_DIR}/qpid/daemon/cluster.so" - export ACL_LIB="${QPID_LIB_DIR}/qpid/daemon/acl.so" - export TEST_STORE_LIB="${QPID_LIB_DIR}/qpid/tests/test_store.so" - - # Executables -# CPP_CLUSTER_EXEC="${QPID_LIBEXEC_DIR}/qpid/tests/cluster_test" -# PYTHON_CLUSTER_EXEC="${QPID_LIBEXEC_DIR}/qpid/tests/$PYTHON_TESTNAME" - export QPIDD_EXEC="${QPID_SBIN_DIR}/qpidd" - export QPID_CONFIG_EXEC="${QPID_BIN_DIR}/qpid-config" - export QPID_ROUTE_EXEC="${QPID_BIN_DIR}/qpid-route" - export QPID_CLUSTER_EXEC="${QPID_BIN_DIR}/qpid-cluster" -# export RECEIVER_EXEC="${QPID_LIBEXEC_DIR}/qpid/tests/receiver" -# export SENDER_EXEC="${QPID_LIBEXEC_DIR}/qpid/tests/sender" - export QPID_PYTHON_TEST="${QPID_BIN_DIR}/qpid-python-test" - - # Data - FEDERATION_SYS_TESTS_FAIL="${QPID_LIBEXEC_DIR}/qpid/tests/federation_sys_tests.fail" - fi -} - - -func_mk_data_dir () -#------------------ -# Create a data dir at ${TMP_DATA_DIR} if not present, clear it otherwise. -# Set TMP_DATA_DIR if it is not set. -# Params: None -# Returns: Nothing -{ - if test -z "${TMP_DATA_DIR}"; then - TMP_DATA_DIR=/tmp/federation_sys_tests - echo "TMP_DATA_DIR not set; using ${TMP_DATA_DIR}" - fi - - # Delete old cluster test dirs if they exist - if test -d "${TMP_DATA_DIR}" ; then - rm -rf "${TMP_DATA_DIR}/cluster" - fi - mkdir -p "${TMP_DATA_DIR}/cluster" - export TMP_DATA_DIR -} - - -func_checkvar () -#--------------- -# Check that an environment var is set (ie non-zero length) -# Params: $1 - env var to be checked -# Returns: 0 = env var is set (ie non-zero length) -# 1 = env var is not set -{ - local loc_VAR=$1 - if test -z ${!loc_VAR}; then - echo "WARNING: environment variable ${loc_VAR} not set." - return 1 - fi - return 0 -} - - -func_checkpaths () -#----------------- -# Check a list of paths (each can contain ':'-separated sub-list) is set and valid (ie each path exists as a dir) -# Params: $@ - List of path env vars to be checked -# Returns: Nothing -{ - local loc_PATHS=$@ - for path in ${loc_PATHS}; do - func_checkvar ${path} - if test $? == 0; then - local temp_IFS=${IFS} - IFS=":" - local pl=${!path} - for p in ${pl[@]}; do - if test ! -d ${p}; then - echo "WARNING: Directory ${p} in var ${path} not found." - fi - done - IFS=${temp_IFS} - fi - done -} - - -func_checklibs () -#---------------- -# Check that a list of libs is set and valid (ie each lib exists as an executable file) -# Params: $@ - List of lib values to be checked -# Returns: Nothing -{ - local loc_LIBS=$@ - for lib in ${loc_LIBS[@]}; do - func_checkvar ${lib} - if test $? == 0; then - if test ! -x ${!lib}; then - echo "WARNING: Library ${lib}=${!lib} not found." - fi - fi - done -} - - -func_checkexecs () -#----------------- -# Check that a list of executable is set and valid (ie each exec exists as an executable file) -# Params: $@ - List of exec values to be checked -# Returns: Nothing -{ - local loc_EXECS=$@ - for exec in ${loc_EXECS[@]}; do - func_checkvar ${exec} - if test $? == 0; then - if test ! -x ${!exec}; then - echo "WARNING: Executable ${exec}=${!exec} not found or is not executable." - fi - fi - done -} - - -#--- Start of script --- - -func_set_python_env -func_check_required_env || exit 1 # Cannot run, exit with error -func_check_qpid_python || exit 1 # Cannot run, exit with error -func_check_clustering # Warning - -PYTHON_TESTNAME=federation_sys.py -func_set_env -func_mk_data_dir - -# Check expected environment vars are set -func_checkpaths PYTHON_DIR PYTHONPATH TMP_DATA_DIR -func_checklibs CLUSTER_LIB STORE_LIB -func_checkexecs QPIDD_EXEC QPID_CONFIG_EXEC QPID_ROUTE_EXEC QPID_PYTHON_TEST - -FAILING_PYTHON_TESTS="${abs_srcdir}/../failing_python_tests.txt" -if test -z $1; then - FEDERATION_SYS_TEST="${QPID_PYTHON_TEST} -m cluster_tests -I ${FEDERATION_SYS_TESTS_FAIL}" -else - FEDERATION_SYS_TEST="${QPID_PYTHON_TEST} -m cluster_tests -I ${FEDERATION_SYS_TESTS_FAIL} cluster_tests.LongTests.*" - LONG_TEST=1 -fi - diff --git a/qpid/cpp/src/tests/legacystore/federation/run_federation_sys_tests b/qpid/cpp/src/tests/legacystore/federation/run_federation_sys_tests deleted file mode 100755 index 776f009c05..0000000000 --- a/qpid/cpp/src/tests/legacystore/federation/run_federation_sys_tests +++ /dev/null @@ -1,96 +0,0 @@ -#!/usr/bin/env 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 ${abs_srcdir}/federation_tests_env.sh - -MODULENAME=federation_sys - -# Test for long test -if [[ "$1" == "LONG_TEST" ]]; then - USE_LONG_TEST=1 - shift # get rid of this param so it is not treated as a test name -fi - -trap stop_brokers INT TERM QUIT - -MODULES="--load-module ${STORE_LIB} --jfile-size 12 --num-jfiles 4" -CLUSTER_MODULE="--load-module ${CLUSTER_LIB} " -if [ -z ${USE_LONG_TEST} ]; then - SKIPTESTS="-i federation_sys.A_Long* -i federation_sys.B_Long* -i federation_sys.E_Long* -i federation_sys.F_Long*" -fi -if [ -z ${CLUSTERING_ENABLED} ]; then - SKIPTESTS="${SKIPTESTS} -i federation_sys.C_* -i federation_sys.D_* -i federation_sys.G_* -i federation_sys.H_*" -elif [ -z ${USE_LONG_TEST} ]; then - SKIPTESTS="${SKIPTESTS} -i federation_sys.C_Long* -i federation_sys.D_Long* -i federation_sys.G_Long* -i federation_sys.H_Long*" -fi - -start_brokers() { - clean_or_create_dir() { - if [ -n "$1" -a -d $1 ]; then - rm -rf $1/* - else - mkdir -p $1 - fi - } - start_broker() { - clean_or_create_dir $1 - ${QPIDD_EXEC} --daemon --port 0 --auth no --data-dir $1 $2 > qpidd.port - PORT=`cat qpidd.port` - eval "$3=${PORT}" - } - start_broker ${TMP_DATA_DIR}/local "${MODULES} --log-enable info+ --log-to-file ${TMP_DATA_DIR}/qpidd.log.local" LOCAL_PORT - start_broker ${TMP_DATA_DIR}/remote "${MODULES} --log-enable info+ --log-to-file ${TMP_DATA_DIR}/qpidd.log.remote" REMOTE_PORT - if [ -n "$CLUSTERING_ENABLED" ]; then - start_broker ${TMP_DATA_DIR}/cluster/c1.1 "${MODULES} ${CLUSTER_MODULE} --cluster-name test-cluster-1 --log-enable info+ --log-to-file ${TMP_DATA_DIR}/qpidd.log.cluster1.1" CLUSTER_C1_1 - start_broker ${TMP_DATA_DIR}/cluster/c1.2 "${MODULES} ${CLUSTER_MODULE} --cluster-name test-cluster-1 --log-enable info+ --log-to-file ${TMP_DATA_DIR}/qpidd.log.cluster1.2" CLUSTER_C1_2 - start_broker ${TMP_DATA_DIR}/cluster/c2.1 "${MODULES} ${CLUSTER_MODULE} --cluster-name test-cluster-2 --log-enable info+ --log-to-file ${TMP_DATA_DIR}/qpidd.log.cluster2.1" CLUSTER_C2_1 - start_broker ${TMP_DATA_DIR}/cluster/c2.2 "${MODULES} ${CLUSTER_MODULE} --cluster-name test-cluster-2 --log-enable info+ --log-to-file ${TMP_DATA_DIR}/qpidd.log.cluster2.2" CLUSTER_C2_2 - fi - rm qpidd.port -} - -stop_brokers() { - ${QPIDD_EXEC} -q --port ${LOCAL_PORT} - ${QPIDD_EXEC} -q --port ${REMOTE_PORT} - if [ -n "${CLUSTERING_ENABLED}" ]; then - ${QPID_CLUSTER_EXEC} --all-stop --force localhost:${CLUSTER_C1_1} - ${QPID_CLUSTER_EXEC} --all-stop --force localhost:${CLUSTER_C2_1} - fi -} - -if test -d ${PYTHON_DIR} ; then - start_brokers - if [ -z ${CLUSTERING_ENABLED} ]; then - echo "Running federation tests using brokers on local port ${LOCAL_PORT}, remote port ${REMOTE_PORT} (NOTE: clustering is DISABLED)" - else - echo "Running federation tests using brokers on local port ${LOCAL_PORT}, remote port ${REMOTE_PORT}, local cluster nodes ${CLUSTER_C1_1} ${CLUSTER_C1_2}, remote cluster nodes ${CLUSTER_C2_1} ${CLUSTER_C2_2}" - fi - if [ -z ${USE_LONG_TEST} ]; then - echo "NOTE: To run a full set of federation system tests, use \"make check-long\"." - fi - ${QPID_PYTHON_TEST} -m ${MODULENAME} ${SKIPTESTS} -b localhost:$REMOTE_PORT -Dlocal-port=$LOCAL_PORT -Dremote-port=$REMOTE_PORT -Dlocal-cluster-ports="$CLUSTER_C1_1 $CLUSTER_C1_2" -Dremote-cluster-ports="$CLUSTER_C2_1 $CLUSTER_C2_2" $@ - RETCODE=$? - stop_brokers - if test x$RETCODE != x0; then - echo "FAIL federation tests"; exit 1; - fi -fi diff --git a/qpid/cpp/src/tests/legacystore/federation/run_long_federation_sys_tests b/qpid/cpp/src/tests/legacystore/federation/run_long_federation_sys_tests deleted file mode 100755 index 012c8d8f18..0000000000 --- a/qpid/cpp/src/tests/legacystore/federation/run_long_federation_sys_tests +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/env 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 system tests (long version). - -./run_federation_sys_tests LONG_TEST $@ diff --git a/qpid/cpp/src/tests/legacystore/jrnl/_st_auto_expand.cpp b/qpid/cpp/src/tests/legacystore/jrnl/_st_auto_expand.cpp deleted file mode 100644 index fb5c1f1742..0000000000 --- a/qpid/cpp/src/tests/legacystore/jrnl/_st_auto_expand.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 "../unit_test.h" -#include <cmath> -#include <iostream> -#include "qpid/legacystore/jrnl/jcntl.h" - -using namespace boost::unit_test; -using namespace mrg::journal; -using namespace std; - -QPID_AUTO_TEST_SUITE(journal_auto_expand) - -const string test_filename("_st_auto_expand"); - -#include "_st_helper_fns.h" - -// === Test suite === - -QPID_AUTO_TEST_CASE(no_ae_threshold) -{ - string test_name = get_test_name(test_filename, "no_ae_threshold"); - try - { - string msg; - - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - jc.initialize(NUM_DEFAULT_JFILES, false, 0, DEFAULT_JFSIZE_SBLKS); - unsigned m; - - // Fill journal to just below threshold - u_int32_t t = num_msgs_to_threshold(NUM_DEFAULT_JFILES, - DEFAULT_JFSIZE_SBLKS * JRNL_SBLK_SIZE, LARGE_MSG_REC_SIZE_DBLKS); - for (m=0; m<t; m++) - enq_msg(jc, m, create_msg(msg, m, LARGE_MSG_SIZE), false); - // This enqueue should exceed the threshold - BOOST_CHECK_EQUAL(jc.get_enq_cnt(), t); - enq_msg(jc, m, create_msg(msg, m, LARGE_MSG_SIZE), false, RHM_IORES_ENQCAPTHRESH); - BOOST_CHECK_EQUAL(jc.get_enq_cnt(), t); - } - catch(const exception& e) { BOOST_FAIL(e.what()); } - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(no_ae_threshold_dequeue_some) -{ - string test_name = get_test_name(test_filename, "no_ae_threshold_dequeue_some"); - try - { - string msg; - - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - jc.initialize(NUM_DEFAULT_JFILES, false, 0, DEFAULT_JFSIZE_SBLKS); - unsigned m; - - // Fill journal to just below threshold - u_int32_t t = num_msgs_to_threshold(NUM_DEFAULT_JFILES, - DEFAULT_JFSIZE_SBLKS * JRNL_SBLK_SIZE, LARGE_MSG_REC_SIZE_DBLKS); - for (m=0; m<t; m++) - enq_msg(jc, m, create_msg(msg, m, LARGE_MSG_SIZE), false); - // This enqueue should exceed the threshold - BOOST_CHECK_EQUAL(jc.get_enq_cnt(), t); - enq_msg(jc, m, create_msg(msg, m, LARGE_MSG_SIZE), false, RHM_IORES_ENQCAPTHRESH); - BOOST_CHECK_EQUAL(jc.get_enq_cnt(), t); - - // Dequeue 25 msgs - #define NUM_MSGS_DEQ 25 - for (m=0; m<NUM_MSGS_DEQ; m++) - deq_msg(jc, m, m+t); - BOOST_CHECK_EQUAL(jc.get_enq_cnt(), u_int32_t(t-NUM_MSGS_DEQ)); - - // Check we can still enqueue and dequeue - for (m=t+NUM_MSGS_DEQ; m<t+NUM_MSGS_DEQ+NUM_MSGS; m++) - enq_msg(jc, m, create_msg(msg, m, LARGE_MSG_SIZE), false); - for (m=t+NUM_MSGS_DEQ; m<t+NUM_MSGS_DEQ+NUM_MSGS; m++) - deq_msg(jc, m, m+NUM_MSGS_DEQ+NUM_MSGS); - } - catch(const exception& e) { BOOST_FAIL(e.what()); } - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(no_ae_threshold_dequeue_all) -{ - string test_name = get_test_name(test_filename, "no_ae_threshold_dequeue_all"); - try - { - string msg; - - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - jc.initialize(NUM_DEFAULT_JFILES, false, 0, DEFAULT_JFSIZE_SBLKS); - unsigned m; - - // Fill journal to just below threshold - u_int32_t t = num_msgs_to_threshold(NUM_DEFAULT_JFILES, - DEFAULT_JFSIZE_SBLKS * JRNL_SBLK_SIZE, LARGE_MSG_REC_SIZE_DBLKS); - for (m=0; m<t; m++) - enq_msg(jc, m, create_msg(msg, m, LARGE_MSG_SIZE), false); - // This enqueue should exceed the threshold - BOOST_CHECK_EQUAL(jc.get_enq_cnt(), t); - enq_msg(jc, m, create_msg(msg, m, LARGE_MSG_SIZE), false, RHM_IORES_ENQCAPTHRESH); - BOOST_CHECK_EQUAL(jc.get_enq_cnt(), t); - - // Dequeue all msgs - for (m=0; m<t; m++) - deq_msg(jc, m, m+t); - BOOST_CHECK_EQUAL(jc.get_enq_cnt(), u_int32_t(0)); - - // Check we can still enqueue and dequeue - for (m=2*t; m<2*t + NUM_MSGS; m++) - enq_msg(jc, m, create_msg(msg, m, LARGE_MSG_SIZE), false); - for (m=2*t; m<2*t + NUM_MSGS; m++) - deq_msg(jc, m, m+2*t+NUM_MSGS); - } - catch(const exception& e) { BOOST_FAIL(e.what()); } - cout << "ok" << endl; -} - -QPID_AUTO_TEST_SUITE_END() diff --git a/qpid/cpp/src/tests/legacystore/jrnl/_st_basic.cpp b/qpid/cpp/src/tests/legacystore/jrnl/_st_basic.cpp deleted file mode 100644 index 4aa6d2e29f..0000000000 --- a/qpid/cpp/src/tests/legacystore/jrnl/_st_basic.cpp +++ /dev/null @@ -1,558 +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 <cmath> -#include <iostream> -#include "qpid/legacystore/jrnl/jcntl.h" - -using namespace boost::unit_test; -using namespace mrg::journal; -using namespace std; - -QPID_AUTO_TEST_SUITE(journal_basic) - -const string test_filename("_st_basic"); - -#include "_st_helper_fns.h" - -// === Test suite === - -#ifndef LONG_TEST -/* - * ============================================== - * NORMAL TESTS - * This section contains normal "make check" tests - * for building/packaging. These are built when - * LONG_TEST is _not_ defined. - * ============================================== - */ - -QPID_AUTO_TEST_CASE(instantiation) -{ - string test_name = get_test_name(test_filename, "instantiation"); - try - { - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - BOOST_CHECK_EQUAL(jc.is_ready(), false); - } - catch(const exception& e) { BOOST_FAIL(e.what()); } - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(initialization) -{ - string test_name = get_test_name(test_filename, "initialization"); - try - { - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - BOOST_CHECK_EQUAL(jc.is_ready(), false); - jc.initialize(NUM_TEST_JFILES, false, 0, TEST_JFSIZE_SBLKS); - BOOST_CHECK_EQUAL(jc.is_ready(), true); - } - catch(const exception& e) { BOOST_FAIL(e.what()); } - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(enqueue_dequeue_block) -{ - string test_name = get_test_name(test_filename, "enqueue_dequeue_block"); - try - { - string msg; - - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - jc.initialize(NUM_TEST_JFILES, false, 0, TEST_JFSIZE_SBLKS); - for (int m=0; m<NUM_MSGS; m++) - BOOST_CHECK_EQUAL(enq_msg(jc, m, create_msg(msg, m, MSG_SIZE), false), u_int64_t(m)); - for (int m=0; m<NUM_MSGS; m++) - deq_msg(jc, m, m+NUM_MSGS); - - // Again... - for (int m=2*NUM_MSGS; m<3*NUM_MSGS; m++) - BOOST_CHECK_EQUAL(enq_msg(jc, m, create_msg(msg, m, MSG_SIZE), false), u_int64_t(m)); - for (int m=2*NUM_MSGS; m<3*NUM_MSGS; m++) - deq_msg(jc, m, m+3*NUM_MSGS); - - // Disjoint rids - for (int m=10*NUM_MSGS; m<11*NUM_MSGS; m++) - BOOST_CHECK_EQUAL(enq_msg(jc, m, create_msg(msg, m, MSG_SIZE), false), u_int64_t(m)); - for (int m=10*NUM_MSGS; m<11*NUM_MSGS; m++) - deq_msg(jc, m, m+11*NUM_MSGS); - } - catch(const exception& e) { BOOST_FAIL(e.what()); } - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(enqueue_dequeue_interleaved) -{ - string test_name = get_test_name(test_filename, "enqueue_dequeue_interleaved"); - try - { - string msg; - - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - jc.initialize(NUM_TEST_JFILES, false, 0, TEST_JFSIZE_SBLKS); - for (int m=0; m<2*NUM_MSGS; m+=2) - { - BOOST_CHECK_EQUAL(enq_msg(jc, m, create_msg(msg, m, MSG_SIZE), false), u_int64_t(m)); - deq_msg(jc, m, m+1); - } - - // Again... - for (int m=2*NUM_MSGS; m<4*NUM_MSGS; m+=2) - { - BOOST_CHECK_EQUAL(enq_msg(jc, m, create_msg(msg, m, MSG_SIZE), false), u_int64_t(m)); - deq_msg(jc, m, m+1); - } - - // Disjoint rids - for (int m=10*NUM_MSGS; m<12*NUM_MSGS; m+=2) - { - BOOST_CHECK_EQUAL(enq_msg(jc, m, create_msg(msg, m, MSG_SIZE), false), u_int64_t(m)); - deq_msg(jc, m, m+1); - } - } - catch(const exception& e) { BOOST_FAIL(e.what()); } - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(enqueue_dequeue_interleaved_file_rollover) -{ - string test_name = get_test_name(test_filename, "enqueue_dequeue_interleaved_file_rollover"); - try - { - string msg; - - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - jc.initialize(NUM_TEST_JFILES, false, 0, TEST_JFSIZE_SBLKS); - unsigned n = num_msgs_to_full(NUM_TEST_JFILES, TEST_JFSIZE_SBLKS * JRNL_SBLK_SIZE, - 16*MSG_REC_SIZE_DBLKS, true); - for (unsigned m=0; m<3*2*n; m+=2) // overwrite files 3 times - { - enq_msg(jc, m, create_msg(msg, m, 16*MSG_SIZE), false); - deq_msg(jc, m, m+1); - } - jc.stop(true); - } - catch(const exception& e) { BOOST_FAIL(e.what()); } - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(empty_recover) -{ - string test_name = get_test_name(test_filename, "empty_recover"); - try - { - { - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - BOOST_CHECK_EQUAL(jc.is_ready(), false); - BOOST_CHECK_EQUAL(jc.is_read_only(), false); - jc.initialize(NUM_TEST_JFILES, false, 0, TEST_JFSIZE_SBLKS); - BOOST_CHECK_EQUAL(jc.is_ready(), true); - BOOST_CHECK_EQUAL(jc.is_read_only(), false); - } - { - u_int64_t hrid; - - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - BOOST_CHECK_EQUAL(jc.is_ready(), false); - BOOST_CHECK_EQUAL(jc.is_read_only(), false); - jc.recover(NUM_TEST_JFILES, false, 0, TEST_JFSIZE_SBLKS, 0, hrid); - BOOST_CHECK_EQUAL(jc.is_ready(), true); - BOOST_CHECK_EQUAL(jc.is_read_only(), true); - BOOST_CHECK_EQUAL(hrid, u_int64_t(0)); - } - { - u_int64_t hrid; - - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - BOOST_CHECK_EQUAL(jc.is_ready(), false); - BOOST_CHECK_EQUAL(jc.is_read_only(), false); - jc.recover(NUM_TEST_JFILES, false, 0, TEST_JFSIZE_SBLKS, 0, hrid); - BOOST_CHECK_EQUAL(jc.is_ready(), true); - BOOST_CHECK_EQUAL(jc.is_read_only(), true); - BOOST_CHECK_EQUAL(hrid, u_int64_t(0)); - jc.recover_complete(); - BOOST_CHECK_EQUAL(jc.is_ready(), true); - BOOST_CHECK_EQUAL(jc.is_read_only(), false); - } - } - catch(const exception& e) { BOOST_FAIL(e.what()); } - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(enqueue_recover_dequeue_block) -{ - string test_name = get_test_name(test_filename, "enqueue_recover_dequeue_block"); - try - { - { - string msg; - - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - jc.initialize(NUM_TEST_JFILES, false, 0, TEST_JFSIZE_SBLKS); - for (int m=0; m<NUM_MSGS; m++) - enq_msg(jc, m, create_msg(msg, m, MSG_SIZE), false); - } - { - u_int64_t hrid; - - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - jc.recover(NUM_TEST_JFILES, false, 0, TEST_JFSIZE_SBLKS, 0, hrid); - BOOST_CHECK_EQUAL(hrid, u_int64_t(NUM_MSGS - 1)); - jc.recover_complete(); - for (int m=0; m<NUM_MSGS; m++) - deq_msg(jc, m, m+NUM_MSGS); - } - } - catch(const exception& e) { BOOST_FAIL(e.what()); } - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(enqueue_recover_dequeue_interleaved) -{ - string test_name = get_test_name(test_filename, "enqueue_recover_dequeue_interleaved"); - try - { - string msg; - u_int64_t hrid; - - for (int m=0; m<2*NUM_MSGS; m+=2) - { - { - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - if (m == 0) - jc.initialize(NUM_TEST_JFILES, false, 0, TEST_JFSIZE_SBLKS); // First time only - else - { - jc.recover(NUM_TEST_JFILES, false, 0, TEST_JFSIZE_SBLKS, 0, hrid); - BOOST_CHECK_EQUAL(hrid, u_int64_t(m - 1)); - jc.recover_complete(); - } - enq_msg(jc, m, create_msg(msg, m, MSG_SIZE), false); - } - { - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - jc.recover(NUM_TEST_JFILES, false, 0, TEST_JFSIZE_SBLKS, 0, hrid); - BOOST_CHECK_EQUAL(hrid, u_int64_t(m)); - jc.recover_complete(); - deq_msg(jc, m, m+1); - } - } - } - catch(const exception& e) { BOOST_FAIL(e.what()); } - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(header_flags) -{ - string test_name = get_test_name(test_filename, "header_flags"); - try - { - { - string msg; - - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - jc.initialize(NUM_TEST_JFILES, false, 0, TEST_JFSIZE_SBLKS); - // Transient msgs - should not recover - for (int m=0; m<NUM_MSGS; m++) - enq_msg(jc, m, create_msg(msg, m, MSG_SIZE), true); - // Persistent msgs - for (int m=NUM_MSGS; m<NUM_MSGS*2; m++) - enq_msg(jc, m, create_msg(msg, m, MSG_SIZE), false); - // Transient extern msgs - should not recover - for (int m=NUM_MSGS*2; m<NUM_MSGS*3; m++) - enq_extern_msg(jc, m, MSG_SIZE, true); - // Persistnet extern msgs - for (int m=NUM_MSGS*3; m<NUM_MSGS*4; m++) - enq_extern_msg(jc, m, MSG_SIZE, false); - } - { - string msg; - u_int64_t hrid; - - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - jc.recover(NUM_TEST_JFILES, false, 0, TEST_JFSIZE_SBLKS, 0, hrid); - // Recover non-transient msgs - for (int m=NUM_MSGS; m<NUM_MSGS*2; m++) - { - string rmsg; - string xid; - bool transientFlag; - bool externalFlag; - - read_msg(jc, rmsg, xid, transientFlag, externalFlag); - BOOST_CHECK_MESSAGE(transientFlag == false, "Transient message recovered."); - BOOST_CHECK_MESSAGE(externalFlag == false, "External flag incorrect."); - BOOST_CHECK_MESSAGE(create_msg(msg, m, MSG_SIZE).compare(rmsg) == 0, - "Non-transient message corrupt during recover."); - } - // Recover non-transient extern msgs - for (int m=NUM_MSGS*3; m<NUM_MSGS*4; m++) - { - string rmsg; - string xid; - bool transientFlag; - bool externalFlag; - - read_msg(jc, rmsg, xid, transientFlag, externalFlag); - BOOST_CHECK_MESSAGE(transientFlag == false, "Transient message recovered."); - BOOST_CHECK_MESSAGE(externalFlag == true, "External flag incorrect."); - BOOST_CHECK_MESSAGE(rmsg.size() == 0, "External message returned non-zero size."); - } - jc.recover_complete(); - // Read recovered non-transient msgs - for (int m=NUM_MSGS; m<NUM_MSGS*2; m++) - { - string rmsg; - string xid; - bool transientFlag; - bool externalFlag; - - read_msg(jc, rmsg, xid, transientFlag, externalFlag); - BOOST_CHECK_MESSAGE(transientFlag == false, "Transient message recovered."); - BOOST_CHECK_MESSAGE(externalFlag == false, "External flag incorrect."); - BOOST_CHECK_MESSAGE(create_msg(msg, m, MSG_SIZE).compare(rmsg) == 0, - "Non-transient message corrupt during recover."); - } - // Read recovered non-transient extern msgs - for (int m=NUM_MSGS*3; m<NUM_MSGS*4; m++) - { - string rmsg; - string xid; - bool transientFlag; - bool externalFlag; - - read_msg(jc, rmsg, xid, transientFlag, externalFlag); - BOOST_CHECK_MESSAGE(transientFlag == false, "Transient message recovered."); - BOOST_CHECK_MESSAGE(externalFlag == true, "External flag incorrect."); - BOOST_CHECK_MESSAGE(rmsg.size() == 0, "External message returned non-zero size."); - } - // Dequeue recovered messages - for (int m=NUM_MSGS; m<NUM_MSGS*2; m++) - deq_msg(jc, m, m+3*NUM_MSGS); - for (int m=NUM_MSGS*3; m<NUM_MSGS*4; m++) - deq_msg(jc, m, m+2*NUM_MSGS); - } - } - catch(const exception& e) { BOOST_FAIL(e.what()); } - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(double_dequeue) -{ - string test_name = get_test_name(test_filename, "double_dequeue"); - try - { - string msg; - - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - jc.initialize(NUM_TEST_JFILES, false, 0, TEST_JFSIZE_SBLKS); - enq_msg(jc, 0, create_msg(msg, 0, MSG_SIZE), false); - deq_msg(jc, 0, 1); - try{ deq_msg(jc, 0, 2); BOOST_ERROR("Did not throw exception on second dequeue."); } - catch (const jexception& e){ BOOST_CHECK_EQUAL(e.err_code(), jerrno::JERR_WMGR_DEQRIDNOTENQ); } - enq_msg(jc, 2, create_msg(msg, 1, MSG_SIZE), false); - deq_msg(jc, 2, 3); - } - catch(const exception& e) { BOOST_FAIL(e.what()); } - cout << "ok" << endl; -} - -#else -/* - * ============================================== - * LONG TESTS - * This section contains long tests and soak tests, - * and are run using target check-long (ie "make - * check-long"). These are built when LONG_TEST is - * defined. - * ============================================== - */ - -QPID_AUTO_TEST_CASE(journal_overflow) -{ - string test_name = get_test_name(test_filename, "journal_overflow"); - try - { - string msg; - - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - jc.initialize(NUM_DEFAULT_JFILES, false, 0, DEFAULT_JFSIZE_SBLKS); - unsigned m; - - // Fill journal to just below threshold - u_int32_t t = num_msgs_to_threshold(NUM_DEFAULT_JFILES, DEFAULT_JFSIZE_SBLKS * JRNL_SBLK_SIZE, - MSG_REC_SIZE_DBLKS); - u_int32_t d = num_dequeues_rem(NUM_DEFAULT_JFILES, DEFAULT_JFSIZE_SBLKS * JRNL_SBLK_SIZE); - for (m=0; m<t; m++) - enq_msg(jc, m, create_msg(msg, m, MSG_SIZE), false); - // This enqueue should exceed the threshold - enq_msg(jc, m, create_msg(msg, m, MSG_SIZE), false, RHM_IORES_ENQCAPTHRESH); - - // Dequeue as many msgs as possible except first - for (m=1; m<=d; m++) - deq_msg(jc, m, m+t); - deq_msg(jc, d+1, d+2, RHM_IORES_FULL); - } - catch(const exception& e) { BOOST_FAIL(e.what()); } - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(file_cycle_block) -{ - string test_name = get_test_name(test_filename, "file_cycle_block"); - try - { - string msg; - - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - jc.initialize(NUM_DEFAULT_JFILES, false, 0, DEFAULT_JFSIZE_SBLKS); - - // 5 cycles of enqueue/dequeue blocks of half threshold exception size - u_int32_t t = num_msgs_to_threshold(NUM_DEFAULT_JFILES, DEFAULT_JFSIZE_SBLKS * JRNL_SBLK_SIZE, - LARGE_MSG_REC_SIZE_DBLKS)/2; - for (unsigned i=0; i<5; i++) - { - for (unsigned m=2*i*t; m<(2*i+1)*t; m++) - enq_msg(jc, m, create_msg(msg, m, LARGE_MSG_SIZE), false); - for (unsigned m=2*i*t; m<(2*i+1)*t; m++) - deq_msg(jc, m, m+t); - } - } - catch(const exception& e) { BOOST_FAIL(e.what()); } - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(file_cycle_interleaved) -{ - string test_name = get_test_name(test_filename, "file_cycle_interleaved"); - try - { - string msg; - - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - jc.initialize(NUM_DEFAULT_JFILES, false, 0, DEFAULT_JFSIZE_SBLKS); - - // 5 cycles of enqueue/dequeue blocks of half threshold exception size - u_int32_t t = num_msgs_to_threshold(NUM_DEFAULT_JFILES, DEFAULT_JFSIZE_SBLKS * JRNL_SBLK_SIZE, - LARGE_MSG_REC_SIZE_DBLKS)/2; - for (unsigned m=0; m<5*2*t; m+=2) - { - enq_msg(jc, m, create_msg(msg, m, LARGE_MSG_SIZE), false); - deq_msg(jc, m, m+1); - } - } - catch(const exception& e) { BOOST_FAIL(e.what()); } - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(recover_file_cycle_block) -{ - string test_name = get_test_name(test_filename, "recover_file_cycle_block"); - try - { - string msg; - u_int64_t hrid; - - // 5 cycles of enqueue/dequeue blocks of half threshold exception size - u_int32_t t = num_msgs_to_threshold(NUM_DEFAULT_JFILES, DEFAULT_JFSIZE_SBLKS * JRNL_SBLK_SIZE, - LARGE_MSG_REC_SIZE_DBLKS)/2; - for (unsigned i=0; i<5; i++) - { - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - if (i) - { - jc.recover(NUM_DEFAULT_JFILES, false, 0, DEFAULT_JFSIZE_SBLKS, 0, hrid); - BOOST_CHECK_EQUAL(hrid, u_int64_t(2*i*t - 1)); - jc.recover_complete(); - } - else - jc.initialize(NUM_DEFAULT_JFILES, false, 0, DEFAULT_JFSIZE_SBLKS); - - for (unsigned m=2*i*t; m<(2*i+1)*t; m++) - enq_msg(jc, m, create_msg(msg, m, LARGE_MSG_SIZE), false); - for (unsigned m=2*i*t; m<(2*i+1)*t; m++) - deq_msg(jc, m, m+t); - } - } - catch(const exception& e) { BOOST_FAIL(e.what()); } - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(recover_file_cycle_interleaved) -{ - string test_name = get_test_name(test_filename, "recover_file_cycle_interleaved"); - try - { - string msg; - u_int64_t hrid; - - // 5 cycles of enqueue/dequeue blocks of half threshold exception size - u_int32_t t = num_msgs_to_threshold(NUM_DEFAULT_JFILES, DEFAULT_JFSIZE_SBLKS * JRNL_SBLK_SIZE, - LARGE_MSG_REC_SIZE_DBLKS)/2; - for (unsigned i=0; i<5; i++) - { - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - if (i) - { - jc.recover(NUM_DEFAULT_JFILES, false, 0, DEFAULT_JFSIZE_SBLKS, 0, hrid); - BOOST_CHECK_EQUAL(hrid, u_int64_t(2*i*t - 1)); - jc.recover_complete(); - } - else - jc.initialize(NUM_DEFAULT_JFILES, false, 0, DEFAULT_JFSIZE_SBLKS); - - for (unsigned m=2*i*t; m<2*(i+1)*t; m+=2) - { - enq_msg(jc, m, create_msg(msg, m, LARGE_MSG_SIZE), false); - deq_msg(jc, m, m+1); - } - } - } - catch(const exception& e) { BOOST_FAIL(e.what()); } - cout << "ok" << endl; -} - -#endif - -QPID_AUTO_TEST_SUITE_END() diff --git a/qpid/cpp/src/tests/legacystore/jrnl/_st_basic_txn.cpp b/qpid/cpp/src/tests/legacystore/jrnl/_st_basic_txn.cpp deleted file mode 100644 index aa2d31c2ae..0000000000 --- a/qpid/cpp/src/tests/legacystore/jrnl/_st_basic_txn.cpp +++ /dev/null @@ -1,239 +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 <cmath> -#include <iostream> -#include "qpid/legacystore/jrnl/jcntl.h" - -using namespace boost::unit_test; -using namespace mrg::journal; -using namespace std; - -QPID_AUTO_TEST_SUITE(journal_basic_txn) - -const string test_filename("_st_basic_txn"); - -#include "_st_helper_fns.h" - -// === Test suite === - -QPID_AUTO_TEST_CASE(enqueue_commit_dequeue_block) -{ - string test_name = get_test_name(test_filename, "enqueue_commit_dequeue_block"); - try - { - string msg; - string xid; - - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - jc.initialize(NUM_TEST_JFILES, false, 0, TEST_JFSIZE_SBLKS); - create_xid(xid, 0, XID_SIZE); - for (int m=0; m<NUM_MSGS; m++) - BOOST_CHECK_EQUAL(enq_txn_msg(jc, m, create_msg(msg, m, MSG_SIZE), xid, false), u_int64_t(m)); - txn_commit(jc, NUM_MSGS, xid); - for (int m=0; m<NUM_MSGS; m++) - deq_msg(jc, m, m+NUM_MSGS+1); - } - catch(const exception& e) { BOOST_FAIL(e.what()); } - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(enqueue_abort_dequeue_block) -{ - string test_name = get_test_name(test_filename, "enqueue_abort_dequeue_block"); - try - { - string msg; - string xid; - - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - jc.initialize(NUM_TEST_JFILES, false, 0, TEST_JFSIZE_SBLKS); - create_xid(xid, 0, XID_SIZE); - for (int m=0; m<NUM_MSGS; m++) - BOOST_CHECK_EQUAL(enq_txn_msg(jc, m, create_msg(msg, m, MSG_SIZE), xid, false), u_int64_t(m)); - txn_abort(jc, NUM_MSGS, xid); - for (int m=0; m<NUM_MSGS; m++) - { - try - { - deq_msg(jc, m, m+NUM_MSGS+1); - BOOST_ERROR("Expected dequeue to fail with exception JERR_WMGR_DEQRIDNOTENQ."); - } - catch (const jexception& e) { if (e.err_code() != jerrno::JERR_WMGR_DEQRIDNOTENQ) throw; } - } - } - catch(const exception& e) { BOOST_FAIL(e.what()); } - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(enqueue_commit_dequeue_interleaved) -{ - string test_name = get_test_name(test_filename, "enqueue_commit_dequeue_interleaved"); - try - { - string msg; - string xid; - - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - jc.initialize(NUM_TEST_JFILES, false, 0, TEST_JFSIZE_SBLKS); - for (int m=0; m<NUM_MSGS; m++) - { - create_xid(xid, m, XID_SIZE); - BOOST_CHECK_EQUAL(enq_txn_msg(jc, 3*m, create_msg(msg, m, MSG_SIZE), xid, false), u_int64_t(3*m)); - txn_commit(jc, 3*m+1, xid); - deq_msg(jc, 3*m, 3*m+2); - } - } - catch(const exception& e) { BOOST_FAIL(e.what()); } - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(enqueue_abort_dequeue_interleaved) -{ - string test_name = get_test_name(test_filename, "enqueue_abort_dequeue_interleaved"); - try - { - string msg; - string xid; - - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - jc.initialize(NUM_TEST_JFILES, false, 0, TEST_JFSIZE_SBLKS); - for (int m=0; m<NUM_MSGS; m++) - { - create_xid(xid, m, XID_SIZE); - BOOST_CHECK_EQUAL(enq_txn_msg(jc, 3*m, create_msg(msg, m, MSG_SIZE), xid, false), u_int64_t(3*m)); - txn_abort(jc, 3*m+1, xid); - try - { - deq_msg(jc, 2*m, 2*m+2); - BOOST_ERROR("Expected dequeue to fail with exception JERR_WMGR_DEQRIDNOTENQ."); - } - catch (const jexception& e) { if (e.err_code() != jerrno::JERR_WMGR_DEQRIDNOTENQ) throw; } - } - } - catch(const exception& e) { BOOST_FAIL(e.what()); } - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(enqueue_dequeue_commit_block) -{ - string test_name = get_test_name(test_filename, "enqueue_dequeue_commit_block"); - try - { - string msg; - string xid; - - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - jc.initialize(NUM_TEST_JFILES, false, 0, TEST_JFSIZE_SBLKS); - create_xid(xid, 0, XID_SIZE); - for (int m=0; m<NUM_MSGS; m++) - BOOST_CHECK_EQUAL(enq_txn_msg(jc, m, create_msg(msg, m, MSG_SIZE), xid, false), u_int64_t(m)); - BOOST_CHECK_EQUAL(jc.get_enq_cnt(), u_int32_t(0)); - for (int m=0; m<NUM_MSGS; m++) - deq_txn_msg(jc, m, m+NUM_MSGS, xid); - BOOST_CHECK_EQUAL(jc.get_enq_cnt(), u_int32_t(0)); - txn_commit(jc, 2*NUM_MSGS, xid); - BOOST_CHECK_EQUAL(jc.get_enq_cnt(), u_int32_t(0)); - } - catch(const exception& e) { BOOST_FAIL(e.what()); } - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(enqueue_dequeue_abort_block) -{ - string test_name = get_test_name(test_filename, "enqueue_dequeue_abort_block"); - try - { - string msg; - string xid; - - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - jc.initialize(NUM_TEST_JFILES, false, 0, TEST_JFSIZE_SBLKS); - create_xid(xid, 0, XID_SIZE); - for (int m=0; m<NUM_MSGS; m++) - BOOST_CHECK_EQUAL(enq_txn_msg(jc, m, create_msg(msg, m, MSG_SIZE), xid, false), u_int64_t(m)); - BOOST_CHECK_EQUAL(jc.get_enq_cnt(), u_int32_t(0)); - for (int m=0; m<NUM_MSGS; m++) - deq_txn_msg(jc, m, m+NUM_MSGS, xid); - BOOST_CHECK_EQUAL(jc.get_enq_cnt(), u_int32_t(0)); - txn_abort(jc, 2*NUM_MSGS, xid); - BOOST_CHECK_EQUAL(jc.get_enq_cnt(), u_int32_t(0)); - } - catch(const exception& e) { BOOST_FAIL(e.what()); } - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(enqueue_dequeue_commit_interleaved) -{ - string test_name = get_test_name(test_filename, "enqueue_dequeue_commit_interleaved"); - try - { - string msg; - string xid; - - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - jc.initialize(NUM_TEST_JFILES, false, 0, TEST_JFSIZE_SBLKS); - for (int m=0; m<NUM_MSGS; m++) - { - create_xid(xid, m, XID_SIZE); - BOOST_CHECK_EQUAL(enq_txn_msg(jc, 3*m, create_msg(msg, m, MSG_SIZE), xid, false), u_int64_t(3*m)); - deq_txn_msg(jc, 3*m, 3*m+1, xid); - txn_commit(jc, 3*m+2, xid); - BOOST_CHECK_EQUAL(jc.get_enq_cnt(), u_int32_t(0)); - } - } - catch(const exception& e) { BOOST_FAIL(e.what()); } - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(enqueue_dequeue_abort_interleaved) -{ - string test_name = get_test_name(test_filename, "enqueue_dequeue_abort_interleaved"); - try - { - string msg; - string xid; - - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - jc.initialize(NUM_TEST_JFILES, false, 0, TEST_JFSIZE_SBLKS); - for (int m=0; m<NUM_MSGS; m++) - { - create_xid(xid, m, XID_SIZE); - BOOST_CHECK_EQUAL(enq_txn_msg(jc, 3*m, create_msg(msg, m, MSG_SIZE), xid, false), u_int64_t(3*m)); - deq_txn_msg(jc, 3*m, 3*m+1, xid); - txn_abort(jc, 3*m+2, xid); - BOOST_CHECK_EQUAL(jc.get_enq_cnt(), u_int32_t(0)); - } - } - catch(const exception& e) { BOOST_FAIL(e.what()); } - cout << "ok" << endl; -} - -QPID_AUTO_TEST_SUITE_END() diff --git a/qpid/cpp/src/tests/legacystore/jrnl/_st_helper_fns.h b/qpid/cpp/src/tests/legacystore/jrnl/_st_helper_fns.h deleted file mode 100644 index 923065dd11..0000000000 --- a/qpid/cpp/src/tests/legacystore/jrnl/_st_helper_fns.h +++ /dev/null @@ -1,882 +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. - * - */ - -// NOTE: This file is included in _st_*.cpp files inside the QPID_AUTO_TEST_SUITE() -// definition. - -#define MAX_AIO_SLEEPS 500 -#define AIO_SLEEP_TIME 1000 -#define NUM_TEST_JFILES 4 -#define NUM_DEFAULT_JFILES 8 -#define JRNL_DEFAULT_FSIZE 24 // Multiples of JRNL_RMGR_PAGE_SIZE -#define TEST_JFSIZE_SBLKS 128 -#define DEFAULT_JFSIZE_SBLKS (JRNL_DEFAULT_FSIZE * JRNL_RMGR_PAGE_SIZE) -#define NUM_MSGS 5 -#define MSG_REC_SIZE_DBLKS 2 -#define MSG_SIZE (MSG_REC_SIZE_DBLKS * JRNL_DBLK_SIZE) - sizeof(enq_hdr) - sizeof(rec_tail) -#define LARGE_MSG_REC_SIZE_DBLKS (JRNL_SBLK_SIZE * JRNL_RMGR_PAGE_SIZE) -#define LARGE_MSG_SIZE (LARGE_MSG_REC_SIZE_DBLKS * JRNL_DBLK_SIZE) - sizeof(enq_hdr) - sizeof(rec_tail) -#define XID_SIZE 64 - -#define XLARGE_MSG_RATIO (1.0 * LARGE_MSG_REC_SIZE / JRNL_DBLK_SIZE / JRNL_SBLK_SIZE / JRNL_RMGR_PAGE_SIZE) -#define XLARGE_MSG_THRESHOLD (int)(JRNL_DEFAULT_FSIZE * NUM_DEFAULT_JFILES * JRNL_ENQ_THRESHOLD / 100 / LARGE_MSG_RATIO) - -#define NUM_JFILES 4 -#define JFSIZE_SBLKS 128 - -const char* tdp = getenv("TMP_DATA_DIR"); -const string test_dir(tdp && strlen(tdp) > 0 ? string(tdp) + "/" + test_filename : "/var/tmp/jrnl_test"); - -class test_dtok : public data_tok -{ -private: - bool flag; -public: - test_dtok() : data_tok(), flag(false) {} - virtual ~test_dtok() {} - bool done() { if (flag || _wstate == NONE) return true; else { flag = true; return false; } } -}; - -class test_jrnl_cb : public aio_callback { - virtual void wr_aio_cb(std::vector<data_tok*>& dtokl) - { - for (std::vector<data_tok*>::const_iterator i=dtokl.begin(); i!=dtokl.end(); i++) - { - test_dtok* dtp = static_cast<test_dtok*>(*i); - if (dtp->done()) - delete dtp; - } - } - virtual void rd_aio_cb(std::vector<u_int16_t>& /*pil*/) {} -}; - -class test_jrnl : public jcntl -{ -test_jrnl_cb* cb; - -public: - test_jrnl(const std::string& jid, const std::string& jdir, const std::string& base_filename, test_jrnl_cb& cb0) : - jcntl(jid, jdir, base_filename), - cb(&cb0) {} - virtual ~test_jrnl() {} - void initialize(const u_int16_t num_jfiles, const bool ae, const u_int16_t ae_max_jfiles, - const u_int32_t jfsize_sblks) - { - jcntl::initialize(num_jfiles, ae, ae_max_jfiles, jfsize_sblks, JRNL_WMGR_DEF_PAGES, JRNL_WMGR_DEF_PAGE_SIZE, - cb); - _jdir.create_dir(); - } - void recover(const u_int16_t num_jfiles, const bool ae, const u_int16_t ae_max_jfiles, const u_int32_t jfsize_sblks, - vector<string>* txn_list, u_int64_t& highest_rid) - { jcntl::recover(num_jfiles, ae, ae_max_jfiles, jfsize_sblks, JRNL_WMGR_DEF_PAGES, JRNL_WMGR_DEF_PAGE_SIZE, cb, - txn_list, highest_rid); } -}; - -/* -* This class is for testing recover functionality by maintaining an internal lfid-pfid map, then creating physical -* journal file stubs (just the fhdr section of the journal) and jinf file. This allows the recover functionality (which -* analyzes these components to determine recover order). -* -* First set up a map or "blueprint" of what the journal should look like for recovery, then have the class create the -* physical files. The jinf object under test then reads and analyzes the created journal, and it's analysis is checked -* against what is expected. -* -* General usage pattern: -* 1. Create instance of lfid_pfid_map. -* 2. Call lfid_pfid_map::journal_create() to simulate initial journal creation. -* 3. (optional) Call lfid_pfid_map::journal_insert() one or more times to simulate the addition of journal files. -* 4. Call lfid_pfid_map::write_journal() to create dummy journal files (files containing only file headers) -* 5. Create and initialize the jinf object under test -* 6. Call jinf::analyze() to determine the pfid order - and thus also first and last lids -* 7. Call lfid_pfid_map::check_analysis() to check the conclusions of the analysis -* 8. Call lfid_pfid_map::destroy_journal() to delete the journal files and reset the lfid_pfid_map object. -* 9. (optional) Back to step 2 for more tests -* -* See the individual methods below for more details. -*/ -class lfid_pfid_map -{ - public: - typedef pair<u_int16_t, file_hdr> lppair; // Used for loading the map - typedef multimap<u_int16_t, file_hdr> lpmap; // Stores the journal "plan" before it is created on-disk - typedef lpmap::const_iterator lpmap_citr; // General purpose iterator - typedef pair<lpmap_citr, lpmap_citr> lpmap_range; // Range of values returned by multimap's equal_range() fn - - private: - string _jid; // Journal id - string _base_filename; // Base filename - lpmap _map; // Stores the journal "blueprint" before it is created on-disk - u_int16_t _num_used_files; // number of files which contain jorunals - u_int16_t _oldest_lfid; // lfid where owi flips; always 0 if !_full - u_int16_t _last_pfid; // last pfid (ie last file added) - - public: - lfid_pfid_map(const string& jid, const string& base_filename) : - _jid(jid), _base_filename(base_filename), _num_used_files(0), _oldest_lfid(0), _last_pfid(0) - {} - virtual ~lfid_pfid_map() {} - - // Mainly used for debugging - void print() - { - int cnt = 0; - for (lpmap_citr i=_map.begin(); i!=_map.end(); i++, cnt++) - { - const file_hdr fh = i->second; - cout << " " << cnt << ": owi=" << (fh.get_owi()?"t":"f") << hex << " frid=0x" << fh._rid; - cout << " pfid=0x" << fh._pfid << " lfid=0x" << fh._lfid << " fro=0x" << fh._fro << dec << endl; - } - } - - std::size_t size() - { - return _map.size(); - } - - /* - * Method journal_create(): Used to simulate the initial creation of a journal before file insertions - * take place. - * - * num_jfiles: The initial journal file count. - * num_used_jfiles: If this number is less than num_jfiles, it indicates a clean journal that has not yet - * completed its first rotation, and some files are empty (ie all null). The first - * num_used_jfiles will contain file headers, the remainder will be blank. - * oldest_lfid: The lfid (==pfid, see note 1 below) at which the owi flag flips. During normal operation, - * each time the journal rotates back to file 0, a flag (called the overwrite indicator or owi) - * is flipped. This flag is saved in the file header. During recovery, if scanning from logical - * file 0 upwards, the file at which this flag reverses from its value in file 0 is the file - * that was to have been overwritten next, and is thus the "oldest" file. Recovery analysis must - * start with this file. oldest_lfid sets the file at which this flag will flip value for the - * simulated recovery analysis. Note that this will be ignored if num_used_jfiles < num_jfiles, - * as it is not possible for an overwrite to have occurred if not all the files have been used. - * first_owi: Sets the value of the owi flag in file 0. If set to false, then the flip will be found with - * a true flag (and visa versa). - * - * NOTES: - * 1. By definition, the lfids and pfids coincide for a journal containing no inserted files. Thus pfid == lfid - * for all journals created after using initial_journal_create() alone. - * 2. By definition, if a journal is not full (num_used_jfiles < num_jfiles), then all owi flags for those files - * that are used must be the same. It is not possible for an overwrite situation to arise if a journal is not - * full. - * 3. This function acts on map _map only, and does not create any test files. Call write_journal() to do that. - * 4. This function must be called on a clean test object or on one where the previous test data has been - * cleared by calling journal_destroy(). Running this function more than once on existing data will - * result in invalid journals which cannot be recovered. - */ - void journal_create(const u_int16_t num_jfiles, // Total number of files - const u_int16_t num_used_jfiles, // Number of used files, rest empty at end - const u_int16_t oldest_lfid = 0, // Fid where owi reverses - const u_int16_t bad_lfid = 0, // Fid where owi reverses again (must be > oldest_lifd), - // used for testing bad owi detection - const bool first_owi = false) // Value of first owi flag (ie pfid=0) - { - const bool full = num_used_jfiles == num_jfiles; - bool owi = first_owi; - _oldest_lfid = full ? oldest_lfid : 0; - for (u_int16_t lfid = 0; lfid < num_jfiles; lfid++) - { - const u_int16_t pfid = lfid; - file_hdr fh; - if (pfid < num_used_jfiles) - { - _num_used_files = num_used_jfiles; - /* - * Invert the owi flag from its current value (initially given by first_owi param) only if: - * 1. The journal is full (ie all files are used) - * AND - * 2. oldest_lfid param is non-zero (this is default, but lfid 0 being inverted is logically - * inconsistent with first_owi parameter being present) - * AND - * 3. Either: - * * current lfid == oldest_lfid (ie we are preparing the oldest lfid) - * OR - * * current lfid == bad_lfid AND bad_lfid > oldest (ie we are past the oldest and preparing the - * bad lfid) - */ - if (full && oldest_lfid > 0 && - (lfid == oldest_lfid || (bad_lfid > oldest_lfid && lfid == bad_lfid))) - owi = !owi; - const u_int64_t frid = u_int64_t(random()); - init_fhdr(fh, frid, pfid, lfid, owi); - } - _map.insert(lppair(lfid, fh)); - } - } - - /* - * Method journal_insert(): Used to simulate the insertion of journal files into an existing journal. - * - * after_lfid: The logical file id (lfid) after which the new file is to be inserted. - * num_files: The number of files to be inserted. - * adjust_lids: Flag indicating that the lids of files _following_ the inserted files are to be adjusted upwards - * by the number of inserted files. Not doing so simulates a recovery immediately after insertion - * but before the following files are overwritten with their new lids. If this is set false, then: - * a) after_lfid MUST be the most recent file (_oldest_lfid-1 ie last lfid before owi changes). - * b) This call must be the last insert call. - * - * NOTES: - * 1. It is not possible to insert before lfid/pfid 0; thus these are always coincidental. This operation is - * logically equivalent to inserting after the last lfid, which is possible. - * 2. It is not possible to insert into a journal that is not full. Doing so will result in an unrecoverable - * journal (one that is logically inconsistent that can never occur in reality). - * 3. If a journal is stopped/interrupted immediately after a file insertion, there could be duplicate lids in - * play at recovery, as the following file lids in their headers are only overwritten when the file is - * eventually written to during normal operation. The owi flags, however, are used to determine which of the - * ambiguous lids are the inserted files. - * 4. This function acts on map _map only, and does not create any test files. Call write_journal() to do that. - */ - void journal_insert(const u_int16_t after_lfid, // Insert files after this lfid - const u_int16_t num_files = 1, // Number of files to insert - const bool adjust_lids = true) // Adjust lids following inserted files - { - if (num_files == 0) return; - _num_used_files += num_files; - const u_int16_t num_jfiles_before_append = _map.size(); - lpmap_citr i = _map.find(after_lfid); - if (i == _map.end()) BOOST_FAIL("Unable to find lfid=" << after_lfid << " in map."); - const file_hdr fh_before = (*i).second; - - // Move overlapping lids (if req'd) - if (adjust_lids && after_lfid < num_jfiles_before_append - 1) - { - for (u_int16_t lfid = num_jfiles_before_append - 1; lfid > after_lfid; lfid--) - { - lpmap_citr itr = _map.find(lfid); - if (itr == _map.end()) BOOST_FAIL("Unable to find lfid=" << after_lfid << " in map."); - file_hdr fh = itr->second; - _map.erase(lfid); - fh._lfid += num_files; - if (lfid == _oldest_lfid) - _oldest_lfid += num_files; - _map.insert(lppair(fh._lfid, fh)); - } - } - - // Add new file headers - u_int16_t pfid = num_jfiles_before_append; - u_int16_t lfid = after_lfid + 1; - while (pfid < num_jfiles_before_append + num_files) - { - const u_int64_t frid = u_int64_t(random()); - const size_t fro = 0x200; - const file_hdr fh(RHM_JDAT_FILE_MAGIC, RHM_JDAT_VERSION, frid, pfid, lfid, fro, fh_before.get_owi(), - true); - _map.insert(lppair(lfid, fh)); - _last_pfid = pfid; - pfid++; - lfid++; - } - } - - /* - * Get the list of pfids in the map in order of lfid. The pfids are appended to the supplied vector. Only - * as many headers as are in the map are appended. - * NOTE: will clear any contents from supplied vector before appending pfid list. - */ - void get_pfid_list(vector<u_int16_t>& pfid_list) - { - pfid_list.clear(); - for (lpmap_citr i = _map.begin(); i != _map.end(); i++) - pfid_list.push_back(i->second._pfid); - } - - /* - * Get the list of lfids in the map. The lfids are appended to the supplied vector in the order they appear - * in the map (which is not necessarily the natural or sorted order). - * NOTE: will clear any contents from supplied vector before appending lfid list. - */ - void get_lfid_list(vector<u_int16_t>& lfid_list) - { - lfid_list.clear(); - lfid_list.assign(_map.size(), 0); - for (lpmap_citr i = _map.begin(); i != _map.end(); i++) - lfid_list[i->second._pfid] = i->first; - } - - /* - * Method check_analysis(): Used to check the result of the test jinf object analysis by comparing the pfid order - * array it produces against the internal map. - * - * ji: A ref to the jinf object under test. - */ - void check_analysis(jinf& ji) // jinf object under test after analyze() has been called - { - BOOST_CHECK_EQUAL(ji.get_first_pfid(), get_first_pfid()); - BOOST_CHECK_EQUAL(ji.get_last_pfid(), get_last_pfid()); - - jinf::pfid_list& pfidl = ji.get_pfid_list(); - const u_int16_t num_jfiles = _map.size(); - const bool all_used = _num_used_files == num_jfiles; - BOOST_CHECK_EQUAL(pfidl.size(), _num_used_files); - - const u_int16_t lfid_start = all_used ? _oldest_lfid : 0; - // Because a simulated failure would leave lfid dups in map and last_fid would not exist in map in this - // case, we must find lfid_stop via pfid instead. Search for pfid == num_files. - lpmap_citr itr = _map.begin(); - while (itr != _map.end() && itr->second._pfid != _num_used_files - 1) itr++; - if (itr == _map.end()) - BOOST_FAIL("check(): Unable to find pfid=" << (_num_used_files - 1) << " in map."); - const u_int16_t lfid_stop = itr->second._lfid; - - std::size_t fidl_index = 0; - for (u_int16_t lfid_cnt = lfid_start; lfid_cnt < lfid_stop; lfid_cnt++, fidl_index++) - { - const u_int16_t lfid = lfid_cnt % num_jfiles; - lpmap_citr itr = _map.find(lfid); - if (itr == _map.end()) - BOOST_FAIL("check(): Unable to find lfid=" << lfid << " in map."); - BOOST_CHECK_EQUAL(itr->second._pfid, pfidl[fidl_index]); - } - } - - /* - * Method get_pfid(): Look up a pfid from a known lfid. - */ - u_int16_t get_pfid(const u_int16_t lfid, const bool initial_owi = false) - { - switch (_map.count(lfid)) - { - case 1: - return _map.find(lfid)->second._pfid; - case 2: - for (lpmap_citr itr = _map.lower_bound(lfid); itr != _map.upper_bound(lfid); itr++) - { - if (itr->second.get_owi() != initial_owi) - return itr->second._pfid; - } - default:; - } - BOOST_FAIL("get_pfid(): lfid=" << lfid << " not found in map."); - return 0xffff; - } - - /* - * Method get_first_pfid(): Look up the first (oldest, or next-to-be-overwritten) pfid in the analysis sequence. - */ - u_int16_t get_first_pfid() - { - return get_pfid(_oldest_lfid); - } - - /* - * Method get_last_pfid(): Look up the last (newest, or most recently written) pfid in the analysis sequence. - */ - u_int16_t get_last_pfid() - { - u_int16_t flfid = 0; - if (_num_used_files == _map.size()) // journal full? - { - if (_oldest_lfid) - { - // if failed insert, cycle past duplicate lids - while (_map.count(_oldest_lfid) == 2) - _oldest_lfid++; - while (_map.find(_oldest_lfid) != _map.end() && _map.find(_oldest_lfid)->second.get_owi() == false) - _oldest_lfid++; - flfid = _oldest_lfid - 1; - } - else - flfid = _map.size() - 1; - } - else - flfid = _num_used_files - 1; - return get_pfid(flfid, true); - } - - /* - * Method write_journal(): Used to create the dummy journal files from the built-up map created by calling - * initial_journal_create() and optionally journal_append() one or more times. Since the jinf object reads the - * jinf file and the file headers only, the create object creates a dummy journal file containing only a file - * header (512 bytes each) and a single jinf file which contains the journal metadata required for recovery - * analysis. - */ - void write_journal(const bool ae, const u_int16_t ae_max_jfiles, const u_int32_t fsize_sblks = JFSIZE_SBLKS) - { - create_jinf(ae, ae_max_jfiles); - u_int16_t pfid = 0; - for (lpmap_citr itr = _map.begin(); itr != _map.end(); itr++, pfid++) - { - if (itr->second._pfid == 0 && itr->second._magic == 0) // empty header, use pfid counter instead - create_journal_file(pfid, itr->second, _base_filename, fsize_sblks); - else - create_journal_file(itr->second._pfid, itr->second, _base_filename, fsize_sblks); - } - } - - /* - * Method destroy_journal(): Destroy the files created by create_journal() and reset the lfid_pfid_map test - * object. A new test may be started using the same lfid_pfid_map test object once this call has been made. - */ - void destroy_journal() - { - for (u_int16_t pfid = 0; pfid < _map.size(); pfid++) - { - string fn = create_journal_filename(pfid, _base_filename); - BOOST_WARN_MESSAGE(::unlink(fn.c_str()) == 0, "destroy_journal(): Failed to remove file " << fn); - } - clean_journal_info_file(_base_filename); - _map.clear(); - _num_used_files = 0; - _oldest_lfid = 0; - _last_pfid = 0; - } - - /* - * Method create_new_jinf(): This static call creates a default jinf file only. This is used to test the read - * constructor of a jinf test object which reads a jinf file at instantiation. - */ - static void create_new_jinf(const string jid, const string base_filename, const bool ae) - { - if (jdir::exists(test_dir)) - jdir::delete_dir(test_dir); - create_jinf(NUM_JFILES, ae, (ae ? 5 * NUM_JFILES : 0), jid, base_filename); - } - - /* - * Method clean_journal_info_file(): This static method deletes only a jinf file without harming any other - * journal file or its directory. This is used to clear those tests which rely only on the existence of a - * jinf file. - */ - static void clean_journal_info_file(const string base_filename) - { - stringstream fn; - fn << test_dir << "/" << base_filename << "." << JRNL_INFO_EXTENSION; - BOOST_WARN_MESSAGE(::unlink(fn.str().c_str()) == 0, "clean_journal_info_file(): Failed to remove file " << - fn.str()); - } - - static string create_journal_filename(const u_int16_t pfid, const string base_filename) - { - stringstream fn; - fn << test_dir << "/" << base_filename << "."; - fn << setfill('0') << hex << setw(4) << pfid << "." << JRNL_DATA_EXTENSION; - return fn.str(); - } - - private: - static void init_fhdr(file_hdr& fh, - const u_int64_t frid, - const u_int16_t pfid, - const u_int16_t lfid, - const bool owi, - const bool no_enq = false) - { - fh._magic = RHM_JDAT_FILE_MAGIC; - fh._version = RHM_JDAT_VERSION; -#if defined(JRNL_BIG_ENDIAN) - fh._eflag = RHM_BENDIAN_FLAG; -#else - fh._eflag = RHM_LENDIAN_FLAG; -#endif - fh._uflag = owi ? rec_hdr::HDR_OVERWRITE_INDICATOR_MASK : 0; - fh._rid = frid; - fh._pfid = pfid; - fh._lfid = lfid; - fh._fro = no_enq ? 0 : 0x200; - timespec ts; - ::clock_gettime(CLOCK_REALTIME, &ts); - fh._ts_sec = ts.tv_sec; - fh._ts_nsec = ts.tv_nsec; - } - - void create_jinf(const bool ae, const u_int16_t ae_max_jfiles) - { - if (jdir::exists(test_dir)) - jdir::delete_dir(test_dir); - create_jinf(_map.size(), ae, ae_max_jfiles, _jid, _base_filename); - } - - static void create_jinf(u_int16_t num_files, const bool ae, const u_int16_t ae_max_jfiles, const string jid, - const string base_filename) - { - jdir::create_dir(test_dir); // Check test dir exists; create it if not - timespec ts; - ::clock_gettime(CLOCK_REALTIME, &ts); - jinf ji(jid, test_dir, base_filename, num_files, ae, ae_max_jfiles, JFSIZE_SBLKS, JRNL_WMGR_DEF_PAGE_SIZE, - JRNL_WMGR_DEF_PAGES, ts); - ji.write(); - } - - static void create_journal_file(const u_int16_t pfid, - const file_hdr& fh, - const string base_filename, - const u_int32_t fsize_sblks = JFSIZE_SBLKS, - const char fill_char = 0) - { - const std::string filename = create_journal_filename(pfid, base_filename); - ofstream of(filename.c_str(), ofstream::out | ofstream::trunc); - if (!of.good()) - BOOST_FAIL("Unable to open test journal file \"" << filename << "\" for writing."); - - write_file_header(filename, of, fh, fill_char); - write_file_body(of, fsize_sblks, fill_char); - - of.close(); - if (of.fail() || of.bad()) - BOOST_FAIL("Error closing test journal file \"" << filename << "\"."); - } - - static void write_file_header(const std::string& filename, - ofstream& of, - const file_hdr& fh, - const char fill_char) - { - // write file header - u_int32_t cnt = sizeof(file_hdr); - of.write((const char*)&fh, cnt); - if (of.fail() || of.bad()) - BOOST_FAIL("Error writing file header to test journal file \"" << filename << "\"."); - - // fill remaining sblk with fill char - while (cnt++ < JRNL_DBLK_SIZE * JRNL_SBLK_SIZE) - { - of.put(fill_char); - if (of.fail() || of.bad()) - BOOST_FAIL("Error writing filler to test journal file \"" << filename << "\"."); - } - } - - static void write_file_body(ofstream& of, const u_int32_t fsize_sblks, const char fill_char) - { - if (fsize_sblks > 1) - { - std::vector<char> sblk_buffer(JRNL_DBLK_SIZE * JRNL_SBLK_SIZE, fill_char); - u_int32_t fwritten_sblks = 0; // hdr - while (fwritten_sblks++ < fsize_sblks) - of.write(&sblk_buffer[0], JRNL_DBLK_SIZE * JRNL_SBLK_SIZE); - } - } -}; - -const string -get_test_name(const string& file, const string& test_name) -{ - cout << test_filename << "." << test_name << ": " << flush; - return file + "." + test_name; -} - -bool -check_iores(const string& ctxt, const iores ret, const iores exp_ret, test_dtok* dtp) -{ - if (ret != exp_ret) - { - delete dtp; - BOOST_FAIL(ctxt << ": Expected " << iores_str(exp_ret) << "; got " << iores_str(ret)); - } - return false; -} - -bool -handle_jcntl_response(const iores res, jcntl& jc, unsigned& aio_sleep_cnt, const std::string& ctxt, const iores exp_ret, - test_dtok* dtp) -{ - if (res == RHM_IORES_PAGE_AIOWAIT) - { - if (++aio_sleep_cnt <= MAX_AIO_SLEEPS) - { - jc.get_wr_events(0); // *** GEV2 - usleep(AIO_SLEEP_TIME); - } - else - return check_iores(ctxt, res, exp_ret, dtp); - } - else - return check_iores(ctxt, res, exp_ret, dtp); - return true; -} - -u_int64_t -enq_msg(jcntl& jc, - const u_int64_t rid, - const string& msg, - const bool transient, - const iores exp_ret = RHM_IORES_SUCCESS) -{ - ostringstream ctxt; - ctxt << "enq_msg(" << rid << ")"; - test_dtok* dtp = new test_dtok; - BOOST_CHECK_MESSAGE(dtp != 0, "Data token allocation failed (dtp == 0)."); - dtp->set_rid(rid); - dtp->set_external_rid(true); - try - { - iores res = jc.enqueue_data_record(msg.c_str(), msg.size(), msg.size(), dtp, transient); - check_iores(ctxt.str(), res, exp_ret, dtp); - u_int64_t dtok_rid = dtp->rid(); - if (dtp->done()) delete dtp; - return dtok_rid; - } - catch (exception& e) { delete dtp; throw; } -} - -u_int64_t -enq_extern_msg(jcntl& jc, const u_int64_t rid, const std::size_t msg_size, const bool transient, - const iores exp_ret = RHM_IORES_SUCCESS) -{ - ostringstream ctxt; - ctxt << "enq_extern_msg(" << rid << ")"; - test_dtok* dtp = new test_dtok; - BOOST_CHECK_MESSAGE(dtp != 0, "Data token allocation failed (dtp == 0)."); - dtp->set_rid(rid); - dtp->set_external_rid(true); - try - { - iores res = jc.enqueue_extern_data_record(msg_size, dtp, transient); - check_iores(ctxt.str(), res, exp_ret, dtp); - u_int64_t dtok_rid = dtp->rid(); - if (dtp->done()) delete dtp; - return dtok_rid; - } - catch (exception& e) { delete dtp; throw; } -} - -u_int64_t -enq_txn_msg(jcntl& jc, const u_int64_t rid, const string& msg, const string& xid, const bool transient, - const iores exp_ret = RHM_IORES_SUCCESS) -{ - ostringstream ctxt; - ctxt << "enq_txn_msg(" << rid << ")"; - test_dtok* dtp = new test_dtok; - BOOST_CHECK_MESSAGE(dtp != 0, "Data token allocation failed (dtp == 0)."); - dtp->set_rid(rid); - dtp->set_external_rid(true); - try - { - iores res = jc.enqueue_txn_data_record(msg.c_str(), msg.size(), msg.size(), dtp, xid, - transient); - check_iores(ctxt.str(), res, exp_ret, dtp); - u_int64_t dtok_rid = dtp->rid(); - if (dtp->done()) delete dtp; - return dtok_rid; - } - catch (exception& e) { delete dtp; throw; } -} - -u_int64_t -enq_extern_txn_msg(jcntl& jc, const u_int64_t rid, const std::size_t msg_size, const string& xid, const bool transient, - const iores exp_ret = RHM_IORES_SUCCESS) -{ - ostringstream ctxt; - ctxt << "enq_extern_txn_msg(" << rid << ")"; - test_dtok* dtp = new test_dtok; - BOOST_CHECK_MESSAGE(dtp != 0, "Data token allocation failed (dtp == 0)."); - dtp->set_rid(rid); - dtp->set_external_rid(true); - try - { - iores res = jc.enqueue_extern_txn_data_record(msg_size, dtp, xid, transient); - check_iores(ctxt.str(), res, exp_ret, dtp); - u_int64_t dtok_rid = dtp->rid(); - if (dtp->done()) delete dtp; - return dtok_rid; - } - catch (exception& e) { delete dtp; throw; } -} - -u_int64_t -deq_msg(jcntl& jc, const u_int64_t drid, const u_int64_t rid, const iores exp_ret = RHM_IORES_SUCCESS) -{ - ostringstream ctxt; - ctxt << "deq_msg(" << drid << ")"; - test_dtok* dtp = new test_dtok; - BOOST_CHECK_MESSAGE(dtp != 0, "Data token allocation failed (dtp == 0)."); - dtp->set_rid(rid); - dtp->set_dequeue_rid(drid); - dtp->set_external_rid(true); - dtp->set_wstate(data_tok::ENQ); - try - { - iores res = jc.dequeue_data_record(dtp); - check_iores(ctxt.str(), res, exp_ret, dtp); - u_int64_t dtok_rid = dtp->rid(); - if (dtp->done()) delete dtp; - return dtok_rid; - } - catch (exception& e) { delete dtp; throw; } -} - -u_int64_t -deq_txn_msg(jcntl& jc, const u_int64_t drid, const u_int64_t rid, const string& xid, - const iores exp_ret = RHM_IORES_SUCCESS) -{ - ostringstream ctxt; - ctxt << "deq_txn_msg(" << drid << ")"; - test_dtok* dtp = new test_dtok; - BOOST_CHECK_MESSAGE(dtp != 0, "Data token allocation failed (dtp == 0)."); - dtp->set_rid(rid); - dtp->set_dequeue_rid(drid); - dtp->set_external_rid(true); - dtp->set_wstate(data_tok::ENQ); - try - { - iores res = jc.dequeue_txn_data_record(dtp, xid); - check_iores(ctxt.str(), res, exp_ret, dtp); - u_int64_t dtok_rid = dtp->rid(); - if (dtp->done()) delete dtp; - return dtok_rid; - } - catch (exception& e) { delete dtp; throw; } -} - -u_int64_t -txn_abort(jcntl& jc, const u_int64_t rid, const string& xid, const iores exp_ret = RHM_IORES_SUCCESS) -{ - test_dtok* dtp = new test_dtok; - BOOST_CHECK_MESSAGE(dtp != 0, "Data token allocation failed (dtp == 0)."); - dtp->set_rid(rid); - dtp->set_external_rid(true); - try - { - iores res = jc.txn_abort(dtp, xid); - check_iores("txn_abort", res, exp_ret, dtp); - u_int64_t dtok_rid = dtp->rid(); - if (dtp->done()) delete dtp; - return dtok_rid; - } - catch (exception& e) { delete dtp; throw; } -} - -u_int64_t -txn_commit(jcntl& jc, const u_int64_t rid, const string& xid, const iores exp_ret = RHM_IORES_SUCCESS) -{ - test_dtok* dtp = new test_dtok; - BOOST_CHECK_MESSAGE(dtp != 0, "Data token allocation failed (dtp == 0)."); - dtp->set_rid(rid); - dtp->set_external_rid(true); - try - { - iores res = jc.txn_commit(dtp, xid); - check_iores("txn_commit", res, exp_ret, dtp); - u_int64_t dtok_rid = dtp->rid(); - if (dtp->done()) delete dtp; - return dtok_rid; - } - catch (exception& e) { delete dtp; throw; } -} - -void -read_msg(jcntl& jc, string& msg, string& xid, bool& transient, bool& external, const iores exp_ret = RHM_IORES_SUCCESS) -{ - void* mp = 0; - std::size_t msize = 0; - void* xp = 0; - std::size_t xsize = 0; - test_dtok* dtp = new test_dtok; - BOOST_CHECK_MESSAGE(dtp != 0, "Data token allocation failed (dtp == 0)."); - dtp->set_wstate(data_tok::ENQ); - - unsigned aio_sleep_cnt = 0; - try - { - iores res = jc.read_data_record(&mp, msize, &xp, xsize, transient, external, dtp); - while (handle_jcntl_response(res, jc, aio_sleep_cnt, "read_msg", exp_ret, dtp)) - res = jc.read_data_record(&mp, msize, &xp, xsize, transient, external, dtp); - } - catch (exception& e) { delete dtp; throw; } - - if (mp) - msg.assign((char*)mp, msize); - if (xp) - { - xid.assign((char*)xp, xsize); - std::free(xp); - xp = 0; - } - else if (mp) - { - std::free(mp); - mp = 0; - } - delete dtp; -} - -/* - * Returns the number of messages of size msg_rec_size_dblks that will fit into an empty journal with or without - * corresponding dequeues (controlled by include_deq) without a threshold - ie until the journal is full. Assumes - * that dequeue records fit into one dblk. - */ -u_int32_t -num_msgs_to_full(const u_int16_t num_files, const u_int32_t file_size_dblks, const u_int32_t msg_rec_size_dblks, - bool include_deq) -{ - u_int32_t rec_size_dblks = msg_rec_size_dblks; - if (include_deq) - rec_size_dblks++; - return u_int32_t(::floor(1.0 * num_files * file_size_dblks / rec_size_dblks)); -} - -/* - * Returns the number of messages of size msg_rec_size_dblks that will fit into an empty journal before the enqueue - * threshold of JRNL_ENQ_THRESHOLD (%). - */ -u_int32_t -num_msgs_to_threshold(const u_int16_t num_files, const u_int32_t file_size_dblks, const u_int32_t msg_rec_size_dblks) -{ - return u_int32_t(::floor(1.0 * num_files * file_size_dblks * JRNL_ENQ_THRESHOLD / msg_rec_size_dblks / 100)); -} - -/* - * Returns the amount of space reserved in dblks (== num dequeues assuming dequeue size of 1 dblk) for the enqueue - * threshold of JRNL_ENQ_THRESHOLD (%). - */ -u_int32_t -num_dequeues_rem(const u_int16_t num_files, const u_int32_t file_size_dblks) -{ - /* - * Fraction of journal remaining after threshold is used --------------+ - * Total no. dblks in journal ------+ | - * | | - * +------------+------------+ +-----------------+---------------------+ - */ - return u_int32_t(::ceil(num_files * file_size_dblks * (1.0 - (1.0 * JRNL_ENQ_THRESHOLD / 100)))); -} - -string& -create_msg(string& s, const int msg_num, const int len) -{ - ostringstream oss; - oss << "MSG_" << setfill('0') << setw(6) << msg_num << "_"; - for (int i=12; i<=len; i++) - oss << (char)('0' + i%10); - s.assign(oss.str()); - return s; -} - -string& -create_xid(string& s, const int msg_num, const int len) -{ - ostringstream oss; - oss << "XID_" << setfill('0') << setw(6) << msg_num << "_"; - for (int i=11; i<len; i++) - oss << (char)('a' + i%26); - s.assign(oss.str()); - return s; -} - -long -get_seed() -{ - timespec ts; - if (::clock_gettime(CLOCK_REALTIME, &ts)) - BOOST_FAIL("Unable to read clock to generate seed."); - long tenths = ts.tv_nsec / 100000000; - return long(10 * ts.tv_sec + tenths); // time in tenths of a second -} diff --git a/qpid/cpp/src/tests/legacystore/jrnl/_st_read.cpp b/qpid/cpp/src/tests/legacystore/jrnl/_st_read.cpp deleted file mode 100644 index ff2c39e14c..0000000000 --- a/qpid/cpp/src/tests/legacystore/jrnl/_st_read.cpp +++ /dev/null @@ -1,460 +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 <cmath> -#include <iostream> -#include "qpid/legacystore/jrnl/jcntl.h" - -using namespace boost::unit_test; -using namespace mrg::journal; -using namespace std; - -QPID_AUTO_TEST_SUITE(journal_read) - -const string test_filename("_st_read"); - -#include "_st_helper_fns.h" - -// === Test suite === - -#ifndef LONG_TEST -/* - * ============================================== - * NORMAL TESTS - * This section contains normal "make check" tests - * for building/packaging. These are built when - * LONG_TEST is _not_ defined. - * ============================================== - */ - -QPID_AUTO_TEST_CASE(empty_read) -{ - string test_name = get_test_name(test_filename, "empty_read"); - try - { - string msg; - string rmsg; - string xid; - bool transientFlag; - bool externalFlag; - - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - jc.initialize(NUM_TEST_JFILES, false, 0, TEST_JFSIZE_SBLKS); - read_msg(jc, rmsg, xid, transientFlag, externalFlag, RHM_IORES_EMPTY); - } - catch(const exception& e) { BOOST_FAIL(e.what()); } - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(enqueue_read_dequeue_block) -{ - string test_name = get_test_name(test_filename, "enqueue_read_dequeue_block"); - try - { - string msg; - string rmsg; - string xid; - bool transientFlag; - bool externalFlag; - - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - jc.initialize(NUM_TEST_JFILES, false, 0, TEST_JFSIZE_SBLKS); - for (int m=0; m<NUM_MSGS; m++) - enq_msg(jc, m, create_msg(msg, m, MSG_SIZE), false); - jc.flush(); - for (int m=0; m<NUM_MSGS; m++) - { - read_msg(jc, rmsg, xid, transientFlag, externalFlag); - BOOST_CHECK_EQUAL(create_msg(msg, m, MSG_SIZE), rmsg); - BOOST_CHECK_EQUAL(xid.size(), std::size_t(0)); - BOOST_CHECK_EQUAL(transientFlag, false); - BOOST_CHECK_EQUAL(externalFlag, false); - } - read_msg(jc, rmsg, xid, transientFlag, externalFlag, RHM_IORES_EMPTY); - for (int m=0; m<NUM_MSGS; m++) - deq_msg(jc, m, m+NUM_MSGS); - read_msg(jc, rmsg, xid, transientFlag, externalFlag, RHM_IORES_EMPTY); - } - catch(const exception& e) { BOOST_FAIL(e.what()); } - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(enqueue_read_dequeue_interleaved) -{ - string test_name = get_test_name(test_filename, "enqueue_read_dequeue_interleaved"); - try - { - string msg; - string rmsg; - string xid; - bool transientFlag; - bool externalFlag; - - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - jc.initialize(NUM_TEST_JFILES, false, 0, TEST_JFSIZE_SBLKS); - for (int m=0; m<500*NUM_MSGS; m+=2) - { - enq_msg(jc, m, create_msg(msg, m, MSG_SIZE), false); - jc.flush(); - read_msg(jc, rmsg, xid, transientFlag, externalFlag); - BOOST_CHECK_EQUAL(create_msg(msg, m, MSG_SIZE), rmsg); - BOOST_CHECK_EQUAL(xid.size(), std::size_t(0)); - BOOST_CHECK_EQUAL(transientFlag, false); - BOOST_CHECK_EQUAL(externalFlag, false); - deq_msg(jc, m, m+1); - jc.flush(); - read_msg(jc, rmsg, xid, transientFlag, externalFlag, RHM_IORES_EMPTY); - } - } - catch(const exception& e) { BOOST_FAIL(e.what()); } - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(enqueue_recovered_read_dequeue) -{ - string test_name = get_test_name(test_filename, "enqueue_recovered_read_dequeue"); - try - { - { - string msg; - - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - jc.initialize(NUM_TEST_JFILES, false, 0, TEST_JFSIZE_SBLKS); - for (int m=0; m<NUM_MSGS; m++) - enq_msg(jc, m, create_msg(msg, m, MSG_SIZE), false); - } - { - string msg; - u_int64_t hrid; - string rmsg; - string xid; - bool transientFlag; - bool externalFlag; - - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - jc.recover(NUM_TEST_JFILES, false, 0, TEST_JFSIZE_SBLKS, 0, hrid); - BOOST_CHECK_EQUAL(hrid, u_int64_t(NUM_MSGS - 1)); - jc.recover_complete(); - for (int m=0; m<NUM_MSGS; m++) - { - read_msg(jc, rmsg, xid, transientFlag, externalFlag); - BOOST_CHECK_EQUAL(create_msg(msg, m, MSG_SIZE), rmsg); - BOOST_CHECK_EQUAL(xid.size(), std::size_t(0)); - BOOST_CHECK_EQUAL(transientFlag, false); - BOOST_CHECK_EQUAL(externalFlag, false); - } - read_msg(jc, rmsg, xid, transientFlag, externalFlag, RHM_IORES_EMPTY); - for (int m=0; m<NUM_MSGS; m++) - deq_msg(jc, m, m+NUM_MSGS); - read_msg(jc, rmsg, xid, transientFlag, externalFlag, RHM_IORES_EMPTY); - } - } - catch(const exception& e) { BOOST_FAIL(e.what()); } - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(multi_page_enqueue_recovered_read_dequeue_block) -{ - string test_name = get_test_name(test_filename, "multi_page_enqueue_recovered_read_dequeue_block"); - try - { - { - string msg; - - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - jc.initialize(2*NUM_TEST_JFILES, false, 0, 10*TEST_JFSIZE_SBLKS); - for (int m=0; m<NUM_MSGS*125; m++) - enq_msg(jc, m, create_msg(msg, m, 16*MSG_SIZE), false); - } - { - string msg; - u_int64_t hrid; - string rmsg; - string xid; - bool transientFlag; - bool externalFlag; - - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - jc.recover(2*NUM_TEST_JFILES, false, 0, 10*TEST_JFSIZE_SBLKS, 0, hrid); - BOOST_CHECK_EQUAL(hrid, u_int64_t(NUM_MSGS*125 - 1)); - jc.recover_complete(); - for (int m=0; m<NUM_MSGS*125; m++) - { - read_msg(jc, rmsg, xid, transientFlag, externalFlag); - BOOST_CHECK_EQUAL(create_msg(msg, m, 16*MSG_SIZE), rmsg); - BOOST_CHECK_EQUAL(xid.size(), std::size_t(0)); - BOOST_CHECK_EQUAL(transientFlag, false); - BOOST_CHECK_EQUAL(externalFlag, false); - } - read_msg(jc, rmsg, xid, transientFlag, externalFlag, RHM_IORES_EMPTY); - for (int m=0; m<NUM_MSGS*125; m++) - deq_msg(jc, m, m+NUM_MSGS*125); - read_msg(jc, rmsg, xid, transientFlag, externalFlag, RHM_IORES_EMPTY); - } - } - catch(const exception& e) { BOOST_FAIL(e.what()); } - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(enqueue_recover_read_recovered_read_dequeue_block) -{ - string test_name = get_test_name(test_filename, "enqueue_recover_read_recovered_read_dequeue_block"); - try - { - { - string msg; - - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - jc.initialize(NUM_TEST_JFILES, false, 0, TEST_JFSIZE_SBLKS); - for (int m=0; m<NUM_MSGS; m++) - enq_msg(jc, m, create_msg(msg, m, MSG_SIZE), false); - } - { - string msg; - u_int64_t hrid; - string rmsg; - string xid; - bool transientFlag; - bool externalFlag; - - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - jc.recover(NUM_TEST_JFILES, false, 0, TEST_JFSIZE_SBLKS, 0, hrid); - BOOST_CHECK_EQUAL(hrid, u_int64_t(NUM_MSGS - 1)); - for (int m=0; m<NUM_MSGS; m++) - { - read_msg(jc, rmsg, xid, transientFlag, externalFlag); - BOOST_CHECK_EQUAL(create_msg(msg, m, MSG_SIZE), rmsg); - BOOST_CHECK_EQUAL(xid.size(), std::size_t(0)); - BOOST_CHECK_EQUAL(transientFlag, false); - BOOST_CHECK_EQUAL(externalFlag, false); - } - read_msg(jc, rmsg, xid, transientFlag, externalFlag, RHM_IORES_EMPTY); - } - { - string msg; - u_int64_t hrid; - string rmsg; - string xid; - bool transientFlag; - bool externalFlag; - - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - jc.recover(NUM_TEST_JFILES, false, 0, TEST_JFSIZE_SBLKS, 0, hrid); - BOOST_CHECK_EQUAL(hrid, u_int64_t(NUM_MSGS - 1)); - for (int m=0; m<NUM_MSGS; m++) - { - read_msg(jc, rmsg, xid, transientFlag, externalFlag); - BOOST_CHECK_EQUAL(create_msg(msg, m, MSG_SIZE), rmsg); - BOOST_CHECK_EQUAL(xid.size(), std::size_t(0)); - BOOST_CHECK_EQUAL(transientFlag, false); - BOOST_CHECK_EQUAL(externalFlag, false); - } - read_msg(jc, rmsg, xid, transientFlag, externalFlag, RHM_IORES_EMPTY); - jc.recover_complete(); - for (int m=0; m<NUM_MSGS; m++) - { - read_msg(jc, rmsg, xid, transientFlag, externalFlag); - BOOST_CHECK_EQUAL(create_msg(msg, m, MSG_SIZE), rmsg); - BOOST_CHECK_EQUAL(xid.size(), std::size_t(0)); - BOOST_CHECK_EQUAL(transientFlag, false); - BOOST_CHECK_EQUAL(externalFlag, false); - } - read_msg(jc, rmsg, xid, transientFlag, externalFlag, RHM_IORES_EMPTY); - for (int m=0; m<NUM_MSGS; m++) - deq_msg(jc, m, m+NUM_MSGS); - read_msg(jc, rmsg, xid, transientFlag, externalFlag, RHM_IORES_EMPTY); - } - } - catch(const exception& e) { BOOST_FAIL(e.what()); } - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(delayed_read) -{ - string test_name = get_test_name(test_filename, "delayed_read"); - try - { - string msg; - string rmsg; - string xid; - bool transientFlag; - bool externalFlag; - - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - jc.initialize(NUM_TEST_JFILES, false, 0, TEST_JFSIZE_SBLKS); - unsigned m; - for (m=0; m<2*NUM_MSGS; m+=2) - { - enq_msg(jc, m, create_msg(msg, m, MSG_SIZE), false); - deq_msg(jc, m, m+1); - } - enq_msg(jc, m, create_msg(msg, m, MSG_SIZE), false); - jc.flush(); - read_msg(jc, rmsg, xid, transientFlag, externalFlag); - BOOST_CHECK_EQUAL(msg, rmsg); - } - catch(const exception& e) { BOOST_FAIL(e.what()); } - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(cache_cycled_delayed_read) -{ - string test_name = get_test_name(test_filename, "cache_cycled_delayed_read"); - try - { - string msg; - string rmsg; - string xid; - bool transientFlag; - bool externalFlag; - - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - jc.initialize(NUM_TEST_JFILES, false, 0, TEST_JFSIZE_SBLKS); - unsigned m; - unsigned read_buffer_size_dblks = JRNL_RMGR_PAGES * JRNL_RMGR_PAGE_SIZE * JRNL_SBLK_SIZE; - unsigned n = num_msgs_to_full(1, read_buffer_size_dblks, 16*MSG_REC_SIZE_DBLKS, true); - for (m=0; m<2*2*n + 20; m+=2) // fill read buffer twice + 10 msgs - { - enq_msg(jc, m, create_msg(msg, m, 16*MSG_SIZE), false); - deq_msg(jc, m, m+1); - } - enq_msg(jc, m, create_msg(msg, m, MSG_SIZE), false); - jc.flush(); - read_msg(jc, rmsg, xid, transientFlag, externalFlag); - BOOST_CHECK_EQUAL(msg, rmsg); - } - catch(const exception& e) { BOOST_FAIL(e.what()); } - cout << "ok" << endl; -} - -#else -/* - * ============================================== - * LONG TESTS - * This section contains long tests and soak tests, - * and are run using target check-long (ie "make - * check-long"). These are built when LONG_TEST is - * defined. - * ============================================== - */ - -QPID_AUTO_TEST_CASE(multi_page_enqueue_read_dequeue_block) -{ - string test_name = get_test_name(test_filename, "multi_page_enqueue_read_dequeue_block"); - try - { - string msg; - string rmsg; - string xid; - bool transientFlag; - bool externalFlag; - - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - jc.initialize(2*NUM_TEST_JFILES, false, 0, 10*TEST_JFSIZE_SBLKS); - for (int i=0; i<10; i++) - { - for (int m=0; m<NUM_MSGS*125; m++) - enq_msg(jc, m, create_msg(msg, m, 16*MSG_SIZE), false); - jc.flush(); - for (int m=0; m<NUM_MSGS*125; m++) - { - read_msg(jc, rmsg, xid, transientFlag, externalFlag); - BOOST_CHECK_EQUAL(create_msg(msg, m, 16*MSG_SIZE), rmsg); - BOOST_CHECK_EQUAL(xid.size(), std::size_t(0)); - BOOST_CHECK_EQUAL(transientFlag, false); - BOOST_CHECK_EQUAL(externalFlag, false); - } - read_msg(jc, rmsg, xid, transientFlag, externalFlag, RHM_IORES_EMPTY); - for (int m=0; m<NUM_MSGS*125; m++) - deq_msg(jc, m, m+NUM_MSGS*125); - read_msg(jc, rmsg, xid, transientFlag, externalFlag, RHM_IORES_EMPTY); - } - } - catch(const exception& e) { BOOST_FAIL(e.what()); } - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(increasing_interval_delayed_read) -{ - string test_name = get_test_name(test_filename, "increasing_interval_delayed_read"); - try - { - string msg; - string rmsg; - string xid; - bool transientFlag; - bool externalFlag; - - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - jc.initialize(NUM_TEST_JFILES, false, 0, TEST_JFSIZE_SBLKS); - unsigned read_buffer_size_dblks = JRNL_RMGR_PAGES * JRNL_RMGR_PAGE_SIZE * JRNL_SBLK_SIZE; - unsigned n = num_msgs_to_full(1, read_buffer_size_dblks, MSG_REC_SIZE_DBLKS, true); - unsigned m = 0; - - // Validate read pipeline - enq_msg(jc, m, create_msg(msg, m, MSG_SIZE), false); - jc.flush(); - read_msg(jc, rmsg, xid, transientFlag, externalFlag); - deq_msg(jc, m, m+1); - m += 2; - - // repeat the following multiple times... - for (int i=0; i<10; i++) - { - // Invalidate read pipeline with large write - unsigned t = m + (i*n) + 25; - for (; m<t; m+=2) - { - enq_msg(jc, m, create_msg(msg, m, MSG_SIZE), false); - deq_msg(jc, m, m+1); - } - - // Revalidate read pipeline - enq_msg(jc, m, create_msg(msg, m, MSG_SIZE), false); - jc.flush(); - read_msg(jc, rmsg, xid, transientFlag, externalFlag); - BOOST_CHECK_EQUAL(msg, rmsg); - deq_msg(jc, m, m+1); - m += 2; - } - } - catch(const exception& e) { BOOST_FAIL(e.what()); } - cout << "ok" << endl; -} - -#endif - -QPID_AUTO_TEST_SUITE_END() diff --git a/qpid/cpp/src/tests/legacystore/jrnl/_st_read_txn.cpp b/qpid/cpp/src/tests/legacystore/jrnl/_st_read_txn.cpp deleted file mode 100644 index 621777d8d3..0000000000 --- a/qpid/cpp/src/tests/legacystore/jrnl/_st_read_txn.cpp +++ /dev/null @@ -1,353 +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 <cmath> -#include <iostream> -#include "qpid/legacystore/jrnl/jcntl.h" - -using namespace boost::unit_test; -using namespace mrg::journal; -using namespace std; - -QPID_AUTO_TEST_SUITE(journal_read_txn) - -const string test_filename("_st_read_txn"); - -#include "_st_helper_fns.h" - -// === Test suite === - -QPID_AUTO_TEST_CASE(tx_enqueue_commit_block) -{ - string test_name = get_test_name(test_filename, "tx_enqueue_commit_block"); - try - { - string msg; - string xid; - string rmsg; - string rxid; - bool transientFlag; - bool externalFlag; - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - jc.initialize(NUM_TEST_JFILES, false, 0, TEST_JFSIZE_SBLKS); - create_xid(xid, 0, XID_SIZE); - for (int m=0; m<NUM_MSGS; m++) - enq_txn_msg(jc, m, create_msg(msg, m, MSG_SIZE), xid, false); - jc.flush(); - read_msg(jc, rmsg, rxid, transientFlag, externalFlag, RHM_IORES_TXPENDING); - txn_commit(jc, NUM_MSGS, xid); - jc.flush(); - for (int m=0; m<NUM_MSGS; m++) - { - read_msg(jc, rmsg, rxid, transientFlag, externalFlag); - BOOST_CHECK_EQUAL(create_msg(msg, m, MSG_SIZE), rmsg); - BOOST_CHECK_EQUAL(rxid, xid); - BOOST_CHECK_EQUAL(transientFlag, false); - BOOST_CHECK_EQUAL(externalFlag, false); - } - read_msg(jc, rmsg, rxid, transientFlag, externalFlag, RHM_IORES_EMPTY); - } - catch(const exception& e) { BOOST_FAIL(e.what()); } - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(tx_enqueue_commit_interleaved) -{ - string test_name = get_test_name(test_filename, "tx_enqueue_commit_interleaved"); - try - { - string msg; - string xid; - string rmsg; - string rxid; - bool transientFlag; - bool externalFlag; - - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - jc.initialize(NUM_TEST_JFILES, false, 0, TEST_JFSIZE_SBLKS); - for (int m=0; m<NUM_MSGS; m++) - { - create_xid(xid, 2*m, XID_SIZE); - enq_txn_msg(jc, 2*m, create_msg(msg, 2*m, MSG_SIZE), xid, false); - jc.flush(); - read_msg(jc, rmsg, rxid, transientFlag, externalFlag, RHM_IORES_TXPENDING); - txn_commit(jc, 2*m+1, xid); - jc.flush(); - read_msg(jc, rmsg, rxid, transientFlag, externalFlag); - BOOST_CHECK_EQUAL(create_msg(msg, 2*m, MSG_SIZE), rmsg); - BOOST_CHECK_EQUAL(rxid, xid); - BOOST_CHECK_EQUAL(transientFlag, false); - BOOST_CHECK_EQUAL(externalFlag, false); - } - } - catch(const exception& e) { BOOST_FAIL(e.what()); } - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(tx_enqueue_abort_block) -{ - string test_name = get_test_name(test_filename, "tx_enqueue_abort_block"); - try - { - string msg; - string xid; - string rmsg; - string rxid; - bool transientFlag; - bool externalFlag; - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - jc.initialize(NUM_TEST_JFILES, false, 0, TEST_JFSIZE_SBLKS); - create_xid(xid, 1, XID_SIZE); - for (int m=0; m<NUM_MSGS; m++) - enq_txn_msg(jc, m, create_msg(msg, m, MSG_SIZE), xid, false); - jc.flush(); - read_msg(jc, rmsg, rxid, transientFlag, externalFlag, RHM_IORES_TXPENDING); - txn_abort(jc, NUM_MSGS, xid); - jc.flush(); - read_msg(jc, rmsg, rxid, transientFlag, externalFlag, RHM_IORES_EMPTY); - } - catch(const exception& e) { BOOST_FAIL(e.what()); } - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(tx_enqueue_abort_interleaved) -{ - string test_name = get_test_name(test_filename, "tx_enqueue_abort_interleaved"); - try - { - string msg; - string xid; - string rmsg; - string rxid; - bool transientFlag; - bool externalFlag; - - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - jc.initialize(NUM_TEST_JFILES, false, 0, TEST_JFSIZE_SBLKS); - for (int m=0; m<NUM_MSGS; m++) - { - create_xid(xid, 2*m, XID_SIZE); - enq_txn_msg(jc, 2*m, create_msg(msg, 2*m, MSG_SIZE), xid, false); - jc.flush(); - read_msg(jc, rmsg, rxid, transientFlag, externalFlag, RHM_IORES_TXPENDING); - txn_abort(jc, 2*m+1, xid); - jc.flush(); - read_msg(jc, rmsg, rxid, transientFlag, externalFlag, RHM_IORES_EMPTY); - } - } - catch(const exception& e) { BOOST_FAIL(e.what()); } - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(tx_enqueue_commit_dequeue_block) -{ - string test_name = get_test_name(test_filename, "tx_enqueue_commit_dequeue_block"); - try - { - string msg; - string xid; - string rmsg; - string rxid; - bool transientFlag; - bool externalFlag; - - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - jc.initialize(NUM_TEST_JFILES, false, 0, TEST_JFSIZE_SBLKS); - create_xid(xid, 2, XID_SIZE); - for (int m=0; m<NUM_MSGS; m++) - enq_txn_msg(jc, m, create_msg(msg, m, MSG_SIZE), xid, false); - txn_commit(jc, NUM_MSGS, xid); - for (int m=0; m<NUM_MSGS; m++) - deq_msg(jc, m, m+NUM_MSGS+1); - jc.flush(); - read_msg(jc, rmsg, rxid, transientFlag, externalFlag, RHM_IORES_EMPTY); - } - catch(const exception& e) { BOOST_FAIL(e.what()); } - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(tx_enqueue_commit_dequeue_interleaved) -{ - string test_name = get_test_name(test_filename, "tx_enqueue_commit_dequeue_interleaved"); - try - { - string msg; - string xid; - string rmsg; - string rxid; - bool transientFlag; - bool externalFlag; - - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - jc.initialize(NUM_TEST_JFILES, false, 0, TEST_JFSIZE_SBLKS); - for (int m=0; m<NUM_MSGS; m++) - { - create_xid(xid, 3*m, XID_SIZE); - enq_txn_msg(jc, 3*m, create_msg(msg, m, MSG_SIZE), xid, false); - txn_commit(jc, 3*m+1, xid); - deq_msg(jc, 3*m, 3*m+2); - jc.flush(); - read_msg(jc, rmsg, rxid, transientFlag, externalFlag, RHM_IORES_EMPTY); - } - } - catch(const exception& e) { BOOST_FAIL(e.what()); } - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(enqueue_tx_dequeue_commit_block) -{ - string test_name = get_test_name(test_filename, "enqueue_tx_dequeue_commit_block"); - try - { - string msg; - string xid; - string rmsg; - string rxid; - bool transientFlag; - bool externalFlag; - - create_xid(xid, 3, XID_SIZE); - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - jc.initialize(NUM_TEST_JFILES, false, 0, TEST_JFSIZE_SBLKS); - for (int m=0; m<NUM_MSGS; m++) - enq_msg(jc, m, create_msg(msg, m, MSG_SIZE), false); - for (int m=0; m<NUM_MSGS; m++) - deq_txn_msg(jc, m, m+NUM_MSGS, xid); - jc.flush(); - read_msg(jc, rmsg, rxid, transientFlag, externalFlag, RHM_IORES_TXPENDING); - txn_commit(jc, 2*NUM_MSGS, xid); - jc.flush(); - read_msg(jc, rmsg, rxid, transientFlag, externalFlag, RHM_IORES_EMPTY); - } - catch(const exception& e) { BOOST_FAIL(e.what()); } - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(enqueue_tx_dequeue_commit_interleaved) -{ - string test_name = get_test_name(test_filename, "enqueue_tx_dequeue_commit_interleaved"); - try - { - string msg; - string xid; - string rmsg; - string rxid; - bool transientFlag; - bool externalFlag; - - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - jc.initialize(NUM_TEST_JFILES, false, 0, TEST_JFSIZE_SBLKS); - for (int m=0; m<NUM_MSGS; m++) - { - enq_msg(jc, 3*m, create_msg(msg, 3*m, MSG_SIZE), false); - create_xid(xid, 3*m, XID_SIZE); - deq_txn_msg(jc, 3*m, 3*m+1, xid); - jc.flush(); - read_msg(jc, rmsg, rxid, transientFlag, externalFlag, RHM_IORES_TXPENDING); - txn_commit(jc, 3*m+2, xid); - jc.flush(); - read_msg(jc, rmsg, rxid, transientFlag, externalFlag, RHM_IORES_EMPTY); - } - } - catch(const exception& e) { BOOST_FAIL(e.what()); } - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(enqueue_tx_dequeue_abort_block) -{ - string test_name = get_test_name(test_filename, "enqueue_tx_dequeue_abort_block"); - try - { - string msg; - string xid; - string rmsg; - string rxid; - bool transientFlag; - bool externalFlag; - - create_xid(xid, 4, XID_SIZE); - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - jc.initialize(NUM_TEST_JFILES, false, 0, TEST_JFSIZE_SBLKS); - for (int m=0; m<NUM_MSGS; m++) - enq_msg(jc, m, create_msg(msg, m, MSG_SIZE), false); - for (int m=0; m<NUM_MSGS; m++) - deq_txn_msg(jc, m, m+NUM_MSGS, xid); - jc.flush(); - read_msg(jc, rmsg, rxid, transientFlag, externalFlag, RHM_IORES_TXPENDING); - txn_abort(jc, 2*NUM_MSGS, xid); - jc.flush(); - for (int m=0; m<NUM_MSGS; m++) - { - read_msg(jc, rmsg, rxid, transientFlag, externalFlag); - BOOST_CHECK_EQUAL(create_msg(msg, m, MSG_SIZE), rmsg); - BOOST_CHECK_EQUAL(rxid.length(), std::size_t(0)); - BOOST_CHECK_EQUAL(transientFlag, false); - BOOST_CHECK_EQUAL(externalFlag, false); - } - read_msg(jc, rmsg, rxid, transientFlag, externalFlag, RHM_IORES_EMPTY); - } - catch(const exception& e) { BOOST_FAIL(e.what()); } - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(enqueue_tx_dequeue_abort_interleaved) -{ - string test_name = get_test_name(test_filename, "enqueue_tx_dequeue_abort_interleaved"); - try - { - string msg; - string xid; - string rmsg; - string rxid; - bool transientFlag; - bool externalFlag; - - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - jc.initialize(NUM_TEST_JFILES, false, 0, TEST_JFSIZE_SBLKS); - for (int m=0; m<NUM_MSGS; m++) - { - enq_msg(jc, 3*m, create_msg(msg, 3*m, MSG_SIZE), false); - create_xid(xid, 3*m, XID_SIZE); - deq_txn_msg(jc, 3*m, 3*m+1, xid); - jc.flush(); - read_msg(jc, rmsg, rxid, transientFlag, externalFlag, RHM_IORES_TXPENDING); - txn_abort(jc, 3*m+2, xid); - jc.flush(); - read_msg(jc, rmsg, rxid, transientFlag, externalFlag); - read_msg(jc, rmsg, rxid, transientFlag, externalFlag, RHM_IORES_EMPTY); - } - } - catch(const exception& e) { BOOST_FAIL(e.what()); } - cout << "ok" << endl; -} - -QPID_AUTO_TEST_SUITE_END() diff --git a/qpid/cpp/src/tests/legacystore/jrnl/_ut_enq_map.cpp b/qpid/cpp/src/tests/legacystore/jrnl/_ut_enq_map.cpp deleted file mode 100644 index f05dcb824c..0000000000 --- a/qpid/cpp/src/tests/legacystore/jrnl/_ut_enq_map.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 "../unit_test.h" - -#include <iostream> -#include "qpid/legacystore/jrnl/enq_map.h" -#include "qpid/legacystore/jrnl/jerrno.h" - -using namespace boost::unit_test; -using namespace mrg::journal; -using namespace std; - -QPID_AUTO_TEST_SUITE(enq_map_suite) - -const string test_filename("_ut_enq_map"); - -QPID_AUTO_TEST_CASE(constructor) -{ - cout << test_filename << ".constructor: " << flush; - enq_map e1; - BOOST_CHECK(e1.empty()); - BOOST_CHECK_EQUAL(e1.size(), u_int32_t(0)); - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(insert_get) -{ - cout << test_filename << ".insert_get: " << flush; - u_int16_t pfid; - u_int64_t rid; - u_int16_t pfid_start = 0x2000U; - u_int64_t rid_begin = 0xffffffff00000000ULL; - u_int64_t rid_end = 0xffffffff00000200ULL; - - // insert with no dups - u_int64_t rid_incr_1 = 4ULL; - enq_map e2; - e2.set_num_jfiles(pfid_start + (rid_end - rid_begin)/rid_incr_1); - for (rid = rid_begin, pfid = pfid_start; rid < rid_end; rid += rid_incr_1, pfid++) - BOOST_CHECK_EQUAL(e2.insert_pfid(rid, pfid), enq_map::EMAP_OK); - BOOST_CHECK(!e2.empty()); - BOOST_CHECK_EQUAL(e2.size(), u_int32_t(128)); - - // get - u_int64_t rid_incr_2 = 6ULL; - for (u_int64_t rid = rid_begin; rid < rid_end; rid += rid_incr_2) - { - BOOST_CHECK_EQUAL(e2.is_enqueued(rid), (rid%rid_incr_1 ? false : true)); - u_int16_t exp_pfid = pfid_start + (u_int16_t)((rid - rid_begin)/rid_incr_1); - int16_t ret_fid = e2.get_pfid(rid); - if (ret_fid < enq_map::EMAP_OK) // fail - { - BOOST_CHECK_EQUAL(ret_fid, enq_map::EMAP_RID_NOT_FOUND); - BOOST_CHECK(rid%rid_incr_1); - } - else - { - BOOST_CHECK_EQUAL(ret_fid, exp_pfid); - BOOST_CHECK(rid%rid_incr_1 == 0); - } - if ((rid + rid_incr_2)%(8 * rid_incr_2) == 0) - pfid++; - } - - // insert with dups - for (rid = rid_begin, pfid = pfid_start; rid < rid_end; rid += rid_incr_2, pfid++) - { - int16_t res = e2.insert_pfid(rid, pfid); - if (res < enq_map::EMAP_OK) // fail - { - BOOST_CHECK_EQUAL(res, enq_map::EMAP_DUP_RID); - BOOST_CHECK(rid%rid_incr_1 == 0); - } - else - BOOST_CHECK(rid%rid_incr_1); - } - BOOST_CHECK_EQUAL(e2.size(), u_int32_t(171)); - e2.clear(); - BOOST_CHECK(e2.empty()); - BOOST_CHECK_EQUAL(e2.size(), u_int32_t(0)); - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(get_remove) -{ - cout << test_filename << ".get_remove: " << flush; - u_int16_t pfid; - u_int64_t rid; - u_int16_t pfid_start = 0x3000U; - u_int64_t rid_begin = 0xeeeeeeee00000000ULL; - u_int64_t rid_end = 0xeeeeeeee00000200ULL; - - u_int64_t rid_incr_1 = 4ULL; - u_int64_t num_incr_1 = (rid_end - rid_begin)/rid_incr_1; - enq_map e3; - e3.set_num_jfiles(pfid_start + (rid_end - rid_begin)/rid_incr_1); - for (rid = rid_begin, pfid = pfid_start; rid < rid_end; rid += rid_incr_1, pfid++) - BOOST_CHECK_EQUAL(e3.insert_pfid(rid, pfid), enq_map::EMAP_OK); - BOOST_CHECK_EQUAL(e3.size(), num_incr_1); - - u_int64_t rid_incr_2 = 6ULL; - for (rid = rid_begin, pfid = pfid_start; rid < rid_end; rid += rid_incr_2, pfid++) - { - u_int16_t exp_pfid = pfid_start + (u_int16_t)((rid - rid_begin)/rid_incr_1); - int16_t ret_fid = e3.get_remove_pfid(rid); - if (ret_fid < enq_map::EMAP_OK) // fail - { - BOOST_CHECK_EQUAL(ret_fid, enq_map::EMAP_RID_NOT_FOUND); - BOOST_CHECK(rid%rid_incr_1); - } - else - { - BOOST_CHECK_EQUAL(ret_fid, exp_pfid); - BOOST_CHECK(rid%rid_incr_1 == 0); - } - } - BOOST_CHECK_EQUAL(e3.size(), u_int32_t(85)); - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(lock) -{ - cout << test_filename << ".lock: " << flush; - u_int16_t pfid; - u_int64_t rid; - u_int16_t pfid_start = 0x4000U; - u_int64_t rid_begin = 0xdddddddd00000000ULL; - u_int64_t rid_end = 0xdddddddd00000200ULL; - - // insert, every second entry is locked - u_int64_t rid_incr_1 = 4ULL; - u_int64_t num_incr_1 = (rid_end - rid_begin)/rid_incr_1; - bool locked = false; - enq_map e4; - e4.set_num_jfiles(pfid_start + (rid_end - rid_begin)/rid_incr_1); - for (rid = rid_begin, pfid = pfid_start; rid < rid_end; rid += rid_incr_1, pfid++) - { - BOOST_CHECK_EQUAL(e4.insert_pfid(rid, pfid, locked), enq_map::EMAP_OK); - locked = !locked; - } - BOOST_CHECK_EQUAL(e4.size(), num_incr_1); - - // unlock and lock non-existent rids - int16_t res = e4.lock(1ULL); - if (res < enq_map::EMAP_OK) - BOOST_CHECK_EQUAL(res, enq_map::EMAP_RID_NOT_FOUND); - else - BOOST_ERROR("Failed to detect locking non-existent rid."); - res = e4.unlock(2ULL); - if (res < enq_map::EMAP_OK) - BOOST_CHECK_EQUAL(res, enq_map::EMAP_RID_NOT_FOUND); - else - BOOST_ERROR("Failed to detect unlocking non-existent rid."); - - // get / unlock - for (u_int64_t rid = rid_begin; rid < rid_end; rid += rid_incr_1) - { - int16_t fid = e4.get_pfid(rid); - if (fid < enq_map::EMAP_OK) // fail - { - BOOST_CHECK_EQUAL(fid, enq_map::EMAP_LOCKED); - BOOST_CHECK(rid%(2*rid_incr_1)); - // unlock, read, then relock - BOOST_CHECK_EQUAL(e4.unlock(rid), enq_map::EMAP_OK); - BOOST_CHECK(e4.get_pfid(rid) >= enq_map::EMAP_OK); - BOOST_CHECK_EQUAL(e4.lock(rid), enq_map::EMAP_OK); - fid = e4.get_pfid(rid); - if (fid < enq_map::EMAP_OK) // fail - BOOST_CHECK_EQUAL(fid, enq_map::EMAP_LOCKED); - else - BOOST_ERROR("Failed to prevent getting locked record"); - } - } - - // remove all; if locked, use with txn_flag true; should ignore all locked records - for (u_int64_t rid = rid_begin; rid < rid_end; rid += rid_incr_1) - BOOST_CHECK(e4.get_remove_pfid(rid, true) >= enq_map::EMAP_OK); - BOOST_CHECK(e4.empty()); - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(lists) -{ - cout << test_filename << ".lists: " << flush; - u_int16_t pfid; - u_int64_t rid; - u_int16_t pfid_start = 0x5000UL; - u_int64_t rid_begin = 0xdddddddd00000000ULL; - u_int64_t rid_end = 0xdddddddd00000200ULL; - - // insert, every second entry is locked - u_int64_t rid_incr_1 = 4ULL; - u_int64_t num_incr_1 = (rid_end - rid_begin)/rid_incr_1; - vector<u_int64_t> rid_list; - vector<u_int16_t> pfid_list; - enq_map e5; - e5.set_num_jfiles(pfid_start + (rid_end - rid_begin)/rid_incr_1); - for (rid = rid_begin, pfid = pfid_start; rid < rid_end; rid += rid_incr_1, pfid++) - { - BOOST_CHECK_EQUAL(e5.insert_pfid(rid, pfid), enq_map::EMAP_OK); - rid_list.push_back(rid); - pfid_list.push_back(pfid); - } - BOOST_CHECK_EQUAL(e5.size(), num_incr_1); - BOOST_CHECK_EQUAL(rid_list.size(), num_incr_1); - BOOST_CHECK_EQUAL(pfid_list.size(), num_incr_1); - - vector<u_int64_t> ret_rid_list; - e5.rid_list(ret_rid_list); - BOOST_CHECK_EQUAL(ret_rid_list.size(), num_incr_1); - for (unsigned i=0; i<ret_rid_list.size(); i++) - BOOST_CHECK_EQUAL(rid_list[i], ret_rid_list[i]); - - vector<u_int16_t> ret_pfid_list; - e5.pfid_list(ret_pfid_list); - BOOST_CHECK_EQUAL(ret_pfid_list.size(), num_incr_1); - for (unsigned i=0; i<ret_pfid_list.size(); i++) - BOOST_CHECK_EQUAL(pfid_list[i], ret_pfid_list[i]); - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(enq_count) -{ - cout << test_filename << ".enq_count: " << flush; - - enq_map e6; - - // Check the allocation and cleanup as the file size is set both up and down - e6.set_num_jfiles(24); - e6.set_num_jfiles(0); - e6.set_num_jfiles(100); - e6.set_num_jfiles(4); - - // Add 100 enqueues to file 1, check that the counts match - for (u_int16_t pfid=0; pfid<4; pfid++) - BOOST_CHECK_EQUAL(e6.get_enq_cnt(pfid), u_int32_t(0)); - for (u_int64_t rid=0; rid<100; rid++) - BOOST_CHECK_EQUAL(e6.insert_pfid(rid, 1), enq_map::EMAP_OK); - for (u_int16_t pfid=0; pfid<4; pfid++) - { - if (pfid == 1) - BOOST_CHECK_EQUAL(e6.get_enq_cnt(pfid), u_int32_t(100)); - else - BOOST_CHECK_EQUAL(e6.get_enq_cnt(pfid), u_int32_t(0)); - } - - // Now remove 10 from file 1, check that the counts match - for (u_int64_t rid=0; rid<100; rid+=10) - //e6.Xget_remove_pfid(rid); - BOOST_CHECK(e6.get_remove_pfid(rid) >= enq_map::EMAP_OK); - for (u_int16_t pfid=0; pfid<4; pfid++) - { - if (pfid == 1) - BOOST_CHECK_EQUAL(e6.get_enq_cnt(pfid), u_int32_t(90)); - else - BOOST_CHECK_EQUAL(e6.get_enq_cnt(pfid), u_int32_t(0)); - } - - // Now resize the file up and make sure the count in file 1 still exists - e6.set_num_jfiles(8); - for (u_int16_t pfid=0; pfid<8; pfid++) - { - if (pfid == 1) - BOOST_CHECK_EQUAL(e6.get_enq_cnt(pfid), u_int32_t(90)); - else - BOOST_CHECK_EQUAL(e6.get_enq_cnt(pfid), u_int32_t(0)); - } - - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(stress) -{ - cout << test_filename << ".stress: " << flush; - u_int64_t rid; - u_int64_t rid_cnt; - u_int64_t rid_begin = 0xffffffff00000000ULL; - u_int64_t num_rid = 10; - - enq_map e7; - e7.set_num_jfiles(rid_begin + num_rid); - - // insert even rids with no dups - for (rid = rid_begin, rid_cnt = u_int64_t(0); rid_cnt < num_rid; rid += 2ULL, rid_cnt++) - BOOST_CHECK_EQUAL(e7.insert_pfid(rid, u_int16_t(0)), enq_map::EMAP_OK); - BOOST_CHECK_EQUAL(e7.size(), num_rid); - - // insert odd rids with no dups - for (rid = rid_begin + 1, rid_cnt = u_int64_t(0); rid_cnt < num_rid; rid += 2ULL, rid_cnt++) - BOOST_CHECK_EQUAL(e7.insert_pfid(rid, u_int16_t(0)), enq_map::EMAP_OK); - BOOST_CHECK_EQUAL(e7.size(), num_rid * 2); - - // remove even rids - for (rid = rid_begin, rid_cnt = u_int64_t(0); rid_cnt < num_rid; rid += 2ULL, rid_cnt++) - BOOST_CHECK(e7.get_remove_pfid(rid) >= enq_map::EMAP_OK); - BOOST_CHECK_EQUAL(e7.size(), num_rid); - - cout << "ok" << endl; -} - -QPID_AUTO_TEST_SUITE_END() diff --git a/qpid/cpp/src/tests/legacystore/jrnl/_ut_jdir.cpp b/qpid/cpp/src/tests/legacystore/jrnl/_ut_jdir.cpp deleted file mode 100644 index b55d5ff8ef..0000000000 --- a/qpid/cpp/src/tests/legacystore/jrnl/_ut_jdir.cpp +++ /dev/null @@ -1,416 +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 <cerrno> -#include <cstring> -#include <dirent.h> -#include <fstream> -#include <iomanip> -#include <iostream> -#include "qpid/legacystore/jrnl/file_hdr.h" -#include "qpid/legacystore/jrnl/jcfg.h" -#include "qpid/legacystore/jrnl/jdir.h" -#include "qpid/legacystore/jrnl/jerrno.h" -#include "qpid/legacystore/jrnl/jexception.h" -#include <sys/stat.h> - -#define NUM_JFILES 4 -#define JFSIZE_SBLKS 128 - -#define ERRORSTR(e) std::strerror(e) << " (" << e << ")" -#define NUM_CLEAR_OPS 20 - -using namespace boost::unit_test; -using namespace mrg::journal; -using namespace std; - -QPID_AUTO_TEST_SUITE(jdir_suite) - -const string test_filename("_ut_jdir"); -const char* tdp = getenv("TMP_DATA_DIR"); -const string test_dir(tdp && strlen(tdp) > 0 ? string(tdp) + "/_ut_jdir" : "/var/tmp/_ut_jdir"); - -// === Helper functions === - -void create_file(const char* filename, mode_t fmode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) -{ - ofstream of(filename, ofstream::out | ofstream::trunc); - if (!of.good()) - BOOST_FAIL("Unable to open file " << filename << " for writing."); - of.write(filename, std::strlen(filename)); - of.close(); - ::chmod(filename, fmode); -} - -void create_file(const string filename, mode_t fmode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) -{ - create_file(filename.c_str(), fmode); -} - -void create_jdat_file(const char* dirname, const char* base_filename, u_int32_t fid, - u_int64_t first_rid) -{ - stringstream fn; - fn << dirname << "/" << base_filename << "."; - fn << setfill('0') << hex << setw(4) << fid << ".jdat"; - file_hdr fh(RHM_JDAT_FILE_MAGIC, RHM_JDAT_VERSION, 0, first_rid, fid, 0x200, true); - ofstream of(fn.str().c_str(), ofstream::out | ofstream::trunc); - if (!of.good()) - BOOST_FAIL("Unable to open journal data file " << fn.str() << " for writing."); - of.write((const char*)&fh, sizeof(file_hdr)); - of.close(); -} - -void create_jinf_file(const char* dirname, const char* base_filename) -{ - timespec ts; - ::clock_gettime(CLOCK_REALTIME, &ts); - jinf ji("test journal id", dirname, base_filename, NUM_JFILES, false, 0, JFSIZE_SBLKS, - JRNL_WMGR_DEF_PAGE_SIZE, JRNL_WMGR_DEF_PAGES, ts); - ji.write(); -} - -void create_jrnl_fileset(const char* dirname, const char* base_filename) -{ - create_jinf_file(dirname, base_filename); - for (u_int32_t fid = 0; fid < NUM_JFILES; fid++) - { - u_int64_t rid = 0x12340000 + (fid * 0x25); - create_jdat_file(dirname, base_filename, fid, rid); - } -} - -unsigned count_dir_contents(const char* dirname, bool incl_files, bool incl_dirs = true) -{ - struct dirent* entry; - struct stat s; - unsigned file_cnt = 0; - unsigned dir_cnt = 0; - unsigned other_cnt = 0; - DIR* dir = ::opendir(dirname); - if (!dir) - BOOST_FAIL("Unable to open directory " << dirname); - while ((entry = ::readdir(dir)) != NULL) - { - // Ignore . and .. - if (std::strcmp(entry->d_name, ".") != 0 && std::strcmp(entry->d_name, "..") != 0) - { - stringstream fn; - fn << dirname << "/" << entry->d_name; - if (::stat(fn.str().c_str(), &s)) - BOOST_FAIL("Unable to stat dir entry " << entry->d_name << "; err=" << - ERRORSTR(errno)); - if (S_ISREG(s.st_mode)) - file_cnt++; - else if (S_ISDIR(s.st_mode)) - dir_cnt++; - else - other_cnt++; - } - } - ::closedir(dir); - if (incl_files) - { - if (incl_dirs) - return file_cnt + dir_cnt; - return file_cnt; - } - else if (incl_dirs) - return dir_cnt; - return other_cnt; -} - -void check_dir_contents(const char* dirname, const char* base_filename, unsigned num_subdirs, - bool jrnl_present) -{ - if (jdir::is_dir(dirname)) - { - // Subdir count - BOOST_CHECK_EQUAL(count_dir_contents(dirname, false, true), num_subdirs); - - // Journal file count - unsigned num_jrnl_files = jrnl_present ? NUM_JFILES + 1 : 0; - BOOST_CHECK_EQUAL(count_dir_contents(dirname, true, false), num_jrnl_files); - - // Check journal files are present - if (jrnl_present) - try { jdir::verify_dir(dirname, base_filename); } - catch(const jexception& e) { BOOST_ERROR(e); } - for (unsigned subdir_num = 1; subdir_num <= num_subdirs; subdir_num++) - { - stringstream subdir_name; - subdir_name << dirname << "/_" << base_filename << ".bak."; - subdir_name << hex << setfill('0') << setw(4) << subdir_num; - try { jdir::verify_dir(subdir_name.str().c_str(), base_filename); } - catch(const jexception& e) { BOOST_ERROR(e); } - } - } - else - BOOST_ERROR(dirname << " is not a directory"); -} - -void check_dir_not_existing(const char* dirname) -{ - if (jdir::exists(dirname) && jdir::is_dir(dirname)) - jdir::delete_dir(dirname); - if (jdir::exists(dirname)) - BOOST_FAIL("Unable to remove directory " << dirname); -} - -void check_dir_not_existing(const string dirname) -{ - check_dir_not_existing(dirname.c_str()); -} - -// === Test suite === - -QPID_AUTO_TEST_CASE(constructor) -{ - cout << test_filename << ".constructor: " << flush; - string dir(test_dir + "/A/B/C/D/E/F"); - string bfn("test_base"); - jdir dir1(dir, bfn); - BOOST_CHECK(dir1.dirname().compare(dir) == 0); - BOOST_CHECK(dir1.base_filename().compare(bfn) == 0); - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(create_delete_dir) -{ - cout << test_filename << ".create_delete_dir: " << flush; - // Use instance - string dir_A(test_dir + "/A"); - string dir_Ats(test_dir + "/A/"); // trailing '/' - check_dir_not_existing(test_dir + "/A"); - jdir dir1(dir_A, "test_base"); - dir1.create_dir(); - // check all combos of jdir::exists and jdir::is_dir() - BOOST_CHECK(jdir::exists(dir_A)); - BOOST_CHECK(jdir::exists(dir_Ats)); - BOOST_CHECK(jdir::exists(dir_A.c_str())); - BOOST_CHECK(jdir::exists(dir_Ats.c_str())); - BOOST_CHECK(jdir::is_dir(dir_A)); - BOOST_CHECK(jdir::is_dir(dir_Ats)); - BOOST_CHECK(jdir::is_dir(dir_Ats.c_str())); - BOOST_CHECK(jdir::is_dir(dir_Ats.c_str())); - // do it a second time when dir exists - dir1.create_dir(); - BOOST_CHECK(jdir::is_dir(dir_A)); - dir1.delete_dir(); - BOOST_CHECK(!jdir::exists(dir_A)); - - // Use static fn - check_dir_not_existing(test_dir + "/B"); - jdir::create_dir(test_dir + "/B"); - BOOST_CHECK(jdir::is_dir(test_dir + "/B")); - jdir::create_dir(test_dir + "/B"); - BOOST_CHECK(jdir::is_dir(test_dir + "/B")); - jdir::delete_dir(test_dir + "/B"); - BOOST_CHECK(!jdir::exists(test_dir + "/B")); - - // Non-empty dirs - check_dir_not_existing(test_dir + "/C"); - jdir::create_dir(test_dir + "/C"); - BOOST_CHECK(jdir::is_dir(test_dir + "/C")); - create_file(test_dir + "/C/test_file_1.txt"); // mode 644 (default) - create_file(test_dir + "/C/test_file_2.txt", S_IRWXU | S_IRWXG | S_IRWXO); // mode 777 - create_file(test_dir + "/C/test_file_3.txt", S_IRUSR | S_IRGRP | S_IROTH); // mode 444 (read-only) - create_file(test_dir + "/C/test_file_4.txt", 0); // mode 000 (no permissions) - BOOST_CHECK(jdir::is_dir(test_dir + "/C")); - jdir::create_dir(test_dir + "/C"); - BOOST_CHECK(jdir::is_dir(test_dir + "/C")); - jdir::delete_dir(test_dir + "/C"); - BOOST_CHECK(!jdir::exists(test_dir + "/C")); - - // Check non-existent dirs fail - check_dir_not_existing(test_dir + "/D"); - try - { - jdir::is_dir(test_dir + "/D"); - BOOST_ERROR("jdir::is_dir() failed to throw jexeption for non-existent directory."); - } - catch(const jexception& e) - { - BOOST_CHECK_EQUAL(e.err_code(), jerrno::JERR_JDIR_STAT); - } - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(create_delete_dir_recursive) -{ - cout << test_filename << ".create_delete_dir_recursive: " << flush; - // Use instances - check_dir_not_existing(test_dir + "/E"); - jdir dir1(test_dir + "/E/F/G/H", "test_base"); - dir1.create_dir(); - BOOST_CHECK(jdir::is_dir(test_dir + "/E/F/G/H")); - dir1.delete_dir(); - BOOST_CHECK(!jdir::exists(test_dir + "/E/F/G/H")); // only H deleted, E/F/G remain - BOOST_CHECK(jdir::exists(test_dir + "/E/F/G")); - jdir::delete_dir(test_dir + "/E"); // delete remaining dirs - BOOST_CHECK(!jdir::exists(test_dir + "/E")); - - check_dir_not_existing(test_dir + "/F"); - jdir dir2(test_dir + "/F/G/H/I/", "test_base"); // trailing '/' - dir2.create_dir(); - BOOST_CHECK(jdir::is_dir(test_dir + "/F/G/H/I/")); - dir2.delete_dir(); - BOOST_CHECK(!jdir::exists(test_dir + "/F/G/H/I/")); - BOOST_CHECK(jdir::exists(test_dir + "/F/G/H/")); - jdir::delete_dir(test_dir + "/F"); - BOOST_CHECK(!jdir::exists(test_dir + "/F")); - - check_dir_not_existing(test_dir + "/G"); - jdir dir3(test_dir + "/G/H//I//J", "test_base"); // extra '/' in path - dir3.create_dir(); - BOOST_CHECK(jdir::is_dir(test_dir + "/G/H//I//J")); - dir3.delete_dir(); - BOOST_CHECK(!jdir::exists(test_dir + "/G/H//I//J")); - BOOST_CHECK(jdir::exists(test_dir + "/G/H//I")); - jdir::delete_dir(test_dir + "/F"); - BOOST_CHECK(!jdir::exists(test_dir + "/F")); - - // Use static fn - check_dir_not_existing(test_dir + "/H"); - jdir::create_dir(test_dir + "/H/I/J/K"); - BOOST_CHECK(jdir::is_dir(test_dir + "/H/I/J/K")); - jdir::delete_dir(test_dir + "/H/I/J/K"); - BOOST_CHECK(!jdir::exists(test_dir + "/H/I/J/K")); // only J deleted, H/I/J remain - BOOST_CHECK(jdir::exists(test_dir + "/H/I/J")); - jdir::delete_dir(test_dir + "/H"); - BOOST_CHECK(!jdir::exists(test_dir + "/H")); - - check_dir_not_existing(test_dir + "/I"); - jdir::create_dir(test_dir + "/I/J/K/L/"); // trailing '/' - BOOST_CHECK(jdir::is_dir(test_dir + "/I/J/K/L/")); - jdir::delete_dir(test_dir + "/I/J/K/L/"); - BOOST_CHECK(!jdir::exists(test_dir + "/I/J/K/L/")); - BOOST_CHECK(jdir::exists(test_dir + "/I/J/K/")); - jdir::delete_dir(test_dir + "/I"); - BOOST_CHECK(!jdir::exists(test_dir + "/I")); - - check_dir_not_existing(test_dir + "//J"); - jdir::create_dir(test_dir + "//J//K//L//M"); // extra '/' in path - BOOST_CHECK(jdir::is_dir(test_dir + "//J//K//L//M")); - jdir::delete_dir(test_dir + "//J//K//L//M"); - BOOST_CHECK(!jdir::exists(test_dir + "//J//K//L//M")); - BOOST_CHECK(jdir::exists(test_dir + "//J//K//L")); - jdir::delete_dir(test_dir + "//J"); - BOOST_CHECK(!jdir::exists(test_dir + "//J")); - - // Non-empty dirs - check_dir_not_existing(test_dir + "/K"); - jdir::create_dir(test_dir + "/K/L/M1/N1"); - jdir::create_dir(test_dir + "/K/L/M1/N2"); - jdir::create_dir(test_dir + "/K/L/M1/N3"); - jdir::create_dir(test_dir + "/K/L/M1/N4"); - create_file(test_dir + "/K/L/M1/N4/test_file_1.txt"); // mode 644 (default) - create_file(test_dir + "/K/L/M1/N4/test_file_2.txt", S_IRWXU | S_IRWXG | S_IRWXO); // mode 777 - create_file(test_dir + "/K/L/M1/N4/test_file_3.txt", S_IRUSR | S_IRGRP | S_IROTH); // mode 444 - create_file(test_dir + "/K/L/M1/N4/test_file_4.txt", 0); // mode 000 (no permissions) - jdir::create_dir(test_dir + "/K/L/M2"); - jdir::create_dir(test_dir + "/K/L/M3/N5"); - jdir::create_dir(test_dir + "/K/L/M3/N6"); - BOOST_CHECK(jdir::is_dir(test_dir + "/K/L/M1/N1")); - BOOST_CHECK(jdir::is_dir(test_dir + "/K/L/M1/N2")); - BOOST_CHECK(jdir::is_dir(test_dir + "/K/L/M1/N3")); - BOOST_CHECK(jdir::is_dir(test_dir + "/K/L/M1/N4")); - BOOST_CHECK(jdir::is_dir(test_dir + "/K/L/M2")); - BOOST_CHECK(jdir::is_dir(test_dir + "/K/L/M3/N5")); - BOOST_CHECK(jdir::is_dir(test_dir + "/K/L/M3/N6")); - jdir::delete_dir(test_dir + "/K"); - BOOST_CHECK(!jdir::exists(test_dir + "/K")); - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(clear_verify_dir) -{ - cout << test_filename << ".clear_verify_dir: " << flush; - // Use instances - const char* jrnl_dir = "/var/tmp/test_dir_1"; - const char* bfn = "test_base"; - check_dir_not_existing(jrnl_dir); - jdir test_dir_1(jrnl_dir, bfn); - test_dir_1.create_dir(); - BOOST_CHECK(jdir::is_dir(jrnl_dir)); - // add journal files, check they exist, then clear them - unsigned cnt = 0; - while (cnt < NUM_CLEAR_OPS) - { - create_jrnl_fileset(jrnl_dir, bfn); - check_dir_contents(jrnl_dir, bfn, cnt, true); - test_dir_1.clear_dir(); - check_dir_contents(jrnl_dir, bfn, ++cnt, false); - } - // clean up - test_dir_1.delete_dir(); - BOOST_CHECK(!jdir::exists(jrnl_dir)); - - // Non-existent dir with auto-create true - jrnl_dir = "/var/tmp/test_dir_2"; - check_dir_not_existing(jrnl_dir); - jdir test_dir_2(jrnl_dir, bfn); - // clear dir - test_dir_2.clear_dir(); // create flag is true by default - check_dir_contents(jrnl_dir, bfn, 0, false); - // clear empty dir, should not create subdir - test_dir_2.clear_dir(); // create flag is true by default - check_dir_contents(jrnl_dir, bfn, 0, false); - // clean up - test_dir_2.delete_dir(); - BOOST_CHECK(!jdir::exists(jrnl_dir)); - - // non-existent dir with auto-create false - jrnl_dir = "/var/tmp/test_dir_3"; - check_dir_not_existing(jrnl_dir); - jdir test_dir_3(jrnl_dir, bfn); - try - { - test_dir_3.clear_dir(false); - BOOST_ERROR("jdir::clear_dir(flase) failed to throw jexeption for non-existent directory."); - } - catch(const jexception& e) - { - BOOST_CHECK_EQUAL(e.err_code(), jerrno::JERR_JDIR_OPENDIR); - } - - // Use static fn - jrnl_dir = "/var/tmp/test_dir_4"; - check_dir_not_existing(jrnl_dir); - jdir::clear_dir(jrnl_dir, bfn); // should create dir if it does not exist - // add journal files, check they exist, then clear them - cnt = 0; - while (cnt < NUM_CLEAR_OPS) - { - create_jrnl_fileset(jrnl_dir, bfn); - check_dir_contents(jrnl_dir, bfn, cnt, true); - jdir::clear_dir(jrnl_dir, bfn); - check_dir_contents(jrnl_dir, bfn, ++cnt, false); - } - // clean up - jdir::delete_dir(jrnl_dir); - BOOST_CHECK(!jdir::exists(jrnl_dir)); - cout << "ok" << endl; -} - -QPID_AUTO_TEST_SUITE_END() diff --git a/qpid/cpp/src/tests/legacystore/jrnl/_ut_jerrno.cpp b/qpid/cpp/src/tests/legacystore/jrnl/_ut_jerrno.cpp deleted file mode 100644 index 1ae1138355..0000000000 --- a/qpid/cpp/src/tests/legacystore/jrnl/_ut_jerrno.cpp +++ /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. - * - */ - -#include "../unit_test.h" - -#include <cstring> -#include <iostream> -#include "qpid/legacystore/jrnl/jerrno.h" - -using namespace boost::unit_test; -using namespace mrg::journal; -using namespace std; - -QPID_AUTO_TEST_SUITE(jerrno_suite) -using namespace mrg::journal; - -const string test_filename("_ut_jerrno"); - -QPID_AUTO_TEST_CASE(jerrno_val) -{ - cout << test_filename << ".jerrno_val: " << flush; - const char* m = "JERR__MALLOC"; - string malloc_msg = string(jerrno::err_msg(jerrno::JERR__MALLOC)); - BOOST_CHECK(malloc_msg.substr(0, std::strlen(m)).compare(m) == 0); - BOOST_CHECK(std::strcmp(jerrno::err_msg(0), "<Unknown error code>") == 0); - cout << "ok" << endl; -} - -QPID_AUTO_TEST_SUITE_END() diff --git a/qpid/cpp/src/tests/legacystore/jrnl/_ut_jexception.cpp b/qpid/cpp/src/tests/legacystore/jrnl/_ut_jexception.cpp deleted file mode 100644 index 8b9e876aa6..0000000000 --- a/qpid/cpp/src/tests/legacystore/jrnl/_ut_jexception.cpp +++ /dev/null @@ -1,346 +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 <cstring> -#include <iostream> -#include "qpid/legacystore/jrnl/jerrno.h" -#include "qpid/legacystore/jrnl/jexception.h" - -using namespace boost::unit_test; -using namespace mrg::journal; -using namespace std; - -QPID_AUTO_TEST_SUITE(jexception_suite) - -const string test_filename("_ut_jexception"); - -// === Helper functions === - -void throw_exception(const jexception& e, std::size_t what_len, std::size_t ai_len, - std::size_t tc_len, std::size_t tf_len) -{ - try { throw e; } - catch (const jexception& e) - { - BOOST_CHECK_EQUAL(std::strlen(e.what()), what_len); - BOOST_CHECK_EQUAL(e.additional_info().size(), ai_len); - BOOST_CHECK_EQUAL(e.throwing_class().size(), tc_len); - BOOST_CHECK_EQUAL(e.throwing_fn().size(), tf_len); - } -} - -void throw_exception(const jexception& e, std::size_t what_len, std::size_t ai_len) -{ - throw_exception(e, what_len, ai_len, 0, 0); -} - -void throw_exception(const jexception& e, std::size_t what_len, std::size_t tc_len, - std::size_t tf_len) -{ - throw_exception(e, what_len, 0, tc_len, tf_len); -} - -// === Test suite === - -QPID_AUTO_TEST_CASE(constructor_1) -{ - cout << test_filename << ".constructor_1: " << flush; - try - { - jexception e1; - BOOST_CHECK_EQUAL(e1.err_code(), (u_int32_t)0); - BOOST_CHECK(e1.additional_info().size() == 0); - BOOST_CHECK(e1.throwing_class().size() == 0); - BOOST_CHECK(e1.throwing_fn().size() == 0); - BOOST_CHECK(std::strlen(e1.what()) > 0); - throw e1; - } - catch (const jexception& e) - { - BOOST_CHECK_EQUAL(e.err_code(), (u_int32_t)0); - BOOST_CHECK(e.additional_info().size() == 0); - BOOST_CHECK(e.throwing_class().size() == 0); - BOOST_CHECK(e.throwing_fn().size() == 0); - BOOST_CHECK(std::strlen(e.what()) > 0); - } - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(constructor_2) -{ - cout << test_filename << ".constructor_2: " << flush; - const u_int32_t err_code = 2; - try - { - jexception e2(err_code); - BOOST_CHECK_EQUAL(e2.err_code(), err_code); - BOOST_CHECK(e2.additional_info().size() == 0); - BOOST_CHECK(e2.throwing_class().size() == 0); - BOOST_CHECK(e2.throwing_fn().size() == 0); - BOOST_CHECK(std::strlen(e2.what()) > 0); - throw e2; - } - catch (const jexception& e) - { - BOOST_CHECK_EQUAL(e.err_code(), err_code); - BOOST_CHECK(e.additional_info().size() == 0); - BOOST_CHECK(e.throwing_class().size() == 0); - BOOST_CHECK(e.throwing_fn().size() == 0); - BOOST_CHECK(std::strlen(e.what()) > 0); - } - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(constructor_3a) -{ - cout << test_filename << ".constructor_3a: " << flush; - const char* err_msg = "exception3"; - try - { - jexception e3(err_msg); - BOOST_CHECK_EQUAL(e3.err_code(), (u_int32_t)0); - BOOST_CHECK(e3.additional_info().compare(err_msg) == 0); - BOOST_CHECK(e3.throwing_class().size() == 0); - BOOST_CHECK(e3.throwing_fn().size() == 0); - BOOST_CHECK(std::strlen(e3.what()) > 0); - throw e3; - } - catch (const jexception& e) - { - BOOST_CHECK_EQUAL(e.err_code(), (u_int32_t)0); - BOOST_CHECK(e.additional_info().compare(err_msg) == 0); - BOOST_CHECK(e.throwing_class().size() == 0); - BOOST_CHECK(e.throwing_fn().size() == 0); - BOOST_CHECK(std::strlen(e.what()) > 0); - } - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(constructor_3b) -{ - cout << test_filename << ".constructor_3b: " << flush; - const string err_msg("exception3"); - try - { - jexception e3(err_msg); - BOOST_CHECK_EQUAL(e3.err_code(), (u_int32_t)0); - BOOST_CHECK(e3.additional_info().compare(err_msg) == 0); - BOOST_CHECK(e3.throwing_class().size() == 0); - BOOST_CHECK(e3.throwing_fn().size() == 0); - BOOST_CHECK(std::strlen(e3.what()) > 0); - throw e3; - } - catch (const jexception& e) - { - BOOST_CHECK_EQUAL(e.err_code(), (u_int32_t)0); - BOOST_CHECK(e.additional_info().compare(err_msg) == 0); - BOOST_CHECK(e.throwing_class().size() == 0); - BOOST_CHECK(e.throwing_fn().size() == 0); - BOOST_CHECK(std::strlen(e.what()) > 0); - } - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(constructor_4a) -{ - cout << test_filename << ".constructor_4a: " << flush; - const u_int32_t err_code = 4; - const char* err_msg = "exception4"; - try - { - jexception e4(err_code, err_msg); - BOOST_CHECK_EQUAL(e4.err_code(), err_code); - BOOST_CHECK(e4.additional_info().compare(err_msg) == 0); - BOOST_CHECK(e4.throwing_class().size() == 0); - BOOST_CHECK(e4.throwing_fn().size() == 0); - BOOST_CHECK(std::strlen(e4.what()) > 0); - throw e4; - } - catch (const jexception& e) - { - BOOST_CHECK_EQUAL(e.err_code(), err_code); - BOOST_CHECK(e.additional_info().compare(err_msg) == 0); - BOOST_CHECK(e.throwing_class().size() == 0); - BOOST_CHECK(e.throwing_fn().size() == 0); - BOOST_CHECK(std::strlen(e.what()) > 0); - } - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(constructor_4b) -{ - cout << test_filename << ".constructor_4b: " << flush; - const u_int32_t err_code = 4; - const string err_msg("exception4"); - try - { - jexception e4(err_code, err_msg); - BOOST_CHECK_EQUAL(e4.err_code(), err_code); - BOOST_CHECK(e4.additional_info().compare(err_msg) == 0); - BOOST_CHECK(e4.throwing_class().size() == 0); - BOOST_CHECK(e4.throwing_fn().size() == 0); - BOOST_CHECK(std::strlen(e4.what()) > 0); - throw e4; - } - catch (const jexception& e) - { - BOOST_CHECK_EQUAL(e.err_code(), err_code); - BOOST_CHECK(e.additional_info().compare(err_msg) == 0); - BOOST_CHECK(e.throwing_class().size() == 0); - BOOST_CHECK(e.throwing_fn().size() == 0); - BOOST_CHECK(std::strlen(e.what()) > 0); - } - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(constructor_5a) -{ - cout << test_filename << ".constructor_5a: " << flush; - const u_int32_t err_code = 5; - const char* err_class = "class5"; - const char* err_fn = "fn5"; - try - { - jexception e5(err_code, err_class, err_fn); - BOOST_CHECK_EQUAL(e5.err_code(), err_code); - BOOST_CHECK(e5.additional_info().size() == 0); - BOOST_CHECK(e5.throwing_class().compare(err_class) == 0); - BOOST_CHECK(e5.throwing_fn().compare(err_fn) == 0); - BOOST_CHECK(std::strlen(e5.what()) > 0); - throw e5; - } - catch (const jexception& e) - { - BOOST_CHECK_EQUAL(e.err_code(), err_code); - BOOST_CHECK(e.additional_info().size() == 0); - BOOST_CHECK(e.throwing_class().compare(err_class) == 0); - BOOST_CHECK(e.throwing_fn().compare(err_fn) == 0); - BOOST_CHECK(std::strlen(e.what()) > 0); - } - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(constructor_5b) -{ - cout << test_filename << ".constructor_5b: " << flush; - const u_int32_t err_code = 5; - const string err_class("class5"); - const string err_fn("fn5"); - try - { - jexception e5(err_code, err_class, err_fn); - BOOST_CHECK_EQUAL(e5.err_code(), err_code); - BOOST_CHECK(e5.additional_info().size() == 0); - BOOST_CHECK(e5.throwing_class().compare(err_class) == 0); - BOOST_CHECK(e5.throwing_fn().compare(err_fn) == 0); - BOOST_CHECK(std::strlen(e5.what()) > 0); - throw e5; - } - catch (const jexception& e) - { - BOOST_CHECK_EQUAL(e.err_code(), err_code); - BOOST_CHECK(e.additional_info().size() == 0); - BOOST_CHECK(e.throwing_class().compare(err_class) == 0); - BOOST_CHECK(e.throwing_fn().compare(err_fn) == 0); - BOOST_CHECK(std::strlen(e.what()) > 0); - } - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(constructor_6a) -{ - cout << test_filename << ".constructor_6a: " << flush; - const u_int32_t err_code = 6; - const char* err_msg = "exception6"; - const char* err_class = "class6"; - const char* err_fn = "fn6"; - try - { - jexception e6(err_code, err_msg, err_class, err_fn); - BOOST_CHECK_EQUAL(e6.err_code(), err_code); - BOOST_CHECK(e6.additional_info().compare(err_msg) == 0); - BOOST_CHECK(e6.throwing_class().compare(err_class) == 0); - BOOST_CHECK(e6.throwing_fn().compare(err_fn) == 0); - BOOST_CHECK(std::strlen(e6.what()) > 0); - throw e6; - } - catch (const jexception& e) - { - BOOST_CHECK_EQUAL(e.err_code(), err_code); - BOOST_CHECK(e.additional_info().compare(err_msg) == 0); - BOOST_CHECK(e.throwing_class().compare(err_class) == 0); - BOOST_CHECK(e.throwing_fn().compare(err_fn) == 0); - BOOST_CHECK(std::strlen(e.what()) > 0); - } - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(constructor_6b) -{ - cout << test_filename << ".constructor_6b: " << flush; - const u_int32_t err_code = 6; - const string err_msg("exception6"); - const string err_class("class6"); - const string err_fn("fn6"); - try - { - jexception e6(err_code, err_msg, err_class, err_fn); - BOOST_CHECK_EQUAL(e6.err_code(), err_code); - BOOST_CHECK(e6.additional_info().compare(err_msg) == 0); - BOOST_CHECK(e6.throwing_class().compare(err_class) == 0); - BOOST_CHECK(e6.throwing_fn().compare(err_fn) == 0); - BOOST_CHECK(std::strlen(e6.what()) > 0); - throw e6; - } - catch (const jexception& e) - { - BOOST_CHECK_EQUAL(e.err_code(), err_code); - BOOST_CHECK(e.additional_info().compare(err_msg) == 0); - BOOST_CHECK(e.throwing_class().compare(err_class) == 0); - BOOST_CHECK(e.throwing_fn().compare(err_fn) == 0); - BOOST_CHECK(std::strlen(e.what()) > 0); - } - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(msg_scope) -{ - cout << test_filename << ".msg_scope: " << flush; - try - { - // These will go out of scope as soon as jexception is thrown... - const string msg("Error message"); - const string cls("class"); - const string fn("function"); - throw jexception(100, msg, cls, fn); - } - catch (const jexception& e) - { - stringstream ss; - ss << e; - BOOST_CHECK(ss.str().size() > 0); - } - cout << "ok" << endl; -} - -QPID_AUTO_TEST_SUITE_END() diff --git a/qpid/cpp/src/tests/legacystore/jrnl/_ut_jinf.cpp b/qpid/cpp/src/tests/legacystore/jrnl/_ut_jinf.cpp deleted file mode 100644 index f239139306..0000000000 --- a/qpid/cpp/src/tests/legacystore/jrnl/_ut_jinf.cpp +++ /dev/null @@ -1,402 +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 <cmath> -#include <iostream> -#include "qpid/legacystore/jrnl/jcntl.h" - -using namespace boost::unit_test; -using namespace mrg::journal; -using namespace std; - -QPID_AUTO_TEST_SUITE(jinf_suite) - -const string test_filename("_ut_jinf"); - -#include "_st_helper_fns.h" - -timespec ts; - -QPID_AUTO_TEST_CASE(write_constructor) -{ - string test_name = get_test_name(test_filename, "write_constructor"); - const string jid = test_name + "_jid"; - const string base_filename = test_name + "_bfn"; - jdir::create_dir(test_dir); // Check test dir exists; create it if not - ::clock_gettime(CLOCK_REALTIME, &ts); - jinf ji(jid, test_dir, base_filename, NUM_JFILES, false, 0, JFSIZE_SBLKS, JRNL_WMGR_DEF_PAGE_SIZE, JRNL_WMGR_DEF_PAGES, ts); - BOOST_CHECK_EQUAL(ji.jver(), RHM_JDAT_VERSION); - BOOST_CHECK(ji.jid().compare(jid) == 0); - BOOST_CHECK(ji.jdir().compare(test_dir) == 0); - BOOST_CHECK(ji.base_filename().compare(base_filename) == 0); - const timespec this_ts = ji.ts(); - BOOST_CHECK_EQUAL(this_ts.tv_sec, ts.tv_sec); - BOOST_CHECK_EQUAL(this_ts.tv_nsec, ts.tv_nsec); - BOOST_CHECK_EQUAL(ji.num_jfiles(), u_int16_t(NUM_JFILES)); - BOOST_CHECK_EQUAL(ji.is_ae(), false); - BOOST_CHECK_EQUAL(ji.ae_max_jfiles(), u_int16_t(0)); - BOOST_CHECK_EQUAL(ji.jfsize_sblks(), u_int32_t(JFSIZE_SBLKS)); - BOOST_CHECK_EQUAL(ji.sblk_size_dblks(), u_int16_t(JRNL_SBLK_SIZE)); - BOOST_CHECK_EQUAL(ji.dblk_size(), u_int32_t(JRNL_DBLK_SIZE)); - BOOST_CHECK_EQUAL(ji.wcache_pgsize_sblks(), u_int32_t(JRNL_WMGR_DEF_PAGE_SIZE)); - BOOST_CHECK_EQUAL(ji.wcache_num_pages(), u_int16_t(JRNL_WMGR_DEF_PAGES)); - BOOST_CHECK_EQUAL(ji.rcache_pgsize_sblks(), u_int32_t(JRNL_RMGR_PAGE_SIZE)); - BOOST_CHECK_EQUAL(ji.rcache_num_pages(), u_int16_t(JRNL_RMGR_PAGES)); - ji.write(); - cout << "done" << endl; -} - -QPID_AUTO_TEST_CASE(read_constructor) -{ - string test_name = get_test_name(test_filename, "read_constructor"); - const string jid = test_name + "_jid"; - const string base_filename = test_name + "_bfn"; - lfid_pfid_map::create_new_jinf(jid, base_filename, false); - - stringstream fn; - fn << test_dir << "/" <<base_filename << "." << JRNL_INFO_EXTENSION; - jinf ji(fn.str(), false); - BOOST_CHECK_EQUAL(ji.jver(), RHM_JDAT_VERSION); - BOOST_CHECK(ji.jid().compare(jid) == 0); - BOOST_CHECK(ji.jdir().compare(test_dir) == 0); - BOOST_CHECK(ji.base_filename().compare(base_filename) == 0); -// const timespec this_ts = ji.ts(); -// BOOST_CHECK_EQUAL(this_ts.tv_sec, ts.tv_sec); -// BOOST_CHECK_EQUAL(this_ts.tv_nsec, ts.tv_nsec); - BOOST_CHECK_EQUAL(ji.num_jfiles(), u_int16_t(NUM_JFILES)); - BOOST_CHECK_EQUAL(ji.is_ae(), false); - BOOST_CHECK_EQUAL(ji.ae_max_jfiles(), u_int16_t(0)); - BOOST_CHECK_EQUAL(ji.jfsize_sblks(), u_int32_t(JFSIZE_SBLKS)); - BOOST_CHECK_EQUAL(ji.sblk_size_dblks(), u_int16_t(JRNL_SBLK_SIZE)); - BOOST_CHECK_EQUAL(ji.dblk_size(), u_int32_t(JRNL_DBLK_SIZE)); - BOOST_CHECK_EQUAL(ji.wcache_pgsize_sblks(), u_int32_t(JRNL_WMGR_DEF_PAGE_SIZE)); - BOOST_CHECK_EQUAL(ji.wcache_num_pages(), u_int16_t(JRNL_WMGR_DEF_PAGES)); - BOOST_CHECK_EQUAL(ji.rcache_pgsize_sblks(), u_int32_t(JRNL_RMGR_PAGE_SIZE)); - BOOST_CHECK_EQUAL(ji.rcache_num_pages(), u_int16_t(JRNL_RMGR_PAGES)); - - cout << "done" << endl; -} - -QPID_AUTO_TEST_CASE(set_functions) -{ - string test_name = get_test_name(test_filename, "set_functions"); - const string jid = test_name + "_jid"; - const string base_filename = test_name + "_bfn"; - lfid_pfid_map::create_new_jinf(jid, base_filename, false); - - stringstream fn; - fn << test_dir << "/" << base_filename << "." << JRNL_INFO_EXTENSION; - jinf ji(fn.str(), false); - - ji.set_jdir("abc123"); - BOOST_CHECK(ji.jdir().compare("abc123") == 0); - ji.set_jdir(test_dir); - BOOST_CHECK(ji.jdir().compare(test_dir) == 0); - ji.incr_num_jfiles(); - BOOST_CHECK_EQUAL(ji.num_jfiles(), u_int16_t(NUM_JFILES+1)); - ji.incr_num_jfiles(); - BOOST_CHECK_EQUAL(ji.num_jfiles(), u_int16_t(NUM_JFILES+2)); - - lfid_pfid_map::clean_journal_info_file(test_dir); - cout << "done" << endl; -} - -QPID_AUTO_TEST_CASE(validate) -{ - string test_name = get_test_name(test_filename, "validate"); - const string jid = test_name + "_jid"; - const string base_filename = test_name + "_bfn"; - lfid_pfid_map::create_new_jinf(jid, base_filename, false); - - stringstream fn; - fn << test_dir << "/" << base_filename << "." << JRNL_INFO_EXTENSION; - jinf ji(fn.str(), true); - // TODO: Check validation picks up conflict, but need to be friend to jinf to do it - - lfid_pfid_map::clean_journal_info_file(test_dir); - cout << "done" << endl; -} - -QPID_AUTO_TEST_CASE(analyze_empty_journal) -{ - string test_name = get_test_name(test_filename, "analyze_empty_journal"); - const string jid = test_name + "_jid"; - const string base_filename = test_name + "_bfn"; - jdir::create_dir(test_dir); // Check test dir exists; create it if not - - lfid_pfid_map m(jid, base_filename); - m.journal_create(NUM_JFILES, 0, 0); - m.write_journal(false, 0); - - stringstream fn; - fn << test_dir << "/" << base_filename << "." << JRNL_INFO_EXTENSION; - jinf ji(fn.str(), false); - try { ji.analyze(); } - catch (const jexception& e) - { - if (e.err_code() != jerrno::JERR_JINF_JDATEMPTY) - BOOST_ERROR("Failed to throw expected exception jerrno::JERR_JINF_JDATEMPTY"); - } - - m.destroy_journal(); - cout << "done" << endl; -} - -QPID_AUTO_TEST_CASE(analyze_part_full_journal) -{ - string test_name = get_test_name(test_filename, "analyze_part_full_journal"); - const string jid = test_name + "_jid"; - const string base_filename = test_name + "_bfn"; - lfid_pfid_map m(jid, base_filename); - for (u_int16_t num_files = 1; num_files < NUM_JFILES; num_files++) - { - m.journal_create(NUM_JFILES, num_files, 0); - m.write_journal(false, 0); - - stringstream fn; - fn << test_dir << "/" << base_filename << "." << JRNL_INFO_EXTENSION; - jinf ji(fn.str(), false); - ji.analyze(); - m.check_analysis(ji); - - m.destroy_journal(); - } - cout << "done" << endl; -} - -QPID_AUTO_TEST_CASE(analyze_full_journal) -{ - string test_name = get_test_name(test_filename, "analyze_full_journal"); - const string jid = test_name + "_jid"; - const string base_filename = test_name + "_bfn"; - lfid_pfid_map m(jid, base_filename); - for (u_int16_t file_num = 0; file_num < NUM_JFILES; file_num++) - { - m.journal_create(NUM_JFILES, NUM_JFILES, file_num); - m.write_journal(false, 0); - - stringstream fn; - fn << test_dir << "/" << base_filename << "." << JRNL_INFO_EXTENSION; - jinf ji(fn.str(), false); - ji.analyze(); - m.check_analysis(ji); - - m.destroy_journal(); - } - cout << "done" << endl; -} - -QPID_AUTO_TEST_CASE(analyze_single_appended_journal) -{ - string test_name = get_test_name(test_filename, "analyze_single_appended_journal"); - const string jid = test_name + "_jid"; - const string base_filename = test_name + "_bfn"; - lfid_pfid_map m(jid, base_filename); - for (u_int16_t oldest_lid = 0; oldest_lid < NUM_JFILES; oldest_lid++) - for (u_int16_t after_lid = 0; after_lid < NUM_JFILES; after_lid++) - for (u_int16_t num_files = 1; num_files <= 5; num_files++) - { - m.journal_create(NUM_JFILES, NUM_JFILES, oldest_lid); - m.journal_insert(after_lid, num_files); - m.write_journal(true, 16); - - stringstream fn; - fn << test_dir << "/" << base_filename << "." << JRNL_INFO_EXTENSION; - jinf ji(fn.str(), false); - ji.analyze(); - m.check_analysis(ji); - - m.destroy_journal(); - } - cout << "done" << endl; -} - -QPID_AUTO_TEST_CASE(analyze_multi_appended_journal) -{ - string test_name = get_test_name(test_filename, "analyze_multi_appended_journal"); - const string jid = test_name + "_jid"; - const string base_filename = test_name + "_bfn"; - lfid_pfid_map m(jid, base_filename); - ::srand48(1); - - for (u_int16_t num_appends = 1; num_appends <= 2*NUM_JFILES; num_appends++) - { - const u_int16_t oldest_lid = u_int16_t(NUM_JFILES * ::drand48()); - m.journal_create(NUM_JFILES, NUM_JFILES, oldest_lid); - for (u_int16_t a = 0; a < num_appends; a++) - { - const u_int16_t num_files = u_int16_t(1 + (NUM_JFILES * ::drand48())); - const u_int16_t after_lid = u_int16_t(m.size() * ::drand48()); - m.journal_insert(after_lid, num_files); - } - m.write_journal(true, 24); - - stringstream fn; - fn << test_dir << "/" << base_filename << "." << JRNL_INFO_EXTENSION; - jinf ji(fn.str(), false); - ji.analyze(); - m.check_analysis(ji); - - m.destroy_journal(); - } - - cout << "done" << endl; -} - -QPID_AUTO_TEST_CASE(analyze_multi_appended_then_failed_journal) -{ - string test_name = get_test_name(test_filename, "analyze_multi_appended_then_failed_journal"); - const string jid = test_name + "_jid"; - const string base_filename = test_name + "_bfn"; - lfid_pfid_map m(jid, base_filename); - ::srand48(1); - - // As this test relies on repeatable but random sequences, use many iterations for coverage - for (int c = 1; c <= 100; c++) - { - for (u_int16_t num_appends = 1; num_appends <= 2*NUM_JFILES; num_appends++) - { - u_int16_t oldest_lid = u_int16_t(NUM_JFILES * ::drand48()); - m.journal_create(NUM_JFILES, NUM_JFILES, oldest_lid); - for (u_int16_t a = 0; a < num_appends-1; a++) - { - const u_int16_t num_files = u_int16_t(1 + (NUM_JFILES * ::drand48())); - const u_int16_t after_lid = u_int16_t(m.size() * ::drand48()); - m.journal_insert(after_lid, num_files); - if (after_lid < oldest_lid) - oldest_lid += num_files; - } - const u_int16_t num_files = u_int16_t(1 + (NUM_JFILES * ::drand48())); - const u_int16_t after_lid = oldest_lid == 0 ? m.size() - 1 : oldest_lid - 1; - m.journal_insert(after_lid, num_files, false); - m.write_journal(true, 32); - - stringstream fn; - fn << test_dir << "/" << base_filename << "." << JRNL_INFO_EXTENSION; - jinf ji(fn.str(), false); - ji.analyze(); - m.check_analysis(ji); - - m.destroy_journal(); - } - } - - cout << "done" << endl; -} - -QPID_AUTO_TEST_CASE(analyze_inconsistent_jdat_file_size_in_journal) -{ - string test_name = get_test_name(test_filename, "analyze_inconsistent_jdat_file_size_in_journal"); - const string jid = test_name + "_jid"; - const string base_filename = test_name + "_bfn"; - lfid_pfid_map m(jid, base_filename); - ::srand48(1); - - for (u_int16_t pfid = 1; pfid < NUM_JFILES; pfid++) - { - m.journal_create(NUM_JFILES, NUM_JFILES, 0); - m.write_journal(false, 0); - - const std::string filename = m.create_journal_filename(pfid, base_filename); - std::ofstream of(filename.c_str(), ofstream::out | ofstream::app); - if (!of.good()) - BOOST_FAIL("Unable to open test journal file \"" << filename << "\" for writing."); - std::size_t expand_size = std::size_t(10 * JRNL_DBLK_SIZE * JRNL_SBLK_SIZE * ::drand48()); - std::vector<char> sblk_buffer(expand_size, 0); - of.write(&sblk_buffer[0], expand_size); - of.close(); - - stringstream fn; - fn << test_dir << "/" << base_filename << "." << JRNL_INFO_EXTENSION; - jinf ji(fn.str(), false); - try - { - ji.analyze(); - BOOST_FAIL("Failed to detect irregular journal file size in file \"" << filename << "\""); - } - catch (const jexception& e) {} // ignore - expected - - m.destroy_journal(); - } - cout << "done" << endl; -} - -QPID_AUTO_TEST_CASE(analyze_owi_in_non_ae_journal) -{ - string test_name = get_test_name(test_filename, "analyze_owi_in_non_ae_journal"); - const string jid = test_name + "_jid"; - const string base_filename = test_name + "_bfn"; - lfid_pfid_map m(jid, base_filename); - for (u_int16_t oldest_file = 1; oldest_file < NUM_DEFAULT_JFILES-1; oldest_file++) - { - for (u_int16_t bad_owi_file = oldest_file + 1; bad_owi_file < NUM_DEFAULT_JFILES; bad_owi_file++) - { - m.journal_create(NUM_DEFAULT_JFILES, NUM_DEFAULT_JFILES, oldest_file, bad_owi_file); - m.write_journal(false, 0); - - stringstream fn; - fn << test_dir << "/" << base_filename << "." << JRNL_INFO_EXTENSION; - jinf ji(fn.str(), false); - try - { - ji.analyze(); - BOOST_FAIL("Failed to detect irregular OWI flag in non-ae journal file \"" << fn.str() << "\""); - } - catch (const jexception& e) {} // ignore - expected - - m.destroy_journal(); - } - } - cout << "done" << endl; -} - -QPID_AUTO_TEST_CASE(analyze_owi_in_ae_min_size_journal) -{ - string test_name = get_test_name(test_filename, "analyze_owi_in_ae_min_size_journal"); - const string jid = test_name + "_jid"; - const string base_filename = test_name + "_bfn"; - lfid_pfid_map m(jid, base_filename); - for (u_int16_t oldest_file = 1; oldest_file < NUM_JFILES-1; oldest_file++) - { - for (u_int16_t bad_owi_file = oldest_file + 1; bad_owi_file < NUM_JFILES; bad_owi_file++) - { - m.journal_create(NUM_JFILES, NUM_JFILES, oldest_file, bad_owi_file); - m.write_journal(true, 16); - - stringstream fn; - fn << test_dir << "/" << base_filename << "." << JRNL_INFO_EXTENSION; - jinf ji(fn.str(), false); - try - { - ji.analyze(); - BOOST_FAIL("Failed to detect irregular OWI flag in min-sized ae journal file \"" << fn.str() << "\""); - } - catch (const jexception& e) {} // ignore - expected - - m.destroy_journal(); - } - } - cout << "done" << endl; -} - -QPID_AUTO_TEST_SUITE_END() diff --git a/qpid/cpp/src/tests/legacystore/jrnl/_ut_lpmgr.cpp b/qpid/cpp/src/tests/legacystore/jrnl/_ut_lpmgr.cpp deleted file mode 100644 index 2dc20ffa7c..0000000000 --- a/qpid/cpp/src/tests/legacystore/jrnl/_ut_lpmgr.cpp +++ /dev/null @@ -1,886 +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 <cmath> -#include <iostream> -#include "qpid/legacystore/jrnl/jcntl.h" -#include "qpid/legacystore/jrnl/lpmgr.h" - -using namespace boost::unit_test; -using namespace mrg::journal; -using namespace std; - -QPID_AUTO_TEST_SUITE(arr_cnt_suite) - -const string test_filename("_ut_lpmgr"); - -#include "_st_helper_fns.h" - -// === Helper functions and definitions === - -typedef vector<u_int16_t> flist; -typedef flist::const_iterator flist_citr; - -class lpmgr_test_helper -{ - lpmgr_test_helper() {} - virtual ~lpmgr_test_helper() {} - -public: - static void check_pfids_lfids(const lpmgr& lm, const u_int16_t pfids[], const u_int16_t lfids[], - const size_t pfid_lfid_size) - { - vector<u_int16_t> res; - lm.get_pfid_list(res); - vectors_equal(lm, pfids, pfid_lfid_size, res, true); - lm.get_lfid_list(res); - vectors_equal(lm, lfids, pfid_lfid_size, res, false); - } - - static void check_pfids_lfids(const lpmgr& lm, const flist& pfids, const flist lfids) - { - vector<u_int16_t> res; - lm.get_pfid_list(res); - vectors_equal(lm, pfids, res, true); - lm.get_lfid_list(res); - vectors_equal(lm, lfids, res, false); - } - - static void check_linear_pfids_lfids(const lpmgr& lm, const size_t pfid_lfid_size) - { - vector<u_int16_t> res; - lm.get_pfid_list(res); - linear_vectors_equal(lm, pfid_lfid_size, res, true); - lm.get_lfid_list(res); - linear_vectors_equal(lm, pfid_lfid_size, res, false); - } - - static void rcvdat_init(rcvdat& rd, const u_int16_t num_jfiles, const bool ae, const u_int16_t ae_max_jfiles, - const u_int16_t pfids[]) - { - rd.reset(num_jfiles, ae, ae_max_jfiles); - load_vector(pfids, num_jfiles, rd._fid_list); - rd._jempty = false; - rd._lfid = pfids[num_jfiles - 1]; - rd._eo = 100 * JRNL_DBLK_SIZE * JRNL_SBLK_SIZE; - } - - static void rcvdat_init(rcvdat& rd, const flist& pfidl, const bool ae, const u_int16_t ae_max_jfiles) - { - const u_int16_t num_jfiles = pfidl.size(); - rd.reset(num_jfiles, ae, ae_max_jfiles); - load_vector(pfidl, rd._fid_list); - rd._jempty = false; - rd._lfid = pfidl[num_jfiles - 1]; - rd._eo = 100 * JRNL_DBLK_SIZE * JRNL_SBLK_SIZE; - } - - static void initialize(lpmgr& lm, test_jrnl& jc, const u_int16_t num_jfiles, const bool ae, - const u_int16_t ae_max_jfiles) - { - lm.initialize(num_jfiles, ae, ae_max_jfiles, &jc, &jc.new_fcntl); - BOOST_CHECK_EQUAL(lm.is_init(), true); - BOOST_CHECK_EQUAL(lm.is_ae(), ae); - BOOST_CHECK_EQUAL(lm.ae_max_jfiles(), ae_max_jfiles); - BOOST_CHECK_EQUAL(lm.num_jfiles(), num_jfiles); - if (num_jfiles) - check_linear_pfids_lfids(lm, num_jfiles); - else - BOOST_CHECK_EQUAL(lm.get_fcntlp(0), (void*)0); - } - - // version which sets up the lfid_pfid_map for later manipulation by insert tests - static void initialize(lfid_pfid_map& lfm, lpmgr& lm, test_jrnl& jc, const u_int16_t num_jfiles, const bool ae, - const u_int16_t ae_max_jfiles) - { - lfm.journal_create(num_jfiles, num_jfiles); - initialize(lm, jc, num_jfiles, ae, ae_max_jfiles); - } - - static void prepare_recover(lfid_pfid_map& lfm, const u_int16_t size) - { - if (size < 4) BOOST_FAIL("prepare_recover(): size parameter (" << size << ") too small."); - lfm.journal_create(4, 4); // initial journal of size 4 - u_int16_t s = 4; // cumulative size - while (s < size) - { - const u_int16_t ins_posn = u_int16_t(s * ::drand48()); // this insert posn - if (3.0 * ::drand48() > 1.0 || size - s < 2) // 2:1 chance of single insert when >= 2 still to insert - { - lfm.journal_insert(ins_posn); // single insert - s++; - } - else - { - // multiple insert, either 2 - 5 - const u_int16_t max_ins_size = size - s >5 ? 5 : size - s; - const u_int16_t ins_size = 2 + u_int16_t((max_ins_size - 2) * ::drand48()); // this insert size - lfm.journal_insert(ins_posn, ins_size); - s += ins_size; - } - } - } - - static void recover(lfid_pfid_map& lfm, lpmgr& lm, test_jrnl& jc, const bool ae, const u_int16_t ae_max_jfiles) - { - flist pfidl; - flist lfidl; - rcvdat rd; - const u_int16_t num_jfiles = lfm.size(); - - lfm.get_pfid_list(pfidl); - lfm.get_lfid_list(lfidl); - lm.finalize(); // clear all file handles before erasing old journal files - lfm.write_journal(ae, ae_max_jfiles, JFSIZE_SBLKS); - - lpmgr_test_helper::rcvdat_init(rd, pfidl, ae, ae_max_jfiles); - lm.recover(rd, &jc, &jc.new_fcntl); - BOOST_CHECK_EQUAL(lm.is_init(), true); - BOOST_CHECK_EQUAL(lm.is_ae(), ae); - BOOST_CHECK_EQUAL(lm.ae_max_jfiles(), ae_max_jfiles); - BOOST_CHECK_EQUAL(lm.num_jfiles(), num_jfiles); - if (num_jfiles) - check_pfids_lfids(lm, pfidl, lfidl); - else - BOOST_CHECK_EQUAL(lm.get_fcntlp(0), (void*)0); - } - - static void finalize(lpmgr& lm) - { - lm.finalize(); - BOOST_CHECK_EQUAL(lm.is_init(), false); - BOOST_CHECK_EQUAL(lm.is_ae(), false); - BOOST_CHECK_EQUAL(lm.ae_max_jfiles(), u_int16_t(0)); - BOOST_CHECK_EQUAL(lm.num_jfiles(), u_int16_t(0)); - BOOST_CHECK_EQUAL(lm.get_fcntlp(0), (void*)0); - vector<u_int16_t> res; - lm.get_pfid_list(res); - BOOST_CHECK_EQUAL(res.size(), u_int16_t(0)); - lm.get_lfid_list(res); - BOOST_CHECK_EQUAL(res.size(), u_int16_t(0)); - } - - static void insert(lfid_pfid_map& lfm, lpmgr& lm, test_jrnl& jc, const u_int16_t after_lfid, const u_int16_t incr = 1) - { - flist pfidl; - flist lfidl; - const u_int16_t num_jfiles = lm.num_jfiles(); - lfm.journal_insert(after_lfid, incr); - lfm.get_pfid_list(pfidl); - lfm.get_lfid_list(lfidl); - lm.insert(after_lfid, &jc, &jc.new_fcntl, incr); - BOOST_CHECK_EQUAL(lm.num_jfiles(), num_jfiles + incr); - lpmgr_test_helper::check_pfids_lfids(lm, pfidl, lfidl); - } - - static void check_ae_max_jfiles(lpmgr& lm, const u_int16_t num_jfiles, const u_int16_t ae_max_jfiles) - { - bool legal = ae_max_jfiles > num_jfiles || ae_max_jfiles == 0; - - lm.set_ae(false); - BOOST_CHECK(!lm.is_ae()); - if (legal) - { - lm.set_ae_max_jfiles(ae_max_jfiles); - BOOST_CHECK_EQUAL(lm.ae_max_jfiles(), ae_max_jfiles); - lm.set_ae(true); - BOOST_CHECK(lm.is_ae()); - BOOST_CHECK_EQUAL(lm.ae_jfiles_rem(), ae_max_jfiles - ? ae_max_jfiles - num_jfiles - : JRNL_MAX_NUM_FILES - num_jfiles); - } - else - { - lm.set_ae_max_jfiles(ae_max_jfiles); - BOOST_CHECK_EQUAL(lm.ae_max_jfiles(), ae_max_jfiles); - try - { - lm.set_ae(true); // should raise exception - BOOST_ERROR("Auto-expand enabled with out-of-range ae_max_jfiles"); - } - catch (const jexception& e) { BOOST_CHECK_EQUAL(e.err_code(), jerrno::JERR_LFMGR_BADAEFNUMLIM); } - BOOST_CHECK(!lm.is_ae()); - BOOST_CHECK_EQUAL(lm.ae_jfiles_rem(), 0); - } - BOOST_CHECK_EQUAL(lm.ae_max_jfiles(), ae_max_jfiles); - } - - static void check_multiple_initialization_recover(lfid_pfid_map& lfm, test_jrnl& jc, - const u_int16_t num_jfiles_arr[][2], const bool init_flag_0, const bool finalize_flag, - const bool init_flag_1) - { - unsigned i_njf = 0; - while (num_jfiles_arr[i_njf][0] && num_jfiles_arr[i_njf][1]) // cycle through each entry in num_jfiles_arr - { - for (unsigned i1_njf = 0; i1_njf <= 1; i1_njf++) // cycle through the two numbers in each entry of num_jfiles_arr - { - const u_int16_t num_jfiles_0 = num_jfiles_arr[i_njf][i1_njf == 0]; // first number in pair - const u_int16_t num_jfiles_1 = num_jfiles_arr[i_njf][i1_njf != 0]; // second number in pair - - for (unsigned i_ae = 0; i_ae < 4; i_ae++) // cycle through combinations of enabling AE - { - const bool ae_0 = i_ae & 0x1; // first bit: enable AE on first init - const bool ae_1 = i_ae & 0x2; // second bit: enable AE on second init - for (unsigned i_aemjf = 0; i_aemjf < 4; i_aemjf++) // cycle through combinations of enabling/disabling ae limit - { - const u_int16_t ae_max_jfiles_0 = i_aemjf & 0x1 ? 3 * num_jfiles_0 : 0; // max ae files, 0 = disable max - const u_int16_t ae_max_jfiles_1 = i_aemjf & 0x2 ? 4 * num_jfiles_1 : 0; // max ae files, 0 = disable max - - lpmgr lm; // DUT - - if (init_flag_0) - initialize(lm, jc, num_jfiles_0, ae_0, ae_max_jfiles_0); - else - { - prepare_recover(lfm, num_jfiles_0); - recover(lfm, lm, jc, ae_1, ae_max_jfiles_0); - lfm.destroy_journal(); - } - - if (finalize_flag) finalize(lm); - - if (init_flag_1) - initialize(lm, jc, num_jfiles_1, ae_1, ae_max_jfiles_1); - else - { - prepare_recover(lfm, num_jfiles_1); - recover(lfm, lm, jc, ae_1, ae_max_jfiles_1); - lfm.destroy_journal(); - } - } - } - } - i_njf++; - } - } - - static void check_insert(lfid_pfid_map& lfm, lpmgr& lm, test_jrnl& jc, const u_int16_t after_lfid, - const u_int16_t incr = 1) - { - const u_int16_t num_jfiles = lm.num_jfiles(); - const u_int16_t ae_max_jfiles = lm.ae_max_jfiles(); - const u_int16_t effective_ae_max_jfiles = ae_max_jfiles ? ae_max_jfiles : JRNL_MAX_NUM_FILES; - BOOST_CHECK_EQUAL(lm.ae_jfiles_rem(), effective_ae_max_jfiles - num_jfiles); - bool legal = lm.is_ae() && num_jfiles + incr <= effective_ae_max_jfiles; - if (legal) - { - insert(lfm, lm, jc, after_lfid, incr); - BOOST_CHECK_EQUAL(lm.num_jfiles(), num_jfiles + incr); - BOOST_CHECK_EQUAL(lm.ae_jfiles_rem(), effective_ae_max_jfiles - num_jfiles - incr); - } - else - { - try - { - insert(lfm, lm, jc, after_lfid, incr); - if (lm.is_ae()) - BOOST_ERROR("lpmgr::insert() succeeded and exceeded limit"); - else - BOOST_ERROR("lpmgr::insert() succeeded with auto-expand disabled"); - } - catch (const jexception& e) - { - if (lm.is_ae()) - BOOST_CHECK_EQUAL(e.err_code(), jerrno::JERR_LFMGR_AEFNUMLIMIT); - else - BOOST_CHECK_EQUAL(e.err_code(), jerrno::JERR_LFMGR_AEDISABLED); - } - BOOST_CHECK_EQUAL(lm.num_jfiles(), num_jfiles); - BOOST_CHECK_EQUAL(lm.ae_jfiles_rem(), effective_ae_max_jfiles - num_jfiles); - } - } - - static void check_limit(lfid_pfid_map& lfm, test_jrnl& jc, const bool ae, const u_int16_t num_jfiles, - const u_int16_t ae_max_jfiles) - { - lpmgr lm; - - for (unsigned i = 0; i < 2; i++) - { - if (i) - initialize(lfm, lm, jc, num_jfiles, ae, ae_max_jfiles); - else - { - prepare_recover(lfm, num_jfiles); - recover(lfm, lm, jc, ae, ae_max_jfiles); - } - - // use up all available files - unsigned j = ae_max_jfiles ? ae_max_jfiles : JRNL_MAX_NUM_FILES; - while (ae && j > num_jfiles) - { - const u_int16_t posn = static_cast<u_int16_t>((lm.num_jfiles() - 1) * ::drand48()); - const u_int16_t incr = 1 + static_cast<u_int16_t>((lm.ae_jfiles_rem() > 4 - ? 3 : lm.ae_jfiles_rem() - 1) * ::drand48()); - check_insert(lfm, lm, jc, posn, incr); - j -= incr; - } - // these should be over the limit or illegal - check_insert(lfm, lm, jc, 0); - check_insert(lfm, lm, jc, 2, 2); - lfm.destroy_journal(); - } - } - -private: - static void load_vector(const u_int16_t a[], const size_t n, flist& v) - { - for (size_t i = 0; i < n; i++) - v.push_back(a[i]); - } - - static void load_vector(const flist& a, flist& b) - { - for (flist_citr i = a.begin(); i < a.end(); i++) - b.push_back(*i); - } - - static void vectors_equal(const lpmgr& lm, const u_int16_t a[], const size_t n, const flist& b, - const bool pfid_check) - { - BOOST_CHECK_EQUAL(n, b.size()); - for (size_t i = 0; i < n; i++) - { - BOOST_CHECK_EQUAL(a[i], b[i]); - fcntl* fp = lm.get_fcntlp(i); - BOOST_CHECK_MESSAGE(fp != (void*)0, "Unexpected void pointer returned by lpmgr::get_fcntlp()"); - if (fp) BOOST_CHECK_EQUAL(pfid_check ? fp->pfid() : fp->lfid(), pfid_check ? a[i] : i); - } - } - - static void vectors_equal(const lpmgr& lm, const flist& a, const flist& b, const bool pfid_check) - { - BOOST_CHECK_EQUAL(a.size(), b.size()); - for (size_t i = 0; i < a.size(); i++) - { - BOOST_CHECK_EQUAL(a[i], b[i]); - fcntl* fp = lm.get_fcntlp(i); - BOOST_CHECK_MESSAGE(fp != (void*)0, "Unexpected void pointer returned by lpmgr::get_fcntlp()"); - if (fp) BOOST_CHECK_EQUAL(pfid_check ? fp->pfid() : fp->lfid(), pfid_check ? a[i] : i); - } - } - - static void linear_vectors_equal(const lpmgr& lm, const size_t n, const flist& f, const bool pfid_check) - { - BOOST_CHECK_EQUAL(n, f.size()); - for (size_t i = 0; i < n; i++) - { - BOOST_CHECK_EQUAL(i, f[i]); - fcntl* fp = lm.get_fcntlp(i); - BOOST_CHECK_MESSAGE(fp != (void*)0, "Unexpected void pointer returned by lpmgr::get_fcntlp()"); - if (fp) BOOST_CHECK_EQUAL(pfid_check ? fp->pfid() : fp->lfid(), i); - } - } -}; - -// === Tests === - -#ifndef LONG_TEST -/* - * ============================================== - * NORMAL TESTS - * This section contains normal "make check" tests - * for building/packaging. These are built when - * LONG_TEST is _not_ defined. - * ============================================== - */ - -/* - * Check that after construction, the fcntl array _fcntl_arr is empty and the is_init() function returns false. - */ -QPID_AUTO_TEST_CASE(default_constructor) -{ - string test_name = get_test_name(test_filename, "default_constructor"); - try - { - lpmgr lm; - BOOST_CHECK_EQUAL(lm.is_init(), false); - BOOST_CHECK_EQUAL(lm.is_ae(), false); - BOOST_CHECK_EQUAL(lm.ae_max_jfiles(), u_int16_t(0)); - BOOST_CHECK_EQUAL(lm.num_jfiles(), u_int16_t(0)); - BOOST_CHECK_EQUAL(lm.get_fcntlp(0), (void*)0); - } - catch(const exception& e) { BOOST_FAIL(e.what()); } - cout << "done" << endl; -} - -/* - * Check that initialize() correctly creates an ordered fcntl array _fcntl_arr. - */ -QPID_AUTO_TEST_CASE(initialize) -{ - string test_name = get_test_name(test_filename, "initialize"); - const u_int16_t num_jfiles = 8; - try - { - jdir::create_dir(test_dir); // Check test dir exists; create it if not - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - { - lpmgr lm; - lpmgr_test_helper::initialize(lm, jc, num_jfiles, false, 0); - } - { - lpmgr lm; - lpmgr_test_helper::initialize(lm, jc, num_jfiles, true, 0); - } - { - lpmgr lm; - lpmgr_test_helper::initialize(lm, jc, num_jfiles, true, 5 * num_jfiles); - } - } - catch(const exception& e) { BOOST_FAIL(e.what()); } - cout << "done" << endl; -} - -/* - * Check that recover() correctly sets up the specified pfid list order. - */ -QPID_AUTO_TEST_CASE(recover) -{ - string test_name = get_test_name(test_filename, "recover"); - ::srand48(1); // init random gen for repeatable tests when using lpmgr_test_helper::prepare_recover() - try - { - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - lfid_pfid_map lfm(test_name, test_name); - - { - lpmgr lm; - lpmgr_test_helper::prepare_recover(lfm, 8); - lpmgr_test_helper::recover(lfm, lm, jc, false, 0); - lfm.destroy_journal(); - } - { - lpmgr lm; - lpmgr_test_helper::prepare_recover(lfm, 8); - lpmgr_test_helper::recover(lfm, lm, jc, true, 0); - lfm.destroy_journal(); - } - { - lpmgr lm; - lpmgr_test_helper::prepare_recover(lfm, 8); - lpmgr_test_helper::recover(lfm, lm, jc, true, 5 * lfm.size()); - lfm.destroy_journal(); - } - } - catch(const exception& e) { BOOST_FAIL(e.what()); } - cout << "done" << endl; -} - -/* - * Check that finalize() after an initialize() empties _fcntl_arr and that afterwards is_init() returns false. - */ -QPID_AUTO_TEST_CASE(initialize_finalize) -{ - string test_name = get_test_name(test_filename, "initialize_finalize"); - const u_int16_t num_jfiles = 8; - try - { - jdir::create_dir(test_dir); // Check test dir exists; create it if not - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - { - lpmgr lm; - lpmgr_test_helper::initialize(lm, jc, num_jfiles, false, 0); - lpmgr_test_helper::finalize(lm); - } - { - lpmgr lm; - lpmgr_test_helper::initialize(lm, jc, num_jfiles, true, 0); - lpmgr_test_helper::finalize(lm); - } - { - lpmgr lm; - lpmgr_test_helper::initialize(lm, jc, num_jfiles, true, 5 * num_jfiles); - lpmgr_test_helper::finalize(lm); - } - } - catch(const exception& e) { BOOST_FAIL(e.what()); } - cout << "done" << endl; -} - -/* - * Check that finalize() after a recover() empties _fcntl_arr and that afterwards is_init() returns false. - */ -QPID_AUTO_TEST_CASE(recover_finalize) -{ - string test_name = get_test_name(test_filename, "recover_finalize"); - const u_int16_t num_jfiles = 8; - ::srand48(1); // init random gen for repeatable tests when using lpmgr_test_helper::prepare_recover() - try - { - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - lfid_pfid_map lfm(test_name, test_name); - - { - lpmgr lm; - lpmgr_test_helper::prepare_recover(lfm, num_jfiles); - lpmgr_test_helper::recover(lfm, lm, jc, false, 0); - lpmgr_test_helper::finalize(lm); - lfm.destroy_journal(); - } - { - lpmgr lm; - lpmgr_test_helper::prepare_recover(lfm, num_jfiles); - lpmgr_test_helper::recover(lfm, lm, jc, true, 0); - lpmgr_test_helper::finalize(lm); - lfm.destroy_journal(); - } - { - lpmgr lm; - lpmgr_test_helper::prepare_recover(lfm, num_jfiles); - lpmgr_test_helper::recover(lfm, lm, jc, true, 5 * lfm.size()); - lpmgr_test_helper::finalize(lm); - lfm.destroy_journal(); - } - } - catch(const exception& e) { BOOST_FAIL(e.what()); } - cout << "done" << endl; -} - -/* - * Check that 0 and/or null and other extreme/boundary parameters behave as expected. - */ -QPID_AUTO_TEST_CASE(zero_null_params) -{ - string test_name = get_test_name(test_filename, "zero_null_params"); - const u_int16_t num_jfiles = 8; - try - { - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - lfid_pfid_map lfm(test_name, test_name); - lpmgr lm; - lpmgr_test_helper::initialize(lfm, lm, jc, num_jfiles, true, 0); - - // Check that inserting 0 files works ok - lpmgr_test_helper::insert(lfm, lm, jc, 0, 0); - lpmgr_test_helper::insert(lfm, lm, jc, 2, 0); - lpmgr_test_helper::insert(lfm, lm, jc, num_jfiles - 1, 0); - } - catch(const exception& e) { BOOST_FAIL(e.what()); } - cout << "done" << endl; -} - -/* - * Check that initialize()/recover() works correctly after a previous initialize()/recover() with/without an intervening - * finalize(). - */ -QPID_AUTO_TEST_CASE(multiple_initialization_recover) -{ - string test_name = get_test_name(test_filename, "multiple_initialization_recover"); - ::srand48(1); // init random gen for repeatable tests when using lpmgr_test_helper::prepare_recover() - - // Set combinations of value pairs to be used for number of journal files in first and second init - u_int16_t num_jfiles_arr[][2] = {{8, 12}, {4, 7}, {0, 0}}; // end with zeros - try - { - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - lfid_pfid_map lfm(test_name, test_name); - for (unsigned p = 0; p < 8; p++) - { - const bool i_0 = p & 0x01; // first bit - const bool i_1 = p & 0x02; // second bit - const bool f = p & 0x04; // third bit - lpmgr_test_helper::check_multiple_initialization_recover(lfm, jc, num_jfiles_arr, i_0, f, i_1); - } - } - catch(const exception& e) { BOOST_FAIL(e.what()); } - cout << "done" << endl; -} - -/* - * Check that insert() works correctly after initialize() and shifts the pfid sequence beyond the insert point correctly: - * - * The following sequence is tested: - * initialize 4 pfids=[0,1,2,3] lfids=[0,1,2,3] - * insert 1 after lfid 0 pfids=[0,4,1,2,3] lfids=[0,2,3,4,1] - * insert 2 after lfid 2 pfids=[0,4,1,5,6,2,3] lfids=[0,2,5,6,1,3,4] - * insert 1 after lfid 6 pfids=[0,4,1,5,6,2,3,7] lfids=[0,2,5,6,1,3,4,7] - * issert 1 after lfid 3 pfids=[0,4,1,5,8,6,2,3,7] lfids=[0,2,6,7,1,3,5,8,4] - */ -QPID_AUTO_TEST_CASE(initialize_insert) -{ - string test_name = get_test_name(test_filename, "initialize_insert"); - const u_int16_t initial_num_jfiles = 8; - try - { - jdir::create_dir(test_dir); // Check test dir exists; create it if not - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - lfid_pfid_map lfm(test_name, test_name); - lpmgr lm; - lpmgr_test_helper::initialize(lfm, lm, jc, initial_num_jfiles, true, 0); - - lpmgr_test_helper::insert(lfm, lm, jc, 0); - lpmgr_test_helper::insert(lfm, lm, jc, 2, 2); - lpmgr_test_helper::insert(lfm, lm, jc, 6); - lpmgr_test_helper::insert(lfm, lm, jc, 3); - } - catch(const exception& e) { BOOST_FAIL(e.what()); } - cout << "done" << endl; -} - -/* - * Check that insert() works correctly after recover() and shifts the pfid sequence beyond the insert point correctly: - * - * The following sequence is tested: - * recover 4 pfids=[0,2,3,1] lfids=[0,3,1,2] - * insert 1 after lfid 0 pfids=[0,4,2,3,1] lfids=[0,4,2,3,1] - * insert 2 after lfid 2 pfids=[0,4,2,5,6,3,1] lfids=[0,6,2,5,1,3,4] - * insert 1 after lfid 6 pfids=[0,4,2,5,6,3,1,7] lfids=[0,6,2,5,1,3,4,7] - * issert 1 after lfid 3 pfids=[0,4,2,5,8,6,3,1,7] lfids=[0,7,2,6,1,3,5,8,4] - */ -QPID_AUTO_TEST_CASE(recover_insert) -{ - string test_name = get_test_name(test_filename, "recover_insert"); - const u_int16_t initial_num_jfiles = 4; - ::srand48(1); // init random gen for repeatable tests when using lpmgr_test_helper::prepare_recover() - try - { - jdir::create_dir(test_dir); // Check test dir exists; create it if not - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - lfid_pfid_map lfm(test_name, test_name); - lpmgr lm; - lpmgr_test_helper::prepare_recover(lfm, initial_num_jfiles); - lpmgr_test_helper::recover(lfm, lm, jc, true, 0); - - lpmgr_test_helper::insert(lfm, lm, jc, 0); - lpmgr_test_helper::insert(lfm, lm, jc, 2, 2); - lpmgr_test_helper::insert(lfm, lm, jc, 6); - lpmgr_test_helper::insert(lfm, lm, jc, 3); - } - catch(const exception& e) { BOOST_FAIL(e.what()); } - cout << "done" << endl; -} - -/* - * Check that illegal ae parameter combinations are caught and result in an exception being thrown. - */ -QPID_AUTO_TEST_CASE(ae_parameters) -{ - string test_name = get_test_name(test_filename, "ae_parameters"); - ::srand48(1); // init random gen for repeatable tests when using lpmgr_test_helper::prepare_recover() - try - { - jdir::create_dir(test_dir); // Check test dir exists; create it if not - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - lfid_pfid_map lfm(test_name, test_name); - const u_int16_t num_jfiles = 8; - lpmgr lm; - - for (unsigned i = 0; i < 2; i++) - { - if (i) - lpmgr_test_helper::initialize(lfm, lm, jc, num_jfiles, false, 0); - else - { - lpmgr_test_helper::prepare_recover(lfm, num_jfiles); - lpmgr_test_helper::recover(lfm, lm, jc, false, 0); - } - - lpmgr_test_helper::check_ae_max_jfiles(lm, num_jfiles, num_jfiles - 2); - lpmgr_test_helper::check_ae_max_jfiles(lm, num_jfiles, 0); - lpmgr_test_helper::check_ae_max_jfiles(lm, num_jfiles, 2 * num_jfiles); - lpmgr_test_helper::check_ae_max_jfiles(lm, num_jfiles, num_jfiles); - lfm.destroy_journal(); - } - } - catch(const exception& e) { BOOST_FAIL(e.what()); } - cout << "done" << endl; -} - -/* - * Check that initialized or recovered journals with auto-expand disabled will not allow either inserts or appends. - */ -QPID_AUTO_TEST_CASE(ae_disabled) -{ - string test_name = get_test_name(test_filename, "ae_disabled"); - ::srand48(1); // init random gen for repeatable tests when using lpmgr_test_helper::prepare_recover() - try - { - jdir::create_dir(test_dir); // Check test dir exists; create it if not - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - lfid_pfid_map lfm(test_name, test_name); - lpmgr_test_helper::check_limit(lfm, jc, false, 8, 0); - } - catch(const exception& e) { BOOST_FAIL(e.what()); } - cout << "done" << endl; -} - -/* - * Check that initialized or recovered journals with auto-expand enabled and a file limit set will enforce the correct - * limits on inserts and appends. - */ -QPID_AUTO_TEST_CASE(ae_enabled_limit) -{ - string test_name = get_test_name(test_filename, "ae_enabled_limit"); - ::srand48(1); // init random gen for repeatable tests when using lpmgr_test_helper::prepare_recover() - try - { - jdir::create_dir(test_dir); // Check test dir exists; create it if not - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - lfid_pfid_map lfm(test_name, test_name); - lpmgr_test_helper::check_limit(lfm, jc, true, 8, 32); - } - catch(const exception& e) { BOOST_FAIL(e.what()); } - cout << "done" << endl; -} - -/* - * Check that initialized or recovered journals with auto-expand enabled and no file limit set (0) will allow inserts and - * appends up to the file limit JRNL_MAX_NUM_FILES. - */ -QPID_AUTO_TEST_CASE(ae_enabled_unlimited) -{ - string test_name = get_test_name(test_filename, "ae_enabled_unlimited"); - ::srand48(1); // init random gen for repeatable tests when using lpmgr_test_helper::prepare_recover() - try - { - jdir::create_dir(test_dir); // Check test dir exists; create it if not - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - lfid_pfid_map lfm(test_name, test_name); - lpmgr_test_helper::check_limit(lfm, jc, true, 8, 0); - } - catch(const exception& e) { BOOST_FAIL(e.what()); } - cout << "done" << endl; -} - -#else -/* - * ============================================== - * LONG TESTS - * This section contains long tests and soak tests, - * and are run using target check-long (ie "make - * check-long"). These are built when LONG_TEST is - * defined. - * ============================================== - */ - -/* - * Tests randomized combinations of initialization/recovery, initial size, number, size and location of inserts. - * - * To reproduce a specific test, comment out the get_seed() statement and uncomment the literal below, adjusting the seed - * value to that required. - */ -QPID_AUTO_TEST_CASE(randomized_tests) -{ - string test_name = get_test_name(test_filename, "randomized_tests"); - const long seed = get_seed(); - // const long seed = 0x2d9b69d32; - cout << "seed=0x" << hex << seed << dec << " " << flush; - ::srand48(seed); - - lfid_pfid_map lfm(test_name, test_name); - flist pfidl; - flist lfidl; - rcvdat rd; - u_int16_t curr_ae_max_jfiles = 0; - jdir::create_dir(test_dir); // Check test dir exists; create it if not - - for (int test_num = 0; test_num < 250; test_num++) - { - test_jrnl_cb cb; - test_jrnl jc(test_name, test_dir, test_name, cb); - lpmgr lm; - // 50% chance of recovery except first run and if there is still ae space left - const bool recover_flag = test_num > 0 && - curr_ae_max_jfiles > lfm.size() && - 2.0 * ::drand48() < 1.0; - if (recover_flag) - { - // Recover from previous iteration - lfm.get_pfid_list(pfidl); - lfm.get_lfid_list(lfidl); - lfm.write_journal(true, curr_ae_max_jfiles, JFSIZE_SBLKS); - lpmgr_test_helper::rcvdat_init(rd, pfidl, true, curr_ae_max_jfiles); - lm.recover(rd, &jc, &jc.new_fcntl); - lpmgr_test_helper::check_pfids_lfids(lm, pfidl, lfidl); - } - else - { - // Initialize from scratch - const u_int16_t num_jfiles = 4 + u_int16_t(21.0 * ::drand48()); // size: 4 - 25 files - curr_ae_max_jfiles = u_int16_t(4 * num_jfiles * ::drand48()); // size: 0 - 100 files - if (curr_ae_max_jfiles > JRNL_MAX_NUM_FILES) curr_ae_max_jfiles = JRNL_MAX_NUM_FILES; - else if (curr_ae_max_jfiles <= num_jfiles) curr_ae_max_jfiles = 0; - lfm.destroy_journal(); - lfm.journal_create(num_jfiles, num_jfiles); - lfm.get_pfid_list(pfidl); - lfm.get_lfid_list(lfidl); - lm.initialize(num_jfiles, true, curr_ae_max_jfiles, &jc, &jc.new_fcntl); - lpmgr_test_helper::check_linear_pfids_lfids(lm, num_jfiles); - } - - // Loop to insert pfids - const int num_inserts = 1 + int(lfm.size() * ::drand48()); - for (int i = 0; i < num_inserts; i++) - { - const u_int16_t size = lm.num_jfiles(); - const u_int16_t after_lfid = u_int16_t(1.0 * size * ::drand48()); - const u_int16_t num_jfiles = 1 + u_int16_t(4.0 * ::drand48()); - const bool legal = lm.ae_max_jfiles() - ? size + num_jfiles <= lm.ae_max_jfiles() - : size + num_jfiles <= JRNL_MAX_NUM_FILES; - if (legal) - { - lfm.journal_insert(after_lfid, num_jfiles); - lfm.get_pfid_list(pfidl); - lfm.get_lfid_list(lfidl); - - lm.insert(after_lfid, &jc, &jc.new_fcntl, num_jfiles); - lpmgr_test_helper::check_pfids_lfids(lm, pfidl, lfidl); - } - else - { - try - { - lm.insert(after_lfid, &jc, &jc.new_fcntl, num_jfiles); - BOOST_FAIL("lpmgr::insert() succeeded and exceeded limit"); - } - catch (const jexception& e) - { - BOOST_CHECK_EQUAL(e.err_code(), jerrno::JERR_LFMGR_AEFNUMLIMIT); - break; // no more inserts... - } - } - } - lm.finalize(); - BOOST_CHECK_EQUAL(lm.is_init(), false); - BOOST_CHECK_EQUAL(lm.num_jfiles(), u_int16_t(0)); - BOOST_CHECK_EQUAL(lm.get_fcntlp(0), (void*)0); - } - cout << "done" << endl; -} - -#endif - -QPID_AUTO_TEST_SUITE_END() diff --git a/qpid/cpp/src/tests/legacystore/jrnl/_ut_rec_hdr.cpp b/qpid/cpp/src/tests/legacystore/jrnl/_ut_rec_hdr.cpp deleted file mode 100644 index 099e576bbd..0000000000 --- a/qpid/cpp/src/tests/legacystore/jrnl/_ut_rec_hdr.cpp +++ /dev/null @@ -1,438 +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 <ctime> -#include <iostream> -#include "qpid/legacystore/jrnl/deq_hdr.h" -#include "qpid/legacystore/jrnl/enq_hdr.h" -#include "qpid/legacystore/jrnl/file_hdr.h" -#include "qpid/legacystore/jrnl/jcfg.h" -#include "qpid/legacystore/jrnl/rec_tail.h" -#include "qpid/legacystore/jrnl/txn_hdr.h" - -using namespace boost::unit_test; -using namespace mrg::journal; -using namespace std; - -QPID_AUTO_TEST_SUITE(rec_hdr_suite) - -const string test_filename("_ut_rec_hdr"); - -QPID_AUTO_TEST_CASE(hdr_class) -{ - cout << test_filename << ".hdr_class: " << flush; - rec_hdr h1; - BOOST_CHECK_EQUAL(h1._magic, 0UL); - BOOST_CHECK_EQUAL(h1._version, 0); - BOOST_CHECK_EQUAL(h1._eflag, 0); - BOOST_CHECK_EQUAL(h1._uflag, 0); - BOOST_CHECK_EQUAL(h1._rid, 0ULL); - BOOST_CHECK(!h1.get_owi()); - - const u_int32_t magic = 0x89abcdefUL; - const u_int16_t uflag = 0x5537; - const u_int8_t version = 0xef; - const u_int64_t rid = 0x123456789abcdef0ULL; - const bool owi = true; - - rec_hdr h2(magic, version, rid, owi); - BOOST_CHECK_EQUAL(h2._magic, magic); - BOOST_CHECK_EQUAL(h2._version, version); -#ifdef JRNL_LITTLE_ENDIAN - BOOST_CHECK_EQUAL(h2._eflag, RHM_LENDIAN_FLAG); -#else - BOOST_CHECK_EQUAL(h2._eflag, RHM_BENDIAN_FLAG); -#endif - BOOST_CHECK_EQUAL(h2._uflag, (const u_int16_t)rec_hdr::HDR_OVERWRITE_INDICATOR_MASK); - BOOST_CHECK_EQUAL(h2._rid, rid); - BOOST_CHECK_EQUAL(h2.get_owi(), owi); - h2._uflag = uflag; - BOOST_CHECK(h2.get_owi()); - h2.set_owi(true); - BOOST_CHECK(h2.get_owi()); - BOOST_CHECK_EQUAL(h2._uflag, uflag); - h2.set_owi(false); - BOOST_CHECK(!h2.get_owi()); - BOOST_CHECK_EQUAL(h2._uflag, (uflag & ~(const u_int16_t)rec_hdr::HDR_OVERWRITE_INDICATOR_MASK)); - h2.set_owi(true); - BOOST_CHECK(h2.get_owi()); - BOOST_CHECK_EQUAL(h2._uflag, uflag); - - h1.hdr_copy(h2); - BOOST_CHECK_EQUAL(h1._magic, magic); - BOOST_CHECK_EQUAL(h1._version, version); -#ifdef JRNL_LITTLE_ENDIAN - BOOST_CHECK_EQUAL(h1._eflag, RHM_LENDIAN_FLAG); -#else - BOOST_CHECK_EQUAL(h1._eflag, RHM_BENDIAN_FLAG); -#endif - BOOST_CHECK_EQUAL(h1._uflag, uflag); - BOOST_CHECK_EQUAL(h1._rid, rid); - BOOST_CHECK(h1.get_owi()); - BOOST_CHECK_EQUAL(h1._uflag, uflag); - - h1.reset(); - BOOST_CHECK_EQUAL(h1._magic, 0UL); - BOOST_CHECK_EQUAL(h1._version, 0); - BOOST_CHECK_EQUAL(h1._eflag, 0); - BOOST_CHECK_EQUAL(h1._uflag, 0); - BOOST_CHECK_EQUAL(h1._rid, 0ULL); - BOOST_CHECK(!h1.get_owi()); - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(rec_tail_class) -{ - cout << test_filename << ".rec_tail_class: " << flush; - const u_int32_t magic = 0xfedcba98; - const u_int64_t rid = 0xfedcba9876543210ULL; - const u_int32_t xmagic = ~magic; - - { - rec_tail rt1; - BOOST_CHECK_EQUAL(rt1._xmagic, 0xffffffffUL); - BOOST_CHECK_EQUAL(rt1._rid, 0ULL); - } - - { - rec_tail rt2(magic, rid); - BOOST_CHECK_EQUAL(rt2._xmagic, magic); - BOOST_CHECK_EQUAL(rt2._rid, rid); - } - - { - rec_hdr h(magic, RHM_JDAT_VERSION, rid, true); - rec_tail rt3(h); - BOOST_CHECK_EQUAL(rt3._xmagic, xmagic); - BOOST_CHECK_EQUAL(rt3._rid, rid); - } - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(file_hdr_class) -{ - cout << test_filename << ".file_hdr_class: " << flush; - const u_int32_t magic = 0xfedcba98UL; - const u_int8_t version = 0xa5; - const u_int16_t uflag = 0x5537; - const u_int64_t rid = 0xfedcba9876543210ULL; - const u_int16_t pfid = 0xfedcU; - const u_int16_t lfid = 0xf0e1U; -#ifdef JRNL_32_BIT - const std::size_t fro = 0xfedcba98UL; -#else - const std::size_t fro = 0xfedcba9876543210ULL; -#endif - timespec ts; - const bool owi = true; - - { - file_hdr fh1; - BOOST_CHECK_EQUAL(fh1._magic, 0UL); - BOOST_CHECK_EQUAL(fh1._version, 0); - BOOST_CHECK_EQUAL(fh1._eflag, 0); - BOOST_CHECK_EQUAL(fh1._uflag, 0); - BOOST_CHECK_EQUAL(fh1._rid, 0ULL); - BOOST_CHECK_EQUAL(fh1._pfid, 0UL); - BOOST_CHECK_EQUAL(fh1._lfid, 0U); - BOOST_CHECK_EQUAL(fh1._fro, std::size_t(0)); - BOOST_CHECK_EQUAL(fh1._ts_sec, std::time_t(0)); - BOOST_CHECK_EQUAL(fh1._ts_nsec, u_int32_t(0)); - BOOST_CHECK(!fh1.get_owi()); - } - - { - file_hdr fh2(magic, version, rid, pfid, lfid, fro, owi, false); - BOOST_CHECK_EQUAL(fh2._magic, magic); - BOOST_CHECK_EQUAL(fh2._version, version); -#ifdef JRNL_LITTLE_ENDIAN - BOOST_CHECK_EQUAL(fh2._eflag, RHM_LENDIAN_FLAG); -#else - BOOST_CHECK_EQUAL(fh2._eflag, RHM_BENDIAN_FLAG); -#endif - BOOST_CHECK_EQUAL(fh2._uflag, (const u_int16_t)rec_hdr::HDR_OVERWRITE_INDICATOR_MASK); - BOOST_CHECK_EQUAL(fh2._rid, rid); - BOOST_CHECK_EQUAL(fh2._pfid, pfid ); - BOOST_CHECK_EQUAL(fh2._lfid, lfid); - BOOST_CHECK_EQUAL(fh2._fro, fro); - BOOST_CHECK_EQUAL(fh2._ts_sec, std::time_t(0)); - BOOST_CHECK_EQUAL(fh2._ts_nsec, u_int32_t(0)); - ::clock_gettime(CLOCK_REALTIME, &ts); - fh2.set_time(ts); - BOOST_CHECK_EQUAL(fh2._ts_sec, ts.tv_sec); - BOOST_CHECK_EQUAL(fh2._ts_nsec, u_int32_t(ts.tv_nsec)); - BOOST_CHECK(fh2.get_owi()); - - fh2._uflag = uflag; - BOOST_CHECK(fh2.get_owi()); - - fh2.set_owi(false); - BOOST_CHECK(!fh2.get_owi()); - BOOST_CHECK_EQUAL(fh2._uflag, - (uflag & ~(const u_int16_t)rec_hdr::HDR_OVERWRITE_INDICATOR_MASK)); - - fh2.set_owi(true); - BOOST_CHECK(fh2.get_owi()); - BOOST_CHECK_EQUAL(fh2._uflag, uflag); - } - - { - file_hdr fh3(magic, version, rid, pfid, lfid, fro, owi, true); - BOOST_CHECK_EQUAL(fh3._magic, magic); - BOOST_CHECK_EQUAL(fh3._version, version); -#ifdef JRNL_LITTLE_ENDIAN - BOOST_CHECK_EQUAL(fh3._eflag, RHM_LENDIAN_FLAG); -#else - BOOST_CHECK_EQUAL(fh3._eflag, RHM_BENDIAN_FLAG); -#endif - BOOST_CHECK_EQUAL(fh3._uflag, (const u_int16_t)rec_hdr::HDR_OVERWRITE_INDICATOR_MASK); - BOOST_CHECK_EQUAL(fh3._rid, rid); - BOOST_CHECK_EQUAL(fh3._pfid, pfid); - BOOST_CHECK_EQUAL(fh3._lfid, lfid); - BOOST_CHECK_EQUAL(fh3._fro, fro); - BOOST_CHECK(fh3._ts_sec - ts.tv_sec <= 1); // No more than 1 sec difference - } - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(enq_hdr_class) -{ - cout << test_filename << ".enq_hdr_class: " << flush; - const u_int32_t magic = 0xfedcba98UL; - const u_int8_t version = 0xa5; - const u_int64_t rid = 0xfedcba9876543210ULL; - const u_int16_t uflag = 0x5537; -#ifdef JRNL_32_BIT - const std::size_t xidsize = 0xfedcba98UL; - const std::size_t dsize = 0x76543210UL; -#else - const std::size_t xidsize = 0xfedcba9876543210ULL; - const std::size_t dsize = 0x76543210fedcba98ULL; -#endif - const bool owi = true; - - { - enq_hdr eh1; - BOOST_CHECK_EQUAL(eh1._magic, 0UL); - BOOST_CHECK_EQUAL(eh1._version, 0); - BOOST_CHECK_EQUAL(eh1._eflag, 0); - BOOST_CHECK_EQUAL(eh1._uflag, 0); - BOOST_CHECK_EQUAL(eh1._rid, 0ULL); - BOOST_CHECK_EQUAL(eh1._xidsize, std::size_t(0)); - BOOST_CHECK_EQUAL(eh1._dsize, std::size_t(0)); - BOOST_CHECK(!eh1.get_owi()); - } - - { - enq_hdr eh2(magic, version, rid, xidsize, dsize, owi, false); - BOOST_CHECK_EQUAL(eh2._magic, magic); - BOOST_CHECK_EQUAL(eh2._version, version); -#ifdef JRNL_LITTLE_ENDIAN - BOOST_CHECK_EQUAL(eh2._eflag, RHM_LENDIAN_FLAG); -#else - BOOST_CHECK_EQUAL(eh2._eflag, RHM_BENDIAN_FLAG); -#endif - BOOST_CHECK_EQUAL(eh2._uflag, (const u_int16_t)rec_hdr::HDR_OVERWRITE_INDICATOR_MASK); - BOOST_CHECK_EQUAL(eh2._rid, rid); - BOOST_CHECK_EQUAL(eh2._xidsize, xidsize); - BOOST_CHECK_EQUAL(eh2._dsize, dsize); - BOOST_CHECK(eh2.get_owi()); - BOOST_CHECK(!eh2.is_transient()); - BOOST_CHECK(!eh2.is_external()); - - eh2._uflag = uflag; - BOOST_CHECK(eh2.get_owi()); - BOOST_CHECK(eh2.is_transient()); - BOOST_CHECK(eh2.is_external()); - - eh2.set_owi(false); - BOOST_CHECK(!eh2.get_owi()); - BOOST_CHECK(eh2.is_transient()); - BOOST_CHECK(eh2.is_external()); - BOOST_CHECK_EQUAL(eh2._uflag, - (uflag & ~(const u_int16_t)rec_hdr::HDR_OVERWRITE_INDICATOR_MASK)); - - eh2.set_owi(true); - BOOST_CHECK(eh2.get_owi()); - BOOST_CHECK(eh2.is_transient()); - BOOST_CHECK(eh2.is_external()); - BOOST_CHECK_EQUAL(eh2._uflag, uflag); - - eh2.set_transient(false); - BOOST_CHECK(eh2.get_owi()); - BOOST_CHECK(!eh2.is_transient()); - BOOST_CHECK(eh2.is_external()); - BOOST_CHECK_EQUAL(eh2._uflag, uflag & ~(const u_int16_t)enq_hdr::ENQ_HDR_TRANSIENT_MASK); - - eh2.set_transient(true); - BOOST_CHECK(eh2.get_owi()); - BOOST_CHECK(eh2.is_transient()); - BOOST_CHECK(eh2.is_external()); - BOOST_CHECK_EQUAL(eh2._uflag, uflag); - - eh2.set_external(false); - BOOST_CHECK(eh2.get_owi()); - BOOST_CHECK(eh2.is_transient()); - BOOST_CHECK(!eh2.is_external()); - BOOST_CHECK_EQUAL(eh2._uflag, uflag & ~(const u_int16_t)enq_hdr::ENQ_HDR_EXTERNAL_MASK); - - eh2.set_external(true); - BOOST_CHECK(eh2.get_owi()); - BOOST_CHECK(eh2.is_transient()); - BOOST_CHECK(eh2.is_external()); - BOOST_CHECK_EQUAL(eh2._uflag, uflag); - } - - { - enq_hdr eh3(magic, version, rid, xidsize, dsize, owi, true); - BOOST_CHECK_EQUAL(eh3._magic, magic); - BOOST_CHECK_EQUAL(eh3._version, version); -#ifdef JRNL_LITTLE_ENDIAN - BOOST_CHECK_EQUAL(eh3._eflag, RHM_LENDIAN_FLAG); -#else - BOOST_CHECK_EQUAL(eh3._eflag, RHM_BENDIAN_FLAG); -#endif - BOOST_CHECK_EQUAL(eh3._uflag, (const u_int16_t)enq_hdr::ENQ_HDR_TRANSIENT_MASK | - (const u_int16_t)rec_hdr::HDR_OVERWRITE_INDICATOR_MASK); - BOOST_CHECK_EQUAL(eh3._rid, rid); - BOOST_CHECK_EQUAL(eh3._xidsize, xidsize); - BOOST_CHECK_EQUAL(eh3._dsize, dsize); - BOOST_CHECK(eh3.get_owi()); - BOOST_CHECK(eh3.is_transient()); - BOOST_CHECK(!eh3.is_external()); - } - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(deq_hdr_class) -{ - cout << test_filename << ".deq_hdr_class: " << flush; - const u_int32_t magic = 0xfedcba98UL; - const u_int8_t version = 0xa5; - const u_int16_t uflag = 0x5537; - const u_int64_t rid = 0xfedcba9876543210ULL; - const u_int64_t drid = 0x76543210fedcba98ULL; -#ifdef JRNL_32_BIT - const std::size_t xidsize = 0xfedcba98UL; -#else - const std::size_t xidsize = 0xfedcba9876543210ULL; -#endif - const bool owi = true; - - { - deq_hdr dh1; - BOOST_CHECK_EQUAL(dh1._magic, 0UL); - BOOST_CHECK_EQUAL(dh1._version, 0); - BOOST_CHECK_EQUAL(dh1._eflag, 0); - BOOST_CHECK_EQUAL(dh1._uflag, 0); - BOOST_CHECK_EQUAL(dh1._rid, 0ULL); - BOOST_CHECK_EQUAL(dh1._deq_rid, 0ULL); - BOOST_CHECK_EQUAL(dh1._xidsize, std::size_t(0)); - BOOST_CHECK(!dh1.get_owi()); - } - - { - deq_hdr dh2(magic, version, rid, drid, xidsize, owi); - BOOST_CHECK_EQUAL(dh2._magic, magic); - BOOST_CHECK_EQUAL(dh2._version, version); -#ifdef JRNL_LITTLE_ENDIAN - BOOST_CHECK_EQUAL(dh2._eflag, RHM_LENDIAN_FLAG); -#else - BOOST_CHECK_EQUAL(dh2._eflag, RHM_BENDIAN_FLAG); -#endif - BOOST_CHECK_EQUAL(dh2._uflag, (const u_int16_t)rec_hdr::HDR_OVERWRITE_INDICATOR_MASK); - BOOST_CHECK_EQUAL(dh2._rid, rid); - BOOST_CHECK_EQUAL(dh2._deq_rid, drid); - BOOST_CHECK_EQUAL(dh2._xidsize, xidsize); - BOOST_CHECK(dh2.get_owi()); - - dh2._uflag = uflag; - BOOST_CHECK(dh2.get_owi()); - - dh2.set_owi(false); - BOOST_CHECK(!dh2.get_owi()); - BOOST_CHECK_EQUAL(dh2._uflag, - (uflag & ~(const u_int16_t)rec_hdr::HDR_OVERWRITE_INDICATOR_MASK)); - - dh2.set_owi(true); - BOOST_CHECK(dh2.get_owi()); - BOOST_CHECK_EQUAL(dh2._uflag, uflag); - } - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(txn_hdr_class) -{ - cout << test_filename << ".txn_hdr_class: " << flush; - const u_int32_t magic = 0xfedcba98UL; - const u_int8_t version = 0xa5; - const u_int16_t uflag = 0x5537; - const u_int64_t rid = 0xfedcba9876543210ULL; -#ifdef JRNL_32_BIT - const std::size_t xidsize = 0xfedcba98UL; -#else - const std::size_t xidsize = 0xfedcba9876543210ULL; -#endif - const bool owi = true; - - { - txn_hdr th1; - BOOST_CHECK_EQUAL(th1._magic, 0UL); - BOOST_CHECK_EQUAL(th1._version, 0); - BOOST_CHECK_EQUAL(th1._eflag, 0); - BOOST_CHECK_EQUAL(th1._uflag, 0); - BOOST_CHECK_EQUAL(th1._rid, 0ULL); - BOOST_CHECK_EQUAL(th1._xidsize, std::size_t(0)); - BOOST_CHECK(!th1.get_owi()); - } - - { - txn_hdr th2(magic, version, rid, xidsize, owi); - BOOST_CHECK_EQUAL(th2._magic, magic); - BOOST_CHECK_EQUAL(th2._version, version); -#ifdef JRNL_LITTLE_ENDIAN - BOOST_CHECK_EQUAL(th2._eflag, RHM_LENDIAN_FLAG); -#else - BOOST_CHECK_EQUAL(th2._eflag, RHM_BENDIAN_FLAG); -#endif - BOOST_CHECK_EQUAL(th2._uflag, (const u_int16_t)rec_hdr::HDR_OVERWRITE_INDICATOR_MASK); - BOOST_CHECK_EQUAL(th2._rid, rid); - BOOST_CHECK_EQUAL(th2._xidsize, xidsize); - BOOST_CHECK(th2.get_owi()); - - th2._uflag = uflag; - BOOST_CHECK(th2.get_owi()); - - th2.set_owi(false); - BOOST_CHECK(!th2.get_owi()); - BOOST_CHECK_EQUAL(th2._uflag, - (uflag & ~(const u_int16_t)rec_hdr::HDR_OVERWRITE_INDICATOR_MASK)); - - th2.set_owi(true); - BOOST_CHECK(th2.get_owi()); - BOOST_CHECK_EQUAL(th2._uflag, uflag); - } - cout << "ok" << endl; -} - -QPID_AUTO_TEST_SUITE_END() diff --git a/qpid/cpp/src/tests/legacystore/jrnl/_ut_time_ns.cpp b/qpid/cpp/src/tests/legacystore/jrnl/_ut_time_ns.cpp deleted file mode 100644 index f1b53bb97b..0000000000 --- a/qpid/cpp/src/tests/legacystore/jrnl/_ut_time_ns.cpp +++ /dev/null @@ -1,163 +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 <ctime> -#include <iostream> -#include "qpid/legacystore/jrnl/time_ns.h" - -using namespace boost::unit_test; -using namespace mrg::journal; -using namespace std; - -QPID_AUTO_TEST_SUITE(time_ns_suite) - -const string test_filename("_ut_time_ns"); - -QPID_AUTO_TEST_CASE(constructors) -{ - cout << test_filename << ".constructors: " << flush; - const std::time_t sec = 123; - const long nsec = 123456789; - - time_ns t1; - BOOST_CHECK_EQUAL(t1.tv_sec, 0); - BOOST_CHECK_EQUAL(t1.tv_nsec, 0); - BOOST_CHECK_EQUAL(t1.is_zero(), true); - time_ns t2(sec, nsec); - BOOST_CHECK_EQUAL(t2.tv_sec, sec); - BOOST_CHECK_EQUAL(t2.tv_nsec, nsec); - BOOST_CHECK_EQUAL(t2.is_zero(), false); - time_ns t3(t1); - BOOST_CHECK_EQUAL(t3.tv_sec, 0); - BOOST_CHECK_EQUAL(t3.tv_nsec, 0); - BOOST_CHECK_EQUAL(t3.is_zero(), true); - time_ns t4(t2); - BOOST_CHECK_EQUAL(t4.tv_sec, sec); - BOOST_CHECK_EQUAL(t4.tv_nsec, nsec); - BOOST_CHECK_EQUAL(t4.is_zero(), false); - t4.set_zero(); - BOOST_CHECK_EQUAL(t4.tv_sec, 0); - BOOST_CHECK_EQUAL(t4.tv_nsec, 0); - BOOST_CHECK_EQUAL(t4.is_zero(), true); - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(operators) -{ - cout << test_filename << ".operators: " << flush; - const std::time_t sec1 = 123; - const long nsec1 = 123456789; - const std::time_t sec2 = 1; - const long nsec2 = 999999999; - const std::time_t sec_sum = sec1 + sec2 + 1; - const long nsec_sum = nsec1 + nsec2 - 1000000000; - const std::time_t sec_1_minus_2 = sec1 - sec2 - 1; - const long nsec_1_minus_2 = nsec1 - nsec2 + 1000000000; - const std::time_t sec_2_minus_1 = sec2 - sec1; - const long nsec_2_minus_1 = nsec2 - nsec1; - time_ns z; - time_ns t1(sec1, nsec1); - time_ns t2(sec2, nsec2); - - time_ns t3 = z; - BOOST_CHECK_EQUAL(t3.tv_sec, 0); - BOOST_CHECK_EQUAL(t3.tv_nsec, 0); - BOOST_CHECK_EQUAL(t3 == z, true); - BOOST_CHECK_EQUAL(t3 != z, false); - BOOST_CHECK_EQUAL(t3 > z, false); - BOOST_CHECK_EQUAL(t3 >= z, true); - BOOST_CHECK_EQUAL(t3 < z, false); - BOOST_CHECK_EQUAL(t3 <= z, true); - - t3 = t1; - BOOST_CHECK_EQUAL(t3.tv_sec, sec1); - BOOST_CHECK_EQUAL(t3.tv_nsec, nsec1); - BOOST_CHECK_EQUAL(t3 == t1, true); - BOOST_CHECK_EQUAL(t3 != t1, false); - BOOST_CHECK_EQUAL(t3 > t1, false); - BOOST_CHECK_EQUAL(t3 >= t1, true); - BOOST_CHECK_EQUAL(t3 < t1, false); - BOOST_CHECK_EQUAL(t3 <= t1, true); - - t3 += z; - BOOST_CHECK_EQUAL(t3.tv_sec, sec1); - BOOST_CHECK_EQUAL(t3.tv_nsec, nsec1); - - t3 = t2; - BOOST_CHECK_EQUAL(t3.tv_sec, sec2); - BOOST_CHECK_EQUAL(t3.tv_nsec, nsec2); - BOOST_CHECK_EQUAL(t3 == t2, true); - BOOST_CHECK_EQUAL(t3 != t2, false); - BOOST_CHECK_EQUAL(t3 > t2, false); - BOOST_CHECK_EQUAL(t3 >= t2, true); - BOOST_CHECK_EQUAL(t3 < t2, false); - BOOST_CHECK_EQUAL(t3 <= t2, true); - - t3 += z; - BOOST_CHECK_EQUAL(t3.tv_sec, sec2); - BOOST_CHECK_EQUAL(t3.tv_nsec, nsec2); - - t3 = t1; - t3 += t2; - BOOST_CHECK_EQUAL(t3.tv_sec, sec_sum); - BOOST_CHECK_EQUAL(t3.tv_nsec, nsec_sum); - - t3 = t1; - t3 -= t2; - BOOST_CHECK_EQUAL(t3.tv_sec, sec_1_minus_2); - BOOST_CHECK_EQUAL(t3.tv_nsec, nsec_1_minus_2); - - t3 = t2; - t3 -= t1; - BOOST_CHECK_EQUAL(t3.tv_sec, sec_2_minus_1); - BOOST_CHECK_EQUAL(t3.tv_nsec, nsec_2_minus_1); - - t3 = t1 + t2; - BOOST_CHECK_EQUAL(t3.tv_sec, sec_sum); - BOOST_CHECK_EQUAL(t3.tv_nsec, nsec_sum); - - t3 = t1 - t2; - BOOST_CHECK_EQUAL(t3.tv_sec, sec_1_minus_2); - BOOST_CHECK_EQUAL(t3.tv_nsec, nsec_1_minus_2); - - t3 = t2 - t1; - BOOST_CHECK_EQUAL(t3.tv_sec, sec_2_minus_1); - BOOST_CHECK_EQUAL(t3.tv_nsec, nsec_2_minus_1); - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(str) -{ - cout << test_filename << ".str: " << flush; - time_ns t1(123, 123456789); - BOOST_CHECK_EQUAL(t1.str(), "123.123457"); - BOOST_CHECK_EQUAL(t1.str(9), "123.123456789"); - BOOST_CHECK_EQUAL(t1.str(0), "123"); - time_ns t2(1, 1); - BOOST_CHECK_EQUAL(t2.str(9), "1.000000001"); - time_ns t3(-12, 345); - BOOST_CHECK_EQUAL(t3.str(9), "-11.999999655"); - cout << "ok" << endl; -} - -QPID_AUTO_TEST_SUITE_END() diff --git a/qpid/cpp/src/tests/legacystore/jrnl/_ut_txn_map.cpp b/qpid/cpp/src/tests/legacystore/jrnl/_ut_txn_map.cpp deleted file mode 100644 index 595ce0f6c6..0000000000 --- a/qpid/cpp/src/tests/legacystore/jrnl/_ut_txn_map.cpp +++ /dev/null @@ -1,106 +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 <iomanip> -#include <iostream> -#include "qpid/legacystore/jrnl/txn_map.h" -#include <sstream> - -using namespace boost::unit_test; -using namespace mrg::journal; -using namespace std; - -QPID_AUTO_TEST_SUITE(txn_map_suite) - -const string test_filename("_ut_txn_map"); - -// === Helper functions === - -const string make_xid(u_int64_t rid) -{ - stringstream ss; - ss << "XID-" << setfill('0') << setw(16) << hex << rid; - ss << "-0123456789abcdef"; - return ss.str(); -} - -void check_td_equal(txn_data& td1, txn_data& td2) -{ - BOOST_CHECK_EQUAL(td1._rid, td2._rid); - BOOST_CHECK_EQUAL(td1._drid, td2._drid); - BOOST_CHECK_EQUAL(td1._pfid, td2._pfid); - BOOST_CHECK_EQUAL(td1._enq_flag, td2._enq_flag); - BOOST_CHECK_EQUAL(td1._aio_compl, td2._aio_compl); -} - -// === Test suite === - -QPID_AUTO_TEST_CASE(constructor) -{ - cout << test_filename << ".constructor: " << flush; - const u_int64_t rid = 0x123456789abcdef0ULL; - const u_int64_t drid = 0xfedcba9876543210ULL; - const u_int16_t pfid = 0xfedcU; - const bool enq_flag = true; - txn_data td(rid, drid, pfid, enq_flag); - BOOST_CHECK_EQUAL(td._rid, rid); - BOOST_CHECK_EQUAL(td._drid, drid); - BOOST_CHECK_EQUAL(td._pfid, pfid); - BOOST_CHECK_EQUAL(td._enq_flag, enq_flag); - BOOST_CHECK_EQUAL(td._aio_compl, false); - - txn_map t1; - BOOST_CHECK(t1.empty()); - BOOST_CHECK_EQUAL(t1.size(), u_int32_t(0)); - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(insert_get) -{ - cout << test_filename << ".insert_get: " << flush; - u_int16_t fid; - u_int64_t rid; - u_int16_t pfid_start = 0x2000U; - u_int64_t rid_begin = 0xffffffff00000000ULL; - u_int64_t rid_end = 0xffffffff00000200ULL; - - // insert with no dups - u_int64_t rid_incr_1 = 4ULL; - txn_map t2; - t2.set_num_jfiles(pfid_start + (rid_end - rid_begin)/rid_incr_1); - for (rid = rid_begin, fid = pfid_start; rid < rid_end; rid += rid_incr_1, fid++) - t2.insert_txn_data(make_xid(rid), txn_data(rid, ~rid, fid, false)); - BOOST_CHECK(!t2.empty()); - BOOST_CHECK_EQUAL(t2.size(), u_int32_t(128)); - - // get - u_int64_t rid_incr_2 = 6ULL; - for (u_int64_t rid = rid_begin; rid < rid_end; rid += rid_incr_2) - { - string xid = make_xid(rid); - BOOST_CHECK_EQUAL(t2.in_map(xid), (rid%rid_incr_1 ? false : true)); - } - cout << "ok" << endl; -} - -QPID_AUTO_TEST_SUITE_END() diff --git a/qpid/cpp/src/tests/legacystore/jrnl/chk_jdata b/qpid/cpp/src/tests/legacystore/jrnl/chk_jdata deleted file mode 100755 index 2ac87d91b9..0000000000 --- a/qpid/cpp/src/tests/legacystore/jrnl/chk_jdata +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/env 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. -# - - -JRNL_BLK_SIZE=512 # Block size in bytes -JRNL_PAGE_SIZE=256 # Journal page size in blocks -JRNL_FILE_SIZE=12 # Journal file size in pages -let END_OFFSET=${JRNL_BLK_SIZE}*${JRNL_PAGE_SIZE}*${JRNL_FILE_SIZE} -for f in jdata/test.*.jdat; do - echo $f - hexdump -C -n 1024 $f - hexdump -C -s ${END_OFFSET} $f - echo "============" -done diff --git a/qpid/cpp/src/tests/legacystore/jrnl/cp_rtest_jrnl b/qpid/cpp/src/tests/legacystore/jrnl/cp_rtest_jrnl deleted file mode 100755 index e21f991788..0000000000 --- a/qpid/cpp/src/tests/legacystore/jrnl/cp_rtest_jrnl +++ /dev/null @@ -1,59 +0,0 @@ -#!/usr/bin/env 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. -# - -JDATA_DIR=jdata -TAR_DIR=rd_test_jrnls - -function get_filename -{ - local prefix=$1 - local file_num=$2 - local suffix=$3 - - if (( file_num < 10 )); then - local num="000${file_num}" - elif (( file_num < 100 )); then - local num="00${file_num}" - elif (( file_num < 1000 )); then - local num="0${file_num}" - else - local num="${file_num}" - fi - FILENAME=${prefix}${num}${suffix} - return 0 -} - -if (( $# != 1 )); then - echo "Incorrect args, expected 1 arg (usage: \"prep <testnum>\")" - exit -fi - -get_filename "t" $1 ".tar.gz" -if [[ -d ${JDATA_DIR} ]]; then - rm -rf ${JDATA_DIR}/* -else - mkdir -p ${JDATA_DIR} -fi -if [[ -f "${TAR_DIR}/${FILENAME}" ]]; then - tar -C ${JDATA_DIR} -xzf "${TAR_DIR}/${FILENAME}" -else - echo "Error: file \"${TAR_DIR}/${FILENAME}\" not found." -fi diff --git a/qpid/cpp/src/tests/legacystore/jrnl/jhexdump b/qpid/cpp/src/tests/legacystore/jrnl/jhexdump deleted file mode 100755 index b013914441..0000000000 --- a/qpid/cpp/src/tests/legacystore/jrnl/jhexdump +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/env 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. -# - -if [ -z "$1" ]; then - echo "No directory specified." - exit -fi - -JDIR=$1 -echo "Target directory: ${JDIR}" - -rm -f j*.txt - -if [ -d "${JDIR}" ]; then - n=0 - for f in "${JDIR}"/*.jdat; do - echo "$f -> j$n.txt" - hexdump -C "$f" > j$n.txt - (( n += 1 )) - done -else - echo "This directory does not exist." -fi diff --git a/qpid/cpp/src/tests/legacystore/jrnl/jtt/_ut_data_src.cpp b/qpid/cpp/src/tests/legacystore/jrnl/jtt/_ut_data_src.cpp deleted file mode 100644 index e4656ef83f..0000000000 --- a/qpid/cpp/src/tests/legacystore/jrnl/jtt/_ut_data_src.cpp +++ /dev/null @@ -1,207 +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 <cstddef> -#include "data_src.h" -#include <iomanip> -#include <iostream> - -using namespace boost::unit_test; -using namespace mrg::jtt; -using namespace std; - -QPID_AUTO_TEST_SUITE(jtt_data_src) - -const string test_filename("_ut_data_src"); - -long -get_seed() -{ - timespec ts; - if (::clock_gettime(CLOCK_REALTIME, &ts)) - BOOST_FAIL("Unable to read clock to generate seed."); - long tenths = ts.tv_nsec / 100000000; - return long(10 * ts.tv_sec + tenths); // time in tenths of a second -} - -#ifndef LONG_TEST -/* - * ============================================== - * NORMAL TESTS - * This section contains normal "make check" tests - * for building/packaging. These are built when - * LONG_TEST is _not_ defined. - * ============================================== - */ - -QPID_AUTO_TEST_CASE(data) -{ - cout << test_filename << ".data: " << flush; - BOOST_CHECK(data_src::max_dsize > 0); - for (std::size_t i=0; i<1024; i++) - { - const char* dp = data_src::get_data(i); - BOOST_CHECK_EQUAL(*dp, static_cast<char>('0' + ((i + 1) % 10))); - } - for (std::size_t i=data_src::max_dsize-1024; i<data_src::max_dsize; i++) - { - const char* dp = data_src::get_data(i); - BOOST_CHECK_EQUAL(*dp, static_cast<char>('0' + ((i + 1) % 10))); - } - const char* dp1 = data_src::get_data(data_src::max_dsize); - BOOST_CHECK_EQUAL(dp1,(char*) 0); - const char* dp2 = data_src::get_data(data_src::max_dsize + 0x1000); - BOOST_CHECK_EQUAL(dp2, (char*)0); - cout << "ok" << endl; -} - -// There is a long version of this test in _ut_long_data_src.cpp -QPID_AUTO_TEST_CASE(xid_data_xid) -{ - const std::size_t num = 64; - cout << test_filename << ".xid_data_xid: " << flush; - BOOST_CHECK_EQUAL(data_src::get_xid(1), "0"); - BOOST_CHECK_EQUAL(data_src::get_xid(2), "01"); - BOOST_CHECK_EQUAL(data_src::get_xid(3), "002"); - BOOST_CHECK_EQUAL(data_src::get_xid(4), "0003"); - BOOST_CHECK_EQUAL(data_src::get_xid(5), "00004"); - BOOST_CHECK_EQUAL(data_src::get_xid(6), "000005"); - BOOST_CHECK_EQUAL(data_src::get_xid(7), "0000006"); - BOOST_CHECK_EQUAL(data_src::get_xid(8), "00000007"); - BOOST_CHECK_EQUAL(data_src::get_xid(9), "xid:00008"); - BOOST_CHECK_EQUAL(data_src::get_xid(10), "xid:000009"); - BOOST_CHECK_EQUAL(data_src::get_xid(11), "xid:0000010"); - BOOST_CHECK_EQUAL(data_src::get_xid(12), "xid:00000011"); - BOOST_CHECK_EQUAL(data_src::get_xid(13), "xid:00000012:"); - BOOST_CHECK_EQUAL(data_src::get_xid(14), "xid:00000013:n"); - BOOST_CHECK_EQUAL(data_src::get_xid(15), "xid:00000014:no"); - std::size_t i = 15; - for (; i<num; i++) - { - string xid(data_src::get_xid(i)); - - ostringstream oss; - oss << setfill('0') << "xid:" << setw(8) << i << ":"; - - BOOST_CHECK_EQUAL(xid.size(), i); - BOOST_CHECK_EQUAL(xid.substr(0, 13), oss.str()); - BOOST_CHECK_EQUAL(xid[13], 'n'); - BOOST_CHECK_EQUAL(xid[i-1], (char)('a' + ((i-1)%26))); - } - for (std::size_t j=data_src::max_xsize-num; j<data_src::max_xsize; j++,i++) - { - string xid(data_src::get_xid(j)); - - ostringstream oss; - oss << setfill('0') << "xid:" << setw(8) << i << ":"; - - BOOST_CHECK_EQUAL(xid.size(), j); - BOOST_CHECK_EQUAL(xid.substr(0, 13), oss.str()); - BOOST_CHECK_EQUAL(xid[13], 'n'); - BOOST_CHECK_EQUAL(xid[j-1], (char)('a' + ((j-1)%26))); - } - cout << "ok" << endl; -} - -#else -/* - * ============================================== - * LONG TESTS - * This section contains long tests and soak tests, - * and are run using target check-long (ie "make - * check-long"). These are built when LONG_TEST is - * defined. - * ============================================== - */ - -/* - * To reproduce a specific test, comment out the get_seed() statement and uncomment the literal below, adjusting the seed - * value to that required. - */ -QPID_AUTO_TEST_CASE(xid_data_xid) -{ - const long seed = get_seed(); - // const long seed = 0x2d9b69d32; - ::srand48(seed); - - const std::size_t num = 1024; - cout << test_filename << ".xid_data_xid seed=0x" << std::hex << seed << std::dec << ": " << flush; - BOOST_CHECK_EQUAL(data_src::get_xid(1), "0"); - BOOST_CHECK_EQUAL(data_src::get_xid(2), "01"); - BOOST_CHECK_EQUAL(data_src::get_xid(3), "002"); - BOOST_CHECK_EQUAL(data_src::get_xid(4), "0003"); - BOOST_CHECK_EQUAL(data_src::get_xid(5), "00004"); - BOOST_CHECK_EQUAL(data_src::get_xid(6), "000005"); - BOOST_CHECK_EQUAL(data_src::get_xid(7), "0000006"); - BOOST_CHECK_EQUAL(data_src::get_xid(8), "00000007"); - BOOST_CHECK_EQUAL(data_src::get_xid(9), "xid:00008"); - BOOST_CHECK_EQUAL(data_src::get_xid(10), "xid:000009"); - BOOST_CHECK_EQUAL(data_src::get_xid(11), "xid:0000010"); - BOOST_CHECK_EQUAL(data_src::get_xid(12), "xid:00000011"); - BOOST_CHECK_EQUAL(data_src::get_xid(13), "xid:00000012:"); - BOOST_CHECK_EQUAL(data_src::get_xid(14), "xid:00000013:n"); - BOOST_CHECK_EQUAL(data_src::get_xid(15), "xid:00000014:no"); - std::size_t i = 15; - for (; i<num; i++) - { - string xid(data_src::get_xid(i)); - - ostringstream oss; - oss << setfill('0') << "xid:" << setw(8) << i << ":"; - - BOOST_CHECK_EQUAL(xid.size(), i); - BOOST_CHECK_EQUAL(xid.substr(0, 13), oss.str()); - BOOST_CHECK_EQUAL(xid[13], 'n'); - BOOST_CHECK_EQUAL(xid[i-1], (char)('a' + ((i-1)%26))); - } - for (std::size_t j=data_src::max_xsize-num; j<data_src::max_xsize; j++,i++) - { - string xid(data_src::get_xid(j)); - - ostringstream oss; - oss << setfill('0') << "xid:" << setw(8) << i << ":"; - - BOOST_CHECK_EQUAL(xid.size(), j); - BOOST_CHECK_EQUAL(xid.substr(0, 13), oss.str()); - BOOST_CHECK_EQUAL(xid[13], 'n'); - BOOST_CHECK_EQUAL(xid[j-1], (char)('a' + ((j-1)%26))); - } - std::srand(seed); - for (int cnt=0; cnt<1000; cnt++,i++) - { - std::size_t k = 1 + ::lrand48() % (data_src::max_xsize - 1); - string xid(data_src::get_xid(k)); - - ostringstream oss; - oss << setfill('0') << "xid:" << setw(8) << i << ":"; - - BOOST_CHECK_EQUAL(xid.size(), k); - BOOST_CHECK_EQUAL(xid.substr(0, 13), oss.str()); - BOOST_CHECK_EQUAL(xid[13], 'n'); - BOOST_CHECK_EQUAL(xid[k-1], (char)('a' + ((k-1)%26))); - } - cout << "ok" << endl; -} - -#endif - -QPID_AUTO_TEST_SUITE_END() diff --git a/qpid/cpp/src/tests/legacystore/jrnl/jtt/_ut_jrnl_init_params.cpp b/qpid/cpp/src/tests/legacystore/jrnl/jtt/_ut_jrnl_init_params.cpp deleted file mode 100644 index 9fefe25105..0000000000 --- a/qpid/cpp/src/tests/legacystore/jrnl/jtt/_ut_jrnl_init_params.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 "../../unit_test.h" -#include "jrnl_init_params.h" -#include <iostream> - -using namespace boost::unit_test; -using namespace mrg::jtt; -using namespace std; - -QPID_AUTO_TEST_SUITE(jtt_jrnl_init_params) - -const string test_filename("_ut_jrnl_init_params"); - -QPID_AUTO_TEST_CASE(constructor) -{ - cout << test_filename << ".constructor: " << flush; - const string jid = "jid"; - const string jdir = "jdir"; - const string bfn = "base filename"; - const u_int16_t num_jfiles = 123; - const bool ae = false; - const u_int16_t ae_max_jfiles = 456; - const u_int32_t jfsize_sblks = 789; - jrnl_init_params jip(jid, jdir, bfn, num_jfiles, ae, ae_max_jfiles, jfsize_sblks); - BOOST_CHECK_EQUAL(jip.jid(), jid); - BOOST_CHECK_EQUAL(jip.jdir(), jdir); - BOOST_CHECK_EQUAL(jip.base_filename(), bfn); - BOOST_CHECK_EQUAL(jip.num_jfiles(), num_jfiles); - BOOST_CHECK_EQUAL(jip.is_ae(), ae); - BOOST_CHECK_EQUAL(jip.ae_max_jfiles(), ae_max_jfiles); - BOOST_CHECK_EQUAL(jip.jfsize_sblks(), jfsize_sblks); - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(copy_constructor_1) -{ - cout << test_filename << ".copy_constructor_1: " << flush; - const string jid = "jid"; - const string jdir = "jdir"; - const string bfn = "base filename"; - const u_int16_t num_jfiles = 123; - const bool ae = false; - const u_int16_t ae_max_jfiles = 456; - const u_int32_t jfsize_sblks = 789; - jrnl_init_params jip1(jid, jdir, bfn, num_jfiles, ae, ae_max_jfiles, jfsize_sblks); - jrnl_init_params jip2(jip1); - BOOST_CHECK_EQUAL(jip2.jid(), jid); - BOOST_CHECK_EQUAL(jip2.jdir(), jdir); - BOOST_CHECK_EQUAL(jip2.base_filename(), bfn); - BOOST_CHECK_EQUAL(jip2.num_jfiles(), num_jfiles); - BOOST_CHECK_EQUAL(jip2.is_ae(), ae); - BOOST_CHECK_EQUAL(jip2.ae_max_jfiles(), ae_max_jfiles); - BOOST_CHECK_EQUAL(jip2.jfsize_sblks(), jfsize_sblks); - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(copy_constructor_2) -{ - cout << test_filename << ".copy_constructor_2: " << flush; - const string jid = "jid"; - const string jdir = "jdir"; - const string bfn = "base filename"; - const u_int16_t num_jfiles = 123; - const bool ae = false; - const u_int16_t ae_max_jfiles = 456; - const u_int32_t jfsize_sblks = 789; - jrnl_init_params::shared_ptr p(new jrnl_init_params(jid, jdir, bfn, num_jfiles, ae, ae_max_jfiles, jfsize_sblks)); - jrnl_init_params jip2(p.get()); - BOOST_CHECK_EQUAL(jip2.jid(), jid); - BOOST_CHECK_EQUAL(jip2.jdir(), jdir); - BOOST_CHECK_EQUAL(jip2.base_filename(), bfn); - BOOST_CHECK_EQUAL(jip2.num_jfiles(), num_jfiles); - BOOST_CHECK_EQUAL(jip2.is_ae(), ae); - BOOST_CHECK_EQUAL(jip2.ae_max_jfiles(), ae_max_jfiles); - BOOST_CHECK_EQUAL(jip2.jfsize_sblks(), jfsize_sblks); - cout << "ok" << endl; -} - -QPID_AUTO_TEST_SUITE_END() - diff --git a/qpid/cpp/src/tests/legacystore/jrnl/jtt/_ut_jrnl_instance.cpp b/qpid/cpp/src/tests/legacystore/jrnl/jtt/_ut_jrnl_instance.cpp deleted file mode 100644 index 12f1c542d6..0000000000 --- a/qpid/cpp/src/tests/legacystore/jrnl/jtt/_ut_jrnl_instance.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. - * - */ - -#include "../../unit_test.h" - -#include <iostream> -#include "jrnl_init_params.h" -#include "jrnl_instance.h" -#include "qpid/legacystore/jrnl/jdir.h" -#include "qpid/legacystore/jrnl/jerrno.h" - -using namespace boost::unit_test; -using namespace mrg::journal; -using namespace mrg::jtt; -using namespace std; - -QPID_AUTO_TEST_SUITE(jtt_jrnl_instance) - -const string test_filename("_ut_jrnl_instance"); -const char* tdp = getenv("TMP_DATA_DIR"); -const string test_dir(tdp && strlen(tdp) > 0 ? tdp : "/var/tmp/JttTest"); - -QPID_AUTO_TEST_CASE(constructor_1) -{ - cout << test_filename << ".constructor_1: " << flush; - const string jid = "jid1"; - const string jdir = test_dir + "/test1"; - const string bfn = "test"; - const u_int16_t num_jfiles = 20; - const bool ae = false; - const u_int16_t ae_max_jfiles = 45; - const u_int32_t jfsize_sblks = 128; - - args a("a1"); - using mrg::jtt::test_case; - test_case::shared_ptr p(new test_case(1, 0, 0, 0, false, 0, 0, test_case::JTT_PERSISTNET, test_case::JDL_INTERNAL, - "t1")); - jrnl_instance ji(jid, jdir, bfn, num_jfiles, ae, ae_max_jfiles, jfsize_sblks); - ji.init_tc(p, &a); - ji.run_tc(); - ji.tc_wait_compl(); - try { jdir::verify_dir(jdir, bfn); } - catch (const jexception& e) { BOOST_ERROR(e.what()); } - jdir::delete_dir(jdir); - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(constructor_2) -{ - cout << test_filename << ".constructor_2: " << flush; - const string jid = "jid2"; - const string jdir = test_dir + "/test2"; - const string bfn = "test"; - const u_int16_t num_jfiles = 20; - const bool ae = false; - const u_int16_t ae_max_jfiles = 45; - const u_int32_t jfsize_sblks = 128; - - args a("a2"); - using mrg::jtt::test_case; - test_case::shared_ptr p(new test_case(2, 0, 0, 0, false, 0, 0, test_case::JTT_PERSISTNET, test_case::JDL_INTERNAL, - "t2")); - jrnl_init_params::shared_ptr jpp(new jrnl_init_params(jid, jdir, bfn, num_jfiles, ae, ae_max_jfiles, jfsize_sblks)); - jrnl_instance ji(jpp); - ji.init_tc(p, &a); - ji.run_tc(); - ji.tc_wait_compl(); - try { jdir::verify_dir(jdir, bfn); } - catch (const jexception& e) { BOOST_ERROR(e.what()); } - jdir::delete_dir(jdir); - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(constructor_3) -{ - cout << test_filename << ".constructor_3: " << flush; - const string jid = "jid3"; - const string jdir = test_dir + "/test3"; - const string bfn = "test"; - const u_int16_t num_jfiles = 20; - const bool ae = false; - const u_int16_t ae_max_jfiles = 45; - const u_int32_t jfsize_sblks = 128; - - args a("a3"); - using mrg::jtt::test_case; - test_case::shared_ptr p(new test_case(3, 0, 0, 0, false, 0, 0, test_case::JTT_PERSISTNET, test_case::JDL_INTERNAL, - "t3")); - jrnl_init_params::shared_ptr jpp(new jrnl_init_params(jid, jdir, bfn, num_jfiles, ae, ae_max_jfiles, jfsize_sblks)); - jrnl_instance ji(jpp); - ji.init_tc(p, &a); - ji.run_tc(); - ji.tc_wait_compl(); - try { jdir::verify_dir(jdir, bfn); } - catch (const jexception& e) { BOOST_ERROR(e.what()); } - jdir::delete_dir(jdir); - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(recover) -{ - cout << test_filename << ".recover: " << flush; - const string jid = "jid5"; - const string jdir = test_dir + "/test5"; - const string bfn = "test"; - const u_int16_t num_jfiles = 20; - const bool ae = false; - const u_int16_t ae_max_jfiles = 0; - const u_int32_t jfsize_sblks = 128; - - args a("a4"); - using mrg::jtt::test_case; - test_case::shared_ptr p(new test_case(5, 0, 0, 0, false, 0, 0, test_case::JTT_PERSISTNET, test_case::JDL_INTERNAL, - "t5")); - jrnl_init_params::shared_ptr jpp(new jrnl_init_params(jid, jdir, bfn, num_jfiles, ae, ae_max_jfiles, jfsize_sblks)); - jrnl_instance ji(jpp); - ji.init_tc(p, &a); - ji.run_tc(); - ji.tc_wait_compl(); - try { jdir::verify_dir(jdir, bfn); } - catch (const jexception& e) { BOOST_ERROR(e.what()); } - a.recover_mode = true; - ji.init_tc(p, &a); - ji.run_tc(); - ji.tc_wait_compl(); - try { jdir::verify_dir(jdir, bfn); } - catch (const jexception& e) { BOOST_ERROR(e.what()); } - jdir::delete_dir(jdir); - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(recover_no_files) -{ - cout << test_filename << ".recover_no_files: " << flush; - const string jid = "jid6"; - const string jdir = test_dir + "/test6"; - const string bfn = "test"; - const u_int16_t num_jfiles = 20; - const bool ae = false; - const u_int16_t ae_max_jfiles = 0; - const u_int32_t jfsize_sblks = 128; - - args a("a5"); - a.recover_mode = true; - using mrg::jtt::test_case; - test_case::shared_ptr p(new test_case(6, 0, 0, 0, false, 0, 0, test_case::JTT_PERSISTNET, test_case::JDL_INTERNAL, - "t6")); - jrnl_init_params::shared_ptr jpp(new jrnl_init_params(jid, jdir, bfn, num_jfiles, ae, ae_max_jfiles, jfsize_sblks)); - jrnl_instance ji(jpp); - ji.init_tc(p, &a); - ji.run_tc(); - ji.tc_wait_compl(); - try { jdir::verify_dir(jdir, bfn); } - catch (const jexception& e) { BOOST_ERROR(e.what()); } - jdir::delete_dir(jdir); - cout << "ok" << endl; -} - -QPID_AUTO_TEST_SUITE_END() - diff --git a/qpid/cpp/src/tests/legacystore/jrnl/jtt/_ut_read_arg.cpp b/qpid/cpp/src/tests/legacystore/jrnl/jtt/_ut_read_arg.cpp deleted file mode 100644 index 0d2025270d..0000000000 --- a/qpid/cpp/src/tests/legacystore/jrnl/jtt/_ut_read_arg.cpp +++ /dev/null @@ -1,146 +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 <boost/test/unit_test_log.hpp> -#include "read_arg.h" -#include <iostream> - -#include <boost/program_options.hpp> -namespace po = boost::program_options; -using namespace mrg::jtt; -using namespace boost::unit_test; -using namespace std; - -QPID_AUTO_TEST_SUITE(jtt_read_arg) - -const string test_filename("_ut_read_arg"); - -QPID_AUTO_TEST_CASE(constructor) -{ - cout << test_filename << ".constructor: " << flush; - read_arg ra1; - BOOST_CHECK_EQUAL(ra1.val(), read_arg::NONE); - BOOST_CHECK_EQUAL(ra1.str(), "NONE"); - read_arg ra2(read_arg::NONE); - BOOST_CHECK_EQUAL(ra2.val(), read_arg::NONE); - BOOST_CHECK_EQUAL(ra2.str(), "NONE"); - read_arg ra3(read_arg::ALL); - BOOST_CHECK_EQUAL(ra3.val(), read_arg::ALL); - BOOST_CHECK_EQUAL(ra3.str(), "ALL"); - read_arg ra4(read_arg::RANDOM); - BOOST_CHECK_EQUAL(ra4.val(), read_arg::RANDOM); - BOOST_CHECK_EQUAL(ra4.str(), "RANDOM"); - read_arg ra5(read_arg::LAZYLOAD); - BOOST_CHECK_EQUAL(ra5.val(), read_arg::LAZYLOAD); - BOOST_CHECK_EQUAL(ra5.str(), "LAZYLOAD"); - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(set_val) -{ - cout << test_filename << ".set_val: " << flush; - read_arg ra; - BOOST_CHECK_EQUAL(ra.val(), read_arg::NONE); - BOOST_CHECK_EQUAL(ra.str(), "NONE"); - ra.set_val(read_arg::ALL); - BOOST_CHECK_EQUAL(ra.val(), read_arg::ALL); - BOOST_CHECK_EQUAL(ra.str(), "ALL"); - ra.set_val(read_arg::RANDOM); - BOOST_CHECK_EQUAL(ra.val(), read_arg::RANDOM); - BOOST_CHECK_EQUAL(ra.str(), "RANDOM"); - ra.set_val(read_arg::LAZYLOAD); - BOOST_CHECK_EQUAL(ra.val(), read_arg::LAZYLOAD); - BOOST_CHECK_EQUAL(ra.str(), "LAZYLOAD"); - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(parse) -{ - cout << test_filename << ".parse: " << flush; - read_arg ra; - ra.parse("LAZYLOAD"); - BOOST_CHECK_EQUAL(ra.val(), read_arg::LAZYLOAD); - BOOST_CHECK_EQUAL(ra.str(), "LAZYLOAD"); - ra.parse("ALL"); - BOOST_CHECK_EQUAL(ra.val(), read_arg::ALL); - BOOST_CHECK_EQUAL(ra.str(), "ALL"); - BOOST_CHECK_THROW(ra.parse(""), po::invalid_option_value) - BOOST_CHECK_EQUAL(ra.val(), read_arg::ALL); - BOOST_CHECK_EQUAL(ra.str(), "ALL"); - BOOST_CHECK_THROW(ra.parse("abc123"), po::invalid_option_value) - BOOST_CHECK_EQUAL(ra.val(), read_arg::ALL); - BOOST_CHECK_EQUAL(ra.str(), "ALL"); - ra.parse("NONE"); - BOOST_CHECK_EQUAL(ra.val(), read_arg::NONE); - BOOST_CHECK_EQUAL(ra.str(), "NONE"); - ra.parse("RANDOM"); - BOOST_CHECK_EQUAL(ra.val(), read_arg::RANDOM); - BOOST_CHECK_EQUAL(ra.str(), "RANDOM"); - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(istream_) -{ - cout << test_filename << ".istream_: " << flush; - read_arg ra; - istringstream ss1("LAZYLOAD", ios::in); - ss1 >> ra; - BOOST_CHECK_EQUAL(ra.val(), read_arg::LAZYLOAD); - BOOST_CHECK_EQUAL(ra.str(), "LAZYLOAD"); - istringstream ss2("ALL", ios::in); - ss2 >> ra; - BOOST_CHECK_EQUAL(ra.val(), read_arg::ALL); - BOOST_CHECK_EQUAL(ra.str(), "ALL"); - istringstream ss3("NONE", ios::in); - ss3 >> ra; - BOOST_CHECK_EQUAL(ra.val(), read_arg::NONE); - BOOST_CHECK_EQUAL(ra.str(), "NONE"); - istringstream ss4("RANDOM", ios::in); - ss4 >> ra; - BOOST_CHECK_EQUAL(ra.val(), read_arg::RANDOM); - BOOST_CHECK_EQUAL(ra.str(), "RANDOM"); - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(ostream_) -{ - cout << test_filename << ".ostream_: " << flush; - ostringstream s1; - read_arg ra(read_arg::LAZYLOAD); - s1 << ra; - BOOST_CHECK_EQUAL(s1.str(), "LAZYLOAD"); - ra.set_val(read_arg::ALL); - ostringstream s2; - s2 << ra; - BOOST_CHECK_EQUAL(s2.str(), "ALL"); - ra.set_val(read_arg::NONE); - ostringstream s3; - s3 << ra; - BOOST_CHECK_EQUAL(s3.str(), "NONE"); - ra.set_val(read_arg::RANDOM); - ostringstream s4; - s4 << ra; - BOOST_CHECK_EQUAL(s4.str(), "RANDOM"); - cout << "ok" << endl; -} - -QPID_AUTO_TEST_SUITE_END() diff --git a/qpid/cpp/src/tests/legacystore/jrnl/jtt/_ut_test_case.cpp b/qpid/cpp/src/tests/legacystore/jrnl/jtt/_ut_test_case.cpp deleted file mode 100644 index 3a7d0f951c..0000000000 --- a/qpid/cpp/src/tests/legacystore/jrnl/jtt/_ut_test_case.cpp +++ /dev/null @@ -1,113 +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 <cstddef> -#include <iomanip> -#include <iostream> -#include "test_case.h" -#include "test_case_result.h" - -using namespace boost::unit_test; -using namespace mrg::jtt; -using namespace std; - -QPID_AUTO_TEST_SUITE(jtt_test_case) - -const string test_filename("_ut_test_case"); - -QPID_AUTO_TEST_CASE(constructor) -{ - cout << test_filename << ".constructor: " << flush; - const unsigned test_case_num = 0x12345; - const u_int32_t num_msgs = 0x100; - const std::size_t min_data_size = 0x1000; - const std::size_t max_data_size = 0; - const bool auto_deq = true; - const std::size_t min_xid_size = 0x200; - const std::size_t max_xid_size = 0x200; - using mrg::jtt::test_case; - const test_case::transient_t transient = test_case::JTT_PERSISTNET; - const test_case::external_t external = test_case::JDL_INTERNAL; - const string comment = "This is a test"; - - test_case tc(test_case_num, num_msgs, min_data_size, max_data_size, auto_deq, - min_xid_size, max_xid_size, transient, external, comment); - BOOST_CHECK_EQUAL(tc.test_case_num(), test_case_num); - BOOST_CHECK_EQUAL(tc.num_msgs(), num_msgs); - BOOST_CHECK_EQUAL(tc.min_data_size(), min_data_size); - BOOST_CHECK_EQUAL(tc.max_data_size(), max_data_size); - BOOST_CHECK_EQUAL(tc.auto_deq(), auto_deq); - BOOST_CHECK_EQUAL(tc.min_xid_size(), min_xid_size); - BOOST_CHECK_EQUAL(tc.max_xid_size(), max_xid_size); - BOOST_CHECK_EQUAL(tc.transient(), transient); - BOOST_CHECK_EQUAL(tc.external(), external); - BOOST_CHECK_EQUAL(tc.comment(), comment); - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(results) -{ - cout << test_filename << ".results: " << flush; - const unsigned test_case_num = 0x12345; - const u_int32_t num_msgs = 0x100; - const std::size_t min_data_size = 0x1000; - const std::size_t max_data_size = 0; - const bool auto_deq = true; - const std::size_t min_xid_size = 0x200; - const std::size_t max_xid_size = 0x200; - using mrg::jtt::test_case; - const test_case::transient_t transient = test_case::JTT_PERSISTNET; - const test_case::external_t external = test_case::JDL_INTERNAL; - const string comment = "This is a test"; - const unsigned num_results = 20; - - test_case tc(test_case_num, num_msgs, min_data_size, max_data_size, auto_deq, - min_xid_size, max_xid_size, transient, external, comment); - for (unsigned i=0; i<num_results; i++) - { - ostringstream oss; - oss << "JID_" << setfill('0') << setw(2) << i; - test_case_result::shared_ptr p(new test_case_result(oss.str())); - tc.add_result(p); - } - BOOST_CHECK_EQUAL(tc.num_results(), num_results); - test_case_result_agregation ave = tc.average(); - unsigned i=0; - for (test_case_result_agregation::tcrp_list_citr j=ave.rlist_begin(); j!=ave.rlist_end(); - i++,j++) - { - ostringstream oss; - oss << "JID_" << setfill('0') << setw(2) << i; - BOOST_CHECK_EQUAL((*j)->jid(), oss.str()); - } - for (unsigned i=0; i<num_results; i++) - { - ostringstream oss; - oss << "JID_" << setfill('0') << setw(2) << i; - BOOST_CHECK_EQUAL(ave[i]->jid(), oss.str()); - } - tc.clear(); - BOOST_CHECK_EQUAL(tc.num_results(), unsigned(0)); - cout << "ok" << endl; -} - -QPID_AUTO_TEST_SUITE_END() diff --git a/qpid/cpp/src/tests/legacystore/jrnl/jtt/_ut_test_case_result.cpp b/qpid/cpp/src/tests/legacystore/jrnl/jtt/_ut_test_case_result.cpp deleted file mode 100644 index dd83dbee69..0000000000 --- a/qpid/cpp/src/tests/legacystore/jrnl/jtt/_ut_test_case_result.cpp +++ /dev/null @@ -1,206 +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/legacystore/jrnl/jexception.h" -#include "test_case_result.h" - -using namespace boost::unit_test; -using namespace mrg::journal; -using namespace mrg::jtt; -using namespace std; - -QPID_AUTO_TEST_SUITE(jtt_test_case_result) - -const string test_filename("_ut_test_case_result"); - -QPID_AUTO_TEST_CASE(constructor) -{ - cout << test_filename << ".constructor: " << flush; - const string jid("journal id 1"); - test_case_result tcr(jid); - BOOST_CHECK_EQUAL(tcr.jid(), jid); - BOOST_CHECK_EQUAL(tcr.exception(), false); - BOOST_CHECK_EQUAL(tcr.exception_count(), 0U); - const time_ns& ts1 = tcr.start_time(); - BOOST_CHECK(ts1.is_zero()); - const time_ns& ts2 = tcr.stop_time(); - BOOST_CHECK(ts2.is_zero()); - const time_ns& ts3 = tcr.test_time(); - BOOST_CHECK(ts3.is_zero()); - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(start_stop) -{ - cout << test_filename << ".start_stop: " << flush; - const string jid("journal id 2"); - test_case_result tcr(jid); - BOOST_CHECK_EQUAL(tcr.exception(), false); - BOOST_CHECK_EQUAL(tcr.exception_count(), 0U); - const time_ns& ts1 = tcr.start_time(); - BOOST_CHECK(ts1.is_zero()); - const time_ns& ts2 = tcr.stop_time(); - BOOST_CHECK(ts2.is_zero()); - const time_ns& ts3 = tcr.test_time(); - BOOST_CHECK(ts3.is_zero()); - - tcr.set_start_time(); - BOOST_CHECK_EQUAL(tcr.exception(), false); - BOOST_CHECK_EQUAL(tcr.exception_count(), 0U); - const time_ns& ts4 = tcr.start_time(); - BOOST_CHECK(!ts4.is_zero()); - const time_ns& ts5 = tcr.stop_time(); - BOOST_CHECK(ts5.is_zero()); - const time_ns& ts6 = tcr.test_time(); - BOOST_CHECK(ts6.is_zero()); - - ::usleep(1100000); // 1.1 sec in microseconds - tcr.set_stop_time(); - BOOST_CHECK_EQUAL(tcr.exception(), false); - BOOST_CHECK_EQUAL(tcr.exception_count(), 0U); - const time_ns& ts7 = tcr.stop_time(); - BOOST_CHECK(!ts7.is_zero()); - const time_ns& ts8 = tcr.test_time(); - BOOST_CHECK(ts8.tv_sec == 1); - BOOST_CHECK(ts8.tv_nsec > 100000000); // 0.1 sec in nanoseconds - BOOST_CHECK(ts8.tv_nsec < 200000000); // 0.2 sec in nanoseconds - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(start_exception_stop_1) -{ - cout << test_filename << ".start_exception_stop_1: " << flush; - const string jid("journal id 3"); - test_case_result tcr(jid); - const u_int32_t err_code = 0x321; - const string err_msg = "exception message"; - const jexception e(err_code, err_msg); - tcr.set_start_time(); - ::usleep(1100000); // 1.1 sec in microseconds - tcr.add_exception(e); - BOOST_CHECK_EQUAL(tcr.exception(), true); - BOOST_CHECK_EQUAL(tcr.exception_count(), 1U); - BOOST_CHECK_EQUAL(tcr[0], e.what()); - const time_ns& ts1 = tcr.stop_time(); - BOOST_CHECK(!ts1.is_zero()); - const time_ns& ts2 = tcr.test_time(); - BOOST_CHECK(ts2.tv_sec == 1); - BOOST_CHECK(ts2.tv_nsec > 100000000); // 0.1 sec in nanoseconds - BOOST_CHECK(ts2.tv_nsec < 200000000); // 0.2 sec in nanoseconds - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(start_exception_stop_2) -{ - cout << test_filename << ".start_exception_stop_2: " << flush; - const string jid("journal id 4"); - test_case_result tcr(jid); - const string err_msg = "exception message"; - tcr.set_start_time(); - ::usleep(1100000); // 1.1 sec in microseconds - tcr.add_exception(err_msg); - BOOST_CHECK_EQUAL(tcr.exception(), true); - BOOST_CHECK_EQUAL(tcr.exception_count(), 1U); - BOOST_CHECK_EQUAL(tcr[0], err_msg); - const time_ns& ts1 = tcr.stop_time(); - BOOST_CHECK(!ts1.is_zero()); - const time_ns& ts2 = tcr.test_time(); - BOOST_CHECK(ts2.tv_sec == 1); - BOOST_CHECK(ts2.tv_nsec > 100000000); // 0.1 sec in nanoseconds - BOOST_CHECK(ts2.tv_nsec < 200000000); // 0.2 sec in nanoseconds - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(start_exception_stop_3) -{ - cout << test_filename << ".start_exception_stop_3: " << flush; - const string jid("journal id 5"); - test_case_result tcr(jid); - const char* err_msg = "exception message"; - tcr.set_start_time(); - ::usleep(1100000); // 1.1 sec in microseconds - tcr.add_exception(err_msg); - BOOST_CHECK_EQUAL(tcr.exception(), true); - BOOST_CHECK_EQUAL(tcr.exception_count(), 1U); - BOOST_CHECK_EQUAL(tcr[0], err_msg); - const time_ns& ts1 = tcr.stop_time(); - BOOST_CHECK(!ts1.is_zero()); - const time_ns& ts2 = tcr.test_time(); - BOOST_CHECK(ts2.tv_sec == 1); - BOOST_CHECK(ts2.tv_nsec > 100000000); // 0.1 sec in nanoseconds - BOOST_CHECK(ts2.tv_nsec < 200000000); // 0.2 sec in nanoseconds - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(start_exception) -{ - cout << test_filename << ".start_exception: " << flush; - const string jid("journal id 6"); - test_case_result tcr(jid); - u_int32_t err_code = 0x654; - const string err_msg = "exception message"; - const jexception e(err_code, err_msg); - tcr.set_start_time(); - ::usleep(1100000); // 1.1 sec in microseconds - tcr.add_exception(e, false); - BOOST_CHECK_EQUAL(tcr.exception(), true); - BOOST_CHECK_EQUAL(tcr.exception_count(), 1U); - BOOST_CHECK_EQUAL(tcr[0], e.what()); - const time_ns& ts1 = tcr.stop_time(); - BOOST_CHECK(ts1.is_zero()); - const time_ns& ts2 = tcr.test_time(); - BOOST_CHECK(ts2.is_zero()); - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(counters) -{ - cout << test_filename << ".counters: " << flush; - const u_int32_t num_enq = 125; - const u_int32_t num_deq = 64; - const u_int32_t num_read = 22; - const string jid("journal id 7"); - test_case_result tcr(jid); - BOOST_CHECK_EQUAL(tcr.num_enq(), u_int32_t(0)); - BOOST_CHECK_EQUAL(tcr.num_deq(), u_int32_t(0)); - BOOST_CHECK_EQUAL(tcr.num_read(), u_int32_t(0)); - for (unsigned i=0; i<num_enq; i++) - tcr.incr_num_enq(); - BOOST_CHECK_EQUAL(tcr.num_enq(), num_enq); - BOOST_CHECK_EQUAL(tcr.num_deq(), u_int32_t(0)); - BOOST_CHECK_EQUAL(tcr.num_read(), u_int32_t(0)); - for (unsigned j=0; j<num_deq; j++) - tcr.incr_num_deq(); - BOOST_CHECK_EQUAL(tcr.num_enq(), num_enq); - BOOST_CHECK_EQUAL(tcr.num_deq(), num_deq); - BOOST_CHECK_EQUAL(tcr.num_read(), u_int32_t(0)); - for (unsigned k=0; k<num_read; k++) - tcr.incr_num_read(); - BOOST_CHECK_EQUAL(tcr.num_enq(), num_enq); - BOOST_CHECK_EQUAL(tcr.num_deq(), num_deq); - BOOST_CHECK_EQUAL(tcr.num_read(), num_read); - cout << "ok" << endl; -} - -QPID_AUTO_TEST_SUITE_END() diff --git a/qpid/cpp/src/tests/legacystore/jrnl/jtt/_ut_test_case_result_agregation.cpp b/qpid/cpp/src/tests/legacystore/jrnl/jtt/_ut_test_case_result_agregation.cpp deleted file mode 100644 index aa01bf833d..0000000000 --- a/qpid/cpp/src/tests/legacystore/jrnl/jtt/_ut_test_case_result_agregation.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. - * - */ - -#include "../../unit_test.h" -#include <ctime> -#include <iostream> -#include "test_case_result_agregation.h" - -using namespace boost::unit_test; -using namespace mrg::journal; -using namespace mrg::jtt; -using namespace std; - -QPID_AUTO_TEST_SUITE(jtt_test_case_result_agregation) - -const string test_filename("_ut_test_case_result_agregation"); - -// === Helper functions === - -void check_agregate(const test_case_result_agregation& tcra, const u_int32_t num_enq, - const u_int32_t num_deq, const u_int32_t num_reads, const u_int32_t num_results, - const u_int32_t num_exceptions, const std::time_t secs, const long nsec) -{ - BOOST_CHECK_EQUAL(tcra.num_enq(), num_enq); - BOOST_CHECK_EQUAL(tcra.num_deq(), num_deq); - BOOST_CHECK_EQUAL(tcra.num_read(), num_reads); - BOOST_CHECK_EQUAL(tcra.num_results(), num_results); - BOOST_CHECK_EQUAL(tcra.exception_count(), num_exceptions); - BOOST_CHECK_EQUAL(tcra.exception(), num_exceptions > 0); - const time_ns& ts1 = tcra.test_time(); - BOOST_CHECK_EQUAL(ts1.tv_sec, secs); - BOOST_CHECK_EQUAL(ts1.tv_nsec, nsec); -} - -test_case_result::shared_ptr make_result(const string& jid, const u_int32_t num_enq, - const u_int32_t num_deq, const u_int32_t num_reads, const std::time_t secs, const long nsec) -{ - test_case_result::shared_ptr tcrp(new test_case_result(jid)); - for (unsigned i=0; i<num_enq; i++) - tcrp->incr_num_enq(); - for (unsigned i=0; i<num_deq; i++) - tcrp->incr_num_deq(); - for (unsigned i=0; i<num_reads; i++) - tcrp->incr_num_read(); - time_ns ts(secs, nsec); - tcrp->set_test_time(ts); - return tcrp; -} - -// === Test suite === - -QPID_AUTO_TEST_CASE(constructor_1) -{ - cout << test_filename << ".constructor_1: " << flush; - test_case_result_agregation tcra; - BOOST_CHECK_EQUAL(tcra.tc_average_mode(), true); - BOOST_CHECK_EQUAL(tcra.jid(), "Average"); - BOOST_CHECK_EQUAL(tcra.exception(), false); - BOOST_CHECK_EQUAL(tcra.exception_count(), 0U); - const time_ns& ts1 = tcra.start_time(); - BOOST_CHECK(ts1.is_zero()); - const time_ns& ts2 = tcra.stop_time(); - BOOST_CHECK(ts2.is_zero()); - const time_ns& ts3 = tcra.test_time(); - BOOST_CHECK(ts3.is_zero()); - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(constructor_2) -{ - cout << test_filename << ".constructor_2: " << flush; - string jid("journal id"); - test_case_result_agregation tcra(jid); - BOOST_CHECK_EQUAL(tcra.tc_average_mode(), false); - BOOST_CHECK_EQUAL(tcra.jid(), jid); - BOOST_CHECK_EQUAL(tcra.exception(), false); - BOOST_CHECK_EQUAL(tcra.exception_count(), 0U); - const time_ns& ts1 = tcra.start_time(); - BOOST_CHECK(ts1.is_zero()); - const time_ns& ts2 = tcra.stop_time(); - BOOST_CHECK(ts2.is_zero()); - const time_ns& ts3 = tcra.test_time(); - BOOST_CHECK(ts3.is_zero()); - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(add_test_case) -{ - cout << test_filename << ".add_test_case: " << flush; - string jid("jid1"); - test_case_result::shared_ptr tcrp1 = make_result("jid1", 10, 10, 0, 1, 101010101L); - test_case_result::shared_ptr tcrp2 = make_result("jid1", 25, 0, 35, 10, 20202020L); - test_case_result::shared_ptr tcrp3 = make_result("jid1", 0, 15, 5, 2, 555555555L); - test_case_result::shared_ptr tcrp4 = make_result("jid2", 100, 100, 100, 100, 323232324L); - test_case_result::shared_ptr tcrp5 = make_result("jid1", 5, 0, 0, 0, 100L); - tcrp5->add_exception(string("error 1"), false); - test_case_result::shared_ptr tcrp6 = make_result("jid3", 0, 5, 0, 0, 100L); - jexception e(0x123, "exception 2"); - tcrp6->add_exception(e, false); - test_case_result::shared_ptr tcrp7 = make_result("jid1", 0, 0, 0, 0, 0L); - test_case_result::shared_ptr tcrp8 = make_result("jid1", 200, 100, 300, 12, 323232224L); - - test_case_result_agregation tcra(jid); - check_agregate(tcra, 0, 0, 0, 0, 0, 0, 0L); - tcra.add_test_result(tcrp1); - check_agregate(tcra, 10, 10, 0, 1, 0, 1, 101010101L); - tcra.add_test_result(tcrp2); - check_agregate(tcra, 35, 10, 35, 2, 0, 11, 121212121L); - tcra.add_test_result(tcrp3); - check_agregate(tcra, 35, 25, 40, 3, 0, 13, 676767676L); - tcra.add_test_result(tcrp4); - check_agregate(tcra, 35, 25, 40, 3, 0, 13, 676767676L); - tcra.add_test_result(tcrp5); - check_agregate(tcra, 40, 25, 40, 4, 1, 13, 676767776L); - tcra.add_test_result(tcrp6); - check_agregate(tcra, 40, 25, 40, 4, 1, 13, 676767776L); - tcra.add_test_result(tcrp7); - check_agregate(tcra, 40, 25, 40, 5, 1, 13, 676767776L); - tcra.add_test_result(tcrp8); - check_agregate(tcra, 240, 125, 340, 6, 1, 26, 0L); - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(add_test_case_average) -{ - cout << test_filename << ".add_test_case_average: " << flush; - test_case_result::shared_ptr tcrp1 = make_result("jid1", 10, 10, 0, 1, 101010101L); - test_case_result::shared_ptr tcrp2 = make_result("jid2", 25, 0, 35, 10, 20202020L); - test_case_result::shared_ptr tcrp3 = make_result("jid3", 0, 15, 5, 2, 555555555L); - test_case_result::shared_ptr tcrp4 = make_result("jid4", 100, 100, 100, 100, 323232324L); - test_case_result::shared_ptr tcrp5 = make_result("jid5", 5, 0, 0, 0, 100L); - tcrp5->add_exception(string("error 1"), false); - test_case_result::shared_ptr tcrp6 = make_result("jid6", 0, 5, 0, 0, 100L); - jexception e(0x123, "exception 2"); - tcrp6->add_exception(e, false); - test_case_result::shared_ptr tcrp7 = make_result("jid7", 0, 0, 0, 0, 0L); - test_case_result::shared_ptr tcrp8 = make_result("jid8", 200, 100, 300, 12, 222222022L); - - test_case_result_agregation tcra; - check_agregate(tcra, 0, 0, 0, 0, 0, 0, 0L); - tcra.add_test_result(tcrp1); - check_agregate(tcra, 10, 10, 0, 1, 0, 1, 101010101L); - tcra.add_test_result(tcrp2); - check_agregate(tcra, 35, 10, 35, 2, 0, 11, 121212121L); - tcra.add_test_result(tcrp3); - check_agregate(tcra, 35, 25, 40, 3, 0, 13, 676767676L); - tcra.add_test_result(tcrp4); - check_agregate(tcra, 135, 125, 140, 4, 0, 114, 0L); - tcra.add_test_result(tcrp5); - check_agregate(tcra, 140, 125, 140, 5, 1, 114, 100L); - tcra.add_test_result(tcrp6); - check_agregate(tcra, 140, 130, 140, 6, 2, 114, 200L); - tcra.add_test_result(tcrp7); - check_agregate(tcra, 140, 130, 140, 7, 2, 114, 200L); - tcra.add_test_result(tcrp8); - check_agregate(tcra, 340, 230, 440, 8, 2, 126, 222222222L); - cout << "ok" << endl; -} - -QPID_AUTO_TEST_SUITE_END() diff --git a/qpid/cpp/src/tests/legacystore/jrnl/jtt/_ut_test_case_set.cpp b/qpid/cpp/src/tests/legacystore/jrnl/jtt/_ut_test_case_set.cpp deleted file mode 100644 index adbdf6884b..0000000000 --- a/qpid/cpp/src/tests/legacystore/jrnl/jtt/_ut_test_case_set.cpp +++ /dev/null @@ -1,147 +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 <cstddef> -#include <iostream> -#include <sys/stat.h> -#include "test_case.h" -#include "test_case_set.h" - -using namespace boost::unit_test; -using namespace mrg::jtt; -using namespace std; - -QPID_AUTO_TEST_SUITE(jtt_test_case_set) - -const string csv_file("_ut_test_case_set.csv"); -const string test_filename("_ut_test_case_set"); - -// === Helper functions === - -bool check_csv_file(const char* filename) -{ - struct stat s; - if (::stat(filename, &s)) - return false; - if (S_ISREG(s.st_mode)) - return true; - return false; -} - -// === Test suite === - -QPID_AUTO_TEST_CASE(constructor) -{ - cout << test_filename << ".constructor: " << flush; - test_case_set tcs; - BOOST_CHECK(tcs.empty()); - BOOST_CHECK_EQUAL(tcs.size(), unsigned(0)); - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(append_1) -{ - cout << test_filename << ".append_1: " << flush; - const unsigned test_case_num = 0x12345; - const u_int32_t num_msgs = 0x100; - const std::size_t min_data_size = 0x1000; - const std::size_t max_data_size = 0; - const bool auto_deq = true; - const std::size_t min_xid_size = 0x200; - const std::size_t max_xid_size = 0x200; - using mrg::jtt::test_case; - const test_case::transient_t transient = test_case::JTT_PERSISTNET; - const test_case::external_t external = test_case::JDL_INTERNAL; - const string comment = "This is a test"; - - test_case_set tcs; - tcs.append(test_case_num, num_msgs, min_data_size, max_data_size, auto_deq, min_xid_size, - max_xid_size, transient, external, comment); - BOOST_CHECK(!tcs.empty()); - BOOST_CHECK_EQUAL(tcs.size(), unsigned(1)); - test_case::shared_ptr tcp = tcs[0]; - BOOST_CHECK_EQUAL(tcp->test_case_num(), test_case_num); - BOOST_CHECK_EQUAL(tcp->num_msgs(), num_msgs); - BOOST_CHECK_EQUAL(tcp->min_data_size(), min_data_size); - BOOST_CHECK_EQUAL(tcp->max_data_size(), max_data_size); - BOOST_CHECK_EQUAL(tcp->min_xid_size(), min_xid_size); - BOOST_CHECK_EQUAL(tcp->max_xid_size(), max_xid_size); - BOOST_CHECK_EQUAL(tcp->transient(), transient); - BOOST_CHECK_EQUAL(tcp->external(), external); - BOOST_CHECK_EQUAL(tcp->comment(), comment); - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(append_2) -{ - cout << test_filename << ".append_2: " << flush; - const unsigned test_case_num = 0x12345; - const u_int32_t num_msgs = 0x100; - const std::size_t min_data_size = 0x1000; - const std::size_t max_data_size = 0; - const bool auto_deq = true; - const std::size_t min_xid_size = 0x200; - const std::size_t max_xid_size = 0x200; - using mrg::jtt::test_case; - const test_case::transient_t transient = test_case::JTT_PERSISTNET; - const test_case::external_t external = test_case::JDL_INTERNAL; - const string comment = "This is a test"; - - test_case::shared_ptr tcp(new test_case(test_case_num, num_msgs, min_data_size, max_data_size, - auto_deq, min_xid_size, max_xid_size, transient, external, comment)); - test_case_set tcs; - tcs.append(tcp); - BOOST_CHECK(!tcs.empty()); - BOOST_CHECK_EQUAL(tcs.size(), unsigned(1)); - tcp = tcs[0]; - BOOST_CHECK_EQUAL(tcp->test_case_num(), test_case_num); - BOOST_CHECK_EQUAL(tcp->num_msgs(), num_msgs); - BOOST_CHECK_EQUAL(tcp->min_data_size(), min_data_size); - BOOST_CHECK_EQUAL(tcp->max_data_size(), max_data_size); - BOOST_CHECK_EQUAL(tcp->min_xid_size(), min_xid_size); - BOOST_CHECK_EQUAL(tcp->max_xid_size(), max_xid_size); - BOOST_CHECK_EQUAL(tcp->transient(), transient); - BOOST_CHECK_EQUAL(tcp->external(), external); - BOOST_CHECK_EQUAL(tcp->comment(), comment); - cout << "ok" << endl; -} - -QPID_AUTO_TEST_CASE(append_from_csv) -{ - cout << test_filename << ".append_from_csv: " << flush; - test_case_set tcs; - BOOST_REQUIRE_MESSAGE(check_csv_file(csv_file.c_str()), "Test CSV file \"" << csv_file << - "\" is missing."); - tcs.append_from_csv(csv_file, false); - BOOST_CHECK(!tcs.empty()); - BOOST_CHECK_EQUAL(tcs.size(), unsigned(44)); - BOOST_CHECK_EQUAL(tcs.ignored(), unsigned(0)); - tcs.clear(); - BOOST_CHECK(tcs.empty()); - tcs.append_from_csv(csv_file, true); - BOOST_CHECK(!tcs.empty()); - BOOST_CHECK_EQUAL(tcs.size(), unsigned(18)); - BOOST_CHECK_EQUAL(tcs.ignored(), unsigned(26)); - cout << "ok" << endl; -} - -QPID_AUTO_TEST_SUITE_END() diff --git a/qpid/cpp/src/tests/legacystore/jrnl/jtt/_ut_test_case_set.csv b/qpid/cpp/src/tests/legacystore/jrnl/jtt/_ut_test_case_set.csv deleted file mode 100644 index f886186275..0000000000 --- a/qpid/cpp/src/tests/legacystore/jrnl/jtt/_ut_test_case_set.csv +++ /dev/null @@ -1,74 +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. -# - -,,,,,,,"Msg size",,"Xid size",,,,,"enq-size",,"deq-size",,"txn-size",, -"Col. 0","1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20" -"Test #","tf","pf","amn","mn incr","#msgs","ms incr","Min","Max","Min","Max","auto-deq","transient","extern","bytes","dblks","bytes","dblks","bytes","dblks","comment" -,,,,,,,,,,,,,,,,,,,, -"Initialize only",,,,,,,,,,,,,,,,,,,, -0,"L",0,0,0,0,0,0,0,0,0,FALSE,FALSE,FALSE,44,1,0,0,0,0,"No messages - journal creation/initialization only" -,,,,,,,,,,,,,,,,,,,, -"Simple message combinations of persistent/deq transientueued/non-dequeued, transactional/non-transactional",,,,,,,,,,,,,,,,,,,, -1,"L",1,1,0,1,0,10,10,0,0,FALSE,FALSE,FALSE,54,1,0,0,0,0,"1 * 10-byte message" -2,"L",1,10,0,10,0,10,10,0,0,FALSE,FALSE,FALSE,54,1,0,0,0,0,"10 * 10-byte message" -3,"L",1,1,0,1,0,10,10,0,0,FALSE,TRUE,FALSE,54,1,0,0,0,0,"1 * 10-byte message [transient]" -4,"L",1,10,0,10,0,10,10,0,0,FALSE,TRUE,FALSE,54,1,0,0,0,0,"10 * 10-byte message [transient]" -5,"L",1,1,0,1,0,10,10,10,10,FALSE,FALSE,FALSE,64,1,0,0,0,0,"1 * 10-byte message [txn]" -6,"L",1,10,0,10,0,10,10,10,10,FALSE,FALSE,FALSE,64,1,0,0,0,0,"10 * 10-byte message [txn]" -7,"L",1,1,0,1,0,10,10,10,10,FALSE,TRUE,FALSE,64,1,0,0,0,0,"1 * 10-byte message [txn transient]" -8,"L",1,10,0,10,0,10,10,10,10,FALSE,TRUE,FALSE,64,1,0,0,0,0,"10 * 10-byte message [txn transient]" -9,"L",1,1,0,1,0,10,10,0,0,TRUE,FALSE,FALSE,54,1,32,1,0,0,"1 * 10-byte message [deq]" -10,"L",1,10,0,10,0,10,10,0,0,TRUE,FALSE,FALSE,54,1,32,1,0,0,"10 * 10-byte message [deq]" -11,"L",1,1,0,1,0,10,10,0,0,TRUE,TRUE,FALSE,54,1,32,1,0,0,"1 * 10-byte message [deq transient]" -12,"L",1,10,0,10,0,10,10,0,0,TRUE,TRUE,FALSE,54,1,32,1,0,0,"10 * 10-byte message [deq transient]" -13,"L",1,1,0,1,0,10,10,10,10,TRUE,FALSE,FALSE,64,1,54,1,46,1,"1 * 10-byte message [deq txn]" -14,"L",1,10,0,10,0,10,10,10,10,TRUE,FALSE,FALSE,64,1,54,1,46,1,"10 * 10-byte message [deq txn]" -15,"L",1,1,0,1,0,10,10,10,10,TRUE,TRUE,FALSE,64,1,54,1,46,1,"1 * 10-byte message [txn deq transient]" -16,"L",1,10,0,10,0,10,10,10,10,TRUE,TRUE,FALSE,64,1,54,1,46,1,"10 * 10-byte message [txn deq transient]" -17,"L",1,1,0,1,0,10,10,0,0,FALSE,FALSE,TRUE,54,1,0,0,0,0,"1 * 10-byte message [extern]" -18,"L",1,10,0,10,0,10,10,0,0,FALSE,FALSE,TRUE,54,1,0,0,0,0,"10 * 10-byte message [extern]" -19,"L",1,1,0,1,0,10,10,0,0,FALSE,TRUE,TRUE,54,1,0,0,0,0,"1 * 10-byte message [transient extern]" -20,"L",1,10,0,10,0,10,10,0,0,FALSE,TRUE,TRUE,54,1,0,0,0,0,"10 * 10-byte message [transient extern]" -21,"L",1,1,0,1,0,10,10,10,10,FALSE,FALSE,TRUE,64,1,0,0,0,0,"1 * 10-byte message [txn extern]" -22,"L",1,10,0,10,0,10,10,10,10,FALSE,FALSE,TRUE,64,1,0,0,0,0,"10 * 10-byte message [txn extern]" -23,"L",1,1,0,1,0,10,10,10,10,FALSE,TRUE,TRUE,64,1,0,0,0,0,"1 * 10-byte message [txn transient extern]" -24,"L",1,10,0,10,0,10,10,10,10,FALSE,TRUE,TRUE,64,1,0,0,0,0,"10 * 10-byte message [txn transient extern]" -25,"L",1,1,0,1,0,10,10,0,0,TRUE,FALSE,TRUE,54,1,32,1,0,0,"1 * 10-byte message [deq extern]" -26,"L",1,10,0,10,0,10,10,0,0,TRUE,FALSE,TRUE,54,1,32,1,0,0,"10 * 10-byte message [deq extern]" -27,"L",1,1,0,1,0,10,10,0,0,TRUE,TRUE,TRUE,54,1,32,1,0,0,"1 * 10-byte message [deq transient extern]" -28,"L",1,10,0,10,0,10,10,0,0,TRUE,TRUE,TRUE,54,1,32,1,0,0,"10 * 10-byte message [deq transient extern]" -29,"L",1,1,0,1,0,10,10,10,10,TRUE,FALSE,TRUE,64,1,54,1,46,1,"1 * 10-byte message [deq txn extern]" -30,"L",1,10,0,10,0,10,10,10,10,TRUE,FALSE,TRUE,64,1,54,1,46,1,"10 * 10-byte message [deq txn extern]" -31,"L",1,1,0,1,0,10,10,10,10,TRUE,TRUE,TRUE,64,1,54,1,46,1,"1 * 10-byte message [txn deq transient extern]" -32,"L",1,10,0,10,0,10,10,10,10,TRUE,TRUE,TRUE,64,1,54,1,46,1,"10 * 10-byte message [txn deq transient extern]" -,,,,,,,,,,,,,,,,,,,, -"High volume tests of random message lengths - RHM_WRONLY req'd for auto-dequeue == FALSE",,,,,,,,,,,,,,,,,,,, -33,"M",1,5000000,0,5000000,0,0,100,1,100,FALSE,RANDOM,RANDOM,244,2,0,0,0,0,"100 bytes xid max + 100 bytes data max [txn]" -34,"M",3,3000000,0,3000000,0,0,300,1,300,FALSE,RANDOM,RANDOM,644,6,0,0,0,0,"300 bytes xid max + 300 bytes data max [txn]" -35,"M",10,1600000,0,1600000,0,0,1000,1,1000,FALSE,RANDOM,RANDOM,2044,16,0,0,0,0,"1000 bytes xid max + 1000 bytes data max [txn]" -36,"M",30,600000,0,600000,0,0,3000,1,3000,FALSE,RANDOM,RANDOM,6044,48,0,0,0,0,"3000 bytes xid max + 3000 bytes data max [txn]" -37,"M",100,200000,0,200000,0,0,10000,1,10000,FALSE,RANDOM,RANDOM,20044,157,0,0,0,0,"10000 bytes xid max + 10000 bytes data max [txn]" -38,"M",300,60000,0,60000,0,0,30000,1,30000,FALSE,RANDOM,RANDOM,60044,470,0,0,0,0,"30000 bytes xid max + 30000 bytes data max [txn]" -39,"M",1000,20000,0,20000,0,0,100000,1,100000,FALSE,RANDOM,RANDOM,200044,1563,0,0,0,0,"100000 bytes xid max + 100000 bytes data max [txn]" -,,,,,,,,,,,,,,,,,,,, -"STANDARD PERFORMANCE BENCHMARK: 10,000,000 writes, data=212b (2 dblks)",,,,,,,,,,,,,,,,,,,, -40,"M",1,10000000,0,10000000,0,212,212,0,0,FALSE,FALSE,FALSE,256,2,0,0,0,0,"212 bytes data (2 dblks enq)" -41,"M",1,10000000,0,10000000,0,148,148,64,64,FALSE,FALSE,FALSE,256,2,0,0,0,0,"148 bytes data + 64 bytes xid (2 dblks enq)" -42,"M",1,10000000,0,10000000,0,212,212,0,0,TRUE,FALSE,FALSE,256,2,32,1,0,0,"212 bytes data (2 dblks enq + 1 dblk deq)" -43,"M",1,10000000,0,10000000,0,148,148,64,64,TRUE,FALSE,FALSE,256,2,108,1,100,1,"148 bytes data + 64 bytes xid (2 dblks enq + 1 dblks deq + 1 dblks txn)" diff --git a/qpid/cpp/src/tests/legacystore/jrnl/jtt/args.cpp b/qpid/cpp/src/tests/legacystore/jrnl/jtt/args.cpp deleted file mode 100644 index 0f041c380e..0000000000 --- a/qpid/cpp/src/tests/legacystore/jrnl/jtt/args.cpp +++ /dev/null @@ -1,226 +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 "args.h" - -#include <cstddef> -#include <iostream> - -namespace po = boost::program_options; - -namespace mrg -{ -namespace jtt -{ - -args::args(std::string opt_title): - _options_descr(opt_title), - format_chk(false), - keep_jrnls(false), - lld_rd_num(10), - lld_skip_num(100), - num_jrnls(1), - pause_secs(0), - randomize(false), - read_mode(), - read_prob(50), - recover_mode(false), - repeat_flag(false), - reuse_instance(false), - seed(0) -{ - _options_descr.add_options() - ("csv-file,c", - po::value<std::string>(&test_case_csv_file_name)->default_value("jtt.csv"), - "CSV file containing test cases.") - - ("format-chk", - po::value<bool>(&format_chk)->zero_tokens(), - "Check the format of each journal file.") - - ("help,h", "This help message.") - - ("jrnl-dir", - po::value<std::string>(&journal_dir)->default_value("/var/tmp/jtt"), - "Directory in which journal files will be placed.") - - ("keep-jrnls", - po::value<bool>(&keep_jrnls)->zero_tokens(), - "Keep all test journals.") - - ("lld-rd-num", - po::value<unsigned>(&lld_rd_num)->default_value(10), - "Number of consecutive messages to read after only dequeueing lld-skip-num " - "messages during lazy-loading. Ignored if read-mode is not set to LAZYLOAD.") - - ("lld-skip-num", - po::value<unsigned>(&lld_skip_num)->default_value(100), - "Number of consecutive messages to dequeue only (without reading) prior to " - "reading lld-rd-num messages. Ignored if read-mode is not set to LAZYLOAD.") - - ("num-jrnls", - po::value<unsigned>(&num_jrnls)->default_value(1), - "Number of simultaneous journal instances to test.") - - ("pause", - po::value<unsigned>(&pause_secs)->default_value(0), - "Pause in seconds between test cases (allows disk to catch up).") - - ("randomize", - po::value<bool>(&randomize)->zero_tokens(), - "Randomize the order of the tests.") - - ("read-mode", - po::value<read_arg>(&read_mode)->default_value(read_arg::NONE), - read_arg::descr().c_str()) - - ("read-prob", - po::value<unsigned>(&read_prob)->default_value(50), - "Read probability (percent) for each message when read-mode is set to RANDOM.") - - ("recover-mode", - po::value<bool>(&recover_mode)->zero_tokens(), - "Recover journal from the previous test for each test case.") - - ("repeat", - po::value<bool>(&repeat_flag)->zero_tokens(), - "Repeat all test cases indefinitely.") - - ("reuse-instance", - po::value<bool>(&reuse_instance)->zero_tokens(), - "Reuse journal instance for all test cases.") - - ("seed", - po::value<unsigned>(&seed)->default_value(0), - "Seed for use in random number generator.") - - ("analyzer", - po::value<std::string>(&jfile_analyzer)->default_value("./file_chk.py"), - "Journal file analyzer program to use when the --format-chk option is used, ignored otherwise.") - - ; -} - -bool -args::parse(int argc, char** argv) // return true if error, false if ok -{ - try - { - po::store(po::parse_command_line(argc, argv, _options_descr), _vmap); - po::notify(_vmap); - } - catch (const std::exception& e) - { - std::cout << "ERROR: " << e.what() << std::endl; - return usage(); - } - if (_vmap.count("help")) - return usage(); - if (num_jrnls == 0) - { - std::cout << "ERROR: num-jrnls must be 1 or more." << std::endl; - return usage(); - } - if (read_prob > 100) // read_prob is unsigned, so no need to check < 0 - { - std::cout << "ERROR: read-prob must be between 0 and 100 inclusive." << std::endl; - return usage(); - } - if (repeat_flag && keep_jrnls) - { - std::string resp; - std::cout << "WARNING: repeat and keep-jrnls: Monitor disk usage as test journals will" - " accumulate." << std::endl; - std::cout << "Continue? <y/n> "; - std::cin >> resp; - if (resp.size() == 1) - { - if (resp[0] != 'y' && resp[0] != 'Y') - return true; - } - else if (resp.size() == 3) // any combo of lower- and upper-case - { - if (resp[0] != 'y' && resp[0] != 'Y') - return true; - if (resp[1] != 'e' && resp[1] != 'E') - return true; - if (resp[2] != 's' && resp[2] != 'S') - return true; - } - else - return true; - } - return false; -} - -bool -args::usage() const -{ - std::cout << _options_descr << std::endl; - return true; -} - -void -args::print_args() const -{ - std::cout << "Number of journals: " << num_jrnls << std::endl; - std::cout << "Read mode: " << read_mode << std::endl; - if (read_mode.val() == read_arg::RANDOM) - std::cout << "Read probability: " << read_prob << " %" << std::endl; - if (read_mode.val() == read_arg::LAZYLOAD) - { - std::cout << "Lazy-load skips: " << lld_skip_num << std::endl; - std::cout << "Lazy-load reads: " << lld_rd_num << std::endl; - } - if (pause_secs) - std::cout << "Pause between test cases: " << pause_secs << " sec." << std::endl; - if (seed) - std::cout << "Randomize seed: " << seed << std::endl; - print_flags(); -} - -void -args::print_flags() const -{ - if (format_chk || keep_jrnls || randomize || recover_mode || repeat_flag || - reuse_instance) - { - std::cout << "Flag options:"; - // TODO: Get flag args and their strings directly from _options_descr. - if (format_chk) - std::cout << " format-chk"; - if (keep_jrnls) - std::cout << " keep-jrnls"; - if (randomize) - std::cout << " randomize"; - if (recover_mode) - std::cout << " recover-mode"; - if (repeat_flag) - std::cout << " repeat-flag"; - if (reuse_instance) - std::cout << " reuse-instance"; - std::cout << std::endl; - } - std::cout << std::endl; -} - -} // namespace jtt -} // namespace mrg diff --git a/qpid/cpp/src/tests/legacystore/jrnl/jtt/args.h b/qpid/cpp/src/tests/legacystore/jrnl/jtt/args.h deleted file mode 100644 index b6f7fb4a79..0000000000 --- a/qpid/cpp/src/tests/legacystore/jrnl/jtt/args.h +++ /dev/null @@ -1,66 +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 mrg_jtt_args_hpp -#define mrg_jtt_args_hpp - -#include <boost/program_options.hpp> -#include "read_arg.h" - -namespace mrg -{ -namespace jtt -{ - - struct args - { - boost::program_options::options_description _options_descr; - boost::program_options::variables_map _vmap; - - // Add args here - std::string jfile_analyzer; - std::string test_case_csv_file_name; - std::string journal_dir; - bool format_chk; - bool keep_jrnls; - unsigned lld_rd_num; - unsigned lld_skip_num; - unsigned num_jrnls; - unsigned pause_secs; - bool randomize; - read_arg read_mode; - unsigned read_prob; - bool recover_mode; - bool repeat_flag; - bool reuse_instance; - unsigned seed; - - args(std::string opt_title); - bool parse(int argc, char** argv); // return true if error, false if ok - bool usage() const; // return true - void print_args() const; - void print_flags() const; - }; - -} // namespace jtt -} // namespace mrg - -#endif // ifndef mrg_jtt_args_hpp diff --git a/qpid/cpp/src/tests/legacystore/jrnl/jtt/data_src.cpp b/qpid/cpp/src/tests/legacystore/jrnl/jtt/data_src.cpp deleted file mode 100644 index 3530e0b223..0000000000 --- a/qpid/cpp/src/tests/legacystore/jrnl/jtt/data_src.cpp +++ /dev/null @@ -1,87 +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 "data_src.h" - -#include <cstddef> -#include <iomanip> -#include <sstream> - -namespace mrg -{ -namespace jtt -{ - -char data_src::_data_src[data_src::max_dsize]; -char data_src::_xid_src[data_src::max_xsize]; -bool data_src::_initialized = data_src::__init(); -u_int64_t data_src::_xid_cnt = 0ULL; -mrg::journal::smutex data_src::_sm; - -data_src::data_src() -{} - -bool -data_src::__init() -{ - for (unsigned i=0; i<max_dsize; i++) - _data_src[i] = '0' + ((i + 1) % 10); // 123456789012345... - for (unsigned j=0; j<max_xsize; j++) - _xid_src[j] = 'a' + (j % 26); // abc...xyzabc... - return true; -} - -const char* -data_src::get_data(const std::size_t offs) -{ - if (offs >= max_dsize) return 0; - return _data_src + offs; -} - -std::string -data_src::get_xid(const std::size_t xid_size) -{ - if (xid_size == 0) - return ""; - std::ostringstream oss; - oss << std::setfill('0'); - if (xid_size < 9) - oss << std::setw(xid_size) << get_xid_cnt(); - else if (xid_size < 13) - oss << "xid:" << std::setw(xid_size - 4) << get_xid_cnt(); - else - { - oss << "xid:" << std::setw(8) << get_xid_cnt() << ":"; - oss.write(get_xid_content(13), xid_size - 13); - } - return oss.str(); -} - -const char* -data_src::get_xid_content(const std::size_t offs) -{ - if (offs >= max_xsize) return 0; - return _xid_src + offs; -} - -} // namespace jtt -} // namespace mrg - diff --git a/qpid/cpp/src/tests/legacystore/jrnl/jtt/data_src.h b/qpid/cpp/src/tests/legacystore/jrnl/jtt/data_src.h deleted file mode 100644 index 66dc613787..0000000000 --- a/qpid/cpp/src/tests/legacystore/jrnl/jtt/data_src.h +++ /dev/null @@ -1,66 +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 mrg_jtt_data_src_hpp -#define mrg_jtt_data_src_hpp - -#include <cstddef> -#include "qpid/legacystore/jrnl/slock.h" -#include "qpid/legacystore/jrnl/smutex.h" -#include <pthread.h> -#include <string> -#include <sys/types.h> - -#define DATA_SIZE 1024 * 1024 -#define XID_SIZE 1024 * 1024 - -namespace mrg -{ -namespace jtt -{ - class data_src - { - public: - static const std::size_t max_dsize = DATA_SIZE; - static const std::size_t max_xsize = XID_SIZE; - - private: - static char _data_src[]; - static char _xid_src[]; - static u_int64_t _xid_cnt; - static bool _initialized; - static mrg::journal::smutex _sm; - - public: - static const char* get_data(const std::size_t offs); - static std::string get_xid(const std::size_t xid_size); - - private: - data_src(); - static u_int64_t get_xid_cnt() { mrg::journal::slock s(_sm); return _xid_cnt++; } - static const char* get_xid_content(const std::size_t offs); - static bool __init(); - }; - -} // namespace jtt -} // namespace mrg - -#endif // ifndef mrg_jtt_data_src_hpp diff --git a/qpid/cpp/src/tests/legacystore/jrnl/jtt/jfile_chk.py b/qpid/cpp/src/tests/legacystore/jrnl/jtt/jfile_chk.py deleted file mode 100755 index 36ef511f5c..0000000000 --- a/qpid/cpp/src/tests/legacystore/jrnl/jtt/jfile_chk.py +++ /dev/null @@ -1,838 +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 getopt -import string -import xml.parsers.expat -from struct import unpack, calcsize -from time import gmtime, strftime - -dblk_size = 128 -sblk_size = 4 * dblk_size -jfsize = None -hdr_ver = 1 - -TEST_NUM_COL = 0 -NUM_MSGS_COL = 5 -MIN_MSG_SIZE_COL = 7 -MAX_MSG_SIZE_COL = 8 -MIN_XID_SIZE_COL = 9 -MAX_XID_SIZE_COL = 10 -AUTO_DEQ_COL = 11 -TRANSIENT_COL = 12 -EXTERN_COL = 13 -COMMENT_COL = 20 - -owi_mask = 0x01 -transient_mask = 0x10 -extern_mask = 0x20 - -printchars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ ' - - - -#== global functions =========================================================== - -def load(f, klass): - args = load_args(f, klass) - subclass = klass.discriminate(args) - result = subclass(*args) - if subclass != klass: - result.init(f, *load_args(f, subclass)) - result.skip(f) - return result; - -def load_args(f, klass): - size = calcsize(klass.format) - foffs = f.tell(), - bin = f.read(size) - if len(bin) != size: - raise Exception("end of file") - return foffs + unpack(klass.format, bin) - -def size_blks(size, blk_size): - return (size + blk_size - 1)/blk_size - -def rem_in_blk(f, blk_size): - foffs = f.tell() - return (size_blks(f.tell(), blk_size) * blk_size) - foffs; - -def file_full(f): - return f.tell() >= jfsize - -def isprintable(s): - return s.strip(printchars) == '' - -def print_xid(xidsize, xid): - if xid == None: - if xidsize > 0: - raise Exception('Inconsistent XID size: xidsize=%d, xid=None' % xidsize) - return '' - if isprintable(xid): - xidstr = split_str(xid) - else: - xidstr = hex_split_str(xid) - if xidsize != len(xid): - raise Exception('Inconsistent XID size: xidsize=%d, xid(%d)=\"%s\"' % (xidsize, len(xid), xidstr)) - return 'xid(%d)=\"%s\" ' % (xidsize, xidstr) - -def print_data(dsize, data): - if data == None: - return '' - if isprintable(data): - datastr = split_str(data) - else: - datastr = hex_split_str(data) - if dsize != len(data): - raise Exception('Inconsistent data size: dsize=%d, data(%d)=\"%s\"' % (dsize, len(data), datastr)) - return 'data(%d)=\"%s\" ' % (dsize, datastr) - -def hex_split_str(s, split_size = 50): - if len(s) <= split_size: - return hex_str(s, 0, len(s)) - if len(s) > split_size + 25: - return hex_str(s, 0, 10) + ' ... ' + hex_str(s, 55, 65) + ' ... ' + hex_str(s, len(s)-10, len(s)) - return hex_str(s, 0, 10) + ' ... ' + hex_str(s, len(s)-10, len(s)) - -def hex_str(s, b, e): - o = '' - for i in range(b, e): - if isprintable(s[i]): - o += s[i] - else: - o += '\\%02x' % ord(s[i]) - return o - -def split_str(s, split_size = 50): - if len(s) < split_size: - return s - return s[:25] + ' ... ' + s[-25:] - -def inv_str(s): - si = '' - for i in range(0,len(s)): - si += chr(~ord(s[i]) & 0xff) - return si - -def load_file_data(f, size, data): - if size == 0: - return (data, True) - if data == None: - loaded = 0 - else: - loaded = len(data) - foverflow = f.tell() + size - loaded > jfsize - if foverflow: - rsize = jfsize - f.tell() - else: - rsize = size - loaded - bin = f.read(rsize) - if data == None: - data = unpack('%ds' % (rsize), bin)[0] - else: - data = data + unpack('%ds' % (rsize), bin)[0] - return (data, not foverflow) - -def exit(code, qflag): - if code != 0 or not qflag: - print out.getvalue() - out.close() - sys.exit(code) - -#== class Sizeable ============================================================= - -class Sizeable: - - def size(self): - classes = [self.__class__] - - size = 0 - while classes: - cls = classes.pop() - if hasattr(cls, "format"): - size += calcsize(cls.format) - classes.extend(cls.__bases__) - - return size - - -#== class Hdr ================================================================== - -class Hdr(Sizeable): - - format = '=4sBBHQ' - - def discriminate(args): - return CLASSES.get(args[1][-1], Hdr) - discriminate = staticmethod(discriminate) - - def __init__(self, foffs, magic, ver, end, flags, rid): - self.foffs = foffs - self.magic = magic - self.ver = ver - self.end = end - self.flags = flags - self.rid = rid - if self.magic[-1] not in ['0x00', 'a', 'c', 'd', 'e', 'f', 'x']: - error = 3 - - def __str__(self): - if self.empty(): - return '0x%08x: <empty>' % (self.foffs) - if self.magic[-1] == 'x': - return '0x%08x: [\"%s\"]' % (self.foffs, self.magic) - if self.magic[-1] in ['a', 'c', 'd', 'e', 'f', 'x']: - return '0x%08x: [\"%s\" v=%d e=%d f=0x%04x rid=0x%x]' % (self.foffs, self.magic, self.ver, self.end, self.flags, self.rid) - return '0x%08x: <error, unknown magic \"%s\" (possible overwrite boundary?)>' % (self.foffs, self.magic) - - def empty(self): - return self.magic == '\x00'*4 - - def owi(self): - return self.flags & owi_mask != 0 - - def skip(self, f): - f.read(rem_in_blk(f, dblk_size)) - - def check(self): - if self.empty() or self.magic[:3] != 'RHM' or self.magic[3] not in ['a', 'c', 'd', 'e', 'f', 'x']: - return True - if self.ver != hdr_ver and self.magic[-1] != 'x': - raise Exception('%s: Invalid header version: found %d, expected %d.' % (self, self.ver, hdr_ver)) - return False - - -#== class FileHdr ============================================================== - -class FileHdr(Hdr): - - format = '=2H4x3Q' - - def init(self, f, foffs, fid, lid, fro, time_sec, time_ns): - self.fid = fid - self.lid = lid - self.fro = fro - self.time_sec = time_sec - self.time_ns = time_ns - - def __str__(self): - return '%s fid=%d lid=%d fro=0x%08x t=%s' % (Hdr.__str__(self), self.fid, self.lid, self.fro, self.timestamp_str()) - - def skip(self, f): - f.read(rem_in_blk(f, sblk_size)) - - def timestamp(self): - return (self.time_sec, self.time_ns) - - def timestamp_str(self): - ts = gmtime(self.time_sec) - fstr = '%%a %%b %%d %%H:%%M:%%S.%09d %%Y' % (self.time_ns) - return strftime(fstr, ts) - - -#== class DeqHdr =============================================================== - -class DeqHdr(Hdr): - - format = '=QQ' - - def init(self, f, foffs, deq_rid, xidsize): - self.deq_rid = deq_rid - self.xidsize = xidsize - self.xid = None - self.deq_tail = None - self.xid_complete = False - self.tail_complete = False - self.tail_bin = None - self.tail_offs = 0 - self.load(f) - - def load(self, f): - if self.xidsize == 0: - self.xid_complete = True - self.tail_complete = True - else: - if not self.xid_complete: - ret = load_file_data(f, self.xidsize, self.xid) - self.xid = ret[0] - self.xid_complete = ret[1] - if self.xid_complete and not self.tail_complete: - ret = load_file_data(f, calcsize(RecTail.format), self.tail_bin) - self.tail_bin = ret[0] - if ret[1]: - self.enq_tail = RecTail(self.tail_offs, *unpack(RecTail.format, self.tail_bin)) - if self.enq_tail.magic_inv != inv_str(self.magic) or self.enq_tail.rid != self.rid: - print " > %s" % self - raise Exception('Invalid dequeue record tail (magic=%s; rid=%d) at 0x%08x' % (self.enq_tail, self.enq_tail.rid, self.enq_tail.foffs)) - self.enq_tail.skip(f) - self.tail_complete = ret[1] - return self.complete() - - def complete(self): - return self.xid_complete and self.tail_complete - - def __str__(self): - return '%s %sdrid=0x%x' % (Hdr.__str__(self), print_xid(self.xidsize, self.xid), self.deq_rid) - - -#== class TxnHdr =============================================================== - -class TxnHdr(Hdr): - - format = '=Q' - - def init(self, f, foffs, xidsize): - self.xidsize = xidsize - self.xid = None - self.tx_tail = None - self.xid_complete = False - self.tail_complete = False - self.tail_bin = None - self.tail_offs = 0 - self.load(f) - - def load(self, f): - if not self.xid_complete: - ret = load_file_data(f, self.xidsize, self.xid) - self.xid = ret[0] - self.xid_complete = ret[1] - if self.xid_complete and not self.tail_complete: - ret = load_file_data(f, calcsize(RecTail.format), self.tail_bin) - self.tail_bin = ret[0] - if ret[1]: - self.enq_tail = RecTail(self.tail_offs, *unpack(RecTail.format, self.tail_bin)) - if self.enq_tail.magic_inv != inv_str(self.magic) or self.enq_tail.rid != self.rid: - print " > %s" % self - raise Exception('Invalid transaction record tail (magic=%s; rid=%d) at 0x%08x' % (self.enq_tail, self.enq_tail.rid, self.enq_tail.foffs)) - self.enq_tail.skip(f) - self.tail_complete = ret[1] - return self.complete() - - def complete(self): - return self.xid_complete and self.tail_complete - - def __str__(self): - return '%s %s' % (Hdr.__str__(self), print_xid(self.xidsize, self.xid)) - - -#== class RecTail ============================================================== - -class RecTail(Sizeable): - - format = '=4sQ' - - def __init__(self, foffs, magic_inv, rid): - self.foffs = foffs - self.magic_inv = magic_inv - self.rid = rid - - def __str__(self): - magic = inv_str(self.magic_inv) - return '[\"%s\" rid=0x%x]' % (magic, self.rid) - - def skip(self, f): - f.read(rem_in_blk(f, dblk_size)) - - -#== class EnqRec =============================================================== - -class EnqRec(Hdr): - - format = '=QQ' - - def init(self, f, foffs, xidsize, dsize): - self.xidsize = xidsize - self.dsize = dsize - self.transient = self.flags & transient_mask > 0 - self.extern = self.flags & extern_mask > 0 - self.xid = None - self.data = None - self.enq_tail = None - self.xid_complete = False - self.data_complete = False - self.tail_complete = False - self.tail_bin = None - self.tail_offs = 0 - self.load(f) - - def load(self, f): - if not self.xid_complete: - ret = load_file_data(f, self.xidsize, self.xid) - self.xid = ret[0] - self.xid_complete = ret[1] - if self.xid_complete and not self.data_complete: - if self.extern: - self.data_complete = True - else: - ret = load_file_data(f, self.dsize, self.data) - self.data = ret[0] - self.data_complete = ret[1] - if self.data_complete and not self.tail_complete: - ret = load_file_data(f, calcsize(RecTail.format), self.tail_bin) - self.tail_bin = ret[0] - if ret[1]: - self.enq_tail = RecTail(self.tail_offs, *unpack(RecTail.format, self.tail_bin)) - if self.enq_tail.magic_inv != inv_str(self.magic) or self.enq_tail.rid != self.rid: - print " > %s" % self - raise Exception('Invalid enqueue record tail (magic=%s; rid=%d) at 0x%08x' % (self.enq_tail, self.enq_tail.rid, self.enq_tail.foffs)) - self.enq_tail.skip(f) - self.tail_complete = ret[1] - return self.complete() - - def complete(self): - return self.xid_complete and self.data_complete and self.tail_complete - - def print_flags(self): - s = '' - if self.transient: - s = '*TRANSIENT' - if self.extern: - if len(s) > 0: - s += ',EXTERNAL' - else: - s = '*EXTERNAL' - if len(s) > 0: - s += '*' - return s - - def __str__(self): - return '%s %s%s %s %s' % (Hdr.__str__(self), print_xid(self.xidsize, self.xid), print_data(self.dsize, self.data), self.enq_tail, self.print_flags()) - - -#== class Main ================================================================= - -class Main: - def __init__(self, argv): - self.bfn = None - self.csvfn = None - self.jdir = None - self.aflag = False - self.hflag = False - self.qflag = False - self.tnum = None - self.num_jfiles = None - self.num_msgs = None - self.msg_len = None - self.auto_deq = None - self.xid_len = None - self.transient = None - self.extern = None - - self.file_start = 0 - self.file_num = 0 - self.fro = 0x200 - self.emap = {} - self.tmap = {} - self.rec_cnt = 0 - self.msg_cnt = 0 - self.txn_msg_cnt = 0 - self.fhdr = None - self.f = None - self.first_rec = False - self.last_file = False - self.last_rid = -1 - self.fhdr_owi_at_msg_start = None - - self.proc_args(argv) - self.proc_csv() - self.read_jinf() - - def run(self): - try: - start_info = self.analyze_files() - stop = self.advance_file(*start_info) - except Exception: - print 'WARNING: All journal files are empty.' - if self.num_msgs > 0: - raise Exception('All journal files are empty, but %d msgs expectd.' % self.num_msgs) - else: - stop = True - while not stop: - warn = '' - if file_full(self.f): - stop = self.advance_file() - if stop: - break - hdr = load(self.f, Hdr) - if hdr.empty(): - stop = True; - break - if hdr.check(): - stop = True; - else: - self.rec_cnt += 1 - self.fhdr_owi_at_msg_start = self.fhdr.owi() - if self.first_rec: - if self.fhdr.fro != hdr.foffs: - raise Exception('File header first record offset mismatch: fro=0x%08x; rec_offs=0x%08x' % (self.fhdr.fro, hdr.foffs)) - else: - if not self.qflag: print ' * fro ok: 0x%08x' % self.fhdr.fro - self.first_rec = False - if isinstance(hdr, EnqRec) and not stop: - while not hdr.complete(): - stop = self.advance_file() - if stop: - break - hdr.load(self.f) - if self.extern != None: - if hdr.extern: - if hdr.data != None: - raise Exception('Message data found on external record') - else: - if self.msg_len > 0 and len(hdr.data) != self.msg_len: - raise Exception('Message length (%d) incorrect; expected %d' % (len(hdr.data), self.msg_len)) - else: - if self.msg_len > 0 and len(hdr.data) != self.msg_len: - raise Exception('Message length (%d) incorrect; expected %d' % (len(hdr.data), self.msg_len)) - if self.xid_len > 0 and len(hdr.xid) != self.xid_len: - print ' ERROR: XID length (%d) incorrect; expected %d' % (len(hdr.xid), self.xid_len) - sys.exit(1) - #raise Exception('XID length (%d) incorrect; expected %d' % (len(hdr.xid), self.xid_len)) - if self.transient != None: - if self.transient: - if not hdr.transient: - raise Exception('Expected transient record, found persistent') - else: - if hdr.transient: - raise Exception('Expected persistent record, found transient') - stop = not self.check_owi(hdr) - if stop: - warn = ' (WARNING: OWI mismatch - could be overwrite boundary.)' - else: - self.msg_cnt += 1 - if self.aflag or self.auto_deq: - if hdr.xid == None: - self.emap[hdr.rid] = (self.fhdr.fid, hdr, False) - else: - self.txn_msg_cnt += 1 - if hdr.xid in self.tmap: - self.tmap[hdr.xid].append((self.fhdr.fid, hdr)) #Append tuple to existing list - else: - self.tmap[hdr.xid] = [(self.fhdr.fid, hdr)] # Create new list - elif isinstance(hdr, DeqHdr) and not stop: - while not hdr.complete(): - stop = self.advance_file() - if stop: - break - hdr.load(self.f) - stop = not self.check_owi(hdr) - if stop: - warn = ' (WARNING: OWI mismatch - could be overwrite boundary.)' - else: - if self.auto_deq != None: - if not self.auto_deq: - warn = ' WARNING: Dequeue record rid=%d found in non-dequeue test - ignoring.' % hdr.rid - if self.aflag or self.auto_deq: - if hdr.xid == None: - if hdr.deq_rid in self.emap: - if self.emap[hdr.deq_rid][2]: - warn = ' (WARNING: dequeue rid 0x%x dequeues locked enqueue record 0x%x)' % (hdr.rid, hdr.deq_rid) - del self.emap[hdr.deq_rid] - else: - warn = ' (WARNING: rid being dequeued 0x%x not found in enqueued records)' % hdr.deq_rid - else: - if hdr.deq_rid in self.emap: - t = self.emap[hdr.deq_rid] - self.emap[hdr.deq_rid] = (t[0], t[1], True) # Lock enq record - if hdr.xid in self.tmap: - self.tmap[hdr.xid].append((self.fhdr.fid, hdr)) #Append to existing list - else: - self.tmap[hdr.xid] = [(self.fhdr.fid, hdr)] # Create new list - elif isinstance(hdr, TxnHdr) and not stop: - while not hdr.complete(): - stop = self.advance_file() - if stop: - break - hdr.load(self.f) - stop = not self.check_owi(hdr) - if stop: - warn = ' (WARNING: OWI mismatch - could be overwrite boundary.)' - else: - if hdr.xid in self.tmap: - mismatched_rids = [] - if hdr.magic[-1] == 'c': # commit - for rec in self.tmap[hdr.xid]: - if isinstance(rec[1], EnqRec): - self.emap[rec[1].rid] = (rec[0], rec[1], False) # Transfer enq to emap - elif isinstance(rec[1], DeqHdr): - if rec[1].deq_rid in self.emap: - del self.emap[rec[1].deq_rid] # Delete from emap - else: - mismatched_rids.append('0x%x' % rec[1].deq_rid) - else: - raise Exception('Unknown header found in txn map: %s' % rec[1]) - elif hdr.magic[-1] == 'a': # abort - for rec in self.tmap[hdr.xid]: - if isinstance(rec[1], DeqHdr): - if rec[1].deq_rid in self.emap: - t = self.emap[rec[1].deq_rid] - self.emap[rec[1].deq_rid] = (t[0], t[1], False) # Unlock enq record - del self.tmap[hdr.xid] - if len(mismatched_rids) > 0: - warn = ' (WARNING: transactional dequeues not found in enqueue map; rids=%s)' % mismatched_rids - else: - warn = ' (WARNING: %s not found in transaction map)' % print_xid(len(hdr.xid), hdr.xid) - if not self.qflag: print ' > %s%s' % (hdr, warn) - if not stop: - stop = (self.last_file and hdr.check()) or hdr.empty() or self.fhdr.empty() - - def analyze_files(self): - fname = '' - fnum = -1 - rid = -1 - fro = -1 - tss = '' - if not self.qflag: print 'Analyzing journal files:' - owi_found = False - for i in range(0, self.num_jfiles): - jfn = self.jdir + '/' + self.bfn + '.%04d.jdat' % i - f = open(jfn) - fhdr = load(f, Hdr) - if fhdr.empty(): - if not self.qflag: - print ' %s: file empty' % jfn - break - if i == 0: - init_owi = fhdr.owi() - fname = jfn - fnum = i - rid = fhdr.rid - fro = fhdr.fro - tss = fhdr.timestamp_str() - elif fhdr.owi() != init_owi and not owi_found: - fname = jfn - fnum = i - rid = fhdr.rid - fro = fhdr.fro - tss = fhdr.timestamp_str() - owi_found = True - if not self.qflag: - print ' %s: owi=%s rid=0x%x, fro=0x%08x ts=%s' % (jfn, fhdr.owi(), fhdr.rid, fhdr.fro, fhdr.timestamp_str()) - if fnum < 0 or rid < 0 or fro < 0: - raise Exception('All journal files empty') - if not self.qflag: print ' Oldest complete file: %s: rid=%d, fro=0x%08x ts=%s' % (fname, rid, fro, tss) - return (fnum, rid, fro) - - def advance_file(self, *start_info): - seek_flag = False - if len(start_info) == 3: - self.file_start = self.file_num = start_info[0] - self.fro = start_info[2] - seek_flag = True - if self.f != None and file_full(self.f): - self.file_num = self.incr_fnum() - if self.file_num == self.file_start: - return True - if self.file_start == 0: - self.last_file = self.file_num == self.num_jfiles - 1 - else: - self.last_file = self.file_num == self.file_start - 1 - if self.file_num < 0 or self.file_num >= self.num_jfiles: - raise Exception('Bad file number %d' % self.file_num) - jfn = self.jdir + '/' + self.bfn + '.%04d.jdat' % self.file_num - self.f = open(jfn) - self.fhdr = load(self.f, Hdr) - if seek_flag and self.f.tell() != self.fro: - self.f.seek(self.fro) - self.first_rec = True - if not self.qflag: print jfn, ": ", self.fhdr - return False - - def incr_fnum(self): - self.file_num += 1 - if self.file_num >= self.num_jfiles: - self.file_num = 0; - return self.file_num - - def check_owi(self, hdr): - return self.fhdr_owi_at_msg_start == hdr.owi() - - def check_rid(self, hdr): - if self.last_rid != -1 and hdr.rid <= self.last_rid: - return False - self.last_rid = hdr.rid - return True - - def read_jinf(self): - filename = self.jdir + '/' + self.bfn + '.jinf' - try: - f = open(filename, 'r') - except IOError: - print 'ERROR: Unable to open jinf file %s' % filename - sys.exit(1) - p = xml.parsers.expat.ParserCreate() - p.StartElementHandler = self.handleStartElement - p.CharacterDataHandler = self.handleCharData - p.EndElementHandler = self.handleEndElement - p.ParseFile(f) - if self.num_jfiles == None: - print 'ERROR: number_jrnl_files not found in jinf file "%s"!' % filename - if jfsize == None: - print 'ERROR: jrnl_file_size_sblks not found in jinf file "%s"!' % filename - if self.num_jfiles == None or jfsize == None: - sys.exit(1) - - def handleStartElement(self, name, attrs): - global jfsize - if name == 'number_jrnl_files': - self.num_jfiles = int(attrs['value']) - if name == 'jrnl_file_size_sblks': - jfsize = (int(attrs['value']) + 1) * sblk_size - - def handleCharData(self, data): pass - - def handleEndElement(self, name): pass - - def proc_csv(self): - if self.csvfn != None and self.tnum != None: - tparams = self.get_test(self.csvfn, self.tnum) - if tparams == None: - print 'ERROR: Test %d not found in CSV file "%s"' % (self.tnum, self.csvfn) - sys.exit(1) - self.num_msgs = tparams['num_msgs'] - if tparams['min_size'] == tparams['max_size']: - self.msg_len = tparams['max_size'] - else: - self.msg_len = 0 - self.auto_deq = tparams['auto_deq'] - if tparams['xid_min_size'] == tparams['xid_max_size']: - self.xid_len = tparams['xid_max_size'] - else: - self.xid_len = 0 - self.transient = tparams['transient'] - self.extern = tparams['extern'] - - def get_test(self, filename, tnum): - try: - f=open(filename, 'r') - except IOError: - print 'ERROR: Unable to open CSV file "%s"' % filename - sys.exit(1) - for l in f: - sl = l.strip().split(',') - if len(sl[0]) > 0 and sl[0][0] != '"': - try: - if (int(sl[TEST_NUM_COL]) == tnum): - return { 'num_msgs':int(sl[NUM_MSGS_COL]), - 'min_size':int(sl[MIN_MSG_SIZE_COL]), - 'max_size':int(sl[MAX_MSG_SIZE_COL]), - 'auto_deq':not (sl[AUTO_DEQ_COL] == 'FALSE' or sl[AUTO_DEQ_COL] == '0'), - 'xid_min_size':int(sl[MIN_XID_SIZE_COL]), - 'xid_max_size':int(sl[MAX_XID_SIZE_COL]), - 'transient':not (sl[TRANSIENT_COL] == 'FALSE' or sl[TRANSIENT_COL] == '0'), - 'extern':not (sl[EXTERN_COL] == 'FALSE' or sl[EXTERN_COL] == '0'), - 'comment':sl[COMMENT_COL] } - except Exception: - pass - return None - - def proc_args(self, argv): - try: - opts, args = getopt.getopt(sys.argv[1:], "ab:c:d:hqt:", ["analyse", "base-filename=", "csv-filename=", "dir=", "help", "quiet", "test-num="]) - except getopt.GetoptError: - self.usage() - sys.exit(2) - for o, a in opts: - if o in ("-h", "--help"): - self.usage() - sys.exit() - if o in ("-a", "--analyze"): - self.aflag = True - if o in ("-b", "--base-filename"): - self.bfn = a - if o in ("-c", "--csv-filename"): - self.csvfn = a - if o in ("-d", "--dir"): - self.jdir = a - if o in ("-q", "--quiet"): - self.qflag = True - if o in ("-t", "--test-num"): - if not a.isdigit(): - print 'ERROR: Illegal test-num argument. Must be a non-negative number' - sys.exit(2) - self.tnum = int(a) - if self.bfn == None or self.jdir == None: - print 'ERROR: Missing requred args.' - self.usage() - sys.exit(2) - if self.tnum != None and self.csvfn == None: - print 'ERROR: Test number specified, but not CSV file' - self.usage() - sys.exit(2) - - def usage(self): - print 'Usage: %s opts' % sys.argv[0] - print ' where opts are in either short or long format (*=req\'d):' - print ' -a --analyze Analyze enqueue/dequeue records' - print ' -b --base-filename [string] * Base filename for journal files' - print ' -c --csv-filename [string] CSV filename containing test parameters' - print ' -d --dir [string] * Journal directory containing journal files' - print ' -h --help Print help' - print ' -q --quiet Quiet (reduced output)' - print ' -t --test-num [int] Test number from CSV file - only valid if CSV file named' - - def report(self): - if not self.qflag: - print - print ' === REPORT ====' - if self.num_msgs > 0 and self.msg_cnt != self.num_msgs: - print 'WARNING: Found %d messages; %d expected.' % (self.msg_cnt, self.num_msgs) - if len(self.emap) > 0: - print - print 'Remaining enqueued records (sorted by rid): ' - keys = sorted(self.emap.keys()) - for k in keys: - if self.emap[k][2] == True: # locked - locked = ' (locked)' - else: - locked = '' - print " fid=%d %s%s" % (self.emap[k][0], self.emap[k][1], locked) - print 'WARNING: Enqueue-Dequeue mismatch, %d enqueued records remain.' % len(self.emap) - if len(self.tmap) > 0: - txn_rec_cnt = 0 - print - print 'Remaining transactions: ' - for t in self.tmap: - print_xid(len(t), t) - for r in self.tmap[t]: - print " fid=%d %s" % (r[0], r[1]) - print " Total: %d records for xid %s" % (len(self.tmap[t]), t) - txn_rec_cnt += len(self.tmap[t]) - print 'WARNING: Incomplete transactions, %d xids remain containing %d records.' % (len(self.tmap), txn_rec_cnt) - print '%d enqueues, %d journal records processed.' % (self.msg_cnt, self.rec_cnt) - - -#=============================================================================== - -CLASSES = { - "a": TxnHdr, - "c": TxnHdr, - "d": DeqHdr, - "e": EnqRec, - "f": FileHdr -} - -m = Main(sys.argv) -m.run() -m.report() - -sys.exit(None) diff --git a/qpid/cpp/src/tests/legacystore/jrnl/jtt/jrnl_init_params.cpp b/qpid/cpp/src/tests/legacystore/jrnl/jtt/jrnl_init_params.cpp deleted file mode 100644 index 1bc04110af..0000000000 --- a/qpid/cpp/src/tests/legacystore/jrnl/jtt/jrnl_init_params.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 "jrnl_init_params.h" - -namespace mrg -{ -namespace jtt -{ - -jrnl_init_params::jrnl_init_params(const std::string& jid, const std::string& jdir, const std::string& base_filename, - const u_int16_t num_jfiles, const bool ae, const u_int16_t ae_max_jfiles, const u_int32_t jfsize_sblks, - const u_int16_t wcache_num_pages, const u_int32_t wcache_pgsize_sblks): - _jid(jid), - _jdir(jdir), - _base_filename(base_filename), - _num_jfiles(num_jfiles), - _ae(ae), - _ae_max_jfiles(ae_max_jfiles), - _jfsize_sblks(jfsize_sblks), - _wcache_num_pages(wcache_num_pages), - _wcache_pgsize_sblks(wcache_pgsize_sblks) -{} - -jrnl_init_params::jrnl_init_params(const jrnl_init_params& jp): - _jid(jp._jid), - _jdir(jp._jdir), - _base_filename(jp._base_filename), - _num_jfiles(jp._num_jfiles), - _ae(jp._ae), - _ae_max_jfiles(jp._ae_max_jfiles), - _jfsize_sblks(jp._jfsize_sblks), - _wcache_num_pages(jp._wcache_num_pages), - _wcache_pgsize_sblks(jp._wcache_pgsize_sblks) -{} - -jrnl_init_params::jrnl_init_params(const jrnl_init_params* const jp_ptr): - _jid(jp_ptr->_jid), - _jdir(jp_ptr->_jdir), - _base_filename(jp_ptr->_base_filename), - _num_jfiles(jp_ptr->_num_jfiles), - _ae(jp_ptr->_ae), - _ae_max_jfiles(jp_ptr->_ae_max_jfiles), - _jfsize_sblks(jp_ptr->_jfsize_sblks), - _wcache_num_pages(jp_ptr->_wcache_num_pages), - _wcache_pgsize_sblks(jp_ptr->_wcache_pgsize_sblks) -{} - -// static initializers - -const u_int16_t jrnl_init_params::def_num_jfiles = 8; -const bool jrnl_init_params::def_ae = false; -const u_int16_t jrnl_init_params::def_ae_max_jfiles = 0; -const u_int32_t jrnl_init_params::def_jfsize_sblks = 0xc00; -const u_int16_t jrnl_init_params::def_wcache_num_pages = 32; -const u_int32_t jrnl_init_params::def_wcache_pgsize_sblks = 64; - -} // namespace jtt -} // namespace mrg diff --git a/qpid/cpp/src/tests/legacystore/jrnl/jtt/jrnl_init_params.h b/qpid/cpp/src/tests/legacystore/jrnl/jtt/jrnl_init_params.h deleted file mode 100644 index ece87f8e03..0000000000 --- a/qpid/cpp/src/tests/legacystore/jrnl/jtt/jrnl_init_params.h +++ /dev/null @@ -1,80 +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 mrg_jtt_jrnl_init_params_hpp -#define mrg_jtt_jrnl_init_params_hpp - -#include <boost/shared_ptr.hpp> -#include <string> -#include <sys/types.h> - -namespace mrg -{ -namespace jtt -{ - - class jrnl_init_params - { - public: - static const u_int16_t def_num_jfiles; - static const bool def_ae; - static const u_int16_t def_ae_max_jfiles; - static const u_int32_t def_jfsize_sblks; - static const u_int16_t def_wcache_num_pages; - static const u_int32_t def_wcache_pgsize_sblks; - - typedef boost::shared_ptr<jrnl_init_params> shared_ptr; - - private: - std::string _jid; - std::string _jdir; - std::string _base_filename; - u_int16_t _num_jfiles; - bool _ae; - u_int16_t _ae_max_jfiles; - u_int32_t _jfsize_sblks; - u_int16_t _wcache_num_pages; - u_int32_t _wcache_pgsize_sblks; - - public: - jrnl_init_params(const std::string& jid, const std::string& jdir, const std::string& base_filename, - const u_int16_t num_jfiles = def_num_jfiles, const bool ae = def_ae, - const u_int16_t ae_max_jfiles = def_ae_max_jfiles, const u_int32_t jfsize_sblks = def_jfsize_sblks, - const u_int16_t wcache_num_pages = def_wcache_num_pages, - const u_int32_t wcache_pgsize_sblks = def_wcache_pgsize_sblks); - jrnl_init_params(const jrnl_init_params& jp); - jrnl_init_params(const jrnl_init_params* const jp_ptr); - - inline const std::string& jid() const { return _jid; } - inline const std::string& jdir() const { return _jdir; } - inline const std::string& base_filename() const { return _base_filename; } - inline u_int16_t num_jfiles() const { return _num_jfiles; } - inline bool is_ae() const { return _ae; } - inline u_int16_t ae_max_jfiles() const { return _ae_max_jfiles; } - inline u_int32_t jfsize_sblks() const { return _jfsize_sblks; } - inline u_int16_t wcache_num_pages() const { return _wcache_num_pages; } - inline u_int32_t wcache_pgsize_sblks() const { return _wcache_pgsize_sblks; } - }; - -} // namespace jtt -} // namespace mrg - -#endif // ifndef mrg_jtt_jrnl_init_params_hpp diff --git a/qpid/cpp/src/tests/legacystore/jrnl/jtt/jrnl_instance.cpp b/qpid/cpp/src/tests/legacystore/jrnl/jtt/jrnl_instance.cpp deleted file mode 100644 index 339dc1b52c..0000000000 --- a/qpid/cpp/src/tests/legacystore/jrnl/jtt/jrnl_instance.cpp +++ /dev/null @@ -1,439 +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 "jrnl_instance.h" - -#include <cstdlib> -#include "data_src.h" -#include "qpid/legacystore/jrnl/data_tok.h" -#include "qpid/legacystore/jrnl/jerrno.h" -#include "test_case_result.h" - -#define MAX_WR_WAIT 10 // in ms -#define MAX_RD_WAIT 100 // in ms -#define MAX_ENQCAPTHRESH_CNT 1000 // 10s if MAX_WR_WAIT is 10 ms - -namespace mrg -{ -namespace jtt -{ - -jrnl_instance::jrnl_instance(const std::string& jid, const std::string& jdir, const std::string& base_filename, - const u_int16_t num_jfiles, const bool ae, const u_int16_t ae_max_jfiles, const u_int32_t jfsize_sblks, - const u_int16_t wcache_num_pages, const u_int32_t wcache_pgsize_sblks): - mrg::journal::jcntl(jid, jdir, base_filename), - _jpp(new jrnl_init_params(jid, jdir, base_filename, num_jfiles, ae, ae_max_jfiles, jfsize_sblks, - wcache_num_pages, wcache_pgsize_sblks)), - _args_ptr(0), - _dtok_master_enq_list(), - _dtok_master_txn_list(), - _dtok_rd_list(), - _dtok_deq_list(), - _rd_aio_cv(_rd_aio_mutex), - _wr_full_cv(_wr_full_mutex), - _rd_list_cv(_rd_list_mutex), - _deq_list_cv(_deq_list_mutex), - _tcp(), - _tcrp() -{} - -jrnl_instance::jrnl_instance(const jrnl_init_params::shared_ptr& p): - mrg::journal::jcntl(p->jid(), p->jdir(), p->base_filename()), - _jpp(p), - _args_ptr(0), - _dtok_master_enq_list(), - _dtok_master_txn_list(), - _dtok_rd_list(), - _dtok_deq_list(), - _rd_aio_cv(_rd_aio_mutex), - _wr_full_cv(_wr_full_mutex), - _rd_list_cv(_rd_list_mutex), - _deq_list_cv(_deq_list_mutex), - _tcp(), - _tcrp() -{} - -jrnl_instance::~jrnl_instance() {} - - -void -jrnl_instance::init_tc(test_case::shared_ptr& tcp, const args* const args_ptr) throw () -{ - test_case_result::shared_ptr p(new test_case_result(_jpp->jid())); - _tcrp = p; - _args_ptr = args_ptr; - try - { - _tcp = tcp; - _dtok_master_enq_list.clear(); - _dtok_master_txn_list.clear(); - _dtok_rd_list.clear(); - _dtok_deq_list.clear(); - - if (_args_ptr->recover_mode) - { - try - { - u_int64_t highest_rid; - recover(_jpp->num_jfiles(), _jpp->is_ae(), _jpp->ae_max_jfiles(), _jpp->jfsize_sblks(), - _jpp->wcache_num_pages(), _jpp->wcache_pgsize_sblks(), this, - 0, highest_rid); - recover_complete(); - } - catch (const mrg::journal::jexception& e) - { - if (e.err_code() == mrg::journal::jerrno::JERR_JDIR_STAT) - initialize(_jpp->num_jfiles(), _jpp->is_ae(), _jpp->ae_max_jfiles(), _jpp->jfsize_sblks(), - _jpp->wcache_num_pages(), _jpp->wcache_pgsize_sblks(), this); - else - throw; - } - } - else - initialize(_jpp->num_jfiles(), _jpp->is_ae(), _jpp->ae_max_jfiles(), _jpp->jfsize_sblks(), - _jpp->wcache_num_pages(), _jpp->wcache_pgsize_sblks(), this); - } - catch (const mrg::journal::jexception& e) { _tcrp->add_exception(e); } - catch (const std::exception& e) { _tcrp->add_exception(e.what()); } - catch (...) { _tcrp->add_exception("Unknown exception"); } -} - -void -jrnl_instance::run_tc() throw () -{ - _tcrp->set_start_time(); - ::pthread_create(&_enq_thread, 0, run_enq, this); - ::pthread_create(&_read_thread, 0, run_read, this); - ::pthread_create(&_deq_thread, 0, run_deq, this); -} - -void -jrnl_instance::tc_wait_compl() throw () -{ - try - { - ::pthread_join(_deq_thread, 0); - ::pthread_join(_read_thread, 0); - ::pthread_join(_enq_thread, 0); - stop(true); - } - catch (const mrg::journal::jexception& e) { _tcrp->add_exception(e); panic(); } - catch (const std::exception& e) { _tcrp->add_exception(e.what()); panic(); } - catch (...) { _tcrp->add_exception("Unknown exception"); panic(); } - _lpmgr.finalize(); - _tcrp->set_stop_time(); - _tcp->add_result(_tcrp); -} - -void -jrnl_instance::run_enq() throw () -{ - try - { - unsigned sleep_cnt = 0U; - while(_tcrp->num_enq() < _tcp->num_msgs() && !_tcrp->exception()) - { - dtok_ptr p(new mrg::journal::data_tok); - _dtok_master_enq_list.push_back(p); - const char* msgp = data_src::get_data(_tcrp->num_enq() % 10); - const std::size_t msg_size = _tcp->this_data_size(); - const std::size_t xid_size = _tcp->this_xid_size(); - const std::string xid(data_src::get_xid(xid_size)); - const bool external = _tcp->this_external(); - const bool transient = _tcp->this_transience(); - mrg::journal::iores res; - if (xid_size) - { - if (external) - res = enqueue_extern_txn_data_record(msg_size, p.get(), xid, transient); - else - res = enqueue_txn_data_record(msgp, msg_size, msg_size, p.get(), xid, - transient); - } - else - { - if (external) - res = enqueue_extern_data_record(msg_size, p.get(), transient); - else - res = enqueue_data_record(msgp, msg_size, msg_size, p.get(), transient); - } - switch (res) - { - case mrg::journal::RHM_IORES_SUCCESS: - sleep_cnt = 0U; - _tcrp->incr_num_enq(); - if (p->has_xid() && !_tcp->auto_deq()) - commit(p.get()); - break; - case mrg::journal::RHM_IORES_ENQCAPTHRESH: - if (++sleep_cnt > MAX_ENQCAPTHRESH_CNT) - { - _tcrp->add_exception("Timeout waiting for RHM_IORES_ENQCAPTHRESH to clear."); - panic(); - } - else if (get_wr_events(0) == 0) // *** GEV2 - { - mrg::journal::slock sl(_wr_full_mutex); - _wr_full_cv.waitintvl(MAX_WR_WAIT * 1000000); // MAX_WR_WAIT in ms - } - break; - default: - std::ostringstream oss; - oss << "ERROR: enqueue operation in journal \"" << _jid << "\" returned "; - oss << mrg::journal::iores_str(res) << "."; - _tcrp->add_exception(oss.str()); - } - } - flush(true); - } - catch (const mrg::journal::jexception& e) { _tcrp->add_exception(e); panic(); } - catch (const std::exception& e) { _tcrp->add_exception(e.what()); panic(); } - catch (...) { _tcrp->add_exception("Unknown exception"); panic(); } -} - -void -jrnl_instance::run_read() throw () -{ - try - { - read_arg::read_mode_t rd_mode = _args_ptr->read_mode.val(); - if (rd_mode != read_arg::NONE) - { - while (_tcrp->num_rproc() < _tcp->num_msgs() && !_tcrp->exception()) - { - journal::data_tok* dtokp = 0; - { - mrg::journal::slock sl(_rd_list_mutex); - if (_dtok_rd_list.empty()) - _rd_list_cv.wait(); - if (!_dtok_rd_list.empty()) - { - dtokp = _dtok_rd_list.front(); - _dtok_rd_list.pop_front(); - } - } - if (dtokp) - { - _tcrp->incr_num_rproc(); - - bool do_read = true; - if (rd_mode == read_arg::RANDOM) - do_read = 1.0 * std::rand() / RAND_MAX < _args_ptr->read_prob / 100.0; - else if (rd_mode == read_arg::LAZYLOAD) - do_read = _tcrp->num_rproc() >= _args_ptr->lld_skip_num && - _tcrp->num_read() < _args_ptr->lld_rd_num; - bool read_compl = false; - while (do_read && !read_compl && !_tcrp->exception()) - { - void* dptr = 0; - std::size_t dsize = 0; - void* xptr = 0; - std::size_t xsize = 0; - bool tr = false; - bool ext = false; - mrg::journal::iores res = read_data_record(&dptr, dsize, &xptr, xsize, tr, - ext, dtokp); - switch (res) - { - case mrg::journal::RHM_IORES_SUCCESS: - { - mrg::journal::slock sl(_deq_list_mutex); - _dtok_deq_list.push_back(dtokp); - _deq_list_cv.broadcast(); - } - read_compl = true; - _tcrp->incr_num_read(); - - // clean up - if (xsize) - std::free(xptr); - else if (dsize) - std::free(dptr); - dptr = 0; - xptr = 0; - break; - case mrg::journal::RHM_IORES_PAGE_AIOWAIT: - if (get_rd_events(0) == 0) - { - mrg::journal::slock sl(_rd_aio_mutex); - _rd_aio_cv.waitintvl(MAX_RD_WAIT * 1000000); // MAX_RD_WAIT in ms - } - break; - default: - std::ostringstream oss; - oss << "ERROR: read operation in journal \"" << _jid; - oss << "\" returned " << mrg::journal::iores_str(res) << "."; - _tcrp->add_exception(oss.str()); - { - mrg::journal::slock sl(_deq_list_mutex); - _deq_list_cv.broadcast(); // wake up deq thread - } - } - } - } - } - } - } - catch (const mrg::journal::jexception& e) { _tcrp->add_exception(e); panic(); } - catch (const std::exception& e) { _tcrp->add_exception(e.what()); panic(); } - catch (...) { _tcrp->add_exception("Unknown exception"); panic(); } -} - -void -jrnl_instance::run_deq() throw () -{ - try - { - if (_tcp->auto_deq()) - { - while(_tcrp->num_deq() < _tcp->num_msgs() && !_tcrp->exception()) - { - journal::data_tok* dtokp = 0; - { - mrg::journal::slock sl(_deq_list_mutex); - if (_dtok_deq_list.empty()) - _deq_list_cv.wait(); - if (!_dtok_deq_list.empty()) - { - dtokp = _dtok_deq_list.front(); - _dtok_deq_list.pop_front(); - } - } - if (dtokp) - { - mrg::journal::iores res; - if (dtokp->has_xid()) - res = dequeue_txn_data_record(dtokp, dtokp->xid()); - else - res = dequeue_data_record(dtokp); - if (res == mrg::journal::RHM_IORES_SUCCESS) - { - _tcrp->incr_num_deq(); - commit(dtokp); - } - else - { - std::ostringstream oss; - oss << "ERROR: dequeue operation in journal \"" << _jid; - oss << "\" returned " << mrg::journal::iores_str(res) << "."; - _tcrp->add_exception(oss.str()); - } - } - } - flush(true); - } - } - catch (const mrg::journal::jexception& e) { _tcrp->add_exception(e); panic(); } - catch (const std::exception& e) { _tcrp->add_exception(e.what()); panic(); } - catch (...) { _tcrp->add_exception("Unknown exception"); panic(); } -} - -void -jrnl_instance::abort(const mrg::journal::data_tok* dtokp) -{ - txn(dtokp, false); -} - -void -jrnl_instance::commit(const mrg::journal::data_tok* dtokp) -{ - txn(dtokp, true); -} - -void -jrnl_instance::txn(const mrg::journal::data_tok* dtokp, const bool commit) -{ - if (dtokp->has_xid()) - { - mrg::journal::data_tok* p = prep_txn_dtok(dtokp); - mrg::journal::iores res = commit ? txn_commit(p, p->xid()) : txn_abort(p, p->xid()); - if (res != mrg::journal::RHM_IORES_SUCCESS) - { - std::ostringstream oss; - oss << "ERROR: " << (commit ? "commit" : "abort") << " operation in journal \""; - oss << _jid << "\" returned " << mrg::journal::iores_str(res) << "."; - _tcrp->add_exception(oss.str()); - } - } -} - -mrg::journal::data_tok* -jrnl_instance::prep_txn_dtok(const mrg::journal::data_tok* dtokp) -{ - dtok_ptr p(new mrg::journal::data_tok); - _dtok_master_txn_list.push_back(p); - p->set_xid(dtokp->xid()); - return p.get(); -} - -void -jrnl_instance::panic() -{ - // In the event of a panic or exception condition, release all waiting CVs - _rd_aio_cv.broadcast(); - _wr_full_cv.broadcast(); - _rd_list_cv.broadcast(); - _deq_list_cv.broadcast(); -} - -// AIO callbacks - -void -jrnl_instance::wr_aio_cb(std::vector<journal::data_tok*>& dtokl) -{ - for (std::vector<journal::data_tok*>::const_iterator i=dtokl.begin(); i!=dtokl.end(); i++) - { - if ((*i)->wstate() == journal::data_tok::ENQ || (*i)->wstate() == journal::data_tok::DEQ) - { - journal::data_tok* dtokp = *i; - if (dtokp->wstate() == journal::data_tok::ENQ) - { - if (_args_ptr->read_mode.val() == read_arg::NONE) - { - mrg::journal::slock sl(_deq_list_mutex); - _dtok_deq_list.push_back(dtokp); - _deq_list_cv.broadcast(); - } - else - { - mrg::journal::slock sl(_rd_list_mutex); - _dtok_rd_list.push_back(dtokp); - _rd_list_cv.broadcast(); - } - } - else // DEQ - { - mrg::journal::slock sl(_wr_full_mutex); - _wr_full_cv.broadcast(); - } - } - } -} - -void -jrnl_instance::rd_aio_cb(std::vector<u_int16_t>& /*pil*/) -{ - mrg::journal::slock sl(_rd_aio_mutex); - _rd_aio_cv.broadcast(); -} - -} // namespace jtt -} // namespace mrg diff --git a/qpid/cpp/src/tests/legacystore/jrnl/jtt/jrnl_instance.h b/qpid/cpp/src/tests/legacystore/jrnl/jtt/jrnl_instance.h deleted file mode 100644 index 5003f39b24..0000000000 --- a/qpid/cpp/src/tests/legacystore/jrnl/jtt/jrnl_instance.h +++ /dev/null @@ -1,121 +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 mrg_jtt_jrnl_instance_hpp -#define mrg_jtt_jrnl_instance_hpp - -#include "args.h" -#include "jrnl_init_params.h" -#include "test_case.h" - -#include <boost/shared_ptr.hpp> -#include "qpid/legacystore/jrnl/cvar.h" -#include "qpid/legacystore/jrnl/data_tok.h" -#include "qpid/legacystore/jrnl/jcntl.h" -#include "qpid/legacystore/jrnl/slock.h" -#include "qpid/legacystore/jrnl/smutex.h" -#include <list> -#include <vector> - -namespace mrg -{ -namespace jtt -{ - - class jrnl_instance : public mrg::journal::jcntl, public virtual mrg::journal::aio_callback - { - public: - typedef boost::shared_ptr<jrnl_instance> shared_ptr; - typedef boost::shared_ptr<journal::data_tok> dtok_ptr; - - private: - jrnl_init_params::shared_ptr _jpp; - const args* _args_ptr; - std::vector<dtok_ptr> _dtok_master_enq_list; - std::vector<dtok_ptr> _dtok_master_txn_list; - std::list<journal::data_tok*> _dtok_rd_list; - std::list<journal::data_tok*> _dtok_deq_list; - mrg::journal::smutex _rd_aio_mutex; ///< Mutex for read aio wait conditions - mrg::journal::cvar _rd_aio_cv; ///< Condition var for read aio wait conditions - mrg::journal::smutex _wr_full_mutex; ///< Mutex for write full conditions - mrg::journal::cvar _wr_full_cv; ///< Condition var for write full conditions - mrg::journal::smutex _rd_list_mutex; ///< Mutex for _dtok_rd_list - mrg::journal::cvar _rd_list_cv; ///< Condition var for _dtok_rd_list - mrg::journal::smutex _deq_list_mutex; ///< Mutex for _dtok_deq_list - mrg::journal::cvar _deq_list_cv; ///< Condition var for _dtok_deq_list - pthread_t _enq_thread; - pthread_t _deq_thread; - pthread_t _read_thread; - test_case::shared_ptr _tcp; - test_case_result::shared_ptr _tcrp; - - public: - jrnl_instance(const std::string& jid, const std::string& jdir, - const std::string& base_filename, - const u_int16_t num_jfiles = jrnl_init_params::def_num_jfiles, - const bool ae = jrnl_init_params::def_ae, - const u_int16_t ae_max_jfiles = jrnl_init_params::def_ae_max_jfiles, - const u_int32_t jfsize_sblks = jrnl_init_params::def_jfsize_sblks, - const u_int16_t wcache_num_pages = jrnl_init_params::def_wcache_num_pages, - const u_int32_t wcache_pgsize_sblks = jrnl_init_params::def_wcache_pgsize_sblks); - jrnl_instance(const jrnl_init_params::shared_ptr& params); - virtual ~jrnl_instance(); - - inline const jrnl_init_params::shared_ptr& params() const { return _jpp; } - inline const std::string& jid() const { return _jpp->jid(); } - - void init_tc(test_case::shared_ptr& tcp, const args* const args_ptr) throw (); - void run_tc() throw (); - void tc_wait_compl() throw (); - - // AIO callbacks - virtual void wr_aio_cb(std::vector<journal::data_tok*>& dtokl); - virtual void rd_aio_cb(std::vector<u_int16_t>& pil); - - private: - void run_enq() throw (); - inline static void* run_enq(void* p) - { static_cast<jrnl_instance*>(p)->run_enq(); return 0; } - - void run_read() throw (); - inline static void* run_read(void* p) - { static_cast<jrnl_instance*>(p)->run_read(); return 0; } - - void run_deq() throw (); - inline static void* run_deq(void* p) - { static_cast<jrnl_instance*>(p)->run_deq(); return 0; } - - void abort(const mrg::journal::data_tok* dtokp); - void commit(const mrg::journal::data_tok* dtokp); - void txn(const mrg::journal::data_tok* dtokp, const bool commit); - mrg::journal::data_tok* prep_txn_dtok(const mrg::journal::data_tok* dtokp); - - void panic(); - -// // static callbacks -// static void aio_rd_callback(jcntl* journal, std::vector<u_int16_t>& pil); -// static void aio_wr_callback(jcntl* journal, std::vector<journal::data_tok*>& dtokl); - }; - -} // namespace jtt -} // namespace mrg - -#endif // ifndef mrg_jtt_jrnl_instance_hpp diff --git a/qpid/cpp/src/tests/legacystore/jrnl/jtt/jtt.csv b/qpid/cpp/src/tests/legacystore/jrnl/jtt/jtt.csv deleted file mode 100644 index df523e3f97..0000000000 --- a/qpid/cpp/src/tests/legacystore/jrnl/jtt/jtt.csv +++ /dev/null @@ -1,234 +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. -# - -,,,,,,,"Msg size",,"Xid size",,,,,"enq-size",,"deq-size",,"txn-size",, -"Test #","tf","pf","amn","mn incr","#msgs","ms incr","Min","Max","Min","Max","auto-deq","transient","extern","bytes","dblks","bytes","dblks","bytes","dblks","comment" -,,,,,,,,,,,,,,,,,,,, -"Initialize only",,,,,,,,,,,,,,,,,,,, -0,"L",0,0,0,0,0,0,0,0,0,FALSE,FALSE,FALSE,44,1,0,0,0,0,"No messages - journal creation/initialization only" -,,,,,,,,,,,,,,,,,,,, -"Simple message combinations of persistent/deq transientueued/non-dequeued, transactional/non-transactional",,,,,,,,,,,,,,,,,,,, -1,"L",1,1,0,1,0,10,10,0,0,FALSE,FALSE,FALSE,54,1,0,0,0,0,"1 * 10-byte message" -2,"L",1,10,0,10,0,10,10,0,0,FALSE,FALSE,FALSE,54,1,0,0,0,0,"10 * 10-byte message" -3,"L",1,1,0,1,0,10,10,0,0,FALSE,TRUE,FALSE,54,1,0,0,0,0,"1 * 10-byte message [transient]" -4,"L",1,10,0,10,0,10,10,0,0,FALSE,TRUE,FALSE,54,1,0,0,0,0,"10 * 10-byte message [transient]" -5,"L",1,1,0,1,0,10,10,10,10,FALSE,FALSE,FALSE,64,1,0,0,0,0,"1 * 10-byte message [txn]" -6,"L",1,10,0,10,0,10,10,10,10,FALSE,FALSE,FALSE,64,1,0,0,0,0,"10 * 10-byte message [txn]" -7,"L",1,1,0,1,0,10,10,10,10,FALSE,TRUE,FALSE,64,1,0,0,0,0,"1 * 10-byte message [txn transient]" -8,"L",1,10,0,10,0,10,10,10,10,FALSE,TRUE,FALSE,64,1,0,0,0,0,"10 * 10-byte message [txn transient]" -9,"L",1,1,0,1,0,10,10,0,0,TRUE,FALSE,FALSE,54,1,32,1,0,0,"1 * 10-byte message [deq]" -10,"L",1,10,0,10,0,10,10,0,0,TRUE,FALSE,FALSE,54,1,32,1,0,0,"10 * 10-byte message [deq]" -11,"L",1,1,0,1,0,10,10,0,0,TRUE,TRUE,FALSE,54,1,32,1,0,0,"1 * 10-byte message [deq transient]" -12,"L",1,10,0,10,0,10,10,0,0,TRUE,TRUE,FALSE,54,1,32,1,0,0,"10 * 10-byte message [deq transient]" -13,"L",1,1,0,1,0,10,10,10,10,TRUE,FALSE,FALSE,64,1,54,1,46,1,"1 * 10-byte message [deq txn]" -14,"L",1,10,0,10,0,10,10,10,10,TRUE,FALSE,FALSE,64,1,54,1,46,1,"10 * 10-byte message [deq txn]" -15,"L",1,1,0,1,0,10,10,10,10,TRUE,TRUE,FALSE,64,1,54,1,46,1,"1 * 10-byte message [txn deq transient]" -16,"L",1,10,0,10,0,10,10,10,10,TRUE,TRUE,FALSE,64,1,54,1,46,1,"10 * 10-byte message [txn deq transient]" -17,"L",1,1,0,1,0,10,10,0,0,FALSE,FALSE,TRUE,54,1,0,0,0,0,"1 * 10-byte message [extern]" -18,"L",1,10,0,10,0,10,10,0,0,FALSE,FALSE,TRUE,54,1,0,0,0,0,"10 * 10-byte message [extern]" -19,"L",1,1,0,1,0,10,10,0,0,FALSE,TRUE,TRUE,54,1,0,0,0,0,"1 * 10-byte message [transient extern]" -20,"L",1,10,0,10,0,10,10,0,0,FALSE,TRUE,TRUE,54,1,0,0,0,0,"10 * 10-byte message [transient extern]" -21,"L",1,1,0,1,0,10,10,10,10,FALSE,FALSE,TRUE,64,1,0,0,0,0,"1 * 10-byte message [txn extern]" -22,"L",1,10,0,10,0,10,10,10,10,FALSE,FALSE,TRUE,64,1,0,0,0,0,"10 * 10-byte message [txn extern]" -23,"L",1,1,0,1,0,10,10,10,10,FALSE,TRUE,TRUE,64,1,0,0,0,0,"1 * 10-byte message [txn transient extern]" -24,"L",1,10,0,10,0,10,10,10,10,FALSE,TRUE,TRUE,64,1,0,0,0,0,"10 * 10-byte message [txn transient extern]" -25,"L",1,1,0,1,0,10,10,0,0,TRUE,FALSE,TRUE,54,1,32,1,0,0,"1 * 10-byte message [deq extern]" -26,"L",1,10,0,10,0,10,10,0,0,TRUE,FALSE,TRUE,54,1,32,1,0,0,"10 * 10-byte message [deq extern]" -27,"L",1,1,0,1,0,10,10,0,0,TRUE,TRUE,TRUE,54,1,32,1,0,0,"1 * 10-byte message [deq transient extern]" -28,"L",1,10,0,10,0,10,10,0,0,TRUE,TRUE,TRUE,54,1,32,1,0,0,"10 * 10-byte message [deq transient extern]" -29,"L",1,1,0,1,0,10,10,10,10,TRUE,FALSE,TRUE,64,1,54,1,46,1,"1 * 10-byte message [deq txn extern]" -30,"L",1,10,0,10,0,10,10,10,10,TRUE,FALSE,TRUE,64,1,54,1,46,1,"10 * 10-byte message [deq txn extern]" -31,"L",1,1,0,1,0,10,10,10,10,TRUE,TRUE,TRUE,64,1,54,1,46,1,"1 * 10-byte message [txn deq transient extern]" -32,"L",1,10,0,10,0,10,10,10,10,TRUE,TRUE,TRUE,64,1,54,1,46,1,"10 * 10-byte message [txn deq transient extern]" -,,,,,,,,,,,,,,,,,,,, -"Transition from one d-block to two per message",,,,,,,,,,,,,,,,,,,, -33,"L",1,10,0,10,0,84,84,0,0,FALSE,FALSE,FALSE,128,1,0,0,0,0,"1 dblk exact fit" -34,"L",1,10,0,10,1,85,85,0,0,FALSE,FALSE,FALSE,129,2,0,0,0,0,"1 dblk + 1 byte" -35,"L",1,10,0,10,0,58,58,26,26,FALSE,FALSE,FALSE,128,1,0,0,0,0,"1 dblk exact fit [txn]" -36,"L",1,10,0,10,1,59,59,26,26,FALSE,FALSE,FALSE,129,2,0,0,0,0,"1 dblk + 1 byte [txn]" -,,,,,,,,,,,,,,,,,,,, -"Transition from one s-block to two per message",,,,,,,,,,,,,,,,,,,, -37,"L",1,10,0,10,0,468,468,0,0,FALSE,FALSE,FALSE,512,4,0,0,0,0,"1 sblk exact fit" -38,"L",1,10,0,10,1,469,469,0,0,FALSE,FALSE,FALSE,513,5,0,0,0,0,"1 sblk + 1 byte" -39,"L",1,10,0,10,0,442,442,26,26,FALSE,FALSE,FALSE,512,4,0,0,0,0,"1 sblk exact fit [txn]" -40,"L",1,10,0,10,1,443,443,26,26,FALSE,FALSE,FALSE,513,5,0,0,0,0,"1 sblk + 1 byte [txn]" -,,,,,,,,,,,,,,,,,,,, -"Transition from first page to second",,,,,,,,,,,,,,,,,,,, -41,"L",1,8,0,8,0,4052,4052,0,0,FALSE,FALSE,FALSE,4096,32,0,0,0,0,"1/8 page" -42,"L",1,8,1,9,0,4052,4052,0,0,FALSE,FALSE,FALSE,4096,32,0,0,0,0,"1/8 page" -43,"L",1,8,0,8,1,4053,4053,0,0,FALSE,FALSE,FALSE,4097,33,0,0,0,0,"1/8 page + 1 byte" -44,"L",1,8,0,8,0,3796,3796,256,256,FALSE,FALSE,FALSE,4096,32,0,0,0,0,"1/8 page [txn]" -45,"L",1,8,1,9,0,3796,3796,256,256,FALSE,FALSE,FALSE,4096,32,0,0,0,0,"1/8 page [txn]" -46,"L",1,8,0,8,1,3797,3797,256,256,FALSE,FALSE,FALSE,4097,33,0,0,0,0,"1/8 page + 1 byte [txn]" -47,"L",1,8,0,8,0,3924,3924,0,0,TRUE,FALSE,FALSE,3968,31,32,1,0,0,"1/8 page incl deq [deq]" -48,"L",1,8,1,9,0,3924,3924,0,0,TRUE,FALSE,FALSE,3968,31,32,1,0,0,"1/8 page incl deq [deq]" -49,"L",1,8,0,8,1,3925,3925,0,0,TRUE,FALSE,FALSE,3969,32,32,1,0,0,"1/8 page incl deq + 1 byte [deq]" -50,"L",1,8,0,8,0,3028,3028,256,256,TRUE,FALSE,FALSE,3328,26,300,3,292,3,"1/8 page incl deq & txn [deq txn]" -51,"L",1,8,1,9,0,3028,3028,256,256,TRUE,FALSE,FALSE,3328,26,300,3,292,3,"1/8 page incl deq & txn [deq txn]" -52,"L",1,8,0,8,1,3029,3029,256,256,TRUE,FALSE,FALSE,3329,27,300,3,292,3,"1/8 page incl deq & txn + 1 byte [deq txn]" -,,,,,,,,,,,,,,,,,,,, -"Page cache rollover (from page 32 back to page 0)",,,,,,,,,,,,,,,,,,,, -53,"L",1,32,0,32,0,32724,32724,0,0,FALSE,FALSE,FALSE,32768,256,0,0,0,0,"1 page" -54,"L",1,32,1,33,0,32724,32724,0,0,FALSE,FALSE,FALSE,32768,256,0,0,0,0,"1 page" -55,"L",1,32,0,32,1,32725,32725,0,0,FALSE,FALSE,FALSE,32769,257,0,0,0,0,"1 page + 1 byte" -56,"L",1.5,22,0,22,0,49108,49108,0,0,FALSE,FALSE,FALSE,49152,384,0,0,0,0,"1.5 pages" -57,"L",1,32,0,32,0,32468,32468,256,256,FALSE,FALSE,FALSE,32768,256,0,0,0,0,"1 page [txn]" -58,"L",1,32,1,33,0,32468,32468,256,256,FALSE,FALSE,FALSE,32768,256,0,0,0,0,"1 page [txn]" -59,"L",1,32,0,32,1,32469,32469,256,256,FALSE,FALSE,FALSE,32769,257,0,0,0,0,"1 page + 1 byte [txn]" -60,"L",1.5,22,0,22,0,48852,48852,256,256,FALSE,FALSE,FALSE,49152,384,0,0,0,0,"1.5 pages [txn]" -61,"L",1,32,0,32,0,32596,32596,0,0,TRUE,FALSE,FALSE,32640,255,32,1,0,0,"1 page incl deq [deq]" -62,"L",1,32,1,33,0,32596,32596,0,0,TRUE,FALSE,FALSE,32640,255,32,1,0,0,"1 page incl deq [deq]" -63,"L",1,32,0,32,1,32597,32597,0,0,TRUE,FALSE,FALSE,32641,256,32,1,0,0,"1 page incl deq + 1 byte [deq]" -64,"L",1.5,22,0,22,0,48980,48980,0,0,TRUE,FALSE,FALSE,49024,383,32,1,0,0,"1.5 pages incl deq [deq]" -65,"L",1,32,0,32,0,31700,31700,256,256,TRUE,FALSE,FALSE,32000,250,300,3,292,3,"1 page incl deq & txn [deq txn]" -66,"L",1,32,1,33,0,31700,31700,256,256,TRUE,FALSE,FALSE,32000,250,300,3,292,3,"1 page incl deq & txn [deq txn]" -67,"L",1,32,0,32,1,31701,31701,256,256,TRUE,FALSE,FALSE,32001,251,300,3,292,3,"1 page incl deq & txn + 1 byte [deq txn]" -68,"L",1.5,22,0,22,0,48084,48084,256,256,TRUE,FALSE,FALSE,48384,378,300,3,292,3,"1.5 pages incl deq & txn [deq txn]" -,,,,,,,,,,,,,,,,,,,, -"File transition (from file 0000 to 0001)",,,,,,,,,,,,,,,,,,,, -69,"L",1,48,0,48,0,32724,32724,0,0,FALSE,FALSE,FALSE,32768,256,0,0,0,0,"1 page" -70,"L",1,48,1,49,0,32724,32724,0,0,FALSE,FALSE,FALSE,32768,256,0,0,0,0,"1 page" -71,"L",1,48,0,48,1,32725,32725,0,0,FALSE,FALSE,FALSE,32769,257,0,0,0,0,"1 page + 1 byte" -72,"L",2.5,20,0,20,0,81876,81876,0,0,FALSE,FALSE,FALSE,81920,640,0,0,0,0,"2.5 pages" -73,"L",1,48,0,48,0,32468,32468,256,256,FALSE,FALSE,FALSE,32768,256,0,0,0,0,"1 page [txn]" -74,"L",1,48,1,49,0,32468,32468,256,256,FALSE,FALSE,FALSE,32768,256,0,0,0,0,"1 page [txn]" -75,"L",1,48,0,48,1,32469,32469,256,256,FALSE,FALSE,FALSE,32769,257,0,0,0,0,"1 page + 1 byte [txn]" -76,"L",2.5,20,0,20,0,81620,81620,256,256,FALSE,FALSE,FALSE,81920,640,0,0,0,0,"2.5 pages [txn]" -77,"L",1,48,0,48,0,32596,32596,0,0,TRUE,FALSE,FALSE,32640,255,32,1,0,0,"1 page incl deq [deq]" -78,"L",1,48,1,49,0,32596,32596,0,0,TRUE,FALSE,FALSE,32640,255,32,1,0,0,"1 page incl deq [deq]" -79,"L",1,48,0,48,1,32597,32597,0,0,TRUE,FALSE,FALSE,32641,256,32,1,0,0,"1 page incl deq + 1 byte [deq]" -80,"L",2.5,20,0,20,0,81748,81748,0,0,TRUE,FALSE,FALSE,81792,639,32,1,0,0,"2.5 pages incl deq [deq]" -81,"L",1,48,0,48,0,31700,31700,256,256,TRUE,FALSE,FALSE,32000,250,300,3,292,3,"1 page incl deq & txn [deq txn]" -82,"L",1,48,1,49,0,31700,31700,256,256,TRUE,FALSE,FALSE,32000,250,300,3,292,3,"1 page incl deq & txn [deq txn]" -83,"L",1,48,0,48,1,31701,31701,256,256,TRUE,FALSE,FALSE,32001,251,300,3,292,3,"1 page incl deq & txn + 1 byte [deq txn]" -84,"L",2.5,20,0,20,0,80852,80852,256,256,TRUE,FALSE,FALSE,81152,634,300,3,292,3,"2.5 pages incl deq & txn [deq txn]" -,,,,,,,,,,,,,,,,,,,, -"File rollover (from file 0007 to 0000) - RHM_WRONLY req'd for auto-dequeue == FALSE",,,,,,,,,,,,,,,,,,,, -85,"L",0.5,16,0,16,0,786260,786260,0,0,TRUE,FALSE,FALSE,786304,6143,32,1,0,0,"24 pages incl deq = ½ file [deq]" -86,"L",0.5,16,1,17,0,786260,786260,0,0,TRUE,FALSE,FALSE,786304,6143,32,1,0,0,"24 pages incl deq = ½ file [deq]" -87,"L",0.5,16,0,16,1,786261,786261,0,0,TRUE,FALSE,FALSE,786305,6144,32,1,0,0,"24 pages incl deq + 1 byte [deq]" -88,"L",0.5,16,0,16,0,785364,785364,256,256,TRUE,FALSE,FALSE,785664,6138,300,3,292,3,"24 pages incl deq & txn = ½ file [deq txn]" -89,"L",0.5,16,1,17,0,785364,785364,256,256,TRUE,FALSE,FALSE,785664,6138,300,3,292,3,"24 pages incl deq & txn = ½ file [deq txn]" -90,"L",0.5,16,0,16,1,785365,785365,256,256,TRUE,FALSE,FALSE,785665,6139,300,3,292,3,"24 pages incl deq & txn + 1 byte [deq txn]" -91,"L",0.25,32,0,32,0,786260,786260,0,0,TRUE,FALSE,FALSE,786304,6143,32,1,0,0,"24 pages incl deq = ½ file [deq]" -92,"L",0.25,32,1,33,0,786260,786260,0,0,TRUE,FALSE,FALSE,786304,6143,32,1,0,0,"24 pages incl deq = ½ file [deq]" -93,"L",0.25,32,0,32,1,786261,786261,0,0,TRUE,FALSE,FALSE,786305,6144,32,1,0,0,"24 pages incl deq + 1 byte [deq]" -94,"L",0.25,32,0,32,0,785364,785364,256,256,TRUE,FALSE,FALSE,785664,6138,300,3,292,3,"24 pages incl deq & txn = ½ file [deq txn]" -95,"L",0.25,32,1,33,0,785364,785364,256,256,TRUE,FALSE,FALSE,785664,6138,300,3,292,3,"24 pages incl deq & txn = ½ file [deq txn]" -96,"L",0.25,32,0,32,1,785365,785365,256,256,TRUE,FALSE,FALSE,785665,6139,300,3,292,3,"24 pages incl deq & txn + 1 byte [deq txn]" -,,,,,,,,,,,,,,,,,,,, -"Multi-page messages (large messages) - tests various paths in encoder.",,,,,,,,,,,,,,,,,,,, -97,"L",1,16,0,16,0,32724,32724,0,0,FALSE,FALSE,FALSE,32768,256,0,0,0,0,"data 1 page" -98,"L",1,16,0,16,1,32725,32725,0,0,FALSE,FALSE,FALSE,32769,257,0,0,0,0,"data 1 page + 1 byte (tail split; 1 byte over page boundary)" -99,"L",1,16,0,16,11,32735,32735,0,0,FALSE,FALSE,FALSE,32779,257,0,0,0,0,"data 1 page + 11 bytes (tail split; 11 bytes over page boundary)" -100,"L",1,16,0,16,12,32736,32736,0,0,FALSE,FALSE,FALSE,32780,257,0,0,0,0,"data 1 page + 12 bytes (tail separated exactly onto next page)" -101,"L",1,16,0,16,13,32737,32737,0,0,FALSE,FALSE,FALSE,32781,257,0,0,0,0,"data 1 page + 13 bytes (data split; 1 byte over page boundary)" -102,"L",1,16,0,16,0,32468,32468,256,256,FALSE,FALSE,FALSE,32768,256,0,0,0,0,"data 1 page [txn]" -103,"L",1,16,0,16,1,32469,32469,256,256,FALSE,FALSE,FALSE,32769,257,0,0,0,0,"data 1 page + 1 byte (tail split; 1 byte over page boundary) [txn]" -104,"L",1,16,0,16,11,32479,32479,256,256,FALSE,FALSE,FALSE,32779,257,0,0,0,0,"data 1 page + 11 bytes (tail split; 11 bytes over page boundary) [txn]" -105,"L",1,16,0,16,12,32480,32480,256,256,FALSE,FALSE,FALSE,32780,257,0,0,0,0,"data 1 page + 12 bytes (tail separated exactly onto next page) [txn]" -106,"L",1,16,0,16,13,32481,32481,256,256,FALSE,FALSE,FALSE,32781,257,0,0,0,0,"data 1 page + 13 bytes (data split; 1 byte over page boundary) [txn]" -107,"L",2,16,0,16,0,65492,65492,0,0,FALSE,FALSE,FALSE,65536,512,0,0,0,0,"data 2 pages" -108,"L",2,16,0,16,1,65493,65493,0,0,FALSE,FALSE,FALSE,65537,513,0,0,0,0,"data 2 pages + 1 byte (tail split; 1 byte over page boundary)" -109,"L",2,16,0,16,11,65503,65503,0,0,FALSE,FALSE,FALSE,65547,513,0,0,0,0,"data 2 pages + 11 bytes (tail split; 11 bytes over page boundary)" -110,"L",2,16,0,16,12,65504,65504,0,0,FALSE,FALSE,FALSE,65548,513,0,0,0,0,"data 2 pages + 12 bytes (tail separated exactly onto next page)" -111,"L",2,16,0,16,13,65505,65505,0,0,FALSE,FALSE,FALSE,65549,513,0,0,0,0,"data 2 pages + 13 bytes (data split; 1 byte over page boundary)" -112,"L",2,16,0,16,0,65236,65236,256,256,FALSE,FALSE,FALSE,65536,512,0,0,0,0,"data 2 pages [txn]" -113,"L",2,16,0,16,1,65237,65237,256,256,FALSE,FALSE,FALSE,65537,513,0,0,0,0,"data 2 pages + 1 byte (tail split; 1 byte over page boundary) [txn]" -114,"L",2,16,0,16,11,65247,65247,256,256,FALSE,FALSE,FALSE,65547,513,0,0,0,0,"data 2 pages + 11 bytes (tail split; 11 bytes over page boundary) [txn]" -115,"L",2,16,0,16,12,65248,65248,256,256,FALSE,FALSE,FALSE,65548,513,0,0,0,0,"data 2 pages + 12 bytes (tail separated exactly onto next page) [txn]" -116,"L",2,16,0,16,13,65249,65249,256,256,FALSE,FALSE,FALSE,65549,513,0,0,0,0,"data 2 pages + 13 bytes (data split; 1 byte over page boundary) [txn]" -117,"L",4,16,0,16,0,131028,131028,0,0,FALSE,FALSE,FALSE,131072,1024,0,0,0,0,"data 4 pages" -118,"L",4,16,0,16,1,131029,131029,0,0,FALSE,FALSE,FALSE,131073,1025,0,0,0,0,"data 4 pages + 1 byte (tail split; 1 byte over page boundary)" -119,"L",4,16,0,16,11,131039,131039,0,0,FALSE,FALSE,FALSE,131083,1025,0,0,0,0,"data 4 pages + 11 bytes (tail split; 11 bytes over page boundary)" -120,"L",4,16,0,16,12,131040,131040,0,0,FALSE,FALSE,FALSE,131084,1025,0,0,0,0,"data 4 pages + 12 bytes (tail separated exactly onto next page)" -121,"L",4,16,0,16,13,131041,131041,0,0,FALSE,FALSE,FALSE,131085,1025,0,0,0,0,"data 4 pages + 13 bytes (data split; 1 byte over page boundary)" -122,"L",4,16,0,16,0,130772,130772,256,256,FALSE,FALSE,FALSE,131072,1024,0,0,0,0,"data 4 pages [txn]" -123,"L",4,16,0,16,1,130773,130773,256,256,FALSE,FALSE,FALSE,131073,1025,0,0,0,0,"data 4 pages + 1 byte (tail split; 1 byte over page boundary) [txn]" -124,"L",4,16,0,16,11,130783,130783,256,256,FALSE,FALSE,FALSE,131083,1025,0,0,0,0,"data 4 pages + 11 bytes (tail split; 11 bytes over page boundary) [txn]" -125,"L",4,16,0,16,12,130784,130784,256,256,FALSE,FALSE,FALSE,131084,1025,0,0,0,0,"data 4 pages + 12 bytes (tail separated exactly onto next page) [txn]" -126,"L",4,16,0,16,13,130785,130785,256,256,FALSE,FALSE,FALSE,131085,1025,0,0,0,0,"data 4 pages + 13 bytes (data split; 1 byte over page boundary) [txn]" -127,"L",3.5,16,0,16,0,114644,114644,0,0,FALSE,FALSE,FALSE,114688,896,0,0,0,0,"data 3.5 pages" -128,"L",3.5,16,0,16,1,114645,114645,0,0,FALSE,FALSE,FALSE,114689,897,0,0,0,0,"data 3.5 pages + 1 byte" -129,"L",3.5,16,0,16,0,114388,114388,256,256,FALSE,FALSE,FALSE,114688,896,0,0,0,0,"data 3.5 pages [txn]" -130,"L",3.5,16,0,16,1,114389,114389,256,256,FALSE,FALSE,FALSE,114689,897,0,0,0,0,"data 3.5 pages + 1 byte [txn]" -131,"L",1,16,0,16,-1,10,10,32735,32735,FALSE,FALSE,FALSE,32789,257,0,0,0,0,"xid 1 page – 1 byte; data 10 bytes (exact fit) [txn]" -132,"L",1,16,0,16,0,10,10,32736,32736,FALSE,FALSE,FALSE,32790,257,0,0,0,0,"xid 1 page; data 10 bytes (exact fit) [txn]" -133,"L",1,16,0,16,1,10,10,32737,32737,FALSE,FALSE,FALSE,32791,257,0,0,0,0,"xid 1 page + 1 byte; data 10 bytes (exact fit) [txn]" -134,"L",2,16,0,16,-1,10,10,65503,65503,FALSE,FALSE,FALSE,65557,513,0,0,0,0,"xid 2 pages – 1 byte; data 10 bytes (exact fit) [txn]" -135,"L",2,16,0,16,0,10,10,65504,65504,FALSE,FALSE,FALSE,65558,513,0,0,0,0,"xid 2 pages; data 10 bytes (exact fit) [txn]" -136,"L",2,16,0,16,1,10,10,65505,65505,FALSE,FALSE,FALSE,65559,513,0,0,0,0,"xid 2 pages + 1 byte; data 10 bytes (exact fit) [txn]" -137,"L",4,16,0,16,-1,10,10,131039,131039,FALSE,FALSE,FALSE,131093,1025,0,0,0,0,"xid 4 pages – 1 byte; data 10 bytes (exact fit) [txn]" -138,"L",4,16,0,16,0,10,10,131040,131040,FALSE,FALSE,FALSE,131094,1025,0,0,0,0,"xid 4 pages; data 10 bytes (exact fit) [txn]" -139,"L",4,16,0,16,1,10,10,131041,131041,FALSE,FALSE,FALSE,131095,1025,0,0,0,0,"xid 4 pages + 1 byte; data 10 bytes (exact fit) [txn]" -140,"L",3.5,16,0,16,0,10,10,114656,114656,FALSE,FALSE,FALSE,114710,897,0,0,0,0,"xid 3.5 pages; data 10 bytes (exact fit) [txn]" -141,"L",3.5,16,0,16,1,10,10,114657,114657,FALSE,FALSE,FALSE,114711,897,0,0,0,0,"xid 3.5 pages + 1 byte; data 10 bytes (exact fit) [txn]" -142,"L",1,16,0,16,-1,10,10,32735,32735,TRUE,FALSE,FALSE,32789,257,32779,257,32771,257,"xid 1 page – 1 byte for enq rec; data 10 bytes (exact fit) [deq, txn]" -143,"L",1,16,0,16,0,10,10,32736,32736,TRUE,FALSE,FALSE,32790,257,32780,257,32772,257,"xid 1 page for enq rec; data 10 bytes (exact fit) [deq, txn]" -144,"L",1,16,0,16,1,10,10,32737,32737,TRUE,FALSE,FALSE,32791,257,32781,257,32773,257,"xid 1 page + 1 byte for enq rec; data 10 bytes (exact fit) [deq, txn]" -145,"L",2,16,0,16,-1,10,10,65503,65503,TRUE,FALSE,FALSE,65557,513,65547,513,65539,513,"xid 2 pages – 1 byte for enq rec; data 10 bytes (exact fit) [deq, txn]" -146,"L",2,16,0,16,0,10,10,65504,65504,TRUE,FALSE,FALSE,65558,513,65548,513,65540,513,"xid 2 pages for enq rec; data 10 bytes (exact fit) [deq, txn]" -147,"L",2,16,0,16,1,10,10,65505,65505,TRUE,FALSE,FALSE,65559,513,65549,513,65541,513,"xid 2 pages + 1 byte for enq rec; data 10 bytes (exact fit) [deq, txn]" -148,"L",4,16,0,16,-1,10,10,131039,131039,TRUE,FALSE,FALSE,131093,1025,131083,1025,131075,1025,"xid 4 pages – 1 byte for enq rec; data 10 bytes (exact fit) [deq, txn]" -149,"L",4,16,0,16,0,10,10,131040,131040,TRUE,FALSE,FALSE,131094,1025,131084,1025,131076,1025,"xid 4 pages for enq rec; data 10 bytes (exact fit) [deq, txn]" -150,"L",4,16,0,16,1,10,10,131041,131041,TRUE,FALSE,FALSE,131095,1025,131085,1025,131077,1025,"xid 4 pages + 1 byte for enq rec; data 10 bytes (exact fit) [deq, txn]" -151,"L",3.5,16,0,16,0,10,10,114656,114656,TRUE,FALSE,FALSE,114710,897,114700,897,114692,897,"xid 3.5 pages for enq rec; data 10 bytes (exact fit) [deq, txn]" -152,"L",3.5,16,0,16,1,10,10,114657,114657,TRUE,FALSE,FALSE,114711,897,114701,897,114693,897,"xid 3.5 pages + 1 byte for enq rec; data 10 bytes (exact fit) [deq, txn]" -153,"L",1,16,0,16,-1,10,10,32735,32735,TRUE,FALSE,FALSE,32789,257,32779,257,32771,257,"xid 1 page – 1 byte for deq rec; data 10 bytes (exact fit) [deq, txn]" -154,"L",1,16,0,16,0,10,10,32736,32736,TRUE,FALSE,FALSE,32790,257,32780,257,32772,257,"xid 1 page for deq rec; data 10 bytes (exact fit) [deq, txn]" -155,"L",1,16,0,16,1,10,10,32737,32737,TRUE,FALSE,FALSE,32791,257,32781,257,32773,257,"xid 1 page + 1 byte for deq rec; data 10 bytes (exact fit) [deq, txn]" -156,"L",2,16,0,16,-1,10,10,65503,65503,TRUE,FALSE,FALSE,65557,513,65547,513,65539,513,"xid 2 pages – 1 byte for deq rec; data 10 bytes (exact fit) [deq, txn]" -157,"L",2,16,0,16,0,10,10,65504,65504,TRUE,FALSE,FALSE,65558,513,65548,513,65540,513,"xid 2 pages for deq rec; data 10 bytes (exact fit) [deq, txn]" -158,"L",2,16,0,16,1,10,10,65505,65505,TRUE,FALSE,FALSE,65559,513,65549,513,65541,513,"xid 2 pages + 1 byte for deq rec; data 10 bytes (exact fit) [deq, txn]" -159,"L",4,16,0,16,-1,10,10,131039,131039,TRUE,FALSE,FALSE,131093,1025,131083,1025,131075,1025,"xid 4 pages – 1 byte for deq rec; data 10 bytes (exact fit) [deq, txn]" -160,"L",4,16,0,16,0,10,10,131040,131040,TRUE,FALSE,FALSE,131094,1025,131084,1025,131076,1025,"xid 4 pages for deq rec; data 10 bytes (exact fit) [deq, txn]" -161,"L",4,16,0,16,1,10,10,131041,131041,TRUE,FALSE,FALSE,131095,1025,131085,1025,131077,1025,"xid 4 pages + 1 byte for deq rec; data 10 bytes (exact fit) [deq, txn]" -162,"L",3.5,16,0,16,0,10,10,114656,114656,TRUE,FALSE,FALSE,114710,897,114700,897,114692,897,"xid 3.5 pages for deq rec; data 10 bytes (exact fit) [deq, txn]" -163,"L",3.5,16,0,16,1,10,10,114657,114657,TRUE,FALSE,FALSE,114711,897,114701,897,114693,897,"xid 3.5 pages + 1 byte for deq rec; data 10 bytes (exact fit) [deq, txn]" -164,"L",1,16,0,16,-1,10,10,32743,32743,TRUE,FALSE,FALSE,32797,257,32787,257,32779,257,"xid 1 page – 1 byte for txn rec; data 10 bytes (exact fit) [deq, txn]" -165,"L",1,16,0,16,0,10,10,32744,32744,TRUE,FALSE,FALSE,32798,257,32788,257,32780,257,"xid 1 page for txn rec; data 10 bytes (exact fit) [deq, txn]" -166,"L",1,16,0,16,1,10,10,32745,32745,TRUE,FALSE,FALSE,32799,257,32789,257,32781,257,"xid 1 page + 1 byte for txn rec; data 10 bytes (exact fit) [deq, txn]" -167,"L",2,16,0,16,-1,10,10,65511,65511,TRUE,FALSE,FALSE,65565,513,65555,513,65547,513,"xid 2 pages – 1 byte for txn rec; data 10 bytes (exact fit) [deq, txn]" -168,"L",2,16,0,16,0,10,10,65512,65512,TRUE,FALSE,FALSE,65566,513,65556,513,65548,513,"xid 2 pages for txn rec; data 10 bytes (exact fit) [deq, txn]" -169,"L",2,16,0,16,1,10,10,65513,65513,TRUE,FALSE,FALSE,65567,513,65557,513,65549,513,"xid 2 pages + 1 byte for txn rec; data 10 bytes (exact fit) [deq, txn]" -170,"L",4,16,0,16,-1,10,10,131047,131047,TRUE,FALSE,FALSE,131101,1025,131091,1025,131083,1025,"xid 4 pages – 1 byte for txn rec; data 10 bytes (exact fit) [deq, txn]" -171,"L",4,16,0,16,0,10,10,131048,131048,TRUE,FALSE,FALSE,131102,1025,131092,1025,131084,1025,"xid 4 pages for txn rec; data 10 bytes (exact fit) [deq, txn]" -172,"L",4,16,0,16,1,10,10,131049,131049,TRUE,FALSE,FALSE,131103,1025,131093,1025,131085,1025,"xid 4 pages + 1 byte for txn rec; data 10 bytes (exact fit) [deq, txn]" -173,"L",3.5,16,0,16,0,10,10,114664,114664,TRUE,FALSE,FALSE,114718,897,114708,897,114700,897,"xid 3.5 pages for txn rec; data 10 bytes (exact fit) [deq, txn]" -174,"L",3.5,16,0,16,1,10,10,114665,114665,TRUE,FALSE,FALSE,114719,897,114709,897,114701,897,"xid 3.5 pages + 1 byte for txn rec; data 10 bytes (exact fit) [deq, txn]" -,,,,,,,,,,,,,,,,,,,, -"High volume tests of random message lengths - RHM_WRONLY req'd for auto-dequeue == FALSE",,,,,,,,,,,,,,,,,,,, -#175,"M",1,5000000,0,5000000,0,0,84,0,0,TRUE,FALSE,FALSE,128,1,32,1,0,0,"1 dblk max [deq]" -#176,"M",3,3000000,0,3000000,0,0,340,0,0,TRUE,FALSE,FALSE,384,3,32,1,0,0,"3 dblks max [deq]" -#177,"M",10,1600000,0,1600000,0,0,1236,0,0,TRUE,FALSE,FALSE,1280,10,32,1,0,0,"10 dblks max [deq]" -#178,"M",30,600000,0,600000,0,0,3796,0,0,TRUE,FALSE,FALSE,3840,30,32,1,0,0,"30 dblks max [deq]" -#179,"M",100,200000,0,200000,0,0,12756,0,0,TRUE,FALSE,FALSE,12800,100,32,1,0,0,"100 dblks max [deq]" -#180,"M",300,60000,0,60000,0,0,38356,0,0,TRUE,FALSE,FALSE,38400,300,32,1,0,0,"300 dblks max [deq]" -#181,"M",1000,20000,0,20000,0,0,127956,0,0,TRUE,FALSE,FALSE,128000,1000,32,1,0,0,"1000 dblks max [deq]" -#182,"M",1,5000000,0,5000000,0,0,100,1,100,TRUE,FALSE,FALSE,244,2,144,2,136,2,"100 bytes xid max + 100 bytes data max [deq txn]" -#183,"M",3,3000000,0,3000000,0,0,300,1,300,TRUE,FALSE,FALSE,644,6,344,3,336,3,"300 bytes xid max + 300 bytes data max [deq txn]" -#184,"M",10,1600000,0,1600000,0,0,1000,1,1000,TRUE,FALSE,FALSE,2044,16,1044,9,1036,9,"1000 bytes xid max + 1000 bytes data max [deq txn]" -#185,"M",30,600000,0,600000,0,0,3000,1,3000,TRUE,FALSE,FALSE,6044,48,3044,24,3036,24,"3000 bytes xid max + 3000 bytes data max [deq txn]" -#186,"M",100,200000,0,200000,0,0,10000,1,10000,TRUE,FALSE,FALSE,20044,157,10044,79,10036,79,"10000 bytes xid max + 10000 bytes data max [deq txn]" -#187,"M",300,60000,0,60000,0,0,30000,1,30000,TRUE,FALSE,FALSE,60044,470,30044,235,30036,235,"30000 bytes xid max + 30000 bytes data max [deq txn]" -#188,"M",1000,20000,0,20000,0,0,100000,1,100000,TRUE,FALSE,FALSE,200044,1563,100044,782,100036,782,"100000 bytes xid max + 100000 bytes data max [deq txn]" -,,,,,,,,,,,,,,,,,,,, -"STANDARD PERFORMANCE BENCHMARK: 10,000,000 writes, data=212b (2 dblks)",,,,,,,,,,,,,,,,,,,, -#189,"M",1,10000000,0,10000000,0,212,212,0,0,TRUE,FALSE,FALSE,256,2,32,1,0,0,"212 bytes data (2 dblks enq + 1 dblk deq)" -#190,"M",1,10000000,0,10000000,0,148,148,64,64,TRUE,FALSE,FALSE,256,2,108,1,100,1,"148 bytes data + 64 bytes xid (2 dblks enq + 1 dblks deq + 1 dblks txn)" diff --git a/qpid/cpp/src/tests/legacystore/jrnl/jtt/main.cpp b/qpid/cpp/src/tests/legacystore/jrnl/jtt/main.cpp deleted file mode 100644 index c8a4642b1c..0000000000 --- a/qpid/cpp/src/tests/legacystore/jrnl/jtt/main.cpp +++ /dev/null @@ -1,57 +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_mgr.h" - -#include "args.h" -#include <csignal> -#include <iostream> - -#define PACKAGE_NAME "Journal Test Tool" -#define VERSION "0.1" - -namespace po = boost::program_options; - -int main(int argc, char** argv) -{ - std::signal(SIGINT, mrg::jtt::test_mgr::signal_handler); - std::signal(SIGTERM, mrg::jtt::test_mgr::signal_handler); - - std::cout << PACKAGE_NAME << " v." << VERSION << std::endl; - - std::ostringstream oss; - oss << PACKAGE_NAME << " options"; - mrg::jtt::args args(oss.str()); - if (args.parse(argc, argv)) return 1; - - try - { - mrg::jtt::test_mgr tm(args); - tm.run(); - if (tm.error()) return 2; // One or more tests threw exceptions - } - catch (const std::exception& e) - { - std::cerr << e.what() << std::endl; - return 3; - } - return 0; -} diff --git a/qpid/cpp/src/tests/legacystore/jrnl/jtt/read_arg.cpp b/qpid/cpp/src/tests/legacystore/jrnl/jtt/read_arg.cpp deleted file mode 100644 index 94a07c7005..0000000000 --- a/qpid/cpp/src/tests/legacystore/jrnl/jtt/read_arg.cpp +++ /dev/null @@ -1,93 +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 "read_arg.h" - -#include <cassert> -#include <boost/program_options.hpp> -namespace po = boost::program_options; - -namespace mrg -{ -namespace jtt -{ -std::map<std::string, read_arg::read_mode_t> read_arg::_map; -std::string read_arg::_description; -const bool read_arg::init = __init(); - -// static init fn -bool -read_arg::__init() -{ - // Set string versions of each enum option here - _map["NONE"] = NONE; - _map["ALL"] = ALL; - _map["RANDOM"] = RANDOM; - _map["LAZYLOAD"] = LAZYLOAD; - _description = "Determines if and when messages will be read prior to dequeueing. " - "Values: (NONE | ALL | RANDOM | LAZYLOAD)"; - return true; -} - -void -read_arg::parse(const std::string& str) -{ - std::map<std::string, read_arg::read_mode_t>::const_iterator i = _map.find(str); - if (i == _map.end()) - throw po::invalid_option_value(str); - _rm = i->second; -} - -// static fn -const std::string& -read_arg::str(const read_mode_t rm) -{ - std::map<std::string, read_mode_t>::const_iterator i = _map.begin(); - while (i->second != rm && i != _map.end()) i++; - assert(i != _map.end()); - return i->first; -} - -// static fn -const std::string& -read_arg::descr() -{ - return _description; -} - -std::ostream& -operator<<(std::ostream& os, const read_arg& ra) -{ - os << ra.str(); - return os; -} - -std::istream& -operator>>(std::istream& is, read_arg& ra) -{ - std::string s; - is >> s; - ra.parse(s); - return is; -} - -} // namespace jtt -} // namespace mrg diff --git a/qpid/cpp/src/tests/legacystore/jrnl/jtt/read_arg.h b/qpid/cpp/src/tests/legacystore/jrnl/jtt/read_arg.h deleted file mode 100644 index a8fd6f198e..0000000000 --- a/qpid/cpp/src/tests/legacystore/jrnl/jtt/read_arg.h +++ /dev/null @@ -1,62 +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 mrg_jtt_read_arg_hpp -#define mrg_jtt_read_arg_hpp - -#include <string> -#include <map> - -namespace mrg -{ -namespace jtt -{ - -class read_arg -{ - public: - enum read_mode_t { NONE, ALL, RANDOM, LAZYLOAD}; - private: - static std::map<std::string, read_mode_t> _map; - static std::string _description; - static const bool init; - static bool __init(); - read_mode_t _rm; - public: - inline read_arg() : _rm(NONE) {} - inline read_arg(read_mode_t rm) : _rm(rm) {} - - inline read_mode_t val() const { return _rm; } - inline void set_val(const read_mode_t rm) { _rm = rm; } - void parse(const std::string& str); - - inline const std::string& str() const { return str(_rm); } - static const std::string& str(const read_mode_t rm); - static const std::string& descr(); - - friend std::ostream& operator<<(std::ostream& os, const read_arg& ra); - friend std::istream& operator>>(std::istream& is, read_arg& ra); -}; - -} // namespace jtt -} // namespace mrg - -#endif // ifndef mrg_jtt_read_arg_hpp diff --git a/qpid/cpp/src/tests/legacystore/jrnl/jtt/test_case.cpp b/qpid/cpp/src/tests/legacystore/jrnl/jtt/test_case.cpp deleted file mode 100644 index e06e053504..0000000000 --- a/qpid/cpp/src/tests/legacystore/jrnl/jtt/test_case.cpp +++ /dev/null @@ -1,179 +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_case.h" - -#include <cstdlib> -#include <iomanip> -#include <sstream> - -namespace mrg -{ -namespace jtt -{ - -test_case::test_case(const unsigned test_case_num, const u_int32_t num_msgs, - const std::size_t min_data_size, const std::size_t max_data_size, const bool auto_deq, - const std::size_t min_xid_size, const std::size_t max_xid_size, const transient_t transient, - const external_t external, const std::string& comment): - _test_case_num(test_case_num), - _num_msgs(num_msgs), - _min_data_size(min_data_size), - _max_data_size(max_data_size), - _auto_dequeue(auto_deq), - _min_xid_size(min_xid_size), - _max_xid_size(max_xid_size), - _transient(transient), - _external(external), - _comment(comment), - _result_average(), - _result_jmap() -{} - -test_case::~test_case() -{} - -std::size_t -test_case::this_data_size() const -{ - if (_min_data_size == _max_data_size) - return _max_data_size; - std::size_t size_diff = _max_data_size - _min_data_size; - return _min_data_size + std::size_t(1.0 * std::rand() * size_diff/(RAND_MAX + 1.0)); -} - -std::size_t -test_case::this_xid_size() const -{ - // TODO: rework when probabilities are introduced. Assume 50% if _min_xid_size = 0 - if (_max_xid_size == 0) - return std::size_t(0); - if (_min_xid_size == 0) - { - if (1.0 * std::rand() / RAND_MAX < 0.5) - return std::size_t(0); - } - std::size_t size_diff = _max_xid_size - _min_xid_size; - return _min_xid_size + std::size_t(1.0 * std::rand() * size_diff/(RAND_MAX + 1.0)); -} - -bool -test_case::this_transience() const -{ - // TODO: rework when probabilities are introduced. Assume 50% if JTT_RANDOM - if (_transient == JTT_TRANSIENT) - return false; - if (_transient == JTT_PERSISTNET) - return true; - return 1.0 * std::rand() / RAND_MAX < 0.5; -} - -bool -test_case::this_external() const -{ - // TODO: rework when probabilities are introduced. Assume 50% if JDL_RANDOM - if (_external == JDL_INTERNAL) - return false; - if (_external == JDL_EXTERNAL) - return true; - return 1.0 * std::rand() / RAND_MAX < 0.5; -} - -void -test_case::add_result(test_case_result::shared_ptr& tcrp) -{ - _result_average.add_test_result(tcrp); - res_map_citr ari = _result_jmap.find(tcrp->jid()); - if (ari == _result_jmap.end()) - { - test_case_result_agregation::shared_ptr p(new test_case_result_agregation(tcrp->jid())); - p->add_test_result(tcrp); - _result_jmap.insert(res_map_pair(tcrp->jid(), p)); - } - else - ari->second->add_test_result(tcrp); -} - -void -test_case::set_fmt_chk_res(const bool res, const std::string& jid) -{ - _result_average.set_fmt_chk_res(res); - res_map_citr ari = _result_jmap.find(jid); - if (ari != _result_jmap.end()) - ari->second->set_fmt_chk_res(res); -} - -const test_case_result::shared_ptr -test_case::jmap_last(std::string& jid) const -{ - res_map_citr i = _result_jmap.find(jid); - if (i == _result_jmap.end()) - return test_case_result::shared_ptr(); - u_int32_t num_res = (*i).second->num_results(); - if (num_res) - return (*(*i).second)[num_res - 1]; - return test_case_result::shared_ptr(); -} - -void -test_case::clear() -{ - _result_average.clear(); - _result_jmap.clear(); -} - -const std::string -test_case::str() const -{ - std::ostringstream oss; - oss << "Test Parameters: Test case no. " << _test_case_num << ":" << std::endl; - oss << " Comment: " << _comment << std::endl; - oss << " Number of messages: " << _num_msgs << std::endl; - oss << " Data size: " << _min_data_size; - if (_min_data_size == _max_data_size) - oss << " bytes (fixed)" << std::endl; - else - oss << " - " << _max_data_size << " bytes" << std::endl; - oss << " XID size: " << _min_xid_size; - if (_min_xid_size == _max_xid_size) - oss << " bytes (fixed)" << std::endl; - else - oss << " - " << _max_xid_size << " bytes" << std::endl; - oss << " Auto-dequeue: " << (_auto_dequeue ? "true" : "false") << std::endl; - oss << " Persistence: "; - switch (_transient) - { - case JTT_TRANSIENT: oss << "TRANSIENT" << std::endl; break; - case JTT_PERSISTNET: oss << "PERSISTNET" << std::endl; break; - case JTT_RANDOM: oss << "RANDOM" << std::endl; break; - } - oss << " Message Data: "; - switch (_external) - { - case JDL_INTERNAL: oss << "INTERNAL"; break; - case JDL_EXTERNAL: oss << "EXTERNAL"; break; - case JDL_RANDOM: oss << "RANDOM"; break; - } - return oss.str(); -} - -} // namespace jtt -} // namespace mrg diff --git a/qpid/cpp/src/tests/legacystore/jrnl/jtt/test_case.h b/qpid/cpp/src/tests/legacystore/jrnl/jtt/test_case.h deleted file mode 100644 index f72dd05f0c..0000000000 --- a/qpid/cpp/src/tests/legacystore/jrnl/jtt/test_case.h +++ /dev/null @@ -1,110 +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 mrg_jtt_test_case_hpp -#define mrg_jtt_test_case_hpp - -#include <boost/shared_ptr.hpp> -#include <cstddef> -#include <map> -#include "test_case_result.h" -#include "test_case_result_agregation.h" -#include <vector> - -namespace mrg -{ -namespace jtt -{ - - class test_case - { - public: - enum transient_type { JTT_TRANSIENT = 0, JTT_PERSISTNET, JTT_RANDOM }; - typedef transient_type transient_t; - - enum data_location { JDL_INTERNAL = 0, JDL_EXTERNAL, JDL_RANDOM }; - typedef data_location external_t; - - typedef boost::shared_ptr<test_case> shared_ptr; - - typedef std::map<std::string, test_case_result_agregation::shared_ptr> res_map; - typedef std::pair<std::string, test_case_result_agregation::shared_ptr> res_map_pair; - typedef res_map::const_iterator res_map_citr; - - private: - unsigned _test_case_num; - u_int32_t _num_msgs; - std::size_t _min_data_size; - std::size_t _max_data_size; - bool _auto_dequeue; - // TODO: add probability of transaction to these params - std::size_t _min_xid_size; - std::size_t _max_xid_size; - // TODO: change these enums (transient_t & external_t) to probabilities - transient_t _transient; - external_t _external; - std::string _comment; - - test_case_result_agregation _result_average; // overall average result - res_map _result_jmap; // map of per-journal averages - - public: - test_case(const unsigned test_case_num, const u_int32_t num_msgs, - const std::size_t min_data_size, const std::size_t max_data_size, - const bool auto_deq, const std::size_t min_xid_size, - const std::size_t max_xid_size, const transient_t transient, - const external_t external, const std::string& comment); - virtual ~test_case(); - - inline unsigned test_case_num() const { return _test_case_num; } - inline u_int32_t num_msgs() const { return _num_msgs; } - inline std::size_t min_data_size() const { return _min_data_size; } - inline std::size_t max_data_size() const { return _max_data_size; } - std::size_t this_data_size() const; - inline bool auto_deq() const { return _auto_dequeue; } - inline std::size_t min_xid_size() const { return _min_xid_size; } - inline std::size_t max_xid_size() const { return _max_xid_size; } - std::size_t this_xid_size() const; - inline transient_t transient() const { return _transient; } - bool this_transience() const; - inline external_t external() const { return _external; } - bool this_external() const; - inline const std::string& comment() const { return _comment; } - - void add_result(test_case_result::shared_ptr& p); - void set_fmt_chk_res(const bool res, const std::string& jid); - - inline const test_case_result_agregation& average() const { return _result_average; } - inline u_int32_t num_results() const { return _result_average.num_results(); } - inline unsigned num_jrnls() const { return _result_jmap.size(); } - inline res_map_citr jrnl_average(std::string& jid) const { return _result_jmap.find(jid); } - inline res_map_citr jmap_begin() const { return _result_jmap.begin(); } - inline res_map_citr jmap_end() const { return _result_jmap.end(); } - const test_case_result::shared_ptr jmap_last(std::string& jid) const; - - void clear(); - const std::string str() const; - }; - -} // namespace jtt -} // namespace mrg - -#endif // ifndef mrg_jtt_test_case_hpp diff --git a/qpid/cpp/src/tests/legacystore/jrnl/jtt/test_case_result.cpp b/qpid/cpp/src/tests/legacystore/jrnl/jtt/test_case_result.cpp deleted file mode 100644 index 2f88f265a5..0000000000 --- a/qpid/cpp/src/tests/legacystore/jrnl/jtt/test_case_result.cpp +++ /dev/null @@ -1,201 +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_case_result.h" - -#include <iomanip> -#include <sstream> - -namespace mrg -{ -namespace jtt -{ - -test_case_result::test_case_result(const std::string& jid): - _jid(jid), - _num_enq(0), - _num_deq(0), - _num_read(0), - _num_rproc(0), - _start_time(), - _stop_time(), - _stopped(false), - _test_time(), - _exception_list() -{} - -test_case_result::~test_case_result() -{} - -const std::string -test_case_result::test_time_str() const -{ - return _test_time.str(9); -} - -void -test_case_result::add_exception(const journal::jexception& e, const bool set_stop_time_flag) -{ - if (!_stopped && set_stop_time_flag) - { - set_stop_time(); - _stopped = true; - } - _exception_list.push_back(e.what()); -} - -void -test_case_result::add_exception(const std::string& err_str, const bool set_stop_time_flag) -{ - if (!_stopped && set_stop_time_flag) - { - set_stop_time(); - _stopped = true; - } - _exception_list.push_back(err_str); -} - -void -test_case_result::add_exception(const char* err_str, const bool set_stop_time_flag) -{ - if (!_stopped && set_stop_time_flag) - { - set_stop_time(); - _stopped = true; - } - _exception_list.push_back(err_str); -} - -void -test_case_result::clear() -{ - _num_enq = 0; - _num_deq = 0; - _num_read = 0; - _start_time.set_zero(); - _stop_time.set_zero(); - _test_time.set_zero(); - _exception_list.clear(); -} - -const std::string -test_case_result::str(const bool summary) const -{ - std::ostringstream oss; - if (summary) - { - oss << _jid << ":"; - oss << str_summary(); - if (_exception_list.size()) - oss << "; fail: " << _exception_list[0] << std::endl; - else - oss << "; ok" << std::endl; - } - else - { - oss << "--- Journal instance: jid=\"" << _jid << "\" ---" << std::endl; - oss << str_full(); - if (_exception_list.size()) - oss << " exception/error:" << _exception_list[0] << std::endl; - } - return oss.str(); -} - -const std::string -test_case_result::str_full() const -{ - const double t = _test_time.tv_sec + (_test_time.tv_nsec/1e9); - const bool no_exception = _exception_list.empty(); - std::ostringstream oss; - oss.setf(std::ios::fixed, std::ios::floatfield); - oss.precision(2); - if (no_exception) - { - oss.precision(6); - oss << " total test time: " << t << "s" << std::endl; - } - oss.precision(3); - oss << " total number enqueues: " << _num_enq; - if (no_exception) - oss << " (" << (_num_enq / t) << " enq/sec)"; - oss << std::endl; - oss << " total number dequeues: " << _num_deq; - if (no_exception) - oss << " (" << (_num_deq / t) << " deq/sec)"; - oss << std::endl; - oss << "total write operations: " << (_num_enq + _num_deq); - if (no_exception) - oss << " (" << ((_num_enq + _num_deq) / t) << " wrops/sec)"; - oss << std::endl; - oss << " total number reads: " << _num_read; - if (no_exception) - oss << " (" << (_num_read / t) << " rd/sec)"; - oss << std::endl; - oss << " total operations: " << (_num_enq + _num_deq + _num_read); - if (no_exception) - oss << " (" << ((_num_enq + _num_deq + _num_read) / t) << " ops/sec)"; - oss << std::endl; - oss << " overall result: " << (no_exception ? "PASS" : "*** FAIL ***") << std::endl; - return oss.str(); -} - -const std::string -test_case_result::str_summary() const -{ - const double t = _test_time.tv_sec + (_test_time.tv_nsec/1e9); - const bool no_exception = _exception_list.empty(); - std::ostringstream oss; - oss.setf(std::ios::fixed, std::ios::floatfield); - if (no_exception) - { - oss.precision(6); - oss << " t=" << t << "s;"; - } - else - oss << " exception"; - oss.precision(3); - oss << " enq=" << _num_enq; - if (no_exception) - oss << " (" << (_num_enq / t) << ")"; - oss << "; deq=" << _num_deq; - if (no_exception) - oss << " (" << (_num_deq / t) << ")"; - oss << "; wr=" << (_num_enq + _num_deq); - if (no_exception) - oss << " (" << ((_num_enq + _num_deq) / t) << ")"; - oss << "; rd=" << _num_read; - if (no_exception) - oss << " (" << (_num_read / t) << ")"; - oss << "; tot=" << (_num_enq + _num_deq + _num_read); - if (no_exception) - oss << " (" << ((_num_enq + _num_deq + _num_read) / t) << ")"; - return oss.str(); -} - -void -test_case_result::calc_test_time() -{ - if (!_start_time.is_zero() && _stop_time >= _start_time) - _test_time = _stop_time - _start_time; -} - -} // namespace jtt -} // namespace mrg diff --git a/qpid/cpp/src/tests/legacystore/jrnl/jtt/test_case_result.h b/qpid/cpp/src/tests/legacystore/jrnl/jtt/test_case_result.h deleted file mode 100644 index d15f9d021d..0000000000 --- a/qpid/cpp/src/tests/legacystore/jrnl/jtt/test_case_result.h +++ /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. - * - */ - -#ifndef mrg_jtt_test_case_result_hpp -#define mrg_jtt_test_case_result_hpp - -#include <boost/shared_ptr.hpp> -#include <deque> -#include "qpid/legacystore/jrnl/jexception.h" -#include "qpid/legacystore/jrnl/time_ns.h" -#include <string> - -namespace mrg -{ -namespace jtt -{ - - class test_case_result - { - public: - typedef boost::shared_ptr<test_case_result> shared_ptr; - - typedef std::deque<std::string> elist; - typedef elist::const_iterator elist_citr; - - protected: - std::string _jid; - u_int32_t _num_enq; - u_int32_t _num_deq; - u_int32_t _num_read; // Messages actually read - u_int32_t _num_rproc; // Messages handled by read thread (not all are read) - journal::time_ns _start_time; - journal::time_ns _stop_time; - bool _stopped; - journal::time_ns _test_time; - elist _exception_list; - - public: - test_case_result(const std::string& jid); - virtual ~test_case_result(); - - inline const std::string& jid() const { return _jid; } - inline u_int32_t num_enq() const { return _num_enq; } - inline u_int32_t incr_num_enq() { return ++_num_enq; } - inline u_int32_t num_deq() const { return _num_deq; } - inline u_int32_t incr_num_deq() { return ++_num_deq; } - inline u_int32_t num_read() const { return _num_read; } - inline u_int32_t incr_num_read() { return ++_num_read; } - inline u_int32_t num_rproc() const { return _num_rproc; } - inline u_int32_t incr_num_rproc() { return ++_num_rproc; } - - inline const journal::time_ns& start_time() const { return _start_time; } - inline void set_start_time() { ::clock_gettime(CLOCK_REALTIME, &_start_time); } - inline const journal::time_ns& stop_time() const { return _stop_time; } - inline void set_stop_time() - { ::clock_gettime(CLOCK_REALTIME, &_stop_time); calc_test_time(); } - inline void set_test_time(const journal::time_ns& ts) { _test_time = ts; } - inline const journal::time_ns& test_time() const { return _test_time; } - const std::string test_time_str() const; - - void add_exception(const journal::jexception& e, const bool set_stop_time_flag = true); - void add_exception(const std::string& err_str, const bool set_stop_time_flag = true); - void add_exception(const char* err_str, const bool set_stop_time_flag = true); - inline bool exception() const { return _exception_list.size() > 0; } - inline unsigned exception_count() const { return _exception_list.size(); } - inline elist_citr begin() { return _exception_list.begin(); } - inline elist_citr end() { return _exception_list.end(); } - inline const std::string& operator[](unsigned i) { return _exception_list[i]; } - - void clear(); - const std::string str(const bool summary) const; - - protected: - const std::string str_full() const; - const std::string str_summary() const; - void calc_test_time(); - }; - -} // namespace jtt -} // namespace mrg - -#endif // ifndef mrg_jtt_test_case_result_hpp diff --git a/qpid/cpp/src/tests/legacystore/jrnl/jtt/test_case_result_agregation.cpp b/qpid/cpp/src/tests/legacystore/jrnl/jtt/test_case_result_agregation.cpp deleted file mode 100644 index da439e71e8..0000000000 --- a/qpid/cpp/src/tests/legacystore/jrnl/jtt/test_case_result_agregation.cpp +++ /dev/null @@ -1,185 +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_case_result_agregation.h" - -#include <iomanip> -#include <sstream> - -namespace mrg -{ -namespace jtt -{ - -test_case_result_agregation::test_case_result_agregation(): - test_case_result("Average"), - _tc_average(true), - _fmt_chk_done(false), - _fmt_chk_err(false), - _res_list() -{ -} - -test_case_result_agregation::test_case_result_agregation(const std::string& jid): - test_case_result(jid), - _tc_average(false), - _fmt_chk_done(false), - _fmt_chk_err(false), - _res_list() -{} - -test_case_result_agregation::~test_case_result_agregation() -{} - -void -test_case_result_agregation::add_test_result(const test_case_result::shared_ptr& tcrp) -{ - if (_tc_average || _jid.compare(tcrp->jid()) == 0) - { - _num_enq += tcrp->num_enq(); - _num_deq += tcrp->num_deq(); - _num_read += tcrp->num_read(); - add_test_time(tcrp->test_time()); - _exception_list.insert(_exception_list.end(), tcrp->begin(), tcrp->end()); - _res_list.push_back(tcrp); - } -} - -bool -test_case_result_agregation::exception() const -{ - for (tcrp_list_citr i = _res_list.begin(); i < _res_list.end(); i++) - if ((*i)->exception()) - return true; - return false; -} - -unsigned -test_case_result_agregation::exception_count() const -{ - unsigned cnt = 0; - for (tcrp_list_citr i = _res_list.begin(); i < _res_list.end(); i++) - cnt += (*i)->exception_count(); - return cnt; -} - -void -test_case_result_agregation::clear() -{ - test_case_result::clear(); - _res_list.clear(); -} - -const std::string -test_case_result_agregation::str(const bool last_only, const bool summary) const -{ - std::ostringstream oss; - if (last_only) - oss << " " << _res_list.at(_res_list.size()-1)->str(summary); - else - { - for (tcrp_list_citr i=_res_list.begin(); i!=_res_list.end(); i++) - oss << " " << (*i)->str(summary); - } - if (_res_list.size() > 1) - oss << " " << (summary ? str_summary(last_only) : str_full(last_only)); - return oss.str(); -} - -const std::string -test_case_result_agregation::str_full(const bool /*last_only*/) const -{ - std::ostringstream oss; - oss.precision(2); - if (_tc_average) - oss << "Average across all journal instances:" << std::endl; - else - oss << "Average for jid=\"" << _jid << "\":" << std::endl; - oss << " total number results: " << _res_list.size() << std::endl; - oss << " number exceptions: " << _exception_list.size() << " (" << - (100.0 * _res_list.size() / _exception_list.size()) << "%)" << std::endl; - - oss << test_case_result::str_full(); - - if (_exception_list.size()) - { - unsigned n = 0; - oss << "List of exceptions/errors:" << std::endl; - for (elist_citr i = _exception_list.begin(); i != _exception_list.end(); i++, n++) - oss << " " << n << ". " << (*i) << std::endl; - } - - if (!_tc_average && _res_list.size() > 1) - { - oss << "Individual results:" << std::endl; - for (tcrp_list_citr i=_res_list.begin(); i!=_res_list.end(); i++) - oss << " " << (*i)->str(false) << std::endl; - oss << std::endl; - } - - return oss.str(); -} - -const std::string -test_case_result_agregation::str_summary(const bool /*last_only*/) const -{ - std::ostringstream oss; - if (_tc_average) - oss << "overall average [" << _res_list.size() << "]:"; - else - oss << "average (" << _res_list.size() << "):"; - - oss << test_case_result::str_summary(); - if (_fmt_chk_done) - oss << " fmt-chk=" << (_fmt_chk_err ? "fail" : "ok"); - - if (_exception_list.size()) - { - if (_tc_average) - oss << " fail: " << _exception_list.size() << " exception" - << (_exception_list.size()>1?"s":"") << std::endl; - else - { - if (_exception_list.size() == 1) - oss << " fail: " << *_exception_list.begin() << std::endl; - else - { - oss << std::endl; - unsigned n = 0; - for (elist_citr i = _exception_list.begin(); i != _exception_list.end(); i++, n++) - oss << " " << n << ". " << (*i) << std::endl; - } - } - } - else - oss << " ok" << std::endl; - return oss.str(); -} - -const journal::time_ns& -test_case_result_agregation::add_test_time(const journal::time_ns& t) -{ - _test_time += t; - return _test_time; -} - -} // namespace jtt -} // namespace mrg diff --git a/qpid/cpp/src/tests/legacystore/jrnl/jtt/test_case_result_agregation.h b/qpid/cpp/src/tests/legacystore/jrnl/jtt/test_case_result_agregation.h deleted file mode 100644 index 0b3998176c..0000000000 --- a/qpid/cpp/src/tests/legacystore/jrnl/jtt/test_case_result_agregation.h +++ /dev/null @@ -1,81 +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 mrg_jtt_test_case_result_agregation_hpp -#define mrg_jtt_test_case_result_agregation_hpp - -#include "test_case_result.h" - -#include <iostream> -#include <vector> - -namespace mrg -{ -namespace jtt -{ - - class test_case_result_agregation : public test_case_result - { - public: - typedef boost::shared_ptr<test_case_result_agregation> shared_ptr; - - typedef std::vector<test_case_result::shared_ptr> tcrp_list; - typedef tcrp_list::const_iterator tcrp_list_citr; - - private: - bool _tc_average; - bool _fmt_chk_done; - bool _fmt_chk_err; - tcrp_list _res_list; - - public: - test_case_result_agregation(); // used for average across jrnl instances - test_case_result_agregation(const std::string& jid); - virtual ~test_case_result_agregation(); - - void add_test_result(const test_case_result::shared_ptr& tcrp); - - inline bool tc_average_mode() const { return _tc_average; } - inline bool fmt_chk_done() const { return _fmt_chk_done; } - inline bool fmt_chk_res() const { return _fmt_chk_err; } - inline void set_fmt_chk_res(const bool err) - { _fmt_chk_done = true; _fmt_chk_err |= err; if (err) add_exception("Journal format error"); } - inline u_int32_t num_results() const { return _res_list.size(); } - inline tcrp_list_citr rlist_begin() const { return _res_list.begin(); } - inline tcrp_list_citr rlist_end() const { return _res_list.end(); } - inline const test_case_result::shared_ptr& operator[](unsigned i) const - { return _res_list[i]; } - bool exception() const; - unsigned exception_count() const; - - void clear(); - const std::string str(const bool last_only, const bool summary) const; - - private: - const std::string str_full(const bool last_only) const; - const std::string str_summary(const bool last_only) const; - const journal::time_ns& add_test_time(const journal::time_ns& t); - }; - -} // namespace jtt -} // namespace mrg - -#endif // ifndef mrg_jtt_test_case_result_agregation_hpp diff --git a/qpid/cpp/src/tests/legacystore/jrnl/jtt/test_case_set.cpp b/qpid/cpp/src/tests/legacystore/jrnl/jtt/test_case_set.cpp deleted file mode 100644 index b818d6c7ae..0000000000 --- a/qpid/cpp/src/tests/legacystore/jrnl/jtt/test_case_set.cpp +++ /dev/null @@ -1,169 +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_case_set.h" - -#include <cstdlib> -#include <fstream> -#include <iostream> - -namespace mrg -{ -namespace jtt -{ - -test_case_set::test_case_set(): - _tc_list(), - _csv_ignored(0) -{} - -test_case_set::test_case_set(const std::string& csv_filename, const bool recover_mode, - const csv_map& cols): - _tc_list(), - _csv_ignored(0) -{ - append_from_csv(csv_filename, recover_mode, cols); -} - -test_case_set::~test_case_set() -{} - -void -test_case_set::append(const unsigned test_case_num, const u_int32_t num_msgs, - const std::size_t min_data_size, const std::size_t max_data_size, const bool auto_deq, - const std::size_t min_xid_size, const std::size_t max_xid_size, - const test_case::transient_t transient, const test_case::external_t external, - const std::string& comment) -{ - test_case::shared_ptr tcp(new test_case(test_case_num, num_msgs, min_data_size, - max_data_size, auto_deq, min_xid_size, max_xid_size, transient, external, comment)); - append(tcp); -} - - -#define CSV_BUFF_SIZE 2048 -void -test_case_set::append_from_csv(const std::string& csv_filename, const bool recover_mode, - const csv_map& cols) -{ - char buff[CSV_BUFF_SIZE]; - std::ifstream ifs(csv_filename.c_str()); - while (ifs.good()) - { - ifs.getline(buff, (std::streamsize)CSV_BUFF_SIZE); - if (ifs.gcount()) - { - test_case::shared_ptr tcp = get_tc_from_csv(buff, cols); - if (tcp.get()) - { - if (!recover_mode || tcp->auto_deq()) - append(tcp); - else - _csv_ignored++; - } - } - } -} - -test_case::shared_ptr -test_case_set::get_tc_from_csv(const std::string& csv_line, const csv_map& cols) -{ - unsigned test_case_num = 0; - u_int32_t num_msgs = 0; - std::size_t min_data_size = 0; - std::size_t max_data_size = 0; - bool auto_deq = false; - std::size_t min_xid_size = 0; - std::size_t max_xid_size = 0; - test_case::transient_t transient = test_case::JTT_TRANSIENT; - test_case::external_t external = test_case::JDL_INTERNAL; - std::string comment; - - csv_tok t(csv_line); - unsigned col_num = 0; - for (csv_tok_citr t_itr = t.begin(); t_itr != t.end(); ++t_itr, ++col_num) - { - const std::string& tok = *t_itr; - csv_map_citr m_citr = cols.find(col_num); - if (m_citr != cols.end()) - { - switch (m_citr->second) - { - case CSV_TC_NUM: - if (!tok.size() || tok[0] < '0' || tok[0] > '9') - return test_case::shared_ptr(); - test_case_num = unsigned(std::atol(tok.c_str())); - break; - case CSV_TC_NUM_MSGS: num_msgs = u_int32_t(std::atol(tok.c_str())); break; - case CSV_TC_MIN_DATA_SIZE: min_data_size = std::size_t(std::atol(tok.c_str())); break; - case CSV_TC_MAX_DATA_SIZE: max_data_size = std::size_t(std::atol(tok.c_str())); break; - case CSV_TC_AUTO_DEQ: - if (tok == "TRUE" || tok == "1") - auto_deq = true; - break; - case CSV_TC_MIN_XID_SIZE: min_xid_size = std::size_t(std::atol(tok.c_str())); break; - case CSV_TC_MAX_XID_SIZE: max_xid_size = std::size_t(std::atol(tok.c_str())); break; - case CSV_TC_TRANSIENT: - if (tok == "TRUE" || tok == "1") - transient = test_case::JTT_PERSISTNET; - else if (tok == "RANDOM" || tok == "-1") - transient = test_case::JTT_RANDOM; - break; - case CSV_TC_EXTERNAL: - if (tok == "TRUE" || tok == "1") - external = test_case::JDL_EXTERNAL; - else if (tok == "RANDOM" || tok == "-1") - external = test_case::JDL_RANDOM; - break; - case CSV_TC_COMMENT: comment = *t_itr; break; - } - } - } - if (col_num) - return test_case::shared_ptr(new test_case(test_case_num, num_msgs, min_data_size, - max_data_size, auto_deq, min_xid_size, max_xid_size, transient, external, comment)); - else - return test_case::shared_ptr(); -} - -// Static member initializations -// This csv_map is for use on the standard spreadsheet-derived test case csv files. -test_case_set::csv_map test_case_set::std_csv_map; -const bool test_case_set::_map_init = __init(); - -bool -test_case_set::__init() -{ - std_csv_map.insert(test_case_set::csv_pair(0, test_case_set::CSV_TC_NUM)); - std_csv_map.insert(test_case_set::csv_pair(5, test_case_set::CSV_TC_NUM_MSGS)); - std_csv_map.insert(test_case_set::csv_pair(7, test_case_set::CSV_TC_MIN_DATA_SIZE)); - std_csv_map.insert(test_case_set::csv_pair(8, test_case_set::CSV_TC_MAX_DATA_SIZE)); - std_csv_map.insert(test_case_set::csv_pair(11, test_case_set::CSV_TC_AUTO_DEQ)); - std_csv_map.insert(test_case_set::csv_pair(9, test_case_set::CSV_TC_MIN_XID_SIZE)); - std_csv_map.insert(test_case_set::csv_pair(10, test_case_set::CSV_TC_MAX_XID_SIZE)); - std_csv_map.insert(test_case_set::csv_pair(12, test_case_set::CSV_TC_TRANSIENT)); - std_csv_map.insert(test_case_set::csv_pair(13, test_case_set::CSV_TC_EXTERNAL)); - std_csv_map.insert(test_case_set::csv_pair(20, test_case_set::CSV_TC_COMMENT)); - return true; -} - -} // namespace jtt -} // namespace mrg diff --git a/qpid/cpp/src/tests/legacystore/jrnl/jtt/test_case_set.h b/qpid/cpp/src/tests/legacystore/jrnl/jtt/test_case_set.h deleted file mode 100644 index 94a1ee3172..0000000000 --- a/qpid/cpp/src/tests/legacystore/jrnl/jtt/test_case_set.h +++ /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. - * - */ - -#ifndef mrg_jtt_test_case_set_hpp -#define mrg_jtt_test_case_set_hpp - -#include "test_case.h" - -#include <cstddef> -#include <boost/tokenizer.hpp> -#include <map> -#include <vector> - -namespace mrg -{ -namespace jtt -{ - - class test_case_set - { - public: - enum csv_col_enum { - CSV_TC_NUM = 0, - CSV_TC_NUM_MSGS, - CSV_TC_MIN_DATA_SIZE, - CSV_TC_MAX_DATA_SIZE, - CSV_TC_AUTO_DEQ, - CSV_TC_MIN_XID_SIZE, - CSV_TC_MAX_XID_SIZE, - CSV_TC_TRANSIENT, - CSV_TC_EXTERNAL, - CSV_TC_COMMENT }; - typedef std::pair<unsigned, csv_col_enum> csv_pair; - typedef std::map<unsigned, csv_col_enum> csv_map; - typedef csv_map::const_iterator csv_map_citr; - static csv_map std_csv_map; - - typedef std::vector<test_case::shared_ptr> tcl; - typedef tcl::iterator tcl_itr; - typedef tcl::const_iterator tcl_citr; - - typedef boost::tokenizer<boost::escaped_list_separator<char> > csv_tok; - typedef csv_tok::const_iterator csv_tok_citr; - - private: - tcl _tc_list; - static const bool _map_init; - unsigned _csv_ignored; - - public: - test_case_set(); - test_case_set(const std::string& csv_filename, const bool recover_mode, - const csv_map& cols = std_csv_map); - virtual ~test_case_set(); - - inline unsigned size() const { return _tc_list.size(); } - inline unsigned ignored() const { return _csv_ignored; } - inline bool empty() const { return _tc_list.empty(); } - - inline void append(const test_case::shared_ptr& tc) { _tc_list.push_back(tc); } - void append(const unsigned test_case_num, const u_int32_t num_msgs, - const std::size_t min_data_size, const std::size_t max_data_size, - const bool auto_deq, const std::size_t min_xid_size, - const std::size_t max_xid_size, const test_case::transient_t transient, - const test_case::external_t external, const std::string& comment); - void append_from_csv(const std::string& csv_filename, const bool recover_mode, - const csv_map& cols = std_csv_map); - inline tcl_itr begin() { return _tc_list.begin(); } - inline tcl_itr end() { return _tc_list.end(); } - inline const test_case::shared_ptr& operator[](unsigned i) { return _tc_list[i]; } - inline void clear() { _tc_list.clear(); } - - private: - test_case::shared_ptr get_tc_from_csv(const std::string& csv_line, const csv_map& cols); - static bool __init(); - }; - -} // namespace jtt -} // namespace mrg - -#endif // ifndef mrg_jtt_test_case_set_hpp diff --git a/qpid/cpp/src/tests/legacystore/jrnl/jtt/test_mgr.cpp b/qpid/cpp/src/tests/legacystore/jrnl/jtt/test_mgr.cpp deleted file mode 100644 index de0b5dbfb9..0000000000 --- a/qpid/cpp/src/tests/legacystore/jrnl/jtt/test_mgr.cpp +++ /dev/null @@ -1,218 +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_mgr.h" - -#include <cstdlib> -#include <iostream> -#include <sys/stat.h> -#include "test_case_set.h" - -namespace mrg -{ -namespace jtt -{ - -test_mgr::test_mgr(args& args): - _ji_list(), - _args(args), - _err_flag(false), - _random_fn_ptr(random_fn) -{ - if (_args.seed) - std::srand(_args.seed); -} - -test_mgr::~test_mgr() -{} - -void -test_mgr::run() -{ - // TODO: complete tidy-up of non-summary (verbose) results, then pull through - // a command-line summary to control this. - // Idea: --summary: prints short results afterwards - // --verbose: prints long version as test progresses - // defualt: none of these, similar to current summary = true version. - const bool summary = true; - - std::cout << "CSV file: \"" << _args.test_case_csv_file_name << "\""; - test_case_set tcs(_args.test_case_csv_file_name, _args.recover_mode); - - if (tcs.size()) - { - std::cout << " (found " << tcs.size() << " test case" << (tcs.size() != 1 ? "s" : "") << - ")" << std::endl; - if (tcs.ignored()) - std::cout << "WARNING: " << tcs.ignored() << " test cases were ignored. (All test " - "cases without auto-dequeue are ignored when recover-mode is selected.)" << - std::endl; - _args.print_args(); - } - else if(tcs.ignored()) - { - std::cout << " WARNING: All " << tcs.ignored() << " test case(s) were ignored. (All test " - "cases without auto-dequeue are ignored when recover-mode is selected.)" << - std::endl; - } - else - std::cout << " (WARNING: This CSV file is empty or does not exist.)" << std::endl; - - do - { - unsigned u = 0; - if (_args.randomize) - random_shuffle(tcs.begin(), tcs.end(), _random_fn_ptr); - for (test_case_set::tcl_itr tci = tcs.begin(); tci != tcs.end(); tci++, u++) - { - if (summary) - std::cout << "Test case " << (*tci)->test_case_num() << ": \"" << - (*tci)->comment() << "\"" << std::endl; - else - std::cout << (*tci)->str() << std::endl; - if (!_args.reuse_instance || _ji_list.empty()) - initialize_jrnls(); - for (ji_list_citr jii=_ji_list.begin(); jii!=_ji_list.end(); jii++) - (*jii)->init_tc(*tci, &_args); - for (ji_list_citr jii=_ji_list.begin(); jii!=_ji_list.end(); jii++) - (*jii)->run_tc(); - for (ji_list_citr jii=_ji_list.begin(); jii!=_ji_list.end(); jii++) - (*jii)->tc_wait_compl(); - - if (_args.format_chk) - { - for (ji_list_citr jii=_ji_list.begin(); jii!=_ji_list.end(); jii++) - { - jrnl_init_params::shared_ptr jpp = (*jii)->params(); - std::string ja = _args.jfile_analyzer; - if (ja.empty()) ja = "./jfile_chk.py"; - if (!exists(ja)) - { - std::ostringstream oss; - oss << "ERROR: Validation program \"" << ja << "\" does not exist" << std::endl; - throw std::runtime_error(oss.str()); - } - std::ostringstream oss; - oss << ja << " -b " << jpp->base_filename(); - // TODO: When jfile_check.py can handle previously recovered journals for - // specific tests, then remove this exclusion. - if (!_args.recover_mode) - { - oss << " -c " << _args.test_case_csv_file_name; - oss << " -t " << (*tci)->test_case_num(); - } - oss << " -q " << jpp->jdir(); - bool res = system(oss.str().c_str()) != 0; - (*tci)->set_fmt_chk_res(res, jpp->jid()); - if (res) _err_flag = true; - } - } - - if (!_args.recover_mode && !_args.keep_jrnls) - for (ji_list_citr jii=_ji_list.begin(); jii!=_ji_list.end(); jii++) - try { mrg::journal::jdir::delete_dir((*jii)->jrnl_dir()); } - catch (...) {} // TODO - work out exception strategy for failure here... - - print_results(*tci, summary); - if ((*tci)->average().exception()) - _err_flag = true; - if (_abort || (!_args.repeat_flag && _signal)) - break; - if (_args.pause_secs && tci != tcs.end()) - ::usleep(_args.pause_secs * 1000000); - } - } - while (_args.repeat_flag && !_signal); -} - -// static fn: -void -test_mgr::signal_handler(int sig) -{ - if (_signal) - _abort = true; - _signal = sig; - std::cout << std::endl; - std::cout << "********************************" << std::endl; - std::cout << "Caught signal " << sig << std::endl; - if (_abort) - std::cout << "Aborting..." << std::endl; - else - std::cout << "Completing current test cycle..." << std::endl; - std::cout << "********************************" << std::endl << std::endl; -} - -bool -test_mgr::exists(std::string fname) -{ - struct stat s; - if (::stat(fname.c_str(), &s)) - { - if (errno == ENOENT) // No such dir or file - return false; - // Throw for any other condition - std::ostringstream oss; - oss << "ERROR: test_mgr::exists(): file=\"" << fname << "\": " << FORMAT_SYSERR(errno); - throw std::runtime_error(oss.str()); - } - return true; -} - -void -test_mgr::initialize_jrnls() -{ - _ji_list.clear(); - for (unsigned i=0; i<_args.num_jrnls; i++) - { - std::ostringstream jid; - jid << std::hex << std::setfill('0'); - jid << "test_" << std::setw(4) << std::hex << i; - std::ostringstream jdir; - jdir << _args.journal_dir << "/" << jid.str(); - jrnl_init_params::shared_ptr jpp(new jrnl_init_params(jid.str(), jdir.str(), jid.str())); - jrnl_instance::shared_ptr jip(new jrnl_instance(jpp)); - _ji_list.push_back(jip); - } -} - -void -test_mgr::print_results(test_case::shared_ptr tcp, const bool summary) -{ - if (!summary) - std::cout << " === Results ===" << std::endl; - -// TODO - the reporting is broken when --repeat is used. The following commented-out -// section was an attempt to fix it, but there are too many side-effects. -// for (test_case::res_map_citr i=tcp->jmap_begin(); i!=tcp->jmap_end(); i++) -// std::cout << (*i).second->str(summary, summary); -// if (tcp->num_jrnls() > 1) - std::cout << tcp->average().str(false, summary); - - if (!summary) - std::cout << std::endl; -} - -// static instances -volatile sig_atomic_t test_mgr::_signal = 0; -volatile bool test_mgr::_abort = false; - -} // namespace jtt -} // namespace mrg diff --git a/qpid/cpp/src/tests/legacystore/jrnl/jtt/test_mgr.h b/qpid/cpp/src/tests/legacystore/jrnl/jtt/test_mgr.h deleted file mode 100644 index e608ac6280..0000000000 --- a/qpid/cpp/src/tests/legacystore/jrnl/jtt/test_mgr.h +++ /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. - * - */ - -#ifndef mrg_jtt_test_mgr_hpp -#define mrg_jtt_test_mgr_hpp - -#include "args.h" -#include <csignal> -#include <cstdlib> -#include "jrnl_instance.h" - -namespace mrg -{ -namespace jtt -{ - class test_mgr - { - public: - typedef std::vector<jrnl_instance::shared_ptr> ji_list; - typedef ji_list::iterator ji_list_itr; - typedef ji_list::const_iterator ji_list_citr; - - private: - ji_list _ji_list; - args& _args; - bool _err_flag; - ptrdiff_t (*_random_fn_ptr)(const ptrdiff_t i); - static volatile std::sig_atomic_t _signal; - static volatile bool _abort; - - public: - test_mgr(args& args); - virtual ~test_mgr(); - void run(); - inline bool error() const { return _err_flag; } - - static void signal_handler(int signal); - - private: - static bool exists(std::string file_name); - void initialize_jrnls(); - void print_results(test_case::shared_ptr tcp, const bool summary); - inline static ptrdiff_t random_fn(const ptrdiff_t i) - { return static_cast<ptrdiff_t>(1.0 * i * std::rand() / RAND_MAX); } - }; - -} // namespace jtt -} // namespace mrg - -#endif // ifndef mrg_jtt_test_mgr_hpp diff --git a/qpid/cpp/src/tests/legacystore/jrnl/prof b/qpid/cpp/src/tests/legacystore/jrnl/prof deleted file mode 100755 index 2abe7baa4a..0000000000 --- a/qpid/cpp/src/tests/legacystore/jrnl/prof +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/env 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. -# - -mkdir -p profile -opcontrol --setup --no-vmlinux --separate=library -opcontrol --start -# -- Do stuff here -- -./jtest wtests.csv 264 -# -- End of stuff -- -opcontrol --stop -opcontrol --dump -opcontrol --shutdown -opreport -l ./jtest -opannotate --source --output-dir=profile ./jtest diff --git a/qpid/cpp/src/tests/legacystore/jrnl/run-journal-tests b/qpid/cpp/src/tests/legacystore/jrnl/run-journal-tests deleted file mode 100755 index e169e39c60..0000000000 --- a/qpid/cpp/src/tests/legacystore/jrnl/run-journal-tests +++ /dev/null @@ -1,47 +0,0 @@ -#!/usr/bin/env 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. -# - -if test x${TMP_DATA_DIR} == x; then - export TMP_DATA_DIR=/tmp -fi -fail=0 -num_jrnls=3 - -# Run jtt using default test set -echo -echo "===== Mode 1: New journal instance, no recover =====" -jtt/jtt --analyzer ../../tools/store_chk --jrnl-dir ${TMP_DATA_DIR} --csv jtt/jtt.csv --format-chk --num-jrnls ${num_jrnls} || fail=1 -rm -rf ${TMP_DATA_DIR}/test_0* -echo -echo "===== Mode 2: Re-use journal instance, no recover =====" -jtt/jtt --analyzer ../../tools/store_chk --jrnl-dir ${TMP_DATA_DIR} --csv jtt/jtt.csv --reuse-instance --format-chk --num-jrnls ${num_jrnls} || fail=1 -rm -rf ${TMP_DATA_DIR}/test_0* -echo -echo "===== Mode 3: New journal instance, recover previous test journal =====" -jtt/jtt --analyzer ../../tools/store_chk --jrnl-dir ${TMP_DATA_DIR} --csv jtt/jtt.csv --recover-mode --format-chk --num-jrnls ${num_jrnls} || fail=1 -rm -rf ${TMP_DATA_DIR}/test_0* -echo -echo "===== Mode 4: Re-use journal instance, recover previous test journal =====" -jtt/jtt --analyzer ../../tools/store_chk --jrnl-dir ${TMP_DATA_DIR} --csv jtt/jtt.csv --reuse-instance --recover-mode --format-chk --num-jrnls ${num_jrnls} || fail=1 -rm -rf ${TMP_DATA_DIR}/test_0* -echo - -exit $fail diff --git a/qpid/cpp/src/tests/legacystore/jrnl/tests.ods b/qpid/cpp/src/tests/legacystore/jrnl/tests.ods Binary files differdeleted file mode 100644 index d900374321..0000000000 --- a/qpid/cpp/src/tests/legacystore/jrnl/tests.ods +++ /dev/null diff --git a/qpid/cpp/src/tests/legacystore/persistence.py b/qpid/cpp/src/tests/legacystore/persistence.py deleted file mode 100644 index c4ab712f14..0000000000 --- a/qpid/cpp/src/tests/legacystore/persistence.py +++ /dev/null @@ -1,574 +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. -# - -import sys, re, traceback, socket -from getopt import getopt, GetoptError - -from qpid.connection import Connection -from qpid.util import connect -from qpid.datatypes import Message, RangedSet -from qpid.queue import Empty -from qpid.session import SessionException -from qpid.testlib import TestBase010 -from time import sleep - -class PersistenceTest(TestBase010): - - XA_RBROLLBACK = 1 - XA_RBTIMEOUT = 2 - XA_OK = 0 - - def createMessage(self, **kwargs): - session = self.session - dp = {} - dp['delivery_mode'] = 2 - mp = {} - for k, v in kwargs.iteritems(): - if k in ['routing_key', 'delivery_mode']: dp[k] = v - if k in ['message_id', 'correlation_id', 'application_headers']: mp[k] = v - args = [] - args.append(session.delivery_properties(**dp)) - if len(mp): - args.append(session.message_properties(**mp)) - if kwargs.has_key('body'): args.append(kwargs['body']) - return Message(*args) - - def phase1(self): - session = self.session - - session.queue_declare(queue="queue-a", durable=True) - session.queue_declare(queue="queue-b", durable=True) - session.exchange_bind(queue="queue-a", exchange="amq.direct", binding_key="a") - session.exchange_bind(queue="queue-b", exchange="amq.direct", binding_key="b") - - session.message_transfer(destination="amq.direct", - message=self.createMessage(routing_key="a", correlation_id="Msg0001", body="A_Message1")) - session.message_transfer(destination="amq.direct", - message=self.createMessage(routing_key="b", correlation_id="Msg0002", body="B_Message1")) - -# session.queue_declare(queue="lvq-test", durable=True, arguments={"qpid.last_value_queue":True}) -# session.message_transfer(message=self.createMessage(routing_key="lvq-test", application_headers={"qpid.LVQ_key":"B"}, body="B1")) -# session.message_transfer(message=self.createMessage(routing_key="lvq-test", application_headers={"qpid.LVQ_key":"A"}, body="A1")) -# session.message_transfer(message=self.createMessage(routing_key="lvq-test", application_headers={"qpid.LVQ_key":"A"}, body="A2")) -# session.message_transfer(message=self.createMessage(routing_key="lvq-test", application_headers={"qpid.LVQ_key":"B"}, body="B2")) -# session.message_transfer(message=self.createMessage(routing_key="lvq-test", application_headers={"qpid.LVQ_key":"B"}, body="B3")) -# session.message_transfer(message=self.createMessage(routing_key="lvq-test", application_headers={"qpid.LVQ_key":"C"}, body="C1")) - - - - def phase2(self): - session = self.session - - #check queues exists - session.queue_declare(queue="queue-a", durable=True, passive=True) - session.queue_declare(queue="queue-b", durable=True, passive=True) - - #check they are still bound to amq.direct correctly - responses = [] - responses.append(session.exchange_bound(queue="queue-a", exchange="amq.direct", binding_key="a")) - responses.append(session.exchange_bound(queue="queue-b", exchange="amq.direct", binding_key="b")) - for r in responses: - self.assert_(not r.exchange_not_found) - self.assert_(not r.queue_not_found) - self.assert_(not r.key_not_matched) - - - #check expected messages are there - self.assertMessageOnQueue("queue-a", "Msg0001", "A_Message1") - self.assertMessageOnQueue("queue-b", "Msg0002", "B_Message1") - - self.assertEmptyQueue("queue-a") - self.assertEmptyQueue("queue-b") - - session.queue_declare(queue="queue-c", durable=True) - - #send a message to a topic such that it reaches all queues - session.exchange_bind(queue="queue-a", exchange="amq.topic", binding_key="abc") - session.exchange_bind(queue="queue-b", exchange="amq.topic", binding_key="abc") - session.exchange_bind(queue="queue-c", exchange="amq.topic", binding_key="abc") - - session.message_transfer(destination="amq.topic", - message=self.createMessage(routing_key="abc", correlation_id="Msg0003", body="AB_Message2")) - -# #check LVQ exists and has exepected messages: -# session.queue_declare(queue="lvq-test", durable=True, passive=True) -# session.message_subscribe(destination="lvq", queue="lvq-test") -# lvq = session.incoming("lvq") -# lvq.start() -# accepted = RangedSet() -# for m in ["A2", "B3", "C1"]: -# msg = lvq.get(timeout=1) -# self.assertEquals(m, msg.body) -# accepted.add(msg.id) -# try: -# extra = lvq.get(timeout=1) -# self.fail("lvq-test not empty, contains: " + extra.body) -# except Empty: None -# #publish some more messages while subscriber is active (no replacement): -# session.message_transfer(message=self.createMessage(routing_key="lvq-test", application_headers={"qpid.LVQ_key":"C"}, body="C2")) -# session.message_transfer(message=self.createMessage(routing_key="lvq-test", application_headers={"qpid.LVQ_key":"C"}, body="C3")) -# session.message_transfer(message=self.createMessage(routing_key="lvq-test", application_headers={"qpid.LVQ_key":"A"}, body="A3")) -# session.message_transfer(message=self.createMessage(routing_key="lvq-test", application_headers={"qpid.LVQ_key":"A"}, body="A4")) -# session.message_transfer(message=self.createMessage(routing_key="lvq-test", application_headers={"qpid.LVQ_key":"C"}, body="C4")) -# #check that accepting replaced messages is safe -# session.message_accept(accepted) - - - def phase3(self): - session = self.session - -# #lvq recovery validation -# session.queue_declare(queue="lvq-test", durable=True, passive=True) -# session.message_subscribe(destination="lvq", queue="lvq-test") -# lvq = session.incoming("lvq") -# lvq.start() -# accepted = RangedSet() -# lvq.start() -# for m in ["C4", "A4"]: -# msg = lvq.get(timeout=1) -# self.assertEquals(m, msg.body) -# accepted.add(msg.id) -# session.message_accept(accepted) -# try: -# extra = lvq.get(timeout=1) -# self.fail("lvq-test not empty, contains: " + extra.body) -# except Empty: None -# session.message_cancel(destination="lvq") -# session.queue_delete(queue="lvq-test") - - - #check queues exists - session.queue_declare(queue="queue-a", durable=True, passive=True) - session.queue_declare(queue="queue-b", durable=True, passive=True) - session.queue_declare(queue="queue-c", durable=True, passive=True) - - session.tx_select() - #check expected messages are there - self.assertMessageOnQueue("queue-a", "Msg0003", "AB_Message2") - self.assertMessageOnQueue("queue-b", "Msg0003", "AB_Message2") - self.assertMessageOnQueue("queue-c", "Msg0003", "AB_Message2") - - self.assertEmptyQueue("queue-a") - self.assertEmptyQueue("queue-b") - self.assertEmptyQueue("queue-c") - - #note: default bindings must be restored for this to work - session.message_transfer(message=self.createMessage( - routing_key="queue-a", correlation_id="Msg0004", body="A_Message3")) - session.message_transfer(message=self.createMessage( - routing_key="queue-a", correlation_id="Msg0005", body="A_Message4")) - session.message_transfer(message=self.createMessage( - routing_key="queue-a", correlation_id="Msg0006", body="A_Message5")) - - session.tx_commit() - - - #delete a queue - session.queue_delete(queue="queue-c") - - session.message_subscribe(destination="ctag", queue="queue-a", accept_mode=0) - session.message_flow(destination="ctag", unit=0, value=0xFFFFFFFF) - session.message_flow(destination="ctag", unit=1, value=0xFFFFFFFF) - included = session.incoming("ctag") - msg1 = included.get(timeout=1) - self.assertExpectedContent(msg1, "Msg0004", "A_Message3") - msg2 = included.get(timeout=1) - self.assertExpectedContent(msg2, "Msg0005", "A_Message4") - msg3 = included.get(timeout=1) - self.assertExpectedContent(msg3, "Msg0006", "A_Message5") - self.ack(msg1, msg2, msg3) - - session.message_transfer(destination="amq.direct", message=self.createMessage( - routing_key="queue-b", correlation_id="Msg0007", body="B_Message3")) - - session.tx_rollback() - - - def phase4(self): - session = self.session - - #check queues exists - session.queue_declare(queue="queue-a", durable=True, passive=True) - session.queue_declare(queue="queue-b", durable=True, passive=True) - - self.assertMessageOnQueue("queue-a", "Msg0004", "A_Message3") - self.assertMessageOnQueue("queue-a", "Msg0005", "A_Message4") - self.assertMessageOnQueue("queue-a", "Msg0006", "A_Message5") - - self.assertEmptyQueue("queue-a") - self.assertEmptyQueue("queue-b") - - #check this queue doesn't exist - try: - session.queue_declare(queue="queue-c", durable=True, passive=True) - raise Exception("Expected queue-c to have been deleted") - except SessionException, e: - self.assertEquals(404, e.args[0].error_code) - - def phase5(self): - - session = self.session - queues = ["queue-a1", "queue-a2", "queue-b1", "queue-b2", "queue-c1", "queue-c2", "queue-d1", "queue-d2"] - - for q in queues: - session.queue_declare(queue=q, durable=True) - session.queue_purge(queue=q) - - session.message_transfer(message=self.createMessage( - routing_key="queue-a1", correlation_id="MsgA", body="MessageA")) - session.message_transfer(message=self.createMessage( - routing_key="queue-b1", correlation_id="MsgB", body="MessageB")) - session.message_transfer(message=self.createMessage( - routing_key="queue-c1", correlation_id="MsgC", body="MessageC")) - session.message_transfer(message=self.createMessage( - routing_key="queue-d1", correlation_id="MsgD", body="MessageD")) - - session.dtx_select() - txa = self.xid('a') - txb = self.xid('b') - txc = self.xid('c') - txd = self.xid('d') - - self.txswap("queue-a1", "queue-a2", txa) - self.txswap("queue-b1", "queue-b2", txb) - self.txswap("queue-c1", "queue-c2", txc) - self.txswap("queue-d1", "queue-d2", txd) - - #no queue should have any messages accessible - for q in queues: - self.assertEqual(0, session.queue_query(queue=q).message_count, "Bad count for %s" % (q)) - - self.assertEqual(self.XA_OK, session.dtx_commit(xid=txa, one_phase=True).status) - self.assertEqual(self.XA_OK, session.dtx_rollback(xid=txb).status) - self.assertEqual(self.XA_OK, session.dtx_prepare(xid=txc).status) - self.assertEqual(self.XA_OK, session.dtx_prepare(xid=txd).status) - - #further checks - not_empty = ["queue-a2", "queue-b1"] - for q in queues: - if q in not_empty: - self.assertEqual(1, session.queue_query(queue=q).message_count, "Bad count for %s" % (q)) - else: - self.assertEqual(0, session.queue_query(queue=q).message_count, "Bad count for %s" % (q)) - - - def phase6(self): - session = self.session - - #check prepared transaction are reported correctly by recover - txc = self.xid('c') - txd = self.xid('d') - - xids = session.dtx_recover().in_doubt - ids = [x.global_id for x in xids] #TODO: come up with nicer way to test these - - if txc.global_id not in ids: - self.fail("Recovered xids not as expected. missing: %s" % (txc)) - if txd.global_id not in ids: - self.fail("Recovered xids not as expected. missing: %s" % (txd)) - self.assertEqual(2, len(xids)) - - - queues = ["queue-a1", "queue-a2", "queue-b1", "queue-b2", "queue-c1", "queue-c2", "queue-d1", "queue-d2"] - not_empty = ["queue-a2", "queue-b1"] - - #re-check - not_empty = ["queue-a2", "queue-b1"] - for q in queues: - if q in not_empty: - self.assertEqual(1, session.queue_query(queue=q).message_count, "Bad count for %s" % (q)) - else: - self.assertEqual(0, session.queue_query(queue=q).message_count, "Bad count for %s" % (q)) - - #complete the prepared transactions - self.assertEqual(self.XA_OK, session.dtx_commit(xid=txc).status) - self.assertEqual(self.XA_OK, session.dtx_rollback(xid=txd).status) - not_empty.append("queue-c2") - not_empty.append("queue-d1") - - for q in queues: - if q in not_empty: - self.assertEqual(1, session.queue_query(queue=q).message_count) - else: - self.assertEqual(0, session.queue_query(queue=q).message_count) - - def phase7(self): - session = self.session - session.synchronous = False - - # check xids from phase 6 are gone - txc = self.xid('c') - txd = self.xid('d') - - xids = session.dtx_recover().in_doubt - ids = [x.global_id for x in xids] #TODO: come up with nicer way to test these - - if txc.global_id in ids: - self.fail("Xid still present : %s" % (txc)) - if txd.global_id in ids: - self.fail("Xid still present : %s" % (txc)) - self.assertEqual(0, len(xids)) - - #test deletion of queue after publish - #create queue - session.queue_declare(queue = "q", auto_delete=True, durable=True) - - #send message - for i in range(1, 10): - session.message_transfer(message=self.createMessage(routing_key = "q", body = "my-message")) - - session.synchronous = True - #explicitly delete queue - session.queue_delete(queue = "q") - - #test acking of message from auto-deleted queue - #create queue - session.queue_declare(queue = "q", auto_delete=True, durable=True) - - #send message - session.message_transfer(message=self.createMessage(routing_key = "q", body = "my-message")) - - #create consumer - session.message_subscribe(queue = "q", destination = "a", accept_mode=0, acquire_mode=0) - session.message_flow(unit = 1, value = 0xFFFFFFFF, destination = "a") - session.message_flow(unit = 0, value = 10, destination = "a") - queue = session.incoming("a") - - #consume the message, cancel subscription (triggering auto-delete), then ack it - msg = queue.get(timeout = 5) - session.message_cancel(destination = "a") - self.ack(msg) - - #test implicit deletion of bindings when queue is deleted - session.queue_declare(queue = "durable-subscriber-queue", exclusive=True, durable=True) - session.exchange_bind(exchange="amq.topic", queue="durable-subscriber-queue", binding_key="xyz") - session.message_transfer(destination= "amq.topic", message=self.createMessage(routing_key = "xyz", body = "my-message")) - session.queue_delete(queue = "durable-subscriber-queue") - - #test unbind: - #create a series of bindings to a queue - session.queue_declare(queue = "binding-test-queue", durable=True) - session.exchange_bind(exchange="amq.direct", queue="binding-test-queue", binding_key="abc") - session.exchange_bind(exchange="amq.direct", queue="binding-test-queue", binding_key="pqr") - session.exchange_bind(exchange="amq.direct", queue="binding-test-queue", binding_key="xyz") - session.exchange_bind(exchange="amq.match", queue="binding-test-queue", binding_key="a", arguments={"x-match":"all", "p":"a"}) - session.exchange_bind(exchange="amq.match", queue="binding-test-queue", binding_key="b", arguments={"x-match":"all", "p":"b"}) - session.exchange_bind(exchange="amq.match", queue="binding-test-queue", binding_key="c", arguments={"x-match":"all", "p":"c"}) - #then restart broker... - - - def phase8(self): - session = self.session - - #continue testing unbind: - #send messages to the queue via each of the bindings - for k in ["abc", "pqr", "xyz"]: - data = "first %s" % (k) - session.message_transfer(destination= "amq.direct", message=self.createMessage(routing_key=k, body=data)) - for a in [{"p":"a"}, {"p":"b"}, {"p":"c"}]: - data = "first %s" % (a["p"]) - session.message_transfer(destination="amq.match", message=self.createMessage(application_headers=a, body=data)) - #unbind some bindings (using final 0-10 semantics) - session.exchange_unbind(exchange="amq.direct", queue="binding-test-queue", binding_key="pqr") - session.exchange_unbind(exchange="amq.match", queue="binding-test-queue", binding_key="b") - #send messages again - for k in ["abc", "pqr", "xyz"]: - data = "second %s" % (k) - session.message_transfer(destination= "amq.direct", message=self.createMessage(routing_key=k, body=data)) - for a in [{"p":"a"}, {"p":"b"}, {"p":"c"}]: - data = "second %s" % (a["p"]) - session.message_transfer(destination="amq.match", message=self.createMessage(application_headers=a, body=data)) - - #check that only the correct messages are received - expected = [] - for k in ["abc", "pqr", "xyz"]: - expected.append("first %s" % (k)) - for a in [{"p":"a"}, {"p":"b"}, {"p":"c"}]: - expected.append("first %s" % (a["p"])) - for k in ["abc", "xyz"]: - expected.append("second %s" % (k)) - for a in [{"p":"a"}, {"p":"c"}]: - expected.append("second %s" % (a["p"])) - - session.message_subscribe(queue = "binding-test-queue", destination = "binding-test") - session.message_flow(unit = 1, value = 0xFFFFFFFF, destination = "binding-test") - session.message_flow(unit = 0, value = 10, destination = "binding-test") - queue = session.incoming("binding-test") - - while len(expected): - msg = queue.get(timeout=1) - if msg.body not in expected: - self.fail("Missing message: %s" % msg.body) - expected.remove(msg.body) - try: - msg = queue.get(timeout=1) - self.fail("Got extra message: %s" % msg.body) - except Empty: pass - - - - session.queue_declare(queue = "durable-subscriber-queue", exclusive=True, durable=True) - session.exchange_bind(exchange="amq.topic", queue="durable-subscriber-queue", binding_key="xyz") - session.message_transfer(destination= "amq.topic", message=self.createMessage(routing_key = "xyz", body = "my-message")) - session.queue_delete(queue = "durable-subscriber-queue") - - - def xid(self, txid, branchqual = ''): - return self.session.xid(format=0, global_id=txid, branch_id=branchqual) - - def txswap(self, src, dest, tx): - self.assertEqual(self.XA_OK, self.session.dtx_start(xid=tx).status) - self.session.message_subscribe(destination="temp-swap", queue=src, accept_mode=0) - self.session.message_flow(destination="temp-swap", unit=0, value=1) - self.session.message_flow(destination="temp-swap", unit=1, value=0xFFFFFFFF) - msg = self.session.incoming("temp-swap").get(timeout=1) - self.session.message_cancel(destination="temp-swap") - self.session.message_transfer(message=self.createMessage(routing_key=dest, correlation_id=self.getProperty(msg, 'correlation_id'), - body=msg.body)) - self.ack(msg) - self.assertEqual(self.XA_OK, self.session.dtx_end(xid=tx).status) - - def assertEmptyQueue(self, name): - self.assertEqual(0, self.session.queue_query(queue=name).message_count) - - def assertConnectionException(self, expectedCode, message): - self.assertEqual("connection", message.method.klass.name) - self.assertEqual("close", message.method.name) - self.assertEqual(expectedCode, message.reply_code) - - def assertExpectedMethod(self, reply, klass, method): - self.assertEqual(klass, reply.method.klass.name) - self.assertEqual(method, reply.method.name) - - def assertExpectedContent(self, msg, id, body): - self.assertEqual(id, self.getProperty(msg, 'correlation_id')) - self.assertEqual(body, msg.body) - return msg - - def getProperty(self, msg, name): - for h in msg.headers: - if hasattr(h, name): return getattr(h, name) - return None - - def ack(self, *msgs): - session = self.session - set = RangedSet() - for m in msgs: - set.add(m.id) - #TODO: tidy up completion - session.receiver._completed.add(m.id) - session.message_accept(set) - session.channel.session_completed(session.receiver._completed) - - def assertExpectedGetResult(self, id, body): - return self.assertExpectedContent(session.incoming("incoming-gets").get(timeout=1), id, body) - - def assertEqual(self, expected, actual, msg=''): - if expected != actual: raise Exception("%s expected: %s actual: %s" % (msg, expected, actual)) - - def assertMessageOnQueue(self, queue, id, body): - self.session.message_subscribe(destination="incoming-gets", queue=queue, accept_mode=0) - self.session.message_flow(destination="incoming-gets", unit=0, value=1) - self.session.message_flow(destination="incoming-gets", unit=1, value=0xFFFFFFFF) - msg = self.session.incoming("incoming-gets").get(timeout=1) - self.assertExpectedContent(msg, id, body) - self.ack(msg) - self.session.message_cancel(destination="incoming-gets") - - - def __init__(self): - TestBase010.__init__(self, "run") - self.setBroker("localhost") - self.errata = [] - - def connect(self): - """ Connects to the broker """ - self.conn = Connection(connect(self.host, self.port)) - self.conn.start(timeout=10) - self.session = self.conn.session("test-session", timeout=10) - - def run(self, args=sys.argv[1:]): - try: - opts, extra = getopt(args, "r:s:e:b:p:h", ["retry=", "spec=", "errata=", "broker=", "phase=", "help"]) - except GetoptError, e: - self._die(str(e)) - phase = 0 - retry = 0; - for opt, value in opts: - if opt in ("-h", "--help"): self._die() - if opt in ("-s", "--spec"): self.spec = value - if opt in ("-e", "--errata"): self.errata.append(value) - if opt in ("-b", "--broker"): self.setBroker(value) - if opt in ("-p", "--phase"): phase = int(value) - if opt in ("-r", "--retry"): retry = int(value) - - if not phase: self._die("please specify the phase to run") - phase = "phase%d" % phase - self.connect() - - try: - getattr(self, phase)() - print phase, "succeeded" - res = True; - except Exception, e: - print phase, "failed: ", e - traceback.print_exc() - res = False - - - if not self.session.error(): self.session.close(timeout=10) - self.conn.close(timeout=10) - - # Crude fix to wait for thread in client to exit after return from session_close() - # Reduces occurrences of "Unhandled exception in thread" messages after each test - import time - time.sleep(1) - - return res - - - def setBroker(self, broker): - rex = re.compile(r""" - # [ <user> [ / <password> ] @] <host> [ :<port> ] - ^ (?: ([^/]*) (?: / ([^@]*) )? @)? ([^:]+) (?: :([0-9]+))?$""", re.X) - match = rex.match(broker) - if not match: self._die("'%s' is not a valid broker" % (broker)) - self.user, self.password, self.host, self.port = match.groups() - self.port = int(default(self.port, 5672)) - self.user = default(self.user, "guest") - self.password = default(self.password, "guest") - - def _die(self, message = None): - if message: print message - print """ -Options: - -h/--help : this message - -s/--spec <spec.xml> : file containing amqp XML spec - -p/--phase : test phase to run - -b/--broker [<user>[/<password>]@]<host>[:<port>] : broker to connect to - """ - sys.exit(1) - -def default(value, default): - if (value == None): return default - else: return value - -if __name__ == "__main__": - test = PersistenceTest() - if not test.run(): sys.exit(1) diff --git a/qpid/cpp/src/tests/legacystore/python_tests/__init__.py b/qpid/cpp/src/tests/legacystore/python_tests/__init__.py deleted file mode 100644 index ebb9da8670..0000000000 --- a/qpid/cpp/src/tests/legacystore/python_tests/__init__.py +++ /dev/null @@ -1,24 +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. -# - -# Do not delete - marks this directory as a python package. - -from client_persistence import * -from resize import * - diff --git a/qpid/cpp/src/tests/legacystore/python_tests/client_persistence.py b/qpid/cpp/src/tests/legacystore/python_tests/client_persistence.py deleted file mode 100644 index 37c12601be..0000000000 --- a/qpid/cpp/src/tests/legacystore/python_tests/client_persistence.py +++ /dev/null @@ -1,239 +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. -# - -import os - -from brokertest import EXPECT_EXIT_OK -from store_test import StoreTest, Qmf, store_args -from qpid.messaging import * - -import qpid.messaging, brokertest -brokertest.qm = qpid.messaging # FIXME aconway 2014-04-04: Tests fail with SWIG client. - -class ExchangeQueueTests(StoreTest): - """ - Simple tests of the broker exchange and queue types - """ - - def test_direct_exchange(self): - """Test Direct exchange.""" - broker = self.broker(store_args(), name="test_direct_exchange", expect=EXPECT_EXIT_OK) - msg1 = Message("A_Message1", durable=True, correlation_id="Msg0001") - msg2 = Message("B_Message1", durable=True, correlation_id="Msg0002") - broker.send_message("a", msg1) - broker.send_message("b", msg2) - broker.terminate() - - broker = self.broker(store_args(), name="test_direct_exchange") - self.check_message(broker, "a", msg1, True) - self.check_message(broker, "b", msg2, True) - - def test_topic_exchange(self): - """Test Topic exchange.""" - broker = self.broker(store_args(), name="test_topic_exchange", expect=EXPECT_EXIT_OK) - ssn = broker.connect().session() - snd1 = ssn.sender("abc/key1; {create:always, node:{type:topic, durable:True}}") - snd2 = ssn.sender("abc/key2; {create:always, node:{type:topic, durable:True}}") - ssn.receiver("a; {create:always, link:{x-bindings:[{exchange:abc, key:key1}]}, node:{durable:True}}") - ssn.receiver("b; {create:always, link:{x-bindings:[{exchange:abc, key:key1}]}, node:{durable:True}}") - ssn.receiver("c; {create:always, link:{x-bindings:[{exchange:abc, key:key1}, " - "{exchange:abc, key: key2}]}, node:{durable:True}}") - ssn.receiver("d; {create:always, link:{x-bindings:[{exchange:abc, key:key2}]}, node:{durable:True}}") - ssn.receiver("e; {create:always, link:{x-bindings:[{exchange:abc, key:key2}]}, node:{durable:True}}") - msg1 = Message("Message1", durable=True, correlation_id="Msg0003") - snd1.send(msg1) - msg2 = Message("Message2", durable=True, correlation_id="Msg0004") - snd2.send(msg2) - broker.terminate() - - broker = self.broker(store_args(), name="test_topic_exchange") - self.check_message(broker, "a", msg1, True) - self.check_message(broker, "b", msg1, True) - self.check_messages(broker, "c", [msg1, msg2], True) - self.check_message(broker, "d", msg2, True) - self.check_message(broker, "e", msg2, True) - - - def test_legacy_lvq(self): - """Test legacy LVQ.""" - broker = self.broker(store_args(), name="test_lvq", expect=EXPECT_EXIT_OK) - ma1 = Message("A1", durable=True, correlation_id="Msg0005", properties={"qpid.LVQ_key":"A"}) - ma2 = Message("A2", durable=True, correlation_id="Msg0006", properties={"qpid.LVQ_key":"A"}) - mb1 = Message("B1", durable=True, correlation_id="Msg0007", properties={"qpid.LVQ_key":"B"}) - mb2 = Message("B2", durable=True, correlation_id="Msg0008", properties={"qpid.LVQ_key":"B"}) - mb3 = Message("B3", durable=True, correlation_id="Msg0009", properties={"qpid.LVQ_key":"B"}) - mc1 = Message("C1", durable=True, correlation_id="Msg0010", properties={"qpid.LVQ_key":"C"}) - broker.send_messages("lvq-test", [mb1, ma1, ma2, mb2, mb3, mc1], - xprops="arguments:{\"qpid.last_value_queue\":True}") - broker.terminate() - - broker = self.broker(store_args(), name="test_lvq", expect=EXPECT_EXIT_OK) - ssn = self.check_messages(broker, "lvq-test", [ma2, mb3, mc1], empty=True, ack=False) - # Add more messages while subscriber is active (no replacement): - ma3 = Message("A3", durable=True, correlation_id="Msg0011", properties={"qpid.LVQ_key":"A"}) - ma4 = Message("A4", durable=True, correlation_id="Msg0012", properties={"qpid.LVQ_key":"A"}) - mc2 = Message("C2", durable=True, correlation_id="Msg0013", properties={"qpid.LVQ_key":"C"}) - mc3 = Message("C3", durable=True, correlation_id="Msg0014", properties={"qpid.LVQ_key":"C"}) - mc4 = Message("C4", durable=True, correlation_id="Msg0015", properties={"qpid.LVQ_key":"C"}) - broker.send_messages("lvq-test", [mc2, mc3, ma3, ma4, mc4], session=ssn) - ssn.acknowledge() - broker.terminate() - - broker = self.broker(store_args(), name="test_lvq") - self.check_messages(broker, "lvq-test", [ma4, mc4], True) - - - def test_fanout_exchange(self): - """Test Fanout Exchange""" - broker = self.broker(store_args(), name="test_fanout_exchange", expect=EXPECT_EXIT_OK) - ssn = broker.connect().session() - snd = ssn.sender("TestFanoutExchange; {create: always, node: {type: topic, x-declare: {type: fanout}}}") - ssn.receiver("TestFanoutExchange; {link: {name: \"q1\", durable: True, reliability:at-least-once}}") - ssn.receiver("TestFanoutExchange; {link: {name: \"q2\", durable: True, reliability:at-least-once}}") - ssn.receiver("TestFanoutExchange; {link: {name: \"q3\", durable: True, reliability:at-least-once}}") - msg1 = Message("Msg1", durable=True, correlation_id="Msg0001") - snd.send(msg1) - msg2 = Message("Msg2", durable=True, correlation_id="Msg0002") - snd.send(msg2) - broker.terminate() - - broker = self.broker(store_args(), name="test_fanout_exchange") - self.check_messages(broker, "q1", [msg1, msg2], True) - self.check_messages(broker, "q2", [msg1, msg2], True) - self.check_messages(broker, "q3", [msg1, msg2], True) - - - def test_message_reject(self): - broker = self.broker(store_args(), name="test_message_reject", expect=EXPECT_EXIT_OK) - ssn = broker.connect().session() - snd = ssn.sender("tmr; {create:always, node:{type:queue, durable:True}}") - rcv = ssn.receiver("tmr; {create:always, node:{type:queue, durable:True}}") - m1 = Message("test_message_reject", durable=True, correlation_id="Msg0001") - snd.send(m1) - m2 = rcv.fetch() - ssn.acknowledge(message=m2, disposition=Disposition(REJECTED)) - broker.terminate() - - broker = self.broker(store_args(), name="test_message_reject") - qmf = Qmf(broker) - assert qmf.queue_message_count("tmr") == 0 - - - def test_route(self): - """ Test the recovery of a route (link and bridge objects.""" - broker = self.broker(store_args(), name="test_route", expect=EXPECT_EXIT_OK) - qmf = Qmf(broker) - qmf_broker_obj = qmf.get_objects("broker")[0] - - # create a "link" - link_args = {"host":"a.fake.host.com", "port":9999, "durable":True, - "authMechanism":"PLAIN", "username":"guest", "password":"guest", - "transport":"tcp"} - result = qmf_broker_obj.create("link", "test-link", link_args, False) - self.assertEqual(result.status, 0, result) - link = qmf.get_objects("link")[0] - - # create bridge - bridge_args = {"link":"test-link", "src":"amq.direct", "dest":"amq.fanout", - "key":"my-key", "durable":True} - result = qmf_broker_obj.create("bridge", "test-bridge", bridge_args, False); - self.assertEqual(result.status, 0, result) - bridge = qmf.get_objects("bridge")[0] - - broker.terminate() - - # recover the link and bridge - broker = self.broker(store_args(), name="test_route") - qmf = Qmf(broker) - qmf_broker_obj = qmf.get_objects("broker")[0] - self.assertEqual(len(qmf.get_objects("link")), 1) - self.assertEqual(len(qmf.get_objects("bridge")), 1) - - - -class AlternateExchangePropertyTests(StoreTest): - """ - Test the persistence of the Alternate Exchange property for exchanges and queues. - """ - - def test_exchange(self): - """Exchange alternate exchange property persistence test""" - broker = self.broker(store_args(), name="test_exchange", expect=EXPECT_EXIT_OK) - qmf = Qmf(broker) - qmf.add_exchange("altExch", "direct", durable=True) # Serves as alternate exchange instance - qmf.add_exchange("testExch", "direct", durable=True, alt_exchange_name="altExch") - qmf.close() - broker.terminate() - - broker = self.broker(store_args(), name="test_exchange") - qmf = Qmf(broker) - try: - qmf.add_exchange("altExch", "direct", passive=True) - except Exception, error: - self.fail("Alternate exchange (\"altExch\") instance not recovered: %s" % error) - try: - qmf.add_exchange("testExch", "direct", passive=True) - except Exception, error: - self.fail("Test exchange (\"testExch\") instance not recovered: %s" % error) - self.assertTrue(qmf.query_exchange("testExch", alt_exchange_name = "altExch"), - "Alternate exchange property not found or is incorrect on exchange \"testExch\".") - qmf.close() - - def test_queue(self): - """Queue alternate exchange property persistexchangeNamece test""" - broker = self.broker(store_args(), name="test_queue", expect=EXPECT_EXIT_OK) - qmf = Qmf(broker) - qmf.add_exchange("altExch", "direct", durable=True) # Serves as alternate exchange instance - qmf.add_queue("testQueue", durable=True, alt_exchange_name="altExch") - qmf.close() - broker.terminate() - - broker = self.broker(store_args(), name="test_queue") - qmf = Qmf(broker) - try: - qmf.add_exchange("altExch", "direct", passive=True) - except Exception, error: - self.fail("Alternate exchange (\"altExch\") instance not recovered: %s" % error) - try: - qmf.add_queue("testQueue", passive=True) - except Exception, error: - self.fail("Test queue (\"testQueue\") instance not recovered: %s" % error) - self.assertTrue(qmf.query_queue("testQueue", alt_exchange_name = "altExch"), - "Alternate exchange property not found or is incorrect on queue \"testQueue\".") - qmf.close() - - -class RedeliveredTests(StoreTest): - """ - Test the behavior of the redelivered flag in the context of persistence - """ - - def test_broker_recovery(self): - """Test that the redelivered flag is set on messages after recovery of broker""" - broker = self.broker(store_args(), name="test_broker_recovery", expect=EXPECT_EXIT_OK) - msg_content = "xyz"*100 - msg = Message(msg_content, durable=True) - broker.send_message("testQueue", msg) - broker.terminate() - - broker = self.broker(store_args(), name="test_broker_recovery") - rcv_msg = broker.get_message("testQueue") - self.assertEqual(msg_content, rcv_msg.content) - self.assertTrue(rcv_msg.redelivered) - diff --git a/qpid/cpp/src/tests/legacystore/python_tests/resize.py b/qpid/cpp/src/tests/legacystore/python_tests/resize.py deleted file mode 100644 index e719b755da..0000000000 --- a/qpid/cpp/src/tests/legacystore/python_tests/resize.py +++ /dev/null @@ -1,170 +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. -# - -import glob -import os -import subprocess - -from brokertest import EXPECT_EXIT_OK -from qpid.datatypes import uuid4 -from store_test import StoreTest, store_args -from qpid.messaging import Message - -import qpid.messaging, brokertest -brokertest.qm = qpid.messaging # TODO aconway 2014-04-04: Tests fail with SWIG client. - -class ResizeTest(StoreTest): - - resize_tool = os.getenv("QPID_STORE_RESIZE_TOOL", "qpid-store-resize") - print resize_tool - def _resize_store(self, store_dir, queue_name, resize_num_files, resize_file_size, exp_fail): - for f in glob.glob(os.path.join(store_dir, "*")): - final_store_dir = os.path.join(f, queue_name) - p = subprocess.Popen([self.resize_tool, final_store_dir, "--num-jfiles", str(resize_num_files), - "--jfile-size-pgs", str(resize_file_size), "--quiet"], stdout = subprocess.PIPE, - stderr = subprocess.STDOUT) - res = p.wait() - err_found = False - try: - for l in p.stdout: - if exp_fail: - err_found = True - print "[Expected error]:", - print l, - finally: - p.stdout.close() - return res - - def _resize_test(self, queue_name, num_msgs, msg_size, resize_num_files, resize_file_size, init_num_files = 8, - init_file_size = 24, exp_fail = False, wait_time = None): - # Using a sender will force the creation of an empty persistent queue which is needed for some tests - broker = self.broker(store_args(), name="broker", expect=EXPECT_EXIT_OK, wait=wait_time) - ssn = broker.connect().session() - snd = ssn.sender("%s; {create:always, node:{durable:True}}" % queue_name) - - msgs = [] - for index in range(0, num_msgs): - msg = Message(self.make_message(index, msg_size), durable=True, id=uuid4(), correlation_id="msg-%04d"%index) - msgs.append(msg) - snd.send(msg) - broker.terminate() - - res = self._resize_store(os.path.join(self.dir, "broker", "rhm", "jrnl"), queue_name, resize_num_files, - resize_file_size, exp_fail) - if res != 0: - if exp_fail: - return - self.fail("ERROR: Resize operation failed with return code %d" % res) - elif exp_fail: - self.fail("ERROR: Resize operation succeeded, but a failure was expected") - - broker = self.broker(store_args(), name="broker") - self.check_messages(broker, queue_name, msgs, True) - - # TODO: Check the physical files to check number and size are as expected. - - -class SimpleTest(ResizeTest): - """ - Simple tests of the resize utility for resizing a journal to larger and smaller sizes. - """ - - def test_empty_store_same(self): - self._resize_test(queue_name = "empty_store_same", - num_msgs = 0, msg_size = 0, - init_num_files = 8, init_file_size = 24, - resize_num_files = 8, resize_file_size = 24) - - def test_empty_store_up(self): - self._resize_test(queue_name = "empty_store_up", - num_msgs = 0, msg_size = 0, - init_num_files = 8, init_file_size = 24, - resize_num_files = 16, resize_file_size = 48) - - def test_empty_store_down(self): - self._resize_test(queue_name = "empty_store_down", - num_msgs = 0, msg_size = 0, - init_num_files = 8, init_file_size = 24, - resize_num_files = 6, resize_file_size = 12) - -# TODO: Put into long tests, make sure there is > 128GB free disk space -# def test_empty_store_max(self): -# self._resize_test(queue_name = "empty_store_max", -# num_msgs = 0, msg_size = 0, -# init_num_files = 8, init_file_size = 24, -# resize_num_files = 64, resize_file_size = 32768, -# wait_time = 120) - - def test_empty_store_min(self): - self._resize_test(queue_name = "empty_store_min", - num_msgs = 0, msg_size = 0, - init_num_files = 8, init_file_size = 24, - resize_num_files = 4, resize_file_size = 1) - - def test_basic_up(self): - self._resize_test(queue_name = "basic_up", - num_msgs = 100, msg_size = 10000, - init_num_files = 8, init_file_size = 24, - resize_num_files = 16, resize_file_size = 48) - - def test_basic_down(self): - self._resize_test(queue_name = "basic_down", - num_msgs = 100, msg_size = 10000, - init_num_files = 8, init_file_size = 24, - resize_num_files = 4, resize_file_size = 15) - - def test_basic_low(self): - self._resize_test(queue_name = "basic_low", - num_msgs = 100, msg_size = 10000, - init_num_files = 8, init_file_size = 24, - resize_num_files = 4, resize_file_size = 4, - exp_fail = True) - - def test_basic_under(self): - self._resize_test(queue_name = "basic_under", - num_msgs = 100, msg_size = 10000, - init_num_files = 8, init_file_size = 24, - resize_num_files = 4, resize_file_size = 3, - exp_fail = True) - - def test_very_large_msg_up(self): - self._resize_test(queue_name = "very_large_msg_up", - num_msgs = 4, msg_size = 2000000, - init_num_files = 8, init_file_size = 24, - resize_num_files = 16, resize_file_size = 48) - - def test_very_large_msg_down(self): - self._resize_test(queue_name = "very_large_msg_down", - num_msgs = 4, msg_size = 2000000, - init_num_files = 16, init_file_size = 64, - resize_num_files = 16, resize_file_size = 48) - - def test_very_large_msg_low(self): - self._resize_test(queue_name = "very_large_msg_low", - num_msgs = 4, msg_size = 2000000, - init_num_files = 8, init_file_size = 24, - resize_num_files = 7, resize_file_size = 20, - exp_fail = True) - - def test_very_large_msg_under(self): - self._resize_test(queue_name = "very_large_msg_under", - num_msgs = 4, msg_size = 2000000, - init_num_files = 8, init_file_size = 24, - resize_num_files = 6, resize_file_size = 8, - exp_fail = True) diff --git a/qpid/cpp/src/tests/legacystore/python_tests/store_test.py b/qpid/cpp/src/tests/legacystore/python_tests/store_test.py deleted file mode 100644 index cc846aefd4..0000000000 --- a/qpid/cpp/src/tests/legacystore/python_tests/store_test.py +++ /dev/null @@ -1,417 +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. -# - -import re -from brokertest import BrokerTest -from qpid.messaging import Empty -from qmf.console import Session - -import qpid.messaging, brokertest -brokertest.qm = qpid.messaging # TODO aconway 2014-04-04: Tests fail with SWIG client. - - -def store_args(store_dir = None): - """Return the broker args necessary to load the async store""" - assert BrokerTest.store_lib - if store_dir == None: - return [] - return ["--store-dir", store_dir] - -class Qmf: - """ - QMF functions not yet available in the new QMF API. Remove this and replace with new API when it becomes available. - """ - def __init__(self, broker): - self.__session = Session() - self.__broker = self.__session.addBroker("amqp://localhost:%d"%broker.port()) - - def add_exchange(self, exchange_name, exchange_type, alt_exchange_name=None, passive=False, durable=False, - arguments = None): - """Add a new exchange""" - amqp_session = self.__broker.getAmqpSession() - if arguments == None: - arguments = {} - if alt_exchange_name: - amqp_session.exchange_declare(exchange=exchange_name, type=exchange_type, - alternate_exchange=alt_exchange_name, passive=passive, durable=durable, - arguments=arguments) - else: - amqp_session.exchange_declare(exchange=exchange_name, type=exchange_type, passive=passive, durable=durable, - arguments=arguments) - - def add_queue(self, queue_name, alt_exchange_name=None, passive=False, durable=False, arguments = None): - """Add a new queue""" - amqp_session = self.__broker.getAmqpSession() - if arguments == None: - arguments = {} - if alt_exchange_name: - amqp_session.queue_declare(queue_name, alternate_exchange=alt_exchange_name, passive=passive, - durable=durable, arguments=arguments) - else: - amqp_session.queue_declare(queue_name, passive=passive, durable=durable, arguments=arguments) - - def delete_queue(self, queue_name): - """Delete an existing queue""" - amqp_session = self.__broker.getAmqpSession() - amqp_session.queue_delete(queue_name) - - def _query(self, name, _class, package, alt_exchange_name=None): - """Qmf query function which can optionally look for the presence of an alternate exchange name""" - try: - obj_list = self.__session.getObjects(_class=_class, _package=package) - found = False - for obj in obj_list: - if obj.name == name: - found = True - if alt_exchange_name != None: - alt_exch_list = self.__session.getObjects(_objectId=obj.altExchange) - if len(alt_exch_list) == 0 or alt_exch_list[0].name != alt_exchange_name: - return False - break - return found - except Exception: - return False - - - def query_exchange(self, exchange_name, alt_exchange_name=None): - """Test for the presence of an exchange, and optionally whether it has an alternate exchange set to a known - value.""" - return self._query(exchange_name, "exchange", "org.apache.qpid.broker", alt_exchange_name) - - def query_queue(self, queue_name, alt_exchange_name=None): - """Test for the presence of an exchange, and optionally whether it has an alternate exchange set to a known - value.""" - return self._query(queue_name, "queue", "org.apache.qpid.broker", alt_exchange_name) - - def queue_message_count(self, queue_name): - """Query the number of messages on a queue""" - queue_list = self.__session.getObjects(_class="queue", _name=queue_name) - if len(queue_list): - return queue_list[0].msgDepth - - def queue_empty(self, queue_name): - """Check if a queue is empty (has no messages waiting)""" - return self.queue_message_count(queue_name) == 0 - - def get_objects(self, target_class, target_package="org.apache.qpid.broker"): - return self.__session.getObjects(_class=target_class, _package=target_package) - - - def close(self): - self.__session.delBroker(self.__broker) - self.__session = None - - -class StoreTest(BrokerTest): - """ - This subclass of BrokerTest adds some convenience test/check functions - """ - - def _chk_empty(self, queue, receiver): - """Check if a queue is empty (has no more messages)""" - try: - msg = receiver.fetch(timeout=0) - self.assert_(False, "Queue \"%s\" not empty: found message: %s" % (queue, msg)) - except Empty: - pass - - @staticmethod - def make_message(msg_count, msg_size): - """Make message content. Format: 'abcdef....' followed by 'msg-NNNN', where NNNN is the message count""" - msg = "msg-%04d" % msg_count - msg_len = len(msg) - buff = "" - if msg_size != None and msg_size > msg_len: - for index in range(0, msg_size - msg_len): - if index == msg_size - msg_len - 1: - buff += "-" - else: - buff += chr(ord('a') + (index % 26)) - return buff + msg - - # Functions for formatting address strings - - @staticmethod - def _fmt_csv(string_list, list_braces = None): - """Format a list using comma-separation. Braces are optionally added.""" - if len(string_list) == 0: - return "" - first = True - str_ = "" - if list_braces != None: - str_ += list_braces[0] - for string in string_list: - if string != None: - if first: - first = False - else: - str_ += ", " - str_ += string - if list_braces != None: - str_ += list_braces[1] - return str_ - - def _fmt_map(self, string_list): - """Format a map {l1, l2, l3, ...} from a string list. Each item in the list must be a formatted map - element('key:val').""" - return self._fmt_csv(string_list, list_braces="{}") - - def _fmt_list(self, string_list): - """Format a list [l1, l2, l3, ...] from a string list.""" - return self._fmt_csv(string_list, list_braces="[]") - - def addr_fmt(self, node_name, **kwargs): - """Generic AMQP to new address formatter. Takes common (but not all) AMQP options and formats an address - string.""" - # Get keyword args - node_subject = kwargs.get("node_subject") - create_policy = kwargs.get("create_policy") - delete_policy = kwargs.get("delete_policy") - assert_policy = kwargs.get("assert_policy") - mode = kwargs.get("mode") - link = kwargs.get("link", False) - link_name = kwargs.get("link_name") - node_type = kwargs.get("node_type") - durable = kwargs.get("durable", False) - link_reliability = kwargs.get("link_reliability") - x_declare_list = kwargs.get("x_declare_list", []) - x_bindings_list = kwargs.get("x_bindings_list", []) - x_subscribe_list = kwargs.get("x_subscribe_list", []) - - node_flag = not link and (node_type != None or durable or len(x_declare_list) > 0 or len(x_bindings_list) > 0) - link_flag = link and (link_name != None or durable or link_reliability != None or len(x_declare_list) > 0 or - len(x_bindings_list) > 0 or len(x_subscribe_list) > 0) - assert not (node_flag and link_flag) - - opt_str_list = [] - if create_policy != None: - opt_str_list.append("create: %s" % create_policy) - if delete_policy != None: - opt_str_list.append("delete: %s" % delete_policy) - if assert_policy != None: - opt_str_list.append("assert: %s" % assert_policy) - if mode != None: - opt_str_list.append("mode: %s" % mode) - if node_flag or link_flag: - node_str_list = [] - if link_name != None: - node_str_list.append("name: \"%s\"" % link_name) - if node_type != None: - node_str_list.append("type: %s" % node_type) - if durable: - node_str_list.append("durable: True") - if link_reliability != None: - node_str_list.append("reliability: %s" % link_reliability) - if len(x_declare_list) > 0: - node_str_list.append("x-declare: %s" % self._fmt_map(x_declare_list)) - if len(x_bindings_list) > 0: - node_str_list.append("x-bindings: %s" % self._fmt_list(x_bindings_list)) - if len(x_subscribe_list) > 0: - node_str_list.append("x-subscribe: %s" % self._fmt_map(x_subscribe_list)) - if node_flag: - opt_str_list.append("node: %s" % self._fmt_map(node_str_list)) - else: - opt_str_list.append("link: %s" % self._fmt_map(node_str_list)) - addr_str = node_name - if node_subject != None: - addr_str += "/%s" % node_subject - if len(opt_str_list) > 0: - addr_str += "; %s" % self._fmt_map(opt_str_list) - return addr_str - - def snd_addr(self, node_name, **kwargs): - """ Create a send (node) address""" - # Get keyword args - topic = kwargs.get("topic") - topic_flag = kwargs.get("topic_flag", False) - auto_create = kwargs.get("auto_create", True) - auto_delete = kwargs.get("auto_delete", False) - durable = kwargs.get("durable", False) - exclusive = kwargs.get("exclusive", False) - ftd_count = kwargs.get("ftd_count") - ftd_size = kwargs.get("ftd_size") - policy = kwargs.get("policy", "flow-to-disk") - exchage_type = kwargs.get("exchage_type") - - create_policy = None - if auto_create: - create_policy = "always" - delete_policy = None - if auto_delete: - delete_policy = "always" - node_type = None - if topic != None or topic_flag: - node_type = "topic" - x_declare_list = ["\"exclusive\": %s" % exclusive] - if ftd_count != None or ftd_size != None: - queue_policy = ["\'qpid.policy_type\': %s" % policy] - if ftd_count: - queue_policy.append("\'qpid.max_count\': %d" % ftd_count) - if ftd_size: - queue_policy.append("\'qpid.max_size\': %d" % ftd_size) - x_declare_list.append("arguments: %s" % self._fmt_map(queue_policy)) - if exchage_type != None: - x_declare_list.append("type: %s" % exchage_type) - - return self.addr_fmt(node_name, topic=topic, create_policy=create_policy, delete_policy=delete_policy, - node_type=node_type, durable=durable, x_declare_list=x_declare_list) - - def rcv_addr(self, node_name, **kwargs): - """ Create a receive (link) address""" - # Get keyword args - auto_create = kwargs.get("auto_create", True) - auto_delete = kwargs.get("auto_delete", False) - link_name = kwargs.get("link_name") - durable = kwargs.get("durable", False) - browse = kwargs.get("browse", False) - exclusive = kwargs.get("exclusive", False) - binding_list = kwargs.get("binding_list", []) - ftd_count = kwargs.get("ftd_count") - ftd_size = kwargs.get("ftd_size") - policy = kwargs.get("policy", "flow-to-disk") - - create_policy = None - if auto_create: - create_policy = "always" - delete_policy = None - if auto_delete: - delete_policy = "always" - mode = None - if browse: - mode = "browse" - x_declare_list = ["\"exclusive\": %s" % exclusive] - if ftd_count != None or ftd_size != None: - queue_policy = ["\'qpid.policy_type\': %s" % policy] - if ftd_count: - queue_policy.append("\'qpid.max_count\': %d" % ftd_count) - if ftd_size: - queue_policy.append("\'qpid.max_size\': %d" % ftd_size) - x_declare_list.append("arguments: %s" % self._fmt_map(queue_policy)) - x_bindings_list = [] - for binding in binding_list: - x_bindings_list.append("{exchange: %s, key: %s}" % binding) - if durable: reliability = 'at-least-once' - else: reliability = None - return self.addr_fmt(node_name, create_policy=create_policy, delete_policy=delete_policy, mode=mode, link=True, - link_name=link_name, durable=durable, x_declare_list=x_declare_list, - x_bindings_list=x_bindings_list, link_reliability=reliability) - - def check_message(self, broker, queue, exp_msg, transactional=False, empty=False, ack=True, browse=False): - """Check that a message is on a queue by dequeuing it and comparing it to the expected message""" - return self.check_messages(broker, queue, [exp_msg], transactional, empty, ack, browse) - - def check_messages(self, broker, queue, exp_msg_list, transactional=False, empty=False, ack=True, browse=False, - emtpy_flag=False): - """Check that messages is on a queue by dequeuing them and comparing them to the expected messages""" - if emtpy_flag: - num_msgs = 0 - else: - num_msgs = len(exp_msg_list) - ssn = broker.connect().session(transactional=transactional) - rcvr = ssn.receiver(self.rcv_addr(queue, browse=browse), capacity=num_msgs) - if num_msgs > 0: - try: - recieved_msg_list = [rcvr.fetch(timeout=0) for i in range(num_msgs)] - except Empty: - self.assert_(False, "Queue \"%s\" is empty, unable to retrieve expected message %d." % (queue, i)) - for i in range(0, len(recieved_msg_list)): - self.assertEqual(recieved_msg_list[i].content, exp_msg_list[i].content) - self.assertEqual(recieved_msg_list[i].correlation_id, exp_msg_list[i].correlation_id) - if empty: - self._chk_empty(queue, rcvr) - if ack: - ssn.acknowledge() - if transactional: - ssn.commit() - ssn.connection.close() - else: - if transactional: - ssn.commit() - return ssn - - - # Functions for finding strings in the broker log file (or other files) - - @staticmethod - def _read_file(file_name): - """Returns the content of file named file_name as a string""" - file_handle = file(file_name) - try: - return file_handle.read() - finally: - file_handle.close() - - def _get_hits(self, broker, search): - """Find all occurrences of the search in the broker log (eliminating possible duplicates from msgs on multiple - queues)""" - # TODO: Use sets when RHEL-4 is no longer supported - hits = [] - for hit in search.findall(self._read_file(broker.log)): - if hit not in hits: - hits.append(hit) - return hits - - def _reconsile_hits(self, broker, ftd_msgs, release_hits): - """Remove entries from list release_hits if they match the message id in ftd_msgs. Check for remaining - release_hits.""" - for msg in ftd_msgs: - found = False - for hit in release_hits: - if str(msg.id) in hit: - release_hits.remove(hit) - #print "Found %s in %s" % (msg.id, broker.log) - found = True - break - if not found: - self.assert_(False, "Unable to locate released message %s in log %s" % (msg.id, broker.log)) - if len(release_hits) > 0: - err = "Messages were unexpectedly released in log %s:\n" % broker.log - for hit in release_hits: - err += " %s\n" % hit - self.assert_(False, err) - - def check_msg_release(self, broker, ftd_msgs): - """ Check for 'Content released' messages in broker log for messages in ftd_msgs""" - hits = self._get_hits(broker, re.compile("debug Message id=\"[0-9a-f-]{36}\"; pid=0x[0-9a-f]+: " - "Content released$", re.MULTILINE)) - self._reconsile_hits(broker, ftd_msgs, hits) - - def check_msg_release_on_commit(self, broker, ftd_msgs): - """ Check for 'Content released on commit' messages in broker log for messages in ftd_msgs""" - hits = self._get_hits(broker, re.compile("debug Message id=\"[0-9a-f-]{36}\"; pid=0x[0-9a-f]+: " - "Content released on commit$", re.MULTILINE)) - self._reconsile_hits(broker, ftd_msgs, hits) - - def check_msg_release_on_recover(self, broker, ftd_msgs): - """ Check for 'Content released after recovery' messages in broker log for messages in ftd_msgs""" - hits = self._get_hits(broker, re.compile("debug Message id=\"[0-9a-f-]{36}\"; pid=0x[0-9a-f]+: " - "Content released after recovery$", re.MULTILINE)) - self._reconsile_hits(broker, ftd_msgs, hits) - - def check_msg_block(self, broker, ftd_msgs): - """Check for 'Content release blocked' messages in broker log for messages in ftd_msgs""" - hits = self._get_hits(broker, re.compile("debug Message id=\"[0-9a-f-]{36}\"; pid=0x[0-9a-f]+: " - "Content release blocked$", re.MULTILINE)) - self._reconsile_hits(broker, ftd_msgs, hits) - - def check_msg_block_on_commit(self, broker, ftd_msgs): - """Check for 'Content release blocked' messages in broker log for messages in ftd_msgs""" - hits = self._get_hits(broker, re.compile("debug Message id=\"[0-9a-f-]{36}\"; pid=0x[0-9a-f]+: " - "Content release blocked on commit$", re.MULTILINE)) - self._reconsile_hits(broker, ftd_msgs, hits) diff --git a/qpid/cpp/src/tests/legacystore/run_long_python_tests b/qpid/cpp/src/tests/legacystore/run_long_python_tests deleted file mode 100644 index be6380302c..0000000000 --- a/qpid/cpp/src/tests/legacystore/run_long_python_tests +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env 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_python_tests LONG_TEST diff --git a/qpid/cpp/src/tests/legacystore/run_python_tests b/qpid/cpp/src/tests/legacystore/run_python_tests deleted file mode 100755 index 4d8baec121..0000000000 --- a/qpid/cpp/src/tests/legacystore/run_python_tests +++ /dev/null @@ -1,47 +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 -import sys - -# Put the python test library on the path so we can get our -# environment - -file_path = os.path.abspath(__file__) -store_tests_dir = os.path.split(file_path)[0] -tests_dir = os.path.split(store_tests_dir)[0] - -sys.path.insert(0, tests_dir) - -from common import * - -# Add our directory to the python path - -ENV["PYTHONPATH"] = "{0}:{1}".format(store_tests_dir, ENV["PYTHONPATH"]) - -# To debug a test, add the following options to the end of the following line: -# -v DEBUG -c qpid.messaging.io.ops [*.testName] - -port = start_broker("broker", "--load-module {0}".format(STORE_LIB)) - -run_broker_tests(port, "-m python_tests", "-DOUTDIR={0}".format(WORK_DIR)) - -check_results() diff --git a/qpid/cpp/src/tests/legacystore/run_short_python_tests b/qpid/cpp/src/tests/legacystore/run_short_python_tests deleted file mode 100644 index 9b9e7c59be..0000000000 --- a/qpid/cpp/src/tests/legacystore/run_short_python_tests +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env 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_python_tests SHORT_TEST diff --git a/qpid/cpp/src/tests/legacystore/system_test.sh b/qpid/cpp/src/tests/legacystore/system_test.sh deleted file mode 100644 index 52cecbce8a..0000000000 --- a/qpid/cpp/src/tests/legacystore/system_test.sh +++ /dev/null @@ -1,51 +0,0 @@ -#!/usr/bin/env 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. -# - -error() { echo $*; exit 1; } - -# Make sure $QPID_DIR contains what we need. -if ! test -d "$QPID_DIR" ; then - echo "WARNING: QPID_DIR is not set skipping system tests." - exit -fi -STORE_LIB=../lib/.libs/msgstore.so - -xml_spec=$QPID_DIR/specs/amqp.0-10-qpid-errata.stripped.xml -test -f $xml_spec || error "$xml_spec not found: invalid \$QPID_DIR ?" -export PYTHONPATH=$QPID_DIR/python:$QPID_DIR/extras/qmf/src/py:$QPID_DIR/tools/src/py - -echo "Using directory $TMP_DATA_DIR" - -fail=0 - -# Run the tests with a given set of flags -BROKER_OPTS="--no-module-dir --load-module=$STORE_LIB --data-dir=$TMP_DATA_DIR --auth=no --wcache-page-size 16" -run_tests() { - for p in `seq 1 8`; do - $abs_srcdir/start_broker "$@" ${BROKER_OPTS} || { echo "FAIL broker start"; return 1; } - python "$abs_srcdir/persistence.py" -s "$xml_spec" -b localhost:`cat qpidd.port` -p $p -r 3 || fail=1; - $abs_srcdir/stop_broker - done -} - -run_tests || fail=1 - -exit $fail diff --git a/qpid/cpp/src/tests/legacystore/unit_test.cpp b/qpid/cpp/src/tests/legacystore/unit_test.cpp deleted file mode 100644 index add80a6f91..0000000000 --- a/qpid/cpp/src/tests/legacystore/unit_test.cpp +++ /dev/null @@ -1,28 +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. - * - */ - - -// 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/qpid/cpp/src/tests/legacystore/unit_test.h b/qpid/cpp/src/tests/legacystore/unit_test.h deleted file mode 100644 index 16b6ae2ffb..0000000000 --- a/qpid/cpp/src/tests/legacystore/unit_test.h +++ /dev/null @@ -1,69 +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.32, 1.33 and boost 1.34. -// Remove when we no longer need to support 1.32 or 1.33. - -#include <boost/version.hpp> - -#if (BOOST_VERSION < 103400) // v.1.33 and earlier -# include <boost/test/auto_unit_test.hpp> -#else // v.1.34 and later -# include <boost/test/unit_test.hpp> -#endif - -// Keep the test function for compilation but do not not register it. -// TODO aconway 2008-04-23: better workaround for expected failures. -// The following causes the test testUpdateTxState not to run at all. -# define QPID_AUTO_TEST_CASE_EXPECTED_FAILURES(test_name,n) \ - namespace { struct test_name { void test_method(); }; } \ - void test_name::test_method() -// The following runs the test testUpdateTxState, but it fails. -/*#define QPID_AUTO_TEST_CASE_EXPECTED_FAILURES(test_name,n) \ - namespace { struct test_name { void test_method(); }; } \ - BOOST_AUTO_TEST_CASE(name)*/ - -#if (BOOST_VERSION < 103300) // v.1.32 and earlier - -# 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) // v.1.33 - -// Note the trailing ';' -# define QPID_AUTO_TEST_SUITE(name) BOOST_AUTO_TEST_SUITE(name); -# define QPID_AUTO_TEST_CASE(name) BOOST_AUTO_TEST_CASE(name) -# define QPID_AUTO_TEST_SUITE_END() BOOST_AUTO_TEST_SUITE_END(); - -#else // v.1.34 and later - -# define QPID_AUTO_TEST_SUITE(name) BOOST_AUTO_TEST_SUITE(name) -# define QPID_AUTO_TEST_CASE(name) BOOST_AUTO_TEST_CASE(name) -# define QPID_AUTO_TEST_SUITE_END() BOOST_AUTO_TEST_SUITE_END() - -#endif - -#endif /*!QPIPD_TEST_UNIT_TEST_H_*/ diff --git a/qpid/cpp/src/tests/linearstore/CMakeLists.txt b/qpid/cpp/src/tests/linearstore/CMakeLists.txt deleted file mode 100644 index 760c54f3b1..0000000000 --- a/qpid/cpp/src/tests/linearstore/CMakeLists.txt +++ /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. -# - -if (BUILD_LINEARSTORE AND BUILD_TESTING) - -message(STATUS "Building linearstore tests") - -add_test(linearstore_python_tests ${PYTHON_EXECUTABLE} run_python_tests) - -endif (BUILD_LINEARSTORE AND BUILD_TESTING) diff --git a/qpid/cpp/src/tests/linearstore/linearstoredirsetup.sh b/qpid/cpp/src/tests/linearstore/linearstoredirsetup.sh deleted file mode 100755 index ef39767e9b..0000000000 --- a/qpid/cpp/src/tests/linearstore/linearstoredirsetup.sh +++ /dev/null @@ -1,55 +0,0 @@ -#!/usr/bin/env 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. -# - -# This script sets up a test directory which contains both -# recoverable and non-recoverable files and directories for -# the empty file pool (EFP). - -# NOTE: The following is based on typical development tree paths, not installed paths - -BASE_DIR=${HOME}/RedHat -STORE_DIR=${BASE_DIR} -PYTHON_TOOLS_DIR=${BASE_DIR}/qpid/tools/src/linearstore -export PYTHONPATH=${BASE_DIR}/qpid/python:${BASE_DIR}/qpid/extras/qmf/src/py:${BASE_DIR}/qpid/tools/src/py - -# Remove old dirs (if present) -rm -rf ${STORE_DIR}/qls -rm -rf ${STORE_DIR}/p002 -rm ${STORE_DIR}/p004 - -# Create new dir tree and links -mkdir ${STORE_DIR}/p002_ext -touch ${STORE_DIR}/p004_ext -mkdir ${STORE_DIR}/qls -mkdir ${STORE_DIR}/qls/p001 -touch ${STORE_DIR}/qls/p003 -ln -s ${STORE_DIR}/p002_ext ${STORE_DIR}/qls/p002 -ln -s ${STORE_DIR}/p004_ext ${STORE_DIR}/qls/p004 - -# Populate efp dirs with empty files -${PYTHON_TOOLS_DIR}/efptool.py $STORE_DIR/qls/ -a -p 1 -s 2048 -n 25 -${PYTHON_TOOLS_DIR}/efptool.py $STORE_DIR/qls/ -a -p 1 -s 512 -n 25 -${PYTHON_TOOLS_DIR}/efptool.py $STORE_DIR/qls/ -a -p 2 -s 2048 -n 25 - -# Show the result for information -${LINEARSTOREDIR}/tools/src/py/linearstore/efptool.py $STORE_DIR/qls/ -l -tree -la $STORE_DIR/qls - diff --git a/qpid/cpp/src/tests/linearstore/python_tests/__init__.py b/qpid/cpp/src/tests/linearstore/python_tests/__init__.py deleted file mode 100644 index 1e59d403e4..0000000000 --- a/qpid/cpp/src/tests/linearstore/python_tests/__init__.py +++ /dev/null @@ -1,23 +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. -# - -# Do not delete - marks this directory as a python package. - -from client_persistence import * - diff --git a/qpid/cpp/src/tests/linearstore/python_tests/client_persistence.py b/qpid/cpp/src/tests/linearstore/python_tests/client_persistence.py deleted file mode 100644 index 9ff9480c4c..0000000000 --- a/qpid/cpp/src/tests/linearstore/python_tests/client_persistence.py +++ /dev/null @@ -1,239 +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. -# - -import os - -from brokertest import EXPECT_EXIT_OK -from store_test import StoreTest, Qmf, store_args -from qpid.messaging import * - -import qpid.messaging, brokertest -brokertest.qm = qpid.messaging # FIXME aconway 2014-04-04: Tests fail with SWIG client. - -class ExchangeQueueTests(StoreTest): - """ - Simple tests of the broker exchange and queue types - """ - - def test_direct_exchange(self): - """Test Direct exchange.""" - broker = self.broker(store_args(), name="test_direct_exchange", expect=EXPECT_EXIT_OK) - msg1 = Message("A_Message1", durable=True, correlation_id="Msg0001") - msg2 = Message("B_Message1", durable=True, correlation_id="Msg0002") - broker.send_message("a", msg1) - broker.send_message("b", msg2) - broker.terminate() - - broker = self.broker(store_args(), name="test_direct_exchange") - self.check_message(broker, "a", msg1, True) - self.check_message(broker, "b", msg2, True) - - def test_topic_exchange(self): - """Test Topic exchange.""" - broker = self.broker(store_args(), name="test_topic_exchange", expect=EXPECT_EXIT_OK) - ssn = broker.connect().session() - snd1 = ssn.sender("abc/key1; {create:always, node:{type:topic, durable:True}}") - snd2 = ssn.sender("abc/key2; {create:always, node:{type:topic, durable:True}}") - ssn.receiver("a; {create:always, link:{x-bindings:[{exchange:abc, key:key1}]}, node:{durable:True}}") - ssn.receiver("b; {create:always, link:{x-bindings:[{exchange:abc, key:key1}]}, node:{durable:True}}") - ssn.receiver("c; {create:always, link:{x-bindings:[{exchange:abc, key:key1}, " - "{exchange:abc, key: key2}]}, node:{durable:True}}") - ssn.receiver("d; {create:always, link:{x-bindings:[{exchange:abc, key:key2}]}, node:{durable:True}}") - ssn.receiver("e; {create:always, link:{x-bindings:[{exchange:abc, key:key2}]}, node:{durable:True}}") - msg1 = Message("Message1", durable=True, correlation_id="Msg0003") - snd1.send(msg1) - msg2 = Message("Message2", durable=True, correlation_id="Msg0004") - snd2.send(msg2) - broker.terminate() - - broker = self.broker(store_args(), name="test_topic_exchange") - self.check_message(broker, "a", msg1, True) - self.check_message(broker, "b", msg1, True) - self.check_messages(broker, "c", [msg1, msg2], True) - self.check_message(broker, "d", msg2, True) - self.check_message(broker, "e", msg2, True) - - - def test_legacy_lvq(self): - """Test legacy LVQ.""" - broker = self.broker(store_args(), name="test_lvq", expect=EXPECT_EXIT_OK) - ma1 = Message("A1", durable=True, correlation_id="Msg0005", properties={"qpid.LVQ_key":"A"}) - ma2 = Message("A2", durable=True, correlation_id="Msg0006", properties={"qpid.LVQ_key":"A"}) - mb1 = Message("B1", durable=True, correlation_id="Msg0007", properties={"qpid.LVQ_key":"B"}) - mb2 = Message("B2", durable=True, correlation_id="Msg0008", properties={"qpid.LVQ_key":"B"}) - mb3 = Message("B3", durable=True, correlation_id="Msg0009", properties={"qpid.LVQ_key":"B"}) - mc1 = Message("C1", durable=True, correlation_id="Msg0010", properties={"qpid.LVQ_key":"C"}) - broker.send_messages("lvq-test", [mb1, ma1, ma2, mb2, mb3, mc1], - xprops="arguments:{\"qpid.last_value_queue\":True}") - broker.terminate() - - broker = self.broker(store_args(), name="test_lvq", expect=EXPECT_EXIT_OK) - ssn = self.check_messages(broker, "lvq-test", [ma2, mb3, mc1], empty=True, ack=False) - # Add more messages while subscriber is active (no replacement): - ma3 = Message("A3", durable=True, correlation_id="Msg0011", properties={"qpid.LVQ_key":"A"}) - ma4 = Message("A4", durable=True, correlation_id="Msg0012", properties={"qpid.LVQ_key":"A"}) - mc2 = Message("C2", durable=True, correlation_id="Msg0013", properties={"qpid.LVQ_key":"C"}) - mc3 = Message("C3", durable=True, correlation_id="Msg0014", properties={"qpid.LVQ_key":"C"}) - mc4 = Message("C4", durable=True, correlation_id="Msg0015", properties={"qpid.LVQ_key":"C"}) - broker.send_messages("lvq-test", [mc2, mc3, ma3, ma4, mc4], session=ssn) - ssn.acknowledge() - broker.terminate() - - broker = self.broker(store_args(), name="test_lvq") - self.check_messages(broker, "lvq-test", [ma4, mc4], True) - - - def test_fanout_exchange(self): - """Test Fanout Exchange""" - broker = self.broker(store_args(), name="test_fanout_exchange", expect=EXPECT_EXIT_OK) - ssn = broker.connect().session() - snd = ssn.sender("TestFanoutExchange; {create: always, node: {type: topic, x-declare: {type: fanout}}}") - ssn.receiver("TestFanoutExchange; {link: {name: \"q1\", durable: True, reliability:at-least-once}}") - ssn.receiver("TestFanoutExchange; {link: {name: \"q2\", durable: True, reliability:at-least-once}}") - ssn.receiver("TestFanoutExchange; {link: {name: \"q3\", durable: True, reliability:at-least-once}}") - msg1 = Message("Msg1", durable=True, correlation_id="Msg0001") - snd.send(msg1) - msg2 = Message("Msg2", durable=True, correlation_id="Msg0002") - snd.send(msg2) - broker.terminate() - - broker = self.broker(store_args(), name="test_fanout_exchange") - self.check_messages(broker, "q1", [msg1, msg2], True) - self.check_messages(broker, "q2", [msg1, msg2], True) - self.check_messages(broker, "q3", [msg1, msg2], True) - - - def test_message_reject(self): - broker = self.broker(store_args(), name="test_message_reject", expect=EXPECT_EXIT_OK) - ssn = broker.connect().session() - snd = ssn.sender("tmr; {create:always, node:{type:queue, durable:True}}") - rcv = ssn.receiver("tmr; {create:always, node:{type:queue, durable:True}}") - m1 = Message("test_message_reject", durable=True, correlation_id="Msg0001") - snd.send(m1) - m2 = rcv.fetch() - ssn.acknowledge(message=m2, disposition=Disposition(REJECTED)) - broker.terminate() - - broker = self.broker(store_args(), name="test_message_reject") - qmf = Qmf(broker) - assert qmf.queue_message_count("tmr") == 0 - - - def test_route(self): - """ Test the recovery of a route (link and bridge objects.""" - broker = self.broker(store_args(), name="test_route", expect=EXPECT_EXIT_OK) - qmf = Qmf(broker) - qmf_broker_obj = qmf.get_objects("broker")[0] - - # create a "link" - link_args = {"host":"a.fake.host.com", "port":9999, "durable":True, - "authMechanism":"PLAIN", "username":"guest", "password":"guest", - "transport":"tcp"} - result = qmf_broker_obj.create("link", "test-link", link_args, False) - self.assertEqual(result.status, 0, result) - link = qmf.get_objects("link")[0] - - # create bridge - bridge_args = {"link":"test-link", "src":"amq.direct", "dest":"amq.fanout", - "key":"my-key", "durable":True} - result = qmf_broker_obj.create("bridge", "test-bridge", bridge_args, False); - self.assertEqual(result.status, 0, result) - bridge = qmf.get_objects("bridge")[0] - - broker.terminate() - - # recover the link and bridge - broker = self.broker(store_args(), name="test_route") - qmf = Qmf(broker) - qmf_broker_obj = qmf.get_objects("broker")[0] - self.assertEqual(len(qmf.get_objects("link")), 1) - self.assertEqual(len(qmf.get_objects("bridge")), 1) - - - -class AlternateExchangePropertyTests(StoreTest): - """ - Test the persistence of the Alternate Exchange property for exchanges and queues. - """ - - def test_exchange(self): - """Exchange alternate exchange property persistence test""" - broker = self.broker(store_args(), name="test_exchange", expect=EXPECT_EXIT_OK) - qmf = Qmf(broker) - qmf.add_exchange("altExch", "direct", durable=True) # Serves as alternate exchange instance - qmf.add_exchange("testExch", "direct", durable=True, alt_exchange_name="altExch") - qmf.close() - broker.terminate() - - broker = self.broker(store_args(), name="test_exchange") - qmf = Qmf(broker) - try: - qmf.add_exchange("altExch", "direct", passive=True) - except Exception, error: - self.fail("Alternate exchange (\"altExch\") instance not recovered: %s" % error) - try: - qmf.add_exchange("testExch", "direct", passive=True) - except Exception, error: - self.fail("Test exchange (\"testExch\") instance not recovered: %s" % error) - self.assertTrue(qmf.query_exchange("testExch", alt_exchange_name = "altExch"), - "Alternate exchange property not found or is incorrect on exchange \"testExch\".") - qmf.close() - - def test_queue(self): - """Queue alternate exchange property persistexchangeNamece test""" - broker = self.broker(store_args(), name="test_queue", expect=EXPECT_EXIT_OK) - qmf = Qmf(broker) - qmf.add_exchange("altExch", "direct", durable=True) # Serves as alternate exchange instance - qmf.add_queue("testQueue", durable=True, alt_exchange_name="altExch") - qmf.close() - broker.terminate() - - broker = self.broker(store_args(), name="test_queue") - qmf = Qmf(broker) - try: - qmf.add_exchange("altExch", "direct", passive=True) - except Exception, error: - self.fail("Alternate exchange (\"altExch\") instance not recovered: %s" % error) - try: - qmf.add_queue("testQueue", passive=True) - except Exception, error: - self.fail("Test queue (\"testQueue\") instance not recovered: %s" % error) - self.assertTrue(qmf.query_queue("testQueue", alt_exchange_name = "altExch"), - "Alternate exchange property not found or is incorrect on queue \"testQueue\".") - qmf.close() - - -class RedeliveredTests(StoreTest): - """ - Test the behavior of the redelivered flag in the context of persistence - """ - - def test_broker_recovery(self): - """Test that the redelivered flag is set on messages after recovery of broker""" - broker = self.broker(store_args(), name="test_broker_recovery", expect=EXPECT_EXIT_OK) - msg_content = "xyz"*100 - msg = Message(msg_content, durable=True) - broker.send_message("testQueue", msg) - broker.terminate() - - broker = self.broker(store_args(), name="test_broker_recovery") - rcv_msg = broker.get_message("testQueue") - self.assertEqual(msg_content, rcv_msg.content) - self.assertTrue(rcv_msg.redelivered) - diff --git a/qpid/cpp/src/tests/linearstore/python_tests/store_test.py b/qpid/cpp/src/tests/linearstore/python_tests/store_test.py deleted file mode 100644 index cc846aefd4..0000000000 --- a/qpid/cpp/src/tests/linearstore/python_tests/store_test.py +++ /dev/null @@ -1,417 +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. -# - -import re -from brokertest import BrokerTest -from qpid.messaging import Empty -from qmf.console import Session - -import qpid.messaging, brokertest -brokertest.qm = qpid.messaging # TODO aconway 2014-04-04: Tests fail with SWIG client. - - -def store_args(store_dir = None): - """Return the broker args necessary to load the async store""" - assert BrokerTest.store_lib - if store_dir == None: - return [] - return ["--store-dir", store_dir] - -class Qmf: - """ - QMF functions not yet available in the new QMF API. Remove this and replace with new API when it becomes available. - """ - def __init__(self, broker): - self.__session = Session() - self.__broker = self.__session.addBroker("amqp://localhost:%d"%broker.port()) - - def add_exchange(self, exchange_name, exchange_type, alt_exchange_name=None, passive=False, durable=False, - arguments = None): - """Add a new exchange""" - amqp_session = self.__broker.getAmqpSession() - if arguments == None: - arguments = {} - if alt_exchange_name: - amqp_session.exchange_declare(exchange=exchange_name, type=exchange_type, - alternate_exchange=alt_exchange_name, passive=passive, durable=durable, - arguments=arguments) - else: - amqp_session.exchange_declare(exchange=exchange_name, type=exchange_type, passive=passive, durable=durable, - arguments=arguments) - - def add_queue(self, queue_name, alt_exchange_name=None, passive=False, durable=False, arguments = None): - """Add a new queue""" - amqp_session = self.__broker.getAmqpSession() - if arguments == None: - arguments = {} - if alt_exchange_name: - amqp_session.queue_declare(queue_name, alternate_exchange=alt_exchange_name, passive=passive, - durable=durable, arguments=arguments) - else: - amqp_session.queue_declare(queue_name, passive=passive, durable=durable, arguments=arguments) - - def delete_queue(self, queue_name): - """Delete an existing queue""" - amqp_session = self.__broker.getAmqpSession() - amqp_session.queue_delete(queue_name) - - def _query(self, name, _class, package, alt_exchange_name=None): - """Qmf query function which can optionally look for the presence of an alternate exchange name""" - try: - obj_list = self.__session.getObjects(_class=_class, _package=package) - found = False - for obj in obj_list: - if obj.name == name: - found = True - if alt_exchange_name != None: - alt_exch_list = self.__session.getObjects(_objectId=obj.altExchange) - if len(alt_exch_list) == 0 or alt_exch_list[0].name != alt_exchange_name: - return False - break - return found - except Exception: - return False - - - def query_exchange(self, exchange_name, alt_exchange_name=None): - """Test for the presence of an exchange, and optionally whether it has an alternate exchange set to a known - value.""" - return self._query(exchange_name, "exchange", "org.apache.qpid.broker", alt_exchange_name) - - def query_queue(self, queue_name, alt_exchange_name=None): - """Test for the presence of an exchange, and optionally whether it has an alternate exchange set to a known - value.""" - return self._query(queue_name, "queue", "org.apache.qpid.broker", alt_exchange_name) - - def queue_message_count(self, queue_name): - """Query the number of messages on a queue""" - queue_list = self.__session.getObjects(_class="queue", _name=queue_name) - if len(queue_list): - return queue_list[0].msgDepth - - def queue_empty(self, queue_name): - """Check if a queue is empty (has no messages waiting)""" - return self.queue_message_count(queue_name) == 0 - - def get_objects(self, target_class, target_package="org.apache.qpid.broker"): - return self.__session.getObjects(_class=target_class, _package=target_package) - - - def close(self): - self.__session.delBroker(self.__broker) - self.__session = None - - -class StoreTest(BrokerTest): - """ - This subclass of BrokerTest adds some convenience test/check functions - """ - - def _chk_empty(self, queue, receiver): - """Check if a queue is empty (has no more messages)""" - try: - msg = receiver.fetch(timeout=0) - self.assert_(False, "Queue \"%s\" not empty: found message: %s" % (queue, msg)) - except Empty: - pass - - @staticmethod - def make_message(msg_count, msg_size): - """Make message content. Format: 'abcdef....' followed by 'msg-NNNN', where NNNN is the message count""" - msg = "msg-%04d" % msg_count - msg_len = len(msg) - buff = "" - if msg_size != None and msg_size > msg_len: - for index in range(0, msg_size - msg_len): - if index == msg_size - msg_len - 1: - buff += "-" - else: - buff += chr(ord('a') + (index % 26)) - return buff + msg - - # Functions for formatting address strings - - @staticmethod - def _fmt_csv(string_list, list_braces = None): - """Format a list using comma-separation. Braces are optionally added.""" - if len(string_list) == 0: - return "" - first = True - str_ = "" - if list_braces != None: - str_ += list_braces[0] - for string in string_list: - if string != None: - if first: - first = False - else: - str_ += ", " - str_ += string - if list_braces != None: - str_ += list_braces[1] - return str_ - - def _fmt_map(self, string_list): - """Format a map {l1, l2, l3, ...} from a string list. Each item in the list must be a formatted map - element('key:val').""" - return self._fmt_csv(string_list, list_braces="{}") - - def _fmt_list(self, string_list): - """Format a list [l1, l2, l3, ...] from a string list.""" - return self._fmt_csv(string_list, list_braces="[]") - - def addr_fmt(self, node_name, **kwargs): - """Generic AMQP to new address formatter. Takes common (but not all) AMQP options and formats an address - string.""" - # Get keyword args - node_subject = kwargs.get("node_subject") - create_policy = kwargs.get("create_policy") - delete_policy = kwargs.get("delete_policy") - assert_policy = kwargs.get("assert_policy") - mode = kwargs.get("mode") - link = kwargs.get("link", False) - link_name = kwargs.get("link_name") - node_type = kwargs.get("node_type") - durable = kwargs.get("durable", False) - link_reliability = kwargs.get("link_reliability") - x_declare_list = kwargs.get("x_declare_list", []) - x_bindings_list = kwargs.get("x_bindings_list", []) - x_subscribe_list = kwargs.get("x_subscribe_list", []) - - node_flag = not link and (node_type != None or durable or len(x_declare_list) > 0 or len(x_bindings_list) > 0) - link_flag = link and (link_name != None or durable or link_reliability != None or len(x_declare_list) > 0 or - len(x_bindings_list) > 0 or len(x_subscribe_list) > 0) - assert not (node_flag and link_flag) - - opt_str_list = [] - if create_policy != None: - opt_str_list.append("create: %s" % create_policy) - if delete_policy != None: - opt_str_list.append("delete: %s" % delete_policy) - if assert_policy != None: - opt_str_list.append("assert: %s" % assert_policy) - if mode != None: - opt_str_list.append("mode: %s" % mode) - if node_flag or link_flag: - node_str_list = [] - if link_name != None: - node_str_list.append("name: \"%s\"" % link_name) - if node_type != None: - node_str_list.append("type: %s" % node_type) - if durable: - node_str_list.append("durable: True") - if link_reliability != None: - node_str_list.append("reliability: %s" % link_reliability) - if len(x_declare_list) > 0: - node_str_list.append("x-declare: %s" % self._fmt_map(x_declare_list)) - if len(x_bindings_list) > 0: - node_str_list.append("x-bindings: %s" % self._fmt_list(x_bindings_list)) - if len(x_subscribe_list) > 0: - node_str_list.append("x-subscribe: %s" % self._fmt_map(x_subscribe_list)) - if node_flag: - opt_str_list.append("node: %s" % self._fmt_map(node_str_list)) - else: - opt_str_list.append("link: %s" % self._fmt_map(node_str_list)) - addr_str = node_name - if node_subject != None: - addr_str += "/%s" % node_subject - if len(opt_str_list) > 0: - addr_str += "; %s" % self._fmt_map(opt_str_list) - return addr_str - - def snd_addr(self, node_name, **kwargs): - """ Create a send (node) address""" - # Get keyword args - topic = kwargs.get("topic") - topic_flag = kwargs.get("topic_flag", False) - auto_create = kwargs.get("auto_create", True) - auto_delete = kwargs.get("auto_delete", False) - durable = kwargs.get("durable", False) - exclusive = kwargs.get("exclusive", False) - ftd_count = kwargs.get("ftd_count") - ftd_size = kwargs.get("ftd_size") - policy = kwargs.get("policy", "flow-to-disk") - exchage_type = kwargs.get("exchage_type") - - create_policy = None - if auto_create: - create_policy = "always" - delete_policy = None - if auto_delete: - delete_policy = "always" - node_type = None - if topic != None or topic_flag: - node_type = "topic" - x_declare_list = ["\"exclusive\": %s" % exclusive] - if ftd_count != None or ftd_size != None: - queue_policy = ["\'qpid.policy_type\': %s" % policy] - if ftd_count: - queue_policy.append("\'qpid.max_count\': %d" % ftd_count) - if ftd_size: - queue_policy.append("\'qpid.max_size\': %d" % ftd_size) - x_declare_list.append("arguments: %s" % self._fmt_map(queue_policy)) - if exchage_type != None: - x_declare_list.append("type: %s" % exchage_type) - - return self.addr_fmt(node_name, topic=topic, create_policy=create_policy, delete_policy=delete_policy, - node_type=node_type, durable=durable, x_declare_list=x_declare_list) - - def rcv_addr(self, node_name, **kwargs): - """ Create a receive (link) address""" - # Get keyword args - auto_create = kwargs.get("auto_create", True) - auto_delete = kwargs.get("auto_delete", False) - link_name = kwargs.get("link_name") - durable = kwargs.get("durable", False) - browse = kwargs.get("browse", False) - exclusive = kwargs.get("exclusive", False) - binding_list = kwargs.get("binding_list", []) - ftd_count = kwargs.get("ftd_count") - ftd_size = kwargs.get("ftd_size") - policy = kwargs.get("policy", "flow-to-disk") - - create_policy = None - if auto_create: - create_policy = "always" - delete_policy = None - if auto_delete: - delete_policy = "always" - mode = None - if browse: - mode = "browse" - x_declare_list = ["\"exclusive\": %s" % exclusive] - if ftd_count != None or ftd_size != None: - queue_policy = ["\'qpid.policy_type\': %s" % policy] - if ftd_count: - queue_policy.append("\'qpid.max_count\': %d" % ftd_count) - if ftd_size: - queue_policy.append("\'qpid.max_size\': %d" % ftd_size) - x_declare_list.append("arguments: %s" % self._fmt_map(queue_policy)) - x_bindings_list = [] - for binding in binding_list: - x_bindings_list.append("{exchange: %s, key: %s}" % binding) - if durable: reliability = 'at-least-once' - else: reliability = None - return self.addr_fmt(node_name, create_policy=create_policy, delete_policy=delete_policy, mode=mode, link=True, - link_name=link_name, durable=durable, x_declare_list=x_declare_list, - x_bindings_list=x_bindings_list, link_reliability=reliability) - - def check_message(self, broker, queue, exp_msg, transactional=False, empty=False, ack=True, browse=False): - """Check that a message is on a queue by dequeuing it and comparing it to the expected message""" - return self.check_messages(broker, queue, [exp_msg], transactional, empty, ack, browse) - - def check_messages(self, broker, queue, exp_msg_list, transactional=False, empty=False, ack=True, browse=False, - emtpy_flag=False): - """Check that messages is on a queue by dequeuing them and comparing them to the expected messages""" - if emtpy_flag: - num_msgs = 0 - else: - num_msgs = len(exp_msg_list) - ssn = broker.connect().session(transactional=transactional) - rcvr = ssn.receiver(self.rcv_addr(queue, browse=browse), capacity=num_msgs) - if num_msgs > 0: - try: - recieved_msg_list = [rcvr.fetch(timeout=0) for i in range(num_msgs)] - except Empty: - self.assert_(False, "Queue \"%s\" is empty, unable to retrieve expected message %d." % (queue, i)) - for i in range(0, len(recieved_msg_list)): - self.assertEqual(recieved_msg_list[i].content, exp_msg_list[i].content) - self.assertEqual(recieved_msg_list[i].correlation_id, exp_msg_list[i].correlation_id) - if empty: - self._chk_empty(queue, rcvr) - if ack: - ssn.acknowledge() - if transactional: - ssn.commit() - ssn.connection.close() - else: - if transactional: - ssn.commit() - return ssn - - - # Functions for finding strings in the broker log file (or other files) - - @staticmethod - def _read_file(file_name): - """Returns the content of file named file_name as a string""" - file_handle = file(file_name) - try: - return file_handle.read() - finally: - file_handle.close() - - def _get_hits(self, broker, search): - """Find all occurrences of the search in the broker log (eliminating possible duplicates from msgs on multiple - queues)""" - # TODO: Use sets when RHEL-4 is no longer supported - hits = [] - for hit in search.findall(self._read_file(broker.log)): - if hit not in hits: - hits.append(hit) - return hits - - def _reconsile_hits(self, broker, ftd_msgs, release_hits): - """Remove entries from list release_hits if they match the message id in ftd_msgs. Check for remaining - release_hits.""" - for msg in ftd_msgs: - found = False - for hit in release_hits: - if str(msg.id) in hit: - release_hits.remove(hit) - #print "Found %s in %s" % (msg.id, broker.log) - found = True - break - if not found: - self.assert_(False, "Unable to locate released message %s in log %s" % (msg.id, broker.log)) - if len(release_hits) > 0: - err = "Messages were unexpectedly released in log %s:\n" % broker.log - for hit in release_hits: - err += " %s\n" % hit - self.assert_(False, err) - - def check_msg_release(self, broker, ftd_msgs): - """ Check for 'Content released' messages in broker log for messages in ftd_msgs""" - hits = self._get_hits(broker, re.compile("debug Message id=\"[0-9a-f-]{36}\"; pid=0x[0-9a-f]+: " - "Content released$", re.MULTILINE)) - self._reconsile_hits(broker, ftd_msgs, hits) - - def check_msg_release_on_commit(self, broker, ftd_msgs): - """ Check for 'Content released on commit' messages in broker log for messages in ftd_msgs""" - hits = self._get_hits(broker, re.compile("debug Message id=\"[0-9a-f-]{36}\"; pid=0x[0-9a-f]+: " - "Content released on commit$", re.MULTILINE)) - self._reconsile_hits(broker, ftd_msgs, hits) - - def check_msg_release_on_recover(self, broker, ftd_msgs): - """ Check for 'Content released after recovery' messages in broker log for messages in ftd_msgs""" - hits = self._get_hits(broker, re.compile("debug Message id=\"[0-9a-f-]{36}\"; pid=0x[0-9a-f]+: " - "Content released after recovery$", re.MULTILINE)) - self._reconsile_hits(broker, ftd_msgs, hits) - - def check_msg_block(self, broker, ftd_msgs): - """Check for 'Content release blocked' messages in broker log for messages in ftd_msgs""" - hits = self._get_hits(broker, re.compile("debug Message id=\"[0-9a-f-]{36}\"; pid=0x[0-9a-f]+: " - "Content release blocked$", re.MULTILINE)) - self._reconsile_hits(broker, ftd_msgs, hits) - - def check_msg_block_on_commit(self, broker, ftd_msgs): - """Check for 'Content release blocked' messages in broker log for messages in ftd_msgs""" - hits = self._get_hits(broker, re.compile("debug Message id=\"[0-9a-f-]{36}\"; pid=0x[0-9a-f]+: " - "Content release blocked on commit$", re.MULTILINE)) - self._reconsile_hits(broker, ftd_msgs, hits) diff --git a/qpid/cpp/src/tests/linearstore/run_long_python_tests b/qpid/cpp/src/tests/linearstore/run_long_python_tests deleted file mode 100644 index be6380302c..0000000000 --- a/qpid/cpp/src/tests/linearstore/run_long_python_tests +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env 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_python_tests LONG_TEST diff --git a/qpid/cpp/src/tests/linearstore/run_python_tests b/qpid/cpp/src/tests/linearstore/run_python_tests deleted file mode 100755 index 4d8baec121..0000000000 --- a/qpid/cpp/src/tests/linearstore/run_python_tests +++ /dev/null @@ -1,47 +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 -import sys - -# Put the python test library on the path so we can get our -# environment - -file_path = os.path.abspath(__file__) -store_tests_dir = os.path.split(file_path)[0] -tests_dir = os.path.split(store_tests_dir)[0] - -sys.path.insert(0, tests_dir) - -from common import * - -# Add our directory to the python path - -ENV["PYTHONPATH"] = "{0}:{1}".format(store_tests_dir, ENV["PYTHONPATH"]) - -# To debug a test, add the following options to the end of the following line: -# -v DEBUG -c qpid.messaging.io.ops [*.testName] - -port = start_broker("broker", "--load-module {0}".format(STORE_LIB)) - -run_broker_tests(port, "-m python_tests", "-DOUTDIR={0}".format(WORK_DIR)) - -check_results() diff --git a/qpid/cpp/src/tests/linearstore/run_short_python_tests b/qpid/cpp/src/tests/linearstore/run_short_python_tests deleted file mode 100644 index 9b9e7c59be..0000000000 --- a/qpid/cpp/src/tests/linearstore/run_short_python_tests +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env 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_python_tests SHORT_TEST diff --git a/qpid/cpp/src/tests/linearstore/tx-test-soak.sh b/qpid/cpp/src/tests/linearstore/tx-test-soak.sh deleted file mode 100755 index 7d5581961f..0000000000 --- a/qpid/cpp/src/tests/linearstore/tx-test-soak.sh +++ /dev/null @@ -1,275 +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. -# - -# tx-test-soak -# -# Basic test methodology: -# 1. Start broker -# 2. Run qpid-txtest against broker using randomly generated parameters -# 3. After some time, kill the broker using SIGKILL -# 4. Restart broker, recover messages -# 5. Run qpid-txtest against broker in check mode, which checks that all expected messages are present. -# 6. Wash, rinse, repeat... The number of runs is determined by ${NUM_RUNS} - -# NOTE: The following is based on typical development tree paths, not installed paths - -NUM_RUNS=1000 -BASE_DIR=${HOME}/RedHat -CMAKE_BUILD_DIR=${BASE_DIR}/q.cm - -# Infrequently adjusted -RESULT_BASE_DIR_PREFIX=${BASE_DIR}/results.tx-test-soak -RECOVER_TIME_PER_QUEUE=1 -STORE_MODULE="linearstore.so" -BROKER_LOG_LEVEL="info+" -BROKER_MANAGEMENT="no" # "no" or "yes" -TRUNCATE_INTERVAL=10 -MAX_DISK_PERC_USED=90 - -# Constants (don't adjust these) -export BASE_DIR -RELATIVE_BASE_DIR=`python -c "import os,os.path; print os.path.relpath(os.environ['BASE_DIR'], os.environ['PWD'])"` -export PYTHONPATH=${BASE_DIR}/qpid/python:${BASE_DIR}/qpid/extras/qmf/src/py:${BASE_DIR}/qpid/tools/src/py -LOG_FILE_NAME=log.txt -QPIDD_FN=qpidd -QPIDD=${CMAKE_BUILD_DIR}/src/${QPIDD_FN} -TXTEST_FN=qpid-txtest -TXTEST=${CMAKE_BUILD_DIR}/src/tests/${TXTEST_FN} -ANALYZE_FN=qpid_qls_analyze.py -ANALYZE=${BASE_DIR}/qpid/tools/src/py/${ANALYZE_FN} -ANALYZE_ARGS="--efp --show-recs --stats" -QPIDD_BASE_ARGS="--load-module ${STORE_MODULE} -m ${BROKER_MANAGEMENT} --auth no --default-flow-stop-threshold 0 --default-flow-resume-threshold 0 --default-queue-limit 0 --store-dir ${BASE_DIR} --log-enable ${BROKER_LOG_LEVEL} --log-to-stderr no --log-to-stdout no" -TXTEST_INIT_STR="--init yes --transfer no --check no" -TXTEST_RUN_STR="--init no --transfer yes --check no" -TXTEST_CHK_STR="--init no --transfer no --check yes" -SUCCESS_MSG="All expected messages were retrieved." -TIMESTAMP_FORMAT="+%Y-%m-%d_%H:%M:%S" -ANSI_RED="\e[1;31m" -ANSI_NONE="\e[0m" -DEFAULT_EFP_DIR=2048k -DEFAULT_EFP_SIZE=2101248 -SIG_KILL=-9 -SIG_TERM=-15 - -# Creates a random number into the variable named in string $1 in the range [$2..$3] (both inclusive). -# $1: variable name as string to which random value is assigned -# $2: minimum inclusive range of random number -# $3: maximum inclusive range of random number -get_random() { - eval $1=`python -S -c "import random; print random.randint($2,$3)"` -} - -# Uses anon-uniform distribution to set a random message size. -# Most messages must be small (0 - 1k), but we need a few medium (10k) and large (100k) ones also. -# Sets message size into var ${MSG_SIZE} -set_message_size() { - local key=0 - get_random "key" 1 10 - if (( "${key}" == "10" )); then # 1 out of 10 - very large - get_random "MSG_SIZE" 100000 1000000 - FILE_SIZE_MULTIPLIER=3 - elif (( "${key}" >= "8" )); then # 2 out of 10 - large - get_random "MSG_SIZE" 10000 100000 - FILE_SIZE_MULTIPLIER=2 - elif (( "${key}" >= "6" )); then # 2 out of 10 - medium - get_random "MSG_SIZE" 1000 10000 - FILE_SIZE_MULTIPLIER=1 - else # 5 out of 10 - small - get_random "MSG_SIZE" 10 1000 - FILE_SIZE_MULTIPLIER=1 - fi -} - -# Start or restart broker -# $1: Log suffix: either "A" or "B". If "A", broker is started with truncation, otherwise broker is restarted with recovery. -# $2: Truncate flag - only used if Log suffix is "A": if true, then truncate store -# The PID of the broker is returned in ${QPIDD_PID} -start_broker() { - local truncate_val - local truncate_str - if [[ "$1" == "A" ]]; then - if [[ $2 == true ]]; then - truncate_val="yes" - truncate_str="(Store truncated)" - if [[ -e ${BASE_DIR}/qls/p001/efp/${DEFAULT_EFP_DIR} ]]; then - for f in ${BASE_DIR}/qls/p001/efp/${DEFAULT_EFP_DIR}/*; do - local filesize=`stat -c%s "${f}"` - if (( ${filesize} != ${DEFAULT_EFP_SIZE} )); then - rm ${f} - fi - done - fi - else - truncate_val="no" - fi - else - truncate_val="no" - fi - echo "${QPIDD} ${QPIDD_BASE_ARGS} --truncate ${truncate_val} --log-to-file ${RESULT_DIR}/qpidd.$1.log &" > ${RESULT_DIR}/qpidd.$1.cmd - ${QPIDD} ${QPIDD_BASE_ARGS} --truncate ${truncate_val} --log-to-file ${RESULT_DIR}/qpidd.$1.log & - QPIDD_PID=$! - echo "Broker PID=${QPIDD_PID} ${truncate_str}" | tee -a ${LOG_FILE} -} - -# Start or evaluate results of transaction test client -# $1: Log suffix flag: either "A" or "B". If "A", client is started in test mode, otherwise client evaluates recovery. -start_tx_test() { - local tx_test_params="--messages-per-tx ${MSGS_PER_TX} --tx-count 1000000 --total-messages ${TOT_MSGS} --size ${MSG_SIZE} --queues ${NUM_QUEUES}" - if [[ "$1" == "A" ]]; then - # Run in background - echo "${TXTEST##*/} parameters: ${tx_test_params}" | tee -a ${LOG_FILE} - echo "${TXTEST} ${tx_test_params} ${TXTEST_INIT_STR} &> ${RESULT_DIR}/txtest.$1.log" > ${RESULT_DIR}/txtest.$1.cmd - ${TXTEST} ${tx_test_params} ${TXTEST_INIT_STR} &> ${RESULT_DIR}/txtest.$1.log - echo "${TXTEST} ${tx_test_params} ${TXTEST_RUN_STR} &> ${RESULT_DIR}/txtest.$1.log &" >> ${RESULT_DIR}/txtest.$1.cmd - ${TXTEST} ${tx_test_params} ${TXTEST_RUN_STR} &> ${RESULT_DIR}/txtest.$1.log & - else - # Run in foreground - #echo "${TXTEST##*/} ${tx_test_params} ${TXTEST_CHK_STR}" | tee -a ${LOG_FILE} - echo "${TXTEST} ${tx_test_params} ${TXTEST_CHK_STR} &> ${RESULT_DIR}/txtest.$1.log" > ${RESULT_DIR}/txtest.$1.cmd - ${TXTEST} ${tx_test_params} ${TXTEST_CHK_STR} &> ${RESULT_DIR}/txtest.$1.log - fi -} - -# Search for the presence of core.* files, move them into the current result directory and run gdb against them. -# No params -process_core_files() { - ls core.* &> /dev/null - if (( "$?" == "0" )); then - for cf in core.*; do - gdb --batch --quiet -ex "thread apply all bt" -ex "quit" ${QPIDD} ${cf} &> ${RESULT_DIR}/${cf##*/}.gdb.txt - gdb --batch --quiet -ex "thread apply all bt full" -ex "quit" ${QPIDD} ${cf} &> ${RESULT_DIR}/${cf##*/}.gdb-full.txt - cat ${RESULT_DIR}/${cf##*/}.gdb.txt - mv ${cf} ${RESULT_DIR}/ - echo "Core file ${cf##*/} found and recovered" - done - fi -} - -# Kill a process quietly -# $1: Signal -# $2: PID -kill_process() { - kill ${1} ${2} &>> ${LOG_FILE} - wait ${2} &>> ${LOG_FILE} -} - -# Check that test can run: No other copy of qpidd running, enough disk space -check_ready_to_run() { - # Check no copy of qpidd is running - PID=`pgrep ${QPIDD_FN}` - if [[ "$?" == "0" ]]; then - echo "ERROR: qpidd running as pid ${PID}" - exit 1 - fi - # Check disk is < 90% full - local perc_full=`df -h ${HOME} | tail -1 | awk '{print substr($5,0, length($5)-1)}'` - if (( ${perc_full} >= ${MAX_DISK_PERC_USED} )); then - echo "ERROR: Disk is too close to full (${perc_full}%)" - exit 2 - fi -} - -# Analyze store files -# $1: Log suffix flag: either "A" or "B". If "A", client is started in test mode, otherwise client evaluates recovery. -analyze_store() { - ${ANALYZE} ${ANALYZE_ARGS} ${BASE_DIR}/qls &> ${RESULT_DIR}/qls_analysis.$1.log - echo >> ${RESULT_DIR}/qls_analysis.$1.log - echo "----------------------------------------------------------" >> ${RESULT_DIR}/qls_analysis.$1.log - echo "With transactional reconsiliation:" >> ${RESULT_DIR}/qls_analysis.$1.log - echo >> ${RESULT_DIR}/qls_analysis.$1.log - ${ANALYZE} ${ANALYZE_ARGS} --txn ${BASE_DIR}/qls &>> ${RESULT_DIR}/qls_analysis.$1.log -} - -ulimit -c unlimited # Allow core files to be created - -RESULT_BASE_DIR_SUFFIX=`date "${TIMESTAMP_FORMAT}"` -RESULT_BASE_DIR="${RESULT_BASE_DIR_PREFIX}.${RESULT_BASE_DIR_SUFFIX}" -LOG_FILE=${RESULT_BASE_DIR}/${LOG_FILE_NAME} -if [[ -n "${RESULT_BASE_DIR}" ]]; then - rm -rf ${RESULT_BASE_DIR} -fi - -mkdir -p ${RESULT_BASE_DIR} -for rn in `seq ${NUM_RUNS}`; do - # === Prepare result dir, check ready to run test, set run vars === - RESULT_DIR=${RESULT_BASE_DIR}/run_${rn} - mkdir -p ${RESULT_DIR} - check_ready_to_run - if (( (${rn} - 1) % ${TRUNCATE_INTERVAL} == 0 )) || [[ -n ${ERROR_FLAG} ]]; then - TRUNCATE_FLAG=true - else - TRUNCATE_FLAG=false - fi - set_message_size - get_random "MSGS_PER_TX" 1 20 - get_random "TOT_MSGS" 100 1000 - get_random "NUM_QUEUES" 2 15 - MIN_RUNTIME=$(( 20 * ${FILE_SIZE_MULTIPLIER} )) - MAX_RUNTIME=$(( 120 * ${FILE_SIZE_MULTIPLIER} )) - get_random "RUN_TIME" ${MIN_RUNTIME} ${MAX_RUNTIME} - RECOVER_TIME=$(( ${NUM_QUEUES} * ${RECOVER_TIME_PER_QUEUE} * ${FILE_SIZE_MULTIPLIER} )) - echo "Run ${rn} of ${NUM_RUNS} ==============" | tee -a ${LOG_FILE} - - # === PART A: Initial run of qpid-txtest === - start_broker "A" ${TRUNCATE_FLAG} - sleep ${RECOVER_TIME} # Need a way to test if broker has started here - start_tx_test "A" - echo "Running for ${RUN_TIME} secs..." | tee -a ${LOG_FILE} - sleep ${RUN_TIME} - kill_process ${SIG_KILL} ${QPIDD_PID} - sleep 2 - analyze_store "A" - tar -czf ${RESULT_DIR}/qls_A.tar.gz ${RELATIVE_BASE_DIR}/qls - - # === PART B: Recovery and check === - start_broker "B" - echo "Recover time=${RECOVER_TIME} secs..." | tee -a ${LOG_FILE} - sleep ${RECOVER_TIME} # Need a way to test if broker has started here - start_tx_test "B" - sleep 1 - kill_process ${SIG_TERM} ${QPIDD_PID} - sleep 2 - PID=`pgrep ${QPIDD_FN}` - if [[ "$?" == "0" ]]; then - kill_process ${SIG_KILL} ${PID} - sleep 2 - fi - analyze_store "B" - tar -czf ${RESULT_DIR}/qls_B.tar.gz ${RELATIVE_BASE_DIR}/qls - - # === Check for errors, cores and exceptions in logs === - grep -Hn "jexception" ${RESULT_DIR}/qpidd.A.log | tee -a ${LOG_FILE} - grep -Hn "jexception" ${RESULT_DIR}/qpidd.B.log | tee -a ${LOG_FILE} - grep -Hn "Traceback (most recent call last):" ${RESULT_DIR}/qls_analysis.A.log | tee -a ${LOG_FILE} - grep -Hn "Traceback (most recent call last):" ${RESULT_DIR}/qls_analysis.B.log | tee -a ${LOG_FILE} - grep "${SUCCESS_MSG}" ${RESULT_DIR}/txtest.B.log &> /dev/null - if [[ "$?" != "0" ]]; then - echo "ERROR in run ${rn}" >> ${LOG_FILE} - echo -e "${ANSI_RED}ERROR${ANSI_NONE} in run ${rn}" - ERROR_FLAG=true - else - unset ERROR_FLAG - fi - sleep 2 - process_core_files - echo | tee -a ${LOG_FILE} -done - diff --git a/qpid/cpp/src/tests/logging.cpp b/qpid/cpp/src/tests/logging.cpp deleted file mode 100644 index 32cd09d73d..0000000000 --- a/qpid/cpp/src/tests/logging.cpp +++ /dev/null @@ -1,512 +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/algorithm/string/predicate.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 qpid::log; -using boost::ends_with; -using boost::contains; -using boost::format; - -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(testSelector_disable) { - Selector s; - // Simple enable/disable - s.enable(trace,"foo"); - BOOST_CHECK(s.isEnabled(trace,"foo")); - BOOST_CHECK(!s.isDisabled(trace,"foo")); - s.disable(trace,"foo"); - BOOST_CHECK(s.isEnabled(trace,"foo")); - BOOST_CHECK(s.isDisabled(trace,"foo")); -} - -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( ends_with( out->last(), ": foo\n")); - string name = out->last().substr(0, out->last().length() - 6); - BOOST_CHECK( contains( string(BOOST_CURRENT_FUNCTION), name)); - - 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, ::qpid::log::unspecified}; - 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-disable", "error+:foo", - "--log-disable", "debug:bar", - "--log-disable", "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_EQUAL(expect, opts.deselectors); - 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(testDeselectorFromOptions) { - const char* argv[]={ - 0, - "--log-disable", "error-:foo", - "--log-disable", "debug:bar", - "--log-disable", "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.deselectors); - Selector s(opts); - BOOST_CHECK(!s.isDisabled(warning, "x")); - BOOST_CHECK(!s.isDisabled(debug, "x")); - BOOST_CHECK(s.isDisabled(debug, "bar")); - BOOST_CHECK(s.isDisabled(trace, "foo")); - BOOST_CHECK(s.isDisabled(debug, "foo")); - BOOST_CHECK(s.isDisabled(info, "foo")); - BOOST_CHECK(s.isDisabled(notice, "foo")); - BOOST_CHECK(s.isDisabled(warning, "foo")); - BOOST_CHECK(s.isDisabled(error, "foo")); - BOOST_CHECK(!s.isDisabled(critical, "foo")); -} - -QPID_AUTO_TEST_CASE(testMultiConflictingSelectorFromOptions) { - const char* argv[]={ - 0, - "--log-enable", "trace+:foo", - "--log-disable", "error-:foo", - "--log-enable", "debug:bar", - "--log-disable", "debug:bar", - "--log-enable", "info", - "--log-disable", "info", - "--log-enable", "debug+:Model", - "--log-disable", "info-:Model" - }; - qpid::log::Options opts(""); - opts.parse(ARGC(argv), const_cast<char**>(argv)); - Selector s(opts); - BOOST_CHECK(!s.isEnabled(warning, "x", log::broker)); - BOOST_CHECK(!s.isEnabled(debug, "x", log::broker)); - BOOST_CHECK(!s.isEnabled(trace, "foo", log::broker)); - BOOST_CHECK(!s.isEnabled(debug, "foo", log::broker)); - BOOST_CHECK(!s.isEnabled(info, "foo", log::broker)); - BOOST_CHECK(!s.isEnabled(notice, "foo", log::broker)); - BOOST_CHECK(!s.isEnabled(warning, "foo", log::broker)); - BOOST_CHECK(!s.isEnabled(error, "foo", log::broker)); - BOOST_CHECK(s.isEnabled(critical, "foo", log::broker)); - BOOST_CHECK(!s.isEnabled(debug, "bar", log::model)); - BOOST_CHECK(!s.isEnabled(trace, "zaz", log::model)); - BOOST_CHECK(!s.isEnabled(debug, "zaz", log::model)); - BOOST_CHECK(!s.isEnabled(info, "zaz", log::model)); - BOOST_CHECK(s.isEnabled(notice, "zaz", log::model)); - BOOST_CHECK(s.isEnabled(warning, "zaz", log::model)); - BOOST_CHECK(s.isEnabled(error, "zaz", log::model)); - BOOST_CHECK(s.isEnabled(critical, "zaz", log::model)); -} - -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_CAT(critical, test, "foo"); int srcline=__LINE__; - ifstream log("logging.tmp"); - string line; - getline(log, line); - string expect=(format("[Test] 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_CAT(critical, test, str); - ifstream log("logging.tmp"); - string line; - getline(log, line, '\0'); - string expect="[Test] 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_CASE(testSelectorElements) { - SelectorElement s("debug"); - BOOST_CHECK_EQUAL(s.levelStr, "debug"); - BOOST_CHECK_EQUAL(s.patternStr, ""); - BOOST_CHECK_EQUAL(s.level, debug); - BOOST_CHECK(!s.isDisable); - BOOST_CHECK(!s.isCategory); - BOOST_CHECK(!s.isLevelAndAbove); - BOOST_CHECK(!s.isLevelAndBelow); - - SelectorElement t("debug:Broker"); - BOOST_CHECK_EQUAL(t.levelStr, "debug"); - BOOST_CHECK_EQUAL(t.patternStr, "Broker"); - BOOST_CHECK_EQUAL(t.level, debug); - BOOST_CHECK_EQUAL(t.category, broker); - BOOST_CHECK(!t.isDisable); - BOOST_CHECK(t.isCategory); - BOOST_CHECK(!t.isLevelAndAbove); - BOOST_CHECK(!t.isLevelAndBelow); - - SelectorElement u("info+:qmf::"); - BOOST_CHECK_EQUAL(u.levelStr, "info"); - BOOST_CHECK_EQUAL(u.patternStr, "qmf::"); - BOOST_CHECK_EQUAL(u.level, info); - BOOST_CHECK(!u.isDisable); - BOOST_CHECK(!u.isCategory); - BOOST_CHECK(u.isLevelAndAbove); - BOOST_CHECK(!u.isLevelAndBelow); - - SelectorElement v("critical-"); - BOOST_CHECK_EQUAL(v.levelStr, "critical"); - BOOST_CHECK_EQUAL(v.patternStr, ""); - BOOST_CHECK_EQUAL(v.level, critical); - BOOST_CHECK(!v.isDisable); - BOOST_CHECK(!v.isCategory); - BOOST_CHECK(!v.isLevelAndAbove); - BOOST_CHECK(v.isLevelAndBelow); - - SelectorElement w("!warning-:Management"); - BOOST_CHECK_EQUAL(w.levelStr, "warning"); - BOOST_CHECK_EQUAL(w.patternStr, "Management"); - BOOST_CHECK_EQUAL(w.level, warning); - BOOST_CHECK_EQUAL(w.category, management); - BOOST_CHECK(w.isDisable); - BOOST_CHECK(w.isCategory); - BOOST_CHECK(!w.isLevelAndAbove); - BOOST_CHECK(w.isLevelAndBelow); -} - -QPID_AUTO_TEST_SUITE_END() - -}} // namespace qpid::tests diff --git a/qpid/cpp/src/tests/mgmt_1.py b/qpid/cpp/src/tests/mgmt_1.py deleted file mode 100644 index 39812c2995..0000000000 --- a/qpid/cpp/src/tests/mgmt_1.py +++ /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. -# - -from qpid.tests.messaging.implementation import * - -class Mgmt: - """ - Simple QMF management utility (qpidtoollibs uses - qpid.messaging.Message rather than swigged version) - """ - def __init__(self, conn): - self.conn = conn - self.sess = self.conn.session() - self.reply_to = "qmf.default.topic/direct.%s;{node:{type:topic}, link:{x-declare:{auto-delete:True,exclusive:True}}}" % \ - str(uuid4()) - self.reply_rx = self.sess.receiver(self.reply_to) - self.reply_rx.capacity = 10 - self.tx = self.sess.sender("qmf.default.direct/broker") - self.next_correlator = 1 - - def close(self): - self.conn.close() - - def list(self, class_name): - props = {'method' : 'request', - 'qmf.opcode' : '_query_request', - 'x-amqp-0-10.app-id' : 'qmf2'} - correlator = str(self.next_correlator) - self.next_correlator += 1 - - content = {'_what' : 'OBJECT', - '_schema_id' : {'_class_name' : class_name.lower()}} - - message = Message(content, reply_to=self.reply_to, correlation_id=correlator, - properties=props, subject="broker") - self.tx.send(message) - - - response = self.reply_rx.fetch(10) - if response.properties['qmf.opcode'] != '_query_response': - raise Exception("bad response") - items = [] - done = False - while not done: - for item in response.content: - items.append(item['_values']) - if 'partial' in response.properties: - response = self.reply_rx.fetch(10) - else: - done = True - self.sess.acknowledge() - return items - - def do_qmf_method(self, method, arguments, addr="org.apache.qpid.broker:broker:amqp-broker", timeout=10): - props = {'method' : 'request', - 'qmf.opcode' : '_method_request', - 'x-amqp-0-10.app-id' : 'qmf2'} - correlator = str(self.next_correlator) - self.next_correlator += 1 - - content = {'_object_id' : {'_object_name' : addr}, - '_method_name' : method, - '_arguments' : arguments} - - message = Message(content, reply_to=self.reply_to, correlation_id=correlator, - properties=props, subject="broker") - self.tx.send(message) - response = self.reply_rx.fetch(timeout) - self.sess.acknowledge() - if response.properties['qmf.opcode'] == '_exception': - raise Exception("Exception from Agent: %r" % response.content['_values']) - if response.properties['qmf.opcode'] != '_method_response': - raise Exception("bad response: %r" % response.properties) - return response.content['_arguments'] - - def create(self, _type, name, properties={}): - return self.do_qmf_method('create', {'type': _type, 'name': name, 'properties': properties}) - - def delete(self, _type, name): - return self.do_qmf_method('delete', {'type': _type, 'name': name}) - - def reload_acl_file(self): - self.do_qmf_method('reloadACLFile', {}, "org.apache.qpid.acl:acl:org.apache.qpid.broker:broker:amqp-broker") diff --git a/qpid/cpp/src/tests/misc.py b/qpid/cpp/src/tests/misc.py deleted file mode 100644 index 257fb9e754..0000000000 --- a/qpid/cpp/src/tests/misc.py +++ /dev/null @@ -1,119 +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. -# - -from qpid.tests.messaging.implementation import * -from qpid.tests.messaging import VersionTest - -class MiscellaneousTests (VersionTest): - """ - Tests for various aspects of qpidd behaviour - """ - def test_exclusive(self): - con = self.create_connection("amqp1.0", True) - rcv = con.session().receiver("q; {create:always, node:{properties:{exclusive:True,auto-delete:True}}}") - - other = self.create_connection("amqp1.0", True) - try: - #can send to the queue - snd = other.session().sender("q") - - #can browse the queue - browser = other.session().receiver("q; {mode:browse}") - - #can't consume from the queue - try: - consumer = other.session().receiver("q") - assert False, ("Should not be able to consume from exclusively owned queue") - except LinkError, e: None - try: - exclusive = other.session().receiver("q; {create: always, node:{properties:{exclusive:True}}}") - assert False, ("Should not be able to consume exclusively from exclusively owned queue") - except LinkError, e: None - finally: - rcv.close() - con.close() - other.close() - -class AutoDeleteExchangeTests(VersionTest): - def init_test(self, exchange_type="topic"): - rcv = self.ssn.receiver("my-topic; {create:always, node:{type:topic, properties:{'exchange-type':%s, 'auto-delete':True}}}" % exchange_type) - snd = self.ssn.sender("my-topic") - #send some messages - msgs = [Message(content=c) for c in ['a','b','c','d']] - for m in msgs: snd.send(m) - - #verify receipt - for expected in msgs: - msg = rcv.fetch(0) - assert msg.content == expected.content - self.ssn.acknowledge(msg) - return (rcv, snd) - - def on_rcv_detach_test(self, exchange_type="topic"): - rcv, snd = self.init_test(exchange_type) - rcv.close() - #verify exchange is still there - snd.send(Message(content="will be dropped")) - snd.close() - #now verify it is no longer there - try: - self.ssn.sender("my-topic") - assert False, "Attempt to send to deleted exchange should fail" - except MessagingError: None - - def on_snd_detach_test(self, exchange_type="topic"): - rcv, snd = self.init_test(exchange_type) - snd.close() - #verify exchange is still there - snd = self.ssn.sender("my-topic") - snd.send(Message(content="will be dropped")) - snd.close() - rcv.close() - #now verify it is no longer there - try: - self.ssn.sender("my-topic") - assert False, "Attempt to send to deleted exchange should fail" - except MessagingError: None - - def test_autodelete_fanout_exchange_on_rcv_detach(self): - self.on_rcv_detach_test("fanout") - - def test_autodelete_fanout_exchange_on_snd_detach(self): - self.on_snd_detach_test("fanout") - - def test_autodelete_direct_exchange_on_rcv_detach(self): - self.on_rcv_detach_test("direct") - - def test_autodelete_direct_exchange_on_snd_detach(self): - self.on_snd_detach_test("direct") - - def test_autodelete_topic_exchange_on_rcv_detach(self): - self.on_rcv_detach_test("topic") - - def test_autodelete_topic_exchange_on_snd_detach(self): - self.on_snd_detach_test("topic") - - def test_autodelete_headers_exchange_on_rcv_detach(self): - self.on_rcv_detach_test("headers") - - def test_autodelete_headers_exchange_on_snd_detach(self): - self.on_snd_detach_test("headers") - - - diff --git a/qpid/cpp/src/tests/msg_group_test.cpp b/qpid/cpp/src/tests/msg_group_test.cpp deleted file mode 100644 index ca87197ff3..0000000000 --- a/qpid/cpp/src/tests/msg_group_test.cpp +++ /dev/null @@ -1,641 +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/log/Statement.h" -#include "qpid/sys/Time.h" -#include "qpid/sys/Runnable.h" -#include "qpid/sys/Thread.h" -#include "qpid/sys/SystemInfo.h" - -#include <iostream> -#include <memory> -#include <stdlib.h> - -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; - uint messages; - uint capacity; - uint ackFrequency; - bool failoverUpdates; - qpid::log::Options log; - uint senders; - uint receivers; - uint groupSize; - bool printReport; - std::string groupKey; - bool durable; - bool allowDuplicates; - bool randomizeSize; - bool stickyConsumer; - uint timeout; - uint interleave; - std::string prefix; - uint sendRate; - - Options(const std::string& argv0=std::string()) - : qpid::Options("Options"), - help(false), - url("amqp:tcp:127.0.0.1"), - messages(10000), - capacity(1000), - ackFrequency(100), - failoverUpdates(false), - log(argv0), - senders(2), - receivers(2), - groupSize(10), - printReport(false), - groupKey("qpid.no_group"), - durable(false), - allowDuplicates(false), - randomizeSize(false), - stickyConsumer(false), - timeout(10), - interleave(1), - sendRate(0) - { - addOptions() - ("ack-frequency", qpid::optValue(ackFrequency, "N"), "Ack frequency (0 implies none of the messages will get accepted)") - ("address,a", qpid::optValue(address, "ADDRESS"), "address to send and receive from") - ("allow-duplicates", qpid::optValue(allowDuplicates), "Ignore the delivery of duplicated messages") - ("broker,b", qpid::optValue(url, "URL"), "url of broker to connect to") - ("capacity", qpid::optValue(capacity, "N"), "Pre-fetch window (0 implies no pre-fetch)") - ("connection-options", qpid::optValue(connectionOptions, "OPTIONS"), "options for the connection") - ("durable", qpid::optValue(durable, "yes|no"), "Mark messages as durable.") - ("failover-updates", qpid::optValue(failoverUpdates), "Listen for membership updates distributed via amq.failover") - ("group-key", qpid::optValue(groupKey, "KEY"), "Key of the message header containing the group identifier.") - ("group-prefix", qpid::optValue(prefix, "STRING"), "Add 'prefix' to the start of all generated group identifiers.") - ("group-size", qpid::optValue(groupSize, "N"), "Number of messages per a group.") - ("interleave", qpid::optValue(interleave, "N"), "Simultaineously interleave messages from N different groups.") - ("messages,m", qpid::optValue(messages, "N"), "Number of messages to send per each sender.") - ("receivers,r", qpid::optValue(receivers, "N"), "Number of message consumers.") - ("randomize-group-size", qpid::optValue(randomizeSize), "Randomize the number of messages per group to [1...group-size].") - ("send-rate", qpid::optValue(sendRate,"N"), "Send at rate of N messages/second. 0 means send as fast as possible.") - ("senders,s", qpid::optValue(senders, "N"), "Number of message producers.") - ("sticky-consumers", qpid::optValue(stickyConsumer), "If set, verify that all messages in a group are consumed by the same client [TBD].") - ("timeout", qpid::optValue(timeout, "N"), "Fail with a stall error should all consumers remain idle for timeout seconds.") - ("print-report", qpid::optValue(printReport), "Dump message group statistics to stdout.") - ("help", qpid::optValue(help), "print this usage statement"); - add(log); - //("check-redelivered", qpid::optValue(checkRedelivered), "Fails with exception if a duplicate is not marked as redelivered (only relevant when ignore-duplicates is selected)") - //("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)") - } - - bool parse(int argc, char** argv) - { - try { - qpid::Options::parse(argc, argv); - if (address.empty()) throw qpid::Exception("Address must be specified!"); - if (senders == 0 && receivers == 0) throw qpid::Exception("No senders and No receivers?"); - if (messages == 0) throw qpid::Exception("The message count cannot be zero."); - qpid::log::Logger::instance().configure(log); - if (help) { - std::cout << *this << std::endl << std::endl - << "Verifies the behavior of grouped messages." << 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 that monitors group state across all publishers and consumers. tracks the next -// expected sequence for each group, and total messages consumed. -class GroupChecker -{ - qpid::sys::Mutex lock; - - uint consumerCt; - uint producerCt; - uint totalMsgs; - uint totalMsgsConsumed; - uint totalMsgsPublished; - bool allowDuplicates; - uint duplicateMsgs; - - typedef std::map<std::string, uint> SequenceMap; - SequenceMap sequenceMap; - - // Statistics - for each group, store the names of all clients that consumed messages - // from that group, and the number of messages consumed per client. - typedef std::map<std::string, uint> ClientCounter; - typedef std::map<std::string, ClientCounter> GroupStatistics; - GroupStatistics statistics; - -public: - - GroupChecker( uint messages, uint consumers, uint producers, bool d) : - consumerCt(consumers), producerCt(producers), - totalMsgs(0), totalMsgsConsumed(0), totalMsgsPublished(0), allowDuplicates(d), - duplicateMsgs(0) - { - // if consumering only - we a draining a queue of 'messages' queued messages. - if (producerCt != 0) { - totalMsgs = producers * messages; - } else { - totalMsgs = messages; - } - } - - bool checkSequence( const std::string& groupId, - uint sequence, const std::string& client ) - { - qpid::sys::Mutex::ScopedLock l(lock); - - QPID_LOG(debug, "Client " << client << " has received " << groupId << ":" << sequence); - - GroupStatistics::iterator gs = statistics.find(groupId); - if (gs == statistics.end()) { - statistics[groupId][client] = 1; - } else { - gs->second[client]++; - } - // now verify - SequenceMap::iterator s = sequenceMap.find(groupId); - if (s == sequenceMap.end()) { - QPID_LOG(debug, "Client " << client << " thinks this is the first message from group " << groupId << ":" << sequence); - // if duplication allowed, it is possible that the last msg(s) of an old sequence are redelivered on reconnect. - // in this case, set the sequence from the first msg. - sequenceMap[groupId] = (allowDuplicates) ? sequence : 0; - s = sequenceMap.find(groupId); - } else if (sequence < s->second) { - duplicateMsgs++; - QPID_LOG(debug, "Client " << client << " thinks this message is a duplicate! " << groupId << ":" << sequence); - return allowDuplicates; - } - totalMsgsConsumed++; - return sequence == s->second++; - } - - void sendingSequence( const std::string& groupId, - uint sequence, bool eos, - const std::string& client ) - { - qpid::sys::Mutex::ScopedLock l(lock); - ++totalMsgsPublished; - - QPID_LOG(debug, "Client " << client << " sending " << groupId << ":" << sequence << - ((eos) ? " (last)" : "")); - } - - bool eraseGroup( const std::string& groupId, const std::string& name ) - { - qpid::sys::Mutex::ScopedLock l(lock); - QPID_LOG(debug, "Deleting group " << groupId << " (by client " << name << ")"); - return sequenceMap.erase( groupId ) == 1; - } - - uint getNextExpectedSequence( const std::string& groupId ) - { - qpid::sys::Mutex::ScopedLock l(lock); - return sequenceMap[groupId]; - } - - bool allMsgsPublished() // true when done publishing msgs - { - qpid::sys::Mutex::ScopedLock l(lock); - return (producerCt == 0 || totalMsgsPublished >= totalMsgs); - } - - bool allMsgsConsumed() // true when done consuming msgs - { - qpid::sys::Mutex::ScopedLock l(lock); - return (consumerCt == 0 || - (totalMsgsConsumed >= totalMsgs && sequenceMap.size() == 0)); - } - - uint getTotalMessages() - { - return totalMsgs; - } - - uint getConsumedTotal() - { - qpid::sys::Mutex::ScopedLock l(lock); - return totalMsgsConsumed; - } - - uint getPublishedTotal() - { - qpid::sys::Mutex::ScopedLock l(lock); - return totalMsgsPublished; - } - - ostream& print(ostream& out) - { - qpid::sys::Mutex::ScopedLock l(lock); - out << "Total Published: " << totalMsgsPublished << ", Total Consumed: " << totalMsgsConsumed << - ", Duplicates detected: " << duplicateMsgs << std::endl; - out << "Total Groups: " << statistics.size() << std::endl; - unsigned long consumers = 0; - for (GroupStatistics::iterator gs = statistics.begin(); gs != statistics.end(); ++gs) { - out << " GroupId: " << gs->first; - consumers += gs->second.size(); // # of consumers that processed this group - if (gs->second.size() == 1) - out << " completely consumed by a single client." << std::endl; - else - out << " consumed by " << gs->second.size() << " different clients." << std::endl; - - for (ClientCounter::iterator cc = gs->second.begin(); cc != gs->second.end(); ++cc) { - out << " Client: " << cc->first << " consumed " << cc->second << " messages from the group." << std::endl; - } - } - out << "Average # of consumers per group: " << ((statistics.size() != 0) ? (double(consumers)/statistics.size()) : 0) << std::endl; - return out; - } -}; - - -namespace { - // rand() is not thread safe. Create a singleton obj to hold a lock while calling - // rand() so it can be called safely by multiple concurrent clients. - class Randomizer { - qpid::sys::Mutex lock; - public: - uint operator()(uint max) { - qpid::sys::Mutex::ScopedLock l(lock); - return (rand() % max) + 1; - } - }; - - static Randomizer randomizer; -} - - -// tag each generated message with a group identifer -// -class GroupGenerator { - - const std::string groupPrefix; - const uint groupSize; - const bool randomizeSize; - const uint interleave; - - uint groupSuffix; - uint total; - - struct GroupState { - std::string id; - const uint size; - uint count; - GroupState( const std::string& i, const uint s ) - : id(i), size(s), count(0) {} - }; - typedef std::list<GroupState> GroupList; - GroupList groups; - GroupList::iterator current; - - // add a new group identifier to the list - void newGroup() { - std::ostringstream groupId(groupPrefix, ios_base::out|ios_base::ate); - groupId << std::string(":") << groupSuffix++; - uint size = (randomizeSize) ? randomizer(groupSize) : groupSize; - QPID_LOG(trace, "New group: GROUPID=[" << groupId.str() << "] size=" << size << " this=" << this); - GroupState group( groupId.str(), size ); - groups.push_back( group ); - } - -public: - GroupGenerator( const std::string& prefix, - const uint t, - const uint size, - const bool randomize, - const uint i) - : groupPrefix(prefix), groupSize(size), - randomizeSize(randomize), interleave(i), groupSuffix(0), total(t) - { - QPID_LOG(trace, "New group generator: PREFIX=[" << prefix << "] total=" << total << " size=" << size << " rand=" << randomize << " interleave=" << interleave << " this=" << this); - for (uint i = 0; i < 1 || i < interleave; ++i) { - newGroup(); - } - current = groups.begin(); - } - - bool genGroup(std::string& groupId, uint& seq, bool& eos) - { - if (!total) return false; - --total; - if (current == groups.end()) - current = groups.begin(); - groupId = current->id; - seq = current->count++; - if (current->count == current->size) { - QPID_LOG(trace, "Last msg for " << current->id << ", " << current->count << " this=" << this); - eos = true; - if (total >= interleave) { // need a new group to replace this one - newGroup(); - groups.erase(current++); - } else ++current; - } else { - ++current; - eos = total < interleave; // mark eos on the last message of each group - } - QPID_LOG(trace, "SENDING GROUPID=[" << groupId << "] seq=" << seq << " eos=" << eos << " this=" << this); - return true; - } -}; - - - -class Client : public qpid::sys::Runnable -{ -public: - typedef boost::shared_ptr<Client> shared_ptr; - enum State {ACTIVE, DONE, FAILURE}; - Client( const std::string& n, const Options& o ) : name(n), opts(o), state(ACTIVE), stopped(false) {} - virtual ~Client() {} - State getState() { return state; } - void testFailed( const std::string& reason ) { state = FAILURE; error << "Client '" << name << "' failed: " << reason; } - void clientDone() { if (state == ACTIVE) state = DONE; } - qpid::sys::Thread& getThread() { return thread; } - const std::string getErrorMsg() { return error.str(); } - void stop() {stopped = true;} - const std::string& getName() { return name; } - -protected: - const std::string name; - const Options& opts; - qpid::sys::Thread thread; - ostringstream error; - State state; - bool stopped; -}; - - -class Consumer : public Client -{ - GroupChecker& checker; - -public: - Consumer(const std::string& n, const Options& o, GroupChecker& c ) : Client(n, o), checker(c) {}; - virtual ~Consumer() {}; - - void run() - { - Connection connection; - try { - connection = Connection(opts.url, opts.connectionOptions); - connection.open(); - std::auto_ptr<FailoverUpdates> updates(opts.failoverUpdates ? new FailoverUpdates(connection) : 0); - Session session = connection.createSession(); - Receiver receiver = session.createReceiver(opts.address); - receiver.setCapacity(opts.capacity); - Message msg; - uint count = 0; - - while (!stopped) { - if (receiver.fetch(msg, Duration::SECOND)) { // msg retrieved - qpid::types::Variant::Map& properties = msg.getProperties(); - std::string groupId = properties[opts.groupKey]; - uint groupSeq = properties[SN]; - bool eof = properties[EOS]; - - QPID_LOG(trace, "RECVING GROUPID=[" << groupId << "] seq=" << groupSeq << " eos=" << eof << " name=" << name); - - qpid::sys::usleep(10); - - if (!checker.checkSequence( groupId, groupSeq, name )) { - ostringstream msg; - msg << "Check sequence failed. Group=" << groupId << " rcvd seq=" << groupSeq << " expected=" << checker.getNextExpectedSequence( groupId ); - testFailed( msg.str() ); - break; - } else if (eof) { - if (!checker.eraseGroup( groupId, name )) { - ostringstream msg; - msg << "Erase group failed. Group=" << groupId << " rcvd seq=" << groupSeq; - testFailed( msg.str() ); - break; - } - } - - ++count; - if (opts.ackFrequency && (count % opts.ackFrequency == 0)) { - session.acknowledge(); - } - // Clear out message properties & content for next iteration. - msg = Message(); // TODO aconway 2010-12-01: should be done by fetch - } else if (checker.allMsgsConsumed()) // timed out, nothing else to do? - break; - } - session.acknowledge(); - session.close(); - connection.close(); - } catch(const std::exception& error) { - ostringstream msg; - msg << "consumer error: " << error.what(); - testFailed( msg.str() ); - connection.close(); - } - clientDone(); - QPID_LOG(trace, "Consuming client " << name << " completed."); - } -}; - - - -class Producer : public Client -{ - GroupChecker& checker; - GroupGenerator generator; - -public: - Producer(const std::string& n, const Options& o, GroupChecker& c) - : Client(n, o), checker(c), - generator( n, o.messages, o.groupSize, o.randomizeSize, o.interleave ) - {}; - virtual ~Producer() {}; - - void run() - { - Connection connection; - try { - connection = Connection(opts.url, opts.connectionOptions); - connection.open(); - std::auto_ptr<FailoverUpdates> updates(opts.failoverUpdates ? new FailoverUpdates(connection) : 0); - Session session = connection.createSession(); - Sender sender = session.createSender(opts.address); - if (opts.capacity) sender.setCapacity(opts.capacity); - Message msg; - msg.setDurable(opts.durable); - std::string groupId; - uint seq; - bool eos; - uint sent = 0; - - qpid::sys::AbsTime start = qpid::sys::now(); - int64_t interval = 0; - if (opts.sendRate) interval = qpid::sys::TIME_SEC/opts.sendRate; - - while (!stopped && generator.genGroup(groupId, seq, eos)) { - msg.getProperties()[opts.groupKey] = groupId; - msg.getProperties()[SN] = seq; - msg.getProperties()[EOS] = eos; - checker.sendingSequence( groupId, seq, eos, name ); - - sender.send(msg); - ++sent; - - 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); - } - } - session.sync(); - session.close(); - connection.close(); - } catch(const std::exception& error) { - ostringstream msg; - msg << "producer '" << name << "' error: " << error.what(); - testFailed(msg.str()); - connection.close(); - } - clientDone(); - QPID_LOG(trace, "Producing client " << name << " completed."); - } -}; - - -}} // namespace qpid::tests - -using namespace qpid::tests; - -int main(int argc, char ** argv) -{ - int status = 0; - try { - Options opts; - if (opts.parse(argc, argv)) { - - GroupChecker state( opts.messages, - opts.receivers, - opts.senders, - opts.allowDuplicates); - std::vector<Client::shared_ptr> clients; - - if (opts.randomizeSize) srand((unsigned int)qpid::sys::SystemInfo::getProcessId()); - - // fire off the producers && consumers - for (size_t j = 0; j < opts.senders; ++j) { - ostringstream name; - name << opts.prefix << "P_" << j; - clients.push_back(Client::shared_ptr(new Producer( name.str(), opts, state ))); - clients.back()->getThread() = qpid::sys::Thread(*clients.back()); - } - for (size_t j = 0; j < opts.receivers; ++j) { - ostringstream name; - name << opts.prefix << "C_" << j; - clients.push_back(Client::shared_ptr(new Consumer( name.str(), opts, state ))); - clients.back()->getThread() = qpid::sys::Thread(*clients.back()); - } - - // wait for all pubs/subs to finish.... or for consumers to fail or stall. - uint stalledTime = 0; - bool clientFailed = false; - while (!clientFailed && (!state.allMsgsPublished() || !state.allMsgsConsumed())) { - uint lastCount; - - lastCount = state.getConsumedTotal(); - qpid::sys::usleep( 1000000 ); - - // check each client for failures - for (std::vector<Client::shared_ptr>::iterator i = clients.begin(); - i != clients.end(); ++i) { - QPID_LOG(debug, "Client " << (*i)->getName() << " state=" << (*i)->getState()); - if ((*i)->getState() == Client::FAILURE) { - QPID_LOG(error, argv[0] << ": test failed with client error: " << (*i)->getErrorMsg()); - clientFailed = true; - break; // exit test. - } - } - - // check for stalled consumers - if (!clientFailed && !state.allMsgsConsumed()) { - if (lastCount == state.getConsumedTotal()) { - if (++stalledTime >= opts.timeout) { - clientFailed = true; - break; // exit test - } - } else { - stalledTime = 0; - } - } - QPID_LOG(debug, "Consumed to date = " << state.getConsumedTotal() << - " Published to date = " << state.getPublishedTotal() << - " total=" << state.getTotalMessages()); - } - - if (clientFailed) { - if (stalledTime >= opts.timeout) { - QPID_LOG(error, argv[0] << ": test failed due to stalled consumer." ); - status = 2; - } else { - status = 1; - } - } - - // Wait for started threads. - for (std::vector<Client::shared_ptr>::iterator i = clients.begin(); - i != clients.end(); ++i) { - (*i)->stop(); - (*i)->getThread().join(); - } - - if (opts.printReport && !status) state.print(std::cout); - } else status = 4; - } catch(const std::exception& error) { - QPID_LOG(error, argv[0] << ": " << error.what()); - status = 3; - } - QPID_LOG(trace, "TEST DONE [" << status << "]"); - - return status; -} diff --git a/qpid/cpp/src/tests/perfdist b/qpid/cpp/src/tests/perfdist deleted file mode 100755 index 4049b410ff..0000000000 --- a/qpid/cpp/src/tests/perfdist +++ /dev/null @@ -1,87 +0,0 @@ -#!/usr/bin/env 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/qpid/cpp/src/tests/ping_broker b/qpid/cpp/src/tests/ping_broker deleted file mode 100755 index bdf48f3358..0000000000 --- a/qpid/cpp/src/tests/ping_broker +++ /dev/null @@ -1,134 +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 -from optparse import OptionParser, OptionGroup -import sys -import locale -import socket -import re -from qpid.messaging import Connection - -home = os.environ.get("QPID_TOOLS_HOME", os.path.normpath("/usr/share/qpid-tools")) -sys.path.append(os.path.join(home, "python")) - -from qpidtoollibs import BrokerAgent -from qpidtoollibs import Display, Header, Sorter, YN, Commas, TimeLong - - -class Config: - def __init__(self): - self._host = "localhost" - self._connTimeout = 10 - -config = Config() -conn_options = {} - -def OptionsAndArguments(argv): - """ Set global variables for options, return arguments """ - - global config - global conn_options - - usage = "%prog [options]" - - parser = OptionParser(usage=usage) - - parser.add_option("-b", "--broker", action="store", type="string", default="localhost", metavar="<url>", - help="URL of the broker to query") - parser.add_option("-t", "--timeout", action="store", type="int", default=10, metavar="<secs>", - help="Maximum time to wait for broker connection (in seconds)") - parser.add_option("--sasl-mechanism", action="store", type="string", metavar="<mech>", - help="SASL mechanism for authentication (e.g. EXTERNAL, ANONYMOUS, PLAIN, CRAM-MD5, DIGEST-MD5, GSSAPI). SASL automatically picks the most secure available mechanism - use this option to override.") - parser.add_option("--ssl-certificate", action="store", type="string", metavar="<cert>", help="Client SSL certificate (PEM Format)") - parser.add_option("--ssl-key", action="store", type="string", metavar="<key>", help="Client SSL private key (PEM Format)") - parser.add_option("--ssl-trustfile", action="store", type="string", metavar="<CA>", help="List of trusted CAs (PEM Format)") - parser.add_option("--ssl-skip-hostname-check", action="store_true", - help="Do not validate hostname in peer certificate") - parser.add_option("--ha-admin", action="store_true", help="Allow connection to a HA backup broker.") - - opts, args = parser.parse_args(args=argv) - - config._host = opts.broker - config._connTimeout = opts.timeout - - if opts.sasl_mechanism: - conn_options['sasl_mechanisms'] = opts.sasl_mechanism - if opts.ssl_certificate: - conn_options['ssl_certfile'] = opts.ssl_certificate - if opts.ssl_key: - conn_options['ssl_key'] = opts.ssl_key - if opts.ssl_trustfile: - conn_options['ssl_trustfile'] = opts.ssl_trustfile - if opts.ssl_skip_hostname_check: - conn_options['ssl_skip_hostname_check'] = True - if opts.ha_admin: - conn_options['client_properties'] = {'qpid.ha-admin' : 1} - return args - -class BrokerManager: - def __init__(self): - self.brokerName = None - self.connection = None - self.broker = None - self.cluster = None - - def SetBroker(self, brokerUrl): - self.url = brokerUrl - self.connection = Connection.establish(self.url, **conn_options) - self.broker = BrokerAgent(self.connection) - - def Disconnect(self): - """ Release any allocated brokers. Ignore any failures as the tool is - shutting down. - """ - try: - connection.close() - except: - pass - - def Ping(self, args): - for sequence in range(10): - result = self.broker.echo(sequence, "ECHO BODY") - if result['sequence'] != sequence: - raise Exception("Invalid Sequence") - - -def main(argv=None): - - args = OptionsAndArguments(argv) - bm = BrokerManager() - - try: - bm.SetBroker(config._host) - bm.Ping(args) - bm.Disconnect() - return 0 - except KeyboardInterrupt: - print - except Exception,e: - print "Failed: %s - %s" % (e.__class__.__name__, e) - - bm.Disconnect() # try to deallocate brokers - return 1 - -if __name__ == "__main__": - sys.exit(main()) diff --git a/qpid/cpp/src/tests/plano.py b/qpid/cpp/src/tests/plano.py deleted file mode 100644 index e76fba03eb..0000000000 --- a/qpid/cpp/src/tests/plano.py +++ /dev/null @@ -1,559 +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. -# - -from __future__ import print_function - -import atexit as _atexit -import codecs as _codecs -import fnmatch as _fnmatch -import getpass as _getpass -import os as _os -import random as _random -import re as _re -import shutil as _shutil -import subprocess as _subprocess -import sys as _sys -import tarfile as _tarfile -import tempfile as _tempfile -import traceback as _traceback - -# See documentation at http://www.ssorj.net/projects/plano.html - -def fail(message, *args): - error(message, *args) - - if isinstance(message, BaseException): - raise message - - raise Exception(message) - -def error(message, *args): - _print_message("Error", message, args, _sys.stderr) - -def warn(message, *args): - _print_message("Warn", message, args, _sys.stderr) - -def notice(message, *args): - _print_message(None, message, args, _sys.stdout) - -def debug(message, *args): - _print_message("Debug", message, args, _sys.stdout) - -def exit(message=None, *args): - if message is None: - _sys.exit() - - _print_message("Error", message, args, _sys.stderr) - - _sys.exit(1) - -def _print_message(category, message, args, file): - message = _format_message(category, message, args) - - print(message, file=file) - file.flush() - -def _format_message(category, message, args): - if isinstance(message, BaseException): - message = str(message) - - if message == "": - message = message.__class__.__name__ - - if category: - message = "{0}: {1}".format(category, message) - - if args: - message = message.format(*args) - - script = split(_sys.argv[0])[1] - message = "{0}: {1}".format(script, message) - - return message - -def flush(): - _sys.stdout.flush() - _sys.stderr.flush() - -absolute_path = _os.path.abspath -normalize_path = _os.path.normpath -exists = _os.path.exists -is_absolute = _os.path.isabs -is_dir = _os.path.isdir -is_file = _os.path.isfile -is_link = _os.path.islink - -join = _os.path.join -split = _os.path.split -split_extension = _os.path.splitext - -LINE_SEP = _os.linesep -PATH_SEP = _os.sep -PATH_VAR_SEP = _os.pathsep -ENV = _os.environ -ARGS = _sys.argv - -current_dir = _os.getcwd - -def home_dir(user=""): - return _os.path.expanduser("~{0}".format(user)) - -def parent_dir(path): - path = normalize_path(path) - parent, child = split(path) - - return parent - -def file_name(file): - file = normalize_path(file) - dir, name = split(file) - - return name - -def name_stem(file): - name = file_name(file) - - if name.endswith(".tar.gz"): - name = name[:-3] - - stem, ext = split_extension(name) - - return stem - -def name_extension(file): - name = file_name(file) - stem, ext = split_extension(name) - - return ext - -def read(file): - with _codecs.open(file, encoding="utf-8", mode="r") as f: - return f.read() - -def write(file, string): - with _codecs.open(file, encoding="utf-8", mode="w") as f: - f.write(string) - - return file - -def append(file, string): - with _codecs.open(file, encoding="utf-8", mode="a") as f: - f.write(string) - - return file - -def prepend(file, string): - orig = read(file) - prepended = string + orig - - return write(file, prepended) - -def touch(file): - return append(file, "") - -def tail(file, n): - return "".join(tail_lines(file, n)) - -def read_lines(file): - with _codecs.open(file, encoding="utf-8", mode="r") as f: - return f.readlines() - -def write_lines(file, lines): - with _codecs.open(file, encoding="utf-8", mode="r") as f: - f.writelines(lines) - - return file - -def append_lines(file, lines): - with _codecs.open(file, encoding="utf-8", mode="a") as f: - f.writelines(string) - - return file - -def prepend_lines(file, lines): - orig_lines = read_lines(file) - - with _codecs.open(file, encoding="utf-8", mode="w") as f: - f.writelines(lines) - f.writelines(orig_lines) - - return file - -# Derived from http://stackoverflow.com/questions/136168/get-last-n-lines-of-a-file-with-python-similar-to-tail -def tail_lines(file, n): - assert n >= 0 - - with _codecs.open(file, encoding="utf-8", mode="r") as f: - pos = n + 1 - lines = list() - - while len(lines) <= n: - try: - f.seek(-pos, 2) - except IOError: - f.seek(0) - break - finally: - lines = f.readlines() - - pos *= 2 - - return lines[-n:] - -_temp_dir = _tempfile.mkdtemp(prefix="plano.") - -def _get_temp_file(key): - assert not key.startswith("_") - - return join(_temp_dir, "_file_{0}".format(key)) - -def _remove_temp_dir(): - _shutil.rmtree(_temp_dir, ignore_errors=True) - -_atexit.register(_remove_temp_dir) - -def read_temp(key): - file = _get_temp_file(key) - return read(file) - -def write_temp(key, string): - file = _get_temp_file(key) - return write(file, string) - -def append_temp(key, string): - file = _get_temp_file(key) - return append(file, string) - -def prepend_temp(key, string): - file = _get_temp_file(key) - return prepend(file, string) - -def make_temp(key): - return append_temp(key, "") - -def open_temp(key, mode="r"): - file = _get_temp_file(key) - return _codecs.open(file, encoding="utf-8", mode=mode) - -# This one is deleted on process exit -def make_temp_dir(): - return _tempfile.mkdtemp(prefix="_dir_", dir=_temp_dir) - -# This one sticks around -def make_user_temp_dir(): - temp_dir = _tempfile.gettempdir() - user = _getpass.getuser() - user_temp_dir = join(temp_dir, user) - - return make_dir(user_temp_dir) - -def copy(from_path, to_path): - notice("Copying '{0}' to '{1}'", from_path, to_path) - - to_dir = parent_dir(to_path) - - if to_dir: - make_dir(to_dir) - - if is_dir(from_path): - _copytree(from_path, to_path, symlinks=True) - else: - _shutil.copy(from_path, to_path) - - return to_path - -def move(from_path, to_path): - notice("Moving '{0}' to '{1}'", from_path, to_path) - - _shutil.move(from_path, to_path) - - return to_path - -def rename(path, expr, replacement): - path = normalize_path(path) - parent_dir, name = split(path) - to_name = string_replace(name, expr, replacement) - to_path = join(parent_dir, to_name) - - notice("Renaming '{0}' to '{1}'", path, to_path) - - move(path, to_path) - - return to_path - -def remove(path): - notice("Removing '{0}'", path) - - if not exists(path): - return - - if is_dir(path): - _shutil.rmtree(path, ignore_errors=True) - else: - _os.remove(path) - - return path - -def make_link(source_path, link_file): - if exists(link_file): - assert read_link(link_file) == source_path - return - - _os.symlink(source_path, link_file) - - return link_file - -def read_link(file): - return _os.readlink(file) - -def find(dir, *patterns): - matched_paths = set() - - if not patterns: - patterns = ("*",) - - for root, dirs, files in _os.walk(dir): - for pattern in patterns: - matched_dirs = _fnmatch.filter(dirs, pattern) - matched_files = _fnmatch.filter(files, pattern) - - matched_paths.update([join(root, x) for x in matched_dirs]) - matched_paths.update([join(root, x) for x in matched_files]) - - return sorted(matched_paths) - -def find_any_one(dir, *patterns): - paths = find(dir, *patterns) - - if len(paths) == 0: - return - - return paths[0] - -def find_only_one(dir, *patterns): - paths = find(dir, *patterns) - - if len(paths) == 0: - return - - assert len(paths) == 1 - - return paths[0] - -# find_via_expr? - -def string_replace(string, expr, replacement, count=0): - return _re.sub(expr, replacement, string, count) - -def make_dir(dir): - if not exists(dir): - _os.makedirs(dir) - - return dir - -# Returns the current working directory so you can change it back -def change_dir(dir): - notice("Changing directory to '{0}'", dir) - - cwd = current_dir() - _os.chdir(dir) - return cwd - -def list_dir(dir, *patterns): - assert is_dir(dir) - - names = _os.listdir(dir) - - if not patterns: - return sorted(names) - - matched_names = set() - - for pattern in patterns: - matched_names.update(_fnmatch.filter(names, pattern)) - - return sorted(matched_names) - -class working_dir(object): - def __init__(self, dir): - self.dir = dir - self.prev_dir = None - - def __enter__(self): - self.prev_dir = change_dir(self.dir) - return self.dir - - def __exit__(self, type, value, traceback): - change_dir(self.prev_dir) - -def _init_call(command, args, kwargs): - if args: - command = command.format(*args) - - if "shell" not in kwargs: - kwargs["shell"] = True - - notice("Calling '{0}'", command) - - return command, kwargs - -def call(command, *args, **kwargs): - command, kwargs = _init_call(command, args, kwargs) - _subprocess.check_call(command, **kwargs) - -def call_for_output(command, *args, **kwargs): - command, kwargs = _init_call(command, args, kwargs) - return _subprocess_check_output(command, **kwargs) - -def make_archive(input_dir, output_dir, archive_stem): - temp_dir = make_temp_dir() - temp_input_dir = join(temp_dir, archive_stem) - - copy(input_dir, temp_input_dir) - make_dir(output_dir) - - output_file = "{0}.tar.gz".format(join(output_dir, archive_stem)) - output_file = absolute_path(output_file) - - with working_dir(temp_dir): - call("tar -czf {0} {1}", output_file, archive_stem) - - return output_file - -def extract_archive(archive_file, output_dir): - assert is_file(archive_file) - - if not exists(output_dir): - make_dir(output_dir) - - archive_file = absolute_path(archive_file) - - with working_dir(output_dir): - call("tar -xf {0}", archive_file) - - return output_dir - -def rename_archive(archive_file, new_archive_stem): - assert is_file(archive_file) - - if name_stem(archive_file) == new_archive_stem: - return - - temp_dir = make_temp_dir() - - extract_archive(archive_file, temp_dir) - - input_name = list_dir(temp_dir)[0] - input_dir = join(temp_dir, input_name) - output_file = make_archive(input_dir, temp_dir, new_archive_stem) - output_name = file_name(output_file) - archive_dir = parent_dir(archive_file) - new_archive_file = join(archive_dir, output_name) - - move(output_file, new_archive_file) - remove(archive_file) - - return new_archive_file - -def random_port(min=49152, max=65535): - return _random.randint(min, max) - -# Modified copytree impl that allows for already existing destination -# dirs -def _copytree(src, dst, symlinks=False, ignore=None): - """Recursively copy a directory tree using copy2(). - - If exception(s) occur, an Error is raised with a list of reasons. - - If the optional symlinks flag is true, symbolic links in the - source tree result in symbolic links in the destination tree; if - it is false, the contents of the files pointed to by symbolic - links are copied. - - The optional ignore argument is a callable. If given, it - is called with the `src` parameter, which is the directory - being visited by copytree(), and `names` which is the list of - `src` contents, as returned by os.listdir(): - - callable(src, names) -> ignored_names - - Since copytree() is called recursively, the callable will be - called once for each directory that is copied. It returns a - list of names relative to the `src` directory that should - not be copied. - - XXX Consider this example code rather than the ultimate tool. - - """ - names = _os.listdir(src) - if ignore is not None: - ignored_names = ignore(src, names) - else: - ignored_names = set() - - if not exists(dst): - _os.makedirs(dst) - errors = [] - for name in names: - if name in ignored_names: - continue - srcname = _os.path.join(src, name) - dstname = _os.path.join(dst, name) - try: - if symlinks and _os.path.islink(srcname): - linkto = _os.readlink(srcname) - _os.symlink(linkto, dstname) - elif _os.path.isdir(srcname): - _copytree(srcname, dstname, symlinks, ignore) - else: - # Will raise a SpecialFileError for unsupported file types - _shutil.copy2(srcname, dstname) - # catch the Error from the recursive copytree so that we can - # continue with other files - except _shutil.Error as err: - errors.extend(err.args[0]) - except EnvironmentError as why: - errors.append((srcname, dstname, str(why))) - try: - _shutil.copystat(src, dst) - except OSError as why: - if _shutil.WindowsError is not None and isinstance \ - (why, _shutil.WindowsError): - # Copying file access times may fail on Windows - pass - else: - errors.append((src, dst, str(why))) - if errors: - raise _shutil.Error(errors) - -# For Python 2.6 compatibility -def _subprocess_check_output(command, **kwargs): - kwargs["stdout"] = _subprocess.PIPE - - proc = _subprocess.Popen(command, **kwargs) - output = proc.communicate()[0] - exit_code = proc.poll() - - if exit_code not in (None, 0): - error = _subprocess.CalledProcessError(exit_code, command) - error.output = output - - raise error - - return output diff --git a/qpid/cpp/src/tests/policies.py b/qpid/cpp/src/tests/policies.py deleted file mode 100644 index 265a04557f..0000000000 --- a/qpid/cpp/src/tests/policies.py +++ /dev/null @@ -1,136 +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. -# - -from qpid.tests.messaging.implementation import * -from qpid.tests.messaging import VersionTest -from mgmt_1 import Mgmt - -class PoliciesTests (VersionTest): - """ - Tests for node policies with qpidd - """ - - def do_simple_queue_test(self, pattern, name, properties={}, autodeleted=True): - mgmt = self.create_connection("amqp0-10", True) - agent = Mgmt(mgmt) - agent.create('QueuePolicy', pattern, properties) - try: - snd = self.ssn.sender(name) - msgs = [Message(content=s, subject = s) for s in ['a','b','c','d']] - for m in msgs: snd.send(m) - snd.close() - - for expected in msgs: - rcv = self.ssn.receiver(name) - msg = rcv.fetch(0) - assert msg.content == expected.content, (msg.content, expected.content) - self.ssn.acknowledge() - rcv.close() #close after each message to ensure queue isn't deleted with messages in it - self.ssn.close() - self.conn.close() - - matched = [q for q in agent.list("Queue") if q['name'] == name] - if autodeleted: - # ensure that queue is no longer there (as empty and unused) - assert len(matched) == 0, (matched) - else: - # ensure that queue is still there though empty and unused - assert len(matched) == 1, (matched) - finally: - agent.delete('QueuePolicy', pattern) - mgmt.close() - - def test_queue(self): - self.do_simple_queue_test("queue-*", "queue-1") - - def test_queue_not_autodeleted(self): - self.do_simple_queue_test("permanent-queue-*", "permanent-queue-1", {'auto-delete':False}, False) - - def test_queue_manual_delete(self): - self.do_simple_queue_test("permanent-queue-*", "permanent-queue-1", {'qpid.lifetime-policy':'manual'}, False) - - def test_queue_delete_if_unused_and_empty(self): - self.do_simple_queue_test("queue-*", "queue-1", {'qpid.lifetime-policy':'delete-if-unused-and-empty'}, True) - - def do_simple_topic_test(self, pattern, name, properties={}, autodeleted=True): - mgmt = self.create_connection("amqp0-10", True) - agent = Mgmt(mgmt) - agent.create('TopicPolicy', pattern, properties) - try: - snd = self.ssn.sender(name) - rcv1 = self.ssn.receiver(name) - rcv2 = self.ssn.receiver(name) - - msgs = [Message(content=s, subject = s) for s in ['a','b','c','d']] - for m in msgs: snd.send(m) - - for rcv in [rcv1, rcv2]: - for expected in msgs: - msg = rcv.fetch(0) - assert msg.content == expected.content, (msg.content, expected.content) - self.ssn.acknowledge() - rcv1.close() - rcv2.close() - snd.close() - - matched = [e for e in agent.list("Exchange") if e['name'] == name] - if autodeleted: - # ensure that exchange is no longer there (as it is now unused) - assert len(matched) == 0, (matched) - else: - # ensure that exchange has not been autodeleted in spite of being unused - assert len(matched) == 1, (matched) - finally: - agent.delete('TopicPolicy', pattern) - mgmt.close() - - def test_topic(self): - self.do_simple_topic_test('fanout-*', 'fanout-1', {'exchange-type':'fanout'}) - - def test_topic_not_autodelete(self): - self.do_simple_topic_test('permanent-fanout-*', 'permanent-fanout-1', {'exchange-type':'fanout', 'auto-delete':False}, False) - - def test_topic_manual_delete(self): - self.do_simple_topic_test('permanent-fanout-*', 'permanent-fanout-1', {'exchange-type':'fanout', 'qpid.lifetime-policy':'manual'}, False) - - def test_topic_delete_if_unused(self): - self.do_simple_topic_test('fanout-*', 'fanout-1', {'exchange-type':'fanout', 'qpid.lifetime-policy':'delete-if-unused'}, True) - - def test_mgmt(self): - mgmt = self.create_connection("amqp0-10", True) - agent = Mgmt(mgmt) - agent.create('QueuePolicy', 'queue-*') - agent.create('QueuePolicy', 'alt.queue.*') - agent.create('TopicPolicy', 'topic-*') - try: - queues = [q['name'] for q in agent.list("QueuePolicy")] - topics = [t['name'] for t in agent.list("TopicPolicy")] - assert 'queue-*' in queues, (queues) - assert 'alt.queue.*' in queues, (queues) - - try: - agent.delete('TopicPolicy', 'queue-*') - assert False, ('Deletion of policy using wrong type should fail') - except: None - - finally: - agent.delete('QueuePolicy', 'queue-*') - agent.delete('QueuePolicy', 'alt.queue.*') - agent.delete('TopicPolicy', 'topic-*') - mgmt.close() diff --git a/qpid/cpp/src/tests/policy.acl b/qpid/cpp/src/tests/policy.acl deleted file mode 100644 index 4c13ac75c1..0000000000 --- a/qpid/cpp/src/tests/policy.acl +++ /dev/null @@ -1,20 +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. -# - -acl allow all all diff --git a/qpid/cpp/src/tests/publish.cpp b/qpid/cpp/src/tests/publish.cpp deleted file mode 100644 index 3f456e7588..0000000000 --- a/qpid/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/qpid/cpp/src/tests/qpid-analyze-trace b/qpid/cpp/src/tests/qpid-analyze-trace deleted file mode 100755 index 009fbc441c..0000000000 --- a/qpid/cpp/src/tests/qpid-analyze-trace +++ /dev/null @@ -1,258 +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 datetime import datetime -from optparse import OptionParser - -# Version of this tool software -MAJOR_VERSION = 1 -MINOR_VERSION = 1 -# === Version history === -# 2011-11-16 1.1: Bugfixs: -# QPID-3623 - Incorrect handling of transactions -# QPID-3624 - Replace argparse lib with optparse so tool can be used on Python 2.6. -# 2011-11-07 1.0: Initial checkin -# QPID-3579: Initial version checked in - - -# AMQP 0-10 commands - these increment the command counter -EXEC_COMMANDS = ["ExecutionSync", "ExecutionResult", "ExecutionException", "MessageTransfer", "MessageAccept", - "MessageReject", "MessageRelease", "MessageAcquire", "MessageResume", "MessageSubscribe", - "MessageCancel", "MessageSetFlowMode", "MessageFlow", "MessageFlush", "MessageStop", "TxSelect", - "TxCommit", "TxRollback", "DtxSelect", "DtxStart", "DtxEnd", "DtxCommit", "DtxForget", "DtxGetTimeout", - "DtxPrepare", "DtxRecover", "DtxRollback", "DtxSetTimeout", "ExchangeDeclare", "ExchangeDelete", - "ExchangeQuery", "ExchangeBind", "ExchangeUnbind", "ExchangeBound", "QueueDeclare", "QueueDelete", - "QueuePurge", "QueueQuery", "FileQos", "FileQosOk", "FileConsume", "FileConsumeOk", "FileCancel", - "FileOpen", "FileOpenOk", "FileStage", "FilePublish", "FileReturn", "FileDeliver", "FileAck", - "FileReject", "StreamQos", "StreamQosOk", "StreamConsume", "StreamConsumeOk", "StreamCancel", - "StreamPublish", "StreamReturn", "StreamDeliver"] -HEADER_STR = " -line ----------timestamp -----------connection ssn recv send- txn-- operation---------->" - -PROGRESS_LINES_PER_DOT = 100000 - -class LogLevel: - CRITICAL = (1, "critical") - ERROR = (2, "error") - WARNING = (3, "warning") - NOTICE = (4, "notice") - INFO = (5, "info") - DEBUG = (6, "debug") - TRACE = (7, "trace") - @staticmethod - def get_level(level): - if level == LogLevel.CRITICAL[1]: return LogLevel.CRITICAL - if level == LogLevel.ERROR[1]: return LogLevel.ERROR - if level == LogLevel.WARNING[1]: return LogLevel.WARNING - if level == LogLevel.NOTICE[1]: return LogLevel.NOTICE - if level == LogLevel.INFO[1]: return LogLevel.INFO - if level == LogLevel.DEBUG[1]: return LogLevel.DEBUG - if level == LogLevel.TRACE[1]: return LogLevel.TRACE - raise Exception("Unknown log level: %s" % level) - -class LogLine: - def __init__(self, line_no, line): - self.line_no = line_no - self.timestamp = datetime.strptime(line[:19], "%Y-%m-%d %H:%M:%S") - self.level = LogLevel.get_level(line[20:].split(" ")[0]) - self.line = line[21 + len(self.level[1]):].strip() - self.cmd_cnt = None - self.txn_cnt = None - def __str__(self): - if self.contains("RECV"): cnt_str = "R" - else: cnt_str = " S" - if self.cmd_cnt is not None: cnt_str += str(self.cmd_cnt) - set_index = self.find("{") - header_index = self.find("header") - content_index = self.find("content") - if self.txn_cnt is None: - txn_cnt_str = "" - else: - txn_cnt_str = "T%d" % self.txn_cnt - if header_index != -1 and header_index < set_index: op_str = " + " + self.line[header_index:self.line.rfind("]")] - elif content_index != -1 and set_index == -1: op_str = " + " + self.line[content_index:self.line.rfind("]")] - else: op_str = self.line[set_index+1:self.line.rfind("}")] - return " %7d %19s %22s %3d %-10s %-5s %s" % (self.line_no, self.timestamp.isoformat(" "), - self.get_identifier_remote_addr(), self.get_channel(), - cnt_str, txn_cnt_str, op_str) - def contains(self, string): - return self.line.find(string) != -1 - def find(self, string): - return self.line.find(string) - def get_channel(self): - return int(self.get_named_value("channel")) - def get_identifier(self): - return self.line.partition("[")[2].partition("]")[0] - def get_identifier_remote_addr(self): - return self.get_identifier().partition("-")[2] - def get_named_value(self, name): - return self.line.partition("%s=" % name)[2].partition(";")[0] - def get_msg_accept_range(self): - str_nums = self.get_named_value("transfers").strip(" {[]}").split(",") - return range(int(str_nums[0]), int(str_nums[1]) + 1) - def is_log_level(self, level): - if self.level is None: return None - return level[0] == self.level[0] - def is_frame(self): - return self.contains("Frame[") - -class ConnectionProperty: - def __init__(self, line): - self.addr = line.get_identifier_remote_addr() - self.channel = line.get_channel() - self.ops = [line] - def add_op(self, line): - self.ops.append(line) - -class Connection(ConnectionProperty): - def __init__(self, line): - ConnectionProperty.__init__(self, line) - self.session_list = [] # Keeps session creation order - self.session_dict = {} # For looking up by channel no. - def __str__(self): - return "Connection %s (ops=%d; sessions=%d):" % (self.addr, len(self.ops), len(self.session_dict)) - def add_session(self, session): - self.session_list.append(session) - self.session_dict[session.channel] = session - def get_session(self, channel): - return self.session_dict[channel] - -class Session(ConnectionProperty): - def __init__(self, line): - ConnectionProperty.__init__(self, line) - self.name = line.get_named_value("name") - self.send_cnt = 0 - self.recv_cnt = 0 - self.txn_flag = False - self.txn_cnt = 0 - self.recv_cmds = {} # For looking up by cmd no - self.send_cmds = {} # For looking up by cmd no - def __str__(self): - if self.txn_flag: - return " + Session %d (name=%s send-cmds=%d recv-cmds=%d txns=%d):" % (self.channel, self.name, - self.send_cnt, self.recv_cnt, - self.txn_cnt) - return " + Session %d (name=%s send-cmds=%d recv-cmds=%d non-txn):" % (self.channel, self.name, self.send_cnt, - self.recv_cnt) - def incr_recv_cnt(self, line): - self.recv_cmds[self.recv_cnt] = line - self.recv_cnt += 1 - def incr_send_cnt(self, line): - self.send_cmds[self.send_cnt] = line - self.send_cnt += 1 - def set_send_txn_cnt(self, cmd): - self.send_cmds[cmd].txn_cnt = self.txn_cnt - -class TraceAnalysis: - def __init__(self): - self.connection_list = [] # Keeps connection creation order - self.connection_dict = {} # For looking up by connection address - parser = OptionParser(usage="%prog [options] trace-file", version="%%prog %d.%d" % (MAJOR_VERSION, MINOR_VERSION), - description="A tool to structure and display Qpid broker trace logs.") - parser.add_option("--connection-summary", action="store_true", default=False, dest="connection_summary", - help="Hide connection details, provide one-line summary") - parser.add_option("--session-summary", action="store_true", default=False, dest="session_summary", - help="Hide session details, provide one-line summary") - parser.add_option("--summary", "-s", action="store_true", default=False, dest="summary", - help="Hide both connection and session details. Equivalent to --connection-summary and" - "--session-summary") - self.opts, self.args = parser.parse_args() - if len(self.args) == 0: raise Exception("Missing trace-file argument") - def analyze_trace(self): - lcnt = 0 - print "Reading trace file %s:" % self.args[0] - log_file = open(self.args[0], "r") - try: - for fline in log_file: - lcnt += 1 - try: - lline = LogLine(lcnt, fline) - if lline.is_log_level(LogLevel.TRACE) and lline.is_frame(): - if lline.contains("{ConnectionStartBody"): - conn = Connection(lline) - self.connection_list.append(conn) - self.connection_dict[conn.addr] = conn - elif lline.contains("{Connection"): - self.connection_dict[lline.get_identifier_remote_addr()].add_op(lline) - elif lline.contains("{SessionAttachBody"): - ssn = Session(lline) - self.connection_dict[ssn.addr].add_session(ssn) - else: - ssn = self.connection_dict[lline.get_identifier_remote_addr()].get_session(lline.get_channel()) - ssn.add_op(lline) - if lline.line[lline.find("{") + 1 : lline.find("Body")] in EXEC_COMMANDS: - if lline.contains("RECV"): - lline.cmd_cnt = ssn.recv_cnt - if ssn.txn_flag: - if lline.contains("MessageAcceptBody"): - lline.txn_cnt = ssn.txn_cnt - for cmd in lline.get_msg_accept_range(): - ssn.set_send_txn_cnt(cmd) - if lline.contains("MessageTransferBody"): lline.txn_cnt = ssn.txn_cnt - ssn.incr_recv_cnt(lline) - elif lline.contains("SEND") or lline.contains("SENT"): - lline.cmd_cnt = ssn.send_cnt - ssn.incr_send_cnt(lline) - # TODO: This treatment will probably break down for DTX - if lline.contains("xSelectBody"): - ssn.txn_flag = True - elif lline.contains("xCommitBody") or lline.contains("xRollbackBody"): - lline.txn_cnt = ssn.txn_cnt - ssn.txn_cnt += 1 - except KeyboardInterrupt, e: raise e - except: pass - if (lcnt + 1) % PROGRESS_LINES_PER_DOT == 0: - sys.stdout.write(".") - sys.stdout.flush() - finally: log_file.close() - if lcnt > PROGRESS_LINES_PER_DOT: print - print "Read and analyzed", lcnt, "lines." - def print_analysis(self): - if len(self.connection_list) > 0: - for c in self.connection_list: - print - print c - if not self.opts.connection_summary and not self.opts.summary: - print HEADER_STR - for o in c.ops: - print o - for s in c.session_list: - print s - if not self.opts.session_summary and not self.opts.summary: - print HEADER_STR - for o in s.ops: - print o - else: - print "No trace-level entries found in log." - -def check_python_version(major, minor, micro): - if sys.version_info < (major, minor, micro): - print "Incorrect Python version: %s found; >= %d.%d.%d needed." % (sys.version.split()[0], major, minor, micro) - sys.exit(-1) - -# === Main program === - -if __name__ == '__main__': - check_python_version(2, 4, 0) - t = TraceAnalysis() - t.analyze_trace() - t.print_analysis() -
\ No newline at end of file diff --git a/qpid/cpp/src/tests/qpid-client-test.cpp b/qpid/cpp/src/tests/qpid-client-test.cpp deleted file mode 100644 index 9198324f93..0000000000 --- a/qpid/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), verbose(false) - { - 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/qpid/cpp/src/tests/qpid-cluster-benchmark b/qpid/cpp/src/tests/qpid-cluster-benchmark deleted file mode 100755 index f20ac6ac30..0000000000 --- a/qpid/cpp/src/tests/qpid-cluster-benchmark +++ /dev/null @@ -1,64 +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 options -MESSAGES="-m 10000" -REPEAT="--repeat 10" -QUEUES="-q 6" -SENDERS="-s 3" -RECEIVERS="-r 3" -BROKERS= # Local broker -CLIENT_HOSTS= # No ssh, all clients are local -# Connection options -TCP_NODELAY=false -RECONNECT=true -HEARTBEAT=1 - -while getopts "m:f:n:b:q:s:r:c:h:i:txyv-" opt; do - case $opt in - b) BROKERS="-b $OPTARG";; - c) CLIENT_HOSTS="-c $OPTARG";; - h) HEARTBEAT=$OPTARG;; - i) RECONNECT=$OPTARG;; - m) MESSAGES="-m $OPTARG";; - n) REPEAT="--repeat $OPTARG";; - q) QUEUES="-q $OPTARG";; - r) RECEIVERS="-r $OPTARG";; - s) SENDERS="-s $OPTARG";; - t) TCP_NODELAY=true;; - v) OPTS="--verbose";; - x) SAVE_RECEIVED="--save-received";; - y) NO_DELETE="--no-delete";; - -) break ;; - *) echo "Unknown option"; exit 1;; - esac -done -shift $(($OPTIND-1)) - -CONNECTION_OPTIONS="--connection-options {tcp-nodelay:$TCP_NODELAY,reconnect:$RECONNECT,heartbeat:$HEARTBEAT}" - -BROKER=$(echo $BROKERS | sed s/,.*//) -run_test() { echo $*; shift; "$@"; echo; echo; echo; } - -OPTS="$OPTS $REPEAT $BROKERS --summarize $QUEUES $SENDERS $RECEIVERS $MESSAGES $CLIENT_HOSTS $SAVE_RECEIVED $CONNECTION_OPTIONS $NO_DELETE" - -run_test "Benchmark:" qpid-cpp-benchmark $OPTS "$@" diff --git a/qpid/cpp/src/tests/qpid-cpp-benchmark b/qpid/cpp/src/tests/qpid-cpp-benchmark deleted file mode 100755 index 3a5419de5e..0000000000 --- a/qpid/cpp/src/tests/qpid-cpp-benchmark +++ /dev/null @@ -1,366 +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, re, os - -try: - import qpid_messaging as qm -except ImportError: - qpid_messaging = None - import qpid.messaging as qm - -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("--tx", default=0, metavar="N", type="int", - help="Transaction batch size, 0 means no transactions") -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("--create-option", default=[], action="append", type="str", - help="Additional option for creating 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("--sequence", dest="sequence", default=False, - action="store_true", help="add a sequence number to each message") -op.add_option("--connection-options", type="str", - help="Connection options for senders & receivers") -op.add_option("--durable", default=False, action="store_true", - help="Use durable queues and messages") -op.add_option("-t", "--timeout", default=1.0, type="float", metavar="SECONDS", - help="Timeout for fetch operations (default %default)") -op.add_option("--save-received", default=False, action="store_true", - help="Save received message content to files <queuename>-receiver-<n>.msg") -op.add_option("--verbose", default=False, action="store_true", - help="Show commands executed") -op.add_option("--fill-drain", default=False, action="store_true", - help="First fill the queues, then drain them") -op.add_option("--qpid-send-path", default="", type="str", metavar="PATH", - help="path to qpid-send binary") -op.add_option("--qpid-receive-path", default="", type="str", metavar="PATH", - help="path to qpid-receive binary") - -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 - -class PopenCommand(Popen): - """Like Popen but you can query for the command""" - def __init__(self, command, *args, **kwargs): - self.command = command - Popen.__init__(self, command, *args, **kwargs) - -clients = Clients() - -def start_receive(queue, index, opts, ready_queue, broker, host): - address_opts=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 = [os.path.join(opts.qpid_receive_path, "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", "%s;{create:always}"%ready_queue, - "--report-header=no", - "--tx=%s" % opts.tx - ] - if opts.save_received: - command += ["--save-content=%s-receiver-%s.msg"%(queue,index)] - command += opts.receive_arg - if opts.connection_options: - command += ["--connection-options",opts.connection_options] - if host: command = ssh_command(host, command) - if opts.verbose: print "Receiver: ", command - return clients.add(PopenCommand(command, stdout=PIPE, stderr=PIPE)) - -def start_send(queue, opts, broker, host): - address="%s;{%s}"%(queue,",".join(opts.send_option + ["create:always"])) - command = [os.path.join(opts.qpid_send_path, "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=%s"%(opts.sequence and "yes" or "no"), - "--durable=%d" % opts.durable, - "--tx=%s" % opts.tx - ] - command += opts.send_arg - if opts.connection_options: - command += ["--connection-options",opts.connection_options] - if host: command = ssh_command(host, command) - if opts.verbose: print "Sender: ", command - return clients.add(PopenCommand(command, stdout=PIPE, stderr=PIPE)) - -def error_msg(out, err): - return ("\n[stdout]\n%s\n[stderr]\n%s[end]"%(out, err)) - -def first_line(p): - out,err=p.communicate() - if p.returncode != 0: - raise Exception("Process exit %d: %s"%(p.returncode, error_msg(out,err))) - return out.split("\n")[0] - -def connect(broker, opts): - if opts.connection_options: - copts = dict([kv.strip().split(":") for kv in opts.connection_options.strip("{}").split(",")]) - else: - copts = {} - return qm.Connection.establish(broker, **copts) - -def drain(queue, session, opts): - """ - Drain a queue to make sure it is empty. Throw away the messages. - """ - if opts.verbose: print "Draining", queue - r = session.receiver(queue, capacity=1000) - n = 0 - try: - while True: - # FIXME aconway 2014-11-21: activemq broker does not respect the drain flag - # so fetch on an empty queue will hang forever, use get with timeout instead. - # r.fetch(timeout=0) - m = qm.Message() - r.get(timeout=opts.timeout) - n += 1 - if n % 500 == 0: r.session.acknowledge() - r.session.acknowledge() - except qm.Empty: - pass - r.close() - if opts.verbose: print "Drained", queue, n - -def clear_queues(queues, brokers, opts): - c = connect(brokers[0], opts) - for q in queues: - s = c.session() - need_drain = False - try: - s.sender("%s;{delete:always}"%(q)).close() - if opts.verbose: print "Deleted", q - except qm.NotFound: - s = c.session() - except qm.AddressError: - need_drain = True # AMQP 1.0 does not support delete, drain instead. - s = c.session() - address_opts = ["create:always"] - if opts.durable: address_opts += ["node:{durable:true}"] - address = "%s;{%s}"%(q, ",".join(opts.create_option + address_opts)) - if opts.verbose: print "Declaring", address - s.sender(address) - if need_drain: drain(q, s, opts) - c.close() - -def print_header(timestamp): - if timestamp: latency_header="\tl-min\tl-max\tl-avg\ttotal-tp" - else: latency_header="" - print "send-tp\trecv-tp%s"%latency_header - -def parse(parser, lines): # Parse sender/receiver output - 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, total_tp): - for send,recv in map(None, send_stats, recv_stats): - line="" - if send: line += "%d"%send[0] - if recv: - line += "\t%d"%recv[0] - if len(recv) == 4: line += "\t%.2f\t%.2f\t%.2f"%tuple(recv[1:]) - if total_tp is not None: - line += "\t%d"%total_tp - total_tp = None - print line - -def print_summary(send_stats, recv_stats, total_tp): - 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%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) - summary += "\t%d"%total_tp - print summary - - -class ReadyReceiver: - """A receiver for ready messages""" - def __init__(self, queue, broker, opts): - self.connection = connect(broker, opts) - self.receiver = self.connection.session().receiver(queue) - self.receiver.session.sync() - self.timeout=opts.timeout - - def wait(self, receivers): - try: - for i in receivers: self.receiver.fetch(self.timeout) - self.receiver.session.acknowledge() - self.connection.close() - except qm.Empty: - for r in receivers: - if (r.poll() is not None): - out,err=r.communicate() - raise Exception("Receiver error: %s\n%s" % - (" ".join(r.command), error_msg(out,err))) - raise Exception("Timed out waiting for receivers to be ready") - -def flatten(l): - return sum(map(lambda s: re.split(re.compile("\s*,\s*|\s+"), s), 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() - opts.client_host = flatten(opts.client_host) - if not opts.broker: - if opts.client_host: - raise Exception("--broker must be specified if --client_host is.") - opts.broker = ["127.0.0.1"] # Deafult to local broker - opts.broker = flatten(opts.broker) - 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): - clear_queues(queues+[ready_queue], opts.broker, opts) - ready_receiver = ReadyReceiver(ready_queue, opts.broker[0], opts) - - def start_receivers(): - return [ start_receive(q, j, opts, ready_queue, brokers.next(), client_hosts.next()) - for q in queues for j in xrange(opts.receivers) ] - - - def start_senders(): - return [ 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) - - if opts.fill_drain: - # First fill the queues, then drain them - start = time.time() - senders = start_senders() - for p in senders: - if p: p.wait() - receivers = start_receivers() - for p in receivers: - if p: p.wait() - else: - # Run senders and receivers in parallel - receivers = start_receivers() - ready_receiver.wait(filter(None, receivers)) # Wait for receivers ready - start = time.time() - senders = start_senders() - for p in senders + receivers: - if p: p.wait() - - total_sent = opts.queues * opts.senders * opts.messages - total_tp = total_sent / (time.time()-start) - send_stats=parse_senders(senders) - recv_stats=parse_receivers(receivers) - if opts.summarize: print_summary(send_stats, recv_stats, total_tp) - else: print_data(send_stats, recv_stats, total_tp) - finally: clients.kill() # No strays - -if __name__ == "__main__": main() - diff --git a/qpid/cpp/src/tests/qpid-ctrl b/qpid/cpp/src/tests/qpid-ctrl deleted file mode 100755 index 4246c57898..0000000000 --- a/qpid/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/qpid/cpp/src/tests/qpid-latency-test.cpp b/qpid/cpp/src/tests/qpid-latency-test.cpp deleted file mode 100644 index a03963467b..0000000000 --- a/qpid/cpp/src/tests/qpid-latency-test.cpp +++ /dev/null @@ -1,480 +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() -{ - return Duration::FromEpoch(); -} - -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; - AbsTime start = now(); - AbsTime last = start; - while (true) { - AbsTime sentAt=now(); - msg.getDeliveryProperties().setTimestamp(Duration::FromEpoch()); - async(session).messageTransfer(arg::content=msg, arg::acceptMode=1); - if (opts.sync) session.sync(); - ++sent; - if (Duration(last, sentAt) > (opts.reportFrequency*TIME_MSEC)) { - Duration t(start, now()); - //check rate actually achieved thus far - if (t/TIME_SEC) { - uint actualRate = sent / (t/TIME_SEC); - //report inability to stay within 1% of desired rate - if (actualRate < opts.rate && opts.rate - actualRate > opts.rate/100) { - std::cerr << "WARNING: Desired send rate: " << opts.rate << ", actual send rate: " << actualRate << std::endl; - } - } - last = sentAt; - } - - AbsTime waitTill(start, sent*interval); - Duration delay(sentAt, waitTill); - if (delay > 0) - 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/qpid/cpp/src/tests/qpid-perftest.cpp b/qpid/cpp/src/tests/qpid-perftest.cpp deleted file mode 100644 index b26b76015f..0000000000 --- a/qpid/cpp/src/tests/qpid-perftest.cpp +++ /dev/null @@ -1,760 +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/OptionsTemplates.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; - size_t headers; - 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), headers(0), 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.") - ("headers", optValue(headers, "N"), "Number of headers to add to each message.") - ("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 (subs != 0 && count % subs) { - count += subs - (count % subs); - cout << "WARNING: Adjusted --count to " << count - << " the next multiple of --nsubs" << endl; - } - totalPubs = pubs*qt; - totalSubs = subs*qt; - subQuota = subs == 0 ? subs:(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"), boost::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.totalSubs, 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.headers) { - for (size_t i = 0; i < opts.headers; ++i) { - std::stringstream h; - h << "hdr" << i; - msg.getMessageProperties().getApplicationHeaders().setString(h.str(), h.str()); - } - } - - if (opts.txPub){ - session.txSelect(); - } - SubscriptionManager subs(session); - LocalQueue lq; - subs.setFlowControl(0, SubscriptionManager::UNLIMITED, false); - Subscription cs = subs.subscribe(lq, fqn("pub_start")); - - for (size_t j = 0; j < opts.iterations; ++j) { - cs.grantMessageCredit(1); - 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; - memcpy (&n, reinterpret_cast<const char*>(msg.getData().data() + offset), - sizeof(n)); - 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; - } - } -}; - -} - -template po::value_semantic* create_value(tests::Mode& val, const std::string& arg); - -} // 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/qpid/cpp/src/tests/qpid-ping.cpp b/qpid/cpp/src/tests/qpid-ping.cpp deleted file mode 100644 index 40e6a0f671..0000000000 --- a/qpid/cpp/src/tests/qpid-ping.cpp +++ /dev/null @@ -1,94 +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/Duration.h" -#include <qpid/messaging/Message.h> -#include <qpid/messaging/Sender.h> -#include <qpid/messaging/Receiver.h> -#include <qpid/messaging/Session.h> -#include <qpid/Msg.h> -#include <qpid/Options.h> -#include <qpid/types/Uuid.h> -#include <string> -#include <iostream> - -using namespace std; -using namespace qpid::messaging; -using qpid::types::Uuid; - -namespace { - -struct PingOptions : public qpid::Options { - string url; - string address; - string message; - string connectionOptions; - double timeout; // Timeout in seconds. - bool quiet; // No output - - PingOptions() : - url("127.0.0.1"), - address(Uuid(true).str()+";{create:always}"), - message(Uuid(true).str()), - timeout(1), - quiet(false) - { - using qpid::optValue; - addOptions() - ("broker,b", qpid::optValue(url, "URL"), "url of broker to connect to.") - ("address,a", qpid::optValue(address, "ADDRESS"), "address to use.") - ("message,m", optValue(message, "MESSAGE"), "message text to send.") - ("connection-options", optValue(connectionOptions, "OPTIONS"), "options for the connection.") - ("timeout,t", optValue(timeout, "SECONDS"), "Max time to wait.") - ("quiet,q", optValue(quiet), "Don't print anything to stderr/stdout."); - } -}; - -} // namespace - -int main(int argc, char** argv) { - Connection connection; - try { - PingOptions opts; - opts.parse(argc, argv); - connection = Connection(opts.url, opts.connectionOptions); - connection.open(); - if (!opts.quiet) cout << "Opened connection." << endl; - Session s = connection.createSession(); - s.createSender(opts.address).send(Message(opts.message)); - if (!opts.quiet) cout << "Sent message." << endl; - Message m = s.createReceiver(opts.address). - fetch(Duration(uint64_t(opts.timeout*1000))); - if (m.getContent() != opts.message) - throw qpid::Exception(qpid::Msg() << "Expected " << opts.message - << " but received " << m.getContent()); - if (!opts.quiet) cout << "Received message." << endl; - connection.close(); - return 0; - } catch (const exception& e) { - cerr << "Error: " << e.what() << endl; - connection.close(); - return 1; - } -} diff --git a/qpid/cpp/src/tests/qpid-receive.cpp b/qpid/cpp/src/tests/qpid-receive.cpp deleted file mode 100644 index eeb425f7b3..0000000000 --- a/qpid/cpp/src/tests/qpid-receive.cpp +++ /dev/null @@ -1,299 +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 verifySequence; - bool checkRedelivered; - uint capacity; - uint ackFrequency; - uint tx; - uint rollbackFrequency; - bool printContent; - bool printContentObjectType; - bool printHeaders; - bool failoverUpdates; - qpid::log::Options log; - bool reportTotal; - uint reportEvery; - bool reportHeader; - string readyAddress; - uint receiveRate; - std::string replyto; - bool noReplies; - - Options(const std::string& argv0=std::string()) - : qpid::Options("Options"), - help(false), - url("127.0.0.1"), - timeout(0), - forever(false), - messages(0), - ignoreDuplicates(false), - verifySequence(false), - checkRedelivered(false), - capacity(1000), - ackFrequency(100), - tx(0), - rollbackFrequency(0), - printContent(true), - printContentObjectType(false), - printHeaders(false), - failoverUpdates(false), - log(argv0), - reportTotal(false), - reportEvery(0), - reportHeader(true), - receiveRate(0), - noReplies(false) - { - 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)") - ("verify-sequence", qpid::optValue(verifySequence), "Verify there are no gaps in the message sequence (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-object-type", qpid::optValue(printContentObjectType, "yes|no"), "print a description of the content's object type if relevant") - ("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.") - ("reply-to", qpid::optValue(replyto, "REPLY-TO"), "specify reply-to address on response messages") - ("ignore-reply-to", qpid::optValue(noReplies), "Do not send replies even if reply-to is set") - ("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::cout << *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"); - -/** Check for duplicate or dropped messages by sequence number */ -class SequenceTracker -{ - public: - SequenceTracker(const Options& o) : opts(o), lastSn(0) {} - - /** Return true if the message should be procesed, false if it should be ignored. */ - bool track(Message& message) { - if (!(opts.verifySequence || opts.ignoreDuplicates)) - return true; // Not checking sequence numbers. - uint sn = message.getProperties()[SN]; - bool duplicate = (sn <= lastSn); - bool dropped = (sn > lastSn+1); - if (opts.verifySequence && dropped) - throw Exception(QPID_MSG("Gap in sequence numbers " << lastSn << "-" << sn)); - bool ignore = duplicate && opts.ignoreDuplicates; - if (ignore && opts.checkRedelivered && !message.getRedelivered()) - throw qpid::Exception("duplicate sequence number received, message not marked as redelivered!"); - if (!duplicate) lastSn = sn; - return !ignore; - } - - private: - const Options& opts; - uint lastSn; -}; - -}} // 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.messages == 0 ? opts.capacity : std::min(opts.capacity, opts.messages)); - Message msg; - uint count = 0; - uint txCount = 0; - SequenceTracker sequenceTracker(opts); - 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); - if (opts.tx) - session.commit(); - } - // 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 (sequenceTracker.track(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.getMessageId().size()) std::cout << "MessageId: " << msg.getMessageId() << 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: " << ((uint) 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; - if (msg.getContentType().size()) std::cout << "ContentType: " << msg.getContentType() << std::endl; - std::cout << std::endl; - } - if (opts.printContent) { - if (!msg.getContentObject().isVoid()) { - if (opts.printContentObjectType) { - std::cout << "[Object: " << getTypeName(msg.getContentObject().getType()) << "]" << std::endl; - } - std::cout << msg.getContentObject() << std::endl; - } else { - std::cout << msg.getContent() << std::endl; - } - } - if (opts.messages && count >= opts.messages) done = true; - } - } - 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() && !opts.noReplies) { // 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); - replyTo[msg.getReplyTo().str()] = s; - } - msg.setReplyTo(Address(opts.replyto)); - 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); - } - } - if (opts.reportTotal) reporter.report(); - if (opts.tx) { - if (opts.rollbackFrequency && (++txCount % opts.rollbackFrequency == 0)) { - session.rollback(); - } else { - session.commit(); - } - } else if (opts.ackFrequency) { - session.acknowledge(); - } - session.close(); - connection.close(); - return 0; - } - return 1; - } catch(const std::exception& error) { - std::cerr << "qpid-receive: " << error.what() << std::endl; - connection.close(); - return 1; - } -} diff --git a/qpid/cpp/src/tests/qpid-send.cpp b/qpid/cpp/src/tests/qpid-send.cpp deleted file mode 100644 index 1f4e25e5c1..0000000000 --- a/qpid/cpp/src/tests/qpid-send.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 <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 <qpid/sys/SystemInfo.h> -#include "TestOptions.h" -#include "Statistics.h" - -#include <fstream> -#include <iostream> -#include <memory> - -using std::string; -using std::ios_base; - -using qpid::messaging::Address; -using qpid::messaging::Connection; -using qpid::messaging::Duration; -using qpid::messaging::FailoverUpdates; -using qpid::messaging::Message; -using qpid::messaging::Receiver; -using qpid::messaging::Session; -using qpid::messaging::Sender; -using qpid::types::Exception; -using qpid::types::Uuid; -using qpid::types::Variant; - -namespace qpid { -namespace tests { - -typedef std::vector<std::string> string_vector; - -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; - bool autouserid; - 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; - bool sequence; - bool timestamp; - std::string groupKey; - std::string groupPrefix; - uint groupSize; - bool groupRandSize; - uint groupInterleave; - - Options(const std::string& argv0=std::string()) - : qpid::Options("Options"), - help(false), - url("127.0.0.1"), - messages(1), - sendEos(0), - durable(false), - ttl(0), - priority(0), - autouserid(false), - contentString(), - contentSize(0), - contentStdin(false), - tx(0), - rollbackFrequency(0), - capacity(1000), - failoverUpdates(false), - log(argv0), - reportTotal(false), - reportEvery(0), - reportHeader(true), - sendRate(0), - sequence(true), - timestamp(true), - groupPrefix("GROUP-"), - groupSize(10), - groupRandSize(false), - groupInterleave(1) - { - 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") - ("auto-user-id", qpid::optValue(autouserid, "yes| no"), "set userid for message based on authenticated identity") - ("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.") - ("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)") - ("group-key", qpid::optValue(groupKey, "KEY"), "Generate groups of messages using message header 'KEY' to hold the group identifier") - ("group-prefix", qpid::optValue(groupPrefix, "STRING"), "Generate group identifers with 'STRING' prefix (if group-key specified)") - ("group-size", qpid::optValue(groupSize, "N"), "Number of messages per a group (if group-key specified)") - ("group-randomize-size", qpid::optValue(groupRandSize), "Randomize the number of messages per group to [1...group-size] (if group-key specified)") - ("group-interleave", qpid::optValue(groupInterleave, "N"), "Simultaineously interleave messages from N different groups (if group-key specified)") - ("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::cout << *this << std::endl << std::endl - << "Sends messages to 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].parse(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"); - -class ContentGenerator { - public: - virtual ~ContentGenerator() {} - virtual bool setContent(Message& msg) = 0; - void setContentObject(Message& msg, const std::string& content, const std::string& encoding=std::string("utf8")) - { - Variant& obj = msg.getContentObject(); - obj = content; - obj.setEncoding(encoding); - } -}; - - -class GetlineContentGenerator : public ContentGenerator { - public: - virtual bool setContent(Message& msg) { - string content; - bool got = !!getline(std::cin, content); - if (got) { - setContentObject(msg, content); - } - return got; - } -}; - -class FixedContentGenerator : public ContentGenerator { - public: - FixedContentGenerator(const string& s) : content(s) {} - virtual bool setContent(Message& msg) { - setContentObject(msg, content); - return true; - } - private: - std::string content; -}; - -class MapContentGenerator : public ContentGenerator { - public: - MapContentGenerator(const Options& opt) : opts(opt) {} - virtual bool setContent(Message& msg) { - msg.getContentObject() = qpid::types::Variant::Map(); - opts.setEntries(msg.getContentObject().asMap()); - return true; - } - private: - const Options& opts; -}; - -// tag each generated message with a group identifer -// -class GroupGenerator { - public: - GroupGenerator(const std::string& key, - const std::string& prefix, - const uint size, - const bool randomize, - const uint interleave) - : groupKey(key), groupPrefix(prefix), groupSize(size), - randomizeSize(randomize), groupSuffix(0) - { - if (randomize) srand((unsigned int)qpid::sys::SystemInfo::getProcessId()); - - for (uint i = 0; i < 1 || i < interleave; ++i) { - newGroup(); - } - current = groups.begin(); - } - - void setGroupInfo(Message &msg) - { - if (current == groups.end()) - current = groups.begin(); - msg.getProperties()[groupKey] = current->id; - // std::cout << "SENDING GROUPID=[" << current->id << "]" << std::endl; - if (++(current->count) == current->size) { - newGroup(); - groups.erase(current++); - } else - ++current; - } - - private: - const std::string& groupKey; - const std::string& groupPrefix; - const uint groupSize; - const bool randomizeSize; - - uint groupSuffix; - - struct GroupState { - std::string id; - const uint size; - uint count; - GroupState( const std::string& i, const uint s ) - : id(i), size(s), count(0) {} - }; - typedef std::list<GroupState> GroupList; - GroupList groups; - GroupList::iterator current; - - void newGroup() { - std::ostringstream groupId(groupPrefix, ios_base::out|ios_base::ate); - groupId << groupSuffix++; - uint size = (randomizeSize) ? (rand() % groupSize) + 1 : groupSize; - // std::cout << "New group: GROUPID=[" << groupId.str() << "] size=" << size << std::endl; - GroupState group( groupId.str(), size ); - groups.push_back( group ); - } -}; - -}} // namespace qpid::tests - -using qpid::tests::Options; -using qpid::tests::Reporter; -using qpid::tests::Throughput; -using qpid::tests::ContentGenerator; -using qpid::tests::GroupGenerator; -using qpid::tests::GetlineContentGenerator; -using qpid::tests::MapContentGenerator; -using qpid::tests::FixedContentGenerator; -using qpid::tests::SN; -using qpid::tests::TS; -using qpid::tests::EOS; - -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(); - 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()) { - msg.setReplyTo(Address(opts.replyto)); - } - if (!opts.userid.empty()) msg.setUserId(opts.userid); - else if (opts.autouserid) msg.setUserId(connection.getAuthenticatedUsername()); - if (!opts.id.empty()) msg.setMessageId(opts.id); - 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)); - - std::auto_ptr<GroupGenerator> groupGen; - if (!opts.groupKey.empty()) - groupGen.reset(new GroupGenerator(opts.groupKey, - opts.groupPrefix, - opts.groupSize, - opts.groupRandSize, - opts.groupInterleave)); - - qpid::sys::AbsTime start = qpid::sys::now(); - int64_t interval = 0; - if (opts.sendRate) interval = qpid::sys::TIME_SEC/opts.sendRate; - - while (contentGen->setContent(msg)) { - ++sent; - if (opts.sequence) - msg.getProperties()[SN] = sent; - if (groupGen.get()) - groupGen->setGroupInfo(msg); - - if (opts.timestamp) - msg.getProperties()[TS] = int64_t( - qpid::sys::Duration::FromEpoch()); - 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.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); - } - } - 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; - } - return 1; - } catch(const std::exception& error) { - std::cerr << "qpid-send: " << error.what() << std::endl; - connection.close(); - return 1; - } -} diff --git a/qpid/cpp/src/tests/qpid-src-rinstall b/qpid/cpp/src/tests/qpid-src-rinstall deleted file mode 100755 index c7473e9197..0000000000 --- a/qpid/cpp/src/tests/qpid-src-rinstall +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/env bash -# -# 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/qpid/cpp/src/tests/qpid-stream.cpp b/qpid/cpp/src/tests/qpid-stream.cpp deleted file mode 100644 index f02a484750..0000000000 --- a/qpid/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/qpid/cpp/src/tests/qpid-topic-listener.cpp b/qpid/cpp/src/tests/qpid-topic-listener.cpp deleted file mode 100644 index c42e76d760..0000000000 --- a/qpid/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/qpid/cpp/src/tests/qpid-topic-publisher.cpp b/qpid/cpp/src/tests/qpid-topic-publisher.cpp deleted file mode 100644 index f9107b90d0..0000000000 --- a/qpid/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/qpid/cpp/src/tests/qpid-txtest.cpp b/qpid/cpp/src/tests/qpid-txtest.cpp deleted file mode 100644 index 59ab905af7..0000000000 --- a/qpid/cpp/src/tests/qpid-txtest.cpp +++ /dev/null @@ -1,342 +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/FieldValue.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(); - } - session.sync(); - } - } 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) { - framing::DtxRecoverResult dtxRes = session.dtxRecover().get(); - const framing::Array& xidArr = dtxRes.getInDoubt(); - std::vector<std::string> inDoubtXids(xidArr.size()); - std::transform(xidArr.begin(), xidArr.end(), inDoubtXids.begin(), framing::Array::get<std::string, framing::Array::ValuePtr>); - - 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/qpid/cpp/src/tests/qpid-txtest2.cpp b/qpid/cpp/src/tests/qpid-txtest2.cpp deleted file mode 100644 index 58c48f9a8d..0000000000 --- a/qpid/cpp/src/tests/qpid-txtest2.cpp +++ /dev/null @@ -1,363 +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 "qpid/messaging/Connection.h" -#include "qpid/messaging/Duration.h" -#include "qpid/messaging/Message.h" -#include "qpid/messaging/Receiver.h" -#include "qpid/messaging/Sender.h" -#include "qpid/messaging/Session.h" -#include <qpid/Options.h> -#include <qpid/log/Logger.h> -#include <qpid/log/Options.h> -#include "qpid/sys/Runnable.h" -#include "qpid/sys/Thread.h" - -using namespace qpid::messaging; -using namespace qpid::sys; - -namespace qpid { -namespace tests { - -typedef std::vector<std::string> StringSet; - -struct Options : public qpid::Options { - bool help; - bool init, transfer, check;//actions - uint size; - bool durable; - uint queues; - std::string base; - uint msgsPerTx; - uint txCount; - uint totalMsgCount; - bool dtx; - uint capacity; - std::string url; - std::string connectionOptions; - qpid::log::Options log; - uint port; - bool quiet; - double fetchTimeout; - - Options() : help(false), init(true), transfer(true), check(true), - size(256), durable(true), queues(2), - base("tx"), msgsPerTx(1), txCount(5), totalMsgCount(10), - capacity(1000), url("localhost"), port(0), quiet(false), fetchTimeout(5) - { - addOptions() - ("init", qpid::optValue(init, "yes|no"), "Declare queues and populate one with the initial set of messages.") - ("transfer", qpid::optValue(transfer, "yes|no"), "'Move' messages from one queue to another using transactions to ensure no message loss.") - ("check", qpid::optValue(check, "yes|no"), "Check that the initial messages are all still available.") - ("size", qpid::optValue(size, "N"), "message size") - ("durable", qpid::optValue(durable, "yes|no"), "use durable messages") - ("queues", qpid::optValue(queues, "N"), "number of queues") - ("queue-base-name", qpid::optValue(base, "<name>"), "base name for queues") - ("messages-per-tx", qpid::optValue(msgsPerTx, "N"), "number of messages transferred per transaction") - ("tx-count", qpid::optValue(txCount, "N"), "number of transactions per 'agent'") - ("total-messages", qpid::optValue(totalMsgCount, "N"), "total number of messages in 'circulation'") - ("capacity", qpid::optValue(capacity, "N"), "Pre-fetch window (0 implies no pre-fetch)") - ("broker,b", qpid::optValue(url, "URL"), "url of broker to connect to") - ("connection-options", qpid::optValue(connectionOptions, "OPTIONS"), "options for the connection") - ("port,p", qpid::optValue(port, "PORT"), "(for test compatibility only, use broker option instead)") - ("quiet", qpid::optValue(quiet), "reduce output from test") - ("fetch-timeout", qpid::optValue(fetchTimeout, "SECONDS"), "Timeout for transactional fetch") - ("help", qpid::optValue(help), "print this usage statement"); - add(log); - } - - bool parse(int argc, char** argv) - { - try { - qpid::Options::parse(argc, argv); - if (port) { - if (url == "localhost") { - std::stringstream u; - u << url << ":" << port; - url = u.str(); - } else { - std::cerr << *this << std::endl << std::endl - << "--port and --broker should not be specified together; specify full url in --broker option" << std::endl; - return false; - } - - } - qpid::log::Logger::instance().configure(log); - if (help) { - std::cout << *this << std::endl << std::endl - << "Transactionally moves messages between queues" << std::endl; - return false; - } - if (totalMsgCount < msgsPerTx) { - totalMsgCount = msgsPerTx; // Must have at least msgsPerTx total messages. - } - return true; - } catch (const std::exception& e) { - std::cerr << *this << std::endl << std::endl << e.what() << std::endl; - return false; - } - } -}; - -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 digits; - digits << count; - std::ostringstream out; - out << base << "-" << std::setw(digits.str().size()) << std::setfill('0') << (i+1); - collection.push_back(out.str()); - } -} - -struct Client -{ - const Options& opts; - Connection connection; - Session session; - - Client(const Options& o, bool transactional=false) : opts(o), connection(opts.url, opts.connectionOptions) - { - connection.open(); - session = transactional ? connection.createTransactionalSession() : connection.createSession(); - } - - virtual ~Client() - { - try { - session.sync(); - session.close(); - connection.close(); - } catch(const std::exception& e) { - std::cout << "Client shutdown: " << e.what() << std::endl; - } - } -}; - -struct TransactionalClient : Client -{ - TransactionalClient(const Options& o) : Client(o, true) {} - virtual ~TransactionalClient() {} -}; - -struct Transfer : public TransactionalClient, public Runnable -{ - const std::string target; - const std::string source; - Thread thread; - bool failed; - - Transfer(const std::string& to, const std::string& from, const Options& opts) : TransactionalClient(opts), target(to), source(from), failed(false) {} - - void run() - { - try { - - Sender sender(session.createSender(target)); - Receiver receiver(session.createReceiver(source)); - receiver.setCapacity(opts.capacity); - for (uint t = 0; t < opts.txCount;) { - std::ostringstream id; - id << source << ">" << target << ":" << t+1; - try { - for (uint m = 0; m < opts.msgsPerTx; m++) { - Message msg = receiver.fetch(Duration::SECOND*uint64_t(opts.fetchTimeout)); - if (msg.getContentSize() != opts.size) { - std::ostringstream oss; - oss << "Message size incorrect: size=" << msg.getContentSize() << "; expected " << opts.size; - throw std::runtime_error(oss.str()); - } - sender.send(msg); - } - session.commit(); - t++; - if (!opts.quiet) std::cout << "Transaction " << id.str() << " of " << opts.txCount << " committed successfully" << std::endl; - } catch (const TransactionAborted&) { - std::cout << "Transaction " << id.str() << " of " << opts.txCount << " was aborted and will be retried" << std::endl; - session = connection.createTransactionalSession(); - sender = session.createSender(target); - receiver = session.createReceiver(source); - receiver.setCapacity(opts.capacity); - } - } - sender.close(); - receiver.close(); - } catch(const std::exception& e) { - failed = true; - QPID_LOG(error, "Transfer " << source << " to " << target << " interrupted: " << e.what()); - } - } -}; - -namespace { -const std::string CREATE_DURABLE("; {create:always, node:{durable:True}}"); -const std::string CREATE_NON_DURABLE("; {create:always}"); -} - -struct Controller : public Client -{ - StringSet ids; - StringSet queues; - - Controller(const Options& opts) : Client(opts) - { - generateSet(opts.base, opts.queues, queues); - generateSet("msg", opts.totalMsgCount, ids); - } - - void init() - { - Message msg(generateData(opts.size)); - msg.setDurable(opts.durable); - - for (StringSet::iterator i = queues.begin(); i != queues.end(); i++) { - std::string address = *i + (opts.durable ? CREATE_DURABLE : CREATE_NON_DURABLE); - - // Clear out any garbage on queues. - Receiver receiver = session.createReceiver(address); - Message rmsg; - uint count(0); - while (receiver.fetch(rmsg, Duration::IMMEDIATE)) ++count; - session.acknowledge(); - receiver.close(); - if (!opts.quiet) std::cout << "Cleaned up " << count << " messages from " << *i << std::endl; - - Sender sender = session.createSender(address); - if (i == queues.begin()) { - for (StringSet::iterator i = ids.begin(); i != ids.end(); i++) { - msg.setCorrelationId(*i); - sender.send(msg); - } - } - sender.close(); - } - } - - 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, opts)); - agents.back().thread = Thread(agents.back()); - } - - for (boost::ptr_vector<Transfer>::iterator i = agents.begin(); i != agents.end(); i++) - i->thread.join(); - for (boost::ptr_vector<Transfer>::iterator i = agents.begin(); i != agents.end(); i++) - if (i->failed) - throw std::runtime_error("Transfer agents failed"); - } - - int check() - { - StringSet drained; - //drain each queue and verify the correct set of messages are available - for (StringSet::iterator i = queues.begin(); i != queues.end(); i++) { - Receiver receiver = session.createReceiver(*i); - uint count(0); - Message msg; - while (receiver.fetch(msg, Duration::IMMEDIATE)) { - //add correlation ids of received messages to drained - drained.push_back(msg.getCorrelationId()); - ++count; - } - session.acknowledge(); - receiver.close(); - 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 { - Options opts; - if (opts.parse(argc, argv)) { - Controller controller(opts); - if (opts.init) controller.init(); - if (opts.transfer) controller.transfer(); - if (opts.check) return controller.check(); - return 0; - } - return 1; - } catch(const std::exception& e) { - std::cerr << argv[0] << ": " << e.what() << std::endl; - } - return 2; -} diff --git a/qpid/cpp/src/tests/qpidd-empty.conf b/qpid/cpp/src/tests/qpidd-empty.conf deleted file mode 100644 index cf3f19fba0..0000000000 --- a/qpid/cpp/src/tests/qpidd-empty.conf +++ /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. -# - -# An empty configuration file. -# Used when running tests to avoid picking up configuration -# installed in the default place. diff --git a/qpid/cpp/src/tests/qpidd-p0 b/qpid/cpp/src/tests/qpidd-p0 deleted file mode 100755 index 1f7807afd2..0000000000 --- a/qpid/cpp/src/tests/qpidd-p0 +++ /dev/null @@ -1,46 +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. -# - -# Wrapper script to allocate a port and fork a broker to listen on it. -# -# Instead of this: -# qpidd --port 0 <qpidd-args...> -# do this: -# qpidd-p0 <qpidd-args...> -# -# The port is bound by python code, and then handed over to the broker via the -# --socket-fd option. This avoids problems with the qpidd --port 0 option which -# ocassional fails with an "address in use" error. It's not clear why --port 0 -# doesn't work, it may be to do with the way qpidd binds a port to multiple -# addresses on a multi-homed host. -# - -import subprocess, socket, time, os, sys - -s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) -s.bind(("", 0)) -s.listen(5) -port = s.getsockname()[1] -print port -sys.stdout.flush() -if len(sys.argv) > 1: - cmd = sys.argv[1:] + ["--socket-fd", str(s.fileno()), "--listen-disable=tcp"] - os.execvp(sys.argv[1], cmd) diff --git a/qpid/cpp/src/tests/qpidd_qmfv2_tests.py b/qpid/cpp/src/tests/qpidd_qmfv2_tests.py deleted file mode 100755 index 2b45cb6eea..0000000000 --- a/qpid/cpp/src/tests/qpidd_qmfv2_tests.py +++ /dev/null @@ -1,278 +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. -# - -# Runs QMF tests against a broker running with QMFv1 disabled. This forces the -# broker to use QMFv2 only. This is necessary as if there is a bug in V2, some -# V1 operations may hide that (esp. asynchonous notifications) - - -import sys, shutil, os -from time import sleep -from brokertest import * -from qpid.messaging import Message -try: import qmf.console -except: print "Cannot import module qmf.console, skipping tests"; exit(0); - -import qpid.messaging, brokertest -brokertest.qm = qpid.messaging # TODO aconway 2014-04-04: Tests fail with SWIG client. - -class ConsoleTest(BrokerTest): - """ - Test QMFv2 support using the qmf.console library. - """ - PUB_INTERVAL=1 - - def setUp(self): - BrokerTest.setUp(self) - - def _startBroker(self, QMFv1=False ): - self._broker_is_v1 = QMFv1 - if self._broker_is_v1: - args = ["--mgmt-qmf1=yes", "--mgmt-qmf2=no"] - else: - args = ["--mgmt-qmf1=no", "--mgmt-qmf2=yes"] - - args.append("--mgmt-pub-interval=%d" % self.PUB_INTERVAL) - self.broker = BrokerTest.broker(self, args) - - - def _myStartQmf(self, broker, console=None): - # I manually set up the QMF session here rather than call the startQmf - # method from BrokerTest as I can guarantee the console library is used - # (assuming BrokerTest's implementation of startQmf could change) - self.qmf_session = qmf.console.Session(console) - self.qmf_broker = self.qmf_session.addBroker("%s:%s" % (broker.host(), - broker.port())) - - def _create_queue( self, q_name, args={} ): - broker = self.qmf_session.getObjects(_class="broker")[0] - result = broker.create("queue", q_name, args, False) - self.assertEqual(result.status, 0, result) - - - def _test_method_call(self): - """ Verify method calls work, and check the behavior of getObjects() - call - """ - self._myStartQmf( self.broker ) - self._create_queue( "fleabag", {"auto-delete":True} ) - - qObj = None - queues = self.qmf_session.getObjects(_class="queue") - for q in queues: - if q.name == "fleabag": - qObj = q - break - self.assertNotEqual(qObj, None, "Failed to get queue object") - #print qObj - - def _test_unsolicited_updates(self): - """ Verify that the Console callbacks work - """ - - class Handler(qmf.console.Console): - def __init__(self): - self.v1_oids = 0 - self.v1_events = 0 - self.v2_oids = 0 - self.v2_events = 0 - self.broker_info = [] - self.broker_conn = [] - self.newpackage = [] - self.newclass = [] - self.agents = [] - self.events = [] - self.updates = {} # holds the objects by OID - self.heartbeats = [] - - def brokerInfo(self, broker): - #print "brokerInfo:", broker - self.broker_info.append(broker) - def brokerConnected(self, broker): - #print "brokerConnected:", broker - self.broker_conn.append(broker) - def newPackage(self, name): - #print "newPackage:", name - self.newpackage.append(name) - def newClass(self, kind, classKey): - #print "newClass:", kind, classKey - self.newclass.append( (kind, classKey) ) - def newAgent(self, agent): - #print "newAgent:", agent - self.agents.append( agent ) - def event(self, broker, event): - #print "EVENT %s" % event - self.events.append(event) - if event.isV2: - self.v2_events += 1 - else: - self.v1_events += 1 - - def heartbeat(self, agent, timestamp): - #print "Heartbeat %s" % agent - self.heartbeats.append( (agent, timestamp) ) - - # generic handler for objectProps and objectStats - def _handle_obj_update(self, record): - oid = record.getObjectId() - if oid.isV2: - self.v2_oids += 1 - else: - self.v1_oids += 1 - - if oid not in self.updates: - self.updates[oid] = record - else: - self.updates[oid].mergeUpdate( record ) - - def objectProps(self, broker, record): - assert len(record.getProperties()), "objectProps() invoked with no properties?" - self._handle_obj_update(record) - - def objectStats(self, broker, record): - assert len(record.getStatistics()), "objectStats() invoked with no properties?" - self._handle_obj_update(record) - - handler = Handler() - self._myStartQmf( self.broker, handler ) - # this should force objectProps, queueDeclare Event callbacks - self._create_queue( "fleabag", {"auto-delete":True} ) - # this should force objectStats callback - self.broker.send_message( "fleabag", Message("Hi") ) - # and we should get a few heartbeats - sleep(self.PUB_INTERVAL) - self.broker.send_message( "fleabag", Message("Hi") ) - sleep(self.PUB_INTERVAL) - self.broker.send_message( "fleabag", Message("Hi") ) - sleep(self.PUB_INTERVAL * 2) - - assert handler.broker_info, "No BrokerInfo callbacks received" - assert handler.broker_conn, "No BrokerConnected callbacks received" - assert handler.newpackage, "No NewPackage callbacks received" - assert handler.newclass, "No NewClass callbacks received" - assert handler.agents, "No NewAgent callbacks received" - assert handler.events, "No event callbacks received" - assert handler.updates, "No updates received" - assert handler.heartbeats, "No heartbeat callbacks received" - - # now verify updates for queue "fleabag" were received, and the - # msgDepth statistic is correct - - msgs = 0 - for o in handler.updates.itervalues(): - key = o.getClassKey() - if key and key.getClassName() == "queue" and o.name == "fleabag": - assert o.msgDepth, "No update to msgDepth statistic!" - msgs = o.msgDepth - break - assert msgs == 3, "msgDepth statistics not accurate!" - - # verify that the published objects were of the correct QMF version - if self._broker_is_v1: - assert handler.v1_oids and handler.v2_oids == 0, "QMFv2 updates received while in V1-only mode!" - assert handler.v1_events and handler.v2_events == 0, "QMFv2 events received while in V1-only mode!" - else: - assert handler.v2_oids and handler.v1_oids == 0, "QMFv1 updates received while in V2-only mode!" - assert handler.v2_events and handler.v1_events == 0, "QMFv1 events received while in V2-only mode!" - - def _test_async_method(self): - class Handler (qmf.console.Console): - def __init__(self): - self.cv = Condition() - self.xmtList = {} - self.rcvList = {} - - def methodResponse(self, broker, seq, response): - self.cv.acquire() - try: - self.rcvList[seq] = response - finally: - self.cv.release() - - def request(self, broker, count): - self.count = count - for idx in range(count): - self.cv.acquire() - try: - seq = broker.echo(idx, "Echo Message", _async = True) - self.xmtList[seq] = idx - finally: - self.cv.release() - - def check(self): - if self.count != len(self.xmtList): - return "fail (attempted send=%d, actual sent=%d)" % (self.count, len(self.xmtList)) - lost = 0 - mismatched = 0 - for seq in self.xmtList: - value = self.xmtList[seq] - if seq in self.rcvList: - result = self.rcvList.pop(seq) - if result.sequence != value: - mismatched += 1 - else: - lost += 1 - spurious = len(self.rcvList) - if lost == 0 and mismatched == 0 and spurious == 0: - return "pass" - else: - return "fail (lost=%d, mismatch=%d, spurious=%d)" % (lost, mismatched, spurious) - - handler = Handler() - self._myStartQmf(self.broker, handler) - broker = self.qmf_session.getObjects(_class="broker")[0] - handler.request(broker, 20) - sleep(1) - self.assertEqual(handler.check(), "pass") - - def test_method_call(self): - self._startBroker() - self._test_method_call() - - def test_unsolicited_updates(self): - self._startBroker() - self._test_unsolicited_updates() - - def test_async_method(self): - self._startBroker() - self._test_async_method() - - # For now, include "QMFv1 only" tests. Once QMFv1 is deprecated, these can - # be removed - - def test_method_call_v1(self): - self._startBroker(QMFv1=True) - self._test_method_call() - - def test_unsolicited_updates_v1(self): - self._startBroker(QMFv1=True) - self._test_unsolicited_updates() - - def test_async_method_v1(self): - self._startBroker(QMFv1=True) - self._test_async_method() - - - -if __name__ == "__main__": - shutil.rmtree("brokertest.tmp", True) - os.execvp("qpid-python-test", - ["qpid-python-test", "-m", "qpidd_qmfv2_tests"] + sys.argv[1:]) - diff --git a/qpid/cpp/src/tests/queue_flow_limit_tests.py b/qpid/cpp/src/tests/queue_flow_limit_tests.py deleted file mode 100644 index 83e31e979b..0000000000 --- a/qpid/cpp/src/tests/queue_flow_limit_tests.py +++ /dev/null @@ -1,376 +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.messaging import Connection -from threading import Thread -from time import sleep, time -from os import environ, popen - -class QueueFlowLimitTests(TestBase010): - - _timeout = 100 - - 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; - - broker = self.qmf.getObjects(_class="broker")[0] - rc = broker.create( "queue", name, args, True ) - self.assertEqual(rc.status, 0, rc) - - 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 - """ - broker = self.qmf.getObjects(_class="broker")[0] - rc = broker.delete( "queue", name, {} ) - self.assertEqual(rc.status, 0, rc) - - - 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=%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() + self._timeout - 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() + self._timeout - 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() + self._timeout - 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" - self.mgmt = None - 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. - self.mgmt = None - 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() + self._timeout - 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/qpid/cpp/src/tests/queue_redirect.py b/qpid/cpp/src/tests/queue_redirect.py deleted file mode 100644 index 8a7b4c244b..0000000000 --- a/qpid/cpp/src/tests/queue_redirect.py +++ /dev/null @@ -1,317 +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 -from time import sleep -from os import environ, popen - -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 QueueredirectTests(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): - result = None - try: - self.broker_access.reloadAclFile() - except Exception, e: - result = str(e) - return result - - 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.startBrokerAccess() - 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) - - - def redirect(self, srcQueue, tgtQueue, expectPass, failMessage): - try: - result = {} - result = self.broker_access.Redirect(srcQueue, tgtQueue) - if not expectPass: - self.fail("src:" + srcQueue + ", tgt:" + tgtQueue + " - " + failMessage) - except Exception, e: - if expectPass: - self.fail("src:" + srcQueue + ", tgt:" + tgtQueue + " - " + failMessage) - - def create_queue(self, session, name, autoDelete): - try: - session.queue_declare(queue=name, auto_delete=autoDelete) - except Exception, e: - self.fail("Should allow create 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) - - - - #===================================== - # QT queue tests - #===================================== - - def test_010_deny_backing_up_a_nonexistant_queue(self): - session = self.get_session('bob','bob') - self.redirect("A010", "A010", False, "Should not allow redirect to non-existent queue A010") - session.close() - - def test_020_deny_destroy_redirect(self): - session = self.get_session('bob','bob') - self.create_queue(session, "A020", False) - self.redirect("A020", "", False, "Should not allow destroying redirect") - session.close() - - def test_030_deny_redirecting_to_nonexistent_queue(self): - session = self.get_session('bob','bob') - self.create_queue(session, "A030", False) - self.redirect("A030", "Axxx", False, "Should not allow redirect with non-existent queue Axxx") - session.close() - - def test_040_deny_queue_redirecting_to_itself(self): - session = self.get_session('bob','bob') - self.create_queue(session, "A040", False) - self.redirect("A040", "A040", False, "Should not allow redirect with itself") - session.close() - - def test_050_deny_redirecting_autodelete_queue(self): - session = self.get_session('bob','bob') - self.create_queue(session, "A050", True) - self.create_queue(session, "B050", False) - self.redirect("A050", "B050", False, "Should not allow redirect with autodelete source queue") - self.redirect("B050", "A050", False, "Should not allow redirect with autodelete target queue") - session.close() - - def test_100_create_redirect_queue_pair(self): - session = self.get_session('bob','bob') - self.create_queue(session, "A100", False) - self.create_queue(session, "B100", False) - self.redirect("A100", "B100", True, "Should allow redirect") - session.close() - - def test_110_deny_adding_second_redirect_to_queue(self): - session = self.get_session('bob','bob') - self.create_queue(session, "A110", False) - self.create_queue(session, "B110", False) - self.create_queue(session, "C110", False) - self.redirect("A110", "B110", True, "Should allow redirect") - self.redirect("A110", "C110", False, "Should deny second redirect") - self.redirect("C110", "B110", False, "Should deny second redirect") - session.close() - - def test_120_verify_redirect_to_target(self): - session = self.get_session('bob','bob') - self.create_queue(session, "A120", False) - self.create_queue(session, "B120", False) - - # Send messages to original queue - sndr1 = self._start_qpid_send("A120", count=5, content="A120-before-rebind"); - sndr1.close() - - # redirect - self.redirect("A120", "B120", True, "Should allow redirect") - - # Send messages to original queue - sndr2 = self._start_qpid_send("A120", count=3, content="A120-after-rebind"); - sndr2.close() - - # drain the queue - rcvr = self._start_qpid_receive("A120", - count=5) - count = 0; - x = rcvr.readline() # prints a line for each received msg - while x: -# print "Read from A120 " + x - count += 1; - x = rcvr.readline() - - self.assertEqual(count, 5) - - # drain the queue - rcvrB = self._start_qpid_receive("B120", - count=3) - count = 0; - x = rcvrB.readline() # prints a line for each received msg - while x: -# print "Read from B120 " + x - count += 1; - x = rcvrB.readline() - - self.assertEqual(count, 3) - - ###session.close() - - def test_140_verify_redirect_to_source(self): - session = self.get_session('bob','bob') - self.create_queue(session, "A140", False) - self.create_queue(session, "B140", False) - - # Send messages to target queue - these go onto B - sndr1 = self._start_qpid_send("B140", count=5, content="B140-before-rebind"); - sndr1.close() - - # redirect - self.redirect("A140", "B140", True, "Should allow redirect") - - # Send messages to target queue - these go onto A - sndr2 = self._start_qpid_send("B140", count=3, content="B140-after-rebind"); - sndr2.close() - - # drain the queue - rcvr = self._start_qpid_receive("B140", count=5) - count = 0; - x = rcvr.readline() # prints a line for each received msg - while x: - # print "Read from B140 " + x - count += 1; - x = rcvr.readline() - - self.assertEqual(count, 5) - - # drain the queue - rcvrB = self._start_qpid_receive("A140", count=3) - count = 0; - x = rcvrB.readline() # prints a line for each received msg - while x: - # print "Read from A140 " + x - count += 1; - x = rcvrB.readline() - - self.assertEqual(count, 3) - - ###session.close() - - def test_150_queue_deletion_destroys_redirect(self): - session = self.get_session('bob','bob') - self.create_queue(session, "A150", False) - self.create_queue(session, "B150", False) - self.create_queue(session, "C150", False) - - # redirect - self.redirect("A150", "B150", True, "Should allow redirect") - - self.redirect("A150", "C150", False, "A is already redirected") - - alice = BrokerAdmin(self.config.broker, "bob", "bob") - alice.delete_queue("B150") #should pass - - self.redirect("A150", "C150", True, "Should allow redirect") - session.close() - -############################################################################################## -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/qpid/cpp/src/tests/receiver.cpp b/qpid/cpp/src/tests/receiver.cpp deleted file mode 100644 index f1b462d6e4..0000000000 --- a/qpid/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/qpid/cpp/src/tests/reject_release.py b/qpid/cpp/src/tests/reject_release.py deleted file mode 100644 index d072b8aa78..0000000000 --- a/qpid/cpp/src/tests/reject_release.py +++ /dev/null @@ -1,65 +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. -# - -from qpid.tests.messaging.implementation import * -from qpid.tests.messaging import VersionTest - -class RejectReleaseTests (VersionTest): - """ - Tests for reject and release with qpidd - """ - def test_reject(self): - name = str(uuid4()) - snd = self.ssn.sender("%s; {create:always, node:{properties:{alternate-exchange:amq.fanout}}}" % name) - rcv = self.ssn.receiver(name) - rcv2 = self.ssn.receiver("amq.fanout") - - msgs = [Message(content=s, subject = s) for s in ['a','b','c','d']] - - for m in msgs: snd.send(m) - - for expected in msgs: - msg = rcv.fetch(0) - assert msg.content == expected.content - self.ssn.reject(msg) - - for expected in msgs: - msg = rcv2.fetch(0) - assert msg.content == expected.content - - def test_release(self): - snd = self.ssn.sender("#") - rcv = self.ssn.receiver(snd.target) - - msgs = [Message(content=s, subject = s) for s in ['a','b','c','d']] - - for m in msgs: snd.send(m) - - msg = rcv.fetch(0) - assert msg.content == "a" - self.ssn.release(msg) - - msg = rcv.fetch(0) - assert msg.content == "a" - self.ssn.acknowledge(msg) - - msg = rcv.fetch(0) - assert msg.content == "b" - self.ssn.release(msg) - diff --git a/qpid/cpp/src/tests/replaying_sender.cpp b/qpid/cpp/src/tests/replaying_sender.cpp deleted file mode 100644 index a5549bfdf2..0000000000 --- a/qpid/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/qpid/cpp/src/tests/resuming_receiver.cpp b/qpid/cpp/src/tests/resuming_receiver.cpp deleted file mode 100644 index 2e22a7c572..0000000000 --- a/qpid/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/qpid/cpp/src/tests/ring_queue_test b/qpid/cpp/src/tests/ring_queue_test deleted file mode 100755 index 410ea30eb8..0000000000 --- a/qpid/cpp/src/tests/ring_queue_test +++ /dev/null @@ -1,174 +0,0 @@ -#!/usr/bin/env 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="-b ${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/qpid/cpp/src/tests/run.py b/qpid/cpp/src/tests/run.py deleted file mode 100755 index 9b74ba4d30..0000000000 --- a/qpid/cpp/src/tests/run.py +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/env python - -from common import * - -call(" ".join(ARGS[1:])) - diff --git a/qpid/cpp/src/tests/run_acl_tests b/qpid/cpp/src/tests/run_acl_tests deleted file mode 100755 index dc6b9e8272..0000000000 --- a/qpid/cpp/src/tests/run_acl_tests +++ /dev/null @@ -1,70 +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. -# - -from common import * - -policy_file = join(BUILD_DIR, "src", "tests", "policy.acl") -broker_args = "--acl-file {0}".format(policy_file) - -broker_port = start_broker("broker", broker_args, "--log-enable debug+:acl") -broker_i_port = start_broker("broker_i", broker_args, "--connection-limit-per-ip 2") -broker_u_port = start_broker("broker_u", broker_args, "--connection-limit-per-user 2") -broker_q_port = start_broker("broker_q", broker_args, "--max-queues-per-user 2") - -run_broker_tests(broker_port, "-m acl", - "-Dport-i={0}".format(broker_i_port), - "-Dport-u={0}".format(broker_u_port), - "-Dport-q={0}".format(broker_q_port), - "-Dpolicy-file={0}".format(policy_file)) - -# Test interaction of authentication and link creation - -broker_1_port = start_broker("broker_1") -broker_2_port = start_broker("broker_2") - -configure_broker(broker_1_port, "add exchange topic fed.topic") -configure_broker(broker_2_port, "add exchange topic fed.topic") - -connect_brokers("dynamic add", - "localhost:{0}".format(broker_1_port), - "localhost:{0}".format(broker_2_port), - "fed.topic") - -sasl_config_dir = join(BUILD_DIR, "src", "tests", "sasl_config") -broker_args = "--auth yes --sasl-config {0}".format(sasl_config_dir) - -broker_3_port = start_broker("broker_3", broker_args, auth_disabled=False) -broker_4_port = start_broker("broker_4", broker_args, auth_disabled=False) - -configure_broker(broker_3_port, "add exchange topic fed.topic") -configure_broker(broker_4_port, "add exchange topic fed.topic") - -try: - connect_brokers("dynamic add", - "localhost:{0}".format(broker_3_port), - "localhost:{0}".format(broker_4_port), - "fed.topic") - - fail("Broker with no ACLs but auth enabled did not deny link creation") -except: - pass - -check_results() diff --git a/qpid/cpp/src/tests/run_cli_tests b/qpid/cpp/src/tests/run_cli_tests deleted file mode 100755 index 2d2eabacb2..0000000000 --- a/qpid/cpp/src/tests/run_cli_tests +++ /dev/null @@ -1,63 +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. -# - -# Run the cli-utility tests - -from common import * - -cli_dir = join(SOURCE_DIR, "management", "python", "bin") - -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 -""" -xquery_file = write(join(WORK_DIR, "xquery_file"), xquery) - -# 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 XML_LIB is not None: - broker_args = "--load-module {0}".format(XML_LIB) - test_args = "" -else: - notice("Ignoring XML tests") - - broker_args = "" - test_args = "--ignore=*xml*" - -local_port = start_broker("local", broker_args) -remote_port = start_broker("remote", broker_args) - -run_broker_tests(local_port, - "-m cli_tests", - "-Dremote-port={0}".format(remote_port), - "-Dcli-dir={0}".format(cli_dir), - "-Dxquery-file={0}".format(xquery_file), - test_args) - -check_results() diff --git a/qpid/cpp/src/tests/run_client_tests b/qpid/cpp/src/tests/run_client_tests deleted file mode 100755 index 76c46ef949..0000000000 --- a/qpid/cpp/src/tests/run_client_tests +++ /dev/null @@ -1,30 +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. -# - -from common import * - -port = start_broker("broker") - -ENV["QPID_PORT"] = str(port) - -call_with_valgrind("qpid-client-test --verbose") - -check_results() diff --git a/qpid/cpp/src/tests/run_federation_tests b/qpid/cpp/src/tests/run_federation_tests deleted file mode 100755 index 1b37fe604a..0000000000 --- a/qpid/cpp/src/tests/run_federation_tests +++ /dev/null @@ -1,60 +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. -# - -from common import * - -common_args = "--log-enable=debug+:Bridge" -module_args = None -test_args = "-i *_xml" - -sys_test_args = [ - "-i federation_sys.A_Long*", - "-i federation_sys.B_Long*", - "-i federation_sys.C_*", - "-i federation_sys.D_*", - "-i federation_sys.E_*", - "-i federation_sys.F_*", - "-i federation_sys.G_*", - "-i federation_sys.H_*", -] - -if XML_LIB is not None: - module_args = "--load-module {0}".format(XML_LIB) - test_args = None - -local_port = start_broker("local", common_args, module_args, "--federation-tag LOCAL") -remote_port = start_broker("remote", common_args, module_args, "--federation-tag REMOTE") -remote_b1 = start_broker("remote_b1", common_args, module_args, "--federation-tag REMOTE_B1") -remote_b2 = start_broker("remote_b2", common_args, module_args, "--federation-tag REMOTE_B2") - -run_broker_tests(local_port, "-m federation", - "-Dremote-port={0}".format(remote_port), - "-Dextra-brokers='{0} {1}'".format(remote_b1, remote_b2), - test_args) - -run_broker_tests(local_port, "-m headers_federation", "-Dremote-port={0}".format(remote_port)) - -run_broker_tests(remote_port, "-m federation_sys", - "-Dlocal-port={0}".format(local_port), - "-Dremote-port={0}".format(remote_port), - *sys_test_args) - -check_results() diff --git a/qpid/cpp/src/tests/run_flow_control_tests b/qpid/cpp/src/tests/run_flow_control_tests deleted file mode 100755 index 5158fb2c47..0000000000 --- a/qpid/cpp/src/tests/run_flow_control_tests +++ /dev/null @@ -1,28 +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. -# - -from common import * - -port = start_broker("broker", "--default-flow-stop-threshold=80 --default-flow-resume-threshold=70") - -run_broker_tests(port, "-m queue_flow_limit_tests") - -check_results() diff --git a/qpid/cpp/src/tests/run_ha_tests b/qpid/cpp/src/tests/run_ha_tests deleted file mode 100755 index 6f87fdaceb..0000000000 --- a/qpid/cpp/src/tests/run_ha_tests +++ /dev/null @@ -1,37 +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. -# - -from common import * - -# ENV["QPID_USE_SWIG_CLIENT"] = "1" # XXX is this necessary? - -# XXX These tests hang, and I can't figure out why -# -i *tx_block_threads - -# ENV["QPID_NO_MODULE_DIR"] = "1" # Don't accidentally load installed modules -# ENV["QPID_DATA_DIR"] = "" -# ENV["QPID_CONFIG"] = join(BUILD_DIR, "src", "tests", "qpidd-empty.conf") -# ENV["QPID_PORT"] = "" -# ENV["QPID_LOG_TO_FILE"] = join(BUILD_DIR, "src", "tests", "gah.log") - -call("qpid-python-test -m ha_tests -DOUTDIR={0}", WORK_DIR) - -check_results() diff --git a/qpid/cpp/src/tests/run_idle_timeout_tests b/qpid/cpp/src/tests/run_idle_timeout_tests deleted file mode 100755 index 08c7966518..0000000000 --- a/qpid/cpp/src/tests/run_idle_timeout_tests +++ /dev/null @@ -1,26 +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. -# - -from common import * - -call("qpid-python-test -m idle_timeout_tests -DOUTDIR={0}", WORK_DIR) - -check_results() diff --git a/qpid/cpp/src/tests/run_interlink_tests b/qpid/cpp/src/tests/run_interlink_tests deleted file mode 100755 index f7d8bb8589..0000000000 --- a/qpid/cpp/src/tests/run_interlink_tests +++ /dev/null @@ -1,26 +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. -# - -from common import * - -call("qpid-python-test -m interlink_tests -DOUTDIR={0}", WORK_DIR) - -check_results() diff --git a/qpid/cpp/src/tests/run_interop_tests b/qpid/cpp/src/tests/run_interop_tests deleted file mode 100755 index 7507c6a99f..0000000000 --- a/qpid/cpp/src/tests/run_interop_tests +++ /dev/null @@ -1,35 +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. -# - -from common import * - -python_swig_module = join(BUILD_DIR, "bindings", "qpid", "python", "qpid_messaging.py") - -if exists(python_swig_module): - port = start_broker("broker", "--load-module {0}".format(AMQP_LIB)) - - ENV["QPID_INTEROP_URL"] = "localhost:{0}".format(port) - - call("qpid-python-test -m interop_tests -DOUTDIR={0}", WORK_DIR) -else: - warn("Skipping tests: 1.0 messaging client not found") - -check_results() diff --git a/qpid/cpp/src/tests/run_ipv6_tests b/qpid/cpp/src/tests/run_ipv6_tests deleted file mode 100755 index 55212257a9..0000000000 --- a/qpid/cpp/src/tests/run_ipv6_tests +++ /dev/null @@ -1,116 +0,0 @@ -#!/usr/bin/env 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 env.sh - -# Check whether we have any globally configured IPv6 addresses -# - if not then we can't run the tests because ipv6 lookups won't -# work within the qpid code. This is a deliberate feature to avoid -# getting addresses that can't be routed by the machine. - -if ip -f inet6 -o addr | cut -f 9 -s -d' ' | grep global > /dev/null ; then - echo "IPv6 addresses configured - continuing" -else - echo "No global IPv6 addresses configured - skipping test" - exit 0 -fi - - -CONFIG=$(dirname $0)/qpidd-empty.conf -TEST_HOSTNAME=::1 -COUNT=10 - -trap cleanup EXIT - -error() { echo $*; exit 1; } - -# Don't need --no-module-dir or --no-data-dir as they are set as env vars in env.sh -COMMON_OPTS="--interface [::1] --daemon --auth no --config $CONFIG" - -# Record all broker ports started -unset PORTS -declare -a PORTS - -# Start new brokers: -# $1 must be integer -# $2 = extra opts -# Append used ports to PORTS variable -start_brokers() { - local -a ports - for (( i=0; $i<$1; i++)) do - ports[$i]=$(qpidd --port 0 $COMMON_OPTS $2) - done - PORTS=( ${PORTS[@]} ${ports[@]} ) -} - -stop_brokers() { - for port in "${PORTS[@]}"; - do - qpidd -qp $port - done - PORTS=() -} - -cleanup() { - stop_brokers -} - -start_brokers 1 -PORT=${PORTS[0]} -echo "Started IPv6 smoke perftest on broker port $PORT" - -## Test connection via connection settings -qpid-perftest --count ${COUNT} --port ${PORT} -b $TEST_HOSTNAME --summary - -## Test connection with a URL -URL="amqp:[$TEST_HOSTNAME]:$PORT" - -qpid-send -b $URL --content-string=hello -a "foo;{create:always}" -MSG=`qpid-receive -b $URL -a "foo;{create:always}" --messages 1` -test "$MSG" = "hello" || { echo "receive failed '$MSG' != 'hello'"; exit 1; } - -stop_brokers - -# Federation smoke test follows - -# Start 2 brokers - -start_brokers 2 -echo "Started Federated brokers on ports ${PORTS[*]}" -# Make broker urls -BROKER0="[::1]:${PORTS[0]}" -BROKER1="[::1]:${PORTS[1]}" -TEST_QUEUE=ipv6-fed-test - -qpid-config -b $BROKER0 add queue $TEST_QUEUE -qpid-config -b $BROKER1 add queue $TEST_QUEUE -qpid-route dynamic add $BROKER1 $BROKER0 amq.direct -qpid-config -b $BROKER1 bind amq.direct $TEST_QUEUE $TEST_QUEUE -qpid-route route map $BROKER1 - -datagen --count 100 | tee rdata-in | - ./qpid-send -b amqp:$BROKER0 -a amq.direct/$TEST_QUEUE --content-stdin -qpid-receive -b amqp:$BROKER1 -a $TEST_QUEUE --print-content yes -m 0 > rdata-out - -cmp rdata-in rdata-out || { echo "Federated data over IPv6 does not compare"; exit 1; } - -stop_brokers -rm rdata-in rdata-out diff --git a/qpid/cpp/src/tests/run_logging_tests b/qpid/cpp/src/tests/run_logging_tests deleted file mode 100755 index 2ebcc5c902..0000000000 --- a/qpid/cpp/src/tests/run_logging_tests +++ /dev/null @@ -1,38 +0,0 @@ -#!/usr/bin/env 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 -eu - -source env.sh - -export WORK_DIR=$(mktemp -d $PWD/run_logging_tests_XXXX) - -exit_code=0 - -dynamic_log_hires_timestamp || exit_code=1 -dynamic_log_level_test || exit_code=1 - -if (( exit_code != 0 )); then - echo "Logging test failures" - exit $exit_code -fi - -rm -rf $WORK_DIR diff --git a/qpid/cpp/src/tests/run_long_federation_sys_tests b/qpid/cpp/src/tests/run_long_federation_sys_tests deleted file mode 100644 index ab8b5646ec..0000000000 --- a/qpid/cpp/src/tests/run_long_federation_sys_tests +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/env 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 system tests (long version). - -USE_LONG_TEST=1 ./run_federation_sys_tests $@ diff --git a/qpid/cpp/src/tests/run_msg_group_tests b/qpid/cpp/src/tests/run_msg_group_tests deleted file mode 100755 index 17bc49794c..0000000000 --- a/qpid/cpp/src/tests/run_msg_group_tests +++ /dev/null @@ -1,47 +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. -# - -from common import * - -port = start_broker("broker") - -commands = [ - "qpid-config -b {0} add queue group-queue --group-header=My-Group-Id --shared-groups", - "msg_group_test -b {0} -a group-queue --group-key My-Group-Id --messages 103 --group-size 13 --receivers 2 --senders 3 --capacity 3 --ack-frequency 7 --randomize-group-size --interleave 3", - "msg_group_test -b {0} -a group-queue --group-key My-Group-Id --messages 103 --group-size 13 --receivers 2 --senders 3 --capacity 7 --ack-frequency 7 --randomize-group-size", - "qpid-config -b {0} add queue group-queue-two --group-header=My-Group-Id --shared-groups", - "msg_group_test -b {0} -a group-queue --group-key My-Group-Id --messages 103 --group-size 13 --receivers 2 --senders 3 --capacity 7 --ack-frequency 3 --randomize-group-size", - "msg_group_test -b {0} -a group-queue-two --group-key My-Group-Id --messages 103 --group-size 13 --receivers 2 --senders 3 --capacity 3 --ack-frequency 7 --randomize-group-size --interleave 5", - "msg_group_test -b {0} -a group-queue --group-key My-Group-Id --messages 59 --group-size 5 --receivers 2 --senders 3 --capacity 1 --ack-frequency 3 --randomize-group-size", - "qpid-config -b {0} del queue group-queue-two --force", - "msg_group_test -b {0} -a group-queue --group-key My-Group-Id --messages 59 --group-size 3 --receivers 2 --senders 3 --capacity 1 --ack-frequency 1 --randomize-group-size", - "msg_group_test -b {0} -a group-queue --group-key My-Group-Id --messages 211 --group-size 13 --receivers 2 --senders 3 --capacity 47 --ack-frequency 79 --interleave 53", - "msg_group_test -b {0} -a group-queue --group-key My-Group-Id --messages 10000 --group-size 1 --receivers 0 --senders 1", - "msg_group_test -b {0} -a group-queue --group-key My-Group-Id --messages 10000 --receivers 5 --senders 0", - "qpid-config -b {0} del queue group-queue --force", -] - -address = "localhost:{0}".format(port) - -for command in commands: - call(command, address) - -check_results() diff --git a/qpid/cpp/src/tests/run_msg_group_tests_soak b/qpid/cpp/src/tests/run_msg_group_tests_soak deleted file mode 100755 index 68a16793f3..0000000000 --- a/qpid/cpp/src/tests/run_msg_group_tests_soak +++ /dev/null @@ -1,61 +0,0 @@ -#!/usr/bin/env 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 long-running message group tests via -# make - -source env.sh - -#set port to connect to via env var -test -s qpidd.port && QPID_PORT=`cat qpidd.port` - -#trap cleanup INT TERM QUIT - -QUEUE_NAME="group-queue" -GROUP_KEY="My-Group-Id" - -BROKER_URL="${QPID_BROKER:-localhost}:${QPID_PORT:-5672}" - -run_test() { - $@ -} - -##set -x - -declare -i i=0 -declare -a tests -tests=("qpid-config -b $BROKER_URL add queue $QUEUE_NAME --group-header=${GROUP_KEY} --shared-groups" - "msg_group_test -b $BROKER_URL -a $QUEUE_NAME --group-key $GROUP_KEY --messages 10007 --receivers 3 --senders 5 --group-size 211 --randomize-group-size --capacity 47 --ack-frequency 97" - "msg_group_test -b $BROKER_URL -a $QUEUE_NAME --group-key $GROUP_KEY --messages 10007 --receivers 3 --senders 5 --group-size 211 --randomize-group-size --capacity 79 --ack-frequency 79" - "msg_group_test -b $BROKER_URL -a $QUEUE_NAME --group-key $GROUP_KEY --messages 10007 --receivers 3 --senders 5 --group-size 211 --randomize-group-size --capacity 97 --ack-frequency 47" - "msg_group_test -b $BROKER_URL -a $QUEUE_NAME --group-key $GROUP_KEY --messages 40000 --receivers 0 --senders 5 --group-size 13 --randomize-group-size" - "msg_group_test -b $BROKER_URL -a $QUEUE_NAME --group-key $GROUP_KEY --messages 200000 --receivers 3 --senders 0 --capacity 23 --ack-frequency 7" - "qpid-config -b $BROKER_URL del queue $QUEUE_NAME --force") - -while [ -n "${tests[i]}" ]; do - run_test ${tests[i]} - RETCODE=$? - if test x$RETCODE != x0; then - echo "FAILED message group test. Failed command: \"${tests[i]}\""; - exit 1; - fi - i+=1 -done diff --git a/qpid/cpp/src/tests/run_paged_queue_tests b/qpid/cpp/src/tests/run_paged_queue_tests deleted file mode 100755 index f13a7747a3..0000000000 --- a/qpid/cpp/src/tests/run_paged_queue_tests +++ /dev/null @@ -1,45 +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. -# - -from common import * - -port = start_broker("broker", "--paging-dir={0}".format(join(WORK_DIR, "pqtest_data"))) - -messages = 1000 -address = "onepage; {create: always, node:{x-declare:{arguments:{'qpid.paging':True,'qpid.max_pages_loaded':1}}}}" - -call_with_valgrind("qpid-send --messages {0} --content-size 1024 --broker localhost:{1} --address \"{2}\"", - messages, port, address) - -output = call_for_output_with_valgrind("qpid-receive --address onepage --messages {0} --broker localhost:{1}", - messages, port) - -received = len(output.splitlines()) - -if received != messages: - fail("Single page test failed: received {0} messages, expected {1}", received, messages) - -option = "node:{x-declare:{arguments:{'qpid.paging':True,'qpid.max_size':0,'qpid.max_count':0,'qpid.flow_stop_size':0,'qpid.flow_resume_size':0,'qpid.flow_stop_count':0,'qpid.flow_resume_count':0}}}" - -call("qpid-cpp-benchmark --broker localhost:{0} --create-option \"{1}\"", port, option) -call("qpid-cpp-benchmark --broker localhost:{0} --create-option \"{1}\" --fill-drain", port, option) - -check_results() diff --git a/qpid/cpp/src/tests/run_performance_tests b/qpid/cpp/src/tests/run_performance_tests deleted file mode 100755 index 31da852c34..0000000000 --- a/qpid/cpp/src/tests/run_performance_tests +++ /dev/null @@ -1,28 +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. -# - -from common import * - -port = start_broker("broker") - -call_with_valgrind("qpid-perftest --summary --count 100 --port {0}", port) - -check_results() diff --git a/qpid/cpp/src/tests/run_python_tests b/qpid/cpp/src/tests/run_python_tests deleted file mode 100755 index 53a9aa54f5..0000000000 --- a/qpid/cpp/src/tests/run_python_tests +++ /dev/null @@ -1,67 +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. -# - -from common import * - -load_module_arg = None - -if AMQP_LIB is not None: - load_module_arg = "--load-module {0}".format(AMQP_LIB) - -acl_file = join(BUILD_DIR, "src", "tests", "policy.acl") -acl_file_arg = "--acl-file {0}".format(acl_file) - -port = start_broker("broker", load_module_arg, acl_file_arg) - -# Native python tests - -run_broker_tests(port, "-m qpid_tests.broker_0_10 -m qpid.tests") - -# Swigged python tests - -python_swig_module = join(BUILD_DIR, "bindings", "qpid", "python", "qpid_messaging.py") - -if exists(python_swig_module): - failing_tests = join(BUILD_DIR, "src", "tests", "failing-amqp0-10-python-tests") - - ENV["QPID_USE_SWIG_CLIENT"] = "1" - - run_broker_tests(port, - "-m qpid.tests.messaging.message", - "-m qpid_tests.broker_0_10.priority", - "-m qpid_tests.broker_0_10.lvq", - "-m qpid_tests.broker_0_10.new_api", - "-I {0}".format(failing_tests)) - - if AMQP_LIB is not None: - failing_tests = join(BUILD_DIR, "src", "tests", "failing-amqp1.0-python-tests") - - run_broker_tests(port, - "--define=\"protocol_version=amqp1.0\"", - "--define=\"policy_file={0}\"".format(acl_file), - "-m qpid_tests.broker_1_0", - "-m qpid_tests.broker_0_10.new_api", - "-m assertions -m reject_release -m misc -m policies -m acl_1", - "-I {0}".format(failing_tests)) -else: - warn("Skipping tests for swigged python client: swigged module not found") - -check_results() diff --git a/qpid/cpp/src/tests/run_qmf_tests b/qpid/cpp/src/tests/run_qmf_tests deleted file mode 100755 index 3d474d2893..0000000000 --- a/qpid/cpp/src/tests/run_qmf_tests +++ /dev/null @@ -1,26 +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. -# - -from common import * - -call("qpid-python-test -m qpidd_qmfv2_tests -DOUTDIR={0}", WORK_DIR) - -check_results() diff --git a/qpid/cpp/src/tests/run_queue_redirect_tests b/qpid/cpp/src/tests/run_queue_redirect_tests deleted file mode 100644 index 881f1ea5f1..0000000000 --- a/qpid/cpp/src/tests/run_queue_redirect_tests +++ /dev/null @@ -1,30 +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. -# - -from common import * - -policy_file = join(BUILD_DIR, "src", "tests", "policy.acl") - -port = start_broker("broker", "--acl-file {0}".format(policy_file), "--log-enable debug+:Model") - -run_broker_tests(port, "-m queue_redirect", "-Dpolicy-file={0}".format(policy_file)) - -check_results() diff --git a/qpid/cpp/src/tests/run_ring_queue_tests b/qpid/cpp/src/tests/run_ring_queue_tests deleted file mode 100755 index fbd6b0dff8..0000000000 --- a/qpid/cpp/src/tests/run_ring_queue_tests +++ /dev/null @@ -1,30 +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. -# - -from common import * - -ENV["QPID_PORT"] = start_broker("broker") - -call("ring_queue_test -c -s 4 -r 4") -call("ring_queue_test -s 4 -r 0") -call("ring_queue_test -s 1 -r 1") - -check_results() diff --git a/qpid/cpp/src/tests/run_sasl_tests b/qpid/cpp/src/tests/run_sasl_tests deleted file mode 100755 index 7ce92a232b..0000000000 --- a/qpid/cpp/src/tests/run_sasl_tests +++ /dev/null @@ -1,64 +0,0 @@ -#!/usr/bin/env 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 -eu - -source env.sh - -export WORK_DIR=$(mktemp -d $PWD/run_sasl_tests_XXXX) - -echo "Created work dir '${WORK_DIR}'" - -min_sasl_version=131350 # Sasl version 2.1.22 -sasl_version=$(sasl_version) - -if (( $sasl_version < min_sasl_version )); then - echo "Sasl version is too old; found $version; require $min_version or greater" - echo "SKIPPING" - exit 0 -fi - -exit_code=0 - -function fail { - echo "FAILED! ${1}" - exit_code=1 -} - -echo "# Running sasl_fed" -sasl_fed || fail "Test sasl_fed failed" -echo "# Running sasl_fed_ex dynamic" -sasl_fed_ex dynamic || fail "Test sasl_fed_ex dynamic failed" -echo "# Running sasl_fed_ex link" -sasl_fed_ex link || fail "Test sasl_fed_ex link failed" -echo "# Running sasl_fed_ex queue" -sasl_fed_ex queue || fail "Test sasl_fed_ex queue failed" -echo "# Running sasl_fed_ex route" -sasl_fed_ex route || fail "Test sasl_fed_ex route failed" -echo "# Running sasl_no_dir" -sasl_no_dir || fail "Test sasl_no_dir failed" - -if (( exit_code != 0 )); then - echo "SASL test failures" - exit $exit_code -fi - -rm -rf $WORK_DIR diff --git a/qpid/cpp/src/tests/run_ssl_tests b/qpid/cpp/src/tests/run_ssl_tests deleted file mode 100755 index 896893eb3d..0000000000 --- a/qpid/cpp/src/tests/run_ssl_tests +++ /dev/null @@ -1,329 +0,0 @@ -#!/usr/bin/env 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 env.sh - -#set -x - -CONFIG=$(dirname $0)/qpidd-empty.conf -TEST_CERT_DIR=`pwd`/test_cert_dir -CERT_DB=${TEST_CERT_DIR}/test_cert_db -CERT_PW_FILE=`pwd`/cert.password -TEST_HOSTNAME=127.0.0.1 -TEST_CLIENT_CERT=rumplestiltskin -CA_PEM_FILE=${TEST_CERT_DIR}/ca_cert.pem -OTHER_CA_CERT_DB=${TEST_CERT_DIR}/x_ca_cert_db -OTHER_CA_PEM_FILE=${TEST_CERT_DIR}/other_ca_cert.pem -PY_PING_BROKER=$SOURCE_DIR/src/tests/ping_broker -COUNT=10 - -if [[ -a $AMQP_LIB ]] ; then - MODULES="--load-module $AMQP_LIB" -fi - -trap cleanup EXIT - -error() { echo $*; exit 1; } - -# create the test certificate database -# $1 = string used as Subject in server's certificate -# $2 = string used as SubjectAlternateName (SAN) in server's certificate -create_certs() { - - local CERT_SUBJECT=${1:-"CN=${TEST_HOSTNAME},O=MyCo,ST=Massachusetts,C=US"} - local CERT_SAN=${2:-"*.server.com"} - - mkdir -p ${TEST_CERT_DIR} - rm -rf ${TEST_CERT_DIR}/* - - # Set Up a CA with a self-signed Certificate - # - mkdir -p ${CERT_DB} - certutil -N -d ${CERT_DB} -f ${CERT_PW_FILE} - certutil -S -d ${CERT_DB} -n "Test-CA" -s "CN=Test-CA,O=MyCo,ST=Massachusetts,C=US" -t "CT,," -x -f ${CERT_PW_FILE} -z /bin/sh >/dev/null 2>&1 - certutil -L -d ${CERT_DB} -n "Test-CA" -a -o ${CERT_DB}/rootca.crt -f ${CERT_PW_FILE} - #certutil -L -d ${CERT_DB} -f ${CERT_PW_FILE} - - # create server certificate signed by Test-CA - # - certutil -R -d ${CERT_DB} -s "${CERT_SUBJECT}" -o ${TEST_CERT_DIR}/server.req -f ${CERT_PW_FILE} -z /bin/sh > /dev/null 2>&1 - certutil -C -d ${CERT_DB} -c "Test-CA" -8 "${CERT_SAN}" -i ${TEST_CERT_DIR}/server.req -o ${TEST_CERT_DIR}/server.crt -f ${CERT_PW_FILE} -m ${RANDOM} - certutil -A -d ${CERT_DB} -n ${TEST_HOSTNAME} -i ${TEST_CERT_DIR}/server.crt -t "Pu,," - - # create a certificate to identify the client - # - certutil -R -d ${CERT_DB} -s "CN=${TEST_CLIENT_CERT}" -o ${TEST_CERT_DIR}/client.req -f ${CERT_PW_FILE} -z /bin/sh > /dev/null 2>&1 - certutil -C -d ${CERT_DB} -c "Test-CA" -8 "*.client.com" -i ${TEST_CERT_DIR}/client.req -o ${TEST_CERT_DIR}/client.crt -f ${CERT_PW_FILE} -m ${RANDOM} - certutil -A -d ${CERT_DB} -n ${TEST_CLIENT_CERT} -i ${TEST_CERT_DIR}/client.crt -t "Pu,," - ### - #certutil -N -d ${SERVER_CERT_DIR} -f ${CERT_PW_FILE} - #certutil -S -d ${SERVER_CERT_DIR} -n ${TEST_HOSTNAME} -s "CN=${TEST_HOSTNAME}" -t "CT,," -x -f ${CERT_PW_FILE} -z /usr/bin/certutil - #certutil -S -d ${SERVER_CERT_DIR} -n ${TEST_CLIENT_CERT} -s "CN=${TEST_CLIENT_CERT}" -t "CT,," -x -f ${CERT_PW_FILE} -z /usr/bin/certutil - - # Set up a separate DB with its own CA for testing failure to validate scenario - # - mkdir -p ${OTHER_CA_CERT_DB} - certutil -N -d ${OTHER_CA_CERT_DB} -f ${CERT_PW_FILE} - certutil -S -d ${OTHER_CA_CERT_DB} -n "Other-Test-CA" -s "CN=Another Test CA,O=MyCo,ST=Massachusetts,C=US" -t "CT,," -x -f ${CERT_PW_FILE} -z /bin/sh >/dev/null 2>&1 - certutil -L -d ${OTHER_CA_CERT_DB} -n "Other-Test-CA" -a -o ${OTHER_CA_CERT_DB}/rootca.crt -f ${CERT_PW_FILE} - #certutil -L -d ${OTHER_CA_CERT_DB} -f ${CERT_PW_FILE} -} - -delete_certs() { - if [[ -e ${TEST_CERT_DIR} ]] ; then - rm -rf ${TEST_CERT_DIR} - fi -} - -# Don't need --no-module-dir or --no-data-dir as they are set as env vars in env.sh -COMMON_OPTS="--daemon --config $CONFIG --ssl-cert-db $CERT_DB --ssl-cert-password-file $CERT_PW_FILE --ssl-cert-name $TEST_HOSTNAME" - -# Start new brokers: -# $1 must be integer -# $2 = extra opts -# Append used ports to PORTS variable -start_brokers() { - local -a ports - for (( i=0; $i<$1; i++)) do - ports[$i]=$(qpidd --port 0 --interface 127.0.0.1 $COMMON_OPTS $2) || error "Could not start broker $i" - done - PORTS=( ${PORTS[@]} ${ports[@]} ) -} - -# Stop single broker: -# $1 is number of broker to stop (0 based) -stop_broker() { - qpidd -qp ${PORTS[$1]} - - # Remove from ports array - unset PORTS[$1] -} - -stop_brokers() { - for port in "${PORTS[@]}"; - do - qpidd -qp $port - done - PORTS=() -} - -pick_port() { - # We need a fixed port to set --cluster-url. Use qpidd to pick a free port. - PICK=`qpidd --no-module-dir --listen-disable ssl -dp0` - qpidd --no-module-dir -qp $PICK - echo $PICK -} - -cleanup() { - stop_brokers - delete_certs - rm -f ${CERT_PW_FILE} -} - -start_ssl_broker() { - start_brokers 1 "--transport ssl --ssl-port 0 --require-encryption --auth no $MODULES" -} - -start_ssl_mux_broker() { - qpidd $COMMON_OPTS --port $1 --ssl-port $1 --auth no - PORTS=( ${PORTS[@]} $1 ) -} - -sasl_config_dir=$BUILD_DIR/src/tests/sasl_config - -start_authenticating_broker() { - start_brokers 1 "--transport ssl --ssl-port 0 --require-encryption --ssl-sasl-no-dict --ssl-require-client-authentication --auth yes --sasl-config=${sasl_config_dir} $MODULES" -} - -ssl_cluster_broker() { # $1 = port - start_brokers 1 "--ssl-port $1 --auth no --load-module $CLUSTER_LIB --cluster-name ssl_test.$HOSTNAME.$$ --cluster-url amqp:ssl:$TEST_HOSTNAME:$1" - - # Wait for broker to be ready - qpid-ping -Pssl -b $TEST_HOSTNAME:$1 -q || { echo "Cannot connect to broker on $1"; exit 1; } -} - -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 database" - -start_ssl_broker -PORT=${PORTS[0]} -echo "Running SSL test on port $PORT" -export QPID_NO_MODULE_DIR=1 -export QPID_SSL_CERT_DB=${CERT_DB} -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; } - -if [[ -a $AMQP_LIB ]] ; then - echo "Testing ssl over AMQP 1.0" - qpid-send --connection-options '{protocol:amqp1.0}' -b $URL --content-string=hello -a "foo;{create:always}" - MSG=`qpid-receive --connection-options '{protocol:amqp1.0}' -b $URL -a "foo;{create:always}" --messages 1` - test "$MSG" = "hello" || { echo "receive failed for AMQP 1.0 '$MSG' != 'hello'"; exit 1; } -fi - -## Test connection with a combination of URL and connection options (in messaging API) -URL=$TEST_HOSTNAME:$PORT -qpid-send -b $URL --connection-options '{transport:ssl,heartbeat:2}' --content-string='hello again' -a "foo;{create:always}" -MSG=`qpid-receive -b $URL --connection-options '{transport:ssl,heartbeat:2}' -a "foo;{create:always}" --messages 1` -test "$MSG" = "hello again" || { echo "receive failed '$MSG' != 'hello again'"; exit 1; } - -## Test using the Python client -if test -d $PYTHON_DIR; then - echo "Testing Non-Authenticating with Python Client..." - URL=amqps://$TEST_HOSTNAME:$PORT - if `$PY_PING_BROKER -b $URL`; then echo " Passed"; else { echo " Failed"; exit 1; }; fi -else - echo "Skipping python part of ssl_test, no python dir." -fi - -#### Client Authentication tests - -start_authenticating_broker -PORT2=${PORTS[1]} -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 ssl muxed with plain TCP on the same connection - -# Test a specified port number - since tcp/ssl are the same port don't need to specify --transport ssl -PORT=`pick_port` -start_ssl_mux_broker $PORT || error "Could not start broker" -echo "Running SSL/TCP mux test on fixed port $PORT" - -## Test connection via connection settings -qpid-perftest --count ${COUNT} --port ${PORT} -P ssl -b $TEST_HOSTNAME --summary || error "SSL connection failed!" -qpid-perftest --count ${COUNT} --port ${PORT} -P tcp -b $TEST_HOSTNAME --summary || error "TCP connection failed!" - -# Test a broker chosen port - since ssl chooses port need to use --transport ssl here -start_ssl_broker -PORT=${PORTS[0]} -echo "Running SSL/TCP mux test on random port $PORT" - -## Test connection via connection settings -qpid-perftest --count ${COUNT} --port ${PORT} -P ssl -b $TEST_HOSTNAME --summary || error "SSL connection failed!" -qpid-perftest --count ${COUNT} --port ${PORT} -P tcp -b $TEST_HOSTNAME --summary || error "TCP connection failed!" - -stop_brokers - -### Additional tests that require 'openssl' and 'pk12util' to be installed (optional) - -PK12UTIL=$(type -p pk12util) -if [[ !(-x $PK12UTIL) ]] ; then - echo >&2 "'pk12util' command not available, skipping remaining tests" - exit 0 -fi - -OPENSSL=$(type -p openssl) -if [[ !(-x $OPENSSL) ]] ; then - echo >&2 "'openssl' command not available, skipping remaining tests" - exit 0 -fi - -## verify python version > 2.5 (only 2.6+ does certificate checking) -PY_VERSION=$(python -c "import sys; print hex(sys.hexversion)") -if (( PY_VERSION < 0x02060000 )); then - echo >&2 "Detected python version < 2.6 - skipping certificate verification tests" - exit 0 -fi - -echo "Testing Certificate validation and Authentication with the Python Client..." - -# extract the CA's certificate as a PEM file -get_ca_certs() { - $PK12UTIL -o ${TEST_CERT_DIR}/CA_pk12.out -d ${CERT_DB} -n "Test-CA" -w ${CERT_PW_FILE} -k ${CERT_PW_FILE} > /dev/null - $OPENSSL pkcs12 -in ${TEST_CERT_DIR}/CA_pk12.out -out ${CA_PEM_FILE} -nokeys -passin file:${CERT_PW_FILE} >/dev/null - $PK12UTIL -o ${TEST_CERT_DIR}/other_CA_pk12.out -d ${OTHER_CA_CERT_DB} -n "Other-Test-CA" -w ${CERT_PW_FILE} -k ${CERT_PW_FILE} > /dev/null - $OPENSSL pkcs12 -in ${TEST_CERT_DIR}/other_CA_pk12.out -out ${OTHER_CA_PEM_FILE} -nokeys -passin file:${CERT_PW_FILE} >/dev/null -} - -get_ca_certs || error "Could not extract CA certificates as PEM files" -start_ssl_broker -PORT=${PORTS[0]} -URL=amqps://$TEST_HOSTNAME:$PORT -# verify the python client can authenticate the broker using the CA -if `${PY_PING_BROKER} -b $URL --ssl-trustfile=${CA_PEM_FILE}`; then echo " Passed"; else { echo " Failed"; exit 1; }; fi -# verify the python client fails to authenticate the broker when using the other CA -if `${PY_PING_BROKER} -b $URL --ssl-trustfile=${OTHER_CA_PEM_FILE} > /dev/null 2>&1`; then { echo " Failed"; exit 1; }; else echo " Passed"; fi -stop_brokers - -# create a certificate without matching TEST_HOSTNAME, should fail to verify - -create_certs "O=MyCo" "*.${TEST_HOSTNAME}.com" || error "Could not create server test certificate" -get_ca_certs || error "Could not extract CA certificates as PEM files" -start_ssl_broker -PORT=${PORTS[0]} -URL=amqps://$TEST_HOSTNAME:$PORT -if `${PY_PING_BROKER} -b $URL --ssl-trustfile=${CA_PEM_FILE} > /dev/null 2>&1`; then { echo " Failed"; exit 1; }; else echo " Passed"; fi -# but disabling the check for the hostname should pass -if `${PY_PING_BROKER} -b $URL --ssl-trustfile=${CA_PEM_FILE} --ssl-skip-hostname-check`; then echo " Passed"; else { echo " Failed"; exit 1; }; fi -stop_brokers - -# test SubjectAltName parsing - -if (( PY_VERSION >= 0x02070300 )); then -# python 2.7.3+ supports SubjectAltName extraction -# create a certificate with TEST_HOSTNAME only in SAN, should verify OK - create_certs "O=MyCo" "*.foo.com,${TEST_HOSTNAME},*xyz.com" || error "Could not create server test certificate" - get_ca_certs || error "Could not extract CA certificates as PEM files" - start_ssl_broker - PORT=${PORTS[0]} - URL=amqps://$TEST_HOSTNAME:$PORT - if `${PY_PING_BROKER} -b $URL --ssl-trustfile=${CA_PEM_FILE}`; then echo " Passed"; else { echo " Failed"; exit 1; }; fi - stop_brokers - - create_certs "O=MyCo" "*${TEST_HOSTNAME}" || error "Could not create server test certificate" - get_ca_certs || error "Could not extract CA certificates as PEM files" - start_ssl_broker - PORT=${PORTS[0]} - URL=amqps://$TEST_HOSTNAME:$PORT - if `${PY_PING_BROKER} -b $URL --ssl-trustfile=${CA_PEM_FILE}`; then echo " Passed"; else { echo " Failed"; exit 1; }; fi - stop_brokers -fi diff --git a/qpid/cpp/src/tests/run_store_tests.ps1 b/qpid/cpp/src/tests/run_store_tests.ps1 deleted file mode 100644 index f85e158cc0..0000000000 --- a/qpid/cpp/src/tests/run_store_tests.ps1 +++ /dev/null @@ -1,132 +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 - -. .\env.ps1 - -if (!(Test-Path $PYTHON_DIR -pathType Container)) { - "Skipping store tests as python libs not found" - exit 1 -} - -# 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_TEST_DIR;$srcdir;$env:PYTHONPATH" -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: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/qpid/cpp/src/tests/run_topic_tests b/qpid/cpp/src/tests/run_topic_tests deleted file mode 100755 index f34b8044ba..0000000000 --- a/qpid/cpp/src/tests/run_topic_tests +++ /dev/null @@ -1,30 +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. -# - -# Quick and quiet topic test for make test - -from common import * - -ENV["QPID_PORT"] = start_broker("broker") - -call_with_valgrind("topictest -s2 -m2 -b1") - -check_results() diff --git a/qpid/cpp/src/tests/run_transaction_tests b/qpid/cpp/src/tests/run_transaction_tests deleted file mode 100755 index d0c8a8a5c0..0000000000 --- a/qpid/cpp/src/tests/run_transaction_tests +++ /dev/null @@ -1,30 +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. -# - -from common import * - -port1 = start_broker("broker1") -port2 = start_broker("broker2") - -call_with_valgrind("qpid-txtest --queues 4 --tx-count 10 --quiet --port {0}", port1) -call_with_valgrind("qpid-txtest2 --queues 4 --tx-count 10 --quiet --port {0}", port2) - -check_results() diff --git a/qpid/cpp/src/tests/run_unit_tests b/qpid/cpp/src/tests/run_unit_tests deleted file mode 100755 index 8e81fe73a0..0000000000 --- a/qpid/cpp/src/tests/run_unit_tests +++ /dev/null @@ -1,39 +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. -# - -from common import * - -# Options for boost test framework - -if "BOOST_TEST_SHOW_PROGRESS" not in ENV: - ENV["BOOST_TEST_SHOW_PROGRESS"] = "yes" - -if "BOOST_TEST_CATCH_SYSTEM_ERRORS" not in ENV: - ENV["BOOST_TEST_CATCH_SYSTEM_ERRORS"] = "no" - -if WINDOWS: - ENV["QPID_SSL_CERT_STORE_LOCATION"] = "LocalMachine" - ENV["QPID_SSL_CERT_NAME"] = "localhost" - ENV["QPID_SSL_PORT"] = "0" - -call_with_valgrind("unit_test") - -check_results() diff --git a/qpid/cpp/src/tests/run_windows_store_tests b/qpid/cpp/src/tests/run_windows_store_tests deleted file mode 100644 index 900d0fc1a7..0000000000 --- a/qpid/cpp/src/tests/run_windows_store_tests +++ /dev/null @@ -1,61 +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. -# - -from common import * - -store_lib = join(BUILD_DIR, "src", "qpid", "store", "RelWithDebInfo", "store.dll") -store_sql_lib = join(BUILD_DIR, "src", "qpid", "store", "RelWithDebInfo", "mssql_store.dll") -store_clfs_lib = join(BUILD_DIR, "src", "qpid", "store", "RelWithDebInfo", "msclfs_store.dll") - -if exists(store_sql_lib): - port = start_broker("broker_sql", - "--load-module {0}".format(store_lib), - "--load-module {0}".format(store_sql_lib)) - - run_broker_tests(port, - "-m qpid_tests.broker_0_10.dtx", - "-m qpid_tests.broker_0_10.persistence") - - stop_broker(port) - -if exists(store_clfs_lib): - port = start_broker("broker_clfs", - "--load-module {0}".format(store_lib), - "--load-module {0}".format(store_clfs_lib)) - - run_broker_tests(port, - "-m qpid_tests.broker_0_10.dtx", - "-m qpid_tests.broker_0_10.persistence") - - stop_broker(port) - -ENV["STORE_SQL_LIB"] = store_sql_lib -ENV["STORE_SQL_CLFS_LIB"] = store_clfs_lib - -if exists(store_sql_lib): - ENV["STORE_CATALOG"] = join(WORK_DIR, "store_recovery_sql_test") - call("qpid-python-test -m store -DOUTDIR={0}", WORK_DIR) - -if exists(store_clfs_lib): - ENV["STORE_CATALOG"] = join(WORK_DIR, "store_recovery_clfs_test") - call("qpid-python-test -m store -DOUTDIR={0}", WORK_DIR) - -check_results() diff --git a/qpid/cpp/src/tests/sasl_fed b/qpid/cpp/src/tests/sasl_fed deleted file mode 100755 index 8491d428be..0000000000 --- a/qpid/cpp/src/tests/sasl_fed +++ /dev/null @@ -1,122 +0,0 @@ -#!/usr/bin/env 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 -eu - -WORK_DIR=$WORK_DIR/sasl_fed -mkdir $WORK_DIR - -sasl_config_dir=$BUILD_DIR/src/tests/sasl_config - -# Create ACL file to allow links -echo acl allow all all > $WORK_DIR/sasl_fed.acl - -echo "Starting broker 1" - -qpidd \ - -p 0 --interface 127.0.0.1 \ - --data-dir $WORK_DIR/data_1 \ - --auth=yes \ - --mgmt-enable=yes \ - --log-enable info+ \ - --log-source yes \ - --log-to-file $WORK_DIR/qpidd_1.log \ - --sasl-config=$sasl_config_dir \ - --acl-file $WORK_DIR/sasl_fed.acl \ - -d > $WORK_DIR/broker_1_port - -broker_1_port=$(cat $WORK_DIR/broker_1_port) - -echo "Starting broker 2" - -qpidd \ - -p 0 --interface 127.0.0.1 \ - --data-dir $WORK_DIR/data_2 \ - --auth=yes \ - --mgmt-enable=yes \ - --log-enable info+ \ - --log-source yes \ - --log-to-file $WORK_DIR/qpidd_2.log \ - --sasl-config=$sasl_config_dir \ - --acl-file $WORK_DIR/sasl_fed.acl \ - -d > $WORK_DIR/broker_2_port - -broker_2_port=$(cat $WORK_DIR/broker_2_port) - -function stop_brokers { - qpidd --port $broker_1_port --quit - qpidd --port $broker_2_port --quit -} - -trap stop_brokers EXIT - -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 "Adding exchanges" - -qpid-config -b localhost:$broker_1_port add exchange direct $EXCHANGE_NAME -qpid-config -b localhost:$broker_2_port add exchange direct $EXCHANGE_NAME - -echo "Adding queues" - -qpid-config -b localhost:$broker_1_port add queue $QUEUE_NAME -qpid-config -b localhost:$broker_2_port add queue $QUEUE_NAME - -sleep 5 - -echo "Creating bindings" - -qpid-config -b localhost:$broker_1_port bind $EXCHANGE_NAME $QUEUE_NAME $ROUTING_KEY -qpid-config -b localhost:$broker_2_port bind $EXCHANGE_NAME $QUEUE_NAME $ROUTING_KEY - -sleep 5 - -echo "Adding routes" - -qpid-route 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 " - -datagen --count $n_messages | sender --mechanism DIGEST-MD5 --username zag --password zag --exchange $EXCHANGE_NAME --routing-key $ROUTING_KEY --port $broker_1_port - -sleep 5 - -echo "Examining Broker $broker_1_port" - -broker_1_message_count=$(qpid-stat -q -b localhost:$broker_1_port | grep sasl_fed_queue | awk '{print $2}') - -echo "Examining Broker $broker_2_port" - -broker_2_message_count=$(qpid-stat -q -b localhost:$broker_2_port | grep sasl_fed_queue | awk '{print $2}') - -if (( $broker_2_message_count != $n_messages )); then - echo "Expected ${n_messages} and received ${broker_2_message_count}" - exit 1 -fi diff --git a/qpid/cpp/src/tests/sasl_fed_ex b/qpid/cpp/src/tests/sasl_fed_ex deleted file mode 100755 index cc70246683..0000000000 --- a/qpid/cpp/src/tests/sasl_fed_ex +++ /dev/null @@ -1,223 +0,0 @@ -#!/usr/bin/env 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. -#=============================================================================== - -set -eu - -if (( $# != 1 )); then - # These are the four different ways of creating links ( or routes+links ) - # that the qpid-route command provides. - echo "Usage: $(basename $0) dynamic|link|queue|route" - exit 1 -fi - -qpid_route_method=$1 - -WORK_DIR="${WORK_DIR}/sasl_fed_ex_${qpid_route_method}" -mkdir $WORK_DIR - -CERT_DIR=$WORK_DIR/test_cert_db -CERT_PW_FILE=$WORK_DIR/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 /bin/sh 2> /dev/null -} - -CERTUTIL=$(type -p certutil) || : - -if [[ ! -x $CERTUTIL ]]; then - echo "No certutil, skipping ssl test" - exit 0 -fi - -create_certs 2> /dev/null - -if (( $? != 0 )); then - echo "Could not create test certificate" - exit 1 -fi - -sasl_config_dir=$BUILD_DIR/src/tests/sasl_config - -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 - -export QPID_SSL_CERT_NAME=${TEST_HOSTNAME} - -export QPID_NO_MODULE_DIR=1 -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 \ - --mgmt-enable yes \ - --log-enable info+ \ - --log-source yes \ - --daemon" - -function start_brokers { - # vanilla brokers -------------------------------- - echo "Starting SRC broker" - qpidd \ - --port=${SRC_TCP_PORT} \ - --ssl-port ${SRC_SSL_PORT} \ - ${COMMON_BROKER_OPTIONS} \ - --log-to-file $WORK_DIR/qpidd_src.log 2> /dev/null - - broker_ports[0]=${SRC_TCP_PORT} - - echo "Starting DST broker" - qpidd \ - --port=${DST_TCP_PORT} \ - --ssl-port ${DST_SSL_PORT} \ - ${COMMON_BROKER_OPTIONS} \ - --log-to-file $WORK_DIR/qpidd_dst.log 2> /dev/null - - broker_ports[1]=${DST_TCP_PORT} -} - -function halt_brokers { - n_brokers=${#broker_ports[@]} - echo "Halting ${n_brokers} brokers" - for i in $(seq 0 $((${n_brokers} - 1))); do - halt_port=${broker_ports[$i]} - echo "Halting broker $i on port ${halt_port}" - qpidd --port ${halt_port} --quit - done -} - -start_brokers -trap halt_brokers EXIT - -# 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 - -echo "Add exchanges" -qpid-config -b localhost:${SRC_TCP_PORT} add exchange direct $EXCHANGE_NAME -qpid-config -b localhost:${DST_TCP_PORT} add exchange direct $EXCHANGE_NAME - -echo "Add queues" -qpid-config -b localhost:${SRC_TCP_PORT} add queue $QUEUE_NAME -qpid-config -b localhost:${DST_TCP_PORT} add queue $QUEUE_NAME - -echo "Create bindings" -qpid-config -b localhost:${SRC_TCP_PORT} bind $EXCHANGE_NAME $QUEUE_NAME $ROUTING_KEY -qpid-config -b 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 - echo "Dynamic add" - qpid-route -t ssl dynamic add localhost:${DST_TCP_PORT} $TEST_HOSTNAME:${SRC_SSL_PORT} $EXCHANGE_NAME "" "" EXTERNAL || : -elif [[ $qpid_route_method == "link" ]]; then - echo "Link add" - qpid-route -t ssl link add localhost:${DST_TCP_PORT} $TEST_HOSTNAME:${SRC_SSL_PORT} EXTERNAL || : -elif [[ $qpid_route_method == "queue" ]]; then - echo "Queue add" - qpid-route -t ssl queue add localhost:${DST_TCP_PORT} $TEST_HOSTNAME:${SRC_SSL_PORT} $EXCHANGE_NAME $ROUTING_KEY EXTERNAL || : -elif [[ $qpid_route_method == "route" ]]; then - echo "Route add" - qpid-route -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 - -# Look only at the transport field, which should be "ssl". -echo "Check the link" -link_status=$(qpid-route link list localhost:${DST_TCP_PORT} | tail -1 | awk '{print $3}') - -sleep 1 - -if [[ ! $link_status ]]; then - echo "Link status is empty" - echo "Result: fail" - exit 2 -fi - -if [[ $link_status == "ssl" ]]; then - echo "Result: good" - exit 0 -fi - -echo "Link status has a bad value: ${link_status}" -echo "Result: fail" -exit 3 diff --git a/qpid/cpp/src/tests/sasl_no_dir b/qpid/cpp/src/tests/sasl_no_dir deleted file mode 100755 index 30d8434079..0000000000 --- a/qpid/cpp/src/tests/sasl_no_dir +++ /dev/null @@ -1,58 +0,0 @@ -#!/usr/bin/env 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 -eu - -sasl_config_dir=$BUILD_DIR/not_there_at_all - -WORK_DIR=$WORK_DIR/sasl_no_dir -mkdir $WORK_DIR - -LOG_FILE=$WORK_DIR/qpidd.log - -echo "Starting broker" -qpidd \ - -p 0 --interface 127.0.0.1 \ - --no-data-dir \ - --auth=yes \ - --mgmt-enable=yes \ - --log-enable info+ \ - --log-source yes \ - --log-to-file ${LOG_FILE} \ - --sasl-config=$sasl_config_dir \ - -d 2> /dev/null 1> $WORK_DIR/broker_port || : - -# If it works right, the output will look something like this: ( two lines long ) -# Daemon startup failed: SASL: sasl_set_path failed: no such directory: /home/mick/trunk/qpid/cpp/src/tests/sasl_config (qpid/broker/SaslAuthenticator.cpp:112) -# 2011-10-13 14:07:00 critical qpidd.cpp:83: Unexpected error: Daemon startup failed: SASL: sasl_set_path failed: no such directory: /home/mick/trunk/qpid/cpp/src/tests/sasl_config (qpid/broker/SaslAuthenticator.cpp:112) - -result=$(cat ${LOG_FILE} | grep "sasl_set_path failed: no such directory" | wc -l) - -if (( $result == 2 )); then - echo "Result: success" - exit 0 -fi - -broker_port=$(cat $WORK_DIR/broker_port) -qpidd --port ${broker_port} --quit - -echo "Result: fail" -exit 1 diff --git a/qpid/cpp/src/tests/sasl_test_setup.sh b/qpid/cpp/src/tests/sasl_test_setup.sh deleted file mode 100755 index 1416759da7..0000000000 --- a/qpid/cpp/src/tests/sasl_test_setup.sh +++ /dev/null @@ -1,43 +0,0 @@ -#!/usr/bin/env 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 env.sh - -test -x $SASLPASSWD2 || { 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 -mech_list: ANONYMOUS PLAIN DIGEST-MD5 EXTERNAL CRAM-MD5 -EOF - -# Populate temporary sasl db. -SASLTEST_DB=./sasl_config/qpidd.sasldb -rm -f $SASLTEST_DB -echo guest | $SASLPASSWD2 -c -p -f $SASLTEST_DB -u QPID guest -echo zig | $SASLPASSWD2 -c -p -f $SASLTEST_DB -u QPID zig -echo zag | $SASLPASSWD2 -c -p -f $SASLTEST_DB -u QPID zag - diff --git a/qpid/cpp/src/tests/sasl_version.cpp b/qpid/cpp/src/tests/sasl_version.cpp deleted file mode 100644 index db3efe4181..0000000000 --- a/qpid/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/qpid/cpp/src/tests/sender.cpp b/qpid/cpp/src/tests/sender.cpp deleted file mode 100644 index 063b5e87dc..0000000000 --- a/qpid/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/qpid/cpp/src/tests/shlibtest.cpp b/qpid/cpp/src/tests/shlibtest.cpp deleted file mode 100644 index 5655eb7e64..0000000000 --- a/qpid/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/qpid/cpp/src/tests/ssl_test b/qpid/cpp/src/tests/ssl_test deleted file mode 100755 index 7c85087ad1..0000000000 --- a/qpid/cpp/src/tests/ssl_test +++ /dev/null @@ -1,335 +0,0 @@ -#!/usr/bin/env 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 env.sh - -#set -x - -CONFIG=$(dirname $0)/qpidd-empty.conf -TEST_CERT_DIR=`pwd`/test_cert_dir -CERT_DB=${TEST_CERT_DIR}/test_cert_db -CERT_PW_FILE=`pwd`/cert.password -TEST_HOSTNAME=127.0.0.1 -TEST_CLIENT_CERT=rumplestiltskin -CA_PEM_FILE=${TEST_CERT_DIR}/ca_cert.pem -OTHER_CA_CERT_DB=${TEST_CERT_DIR}/x_ca_cert_db -OTHER_CA_PEM_FILE=${TEST_CERT_DIR}/other_ca_cert.pem -PY_PING_BROKER=$SOURCE_DIR/src/tests/ping_broker -COUNT=10 - -if [[ -a $AMQP_LIB ]] ; then - MODULES="--load-module $AMQP_LIB" -fi - -trap cleanup EXIT - -error() { echo $*; exit 1; } - -# create the test certificate database -# $1 = string used as Subject in server's certificate -# $2 = string used as SubjectAlternateName (SAN) in server's certificate -create_certs() { - - local CERT_SUBJECT=${1:-"CN=${TEST_HOSTNAME},O=MyCo,ST=Massachusetts,C=US"} - local CERT_SAN=${2:-"*.server.com"} - - mkdir -p ${TEST_CERT_DIR} - rm -rf ${TEST_CERT_DIR}/* - - # Set Up a CA with a self-signed Certificate - # - mkdir -p ${CERT_DB} - certutil -N -d ${CERT_DB} -f ${CERT_PW_FILE} - certutil -S -d ${CERT_DB} -n "Test-CA" -s "CN=Test-CA,O=MyCo,ST=Massachusetts,C=US" -t "CT,," -x -f ${CERT_PW_FILE} -z /bin/sh >/dev/null 2>&1 - certutil -L -d ${CERT_DB} -n "Test-CA" -a -o ${CERT_DB}/rootca.crt -f ${CERT_PW_FILE} - #certutil -L -d ${CERT_DB} -f ${CERT_PW_FILE} - - # create server certificate signed by Test-CA - # - certutil -R -d ${CERT_DB} -s "${CERT_SUBJECT}" -o ${TEST_CERT_DIR}/server.req -f ${CERT_PW_FILE} -z /bin/sh > /dev/null 2>&1 - certutil -C -d ${CERT_DB} -c "Test-CA" -8 "${CERT_SAN}" -i ${TEST_CERT_DIR}/server.req -o ${TEST_CERT_DIR}/server.crt -f ${CERT_PW_FILE} -m ${RANDOM} - certutil -A -d ${CERT_DB} -n ${TEST_HOSTNAME} -i ${TEST_CERT_DIR}/server.crt -t "Pu,," - - # create a certificate to identify the client - # - certutil -R -d ${CERT_DB} -s "CN=${TEST_CLIENT_CERT}" -o ${TEST_CERT_DIR}/client.req -f ${CERT_PW_FILE} -z /bin/sh > /dev/null 2>&1 - certutil -C -d ${CERT_DB} -c "Test-CA" -8 "*.client.com" -i ${TEST_CERT_DIR}/client.req -o ${TEST_CERT_DIR}/client.crt -f ${CERT_PW_FILE} -m ${RANDOM} - certutil -A -d ${CERT_DB} -n ${TEST_CLIENT_CERT} -i ${TEST_CERT_DIR}/client.crt -t "Pu,," - ### - #certutil -N -d ${SERVER_CERT_DIR} -f ${CERT_PW_FILE} - #certutil -S -d ${SERVER_CERT_DIR} -n ${TEST_HOSTNAME} -s "CN=${TEST_HOSTNAME}" -t "CT,," -x -f ${CERT_PW_FILE} -z /usr/bin/certutil - #certutil -S -d ${SERVER_CERT_DIR} -n ${TEST_CLIENT_CERT} -s "CN=${TEST_CLIENT_CERT}" -t "CT,," -x -f ${CERT_PW_FILE} -z /usr/bin/certutil - - # Set up a separate DB with its own CA for testing failure to validate scenario - # - mkdir -p ${OTHER_CA_CERT_DB} - certutil -N -d ${OTHER_CA_CERT_DB} -f ${CERT_PW_FILE} - certutil -S -d ${OTHER_CA_CERT_DB} -n "Other-Test-CA" -s "CN=Another Test CA,O=MyCo,ST=Massachusetts,C=US" -t "CT,," -x -f ${CERT_PW_FILE} -z /bin/sh >/dev/null 2>&1 - certutil -L -d ${OTHER_CA_CERT_DB} -n "Other-Test-CA" -a -o ${OTHER_CA_CERT_DB}/rootca.crt -f ${CERT_PW_FILE} - #certutil -L -d ${OTHER_CA_CERT_DB} -f ${CERT_PW_FILE} -} - -delete_certs() { - if [[ -e ${TEST_CERT_DIR} ]] ; then - rm -rf ${TEST_CERT_DIR} - fi -} - -# Don't need --no-module-dir or --no-data-dir as they are set as env vars in env.sh -COMMON_OPTS="--daemon --config $CONFIG --ssl-cert-db $CERT_DB --ssl-cert-password-file $CERT_PW_FILE --ssl-cert-name $TEST_HOSTNAME" - -# Start new brokers: -# $1 must be integer -# $2 = extra opts -# Append used ports to PORTS variable -start_brokers() { - local -a ports - for (( i=0; $i<$1; i++)) do - ports[$i]=$(qpidd --port 0 --interface 127.0.0.1 $COMMON_OPTS $2) || error "Could not start broker $i" - done - PORTS=( ${PORTS[@]} ${ports[@]} ) -} - -# Stop single broker: -# $1 is number of broker to stop (0 based) -stop_broker() { - qpidd -qp ${PORTS[$1]} - - # Remove from ports array - unset PORTS[$1] -} - -stop_brokers() { - for port in "${PORTS[@]}"; - do - qpidd -qp $port - done - PORTS=() -} - -pick_port() { - # We need a fixed port to set --cluster-url. Use qpidd to pick a free port. - PICK=`qpidd --no-module-dir --listen-disable ssl -dp0` - qpidd --no-module-dir -qp $PICK - echo $PICK -} - -cleanup() { - stop_brokers - delete_certs - rm -f ${CERT_PW_FILE} -} - -start_ssl_broker() { - start_brokers 1 "--transport ssl --ssl-port 0 --require-encryption --auth no $MODULES" -} - -start_ssl_mux_broker() { - qpidd $COMMON_OPTS --port $1 --ssl-port $1 --auth no - PORTS=( ${PORTS[@]} $1 ) -} - -sasl_config_dir=$BUILD_DIR/src/tests/sasl_config - -start_authenticating_broker() { - start_brokers 1 "--transport ssl --ssl-port 0 --require-encryption --ssl-sasl-no-dict --ssl-require-client-authentication --auth yes --sasl-config=${sasl_config_dir} $MODULES" -} - -ssl_cluster_broker() { # $1 = port - start_brokers 1 "--ssl-port $1 --auth no --load-module $CLUSTER_LIB --cluster-name ssl_test.$HOSTNAME.$$ --cluster-url amqp:ssl:$TEST_HOSTNAME:$1" - - # Wait for broker to be ready - qpid-ping -Pssl -b $TEST_HOSTNAME:$1 -q || { echo "Cannot connect to broker on $1"; exit 1; } -} - -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 database" - -start_ssl_broker -PORT=${PORTS[0]} -echo "Running SSL test on port $PORT" -export QPID_NO_MODULE_DIR=1 -export QPID_SSL_CERT_DB=${CERT_DB} -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; } - -if [[ -a $AMQP_LIB ]] ; then - echo "Testing ssl over AMQP 1.0" - qpid-send --connection-options '{protocol:amqp1.0}' -b $URL --content-string=hello -a "foo;{create:always}" - MSG=`qpid-receive --connection-options '{protocol:amqp1.0}' -b $URL -a "foo;{create:always}" --messages 1` - test "$MSG" = "hello" || { echo "receive failed for AMQP 1.0 '$MSG' != 'hello'"; exit 1; } -fi - -## Test connection with a combination of URL and connection options (in messaging API) -URL=$TEST_HOSTNAME:$PORT -qpid-send -b $URL --connection-options '{transport:ssl,heartbeat:2}' --content-string='hello again' -a "foo;{create:always}" -MSG=`qpid-receive -b $URL --connection-options '{transport:ssl,heartbeat:2}' -a "foo;{create:always}" --messages 1` -test "$MSG" = "hello again" || { echo "receive failed '$MSG' != 'hello again'"; exit 1; } - -## Test using the Python client -if test -d $PYTHON_DIR; then - echo "Testing Non-Authenticating with Python Client..." - URL=amqps://$TEST_HOSTNAME:$PORT - if `$PY_PING_BROKER -b $URL`; then echo " Passed"; else { echo " Failed"; exit 1; }; fi -else - echo "Skipping python part of ssl_test, no python dir." -fi - -#### Client Authentication tests - -start_authenticating_broker -PORT2=${PORTS[1]} -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; } - -## Set the userid in the message to the authenticated username -./qpid-send -b $URL --connection-options "{ssl-cert-name: $TEST_CLIENT_CERT }" --auto-user-id true --content-string=hello -a "bar;{create:always}" -RECEIVED_USER=`./qpid-receive -b $URL --connection-options "{ssl-cert-name: $TEST_CLIENT_CERT }" -a "bar;{create:always}" --messages 1 --print-headers true | awk '/UserId/{print $2}'` -test "$RECEIVED_USER" = $TEST_CLIENT_CERT || { echo "user id not as expected: $RECEIVED_USER"; exit 1; } - -stop_brokers - -# Test ssl muxed with plain TCP on the same connection - -# Test a specified port number - since tcp/ssl are the same port don't need to specify --transport ssl -PORT=`pick_port` -start_ssl_mux_broker $PORT || error "Could not start broker" -echo "Running SSL/TCP mux test on fixed port $PORT" - -## Test connection via connection settings -qpid-perftest --count ${COUNT} --port ${PORT} -P ssl -b $TEST_HOSTNAME --summary || error "SSL connection failed!" -qpid-perftest --count ${COUNT} --port ${PORT} -P tcp -b $TEST_HOSTNAME --summary || error "TCP connection failed!" - -# Test a broker chosen port - since ssl chooses port need to use --transport ssl here -start_ssl_broker -PORT=${PORTS[0]} -echo "Running SSL/TCP mux test on random port $PORT" - -## Test connection via connection settings -qpid-perftest --count ${COUNT} --port ${PORT} -P ssl -b $TEST_HOSTNAME --summary || error "SSL connection failed!" -qpid-perftest --count ${COUNT} --port ${PORT} -P tcp -b $TEST_HOSTNAME --summary || error "TCP connection failed!" - -stop_brokers - -### Additional tests that require 'openssl' and 'pk12util' to be installed (optional) - -PK12UTIL=$(type -p pk12util) -if [[ !(-x $PK12UTIL) ]] ; then - echo >&2 "'pk12util' command not available, skipping remaining tests" - exit 0 -fi - -OPENSSL=$(type -p openssl) -if [[ !(-x $OPENSSL) ]] ; then - echo >&2 "'openssl' command not available, skipping remaining tests" - exit 0 -fi - -## verify python version > 2.5 (only 2.6+ does certificate checking) -PY_VERSION=$(python -c "import sys; print hex(sys.hexversion)") -if (( PY_VERSION < 0x02060000 )); then - echo >&2 "Detected python version < 2.6 - skipping certificate verification tests" - exit 0 -fi - -echo "Testing Certificate validation and Authentication with the Python Client..." - -# extract the CA's certificate as a PEM file -get_ca_certs() { - $PK12UTIL -o ${TEST_CERT_DIR}/CA_pk12.out -d ${CERT_DB} -n "Test-CA" -w ${CERT_PW_FILE} -k ${CERT_PW_FILE} > /dev/null - $OPENSSL pkcs12 -in ${TEST_CERT_DIR}/CA_pk12.out -out ${CA_PEM_FILE} -nokeys -passin file:${CERT_PW_FILE} >/dev/null - $PK12UTIL -o ${TEST_CERT_DIR}/other_CA_pk12.out -d ${OTHER_CA_CERT_DB} -n "Other-Test-CA" -w ${CERT_PW_FILE} -k ${CERT_PW_FILE} > /dev/null - $OPENSSL pkcs12 -in ${TEST_CERT_DIR}/other_CA_pk12.out -out ${OTHER_CA_PEM_FILE} -nokeys -passin file:${CERT_PW_FILE} >/dev/null -} - -get_ca_certs || error "Could not extract CA certificates as PEM files" -start_ssl_broker -PORT=${PORTS[0]} -URL=amqps://$TEST_HOSTNAME:$PORT -# verify the python client can authenticate the broker using the CA -if `${PY_PING_BROKER} -b $URL --ssl-trustfile=${CA_PEM_FILE}`; then echo " Passed"; else { echo " Failed"; exit 1; }; fi -# verify the python client fails to authenticate the broker when using the other CA -if `${PY_PING_BROKER} -b $URL --ssl-trustfile=${OTHER_CA_PEM_FILE} > /dev/null 2>&1`; then { echo " Failed"; exit 1; }; else echo " Passed"; fi -stop_brokers - -# create a certificate without matching TEST_HOSTNAME, should fail to verify - -create_certs "O=MyCo" "*.${TEST_HOSTNAME}.com" || error "Could not create server test certificate" -get_ca_certs || error "Could not extract CA certificates as PEM files" -start_ssl_broker -PORT=${PORTS[0]} -URL=amqps://$TEST_HOSTNAME:$PORT -if `${PY_PING_BROKER} -b $URL --ssl-trustfile=${CA_PEM_FILE} > /dev/null 2>&1`; then { echo " Failed"; exit 1; }; else echo " Passed"; fi -# but disabling the check for the hostname should pass -if `${PY_PING_BROKER} -b $URL --ssl-trustfile=${CA_PEM_FILE} --ssl-skip-hostname-check`; then echo " Passed"; else { echo " Failed"; exit 1; }; fi -stop_brokers - -# test SubjectAltName parsing - -if (( PY_VERSION >= 0x02070300 )); then -# python 2.7.3+ supports SubjectAltName extraction -# create a certificate with TEST_HOSTNAME only in SAN, should verify OK - create_certs "O=MyCo" "*.foo.com,${TEST_HOSTNAME},*xyz.com" || error "Could not create server test certificate" - get_ca_certs || error "Could not extract CA certificates as PEM files" - start_ssl_broker - PORT=${PORTS[0]} - URL=amqps://$TEST_HOSTNAME:$PORT - if `${PY_PING_BROKER} -b $URL --ssl-trustfile=${CA_PEM_FILE}`; then echo " Passed"; else { echo " Failed"; exit 1; }; fi - stop_brokers - - create_certs "O=MyCo" "*${TEST_HOSTNAME}" || error "Could not create server test certificate" - get_ca_certs || error "Could not extract CA certificates as PEM files" - start_ssl_broker - PORT=${PORTS[0]} - URL=amqps://$TEST_HOSTNAME:$PORT - if `${PY_PING_BROKER} -b $URL --ssl-trustfile=${CA_PEM_FILE}`; then echo " Passed"; else { echo " Failed"; exit 1; }; fi - stop_brokers -fi diff --git a/qpid/cpp/src/tests/store.py b/qpid/cpp/src/tests/store.py deleted file mode 100755 index 5c1934dded..0000000000 --- a/qpid/cpp/src/tests/store.py +++ /dev/null @@ -1,214 +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") - - # Queue up 2 messages, one with non-zero body, one with zero-length. - # 2 = delivery_mode.persistent - dp = self.ssn.delivery_properties(routing_key="DB_Q1", delivery_mode=2) - self.ssn.message_transfer(message=Message(dp, "normal message")) - self.ssn.message_transfer(message=Message(dp, "")) - - # 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) - - # Are the messages still there? - self.ssn.message_subscribe(destination="msgs", queue="DB_Q1", accept_mode=1, acquire_mode=0) - self.ssn.message_flow(unit = 1, value = 0xFFFFFFFFL, destination = "msgs") - self.ssn.message_flow(unit = 0, value = 10, destination = "msgs") - message_arrivals = self.ssn.incoming("msgs") - try: - message_arrivals.get(timeout=1) - message_arrivals.get(timeout=1) - except Empty: - assert False, 'Durable message(s) not recovered' - - 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/qpid/cpp/src/tests/test_store.cpp b/qpid/cpp/src/tests/test_store.cpp deleted file mode 100644 index 14aee7b648..0000000000 --- a/qpid/cpp/src/tests/test_store.cpp +++ /dev/null @@ -1,339 +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 - * - * Message store for tests, with two roles: - * - * 1. Dump store events to a text file that can be compared to expected event - * sequence - * - * 2. Emulate hard-to-recreate conditions such as asynchronous completion delays - * or store errors. - * - * Messages with specially formatted contents trigger various actions. - * See class Action below for available actions and message format.. - * - */ - -#include "qpid/broker/NullMessageStore.h" -#include "qpid/broker/Broker.h" -#include "qpid/broker/amqp_0_10/MessageTransfer.h" -#include "qpid/framing/AMQFrame.h" -#include "qpid/log/Statement.h" -#include "qpid/sys/Thread.h" -#include "qpid/Plugin.h" -#include "qpid/Options.h" -#include "qpid/RefCounted.h" -#include "qpid/Msg.h" -#include <boost/cast.hpp> -#include <boost/lexical_cast.hpp> -#include <memory> -#include <ostream> -#include <fstream> -#include <sstream> - -using namespace std; -using namespace boost; -using namespace qpid; -using namespace qpid::broker; -using namespace qpid::sys; - -namespace qpid { -namespace tests { - -namespace { - -bool startswith(const string& s, const string& prefix) { - return s.compare(0, prefix.size(), prefix) == 0; -} - -void split(const string& s, vector<string>& result, const char* sep=" \t\n") { - size_t i = s.find_first_not_of(sep); - while (i != string::npos) { - size_t j = s.find_first_of(sep, i); - if (j == string::npos) { - result.push_back(s.substr(i)); - break; - } - result.push_back(s.substr(i, j-i)); - i = s.find_first_not_of(sep, j); - } -} - -} - -/** - * Action message format is TEST_STORE_DO [<name>...]:<action> [<args>...] - * - * A list of store <name> can be included so the action only executes on one of - * the named stores. This is useful in a cluster setting where the same message - * is replicated to all broker's stores but should only trigger an action on - * specific ones. If no <name> is given, execute on any store. - * - */ -class Action { - public: - /** Available actions */ - enum ActionEnum { - NONE, - THROW, ///< Throw an exception from enqueue - DELAY, ///< Delay completion, takes an ID string to complete. - COMPLETE, ///< Complete a previously delayed message, takes ID - - N_ACTIONS // Count of actions, must be last - }; - - string name; - ActionEnum index; - vector<string> storeNames, args; - - Action(const string& s) { - index = NONE; - if (!startswith(s, PREFIX)) return; - size_t colon = s.find_first_of(":"); - if (colon == string::npos) return; - assert(colon >= PREFIX.size()); - split(s.substr(PREFIX.size(), colon-PREFIX.size()), storeNames); - split(s.substr(colon+1), args); - if (args.empty()) return; - for (size_t i = 0; i < N_ACTIONS; ++i) { - if (args[0] == ACTION_NAMES[i]) { - name = args[0]; - index = ActionEnum(i); - args.erase(args.begin()); - break; - } - } - } - - bool executeIn(const string& storeName) { - return storeNames.empty() || - find(storeNames.begin(), storeNames.end(), storeName) !=storeNames.end(); - } - - private: - static string PREFIX; - static const char* ACTION_NAMES[N_ACTIONS]; -}; - -string Action::PREFIX("TEST_STORE_DO"); - -const char* Action::ACTION_NAMES[] = { "none", "throw", "delay", "complete" }; - - -struct TestStoreOptions : public Options { - - string name; - string dump; - string events; - - 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.") - ("test-store-events", optValue(events, "FILE"), - "File to log events, 1 line per event.") - ; - } -}; - - -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 - << " events=" << options.events) - - if (!options.dump.empty()) - dump.reset(new ofstream(options.dump.c_str())); - if (!options.events.empty()) - events.reset(new ofstream(options.events.c_str())); - } - - ~TestStore() { - for_each(threads.begin(), threads.end(), boost::bind(&Thread::join, _1)); - } - - // Dummy transaction context. - struct TxContext : public TPCTransactionContext { - static int nextId; - string id; - TxContext() : id(lexical_cast<string>(nextId++)) {} - TxContext(string xid) : id(xid) {} - }; - - static string getId(const TransactionContext& tx) { - const TxContext* tc = dynamic_cast<const TxContext*>(&tx); - assert(tc); - return tc->id; - } - - - bool isNull() const { return false; } - - void log(const string& msg) { - QPID_LOG(info, "test_store: " << msg); - if (events.get()) *events << msg << endl << std::flush; - } - - auto_ptr<TransactionContext> begin() { - auto_ptr<TxContext> tx(new TxContext()); - log(Msg() << "<begin tx " << tx->id << ">"); - return auto_ptr<TransactionContext>(tx); - } - - auto_ptr<TPCTransactionContext> begin(const std::string& xid) { - auto_ptr<TxContext> tx(new TxContext(xid)); - log(Msg() << "<begin tx " << tx->id << ">"); - return auto_ptr<TPCTransactionContext>(tx); - } - - string getContent(const intrusive_ptr<PersistableMessage>& msg) { - intrusive_ptr<broker::Message::Encoding> enc( - dynamic_pointer_cast<broker::Message::Encoding>(msg)); - return enc->getContent(); - } - - void enqueue(TransactionContext* tx, - const boost::intrusive_ptr<PersistableMessage>& pmsg, - const PersistableQueue& queue) - { - ostringstream o; - string data = getContent(pmsg); - o << "<enqueue " << queue.getName() << " " << data; - if (tx) o << " tx=" << getId(*tx); - o << ">"; - log(o.str()); - - // Dump the message if there is a dump file. - if (dump.get()) { - *dump << "Message(" << data.size() << "): " << data << endl; - } - string logPrefix = "TestStore "+name+": "; - Action action(data); - bool doComplete = true; - if (action.index && action.executeIn(name)) { - switch (action.index) { - - case Action::THROW: - throw Exception(logPrefix + data); - break; - - case Action::DELAY: { - if (action.args.empty()) { - QPID_LOG(error, logPrefix << "async-id needs argument: " << data); - break; - } - asyncIds[action.args[0]] = pmsg; - QPID_LOG(debug, logPrefix << "delayed completion " << action.args[0]); - doComplete = false; - break; - } - - case Action::COMPLETE: { - if (action.args.empty()) { - QPID_LOG(error, logPrefix << "complete-id needs argument: " << data); - break; - } - AsyncIds::iterator i = asyncIds.find(action.args[0]); - if (i != asyncIds.end()) { - i->second->enqueueComplete(); - QPID_LOG(debug, logPrefix << "completed " << action.args[0]); - asyncIds.erase(i); - } else { - QPID_LOG(info, logPrefix << "not found for completion " << action.args[0]); - } - break; - } - - default: - QPID_LOG(error, logPrefix << "unknown action: " << data); - } - } - if (doComplete) pmsg->enqueueComplete(); - } - - void dequeue(TransactionContext* tx, - const boost::intrusive_ptr<PersistableMessage>& msg, - const PersistableQueue& queue) - { - QPID_LOG(debug, "TestStore dequeue " << queue.getName()); - ostringstream o; - o<< "<dequeue " << queue.getName() << " " << getContent(msg); - if (tx) o << " tx=" << getId(*tx); - o << ">"; - log(o.str()); - } - - void prepare(TPCTransactionContext& txn) { - log(Msg() << "<prepare tx=" << getId(txn) << ">"); - } - - void commit(TransactionContext& txn) { - log(Msg() << "<commit tx=" << getId(txn) << ">"); - } - - void abort(TransactionContext& txn) { - log(Msg() << "<abort tx=" << getId(txn) << ">"); - } - - - private: - typedef map<string, boost::intrusive_ptr<PersistableMessage> > AsyncIds; - - TestStoreOptions options; - string name; - Broker& broker; - vector<Thread> threads; - std::auto_ptr<ofstream> dump; - std::auto_ptr<ofstream> events; - AsyncIds asyncIds; -}; - -int TestStore::TxContext::nextId(1); - -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/qpid/cpp/src/tests/test_tools.h b/qpid/cpp/src/tests/test_tools.h deleted file mode 100644 index d006246299..0000000000 --- a/qpid/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 <vector> -#include <set> -#include <ostream> -#include <sstream> -#include <exception> -#include <stdexcept> - -// 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/qpid/cpp/src/tests/topictest b/qpid/cpp/src/tests/topictest deleted file mode 100755 index 13f38120b3..0000000000 --- a/qpid/cpp/src/tests/topictest +++ /dev/null @@ -1,61 +0,0 @@ -#!/usr/bin/env 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/qpid/cpp/src/tests/topictest.ps1 b/qpid/cpp/src/tests/topictest.ps1 deleted file mode 100644 index f15b2d452c..0000000000 --- a/qpid/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 .\qpid-topic-listener.exe - -function subscribe { - param ([int]$num, [string]$sub) - "Start subscriber $num" - $LOG = "subscriber_$num.log" - $cmdline = ".\$sub\qpid-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\qpid-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/qpid/cpp/src/tests/txjob.cpp b/qpid/cpp/src/tests/txjob.cpp deleted file mode 100644 index 29394c3415..0000000000 --- a/qpid/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 -{ - std::string workQueue; - std::string source; - std::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/qpid/cpp/src/tests/txshift.cpp b/qpid/cpp/src/tests/txshift.cpp deleted file mode 100644 index 6ec28c7233..0000000000 --- a/qpid/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 -{ - std::string workQueue; - uint 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 (uint 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/qpid/cpp/src/tests/unit_test.cpp b/qpid/cpp/src/tests/unit_test.cpp deleted file mode 100644 index 00c61242e4..0000000000 --- a/qpid/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/qpid/cpp/src/tests/unit_test.h b/qpid/cpp/src/tests/unit_test.h deleted file mode 100644 index a11df2ff04..0000000000 --- a/qpid/cpp/src/tests/unit_test.h +++ /dev/null @@ -1,74 +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_FIXTURE_TEST_CASE -# define QPID_FIXTURE_TEST_CASE(name, f) BOOST_FIXTURE_TEST_CASE(name, f) -#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/qpid/cpp/src/tests/windows/DisableWin32ErrorWindows.cpp b/qpid/cpp/src/tests/windows/DisableWin32ErrorWindows.cpp deleted file mode 100644 index 14f1e46606..0000000000 --- a/qpid/cpp/src/tests/windows/DisableWin32ErrorWindows.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. - * - */ - -// 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 qpid { -namespace tests { -namespace windows { - -// 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 |
