123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497 |
- // Copyright 2017 The Chromium Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- #include "chromecast/base/alarm_manager.h"
- #include <memory>
- #include <utility>
- #include "base/bind.h"
- #include "base/test/simple_test_clock.h"
- #include "base/test/task_environment.h"
- #include "base/threading/thread_task_runner_handle.h"
- #include "base/time/clock.h"
- #include "testing/gtest/include/gtest/gtest.h"
- namespace chromecast {
- class AlarmManagerTest : public ::testing::Test {
- protected:
- class WallClockDependantTask {
- public:
- WallClockDependantTask() : fired_(false), weak_factory_(this) {}
- base::WeakPtr<WallClockDependantTask> GetWeakPtr() {
- return weak_factory_.GetWeakPtr();
- }
- void OnAlarmFire() { fired_ = true; }
- bool fired_;
- base::WeakPtrFactory<WallClockDependantTask> weak_factory_;
- };
- base::test::SingleThreadTaskEnvironment task_environment_{
- base::test::TaskEnvironment::TimeSource::MOCK_TIME};
- };
- TEST_F(AlarmManagerTest, AlarmNotFire) {
- WallClockDependantTask task;
- ASSERT_FALSE(task.fired_);
- // Create the AlarmManager.
- base::Time now = base::Time::Now();
- std::unique_ptr<base::SimpleTestClock> test_clock =
- std::make_unique<base::SimpleTestClock>();
- test_clock->SetNow(now);
- base::SimpleTestClock* clock = test_clock.get();
- std::unique_ptr<AlarmManager> manager = std::make_unique<AlarmManager>(
- clock, base::ThreadTaskRunnerHandle::Get());
- base::Time alarm_time = now + base::Minutes(10);
- std::unique_ptr<AlarmHandle> handle(manager->PostAlarmTask(
- base::BindOnce(&WallClockDependantTask::OnAlarmFire, task.GetWeakPtr()),
- alarm_time));
- task_environment_.FastForwardBy(base::Minutes(9));
- clock->Advance(base::Minutes(9));
- task_environment_.RunUntilIdle();
- ASSERT_FALSE(task.fired_);
- }
- TEST_F(AlarmManagerTest, AlarmFire) {
- WallClockDependantTask task;
- ASSERT_FALSE(task.fired_);
- // Create the AlarmManager.
- base::Time now = base::Time::Now();
- std::unique_ptr<base::SimpleTestClock> test_clock =
- std::make_unique<base::SimpleTestClock>();
- test_clock->SetNow(now);
- base::SimpleTestClock* clock = test_clock.get();
- std::unique_ptr<AlarmManager> manager = std::make_unique<AlarmManager>(
- clock, base::ThreadTaskRunnerHandle::Get());
- // Add an alarm.
- base::Time alarm_time = now + base::Minutes(10);
- std::unique_ptr<AlarmHandle> handle(manager->PostAlarmTask(
- base::BindOnce(&WallClockDependantTask::OnAlarmFire, task.GetWeakPtr()),
- alarm_time));
- clock->Advance(base::Minutes(10));
- task_environment_.FastForwardBy(base::Minutes(10));
- task_environment_.RunUntilIdle();
- ASSERT_TRUE(task.fired_);
- // Fires only once.
- task.fired_ = false;
- clock->Advance(base::Minutes(10));
- task_environment_.FastForwardBy(base::Minutes(10));
- task_environment_.RunUntilIdle();
- ASSERT_FALSE(task.fired_);
- }
- TEST_F(AlarmManagerTest, AlarmPast) {
- WallClockDependantTask task;
- ASSERT_FALSE(task.fired_);
- // Create the AlarmManager.
- base::Time now = base::Time::Now();
- std::unique_ptr<base::SimpleTestClock> test_clock =
- std::make_unique<base::SimpleTestClock>();
- test_clock->SetNow(now);
- std::unique_ptr<AlarmManager> manager = std::make_unique<AlarmManager>(
- test_clock.get(), base::ThreadTaskRunnerHandle::Get());
- // Add an alarm in the past. Should fire right away.
- base::Time alarm_time = base::Time::Now() - base::Minutes(10);
- std::unique_ptr<AlarmHandle> handle(manager->PostAlarmTask(
- base::BindOnce(&WallClockDependantTask::OnAlarmFire, task.GetWeakPtr()),
- alarm_time));
- task_environment_.FastForwardBy(base::Seconds(10));
- task_environment_.RunUntilIdle();
- ASSERT_TRUE(task.fired_);
- }
- TEST_F(AlarmManagerTest, AlarmTimeJump) {
- WallClockDependantTask task;
- ASSERT_FALSE(task.fired_);
- // Create the AlarmManager.
- base::Time now = base::Time::Now();
- std::unique_ptr<base::SimpleTestClock> test_clock =
- std::make_unique<base::SimpleTestClock>();
- test_clock->SetNow(now);
- base::SimpleTestClock* clock = test_clock.get();
- std::unique_ptr<AlarmManager> manager = std::make_unique<AlarmManager>(
- clock, base::ThreadTaskRunnerHandle::Get());
- // Add an alarm. The time jumps to the future.
- base::Time alarm_time = now + base::Minutes(10);
- std::unique_ptr<AlarmHandle> handle(manager->PostAlarmTask(
- base::BindOnce(&WallClockDependantTask::OnAlarmFire, task.GetWeakPtr()),
- alarm_time));
- clock->Advance(base::Minutes(10));
- task_environment_.FastForwardBy(base::Minutes(1));
- task_environment_.RunUntilIdle();
- ASSERT_TRUE(task.fired_);
- }
- TEST_F(AlarmManagerTest, AlarmJumpFuture) {
- WallClockDependantTask task;
- ASSERT_FALSE(task.fired_);
- // Create the AlarmManager.
- base::Time now = base::Time::Now();
- std::unique_ptr<base::SimpleTestClock> test_clock =
- std::make_unique<base::SimpleTestClock>();
- test_clock->SetNow(now);
- base::SimpleTestClock* clock = test_clock.get();
- std::unique_ptr<AlarmManager> manager = std::make_unique<AlarmManager>(
- clock, base::ThreadTaskRunnerHandle::Get());
- // Add an alarm. The time jumps far into the future.
- base::Time alarm_time = now + base::Minutes(10);
- std::unique_ptr<AlarmHandle> handle(manager->PostAlarmTask(
- base::BindOnce(&WallClockDependantTask::OnAlarmFire, task.GetWeakPtr()),
- alarm_time));
- clock->Advance(base::Minutes(60));
- task_environment_.FastForwardBy(base::Minutes(1));
- task_environment_.RunUntilIdle();
- ASSERT_TRUE(task.fired_);
- }
- TEST_F(AlarmManagerTest, AlarmMultiple) {
- WallClockDependantTask task1;
- WallClockDependantTask task2;
- ASSERT_FALSE(task1.fired_);
- ASSERT_FALSE(task2.fired_);
- // Create the AlarmManager.
- base::Time now = base::Time::Now();
- std::unique_ptr<base::SimpleTestClock> test_clock =
- std::make_unique<base::SimpleTestClock>();
- test_clock->SetNow(now);
- base::SimpleTestClock* clock = test_clock.get();
- std::unique_ptr<AlarmManager> manager = std::make_unique<AlarmManager>(
- clock, base::ThreadTaskRunnerHandle::Get());
- // Add first task.
- base::Time alarm_time = now + base::Minutes(10);
- std::unique_ptr<AlarmHandle> handle1(manager->PostAlarmTask(
- base::BindOnce(&WallClockDependantTask::OnAlarmFire, task1.GetWeakPtr()),
- alarm_time));
- // Add second task.
- alarm_time = now + base::Minutes(12);
- std::unique_ptr<AlarmHandle> handle2(manager->PostAlarmTask(
- base::BindOnce(&WallClockDependantTask::OnAlarmFire, task2.GetWeakPtr()),
- alarm_time));
- // First task should fire.
- clock->Advance(base::Minutes(10));
- task_environment_.FastForwardBy(base::Minutes(1));
- task_environment_.RunUntilIdle();
- ASSERT_TRUE(task1.fired_);
- ASSERT_FALSE(task2.fired_);
- // Reset state;
- task1.fired_ = false;
- task2.fired_ = false;
- // Second task should fire.
- clock->Advance(base::Minutes(2));
- task_environment_.FastForwardBy(base::Minutes(1));
- task_environment_.RunUntilIdle();
- ASSERT_FALSE(task1.fired_);
- ASSERT_TRUE(task2.fired_);
- }
- TEST_F(AlarmManagerTest, AlarmMultipleReverseOrder) {
- WallClockDependantTask task1;
- WallClockDependantTask task2;
- ASSERT_FALSE(task1.fired_);
- ASSERT_FALSE(task2.fired_);
- // Create the AlarmManager.
- base::Time now = base::Time::Now();
- std::unique_ptr<base::SimpleTestClock> test_clock =
- std::make_unique<base::SimpleTestClock>();
- test_clock->SetNow(now);
- base::SimpleTestClock* clock = test_clock.get();
- std::unique_ptr<AlarmManager> manager = std::make_unique<AlarmManager>(
- clock, base::ThreadTaskRunnerHandle::Get());
- // Add first task.
- base::Time alarm_time = now + base::Minutes(12);
- std::unique_ptr<AlarmHandle> handle1(manager->PostAlarmTask(
- base::BindOnce(&WallClockDependantTask::OnAlarmFire, task1.GetWeakPtr()),
- alarm_time));
- // Add second task.
- alarm_time = now + base::Minutes(10);
- std::unique_ptr<AlarmHandle> handle2(manager->PostAlarmTask(
- base::BindOnce(&WallClockDependantTask::OnAlarmFire, task2.GetWeakPtr()),
- alarm_time));
- // Second task should fire.
- clock->Advance(base::Minutes(10));
- task_environment_.FastForwardBy(base::Minutes(1));
- task_environment_.RunUntilIdle();
- ASSERT_FALSE(task1.fired_);
- ASSERT_TRUE(task2.fired_);
- // Reset state;
- task1.fired_ = false;
- task2.fired_ = false;
- // First task should fire.
- clock->Advance(base::Minutes(2));
- task_environment_.FastForwardBy(base::Minutes(1));
- task_environment_.RunUntilIdle();
- ASSERT_TRUE(task1.fired_);
- ASSERT_FALSE(task2.fired_);
- }
- TEST_F(AlarmManagerTest, AlarmMultipleSameTime) {
- WallClockDependantTask task1;
- WallClockDependantTask task2;
- WallClockDependantTask task3;
- ASSERT_FALSE(task1.fired_);
- ASSERT_FALSE(task2.fired_);
- ASSERT_FALSE(task3.fired_);
- // Create the AlarmManager.
- base::Time now = base::Time::Now();
- std::unique_ptr<base::SimpleTestClock> test_clock =
- std::make_unique<base::SimpleTestClock>();
- test_clock->SetNow(now);
- base::SimpleTestClock* clock = test_clock.get();
- std::unique_ptr<AlarmManager> manager = std::make_unique<AlarmManager>(
- clock, base::ThreadTaskRunnerHandle::Get());
- // Add first task.
- base::Time alarm_time = now + base::Minutes(12);
- std::unique_ptr<AlarmHandle> handle1(manager->PostAlarmTask(
- base::BindOnce(&WallClockDependantTask::OnAlarmFire, task1.GetWeakPtr()),
- alarm_time));
- // Add second task.
- alarm_time = now + base::Minutes(16);
- std::unique_ptr<AlarmHandle> handle2(manager->PostAlarmTask(
- base::BindOnce(&WallClockDependantTask::OnAlarmFire, task2.GetWeakPtr()),
- alarm_time));
- // Add third task.
- alarm_time = now + base::Minutes(12);
- std::unique_ptr<AlarmHandle> handle3(manager->PostAlarmTask(
- base::BindOnce(&WallClockDependantTask::OnAlarmFire, task3.GetWeakPtr()),
- alarm_time));
- // First and third task should fire.
- clock->Advance(base::Minutes(12));
- task_environment_.FastForwardBy(base::Minutes(1));
- task_environment_.RunUntilIdle();
- ASSERT_TRUE(task1.fired_);
- ASSERT_FALSE(task2.fired_);
- ASSERT_TRUE(task3.fired_);
- }
- TEST_F(AlarmManagerTest, AlarmMultipleShuffle) {
- WallClockDependantTask task1;
- WallClockDependantTask task2;
- WallClockDependantTask task3;
- ASSERT_FALSE(task1.fired_);
- ASSERT_FALSE(task2.fired_);
- ASSERT_FALSE(task3.fired_);
- // Create the AlarmManager.
- base::Time now = base::Time::Now();
- std::unique_ptr<base::SimpleTestClock> test_clock =
- std::make_unique<base::SimpleTestClock>();
- test_clock->SetNow(now);
- base::SimpleTestClock* clock = test_clock.get();
- std::unique_ptr<AlarmManager> manager = std::make_unique<AlarmManager>(
- clock, base::ThreadTaskRunnerHandle::Get());
- // Add first task.
- base::Time alarm_time = now + base::Minutes(15);
- std::unique_ptr<AlarmHandle> handle1(manager->PostAlarmTask(
- base::BindOnce(&WallClockDependantTask::OnAlarmFire, task1.GetWeakPtr()),
- alarm_time));
- // Add second task.
- alarm_time = now + base::Minutes(16);
- std::unique_ptr<AlarmHandle> handle2(manager->PostAlarmTask(
- base::BindOnce(&WallClockDependantTask::OnAlarmFire, task2.GetWeakPtr()),
- alarm_time));
- // Add third task.
- alarm_time = now + base::Minutes(11);
- std::unique_ptr<AlarmHandle> handle3(manager->PostAlarmTask(
- base::BindOnce(&WallClockDependantTask::OnAlarmFire, task3.GetWeakPtr()),
- alarm_time));
- // Third task should fire.
- clock->Advance(base::Minutes(12));
- task_environment_.FastForwardBy(base::Minutes(1));
- task_environment_.RunUntilIdle();
- ASSERT_FALSE(task1.fired_);
- ASSERT_FALSE(task2.fired_);
- ASSERT_TRUE(task3.fired_);
- clock->Advance(base::Minutes(3));
- task_environment_.FastForwardBy(base::Minutes(1));
- task_environment_.RunUntilIdle();
- ASSERT_TRUE(task1.fired_);
- ASSERT_FALSE(task2.fired_);
- ASSERT_TRUE(task3.fired_);
- }
- TEST_F(AlarmManagerTest, AlarmTwice) {
- WallClockDependantTask task1;
- WallClockDependantTask task2;
- ASSERT_FALSE(task1.fired_);
- ASSERT_FALSE(task2.fired_);
- // Create the AlarmManager.
- base::Time now = base::Time::Now();
- std::unique_ptr<base::SimpleTestClock> test_clock =
- std::make_unique<base::SimpleTestClock>();
- test_clock->SetNow(now);
- base::SimpleTestClock* clock = test_clock.get();
- std::unique_ptr<AlarmManager> manager = std::make_unique<AlarmManager>(
- clock, base::ThreadTaskRunnerHandle::Get());
- // Add first task.
- base::Time alarm_time = now + base::Minutes(15);
- std::unique_ptr<AlarmHandle> handle1(manager->PostAlarmTask(
- base::BindOnce(&WallClockDependantTask::OnAlarmFire, task1.GetWeakPtr()),
- alarm_time));
- // Add it again with less time.
- alarm_time = now + base::Minutes(1);
- std::unique_ptr<AlarmHandle> handle2(manager->PostAlarmTask(
- base::BindOnce(&WallClockDependantTask::OnAlarmFire, task1.GetWeakPtr()),
- alarm_time));
- // Add second task.
- alarm_time = now + base::Minutes(16);
- std::unique_ptr<AlarmHandle> handle3(manager->PostAlarmTask(
- base::BindOnce(&WallClockDependantTask::OnAlarmFire, task2.GetWeakPtr()),
- alarm_time));
- // First task should fire.
- clock->Advance(base::Minutes(1));
- task_environment_.FastForwardBy(base::Minutes(1));
- task_environment_.RunUntilIdle();
- ASSERT_TRUE(task1.fired_);
- ASSERT_FALSE(task2.fired_);
- task1.fired_ = false;
- task2.fired_ = false;
- // First task should fire again because it was added twice.
- clock->Advance(base::Minutes(14));
- task_environment_.FastForwardBy(base::Minutes(1));
- task_environment_.RunUntilIdle();
- ASSERT_TRUE(task1.fired_);
- ASSERT_FALSE(task2.fired_);
- }
- TEST_F(AlarmManagerTest, AlarmCancel) {
- std::unique_ptr<WallClockDependantTask> task1 =
- std::make_unique<WallClockDependantTask>();
- std::unique_ptr<WallClockDependantTask> task2 =
- std::make_unique<WallClockDependantTask>();
- std::unique_ptr<WallClockDependantTask> task3 =
- std::make_unique<WallClockDependantTask>();
- ASSERT_FALSE(task1->fired_);
- ASSERT_FALSE(task2->fired_);
- ASSERT_FALSE(task3->fired_);
- // Create the AlarmManager.
- base::Time now = base::Time::Now();
- std::unique_ptr<base::SimpleTestClock> test_clock =
- std::make_unique<base::SimpleTestClock>();
- test_clock->SetNow(now);
- base::SimpleTestClock* clock = test_clock.get();
- std::unique_ptr<AlarmManager> manager = std::make_unique<AlarmManager>(
- clock, base::ThreadTaskRunnerHandle::Get());
- // Add first task.
- base::Time alarm_time = now + base::Minutes(12);
- std::unique_ptr<AlarmHandle> handle1(manager->PostAlarmTask(
- base::BindOnce(&WallClockDependantTask::OnAlarmFire, task1->GetWeakPtr()),
- alarm_time));
- // Add second task.
- alarm_time = now + base::Minutes(16);
- std::unique_ptr<AlarmHandle> handle2(manager->PostAlarmTask(
- base::BindOnce(&WallClockDependantTask::OnAlarmFire, task2->GetWeakPtr()),
- alarm_time));
- // Add third task.
- alarm_time = now + base::Minutes(12);
- std::unique_ptr<AlarmHandle> handle3(manager->PostAlarmTask(
- base::BindOnce(&WallClockDependantTask::OnAlarmFire, task3->GetWeakPtr()),
- alarm_time));
- // Remove the first task.
- task1.reset(nullptr);
- // Third task should fire.
- clock->Advance(base::Minutes(15));
- task_environment_.FastForwardBy(base::Minutes(1));
- task_environment_.RunUntilIdle();
- ASSERT_FALSE(task2->fired_);
- ASSERT_TRUE(task3->fired_);
- }
- TEST_F(AlarmManagerTest, AlarmDeleteHandle) {
- std::unique_ptr<WallClockDependantTask> task1 =
- std::make_unique<WallClockDependantTask>();
- std::unique_ptr<WallClockDependantTask> task2 =
- std::make_unique<WallClockDependantTask>();
- std::unique_ptr<WallClockDependantTask> task3 =
- std::make_unique<WallClockDependantTask>();
- ASSERT_FALSE(task1->fired_);
- ASSERT_FALSE(task2->fired_);
- ASSERT_FALSE(task3->fired_);
- // Create the AlarmManager.
- base::Time now = base::Time::Now();
- std::unique_ptr<base::SimpleTestClock> test_clock =
- std::make_unique<base::SimpleTestClock>();
- test_clock->SetNow(now);
- base::SimpleTestClock* clock = test_clock.get();
- std::unique_ptr<AlarmManager> manager = std::make_unique<AlarmManager>(
- clock, base::ThreadTaskRunnerHandle::Get());
- // Add first task.
- base::Time alarm_time = now + base::Minutes(12);
- std::unique_ptr<AlarmHandle> handle1(manager->PostAlarmTask(
- base::BindOnce(&WallClockDependantTask::OnAlarmFire, task1->GetWeakPtr()),
- alarm_time));
- // Add second task.
- alarm_time = now + base::Minutes(16);
- std::unique_ptr<AlarmHandle> handle2(manager->PostAlarmTask(
- base::BindOnce(&WallClockDependantTask::OnAlarmFire, task2->GetWeakPtr()),
- alarm_time));
- // Add third task.
- alarm_time = now + base::Minutes(12);
- std::unique_ptr<AlarmHandle> handle3(manager->PostAlarmTask(
- base::BindOnce(&WallClockDependantTask::OnAlarmFire, task3->GetWeakPtr()),
- alarm_time));
- // Delete the first task's handle.
- handle1.reset();
- // Third task should fire.
- clock->Advance(base::Minutes(15));
- task_environment_.FastForwardBy(base::Minutes(1));
- task_environment_.RunUntilIdle();
- ASSERT_FALSE(task1->fired_);
- ASSERT_FALSE(task2->fired_);
- ASSERT_TRUE(task3->fired_);
- }
- } // namespace chromecast
|