Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(19)

Side by Side Diff: base/threading/thread_checker_unittest.cc

Issue 2213263002: Make ThreadChecker::CalledOnValidThread() return true when called from the same task. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: similarity Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 <memory> 5 #include <memory>
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/bind_helpers.h" 8 #include "base/bind_helpers.h"
9 #include "base/macros.h" 9 #include "base/macros.h"
10 #include "base/memory/ref_counted.h" 10 #include "base/memory/ref_counted.h"
11 #include "base/sequence_token.h" 11 #include "base/sequence_and_task_token.h"
12 #include "base/test/test_simple_task_runner.h" 12 #include "base/test/test_simple_task_runner.h"
13 #include "base/threading/simple_thread.h" 13 #include "base/threading/simple_thread.h"
14 #include "base/threading/thread_checker_impl.h" 14 #include "base/threading/thread_checker_impl.h"
15 #include "base/threading/thread_task_runner_handle.h" 15 #include "base/threading/thread_task_runner_handle.h"
16 #include "testing/gtest/include/gtest/gtest.h" 16 #include "testing/gtest/include/gtest/gtest.h"
17 17
18 namespace base { 18 namespace base {
19 namespace { 19 namespace {
20 20
21 // A thread that runs a callback. 21 // A thread that runs a callback.
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
55 void ExpectNotCalledOnValidThread(ThreadCheckerImpl* thread_checker) { 55 void ExpectNotCalledOnValidThread(ThreadCheckerImpl* thread_checker) {
56 ASSERT_TRUE(thread_checker); 56 ASSERT_TRUE(thread_checker);
57 EXPECT_FALSE(thread_checker->CalledOnValidThread()); 57 EXPECT_FALSE(thread_checker->CalledOnValidThread());
58 } 58 }
59 59
60 void ExpectNotCalledOnValidThreadWithSequenceTokenAndThreadTaskRunnerHandle( 60 void ExpectNotCalledOnValidThreadWithSequenceTokenAndThreadTaskRunnerHandle(
61 ThreadCheckerImpl* thread_checker, 61 ThreadCheckerImpl* thread_checker,
62 SequenceToken sequence_token) { 62 SequenceToken sequence_token) {
63 ThreadTaskRunnerHandle thread_task_runner_handle( 63 ThreadTaskRunnerHandle thread_task_runner_handle(
64 make_scoped_refptr(new TestSimpleTaskRunner)); 64 make_scoped_refptr(new TestSimpleTaskRunner));
65 ScopedSetSequenceTokenForCurrentThread 65 ScopedSetSequenceAndTaskTokenForCurrentThread
66 scoped_set_sequence_token_for_current_thread(sequence_token); 66 scoped_set_sequence_and_task_token_for_current_thread(sequence_token);
67 ExpectNotCalledOnValidThread(thread_checker); 67 ExpectNotCalledOnValidThread(thread_checker);
68 } 68 }
69 69
70 } // namespace 70 } // namespace
71 71
72 TEST(ThreadCheckerTest, CallsAllowedSameThreadNoSequenceToken) { 72 TEST(ThreadCheckerTest, AllowedSameThreadNoSequenceToken) {
73 ThreadCheckerImpl thread_checker; 73 ThreadCheckerImpl thread_checker;
74 EXPECT_TRUE(thread_checker.CalledOnValidThread()); 74 EXPECT_TRUE(thread_checker.CalledOnValidThread());
75 } 75 }
76 76
77 TEST(ThreadCheckerTest, 77 TEST(ThreadCheckerTest,
78 CallsAllowedSameThreadSameSequenceTokenWithThreadTaskRunnerHandle) { 78 AllowedSameThreadAndSequenceDifferentTasksWithThreadTaskRunnerHandle) {
79 ThreadTaskRunnerHandle thread_task_runner_handle( 79 ThreadTaskRunnerHandle thread_task_runner_handle(
80 make_scoped_refptr(new TestSimpleTaskRunner)); 80 make_scoped_refptr(new TestSimpleTaskRunner));
81 ScopedSetSequenceTokenForCurrentThread 81
82 scoped_set_sequence_token_for_current_thread(SequenceToken::Create()); 82 std::unique_ptr<ThreadCheckerImpl> thread_checker;
83 const SequenceToken sequence_token = SequenceToken::Create();
84
85 {
86 ScopedSetSequenceAndTaskTokenForCurrentThread
87 scoped_set_sequence_and_task_token_for_current_thread(sequence_token);
88 thread_checker.reset(new ThreadCheckerImpl);
89 }
90
91 {
92 ScopedSetSequenceAndTaskTokenForCurrentThread
93 scoped_set_sequence_and_task_token_for_current_thread(sequence_token);
94 EXPECT_TRUE(thread_checker->CalledOnValidThread());
95 }
96 }
97
98 TEST(ThreadCheckerTest,
99 AllowedSameThreadSequenceAndTaskNoThreadTaskRunnerHandle) {
100 ScopedSetSequenceAndTaskTokenForCurrentThread
101 scoped_set_sequence_and_task_token_for_current_thread(
102 SequenceToken::Create());
83 ThreadCheckerImpl thread_checker; 103 ThreadCheckerImpl thread_checker;
84 EXPECT_TRUE(thread_checker.CalledOnValidThread()); 104 EXPECT_TRUE(thread_checker.CalledOnValidThread());
85 } 105 }
86 106
87 TEST(ThreadCheckerTest, 107 TEST(ThreadCheckerTest,
88 CallsDisallowedSameThreadSameSequenceTokenNoThreadTaskRunnerHandle) { 108 DisallowedSameThreadAndSequenceDifferentTasksNoThreadTaskRunnerHandle) {
89 ScopedSetSequenceTokenForCurrentThread 109 std::unique_ptr<ThreadCheckerImpl> thread_checker;
90 scoped_set_sequence_token_for_current_thread(SequenceToken::Create()); 110
91 ThreadCheckerImpl thread_checker; 111 {
92 EXPECT_FALSE(thread_checker.CalledOnValidThread()); 112 ScopedSetSequenceAndTaskTokenForCurrentThread
113 scoped_set_sequence_and_task_token_for_current_thread(
114 SequenceToken::Create());
115 thread_checker.reset(new ThreadCheckerImpl);
116 }
117
118 {
119 ScopedSetSequenceAndTaskTokenForCurrentThread
120 scoped_set_sequence_and_task_token_for_current_thread(
121 SequenceToken::Create());
122 EXPECT_FALSE(thread_checker->CalledOnValidThread());
123 }
93 } 124 }
94 125
95 TEST(ThreadCheckerTest, CallsDisallowedOnDifferentThreadsNoSequenceToken) { 126 TEST(ThreadCheckerTest, DisallowedDifferentThreadsNoSequenceToken) {
96 ThreadCheckerImpl thread_checker; 127 ThreadCheckerImpl thread_checker;
97 RunCallbackOnNewThreadSynchronously( 128 RunCallbackOnNewThreadSynchronously(
98 Bind(&ExpectNotCalledOnValidThread, Unretained(&thread_checker))); 129 Bind(&ExpectNotCalledOnValidThread, Unretained(&thread_checker)));
99 } 130 }
100 131
101 TEST(ThreadCheckerTest, CallsDisallowedOnDifferentThreadsSameSequenceToken) { 132 TEST(ThreadCheckerTest, DisallowedDifferentThreadsSameSequence) {
102 ThreadTaskRunnerHandle thread_task_runner_handle( 133 ThreadTaskRunnerHandle thread_task_runner_handle(
103 make_scoped_refptr(new TestSimpleTaskRunner)); 134 make_scoped_refptr(new TestSimpleTaskRunner));
104 const SequenceToken sequence_token(SequenceToken::Create()); 135 const SequenceToken sequence_token(SequenceToken::Create());
105 136
106 ScopedSetSequenceTokenForCurrentThread 137 ScopedSetSequenceAndTaskTokenForCurrentThread
107 scoped_set_sequence_token_for_current_thread(sequence_token); 138 scoped_set_sequence_and_task_token_for_current_thread(sequence_token);
108 ThreadCheckerImpl thread_checker; 139 ThreadCheckerImpl thread_checker;
109 EXPECT_TRUE(thread_checker.CalledOnValidThread()); 140 EXPECT_TRUE(thread_checker.CalledOnValidThread());
110 141
111 RunCallbackOnNewThreadSynchronously(Bind( 142 RunCallbackOnNewThreadSynchronously(Bind(
112 &ExpectNotCalledOnValidThreadWithSequenceTokenAndThreadTaskRunnerHandle, 143 &ExpectNotCalledOnValidThreadWithSequenceTokenAndThreadTaskRunnerHandle,
113 Unretained(&thread_checker), sequence_token)); 144 Unretained(&thread_checker), sequence_token));
114 } 145 }
115 146
116 TEST(ThreadCheckerTest, CallsDisallowedSameThreadDifferentSequenceToken) { 147 TEST(ThreadCheckerTest, DisallowedSameThreadDifferentSequence) {
117 std::unique_ptr<ThreadCheckerImpl> thread_checker; 148 std::unique_ptr<ThreadCheckerImpl> thread_checker;
118 149
119 ThreadTaskRunnerHandle thread_task_runner_handle( 150 ThreadTaskRunnerHandle thread_task_runner_handle(
120 make_scoped_refptr(new TestSimpleTaskRunner)); 151 make_scoped_refptr(new TestSimpleTaskRunner));
121 152
122 { 153 {
123 ScopedSetSequenceTokenForCurrentThread 154 ScopedSetSequenceAndTaskTokenForCurrentThread
124 scoped_set_sequence_token_for_current_thread(SequenceToken::Create()); 155 scoped_set_sequence_and_task_token_for_current_thread(
156 SequenceToken::Create());
125 thread_checker.reset(new ThreadCheckerImpl); 157 thread_checker.reset(new ThreadCheckerImpl);
126 } 158 }
127 159
128 { 160 {
129 // Different SequenceToken. 161 // Different SequenceToken.
130 ScopedSetSequenceTokenForCurrentThread 162 ScopedSetSequenceAndTaskTokenForCurrentThread
131 scoped_set_sequence_token_for_current_thread(SequenceToken::Create()); 163 scoped_set_sequence_and_task_token_for_current_thread(
164 SequenceToken::Create());
132 EXPECT_FALSE(thread_checker->CalledOnValidThread()); 165 EXPECT_FALSE(thread_checker->CalledOnValidThread());
133 } 166 }
134 167
135 // No SequenceToken. 168 // No SequenceToken.
136 EXPECT_FALSE(thread_checker->CalledOnValidThread()); 169 EXPECT_FALSE(thread_checker->CalledOnValidThread());
137 } 170 }
138 171
139 TEST(ThreadCheckerTest, DetachFromThread) { 172 TEST(ThreadCheckerTest, DetachFromThread) {
140 ThreadCheckerImpl thread_checker; 173 ThreadCheckerImpl thread_checker;
141 thread_checker.DetachFromThread(); 174 thread_checker.DetachFromThread();
142 175
143 // Verify that CalledOnValidThread() returns true when called on a different 176 // Verify that CalledOnValidThread() returns true when called on a different
144 // thread after a call to DetachFromThread(). 177 // thread after a call to DetachFromThread().
145 RunCallbackOnNewThreadSynchronously( 178 RunCallbackOnNewThreadSynchronously(
146 Bind(&ExpectCalledOnValidThread, Unretained(&thread_checker))); 179 Bind(&ExpectCalledOnValidThread, Unretained(&thread_checker)));
147 180
148 EXPECT_FALSE(thread_checker.CalledOnValidThread()); 181 EXPECT_FALSE(thread_checker.CalledOnValidThread());
149 } 182 }
150 183
151 TEST(ThreadCheckerTest, DetachFromThreadWithSequenceToken) { 184 TEST(ThreadCheckerTest, DetachFromThreadWithSequenceToken) {
152 ThreadTaskRunnerHandle thread_task_runner_handle( 185 ThreadTaskRunnerHandle thread_task_runner_handle(
153 make_scoped_refptr(new TestSimpleTaskRunner)); 186 make_scoped_refptr(new TestSimpleTaskRunner));
154 ScopedSetSequenceTokenForCurrentThread 187 ScopedSetSequenceAndTaskTokenForCurrentThread
155 scoped_set_sequence_token_for_current_thread(SequenceToken::Create()); 188 scoped_set_sequence_and_task_token_for_current_thread(
189 SequenceToken::Create());
156 ThreadCheckerImpl thread_checker; 190 ThreadCheckerImpl thread_checker;
157 thread_checker.DetachFromThread(); 191 thread_checker.DetachFromThread();
158 192
159 // Verify that CalledOnValidThread() returns true when called on a different 193 // Verify that CalledOnValidThread() returns true when called on a different
160 // thread after a call to DetachFromThread(). 194 // thread after a call to DetachFromThread().
161 RunCallbackOnNewThreadSynchronously( 195 RunCallbackOnNewThreadSynchronously(
162 Bind(&ExpectCalledOnValidThread, Unretained(&thread_checker))); 196 Bind(&ExpectCalledOnValidThread, Unretained(&thread_checker)));
163 197
164 EXPECT_FALSE(thread_checker.CalledOnValidThread()); 198 EXPECT_FALSE(thread_checker.CalledOnValidThread());
165 } 199 }
166 200
167 } // namespace base 201 } // namespace base
OLDNEW
« base/threading/thread_checker_impl.h ('K') | « base/threading/thread_checker_impl.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698