Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(59)

Side by Side Diff: remoting/protocol/message_decoder_unittest.cc

Issue 4476003: Add VideoPacket struct for video packets. Refactor Decode interface to use it. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: merged Created 10 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <string> 5 #include <string>
6 6
7 #include "base/scoped_ptr.h" 7 #include "base/scoped_ptr.h"
8 #include "base/stl_util-inl.h" 8 #include "base/stl_util-inl.h"
9 #include "net/base/io_buffer.h" 9 #include "net/base/io_buffer.h"
10 #include "remoting/base/multiple_array_input_stream.h" 10 #include "remoting/base/multiple_array_input_stream.h"
11 #include "remoting/proto/internal.pb.h" 11 #include "remoting/proto/internal.pb.h"
12 #include "remoting/protocol/message_decoder.h" 12 #include "remoting/protocol/message_decoder.h"
13 #include "remoting/protocol/util.h" 13 #include "remoting/protocol/util.h"
14 #include "testing/gtest/include/gtest/gtest.h" 14 #include "testing/gtest/include/gtest/gtest.h"
15 15
16 namespace remoting { 16 namespace remoting {
17 17
18 static const int kWidth = 640; 18 static const int kTestKey = 142;
19 static const int kHeight = 480;
20 static const std::string kTestData = "Chromoting rockz";
21 19
22 static void AppendMessage(const ChromotingHostMessage& msg, 20 static void AppendMessage(const ChromotingClientMessage& msg,
23 std::string* buffer) { 21 std::string* buffer) {
24 // Contains one encoded message. 22 // Contains one encoded message.
25 scoped_refptr<net::IOBufferWithSize> encoded_msg; 23 scoped_refptr<net::IOBufferWithSize> encoded_msg;
26 encoded_msg = SerializeAndFrameMessage(msg); 24 encoded_msg = SerializeAndFrameMessage(msg);
27 buffer->append(encoded_msg->data(), encoded_msg->size()); 25 buffer->append(encoded_msg->data(), encoded_msg->size());
28 } 26 }
29 27
30 // Construct and prepare data in the |output_stream|. 28 // Construct and prepare data in the |output_stream|.
31 static void PrepareData(uint8** buffer, int* size) { 29 static void PrepareData(uint8** buffer, int* size) {
32 // Contains all encoded messages. 30 // Contains all encoded messages.
33 std::string encoded_data; 31 std::string encoded_data;
34 32
35 // The first message is InitClient. 33 ChromotingClientMessage msg;
36 ChromotingHostMessage msg;
37 msg.mutable_init_client()->set_width(kWidth);
38 msg.mutable_init_client()->set_height(kHeight);
39 AppendMessage(msg, &encoded_data);
40 msg.Clear();
41 34
42 // Then append 10 update sequences to the data. 35 // Then append 10 update sequences to the data.
43 for (int i = 0; i < 10; ++i) { 36 for (int i = 0; i < 10; ++i) {
44 msg.mutable_video_packet()->set_sequence_number(0); 37 msg.mutable_key_event()->set_key(kTestKey + i);
45 msg.mutable_video_packet()->set_data(kTestData); 38 msg.mutable_key_event()->set_pressed((i % 2) != 0);
46 AppendMessage(msg, &encoded_data); 39 AppendMessage(msg, &encoded_data);
47 msg.Clear(); 40 msg.Clear();
48 } 41 }
49 42
50 *size = encoded_data.length(); 43 *size = encoded_data.length();
51 *buffer = new uint8[*size]; 44 *buffer = new uint8[*size];
52 memcpy(*buffer, encoded_data.c_str(), *size); 45 memcpy(*buffer, encoded_data.c_str(), *size);
53 } 46 }
54 47
55 void SimulateReadSequence(const int read_sequence[], int sequence_size) { 48 void SimulateReadSequence(const int read_sequence[], int sequence_size) {
56 // Prepare encoded data for testing. 49 // Prepare encoded data for testing.
57 int size; 50 int size;
58 uint8* test_data; 51 uint8* test_data;
59 PrepareData(&test_data, &size); 52 PrepareData(&test_data, &size);
60 scoped_array<uint8> memory_deleter(test_data); 53 scoped_array<uint8> memory_deleter(test_data);
61 54
62 // Then simulate using MessageDecoder to decode variable 55 // Then simulate using MessageDecoder to decode variable
63 // size of encoded data. 56 // size of encoded data.
64 // The first thing to do is to generate a variable size of data. This is done 57 // The first thing to do is to generate a variable size of data. This is done
65 // by iterating the following array for read sizes. 58 // by iterating the following array for read sizes.
66 MessageDecoder decoder; 59 MessageDecoder decoder;
67 60
68 // Then feed the protocol decoder using the above generated data and the 61 // Then feed the protocol decoder using the above generated data and the
69 // read pattern. 62 // read pattern.
70 std::list<ChromotingHostMessage*> message_list; 63 std::list<ChromotingClientMessage*> message_list;
71 for (int i = 0; i < size;) { 64 for (int i = 0; i < size;) {
72 // First generate the amount to feed the decoder. 65 // First generate the amount to feed the decoder.
73 int read = std::min(size - i, read_sequence[i % sequence_size]); 66 int read = std::min(size - i, read_sequence[i % sequence_size]);
74 67
75 // And then prepare an IOBuffer for feeding it. 68 // And then prepare an IOBuffer for feeding it.
76 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(read)); 69 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(read));
77 memcpy(buffer->data(), test_data + i, read); 70 memcpy(buffer->data(), test_data + i, read);
78 decoder.ParseMessages(buffer, read, &message_list); 71 decoder.ParseMessages(buffer, read, &message_list);
79 i += read; 72 i += read;
80 } 73 }
81 74
82 // Then verify the decoded messages. 75 // Then verify the decoded messages.
83 EXPECT_EQ(11u, message_list.size()); 76 EXPECT_EQ(10u, message_list.size());
84 EXPECT_TRUE(message_list.front()->has_init_client());
85 delete message_list.front();
86 message_list.pop_front();
87 77
88 for (std::list<ChromotingHostMessage*>::iterator it = 78 int index = 0;
79 for (std::list<ChromotingClientMessage*>::iterator it =
89 message_list.begin(); 80 message_list.begin();
90 it != message_list.end(); ++it) { 81 it != message_list.end(); ++it) {
91 ChromotingHostMessage* message = *it; 82 ChromotingClientMessage* message = *it;
92 // Partial update stream. 83 // Partial update stream.
93 EXPECT_TRUE(message->has_video_packet()); 84 EXPECT_TRUE(message->has_key_event());
94 EXPECT_EQ(kTestData, 85
95 message->video_packet().data().data()); 86 // TODO(sergeyu): Don't use index here. Instead store the expected values
87 // in an array.
88 EXPECT_EQ(kTestKey + index, message->key_event().key());
89 EXPECT_EQ((index % 2) != 0, message->key_event().pressed());
90 ++index;
96 } 91 }
97 STLDeleteElements(&message_list); 92 STLDeleteElements(&message_list);
98 } 93 }
99 94
100 TEST(MessageDecoderTest, SmallReads) { 95 TEST(MessageDecoderTest, SmallReads) {
101 const int kReads[] = {1, 2, 3, 1}; 96 const int kReads[] = {1, 2, 3, 1};
102 SimulateReadSequence(kReads, arraysize(kReads)); 97 SimulateReadSequence(kReads, arraysize(kReads));
103 } 98 }
104 99
105 TEST(MessageDecoderTest, LargeReads) { 100 TEST(MessageDecoderTest, LargeReads) {
106 const int kReads[] = {50, 50, 5}; 101 const int kReads[] = {50, 50, 5};
107 SimulateReadSequence(kReads, arraysize(kReads)); 102 SimulateReadSequence(kReads, arraysize(kReads));
108 } 103 }
109 104
110 TEST(MessageDecoderTest, EmptyReads) { 105 TEST(MessageDecoderTest, EmptyReads) {
111 const int kReads[] = {4, 0, 50, 0}; 106 const int kReads[] = {4, 0, 50, 0};
112 SimulateReadSequence(kReads, arraysize(kReads)); 107 SimulateReadSequence(kReads, arraysize(kReads));
113 } 108 }
114 109
115 } // namespace remoting 110 } // namespace remoting
OLDNEW
« no previous file with comments | « remoting/protocol/jingle_connection_to_host.cc ('k') | remoting/protocol/protobuf_video_reader.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698