OLD | NEW |
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/scheduler_worker_pool_impl.h" | 5 #include "base/task_scheduler/scheduler_worker_pool_impl.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <memory> | 9 #include <memory> |
10 #include <unordered_set> | 10 #include <unordered_set> |
(...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
334 | 334 |
335 // Expect the task to run after its delay expires, but not more than 250 ms | 335 // Expect the task to run after its delay expires, but not more than 250 ms |
336 // after that. | 336 // after that. |
337 const TimeDelta actual_delay = TimeTicks::Now() - start_time; | 337 const TimeDelta actual_delay = TimeTicks::Now() - start_time; |
338 EXPECT_GE(actual_delay, TestTimeouts::tiny_timeout()); | 338 EXPECT_GE(actual_delay, TestTimeouts::tiny_timeout()); |
339 EXPECT_LT(actual_delay, | 339 EXPECT_LT(actual_delay, |
340 TimeDelta::FromMilliseconds(250) + TestTimeouts::tiny_timeout()); | 340 TimeDelta::FromMilliseconds(250) + TestTimeouts::tiny_timeout()); |
341 } | 341 } |
342 | 342 |
343 // Verify that the RunsTasksOnCurrentThread() method of a SEQUENCED TaskRunner | 343 // Verify that the RunsTasksOnCurrentThread() method of a SEQUENCED TaskRunner |
344 // returns false when called from a task that isn't part of the sequence. | 344 // returns false when called from a task that isn't part of the sequence. Note: |
| 345 // Tests that use TestTaskFactory already verify that RunsTasksOnCurrentThread() |
| 346 // returns true when appropriate so this method complements it to get full |
| 347 // coverage of that method. |
345 TEST_P(TaskSchedulerWorkerPoolImplTest, SequencedRunsTasksOnCurrentThread) { | 348 TEST_P(TaskSchedulerWorkerPoolImplTest, SequencedRunsTasksOnCurrentThread) { |
346 scoped_refptr<TaskRunner> task_runner( | 349 scoped_refptr<TaskRunner> task_runner( |
347 CreateTaskRunnerWithExecutionMode(worker_pool_.get(), GetParam())); | 350 CreateTaskRunnerWithExecutionMode(worker_pool_.get(), GetParam())); |
348 scoped_refptr<SequencedTaskRunner> sequenced_task_runner( | 351 scoped_refptr<SequencedTaskRunner> sequenced_task_runner( |
349 worker_pool_->CreateSequencedTaskRunnerWithTraits(TaskTraits())); | 352 worker_pool_->CreateSequencedTaskRunnerWithTraits(TaskTraits())); |
350 | 353 |
351 WaitableEvent task_ran(WaitableEvent::ResetPolicy::MANUAL, | 354 WaitableEvent task_ran(WaitableEvent::ResetPolicy::MANUAL, |
352 WaitableEvent::InitialState::NOT_SIGNALED); | 355 WaitableEvent::InitialState::NOT_SIGNALED); |
353 task_runner->PostTask( | 356 task_runner->PostTask( |
354 FROM_HERE, | 357 FROM_HERE, |
355 Bind( | 358 Bind( |
356 [](scoped_refptr<TaskRunner> sequenced_task_runner, | 359 [](scoped_refptr<TaskRunner> sequenced_task_runner, |
357 WaitableEvent* task_ran) { | 360 WaitableEvent* task_ran) { |
358 EXPECT_FALSE(sequenced_task_runner->RunsTasksOnCurrentThread()); | 361 EXPECT_FALSE(sequenced_task_runner->RunsTasksOnCurrentThread()); |
359 // Tests that use TestTaskFactory already verify that | |
360 // RunsTasksOnCurrentThread() returns true when appropriate. | |
361 task_ran->Signal(); | 362 task_ran->Signal(); |
362 }, | 363 }, |
363 sequenced_task_runner, Unretained(&task_ran))); | 364 sequenced_task_runner, Unretained(&task_ran))); |
364 task_ran.Wait(); | 365 task_ran.Wait(); |
365 } | 366 } |
366 | 367 |
367 INSTANTIATE_TEST_CASE_P(Parallel, | 368 INSTANTIATE_TEST_CASE_P(Parallel, |
368 TaskSchedulerWorkerPoolImplTest, | 369 TaskSchedulerWorkerPoolImplTest, |
369 ::testing::Values(test::ExecutionMode::PARALLEL)); | 370 ::testing::Values(test::ExecutionMode::PARALLEL)); |
370 INSTANTIATE_TEST_CASE_P(Sequenced, | 371 INSTANTIATE_TEST_CASE_P(Sequenced, |
371 TaskSchedulerWorkerPoolImplTest, | 372 TaskSchedulerWorkerPoolImplTest, |
372 ::testing::Values(test::ExecutionMode::SEQUENCED)); | 373 ::testing::Values(test::ExecutionMode::SEQUENCED)); |
373 INSTANTIATE_TEST_CASE_P( | 374 INSTANTIATE_TEST_CASE_P( |
374 SingleThreaded, | 375 SingleThreaded, |
375 TaskSchedulerWorkerPoolImplTest, | 376 TaskSchedulerWorkerPoolImplTest, |
376 ::testing::Values(test::ExecutionMode::SINGLE_THREADED)); | 377 ::testing::Values(test::ExecutionMode::SINGLE_THREADED)); |
377 | 378 |
378 namespace { | 379 namespace { |
379 | 380 |
| 381 // Same as TaskSchedulerWorkerPoolImplTest but its SchedulerWorkerPoolImpl |
| 382 // instance uses |max_threads == 1|. |
| 383 class TaskSchedulerWorkerPoolImplSingleWorkerTest |
| 384 : public TaskSchedulerWorkerPoolImplTest { |
| 385 public: |
| 386 TaskSchedulerWorkerPoolImplSingleWorkerTest() = default; |
| 387 |
| 388 protected: |
| 389 void SetUp() override { |
| 390 InitializeWorkerPool(TimeDelta::Max(), 1); |
| 391 } |
| 392 |
| 393 private: |
| 394 DISALLOW_COPY_AND_ASSIGN(TaskSchedulerWorkerPoolImplSingleWorkerTest); |
| 395 }; |
| 396 |
| 397 } // namespace |
| 398 |
| 399 // Verify that the RunsTasksOnCurrentThread() method of a |
| 400 // SchedulerSingleThreadTaskRunner returns false when called from a task that |
| 401 // isn't part of its sequence even though it's running on that |
| 402 // SchedulerSingleThreadTaskRunner's assigned worker. Note: Tests that use |
| 403 // TestTaskFactory already verify that RunsTasksOnCurrentThread() returns true |
| 404 // when appropriate so this method complements it to get full coverage of that |
| 405 // method. |
| 406 TEST_P(TaskSchedulerWorkerPoolImplSingleWorkerTest, |
| 407 SingleThreadRunsTasksOnCurrentThread) { |
| 408 scoped_refptr<TaskRunner> task_runner( |
| 409 CreateTaskRunnerWithExecutionMode(worker_pool_.get(), GetParam())); |
| 410 scoped_refptr<SingleThreadTaskRunner> single_thread_task_runner( |
| 411 worker_pool_->CreateSingleThreadTaskRunnerWithTraits(TaskTraits())); |
| 412 |
| 413 WaitableEvent task_ran(WaitableEvent::ResetPolicy::MANUAL, |
| 414 WaitableEvent::InitialState::NOT_SIGNALED); |
| 415 task_runner->PostTask( |
| 416 FROM_HERE, |
| 417 Bind( |
| 418 [](scoped_refptr<TaskRunner> single_thread_task_runner, |
| 419 WaitableEvent* task_ran) { |
| 420 EXPECT_FALSE(single_thread_task_runner->RunsTasksOnCurrentThread()); |
| 421 task_ran->Signal(); |
| 422 }, |
| 423 single_thread_task_runner, Unretained(&task_ran))); |
| 424 task_ran.Wait(); |
| 425 } |
| 426 |
| 427 INSTANTIATE_TEST_CASE_P(Parallel, |
| 428 TaskSchedulerWorkerPoolImplSingleWorkerTest, |
| 429 ::testing::Values(test::ExecutionMode::PARALLEL)); |
| 430 INSTANTIATE_TEST_CASE_P(Sequenced, |
| 431 TaskSchedulerWorkerPoolImplSingleWorkerTest, |
| 432 ::testing::Values(test::ExecutionMode::SEQUENCED)); |
| 433 INSTANTIATE_TEST_CASE_P( |
| 434 SingleThreaded, |
| 435 TaskSchedulerWorkerPoolImplSingleWorkerTest, |
| 436 ::testing::Values(test::ExecutionMode::SINGLE_THREADED)); |
| 437 |
| 438 namespace { |
| 439 |
380 void NotReachedReEnqueueSequenceCallback(scoped_refptr<Sequence> sequence) { | 440 void NotReachedReEnqueueSequenceCallback(scoped_refptr<Sequence> sequence) { |
381 ADD_FAILURE() | 441 ADD_FAILURE() |
382 << "Unexpected invocation of NotReachedReEnqueueSequenceCallback."; | 442 << "Unexpected invocation of NotReachedReEnqueueSequenceCallback."; |
383 } | 443 } |
384 | 444 |
385 // Verifies that the current thread allows I/O if |io_restriction| is ALLOWED | 445 // Verifies that the current thread allows I/O if |io_restriction| is ALLOWED |
386 // and disallows it otherwise. Signals |event| before returning. | 446 // and disallows it otherwise. Signals |event| before returning. |
387 void ExpectIORestriction(IORestriction io_restriction, WaitableEvent* event) { | 447 void ExpectIORestriction(IORestriction io_restriction, WaitableEvent* event) { |
388 DCHECK(event); | 448 DCHECK(event); |
389 | 449 |
(...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
760 | 820 |
761 // Verify that counts were recorded to the histogram as expected. | 821 // Verify that counts were recorded to the histogram as expected. |
762 const auto* histogram = worker_pool_->num_tasks_before_detach_histogram(); | 822 const auto* histogram = worker_pool_->num_tasks_before_detach_histogram(); |
763 EXPECT_EQ(0, histogram->SnapshotSamples()->GetCount(0)); | 823 EXPECT_EQ(0, histogram->SnapshotSamples()->GetCount(0)); |
764 EXPECT_EQ(1, histogram->SnapshotSamples()->GetCount(3)); | 824 EXPECT_EQ(1, histogram->SnapshotSamples()->GetCount(3)); |
765 EXPECT_EQ(0, histogram->SnapshotSamples()->GetCount(10)); | 825 EXPECT_EQ(0, histogram->SnapshotSamples()->GetCount(10)); |
766 } | 826 } |
767 | 827 |
768 } // namespace internal | 828 } // namespace internal |
769 } // namespace base | 829 } // namespace base |
OLD | NEW |