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" | |
10 #include "chrome/browser/extensions/api/alarms/alarms_api.h" | |
11 #include "chrome/browser/extensions/extension_api_unittest.h" | |
12 #include "chrome/browser/extensions/extension_function_test_utils.h" | |
13 #include "chrome/browser/profiles/profile_manager.h" | |
14 #include "chrome/browser/ui/browser.h" | |
15 #include "content/public/browser/web_contents.h" | 9 #include "content/public/browser/web_contents.h" |
16 #include "content/public/test/mock_render_process_host.h" | 10 #include "content/public/test/mock_render_process_host.h" |
| 11 #include "extensions/browser/api/alarms/alarm_manager.h" |
| 12 #include "extensions/browser/api/alarms/alarms_api.h" |
| 13 #include "extensions/browser/api_test_utils.h" |
| 14 #include "extensions/browser/api_unittest.h" |
17 #include "extensions/common/extension_messages.h" | 15 #include "extensions/common/extension_messages.h" |
18 #include "ipc/ipc_test_sink.h" | 16 #include "ipc/ipc_test_sink.h" |
19 #include "testing/gmock/include/gmock/gmock.h" | 17 #include "testing/gmock/include/gmock/gmock.h" |
20 #include "testing/gtest/include/gtest/gtest.h" | 18 #include "testing/gtest/include/gtest/gtest.h" |
21 | 19 |
22 typedef extensions::api::alarms::Alarm JsAlarm; | 20 typedef extensions::core_api::alarms::Alarm JsAlarm; |
23 | |
24 namespace utils = extension_function_test_utils; | |
25 | 21 |
26 namespace extensions { | 22 namespace extensions { |
27 | 23 |
| 24 namespace utils = api_test_utils; |
| 25 |
28 namespace { | 26 namespace { |
29 | 27 |
30 // Test delegate which quits the message loop when an alarm fires. | 28 // Test delegate which quits the message loop when an alarm fires. |
31 class AlarmDelegate : public AlarmManager::Delegate { | 29 class AlarmDelegate : public AlarmManager::Delegate { |
32 public: | 30 public: |
33 ~AlarmDelegate() override {} | 31 ~AlarmDelegate() override {} |
34 void OnAlarm(const std::string& extension_id, const Alarm& alarm) override { | 32 void OnAlarm(const std::string& extension_id, const Alarm& alarm) override { |
35 alarms_seen.push_back(alarm.js_alarm->name); | 33 alarms_seen.push_back(alarm.js_alarm->name); |
36 if (base::MessageLoop::current()->is_running()) | 34 if (base::MessageLoop::current()->is_running()) |
37 base::MessageLoop::current()->Quit(); | 35 base::MessageLoop::current()->Quit(); |
38 } | 36 } |
39 | 37 |
40 std::vector<std::string> alarms_seen; | 38 std::vector<std::string> alarms_seen; |
41 }; | 39 }; |
42 | 40 |
43 } // namespace | 41 } // namespace |
44 | 42 |
45 void RunScheduleNextPoll(AlarmManager* alarm_manager) { | 43 void RunScheduleNextPoll(AlarmManager* alarm_manager) { |
46 alarm_manager->ScheduleNextPoll(); | 44 alarm_manager->ScheduleNextPoll(); |
47 } | 45 } |
48 | 46 |
49 class ExtensionAlarmsTest : public ExtensionApiUnittest { | 47 class ExtensionAlarmsTest : public ApiUnitTest { |
50 public: | 48 public: |
51 using ExtensionApiUnittest::RunFunction; | 49 using ApiUnitTest::RunFunction; |
52 | 50 |
53 void SetUp() override { | 51 void SetUp() override { |
54 ExtensionApiUnittest::SetUp(); | 52 ApiUnitTest::SetUp(); |
55 | 53 |
56 test_clock_ = new base::SimpleTestClock(); | 54 test_clock_ = new base::SimpleTestClock(); |
57 alarm_manager_ = AlarmManager::Get(browser()->profile()); | 55 alarm_manager_ = AlarmManager::Get(browser_context()); |
58 alarm_manager_->SetClockForTesting(test_clock_); | 56 alarm_manager_->SetClockForTesting(test_clock_); |
59 | 57 |
60 alarm_delegate_ = new AlarmDelegate(); | 58 alarm_delegate_ = new AlarmDelegate(); |
61 alarm_manager_->set_delegate(alarm_delegate_); | 59 alarm_manager_->set_delegate(alarm_delegate_); |
62 | 60 |
63 // Make sure there's a RenderViewHost for alarms to warn into. | 61 // Make sure there's a RenderViewHost for alarms to warn into. |
64 CreateBackgroundPage(); | 62 CreateBackgroundPage(); |
65 | 63 |
66 test_clock_->SetNow(base::Time::FromDoubleT(10)); | 64 test_clock_->SetNow(base::Time::FromDoubleT(10)); |
67 } | 65 } |
68 | 66 |
69 void CreateAlarm(const std::string& args) { | 67 void CreateAlarm(const std::string& args) { |
70 RunFunction(new AlarmsCreateFunction(test_clock_), args); | 68 RunFunction(new AlarmsCreateFunction(test_clock_), args); |
71 } | 69 } |
72 | 70 |
73 // Takes a JSON result from a function and converts it to a vector of | 71 // Takes a JSON result from a function and converts it to a vector of |
74 // JsAlarms. | 72 // JsAlarms. |
75 std::vector<linked_ptr<JsAlarm> > ToAlarmList(base::ListValue* value) { | 73 std::vector<linked_ptr<JsAlarm>> ToAlarmList(base::ListValue* value) { |
76 std::vector<linked_ptr<JsAlarm> > list; | 74 std::vector<linked_ptr<JsAlarm>> list; |
77 for (size_t i = 0; i < value->GetSize(); ++i) { | 75 for (size_t i = 0; i < value->GetSize(); ++i) { |
78 linked_ptr<JsAlarm> alarm(new JsAlarm); | 76 linked_ptr<JsAlarm> alarm(new JsAlarm); |
79 base::DictionaryValue* alarm_value; | 77 base::DictionaryValue* alarm_value; |
80 if (!value->GetDictionary(i, &alarm_value)) { | 78 if (!value->GetDictionary(i, &alarm_value)) { |
81 ADD_FAILURE() << "Expected a list of Alarm objects."; | 79 ADD_FAILURE() << "Expected a list of Alarm objects."; |
82 return list; | 80 return list; |
83 } | 81 } |
84 EXPECT_TRUE(JsAlarm::Populate(*alarm_value, alarm.get())); | 82 EXPECT_TRUE(JsAlarm::Populate(*alarm_value, alarm.get())); |
85 list.push_back(alarm); | 83 list.push_back(alarm); |
86 } | 84 } |
87 return list; | 85 return list; |
88 } | 86 } |
89 | 87 |
90 // Creates up to 3 alarms using the extension API. | 88 // Creates up to 3 alarms using the extension API. |
91 void CreateAlarms(size_t num_alarms) { | 89 void CreateAlarms(size_t num_alarms) { |
92 CHECK_LE(num_alarms, 3U); | 90 CHECK_LE(num_alarms, 3U); |
93 | 91 |
94 const char* const kCreateArgs[] = { | 92 const char* const kCreateArgs[] = { |
95 "[null, {\"periodInMinutes\": 0.001}]", | 93 "[null, {\"periodInMinutes\": 0.001}]", |
96 "[\"7\", {\"periodInMinutes\": 7}]", | 94 "[\"7\", {\"periodInMinutes\": 7}]", |
97 "[\"0\", {\"delayInMinutes\": 0}]", | 95 "[\"0\", {\"delayInMinutes\": 0}]", |
98 }; | 96 }; |
99 for (size_t i = 0; i < num_alarms; ++i) { | 97 for (size_t i = 0; i < num_alarms; ++i) { |
100 scoped_ptr<base::DictionaryValue> result(RunFunctionAndReturnDictionary( | 98 scoped_ptr<base::DictionaryValue> result(RunFunctionAndReturnDictionary( |
101 new AlarmsCreateFunction(test_clock_), kCreateArgs[i])); | 99 new AlarmsCreateFunction(test_clock_), kCreateArgs[i])); |
102 EXPECT_FALSE(result.get()); | 100 EXPECT_FALSE(result.get()); |
103 } | 101 } |
104 } | 102 } |
105 | 103 |
106 base::SimpleTestClock* test_clock_; | 104 base::SimpleTestClock* test_clock_; |
107 AlarmManager* alarm_manager_; | 105 AlarmManager* alarm_manager_; |
108 AlarmDelegate* alarm_delegate_; | 106 AlarmDelegate* alarm_delegate_; |
109 }; | 107 }; |
110 | 108 |
111 void ExtensionAlarmsTestGetAllAlarmsCallback( | 109 void ExtensionAlarmsTestGetAllAlarmsCallback( |
112 const AlarmManager::AlarmList* alarms) { | 110 const AlarmManager::AlarmList* alarms) { |
113 // Ensure the alarm is gone. | 111 // Ensure the alarm is gone. |
114 ASSERT_FALSE(alarms); | 112 ASSERT_FALSE(alarms); |
115 } | 113 } |
116 | 114 |
117 void ExtensionAlarmsTestGetAlarmCallback( | 115 void ExtensionAlarmsTestGetAlarmCallback(ExtensionAlarmsTest* test, |
118 ExtensionAlarmsTest* test, Alarm* alarm) { | 116 Alarm* alarm) { |
119 ASSERT_TRUE(alarm); | 117 ASSERT_TRUE(alarm); |
120 EXPECT_EQ("", alarm->js_alarm->name); | 118 EXPECT_EQ("", alarm->js_alarm->name); |
121 EXPECT_DOUBLE_EQ(10000, alarm->js_alarm->scheduled_time); | 119 EXPECT_DOUBLE_EQ(10000, alarm->js_alarm->scheduled_time); |
122 EXPECT_FALSE(alarm->js_alarm->period_in_minutes.get()); | 120 EXPECT_FALSE(alarm->js_alarm->period_in_minutes.get()); |
123 | 121 |
124 // Now wait for the alarm to fire. Our test delegate will quit the | 122 // Now wait for the alarm to fire. Our test delegate will quit the |
125 // MessageLoop when that happens. | 123 // MessageLoop when that happens. |
126 base::MessageLoop::current()->Run(); | 124 base::MessageLoop::current()->Run(); |
127 | 125 |
128 ASSERT_EQ(1u, test->alarm_delegate_->alarms_seen.size()); | 126 ASSERT_EQ(1u, test->alarm_delegate_->alarms_seen.size()); |
129 EXPECT_EQ("", test->alarm_delegate_->alarms_seen[0]); | 127 EXPECT_EQ("", test->alarm_delegate_->alarms_seen[0]); |
130 | 128 |
131 // Ensure the alarm is gone. | 129 // Ensure the alarm is gone. |
132 test->alarm_manager_->GetAllAlarms(test->extension()->id(), base::Bind( | 130 test->alarm_manager_->GetAllAlarms( |
133 ExtensionAlarmsTestGetAllAlarmsCallback)); | 131 test->extension()->id(), |
| 132 base::Bind(ExtensionAlarmsTestGetAllAlarmsCallback)); |
134 } | 133 } |
135 | 134 |
136 TEST_F(ExtensionAlarmsTest, Create) { | 135 TEST_F(ExtensionAlarmsTest, Create) { |
137 test_clock_->SetNow(base::Time::FromDoubleT(10)); | 136 test_clock_->SetNow(base::Time::FromDoubleT(10)); |
138 // Create 1 non-repeating alarm. | 137 // Create 1 non-repeating alarm. |
139 CreateAlarm("[null, {\"delayInMinutes\": 0}]"); | 138 CreateAlarm("[null, {\"delayInMinutes\": 0}]"); |
140 | 139 |
141 alarm_manager_->GetAlarm(extension()->id(), std::string(), base::Bind( | 140 alarm_manager_->GetAlarm( |
142 ExtensionAlarmsTestGetAlarmCallback, this)); | 141 extension()->id(), std::string(), |
| 142 base::Bind(ExtensionAlarmsTestGetAlarmCallback, this)); |
143 } | 143 } |
144 | 144 |
145 void ExtensionAlarmsTestCreateRepeatingGetAlarmCallback( | 145 void ExtensionAlarmsTestCreateRepeatingGetAlarmCallback( |
146 ExtensionAlarmsTest* test, Alarm* alarm) { | 146 ExtensionAlarmsTest* test, |
| 147 Alarm* alarm) { |
147 ASSERT_TRUE(alarm); | 148 ASSERT_TRUE(alarm); |
148 EXPECT_EQ("", alarm->js_alarm->name); | 149 EXPECT_EQ("", alarm->js_alarm->name); |
149 EXPECT_DOUBLE_EQ(10060, alarm->js_alarm->scheduled_time); | 150 EXPECT_DOUBLE_EQ(10060, alarm->js_alarm->scheduled_time); |
150 EXPECT_THAT(alarm->js_alarm->period_in_minutes, | 151 EXPECT_THAT(alarm->js_alarm->period_in_minutes, |
151 testing::Pointee(testing::DoubleEq(0.001))); | 152 testing::Pointee(testing::DoubleEq(0.001))); |
152 | 153 |
153 test->test_clock_->Advance(base::TimeDelta::FromSeconds(1)); | 154 test->test_clock_->Advance(base::TimeDelta::FromSeconds(1)); |
154 // Now wait for the alarm to fire. Our test delegate will quit the | 155 // Now wait for the alarm to fire. Our test delegate will quit the |
155 // MessageLoop when that happens. | 156 // MessageLoop when that happens. |
156 base::MessageLoop::current()->Run(); | 157 base::MessageLoop::current()->Run(); |
157 | 158 |
158 test->test_clock_->Advance(base::TimeDelta::FromSeconds(1)); | 159 test->test_clock_->Advance(base::TimeDelta::FromSeconds(1)); |
159 // Wait again, and ensure the alarm fires again. | 160 // Wait again, and ensure the alarm fires again. |
160 RunScheduleNextPoll(test->alarm_manager_); | 161 RunScheduleNextPoll(test->alarm_manager_); |
161 base::MessageLoop::current()->Run(); | 162 base::MessageLoop::current()->Run(); |
162 | 163 |
163 ASSERT_EQ(2u, test->alarm_delegate_->alarms_seen.size()); | 164 ASSERT_EQ(2u, test->alarm_delegate_->alarms_seen.size()); |
164 EXPECT_EQ("", test->alarm_delegate_->alarms_seen[0]); | 165 EXPECT_EQ("", test->alarm_delegate_->alarms_seen[0]); |
165 } | 166 } |
166 | 167 |
167 TEST_F(ExtensionAlarmsTest, CreateRepeating) { | 168 TEST_F(ExtensionAlarmsTest, CreateRepeating) { |
168 test_clock_->SetNow(base::Time::FromDoubleT(10)); | 169 test_clock_->SetNow(base::Time::FromDoubleT(10)); |
169 | 170 |
170 // Create 1 repeating alarm. | 171 // Create 1 repeating alarm. |
171 CreateAlarm("[null, {\"periodInMinutes\": 0.001}]"); | 172 CreateAlarm("[null, {\"periodInMinutes\": 0.001}]"); |
172 | 173 |
173 alarm_manager_->GetAlarm(extension()->id(), std::string(), base::Bind( | 174 alarm_manager_->GetAlarm( |
174 ExtensionAlarmsTestCreateRepeatingGetAlarmCallback, this)); | 175 extension()->id(), std::string(), |
| 176 base::Bind(ExtensionAlarmsTestCreateRepeatingGetAlarmCallback, this)); |
175 } | 177 } |
176 | 178 |
177 void ExtensionAlarmsTestCreateAbsoluteGetAlarm2Callback( | 179 void ExtensionAlarmsTestCreateAbsoluteGetAlarm2Callback( |
178 ExtensionAlarmsTest* test, Alarm* alarm) { | 180 ExtensionAlarmsTest* test, |
| 181 Alarm* alarm) { |
179 ASSERT_FALSE(alarm); | 182 ASSERT_FALSE(alarm); |
180 | 183 |
181 ASSERT_EQ(1u, test->alarm_delegate_->alarms_seen.size()); | 184 ASSERT_EQ(1u, test->alarm_delegate_->alarms_seen.size()); |
182 EXPECT_EQ("", test->alarm_delegate_->alarms_seen[0]); | 185 EXPECT_EQ("", test->alarm_delegate_->alarms_seen[0]); |
183 } | 186 } |
184 | 187 |
185 void ExtensionAlarmsTestCreateAbsoluteGetAlarm1Callback( | 188 void ExtensionAlarmsTestCreateAbsoluteGetAlarm1Callback( |
186 ExtensionAlarmsTest* test, Alarm* alarm) { | 189 ExtensionAlarmsTest* test, |
| 190 Alarm* alarm) { |
187 ASSERT_TRUE(alarm); | 191 ASSERT_TRUE(alarm); |
188 EXPECT_EQ("", alarm->js_alarm->name); | 192 EXPECT_EQ("", alarm->js_alarm->name); |
189 EXPECT_DOUBLE_EQ(10001, alarm->js_alarm->scheduled_time); | 193 EXPECT_DOUBLE_EQ(10001, alarm->js_alarm->scheduled_time); |
190 EXPECT_THAT(alarm->js_alarm->period_in_minutes, | 194 EXPECT_THAT(alarm->js_alarm->period_in_minutes, testing::IsNull()); |
191 testing::IsNull()); | |
192 | 195 |
193 test->test_clock_->SetNow(base::Time::FromDoubleT(10.1)); | 196 test->test_clock_->SetNow(base::Time::FromDoubleT(10.1)); |
194 // Now wait for the alarm to fire. Our test delegate will quit the | 197 // Now wait for the alarm to fire. Our test delegate will quit the |
195 // MessageLoop when that happens. | 198 // MessageLoop when that happens. |
196 base::MessageLoop::current()->Run(); | 199 base::MessageLoop::current()->Run(); |
197 | 200 |
198 test->alarm_manager_->GetAlarm( | 201 test->alarm_manager_->GetAlarm( |
199 test->extension()->id(), std::string(), base::Bind( | 202 test->extension()->id(), std::string(), |
200 ExtensionAlarmsTestCreateAbsoluteGetAlarm2Callback, test)); | 203 base::Bind(ExtensionAlarmsTestCreateAbsoluteGetAlarm2Callback, test)); |
201 } | 204 } |
202 | 205 |
203 TEST_F(ExtensionAlarmsTest, CreateAbsolute) { | 206 TEST_F(ExtensionAlarmsTest, CreateAbsolute) { |
204 test_clock_->SetNow(base::Time::FromDoubleT(9.99)); | 207 test_clock_->SetNow(base::Time::FromDoubleT(9.99)); |
205 CreateAlarm("[null, {\"when\": 10001}]"); | 208 CreateAlarm("[null, {\"when\": 10001}]"); |
206 | 209 |
207 alarm_manager_->GetAlarm(extension()->id(), std::string(), base::Bind( | 210 alarm_manager_->GetAlarm( |
208 ExtensionAlarmsTestCreateAbsoluteGetAlarm1Callback, this)); | 211 extension()->id(), std::string(), |
| 212 base::Bind(ExtensionAlarmsTestCreateAbsoluteGetAlarm1Callback, this)); |
209 } | 213 } |
210 | 214 |
211 void ExtensionAlarmsTestCreateRepeatingWithQuickFirstCallGetAlarm3Callback( | 215 void ExtensionAlarmsTestCreateRepeatingWithQuickFirstCallGetAlarm3Callback( |
212 ExtensionAlarmsTest* test, Alarm* alarm) { | 216 ExtensionAlarmsTest* test, |
| 217 Alarm* alarm) { |
213 ASSERT_TRUE(alarm); | 218 ASSERT_TRUE(alarm); |
214 EXPECT_THAT(test->alarm_delegate_->alarms_seen, testing::ElementsAre("", "")); | 219 EXPECT_THAT(test->alarm_delegate_->alarms_seen, testing::ElementsAre("", "")); |
215 } | 220 } |
216 | 221 |
217 void ExtensionAlarmsTestCreateRepeatingWithQuickFirstCallGetAlarm2Callback( | 222 void ExtensionAlarmsTestCreateRepeatingWithQuickFirstCallGetAlarm2Callback( |
218 ExtensionAlarmsTest* test, Alarm* alarm) { | 223 ExtensionAlarmsTest* test, |
| 224 Alarm* alarm) { |
219 ASSERT_TRUE(alarm); | 225 ASSERT_TRUE(alarm); |
220 EXPECT_THAT(test->alarm_delegate_->alarms_seen, testing::ElementsAre("")); | 226 EXPECT_THAT(test->alarm_delegate_->alarms_seen, testing::ElementsAre("")); |
221 | 227 |
222 test->test_clock_->SetNow(base::Time::FromDoubleT(10.7)); | 228 test->test_clock_->SetNow(base::Time::FromDoubleT(10.7)); |
223 base::MessageLoop::current()->Run(); | 229 base::MessageLoop::current()->Run(); |
224 | 230 |
225 test->alarm_manager_->GetAlarm( | 231 test->alarm_manager_->GetAlarm( |
226 test->extension()->id(), std::string(), base::Bind( | 232 test->extension()->id(), std::string(), |
| 233 base::Bind( |
227 ExtensionAlarmsTestCreateRepeatingWithQuickFirstCallGetAlarm3Callback, | 234 ExtensionAlarmsTestCreateRepeatingWithQuickFirstCallGetAlarm3Callback, |
228 test)); | 235 test)); |
229 } | 236 } |
230 | 237 |
231 void ExtensionAlarmsTestCreateRepeatingWithQuickFirstCallGetAlarm1Callback( | 238 void ExtensionAlarmsTestCreateRepeatingWithQuickFirstCallGetAlarm1Callback( |
232 ExtensionAlarmsTest* test, Alarm* alarm) { | 239 ExtensionAlarmsTest* test, |
| 240 Alarm* alarm) { |
233 ASSERT_TRUE(alarm); | 241 ASSERT_TRUE(alarm); |
234 EXPECT_EQ("", alarm->js_alarm->name); | 242 EXPECT_EQ("", alarm->js_alarm->name); |
235 EXPECT_DOUBLE_EQ(10001, alarm->js_alarm->scheduled_time); | 243 EXPECT_DOUBLE_EQ(10001, alarm->js_alarm->scheduled_time); |
236 EXPECT_THAT(alarm->js_alarm->period_in_minutes, | 244 EXPECT_THAT(alarm->js_alarm->period_in_minutes, |
237 testing::Pointee(testing::DoubleEq(0.001))); | 245 testing::Pointee(testing::DoubleEq(0.001))); |
238 | 246 |
239 test->test_clock_->SetNow(base::Time::FromDoubleT(10.1)); | 247 test->test_clock_->SetNow(base::Time::FromDoubleT(10.1)); |
240 // Now wait for the alarm to fire. Our test delegate will quit the | 248 // Now wait for the alarm to fire. Our test delegate will quit the |
241 // MessageLoop when that happens. | 249 // MessageLoop when that happens. |
242 base::MessageLoop::current()->Run(); | 250 base::MessageLoop::current()->Run(); |
243 | 251 |
244 test->alarm_manager_->GetAlarm( | 252 test->alarm_manager_->GetAlarm( |
245 test->extension()->id(), std::string(), base::Bind( | 253 test->extension()->id(), std::string(), |
| 254 base::Bind( |
246 ExtensionAlarmsTestCreateRepeatingWithQuickFirstCallGetAlarm2Callback, | 255 ExtensionAlarmsTestCreateRepeatingWithQuickFirstCallGetAlarm2Callback, |
247 test)); | 256 test)); |
248 } | 257 } |
249 | 258 |
250 TEST_F(ExtensionAlarmsTest, CreateRepeatingWithQuickFirstCall) { | 259 TEST_F(ExtensionAlarmsTest, CreateRepeatingWithQuickFirstCall) { |
251 test_clock_->SetNow(base::Time::FromDoubleT(9.99)); | 260 test_clock_->SetNow(base::Time::FromDoubleT(9.99)); |
252 CreateAlarm("[null, {\"when\": 10001, \"periodInMinutes\": 0.001}]"); | 261 CreateAlarm("[null, {\"when\": 10001, \"periodInMinutes\": 0.001}]"); |
253 | 262 |
254 alarm_manager_->GetAlarm(extension()->id(), std::string(), base::Bind( | 263 alarm_manager_->GetAlarm( |
255 ExtensionAlarmsTestCreateRepeatingWithQuickFirstCallGetAlarm1Callback, | 264 extension()->id(), std::string(), |
256 this)); | 265 base::Bind( |
| 266 ExtensionAlarmsTestCreateRepeatingWithQuickFirstCallGetAlarm1Callback, |
| 267 this)); |
257 } | 268 } |
258 | 269 |
259 void ExtensionAlarmsTestCreateDupeGetAllAlarmsCallback( | 270 void ExtensionAlarmsTestCreateDupeGetAllAlarmsCallback( |
260 const AlarmManager::AlarmList* alarms) { | 271 const AlarmManager::AlarmList* alarms) { |
261 ASSERT_TRUE(alarms); | 272 ASSERT_TRUE(alarms); |
262 EXPECT_EQ(1u, alarms->size()); | 273 EXPECT_EQ(1u, alarms->size()); |
263 EXPECT_DOUBLE_EQ(430000, (*alarms)[0].js_alarm->scheduled_time); | 274 EXPECT_DOUBLE_EQ(430000, (*alarms)[0].js_alarm->scheduled_time); |
264 } | 275 } |
265 | 276 |
266 TEST_F(ExtensionAlarmsTest, CreateDupe) { | 277 TEST_F(ExtensionAlarmsTest, CreateDupe) { |
267 test_clock_->SetNow(base::Time::FromDoubleT(10)); | 278 test_clock_->SetNow(base::Time::FromDoubleT(10)); |
268 | 279 |
269 // Create 2 duplicate alarms. The first should be overridden. | 280 // Create 2 duplicate alarms. The first should be overridden. |
270 CreateAlarm("[\"dup\", {\"delayInMinutes\": 1}]"); | 281 CreateAlarm("[\"dup\", {\"delayInMinutes\": 1}]"); |
271 CreateAlarm("[\"dup\", {\"delayInMinutes\": 7}]"); | 282 CreateAlarm("[\"dup\", {\"delayInMinutes\": 7}]"); |
272 | 283 |
273 alarm_manager_->GetAllAlarms(extension()->id(), base::Bind( | 284 alarm_manager_->GetAllAlarms( |
274 ExtensionAlarmsTestCreateDupeGetAllAlarmsCallback)); | 285 extension()->id(), |
| 286 base::Bind(ExtensionAlarmsTestCreateDupeGetAllAlarmsCallback)); |
275 } | 287 } |
276 | 288 |
277 TEST_F(ExtensionAlarmsTest, CreateDelayBelowMinimum) { | 289 TEST_F(ExtensionAlarmsTest, CreateDelayBelowMinimum) { |
278 // Create an alarm with delay below the minimum accepted value. | 290 // Create an alarm with delay below the minimum accepted value. |
279 CreateAlarm("[\"negative\", {\"delayInMinutes\": -0.2}]"); | 291 CreateAlarm("[\"negative\", {\"delayInMinutes\": -0.2}]"); |
280 IPC::TestSink& sink = static_cast<content::MockRenderProcessHost*>( | 292 IPC::TestSink& sink = |
281 contents()->GetRenderViewHost()->GetProcess())->sink(); | 293 static_cast<content::MockRenderProcessHost*>( |
282 const IPC::Message* warning = sink.GetUniqueMessageMatching( | 294 contents()->GetRenderViewHost()->GetProcess())->sink(); |
283 ExtensionMsg_AddMessageToConsole::ID); | 295 const IPC::Message* warning = |
| 296 sink.GetUniqueMessageMatching(ExtensionMsg_AddMessageToConsole::ID); |
284 ASSERT_TRUE(warning); | 297 ASSERT_TRUE(warning); |
285 ExtensionMsg_AddMessageToConsole::Param params; | 298 ExtensionMsg_AddMessageToConsole::Param params; |
286 ExtensionMsg_AddMessageToConsole::Read(warning, ¶ms); | 299 ExtensionMsg_AddMessageToConsole::Read(warning, ¶ms); |
287 content::ConsoleMessageLevel level = get<0>(params); | 300 content::ConsoleMessageLevel level = get<0>(params); |
288 std::string message = get<1>(params); | 301 std::string message = get<1>(params); |
289 EXPECT_EQ(content::CONSOLE_MESSAGE_LEVEL_WARNING, level); | 302 EXPECT_EQ(content::CONSOLE_MESSAGE_LEVEL_WARNING, level); |
290 EXPECT_THAT(message, testing::HasSubstr("delay is less than minimum of 1")); | 303 EXPECT_THAT(message, testing::HasSubstr("delay is less than minimum of 1")); |
291 } | 304 } |
292 | 305 |
293 TEST_F(ExtensionAlarmsTest, Get) { | 306 TEST_F(ExtensionAlarmsTest, Get) { |
294 test_clock_->SetNow(base::Time::FromDoubleT(4)); | 307 test_clock_->SetNow(base::Time::FromDoubleT(4)); |
295 | 308 |
296 // Create 2 alarms, and make sure we can query them. | 309 // Create 2 alarms, and make sure we can query them. |
297 CreateAlarms(2); | 310 CreateAlarms(2); |
298 | 311 |
299 // Get the default one. | 312 // Get the default one. |
300 { | 313 { |
301 JsAlarm alarm; | 314 JsAlarm alarm; |
302 scoped_ptr<base::DictionaryValue> result(RunFunctionAndReturnDictionary( | 315 scoped_ptr<base::DictionaryValue> result( |
303 new AlarmsGetFunction(), "[null]")); | 316 RunFunctionAndReturnDictionary(new AlarmsGetFunction(), "[null]")); |
304 ASSERT_TRUE(result.get()); | 317 ASSERT_TRUE(result.get()); |
305 EXPECT_TRUE(JsAlarm::Populate(*result, &alarm)); | 318 EXPECT_TRUE(JsAlarm::Populate(*result, &alarm)); |
306 EXPECT_EQ("", alarm.name); | 319 EXPECT_EQ("", alarm.name); |
307 EXPECT_DOUBLE_EQ(4060, alarm.scheduled_time); | 320 EXPECT_DOUBLE_EQ(4060, alarm.scheduled_time); |
308 EXPECT_THAT(alarm.period_in_minutes, | 321 EXPECT_THAT(alarm.period_in_minutes, |
309 testing::Pointee(testing::DoubleEq(0.001))); | 322 testing::Pointee(testing::DoubleEq(0.001))); |
310 } | 323 } |
311 | 324 |
312 // Get "7". | 325 // Get "7". |
313 { | 326 { |
314 JsAlarm alarm; | 327 JsAlarm alarm; |
315 scoped_ptr<base::DictionaryValue> result(RunFunctionAndReturnDictionary( | 328 scoped_ptr<base::DictionaryValue> result( |
316 new AlarmsGetFunction(), "[\"7\"]")); | 329 RunFunctionAndReturnDictionary(new AlarmsGetFunction(), "[\"7\"]")); |
317 ASSERT_TRUE(result.get()); | 330 ASSERT_TRUE(result.get()); |
318 EXPECT_TRUE(JsAlarm::Populate(*result, &alarm)); | 331 EXPECT_TRUE(JsAlarm::Populate(*result, &alarm)); |
319 EXPECT_EQ("7", alarm.name); | 332 EXPECT_EQ("7", alarm.name); |
320 EXPECT_EQ(424000, alarm.scheduled_time); | 333 EXPECT_EQ(424000, alarm.scheduled_time); |
321 EXPECT_THAT(alarm.period_in_minutes, testing::Pointee(7)); | 334 EXPECT_THAT(alarm.period_in_minutes, testing::Pointee(7)); |
322 } | 335 } |
323 | 336 |
324 // Get a non-existent one. | 337 // Get a non-existent one. |
325 { | 338 { |
326 scoped_ptr<base::DictionaryValue> result(RunFunctionAndReturnDictionary( | 339 scoped_ptr<base::DictionaryValue> result(RunFunctionAndReturnDictionary( |
327 new AlarmsGetFunction(), "[\"nobody\"]")); | 340 new AlarmsGetFunction(), "[\"nobody\"]")); |
328 ASSERT_FALSE(result.get()); | 341 ASSERT_FALSE(result.get()); |
329 } | 342 } |
330 } | 343 } |
331 | 344 |
332 TEST_F(ExtensionAlarmsTest, GetAll) { | 345 TEST_F(ExtensionAlarmsTest, GetAll) { |
333 // Test getAll with 0 alarms. | 346 // Test getAll with 0 alarms. |
334 { | 347 { |
335 scoped_ptr<base::ListValue> result(RunFunctionAndReturnList( | 348 scoped_ptr<base::ListValue> result( |
336 new AlarmsGetAllFunction(), "[]")); | 349 RunFunctionAndReturnList(new AlarmsGetAllFunction(), "[]")); |
337 std::vector<linked_ptr<JsAlarm> > alarms = ToAlarmList(result.get()); | 350 std::vector<linked_ptr<JsAlarm>> alarms = ToAlarmList(result.get()); |
338 EXPECT_EQ(0u, alarms.size()); | 351 EXPECT_EQ(0u, alarms.size()); |
339 } | 352 } |
340 | 353 |
341 // Create 2 alarms, and make sure we can query them. | 354 // Create 2 alarms, and make sure we can query them. |
342 CreateAlarms(2); | 355 CreateAlarms(2); |
343 | 356 |
344 { | 357 { |
345 scoped_ptr<base::ListValue> result(RunFunctionAndReturnList( | 358 scoped_ptr<base::ListValue> result( |
346 new AlarmsGetAllFunction(), "[null]")); | 359 RunFunctionAndReturnList(new AlarmsGetAllFunction(), "[null]")); |
347 std::vector<linked_ptr<JsAlarm> > alarms = ToAlarmList(result.get()); | 360 std::vector<linked_ptr<JsAlarm>> alarms = ToAlarmList(result.get()); |
348 EXPECT_EQ(2u, alarms.size()); | 361 EXPECT_EQ(2u, alarms.size()); |
349 | 362 |
350 // Test the "7" alarm. | 363 // Test the "7" alarm. |
351 JsAlarm* alarm = alarms[0].get(); | 364 JsAlarm* alarm = alarms[0].get(); |
352 if (alarm->name != "7") | 365 if (alarm->name != "7") |
353 alarm = alarms[1].get(); | 366 alarm = alarms[1].get(); |
354 EXPECT_EQ("7", alarm->name); | 367 EXPECT_EQ("7", alarm->name); |
355 EXPECT_THAT(alarm->period_in_minutes, testing::Pointee(7)); | 368 EXPECT_THAT(alarm->period_in_minutes, testing::Pointee(7)); |
356 } | 369 } |
357 } | 370 } |
358 | 371 |
359 void ExtensionAlarmsTestClearGetAllAlarms2Callback( | 372 void ExtensionAlarmsTestClearGetAllAlarms2Callback( |
360 const AlarmManager::AlarmList* alarms) { | 373 const AlarmManager::AlarmList* alarms) { |
361 // Ensure the 0.001-minute alarm is still there, since it's repeating. | 374 // Ensure the 0.001-minute alarm is still there, since it's repeating. |
362 ASSERT_TRUE(alarms); | 375 ASSERT_TRUE(alarms); |
363 EXPECT_EQ(1u, alarms->size()); | 376 EXPECT_EQ(1u, alarms->size()); |
364 EXPECT_THAT((*alarms)[0].js_alarm->period_in_minutes, | 377 EXPECT_THAT((*alarms)[0].js_alarm->period_in_minutes, |
365 testing::Pointee(0.001)); | 378 testing::Pointee(0.001)); |
366 } | 379 } |
367 | 380 |
368 void ExtensionAlarmsTestClearGetAllAlarms1Callback( | 381 void ExtensionAlarmsTestClearGetAllAlarms1Callback( |
369 ExtensionAlarmsTest* test, const AlarmManager::AlarmList* alarms) { | 382 ExtensionAlarmsTest* test, |
| 383 const AlarmManager::AlarmList* alarms) { |
370 ASSERT_TRUE(alarms); | 384 ASSERT_TRUE(alarms); |
371 EXPECT_EQ(1u, alarms->size()); | 385 EXPECT_EQ(1u, alarms->size()); |
372 EXPECT_THAT((*alarms)[0].js_alarm->period_in_minutes, | 386 EXPECT_THAT((*alarms)[0].js_alarm->period_in_minutes, |
373 testing::Pointee(0.001)); | 387 testing::Pointee(0.001)); |
374 | 388 |
375 // Now wait for the alarms to fire, and ensure the cancelled alarms don't | 389 // Now wait for the alarms to fire, and ensure the cancelled alarms don't |
376 // fire. | 390 // fire. |
377 test->test_clock_->Advance(base::TimeDelta::FromMilliseconds(60)); | 391 test->test_clock_->Advance(base::TimeDelta::FromMilliseconds(60)); |
378 RunScheduleNextPoll(test->alarm_manager_); | 392 RunScheduleNextPoll(test->alarm_manager_); |
379 base::MessageLoop::current()->Run(); | 393 base::MessageLoop::current()->Run(); |
380 | 394 |
381 ASSERT_EQ(1u, test->alarm_delegate_->alarms_seen.size()); | 395 ASSERT_EQ(1u, test->alarm_delegate_->alarms_seen.size()); |
382 EXPECT_EQ("", test->alarm_delegate_->alarms_seen[0]); | 396 EXPECT_EQ("", test->alarm_delegate_->alarms_seen[0]); |
383 | 397 |
384 // Ensure the 0.001-minute alarm is still there, since it's repeating. | 398 // Ensure the 0.001-minute alarm is still there, since it's repeating. |
385 test->alarm_manager_->GetAllAlarms(test->extension()->id(), base::Bind( | 399 test->alarm_manager_->GetAllAlarms( |
386 ExtensionAlarmsTestClearGetAllAlarms2Callback)); | 400 test->extension()->id(), |
| 401 base::Bind(ExtensionAlarmsTestClearGetAllAlarms2Callback)); |
387 } | 402 } |
388 | 403 |
389 TEST_F(ExtensionAlarmsTest, Clear) { | 404 TEST_F(ExtensionAlarmsTest, Clear) { |
390 // Clear a non-existent one. | 405 // Clear a non-existent one. |
391 { | 406 { |
392 scoped_ptr<base::Value> result( | 407 scoped_ptr<base::Value> result( |
393 RunFunctionAndReturnValue(new AlarmsClearFunction(), "[\"nobody\"]")); | 408 RunFunctionAndReturnValue(new AlarmsClearFunction(), "[\"nobody\"]")); |
394 bool copy_bool_result = false; | 409 bool copy_bool_result = false; |
395 ASSERT_TRUE(result->GetAsBoolean(©_bool_result)); | 410 ASSERT_TRUE(result->GetAsBoolean(©_bool_result)); |
396 EXPECT_FALSE(copy_bool_result); | 411 EXPECT_FALSE(copy_bool_result); |
(...skipping 11 matching lines...) Expand all Loading... |
408 EXPECT_TRUE(copy_bool_result); | 423 EXPECT_TRUE(copy_bool_result); |
409 } | 424 } |
410 { | 425 { |
411 scoped_ptr<base::Value> result( | 426 scoped_ptr<base::Value> result( |
412 RunFunctionAndReturnValue(new AlarmsClearFunction(), "[\"0\"]")); | 427 RunFunctionAndReturnValue(new AlarmsClearFunction(), "[\"0\"]")); |
413 bool copy_bool_result = false; | 428 bool copy_bool_result = false; |
414 ASSERT_TRUE(result->GetAsBoolean(©_bool_result)); | 429 ASSERT_TRUE(result->GetAsBoolean(©_bool_result)); |
415 EXPECT_TRUE(copy_bool_result); | 430 EXPECT_TRUE(copy_bool_result); |
416 } | 431 } |
417 | 432 |
418 alarm_manager_->GetAllAlarms(extension()->id(), base::Bind( | 433 alarm_manager_->GetAllAlarms( |
419 ExtensionAlarmsTestClearGetAllAlarms1Callback, this)); | 434 extension()->id(), |
| 435 base::Bind(ExtensionAlarmsTestClearGetAllAlarms1Callback, this)); |
420 } | 436 } |
421 | 437 |
422 void ExtensionAlarmsTestClearAllGetAllAlarms2Callback( | 438 void ExtensionAlarmsTestClearAllGetAllAlarms2Callback( |
423 const AlarmManager::AlarmList* alarms) { | 439 const AlarmManager::AlarmList* alarms) { |
424 ASSERT_FALSE(alarms); | 440 ASSERT_FALSE(alarms); |
425 } | 441 } |
426 | 442 |
427 void ExtensionAlarmsTestClearAllGetAllAlarms1Callback( | 443 void ExtensionAlarmsTestClearAllGetAllAlarms1Callback( |
428 ExtensionAlarmsTest* test, const AlarmManager::AlarmList* alarms) { | 444 ExtensionAlarmsTest* test, |
| 445 const AlarmManager::AlarmList* alarms) { |
429 ASSERT_TRUE(alarms); | 446 ASSERT_TRUE(alarms); |
430 EXPECT_EQ(3u, alarms->size()); | 447 EXPECT_EQ(3u, alarms->size()); |
431 | 448 |
432 // Clear them. | 449 // Clear them. |
433 test->RunFunction(new AlarmsClearAllFunction(), "[]"); | 450 test->RunFunction(new AlarmsClearAllFunction(), "[]"); |
434 test->alarm_manager_->GetAllAlarms( | 451 test->alarm_manager_->GetAllAlarms( |
435 test->extension()->id(), base::Bind( | 452 test->extension()->id(), |
436 ExtensionAlarmsTestClearAllGetAllAlarms2Callback)); | 453 base::Bind(ExtensionAlarmsTestClearAllGetAllAlarms2Callback)); |
437 } | 454 } |
438 | 455 |
439 TEST_F(ExtensionAlarmsTest, ClearAll) { | 456 TEST_F(ExtensionAlarmsTest, ClearAll) { |
440 // ClearAll with no alarms set. | 457 // ClearAll with no alarms set. |
441 { | 458 { |
442 scoped_ptr<base::Value> result(RunFunctionAndReturnValue( | 459 scoped_ptr<base::Value> result( |
443 new AlarmsClearAllFunction(), "[]")); | 460 RunFunctionAndReturnValue(new AlarmsClearAllFunction(), "[]")); |
444 bool copy_bool_result = false; | 461 bool copy_bool_result = false; |
445 ASSERT_TRUE(result->GetAsBoolean(©_bool_result)); | 462 ASSERT_TRUE(result->GetAsBoolean(©_bool_result)); |
446 EXPECT_TRUE(copy_bool_result); | 463 EXPECT_TRUE(copy_bool_result); |
447 } | 464 } |
448 | 465 |
449 // Create 3 alarms. | 466 // Create 3 alarms. |
450 CreateAlarms(3); | 467 CreateAlarms(3); |
451 alarm_manager_->GetAllAlarms(extension()->id(), base::Bind( | 468 alarm_manager_->GetAllAlarms( |
452 ExtensionAlarmsTestClearAllGetAllAlarms1Callback, this)); | 469 extension()->id(), |
| 470 base::Bind(ExtensionAlarmsTestClearAllGetAllAlarms1Callback, this)); |
453 } | 471 } |
454 | 472 |
455 class ExtensionAlarmsSchedulingTest : public ExtensionAlarmsTest { | 473 class ExtensionAlarmsSchedulingTest : public ExtensionAlarmsTest { |
456 void GetAlarmCallback(Alarm* alarm) { | 474 void GetAlarmCallback(Alarm* alarm) { |
457 CHECK(alarm); | 475 CHECK(alarm); |
458 const base::Time scheduled_time = | 476 const base::Time scheduled_time = |
459 base::Time::FromJsTime(alarm->js_alarm->scheduled_time); | 477 base::Time::FromJsTime(alarm->js_alarm->scheduled_time); |
460 EXPECT_EQ(scheduled_time, alarm_manager_->next_poll_time_); | 478 EXPECT_EQ(scheduled_time, alarm_manager_->next_poll_time_); |
461 } | 479 } |
462 | 480 |
463 static void RemoveAlarmCallback(bool success) { EXPECT_TRUE(success); } | 481 static void RemoveAlarmCallback(bool success) { EXPECT_TRUE(success); } |
464 static void RemoveAllAlarmsCallback() {} | 482 static void RemoveAllAlarmsCallback() {} |
465 | 483 |
466 public: | 484 public: |
467 // Get the time that the alarm named is scheduled to run. | 485 // Get the time that the alarm named is scheduled to run. |
468 void VerifyScheduledTime(const std::string& alarm_name) { | 486 void VerifyScheduledTime(const std::string& alarm_name) { |
469 alarm_manager_->GetAlarm(extension()->id(), alarm_name, base::Bind( | 487 alarm_manager_->GetAlarm( |
470 &ExtensionAlarmsSchedulingTest::GetAlarmCallback, | 488 extension()->id(), alarm_name, |
471 base::Unretained(this))); | 489 base::Bind(&ExtensionAlarmsSchedulingTest::GetAlarmCallback, |
| 490 base::Unretained(this))); |
472 } | 491 } |
473 | 492 |
474 void RemoveAlarm(const std::string& name) { | 493 void RemoveAlarm(const std::string& name) { |
475 alarm_manager_->RemoveAlarm( | 494 alarm_manager_->RemoveAlarm( |
476 extension()->id(), | 495 extension()->id(), name, |
477 name, | |
478 base::Bind(&ExtensionAlarmsSchedulingTest::RemoveAlarmCallback)); | 496 base::Bind(&ExtensionAlarmsSchedulingTest::RemoveAlarmCallback)); |
479 } | 497 } |
480 | 498 |
481 void RemoveAllAlarms() { | 499 void RemoveAllAlarms() { |
482 alarm_manager_->RemoveAllAlarms(extension()->id(), base::Bind( | 500 alarm_manager_->RemoveAllAlarms( |
483 &ExtensionAlarmsSchedulingTest::RemoveAllAlarmsCallback)); | 501 extension()->id(), |
| 502 base::Bind(&ExtensionAlarmsSchedulingTest::RemoveAllAlarmsCallback)); |
484 } | 503 } |
485 }; | 504 }; |
486 | 505 |
487 TEST_F(ExtensionAlarmsSchedulingTest, PollScheduling) { | 506 TEST_F(ExtensionAlarmsSchedulingTest, PollScheduling) { |
488 { | 507 { |
489 CreateAlarm("[\"a\", {\"periodInMinutes\": 6}]"); | 508 CreateAlarm("[\"a\", {\"periodInMinutes\": 6}]"); |
490 CreateAlarm("[\"bb\", {\"periodInMinutes\": 8}]"); | 509 CreateAlarm("[\"bb\", {\"periodInMinutes\": 8}]"); |
491 VerifyScheduledTime("a"); | 510 VerifyScheduledTime("a"); |
492 RemoveAllAlarms(); | 511 RemoveAllAlarms(); |
493 } | 512 } |
(...skipping 15 matching lines...) Expand all Loading... |
509 RemoveAllAlarms(); | 528 RemoveAllAlarms(); |
510 } | 529 } |
511 { | 530 { |
512 test_clock_->SetNow(base::Time::FromDoubleT(3 * 60 + 1)); | 531 test_clock_->SetNow(base::Time::FromDoubleT(3 * 60 + 1)); |
513 Alarm alarm; | 532 Alarm alarm; |
514 alarm.js_alarm->name = "bb"; | 533 alarm.js_alarm->name = "bb"; |
515 alarm.js_alarm->scheduled_time = 3 * 60000; | 534 alarm.js_alarm->scheduled_time = 3 * 60000; |
516 alarm.js_alarm->period_in_minutes.reset(new double(3)); | 535 alarm.js_alarm->period_in_minutes.reset(new double(3)); |
517 alarm_manager_->AddAlarmImpl(extension()->id(), alarm); | 536 alarm_manager_->AddAlarmImpl(extension()->id(), alarm); |
518 base::MessageLoop::current()->Run(); | 537 base::MessageLoop::current()->Run(); |
519 EXPECT_EQ(base::Time::FromJsTime(3 * 60000) + | 538 EXPECT_EQ( |
520 base::TimeDelta::FromMinutes(3), | 539 base::Time::FromJsTime(3 * 60000) + base::TimeDelta::FromMinutes(3), |
521 alarm_manager_->next_poll_time_); | 540 alarm_manager_->next_poll_time_); |
522 RemoveAllAlarms(); | 541 RemoveAllAlarms(); |
523 } | 542 } |
524 { | 543 { |
525 test_clock_->SetNow(base::Time::FromDoubleT(4 * 60 + 1)); | 544 test_clock_->SetNow(base::Time::FromDoubleT(4 * 60 + 1)); |
526 CreateAlarm("[\"a\", {\"periodInMinutes\": 2}]"); | 545 CreateAlarm("[\"a\", {\"periodInMinutes\": 2}]"); |
527 RemoveAlarm("a"); | 546 RemoveAlarm("a"); |
528 Alarm alarm2; | 547 Alarm alarm2; |
529 alarm2.js_alarm->name = "bb"; | 548 alarm2.js_alarm->name = "bb"; |
530 alarm2.js_alarm->scheduled_time = 4 * 60000; | 549 alarm2.js_alarm->scheduled_time = 4 * 60000; |
531 alarm2.js_alarm->period_in_minutes.reset(new double(4)); | 550 alarm2.js_alarm->period_in_minutes.reset(new double(4)); |
532 alarm_manager_->AddAlarmImpl(extension()->id(), alarm2); | 551 alarm_manager_->AddAlarmImpl(extension()->id(), alarm2); |
533 Alarm alarm3; | 552 Alarm alarm3; |
534 alarm3.js_alarm->name = "ccc"; | 553 alarm3.js_alarm->name = "ccc"; |
535 alarm3.js_alarm->scheduled_time = 25 * 60000; | 554 alarm3.js_alarm->scheduled_time = 25 * 60000; |
536 alarm3.js_alarm->period_in_minutes.reset(new double(25)); | 555 alarm3.js_alarm->period_in_minutes.reset(new double(25)); |
537 alarm_manager_->AddAlarmImpl(extension()->id(), alarm3); | 556 alarm_manager_->AddAlarmImpl(extension()->id(), alarm3); |
538 base::MessageLoop::current()->Run(); | 557 base::MessageLoop::current()->Run(); |
539 EXPECT_EQ(base::Time::FromJsTime(4 * 60000) + | 558 EXPECT_EQ( |
540 base::TimeDelta::FromMinutes(4), | 559 base::Time::FromJsTime(4 * 60000) + base::TimeDelta::FromMinutes(4), |
541 alarm_manager_->next_poll_time_); | 560 alarm_manager_->next_poll_time_); |
542 RemoveAllAlarms(); | 561 RemoveAllAlarms(); |
543 } | 562 } |
544 } | 563 } |
545 | 564 |
546 TEST_F(ExtensionAlarmsSchedulingTest, ReleasedExtensionPollsInfrequently) { | 565 TEST_F(ExtensionAlarmsSchedulingTest, ReleasedExtensionPollsInfrequently) { |
547 set_extension(utils::CreateEmptyExtensionWithLocation( | 566 set_extension( |
548 extensions::Manifest::INTERNAL)); | 567 utils::CreateEmptyExtensionWithLocation(extensions::Manifest::INTERNAL)); |
549 test_clock_->SetNow(base::Time::FromJsTime(300000)); | 568 test_clock_->SetNow(base::Time::FromJsTime(300000)); |
550 CreateAlarm("[\"a\", {\"when\": 300010}]"); | 569 CreateAlarm("[\"a\", {\"when\": 300010}]"); |
551 CreateAlarm("[\"b\", {\"when\": 340000}]"); | 570 CreateAlarm("[\"b\", {\"when\": 340000}]"); |
552 | 571 |
553 // On startup (when there's no "last poll"), we let alarms fire as | 572 // On startup (when there's no "last poll"), we let alarms fire as |
554 // soon as they're scheduled. | 573 // soon as they're scheduled. |
555 EXPECT_DOUBLE_EQ(300010, alarm_manager_->next_poll_time_.ToJsTime()); | 574 EXPECT_DOUBLE_EQ(300010, alarm_manager_->next_poll_time_.ToJsTime()); |
556 | 575 |
557 alarm_manager_->last_poll_time_ = base::Time::FromJsTime(290000); | 576 alarm_manager_->last_poll_time_ = base::Time::FromJsTime(290000); |
558 // In released extensions, we set the granularity to at least 1 | 577 // In released extensions, we set the granularity to at least 1 |
559 // minute, which makes AddAlarm schedule the next poll after the | 578 // minute, which makes AddAlarm schedule the next poll after the |
560 // extension requested. | 579 // extension requested. |
561 alarm_manager_->ScheduleNextPoll(); | 580 alarm_manager_->ScheduleNextPoll(); |
562 EXPECT_DOUBLE_EQ((alarm_manager_->last_poll_time_ + | 581 EXPECT_DOUBLE_EQ((alarm_manager_->last_poll_time_ + |
563 base::TimeDelta::FromMinutes(1)).ToJsTime(), | 582 base::TimeDelta::FromMinutes(1)).ToJsTime(), |
564 alarm_manager_->next_poll_time_.ToJsTime()); | 583 alarm_manager_->next_poll_time_.ToJsTime()); |
565 } | 584 } |
566 | 585 |
567 TEST_F(ExtensionAlarmsSchedulingTest, TimerRunning) { | 586 TEST_F(ExtensionAlarmsSchedulingTest, TimerRunning) { |
568 EXPECT_FALSE(alarm_manager_->timer_.IsRunning()); | 587 EXPECT_FALSE(alarm_manager_->timer_.IsRunning()); |
569 CreateAlarm("[\"a\", {\"delayInMinutes\": 0.001}]"); | 588 CreateAlarm("[\"a\", {\"delayInMinutes\": 0.001}]"); |
570 EXPECT_TRUE(alarm_manager_->timer_.IsRunning()); | 589 EXPECT_TRUE(alarm_manager_->timer_.IsRunning()); |
571 test_clock_->Advance(base::TimeDelta::FromMilliseconds(60)); | 590 test_clock_->Advance(base::TimeDelta::FromMilliseconds(60)); |
572 base::MessageLoop::current()->Run(); | 591 base::MessageLoop::current()->Run(); |
573 EXPECT_FALSE(alarm_manager_->timer_.IsRunning()); | 592 EXPECT_FALSE(alarm_manager_->timer_.IsRunning()); |
574 CreateAlarm("[\"bb\", {\"delayInMinutes\": 10}]"); | 593 CreateAlarm("[\"bb\", {\"delayInMinutes\": 10}]"); |
575 EXPECT_TRUE(alarm_manager_->timer_.IsRunning()); | 594 EXPECT_TRUE(alarm_manager_->timer_.IsRunning()); |
576 RemoveAllAlarms(); | 595 RemoveAllAlarms(); |
577 EXPECT_FALSE(alarm_manager_->timer_.IsRunning()); | 596 EXPECT_FALSE(alarm_manager_->timer_.IsRunning()); |
578 } | 597 } |
579 | 598 |
580 TEST_F(ExtensionAlarmsSchedulingTest, MinimumGranularity) { | 599 TEST_F(ExtensionAlarmsSchedulingTest, MinimumGranularity) { |
581 set_extension(utils::CreateEmptyExtensionWithLocation( | 600 set_extension( |
582 extensions::Manifest::INTERNAL)); | 601 utils::CreateEmptyExtensionWithLocation(extensions::Manifest::INTERNAL)); |
583 test_clock_->SetNow(base::Time::FromJsTime(0)); | 602 test_clock_->SetNow(base::Time::FromJsTime(0)); |
584 CreateAlarm("[\"a\", {\"periodInMinutes\": 2}]"); | 603 CreateAlarm("[\"a\", {\"periodInMinutes\": 2}]"); |
585 test_clock_->Advance(base::TimeDelta::FromSeconds(1)); | 604 test_clock_->Advance(base::TimeDelta::FromSeconds(1)); |
586 CreateAlarm("[\"b\", {\"periodInMinutes\": 2}]"); | 605 CreateAlarm("[\"b\", {\"periodInMinutes\": 2}]"); |
587 test_clock_->Advance(base::TimeDelta::FromMinutes(2)); | 606 test_clock_->Advance(base::TimeDelta::FromMinutes(2)); |
588 | 607 |
589 alarm_manager_->last_poll_time_ = base::Time::FromJsTime(2 * 60000); | 608 alarm_manager_->last_poll_time_ = base::Time::FromJsTime(2 * 60000); |
590 // In released extensions, we set the granularity to at least 1 | 609 // In released extensions, we set the granularity to at least 1 |
591 // minute, which makes scheduler set it to 1 minute, rather than | 610 // minute, which makes scheduler set it to 1 minute, rather than |
592 // 1 second later (when b is supposed to go off). | 611 // 1 second later (when b is supposed to go off). |
593 alarm_manager_->ScheduleNextPoll(); | 612 alarm_manager_->ScheduleNextPoll(); |
594 EXPECT_DOUBLE_EQ((alarm_manager_->last_poll_time_ + | 613 EXPECT_DOUBLE_EQ((alarm_manager_->last_poll_time_ + |
595 base::TimeDelta::FromMinutes(1)).ToJsTime(), | 614 base::TimeDelta::FromMinutes(1)).ToJsTime(), |
596 alarm_manager_->next_poll_time_.ToJsTime()); | 615 alarm_manager_->next_poll_time_.ToJsTime()); |
597 } | 616 } |
598 | 617 |
599 TEST_F(ExtensionAlarmsSchedulingTest, DifferentMinimumGranularities) { | 618 TEST_F(ExtensionAlarmsSchedulingTest, DifferentMinimumGranularities) { |
600 test_clock_->SetNow(base::Time::FromJsTime(0)); | 619 test_clock_->SetNow(base::Time::FromJsTime(0)); |
601 // Create an alarm to go off in 12 seconds. This uses the default, unpacked | 620 // Create an alarm to go off in 12 seconds. This uses the default, unpacked |
602 // extension - so there is no minimum granularity. | 621 // extension - so there is no minimum granularity. |
603 CreateAlarm("[\"a\", {\"periodInMinutes\": 0.2}]"); // 12 seconds. | 622 CreateAlarm("[\"a\", {\"periodInMinutes\": 0.2}]"); // 12 seconds. |
604 | 623 |
605 // Create a new extension, which is packed, and has a granularity of 1 minute. | 624 // Create a new extension, which is packed, and has a granularity of 1 minute. |
606 // CreateAlarm() uses extension_, so keep a ref of the old one around, and | 625 // CreateAlarm() uses extension_, so keep a ref of the old one around, and |
607 // repopulate extension_. | 626 // repopulate extension_. |
608 scoped_refptr<Extension> extension2(extension_ref()); | 627 scoped_refptr<Extension> extension2(extension_ref()); |
609 set_extension( | 628 set_extension( |
610 utils::CreateEmptyExtensionWithLocation(extensions::Manifest::INTERNAL)); | 629 utils::CreateEmptyExtensionWithLocation(extensions::Manifest::INTERNAL)); |
611 | 630 |
612 CreateAlarm("[\"b\", {\"periodInMinutes\": 2}]"); | 631 CreateAlarm("[\"b\", {\"periodInMinutes\": 2}]"); |
613 | 632 |
614 alarm_manager_->last_poll_time_ = base::Time::FromJsTime(0); | 633 alarm_manager_->last_poll_time_ = base::Time::FromJsTime(0); |
615 alarm_manager_->ScheduleNextPoll(); | 634 alarm_manager_->ScheduleNextPoll(); |
616 | 635 |
617 // The next poll time should be 12 seconds from now - the time at which the | 636 // The next poll time should be 12 seconds from now - the time at which the |
618 // first alarm should go off. | 637 // first alarm should go off. |
619 EXPECT_DOUBLE_EQ((alarm_manager_->last_poll_time_ + | 638 EXPECT_DOUBLE_EQ((alarm_manager_->last_poll_time_ + |
620 base::TimeDelta::FromSeconds(12)).ToJsTime(), | 639 base::TimeDelta::FromSeconds(12)).ToJsTime(), |
621 alarm_manager_->next_poll_time_.ToJsTime()); | 640 alarm_manager_->next_poll_time_.ToJsTime()); |
622 } | 641 } |
623 | 642 |
624 // Test that scheduled alarms go off at set intervals, even if their actual | 643 // Test that scheduled alarms go off at set intervals, even if their actual |
625 // trigger is off. | 644 // trigger is off. |
626 TEST_F(ExtensionAlarmsSchedulingTest, RepeatingAlarmsScheduledPredictably) { | 645 TEST_F(ExtensionAlarmsSchedulingTest, RepeatingAlarmsScheduledPredictably) { |
627 test_clock_->SetNow(base::Time::FromJsTime(0)); | 646 test_clock_->SetNow(base::Time::FromJsTime(0)); |
628 CreateAlarm("[\"a\", {\"periodInMinutes\": 2}]"); | 647 CreateAlarm("[\"a\", {\"periodInMinutes\": 2}]"); |
629 | 648 |
630 alarm_manager_->last_poll_time_ = base::Time::FromJsTime(0); | 649 alarm_manager_->last_poll_time_ = base::Time::FromJsTime(0); |
631 alarm_manager_->ScheduleNextPoll(); | 650 alarm_manager_->ScheduleNextPoll(); |
632 | 651 |
633 // We expect the first poll to happen two minutes from the start. | 652 // We expect the first poll to happen two minutes from the start. |
634 EXPECT_DOUBLE_EQ((alarm_manager_->last_poll_time_ + | 653 EXPECT_DOUBLE_EQ((alarm_manager_->last_poll_time_ + |
635 base::TimeDelta::FromSeconds(120)).ToJsTime(), | 654 base::TimeDelta::FromSeconds(120)).ToJsTime(), |
636 alarm_manager_->next_poll_time_.ToJsTime()); | 655 alarm_manager_->next_poll_time_.ToJsTime()); |
637 | 656 |
638 // Poll more than two minutes later. | 657 // Poll more than two minutes later. |
639 test_clock_->Advance(base::TimeDelta::FromSeconds(125)); | 658 test_clock_->Advance(base::TimeDelta::FromSeconds(125)); |
640 alarm_manager_->PollAlarms(); | 659 alarm_manager_->PollAlarms(); |
641 | 660 |
642 // The alarm should have triggered once. | 661 // The alarm should have triggered once. |
643 EXPECT_EQ(1u, alarm_delegate_->alarms_seen.size()); | 662 EXPECT_EQ(1u, alarm_delegate_->alarms_seen.size()); |
644 | 663 |
645 // The next poll should still be scheduled for four minutes from the start, | 664 // The next poll should still be scheduled for four minutes from the start, |
646 // even though this is less than two minutes since the last alarm. | 665 // even though this is less than two minutes since the last alarm. |
647 // Last poll was at 125 seconds; next poll should be at 240 seconds. | 666 // Last poll was at 125 seconds; next poll should be at 240 seconds. |
648 EXPECT_DOUBLE_EQ((alarm_manager_->last_poll_time_ + | 667 EXPECT_DOUBLE_EQ((alarm_manager_->last_poll_time_ + |
649 base::TimeDelta::FromSeconds(115)).ToJsTime(), | 668 base::TimeDelta::FromSeconds(115)).ToJsTime(), |
650 alarm_manager_->next_poll_time_.ToJsTime()); | 669 alarm_manager_->next_poll_time_.ToJsTime()); |
651 | 670 |
652 // Completely miss a scheduled trigger. | 671 // Completely miss a scheduled trigger. |
653 test_clock_->Advance(base::TimeDelta::FromSeconds(255)); // Total Time: 380s | 672 test_clock_->Advance(base::TimeDelta::FromSeconds(255)); // Total Time: 380s |
654 alarm_manager_->PollAlarms(); | 673 alarm_manager_->PollAlarms(); |
655 | 674 |
656 // The alarm should have triggered again at this last poll. | 675 // The alarm should have triggered again at this last poll. |
657 EXPECT_EQ(2u, alarm_delegate_->alarms_seen.size()); | 676 EXPECT_EQ(2u, alarm_delegate_->alarms_seen.size()); |
658 | 677 |
659 // The next poll should be the first poll that hasn't happened and is in-line | 678 // The next poll should be the first poll that hasn't happened and is in-line |
660 // with the original scheduling. | 679 // with the original scheduling. |
661 // Last poll was at 380 seconds; next poll should be at 480 seconds. | 680 // Last poll was at 380 seconds; next poll should be at 480 seconds. |
662 EXPECT_DOUBLE_EQ((alarm_manager_->last_poll_time_ + | 681 EXPECT_DOUBLE_EQ((alarm_manager_->last_poll_time_ + |
663 base::TimeDelta::FromSeconds(100)).ToJsTime(), | 682 base::TimeDelta::FromSeconds(100)).ToJsTime(), |
664 alarm_manager_->next_poll_time_.ToJsTime()); | 683 alarm_manager_->next_poll_time_.ToJsTime()); |
665 } | 684 } |
666 | 685 |
667 } // namespace extensions | 686 } // namespace extensions |
OLD | NEW |