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-unsubscr...@qpid.apache.org For additional commands, e-mail: commits-h...@qpid.apache.org