Add a gyp flag to enable dcheck by default in release without
having the pass a flag. This will be used on the try bots.

BUG=96753
Review URL: http://codereview.chromium.org/7719007

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@102017 0039d316-1c4b-4281-b951-d872f2087c98


CrOS-Libchrome-Original-Commit: 20960e074cf789825155f771e1c035df41cd0e75
diff --git a/base/file_util_unittest.cc b/base/file_util_unittest.cc
index c44b804..7b12fb8 100644
--- a/base/file_util_unittest.cc
+++ b/base/file_util_unittest.cc
@@ -223,7 +223,7 @@
     EXPECT_EQ(value.result, result);
   }
 
-#ifdef NDEBUG
+#if defined(NDEBUG) && !defined(DCHECK_ALWAYS_ON)
   file_util::AppendToPath(NULL, L"path");  // asserts in debug mode
 #endif
 }
diff --git a/base/logging.h b/base/logging.h
index c18fada..d418315 100644
--- a/base/logging.h
+++ b/base/logging.h
@@ -619,16 +619,29 @@
 
 #if defined(NDEBUG)
 
+BASE_EXPORT extern DcheckState g_dcheck_state;
+
+#if defined(DCHECK_ALWAYS_ON)
+
+#define DCHECK_IS_ON() true
+#define COMPACT_GOOGLE_LOG_EX_DCHECK(ClassName, ...) \
+  COMPACT_GOOGLE_LOG_EX_FATAL(ClassName , ##__VA_ARGS__)
+#define COMPACT_GOOGLE_LOG_DCHECK COMPACT_GOOGLE_LOG_FATAL
+const LogSeverity LOG_DCHECK = LOG_FATAL;
+
+#else
+
 #define COMPACT_GOOGLE_LOG_EX_DCHECK(ClassName, ...) \
   COMPACT_GOOGLE_LOG_EX_ERROR_REPORT(ClassName , ##__VA_ARGS__)
 #define COMPACT_GOOGLE_LOG_DCHECK COMPACT_GOOGLE_LOG_ERROR_REPORT
 const LogSeverity LOG_DCHECK = LOG_ERROR_REPORT;
-BASE_EXPORT extern DcheckState g_dcheck_state;
 #define DCHECK_IS_ON()                                                  \
   ((::logging::g_dcheck_state ==                                        \
     ::logging::ENABLE_DCHECK_FOR_NON_OFFICIAL_RELEASE_BUILDS) &&        \
    LOG_IS_ON(DCHECK))
 
+#endif  // defined(DCHECK_ALWAYS_ON)
+
 #else  // defined(NDEBUG)
 
 // On a regular debug build, we want to have DCHECKs enabled.
diff --git a/base/logging_unittest.cc b/base/logging_unittest.cc
index 5a2cb53..08d7830 100644
--- a/base/logging_unittest.cc
+++ b/base/logging_unittest.cc
@@ -197,16 +197,16 @@
 TEST_F(LoggingTest, DcheckStreamsAreLazy) {
   MockLogSource mock_log_source;
   EXPECT_CALL(mock_log_source, Log()).Times(0);
-
-#if !defined(LOGGING_IS_OFFICIAL_BUILD) && defined(NDEBUG)
-  // Unofficial release build.
+#if !defined(LOGGING_IS_OFFICIAL_BUILD) && defined(NDEBUG) && \
+    !defined(DCHECK_ALWAYS_ON)
+  // Unofficial release build without dcheck enabled.
   g_dcheck_state = DISABLE_DCHECK_FOR_NON_OFFICIAL_RELEASE_BUILDS;
   DCHECK(mock_log_source.Log()) << mock_log_source.Log();
   DPCHECK(mock_log_source.Log()) << mock_log_source.Log();
   DCHECK_EQ(0, 0) << mock_log_source.Log();
   DCHECK_EQ(mock_log_source.Log(), static_cast<const char*>(NULL))
       << mock_log_source.Log();
-#endif  // !defined(LOGGING_IS_OFFICIAL_BUILD) && defined(NDEBUG)
+#endif
 }
 
 TEST_F(LoggingTest, Dcheck) {
@@ -214,12 +214,18 @@
   // Official build.
   EXPECT_FALSE(DCHECK_IS_ON());
   EXPECT_FALSE(DLOG_IS_ON(DCHECK));
-#elif defined(NDEBUG)
+#elif defined(NDEBUG) && !defined(DCHECK_ALWAYS_ON)
   // Unofficial release build.
   g_dcheck_state = ENABLE_DCHECK_FOR_NON_OFFICIAL_RELEASE_BUILDS;
   SetLogReportHandler(&LogSink);
   EXPECT_TRUE(DCHECK_IS_ON());
   EXPECT_FALSE(DLOG_IS_ON(DCHECK));
+#elif defined(NDEBUG) && defined(DCHECK_ALWAYS_ON)
+  // Unofficial release build with real DCHECKS.
+  g_dcheck_state = ENABLE_DCHECK_FOR_NON_OFFICIAL_RELEASE_BUILDS;
+  SetLogAssertHandler(&LogSink);
+  EXPECT_TRUE(DCHECK_IS_ON());
+  EXPECT_FALSE(DLOG_IS_ON(DCHECK));
 #else
   // Unofficial debug build.
   SetLogAssertHandler(&LogSink);
diff --git a/ipc/ipc_fuzzing_tests.cc b/ipc/ipc_fuzzing_tests.cc
index c7076cc..d1a3c33 100644
--- a/ipc/ipc_fuzzing_tests.cc
+++ b/ipc/ipc_fuzzing_tests.cc
@@ -290,7 +290,7 @@
 // In debug this triggers an assertion and in release it is ignored(!!). Right
 // after we generate another valid IPC to make sure framing is working
 // properly.
-#ifdef NDEBUG
+#if defined(NDEBUG) && !defined(DCHECK_ALWAYS_ON)
 TEST_F(IPCFuzzingTest, MsgBadPayloadShort) {
   FuzzerClientListener listener;
   IPC::Channel chan(kFuzzerChannel, IPC::Channel::MODE_SERVER,
@@ -314,7 +314,7 @@
   EXPECT_TRUE(base::WaitForSingleProcess(server_process, 5000));
   base::CloseProcessHandle(server_process);
 }
-#endif  // NDEBUG
+#endif
 
 // This test uses a payload that has too many arguments, but so the payload
 // size is big enough so the unpacking routine does not generate an error as
@@ -392,7 +392,7 @@
   EXPECT_TRUE(server.OnMessageReceived(*msg));
   delete msg;
 
-#ifdef NDEBUG
+#if defined(NDEBUG) && !defined(DCHECK_ALWAYS_ON)
   // Test a bad message.
   msg = new IPC::Message(MSG_ROUTING_CONTROL, MsgClassSI::ID,
                          IPC::Message::PRIORITY_NORMAL);