[jboss-cvs] JBoss Messaging SVN: r4550 - in trunk: tests/src/org/jboss/messaging/tests/unit/core/postoffice/impl and 1 other directory.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Mon Jun 23 07:11:45 EDT 2008


Author: ataylor
Date: 2008-06-23 07:11:45 -0400 (Mon, 23 Jun 2008)
New Revision: 4550

Added:
   trunk/tests/src/org/jboss/messaging/tests/unit/core/postoffice/impl/PostOfficeImplTest.java
Removed:
   trunk/tests/src/org/jboss/messaging/tests/unit/core/postoffice/impl/PostOfficeTest.java
Modified:
   trunk/src/main/org/jboss/messaging/core/postoffice/impl/PostOfficeImpl.java
Log:
more tests and tweaks

Modified: trunk/src/main/org/jboss/messaging/core/postoffice/impl/PostOfficeImpl.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/postoffice/impl/PostOfficeImpl.java	2008-06-23 11:02:48 UTC (rev 4549)
+++ trunk/src/main/org/jboss/messaging/core/postoffice/impl/PostOfficeImpl.java	2008-06-23 11:11:45 UTC (rev 4550)
@@ -22,17 +22,6 @@
 
 package org.jboss.messaging.core.postoffice.impl;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.CopyOnWriteArrayList;
-
 import org.jboss.messaging.core.exception.MessagingException;
 import org.jboss.messaging.core.filter.Filter;
 import org.jboss.messaging.core.logging.Logger;
