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

Unified Diff: webkit/tools/test_shell/test_shell_main.cc

Issue 3105: Enforce Terminate on Heap Corruption in most of our executable on Windows XP ... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 12 years, 3 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « webkit/tools/test_shell/run_all_tests.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webkit/tools/test_shell/test_shell_main.cc
===================================================================
--- webkit/tools/test_shell/test_shell_main.cc (revision 2361)
+++ webkit/tools/test_shell/test_shell_main.cc (working copy)
@@ -19,6 +19,7 @@
#include "base/memory_debug.h"
#include "base/message_loop.h"
#include "base/path_service.h"
+#include "base/process_util.h"
#include "base/resource_util.h"
#include "base/stack_container.h"
#include "base/stats_table.h"
@@ -111,245 +112,245 @@
}
} // namespace
-int main(int argc, char* argv[])
-{
+int main(int argc, char* argv[]) {
+ process_util::EnableTerminationOnHeapCorruption();
#ifdef _CRTDBG_MAP_ALLOC
- _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR);
- _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
+ _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR);
+ _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
#endif
- // Some tests may use base::Singleton<>, thus we need to instanciate
- // the AtExitManager or else we will leak objects.
- base::AtExitManager at_exit_manager;
+ // Some tests may use base::Singleton<>, thus we need to instanciate
+ // the AtExitManager or else we will leak objects.
+ base::AtExitManager at_exit_manager;
- CommandLine parsed_command_line;
- if (parsed_command_line.HasSwitch(test_shell::kStartupDialog))
- MessageBox(NULL, L"attach to me?", L"test_shell", MB_OK);
- //webkit_glue::SetLayoutTestMode(true);
+ CommandLine parsed_command_line;
+ if (parsed_command_line.HasSwitch(test_shell::kStartupDialog))
+ MessageBox(NULL, L"attach to me?", L"test_shell", MB_OK);
+ //webkit_glue::SetLayoutTestMode(true);
- // Allocate a message loop for this thread. Although it is not used
- // directly, its constructor sets up some necessary state.
- MessageLoopForUI main_message_loop;
+ // Allocate a message loop for this thread. Although it is not used
+ // directly, its constructor sets up some necessary state.
+ MessageLoopForUI main_message_loop;
- bool suppress_error_dialogs =
- (GetEnvironmentVariable(L"CHROME_HEADLESS", NULL, 0) ||
- parsed_command_line.HasSwitch(test_shell::kNoErrorDialogs) ||
- parsed_command_line.HasSwitch(test_shell::kLayoutTests));
- TestShell::InitLogging(suppress_error_dialogs);
+ bool suppress_error_dialogs =
+ (GetEnvironmentVariable(L"CHROME_HEADLESS", NULL, 0) ||
+ parsed_command_line.HasSwitch(test_shell::kNoErrorDialogs) ||
+ parsed_command_line.HasSwitch(test_shell::kLayoutTests));
+ TestShell::InitLogging(suppress_error_dialogs);
- // Suppress abort message in v8 library in debugging mode.
- // V8 calls abort() when it hits assertion errors.
- if (suppress_error_dialogs) {
- _set_abort_behavior(0, _WRITE_ABORT_MSG);
- }
+ // Suppress abort message in v8 library in debugging mode.
+ // V8 calls abort() when it hits assertion errors.
+ if (suppress_error_dialogs) {
+ _set_abort_behavior(0, _WRITE_ABORT_MSG);
+ }
- if (parsed_command_line.HasSwitch(test_shell::kEnableTracing))
- base::TraceLog::StartTracing();
+ if (parsed_command_line.HasSwitch(test_shell::kEnableTracing))
+ base::TraceLog::StartTracing();
- // Make the selection of network stacks early on before any consumers try to
- // issue HTTP requests.
- if (parsed_command_line.HasSwitch(test_shell::kUseNewHttp))
- net::HttpNetworkLayer::UseWinHttp(false);
+ // Make the selection of network stacks early on before any consumers try to
+ // issue HTTP requests.
+ if (parsed_command_line.HasSwitch(test_shell::kUseNewHttp))
+ net::HttpNetworkLayer::UseWinHttp(false);
- bool layout_test_mode =
- parsed_command_line.HasSwitch(test_shell::kLayoutTests);
+ bool layout_test_mode =
+ parsed_command_line.HasSwitch(test_shell::kLayoutTests);
- net::HttpCache::Mode cache_mode = net::HttpCache::NORMAL;
- bool playback_mode =
- parsed_command_line.HasSwitch(test_shell::kPlaybackMode);
- bool record_mode =
- parsed_command_line.HasSwitch(test_shell::kRecordMode);
+ net::HttpCache::Mode cache_mode = net::HttpCache::NORMAL;
+ bool playback_mode =
+ parsed_command_line.HasSwitch(test_shell::kPlaybackMode);
+ bool record_mode =
+ parsed_command_line.HasSwitch(test_shell::kRecordMode);
- if (playback_mode)
- cache_mode = net::HttpCache::PLAYBACK;
- else if (record_mode)
- cache_mode = net::HttpCache::RECORD;
+ if (playback_mode)
+ cache_mode = net::HttpCache::PLAYBACK;
+ else if (record_mode)
+ cache_mode = net::HttpCache::RECORD;
- if (layout_test_mode ||
- parsed_command_line.HasSwitch(test_shell::kEnableFileCookies))
- net::CookieMonster::EnableFileScheme();
+ if (layout_test_mode ||
+ parsed_command_line.HasSwitch(test_shell::kEnableFileCookies))
+ net::CookieMonster::EnableFileScheme();
- std::wstring cache_path =
- parsed_command_line.GetSwitchValue(test_shell::kCacheDir);
- if (cache_path.empty()) {
- PathService::Get(base::DIR_EXE, &cache_path);
- file_util::AppendToPath(&cache_path, L"cache");
- }
+ std::wstring cache_path =
+ parsed_command_line.GetSwitchValue(test_shell::kCacheDir);
+ if (cache_path.empty()) {
+ PathService::Get(base::DIR_EXE, &cache_path);
+ file_util::AppendToPath(&cache_path, L"cache");
+ }
- // Initializing with a default context, which means no on-disk cookie DB,
- // and no support for directory listings.
- SimpleResourceLoaderBridge::Init(
- new TestShellRequestContext(cache_path, cache_mode));
+ // Initializing with a default context, which means no on-disk cookie DB,
+ // and no support for directory listings.
+ SimpleResourceLoaderBridge::Init(
+ new TestShellRequestContext(cache_path, cache_mode));
- // Load ICU data tables
- icu_util::Initialize();
+ // Load ICU data tables
+ icu_util::Initialize();
- // Config the network module so it has access to a limited set of resources.
- net::NetModule::SetResourceProvider(NetResourceProvider);
+ // Config the network module so it has access to a limited set of resources.
+ net::NetModule::SetResourceProvider(NetResourceProvider);
- INITCOMMONCONTROLSEX InitCtrlEx;
+ INITCOMMONCONTROLSEX InitCtrlEx;
- InitCtrlEx.dwSize = sizeof(INITCOMMONCONTROLSEX);
- InitCtrlEx.dwICC = ICC_STANDARD_CLASSES;
- InitCommonControlsEx(&InitCtrlEx);
+ InitCtrlEx.dwSize = sizeof(INITCOMMONCONTROLSEX);
+ InitCtrlEx.dwICC = ICC_STANDARD_CLASSES;
+ InitCommonControlsEx(&InitCtrlEx);
- bool interactive = !layout_test_mode;
- TestShell::InitializeTestShell(interactive);
+ bool interactive = !layout_test_mode;
+ TestShell::InitializeTestShell(interactive);
if (parsed_command_line.HasSwitch(test_shell::kAllowScriptsToCloseWindows))
TestShell::SetAllowScriptsToCloseWindows();
- // Disable user themes for layout tests so pixel tests are consistent.
- if (!interactive)
- gfx::NativeTheme::instance()->DisableTheming();
+ // Disable user themes for layout tests so pixel tests are consistent.
+ if (!interactive)
+ gfx::NativeTheme::instance()->DisableTheming();
- if (parsed_command_line.HasSwitch(test_shell::kTestShellTimeOut)) {
- const std::wstring timeout_str = parsed_command_line.GetSwitchValue(
- test_shell::kTestShellTimeOut);
- int timeout_ms = static_cast<int>(StringToInt64(timeout_str.c_str()));
- if (timeout_ms > 0)
- TestShell::SetFileTestTimeout(timeout_ms);
- }
+ if (parsed_command_line.HasSwitch(test_shell::kTestShellTimeOut)) {
+ const std::wstring timeout_str = parsed_command_line.GetSwitchValue(
+ test_shell::kTestShellTimeOut);
+ int timeout_ms = static_cast<int>(StringToInt64(timeout_str.c_str()));
+ if (timeout_ms > 0)
+ TestShell::SetFileTestTimeout(timeout_ms);
+ }
- // Initialize global strings
- TestShell::RegisterWindowClass();
+ // Initialize global strings
+ TestShell::RegisterWindowClass();
- // Treat the first loose value as the initial URL to open.
- std::wstring uri;
+ // Treat the first loose value as the initial URL to open.
+ std::wstring uri;
- // Default to a homepage if we're interactive.
- if (interactive) {
- PathService::Get(base::DIR_SOURCE_ROOT, &uri);
- file_util::AppendToPath(&uri, L"webkit");
- file_util::AppendToPath(&uri, L"data");
- file_util::AppendToPath(&uri, L"test_shell");
- file_util::AppendToPath(&uri, L"index.html");
- }
+ // Default to a homepage if we're interactive.
+ if (interactive) {
+ PathService::Get(base::DIR_SOURCE_ROOT, &uri);
+ file_util::AppendToPath(&uri, L"webkit");
+ file_util::AppendToPath(&uri, L"data");
+ file_util::AppendToPath(&uri, L"test_shell");
+ file_util::AppendToPath(&uri, L"index.html");
+ }
- if (parsed_command_line.GetLooseValueCount() > 0) {
- CommandLine::LooseValueIterator iter = parsed_command_line.GetLooseValuesBegin();
- uri = *iter;
- }
+ if (parsed_command_line.GetLooseValueCount() > 0) {
+ CommandLine::LooseValueIterator iter(
+ parsed_command_line.GetLooseValuesBegin());
+ uri = *iter;
+ }
- if (parsed_command_line.HasSwitch(test_shell::kCrashDumps)) {
- std::wstring dir = parsed_command_line.GetSwitchValue(test_shell::kCrashDumps);
- new google_breakpad::ExceptionHandler(dir, 0, &MinidumpCallback, 0, true);
- }
+ if (parsed_command_line.HasSwitch(test_shell::kCrashDumps)) {
+ std::wstring dir(
+ parsed_command_line.GetSwitchValue(test_shell::kCrashDumps));
+ new google_breakpad::ExceptionHandler(dir, 0, &MinidumpCallback, 0, true);
+ }
- std::wstring js_flags =
- parsed_command_line.GetSwitchValue(test_shell::kJavaScriptFlags);
- // Test shell always exposes the GC.
- CommandLine::AppendSwitch(&js_flags, L"expose-gc");
- webkit_glue::SetJavaScriptFlags(js_flags);
+ std::wstring js_flags =
+ parsed_command_line.GetSwitchValue(test_shell::kJavaScriptFlags);
+ // Test shell always exposes the GC.
+ CommandLine::AppendSwitch(&js_flags, L"expose-gc");
+ webkit_glue::SetJavaScriptFlags(js_flags);
- // load and initialize the stats table.
- StatsTable *table = new StatsTable(kStatsFile, kStatsFileThreads, kStatsFileCounters);
- StatsTable::set_current(table);
+ // load and initialize the stats table.
+ StatsTable *table = new StatsTable(kStatsFile, kStatsFileThreads, kStatsFileCounters);
+ StatsTable::set_current(table);
- TestShell* shell;
- if (TestShell::CreateNewWindow(uri, &shell)) {
- if (record_mode || playback_mode) {
- // Move the window to the upper left corner for consistent
- // record/playback mode. For automation, we want this to work
- // on build systems where the script invoking us is a background
- // process. So for this case, make our window the topmost window
- // as well.
- ForegroundHelper::SetForeground(shell->mainWnd());
- ::SetWindowPos(shell->mainWnd(), HWND_TOP, 0, 0, 600, 800, 0);
- // Tell webkit as well.
- webkit_glue::SetRecordPlaybackMode(true);
- }
+ TestShell* shell;
+ if (TestShell::CreateNewWindow(uri, &shell)) {
+ if (record_mode || playback_mode) {
+ // Move the window to the upper left corner for consistent
+ // record/playback mode. For automation, we want this to work
+ // on build systems where the script invoking us is a background
+ // process. So for this case, make our window the topmost window
+ // as well.
+ ForegroundHelper::SetForeground(shell->mainWnd());
+ ::SetWindowPos(shell->mainWnd(), HWND_TOP, 0, 0, 600, 800, 0);
+ // Tell webkit as well.
+ webkit_glue::SetRecordPlaybackMode(true);
+ }
- shell->Show(shell->webView(), NEW_WINDOW);
+ shell->Show(shell->webView(), NEW_WINDOW);
- if (parsed_command_line.HasSwitch(test_shell::kDumpStatsTable))
- shell->DumpStatsTableOnExit();
+ if (parsed_command_line.HasSwitch(test_shell::kDumpStatsTable))
+ shell->DumpStatsTableOnExit();
- bool no_events = parsed_command_line.HasSwitch(test_shell::kNoEvents);
- if ((record_mode || playback_mode) && !no_events) {
- std::wstring script_path = cache_path;
- // Create the cache directory in case it doesn't exist.
- file_util::CreateDirectory(cache_path);
- file_util::AppendToPath(&script_path, L"script.log");
- if (record_mode)
- base::EventRecorder::current()->StartRecording(script_path);
- if (playback_mode)
- base::EventRecorder::current()->StartPlayback(script_path);
- }
+ bool no_events = parsed_command_line.HasSwitch(test_shell::kNoEvents);
+ if ((record_mode || playback_mode) && !no_events) {
+ std::wstring script_path = cache_path;
+ // Create the cache directory in case it doesn't exist.
+ file_util::CreateDirectory(cache_path);
+ file_util::AppendToPath(&script_path, L"script.log");
+ if (record_mode)
+ base::EventRecorder::current()->StartRecording(script_path);
+ if (playback_mode)
+ base::EventRecorder::current()->StartPlayback(script_path);
+ }
- if (parsed_command_line.HasSwitch(test_shell::kDebugMemoryInUse)) {
- base::MemoryDebug::SetMemoryInUseEnabled(true);
- // Dump all in use memory at startup
- base::MemoryDebug::DumpAllMemoryInUse();
- }
+ if (parsed_command_line.HasSwitch(test_shell::kDebugMemoryInUse)) {
+ base::MemoryDebug::SetMemoryInUseEnabled(true);
+ // Dump all in use memory at startup
+ base::MemoryDebug::DumpAllMemoryInUse();
+ }
- // See if we need to run the tests.
- if (layout_test_mode) {
- webkit_glue::SetLayoutTestMode(true);
+ // See if we need to run the tests.
+ if (layout_test_mode) {
+ webkit_glue::SetLayoutTestMode(true);
- // Set up for the kind of test requested.
- TestShell::TestParams params;
- if (parsed_command_line.HasSwitch(test_shell::kDumpPixels)) {
- // The pixel test flag also gives the image file name to use.
- params.dump_pixels = true;
- params.pixel_file_name = parsed_command_line.GetSwitchValue(
- test_shell::kDumpPixels);
- if (params.pixel_file_name.size() == 0) {
- fprintf(stderr, "No file specified for pixel tests");
- exit(1);
- }
- }
- if (parsed_command_line.HasSwitch(test_shell::kNoTree)) {
- params.dump_tree = false;
- }
+ // Set up for the kind of test requested.
+ TestShell::TestParams params;
+ if (parsed_command_line.HasSwitch(test_shell::kDumpPixels)) {
+ // The pixel test flag also gives the image file name to use.
+ params.dump_pixels = true;
+ params.pixel_file_name = parsed_command_line.GetSwitchValue(
+ test_shell::kDumpPixels);
+ if (params.pixel_file_name.size() == 0) {
+ fprintf(stderr, "No file specified for pixel tests");
+ exit(1);
+ }
+ }
+ if (parsed_command_line.HasSwitch(test_shell::kNoTree)) {
+ params.dump_tree = false;
+ }
- if (uri.length() == 0) {
- // Watch stdin for URLs.
- char filenameBuffer[2048];
- while (fgets(filenameBuffer, sizeof(filenameBuffer), stdin)) {
- char *newLine = strchr(filenameBuffer, '\n');
- if (newLine)
- *newLine = '\0';
- if (!*filenameBuffer)
- continue;
+ if (uri.length() == 0) {
+ // Watch stdin for URLs.
+ char filenameBuffer[2048];
+ while (fgets(filenameBuffer, sizeof(filenameBuffer), stdin)) {
+ char *newLine = strchr(filenameBuffer, '\n');
+ if (newLine)
+ *newLine = '\0';
+ if (!*filenameBuffer)
+ continue;
- SetCurrentTestName(filenameBuffer);
+ SetCurrentTestName(filenameBuffer);
- if (!TestShell::RunFileTest(filenameBuffer, params))
- break;
- }
- } else {
- TestShell::RunFileTest(WideToUTF8(uri).c_str(), params);
- }
-
- shell->CallJSGC();
- shell->CallJSGC();
- if (shell) delete shell;
- } else {
- MessageLoop::current()->Run();
+ if (!TestShell::RunFileTest(filenameBuffer, params))
+ break;
}
+ } else {
+ TestShell::RunFileTest(WideToUTF8(uri).c_str(), params);
+ }
- // Flush any remaining messages. This ensures that any accumulated
- // Task objects get destroyed before we exit, which avoids noise in
- // purify leak-test results.
- MessageLoop::current()->RunAllPending();
-
- if (record_mode)
- base::EventRecorder::current()->StopRecording();
- if (playback_mode)
- base::EventRecorder::current()->StopPlayback();
+ shell->CallJSGC();
+ shell->CallJSGC();
+ if (shell) delete shell;
+ } else {
+ MessageLoop::current()->Run();
}
- TestShell::ShutdownTestShell();
- TestShell::CleanupLogging();
+ // Flush any remaining messages. This ensures that any accumulated
+ // Task objects get destroyed before we exit, which avoids noise in
+ // purify leak-test results.
+ MessageLoop::current()->RunAllPending();
- // Tear down shared StatsTable; prevents unit_tests from leaking it.
- StatsTable::set_current(NULL);
- delete table;
+ if (record_mode)
+ base::EventRecorder::current()->StopRecording();
+ if (playback_mode)
+ base::EventRecorder::current()->StopPlayback();
+ }
+ TestShell::ShutdownTestShell();
+ TestShell::CleanupLogging();
+
+ // Tear down shared StatsTable; prevents unit_tests from leaking it.
+ StatsTable::set_current(NULL);
+ delete table;
+
#ifdef _CRTDBG_MAP_ALLOC
- _CrtDumpMemoryLeaks();
+ _CrtDumpMemoryLeaks();
#endif
- return 0;
+ return 0;
}
-
-
« no previous file with comments | « webkit/tools/test_shell/run_all_tests.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698