| Index: gin/modules/timer_unittest.cc
|
| diff --git a/gin/modules/timer_unittest.cc b/gin/modules/timer_unittest.cc
|
| index 96972d562dad4fbfda2a2839d757e4f3b7eeae6b..aaffbdedf82b724fad1e212c5805fbf5ff6417ad 100644
|
| --- a/gin/modules/timer_unittest.cc
|
| +++ b/gin/modules/timer_unittest.cc
|
| @@ -4,6 +4,7 @@
|
|
|
| #include "gin/modules/timer.h"
|
|
|
| +#include "base/memory/scoped_ptr.h"
|
| #include "base/message_loop/message_loop.h"
|
| #include "gin/handle.h"
|
| #include "gin/object_template_builder.h"
|
| @@ -28,8 +29,8 @@ class Result : public Wrappable<Result> {
|
| int count() const { return count_; }
|
| void set_count(int count) { count_ = count; }
|
|
|
| - void quit() {
|
| - base::MessageLoop::current()->Quit();
|
| + void Quit() {
|
| + base::MessageLoop::current()->QuitNow();
|
| }
|
|
|
| private:
|
| @@ -43,7 +44,7 @@ class Result : public Wrappable<Result> {
|
| v8::Isolate* isolate) OVERRIDE {
|
| return Wrappable<Result>::GetObjectTemplateBuilder(isolate)
|
| .SetProperty("count", &Result::count, &Result::set_count)
|
| - .SetMethod("quit", &Result::quit);
|
| + .SetMethod("quit", &Result::Quit);
|
| }
|
|
|
| int count_;
|
| @@ -51,74 +52,105 @@ class Result : public Wrappable<Result> {
|
|
|
| WrapperInfo Result::kWrapperInfo = { gin::kEmbedderNativeGin };
|
|
|
| -} // namespace
|
| -
|
| -typedef V8Test TimerUnittest;
|
| +struct TestHelper {
|
| + TestHelper(v8::Isolate* isolate)
|
| + : runner(new Runner(&delegate, isolate)),
|
| + scope(runner.get()),
|
| + timer_module(TimerModule::Create(isolate)),
|
| + result(Result::Create(isolate)),
|
| + loop(base::MessageLoop::TYPE_DEFAULT) {
|
| + EXPECT_FALSE(runner->global().IsEmpty());
|
| + runner->global()->Set(StringToV8(isolate, "timer"),
|
| + timer_module->GetWrapper(isolate));
|
| + runner->global()->Set(StringToV8(isolate, "result"),
|
| + result->GetWrapper(isolate));
|
| + }
|
|
|
| -TEST_F(TimerUnittest, OneShot) {
|
| - v8::Isolate* isolate = instance_->isolate();
|
| + void QuitSoon() {
|
| + loop.PostDelayedTask(FROM_HERE, base::MessageLoop::QuitWhenIdleClosure(),
|
| + base::TimeDelta::FromMilliseconds(0));
|
| + }
|
|
|
| RunnerDelegate delegate;
|
| - Runner runner(&delegate, isolate);
|
| - Runner::Scope scope(&runner);
|
| + scoped_ptr<Runner> runner;
|
| + Runner::Scope scope;
|
| + Handle<TimerModule> timer_module;
|
| + Handle<Result> result;
|
| + base::MessageLoop loop;
|
| +};
|
|
|
| - Handle<TimerModule> timer_module = TimerModule::Create(isolate);
|
| - Handle<Result> result = Result::Create(isolate);
|
| +} // namespace
|
|
|
| - EXPECT_FALSE(runner.global().IsEmpty());
|
| - runner.global()->Set(StringToV8(isolate, "timer"),
|
| - timer_module->GetWrapper(isolate));
|
| - runner.global()->Set(StringToV8(isolate, "result"),
|
| - result->GetWrapper(isolate));
|
| +typedef V8Test TimerUnittest;
|
|
|
| +TEST_F(TimerUnittest, OneShot) {
|
| + TestHelper helper(instance_->isolate());
|
| std::string source =
|
| - "timer.createOneShot(100, function() {"
|
| + "timer.createOneShot(0, function() {"
|
| " result.count++;"
|
| - " result.quit();"
|
| "});";
|
|
|
| - base::MessageLoop loop(base::MessageLoop::TYPE_DEFAULT);
|
| - runner.Run(source, "script");
|
| - EXPECT_EQ(0, result->count());
|
| + helper.runner->Run(source, "script");
|
| + EXPECT_EQ(0, helper.result->count());
|
|
|
| - loop.Run();
|
| - loop.RunUntilIdle();
|
| -
|
| - EXPECT_EQ(1, result->count());
|
| + helper.QuitSoon();
|
| + helper.loop.Run();
|
| + EXPECT_EQ(1, helper.result->count());
|
| }
|
|
|
| -TEST_F(TimerUnittest, Repeating) {
|
| - v8::Isolate* isolate = instance_->isolate();
|
| +TEST_F(TimerUnittest, OneShotCancel) {
|
| + TestHelper helper(instance_->isolate());
|
| + std::string source =
|
| + "var t = timer.createOneShot(0, function() {"
|
| + " result.count++;"
|
| + "});"
|
| + "t.cancel()";
|
|
|
| - RunnerDelegate delegate;
|
| - Runner runner(&delegate, isolate);
|
| - Runner::Scope scope(&runner);
|
| + helper.runner->Run(source, "script");
|
| + EXPECT_EQ(0, helper.result->count());
|
|
|
| - Handle<TimerModule> timer_module = TimerModule::Create(isolate);
|
| - Handle<Result> result = Result::Create(isolate);
|
| + helper.QuitSoon();
|
| + helper.loop.Run();
|
| + EXPECT_EQ(0, helper.result->count());
|
| +}
|
|
|
| - EXPECT_FALSE(runner.global().IsEmpty());
|
| - runner.global()->Set(StringToV8(isolate, "timer"),
|
| - timer_module->GetWrapper(isolate));
|
| - runner.global()->Set(StringToV8(isolate, "result"),
|
| - result->GetWrapper(isolate));
|
| +TEST_F(TimerUnittest, Repeating) {
|
| + TestHelper helper(instance_->isolate());
|
|
|
| // TODO(aa): Cannot do: if (++result.count == 3) because of v8 bug. Create
|
| // test case and report.
|
| std::string source =
|
| - "timer.createRepeating(10, function() {"
|
| + "timer.createRepeating(0, function() {"
|
| " result.count++;"
|
| " if (result.count == 3) {"
|
| " result.quit();"
|
| " }"
|
| "});";
|
|
|
| - base::MessageLoop loop(base::MessageLoop::TYPE_DEFAULT);
|
| - runner.Run(source, "script");
|
| - EXPECT_EQ(0, result->count());
|
| + helper.runner->Run(source, "script");
|
| + EXPECT_EQ(0, helper.result->count());
|
| +
|
| + helper.loop.Run();
|
| + EXPECT_EQ(3, helper.result->count());
|
| +}
|
| +
|
| +TEST_F(TimerUnittest, TimerCallbackToDestroyedRunner) {
|
| + TestHelper helper(instance_->isolate());
|
| + std::string source =
|
| + "timer.createOneShot(0, function() {"
|
| + " result.count++;"
|
| + "});";
|
| +
|
| + helper.runner->Run(source, "script");
|
| + EXPECT_EQ(0, helper.result->count());
|
| +
|
| + // Destroy runner, which should destroy the timer object we created.
|
| + helper.QuitSoon();
|
| + helper.runner.reset(NULL);
|
| + helper.loop.Run();
|
|
|
| - loop.Run();
|
| - EXPECT_EQ(3, result->count());
|
| + // Timer should not have run because it was deleted.
|
| + EXPECT_EQ(0, helper.result->count());
|
| }
|
|
|
| } // namespace gin
|
|
|