@@ -48,6 +37,11 @@
 import org.jboss.messaging.util.ConcurrentSet;
 import org.jboss.messaging.util.SimpleString;
 
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.CopyOnWriteArrayList;
+
 /**
  * 
  * A PostOfficeImpl
@@ -101,6 +95,8 @@
       mappings.clear();
       
       destinations.clear();
+
+      nameMap.clear();
       
       started = false;
    }

Copied: trunk/tests/src/org/jboss/messaging/tests/unit/core/postoffice/impl/PostOfficeImplTest.java (from rev 4549, trunk/tests/src/org/jboss/messaging/tests/unit/core/postoffice/impl/PostOfficeTest.java)
===================================================================
--- trunk/tests/src/org/jboss/messaging/tests/unit/core/postoffice/impl/PostOfficeImplTest.java	                        (rev 0)
+++ trunk/tests/src/org/jboss/messaging/tests/unit/core/postoffice/impl/PostOfficeImplTest.java	2008-06-23 11:11:45 UTC (rev 4550)
@@ -0,0 +1,1467 @@
+/*
+ * 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.postoffice.impl;
+
+import org.easymock.EasyMock;
+import org.easymock.IAnswer;
+import org.jboss.messaging.core.exception.MessagingException;
+import org.jboss.messaging.core.filter.Filter;
+import org.jboss.messaging.core.persistence.StorageManager;
+import org.jboss.messaging.core.postoffice.Binding;
+import org.jboss.messaging.core.postoffice.FlowController;
+import org.jboss.messaging.core.postoffice.PostOffice;
+import org.jboss.messaging.core.postoffice.impl.BindingImpl;
+import org.jboss.messaging.core.postoffice.impl.PostOfficeImpl;
+import org.jboss.messaging.core.server.MessageReference;
+import org.jboss.messaging.core.server.Queue;
+import org.jboss.messaging.core.server.QueueFactory;
+import org.jboss.messaging.core.server.ServerMessage;
+import org.jboss.messaging.tests.unit.core.server.impl.fakes.FakeQueueFactory;
+import org.jboss.messaging.tests.util.UnitTestCase;
+import org.jboss.messaging.util.SimpleString;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * A PostOfficeTest
+ *
+ * @author <a href="mailto:tim.fox at jboss.com">Tim Fox</a>
+ * @author <a href="mailto:andy.taylor at jboss.org">Andy Taylor</a>
+ */
+public class PostOfficeImplTest extends UnitTestCase
+{
+   private QueueFactory queueFactory = new FakeQueueFactory();
+
+   public void testPostOfficeStart() throws Exception
+   {
+      StorageManager pm = EasyMock.createStrictMock(StorageManager.class);
+      QueueFactory qf = EasyMock.createStrictMock(QueueFactory.class);
+      PostOffice postOffice = new PostOfficeImpl(pm, qf, true);
+      pm.loadBindings(EasyMock.eq(qf), (List<Binding>) EasyMock.anyObject(), (List<SimpleString>) EasyMock.anyObject());
+      pm.loadMessages(EasyMock.eq(postOffice), (Map<Long, Queue>) EasyMock.anyObject());
+      EasyMock.replay(pm, qf);
+      postOffice.start();
+      EasyMock.verify(pm, qf);
+      assertTrue(postOffice.isStarted());
+   }
+
+   public void testPostOfficeStartAndStop() throws Exception
+   {
+      StorageManager pm = EasyMock.createStrictMock(StorageManager.class);
+      QueueFactory qf = EasyMock.createStrictMock(QueueFactory.class);
+      PostOffice postOffice = new PostOfficeImpl(pm, qf, true);
+      pm.loadBindings(EasyMock.eq(qf), (List<Binding>) EasyMock.anyObject(), (List<SimpleString>) EasyMock.anyObject());
+      pm.loadMessages(EasyMock.eq(postOffice), (Map<Long, Queue>) EasyMock.anyObject());
+      EasyMock.replay(pm, qf);
+      postOffice.start();
+      postOffice.stop();
+      EasyMock.verify(pm, qf);
+      assertFalse(postOffice.isStarted());
+   }
+
+   public void testPostOfficeStartedAndBindingLoaded() throws Exception
+   {
+      Binding binding = EasyMock.createStrictMock(Binding.class);
+      ArrayList<Binding> bindingArrayList = new ArrayList<Binding>();
+      bindingArrayList.add(binding);
+
+      Queue queue = EasyMock.createStrictMock(Queue.class);
+      StorageManager pm = EasyMock.createStrictMock(StorageManager.class);
+      QueueFactory qf = EasyMock.createStrictMock(QueueFactory.class);
+
+      SimpleString address1 = new SimpleString("testAddress1");
+      EasyMock.expect(binding.getAddress()).andStubReturn(address1);
+      EasyMock.expect(binding.getQueue()).andStubReturn(queue);
+      SimpleString queueName = new SimpleString("testQueueName1");
+      EasyMock.expect(queue.getName()).andStubReturn(queueName);
+      queue.setFlowController(null);
+      EasyMock.expect(queue.getPersistenceID()).andStubReturn(1);
+      PostOffice postOffice = new PostOfficeImpl(pm, qf, true);
+      pm.loadBindings(EasyMock.eq(qf), (List<Binding>) EasyMock.anyObject(), (List<SimpleString>) EasyMock.anyObject());
+      EasyMock.expectLastCall().andAnswer(new LoadBindingsIAnswer(bindingArrayList, null));
+      pm.loadMessages(EasyMock.eq(postOffice), (Map<Long, Queue>) EasyMock.anyObject());
+
+      EasyMock.replay(pm, qf, binding, queue);
+
+      postOffice.start();
+
+      EasyMock.verify(pm, qf, binding, queue);
+
+      assertTrue(postOffice.isStarted());
+      assertEquals(postOffice.getBinding(queueName), binding);
+      assertEquals(postOffice.getBindingsForAddress(address1).size(), 1);
+   }
+
+   public void testPostOfficeStartedAndBindingsLoadedDifferentAddress() throws Exception
+   {
+      ArrayList<Binding> bindingArrayList = new ArrayList<Binding>();
+
+      Binding[] bindings = new Binding[1000];
+      Queue[] queues = new Queue[1000];
+      SimpleString[] addresses = new SimpleString[1000];
+      SimpleString[] queueNames = new SimpleString[1000];
+      for (int i = 0; i < 1000; i++)
+      {
+         bindings[i] = EasyMock.createStrictMock(Binding.class);
+         bindingArrayList.add(bindings[i]);
+         queues[i] = EasyMock.createStrictMock(Queue.class);
+         addresses[i] = new SimpleString("testAddress" + i);
+         queueNames[i] = new SimpleString("testQueueName" + i);
+         EasyMock.expect(bindings[i].getAddress()).andStubReturn(addresses[i]);
+         EasyMock.expect(bindings[i].getQueue()).andStubReturn(queues[i]);
+         EasyMock.expect(queues[i].getName()).andStubReturn(queueNames[i]);
+         queues[i].setFlowController(null);
+         EasyMock.expect(queues[i].getPersistenceID()).andStubReturn(i + 1);
+         EasyMock.replay(bindings[i], queues[i]);
+      }
+
+
+      StorageManager pm = EasyMock.createStrictMock(StorageManager.class);
+      QueueFactory qf = EasyMock.createStrictMock(QueueFactory.class);
+
+
+      PostOffice postOffice = new PostOfficeImpl(pm, qf, true);
+      pm.loadBindings(EasyMock.eq(qf), (List<Binding>) EasyMock.anyObject(), (List<SimpleString>) EasyMock.anyObject());
+      EasyMock.expectLastCall().andAnswer(new LoadBindingsIAnswer(bindingArrayList, null));
+      pm.loadMessages(EasyMock.eq(postOffice), (Map<Long, Queue>) EasyMock.anyObject());
+
+      EasyMock.replay(pm, qf);
+
+      postOffice.start();
+
+      EasyMock.verify(pm, qf);
+
+      assertTrue(postOffice.isStarted());
+      for (int i = 0; i < 1000; i++)
+      {
+         assertEquals(postOffice.getBinding(queueNames[i]), bindings[i]);
+         assertEquals(postOffice.getBindingsForAddress(addresses[i]).size(), 1);
+      }
+   }
+
+   public void testPostOfficeStartedAndTwoBindingSameLoadedThrowsException() throws Exception
+   {
+      Binding binding = EasyMock.createStrictMock(Binding.class);
+      Binding binding2 = EasyMock.createStrictMock(Binding.class);
+      ArrayList<Binding> bindingArrayList = new ArrayList<Binding>();
+      bindingArrayList.add(binding);
+      bindingArrayList.add(binding2);
+      Queue queue = EasyMock.createStrictMock(Queue.class);
+      StorageManager pm = EasyMock.createStrictMock(StorageManager.class);
+      QueueFactory qf = EasyMock.createStrictMock(QueueFactory.class);
+
+      SimpleString address1 = new SimpleString("testAddress1");
+      EasyMock.expect(binding.getAddress()).andStubReturn(address1);
+      EasyMock.expect(binding.getQueue()).andStubReturn(queue);
+      EasyMock.expect(binding2.getAddress()).andStubReturn(address1);
+      EasyMock.expect(binding2.getQueue()).andStubReturn(queue);
+      SimpleString queueName = new SimpleString("testQueueName1");
+      EasyMock.expect(queue.getName()).andStubReturn(queueName);
+      queue.setFlowController(null);
+      EasyMock.expect(queue.getPersistenceID()).andStubReturn(1);
+      PostOffice postOffice = new PostOfficeImpl(pm, qf, true);
+      pm.loadBindings(EasyMock.eq(qf), (List<Binding>) EasyMock.anyObject(), (List<SimpleString>) EasyMock.anyObject());
+      EasyMock.expectLastCall().andAnswer(new LoadBindingsIAnswer(bindingArrayList, null));
+
+      EasyMock.replay(pm, qf, binding, binding2, queue);
+
+      try
+      {
+         postOffice.start();
+      }
+      catch (IllegalStateException e)
+      {
+         e.printStackTrace();
+      }
+
+      EasyMock.verify(pm, qf, binding, binding2, queue);
+
+      assertFalse(postOffice.isStarted());
+   }
+
+   public void testPostOfficeStartedAndBindingsLoadedSameAddress() throws Exception
+   {
+      ArrayList<Binding> bindingArrayList = new ArrayList<Binding>();
+
+      Binding[] bindings = new Binding[1000];
+      Queue[] queues = new Queue[1000];
+      SimpleString address = new SimpleString("testAddress");
+      SimpleString[] queueNames = new SimpleString[1000];
+      for (int i = 0; i < 1000; i++)
+      {
+         bindings[i] = EasyMock.createStrictMock(Binding.class);
+         bindingArrayList.add(bindings[i]);
+         queues[i] = EasyMock.createStrictMock(Queue.class);
+         queueNames[i] = new SimpleString("testQueueName" + i);
+         EasyMock.expect(bindings[i].getAddress()).andStubReturn(address);
+         EasyMock.expect(bindings[i].getQueue()).andStubReturn(queues[i]);
+         EasyMock.expect(queues[i].getName()).andStubReturn(queueNames[i]);
+         queues[i].setFlowController(null);
+         EasyMock.expect(queues[i].getPersistenceID()).andStubReturn(i + 1);
+         EasyMock.replay(bindings[i], queues[i]);
+      }
+
+
+      StorageManager pm = EasyMock.createStrictMock(StorageManager.class);
+      QueueFactory qf = EasyMock.createStrictMock(QueueFactory.class);
+
+
+      PostOffice postOffice = new PostOfficeImpl(pm, qf, true);
+      pm.loadBindings(EasyMock.eq(qf), (List<Binding>) EasyMock.anyObject(), (List<SimpleString>) EasyMock.anyObject());
+      EasyMock.expectLastCall().andAnswer(new LoadBindingsIAnswer(bindingArrayList, null));
+      pm.loadMessages(EasyMock.eq(postOffice), (Map<Long, Queue>) EasyMock.anyObject());
+
+      EasyMock.replay(pm, qf);
+
+      postOffice.start();
+
+      EasyMock.verify(pm, qf);
+
+      assertTrue(postOffice.isStarted());
+      for (int i = 0; i < 1000; i++)
+      {
+         assertEquals(postOffice.getBinding(queueNames[i]), bindings[i]);
+         assertEquals(postOffice.getBindingsForAddress(address).size(), 1000);
+      }
+   }
+
+   public void testPostOfficeStartedAndBindingLoadedAndDestination() throws Exception
+   {
+      Binding binding = EasyMock.createStrictMock(Binding.class);
+      ArrayList<Binding> bindingArrayList = new ArrayList<Binding>();
+      bindingArrayList.add(binding);
+      List<SimpleString> dests = new ArrayList<SimpleString>();
+      Queue queue = EasyMock.createStrictMock(Queue.class);
+      StorageManager pm = EasyMock.createStrictMock(StorageManager.class);
+      QueueFactory qf = EasyMock.createStrictMock(QueueFactory.class);
+
+      SimpleString address1 = new SimpleString("testAddress1");
+      dests.add(address1);
+      EasyMock.expect(binding.getAddress()).andStubReturn(address1);
+      EasyMock.expect(binding.getQueue()).andStubReturn(queue);
+      SimpleString queueName = new SimpleString("testQueueName1");
+      EasyMock.expect(queue.getName()).andStubReturn(queueName);
+      queue.setFlowController((FlowController) EasyMock.anyObject());
+      EasyMock.expect(queue.getPersistenceID()).andStubReturn(1);
+      PostOffice postOffice = new PostOfficeImpl(pm, qf, true);
+      pm.loadBindings(EasyMock.eq(qf), (List<Binding>) EasyMock.anyObject(), (List<SimpleString>) EasyMock.anyObject());
+      EasyMock.expectLastCall().andAnswer(new LoadBindingsIAnswer(bindingArrayList, dests));
+      EasyMock.expect(pm.addDestination(address1)).andReturn(true);
+      pm.loadMessages(EasyMock.eq(postOffice), (Map<Long, Queue>) EasyMock.anyObject());
+
+      EasyMock.replay(pm, qf, binding, queue);
+
+      postOffice.start();
+
+      EasyMock.verify(pm, qf, binding, queue);
+
+      assertTrue(postOffice.isStarted());
+      assertEquals(postOffice.getBinding(queueName), binding);
+      assertEquals(postOffice.getBindingsForAddress(address1).size(), 1);
+      assertTrue(postOffice.containsDestination(address1));
+   }
+
+   public void testPostOfficeStartedAndBindingLoadedAndDestinations() throws Exception
+   {
+
+      StorageManager pm = EasyMock.createStrictMock(StorageManager.class);
+      QueueFactory qf = EasyMock.createStrictMock(QueueFactory.class);
+      PostOffice postOffice = new PostOfficeImpl(pm, qf, true);
+      ArrayList<Binding> bindingArrayList = new ArrayList<Binding>();
+      List<SimpleString> dests = new ArrayList<SimpleString>();
+      Binding[] bindings = new Binding[1000];
+      Queue[] queues = new Queue[1000];
+      SimpleString[] addresses = new SimpleString[1000];
+      SimpleString[] queueNames = new SimpleString[1000];
+      for (int i = 0; i < 1000; i++)
+      {
+         bindings[i] = EasyMock.createStrictMock(Binding.class);
+         bindingArrayList.add(bindings[i]);
+         queues[i] = EasyMock.createStrictMock(Queue.class);
+         addresses[i] = new SimpleString("testAddress" + i);
+         queueNames[i] = new SimpleString("testQueueName" + i);
+         EasyMock.expect(bindings[i].getAddress()).andStubReturn(addresses[i]);
+         EasyMock.expect(bindings[i].getQueue()).andStubReturn(queues[i]);
+         EasyMock.expect(queues[i].getName()).andStubReturn(queueNames[i]);
+         queues[i].setFlowController((FlowController) EasyMock.anyObject());
+         EasyMock.expect(queues[i].getPersistenceID()).andStubReturn(i + 1);
+         EasyMock.replay(bindings[i], queues[i]);
+         dests.add(addresses[i]);
+      }
+
+
+      pm.loadBindings(EasyMock.eq(qf), (List<Binding>) EasyMock.anyObject(), (List<SimpleString>) EasyMock.anyObject());
+      EasyMock.expectLastCall().andAnswer(new LoadBindingsIAnswer(bindingArrayList, dests));
+      for (int i = 0; i < 1000; i++)
+      {
+         EasyMock.expect(pm.addDestination(addresses[i])).andReturn(true);
+      }
+      pm.loadMessages(EasyMock.eq(postOffice), (Map<Long, Queue>) EasyMock.anyObject());
+
+      EasyMock.replay(pm, qf);
+
+      postOffice.start();
+
+      EasyMock.verify(pm, qf);
+
+      assertTrue(postOffice.isStarted());
+      for (int i = 0; i < 1000; i++)
+      {
+         assertEquals(postOffice.getBinding(queueNames[i]), bindings[i]);
+         assertEquals(postOffice.getBindingsForAddress(addresses[i]).size(), 1);
+         assertTrue(postOffice.containsDestination(addresses[i]));
+      }
+   }
+
+   public void testPostOfficeStartedAndStoppedAndBindingLoadedAndDestinations() throws Exception
+   {
+
+      StorageManager pm = EasyMock.createStrictMock(StorageManager.class);
+      QueueFactory qf = EasyMock.createStrictMock(QueueFactory.class);
+      PostOffice postOffice = new PostOfficeImpl(pm, qf, true);
+      ArrayList<Binding> bindingArrayList = new ArrayList<Binding>();
+      List<SimpleString> dests = new ArrayList<SimpleString>();
+      Binding[] bindings = new Binding[1000];
+      Queue[] queues = new Queue[1000];
+      SimpleString[] addresses = new SimpleString[1000];
+      SimpleString[] queueNames = new SimpleString[1000];
+      for (int i = 0; i < 1000; i++)
+      {
+         bindings[i] = EasyMock.createStrictMock(Binding.class);
+         bindingArrayList.add(bindings[i]);
+         queues[i] = EasyMock.createStrictMock(Queue.class);
+         addresses[i] = new SimpleString("testAddress" + i);
+         queueNames[i] = new SimpleString("testQueueName" + i);
+         EasyMock.expect(bindings[i].getAddress()).andStubReturn(addresses[i]);
+         EasyMock.expect(bindings[i].getQueue()).andStubReturn(queues[i]);
+         EasyMock.expect(queues[i].getName()).andStubReturn(queueNames[i]);
+         queues[i].setFlowController((FlowController) EasyMock.anyObject());
+         EasyMock.expect(queues[i].getPersistenceID()).andStubReturn(i + 1);
+         EasyMock.replay(bindings[i], queues[i]);
+         dests.add(addresses[i]);
+      }
+
+
+      pm.loadBindings(EasyMock.eq(qf), (List<Binding>) EasyMock.anyObject(), (List<SimpleString>) EasyMock.anyObject());
+      EasyMock.expectLastCall().andAnswer(new LoadBindingsIAnswer(bindingArrayList, dests));
+      for (int i = 0; i < 1000; i++)
+      {
+         EasyMock.expect(pm.addDestination(addresses[i])).andReturn(true);
+      }
+      pm.loadMessages(EasyMock.eq(postOffice), (Map<Long, Queue>) EasyMock.anyObject());
+
+      EasyMock.replay(pm, qf);
+
+      postOffice.start();
+      postOffice.stop();
+      EasyMock.verify(pm, qf);
+
+      assertFalse(postOffice.isStarted());
+      for (int i = 0; i < 1000; i++)
+      {
+         assertNull(postOffice.getBinding(queueNames[i]));
+         assertEquals(postOffice.getBindingsForAddress(addresses[i]).size(), 0);
+         assertFalse(postOffice.containsDestination(addresses[i]));
+      }
+   }
+
+   public void testPostOfficeFlowControllersCreateds() throws Exception
+   {
+
+      StorageManager pm = EasyMock.createStrictMock(StorageManager.class);
+      QueueFactory qf = EasyMock.createStrictMock(QueueFactory.class);
+      PostOffice postOffice = new PostOfficeImpl(pm, qf, true);
+      ArrayList<Binding> bindingArrayList = new ArrayList<Binding>();
+      List<SimpleString> dests = new ArrayList<SimpleString>();
+      Binding[] bindings = new Binding[1000];
+      Queue[] queues = new Queue[1000];
+      SimpleString[] addresses = new SimpleString[1000];
+      SimpleString[] queueNames = new SimpleString[1000];
+      for (int i = 0; i < 1000; i++)
+      {
+         bindings[i] = EasyMock.createStrictMock(Binding.class);
+         bindingArrayList.add(bindings[i]);
+         queues[i] = EasyMock.createStrictMock(Queue.class);
+         addresses[i] = new SimpleString("testAddress" + i);
+         queueNames[i] = new SimpleString("testQueueName" + i);
+         EasyMock.expect(bindings[i].getAddress()).andStubReturn(addresses[i]);
+         EasyMock.expect(bindings[i].getQueue()).andStubReturn(queues[i]);
+         EasyMock.expect(queues[i].getName()).andStubReturn(queueNames[i]);
+         queues[i].setFlowController((FlowController) EasyMock.anyObject());
+         EasyMock.expect(queues[i].getPersistenceID()).andStubReturn(i + 1);
+         EasyMock.replay(bindings[i], queues[i]);
+         dests.add(addresses[i]);
+      }
+
+
+      pm.loadBindings(EasyMock.eq(qf), (List<Binding>) EasyMock.anyObject(), (List<SimpleString>) EasyMock.anyObject());
+      EasyMock.expectLastCall().andAnswer(new LoadBindingsIAnswer(bindingArrayList, dests));
+      for (int i = 0; i < 1000; i++)
+      {
+         EasyMock.expect(pm.addDestination(addresses[i])).andReturn(true);
+      }
+      pm.loadMessages(EasyMock.eq(postOffice), (Map<Long, Queue>) EasyMock.anyObject());
+
+      EasyMock.replay(pm, qf);
+
+      postOffice.start();
+
+      EasyMock.verify(pm, qf);
+
+      assertTrue(postOffice.isStarted());
+      for (int i = 0; i < 1000; i++)
+      {
+         FlowController flowController = postOffice.getFlowController(addresses[i]);
+         assertNotNull(flowController);
+      }
+   }
+
+   public void testListDestinations() throws Exception
+   {
+
+      StorageManager pm = EasyMock.createStrictMock(StorageManager.class);
+      QueueFactory qf = EasyMock.createStrictMock(QueueFactory.class);
+      PostOffice postOffice = new PostOfficeImpl(pm, qf, true);
+      ArrayList<Binding> bindingArrayList = new ArrayList<Binding>();
+      List<SimpleString> dests = new ArrayList<SimpleString>();
+      Binding[] bindings = new Binding[1000];
+      Queue[] queues = new Queue[1000];
+      SimpleString[] addresses = new SimpleString[1000];
+      SimpleString[] queueNames = new SimpleString[1000];
+      for (int i = 0; i < 1000; i++)
+      {
+         bindings[i] = EasyMock.createStrictMock(Binding.class);
+         bindingArrayList.add(bindings[i]);
+         queues[i] = EasyMock.createStrictMock(Queue.class);
+         addresses[i] = new SimpleString("testAddress" + i);
+         queueNames[i] = new SimpleString("testQueueName" + i);
+         EasyMock.expect(bindings[i].getAddress()).andStubReturn(addresses[i]);
+         EasyMock.expect(bindings[i].getQueue()).andStubReturn(queues[i]);
+         EasyMock.expect(queues[i].getName()).andStubReturn(queueNames[i]);
+         queues[i].setFlowController((FlowController) EasyMock.anyObject());
+         EasyMock.expect(queues[i].getPersistenceID()).andStubReturn(i + 1);
+         EasyMock.replay(bindings[i], queues[i]);
+         dests.add(addresses[i]);
+      }
+
+
+      pm.loadBindings(EasyMock.eq(qf), (List<Binding>) EasyMock.anyObject(), (List<SimpleString>) EasyMock.anyObject());
+      EasyMock.expectLastCall().andAnswer(new LoadBindingsIAnswer(bindingArrayList, dests));
+      for (int i = 0; i < 1000; i++)
+      {
+         EasyMock.expect(pm.addDestination(addresses[i])).andReturn(true);
+      }
+      pm.loadMessages(EasyMock.eq(postOffice), (Map<Long, Queue>) EasyMock.anyObject());
+
+      EasyMock.replay(pm, qf);
+
+      postOffice.start();
+      Set<SimpleString> allDests = postOffice.listAllDestinations();
+      EasyMock.verify(pm, qf);
+
+      for (SimpleString dest : allDests)
+      {
+         assertTrue(dests.remove(dest));
+      }
+      assertTrue(dests.size() == 0);
+   }
+
+   public void testAddQueue() throws Exception
+   {
+      StorageManager pm = EasyMock.createStrictMock(StorageManager.class);
+
+      QueueFactory qf = EasyMock.createStrictMock(QueueFactory.class);
+
+      PostOffice po = new PostOfficeImpl(pm, qf, false);
+
+      final long id = 324;
+      final SimpleString name = new SimpleString("wibb22");
+      final Filter filter = new FakeFilter();
+      final boolean durable = true;
+      final boolean temporary = true;
+
+      Queue queue = queueFactory.createQueue(id, name, filter, durable, temporary);
+
+      EasyMock.expect(qf.createQueue(-1, name, filter, durable, temporary)).andReturn(queue);
+
+      final SimpleString condition = new SimpleString("queue.wibble");
+
+      Binding expected = new BindingImpl(condition, queue);
+
+      pm.addBinding(EasyMock.eq(expected));
+
+      EasyMock.replay(qf);
+
+      EasyMock.replay(pm);
+
+      po.addBinding(condition, name, filter, durable, temporary);
+
+      EasyMock.verify(qf);
+
+      EasyMock.verify(pm);
+
+      EasyMock.reset(qf);
+
+      EasyMock.reset(pm);
+
+      final boolean durable2 = false;
+
+      queue = queueFactory.createQueue(id, name, filter, durable2, temporary);
+
+      EasyMock.expect(qf.createQueue(-1, name, filter, durable2, temporary)).andReturn(queue);
+
+      EasyMock.replay(qf);
+
+      EasyMock.replay(pm);
+   }
+
+   public void testRemoveQueue() throws Exception
+   {
+      StorageManager pm = EasyMock.createStrictMock(StorageManager.class);
+
+      QueueFactory qf = EasyMock.createStrictMock(QueueFactory.class);
+
+      PostOffice po = new PostOfficeImpl(pm, qf, false);
+
+      final long id = 324;
+      final SimpleString name = new SimpleString("wibb22");
+      final Filter filter = new FakeFilter();
+      final boolean durable = true;
+      final boolean temporary = true;
+
+      Queue queue = queueFactory.createQueue(id, name, filter, durable, temporary);
+
+      EasyMock.expect(qf.createQueue(-1, name, filter, durable, temporary)).andReturn(queue);
+
+      final SimpleString condition = new SimpleString("queue.wibble");
+
+      Binding expected = new BindingImpl(condition, queue);
+
+      pm.addBinding(EasyMock.eq(expected));
+
+      pm.deleteBinding(EasyMock.eq(expected));
+
+      EasyMock.replay(qf);
+
+      EasyMock.replay(pm);
+
+      po.addBinding(condition, name, filter, durable, temporary);
+
+      po.removeBinding(name);
+
+      EasyMock.verify(qf);
+
+      EasyMock.verify(pm);
+
+      EasyMock.reset(qf);
+
+      EasyMock.reset(pm);
+
+      final boolean durable2 = false;
+
+      queue = queueFactory.createQueue(id, name, filter, durable2, temporary);
+
+      EasyMock.expect(qf.createQueue(-1, name, filter, durable2, temporary)).andReturn(queue);
+
+      EasyMock.replay(qf);
+
+      EasyMock.replay(pm);
+
+      po.addBinding(condition, name, filter, durable2, temporary);
+
+      po.removeBinding(name);
+
+      EasyMock.verify(qf);
+
+      EasyMock.verify(pm);
+   }
+
+   public void testAddRemoveMultipleWithDifferentConditions() throws Exception
+   {
+      StorageManager pm = EasyMock.createStrictMock(StorageManager.class);
+
+      QueueFactory qf = new FakeQueueFactory();
+
+      PostOffice po = new PostOfficeImpl(pm, qf, false);
+
+      final SimpleString condition1 = new SimpleString("queue.wibble");
+
+      SimpleString squeue1 = new SimpleString("queue1");
+      SimpleString squeue2 = new SimpleString("queue2");
+      SimpleString squeue3 = new SimpleString("queue3");
+      SimpleString squeue4 = new SimpleString("queue4");
+      SimpleString squeue5 = new SimpleString("queue5");
+      SimpleString squeue6 = new SimpleString("queue6");
+
+      po.addBinding(condition1, squeue1, null, false, false);
+      Map<SimpleString, List<Binding>> mappings = po.getMappings();
+      assertEquals(1, mappings.size());
+
+      po.addBinding(condition1, squeue2, null, false, false);
+      mappings = po.getMappings();
+      assertEquals(1, mappings.size());
+
+      po.addBinding(condition1, squeue3, null, false, false);
+      mappings = po.getMappings();
+      assertEquals(1, mappings.size());
+
+      List<Binding> bindings = mappings.get(condition1);
+      assertNotNull(bindings);
+      assertEquals(3, bindings.size());
+
+      Binding binding1 = bindings.get(0);
+      Queue queue1 = binding1.getQueue();
+      assertEquals(squeue1, queue1.getName());
+
+      Binding binding2 = bindings.get(1);
+      Queue queue2 = binding2.getQueue();
+      assertEquals(squeue2, queue2.getName());
+
+      Binding binding3 = bindings.get(2);
+      Queue queue3 = binding3.getQueue();
+      assertEquals(squeue3, queue3.getName());
+
+      final SimpleString condition2 = new SimpleString("queue.wibble2");
+
+      po.addBinding(condition2, squeue4, null, false, false);
+      mappings = po.getMappings();
+      assertEquals(2, mappings.size());
+
+      po.addBinding(condition2, squeue5, null, false, false);
+      mappings = po.getMappings();
+      assertEquals(2, mappings.size());
+
+      final SimpleString condition3 = new SimpleString("topic.wibblexyz");
+
+      po.addBinding(condition3, squeue6, null, false, false);
+      mappings = po.getMappings();
+      assertEquals(3, mappings.size());
+
+      po.removeBinding(squeue6);
+      mappings = po.getMappings();
+      assertEquals(2, mappings.size());
+
+      po.removeBinding(squeue4);
+      mappings = po.getMappings();
+      assertEquals(2, mappings.size());
+
+      po.removeBinding(squeue5);
+      mappings = po.getMappings();
+      assertEquals(1, mappings.size());
+
+      po.removeBinding(squeue1);
+      mappings = po.getMappings();
+      assertEquals(1, mappings.size());
+
+      po.removeBinding(squeue2);
+      mappings = po.getMappings();
+      assertEquals(1, mappings.size());
+
+      po.removeBinding(squeue3);
+      mappings = po.getMappings();
+      assertEquals(0, mappings.size());
+   }
+
+   public void testPostOfficeAddDestinationNotTemporary() throws Exception
+   {
+
+      SimpleString address = new SimpleString("testAddress");
+      StorageManager pm = EasyMock.createStrictMock(StorageManager.class);
+      QueueFactory qf = EasyMock.createStrictMock(QueueFactory.class);
+      PostOffice postOffice = new PostOfficeImpl(pm, qf, true);
+      pm.loadBindings(EasyMock.eq(qf), (List<Binding>) EasyMock.anyObject(), (List<SimpleString>) EasyMock.anyObject());
+      pm.loadMessages(EasyMock.eq(postOffice), (Map<Long, Queue>) EasyMock.anyObject());
+      EasyMock.expect(pm.addDestination(address)).andReturn(true);
+      EasyMock.replay(pm, qf);
+      postOffice.start();
+      assertTrue(postOffice.addDestination(address, false));
+      assertNotNull(postOffice.getFlowController(address));
+      assertTrue(postOffice.containsDestination(address));
+      EasyMock.verify(pm, qf);
+   }
+
+   public void testPostOfficeAddDestinationsNotTemporary() throws Exception
+   {
+
+      SimpleString address = new SimpleString("testAddress");
+      SimpleString address2 = new SimpleString("testAddress2");
+      SimpleString address3 = new SimpleString("testAddress3");
+      StorageManager pm = EasyMock.createStrictMock(StorageManager.class);
+      QueueFactory qf = EasyMock.createStrictMock(QueueFactory.class);
+      PostOffice postOffice = new PostOfficeImpl(pm, qf, true);
+      pm.loadBindings(EasyMock.eq(qf), (List<Binding>) EasyMock.anyObject(), (List<SimpleString>) EasyMock.anyObject());
+      pm.loadMessages(EasyMock.eq(postOffice), (Map<Long, Queue>) EasyMock.anyObject());
+      EasyMock.expect(pm.addDestination(address)).andReturn(true);
+      EasyMock.expect(pm.addDestination(address2)).andReturn(true);
+      EasyMock.expect(pm.addDestination(address3)).andReturn(true);
+      EasyMock.replay(pm, qf);
+      postOffice.start();
+      assertTrue(postOffice.addDestination(address, false));
+      assertTrue(postOffice.addDestination(address2, false));
+      assertTrue(postOffice.addDestination(address3, false));
+      assertNotNull(postOffice.getFlowController(address));
+      assertNotNull(postOffice.getFlowController(address2));
+      assertNotNull(postOffice.getFlowController(address3));
+      assertTrue(postOffice.containsDestination(address));
+      assertTrue(postOffice.containsDestination(address2));
+      assertTrue(postOffice.containsDestination(address3));
+      EasyMock.verify(pm, qf);
+   }
+
+   public void testPostOfficeAddAndRemoveDestinationNotTemporary() throws Exception
+   {
+
+      SimpleString address = new SimpleString("testAddress");
+      StorageManager pm = EasyMock.createStrictMock(StorageManager.class);
+      QueueFactory qf = EasyMock.createStrictMock(QueueFactory.class);
+      PostOffice postOffice = new PostOfficeImpl(pm, qf, true);
+      pm.loadBindings(EasyMock.eq(qf), (List<Binding>) EasyMock.anyObject(), (List<SimpleString>) EasyMock.anyObject());
+      pm.loadMessages(EasyMock.eq(postOffice), (Map<Long, Queue>) EasyMock.anyObject());
+      EasyMock.expect(pm.addDestination(address)).andReturn(true);
+      EasyMock.expect(pm.deleteDestination(address)).andReturn(true);
+      EasyMock.replay(pm, qf);
+      postOffice.start();
+      assertTrue(postOffice.addDestination(address, false));
+      assertTrue(postOffice.containsDestination(address));
+      postOffice.removeDestination(address, false);
+      assertNull(postOffice.getFlowController(address));
+      assertFalse(postOffice.containsDestination(address));
+      EasyMock.verify(pm, qf);
+   }
+
+   public void testPostOfficeAddAndRemoveDestinationsNotTemporary() throws Exception
+   {
+
+      SimpleString address = new SimpleString("testAddress");
+      SimpleString address2 = new SimpleString("testAddress2");
+      SimpleString address3 = new SimpleString("testAddress3");
+      StorageManager pm = EasyMock.createStrictMock(StorageManager.class);
+      QueueFactory qf = EasyMock.createStrictMock(QueueFactory.class);
+      PostOffice postOffice = new PostOfficeImpl(pm, qf, true);
+      pm.loadBindings(EasyMock.eq(qf), (List<Binding>) EasyMock.anyObject(), (List<SimpleString>) EasyMock.anyObject());
+      pm.loadMessages(EasyMock.eq(postOffice), (Map<Long, Queue>) EasyMock.anyObject());
+      EasyMock.expect(pm.addDestination(address)).andReturn(true);
+      EasyMock.expect(pm.addDestination(address2)).andReturn(true);
+      EasyMock.expect(pm.addDestination(address3)).andReturn(true);
+      EasyMock.expect(pm.deleteDestination(address)).andReturn(true);
+      EasyMock.expect(pm.deleteDestination(address3)).andReturn(true);
+      EasyMock.replay(pm, qf);
+      postOffice.start();
+      assertTrue(postOffice.addDestination(address, false));
+      assertTrue(postOffice.addDestination(address2, false));
+      assertTrue(postOffice.addDestination(address3, false));
+      assertNotNull(postOffice.getFlowController(address));
+      assertNotNull(postOffice.getFlowController(address2));
+      assertNotNull(postOffice.getFlowController(address3));
+      assertTrue(postOffice.containsDestination(address));
+      assertTrue(postOffice.containsDestination(address2));
+      assertTrue(postOffice.containsDestination(address3));
+      postOffice.removeDestination(address, false);
+      postOffice.removeDestination(address3, false);
+      assertNull(postOffice.getFlowController(address));
+      assertFalse(postOffice.containsDestination(address));
+      assertNotNull(postOffice.getFlowController(address2));
+      assertTrue(postOffice.containsDestination(address2));
+      assertNull(postOffice.getFlowController(address3));
+      assertFalse(postOffice.containsDestination(address3));
+      EasyMock.verify(pm, qf);
+   }
+
+   public void testPostOfficeAddDestinationTemporary() throws Exception
+   {
+
+      SimpleString address = new SimpleString("testAddress");
+      StorageManager pm = EasyMock.createStrictMock(StorageManager.class);
+      QueueFactory qf = EasyMock.createStrictMock(QueueFactory.class);
+      PostOffice postOffice = new PostOfficeImpl(pm, qf, true);
+      pm.loadBindings(EasyMock.eq(qf), (List<Binding>) EasyMock.anyObject(), (List<SimpleString>) EasyMock.anyObject());
+      pm.loadMessages(EasyMock.eq(postOffice), (Map<Long, Queue>) EasyMock.anyObject());
+      EasyMock.replay(pm, qf);
+      postOffice.start();
+      assertTrue(postOffice.addDestination(address, true));
+      assertNotNull(postOffice.getFlowController(address));
+      assertTrue(postOffice.containsDestination(address));
+      EasyMock.verify(pm, qf);
+   }
+
+   public void testPostOfficeAddDestinationsTemporary() throws Exception
+   {
+
+      SimpleString address = new SimpleString("testAddress");
+      SimpleString address2 = new SimpleString("testAddress2");
+      SimpleString address3 = new SimpleString("testAddress3");
+      StorageManager pm = EasyMock.createStrictMock(StorageManager.class);
+      QueueFactory qf = EasyMock.createStrictMock(QueueFactory.class);
+      PostOffice postOffice = new PostOfficeImpl(pm, qf, true);
+      pm.loadBindings(EasyMock.eq(qf), (List<Binding>) EasyMock.anyObject(), (List<SimpleString>) EasyMock.anyObject());
+      pm.loadMessages(EasyMock.eq(postOffice), (Map<Long, Queue>) EasyMock.anyObject());
+      EasyMock.replay(pm, qf);
+      postOffice.start();
+      assertTrue(postOffice.addDestination(address, true));
+      assertTrue(postOffice.addDestination(address2, true));
+      assertTrue(postOffice.addDestination(address3, true));
+      assertNotNull(postOffice.getFlowController(address));
+      assertNotNull(postOffice.getFlowController(address2));
+      assertNotNull(postOffice.getFlowController(address3));
+      assertTrue(postOffice.containsDestination(address));
+      assertTrue(postOffice.containsDestination(address2));
+      assertTrue(postOffice.containsDestination(address3));
+      EasyMock.verify(pm, qf);
+   }
+
+   public void testPostOfficeAddAndRemoveDestinationTemporary() throws Exception
+   {
+
+      SimpleString address = new SimpleString("testAddress");
+      StorageManager pm = EasyMock.createStrictMock(StorageManager.class);
+      QueueFactory qf = EasyMock.createStrictMock(QueueFactory.class);
+      PostOffice postOffice = new PostOfficeImpl(pm, qf, true);
+      pm.loadBindings(EasyMock.eq(qf), (List<Binding>) EasyMock.anyObject(), (List<SimpleString>) EasyMock.anyObject());
+      pm.loadMessages(EasyMock.eq(postOffice), (Map<Long, Queue>) EasyMock.anyObject());
+      EasyMock.replay(pm, qf);
+      postOffice.start();
+      assertTrue(postOffice.addDestination(address, true));
+      assertTrue(postOffice.containsDestination(address));
+      postOffice.removeDestination(address, true);
+      assertNull(postOffice.getFlowController(address));
+      assertFalse(postOffice.containsDestination(address));
+      EasyMock.verify(pm, qf);
+   }
+
+   public void testPostOfficeAddAndRemoveDestinationsTemporary() throws Exception
+   {
+
+      SimpleString address = new SimpleString("testAddress");
+      SimpleString address2 = new SimpleString("testAddress2");
+      SimpleString address3 = new SimpleString("testAddress3");
+      StorageManager pm = EasyMock.createStrictMock(StorageManager.class);
+      QueueFactory qf = EasyMock.createStrictMock(QueueFactory.class);
+      PostOffice postOffice = new PostOfficeImpl(pm, qf, true);
+      pm.loadBindings(EasyMock.eq(qf), (List<Binding>) EasyMock.anyObject(), (List<SimpleString>) EasyMock.anyObject());
+      pm.loadMessages(EasyMock.eq(postOffice), (Map<Long, Queue>) EasyMock.anyObject());
+      EasyMock.replay(pm, qf);
+      postOffice.start();
+      assertTrue(postOffice.addDestination(address, true));
+      assertTrue(postOffice.addDestination(address2, true));
+      assertTrue(postOffice.addDestination(address3, true));
+      assertNotNull(postOffice.getFlowController(address));
+      assertNotNull(postOffice.getFlowController(address2));
+      assertNotNull(postOffice.getFlowController(address3));
+      assertTrue(postOffice.containsDestination(address));
+      assertTrue(postOffice.containsDestination(address2));
+      assertTrue(postOffice.containsDestination(address3));
+      postOffice.removeDestination(address, true);
+      postOffice.removeDestination(address3, true);
+      assertNull(postOffice.getFlowController(address));
+      assertFalse(postOffice.containsDestination(address));
+      assertNotNull(postOffice.getFlowController(address2));
+      assertTrue(postOffice.containsDestination(address2));
+      assertNull(postOffice.getFlowController(address3));
+      assertFalse(postOffice.containsDestination(address3));
+      EasyMock.verify(pm, qf);
+   }
+
+   public void testAddDurableBinding() throws Exception
+   {
+      SimpleString queueName = new SimpleString("testQueueName");
+      StorageManager pm = EasyMock.createStrictMock(StorageManager.class);
+      QueueFactory qf = EasyMock.createStrictMock(QueueFactory.class);
+      Filter filter = EasyMock.createStrictMock(Filter.class);
+      Queue queue = EasyMock.createStrictMock(Queue.class);
+      PostOffice postOffice = new PostOfficeImpl(pm, qf, true);
+      pm.loadBindings(EasyMock.eq(qf), (List<Binding>) EasyMock.anyObject(), (List<SimpleString>) EasyMock.anyObject());
+      pm.loadMessages(EasyMock.eq(postOffice), (Map<Long, Queue>) EasyMock.anyObject());
+      EasyMock.expect(qf.createQueue(-1, queueName, filter, true, false)).andReturn(queue);
+      EasyMock.expect(queue.getName()).andStubReturn(queueName);
+      queue.setFlowController((FlowController) EasyMock.anyObject());
+      pm.addBinding((Binding) EasyMock.anyObject());
+      EasyMock.replay(pm, qf, queue);
+      postOffice.start();
+
+      postOffice.addBinding(new SimpleString("testAddress"), queueName, filter, true, false);
+      assertNotNull(postOffice.getBinding(queueName));
+      EasyMock.verify(pm, qf, queue);
+   }
+
+   public void testAddDurableBindings() throws Exception
+   {
+      SimpleString queueName = new SimpleString("testQueueName");
+      SimpleString queueName2 = new SimpleString("testQueueName2");
+      SimpleString queueName3 = new SimpleString("testQueueName3");
+      StorageManager pm = EasyMock.createStrictMock(StorageManager.class);
+      QueueFactory qf = EasyMock.createStrictMock(QueueFactory.class);
+      Filter filter = EasyMock.createStrictMock(Filter.class);
+      Queue queue = EasyMock.createStrictMock(Queue.class);
+      Queue queue2 = EasyMock.createStrictMock(Queue.class);
+      Queue queue3 = EasyMock.createStrictMock(Queue.class);
+      PostOffice postOffice = new PostOfficeImpl(pm, qf, true);
+      pm.loadBindings(EasyMock.eq(qf), (List<Binding>) EasyMock.anyObject(), (List<SimpleString>) EasyMock.anyObject());
+      pm.loadMessages(EasyMock.eq(postOffice), (Map<Long, Queue>) EasyMock.anyObject());
+      EasyMock.expect(qf.createQueue(-1, queueName, filter, true, false)).andReturn(queue);
+      EasyMock.expect(qf.createQueue(-1, queueName2, filter, true, false)).andReturn(queue2);
+      EasyMock.expect(qf.createQueue(-1, queueName3, filter, true, false)).andReturn(queue3);
+      EasyMock.expect(queue.getName()).andStubReturn(queueName);
+      queue.setFlowController((FlowController) EasyMock.anyObject());
+      EasyMock.expect(queue2.getName()).andStubReturn(queueName2);
+      queue2.setFlowController((FlowController) EasyMock.anyObject());
+      EasyMock.expect(queue3.getName()).andStubReturn(queueName3);
+      queue3.setFlowController((FlowController) EasyMock.anyObject());
+      pm.addBinding((Binding) EasyMock.anyObject());
+      pm.addBinding((Binding) EasyMock.anyObject());
+      pm.addBinding((Binding) EasyMock.anyObject());
+      EasyMock.replay(pm, qf, queue, queue2, queue3);
+      postOffice.start();
+
+      postOffice.addBinding(new SimpleString("testAddress"), queueName, filter, true, false);
+      postOffice.addBinding(new SimpleString("testAddress2"), queueName2, filter, true, false);
+      postOffice.addBinding(new SimpleString("testAddress3"), queueName3, filter, true, false);
+      assertNotNull(postOffice.getBinding(queueName));
+      assertNotNull(postOffice.getBinding(queueName2));
+      assertNotNull(postOffice.getBinding(queueName3));
+      EasyMock.verify(pm, qf, queue, queue2, queue3);
+   }
+
+   public void testAddNonDurableBinding() throws Exception
+   {
+      SimpleString queueName = new SimpleString("testQueueName");
+      StorageManager pm = EasyMock.createStrictMock(StorageManager.class);
+      QueueFactory qf = EasyMock.createStrictMock(QueueFactory.class);
+      Filter filter = EasyMock.createStrictMock(Filter.class);
+      Queue queue = EasyMock.createStrictMock(Queue.class);
+      PostOffice postOffice = new PostOfficeImpl(pm, qf, true);
+      pm.loadBindings(EasyMock.eq(qf), (List<Binding>) EasyMock.anyObject(), (List<SimpleString>) EasyMock.anyObject());
+      pm.loadMessages(EasyMock.eq(postOffice), (Map<Long, Queue>) EasyMock.anyObject());
+      EasyMock.expect(qf.createQueue(-1, queueName, filter, false, false)).andReturn(queue);
+      EasyMock.expect(queue.getName()).andStubReturn(queueName);
+      queue.setFlowController((FlowController) EasyMock.anyObject());
+      EasyMock.replay(pm, qf, queue);
+      postOffice.start();
+
+      postOffice.addBinding(new SimpleString("testAddress"), queueName, filter, false, false);
+      assertNotNull(postOffice.getBinding(queueName));
+      EasyMock.verify(pm, qf, queue);
+   }
+
+   public void testAddNonDurableBindings() throws Exception
+   {
+      SimpleString queueName = new SimpleString("testQueueName");
+      SimpleString queueName2 = new SimpleString("testQueueName2");
+      SimpleString queueName3 = new SimpleString("testQueueName3");
+      StorageManager pm = EasyMock.createStrictMock(StorageManager.class);
+      QueueFactory qf = EasyMock.createStrictMock(QueueFactory.class);
+      Filter filter = EasyMock.createStrictMock(Filter.class);
+      Queue queue = EasyMock.createStrictMock(Queue.class);
+      Queue queue2 = EasyMock.createStrictMock(Queue.class);
+      Queue queue3 = EasyMock.createStrictMock(Queue.class);
+      PostOffice postOffice = new PostOfficeImpl(pm, qf, true);
+      pm.loadBindings(EasyMock.eq(qf), (List<Binding>) EasyMock.anyObject(), (List<SimpleString>) EasyMock.anyObject());
+      pm.loadMessages(EasyMock.eq(postOffice), (Map<Long, Queue>) EasyMock.anyObject());
+      EasyMock.expect(qf.createQueue(-1, queueName, filter, false, false)).andReturn(queue);
+      EasyMock.expect(qf.createQueue(-1, queueName2, filter, false, false)).andReturn(queue2);
+      EasyMock.expect(qf.createQueue(-1, queueName3, filter, false, false)).andReturn(queue3);
+      EasyMock.expect(queue.getName()).andStubReturn(queueName);
+      queue.setFlowController((FlowController) EasyMock.anyObject());
+      EasyMock.expect(queue2.getName()).andStubReturn(queueName2);
+      queue2.setFlowController((FlowController) EasyMock.anyObject());
+      EasyMock.expect(queue3.getName()).andStubReturn(queueName3);
+      queue3.setFlowController((FlowController) EasyMock.anyObject());
+      EasyMock.replay(pm, qf, queue, queue2, queue3);
+      postOffice.start();
+
+      postOffice.addBinding(new SimpleString("testAddress"), queueName, filter, false, false);
+      postOffice.addBinding(new SimpleString("testAddress2"), queueName2, filter, false, false);
+      postOffice.addBinding(new SimpleString("testAddress3"), queueName3, filter, false, false);
+      assertNotNull(postOffice.getBinding(queueName));
+      assertNotNull(postOffice.getBinding(queueName2));
+      assertNotNull(postOffice.getBinding(queueName3));
+      EasyMock.verify(pm, qf, queue, queue2, queue3);
+   }
+
+   public void testAddSameBindingThrowsException() throws Exception
+   {
+      SimpleString queueName = new SimpleString("testQueueName");
+      StorageManager pm = EasyMock.createStrictMock(StorageManager.class);
+      QueueFactory qf = EasyMock.createStrictMock(QueueFactory.class);
+      Filter filter = EasyMock.createStrictMock(Filter.class);
+      Queue queue = EasyMock.createStrictMock(Queue.class);
+      PostOffice postOffice = new PostOfficeImpl(pm, qf, true);
+      pm.loadBindings(EasyMock.eq(qf), (List<Binding>) EasyMock.anyObject(), (List<SimpleString>) EasyMock.anyObject());
+      pm.loadMessages(EasyMock.eq(postOffice), (Map<Long, Queue>) EasyMock.anyObject());
+      EasyMock.expect(qf.createQueue(-1, queueName, filter, true, false)).andReturn(queue);
+      EasyMock.expect(qf.createQueue(-1, queueName, filter, true, false)).andReturn(queue);
+      EasyMock.expect(queue.getName()).andStubReturn(queueName);
+      queue.setFlowController((FlowController) EasyMock.anyObject());
+      pm.addBinding((Binding) EasyMock.anyObject());
+      EasyMock.replay(pm, qf, queue);
+      postOffice.start();
+
+      postOffice.addBinding(new SimpleString("testAddress"), queueName, filter, true, false);
+      try
+      {
+         postOffice.addBinding(new SimpleString("testAddress"), queueName, filter, true, false);
+         fail("should throw exception");
+      }
+      catch (IllegalStateException e)
+      {
+         //pass
+      }
+      assertNotNull(postOffice.getBinding(queueName));
+      EasyMock.verify(pm, qf, queue);
+   }
+
+   public void testAddAndRemoveDurableBinding() throws Exception
+   {
+      SimpleString queueName = new SimpleString("testQueueName");
+      StorageManager pm = EasyMock.createStrictMock(StorageManager.class);
+      QueueFactory qf = EasyMock.createStrictMock(QueueFactory.class);
+      Filter filter = EasyMock.createStrictMock(Filter.class);
+      Queue queue = EasyMock.createStrictMock(Queue.class);
+      PostOffice postOffice = new PostOfficeImpl(pm, qf, true);
+      pm.loadBindings(EasyMock.eq(qf), (List<Binding>) EasyMock.anyObject(), (List<SimpleString>) EasyMock.anyObject());
+      pm.loadMessages(EasyMock.eq(postOffice), (Map<Long, Queue>) EasyMock.anyObject());
+      EasyMock.expect(qf.createQueue(-1, queueName, filter, true, false)).andReturn(queue);
+      EasyMock.expect(queue.getName()).andStubReturn(queueName);
+      queue.setFlowController((FlowController) EasyMock.anyObject());
+      pm.addBinding((Binding) EasyMock.anyObject());
+      EasyMock.expect(queue.isDurable()).andStubReturn(true);
+      pm.deleteBinding((Binding) EasyMock.anyObject());
+      queue.setFlowController(null);
+      EasyMock.replay(pm, qf, queue);
+      postOffice.start();
+
+      postOffice.addBinding(new SimpleString("testAddress"), queueName, filter, true, false);
+      postOffice.removeBinding(queueName);
+      assertNull(postOffice.getBinding(queueName));
+      EasyMock.verify(pm, qf, queue);
+   }
+
+   public void testAddAndRemoveDurableBindings() throws Exception
+   {
+      SimpleString queueName = new SimpleString("testQueueName");
+      SimpleString queueName2 = new SimpleString("testQueueName2");
+      SimpleString queueName3 = new SimpleString("testQueueName3");
+      StorageManager pm = EasyMock.createStrictMock(StorageManager.class);
+      QueueFactory qf = EasyMock.createStrictMock(QueueFactory.class);
+      Filter filter = EasyMock.createStrictMock(Filter.class);
+      Queue queue = EasyMock.createStrictMock(Queue.class);
+      Queue queue2 = EasyMock.createStrictMock(Queue.class);
+      Queue queue3 = EasyMock.createStrictMock(Queue.class);
+      PostOffice postOffice = new PostOfficeImpl(pm, qf, true);
+      pm.loadBindings(EasyMock.eq(qf), (List<Binding>) EasyMock.anyObject(), (List<SimpleString>) EasyMock.anyObject());
+      pm.loadMessages(EasyMock.eq(postOffice), (Map<Long, Queue>) EasyMock.anyObject());
+      EasyMock.expect(qf.createQueue(-1, queueName, filter, true, false)).andReturn(queue);
+      EasyMock.expect(qf.createQueue(-1, queueName2, filter, true, false)).andReturn(queue2);
+      EasyMock.expect(qf.createQueue(-1, queueName3, filter, true, false)).andReturn(queue3);
+      EasyMock.expect(queue.getName()).andStubReturn(queueName);
+      queue.setFlowController((FlowController) EasyMock.anyObject());
+      EasyMock.expect(queue2.getName()).andStubReturn(queueName2);
+      queue2.setFlowController((FlowController) EasyMock.anyObject());
+      EasyMock.expect(queue3.getName()).andStubReturn(queueName3);
+      queue3.setFlowController((FlowController) EasyMock.anyObject());
+      pm.addBinding((Binding) EasyMock.anyObject());
+      pm.addBinding((Binding) EasyMock.anyObject());
+      pm.addBinding((Binding) EasyMock.anyObject());
+      pm.deleteBinding((Binding) EasyMock.anyObject());
+      pm.deleteBinding((Binding) EasyMock.anyObject());
+      EasyMock.expect(queue.isDurable()).andStubReturn(true);
+      queue.setFlowController(null);
+      EasyMock.expect(queue3.isDurable()).andStubReturn(true);
+      queue3.setFlowController(null);
+      EasyMock.replay(pm, qf, queue, queue2, queue3);
+      postOffice.start();
+
+      postOffice.addBinding(new SimpleString("testAddress"), queueName, filter, true, false);
+      postOffice.addBinding(new SimpleString("testAddress2"), queueName2, filter, true, false);
+      postOffice.addBinding(new SimpleString("testAddress3"), queueName3, filter, true, false);
+      postOffice.removeBinding(queueName);
+      postOffice.removeBinding(queueName3);
+      assertNull(postOffice.getBinding(queueName));
+      assertNotNull(postOffice.getBinding(queueName2));
+      assertNull(postOffice.getBinding(queueName3));
+      EasyMock.verify(pm, qf, queue, queue2, queue3);
+   }
+
+   public void testAddAndRemoveNonDurableBinding() throws Exception
+   {
+      SimpleString queueName = new SimpleString("testQueueName");
+      StorageManager pm = EasyMock.createStrictMock(StorageManager.class);
+      QueueFactory qf = EasyMock.createStrictMock(QueueFactory.class);
+      Filter filter = EasyMock.createStrictMock(Filter.class);
+      Queue queue = EasyMock.createStrictMock(Queue.class);
+      PostOffice postOffice = new PostOfficeImpl(pm, qf, true);
+      pm.loadBindings(EasyMock.eq(qf), (List<Binding>) EasyMock.anyObject(), (List<SimpleString>) EasyMock.anyObject());
+      pm.loadMessages(EasyMock.eq(postOffice), (Map<Long, Queue>) EasyMock.anyObject());
+      EasyMock.expect(qf.createQueue(-1, queueName, filter, false, false)).andReturn(queue);
+      EasyMock.expect(queue.getName()).andStubReturn(queueName);
+      queue.setFlowController((FlowController) EasyMock.anyObject());
+      EasyMock.expect(queue.isDurable()).andStubReturn(false);
+      queue.setFlowController(null);
+      EasyMock.replay(pm, qf, queue);
+      postOffice.start();
+
+      postOffice.addBinding(new SimpleString("testAddress"), queueName, filter, false, false);
+      postOffice.removeBinding(queueName);
+      assertNull(postOffice.getBinding(queueName));
+      EasyMock.verify(pm, qf, queue);
+   }
+
+   public void testAddAndRemoveNonDurableBindings() throws Exception
+   {
+      SimpleString queueName = new SimpleString("testQueueName");
+      SimpleString queueName2 = new SimpleString("testQueueName2");
+      SimpleString queueName3 = new SimpleString("testQueueName3");
+      StorageManager pm = EasyMock.createStrictMock(StorageManager.class);
+      QueueFactory qf = EasyMock.createStrictMock(QueueFactory.class);
+      Filter filter = EasyMock.createStrictMock(Filter.class);
+      Queue queue = EasyMock.createStrictMock(Queue.class);
+      Queue queue2 = EasyMock.createStrictMock(Queue.class);
+      Queue queue3 = EasyMock.createStrictMock(Queue.class);
+      PostOffice postOffice = new PostOfficeImpl(pm, qf, true);
+      pm.loadBindings(EasyMock.eq(qf), (List<Binding>) EasyMock.anyObject(), (List<SimpleString>) EasyMock.anyObject());
+      pm.loadMessages(EasyMock.eq(postOffice), (Map<Long, Queue>) EasyMock.anyObject());
+      EasyMock.expect(qf.createQueue(-1, queueName, filter, false, false)).andReturn(queue);
+      EasyMock.expect(qf.createQueue(-1, queueName2, filter, false, false)).andReturn(queue2);
+      EasyMock.expect(qf.createQueue(-1, queueName3, filter, false, false)).andReturn(queue3);
+      EasyMock.expect(queue.getName()).andStubReturn(queueName);
+      queue.setFlowController((FlowController) EasyMock.anyObject());
+      EasyMock.expect(queue2.getName()).andStubReturn(queueName2);
+      queue2.setFlowController((FlowController) EasyMock.anyObject());
+      EasyMock.expect(queue3.getName()).andStubReturn(queueName3);
+      queue3.setFlowController((FlowController) EasyMock.anyObject());
+
+      EasyMock.expect(queue.isDurable()).andStubReturn(false);
+      queue.setFlowController(null);
+      EasyMock.expect(queue3.isDurable()).andStubReturn(false);
+      queue3.setFlowController(null);
+      EasyMock.replay(pm, qf, queue, queue2, queue3);
+      postOffice.start();
+
+      postOffice.addBinding(new SimpleString("testAddress"), queueName, filter, false, false);
+      postOffice.addBinding(new SimpleString("testAddress2"), queueName2, filter, false, false);
+      postOffice.addBinding(new SimpleString("testAddress3"), queueName3, filter, false, false);
+      postOffice.removeBinding(queueName);
+      postOffice.removeBinding(queueName3);
+      assertNull(postOffice.getBinding(queueName));
+      assertNotNull(postOffice.getBinding(queueName2));
+      assertNull(postOffice.getBinding(queueName3));
+      EasyMock.verify(pm, qf, queue, queue2, queue3);
+   }
+
+   public void testRemoveNonExistingBindingThrowsException() throws Exception
+   {
+      SimpleString queueName = new SimpleString("testQueueName");
+      StorageManager pm = EasyMock.createStrictMock(StorageManager.class);
+      QueueFactory qf = EasyMock.createStrictMock(QueueFactory.class);
+      Filter filter = EasyMock.createStrictMock(Filter.class);
+      Queue queue = EasyMock.createStrictMock(Queue.class);
+      PostOffice postOffice = new PostOfficeImpl(pm, qf, true);
+      pm.loadBindings(EasyMock.eq(qf), (List<Binding>) EasyMock.anyObject(), (List<SimpleString>) EasyMock.anyObject());
+      pm.loadMessages(EasyMock.eq(postOffice), (Map<Long, Queue>) EasyMock.anyObject());
+      EasyMock.expect(queue.getName()).andStubReturn(queueName);
+      EasyMock.expect(queue.isDurable()).andStubReturn(false);
+      EasyMock.replay(pm, qf, queue);
+      postOffice.start();
+
+      try
+      {
+         postOffice.removeBinding(queueName);
+         fail("should throw exception");
+      }
+      catch (IllegalStateException e)
+      {
+         //pass
+      }
+      assertNull(postOffice.getBinding(queueName));
+      EasyMock.verify(pm, qf, queue);
+   }
+
+   public void testPostOfficeCannotRouteThrowsException() throws Exception
+   {
+      ServerMessage message = EasyMock.createStrictMock(ServerMessage.class);
+      StorageManager pm = EasyMock.createStrictMock(StorageManager.class);
+      QueueFactory qf = EasyMock.createStrictMock(QueueFactory.class);
+      PostOffice postOffice = new PostOfficeImpl(pm, qf, true);
+      pm.loadBindings(EasyMock.eq(qf), (List<Binding>) EasyMock.anyObject(), (List<SimpleString>) EasyMock.anyObject());
+      pm.loadMessages(EasyMock.eq(postOffice), (Map<Long, Queue>) EasyMock.anyObject());
+      EasyMock.expect(message.getDestination()).andStubReturn(new SimpleString("testtDestination"));
+      EasyMock.replay(pm, qf, message);
+      postOffice.start();
+      try
+      {
+         postOffice.route(message);
+         fail("should throw exception");
+      }
+      catch (Exception e)
+      {
+         MessagingException messagingException = (MessagingException) e;
+         assertEquals(MessagingException.ADDRESS_DOES_NOT_EXIST, messagingException.getCode());
+      }
+      EasyMock.verify(pm, qf, message);
+      assertTrue(postOffice.isStarted());
+   }
+
+   public void testPostOfficeCannotRouteDoesntThrowsException() throws Exception
+   {
+      ServerMessage message = EasyMock.createStrictMock(ServerMessage.class);
+      StorageManager pm = EasyMock.createStrictMock(StorageManager.class);
+      QueueFactory qf = EasyMock.createStrictMock(QueueFactory.class);
+      PostOffice postOffice = new PostOfficeImpl(pm, qf, false);
+      pm.loadBindings(EasyMock.eq(qf), (List<Binding>) EasyMock.anyObject(), (List<SimpleString>) EasyMock.anyObject());
+      pm.loadMessages(EasyMock.eq(postOffice), (Map<Long, Queue>) EasyMock.anyObject());
+      EasyMock.expect(message.getDestination()).andStubReturn(new SimpleString("testtDestination"));
+      EasyMock.replay(pm, qf, message);
+      postOffice.start();
+      postOffice.route(message);
+      EasyMock.verify(pm, qf, message);
+      assertTrue(postOffice.isStarted());
+   }
+
+   public void testPostOfficeRouteToSingleQueueNullFilter() throws Exception
+   {
+      SimpleString queueName = new SimpleString("testQueueName");
+      ServerMessage message = EasyMock.createStrictMock(ServerMessage.class);
+      MessageReference messageReference = EasyMock.createStrictMock(MessageReference.class);
+      Queue queue = EasyMock.createStrictMock(Queue.class);
+      StorageManager pm = EasyMock.createStrictMock(StorageManager.class);
+      QueueFactory qf = EasyMock.createStrictMock(QueueFactory.class);
+      PostOffice postOffice = new PostOfficeImpl(pm, qf, false);
+      pm.loadBindings(EasyMock.eq(qf), (List<Binding>) EasyMock.anyObject(), (List<SimpleString>) EasyMock.anyObject());
+      pm.loadMessages(EasyMock.eq(postOffice), (Map<Long, Queue>) EasyMock.anyObject());
+      SimpleString address = new SimpleString("testtDestination");
+      EasyMock.expect(message.getDestination()).andStubReturn(address);
+      EasyMock.expect(qf.createQueue(-1, queueName, null, false, false)).andReturn(queue);
+      EasyMock.expect(queue.getName()).andStubReturn(queueName);
+      EasyMock.expect(queue.getFilter()).andStubReturn(null);
+      queue.setFlowController((FlowController) EasyMock.anyObject());
+      EasyMock.expect(message.createReference(queue)).andReturn(messageReference);
+      EasyMock.replay(pm, qf, message, queue, messageReference);
+      postOffice.start();
+      postOffice.addBinding(address, queueName, null, false, false);
+      List<MessageReference> references = postOffice.route(message);
+      EasyMock.verify(pm, qf, message, queue, messageReference);
+      assertTrue(postOffice.isStarted());
+      assertEquals(1, references.size());
+      assertEquals(messageReference, references.get(0));
+   }
+
+   public void testPostOfficeRouteToSingleQueueValidFilter() throws Exception
+   {
+      SimpleString queueName = new SimpleString("testQueueName");
+      Filter filter = EasyMock.createStrictMock(Filter.class);
+      ServerMessage message = EasyMock.createStrictMock(ServerMessage.class);
+      MessageReference messageReference = EasyMock.createStrictMock(MessageReference.class);
+      Queue queue = EasyMock.createStrictMock(Queue.class);
+      StorageManager pm = EasyMock.createStrictMock(StorageManager.class);
+      QueueFactory qf = EasyMock.createStrictMock(QueueFactory.class);
+      PostOffice postOffice = new PostOfficeImpl(pm, qf, false);
+      pm.loadBindings(EasyMock.eq(qf), (List<Binding>) EasyMock.anyObject(), (List<SimpleString>) EasyMock.anyObject());
+      pm.loadMessages(EasyMock.eq(postOffice), (Map<Long, Queue>) EasyMock.anyObject());
+      SimpleString address = new SimpleString("testtDestination");
+      EasyMock.expect(message.getDestination()).andStubReturn(address);
+      EasyMock.expect(qf.createQueue(-1, queueName, filter, false, false)).andReturn(queue);
+      EasyMock.expect(queue.getName()).andStubReturn(queueName);
+      EasyMock.expect(queue.getFilter()).andStubReturn(filter);
+      EasyMock.expect(filter.match(message)).andReturn(true);
+      queue.setFlowController((FlowController) EasyMock.anyObject());
+      EasyMock.expect(message.createReference(queue)).andReturn(messageReference);
+      EasyMock.replay(pm, qf, message, queue, messageReference, filter);
+      postOffice.start();
+      postOffice.addBinding(address, queueName, filter, false, false);
+      List<MessageReference> references = postOffice.route(message);
+      EasyMock.verify(pm, qf, message, queue, messageReference, filter);
+      assertTrue(postOffice.isStarted());
+      assertEquals(1, references.size());
+      assertEquals(messageReference, references.get(0));
+   }
+
+   public void testPostOfficeRouteToSingleQueueInValidFilter() throws Exception
+   {
+      SimpleString queueName = new SimpleString("testQueueName");
+      Filter filter = EasyMock.createStrictMock(Filter.class);
+      ServerMessage message = EasyMock.createStrictMock(ServerMessage.class);
+      MessageReference messageReference = EasyMock.createStrictMock(MessageReference.class);
+      Queue queue = EasyMock.createStrictMock(Queue.class);
+      StorageManager pm = EasyMock.createStrictMock(StorageManager.class);
+      QueueFactory qf = EasyMock.createStrictMock(QueueFactory.class);
+      PostOffice postOffice = new PostOfficeImpl(pm, qf, false);
+      pm.loadBindings(EasyMock.eq(qf), (List<Binding>) EasyMock.anyObject(), (List<SimpleString>) EasyMock.anyObject());
+      pm.loadMessages(EasyMock.eq(postOffice), (Map<Long, Queue>) EasyMock.anyObject());
+      SimpleString address = new SimpleString("testtDestination");
+      EasyMock.expect(message.getDestination()).andStubReturn(address);
+      EasyMock.expect(qf.createQueue(-1, queueName, filter, false, false)).andReturn(queue);
+      EasyMock.expect(queue.getName()).andStubReturn(queueName);
+      EasyMock.expect(queue.getFilter()).andStubReturn(filter);
+      EasyMock.expect(filter.match(message)).andReturn(false);
+      queue.setFlowController((FlowController) EasyMock.anyObject());
+      EasyMock.replay(pm, qf, message, queue, messageReference, filter);
+      postOffice.start();
+      postOffice.addBinding(address, queueName, filter, false, false);
+      List<MessageReference> references = postOffice.route(message);
+      EasyMock.verify(pm, qf, message, queue, messageReference, filter);
+      assertTrue(postOffice.isStarted());
+      assertEquals(0, references.size());
+   }
+
+   public void testPostOfficeRouteToMultipleQueuesNullFilter() throws Exception
+   {
+      SimpleString queueName = new SimpleString("testQueueName");
+      SimpleString queueName2 = new SimpleString("testQueueName2");
+      SimpleString queueName3 = new SimpleString("testQueueName3");
+      ServerMessage message = EasyMock.createStrictMock(ServerMessage.class);
+      MessageReference messageReference = EasyMock.createStrictMock(MessageReference.class);
+      MessageReference messageReference2 = EasyMock.createStrictMock(MessageReference.class);
+      MessageReference messageReference3 = EasyMock.createStrictMock(MessageReference.class);
+      Queue queue = EasyMock.createStrictMock(Queue.class);
+      Queue queue2 = EasyMock.createStrictMock(Queue.class);
+      Queue queue3 = EasyMock.createStrictMock(Queue.class);
+      StorageManager pm = EasyMock.createStrictMock(StorageManager.class);
+      QueueFactory qf = EasyMock.createStrictMock(QueueFactory.class);
+      PostOffice postOffice = new PostOfficeImpl(pm, qf, false);
+      pm.loadBindings(EasyMock.eq(qf), (List<Binding>) EasyMock.anyObject(), (List<SimpleString>) EasyMock.anyObject());
+      pm.loadMessages(EasyMock.eq(postOffice), (Map<Long, Queue>) EasyMock.anyObject());
+      SimpleString address = new SimpleString("testtDestination");
+      EasyMock.expect(message.getDestination()).andStubReturn(address);
+      EasyMock.expect(qf.createQueue(-1, queueName, null, false, false)).andReturn(queue);
+      EasyMock.expect(qf.createQueue(-1, queueName2, null, false, false)).andReturn(queue2);
+      EasyMock.expect(qf.createQueue(-1, queueName3, null, false, false)).andReturn(queue3);
+      EasyMock.expect(queue.getName()).andStubReturn(queueName);
+      EasyMock.expect(queue.getFilter()).andStubReturn(null);
+      EasyMock.expect(queue2.getName()).andStubReturn(queueName2);
+      EasyMock.expect(queue2.getFilter()).andStubReturn(null);
+      EasyMock.expect(queue3.getName()).andStubReturn(queueName3);
+      EasyMock.expect(queue3.getFilter()).andStubReturn(null);
+      queue.setFlowController((FlowController) EasyMock.anyObject());
+      queue2.setFlowController((FlowController) EasyMock.anyObject());
+      queue3.setFlowController((FlowController) EasyMock.anyObject());
+      EasyMock.expect(message.createReference(queue)).andReturn(messageReference);
+      EasyMock.expect(message.createReference(queue2)).andReturn(messageReference2);
+      EasyMock.expect(message.createReference(queue3)).andReturn(messageReference3);
+      EasyMock.replay(pm, qf, message, queue, queue2, queue3, messageReference);
+      postOffice.start();
+      postOffice.addBinding(address, queueName, null, false, false);
+      postOffice.addBinding(address, queueName2, null, false, false);
+      postOffice.addBinding(address, queueName3, null, false, false);
+      List<MessageReference> references = postOffice.route(message);
+      EasyMock.verify(pm, qf, message, queue, queue2, queue3, messageReference);
+      assertTrue(postOffice.isStarted());
+      assertEquals(3, references.size());
+      assertEquals(messageReference, references.get(0));
+      assertEquals(messageReference2, references.get(1));
+      assertEquals(messageReference3, references.get(2));
+   }
+
+   public void testPostOfficeRouteToMultipleQueuesMixedFilters() throws Exception
+      {
+         SimpleString queueName = new SimpleString("testQueueName");
+         SimpleString queueName2 = new SimpleString("testQueueName2");
+         SimpleString queueName3 = new SimpleString("testQueueName3");
+         Filter filter = EasyMock.createStrictMock(Filter.class);
+         Filter filter2 = EasyMock.createStrictMock(Filter.class);
+         ServerMessage message = EasyMock.createStrictMock(ServerMessage.class);
+         MessageReference messageReference = EasyMock.createStrictMock(MessageReference.class);
+         MessageReference messageReference2 = EasyMock.createStrictMock(MessageReference.class);
+         MessageReference messageReference3 = EasyMock.createStrictMock(MessageReference.class);
+         Queue queue = EasyMock.createStrictMock(Queue.class);
+         Queue queue2 = EasyMock.createStrictMock(Queue.class);
+         Queue queue3 = EasyMock.createStrictMock(Queue.class);
+         StorageManager pm = EasyMock.createStrictMock(StorageManager.class);
+         QueueFactory qf = EasyMock.createStrictMock(QueueFactory.class);
+         PostOffice postOffice = new PostOfficeImpl(pm, qf, false);
+         pm.loadBindings(EasyMock.eq(qf), (List<Binding>) EasyMock.anyObject(), (List<SimpleString>) EasyMock.anyObject());
+         pm.loadMessages(EasyMock.eq(postOffice), (Map<Long, Queue>) EasyMock.anyObject());
+         SimpleString address = new SimpleString("testtDestination");
+         EasyMock.expect(message.getDestination()).andStubReturn(address);
+         EasyMock.expect(qf.createQueue(-1, queueName, null, false, false)).andReturn(queue);
+         EasyMock.expect(qf.createQueue(-1, queueName2, null, false, false)).andReturn(queue2);
+         EasyMock.expect(qf.createQueue(-1, queueName3, null, false, false)).andReturn(queue3);
+         EasyMock.expect(queue.getName()).andStubReturn(queueName);
+         EasyMock.expect(queue.getFilter()).andStubReturn(filter);
+         EasyMock.expect(queue2.getName()).andStubReturn(queueName2);
+         EasyMock.expect(queue2.getFilter()).andStubReturn(null);
+         EasyMock.expect(queue3.getName()).andStubReturn(queueName3);
+         EasyMock.expect(queue3.getFilter()).andStubReturn(filter2);
+         EasyMock.expect(filter.match(message)).andReturn(false);
+         EasyMock.expect(filter2.match(message)).andReturn(true);
+         queue.setFlowController((FlowController) EasyMock.anyObject());
+         queue2.setFlowController((FlowController) EasyMock.anyObject());
+         queue3.setFlowController((FlowController) EasyMock.anyObject());
+         EasyMock.expect(message.createReference(queue2)).andReturn(messageReference2);
+         EasyMock.expect(message.createReference(queue3)).andReturn(messageReference3);
+         EasyMock.replay(pm, qf, message, queue, queue2, queue3, messageReference, filter, filter2);
+         postOffice.start();
+         postOffice.addBinding(address, queueName, null, false, false);
+         postOffice.addBinding(address, queueName2, null, false, false);
+         postOffice.addBinding(address, queueName3, null, false, false);
+         List<MessageReference> references = postOffice.route(message);
+         EasyMock.verify(pm, qf, message, queue, queue2, queue3, messageReference, filter, filter2);
+         assertTrue(postOffice.isStarted());
+         assertEquals(2, references.size());
+         assertEquals(messageReference2, references.get(0));
+         assertEquals(messageReference3, references.get(1));
+      }
+
+
+   class FakeFilter implements Filter
+   {
+      public SimpleString getFilterString()
+      {
+         return new SimpleString("aardvark");
+      }
+
+      public boolean match(ServerMessage message)
+      {
+         return true;
+      }
+
+   }
+
+   class LoadBindingsIAnswer implements IAnswer
+   {
+      List<Binding> bindings;
+      List<SimpleString> dests;
+
+      public LoadBindingsIAnswer(List<Binding> bindings, List<SimpleString> dests)
+      {
+         this.bindings = bindings;
+         this.dests = dests;
+      }
+
+      public Object answer() throws Throwable
+      {
+         if (this.bindings != null)
+         {
+            List<Binding> bindings = (List<Binding>) EasyMock.getCurrentArguments()[1];
+            bindings.addAll(this.bindings);
+         }
+         if (this.dests != null)
+         {
+            List<SimpleString> dests = (List<SimpleString>) EasyMock.getCurrentArguments()[2];
+            dests.addAll(this.dests);
+         }
+         return null;
+      }
+   }
+}

