| 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 |