summaryrefslogtreecommitdiffstats
path: root/toolkit/crashreporter/test/browser/browser_aboutCrashesResubmit.js
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/crashreporter/test/browser/browser_aboutCrashesResubmit.js')
-rw-r--r--toolkit/crashreporter/test/browser/browser_aboutCrashesResubmit.js152
1 files changed, 152 insertions, 0 deletions
diff --git a/toolkit/crashreporter/test/browser/browser_aboutCrashesResubmit.js b/toolkit/crashreporter/test/browser/browser_aboutCrashesResubmit.js
new file mode 100644
index 000000000..a911c67e8
--- /dev/null
+++ b/toolkit/crashreporter/test/browser/browser_aboutCrashesResubmit.js
@@ -0,0 +1,152 @@
+function cleanup_and_finish() {
+ try {
+ cleanup_fake_appdir();
+ } catch (ex) {}
+ Services.prefs.clearUserPref("breakpad.reportURL");
+ BrowserTestUtils.removeTab(gBrowser.selectedTab).then(finish);
+}
+
+/*
+ * check_crash_list
+ *
+ * Check that the list of crashes displayed by about:crashes matches
+ * the list of crashes that we placed in the pending+submitted directories.
+ *
+ * NB: This function is run in the child process via ContentTask.spawn.
+ */
+function check_crash_list(crashes) {
+ let doc = content.document;
+ let crashlinks = doc.getElementsByClassName("crashReport");
+ Assert.equal(crashlinks.length, crashes.length,
+ "about:crashes lists correct number of crash reports");
+ // no point in checking this if the lists aren't the same length
+ if (crashlinks.length == crashes.length) {
+ for (let i=0; i<crashes.length; i++) {
+ Assert.equal(crashlinks[i].id, crashes[i].id, i + ": crash ID is correct");
+ if (crashes[i].pending) {
+ // we set the breakpad.reportURL pref in test()
+ Assert.equal(crashlinks[i].getAttribute("href"),
+ "http://example.com/browser/toolkit/crashreporter/about/throttling",
+ "pending URL links to the correct static page");
+ }
+ }
+ }
+}
+
+/*
+ * check_submit_pending
+ *
+ * Click on a pending crash in about:crashes, wait for it to be submitted (which
+ * should redirect us to the crash report page). Verify that the data provided
+ * by our test crash report server matches the data we submitted.
+ * Additionally, click "back" and verify that the link now points to our new
+ */
+function check_submit_pending(tab, crashes) {
+ let browser = gBrowser.getBrowserForTab(tab);
+ let SubmittedCrash = null;
+ let CrashID = null;
+ let CrashURL = null;
+ function csp_onload() {
+ // loaded the crash report page
+ ok(true, 'got submission onload');
+
+ ContentTask.spawn(browser, null, function() {
+ // grab the Crash ID here to verify later
+ let CrashID = content.location.search.split("=")[1];
+ let CrashURL = content.location.toString();
+
+ // check the JSON content vs. what we submitted
+ let result = JSON.parse(content.document.documentElement.textContent);
+ Assert.equal(result.upload_file_minidump, "MDMP", "minidump file sent properly");
+ Assert.equal(result.memory_report, "Let's pretend this is a memory report",
+ "memory report sent properly");
+ Assert.equal(+result.Throttleable, 0, "correctly sent as non-throttleable");
+ // we checked these, they're set by the submission process,
+ // so they won't be in the "extra" data.
+ delete result.upload_file_minidump;
+ delete result.memory_report;
+ delete result.Throttleable;
+
+ return { id: CrashID, url: CrashURL, result };
+ }).then(({ id, url, result }) => {
+ // Likewise, this is discarded before it gets to the server
+ delete SubmittedCrash.extra.ServerURL;
+
+ CrashID = id;
+ CrashURL = url;
+ for (let x in result) {
+ if (x in SubmittedCrash.extra)
+ is(result[x], SubmittedCrash.extra[x],
+ "submitted value for " + x + " matches expected");
+ else
+ ok(false, "property " + x + " missing from submitted data!");
+ }
+ for (let y in SubmittedCrash.extra) {
+ if (!(y in result))
+ ok(false, "property " + y + " missing from result data!");
+ }
+
+ // NB: Despite appearances, this doesn't use a CPOW.
+ BrowserTestUtils.waitForEvent(browser, "pageshow", true).then(csp_pageshow);
+
+ // now navigate back
+ browser.goBack();
+ });
+ }
+ function csp_fail() {
+ browser.removeEventListener("CrashSubmitFailed", csp_fail, true);
+ ok(false, "failed to submit crash report!");
+ cleanup_and_finish();
+ }
+ browser.addEventListener("CrashSubmitFailed", csp_fail, true);
+ BrowserTestUtils.browserLoaded(browser, false, (url) => url !== "about:crashes").then(csp_onload);
+ function csp_pageshow() {
+ ContentTask.spawn(browser, { CrashID, CrashURL }, function({ CrashID, CrashURL }) {
+ Assert.equal(content.location.href, "about:crashes", "navigated back successfully");
+ let link = content.document.getElementById(CrashID);
+ Assert.notEqual(link, null, "crash report link changed correctly");
+ if (link)
+ Assert.equal(link.href, CrashURL, "crash report link points to correct href");
+ }).then(cleanup_and_finish);
+ }
+
+ // try submitting the pending report
+ for (let crash of crashes) {
+ if (crash.pending) {
+ SubmittedCrash = crash;
+ break;
+ }
+ }
+
+ ContentTask.spawn(browser, SubmittedCrash.id, function(id) {
+ let link = content.document.getElementById(id);
+ link.click();
+ });
+}
+
+function test() {
+ waitForExplicitFinish();
+ let appD = make_fake_appdir();
+ let crD = appD.clone();
+ crD.append("Crash Reports");
+ let crashes = add_fake_crashes(crD, 1);
+ // we don't need much data here, it's not going to a real Socorro
+ crashes.push(addPendingCrashreport(crD,
+ crashes[crashes.length - 1].date + 60000,
+ {'ServerURL': 'http://example.com/browser/toolkit/crashreporter/test/browser/crashreport.sjs',
+ 'ProductName': 'Test App',
+ // test that we don't truncate
+ // at = (bug 512853)
+ 'Foo': 'ABC=XYZ'
+ }));
+ crashes.sort((a, b) => b.date - a.date);
+
+ // set this pref so we can link to our test server
+ Services.prefs.setCharPref("breakpad.reportURL",
+ "http://example.com/browser/toolkit/crashreporter/test/browser/crashreport.sjs?id=");
+
+ BrowserTestUtils.openNewForegroundTab(gBrowser, "about:crashes").then((tab) => {
+ ContentTask.spawn(tab.linkedBrowser, crashes, check_crash_list)
+ .then(() => check_submit_pending(tab, crashes));
+ });
+}