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

Side by Side Diff: gin/modules/timer_unittest.cc

Issue 100143006: Added a test for destroying an isolate while a timer is outstanding. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: remove old comment Created 7 years 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « gin/modules/timer.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "gin/modules/timer.h" 5 #include "gin/modules/timer.h"
6 6
7 #include "base/memory/scoped_ptr.h"
7 #include "base/message_loop/message_loop.h" 8 #include "base/message_loop/message_loop.h"
8 #include "gin/handle.h" 9 #include "gin/handle.h"
9 #include "gin/object_template_builder.h" 10 #include "gin/object_template_builder.h"
10 #include "gin/public/isolate_holder.h" 11 #include "gin/public/isolate_holder.h"
11 #include "gin/runner.h" 12 #include "gin/runner.h"
12 #include "gin/test/v8_test.h" 13 #include "gin/test/v8_test.h"
13 #include "gin/try_catch.h" 14 #include "gin/try_catch.h"
14 #include "gin/wrappable.h" 15 #include "gin/wrappable.h"
15 #include "v8/include/v8.h" 16 #include "v8/include/v8.h"
16 17
17 namespace gin { 18 namespace gin {
18 19
19 namespace { 20 namespace {
20 21
21 class Result : public Wrappable<Result> { 22 class Result : public Wrappable<Result> {
22 public: 23 public:
23 static WrapperInfo kWrapperInfo; 24 static WrapperInfo kWrapperInfo;
24 static Handle<Result> Create(v8::Isolate* isolate) { 25 static Handle<Result> Create(v8::Isolate* isolate) {
25 return CreateHandle(isolate, new Result()); 26 return CreateHandle(isolate, new Result());
26 } 27 }
27 28
28 int count() const { return count_; } 29 int count() const { return count_; }
29 void set_count(int count) { count_ = count; } 30 void set_count(int count) { count_ = count; }
30 31
31 void quit() { 32 void Quit() {
32 base::MessageLoop::current()->Quit(); 33 base::MessageLoop::current()->QuitNow();
33 } 34 }
34 35
35 private: 36 private:
36 Result() : count_(0) { 37 Result() : count_(0) {
37 } 38 }
38 39
39 virtual ~Result() { 40 virtual ~Result() {
40 } 41 }
41 42
42 virtual ObjectTemplateBuilder GetObjectTemplateBuilder( 43 virtual ObjectTemplateBuilder GetObjectTemplateBuilder(
43 v8::Isolate* isolate) OVERRIDE { 44 v8::Isolate* isolate) OVERRIDE {
44 return Wrappable<Result>::GetObjectTemplateBuilder(isolate) 45 return Wrappable<Result>::GetObjectTemplateBuilder(isolate)
45 .SetProperty("count", &Result::count, &Result::set_count) 46 .SetProperty("count", &Result::count, &Result::set_count)
46 .SetMethod("quit", &Result::quit); 47 .SetMethod("quit", &Result::Quit);
47 } 48 }
48 49
49 int count_; 50 int count_;
50 }; 51 };
51 52
52 WrapperInfo Result::kWrapperInfo = { gin::kEmbedderNativeGin }; 53 WrapperInfo Result::kWrapperInfo = { gin::kEmbedderNativeGin };
53 54
55 struct TestHelper {
56 TestHelper(v8::Isolate* isolate)
57 : runner(new Runner(&delegate, isolate)),
58 scope(runner.get()),
59 timer_module(TimerModule::Create(isolate)),
60 result(Result::Create(isolate)),
61 loop(base::MessageLoop::TYPE_DEFAULT) {
62 EXPECT_FALSE(runner->global().IsEmpty());
63 runner->global()->Set(StringToV8(isolate, "timer"),
64 timer_module->GetWrapper(isolate));
65 runner->global()->Set(StringToV8(isolate, "result"),
66 result->GetWrapper(isolate));
67 }
68
69 void QuitSoon() {
70 loop.PostDelayedTask(FROM_HERE, base::MessageLoop::QuitWhenIdleClosure(),
71 base::TimeDelta::FromMilliseconds(0));
72 }
73
74 RunnerDelegate delegate;
75 scoped_ptr<Runner> runner;
76 Runner::Scope scope;
77 Handle<TimerModule> timer_module;
78 Handle<Result> result;
79 base::MessageLoop loop;
80 };
81
54 } // namespace 82 } // namespace
55 83
56 typedef V8Test TimerUnittest; 84 typedef V8Test TimerUnittest;
57 85
58 TEST_F(TimerUnittest, OneShot) { 86 TEST_F(TimerUnittest, OneShot) {
59 v8::Isolate* isolate = instance_->isolate(); 87 TestHelper helper(instance_->isolate());
60
61 RunnerDelegate delegate;
62 Runner runner(&delegate, isolate);
63 Runner::Scope scope(&runner);
64
65 Handle<TimerModule> timer_module = TimerModule::Create(isolate);
66 Handle<Result> result = Result::Create(isolate);
67
68 EXPECT_FALSE(runner.global().IsEmpty());
69 runner.global()->Set(StringToV8(isolate, "timer"),
70 timer_module->GetWrapper(isolate));
71 runner.global()->Set(StringToV8(isolate, "result"),
72 result->GetWrapper(isolate));
73
74 std::string source = 88 std::string source =
75 "timer.createOneShot(100, function() {" 89 "timer.createOneShot(0, function() {"
76 " result.count++;" 90 " result.count++;"
77 " result.quit();"
78 "});"; 91 "});";
79 92
80 base::MessageLoop loop(base::MessageLoop::TYPE_DEFAULT); 93 helper.runner->Run(source, "script");
81 runner.Run(source, "script"); 94 EXPECT_EQ(0, helper.result->count());
82 EXPECT_EQ(0, result->count());
83 95
84 loop.Run(); 96 helper.QuitSoon();
85 loop.RunUntilIdle(); 97 helper.loop.Run();
98 EXPECT_EQ(1, helper.result->count());
99 }
86 100
87 EXPECT_EQ(1, result->count()); 101 TEST_F(TimerUnittest, OneShotCancel) {
102 TestHelper helper(instance_->isolate());
103 std::string source =
104 "var t = timer.createOneShot(0, function() {"
105 " result.count++;"
106 "});"
107 "t.cancel()";
108
109 helper.runner->Run(source, "script");
110 EXPECT_EQ(0, helper.result->count());
111
112 helper.QuitSoon();
113 helper.loop.Run();
114 EXPECT_EQ(0, helper.result->count());
88 } 115 }
89 116
90 TEST_F(TimerUnittest, Repeating) { 117 TEST_F(TimerUnittest, Repeating) {
91 v8::Isolate* isolate = instance_->isolate(); 118 TestHelper helper(instance_->isolate());
92
93 RunnerDelegate delegate;
94 Runner runner(&delegate, isolate);
95 Runner::Scope scope(&runner);
96
97 Handle<TimerModule> timer_module = TimerModule::Create(isolate);
98 Handle<Result> result = Result::Create(isolate);
99
100 EXPECT_FALSE(runner.global().IsEmpty());
101 runner.global()->Set(StringToV8(isolate, "timer"),
102 timer_module->GetWrapper(isolate));
103 runner.global()->Set(StringToV8(isolate, "result"),
104 result->GetWrapper(isolate));
105 119
106 // TODO(aa): Cannot do: if (++result.count == 3) because of v8 bug. Create 120 // TODO(aa): Cannot do: if (++result.count == 3) because of v8 bug. Create
107 // test case and report. 121 // test case and report.
108 std::string source = 122 std::string source =
109 "timer.createRepeating(10, function() {" 123 "timer.createRepeating(0, function() {"
110 " result.count++;" 124 " result.count++;"
111 " if (result.count == 3) {" 125 " if (result.count == 3) {"
112 " result.quit();" 126 " result.quit();"
113 " }" 127 " }"
114 "});"; 128 "});";
115 129
116 base::MessageLoop loop(base::MessageLoop::TYPE_DEFAULT); 130 helper.runner->Run(source, "script");
117 runner.Run(source, "script"); 131 EXPECT_EQ(0, helper.result->count());
118 EXPECT_EQ(0, result->count());
119 132
120 loop.Run(); 133 helper.loop.Run();
121 EXPECT_EQ(3, result->count()); 134 EXPECT_EQ(3, helper.result->count());
135 }
136
137 TEST_F(TimerUnittest, TimerCallbackToDestroyedRunner) {
138 TestHelper helper(instance_->isolate());
139 std::string source =
140 "timer.createOneShot(0, function() {"
141 " result.count++;"
142 "});";
143
144 helper.runner->Run(source, "script");
145 EXPECT_EQ(0, helper.result->count());
146
147 // Destroy runner, which should destroy the timer object we created.
148 helper.QuitSoon();
149 helper.runner.reset(NULL);
150 helper.loop.Run();
151
152 // Timer should not have run because it was deleted.
153 EXPECT_EQ(0, helper.result->count());
122 } 154 }
123 155
124 } // namespace gin 156 } // namespace gin
OLDNEW
« no previous file with comments | « gin/modules/timer.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698