summaryrefslogtreecommitdiff
path: root/cpp/src/tests
diff options
context:
space:
mode:
authorKenneth Anthony Giusti <kgiusti@apache.org>2011-01-18 14:51:31 +0000
committerKenneth Anthony Giusti <kgiusti@apache.org>2011-01-18 14:51:31 +0000
commit7db454bc1eae3744c676fe9e8ddd6e999cee13f1 (patch)
tree7f3261175f7ac13162a0a902474fe94216eb21e9 /cpp/src/tests
parent12ee5f96c705084ebc575c6396fd2d2a714176c1 (diff)
downloadqpid-python-7db454bc1eae3744c676fe9e8ddd6e999cee13f1.tar.gz
QPID-2997: remove oid disambiguation, re-order mgmt object status updates.
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@1060401 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src/tests')
-rw-r--r--cpp/src/tests/BrokerMgmtAgent.cpp146
1 files changed, 133 insertions, 13 deletions
diff --git a/cpp/src/tests/BrokerMgmtAgent.cpp b/cpp/src/tests/BrokerMgmtAgent.cpp
index 80bd590d7d..d0c6668b72 100644
--- a/cpp/src/tests/BrokerMgmtAgent.cpp
+++ b/cpp/src/tests/BrokerMgmtAgent.cpp
@@ -24,9 +24,13 @@
#include "qpid/management/Buffer.h"
#include "qpid/messaging/Message.h"
#include "qpid/amqp_0_10/Codecs.h"
+#include "qpid/log/Logger.h"
+#include "qpid/log/Options.h"
#include "qmf/org/apache/qpid/broker/mgmt/test/TestObject.h"
+#include <iomanip>
+
using qpid::management::Mutex;
using qpid::management::Manageable;
@@ -53,9 +57,10 @@ namespace qpid {
MessagingFixture *mFix;
public:
- AgentFixture( unsigned int pubInterval=10, bool qmfV2=false )
+ AgentFixture( unsigned int pubInterval=10,
+ bool qmfV2=false,
+ qpid::broker::Broker::Options opts = qpid::broker::Broker::Options())
{
- qpid::broker::Broker::Options opts = qpid::broker::Broker::Options();
opts.enableMgmt=true;
opts.qmf2Support=qmfV2;
opts.mgmtPubInterval=pubInterval;
@@ -99,12 +104,15 @@ namespace qpid {
class TestManageable : public qpid::management::Manageable
{
management::ManagementObject* mgmtObj;
+ const std::string key;
public:
- TestManageable(management::ManagementAgent *agent) {
+ TestManageable(management::ManagementAgent *agent, std::string _key)
+ : key(_key)
+ {
_qmf::TestObject *tmp = new _qmf::TestObject(agent, this);
// seed it with some default values...
- tmp->set_string1("This is a test string!");
+ tmp->set_string1(key);
tmp->set_bool1(true);
qpid::types::Variant::Map vMap;
vMap["one"] = qpid::types::Variant(1);
@@ -118,8 +126,8 @@ namespace qpid {
management::ManagementObject* GetManagementObject() const { return mgmtObj; };
static void validateTestObjectProperties(_qmf::TestObject& to)
{
- // verify the default values are as expected
- BOOST_CHECK(to.get_string1() == std::string("This is a test string!"));
+ // 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();
@@ -200,7 +208,7 @@ namespace qpid {
agent = fix->getBrokerAgent();
// create a manageable test object
- TestManageable *tm = new TestManageable(agent);
+ TestManageable *tm = new TestManageable(agent, std::string("obj1"));
uint32_t objLen = tm->GetManagementObject()->writePropertiesSize();
Receiver r1 = fix->createV1DataIndRcvr("org.apache.qpid.broker.mgmt.test", "#");
@@ -262,7 +270,7 @@ namespace qpid {
management::ManagementAgent* agent;
agent = fix->getBrokerAgent();
- TestManageable *tm = new TestManageable(agent);
+ TestManageable *tm = new TestManageable(agent, std::string("obj2"));
Receiver r1 = fix->createV2DataIndRcvr(tm->GetManagementObject()->getPackageName(), "#");
@@ -326,7 +334,7 @@ namespace qpid {
agent = fix->getBrokerAgent();
// create a manageable test object
- TestManageable *tm = new TestManageable(agent);
+ TestManageable *tm = new TestManageable(agent, std::string("myObj"));
uint32_t objLen = tm->GetManagementObject()->writePropertiesSize();
Receiver r1 = fix->createV1DataIndRcvr("org.apache.qpid.broker.mgmt.test", "#");
@@ -390,7 +398,7 @@ namespace qpid {
agent = fix->getBrokerAgent();
// create a manageable test object
- TestManageable *tm = new TestManageable(agent);
+ TestManageable *tm = new TestManageable(agent, std::string("anObj"));
uint32_t objLen = tm->GetManagementObject()->writePropertiesSize();
Receiver r1 = fix->createV1DataIndRcvr("org.apache.qpid.broker.mgmt.test", "#");
@@ -465,7 +473,7 @@ namespace qpid {
agent = fix->getBrokerAgent();
// create a manageable test object
- TestManageable *tm = new TestManageable(agent);
+ TestManageable *tm = new TestManageable(agent, std::string("objectifyMe"));
// add, then immediately delete and export the object...
@@ -496,7 +504,13 @@ namespace qpid {
uint32_t objLen;
for (size_t i = 0; i < objCount; i++) {
- TestManageable *tm = new TestManageable(agent);
+ std::stringstream key;
+ key << "testobj-" << std::setfill('x') << std::setw(4) << i;
+ // (no, seriously, I didn't just do that.)
+ // Note well: we have to keep the key string length EXACTLY THE SAME
+ // FOR ALL OBJECTS, so objLen will be the same. Otherwise the
+ // decodeV1ObjectUpdates() will fail (v1 lacks explict encoded length).
+ TestManageable *tm = new TestManageable(agent, key.str());
objLen = tm->GetManagementObject()->writePropertiesSize();
agent->addObject(tm->GetManagementObject(), i + 1);
tmv.push_back(tm);
@@ -590,7 +604,7 @@ namespace qpid {
for (size_t i = 0; i < objCount; i++) {
std::stringstream key;
key << "testobj-" << i;
- TestManageable *tm = new TestManageable(agent);
+ TestManageable *tm = new TestManageable(agent, key.str());
objLen = tm->GetManagementObject()->writePropertiesSize();
agent->addObject(tm->GetManagementObject(), key.str());
tmv.push_back(tm);
@@ -665,6 +679,112 @@ namespace qpid {
delete fix;
}
+ // See QPID-2997
+ QPID_AUTO_TEST_CASE(v2RapidRestoreObj)
+ {
+ AgentFixture* fix = new AgentFixture(3, true);
+ management::ManagementAgent* agent;
+ agent = fix->getBrokerAgent();
+
+ // two objects, same ObjID
+ TestManageable *tm1 = new TestManageable(agent, std::string("obj2"));
+ TestManageable *tm2 = new TestManageable(agent, std::string("obj2"));
+
+ Receiver r1 = fix->createV2DataIndRcvr(tm1->GetManagementObject()->getPackageName(), "#");
+
+ // add, then immediately delete and re-add a copy of the object
+ agent->addObject(tm1->GetManagementObject(), "testobj-1");
+ tm1->GetManagementObject()->resourceDestroy();
+ agent->addObject(tm2->GetManagementObject(), "testobj-1");
+
+ // expect: a delete notification, then an update notification
+ TestObjectVector objs;
+ bool isDeleted = false;
+ bool isAdvertised = false;
+ size_t count = 0;
+ Message m1;
+ while (r1.fetch(m1, Duration::SECOND * 6)) {
+
+ decodeV2ObjectUpdates(m1, objs);
+ BOOST_CHECK(objs.size() > 0);
+
+ for (TestObjectVector::iterator oIter = objs.begin(); oIter != objs.end(); oIter++) {
+ count++;
+ TestManageable::validateTestObjectProperties(**oIter);
+
+ qpid::types::Variant::Map mappy;
+ (*oIter)->writeTimestamps(mappy);
+ if (mappy["_delete_ts"].asUint64() != 0) {
+ isDeleted = true;
+ BOOST_CHECK(isAdvertised == false); // delete must be first
+ } else {
+ isAdvertised = true;
+ BOOST_CHECK(isDeleted == true); // delete must be first
+ }
+ }
+ }
+
+ BOOST_CHECK(isDeleted);
+ BOOST_CHECK(isAdvertised);
+ BOOST_CHECK(count == 2);
+
+ r1.close();
+ delete fix;
+ delete tm1;
+ delete tm2;
+ }
+
+ // See QPID-2997
+ QPID_AUTO_TEST_CASE(v2DuplicateErrorObj)
+ {
+ AgentFixture* fix = new AgentFixture(3, true);
+ management::ManagementAgent* agent;
+ agent = fix->getBrokerAgent();
+
+ // turn off the expected error log message
+ qpid::log::Options logOpts;
+ logOpts.selectors.clear();
+ logOpts.selectors.push_back("critical+");
+ qpid::log::Logger::instance().configure(logOpts);
+
+ // two objects, same ObjID
+ TestManageable *tm1 = new TestManageable(agent, std::string("obj2"));
+ TestManageable *tm2 = new TestManageable(agent, std::string("obj2"));
+ // Keep a pointer to the ManagementObject. This test simulates a user-caused error
+ // case (duplicate objects) where the broker has no choice but to leak a management
+ // object (safest assumption). To prevent valgrind from flagging this leak, we
+ // manually clean up the object at the end of the test.
+ management::ManagementObject *save = tm2->GetManagementObject();
+
+ Receiver r1 = fix->createV2DataIndRcvr(tm1->GetManagementObject()->getPackageName(), "#");
+
+ // add, then immediately delete and re-add a copy of the object
+ agent->addObject(tm1->GetManagementObject(), "testobj-1");
+ agent->addObject(tm2->GetManagementObject(), "testobj-1");
+
+ TestObjectVector objs;
+ size_t count = 0;
+ Message m1;
+ while (r1.fetch(m1, Duration::SECOND * 6)) {
+
+ decodeV2ObjectUpdates(m1, objs);
+ BOOST_CHECK(objs.size() > 0);
+
+ for (TestObjectVector::iterator oIter = objs.begin(); oIter != objs.end(); oIter++) {
+ count++;
+ TestManageable::validateTestObjectProperties(**oIter);
+ }
+ }
+
+ BOOST_CHECK(count == 1); // only one should be accepted.
+
+ r1.close();
+ delete fix;
+ delete tm1;
+ delete tm2;
+ delete save;
+ }
+
QPID_AUTO_TEST_SUITE_END()
}
}