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

Side by Side Diff: base/sequence_checker_unittest.cc

Issue 19617002: base: Make SequenceChecker death tests multi-threads work correctly. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 7 years, 5 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 | « no previous file | tools/valgrind/gtest_exclude/base_unittests.gtest.txt » ('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/basictypes.h" 5 #include "base/basictypes.h"
6 #include "base/bind.h" 6 #include "base/bind.h"
7 #include "base/bind_helpers.h" 7 #include "base/bind_helpers.h"
8 #include "base/location.h" 8 #include "base/location.h"
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/memory/ref_counted.h" 10 #include "base/memory/ref_counted.h"
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after
189 new SequenceCheckedObject); 189 new SequenceCheckedObject);
190 190
191 // DoStuff should assert in debug builds only when called on a 191 // DoStuff should assert in debug builds only when called on a
192 // different thread. 192 // different thread.
193 PostDoStuffToOtherThread(sequence_checked_object.get()); 193 PostDoStuffToOtherThread(sequence_checked_object.get());
194 other_thread()->Stop(); 194 other_thread()->Stop();
195 } 195 }
196 196
197 #if ENABLE_SEQUENCE_CHECKER 197 #if ENABLE_SEQUENCE_CHECKER
198 TEST_F(SequenceCheckerTest, MethodNotAllowedOnDifferentThreadDeathTestInDebug) { 198 TEST_F(SequenceCheckerTest, MethodNotAllowedOnDifferentThreadDeathTestInDebug) {
199 // The default style "fast" does not support multi-threaded tests.
200 ::testing::FLAGS_gtest_death_test_style = "threadsafe";
Reid Kleckner 2013/07/19 16:23:00 Do these get reset after each test?
tommycli 2013/07/19 16:59:57 Yes, reset after each test.
Timur Iskhodzhanov 2013/07/19 19:22:07 Why not put it into the fixture?
tommycli 2013/07/19 19:30:53 No technical reason why it can't be in fixture. Ju
199 ASSERT_DEATH({ 201 ASSERT_DEATH({
200 MethodOnDifferentThreadDeathTest(); 202 MethodOnDifferentThreadDeathTest();
201 }, ""); 203 }, "");
202 } 204 }
203 #else 205 #else
204 TEST_F(SequenceCheckerTest, MethodAllowedOnDifferentThreadDeathTestInRelease) { 206 TEST_F(SequenceCheckerTest, MethodAllowedOnDifferentThreadDeathTestInRelease) {
205 MethodOnDifferentThreadDeathTest(); 207 MethodOnDifferentThreadDeathTest();
206 } 208 }
207 #endif // ENABLE_SEQUENCE_CHECKER 209 #endif // ENABLE_SEQUENCE_CHECKER
208 210
209 void SequenceCheckerTest::DetachThenCallFromDifferentThreadDeathTest() { 211 void SequenceCheckerTest::DetachThenCallFromDifferentThreadDeathTest() {
210 scoped_ptr<SequenceCheckedObject> sequence_checked_object( 212 scoped_ptr<SequenceCheckedObject> sequence_checked_object(
211 new SequenceCheckedObject); 213 new SequenceCheckedObject);
212 214
213 // DoStuff doesn't assert when called on a different thread 215 // DoStuff doesn't assert when called on a different thread
214 // after a call to DetachFromSequence. 216 // after a call to DetachFromSequence.
215 sequence_checked_object->DetachFromSequence(); 217 sequence_checked_object->DetachFromSequence();
216 PostDoStuffToOtherThread(sequence_checked_object.get()); 218 PostDoStuffToOtherThread(sequence_checked_object.get());
217 other_thread()->Stop(); 219 other_thread()->Stop();
218 220
219 // DoStuff should assert in debug builds only after moving to 221 // DoStuff should assert in debug builds only after moving to
220 // another thread. 222 // another thread.
221 sequence_checked_object->DoStuff(); 223 sequence_checked_object->DoStuff();
222 } 224 }
223 225
224 #if ENABLE_SEQUENCE_CHECKER 226 #if ENABLE_SEQUENCE_CHECKER
225 TEST_F(SequenceCheckerTest, DetachFromSequenceDeathTestInDebug) { 227 TEST_F(SequenceCheckerTest, DetachFromSequenceDeathTestInDebug) {
228 // The default style "fast" does not support multi-threaded tests.
229 ::testing::FLAGS_gtest_death_test_style = "threadsafe";
226 ASSERT_DEATH({ 230 ASSERT_DEATH({
227 DetachThenCallFromDifferentThreadDeathTest(); 231 DetachThenCallFromDifferentThreadDeathTest();
228 }, ""); 232 }, "");
229 } 233 }
230 #else 234 #else
231 TEST_F(SequenceCheckerTest, DetachFromThreadDeathTestInRelease) { 235 TEST_F(SequenceCheckerTest, DetachFromThreadDeathTestInRelease) {
232 DetachThenCallFromDifferentThreadDeathTest(); 236 DetachThenCallFromDifferentThreadDeathTest();
233 } 237 }
234 #endif // ENABLE_SEQUENCE_CHECKER 238 #endif // ENABLE_SEQUENCE_CHECKER
235 239
236 void SequenceCheckerTest::DifferentSequenceTokensDeathTest() { 240 void SequenceCheckerTest::DifferentSequenceTokensDeathTest() {
237 scoped_ptr<SequenceCheckedObject> sequence_checked_object( 241 scoped_ptr<SequenceCheckedObject> sequence_checked_object(
238 new SequenceCheckedObject); 242 new SequenceCheckedObject);
239 243
240 sequence_checked_object->DetachFromSequence(); 244 sequence_checked_object->DetachFromSequence();
241 PostDoStuffToWorkerPool(sequence_checked_object.get(), "A"); 245 PostDoStuffToWorkerPool(sequence_checked_object.get(), "A");
242 PostDoStuffToWorkerPool(sequence_checked_object.get(), "A"); 246 PostDoStuffToWorkerPool(sequence_checked_object.get(), "A");
243 PostDoStuffToWorkerPool(sequence_checked_object.get(), "B"); 247 PostDoStuffToWorkerPool(sequence_checked_object.get(), "B");
244 PostDoStuffToWorkerPool(sequence_checked_object.get(), "B"); 248 PostDoStuffToWorkerPool(sequence_checked_object.get(), "B");
245 pool()->FlushForTesting(); 249 pool()->FlushForTesting();
246 250
247 PostDeleteToOtherThread(sequence_checked_object.Pass()); 251 PostDeleteToOtherThread(sequence_checked_object.Pass());
248 other_thread()->Stop(); 252 other_thread()->Stop();
249 } 253 }
250 254
251 #if ENABLE_SEQUENCE_CHECKER 255 #if ENABLE_SEQUENCE_CHECKER
252 TEST_F(SequenceCheckerTest, DifferentSequenceTokensDeathTestInDebug) { 256 TEST_F(SequenceCheckerTest, DifferentSequenceTokensDeathTestInDebug) {
257 // The default style "fast" does not support multi-threaded tests.
258 ::testing::FLAGS_gtest_death_test_style = "threadsafe";
253 ASSERT_DEATH({ 259 ASSERT_DEATH({
254 DifferentSequenceTokensDeathTest(); 260 DifferentSequenceTokensDeathTest();
255 }, ""); 261 }, "");
256 } 262 }
257 #else 263 #else
258 TEST_F(SequenceCheckerTest, 264 TEST_F(SequenceCheckerTest,
259 DifferentSequenceTokensDeathTestInRelease) { 265 DifferentSequenceTokensDeathTestInRelease) {
260 DifferentSequenceTokensDeathTest(); 266 DifferentSequenceTokensDeathTest();
261 } 267 }
262 #endif // ENABLE_SEQUENCE_CHECKER 268 #endif // ENABLE_SEQUENCE_CHECKER
263 269
264 void SequenceCheckerTest::WorkerPoolAndSimpleThreadDeathTest() { 270 void SequenceCheckerTest::WorkerPoolAndSimpleThreadDeathTest() {
265 scoped_ptr<SequenceCheckedObject> sequence_checked_object( 271 scoped_ptr<SequenceCheckedObject> sequence_checked_object(
266 new SequenceCheckedObject); 272 new SequenceCheckedObject);
267 273
268 sequence_checked_object->DetachFromSequence(); 274 sequence_checked_object->DetachFromSequence();
269 PostDoStuffToWorkerPool(sequence_checked_object.get(), "A"); 275 PostDoStuffToWorkerPool(sequence_checked_object.get(), "A");
270 PostDoStuffToWorkerPool(sequence_checked_object.get(), "A"); 276 PostDoStuffToWorkerPool(sequence_checked_object.get(), "A");
271 pool()->FlushForTesting(); 277 pool()->FlushForTesting();
272 278
273 PostDoStuffToOtherThread(sequence_checked_object.get()); 279 PostDoStuffToOtherThread(sequence_checked_object.get());
274 other_thread()->Stop(); 280 other_thread()->Stop();
275 } 281 }
276 282
277 #if ENABLE_SEQUENCE_CHECKER 283 #if ENABLE_SEQUENCE_CHECKER
278 TEST_F(SequenceCheckerTest, WorkerPoolAndSimpleThreadDeathTestInDebug) { 284 TEST_F(SequenceCheckerTest, WorkerPoolAndSimpleThreadDeathTestInDebug) {
285 // The default style "fast" does not support multi-threaded tests.
286 ::testing::FLAGS_gtest_death_test_style = "threadsafe";
279 ASSERT_DEATH({ 287 ASSERT_DEATH({
280 WorkerPoolAndSimpleThreadDeathTest(); 288 WorkerPoolAndSimpleThreadDeathTest();
281 }, ""); 289 }, "");
282 } 290 }
283 #else 291 #else
284 TEST_F(SequenceCheckerTest, 292 TEST_F(SequenceCheckerTest,
285 WorkerPoolAndSimpleThreadDeathTestInRelease) { 293 WorkerPoolAndSimpleThreadDeathTestInRelease) {
286 WorkerPoolAndSimpleThreadDeathTest(); 294 WorkerPoolAndSimpleThreadDeathTest();
287 } 295 }
288 #endif // ENABLE_SEQUENCE_CHECKER 296 #endif // ENABLE_SEQUENCE_CHECKER
(...skipping 12 matching lines...) Expand all
301 "A", 309 "A",
302 FROM_HERE, 310 FROM_HERE,
303 base::Bind(&SequenceCheckedObject::DoStuff, 311 base::Bind(&SequenceCheckedObject::DoStuff,
304 base::Unretained(sequence_checked_object.get()))); 312 base::Unretained(sequence_checked_object.get())));
305 second_pool_owner.pool()->FlushForTesting(); 313 second_pool_owner.pool()->FlushForTesting();
306 second_pool_owner.pool()->Shutdown(); 314 second_pool_owner.pool()->Shutdown();
307 } 315 }
308 316
309 #if ENABLE_SEQUENCE_CHECKER 317 #if ENABLE_SEQUENCE_CHECKER
310 TEST_F(SequenceCheckerTest, TwoDifferentWorkerPoolsDeathTestInDebug) { 318 TEST_F(SequenceCheckerTest, TwoDifferentWorkerPoolsDeathTestInDebug) {
319 // The default style "fast" does not support multi-threaded tests.
320 ::testing::FLAGS_gtest_death_test_style = "threadsafe";
311 ASSERT_DEATH({ 321 ASSERT_DEATH({
312 TwoDifferentWorkerPoolsDeathTest(); 322 TwoDifferentWorkerPoolsDeathTest();
313 }, ""); 323 }, "");
314 } 324 }
315 #else 325 #else
316 TEST_F(SequenceCheckerTest, 326 TEST_F(SequenceCheckerTest,
317 TwoDifferentWorkerPoolsDeathTestInRelease) { 327 TwoDifferentWorkerPoolsDeathTestInRelease) {
318 TwoDifferentWorkerPoolsDeathTest(); 328 TwoDifferentWorkerPoolsDeathTest();
319 } 329 }
320 #endif // ENABLE_SEQUENCE_CHECKER 330 #endif // ENABLE_SEQUENCE_CHECKER
321 331
322 #endif // GTEST_HAS_DEATH_TEST || !ENABLE_SEQUENCE_CHECKER 332 #endif // GTEST_HAS_DEATH_TEST || !ENABLE_SEQUENCE_CHECKER
323 333
324 } // namespace 334 } // namespace
325 335
326 } // namespace base 336 } // namespace base
327 337
328 // Just in case we ever get lumped together with other compilation units. 338 // Just in case we ever get lumped together with other compilation units.
329 #undef ENABLE_SEQUENCE_CHECKER 339 #undef ENABLE_SEQUENCE_CHECKER
OLDNEW
« no previous file with comments | « no previous file | tools/valgrind/gtest_exclude/base_unittests.gtest.txt » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698