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

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

Powered by Google App Engine
This is Rietveld 408576698