From 91a1f8d9e121c1b1379476aa61426dd8a3366987 Mon Sep 17 00:00:00 2001 From: frsyuki Date: Thu, 29 Apr 2010 22:15:03 +0900 Subject: cpp: new streaming deserialier API. --- cpp/test/streaming.cc | 114 +++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 109 insertions(+), 5 deletions(-) (limited to 'cpp/test/streaming.cc') 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 #include + TEST(streaming, basic) { std::ostringstream stream; @@ -15,6 +16,108 @@ TEST(streaming, basic) 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); + + msgpack::unpacked result; + while(pac.next(&result)) { + msgpack::object obj = result.get(); + switch(count++) { + case 0: + EXPECT_EQ(1, obj.as()); + break; + case 1: + EXPECT_EQ(2, obj.as()); + break; + case 2: + EXPECT_EQ(3, obj.as()); + 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 z) + { + EXPECT_EQ(expect, obj.as()); + } + + int expect; + +private: + std::istream& input; + msgpack::unpacker pac; +}; + +TEST(streaming, event) +{ + std::stringstream stream; + msgpack::packer 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 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); @@ -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 pk(&stream); - event_handler handler(stream); + event_handler_compat handler(stream); pk.pack(1); handler.expect = 1; -- cgit v1.2.1