mirror of
https://git.suyu.dev/suyu/breakpad.git
synced 2026-03-05 20:16:32 +00:00
Allow option for efficient and safe opt out of in-proc dump generation for Windows breakpad clients.
https://breakpad.appspot.com/549002/ git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@1157 4c0a9323-5329-0410-9bdc-e9ce6186880e
This commit is contained in:
@@ -54,6 +54,11 @@ const char kFailureIndicator[] = "failure";
|
||||
// Utility function to test for a path's existence.
|
||||
BOOL DoesPathExist(const TCHAR *path_name);
|
||||
|
||||
enum OutOfProcGuarantee {
|
||||
OUT_OF_PROC_GUARANTEED,
|
||||
OUT_OF_PROC_BEST_EFFORT,
|
||||
};
|
||||
|
||||
class ExceptionHandlerDeathTest : public ::testing::Test {
|
||||
protected:
|
||||
// Member variable for each test that they can use
|
||||
@@ -62,7 +67,7 @@ class ExceptionHandlerDeathTest : public ::testing::Test {
|
||||
// Actually constructs a temp path name.
|
||||
virtual void SetUp();
|
||||
// A helper method that tests can use to crash.
|
||||
void DoCrashAccessViolation();
|
||||
void DoCrashAccessViolation(const OutOfProcGuarantee out_of_proc_guarantee);
|
||||
void DoCrashPureVirtualCall();
|
||||
};
|
||||
|
||||
@@ -140,12 +145,37 @@ void clientDumpCallback(void *dump_context,
|
||||
gDumpCallbackCalled = true;
|
||||
}
|
||||
|
||||
void ExceptionHandlerDeathTest::DoCrashAccessViolation() {
|
||||
google_breakpad::ExceptionHandler *exc =
|
||||
new google_breakpad::ExceptionHandler(
|
||||
temp_path_, NULL, NULL, NULL,
|
||||
google_breakpad::ExceptionHandler::HANDLER_ALL, MiniDumpNormal, kPipeName,
|
||||
NULL);
|
||||
void ExceptionHandlerDeathTest::DoCrashAccessViolation(
|
||||
const OutOfProcGuarantee out_of_proc_guarantee) {
|
||||
google_breakpad::ExceptionHandler *exc = NULL;
|
||||
|
||||
if (out_of_proc_guarantee == OUT_OF_PROC_GUARANTEED) {
|
||||
google_breakpad::CrashGenerationClient *client =
|
||||
new google_breakpad::CrashGenerationClient(kPipeName,
|
||||
MiniDumpNormal,
|
||||
NULL); // custom_info
|
||||
ASSERT_TRUE(client->Register());
|
||||
exc = new google_breakpad::ExceptionHandler(
|
||||
temp_path_,
|
||||
NULL, // filter
|
||||
NULL, // callback
|
||||
NULL, // callback_context
|
||||
google_breakpad::ExceptionHandler::HANDLER_ALL,
|
||||
MiniDumpNormal,
|
||||
client,
|
||||
NULL); // custom_info
|
||||
} else {
|
||||
ASSERT_TRUE(out_of_proc_guarantee == OUT_OF_PROC_BEST_EFFORT);
|
||||
exc = new google_breakpad::ExceptionHandler(
|
||||
temp_path_,
|
||||
NULL, // filter
|
||||
NULL, // callback
|
||||
NULL, // callback_context
|
||||
google_breakpad::ExceptionHandler::HANDLER_ALL,
|
||||
MiniDumpNormal,
|
||||
kPipeName,
|
||||
NULL); // custom_info
|
||||
}
|
||||
|
||||
// Disable GTest SEH handler
|
||||
testing::DisableExceptionHandlerInScope disable_exception_handler;
|
||||
@@ -170,15 +200,38 @@ TEST_F(ExceptionHandlerDeathTest, OutOfProcTest) {
|
||||
ASSERT_TRUE(DoesPathExist(temp_path_));
|
||||
std::wstring dump_path(temp_path_);
|
||||
google_breakpad::CrashGenerationServer server(
|
||||
kPipeName, NULL, NULL, NULL, &clientDumpCallback, NULL, NULL, NULL, NULL,
|
||||
NULL, true, &dump_path);
|
||||
kPipeName, NULL, NULL, NULL, &clientDumpCallback, NULL, NULL, NULL, NULL,
|
||||
NULL, true, &dump_path);
|
||||
|
||||
// This HAS to be EXPECT_, because when this test case is executed in the
|
||||
// child process, the server registration will fail due to the named pipe
|
||||
// being the same.
|
||||
EXPECT_TRUE(server.Start());
|
||||
EXPECT_FALSE(gDumpCallbackCalled);
|
||||
ASSERT_DEATH(this->DoCrashAccessViolation(), "");
|
||||
gDumpCallbackCalled = false;
|
||||
ASSERT_DEATH(this->DoCrashAccessViolation(OUT_OF_PROC_BEST_EFFORT), "");
|
||||
EXPECT_TRUE(gDumpCallbackCalled);
|
||||
}
|
||||
|
||||
TEST_F(ExceptionHandlerDeathTest, OutOfProcGuaranteedTest) {
|
||||
// This is similar to the previous test (OutOfProcTest). The only difference
|
||||
// is that in this test, the crash generation client is created and registered
|
||||
// with the crash generation server outside of the ExceptionHandler
|
||||
// constructor which allows breakpad users to opt out of the default
|
||||
// in-process dump generation when the registration with the crash generation
|
||||
// server fails.
|
||||
|
||||
ASSERT_TRUE(DoesPathExist(temp_path_));
|
||||
std::wstring dump_path(temp_path_);
|
||||
google_breakpad::CrashGenerationServer server(
|
||||
kPipeName, NULL, NULL, NULL, &clientDumpCallback, NULL, NULL, NULL, NULL,
|
||||
NULL, true, &dump_path);
|
||||
|
||||
// This HAS to be EXPECT_, because when this test case is executed in the
|
||||
// child process, the server registration will fail due to the named pipe
|
||||
// being the same.
|
||||
EXPECT_TRUE(server.Start());
|
||||
gDumpCallbackCalled = false;
|
||||
ASSERT_DEATH(this->DoCrashAccessViolation(OUT_OF_PROC_GUARANTEED), "");
|
||||
EXPECT_TRUE(gDumpCallbackCalled);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user