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

Unified 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « remoting/protocol/message_reader.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« 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