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

Side by Side Diff: base/task_scheduler/shutdown_manager_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 unified diff | Download patch
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/task_scheduler/shutdown_manager.h"
6
7 #include "base/threading/platform_thread.h"
8 #include "base/threading/simple_thread.h"
9 #include "testing/gtest/include/gtest/gtest.h"
10
11 namespace base {
12 namespace task_scheduler {
13
14 namespace {
15
16 class ThreadCallingShutdown : public SimpleThread {
17 public:
18 ThreadCallingShutdown(ShutdownManager* manager)
19 : SimpleThread("ThreadCallingShutdown"),
20 manager_(manager),
21 has_exited_(false) {}
22
23 // Waits until manager_->Shutdown() has been called.
24 void WaitUntilShutdownCalled() {
25 while (!manager_->is_shutting_down_for_testing())
26 PlatformThread::Sleep(TimeDelta::FromMilliseconds(5));
27 }
28
29 // Returns true once the thread has exited.
30 bool has_exited() const { return has_exited_; }
31
32 private:
33 void Run() override {
34 manager_->Shutdown();
35 has_exited_ = true;
36 }
37
38 ShutdownManager* manager_;
39
40 bool has_exited_;
41 };
42
43 } // namespace
44
45 TEST(TaskSchedulerShutdownManagerTest, ShouldPostTaskBeforeShutdown) {
46 ShutdownManager manager;
47 EXPECT_TRUE(
48 manager.ShouldPostTask(TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN));
49 EXPECT_TRUE(manager.ShouldPostTask(TaskShutdownBehavior::SKIP_ON_SHUTDOWN));
50 EXPECT_TRUE(manager.ShouldPostTask(TaskShutdownBehavior::BLOCK_SHUTDOWN));
51 }
52
53 TEST(TaskSchedulerShutdownManagerTest, ShouldPostTaskAfterShutdownCompleted) {
54 ShutdownManager manager;
55 manager.Shutdown();
56 EXPECT_FALSE(
57 manager.ShouldPostTask(TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN));
58 EXPECT_FALSE(manager.ShouldPostTask(TaskShutdownBehavior::SKIP_ON_SHUTDOWN));
59 EXPECT_FALSE(manager.ShouldPostTask(TaskShutdownBehavior::BLOCK_SHUTDOWN));
60 }
61
62 TEST(TaskSchedulerShutdownManagerTest, ShouldScheduleTaskBeforeShutdown) {
63 ShutdownManager manager;
64 EXPECT_TRUE(
65 manager.ShouldScheduleTask(TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN));
66 EXPECT_TRUE(
67 manager.ShouldScheduleTask(TaskShutdownBehavior::SKIP_ON_SHUTDOWN));
68 EXPECT_TRUE(manager.ShouldScheduleTask(TaskShutdownBehavior::BLOCK_SHUTDOWN));
69 }
70
71 TEST(TaskSchedulerShutdownManagerTest,
72 ShouldScheduleTaskAfterShutdownCompleted) {
73 ShutdownManager manager;
74 manager.Shutdown();
75 EXPECT_FALSE(
76 manager.ShouldScheduleTask(TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN));
77 EXPECT_FALSE(
78 manager.ShouldScheduleTask(TaskShutdownBehavior::SKIP_ON_SHUTDOWN));
79 EXPECT_FALSE(
80 manager.ShouldScheduleTask(TaskShutdownBehavior::BLOCK_SHUTDOWN));
81 }
82
83 TEST(TaskSchedulerShutdownManagerTest,
84 ShouldPostAndScheduleTaskDuringShutdown) {
85 ShutdownManager manager;
86
87 // Inform the manager that a BLOCK_SHUTDOWN task has been posted, to block
88 // shutdown.
89 EXPECT_TRUE(manager.ShouldPostTask(TaskShutdownBehavior::BLOCK_SHUTDOWN));
90
91 // Call manager.Shutdown() on another thread.
92 ThreadCallingShutdown thread(&manager);
93 thread.Start();
94 thread.WaitUntilShutdownCalled();
95 EXPECT_FALSE(thread.has_exited());
96
97 // Check that only a BLOCK_SHUTDOWN task can be posted.
98 EXPECT_FALSE(
99 manager.ShouldPostTask(TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN));
100 EXPECT_FALSE(thread.has_exited());
101 EXPECT_FALSE(manager.ShouldPostTask(TaskShutdownBehavior::SKIP_ON_SHUTDOWN));
102 EXPECT_FALSE(thread.has_exited());
103 EXPECT_TRUE(manager.ShouldPostTask(TaskShutdownBehavior::BLOCK_SHUTDOWN));
104 EXPECT_FALSE(thread.has_exited());
105
106 // Check that only a BLOCK_SHUTDOWN task can be scheduled.
107 EXPECT_FALSE(
108 manager.ShouldScheduleTask(TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN));
109 EXPECT_FALSE(thread.has_exited());
110 EXPECT_FALSE(
111 manager.ShouldScheduleTask(TaskShutdownBehavior::SKIP_ON_SHUTDOWN));
112 EXPECT_FALSE(thread.has_exited());
113 EXPECT_TRUE(manager.ShouldScheduleTask(TaskShutdownBehavior::BLOCK_SHUTDOWN));
114 EXPECT_FALSE(thread.has_exited());
115
116 // Unblock Shutdown().
117 manager.DidExecuteTask(TaskShutdownBehavior::BLOCK_SHUTDOWN);
118 EXPECT_FALSE(thread.has_exited());
119 EXPECT_TRUE(manager.ShouldScheduleTask(TaskShutdownBehavior::BLOCK_SHUTDOWN));
120 EXPECT_FALSE(thread.has_exited());
121 manager.DidExecuteTask(TaskShutdownBehavior::BLOCK_SHUTDOWN);
122
123 // Wait until the thread calling manager.Shutdown() exits.
124 thread.Join();
125 EXPECT_TRUE(thread.has_exited());
126 }
127
128 TEST(TaskSchedulerShutdownManagerTest,
129 ShutdownWithQueuedSkipAndContinueOnShutdownTasks) {
130 ShutdownManager manager;
131
132 // Inform |manager| that a CONTINUE_ON_SHUTDOWN task and a SKIP_ON_SHUTDOWN
133 // task have been posted.
134 EXPECT_TRUE(
135 manager.ShouldPostTask(TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN));
136 EXPECT_TRUE(manager.ShouldPostTask(TaskShutdownBehavior::SKIP_ON_SHUTDOWN));
137
138 // Call manager.Shutdown(). This call shouldn't block.
139 manager.Shutdown();
140 }
141
142 TEST(TaskSchedulerShutdownManagerTest,
143 ShutdownScheduledContinueOnShutdownTasks) {
144 ShutdownManager manager;
145
146 // Inform |manager| that a SKIP_ON_SHUTDOWN task has been posted and
147 // scheduled.
148 EXPECT_TRUE(
149 manager.ShouldPostTask(TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN));
150 EXPECT_TRUE(
151 manager.ShouldScheduleTask(TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN));
152
153 // Call manager.Shutdown() on another thread. This call shouldn't block.
154 manager.Shutdown();
155 }
156
157 TEST(TaskSchedulerShutdownManagerTest, ShutdownScheduledSkipOnShutdownTasks) {
158 ShutdownManager manager;
159
160 // Inform |manager| that a SKIP_ON_SHUTDOWN task has been posted and
161 // scheduled.
162 EXPECT_TRUE(manager.ShouldPostTask(TaskShutdownBehavior::SKIP_ON_SHUTDOWN));
163 EXPECT_TRUE(
164 manager.ShouldScheduleTask(TaskShutdownBehavior::SKIP_ON_SHUTDOWN));
165
166 // Call manager.Shutdown() on another thread. This call should block until the
167 // SKIP_ON_SHUTDOWN task has been executed.
168 ThreadCallingShutdown thread(&manager);
169 thread.Start();
170 thread.WaitUntilShutdownCalled();
171 EXPECT_FALSE(thread.has_exited());
172
173 // Inform |manager| that a SKIP_ON_SHUTDOWN task has been executed.
174 manager.DidExecuteTask(TaskShutdownBehavior::SKIP_ON_SHUTDOWN);
175
176 // Wait until the thread calling manager.Shutdown() exits.
177 thread.Join();
178 EXPECT_TRUE(thread.has_exited());
179 }
180
181 TEST(TaskSchedulerShutdownManagerTest, ShutdownWithQueuedBlockShutdownTasks) {
182 ShutdownManager manager;
183
184 // Inform |manager| that 2 BLOCK_SHUTDOWN task have been posted.
185 EXPECT_TRUE(manager.ShouldPostTask(TaskShutdownBehavior::BLOCK_SHUTDOWN));
186 EXPECT_TRUE(manager.ShouldPostTask(TaskShutdownBehavior::BLOCK_SHUTDOWN));
187
188 // Call manager.Shutdown() on another thread. This call should block until
189 // both BLOCK_SHUTDOWN tasks have been executed.
190 ThreadCallingShutdown thread(&manager);
191 thread.Start();
192 thread.WaitUntilShutdownCalled();
193 EXPECT_FALSE(thread.has_exited());
194
195 // Inform |manager| that the first BLOCK_SHUTDOWN task has been scheduled and
196 // executed.
197 EXPECT_TRUE(manager.ShouldScheduleTask(TaskShutdownBehavior::BLOCK_SHUTDOWN));
198 EXPECT_FALSE(thread.has_exited());
199 manager.DidExecuteTask(TaskShutdownBehavior::BLOCK_SHUTDOWN);
200 EXPECT_FALSE(thread.has_exited());
201
202 // Inform |manager| that the second BLOCK_SHUTDOWN task has been scheduled and
203 // executed..
204 EXPECT_TRUE(manager.ShouldScheduleTask(TaskShutdownBehavior::BLOCK_SHUTDOWN));
205 EXPECT_FALSE(thread.has_exited());
206 manager.DidExecuteTask(TaskShutdownBehavior::BLOCK_SHUTDOWN);
207
208 // Wait until the thread calling manager.Shutdown() exits.
209 thread.Join();
210 EXPECT_TRUE(thread.has_exited());
211 }
212
213 TEST(TaskSchedulerShutdownManagerTest,
214 ShutdownWithScheduledBlockShutdownTasks) {
215 ShutdownManager manager;
216
217 // Inform |manager| that a BLOCK_SHUTDOWN task have been posted and scheduled.
218 EXPECT_TRUE(manager.ShouldPostTask(TaskShutdownBehavior::BLOCK_SHUTDOWN));
219 EXPECT_TRUE(manager.ShouldScheduleTask(TaskShutdownBehavior::BLOCK_SHUTDOWN));
220
221 // Call manager.Shutdown() on another thread. This call should block until the
222 // BLOCK_SHUTDOWN task has been executed.
223 ThreadCallingShutdown thread(&manager);
224 thread.Start();
225 thread.WaitUntilShutdownCalled();
226 EXPECT_FALSE(thread.has_exited());
227
228 // Inform |manager| that a BLOCK_SHUTDOWN task has been executed.
229 manager.DidExecuteTask(TaskShutdownBehavior::BLOCK_SHUTDOWN);
230
231 // Wait until the thread calling manager.Shutdown() exits.
232 thread.Join();
233 EXPECT_TRUE(thread.has_exited());
234 }
235
236 } // namespace task_scheduler
237 } // namespace base
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698