blob: b1d78e306d9b405cec463ca5913429347ff11b4d [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT 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 "CmsTemplateTest.h"
#include <activemq/cmsutil/DynamicDestinationResolver.h>
#include <activemq/cmsutil/ResourceLifecycleManager.h>
#include "DummyConnectionFactory.h"
#include "DummyMessageCreator.h"
using namespace activemq;
using namespace activemq::cmsutil;
////////////////////////////////////////////////////////////////////////////////
void CmsTemplateTest::setUp() {
cf = new DummyConnectionFactory();
cmsTemplate = new CmsTemplate(cf);
cmsTemplate->setDefaultDestinationName("test");
}
////////////////////////////////////////////////////////////////////////////////
void CmsTemplateTest::tearDown() {
delete cmsTemplate;
delete cf;
}
////////////////////////////////////////////////////////////////////////////////
void CmsTemplateTest::testExecuteSession() {
try {
cmsTemplate->setSessionAcknowledgeMode(cms::Session::CLIENT_ACKNOWLEDGE);
// Test basics.
MySessionCallback sessionCallback;
cmsTemplate->execute(&sessionCallback);
CPPUNIT_ASSERT(sessionCallback.session != NULL);
CPPUNIT_ASSERT(sessionCallback.ackMode == cms::Session::CLIENT_ACKNOWLEDGE);
// Try again and make sure we get the same session
MySessionCallback sessionCallback2;
cmsTemplate->execute(&sessionCallback2);
CPPUNIT_ASSERT(sessionCallback2.session == sessionCallback.session);
CPPUNIT_ASSERT(sessionCallback2.ackMode == cms::Session::CLIENT_ACKNOWLEDGE);
// Now try different ack mode and make sure we have a different session.
cmsTemplate->setSessionAcknowledgeMode(cms::Session::AUTO_ACKNOWLEDGE);
MySessionCallback sessionCallback3;
cmsTemplate->execute(&sessionCallback3);
CPPUNIT_ASSERT(sessionCallback3.session != NULL);
CPPUNIT_ASSERT(sessionCallback3.session != sessionCallback.session);
CPPUNIT_ASSERT(sessionCallback3.ackMode == cms::Session::AUTO_ACKNOWLEDGE);
} catch( cms::CMSException& e) {
e.printStackTrace();
}
}
////////////////////////////////////////////////////////////////////////////////
void CmsTemplateTest::testExecuteProducer() {
try {
cmsTemplate->setPubSubDomain(false);
// Test basics.
MyProducerCallback callback;
cmsTemplate->execute(&callback);
CPPUNIT_ASSERT(callback.session != NULL);
CPPUNIT_ASSERT(callback.producer != NULL);
// Try again and make sure we have the same producer
MyProducerCallback callback2;
cmsTemplate->execute(&callback2);
CPPUNIT_ASSERT(callback2.session == callback.session);
CPPUNIT_ASSERT(callback2.producer == callback.producer);
// Change to topics and make sure it's a different producer.
cmsTemplate->setPubSubDomain(true);
MyProducerCallback callback3;
cmsTemplate->execute(&callback3);
CPPUNIT_ASSERT(callback3.session == callback.session);
CPPUNIT_ASSERT(callback3.producer != callback.producer);
// Now change destination name and make sure it's different yet again.
cmsTemplate->setDefaultDestinationName("fred");
MyProducerCallback callback4;
cmsTemplate->execute(&callback4);
CPPUNIT_ASSERT(callback4.session == callback.session);
CPPUNIT_ASSERT(callback4.producer != callback3.producer);
// Now try without a valid default destination and make sure
// we get an exception.
try {
cmsTemplate->setDefaultDestinationName("");
MyProducerCallback callback5;
cmsTemplate->execute(&callback5);
CPPUNIT_FAIL("failed to throw expected exception");
} catch( cms::CMSException& ex) {
// expected.
}
// Now try an explicit destination
MyProducerCallback callback6;
activemq::commands::ActiveMQTopic myTopic("anothertopic");
cmsTemplate->execute(&myTopic, &callback6);
CPPUNIT_ASSERT(callback6.session != NULL);
// Now try an explicitly named destination
MyProducerCallback callback7;
cmsTemplate->execute("fred", &callback7);
CPPUNIT_ASSERT(callback7.session == callback6.session);
CPPUNIT_ASSERT(callback7.producer != callback6.producer);
} catch( cms::CMSException& e) {
e.printStackTrace();
}
}
////////////////////////////////////////////////////////////////////////////////
void CmsTemplateTest::testSend() {
try {
MessageContext* messageContext = cf->getMessageContext();
MySendListener listener;
messageContext->setSendListener(&listener);
DummyMessageCreator msgCreator;
// First, test basics.
cmsTemplate->send(&msgCreator);
const cms::Queue* q = dynamic_cast<const cms::Queue*>(listener.dest);
CPPUNIT_ASSERT(q != NULL);
CPPUNIT_ASSERT_EQUAL((std::string)"test", q->getQueueName());
CPPUNIT_ASSERT(listener.message != NULL);
CPPUNIT_ASSERT_EQUAL(4, listener.priority);
CPPUNIT_ASSERT_EQUAL(0LL, listener.ttl);
CPPUNIT_ASSERT_EQUAL(1, listener.deliveryMode);
// Now change the defaults and verify that they did not change
// the values (explicit qos not enabled). Also, change to using topics.
cmsTemplate->setPubSubDomain(true);
cmsTemplate->setPriority(5);
cmsTemplate->setDeliveryMode(cms::DeliveryMode::NON_PERSISTENT);
cmsTemplate->setTimeToLive(10LL);
cmsTemplate->setDefaultDestinationName("bob");
cmsTemplate->setDeliveryMode(0);
cmsTemplate->send(&msgCreator);
const cms::Topic* t = dynamic_cast<const cms::Topic*>(listener.dest);
CPPUNIT_ASSERT(t != NULL);
CPPUNIT_ASSERT_EQUAL((std::string)"bob", t->getTopicName());
CPPUNIT_ASSERT(listener.message != NULL);
CPPUNIT_ASSERT_EQUAL(4, listener.priority);
CPPUNIT_ASSERT_EQUAL(0LL, listener.ttl);
CPPUNIT_ASSERT_EQUAL(1, listener.deliveryMode);
// Now enable explicit quality of service and verify that the new default
// values are used.
cmsTemplate->setExplicitQosEnabled(true);
cmsTemplate->send(&msgCreator);
t = dynamic_cast<const cms::Topic*>(listener.dest);
CPPUNIT_ASSERT(t != NULL);
CPPUNIT_ASSERT_EQUAL((std::string)"bob", t->getTopicName());
CPPUNIT_ASSERT(listener.message != NULL);
CPPUNIT_ASSERT_EQUAL(5, listener.priority);
CPPUNIT_ASSERT_EQUAL(10LL, listener.ttl);
CPPUNIT_ASSERT_EQUAL(0, listener.deliveryMode);
// Now try the version of send with an explicit destination.
activemq::commands::ActiveMQTopic myTopic("anothertopic");
cmsTemplate->send(&myTopic, &msgCreator);
t = dynamic_cast<const cms::Topic*>(listener.dest);
CPPUNIT_ASSERT(t == &myTopic);
// Now try the version of send with just a named destination.
cmsTemplate->send("yetanothertopic", &msgCreator);
t = dynamic_cast<const cms::Topic*>(listener.dest);
CPPUNIT_ASSERT(t != NULL);
CPPUNIT_ASSERT_EQUAL((std::string)"yetanothertopic", t->getTopicName());
} catch( cms::CMSException& e) {
e.printStackTrace();
}
}
////////////////////////////////////////////////////////////////////////////////
void CmsTemplateTest::testReceive() {
try {
MessageContext* messageContext = cf->getMessageContext();
MySendListener listener;
messageContext->setSendListener(&listener);
// First, test basics.
cms::Message* message = cmsTemplate->receive();
CPPUNIT_ASSERT( message != NULL );
const cms::Queue* q = dynamic_cast<const cms::Queue*>(listener.dest);
CPPUNIT_ASSERT(q != NULL);
CPPUNIT_ASSERT_EQUAL((std::string)"test", q->getQueueName());
CPPUNIT_ASSERT(listener.selector == "" );
CPPUNIT_ASSERT_EQUAL(cmsTemplate->isNoLocal(), listener.noLocal);
CPPUNIT_ASSERT_EQUAL(cmsTemplate->getReceiveTimeout(), listener.timeout);
delete message;
// Now change the destination type and verify that it changes.
cmsTemplate->setPubSubDomain(true);
message = cmsTemplate->receive();
CPPUNIT_ASSERT( message != NULL );
const cms::Topic* t = dynamic_cast<const cms::Topic*>(listener.dest);
CPPUNIT_ASSERT(t != NULL);
CPPUNIT_ASSERT_EQUAL((std::string)"test", t->getTopicName());
delete message;
// Now change the destination name and verify that it changes.
cmsTemplate->setDefaultDestinationName("bob");
message = cmsTemplate->receive();
CPPUNIT_ASSERT( message != NULL );
t = dynamic_cast<const cms::Topic*>(listener.dest);
CPPUNIT_ASSERT(t != NULL);
CPPUNIT_ASSERT_EQUAL((std::string)"bob", t->getTopicName());
delete message;
// Now change the timeout and verify that it changes.
cmsTemplate->setReceiveTimeout(1000);
message = cmsTemplate->receive();
CPPUNIT_ASSERT( message != NULL );
CPPUNIT_ASSERT_EQUAL(cmsTemplate->getReceiveTimeout(), listener.timeout);
delete message;
// Now change the noLocal flag and verify that it changes.
cmsTemplate->setNoLocal(true);
message = cmsTemplate->receive();
CPPUNIT_ASSERT( message != NULL );
CPPUNIT_ASSERT_EQUAL(cmsTemplate->isNoLocal(), listener.noLocal);
delete message;
// Now try a failure.
try {
FailSendListener failListener;
messageContext->setSendListener(&failListener);
// First, test basics.
cmsTemplate->receive();
CPPUNIT_FAIL("failed to throw expected exception");
} catch( cms::CMSException& e) {
// Expected
}
} catch( cms::CMSException& e) {
e.printStackTrace();
}
}
////////////////////////////////////////////////////////////////////////////////
void CmsTemplateTest::testReceive_Destination() {
try {
MessageContext* messageContext = cf->getMessageContext();
MySendListener listener;
messageContext->setSendListener(&listener);
// First, test basics.
activemq::commands::ActiveMQTopic myTopic("anothertopic");
cms::Message* message = cmsTemplate->receive(&myTopic);
CPPUNIT_ASSERT( message != NULL );
CPPUNIT_ASSERT(&myTopic == listener.dest);
delete message;
// Now try a failure.
try {
FailSendListener failListener;
messageContext->setSendListener(&failListener);
// First, test basics.
cmsTemplate->receive(&myTopic);
CPPUNIT_FAIL("failed to throw expected exception");
} catch( cms::CMSException& e) {
// Expected
}
} catch( cms::CMSException& e) {
e.printStackTrace();
}
}
////////////////////////////////////////////////////////////////////////////////
void CmsTemplateTest::testReceive_DestinationName() {
try {
MessageContext* messageContext = cf->getMessageContext();
MySendListener listener;
messageContext->setSendListener(&listener);
// First, test basics.
std::string destName = "bob";
cms::Message* message = cmsTemplate->receive(destName);
CPPUNIT_ASSERT( message != NULL );
const cms::Queue* q = dynamic_cast<const cms::Queue*>(listener.dest);
CPPUNIT_ASSERT(q != NULL);
CPPUNIT_ASSERT_EQUAL((std::string)"bob", q->getQueueName());
delete message;
// Now try a failure.
try {
FailSendListener failListener;
messageContext->setSendListener(&failListener);
// First, test basics.
cmsTemplate->receive(destName);
CPPUNIT_FAIL("failed to throw expected exception");
} catch( cms::CMSException& e) {
// Expected
}
} catch( cms::CMSException& e) {
e.printStackTrace();
}
}
////////////////////////////////////////////////////////////////////////////////
void CmsTemplateTest::testReceiveSelected() {
try {
MessageContext* messageContext = cf->getMessageContext();
MySendListener listener;
messageContext->setSendListener(&listener);
// First, test basics.
std::string selector = "yadda";
cms::Message* message = cmsTemplate->receiveSelected(selector);
CPPUNIT_ASSERT( message != NULL );
const cms::Queue* q = dynamic_cast<const cms::Queue*>(listener.dest);
CPPUNIT_ASSERT(q != NULL);
CPPUNIT_ASSERT_EQUAL((std::string)"test", q->getQueueName());
CPPUNIT_ASSERT_EQUAL(cmsTemplate->isNoLocal(), listener.noLocal);
CPPUNIT_ASSERT_EQUAL(cmsTemplate->getReceiveTimeout(), listener.timeout);
CPPUNIT_ASSERT_EQUAL(selector, listener.selector);
delete message;
// Now change the destination type and verify that it changes.
selector = "blah";
cmsTemplate->setPubSubDomain(true);
message = cmsTemplate->receiveSelected(selector);
CPPUNIT_ASSERT( message != NULL );
const cms::Topic* t = dynamic_cast<const cms::Topic*>(listener.dest);
CPPUNIT_ASSERT(t != NULL);
CPPUNIT_ASSERT_EQUAL((std::string)"test", t->getTopicName());
CPPUNIT_ASSERT_EQUAL(selector, listener.selector);
delete message;
// Now change the destination name and verify that it changes.
cmsTemplate->setDefaultDestinationName("bob");
message = cmsTemplate->receiveSelected(selector);
CPPUNIT_ASSERT( message != NULL );
t = dynamic_cast<const cms::Topic*>(listener.dest);
CPPUNIT_ASSERT(t != NULL);
CPPUNIT_ASSERT_EQUAL((std::string)"bob", t->getTopicName());
CPPUNIT_ASSERT_EQUAL(selector, listener.selector);
delete message;
// Now change the timeout and verify that it changes.
cmsTemplate->setReceiveTimeout(1000);
message = cmsTemplate->receiveSelected(selector);
CPPUNIT_ASSERT( message != NULL );
CPPUNIT_ASSERT_EQUAL(cmsTemplate->getReceiveTimeout(), listener.timeout);
CPPUNIT_ASSERT_EQUAL(selector, listener.selector);
delete message;
// Now change the noLocal flag and verify that it changes.
cmsTemplate->setNoLocal(true);
message = cmsTemplate->receiveSelected(selector);
CPPUNIT_ASSERT( message != NULL );
CPPUNIT_ASSERT_EQUAL(cmsTemplate->isNoLocal(), listener.noLocal);
CPPUNIT_ASSERT_EQUAL(selector, listener.selector);
delete message;
// Now try a failure.
try {
FailSendListener failListener;
messageContext->setSendListener(&failListener);
// First, test basics.
cmsTemplate->receiveSelected(selector);
CPPUNIT_FAIL("failed to throw expected exception");
} catch( cms::CMSException& e) {
// Expected
}
} catch( cms::CMSException& e) {
e.printStackTrace();
}
}
////////////////////////////////////////////////////////////////////////////////
void CmsTemplateTest::testReceiveSelected_Destination() {
try {
MessageContext* messageContext = cf->getMessageContext();
MySendListener listener;
messageContext->setSendListener(&listener);
// First, test basics.
std::string selector = "yadda";
activemq::commands::ActiveMQTopic myTopic("anothertopic");
cms::Message* message = cmsTemplate->receiveSelected(&myTopic, selector);
CPPUNIT_ASSERT( message != NULL );
CPPUNIT_ASSERT(&myTopic == listener.dest);
CPPUNIT_ASSERT_EQUAL(selector, listener.selector);
delete message;
// Now try a failure.
try {
FailSendListener failListener;
messageContext->setSendListener(&failListener);
// First, test basics.
cmsTemplate->receiveSelected(&myTopic, selector);
CPPUNIT_FAIL("failed to throw expected exception");
} catch( cms::CMSException& e) {
// Expected
}
} catch( cms::CMSException& e) {
e.printStackTrace();
}
}
////////////////////////////////////////////////////////////////////////////////
void CmsTemplateTest::testReceiveSelected_DestinationName() {
try {
MessageContext* messageContext = cf->getMessageContext();
MySendListener listener;
messageContext->setSendListener(&listener);
// First, test basics.
std::string selector = "yadda";
std::string destName = "bob";
cms::Message* message = cmsTemplate->receiveSelected(destName, selector);
CPPUNIT_ASSERT( message != NULL );
const cms::Queue* q = dynamic_cast<const cms::Queue*>(listener.dest);
CPPUNIT_ASSERT(q != NULL);
CPPUNIT_ASSERT_EQUAL((std::string)"bob", q->getQueueName());
CPPUNIT_ASSERT_EQUAL(selector, listener.selector);
delete message;
// Now try a failure.
try {
FailSendListener failListener;
messageContext->setSendListener(&failListener);
// First, test basics.
cmsTemplate->receiveSelected(destName, selector);
CPPUNIT_FAIL("failed to throw expected exception");
} catch( cms::CMSException& e) {
// Expected
}
} catch( cms::CMSException& e) {
e.printStackTrace();
}
}