summaryrefslogtreecommitdiffstats
path: root/remoting/protocol/messages_decoder_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'remoting/protocol/messages_decoder_unittest.cc')
-rw-r--r--remoting/protocol/messages_decoder_unittest.cc121
1 files changed, 121 insertions, 0 deletions
diff --git a/remoting/protocol/messages_decoder_unittest.cc b/remoting/protocol/messages_decoder_unittest.cc
new file mode 100644
index 0000000..7c5616d
--- /dev/null
+++ b/remoting/protocol/messages_decoder_unittest.cc
@@ -0,0 +1,121 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <string>
+
+#include "base/scoped_ptr.h"
+#include "base/stl_util-inl.h"
+#include "net/base/io_buffer.h"
+#include "remoting/protocol/messages_decoder.h"
+#include "remoting/protocol/util.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace remoting {
+
+static const int kWidth = 640;
+static const int kHeight = 480;
+static const std::string kTestData = "Chromoting rockz";
+
+static void AppendMessage(const ChromotingHostMessage& msg,
+ std::string* buffer) {
+ // Contains one encoded message.
+ scoped_refptr<net::IOBufferWithSize> encoded_msg;
+ encoded_msg = SerializeAndFrameMessage(msg);
+ buffer->append(encoded_msg->data(), encoded_msg->size());
+}
+
+// Construct and prepare data in the |output_stream|.
+static void PrepareData(uint8** buffer, int* size) {
+ // Contains all encoded messages.
+ std::string encoded_data;
+
+ // The first message is InitClient.
+ ChromotingHostMessage msg;
+ msg.mutable_init_client()->set_width(kWidth);
+ msg.mutable_init_client()->set_height(kHeight);
+ AppendMessage(msg, &encoded_data);
+ msg.Clear();
+
+ // Then append 10 update sequences to the data.
+ for (int i = 0; i < 10; ++i) {
+ msg.mutable_begin_update_stream();
+ AppendMessage(msg, &encoded_data);
+ msg.Clear();
+
+ msg.mutable_update_stream_packet()->mutable_rect_data()->
+ set_sequence_number(0);
+ msg.mutable_update_stream_packet()->mutable_rect_data()->
+ set_data(kTestData);
+ AppendMessage(msg, &encoded_data);
+ msg.Clear();
+
+ msg.mutable_end_update_stream();
+ AppendMessage(msg, &encoded_data);
+ msg.Clear();
+ }
+
+ *size = encoded_data.length();
+ *buffer = new uint8[*size];
+ memcpy(*buffer, encoded_data.c_str(), *size);
+}
+
+TEST(MessagesDecoderTest, BasicOperations) {
+ // Prepare encoded data for testing.
+ int size;
+ uint8* test_data;
+ PrepareData(&test_data, &size);
+ scoped_array<uint8> memory_deleter(test_data);
+
+ // Then simulate using MessagesDecoder to decode variable
+ // size of encoded data.
+ // The first thing to do is to generate a variable size of data. This is done
+ // by iterating the following array for read sizes.
+ const int kReadSizes[] = {1, 2, 3, 1};
+
+ MessagesDecoder decoder;
+
+ // Then feed the protocol decoder using the above generated data and the
+ // read pattern.
+ HostMessageList message_list;
+ for (int i = 0; i < size;) {
+ // First generate the amount to feed the decoder.
+ int read = std::min(size - i, kReadSizes[i % arraysize(kReadSizes)]);
+
+ // And then prepare a DataBuffer for feeding it.
+ scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(read);
+ memcpy(buffer->data(), test_data + i, read);
+ decoder.ParseHostMessages(buffer, read, &message_list);
+ i += read;
+ }
+
+ // Then verify the decoded messages.
+ EXPECT_EQ(31u, message_list.size());
+ ASSERT_TRUE(message_list.size() > 0);
+ EXPECT_TRUE(message_list.front()->has_init_client());
+ delete message_list.front();
+ message_list.pop_front();
+
+ int index = 0;
+ for (HostMessageList::iterator it = message_list.begin();
+ it != message_list.end(); ++it) {
+ ChromotingHostMessage* message = *it;
+ int type = index % 3;
+ ++index;
+ if (type == 0) {
+ // Begin update stream.
+ EXPECT_TRUE(message->has_begin_update_stream());
+ } else if (type == 1) {
+ // Partial update stream.
+ EXPECT_TRUE(message->has_update_stream_packet());
+ EXPECT_EQ(kTestData,
+ message->update_stream_packet().rect_data().data());
+ } else if (type == 2) {
+ // End update stream.
+ EXPECT_TRUE(message->has_end_update_stream());
+ }
+ }
+ STLDeleteElements(&message_list);
+}
+
+} // namespace remoting