Index: remoting/protocol/message_reader_unittest.cc |
diff --git a/remoting/protocol/message_reader_unittest.cc b/remoting/protocol/message_reader_unittest.cc |
index c789b96867eb2e74bbe1e459687c729fc13dd543..b3e62892c16e51649b59dd293da9225c64ff15f4 100644 |
--- a/remoting/protocol/message_reader_unittest.cc |
+++ b/remoting/protocol/message_reader_unittest.cc |
@@ -43,7 +43,26 @@ class MockMessageReceivedCallback { |
class MessageReaderTest : public testing::Test { |
public: |
MessageReaderTest() |
- : run_task_finished_(false, false) { |
+ : in_callback_(false) { |
+ } |
+ |
+ // Following two methods are used by the ReadFromCallback test. |
+ void AddSecondMessage(const base::Closure& task) { |
+ AddMessage(kTestMessage2); |
+ in_callback_ = true; |
+ task.Run(); |
+ in_callback_ = false; |
+ } |
+ |
+ void OnSecondMessage(const base::Closure& task) { |
+ EXPECT_FALSE(in_callback_); |
+ task.Run(); |
+ } |
+ |
+ // Used by the DeleteFromCallback() test. |
+ void DeleteReader(const base::Closure& task) { |
+ reader_.reset(); |
+ task.Run(); |
} |
protected: |
@@ -73,11 +92,6 @@ class MessageReaderTest : public testing::Test { |
return result == expected; |
} |
- void RunClosure(const base::Closure& task) { |
- task.Run(); |
- run_task_finished_.Signal(); |
- } |
- |
void OnMessage(scoped_ptr<CompoundBuffer> buffer, |
const base::Closure& done_callback) { |
messages_.push_back(buffer.release()); |
@@ -85,11 +99,11 @@ class MessageReaderTest : public testing::Test { |
} |
MessageLoop message_loop_; |
- base::WaitableEvent run_task_finished_; |
scoped_ptr<MessageReader> reader_; |
FakeSocket socket_; |
MockMessageReceivedCallback callback_; |
std::vector<CompoundBuffer*> messages_; |
+ bool in_callback_; |
}; |
// Receive one message and process it with delay |
@@ -103,6 +117,7 @@ TEST_F(MessageReaderTest, OneMessage_Delay) { |
.WillOnce(SaveArg<0>(&done_task)); |
InitReader(); |
+ message_loop_.RunAllPending(); |
Mock::VerifyAndClearExpectations(&callback_); |
Mock::VerifyAndClearExpectations(&socket_); |
@@ -127,6 +142,7 @@ TEST_F(MessageReaderTest, OneMessage_Instant) { |
.WillOnce(CallDoneTask()); |
InitReader(); |
+ message_loop_.RunAllPending(); |
EXPECT_TRUE(socket_.read_pending()); |
EXPECT_EQ(1U, messages_.size()); |
@@ -146,6 +162,7 @@ TEST_F(MessageReaderTest, TwoMessages_Together) { |
.WillOnce(SaveArg<0>(&done_task2)); |
InitReader(); |
+ message_loop_.RunAllPending(); |
Mock::VerifyAndClearExpectations(&callback_); |
Mock::VerifyAndClearExpectations(&socket_); |
@@ -158,10 +175,12 @@ TEST_F(MessageReaderTest, TwoMessages_Together) { |
EXPECT_FALSE(socket_.read_pending()); |
done_task1.Run(); |
+ message_loop_.RunAllPending(); |
EXPECT_FALSE(socket_.read_pending()); |
done_task2.Run(); |
+ message_loop_.RunAllPending(); |
EXPECT_TRUE(socket_.read_pending()); |
} |
@@ -180,6 +199,7 @@ TEST_F(MessageReaderTest, TwoMessages_Instant) { |
.WillOnce(SaveArg<0>(&done_task2)); |
InitReader(); |
+ message_loop_.RunAllPending(); |
Mock::VerifyAndClearExpectations(&callback_); |
Mock::VerifyAndClearExpectations(&socket_); |
@@ -207,6 +227,7 @@ TEST_F(MessageReaderTest, TwoMessages_Instant2) { |
.WillOnce(CallDoneTask()); |
InitReader(); |
+ message_loop_.RunAllPending(); |
EXPECT_TRUE(socket_.read_pending()); |
} |
@@ -222,6 +243,7 @@ TEST_F(MessageReaderTest, TwoMessages_Separately) { |
.WillOnce(SaveArg<0>(&done_task)); |
InitReader(); |
+ message_loop_.RunAllPending(); |
Mock::VerifyAndClearExpectations(&callback_); |
Mock::VerifyAndClearExpectations(&socket_); |
@@ -233,6 +255,7 @@ TEST_F(MessageReaderTest, TwoMessages_Separately) { |
EXPECT_FALSE(socket_.read_pending()); |
done_task.Run(); |
+ message_loop_.RunAllPending(); |
EXPECT_TRUE(socket_.read_pending()); |
@@ -241,6 +264,7 @@ TEST_F(MessageReaderTest, TwoMessages_Separately) { |
.Times(1) |
.WillOnce(SaveArg<0>(&done_task)); |
AddMessage(kTestMessage2); |
+ message_loop_.RunAllPending(); |
EXPECT_TRUE(CompareResult(messages_[1], kTestMessage2)); |
@@ -266,5 +290,37 @@ TEST_F(MessageReaderTest, ReadError) { |
InitReader(); |
} |
+// Verify that we the OnMessage callback is not reentered. |
+TEST_F(MessageReaderTest, ReadFromCallback) { |
+ AddMessage(kTestMessage1); |
+ |
+ EXPECT_CALL(callback_, OnMessage(_)) |
+ .Times(2) |
+ .WillOnce(Invoke(this, &MessageReaderTest::AddSecondMessage)) |
+ .WillOnce(Invoke(this, &MessageReaderTest::OnSecondMessage)); |
+ |
+ InitReader(); |
+ message_loop_.RunAllPending(); |
+ |
+ EXPECT_TRUE(socket_.read_pending()); |
+} |
+ |
+// Verify that we stop getting callbacks after deleting MessageReader. |
+TEST_F(MessageReaderTest, DeleteFromCallback) { |
+ base::Closure done_task1; |
+ base::Closure done_task2; |
+ |
+ AddMessage(kTestMessage1); |
+ AddMessage(kTestMessage2); |
+ |
+ // OnMessage() should never be called for the second message. |
+ EXPECT_CALL(callback_, OnMessage(_)) |
+ .Times(1) |
+ .WillOnce(Invoke(this, &MessageReaderTest::DeleteReader)); |
+ |
+ InitReader(); |
+ message_loop_.RunAllPending(); |
+} |
+ |
} // namespace protocol |
} // namespace remoting |