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
5 #include "base/task/single_thread_task_runner.h"
6
7 #include "base/memory/scoped_refptr.h"
8 #include "base/run_loop.h"
9 #include "base/task/sequenced_task_runner.h"
10 #include "base/task/single_thread_task_runner.h"
11 #include "base/test/gtest_util.h"
12 #include "base/test/task_environment.h"
13 #include "base/test/test_simple_task_runner.h"
14 #include "testing/gtest/include/gtest/gtest.h"
15
16 namespace base {
17
TEST(SingleThreadTaskRunnerCurrentDefaultHandleTest,Basic)18 TEST(SingleThreadTaskRunnerCurrentDefaultHandleTest, Basic) {
19 scoped_refptr<SingleThreadTaskRunner> task_runner(
20 MakeRefCounted<TestSimpleTaskRunner>());
21
22 EXPECT_FALSE(SingleThreadTaskRunner::HasCurrentDefault());
23 {
24 SingleThreadTaskRunner::CurrentDefaultHandle sttcd1(task_runner);
25 EXPECT_TRUE(SingleThreadTaskRunner::HasCurrentDefault());
26 EXPECT_EQ(task_runner, SingleThreadTaskRunner::GetCurrentDefault());
27 }
28 EXPECT_FALSE(SingleThreadTaskRunner::HasCurrentDefault());
29 }
30
TEST(SingleThreadTaskRunnerCurrentDefaultHandleTest,DeathOnImplicitOverride)31 TEST(SingleThreadTaskRunnerCurrentDefaultHandleTest, DeathOnImplicitOverride) {
32 scoped_refptr<SingleThreadTaskRunner> task_runner(
33 MakeRefCounted<TestSimpleTaskRunner>());
34 scoped_refptr<SingleThreadTaskRunner> overidding_task_runner(
35 MakeRefCounted<TestSimpleTaskRunner>());
36
37 SingleThreadTaskRunner::CurrentDefaultHandle sttcd(task_runner);
38 EXPECT_DCHECK_DEATH({
39 SingleThreadTaskRunner::CurrentDefaultHandle overriding_sttcd(
40 overidding_task_runner);
41 });
42 }
43
TEST(SingleThreadTaskRunnerCurrentDefaultHandleTest,OverrideExistingSTTCD)44 TEST(SingleThreadTaskRunnerCurrentDefaultHandleTest, OverrideExistingSTTCD) {
45 scoped_refptr<SingleThreadTaskRunner> task_runner_1(
46 MakeRefCounted<TestSimpleTaskRunner>());
47 scoped_refptr<SingleThreadTaskRunner> task_runner_2(
48 MakeRefCounted<TestSimpleTaskRunner>());
49 scoped_refptr<SingleThreadTaskRunner> task_runner_3(
50 MakeRefCounted<TestSimpleTaskRunner>());
51 scoped_refptr<SingleThreadTaskRunner> task_runner_4(
52 MakeRefCounted<TestSimpleTaskRunner>());
53
54 EXPECT_FALSE(SingleThreadTaskRunner::HasCurrentDefault());
55 {
56 // STTCD in place prior to override.
57 SingleThreadTaskRunner::CurrentDefaultHandle sttcd1(task_runner_1);
58 EXPECT_TRUE(SingleThreadTaskRunner::HasCurrentDefault());
59 EXPECT_EQ(task_runner_1, SingleThreadTaskRunner::GetCurrentDefault());
60
61 {
62 // Override.
63 SingleThreadTaskRunner::CurrentHandleOverrideForTesting sttcd_override_2(
64 task_runner_2);
65 EXPECT_TRUE(SingleThreadTaskRunner::HasCurrentDefault());
66 EXPECT_EQ(task_runner_2, SingleThreadTaskRunner::GetCurrentDefault());
67
68 {
69 // Nested override.
70 SingleThreadTaskRunner::CurrentHandleOverrideForTesting
71 sttcd_override_3(task_runner_3);
72 EXPECT_TRUE(SingleThreadTaskRunner::HasCurrentDefault());
73 EXPECT_EQ(task_runner_3, SingleThreadTaskRunner::GetCurrentDefault());
74 }
75
76 // Back to single override.
77 EXPECT_TRUE(SingleThreadTaskRunner::HasCurrentDefault());
78 EXPECT_EQ(task_runner_2, SingleThreadTaskRunner::GetCurrentDefault());
79
80 {
81 // Backup to double override with another STTCD.
82 SingleThreadTaskRunner::CurrentHandleOverrideForTesting
83 sttcd_override_4(task_runner_4);
84 EXPECT_TRUE(SingleThreadTaskRunner::HasCurrentDefault());
85 EXPECT_EQ(task_runner_4, SingleThreadTaskRunner::GetCurrentDefault());
86 }
87 }
88
89 // Back to simple STTCD.
90 EXPECT_TRUE(SingleThreadTaskRunner::HasCurrentDefault());
91 EXPECT_EQ(task_runner_1, SingleThreadTaskRunner::GetCurrentDefault());
92 }
93 EXPECT_FALSE(SingleThreadTaskRunner::HasCurrentDefault());
94 }
95
TEST(SingleThreadTaskRunnerCurrentDefaultHandleTest,OverrideNoExistingSTTCD)96 TEST(SingleThreadTaskRunnerCurrentDefaultHandleTest, OverrideNoExistingSTTCD) {
97 scoped_refptr<SingleThreadTaskRunner> task_runner_1(
98 MakeRefCounted<TestSimpleTaskRunner>());
99 scoped_refptr<SingleThreadTaskRunner> task_runner_2(
100 MakeRefCounted<TestSimpleTaskRunner>());
101
102 EXPECT_FALSE(SingleThreadTaskRunner::HasCurrentDefault());
103 {
104 // Override with no STTCD in place.
105 SingleThreadTaskRunner::CurrentHandleOverrideForTesting sttcd_override_1(
106 task_runner_1);
107 EXPECT_TRUE(SingleThreadTaskRunner::HasCurrentDefault());
108 EXPECT_EQ(task_runner_1, SingleThreadTaskRunner::GetCurrentDefault());
109
110 {
111 // Nested override works the same.
112 SingleThreadTaskRunner::CurrentHandleOverrideForTesting sttcd_override_2(
113 task_runner_2);
114 EXPECT_TRUE(SingleThreadTaskRunner::HasCurrentDefault());
115 EXPECT_EQ(task_runner_2, SingleThreadTaskRunner::GetCurrentDefault());
116 }
117
118 // Back to single override.
119 EXPECT_TRUE(SingleThreadTaskRunner::HasCurrentDefault());
120 EXPECT_EQ(task_runner_1, SingleThreadTaskRunner::GetCurrentDefault());
121 }
122 EXPECT_FALSE(SingleThreadTaskRunner::HasCurrentDefault());
123 }
124
TEST(SingleThreadTaskRunnerCurrentDefaultHandleTest,DeathOnSTTCDOverOverride)125 TEST(SingleThreadTaskRunnerCurrentDefaultHandleTest, DeathOnSTTCDOverOverride) {
126 scoped_refptr<SingleThreadTaskRunner> task_runner(
127 MakeRefCounted<TestSimpleTaskRunner>());
128 scoped_refptr<SingleThreadTaskRunner> overidding_task_runner(
129 MakeRefCounted<TestSimpleTaskRunner>());
130
131 SingleThreadTaskRunner::CurrentHandleOverrideForTesting sttcd_override(
132 task_runner);
133 EXPECT_DCHECK_DEATH({
134 SingleThreadTaskRunner::CurrentDefaultHandle overriding_sttrcd(
135 overidding_task_runner);
136 });
137 }
138
TEST(SingleThreadTaskRunnerCurrentDefaultHandleTest,NestedRunLoop)139 TEST(SingleThreadTaskRunnerCurrentDefaultHandleTest, NestedRunLoop) {
140 test::SingleThreadTaskEnvironment task_environment;
141 EXPECT_TRUE(SingleThreadTaskRunner::HasCurrentDefault());
142 scoped_refptr<SingleThreadTaskRunner> task_runner(
143 MakeRefCounted<TestSimpleTaskRunner>());
144 SingleThreadTaskRunner::CurrentHandleOverride sttrcd_override(
145 task_runner,
146 /*allow_nested_runloop=*/true);
147 EXPECT_TRUE(SingleThreadTaskRunner::HasCurrentDefault());
148 EXPECT_EQ(task_runner, SingleThreadTaskRunner::GetCurrentDefault());
149 EXPECT_EQ(task_runner, SequencedTaskRunner::GetCurrentDefault());
150 RunLoop().RunUntilIdle();
151 }
152
TEST(SingleThreadTaskRunnerCurrentDefaultHandleTest,DeathOnNestedRunLoop)153 TEST(SingleThreadTaskRunnerCurrentDefaultHandleTest, DeathOnNestedRunLoop) {
154 test::SingleThreadTaskEnvironment task_environment;
155 EXPECT_TRUE(SingleThreadTaskRunner::HasCurrentDefault());
156 scoped_refptr<SingleThreadTaskRunner> task_runner(
157 MakeRefCounted<TestSimpleTaskRunner>());
158 SingleThreadTaskRunner::CurrentHandleOverrideForTesting sttcd_override(
159 task_runner);
160 EXPECT_TRUE(SingleThreadTaskRunner::HasCurrentDefault());
161 EXPECT_EQ(task_runner, SingleThreadTaskRunner::GetCurrentDefault());
162 EXPECT_EQ(task_runner, SequencedTaskRunner::GetCurrentDefault());
163 EXPECT_DCHECK_DEATH({ RunLoop().RunUntilIdle(); });
164 }
165
166 } // namespace base
167