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

Side by Side Diff: base/task_scheduler/delayed_task_manager_unittest.cc

Issue 2686593003: DESIGN DISCUSSION ONLY Task Scheduler Single Thread Task Runner Manager for Dedicated Threads per S… (Closed)
Patch Set: Wait for Detached Thread to Complete 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 unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/task_scheduler/delayed_task_manager.h" 5 #include "base/task_scheduler/delayed_task_manager.h"
6 6
7 #include <memory> 7 #include <memory>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
11 #include "base/memory/ref_counted.h" 11 #include "base/memory/ref_counted.h"
12 #include "base/sequenced_task_runner.h" 12 #include "base/sequenced_task_runner.h"
13 #include "base/single_thread_task_runner.h" 13 #include "base/single_thread_task_runner.h"
14 #include "base/task_runner.h" 14 #include "base/task_runner.h"
15 #include "base/task_scheduler/scheduler_worker_pool.h" 15 #include "base/task_scheduler/scheduler_worker_pool.h"
16 #include "base/task_scheduler/sequence.h" 16 #include "base/task_scheduler/sequence.h"
17 #include "base/task_scheduler/task.h" 17 #include "base/task_scheduler/task.h"
18 #include "base/test/test_mock_time_task_runner.h" 18 #include "base/test/test_mock_time_task_runner.h"
19 #include "base/time/time.h" 19 #include "base/time/time.h"
20 #include "testing/gmock/include/gmock/gmock.h" 20 #include "testing/gmock/include/gmock/gmock.h"
21 #include "testing/gtest/include/gtest/gtest.h" 21 #include "testing/gtest/include/gtest/gtest.h"
22 22
23 namespace base { 23 namespace base {
24 namespace internal { 24 namespace internal {
25 namespace { 25 namespace {
26 26
27 constexpr TimeDelta kLongDelay = TimeDelta::FromHours(1); 27 constexpr TimeDelta kLongDelay = TimeDelta::FromHours(1);
28 28
29 class MockSchedulerWorkerPool : public SchedulerWorkerPool { 29 class MockSchedulerWorkerPool : public SchedulerWorkerPool {
fdoray 2017/02/08 17:59:01 I would test without a SchedulerWorkerPool now tha
robliao 2017/02/10 00:04:04 That sounds reasonable to me. This will be removed
30 public: 30 public:
31 // SchedulerWorkerPool: 31 // SchedulerWorkerPool:
32 scoped_refptr<TaskRunner> CreateTaskRunnerWithTraits( 32 scoped_refptr<TaskRunner> CreateTaskRunnerWithTraits(
33 const TaskTraits& traits) override { 33 const TaskTraits& traits) override {
34 ADD_FAILURE() << "Call to unimplemented method."; 34 ADD_FAILURE() << "Call to unimplemented method.";
35 return nullptr; 35 return nullptr;
36 } 36 }
37 37
38 scoped_refptr<SequencedTaskRunner> CreateSequencedTaskRunnerWithTraits( 38 scoped_refptr<SequencedTaskRunner> CreateSequencedTaskRunnerWithTraits(
39 const TaskTraits& traits) override { 39 const TaskTraits& traits) override {
(...skipping 24 matching lines...) Expand all
64 SchedulerWorker* worker) override { 64 SchedulerWorker* worker) override {
65 PostTaskWithSequenceNowMock(task.get(), sequence.get(), worker); 65 PostTaskWithSequenceNowMock(task.get(), sequence.get(), worker);
66 } 66 }
67 67
68 MOCK_METHOD3(PostTaskWithSequenceNowMock, 68 MOCK_METHOD3(PostTaskWithSequenceNowMock,
69 void(const Task*, 69 void(const Task*,
70 const Sequence*, 70 const Sequence*,
71 const SchedulerWorker* worker)); 71 const SchedulerWorker* worker));
72 }; 72 };
73 73
74 // Posts |task|. The task will be forwarded to |worker_pool| with |sequence|
75 // and |worker| when it becomes ripe for execution. |worker| is a
76 // SchedulerWorker owned by |worker_pool| or nullptr.
77 void PostTaskToWorkerPool(scoped_refptr<Sequence> sequence,
78 SchedulerWorker* worker,
79 SchedulerWorkerPool* worker_pool,
80 std::unique_ptr<Task> task) {
81 worker_pool->PostTaskWithSequenceNow(std::move(task), std::move(sequence),
82 worker);
83 }
84
74 } // namespace 85 } // namespace
75 86
76 // Verify that a delayed task isn't forwarded to its SchedulerWorkerPool before 87 // Verify that a delayed task isn't forwarded to its SchedulerWorkerPool before
77 // it is ripe for execution. 88 // it is ripe for execution.
78 TEST(TaskSchedulerDelayedTaskManagerTest, DelayedTaskDoesNotRunTooEarly) { 89 TEST(TaskSchedulerDelayedTaskManagerTest, DelayedTaskDoesNotRunTooEarly) {
79 scoped_refptr<TestMockTimeTaskRunner> service_thread_task_runner( 90 scoped_refptr<TestMockTimeTaskRunner> service_thread_task_runner(
80 new TestMockTimeTaskRunner); 91 new TestMockTimeTaskRunner);
81 DelayedTaskManager manager(service_thread_task_runner); 92 DelayedTaskManager manager(service_thread_task_runner);
82 93
83 std::unique_ptr<Task> task( 94 std::unique_ptr<Task> task(
84 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(), kLongDelay)); 95 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(), kLongDelay));
85 scoped_refptr<Sequence> sequence(new Sequence); 96 scoped_refptr<Sequence> sequence(new Sequence);
86 testing::StrictMock<MockSchedulerWorkerPool> worker_pool; 97 testing::StrictMock<MockSchedulerWorkerPool> worker_pool;
87 98
88 // Send |task| to the DelayedTaskManager. 99 // Send |task| to the DelayedTaskManager.
89 manager.AddDelayedTask(std::move(task), sequence, nullptr, &worker_pool); 100 manager.AddDelayedTask(
101 std::move(task),
102 Bind(&PostTaskToWorkerPool, sequence, nullptr, Unretained(&worker_pool)));
90 103
91 // Run tasks that are ripe for execution. Don't expect any call to the mock 104 // Run tasks that are ripe for execution. Don't expect any call to the mock
92 // method of |worker_pool|. 105 // method of |worker_pool|.
93 service_thread_task_runner->RunUntilIdle(); 106 service_thread_task_runner->RunUntilIdle();
94 } 107 }
95 108
96 // Verify that a delayed task is forwarded to its SchedulerWorkerPool when it is 109 // Verify that a delayed task is forwarded to its SchedulerWorkerPool when it is
97 // ripe for execution. 110 // ripe for execution.
98 TEST(TaskSchedulerDelayedTaskManagerTest, DelayedTaskRunsAfterDelay) { 111 TEST(TaskSchedulerDelayedTaskManagerTest, DelayedTaskRunsAfterDelay) {
99 scoped_refptr<TestMockTimeTaskRunner> service_thread_task_runner( 112 scoped_refptr<TestMockTimeTaskRunner> service_thread_task_runner(
100 new TestMockTimeTaskRunner); 113 new TestMockTimeTaskRunner);
101 DelayedTaskManager manager(service_thread_task_runner); 114 DelayedTaskManager manager(service_thread_task_runner);
102 115
103 std::unique_ptr<Task> task( 116 std::unique_ptr<Task> task(
104 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(), kLongDelay)); 117 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(), kLongDelay));
105 const Task* task_raw = task.get(); 118 const Task* task_raw = task.get();
106 scoped_refptr<Sequence> sequence(new Sequence); 119 scoped_refptr<Sequence> sequence(new Sequence);
107 testing::StrictMock<MockSchedulerWorkerPool> worker_pool; 120 testing::StrictMock<MockSchedulerWorkerPool> worker_pool;
108 121
109 // Send |task| to the DelayedTaskManager. 122 // Send |task| to the DelayedTaskManager.
110 manager.AddDelayedTask(std::move(task), sequence, nullptr, &worker_pool); 123 manager.AddDelayedTask(
124 std::move(task),
125 Bind(&PostTaskToWorkerPool, sequence, nullptr, Unretained(&worker_pool)));
111 126
112 // Fast-forward time. Expect a call to the mock method of |worker_pool|. 127 // Fast-forward time. Expect a call to the mock method of |worker_pool|.
113 EXPECT_CALL(worker_pool, 128 EXPECT_CALL(worker_pool,
114 PostTaskWithSequenceNowMock(task_raw, sequence.get(), nullptr)); 129 PostTaskWithSequenceNowMock(task_raw, sequence.get(), nullptr));
115 service_thread_task_runner->FastForwardBy(kLongDelay); 130 service_thread_task_runner->FastForwardBy(kLongDelay);
116 } 131 }
117 132
118 // Verify that multiple delayed task are forwarded to their SchedulerWorkerPool 133 // Verify that multiple delayed task are forwarded to their SchedulerWorkerPool
119 // when they are ripe for execution. 134 // when they are ripe for execution.
120 TEST(TaskSchedulerDelayedTaskManagerTest, DelayedTasksRunAfterDelay) { 135 TEST(TaskSchedulerDelayedTaskManagerTest, DelayedTasksRunAfterDelay) {
(...skipping 10 matching lines...) Expand all
131 146
132 std::unique_ptr<Task> task_b(new Task(FROM_HERE, Bind(&DoNothing), 147 std::unique_ptr<Task> task_b(new Task(FROM_HERE, Bind(&DoNothing),
133 TaskTraits(), TimeDelta::FromHours(2))); 148 TaskTraits(), TimeDelta::FromHours(2)));
134 const Task* task_b_raw = task_b.get(); 149 const Task* task_b_raw = task_b.get();
135 150
136 std::unique_ptr<Task> task_c(new Task(FROM_HERE, Bind(&DoNothing), 151 std::unique_ptr<Task> task_c(new Task(FROM_HERE, Bind(&DoNothing),
137 TaskTraits(), TimeDelta::FromHours(1))); 152 TaskTraits(), TimeDelta::FromHours(1)));
138 const Task* task_c_raw = task_c.get(); 153 const Task* task_c_raw = task_c.get();
139 154
140 // Send tasks to the DelayedTaskManager. 155 // Send tasks to the DelayedTaskManager.
141 manager.AddDelayedTask(std::move(task_a), sequence, nullptr, &worker_pool); 156 manager.AddDelayedTask(
142 manager.AddDelayedTask(std::move(task_b), sequence, nullptr, &worker_pool); 157 std::move(task_a),
143 manager.AddDelayedTask(std::move(task_c), sequence, nullptr, &worker_pool); 158 Bind(&PostTaskToWorkerPool, sequence, nullptr, Unretained(&worker_pool)));
159 manager.AddDelayedTask(
160 std::move(task_b),
161 Bind(&PostTaskToWorkerPool, sequence, nullptr, Unretained(&worker_pool)));
162 manager.AddDelayedTask(
163 std::move(task_c),
164 Bind(&PostTaskToWorkerPool, sequence, nullptr, Unretained(&worker_pool)));
144 165
145 // Run tasks that are ripe for execution on the service thread. Don't expect 166 // Run tasks that are ripe for execution on the service thread. Don't expect
146 // any call to the mock method of |worker_pool|. 167 // any call to the mock method of |worker_pool|.
147 service_thread_task_runner->RunUntilIdle(); 168 service_thread_task_runner->RunUntilIdle();
148 169
149 // Fast-forward time. Expect |task_a_raw| and |task_c_raw| to be forwarded to 170 // Fast-forward time. Expect |task_a_raw| and |task_c_raw| to be forwarded to
150 // the worker pool. 171 // the worker pool.
151 EXPECT_CALL(worker_pool, 172 EXPECT_CALL(worker_pool,
152 PostTaskWithSequenceNowMock(task_a_raw, sequence.get(), nullptr)); 173 PostTaskWithSequenceNowMock(task_a_raw, sequence.get(), nullptr));
153 EXPECT_CALL(worker_pool, 174 EXPECT_CALL(worker_pool,
154 PostTaskWithSequenceNowMock(task_c_raw, sequence.get(), nullptr)); 175 PostTaskWithSequenceNowMock(task_c_raw, sequence.get(), nullptr));
155 service_thread_task_runner->FastForwardBy(TimeDelta::FromHours(1)); 176 service_thread_task_runner->FastForwardBy(TimeDelta::FromHours(1));
156 testing::Mock::VerifyAndClear(&worker_pool); 177 testing::Mock::VerifyAndClear(&worker_pool);
157 178
158 // Fast-forward time. Expect |task_b_raw| to be forwarded to the worker pool. 179 // Fast-forward time. Expect |task_b_raw| to be forwarded to the worker pool.
159 EXPECT_CALL(worker_pool, 180 EXPECT_CALL(worker_pool,
160 PostTaskWithSequenceNowMock(task_b_raw, sequence.get(), nullptr)); 181 PostTaskWithSequenceNowMock(task_b_raw, sequence.get(), nullptr));
161 service_thread_task_runner->FastForwardBy(TimeDelta::FromHours(1)); 182 service_thread_task_runner->FastForwardBy(TimeDelta::FromHours(1));
162 testing::Mock::VerifyAndClear(&worker_pool); 183 testing::Mock::VerifyAndClear(&worker_pool);
163 } 184 }
164 185
165 } // namespace internal 186 } // namespace internal
166 } // namespace base 187 } // namespace base
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698