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

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

Issue 6271004: Changed MessageReader so that it doesn't read from the socket if there are (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: proper handling of empty messages Created 9 years, 11 months 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
(Empty)
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
3 // found in the LICENSE file.
4
5 #include <string>
6
7 #include "base/message_loop.h"
8 #include "net/socket/socket.h"
9 #include "remoting/protocol/fake_session.h"
10 #include "remoting/protocol/message_reader.h"
11 #include "testing/gtest/include/gtest/gtest.h"
12 #include "testing/gmock/include/gmock/gmock.h"
13 #include "third_party/libjingle/source/talk/base/byteorder.h"
14
15 using testing::_;
16 using testing::DoAll;
17 using testing::Mock;
18 using testing::SaveArg;
19
20 namespace remoting {
21 namespace protocol {
22
23 class MockMessageReceivedCallback {
24 public:
25 MOCK_METHOD2(OnMessage, void(CompoundBuffer*, Task*));
26 };
27
28 class MessageReaderTest : public testing::Test {
29 protected:
30 void AddMessage(const std::string& message) {
31 std::string data = std::string(4, ' ') + message;
32 talk_base::SetBE32(const_cast<char*>(data.data()), message.size());
33
34 socket_.AppendInputData(data.data(), data.size());
35 }
36
37 bool CompareResult(CompoundBuffer* buffer, const std::string& expected) {
38 std::string result(buffer->total_bytes(), ' ');
39 buffer->CopyTo(const_cast<char*>(result.data()), result.size());
40 return result == expected;
41 }
42
43 // MessageLoop must be first here, so that is is destroyed the last.
44 MessageLoop message_loop_;
45
46 MessageReader reader_;
47 FakeSocket socket_;
48 MockMessageReceivedCallback callback_;
49 };
50
51 TEST_F(MessageReaderTest, OneMessage) {
52 CompoundBuffer* buffer;
53 Task* done_task;
54
55 std::string msg1("Message1");
56
57 AddMessage(msg1);
58
59 EXPECT_CALL(callback_, OnMessage(_, _))
60 .Times(1)
61 .WillOnce(DoAll(SaveArg<0>(&buffer),
62 SaveArg<1>(&done_task)));
63
64 reader_.Init(&socket_, NewCallback(
65 &callback_, &MockMessageReceivedCallback::OnMessage));
66
67 Mock::VerifyAndClearExpectations(&callback_);
68 Mock::VerifyAndClearExpectations(&socket_);
69
70 EXPECT_TRUE(CompareResult(buffer, msg1));
71
72 // Verify that the reader starts reading again only after we've
73 // finished processing the previous message.
74 EXPECT_FALSE(socket_.read_pending());
75
76 done_task->Run();
77
78 EXPECT_TRUE(socket_.read_pending());
79 }
80
81 TEST_F(MessageReaderTest, TwoMessages_Together) {
82 CompoundBuffer* buffer1;
83 Task* done_task1;
84 CompoundBuffer* buffer2;
85 Task* done_task2;
86
87 std::string msg1("Message1");
88 std::string msg2("Message2");
89
90 AddMessage(msg1);
91 AddMessage(msg2);
92
93 EXPECT_CALL(callback_, OnMessage(_, _))
94 .Times(2)
95 .WillOnce(DoAll(SaveArg<0>(&buffer1),
96 SaveArg<1>(&done_task1)))
97 .WillOnce(DoAll(SaveArg<0>(&buffer2),
98 SaveArg<1>(&done_task2)));
99
100 reader_.Init(&socket_, NewCallback(
101 &callback_, &MockMessageReceivedCallback::OnMessage));
102
103 Mock::VerifyAndClearExpectations(&callback_);
104 Mock::VerifyAndClearExpectations(&socket_);
105
106 EXPECT_TRUE(CompareResult(buffer1, msg1));
107 EXPECT_TRUE(CompareResult(buffer2, msg2));
108
109 // Verify that the reader starts reading again only after we've
110 // finished processing the previous message.
111 EXPECT_FALSE(socket_.read_pending());
112
113 done_task1->Run();
114
115 EXPECT_FALSE(socket_.read_pending());
116
117 done_task2->Run();
118
119 EXPECT_TRUE(socket_.read_pending());
120 }
121
122 TEST_F(MessageReaderTest, TwoMessages_Separately) {
123 CompoundBuffer* buffer;
124 Task* done_task;
125
126 std::string msg1("Message1");
127 std::string msg2("Message2");
128
129 AddMessage(msg1);
130
131 EXPECT_CALL(callback_, OnMessage(_, _))
132 .Times(1)
133 .WillOnce(DoAll(SaveArg<0>(&buffer),
134 SaveArg<1>(&done_task)));
135
136 reader_.Init(&socket_, NewCallback(
137 &callback_, &MockMessageReceivedCallback::OnMessage));
138
139 Mock::VerifyAndClearExpectations(&callback_);
140 Mock::VerifyAndClearExpectations(&socket_);
141
142 EXPECT_TRUE(CompareResult(buffer, msg1));
143
144 // Verify that the reader starts reading again only after we've
145 // finished processing the previous message.
146 EXPECT_FALSE(socket_.read_pending());
147
148 done_task->Run();
149
150 EXPECT_TRUE(socket_.read_pending());
151
152 // Write another message and verify that we receive it.
153 EXPECT_CALL(callback_, OnMessage(_, _))
154 .Times(1)
155 .WillOnce(DoAll(SaveArg<0>(&buffer),
156 SaveArg<1>(&done_task)));
157 AddMessage(msg2);
158
159 EXPECT_TRUE(CompareResult(buffer, msg2));
160
161 // Verify that the reader starts reading again only after we've
162 // finished processing the previous message.
163 EXPECT_FALSE(socket_.read_pending());
164
165 done_task->Run();
166
167 EXPECT_TRUE(socket_.read_pending());
168 }
169
170 } // namespace protocol
171 } // namespace remoting
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698