thread_task_runner_handle_unittest.cc 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. // Copyright 2017 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. #include "base/threading/thread_task_runner_handle.h"
  5. #include "base/memory/ref_counted.h"
  6. #include "base/run_loop.h"
  7. #include "base/test/gtest_util.h"
  8. #include "base/test/task_environment.h"
  9. #include "base/test/test_simple_task_runner.h"
  10. #include "testing/gtest/include/gtest/gtest.h"
  11. namespace base {
  12. TEST(ThreadTaskRunnerHandleTest, Basic) {
  13. scoped_refptr<SingleThreadTaskRunner> task_runner(new TestSimpleTaskRunner);
  14. EXPECT_FALSE(ThreadTaskRunnerHandle::IsSet());
  15. {
  16. ThreadTaskRunnerHandle ttrh1(task_runner);
  17. EXPECT_TRUE(ThreadTaskRunnerHandle::IsSet());
  18. EXPECT_EQ(task_runner, ThreadTaskRunnerHandle::Get());
  19. }
  20. EXPECT_FALSE(ThreadTaskRunnerHandle::IsSet());
  21. }
  22. TEST(ThreadTaskRunnerHandleTest, DeathOnImplicitOverride) {
  23. scoped_refptr<SingleThreadTaskRunner> task_runner(new TestSimpleTaskRunner);
  24. scoped_refptr<SingleThreadTaskRunner> overidding_task_runner(
  25. new TestSimpleTaskRunner);
  26. ThreadTaskRunnerHandle ttrh(task_runner);
  27. EXPECT_DCHECK_DEATH(
  28. { ThreadTaskRunnerHandle overriding_ttrh(overidding_task_runner); });
  29. }
  30. TEST(ThreadTaskRunnerHandleTest, OverrideExistingTTRH) {
  31. scoped_refptr<SingleThreadTaskRunner> task_runner_1(new TestSimpleTaskRunner);
  32. scoped_refptr<SingleThreadTaskRunner> task_runner_2(new TestSimpleTaskRunner);
  33. scoped_refptr<SingleThreadTaskRunner> task_runner_3(new TestSimpleTaskRunner);
  34. scoped_refptr<SingleThreadTaskRunner> task_runner_4(new TestSimpleTaskRunner);
  35. EXPECT_FALSE(ThreadTaskRunnerHandle::IsSet());
  36. {
  37. // TTRH in place prior to override.
  38. ThreadTaskRunnerHandle ttrh1(task_runner_1);
  39. EXPECT_TRUE(ThreadTaskRunnerHandle::IsSet());
  40. EXPECT_EQ(task_runner_1, ThreadTaskRunnerHandle::Get());
  41. {
  42. // Override.
  43. ThreadTaskRunnerHandleOverrideForTesting ttrh_override_2(task_runner_2);
  44. EXPECT_TRUE(ThreadTaskRunnerHandle::IsSet());
  45. EXPECT_EQ(task_runner_2, ThreadTaskRunnerHandle::Get());
  46. {
  47. // Nested override.
  48. ThreadTaskRunnerHandleOverrideForTesting ttrh_override_3(task_runner_3);
  49. EXPECT_TRUE(ThreadTaskRunnerHandle::IsSet());
  50. EXPECT_EQ(task_runner_3, ThreadTaskRunnerHandle::Get());
  51. }
  52. // Back to single override.
  53. EXPECT_TRUE(ThreadTaskRunnerHandle::IsSet());
  54. EXPECT_EQ(task_runner_2, ThreadTaskRunnerHandle::Get());
  55. {
  56. // Backup to double override with another TTRH.
  57. ThreadTaskRunnerHandleOverrideForTesting ttrh_override_4(task_runner_4);
  58. EXPECT_TRUE(ThreadTaskRunnerHandle::IsSet());
  59. EXPECT_EQ(task_runner_4, ThreadTaskRunnerHandle::Get());
  60. }
  61. }
  62. // Back to simple TTRH.
  63. EXPECT_TRUE(ThreadTaskRunnerHandle::IsSet());
  64. EXPECT_EQ(task_runner_1, ThreadTaskRunnerHandle::Get());
  65. }
  66. EXPECT_FALSE(ThreadTaskRunnerHandle::IsSet());
  67. }
  68. TEST(ThreadTaskRunnerHandleTest, OverrideNoExistingTTRH) {
  69. scoped_refptr<SingleThreadTaskRunner> task_runner_1(new TestSimpleTaskRunner);
  70. scoped_refptr<SingleThreadTaskRunner> task_runner_2(new TestSimpleTaskRunner);
  71. EXPECT_FALSE(ThreadTaskRunnerHandle::IsSet());
  72. {
  73. // Override with no TTRH in place.
  74. ThreadTaskRunnerHandleOverrideForTesting ttrh_override_1(task_runner_1);
  75. EXPECT_TRUE(ThreadTaskRunnerHandle::IsSet());
  76. EXPECT_EQ(task_runner_1, ThreadTaskRunnerHandle::Get());
  77. {
  78. // Nested override works the same.
  79. ThreadTaskRunnerHandleOverrideForTesting ttrh_override_2(task_runner_2);
  80. EXPECT_TRUE(ThreadTaskRunnerHandle::IsSet());
  81. EXPECT_EQ(task_runner_2, ThreadTaskRunnerHandle::Get());
  82. }
  83. // Back to single override.
  84. EXPECT_TRUE(ThreadTaskRunnerHandle::IsSet());
  85. EXPECT_EQ(task_runner_1, ThreadTaskRunnerHandle::Get());
  86. }
  87. EXPECT_FALSE(ThreadTaskRunnerHandle::IsSet());
  88. }
  89. TEST(ThreadTaskRunnerHandleTest, DeathOnTTRHOverOverride) {
  90. scoped_refptr<SingleThreadTaskRunner> task_runner(new TestSimpleTaskRunner);
  91. scoped_refptr<SingleThreadTaskRunner> overidding_task_runner(
  92. new TestSimpleTaskRunner);
  93. ThreadTaskRunnerHandleOverrideForTesting ttrh_override(task_runner);
  94. EXPECT_DCHECK_DEATH(
  95. { ThreadTaskRunnerHandle overriding_ttrh(overidding_task_runner); });
  96. }
  97. TEST(ThreadTaskRunnerHandleTest, NestedRunLoop) {
  98. test::SingleThreadTaskEnvironment task_environment;
  99. EXPECT_TRUE(ThreadTaskRunnerHandle::IsSet());
  100. scoped_refptr<SingleThreadTaskRunner> task_runner(new TestSimpleTaskRunner);
  101. ThreadTaskRunnerHandleOverride ttrh_override(task_runner,
  102. /*allow_nested_runloop=*/true);
  103. EXPECT_TRUE(ThreadTaskRunnerHandle::IsSet());
  104. EXPECT_EQ(task_runner, ThreadTaskRunnerHandle::Get());
  105. EXPECT_EQ(task_runner, SequencedTaskRunnerHandle::Get());
  106. RunLoop().RunUntilIdle();
  107. }
  108. TEST(ThreadTaskRunnerHandleTest, DeathOnNestedRunLoop) {
  109. test::SingleThreadTaskEnvironment task_environment;
  110. EXPECT_TRUE(ThreadTaskRunnerHandle::IsSet());
  111. scoped_refptr<SingleThreadTaskRunner> task_runner(new TestSimpleTaskRunner);
  112. ThreadTaskRunnerHandleOverrideForTesting ttrh_override(task_runner);
  113. EXPECT_TRUE(ThreadTaskRunnerHandle::IsSet());
  114. EXPECT_EQ(task_runner, ThreadTaskRunnerHandle::Get());
  115. EXPECT_EQ(task_runner, SequencedTaskRunnerHandle::Get());
  116. EXPECT_DCHECK_DEATH({ RunLoop().RunUntilIdle(); });
  117. }
  118. } // namespace base