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.js83
1 files changed, 83 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 000000000..937c0432b
--- /dev/null
+++ b/security/manager/ssl/tests/unit/test_local_cert.js
@@ -0,0 +1,83 @@
+/* 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: function(c, rv) {
+ if (rv) {
+ reject(rv);
+ return;
+ }
+ resolve(c);
+ }
+ });
+ });
+}
+
+function removeCert(nickname) {
+ return new Promise((resolve, reject) => {
+ certService.removeCert(nickname, {
+ handleResult: function(rv) {
+ if (rv) {
+ reject(rv);
+ return;
+ }
+ resolve();
+ }
+ });
+ });
+}
+
+add_task(function* () {
+ // No master password, so no prompt required here
+ ok(!certService.loginPromptRequired);
+
+ let certA = yield getOrCreateCert(gNickname);
+ equal(certA.nickname, gNickname);
+
+ // Getting again should give the same cert
+ let certB = yield getOrCreateCert(gNickname);
+ equal(certB.nickname, gNickname);
+
+ // Should be matching instances
+ ok(certA.equals(certB));
+
+ // Check a few expected attributes
+ ok(certA.isSelfSigned);
+ equal(certA.certType, Ci.nsIX509Cert.USER_CERT);
+
+ // New nickname should give a different cert
+ let diffNameCert = yield getOrCreateCert("cool-stuff");
+ ok(!diffNameCert.equals(certA));
+
+ // Remove the cert, and get a new one again
+ yield removeCert(gNickname);
+ let newCert = yield 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 = yield getOrCreateCert(gNickname);
+ equal(certAfterGC.serialNumber, serial);
+});