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

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

Issue 284183012: Bluetooth: remove Profile API (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <string.h> 5 #include <string.h>
6 6
7 #include "base/strings/stringprintf.h" 7 #include "base/strings/stringprintf.h"
8 #include "base/strings/utf_string_conversions.h" 8 #include "base/strings/utf_string_conversions.h"
9 #include "chrome/browser/extensions/api/bluetooth/bluetooth_api.h" 9 #include "chrome/browser/extensions/api/bluetooth/bluetooth_api.h"
10 #include "chrome/browser/extensions/api/bluetooth/bluetooth_event_router.h" 10 #include "chrome/browser/extensions/api/bluetooth/bluetooth_event_router.h"
11 #include "chrome/browser/extensions/extension_apitest.h" 11 #include "chrome/browser/extensions/extension_apitest.h"
12 #include "chrome/browser/extensions/extension_function_test_utils.h" 12 #include "chrome/browser/extensions/extension_function_test_utils.h"
13 #include "chrome/browser/extensions/extension_service.h" 13 #include "chrome/browser/extensions/extension_service.h"
14 #include "chrome/browser/extensions/extension_test_message_listener.h" 14 #include "chrome/browser/extensions/extension_test_message_listener.h"
15 #include "chrome/browser/ui/browser.h" 15 #include "chrome/browser/ui/browser.h"
16 #include "chrome/test/base/ui_test_utils.h" 16 #include "chrome/test/base/ui_test_utils.h"
17 #include "device/bluetooth/bluetooth_adapter.h" 17 #include "device/bluetooth/bluetooth_adapter.h"
18 #include "device/bluetooth/bluetooth_uuid.h" 18 #include "device/bluetooth/bluetooth_uuid.h"
19 #include "device/bluetooth/test/mock_bluetooth_adapter.h" 19 #include "device/bluetooth/test/mock_bluetooth_adapter.h"
20 #include "device/bluetooth/test/mock_bluetooth_device.h" 20 #include "device/bluetooth/test/mock_bluetooth_device.h"
21 #include "device/bluetooth/test/mock_bluetooth_discovery_session.h" 21 #include "device/bluetooth/test/mock_bluetooth_discovery_session.h"
22 #include "device/bluetooth/test/mock_bluetooth_profile.h"
23 #include "device/bluetooth/test/mock_bluetooth_socket.h"
24 #include "testing/gmock/include/gmock/gmock.h" 22 #include "testing/gmock/include/gmock/gmock.h"
25 23
26 using device::BluetoothAdapter; 24 using device::BluetoothAdapter;
27 using device::BluetoothDevice; 25 using device::BluetoothDevice;
28 using device::BluetoothDiscoverySession; 26 using device::BluetoothDiscoverySession;
29 using device::BluetoothProfile;
30 using device::BluetoothUUID; 27 using device::BluetoothUUID;
31 using device::MockBluetoothAdapter; 28 using device::MockBluetoothAdapter;
32 using device::MockBluetoothDevice; 29 using device::MockBluetoothDevice;
33 using device::MockBluetoothDiscoverySession; 30 using device::MockBluetoothDiscoverySession;
34 using device::MockBluetoothProfile;
35 using extensions::Extension; 31 using extensions::Extension;
36 32
37 namespace utils = extension_function_test_utils; 33 namespace utils = extension_function_test_utils;
38 namespace api = extensions::api; 34 namespace api = extensions::api;
39 35
40 namespace { 36 namespace {
41 37
42 static const char* kAdapterAddress = "A1:A2:A3:A4:A5:A6"; 38 static const char* kAdapterAddress = "A1:A2:A3:A4:A5:A6";
43 static const char* kName = "whatsinaname"; 39 static const char* kName = "whatsinaname";
44 40
45 class BluetoothApiTest : public ExtensionApiTest { 41 class BluetoothApiTest : public ExtensionApiTest {
46 public: 42 public:
47 BluetoothApiTest() {} 43 BluetoothApiTest() {}
48 44
49 virtual void SetUpOnMainThread() OVERRIDE { 45 virtual void SetUpOnMainThread() OVERRIDE {
50 ExtensionApiTest::SetUpOnMainThread(); 46 ExtensionApiTest::SetUpOnMainThread();
51 empty_extension_ = utils::CreateEmptyExtension(); 47 empty_extension_ = utils::CreateEmptyExtension();
52 SetUpMockAdapter(); 48 SetUpMockAdapter();
53 profile1_.reset(new testing::NiceMock<MockBluetoothProfile>());
54 profile2_.reset(new testing::NiceMock<MockBluetoothProfile>());
55 } 49 }
56 50
57 virtual void CleanUpOnMainThread() OVERRIDE { 51 virtual void CleanUpOnMainThread() OVERRIDE {
58 EXPECT_CALL(*mock_adapter_, RemoveObserver(testing::_)); 52 EXPECT_CALL(*mock_adapter_, RemoveObserver(testing::_));
59 } 53 }
60 54
61 void SetUpMockAdapter() { 55 void SetUpMockAdapter() {
62 // The browser will clean this up when it is torn down 56 // The browser will clean this up when it is torn down
63 mock_adapter_ = new testing::StrictMock<MockBluetoothAdapter>(); 57 mock_adapter_ = new testing::StrictMock<MockBluetoothAdapter>();
64 event_router()->SetAdapterForTest(mock_adapter_); 58 event_router()->SetAdapterForTest(mock_adapter_);
(...skipping 26 matching lines...) Expand all
91 function->set_has_callback(true); 85 function->set_has_callback(true);
92 return function; 86 return function;
93 } 87 }
94 88
95 protected: 89 protected:
96 testing::StrictMock<MockBluetoothAdapter>* mock_adapter_; 90 testing::StrictMock<MockBluetoothAdapter>* mock_adapter_;
97 scoped_ptr<testing::NiceMock<MockBluetoothDiscoverySession> > mock_session_; 91 scoped_ptr<testing::NiceMock<MockBluetoothDiscoverySession> > mock_session_;
98 scoped_ptr<testing::NiceMock<MockBluetoothDevice> > device1_; 92 scoped_ptr<testing::NiceMock<MockBluetoothDevice> > device1_;
99 scoped_ptr<testing::NiceMock<MockBluetoothDevice> > device2_; 93 scoped_ptr<testing::NiceMock<MockBluetoothDevice> > device2_;
100 scoped_ptr<testing::NiceMock<MockBluetoothDevice> > device3_; 94 scoped_ptr<testing::NiceMock<MockBluetoothDevice> > device3_;
101 scoped_ptr<testing::NiceMock<MockBluetoothProfile> > profile1_;
102 scoped_ptr<testing::NiceMock<MockBluetoothProfile> > profile2_;
103 95
104 extensions::BluetoothEventRouter* event_router() { 96 extensions::BluetoothEventRouter* event_router() {
105 return bluetooth_api()->event_router(); 97 return bluetooth_api()->event_router();
106 } 98 }
107 99
108 extensions::BluetoothAPI* bluetooth_api() { 100 extensions::BluetoothAPI* bluetooth_api() {
109 return extensions::BluetoothAPI::Get(browser()->profile()); 101 return extensions::BluetoothAPI::Get(browser()->profile());
110 } 102 }
111 103
112 private: 104 private:
113 scoped_refptr<Extension> empty_extension_; 105 scoped_refptr<Extension> empty_extension_;
114 }; 106 };
115 107
116 class TestBluetoothAddProfileFunction
117 : public api::BluetoothAddProfileFunction {
118 public:
119 explicit TestBluetoothAddProfileFunction(BluetoothProfile* profile)
120 : BluetoothAddProfileFunction(), profile_(profile) {
121 }
122
123 protected:
124 virtual ~TestBluetoothAddProfileFunction() {
125 }
126
127 // BluetoothAddProfileFunction override.
128 virtual void RegisterProfile(
129 const device::BluetoothProfile::Options& options,
130 const device::BluetoothProfile::ProfileCallback& callback) OVERRIDE {
131 callback.Run(profile_);
132 }
133
134 private:
135 // TestBluetoothAddProfileFunction does not own |profile_|.
136 BluetoothProfile* profile_;
137 };
138
139 static void StopDiscoverySessionCallback(const base::Closure& callback, 108 static void StopDiscoverySessionCallback(const base::Closure& callback,
140 const base::Closure& error_callback) { 109 const base::Closure& error_callback) {
141 callback.Run(); 110 callback.Run();
142 } 111 }
143 112
144 } // namespace 113 } // namespace
145 114
146 IN_PROC_BROWSER_TEST_F(BluetoothApiTest, Profiles) {
147 // Run in context of an extension that has permissions for the profiles
148 // we intend to register.
149 scoped_refptr<const Extension> extension(
150 LoadExtension(test_data_dir_.AppendASCII("bluetooth/profiles")));
151 ASSERT_TRUE(extension.get());
152
153 EXPECT_CALL(*profile1_, SetConnectionCallback(testing::_));
154 scoped_refptr<TestBluetoothAddProfileFunction> add_profile_function;
155 add_profile_function = new TestBluetoothAddProfileFunction(profile1_.get());
156 add_profile_function->set_extension(extension.get());
157 add_profile_function->set_has_callback(true);
158 std::string error(utils::RunFunctionAndReturnError(
159 add_profile_function.get(), "[{\"uuid\": \"1234\"}]", browser()));
160 ASSERT_TRUE(error.empty());
161
162 // Registering the profile for the same uuid again will throw an error.
163 add_profile_function = new TestBluetoothAddProfileFunction(profile2_.get());
164 add_profile_function->set_extension(extension.get());
165 add_profile_function->set_has_callback(true);
166 error = utils::RunFunctionAndReturnError(
167 add_profile_function.get(), "[{\"uuid\": \"1234\"}]", browser());
168 ASSERT_FALSE(error.empty());
169
170 add_profile_function = new TestBluetoothAddProfileFunction(profile2_.get());
171 add_profile_function->set_extension(extension.get());
172 add_profile_function->set_has_callback(true);
173 error = utils::RunFunctionAndReturnError(
174 add_profile_function.get(), "[{\"uuid\": \"5678\"}]", browser());
175 ASSERT_TRUE(error.empty());
176
177 scoped_refptr<api::BluetoothRemoveProfileFunction> remove_profile_function;
178 remove_profile_function = new api::BluetoothRemoveProfileFunction();
179 remove_profile_function->set_extension(extension.get());
180 remove_profile_function->set_has_callback(true);
181 error = utils::RunFunctionAndReturnError(
182 remove_profile_function.get(), "[{\"uuid\": \"1234\"}]", browser());
183 ASSERT_TRUE(error.empty());
184
185 remove_profile_function = new api::BluetoothRemoveProfileFunction();
186 remove_profile_function->set_extension(extension.get());
187 remove_profile_function->set_has_callback(true);
188 error = utils::RunFunctionAndReturnError(
189 remove_profile_function.get(), "[{\"uuid\": \"5678\"}]", browser());
190 ASSERT_TRUE(error.empty());
191
192 // Removing the same profile again will throw an error.
193 remove_profile_function = new api::BluetoothRemoveProfileFunction();
194 remove_profile_function->set_extension(extension.get());
195 remove_profile_function->set_has_callback(true);
196 error = utils::RunFunctionAndReturnError(
197 remove_profile_function.get(), "[{\"uuid\": \"5678\"}]", browser());
198 ASSERT_FALSE(error.empty());
199
200 // Registering a profile we don't have permission for will throw an error.
201 add_profile_function = new TestBluetoothAddProfileFunction(profile1_.get());
202 add_profile_function->set_extension(extension.get());
203 add_profile_function->set_has_callback(true);
204 error = utils::RunFunctionAndReturnError(
205 add_profile_function.get(), "[{\"uuid\": \"9999\"}]", browser());
206 ASSERT_FALSE(error.empty());
207 }
208
209 IN_PROC_BROWSER_TEST_F(BluetoothApiTest, GetAdapterState) { 115 IN_PROC_BROWSER_TEST_F(BluetoothApiTest, GetAdapterState) {
210 EXPECT_CALL(*mock_adapter_, GetAddress()) 116 EXPECT_CALL(*mock_adapter_, GetAddress())
211 .WillOnce(testing::Return(kAdapterAddress)); 117 .WillOnce(testing::Return(kAdapterAddress));
212 EXPECT_CALL(*mock_adapter_, GetName()) 118 EXPECT_CALL(*mock_adapter_, GetName())
213 .WillOnce(testing::Return(kName)); 119 .WillOnce(testing::Return(kName));
214 EXPECT_CALL(*mock_adapter_, IsPresent()) 120 EXPECT_CALL(*mock_adapter_, IsPresent())
215 .WillOnce(testing::Return(false)); 121 .WillOnce(testing::Return(false));
216 EXPECT_CALL(*mock_adapter_, IsPowered()) 122 EXPECT_CALL(*mock_adapter_, IsPowered())
217 .WillOnce(testing::Return(true)); 123 .WillOnce(testing::Return(true));
218 EXPECT_CALL(*mock_adapter_, IsDiscovering()) 124 EXPECT_CALL(*mock_adapter_, IsDiscovering())
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after
442 .WillOnce(testing::Return(true)); 348 .WillOnce(testing::Return(true));
443 EXPECT_CALL(*mock_adapter_, IsDiscovering()) 349 EXPECT_CALL(*mock_adapter_, IsDiscovering())
444 .WillOnce(testing::Return(true)); 350 .WillOnce(testing::Return(true));
445 event_router()->AdapterDiscoveringChanged(mock_adapter_, true); 351 event_router()->AdapterDiscoveringChanged(mock_adapter_, true);
446 352
447 listener.Reply("go"); 353 listener.Reply("go");
448 354
449 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message(); 355 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
450 } 356 }
451 357
452 IN_PROC_BROWSER_TEST_F(BluetoothApiTest, OnConnection) {
453 ResultCatcher catcher;
454 catcher.RestrictToProfile(browser()->profile());
455
456 // Load and wait for setup
457 ExtensionTestMessageListener listener("ready", true);
458 scoped_refptr<const Extension> extension(
459 LoadExtension(test_data_dir_.AppendASCII("bluetooth/on_connection")));
460 ASSERT_TRUE(extension.get());
461 EXPECT_TRUE(listener.WaitUntilSatisfied());
462
463 scoped_refptr<device::MockBluetoothSocket> socket =
464 new device::MockBluetoothSocket();
465
466 EXPECT_CALL(*mock_adapter_, GetDevice(device1_->GetAddress()))
467 .WillOnce(testing::Return(device1_.get()));
468
469 event_router()->AddProfile(
470 BluetoothUUID("1234"), extension->id(), profile1_.get());
471 bluetooth_api()->DispatchConnectionEvent(
472 extension->id(), BluetoothUUID("1234"), device1_.get(), socket);
473 // Connection events are dispatched using a couple of PostTask to the UI
474 // thread. Waiting until idle ensures the event is dispatched to the
475 // receiver(s).
476 base::RunLoop().RunUntilIdle();
477
478 listener.Reply("go");
479 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
480 event_router()->RemoveProfile(BluetoothUUID("1234"));
481 }
482
483 IN_PROC_BROWSER_TEST_F(BluetoothApiTest, GetDevices) { 358 IN_PROC_BROWSER_TEST_F(BluetoothApiTest, GetDevices) {
484 ResultCatcher catcher; 359 ResultCatcher catcher;
485 catcher.RestrictToProfile(browser()->profile()); 360 catcher.RestrictToProfile(browser()->profile());
486 361
487 BluetoothAdapter::ConstDeviceList devices; 362 BluetoothAdapter::ConstDeviceList devices;
488 devices.push_back(device1_.get()); 363 devices.push_back(device1_.get());
489 devices.push_back(device2_.get()); 364 devices.push_back(device2_.get());
490 365
491 EXPECT_CALL(*mock_adapter_, GetDevices()) 366 EXPECT_CALL(*mock_adapter_, GetDevices())
492 .Times(1) 367 .Times(1)
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
575 // Load and wait for setup 450 // Load and wait for setup
576 ExtensionTestMessageListener listener("ready", true); 451 ExtensionTestMessageListener listener("ready", true);
577 ASSERT_TRUE( 452 ASSERT_TRUE(
578 LoadExtension(test_data_dir_.AppendASCII("bluetooth/device_info"))); 453 LoadExtension(test_data_dir_.AppendASCII("bluetooth/device_info")));
579 EXPECT_TRUE(listener.WaitUntilSatisfied()); 454 EXPECT_TRUE(listener.WaitUntilSatisfied());
580 455
581 listener.Reply("go"); 456 listener.Reply("go");
582 457
583 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message(); 458 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
584 } 459 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698