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

Side by Side Diff: base/logging_unittest.cc

Issue 1193873004: Make CHECK_EQ and friends work properly in an if/else structure without braces. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add commentary. Created 5 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
« base/logging.h ('K') | « base/logging.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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/compiler_specific.h" 6 #include "base/compiler_specific.h"
7 #include "base/logging.h" 7 #include "base/logging.h"
8 8
9 #include "testing/gmock/include/gmock/gmock.h" 9 #include "testing/gmock/include/gmock/gmock.h"
10 #include "testing/gtest/include/gtest/gtest.h" 10 #include "testing/gtest/include/gtest/gtest.h"
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after
227 227
228 TEST_F(LoggingTest, DcheckReleaseBehavior) { 228 TEST_F(LoggingTest, DcheckReleaseBehavior) {
229 int some_variable = 1; 229 int some_variable = 1;
230 // These should still reference |some_variable| so we don't get 230 // These should still reference |some_variable| so we don't get
231 // unused variable warnings. 231 // unused variable warnings.
232 DCHECK(some_variable) << "test"; 232 DCHECK(some_variable) << "test";
233 DPCHECK(some_variable) << "test"; 233 DPCHECK(some_variable) << "test";
234 DCHECK_EQ(some_variable, 1) << "test"; 234 DCHECK_EQ(some_variable, 1) << "test";
235 } 235 }
236 236
237 TEST_F(LoggingTest, DCheckStatements) {
238 SetLogAssertHandler(&LogSink);
239
240 EXPECT_EQ(0, log_sink_call_count);
241
242 bool reached = false;
Sigurður Ásgeirsson 2015/06/25 12:25:09 It's totally opaque what's being tested here and t
erikwright (departed) 2015/07/07 18:30:56 I've updated this particular test case with some s
243 if (false)
244 DCHECK(false);
245 else
246 DCHECK(reached = true);
247 ASSERT_EQ(DCHECK_IS_ON(), reached);
248
249 reached = false;
250 if (true)
251 DCHECK(reached = true);
252 else
253 DCHECK(false);
254 ASSERT_EQ(DCHECK_IS_ON(), reached);
255
256 reached = false;
257 switch (2) {
258 case 1:
259 DCHECK(false);
260 case 2:
261 DCHECK(reached=true);
262 default:
263 break;
264 }
265 ASSERT_EQ(DCHECK_IS_ON(), reached);
266
267 // Cases with failing checks.
268 EXPECT_EQ(0, log_sink_call_count);
269
270 reached = false;
271 if (false)
272 DCHECK(reached = true);
273 else
274 DCHECK(false);
275 ASSERT_FALSE(reached);
276 ASSERT_EQ(DCHECK_IS_ON() ? 1 : 0, log_sink_call_count);
277
278 reached = false;
279 if (true)
280 DCHECK(false);
281 else
282 DCHECK(reached = true);
283 ASSERT_FALSE(reached);
284 ASSERT_EQ(DCHECK_IS_ON() ? 2 : 0, log_sink_call_count);
285
286 reached = false;
287 switch (2) {
288 case 1:
289 DCHECK(reached = true);
290 case 2:
291 DCHECK(false);
292 default:
293 break;
294 }
295 ASSERT_FALSE(reached);
296 ASSERT_EQ(DCHECK_IS_ON() ? 3 : 0, log_sink_call_count);
297 }
298
299 TEST_F(LoggingTest, CheckStatements) {
300 SetLogAssertHandler(&LogSink);
301
302 EXPECT_EQ(0, log_sink_call_count);
303
304 bool reached = false;
305 if (false)
306 CHECK(false);
307 else
308 CHECK(reached = true);
309 ASSERT_TRUE(reached);
310
311 reached = false;
312 if (true)
313 CHECK(reached = true);
314 else
315 CHECK(false);
316 ASSERT_TRUE(reached);
317
318 reached = false;
319 switch (2) {
320 case 1:
321 CHECK(false);
322 case 2:
323 CHECK(reached=true);
324 default:
325 break;
326 }
327 ASSERT_TRUE(reached);
328
329 // Cases with failing checks.
330 EXPECT_EQ(0, log_sink_call_count);
331
332 reached = false;
333 if (false)
334 CHECK(reached = true);
335 else
336 CHECK(false);
337 ASSERT_FALSE(reached);
338 ASSERT_EQ(1, log_sink_call_count);
339
340 reached = false;
341 if (true)
342 CHECK(false);
343 else
344 CHECK(reached = true);
345 ASSERT_FALSE(reached);
346 ASSERT_EQ(2, log_sink_call_count);
347
348 reached = false;
349 switch (2) {
350 case 1:
351 CHECK(reached = true);
352 case 2:
353 CHECK(false);
354 default:
355 break;
356 }
357 ASSERT_FALSE(reached);
358 ASSERT_EQ(3, log_sink_call_count);
359 }
360
361 TEST_F(LoggingTest, DCheckEqStatements) {
362 SetLogAssertHandler(&LogSink);
363
364 EXPECT_EQ(0, log_sink_call_count);
365
366 bool reached = false;
367 if (false)
368 DCHECK_EQ(false, true);
369 else
370 DCHECK_EQ(true, reached = true);
371 ASSERT_EQ(DCHECK_IS_ON(), reached);
372
373 reached = false;
374 if (true)
375 DCHECK_EQ(true, reached = true);
376 else
377 DCHECK_EQ(false, true);
378 ASSERT_EQ(DCHECK_IS_ON(), reached);
379
380 reached = false;
381 switch (2) {
382 case 1:
383 DCHECK_EQ(false, true);
384 case 2:
385 DCHECK_EQ(true, reached=true);
386 default:
387 break;
388 }
389 ASSERT_EQ(DCHECK_IS_ON(), reached);
390
391 // Cases with failing checks.
392 EXPECT_EQ(0, log_sink_call_count);
393
394 reached = false;
395 if (false)
396 DCHECK_EQ(true, reached = true);
397 else
398 DCHECK_EQ(false, true);
399 ASSERT_FALSE(reached);
400 ASSERT_EQ(DCHECK_IS_ON() ? 1 : 0, log_sink_call_count);
401
402 reached = false;
403 if (true)
404 DCHECK_EQ(false, true);
405 else
406 DCHECK_EQ(true, reached = true);
407 ASSERT_FALSE(reached);
408 ASSERT_EQ(DCHECK_IS_ON() ? 2 : 0, log_sink_call_count);
409
410 reached = false;
411 switch (2) {
412 case 1:
413 DCHECK_EQ(true, reached = true);
414 case 2:
415 DCHECK_EQ(false, true);
416 default:
417 break;
418 }
419 ASSERT_FALSE(reached);
420 ASSERT_EQ(DCHECK_IS_ON() ? 3 : 0, log_sink_call_count);
421 }
422
423 TEST_F(LoggingTest, CheckEqStatements) {
424 SetLogAssertHandler(&LogSink);
425
426 EXPECT_EQ(0, log_sink_call_count);
427
428 bool reached = false;
429 if (false)
430 CHECK_EQ(false, true);
431 else
432 CHECK_EQ(true, reached = true);
433 ASSERT_TRUE(reached);
434
435 reached = false;
436 if (true)
437 CHECK_EQ(true, reached = true);
438 else
439 CHECK_EQ(false, true);
440 ASSERT_TRUE(reached);
441
442 reached = false;
443 switch (2) {
444 case 1:
445 CHECK_EQ(false, true);
446 case 2:
447 CHECK_EQ(true, reached = true);
448 default:
449 break;
450 }
451 ASSERT_TRUE(reached);
452
453 // Cases with failing checks.
454 EXPECT_EQ(0, log_sink_call_count);
455
456 reached = false;
457 if (false)
458 CHECK_EQ(true, reached = true);
459 else
460 CHECK_EQ(false, true);
461 ASSERT_FALSE(reached);
462 ASSERT_EQ(1, log_sink_call_count);
463
464 reached = false;
465 if (true)
466 CHECK_EQ(false, true);
467 else
468 CHECK_EQ(true, reached = true);
469 ASSERT_FALSE(reached);
470 ASSERT_EQ(2, log_sink_call_count);
471
472 reached = false;
473 switch (2) {
474 case 1:
475 CHECK_EQ(true, reached = true);
476 case 2:
477 CHECK_EQ(false, true);
478 default:
479 break;
480 }
481 ASSERT_FALSE(reached);
482 ASSERT_EQ(3, log_sink_call_count);
483 }
484
485 TEST_F(LoggingTest, LogStatements) {
486 bool reached = false;
487 if (true)
488 LOG(INFO) << "Hello: " << (reached = true);
489 else
490 LOG(FATAL) << "Goodbye.";
491 ASSERT_TRUE(reached);
492
493 reached = false;
494 if (false)
495 LOG(FATAL) << "Goodbye.";
496 else
497 LOG(INFO) << "Hello: " << (reached = true);
498 ASSERT_TRUE(reached);
499
500 reached = false;
501 if (true)
502 LOG_IF(INFO, reached = true) << "Hello.";
503 else
504 LOG_IF(FATAL, true) << "Goodbye.";
505 ASSERT_TRUE(reached);
506
507 reached = false;
508 if (false)
509 LOG_IF(FATAL, true) << "Goodbye.";
510 else
511 LOG_IF(INFO, reached = true) << "Hello.";
512 ASSERT_TRUE(reached);
513
514 reached = false;
515 if (false)
516 LOG_IF(FATAL, true) << "Goodbye.";
517 else
518 LOG_IF(INFO, false) << "Derp: " << (reached = true);
519 ASSERT_FALSE(reached);
520
521 reached = false;
522 if (true)
523 DLOG(INFO) << "Hello: " << (reached = true);
524 else
525 DLOG(FATAL) << "Goodbye.";
526 ASSERT_EQ(DLOG_IS_ON(INFO), reached);
527
528 reached = false;
529 if (false)
530 DLOG(FATAL) << "Goodbye.";
531 else
532 DLOG(INFO) << "Hello: " << (reached = true);
533 ASSERT_EQ(DLOG_IS_ON(INFO), reached);
534
535 reached = false;
536 if (true)
537 DLOG_IF(INFO, true) << "Hello: " << (reached = true);
538 else
539 DLOG_IF(FATAL, true) << "Goodbye.";
540 ASSERT_EQ(DLOG_IS_ON(INFO), reached);
541
542 reached = false;
543 if (false)
544 DLOG_IF(FATAL, true) << "Goodbye.";
545 else
546 DLOG_IF(INFO, true) << "Hello: " << (reached = true);
547 ASSERT_EQ(DLOG_IS_ON(INFO), reached);
548
549 reached = false;
550 if (false)
551 DLOG_IF(FATAL, true) << "Goodbye.";
552 else
553 DLOG_IF(INFO, false) << "Derp: " << (reached = true);
554 ASSERT_FALSE(reached);
555 }
556
237 // Test that defining an operator<< for a type in a namespace doesn't prevent 557 // Test that defining an operator<< for a type in a namespace doesn't prevent
238 // other code in that namespace from calling the operator<<(ostream, wstring) 558 // other code in that namespace from calling the operator<<(ostream, wstring)
239 // defined by logging.h. This can fail if operator<<(ostream, wstring) can't be 559 // defined by logging.h. This can fail if operator<<(ostream, wstring) can't be
240 // found by ADL, since defining another operator<< prevents name lookup from 560 // found by ADL, since defining another operator<< prevents name lookup from
241 // looking in the global namespace. 561 // looking in the global namespace.
242 namespace nested_test { 562 namespace nested_test {
243 class Streamable {}; 563 class Streamable {};
244 ALLOW_UNUSED_TYPE std::ostream& operator<<(std::ostream& out, 564 ALLOW_UNUSED_TYPE std::ostream& operator<<(std::ostream& out,
245 const Streamable&) { 565 const Streamable&) {
246 return out << "Streamable"; 566 return out << "Streamable";
247 } 567 }
248 TEST_F(LoggingTest, StreamingWstringFindsCorrectOperator) { 568 TEST_F(LoggingTest, StreamingWstringFindsCorrectOperator) {
249 std::wstring wstr = L"Hello World"; 569 std::wstring wstr = L"Hello World";
250 std::ostringstream ostr; 570 std::ostringstream ostr;
251 ostr << wstr; 571 ostr << wstr;
252 EXPECT_EQ("Hello World", ostr.str()); 572 EXPECT_EQ("Hello World", ostr.str());
253 } 573 }
254 } // namespace nested_test 574 } // namespace nested_test
255 575
256 } // namespace 576 } // namespace
257 577
258 } // namespace logging 578 } // namespace logging
OLDNEW
« base/logging.h ('K') | « base/logging.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698