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
23 class 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.
SaveEnvironmentVariable(std::string 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().
RestoreEnvironmentVariable()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.
TEST_F(ChromeLoggingTest,LogFileName)47 TEST_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.
TEST_F(ChromeLoggingTest,EnvironmentLogFileName)58 TEST_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.
79 class AssertionTest : public UITest {
80 protected:
AssertionTest()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
TEST_F(AssertionTest,Assertion)100 TEST_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
114 class CheckFalseTest : public UITest {
115 protected:
CheckFalseTest()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.
TEST_F(CheckFalseTest,CheckFails)135 TEST_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.
148 class RendererCrashTest : public UITest {
149 protected:
RendererCrashTest()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.
TEST_F(RendererCrashTest,Crash)173 TEST_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