1// Copyright (c) 2010 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "build/build_config.h" 6 7#if defined(OS_WIN) 8#include <windows.h> 9#endif 10 11#include <string> 12 13#include "base/basictypes.h" 14#include "base/command_line.h" 15#include "base/environment.h" 16#include "chrome/common/chrome_switches.h" 17#include "chrome/common/env_vars.h" 18#include "chrome/common/logging_chrome.h" 19#include "chrome/test/automation/browser_proxy.h" 20#include "chrome/test/ui/ui_test.h" 21#include "testing/gtest/include/gtest/gtest.h" 22 23class ChromeLoggingTest : public testing::Test { 24 public: 25 // Stores the current value of the log file name environment 26 // variable and sets the variable to new_value. 27 void SaveEnvironmentVariable(std::string new_value) { 28 scoped_ptr<base::Environment> env(base::Environment::Create()); 29 if (!env->GetVar(env_vars::kLogFileName, &environment_filename_)) 30 environment_filename_ = ""; 31 32 env->SetVar(env_vars::kLogFileName, new_value); 33 } 34 35 // Restores the value of the log file nave environment variable 36 // previously saved by SaveEnvironmentVariable(). 37 void RestoreEnvironmentVariable() { 38 scoped_ptr<base::Environment> env(base::Environment::Create()); 39 env->SetVar(env_vars::kLogFileName, environment_filename_); 40 } 41 42 private: 43 std::string environment_filename_; // Saves real environment value. 44}; 45 46// Tests the log file name getter without an environment variable. 47TEST_F(ChromeLoggingTest, LogFileName) { 48 SaveEnvironmentVariable(""); 49 50 FilePath filename = logging::GetLogFileName(); 51 ASSERT_NE(FilePath::StringType::npos, 52 filename.value().find(FILE_PATH_LITERAL("chrome_debug.log"))); 53 54 RestoreEnvironmentVariable(); 55} 56 57// Tests the log file name getter with an environment variable. 58TEST_F(ChromeLoggingTest, EnvironmentLogFileName) { 59 SaveEnvironmentVariable("test value"); 60 61 FilePath filename = logging::GetLogFileName(); 62 ASSERT_EQ(FilePath(FILE_PATH_LITERAL("test value")).value(), 63 filename.value()); 64 65 RestoreEnvironmentVariable(); 66} 67 68#if defined(OS_LINUX) && (!defined(NDEBUG) || !defined(USE_LINUX_BREAKPAD)) 69// On Linux in Debug mode, Chrome generates a SIGTRAP. 70// we do not catch SIGTRAPs, thus no crash dump. 71// This also does not work if Breakpad is disabled. 72#define EXPECTED_ASSERT_CRASHES 0 73#else 74#define EXPECTED_ASSERT_CRASHES 1 75#endif 76 77#if !defined(NDEBUG) // We don't have assertions in release builds. 78// Tests whether we correctly fail on browser assertions during tests. 79class AssertionTest : public UITest { 80 protected: 81 AssertionTest() : UITest() { 82 // Initial loads will never complete due to assertion. 83 wait_for_initial_loads_ = false; 84 85 // We're testing the renderer rather than the browser assertion here, 86 // because the browser assertion would flunk the test during SetUp() 87 // (since TAU wouldn't be able to find the browser window). 88 launch_arguments_.AppendSwitch(switches::kRendererAssertTest); 89 } 90}; 91 92// Launch the app in assertion test mode, then close the app. 93#if defined(OS_WIN) 94// http://crbug.com/26715 95#define Assertion DISABLED_Assertion 96#elif defined(OS_MACOSX) 97// Crash service doesn't exist for the Mac yet: http://crbug.com/45243 98#define Assertion DISABLED_Assertion 99#endif 100TEST_F(AssertionTest, Assertion) { 101 if (ProxyLauncher::in_process_renderer()) { 102 // in process mode doesn't do the crashing. 103 expected_errors_ = 0; 104 expected_crashes_ = 0; 105 } else { 106 expected_errors_ = 1; 107 expected_crashes_ = EXPECTED_ASSERT_CRASHES; 108 } 109} 110#endif // !defined(NDEBUG) 111 112#if !defined(OFFICIAL_BUILD) 113// Only works on Linux in Release mode with CHROME_HEADLESS=1 114class CheckFalseTest : public UITest { 115 protected: 116 CheckFalseTest() : UITest() { 117 // Initial loads will never complete due to assertion. 118 wait_for_initial_loads_ = false; 119 120 // We're testing the renderer rather than the browser assertion here, 121 // because the browser assertion would flunk the test during SetUp() 122 // (since TAU wouldn't be able to find the browser window). 123 launch_arguments_.AppendSwitch(switches::kRendererCheckFalseTest); 124 } 125}; 126 127#if defined(OS_WIN) 128// http://crbug.com/38497 129#define CheckFails FLAKY_CheckFails 130#elif defined(OS_MACOSX) 131// Crash service doesn't exist for the Mac yet: http://crbug.com/45243 132#define CheckFails DISABLED_CheckFails 133#endif 134// Launch the app in assertion test mode, then close the app. 135TEST_F(CheckFalseTest, CheckFails) { 136 if (ProxyLauncher::in_process_renderer()) { 137 // in process mode doesn't do the crashing. 138 expected_errors_ = 0; 139 expected_crashes_ = 0; 140 } else { 141 expected_errors_ = 1; 142 expected_crashes_ = EXPECTED_ASSERT_CRASHES; 143 } 144} 145#endif // !defined(OFFICIAL_BUILD) 146 147// Tests whether we correctly fail on browser crashes during UI Tests. 148class RendererCrashTest : public UITest { 149 protected: 150 RendererCrashTest() : UITest() { 151 // Initial loads will never complete due to crash. 152 wait_for_initial_loads_ = false; 153 154 launch_arguments_.AppendSwitch(switches::kRendererCrashTest); 155 } 156}; 157 158#if defined(OS_LINUX) && !defined(USE_LINUX_BREAKPAD) 159// On Linux, do not expect a crash dump if Breakpad is disabled. 160#define EXPECTED_CRASH_CRASHES 0 161#else 162#define EXPECTED_CRASH_CRASHES 1 163#endif 164 165#if defined(OS_CHROMEOS) 166// http://crbug.com/43115 167#define Crash DISABLED_Crash 168#elif defined(OS_MACOSX) 169// Crash service doesn't exist for the Mac yet: http://crbug.com/45243 170#define Crash DISABLED_Crash 171#endif 172// Launch the app in renderer crash test mode, then close the app. 173TEST_F(RendererCrashTest, Crash) { 174 if (ProxyLauncher::in_process_renderer()) { 175 // in process mode doesn't do the crashing. 176 expected_crashes_ = 0; 177 } else { 178 scoped_refptr<BrowserProxy> browser(automation()->GetBrowserWindow(0)); 179 ASSERT_TRUE(browser.get()); 180 ASSERT_TRUE(browser->WaitForTabCountToBecome(1)); 181 expected_crashes_ = EXPECTED_CRASH_CRASHES; 182 } 183} 184