• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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