OLD | NEW |
---|---|
(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([]() { | |
robliao
2016/12/13 03:27:42
Optional: For readability, it might be better to f
fdoray
2016/12/13 19:14:14
Doesn't work. There is a PRESUBMIT check that veri
robliao
2016/12/13 19:18:26
Interesting. Might be good feedback for the folks
| |
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 | |
OLD | NEW |