summaryrefslogtreecommitdiff
path: root/qpid/cpp/src/tests/amqp_0_10
diff options
context:
space:
mode:
authorAlan Conway <aconway@apache.org>2008-04-07 20:12:31 +0000
committerAlan Conway <aconway@apache.org>2008-04-07 20:12:31 +0000
commit066e3c7e00686f3d3ea6b29a3d689015ab0b669f (patch)
tree73cd0a46fdc1ccadb7ef98898d2b82b121f6d204 /qpid/cpp/src/tests/amqp_0_10
parent89b1e87fbd2d567840322bc727fc2ea811f124cd (diff)
downloadqpid-python-066e3c7e00686f3d3ea6b29a3d689015ab0b669f.tar.gz
Encoding/decoding for packed structs and optional members.
git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk@645663 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/cpp/src/tests/amqp_0_10')
-rw-r--r--qpid/cpp/src/tests/amqp_0_10/serialize.cpp62
1 files changed, 52 insertions, 10 deletions
diff --git a/qpid/cpp/src/tests/amqp_0_10/serialize.cpp b/qpid/cpp/src/tests/amqp_0_10/serialize.cpp
index a6cb28caee..dcf27e457a 100644
--- a/qpid/cpp/src/tests/amqp_0_10/serialize.cpp
+++ b/qpid/cpp/src/tests/amqp_0_10/serialize.cpp
@@ -20,9 +20,9 @@
*/
#include "unit_test.h"
+#include "qpid/amqp_0_10/Packer.h"
#include "qpid/amqp_0_10/built_in_types.h"
#include "qpid/amqp_0_10/Codec.h"
-#include "qpid/amqp_0_10/PackedCodec.h"
#include "qpid/amqp_0_10/specification.h"
#include "qpid/amqp_0_10/ControlHolder.h"
#include "qpid/amqp_0_10/Frame.h"
@@ -31,12 +31,14 @@
#include <boost/test/test_case_template.hpp>
#include <boost/type_traits/is_arithmetic.hpp>
#include <boost/utility/enable_if.hpp>
+#include <boost/optional.hpp>
#include <boost/mpl/vector.hpp>
#include <boost/mpl/back_inserter.hpp>
#include <boost/mpl/copy.hpp>
#include <boost/mpl/empty_sequence.hpp>
#include <iterator>
#include <string>
+#include <sstream>
#include <iostream>
#include <netinet/in.h>
@@ -254,15 +256,55 @@ BOOST_AUTO_TEST_CASE(testFrameEncodeDecode) {
}
-BOOST_AUTO_TEST_CASE(testPackedCodec) {
- int i=-1, j=-1, k=-1, l=-1;
- std::string data;
- Codec::encode(std::back_inserter(data))(1)(3);
- PackedCodec::decode(0x5, Codec::decode(data.begin()))(i)(j)(k)(l);
- BOOST_CHECK_EQUAL(i, 1);
- BOOST_CHECK_EQUAL(j, 0);
- BOOST_CHECK_EQUAL(k, 3);
- BOOST_CHECK_EQUAL(l, 0);
+struct DummyPacked {
+ static const uint8_t PACK=1;
+ boost::optional<char> i, j;
+ char k;
+ DummyPacked(char a=0, char b=0, char c=0) : i(a), j(b), k(c) {}
+ template <class S> void serialize(S& s) { s(i)(j)(k); }
+
+ string str() const {
+ ostringstream os;
+ os << i << j << k;
+ return os.str();
+ }
+};
+
+Packer<DummyPacked> serializable(DummyPacked& d) { return Packer<DummyPacked>(d); }
+
+BOOST_AUTO_TEST_CASE(testPackBits) {
+ DummyPacked d('a','b','c');
+ BOOST_CHECK_EQUAL(packBits(d), 7u);
+ d.j = boost::none;
+ BOOST_CHECK_EQUAL(packBits(d), 5u);
+}
+
+
+BOOST_AUTO_TEST_CASE(testPacked) {
+ string data;
+
+ Codec::encode(back_inserter(data))('a')(boost::optional<char>('b'))(boost::optional<char>())('c');
+ BOOST_CHECK_EQUAL(data, "abc");
+ data.clear();
+
+ DummyPacked dummy('a','b','c');
+
+ Codec::encode(back_inserter(data))(dummy);
+ BOOST_CHECK_EQUAL(data.size(), 4u);
+ BOOST_CHECK_EQUAL(data, string("\007abc"));
+ data.clear();
+
+ dummy.i = boost::none;
+ Codec::encode(back_inserter(data))(dummy);
+ BOOST_CHECK_EQUAL(data, string("\6bc"));
+ data.clear();
+
+ const char* missing = "\5xy";
+ Codec::decode(missing)(dummy);
+ BOOST_CHECK(dummy.i);
+ BOOST_CHECK_EQUAL(dummy.i, 'x');
+ BOOST_CHECK(!dummy.j);
+ BOOST_CHECK_EQUAL(dummy.k, 'y');
}
QPID_AUTO_TEST_SUITE_END()