summaryrefslogtreecommitdiffstats
path: root/security/manager/ssl/tests/unit/test_local_cert.js
diff options
context:
space:
mode:
Diffstat (limited to 'security/manager/ssl/tests/unit/test_local_cert.js')
-rw-r--r--security/manager/ssl/tests/unit/test_local_cert.js87
1 files changed, 87 insertions, 0 deletions
diff --git a/security/manager/ssl/tests/unit/test_local_cert.js b/security/manager/ssl/tests/unit/test_local_cert.js
new file mode 100644
index 0000000000..2b0e804380
--- /dev/null
+++ b/security/manager/ssl/tests/unit/test_local_cert.js
@@ -0,0 +1,87 @@
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+const certService = Cc["@mozilla.org/security/local-cert-service;1"].getService(
+ Ci.nsILocalCertService
+);
+
+const gNickname = "local-cert-test";
+
+function run_test() {
+ // Need profile dir to store the key / cert
+ do_get_profile();
+ // Ensure PSM is initialized
+ Cc["@mozilla.org/psm;1"].getService(Ci.nsISupports);
+ run_next_test();
+}
+
+function getOrCreateCert(nickname) {
+ return new Promise((resolve, reject) => {
+ certService.getOrCreateCert(nickname, {
+ handleCert(c, rv) {
+ if (rv) {
+ reject(rv);
+ return;
+ }
+ resolve(c);
+ },
+ });
+ });
+}
+
+function removeCert(nickname) {
+ return new Promise((resolve, reject) => {
+ certService.removeCert(nickname, {
+ handleResult(rv) {
+ if (rv) {
+ reject(rv);
+ return;
+ }
+ resolve();
+ },
+ });
+ });
+}
+
+add_task(async function() {
+ // No master password, so no prompt required here
+ ok(!certService.loginPromptRequired);
+
+ let certA = await getOrCreateCert(gNickname);
+ // The local cert service implementation takes the given nickname and uses it
+ // as the common name for the certificate it creates. nsIX509Cert.displayName
+ // uses the common name if it is present, so these should match. Should either
+ // implementation change to do something else, this won't necessarily work.
+ equal(certA.displayName, gNickname);
+
+ // Getting again should give the same cert
+ let certB = await getOrCreateCert(gNickname);
+ equal(certB.displayName, gNickname);
+
+ // Should be matching instances
+ ok(certA.equals(certB));
+
+ // Check an expected attribute
+ equal(certA.certType, Ci.nsIX509Cert.USER_CERT);
+
+ // New nickname should give a different cert
+ let diffNameCert = await getOrCreateCert("cool-stuff");
+ ok(!diffNameCert.equals(certA));
+
+ // Remove the cert, and get a new one again
+ await removeCert(gNickname);
+ let newCert = await getOrCreateCert(gNickname);
+ ok(!newCert.equals(certA));
+
+ // Drop all cert references and GC
+ let serial = newCert.serialNumber;
+ certA = certB = diffNameCert = newCert = null;
+ Cu.forceGC();
+ Cu.forceCC();
+
+ // Should still get the same cert back
+ let certAfterGC = await getOrCreateCert(gNickname);
+ equal(certAfterGC.serialNumber, serial);
+});