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,
560 [&session](auto cb_session) { session = std::move(cb_session); });
561 RunUntilIdle();
562 EXPECT_FALSE(conn);
563 EXPECT_EQ(0u, adapter()->peer_cache()->count());
564
565 // Mark the peer as bonded and advance the scan period.
566 sm::PairingData pdata;
567 pdata.peer_ltk = sm::LTK();
568 pdata.local_ltk = sm::LTK();
569 adapter()->peer_cache()->AddBondedPeer(
570 BondingData{.identifier = kPeerId,
571 .address = kTestAddr,
572 .name = std::nullopt,
573 .le_pairing_data = pdata,
574 .bredr_link_key = std::nullopt,
575 .bredr_services = {}});
576 EXPECT_EQ(1u, adapter()->peer_cache()->count());
577
578 // FakeController only sends advertising reports at the start of scan periods,
579 // so we need to start a second period.
580 RunFor(kTestScanPeriod);
581
582 // The peer should have been auto-connected.
583 ASSERT_TRUE(conn);
584 EXPECT_EQ(kPeerId, conn->peer_identifier());
585 }
586
TEST_F(AdapterTest,LeSkipAutoConnectBehavior)587 TEST_F(AdapterTest, LeSkipAutoConnectBehavior) {
588 constexpr pw::chrono::SystemClock::duration kTestScanPeriod =
589 std::chrono::seconds(10);
590 constexpr PeerId kPeerId(1234);
591
592 FakeController::Settings settings;
593 settings.ApplyLEOnlyDefaults();
594 test_device()->set_settings(settings);
595
596 InitializeAdapter([](bool) {});
597 adapter()->le()->set_scan_period_for_testing(kTestScanPeriod);
598
599 auto fake_peer =
600 std::make_unique<FakePeer>(kTestAddr, dispatcher(), true, false);
601 fake_peer->set_directed_advertising_enabled(true);
602 test_device()->AddPeer(std::move(fake_peer));
603
604 std::unique_ptr<bt::gap::LowEnergyConnectionHandle> conn;
605 adapter()->set_auto_connect_callback(
606 [&](auto conn_ref) { conn = std::move(conn_ref); });
607
608 // Enable background scanning. No auto-connect should take place since the
609 // device isn't yet bonded.
610 std::unique_ptr<LowEnergyDiscoverySession> session;
611 adapter()->le()->StartDiscovery(
612 /*active=*/false,
613 [&session](auto cb_session) { session = std::move(cb_session); });
614 RunUntilIdle();
615 EXPECT_FALSE(conn);
616 EXPECT_EQ(0u, adapter()->peer_cache()->count());
617
618 // Mark the peer as bonded.
619 sm::PairingData pdata;
620 pdata.peer_ltk = sm::LTK();
621 pdata.local_ltk = sm::LTK();
622 adapter()->peer_cache()->AddBondedPeer(
623 BondingData{.identifier = kPeerId,
624 .address = kTestAddr,
625 .name = std::nullopt,
626 .le_pairing_data = pdata,
627 .bredr_link_key = std::nullopt,
628 .bredr_services = {}});
629 EXPECT_EQ(1u, adapter()->peer_cache()->count());
630
631 // Fake a manual disconnect to skip auto-connect behavior.
632 adapter()->peer_cache()->SetAutoConnectBehaviorForIntentionalDisconnect(
633 kPeerId);
634
635 // Advance the scan period.
636 RunFor(kTestScanPeriod);
637
638 // The peer should NOT have been auto-connected.
639 ASSERT_FALSE(conn);
640
641 // The peer should still not auto-connect after a subsequent scan period.
642 RunFor(kTestScanPeriod);
643 ASSERT_FALSE(conn);
644
645 // Fake a manual connection to reset auto-connect behavior.
646 adapter()->peer_cache()->SetAutoConnectBehaviorForSuccessfulConnection(
647 kPeerId);
648
649 // Advance the scan period.
650 RunFor(kTestScanPeriod);
651
652 // The peer SHOULD have been auto-connected.
653 ASSERT_TRUE(conn);
654 EXPECT_EQ(kPeerId, conn->peer_identifier());
655 }
656
657 // Tests the interactions between the advertising manager and the local address
658 // manager when the controller uses legacy advertising.
TEST_F(AdapterTest,LocalAddressForLegacyAdvertising)659 TEST_F(AdapterTest, LocalAddressForLegacyAdvertising) {
660 FakeController::Settings settings;
661 settings.ApplyLegacyLEConfig();
662 test_device()->set_settings(settings);
663 InitializeAdapter([](bool) {});
664
665 std::optional<AdvertisementInstance> instance;
666 auto adv_cb = [&](auto i, hci::Result<> status) {
667 instance = std::move(i);
668 EXPECT_EQ(fit::ok(), status);
669 };
670
671 // Advertising should use the public address by default when privacy is not
672 // enabled.
673 adapter()->le()->StartAdvertising(AdvertisingData(),
674 AdvertisingData(),
675 AdvertisingInterval::FAST1,
676 /*extended_pdu=*/false,
677 /*anonymous=*/false,
678 /*include_tx_power_level=*/false,
679 /*connectable=*/std::nullopt,
680 /*address_type=*/std::nullopt,
681 adv_cb);
682 RunUntilIdle();
683 EXPECT_TRUE(test_device()->legacy_advertising_state().enabled);
684 EXPECT_EQ(pw::bluetooth::emboss::LEOwnAddressType::PUBLIC,
685 test_device()->legacy_advertising_state().own_address_type);
686
687 // Enable privacy. The random address should not get configured while
688 // advertising is in progress.
689 adapter()->le()->EnablePrivacy(true);
690 RunUntilIdle();
691 EXPECT_FALSE(test_device()->legacy_advertising_state().random_address);
692
693 // Stop advertising.
694 instance.reset();
695 RunUntilIdle();
696 EXPECT_FALSE(test_device()->legacy_advertising_state().enabled);
697 EXPECT_FALSE(test_device()->legacy_advertising_state().random_address);
698
699 // Restart advertising. This should configure the LE random address and
700 // advertise using it.
701 adapter()->le()->StartAdvertising(AdvertisingData(),
702 AdvertisingData(),
703 AdvertisingInterval::FAST1,
704 /*extended_pdu=*/false,
705 /*anonymous=*/false,
706 /*include_tx_power_level=*/false,
707 /*connectable=*/std::nullopt,
708 /*address_type=*/std::nullopt,
709 adv_cb);
710 RunUntilIdle();
711 EXPECT_TRUE(test_device()->legacy_advertising_state().random_address);
712 EXPECT_TRUE(test_device()->legacy_advertising_state().enabled);
713 EXPECT_EQ(pw::bluetooth::emboss::LEOwnAddressType::RANDOM,
714 test_device()->legacy_advertising_state().own_address_type);
715
716 // Advance time to force the random address to refresh. The update should be
717 // deferred while advertising.
718 auto last_random_addr =
719 *test_device()->legacy_advertising_state().random_address;
720 RunFor(kPrivateAddressTimeout);
721 EXPECT_EQ(last_random_addr,
722 *test_device()->legacy_advertising_state().random_address);
723
724 // Restarting advertising should refresh the controller address.
725 instance.reset();
726 adapter()->le()->StartAdvertising(AdvertisingData(),
727 AdvertisingData(),
728 AdvertisingInterval::FAST1,
729 /*extended_pdu=*/false,
730 /*anonymous=*/false,
731 /*include_tx_power_level=*/false,
732 /*connectable=*/std::nullopt,
733 /*address_type=*/std::nullopt,
734 adv_cb);
735 RunUntilIdle();
736 EXPECT_TRUE(test_device()->legacy_advertising_state().enabled);
737 EXPECT_EQ(pw::bluetooth::emboss::LEOwnAddressType::RANDOM,
738 test_device()->legacy_advertising_state().own_address_type);
739 EXPECT_TRUE(test_device()->legacy_advertising_state().random_address);
740 EXPECT_NE(last_random_addr,
741 test_device()->legacy_advertising_state().random_address);
742
743 // Disable privacy. The next time advertising gets started it should use a
744 // public address.
745 adapter()->le()->EnablePrivacy(false);
746 instance.reset();
747 adapter()->le()->StartAdvertising(AdvertisingData(),
748 AdvertisingData(),
749 AdvertisingInterval::FAST1,
750 /*extended_pdu=*/false,
751 /*anonymous=*/false,
752 /*include_tx_power_level=*/false,
753 /*connectable=*/std::nullopt,
754 /*address_type=*/std::nullopt,
755 adv_cb);
756 RunUntilIdle();
757 EXPECT_TRUE(test_device()->legacy_advertising_state().enabled);
758 EXPECT_EQ(pw::bluetooth::emboss::LEOwnAddressType::PUBLIC,
759 test_device()->legacy_advertising_state().own_address_type);
760 }
761
762 // Tests the interactions between the discovery manager and the local address
763 // manager.
TEST_F(AdapterTest,LocalAddressForDiscovery)764 TEST_F(AdapterTest, LocalAddressForDiscovery) {
765 FakeController::Settings settings;
766 settings.ApplyLegacyLEConfig();
767 test_device()->set_settings(settings);
768 InitializeAdapter([](bool) {});
769
770 // Set a scan period that is longer than the private address timeout, for
771 // testing.
772 constexpr pw::chrono::SystemClock::duration kTestDelay =
773 std::chrono::seconds(5);
774 constexpr pw::chrono::SystemClock::duration kTestScanPeriod =
775 kPrivateAddressTimeout + kTestDelay;
776 adapter()->le()->set_scan_period_for_testing(kTestScanPeriod);
777
778 // Discovery should use the public address by default.
779 LowEnergyDiscoverySessionPtr session;
780 auto cb = [&](auto s) { session = std::move(s); };
781 adapter()->le()->StartDiscovery(/*active=*/true, cb);
782 RunUntilIdle();
783 ASSERT_TRUE(session);
784 EXPECT_TRUE(test_device()->le_scan_state().enabled);
785 EXPECT_EQ(pw::bluetooth::emboss::LEOwnAddressType::PUBLIC,
786 test_device()->le_scan_state().own_address_type);
787
788 // Enable privacy. The random address should not get configured while a scan
789 // is in progress.
790 adapter()->le()->EnablePrivacy(true);
791 RunUntilIdle();
792 EXPECT_FALSE(test_device()->legacy_advertising_state().random_address);
793
794 // Stop discovery.
795 session = nullptr;
796 RunUntilIdle();
797 EXPECT_FALSE(test_device()->le_scan_state().enabled);
798 EXPECT_FALSE(test_device()->legacy_advertising_state().random_address);
799
800 // Restart discovery. This should configure the LE random address and scan
801 // using it.
802 adapter()->le()->StartDiscovery(/*active=*/true, cb);
803 RunUntilIdle();
804 ASSERT_TRUE(session);
805 EXPECT_TRUE(test_device()->le_scan_state().enabled);
806 EXPECT_EQ(pw::bluetooth::emboss::LEOwnAddressType::RANDOM,
807 test_device()->le_scan_state().own_address_type);
808
809 // Advance time to force the random address to refresh. The update should be
810 // deferred while still scanning.
811 ASSERT_TRUE(test_device()->legacy_advertising_state().random_address);
812 auto last_random_addr =
813 *test_device()->legacy_advertising_state().random_address;
814 RunFor(kPrivateAddressTimeout);
815 EXPECT_EQ(last_random_addr,
816 *test_device()->legacy_advertising_state().random_address);
817
818 // Let the scan period expire. This should restart scanning and refresh the
819 // random address.
820 RunFor(kTestDelay);
821 EXPECT_TRUE(test_device()->le_scan_state().enabled);
822 EXPECT_EQ(pw::bluetooth::emboss::LEOwnAddressType::RANDOM,
823 test_device()->le_scan_state().own_address_type);
824 ASSERT_TRUE(test_device()->legacy_advertising_state().random_address);
825 EXPECT_NE(last_random_addr,
826 test_device()->legacy_advertising_state().random_address);
827
828 // Disable privacy. The next time scanning gets started it should use a
829 // public address.
830 adapter()->le()->EnablePrivacy(false);
831 RunFor(kTestScanPeriod);
832 EXPECT_TRUE(test_device()->le_scan_state().enabled);
833 EXPECT_EQ(pw::bluetooth::emboss::LEOwnAddressType::PUBLIC,
834 test_device()->le_scan_state().own_address_type);
835 }
836
TEST_F(AdapterTest,LocalAddressForConnections)837 TEST_F(AdapterTest, LocalAddressForConnections) {
838 FakeController::Settings settings;
839 settings.ApplyLegacyLEConfig();
840 test_device()->set_settings(settings);
841 InitializeAdapter([](bool) {});
842
843 // Set-up a device for testing.
844 auto* peer =
845 adapter()->peer_cache()->NewPeer(kTestAddr, /*connectable=*/true);
846 auto fake_peer = std::make_unique<FakePeer>(kTestAddr, dispatcher());
847 test_device()->AddPeer(std::move(fake_peer));
848
849 std::unique_ptr<bt::gap::LowEnergyConnectionHandle> conn_ref;
850 auto connect_cb = [&conn_ref](auto result) {
851 ASSERT_EQ(fit::ok(), result);
852 conn_ref = std::move(result).value();
853 };
854
855 // A connection request should use the public address by default.
856 adapter()->le()->Connect(
857 peer->identifier(), connect_cb, LowEnergyConnectionOptions());
858
859 // Enable privacy. The random address should not get configured while a
860 // connection attempt is in progress.
861 adapter()->le()->EnablePrivacy(true);
862 RunUntilIdle();
863 EXPECT_FALSE(test_device()->legacy_advertising_state().random_address);
864 ASSERT_TRUE(conn_ref);
865 ASSERT_TRUE(test_device()->le_connect_params());
866 EXPECT_EQ(pw::bluetooth::emboss::LEOwnAddressType::PUBLIC,
867 test_device()->le_connect_params()->own_address_type);
868
869 // Create a new connection. The second attempt should use a random address.
870 // re-enabled.
871 conn_ref = nullptr;
872 adapter()->le()->Connect(
873 peer->identifier(), connect_cb, LowEnergyConnectionOptions());
874 RunUntilIdle();
875 EXPECT_TRUE(test_device()->legacy_advertising_state().random_address);
876 ASSERT_TRUE(conn_ref);
877 ASSERT_TRUE(test_device()->le_connect_params());
878
879 // TODO: https://fxbug.dev/42141593 - The current policy is to use a public
880 // address when initiating connections. Change this test to expect a random
881 // address once RPAs for central connections are re-enabled.
882 EXPECT_EQ(pw::bluetooth::emboss::LEOwnAddressType::PUBLIC,
883 test_device()->le_connect_params()->own_address_type);
884
885 // Disable privacy. The next connection attempt should use a public address.
886 adapter()->le()->EnablePrivacy(false);
887 conn_ref = nullptr;
888 adapter()->le()->Connect(
889 peer->identifier(), connect_cb, LowEnergyConnectionOptions());
890 RunUntilIdle();
891 EXPECT_EQ(pw::bluetooth::emboss::LEOwnAddressType::PUBLIC,
892 test_device()->le_connect_params()->own_address_type);
893 }
894
895 // Tests the deferral of random address configuration while a connection request
896 // is outstanding.
TEST_F(AdapterTest,LocalAddressDuringHangingConnect)897 TEST_F(AdapterTest, LocalAddressDuringHangingConnect) {
898 FakeController::Settings settings;
899 settings.ApplyLegacyLEConfig();
900 test_device()->set_settings(settings);
901 InitializeAdapter([](bool) {});
902
903 auto* peer =
904 adapter()->peer_cache()->NewPeer(kTestAddr, /*connectable=*/true);
905
906 // Cause scanning to succeed and the connection request to hang.
907 auto fake_peer = std::make_unique<FakePeer>(kTestAddr, dispatcher());
908 fake_peer->set_force_pending_connect(true);
909 test_device()->AddPeer(std::move(fake_peer));
910
911 constexpr pw::chrono::SystemClock::duration kTestDelay =
912 std::chrono::seconds(5);
913 constexpr pw::chrono::SystemClock::duration kTestTimeout =
914 kPrivateAddressTimeout + kTestDelay;
915
916 // Some of the behavior below stems from the fact that kTestTimeout is longer
917 // than kCacheTimeout. This assertion is here to catch regressions in this
918 // test if the values ever change.
919 // TODO: https://fxbug.dev/42087236 - Configuring the cache expiration timeout
920 // explicitly would remove some of the unnecessary invariants from this test
921 // case.
922 static_assert(kTestTimeout > kCacheTimeout,
923 "expected a shorter device cache timeout");
924
925 adapter()->le()->set_request_timeout_for_testing(kTestTimeout);
926
927 // The connection request should use a public address.
928 std::optional<HostError> error;
929 int connect_cb_calls = 0;
930 auto connect_cb = [&error, &connect_cb_calls](auto result) {
931 connect_cb_calls++;
932 ASSERT_TRUE(result.is_error());
933 error = result.error_value();
934 };
935 adapter()->le()->Connect(
936 peer->identifier(), connect_cb, LowEnergyConnectionOptions());
937 RunUntilIdle();
938 ASSERT_TRUE(test_device()->le_connect_params());
939 EXPECT_EQ(pw::bluetooth::emboss::LEOwnAddressType::PUBLIC,
940 test_device()->le_connect_params()->own_address_type);
941
942 // Enable privacy. The random address should not get configured while a
943 // connection request is outstanding.
944 adapter()->le()->EnablePrivacy(true);
945 RunUntilIdle();
946 EXPECT_FALSE(test_device()->legacy_advertising_state().random_address);
947
948 // Let the connection request timeout.
949 RunFor(kTestTimeout);
950 ASSERT_TRUE(error.has_value());
951 EXPECT_EQ(HostError::kTimedOut, error.value())
952 << "Error: " << HostErrorToString(error.value());
953 EXPECT_EQ(1, connect_cb_calls);
954
955 // The peer should not have expired.
956 ASSERT_EQ(peer, adapter()->peer_cache()->FindByAddress(kTestAddr));
957 adapter()->le()->Connect(
958 peer->identifier(), connect_cb, LowEnergyConnectionOptions());
959 RunUntilIdle();
960 ASSERT_TRUE(test_device()->legacy_advertising_state().random_address);
961 // TODO: https://fxbug.dev/42141593 - The current policy is to use a public
962 // address when initiating connections. Change this test to expect a random
963 // address once RPAs for central connections are re-enabled.
964 EXPECT_EQ(pw::bluetooth::emboss::LEOwnAddressType::PUBLIC,
965 test_device()->le_connect_params()->own_address_type);
966
967 // Advance the time to cause the random address to refresh. The update should
968 // be deferred while a connection request is outstanding.
969 auto last_random_addr =
970 *test_device()->legacy_advertising_state().random_address;
971 RunFor(kPrivateAddressTimeout);
972 EXPECT_EQ(last_random_addr,
973 *test_device()->legacy_advertising_state().random_address);
974
975 ASSERT_EQ(peer, adapter()->peer_cache()->FindByAddress(kTestAddr));
976
977 // The address should refresh after the pending request expires and before the
978 // next connection attempt.
979 RunFor(kTestDelay);
980 ASSERT_EQ(2, connect_cb_calls);
981
982 // This will be notified when LowEnergyConnectionManager is destroyed.
983 auto noop_connect_cb = [](auto) {};
984 adapter()->le()->Connect(peer->identifier(),
985 std::move(noop_connect_cb),
986 LowEnergyConnectionOptions());
987 RunUntilIdle();
988 EXPECT_NE(last_random_addr,
989 *test_device()->legacy_advertising_state().random_address);
990 // TODO: https://fxbug.dev/42141593 - The current policy is to use a public
991 // address when initiating connections. Change this test to expect a random
992 // address once RPAs for central connections are re-enabled.
993 EXPECT_EQ(pw::bluetooth::emboss::LEOwnAddressType::PUBLIC,
994 test_device()->le_connect_params()->own_address_type);
995 }
996
997 // Tests that existing connections don't prevent an address change.
TEST_F(AdapterTest,ExistingConnectionDoesNotPreventLocalAddressChange)998 TEST_F(AdapterTest, ExistingConnectionDoesNotPreventLocalAddressChange) {
999 FakeController::Settings settings;
1000 settings.ApplyLegacyLEConfig();
1001 test_device()->set_settings(settings);
1002 InitializeAdapter([](bool) {});
1003
1004 adapter()->le()->EnablePrivacy(true);
1005
1006 std::unique_ptr<bt::gap::LowEnergyConnectionHandle> conn_ref;
1007 auto connect_cb = [&](auto result) {
1008 ASSERT_EQ(fit::ok(), result);
1009 conn_ref = std::move(result).value();
1010 ASSERT_TRUE(conn_ref);
1011 };
1012
1013 auto* peer =
1014 adapter()->peer_cache()->NewPeer(kTestAddr, /*connectable=*/true);
1015 auto fake_peer = std::make_unique<FakePeer>(kTestAddr, dispatcher());
1016 test_device()->AddPeer(std::move(fake_peer));
1017 adapter()->le()->Connect(
1018 peer->identifier(), connect_cb, LowEnergyConnectionOptions());
1019 RunUntilIdle();
1020 // TODO: https://fxbug.dev/42141593 - The current policy is to use a public
1021 // address when initiating connections. Change this test to expect a random
1022 // address once RPAs for central connections are re-enabled.
1023 EXPECT_EQ(pw::bluetooth::emboss::LEOwnAddressType::PUBLIC,
1024 test_device()->le_connect_params()->own_address_type);
1025
1026 // Expire the private address. The address should refresh without interference
1027 // from the ongoing connection.
1028 ASSERT_TRUE(test_device()->legacy_advertising_state().random_address);
1029 auto last_random_addr =
1030 *test_device()->legacy_advertising_state().random_address;
1031 RunFor(kPrivateAddressTimeout);
1032 ASSERT_TRUE(test_device()->legacy_advertising_state().random_address);
1033 EXPECT_NE(last_random_addr,
1034 *test_device()->legacy_advertising_state().random_address);
1035 }
1036
TEST_F(AdapterTest,IsDiscoverableLowEnergy)1037 TEST_F(AdapterTest, IsDiscoverableLowEnergy) {
1038 FakeController::Settings settings;
1039 settings.ApplyLegacyLEConfig();
1040 test_device()->set_settings(settings);
1041 InitializeAdapter([](bool) {});
1042
1043 EXPECT_FALSE(adapter()->IsDiscoverable());
1044
1045 AdvertisementInstance instance;
1046 adapter()->le()->StartAdvertising(AdvertisingData(),
1047 AdvertisingData(),
1048 AdvertisingInterval::FAST1,
1049 /*extended_pdu=*/false,
1050 /*anonymous=*/false,
1051 /*include_tx_power_level=*/false,
1052 /*connectable=*/std::nullopt,
1053 /*address_type=*/std::nullopt,
1054 [&](AdvertisementInstance i, auto status) {
1055 ASSERT_EQ(fit::ok(), status);
1056 instance = std::move(i);
1057 });
1058 RunUntilIdle();
1059 EXPECT_TRUE(adapter()->IsDiscoverable());
1060
1061 instance = {};
1062 RunUntilIdle();
1063 EXPECT_FALSE(adapter()->IsDiscoverable());
1064 }
1065
TEST_F(AdapterTest,IsDiscoverableBredr)1066 TEST_F(AdapterTest, IsDiscoverableBredr) {
1067 FakeController::Settings settings;
1068 settings.ApplyDualModeDefaults();
1069 test_device()->set_settings(settings);
1070 InitializeAdapter([](bool) {});
1071
1072 EXPECT_FALSE(adapter()->IsDiscoverable());
1073
1074 std::unique_ptr<BrEdrDiscoverableSession> session;
1075 adapter()->bredr()->RequestDiscoverable(
1076 [&](auto, auto s) { session = std::move(s); });
1077 RunUntilIdle();
1078 EXPECT_TRUE(adapter()->IsDiscoverable());
1079
1080 session = nullptr;
1081 RunUntilIdle();
1082 EXPECT_FALSE(adapter()->IsDiscoverable());
1083 }
1084
TEST_F(AdapterTest,IsDiscoverableLowEnergyPrivacyEnabled)1085 TEST_F(AdapterTest, IsDiscoverableLowEnergyPrivacyEnabled) {
1086 FakeController::Settings settings;
1087 settings.ApplyLegacyLEConfig();
1088 test_device()->set_settings(settings);
1089 InitializeAdapter([](bool) {});
1090
1091 EXPECT_FALSE(adapter()->IsDiscoverable());
1092 adapter()->le()->EnablePrivacy(true);
1093 EXPECT_FALSE(adapter()->IsDiscoverable());
1094
1095 AdvertisementInstance instance;
1096 adapter()->le()->StartAdvertising(AdvertisingData(),
1097 AdvertisingData(),
1098 AdvertisingInterval::FAST1,
1099 /*extended_pdu=*/false,
1100 /*anonymous=*/false,
1101 /*include_tx_power_level=*/false,
1102 /*connectable=*/std::nullopt,
1103 /*address_type=*/std::nullopt,
1104 [&](AdvertisementInstance i, auto status) {
1105 ASSERT_EQ(fit::ok(), status);
1106 instance = std::move(i);
1107 });
1108 RunUntilIdle();
1109 // Even though we are advertising over LE, we are not discoverable since
1110 // Privacy is enabled.
1111 EXPECT_FALSE(adapter()->IsDiscoverable());
1112
1113 instance = {};
1114 RunUntilIdle();
1115 EXPECT_FALSE(adapter()->IsDiscoverable());
1116 }
1117
1118 #ifndef NINSPECT
TEST_F(AdapterTest,InspectHierarchy)1119 TEST_F(AdapterTest, InspectHierarchy) {
1120 inspect::Inspector inspector;
1121 auto bt_host_node = inspector.GetRoot().CreateChild("bt-host");
1122 adapter()->AttachInspect(bt_host_node, "adapter");
1123
1124 bool success;
1125 int init_cb_count = 0;
1126 auto init_cb = [&](bool cb_success) {
1127 success = cb_success;
1128 init_cb_count++;
1129 };
1130
1131 // Return valid buffer information and enable LE support. (This should
1132 // succeed).
1133 FakeController::Settings settings;
1134 settings.AddBREDRSupportedCommands();
1135 settings.lmp_features_page0 |=
1136 static_cast<uint64_t>(hci_spec::LMPFeature::kLESupportedHost);
1137 settings.le_acl_data_packet_length = 0x1B;
1138 settings.le_total_num_acl_data_packets = 1;
1139 settings.synchronous_data_packet_length = 6;
1140 settings.total_num_synchronous_data_packets = 2;
1141 test_device()->set_settings(settings);
1142
1143 InitializeAdapter(std::move(init_cb));
1144 EXPECT_TRUE(success);
1145
1146 auto le_connection_manager_matcher =
1147 NodeMatches(NameMatches("low_energy_connection_manager"));
1148 auto bredr_connection_manager_matcher =
1149 NodeMatches(NameMatches("bredr_connection_manager"));
1150 auto peer_cache_matcher =
1151 NodeMatches(NameMatches(PeerCache::kInspectNodeName));
1152 auto sdp_server_matcher =
1153 NodeMatches(NameMatches(sdp::Server::kInspectNodeName));
1154 auto acl_data_channel_matcher =
1155 NodeMatches(NameMatches(hci::AclDataChannel::kInspectNodeName));
1156 auto le_matcher =
1157 AllOf(NodeMatches(AllOf(NameMatches("le"),
1158 PropertyList(UnorderedElementsAre(
1159 UintIs("outgoing_connection_requests", 0),
1160 UintIs("pair_requests", 0),
1161 UintIs("start_advertising_events", 0),
1162 UintIs("stop_advertising_events", 0),
1163 UintIs("start_discovery_events", 0))))));
1164 auto bredr_matcher =
1165 AllOf(NodeMatches(AllOf(NameMatches("bredr"),
1166 PropertyList(UnorderedElementsAre(
1167 UintIs("outgoing_connection_requests", 0),
1168 UintIs("pair_requests", 0),
1169 UintIs("set_connectable_true_events", 0),
1170 UintIs("set_connectable_false_events", 0),
1171 UintIs("open_l2cap_channel_requests", 0))))));
1172 auto metrics_node_matcher =
1173 AllOf(NodeMatches(NameMatches(Adapter::kMetricsInspectNodeName)),
1174 ChildrenMatch(UnorderedElementsAre(bredr_matcher, le_matcher)));
1175 auto le_discovery_manager_matcher =
1176 NodeMatches(NameMatches("low_energy_discovery_manager"));
1177 auto bredr_discovery_manager_matcher =
1178 NodeMatches(NameMatches("bredr_discovery_manager"));
1179 auto hci_matcher = NodeMatches(NameMatches(hci::Transport::kInspectNodeName));
1180
1181 auto adapter_matcher = AllOf(
1182 NodeMatches(AllOf(
1183 NameMatches("adapter"),
1184 PropertyList(UnorderedElementsAre(
1185 StringIs("adapter_id", adapter()->identifier().ToString()),
1186 StringIs(
1187 "hci_version",
1188 hci_spec::HCIVersionToString(adapter()->state().hci_version)),
1189 UintIs(
1190 "bredr_max_num_packets",
1191 adapter()->state().bredr_data_buffer_info.max_num_packets()),
1192 UintIs(
1193 "bredr_max_data_length",
1194 adapter()->state().bredr_data_buffer_info.max_data_length()),
1195 UintIs("le_max_num_packets",
1196 adapter()
1197 ->state()
1198 .low_energy_state.acl_data_buffer_info()
1199 .max_num_packets()),
1200 UintIs("le_max_data_length",
1201 adapter()
1202 ->state()
1203 .low_energy_state.acl_data_buffer_info()
1204 .max_data_length()),
1205 UintIs("sco_max_num_packets",
1206 adapter()->state().sco_buffer_info.max_num_packets()),
1207 UintIs("sco_max_data_length",
1208 adapter()->state().sco_buffer_info.max_data_length()),
1209 StringIs("lmp_features", adapter()->state().features.ToString()),
1210 StringIs("le_features",
1211 bt_lib_cpp_string::StringPrintf(
1212 "0x%016lx",
1213 adapter()
1214 ->state()
1215 .low_energy_state.supported_features())))))),
1216 ChildrenMatch(UnorderedElementsAre(peer_cache_matcher,
1217 sdp_server_matcher,
1218 le_connection_manager_matcher,
1219 bredr_connection_manager_matcher,
1220 le_discovery_manager_matcher,
1221 metrics_node_matcher,
1222 bredr_discovery_manager_matcher,
1223 hci_matcher)));
1224
1225 auto bt_host_matcher =
1226 AllOf(NodeMatches(NameMatches("bt-host")),
1227 ChildrenMatch(UnorderedElementsAre(adapter_matcher)));
1228 auto hierarchy = inspect::ReadFromVmo(inspector.DuplicateVmo()).take_value();
1229
1230 EXPECT_THAT(hierarchy,
1231 AllOf(NodeMatches(NameMatches("root")),
1232 ChildrenMatch(UnorderedElementsAre(bt_host_matcher))));
1233 }
1234 #endif // NINSPECT
1235
TEST_F(AdapterTest,VendorFeatures)1236 TEST_F(AdapterTest, VendorFeatures) {
1237 FakeController::Settings settings;
1238 settings.ApplyDualModeDefaults();
1239 test_device()->set_settings(settings);
1240
1241 bool success = false;
1242 auto init_cb = [&](bool cb_success) { success = cb_success; };
1243 InitializeAdapter(std::move(init_cb));
1244 EXPECT_TRUE(success);
1245 EXPECT_EQ(adapter()->state().controller_features, kDefaultFeaturesBits);
1246 }
1247
TEST_F(AdapterTest,LowEnergyStartAdvertisingConnectCallbackReceivesConnection)1248 TEST_F(AdapterTest,
1249 LowEnergyStartAdvertisingConnectCallbackReceivesConnection) {
1250 FakeController::Settings settings;
1251 settings.ApplyLegacyLEConfig();
1252 test_device()->set_settings(settings);
1253 InitializeAdapter([](bool) {});
1254
1255 AdvertisementInstance instance;
1256 auto adv_cb = [&](auto i, hci::Result<> status) {
1257 instance = std::move(i);
1258 EXPECT_EQ(fit::ok(), status);
1259 };
1260
1261 std::optional<Adapter::LowEnergy::ConnectionResult> conn_result;
1262 std::optional<AdvertisementId> conn_cb_advertisement_id;
1263 Adapter::LowEnergy::ConnectionCallback connect_cb =
1264 [&](AdvertisementId adv_id, Adapter::LowEnergy::ConnectionResult result) {
1265 conn_result = std::move(result);
1266 conn_cb_advertisement_id = adv_id;
1267 };
1268
1269 adapter()->le()->StartAdvertising(
1270 AdvertisingData(),
1271 AdvertisingData(),
1272 AdvertisingInterval::FAST1,
1273 /*extended_pdu=*/false,
1274 /*anonymous=*/false,
1275 /*include_tx_power_level=*/false,
1276 bt::gap::Adapter::LowEnergy::ConnectableAdvertisingParameters{
1277 .connection_cb = std::move(connect_cb),
1278 .bondable_mode = sm::BondableMode::NonBondable},
1279 /*address_type=*/std::nullopt,
1280 adv_cb);
1281 RunUntilIdle();
1282 EXPECT_FALSE(conn_result);
1283
1284 fit::closure complete_interrogation;
1285 // Pause interrogation so we can control when the inbound connection procedure
1286 // completes.
1287 test_device()->pause_responses_for_opcode(
1288 bt::hci_spec::kReadRemoteVersionInfo, [&](fit::closure trigger) {
1289 complete_interrogation = std::move(trigger);
1290 });
1291
1292 test_device()->AddPeer(std::make_unique<FakePeer>(kTestAddr, dispatcher()));
1293 test_device()->ConnectLowEnergy(kTestAddr);
1294 RunUntilIdle();
1295 ASSERT_FALSE(conn_result);
1296 ASSERT_TRUE(complete_interrogation);
1297
1298 complete_interrogation();
1299 RunUntilIdle();
1300 ASSERT_TRUE(conn_result);
1301 ASSERT_EQ(fit::ok(), *conn_result);
1302 std::unique_ptr<LowEnergyConnectionHandle> conn_handle =
1303 std::move(*conn_result).value();
1304 ASSERT_TRUE(conn_handle);
1305 EXPECT_EQ(conn_handle->bondable_mode(), sm::BondableMode::NonBondable);
1306 EXPECT_EQ(*conn_cb_advertisement_id, instance.id());
1307 conn_result.reset();
1308 }
1309
1310 // Tests where the constructor must run in the test, rather than Setup.
1311
1312 class AdapterConstructorTest : public TestingBase {
1313 public:
1314 AdapterConstructorTest() = default;
1315 ~AdapterConstructorTest() override = default;
1316
SetUp()1317 void SetUp() override {
1318 TestingBase::SetUp();
1319
1320 l2cap_ = std::make_unique<l2cap::testing::FakeL2cap>(dispatcher());
1321 gatt_ = std::make_unique<gatt::testing::FakeLayer>(dispatcher());
1322 }
1323
TearDown()1324 void TearDown() override {
1325 l2cap_ = nullptr;
1326 gatt_ = nullptr;
1327 TestingBase::TearDown();
1328 }
1329
1330 protected:
1331 std::unique_ptr<l2cap::testing::FakeL2cap> l2cap_;
1332 std::unique_ptr<gatt::testing::FakeLayer> gatt_;
1333 };
1334
1335 using GAP_AdapterConstructorTest = AdapterConstructorTest;
1336
TEST_F(AdapterConstructorTest,GattCallbacks)1337 TEST_F(AdapterConstructorTest, GattCallbacks) {
1338 constexpr PeerId kPeerId(1234);
1339 constexpr gatt::ServiceChangedCCCPersistedData kPersistedData = {
1340 .notify = true, .indicate = true};
1341
1342 int set_persist_cb_count = 0;
1343 int set_retrieve_cb_count = 0;
1344
1345 auto set_persist_cb_cb = [&set_persist_cb_count]() {
1346 set_persist_cb_count++;
1347 };
1348
1349 auto set_retrieve_cb_cb = [&set_retrieve_cb_count]() {
1350 set_retrieve_cb_count++;
1351 };
1352
1353 gatt_->SetSetPersistServiceChangedCCCCallbackCallback(set_persist_cb_cb);
1354 gatt_->SetSetRetrieveServiceChangedCCCCallbackCallback(set_retrieve_cb_cb);
1355
1356 EXPECT_EQ(set_persist_cb_count, 0);
1357 EXPECT_EQ(set_retrieve_cb_count, 0);
1358
1359 Adapter::Config config = {
1360 .legacy_pairing_enabled = false,
1361 };
1362 auto adapter = Adapter::Create(dispatcher(),
1363 transport()->GetWeakPtr(),
1364 gatt_->GetWeakPtr(),
1365 config,
1366 std::move(l2cap_));
1367
1368 EXPECT_EQ(set_persist_cb_count, 1);
1369 EXPECT_EQ(set_retrieve_cb_count, 1);
1370
1371 // Before the peer exists, adding its gatt info to the peer cache does
1372 // nothing.
1373 gatt_->CallPersistServiceChangedCCCCallback(
1374 kPeerId, /*notify=*/true, /*indicate=*/false);
1375 auto persisted_data_1 = gatt_->CallRetrieveServiceChangedCCCCallback(kPeerId);
1376 EXPECT_EQ(persisted_data_1, std::nullopt);
1377
1378 // After adding a classic peer, adding its info to the peer cache still does
1379 // nothing.
1380 Peer* classic_peer =
1381 adapter->peer_cache()->NewPeer(kTestAddrBrEdr, /*connectable=*/true);
1382 PeerId classic_peer_id = classic_peer->identifier();
1383
1384 gatt_->CallPersistServiceChangedCCCCallback(
1385 classic_peer_id, /*notify=*/false, /*indicate=*/true);
1386 auto persisted_data_2 =
1387 gatt_->CallRetrieveServiceChangedCCCCallback(classic_peer_id);
1388 EXPECT_EQ(persisted_data_2, std::nullopt);
1389
1390 // After adding an LE peer, adding its info to the peer cache works.
1391 Peer* le_peer =
1392 adapter->peer_cache()->NewPeer(kTestAddr, /*connectable=*/true);
1393 PeerId le_peer_id = le_peer->identifier();
1394
1395 gatt_->CallPersistServiceChangedCCCCallback(
1396 le_peer_id, /*notify=*/true, /*indicate=*/true);
1397 auto persisted_data_3 =
1398 gatt_->CallRetrieveServiceChangedCCCCallback(le_peer_id);
1399 ASSERT_TRUE(persisted_data_3.has_value());
1400 auto persisted_data_3_value = persisted_data_3.value();
1401 EXPECT_EQ(persisted_data_3_value, kPersistedData);
1402
1403 // After the peer is removed, the gatt info is no longer in the peer cache.
1404 bool result = adapter->peer_cache()->RemoveDisconnectedPeer(le_peer_id);
1405 EXPECT_TRUE(result);
1406
1407 auto persisted_data_4 =
1408 gatt_->CallRetrieveServiceChangedCCCCallback(le_peer_id);
1409 EXPECT_EQ(persisted_data_4, std::nullopt);
1410 }
1411
TEST_F(AdapterTest,BufferSizesRecordedInState)1412 TEST_F(AdapterTest, BufferSizesRecordedInState) {
1413 bool success = false;
1414 auto init_cb = [&](bool cb_success) { success = cb_success; };
1415
1416 FakeController::Settings settings;
1417 // Enable ReadBuffer commands.
1418 settings.AddBREDRSupportedCommands();
1419 settings.AddLESupportedCommands();
1420 settings.lmp_features_page0 |=
1421 static_cast<uint64_t>(hci_spec::LMPFeature::kLESupportedHost);
1422
1423 // Minimum supported size as per Core Spec v5.4, Vol 4, Part E, 7.8.2
1424 settings.le_acl_data_packet_length = 0x1B;
1425
1426 settings.le_total_num_acl_data_packets = 2;
1427 settings.acl_data_packet_length = 3;
1428 settings.total_num_acl_data_packets = 4;
1429 settings.synchronous_data_packet_length = 5;
1430 settings.total_num_synchronous_data_packets = 6;
1431 settings.iso_data_packet_length = 7;
1432 settings.total_num_iso_data_packets = 8;
1433 test_device()->set_settings(settings);
1434
1435 InitializeAdapter(std::move(init_cb));
1436 EXPECT_TRUE(success);
1437 EXPECT_EQ(adapter()
1438 ->state()
1439 .low_energy_state.acl_data_buffer_info()
1440 .max_data_length(),
1441 (uint16_t)0x1B);
1442 EXPECT_EQ(adapter()
1443 ->state()
1444 .low_energy_state.acl_data_buffer_info()
1445 .max_num_packets(),
1446 2u);
1447 EXPECT_EQ(adapter()->state().bredr_data_buffer_info.max_data_length(), 3u);
1448 EXPECT_EQ(adapter()->state().bredr_data_buffer_info.max_num_packets(), 4u);
1449 EXPECT_EQ(adapter()->state().sco_buffer_info.max_data_length(), 5u);
1450 EXPECT_EQ(adapter()->state().sco_buffer_info.max_num_packets(), 6u);
1451 EXPECT_EQ(adapter()
1452 ->state()
1453 .low_energy_state.iso_data_buffer_info()
1454 .max_data_length(),
1455 7u);
1456 EXPECT_EQ(adapter()
1457 ->state()
1458 .low_energy_state.iso_data_buffer_info()
1459 .max_num_packets(),
1460 8u);
1461 }
1462
TEST_F(AdapterTest,LEReadMaximumAdvertisingDataLengthNotSupported)1463 TEST_F(AdapterTest, LEReadMaximumAdvertisingDataLengthNotSupported) {
1464 FakeController::Settings settings;
1465 settings.AddBREDRSupportedCommands();
1466 settings.AddLESupportedCommands();
1467 settings.lmp_features_page0 |=
1468 static_cast<uint64_t>(hci_spec::LMPFeature::kLESupportedHost);
1469 settings.le_acl_data_packet_length = 0x1B;
1470 settings.le_total_num_acl_data_packets = 2;
1471 test_device()->set_settings(settings);
1472
1473 const LowEnergyState& low_energy_state = adapter()->state().low_energy_state;
1474 bool success = false;
1475 auto init_cb = [&](bool cb_success) { success = cb_success; };
1476 InitializeAdapter(std::move(init_cb));
1477 EXPECT_TRUE(success);
1478 EXPECT_EQ(hci_spec::kMaxLEAdvertisingDataLength,
1479 low_energy_state.max_advertising_data_length());
1480 }
1481
TEST_F(AdapterTest,LEReadMaximumAdvertisingDataLengthSupported)1482 TEST_F(AdapterTest, LEReadMaximumAdvertisingDataLengthSupported) {
1483 FakeController::Settings settings;
1484 settings.AddBREDRSupportedCommands();
1485 settings.AddLESupportedCommands();
1486 settings.lmp_features_page0 |=
1487 static_cast<uint64_t>(hci_spec::LMPFeature::kLESupportedHost);
1488 settings.le_acl_data_packet_length = 0x1B;
1489 settings.le_total_num_acl_data_packets = 2;
1490 settings.SupportedCommandsView()
1491 .le_read_maximum_advertising_data_length()
1492 .Write(true);
1493
1494 test_device()->set_settings(settings);
1495 test_device()->set_maximum_advertising_data_length(
1496 hci_spec::kMaxLEExtendedAdvertisingDataLength);
1497
1498 const LowEnergyState& low_energy_state = adapter()->state().low_energy_state;
1499 bool success = false;
1500 auto init_cb = [&](bool cb_success) { success = cb_success; };
1501 InitializeAdapter(std::move(init_cb));
1502 EXPECT_TRUE(success);
1503 EXPECT_EQ(hci_spec::kMaxLEExtendedAdvertisingDataLength,
1504 low_energy_state.max_advertising_data_length());
1505 }
1506
TEST_F(AdapterTest,LEConnectedIsochronousStreamSupported)1507 TEST_F(AdapterTest, LEConnectedIsochronousStreamSupported) {
1508 FakeController::Settings settings;
1509 settings.AddBREDRSupportedCommands();
1510 settings.AddLESupportedCommands();
1511 settings.lmp_features_page0 |=
1512 static_cast<uint64_t>(hci_spec::LMPFeature::kLESupportedHost);
1513 settings.le_features |= static_cast<uint64_t>(
1514 hci_spec::LESupportedFeature::kConnectedIsochronousStreamPeripheral);
1515 settings.le_acl_data_packet_length = 0x1B;
1516 settings.le_total_num_acl_data_packets = 2;
1517
1518 test_device()->set_settings(settings);
1519
1520 bool success = false;
1521 auto init_cb = [&](bool cb_success) { success = cb_success; };
1522 InitializeAdapter(std::move(init_cb));
1523 EXPECT_TRUE(success);
1524 const auto& le_features = test_device()->le_features();
1525 EXPECT_TRUE(
1526 (le_features.le_features &
1527 static_cast<uint64_t>(hci_spec::LESupportedFeature::
1528 kConnectedIsochronousStreamHostSupport)) != 0);
1529 }
1530
TEST_F(AdapterTest,ScoDataChannelInitializedSuccessfully)1531 TEST_F(AdapterTest, ScoDataChannelInitializedSuccessfully) {
1532 // Return valid buffer information and enable LE support.
1533 FakeController::Settings settings;
1534 settings.AddBREDRSupportedCommands();
1535 settings.lmp_features_page0 |=
1536 static_cast<uint64_t>(hci_spec::LMPFeature::kLESupportedHost);
1537 settings.le_acl_data_packet_length = 0x1B;
1538 settings.le_total_num_acl_data_packets = 1;
1539 // Ensure SCO buffers are available.
1540 settings.synchronous_data_packet_length = 6;
1541 settings.total_num_synchronous_data_packets = 2;
1542 // Enable SCO flow control command.
1543 settings.SupportedCommandsView()
1544 .write_synchronous_flow_control_enable()
1545 .Write(true);
1546 test_device()->set_settings(settings);
1547
1548 bool success = false;
1549 auto init_cb = [&](bool cb_success) { success = cb_success; };
1550 InitializeAdapter(std::move(init_cb));
1551 EXPECT_TRUE(success);
1552 EXPECT_TRUE(transport()->sco_data_channel());
1553 }
1554
TEST_F(AdapterTest,ScoDataChannelNotInitializedBecauseFlowControlNotSupported)1555 TEST_F(AdapterTest,
1556 ScoDataChannelNotInitializedBecauseFlowControlNotSupported) {
1557 // Return valid buffer information and enable LE support.
1558 FakeController::Settings settings;
1559 settings.AddBREDRSupportedCommands();
1560 settings.lmp_features_page0 |=
1561 static_cast<uint64_t>(hci_spec::LMPFeature::kLESupportedHost);
1562 settings.SupportedCommandsView()
1563 .write_synchronous_flow_control_enable()
1564 .Write(false);
1565 settings.le_acl_data_packet_length = 0x1B;
1566 settings.le_total_num_acl_data_packets = 1;
1567 // Ensure SCO buffers are available.
1568 settings.synchronous_data_packet_length = 6;
1569 settings.total_num_synchronous_data_packets = 2;
1570 test_device()->set_settings(settings);
1571
1572 bool success = false;
1573 auto init_cb = [&](bool cb_success) { success = cb_success; };
1574 InitializeAdapter(std::move(init_cb));
1575 EXPECT_TRUE(success);
1576 EXPECT_FALSE(transport()->sco_data_channel());
1577 }
1578
TEST_F(AdapterTest,ScoDataChannelNotInitializedBecauseBufferInfoNotAvailable)1579 TEST_F(AdapterTest, ScoDataChannelNotInitializedBecauseBufferInfoNotAvailable) {
1580 // Return valid buffer information and enable LE support.
1581 FakeController::Settings settings;
1582 settings.AddBREDRSupportedCommands();
1583 settings.lmp_features_page0 |=
1584 static_cast<uint64_t>(hci_spec::LMPFeature::kLESupportedHost);
1585 settings.le_acl_data_packet_length = 0x1B;
1586 settings.le_total_num_acl_data_packets = 1;
1587 // Ensure SCO buffers are not available.
1588 settings.synchronous_data_packet_length = 1;
1589 settings.total_num_synchronous_data_packets = 0;
1590 // Enable SCO flow control command.
1591 settings.SupportedCommandsView()
1592 .write_synchronous_flow_control_enable()
1593 .Write(true);
1594 test_device()->set_settings(settings);
1595
1596 bool success = false;
1597 auto init_cb = [&](bool cb_success) { success = cb_success; };
1598 InitializeAdapter(std::move(init_cb));
1599 EXPECT_TRUE(success);
1600 EXPECT_FALSE(transport()->sco_data_channel());
1601 }
1602
TEST_F(AdapterScoAndIsoDisabledTest,ScoDataChannelFailsToInitializeBecauseScoDisabled)1603 TEST_F(AdapterScoAndIsoDisabledTest,
1604 ScoDataChannelFailsToInitializeBecauseScoDisabled) {
1605 // Return valid buffer information and enable LE support.
1606 FakeController::Settings settings;
1607 settings.AddBREDRSupportedCommands();
1608 settings.lmp_features_page0 |=
1609 static_cast<uint64_t>(hci_spec::LMPFeature::kLESupportedHost);
1610 settings.le_acl_data_packet_length = 0x1B;
1611 settings.le_total_num_acl_data_packets = 1;
1612 // Ensure SCO buffers are available.
1613 settings.synchronous_data_packet_length = 6;
1614 settings.total_num_synchronous_data_packets = 2;
1615 // Enable SCO flow control command.
1616 settings.SupportedCommandsView()
1617 .write_synchronous_flow_control_enable()
1618 .Write(true);
1619 test_device()->set_settings(settings);
1620
1621 bool success = false;
1622 auto init_cb = [&](bool cb_success) { success = cb_success; };
1623 InitializeAdapter(std::move(init_cb));
1624 EXPECT_TRUE(success);
1625 EXPECT_FALSE(transport()->sco_data_channel());
1626 }
1627
TEST_F(AdapterTest,IsoDataChannelInitializedSuccessfully)1628 TEST_F(AdapterTest, IsoDataChannelInitializedSuccessfully) {
1629 FakeController::Settings settings;
1630 settings.ApplyDualModeDefaults();
1631 test_device()->set_settings(settings);
1632
1633 bool success = false;
1634 auto init_cb = [&](bool cb_success) { success = cb_success; };
1635 InitializeAdapter(std::move(init_cb));
1636 EXPECT_TRUE(success);
1637 EXPECT_TRUE(transport()->iso_data_channel());
1638 }
1639
TEST_F(AdapterTest,IsoDataChannelNotInitializedNoBufferData)1640 TEST_F(AdapterTest, IsoDataChannelNotInitializedNoBufferData) {
1641 FakeController::Settings settings;
1642 settings.ApplyDualModeDefaults();
1643 settings.iso_data_packet_length = 0;
1644 settings.total_num_iso_data_packets = 0;
1645 test_device()->set_settings(settings);
1646
1647 bool success = false;
1648 auto init_cb = [&](bool cb_success) { success = cb_success; };
1649 InitializeAdapter(std::move(init_cb));
1650 EXPECT_TRUE(success);
1651 EXPECT_FALSE(transport()->iso_data_channel());
1652 }
1653
TEST_F(AdapterScoAndIsoDisabledTest,IsoDataChannelNoControllerSupport)1654 TEST_F(AdapterScoAndIsoDisabledTest, IsoDataChannelNoControllerSupport) {
1655 FakeController::Settings settings;
1656 settings.ApplyDualModeDefaults();
1657 test_device()->set_settings(settings);
1658
1659 bool success = false;
1660 auto init_cb = [&](bool cb_success) { success = cb_success; };
1661 InitializeAdapter(std::move(init_cb));
1662 EXPECT_TRUE(success);
1663 EXPECT_FALSE(transport()->iso_data_channel());
1664 }
1665
TEST_F(AdapterTest,InitializeWriteSecureConnectionsHostSupport)1666 TEST_F(AdapterTest, InitializeWriteSecureConnectionsHostSupport) {
1667 bool success;
1668 int init_cb_count = 0;
1669 auto init_cb = [&](bool cb_success) {
1670 success = cb_success;
1671 init_cb_count++;
1672 };
1673
1674 // Enable LE support and extended features (Secure Connections Host Support)
1675 FakeController::Settings settings;
1676 settings.lmp_features_page0 |=
1677 static_cast<uint64_t>(hci_spec::LMPFeature::kLESupportedHost);
1678 settings.lmp_features_page0 |=
1679 static_cast<uint64_t>(hci_spec::LMPFeature::kExtendedFeatures);
1680 settings.lmp_features_page1 |= static_cast<uint64_t>(
1681 hci_spec::LMPFeature::kSecureConnectionsHostSupport);
1682 settings.le_acl_data_packet_length = 0x1B;
1683 settings.le_total_num_acl_data_packets = 1;
1684 test_device()->set_settings(settings);
1685
1686 InitializeAdapter(std::move(init_cb));
1687 EXPECT_TRUE(success);
1688 EXPECT_EQ(1, init_cb_count);
1689 EXPECT_TRUE(adapter()->state().IsLowEnergySupported());
1690 EXPECT_TRUE(adapter()->state().IsBREDRSupported());
1691 EXPECT_TRUE(adapter()->state().IsSecureConnectionHostSupportSupported());
1692 EXPECT_TRUE(adapter()->le());
1693 EXPECT_TRUE(adapter()->bredr());
1694 EXPECT_EQ(TechnologyType::kDualMode, adapter()->state().type());
1695 EXPECT_FALSE(transport_closed_called());
1696 }
1697
GetSupportedDelayRangeHelper(bool supported,const std::optional<std::vector<uint8_t>> & codec_config)1698 void AdapterTest::GetSupportedDelayRangeHelper(
1699 bool supported, const std::optional<std::vector<uint8_t>>& codec_config) {
1700 FakeController::Settings settings;
1701
1702 // Define minimum required settings for an LE controller
1703 settings.lmp_features_page0 |=
1704 static_cast<uint64_t>(hci_spec::LMPFeature::kLESupportedHost);
1705 settings.le_acl_data_packet_length = 0x1B;
1706 settings.le_total_num_acl_data_packets = 1;
1707
1708 // Enable or disable the "Read Local Supported Controller Delay" command
1709 settings.SupportedCommandsView()
1710 .read_local_supported_controller_delay()
1711 .Write(supported);
1712
1713 test_device()->set_settings(settings);
1714
1715 bool init_success = false;
1716 InitializeAdapter([&](bool success) { init_success = success; });
1717 ASSERT_TRUE(init_success);
1718
1719 pw::Status cb_status = static_cast<pw::Status::Code>(
1720 200); // Error code that should never be returned
1721 uint32_t min_delay_us = -1;
1722 uint32_t max_delay_us = -1;
1723 Adapter::GetSupportedDelayRangeCallback cb =
1724 [&](pw::Status status, uint32_t min_delay, uint32_t max_delay) {
1725 cb_status = status;
1726 min_delay_us = min_delay;
1727 max_delay_us = max_delay;
1728 };
1729
1730 // Construct codec ID information
1731 StaticPacket<pw::bluetooth::emboss::CodecIdWriter> codec_id;
1732 codec_id.view().coding_format().Write(
1733 pw::bluetooth::emboss::CodingFormat::U_LAW);
1734 codec_id.view().company_id().Write(0u);
1735 codec_id.view().vendor_codec_id().Write(0u);
1736
1737 adapter()->GetSupportedDelayRange(
1738 codec_id,
1739 pw::bluetooth::emboss::LogicalTransportType::BR_EDR_ACL,
1740 pw::bluetooth::emboss::DataPathDirection::INPUT,
1741 codec_config,
1742 std::move(cb));
1743 RunUntilIdle();
1744 if (!supported) {
1745 EXPECT_EQ(cb_status, PW_STATUS_UNIMPLEMENTED);
1746 } else {
1747 EXPECT_TRUE(cb_status.ok());
1748 EXPECT_LE(min_delay_us, max_delay_us);
1749 EXPECT_LE(max_delay_us, 0x3D0900u);
1750 }
1751 }
1752
1753 // Verify proper behavior when "Read Local Supported Controller Delay" command
1754 // is not supported in the controller.
TEST_F(AdapterTest,ReadLocalSupportedControllerDelayNotSupported)1755 TEST_F(AdapterTest, ReadLocalSupportedControllerDelayNotSupported) {
1756 GetSupportedDelayRangeHelper(false, std::nullopt);
1757 }
1758
1759 // Verify proper behavior when "Read Local Supported Controller Delay" command
1760 // is supported in the controller and behaves properly when codec configuration
1761 // is empty.
TEST_F(AdapterTest,ReadLocalSupportedControllerDelayBasic)1762 TEST_F(AdapterTest, ReadLocalSupportedControllerDelayBasic) {
1763 GetSupportedDelayRangeHelper(true, std::nullopt);
1764 }
1765 // Verify proper behavior when "Read Local Supported Controller Delay" command
1766 // is supported in the controller and behaves properly when codec configuration
1767 // is present.
TEST_F(AdapterTest,ReadLocalSupportedControllerDelayWithCodecConfig)1768 TEST_F(AdapterTest, ReadLocalSupportedControllerDelayWithCodecConfig) {
1769 std::vector<uint8_t> codec_configuration{0x11, 0x22, 0x33, 0x44, 0x55};
1770 GetSupportedDelayRangeHelper(true, codec_configuration);
1771 }
1772
1773 } // namespace
1774 } // namespace bt::gap
1775