gecko-dev/toolkit/components/crashes/tests/xpcshell/test_crash_service.js
Gabriele Svelto 3148018ed7 Bug 1359326 - Run the minidump analyzer directly from the CrashService code; r=bsmedberg
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
2017-05-11 14:03:50 +02:00

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);
});