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

Unified Diff: base/task_scheduler/priority_queue_unittest.cc

Issue 1685423002: Task Scheduler. (Closed) Base URL: https://luckyluke-private.googlesource.com/src@a_master
Patch Set: Created 4 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
Index: base/task_scheduler/priority_queue_unittest.cc
diff --git a/base/task_scheduler/priority_queue_unittest.cc b/base/task_scheduler/priority_queue_unittest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..f8021b557e3c991a2a5ff6969f09b6cddfef6bd5
--- /dev/null
+++ b/base/task_scheduler/priority_queue_unittest.cc
@@ -0,0 +1,121 @@
+// 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/priority_queue.h"
+
+#include "base/bind.h"
+#include "base/memory/ref_counted.h"
+#include "base/task_scheduler/sequence.h"
+#include "base/task_scheduler/task.h"
+#include "base/task_scheduler/task_traits.h"
+#include "base/time/time.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace base {
+namespace task_scheduler {
+
+namespace {
+class PriorityQueueCallbackMock {
+ public:
+ MOCK_METHOD0(SequenceInsertedInPriorityQueue, void());
+};
+} // namespace
+
+class TaskSchedulerPriorityQueueTest : public testing::Test {
+ public:
+ TaskSchedulerPriorityQueueTest() {
+ size_t prev_num_tasks;
+
+ sequence_a_ = new Sequence;
+ sequence_a_->PushTask(
+ make_scoped_ptr(
+ new Task(FROM_HERE, Closure(),
+ TaskTraits().WithPriority(TaskPriority::USER_VISIBLE),
+ TimeTicks::FromInternalValue(1))),
+ &prev_num_tasks);
+
+ sequence_b_ = new Sequence;
+ sequence_b_->PushTask(
+ make_scoped_ptr(
+ new Task(FROM_HERE, Closure(),
+ TaskTraits().WithPriority(TaskPriority::USER_BLOCKING),
+ TimeTicks::FromInternalValue(2))),
+ &prev_num_tasks);
+
+ sequence_c_ = new Sequence;
+ sequence_c_->PushTask(
+ make_scoped_ptr(
+ new Task(FROM_HERE, Closure(),
+ TaskTraits().WithPriority(TaskPriority::USER_BLOCKING),
+ TimeTicks::FromInternalValue(3))),
+ &prev_num_tasks);
+ }
+
+ protected:
+ scoped_refptr<Sequence> sequence_a_;
+ scoped_refptr<Sequence> sequence_b_;
+ scoped_refptr<Sequence> sequence_c_;
+};
+
+TEST_F(TaskSchedulerPriorityQueueTest, PushPopPeek) {
+ const SequenceSortKey sort_key_a = sequence_a_->GetSortKey();
+ const SequenceSortKey sort_key_b = sequence_b_->GetSortKey();
+ const SequenceSortKey sort_key_c = sequence_c_->GetSortKey();
+
+ PriorityQueueCallbackMock mock;
+ PriorityQueue pq(
+ Bind(&PriorityQueueCallbackMock::SequenceInsertedInPriorityQueue,
+ Unretained(&mock)));
+ scoped_refptr<Sequence> sequence;
+ SequenceSortKey sort_key;
+ scoped_ptr<PriorityQueue::Transaction> transaction(pq.BeginTransaction());
+
+ EXPECT_TRUE(pq.UnsynchronizedEmpty());
+ EXPECT_EQ(nullptr, transaction->PeekSequence(&sort_key).get());
+
+ EXPECT_CALL(mock, SequenceInsertedInPriorityQueue());
+ transaction->PushSequence(sequence_a_, sort_key_a);
+ transaction.reset();
+ testing::Mock::VerifyAndClear(&mock);
+ transaction = pq.BeginTransaction();
+ EXPECT_EQ(sequence_a_, transaction->PeekSequence(&sort_key));
+ EXPECT_EQ(sort_key_a, sort_key);
+ EXPECT_FALSE(pq.UnsynchronizedEmpty());
+
+ EXPECT_CALL(mock, SequenceInsertedInPriorityQueue());
+ transaction->PushSequence(sequence_b_, sort_key_b);
+ transaction.reset();
+ testing::Mock::VerifyAndClear(&mock);
+ transaction = pq.BeginTransaction();
+ EXPECT_EQ(sequence_b_, transaction->PeekSequence(&sort_key));
+ EXPECT_EQ(sort_key_b, sort_key);
+ EXPECT_FALSE(pq.UnsynchronizedEmpty());
+
+ EXPECT_CALL(mock, SequenceInsertedInPriorityQueue());
+ transaction->PushSequence(sequence_c_, sort_key_c);
+ transaction.reset();
+ testing::Mock::VerifyAndClear(&mock);
+ transaction = pq.BeginTransaction();
+ EXPECT_EQ(sequence_b_, transaction->PeekSequence(&sort_key));
+ EXPECT_EQ(sort_key_b, sort_key);
+ EXPECT_FALSE(pq.UnsynchronizedEmpty());
+
+ transaction->PopSequence();
+ EXPECT_EQ(sequence_c_, transaction->PeekSequence(&sort_key));
+ EXPECT_EQ(sort_key_c, sort_key);
+ EXPECT_FALSE(pq.UnsynchronizedEmpty());
+
+ transaction->PopSequence();
+ EXPECT_EQ(sequence_a_, transaction->PeekSequence(&sort_key));
+ EXPECT_EQ(sort_key_a, sort_key);
+ EXPECT_FALSE(pq.UnsynchronizedEmpty());
+
+ transaction->PopSequence();
+ EXPECT_EQ(nullptr, transaction->PeekSequence(&sort_key).get());
+ EXPECT_TRUE(pq.UnsynchronizedEmpty());
+}
+
+} // namespace task_scheduler
+} // namespace base

Powered by Google App Engine
This is Rietveld 408576698