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

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

Issue 10919259: Fix MessageReader not to invoke message callback from done callback. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 3 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
« no previous file with comments | « remoting/protocol/message_reader.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/bind.h" 7 #include "base/bind.h"
8 #include "base/bind_helpers.h" 8 #include "base/bind_helpers.h"
9 #include "base/callback.h" 9 #include "base/callback.h"
10 #include "base/message_loop.h" 10 #include "base/message_loop.h"
(...skipping 25 matching lines...) Expand all
36 } // namespace 36 } // namespace
37 37
38 class MockMessageReceivedCallback { 38 class MockMessageReceivedCallback {
39 public: 39 public:
40 MOCK_METHOD1(OnMessage, void(const base::Closure&)); 40 MOCK_METHOD1(OnMessage, void(const base::Closure&));
41 }; 41 };
42 42
43 class MessageReaderTest : public testing::Test { 43 class MessageReaderTest : public testing::Test {
44 public: 44 public:
45 MessageReaderTest() 45 MessageReaderTest()
46 : run_task_finished_(false, false) { 46 : in_callback_(false) {
47 }
48
49 // Following two methods are used by the ReadFromCallback test.
50 void AddSecondMessage(const base::Closure& task) {
51 AddMessage(kTestMessage2);
52 in_callback_ = true;
53 task.Run();
54 in_callback_ = false;
55 }
56
57 void OnSecondMessage(const base::Closure& task) {
58 EXPECT_FALSE(in_callback_);
59 task.Run();
60 }
61
62 // Used by the DeleteFromCallback() test.
63 void DeleteReader(const base::Closure& task) {
64 reader_.reset();
65 task.Run();
47 } 66 }
48 67
49 protected: 68 protected:
50 virtual void SetUp() OVERRIDE { 69 virtual void SetUp() OVERRIDE {
51 reader_.reset(new MessageReader()); 70 reader_.reset(new MessageReader());
52 } 71 }
53 72
54 virtual void TearDown() OVERRIDE { 73 virtual void TearDown() OVERRIDE {
55 STLDeleteElements(&messages_); 74 STLDeleteElements(&messages_);
56 } 75 }
57 76
58 void InitReader() { 77 void InitReader() {
59 reader_->Init(&socket_, base::Bind( 78 reader_->Init(&socket_, base::Bind(
60 &MessageReaderTest::OnMessage, base::Unretained(this))); 79 &MessageReaderTest::OnMessage, base::Unretained(this)));
61 } 80 }
62 81
63 void AddMessage(const std::string& message) { 82 void AddMessage(const std::string& message) {
64 std::string data = std::string(4, ' ') + message; 83 std::string data = std::string(4, ' ') + message;
65 talk_base::SetBE32(const_cast<char*>(data.data()), message.size()); 84 talk_base::SetBE32(const_cast<char*>(data.data()), message.size());
66 85
67 socket_.AppendInputData(std::vector<char>(data.begin(), data.end())); 86 socket_.AppendInputData(std::vector<char>(data.begin(), data.end()));
68 } 87 }
69 88
70 bool CompareResult(CompoundBuffer* buffer, const std::string& expected) { 89 bool CompareResult(CompoundBuffer* buffer, const std::string& expected) {
71 std::string result(buffer->total_bytes(), ' '); 90 std::string result(buffer->total_bytes(), ' ');
72 buffer->CopyTo(const_cast<char*>(result.data()), result.size()); 91 buffer->CopyTo(const_cast<char*>(result.data()), result.size());
73 return result == expected; 92 return result == expected;
74 } 93 }
75 94
76 void RunClosure(const base::Closure& task) {
77 task.Run();
78 run_task_finished_.Signal();
79 }
80
81 void OnMessage(scoped_ptr<CompoundBuffer> buffer, 95 void OnMessage(scoped_ptr<CompoundBuffer> buffer,
82 const base::Closure& done_callback) { 96 const base::Closure& done_callback) {
83 messages_.push_back(buffer.release()); 97 messages_.push_back(buffer.release());
84 callback_.OnMessage(done_callback); 98 callback_.OnMessage(done_callback);
85 } 99 }
86 100
87 MessageLoop message_loop_; 101 MessageLoop message_loop_;
88 base::WaitableEvent run_task_finished_;
89 scoped_ptr<MessageReader> reader_; 102 scoped_ptr<MessageReader> reader_;
90 FakeSocket socket_; 103 FakeSocket socket_;
91 MockMessageReceivedCallback callback_; 104 MockMessageReceivedCallback callback_;
92 std::vector<CompoundBuffer*> messages_; 105 std::vector<CompoundBuffer*> messages_;
106 bool in_callback_;
93 }; 107 };
94 108
95 // Receive one message and process it with delay 109 // Receive one message and process it with delay
96 TEST_F(MessageReaderTest, OneMessage_Delay) { 110 TEST_F(MessageReaderTest, OneMessage_Delay) {
97 base::Closure done_task; 111 base::Closure done_task;
98 112
99 AddMessage(kTestMessage1); 113 AddMessage(kTestMessage1);
100 114
101 EXPECT_CALL(callback_, OnMessage(_)) 115 EXPECT_CALL(callback_, OnMessage(_))
102 .Times(1) 116 .Times(1)
103 .WillOnce(SaveArg<0>(&done_task)); 117 .WillOnce(SaveArg<0>(&done_task));
104 118
105 InitReader(); 119 InitReader();
120 message_loop_.RunAllPending();
106 121
107 Mock::VerifyAndClearExpectations(&callback_); 122 Mock::VerifyAndClearExpectations(&callback_);
108 Mock::VerifyAndClearExpectations(&socket_); 123 Mock::VerifyAndClearExpectations(&socket_);
109 124
110 EXPECT_TRUE(CompareResult(messages_[0], kTestMessage1)); 125 EXPECT_TRUE(CompareResult(messages_[0], kTestMessage1));
111 126
112 // Verify that the reader starts reading again only after we've 127 // Verify that the reader starts reading again only after we've
113 // finished processing the previous message. 128 // finished processing the previous message.
114 EXPECT_FALSE(socket_.read_pending()); 129 EXPECT_FALSE(socket_.read_pending());
115 130
116 done_task.Run(); 131 done_task.Run();
117 132
118 EXPECT_TRUE(socket_.read_pending()); 133 EXPECT_TRUE(socket_.read_pending());
119 } 134 }
120 135
121 // Receive one message and process it instantly. 136 // Receive one message and process it instantly.
122 TEST_F(MessageReaderTest, OneMessage_Instant) { 137 TEST_F(MessageReaderTest, OneMessage_Instant) {
123 AddMessage(kTestMessage1); 138 AddMessage(kTestMessage1);
124 139
125 EXPECT_CALL(callback_, OnMessage(_)) 140 EXPECT_CALL(callback_, OnMessage(_))
126 .Times(1) 141 .Times(1)
127 .WillOnce(CallDoneTask()); 142 .WillOnce(CallDoneTask());
128 143
129 InitReader(); 144 InitReader();
145 message_loop_.RunAllPending();
130 146
131 EXPECT_TRUE(socket_.read_pending()); 147 EXPECT_TRUE(socket_.read_pending());
132 EXPECT_EQ(1U, messages_.size()); 148 EXPECT_EQ(1U, messages_.size());
133 } 149 }
134 150
135 // Receive two messages in one packet. 151 // Receive two messages in one packet.
136 TEST_F(MessageReaderTest, TwoMessages_Together) { 152 TEST_F(MessageReaderTest, TwoMessages_Together) {
137 base::Closure done_task1; 153 base::Closure done_task1;
138 base::Closure done_task2; 154 base::Closure done_task2;
139 155
140 AddMessage(kTestMessage1); 156 AddMessage(kTestMessage1);
141 AddMessage(kTestMessage2); 157 AddMessage(kTestMessage2);
142 158
143 EXPECT_CALL(callback_, OnMessage(_)) 159 EXPECT_CALL(callback_, OnMessage(_))
144 .Times(2) 160 .Times(2)
145 .WillOnce(SaveArg<0>(&done_task1)) 161 .WillOnce(SaveArg<0>(&done_task1))
146 .WillOnce(SaveArg<0>(&done_task2)); 162 .WillOnce(SaveArg<0>(&done_task2));
147 163
148 InitReader(); 164 InitReader();
165 message_loop_.RunAllPending();
149 166
150 Mock::VerifyAndClearExpectations(&callback_); 167 Mock::VerifyAndClearExpectations(&callback_);
151 Mock::VerifyAndClearExpectations(&socket_); 168 Mock::VerifyAndClearExpectations(&socket_);
152 169
153 EXPECT_TRUE(CompareResult(messages_[0], kTestMessage1)); 170 EXPECT_TRUE(CompareResult(messages_[0], kTestMessage1));
154 EXPECT_TRUE(CompareResult(messages_[1], kTestMessage2)); 171 EXPECT_TRUE(CompareResult(messages_[1], kTestMessage2));
155 172
156 // Verify that the reader starts reading again only after we've 173 // Verify that the reader starts reading again only after we've
157 // finished processing the previous message. 174 // finished processing the previous message.
158 EXPECT_FALSE(socket_.read_pending()); 175 EXPECT_FALSE(socket_.read_pending());
159 176
160 done_task1.Run(); 177 done_task1.Run();
178 message_loop_.RunAllPending();
161 179
162 EXPECT_FALSE(socket_.read_pending()); 180 EXPECT_FALSE(socket_.read_pending());
163 181
164 done_task2.Run(); 182 done_task2.Run();
183 message_loop_.RunAllPending();
165 184
166 EXPECT_TRUE(socket_.read_pending()); 185 EXPECT_TRUE(socket_.read_pending());
167 } 186 }
168 187
169 // Receive two messages in one packet, and process the first one 188 // Receive two messages in one packet, and process the first one
170 // instantly. 189 // instantly.
171 TEST_F(MessageReaderTest, TwoMessages_Instant) { 190 TEST_F(MessageReaderTest, TwoMessages_Instant) {
172 base::Closure done_task2; 191 base::Closure done_task2;
173 192
174 AddMessage(kTestMessage1); 193 AddMessage(kTestMessage1);
175 AddMessage(kTestMessage2); 194 AddMessage(kTestMessage2);
176 195
177 EXPECT_CALL(callback_, OnMessage(_)) 196 EXPECT_CALL(callback_, OnMessage(_))
178 .Times(2) 197 .Times(2)
179 .WillOnce(CallDoneTask()) 198 .WillOnce(CallDoneTask())
180 .WillOnce(SaveArg<0>(&done_task2)); 199 .WillOnce(SaveArg<0>(&done_task2));
181 200
182 InitReader(); 201 InitReader();
202 message_loop_.RunAllPending();
183 203
184 Mock::VerifyAndClearExpectations(&callback_); 204 Mock::VerifyAndClearExpectations(&callback_);
185 Mock::VerifyAndClearExpectations(&socket_); 205 Mock::VerifyAndClearExpectations(&socket_);
186 206
187 EXPECT_TRUE(CompareResult(messages_[1], kTestMessage2)); 207 EXPECT_TRUE(CompareResult(messages_[1], kTestMessage2));
188 208
189 // Verify that the reader starts reading again only after we've 209 // Verify that the reader starts reading again only after we've
190 // finished processing the second message. 210 // finished processing the second message.
191 EXPECT_FALSE(socket_.read_pending()); 211 EXPECT_FALSE(socket_.read_pending());
192 212
193 done_task2.Run(); 213 done_task2.Run();
194 214
195 EXPECT_TRUE(socket_.read_pending()); 215 EXPECT_TRUE(socket_.read_pending());
196 } 216 }
197 217
198 // Receive two messages in one packet, and process both of them 218 // Receive two messages in one packet, and process both of them
199 // instantly. 219 // instantly.
200 TEST_F(MessageReaderTest, TwoMessages_Instant2) { 220 TEST_F(MessageReaderTest, TwoMessages_Instant2) {
201 AddMessage(kTestMessage1); 221 AddMessage(kTestMessage1);
202 AddMessage(kTestMessage2); 222 AddMessage(kTestMessage2);
203 223
204 EXPECT_CALL(callback_, OnMessage(_)) 224 EXPECT_CALL(callback_, OnMessage(_))
205 .Times(2) 225 .Times(2)
206 .WillOnce(CallDoneTask()) 226 .WillOnce(CallDoneTask())
207 .WillOnce(CallDoneTask()); 227 .WillOnce(CallDoneTask());
208 228
209 InitReader(); 229 InitReader();
230 message_loop_.RunAllPending();
210 231
211 EXPECT_TRUE(socket_.read_pending()); 232 EXPECT_TRUE(socket_.read_pending());
212 } 233 }
213 234
214 // Receive two messages in separate packets. 235 // Receive two messages in separate packets.
215 TEST_F(MessageReaderTest, TwoMessages_Separately) { 236 TEST_F(MessageReaderTest, TwoMessages_Separately) {
216 base::Closure done_task; 237 base::Closure done_task;
217 238
218 AddMessage(kTestMessage1); 239 AddMessage(kTestMessage1);
219 240
220 EXPECT_CALL(callback_, OnMessage(_)) 241 EXPECT_CALL(callback_, OnMessage(_))
221 .Times(1) 242 .Times(1)
222 .WillOnce(SaveArg<0>(&done_task)); 243 .WillOnce(SaveArg<0>(&done_task));
223 244
224 InitReader(); 245 InitReader();
246 message_loop_.RunAllPending();
225 247
226 Mock::VerifyAndClearExpectations(&callback_); 248 Mock::VerifyAndClearExpectations(&callback_);
227 Mock::VerifyAndClearExpectations(&socket_); 249 Mock::VerifyAndClearExpectations(&socket_);
228 250
229 EXPECT_TRUE(CompareResult(messages_[0], kTestMessage1)); 251 EXPECT_TRUE(CompareResult(messages_[0], kTestMessage1));
230 252
231 // Verify that the reader starts reading again only after we've 253 // Verify that the reader starts reading again only after we've
232 // finished processing the previous message. 254 // finished processing the previous message.
233 EXPECT_FALSE(socket_.read_pending()); 255 EXPECT_FALSE(socket_.read_pending());
234 256
235 done_task.Run(); 257 done_task.Run();
258 message_loop_.RunAllPending();
236 259
237 EXPECT_TRUE(socket_.read_pending()); 260 EXPECT_TRUE(socket_.read_pending());
238 261
239 // Write another message and verify that we receive it. 262 // Write another message and verify that we receive it.
240 EXPECT_CALL(callback_, OnMessage(_)) 263 EXPECT_CALL(callback_, OnMessage(_))
241 .Times(1) 264 .Times(1)
242 .WillOnce(SaveArg<0>(&done_task)); 265 .WillOnce(SaveArg<0>(&done_task));
243 AddMessage(kTestMessage2); 266 AddMessage(kTestMessage2);
267 message_loop_.RunAllPending();
244 268
245 EXPECT_TRUE(CompareResult(messages_[1], kTestMessage2)); 269 EXPECT_TRUE(CompareResult(messages_[1], kTestMessage2));
246 270
247 // Verify that the reader starts reading again only after we've 271 // Verify that the reader starts reading again only after we've
248 // finished processing the previous message. 272 // finished processing the previous message.
249 EXPECT_FALSE(socket_.read_pending()); 273 EXPECT_FALSE(socket_.read_pending());
250 274
251 done_task.Run(); 275 done_task.Run();
252 276
253 EXPECT_TRUE(socket_.read_pending()); 277 EXPECT_TRUE(socket_.read_pending());
254 } 278 }
255 279
256 // Read() returns error. 280 // Read() returns error.
257 TEST_F(MessageReaderTest, ReadError) { 281 TEST_F(MessageReaderTest, ReadError) {
258 socket_.set_next_read_error(net::ERR_FAILED); 282 socket_.set_next_read_error(net::ERR_FAILED);
259 283
260 // Add a message. It should never be read after the error above. 284 // Add a message. It should never be read after the error above.
261 AddMessage(kTestMessage1); 285 AddMessage(kTestMessage1);
262 286
263 EXPECT_CALL(callback_, OnMessage(_)) 287 EXPECT_CALL(callback_, OnMessage(_))
264 .Times(0); 288 .Times(0);
265 289
266 InitReader(); 290 InitReader();
267 } 291 }
268 292
293 // Verify that we the OnMessage callback is not reentered.
294 TEST_F(MessageReaderTest, ReadFromCallback) {
295 AddMessage(kTestMessage1);
296
297 EXPECT_CALL(callback_, OnMessage(_))
298 .Times(2)
299 .WillOnce(Invoke(this, &MessageReaderTest::AddSecondMessage))
300 .WillOnce(Invoke(this, &MessageReaderTest::OnSecondMessage));
301
302 InitReader();
303 message_loop_.RunAllPending();
304
305 EXPECT_TRUE(socket_.read_pending());
306 }
307
308 // Verify that we stop getting callbacks after deleting MessageReader.
309 TEST_F(MessageReaderTest, DeleteFromCallback) {
310 base::Closure done_task1;
311 base::Closure done_task2;
312
313 AddMessage(kTestMessage1);
314 AddMessage(kTestMessage2);
315
316 // OnMessage() should never be called for the second message.
317 EXPECT_CALL(callback_, OnMessage(_))
318 .Times(1)
319 .WillOnce(Invoke(this, &MessageReaderTest::DeleteReader));
320
321 InitReader();
322 message_loop_.RunAllPending();
323 }
324
269 } // namespace protocol 325 } // namespace protocol
270 } // namespace remoting 326 } // namespace remoting
OLDNEW
« no previous file with comments | « remoting/protocol/message_reader.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698