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

Side by Side Diff: base/sequence_checker_unittest.cc

Issue 2163023002: Unify usage of logging/assert macros in base/ (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: oops commit on wrong branch Created 4 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
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 <memory>
10 #include <utility> 10 #include <utility>
11 11
12 #include "base/bind.h" 12 #include "base/bind.h"
13 #include "base/bind_helpers.h" 13 #include "base/bind_helpers.h"
14 #include "base/location.h" 14 #include "base/location.h"
15 #include "base/logging.h" 15 #include "base/logging.h"
16 #include "base/macros.h" 16 #include "base/macros.h"
17 #include "base/memory/ref_counted.h" 17 #include "base/memory/ref_counted.h"
18 #include "base/single_thread_task_runner.h" 18 #include "base/single_thread_task_runner.h"
19 #include "base/test/gtest_util.h" 19 #include "base/test/gtest_util.h"
20 #include "base/test/sequenced_worker_pool_owner.h" 20 #include "base/test/sequenced_worker_pool_owner.h"
21 #include "base/threading/thread.h" 21 #include "base/threading/thread.h"
22 #include "testing/gtest/include/gtest/gtest.h" 22 #include "testing/gtest/include/gtest/gtest.h"
23 23
24 // Duplicated from base/sequence_checker.h so that we can be good citizens
25 // there and undef the macro.
26 #if (!defined(NDEBUG) || defined(DCHECK_ALWAYS_ON))
27 #define ENABLE_SEQUENCE_CHECKER 1
28 #else
29 #define ENABLE_SEQUENCE_CHECKER 0
30 #endif
31
32 namespace base { 24 namespace base {
33 25
34 namespace { 26 namespace {
35 27
36 const size_t kNumWorkerThreads = 3; 28 const size_t kNumWorkerThreads = 3;
37 29
38 // Simple class to exercise the basics of SequenceChecker. 30 // Simple class to exercise the basics of SequenceChecker.
39 // DoStuff should verify that it's called on a valid sequenced thread. 31 // DoStuff should verify that it's called on a valid sequenced thread.
40 // SequenceCheckedObject can be destroyed on any thread (like WeakPtr). 32 // SequenceCheckedObject can be destroyed on any thread (like WeakPtr).
41 class SequenceCheckedObject { 33 class SequenceCheckedObject {
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
186 void SequenceCheckerTest::MethodOnDifferentThreadDeathTest() { 178 void SequenceCheckerTest::MethodOnDifferentThreadDeathTest() {
187 std::unique_ptr<SequenceCheckedObject> sequence_checked_object( 179 std::unique_ptr<SequenceCheckedObject> sequence_checked_object(
188 new SequenceCheckedObject); 180 new SequenceCheckedObject);
189 181
190 // DoStuff should assert in debug builds only when called on a 182 // DoStuff should assert in debug builds only when called on a
191 // different thread. 183 // different thread.
192 PostDoStuffToOtherThread(sequence_checked_object.get()); 184 PostDoStuffToOtherThread(sequence_checked_object.get());
193 other_thread()->Stop(); 185 other_thread()->Stop();
194 } 186 }
195 187
196 #if ENABLE_SEQUENCE_CHECKER 188 #if DCHECK_IS_ON()
197 TEST_F(SequenceCheckerTest, MethodNotAllowedOnDifferentThreadDeathTestInDebug) { 189 TEST_F(SequenceCheckerTest, MethodNotAllowedOnDifferentThreadDeathTestInDebug) {
198 // The default style "fast" does not support multi-threaded tests. 190 // The default style "fast" does not support multi-threaded tests.
199 ::testing::FLAGS_gtest_death_test_style = "threadsafe"; 191 ::testing::FLAGS_gtest_death_test_style = "threadsafe";
200 ASSERT_DCHECK_DEATH({ MethodOnDifferentThreadDeathTest(); }, ""); 192 ASSERT_DCHECK_DEATH({ MethodOnDifferentThreadDeathTest(); }, "");
201 } 193 }
202 #else 194 #else
203 TEST_F(SequenceCheckerTest, MethodAllowedOnDifferentThreadDeathTestInRelease) { 195 TEST_F(SequenceCheckerTest, MethodAllowedOnDifferentThreadDeathTestInRelease) {
204 MethodOnDifferentThreadDeathTest(); 196 MethodOnDifferentThreadDeathTest();
205 } 197 }
206 #endif // ENABLE_SEQUENCE_CHECKER 198 #endif // DCHECK_IS_ON()
207 199
208 void SequenceCheckerTest::DetachThenCallFromDifferentThreadDeathTest() { 200 void SequenceCheckerTest::DetachThenCallFromDifferentThreadDeathTest() {
209 std::unique_ptr<SequenceCheckedObject> sequence_checked_object( 201 std::unique_ptr<SequenceCheckedObject> sequence_checked_object(
210 new SequenceCheckedObject); 202 new SequenceCheckedObject);
211 203
212 // DoStuff doesn't assert when called on a different thread 204 // DoStuff doesn't assert when called on a different thread
213 // after a call to DetachFromSequence. 205 // after a call to DetachFromSequence.
214 sequence_checked_object->DetachFromSequence(); 206 sequence_checked_object->DetachFromSequence();
215 PostDoStuffToOtherThread(sequence_checked_object.get()); 207 PostDoStuffToOtherThread(sequence_checked_object.get());
216 other_thread()->Stop(); 208 other_thread()->Stop();
217 209
218 // DoStuff should assert in debug builds only after moving to 210 // DoStuff should assert in debug builds only after moving to
219 // another thread. 211 // another thread.
220 sequence_checked_object->DoStuff(); 212 sequence_checked_object->DoStuff();
221 } 213 }
222 214
223 #if ENABLE_SEQUENCE_CHECKER 215 #if DCHECK_IS_ON()
224 TEST_F(SequenceCheckerTest, DetachFromSequenceDeathTestInDebug) { 216 TEST_F(SequenceCheckerTest, DetachFromSequenceDeathTestInDebug) {
225 // The default style "fast" does not support multi-threaded tests. 217 // The default style "fast" does not support multi-threaded tests.
226 ::testing::FLAGS_gtest_death_test_style = "threadsafe"; 218 ::testing::FLAGS_gtest_death_test_style = "threadsafe";
227 ASSERT_DCHECK_DEATH({ DetachThenCallFromDifferentThreadDeathTest(); }, ""); 219 ASSERT_DCHECK_DEATH({ DetachThenCallFromDifferentThreadDeathTest(); }, "");
228 } 220 }
229 #else 221 #else
230 TEST_F(SequenceCheckerTest, DetachFromThreadDeathTestInRelease) { 222 TEST_F(SequenceCheckerTest, DetachFromThreadDeathTestInRelease) {
231 DetachThenCallFromDifferentThreadDeathTest(); 223 DetachThenCallFromDifferentThreadDeathTest();
232 } 224 }
233 #endif // ENABLE_SEQUENCE_CHECKER 225 #endif // DCHECK_IS_ON()
234 226
235 void SequenceCheckerTest::DifferentSequenceTokensDeathTest() { 227 void SequenceCheckerTest::DifferentSequenceTokensDeathTest() {
236 std::unique_ptr<SequenceCheckedObject> sequence_checked_object( 228 std::unique_ptr<SequenceCheckedObject> sequence_checked_object(
237 new SequenceCheckedObject); 229 new SequenceCheckedObject);
238 230
239 sequence_checked_object->DetachFromSequence(); 231 sequence_checked_object->DetachFromSequence();
240 PostDoStuffToWorkerPool(sequence_checked_object.get(), "A"); 232 PostDoStuffToWorkerPool(sequence_checked_object.get(), "A");
241 PostDoStuffToWorkerPool(sequence_checked_object.get(), "A"); 233 PostDoStuffToWorkerPool(sequence_checked_object.get(), "A");
242 PostDoStuffToWorkerPool(sequence_checked_object.get(), "B"); 234 PostDoStuffToWorkerPool(sequence_checked_object.get(), "B");
243 PostDoStuffToWorkerPool(sequence_checked_object.get(), "B"); 235 PostDoStuffToWorkerPool(sequence_checked_object.get(), "B");
244 pool()->FlushForTesting(); 236 pool()->FlushForTesting();
245 237
246 PostDeleteToOtherThread(std::move(sequence_checked_object)); 238 PostDeleteToOtherThread(std::move(sequence_checked_object));
247 other_thread()->Stop(); 239 other_thread()->Stop();
248 } 240 }
249 241
250 #if ENABLE_SEQUENCE_CHECKER 242 #if DCHECK_IS_ON()
251 TEST_F(SequenceCheckerTest, DifferentSequenceTokensDeathTestInDebug) { 243 TEST_F(SequenceCheckerTest, DifferentSequenceTokensDeathTestInDebug) {
252 // The default style "fast" does not support multi-threaded tests. 244 // The default style "fast" does not support multi-threaded tests.
253 ::testing::FLAGS_gtest_death_test_style = "threadsafe"; 245 ::testing::FLAGS_gtest_death_test_style = "threadsafe";
254 ASSERT_DCHECK_DEATH({ DifferentSequenceTokensDeathTest(); }, ""); 246 ASSERT_DCHECK_DEATH({ DifferentSequenceTokensDeathTest(); }, "");
255 } 247 }
256 #else 248 #else
257 TEST_F(SequenceCheckerTest, DifferentSequenceTokensDeathTestInRelease) { 249 TEST_F(SequenceCheckerTest, DifferentSequenceTokensDeathTestInRelease) {
258 DifferentSequenceTokensDeathTest(); 250 DifferentSequenceTokensDeathTest();
259 } 251 }
260 #endif // ENABLE_SEQUENCE_CHECKER 252 #endif // DCHECK_IS_ON()
261 253
262 void SequenceCheckerTest::WorkerPoolAndSimpleThreadDeathTest() { 254 void SequenceCheckerTest::WorkerPoolAndSimpleThreadDeathTest() {
263 std::unique_ptr<SequenceCheckedObject> sequence_checked_object( 255 std::unique_ptr<SequenceCheckedObject> sequence_checked_object(
264 new SequenceCheckedObject); 256 new SequenceCheckedObject);
265 257
266 sequence_checked_object->DetachFromSequence(); 258 sequence_checked_object->DetachFromSequence();
267 PostDoStuffToWorkerPool(sequence_checked_object.get(), "A"); 259 PostDoStuffToWorkerPool(sequence_checked_object.get(), "A");
268 PostDoStuffToWorkerPool(sequence_checked_object.get(), "A"); 260 PostDoStuffToWorkerPool(sequence_checked_object.get(), "A");
269 pool()->FlushForTesting(); 261 pool()->FlushForTesting();
270 262
271 PostDoStuffToOtherThread(sequence_checked_object.get()); 263 PostDoStuffToOtherThread(sequence_checked_object.get());
272 other_thread()->Stop(); 264 other_thread()->Stop();
273 } 265 }
274 266
275 #if ENABLE_SEQUENCE_CHECKER 267 #if DCHECK_IS_ON()
276 TEST_F(SequenceCheckerTest, WorkerPoolAndSimpleThreadDeathTestInDebug) { 268 TEST_F(SequenceCheckerTest, WorkerPoolAndSimpleThreadDeathTestInDebug) {
277 // The default style "fast" does not support multi-threaded tests. 269 // The default style "fast" does not support multi-threaded tests.
278 ::testing::FLAGS_gtest_death_test_style = "threadsafe"; 270 ::testing::FLAGS_gtest_death_test_style = "threadsafe";
279 ASSERT_DCHECK_DEATH({ WorkerPoolAndSimpleThreadDeathTest(); }, ""); 271 ASSERT_DCHECK_DEATH({ WorkerPoolAndSimpleThreadDeathTest(); }, "");
280 } 272 }
281 #else 273 #else
282 TEST_F(SequenceCheckerTest, WorkerPoolAndSimpleThreadDeathTestInRelease) { 274 TEST_F(SequenceCheckerTest, WorkerPoolAndSimpleThreadDeathTestInRelease) {
283 WorkerPoolAndSimpleThreadDeathTest(); 275 WorkerPoolAndSimpleThreadDeathTest();
284 } 276 }
285 #endif // ENABLE_SEQUENCE_CHECKER 277 #endif // DCHECK_IS_ON()
286 278
287 void SequenceCheckerTest::TwoDifferentWorkerPoolsDeathTest() { 279 void SequenceCheckerTest::TwoDifferentWorkerPoolsDeathTest() {
288 std::unique_ptr<SequenceCheckedObject> sequence_checked_object( 280 std::unique_ptr<SequenceCheckedObject> sequence_checked_object(
289 new SequenceCheckedObject); 281 new SequenceCheckedObject);
290 282
291 sequence_checked_object->DetachFromSequence(); 283 sequence_checked_object->DetachFromSequence();
292 PostDoStuffToWorkerPool(sequence_checked_object.get(), "A"); 284 PostDoStuffToWorkerPool(sequence_checked_object.get(), "A");
293 PostDoStuffToWorkerPool(sequence_checked_object.get(), "A"); 285 PostDoStuffToWorkerPool(sequence_checked_object.get(), "A");
294 pool()->FlushForTesting(); 286 pool()->FlushForTesting();
295 287
296 SequencedWorkerPoolOwner second_pool_owner(kNumWorkerThreads, "test2"); 288 SequencedWorkerPoolOwner second_pool_owner(kNumWorkerThreads, "test2");
297 second_pool_owner.pool()->PostNamedSequencedWorkerTask( 289 second_pool_owner.pool()->PostNamedSequencedWorkerTask(
298 "A", 290 "A",
299 FROM_HERE, 291 FROM_HERE,
300 base::Bind(&SequenceCheckedObject::DoStuff, 292 base::Bind(&SequenceCheckedObject::DoStuff,
301 base::Unretained(sequence_checked_object.get()))); 293 base::Unretained(sequence_checked_object.get())));
302 second_pool_owner.pool()->FlushForTesting(); 294 second_pool_owner.pool()->FlushForTesting();
303 } 295 }
304 296
305 #if ENABLE_SEQUENCE_CHECKER 297 #if DCHECK_IS_ON()
306 TEST_F(SequenceCheckerTest, TwoDifferentWorkerPoolsDeathTestInDebug) { 298 TEST_F(SequenceCheckerTest, TwoDifferentWorkerPoolsDeathTestInDebug) {
307 // The default style "fast" does not support multi-threaded tests. 299 // The default style "fast" does not support multi-threaded tests.
308 ::testing::FLAGS_gtest_death_test_style = "threadsafe"; 300 ::testing::FLAGS_gtest_death_test_style = "threadsafe";
309 ASSERT_DCHECK_DEATH({ TwoDifferentWorkerPoolsDeathTest(); }, ""); 301 ASSERT_DCHECK_DEATH({ TwoDifferentWorkerPoolsDeathTest(); }, "");
310 } 302 }
311 #else 303 #else
312 TEST_F(SequenceCheckerTest, TwoDifferentWorkerPoolsDeathTestInRelease) { 304 TEST_F(SequenceCheckerTest, TwoDifferentWorkerPoolsDeathTestInRelease) {
313 TwoDifferentWorkerPoolsDeathTest(); 305 TwoDifferentWorkerPoolsDeathTest();
314 } 306 }
315 #endif // ENABLE_SEQUENCE_CHECKER 307 #endif // DCHECK_IS_ON()
316 308
317 } // namespace 309 } // namespace
318 310
319 } // namespace base 311 } // namespace base
320
321 // Just in case we ever get lumped together with other compilation units.
322 #undef ENABLE_SEQUENCE_CHECKER
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698