Index: remoting/base/protocol_decoder_unittest.cc |
=================================================================== |
--- remoting/base/protocol_decoder_unittest.cc (revision 0) |
+++ remoting/base/protocol_decoder_unittest.cc (revision 0) |
@@ -0,0 +1,113 @@ |
+// 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 "media/base/data_buffer.h" |
+#include "remoting/base/protocol_decoder.h" |
+#include "remoting/base/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 chromotocol_pb::HostMessage& msg, |
+ std::string* buffer) { |
+ // Contains one encoded message. |
+ scoped_refptr<media::DataBuffer> encoded_msg; |
+ encoded_msg = SerializeAndFrameMessage(msg); |
+ buffer->append(reinterpret_cast<const char*>(encoded_msg->GetData()), |
+ encoded_msg->GetDataSize()); |
+} |
+ |
+// 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. |
+ chromotocol_pb::HostMessage 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()->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(ProtocolDecoderTest, 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 ProtocolDecoder 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}; |
+ |
+ ProtocolDecoder 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<media::DataBuffer> buffer = new media::DataBuffer(read); |
+ memcpy(buffer->GetWritableData(), test_data + i, read); |
+ buffer->SetDataSize(read); |
+ decoder.ParseHostMessages(buffer, &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[0]->has_init_client()); |
+ delete message_list[0]; |
+ |
+ for (size_t i = 1; i < message_list.size(); ++i) { |
+ int type = (i - 1) % 3; |
+ if (type == 0) { |
+ // Begin update stream. |
+ EXPECT_TRUE(message_list[i]->has_begin_update_stream()); |
+ } else if (type == 1) { |
+ // Partial update stream. |
+ EXPECT_TRUE(message_list[i]->has_update_stream_packet()); |
+ EXPECT_EQ(kTestData, message_list[i]->update_stream_packet().data()); |
+ } else if (type == 2) { |
+ // End update stream. |
+ EXPECT_TRUE(message_list[i]->has_end_update_stream()); |
+ } |
+ delete message_list[i]; |
+ } |
+} |
+ |
+} // namespace remoting |
Property changes on: remoting/base/protocol_decoder_unittest.cc |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |