OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/test/test_suite.h" | 5 #include "base/test/test_suite.h" |
6 | 6 |
7 #include "base/at_exit.h" | 7 #include "base/at_exit.h" |
8 #include "base/base_paths.h" | 8 #include "base/base_paths.h" |
9 #include "base/base_switches.h" | 9 #include "base/base_switches.h" |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
44 #endif | 44 #endif |
45 | 45 |
46 #if defined(OS_ANDROID) | 46 #if defined(OS_ANDROID) |
47 #include "base/test/test_support_android.h" | 47 #include "base/test/test_support_android.h" |
48 #endif | 48 #endif |
49 | 49 |
50 #if defined(OS_IOS) | 50 #if defined(OS_IOS) |
51 #include "base/test/test_support_ios.h" | 51 #include "base/test/test_support_ios.h" |
52 #endif | 52 #endif |
53 | 53 |
| 54 namespace base { |
| 55 |
54 namespace { | 56 namespace { |
55 | 57 |
56 class MaybeTestDisabler : public testing::EmptyTestEventListener { | 58 class MaybeTestDisabler : public testing::EmptyTestEventListener { |
57 public: | 59 public: |
58 void OnTestStart(const testing::TestInfo& test_info) override { | 60 void OnTestStart(const testing::TestInfo& test_info) override { |
59 ASSERT_FALSE(TestSuite::IsMarkedMaybe(test_info)) | 61 ASSERT_FALSE(TestSuite::IsMarkedMaybe(test_info)) |
60 << "Probably the OS #ifdefs don't include all of the necessary " | 62 << "Probably the OS #ifdefs don't include all of the necessary " |
61 "platforms.\nPlease ensure that no tests have the MAYBE_ prefix " | 63 "platforms.\nPlease ensure that no tests have the MAYBE_ prefix " |
62 "after the code is preprocessed."; | 64 "after the code is preprocessed."; |
63 } | 65 } |
64 }; | 66 }; |
65 | 67 |
66 class TestClientInitializer : public testing::EmptyTestEventListener { | 68 class TestClientInitializer : public testing::EmptyTestEventListener { |
67 public: | 69 public: |
68 TestClientInitializer() | 70 TestClientInitializer() |
69 : old_command_line_(base::CommandLine::NO_PROGRAM) { | 71 : old_command_line_(CommandLine::NO_PROGRAM) { |
70 } | 72 } |
71 | 73 |
72 void OnTestStart(const testing::TestInfo& test_info) override { | 74 void OnTestStart(const testing::TestInfo& test_info) override { |
73 old_command_line_ = *base::CommandLine::ForCurrentProcess(); | 75 old_command_line_ = *CommandLine::ForCurrentProcess(); |
74 } | 76 } |
75 | 77 |
76 void OnTestEnd(const testing::TestInfo& test_info) override { | 78 void OnTestEnd(const testing::TestInfo& test_info) override { |
77 *base::CommandLine::ForCurrentProcess() = old_command_line_; | 79 *CommandLine::ForCurrentProcess() = old_command_line_; |
78 } | 80 } |
79 | 81 |
80 private: | 82 private: |
81 base::CommandLine old_command_line_; | 83 CommandLine old_command_line_; |
82 | 84 |
83 DISALLOW_COPY_AND_ASSIGN(TestClientInitializer); | 85 DISALLOW_COPY_AND_ASSIGN(TestClientInitializer); |
84 }; | 86 }; |
85 | 87 |
86 } // namespace | 88 } // namespace |
87 | 89 |
88 namespace base { | |
89 | |
90 int RunUnitTestsUsingBaseTestSuite(int argc, char **argv) { | 90 int RunUnitTestsUsingBaseTestSuite(int argc, char **argv) { |
91 TestSuite test_suite(argc, argv); | 91 TestSuite test_suite(argc, argv); |
92 return base::LaunchUnitTests( | 92 return LaunchUnitTests(argc, argv, |
93 argc, argv, Bind(&TestSuite::Run, Unretained(&test_suite))); | 93 Bind(&TestSuite::Run, Unretained(&test_suite))); |
94 } | 94 } |
95 | 95 |
96 } // namespace base | |
97 | |
98 TestSuite::TestSuite(int argc, char** argv) : initialized_command_line_(false) { | 96 TestSuite::TestSuite(int argc, char** argv) : initialized_command_line_(false) { |
99 PreInitialize(true); | 97 PreInitialize(true); |
100 InitializeFromCommandLine(argc, argv); | 98 InitializeFromCommandLine(argc, argv); |
101 } | 99 } |
102 | 100 |
103 #if defined(OS_WIN) | 101 #if defined(OS_WIN) |
104 TestSuite::TestSuite(int argc, wchar_t** argv) | 102 TestSuite::TestSuite(int argc, wchar_t** argv) |
105 : initialized_command_line_(false) { | 103 : initialized_command_line_(false) { |
106 PreInitialize(true); | 104 PreInitialize(true); |
107 InitializeFromCommandLine(argc, argv); | 105 InitializeFromCommandLine(argc, argv); |
108 } | 106 } |
109 #endif // defined(OS_WIN) | 107 #endif // defined(OS_WIN) |
110 | 108 |
111 TestSuite::TestSuite(int argc, char** argv, bool create_at_exit_manager) | 109 TestSuite::TestSuite(int argc, char** argv, bool create_at_exit_manager) |
112 : initialized_command_line_(false) { | 110 : initialized_command_line_(false) { |
113 PreInitialize(create_at_exit_manager); | 111 PreInitialize(create_at_exit_manager); |
114 InitializeFromCommandLine(argc, argv); | 112 InitializeFromCommandLine(argc, argv); |
115 } | 113 } |
116 | 114 |
117 TestSuite::~TestSuite() { | 115 TestSuite::~TestSuite() { |
118 if (initialized_command_line_) | 116 if (initialized_command_line_) |
119 base::CommandLine::Reset(); | 117 CommandLine::Reset(); |
120 } | 118 } |
121 | 119 |
122 void TestSuite::InitializeFromCommandLine(int argc, char** argv) { | 120 void TestSuite::InitializeFromCommandLine(int argc, char** argv) { |
123 initialized_command_line_ = base::CommandLine::Init(argc, argv); | 121 initialized_command_line_ = CommandLine::Init(argc, argv); |
124 testing::InitGoogleTest(&argc, argv); | 122 testing::InitGoogleTest(&argc, argv); |
125 testing::InitGoogleMock(&argc, argv); | 123 testing::InitGoogleMock(&argc, argv); |
126 | 124 |
127 #if defined(OS_IOS) | 125 #if defined(OS_IOS) |
128 InitIOSRunHook(this, argc, argv); | 126 InitIOSRunHook(this, argc, argv); |
129 #endif | 127 #endif |
130 } | 128 } |
131 | 129 |
132 #if defined(OS_WIN) | 130 #if defined(OS_WIN) |
133 void TestSuite::InitializeFromCommandLine(int argc, wchar_t** argv) { | 131 void TestSuite::InitializeFromCommandLine(int argc, wchar_t** argv) { |
134 // Windows CommandLine::Init ignores argv anyway. | 132 // Windows CommandLine::Init ignores argv anyway. |
135 initialized_command_line_ = base::CommandLine::Init(argc, NULL); | 133 initialized_command_line_ = CommandLine::Init(argc, NULL); |
136 testing::InitGoogleTest(&argc, argv); | 134 testing::InitGoogleTest(&argc, argv); |
137 testing::InitGoogleMock(&argc, argv); | 135 testing::InitGoogleMock(&argc, argv); |
138 } | 136 } |
139 #endif // defined(OS_WIN) | 137 #endif // defined(OS_WIN) |
140 | 138 |
141 void TestSuite::PreInitialize(bool create_at_exit_manager) { | 139 void TestSuite::PreInitialize(bool create_at_exit_manager) { |
142 #if defined(OS_WIN) | 140 #if defined(OS_WIN) |
143 testing::GTEST_FLAG(catch_exceptions) = false; | 141 testing::GTEST_FLAG(catch_exceptions) = false; |
144 #endif | 142 #endif |
145 base::EnableTerminationOnHeapCorruption(); | 143 EnableTerminationOnHeapCorruption(); |
146 #if defined(OS_LINUX) && defined(USE_AURA) | 144 #if defined(OS_LINUX) && defined(USE_AURA) |
147 // When calling native char conversion functions (e.g wrctomb) we need to | 145 // When calling native char conversion functions (e.g wrctomb) we need to |
148 // have the locale set. In the absence of such a call the "C" locale is the | 146 // have the locale set. In the absence of such a call the "C" locale is the |
149 // default. In the gtk code (below) gtk_init() implicitly sets a locale. | 147 // default. In the gtk code (below) gtk_init() implicitly sets a locale. |
150 setlocale(LC_ALL, ""); | 148 setlocale(LC_ALL, ""); |
151 #endif // defined(OS_LINUX) && defined(USE_AURA) | 149 #endif // defined(OS_LINUX) && defined(USE_AURA) |
152 | 150 |
153 // On Android, AtExitManager is created in | 151 // On Android, AtExitManager is created in |
154 // testing/android/native_test_wrapper.cc before main() is called. | 152 // testing/android/native_test_wrapper.cc before main() is called. |
155 #if !defined(OS_ANDROID) | 153 #if !defined(OS_ANDROID) |
156 if (create_at_exit_manager) | 154 if (create_at_exit_manager) |
157 at_exit_manager_.reset(new base::AtExitManager); | 155 at_exit_manager_.reset(new AtExitManager); |
158 #endif | 156 #endif |
159 | 157 |
160 // Don't add additional code to this function. Instead add it to | 158 // Don't add additional code to this function. Instead add it to |
161 // Initialize(). See bug 6436. | 159 // Initialize(). See bug 6436. |
162 } | 160 } |
163 | 161 |
164 | 162 |
165 // static | 163 // static |
166 bool TestSuite::IsMarkedMaybe(const testing::TestInfo& test) { | 164 bool TestSuite::IsMarkedMaybe(const testing::TestInfo& test) { |
167 return strncmp(test.name(), "MAYBE_", 6) == 0; | 165 return strncmp(test.name(), "MAYBE_", 6) == 0; |
168 } | 166 } |
169 | 167 |
170 void TestSuite::CatchMaybeTests() { | 168 void TestSuite::CatchMaybeTests() { |
171 testing::TestEventListeners& listeners = | 169 testing::TestEventListeners& listeners = |
172 testing::UnitTest::GetInstance()->listeners(); | 170 testing::UnitTest::GetInstance()->listeners(); |
173 listeners.Append(new MaybeTestDisabler); | 171 listeners.Append(new MaybeTestDisabler); |
174 } | 172 } |
175 | 173 |
176 void TestSuite::ResetCommandLine() { | 174 void TestSuite::ResetCommandLine() { |
177 testing::TestEventListeners& listeners = | 175 testing::TestEventListeners& listeners = |
178 testing::UnitTest::GetInstance()->listeners(); | 176 testing::UnitTest::GetInstance()->listeners(); |
179 listeners.Append(new TestClientInitializer); | 177 listeners.Append(new TestClientInitializer); |
180 } | 178 } |
181 | 179 |
182 void TestSuite::AddTestLauncherResultPrinter() { | 180 void TestSuite::AddTestLauncherResultPrinter() { |
183 // Only add the custom printer if requested. | 181 // Only add the custom printer if requested. |
184 if (!base::CommandLine::ForCurrentProcess()->HasSwitch( | 182 if (!CommandLine::ForCurrentProcess()->HasSwitch( |
185 switches::kTestLauncherOutput)) { | 183 switches::kTestLauncherOutput)) { |
186 return; | 184 return; |
187 } | 185 } |
188 | 186 |
189 FilePath output_path(base::CommandLine::ForCurrentProcess()-> | 187 FilePath output_path(CommandLine::ForCurrentProcess()->GetSwitchValuePath( |
190 GetSwitchValuePath(switches::kTestLauncherOutput)); | 188 switches::kTestLauncherOutput)); |
191 | 189 |
192 // Do not add the result printer if output path already exists. It's an | 190 // Do not add the result printer if output path already exists. It's an |
193 // indicator there is a process printing to that file, and we're likely | 191 // indicator there is a process printing to that file, and we're likely |
194 // its child. Do not clobber the results in that case. | 192 // its child. Do not clobber the results in that case. |
195 if (PathExists(output_path)) { | 193 if (PathExists(output_path)) { |
196 LOG(WARNING) << "Test launcher output path " << output_path.AsUTF8Unsafe() | 194 LOG(WARNING) << "Test launcher output path " << output_path.AsUTF8Unsafe() |
197 << " exists. Not adding test launcher result printer."; | 195 << " exists. Not adding test launcher result printer."; |
198 return; | 196 return; |
199 } | 197 } |
200 | 198 |
201 XmlUnitTestResultPrinter* printer = new XmlUnitTestResultPrinter; | 199 XmlUnitTestResultPrinter* printer = new XmlUnitTestResultPrinter; |
202 CHECK(printer->Initialize(output_path)); | 200 CHECK(printer->Initialize(output_path)); |
203 testing::TestEventListeners& listeners = | 201 testing::TestEventListeners& listeners = |
204 testing::UnitTest::GetInstance()->listeners(); | 202 testing::UnitTest::GetInstance()->listeners(); |
205 listeners.Append(printer); | 203 listeners.Append(printer); |
206 } | 204 } |
207 | 205 |
208 // Don't add additional code to this method. Instead add it to | 206 // Don't add additional code to this method. Instead add it to |
209 // Initialize(). See bug 6436. | 207 // Initialize(). See bug 6436. |
210 int TestSuite::Run() { | 208 int TestSuite::Run() { |
211 #if defined(OS_IOS) | 209 #if defined(OS_IOS) |
212 RunTestsFromIOSApp(); | 210 RunTestsFromIOSApp(); |
213 #endif | 211 #endif |
214 | 212 |
215 #if defined(OS_MACOSX) | 213 #if defined(OS_MACOSX) |
216 base::mac::ScopedNSAutoreleasePool scoped_pool; | 214 mac::ScopedNSAutoreleasePool scoped_pool; |
217 #endif | 215 #endif |
218 | 216 |
219 Initialize(); | 217 Initialize(); |
220 std::string client_func = | 218 std::string client_func = |
221 base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( | 219 CommandLine::ForCurrentProcess()->GetSwitchValueASCII( |
222 switches::kTestChildProcess); | 220 switches::kTestChildProcess); |
223 | 221 |
224 // Check to see if we are being run as a client process. | 222 // Check to see if we are being run as a client process. |
225 if (!client_func.empty()) | 223 if (!client_func.empty()) |
226 return multi_process_function_list::InvokeChildProcessTest(client_func); | 224 return multi_process_function_list::InvokeChildProcessTest(client_func); |
227 #if defined(OS_IOS) | 225 #if defined(OS_IOS) |
228 base::test_listener_ios::RegisterTestEndListener(); | 226 test_listener_ios::RegisterTestEndListener(); |
229 #endif | 227 #endif |
230 int result = RUN_ALL_TESTS(); | 228 int result = RUN_ALL_TESTS(); |
231 | 229 |
232 #if defined(OS_MACOSX) | 230 #if defined(OS_MACOSX) |
233 // This MUST happen before Shutdown() since Shutdown() tears down | 231 // This MUST happen before Shutdown() since Shutdown() tears down |
234 // objects (such as NotificationService::current()) that Cocoa | 232 // objects (such as NotificationService::current()) that Cocoa |
235 // objects use to remove themselves as observers. | 233 // objects use to remove themselves as observers. |
236 scoped_pool.Recycle(); | 234 scoped_pool.Recycle(); |
237 #endif | 235 #endif |
238 | 236 |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
278 // TODO(hbono): remove this code when gtest has it. | 276 // TODO(hbono): remove this code when gtest has it. |
279 // http://groups.google.com/d/topic/googletestframework/OjuwNlXy5ac/discussion | 277 // http://groups.google.com/d/topic/googletestframework/OjuwNlXy5ac/discussion |
280 _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG); | 278 _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG); |
281 _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR); | 279 _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR); |
282 #endif // defined(_DEBUG) && defined(_HAS_EXCEPTIONS) && (_HAS_EXCEPTIONS == 1) | 280 #endif // defined(_DEBUG) && defined(_HAS_EXCEPTIONS) && (_HAS_EXCEPTIONS == 1) |
283 #endif // defined(OS_WIN) | 281 #endif // defined(OS_WIN) |
284 } | 282 } |
285 | 283 |
286 void TestSuite::Initialize() { | 284 void TestSuite::Initialize() { |
287 #if !defined(OS_IOS) | 285 #if !defined(OS_IOS) |
288 if (base::CommandLine::ForCurrentProcess()->HasSwitch( | 286 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kWaitForDebugger)) { |
289 switches::kWaitForDebugger)) { | 287 debug::WaitForDebugger(60, true); |
290 base::debug::WaitForDebugger(60, true); | |
291 } | 288 } |
292 #endif | 289 #endif |
293 | 290 |
294 #if defined(OS_IOS) | 291 #if defined(OS_IOS) |
295 InitIOSTestMessageLoop(); | 292 InitIOSTestMessageLoop(); |
296 #endif // OS_IOS | 293 #endif // OS_IOS |
297 | 294 |
298 #if defined(OS_ANDROID) | 295 #if defined(OS_ANDROID) |
299 InitAndroidTest(); | 296 InitAndroidTest(); |
300 #else | 297 #else |
301 // Initialize logging. | 298 // Initialize logging. |
302 base::FilePath exe; | 299 FilePath exe; |
303 PathService::Get(base::FILE_EXE, &exe); | 300 PathService::Get(FILE_EXE, &exe); |
304 base::FilePath log_filename = exe.ReplaceExtension(FILE_PATH_LITERAL("log")); | 301 FilePath log_filename = exe.ReplaceExtension(FILE_PATH_LITERAL("log")); |
305 logging::LoggingSettings settings; | 302 logging::LoggingSettings settings; |
306 settings.logging_dest = logging::LOG_TO_ALL; | 303 settings.logging_dest = logging::LOG_TO_ALL; |
307 settings.log_file = log_filename.value().c_str(); | 304 settings.log_file = log_filename.value().c_str(); |
308 settings.delete_old = logging::DELETE_OLD_LOG_FILE; | 305 settings.delete_old = logging::DELETE_OLD_LOG_FILE; |
309 logging::InitLogging(settings); | 306 logging::InitLogging(settings); |
310 // We want process and thread IDs because we may have multiple processes. | 307 // We want process and thread IDs because we may have multiple processes. |
311 // Note: temporarily enabled timestamps in an effort to catch bug 6361. | 308 // Note: temporarily enabled timestamps in an effort to catch bug 6361. |
312 logging::SetLogItems(true, true, true, true); | 309 logging::SetLogItems(true, true, true, true); |
313 #endif // else defined(OS_ANDROID) | 310 #endif // else defined(OS_ANDROID) |
314 | 311 |
315 CHECK(base::debug::EnableInProcessStackDumping()); | 312 CHECK(debug::EnableInProcessStackDumping()); |
316 #if defined(OS_WIN) | 313 #if defined(OS_WIN) |
317 // Make sure we run with high resolution timer to minimize differences | 314 // Make sure we run with high resolution timer to minimize differences |
318 // between production code and test code. | 315 // between production code and test code. |
319 base::Time::EnableHighResolutionTimer(true); | 316 Time::EnableHighResolutionTimer(true); |
320 #endif // defined(OS_WIN) | 317 #endif // defined(OS_WIN) |
321 | 318 |
322 // In some cases, we do not want to see standard error dialogs. | 319 // In some cases, we do not want to see standard error dialogs. |
323 if (!base::debug::BeingDebugged() && | 320 if (!debug::BeingDebugged() && |
324 !base::CommandLine::ForCurrentProcess()->HasSwitch( | 321 !CommandLine::ForCurrentProcess()->HasSwitch("show-error-dialogs")) { |
325 "show-error-dialogs")) { | |
326 SuppressErrorDialogs(); | 322 SuppressErrorDialogs(); |
327 base::debug::SetSuppressDebugUI(true); | 323 debug::SetSuppressDebugUI(true); |
328 logging::SetLogAssertHandler(UnitTestAssertHandler); | 324 logging::SetLogAssertHandler(UnitTestAssertHandler); |
329 } | 325 } |
330 | 326 |
331 base::i18n::InitializeICU(); | 327 i18n::InitializeICU(); |
332 // On the Mac OS X command line, the default locale is *_POSIX. In Chromium, | 328 // On the Mac OS X command line, the default locale is *_POSIX. In Chromium, |
333 // the locale is set via an OS X locale API and is never *_POSIX. | 329 // the locale is set via an OS X locale API and is never *_POSIX. |
334 // Some tests (such as those involving word break iterator) will behave | 330 // Some tests (such as those involving word break iterator) will behave |
335 // differently and fail if we use *POSIX locale. Setting it to en_US here | 331 // differently and fail if we use *POSIX locale. Setting it to en_US here |
336 // does not affect tests that explicitly overrides the locale for testing. | 332 // does not affect tests that explicitly overrides the locale for testing. |
337 // This can be an issue on all platforms other than Windows. | 333 // This can be an issue on all platforms other than Windows. |
338 // TODO(jshin): Should we set the locale via an OS X locale API here? | 334 // TODO(jshin): Should we set the locale via an OS X locale API here? |
339 #if !defined(OS_WIN) | 335 #if !defined(OS_WIN) |
340 #if defined(OS_IOS) | 336 #if defined(OS_IOS) |
341 base::i18n::SetICUDefaultLocale("en_US"); | 337 i18n::SetICUDefaultLocale("en_US"); |
342 #else | 338 #else |
343 std::string default_locale(uloc_getDefault()); | 339 std::string default_locale(uloc_getDefault()); |
344 if (EndsWith(default_locale, "POSIX", false)) | 340 if (EndsWith(default_locale, "POSIX", false)) |
345 base::i18n::SetICUDefaultLocale("en_US"); | 341 i18n::SetICUDefaultLocale("en_US"); |
346 #endif | 342 #endif |
347 #endif | 343 #endif |
348 | 344 |
349 CatchMaybeTests(); | 345 CatchMaybeTests(); |
350 ResetCommandLine(); | 346 ResetCommandLine(); |
351 AddTestLauncherResultPrinter(); | 347 AddTestLauncherResultPrinter(); |
352 | 348 |
353 TestTimeouts::Initialize(); | 349 TestTimeouts::Initialize(); |
354 | 350 |
355 trace_to_file_.BeginTracingFromCommandLineOptions(); | 351 trace_to_file_.BeginTracingFromCommandLineOptions(); |
356 } | 352 } |
357 | 353 |
358 void TestSuite::Shutdown() { | 354 void TestSuite::Shutdown() { |
359 } | 355 } |
| 356 |
| 357 } // namespace base |
OLD | NEW |