Index: base/message_loop/message_loop_unittest.cc |
diff --git a/base/message_loop/message_loop_unittest.cc b/base/message_loop/message_loop_unittest.cc |
index 48c82c4792b51a5e0d67e9ca7737bd24a885e4bb..7c78d37bf02e0a91bf103e4558e6c79ee9f987b2 100644 |
--- a/base/message_loop/message_loop_unittest.cc |
+++ b/base/message_loop/message_loop_unittest.cc |
@@ -9,12 +9,14 @@ |
#include "base/compiler_specific.h" |
#include "base/logging.h" |
#include "base/memory/ref_counted.h" |
+#include "base/message_loop/bindable_single_thread_task_runner.h" |
#include "base/message_loop/message_loop.h" |
#include "base/message_loop/message_loop_test.h" |
#include "base/pending_task.h" |
#include "base/posix/eintr_wrapper.h" |
#include "base/run_loop.h" |
#include "base/synchronization/waitable_event.h" |
+#include "base/test/test_simple_task_runner.h" |
#include "base/thread_task_runner_handle.h" |
#include "base/threading/platform_thread.h" |
#include "base/threading/thread.h" |
@@ -1011,4 +1013,68 @@ TEST(MessageLoopTest, AlwaysHaveUserMessageWhenNesting) { |
} |
#endif // defined(OS_WIN) |
+class TestTaskRunner : public BindableSingleThreadTaskRunner { |
+ public: |
+ TestTaskRunner() : was_bound_(false) {} |
+ |
+ // BindableSingleThreadTaskRunner implementation: |
+ void BindToCurrentThread() override { was_bound_ = true; } |
+ bool PostDelayedTask(const tracked_objects::Location& from_here, |
+ const base::Closure& task, |
+ base::TimeDelta delay) override { |
+ return false; |
+ } |
+ bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here, |
+ const base::Closure& task, |
+ base::TimeDelta delay) override { |
+ return false; |
+ } |
+ bool RunsTasksOnCurrentThread() const override { return was_bound_; } |
+ |
+ bool was_bound() const { return was_bound_; } |
+ |
+ private: |
+ ~TestTaskRunner() override {} |
+ |
+ bool was_bound_; |
+}; |
+ |
+TEST(MessageLoopTest, SwapTaskRunnerBeforeBinding) { |
+ scoped_ptr<MessageLoop> loop(MessageLoop::CreateUnbound( |
+ MessageLoop::TYPE_DEFAULT, MessageLoop::MessagePumpFactoryCallback())); |
+ scoped_refptr<TestTaskRunner> new_runner(new TestTaskRunner()); |
+ |
+ loop->SwapTaskRunner(new_runner); |
+ EXPECT_EQ(new_runner, loop->task_runner()); |
+ |
+ loop->BindToCurrentThread(); |
+ EXPECT_TRUE(new_runner->was_bound()); |
+ EXPECT_EQ(new_runner, ThreadTaskRunnerHandle::Get()); |
+} |
+ |
+TEST(MessageLoopTest, SwapTaskRunnerAfterBinding) { |
+ MessageLoop loop; |
+ scoped_refptr<TestTaskRunner> new_runner(new TestTaskRunner()); |
+ |
+ new_runner->BindToCurrentThread(); |
+ loop.SwapTaskRunner(new_runner); |
+ EXPECT_EQ(new_runner, loop.task_runner()); |
+ EXPECT_EQ(new_runner, ThreadTaskRunnerHandle::Get()); |
+} |
+ |
+TEST(MessageLoopTest, OriginalRunnerWorks) { |
+ MessageLoop loop; |
+ scoped_refptr<TestTaskRunner> new_runner(new TestTaskRunner()); |
+ |
+ new_runner->BindToCurrentThread(); |
+ scoped_refptr<BindableSingleThreadTaskRunner> original_runner( |
+ loop.SwapTaskRunner(new_runner)); |
+ |
+ scoped_refptr<Foo> foo(new Foo()); |
+ original_runner->PostTask(FROM_HERE, |
+ Bind(&Foo::Test1ConstRef, foo.get(), "a")); |
+ loop.RunUntilIdle(); |
+ EXPECT_EQ(1, foo->test_count()); |
+} |
+ |
} // namespace base |