Added a death test for the pure virtual function call.
Added a test for the minidump generated by a pure virtual function call.
Changed the pure virtual function call handler so that it creates a minidump with Exception info and a stack.

Review URL: http://codereview.chromium.org/2050013

git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@597 4c0a9323-5329-0410-9bdc-e9ce6186880e
diff --git a/src/client/windows/unittests/exception_handler_death_test.cc b/src/client/windows/unittests/exception_handler_death_test.cc
index a03ad01..3613140 100755
--- a/src/client/windows/unittests/exception_handler_death_test.cc
+++ b/src/client/windows/unittests/exception_handler_death_test.cc
@@ -53,7 +53,8 @@
   // Actually constructs a temp path name.
   virtual void SetUp();
   // A helper method that tests can use to crash.
-  void DoCrash();
+  void DoCrashAccessViolation();
+  void DoCrashPureVirtualCall();
 };
 
 void ExceptionHandlerDeathTest::SetUp() {
@@ -126,7 +127,7 @@
   gDumpCallbackCalled = true;
 }
 
-void ExceptionHandlerDeathTest::DoCrash() {
+void ExceptionHandlerDeathTest::DoCrashAccessViolation() {
   google_breakpad::ExceptionHandler *exc =
     new google_breakpad::ExceptionHandler(
     temp_path_, NULL, NULL, NULL,
@@ -160,7 +161,7 @@
   // being the same.
   EXPECT_TRUE(server.Start());
   EXPECT_FALSE(gDumpCallbackCalled);
-  ASSERT_DEATH(this->DoCrash(), "");
+  ASSERT_DEATH(this->DoCrashAccessViolation(), "");
   EXPECT_TRUE(gDumpCallbackCalled);
 }
 
@@ -178,4 +179,37 @@
   // and a dump will be generated, the process will exit(0).
   ASSERT_EXIT(printf(NULL), ::testing::ExitedWithCode(0), "");
 }
+
+
+struct PureVirtualCallBase {
+  PureVirtualCallBase() {
+    // We have to reinterpret so the linker doesn't get confused because the
+    // method isn't defined.
+    reinterpret_cast<PureVirtualCallBase*>(this)->PureFunction();
+  }
+  virtual ~PureVirtualCallBase() {}
+  virtual void PureFunction() const = 0;
+};
+struct PureVirtualCall : public PureVirtualCallBase {
+  PureVirtualCall() { PureFunction(); }
+  virtual void PureFunction() const {}
+};
+
+void ExceptionHandlerDeathTest::DoCrashPureVirtualCall() {
+  PureVirtualCall instance;
+}
+
+TEST_F(ExceptionHandlerDeathTest, PureVirtualCallTest) {
+  using google_breakpad::ExceptionHandler;
+
+  ASSERT_TRUE(DoesPathExist(temp_path_));
+  ExceptionHandler handler(temp_path_, NULL, NULL, NULL,
+                           ExceptionHandler::HANDLER_PURECALL);
+
+  // Disable the message box for assertions
+  _CrtSetReportMode(_CRT_ASSERT, 0);
+
+  // Calls a pure virtual function.
+  EXPECT_EXIT(DoCrashPureVirtualCall(), ::testing::ExitedWithCode(0), "");
+}
 }