Author: gsim
Date: Mon Apr 23 20:58:00 2012
New Revision: 1329438

URL: http://svn.apache.org/viewvc?rev=1329438&view=rev
Log:
QPID-3970: Check alternate exchange actually exists before proceeding with 
reroute request

Modified:
    qpid/trunk/qpid/cpp/src/qpid/broker/Queue.cpp
    qpid/trunk/qpid/tests/src/py/qpid_tests/broker_0_10/management.py

Modified: qpid/trunk/qpid/cpp/src/qpid/broker/Queue.cpp
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/broker/Queue.cpp?rev=1329438&r1=1329437&r2=1329438&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/broker/Queue.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/broker/Queue.cpp Mon Apr 23 20:58:00 2012
@@ -1625,9 +1625,14 @@ Manageable::status_t Queue::ManagementMe
         {
             _qmf::ArgsQueueReroute& rerouteArgs = (_qmf::ArgsQueueReroute&) 
args;
             boost::shared_ptr<Exchange> dest;
-            if (rerouteArgs.i_useAltExchange)
+            if (rerouteArgs.i_useAltExchange) {
+                if (!alternateExchange) {
+                    status = Manageable::STATUS_PARAMETER_INVALID;
+                    etext = "No alternate-exchange defined";
+                    break;
+                }
                 dest = alternateExchange;
-            else {
+            } else {
                 try {
                     dest = broker->getExchanges().get(rerouteArgs.i_exchange);
                 } catch(const std::exception&) {

Modified: qpid/trunk/qpid/tests/src/py/qpid_tests/broker_0_10/management.py
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/tests/src/py/qpid_tests/broker_0_10/management.py?rev=1329438&r1=1329437&r2=1329438&view=diff
==============================================================================
--- qpid/trunk/qpid/tests/src/py/qpid_tests/broker_0_10/management.py (original)
+++ qpid/trunk/qpid/tests/src/py/qpid_tests/broker_0_10/management.py Mon Apr 
23 20:58:00 2012
@@ -385,6 +385,30 @@ class ManagementTest (TestBase010):
         # Cleanup
         for e in ["A", "B"]: session.exchange_delete(exchange=e)
 
+    def test_reroute_invalid_alt_exchange(self):
+        """
+        Test that an error is returned for an attempt to reroute to
+        alternate exchange on a queue for which no such exchange has
+        been defined.
+        """
+        self.startQmf()
+        session = self.session
+        # create queue with no alt-exchange, and send a message to it
+        session.queue_declare(queue="q", exclusive=True, auto_delete=True)
+        props = session.delivery_properties(routing_key="q")
+        session.message_transfer(message=Message(props, "don't reroute me!"))
+
+        # attempt to reroute the message to alt-exchange
+        q = self.qmf.getObjects(_class="queue", name="q")[0]
+        result = q.reroute(1, True, "", {})
+        # verify the attempt fails...
+        self.assertEqual(result.status, 4) #invalid parameter
+
+        # ...and message is still on the queue
+        self.subscribe(destination="d", queue="q")
+        self.assertEqual("don't reroute me!", 
session.incoming("d").get(timeout=1).body)
+
+
     def test_methods_async (self):
         """
         """



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to