| 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" |
| 11 #include "chrome/browser/extensions/extension_function_test_utils.h" | 11 #include "chrome/browser/extensions/extension_function_test_utils.h" |
| 12 #include "chrome/browser/extensions/test_extension_system.h" | |
| 13 #include "chrome/browser/profiles/profile_manager.h" | 12 #include "chrome/browser/profiles/profile_manager.h" |
| 14 #include "chrome/browser/ui/browser.h" | 13 #include "chrome/browser/ui/browser.h" |
| 15 #include "chrome/browser/ui/tabs/tab_strip_model.h" | 14 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
| 16 #include "chrome/common/extensions/background_info.h" | 15 #include "chrome/common/extensions/background_info.h" |
| 17 #include "chrome/common/extensions/extension_messages.h" | 16 #include "chrome/common/extensions/extension_messages.h" |
| 18 #include "chrome/test/base/browser_with_test_window_test.h" | 17 #include "chrome/test/base/browser_with_test_window_test.h" |
| 19 #include "content/public/browser/web_contents.h" | 18 #include "content/public/browser/web_contents.h" |
| 20 #include "content/public/test/mock_render_process_host.h" | 19 #include "content/public/test/mock_render_process_host.h" |
| 21 #include "ipc/ipc_test_sink.h" | 20 #include "ipc/ipc_test_sink.h" |
| 22 #include "testing/gmock/include/gmock/gmock.h" | 21 #include "testing/gmock/include/gmock/gmock.h" |
| (...skipping 20 matching lines...) Expand all Loading... |
| 43 std::vector<std::string> alarms_seen; | 42 std::vector<std::string> alarms_seen; |
| 44 }; | 43 }; |
| 45 | 44 |
| 46 } // namespace | 45 } // namespace |
| 47 | 46 |
| 48 class ExtensionAlarmsTest : public BrowserWithTestWindowTest { | 47 class ExtensionAlarmsTest : public BrowserWithTestWindowTest { |
| 49 public: | 48 public: |
| 50 virtual void SetUp() { | 49 virtual void SetUp() { |
| 51 BrowserWithTestWindowTest::SetUp(); | 50 BrowserWithTestWindowTest::SetUp(); |
| 52 | 51 |
| 53 TestExtensionSystem* system = static_cast<TestExtensionSystem*>( | 52 test_clock_ = new base::SimpleTestClock(); |
| 54 ExtensionSystem::Get(browser()->profile())); | 53 alarm_manager_ = AlarmManager::Get(browser()->profile()); |
| 55 system->CreateAlarmManager(&test_clock_); | 54 alarm_manager_->SetClockForTesting(test_clock_); |
| 56 alarm_manager_ = system->alarm_manager(); | |
| 57 | 55 |
| 58 alarm_delegate_ = new AlarmDelegate(); | 56 alarm_delegate_ = new AlarmDelegate(); |
| 59 alarm_manager_->set_delegate(alarm_delegate_); | 57 alarm_manager_->set_delegate(alarm_delegate_); |
| 60 | 58 |
| 61 extension_ = utils::CreateEmptyExtensionWithLocation( | 59 extension_ = utils::CreateEmptyExtensionWithLocation( |
| 62 extensions::Manifest::UNPACKED); | 60 extensions::Manifest::UNPACKED); |
| 63 | 61 |
| 64 // Make sure there's a RenderViewHost for alarms to warn into. | 62 // Make sure there's a RenderViewHost for alarms to warn into. |
| 65 AddTab(browser(), BackgroundInfo::GetBackgroundURL(extension_)); | 63 AddTab(browser(), BackgroundInfo::GetBackgroundURL(extension_)); |
| 66 contents_ = browser()->tab_strip_model()->GetActiveWebContents(); | 64 contents_ = browser()->tab_strip_model()->GetActiveWebContents(); |
| 67 | 65 |
| 68 test_clock_.SetNow(base::Time::FromDoubleT(10)); | 66 test_clock_->SetNow(base::Time::FromDoubleT(10)); |
| 69 } | 67 } |
| 70 | 68 |
| 71 base::Value* RunFunctionWithExtension( | 69 base::Value* RunFunctionWithExtension( |
| 72 UIThreadExtensionFunction* function, const std::string& args) { | 70 UIThreadExtensionFunction* function, const std::string& args) { |
| 73 scoped_refptr<UIThreadExtensionFunction> delete_function(function); | 71 scoped_refptr<UIThreadExtensionFunction> delete_function(function); |
| 74 function->set_extension(extension_.get()); | 72 function->set_extension(extension_.get()); |
| 75 function->SetRenderViewHost(contents_->GetRenderViewHost()); | 73 function->SetRenderViewHost(contents_->GetRenderViewHost()); |
| 76 return utils::RunFunctionAndReturnSingleResult(function, args, browser()); | 74 return utils::RunFunctionAndReturnSingleResult(function, args, browser()); |
| 77 } | 75 } |
| 78 | 76 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 94 } | 92 } |
| 95 | 93 |
| 96 std::string RunFunctionAndReturnError(UIThreadExtensionFunction* function, | 94 std::string RunFunctionAndReturnError(UIThreadExtensionFunction* function, |
| 97 const std::string& args) { | 95 const std::string& args) { |
| 98 function->set_extension(extension_.get()); | 96 function->set_extension(extension_.get()); |
| 99 function->SetRenderViewHost(contents_->GetRenderViewHost()); | 97 function->SetRenderViewHost(contents_->GetRenderViewHost()); |
| 100 return utils::RunFunctionAndReturnError(function, args, browser()); | 98 return utils::RunFunctionAndReturnError(function, args, browser()); |
| 101 } | 99 } |
| 102 | 100 |
| 103 void CreateAlarm(const std::string& args) { | 101 void CreateAlarm(const std::string& args) { |
| 104 RunFunction(new AlarmsCreateFunction(&test_clock_), args); | 102 RunFunction(new AlarmsCreateFunction(test_clock_), args); |
| 105 } | 103 } |
| 106 | 104 |
| 107 // Takes a JSON result from a function and converts it to a vector of | 105 // Takes a JSON result from a function and converts it to a vector of |
| 108 // JsAlarms. | 106 // JsAlarms. |
| 109 std::vector<linked_ptr<JsAlarm> > ToAlarmList(base::ListValue* value) { | 107 std::vector<linked_ptr<JsAlarm> > ToAlarmList(base::ListValue* value) { |
| 110 std::vector<linked_ptr<JsAlarm> > list; | 108 std::vector<linked_ptr<JsAlarm> > list; |
| 111 for (size_t i = 0; i < value->GetSize(); ++i) { | 109 for (size_t i = 0; i < value->GetSize(); ++i) { |
| 112 linked_ptr<JsAlarm> alarm(new JsAlarm); | 110 linked_ptr<JsAlarm> alarm(new JsAlarm); |
| 113 base::DictionaryValue* alarm_value; | 111 base::DictionaryValue* alarm_value; |
| 114 if (!value->GetDictionary(i, &alarm_value)) { | 112 if (!value->GetDictionary(i, &alarm_value)) { |
| (...skipping 10 matching lines...) Expand all Loading... |
| 125 void CreateAlarms(size_t num_alarms) { | 123 void CreateAlarms(size_t num_alarms) { |
| 126 CHECK(num_alarms <= 3); | 124 CHECK(num_alarms <= 3); |
| 127 | 125 |
| 128 const char* kCreateArgs[] = { | 126 const char* kCreateArgs[] = { |
| 129 "[null, {\"periodInMinutes\": 0.001}]", | 127 "[null, {\"periodInMinutes\": 0.001}]", |
| 130 "[\"7\", {\"periodInMinutes\": 7}]", | 128 "[\"7\", {\"periodInMinutes\": 7}]", |
| 131 "[\"0\", {\"delayInMinutes\": 0}]", | 129 "[\"0\", {\"delayInMinutes\": 0}]", |
| 132 }; | 130 }; |
| 133 for (size_t i = 0; i < num_alarms; ++i) { | 131 for (size_t i = 0; i < num_alarms; ++i) { |
| 134 scoped_ptr<base::DictionaryValue> result(RunFunctionAndReturnDict( | 132 scoped_ptr<base::DictionaryValue> result(RunFunctionAndReturnDict( |
| 135 new AlarmsCreateFunction(&test_clock_), kCreateArgs[i])); | 133 new AlarmsCreateFunction(test_clock_), kCreateArgs[i])); |
| 136 EXPECT_FALSE(result.get()); | 134 EXPECT_FALSE(result.get()); |
| 137 } | 135 } |
| 138 } | 136 } |
| 139 | 137 |
| 140 protected: | 138 protected: |
| 141 base::SimpleTestClock test_clock_; | 139 base::SimpleTestClock* test_clock_; |
| 142 AlarmManager* alarm_manager_; | 140 AlarmManager* alarm_manager_; |
| 143 AlarmDelegate* alarm_delegate_; | 141 AlarmDelegate* alarm_delegate_; |
| 144 scoped_refptr<extensions::Extension> extension_; | 142 scoped_refptr<extensions::Extension> extension_; |
| 145 content::WebContents* contents_; | 143 content::WebContents* contents_; |
| 146 }; | 144 }; |
| 147 | 145 |
| 148 TEST_F(ExtensionAlarmsTest, Create) { | 146 TEST_F(ExtensionAlarmsTest, Create) { |
| 149 test_clock_.SetNow(base::Time::FromDoubleT(10)); | 147 test_clock_->SetNow(base::Time::FromDoubleT(10)); |
| 150 // Create 1 non-repeating alarm. | 148 // Create 1 non-repeating alarm. |
| 151 CreateAlarm("[null, {\"delayInMinutes\": 0}]"); | 149 CreateAlarm("[null, {\"delayInMinutes\": 0}]"); |
| 152 | 150 |
| 153 const Alarm* alarm = | 151 const Alarm* alarm = |
| 154 alarm_manager_->GetAlarm(extension_->id(), std::string()); | 152 alarm_manager_->GetAlarm(extension_->id(), std::string()); |
| 155 ASSERT_TRUE(alarm); | 153 ASSERT_TRUE(alarm); |
| 156 EXPECT_EQ("", alarm->js_alarm->name); | 154 EXPECT_EQ("", alarm->js_alarm->name); |
| 157 EXPECT_DOUBLE_EQ(10000, alarm->js_alarm->scheduled_time); | 155 EXPECT_DOUBLE_EQ(10000, alarm->js_alarm->scheduled_time); |
| 158 EXPECT_FALSE(alarm->js_alarm->period_in_minutes.get()); | 156 EXPECT_FALSE(alarm->js_alarm->period_in_minutes.get()); |
| 159 | 157 |
| 160 // 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 |
| 161 // MessageLoop when that happens. | 159 // MessageLoop when that happens. |
| 162 MessageLoop::current()->Run(); | 160 MessageLoop::current()->Run(); |
| 163 | 161 |
| 164 ASSERT_EQ(1u, alarm_delegate_->alarms_seen.size()); | 162 ASSERT_EQ(1u, alarm_delegate_->alarms_seen.size()); |
| 165 EXPECT_EQ("", alarm_delegate_->alarms_seen[0]); | 163 EXPECT_EQ("", alarm_delegate_->alarms_seen[0]); |
| 166 | 164 |
| 167 // Ensure the alarm is gone. | 165 // Ensure the alarm is gone. |
| 168 { | 166 { |
| 169 const AlarmManager::AlarmList* alarms = | 167 const AlarmManager::AlarmList* alarms = |
| 170 alarm_manager_->GetAllAlarms(extension_->id()); | 168 alarm_manager_->GetAllAlarms(extension_->id()); |
| 171 ASSERT_FALSE(alarms); | 169 ASSERT_FALSE(alarms); |
| 172 } | 170 } |
| 173 } | 171 } |
| 174 | 172 |
| 175 TEST_F(ExtensionAlarmsTest, CreateRepeating) { | 173 TEST_F(ExtensionAlarmsTest, CreateRepeating) { |
| 176 test_clock_.SetNow(base::Time::FromDoubleT(10)); | 174 test_clock_->SetNow(base::Time::FromDoubleT(10)); |
| 177 | 175 |
| 178 // Create 1 repeating alarm. | 176 // Create 1 repeating alarm. |
| 179 CreateAlarm("[null, {\"periodInMinutes\": 0.001}]"); | 177 CreateAlarm("[null, {\"periodInMinutes\": 0.001}]"); |
| 180 | 178 |
| 181 const Alarm* alarm = | 179 const Alarm* alarm = |
| 182 alarm_manager_->GetAlarm(extension_->id(), std::string()); | 180 alarm_manager_->GetAlarm(extension_->id(), std::string()); |
| 183 ASSERT_TRUE(alarm); | 181 ASSERT_TRUE(alarm); |
| 184 EXPECT_EQ("", alarm->js_alarm->name); | 182 EXPECT_EQ("", alarm->js_alarm->name); |
| 185 EXPECT_DOUBLE_EQ(10060, alarm->js_alarm->scheduled_time); | 183 EXPECT_DOUBLE_EQ(10060, alarm->js_alarm->scheduled_time); |
| 186 EXPECT_THAT(alarm->js_alarm->period_in_minutes, | 184 EXPECT_THAT(alarm->js_alarm->period_in_minutes, |
| 187 testing::Pointee(testing::DoubleEq(0.001))); | 185 testing::Pointee(testing::DoubleEq(0.001))); |
| 188 | 186 |
| 189 test_clock_.Advance(base::TimeDelta::FromSeconds(1)); | 187 test_clock_->Advance(base::TimeDelta::FromSeconds(1)); |
| 190 // 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 |
| 191 // MessageLoop when that happens. | 189 // MessageLoop when that happens. |
| 192 MessageLoop::current()->Run(); | 190 MessageLoop::current()->Run(); |
| 193 | 191 |
| 194 test_clock_.Advance(base::TimeDelta::FromSeconds(1)); | 192 test_clock_->Advance(base::TimeDelta::FromSeconds(1)); |
| 195 // Wait again, and ensure the alarm fires again. | 193 // Wait again, and ensure the alarm fires again. |
| 196 alarm_manager_->ScheduleNextPoll(); | 194 alarm_manager_->ScheduleNextPoll(); |
| 197 MessageLoop::current()->Run(); | 195 MessageLoop::current()->Run(); |
| 198 | 196 |
| 199 ASSERT_EQ(2u, alarm_delegate_->alarms_seen.size()); | 197 ASSERT_EQ(2u, alarm_delegate_->alarms_seen.size()); |
| 200 EXPECT_EQ("", alarm_delegate_->alarms_seen[0]); | 198 EXPECT_EQ("", alarm_delegate_->alarms_seen[0]); |
| 201 } | 199 } |
| 202 | 200 |
| 203 TEST_F(ExtensionAlarmsTest, CreateAbsolute) { | 201 TEST_F(ExtensionAlarmsTest, CreateAbsolute) { |
| 204 test_clock_.SetNow(base::Time::FromDoubleT(9.99)); | 202 test_clock_->SetNow(base::Time::FromDoubleT(9.99)); |
| 205 CreateAlarm("[null, {\"when\": 10001}]"); | 203 CreateAlarm("[null, {\"when\": 10001}]"); |
| 206 | 204 |
| 207 const Alarm* alarm = | 205 const Alarm* alarm = |
| 208 alarm_manager_->GetAlarm(extension_->id(), std::string()); | 206 alarm_manager_->GetAlarm(extension_->id(), std::string()); |
| 209 ASSERT_TRUE(alarm); | 207 ASSERT_TRUE(alarm); |
| 210 EXPECT_EQ("", alarm->js_alarm->name); | 208 EXPECT_EQ("", alarm->js_alarm->name); |
| 211 EXPECT_DOUBLE_EQ(10001, alarm->js_alarm->scheduled_time); | 209 EXPECT_DOUBLE_EQ(10001, alarm->js_alarm->scheduled_time); |
| 212 EXPECT_THAT(alarm->js_alarm->period_in_minutes, | 210 EXPECT_THAT(alarm->js_alarm->period_in_minutes, |
| 213 testing::IsNull()); | 211 testing::IsNull()); |
| 214 | 212 |
| 215 test_clock_.SetNow(base::Time::FromDoubleT(10.1)); | 213 test_clock_->SetNow(base::Time::FromDoubleT(10.1)); |
| 216 // 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 |
| 217 // MessageLoop when that happens. | 215 // MessageLoop when that happens. |
| 218 MessageLoop::current()->Run(); | 216 MessageLoop::current()->Run(); |
| 219 | 217 |
| 220 ASSERT_FALSE(alarm_manager_->GetAlarm(extension_->id(), std::string())); | 218 ASSERT_FALSE(alarm_manager_->GetAlarm(extension_->id(), std::string())); |
| 221 | 219 |
| 222 ASSERT_EQ(1u, alarm_delegate_->alarms_seen.size()); | 220 ASSERT_EQ(1u, alarm_delegate_->alarms_seen.size()); |
| 223 EXPECT_EQ("", alarm_delegate_->alarms_seen[0]); | 221 EXPECT_EQ("", alarm_delegate_->alarms_seen[0]); |
| 224 } | 222 } |
| 225 | 223 |
| 226 TEST_F(ExtensionAlarmsTest, CreateRepeatingWithQuickFirstCall) { | 224 TEST_F(ExtensionAlarmsTest, CreateRepeatingWithQuickFirstCall) { |
| 227 test_clock_.SetNow(base::Time::FromDoubleT(9.99)); | 225 test_clock_->SetNow(base::Time::FromDoubleT(9.99)); |
| 228 CreateAlarm("[null, {\"when\": 10001, \"periodInMinutes\": 0.001}]"); | 226 CreateAlarm("[null, {\"when\": 10001, \"periodInMinutes\": 0.001}]"); |
| 229 | 227 |
| 230 const Alarm* alarm = | 228 const Alarm* alarm = |
| 231 alarm_manager_->GetAlarm(extension_->id(), std::string()); | 229 alarm_manager_->GetAlarm(extension_->id(), std::string()); |
| 232 ASSERT_TRUE(alarm); | 230 ASSERT_TRUE(alarm); |
| 233 EXPECT_EQ("", alarm->js_alarm->name); | 231 EXPECT_EQ("", alarm->js_alarm->name); |
| 234 EXPECT_DOUBLE_EQ(10001, alarm->js_alarm->scheduled_time); | 232 EXPECT_DOUBLE_EQ(10001, alarm->js_alarm->scheduled_time); |
| 235 EXPECT_THAT(alarm->js_alarm->period_in_minutes, | 233 EXPECT_THAT(alarm->js_alarm->period_in_minutes, |
| 236 testing::Pointee(testing::DoubleEq(0.001))); | 234 testing::Pointee(testing::DoubleEq(0.001))); |
| 237 | 235 |
| 238 test_clock_.SetNow(base::Time::FromDoubleT(10.1)); | 236 test_clock_->SetNow(base::Time::FromDoubleT(10.1)); |
| 239 // 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 |
| 240 // MessageLoop when that happens. | 238 // MessageLoop when that happens. |
| 241 MessageLoop::current()->Run(); | 239 MessageLoop::current()->Run(); |
| 242 | 240 |
| 243 ASSERT_TRUE(alarm_manager_->GetAlarm(extension_->id(), std::string())); | 241 ASSERT_TRUE(alarm_manager_->GetAlarm(extension_->id(), std::string())); |
| 244 EXPECT_THAT(alarm_delegate_->alarms_seen, testing::ElementsAre("")); | 242 EXPECT_THAT(alarm_delegate_->alarms_seen, testing::ElementsAre("")); |
| 245 | 243 |
| 246 test_clock_.SetNow(base::Time::FromDoubleT(10.7)); | 244 test_clock_->SetNow(base::Time::FromDoubleT(10.7)); |
| 247 MessageLoop::current()->Run(); | 245 MessageLoop::current()->Run(); |
| 248 | 246 |
| 249 ASSERT_TRUE(alarm_manager_->GetAlarm(extension_->id(), std::string())); | 247 ASSERT_TRUE(alarm_manager_->GetAlarm(extension_->id(), std::string())); |
| 250 EXPECT_THAT(alarm_delegate_->alarms_seen, testing::ElementsAre("", "")); | 248 EXPECT_THAT(alarm_delegate_->alarms_seen, testing::ElementsAre("", "")); |
| 251 } | 249 } |
| 252 | 250 |
| 253 TEST_F(ExtensionAlarmsTest, CreateDupe) { | 251 TEST_F(ExtensionAlarmsTest, CreateDupe) { |
| 254 test_clock_.SetNow(base::Time::FromDoubleT(10)); | 252 test_clock_->SetNow(base::Time::FromDoubleT(10)); |
| 255 | 253 |
| 256 // Create 2 duplicate alarms. The first should be overridden. | 254 // Create 2 duplicate alarms. The first should be overridden. |
| 257 CreateAlarm("[\"dup\", {\"delayInMinutes\": 1}]"); | 255 CreateAlarm("[\"dup\", {\"delayInMinutes\": 1}]"); |
| 258 CreateAlarm("[\"dup\", {\"delayInMinutes\": 7}]"); | 256 CreateAlarm("[\"dup\", {\"delayInMinutes\": 7}]"); |
| 259 | 257 |
| 260 { | 258 { |
| 261 const AlarmManager::AlarmList* alarms = | 259 const AlarmManager::AlarmList* alarms = |
| 262 alarm_manager_->GetAllAlarms(extension_->id()); | 260 alarm_manager_->GetAllAlarms(extension_->id()); |
| 263 ASSERT_TRUE(alarms); | 261 ASSERT_TRUE(alarms); |
| 264 EXPECT_EQ(1u, alarms->size()); | 262 EXPECT_EQ(1u, alarms->size()); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 275 ExtensionMsg_AddMessageToConsole::ID); | 273 ExtensionMsg_AddMessageToConsole::ID); |
| 276 ASSERT_TRUE(warning); | 274 ASSERT_TRUE(warning); |
| 277 content::ConsoleMessageLevel level = content::CONSOLE_MESSAGE_LEVEL_DEBUG; | 275 content::ConsoleMessageLevel level = content::CONSOLE_MESSAGE_LEVEL_DEBUG; |
| 278 std::string message; | 276 std::string message; |
| 279 ExtensionMsg_AddMessageToConsole::Read(warning, &level, &message); | 277 ExtensionMsg_AddMessageToConsole::Read(warning, &level, &message); |
| 280 EXPECT_EQ(content::CONSOLE_MESSAGE_LEVEL_WARNING, level); | 278 EXPECT_EQ(content::CONSOLE_MESSAGE_LEVEL_WARNING, level); |
| 281 EXPECT_THAT(message, testing::HasSubstr("delay is less than minimum of 1")); | 279 EXPECT_THAT(message, testing::HasSubstr("delay is less than minimum of 1")); |
| 282 } | 280 } |
| 283 | 281 |
| 284 TEST_F(ExtensionAlarmsTest, Get) { | 282 TEST_F(ExtensionAlarmsTest, Get) { |
| 285 test_clock_.SetNow(base::Time::FromDoubleT(4)); | 283 test_clock_->SetNow(base::Time::FromDoubleT(4)); |
| 286 | 284 |
| 287 // Create 2 alarms, and make sure we can query them. | 285 // Create 2 alarms, and make sure we can query them. |
| 288 CreateAlarms(2); | 286 CreateAlarms(2); |
| 289 | 287 |
| 290 // Get the default one. | 288 // Get the default one. |
| 291 { | 289 { |
| 292 JsAlarm alarm; | 290 JsAlarm alarm; |
| 293 scoped_ptr<base::DictionaryValue> result(RunFunctionAndReturnDict( | 291 scoped_ptr<base::DictionaryValue> result(RunFunctionAndReturnDict( |
| 294 new AlarmsGetFunction(), "[null]")); | 292 new AlarmsGetFunction(), "[null]")); |
| 295 ASSERT_TRUE(result.get()); | 293 ASSERT_TRUE(result.get()); |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 434 EXPECT_EQ(GetScheduledTime("a"), alarm_manager_->next_poll_time_); | 432 EXPECT_EQ(GetScheduledTime("a"), alarm_manager_->next_poll_time_); |
| 435 alarm_manager_->RemoveAllAlarms(extension_->id()); | 433 alarm_manager_->RemoveAllAlarms(extension_->id()); |
| 436 } | 434 } |
| 437 { | 435 { |
| 438 CreateAlarm("[\"a\", {\"delayInMinutes\": 10}]"); | 436 CreateAlarm("[\"a\", {\"delayInMinutes\": 10}]"); |
| 439 CreateAlarm("[\"bb\", {\"delayInMinutes\": 21}]"); | 437 CreateAlarm("[\"bb\", {\"delayInMinutes\": 21}]"); |
| 440 EXPECT_EQ(GetScheduledTime("a"), alarm_manager_->next_poll_time_); | 438 EXPECT_EQ(GetScheduledTime("a"), alarm_manager_->next_poll_time_); |
| 441 alarm_manager_->RemoveAllAlarms(extension_->id()); | 439 alarm_manager_->RemoveAllAlarms(extension_->id()); |
| 442 } | 440 } |
| 443 { | 441 { |
| 444 test_clock_.SetNow(base::Time::FromDoubleT(10)); | 442 test_clock_->SetNow(base::Time::FromDoubleT(10)); |
| 445 CreateAlarm("[\"a\", {\"periodInMinutes\": 10}]"); | 443 CreateAlarm("[\"a\", {\"periodInMinutes\": 10}]"); |
| 446 Alarm alarm; | 444 Alarm alarm; |
| 447 alarm.js_alarm->name = "bb"; | 445 alarm.js_alarm->name = "bb"; |
| 448 alarm.js_alarm->scheduled_time = 30 * 60000; | 446 alarm.js_alarm->scheduled_time = 30 * 60000; |
| 449 alarm.js_alarm->period_in_minutes.reset(new double(30)); | 447 alarm.js_alarm->period_in_minutes.reset(new double(30)); |
| 450 alarm_manager_->AddAlarmImpl(extension_->id(), alarm); | 448 alarm_manager_->AddAlarmImpl(extension_->id(), alarm); |
| 451 EXPECT_DOUBLE_EQ(GetScheduledTime("a").ToDoubleT(), | 449 EXPECT_DOUBLE_EQ(GetScheduledTime("a").ToDoubleT(), |
| 452 alarm_manager_->next_poll_time_.ToDoubleT()); | 450 alarm_manager_->next_poll_time_.ToDoubleT()); |
| 453 alarm_manager_->RemoveAllAlarms(extension_->id()); | 451 alarm_manager_->RemoveAllAlarms(extension_->id()); |
| 454 } | 452 } |
| 455 { | 453 { |
| 456 test_clock_.SetNow(base::Time::FromDoubleT(3 * 60 + 1)); | 454 test_clock_->SetNow(base::Time::FromDoubleT(3 * 60 + 1)); |
| 457 Alarm alarm; | 455 Alarm alarm; |
| 458 alarm.js_alarm->name = "bb"; | 456 alarm.js_alarm->name = "bb"; |
| 459 alarm.js_alarm->scheduled_time = 3 * 60000; | 457 alarm.js_alarm->scheduled_time = 3 * 60000; |
| 460 alarm.js_alarm->period_in_minutes.reset(new double(3)); | 458 alarm.js_alarm->period_in_minutes.reset(new double(3)); |
| 461 alarm_manager_->AddAlarmImpl(extension_->id(), alarm); | 459 alarm_manager_->AddAlarmImpl(extension_->id(), alarm); |
| 462 MessageLoop::current()->Run(); | 460 MessageLoop::current()->Run(); |
| 463 EXPECT_EQ(alarm_manager_->last_poll_time_ + base::TimeDelta::FromMinutes(3), | 461 EXPECT_EQ(alarm_manager_->last_poll_time_ + base::TimeDelta::FromMinutes(3), |
| 464 alarm_manager_->next_poll_time_); | 462 alarm_manager_->next_poll_time_); |
| 465 alarm_manager_->RemoveAllAlarms(extension_->id()); | 463 alarm_manager_->RemoveAllAlarms(extension_->id()); |
| 466 } | 464 } |
| 467 { | 465 { |
| 468 test_clock_.SetNow(base::Time::FromDoubleT(4 * 60 + 1)); | 466 test_clock_->SetNow(base::Time::FromDoubleT(4 * 60 + 1)); |
| 469 CreateAlarm("[\"a\", {\"periodInMinutes\": 2}]"); | 467 CreateAlarm("[\"a\", {\"periodInMinutes\": 2}]"); |
| 470 alarm_manager_->RemoveAlarm(extension_->id(), "a"); | 468 alarm_manager_->RemoveAlarm(extension_->id(), "a"); |
| 471 Alarm alarm2; | 469 Alarm alarm2; |
| 472 alarm2.js_alarm->name = "bb"; | 470 alarm2.js_alarm->name = "bb"; |
| 473 alarm2.js_alarm->scheduled_time = 4 * 60000; | 471 alarm2.js_alarm->scheduled_time = 4 * 60000; |
| 474 alarm2.js_alarm->period_in_minutes.reset(new double(4)); | 472 alarm2.js_alarm->period_in_minutes.reset(new double(4)); |
| 475 alarm_manager_->AddAlarmImpl(extension_->id(), alarm2); | 473 alarm_manager_->AddAlarmImpl(extension_->id(), alarm2); |
| 476 Alarm alarm3; | 474 Alarm alarm3; |
| 477 alarm3.js_alarm->name = "ccc"; | 475 alarm3.js_alarm->name = "ccc"; |
| 478 alarm3.js_alarm->scheduled_time = 25 * 60000; | 476 alarm3.js_alarm->scheduled_time = 25 * 60000; |
| 479 alarm3.js_alarm->period_in_minutes.reset(new double(25)); | 477 alarm3.js_alarm->period_in_minutes.reset(new double(25)); |
| 480 alarm_manager_->AddAlarmImpl(extension_->id(), alarm3); | 478 alarm_manager_->AddAlarmImpl(extension_->id(), alarm3); |
| 481 MessageLoop::current()->Run(); | 479 MessageLoop::current()->Run(); |
| 482 EXPECT_EQ(alarm_manager_->last_poll_time_ + base::TimeDelta::FromMinutes(4), | 480 EXPECT_EQ(alarm_manager_->last_poll_time_ + base::TimeDelta::FromMinutes(4), |
| 483 alarm_manager_->next_poll_time_); | 481 alarm_manager_->next_poll_time_); |
| 484 alarm_manager_->RemoveAllAlarms(extension_->id()); | 482 alarm_manager_->RemoveAllAlarms(extension_->id()); |
| 485 } | 483 } |
| 486 } | 484 } |
| 487 | 485 |
| 488 TEST_F(ExtensionAlarmsSchedulingTest, ReleasedExtensionPollsInfrequently) { | 486 TEST_F(ExtensionAlarmsSchedulingTest, ReleasedExtensionPollsInfrequently) { |
| 489 extension_ = utils::CreateEmptyExtensionWithLocation( | 487 extension_ = utils::CreateEmptyExtensionWithLocation( |
| 490 extensions::Manifest::INTERNAL); | 488 extensions::Manifest::INTERNAL); |
| 491 test_clock_.SetNow(base::Time::FromJsTime(300000)); | 489 test_clock_->SetNow(base::Time::FromJsTime(300000)); |
| 492 CreateAlarm("[\"a\", {\"when\": 300010}]"); | 490 CreateAlarm("[\"a\", {\"when\": 300010}]"); |
| 493 CreateAlarm("[\"b\", {\"when\": 340000}]"); | 491 CreateAlarm("[\"b\", {\"when\": 340000}]"); |
| 494 | 492 |
| 495 // On startup (when there's no "last poll"), we let alarms fire as | 493 // On startup (when there's no "last poll"), we let alarms fire as |
| 496 // soon as they're scheduled. | 494 // soon as they're scheduled. |
| 497 EXPECT_DOUBLE_EQ(300010, alarm_manager_->next_poll_time_.ToJsTime()); | 495 EXPECT_DOUBLE_EQ(300010, alarm_manager_->next_poll_time_.ToJsTime()); |
| 498 | 496 |
| 499 alarm_manager_->last_poll_time_ = base::Time::FromJsTime(290000); | 497 alarm_manager_->last_poll_time_ = base::Time::FromJsTime(290000); |
| 500 // In released extensions, we set the granularity to at least 5 | 498 // In released extensions, we set the granularity to at least 5 |
| 501 // minutes, which makes AddAlarm schedule the next poll after the | 499 // minutes, which makes AddAlarm schedule the next poll after the |
| (...skipping 10 matching lines...) Expand all Loading... |
| 512 EXPECT_TRUE(alarm_manager_->timer_.IsRunning()); | 510 EXPECT_TRUE(alarm_manager_->timer_.IsRunning()); |
| 513 MessageLoop::current()->Run(); | 511 MessageLoop::current()->Run(); |
| 514 EXPECT_FALSE(alarm_manager_->timer_.IsRunning()); | 512 EXPECT_FALSE(alarm_manager_->timer_.IsRunning()); |
| 515 CreateAlarm("[\"bb\", {\"delayInMinutes\": 10}]"); | 513 CreateAlarm("[\"bb\", {\"delayInMinutes\": 10}]"); |
| 516 EXPECT_TRUE(alarm_manager_->timer_.IsRunning()); | 514 EXPECT_TRUE(alarm_manager_->timer_.IsRunning()); |
| 517 alarm_manager_->RemoveAllAlarms(extension_->id()); | 515 alarm_manager_->RemoveAllAlarms(extension_->id()); |
| 518 EXPECT_FALSE(alarm_manager_->timer_.IsRunning()); | 516 EXPECT_FALSE(alarm_manager_->timer_.IsRunning()); |
| 519 } | 517 } |
| 520 | 518 |
| 521 } // namespace extensions | 519 } // namespace extensions |
| OLD | NEW |