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/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(¤t_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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |