OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 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 | 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 // This is a simple application that stress-tests the crash recovery of the disk | 5 // This is a simple application that stress-tests the crash recovery of the disk |
6 // cache. The main application starts a copy of itself on a loop, checking the | 6 // cache. The main application starts a copy of itself on a loop, checking the |
7 // exit code of the child process. When the child dies in an unexpected way, | 7 // exit code of the child process. When the child dies in an unexpected way, |
8 // the main application quits. | 8 // the main application quits. |
9 | 9 |
10 // The child application has two threads: one to exercise the cache in an | 10 // The child application has two threads: one to exercise the cache in an |
11 // infinite loop, and another one to asynchronously kill the process. | 11 // infinite loop, and another one to asynchronously kill the process. |
12 | 12 |
13 // A regular build should never crash. | 13 // A regular build should never crash. |
14 // To test that the disk cache doesn't generate critical errors with regular | 14 // To test that the disk cache doesn't generate critical errors with regular |
15 // application level crashes, add the following code and re-compile: | 15 // application level crashes, add the following code and re-compile: |
16 // | 16 // |
17 // void BackendImpl::CriticalError(int error) { | 17 // void BackendImpl::CriticalError(int error) { |
18 // NOTREACHED(); | 18 // NOTREACHED(); |
19 // | 19 // |
20 // void BackendImpl::ReportError(int error) { | 20 // void BackendImpl::ReportError(int error) { |
21 // if (error && error != ERR_PREVIOUS_CRASH) { | 21 // if (error && error != ERR_PREVIOUS_CRASH) { |
22 // NOTREACHED(); | 22 // NOTREACHED(); |
23 // } | 23 // } |
24 | 24 |
25 #include <string> | 25 #include <string> |
26 #include <vector> | 26 #include <vector> |
27 | 27 |
28 #include "base/at_exit.h" | 28 #include "base/at_exit.h" |
29 #include "base/command_line.h" | 29 #include "base/command_line.h" |
30 #include "base/debug_util.h" | 30 #include "base/debug/debugger.h" |
31 #include "base/file_path.h" | 31 #include "base/file_path.h" |
32 #include "base/logging.h" | 32 #include "base/logging.h" |
33 #include "base/message_loop.h" | 33 #include "base/message_loop.h" |
34 #include "base/path_service.h" | 34 #include "base/path_service.h" |
35 #include "base/platform_thread.h" | 35 #include "base/platform_thread.h" |
36 #include "base/process_util.h" | 36 #include "base/process_util.h" |
37 #include "base/string_number_conversions.h" | 37 #include "base/string_number_conversions.h" |
38 #include "base/string_util.h" | 38 #include "base/string_util.h" |
39 #include "base/thread.h" | 39 #include "base/thread.h" |
40 #include "base/utf_string_conversions.h" | 40 #include "base/utf_string_conversions.h" |
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
206 base::Thread* thread = new base::Thread("party_crasher"); | 206 base::Thread* thread = new base::Thread("party_crasher"); |
207 if (!thread->Start()) | 207 if (!thread->Start()) |
208 return false; | 208 return false; |
209 | 209 |
210 CrashTask::RunSoon(thread->message_loop()); | 210 CrashTask::RunSoon(thread->message_loop()); |
211 return true; | 211 return true; |
212 } | 212 } |
213 | 213 |
214 void CrashHandler(const std::string& str) { | 214 void CrashHandler(const std::string& str) { |
215 g_crashing = true; | 215 g_crashing = true; |
216 DebugUtil::BreakDebugger(); | 216 base::debug::BreakDebugger(); |
217 } | 217 } |
218 | 218 |
219 // ----------------------------------------------------------------------- | 219 // ----------------------------------------------------------------------- |
220 | 220 |
221 int main(int argc, const char* argv[]) { | 221 int main(int argc, const char* argv[]) { |
222 // Setup an AtExitManager so Singleton objects will be destructed. | 222 // Setup an AtExitManager so Singleton objects will be destructed. |
223 base::AtExitManager at_exit_manager; | 223 base::AtExitManager at_exit_manager; |
224 | 224 |
225 if (argc < 2) | 225 if (argc < 2) |
226 return MasterCode(); | 226 return MasterCode(); |
227 | 227 |
228 logging::SetLogAssertHandler(CrashHandler); | 228 logging::SetLogAssertHandler(CrashHandler); |
229 | 229 |
230 // Some time for the memory manager to flush stuff. | 230 // Some time for the memory manager to flush stuff. |
231 PlatformThread::Sleep(3000); | 231 PlatformThread::Sleep(3000); |
232 MessageLoop message_loop(MessageLoop::TYPE_IO); | 232 MessageLoop message_loop(MessageLoop::TYPE_IO); |
233 | 233 |
234 char* end; | 234 char* end; |
235 long int iteration = strtol(argv[1], &end, 0); | 235 long int iteration = strtol(argv[1], &end, 0); |
236 | 236 |
237 if (!StartCrashThread()) { | 237 if (!StartCrashThread()) { |
238 printf("failed to start thread\n"); | 238 printf("failed to start thread\n"); |
239 return kError; | 239 return kError; |
240 } | 240 } |
241 | 241 |
242 StressTheCache(iteration); | 242 StressTheCache(iteration); |
243 return 0; | 243 return 0; |
244 } | 244 } |
OLD | NEW |