/*
* JBoss, Home of Professional Open Source
* Copyright 2005-2008, Red Hat Middleware LLC, and individual contributors
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.messaging.tests.unit.core.server.impl;
import java.util.ArrayList;
import org.easymock.EasyMock;
import org.jboss.messaging.core.message.impl.MessageImpl;
import org.jboss.messaging.core.paging.PagingManager;
import org.jboss.messaging.core.persistence.StorageManager;
import org.jboss.messaging.core.postoffice.Binding;
import org.jboss.messaging.core.postoffice.PostOffice;
import org.jboss.messaging.core.server.MessageReference;
import org.jboss.messaging.core.server.Queue;
import org.jboss.messaging.core.server.ServerMessage;
import org.jboss.messaging.core.server.impl.MessageReferenceImpl;
import org.jboss.messaging.core.settings.HierarchicalRepository;
import org.jboss.messaging.core.settings.impl.QueueSettings;
import org.jboss.messaging.tests.util.RandomUtil;
import org.jboss.messaging.tests.util.UnitTestCase;
import org.jboss.messaging.util.SimpleString;
/**
* @author <a href="ataylor@redhat.com">Andy Taylor</a>
*/
public class MessageReferenceImplTest extends UnitTestCase
{
public void testDeliveryCount()
{
ServerMessage serverMessage = EasyMock.createStrictMock(ServerMessage.class);
Queue queue = EasyMock.createStrictMock(Queue.class);
MessageReferenceImpl messageReference = new DummyMessageReference(serverMessage, queue);
assertEquals(messageReference.getDeliveryCount(), 0);
messageReference.incrementDeliveryCount();
messageReference.incrementDeliveryCount();
messageReference.incrementDeliveryCount();
messageReference.incrementDeliveryCount();
messageReference.incrementDeliveryCount();
assertEquals(messageReference.getDeliveryCount(), 5);
messageReference.setDeliveryCount(0);
assertEquals(messageReference.getDeliveryCount(), 0);
}
public void testCopy()
{
Queue queue = EasyMock.createStrictMock(Queue.class);
ServerMessage serverMessage = EasyMock.createStrictMock(ServerMessage.class);
Queue queue2 = EasyMock.createStrictMock(Queue.class);
MessageReferenceImpl messageReference = new DummyMessageReference(serverMessage, queue);
messageReference.setDeliveryCount(999);
messageReference.setScheduledDeliveryTime(System.currentTimeMillis());
MessageReference messageReferenceCopy = messageReference.copy(queue2);
assertEquals(messageReferenceCopy.getDeliveryCount(), messageReference.getDeliveryCount());
assertEquals(messageReferenceCopy.getScheduledDeliveryTime(), messageReference.getScheduledDeliveryTime());
assertEquals(messageReferenceCopy.getMessage(), messageReference.getMessage());
assertEquals(messageReferenceCopy.getQueue(), queue2);
}
public void testCancelDurable() throws Exception
{
QueueSettings queueSettings = new QueueSettings();
StorageManager sm = EasyMock.createStrictMock(StorageManager.class);
PostOffice po = EasyMock.createStrictMock(PostOffice.class);
HierarchicalRepository<QueueSettings> repos = EasyMock.createStrictMock(HierarchicalRepository.class);
ServerMessage serverMessage = EasyMock.createStrictMock(ServerMessage.class);
Queue queue = EasyMock.createStrictMock(Queue.class);
MessageReferenceImpl messageReference = new DummyMessageReference(serverMessage, queue);
SimpleString queueName = new SimpleString("queueName");
queue.referenceCancelled();
EasyMock.expect(queue.getName()).andStubReturn(queueName);
EasyMock.expect(repos.getMatch(queueName.toString())).andStubReturn(queueSettings);
EasyMock.expect(serverMessage.isDurable()).andStubReturn(true);
EasyMock.expect(serverMessage.getMessageID()).andStubReturn(999l);
EasyMock.expect(queue.isDurable()).andStubReturn(true);
sm.updateDeliveryCount(messageReference);
EasyMock.replay(sm, po, repos, serverMessage, queue);
assertTrue(messageReference.cancel(sm, po, repos));
EasyMock.verify(sm, po, repos, serverMessage, queue);
}
public void testCancelNonDurable() throws Exception
{
QueueSettings queueSettings = new QueueSettings();
StorageManager sm = EasyMock.createStrictMock(StorageManager.class);
PostOffice po = EasyMock.createStrictMock(PostOffice.class);
HierarchicalRepository<QueueSettings> repos = EasyMock.createStrictMock(HierarchicalRepository.class);
ServerMessage serverMessage = EasyMock.createStrictMock(ServerMessage.class);
Queue queue = EasyMock.createStrictMock(Queue.class);
MessageReferenceImpl messageReference = new DummyMessageReference(serverMessage, queue);
SimpleString queueName = new SimpleString("queueName");
queue.referenceCancelled();
EasyMock.expect(queue.getName()).andStubReturn(queueName);
EasyMock.expect(repos.getMatch(queueName.toString())).andStubReturn(queueSettings);
EasyMock.expect(serverMessage.isDurable()).andStubReturn(false);
EasyMock.expect(serverMessage.getMessageID()).andStubReturn(999l);
EasyMock.expect(queue.isDurable()).andStubReturn(false);
EasyMock.replay(sm, po, repos, serverMessage, queue);
assertTrue(messageReference.cancel(sm, po, repos));
EasyMock.verify(sm, po, repos, serverMessage, queue);
}
public void testCancelToDLQExists() throws Exception
{
QueueSettings queueSettings = new QueueSettings();
queueSettings.setMaxDeliveryAttempts(1);
SimpleString dlqName = new SimpleString("testDLQ");
queueSettings.setDLQ(dlqName);
Binding dlqBinding = EasyMock.createStrictMock(Binding.class);
EasyMock.expect(dlqBinding.getAddress()).andReturn(dlqName);
StorageManager sm = EasyMock.createNiceMock(StorageManager.class);
PostOffice po = EasyMock.createStrictMock(PostOffice.class);
PagingManager pm = EasyMock.createNiceMock(PagingManager.class);
EasyMock.expect(pm.page(EasyMock.isA(ServerMessage.class))).andStubReturn(false);
EasyMock.expect(po.getPagingManager()).andStubReturn(pm);
HierarchicalRepository<QueueSettings> repos = EasyMock.createStrictMock(HierarchicalRepository.class);
ServerMessage serverMessage = EasyMock.createNiceMock(ServerMessage.class);
Queue queue = EasyMock.createStrictMock(Queue.class);
EasyMock.expect(queue.getPersistenceID()).andStubReturn(1);
MessageReferenceImpl messageReference = new DummyMessageReference(serverMessage, queue);
messageReference.setDeliveryCount(1);
SimpleString queueName = new SimpleString("queueName");
queue.referenceAcknowledged(messageReference);
EasyMock.expect(queue.getName()).andStubReturn(queueName);
EasyMock.expect(repos.getMatch(queueName.toString())).andStubReturn(queueSettings);
EasyMock.expect(serverMessage.isDurable()).andStubReturn(true);
EasyMock.expect(serverMessage.getMessageID()).andStubReturn(999l);
EasyMock.expect(queue.isDurable()).andStubReturn(true);
sm.updateDeliveryCount(messageReference);
EasyMock.expect(po.getBinding(dlqName)).andReturn(dlqBinding);
EasyMock.expect(serverMessage.copy()).andReturn(serverMessage);
EasyMock.expect(sm.generateUniqueID()).andReturn(2l);
//serverMessage.setMessageID(2);
EasyMock.expect(serverMessage.getDestination()).andReturn(queueName);
serverMessage.putStringProperty(MessageImpl.HDR_ORIGIN_QUEUE, queueName);
serverMessage.setExpiration(0);
serverMessage.setDestination(dlqName);
EasyMock.expect(po.route(serverMessage)).andReturn(new ArrayList<MessageReference>());
EasyMock.expect(serverMessage.getDurableRefCount()).andReturn(0);
EasyMock.expect(serverMessage.decrementRefCount()).andReturn(1);
EasyMock.expect(serverMessage.decrementDurableRefCount()).andReturn(0);
EasyMock.expect(sm.generateUniqueID()).andReturn(1l);
EasyMock.replay(sm, po, repos, serverMessage, queue, dlqBinding, pm);
assertFalse(messageReference.cancel(sm, po, repos));
EasyMock.verify(sm, po, repos, serverMessage, queue, dlqBinding, pm);
}
public void testCancelToDLQDoesntExist() throws Exception
{
QueueSettings queueSettings = new QueueSettings();
queueSettings.setMaxDeliveryAttempts(1);
SimpleString dlqName = new SimpleString("testDLQ");
queueSettings.setDLQ(dlqName);
Binding dlqBinding = EasyMock.createStrictMock(Binding.class);
EasyMock.expect(dlqBinding.getAddress()).andReturn(dlqName);
StorageManager sm = EasyMock.createNiceMock(StorageManager.class);
PostOffice po = EasyMock.createStrictMock(PostOffice.class);
PagingManager pm = EasyMock.createNiceMock(PagingManager.class);
EasyMock.expect(pm.page(EasyMock.isA(ServerMessage.class))).andStubReturn(false);
EasyMock.expect(po.getPagingManager()).andStubReturn(pm);
EasyMock.expect(pm.isPaging(EasyMock.isA(SimpleString.class))).andStubReturn(false);
pm.messageDone(EasyMock.isA(ServerMessage.class));
EasyMock.expectLastCall().anyTimes();
HierarchicalRepository<QueueSettings> repos = EasyMock.createStrictMock(HierarchicalRepository.class);
ServerMessage serverMessage = EasyMock.createNiceMock(ServerMessage.class);
Queue queue = EasyMock.createStrictMock(Queue.class);
EasyMock.expect(queue.getPersistenceID()).andStubReturn(1);
MessageReferenceImpl messageReference = new DummyMessageReference(serverMessage, queue);
messageReference.setDeliveryCount(1);
SimpleString queueName = new SimpleString("queueName");
queue.referenceAcknowledged(messageReference);
EasyMock.expect(queue.getName()).andStubReturn(queueName);
EasyMock.expect(repos.getMatch(queueName.toString())).andStubReturn(queueSettings);
EasyMock.expect(serverMessage.isDurable()).andStubReturn(true);
EasyMock.expect(serverMessage.getMessageID()).andStubReturn(999l);
EasyMock.expect(queue.isDurable()).andStubReturn(true);
sm.updateDeliveryCount(messageReference);
EasyMock.expect(po.getBinding(dlqName)).andReturn(null);
EasyMock.expect(po.addBinding(dlqName, dlqName, null, true, false)).andReturn(dlqBinding);
EasyMock.expect(serverMessage.copy()).andReturn(serverMessage);
EasyMock.expect(sm.generateUniqueID()).andReturn(2l);
// serverMessage.setMessageID(2);
EasyMock.expect(serverMessage.getDestination()).andReturn(queueName);
serverMessage.putStringProperty(MessageImpl.HDR_ORIGIN_QUEUE, queueName);
serverMessage.setExpiration(0);
serverMessage.setDestination(dlqName);
EasyMock.expect(po.route(serverMessage)).andReturn(new ArrayList<MessageReference>());
EasyMock.expect(serverMessage.getDurableRefCount()).andReturn(0);
EasyMock.expect(serverMessage.decrementDurableRefCount()).andReturn(0);
EasyMock.expect(sm.generateUniqueID()).andReturn(1l);
EasyMock.replay(sm, po, repos, serverMessage, queue, dlqBinding, pm);
assertFalse(messageReference.cancel(sm, po, repos));
EasyMock.verify(sm, po, repos, serverMessage, queue, dlqBinding, pm);
}
public void testExpire() throws Exception
{
QueueSettings queueSettings = new QueueSettings();
queueSettings.setMaxDeliveryAttempts(1);
SimpleString dlqName = new SimpleString("testDLQ");
queueSettings.setDLQ(dlqName);
StorageManager sm = EasyMock.createNiceMock(StorageManager.class);
PostOffice po = EasyMock.createStrictMock(PostOffice.class);
PagingManager pm = EasyMock.createNiceMock(PagingManager.class);
EasyMock.expect(pm.page(EasyMock.isA(ServerMessage.class))).andStubReturn(false);
EasyMock.expect(po.getPagingManager()).andStubReturn(pm);
EasyMock.expect(pm.isPaging(EasyMock.isA(SimpleString.class))).andStubReturn(false);
pm.messageDone(EasyMock.isA(ServerMessage.class));
EasyMock.expectLastCall().anyTimes();
HierarchicalRepository<QueueSettings> repos = EasyMock.createStrictMock(HierarchicalRepository.class);
ServerMessage serverMessage = EasyMock.createStrictMock(ServerMessage.class);
Queue queue = EasyMock.createStrictMock(Queue.class);
EasyMock.expect(queue.getPersistenceID()).andStubReturn(1);
MessageReferenceImpl messageReference = new DummyMessageReference(serverMessage, queue);
messageReference.setDeliveryCount(1);
SimpleString queueName = new SimpleString("queueName");
queue.referenceAcknowledged(messageReference);
EasyMock.expect(queue.getName()).andStubReturn(queueName);
EasyMock.expect(repos.getMatch(queueName.toString())).andStubReturn(queueSettings);
EasyMock.expect(serverMessage.isDurable()).andStubReturn(true);
EasyMock.expect(serverMessage.getMessageID()).andStubReturn(999l);
EasyMock.expect(serverMessage.decrementRefCount()).andReturn(1);
EasyMock.expect(queue.isDurable()).andStubReturn(true);
EasyMock.expect(serverMessage.decrementDurableRefCount()).andReturn(0);
EasyMock.expect(sm.generateUniqueID()).andReturn(1l);
EasyMock.replay(sm, po, repos, serverMessage, queue, pm);
messageReference.expire(sm, po, repos);
EasyMock.verify(sm, po, repos, serverMessage, queue, pm);
}
public void testExpireToQExists() throws Exception
{
QueueSettings queueSettings = new QueueSettings();
queueSettings.setMaxDeliveryAttempts(1);
SimpleString expQName = new SimpleString("testexpQ");
Binding expQBinding = EasyMock.createStrictMock(Binding.class);
queueSettings.setExpiryQueue(expQName);
StorageManager sm = EasyMock.createNiceMock(StorageManager.class);
PostOffice po = EasyMock.createStrictMock(PostOffice.class);
PagingManager pm = EasyMock.createNiceMock(PagingManager.class);
EasyMock.expect(pm.page(EasyMock.isA(ServerMessage.class))).andStubReturn(false);
EasyMock.expect(po.getPagingManager()).andStubReturn(pm);
EasyMock.expect(pm.isPaging(EasyMock.isA(SimpleString.class))).andStubReturn(false);
pm.messageDone(EasyMock.isA(ServerMessage.class));
EasyMock.expectLastCall().anyTimes();
HierarchicalRepository<QueueSettings> repos = EasyMock.createStrictMock(HierarchicalRepository.class);
ServerMessage serverMessage = EasyMock.createNiceMock(ServerMessage.class);
Queue queue = EasyMock.createStrictMock(Queue.class);
EasyMock.expect(queue.getPersistenceID()).andStubReturn(1);
MessageReferenceImpl messageReference = new DummyMessageReference(serverMessage, queue);
messageReference.setDeliveryCount(1);
SimpleString queueName = new SimpleString("queueName");
queue.referenceAcknowledged(messageReference);
EasyMock.expect(queue.getName()).andStubReturn(queueName);
EasyMock.expect(repos.getMatch(queueName.toString())).andStubReturn(queueSettings);
EasyMock.expect(serverMessage.isDurable()).andStubReturn(true);
EasyMock.expect(serverMessage.getMessageID()).andStubReturn(999l);
EasyMock.expect(queue.isDurable()).andStubReturn(true);
EasyMock.expect(sm.generateUniqueID()).andReturn(2l);
EasyMock.expect(sm.generateUniqueID()).andReturn(1l);
EasyMock.expect(po.getBinding(expQName)).andReturn(expQBinding);
EasyMock.expect(serverMessage.copy()).andReturn(serverMessage);
//serverMessage.setMessageID(2);
EasyMock.expect(serverMessage.getDestination()).andReturn(queueName);
serverMessage.putStringProperty(MessageImpl.HDR_ORIGIN_QUEUE, queueName);
serverMessage.setExpiration(0);
serverMessage.putLongProperty(EasyMock.eq(MessageImpl.HDR_ACTUAL_EXPIRY_TIME), EasyMock.anyLong());
EasyMock.expect(expQBinding.getAddress()).andStubReturn(expQName);
serverMessage.setDestination(expQName);
EasyMock.expect(po.route(serverMessage)).andReturn(new ArrayList<MessageReference>());
EasyMock.expect(serverMessage.getDurableRefCount()).andReturn(0);
EasyMock.expect(serverMessage.decrementDurableRefCount()).andReturn(0);
EasyMock.replay(sm, po, repos, serverMessage, queue, expQBinding, pm);
messageReference.expire(sm, po, repos);
EasyMock.verify(sm, po, repos, serverMessage, queue, expQBinding, pm);
}
public void testExpireToQDoesntExist() throws Exception
{
QueueSettings queueSettings = new QueueSettings();
queueSettings.setMaxDeliveryAttempts(1);
SimpleString expQName = new SimpleString("testexpQ");
Binding expQBinding = EasyMock.createStrictMock(Binding.class);
queueSettings.setExpiryQueue(expQName);
StorageManager sm = EasyMock.createNiceMock(StorageManager.class);
PostOffice po = EasyMock.createStrictMock(PostOffice.class);
PagingManager pm = EasyMock.createNiceMock(PagingManager.class);
EasyMock.expect(pm.page(EasyMock.isA(ServerMessage.class))).andStubReturn(false);
EasyMock.expect(po.getPagingManager()).andStubReturn(pm);
EasyMock.expect(pm.isPaging(EasyMock.isA(SimpleString.class))).andStubReturn(false);
pm.messageDone(EasyMock.isA(ServerMessage.class));
EasyMock.expectLastCall().anyTimes();
HierarchicalRepository<QueueSettings> repos = EasyMock.createStrictMock(HierarchicalRepository.class);
ServerMessage serverMessage = EasyMock.createNiceMock(ServerMessage.class);
Queue queue = EasyMock.createStrictMock(Queue.class);
EasyMock.expect(queue.getPersistenceID()).andStubReturn(1);
MessageReferenceImpl messageReference = new DummyMessageReference(serverMessage, queue);
messageReference.setDeliveryCount(1);
SimpleString queueName = new SimpleString("queueName");
queue.referenceAcknowledged(messageReference);
EasyMock.expect(queue.getName()).andStubReturn(queueName);
EasyMock.expect(repos.getMatch(queueName.toString())).andStubReturn(queueSettings);
EasyMock.expect(serverMessage.isDurable()).andStubReturn(true);
EasyMock.expect(serverMessage.getMessageID()).andStubReturn(999l);
EasyMock.expect(queue.isDurable()).andStubReturn(true);
EasyMock.expect(sm.generateUniqueID()).andReturn(2l);
EasyMock.expect(sm.generateUniqueID()).andReturn(1l);
EasyMock.expect(po.getBinding(expQName)).andReturn(null);
EasyMock.expect(po.addBinding(expQName, expQName, null, true, false)).andReturn(expQBinding);
EasyMock.expect(serverMessage.copy()).andReturn(serverMessage);
// serverMessage.setMessageID(2);
EasyMock.expect(serverMessage.getDestination()).andReturn(queueName);
serverMessage.putStringProperty(MessageImpl.HDR_ORIGIN_QUEUE, queueName);
serverMessage.setExpiration(0);
serverMessage.putLongProperty(EasyMock.eq(MessageImpl.HDR_ACTUAL_EXPIRY_TIME), EasyMock.anyLong());
EasyMock.expect(expQBinding.getAddress()).andStubReturn(expQName);
serverMessage.setDestination(expQName);
EasyMock.expect(po.route(serverMessage)).andReturn(new ArrayList<MessageReference>());
EasyMock.expect(serverMessage.getDurableRefCount()).andReturn(0);
EasyMock.expect(serverMessage.decrementDurableRefCount()).andReturn(0);
EasyMock.replay(sm, po, repos, serverMessage, queue, expQBinding, pm);
messageReference.expire(sm, po, repos);
EasyMock.verify(sm, po, repos, serverMessage, queue, expQBinding, pm);
}
public void testMove() throws Exception
{
SimpleString fromAddress = RandomUtil.randomSimpleString();
SimpleString toAddress = RandomUtil.randomSimpleString();
long tid = RandomUtil.randomLong();
long messageID = RandomUtil.randomLong();
long newMessageID = RandomUtil.randomLong();
Queue queue = EasyMock.createStrictMock(Queue.class);
Binding toBinding = EasyMock.createStrictMock(Binding.class);
Queue toQueue = EasyMock.createStrictMock(Queue.class);
PostOffice postOffice = EasyMock.createMock(PostOffice.class);
PagingManager pm = EasyMock.createNiceMock(PagingManager.class);
EasyMock.expect(pm.page(EasyMock.isA(ServerMessage.class))).andStubReturn(false);
EasyMock.expect(postOffice.getPagingManager()).andStubReturn(pm);
EasyMock.expect(pm.isPaging(EasyMock.isA(SimpleString.class))).andStubReturn(false);
pm.messageDone(EasyMock.isA(ServerMessage.class));
EasyMock.expectLastCall().anyTimes();
StorageManager persistenceManager = EasyMock.createMock(StorageManager.class);
ServerMessage serverMessage = EasyMock.createNiceMock(ServerMessage.class);
EasyMock.expect(serverMessage.getMessageID()).andStubReturn(1l);
MessageReferenceImpl messageReference = new DummyMessageReference(serverMessage, queue);
ServerMessage copyMessage = EasyMock.createNiceMock(ServerMessage.class);
EasyMock.expect(copyMessage.getMessageID()).andStubReturn(1l);
EasyMock.expect(persistenceManager.generateUniqueID()).andReturn(tid);
EasyMock.expect(serverMessage.copy()).andReturn(copyMessage);
EasyMock.expect(persistenceManager.generateUniqueID()).andReturn(newMessageID);
copyMessage.setMessageID(newMessageID);
EasyMock.expect(copyMessage.getDestination()).andReturn(fromAddress);
copyMessage.putStringProperty(MessageImpl.HDR_ORIGIN_QUEUE, fromAddress);
copyMessage.setExpiration(0);
EasyMock.expect(toBinding.getAddress()).andStubReturn(toAddress);
copyMessage.setDestination(toAddress);
EasyMock.expect(postOffice.route(copyMessage)).andReturn(new ArrayList<MessageReference>());
EasyMock.expect(copyMessage.getDurableRefCount()).andReturn(0);
EasyMock.expect(serverMessage.isDurable()).andStubReturn(false);
EasyMock.expect(serverMessage.getMessageID()).andReturn(messageID);
queue.referenceAcknowledged(messageReference);
EasyMock.replay(queue, toBinding, toQueue, postOffice, persistenceManager, serverMessage, copyMessage, pm);
messageReference.move(toBinding, persistenceManager, postOffice);
EasyMock.verify(queue, toBinding, toQueue, postOffice, persistenceManager, serverMessage, copyMessage, pm);
}
//we need to override the constructor for creation
class DummyMessageReference extends MessageReferenceImpl
{
protected DummyMessageReference(ServerMessage message, Queue queue)
{
super(message, queue);
}
}
}