Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

// Any copyright is dedicated to the Public Domain.
"use strict";
// Tests that the cert download/import UI correctly identifies the cert being
// downloaded, and allows the trust of the cert to be specified.
const { MockRegistrar } = ChromeUtils.importESModule(
);
/**
* @typedef TestCase
* @type {object}
* @property {string} certFilename
* Filename of the cert for this test case.
* @property {string} expectedDisplayString
* The string we expect the UI to display to represent the given cert.
* @property {nsIX509Cert} cert
* Handle to the cert once read in setup().
*/
/**
* A list of test cases representing certs that get "downloaded".
*
* @type {TestCase[]}
*/
const TEST_CASES = [
{ certFilename: "has-cn.pem", expectedDisplayString: "Foo", cert: null },
{
certFilename: "has-empty-subject.pem",
expectedDisplayString: "Certificate Authority (unnamed)",
cert: null,
},
];
/**
* Opens the cert download dialog.
*
* @param {nsIX509Cert} cert
* The cert to pass to the dialog for display.
* @returns {Promise}
* A promise that resolves when the dialog has finished loading, with
* an array consisting of:
* 1. The window of the opened dialog.
* 2. The return value nsIWritablePropertyBag2 passed to the dialog.
*/
function openCertDownloadDialog(cert) {
let returnVals = Cc["@mozilla.org/hash-property-bag;1"].createInstance(
Ci.nsIWritablePropertyBag2
);
let win = window.openDialog(
"",
"",
cert,
returnVals
);
return new Promise(resolve => {
win.addEventListener(
"load",
function () {
executeSoon(() => resolve([win, returnVals]));
},
{ once: true }
);
});
}
add_setup(async function () {
for (let testCase of TEST_CASES) {
testCase.cert = await readCertificate(testCase.certFilename, ",,");
Assert.notEqual(
testCase.cert,
null,
`'${testCase.certFilename}' should have been read`
);
}
});
// Test that the trust header message corresponds to the provided cert, and that
// the View Cert button launches the cert viewer for the provided cert.
add_task(async function testTrustHeaderAndViewCertButton() {
for (let testCase of TEST_CASES) {
let [win] = await openCertDownloadDialog(testCase.cert);
let expectedTrustHeaderString =
`Do you want to trust \u201C${testCase.expectedDisplayString}\u201D ` +
"for the following purposes?";
Assert.equal(
win.document.getElementById("trustHeader").textContent,
expectedTrustHeaderString,
"Actual and expected trust header text should match for " +
`${testCase.certFilename}`
);
await BrowserTestUtils.closeWindow(win);
}
});
// Test that the right values are returned when the dialog is accepted.
add_task(async function testAcceptDialogReturnValues() {
let [win, retVals] = await openCertDownloadDialog(TEST_CASES[0].cert);
win.document.getElementById("trustSSL").checked = true;
win.document.getElementById("trustEmail").checked = false;
info("Accepting dialog");
win.document.getElementById("download_cert").acceptDialog();
await BrowserTestUtils.windowClosed(win);
Assert.ok(
retVals.get("importConfirmed"),
"Return value should signal user chose to import the cert"
);
Assert.ok(
retVals.get("trustForSSL"),
"Return value should signal SSL trust checkbox was checked"
);
Assert.ok(
!retVals.get("trustForEmail"),
"Return value should signal E-mail trust checkbox was unchecked"
);
});
// Test that the right values are returned when the dialog is canceled.
add_task(async function testCancelDialogReturnValues() {
let [win, retVals] = await openCertDownloadDialog(TEST_CASES[0].cert);
info("Canceling dialog");
win.document.getElementById("download_cert").cancelDialog();
await BrowserTestUtils.windowClosed(win);
Assert.ok(
!retVals.get("importConfirmed"),
"Return value should signal user chose not to import the cert"
);
});