OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 #include "extensions/browser/api/power/power_api.h" | 5 #include "extensions/browser/api/power/power_api.h" |
6 | 6 |
7 #include <deque> | 7 #include <deque> |
8 #include <string> | 8 #include <string> |
9 | 9 |
10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
11 #include "base/memory/ref_counted.h" | 11 #include "base/memory/ref_counted.h" |
12 #include "base/memory/scoped_ptr.h" | 12 #include "base/memory/scoped_ptr.h" |
13 #include "base/memory/weak_ptr.h" | 13 #include "base/memory/weak_ptr.h" |
14 #include "chrome/browser/extensions/extension_function_test_utils.h" | |
15 #include "chrome/test/base/browser_with_test_window_test.h" | |
16 #include "content/public/browser/power_save_blocker.h" | 14 #include "content/public/browser/power_save_blocker.h" |
17 #include "extensions/browser/api/power/power_api_manager.h" | 15 #include "extensions/browser/api/power/power_api_manager.h" |
| 16 #include "extensions/browser/api_test_utils.h" |
| 17 #include "extensions/browser/api_unittest.h" |
18 #include "extensions/common/extension.h" | 18 #include "extensions/common/extension.h" |
19 | 19 #include "extensions/common/test_util.h" |
20 namespace utils = extension_function_test_utils; | |
21 | 20 |
22 namespace extensions { | 21 namespace extensions { |
23 | 22 |
24 namespace { | 23 namespace { |
25 | 24 |
26 // Args commonly passed to PowerSaveBlockerStubManager::CallFunction(). | 25 // Args commonly passed to PowerSaveBlockerStubManager::CallFunction(). |
27 const char kDisplayArgs[] = "[\"display\"]"; | 26 const char kDisplayArgs[] = "[\"display\"]"; |
28 const char kSystemArgs[] = "[\"system\"]"; | 27 const char kSystemArgs[] = "[\"system\"]"; |
29 const char kEmptyArgs[] = "[]"; | 28 const char kEmptyArgs[] = "[]"; |
30 | 29 |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
122 // Requests in chronological order. | 121 // Requests in chronological order. |
123 std::deque<Request> requests_; | 122 std::deque<Request> requests_; |
124 | 123 |
125 base::WeakPtrFactory<PowerSaveBlockerStubManager> weak_ptr_factory_; | 124 base::WeakPtrFactory<PowerSaveBlockerStubManager> weak_ptr_factory_; |
126 | 125 |
127 DISALLOW_COPY_AND_ASSIGN(PowerSaveBlockerStubManager); | 126 DISALLOW_COPY_AND_ASSIGN(PowerSaveBlockerStubManager); |
128 }; | 127 }; |
129 | 128 |
130 } // namespace | 129 } // namespace |
131 | 130 |
132 class PowerApiTest : public BrowserWithTestWindowTest { | 131 class PowerApiTest : public ApiUnitTest { |
133 public: | 132 public: |
134 virtual void SetUp() OVERRIDE { | 133 virtual void SetUp() OVERRIDE { |
135 BrowserWithTestWindowTest::SetUp(); | 134 ApiUnitTest::SetUp(); |
136 manager_.reset(new PowerSaveBlockerStubManager(profile())); | 135 manager_.reset(new PowerSaveBlockerStubManager(browser_context())); |
137 extension_ = utils::CreateEmptyExtensionWithLocation( | |
138 extensions::Manifest::UNPACKED); | |
139 } | 136 } |
140 | 137 |
141 virtual void TearDown() OVERRIDE { | 138 virtual void TearDown() OVERRIDE { |
142 extension_ = NULL; | |
143 manager_.reset(); | 139 manager_.reset(); |
144 BrowserWithTestWindowTest::TearDown(); | 140 ApiUnitTest::TearDown(); |
145 } | 141 } |
146 | 142 |
147 protected: | 143 protected: |
148 // Shorthand for PowerRequestKeepAwakeFunction and | 144 // Shorthand for PowerRequestKeepAwakeFunction and |
149 // PowerReleaseKeepAwakeFunction. | 145 // PowerReleaseKeepAwakeFunction. |
150 enum FunctionType { | 146 enum FunctionType { |
151 REQUEST, | 147 REQUEST, |
152 RELEASE, | 148 RELEASE, |
153 }; | 149 }; |
154 | 150 |
155 // Calls the function described by |type| with |args|, a JSON list of | 151 // Calls the function described by |type| with |args|, a JSON list of |
156 // arguments, on behalf of |extension|. | 152 // arguments, on behalf of |extension|. |
157 bool CallFunction(FunctionType type, | 153 bool CallFunction(FunctionType type, |
158 const std::string& args, | 154 const std::string& args, |
159 extensions::Extension* extension) { | 155 const extensions::Extension* extension) { |
160 scoped_refptr<UIThreadExtensionFunction> function( | 156 scoped_refptr<UIThreadExtensionFunction> function( |
161 type == REQUEST ? | 157 type == REQUEST ? |
162 static_cast<UIThreadExtensionFunction*>( | 158 static_cast<UIThreadExtensionFunction*>( |
163 new PowerRequestKeepAwakeFunction) : | 159 new PowerRequestKeepAwakeFunction) : |
164 static_cast<UIThreadExtensionFunction*>( | 160 static_cast<UIThreadExtensionFunction*>( |
165 new PowerReleaseKeepAwakeFunction)); | 161 new PowerReleaseKeepAwakeFunction)); |
166 function->set_extension(extension); | 162 function->set_extension(extension); |
167 return utils::RunFunction(function.get(), args, browser(), utils::NONE); | 163 return api_test_utils::RunFunction(function.get(), args, browser_context()); |
168 } | 164 } |
169 | 165 |
170 // Send a notification to PowerApiManager saying that |extension| has | 166 // Send a notification to PowerApiManager saying that |extension| has |
171 // been unloaded. | 167 // been unloaded. |
172 void UnloadExtension(extensions::Extension* extension) { | 168 void UnloadExtension(const extensions::Extension* extension) { |
173 PowerApiManager::Get(profile())->OnExtensionUnloaded( | 169 PowerApiManager::Get(browser_context())->OnExtensionUnloaded( |
174 profile(), extension, UnloadedExtensionInfo::REASON_UNINSTALL); | 170 browser_context(), extension, UnloadedExtensionInfo::REASON_UNINSTALL); |
175 } | 171 } |
176 | 172 |
177 scoped_ptr<PowerSaveBlockerStubManager> manager_; | 173 scoped_ptr<PowerSaveBlockerStubManager> manager_; |
178 scoped_refptr<extensions::Extension> extension_; | |
179 }; | 174 }; |
180 | 175 |
181 TEST_F(PowerApiTest, RequestAndRelease) { | 176 TEST_F(PowerApiTest, RequestAndRelease) { |
182 // Simulate an extension making and releasing a "display" request and a | 177 // Simulate an extension making and releasing a "display" request and a |
183 // "system" request. | 178 // "system" request. |
184 ASSERT_TRUE(CallFunction(REQUEST, kDisplayArgs, extension_.get())); | 179 ASSERT_TRUE(CallFunction(REQUEST, kDisplayArgs, extension())); |
185 EXPECT_EQ(BLOCK_DISPLAY_SLEEP, manager_->PopFirstRequest()); | 180 EXPECT_EQ(BLOCK_DISPLAY_SLEEP, manager_->PopFirstRequest()); |
186 EXPECT_EQ(NONE, manager_->PopFirstRequest()); | 181 EXPECT_EQ(NONE, manager_->PopFirstRequest()); |
187 ASSERT_TRUE(CallFunction(RELEASE, kEmptyArgs, extension_.get())); | 182 ASSERT_TRUE(CallFunction(RELEASE, kEmptyArgs, extension())); |
188 EXPECT_EQ(UNBLOCK_DISPLAY_SLEEP, manager_->PopFirstRequest()); | 183 EXPECT_EQ(UNBLOCK_DISPLAY_SLEEP, manager_->PopFirstRequest()); |
189 EXPECT_EQ(NONE, manager_->PopFirstRequest()); | 184 EXPECT_EQ(NONE, manager_->PopFirstRequest()); |
190 | 185 |
191 ASSERT_TRUE(CallFunction(REQUEST, kSystemArgs, extension_.get())); | 186 ASSERT_TRUE(CallFunction(REQUEST, kSystemArgs, extension())); |
192 EXPECT_EQ(BLOCK_APP_SUSPENSION, manager_->PopFirstRequest()); | 187 EXPECT_EQ(BLOCK_APP_SUSPENSION, manager_->PopFirstRequest()); |
193 EXPECT_EQ(NONE, manager_->PopFirstRequest()); | 188 EXPECT_EQ(NONE, manager_->PopFirstRequest()); |
194 ASSERT_TRUE(CallFunction(RELEASE, kEmptyArgs, extension_.get())); | 189 ASSERT_TRUE(CallFunction(RELEASE, kEmptyArgs, extension())); |
195 EXPECT_EQ(UNBLOCK_APP_SUSPENSION, manager_->PopFirstRequest()); | 190 EXPECT_EQ(UNBLOCK_APP_SUSPENSION, manager_->PopFirstRequest()); |
196 EXPECT_EQ(NONE, manager_->PopFirstRequest()); | 191 EXPECT_EQ(NONE, manager_->PopFirstRequest()); |
197 } | 192 } |
198 | 193 |
199 TEST_F(PowerApiTest, RequestWithoutRelease) { | 194 TEST_F(PowerApiTest, RequestWithoutRelease) { |
200 // Simulate an extension calling requestKeepAwake() without calling | 195 // Simulate an extension calling requestKeepAwake() without calling |
201 // releaseKeepAwake(). The override should be automatically removed when | 196 // releaseKeepAwake(). The override should be automatically removed when |
202 // the extension is unloaded. | 197 // the extension is unloaded. |
203 ASSERT_TRUE(CallFunction(REQUEST, kDisplayArgs, extension_.get())); | 198 ASSERT_TRUE(CallFunction(REQUEST, kDisplayArgs, extension())); |
204 EXPECT_EQ(BLOCK_DISPLAY_SLEEP, manager_->PopFirstRequest()); | 199 EXPECT_EQ(BLOCK_DISPLAY_SLEEP, manager_->PopFirstRequest()); |
205 EXPECT_EQ(NONE, manager_->PopFirstRequest()); | 200 EXPECT_EQ(NONE, manager_->PopFirstRequest()); |
206 | 201 |
207 UnloadExtension(extension_.get()); | 202 UnloadExtension(extension()); |
208 EXPECT_EQ(UNBLOCK_DISPLAY_SLEEP, manager_->PopFirstRequest()); | 203 EXPECT_EQ(UNBLOCK_DISPLAY_SLEEP, manager_->PopFirstRequest()); |
209 EXPECT_EQ(NONE, manager_->PopFirstRequest()); | 204 EXPECT_EQ(NONE, manager_->PopFirstRequest()); |
210 } | 205 } |
211 | 206 |
212 TEST_F(PowerApiTest, ReleaseWithoutRequest) { | 207 TEST_F(PowerApiTest, ReleaseWithoutRequest) { |
213 // Simulate an extension calling releaseKeepAwake() without having | 208 // Simulate an extension calling releaseKeepAwake() without having |
214 // calling requestKeepAwake() earlier. The call should be ignored. | 209 // calling requestKeepAwake() earlier. The call should be ignored. |
215 ASSERT_TRUE(CallFunction(RELEASE, kEmptyArgs, extension_.get())); | 210 ASSERT_TRUE(CallFunction(RELEASE, kEmptyArgs, extension())); |
216 EXPECT_EQ(NONE, manager_->PopFirstRequest()); | 211 EXPECT_EQ(NONE, manager_->PopFirstRequest()); |
217 } | 212 } |
218 | 213 |
219 TEST_F(PowerApiTest, UpgradeRequest) { | 214 TEST_F(PowerApiTest, UpgradeRequest) { |
220 // Simulate an extension calling requestKeepAwake("system") and then | 215 // Simulate an extension calling requestKeepAwake("system") and then |
221 // requestKeepAwake("display"). When the second call is made, a | 216 // requestKeepAwake("display"). When the second call is made, a |
222 // display-sleep-blocking request should be made before the initial | 217 // display-sleep-blocking request should be made before the initial |
223 // app-suspension-blocking request is released. | 218 // app-suspension-blocking request is released. |
224 ASSERT_TRUE(CallFunction(REQUEST, kSystemArgs, extension_.get())); | 219 ASSERT_TRUE(CallFunction(REQUEST, kSystemArgs, extension())); |
225 EXPECT_EQ(BLOCK_APP_SUSPENSION, manager_->PopFirstRequest()); | 220 EXPECT_EQ(BLOCK_APP_SUSPENSION, manager_->PopFirstRequest()); |
226 EXPECT_EQ(NONE, manager_->PopFirstRequest()); | 221 EXPECT_EQ(NONE, manager_->PopFirstRequest()); |
227 | 222 |
228 ASSERT_TRUE(CallFunction(REQUEST, kDisplayArgs, extension_.get())); | 223 ASSERT_TRUE(CallFunction(REQUEST, kDisplayArgs, extension())); |
229 EXPECT_EQ(BLOCK_DISPLAY_SLEEP, manager_->PopFirstRequest()); | 224 EXPECT_EQ(BLOCK_DISPLAY_SLEEP, manager_->PopFirstRequest()); |
230 EXPECT_EQ(UNBLOCK_APP_SUSPENSION, manager_->PopFirstRequest()); | 225 EXPECT_EQ(UNBLOCK_APP_SUSPENSION, manager_->PopFirstRequest()); |
231 EXPECT_EQ(NONE, manager_->PopFirstRequest()); | 226 EXPECT_EQ(NONE, manager_->PopFirstRequest()); |
232 | 227 |
233 ASSERT_TRUE(CallFunction(RELEASE, kEmptyArgs, extension_.get())); | 228 ASSERT_TRUE(CallFunction(RELEASE, kEmptyArgs, extension())); |
234 EXPECT_EQ(UNBLOCK_DISPLAY_SLEEP, manager_->PopFirstRequest()); | 229 EXPECT_EQ(UNBLOCK_DISPLAY_SLEEP, manager_->PopFirstRequest()); |
235 EXPECT_EQ(NONE, manager_->PopFirstRequest()); | 230 EXPECT_EQ(NONE, manager_->PopFirstRequest()); |
236 } | 231 } |
237 | 232 |
238 TEST_F(PowerApiTest, DowngradeRequest) { | 233 TEST_F(PowerApiTest, DowngradeRequest) { |
239 // Simulate an extension calling requestKeepAwake("display") and then | 234 // Simulate an extension calling requestKeepAwake("display") and then |
240 // requestKeepAwake("system"). When the second call is made, an | 235 // requestKeepAwake("system"). When the second call is made, an |
241 // app-suspension-blocking request should be made before the initial | 236 // app-suspension-blocking request should be made before the initial |
242 // display-sleep-blocking request is released. | 237 // display-sleep-blocking request is released. |
243 ASSERT_TRUE(CallFunction(REQUEST, kDisplayArgs, extension_.get())); | 238 ASSERT_TRUE(CallFunction(REQUEST, kDisplayArgs, extension())); |
244 EXPECT_EQ(BLOCK_DISPLAY_SLEEP, manager_->PopFirstRequest()); | 239 EXPECT_EQ(BLOCK_DISPLAY_SLEEP, manager_->PopFirstRequest()); |
245 EXPECT_EQ(NONE, manager_->PopFirstRequest()); | 240 EXPECT_EQ(NONE, manager_->PopFirstRequest()); |
246 | 241 |
247 ASSERT_TRUE(CallFunction(REQUEST, kSystemArgs, extension_.get())); | 242 ASSERT_TRUE(CallFunction(REQUEST, kSystemArgs, extension())); |
248 EXPECT_EQ(BLOCK_APP_SUSPENSION, manager_->PopFirstRequest()); | 243 EXPECT_EQ(BLOCK_APP_SUSPENSION, manager_->PopFirstRequest()); |
249 EXPECT_EQ(UNBLOCK_DISPLAY_SLEEP, manager_->PopFirstRequest()); | 244 EXPECT_EQ(UNBLOCK_DISPLAY_SLEEP, manager_->PopFirstRequest()); |
250 EXPECT_EQ(NONE, manager_->PopFirstRequest()); | 245 EXPECT_EQ(NONE, manager_->PopFirstRequest()); |
251 | 246 |
252 ASSERT_TRUE(CallFunction(RELEASE, kEmptyArgs, extension_.get())); | 247 ASSERT_TRUE(CallFunction(RELEASE, kEmptyArgs, extension())); |
253 EXPECT_EQ(UNBLOCK_APP_SUSPENSION, manager_->PopFirstRequest()); | 248 EXPECT_EQ(UNBLOCK_APP_SUSPENSION, manager_->PopFirstRequest()); |
254 EXPECT_EQ(NONE, manager_->PopFirstRequest()); | 249 EXPECT_EQ(NONE, manager_->PopFirstRequest()); |
255 } | 250 } |
256 | 251 |
257 TEST_F(PowerApiTest, MultipleExtensions) { | 252 TEST_F(PowerApiTest, MultipleExtensions) { |
258 // Simulate an extension blocking the display from sleeping. | 253 // Simulate an extension blocking the display from sleeping. |
259 ASSERT_TRUE(CallFunction(REQUEST, kDisplayArgs, extension_.get())); | 254 ASSERT_TRUE(CallFunction(REQUEST, kDisplayArgs, extension())); |
260 EXPECT_EQ(BLOCK_DISPLAY_SLEEP, manager_->PopFirstRequest()); | 255 EXPECT_EQ(BLOCK_DISPLAY_SLEEP, manager_->PopFirstRequest()); |
261 EXPECT_EQ(NONE, manager_->PopFirstRequest()); | 256 EXPECT_EQ(NONE, manager_->PopFirstRequest()); |
262 | 257 |
263 // Create a second extension that blocks system suspend. No additional | 258 // Create a second extension that blocks system suspend. No additional |
264 // PowerSaveBlocker is needed; the blocker from the first extension | 259 // PowerSaveBlocker is needed; the blocker from the first extension |
265 // already covers the behavior requested by the second extension. | 260 // already covers the behavior requested by the second extension. |
266 scoped_ptr<base::DictionaryValue> extension_value( | 261 scoped_refptr<Extension> extension2(test_util::CreateExtensionWithID("id2")); |
267 utils::ParseDictionary("{\"name\": \"Test\", \"version\": \"1.0\"}")); | |
268 scoped_refptr<extensions::Extension> extension2( | |
269 utils::CreateExtension(extensions::Manifest::UNPACKED, | |
270 extension_value.get(), "second_extension")); | |
271 ASSERT_TRUE(CallFunction(REQUEST, kSystemArgs, extension2.get())); | 262 ASSERT_TRUE(CallFunction(REQUEST, kSystemArgs, extension2.get())); |
272 EXPECT_EQ(NONE, manager_->PopFirstRequest()); | 263 EXPECT_EQ(NONE, manager_->PopFirstRequest()); |
273 | 264 |
274 // When the first extension is unloaded, a new app-suspension blocker | 265 // When the first extension is unloaded, a new app-suspension blocker |
275 // should be created before the display-sleep blocker is destroyed. | 266 // should be created before the display-sleep blocker is destroyed. |
276 UnloadExtension(extension_.get()); | 267 UnloadExtension(extension()); |
277 EXPECT_EQ(BLOCK_APP_SUSPENSION, manager_->PopFirstRequest()); | 268 EXPECT_EQ(BLOCK_APP_SUSPENSION, manager_->PopFirstRequest()); |
278 EXPECT_EQ(UNBLOCK_DISPLAY_SLEEP, manager_->PopFirstRequest()); | 269 EXPECT_EQ(UNBLOCK_DISPLAY_SLEEP, manager_->PopFirstRequest()); |
279 EXPECT_EQ(NONE, manager_->PopFirstRequest()); | 270 EXPECT_EQ(NONE, manager_->PopFirstRequest()); |
280 | 271 |
281 // Make the first extension block display-sleep again. | 272 // Make the first extension block display-sleep again. |
282 ASSERT_TRUE(CallFunction(REQUEST, kDisplayArgs, extension_.get())); | 273 ASSERT_TRUE(CallFunction(REQUEST, kDisplayArgs, extension())); |
283 EXPECT_EQ(BLOCK_DISPLAY_SLEEP, manager_->PopFirstRequest()); | 274 EXPECT_EQ(BLOCK_DISPLAY_SLEEP, manager_->PopFirstRequest()); |
284 EXPECT_EQ(UNBLOCK_APP_SUSPENSION, manager_->PopFirstRequest()); | 275 EXPECT_EQ(UNBLOCK_APP_SUSPENSION, manager_->PopFirstRequest()); |
285 EXPECT_EQ(NONE, manager_->PopFirstRequest()); | 276 EXPECT_EQ(NONE, manager_->PopFirstRequest()); |
286 } | 277 } |
287 | 278 |
288 } // namespace extensions | 279 } // namespace extensions |
OLD | NEW |