| 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 |