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

Unified Diff: base/message_loop/message_loop_unittest.cc

Issue 998063002: base: Make it possible to replace the MessageLoop's task runner (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: No more MessageLoopProxy. Created 5 years, 6 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
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
« base/message_loop/message_loop.cc ('K') | « base/message_loop/message_loop_task_runner.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698