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

Commit f7951765 authored by Myles Watson's avatar Myles Watson Committed by Gerrit Code Review
Browse files

Merge "alarm_unittest: Add TwoAlarmTest" into main

parents 41c04871 60eab168
Loading
Loading
Loading
Loading
+52 −6
Original line number Diff line number Diff line
@@ -16,7 +16,9 @@

#include "os/alarm.h"

#include <cstddef>
#include <future>
#include <memory>

#include "common/bind.h"
#include "gtest/gtest.h"
@@ -35,11 +37,11 @@ class AlarmTest : public ::testing::Test {
  void SetUp() override {
    thread_ = new Thread("test_thread", Thread::Priority::NORMAL);
    handler_ = new Handler(thread_);
    alarm_ = new Alarm(handler_);
    alarm_ = std::make_shared<Alarm>(handler_);
  }

  void TearDown() override {
    delete alarm_;
    alarm_.reset();
    handler_->Clear();
    delete handler_;
    delete thread_;
@@ -49,7 +51,12 @@ class AlarmTest : public ::testing::Test {
  void fake_timer_advance(uint64_t ms) {
    handler_->Post(common::BindOnce(fake_timerfd_advance, ms));
  }
  Alarm* alarm_;

  std::shared_ptr<Alarm> get_new_alarm() {
    return std::make_shared<Alarm>(handler_);
  }

  std::shared_ptr<Alarm> alarm_;

 private:
  Handler* handler_;
@@ -78,7 +85,7 @@ TEST_F(AlarmTest, cancel_alarm) {
}

TEST_F(AlarmTest, cancel_alarm_from_callback) {
  alarm_->Schedule(BindOnce(&Alarm::Cancel, common::Unretained(alarm_)), std::chrono::milliseconds(1));
  alarm_->Schedule(BindOnce(&Alarm::Cancel, alarm_), std::chrono::milliseconds(1));
  std::this_thread::sleep_for(std::chrono::milliseconds(5));
}

@@ -94,11 +101,50 @@ TEST_F(AlarmTest, schedule_while_alarm_armed) {

TEST_F(AlarmTest, delete_while_alarm_armed) {
  alarm_->Schedule(BindOnce([]() { ASSERT_TRUE(false) << "Should not happen"; }), std::chrono::milliseconds(1));
  delete alarm_;
  alarm_ = nullptr;
  alarm_.reset();
  std::this_thread::sleep_for(std::chrono::milliseconds(10));
}

class TwoAlarmTest : public AlarmTest {
 protected:
  void SetUp() override {
    AlarmTest::SetUp();
    alarm2 = get_new_alarm();
  }

  void TearDown() override {
    alarm2.reset();
    AlarmTest::TearDown();
  }

  std::shared_ptr<Alarm> alarm2;
};

TEST_F(TwoAlarmTest, schedule_from_alarm_long) {
  auto promise = std::make_unique<std::promise<void>>();
  auto future = promise->get_future();
  auto promise2 = std::make_unique<std::promise<void>>();
  auto future2 = promise2->get_future();
  alarm_->Schedule(
      BindOnce(
          [](std::shared_ptr<Alarm> alarm2,
             std::unique_ptr<std::promise<void>> promise,
             std::unique_ptr<std::promise<void>> promise2) {
            promise->set_value();
            alarm2->Schedule(
                BindOnce(&std::promise<void>::set_value, std::move(promise2)),
                std::chrono::milliseconds(10));
          },
          alarm2,
          std::move(promise),
          std::move(promise2)),
      std::chrono::milliseconds(1));
  fake_timer_advance(10);
  EXPECT_EQ(std::future_status::ready, future.wait_for(std::chrono::milliseconds(20)));
  fake_timer_advance(10);
  EXPECT_EQ(std::future_status::ready, future2.wait_for(std::chrono::milliseconds(20)));
}

}  // namespace
}  // namespace os
}  // namespace bluetooth