diff options
Diffstat (limited to 'toolkit/crashreporter/test/browser/browser_aboutCrashesResubmit.js')
-rw-r--r-- | toolkit/crashreporter/test/browser/browser_aboutCrashesResubmit.js | 152 |
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)); + }); +} |