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

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:danakj#28 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
« no previous file with comments | « base/task_scheduler/task_tracker.cc ('k') | base/task_scheduler/test_task_factory.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "base/threading/thread_restrictions.h" 25 #include "base/threading/thread_restrictions.h"
20 #include "testing/gtest/include/gtest/gtest.h" 26 #include "testing/gtest/include/gtest/gtest.h"
21 27
22 namespace base { 28 namespace base {
23 namespace internal { 29 namespace internal {
24 30
25 namespace { 31 namespace {
26 32
27 // Calls TaskTracker::Shutdown() asynchronously. 33 // Calls TaskTracker::Shutdown() asynchronously.
(...skipping 15 matching lines...) Expand all
43 49
44 TaskTracker* const tracker_; 50 TaskTracker* const tracker_;
45 WaitableEvent has_returned_; 51 WaitableEvent has_returned_;
46 52
47 DISALLOW_COPY_AND_ASSIGN(ThreadCallingShutdown); 53 DISALLOW_COPY_AND_ASSIGN(ThreadCallingShutdown);
48 }; 54 };
49 55
50 // Runs a task asynchronously. 56 // Runs a task asynchronously.
51 class ThreadRunningTask : public SimpleThread { 57 class ThreadRunningTask : public SimpleThread {
52 public: 58 public:
53 explicit ThreadRunningTask(TaskTracker* tracker, const Task* task) 59 ThreadRunningTask(TaskTracker* tracker, const Task* task)
54 : SimpleThread("ThreadRunningTask"), tracker_(tracker), task_(task) {} 60 : SimpleThread("ThreadRunningTask"), tracker_(tracker), task_(task) {}
55 61
56 private: 62 private:
57 void Run() override { tracker_->RunTask(task_); } 63 void Run() override { tracker_->RunTask(task_); }
58 64
59 TaskTracker* const tracker_; 65 TaskTracker* const tracker_;
60 const Task* const task_; 66 const Task* const task_;
61 67
62 DISALLOW_COPY_AND_ASSIGN(ThreadRunningTask); 68 DISALLOW_COPY_AND_ASSIGN(ThreadRunningTask);
63 }; 69 };
(...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after
314 ScopedSetSingletonAllowed scoped_singleton_allowed(!can_use_singletons); 320 ScopedSetSingletonAllowed scoped_singleton_allowed(!can_use_singletons);
315 321
316 // Running the task should fail iff the task isn't allowed to use singletons. 322 // Running the task should fail iff the task isn't allowed to use singletons.
317 if (can_use_singletons) { 323 if (can_use_singletons) {
318 tracker.RunTask(&task); 324 tracker.RunTask(&task);
319 } else { 325 } else {
320 EXPECT_DCHECK_DEATH({ tracker.RunTask(&task); }, ""); 326 EXPECT_DCHECK_DEATH({ tracker.RunTask(&task); }, "");
321 } 327 }
322 } 328 }
323 329
330 static void RunTaskRunnerHandleVerificationTask(TaskTracker* tracker,
331 const Task* verify_task) {
332 // Pretend |verify_task| is posted to respect TaskTracker's contract.
333 EXPECT_TRUE(tracker->WillPostTask(verify_task));
334
335 // Confirm that the test conditions are right (no TaskRunnerHandles set
336 // already).
337 EXPECT_FALSE(ThreadTaskRunnerHandle::IsSet());
338 EXPECT_FALSE(SequencedTaskRunnerHandle::IsSet());
339
340 tracker->RunTask(verify_task);
341
342 // TaskRunnerHandle state is reset outside of task's scope.
343 EXPECT_FALSE(ThreadTaskRunnerHandle::IsSet());
344 EXPECT_FALSE(SequencedTaskRunnerHandle::IsSet());
345 }
346
347 static void VerifyNoTaskRunnerHandle() {
348 EXPECT_FALSE(ThreadTaskRunnerHandle::IsSet());
349 EXPECT_FALSE(SequencedTaskRunnerHandle::IsSet());
350 }
351
352 TEST_P(TaskSchedulerTaskTrackerTest, TaskRunnerHandleIsNotSetOnParallel) {
353 // Create a task that will verify that TaskRunnerHandles are not set in its
354 // scope per no TaskRunner ref being set to it.
355 std::unique_ptr<Task> verify_task(
356 new Task(FROM_HERE, Bind(&VerifyNoTaskRunnerHandle),
357 TaskTraits().WithShutdownBehavior(GetParam()), TimeDelta()));
358
359 RunTaskRunnerHandleVerificationTask(&tracker_, verify_task.get());
360 }
361
362 static void VerifySequencedTaskRunnerHandle(
363 const SequencedTaskRunner* expected_task_runner) {
364 EXPECT_FALSE(ThreadTaskRunnerHandle::IsSet());
365 EXPECT_TRUE(SequencedTaskRunnerHandle::IsSet());
366 EXPECT_EQ(expected_task_runner, SequencedTaskRunnerHandle::Get());
367 }
368
369 TEST_P(TaskSchedulerTaskTrackerTest,
370 SequencedTaskRunnerHandleIsSetOnSequenced) {
371 scoped_refptr<SequencedTaskRunner> test_task_runner(new TestSimpleTaskRunner);
372
373 // Create a task that will verify that SequencedTaskRunnerHandle is properly
374 // set to |test_task_runner| in its scope per |sequenced_task_runner_ref|
375 // being set to it.
376 std::unique_ptr<Task> verify_task(
377 new Task(FROM_HERE, Bind(&VerifySequencedTaskRunnerHandle,
378 base::Unretained(test_task_runner.get())),
379 TaskTraits().WithShutdownBehavior(GetParam()), TimeDelta()));
380 verify_task->sequenced_task_runner_ref = test_task_runner;
381
382 RunTaskRunnerHandleVerificationTask(&tracker_, verify_task.get());
383 }
384
385 static void VerifyThreadTaskRunnerHandle(
386 const SingleThreadTaskRunner* expected_task_runner) {
387 EXPECT_TRUE(ThreadTaskRunnerHandle::IsSet());
388 // SequencedTaskRunnerHandle inherits ThreadTaskRunnerHandle for thread.
389 EXPECT_TRUE(SequencedTaskRunnerHandle::IsSet());
390 EXPECT_EQ(expected_task_runner, ThreadTaskRunnerHandle::Get());
391 }
392
393 TEST_P(TaskSchedulerTaskTrackerTest,
394 ThreadTaskRunnerHandleIsSetOnSingleThreaded) {
395 scoped_refptr<SingleThreadTaskRunner> test_task_runner(
396 new TestSimpleTaskRunner);
397
398 // Create a task that will verify that ThreadTaskRunnerHandle is properly set
399 // to |test_task_runner| in its scope per |single_thread_task_runner_ref|
400 // being set on it.
401 std::unique_ptr<Task> verify_task(
402 new Task(FROM_HERE, Bind(&VerifyThreadTaskRunnerHandle,
403 base::Unretained(test_task_runner.get())),
404 TaskTraits().WithShutdownBehavior(GetParam()), TimeDelta()));
405 verify_task->single_thread_task_runner_ref = test_task_runner;
406
407 RunTaskRunnerHandleVerificationTask(&tracker_, verify_task.get());
408 }
409
324 INSTANTIATE_TEST_CASE_P( 410 INSTANTIATE_TEST_CASE_P(
325 ContinueOnShutdown, 411 ContinueOnShutdown,
326 TaskSchedulerTaskTrackerTest, 412 TaskSchedulerTaskTrackerTest,
327 ::testing::Values(TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN)); 413 ::testing::Values(TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN));
328 INSTANTIATE_TEST_CASE_P( 414 INSTANTIATE_TEST_CASE_P(
329 SkipOnShutdown, 415 SkipOnShutdown,
330 TaskSchedulerTaskTrackerTest, 416 TaskSchedulerTaskTrackerTest,
331 ::testing::Values(TaskShutdownBehavior::SKIP_ON_SHUTDOWN)); 417 ::testing::Values(TaskShutdownBehavior::SKIP_ON_SHUTDOWN));
332 INSTANTIATE_TEST_CASE_P( 418 INSTANTIATE_TEST_CASE_P(
333 BlockShutdown, 419 BlockShutdown,
334 TaskSchedulerTaskTrackerTest, 420 TaskSchedulerTaskTrackerTest,
335 ::testing::Values(TaskShutdownBehavior::BLOCK_SHUTDOWN)); 421 ::testing::Values(TaskShutdownBehavior::BLOCK_SHUTDOWN));
336 422
337 } // namespace internal 423 } // namespace internal
338 } // namespace base 424 } // namespace base
OLDNEW
« no previous file with comments | « base/task_scheduler/task_tracker.cc ('k') | base/task_scheduler/test_task_factory.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698