Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(273)

Side by Side Diff: chrome/browser/extensions/api/alarms/alarms_api_unittest.cc

Issue 10545104: Refactor chrome.alarms interface to support absolute alarm deadlines. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix Matt's comments, and re-merge create() Created 8 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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/values.h" 7 #include "base/values.h"
8 #include "base/test/mock_time_provider.h"
8 #include "chrome/browser/browser_process_impl.h" 9 #include "chrome/browser/browser_process_impl.h"
9 #include "chrome/browser/extensions/api/alarms/alarm_manager.h" 10 #include "chrome/browser/extensions/api/alarms/alarm_manager.h"
10 #include "chrome/browser/extensions/api/alarms/alarms_api.h" 11 #include "chrome/browser/extensions/api/alarms/alarms_api.h"
11 #include "chrome/browser/extensions/extension_function_test_utils.h" 12 #include "chrome/browser/extensions/extension_function_test_utils.h"
12 #include "chrome/browser/extensions/test_extension_system.h" 13 #include "chrome/browser/extensions/test_extension_system.h"
13 #include "chrome/browser/profiles/profile_manager.h" 14 #include "chrome/browser/profiles/profile_manager.h"
14 #include "chrome/test/base/browser_with_test_window_test.h" 15 #include "chrome/test/base/browser_with_test_window_test.h"
15 #include "chrome/test/base/testing_browser_process.h" 16 #include "chrome/test/base/testing_browser_process.h"
17 #include "testing/gmock/include/gmock/gmock.h"
16 #include "testing/gtest/include/gtest/gtest.h" 18 #include "testing/gtest/include/gtest/gtest.h"
17 19
20 typedef extensions::api::alarms::Alarm JsAlarm;
21
18 namespace utils = extension_function_test_utils; 22 namespace utils = extension_function_test_utils;
19 23
20 namespace extensions { 24 namespace extensions {
21 25
22 namespace { 26 namespace {
23 27
24 // Test delegate which quits the message loop when an alarm fires. 28 // Test delegate which quits the message loop when an alarm fires.
25 class AlarmDelegate : public AlarmManager::Delegate { 29 class AlarmDelegate : public AlarmManager::Delegate {
26 public: 30 public:
27 virtual ~AlarmDelegate() {} 31 virtual ~AlarmDelegate() {}
28 virtual void OnAlarm(const std::string& extension_id, 32 virtual void OnAlarm(const std::string& extension_id,
29 const AlarmManager::Alarm& alarm) { 33 const Alarm& alarm) {
30 alarms_seen.push_back(alarm.name); 34 alarms_seen.push_back(alarm.js_alarm->name);
31 MessageLoop::current()->Quit(); 35 MessageLoop::current()->Quit();
32 } 36 }
33 37
34 std::vector<std::string> alarms_seen; 38 std::vector<std::string> alarms_seen;
35 }; 39 };
36 40
37 } // namespace 41 } // namespace
38 42
39 class ExtensionAlarmsTest : public BrowserWithTestWindowTest { 43 class ExtensionAlarmsTest : public BrowserWithTestWindowTest {
40 public: 44 public:
41 virtual void SetUp() { 45 virtual void SetUp() {
42 BrowserWithTestWindowTest::SetUp(); 46 BrowserWithTestWindowTest::SetUp();
43 47
44 TestExtensionSystem* system = static_cast<TestExtensionSystem*>( 48 TestExtensionSystem* system = static_cast<TestExtensionSystem*>(
45 ExtensionSystem::Get(browser()->profile())); 49 ExtensionSystem::Get(browser()->profile()));
46 system->CreateAlarmManager(); 50 system->CreateAlarmManager(&base::MockTimeProvider::StaticNow);
47 alarm_manager_ = system->alarm_manager(); 51 alarm_manager_ = system->alarm_manager();
48 52
49 alarm_delegate_ = new AlarmDelegate(); 53 alarm_delegate_ = new AlarmDelegate();
50 alarm_manager_->set_delegate(alarm_delegate_); 54 alarm_manager_->set_delegate(alarm_delegate_);
51 55
52 extension_ = utils::CreateEmptyExtensionWithLocation( 56 extension_ = utils::CreateEmptyExtensionWithLocation(
53 extensions::Extension::LOAD); 57 extensions::Extension::LOAD);
58
59 current_time_ = base::Time::FromDoubleT(10);
60 ON_CALL(mock_time_, Now())
61 .WillByDefault(testing::ReturnPointee(&current_time_));
54 } 62 }
55 63
56 base::Value* RunFunctionWithExtension( 64 base::Value* RunFunctionWithExtension(
57 UIThreadExtensionFunction* function, const std::string& args) { 65 UIThreadExtensionFunction* function, const std::string& args) {
58 function->set_extension(extension_.get()); 66 function->set_extension(extension_.get());
59 return utils::RunFunctionAndReturnResult(function, args, browser()); 67 return utils::RunFunctionAndReturnResult(function, args, browser());
60 } 68 }
61 69
62 base::DictionaryValue* RunFunctionAndReturnDict( 70 base::DictionaryValue* RunFunctionAndReturnDict(
63 UIThreadExtensionFunction* function, const std::string& args) { 71 UIThreadExtensionFunction* function, const std::string& args) {
(...skipping 11 matching lines...) Expand all
75 const std::string& args) { 83 const std::string& args) {
76 scoped_ptr<base::Value> result(RunFunctionWithExtension(function, args)); 84 scoped_ptr<base::Value> result(RunFunctionWithExtension(function, args));
77 } 85 }
78 86
79 std::string RunFunctionAndReturnError(UIThreadExtensionFunction* function, 87 std::string RunFunctionAndReturnError(UIThreadExtensionFunction* function,
80 const std::string& args) { 88 const std::string& args) {
81 function->set_extension(extension_.get()); 89 function->set_extension(extension_.get());
82 return utils::RunFunctionAndReturnError(function, args, browser()); 90 return utils::RunFunctionAndReturnError(function, args, browser());
83 } 91 }
84 92
93 void CreateAlarm(const std::string& args) {
94 RunFunction(new AlarmsCreateFunction(&base::MockTimeProvider::StaticNow),
95 args);
96 }
97
85 // Takes a JSON result from a function and converts it to a vector of 98 // Takes a JSON result from a function and converts it to a vector of
86 // Alarms. 99 // JsAlarms.
87 AlarmManager::AlarmList ToAlarmList(base::ListValue* value) { 100 std::vector<linked_ptr<JsAlarm> > ToAlarmList(base::ListValue* value) {
88 AlarmManager::AlarmList list; 101 std::vector<linked_ptr<JsAlarm> > list;
89 for (size_t i = 0; i < value->GetSize(); ++i) { 102 for (size_t i = 0; i < value->GetSize(); ++i) {
90 linked_ptr<AlarmManager::Alarm> alarm(new AlarmManager::Alarm); 103 linked_ptr<JsAlarm> alarm(new JsAlarm);
91 base::DictionaryValue* alarm_value; 104 base::DictionaryValue* alarm_value;
92 if (!value->GetDictionary(i, &alarm_value)) { 105 if (!value->GetDictionary(i, &alarm_value)) {
93 ADD_FAILURE() << "Expected a list of Alarm objects."; 106 ADD_FAILURE() << "Expected a list of Alarm objects.";
94 return list; 107 return list;
95 } 108 }
96 EXPECT_TRUE(AlarmManager::Alarm::Populate(*alarm_value, alarm.get())); 109 EXPECT_TRUE(JsAlarm::Populate(*alarm_value, alarm.get()));
97 list.push_back(alarm); 110 list.push_back(alarm);
98 } 111 }
99 return list; 112 return list;
100 } 113 }
101 114
102 // Creates up to 3 alarms using the extension API. 115 // Creates up to 3 alarms using the extension API.
103 void CreateAlarms(size_t num_alarms) { 116 void CreateAlarms(size_t num_alarms) {
104 CHECK(num_alarms <= 3); 117 CHECK(num_alarms <= 3);
105 118
106 const char* kCreateArgs[] = { 119 const char* kCreateArgs[] = {
107 "[null, {\"delayInMinutes\": 0.001, \"repeating\": true}]", 120 "[null, {\"periodInMinutes\": 0.001}]",
108 "[\"7\", {\"delayInMinutes\": 7, \"repeating\": true}]", 121 "[\"7\", {\"periodInMinutes\": 7}]",
109 "[\"0\", {\"delayInMinutes\": 0}]" 122 "[\"0\", {\"delayInMinutes\": 0}]",
110 }; 123 };
111 for (size_t i = 0; i < num_alarms; ++i) { 124 for (size_t i = 0; i < num_alarms; ++i) {
112 scoped_ptr<base::DictionaryValue> result(RunFunctionAndReturnDict( 125 scoped_ptr<base::DictionaryValue> result(RunFunctionAndReturnDict(
113 new AlarmsCreateFunction(), kCreateArgs[i])); 126 new AlarmsCreateFunction(
127 &base::MockTimeProvider::StaticNow),
Matt Perry 2012/06/12 20:54:29 nit: looks like this doesn't need to wrap?
Jeffrey Yasskin 2012/06/12 23:37:28 Oops, fixed.
128 kCreateArgs[i]));
114 EXPECT_FALSE(result.get()); 129 EXPECT_FALSE(result.get());
115 } 130 }
116 } 131 }
117 132
118 protected: 133 protected:
134 base::Time current_time_;
135 testing::NiceMock<base::MockTimeProvider> mock_time_;
119 AlarmManager* alarm_manager_; 136 AlarmManager* alarm_manager_;
120 AlarmDelegate* alarm_delegate_; 137 AlarmDelegate* alarm_delegate_;
121 scoped_refptr<extensions::Extension> extension_; 138 scoped_refptr<extensions::Extension> extension_;
122 }; 139 };
123 140
124 TEST_F(ExtensionAlarmsTest, Create) { 141 TEST_F(ExtensionAlarmsTest, Create) {
142 current_time_ = base::Time::FromDoubleT(10);
125 // Create 1 non-repeating alarm. 143 // Create 1 non-repeating alarm.
126 RunFunction(new AlarmsCreateFunction(), "[null, {\"delayInMinutes\": 0}]"); 144 CreateAlarm("[null, {\"delayInMinutes\": 0}]");
127 145
128 const AlarmManager::Alarm* alarm = 146 const Alarm* alarm =
129 alarm_manager_->GetAlarm(extension_->id(), ""); 147 alarm_manager_->GetAlarm(extension_->id(), "");
130 ASSERT_TRUE(alarm); 148 ASSERT_TRUE(alarm);
131 EXPECT_EQ("", alarm->name); 149 EXPECT_EQ("", alarm->js_alarm->name);
132 EXPECT_EQ(0, alarm->delay_in_minutes); 150 EXPECT_DOUBLE_EQ(10000, alarm->js_alarm->scheduled_time);
133 EXPECT_FALSE(alarm->repeating); 151 EXPECT_FALSE(alarm->js_alarm->period_in_minutes.get());
134 152
135 // Now wait for the alarm to fire. Our test delegate will quit the 153 // Now wait for the alarm to fire. Our test delegate will quit the
136 // MessageLoop when that happens. 154 // MessageLoop when that happens.
137 MessageLoop::current()->Run(); 155 MessageLoop::current()->Run();
138 156
139 ASSERT_EQ(1u, alarm_delegate_->alarms_seen.size()); 157 ASSERT_EQ(1u, alarm_delegate_->alarms_seen.size());
140 EXPECT_EQ("", alarm_delegate_->alarms_seen[0]); 158 EXPECT_EQ("", alarm_delegate_->alarms_seen[0]);
141 159
142 // Ensure the alarm is gone. 160 // Ensure the alarm is gone.
143 { 161 {
144 const AlarmManager::AlarmList* alarms = 162 const AlarmManager::AlarmList* alarms =
145 alarm_manager_->GetAllAlarms(extension_->id()); 163 alarm_manager_->GetAllAlarms(extension_->id());
146 ASSERT_FALSE(alarms); 164 ASSERT_FALSE(alarms);
147 } 165 }
148 } 166 }
149 167
150 TEST_F(ExtensionAlarmsTest, CreateRepeating) { 168 TEST_F(ExtensionAlarmsTest, CreateRepeating) {
169 current_time_ = base::Time::FromDoubleT(10);
170
151 // Create 1 repeating alarm. 171 // Create 1 repeating alarm.
152 RunFunction(new AlarmsCreateFunction(), 172 CreateAlarm("[null, {\"periodInMinutes\": 0.001}]");
153 "[null, {\"delayInMinutes\": 0.001, \"repeating\": true}]");
154 173
155 const AlarmManager::Alarm* alarm = 174 const Alarm* alarm =
156 alarm_manager_->GetAlarm(extension_->id(), ""); 175 alarm_manager_->GetAlarm(extension_->id(), "");
157 ASSERT_TRUE(alarm); 176 ASSERT_TRUE(alarm);
158 EXPECT_EQ("", alarm->name); 177 EXPECT_EQ("", alarm->js_alarm->name);
159 EXPECT_EQ(0.001, alarm->delay_in_minutes); 178 EXPECT_DOUBLE_EQ(10060, alarm->js_alarm->scheduled_time);
160 EXPECT_TRUE(alarm->repeating); 179 EXPECT_THAT(alarm->js_alarm->period_in_minutes,
180 testing::Pointee(testing::DoubleEq(0.001)));
161 181
182 current_time_ += base::TimeDelta::FromSeconds(1);
162 // Now wait for the alarm to fire. Our test delegate will quit the 183 // Now wait for the alarm to fire. Our test delegate will quit the
163 // MessageLoop when that happens. 184 // MessageLoop when that happens.
164 MessageLoop::current()->Run(); 185 MessageLoop::current()->Run();
165 186
187 current_time_ += base::TimeDelta::FromSeconds(1);
166 // Wait again, and ensure the alarm fires again. 188 // Wait again, and ensure the alarm fires again.
167 alarm_manager_->ScheduleNextPoll(base::TimeDelta::FromSeconds(0)); 189 alarm_manager_->ScheduleNextPoll(base::TimeDelta::FromSeconds(0));
168 MessageLoop::current()->Run(); 190 MessageLoop::current()->Run();
169 191
170 ASSERT_EQ(2u, alarm_delegate_->alarms_seen.size()); 192 ASSERT_EQ(2u, alarm_delegate_->alarms_seen.size());
171 EXPECT_EQ("", alarm_delegate_->alarms_seen[0]); 193 EXPECT_EQ("", alarm_delegate_->alarms_seen[0]);
172 } 194 }
173 195
196 TEST_F(ExtensionAlarmsTest, CreateAbsolute) {
197 current_time_ = base::Time::FromDoubleT(9.99);
198 CreateAlarm("[null, {\"when\": 10001}]");
199
200 const Alarm* alarm =
201 alarm_manager_->GetAlarm(extension_->id(), "");
202 ASSERT_TRUE(alarm);
203 EXPECT_EQ("", alarm->js_alarm->name);
204 EXPECT_DOUBLE_EQ(10001, alarm->js_alarm->scheduled_time);
205 EXPECT_THAT(alarm->js_alarm->period_in_minutes,
206 testing::IsNull());
207
208 current_time_ = base::Time::FromDoubleT(10.1);
209 // Now wait for the alarm to fire. Our test delegate will quit the
210 // MessageLoop when that happens.
211 MessageLoop::current()->Run();
212
213 ASSERT_FALSE(alarm_manager_->GetAlarm(extension_->id(), ""));
214
215 ASSERT_EQ(1u, alarm_delegate_->alarms_seen.size());
216 EXPECT_EQ("", alarm_delegate_->alarms_seen[0]);
217 }
218
219 TEST_F(ExtensionAlarmsTest, CreateRepeatingWithQuickFirstCall) {
220 current_time_ = base::Time::FromDoubleT(9.99);
221 CreateAlarm("[null, {\"when\": 10001, \"periodInMinutes\": 0.001}]");
222
223 const Alarm* alarm =
224 alarm_manager_->GetAlarm(extension_->id(), "");
225 ASSERT_TRUE(alarm);
226 EXPECT_EQ("", alarm->js_alarm->name);
227 EXPECT_DOUBLE_EQ(10001, alarm->js_alarm->scheduled_time);
228 EXPECT_THAT(alarm->js_alarm->period_in_minutes,
229 testing::Pointee(testing::DoubleEq(0.001)));
230
231 current_time_ = base::Time::FromDoubleT(10.1);
232 // Now wait for the alarm to fire. Our test delegate will quit the
233 // MessageLoop when that happens.
234 MessageLoop::current()->Run();
235
236 ASSERT_TRUE(alarm_manager_->GetAlarm(extension_->id(), ""));
237 EXPECT_THAT(alarm_delegate_->alarms_seen, testing::ElementsAre(""));
238
239 current_time_ = base::Time::FromDoubleT(10.7);
240 MessageLoop::current()->Run();
241
242 ASSERT_TRUE(alarm_manager_->GetAlarm(extension_->id(), ""));
243 EXPECT_THAT(alarm_delegate_->alarms_seen, testing::ElementsAre("", ""));
244 }
245
174 TEST_F(ExtensionAlarmsTest, CreateDupe) { 246 TEST_F(ExtensionAlarmsTest, CreateDupe) {
247 current_time_ = base::Time::FromDoubleT(10);
248
175 // Create 2 duplicate alarms. The first should be overridden. 249 // Create 2 duplicate alarms. The first should be overridden.
176 RunFunction(new AlarmsCreateFunction(), "[\"dup\", {\"delayInMinutes\": 1}]"); 250 CreateAlarm("[\"dup\", {\"delayInMinutes\": 1}]");
177 RunFunction(new AlarmsCreateFunction(), "[\"dup\", {\"delayInMinutes\": 7}]"); 251 CreateAlarm("[\"dup\", {\"delayInMinutes\": 7}]");
178 252
179 { 253 {
180 const AlarmManager::AlarmList* alarms = 254 const AlarmManager::AlarmList* alarms =
181 alarm_manager_->GetAllAlarms(extension_->id()); 255 alarm_manager_->GetAllAlarms(extension_->id());
182 ASSERT_TRUE(alarms); 256 ASSERT_TRUE(alarms);
183 EXPECT_EQ(1u, alarms->size()); 257 EXPECT_EQ(1u, alarms->size());
184 EXPECT_EQ(7, (*alarms)[0]->delay_in_minutes); 258 EXPECT_DOUBLE_EQ(430000, (*alarms)[0].js_alarm->scheduled_time);
185 } 259 }
186 } 260 }
187 261
188 TEST_F(ExtensionAlarmsTest, CreateDelayBelowMinimum) { 262 TEST_F(ExtensionAlarmsTest, CreateDelayBelowMinimum) {
189 // Create an alarm with delay below the minimum accepted value. 263 // Create an alarm with delay below the minimum accepted value.
190 std::string error = RunFunctionAndReturnError(new AlarmsCreateFunction(), 264 std::string error = RunFunctionAndReturnError(
265 new AlarmsCreateFunction(&base::MockTimeProvider::StaticNow),
191 "[\"negative\", {\"delayInMinutes\": -0.2}]"); 266 "[\"negative\", {\"delayInMinutes\": -0.2}]");
192 EXPECT_FALSE(error.empty()); 267 EXPECT_FALSE(error.empty());
193 } 268 }
194 269
195 TEST_F(ExtensionAlarmsTest, Get) { 270 TEST_F(ExtensionAlarmsTest, Get) {
271 current_time_ = base::Time::FromDoubleT(4);
272
196 // Create 2 alarms, and make sure we can query them. 273 // Create 2 alarms, and make sure we can query them.
197 CreateAlarms(2); 274 CreateAlarms(2);
198 275
199 // Get the default one. 276 // Get the default one.
200 { 277 {
201 AlarmManager::Alarm alarm; 278 JsAlarm alarm;
202 scoped_ptr<base::DictionaryValue> result(RunFunctionAndReturnDict( 279 scoped_ptr<base::DictionaryValue> result(RunFunctionAndReturnDict(
203 new AlarmsGetFunction(), "[null]")); 280 new AlarmsGetFunction(), "[null]"));
204 ASSERT_TRUE(result.get()); 281 ASSERT_TRUE(result.get());
205 EXPECT_TRUE(AlarmManager::Alarm::Populate(*result, &alarm)); 282 EXPECT_TRUE(JsAlarm::Populate(*result, &alarm));
206 EXPECT_EQ("", alarm.name); 283 EXPECT_EQ("", alarm.name);
207 EXPECT_EQ(0.001, alarm.delay_in_minutes); 284 EXPECT_DOUBLE_EQ(4060, alarm.scheduled_time);
208 EXPECT_TRUE(alarm.repeating); 285 EXPECT_THAT(alarm.period_in_minutes,
286 testing::Pointee(testing::DoubleEq(0.001)));
209 } 287 }
210 288
211 // Get "7". 289 // Get "7".
212 { 290 {
213 AlarmManager::Alarm alarm; 291 JsAlarm alarm;
214 scoped_ptr<base::DictionaryValue> result(RunFunctionAndReturnDict( 292 scoped_ptr<base::DictionaryValue> result(RunFunctionAndReturnDict(
215 new AlarmsGetFunction(), "[\"7\"]")); 293 new AlarmsGetFunction(), "[\"7\"]"));
216 ASSERT_TRUE(result.get()); 294 ASSERT_TRUE(result.get());
217 EXPECT_TRUE(AlarmManager::Alarm::Populate(*result, &alarm)); 295 EXPECT_TRUE(JsAlarm::Populate(*result, &alarm));
218 EXPECT_EQ("7", alarm.name); 296 EXPECT_EQ("7", alarm.name);
219 EXPECT_EQ(7, alarm.delay_in_minutes); 297 EXPECT_EQ(424000, alarm.scheduled_time);
220 EXPECT_TRUE(alarm.repeating); 298 EXPECT_THAT(alarm.period_in_minutes, testing::Pointee(7));
221 } 299 }
222 300
223 // Get a non-existent one. 301 // Get a non-existent one.
224 { 302 {
225 std::string error = RunFunctionAndReturnError( 303 std::string error = RunFunctionAndReturnError(
226 new AlarmsGetFunction(), "[\"nobody\"]"); 304 new AlarmsGetFunction(), "[\"nobody\"]");
227 EXPECT_FALSE(error.empty()); 305 EXPECT_FALSE(error.empty());
228 } 306 }
229 } 307 }
230 308
231 TEST_F(ExtensionAlarmsTest, GetAll) { 309 TEST_F(ExtensionAlarmsTest, GetAll) {
232 // Test getAll with 0 alarms. 310 // Test getAll with 0 alarms.
233 { 311 {
234 scoped_ptr<base::ListValue> result(RunFunctionAndReturnList( 312 scoped_ptr<base::ListValue> result(RunFunctionAndReturnList(
235 new AlarmsGetAllFunction(), "[]")); 313 new AlarmsGetAllFunction(), "[]"));
236 AlarmManager::AlarmList alarms = ToAlarmList(result.get()); 314 std::vector<linked_ptr<JsAlarm> > alarms = ToAlarmList(result.get());
237 EXPECT_EQ(0u, alarms.size()); 315 EXPECT_EQ(0u, alarms.size());
238 } 316 }
239 317
240 // Create 2 alarms, and make sure we can query them. 318 // Create 2 alarms, and make sure we can query them.
241 CreateAlarms(2); 319 CreateAlarms(2);
242 320
243 { 321 {
244 scoped_ptr<base::ListValue> result(RunFunctionAndReturnList( 322 scoped_ptr<base::ListValue> result(RunFunctionAndReturnList(
245 new AlarmsGetAllFunction(), "[null]")); 323 new AlarmsGetAllFunction(), "[null]"));
246 AlarmManager::AlarmList alarms = ToAlarmList(result.get()); 324 std::vector<linked_ptr<JsAlarm> > alarms = ToAlarmList(result.get());
247 EXPECT_EQ(2u, alarms.size()); 325 EXPECT_EQ(2u, alarms.size());
248 326
249 // Test the "7" alarm. 327 // Test the "7" alarm.
250 AlarmManager::Alarm* alarm = alarms[0].get(); 328 JsAlarm* alarm = alarms[0].get();
251 if (alarm->name != "7") 329 if (alarm->name != "7")
252 alarm = alarms[1].get(); 330 alarm = alarms[1].get();
253 EXPECT_EQ("7", alarm->name); 331 EXPECT_EQ("7", alarm->name);
254 EXPECT_EQ(7, alarm->delay_in_minutes); 332 EXPECT_THAT(alarm->period_in_minutes, testing::Pointee(7));
255 EXPECT_TRUE(alarm->repeating);
256 } 333 }
257 } 334 }
258 335
259 TEST_F(ExtensionAlarmsTest, Clear) { 336 TEST_F(ExtensionAlarmsTest, Clear) {
260 // Clear a non-existent one. 337 // Clear a non-existent one.
261 { 338 {
262 std::string error = RunFunctionAndReturnError( 339 std::string error = RunFunctionAndReturnError(
263 new AlarmsClearFunction(), "[\"nobody\"]"); 340 new AlarmsClearFunction(), "[\"nobody\"]");
264 EXPECT_FALSE(error.empty()); 341 EXPECT_FALSE(error.empty());
265 } 342 }
266 343
267 // Create 3 alarms. 344 // Create 3 alarms.
268 CreateAlarms(3); 345 CreateAlarms(3);
269 346
270 // Clear all but the 0.001-minute alarm. 347 // Clear all but the 0.001-minute alarm.
271 { 348 {
272 RunFunction(new AlarmsClearFunction(), "[\"7\"]"); 349 RunFunction(new AlarmsClearFunction(), "[\"7\"]");
273 RunFunction(new AlarmsClearFunction(), "[\"0\"]"); 350 RunFunction(new AlarmsClearFunction(), "[\"0\"]");
274 351
275 const AlarmManager::AlarmList* alarms = 352 const AlarmManager::AlarmList* alarms =
276 alarm_manager_->GetAllAlarms(extension_->id()); 353 alarm_manager_->GetAllAlarms(extension_->id());
277 ASSERT_TRUE(alarms); 354 ASSERT_TRUE(alarms);
278 EXPECT_EQ(1u, alarms->size()); 355 EXPECT_EQ(1u, alarms->size());
279 EXPECT_EQ(0.001, (*alarms)[0]->delay_in_minutes); 356 EXPECT_THAT((*alarms)[0].js_alarm->period_in_minutes,
357 testing::Pointee(0.001));
280 } 358 }
281 359
282 // Now wait for the alarms to fire, and ensure the cancelled alarms don't 360 // Now wait for the alarms to fire, and ensure the cancelled alarms don't
283 // fire. 361 // fire.
284 alarm_manager_->ScheduleNextPoll(base::TimeDelta::FromSeconds(0)); 362 alarm_manager_->ScheduleNextPoll(base::TimeDelta::FromSeconds(0));
285 MessageLoop::current()->Run(); 363 MessageLoop::current()->Run();
286 364
287 ASSERT_EQ(1u, alarm_delegate_->alarms_seen.size()); 365 ASSERT_EQ(1u, alarm_delegate_->alarms_seen.size());
288 EXPECT_EQ("", alarm_delegate_->alarms_seen[0]); 366 EXPECT_EQ("", alarm_delegate_->alarms_seen[0]);
289 367
290 // Ensure the 0.001-minute alarm is still there, since it's repeating. 368 // Ensure the 0.001-minute alarm is still there, since it's repeating.
291 { 369 {
292 const AlarmManager::AlarmList* alarms = 370 const AlarmManager::AlarmList* alarms =
293 alarm_manager_->GetAllAlarms(extension_->id()); 371 alarm_manager_->GetAllAlarms(extension_->id());
294 ASSERT_TRUE(alarms); 372 ASSERT_TRUE(alarms);
295 EXPECT_EQ(1u, alarms->size()); 373 EXPECT_EQ(1u, alarms->size());
296 EXPECT_EQ(0.001, (*alarms)[0]->delay_in_minutes); 374 EXPECT_THAT((*alarms)[0].js_alarm->period_in_minutes,
375 testing::Pointee(0.001));
297 } 376 }
298 } 377 }
299 378
300 TEST_F(ExtensionAlarmsTest, ClearAll) { 379 TEST_F(ExtensionAlarmsTest, ClearAll) {
301 // ClearAll with no alarms set. 380 // ClearAll with no alarms set.
302 { 381 {
303 scoped_ptr<base::Value> result(RunFunctionWithExtension( 382 scoped_ptr<base::Value> result(RunFunctionWithExtension(
304 new AlarmsClearAllFunction(), "[]")); 383 new AlarmsClearAllFunction(), "[]"));
305 EXPECT_FALSE(result.get()); 384 EXPECT_FALSE(result.get());
306 } 385 }
(...skipping 13 matching lines...) Expand all
320 const AlarmManager::AlarmList* alarms = 399 const AlarmManager::AlarmList* alarms =
321 alarm_manager_->GetAllAlarms(extension_->id()); 400 alarm_manager_->GetAllAlarms(extension_->id());
322 ASSERT_FALSE(alarms); 401 ASSERT_FALSE(alarms);
323 } 402 }
324 } 403 }
325 404
326 class ExtensionAlarmsSchedulingTest : public ExtensionAlarmsTest { 405 class ExtensionAlarmsSchedulingTest : public ExtensionAlarmsTest {
327 public: 406 public:
328 // Get the time that the alarm named is scheduled to run. 407 // Get the time that the alarm named is scheduled to run.
329 base::Time GetScheduledTime(const std::string& alarm_name) { 408 base::Time GetScheduledTime(const std::string& alarm_name) {
330 const extensions::AlarmManager::Alarm* alarm = 409 const extensions::Alarm* alarm =
331 alarm_manager_->GetAlarm(extension_->id(), alarm_name); 410 alarm_manager_->GetAlarm(extension_->id(), alarm_name);
332 CHECK(alarm); 411 CHECK(alarm);
333 return alarm_manager_->scheduled_times_[alarm].time; 412 return base::Time::FromJsTime(alarm->js_alarm->scheduled_time);
334 } 413 }
335 }; 414 };
336 415
337 TEST_F(ExtensionAlarmsSchedulingTest, PollScheduling) { 416 TEST_F(ExtensionAlarmsSchedulingTest, PollScheduling) {
338 { 417 {
339 RunFunction(new AlarmsCreateFunction(), 418 CreateAlarm("[\"a\", {\"periodInMinutes\": 6}]");
340 "[\"a\", {\"delayInMinutes\": 6, \"repeating\": true}]"); 419 CreateAlarm("[\"bb\", {\"periodInMinutes\": 8}]");
341 RunFunction(new AlarmsCreateFunction(),
342 "[\"bb\", {\"delayInMinutes\": 8, \"repeating\": true}]");
343 EXPECT_EQ(GetScheduledTime("a"), alarm_manager_->next_poll_time_); 420 EXPECT_EQ(GetScheduledTime("a"), alarm_manager_->next_poll_time_);
344 alarm_manager_->RemoveAllAlarms(extension_->id()); 421 alarm_manager_->RemoveAllAlarms(extension_->id());
345 } 422 }
346 { 423 {
347 RunFunction(new AlarmsCreateFunction(), 424 CreateAlarm("[\"a\", {\"delayInMinutes\": 10}]");
348 "[\"a\", {\"delayInMinutes\": 10}]"); 425 CreateAlarm("[\"bb\", {\"delayInMinutes\": 21}]");
349 RunFunction(new AlarmsCreateFunction(),
350 "[\"bb\", {\"delayInMinutes\": 21}]");
351 EXPECT_EQ(GetScheduledTime("a"), alarm_manager_->next_poll_time_); 426 EXPECT_EQ(GetScheduledTime("a"), alarm_manager_->next_poll_time_);
352 alarm_manager_->RemoveAllAlarms(extension_->id()); 427 alarm_manager_->RemoveAllAlarms(extension_->id());
353 } 428 }
354 { 429 {
355 RunFunction(new AlarmsCreateFunction(), 430 current_time_ = base::Time::FromDoubleT(10);
356 "[\"a\", {\"delayInMinutes\": 10, \"repeating\": true}]"); 431 CreateAlarm("[\"a\", {\"periodInMinutes\": 10}]");
357 linked_ptr<AlarmManager::Alarm> alarm(new AlarmManager::Alarm()); 432 Alarm alarm;
358 alarm->name = "bb"; 433 alarm.js_alarm->name = "bb";
359 alarm->delay_in_minutes = 30; 434 alarm.js_alarm->scheduled_time = 30 * 60000;
360 alarm->repeating = true; 435 alarm.js_alarm->period_in_minutes.reset(new double(30));
361 alarm_manager_->AddAlarmImpl(extension_->id(), alarm, 436 alarm_manager_->AddAlarmImpl(extension_->id(), alarm);
362 base::TimeDelta::FromMinutes(3)); 437 EXPECT_DOUBLE_EQ(GetScheduledTime("a").ToDoubleT(),
363 EXPECT_EQ(GetScheduledTime("bb"), alarm_manager_->next_poll_time_); 438 alarm_manager_->next_poll_time_.ToDoubleT());
364 alarm_manager_->RemoveAllAlarms(extension_->id()); 439 alarm_manager_->RemoveAllAlarms(extension_->id());
365 } 440 }
366 { 441 {
367 linked_ptr<AlarmManager::Alarm> alarm(new AlarmManager::Alarm()); 442 current_time_ = base::Time::FromDoubleT(3 * 60 + 1);
368 alarm->name = "bb"; 443 Alarm alarm;
369 alarm->delay_in_minutes = 3; 444 alarm.js_alarm->name = "bb";
370 alarm->repeating = true; 445 alarm.js_alarm->scheduled_time = 3 * 60000;
371 alarm_manager_->AddAlarmImpl(extension_->id(), alarm, 446 alarm.js_alarm->period_in_minutes.reset(new double(3));
372 base::TimeDelta::FromSeconds(0)); 447 alarm_manager_->AddAlarmImpl(extension_->id(), alarm);
373 MessageLoop::current()->Run(); 448 MessageLoop::current()->Run();
374 EXPECT_EQ(alarm_manager_->last_poll_time_ + base::TimeDelta::FromMinutes(3), 449 EXPECT_EQ(alarm_manager_->last_poll_time_ + base::TimeDelta::FromMinutes(3),
375 alarm_manager_->next_poll_time_); 450 alarm_manager_->next_poll_time_);
376 alarm_manager_->RemoveAllAlarms(extension_->id()); 451 alarm_manager_->RemoveAllAlarms(extension_->id());
377 } 452 }
378 { 453 {
379 RunFunction(new AlarmsCreateFunction(), 454 current_time_ = base::Time::FromDoubleT(4 * 60 + 1);
380 "[\"a\", {\"delayInMinutes\": 2, \"repeating\": true}]"); 455 CreateAlarm("[\"a\", {\"periodInMinutes\": 2}]");
381 alarm_manager_->RemoveAlarm(extension_->id(), "a"); 456 alarm_manager_->RemoveAlarm(extension_->id(), "a");
382 linked_ptr<AlarmManager::Alarm> alarm2(new AlarmManager::Alarm()); 457 Alarm alarm2;
383 alarm2->name = "bb"; 458 alarm2.js_alarm->name = "bb";
384 alarm2->delay_in_minutes = 4; 459 alarm2.js_alarm->scheduled_time = 4 * 60000;
385 alarm2->repeating = true; 460 alarm2.js_alarm->period_in_minutes.reset(new double(4));
386 alarm_manager_->AddAlarmImpl(extension_->id(), alarm2, 461 alarm_manager_->AddAlarmImpl(extension_->id(), alarm2);
387 base::TimeDelta::FromMinutes(3)); 462 Alarm alarm3;
388 linked_ptr<AlarmManager::Alarm> alarm3(new AlarmManager::Alarm()); 463 alarm3.js_alarm->name = "ccc";
389 alarm3->name = "ccc"; 464 alarm3.js_alarm->scheduled_time = 25 * 60000;
390 alarm3->delay_in_minutes = 25; 465 alarm3.js_alarm->period_in_minutes.reset(new double(25));
391 alarm3->repeating = true; 466 alarm_manager_->AddAlarmImpl(extension_->id(), alarm3);
392 alarm_manager_->AddAlarmImpl(extension_->id(), alarm3,
393 base::TimeDelta::FromSeconds(0));
394 MessageLoop::current()->Run(); 467 MessageLoop::current()->Run();
395 EXPECT_EQ(alarm_manager_->last_poll_time_ + base::TimeDelta::FromMinutes(4), 468 EXPECT_EQ(alarm_manager_->last_poll_time_ + base::TimeDelta::FromMinutes(4),
396 alarm_manager_->next_poll_time_); 469 alarm_manager_->next_poll_time_);
397 alarm_manager_->RemoveAllAlarms(extension_->id()); 470 alarm_manager_->RemoveAllAlarms(extension_->id());
398 } 471 }
399 } 472 }
400 473
474 TEST_F(ExtensionAlarmsSchedulingTest, ReleasedExtensionPollsInfrequently) {
475 extension_ = utils::CreateEmptyExtensionWithLocation(
476 extensions::Extension::INTERNAL);
477 current_time_ = base::Time::FromJsTime(300000);
478 CreateAlarm("[\"a\", {\"when\": 300010}]");
479 CreateAlarm("[\"b\", {\"when\": 360000}]");
480
481 // In released extensions, we set the granularity to at least 5
482 // minutes, but AddAlarm schedules its next poll precisely.
483 EXPECT_DOUBLE_EQ(300010, alarm_manager_->next_poll_time_.ToJsTime());
484
485 // Run an iteration to see the effect of the granularity.
486 current_time_ = base::Time::FromJsTime(300020);
487 MessageLoop::current()->Run();
488 EXPECT_DOUBLE_EQ(300020, alarm_manager_->last_poll_time_.ToJsTime());
489 EXPECT_DOUBLE_EQ(600020, alarm_manager_->next_poll_time_.ToJsTime());
490 }
491
401 TEST_F(ExtensionAlarmsSchedulingTest, TimerRunning) { 492 TEST_F(ExtensionAlarmsSchedulingTest, TimerRunning) {
402 EXPECT_FALSE(alarm_manager_->timer_.IsRunning()); 493 EXPECT_FALSE(alarm_manager_->timer_.IsRunning());
403 RunFunction(new AlarmsCreateFunction(), 494 CreateAlarm("[\"a\", {\"delayInMinutes\": 0.001}]");
404 "[\"a\", {\"delayInMinutes\": 0.001}]");
405 EXPECT_TRUE(alarm_manager_->timer_.IsRunning()); 495 EXPECT_TRUE(alarm_manager_->timer_.IsRunning());
406 MessageLoop::current()->Run(); 496 MessageLoop::current()->Run();
407 EXPECT_FALSE(alarm_manager_->timer_.IsRunning()); 497 EXPECT_FALSE(alarm_manager_->timer_.IsRunning());
408 RunFunction(new AlarmsCreateFunction(), 498 CreateAlarm("[\"bb\", {\"delayInMinutes\": 10}]");
409 "[\"bb\", {\"delayInMinutes\": 10}]");
410 EXPECT_TRUE(alarm_manager_->timer_.IsRunning()); 499 EXPECT_TRUE(alarm_manager_->timer_.IsRunning());
411 alarm_manager_->RemoveAllAlarms(extension_->id()); 500 alarm_manager_->RemoveAllAlarms(extension_->id());
412 EXPECT_FALSE(alarm_manager_->timer_.IsRunning()); 501 EXPECT_FALSE(alarm_manager_->timer_.IsRunning());
413 } 502 }
414 503
415 } // namespace extensions 504 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698