Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1d9c8da5 authored by Hsin-chen Chuang's avatar Hsin-chen Chuang Committed by Gerrit Code Review
Browse files

Merge "le_scanning_manager: Avoid sending double enabled commands" into main

parents c80588da 68c3c0bf
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -104,6 +104,10 @@ CommandView TestHciLayer::GetCommand() {
  return command_packet_view;
}

void TestHciLayer::AssertNoQueuedCommand() {
  EXPECT_TRUE(command_queue_.empty());
}

void TestHciLayer::RegisterEventHandler(
    EventCode event_code, common::ContextualCallback<void(EventView)> event_handler) {
  registered_events_[event_code] = event_handler;
+2 −0
Original line number Diff line number Diff line
@@ -42,6 +42,8 @@ class TestHciLayer : public HciLayer {

  CommandView GetCommand();

  void AssertNoQueuedCommand();

  void RegisterEventHandler(EventCode event_code, common::ContextualCallback<void(EventView)> event_handler) override;

  void UnregisterEventHandler(EventCode event_code) override;
+4 −0
Original line number Diff line number Diff line
@@ -561,6 +561,8 @@ struct LeScanningManager::impl : public LeAddressManagerCallback {
      scan_on_resume_ = true;
      return;
    }
    scan_on_resume_ = false;

    is_scanning_ = true;
    if (!address_manager_registered_) {
      le_address_manager_->Register(this);
@@ -584,6 +586,8 @@ struct LeScanningManager::impl : public LeAddressManagerCallback {
  }

  void stop_scan() {
    scan_on_resume_ = false;

    if (!is_scanning_) {
      LOG_INFO("Scanning already stopped, return!");
      return;
+35 −0
Original line number Diff line number Diff line
@@ -611,6 +611,41 @@ TEST_F(LeScanningManagerExtendedTest, start_scan_test) {
  test_hci_layer_->IncomingLeMetaEvent(LeExtendedAdvertisingReportBuilder::Create({report}));
}

TEST_F(LeScanningManagerExtendedTest, start_scan_on_resume_conflict_test) {
  TestLeAddressManager* test_le_address_manager =
      (TestLeAddressManager*)test_acl_manager_->GetLeAddressManager();

  // Enable scan
  le_scanning_manager->Scan(true);
  ASSERT_EQ(OpCode::LE_SET_EXTENDED_SCAN_PARAMETERS, test_hci_layer_->GetCommand().GetOpCode());
  test_hci_layer_->IncomingEvent(
      LeSetExtendedScanParametersCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS));
  ASSERT_EQ(OpCode::LE_SET_EXTENDED_SCAN_ENABLE, test_hci_layer_->GetCommand().GetOpCode());
  test_hci_layer_->IncomingEvent(
      LeSetExtendedScanEnableCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS));

  test_le_address_manager->client_->OnPause();
  ASSERT_EQ(OpCode::LE_SET_EXTENDED_SCAN_ENABLE, test_hci_layer_->GetCommand().GetOpCode());
  test_hci_layer_->IncomingEvent(
      LeSetExtendedScanEnableCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS));

  le_scanning_manager->Scan(false);
  test_hci_layer_->AssertNoQueuedCommand();

  le_scanning_manager->Scan(true);
  ASSERT_EQ(OpCode::LE_SET_EXTENDED_SCAN_PARAMETERS, test_hci_layer_->GetCommand().GetOpCode());
  test_hci_layer_->IncomingEvent(
      LeSetExtendedScanParametersCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS));
  ASSERT_EQ(OpCode::LE_SET_EXTENDED_SCAN_ENABLE, test_hci_layer_->GetCommand().GetOpCode());
  test_hci_layer_->IncomingEvent(
      LeSetExtendedScanEnableCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS));

  // Ensure there is no double enable commands on resume
  test_le_address_manager->client_->OnResume();
  sync_client_handler();
  test_hci_layer_->AssertNoQueuedCommand();
}

TEST_F(LeScanningManagerExtendedTest, ignore_on_pause_on_resume_after_unregistered) {
  TestLeAddressManager* test_le_address_manager = (TestLeAddressManager*)test_acl_manager_->GetLeAddressManager();
  test_le_address_manager->ignore_unregister_for_testing = true;