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