| Index: chrome_frame/crash_reporting/vectored_handler_unittest.cc
|
| ===================================================================
|
| --- chrome_frame/crash_reporting/vectored_handler_unittest.cc (revision 40924)
|
| +++ chrome_frame/crash_reporting/vectored_handler_unittest.cc (working copy)
|
| @@ -5,6 +5,8 @@
|
| #include <atlbase.h>
|
|
|
| #include "base/logging.h"
|
| +#include "chrome_frame/crash_reporting/crash_dll.h"
|
| +#include "chrome_frame/crash_reporting/nt_loader.h"
|
| #include "chrome_frame/crash_reporting/vectored_handler-impl.h"
|
| #include "chrome_frame/crash_reporting/veh_test.h"
|
| #include "testing/gmock/include/gmock/gmock.h"
|
| @@ -45,8 +47,12 @@
|
| };
|
| }; // namespace
|
|
|
| +typedef VectoredHandlerT<MockApi> VectoredHandlerMock;
|
| +static VectoredHandlerMock* g_mock_veh = NULL;
|
| +static LONG WINAPI VEH(EXCEPTION_POINTERS* exptrs) {
|
| + return g_mock_veh->Handler(exptrs);
|
| +}
|
|
|
| -typedef VectoredHandlerT<MockApi> VectoredHandlerMock;
|
| TEST(ChromeFrame, ExceptionReport) {
|
| MockApi api;
|
| VectoredHandlerMock veh(&api);
|
| @@ -122,6 +128,45 @@
|
| EXPECT_EQ(ExceptionContinueSearch,
|
| veh.Handler(&ExceptionInfo(STATUS_ACCESS_VIOLATION, ignore_address)));
|
| testing::Mock::VerifyAndClearExpectations(&api);
|
| +
|
| + // Exception in a loading module, we are on the stack.
|
| + // Make sure we don't report it.
|
| + api.SetSEH(no_seh);
|
| + api.SetStack(on_stack);
|
| + EXPECT_CALL(api, WriteDump(_)).Times(0);
|
| +
|
| + g_mock_veh = &veh;
|
| + void* id = ::AddVectoredExceptionHandler(FALSE, VEH);
|
| +
|
| + EXPECT_TRUE(::SetEnvironmentVariable(kCrashOnLoadMode, L"1"));
|
| + long exceptions_seen = veh.get_exceptions_seen();
|
| + HMODULE module = ::LoadLibrary(kCrashDllName);
|
| + EXPECT_EQ(NULL, module);
|
| +
|
| + testing::Mock::VerifyAndClearExpectations(&api);
|
| + EXPECT_EQ(exceptions_seen + 1, veh.get_exceptions_seen());
|
| + EXPECT_TRUE(::SetEnvironmentVariable(kCrashOnLoadMode, NULL));
|
| +
|
| + // Exception in an unloading module, we are on the stack/
|
| + // Make sure we report it.
|
| + EXPECT_TRUE(::SetEnvironmentVariable(kCrashOnUnloadMode, L"1"));
|
| +
|
| + module = ::LoadLibrary(kCrashDllName);
|
| +
|
| + api.SetSEH(no_seh);
|
| + api.SetStack(on_stack);
|
| + EXPECT_CALL(api, WriteDump(_)).Times(1);
|
| + EXPECT_TRUE(module != NULL);
|
| + exceptions_seen = veh.get_exceptions_seen();
|
| +
|
| + // Crash on unloading.
|
| + ::FreeLibrary(module);
|
| +
|
| + EXPECT_EQ(exceptions_seen + 1, veh.get_exceptions_seen());
|
| + testing::Mock::VerifyAndClearExpectations(&api);
|
| +
|
| + ::RemoveVectoredExceptionHandler(id);
|
| + g_mock_veh = NULL;
|
| }
|
|
|
| MATCHER_P(ExceptionCodeIs, code, "") {
|
| @@ -150,11 +195,6 @@
|
| return 0;
|
| }
|
|
|
| -static VectoredHandlerMock* g_mock_veh = NULL;
|
| -static LONG WINAPI VEH(EXCEPTION_POINTERS* exptrs) {
|
| - return g_mock_veh->Handler(exptrs);
|
| -}
|
| -
|
| TEST(ChromeFrame, TrickyStackOverflow) {
|
| MockApi api;
|
| VectoredHandlerMock veh(&api);
|
|
|