Index: base/message_loop_proxy_unittest.cc |
diff --git a/base/message_loop_proxy_unittest.cc b/base/message_loop_proxy_unittest.cc |
index 4776502413bc7956f0e69b32c250dd1f622cfb21..cc0d63509632d2dfdca6b0a449a7597a338ae71b 100644 |
--- a/base/message_loop_proxy_unittest.cc |
+++ b/base/message_loop_proxy_unittest.cc |
@@ -261,6 +261,117 @@ TEST_F(MessageLoopProxyTest, PostTaskAndReply_DeadReplyLoopDoesNotDelete) { |
// http://crbug.com/86301. |
} |
+class MessageLoopProxyTest2 : public testing::Test { |
+ public: |
+ void Release() const { |
+ AssertOnIOThread(); |
+ Quit(); |
+ } |
+ |
+ void Quit() const { |
+ loop_.PostTask(FROM_HERE, MessageLoop::QuitClosure()); |
+ } |
+ |
+ void AssertOnIOThread() const { |
+ ASSERT_TRUE(io_thread_->message_loop_proxy()->BelongsToCurrentThread()); |
+ ASSERT_EQ(io_thread_->message_loop_proxy(), |
+ base::MessageLoopProxy::current()); |
+ } |
+ |
+ void AssertOnFileThread() const { |
+ ASSERT_TRUE(file_thread_->message_loop_proxy()->BelongsToCurrentThread()); |
+ ASSERT_EQ(file_thread_->message_loop_proxy(), |
+ base::MessageLoopProxy::current()); |
+ } |
+ |
+ protected: |
+ virtual void SetUp() OVERRIDE { |
+ io_thread_.reset(new base::Thread("MessageLoopProxyTest_IO")); |
+ file_thread_.reset(new base::Thread("MessageLoopProxyTest_File")); |
+ io_thread_->Start(); |
+ file_thread_->Start(); |
+ } |
+ |
+ virtual void TearDown() OVERRIDE { |
+ io_thread_->Stop(); |
+ file_thread_->Stop(); |
+ } |
+ |
+ static void BasicFunction(MessageLoopProxyTest2* test) { |
+ test->AssertOnFileThread(); |
+ test->Quit(); |
+ } |
+ |
+ static void AssertNotRun() { |
+ FAIL() << "Callback Should not get executed."; |
+ } |
+ |
+ class DeletedOnFile { |
+ public: |
+ explicit DeletedOnFile(MessageLoopProxyTest2* test) : test_(test) {} |
+ |
+ ~DeletedOnFile() { |
+ test_->AssertOnFileThread(); |
+ test_->Quit(); |
+ } |
+ |
+ private: |
+ MessageLoopProxyTest2* test_; |
+ }; |
+ |
+ scoped_ptr<base::Thread> io_thread_; |
+ scoped_ptr<base::Thread> file_thread_; |
+ |
+ private: |
+ mutable MessageLoop loop_; |
+}; |
+ |
+TEST_F(MessageLoopProxyTest2, Release) { |
+ EXPECT_TRUE(io_thread_->message_loop_proxy()->ReleaseSoon(FROM_HERE, this)); |
+ MessageLoop::current()->Run(); |
+} |
+ |
+TEST_F(MessageLoopProxyTest2, Delete) { |
+ DeletedOnFile* deleted_on_file = new DeletedOnFile(this); |
+ EXPECT_TRUE(file_thread_->message_loop_proxy()->DeleteSoon( |
+ FROM_HERE, deleted_on_file)); |
+ MessageLoop::current()->Run(); |
+} |
+ |
+TEST_F(MessageLoopProxyTest2, PostTask) { |
+ EXPECT_TRUE(file_thread_->message_loop_proxy()->PostTask( |
+ FROM_HERE, base::Bind(&MessageLoopProxyTest2::BasicFunction, |
+ base::Unretained(this)))); |
+ MessageLoop::current()->Run(); |
+} |
+ |
+TEST_F(MessageLoopProxyTest2, PostTaskAfterThreadExits) { |
+ scoped_ptr<base::Thread> test_thread( |
+ new base::Thread("MessageLoopProxyTest2_Dummy")); |
+ test_thread->Start(); |
+ scoped_refptr<base::MessageLoopProxy> message_loop_proxy = |
+ test_thread->message_loop_proxy(); |
+ test_thread->Stop(); |
+ |
+ bool ret = message_loop_proxy->PostTask( |
+ FROM_HERE, |
+ base::Bind(&MessageLoopProxyTest2::AssertNotRun)); |
+ EXPECT_FALSE(ret); |
+} |
+ |
+TEST_F(MessageLoopProxyTest2, PostTaskAfterThreadIsDeleted) { |
+ scoped_refptr<base::MessageLoopProxy> message_loop_proxy; |
+ { |
+ scoped_ptr<base::Thread> test_thread( |
+ new base::Thread("MessageLoopProxyTest2_Dummy")); |
+ test_thread->Start(); |
+ message_loop_proxy = test_thread->message_loop_proxy(); |
+ } |
+ bool ret = message_loop_proxy->PostTask( |
+ FROM_HERE, |
+ base::Bind(&MessageLoopProxyTest2::AssertNotRun)); |
+ EXPECT_FALSE(ret); |
+} |
} // namespace |
} // namespace base |