xref: /aosp_15_r20/external/libchrome/base/threading/thread_task_runner_handle_unittest.cc (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
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/threading/thread_task_runner_handle.h"
6 
7 #include "base/memory/ref_counted.h"
8 #include "base/test/gtest_util.h"
9 #include "base/test/test_simple_task_runner.h"
10 #include "testing/gtest/include/gtest/gtest.h"
11 
12 namespace base {
13 
TEST(ThreadTaskRunnerHandleTest,Basic)14 TEST(ThreadTaskRunnerHandleTest, Basic) {
15   scoped_refptr<SingleThreadTaskRunner> task_runner(new TestSimpleTaskRunner);
16 
17   EXPECT_FALSE(ThreadTaskRunnerHandle::IsSet());
18   {
19     ThreadTaskRunnerHandle ttrh1(task_runner);
20     EXPECT_TRUE(ThreadTaskRunnerHandle::IsSet());
21     EXPECT_EQ(task_runner, ThreadTaskRunnerHandle::Get());
22   }
23   EXPECT_FALSE(ThreadTaskRunnerHandle::IsSet());
24 }
25 
TEST(ThreadTaskRunnerHandleTest,DeathOnImplicitOverride)26 TEST(ThreadTaskRunnerHandleTest, DeathOnImplicitOverride) {
27   scoped_refptr<SingleThreadTaskRunner> task_runner(new TestSimpleTaskRunner);
28   scoped_refptr<SingleThreadTaskRunner> overidding_task_runner(
29       new TestSimpleTaskRunner);
30 
31   ThreadTaskRunnerHandle ttrh(task_runner);
32   EXPECT_DCHECK_DEATH(
33       { ThreadTaskRunnerHandle overriding_ttrh(overidding_task_runner); });
34 }
35 
TEST(ThreadTaskRunnerHandleTest,OverrideForTestingExistingTTRH)36 TEST(ThreadTaskRunnerHandleTest, OverrideForTestingExistingTTRH) {
37   scoped_refptr<SingleThreadTaskRunner> task_runner_1(new TestSimpleTaskRunner);
38   scoped_refptr<SingleThreadTaskRunner> task_runner_2(new TestSimpleTaskRunner);
39   scoped_refptr<SingleThreadTaskRunner> task_runner_3(new TestSimpleTaskRunner);
40   scoped_refptr<SingleThreadTaskRunner> task_runner_4(new TestSimpleTaskRunner);
41 
42   EXPECT_FALSE(ThreadTaskRunnerHandle::IsSet());
43   {
44     // TTRH in place prior to override.
45     ThreadTaskRunnerHandle ttrh1(task_runner_1);
46     EXPECT_TRUE(ThreadTaskRunnerHandle::IsSet());
47     EXPECT_EQ(task_runner_1, ThreadTaskRunnerHandle::Get());
48 
49     {
50       // Override.
51       ScopedClosureRunner undo_override_2 =
52           ThreadTaskRunnerHandle::OverrideForTesting(task_runner_2);
53       EXPECT_TRUE(ThreadTaskRunnerHandle::IsSet());
54       EXPECT_EQ(task_runner_2, ThreadTaskRunnerHandle::Get());
55 
56       {
57         // Nested override.
58         ScopedClosureRunner undo_override_3 =
59             ThreadTaskRunnerHandle::OverrideForTesting(task_runner_3);
60         EXPECT_TRUE(ThreadTaskRunnerHandle::IsSet());
61         EXPECT_EQ(task_runner_3, ThreadTaskRunnerHandle::Get());
62       }
63 
64       // Back to single override.
65       EXPECT_TRUE(ThreadTaskRunnerHandle::IsSet());
66       EXPECT_EQ(task_runner_2, ThreadTaskRunnerHandle::Get());
67 
68       {
69         // Backup to double override with another TTRH.
70         ScopedClosureRunner undo_override_4 =
71             ThreadTaskRunnerHandle::OverrideForTesting(task_runner_4);
72         EXPECT_TRUE(ThreadTaskRunnerHandle::IsSet());
73         EXPECT_EQ(task_runner_4, ThreadTaskRunnerHandle::Get());
74       }
75     }
76 
77     // Back to simple TTRH.
78     EXPECT_TRUE(ThreadTaskRunnerHandle::IsSet());
79     EXPECT_EQ(task_runner_1, ThreadTaskRunnerHandle::Get());
80   }
81   EXPECT_FALSE(ThreadTaskRunnerHandle::IsSet());
82 }
83 
TEST(ThreadTaskRunnerHandleTest,OverrideForTestingNoExistingTTRH)84 TEST(ThreadTaskRunnerHandleTest, OverrideForTestingNoExistingTTRH) {
85   scoped_refptr<SingleThreadTaskRunner> task_runner_1(new TestSimpleTaskRunner);
86   scoped_refptr<SingleThreadTaskRunner> task_runner_2(new TestSimpleTaskRunner);
87 
88   EXPECT_FALSE(ThreadTaskRunnerHandle::IsSet());
89   {
90     // Override with no TTRH in place.
91     ScopedClosureRunner undo_override_1 =
92         ThreadTaskRunnerHandle::OverrideForTesting(task_runner_1);
93     EXPECT_TRUE(ThreadTaskRunnerHandle::IsSet());
94     EXPECT_EQ(task_runner_1, ThreadTaskRunnerHandle::Get());
95 
96     {
97       // Nested override works the same.
98       ScopedClosureRunner undo_override_2 =
99           ThreadTaskRunnerHandle::OverrideForTesting(task_runner_2);
100       EXPECT_TRUE(ThreadTaskRunnerHandle::IsSet());
101       EXPECT_EQ(task_runner_2, ThreadTaskRunnerHandle::Get());
102     }
103 
104     // Back to single override.
105     EXPECT_TRUE(ThreadTaskRunnerHandle::IsSet());
106     EXPECT_EQ(task_runner_1, ThreadTaskRunnerHandle::Get());
107   }
108   EXPECT_FALSE(ThreadTaskRunnerHandle::IsSet());
109 }
110 
TEST(ThreadTaskRunnerHandleTest,DeathOnTTRHOverOverride)111 TEST(ThreadTaskRunnerHandleTest, DeathOnTTRHOverOverride) {
112   scoped_refptr<SingleThreadTaskRunner> task_runner(new TestSimpleTaskRunner);
113   scoped_refptr<SingleThreadTaskRunner> overidding_task_runner(
114       new TestSimpleTaskRunner);
115 
116   ScopedClosureRunner undo_override =
117       ThreadTaskRunnerHandle::OverrideForTesting(task_runner);
118   EXPECT_DCHECK_DEATH(
119       { ThreadTaskRunnerHandle overriding_ttrh(overidding_task_runner); });
120 }
121 
122 }  // namespace base
123