OLD | NEW |
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 19 matching lines...) Expand all Loading... |
30 | 30 |
31 namespace { | 31 namespace { |
32 | 32 |
33 // Test delegate which quits the message loop when an alarm fires. | 33 // Test delegate which quits the message loop when an alarm fires. |
34 class AlarmDelegate : public AlarmManager::Delegate { | 34 class AlarmDelegate : public AlarmManager::Delegate { |
35 public: | 35 public: |
36 virtual ~AlarmDelegate() {} | 36 virtual ~AlarmDelegate() {} |
37 virtual void OnAlarm(const std::string& extension_id, | 37 virtual void OnAlarm(const std::string& extension_id, |
38 const Alarm& alarm) OVERRIDE { | 38 const Alarm& alarm) OVERRIDE { |
39 alarms_seen.push_back(alarm.js_alarm->name); | 39 alarms_seen.push_back(alarm.js_alarm->name); |
40 MessageLoop::current()->Quit(); | 40 base::MessageLoop::current()->Quit(); |
41 } | 41 } |
42 | 42 |
43 std::vector<std::string> alarms_seen; | 43 std::vector<std::string> alarms_seen; |
44 }; | 44 }; |
45 | 45 |
46 } // namespace | 46 } // namespace |
47 | 47 |
48 class ExtensionAlarmsTest : public BrowserWithTestWindowTest { | 48 class ExtensionAlarmsTest : public BrowserWithTestWindowTest { |
49 public: | 49 public: |
50 virtual void SetUp() { | 50 virtual void SetUp() { |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
152 | 152 |
153 const Alarm* alarm = | 153 const Alarm* alarm = |
154 alarm_manager_->GetAlarm(extension_->id(), std::string()); | 154 alarm_manager_->GetAlarm(extension_->id(), std::string()); |
155 ASSERT_TRUE(alarm); | 155 ASSERT_TRUE(alarm); |
156 EXPECT_EQ("", alarm->js_alarm->name); | 156 EXPECT_EQ("", alarm->js_alarm->name); |
157 EXPECT_DOUBLE_EQ(10000, alarm->js_alarm->scheduled_time); | 157 EXPECT_DOUBLE_EQ(10000, alarm->js_alarm->scheduled_time); |
158 EXPECT_FALSE(alarm->js_alarm->period_in_minutes.get()); | 158 EXPECT_FALSE(alarm->js_alarm->period_in_minutes.get()); |
159 | 159 |
160 // Now wait for the alarm to fire. Our test delegate will quit the | 160 // Now wait for the alarm to fire. Our test delegate will quit the |
161 // MessageLoop when that happens. | 161 // MessageLoop when that happens. |
162 MessageLoop::current()->Run(); | 162 base::MessageLoop::current()->Run(); |
163 | 163 |
164 ASSERT_EQ(1u, alarm_delegate_->alarms_seen.size()); | 164 ASSERT_EQ(1u, alarm_delegate_->alarms_seen.size()); |
165 EXPECT_EQ("", alarm_delegate_->alarms_seen[0]); | 165 EXPECT_EQ("", alarm_delegate_->alarms_seen[0]); |
166 | 166 |
167 // Ensure the alarm is gone. | 167 // Ensure the alarm is gone. |
168 { | 168 { |
169 const AlarmManager::AlarmList* alarms = | 169 const AlarmManager::AlarmList* alarms = |
170 alarm_manager_->GetAllAlarms(extension_->id()); | 170 alarm_manager_->GetAllAlarms(extension_->id()); |
171 ASSERT_FALSE(alarms); | 171 ASSERT_FALSE(alarms); |
172 } | 172 } |
173 } | 173 } |
174 | 174 |
175 TEST_F(ExtensionAlarmsTest, CreateRepeating) { | 175 TEST_F(ExtensionAlarmsTest, CreateRepeating) { |
176 test_clock_.SetNow(base::Time::FromDoubleT(10)); | 176 test_clock_.SetNow(base::Time::FromDoubleT(10)); |
177 | 177 |
178 // Create 1 repeating alarm. | 178 // Create 1 repeating alarm. |
179 CreateAlarm("[null, {\"periodInMinutes\": 0.001}]"); | 179 CreateAlarm("[null, {\"periodInMinutes\": 0.001}]"); |
180 | 180 |
181 const Alarm* alarm = | 181 const Alarm* alarm = |
182 alarm_manager_->GetAlarm(extension_->id(), std::string()); | 182 alarm_manager_->GetAlarm(extension_->id(), std::string()); |
183 ASSERT_TRUE(alarm); | 183 ASSERT_TRUE(alarm); |
184 EXPECT_EQ("", alarm->js_alarm->name); | 184 EXPECT_EQ("", alarm->js_alarm->name); |
185 EXPECT_DOUBLE_EQ(10060, alarm->js_alarm->scheduled_time); | 185 EXPECT_DOUBLE_EQ(10060, alarm->js_alarm->scheduled_time); |
186 EXPECT_THAT(alarm->js_alarm->period_in_minutes, | 186 EXPECT_THAT(alarm->js_alarm->period_in_minutes, |
187 testing::Pointee(testing::DoubleEq(0.001))); | 187 testing::Pointee(testing::DoubleEq(0.001))); |
188 | 188 |
189 test_clock_.Advance(base::TimeDelta::FromSeconds(1)); | 189 test_clock_.Advance(base::TimeDelta::FromSeconds(1)); |
190 // Now wait for the alarm to fire. Our test delegate will quit the | 190 // Now wait for the alarm to fire. Our test delegate will quit the |
191 // MessageLoop when that happens. | 191 // MessageLoop when that happens. |
192 MessageLoop::current()->Run(); | 192 base::MessageLoop::current()->Run(); |
193 | 193 |
194 test_clock_.Advance(base::TimeDelta::FromSeconds(1)); | 194 test_clock_.Advance(base::TimeDelta::FromSeconds(1)); |
195 // Wait again, and ensure the alarm fires again. | 195 // Wait again, and ensure the alarm fires again. |
196 alarm_manager_->ScheduleNextPoll(); | 196 alarm_manager_->ScheduleNextPoll(); |
197 MessageLoop::current()->Run(); | 197 base::MessageLoop::current()->Run(); |
198 | 198 |
199 ASSERT_EQ(2u, alarm_delegate_->alarms_seen.size()); | 199 ASSERT_EQ(2u, alarm_delegate_->alarms_seen.size()); |
200 EXPECT_EQ("", alarm_delegate_->alarms_seen[0]); | 200 EXPECT_EQ("", alarm_delegate_->alarms_seen[0]); |
201 } | 201 } |
202 | 202 |
203 TEST_F(ExtensionAlarmsTest, CreateAbsolute) { | 203 TEST_F(ExtensionAlarmsTest, CreateAbsolute) { |
204 test_clock_.SetNow(base::Time::FromDoubleT(9.99)); | 204 test_clock_.SetNow(base::Time::FromDoubleT(9.99)); |
205 CreateAlarm("[null, {\"when\": 10001}]"); | 205 CreateAlarm("[null, {\"when\": 10001}]"); |
206 | 206 |
207 const Alarm* alarm = | 207 const Alarm* alarm = |
208 alarm_manager_->GetAlarm(extension_->id(), std::string()); | 208 alarm_manager_->GetAlarm(extension_->id(), std::string()); |
209 ASSERT_TRUE(alarm); | 209 ASSERT_TRUE(alarm); |
210 EXPECT_EQ("", alarm->js_alarm->name); | 210 EXPECT_EQ("", alarm->js_alarm->name); |
211 EXPECT_DOUBLE_EQ(10001, alarm->js_alarm->scheduled_time); | 211 EXPECT_DOUBLE_EQ(10001, alarm->js_alarm->scheduled_time); |
212 EXPECT_THAT(alarm->js_alarm->period_in_minutes, | 212 EXPECT_THAT(alarm->js_alarm->period_in_minutes, |
213 testing::IsNull()); | 213 testing::IsNull()); |
214 | 214 |
215 test_clock_.SetNow(base::Time::FromDoubleT(10.1)); | 215 test_clock_.SetNow(base::Time::FromDoubleT(10.1)); |
216 // Now wait for the alarm to fire. Our test delegate will quit the | 216 // Now wait for the alarm to fire. Our test delegate will quit the |
217 // MessageLoop when that happens. | 217 // MessageLoop when that happens. |
218 MessageLoop::current()->Run(); | 218 base::MessageLoop::current()->Run(); |
219 | 219 |
220 ASSERT_FALSE(alarm_manager_->GetAlarm(extension_->id(), std::string())); | 220 ASSERT_FALSE(alarm_manager_->GetAlarm(extension_->id(), std::string())); |
221 | 221 |
222 ASSERT_EQ(1u, alarm_delegate_->alarms_seen.size()); | 222 ASSERT_EQ(1u, alarm_delegate_->alarms_seen.size()); |
223 EXPECT_EQ("", alarm_delegate_->alarms_seen[0]); | 223 EXPECT_EQ("", alarm_delegate_->alarms_seen[0]); |
224 } | 224 } |
225 | 225 |
226 TEST_F(ExtensionAlarmsTest, CreateRepeatingWithQuickFirstCall) { | 226 TEST_F(ExtensionAlarmsTest, CreateRepeatingWithQuickFirstCall) { |
227 test_clock_.SetNow(base::Time::FromDoubleT(9.99)); | 227 test_clock_.SetNow(base::Time::FromDoubleT(9.99)); |
228 CreateAlarm("[null, {\"when\": 10001, \"periodInMinutes\": 0.001}]"); | 228 CreateAlarm("[null, {\"when\": 10001, \"periodInMinutes\": 0.001}]"); |
229 | 229 |
230 const Alarm* alarm = | 230 const Alarm* alarm = |
231 alarm_manager_->GetAlarm(extension_->id(), std::string()); | 231 alarm_manager_->GetAlarm(extension_->id(), std::string()); |
232 ASSERT_TRUE(alarm); | 232 ASSERT_TRUE(alarm); |
233 EXPECT_EQ("", alarm->js_alarm->name); | 233 EXPECT_EQ("", alarm->js_alarm->name); |
234 EXPECT_DOUBLE_EQ(10001, alarm->js_alarm->scheduled_time); | 234 EXPECT_DOUBLE_EQ(10001, alarm->js_alarm->scheduled_time); |
235 EXPECT_THAT(alarm->js_alarm->period_in_minutes, | 235 EXPECT_THAT(alarm->js_alarm->period_in_minutes, |
236 testing::Pointee(testing::DoubleEq(0.001))); | 236 testing::Pointee(testing::DoubleEq(0.001))); |
237 | 237 |
238 test_clock_.SetNow(base::Time::FromDoubleT(10.1)); | 238 test_clock_.SetNow(base::Time::FromDoubleT(10.1)); |
239 // Now wait for the alarm to fire. Our test delegate will quit the | 239 // Now wait for the alarm to fire. Our test delegate will quit the |
240 // MessageLoop when that happens. | 240 // MessageLoop when that happens. |
241 MessageLoop::current()->Run(); | 241 base::MessageLoop::current()->Run(); |
242 | 242 |
243 ASSERT_TRUE(alarm_manager_->GetAlarm(extension_->id(), std::string())); | 243 ASSERT_TRUE(alarm_manager_->GetAlarm(extension_->id(), std::string())); |
244 EXPECT_THAT(alarm_delegate_->alarms_seen, testing::ElementsAre("")); | 244 EXPECT_THAT(alarm_delegate_->alarms_seen, testing::ElementsAre("")); |
245 | 245 |
246 test_clock_.SetNow(base::Time::FromDoubleT(10.7)); | 246 test_clock_.SetNow(base::Time::FromDoubleT(10.7)); |
247 MessageLoop::current()->Run(); | 247 base::MessageLoop::current()->Run(); |
248 | 248 |
249 ASSERT_TRUE(alarm_manager_->GetAlarm(extension_->id(), std::string())); | 249 ASSERT_TRUE(alarm_manager_->GetAlarm(extension_->id(), std::string())); |
250 EXPECT_THAT(alarm_delegate_->alarms_seen, testing::ElementsAre("", "")); | 250 EXPECT_THAT(alarm_delegate_->alarms_seen, testing::ElementsAre("", "")); |
251 } | 251 } |
252 | 252 |
253 TEST_F(ExtensionAlarmsTest, CreateDupe) { | 253 TEST_F(ExtensionAlarmsTest, CreateDupe) { |
254 test_clock_.SetNow(base::Time::FromDoubleT(10)); | 254 test_clock_.SetNow(base::Time::FromDoubleT(10)); |
255 | 255 |
256 // Create 2 duplicate alarms. The first should be overridden. | 256 // Create 2 duplicate alarms. The first should be overridden. |
257 CreateAlarm("[\"dup\", {\"delayInMinutes\": 1}]"); | 257 CreateAlarm("[\"dup\", {\"delayInMinutes\": 1}]"); |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
367 alarm_manager_->GetAllAlarms(extension_->id()); | 367 alarm_manager_->GetAllAlarms(extension_->id()); |
368 ASSERT_TRUE(alarms); | 368 ASSERT_TRUE(alarms); |
369 EXPECT_EQ(1u, alarms->size()); | 369 EXPECT_EQ(1u, alarms->size()); |
370 EXPECT_THAT((*alarms)[0].js_alarm->period_in_minutes, | 370 EXPECT_THAT((*alarms)[0].js_alarm->period_in_minutes, |
371 testing::Pointee(0.001)); | 371 testing::Pointee(0.001)); |
372 } | 372 } |
373 | 373 |
374 // Now wait for the alarms to fire, and ensure the cancelled alarms don't | 374 // Now wait for the alarms to fire, and ensure the cancelled alarms don't |
375 // fire. | 375 // fire. |
376 alarm_manager_->ScheduleNextPoll(); | 376 alarm_manager_->ScheduleNextPoll(); |
377 MessageLoop::current()->Run(); | 377 base::MessageLoop::current()->Run(); |
378 | 378 |
379 ASSERT_EQ(1u, alarm_delegate_->alarms_seen.size()); | 379 ASSERT_EQ(1u, alarm_delegate_->alarms_seen.size()); |
380 EXPECT_EQ("", alarm_delegate_->alarms_seen[0]); | 380 EXPECT_EQ("", alarm_delegate_->alarms_seen[0]); |
381 | 381 |
382 // Ensure the 0.001-minute alarm is still there, since it's repeating. | 382 // Ensure the 0.001-minute alarm is still there, since it's repeating. |
383 { | 383 { |
384 const AlarmManager::AlarmList* alarms = | 384 const AlarmManager::AlarmList* alarms = |
385 alarm_manager_->GetAllAlarms(extension_->id()); | 385 alarm_manager_->GetAllAlarms(extension_->id()); |
386 ASSERT_TRUE(alarms); | 386 ASSERT_TRUE(alarms); |
387 EXPECT_EQ(1u, alarms->size()); | 387 EXPECT_EQ(1u, alarms->size()); |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
452 alarm_manager_->next_poll_time_.ToDoubleT()); | 452 alarm_manager_->next_poll_time_.ToDoubleT()); |
453 alarm_manager_->RemoveAllAlarms(extension_->id()); | 453 alarm_manager_->RemoveAllAlarms(extension_->id()); |
454 } | 454 } |
455 { | 455 { |
456 test_clock_.SetNow(base::Time::FromDoubleT(3 * 60 + 1)); | 456 test_clock_.SetNow(base::Time::FromDoubleT(3 * 60 + 1)); |
457 Alarm alarm; | 457 Alarm alarm; |
458 alarm.js_alarm->name = "bb"; | 458 alarm.js_alarm->name = "bb"; |
459 alarm.js_alarm->scheduled_time = 3 * 60000; | 459 alarm.js_alarm->scheduled_time = 3 * 60000; |
460 alarm.js_alarm->period_in_minutes.reset(new double(3)); | 460 alarm.js_alarm->period_in_minutes.reset(new double(3)); |
461 alarm_manager_->AddAlarmImpl(extension_->id(), alarm); | 461 alarm_manager_->AddAlarmImpl(extension_->id(), alarm); |
462 MessageLoop::current()->Run(); | 462 base::MessageLoop::current()->Run(); |
463 EXPECT_EQ(alarm_manager_->last_poll_time_ + base::TimeDelta::FromMinutes(3), | 463 EXPECT_EQ(alarm_manager_->last_poll_time_ + base::TimeDelta::FromMinutes(3), |
464 alarm_manager_->next_poll_time_); | 464 alarm_manager_->next_poll_time_); |
465 alarm_manager_->RemoveAllAlarms(extension_->id()); | 465 alarm_manager_->RemoveAllAlarms(extension_->id()); |
466 } | 466 } |
467 { | 467 { |
468 test_clock_.SetNow(base::Time::FromDoubleT(4 * 60 + 1)); | 468 test_clock_.SetNow(base::Time::FromDoubleT(4 * 60 + 1)); |
469 CreateAlarm("[\"a\", {\"periodInMinutes\": 2}]"); | 469 CreateAlarm("[\"a\", {\"periodInMinutes\": 2}]"); |
470 alarm_manager_->RemoveAlarm(extension_->id(), "a"); | 470 alarm_manager_->RemoveAlarm(extension_->id(), "a"); |
471 Alarm alarm2; | 471 Alarm alarm2; |
472 alarm2.js_alarm->name = "bb"; | 472 alarm2.js_alarm->name = "bb"; |
473 alarm2.js_alarm->scheduled_time = 4 * 60000; | 473 alarm2.js_alarm->scheduled_time = 4 * 60000; |
474 alarm2.js_alarm->period_in_minutes.reset(new double(4)); | 474 alarm2.js_alarm->period_in_minutes.reset(new double(4)); |
475 alarm_manager_->AddAlarmImpl(extension_->id(), alarm2); | 475 alarm_manager_->AddAlarmImpl(extension_->id(), alarm2); |
476 Alarm alarm3; | 476 Alarm alarm3; |
477 alarm3.js_alarm->name = "ccc"; | 477 alarm3.js_alarm->name = "ccc"; |
478 alarm3.js_alarm->scheduled_time = 25 * 60000; | 478 alarm3.js_alarm->scheduled_time = 25 * 60000; |
479 alarm3.js_alarm->period_in_minutes.reset(new double(25)); | 479 alarm3.js_alarm->period_in_minutes.reset(new double(25)); |
480 alarm_manager_->AddAlarmImpl(extension_->id(), alarm3); | 480 alarm_manager_->AddAlarmImpl(extension_->id(), alarm3); |
481 MessageLoop::current()->Run(); | 481 base::MessageLoop::current()->Run(); |
482 EXPECT_EQ(alarm_manager_->last_poll_time_ + base::TimeDelta::FromMinutes(4), | 482 EXPECT_EQ(alarm_manager_->last_poll_time_ + base::TimeDelta::FromMinutes(4), |
483 alarm_manager_->next_poll_time_); | 483 alarm_manager_->next_poll_time_); |
484 alarm_manager_->RemoveAllAlarms(extension_->id()); | 484 alarm_manager_->RemoveAllAlarms(extension_->id()); |
485 } | 485 } |
486 } | 486 } |
487 | 487 |
488 TEST_F(ExtensionAlarmsSchedulingTest, ReleasedExtensionPollsInfrequently) { | 488 TEST_F(ExtensionAlarmsSchedulingTest, ReleasedExtensionPollsInfrequently) { |
489 extension_ = utils::CreateEmptyExtensionWithLocation( | 489 extension_ = utils::CreateEmptyExtensionWithLocation( |
490 extensions::Manifest::INTERNAL); | 490 extensions::Manifest::INTERNAL); |
491 test_clock_.SetNow(base::Time::FromJsTime(300000)); | 491 test_clock_.SetNow(base::Time::FromJsTime(300000)); |
(...skipping 11 matching lines...) Expand all Loading... |
503 alarm_manager_->ScheduleNextPoll(); | 503 alarm_manager_->ScheduleNextPoll(); |
504 EXPECT_DOUBLE_EQ((alarm_manager_->last_poll_time_ + | 504 EXPECT_DOUBLE_EQ((alarm_manager_->last_poll_time_ + |
505 base::TimeDelta::FromMinutes(1)).ToJsTime(), | 505 base::TimeDelta::FromMinutes(1)).ToJsTime(), |
506 alarm_manager_->next_poll_time_.ToJsTime()); | 506 alarm_manager_->next_poll_time_.ToJsTime()); |
507 } | 507 } |
508 | 508 |
509 TEST_F(ExtensionAlarmsSchedulingTest, TimerRunning) { | 509 TEST_F(ExtensionAlarmsSchedulingTest, TimerRunning) { |
510 EXPECT_FALSE(alarm_manager_->timer_.IsRunning()); | 510 EXPECT_FALSE(alarm_manager_->timer_.IsRunning()); |
511 CreateAlarm("[\"a\", {\"delayInMinutes\": 0.001}]"); | 511 CreateAlarm("[\"a\", {\"delayInMinutes\": 0.001}]"); |
512 EXPECT_TRUE(alarm_manager_->timer_.IsRunning()); | 512 EXPECT_TRUE(alarm_manager_->timer_.IsRunning()); |
513 MessageLoop::current()->Run(); | 513 base::MessageLoop::current()->Run(); |
514 EXPECT_FALSE(alarm_manager_->timer_.IsRunning()); | 514 EXPECT_FALSE(alarm_manager_->timer_.IsRunning()); |
515 CreateAlarm("[\"bb\", {\"delayInMinutes\": 10}]"); | 515 CreateAlarm("[\"bb\", {\"delayInMinutes\": 10}]"); |
516 EXPECT_TRUE(alarm_manager_->timer_.IsRunning()); | 516 EXPECT_TRUE(alarm_manager_->timer_.IsRunning()); |
517 alarm_manager_->RemoveAllAlarms(extension_->id()); | 517 alarm_manager_->RemoveAllAlarms(extension_->id()); |
518 EXPECT_FALSE(alarm_manager_->timer_.IsRunning()); | 518 EXPECT_FALSE(alarm_manager_->timer_.IsRunning()); |
519 } | 519 } |
520 | 520 |
521 } // namespace extensions | 521 } // namespace extensions |
OLD | NEW |