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

Side by Side Diff: chrome/browser/extensions/api/bluetooth/bluetooth_apitest.cc

Issue 420663003: Extensions: Move bluetooth APIs to extensions/. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix android, gn Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #include <string.h>
6
7 #include "base/strings/stringprintf.h"
8 #include "base/strings/utf_string_conversions.h"
9 #include "chrome/browser/extensions/api/bluetooth/bluetooth_api.h"
10 #include "chrome/browser/extensions/api/bluetooth/bluetooth_event_router.h"
11 #include "chrome/browser/extensions/extension_apitest.h"
12 #include "chrome/browser/extensions/extension_function_test_utils.h"
13 #include "chrome/browser/extensions/extension_service.h"
14 #include "chrome/browser/extensions/extension_test_message_listener.h"
15 #include "chrome/browser/ui/browser.h"
16 #include "chrome/test/base/ui_test_utils.h"
17 #include "device/bluetooth/bluetooth_adapter.h"
18 #include "device/bluetooth/bluetooth_uuid.h"
19 #include "device/bluetooth/test/mock_bluetooth_adapter.h"
20 #include "device/bluetooth/test/mock_bluetooth_device.h"
21 #include "device/bluetooth/test/mock_bluetooth_discovery_session.h"
22 #include "testing/gmock/include/gmock/gmock.h"
23
24 using device::BluetoothAdapter;
25 using device::BluetoothDevice;
26 using device::BluetoothDiscoverySession;
27 using device::BluetoothUUID;
28 using device::MockBluetoothAdapter;
29 using device::MockBluetoothDevice;
30 using device::MockBluetoothDiscoverySession;
31 using extensions::Extension;
32
33 namespace utils = extension_function_test_utils;
34 namespace api = extensions::api;
35
36 namespace {
37
38 static const char* kAdapterAddress = "A1:A2:A3:A4:A5:A6";
39 static const char* kName = "whatsinaname";
40
41 class BluetoothApiTest : public ExtensionApiTest {
42 public:
43 BluetoothApiTest() {}
44
45 virtual void SetUpOnMainThread() OVERRIDE {
46 ExtensionApiTest::SetUpOnMainThread();
47 empty_extension_ = utils::CreateEmptyExtension();
48 SetUpMockAdapter();
49 }
50
51 virtual void TearDownOnMainThread() OVERRIDE {
52 EXPECT_CALL(*mock_adapter_, RemoveObserver(testing::_));
53 }
54
55 void SetUpMockAdapter() {
56 // The browser will clean this up when it is torn down
57 mock_adapter_ = new testing::StrictMock<MockBluetoothAdapter>();
58 event_router()->SetAdapterForTest(mock_adapter_);
59
60 device1_.reset(new testing::NiceMock<MockBluetoothDevice>(
61 mock_adapter_, 0, "d1", "11:12:13:14:15:16",
62 true /* paired */, true /* connected */));
63 device2_.reset(new testing::NiceMock<MockBluetoothDevice>(
64 mock_adapter_, 0, "d2", "21:22:23:24:25:26",
65 false /* paired */, false /* connected */));
66 device3_.reset(new testing::NiceMock<MockBluetoothDevice>(
67 mock_adapter_, 0, "d3", "31:32:33:34:35:36",
68 false /* paired */, false /* connected */));
69 }
70
71 void DiscoverySessionCallback(
72 const BluetoothAdapter::DiscoverySessionCallback& callback,
73 const BluetoothAdapter::ErrorCallback& error_callback) {
74 if (mock_session_.get()) {
75 callback.Run(
76 scoped_ptr<BluetoothDiscoverySession>(mock_session_.release()));
77 return;
78 }
79 error_callback.Run();
80 }
81
82 template <class T>
83 T* setupFunction(T* function) {
84 function->set_extension(empty_extension_.get());
85 function->set_has_callback(true);
86 return function;
87 }
88
89 protected:
90 testing::StrictMock<MockBluetoothAdapter>* mock_adapter_;
91 scoped_ptr<testing::NiceMock<MockBluetoothDiscoverySession> > mock_session_;
92 scoped_ptr<testing::NiceMock<MockBluetoothDevice> > device1_;
93 scoped_ptr<testing::NiceMock<MockBluetoothDevice> > device2_;
94 scoped_ptr<testing::NiceMock<MockBluetoothDevice> > device3_;
95
96 extensions::BluetoothEventRouter* event_router() {
97 return bluetooth_api()->event_router();
98 }
99
100 extensions::BluetoothAPI* bluetooth_api() {
101 return extensions::BluetoothAPI::Get(browser()->profile());
102 }
103
104 private:
105 scoped_refptr<Extension> empty_extension_;
106 };
107
108 static void StopDiscoverySessionCallback(const base::Closure& callback,
109 const base::Closure& error_callback) {
110 callback.Run();
111 }
112
113 } // namespace
114
115 IN_PROC_BROWSER_TEST_F(BluetoothApiTest, GetAdapterState) {
116 EXPECT_CALL(*mock_adapter_, GetAddress())
117 .WillOnce(testing::Return(kAdapterAddress));
118 EXPECT_CALL(*mock_adapter_, GetName())
119 .WillOnce(testing::Return(kName));
120 EXPECT_CALL(*mock_adapter_, IsPresent())
121 .WillOnce(testing::Return(false));
122 EXPECT_CALL(*mock_adapter_, IsPowered())
123 .WillOnce(testing::Return(true));
124 EXPECT_CALL(*mock_adapter_, IsDiscovering())
125 .WillOnce(testing::Return(false));
126
127 scoped_refptr<api::BluetoothGetAdapterStateFunction> get_adapter_state;
128 get_adapter_state = setupFunction(new api::BluetoothGetAdapterStateFunction);
129
130 scoped_ptr<base::Value> result(utils::RunFunctionAndReturnSingleResult(
131 get_adapter_state.get(), "[]", browser()));
132 ASSERT_TRUE(result.get() != NULL);
133 api::bluetooth::AdapterState state;
134 ASSERT_TRUE(api::bluetooth::AdapterState::Populate(*result, &state));
135
136 EXPECT_FALSE(state.available);
137 EXPECT_TRUE(state.powered);
138 EXPECT_FALSE(state.discovering);
139 EXPECT_EQ(kName, state.name);
140 EXPECT_EQ(kAdapterAddress, state.address);
141 }
142
143 IN_PROC_BROWSER_TEST_F(BluetoothApiTest, DeviceEvents) {
144 ResultCatcher catcher;
145 catcher.RestrictToProfile(browser()->profile());
146
147 ASSERT_TRUE(LoadExtension(
148 test_data_dir_.AppendASCII("bluetooth/device_events")));
149
150 ExtensionTestMessageListener events_received("ready", true);
151 event_router()->DeviceAdded(mock_adapter_, device1_.get());
152 event_router()->DeviceAdded(mock_adapter_, device2_.get());
153
154 EXPECT_CALL(*device2_.get(), GetDeviceName())
155 .WillRepeatedly(testing::Return("the real d2"));
156 EXPECT_CALL(*device2_.get(), GetName())
157 .WillRepeatedly(testing::Return(base::UTF8ToUTF16("the real d2")));
158 event_router()->DeviceChanged(mock_adapter_, device2_.get());
159
160 event_router()->DeviceAdded(mock_adapter_, device3_.get());
161 event_router()->DeviceRemoved(mock_adapter_, device1_.get());
162 EXPECT_TRUE(events_received.WaitUntilSatisfied());
163 events_received.Reply("go");
164
165 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
166 }
167
168 IN_PROC_BROWSER_TEST_F(BluetoothApiTest, Discovery) {
169 // Try with a failure to start. This will return an error as we haven't
170 // initialied a session object.
171 EXPECT_CALL(*mock_adapter_, StartDiscoverySession(testing::_, testing::_))
172 .WillOnce(
173 testing::Invoke(this, &BluetoothApiTest::DiscoverySessionCallback));
174
175 // StartDiscovery failure will not reference the adapter.
176 scoped_refptr<api::BluetoothStartDiscoveryFunction> start_function;
177 start_function = setupFunction(new api::BluetoothStartDiscoveryFunction);
178 std::string error(
179 utils::RunFunctionAndReturnError(start_function.get(), "[]", browser()));
180 ASSERT_FALSE(error.empty());
181
182 // Reset the adapter and initiate a discovery session. The ownership of the
183 // mock session will be passed to the event router.
184 ASSERT_FALSE(mock_session_.get());
185 SetUpMockAdapter();
186
187 // Create a mock session to be returned as a result. Get a handle to it as
188 // its ownership will be passed and |mock_session_| will be reset.
189 mock_session_.reset(new testing::NiceMock<MockBluetoothDiscoverySession>());
190 MockBluetoothDiscoverySession* session = mock_session_.get();
191 EXPECT_CALL(*mock_adapter_, StartDiscoverySession(testing::_, testing::_))
192 .WillOnce(
193 testing::Invoke(this, &BluetoothApiTest::DiscoverySessionCallback));
194 start_function = setupFunction(new api::BluetoothStartDiscoveryFunction);
195 (void)
196 utils::RunFunctionAndReturnError(start_function.get(), "[]", browser());
197
198 // End the discovery session. The StopDiscovery function should succeed.
199 testing::Mock::VerifyAndClearExpectations(mock_adapter_);
200 EXPECT_CALL(*session, IsActive()).WillOnce(testing::Return(true));
201 EXPECT_CALL(*session, Stop(testing::_, testing::_))
202 .WillOnce(testing::Invoke(StopDiscoverySessionCallback));
203
204 // StopDiscovery success will remove the session object, unreferencing the
205 // adapter.
206 scoped_refptr<api::BluetoothStopDiscoveryFunction> stop_function;
207 stop_function = setupFunction(new api::BluetoothStopDiscoveryFunction);
208 (void) utils::RunFunctionAndReturnSingleResult(
209 stop_function.get(), "[]", browser());
210
211 // Reset the adapter. Simulate failure for stop discovery. The event router
212 // still owns the session. Make it appear inactive.
213 SetUpMockAdapter();
214 EXPECT_CALL(*session, IsActive()).WillOnce(testing::Return(false));
215 stop_function = setupFunction(new api::BluetoothStopDiscoveryFunction);
216 error =
217 utils::RunFunctionAndReturnError(stop_function.get(), "[]", browser());
218 ASSERT_FALSE(error.empty());
219 SetUpMockAdapter();
220 }
221
222 IN_PROC_BROWSER_TEST_F(BluetoothApiTest, DiscoveryCallback) {
223 mock_session_.reset(new testing::NiceMock<MockBluetoothDiscoverySession>());
224 MockBluetoothDiscoverySession* session = mock_session_.get();
225 EXPECT_CALL(*mock_adapter_, StartDiscoverySession(testing::_, testing::_))
226 .WillOnce(
227 testing::Invoke(this, &BluetoothApiTest::DiscoverySessionCallback));
228 EXPECT_CALL(*session, IsActive()).WillOnce(testing::Return(true));
229 EXPECT_CALL(*session, Stop(testing::_, testing::_))
230 .WillOnce(testing::Invoke(StopDiscoverySessionCallback));
231
232 ResultCatcher catcher;
233 catcher.RestrictToProfile(browser()->profile());
234
235 ExtensionTestMessageListener discovery_started("ready", true);
236 ASSERT_TRUE(LoadExtension(
237 test_data_dir_.AppendASCII("bluetooth/discovery_callback")));
238 EXPECT_TRUE(discovery_started.WaitUntilSatisfied());
239
240 event_router()->DeviceAdded(mock_adapter_, device1_.get());
241
242 discovery_started.Reply("go");
243 ExtensionTestMessageListener discovery_stopped("ready", true);
244 EXPECT_CALL(*mock_adapter_, RemoveObserver(testing::_));
245 EXPECT_TRUE(discovery_stopped.WaitUntilSatisfied());
246
247 SetUpMockAdapter();
248 event_router()->DeviceAdded(mock_adapter_, device2_.get());
249 discovery_stopped.Reply("go");
250
251 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
252 }
253
254 IN_PROC_BROWSER_TEST_F(BluetoothApiTest, DiscoveryInProgress) {
255 EXPECT_CALL(*mock_adapter_, GetAddress())
256 .WillOnce(testing::Return(kAdapterAddress));
257 EXPECT_CALL(*mock_adapter_, GetName())
258 .WillOnce(testing::Return(kName));
259 EXPECT_CALL(*mock_adapter_, IsPresent())
260 .WillOnce(testing::Return(true));
261 EXPECT_CALL(*mock_adapter_, IsPowered())
262 .WillOnce(testing::Return(true));
263
264 // Fake that the adapter is discovering
265 EXPECT_CALL(*mock_adapter_, IsDiscovering())
266 .WillOnce(testing::Return(true));
267 event_router()->AdapterDiscoveringChanged(mock_adapter_, true);
268
269 // Cache a device before the extension starts discovering
270 event_router()->DeviceAdded(mock_adapter_, device1_.get());
271
272 ResultCatcher catcher;
273 catcher.RestrictToProfile(browser()->profile());
274
275 mock_session_.reset(new testing::NiceMock<MockBluetoothDiscoverySession>());
276 MockBluetoothDiscoverySession* session = mock_session_.get();
277 EXPECT_CALL(*mock_adapter_, StartDiscoverySession(testing::_, testing::_))
278 .WillOnce(
279 testing::Invoke(this, &BluetoothApiTest::DiscoverySessionCallback));
280 EXPECT_CALL(*session, IsActive()).WillOnce(testing::Return(true));
281 EXPECT_CALL(*session, Stop(testing::_, testing::_))
282 .WillOnce(testing::Invoke(StopDiscoverySessionCallback));
283
284 ExtensionTestMessageListener discovery_started("ready", true);
285 ASSERT_TRUE(LoadExtension(
286 test_data_dir_.AppendASCII("bluetooth/discovery_in_progress")));
287 EXPECT_TRUE(discovery_started.WaitUntilSatisfied());
288
289 // Only this should be received. No additional notification should be sent for
290 // devices discovered before the discovery session started.
291 event_router()->DeviceAdded(mock_adapter_, device2_.get());
292
293 discovery_started.Reply("go");
294 ExtensionTestMessageListener discovery_stopped("ready", true);
295 EXPECT_CALL(*mock_adapter_, RemoveObserver(testing::_));
296 EXPECT_TRUE(discovery_stopped.WaitUntilSatisfied());
297
298 SetUpMockAdapter();
299 // This should never be received.
300 event_router()->DeviceAdded(mock_adapter_, device2_.get());
301 discovery_stopped.Reply("go");
302
303 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
304 }
305
306 IN_PROC_BROWSER_TEST_F(BluetoothApiTest, OnAdapterStateChanged) {
307 ResultCatcher catcher;
308 catcher.RestrictToProfile(browser()->profile());
309
310 // Load and wait for setup
311 ExtensionTestMessageListener listener("ready", true);
312 ASSERT_TRUE(
313 LoadExtension(
314 test_data_dir_.AppendASCII("bluetooth/on_adapter_state_changed")));
315 EXPECT_TRUE(listener.WaitUntilSatisfied());
316
317 EXPECT_CALL(*mock_adapter_, GetAddress())
318 .WillOnce(testing::Return(kAdapterAddress));
319 EXPECT_CALL(*mock_adapter_, GetName())
320 .WillOnce(testing::Return(kName));
321 EXPECT_CALL(*mock_adapter_, IsPresent())
322 .WillOnce(testing::Return(false));
323 EXPECT_CALL(*mock_adapter_, IsPowered())
324 .WillOnce(testing::Return(false));
325 EXPECT_CALL(*mock_adapter_, IsDiscovering())
326 .WillOnce(testing::Return(false));
327 event_router()->AdapterPoweredChanged(mock_adapter_, false);
328
329 EXPECT_CALL(*mock_adapter_, GetAddress())
330 .WillOnce(testing::Return(kAdapterAddress));
331 EXPECT_CALL(*mock_adapter_, GetName())
332 .WillOnce(testing::Return(kName));
333 EXPECT_CALL(*mock_adapter_, IsPresent())
334 .WillOnce(testing::Return(true));
335 EXPECT_CALL(*mock_adapter_, IsPowered())
336 .WillOnce(testing::Return(true));
337 EXPECT_CALL(*mock_adapter_, IsDiscovering())
338 .WillOnce(testing::Return(true));
339 event_router()->AdapterPresentChanged(mock_adapter_, true);
340
341 EXPECT_CALL(*mock_adapter_, GetAddress())
342 .WillOnce(testing::Return(kAdapterAddress));
343 EXPECT_CALL(*mock_adapter_, GetName())
344 .WillOnce(testing::Return(kName));
345 EXPECT_CALL(*mock_adapter_, IsPresent())
346 .WillOnce(testing::Return(true));
347 EXPECT_CALL(*mock_adapter_, IsPowered())
348 .WillOnce(testing::Return(true));
349 EXPECT_CALL(*mock_adapter_, IsDiscovering())
350 .WillOnce(testing::Return(true));
351 event_router()->AdapterDiscoveringChanged(mock_adapter_, true);
352
353 listener.Reply("go");
354
355 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
356 }
357
358 IN_PROC_BROWSER_TEST_F(BluetoothApiTest, GetDevices) {
359 ResultCatcher catcher;
360 catcher.RestrictToProfile(browser()->profile());
361
362 BluetoothAdapter::ConstDeviceList devices;
363 devices.push_back(device1_.get());
364 devices.push_back(device2_.get());
365
366 EXPECT_CALL(*mock_adapter_, GetDevices())
367 .Times(1)
368 .WillRepeatedly(testing::Return(devices));
369
370 // Load and wait for setup
371 ExtensionTestMessageListener listener("ready", true);
372 ASSERT_TRUE(
373 LoadExtension(test_data_dir_.AppendASCII("bluetooth/get_devices")));
374 EXPECT_TRUE(listener.WaitUntilSatisfied());
375
376 listener.Reply("go");
377
378 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
379 }
380
381 IN_PROC_BROWSER_TEST_F(BluetoothApiTest, GetDevice) {
382 ResultCatcher catcher;
383 catcher.RestrictToProfile(browser()->profile());
384
385 EXPECT_CALL(*mock_adapter_, GetDevice(device1_->GetAddress()))
386 .WillOnce(testing::Return(device1_.get()));
387 EXPECT_CALL(*mock_adapter_, GetDevice(device2_->GetAddress()))
388 .Times(1)
389 .WillRepeatedly(testing::Return(static_cast<BluetoothDevice*>(NULL)));
390
391 // Load and wait for setup
392 ExtensionTestMessageListener listener("ready", true);
393 ASSERT_TRUE(
394 LoadExtension(test_data_dir_.AppendASCII("bluetooth/get_device")));
395 EXPECT_TRUE(listener.WaitUntilSatisfied());
396
397 listener.Reply("go");
398
399 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
400 }
401
402 IN_PROC_BROWSER_TEST_F(BluetoothApiTest, DeviceInfo) {
403 ResultCatcher catcher;
404 catcher.RestrictToProfile(browser()->profile());
405
406 // Set up the first device object to reflect a real-world device.
407 BluetoothAdapter::ConstDeviceList devices;
408
409 EXPECT_CALL(*device1_.get(), GetAddress())
410 .WillRepeatedly(testing::Return("A4:17:31:00:00:00"));
411 EXPECT_CALL(*device1_.get(), GetDeviceName())
412 .WillRepeatedly(testing::Return("Chromebook Pixel"));
413 EXPECT_CALL(*device1_.get(), GetName())
414 .WillRepeatedly(testing::Return(base::UTF8ToUTF16("Chromebook Pixel")));
415 EXPECT_CALL(*device1_.get(), GetBluetoothClass())
416 .WillRepeatedly(testing::Return(0x080104));
417 EXPECT_CALL(*device1_.get(), GetDeviceType())
418 .WillRepeatedly(testing::Return(BluetoothDevice::DEVICE_COMPUTER));
419 EXPECT_CALL(*device1_.get(), GetVendorIDSource())
420 .WillRepeatedly(testing::Return(BluetoothDevice::VENDOR_ID_BLUETOOTH));
421 EXPECT_CALL(*device1_.get(), GetVendorID())
422 .WillRepeatedly(testing::Return(0x00E0));
423 EXPECT_CALL(*device1_.get(), GetProductID())
424 .WillRepeatedly(testing::Return(0x240A));
425 EXPECT_CALL(*device1_.get(), GetDeviceID())
426 .WillRepeatedly(testing::Return(0x0400));
427 EXPECT_CALL(*device1_, GetRSSI()).WillRepeatedly(testing::Return(-42));
428 EXPECT_CALL(*device1_, GetCurrentHostTransmitPower())
429 .WillRepeatedly(testing::Return(-16));
430 EXPECT_CALL(*device1_, GetMaximumHostTransmitPower())
431 .WillRepeatedly(testing::Return(10));
432
433 BluetoothDevice::UUIDList uuids;
434 uuids.push_back(BluetoothUUID("1105"));
435 uuids.push_back(BluetoothUUID("1106"));
436
437 EXPECT_CALL(*device1_.get(), GetUUIDs())
438 .WillOnce(testing::Return(uuids));
439
440 devices.push_back(device1_.get());
441
442 // Leave the second largely empty so we can check a device without
443 // available information.
444 devices.push_back(device2_.get());
445
446 EXPECT_CALL(*mock_adapter_, GetDevices())
447 .Times(1)
448 .WillRepeatedly(testing::Return(devices));
449
450 // Load and wait for setup
451 ExtensionTestMessageListener listener("ready", true);
452 ASSERT_TRUE(
453 LoadExtension(test_data_dir_.AppendASCII("bluetooth/device_info")));
454 EXPECT_TRUE(listener.WaitUntilSatisfied());
455
456 listener.Reply("go");
457
458 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
459 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698