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