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

Side by Side Diff: base/test/scoped_task_scheduler_unittest.cc

Issue 2557083002: Run ScopedTaskScheduler tasks synchronously. (Closed)
Patch Set: rebase Created 4 years 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
« no previous file with comments | « base/test/scoped_task_scheduler.cc ('k') | base/threading/sequenced_worker_pool_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "base/test/scoped_task_scheduler.h"
6
7 #include "base/bind.h"
8 #include "base/logging.h"
9 #include "base/macros.h"
10 #include "base/run_loop.h"
11 #include "base/sequence_checker.h"
12 #include "base/task_scheduler/post_task.h"
13 #include "base/task_scheduler/test_utils.h"
14 #include "base/threading/sequenced_task_runner_handle.h"
15 #include "base/threading/thread_checker.h"
16 #include "base/threading/thread_task_runner_handle.h"
17 #include "build/build_config.h"
18 #include "testing/gtest/include/gtest/gtest.h"
19
20 namespace base {
21 namespace test {
22
23 TEST(ScopedTaskSchedulerTest, PostTask) {
24 ScopedTaskScheduler scoped_task_scheduler;
25
26 bool first_task_ran = false;
27 bool second_task_ran = false;
28
29 SequenceCheckerImpl sequence_checker;
30 ThreadCheckerImpl thread_checker;
31
32 // Detach |sequence_checker| and |thread_checker|. Otherwise, they are bound
33 // to the current thread without a SequenceToken or TaskToken (i.e.
34 // CalledOnValidSequence/Thread() will always return true on the current
35 // thread, even when the SequenceToken or TaskToken changes).
36 sequence_checker.DetachFromSequence();
37 thread_checker.DetachFromThread();
38
39 PostTask(FROM_HERE,
40 Bind(
41 [](SequenceCheckerImpl* sequence_checker,
42 ThreadCheckerImpl* thread_checker, bool* first_task_ran) {
43 EXPECT_FALSE(SequencedTaskRunnerHandle::IsSet());
44 EXPECT_FALSE(ThreadTaskRunnerHandle::IsSet());
45 EXPECT_TRUE(sequence_checker->CalledOnValidSequence());
46 EXPECT_TRUE(thread_checker->CalledOnValidThread());
47 *first_task_ran = true;
48 },
49 Unretained(&sequence_checker), Unretained(&thread_checker),
50 Unretained(&first_task_ran)));
51
52 PostTask(FROM_HERE,
53 Bind(
54 [](SequenceCheckerImpl* sequence_checker,
55 ThreadCheckerImpl* thread_checker, bool* second_task_ran) {
56 EXPECT_FALSE(SequencedTaskRunnerHandle::IsSet());
57 EXPECT_FALSE(ThreadTaskRunnerHandle::IsSet());
58 EXPECT_FALSE(sequence_checker->CalledOnValidSequence());
59 EXPECT_FALSE(thread_checker->CalledOnValidThread());
60 *second_task_ran = true;
61 },
62 Unretained(&sequence_checker), Unretained(&thread_checker),
63 Unretained(&second_task_ran)));
64
65 RunLoop().RunUntilIdle();
66
67 EXPECT_TRUE(first_task_ran);
68 EXPECT_TRUE(second_task_ran);
69 }
70
71 TEST(ScopedTaskSchedulerTest, CreateTaskRunnerAndPostTask) {
72 ScopedTaskScheduler scoped_task_scheduler;
73 auto task_runner = CreateTaskRunnerWithTraits(TaskTraits());
74
75 bool first_task_ran = false;
76 bool second_task_ran = false;
77
78 SequenceCheckerImpl sequence_checker;
79 ThreadCheckerImpl thread_checker;
80
81 // Detach |sequence_checker| and |thread_checker|. Otherwise, they are bound
82 // to the current thread without a SequenceToken or TaskToken (i.e.
83 // CalledOnValidSequence/Thread() will always return true on the current
84 // thread, even when the SequenceToken or TaskToken changes).
85 sequence_checker.DetachFromSequence();
86 thread_checker.DetachFromThread();
87
88 task_runner->PostTask(
89 FROM_HERE,
90 Bind(
91 [](SequenceCheckerImpl* sequence_checker,
92 ThreadCheckerImpl* thread_checker, bool* first_task_ran) {
93 EXPECT_FALSE(SequencedTaskRunnerHandle::IsSet());
94 EXPECT_FALSE(ThreadTaskRunnerHandle::IsSet());
95 EXPECT_TRUE(sequence_checker->CalledOnValidSequence());
96 EXPECT_TRUE(thread_checker->CalledOnValidThread());
97 *first_task_ran = true;
98 },
99 Unretained(&sequence_checker), Unretained(&thread_checker),
100 Unretained(&first_task_ran)));
101
102 task_runner->PostTask(
103 FROM_HERE,
104 Bind(
105 [](SequenceCheckerImpl* sequence_checker,
106 ThreadCheckerImpl* thread_checker, bool* second_task_ran) {
107 EXPECT_FALSE(SequencedTaskRunnerHandle::IsSet());
108 EXPECT_FALSE(ThreadTaskRunnerHandle::IsSet());
109 EXPECT_FALSE(sequence_checker->CalledOnValidSequence());
110 EXPECT_FALSE(thread_checker->CalledOnValidThread());
111 *second_task_ran = true;
112 },
113 Unretained(&sequence_checker), Unretained(&thread_checker),
114 Unretained(&second_task_ran)));
115
116 RunLoop().RunUntilIdle();
117
118 EXPECT_TRUE(first_task_ran);
119 EXPECT_TRUE(second_task_ran);
120 }
121
122 TEST(ScopedTaskSchedulerTest, CreateSequencedTaskRunnerAndPostTask) {
123 ScopedTaskScheduler scoped_task_scheduler;
124 auto task_runner = CreateSequencedTaskRunnerWithTraits(TaskTraits());
125
126 bool first_task_ran = false;
127 bool second_task_ran = false;
128
129 SequenceCheckerImpl sequence_checker;
130 ThreadCheckerImpl thread_checker;
131
132 // Detach |sequence_checker| and |thread_checker|. Otherwise, they are bound
133 // to the current thread without a SequenceToken or TaskToken (i.e.
134 // CalledOnValidSequence/Thread() will always return true on the current
135 // thread, even when the SequenceToken or TaskToken changes).
136 sequence_checker.DetachFromSequence();
137 thread_checker.DetachFromThread();
138
139 task_runner->PostTask(
140 FROM_HERE,
141 Bind(
142 [](SequenceCheckerImpl* sequence_checker,
143 ThreadCheckerImpl* thread_checker, bool* first_task_ran) {
144 EXPECT_TRUE(SequencedTaskRunnerHandle::IsSet());
145 EXPECT_FALSE(ThreadTaskRunnerHandle::IsSet());
146 EXPECT_TRUE(sequence_checker->CalledOnValidSequence());
147 EXPECT_TRUE(thread_checker->CalledOnValidThread());
148 *first_task_ran = true;
149 },
150 Unretained(&sequence_checker), Unretained(&thread_checker),
151 Unretained(&first_task_ran)));
152
153 task_runner->PostTask(
154 FROM_HERE,
155 Bind(
156 [](SequenceCheckerImpl* sequence_checker,
157 ThreadCheckerImpl* thread_checker, bool* second_task_ran) {
158 EXPECT_TRUE(SequencedTaskRunnerHandle::IsSet());
159 EXPECT_FALSE(ThreadTaskRunnerHandle::IsSet());
160 EXPECT_TRUE(sequence_checker->CalledOnValidSequence());
161 EXPECT_FALSE(thread_checker->CalledOnValidThread());
162 *second_task_ran = true;
163 },
164 Unretained(&sequence_checker), Unretained(&thread_checker),
165 Unretained(&second_task_ran)));
166
167 RunLoop().RunUntilIdle();
168
169 EXPECT_TRUE(first_task_ran);
170 EXPECT_TRUE(second_task_ran);
171 }
172
173 TEST(ScopedTaskSchedulerTest, CreateSingleThreadTaskRunnerAndPostTask) {
174 ScopedTaskScheduler scoped_task_scheduler;
175 auto task_runner = CreateSingleThreadTaskRunnerWithTraits(TaskTraits());
176
177 bool first_task_ran = false;
178 bool second_task_ran = false;
179
180 SequenceCheckerImpl sequence_checker;
181 ThreadCheckerImpl thread_checker;
182
183 // Detach |sequence_checker| and |thread_checker|. Otherwise, they are bound
184 // to the current thread without a SequenceToken or TaskToken (i.e.
185 // CalledOnValidSequence/Thread() will always return true on the current
186 // thread, even when the SequenceToken or TaskToken changes).
187 sequence_checker.DetachFromSequence();
188 thread_checker.DetachFromThread();
189
190 task_runner->PostTask(
191 FROM_HERE,
192 Bind(
193 [](SequenceCheckerImpl* sequence_checker,
194 ThreadCheckerImpl* thread_checker, bool* first_task_ran) {
195 EXPECT_TRUE(SequencedTaskRunnerHandle::IsSet());
196 EXPECT_TRUE(ThreadTaskRunnerHandle::IsSet());
197 EXPECT_TRUE(sequence_checker->CalledOnValidSequence());
198 EXPECT_TRUE(thread_checker->CalledOnValidThread());
199 *first_task_ran = true;
200 },
201 Unretained(&sequence_checker), Unretained(&thread_checker),
202 Unretained(&first_task_ran)));
203
204 task_runner->PostTask(
205 FROM_HERE,
206 Bind(
207 [](SequenceCheckerImpl* sequence_checker,
208 ThreadCheckerImpl* thread_checker, bool* second_task_ran) {
209 EXPECT_TRUE(SequencedTaskRunnerHandle::IsSet());
210 EXPECT_TRUE(ThreadTaskRunnerHandle::IsSet());
211 EXPECT_TRUE(sequence_checker->CalledOnValidSequence());
212 EXPECT_TRUE(thread_checker->CalledOnValidThread());
213 *second_task_ran = true;
214 },
215 Unretained(&sequence_checker), Unretained(&thread_checker),
216 Unretained(&second_task_ran)));
217
218 RunLoop().RunUntilIdle();
219
220 EXPECT_TRUE(first_task_ran);
221 EXPECT_TRUE(second_task_ran);
222 }
223
224 TEST(ScopedTaskSchedulerTest, ShutdownBehavior) {
225 bool block_shutdown_task_ran = false;
226 {
227 ScopedTaskScheduler scoped_task_scheduler;
228 PostTaskWithTraits(
229 FROM_HERE, TaskTraits().WithShutdownBehavior(
230 TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN),
231 Bind([]() {
232 ADD_FAILURE() << "CONTINUE_ON_SHUTDOWN task should not run";
233 }));
234 PostTaskWithTraits(FROM_HERE, TaskTraits().WithShutdownBehavior(
235 TaskShutdownBehavior::SKIP_ON_SHUTDOWN),
236 Bind([]() {
237 ADD_FAILURE()
238 << "SKIP_ON_SHUTDOWN task should not run";
239 }));
240 PostTaskWithTraits(FROM_HERE, TaskTraits().WithShutdownBehavior(
241 TaskShutdownBehavior::BLOCK_SHUTDOWN),
242 Bind(
243 [](bool* block_shutdown_task_ran) {
244 *block_shutdown_task_ran = true;
245 },
246 Unretained(&block_shutdown_task_ran)));
247 }
248 EXPECT_TRUE(block_shutdown_task_ran);
249 }
250
251 } // namespace test
252 } // namespace base
OLDNEW
« no previous file with comments | « base/test/scoped_task_scheduler.cc ('k') | base/threading/sequenced_worker_pool_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698