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

Commit 17bfc0e9 authored by Łukasz Rymanowski's avatar Łukasz Rymanowski
Browse files

test/fake_osi: Improve fake alarms managing

With this patch, alarm_is_scheduled() will return based on scheduler
alarms and not only based on last scheduled alartm.

Also some loging has been added.

Bug: 372120241
Flag: TEST_ONLY
Test: mmm packages/modules/Bluetooth
Change-Id: Id4b77fd0eaf2a771546a99183692fed55988a919
parent cf4bfc9d
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@
#include "osi/include/alarm.h"

struct fake_osi_alarm_set_on_mloop {
  alarm_t* alarm;
  uint64_t interval_ms{0};
  alarm_callback_t cb{};
  void* data{nullptr};
+60 −5
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@

#include "osi/include/osi.h"

#include <bluetooth/log.h>
#include <sys/socket.h>

#include <list>
@@ -335,24 +336,70 @@ alarm_t* alarm_new_periodic(const char* name) {
  inc_func_call_count(__func__);
  return nullptr;
}

// Callback to last set alarm
struct fake_osi_alarm_set_on_mloop fake_osi_alarm_set_on_mloop_;

// Vector of previous osi alarms. Keep it for proper handling alarm_is_scheduler function
static std::vector<struct fake_osi_alarm_set_on_mloop> previous_fake_osi_alarms_;

bool alarm_is_scheduled(const alarm_t* alarm) {
  inc_func_call_count(__func__);
  return fake_osi_alarm_set_on_mloop_.cb != nullptr;

  auto iter =
          find_if(previous_fake_osi_alarms_.begin(), previous_fake_osi_alarms_.end(),
                  [alarm](auto const& a) {
                    bluetooth::log::debug("iter: {} == {} ?", fmt::ptr(a.alarm), fmt::ptr(alarm));
                    return a.alarm == alarm;
                  });
  if (iter != previous_fake_osi_alarms_.end()) {
    return true;
  }

  bluetooth::log::debug(" {} == {} ?", fmt::ptr(fake_osi_alarm_set_on_mloop_.alarm),
                        fmt::ptr(alarm));

  return fake_osi_alarm_set_on_mloop_.alarm == alarm;
}
uint64_t alarm_get_remaining_ms(const alarm_t* alarm) {
  inc_func_call_count(__func__);
  return 0;
}
void alarm_cancel(alarm_t* alarm) {
  inc_func_call_count(__func__);

static void fake_osi_alarm_clear(alarm_t* alarm) {
  if (alarm != nullptr) {
    auto iter = find_if(previous_fake_osi_alarms_.begin(), previous_fake_osi_alarms_.end(),
                        [alarm](auto const& a) { return a.alarm == alarm; });
    if (iter != previous_fake_osi_alarms_.end()) {
      bluetooth::log::debug(" clearing alarm {} ", fmt::ptr(iter->alarm));
      previous_fake_osi_alarms_.erase(iter);
      return;
    }
  }

  if (fake_osi_alarm_set_on_mloop_.alarm == alarm || alarm == nullptr) {
    bluetooth::log::debug(" clearing alarm {} ", fmt::ptr(alarm));
    fake_osi_alarm_set_on_mloop_.alarm = nullptr;
    fake_osi_alarm_set_on_mloop_.interval_ms = 0;
    fake_osi_alarm_set_on_mloop_.cb = nullptr;
    fake_osi_alarm_set_on_mloop_.data = nullptr;
  }
void alarm_cleanup(void) { inc_func_call_count(__func__); }
}

void alarm_cancel(alarm_t* alarm) {
  inc_func_call_count(__func__);
  fake_osi_alarm_clear(alarm);
}

void alarm_cleanup(void) {
  previous_fake_osi_alarms_.clear();
  fake_osi_alarm_clear(nullptr);

  inc_func_call_count(__func__);
}
void alarm_debug_dump(int fd) { inc_func_call_count(__func__); }
void alarm_free(alarm_t* alarm) {
  fake_osi_alarm_clear(alarm);
  uint8_t* ptr = (uint8_t*)alarm;
  delete[] ptr;
  inc_func_call_count(__func__);
@@ -363,6 +410,14 @@ void alarm_set(alarm_t* alarm, uint64_t interval_ms, alarm_callback_t cb, void*

void alarm_set_on_mloop(alarm_t* alarm, uint64_t interval_ms, alarm_callback_t cb, void* data) {
  inc_func_call_count(__func__);

  if (fake_osi_alarm_set_on_mloop_.alarm != nullptr) {
    bluetooth::log::info("Queuing alarm {}", fmt::ptr(fake_osi_alarm_set_on_mloop_.alarm));
    previous_fake_osi_alarms_.push_back(fake_osi_alarm_set_on_mloop_);
  }

  bluetooth::log::info("Adding alarm {}", fmt::ptr(alarm));
  fake_osi_alarm_set_on_mloop_.alarm = alarm;
  fake_osi_alarm_set_on_mloop_.interval_ms = interval_ms;
  fake_osi_alarm_set_on_mloop_.cb = cb;
  fake_osi_alarm_set_on_mloop_.data = data;