1 // Copyright 2023 The Pigweed Authors
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License"); you may not
4 // use this file except in compliance with the License. You may obtain a copy of
5 // the License at
6 //
7 // https://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11 // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12 // License for the specific language governing permissions and limitations under
13 // the License.
14
15 #include "pw_bluetooth_sapphire/internal/host/gap/adapter.h"
16
17 #include <memory>
18
19 #include "pw_bluetooth_sapphire/internal/host/gap/bredr_discovery_manager.h"
20 #include "pw_bluetooth_sapphire/internal/host/gap/low_energy_address_manager.h"
21 #include "pw_bluetooth_sapphire/internal/host/gap/low_energy_advertising_manager.h"
22 #include "pw_bluetooth_sapphire/internal/host/gap/low_energy_discovery_manager.h"
23 #include "pw_bluetooth_sapphire/internal/host/gatt/fake_layer.h"
24 #include "pw_bluetooth_sapphire/internal/host/hci-spec/util.h"
25 #include "pw_bluetooth_sapphire/internal/host/l2cap/fake_l2cap.h"
26 #include "pw_bluetooth_sapphire/internal/host/testing/controller_test.h"
27 #include "pw_bluetooth_sapphire/internal/host/testing/fake_controller.h"
28 #include "pw_bluetooth_sapphire/internal/host/testing/fake_peer.h"
29 #include "pw_bluetooth_sapphire/internal/host/testing/inspect.h"
30
31 namespace bt::gap {
32 namespace {
33
34 using namespace inspect::testing;
35 using testing::FakeController;
36 using testing::FakePeer;
37 using TestingBase = testing::FakeDispatcherControllerTest<FakeController>;
38
39 using FeaturesBits = pw::bluetooth::Controller::FeaturesBits;
40
41 const DeviceAddress kTestAddr(DeviceAddress::Type::kLEPublic,
42 {0x01, 0, 0, 0, 0, 0});
43 const DeviceAddress kTestAddr2(DeviceAddress::Type::kLEPublic,
44 {2, 0, 0, 0, 0, 0});
45 const DeviceAddress kTestAddrBrEdr(DeviceAddress::Type::kBREDR,
46 {3, 0, 0, 0, 0, 0});
47
48 constexpr FeaturesBits kDefaultFeaturesBits =
49 FeaturesBits::kHciSco | FeaturesBits::kSetAclPriorityCommand;
50
51 class AdapterTest : public TestingBase {
52 public:
53 AdapterTest() = default;
54 ~AdapterTest() override = default;
55
SetUp()56 void SetUp() override { SetUp(kDefaultFeaturesBits); }
57
SetUp(FeaturesBits features)58 void SetUp(FeaturesBits features) {
59 // Don't initialize Transport yet because Adapter initializes Transport.
60 TestingBase::SetUp(features, /*initialize_transport=*/false);
61
62 transport_closed_called_ = false;
63
64 auto l2cap = std::make_unique<l2cap::testing::FakeL2cap>(dispatcher());
65 gatt_ = std::make_unique<gatt::testing::FakeLayer>(dispatcher());
66 adapter_ = Adapter::Create(dispatcher(),
67 transport()->GetWeakPtr(),
68 gatt_->GetWeakPtr(),
69 std::move(l2cap));
70 }
71
TearDown()72 void TearDown() override {
73 if (adapter_->IsInitialized()) {
74 adapter_->ShutDown();
75 }
76
77 adapter_ = nullptr;
78 gatt_ = nullptr;
79 TestingBase::TearDown();
80 }
81
InitializeAdapter(Adapter::InitializeCallback callback)82 void InitializeAdapter(Adapter::InitializeCallback callback) {
83 adapter_->Initialize(std::move(callback),
84 [this] { transport_closed_called_ = true; });
85 RunUntilIdle();
86 }
87
EnsureInitialized()88 bool EnsureInitialized() {
89 bool initialized = false;
90 InitializeAdapter([&](bool success) {
91 EXPECT_TRUE(success);
92 initialized = true;
93 });
94 return initialized;
95 }
96
97 protected:
transport_closed_called() const98 bool transport_closed_called() const { return transport_closed_called_; }
99
adapter() const100 Adapter* adapter() const { return adapter_.get(); }
101
102 private:
103 bool transport_closed_called_;
104 std::unique_ptr<gatt::testing::FakeLayer> gatt_;
105 std::unique_ptr<Adapter> adapter_;
106
107 BT_DISALLOW_COPY_AND_ASSIGN_ALLOW_MOVE(AdapterTest);
108 };
109
110 class AdapterScoDisabledTest : public AdapterTest {
111 public:
SetUp()112 void SetUp() override { AdapterTest::SetUp(FeaturesBits{0}); }
113 };
114
TEST_F(AdapterTest,InitializeFailureNoFeaturesSupported)115 TEST_F(AdapterTest, InitializeFailureNoFeaturesSupported) {
116 bool success;
117 int init_cb_count = 0;
118 auto init_cb = [&](bool cb_success) {
119 success = cb_success;
120 init_cb_count++;
121 };
122
123 // The controller supports nothing.
124 InitializeAdapter(std::move(init_cb));
125 EXPECT_FALSE(success);
126 EXPECT_EQ(1, init_cb_count);
127 EXPECT_FALSE(transport_closed_called());
128 }
129
TEST_F(AdapterTest,InitializeFailureNoBufferInfo)130 TEST_F(AdapterTest, InitializeFailureNoBufferInfo) {
131 bool success;
132 int init_cb_count = 0;
133 auto init_cb = [&](bool cb_success) {
134 success = cb_success;
135 init_cb_count++;
136 };
137
138 // Enable LE support.
139 FakeController::Settings settings;
140 settings.lmp_features_page0 |=
141 static_cast<uint64_t>(hci_spec::LMPFeature::kLESupportedHost);
142 test_device()->set_settings(settings);
143
144 InitializeAdapter(std::move(init_cb));
145 EXPECT_FALSE(success);
146 EXPECT_EQ(1, init_cb_count);
147 EXPECT_FALSE(transport_closed_called());
148 }
149
TEST_F(AdapterTest,InitializeNoBREDR)150 TEST_F(AdapterTest, InitializeNoBREDR) {
151 bool success;
152 int init_cb_count = 0;
153 auto init_cb = [&](bool cb_success) {
154 success = cb_success;
155 init_cb_count++;
156 };
157
158 // Enable LE support, disable BR/EDR
159 FakeController::Settings settings;
160 settings.lmp_features_page0 |=
161 static_cast<uint64_t>(hci_spec::LMPFeature::kLESupportedHost);
162 settings.lmp_features_page0 |=
163 static_cast<uint64_t>(hci_spec::LMPFeature::kBREDRNotSupported);
164 settings.le_acl_data_packet_length = 5;
165 settings.le_total_num_acl_data_packets = 1;
166 test_device()->set_settings(settings);
167
168 InitializeAdapter(std::move(init_cb));
169 EXPECT_TRUE(success);
170 EXPECT_EQ(1, init_cb_count);
171 EXPECT_TRUE(adapter()->state().IsLowEnergySupported());
172 EXPECT_FALSE(adapter()->state().IsBREDRSupported());
173 EXPECT_FALSE(adapter()->bredr());
174 EXPECT_EQ(TechnologyType::kLowEnergy, adapter()->state().type());
175 EXPECT_FALSE(transport_closed_called());
176 }
177
TEST_F(AdapterTest,InitializeQueriesAndroidExtensionsCapabilitiesIfSupported)178 TEST_F(AdapterTest, InitializeQueriesAndroidExtensionsCapabilitiesIfSupported) {
179 TearDown();
180 SetUp(FeaturesBits::kAndroidVendorExtensions);
181
182 bool success;
183 int init_cb_count = 0;
184 auto init_cb = [&](bool cb_success) {
185 success = cb_success;
186 init_cb_count++;
187 };
188
189 FakeController::Settings settings;
190 settings.ApplyLEOnlyDefaults();
191 settings.ApplyAndroidVendorExtensionDefaults();
192 test_device()->set_settings(settings);
193
194 InitializeAdapter(std::move(init_cb));
195 EXPECT_TRUE(success);
196 EXPECT_EQ(1, init_cb_count);
197 EXPECT_TRUE(adapter()->state().android_vendor_capabilities.IsInitialized());
198 }
199
TEST_F(AdapterTest,InitializeQueryAndroidExtensionsCapabilitiesFailureHandled)200 TEST_F(AdapterTest,
201 InitializeQueryAndroidExtensionsCapabilitiesFailureHandled) {
202 TearDown();
203 SetUp(FeaturesBits::kAndroidVendorExtensions);
204
205 bool success;
206 int init_cb_count = 0;
207 auto init_cb = [&](bool cb_success) {
208 success = cb_success;
209 init_cb_count++;
210 };
211
212 FakeController::Settings settings;
213 settings.ApplyLEOnlyDefaults();
214 settings.ApplyAndroidVendorExtensionDefaults();
215 test_device()->set_settings(settings);
216
217 test_device()->SetDefaultResponseStatus(
218 hci_android::kLEGetVendorCapabilities,
219 pw::bluetooth::emboss::StatusCode::COMMAND_DISALLOWED);
220 InitializeAdapter(std::move(init_cb));
221 EXPECT_FALSE(success);
222 EXPECT_EQ(1, init_cb_count);
223 EXPECT_FALSE(adapter()->state().android_vendor_capabilities.IsInitialized());
224 }
225
TEST_F(AdapterTest,InitializeSuccess)226 TEST_F(AdapterTest, InitializeSuccess) {
227 bool success;
228 int init_cb_count = 0;
229 auto init_cb = [&](bool cb_success) {
230 success = cb_success;
231 init_cb_count++;
232 };
233
234 // Return valid buffer information and enable LE support. (This should
235 // succeed).
236 FakeController::Settings settings;
237 settings.lmp_features_page0 |=
238 static_cast<uint64_t>(hci_spec::LMPFeature::kLESupportedHost);
239 settings.le_acl_data_packet_length = 5;
240 settings.le_total_num_acl_data_packets = 1;
241 test_device()->set_settings(settings);
242
243 InitializeAdapter(std::move(init_cb));
244 EXPECT_TRUE(success);
245 EXPECT_EQ(1, init_cb_count);
246 EXPECT_TRUE(adapter()->state().IsLowEnergySupported());
247 EXPECT_TRUE(adapter()->state().IsBREDRSupported());
248 EXPECT_TRUE(adapter()->le());
249 EXPECT_TRUE(adapter()->bredr());
250 EXPECT_EQ(TechnologyType::kDualMode, adapter()->state().type());
251 EXPECT_FALSE(transport_closed_called());
252 }
253
TEST_F(AdapterTest,InitializeFailureHCICommandError)254 TEST_F(AdapterTest, InitializeFailureHCICommandError) {
255 bool success;
256 int init_cb_count = 0;
257 auto init_cb = [&](bool cb_success) {
258 success = cb_success;
259 init_cb_count++;
260 };
261
262 // Make all settings valid but make an HCI command fail.
263 FakeController::Settings settings;
264 settings.ApplyLEOnlyDefaults();
265 test_device()->set_settings(settings);
266 test_device()->SetDefaultResponseStatus(
267 hci_spec::kLEReadLocalSupportedFeatures,
268 pw::bluetooth::emboss::StatusCode::HARDWARE_FAILURE);
269
270 InitializeAdapter(std::move(init_cb));
271 EXPECT_FALSE(success);
272 EXPECT_EQ(1, init_cb_count);
273 EXPECT_FALSE(adapter()->state().IsLowEnergySupported());
274 EXPECT_FALSE(transport_closed_called());
275 }
276
TEST_F(AdapterTest,InitializeFailureTransportErrorDuringWriteLocalName)277 TEST_F(AdapterTest, InitializeFailureTransportErrorDuringWriteLocalName) {
278 std::optional<bool> success;
279 int init_cb_count = 0;
280 auto init_cb = [&](bool cb_success) {
281 success = cb_success;
282 init_cb_count++;
283 };
284
285 // Make all settings valid but make an HCI command fail.
286 FakeController::Settings settings;
287 settings.ApplyDualModeDefaults();
288 test_device()->set_settings(settings);
289 fit::closure resume_write_local_name_cb = nullptr;
290 test_device()->pause_responses_for_opcode(
291 hci_spec::kWriteLocalName, [&](fit::closure resume) {
292 resume_write_local_name_cb = std::move(resume);
293 });
294
295 InitializeAdapter(std::move(init_cb));
296 ASSERT_TRUE(resume_write_local_name_cb);
297 EXPECT_EQ(0, init_cb_count);
298
299 // Signaling an error should cause Transport to close, which should cause
300 // initialization to fail.
301 test_device()->SignalError(pw::Status::Unknown());
302 ASSERT_TRUE(success.has_value());
303 EXPECT_FALSE(*success);
304 EXPECT_EQ(1, init_cb_count);
305 EXPECT_FALSE(transport_closed_called());
306 }
307
TEST_F(AdapterTest,TransportClosedCallback)308 TEST_F(AdapterTest, TransportClosedCallback) {
309 bool success;
310 int init_cb_count = 0;
311 auto init_cb = [&](bool cb_success) {
312 success = cb_success;
313 init_cb_count++;
314 };
315
316 FakeController::Settings settings;
317 settings.ApplyLEOnlyDefaults();
318 test_device()->set_settings(settings);
319
320 InitializeAdapter(std::move(init_cb));
321 EXPECT_TRUE(success);
322 EXPECT_EQ(1, init_cb_count);
323 EXPECT_TRUE(adapter()->state().IsLowEnergySupported());
324 EXPECT_FALSE(transport_closed_called());
325
326 test_device()->SignalError(pw::Status::Aborted());
327 RunUntilIdle();
328
329 EXPECT_TRUE(transport_closed_called());
330 EXPECT_EQ(1, init_cb_count);
331 }
332
333 // TODO(fxbug.dev/42088281): Add a unit test for Adapter::ShutDown() and update
334 // ShutDownDuringInitialize() with the same expectations.
335
TEST_F(AdapterTest,ShutDownDuringInitialize)336 TEST_F(AdapterTest, ShutDownDuringInitialize) {
337 bool success;
338 int init_cb_count = 0;
339 auto init_cb = [&](bool result) {
340 success = result;
341 init_cb_count++;
342 };
343
344 FakeController::Settings settings;
345 settings.ApplyLEOnlyDefaults();
346 test_device()->set_settings(settings);
347
348 adapter()->Initialize(std::move(init_cb), [] {});
349 EXPECT_TRUE(adapter()->IsInitializing());
350 adapter()->ShutDown();
351
352 EXPECT_EQ(1, init_cb_count);
353 EXPECT_FALSE(success);
354 EXPECT_FALSE(adapter()->IsInitializing());
355 EXPECT_FALSE(adapter()->IsInitialized());
356
357 // Further calls to ShutDown() should have no effect.
358 adapter()->ShutDown();
359 RunUntilIdle();
360 }
361
TEST_F(AdapterTest,SetNameError)362 TEST_F(AdapterTest, SetNameError) {
363 std::string kNewName = "something";
364
365 // Make all settings valid but make WriteLocalName command fail.
366 FakeController::Settings settings;
367 settings.ApplyDualModeDefaults();
368 test_device()->set_settings(settings);
369 test_device()->SetDefaultResponseStatus(
370 hci_spec::kWriteLocalName,
371 pw::bluetooth::emboss::StatusCode::HARDWARE_FAILURE);
372 ASSERT_TRUE(EnsureInitialized());
373
374 hci::Result<> result = fit::ok();
375 auto name_cb = [&result](const auto& status) { result = status; };
376
377 adapter()->SetLocalName(kNewName, name_cb);
378
379 RunUntilIdle();
380
381 EXPECT_EQ(ToResult(pw::bluetooth::emboss::StatusCode::HARDWARE_FAILURE),
382 result);
383 }
384
TEST_F(AdapterTest,SetNameSuccess)385 TEST_F(AdapterTest, SetNameSuccess) {
386 const std::string kNewName = "Fuchsia BT ✨";
387
388 FakeController::Settings settings;
389 settings.ApplyDualModeDefaults();
390 test_device()->set_settings(settings);
391 ASSERT_TRUE(EnsureInitialized());
392
393 hci::Result<> result = ToResult(HostError::kFailed);
394 auto name_cb = [&result](const auto& status) { result = status; };
395 adapter()->SetLocalName(kNewName, name_cb);
396
397 RunUntilIdle();
398
399 EXPECT_EQ(fit::ok(), result);
400 EXPECT_EQ(kNewName, test_device()->local_name());
401 }
402
403 // Tests that writing a local name that is larger than the maximum size
404 // succeeds. The saved local name is the original (untruncated) local name.
TEST_F(AdapterTest,SetNameLargerThanMax)405 TEST_F(AdapterTest, SetNameLargerThanMax) {
406 const std::string long_name(hci_spec::kMaxNameLength + 1, 'x');
407
408 FakeController::Settings settings;
409 settings.ApplyDualModeDefaults();
410 test_device()->set_settings(settings);
411 ASSERT_TRUE(EnsureInitialized());
412
413 hci::Result<> result = ToResult(HostError::kFailed);
414 auto name_cb = [&result](const auto& status) { result = status; };
415 adapter()->SetLocalName(long_name, name_cb);
416
417 RunUntilIdle();
418
419 EXPECT_EQ(fit::ok(), result);
420 EXPECT_EQ(long_name, adapter()->state().local_name);
421 }
422
423 // Tests that SetLocalName results in BrEdrDiscoveryManager updating it's local
424 // name.
TEST_F(AdapterTest,SetLocalNameCallsBrEdrUpdateLocalName)425 TEST_F(AdapterTest, SetLocalNameCallsBrEdrUpdateLocalName) {
426 const std::string kNewName = "This is a test BT name! 1234";
427
428 FakeController::Settings settings;
429 settings.ApplyDualModeDefaults();
430 test_device()->set_settings(settings);
431 ASSERT_TRUE(EnsureInitialized());
432 ASSERT_TRUE(adapter()->bredr());
433
434 hci::Result<> result = ToResult(HostError::kFailed);
435 auto name_cb = [&result](const auto& status) { result = status; };
436 adapter()->SetLocalName(kNewName, name_cb);
437
438 RunUntilIdle();
439
440 EXPECT_EQ(fit::ok(), result);
441 EXPECT_EQ(kNewName, adapter()->state().local_name);
442 EXPECT_EQ(kNewName, adapter()->local_name());
443 }
444
445 // Tests that writing a long local name results in BrEdr updating it's local
446 // name. Should still succeed, and the stored local name should be the original
447 // name.
TEST_F(AdapterTest,BrEdrUpdateLocalNameLargerThanMax)448 TEST_F(AdapterTest, BrEdrUpdateLocalNameLargerThanMax) {
449 const std::string long_name(
450 hci_spec::kExtendedInquiryResponseMaxNameBytes + 2, 'x');
451
452 FakeController::Settings settings;
453 settings.ApplyDualModeDefaults();
454 test_device()->set_settings(settings);
455 ASSERT_TRUE(EnsureInitialized());
456 EXPECT_TRUE(adapter()->bredr());
457
458 hci::Result<> result = ToResult(HostError::kFailed);
459 auto name_cb = [&result](const auto& status) { result = status; };
460 adapter()->SetLocalName(long_name, name_cb);
461
462 RunUntilIdle();
463
464 EXPECT_EQ(fit::ok(), result);
465 // Both the adapter & discovery manager local name should be the original
466 // (untruncated) name.
467 EXPECT_EQ(long_name, adapter()->state().local_name);
468 EXPECT_EQ(long_name, adapter()->local_name());
469 }
470
471 // Tests WriteExtendedInquiryResponse failure leads to |local_name_| not
472 // updated.
TEST_F(AdapterTest,BrEdrUpdateEIRResponseError)473 TEST_F(AdapterTest, BrEdrUpdateEIRResponseError) {
474 std::string kNewName = "EirFailure";
475
476 // Make all settings valid but make WriteExtendedInquiryResponse command fail.
477 FakeController::Settings settings;
478 settings.ApplyDualModeDefaults();
479 test_device()->set_settings(settings);
480 test_device()->SetDefaultResponseStatus(
481 hci_spec::kWriteExtendedInquiryResponse,
482 pw::bluetooth::emboss::StatusCode::CONNECTION_TERMINATED_BY_LOCAL_HOST);
483 ASSERT_TRUE(EnsureInitialized());
484
485 hci::Result<> result = fit::ok();
486 auto name_cb = [&result](const auto& status) { result = status; };
487
488 adapter()->SetLocalName(kNewName, name_cb);
489
490 RunUntilIdle();
491
492 // kWriteLocalName will succeed, but kWriteExtendedInquiryResponse will fail
493 EXPECT_EQ(ToResult(pw::bluetooth::emboss::StatusCode::
494 CONNECTION_TERMINATED_BY_LOCAL_HOST),
495 result);
496 // The |local_name_| should not be set.
497 EXPECT_NE(kNewName, adapter()->state().local_name);
498 EXPECT_NE(kNewName, adapter()->local_name());
499 }
500
TEST_F(AdapterTest,DefaultName)501 TEST_F(AdapterTest, DefaultName) {
502 FakeController::Settings settings;
503 settings.ApplyDualModeDefaults();
504 test_device()->set_settings(settings);
505
506 bool initialized = false;
507 InitializeAdapter([&](bool success) {
508 // Ensure that the local name has been written to the controller when
509 // initialization has completed.
510 EXPECT_TRUE(success);
511 EXPECT_EQ(kDefaultLocalName, test_device()->local_name());
512 EXPECT_EQ(kDefaultLocalName, adapter()->state().local_name);
513
514 initialized = true;
515 });
516
517 EXPECT_TRUE(initialized);
518 }
519
TEST_F(AdapterTest,PeerCacheReturnsNonNull)520 TEST_F(AdapterTest, PeerCacheReturnsNonNull) {
521 EXPECT_TRUE(adapter()->peer_cache());
522 }
523
TEST_F(AdapterTest,LeAutoConnect)524 TEST_F(AdapterTest, LeAutoConnect) {
525 constexpr pw::chrono::SystemClock::duration kTestScanPeriod =
526 std::chrono::seconds(10);
527 constexpr PeerId kPeerId(1234);
528
529 FakeController::Settings settings;
530 settings.ApplyLEOnlyDefaults();
531 test_device()->set_settings(settings);
532
533 InitializeAdapter([](bool) {});
534 adapter()->le()->set_scan_period_for_testing(kTestScanPeriod);
535
536 auto fake_peer =
537 std::make_unique<FakePeer>(kTestAddr, dispatcher(), true, false);
538 fake_peer->set_directed_advertising_enabled(true);
539 test_device()->AddPeer(std::move(fake_peer));
540
541 std::unique_ptr<bt::gap::LowEnergyConnectionHandle> conn;
542 adapter()->set_auto_connect_callback(
543 [&](auto conn_ref) { conn = std::move(conn_ref); });
544
545 // Enable background scanning. No auto-connect should take place since the
546 // device isn't yet bonded.
547 std::unique_ptr<LowEnergyDiscoverySession> session;
548 adapter()->le()->StartDiscovery(
549 /*active=*/false,
550 [&session](auto cb_session) { session = std::move(cb_session); });
551 RunUntilIdle();
552 EXPECT_FALSE(conn);
553 EXPECT_EQ(0u, adapter()->peer_cache()->count());
554
555 // Mark the peer as bonded and advance the scan period.
556 sm::PairingData pdata;
557 pdata.peer_ltk = sm::LTK();
558 pdata.local_ltk = sm::LTK();
559 adapter()->peer_cache()->AddBondedPeer(
560 BondingData{.identifier = kPeerId,
561 .address = kTestAddr,
562 .name = std::nullopt,
563 .le_pairing_data = pdata,
564 .bredr_link_key = std::nullopt,
565 .bredr_services = {}});
566 EXPECT_EQ(1u, adapter()->peer_cache()->count());
567
568 // FakeController only sends advertising reports at the start of scan periods,
569 // so we need to start a second period.
570 RunFor(kTestScanPeriod);
571
572 // The peer should have been auto-connected.
573 ASSERT_TRUE(conn);
574 EXPECT_EQ(kPeerId, conn->peer_identifier());
575 }
576
TEST_F(AdapterTest,LeSkipAutoConnectBehavior)577 TEST_F(AdapterTest, LeSkipAutoConnectBehavior) {
578 constexpr pw::chrono::SystemClock::duration kTestScanPeriod =
579 std::chrono::seconds(10);
580 constexpr PeerId kPeerId(1234);
581
582 FakeController::Settings settings;
583 settings.ApplyLEOnlyDefaults();
584 test_device()->set_settings(settings);
585
586 InitializeAdapter([](bool) {});
587 adapter()->le()->set_scan_period_for_testing(kTestScanPeriod);
588
589 auto fake_peer =
590 std::make_unique<FakePeer>(kTestAddr, dispatcher(), true, false);
591 fake_peer->set_directed_advertising_enabled(true);
592 test_device()->AddPeer(std::move(fake_peer));
593
594 std::unique_ptr<bt::gap::LowEnergyConnectionHandle> conn;
595 adapter()->set_auto_connect_callback(
596 [&](auto conn_ref) { conn = std::move(conn_ref); });
597
598 // Enable background scanning. No auto-connect should take place since the
599 // device isn't yet bonded.
600 std::unique_ptr<LowEnergyDiscoverySession> session;
601 adapter()->le()->StartDiscovery(
602 /*active=*/false,
603 [&session](auto cb_session) { session = std::move(cb_session); });
604 RunUntilIdle();
605 EXPECT_FALSE(conn);
606 EXPECT_EQ(0u, adapter()->peer_cache()->count());
607
608 // Mark the peer as bonded.
609 sm::PairingData pdata;
610 pdata.peer_ltk = sm::LTK();
611 pdata.local_ltk = sm::LTK();
612 adapter()->peer_cache()->AddBondedPeer(
613 BondingData{.identifier = kPeerId,
614 .address = kTestAddr,
615 .name = std::nullopt,
616 .le_pairing_data = pdata,
617 .bredr_link_key = std::nullopt,
618 .bredr_services = {}});
619 EXPECT_EQ(1u, adapter()->peer_cache()->count());
620
621 // Fake a manual disconnect to skip auto-connect behavior.
622 adapter()->peer_cache()->SetAutoConnectBehaviorForIntentionalDisconnect(
623 kPeerId);
624
625 // Advance the scan period.
626 RunFor(kTestScanPeriod);
627
628 // The peer should NOT have been auto-connected.
629 ASSERT_FALSE(conn);
630
631 // The peer should still not auto-connect after a subsequent scan period.
632 RunFor(kTestScanPeriod);
633 ASSERT_FALSE(conn);
634
635 // Fake a manual connection to reset auto-connect behavior.
636 adapter()->peer_cache()->SetAutoConnectBehaviorForSuccessfulConnection(
637 kPeerId);
638
639 // Advance the scan period.
640 RunFor(kTestScanPeriod);
641
642 // The peer SHOULD have been auto-connected.
643 ASSERT_TRUE(conn);
644 EXPECT_EQ(kPeerId, conn->peer_identifier());
645 }
646
647 // Tests the interactions between the advertising manager and the local address
648 // manager when the controller uses legacy advertising.
TEST_F(AdapterTest,LocalAddressForLegacyAdvertising)649 TEST_F(AdapterTest, LocalAddressForLegacyAdvertising) {
650 FakeController::Settings settings;
651 settings.ApplyLegacyLEConfig();
652 test_device()->set_settings(settings);
653 InitializeAdapter([](bool) {});
654
655 AdvertisementInstance instance;
656 auto adv_cb = [&](auto i, hci::Result<> status) {
657 instance = std::move(i);
658 EXPECT_EQ(fit::ok(), status);
659 };
660
661 // Advertising should use the public address by default.
662 adapter()->le()->StartAdvertising(AdvertisingData(),
663 AdvertisingData(),
664 AdvertisingInterval::FAST1,
665 /*anonymous=*/false,
666 /*include_tx_power_level=*/false,
667 /*connectable=*/std::nullopt,
668 adv_cb);
669 RunUntilIdle();
670 EXPECT_TRUE(test_device()->legacy_advertising_state().enabled);
671 EXPECT_EQ(pw::bluetooth::emboss::LEOwnAddressType::PUBLIC,
672 test_device()->legacy_advertising_state().own_address_type);
673
674 // Enable privacy. The random address should not get configured while
675 // advertising is in progress.
676 adapter()->le()->EnablePrivacy(true);
677 RunUntilIdle();
678 EXPECT_FALSE(test_device()->legacy_advertising_state().random_address);
679
680 // Stop advertising.
681 adapter()->le()->StopAdvertising(instance.id());
682 RunUntilIdle();
683 EXPECT_FALSE(test_device()->legacy_advertising_state().enabled);
684 EXPECT_FALSE(test_device()->legacy_advertising_state().random_address);
685
686 // Restart advertising. This should configure the LE random address and
687 // advertise using it.
688 adapter()->le()->StartAdvertising(AdvertisingData(),
689 AdvertisingData(),
690 AdvertisingInterval::FAST1,
691 /*anonymous=*/false,
692 /*include_tx_power_level=*/false,
693 /*connectable=*/std::nullopt,
694 adv_cb);
695 RunUntilIdle();
696 EXPECT_TRUE(test_device()->legacy_advertising_state().random_address);
697 EXPECT_TRUE(test_device()->legacy_advertising_state().enabled);
698 EXPECT_EQ(pw::bluetooth::emboss::LEOwnAddressType::RANDOM,
699 test_device()->legacy_advertising_state().own_address_type);
700
701 // Advance time to force the random address to refresh. The update should be
702 // deferred while advertising.
703 auto last_random_addr =
704 *test_device()->legacy_advertising_state().random_address;
705 RunFor(kPrivateAddressTimeout);
706 EXPECT_EQ(last_random_addr,
707 *test_device()->legacy_advertising_state().random_address);
708
709 // Restarting advertising should refresh the controller address.
710 adapter()->le()->StopAdvertising(instance.id());
711 adapter()->le()->StartAdvertising(AdvertisingData(),
712 AdvertisingData(),
713 AdvertisingInterval::FAST1,
714 /*anonymous=*/false,
715 /*include_tx_power_level=*/false,
716 /*connectable=*/std::nullopt,
717 adv_cb);
718 RunUntilIdle();
719 EXPECT_TRUE(test_device()->legacy_advertising_state().enabled);
720 EXPECT_EQ(pw::bluetooth::emboss::LEOwnAddressType::RANDOM,
721 test_device()->legacy_advertising_state().own_address_type);
722 EXPECT_TRUE(test_device()->legacy_advertising_state().random_address);
723 EXPECT_NE(last_random_addr,
724 test_device()->legacy_advertising_state().random_address);
725
726 // Disable privacy. The next time advertising gets started it should use a
727 // public address.
728 adapter()->le()->EnablePrivacy(false);
729 adapter()->le()->StopAdvertising(instance.id());
730 adapter()->le()->StartAdvertising(AdvertisingData(),
731 AdvertisingData(),
732 AdvertisingInterval::FAST1,
733 /*anonymous=*/false,
734 /*include_tx_power_level=*/false,
735 /*connectable=*/std::nullopt,
736 adv_cb);
737 RunUntilIdle();
738 EXPECT_TRUE(test_device()->legacy_advertising_state().enabled);
739 EXPECT_EQ(pw::bluetooth::emboss::LEOwnAddressType::PUBLIC,
740 test_device()->legacy_advertising_state().own_address_type);
741 }
742
743 // Tests the interactions between the discovery manager and the local address
744 // manager.
TEST_F(AdapterTest,LocalAddressForDiscovery)745 TEST_F(AdapterTest, LocalAddressForDiscovery) {
746 FakeController::Settings settings;
747 settings.ApplyLegacyLEConfig();
748 test_device()->set_settings(settings);
749 InitializeAdapter([](bool) {});
750
751 // Set a scan period that is longer than the private address timeout, for
752 // testing.
753 constexpr pw::chrono::SystemClock::duration kTestDelay =
754 std::chrono::seconds(5);
755 constexpr pw::chrono::SystemClock::duration kTestScanPeriod =
756 kPrivateAddressTimeout + kTestDelay;
757 adapter()->le()->set_scan_period_for_testing(kTestScanPeriod);
758
759 // Discovery should use the public address by default.
760 LowEnergyDiscoverySessionPtr session;
761 auto cb = [&](auto s) { session = std::move(s); };
762 adapter()->le()->StartDiscovery(/*active=*/true, cb);
763 RunUntilIdle();
764 ASSERT_TRUE(session);
765 EXPECT_TRUE(test_device()->le_scan_state().enabled);
766 EXPECT_EQ(pw::bluetooth::emboss::LEOwnAddressType::PUBLIC,
767 test_device()->le_scan_state().own_address_type);
768
769 // Enable privacy. The random address should not get configured while a scan
770 // is in progress.
771 adapter()->le()->EnablePrivacy(true);
772 RunUntilIdle();
773 EXPECT_FALSE(test_device()->legacy_advertising_state().random_address);
774
775 // Stop discovery.
776 session = nullptr;
777 RunUntilIdle();
778 EXPECT_FALSE(test_device()->le_scan_state().enabled);
779 EXPECT_FALSE(test_device()->legacy_advertising_state().random_address);
780
781 // Restart discovery. This should configure the LE random address and scan
782 // using it.
783 adapter()->le()->StartDiscovery(/*active=*/true, cb);
784 RunUntilIdle();
785 ASSERT_TRUE(session);
786 EXPECT_TRUE(test_device()->le_scan_state().enabled);
787 EXPECT_EQ(pw::bluetooth::emboss::LEOwnAddressType::RANDOM,
788 test_device()->le_scan_state().own_address_type);
789
790 // Advance time to force the random address to refresh. The update should be
791 // deferred while still scanning.
792 ASSERT_TRUE(test_device()->legacy_advertising_state().random_address);
793 auto last_random_addr =
794 *test_device()->legacy_advertising_state().random_address;
795 RunFor(kPrivateAddressTimeout);
796 EXPECT_EQ(last_random_addr,
797 *test_device()->legacy_advertising_state().random_address);
798
799 // Let the scan period expire. This should restart scanning and refresh the
800 // random address.
801 RunFor(kTestDelay);
802 EXPECT_TRUE(test_device()->le_scan_state().enabled);
803 EXPECT_EQ(pw::bluetooth::emboss::LEOwnAddressType::RANDOM,
804 test_device()->le_scan_state().own_address_type);
805 ASSERT_TRUE(test_device()->legacy_advertising_state().random_address);
806 EXPECT_NE(last_random_addr,
807 test_device()->legacy_advertising_state().random_address);
808
809 // Disable privacy. The next time scanning gets started it should use a
810 // public address.
811 adapter()->le()->EnablePrivacy(false);
812 RunFor(kTestScanPeriod);
813 EXPECT_TRUE(test_device()->le_scan_state().enabled);
814 EXPECT_EQ(pw::bluetooth::emboss::LEOwnAddressType::PUBLIC,
815 test_device()->le_scan_state().own_address_type);
816 }
817
TEST_F(AdapterTest,LocalAddressForConnections)818 TEST_F(AdapterTest, LocalAddressForConnections) {
819 FakeController::Settings settings;
820 settings.ApplyLegacyLEConfig();
821 test_device()->set_settings(settings);
822 InitializeAdapter([](bool) {});
823
824 // Set-up a device for testing.
825 auto* peer =
826 adapter()->peer_cache()->NewPeer(kTestAddr, /*connectable=*/true);
827 auto fake_peer = std::make_unique<FakePeer>(kTestAddr, dispatcher());
828 test_device()->AddPeer(std::move(fake_peer));
829
830 std::unique_ptr<bt::gap::LowEnergyConnectionHandle> conn_ref;
831 auto connect_cb = [&conn_ref](auto result) {
832 ASSERT_EQ(fit::ok(), result);
833 conn_ref = std::move(result).value();
834 };
835
836 // A connection request should use the public address by default.
837 adapter()->le()->Connect(
838 peer->identifier(), connect_cb, LowEnergyConnectionOptions());
839
840 // Enable privacy. The random address should not get configured while a
841 // connection attempt is in progress.
842 adapter()->le()->EnablePrivacy(true);
843 RunUntilIdle();
844 EXPECT_FALSE(test_device()->legacy_advertising_state().random_address);
845 ASSERT_TRUE(conn_ref);
846 ASSERT_TRUE(test_device()->le_connect_params());
847 EXPECT_EQ(pw::bluetooth::emboss::LEOwnAddressType::PUBLIC,
848 test_device()->le_connect_params()->own_address_type);
849
850 // Create a new connection. The second attempt should use a random address.
851 // re-enabled.
852 conn_ref = nullptr;
853 adapter()->le()->Connect(
854 peer->identifier(), connect_cb, LowEnergyConnectionOptions());
855 RunUntilIdle();
856 EXPECT_TRUE(test_device()->legacy_advertising_state().random_address);
857 ASSERT_TRUE(conn_ref);
858 ASSERT_TRUE(test_device()->le_connect_params());
859
860 // TODO(fxbug.dev/42141593): The current policy is to use a public address
861 // when initiating connections. Change this test to expect a random address
862 // once RPAs for central connections are re-enabled.
863 EXPECT_EQ(pw::bluetooth::emboss::LEOwnAddressType::PUBLIC,
864 test_device()->le_connect_params()->own_address_type);
865
866 // Disable privacy. The next connection attempt should use a public address.
867 adapter()->le()->EnablePrivacy(false);
868 conn_ref = nullptr;
869 adapter()->le()->Connect(
870 peer->identifier(), connect_cb, LowEnergyConnectionOptions());
871 RunUntilIdle();
872 EXPECT_EQ(pw::bluetooth::emboss::LEOwnAddressType::PUBLIC,
873 test_device()->le_connect_params()->own_address_type);
874 }
875
876 // Tests the deferral of random address configuration while a connection request
877 // is outstanding.
TEST_F(AdapterTest,LocalAddressDuringHangingConnect)878 TEST_F(AdapterTest, LocalAddressDuringHangingConnect) {
879 FakeController::Settings settings;
880 settings.ApplyLegacyLEConfig();
881 test_device()->set_settings(settings);
882 InitializeAdapter([](bool) {});
883
884 auto* peer =
885 adapter()->peer_cache()->NewPeer(kTestAddr, /*connectable=*/true);
886
887 // Cause scanning to succeed and the connection request to hang.
888 auto fake_peer = std::make_unique<FakePeer>(kTestAddr, dispatcher());
889 fake_peer->set_force_pending_connect(true);
890 test_device()->AddPeer(std::move(fake_peer));
891
892 constexpr pw::chrono::SystemClock::duration kTestDelay =
893 std::chrono::seconds(5);
894 constexpr pw::chrono::SystemClock::duration kTestTimeout =
895 kPrivateAddressTimeout + kTestDelay;
896
897 // Some of the behavior below stems from the fact that kTestTimeout is longer
898 // than kCacheTimeout. This assertion is here to catch regressions in this
899 // test if the values ever change.
900 // TODO(fxbug.dev/42087236): Configuring the cache expiration timeout
901 // explicitly would remove some of the unnecessary invariants from this test
902 // case.
903 static_assert(kTestTimeout > kCacheTimeout,
904 "expected a shorter device cache timeout");
905
906 adapter()->le()->set_request_timeout_for_testing(kTestTimeout);
907
908 // The connection request should use a public address.
909 std::optional<HostError> error;
910 int connect_cb_calls = 0;
911 auto connect_cb = [&error, &connect_cb_calls](auto result) {
912 connect_cb_calls++;
913 ASSERT_TRUE(result.is_error());
914 error = result.error_value();
915 };
916 adapter()->le()->Connect(
917 peer->identifier(), connect_cb, LowEnergyConnectionOptions());
918 RunUntilIdle();
919 ASSERT_TRUE(test_device()->le_connect_params());
920 EXPECT_EQ(pw::bluetooth::emboss::LEOwnAddressType::PUBLIC,
921 test_device()->le_connect_params()->own_address_type);
922
923 // Enable privacy. The random address should not get configured while a
924 // connection request is outstanding.
925 adapter()->le()->EnablePrivacy(true);
926 RunUntilIdle();
927 EXPECT_FALSE(test_device()->legacy_advertising_state().random_address);
928
929 // Let the connection request timeout.
930 RunFor(kTestTimeout);
931 ASSERT_TRUE(error.has_value());
932 EXPECT_EQ(HostError::kTimedOut, error.value())
933 << "Error: " << HostErrorToString(error.value());
934 EXPECT_EQ(1, connect_cb_calls);
935
936 // The peer should not have expired.
937 ASSERT_EQ(peer, adapter()->peer_cache()->FindByAddress(kTestAddr));
938 adapter()->le()->Connect(
939 peer->identifier(), connect_cb, LowEnergyConnectionOptions());
940 RunUntilIdle();
941 ASSERT_TRUE(test_device()->legacy_advertising_state().random_address);
942 // TODO(fxbug.dev/42141593): The current policy is to use a public address
943 // when initiating connections. Change this test to expect a random address
944 // once RPAs for central connections are re-enabled.
945 EXPECT_EQ(pw::bluetooth::emboss::LEOwnAddressType::PUBLIC,
946 test_device()->le_connect_params()->own_address_type);
947
948 // Advance the time to cause the random address to refresh. The update should
949 // be deferred while a connection request is outstanding.
950 auto last_random_addr =
951 *test_device()->legacy_advertising_state().random_address;
952 RunFor(kPrivateAddressTimeout);
953 EXPECT_EQ(last_random_addr,
954 *test_device()->legacy_advertising_state().random_address);
955
956 ASSERT_EQ(peer, adapter()->peer_cache()->FindByAddress(kTestAddr));
957
958 // The address should refresh after the pending request expires and before the
959 // next connection attempt.
960 RunFor(kTestDelay);
961 ASSERT_EQ(2, connect_cb_calls);
962
963 // This will be notified when LowEnergyConnectionManager is destroyed.
964 auto noop_connect_cb = [](auto) {};
965 adapter()->le()->Connect(peer->identifier(),
966 std::move(noop_connect_cb),
967 LowEnergyConnectionOptions());
968 RunUntilIdle();
969 EXPECT_NE(last_random_addr,
970 *test_device()->legacy_advertising_state().random_address);
971 // TODO(fxbug.dev/42141593): The current policy is to use a public address
972 // when initiating connections. Change this test to expect a random address
973 // once RPAs for central connections are re-enabled.
974 EXPECT_EQ(pw::bluetooth::emboss::LEOwnAddressType::PUBLIC,
975 test_device()->le_connect_params()->own_address_type);
976 }
977
978 // Tests that existing connections don't prevent an address change.
TEST_F(AdapterTest,ExistingConnectionDoesNotPreventLocalAddressChange)979 TEST_F(AdapterTest, ExistingConnectionDoesNotPreventLocalAddressChange) {
980 FakeController::Settings settings;
981 settings.ApplyLegacyLEConfig();
982 test_device()->set_settings(settings);
983 InitializeAdapter([](bool) {});
984
985 adapter()->le()->EnablePrivacy(true);
986
987 std::unique_ptr<bt::gap::LowEnergyConnectionHandle> conn_ref;
988 auto connect_cb = [&](auto result) {
989 ASSERT_EQ(fit::ok(), result);
990 conn_ref = std::move(result).value();
991 ASSERT_TRUE(conn_ref);
992 };
993
994 auto* peer =
995 adapter()->peer_cache()->NewPeer(kTestAddr, /*connectable=*/true);
996 auto fake_peer = std::make_unique<FakePeer>(kTestAddr, dispatcher());
997 test_device()->AddPeer(std::move(fake_peer));
998 adapter()->le()->Connect(
999 peer->identifier(), connect_cb, LowEnergyConnectionOptions());
1000 RunUntilIdle();
1001 // TODO(fxbug.dev/42141593): The current policy is to use a public address
1002 // when initiating connections. Change this test to expect a random address
1003 // once RPAs for central connections are re-enabled.
1004 EXPECT_EQ(pw::bluetooth::emboss::LEOwnAddressType::PUBLIC,
1005 test_device()->le_connect_params()->own_address_type);
1006
1007 // Expire the private address. The address should refresh without interference
1008 // from the ongoing connection.
1009 ASSERT_TRUE(test_device()->legacy_advertising_state().random_address);
1010 auto last_random_addr =
1011 *test_device()->legacy_advertising_state().random_address;
1012 RunFor(kPrivateAddressTimeout);
1013 ASSERT_TRUE(test_device()->legacy_advertising_state().random_address);
1014 EXPECT_NE(last_random_addr,
1015 *test_device()->legacy_advertising_state().random_address);
1016 }
1017
TEST_F(AdapterTest,IsDiscoverableLowEnergy)1018 TEST_F(AdapterTest, IsDiscoverableLowEnergy) {
1019 FakeController::Settings settings;
1020 settings.ApplyLegacyLEConfig();
1021 test_device()->set_settings(settings);
1022 InitializeAdapter([](bool) {});
1023
1024 EXPECT_FALSE(adapter()->IsDiscoverable());
1025
1026 AdvertisementInstance instance;
1027 adapter()->le()->StartAdvertising(AdvertisingData(),
1028 AdvertisingData(),
1029 AdvertisingInterval::FAST1,
1030 /*anonymous=*/false,
1031 /*include_tx_power_level=*/false,
1032 /*connectable=*/std::nullopt,
1033 [&](AdvertisementInstance i, auto status) {
1034 ASSERT_EQ(fit::ok(), status);
1035 instance = std::move(i);
1036 });
1037 RunUntilIdle();
1038 EXPECT_TRUE(adapter()->IsDiscoverable());
1039
1040 instance = {};
1041 RunUntilIdle();
1042 EXPECT_FALSE(adapter()->IsDiscoverable());
1043 }
1044
TEST_F(AdapterTest,IsDiscoverableBredr)1045 TEST_F(AdapterTest, IsDiscoverableBredr) {
1046 FakeController::Settings settings;
1047 settings.ApplyDualModeDefaults();
1048 test_device()->set_settings(settings);
1049 InitializeAdapter([](bool) {});
1050
1051 EXPECT_FALSE(adapter()->IsDiscoverable());
1052
1053 std::unique_ptr<BrEdrDiscoverableSession> session;
1054 adapter()->bredr()->RequestDiscoverable(
1055 [&](auto, auto s) { session = std::move(s); });
1056 RunUntilIdle();
1057 EXPECT_TRUE(adapter()->IsDiscoverable());
1058
1059 session = nullptr;
1060 RunUntilIdle();
1061 EXPECT_FALSE(adapter()->IsDiscoverable());
1062 }
1063
TEST_F(AdapterTest,IsDiscoverableLowEnergyPrivacyEnabled)1064 TEST_F(AdapterTest, IsDiscoverableLowEnergyPrivacyEnabled) {
1065 FakeController::Settings settings;
1066 settings.ApplyLegacyLEConfig();
1067 test_device()->set_settings(settings);
1068 InitializeAdapter([](bool) {});
1069
1070 EXPECT_FALSE(adapter()->IsDiscoverable());
1071 adapter()->le()->EnablePrivacy(true);
1072 EXPECT_FALSE(adapter()->IsDiscoverable());
1073
1074 AdvertisementInstance instance;
1075 adapter()->le()->StartAdvertising(AdvertisingData(),
1076 AdvertisingData(),
1077 AdvertisingInterval::FAST1,
1078 /*anonymous=*/false,
1079 /*include_tx_power_level=*/false,
1080 /*connectable=*/std::nullopt,
1081 [&](AdvertisementInstance i, auto status) {
1082 ASSERT_EQ(fit::ok(), status);
1083 instance = std::move(i);
1084 });
1085 RunUntilIdle();
1086 // Even though we are advertising over LE, we are not discoverable since
1087 // Privacy is enabled.
1088 EXPECT_FALSE(adapter()->IsDiscoverable());
1089
1090 instance = {};
1091 RunUntilIdle();
1092 EXPECT_FALSE(adapter()->IsDiscoverable());
1093 }
1094
1095 #ifndef NINSPECT
TEST_F(AdapterTest,InspectHierarchy)1096 TEST_F(AdapterTest, InspectHierarchy) {
1097 inspect::Inspector inspector;
1098 auto bt_host_node = inspector.GetRoot().CreateChild("bt-host");
1099 adapter()->AttachInspect(bt_host_node, "adapter");
1100
1101 bool success;
1102 int init_cb_count = 0;
1103 auto init_cb = [&](bool cb_success) {
1104 success = cb_success;
1105 init_cb_count++;
1106 };
1107
1108 // Return valid buffer information and enable LE support. (This should
1109 // succeed).
1110 FakeController::Settings settings;
1111 settings.AddBREDRSupportedCommands();
1112 settings.lmp_features_page0 |=
1113 static_cast<uint64_t>(hci_spec::LMPFeature::kLESupportedHost);
1114 settings.le_acl_data_packet_length = 5;
1115 settings.le_total_num_acl_data_packets = 1;
1116 settings.synchronous_data_packet_length = 6;
1117 settings.total_num_synchronous_data_packets = 2;
1118 test_device()->set_settings(settings);
1119
1120 InitializeAdapter(std::move(init_cb));
1121 EXPECT_TRUE(success);
1122
1123 auto le_connection_manager_matcher =
1124 NodeMatches(NameMatches("low_energy_connection_manager"));
1125 auto bredr_connection_manager_matcher =
1126 NodeMatches(NameMatches("bredr_connection_manager"));
1127 auto peer_cache_matcher =
1128 NodeMatches(NameMatches(PeerCache::kInspectNodeName));
1129 auto sdp_server_matcher =
1130 NodeMatches(NameMatches(sdp::Server::kInspectNodeName));
1131 auto acl_data_channel_matcher =
1132 NodeMatches(NameMatches(hci::AclDataChannel::kInspectNodeName));
1133 auto le_matcher =
1134 AllOf(NodeMatches(AllOf(NameMatches("le"),
1135 PropertyList(UnorderedElementsAre(
1136 UintIs("outgoing_connection_requests", 0),
1137 UintIs("pair_requests", 0),
1138 UintIs("start_advertising_events", 0),
1139 UintIs("stop_advertising_events", 0),
1140 UintIs("start_discovery_events", 0))))));
1141 auto bredr_matcher =
1142 AllOf(NodeMatches(AllOf(NameMatches("bredr"),
1143 PropertyList(UnorderedElementsAre(
1144 UintIs("outgoing_connection_requests", 0),
1145 UintIs("pair_requests", 0),
1146 UintIs("set_connectable_true_events", 0),
1147 UintIs("set_connectable_false_events", 0),
1148 UintIs("request_discovery_events", 0),
1149 UintIs("request_discoverable_events", 0),
1150 UintIs("open_l2cap_channel_requests", 0))))));
1151 auto metrics_node_matcher =
1152 AllOf(NodeMatches(NameMatches(Adapter::kMetricsInspectNodeName)),
1153 ChildrenMatch(UnorderedElementsAre(bredr_matcher, le_matcher)));
1154 auto le_discovery_manager_matcher =
1155 NodeMatches(NameMatches("low_energy_discovery_manager"));
1156 auto bredr_discovery_manager_matcher =
1157 NodeMatches(NameMatches("bredr_discovery_manager"));
1158 auto hci_matcher = NodeMatches(NameMatches(hci::Transport::kInspectNodeName));
1159
1160 auto adapter_matcher = AllOf(
1161 NodeMatches(AllOf(
1162 NameMatches("adapter"),
1163 PropertyList(UnorderedElementsAre(
1164 StringIs("adapter_id", adapter()->identifier().ToString()),
1165 StringIs(
1166 "hci_version",
1167 hci_spec::HCIVersionToString(adapter()->state().hci_version)),
1168 UintIs(
1169 "bredr_max_num_packets",
1170 adapter()->state().bredr_data_buffer_info.max_num_packets()),
1171 UintIs(
1172 "bredr_max_data_length",
1173 adapter()->state().bredr_data_buffer_info.max_data_length()),
1174 UintIs("le_max_num_packets",
1175 adapter()
1176 ->state()
1177 .low_energy_state.acl_data_buffer_info()
1178 .max_num_packets()),
1179 UintIs("le_max_data_length",
1180 adapter()
1181 ->state()
1182 .low_energy_state.acl_data_buffer_info()
1183 .max_data_length()),
1184 UintIs("sco_max_num_packets",
1185 adapter()->state().sco_buffer_info.max_num_packets()),
1186 UintIs("sco_max_data_length",
1187 adapter()->state().sco_buffer_info.max_data_length()),
1188 StringIs("lmp_features", adapter()->state().features.ToString()),
1189 StringIs("le_features",
1190 bt_lib_cpp_string::StringPrintf(
1191 "0x%016lx",
1192 adapter()
1193 ->state()
1194 .low_energy_state.supported_features())))))),
1195 ChildrenMatch(UnorderedElementsAre(peer_cache_matcher,
1196 sdp_server_matcher,
1197 le_connection_manager_matcher,
1198 bredr_connection_manager_matcher,
1199 le_discovery_manager_matcher,
1200 metrics_node_matcher,
1201 bredr_discovery_manager_matcher,
1202 hci_matcher)));
1203
1204 auto bt_host_matcher =
1205 AllOf(NodeMatches(NameMatches("bt-host")),
1206 ChildrenMatch(UnorderedElementsAre(adapter_matcher)));
1207 auto hierarchy = inspect::ReadFromVmo(inspector.DuplicateVmo()).take_value();
1208
1209 EXPECT_THAT(hierarchy,
1210 AllOf(NodeMatches(NameMatches("root")),
1211 ChildrenMatch(UnorderedElementsAre(bt_host_matcher))));
1212 }
1213 #endif // NINSPECT
1214
TEST_F(AdapterTest,VendorFeatures)1215 TEST_F(AdapterTest, VendorFeatures) {
1216 FakeController::Settings settings;
1217 settings.ApplyDualModeDefaults();
1218 test_device()->set_settings(settings);
1219
1220 bool success = false;
1221 auto init_cb = [&](bool cb_success) { success = cb_success; };
1222 InitializeAdapter(std::move(init_cb));
1223 EXPECT_TRUE(success);
1224 EXPECT_EQ(adapter()->state().controller_features, kDefaultFeaturesBits);
1225 }
1226
TEST_F(AdapterTest,LowEnergyStartAdvertisingConnectCallbackReceivesConnection)1227 TEST_F(AdapterTest,
1228 LowEnergyStartAdvertisingConnectCallbackReceivesConnection) {
1229 FakeController::Settings settings;
1230 settings.ApplyLegacyLEConfig();
1231 test_device()->set_settings(settings);
1232 InitializeAdapter([](bool) {});
1233
1234 AdvertisementInstance instance;
1235 auto adv_cb = [&](auto i, hci::Result<> status) {
1236 instance = std::move(i);
1237 EXPECT_EQ(fit::ok(), status);
1238 };
1239
1240 std::optional<Adapter::LowEnergy::ConnectionResult> conn_result;
1241 std::optional<AdvertisementId> conn_cb_advertisement_id;
1242 Adapter::LowEnergy::ConnectionCallback connect_cb =
1243 [&](AdvertisementId adv_id, Adapter::LowEnergy::ConnectionResult result) {
1244 conn_result = std::move(result);
1245 conn_cb_advertisement_id = adv_id;
1246 };
1247
1248 adapter()->le()->StartAdvertising(
1249 AdvertisingData(),
1250 AdvertisingData(),
1251 AdvertisingInterval::FAST1,
1252 /*anonymous=*/false,
1253 /*include_tx_power_level=*/false,
1254 bt::gap::Adapter::LowEnergy::ConnectableAdvertisingParameters{
1255 std::move(connect_cb), sm::BondableMode::NonBondable},
1256 adv_cb);
1257 RunUntilIdle();
1258 EXPECT_FALSE(conn_result);
1259
1260 fit::closure complete_interrogation;
1261 // Pause interrogation so we can control when the inbound connection procedure
1262 // completes.
1263 test_device()->pause_responses_for_opcode(
1264 bt::hci_spec::kReadRemoteVersionInfo, [&](fit::closure trigger) {
1265 complete_interrogation = std::move(trigger);
1266 });
1267
1268 test_device()->AddPeer(std::make_unique<FakePeer>(kTestAddr, dispatcher()));
1269 test_device()->ConnectLowEnergy(kTestAddr);
1270 RunUntilIdle();
1271 ASSERT_FALSE(conn_result);
1272 ASSERT_TRUE(complete_interrogation);
1273
1274 complete_interrogation();
1275 RunUntilIdle();
1276 ASSERT_TRUE(conn_result);
1277 ASSERT_EQ(fit::ok(), *conn_result);
1278 std::unique_ptr<LowEnergyConnectionHandle> conn_handle =
1279 std::move(*conn_result).value();
1280 ASSERT_TRUE(conn_handle);
1281 EXPECT_EQ(conn_handle->bondable_mode(), sm::BondableMode::NonBondable);
1282 EXPECT_EQ(*conn_cb_advertisement_id, instance.id());
1283 conn_result.reset();
1284 }
1285
1286 // Tests where the constructor must run in the test, rather than Setup.
1287
1288 class AdapterConstructorTest : public TestingBase {
1289 public:
1290 AdapterConstructorTest() = default;
1291 ~AdapterConstructorTest() override = default;
1292
SetUp()1293 void SetUp() override {
1294 TestingBase::SetUp();
1295
1296 l2cap_ = std::make_unique<l2cap::testing::FakeL2cap>(dispatcher());
1297 gatt_ = std::make_unique<gatt::testing::FakeLayer>(dispatcher());
1298 }
1299
TearDown()1300 void TearDown() override {
1301 l2cap_ = nullptr;
1302 gatt_ = nullptr;
1303 TestingBase::TearDown();
1304 }
1305
1306 protected:
1307 std::unique_ptr<l2cap::testing::FakeL2cap> l2cap_;
1308 std::unique_ptr<gatt::testing::FakeLayer> gatt_;
1309 };
1310
1311 using GAP_AdapterConstructorTest = AdapterConstructorTest;
1312
TEST_F(AdapterConstructorTest,GattCallbacks)1313 TEST_F(AdapterConstructorTest, GattCallbacks) {
1314 constexpr PeerId kPeerId(1234);
1315 constexpr gatt::ServiceChangedCCCPersistedData kPersistedData = {
1316 .notify = true, .indicate = true};
1317
1318 int set_persist_cb_count = 0;
1319 int set_retrieve_cb_count = 0;
1320
1321 auto set_persist_cb_cb = [&set_persist_cb_count]() {
1322 set_persist_cb_count++;
1323 };
1324
1325 auto set_retrieve_cb_cb = [&set_retrieve_cb_count]() {
1326 set_retrieve_cb_count++;
1327 };
1328
1329 gatt_->SetSetPersistServiceChangedCCCCallbackCallback(set_persist_cb_cb);
1330 gatt_->SetSetRetrieveServiceChangedCCCCallbackCallback(set_retrieve_cb_cb);
1331
1332 EXPECT_EQ(set_persist_cb_count, 0);
1333 EXPECT_EQ(set_retrieve_cb_count, 0);
1334
1335 auto adapter = Adapter::Create(dispatcher(),
1336 transport()->GetWeakPtr(),
1337 gatt_->GetWeakPtr(),
1338 std::move(l2cap_));
1339
1340 EXPECT_EQ(set_persist_cb_count, 1);
1341 EXPECT_EQ(set_retrieve_cb_count, 1);
1342
1343 // Before the peer exists, adding its gatt info to the peer cache does
1344 // nothing.
1345 gatt_->CallPersistServiceChangedCCCCallback(
1346 kPeerId, /*notify=*/true, /*indicate=*/false);
1347 auto persisted_data_1 = gatt_->CallRetrieveServiceChangedCCCCallback(kPeerId);
1348 EXPECT_EQ(persisted_data_1, std::nullopt);
1349
1350 // After adding a classic peer, adding its info to the peer cache still does
1351 // nothing.
1352 Peer* classic_peer =
1353 adapter->peer_cache()->NewPeer(kTestAddrBrEdr, /*connectable=*/true);
1354 PeerId classic_peer_id = classic_peer->identifier();
1355
1356 gatt_->CallPersistServiceChangedCCCCallback(
1357 classic_peer_id, /*notify=*/false, /*indicate=*/true);
1358 auto persisted_data_2 =
1359 gatt_->CallRetrieveServiceChangedCCCCallback(classic_peer_id);
1360 EXPECT_EQ(persisted_data_2, std::nullopt);
1361
1362 // After adding an LE peer, adding its info to the peer cache works.
1363 Peer* le_peer =
1364 adapter->peer_cache()->NewPeer(kTestAddr, /*connectable=*/true);
1365 PeerId le_peer_id = le_peer->identifier();
1366
1367 gatt_->CallPersistServiceChangedCCCCallback(
1368 le_peer_id, /*notify=*/true, /*indicate=*/true);
1369 auto persisted_data_3 =
1370 gatt_->CallRetrieveServiceChangedCCCCallback(le_peer_id);
1371 ASSERT_TRUE(persisted_data_3.has_value());
1372 auto persisted_data_3_value = persisted_data_3.value();
1373 EXPECT_EQ(persisted_data_3_value, kPersistedData);
1374
1375 // After the peer is removed, the gatt info is no longer in the peer cache.
1376 bool result = adapter->peer_cache()->RemoveDisconnectedPeer(le_peer_id);
1377 EXPECT_TRUE(result);
1378
1379 auto persisted_data_4 =
1380 gatt_->CallRetrieveServiceChangedCCCCallback(le_peer_id);
1381 EXPECT_EQ(persisted_data_4, std::nullopt);
1382 }
1383
TEST_F(AdapterTest,BufferSizesRecordedInState)1384 TEST_F(AdapterTest, BufferSizesRecordedInState) {
1385 bool success = false;
1386 auto init_cb = [&](bool cb_success) { success = cb_success; };
1387
1388 FakeController::Settings settings;
1389 // Enable ReadBuffer commands.
1390 settings.AddBREDRSupportedCommands();
1391 settings.AddLESupportedCommands();
1392 settings.lmp_features_page0 |=
1393 static_cast<uint64_t>(hci_spec::LMPFeature::kLESupportedHost);
1394 settings.le_acl_data_packet_length = 0x1B; // minimum supported size
1395 settings.le_total_num_acl_data_packets = 2;
1396 settings.acl_data_packet_length = 3;
1397 settings.total_num_acl_data_packets = 4;
1398 settings.synchronous_data_packet_length = 5;
1399 settings.total_num_synchronous_data_packets = 6;
1400 settings.iso_data_packet_length = 7;
1401 settings.total_num_iso_data_packets = 8;
1402 test_device()->set_settings(settings);
1403
1404 InitializeAdapter(std::move(init_cb));
1405 EXPECT_TRUE(success);
1406 EXPECT_EQ(adapter()
1407 ->state()
1408 .low_energy_state.acl_data_buffer_info()
1409 .max_data_length(),
1410 (uint16_t)0x1B);
1411 EXPECT_EQ(adapter()
1412 ->state()
1413 .low_energy_state.acl_data_buffer_info()
1414 .max_num_packets(),
1415 2u);
1416 EXPECT_EQ(adapter()->state().bredr_data_buffer_info.max_data_length(), 3u);
1417 EXPECT_EQ(adapter()->state().bredr_data_buffer_info.max_num_packets(), 4u);
1418 EXPECT_EQ(adapter()->state().sco_buffer_info.max_data_length(), 5u);
1419 EXPECT_EQ(adapter()->state().sco_buffer_info.max_num_packets(), 6u);
1420 EXPECT_EQ(adapter()
1421 ->state()
1422 .low_energy_state.iso_data_buffer_info()
1423 .max_data_length(),
1424 7u);
1425 EXPECT_EQ(adapter()
1426 ->state()
1427 .low_energy_state.iso_data_buffer_info()
1428 .max_num_packets(),
1429 8u);
1430 }
1431
TEST_F(AdapterTest,ScoDataChannelInitializedSuccessfully)1432 TEST_F(AdapterTest, ScoDataChannelInitializedSuccessfully) {
1433 // Return valid buffer information and enable LE support.
1434 FakeController::Settings settings;
1435 settings.AddBREDRSupportedCommands();
1436 settings.lmp_features_page0 |=
1437 static_cast<uint64_t>(hci_spec::LMPFeature::kLESupportedHost);
1438 settings.le_acl_data_packet_length = 5;
1439 settings.le_total_num_acl_data_packets = 1;
1440 // Ensure SCO buffers are available.
1441 settings.synchronous_data_packet_length = 6;
1442 settings.total_num_synchronous_data_packets = 2;
1443 // Enable SCO flow control command.
1444 constexpr size_t flow_control_enable_octet = 10;
1445 settings.supported_commands[flow_control_enable_octet] |=
1446 static_cast<uint8_t>(
1447 hci_spec::SupportedCommand::kWriteSynchronousFlowControlEnable);
1448 test_device()->set_settings(settings);
1449
1450 bool success = false;
1451 auto init_cb = [&](bool cb_success) { success = cb_success; };
1452 InitializeAdapter(std::move(init_cb));
1453 EXPECT_TRUE(success);
1454 EXPECT_TRUE(transport()->sco_data_channel());
1455 }
1456
TEST_F(AdapterTest,ScoDataChannelNotInitializedBecauseFlowControlNotSupported)1457 TEST_F(AdapterTest,
1458 ScoDataChannelNotInitializedBecauseFlowControlNotSupported) {
1459 // Return valid buffer information and enable LE support.
1460 FakeController::Settings settings;
1461 settings.AddBREDRSupportedCommands();
1462 settings.lmp_features_page0 |=
1463 static_cast<uint64_t>(hci_spec::LMPFeature::kLESupportedHost);
1464 constexpr size_t flow_control_command_byte = 10;
1465 constexpr uint8_t disable_flow_control_mask = ~static_cast<uint8_t>(
1466 hci_spec::SupportedCommand::kWriteSynchronousFlowControlEnable);
1467 settings.supported_commands[flow_control_command_byte] &=
1468 disable_flow_control_mask;
1469 settings.le_acl_data_packet_length = 5;
1470 settings.le_total_num_acl_data_packets = 1;
1471 // Ensure SCO buffers are available.
1472 settings.synchronous_data_packet_length = 6;
1473 settings.total_num_synchronous_data_packets = 2;
1474 test_device()->set_settings(settings);
1475
1476 bool success = false;
1477 auto init_cb = [&](bool cb_success) { success = cb_success; };
1478 InitializeAdapter(std::move(init_cb));
1479 EXPECT_TRUE(success);
1480 EXPECT_FALSE(transport()->sco_data_channel());
1481 }
1482
TEST_F(AdapterTest,ScoDataChannelNotInitializedBecauseBufferInfoNotAvailable)1483 TEST_F(AdapterTest, ScoDataChannelNotInitializedBecauseBufferInfoNotAvailable) {
1484 // Return valid buffer information and enable LE support.
1485 FakeController::Settings settings;
1486 settings.AddBREDRSupportedCommands();
1487 settings.lmp_features_page0 |=
1488 static_cast<uint64_t>(hci_spec::LMPFeature::kLESupportedHost);
1489 settings.le_acl_data_packet_length = 5;
1490 settings.le_total_num_acl_data_packets = 1;
1491 // Ensure SCO buffers are not available.
1492 settings.synchronous_data_packet_length = 0;
1493 settings.total_num_synchronous_data_packets = 0;
1494 // Enable SCO flow control command.
1495 constexpr size_t flow_control_enable_octet = 10;
1496 settings.supported_commands[flow_control_enable_octet] |=
1497 static_cast<uint8_t>(
1498 hci_spec::SupportedCommand::kWriteSynchronousFlowControlEnable);
1499 test_device()->set_settings(settings);
1500
1501 bool success = false;
1502 auto init_cb = [&](bool cb_success) { success = cb_success; };
1503 InitializeAdapter(std::move(init_cb));
1504 EXPECT_TRUE(success);
1505 EXPECT_FALSE(transport()->sco_data_channel());
1506 }
1507
TEST_F(AdapterScoDisabledTest,ScoDataChannelFailsToInitializeBecauseScoDisabled)1508 TEST_F(AdapterScoDisabledTest,
1509 ScoDataChannelFailsToInitializeBecauseScoDisabled) {
1510 // Return valid buffer information and enable LE support.
1511 FakeController::Settings settings;
1512 settings.AddBREDRSupportedCommands();
1513 settings.lmp_features_page0 |=
1514 static_cast<uint64_t>(hci_spec::LMPFeature::kLESupportedHost);
1515 settings.le_acl_data_packet_length = 5;
1516 settings.le_total_num_acl_data_packets = 1;
1517 // Ensure SCO buffers are available.
1518 settings.synchronous_data_packet_length = 6;
1519 settings.total_num_synchronous_data_packets = 2;
1520 // Enable SCO flow control command.
1521 constexpr size_t flow_control_enable_octet = 10;
1522 settings.supported_commands[flow_control_enable_octet] |=
1523 static_cast<uint8_t>(
1524 hci_spec::SupportedCommand::kWriteSynchronousFlowControlEnable);
1525 test_device()->set_settings(settings);
1526
1527 bool success = false;
1528 auto init_cb = [&](bool cb_success) { success = cb_success; };
1529 InitializeAdapter(std::move(init_cb));
1530 EXPECT_TRUE(success);
1531 EXPECT_FALSE(transport()->sco_data_channel());
1532 }
1533
TEST_F(AdapterTest,InitializeWriteSecureConnectionsHostSupport)1534 TEST_F(AdapterTest, InitializeWriteSecureConnectionsHostSupport) {
1535 bool success;
1536 int init_cb_count = 0;
1537 auto init_cb = [&](bool cb_success) {
1538 success = cb_success;
1539 init_cb_count++;
1540 };
1541
1542 // Enable LE support and extended features (Secure Connections Host Support)
1543 FakeController::Settings settings;
1544 settings.lmp_features_page0 |=
1545 static_cast<uint64_t>(hci_spec::LMPFeature::kLESupportedHost);
1546 settings.lmp_features_page0 |=
1547 static_cast<uint64_t>(hci_spec::LMPFeature::kExtendedFeatures);
1548 settings.lmp_features_page1 |= static_cast<uint64_t>(
1549 hci_spec::LMPFeature::kSecureConnectionsHostSupport);
1550 settings.le_acl_data_packet_length = 5;
1551 settings.le_total_num_acl_data_packets = 1;
1552 test_device()->set_settings(settings);
1553
1554 InitializeAdapter(std::move(init_cb));
1555 EXPECT_TRUE(success);
1556 EXPECT_EQ(1, init_cb_count);
1557 EXPECT_TRUE(adapter()->state().IsLowEnergySupported());
1558 EXPECT_TRUE(adapter()->state().IsBREDRSupported());
1559 EXPECT_TRUE(adapter()->state().IsSecureConnectionHostSupportSupported());
1560 EXPECT_TRUE(adapter()->le());
1561 EXPECT_TRUE(adapter()->bredr());
1562 EXPECT_EQ(TechnologyType::kDualMode, adapter()->state().type());
1563 EXPECT_FALSE(transport_closed_called());
1564 }
1565
1566 } // namespace
1567 } // namespace bt::gap
1568