Index: base/task_scheduler/utils_unittest.cc |
diff --git a/base/task_scheduler/utils_unittest.cc b/base/task_scheduler/utils_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..18e31238752588b6d509d6aee27476ae33a2c4f1 |
--- /dev/null |
+++ b/base/task_scheduler/utils_unittest.cc |
@@ -0,0 +1,139 @@ |
+// Copyright 2016 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 "base/task_scheduler/utils.h" |
+ |
+#include <utility> |
+ |
+#include "base/bind.h" |
+#include "base/bind_helpers.h" |
+#include "base/memory/ref_counted.h" |
+#include "base/memory/scoped_ptr.h" |
+#include "base/task_scheduler/delayed_task_manager.h" |
+#include "base/task_scheduler/priority_queue.h" |
+#include "base/task_scheduler/sequence.h" |
+#include "base/task_scheduler/shutdown_manager.h" |
+#include "base/task_scheduler/task.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+namespace base { |
+namespace task_scheduler { |
+ |
+namespace { |
+ |
+class TestDelayedTaskManager : public DelayedTaskManager { |
+ public: |
+ TestDelayedTaskManager(ShutdownManager* shutdown_manager) |
+ : DelayedTaskManager(Bind(&DoNothing), shutdown_manager) {} |
+ |
+ TimeTicks Now() override { return TimeTicks(); } |
+}; |
+ |
+} // namespace |
+ |
+// Checks that when PostTaskHelper is called with a task that has a |
+// |delayed_run_time|, the task is added to the provided DelayedTaskManager. |
+TEST(TaskSchedulerUtilsTest, PostTaskHelperWithDelayedRunTime) { |
+ const TimeDelta delay(TimeDelta::FromSeconds(1)); |
+ Task task(FROM_HERE, Bind(&DoNothing), TaskTraits(), TimeTicks::Now()); |
+ task.delayed_run_time = TimeTicks() + delay; |
+ scoped_refptr<Sequence> sequence(new Sequence); |
+ PriorityQueue priority_queue(Bind(&DoNothing)); |
+ ShutdownManager shutdown_manager; |
+ TestDelayedTaskManager delayed_task_manager(&shutdown_manager); |
+ |
+ // Post a delayed task. |
+ PostTaskHelper(task, sequence, &priority_queue, &shutdown_manager, |
+ &delayed_task_manager); |
+ |
+ // Expect the sequence and the priority queue to be empty. |
+ EXPECT_EQ(nullptr, sequence->PeekTask()); |
+ EXPECT_TRUE(priority_queue.UnsynchronizedEmpty()); |
+ |
+ // Expect to find the task in the delayed task manager. |
+ EXPECT_EQ(task.delayed_run_time, |
+ delayed_task_manager.GetNextDelayedTaskReadyTime()); |
+} |
+ |
+// Checks that when PostTaskHelper is called with an empty sequence, the task |
+// is added to the sequence and the sequence is added to the priority queue. |
+TEST(TaskSchedulerUtilsTest, PostTaskNowHelperEmptySequence) { |
+ const Task task(FROM_HERE, Bind(&DoNothing), TaskTraits(), TimeTicks::Now()); |
+ scoped_refptr<Sequence> sequence(new Sequence); |
+ PriorityQueue priority_queue(Bind(&DoNothing)); |
+ ShutdownManager shutdown_manager; |
+ |
+ // Post a task. |
+ PostTaskNowHelper(task, sequence, &priority_queue, &shutdown_manager); |
+ |
+ // Expect to find the sequence in the priority queue. |
+ SequenceSortKey sequence_sort_key; |
+ EXPECT_EQ(sequence, priority_queue.BeginTransaction()->PeekSequence( |
+ &sequence_sort_key)); |
+ |
+ // Expect to find the task in the sequence. |
+ EXPECT_EQ(task.posted_from, sequence->PeekTask()->posted_from); |
+ size_t prev_num_tasks; |
+ sequence->PopTask(&prev_num_tasks); |
+ EXPECT_EQ(nullptr, sequence->PeekTask()); |
+} |
+ |
+// Checks that when PostTaskHelper is called with a sequence that already |
+// contains a task, the task is added to the sequence but the sequence is not |
+// added to the priority queue. |
+TEST(TaskSchedulerUtilsTest, PostTaskNowHelperSequenceWithTasks) { |
+ const Task task(FROM_HERE, Bind(&DoNothing), TaskTraits(), TimeTicks::Now()); |
+ scoped_refptr<Sequence> sequence(new Sequence); |
+ PriorityQueue priority_queue(Bind(&DoNothing)); |
+ ShutdownManager shutdown_manager; |
+ |
+ // Add an initial task in |sequence|. |
+ size_t prev_num_tasks; |
+ sequence->PushTask(make_scoped_ptr(new Task(FROM_HERE, Closure(), |
+ TaskTraits(), TimeTicks::Now())), |
+ &prev_num_tasks); |
+ |
+ // Post a task. |
+ PostTaskNowHelper(task, sequence, &priority_queue, &shutdown_manager); |
+ |
+ // Expect to find the priority queue empty. |
+ SequenceSortKey sequence_sort_key; |
+ EXPECT_EQ(nullptr, priority_queue.BeginTransaction() |
+ ->PeekSequence(&sequence_sort_key) |
+ .get()); |
+ |
+ // Expect to find the posted task at the end of the sequence. |
+ sequence->PopTask(&prev_num_tasks); |
+ EXPECT_EQ(task.posted_from, sequence->PeekTask()->posted_from); |
+ sequence->PopTask(&prev_num_tasks); |
+ EXPECT_EQ(nullptr, sequence->PeekTask()); |
+} |
+ |
+// Checks that when PostTaskHelper is called with a SKIP_ON_SHUTDOWN task after |
+// shutdown has started, the sequence and the priority queue remain unchanged. |
+TEST(TaskSchedulerUtilsTest, PostTaskNowHelperAfterShutdown) { |
+ const Task task( |
+ FROM_HERE, Bind(&DoNothing), |
+ TaskTraits().WithShutdownBehavior(TaskShutdownBehavior::SKIP_ON_SHUTDOWN), |
+ TimeTicks::Now()); |
+ scoped_refptr<Sequence> sequence(new Sequence); |
+ PriorityQueue priority_queue(Bind(&DoNothing)); |
+ ShutdownManager shutdown_manager; |
+ |
+ // Post a SKIP_ON_SHUTDOWN task after shutdown. |
+ shutdown_manager.Shutdown(); |
+ PostTaskNowHelper(task, sequence, &priority_queue, &shutdown_manager); |
+ |
+ // Expect to find the priority queue empty. |
+ SequenceSortKey sequence_sort_key; |
+ EXPECT_EQ(nullptr, priority_queue.BeginTransaction() |
+ ->PeekSequence(&sequence_sort_key) |
+ .get()); |
+ |
+ // Expect to find the sequence empty. |
+ EXPECT_EQ(nullptr, sequence->PeekTask()); |
+} |
+ |
+} // namespace task_scheduler |
+} // namespace base |