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