/*
* Copyright 2002-2007 the original author or authors.
*
* 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.
*/
package org.springframework.jms.core;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueReceiver;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;
import javax.jms.TopicConnection;
import javax.jms.TopicConnectionFactory;
import javax.jms.TopicPublisher;
import javax.jms.TopicSession;
import javax.jms.TopicSubscriber;
import javax.naming.Context;
import javax.naming.NamingException;
import junit.framework.TestCase;
import org.easymock.MockControl;
import org.springframework.jms.InvalidClientIDException;
import org.springframework.jms.InvalidDestinationException;
import org.springframework.jms.InvalidSelectorException;
import org.springframework.jms.JmsException;
import org.springframework.jms.JmsSecurityException;
import org.springframework.jms.MessageEOFException;
import org.springframework.jms.MessageFormatException;
import org.springframework.jms.MessageNotReadableException;
import org.springframework.jms.MessageNotWriteableException;
import org.springframework.jms.ResourceAllocationException;
import org.springframework.jms.TransactionInProgressException;
import org.springframework.jms.TransactionRolledBackException;
import org.springframework.jms.UncategorizedJmsException;
import org.springframework.jms.support.converter.SimpleMessageConverter;
import org.springframework.jms.support.destination.JndiDestinationResolver;
import org.springframework.jndi.JndiTemplate;
/**
* Unit tests for the JmsTemplate implemented using JMS 1.0.2.
*
* @author Andre Biryukov
* @author Mark Pollack
*/
public class JmsTemplate102Tests extends TestCase {
private Context mockJndiContext;
private MockControl mockJndiControl;
private MockControl queueConnectionFactoryControl;
private QueueConnectionFactory mockQueueConnectionFactory;
private MockControl queueConnectionControl;
private QueueConnection mockQueueConnection;
private MockControl queueSessionControl;
private QueueSession mockQueueSession;
private MockControl queueControl;
private Queue mockQueue;
private MockControl topicConnectionFactoryControl;
private TopicConnectionFactory mockTopicConnectionFactory;
private MockControl topicConnectionControl;
private TopicConnection mockTopicConnection;
private MockControl topicSessionControl;
private TopicSession mockTopicSession;
private MockControl topicControl;
private Topic mockTopic;
private int deliveryMode = DeliveryMode.PERSISTENT;
private int priority = 9;
private int timeToLive = 10000;
/**
* Create the mock objects for testing.
*/
protected void setUp() throws Exception {
mockJndiControl = MockControl.createControl(Context.class);
mockJndiContext = (Context) this.mockJndiControl.getMock();
createMockForQueues();
createMockForTopics();
mockJndiContext.close();
mockJndiControl.replay();
}
private void createMockForTopics() throws JMSException, NamingException {
topicConnectionFactoryControl = MockControl.createControl(TopicConnectionFactory.class);
mockTopicConnectionFactory = (TopicConnectionFactory) topicConnectionFactoryControl.getMock();
topicConnectionControl = MockControl.createControl(TopicConnection.class);
mockTopicConnection = (TopicConnection) topicConnectionControl.getMock();
topicControl = MockControl.createControl(Topic.class);
mockTopic = (Topic) topicControl.getMock();
topicSessionControl = MockControl.createControl(TopicSession.class);
mockTopicSession = (TopicSession) topicSessionControl.getMock();
mockTopicConnectionFactory.createTopicConnection();
topicConnectionFactoryControl.setReturnValue(mockTopicConnection);
topicConnectionFactoryControl.replay();
mockTopicConnection.createTopicSession(useTransactedTemplate(), Session.AUTO_ACKNOWLEDGE);
topicConnectionControl.setReturnValue(mockTopicSession);
mockTopicSession.getTransacted();
topicSessionControl.setReturnValue(useTransactedSession());
mockJndiContext.lookup("testTopic");
mockJndiControl.setReturnValue(mockTopic);
}
private void createMockForQueues() throws JMSException, NamingException {
queueConnectionFactoryControl = MockControl.createControl(QueueConnectionFactory.class);
mockQueueConnectionFactory = (QueueConnectionFactory) queueConnectionFactoryControl.getMock();
queueConnectionControl = MockControl.createControl(QueueConnection.class);
mockQueueConnection = (QueueConnection) queueConnectionControl.getMock();
queueControl = MockControl.createControl(Queue.class);
mockQueue = (Queue) queueControl.getMock();
queueSessionControl = MockControl.createControl(QueueSession.class);
mockQueueSession = (QueueSession) queueSessionControl.getMock();
mockQueueConnectionFactory.createQueueConnection();
queueConnectionFactoryControl.setReturnValue(mockQueueConnection);
queueConnectionFactoryControl.replay();
mockQueueConnection.createQueueSession(useTransactedTemplate(), Session.AUTO_ACKNOWLEDGE);
queueConnectionControl.setReturnValue(mockQueueSession);
mockQueueSession.getTransacted();
queueSessionControl.setReturnValue(useTransactedSession());
mockJndiContext.lookup("testQueue");
mockJndiControl.setReturnValue(mockQueue);
}
private JmsTemplate102 createTemplate() {
JmsTemplate102 template = new JmsTemplate102();
JndiDestinationResolver destMan = new JndiDestinationResolver();
destMan.setJndiTemplate(new JndiTemplate() {
protected Context createInitialContext() {
return mockJndiContext;
}
});
template.setDestinationResolver(destMan);
template.setSessionTransacted(useTransactedTemplate());
return template;
}
protected boolean useTransactedSession() {
return false;
}
protected boolean useTransactedTemplate() {
return false;
}
public void testTopicSessionCallback() throws Exception {
JmsTemplate102 template = createTemplate();
template.setPubSubDomain(true);
template.setConnectionFactory(mockTopicConnectionFactory);
template.afterPropertiesSet();
mockTopicSession.close();
topicSessionControl.setVoidCallable(1);
mockTopicConnection.close();
topicConnectionControl.setVoidCallable(1);
topicSessionControl.replay();
topicConnectionControl.replay();
template.execute(new SessionCallback() {
public Object doInJms(Session session) throws JMSException {
boolean b = session.getTransacted();
return null;
}
});
topicConnectionFactoryControl.verify();
topicConnectionControl.verify();
topicSessionControl.verify();
}
/**
* Test the execute(ProducerCallback) using a topic.
*/
public void testTopicProducerCallback() throws Exception {
JmsTemplate102 template = createTemplate();
template.setPubSubDomain(true);
template.setConnectionFactory(mockTopicConnectionFactory);
template.afterPropertiesSet();
MockControl topicPublisherControl = MockControl.createControl(TopicPublisher.class);
TopicPublisher mockTopicPublisher = (TopicPublisher) topicPublisherControl.getMock();
mockTopicSession.createPublisher(null);
topicSessionControl.setReturnValue(mockTopicPublisher);
mockTopicPublisher.getPriority();
topicPublisherControl.setReturnValue(4);
mockTopicPublisher.close();
topicPublisherControl.setVoidCallable(1);
mockTopicSession.close();
topicSessionControl.setVoidCallable(1);
mockTopicConnection.close();
topicConnectionControl.setVoidCallable(1);
topicPublisherControl.replay();
topicSessionControl.replay();
topicConnectionControl.replay();
template.execute(new ProducerCallback() {
public Object doInJms(Session session, MessageProducer producer) throws JMSException {
boolean b = session.getTransacted();
int i = producer.getPriority();
return null;
}
});
topicConnectionFactoryControl.verify();
topicConnectionControl.verify();
topicSessionControl.verify();
}
/**
* Test the execute(ProducerCallback) using a topic.
*/
public void testTopicProducerCallbackWithIdAndTimestampDisabled() throws Exception {
JmsTemplate102 template = createTemplate();
template.setPubSubDomain(true);
template.setConnectionFactory(mockTopicConnectionFactory);
template.setMessageIdEnabled(false);
template.setMessageTimestampEnabled(false);
template.afterPropertiesSet();
MockControl topicPublisherControl = MockControl.createControl(TopicPublisher.class);
TopicPublisher mockTopicPublisher = (TopicPublisher) topicPublisherControl.getMock();
mockTopicSession.createPublisher(null);
topicSessionControl.setReturnValue(mockTopicPublisher);
mockTopicPublisher.setDisableMessageID(true);
topicPublisherControl.setVoidCallable(1);
mockTopicPublisher.setDisableMessageTimestamp(true);
topicPublisherControl.setVoidCallable(1);
mockTopicPublisher.getPriority();
topicPublisherControl.setReturnValue(4);
mockTopicPublisher.close();
topicPublisherControl.setVoidCallable(1);
mockTopicSession.close();
topicSessionControl.setVoidCallable(1);
mockTopicConnection.close();
topicConnectionControl.setVoidCallable(1);
topicPublisherControl.replay();
topicSessionControl.replay();
topicConnectionControl.replay();
template.execute(new ProducerCallback() {
public Object doInJms(Session session, MessageProducer producer) throws JMSException {
boolean b = session.getTransacted();
int i = producer.getPriority();
return null;
}
});
topicConnectionFactoryControl.verify();
topicConnectionControl.verify();
topicSessionControl.verify();
}
/**
* Test the method execute(SessionCallback action) with using the
* point to point domain as specified by the value of isPubSubDomain = false.
*/
public void testQueueSessionCallback() throws Exception {
JmsTemplate102 template = createTemplate();
// Point-to-Point (queues) are the default domain
template.setConnectionFactory(mockQueueConnectionFactory);
template.afterPropertiesSet();
mockQueueSession.close();
queueSessionControl.setVoidCallable(1);
mockQueueConnection.close();
queueConnectionControl.setVoidCallable(1);
queueSessionControl.replay();
queueConnectionControl.replay();
template.execute(new SessionCallback() {
public Object doInJms(Session session) throws JMSException {
boolean b = session.getTransacted();
return null;
}
});
queueConnectionFactoryControl.verify();
queueConnectionControl.verify();
queueSessionControl.verify();
}
/**
* Test the method execute(ProducerCallback) with a Queue.
*/
public void testQueueProducerCallback() throws Exception {
JmsTemplate102 template = createTemplate();
// Point-to-Point (queues) are the default domain.
template.setConnectionFactory(mockQueueConnectionFactory);
template.afterPropertiesSet();
MockControl queueSenderControl = MockControl.createControl(QueueSender.class);
QueueSender mockQueueSender = (QueueSender) queueSenderControl.getMock();
mockQueueSession.createSender(null);
queueSessionControl.setReturnValue(mockQueueSender);
mockQueueSender.getPriority();
queueSenderControl.setReturnValue(4);
mockQueueSender.close();
queueSenderControl.setVoidCallable(1);
mockQueueSession.close();
queueSessionControl.setVoidCallable(1);
mockQueueConnection.close();
queueConnectionControl.setVoidCallable(1);
queueSenderControl.replay();
queueSessionControl.replay();
queueConnectionControl.replay();
template.execute(new ProducerCallback() {
public Object doInJms(Session session, MessageProducer producer)
throws JMSException {
boolean b = session.getTransacted();
int i = producer.getPriority();
return null;
}
});
queueConnectionFactoryControl.verify();
queueConnectionControl.verify();
queueSessionControl.verify();
}
public void testQueueProducerCallbackWithIdAndTimestampDisabled() throws Exception {
JmsTemplate102 template = createTemplate();
// Point-to-Point (queues) are the default domain.
template.setConnectionFactory(mockQueueConnectionFactory);
template.setMessageIdEnabled(false);
template.setMessageTimestampEnabled(false);
template.afterPropertiesSet();
MockControl queueSenderControl = MockControl.createControl(QueueSender.class);
QueueSender mockQueueSender = (QueueSender) queueSenderControl.getMock();
mockQueueSession.createSender(null);
queueSessionControl.setReturnValue(mockQueueSender);
mockQueueSender.setDisableMessageID(true);
queueSenderControl.setVoidCallable(1);
mockQueueSender.setDisableMessageTimestamp(true);
queueSenderControl.setVoidCallable(1);
mockQueueSender.getPriority();
queueSenderControl.setReturnValue(4);
mockQueueSender.close();
queueSenderControl.setVoidCallable(1);
mockQueueSession.close();
queueSessionControl.setVoidCallable(1);
mockQueueConnection.close();
queueConnectionControl.setVoidCallable(1);
queueSenderControl.replay();
queueSessionControl.replay();
queueConnectionControl.replay();
template.execute(new ProducerCallback() {
public Object doInJms(Session session, MessageProducer producer) throws JMSException {
boolean b = session.getTransacted();
int i = producer.getPriority();
return null;
}
});
queueConnectionFactoryControl.verify();
queueConnectionControl.verify();
queueSessionControl.verify();
}
/**
* Test the setting of the JmsTemplate properties.
*/
public void testBeanProperties() throws Exception {
JmsTemplate102 template = createTemplate();
template.setConnectionFactory(mockQueueConnectionFactory);
assertTrue("connection factory ok", template.getConnectionFactory() == mockQueueConnectionFactory);
JmsTemplate102 s102 = createTemplate();
try {
s102.afterPropertiesSet();
fail("IllegalArgumentException not thrown. ConnectionFactory should be set");
}
catch (IllegalArgumentException ex) {
// expected
}
// The default is for the JmsTemplate102 to send to queues.
// Test to make sure exeception is thrown and has reasonable message.
s102 = createTemplate();
s102.setConnectionFactory(mockTopicConnectionFactory);
try {
s102.afterPropertiesSet();
fail("IllegalArgumentException not thrown. Mismatch of Destination and ConnectionFactory types.");
}
catch (IllegalArgumentException ex) {
// expected
}
s102 = createTemplate();
s102.setConnectionFactory(mockQueueConnectionFactory);
s102.setPubSubDomain(true);
try {
s102.afterPropertiesSet();
fail("IllegalArgumentException not thrown. Mismatch of Destination and ConnectionFactory types.");
}
catch (IllegalArgumentException ex) {
// expected
}
}
/**
* Test the method send(String destination, MessgaeCreator c) using
* a queue and default QOS values.
*/
public void testSendStringQueue() throws Exception {
sendQueue(true, false, false, true);
}
/**
* Test the method send(String destination, MessageCreator c) when
* explicit QOS parameters are enabled, using a queue.
*/
public void testSendStringQueueWithQOS() throws Exception {
sendQueue(false, false, false, false);
}
/**
* Test the method send(MessageCreator c) using default QOS values.
*/
public void testSendDefaultDestinationQueue() throws Exception {
sendQueue(true, false, true, true);
}
/**
* Test the method send(MessageCreator c) using explicit QOS values.
*/
public void testSendDefaultDestinationQueueWithQOS() throws Exception {
sendQueue(false, false, true, false);
}
/**
* Test the method send(String destination, MessageCreator c) using
* a topic and default QOS values.
*/
public void testSendStringTopic() throws Exception {
sendTopic(true, false);
}
/**
* Test the method send(String destination, MessageCreator c) using explicit
* QOS values.
*/
public void testSendStringTopicWithQOS() throws Exception {
sendTopic(false, false);
}
/**
* Test the method send(Destination queue, MessgaeCreator c) using
* a queue and default QOS values.
*/
public void testSendQueue() throws Exception {
sendQueue(true, false, false, true);
}
/**
* Test the method send(Destination queue, MessageCreator c) sing explicit
* QOS values.
*/
public void testSendQueueWithQOS() throws Exception {
sendQueue(false, false, false, false);
}
/**
* Test the method send(Destination queue, MessgaeCreator c) using
* a topic and default QOS values.
*/
public void testSendTopic() throws Exception {
sendTopic(true, false);
}
/**
* Test the method send(Destination queue, MessageCreator c) using explicity
* QOS values.
*/
public void testSendTopicWithQOS() throws Exception {
sendQueue(false, false, false, true);
}
/**
* Common method for testing a send method that uses the MessageCreator
* callback but with different QOS options.
*/
private void sendQueue(
boolean ignoreQOS, boolean explicitQueue, boolean useDefaultDestination, boolean disableIdAndTimestamp)
throws Exception {
JmsTemplate102 template = createTemplate();
template.setConnectionFactory(mockQueueConnectionFactory);
template.afterPropertiesSet();
if (useDefaultDestination) {
template.setDefaultDestination(mockQueue);
}
if (disableIdAndTimestamp) {
template.setMessageIdEnabled(false);
template.setMessageTimestampEnabled(false);
}
MockControl queueSenderControl = MockControl.createControl(QueueSender.class);
QueueSender mockQueueSender = (QueueSender) queueSenderControl.getMock();
MockControl messageControl = MockControl.createControl(TextMessage.class);
TextMessage mockMessage = (TextMessage) messageControl.getMock();
if (disableIdAndTimestamp) {
mockQueueSender.setDisableMessageID(true);
queueSenderControl.setVoidCallable(1);
mockQueueSender.setDisableMessageTimestamp(true);
queueSenderControl.setVoidCallable(1);
}
mockQueueSession.createSender(this.mockQueue);
queueSessionControl.setReturnValue(mockQueueSender);
mockQueueSession.createTextMessage("just testing");
queueSessionControl.setReturnValue(mockMessage);
if (useTransactedTemplate()) {
mockQueueSession.commit();
queueSessionControl.setVoidCallable(1);
}
if (ignoreQOS) {
mockQueueSender.send(mockMessage);
}
else {
template.setExplicitQosEnabled(true);
template.setDeliveryMode(deliveryMode);
template.setPriority(priority);
template.setTimeToLive(timeToLive);
mockQueueSender.send(mockMessage, deliveryMode, priority, timeToLive);
}
queueSenderControl.setVoidCallable(1);
mockQueueSender.close();
queueSenderControl.setVoidCallable(1);
mockQueueSession.close();
queueSessionControl.setVoidCallable(1);
mockQueueConnection.close();
queueConnectionControl.setVoidCallable(1);
queueSenderControl.replay();
queueSessionControl.replay();
queueConnectionControl.replay();
if (useDefaultDestination) {
template.send(new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
return session.createTextMessage("just testing");
}
});
}
else {
if (explicitQueue) {
template.send(mockQueue, new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
return session.createTextMessage("just testing");
}
});
}
else {
template.send("testQueue", new MessageCreator() {
public Message createMessage(Session session)
throws JMSException {
return session.createTextMessage("just testing");
}
});
}
}
queueConnectionFactoryControl.verify();
queueConnectionControl.verify();
queueSessionControl.verify();
queueSenderControl.verify();
}
private void sendTopic(boolean ignoreQOS, boolean explicitTopic) throws Exception {
JmsTemplate102 template = createTemplate();
template.setPubSubDomain(true);
template.setConnectionFactory(mockTopicConnectionFactory);
template.afterPropertiesSet();
MockControl topicPublisherControl = MockControl.createControl(TopicPublisher.class);
TopicPublisher mockTopicPublisher = (TopicPublisher) topicPublisherControl.getMock();
MockControl messageControl = MockControl.createControl(TextMessage.class);
TextMessage mockMessage = (TextMessage) messageControl.getMock();
mockTopicSession.createPublisher(this.mockTopic);
topicSessionControl.setReturnValue(mockTopicPublisher);
mockTopicSession.createTextMessage("just testing");
topicSessionControl.setReturnValue(mockMessage);
if (useTransactedTemplate()) {
mockTopicSession.commit();
topicSessionControl.setVoidCallable(1);
}
mockTopicPublisher.close();
topicPublisherControl.setVoidCallable(1);
mockTopicSession.close();
topicSessionControl.setVoidCallable(1);
mockTopicConnection.close();
topicConnectionControl.setVoidCallable(1);
topicSessionControl.replay();
topicConnectionControl.replay();
if (ignoreQOS) {
mockTopicPublisher.publish(mockMessage);
}
else {
template.setExplicitQosEnabled(true);
template.setDeliveryMode(deliveryMode);
template.setPriority(priority);
template.setTimeToLive(timeToLive);
mockTopicPublisher.publish(mockMessage, deliveryMode, priority, timeToLive);
}
topicPublisherControl.replay();
template.setPubSubDomain(true);
if (explicitTopic) {
template.send(mockTopic, new MessageCreator() {
public Message createMessage(Session session)
throws JMSException {
return session.createTextMessage("just testing");
}
});
}
else {
template.send("testTopic", new MessageCreator() {
public Message createMessage(Session session)
throws JMSException {
return session.createTextMessage("just testing");
}
});
}
topicConnectionFactoryControl.verify();
topicConnectionControl.verify();
topicSessionControl.verify();
topicPublisherControl.verify();
}
public void testConverter() throws Exception {
JmsTemplate102 template = createTemplate();
template.setConnectionFactory(mockQueueConnectionFactory);
template.setMessageConverter(new SimpleMessageConverter());
String s = "Hello world";
MockControl queueSenderControl = MockControl.createControl(QueueSender.class);
QueueSender mockQueueSender = (QueueSender) queueSenderControl.getMock();
MockControl messageControl = MockControl.createControl(TextMessage.class);
TextMessage mockMessage = (TextMessage) messageControl.getMock();
mockQueueSession.createSender(this.mockQueue);
queueSessionControl.setReturnValue(mockQueueSender);
mockQueueSession.createTextMessage("Hello world");
queueSessionControl.setReturnValue(mockMessage);
if (useTransactedTemplate()) {
mockQueueSession.commit();
queueSessionControl.setVoidCallable(1);
}
mockQueueSender.send(mockMessage);
queueSenderControl.setVoidCallable(1);
mockQueueSender.close();
queueSenderControl.setVoidCallable(1);
mockQueueSession.close();
queueSessionControl.setVoidCallable(1);
mockQueueConnection.close();
queueConnectionControl.setVoidCallable(1);
queueSenderControl.replay();
queueSessionControl.replay();
queueConnectionControl.replay();
template.convertAndSend(mockQueue, s);
queueConnectionFactoryControl.verify();
queueConnectionControl.verify();
queueSessionControl.verify();
queueSenderControl.verify();
}
public void testQueueReceiveDefaultDestination() throws Exception {
doTestReceive(false, false, true, false, false, false, false, JmsTemplate.RECEIVE_TIMEOUT_INDEFINITE_WAIT);
}
public void testQueueReceiveDestination() throws Exception {
doTestReceive(false, true, false, false, false, false, true, JmsTemplate.RECEIVE_TIMEOUT_INDEFINITE_WAIT);
}
public void testQueueReceiveDestinationWithClientAcknowledge() throws Exception {
doTestReceive(false, true, false, false, true, false, false, 1000);
}
public void testQueueReceiveStringDestination() throws Exception {
doTestReceive(false, false, false, false, false, false, true, JmsTemplate.RECEIVE_TIMEOUT_NO_WAIT);
}
public void testQueueReceiveDefaultDestinationWithSelector() throws Exception {
doTestReceive(false, false, true, false, false, true, true, 1000);
}
public void testQueueReceiveDestinationWithSelector() throws Exception {
doTestReceive(false, true, false, false, false, true, false, JmsTemplate.RECEIVE_TIMEOUT_NO_WAIT);
}
public void testQueueReceiveDestinationWithClientAcknowledgeWithSelector() throws Exception {
doTestReceive(false, true, false, false, true, true, true, JmsTemplate.RECEIVE_TIMEOUT_INDEFINITE_WAIT);
}
public void testQueueReceiveStringDestinationWithSelector() throws Exception {
doTestReceive(false, false, false, false, false, true, false, JmsTemplate.RECEIVE_TIMEOUT_INDEFINITE_WAIT);
}
public void testQueueReceiveAndConvertDefaultDestination() throws Exception {
doTestReceive(false, false, true, true, false, false, false, 1000);
}
public void testQueueReceiveAndConvertStringDestination() throws Exception {
doTestReceive(false, false, false, true, false, false, true, JmsTemplate.RECEIVE_TIMEOUT_INDEFINITE_WAIT);
}
public void testQueueReceiveAndConvertDestination() throws Exception {
doTestReceive(false, true, false, true, false, false, true, 1000);
}
public void testQueueReceiveAndConvertDefaultDestinationWithSelector() throws Exception {
doTestReceive(false, false, true, true, false, true, true, JmsTemplate.RECEIVE_TIMEOUT_NO_WAIT);
}
public void testQueueReceiveAndConvertStringDestinationWithSelector() throws Exception {
doTestReceive(false, false, false, true, false, true, true, JmsTemplate.RECEIVE_TIMEOUT_INDEFINITE_WAIT);
}
public void testQueueReceiveAndConvertDestinationWithSelector() throws Exception {
doTestReceive(false, true, false, true, false, true, false, 1000);
}
public void testTopicReceiveDefaultDestination() throws Exception {
doTestReceive(true, false, true, false, false, false, false, JmsTemplate.RECEIVE_TIMEOUT_INDEFINITE_WAIT);
}
public void testTopicReceiveDestination() throws Exception {
doTestReceive(true, true, false, false, false, false, true, JmsTemplate.RECEIVE_TIMEOUT_INDEFINITE_WAIT);
}
public void testTopicReceiveDestinationWithClientAcknowledge() throws Exception {
doTestReceive(true, true, false, false, true, false, false, 1000);
}
public void testTopicReceiveStringDestination() throws Exception {
doTestReceive(true, false, false, false, false, false, true, JmsTemplate.RECEIVE_TIMEOUT_NO_WAIT);
}
public void testTopicReceiveDefaultDestinationWithSelector() throws Exception {
doTestReceive(true, false, true, false, false, true, true, 1000);
}
public void testTopicReceiveDestinationWithSelector() throws Exception {
doTestReceive(true, true, false, false, false, true, false, 1000);
}
public void testTopicReceiveDestinationWithClientAcknowledgeWithSelector() throws Exception {
doTestReceive(true, true, false, false, true, true, true, JmsTemplate.RECEIVE_TIMEOUT_INDEFINITE_WAIT);
}
public void testTopicReceiveStringDestinationWithSelector() throws Exception {
doTestReceive(true, false, false, false, false, true, false, JmsTemplate.RECEIVE_TIMEOUT_INDEFINITE_WAIT);
}
public void testTopicReceiveAndConvertDefaultDestination() throws Exception {
doTestReceive(true, false, true, true, false, false, false, 1000);
}
public void testTopicReceiveAndConvertStringDestination() throws Exception {
doTestReceive(true, false, false, true, false, false, true, JmsTemplate.RECEIVE_TIMEOUT_INDEFINITE_WAIT);
}
public void testTopicReceiveAndConvertDestination() throws Exception {
doTestReceive(true, true, false, true, false, false, true, 1000);
}
public void testTopicReceiveAndConvertDefaultDestinationWithSelector() throws Exception {
doTestReceive(true, false, true, true, false, true, true, JmsTemplate.RECEIVE_TIMEOUT_NO_WAIT);
}
public void testTopicReceiveAndConvertStringDestinationWithSelector() throws Exception {
doTestReceive(true, false, false, true, false, true, true, JmsTemplate.RECEIVE_TIMEOUT_INDEFINITE_WAIT);
}
public void testTopicReceiveAndConvertDestinationWithSelector() throws Exception {
doTestReceive(true, true, false, true, false, true, false, 1000);
}
private void doTestReceive(
boolean pubSub,
boolean explicitDestination, boolean useDefaultDestination, boolean testConverter,
boolean clientAcknowledge, boolean messageSelector, boolean noLocal, long timeout)
throws Exception {
JmsTemplate102 template = createTemplate();
template.setPubSubDomain(pubSub);
if (pubSub) {
template.setConnectionFactory(mockTopicConnectionFactory);
}
else {
template.setConnectionFactory(mockQueueConnectionFactory);
}
// Override the default settings for client ack used in the test setup.
// Can't use Session.getAcknowledgeMode()
if (pubSub) {
topicConnectionControl.reset();
if (clientAcknowledge) {
template.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
mockTopicConnection.createTopicSession(useTransactedTemplate(), Session.CLIENT_ACKNOWLEDGE);
}
else {
template.setSessionAcknowledgeMode(Session.AUTO_ACKNOWLEDGE);
mockTopicConnection.createTopicSession(useTransactedTemplate(), Session.AUTO_ACKNOWLEDGE);
}
topicConnectionControl.setReturnValue(mockTopicSession);
}
else {
queueConnectionControl.reset();
if (clientAcknowledge) {
template.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
mockQueueConnection.createQueueSession(useTransactedTemplate(), Session.CLIENT_ACKNOWLEDGE);
}
else {
template.setSessionAcknowledgeMode(Session.AUTO_ACKNOWLEDGE);
mockQueueConnection.createQueueSession(useTransactedTemplate(), Session.AUTO_ACKNOWLEDGE);
}
queueConnectionControl.setReturnValue(mockQueueSession);
}
Destination dest = pubSub ? (Destination) mockTopic : (Destination) mockQueue;
if (useDefaultDestination) {
template.setDefaultDestination(dest);
}
if (noLocal) {
template.setPubSubNoLocal(true);
}
template.setReceiveTimeout(timeout);
if (pubSub) {
mockTopicConnection.start();
topicConnectionControl.setVoidCallable(1);
mockTopicConnection.close();
topicConnectionControl.setVoidCallable(1);
}
else {
mockQueueConnection.start();
queueConnectionControl.setVoidCallable(1);
mockQueueConnection.close();
queueConnectionControl.setVoidCallable(1);
}
String selectorString = "selector";
MockControl messageConsumerControl = null;
MessageConsumer mockMessageConsumer = null;
if (pubSub) {
messageConsumerControl = MockControl.createControl(TopicSubscriber.class);
TopicSubscriber mockTopicSubscriber = (TopicSubscriber) messageConsumerControl.getMock();
mockMessageConsumer = mockTopicSubscriber;
mockTopicSession.createSubscriber(mockTopic, messageSelector ? selectorString : null, noLocal);
topicSessionControl.setReturnValue(mockTopicSubscriber);
}
else {
messageConsumerControl = MockControl.createControl(QueueReceiver.class);
QueueReceiver mockQueueReceiver = (QueueReceiver) messageConsumerControl.getMock();
mockMessageConsumer = mockQueueReceiver;
mockQueueSession.createReceiver(mockQueue, messageSelector ? selectorString : null);
queueSessionControl.setReturnValue(mockQueueReceiver);
}
if (useTransactedTemplate()) {
if (pubSub) {
mockTopicSession.commit();
topicSessionControl.setVoidCallable(1);
}
else {
mockQueueSession.commit();
queueSessionControl.setVoidCallable(1);
}
}
if (pubSub) {
mockTopicSession.close();
topicSessionControl.setVoidCallable(1);
}
else {
mockQueueSession.close();
queueSessionControl.setVoidCallable(1);
}
MockControl messageControl = MockControl.createControl(TextMessage.class);
TextMessage mockMessage = (TextMessage) messageControl.getMock();
if (testConverter) {
mockMessage.getText();
messageControl.setReturnValue("Hello World!");
}
if (!useTransactedSession() && clientAcknowledge) {
mockMessage.acknowledge();
messageControl.setVoidCallable(1);
}
if (pubSub) {
topicSessionControl.replay();
topicConnectionControl.replay();
}
else {
queueSessionControl.replay();
queueConnectionControl.replay();
}
messageControl.replay();
if (timeout == JmsTemplate.RECEIVE_TIMEOUT_NO_WAIT) {
mockMessageConsumer.receiveNoWait();
}
else if (timeout == JmsTemplate.RECEIVE_TIMEOUT_INDEFINITE_WAIT) {
mockMessageConsumer.receive();
}
else {
mockMessageConsumer.receive(timeout);
}
messageConsumerControl.setReturnValue(mockMessage);
mockMessageConsumer.close();
messageConsumerControl.setVoidCallable(1);
messageConsumerControl.replay();
Message message = null;
String textFromMessage = null;
if (useDefaultDestination) {
if (testConverter) {
textFromMessage = (String)
(messageSelector ? template.receiveSelectedAndConvert(selectorString) :
template.receiveAndConvert());
}
else {
message = (messageSelector ? template.receiveSelected(selectorString) : template.receive());
}
}
else if (explicitDestination) {
if (testConverter) {
textFromMessage = (String)
(messageSelector ? template.receiveSelectedAndConvert(dest, selectorString) :
template.receiveAndConvert(dest));
}
else {
message = (messageSelector ? template.receiveSelected(dest, selectorString) :
template.receive(dest));
}
}
else {
String destinationName = (pubSub ? "testTopic" : "testQueue");
if (testConverter) {
textFromMessage = (String)
(messageSelector ? template.receiveSelectedAndConvert(destinationName, selectorString) :
template.receiveAndConvert(destinationName));
}
else {
message = (messageSelector ? template.receiveSelected(destinationName, selectorString) :
template.receive(destinationName));
}
}
if (pubSub) {
topicConnectionFactoryControl.verify();
topicConnectionControl.verify();
topicSessionControl.verify();
}
else {
queueConnectionFactoryControl.verify();
queueConnectionControl.verify();
queueSessionControl.verify();
}
messageConsumerControl.verify();
messageControl.verify();
if (testConverter) {
assertEquals("Message text should be equal", "Hello World!", textFromMessage);
}
else {
assertEquals("Messages should refer to the same object", message, mockMessage);
}
}
public void testIllegalStateException() throws Exception {
doTestJmsException(new javax.jms.IllegalStateException(""), org.springframework.jms.IllegalStateException.class);
}
public void testInvalidClientIDException() throws Exception {
doTestJmsException(new javax.jms.InvalidClientIDException(""), InvalidClientIDException.class);
}
public void testInvalidDestinationException() throws Exception {
doTestJmsException(new javax.jms.InvalidDestinationException(""), InvalidDestinationException.class);
}
public void testInvalidSelectorException() throws Exception {
doTestJmsException(new javax.jms.InvalidSelectorException(""), InvalidSelectorException.class);
}
public void testJmsSecurityException() throws Exception {
doTestJmsException(new javax.jms.JMSSecurityException(""), JmsSecurityException.class);
}
public void testMessageEOFException() throws Exception {
doTestJmsException(new javax.jms.MessageEOFException(""), MessageEOFException.class);
}
public void testMessageFormatException() throws Exception {
doTestJmsException(new javax.jms.MessageFormatException(""), MessageFormatException.class);
}
public void testMessageNotReadableException() throws Exception {
doTestJmsException(new javax.jms.MessageNotReadableException(""), MessageNotReadableException.class);
}
public void testMessageNotWriteableException() throws Exception {
doTestJmsException(new javax.jms.MessageNotWriteableException(""), MessageNotWriteableException.class);
}
public void testResourceAllocationException() throws Exception {
doTestJmsException(new javax.jms.ResourceAllocationException(""), ResourceAllocationException.class);
}
public void testTransactionInProgressException() throws Exception {
doTestJmsException(new javax.jms.TransactionInProgressException(""), TransactionInProgressException.class);
}
public void testTransactionRolledBackException() throws Exception {
doTestJmsException(new javax.jms.TransactionRolledBackException(""), TransactionRolledBackException.class);
}
public void testUncategorizedJmsException() throws Exception {
doTestJmsException(new javax.jms.JMSException(""), UncategorizedJmsException.class);
}
protected void doTestJmsException(JMSException original, Class thrownExceptionClass) throws Exception {
JmsTemplate template = createTemplate();
template.setConnectionFactory(mockQueueConnectionFactory);
template.setMessageConverter(new SimpleMessageConverter());
String s = "Hello world";
MockControl queueSenderControl = MockControl.createControl(QueueSender.class);
QueueSender mockQueueSender = (QueueSender) queueSenderControl.getMock();
MockControl messageControl = MockControl.createControl(TextMessage.class);
TextMessage mockMessage = (TextMessage) messageControl.getMock();
queueSessionControl.reset();
mockQueueSession.createSender(mockQueue);
queueSessionControl.setReturnValue(mockQueueSender);
mockQueueSession.createTextMessage("Hello world");
queueSessionControl.setReturnValue(mockMessage);
mockQueueSender.send(mockMessage);
queueSenderControl.setThrowable(original, 1);
mockQueueSender.close();
queueSenderControl.setVoidCallable(1);
mockQueueSession.close();
queueSessionControl.setVoidCallable(1);
mockQueueConnection.close();
queueConnectionControl.setVoidCallable(1);
queueSenderControl.replay();
queueSessionControl.replay();
queueConnectionControl.replay();
try {
template.convertAndSend(mockQueue, s);
fail("Should have thrown JmsException");
}
catch (JmsException wrappedEx) {
// expected
assertEquals(thrownExceptionClass, wrappedEx.getClass());
assertEquals(original, wrappedEx.getCause());
}
queueSenderControl.verify();
queueSessionControl.verify();
queueConnectionControl.verify();
queueConnectionFactoryControl.verify();
}
}