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

Side by Side Diff: chrome/browser/extensions/api/alarms/alarms_api_unittest.cc

Issue 22900005: Fixing race conditions in chrome.alarms (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 4 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 // This file tests the chrome.alarms extension API. 5 // This file tests the chrome.alarms extension API.
6 6
7 #include "base/test/simple_test_clock.h" 7 #include "base/test/simple_test_clock.h"
8 #include "base/values.h" 8 #include "base/values.h"
9 #include "chrome/browser/extensions/api/alarms/alarm_manager.h" 9 #include "chrome/browser/extensions/api/alarms/alarm_manager.h"
10 #include "chrome/browser/extensions/api/alarms/alarms_api.h" 10 #include "chrome/browser/extensions/api/alarms/alarms_api.h"
(...skipping 26 matching lines...) Expand all
37 const Alarm& alarm) OVERRIDE { 37 const Alarm& alarm) OVERRIDE {
38 alarms_seen.push_back(alarm.js_alarm->name); 38 alarms_seen.push_back(alarm.js_alarm->name);
39 base::MessageLoop::current()->Quit(); 39 base::MessageLoop::current()->Quit();
40 } 40 }
41 41
42 std::vector<std::string> alarms_seen; 42 std::vector<std::string> alarms_seen;
43 }; 43 };
44 44
45 } // namespace 45 } // namespace
46 46
47 void RunScheduleNextPoll(AlarmManager* alarm_manager) {
48 alarm_manager->ScheduleNextPoll();
49 }
50
47 class ExtensionAlarmsTest : public BrowserWithTestWindowTest { 51 class ExtensionAlarmsTest : public BrowserWithTestWindowTest {
48 public: 52 public:
49 virtual void SetUp() { 53 virtual void SetUp() {
50 BrowserWithTestWindowTest::SetUp(); 54 BrowserWithTestWindowTest::SetUp();
51 55
52 test_clock_ = new base::SimpleTestClock(); 56 test_clock_ = new base::SimpleTestClock();
53 alarm_manager_ = AlarmManager::Get(browser()->profile()); 57 alarm_manager_ = AlarmManager::Get(browser()->profile());
54 alarm_manager_->SetClockForTesting(test_clock_); 58 alarm_manager_->SetClockForTesting(test_clock_);
55 59
56 alarm_delegate_ = new AlarmDelegate(); 60 alarm_delegate_ = new AlarmDelegate();
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
128 "[\"7\", {\"periodInMinutes\": 7}]", 132 "[\"7\", {\"periodInMinutes\": 7}]",
129 "[\"0\", {\"delayInMinutes\": 0}]", 133 "[\"0\", {\"delayInMinutes\": 0}]",
130 }; 134 };
131 for (size_t i = 0; i < num_alarms; ++i) { 135 for (size_t i = 0; i < num_alarms; ++i) {
132 scoped_ptr<base::DictionaryValue> result(RunFunctionAndReturnDict( 136 scoped_ptr<base::DictionaryValue> result(RunFunctionAndReturnDict(
133 new AlarmsCreateFunction(test_clock_), kCreateArgs[i])); 137 new AlarmsCreateFunction(test_clock_), kCreateArgs[i]));
134 EXPECT_FALSE(result.get()); 138 EXPECT_FALSE(result.get());
135 } 139 }
136 } 140 }
137 141
138 protected:
139 base::SimpleTestClock* test_clock_; 142 base::SimpleTestClock* test_clock_;
140 AlarmManager* alarm_manager_; 143 AlarmManager* alarm_manager_;
141 AlarmDelegate* alarm_delegate_; 144 AlarmDelegate* alarm_delegate_;
142 scoped_refptr<extensions::Extension> extension_; 145 scoped_refptr<extensions::Extension> extension_;
146
147 protected:
143 content::WebContents* contents_; 148 content::WebContents* contents_;
144 }; 149 };
145 150
146 TEST_F(ExtensionAlarmsTest, Create) { 151 void ExtensionAlarmsTestGetAllAlarmsCallback(
147 test_clock_->SetNow(base::Time::FromDoubleT(10)); 152 const AlarmManager::AlarmList* alarms) {
148 // Create 1 non-repeating alarm. 153 // Ensure the alarm is gone.
149 CreateAlarm("[null, {\"delayInMinutes\": 0}]"); 154 ASSERT_FALSE(alarms);
155 }
150 156
151 const Alarm* alarm = 157 void ExtensionAlarmsTestGetAlarmCallback(
152 alarm_manager_->GetAlarm(extension_->id(), std::string()); 158 ExtensionAlarmsTest* test, Alarm* alarm) {
153 ASSERT_TRUE(alarm); 159 ASSERT_TRUE(alarm);
154 EXPECT_EQ("", alarm->js_alarm->name); 160 EXPECT_EQ("", alarm->js_alarm->name);
155 EXPECT_DOUBLE_EQ(10000, alarm->js_alarm->scheduled_time); 161 EXPECT_DOUBLE_EQ(10000, alarm->js_alarm->scheduled_time);
156 EXPECT_FALSE(alarm->js_alarm->period_in_minutes.get()); 162 EXPECT_FALSE(alarm->js_alarm->period_in_minutes.get());
157 163
158 // Now wait for the alarm to fire. Our test delegate will quit the 164 // Now wait for the alarm to fire. Our test delegate will quit the
159 // MessageLoop when that happens. 165 // MessageLoop when that happens.
160 base::MessageLoop::current()->Run(); 166 base::MessageLoop::current()->Run();
161 167
162 ASSERT_EQ(1u, alarm_delegate_->alarms_seen.size()); 168 ASSERT_EQ(1u, test->alarm_delegate_->alarms_seen.size());
163 EXPECT_EQ("", alarm_delegate_->alarms_seen[0]); 169 EXPECT_EQ("", test->alarm_delegate_->alarms_seen[0]);
164 170
165 // Ensure the alarm is gone. 171 // Ensure the alarm is gone.
166 { 172 test->alarm_manager_->GetAllAlarms(test->extension_->id(), base::Bind(
167 const AlarmManager::AlarmList* alarms = 173 ExtensionAlarmsTestGetAllAlarmsCallback));
168 alarm_manager_->GetAllAlarms(extension_->id()); 174 }
169 ASSERT_FALSE(alarms); 175
170 } 176 TEST_F(ExtensionAlarmsTest, Create) {
177 test_clock_->SetNow(base::Time::FromDoubleT(10));
178 // Create 1 non-repeating alarm.
179 CreateAlarm("[null, {\"delayInMinutes\": 0}]");
180
181 alarm_manager_->GetAlarm(extension_->id(), std::string(), base::Bind(
182 ExtensionAlarmsTestGetAlarmCallback, this));
183 }
184
185 void ExtensionAlarmsTestCreateRepeatingGetAlarmCallback(
186 ExtensionAlarmsTest* test, Alarm* alarm) {
187 ASSERT_TRUE(alarm);
188 EXPECT_EQ("", alarm->js_alarm->name);
189 EXPECT_DOUBLE_EQ(10060, alarm->js_alarm->scheduled_time);
190 EXPECT_THAT(alarm->js_alarm->period_in_minutes,
191 testing::Pointee(testing::DoubleEq(0.001)));
192
193 test->test_clock_->Advance(base::TimeDelta::FromSeconds(1));
194 // Now wait for the alarm to fire. Our test delegate will quit the
195 // MessageLoop when that happens.
196 base::MessageLoop::current()->Run();
197
198 test->test_clock_->Advance(base::TimeDelta::FromSeconds(1));
199 // Wait again, and ensure the alarm fires again.
200 RunScheduleNextPoll(test->alarm_manager_);
201 base::MessageLoop::current()->Run();
202
203 ASSERT_EQ(2u, test->alarm_delegate_->alarms_seen.size());
204 EXPECT_EQ("", test->alarm_delegate_->alarms_seen[0]);
171 } 205 }
172 206
173 TEST_F(ExtensionAlarmsTest, CreateRepeating) { 207 TEST_F(ExtensionAlarmsTest, CreateRepeating) {
174 test_clock_->SetNow(base::Time::FromDoubleT(10)); 208 test_clock_->SetNow(base::Time::FromDoubleT(10));
175 209
176 // Create 1 repeating alarm. 210 // Create 1 repeating alarm.
177 CreateAlarm("[null, {\"periodInMinutes\": 0.001}]"); 211 CreateAlarm("[null, {\"periodInMinutes\": 0.001}]");
178 212
179 const Alarm* alarm = 213 alarm_manager_->GetAlarm(extension_->id(), std::string(), base::Bind(
180 alarm_manager_->GetAlarm(extension_->id(), std::string()); 214 ExtensionAlarmsTestCreateRepeatingGetAlarmCallback, this));
215 }
216
217 void ExtensionAlarmsTestCreateAbsoluteGetAlarm2Callback(
218 ExtensionAlarmsTest* test, Alarm* alarm) {
219 ASSERT_FALSE(alarm);
220
221 ASSERT_EQ(1u, test->alarm_delegate_->alarms_seen.size());
222 EXPECT_EQ("", test->alarm_delegate_->alarms_seen[0]);
223 }
224
225 void ExtensionAlarmsTestCreateAbsoluteGetAlarm1Callback(
226 ExtensionAlarmsTest* test, Alarm* alarm) {
181 ASSERT_TRUE(alarm); 227 ASSERT_TRUE(alarm);
182 EXPECT_EQ("", alarm->js_alarm->name); 228 EXPECT_EQ("", alarm->js_alarm->name);
183 EXPECT_DOUBLE_EQ(10060, alarm->js_alarm->scheduled_time); 229 EXPECT_DOUBLE_EQ(10001, alarm->js_alarm->scheduled_time);
184 EXPECT_THAT(alarm->js_alarm->period_in_minutes, 230 EXPECT_THAT(alarm->js_alarm->period_in_minutes,
185 testing::Pointee(testing::DoubleEq(0.001))); 231 testing::IsNull());
186 232
187 test_clock_->Advance(base::TimeDelta::FromSeconds(1)); 233 test->test_clock_->SetNow(base::Time::FromDoubleT(10.1));
188 // Now wait for the alarm to fire. Our test delegate will quit the 234 // Now wait for the alarm to fire. Our test delegate will quit the
189 // MessageLoop when that happens. 235 // MessageLoop when that happens.
190 base::MessageLoop::current()->Run(); 236 base::MessageLoop::current()->Run();
191 237
192 test_clock_->Advance(base::TimeDelta::FromSeconds(1)); 238 test->alarm_manager_->GetAlarm(
193 // Wait again, and ensure the alarm fires again. 239 test->extension_->id(), std::string(), base::Bind(
194 alarm_manager_->ScheduleNextPoll(); 240 ExtensionAlarmsTestCreateAbsoluteGetAlarm2Callback, test));
195 base::MessageLoop::current()->Run();
196
197 ASSERT_EQ(2u, alarm_delegate_->alarms_seen.size());
198 EXPECT_EQ("", alarm_delegate_->alarms_seen[0]);
199 } 241 }
200 242
201 TEST_F(ExtensionAlarmsTest, CreateAbsolute) { 243 TEST_F(ExtensionAlarmsTest, CreateAbsolute) {
202 test_clock_->SetNow(base::Time::FromDoubleT(9.99)); 244 test_clock_->SetNow(base::Time::FromDoubleT(9.99));
203 CreateAlarm("[null, {\"when\": 10001}]"); 245 CreateAlarm("[null, {\"when\": 10001}]");
204 246
205 const Alarm* alarm = 247 alarm_manager_->GetAlarm(extension_->id(), std::string(), base::Bind(
206 alarm_manager_->GetAlarm(extension_->id(), std::string()); 248 ExtensionAlarmsTestCreateAbsoluteGetAlarm1Callback, this));
249 }
250
251 void ExtensionAlarmsTestCreateRepeatingWithQuickFirstCallGetAlarm3Callback(
252 ExtensionAlarmsTest* test, Alarm* alarm) {
253 ASSERT_TRUE(alarm);
254 EXPECT_THAT(test->alarm_delegate_->alarms_seen, testing::ElementsAre("", ""));
255 }
256
257 void ExtensionAlarmsTestCreateRepeatingWithQuickFirstCallGetAlarm2Callback(
258 ExtensionAlarmsTest* test, Alarm* alarm) {
259 ASSERT_TRUE(alarm);
260 EXPECT_THAT(test->alarm_delegate_->alarms_seen, testing::ElementsAre(""));
261
262 test->test_clock_->SetNow(base::Time::FromDoubleT(10.7));
263 base::MessageLoop::current()->Run();
264
265 test->alarm_manager_->GetAlarm(
266 test->extension_->id(), std::string(), base::Bind(
267 ExtensionAlarmsTestCreateRepeatingWithQuickFirstCallGetAlarm3Callback,
268 test));
269 }
270
271 void ExtensionAlarmsTestCreateRepeatingWithQuickFirstCallGetAlarm1Callback(
272 ExtensionAlarmsTest* test, Alarm* alarm) {
207 ASSERT_TRUE(alarm); 273 ASSERT_TRUE(alarm);
208 EXPECT_EQ("", alarm->js_alarm->name); 274 EXPECT_EQ("", alarm->js_alarm->name);
209 EXPECT_DOUBLE_EQ(10001, alarm->js_alarm->scheduled_time); 275 EXPECT_DOUBLE_EQ(10001, alarm->js_alarm->scheduled_time);
210 EXPECT_THAT(alarm->js_alarm->period_in_minutes, 276 EXPECT_THAT(alarm->js_alarm->period_in_minutes,
211 testing::IsNull()); 277 testing::Pointee(testing::DoubleEq(0.001)));
212 278
213 test_clock_->SetNow(base::Time::FromDoubleT(10.1)); 279 test->test_clock_->SetNow(base::Time::FromDoubleT(10.1));
214 // Now wait for the alarm to fire. Our test delegate will quit the 280 // Now wait for the alarm to fire. Our test delegate will quit the
215 // MessageLoop when that happens. 281 // MessageLoop when that happens.
216 base::MessageLoop::current()->Run(); 282 base::MessageLoop::current()->Run();
217 283
218 ASSERT_FALSE(alarm_manager_->GetAlarm(extension_->id(), std::string())); 284 test->alarm_manager_->GetAlarm(
219 285 test->extension_->id(), std::string(), base::Bind(
220 ASSERT_EQ(1u, alarm_delegate_->alarms_seen.size()); 286 ExtensionAlarmsTestCreateRepeatingWithQuickFirstCallGetAlarm2Callback,
221 EXPECT_EQ("", alarm_delegate_->alarms_seen[0]); 287 test));
222 } 288 }
223 289
224 TEST_F(ExtensionAlarmsTest, CreateRepeatingWithQuickFirstCall) { 290 TEST_F(ExtensionAlarmsTest, CreateRepeatingWithQuickFirstCall) {
225 test_clock_->SetNow(base::Time::FromDoubleT(9.99)); 291 test_clock_->SetNow(base::Time::FromDoubleT(9.99));
226 CreateAlarm("[null, {\"when\": 10001, \"periodInMinutes\": 0.001}]"); 292 CreateAlarm("[null, {\"when\": 10001, \"periodInMinutes\": 0.001}]");
227 293
228 const Alarm* alarm = 294 alarm_manager_->GetAlarm(extension_->id(), std::string(), base::Bind(
229 alarm_manager_->GetAlarm(extension_->id(), std::string()); 295 ExtensionAlarmsTestCreateRepeatingWithQuickFirstCallGetAlarm1Callback,
230 ASSERT_TRUE(alarm); 296 this));
231 EXPECT_EQ("", alarm->js_alarm->name); 297 }
232 EXPECT_DOUBLE_EQ(10001, alarm->js_alarm->scheduled_time);
233 EXPECT_THAT(alarm->js_alarm->period_in_minutes,
234 testing::Pointee(testing::DoubleEq(0.001)));
235 298
236 test_clock_->SetNow(base::Time::FromDoubleT(10.1)); 299 void ExtensionAlarmsTestCreateDupeGetAllAlarmsCallback(
237 // Now wait for the alarm to fire. Our test delegate will quit the 300 const AlarmManager::AlarmList* alarms) {
238 // MessageLoop when that happens. 301 ASSERT_TRUE(alarms);
239 base::MessageLoop::current()->Run(); 302 EXPECT_EQ(1u, alarms->size());
240 303 EXPECT_DOUBLE_EQ(430000, (*alarms)[0].js_alarm->scheduled_time);
241 ASSERT_TRUE(alarm_manager_->GetAlarm(extension_->id(), std::string()));
242 EXPECT_THAT(alarm_delegate_->alarms_seen, testing::ElementsAre(""));
243
244 test_clock_->SetNow(base::Time::FromDoubleT(10.7));
245 base::MessageLoop::current()->Run();
246
247 ASSERT_TRUE(alarm_manager_->GetAlarm(extension_->id(), std::string()));
248 EXPECT_THAT(alarm_delegate_->alarms_seen, testing::ElementsAre("", ""));
249 } 304 }
250 305
251 TEST_F(ExtensionAlarmsTest, CreateDupe) { 306 TEST_F(ExtensionAlarmsTest, CreateDupe) {
252 test_clock_->SetNow(base::Time::FromDoubleT(10)); 307 test_clock_->SetNow(base::Time::FromDoubleT(10));
253 308
254 // Create 2 duplicate alarms. The first should be overridden. 309 // Create 2 duplicate alarms. The first should be overridden.
255 CreateAlarm("[\"dup\", {\"delayInMinutes\": 1}]"); 310 CreateAlarm("[\"dup\", {\"delayInMinutes\": 1}]");
256 CreateAlarm("[\"dup\", {\"delayInMinutes\": 7}]"); 311 CreateAlarm("[\"dup\", {\"delayInMinutes\": 7}]");
257 312
258 { 313 alarm_manager_->GetAllAlarms(extension_->id(), base::Bind(
259 const AlarmManager::AlarmList* alarms = 314 ExtensionAlarmsTestCreateDupeGetAllAlarmsCallback));
260 alarm_manager_->GetAllAlarms(extension_->id());
261 ASSERT_TRUE(alarms);
262 EXPECT_EQ(1u, alarms->size());
263 EXPECT_DOUBLE_EQ(430000, (*alarms)[0].js_alarm->scheduled_time);
264 }
265 } 315 }
266 316
267 TEST_F(ExtensionAlarmsTest, CreateDelayBelowMinimum) { 317 TEST_F(ExtensionAlarmsTest, CreateDelayBelowMinimum) {
268 // Create an alarm with delay below the minimum accepted value. 318 // Create an alarm with delay below the minimum accepted value.
269 CreateAlarm("[\"negative\", {\"delayInMinutes\": -0.2}]"); 319 CreateAlarm("[\"negative\", {\"delayInMinutes\": -0.2}]");
270 IPC::TestSink& sink = static_cast<content::MockRenderProcessHost*>( 320 IPC::TestSink& sink = static_cast<content::MockRenderProcessHost*>(
271 contents_->GetRenderViewHost()->GetProcess())->sink(); 321 contents_->GetRenderViewHost()->GetProcess())->sink();
272 const IPC::Message* warning = sink.GetUniqueMessageMatching( 322 const IPC::Message* warning = sink.GetUniqueMessageMatching(
273 ExtensionMsg_AddMessageToConsole::ID); 323 ExtensionMsg_AddMessageToConsole::ID);
274 ASSERT_TRUE(warning); 324 ASSERT_TRUE(warning);
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
338 388
339 // Test the "7" alarm. 389 // Test the "7" alarm.
340 JsAlarm* alarm = alarms[0].get(); 390 JsAlarm* alarm = alarms[0].get();
341 if (alarm->name != "7") 391 if (alarm->name != "7")
342 alarm = alarms[1].get(); 392 alarm = alarms[1].get();
343 EXPECT_EQ("7", alarm->name); 393 EXPECT_EQ("7", alarm->name);
344 EXPECT_THAT(alarm->period_in_minutes, testing::Pointee(7)); 394 EXPECT_THAT(alarm->period_in_minutes, testing::Pointee(7));
345 } 395 }
346 } 396 }
347 397
398 void ExtensionAlarmsTestClearGetAllAlarms2Callback(
399 const AlarmManager::AlarmList* alarms) {
400 // Ensure the 0.001-minute alarm is still there, since it's repeating.
401 ASSERT_TRUE(alarms);
402 EXPECT_EQ(1u, alarms->size());
403 EXPECT_THAT((*alarms)[0].js_alarm->period_in_minutes,
404 testing::Pointee(0.001));
405 }
406
407 void ExtensionAlarmsTestClearGetAllAlarms1Callback(
408 ExtensionAlarmsTest* test, const AlarmManager::AlarmList* alarms) {
409 ASSERT_TRUE(alarms);
410 EXPECT_EQ(1u, alarms->size());
411 EXPECT_THAT((*alarms)[0].js_alarm->period_in_minutes,
412 testing::Pointee(0.001));
413
414 // Now wait for the alarms to fire, and ensure the cancelled alarms don't
415 // fire.
416 test->test_clock_->Advance(base::TimeDelta::FromMilliseconds(60));
417 RunScheduleNextPoll(test->alarm_manager_);
418 base::MessageLoop::current()->Run();
419
420 ASSERT_EQ(1u, test->alarm_delegate_->alarms_seen.size());
421 EXPECT_EQ("", test->alarm_delegate_->alarms_seen[0]);
422
423 // Ensure the 0.001-minute alarm is still there, since it's repeating.
424 test->alarm_manager_->GetAllAlarms(test->extension_->id(), base::Bind(
425 ExtensionAlarmsTestClearGetAllAlarms2Callback));
426 }
427
348 TEST_F(ExtensionAlarmsTest, Clear) { 428 TEST_F(ExtensionAlarmsTest, Clear) {
349 // Clear a non-existent one. 429 // Clear a non-existent one.
350 { 430 {
351 std::string error = RunFunctionAndReturnError( 431 std::string error = RunFunctionAndReturnError(
352 new AlarmsClearFunction(), "[\"nobody\"]"); 432 new AlarmsClearFunction(), "[\"nobody\"]");
353 EXPECT_FALSE(error.empty()); 433 EXPECT_FALSE(error.empty());
354 } 434 }
355 435
356 // Create 3 alarms. 436 // Create 3 alarms.
357 CreateAlarms(3); 437 CreateAlarms(3);
358 438
359 // Clear all but the 0.001-minute alarm. 439 // Clear all but the 0.001-minute alarm.
360 { 440 RunFunction(new AlarmsClearFunction(), "[\"7\"]");
361 RunFunction(new AlarmsClearFunction(), "[\"7\"]"); 441 RunFunction(new AlarmsClearFunction(), "[\"0\"]");
362 RunFunction(new AlarmsClearFunction(), "[\"0\"]");
363 442
364 const AlarmManager::AlarmList* alarms = 443 alarm_manager_->GetAllAlarms(extension_->id(), base::Bind(
365 alarm_manager_->GetAllAlarms(extension_->id()); 444 ExtensionAlarmsTestClearGetAllAlarms1Callback, this));
366 ASSERT_TRUE(alarms); 445 }
367 EXPECT_EQ(1u, alarms->size());
368 EXPECT_THAT((*alarms)[0].js_alarm->period_in_minutes,
369 testing::Pointee(0.001));
370 }
371 446
372 // Now wait for the alarms to fire, and ensure the cancelled alarms don't 447 void ExtensionAlarmsTestClearAllGetAllAlarms2Callback(
373 // fire. 448 const AlarmManager::AlarmList* alarms) {
374 alarm_manager_->ScheduleNextPoll(); 449 ASSERT_FALSE(alarms);
375 base::MessageLoop::current()->Run(); 450 }
376 451
377 ASSERT_EQ(1u, alarm_delegate_->alarms_seen.size()); 452 void ExtensionAlarmsTestClearAllGetAllAlarms1Callback(
378 EXPECT_EQ("", alarm_delegate_->alarms_seen[0]); 453 ExtensionAlarmsTest* test, const AlarmManager::AlarmList* alarms) {
454 ASSERT_TRUE(alarms);
455 EXPECT_EQ(3u, alarms->size());
379 456
380 // Ensure the 0.001-minute alarm is still there, since it's repeating. 457 // Clear them.
381 { 458 test->RunFunction(new AlarmsClearAllFunction(), "[]");
382 const AlarmManager::AlarmList* alarms = 459 test->alarm_manager_->GetAllAlarms(
383 alarm_manager_->GetAllAlarms(extension_->id()); 460 test->extension_->id(), base::Bind(
384 ASSERT_TRUE(alarms); 461 ExtensionAlarmsTestClearAllGetAllAlarms2Callback));
385 EXPECT_EQ(1u, alarms->size());
386 EXPECT_THAT((*alarms)[0].js_alarm->period_in_minutes,
387 testing::Pointee(0.001));
388 }
389 } 462 }
390 463
391 TEST_F(ExtensionAlarmsTest, ClearAll) { 464 TEST_F(ExtensionAlarmsTest, ClearAll) {
392 // ClearAll with no alarms set. 465 // ClearAll with no alarms set.
393 { 466 {
394 scoped_ptr<base::Value> result(RunFunctionWithExtension( 467 scoped_ptr<base::Value> result(RunFunctionWithExtension(
395 new AlarmsClearAllFunction(), "[]")); 468 new AlarmsClearAllFunction(), "[]"));
396 EXPECT_FALSE(result.get()); 469 EXPECT_FALSE(result.get());
397 } 470 }
398 471
399 // Create 3 alarms. 472 // Create 3 alarms.
400 { 473 CreateAlarms(3);
401 CreateAlarms(3); 474 alarm_manager_->GetAllAlarms(extension_->id(), base::Bind(
402 const AlarmManager::AlarmList* alarms = 475 ExtensionAlarmsTestClearAllGetAllAlarms1Callback, this));
403 alarm_manager_->GetAllAlarms(extension_->id());
404 ASSERT_TRUE(alarms);
405 EXPECT_EQ(3u, alarms->size());
406 }
407
408 // Clear them.
409 {
410 RunFunction(new AlarmsClearAllFunction(), "[]");
411 const AlarmManager::AlarmList* alarms =
412 alarm_manager_->GetAllAlarms(extension_->id());
413 ASSERT_FALSE(alarms);
414 }
415 } 476 }
416 477
417 class ExtensionAlarmsSchedulingTest : public ExtensionAlarmsTest { 478 class ExtensionAlarmsSchedulingTest : public ExtensionAlarmsTest {
479 void GetAlarmCallback(Alarm* alarm) {
480 CHECK(alarm);
481 const base::Time scheduled_time =
482 base::Time::FromJsTime(alarm->js_alarm->scheduled_time);
483 EXPECT_EQ(scheduled_time, alarm_manager_->test_next_poll_time_);
484 }
485
486 static void RemoveAlarmCallback (bool success) { EXPECT_TRUE(success); }
487 static void RemoveAllAlarmsCallback () {}
418 public: 488 public:
419 // Get the time that the alarm named is scheduled to run. 489 // Get the time that the alarm named is scheduled to run.
420 base::Time GetScheduledTime(const std::string& alarm_name) { 490 void VerifyScheduledTime(const std::string& alarm_name) {
421 const extensions::Alarm* alarm = 491 alarm_manager_->GetAlarm(extension_->id(), alarm_name, base::Bind(
422 alarm_manager_->GetAlarm(extension_->id(), alarm_name); 492 &ExtensionAlarmsSchedulingTest::GetAlarmCallback,
423 CHECK(alarm); 493 base::Unretained(this)));
424 return base::Time::FromJsTime(alarm->js_alarm->scheduled_time); 494 }
495
496 void RemoveAlarm(const std::string& name) {
497 alarm_manager_->RemoveAlarm(
498 extension_->id(),
499 name,
500 base::Bind(&ExtensionAlarmsSchedulingTest::RemoveAlarmCallback));
501 }
502
503 void RemoveAllAlarms () {
504 alarm_manager_->RemoveAllAlarms(extension_->id(), base::Bind(
505 &ExtensionAlarmsSchedulingTest::RemoveAllAlarmsCallback));
425 } 506 }
426 }; 507 };
427 508
428 TEST_F(ExtensionAlarmsSchedulingTest, PollScheduling) { 509 TEST_F(ExtensionAlarmsSchedulingTest, PollScheduling) {
429 { 510 {
430 CreateAlarm("[\"a\", {\"periodInMinutes\": 6}]"); 511 CreateAlarm("[\"a\", {\"periodInMinutes\": 6}]");
431 CreateAlarm("[\"bb\", {\"periodInMinutes\": 8}]"); 512 CreateAlarm("[\"bb\", {\"periodInMinutes\": 8}]");
432 EXPECT_EQ(GetScheduledTime("a"), alarm_manager_->next_poll_time_); 513 VerifyScheduledTime("a");
433 alarm_manager_->RemoveAllAlarms(extension_->id()); 514 RemoveAllAlarms();
434 } 515 }
435 { 516 {
436 CreateAlarm("[\"a\", {\"delayInMinutes\": 10}]"); 517 CreateAlarm("[\"a\", {\"delayInMinutes\": 10}]");
437 CreateAlarm("[\"bb\", {\"delayInMinutes\": 21}]"); 518 CreateAlarm("[\"bb\", {\"delayInMinutes\": 21}]");
438 EXPECT_EQ(GetScheduledTime("a"), alarm_manager_->next_poll_time_); 519 VerifyScheduledTime("a");
439 alarm_manager_->RemoveAllAlarms(extension_->id()); 520 RemoveAllAlarms();
440 } 521 }
441 { 522 {
442 test_clock_->SetNow(base::Time::FromDoubleT(10)); 523 test_clock_->SetNow(base::Time::FromDoubleT(10));
443 CreateAlarm("[\"a\", {\"periodInMinutes\": 10}]"); 524 CreateAlarm("[\"a\", {\"periodInMinutes\": 10}]");
444 Alarm alarm; 525 Alarm alarm;
445 alarm.js_alarm->name = "bb"; 526 alarm.js_alarm->name = "bb";
446 alarm.js_alarm->scheduled_time = 30 * 60000; 527 alarm.js_alarm->scheduled_time = 30 * 60000;
447 alarm.js_alarm->period_in_minutes.reset(new double(30)); 528 alarm.js_alarm->period_in_minutes.reset(new double(30));
448 alarm_manager_->AddAlarmImpl(extension_->id(), alarm); 529 alarm_manager_->AddAlarmImpl(extension_->id(), alarm);
449 EXPECT_DOUBLE_EQ(GetScheduledTime("a").ToDoubleT(), 530 VerifyScheduledTime("a");
450 alarm_manager_->next_poll_time_.ToDoubleT()); 531 RemoveAllAlarms();
451 alarm_manager_->RemoveAllAlarms(extension_->id());
452 } 532 }
453 { 533 {
454 test_clock_->SetNow(base::Time::FromDoubleT(3 * 60 + 1)); 534 test_clock_->SetNow(base::Time::FromDoubleT(3 * 60 + 1));
455 Alarm alarm; 535 Alarm alarm;
456 alarm.js_alarm->name = "bb"; 536 alarm.js_alarm->name = "bb";
457 alarm.js_alarm->scheduled_time = 3 * 60000; 537 alarm.js_alarm->scheduled_time = 3 * 60000;
458 alarm.js_alarm->period_in_minutes.reset(new double(3)); 538 alarm.js_alarm->period_in_minutes.reset(new double(3));
459 alarm_manager_->AddAlarmImpl(extension_->id(), alarm); 539 alarm_manager_->AddAlarmImpl(extension_->id(), alarm);
460 base::MessageLoop::current()->Run(); 540 base::MessageLoop::current()->Run();
461 EXPECT_EQ(alarm_manager_->last_poll_time_ + base::TimeDelta::FromMinutes(3), 541 EXPECT_EQ(alarm_manager_->last_poll_time_ + base::TimeDelta::FromMinutes(3),
462 alarm_manager_->next_poll_time_); 542 alarm_manager_->test_next_poll_time_);
463 alarm_manager_->RemoveAllAlarms(extension_->id()); 543 RemoveAllAlarms();
464 } 544 }
465 { 545 {
466 test_clock_->SetNow(base::Time::FromDoubleT(4 * 60 + 1)); 546 test_clock_->SetNow(base::Time::FromDoubleT(4 * 60 + 1));
467 CreateAlarm("[\"a\", {\"periodInMinutes\": 2}]"); 547 CreateAlarm("[\"a\", {\"periodInMinutes\": 2}]");
468 alarm_manager_->RemoveAlarm(extension_->id(), "a"); 548 RemoveAlarm("a");
469 Alarm alarm2; 549 Alarm alarm2;
470 alarm2.js_alarm->name = "bb"; 550 alarm2.js_alarm->name = "bb";
471 alarm2.js_alarm->scheduled_time = 4 * 60000; 551 alarm2.js_alarm->scheduled_time = 4 * 60000;
472 alarm2.js_alarm->period_in_minutes.reset(new double(4)); 552 alarm2.js_alarm->period_in_minutes.reset(new double(4));
473 alarm_manager_->AddAlarmImpl(extension_->id(), alarm2); 553 alarm_manager_->AddAlarmImpl(extension_->id(), alarm2);
474 Alarm alarm3; 554 Alarm alarm3;
475 alarm3.js_alarm->name = "ccc"; 555 alarm3.js_alarm->name = "ccc";
476 alarm3.js_alarm->scheduled_time = 25 * 60000; 556 alarm3.js_alarm->scheduled_time = 25 * 60000;
477 alarm3.js_alarm->period_in_minutes.reset(new double(25)); 557 alarm3.js_alarm->period_in_minutes.reset(new double(25));
478 alarm_manager_->AddAlarmImpl(extension_->id(), alarm3); 558 alarm_manager_->AddAlarmImpl(extension_->id(), alarm3);
479 base::MessageLoop::current()->Run(); 559 base::MessageLoop::current()->Run();
480 EXPECT_EQ(alarm_manager_->last_poll_time_ + base::TimeDelta::FromMinutes(4), 560 EXPECT_EQ(alarm_manager_->last_poll_time_ + base::TimeDelta::FromMinutes(4),
481 alarm_manager_->next_poll_time_); 561 alarm_manager_->test_next_poll_time_);
482 alarm_manager_->RemoveAllAlarms(extension_->id()); 562 RemoveAllAlarms();
483 } 563 }
484 } 564 }
485 565
486 TEST_F(ExtensionAlarmsSchedulingTest, ReleasedExtensionPollsInfrequently) { 566 TEST_F(ExtensionAlarmsSchedulingTest, ReleasedExtensionPollsInfrequently) {
487 extension_ = utils::CreateEmptyExtensionWithLocation( 567 extension_ = utils::CreateEmptyExtensionWithLocation(
488 extensions::Manifest::INTERNAL); 568 extensions::Manifest::INTERNAL);
489 test_clock_->SetNow(base::Time::FromJsTime(300000)); 569 test_clock_->SetNow(base::Time::FromJsTime(300000));
490 CreateAlarm("[\"a\", {\"when\": 300010}]"); 570 CreateAlarm("[\"a\", {\"when\": 300010}]");
491 CreateAlarm("[\"b\", {\"when\": 340000}]"); 571 CreateAlarm("[\"b\", {\"when\": 340000}]");
492 572
493 // On startup (when there's no "last poll"), we let alarms fire as 573 // On startup (when there's no "last poll"), we let alarms fire as
494 // soon as they're scheduled. 574 // soon as they're scheduled.
495 EXPECT_DOUBLE_EQ(300010, alarm_manager_->next_poll_time_.ToJsTime()); 575 EXPECT_DOUBLE_EQ(300010, alarm_manager_->test_next_poll_time_.ToJsTime());
496 576
497 alarm_manager_->last_poll_time_ = base::Time::FromJsTime(290000); 577 alarm_manager_->last_poll_time_ = base::Time::FromJsTime(290000);
498 // In released extensions, we set the granularity to at least 5 578 // In released extensions, we set the granularity to at least 5
499 // minutes, which makes AddAlarm schedule the next poll after the 579 // minutes, which makes AddAlarm schedule the next poll after the
500 // extension requested. 580 // extension requested.
501 alarm_manager_->ScheduleNextPoll(); 581 alarm_manager_->ScheduleNextPoll();
502 EXPECT_DOUBLE_EQ((alarm_manager_->last_poll_time_ + 582 EXPECT_DOUBLE_EQ((alarm_manager_->last_poll_time_ +
503 base::TimeDelta::FromMinutes(1)).ToJsTime(), 583 base::TimeDelta::FromMinutes(1)).ToJsTime(),
504 alarm_manager_->next_poll_time_.ToJsTime()); 584 alarm_manager_->test_next_poll_time_.ToJsTime());
505 } 585 }
506 586
507 TEST_F(ExtensionAlarmsSchedulingTest, TimerRunning) { 587 TEST_F(ExtensionAlarmsSchedulingTest, TimerRunning) {
508 EXPECT_FALSE(alarm_manager_->timer_.IsRunning()); 588 EXPECT_FALSE(alarm_manager_->timer_.IsRunning());
509 CreateAlarm("[\"a\", {\"delayInMinutes\": 0.001}]"); 589 CreateAlarm("[\"a\", {\"delayInMinutes\": 0.001}]");
510 EXPECT_TRUE(alarm_manager_->timer_.IsRunning()); 590 EXPECT_TRUE(alarm_manager_->timer_.IsRunning());
591 test_clock_->Advance(base::TimeDelta::FromMilliseconds(60));
511 base::MessageLoop::current()->Run(); 592 base::MessageLoop::current()->Run();
512 EXPECT_FALSE(alarm_manager_->timer_.IsRunning()); 593 EXPECT_FALSE(alarm_manager_->timer_.IsRunning());
513 CreateAlarm("[\"bb\", {\"delayInMinutes\": 10}]"); 594 CreateAlarm("[\"bb\", {\"delayInMinutes\": 10}]");
514 EXPECT_TRUE(alarm_manager_->timer_.IsRunning()); 595 EXPECT_TRUE(alarm_manager_->timer_.IsRunning());
515 alarm_manager_->RemoveAllAlarms(extension_->id()); 596 RemoveAllAlarms();
516 EXPECT_FALSE(alarm_manager_->timer_.IsRunning()); 597 EXPECT_FALSE(alarm_manager_->timer_.IsRunning());
517 } 598 }
518 599
519 } // namespace extensions 600 } // namespace extensions
OLDNEW
« no previous file with comments | « chrome/browser/extensions/api/alarms/alarms_api.cc ('k') | chrome/renderer/resources/extensions/last_error.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698