Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4369)

Unified Diff: chromecast/base/alarm_manager_unittest.cc

Issue 2695223008: [Chromecast] Add an alarm manager for firing events on wall clock time. (Closed)
Patch Set: Addresses comments Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« chromecast/base/alarm_manager.cc ('K') | « chromecast/base/alarm_manager.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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_);
+}
+}
« chromecast/base/alarm_manager.cc ('K') | « chromecast/base/alarm_manager.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698