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

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

Issue 1911023002: TaskScheduler: Add TaskRunnerHandle support to TaskScheduler tasks (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@c1_1876363004_STTR
Patch Set: review:fdoray#17 Created 4 years, 7 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/task_tracker.h" 5 #include "base/task_scheduler/task_tracker.h"
6 6
7 #include <memory> 7 #include <memory>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
11 #include "base/macros.h" 11 #include "base/macros.h"
12 #include "base/memory/ptr_util.h" 12 #include "base/memory/ptr_util.h"
13 #include "base/memory/ref_counted.h"
14 #include "base/sequenced_task_runner.h"
15 #include "base/single_thread_task_runner.h"
13 #include "base/synchronization/waitable_event.h" 16 #include "base/synchronization/waitable_event.h"
14 #include "base/task_scheduler/task.h" 17 #include "base/task_scheduler/task.h"
15 #include "base/task_scheduler/task_traits.h" 18 #include "base/task_scheduler/task_traits.h"
16 #include "base/task_scheduler/test_utils.h" 19 #include "base/task_scheduler/test_utils.h"
20 #include "base/test/test_simple_task_runner.h"
21 #include "base/thread_task_runner_handle.h"
17 #include "base/threading/platform_thread.h" 22 #include "base/threading/platform_thread.h"
23 #include "base/threading/sequenced_task_runner_handle.h"
18 #include "base/threading/simple_thread.h" 24 #include "base/threading/simple_thread.h"
19 #include "testing/gtest/include/gtest/gtest.h" 25 #include "testing/gtest/include/gtest/gtest.h"
20 26
21 namespace base { 27 namespace base {
22 namespace internal { 28 namespace internal {
23 29
24 namespace { 30 namespace {
25 31
26 // Calls TaskTracker::Shutdown() asynchronously. 32 // Calls TaskTracker::Shutdown() asynchronously.
27 class ThreadCallingShutdown : public SimpleThread { 33 class ThreadCallingShutdown : public SimpleThread {
(...skipping 14 matching lines...) Expand all
42 48
43 TaskTracker* const tracker_; 49 TaskTracker* const tracker_;
44 WaitableEvent has_returned_; 50 WaitableEvent has_returned_;
45 51
46 DISALLOW_COPY_AND_ASSIGN(ThreadCallingShutdown); 52 DISALLOW_COPY_AND_ASSIGN(ThreadCallingShutdown);
47 }; 53 };
48 54
49 // Runs a task asynchronously. 55 // Runs a task asynchronously.
50 class ThreadRunningTask : public SimpleThread { 56 class ThreadRunningTask : public SimpleThread {
51 public: 57 public:
52 explicit ThreadRunningTask(TaskTracker* tracker, const Task* task) 58 ThreadRunningTask(TaskTracker* tracker, const Task* task)
53 : SimpleThread("ThreadRunningTask"), tracker_(tracker), task_(task) {} 59 : SimpleThread("ThreadRunningTask"), tracker_(tracker), task_(task) {}
54 60
55 private: 61 private:
56 void Run() override { tracker_->RunTask(task_); } 62 void Run() override { tracker_->RunTask(task_); }
57 63
58 TaskTracker* const tracker_; 64 TaskTracker* const tracker_;
59 const Task* const task_; 65 const Task* const task_;
60 66
61 DISALLOW_COPY_AND_ASSIGN(ThreadRunningTask); 67 DISALLOW_COPY_AND_ASSIGN(ThreadRunningTask);
62 }; 68 };
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after
276 std::unique_ptr<Task> task(CreateTask(GetParam())); 282 std::unique_ptr<Task> task(CreateTask(GetParam()));
277 283
278 // |task_tracker_| shouldn't allow a task to be posted after shutdown. 284 // |task_tracker_| shouldn't allow a task to be posted after shutdown.
279 if (GetParam() == TaskShutdownBehavior::BLOCK_SHUTDOWN) { 285 if (GetParam() == TaskShutdownBehavior::BLOCK_SHUTDOWN) {
280 EXPECT_DCHECK_DEATH({ tracker_.WillPostTask(task.get()); }, ""); 286 EXPECT_DCHECK_DEATH({ tracker_.WillPostTask(task.get()); }, "");
281 } else { 287 } else {
282 EXPECT_FALSE(tracker_.WillPostTask(task.get())); 288 EXPECT_FALSE(tracker_.WillPostTask(task.get()));
283 } 289 }
284 } 290 }
285 291
292 void RunTaskRunnerHandleVerificationTask(TaskTracker* tracker,
293 const Task* verify_task) {
294 // Pretend |verify_task| is posted to respect TaskTracker's contract.
295 EXPECT_TRUE(tracker->WillPostTask(verify_task));
296
297 // Confirm that the test conditions are right (no TaskRunnerHandles set
298 // already).
299 EXPECT_FALSE(ThreadTaskRunnerHandle::IsSet());
300 EXPECT_FALSE(SequencedTaskRunnerHandle::IsSet());
301
302 tracker->RunTask(verify_task);
303
304 // TaskRunnerHandle state is reset outside of task's scope.
305 EXPECT_FALSE(ThreadTaskRunnerHandle::IsSet());
306 EXPECT_FALSE(SequencedTaskRunnerHandle::IsSet());
307 }
308
309 void VerifyNoTaskRunnerHandle() {
310 EXPECT_FALSE(ThreadTaskRunnerHandle::IsSet());
311 EXPECT_FALSE(SequencedTaskRunnerHandle::IsSet());
312 }
313
314 TEST_P(TaskSchedulerTaskTrackerTest, TaskRunnerHandleIsNotSetOnParallel) {
315 // Create a task that will verify that TaskRunnerHandles are not set in its
316 // scope per no TaskRunner ref being set to it.
317 std::unique_ptr<Task> verify_task(
318 new Task(FROM_HERE, Bind(&VerifyNoTaskRunnerHandle),
319 TaskTraits().WithShutdownBehavior(GetParam()), TimeDelta()));
320
321 RunTaskRunnerHandleVerificationTask(&tracker_, verify_task.get());
322 }
323
324 void VerifySequencedTaskRunnerHandle(
325 const SequencedTaskRunner* expected_task_runner) {
326 EXPECT_FALSE(ThreadTaskRunnerHandle::IsSet());
327 EXPECT_TRUE(SequencedTaskRunnerHandle::IsSet());
328 EXPECT_EQ(expected_task_runner, SequencedTaskRunnerHandle::Get());
329 }
330
331 TEST_P(TaskSchedulerTaskTrackerTest,
332 SequencedTaskRunnerHandleIsSetOnSequenced) {
333 scoped_refptr<SequencedTaskRunner> test_task_runner(new TestSimpleTaskRunner);
334
335 // Create a task that will verify that SequencedTaskRunnerHandle is properly
336 // set to |test_task_runner| in its scope per |sequenced_task_runner_ref|
337 // being set to it.
338 std::unique_ptr<Task> verify_task(
339 new Task(FROM_HERE, Bind(&VerifySequencedTaskRunnerHandle,
340 base::Unretained(test_task_runner.get())),
341 TaskTraits().WithShutdownBehavior(GetParam()), TimeDelta()));
342 verify_task->sequenced_task_runner_ref = test_task_runner;
343
344 RunTaskRunnerHandleVerificationTask(&tracker_, verify_task.get());
345 }
346
347 void VerifyThreadTaskRunnerHandle(
348 const SingleThreadTaskRunner* expected_task_runner) {
349 EXPECT_TRUE(ThreadTaskRunnerHandle::IsSet());
350 // SequencedTaskRunnerHandle inherits ThreadTaskRunnerHandle for thread.
351 EXPECT_TRUE(SequencedTaskRunnerHandle::IsSet());
352 EXPECT_EQ(expected_task_runner, ThreadTaskRunnerHandle::Get());
353 }
354
355 TEST_P(TaskSchedulerTaskTrackerTest,
356 ThreadTaskRunnerHandleIsSetOnSingleThreaded) {
357 scoped_refptr<SingleThreadTaskRunner> test_task_runner(
358 new TestSimpleTaskRunner);
359
360 // Create a task that will verify that ThreadTaskRunnerHandle is properly set
361 // to |test_task_runner| in its scope per |single_thread_task_runner_ref|
362 // being set on it.
363 std::unique_ptr<Task> verify_task(
364 new Task(FROM_HERE, Bind(&VerifyThreadTaskRunnerHandle,
365 base::Unretained(test_task_runner.get())),
366 TaskTraits().WithShutdownBehavior(GetParam()), TimeDelta()));
367 verify_task->single_thread_task_runner_ref = test_task_runner;
368
369 RunTaskRunnerHandleVerificationTask(&tracker_, verify_task.get());
370 }
371
286 INSTANTIATE_TEST_CASE_P( 372 INSTANTIATE_TEST_CASE_P(
287 ContinueOnShutdown, 373 ContinueOnShutdown,
288 TaskSchedulerTaskTrackerTest, 374 TaskSchedulerTaskTrackerTest,
289 ::testing::Values(TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN)); 375 ::testing::Values(TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN));
290 INSTANTIATE_TEST_CASE_P( 376 INSTANTIATE_TEST_CASE_P(
291 SkipOnShutdown, 377 SkipOnShutdown,
292 TaskSchedulerTaskTrackerTest, 378 TaskSchedulerTaskTrackerTest,
293 ::testing::Values(TaskShutdownBehavior::SKIP_ON_SHUTDOWN)); 379 ::testing::Values(TaskShutdownBehavior::SKIP_ON_SHUTDOWN));
294 INSTANTIATE_TEST_CASE_P( 380 INSTANTIATE_TEST_CASE_P(
295 BlockShutdown, 381 BlockShutdown,
296 TaskSchedulerTaskTrackerTest, 382 TaskSchedulerTaskTrackerTest,
297 ::testing::Values(TaskShutdownBehavior::BLOCK_SHUTDOWN)); 383 ::testing::Values(TaskShutdownBehavior::BLOCK_SHUTDOWN));
298 384
299 } // namespace internal 385 } // namespace internal
300 } // namespace base 386 } // namespace base
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698