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

Side by Side Diff: base/sequence_checker_unittest.cc

Issue 1852433005: Convert //base to use std::unique_ptr (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase after r384946 Created 4 years, 8 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
« no previous file with comments | « base/security_unittest.cc ('k') | base/strings/safe_sprintf_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 "base/sequence_checker.h" 5 #include "base/sequence_checker.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <memory>
9 #include <utility> 10 #include <utility>
10 11
11 #include "base/bind.h" 12 #include "base/bind.h"
12 #include "base/bind_helpers.h" 13 #include "base/bind_helpers.h"
13 #include "base/location.h" 14 #include "base/location.h"
14 #include "base/logging.h" 15 #include "base/logging.h"
15 #include "base/macros.h" 16 #include "base/macros.h"
16 #include "base/memory/ref_counted.h" 17 #include "base/memory/ref_counted.h"
17 #include "base/memory/scoped_ptr.h"
18 #include "base/single_thread_task_runner.h" 18 #include "base/single_thread_task_runner.h"
19 #include "base/test/sequenced_worker_pool_owner.h" 19 #include "base/test/sequenced_worker_pool_owner.h"
20 #include "base/threading/thread.h" 20 #include "base/threading/thread.h"
21 #include "testing/gtest/include/gtest/gtest.h" 21 #include "testing/gtest/include/gtest/gtest.h"
22 22
23 // Duplicated from base/sequence_checker.h so that we can be good citizens 23 // Duplicated from base/sequence_checker.h so that we can be good citizens
24 // there and undef the macro. 24 // there and undef the macro.
25 #if (!defined(NDEBUG) || defined(DCHECK_ALWAYS_ON)) 25 #if (!defined(NDEBUG) || defined(DCHECK_ALWAYS_ON))
26 #define ENABLE_SEQUENCE_CHECKER 1 26 #define ENABLE_SEQUENCE_CHECKER 1
27 #else 27 #else
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
87 } 87 }
88 88
89 void PostDoStuffToOtherThread( 89 void PostDoStuffToOtherThread(
90 SequenceCheckedObject* sequence_checked_object) { 90 SequenceCheckedObject* sequence_checked_object) {
91 other_thread()->task_runner()->PostTask( 91 other_thread()->task_runner()->PostTask(
92 FROM_HERE, base::Bind(&SequenceCheckedObject::DoStuff, 92 FROM_HERE, base::Bind(&SequenceCheckedObject::DoStuff,
93 base::Unretained(sequence_checked_object))); 93 base::Unretained(sequence_checked_object)));
94 } 94 }
95 95
96 void PostDeleteToOtherThread( 96 void PostDeleteToOtherThread(
97 scoped_ptr<SequenceCheckedObject> sequence_checked_object) { 97 std::unique_ptr<SequenceCheckedObject> sequence_checked_object) {
98 other_thread()->message_loop()->DeleteSoon( 98 other_thread()->message_loop()->DeleteSoon(
99 FROM_HERE, 99 FROM_HERE,
100 sequence_checked_object.release()); 100 sequence_checked_object.release());
101 } 101 }
102 102
103 // Destroys the SequencedWorkerPool instance, blocking until it is fully shut 103 // Destroys the SequencedWorkerPool instance, blocking until it is fully shut
104 // down, and creates a new instance. 104 // down, and creates a new instance.
105 void ResetPool() { 105 void ResetPool() {
106 pool_owner_.reset(new SequencedWorkerPoolOwner(kNumWorkerThreads, "test")); 106 pool_owner_.reset(new SequencedWorkerPoolOwner(kNumWorkerThreads, "test"));
107 } 107 }
108 108
109 void MethodOnDifferentThreadDeathTest(); 109 void MethodOnDifferentThreadDeathTest();
110 void DetachThenCallFromDifferentThreadDeathTest(); 110 void DetachThenCallFromDifferentThreadDeathTest();
111 void DifferentSequenceTokensDeathTest(); 111 void DifferentSequenceTokensDeathTest();
112 void WorkerPoolAndSimpleThreadDeathTest(); 112 void WorkerPoolAndSimpleThreadDeathTest();
113 void TwoDifferentWorkerPoolsDeathTest(); 113 void TwoDifferentWorkerPoolsDeathTest();
114 114
115 private: 115 private:
116 MessageLoop message_loop_; // Needed by SequencedWorkerPool to function. 116 MessageLoop message_loop_; // Needed by SequencedWorkerPool to function.
117 base::Thread other_thread_; 117 base::Thread other_thread_;
118 scoped_ptr<SequencedWorkerPoolOwner> pool_owner_; 118 std::unique_ptr<SequencedWorkerPoolOwner> pool_owner_;
119 }; 119 };
120 120
121 TEST_F(SequenceCheckerTest, CallsAllowedOnSameThread) { 121 TEST_F(SequenceCheckerTest, CallsAllowedOnSameThread) {
122 scoped_ptr<SequenceCheckedObject> sequence_checked_object( 122 std::unique_ptr<SequenceCheckedObject> sequence_checked_object(
123 new SequenceCheckedObject); 123 new SequenceCheckedObject);
124 124
125 // Verify that DoStuff doesn't assert. 125 // Verify that DoStuff doesn't assert.
126 sequence_checked_object->DoStuff(); 126 sequence_checked_object->DoStuff();
127 127
128 // Verify that the destructor doesn't assert. 128 // Verify that the destructor doesn't assert.
129 sequence_checked_object.reset(); 129 sequence_checked_object.reset();
130 } 130 }
131 131
132 TEST_F(SequenceCheckerTest, DestructorAllowedOnDifferentThread) { 132 TEST_F(SequenceCheckerTest, DestructorAllowedOnDifferentThread) {
133 scoped_ptr<SequenceCheckedObject> sequence_checked_object( 133 std::unique_ptr<SequenceCheckedObject> sequence_checked_object(
134 new SequenceCheckedObject); 134 new SequenceCheckedObject);
135 135
136 // Verify the destructor doesn't assert when called on a different thread. 136 // Verify the destructor doesn't assert when called on a different thread.
137 PostDeleteToOtherThread(std::move(sequence_checked_object)); 137 PostDeleteToOtherThread(std::move(sequence_checked_object));
138 other_thread()->Stop(); 138 other_thread()->Stop();
139 } 139 }
140 140
141 TEST_F(SequenceCheckerTest, DetachFromSequence) { 141 TEST_F(SequenceCheckerTest, DetachFromSequence) {
142 scoped_ptr<SequenceCheckedObject> sequence_checked_object( 142 std::unique_ptr<SequenceCheckedObject> sequence_checked_object(
143 new SequenceCheckedObject); 143 new SequenceCheckedObject);
144 144
145 // Verify that DoStuff doesn't assert when called on a different thread after 145 // Verify that DoStuff doesn't assert when called on a different thread after
146 // a call to DetachFromSequence. 146 // a call to DetachFromSequence.
147 sequence_checked_object->DetachFromSequence(); 147 sequence_checked_object->DetachFromSequence();
148 148
149 PostDoStuffToOtherThread(sequence_checked_object.get()); 149 PostDoStuffToOtherThread(sequence_checked_object.get());
150 other_thread()->Stop(); 150 other_thread()->Stop();
151 } 151 }
152 152
153 TEST_F(SequenceCheckerTest, SameSequenceTokenValid) { 153 TEST_F(SequenceCheckerTest, SameSequenceTokenValid) {
154 scoped_ptr<SequenceCheckedObject> sequence_checked_object( 154 std::unique_ptr<SequenceCheckedObject> sequence_checked_object(
155 new SequenceCheckedObject); 155 new SequenceCheckedObject);
156 156
157 sequence_checked_object->DetachFromSequence(); 157 sequence_checked_object->DetachFromSequence();
158 PostDoStuffToWorkerPool(sequence_checked_object.get(), "A"); 158 PostDoStuffToWorkerPool(sequence_checked_object.get(), "A");
159 PostDoStuffToWorkerPool(sequence_checked_object.get(), "A"); 159 PostDoStuffToWorkerPool(sequence_checked_object.get(), "A");
160 PostDoStuffToWorkerPool(sequence_checked_object.get(), "A"); 160 PostDoStuffToWorkerPool(sequence_checked_object.get(), "A");
161 PostDoStuffToWorkerPool(sequence_checked_object.get(), "A"); 161 PostDoStuffToWorkerPool(sequence_checked_object.get(), "A");
162 pool()->FlushForTesting(); 162 pool()->FlushForTesting();
163 163
164 PostDeleteToOtherThread(std::move(sequence_checked_object)); 164 PostDeleteToOtherThread(std::move(sequence_checked_object));
165 other_thread()->Stop(); 165 other_thread()->Stop();
166 } 166 }
167 167
168 TEST_F(SequenceCheckerTest, DetachSequenceTokenValid) { 168 TEST_F(SequenceCheckerTest, DetachSequenceTokenValid) {
169 scoped_ptr<SequenceCheckedObject> sequence_checked_object( 169 std::unique_ptr<SequenceCheckedObject> sequence_checked_object(
170 new SequenceCheckedObject); 170 new SequenceCheckedObject);
171 171
172 sequence_checked_object->DetachFromSequence(); 172 sequence_checked_object->DetachFromSequence();
173 PostDoStuffToWorkerPool(sequence_checked_object.get(), "A"); 173 PostDoStuffToWorkerPool(sequence_checked_object.get(), "A");
174 PostDoStuffToWorkerPool(sequence_checked_object.get(), "A"); 174 PostDoStuffToWorkerPool(sequence_checked_object.get(), "A");
175 pool()->FlushForTesting(); 175 pool()->FlushForTesting();
176 176
177 sequence_checked_object->DetachFromSequence(); 177 sequence_checked_object->DetachFromSequence();
178 PostDoStuffToWorkerPool(sequence_checked_object.get(), "B"); 178 PostDoStuffToWorkerPool(sequence_checked_object.get(), "B");
179 PostDoStuffToWorkerPool(sequence_checked_object.get(), "B"); 179 PostDoStuffToWorkerPool(sequence_checked_object.get(), "B");
180 pool()->FlushForTesting(); 180 pool()->FlushForTesting();
181 181
182 PostDeleteToOtherThread(std::move(sequence_checked_object)); 182 PostDeleteToOtherThread(std::move(sequence_checked_object));
183 other_thread()->Stop(); 183 other_thread()->Stop();
184 } 184 }
185 185
186 #if GTEST_HAS_DEATH_TEST || !ENABLE_SEQUENCE_CHECKER 186 #if GTEST_HAS_DEATH_TEST || !ENABLE_SEQUENCE_CHECKER
187 187
188 void SequenceCheckerTest::MethodOnDifferentThreadDeathTest() { 188 void SequenceCheckerTest::MethodOnDifferentThreadDeathTest() {
189 scoped_ptr<SequenceCheckedObject> sequence_checked_object( 189 std::unique_ptr<SequenceCheckedObject> sequence_checked_object(
190 new SequenceCheckedObject); 190 new SequenceCheckedObject);
191 191
192 // DoStuff should assert in debug builds only when called on a 192 // DoStuff should assert in debug builds only when called on a
193 // different thread. 193 // different thread.
194 PostDoStuffToOtherThread(sequence_checked_object.get()); 194 PostDoStuffToOtherThread(sequence_checked_object.get());
195 other_thread()->Stop(); 195 other_thread()->Stop();
196 } 196 }
197 197
198 #if ENABLE_SEQUENCE_CHECKER 198 #if ENABLE_SEQUENCE_CHECKER
199 TEST_F(SequenceCheckerTest, MethodNotAllowedOnDifferentThreadDeathTestInDebug) { 199 TEST_F(SequenceCheckerTest, MethodNotAllowedOnDifferentThreadDeathTestInDebug) {
200 // The default style "fast" does not support multi-threaded tests. 200 // The default style "fast" does not support multi-threaded tests.
201 ::testing::FLAGS_gtest_death_test_style = "threadsafe"; 201 ::testing::FLAGS_gtest_death_test_style = "threadsafe";
202 ASSERT_DEATH({ 202 ASSERT_DEATH({
203 MethodOnDifferentThreadDeathTest(); 203 MethodOnDifferentThreadDeathTest();
204 }, ""); 204 }, "");
205 } 205 }
206 #else 206 #else
207 TEST_F(SequenceCheckerTest, MethodAllowedOnDifferentThreadDeathTestInRelease) { 207 TEST_F(SequenceCheckerTest, MethodAllowedOnDifferentThreadDeathTestInRelease) {
208 MethodOnDifferentThreadDeathTest(); 208 MethodOnDifferentThreadDeathTest();
209 } 209 }
210 #endif // ENABLE_SEQUENCE_CHECKER 210 #endif // ENABLE_SEQUENCE_CHECKER
211 211
212 void SequenceCheckerTest::DetachThenCallFromDifferentThreadDeathTest() { 212 void SequenceCheckerTest::DetachThenCallFromDifferentThreadDeathTest() {
213 scoped_ptr<SequenceCheckedObject> sequence_checked_object( 213 std::unique_ptr<SequenceCheckedObject> sequence_checked_object(
214 new SequenceCheckedObject); 214 new SequenceCheckedObject);
215 215
216 // DoStuff doesn't assert when called on a different thread 216 // DoStuff doesn't assert when called on a different thread
217 // after a call to DetachFromSequence. 217 // after a call to DetachFromSequence.
218 sequence_checked_object->DetachFromSequence(); 218 sequence_checked_object->DetachFromSequence();
219 PostDoStuffToOtherThread(sequence_checked_object.get()); 219 PostDoStuffToOtherThread(sequence_checked_object.get());
220 other_thread()->Stop(); 220 other_thread()->Stop();
221 221
222 // DoStuff should assert in debug builds only after moving to 222 // DoStuff should assert in debug builds only after moving to
223 // another thread. 223 // another thread.
224 sequence_checked_object->DoStuff(); 224 sequence_checked_object->DoStuff();
225 } 225 }
226 226
227 #if ENABLE_SEQUENCE_CHECKER 227 #if ENABLE_SEQUENCE_CHECKER
228 TEST_F(SequenceCheckerTest, DetachFromSequenceDeathTestInDebug) { 228 TEST_F(SequenceCheckerTest, DetachFromSequenceDeathTestInDebug) {
229 // The default style "fast" does not support multi-threaded tests. 229 // The default style "fast" does not support multi-threaded tests.
230 ::testing::FLAGS_gtest_death_test_style = "threadsafe"; 230 ::testing::FLAGS_gtest_death_test_style = "threadsafe";
231 ASSERT_DEATH({ 231 ASSERT_DEATH({
232 DetachThenCallFromDifferentThreadDeathTest(); 232 DetachThenCallFromDifferentThreadDeathTest();
233 }, ""); 233 }, "");
234 } 234 }
235 #else 235 #else
236 TEST_F(SequenceCheckerTest, DetachFromThreadDeathTestInRelease) { 236 TEST_F(SequenceCheckerTest, DetachFromThreadDeathTestInRelease) {
237 DetachThenCallFromDifferentThreadDeathTest(); 237 DetachThenCallFromDifferentThreadDeathTest();
238 } 238 }
239 #endif // ENABLE_SEQUENCE_CHECKER 239 #endif // ENABLE_SEQUENCE_CHECKER
240 240
241 void SequenceCheckerTest::DifferentSequenceTokensDeathTest() { 241 void SequenceCheckerTest::DifferentSequenceTokensDeathTest() {
242 scoped_ptr<SequenceCheckedObject> sequence_checked_object( 242 std::unique_ptr<SequenceCheckedObject> sequence_checked_object(
243 new SequenceCheckedObject); 243 new SequenceCheckedObject);
244 244
245 sequence_checked_object->DetachFromSequence(); 245 sequence_checked_object->DetachFromSequence();
246 PostDoStuffToWorkerPool(sequence_checked_object.get(), "A"); 246 PostDoStuffToWorkerPool(sequence_checked_object.get(), "A");
247 PostDoStuffToWorkerPool(sequence_checked_object.get(), "A"); 247 PostDoStuffToWorkerPool(sequence_checked_object.get(), "A");
248 PostDoStuffToWorkerPool(sequence_checked_object.get(), "B"); 248 PostDoStuffToWorkerPool(sequence_checked_object.get(), "B");
249 PostDoStuffToWorkerPool(sequence_checked_object.get(), "B"); 249 PostDoStuffToWorkerPool(sequence_checked_object.get(), "B");
250 pool()->FlushForTesting(); 250 pool()->FlushForTesting();
251 251
252 PostDeleteToOtherThread(std::move(sequence_checked_object)); 252 PostDeleteToOtherThread(std::move(sequence_checked_object));
253 other_thread()->Stop(); 253 other_thread()->Stop();
254 } 254 }
255 255
256 #if ENABLE_SEQUENCE_CHECKER 256 #if ENABLE_SEQUENCE_CHECKER
257 TEST_F(SequenceCheckerTest, DifferentSequenceTokensDeathTestInDebug) { 257 TEST_F(SequenceCheckerTest, DifferentSequenceTokensDeathTestInDebug) {
258 // The default style "fast" does not support multi-threaded tests. 258 // The default style "fast" does not support multi-threaded tests.
259 ::testing::FLAGS_gtest_death_test_style = "threadsafe"; 259 ::testing::FLAGS_gtest_death_test_style = "threadsafe";
260 ASSERT_DEATH({ 260 ASSERT_DEATH({
261 DifferentSequenceTokensDeathTest(); 261 DifferentSequenceTokensDeathTest();
262 }, ""); 262 }, "");
263 } 263 }
264 #else 264 #else
265 TEST_F(SequenceCheckerTest, DifferentSequenceTokensDeathTestInRelease) { 265 TEST_F(SequenceCheckerTest, DifferentSequenceTokensDeathTestInRelease) {
266 DifferentSequenceTokensDeathTest(); 266 DifferentSequenceTokensDeathTest();
267 } 267 }
268 #endif // ENABLE_SEQUENCE_CHECKER 268 #endif // ENABLE_SEQUENCE_CHECKER
269 269
270 void SequenceCheckerTest::WorkerPoolAndSimpleThreadDeathTest() { 270 void SequenceCheckerTest::WorkerPoolAndSimpleThreadDeathTest() {
271 scoped_ptr<SequenceCheckedObject> sequence_checked_object( 271 std::unique_ptr<SequenceCheckedObject> sequence_checked_object(
272 new SequenceCheckedObject); 272 new SequenceCheckedObject);
273 273
274 sequence_checked_object->DetachFromSequence(); 274 sequence_checked_object->DetachFromSequence();
275 PostDoStuffToWorkerPool(sequence_checked_object.get(), "A"); 275 PostDoStuffToWorkerPool(sequence_checked_object.get(), "A");
276 PostDoStuffToWorkerPool(sequence_checked_object.get(), "A"); 276 PostDoStuffToWorkerPool(sequence_checked_object.get(), "A");
277 pool()->FlushForTesting(); 277 pool()->FlushForTesting();
278 278
279 PostDoStuffToOtherThread(sequence_checked_object.get()); 279 PostDoStuffToOtherThread(sequence_checked_object.get());
280 other_thread()->Stop(); 280 other_thread()->Stop();
281 } 281 }
282 282
283 #if ENABLE_SEQUENCE_CHECKER 283 #if ENABLE_SEQUENCE_CHECKER
284 TEST_F(SequenceCheckerTest, WorkerPoolAndSimpleThreadDeathTestInDebug) { 284 TEST_F(SequenceCheckerTest, WorkerPoolAndSimpleThreadDeathTestInDebug) {
285 // The default style "fast" does not support multi-threaded tests. 285 // The default style "fast" does not support multi-threaded tests.
286 ::testing::FLAGS_gtest_death_test_style = "threadsafe"; 286 ::testing::FLAGS_gtest_death_test_style = "threadsafe";
287 ASSERT_DEATH({ 287 ASSERT_DEATH({
288 WorkerPoolAndSimpleThreadDeathTest(); 288 WorkerPoolAndSimpleThreadDeathTest();
289 }, ""); 289 }, "");
290 } 290 }
291 #else 291 #else
292 TEST_F(SequenceCheckerTest, WorkerPoolAndSimpleThreadDeathTestInRelease) { 292 TEST_F(SequenceCheckerTest, WorkerPoolAndSimpleThreadDeathTestInRelease) {
293 WorkerPoolAndSimpleThreadDeathTest(); 293 WorkerPoolAndSimpleThreadDeathTest();
294 } 294 }
295 #endif // ENABLE_SEQUENCE_CHECKER 295 #endif // ENABLE_SEQUENCE_CHECKER
296 296
297 void SequenceCheckerTest::TwoDifferentWorkerPoolsDeathTest() { 297 void SequenceCheckerTest::TwoDifferentWorkerPoolsDeathTest() {
298 scoped_ptr<SequenceCheckedObject> sequence_checked_object( 298 std::unique_ptr<SequenceCheckedObject> sequence_checked_object(
299 new SequenceCheckedObject); 299 new SequenceCheckedObject);
300 300
301 sequence_checked_object->DetachFromSequence(); 301 sequence_checked_object->DetachFromSequence();
302 PostDoStuffToWorkerPool(sequence_checked_object.get(), "A"); 302 PostDoStuffToWorkerPool(sequence_checked_object.get(), "A");
303 PostDoStuffToWorkerPool(sequence_checked_object.get(), "A"); 303 PostDoStuffToWorkerPool(sequence_checked_object.get(), "A");
304 pool()->FlushForTesting(); 304 pool()->FlushForTesting();
305 305
306 SequencedWorkerPoolOwner second_pool_owner(kNumWorkerThreads, "test2"); 306 SequencedWorkerPoolOwner second_pool_owner(kNumWorkerThreads, "test2");
307 second_pool_owner.pool()->PostNamedSequencedWorkerTask( 307 second_pool_owner.pool()->PostNamedSequencedWorkerTask(
308 "A", 308 "A",
(...skipping 18 matching lines...) Expand all
327 #endif // ENABLE_SEQUENCE_CHECKER 327 #endif // ENABLE_SEQUENCE_CHECKER
328 328
329 #endif // GTEST_HAS_DEATH_TEST || !ENABLE_SEQUENCE_CHECKER 329 #endif // GTEST_HAS_DEATH_TEST || !ENABLE_SEQUENCE_CHECKER
330 330
331 } // namespace 331 } // namespace
332 332
333 } // namespace base 333 } // namespace base
334 334
335 // Just in case we ever get lumped together with other compilation units. 335 // Just in case we ever get lumped together with other compilation units.
336 #undef ENABLE_SEQUENCE_CHECKER 336 #undef ENABLE_SEQUENCE_CHECKER
OLDNEW
« no previous file with comments | « base/security_unittest.cc ('k') | base/strings/safe_sprintf_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698