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

Commit f60c9b2f authored by Hsin-chen Chuang's avatar Hsin-chen Chuang Committed by Automerger Merge Worker
Browse files

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

parents 1a13c350 ef397c4f
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;
+3 −0
Original line number Diff line number Diff line
@@ -542,6 +542,8 @@ struct LeScanningManager::impl : public LeAddressManagerCallback {
  }

  void scan(bool start) {
    // On-resume flag should always be reset if there is an explicit start/stop call.
    scan_on_resume_ = false;
    if (start) {
      configure_scan();
      start_scan();
@@ -1610,6 +1612,7 @@ struct LeScanningManager::impl : public LeAddressManagerCallback {
    }
    paused_ = false;
    if (scan_on_resume_ == true) {
      scan_on_resume_ = false;
      start_scan();
    }
    le_address_manager_->AckResume(this);
+66 −0
Original line number Diff line number Diff line
@@ -611,6 +611,72 @@ 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));
  sync_client_handler();

  // Pause scan
  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));

  // Disable scan
  le_scanning_manager->Scan(false);
  test_hci_layer_->AssertNoQueuedCommand();

  // 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));

  // 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, on_pause_on_resume_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));
  sync_client_handler();

  // Pause scan
  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));

  // Ensure scan is resumed (enabled)
  test_le_address_manager->client_->OnResume();
  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_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;