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