You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ch...@apache.org on 2013/04/29 22:20:24 UTC
svn commit: r1477317 - in /qpid/trunk/qpid/cpp/src:
qpid/broker/HeadersExchange.cpp qpid/broker/HeadersExchange.h
tests/HeadersExchangeTest.cpp tests/MessageUtils.h
Author: chug
Date: Mon Apr 29 20:20:23 2013
New Revision: 1477317
URL: http://svn.apache.org/r1477317
Log:
QPID-4720: C++ Broker headers exchange tests not using run-time comaprisons.
Main code modified only slighty so that tests can hook into actual logic.
Modified:
qpid/trunk/qpid/cpp/src/qpid/broker/HeadersExchange.cpp
qpid/trunk/qpid/cpp/src/qpid/broker/HeadersExchange.h
qpid/trunk/qpid/cpp/src/tests/HeadersExchangeTest.cpp
qpid/trunk/qpid/cpp/src/tests/MessageUtils.h
Modified: qpid/trunk/qpid/cpp/src/qpid/broker/HeadersExchange.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/broker/HeadersExchange.cpp?rev=1477317&r1=1477316&r2=1477317&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/broker/HeadersExchange.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/broker/HeadersExchange.cpp Mon Apr 29 20:20:23 2013
@@ -286,9 +286,7 @@ void HeadersExchange::route(Deliverable&
Bindings::ConstPtr p = bindings.snapshot();
if (p.get()) {
for (std::vector<BoundKey>::const_iterator i = p->begin(); i != p->end(); ++i) {
- Matcher matcher(i->args);
- msg.getMessage().processProperties(matcher);
- if (matcher.matches()) {
+ if (match(i->args, msg.getMessage())) {
b->push_back(i->binding);
}
}
@@ -340,40 +338,10 @@ namespace
}
-
-bool HeadersExchange::match(const FieldTable& bind, const FieldTable& msg) {
- typedef FieldTable::ValueMap Map;
- std::string what = getMatch(&bind);
- if (what == all) {
- for (Map::const_iterator i = bind.begin();
- i != bind.end();
- ++i)
- {
- if (i->first != x_match)
- {
- Map::const_iterator j = msg.find(i->first);
- if (j == msg.end()) return false;
- if (!match_values(*(i->second), *(j->second))) return false;
- }
- }
- return true;
- } else if (what == any) {
- for (Map::const_iterator i = bind.begin();
- i != bind.end();
- ++i)
- {
- if (i->first != x_match)
- {
- Map::const_iterator j = msg.find(i->first);
- if (j != msg.end()) {
- if (match_values(*(i->second), *(j->second))) return true;
- }
- }
- }
- return false;
- } else {
- return false;
- }
+bool HeadersExchange::match(const FieldTable& bindArgs, const Message& msg) {
+ Matcher matcher(bindArgs);
+ msg.processProperties(matcher);
+ return matcher.matches();
}
bool HeadersExchange::equal(const FieldTable& a, const FieldTable& b) {
Modified: qpid/trunk/qpid/cpp/src/qpid/broker/HeadersExchange.h
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/broker/HeadersExchange.h?rev=1477317&r1=1477316&r2=1477317&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/broker/HeadersExchange.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/broker/HeadersExchange.h Mon Apr 29 20:20:23 2013
@@ -106,7 +106,7 @@ class HeadersExchange : public virtual E
virtual bool supportsDynamicBinding() { return true; }
- static QPID_BROKER_EXTERN bool match(const qpid::framing::FieldTable& bindArgs, const qpid::framing::FieldTable& msgArgs);
+ static QPID_BROKER_EXTERN bool match(const qpid::framing::FieldTable& bindArgs, const qpid::broker::Message& msg);
static bool equal(const qpid::framing::FieldTable& bindArgs, const qpid::framing::FieldTable& msgArgs);
};
Modified: qpid/trunk/qpid/cpp/src/tests/HeadersExchangeTest.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/tests/HeadersExchangeTest.cpp?rev=1477317&r1=1477316&r2=1477317&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/tests/HeadersExchangeTest.cpp (original)
+++ qpid/trunk/qpid/cpp/src/tests/HeadersExchangeTest.cpp Mon Apr 29 20:20:23 2013
@@ -21,12 +21,15 @@
#include "qpid/Exception.h"
#include "qpid/broker/HeadersExchange.h"
+#include "qpid/broker/Message.h"
#include "qpid/framing/FieldTable.h"
#include "qpid/framing/FieldValue.h"
+#include "MessageUtils.h"
#include "unit_test.h"
using namespace qpid::broker;
using namespace qpid::framing;
+using namespace qpid::types;
namespace qpid {
namespace tests {
@@ -35,70 +38,80 @@ QPID_AUTO_TEST_SUITE(HeadersExchangeTest
QPID_AUTO_TEST_CASE(testMatchAll)
{
- FieldTable b, m, n;
+ FieldTable b;
b.setString("x-match", "all");
b.setString("foo", "FOO");
b.setInt("n", 42);
- m.setString("foo", "FOO");
- m.setInt("n", 42);
- BOOST_CHECK(HeadersExchange::match(b, m));
+
+ Variant::Map m;
+ const int32_t int_n(42);
+ m["foo"] = "FOO";
+ m["n"] = int_n;
+ BOOST_CHECK(HeadersExchange::match(b, MessageUtils::createMessage(m, "", "", true)));
// Ignore extras.
- m.setString("extra", "x");
- BOOST_CHECK(HeadersExchange::match(b, m));
+ m["extra"] = "x";
+ BOOST_CHECK(HeadersExchange::match(b, MessageUtils::createMessage(m, "", "", true)));
// Fail mismatch, wrong value.
- m.setString("foo", "NotFoo");
- BOOST_CHECK(!HeadersExchange::match(b, m));
+ m["foo"] = "NotFoo";
+ BOOST_CHECK(!HeadersExchange::match(b, MessageUtils::createMessage(m, "", "", true)));
// Fail mismatch, missing value
- n.setInt("n", 42);
- n.setString("extra", "x");
- BOOST_CHECK(!HeadersExchange::match(b, n));
+ Variant::Map n;
+ n["n"] = int_n;
+ n["extra"] = "x";
+ BOOST_CHECK(!HeadersExchange::match(b, MessageUtils::createMessage(n, "", "", true)));
}
QPID_AUTO_TEST_CASE(testMatchAny)
{
- FieldTable b, m, n;
+ FieldTable b;
b.setString("x-match", "any");
b.setString("foo", "FOO");
b.setInt("n", 42);
- m.setString("foo", "FOO");
- BOOST_CHECK(!HeadersExchange::match(b, n));
- BOOST_CHECK(HeadersExchange::match(b, m));
- m.setInt("n", 42);
- BOOST_CHECK(HeadersExchange::match(b, m));
+
+ Variant::Map n;
+ Variant::Map m;
+ m["foo"] = "FOO";
+ BOOST_CHECK(!HeadersExchange::match(b, MessageUtils::createMessage(n, "", "", true)));
+ BOOST_CHECK(HeadersExchange::match(b, MessageUtils::createMessage(m, "", "", true)));
+ const int32_t int_n(42);
+ m["n"] = int_n;
+ BOOST_CHECK(HeadersExchange::match(b, MessageUtils::createMessage(m, "", "", true)));
}
QPID_AUTO_TEST_CASE(testMatchEmptyValue)
{
- FieldTable b, m;
+ FieldTable b;
b.setString("x-match", "all");
b.set("foo", FieldTable::ValuePtr());
b.set("n", FieldTable::ValuePtr());
- BOOST_CHECK(!HeadersExchange::match(b, m));
- m.setString("foo", "blah");
- m.setInt("n", 123);
+ Variant::Map m;
+ BOOST_CHECK(!HeadersExchange::match(b, MessageUtils::createMessage(m, "", "", true)));
}
QPID_AUTO_TEST_CASE(testMatchEmptyArgs)
{
- FieldTable b, m;
- m.setString("foo", "FOO");
+ FieldTable b;
+ Variant::Map m;
+ m["foo"] = "FOO";
+ Message msg = MessageUtils::createMessage(m, "", "", true);
b.setString("x-match", "all");
- BOOST_CHECK(HeadersExchange::match(b, m));
+ BOOST_CHECK(HeadersExchange::match(b, msg));
b.setString("x-match", "any");
- BOOST_CHECK(!HeadersExchange::match(b, m));
+ BOOST_CHECK(!HeadersExchange::match(b, msg));
}
QPID_AUTO_TEST_CASE(testMatchNoXMatch)
{
- FieldTable b, m;
+ FieldTable b;
b.setString("foo", "FOO");
- m.setString("foo", "FOO");
- BOOST_CHECK(!HeadersExchange::match(b, m));
+ Variant::Map m;
+ m["foo"] = "FOO";
+ BOOST_CHECK(!HeadersExchange::match(b, MessageUtils::createMessage(m, "", "", true)));
}
QPID_AUTO_TEST_CASE(testBindNoXMatch)
@@ -115,6 +128,67 @@ QPID_AUTO_TEST_CASE(testBindNoXMatch)
}
}
+
+QPID_AUTO_TEST_CASE(testMatchSizedIntUint)
+{
+ typedef std::list<Variant::Map> vml;
+
+ const int8_t i8(1);
+ const int16_t i16(1);
+ const int32_t i32(1);
+ const int64_t i64(1);
+ const uint8_t u8(1);
+ const uint16_t u16(1);
+ const uint32_t u32(1);
+ const uint64_t u64(1);
+
+ Variant::Map mi8, mi16, mi32, mi64;
+ Variant::Map mu8, mu16, mu32, mu64;
+
+ mi8["bk"] = i8;
+ mi16["bk"] = i16;
+ mi32["bk"] = i32;
+ mi64["bk"] = i64;
+ mu8["bk"] = u8;
+ mu16["bk"] = u16;
+ mu32["bk"] = u32;
+ mu64["bk"] = u64;
+
+ vml mMap;
+ mMap.push_back(mi8);
+ mMap.push_back(mi16);
+ mMap.push_back(mi32);
+ mMap.push_back(mi64);
+ mMap.push_back(mu8);
+ mMap.push_back(mu16);
+ mMap.push_back(mu32);
+ mMap.push_back(mu64);
+
+ for (vml::iterator bVal=mMap.begin(); bVal!=mMap.end(); ++bVal) {
+ FieldTable b;
+ qpid::amqp_0_10::translate(*bVal, b);
+ b.setString("x-match", "all");
+ for (vml::iterator mVal=mMap.begin(); mVal!=mMap.end(); ++mVal) {
+ BOOST_CHECK(HeadersExchange::match(b, MessageUtils::createMessage(*mVal, "", "", true)));
+ }
+ }
+}
+
+// TODO: Headers exchange match on single
+
+QPID_AUTO_TEST_CASE(testMatchFloatDouble)
+{
+ const double iFloat(1.0);
+ Variant::Map m;
+ m["bk"] = iFloat;
+
+ FieldTable b;
+ qpid::amqp_0_10::translate(m, b);
+ b.setString("x-match", "all");
+ BOOST_CHECK(HeadersExchange::match(b, MessageUtils::createMessage(m, "", "", true)));
+}
+
+
QPID_AUTO_TEST_SUITE_END()
}} // namespace qpid::tests
Modified: qpid/trunk/qpid/cpp/src/tests/MessageUtils.h
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/tests/MessageUtils.h?rev=1477317&r1=1477316&r2=1477317&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/tests/MessageUtils.h (original)
+++ qpid/trunk/qpid/cpp/src/tests/MessageUtils.h Mon Apr 29 20:20:23 2013
@@ -28,6 +28,7 @@
#include "qpid/framing/MessageTransferBody.h"
#include "qpid/framing/Uuid.h"
#include "qpid/types/Variant.h"
+#include "qpid/amqp_0_10/Codecs.h"
using namespace qpid;
using namespace broker;
@@ -38,7 +39,11 @@ namespace tests {
struct MessageUtils
{
- static Message createMessage(const qpid::types::Variant::Map& properties, const std::string& content="", const std::string& destination = "")
+ static Message createMessage(const qpid::types::Variant::Map& properties,
+ const std::string& content="",
+ const std::string& destination = "",
+ bool replaceHeaders = false
+ )
{
boost::intrusive_ptr<broker::amqp_0_10::MessageTransfer> msg(new broker::amqp_0_10::MessageTransfer());
@@ -52,22 +57,28 @@ struct MessageUtils
AMQFrame data((AMQContentBody(content)));
msg->getFrames().append(data);
}
- for (qpid::types::Variant::Map::const_iterator i = properties.begin(); i != properties.end(); ++i) {
- if (i->first == "routing-key" && !i->second.isVoid()) {
- msg->getFrames().getHeaders()->get<DeliveryProperties>(true)->setRoutingKey(i->second);
- } else if (i->first == "message-id" && !i->second.isVoid()) {
- qpid::types::Uuid id = i->second;
- qpid::framing::Uuid id2(id.data());
- msg->getFrames().getHeaders()->get<MessageProperties>(true)->setMessageId(id2);
- } else if (i->first == "ttl" && !i->second.isVoid()) {
- msg->getFrames().getHeaders()->get<DeliveryProperties>(true)->setTtl(i->second);
- } else if (i->first == "priority" && !i->second.isVoid()) {
- msg->getFrames().getHeaders()->get<DeliveryProperties>(true)->setPriority(i->second);
- } else if (i->first == "durable" && !i->second.isVoid()) {
- msg->getFrames().getHeaders()->get<DeliveryProperties>(true)->setDeliveryMode(i->second.asBool() ? 2 : 1);
- } else {
- msg->getFrames().getHeaders()->get<MessageProperties>(true)->getApplicationHeaders().setString(i->first, i->second);
+ if (!replaceHeaders) {
+ for (qpid::types::Variant::Map::const_iterator i = properties.begin(); i != properties.end(); ++i) {
+ if (i->first == "routing-key" && !i->second.isVoid()) {
+ msg->getFrames().getHeaders()->get<DeliveryProperties>(true)->setRoutingKey(i->second);
+ } else if (i->first == "message-id" && !i->second.isVoid()) {
+ qpid::types::Uuid id = i->second;
+ qpid::framing::Uuid id2(id.data());
+ msg->getFrames().getHeaders()->get<MessageProperties>(true)->setMessageId(id2);
+ } else if (i->first == "ttl" && !i->second.isVoid()) {
+ msg->getFrames().getHeaders()->get<DeliveryProperties>(true)->setTtl(i->second);
+ } else if (i->first == "priority" && !i->second.isVoid()) {
+ msg->getFrames().getHeaders()->get<DeliveryProperties>(true)->setPriority(i->second);
+ } else if (i->first == "durable" && !i->second.isVoid()) {
+ msg->getFrames().getHeaders()->get<DeliveryProperties>(true)->setDeliveryMode(i->second.asBool() ? 2 : 1);
+ } else {
+ msg->getFrames().getHeaders()->get<MessageProperties>(true)->getApplicationHeaders().setString(i->first, i->second);
+ }
}
+ } else {
+ framing::FieldTable newHeaders;
+ qpid::amqp_0_10::translate(properties, newHeaders);
+ msg->getFrames().getHeaders()->get<MessageProperties>(true)->getApplicationHeaders() = newHeaders;
}
return Message(msg, msg);
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org