Loading system/gd/os/linux_generic/alarm_unittest.cc +52 −6 Original line number Diff line number Diff line Loading @@ -16,7 +16,9 @@ #include "os/alarm.h" #include <cstddef> #include <future> #include <memory> #include "common/bind.h" #include "gtest/gtest.h" Loading @@ -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_; Loading @@ -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_; Loading Loading @@ -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)); } Loading @@ -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 Loading
system/gd/os/linux_generic/alarm_unittest.cc +52 −6 Original line number Diff line number Diff line Loading @@ -16,7 +16,9 @@ #include "os/alarm.h" #include <cstddef> #include <future> #include <memory> #include "common/bind.h" #include "gtest/gtest.h" Loading @@ -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_; Loading @@ -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_; Loading Loading @@ -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)); } Loading @@ -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