1 // Copyright 2015 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.
6 #include "base/message_loop/message_loop.h"
7 #include "chromeos/dbus/bluetooth_profile_service_provider.h"
8 #include "chromeos/dbus/dbus_thread_manager.h"
9 #include "chromeos/dbus/fake_bluetooth_adapter_client.h"
10 #include "chromeos/dbus/fake_bluetooth_agent_manager_client.h"
11 #include "chromeos/dbus/fake_bluetooth_device_client.h"
12 #include "chromeos/dbus/fake_bluetooth_profile_manager_client.h"
13 #include "device/bluetooth/bluetooth_adapter.h"
14 #include "device/bluetooth/bluetooth_adapter_chromeos.h"
15 #include "device/bluetooth/bluetooth_adapter_factory.h"
16 #include "device/bluetooth/bluetooth_adapter_profile_chromeos.h"
17 #include "device/bluetooth/bluetooth_uuid.h"
18 #include "testing/gtest/include/gtest/gtest.h"
20 using device::BluetoothAdapter
;
21 using device::BluetoothUUID
;
25 class BluetoothAdapterProfileChromeOSTest
: public testing::Test
{
27 BluetoothAdapterProfileChromeOSTest()
28 : success_callback_count_(0),
29 error_callback_count_(0),
30 fake_delegate_paired_(FakeBluetoothDeviceClient::kPairedDevicePath
),
31 fake_delegate_autopair_(FakeBluetoothDeviceClient::kLegacyAutopairPath
),
32 fake_delegate_listen_(""),
33 profile_user_ptr_(nullptr) {}
35 void SetUp() override
{
36 scoped_ptr
<DBusThreadManagerSetter
> dbus_setter
=
37 DBusThreadManager::GetSetterForTesting();
39 dbus_setter
->SetBluetoothAdapterClient(
40 scoped_ptr
<BluetoothAdapterClient
>(new FakeBluetoothAdapterClient
));
41 dbus_setter
->SetBluetoothAgentManagerClient(
42 scoped_ptr
<BluetoothAgentManagerClient
>(
43 new FakeBluetoothAgentManagerClient
));
44 dbus_setter
->SetBluetoothDeviceClient(
45 scoped_ptr
<BluetoothDeviceClient
>(new FakeBluetoothDeviceClient
));
46 dbus_setter
->SetBluetoothProfileManagerClient(
47 scoped_ptr
<BluetoothProfileManagerClient
>(
48 new FakeBluetoothProfileManagerClient
));
50 // Grab a pointer to the adapter.
51 device::BluetoothAdapterFactory::GetAdapter(
52 base::Bind(&BluetoothAdapterProfileChromeOSTest::AdapterCallback
,
53 base::Unretained(this)));
54 ASSERT_TRUE(adapter_
.get() != nullptr);
55 ASSERT_TRUE(adapter_
->IsInitialized());
56 ASSERT_TRUE(adapter_
->IsPresent());
58 // Turn on the adapter.
59 adapter_
->SetPowered(true, base::Bind(&base::DoNothing
),
60 base::Bind(&base::DoNothing
));
61 ASSERT_TRUE(adapter_
->IsPowered());
64 void TearDown() override
{
67 DBusThreadManager::Shutdown();
70 void AdapterCallback(scoped_refptr
<BluetoothAdapter
> adapter
) {
75 : public chromeos::BluetoothProfileServiceProvider::Delegate
{
77 FakeDelegate(std::string device_path
) : connections_(0) {
78 device_path_
= dbus::ObjectPath(device_path
);
81 // BluetoothProfileServiceProvider::Delegate:
82 void Released() override
{
87 const dbus::ObjectPath
& device_path
,
88 scoped_ptr
<dbus::FileDescriptor
> fd
,
89 const BluetoothProfileServiceProvider::Delegate::Options
& options
,
90 const ConfirmationCallback
& callback
) override
{
93 close(fd
->TakeValue());
94 callback
.Run(SUCCESS
);
95 if (device_path_
.value() != "")
96 ASSERT_EQ(device_path_
, device_path
);
99 void RequestDisconnection(const dbus::ObjectPath
& device_path
,
100 const ConfirmationCallback
& callback
) override
{
104 void Cancel() override
{
108 unsigned int connections_
;
109 unsigned int disconnections_
;
110 dbus::ObjectPath device_path_
;
113 void ProfileSuccessCallback(
114 scoped_ptr
<BluetoothAdapterProfileChromeOS
> profile
) {
115 profile_
.swap(profile
);
116 ++success_callback_count_
;
119 void ProfileUserSuccessCallback(BluetoothAdapterProfileChromeOS
* profile
) {
120 profile_user_ptr_
= profile
;
121 ++success_callback_count_
;
124 void MatchedProfileCallback(BluetoothAdapterProfileChromeOS
* profile
) {
125 ASSERT_EQ(profile_user_ptr_
, profile
);
126 ++success_callback_count_
;
129 void DBusConnectSuccessCallback() { ++success_callback_count_
; }
131 void DBusErrorCallback(const std::string
& error_name
,
132 const std::string
& error_message
) {
133 ++error_callback_count_
;
136 void BasicErrorCallback(const std::string
& error_message
) {
137 ++error_callback_count_
;
141 base::MessageLoop message_loop_
;
143 scoped_refptr
<BluetoothAdapter
> adapter_
;
145 unsigned int success_callback_count_
;
146 unsigned int error_callback_count_
;
148 FakeDelegate fake_delegate_paired_
;
149 FakeDelegate fake_delegate_autopair_
;
150 FakeDelegate fake_delegate_listen_
;
152 scoped_ptr
<BluetoothAdapterProfileChromeOS
> profile_
;
154 // unowned pointer as expected to be used by clients of
155 // BluetoothAdapterChromeOS::UseProfile like BluetoothSocketChromeOS
156 BluetoothAdapterProfileChromeOS
* profile_user_ptr_
;
159 TEST_F(BluetoothAdapterProfileChromeOSTest
, DelegateCount
) {
160 BluetoothUUID
uuid(FakeBluetoothProfileManagerClient::kRfcommUuid
);
161 BluetoothProfileManagerClient::Options options
;
163 options
.require_authentication
.reset(new bool(false));
165 BluetoothAdapterProfileChromeOS::Register(
167 base::Bind(&BluetoothAdapterProfileChromeOSTest::ProfileSuccessCallback
,
168 base::Unretained(this)),
169 base::Bind(&BluetoothAdapterProfileChromeOSTest::DBusErrorCallback
,
170 base::Unretained(this)));
172 message_loop_
.RunUntilIdle();
174 EXPECT_TRUE(profile_
);
175 EXPECT_EQ(1U, success_callback_count_
);
176 EXPECT_EQ(0U, error_callback_count_
);
178 EXPECT_EQ(0U, profile_
->DelegateCount());
180 profile_
->SetDelegate(fake_delegate_paired_
.device_path_
,
181 &fake_delegate_paired_
);
183 EXPECT_EQ(1U, profile_
->DelegateCount());
185 profile_
->RemoveDelegate(fake_delegate_autopair_
.device_path_
,
186 base::Bind(&base::DoNothing
));
188 EXPECT_EQ(1U, profile_
->DelegateCount());
190 profile_
->RemoveDelegate(fake_delegate_paired_
.device_path_
,
191 base::Bind(&base::DoNothing
));
193 EXPECT_EQ(0U, profile_
->DelegateCount());
196 TEST_F(BluetoothAdapterProfileChromeOSTest
, BlackHole
) {
197 BluetoothUUID
uuid(FakeBluetoothProfileManagerClient::kRfcommUuid
);
198 BluetoothProfileManagerClient::Options options
;
200 options
.require_authentication
.reset(new bool(false));
202 BluetoothAdapterProfileChromeOS::Register(
204 base::Bind(&BluetoothAdapterProfileChromeOSTest::ProfileSuccessCallback
,
205 base::Unretained(this)),
206 base::Bind(&BluetoothAdapterProfileChromeOSTest::DBusErrorCallback
,
207 base::Unretained(this)));
209 message_loop_
.RunUntilIdle();
211 EXPECT_TRUE(profile_
);
212 EXPECT_EQ(1U, success_callback_count_
);
213 EXPECT_EQ(0U, error_callback_count_
);
215 DBusThreadManager::Get()->GetBluetoothDeviceClient()->ConnectProfile(
216 dbus::ObjectPath(FakeBluetoothDeviceClient::kPairedDevicePath
),
217 FakeBluetoothProfileManagerClient::kRfcommUuid
,
219 &BluetoothAdapterProfileChromeOSTest::DBusConnectSuccessCallback
,
220 base::Unretained(this)),
221 base::Bind(&BluetoothAdapterProfileChromeOSTest::DBusErrorCallback
,
222 base::Unretained(this)));
224 message_loop_
.RunUntilIdle();
226 EXPECT_EQ(1U, success_callback_count_
);
227 EXPECT_EQ(1U, error_callback_count_
);
229 EXPECT_EQ(0U, fake_delegate_paired_
.connections_
);
232 TEST_F(BluetoothAdapterProfileChromeOSTest
, Routing
) {
233 BluetoothUUID
uuid(FakeBluetoothProfileManagerClient::kRfcommUuid
);
234 BluetoothProfileManagerClient::Options options
;
236 options
.require_authentication
.reset(new bool(false));
238 BluetoothAdapterProfileChromeOS::Register(
240 base::Bind(&BluetoothAdapterProfileChromeOSTest::ProfileSuccessCallback
,
241 base::Unretained(this)),
242 base::Bind(&BluetoothAdapterProfileChromeOSTest::DBusErrorCallback
,
243 base::Unretained(this)));
245 message_loop_
.RunUntilIdle();
247 ASSERT_TRUE(profile_
);
248 ASSERT_EQ(1U, success_callback_count_
);
249 ASSERT_EQ(0U, error_callback_count_
);
251 profile_
->SetDelegate(fake_delegate_paired_
.device_path_
,
252 &fake_delegate_paired_
);
253 profile_
->SetDelegate(fake_delegate_autopair_
.device_path_
,
254 &fake_delegate_autopair_
);
255 profile_
->SetDelegate(fake_delegate_listen_
.device_path_
,
256 &fake_delegate_listen_
);
258 DBusThreadManager::Get()->GetBluetoothDeviceClient()->ConnectProfile(
259 dbus::ObjectPath(FakeBluetoothDeviceClient::kPairedDevicePath
),
260 FakeBluetoothProfileManagerClient::kRfcommUuid
,
262 &BluetoothAdapterProfileChromeOSTest::DBusConnectSuccessCallback
,
263 base::Unretained(this)),
264 base::Bind(&BluetoothAdapterProfileChromeOSTest::DBusErrorCallback
,
265 base::Unretained(this)));
267 message_loop_
.RunUntilIdle();
269 EXPECT_EQ(2U, success_callback_count_
);
270 EXPECT_EQ(0U, error_callback_count_
);
272 EXPECT_EQ(1U, fake_delegate_paired_
.connections_
);
274 DBusThreadManager::Get()->GetBluetoothDeviceClient()->ConnectProfile(
275 dbus::ObjectPath(FakeBluetoothDeviceClient::kLegacyAutopairPath
),
276 FakeBluetoothProfileManagerClient::kRfcommUuid
,
278 &BluetoothAdapterProfileChromeOSTest::DBusConnectSuccessCallback
,
279 base::Unretained(this)),
280 base::Bind(&BluetoothAdapterProfileChromeOSTest::DBusErrorCallback
,
281 base::Unretained(this)));
283 message_loop_
.RunUntilIdle();
285 EXPECT_EQ(3U, success_callback_count_
);
286 EXPECT_EQ(0U, error_callback_count_
);
288 EXPECT_EQ(1U, fake_delegate_autopair_
.connections_
);
290 // Incoming connections look the same from BlueZ.
291 DBusThreadManager::Get()->GetBluetoothDeviceClient()->ConnectProfile(
292 dbus::ObjectPath(FakeBluetoothDeviceClient::kDisplayPinCodePath
),
293 FakeBluetoothProfileManagerClient::kRfcommUuid
,
295 &BluetoothAdapterProfileChromeOSTest::DBusConnectSuccessCallback
,
296 base::Unretained(this)),
297 base::Bind(&BluetoothAdapterProfileChromeOSTest::DBusErrorCallback
,
298 base::Unretained(this)));
300 message_loop_
.RunUntilIdle();
302 EXPECT_EQ(4U, success_callback_count_
);
303 EXPECT_EQ(0U, error_callback_count_
);
305 EXPECT_EQ(1U, fake_delegate_listen_
.connections_
);
308 TEST_F(BluetoothAdapterProfileChromeOSTest
, SimultaneousRegister
) {
309 BluetoothUUID
uuid(FakeBluetoothProfileManagerClient::kRfcommUuid
);
310 BluetoothProfileManagerClient::Options options
;
311 BluetoothAdapterChromeOS
* adapter
=
312 static_cast<BluetoothAdapterChromeOS
*>(adapter_
.get());
314 options
.require_authentication
.reset(new bool(false));
316 success_callback_count_
= 0;
317 error_callback_count_
= 0;
320 uuid
, fake_delegate_paired_
.device_path_
, options
, &fake_delegate_paired_
,
322 &BluetoothAdapterProfileChromeOSTest::ProfileUserSuccessCallback
,
323 base::Unretained(this)),
324 base::Bind(&BluetoothAdapterProfileChromeOSTest::BasicErrorCallback
,
325 base::Unretained(this)));
328 uuid
, fake_delegate_autopair_
.device_path_
, options
,
329 &fake_delegate_autopair_
,
330 base::Bind(&BluetoothAdapterProfileChromeOSTest::MatchedProfileCallback
,
331 base::Unretained(this)),
332 base::Bind(&BluetoothAdapterProfileChromeOSTest::BasicErrorCallback
,
333 base::Unretained(this)));
335 message_loop_
.RunUntilIdle();
337 EXPECT_TRUE(profile_user_ptr_
);
338 EXPECT_EQ(2U, success_callback_count_
);
339 EXPECT_EQ(0U, error_callback_count_
);
341 adapter
->ReleaseProfile(fake_delegate_paired_
.device_path_
,
343 adapter
->ReleaseProfile(fake_delegate_autopair_
.device_path_
,
346 message_loop_
.RunUntilIdle();
349 TEST_F(BluetoothAdapterProfileChromeOSTest
, SimultaneousRegisterFail
) {
350 BluetoothUUID
uuid(FakeBluetoothProfileManagerClient::kUnregisterableUuid
);
351 BluetoothProfileManagerClient::Options options
;
352 BluetoothAdapterChromeOS
* adapter
=
353 static_cast<BluetoothAdapterChromeOS
*>(adapter_
.get());
355 options
.require_authentication
.reset(new bool(false));
357 success_callback_count_
= 0;
358 error_callback_count_
= 0;
361 uuid
, fake_delegate_paired_
.device_path_
, options
, &fake_delegate_paired_
,
363 &BluetoothAdapterProfileChromeOSTest::ProfileUserSuccessCallback
,
364 base::Unretained(this)),
365 base::Bind(&BluetoothAdapterProfileChromeOSTest::BasicErrorCallback
,
366 base::Unretained(this)));
369 uuid
, fake_delegate_autopair_
.device_path_
, options
,
370 &fake_delegate_autopair_
,
371 base::Bind(&BluetoothAdapterProfileChromeOSTest::MatchedProfileCallback
,
372 base::Unretained(this)),
373 base::Bind(&BluetoothAdapterProfileChromeOSTest::BasicErrorCallback
,
374 base::Unretained(this)));
376 message_loop_
.RunUntilIdle();
378 EXPECT_FALSE(profile_user_ptr_
);
379 EXPECT_EQ(0U, success_callback_count_
);
380 EXPECT_EQ(2U, error_callback_count_
);
383 } // namespace chromeos