Index: base/message_loop/message_loop_task_runner_unittest.cc |
diff --git a/base/message_loop/message_loop_proxy_unittest.cc b/base/message_loop/message_loop_task_runner_unittest.cc |
similarity index 58% |
rename from base/message_loop/message_loop_proxy_unittest.cc |
rename to base/message_loop/message_loop_task_runner_unittest.cc |
index 0b0d9f8ad00715ea541636e7d2938d6781f79330..caf88afadd020eccdf8a61b57ff943a74e209c14 100644 |
--- a/base/message_loop/message_loop_proxy_unittest.cc |
+++ b/base/message_loop/message_loop_task_runner_unittest.cc |
@@ -2,33 +2,30 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
-#include "base/message_loop/message_loop_proxy.h" |
+#include "base/message_loop/message_loop_task_runner.h" |
#include "base/atomic_sequence_num.h" |
#include "base/bind.h" |
#include "base/debug/leak_annotations.h" |
-#include "base/memory/ref_counted.h" |
#include "base/memory/scoped_ptr.h" |
#include "base/message_loop/message_loop.h" |
+#include "base/message_loop/message_loop_task_runner.h" |
#include "base/synchronization/waitable_event.h" |
+#include "base/thread_task_runner_handle.h" |
#include "base/threading/thread.h" |
#include "testing/gtest/include/gtest/gtest.h" |
+#include "testing/platform_test.h" |
namespace base { |
-namespace { |
- |
-class MessageLoopProxyTest : public testing::Test { |
+class MessageLoopTaskRunnerTest : public testing::Test { |
public: |
- MessageLoopProxyTest() |
+ MessageLoopTaskRunnerTest() |
: current_loop_(new MessageLoop()), |
task_thread_("task_thread"), |
- thread_sync_(true, false) { |
- } |
+ thread_sync_(true, false) {} |
- void DeleteCurrentMessageLoop() { |
- current_loop_.reset(); |
- } |
+ void DeleteCurrentMessageLoop() { current_loop_.reset(); } |
protected: |
void SetUp() override { |
@@ -38,8 +35,8 @@ class MessageLoopProxyTest : public testing::Test { |
// Allow us to pause the |task_thread_|'s MessageLoop. |
task_thread_.message_loop()->PostTask( |
- FROM_HERE, |
- Bind(&MessageLoopProxyTest::BlockTaskThreadHelper, Unretained(this))); |
+ FROM_HERE, Bind(&MessageLoopTaskRunnerTest::BlockTaskThreadHelper, |
+ Unretained(this))); |
} |
void TearDown() override { |
@@ -55,16 +52,14 @@ class MessageLoopProxyTest : public testing::Test { |
// threading mistake sneaks into the PostTaskAndReplyRelay implementation. |
class LoopRecorder : public RefCountedThreadSafe<LoopRecorder> { |
public: |
- LoopRecorder(MessageLoop** run_on, MessageLoop** deleted_on, |
+ LoopRecorder(MessageLoop** run_on, |
+ MessageLoop** deleted_on, |
int* destruct_order) |
: run_on_(run_on), |
deleted_on_(deleted_on), |
- destruct_order_(destruct_order) { |
- } |
+ destruct_order_(destruct_order) {} |
- void RecordRun() { |
- *run_on_ = MessageLoop::current(); |
- } |
+ void RecordRun() { *run_on_ = MessageLoop::current(); } |
private: |
friend class RefCountedThreadSafe<LoopRecorder>; |
@@ -87,13 +82,9 @@ class MessageLoopProxyTest : public testing::Test { |
MessageLoop::current()->QuitWhenIdle(); |
} |
- void UnblockTaskThread() { |
- thread_sync_.Signal(); |
- } |
+ void UnblockTaskThread() { thread_sync_.Signal(); } |
- void BlockTaskThreadHelper() { |
- thread_sync_.Wait(); |
- } |
+ void BlockTaskThreadHelper() { thread_sync_.Wait(); } |
static StaticAtomicSequenceNumber g_order; |
@@ -104,9 +95,9 @@ class MessageLoopProxyTest : public testing::Test { |
base::WaitableEvent thread_sync_; |
}; |
-StaticAtomicSequenceNumber MessageLoopProxyTest::g_order; |
+StaticAtomicSequenceNumber MessageLoopTaskRunnerTest::g_order; |
-TEST_F(MessageLoopProxyTest, PostTaskAndReply_Basic) { |
+TEST_F(MessageLoopTaskRunnerTest, PostTaskAndReply_Basic) { |
MessageLoop* task_run_on = NULL; |
MessageLoop* task_deleted_on = NULL; |
int task_delete_order = -1; |
@@ -119,9 +110,8 @@ TEST_F(MessageLoopProxyTest, PostTaskAndReply_Basic) { |
scoped_refptr<LoopRecorder> reply_recoder = |
new LoopRecorder(&reply_run_on, &reply_deleted_on, &reply_delete_order); |
- ASSERT_TRUE(task_thread_.message_loop_proxy()->PostTaskAndReply( |
- FROM_HERE, |
- Bind(&RecordLoop, task_recoder), |
+ ASSERT_TRUE(task_thread_.task_runner()->PostTaskAndReply( |
+ FROM_HERE, Bind(&RecordLoop, task_recoder), |
Bind(&RecordLoopAndQuit, reply_recoder))); |
// Die if base::Bind doesn't retain a reference to the recorders. |
@@ -140,7 +130,7 @@ TEST_F(MessageLoopProxyTest, PostTaskAndReply_Basic) { |
EXPECT_LT(task_delete_order, reply_delete_order); |
} |
-TEST_F(MessageLoopProxyTest, PostTaskAndReplyOnDeletedThreadDoesNotLeak) { |
+TEST_F(MessageLoopTaskRunnerTest, PostTaskAndReplyOnDeletedThreadDoesNotLeak) { |
MessageLoop* task_run_on = NULL; |
MessageLoop* task_deleted_on = NULL; |
int task_delete_order = -1; |
@@ -153,16 +143,15 @@ TEST_F(MessageLoopProxyTest, PostTaskAndReplyOnDeletedThreadDoesNotLeak) { |
scoped_refptr<LoopRecorder> reply_recoder = |
new LoopRecorder(&reply_run_on, &reply_deleted_on, &reply_delete_order); |
- // Grab a MessageLoopProxy to a dead MessageLoop. |
- scoped_refptr<MessageLoopProxy> task_loop_proxy = |
- task_thread_.message_loop_proxy(); |
+ // Grab a task runner to a dead MessageLoop. |
+ scoped_refptr<SingleThreadTaskRunner> task_runner = |
+ task_thread_.task_runner(); |
UnblockTaskThread(); |
task_thread_.Stop(); |
- ASSERT_FALSE(task_loop_proxy->PostTaskAndReply( |
- FROM_HERE, |
- Bind(&RecordLoop, task_recoder), |
- Bind(&RecordLoopAndQuit, reply_recoder))); |
+ ASSERT_FALSE( |
+ task_runner->PostTaskAndReply(FROM_HERE, Bind(&RecordLoop, task_recoder), |
+ Bind(&RecordLoopAndQuit, reply_recoder))); |
// The relay should have properly deleted its resources leaving us as the only |
// reference. |
@@ -175,7 +164,7 @@ TEST_F(MessageLoopProxyTest, PostTaskAndReplyOnDeletedThreadDoesNotLeak) { |
EXPECT_FALSE(reply_run_on); |
} |
-TEST_F(MessageLoopProxyTest, PostTaskAndReply_SameLoop) { |
+TEST_F(MessageLoopTaskRunnerTest, PostTaskAndReply_SameLoop) { |
MessageLoop* task_run_on = NULL; |
MessageLoop* task_deleted_on = NULL; |
int task_delete_order = -1; |
@@ -189,9 +178,8 @@ TEST_F(MessageLoopProxyTest, PostTaskAndReply_SameLoop) { |
new LoopRecorder(&reply_run_on, &reply_deleted_on, &reply_delete_order); |
// Enqueue the relay. |
- ASSERT_TRUE(current_loop_->message_loop_proxy()->PostTaskAndReply( |
- FROM_HERE, |
- Bind(&RecordLoop, task_recoder), |
+ ASSERT_TRUE(current_loop_->task_runner()->PostTaskAndReply( |
+ FROM_HERE, Bind(&RecordLoop, task_recoder), |
Bind(&RecordLoopAndQuit, reply_recoder))); |
// Die if base::Bind doesn't retain a reference to the recorders. |
@@ -209,7 +197,7 @@ TEST_F(MessageLoopProxyTest, PostTaskAndReply_SameLoop) { |
EXPECT_LT(task_delete_order, reply_delete_order); |
} |
-TEST_F(MessageLoopProxyTest, PostTaskAndReply_DeadReplyLoopDoesNotDelete) { |
+TEST_F(MessageLoopTaskRunnerTest, PostTaskAndReply_DeadReplyLoopDoesNotDelete) { |
// Annotate the scope as having memory leaks to suppress heapchecker reports. |
ANNOTATE_SCOPED_MEMORY_LEAK; |
MessageLoop* task_run_on = NULL; |
@@ -225,9 +213,8 @@ TEST_F(MessageLoopProxyTest, PostTaskAndReply_DeadReplyLoopDoesNotDelete) { |
new LoopRecorder(&reply_run_on, &reply_deleted_on, &reply_delete_order); |
// Enqueue the relay. |
- task_thread_.message_loop_proxy()->PostTaskAndReply( |
- FROM_HERE, |
- Bind(&RecordLoop, task_recoder), |
+ task_thread_.task_runner()->PostTaskAndReply( |
+ FROM_HERE, Bind(&RecordLoop, task_recoder), |
Bind(&RecordLoopAndQuit, reply_recoder)); |
// Die if base::Bind doesn't retain a reference to the recorders. |
@@ -261,6 +248,111 @@ TEST_F(MessageLoopProxyTest, PostTaskAndReply_DeadReplyLoopDoesNotDelete) { |
// http://crbug.com/86301. |
} |
-} // namespace |
+class MessageLoopTaskRunnerThreadingTest : public testing::Test { |
+ public: |
+ void Release() const { |
+ AssertOnIOThread(); |
+ Quit(); |
+ } |
+ |
+ void Quit() const { |
+ loop_.PostTask(FROM_HERE, MessageLoop::QuitWhenIdleClosure()); |
+ } |
+ |
+ void AssertOnIOThread() const { |
+ ASSERT_TRUE(io_thread_->task_runner()->BelongsToCurrentThread()); |
+ ASSERT_EQ(io_thread_->task_runner(), ThreadTaskRunnerHandle::Get()); |
+ } |
+ |
+ void AssertOnFileThread() const { |
+ ASSERT_TRUE(file_thread_->task_runner()->BelongsToCurrentThread()); |
+ ASSERT_EQ(file_thread_->task_runner(), ThreadTaskRunnerHandle::Get()); |
+ } |
+ |
+ protected: |
+ void SetUp() override { |
+ io_thread_.reset(new Thread("MessageLoopTaskRunnerThreadingTest_IO")); |
+ file_thread_.reset(new Thread("MessageLoopTaskRunnerThreadingTest_File")); |
+ io_thread_->Start(); |
+ file_thread_->Start(); |
+ } |
+ |
+ void TearDown() override { |
+ io_thread_->Stop(); |
+ file_thread_->Stop(); |
+ } |
+ |
+ static void BasicFunction(MessageLoopTaskRunnerThreadingTest* test) { |
+ test->AssertOnFileThread(); |
+ test->Quit(); |
+ } |
+ |
+ static void AssertNotRun() { FAIL() << "Callback Should not get executed."; } |
+ |
+ class DeletedOnFile { |
+ public: |
+ explicit DeletedOnFile(MessageLoopTaskRunnerThreadingTest* test) |
+ : test_(test) {} |
+ |
+ ~DeletedOnFile() { |
+ test_->AssertOnFileThread(); |
+ test_->Quit(); |
+ } |
+ |
+ private: |
+ MessageLoopTaskRunnerThreadingTest* test_; |
+ }; |
+ |
+ scoped_ptr<Thread> io_thread_; |
+ scoped_ptr<Thread> file_thread_; |
+ |
+ private: |
+ mutable MessageLoop loop_; |
+}; |
+ |
+TEST_F(MessageLoopTaskRunnerThreadingTest, Release) { |
+ EXPECT_TRUE(io_thread_->task_runner()->ReleaseSoon(FROM_HERE, this)); |
+ MessageLoop::current()->Run(); |
+} |
+ |
+TEST_F(MessageLoopTaskRunnerThreadingTest, Delete) { |
+ DeletedOnFile* deleted_on_file = new DeletedOnFile(this); |
+ EXPECT_TRUE( |
+ file_thread_->task_runner()->DeleteSoon(FROM_HERE, deleted_on_file)); |
+ MessageLoop::current()->Run(); |
+} |
+ |
+TEST_F(MessageLoopTaskRunnerThreadingTest, PostTask) { |
+ EXPECT_TRUE(file_thread_->task_runner()->PostTask( |
+ FROM_HERE, Bind(&MessageLoopTaskRunnerThreadingTest::BasicFunction, |
+ Unretained(this)))); |
+ MessageLoop::current()->Run(); |
+} |
+ |
+TEST_F(MessageLoopTaskRunnerThreadingTest, PostTaskAfterThreadExits) { |
+ scoped_ptr<Thread> test_thread( |
+ new Thread("MessageLoopTaskRunnerThreadingTest_Dummy")); |
+ test_thread->Start(); |
+ scoped_refptr<SingleThreadTaskRunner> task_runner = |
+ test_thread->task_runner(); |
+ test_thread->Stop(); |
+ |
+ bool ret = task_runner->PostTask( |
+ FROM_HERE, Bind(&MessageLoopTaskRunnerThreadingTest::AssertNotRun)); |
+ EXPECT_FALSE(ret); |
+} |
+ |
+TEST_F(MessageLoopTaskRunnerThreadingTest, PostTaskAfterThreadIsDeleted) { |
+ scoped_refptr<SingleThreadTaskRunner> task_runner; |
+ { |
+ scoped_ptr<Thread> test_thread( |
+ new Thread("MessageLoopTaskRunnerThreadingTest_Dummy")); |
+ test_thread->Start(); |
+ task_runner = test_thread->task_runner(); |
+ } |
+ bool ret = task_runner->PostTask( |
+ FROM_HERE, Bind(&MessageLoopTaskRunnerThreadingTest::AssertNotRun)); |
+ EXPECT_FALSE(ret); |
+} |
} // namespace base |