mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-11-11 05:39:41 +02:00
This patch removes the C++ code used to run the minidump analyzer when a content process crashes, and replaces it with JS code within the CrashService object. This removes the need for a separate shutdown blocker in C++ code and allows end-to-end testing of the crash service functionality. Additionally the exception handler code can be simplified since it's now only used to run the crash reporter client. The test added to test_crash_service.js covers computing the minidump SHA256 hash (bug 1322611) and of the minidump analyzer itself (bug 1280477). MozReview-Commit-ID: LO5w839NHev
81 lines
3.2 KiB
JavaScript
81 lines
3.2 KiB
JavaScript
/* Any copyright is dedicated to the Public Domain.
|
|
* http://creativecommons.org/publicdomain/zero/1.0/ */
|
|
|
|
"use strict";
|
|
|
|
var {classes: Cc, interfaces: Ci, utils: Cu} = Components;
|
|
|
|
Cu.import("resource://gre/modules/osfile.jsm", this);
|
|
Cu.import("resource://gre/modules/Services.jsm", this);
|
|
Cu.import("resource://testing-common/AppData.jsm", this);
|
|
Cu.import("resource://testing-common/CrashManagerTest.jsm", this);
|
|
var bsp = Cu.import("resource://gre/modules/CrashManager.jsm", {});
|
|
|
|
function run_test() {
|
|
run_next_test();
|
|
}
|
|
|
|
add_task(async function test_instantiation() {
|
|
Assert.ok(!bsp.gCrashManager, "CrashManager global instance not initially defined.");
|
|
|
|
do_get_profile();
|
|
await makeFakeAppDir();
|
|
|
|
// Fake profile creation.
|
|
Cc["@mozilla.org/crashservice;1"]
|
|
.getService(Ci.nsIObserver)
|
|
.observe(null, "profile-after-change", null);
|
|
|
|
Assert.ok(bsp.gCrashManager, "Profile creation makes it available.");
|
|
Assert.ok(Services.crashmanager, "CrashManager available via Services.");
|
|
Assert.strictEqual(bsp.gCrashManager, Services.crashmanager,
|
|
"The objects are the same.");
|
|
});
|
|
|
|
add_task(async function test_addCrash() {
|
|
const crashId = "56cd87bc-bb26-339b-3a8e-f00c0f11380e";
|
|
|
|
let cwd = await OS.File.getCurrentDirectory();
|
|
let minidump = OS.Path.join(cwd, "crash.dmp");
|
|
let extra = OS.Path.join(cwd, "crash.extra");
|
|
let dir = do_get_tempdir();
|
|
|
|
// Make a copy of the files because the .extra file will be modified
|
|
await OS.File.copy(minidump, OS.Path.join(dir.path, crashId + ".dmp"));
|
|
await OS.File.copy(extra, OS.Path.join(dir.path, crashId + ".extra"));
|
|
|
|
// Ensure that the nsICrashReporter methods can find the dump
|
|
let crashReporter =
|
|
Components.classes["@mozilla.org/toolkit/crash-reporter;1"]
|
|
.getService(Components.interfaces.nsICrashReporter);
|
|
crashReporter.minidumpPath = dir;
|
|
|
|
let cs = Cc["@mozilla.org/crashservice;1"].getService(Ci.nsICrashService);
|
|
await cs.addCrash(Ci.nsICrashService.PROCESS_TYPE_CONTENT,
|
|
Ci.nsICrashService.CRASH_TYPE_CRASH, crashId);
|
|
let crashes = await Services.crashmanager.getCrashes();
|
|
let crash = crashes.find(c => { return c.id === crashId; });
|
|
Assert.ok(crash, "Crash " + crashId + " has been stored successfully.");
|
|
Assert.equal(crash.metadata.ProcessType, "content");
|
|
Assert.equal(crash.metadata.MinidumpSha256Hash,
|
|
"24b0ea7794b2d2523c46c9aea72c03ccbb0ab88ad76d8258d3752c7b71d233ff");
|
|
Assert.ok(crash.metadata.StackTraces, "The StackTraces field is present.\n")
|
|
|
|
try {
|
|
let stackTraces = JSON.parse(crash.metadata.StackTraces);
|
|
Assert.equal(stackTraces.status, "OK");
|
|
Assert.ok(stackTraces.crash_info, "The crash_info field is populated.");
|
|
Assert.ok(stackTraces.modules && (stackTraces.modules.length > 0),
|
|
"The module list is populated.");
|
|
Assert.ok(stackTraces.threads && (stackTraces.modules.length > 0),
|
|
"The thread list is populated.");
|
|
|
|
let frames = stackTraces.threads[0].frames;
|
|
Assert.ok(frames && (frames.length > 0), "The stack trace is present.\n");
|
|
} catch (e) {
|
|
Assert.ok(false, "StackTraces does not contain valid JSON.");
|
|
}
|
|
|
|
// Remove the minidumps to prevent the test harness from thinking we crashed
|
|
await OS.File.removeDir(dir.path);
|
|
});
|