| 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
|
|
|