summaryrefslogtreecommitdiff
path: root/cpp/test/streaming.cc
diff options
context:
space:
mode:
authorfrsyuki <frsyuki@users.sourceforge.jp>2010-04-29 22:15:03 +0900
committerfrsyuki <frsyuki@users.sourceforge.jp>2010-04-29 22:15:03 +0900
commit91a1f8d9e121c1b1379476aa61426dd8a3366987 (patch)
treef4cd9c6d61ff7f922b621c11a79df28e5c590714 /cpp/test/streaming.cc
parent6352472c5fbe1d293dfff2d48dca81ea91bba29f (diff)
downloadmsgpack-python-91a1f8d9e121c1b1379476aa61426dd8a3366987.tar.gz
cpp: new streaming deserialier API.
Diffstat (limited to 'cpp/test/streaming.cc')
-rw-r--r--cpp/test/streaming.cc114
1 files changed, 109 insertions, 5 deletions
diff --git a/cpp/test/streaming.cc b/cpp/test/streaming.cc
index 2d03976..c01b8be 100644
--- a/cpp/test/streaming.cc
+++ b/cpp/test/streaming.cc
@@ -2,6 +2,7 @@
#include <gtest/gtest.h>
#include <sstream>
+
TEST(streaming, basic)
{
std::ostringstream stream;
@@ -22,6 +23,108 @@ TEST(streaming, basic)
size_t len = input.readsome(pac.buffer(), pac.buffer_capacity());
pac.buffer_consumed(len);
+ msgpack::unpacked result;
+ while(pac.next(&result)) {
+ msgpack::object obj = result.get();
+ switch(count++) {
+ case 0:
+ EXPECT_EQ(1, obj.as<int>());
+ break;
+ case 1:
+ EXPECT_EQ(2, obj.as<int>());
+ break;
+ case 2:
+ EXPECT_EQ(3, obj.as<int>());
+ return;
+ }
+ }
+ }
+}
+
+
+class event_handler {
+public:
+ event_handler(std::istream& input) : input(input) { }
+ ~event_handler() { }
+
+ void on_read()
+ {
+ while(true) {
+ pac.reserve_buffer(32*1024);
+
+ size_t len = input.readsome(pac.buffer(), pac.buffer_capacity());
+
+ if(len == 0) {
+ return;
+ }
+
+ pac.buffer_consumed(len);
+
+ msgpack::unpacked result;
+ while(pac.next(&result)) {
+ on_message(result.get(), result.zone());
+ }
+
+ if(pac.message_size() > 10*1024*1024) {
+ throw std::runtime_error("message is too large");
+ }
+ }
+ }
+
+ void on_message(msgpack::object obj, std::auto_ptr<msgpack::zone> z)
+ {
+ EXPECT_EQ(expect, obj.as<int>());
+ }
+
+ int expect;
+
+private:
+ std::istream& input;
+ msgpack::unpacker pac;
+};
+
+TEST(streaming, event)
+{
+ std::stringstream stream;
+ msgpack::packer<std::ostream> pk(&stream);
+
+ event_handler handler(stream);
+
+ pk.pack(1);
+ handler.expect = 1;
+ handler.on_read();
+
+ pk.pack(2);
+ handler.expect = 2;
+ handler.on_read();
+
+ pk.pack(3);
+ handler.expect = 3;
+ handler.on_read();
+}
+
+
+// backward compatibility
+TEST(streaming, basic_compat)
+{
+ std::ostringstream stream;
+ msgpack::packer<std::ostream> pk(&stream);
+
+ pk.pack(1);
+ pk.pack(2);
+ pk.pack(3);
+
+ std::istringstream input(stream.str());
+
+ msgpack::unpacker pac;
+
+ int count = 0;
+ while(count < 3) {
+ pac.reserve_buffer(32*1024);
+
+ size_t len = input.readsome(pac.buffer(), pac.buffer_capacity());
+ pac.buffer_consumed(len);
+
while(pac.execute()) {
std::auto_ptr<msgpack::zone> z(pac.release_zone());
msgpack::object obj = pac.data();
@@ -44,10 +147,11 @@ TEST(streaming, basic)
}
-class event_handler {
+// backward compatibility
+class event_handler_compat {
public:
- event_handler(std::istream& input) : input(input) { }
- ~event_handler() { }
+ event_handler_compat(std::istream& input) : input(input) { }
+ ~event_handler_compat() { }
void on_read()
{
@@ -87,12 +191,12 @@ private:
msgpack::unpacker pac;
};
-TEST(streaming, event)
+TEST(streaming, event_compat)
{
std::stringstream stream;
msgpack::packer<std::ostream> pk(&stream);
- event_handler handler(stream);
+ event_handler_compat handler(stream);
pk.pack(1);
handler.expect = 1;