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

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
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();
47 } 60 }
48 61
49 protected: 62 protected:
50 virtual void SetUp() OVERRIDE { 63 virtual void SetUp() OVERRIDE {
51 reader_.reset(new MessageReader()); 64 reader_.reset(new MessageReader());
52 } 65 }
53 66
54 virtual void TearDown() OVERRIDE { 67 virtual void TearDown() OVERRIDE {
55 STLDeleteElements(&messages_); 68 STLDeleteElements(&messages_);
56 } 69 }
57 70
58 void InitReader() { 71 void InitReader() {
59 reader_->Init(&socket_, base::Bind( 72 reader_->Init(&socket_, base::Bind(
60 &MessageReaderTest::OnMessage, base::Unretained(this))); 73 &MessageReaderTest::OnMessage, base::Unretained(this)));
61 } 74 }
62 75
63 void AddMessage(const std::string& message) { 76 void AddMessage(const std::string& message) {
64 std::string data = std::string(4, ' ') + message; 77 std::string data = std::string(4, ' ') + message;
65 talk_base::SetBE32(const_cast<char*>(data.data()), message.size()); 78 talk_base::SetBE32(const_cast<char*>(data.data()), message.size());
66 79
67 socket_.AppendInputData(std::vector<char>(data.begin(), data.end())); 80 socket_.AppendInputData(std::vector<char>(data.begin(), data.end()));
68 } 81 }
69 82
70 bool CompareResult(CompoundBuffer* buffer, const std::string& expected) { 83 bool CompareResult(CompoundBuffer* buffer, const std::string& expected) {
71 std::string result(buffer->total_bytes(), ' '); 84 std::string result(buffer->total_bytes(), ' ');
72 buffer->CopyTo(const_cast<char*>(result.data()), result.size()); 85 buffer->CopyTo(const_cast<char*>(result.data()), result.size());
73 return result == expected; 86 return result == expected;
74 } 87 }
75 88
76 void RunClosure(const base::Closure& task) {
77 task.Run();
78 run_task_finished_.Signal();
79 }
80
81 void OnMessage(scoped_ptr<CompoundBuffer> buffer, 89 void OnMessage(scoped_ptr<CompoundBuffer> buffer,
82 const base::Closure& done_callback) { 90 const base::Closure& done_callback) {
83 messages_.push_back(buffer.release()); 91 messages_.push_back(buffer.release());
84 callback_.OnMessage(done_callback); 92 callback_.OnMessage(done_callback);
85 } 93 }
86 94
87 MessageLoop message_loop_; 95 MessageLoop message_loop_;
88 base::WaitableEvent run_task_finished_;
89 scoped_ptr<MessageReader> reader_; 96 scoped_ptr<MessageReader> reader_;
90 FakeSocket socket_; 97 FakeSocket socket_;
91 MockMessageReceivedCallback callback_; 98 MockMessageReceivedCallback callback_;
92 std::vector<CompoundBuffer*> messages_; 99 std::vector<CompoundBuffer*> messages_;
100 bool in_callback_;
93 }; 101 };
94 102
95 // Receive one message and process it with delay 103 // Receive one message and process it with delay
96 TEST_F(MessageReaderTest, OneMessage_Delay) { 104 TEST_F(MessageReaderTest, OneMessage_Delay) {
97 base::Closure done_task; 105 base::Closure done_task;
98 106
99 AddMessage(kTestMessage1); 107 AddMessage(kTestMessage1);
100 108
101 EXPECT_CALL(callback_, OnMessage(_)) 109 EXPECT_CALL(callback_, OnMessage(_))
102 .Times(1) 110 .Times(1)
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
259 267
260 // Add a message. It should never be read after the error above. 268 // Add a message. It should never be read after the error above.
261 AddMessage(kTestMessage1); 269 AddMessage(kTestMessage1);
262 270
263 EXPECT_CALL(callback_, OnMessage(_)) 271 EXPECT_CALL(callback_, OnMessage(_))
264 .Times(0); 272 .Times(0);
265 273
266 InitReader(); 274 InitReader();
267 } 275 }
268 276
277 TEST_F(MessageReaderTest, ReadFromCallback) {
278 AddMessage(kTestMessage1);
279
280 EXPECT_CALL(callback_, OnMessage(_))
281 .Times(2)
282 .WillOnce(Invoke(this, &MessageReaderTest::AddSecondMessage))
283 .WillOnce(Invoke(this, &MessageReaderTest::OnSecondMessage));
284
285 InitReader();
286 message_loop_.RunAllPending();
287
288 EXPECT_TRUE(socket_.read_pending());
289 }
290
269 } // namespace protocol 291 } // namespace protocol
270 } // namespace remoting 292 } // namespace remoting
OLDNEW
« remoting/protocol/message_reader.cc ('K') | « remoting/protocol/message_reader.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698