Index: chromecast/base/alarm_manager_unittest.cc |
diff --git a/chromecast/base/alarm_manager_unittest.cc b/chromecast/base/alarm_manager_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b1d381a041701620aa4d11045357999b423bc1ea |
--- /dev/null |
+++ b/chromecast/base/alarm_manager_unittest.cc |
@@ -0,0 +1,452 @@ |
+// 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 "base/memory/ptr_util.h" |
+#include "base/message_loop/message_loop.h" |
+#include "base/test/simple_test_clock.h" |
+#include "base/test/test_mock_time_task_runner.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_; |
+ }; |
+ void SetUp() override { |
+ message_loop_.reset(new base::MessageLoop); |
+ task_runner_ = new base::TestMockTimeTaskRunner; |
+ message_loop_->SetTaskRunner(task_runner_); |
+ } |
+ |
+ void TearDown() override { |
+ task_runner_ = nullptr; |
+ message_loop_.reset(); |
+ } |
+ |
+ std::unique_ptr<base::MessageLoop> message_loop_; |
+ scoped_refptr<base::TestMockTimeTaskRunner> task_runner_; |
+}; |
+ |
+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 = |
+ base::MakeUnique<base::SimpleTestClock>(); |
+ test_clock->SetNow(now); |
+ base::SimpleTestClock* clock = test_clock.get(); |
+ std::unique_ptr<AlarmManager> manager = |
+ base::MakeUnique<AlarmManager>(std::move(test_clock), task_runner_); |
+ |
+ base::Time alarm_time = now + base::TimeDelta::FromMinutes(10); |
+ manager->PostAlarmTask( |
+ base::Bind(&WallClockDependantTask::OnAlarmFire, task.GetWeakPtr()), |
+ alarm_time); |
+ task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(9)); |
+ clock->Advance(base::TimeDelta::FromMinutes(9)); |
+ task_runner_->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 = |
+ base::MakeUnique<base::SimpleTestClock>(); |
+ test_clock->SetNow(now); |
+ base::SimpleTestClock* clock = test_clock.get(); |
+ std::unique_ptr<AlarmManager> manager = |
+ base::MakeUnique<AlarmManager>(std::move(test_clock), task_runner_); |
+ |
+ // Add an alarm. |
+ base::Time alarm_time = now + base::TimeDelta::FromMinutes(10); |
+ manager->PostAlarmTask( |
+ base::Bind(&WallClockDependantTask::OnAlarmFire, task.GetWeakPtr()), |
+ alarm_time); |
+ clock->Advance(base::TimeDelta::FromMinutes(10)); |
+ task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(10)); |
+ task_runner_->RunUntilIdle(); |
+ ASSERT_TRUE(task.fired_); |
+ |
+ // Fires only once. |
+ task.fired_ = false; |
+ clock->Advance(base::TimeDelta::FromMinutes(10)); |
+ task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(10)); |
+ task_runner_->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 = |
+ base::MakeUnique<base::SimpleTestClock>(); |
+ test_clock->SetNow(now); |
+ std::unique_ptr<AlarmManager> manager = |
+ base::MakeUnique<AlarmManager>(std::move(test_clock), task_runner_); |
+ |
+ // Add an alarm in the past. Should fire right away. |
+ base::Time alarm_time = base::Time::Now() - base::TimeDelta::FromMinutes(10); |
+ manager->PostAlarmTask( |
+ base::Bind(&WallClockDependantTask::OnAlarmFire, task.GetWeakPtr()), |
+ alarm_time); |
+ task_runner_->FastForwardBy(base::TimeDelta::FromSeconds(10)); |
+ task_runner_->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 = |
+ base::MakeUnique<base::SimpleTestClock>(); |
+ test_clock->SetNow(now); |
+ base::SimpleTestClock* clock = test_clock.get(); |
+ std::unique_ptr<AlarmManager> manager = |
+ base::MakeUnique<AlarmManager>(std::move(test_clock), task_runner_); |
+ |
+ // Add an alarm. The time jumps to the future. |
+ base::Time alarm_time = now + base::TimeDelta::FromMinutes(10); |
+ manager->PostAlarmTask( |
+ base::Bind(&WallClockDependantTask::OnAlarmFire, task.GetWeakPtr()), |
+ alarm_time); |
+ clock->Advance(base::TimeDelta::FromMinutes(10)); |
+ task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(1)); |
+ task_runner_->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 = |
+ base::MakeUnique<base::SimpleTestClock>(); |
+ test_clock->SetNow(now); |
+ base::SimpleTestClock* clock = test_clock.get(); |
+ std::unique_ptr<AlarmManager> manager = |
+ base::MakeUnique<AlarmManager>(std::move(test_clock), task_runner_); |
+ |
+ // Add an alarm. The time jumps far into the future. |
+ base::Time alarm_time = now + base::TimeDelta::FromMinutes(10); |
+ manager->PostAlarmTask( |
+ base::Bind(&WallClockDependantTask::OnAlarmFire, task.GetWeakPtr()), |
+ alarm_time); |
+ clock->Advance(base::TimeDelta::FromMinutes(60)); |
+ task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(1)); |
+ task_runner_->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 = |
+ base::MakeUnique<base::SimpleTestClock>(); |
+ test_clock->SetNow(now); |
+ base::SimpleTestClock* clock = test_clock.get(); |
+ std::unique_ptr<AlarmManager> manager = |
+ base::MakeUnique<AlarmManager>(std::move(test_clock), task_runner_); |
+ |
+ // Add first task. |
+ base::Time alarm_time = now + base::TimeDelta::FromMinutes(10); |
+ manager->PostAlarmTask( |
+ base::Bind(&WallClockDependantTask::OnAlarmFire, task1.GetWeakPtr()), |
+ alarm_time); |
+ |
+ // Add second task. |
+ alarm_time = now + base::TimeDelta::FromMinutes(12); |
+ manager->PostAlarmTask( |
+ base::Bind(&WallClockDependantTask::OnAlarmFire, task2.GetWeakPtr()), |
+ alarm_time); |
+ |
+ // First task should fire. |
+ clock->Advance(base::TimeDelta::FromMinutes(10)); |
+ task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(1)); |
+ task_runner_->RunUntilIdle(); |
+ ASSERT_TRUE(task1.fired_); |
+ ASSERT_FALSE(task2.fired_); |
+ |
+ // Reset state; |
+ task1.fired_ = false; |
+ task2.fired_ = false; |
+ |
+ // Second task should fire. |
+ clock->Advance(base::TimeDelta::FromMinutes(2)); |
+ task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(1)); |
+ task_runner_->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 = |
+ base::MakeUnique<base::SimpleTestClock>(); |
+ test_clock->SetNow(now); |
+ base::SimpleTestClock* clock = test_clock.get(); |
+ std::unique_ptr<AlarmManager> manager = |
+ base::MakeUnique<AlarmManager>(std::move(test_clock), task_runner_); |
+ |
+ // Add first task. |
+ base::Time alarm_time = now + base::TimeDelta::FromMinutes(12); |
+ manager->PostAlarmTask( |
+ base::Bind(&WallClockDependantTask::OnAlarmFire, task1.GetWeakPtr()), |
+ alarm_time); |
+ |
+ // Add second task. |
+ alarm_time = now + base::TimeDelta::FromMinutes(10); |
+ manager->PostAlarmTask( |
+ base::Bind(&WallClockDependantTask::OnAlarmFire, task2.GetWeakPtr()), |
+ alarm_time); |
+ |
+ // Second task should fire. |
+ clock->Advance(base::TimeDelta::FromMinutes(10)); |
+ task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(1)); |
+ task_runner_->RunUntilIdle(); |
+ ASSERT_FALSE(task1.fired_); |
+ ASSERT_TRUE(task2.fired_); |
+ |
+ // Reset state; |
+ task1.fired_ = false; |
+ task2.fired_ = false; |
+ |
+ // First task should fire. |
+ clock->Advance(base::TimeDelta::FromMinutes(2)); |
+ task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(1)); |
+ task_runner_->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 = |
+ base::MakeUnique<base::SimpleTestClock>(); |
+ test_clock->SetNow(now); |
+ base::SimpleTestClock* clock = test_clock.get(); |
+ std::unique_ptr<AlarmManager> manager = |
+ base::MakeUnique<AlarmManager>(std::move(test_clock), task_runner_); |
+ |
+ // Add first task. |
+ base::Time alarm_time = now + base::TimeDelta::FromMinutes(12); |
+ manager->PostAlarmTask( |
+ base::Bind(&WallClockDependantTask::OnAlarmFire, task1.GetWeakPtr()), |
+ alarm_time); |
+ |
+ // Add second task. |
+ alarm_time = now + base::TimeDelta::FromMinutes(16); |
+ manager->PostAlarmTask( |
+ base::Bind(&WallClockDependantTask::OnAlarmFire, task2.GetWeakPtr()), |
+ alarm_time); |
+ |
+ // Add third task. |
+ alarm_time = now + base::TimeDelta::FromMinutes(12); |
+ manager->PostAlarmTask( |
+ base::Bind(&WallClockDependantTask::OnAlarmFire, task3.GetWeakPtr()), |
+ alarm_time); |
+ |
+ // First and third task should fire. |
+ clock->Advance(base::TimeDelta::FromMinutes(12)); |
+ task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(1)); |
+ task_runner_->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 = |
+ base::MakeUnique<base::SimpleTestClock>(); |
+ test_clock->SetNow(now); |
+ base::SimpleTestClock* clock = test_clock.get(); |
+ std::unique_ptr<AlarmManager> manager = |
+ base::MakeUnique<AlarmManager>(std::move(test_clock), task_runner_); |
+ |
+ // Add first task. |
+ base::Time alarm_time = now + base::TimeDelta::FromMinutes(15); |
+ manager->PostAlarmTask( |
+ base::Bind(&WallClockDependantTask::OnAlarmFire, task1.GetWeakPtr()), |
+ alarm_time); |
+ |
+ // Add second task. |
+ alarm_time = now + base::TimeDelta::FromMinutes(16); |
+ manager->PostAlarmTask( |
+ base::Bind(&WallClockDependantTask::OnAlarmFire, task2.GetWeakPtr()), |
+ alarm_time); |
+ |
+ // Add third task. |
+ alarm_time = now + base::TimeDelta::FromMinutes(11); |
+ manager->PostAlarmTask( |
+ base::Bind(&WallClockDependantTask::OnAlarmFire, task3.GetWeakPtr()), |
+ alarm_time); |
+ |
+ // Third task should fire. |
+ clock->Advance(base::TimeDelta::FromMinutes(12)); |
+ task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(1)); |
+ task_runner_->RunUntilIdle(); |
+ ASSERT_FALSE(task1.fired_); |
+ ASSERT_FALSE(task2.fired_); |
+ ASSERT_TRUE(task3.fired_); |
+ |
+ clock->Advance(base::TimeDelta::FromMinutes(3)); |
+ task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(1)); |
+ task_runner_->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 = |
+ base::MakeUnique<base::SimpleTestClock>(); |
+ test_clock->SetNow(now); |
+ base::SimpleTestClock* clock = test_clock.get(); |
+ std::unique_ptr<AlarmManager> manager = |
+ base::MakeUnique<AlarmManager>(std::move(test_clock), task_runner_); |
+ |
+ // Add first task. |
+ base::Time alarm_time = now + base::TimeDelta::FromMinutes(15); |
+ manager->PostAlarmTask( |
+ base::Bind(&WallClockDependantTask::OnAlarmFire, task1.GetWeakPtr()), |
+ alarm_time); |
+ |
+ // Add it again with less time. |
+ alarm_time = now + base::TimeDelta::FromMinutes(1); |
+ manager->PostAlarmTask( |
+ base::Bind(&WallClockDependantTask::OnAlarmFire, task1.GetWeakPtr()), |
+ alarm_time); |
+ |
+ // Add second task. |
+ alarm_time = now + base::TimeDelta::FromMinutes(16); |
+ manager->PostAlarmTask( |
+ base::Bind(&WallClockDependantTask::OnAlarmFire, task2.GetWeakPtr()), |
+ alarm_time); |
+ |
+ // Firsttask should fire. |
+ clock->Advance(base::TimeDelta::FromMinutes(1)); |
+ task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(1)); |
+ task_runner_->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::TimeDelta::FromMinutes(14)); |
+ task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(1)); |
+ task_runner_->RunUntilIdle(); |
+ ASSERT_TRUE(task1.fired_); |
+ ASSERT_FALSE(task2.fired_); |
+} |
+ |
+TEST_F(AlarmManagerTest, AlarmCancel) { |
+ std::unique_ptr<WallClockDependantTask> task1 = |
+ base::MakeUnique<WallClockDependantTask>(); |
+ std::unique_ptr<WallClockDependantTask> task2 = |
+ base::MakeUnique<WallClockDependantTask>(); |
+ std::unique_ptr<WallClockDependantTask> task3 = |
+ base::MakeUnique<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 = |
+ base::MakeUnique<base::SimpleTestClock>(); |
+ test_clock->SetNow(now); |
+ base::SimpleTestClock* clock = test_clock.get(); |
+ std::unique_ptr<AlarmManager> manager = |
+ base::MakeUnique<AlarmManager>(std::move(test_clock), task_runner_); |
+ |
+ // Add first task. |
+ base::Time alarm_time = now + base::TimeDelta::FromMinutes(12); |
+ manager->PostAlarmTask( |
+ base::Bind(&WallClockDependantTask::OnAlarmFire, task1->GetWeakPtr()), |
+ alarm_time); |
+ |
+ // Add second task. |
+ alarm_time = now + base::TimeDelta::FromMinutes(16); |
+ manager->PostAlarmTask( |
+ base::Bind(&WallClockDependantTask::OnAlarmFire, task2->GetWeakPtr()), |
+ alarm_time); |
+ |
+ // Add third task. |
+ alarm_time = now + base::TimeDelta::FromMinutes(12); |
+ manager->PostAlarmTask( |
+ base::Bind(&WallClockDependantTask::OnAlarmFire, task3->GetWeakPtr()), |
+ alarm_time); |
+ |
+ // Remove the first task. |
+ task1.reset(nullptr); |
+ |
+ // First and third task should fire. |
+ clock->Advance(base::TimeDelta::FromMinutes(15)); |
+ task_runner_->FastForwardBy(base::TimeDelta::FromMinutes(1)); |
+ task_runner_->RunUntilIdle(); |
+ ASSERT_FALSE(task2->fired_); |
+ ASSERT_TRUE(task3->fired_); |
+} |
+} |