Index: headless/lib/headless_browser_browsertest.cc |
diff --git a/headless/lib/headless_browser_browsertest.cc b/headless/lib/headless_browser_browsertest.cc |
index 0c4557cba273808c3e9d98ad4bdd1275932cac2e..3c67da1938746c5e173b49d0f597b2a61bed4c72 100644 |
--- a/headless/lib/headless_browser_browsertest.cc |
+++ b/headless/lib/headless_browser_browsertest.cc |
@@ -5,11 +5,15 @@ |
#include <memory> |
#include "base/command_line.h" |
+#include "base/files/file_enumerator.h" |
#include "base/files/file_util.h" |
#include "base/memory/ptr_util.h" |
#include "base/strings/stringprintf.h" |
#include "base/threading/thread_restrictions.h" |
+#include "content/public/common/url_constants.h" |
#include "content/public/test/browser_test.h" |
+#include "headless/lib/headless_macros.h" |
+#include "headless/public/devtools/domains/inspector.h" |
#include "headless/public/devtools/domains/network.h" |
#include "headless/public/devtools/domains/page.h" |
#include "headless/public/headless_browser.h" |
@@ -642,4 +646,88 @@ IN_PROC_BROWSER_TEST_F(HeadlessBrowserTest, MAYBE_RendererCommandPrefixTest) { |
base::DeleteFile(launcher_stamp, false); |
} |
+class CrashReporterTest : public HeadlessBrowserTest, |
+ public HeadlessWebContents::Observer, |
+ inspector::ExperimentalObserver { |
+ public: |
+ CrashReporterTest() : devtools_client_(HeadlessDevToolsClient::Create()) {} |
+ ~CrashReporterTest() override {} |
+ |
+ void SetUp() override { |
+ base::ThreadRestrictions::SetIOAllowed(true); |
+ base::CreateNewTempDirectory("CrashReporterTest", &crash_dumps_dir_); |
+ EXPECT_FALSE(options()->enable_crash_reporter); |
+ options()->enable_crash_reporter = true; |
+ options()->crash_dumps_dir = crash_dumps_dir_; |
+ HeadlessBrowserTest::SetUp(); |
+ } |
+ |
+ void TearDown() override { |
+ base::ThreadRestrictions::SetIOAllowed(true); |
+ base::DeleteFile(crash_dumps_dir_, /* recursive */ false); |
+ } |
+ |
+ // HeadlessWebContents::Observer implementation: |
+ void DevToolsTargetReady() override { |
+ EXPECT_TRUE(web_contents_->GetDevToolsTarget()); |
+ web_contents_->GetDevToolsTarget()->AttachClient(devtools_client_.get()); |
+ devtools_client_->GetInspector()->GetExperimental()->AddObserver(this); |
+ } |
+ |
+ // inspector::ExperimentalObserver implementation: |
+ void OnTargetCrashed(const inspector::TargetCrashedParams&) override { |
+ FinishAsynchronousTest(); |
+ } |
+ |
+ protected: |
+ HeadlessBrowserContext* browser_context_ = nullptr; |
+ HeadlessWebContents* web_contents_ = nullptr; |
+ std::unique_ptr<HeadlessDevToolsClient> devtools_client_; |
+ base::FilePath crash_dumps_dir_; |
+}; |
+ |
+// TODO(skyostil): Minidump generation currently is only supported on Linux. |
+#if defined(HEADLESS_USE_BREAKPAD) |
+#define MAYBE_GenerateMinidump GenerateMinidump |
+#else |
+#define MAYBE_GenerateMinidump DISABLED_GenerateMinidump |
+#endif // defined(HEADLESS_USE_BREAKPAD) |
+IN_PROC_BROWSER_TEST_F(CrashReporterTest, MAYBE_GenerateMinidump) { |
+ // Navigates a tab to chrome://crash and checks that a minidump is generated. |
+ // Note that we only test renderer crashes here -- browser crashes need to be |
+ // tested with a separate harness. |
+ // |
+ // The case where crash reporting is disabled is covered by |
+ // HeadlessCrashObserverTest. |
+ browser_context_ = browser()->CreateBrowserContextBuilder().Build(); |
+ |
+ web_contents_ = browser_context_->CreateWebContentsBuilder() |
+ .SetInitialURL(GURL(content::kChromeUICrashURL)) |
+ .Build(); |
+ |
+ web_contents_->AddObserver(this); |
+ RunAsynchronousTest(); |
+ |
+ // The target has crashed and should no longer be there. |
+ EXPECT_FALSE(web_contents_->GetDevToolsTarget()); |
+ |
+ // Check that one minidump got created. |
+ { |
+ base::ThreadRestrictions::SetIOAllowed(true); |
+ base::FileEnumerator it(crash_dumps_dir_, /* recursive */ false, |
+ base::FileEnumerator::FILES); |
+ base::FilePath minidump = it.Next(); |
+ EXPECT_FALSE(minidump.empty()); |
+ EXPECT_EQ(".dmp", minidump.Extension()); |
+ EXPECT_TRUE(it.Next().empty()); |
+ } |
+ |
+ web_contents_->RemoveObserver(this); |
+ web_contents_->Close(); |
+ web_contents_ = nullptr; |
+ |
+ browser_context_->Close(); |
+ browser_context_ = nullptr; |
+} |
+ |
} // namespace headless |