Adding task runner/ message loop to tests that use IsolateHolder.
For adding v8 heap memory dump provider, the gin::IsolateHolder needs
to have a task runner at initialization. The tests which don't
initiallize task runner when initialization are changed in this CL to
have either the message loop initializaed earlier or a dummy task
runner. Refer crrev.com/1088683003 for the dump provider.
BUG=476013
Review URL: https://codereview.chromium.org/1130433002
Cr-Commit-Position: refs/heads/master@{#328531}
diff --git a/content/test/test_blink_web_unit_test_support.cc b/content/test/test_blink_web_unit_test_support.cc
index 7405be6..8aa66187 100644
--- a/content/test/test_blink_web_unit_test_support.cc
+++ b/content/test/test_blink_web_unit_test_support.cc
@@ -8,7 +8,10 @@
#include "base/files/file_util.h"
#include "base/files/scoped_temp_dir.h"
#include "base/path_service.h"
+#include "base/single_thread_task_runner.h"
#include "base/strings/utf_string_conversions.h"
+#include "base/thread_task_runner_handle.h"
+#include "base/threading/platform_thread.h"
#include "components/scheduler/renderer/renderer_scheduler.h"
#include "components/scheduler/renderer/webthread_impl_for_renderer_scheduler.h"
#include "content/test/mock_webclipboard_impl.h"
@@ -41,6 +44,40 @@
#include "gin/v8_initializer.h"
#endif
+namespace {
+
+class DummyTaskRunner : public base::SingleThreadTaskRunner {
+ public:
+ DummyTaskRunner() : thread_id_(base::PlatformThread::CurrentId()) {}
+
+ bool PostDelayedTask(const tracked_objects::Location& from_here,
+ const base::Closure& task,
+ base::TimeDelta delay) override {
+ NOTREACHED();
+ return false;
+ }
+
+ bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here,
+ const base::Closure& task,
+ base::TimeDelta delay) override {
+ NOTREACHED();
+ return false;
+ }
+
+ bool RunsTasksOnCurrentThread() const override {
+ return thread_id_ == base::PlatformThread::CurrentId();
+ }
+
+ protected:
+ ~DummyTaskRunner() override {}
+
+ base::PlatformThreadId thread_id_;
+
+ DISALLOW_COPY_AND_ASSIGN(DummyTaskRunner);
+};
+
+} // namespace
+
namespace content {
TestBlinkWebUnitTestSupport::TestBlinkWebUnitTestSupport() {
@@ -55,10 +92,23 @@
gin::V8Initializer::LoadV8Snapshot();
#endif
+ scoped_refptr<base::SingleThreadTaskRunner> dummy_task_runner;
+ scoped_ptr<base::ThreadTaskRunnerHandle> dummy_task_runner_handle;
if (base::MessageLoopProxy::current()) {
renderer_scheduler_ = scheduler::RendererScheduler::Create();
web_thread_.reset(new scheduler::WebThreadImplForRendererScheduler(
renderer_scheduler_.get()));
+ } else {
+ // Dummy task runner is initialized here because the blink::initialize
+ // creates IsolateHolder which needs the current task runner handle. There
+ // should be no task posted to this task runner. The message loop is not
+ // created before this initialization because some tests need specific kinds
+ // of message loops, and their types are not known upfront. Some tests also
+ // create their own thread bundles or message loops, and doing the same in
+ // TestBlinkWebUnitTestSupport would introduce a conflict.
+ dummy_task_runner = make_scoped_refptr(new DummyTaskRunner());
+ dummy_task_runner_handle.reset(
+ new base::ThreadTaskRunnerHandle(dummy_task_runner));
}
blink::initialize(this);
diff --git a/gin/modules/module_registry_unittest.cc b/gin/modules/module_registry_unittest.cc
index 2d6e6daf..00c6a94 100644
--- a/gin/modules/module_registry_unittest.cc
+++ b/gin/modules/module_registry_unittest.cc
@@ -5,7 +5,6 @@
#include "gin/modules/module_registry.h"
#include "base/bind.h"
-#include "base/message_loop/message_loop.h"
#include "gin/modules/module_registry_observer.h"
#include "gin/modules/module_runner_delegate.h"
#include "gin/public/context_holder.h"
@@ -25,7 +24,6 @@
scope(runner.get()) {
}
- base::MessageLoop message_loop;
ModuleRunnerDelegate delegate;
scoped_ptr<ShellRunner> runner;
Runner::Scope scope;
diff --git a/gin/modules/timer_unittest.cc b/gin/modules/timer_unittest.cc
index 705bdc56..612275e 100644
--- a/gin/modules/timer_unittest.cc
+++ b/gin/modules/timer_unittest.cc
@@ -64,9 +64,10 @@
result->GetWrapper(isolate));
}
- void QuitSoon() {
- loop.PostDelayedTask(FROM_HERE, base::MessageLoop::QuitWhenIdleClosure(),
- base::TimeDelta::FromMilliseconds(0));
+ void QuitSoon(base::MessageLoop* message_loop) {
+ message_loop->PostDelayedTask(FROM_HERE,
+ base::MessageLoop::QuitWhenIdleClosure(),
+ base::TimeDelta::FromMilliseconds(0));
}
ShellRunnerDelegate delegate;
@@ -74,7 +75,6 @@
Runner::Scope scope;
Handle<TimerModule> timer_module;
Handle<Result> result;
- base::MessageLoop loop;
};
} // namespace
@@ -91,8 +91,8 @@
helper.runner->Run(source, "script");
EXPECT_EQ(0, helper.result->count());
- helper.QuitSoon();
- helper.loop.Run();
+ helper.QuitSoon(&message_loop_);
+ message_loop_.Run();
EXPECT_EQ(1, helper.result->count());
}
@@ -107,8 +107,8 @@
helper.runner->Run(source, "script");
EXPECT_EQ(0, helper.result->count());
- helper.QuitSoon();
- helper.loop.Run();
+ helper.QuitSoon(&message_loop_);
+ message_loop_.Run();
EXPECT_EQ(0, helper.result->count());
}
@@ -128,7 +128,7 @@
helper.runner->Run(source, "script");
EXPECT_EQ(0, helper.result->count());
- helper.loop.Run();
+ message_loop_.Run();
EXPECT_EQ(3, helper.result->count());
}
@@ -143,9 +143,9 @@
EXPECT_EQ(0, helper.result->count());
// Destroy runner, which should destroy the timer object we created.
- helper.QuitSoon();
+ helper.QuitSoon(&message_loop_);
helper.runner.reset(NULL);
- helper.loop.Run();
+ message_loop_.Run();
// Timer should not have run because it was deleted.
EXPECT_EQ(0, helper.result->count());
diff --git a/gin/shell_runner_unittest.cc b/gin/shell_runner_unittest.cc
index 340b673..4e4b9c2f 100644
--- a/gin/shell_runner_unittest.cc
+++ b/gin/shell_runner_unittest.cc
@@ -5,6 +5,7 @@
#include "gin/shell_runner.h"
#include "base/compiler_specific.h"
+#include "base/message_loop/message_loop.h"
#include "gin/array_buffer.h"
#include "gin/converter.h"
#include "gin/public/isolate_holder.h"
@@ -23,6 +24,7 @@
namespace gin {
TEST(RunnerTest, Run) {
+ base::MessageLoop message_loop;
std::string source = "this.result = 'PASS';\n";
#ifdef V8_USE_EXTERNAL_STARTUP_DATA
diff --git a/gin/test/v8_test.h b/gin/test/v8_test.h
index e9209ce..592b889 100644
--- a/gin/test/v8_test.h
+++ b/gin/test/v8_test.h
@@ -8,6 +8,7 @@
#include "base/basictypes.h"
#include "base/compiler_specific.h"
#include "base/memory/scoped_ptr.h"
+#include "base/message_loop/message_loop.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "v8/include/v8.h"
@@ -26,6 +27,7 @@
void TearDown() override;
protected:
+ base::MessageLoop message_loop_;
scoped_ptr<IsolateHolder> instance_;
v8::Persistent<v8::Context> context_;