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