Deleted: trunk/tests/src/org/jboss/messaging/tests/unit/core/postoffice/impl/PostOfficeTest.java
===================================================================
--- trunk/tests/src/org/jboss/messaging/tests/unit/core/postoffice/impl/PostOfficeTest.java	2008-06-23 11:02:48 UTC (rev 4549)
+++ trunk/tests/src/org/jboss/messaging/tests/unit/core/postoffice/impl/PostOfficeTest.java	2008-06-23 11:11:45 UTC (rev 4550)
@@ -1,610 +0,0 @@
-/*
- * 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.postoffice.impl;
-
-import org.easymock.EasyMock;
-import org.easymock.IAnswer;
-import org.jboss.messaging.core.filter.Filter;
-import org.jboss.messaging.core.persistence.StorageManager;
-import org.jboss.messaging.core.postoffice.Binding;
-import org.jboss.messaging.core.postoffice.FlowController;
-import org.jboss.messaging.core.postoffice.PostOffice;
-import org.jboss.messaging.core.postoffice.impl.BindingImpl;
-import org.jboss.messaging.core.postoffice.impl.PostOfficeImpl;
-import org.jboss.messaging.core.server.Queue;
-import org.jboss.messaging.core.server.QueueFactory;
-import org.jboss.messaging.core.server.ServerMessage;
-import org.jboss.messaging.tests.unit.core.server.impl.fakes.FakeQueueFactory;
-import org.jboss.messaging.tests.util.UnitTestCase;
-import org.jboss.messaging.util.SimpleString;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * A PostOfficeTest
- *
- * @author <a href="mailto:tim.fox at jboss.com">Tim Fox</a>
- */
-public class PostOfficeTest extends UnitTestCase
-{
-   private QueueFactory queueFactory = new FakeQueueFactory();
-
-   public void testPostOfficeStart() throws Exception
-   {
-      StorageManager pm = EasyMock.createStrictMock(StorageManager.class);
-      QueueFactory qf = EasyMock.createStrictMock(QueueFactory.class);
-      PostOffice postOffice = new PostOfficeImpl(pm, qf, true);
-      pm.loadBindings(EasyMock.eq(qf), (List<Binding>) EasyMock.anyObject(), (List<SimpleString>) EasyMock.anyObject());
-      pm.loadMessages(EasyMock.eq(postOffice), (Map<Long, Queue>) EasyMock.anyObject());
-      EasyMock.replay(pm, qf);
-      postOffice.start();
-      EasyMock.verify(pm, qf);
-      assertTrue(postOffice.isStarted());
-   }
-
-   public void testPostOfficeStartedAndBindingLoaded() throws Exception
-   {
-      Binding binding = EasyMock.createStrictMock(Binding.class);
-      ArrayList<Binding> bindingArrayList = new ArrayList<Binding>();
-      bindingArrayList.add(binding);
-
-      Queue queue = EasyMock.createStrictMock(Queue.class);
-      StorageManager pm = EasyMock.createStrictMock(StorageManager.class);
-      QueueFactory qf = EasyMock.createStrictMock(QueueFactory.class);
-
-      SimpleString address1 = new SimpleString("testAddress1");
-      EasyMock.expect(binding.getAddress()).andStubReturn(address1);
-      EasyMock.expect(binding.getQueue()).andStubReturn(queue);
-      SimpleString queueName = new SimpleString("testQueueName1");
-      EasyMock.expect(queue.getName()).andStubReturn(queueName);
-      queue.setFlowController(null);
-      EasyMock.expect(queue.getPersistenceID()).andStubReturn(1);
-      PostOffice postOffice = new PostOfficeImpl(pm, qf, true);
-      pm.loadBindings(EasyMock.eq(qf), (List<Binding>) EasyMock.anyObject(), (List<SimpleString>) EasyMock.anyObject());
-      EasyMock.expectLastCall().andAnswer(new LoadBindingsIAnswer(bindingArrayList, null));
-      pm.loadMessages(EasyMock.eq(postOffice), (Map<Long, Queue>) EasyMock.anyObject());
-
-      EasyMock.replay(pm, qf, binding, queue);
-
-      postOffice.start();
-
-      EasyMock.verify(pm, qf, binding, queue);
-
-      assertTrue(postOffice.isStarted());
-      assertEquals(postOffice.getBinding(queueName), binding);
-      assertEquals(postOffice.getBindingsForAddress(address1).size(), 1);
-   }
-
-   public void testPostOfficeStartedAndBindingsLoadedDifferentAddress() throws Exception
-   {
-      ArrayList<Binding> bindingArrayList = new ArrayList<Binding>();
-
-      Binding[] bindings = new Binding[1000];
-      Queue[] queues = new Queue[1000];
-      SimpleString[] addresses = new SimpleString[1000];
-      SimpleString[] queueNames = new SimpleString[1000];
-      for (int i = 0; i < 1000; i++)
-      {
-         bindings[i] = EasyMock.createStrictMock(Binding.class);
-         bindingArrayList.add(bindings[i]);
-         queues[i] = EasyMock.createStrictMock(Queue.class);
-         addresses[i] = new SimpleString("testAddress" + i);
-         queueNames[i] = new SimpleString("testQueueName" + i);
-         EasyMock.expect(bindings[i].getAddress()).andStubReturn(addresses[i]);
-         EasyMock.expect(bindings[i].getQueue()).andStubReturn(queues[i]);
-         EasyMock.expect(queues[i].getName()).andStubReturn(queueNames[i]);
-         queues[i].setFlowController(null);
-         EasyMock.expect(queues[i].getPersistenceID()).andStubReturn(i + 1);
-         EasyMock.replay(bindings[i], queues[i]);
-      }
-
-
-      StorageManager pm = EasyMock.createStrictMock(StorageManager.class);
-      QueueFactory qf = EasyMock.createStrictMock(QueueFactory.class);
-
-
-      PostOffice postOffice = new PostOfficeImpl(pm, qf, true);
-      pm.loadBindings(EasyMock.eq(qf), (List<Binding>) EasyMock.anyObject(), (List<SimpleString>) EasyMock.anyObject());
-      EasyMock.expectLastCall().andAnswer(new LoadBindingsIAnswer(bindingArrayList, null));
-      pm.loadMessages(EasyMock.eq(postOffice), (Map<Long, Queue>) EasyMock.anyObject());
-
-      EasyMock.replay(pm, qf);
-
-      postOffice.start();
-
-      EasyMock.verify(pm, qf);
-
-      assertTrue(postOffice.isStarted());
-      for (int i = 0; i < 1000; i++)
-      {
-         assertEquals(postOffice.getBinding(queueNames[i]), bindings[i]);
-         assertEquals(postOffice.getBindingsForAddress(addresses[i]).size(), 1);
-      }
-   }
-
-   public void testPostOfficeStartedAndTwoBindingSameLoadedThrowsException() throws Exception
-   {
-      Binding binding = EasyMock.createStrictMock(Binding.class);
-      Binding binding2 = EasyMock.createStrictMock(Binding.class);
-      ArrayList<Binding> bindingArrayList = new ArrayList<Binding>();
-      bindingArrayList.add(binding);
-      bindingArrayList.add(binding2);
-      Queue queue = EasyMock.createStrictMock(Queue.class);
-      StorageManager pm = EasyMock.createStrictMock(StorageManager.class);
-      QueueFactory qf = EasyMock.createStrictMock(QueueFactory.class);
-
-      SimpleString address1 = new SimpleString("testAddress1");
-      EasyMock.expect(binding.getAddress()).andStubReturn(address1);
-      EasyMock.expect(binding.getQueue()).andStubReturn(queue);
-      EasyMock.expect(binding2.getAddress()).andStubReturn(address1);
-      EasyMock.expect(binding2.getQueue()).andStubReturn(queue);
-      SimpleString queueName = new SimpleString("testQueueName1");
-      EasyMock.expect(queue.getName()).andStubReturn(queueName);
-      queue.setFlowController(null);
-      EasyMock.expect(queue.getPersistenceID()).andStubReturn(1);
-      PostOffice postOffice = new PostOfficeImpl(pm, qf, true);
-      pm.loadBindings(EasyMock.eq(qf), (List<Binding>) EasyMock.anyObject(), (List<SimpleString>) EasyMock.anyObject());
-      EasyMock.expectLastCall().andAnswer(new LoadBindingsIAnswer(bindingArrayList,null));
-
-      EasyMock.replay(pm, qf, binding, binding2, queue);
-
-      try
-      {
-         postOffice.start();
-      }
-      catch (IllegalStateException e)
-      {
-         e.printStackTrace();
-      }
-
-      EasyMock.verify(pm, qf, binding, binding2, queue);
-
-      assertFalse(postOffice.isStarted());
-   }
-
-   public void testPostOfficeStartedAndBindingsLoadedSameAddress() throws Exception
-   {
-      ArrayList<Binding> bindingArrayList = new ArrayList<Binding>();
-
-      Binding[] bindings = new Binding[1000];
-      Queue[] queues = new Queue[1000];
-      SimpleString address = new SimpleString("testAddress");
-      SimpleString[] queueNames = new SimpleString[1000];
-      for (int i = 0; i < 1000; i++)
-      {
-         bindings[i] = EasyMock.createStrictMock(Binding.class);
-         bindingArrayList.add(bindings[i]);
-         queues[i] = EasyMock.createStrictMock(Queue.class);
-         queueNames[i] = new SimpleString("testQueueName" + i);
-         EasyMock.expect(bindings[i].getAddress()).andStubReturn(address);
-         EasyMock.expect(bindings[i].getQueue()).andStubReturn(queues[i]);
-         EasyMock.expect(queues[i].getName()).andStubReturn(queueNames[i]);
-         queues[i].setFlowController(null);
-         EasyMock.expect(queues[i].getPersistenceID()).andStubReturn(i + 1);
-         EasyMock.replay(bindings[i], queues[i]);
-      }
-
-
-      StorageManager pm = EasyMock.createStrictMock(StorageManager.class);
-      QueueFactory qf = EasyMock.createStrictMock(QueueFactory.class);
-
-
-      PostOffice postOffice = new PostOfficeImpl(pm, qf, true);
-      pm.loadBindings(EasyMock.eq(qf), (List<Binding>) EasyMock.anyObject(), (List<SimpleString>) EasyMock.anyObject());
-      EasyMock.expectLastCall().andAnswer(new LoadBindingsIAnswer(bindingArrayList, null));
-      pm.loadMessages(EasyMock.eq(postOffice), (Map<Long, Queue>) EasyMock.anyObject());
-
-      EasyMock.replay(pm, qf);
-
-      postOffice.start();
-
-      EasyMock.verify(pm, qf);
-
-      assertTrue(postOffice.isStarted());
-      for (int i = 0; i < 1000; i++)
-      {
-         assertEquals(postOffice.getBinding(queueNames[i]), bindings[i]);
-         assertEquals(postOffice.getBindingsForAddress(address).size(), 1000);
-      }
-   }
-
-   public void testPostOfficeStartedAndBindingLoadedAndDestination() throws Exception
-   {
-      Binding binding = EasyMock.createStrictMock(Binding.class);
-      ArrayList<Binding> bindingArrayList = new ArrayList<Binding>();
-      bindingArrayList.add(binding);
-      List<SimpleString> dests = new ArrayList<SimpleString>();
-      Queue queue = EasyMock.createStrictMock(Queue.class);
-      StorageManager pm = EasyMock.createStrictMock(StorageManager.class);
-      QueueFactory qf = EasyMock.createStrictMock(QueueFactory.class);
-
-      SimpleString address1 = new SimpleString("testAddress1");
-      dests.add(address1);
-      EasyMock.expect(binding.getAddress()).andStubReturn(address1);
-      EasyMock.expect(binding.getQueue()).andStubReturn(queue);
-      SimpleString queueName = new SimpleString("testQueueName1");
-      EasyMock.expect(queue.getName()).andStubReturn(queueName);
-      queue.setFlowController((FlowController) EasyMock.anyObject());
-      EasyMock.expect(queue.getPersistenceID()).andStubReturn(1);
-      PostOffice postOffice = new PostOfficeImpl(pm, qf, true);
-      pm.loadBindings(EasyMock.eq(qf), (List<Binding>) EasyMock.anyObject(), (List<SimpleString>) EasyMock.anyObject());
-      EasyMock.expectLastCall().andAnswer(new LoadBindingsIAnswer(bindingArrayList, dests));
-      EasyMock.expect(pm.addDestination(address1)).andReturn(true);
-      pm.loadMessages(EasyMock.eq(postOffice), (Map<Long, Queue>) EasyMock.anyObject());
-
-      EasyMock.replay(pm, qf, binding, queue);
-
-      postOffice.start();
-
-      EasyMock.verify(pm, qf, binding, queue);
-
-      assertTrue(postOffice.isStarted());
-      assertEquals(postOffice.getBinding(queueName), binding);
-      assertEquals(postOffice.getBindingsForAddress(address1).size(), 1);
-      assertTrue(postOffice.containsDestination(address1));
-   }
-
-   public void testPostOfficeStartedAndBindingLoadedAndDestinations() throws Exception
-   {
-
-      StorageManager pm = EasyMock.createStrictMock(StorageManager.class);
-      QueueFactory qf = EasyMock.createStrictMock(QueueFactory.class);
-      PostOffice postOffice = new PostOfficeImpl(pm, qf, true);
-      ArrayList<Binding> bindingArrayList = new ArrayList<Binding>();
-      List<SimpleString> dests = new ArrayList<SimpleString>();
-      Binding[] bindings = new Binding[1000];
-      Queue[] queues = new Queue[1000];
-      SimpleString[] addresses = new SimpleString[1000];
-      SimpleString[] queueNames = new SimpleString[1000];
-      for (int i = 0; i < 1000; i++)
-      {
-         bindings[i] = EasyMock.createStrictMock(Binding.class);
-         bindingArrayList.add(bindings[i]);
-         queues[i] = EasyMock.createStrictMock(Queue.class);
-         addresses[i] = new SimpleString("testAddress" + i);
-         queueNames[i] = new SimpleString("testQueueName" + i);
-         EasyMock.expect(bindings[i].getAddress()).andStubReturn(addresses[i]);
-         EasyMock.expect(bindings[i].getQueue()).andStubReturn(queues[i]);
-         EasyMock.expect(queues[i].getName()).andStubReturn(queueNames[i]);
-         queues[i].setFlowController((FlowController) EasyMock.anyObject());
-         EasyMock.expect(queues[i].getPersistenceID()).andStubReturn(i + 1);
-         EasyMock.replay(bindings[i], queues[i]);
-         dests.add(addresses[i]);
-      }
-
-
-
-      pm.loadBindings(EasyMock.eq(qf), (List<Binding>) EasyMock.anyObject(), (List<SimpleString>) EasyMock.anyObject());
-      EasyMock.expectLastCall().andAnswer(new LoadBindingsIAnswer(bindingArrayList, dests));
-      for (int i = 0; i < 1000; i++)
-      {
-         EasyMock.expect(pm.addDestination(addresses[i])).andReturn(true);
-      }
-      pm.loadMessages(EasyMock.eq(postOffice), (Map<Long, Queue>) EasyMock.anyObject());
-
-      EasyMock.replay(pm, qf);
-
-      postOffice.start();
-
-      EasyMock.verify(pm, qf);
-
-      assertTrue(postOffice.isStarted());
-      for (int i = 0; i < 1000; i++)
-      {
-         assertEquals(postOffice.getBinding(queueNames[i]), bindings[i]);
-         assertEquals(postOffice.getBindingsForAddress(addresses[i]).size(), 1);
-         assertTrue(postOffice.containsDestination(addresses[i]));
-      }
-   }
-
-   public void testListDestinations() throws Exception
-   {
-
-      StorageManager pm = EasyMock.createStrictMock(StorageManager.class);
-      QueueFactory qf = EasyMock.createStrictMock(QueueFactory.class);
-      PostOffice postOffice = new PostOfficeImpl(pm, qf, true);
-      ArrayList<Binding> bindingArrayList = new ArrayList<Binding>();
-      List<SimpleString> dests = new ArrayList<SimpleString>();
-      Binding[] bindings = new Binding[1000];
-      Queue[] queues = new Queue[1000];
-      SimpleString[] addresses = new SimpleString[1000];
-      SimpleString[] queueNames = new SimpleString[1000];
-      for (int i = 0; i < 1000; i++)
-      {
-         bindings[i] = EasyMock.createStrictMock(Binding.class);
-         bindingArrayList.add(bindings[i]);
-         queues[i] = EasyMock.createStrictMock(Queue.class);
-         addresses[i] = new SimpleString("testAddress" + i);
-         queueNames[i] = new SimpleString("testQueueName" + i);
-         EasyMock.expect(bindings[i].getAddress()).andStubReturn(addresses[i]);
-         EasyMock.expect(bindings[i].getQueue()).andStubReturn(queues[i]);
-         EasyMock.expect(queues[i].getName()).andStubReturn(queueNames[i]);
-         queues[i].setFlowController((FlowController) EasyMock.anyObject());
-         EasyMock.expect(queues[i].getPersistenceID()).andStubReturn(i + 1);
-         EasyMock.replay(bindings[i], queues[i]);
-         dests.add(addresses[i]);
-      }
-
-
-
-      pm.loadBindings(EasyMock.eq(qf), (List<Binding>) EasyMock.anyObject(), (List<SimpleString>) EasyMock.anyObject());
-      EasyMock.expectLastCall().andAnswer(new LoadBindingsIAnswer(bindingArrayList, dests));
-      for (int i = 0; i < 1000; i++)
-      {
-         EasyMock.expect(pm.addDestination(addresses[i])).andReturn(true);
-      }
-      pm.loadMessages(EasyMock.eq(postOffice), (Map<Long, Queue>) EasyMock.anyObject());
-
-      EasyMock.replay(pm, qf);
-
-      postOffice.start();
-      Set<SimpleString> allDests = postOffice.listAllDestinations();
-      EasyMock.verify(pm, qf);
-
-      for (SimpleString dest : allDests)
-      {
-         assertTrue(dests.remove(dest));
-      }
-      assertTrue(dests.size() == 0);
-   }
-
-   public void testAddQueue() throws Exception
-   {
-      StorageManager pm = EasyMock.createStrictMock(StorageManager.class);
-
-      QueueFactory qf = EasyMock.createStrictMock(QueueFactory.class);
-
-      PostOffice po = new PostOfficeImpl(pm, qf, false);
-
-      final long id = 324;
-      final SimpleString name = new SimpleString("wibb22");
-      final Filter filter = new FakeFilter();
-      final boolean durable = true;
-      final boolean temporary = true;
-
-      Queue queue = queueFactory.createQueue(id, name, filter, durable, temporary);
-
-      EasyMock.expect(qf.createQueue(-1, name, filter, durable, temporary)).andReturn(queue);
-
-      final SimpleString condition = new SimpleString("queue.wibble");
-
-      Binding expected = new BindingImpl(condition, queue);
-
-      pm.addBinding(EasyMock.eq(expected));
-
-      EasyMock.replay(qf);
-
-      EasyMock.replay(pm);
-
-      po.addBinding(condition, name, filter, durable, temporary);
-
-      EasyMock.verify(qf);
-
-      EasyMock.verify(pm);
-
-      EasyMock.reset(qf);
-
-      EasyMock.reset(pm);
-
-      final boolean durable2 = false;
-
-      queue = queueFactory.createQueue(id, name, filter, durable2, temporary);
-
-      EasyMock.expect(qf.createQueue(-1, name, filter, durable2, temporary)).andReturn(queue);
-
-      EasyMock.replay(qf);
-
-      EasyMock.replay(pm);
-   }
-
-   public void testRemoveQueue() throws Exception
-   {
-      StorageManager pm = EasyMock.createStrictMock(StorageManager.class);
-
-      QueueFactory qf = EasyMock.createStrictMock(QueueFactory.class);
-
-      PostOffice po = new PostOfficeImpl(pm, qf, false);
-
-      final long id = 324;
-      final SimpleString name = new SimpleString("wibb22");
-      final Filter filter = new FakeFilter();
-      final boolean durable = true;
-      final boolean temporary = true;
-
-      Queue queue = queueFactory.createQueue(id, name, filter, durable, temporary);
-
-      EasyMock.expect(qf.createQueue(-1, name, filter, durable, temporary)).andReturn(queue);
-
-      final SimpleString condition = new SimpleString("queue.wibble");
-
-      Binding expected = new BindingImpl(condition, queue);
-
-      pm.addBinding(EasyMock.eq(expected));
-
-      pm.deleteBinding(EasyMock.eq(expected));
-
-      EasyMock.replay(qf);
-
-      EasyMock.replay(pm);
-
-      po.addBinding(condition, name, filter, durable, temporary);
-
-      po.removeBinding(name);
-
-      EasyMock.verify(qf);
-
-      EasyMock.verify(pm);
-
-      EasyMock.reset(qf);
-
-      EasyMock.reset(pm);
-
-      final boolean durable2 = false;
-
-      queue = queueFactory.createQueue(id, name, filter, durable2, temporary);
-
-      EasyMock.expect(qf.createQueue(-1, name, filter, durable2, temporary)).andReturn(queue);
-
-      EasyMock.replay(qf);
-
-      EasyMock.replay(pm);
-
-      po.addBinding(condition, name, filter, durable2, temporary);
-
-      po.removeBinding(name);
-
-      EasyMock.verify(qf);
-
-      EasyMock.verify(pm);
-   }
-
-   public void testAddRemoveMultipleWithDifferentConditions() throws Exception
-   {
-      StorageManager pm = EasyMock.createStrictMock(StorageManager.class);
-
-      QueueFactory qf = new FakeQueueFactory();
-
-      PostOffice po = new PostOfficeImpl(pm, qf, false);
-
-      final SimpleString condition1 = new SimpleString("queue.wibble");
-
-      SimpleString squeue1 = new SimpleString("queue1");
-      SimpleString squeue2 = new SimpleString("queue2");
-      SimpleString squeue3 = new SimpleString("queue3");
-      SimpleString squeue4 = new SimpleString("queue4");
-      SimpleString squeue5 = new SimpleString("queue5");
-      SimpleString squeue6 = new SimpleString("queue6");
-
-      po.addBinding(condition1, squeue1, null, false, false);
-      Map<SimpleString, List<Binding>> mappings = po.getMappings();
-      assertEquals(1, mappings.size());
-
-      po.addBinding(condition1, squeue2, null, false, false);
-      mappings = po.getMappings();
-      assertEquals(1, mappings.size());
-
-      po.addBinding(condition1, squeue3, null, false, false);
-      mappings = po.getMappings();
-      assertEquals(1, mappings.size());
-
-      List<Binding> bindings = mappings.get(condition1);
-      assertNotNull(bindings);
-      assertEquals(3, bindings.size());
-
-      Binding binding1 = bindings.get(0);
-      Queue queue1 = binding1.getQueue();
-      assertEquals(squeue1, queue1.getName());
-
-      Binding binding2 = bindings.get(1);
-      Queue queue2 = binding2.getQueue();
-      assertEquals(squeue2, queue2.getName());
-
-      Binding binding3 = bindings.get(2);
-      Queue queue3 = binding3.getQueue();
-      assertEquals(squeue3, queue3.getName());
-
-      final SimpleString condition2 = new SimpleString("queue.wibble2");
-
-      po.addBinding(condition2, squeue4, null, false, false);
-      mappings = po.getMappings();
-      assertEquals(2, mappings.size());
-
-      po.addBinding(condition2, squeue5, null, false, false);
-      mappings = po.getMappings();
-      assertEquals(2, mappings.size());
-
-      final SimpleString condition3 = new SimpleString("topic.wibblexyz");
-
-      po.addBinding(condition3, squeue6, null, false, false);
-      mappings = po.getMappings();
-      assertEquals(3, mappings.size());
-
-      po.removeBinding(squeue6);
-      mappings = po.getMappings();
-      assertEquals(2, mappings.size());
-
-      po.removeBinding(squeue4);
-      mappings = po.getMappings();
-      assertEquals(2, mappings.size());
-
-      po.removeBinding(squeue5);
-      mappings = po.getMappings();
-      assertEquals(1, mappings.size());
-
-      po.removeBinding(squeue1);
-      mappings = po.getMappings();
-      assertEquals(1, mappings.size());
-
-      po.removeBinding(squeue2);
-      mappings = po.getMappings();
-      assertEquals(1, mappings.size());
-
-      po.removeBinding(squeue3);
-      mappings = po.getMappings();
-      assertEquals(0, mappings.size());
-   }
-
-   class FakeFilter implements Filter
-   {
-      public SimpleString getFilterString()
-      {
-         return new SimpleString("aardvark");
-      }
-
-      public boolean match(ServerMessage message)
-      {
-         return true;
-      }
-
-   }
-
-   class LoadBindingsIAnswer implements IAnswer
-   {
-      List<Binding> bindings;
-      List<SimpleString> dests;
-
-      public LoadBindingsIAnswer(List<Binding> bindings, List<SimpleString> dests)
-      {
-         this.bindings = bindings;
-         this.dests = dests;
-      }
-
-      public Object answer() throws Throwable
-      {
-         if (this.bindings != null)
-         {
-            List<Binding> bindings = (List<Binding>) EasyMock.getCurrentArguments()[1];
-            bindings.addAll(this.bindings);
-         }
-         if(this.dests != null)
-         {
-            List<SimpleString> dests = (List<SimpleString>) EasyMock.getCurrentArguments()[2];
-            dests.addAll(this.dests);
-         }
-         return null;
-      }
-   }
-}




More information about the jboss-cvs-commits mailing list