You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by gs...@apache.org on 2008/03/11 13:24:51 UTC
svn commit: r635898 - in /incubator/qpid/trunk/qpid: cpp/src/qpid/broker/
python/ python/tests_0-10/
Author: gsim
Date: Tue Mar 11 05:24:46 2008
New Revision: 635898
URL: http://svn.apache.org/viewvc?rev=635898&view=rev
Log:
Fixed broker to take application headers from final format message-properties struct
Fixed headers exchange to recognise x-match even if sent as a string other than 32 bit sized
Converted remaining python exchange tests
Modified:
incubator/qpid/trunk/qpid/cpp/src/qpid/broker/HeadersExchange.cpp
incubator/qpid/trunk/qpid/cpp/src/qpid/broker/HeadersExchange.h
incubator/qpid/trunk/qpid/cpp/src/qpid/broker/MessageAdapter.cpp
incubator/qpid/trunk/qpid/cpp/src/qpid/broker/MessageAdapter.h
incubator/qpid/trunk/qpid/python/cpp_failing_0-10.txt
incubator/qpid/trunk/qpid/python/tests_0-10/exchange.py
Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/broker/HeadersExchange.cpp
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/broker/HeadersExchange.cpp?rev=635898&r1=635897&r2=635898&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/broker/HeadersExchange.cpp (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/broker/HeadersExchange.cpp Tue Mar 11 05:24:46 2008
@@ -21,6 +21,7 @@
#include "HeadersExchange.h"
#include "qpid/framing/FieldValue.h"
#include "qpid/framing/reply_exceptions.h"
+#include "qpid/log/Statement.h"
#include <algorithm>
@@ -35,9 +36,10 @@
using namespace qpid::broker;
namespace {
- const StringValue all("all");
- const StringValue any("any");
+ const std::string all("all");
+ const std::string any("any");
const std::string x_match("x-match");
+ const std::string empty;
}
HeadersExchange::HeadersExchange(const string& _name, Manageable* _parent) :
@@ -55,11 +57,27 @@
mgmtExchange->set_type (typeName);
}
+std::string HeadersExchange::getMatch(const FieldTable* args)
+{
+ if (!args) {
+ throw InternalErrorException(QPID_MSG("No arguments given."));
+ }
+ FieldTable::ValuePtr what = args->get(x_match);
+ if (!what) {
+ return empty;
+ }
+ if (!what->convertsTo<std::string>()) {
+ throw InternalErrorException(QPID_MSG("Invalid x-match value binding to headers exchange."));
+ }
+ return what->get<std::string>();
+}
+
bool HeadersExchange::bind(Queue::shared_ptr queue, const string& /*routingKey*/, const FieldTable* args){
RWlock::ScopedWlock locker(lock);
- FieldTable::ValuePtr what = args->get(x_match);
- if (!what || (*what != all && *what != any))
+ std::string what = getMatch(args);
+ if (what != all && what != any)
throw InternalErrorException(QPID_MSG("Invalid x-match value binding to headers exchange."));
+
Bindings::iterator i;
for (i = bindings.begin(); i != bindings.end(); i++)
@@ -100,6 +118,8 @@
void HeadersExchange::route(Deliverable& msg, const string& /*routingKey*/, const FieldTable* args){
+ if (!args) return;//can't match if there were no headers passed in
+
RWlock::ScopedRlock locker(lock);
uint32_t count(0);
@@ -153,10 +173,8 @@
bool HeadersExchange::match(const FieldTable& bind, const FieldTable& msg) {
typedef FieldTable::ValueMap Map;
- FieldTable::ValuePtr what = bind.get(x_match);
- if (!what) {
- return false;
- } else if (*what == all) {
+ std::string what = getMatch(&bind);
+ if (what == all) {
for (Map::const_iterator i = bind.begin();
i != bind.end();
++i)
@@ -169,7 +187,7 @@
}
}
return true;
- } else if (*what == any) {
+ } else if (what == any) {
for (Map::const_iterator i = bind.begin();
i != bind.end();
++i)
Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/broker/HeadersExchange.h
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/broker/HeadersExchange.h?rev=635898&r1=635897&r2=635898&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/broker/HeadersExchange.h (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/broker/HeadersExchange.h Tue Mar 11 05:24:46 2008
@@ -38,6 +38,8 @@
Bindings bindings;
qpid::sys::RWlock lock;
+ static std::string getMatch(const framing::FieldTable* args);
+
public:
static const std::string typeName;
Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/broker/MessageAdapter.cpp
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/broker/MessageAdapter.cpp?rev=635898&r1=635897&r2=635898&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/broker/MessageAdapter.cpp (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/broker/MessageAdapter.cpp Tue Mar 11 05:24:46 2008
@@ -47,7 +47,7 @@
const framing::FieldTable* TransferAdapter::getApplicationHeaders(const framing::FrameSet& f)
{
- const framing::MessageProperties* p = f.getHeaders()->get<framing::MessageProperties>();
+ const framing::MessageProperties010* p = f.getHeaders()->get<framing::MessageProperties010>();
return p ? &(p->getApplicationHeaders()) : 0;
}
@@ -67,4 +67,11 @@
const framing::DeliveryProperties* p = f.getHeaders()->get<framing::DeliveryProperties>();
return p ? p->getRoutingKey() : empty;
}
+
+ const framing::FieldTable* PreviewAdapter::getApplicationHeaders(const framing::FrameSet& f)
+ {
+ const framing::MessageProperties* p = f.getHeaders()->get<framing::MessageProperties>();
+ return p ? &(p->getApplicationHeaders()) : 0;
+ }
+
}}
Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/broker/MessageAdapter.h
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/broker/MessageAdapter.h?rev=635898&r1=635897&r2=635898&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/broker/MessageAdapter.h (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/broker/MessageAdapter.h Tue Mar 11 05:24:46 2008
@@ -51,7 +51,7 @@
virtual std::string getRoutingKey(const framing::FrameSet& f);
virtual std::string getExchange(const framing::FrameSet& f);
bool isImmediate(const framing::FrameSet&);
- const framing::FieldTable* getApplicationHeaders(const framing::FrameSet& f);
+ virtual const framing::FieldTable* getApplicationHeaders(const framing::FrameSet& f);
bool isPersistent(const framing::FrameSet& f);
};
@@ -59,6 +59,7 @@
{
std::string getExchange(const framing::FrameSet& f);
std::string getRoutingKey(const framing::FrameSet& f);
+ const framing::FieldTable* getApplicationHeaders(const framing::FrameSet& f);
};
}}
Modified: incubator/qpid/trunk/qpid/python/cpp_failing_0-10.txt
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/python/cpp_failing_0-10.txt?rev=635898&r1=635897&r2=635898&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/python/cpp_failing_0-10.txt (original)
+++ incubator/qpid/trunk/qpid/python/cpp_failing_0-10.txt Tue Mar 11 05:24:46 2008
@@ -10,14 +10,6 @@
tests_0-10.alternate_exchange.AlternateExchangeTests.test_delete_while_used_by_queue
tests_0-10.alternate_exchange.AlternateExchangeTests.test_queue_delete
tests_0-10.alternate_exchange.AlternateExchangeTests.test_unroutable
-tests_0-10.exchange.DeclareMethodPassiveFieldNotFoundRuleTests.test
-tests_0-10.exchange.ExchangeTests.testHeadersBindNoMatchArg
-tests_0-10.exchange.HeadersExchangeTests.testMatchAll
-tests_0-10.exchange.HeadersExchangeTests.testMatchAny
-tests_0-10.exchange.MiscellaneousErrorsTests.testDifferentDeclaredType
-tests_0-10.exchange.MiscellaneousErrorsTests.testTypeNotKnown
-tests_0-10.exchange.RecommendedTypesRuleTests.testHeaders
-tests_0-10.exchange.RequiredInstancesRuleTests.testAmqMatch
tests_0-10.dtx.DtxTests.test_bad_resume
tests_0-10.dtx.DtxTests.test_end
tests_0-10.dtx.DtxTests.test_end_suspend_and_fail
Modified: incubator/qpid/trunk/qpid/python/tests_0-10/exchange.py
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/python/tests_0-10/exchange.py?rev=635898&r1=635897&r2=635898&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/python/tests_0-10/exchange.py (original)
+++ incubator/qpid/trunk/qpid/python/tests_0-10/exchange.py Tue Mar 11 05:24:46 2008
@@ -27,6 +27,7 @@
from qpid.testlib import TestBase010
from qpid.datatypes import Message
from qpid.client import Closed
+from qpid.session import SessionException
class TestHelper(TestBase010):
@@ -48,6 +49,11 @@
def createMessage(self, key="", body=""):
return Message(self.session.delivery_properties(routing_key=key), body)
+ def getApplicationHeaders(self, msg):
+ for h in msg.headers:
+ if hasattr(h, 'application_headers'): return getattr(h, 'application_headers')
+ return None
+
def assertPublishGet(self, queue, exchange="", routing_key="", properties=None):
"""
Publish to exchange and assert queue.get() returns the same message.
@@ -59,7 +65,7 @@
msg = queue.get(timeout=1)
self.assertEqual(body, msg.body)
if (properties):
- self.assertEqual(properties, msg.content['application_headers'])
+ self.assertEqual(properties, self.getApplicationHeaders(msg))
def assertPublishConsume(self, queue="", exchange="", routing_key="", properties=None):
"""
@@ -294,8 +300,8 @@
try:
self.session.exchange_declare(exchange="humpty_dumpty", passive=True)
self.fail("Expected 404 for passive declaration of unknown exchange.")
- except Closed, e:
- self.assertChannelException(404, e.args[0])
+ except SessionException, e:
+ self.assertEquals(404, e.args[0].error_code)
class DeclareMethodDurableFieldSupportRuleTests(TestHelper):
@@ -352,7 +358,8 @@
self.assertPublishGet(self.q, exchange="amq.match", properties=headers)
def myBasicPublish(self, headers):
- self.session.message_transfer(destination="amq.match", content=Content("foobar", properties={'application_headers':headers}))
+ mp=self.session.message_properties(application_headers=headers)
+ self.session.message_transfer(destination="amq.match", message=Message(mp, "foobar"))
def testMatchAll(self):
self.session.exchange_bind(queue="q", exchange="amq.match", arguments={ 'x-match':'all', "name":"fred", "age":3})
@@ -386,21 +393,17 @@
try:
self.session.exchange_declare(exchange="test_type_not_known_exchange", type="invalid_type")
self.fail("Expected 503 for declaration of unknown exchange type.")
- except Closed, e:
- self.assertConnectionException(503, e.args[0])
+ except SessionException, e:
+ self.assertEquals(503, e.args[0].error_code)
def testDifferentDeclaredType(self):
- self.session.exchange_declare(exchange="test_different_declared_type_exchange", type="direct")
+ self.exchange_declare(exchange="test_different_declared_type_exchange", type="direct")
try:
- self.session.exchange_declare(exchange="test_different_declared_type_exchange", type="topic")
+ session = self.conn.session("alternate", 2)
+ session.exchange_declare(exchange="test_different_declared_type_exchange", type="topic")
self.fail("Expected 530 for redeclaration of exchange with different type.")
- except Closed, e:
- self.assertConnectionException(530, e.args[0])
- #cleanup
- other = self.connect()
- c2 = other.channel(1)
- c2.session_open()
- c2.exchange_delete(exchange="test_different_declared_type_exchange")
+ except SessionException, e:
+ self.assertEquals(530, e.args[0].error_code)
class ExchangeTests(TestHelper):
def testHeadersBindNoMatchArg(self):
@@ -408,5 +411,5 @@
try:
self.session.exchange_bind(queue="q", exchange="amq.match", arguments={"name":"fred" , "age":3} )
self.fail("Expected failure for missing x-match arg.")
- except Closed, e:
- self.assertConnectionException(541, e.args[0])
+ except SessionException, e:
+ self.assertEquals(541, e.args[0].error_code)