OLD | NEW |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |