diff options
| author | Charles E. Rolke <chug@apache.org> | 2013-04-29 20:20:23 +0000 |
|---|---|---|
| committer | Charles E. Rolke <chug@apache.org> | 2013-04-29 20:20:23 +0000 |
| commit | 426fad506f4d569626431fe8f61619b12677c3a3 (patch) | |
| tree | 540ad8d1eeadc172907667b24e664b5b5c32c7cb /qpid/cpp/src/tests | |
| parent | 170134a81e51549f2e22c0d96303e5ab8be6fec9 (diff) | |
| download | qpid-python-426fad506f4d569626431fe8f61619b12677c3a3.tar.gz | |
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.
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1477317 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/cpp/src/tests')
| -rw-r--r-- | qpid/cpp/src/tests/HeadersExchangeTest.cpp | 130 | ||||
| -rw-r--r-- | qpid/cpp/src/tests/MessageUtils.h | 43 |
2 files changed, 129 insertions, 44 deletions
diff --git a/qpid/cpp/src/tests/HeadersExchangeTest.cpp b/qpid/cpp/src/tests/HeadersExchangeTest.cpp index 40deb59c86..3e68b84bc3 100644 --- a/qpid/cpp/src/tests/HeadersExchangeTest.cpp +++ b/qpid/cpp/src/tests/HeadersExchangeTest.cpp @@ -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(HeadersExchangeTestSuite) 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 diff --git a/qpid/cpp/src/tests/MessageUtils.h b/qpid/cpp/src/tests/MessageUtils.h index 5024f5b77c..a6a5aa65fd 100644 --- a/qpid/cpp/src/tests/MessageUtils.h +++ b/qpid/cpp/src/tests/MessageUtils.h @@ -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); } |
