diff options
Diffstat (limited to 'toolkit/identity/tests/unit')
19 files changed, 0 insertions, 2100 deletions
diff --git a/toolkit/identity/tests/unit/.eslintrc.js b/toolkit/identity/tests/unit/.eslintrc.js deleted file mode 100644 index fee088c179..0000000000 --- a/toolkit/identity/tests/unit/.eslintrc.js +++ /dev/null @@ -1,7 +0,0 @@ -"use strict"; - -module.exports = { - "extends": [ - "../../../../testing/xpcshell/xpcshell.eslintrc.js" - ] -}; diff --git a/toolkit/identity/tests/unit/data/idp_1/.well-known/browserid b/toolkit/identity/tests/unit/data/idp_1/.well-known/browserid deleted file mode 100644 index c7390457d2..0000000000 --- a/toolkit/identity/tests/unit/data/idp_1/.well-known/browserid +++ /dev/null @@ -1,5 +0,0 @@ -{ - "public-key": {"algorithm":"RS","n":"65718905405105134410187227495885391609221288015566078542117409373192106382993306537273677557482085204736975067567111831005921322991127165013340443563713385983456311886801211241492470711576322130577278575529202840052753612576061450560588102139907846854501252327551303482213505265853706269864950437458242988327","e":"65537"}, - "authentication": "/browserid/sign_in.html", - "provisioning": "/browserid/provision.html" -} diff --git a/toolkit/identity/tests/unit/data/idp_invalid_1/.well-known/browserid b/toolkit/identity/tests/unit/data/idp_invalid_1/.well-known/browserid deleted file mode 100644 index 6bcd9de914..0000000000 --- a/toolkit/identity/tests/unit/data/idp_invalid_1/.well-known/browserid +++ /dev/null @@ -1,5 +0,0 @@ -{ - "public-key": {"algorithm":"RS","n":"65718905405105134410187227495885391609221288015566078542117409373192106382993306537273677557482085204736975067567111831005921322991127165013340443563713385983456311886801211241492470711576322130577278575529202840052753612576061450560588102139907846854501252327551303482213505265853706269864950437458242988327","e":"65537"}, - "authentication": "/browserid/sign_in.html", - // missing "provisioning" -} diff --git a/toolkit/identity/tests/unit/head_identity.js b/toolkit/identity/tests/unit/head_identity.js deleted file mode 100644 index c63261b950..0000000000 --- a/toolkit/identity/tests/unit/head_identity.js +++ /dev/null @@ -1,248 +0,0 @@ -/* Any copyright is dedicated to the Public Domain. - * http://creativecommons.org/publicdomain/zero/1.0/ */ - -var Cc = Components.classes; -var Ci = Components.interfaces; -var Cu = Components.utils; -var Cr = Components.results; - -Cu.import("resource://testing-common/httpd.js"); - -// XXX until bug 937114 is fixed -Cu.importGlobalProperties(["atob"]); - -// The following boilerplate makes sure that XPCOM calls -// that use the profile directory work. - -Cu.import("resource://gre/modules/XPCOMUtils.jsm"); -Cu.import("resource://gre/modules/Services.jsm"); - -XPCOMUtils.defineLazyModuleGetter(this, "jwcrypto", - "resource://gre/modules/identity/jwcrypto.jsm"); - -XPCOMUtils.defineLazyModuleGetter(this, "IDService", - "resource://gre/modules/identity/Identity.jsm", - "IdentityService"); - -XPCOMUtils.defineLazyModuleGetter(this, - "IdentityStore", - "resource://gre/modules/identity/IdentityStore.jsm"); - -XPCOMUtils.defineLazyModuleGetter(this, - "Logger", - "resource://gre/modules/identity/LogUtils.jsm"); - -XPCOMUtils.defineLazyServiceGetter(this, - "uuidGenerator", - "@mozilla.org/uuid-generator;1", - "nsIUUIDGenerator"); - -const TEST_MESSAGE_MANAGER = "Mr McFeeley"; -const TEST_URL = "https://myfavoritebacon.com"; -const TEST_URL2 = "https://myfavoritebaconinacan.com"; -const TEST_USER = "user@mozilla.com"; -const TEST_PRIVKEY = "fake-privkey"; -const TEST_CERT = "fake-cert"; -const TEST_ASSERTION = "fake-assertion"; -const TEST_IDPPARAMS = { - domain: "myfavoriteflan.com", - authentication: "/foo/authenticate.html", - provisioning: "/foo/provision.html" -}; - -// The following are utility functions for Identity testing - -function log(...aMessageArgs) { - Logger.log.apply(Logger, ["test"].concat(aMessageArgs)); -} - -function get_idstore() { - return IdentityStore; -} - -function partial(fn) { - let args = Array.prototype.slice.call(arguments, 1); - return function() { - return fn.apply(this, args.concat(Array.prototype.slice.call(arguments))); - }; -} - -function uuid() { - return uuidGenerator.generateUUID().toString(); -} - -function base64UrlDecode(s) { - s = s.replace(/-/g, "+"); - s = s.replace(/_/g, "/"); - - // Replace padding if it was stripped by the sender. - // See http://tools.ietf.org/html/rfc4648#section-4 - switch (s.length % 4) { - case 0: - break; // No pad chars in this case - case 2: - s += "=="; - break; // Two pad chars - case 3: - s += "="; - break; // One pad char - default: - throw new InputException("Illegal base64url string!"); - } - - // With correct padding restored, apply the standard base64 decoder - return atob(s); -} - -// create a mock "doc" object, which the Identity Service -// uses as a pointer back into the doc object -function mock_doc(aIdentity, aOrigin, aDoFunc) { - let mockedDoc = {}; - mockedDoc.id = uuid(); - mockedDoc.loggedInUser = aIdentity; - mockedDoc.origin = aOrigin; - mockedDoc["do"] = aDoFunc; - mockedDoc._mm = TEST_MESSAGE_MANAGER; - mockedDoc.doReady = partial(aDoFunc, "ready"); - mockedDoc.doLogin = partial(aDoFunc, "login"); - mockedDoc.doLogout = partial(aDoFunc, "logout"); - mockedDoc.doError = partial(aDoFunc, "error"); - mockedDoc.doCancel = partial(aDoFunc, "cancel"); - mockedDoc.doCoffee = partial(aDoFunc, "coffee"); - mockedDoc.childProcessShutdown = partial(aDoFunc, "child-process-shutdown"); - - mockedDoc.RP = mockedDoc; - - return mockedDoc; -} - -function mock_fxa_rp(aIdentity, aOrigin, aDoFunc) { - let mockedDoc = {}; - mockedDoc.id = uuid(); - mockedDoc.emailHint = aIdentity; - mockedDoc.origin = aOrigin; - mockedDoc.wantIssuer = "firefox-accounts"; - mockedDoc._mm = TEST_MESSAGE_MANAGER; - - mockedDoc.doReady = partial(aDoFunc, "ready"); - mockedDoc.doLogin = partial(aDoFunc, "login"); - mockedDoc.doLogout = partial(aDoFunc, "logout"); - mockedDoc.doError = partial(aDoFunc, "error"); - mockedDoc.doCancel = partial(aDoFunc, "cancel"); - mockedDoc.childProcessShutdown = partial(aDoFunc, "child-process-shutdown"); - - mockedDoc.RP = mockedDoc; - - return mockedDoc; -} - -// mimicking callback funtionality for ease of testing -// this observer auto-removes itself after the observe function -// is called, so this is meant to observe only ONE event. -function makeObserver(aObserveTopic, aObserveFunc) { - let observer = { - // nsISupports provides type management in C++ - // nsIObserver is to be an observer - QueryInterface: XPCOMUtils.generateQI([Ci.nsISupports, Ci.nsIObserver]), - - observe: function (aSubject, aTopic, aData) { - if (aTopic == aObserveTopic) { - aObserveFunc(aSubject, aTopic, aData); - Services.obs.removeObserver(observer, aObserveTopic); - } - } - }; - - Services.obs.addObserver(observer, aObserveTopic, false); -} - -// set up the ID service with an identity with keypair and all -// when ready, invoke callback with the identity -function setup_test_identity(identity, cert, cb) { - // set up the store so that we're supposed to be logged in - let store = get_idstore(); - - function keyGenerated(err, kpo) { - store.addIdentity(identity, kpo, cert); - cb(); - } - - jwcrypto.generateKeyPair("DS160", keyGenerated); -} - -// takes a list of functions and returns a function that -// when called the first time, calls the first func, -// then the next time the second, etc. -function call_sequentially() { - let numCalls = 0; - let funcs = arguments; - - return function() { - if (!funcs[numCalls]) { - let argString = Array.prototype.slice.call(arguments).join(","); - do_throw("Too many calls: " + argString); - return; - } - funcs[numCalls].apply(funcs[numCalls], arguments); - numCalls += 1; - }; -} - -/* - * Setup a provisioning workflow with appropriate callbacks - * - * identity is the email we're provisioning. - * - * afterSetupCallback is required. - * - * doneProvisioningCallback is optional, if the caller - * wants to be notified when the whole provisioning workflow is done - * - * frameCallbacks is optional, contains the callbacks that the sandbox - * frame would provide in response to DOM calls. - */ -function setup_provisioning(identity, afterSetupCallback, doneProvisioningCallback, callerCallbacks) { - IDService.reset(); - - let provId = uuid(); - IDService.IDP._provisionFlows[provId] = { - identity : identity, - idpParams: TEST_IDPPARAMS, - callback: function(err) { - if (doneProvisioningCallback) - doneProvisioningCallback(err); - }, - sandbox: { - // Emulate the free() method on the iframe sandbox - free: function() {} - } - }; - - let caller = {}; - caller.id = provId; - caller.doBeginProvisioningCallback = function(id, duration_s) { - if (callerCallbacks && callerCallbacks.beginProvisioningCallback) - callerCallbacks.beginProvisioningCallback(id, duration_s); - }; - caller.doGenKeyPairCallback = function(pk) { - if (callerCallbacks && callerCallbacks.genKeyPairCallback) - callerCallbacks.genKeyPairCallback(pk); - }; - - afterSetupCallback(caller); -} - -// Switch debug messages on by default -var initialPrefDebugValue = false; -try { - initialPrefDebugValue = Services.prefs.getBoolPref("toolkit.identity.debug"); -} catch (noPref) {} -Services.prefs.setBoolPref("toolkit.identity.debug", true); - -// after execution, restore prefs -do_register_cleanup(function() { - log("restoring prefs to their initial values"); - Services.prefs.setBoolPref("toolkit.identity.debug", initialPrefDebugValue); -}); - - diff --git a/toolkit/identity/tests/unit/tail_identity.js b/toolkit/identity/tests/unit/tail_identity.js deleted file mode 100644 index c263f8369d..0000000000 --- a/toolkit/identity/tests/unit/tail_identity.js +++ /dev/null @@ -1,8 +0,0 @@ - -// pre-emptively shut down to clear resources -if (typeof IdentityService !== "undefined") { - IdentityService.shutdown(); -} else if (typeof IDService !== "undefined") { - IDService.shutdown(); -} - diff --git a/toolkit/identity/tests/unit/test_authentication.js b/toolkit/identity/tests/unit/test_authentication.js deleted file mode 100644 index 3f24e2e37d..0000000000 --- a/toolkit/identity/tests/unit/test_authentication.js +++ /dev/null @@ -1,159 +0,0 @@ -/* Any copyright is dedicated to the Public Domain. - http://creativecommons.org/publicdomain/zero/1.0/ */ - -"use strict"; - -XPCOMUtils.defineLazyModuleGetter(this, "IDService", - "resource://gre/modules/identity/Identity.jsm", - "IdentityService"); - -XPCOMUtils.defineLazyModuleGetter(this, "jwcrypto", - "resource://gre/modules/identity/jwcrypto.jsm"); - -function test_begin_authentication_flow() { - do_test_pending(); - let _provId = null; - - // set up a watch, to be consistent - let mockedDoc = mock_doc(null, TEST_URL, function(action, params) {}); - IDService.RP.watch(mockedDoc); - - // The identity-auth notification is sent up to the UX from the - // _doAuthentication function. Be ready to receive it and call - // beginAuthentication - makeObserver("identity-auth", function (aSubject, aTopic, aData) { - do_check_neq(aSubject, null); - - do_check_eq(aSubject.wrappedJSObject.provId, _provId); - - do_test_finished(); - run_next_test(); - }); - - setup_provisioning( - TEST_USER, - function(caller) { - _provId = caller.id; - IDService.IDP.beginProvisioning(caller); - }, function() {}, - { - beginProvisioningCallback: function(email, duration_s) { - - // let's say this user needs to authenticate - IDService.IDP._doAuthentication(_provId, {idpParams:TEST_IDPPARAMS}); - } - } - ); -} - -function test_complete_authentication_flow() { - do_test_pending(); - let _provId = null; - let _authId = null; - let id = TEST_USER; - - let callbacksFired = false; - let loginStateChanged = false; - let identityAuthComplete = false; - - // The result of authentication should be a successful login - IDService.reset(); - - setup_test_identity(id, TEST_CERT, function() { - // set it up so we're supposed to be logged in to TEST_URL - - get_idstore().setLoginState(TEST_URL, true, id); - - // When we authenticate, our ready callback will be fired. - // At the same time, a separate topic will be sent up to the - // the observer in the UI. The test is complete when both - // events have occurred. - let mockedDoc = mock_doc(id, TEST_URL, call_sequentially( - function(action, params) { - do_check_eq(action, 'ready'); - do_check_eq(params, undefined); - - // if notification already received by observer, test is done - callbacksFired = true; - if (loginStateChanged && identityAuthComplete) { - do_test_finished(); - run_next_test(); - } - } - )); - - makeObserver("identity-auth-complete", function(aSubject, aTopic, aData) { - identityAuthComplete = true; - do_test_finished(); - run_next_test(); - }); - - makeObserver("identity-login-state-changed", function (aSubject, aTopic, aData) { - do_check_neq(aSubject, null); - - do_check_eq(aSubject.wrappedJSObject.rpId, mockedDoc.id); - do_check_eq(aData, id); - - // if callbacks in caller doc already fired, test is done. - loginStateChanged = true; - if (callbacksFired && identityAuthComplete) { - do_test_finished(); - run_next_test(); - } - }); - - IDService.RP.watch(mockedDoc); - - // Create a provisioning flow for our auth flow to attach to - setup_provisioning( - TEST_USER, - function(provFlow) { - _provId = provFlow.id; - - IDService.IDP.beginProvisioning(provFlow); - }, function() {}, - { - beginProvisioningCallback: function(email, duration_s) { - // let's say this user needs to authenticate - IDService.IDP._doAuthentication(_provId, {idpParams:TEST_IDPPARAMS}); - - // test_begin_authentication_flow verifies that the right - // message is sent to the UI. So that works. Moving on, - // the UI calls setAuthenticationFlow ... - _authId = uuid(); - IDService.IDP.setAuthenticationFlow(_authId, _provId); - - // ... then the UI calls beginAuthentication ... - authCaller.id = _authId; - IDService.IDP._provisionFlows[_provId].caller = authCaller; - IDService.IDP.beginAuthentication(authCaller); - } - } - ); - }); - - // A mock calling context - let authCaller = { - doBeginAuthenticationCallback: function doBeginAuthenticationCallback(identity) { - do_check_eq(identity, TEST_USER); - // completeAuthentication will emit "identity-auth-complete" - IDService.IDP.completeAuthentication(_authId); - }, - - doError: function(err) { - log("OW! My doError callback hurts!", err); - }, - }; - -} - -var TESTS = []; - -TESTS.push(test_begin_authentication_flow); -TESTS.push(test_complete_authentication_flow); - -TESTS.forEach(add_test); - -function run_test() { - run_next_test(); -} diff --git a/toolkit/identity/tests/unit/test_crypto_service.js b/toolkit/identity/tests/unit/test_crypto_service.js deleted file mode 100644 index 561c3804a7..0000000000 --- a/toolkit/identity/tests/unit/test_crypto_service.js +++ /dev/null @@ -1,122 +0,0 @@ -/* Any copyright is dedicated to the Public Domain. - http://creativecommons.org/publicdomain/zero/1.0/ */ - -"use strict"; - -Cu.import("resource://gre/modules/Services.jsm"); -Cu.import("resource://gre/modules/XPCOMUtils.jsm"); -Cu.import('resource://gre/modules/identity/LogUtils.jsm'); - -const idService = Cc["@mozilla.org/identity/crypto-service;1"] - .getService(Ci.nsIIdentityCryptoService); - -const ALG_DSA = "DS160"; -const ALG_RSA = "RS256"; - -const BASE64_URL_ENCODINGS = [ - // The vectors from RFC 4648 are very silly, but we may as well include them. - ["", ""], - ["f", "Zg=="], - ["fo", "Zm8="], - ["foo", "Zm9v"], - ["foob", "Zm9vYg=="], - ["fooba", "Zm9vYmE="], - ["foobar", "Zm9vYmFy"], - - // It's quite likely you could get a string like this in an assertion audience - ["i-like-pie.com", "aS1saWtlLXBpZS5jb20="], - - // A few extra to be really sure - ["andré@example.com", "YW5kcsOpQGV4YW1wbGUuY29t"], - ["πόλλ' οἶδ' ἀλώπηξ, ἀλλ' ἐχῖνος ἓν μέγα", - "z4DPjM67zrsnIM6_4by2zrQnIOG8gM67z47PgM63zr4sIOG8gM67zrsnIOG8kM-H4b-Wzr3Ov8-CIOG8k869IM68zq3Os86x"], -]; - -// When the output of an operation is a -function do_check_eq_or_slightly_less(x, y) { - do_check_true(x >= y - (3 * 8)); -} - -function test_base64_roundtrip() { - let message = "Attack at dawn!"; - let encoded = idService.base64UrlEncode(message); - let decoded = base64UrlDecode(encoded); - do_check_neq(message, encoded); - do_check_eq(decoded, message); - run_next_test(); -} - -function test_dsa() { - idService.generateKeyPair(ALG_DSA, function (rv, keyPair) { - log("DSA generateKeyPair finished ", rv); - do_check_true(Components.isSuccessCode(rv)); - do_check_eq(typeof keyPair.sign, "function"); - do_check_eq(keyPair.keyType, ALG_DSA); - do_check_eq_or_slightly_less(keyPair.hexDSAGenerator.length, 1024 / 8 * 2); - do_check_eq_or_slightly_less(keyPair.hexDSAPrime.length, 1024 / 8 * 2); - do_check_eq_or_slightly_less(keyPair.hexDSASubPrime.length, 160 / 8 * 2); - do_check_eq_or_slightly_less(keyPair.hexDSAPublicValue.length, 1024 / 8 * 2); - // XXX: test that RSA parameters throw the correct error - - log("about to sign with DSA key"); - keyPair.sign("foo", function (rv2, signature) { - log("DSA sign finished ", rv2, signature); - do_check_true(Components.isSuccessCode(rv2)); - do_check_true(signature.length > 1); - // TODO: verify the signature with the public key - run_next_test(); - }); - }); -} - -function test_rsa() { - idService.generateKeyPair(ALG_RSA, function (rv, keyPair) { - log("RSA generateKeyPair finished ", rv); - do_check_true(Components.isSuccessCode(rv)); - do_check_eq(typeof keyPair.sign, "function"); - do_check_eq(keyPair.keyType, ALG_RSA); - do_check_eq_or_slightly_less(keyPair.hexRSAPublicKeyModulus.length, - 2048 / 8); - do_check_true(keyPair.hexRSAPublicKeyExponent.length > 1); - - log("about to sign with RSA key"); - keyPair.sign("foo", function (rv2, signature) { - log("RSA sign finished ", rv2, signature); - do_check_true(Components.isSuccessCode(rv2)); - do_check_true(signature.length > 1); - run_next_test(); - }); - }); -} - -function test_base64UrlEncode() { - for (let [source, target] of BASE64_URL_ENCODINGS) { - do_check_eq(target, idService.base64UrlEncode(source)); - } - run_next_test(); -} - -function test_base64UrlDecode() { - let utf8Converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"] - .createInstance(Ci.nsIScriptableUnicodeConverter); - utf8Converter.charset = "UTF-8"; - - // We know the encoding of our inputs - on conversion back out again, make - // sure they're the same. - for (let [source, target] of BASE64_URL_ENCODINGS) { - let result = utf8Converter.ConvertToUnicode(base64UrlDecode(target)); - result += utf8Converter.Finish(); - do_check_eq(source, result); - } - run_next_test(); -} - -add_test(test_base64_roundtrip); -add_test(test_dsa); -add_test(test_rsa); -add_test(test_base64UrlEncode); -add_test(test_base64UrlDecode); - -function run_test() { - run_next_test(); -} diff --git a/toolkit/identity/tests/unit/test_identity.js b/toolkit/identity/tests/unit/test_identity.js deleted file mode 100644 index 5e2206c2a2..0000000000 --- a/toolkit/identity/tests/unit/test_identity.js +++ /dev/null @@ -1,114 +0,0 @@ -/* Any copyright is dedicated to the Public Domain. - http://creativecommons.org/publicdomain/zero/1.0/ */ - -"use strict"; - -XPCOMUtils.defineLazyModuleGetter(this, "IDService", - "resource://gre/modules/identity/Identity.jsm", - "IdentityService"); - -function test_overall() { - do_check_neq(IDService, null); - run_next_test(); -} - -function test_mock_doc() { - do_test_pending(); - let mockedDoc = mock_doc(null, TEST_URL, function(action, params) { - do_check_eq(action, 'coffee'); - do_test_finished(); - run_next_test(); - }); - - mockedDoc.doCoffee(); -} - -function test_add_identity() { - IDService.reset(); - - IDService.addIdentity(TEST_USER); - - let identities = IDService.RP.getIdentitiesForSite(TEST_URL); - do_check_eq(identities.result.length, 1); - do_check_eq(identities.result[0], TEST_USER); - - run_next_test(); -} - -function test_select_identity() { - do_test_pending(); - - IDService.reset(); - - let id = "ishtar@mockmyid.com"; - setup_test_identity(id, TEST_CERT, function() { - let gotAssertion = false; - let mockedDoc = mock_doc(null, TEST_URL, call_sequentially( - function(action, params) { - // ready emitted from first watch() call - do_check_eq(action, 'ready'); - do_check_null(params); - }, - // first the login call - function(action, params) { - do_check_eq(action, 'login'); - do_check_neq(params, null); - - // XXX - check that the assertion is for the right email - - gotAssertion = true; - }, - // then the ready call - function(action, params) { - do_check_eq(action, 'ready'); - do_check_null(params); - - // we should have gotten the assertion already - do_check_true(gotAssertion); - - do_test_finished(); - run_next_test(); - })); - - // register the callbacks - IDService.RP.watch(mockedDoc); - - // register the request UX observer - makeObserver("identity-request", function (aSubject, aTopic, aData) { - // do the select identity - // we expect this to succeed right away because of test_identity - // so we don't mock network requests or otherwise - IDService.selectIdentity(aSubject.wrappedJSObject.rpId, id); - }); - - // do the request - IDService.RP.request(mockedDoc.id, {}); - }); -} - -function test_parse_good_email() { - var parsed = IDService.parseEmail('prime-minister@jed.gov'); - do_check_eq(parsed.username, 'prime-minister'); - do_check_eq(parsed.domain, 'jed.gov'); - run_next_test(); -} - -function test_parse_bogus_emails() { - do_check_eq(null, IDService.parseEmail('@evil.org')); - do_check_eq(null, IDService.parseEmail('foo@bar@baz.com')); - do_check_eq(null, IDService.parseEmail('you@wellsfargo.com/accounts/transfer?to=dolske&amt=all')); - run_next_test(); -} - -var TESTS = [test_overall, test_mock_doc]; - -TESTS.push(test_add_identity); -TESTS.push(test_select_identity); -TESTS.push(test_parse_good_email); -TESTS.push(test_parse_bogus_emails); - -TESTS.forEach(add_test); - -function run_test() { - run_next_test(); -} diff --git a/toolkit/identity/tests/unit/test_identity_utils.js b/toolkit/identity/tests/unit/test_identity_utils.js deleted file mode 100644 index 6ccc4e311b..0000000000 --- a/toolkit/identity/tests/unit/test_identity_utils.js +++ /dev/null @@ -1,46 +0,0 @@ - -"use strict"; - -Cu.import("resource://gre/modules/XPCOMUtils.jsm"); -Cu.import('resource://gre/modules/Services.jsm'); -Cu.import('resource://gre/modules/identity/IdentityUtils.jsm'); - -function test_check_deprecated() { - let options = { - id: 123, - loggedInEmail: "jed@foo.com", - pies: 42 - }; - - do_check_true(checkDeprecated(options, "loggedInEmail")); - do_check_false(checkDeprecated(options, "flans")); - - run_next_test(); -} - -function test_check_renamed() { - let options = { - id: 123, - loggedInEmail: "jed@foo.com", - pies: 42 - }; - - checkRenamed(options, "loggedInEmail", "loggedInUser"); - - // It moves loggedInEmail to loggedInUser - do_check_false(!!options.loggedInEmail); - do_check_eq(options.loggedInUser, "jed@foo.com"); - - run_next_test(); -} - -var TESTS = [ - test_check_deprecated, - test_check_renamed -]; - -TESTS.forEach(add_test); - -function run_test() { - run_next_test(); -} diff --git a/toolkit/identity/tests/unit/test_jwcrypto.js b/toolkit/identity/tests/unit/test_jwcrypto.js deleted file mode 100644 index f8fe82453c..0000000000 --- a/toolkit/identity/tests/unit/test_jwcrypto.js +++ /dev/null @@ -1,281 +0,0 @@ -/* Any copyright is dedicated to the Public Domain. - http://creativecommons.org/publicdomain/zero/1.0/ */ - -"use strict" - -Cu.import('resource://gre/modules/identity/LogUtils.jsm'); - -XPCOMUtils.defineLazyModuleGetter(this, "IDService", - "resource://gre/modules/identity/Identity.jsm", - "IdentityService"); - -XPCOMUtils.defineLazyModuleGetter(this, "jwcrypto", - "resource://gre/modules/identity/jwcrypto.jsm"); - -XPCOMUtils.defineLazyServiceGetter(this, - "CryptoService", - "@mozilla.org/identity/crypto-service;1", - "nsIIdentityCryptoService"); - -const RP_ORIGIN = "http://123done.org"; -const INTERNAL_ORIGIN = "browserid://"; - -const SECOND_MS = 1000; -const MINUTE_MS = SECOND_MS * 60; -const HOUR_MS = MINUTE_MS * 60; - -function test_sanity() { - do_test_pending(); - - jwcrypto.generateKeyPair("DS160", function(err, kp) { - do_check_null(err); - - do_test_finished(); - run_next_test(); - }); -} - -function test_generate() { - do_test_pending(); - jwcrypto.generateKeyPair("DS160", function(err, kp) { - do_check_null(err); - do_check_neq(kp, null); - - do_test_finished(); - run_next_test(); - }); -} - -function test_get_assertion() { - do_test_pending(); - - jwcrypto.generateKeyPair( - "DS160", - function(err, kp) { - jwcrypto.generateAssertion("fake-cert", kp, RP_ORIGIN, (err2, backedAssertion) => { - do_check_null(err2); - - do_check_eq(backedAssertion.split("~").length, 2); - do_check_eq(backedAssertion.split(".").length, 3); - - do_test_finished(); - run_next_test(); - }); - }); -} - -function test_rsa() { - do_test_pending(); - function checkRSA(err, kpo) { - do_check_neq(kpo, undefined); - log(kpo.serializedPublicKey); - let pk = JSON.parse(kpo.serializedPublicKey); - do_check_eq(pk.algorithm, "RS"); -/* TODO - do_check_neq(kpo.sign, null); - do_check_eq(typeof kpo.sign, "function"); - do_check_neq(kpo.userID, null); - do_check_neq(kpo.url, null); - do_check_eq(kpo.url, INTERNAL_ORIGIN); - do_check_neq(kpo.exponent, null); - do_check_neq(kpo.modulus, null); - - // TODO: should sign be async? - let sig = kpo.sign("This is a message to sign"); - - do_check_neq(sig, null); - do_check_eq(typeof sig, "string"); - do_check_true(sig.length > 1); -*/ - do_test_finished(); - run_next_test(); - } - - jwcrypto.generateKeyPair("RS256", checkRSA); -} - -function test_dsa() { - do_test_pending(); - function checkDSA(err, kpo) { - do_check_neq(kpo, undefined); - log(kpo.serializedPublicKey); - let pk = JSON.parse(kpo.serializedPublicKey); - do_check_eq(pk.algorithm, "DS"); -/* TODO - do_check_neq(kpo.sign, null); - do_check_eq(typeof kpo.sign, "function"); - do_check_neq(kpo.userID, null); - do_check_neq(kpo.url, null); - do_check_eq(kpo.url, INTERNAL_ORIGIN); - do_check_neq(kpo.generator, null); - do_check_neq(kpo.prime, null); - do_check_neq(kpo.subPrime, null); - do_check_neq(kpo.publicValue, null); - - let sig = kpo.sign("This is a message to sign"); - - do_check_neq(sig, null); - do_check_eq(typeof sig, "string"); - do_check_true(sig.length > 1); -*/ - do_test_finished(); - run_next_test(); - } - - jwcrypto.generateKeyPair("DS160", checkDSA); -} - -function test_get_assertion_with_offset() { - do_test_pending(); - - - // Use an arbitrary date in the past to ensure we don't accidentally pass - // this test with current dates, missing offsets, etc. - let serverMsec = Date.parse("Tue Oct 31 2000 00:00:00 GMT-0800"); - - // local clock skew - // clock is 12 hours fast; -12 hours offset must be applied - let localtimeOffsetMsec = -1 * 12 * HOUR_MS; - let localMsec = serverMsec - localtimeOffsetMsec; - - jwcrypto.generateKeyPair( - "DS160", - function(err, kp) { - jwcrypto.generateAssertion("fake-cert", kp, RP_ORIGIN, - { duration: MINUTE_MS, - localtimeOffsetMsec: localtimeOffsetMsec, - now: localMsec}, - function(err2, backedAssertion) { - do_check_null(err2); - - // properly formed - let cert; - let assertion; - [cert, assertion] = backedAssertion.split("~"); - - do_check_eq(cert, "fake-cert"); - do_check_eq(assertion.split(".").length, 3); - - let components = extractComponents(assertion); - - // Expiry is within two minutes, corrected for skew - let exp = parseInt(components.payload.exp, 10); - do_check_true(exp - serverMsec === MINUTE_MS); - - do_test_finished(); - run_next_test(); - } - ); - } - ); -} - -function test_assertion_lifetime() { - do_test_pending(); - - jwcrypto.generateKeyPair( - "DS160", - function(err, kp) { - jwcrypto.generateAssertion("fake-cert", kp, RP_ORIGIN, - {duration: MINUTE_MS}, - function(err2, backedAssertion) { - do_check_null(err2); - - // properly formed - let cert; - let assertion; - [cert, assertion] = backedAssertion.split("~"); - - do_check_eq(cert, "fake-cert"); - do_check_eq(assertion.split(".").length, 3); - - let components = extractComponents(assertion); - - // Expiry is within one minute, as we specified above - let exp = parseInt(components.payload.exp, 10); - do_check_true(Math.abs(Date.now() - exp) > 50 * SECOND_MS); - do_check_true(Math.abs(Date.now() - exp) <= MINUTE_MS); - - do_test_finished(); - run_next_test(); - } - ); - } - ); -} - -function test_audience_encoding_bug972582() { - let audience = "i-like-pie.com"; - - jwcrypto.generateKeyPair( - "DS160", - function(err, kp) { - do_check_null(err); - jwcrypto.generateAssertion("fake-cert", kp, audience, - function(err2, backedAssertion) { - do_check_null(err2); - - let [cert, assertion] = backedAssertion.split("~"); - let components = extractComponents(assertion); - do_check_eq(components.payload.aud, audience); - - do_test_finished(); - run_next_test(); - } - ); - } - ); -} - -// End of tests -// Helper function follow - -function extractComponents(signedObject) { - if (typeof(signedObject) != 'string') { - throw new Error("malformed signature " + typeof(signedObject)); - } - - let parts = signedObject.split("."); - if (parts.length != 3) { - throw new Error("signed object must have three parts, this one has " + parts.length); - } - - let headerSegment = parts[0]; - let payloadSegment = parts[1]; - let cryptoSegment = parts[2]; - - let header = JSON.parse(base64UrlDecode(headerSegment)); - let payload = JSON.parse(base64UrlDecode(payloadSegment)); - - // Ensure well-formed header - do_check_eq(Object.keys(header).length, 1); - do_check_true(!!header.alg); - - // Ensure well-formed payload - for (let field of ["exp", "aud"]) { - do_check_true(!!payload[field]); - } - - return {header: header, - payload: payload, - headerSegment: headerSegment, - payloadSegment: payloadSegment, - cryptoSegment: cryptoSegment}; -} - -var TESTS = [ - test_sanity, - test_generate, - test_get_assertion, - test_get_assertion_with_offset, - test_assertion_lifetime, - test_audience_encoding_bug972582, -]; - -TESTS = TESTS.concat([test_rsa, test_dsa]); - -TESTS.forEach(add_test); - -function run_test() { - run_next_test(); -} diff --git a/toolkit/identity/tests/unit/test_load_modules.js b/toolkit/identity/tests/unit/test_load_modules.js deleted file mode 100644 index 4c531312cb..0000000000 --- a/toolkit/identity/tests/unit/test_load_modules.js +++ /dev/null @@ -1,20 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this file, - * You can obtain one at http://mozilla.org/MPL/2.0/. */ - -const modules = [ - "Identity.jsm", - "IdentityProvider.jsm", - "IdentityStore.jsm", - "jwcrypto.jsm", - "RelyingParty.jsm", - "Sandbox.jsm", -]; - -function run_test() { - for (let m of modules) { - let resource = "resource://gre/modules/identity/" + m; - Components.utils.import(resource, {}); - do_print("loaded " + resource); - } -} diff --git a/toolkit/identity/tests/unit/test_log_utils.js b/toolkit/identity/tests/unit/test_log_utils.js deleted file mode 100644 index ac43c297d1..0000000000 --- a/toolkit/identity/tests/unit/test_log_utils.js +++ /dev/null @@ -1,74 +0,0 @@ - -"use strict"; - -Cu.import("resource://gre/modules/XPCOMUtils.jsm"); -Cu.import('resource://gre/modules/Services.jsm'); -Cu.import('resource://gre/modules/identity/LogUtils.jsm'); - -function toggle_debug() { - do_test_pending(); - - function Wrapper() { - this.init(); - } - Wrapper.prototype = { - QueryInterface: XPCOMUtils.generateQI([Ci.nsISupports, Ci.nsIObserver]), - - observe: function observe(aSubject, aTopic, aData) { - if (aTopic === "nsPref:changed") { - // race condition? - do_check_eq(Logger._debug, true); - do_test_finished(); - run_next_test(); - } - }, - - init: function() { - Services.prefs.addObserver('toolkit.identity.debug', this, false); - } - }; - - var wrapper = new Wrapper(); - Services.prefs.setBoolPref('toolkit.identity.debug', true); -} - -// test that things don't break - -function logAlias(...args) { - Logger.log.apply(Logger, ["log alias"].concat(args)); -} -function reportErrorAlias(...args) { - Logger.reportError.apply(Logger, ["report error alias"].concat(args)); -} - -function test_log() { - Logger.log("log test", "I like pie"); - do_test_finished(); - run_next_test(); -} - -function test_reportError() { - Logger.reportError("log test", "We are out of pies!!!"); - do_test_finished(); - run_next_test(); -} - -function test_wrappers() { - logAlias("I like potatoes"); - do_test_finished(); - reportErrorAlias("Too much red bull"); -} - -var TESTS = [ -// XXX fix me -// toggle_debug, - test_log, - test_reportError, - test_wrappers, -]; - -TESTS.forEach(add_test); - -function run_test() { - run_next_test(); -} diff --git a/toolkit/identity/tests/unit/test_minimalidentity.js b/toolkit/identity/tests/unit/test_minimalidentity.js deleted file mode 100644 index 77c30c84f4..0000000000 --- a/toolkit/identity/tests/unit/test_minimalidentity.js +++ /dev/null @@ -1,223 +0,0 @@ -/* Any copyright is dedicated to the Public Domain. - * http://creativecommons.org/publicdomain/zero/1.0/ */ - -"use strict"; - -XPCOMUtils.defineLazyModuleGetter(this, "MinimalIDService", - "resource://gre/modules/identity/MinimalIdentity.jsm", - "IdentityService"); - -Cu.import("resource://gre/modules/identity/LogUtils.jsm"); -Cu.import("resource://gre/modules/DOMIdentity.jsm"); - -function log(...aMessageArgs) { - Logger.log.apply(Logger, ["test_minimalidentity"].concat(aMessageArgs)); -} - -function test_overall() { - do_check_neq(MinimalIDService, null); - run_next_test(); -} - -function test_mock_doc() { - do_test_pending(); - let mockedDoc = mock_doc(null, TEST_URL, function(action, params) { - do_check_eq(action, 'coffee'); - do_test_finished(); - run_next_test(); - }); - - mockedDoc.doCoffee(); -} - -/* - * Test that the "identity-controller-watch" signal is emitted correctly - */ -function test_watch() { - do_test_pending(); - - let mockedDoc = mock_doc(null, TEST_URL); - makeObserver("identity-controller-watch", function (aSubject, aTopic, aData) { - do_check_eq(aSubject.wrappedJSObject.id, mockedDoc.id); - do_check_eq(aSubject.wrappedJSObject.origin, TEST_URL); - do_test_finished(); - run_next_test(); - }); - - MinimalIDService.RP.watch(mockedDoc); -} - -/* - * Test that the "identity-controller-request" signal is emitted correctly - */ -function test_request() { - do_test_pending(); - - let mockedDoc = mock_doc(null, TEST_URL); - makeObserver("identity-controller-request", function (aSubject, aTopic, aData) { - do_check_eq(aSubject.wrappedJSObject.id, mockedDoc.id); - do_check_eq(aSubject.wrappedJSObject.origin, TEST_URL); - do_test_finished(); - run_next_test(); - }); - - MinimalIDService.RP.watch(mockedDoc); - MinimalIDService.RP.request(mockedDoc.id, {}); -} - -/* - * Test that the forceAuthentication flag can be sent - */ -function test_request_forceAuthentication() { - do_test_pending(); - - let mockedDoc = mock_doc(null, TEST_URL); - makeObserver("identity-controller-request", function (aSubject, aTopic, aData) { - do_check_eq(aSubject.wrappedJSObject.id, mockedDoc.id); - do_check_eq(aSubject.wrappedJSObject.origin, TEST_URL); - do_check_eq(aSubject.wrappedJSObject.forceAuthentication, true); - do_test_finished(); - run_next_test(); - }); - - MinimalIDService.RP.watch(mockedDoc); - MinimalIDService.RP.request(mockedDoc.id, {forceAuthentication: true}); -} - -/* - * Test that the issuer can be forced - */ -function test_request_forceIssuer() { - do_test_pending(); - - let mockedDoc = mock_doc(null, TEST_URL); - makeObserver("identity-controller-request", function (aSubject, aTopic, aData) { - do_check_eq(aSubject.wrappedJSObject.id, mockedDoc.id); - do_check_eq(aSubject.wrappedJSObject.origin, TEST_URL); - do_check_eq(aSubject.wrappedJSObject.issuer, "https://jed.gov"); - do_test_finished(); - run_next_test(); - }); - - MinimalIDService.RP.watch(mockedDoc); - MinimalIDService.RP.request(mockedDoc.id, {issuer: "https://jed.gov"}); -} - -/* - * Test that the "identity-controller-logout" signal is emitted correctly - */ -function test_logout() { - do_test_pending(); - - let mockedDoc = mock_doc(null, TEST_URL); - makeObserver("identity-controller-logout", function (aSubject, aTopic, aData) { - do_check_eq(aSubject.wrappedJSObject.id, mockedDoc.id); - do_test_finished(); - run_next_test(); - }); - - MinimalIDService.RP.watch(mockedDoc); - MinimalIDService.RP.logout(mockedDoc.id, {}); -} - -/* - * Test that logout() before watch() fails gently - */ - -function test_logoutBeforeWatch() { - do_test_pending(); - - let mockedDoc = mock_doc(null, TEST_URL); - makeObserver("identity-controller-logout", function() { - do_throw("How can we logout when watch was not called?"); - }); - - MinimalIDService.RP.logout(mockedDoc.id, {}); - do_test_finished(); - run_next_test(); -} - -/* - * Test that request() before watch() fails gently - */ - -function test_requestBeforeWatch() { - do_test_pending(); - - let mockedDoc = mock_doc(null, TEST_URL); - makeObserver("identity-controller-request", function() { - do_throw("How can we request when watch was not called?"); - }); - - MinimalIDService.RP.request(mockedDoc.id, {}); - do_test_finished(); - run_next_test(); -} - -/* - * Test that internal unwatch() before watch() fails gently - */ - -function test_unwatchBeforeWatch() { - do_test_pending(); - - let mockedDoc = mock_doc(null, TEST_URL); - - MinimalIDService.RP.unwatch(mockedDoc.id, {}); - do_test_finished(); - run_next_test(); -} - -/* - * Test that the RP flow is cleaned up on child process shutdown - */ - -function test_childProcessShutdown() { - do_test_pending(); - let UNIQUE_MESSAGE_MANAGER = "i am a beautiful snowflake"; - let initialRPCount = Object.keys(MinimalIDService.RP._rpFlows).length; - - let mockedDoc = mock_doc(null, TEST_URL, (action, params) => { - if (action == "child-process-shutdown") { - // since there's no actual dom window connection, we have to - // do this bit manually here. - MinimalIDService.RP.childProcessShutdown(UNIQUE_MESSAGE_MANAGER); - } - }); - mockedDoc._mm = UNIQUE_MESSAGE_MANAGER; - - makeObserver("identity-controller-watch", function (aSubject, aTopic, aData) { - DOMIdentity._childProcessShutdown(UNIQUE_MESSAGE_MANAGER); - }); - - makeObserver("identity-child-process-shutdown", (aTopic, aSubject, aData) => { - do_check_eq(Object.keys(MinimalIDService.RP._rpFlows).length, initialRPCount); - do_test_finished(); - run_next_test(); - }); - - // fake a dom window context - DOMIdentity.newContext(mockedDoc, UNIQUE_MESSAGE_MANAGER); - - MinimalIDService.RP.watch(mockedDoc); -} - -var TESTS = [ - test_overall, - test_mock_doc, - test_watch, - test_request, - test_request_forceAuthentication, - test_request_forceIssuer, - test_logout, - test_logoutBeforeWatch, - test_requestBeforeWatch, - test_unwatchBeforeWatch, - test_childProcessShutdown, -]; - -TESTS.forEach(add_test); - -function run_test() { - run_next_test(); -} diff --git a/toolkit/identity/tests/unit/test_observer_topics.js b/toolkit/identity/tests/unit/test_observer_topics.js deleted file mode 100644 index 8e5a89c91a..0000000000 --- a/toolkit/identity/tests/unit/test_observer_topics.js +++ /dev/null @@ -1,114 +0,0 @@ -/* Any copyright is dedicated to the Public Domain. - http://creativecommons.org/publicdomain/zero/1.0/ */ - -/** - * By their nature, these tests duplicate some of the functionality of - * other tests for Identity, RelyingParty, and IdentityProvider. - * - * In particular, "identity-auth-complete" and - * "identity-login-state-changed" are tested in test_authentication.js - */ - -"use strict"; - -XPCOMUtils.defineLazyModuleGetter(this, "IDService", - "resource://gre/modules/identity/Identity.jsm", - "IdentityService"); - -function test_smoke() { - do_check_neq(IDService, null); - run_next_test(); -} - -function test_identity_request() { - // In response to navigator.id.request(), initiate a login with user - // interaction by notifying observers of 'identity-request' - - do_test_pending(); - - IDService.reset(); - - let id = "landru@mockmyid.com"; - setup_test_identity(id, TEST_CERT, function() { - // deliberately adding a trailing final slash on the domain - // to test path composition - let mockedDoc = mock_doc(null, "http://jed.gov/", function() {}); - - // by calling watch() we create an rp flow. - IDService.RP.watch(mockedDoc); - - // register the request UX observer - makeObserver("identity-request", function (aSubject, aTopic, aData) { - do_check_eq(aTopic, "identity-request"); - do_check_eq(aData, null); - - // check that all the URLs are properly resolved - let subj = aSubject.wrappedJSObject; - do_check_eq(subj.privacyPolicy, "http://jed.gov/pp.html"); - do_check_eq(subj.termsOfService, "http://jed.gov/tos.html"); - - do_test_finished(); - run_next_test(); - }); - - let requestOptions = { - privacyPolicy: "/pp.html", - termsOfService: "/tos.html" - }; - IDService.RP.request(mockedDoc.id, requestOptions); - }); - -} - -function test_identity_auth() { - // see test_authentication.js for "identity-auth-complete" - // and "identity-login-state-changed" - - do_test_pending(); - let _provId = "bogus"; - - // Simulate what would be returned by IDService._fetchWellKnownFile - // for a given domain. - let idpParams = { - domain: "myfavoriteflan.com", - idpParams: { - authentication: "/foo/authenticate.html", - provisioning: "/foo/provision.html" - } - }; - - // Create an RP flow - let mockedDoc = mock_doc(null, TEST_URL, function(action, params) {}); - IDService.RP.watch(mockedDoc); - - // The identity-auth notification is sent up to the UX from the - // _doAuthentication function. Be ready to receive it and call - // beginAuthentication - makeObserver("identity-auth", function (aSubject, aTopic, aData) { - do_check_neq(aSubject, null); - do_check_eq(aTopic, "identity-auth"); - do_check_eq(aData, "https://myfavoriteflan.com/foo/authenticate.html"); - - do_check_eq(aSubject.wrappedJSObject.provId, _provId); - do_test_finished(); - run_next_test(); - }); - - // Even though our provisioning flow id is bogus, IdentityProvider - // won't look at it until farther along in the authentication - // process. So this test can pass with a fake provId. - IDService.IDP._doAuthentication(_provId, idpParams); -} - -var TESTS = [ - test_smoke, - test_identity_request, - test_identity_auth, - ]; - - -TESTS.forEach(add_test); - -function run_test() { - run_next_test(); -} diff --git a/toolkit/identity/tests/unit/test_provisioning.js b/toolkit/identity/tests/unit/test_provisioning.js deleted file mode 100644 index c05805befd..0000000000 --- a/toolkit/identity/tests/unit/test_provisioning.js +++ /dev/null @@ -1,242 +0,0 @@ -/* Any copyright is dedicated to the Public Domain. - http://creativecommons.org/publicdomain/zero/1.0/ */ - -"use strict"; - -Cu.import("resource://gre/modules/identity/IdentityProvider.jsm"); - -function check_provision_flow_done(provId) { - do_check_null(IdentityProvider._provisionFlows[provId]); -} - -function test_begin_provisioning() { - do_test_pending(); - - setup_provisioning( - TEST_USER, - function(caller) { - // call .beginProvisioning() - IdentityProvider.beginProvisioning(caller); - }, function() {}, - { - beginProvisioningCallback: function(email, duration_s) { - do_check_eq(email, TEST_USER); - do_check_true(duration_s > 0); - do_check_true(duration_s <= (24 * 3600)); - - do_test_finished(); - run_next_test(); - } - }); -} - -function test_raise_provisioning_failure() { - do_test_pending(); - let _callerId = null; - - setup_provisioning( - TEST_USER, - function(caller) { - // call .beginProvisioning() - _callerId = caller.id; - IdentityProvider.beginProvisioning(caller); - }, function(err) { - // this should be invoked with a populated error - do_check_neq(err, null); - do_check_true(err.indexOf("can't authenticate this email") > -1); - - do_test_finished(); - run_next_test(); - }, - { - beginProvisioningCallback: function(email, duration_s) { - // raise the failure as if we can't provision this email - IdentityProvider.raiseProvisioningFailure(_callerId, "can't authenticate this email"); - } - }); -} - -function test_genkeypair_before_begin_provisioning() { - do_test_pending(); - - setup_provisioning( - TEST_USER, - function(caller) { - // call genKeyPair without beginProvisioning - IdentityProvider.genKeyPair(caller.id); - }, - // expect this to be called with an error - function(err) { - do_check_neq(err, null); - - do_test_finished(); - run_next_test(); - }, - { - // this should not be called at all! - genKeyPairCallback: function(pk) { - // a test that will surely fail because we shouldn't be here. - do_check_true(false); - - do_test_finished(); - run_next_test(); - } - } - ); -} - -function test_genkeypair() { - do_test_pending(); - let _callerId = null; - - setup_provisioning( - TEST_USER, - function(caller) { - _callerId = caller.id; - IdentityProvider.beginProvisioning(caller); - }, - function(err) { - // should not be called! - do_check_true(false); - - do_test_finished(); - run_next_test(); - }, - { - beginProvisioningCallback: function(email, time_s) { - IdentityProvider.genKeyPair(_callerId); - }, - genKeyPairCallback: function(kp) { - do_check_neq(kp, null); - - // yay! - do_test_finished(); - run_next_test(); - } - } - ); -} - -// we've already ensured that genkeypair can't be called -// before beginProvisioning, so this test should be enough -// to ensure full sequential call of the 3 APIs. -function test_register_certificate_before_genkeypair() { - do_test_pending(); - let _callerID = null; - - setup_provisioning( - TEST_USER, - function(caller) { - // do the right thing for beginProvisioning - _callerID = caller.id; - IdentityProvider.beginProvisioning(caller); - }, - // expect this to be called with an error - function(err) { - do_check_neq(err, null); - - do_test_finished(); - run_next_test(); - }, - { - beginProvisioningCallback: function(email, duration_s) { - // now we try to register cert but no keygen has been done - IdentityProvider.registerCertificate(_callerID, "fake-cert"); - } - } - ); -} - -function test_register_certificate() { - do_test_pending(); - let _callerId = null; - - setup_provisioning( - TEST_USER, - function(caller) { - _callerId = caller.id; - IdentityProvider.beginProvisioning(caller); - }, - function(err) { - // we should be cool! - do_check_null(err); - - // check that the cert is there - let identity = get_idstore().fetchIdentity(TEST_USER); - do_check_neq(identity, null); - do_check_eq(identity.cert, "fake-cert-42"); - - do_execute_soon(function check_done() { - // cleanup will happen after the callback is called - check_provision_flow_done(_callerId); - - do_test_finished(); - run_next_test(); - }); - }, - { - beginProvisioningCallback: function(email, duration_s) { - IdentityProvider.genKeyPair(_callerId); - }, - genKeyPairCallback: function(pk) { - IdentityProvider.registerCertificate(_callerId, "fake-cert-42"); - } - } - ); -} - - -function test_get_assertion_after_provision() { - do_test_pending(); - let _callerId = null; - - setup_provisioning( - TEST_USER, - function(caller) { - _callerId = caller.id; - IdentityProvider.beginProvisioning(caller); - }, - function(err) { - // we should be cool! - do_check_null(err); - - // check that the cert is there - let identity = get_idstore().fetchIdentity(TEST_USER); - do_check_neq(identity, null); - do_check_eq(identity.cert, "fake-cert-42"); - - do_execute_soon(function check_done() { - // cleanup will happen after the callback is called - check_provision_flow_done(_callerId); - - do_test_finished(); - run_next_test(); - }); - }, - { - beginProvisioningCallback: function(email, duration_s) { - IdentityProvider.genKeyPair(_callerId); - }, - genKeyPairCallback: function(pk) { - IdentityProvider.registerCertificate(_callerId, "fake-cert-42"); - } - } - ); - -} - -var TESTS = []; - -TESTS.push(test_begin_provisioning); -TESTS.push(test_raise_provisioning_failure); -TESTS.push(test_genkeypair_before_begin_provisioning); -TESTS.push(test_genkeypair); -TESTS.push(test_register_certificate_before_genkeypair); -TESTS.push(test_register_certificate); -TESTS.push(test_get_assertion_after_provision); - -TESTS.forEach(add_test); - -function run_test() { - run_next_test(); -} diff --git a/toolkit/identity/tests/unit/test_relying_party.js b/toolkit/identity/tests/unit/test_relying_party.js deleted file mode 100644 index e78d227792..0000000000 --- a/toolkit/identity/tests/unit/test_relying_party.js +++ /dev/null @@ -1,255 +0,0 @@ -/* Any copyright is dedicated to the Public Domain. - http://creativecommons.org/publicdomain/zero/1.0/ */ - -"use strict"; - -XPCOMUtils.defineLazyModuleGetter(this, "RelyingParty", - "resource://gre/modules/identity/RelyingParty.jsm"); - -function resetState() { - get_idstore().reset(); - RelyingParty.reset(); -} - -function test_watch_loggedin_ready() { - do_test_pending(); - - resetState(); - - let id = TEST_USER; - setup_test_identity(id, TEST_CERT, function() { - let store = get_idstore(); - - // set it up so we're supposed to be logged in to TEST_URL - store.setLoginState(TEST_URL, true, id); - RelyingParty.watch(mock_doc(id, TEST_URL, function(action, params) { - do_check_eq(action, 'ready'); - do_check_eq(params, undefined); - - do_test_finished(); - run_next_test(); - })); - }); -} - -function test_watch_loggedin_login() { - do_test_pending(); - - resetState(); - - let id = TEST_USER; - setup_test_identity(id, TEST_CERT, function() { - let store = get_idstore(); - - // set it up so we're supposed to be logged in to TEST_URL - store.setLoginState(TEST_URL, true, id); - - // check for first a login() call, then a ready() call - RelyingParty.watch(mock_doc(null, TEST_URL, call_sequentially( - function(action, params) { - do_check_eq(action, 'login'); - do_check_neq(params, null); - }, - function(action, params) { - do_check_eq(action, 'ready'); - do_check_null(params); - - do_test_finished(); - run_next_test(); - } - ))); - }); -} - -function test_watch_loggedin_logout() { - do_test_pending(); - - resetState(); - - let id = TEST_USER; - let other_id = "otherid@foo.com"; - setup_test_identity(other_id, TEST_CERT, function() { - setup_test_identity(id, TEST_CERT, function() { - let store = get_idstore(); - - // set it up so we're supposed to be logged in to TEST_URL - // with id, not other_id - store.setLoginState(TEST_URL, true, id); - - // this should cause a login with an assertion for id, - // not for other_id - RelyingParty.watch(mock_doc(other_id, TEST_URL, call_sequentially( - function(action, params) { - do_check_eq(action, 'login'); - do_check_neq(params, null); - }, - function(action, params) { - do_check_eq(action, 'ready'); - do_check_null(params); - - do_test_finished(); - run_next_test(); - } - ))); - }); - }); -} - -function test_watch_notloggedin_ready() { - do_test_pending(); - - resetState(); - - RelyingParty.watch(mock_doc(null, TEST_URL, function(action, params) { - do_check_eq(action, 'ready'); - do_check_eq(params, undefined); - - do_test_finished(); - run_next_test(); - })); -} - -function test_watch_notloggedin_logout() { - do_test_pending(); - - resetState(); - - RelyingParty.watch(mock_doc(TEST_USER, TEST_URL, call_sequentially( - function(action, params) { - do_check_eq(action, 'logout'); - do_check_eq(params, undefined); - - let store = get_idstore(); - do_check_null(store.getLoginState(TEST_URL)); - }, - function(action, params) { - do_check_eq(action, 'ready'); - do_check_eq(params, undefined); - do_test_finished(); - run_next_test(); - } - ))); -} - -function test_request() { - do_test_pending(); - - // set up a watch, to be consistent - let mockedDoc = mock_doc(null, TEST_URL, function(action, params) { - // this isn't going to be called for now - // XXX but it is called - is that bad? - }); - - RelyingParty.watch(mockedDoc); - - // be ready for the UX identity-request notification - makeObserver("identity-request", function (aSubject, aTopic, aData) { - do_check_neq(aSubject, null); - - do_check_eq(aSubject.wrappedJSObject.rpId, mockedDoc.id); - - do_test_finished(); - run_next_test(); - }); - - RelyingParty.request(mockedDoc.id, {}); -} - -/* - * ensure the forceAuthentication param can be passed through - */ -function test_request_forceAuthentication() { - do_test_pending(); - - let mockedDoc = mock_doc(null, TEST_URL, function(action, params) {}); - - RelyingParty.watch(mockedDoc); - - makeObserver("identity-request", function(aSubject, aTopic, aData) { - do_check_eq(aSubject.wrappedJSObject.rpId, mockedDoc.id); - do_check_eq(aSubject.wrappedJSObject.forceAuthentication, true); - do_test_finished(); - run_next_test(); - }); - - RelyingParty.request(mockedDoc.id, {forceAuthentication: true}); -} - -/* - * ensure the issuer can be forced - */ -function test_request_forceIssuer() { - do_test_pending(); - - let mockedDoc = mock_doc(null, TEST_URL, function(action, params) {}); - - RelyingParty.watch(mockedDoc); - - makeObserver("identity-request", function(aSubject, aTopic, aData) { - do_check_eq(aSubject.wrappedJSObject.rpId, mockedDoc.id); - do_check_eq(aSubject.wrappedJSObject.issuer, "https://ozten.co.uk"); - do_test_finished(); - run_next_test(); - }); - - RelyingParty.request(mockedDoc.id, {issuer: "https://ozten.co.uk"}); -} -function test_logout() { - do_test_pending(); - - resetState(); - - let id = TEST_USER; - setup_test_identity(id, TEST_CERT, function() { - let store = get_idstore(); - - // set it up so we're supposed to be logged in to TEST_URL - store.setLoginState(TEST_URL, true, id); - - let doLogout; - let mockedDoc = mock_doc(id, TEST_URL, call_sequentially( - function(action, params) { - do_check_eq(action, 'ready'); - do_check_eq(params, undefined); - - do_timeout(100, doLogout); - }, - function(action, params) { - do_check_eq(action, 'logout'); - do_check_eq(params, undefined); - }, - function(action, params) { - do_check_eq(action, 'ready'); - do_check_eq(params, undefined); - - do_test_finished(); - run_next_test(); - })); - - doLogout = function() { - RelyingParty.logout(mockedDoc.id); - do_check_false(store.getLoginState(TEST_URL).isLoggedIn); - do_check_eq(store.getLoginState(TEST_URL).email, TEST_USER); - }; - - RelyingParty.watch(mockedDoc); - }); -} - -var TESTS = [ - test_watch_loggedin_ready, - test_watch_loggedin_login, - test_watch_loggedin_logout, - test_watch_notloggedin_ready, - test_watch_notloggedin_logout, - test_request, - test_request_forceAuthentication, - test_request_forceIssuer, - test_logout, -]; - -TESTS.forEach(add_test); - -function run_test() { - run_next_test(); -} diff --git a/toolkit/identity/tests/unit/test_store.js b/toolkit/identity/tests/unit/test_store.js deleted file mode 100644 index 1cd9cc4dd8..0000000000 --- a/toolkit/identity/tests/unit/test_store.js +++ /dev/null @@ -1,64 +0,0 @@ -/* Any copyright is dedicated to the Public Domain. - http://creativecommons.org/publicdomain/zero/1.0/ */ - -"use strict"; - -XPCOMUtils.defineLazyModuleGetter(this, "IDService", - "resource://gre/modules/identity/Identity.jsm", - "IdentityService"); - -function test_id_store() { - // XXX - this is ugly, peaking in like this into IDService - // probably should instantiate our own. - var store = get_idstore(); - - // try adding an identity - store.addIdentity(TEST_USER, TEST_PRIVKEY, TEST_CERT); - do_check_neq(store.getIdentities()[TEST_USER], null); - do_check_eq(store.getIdentities()[TEST_USER].cert, TEST_CERT); - - // does fetch identity work? - do_check_neq(store.fetchIdentity(TEST_USER), null); - do_check_eq(store.fetchIdentity(TEST_USER).cert, TEST_CERT); - - // clear the cert should keep the identity but not the cert - store.clearCert(TEST_USER); - do_check_neq(store.getIdentities()[TEST_USER], null); - do_check_null(store.getIdentities()[TEST_USER].cert); - - // remove it should remove everything - store.removeIdentity(TEST_USER); - do_check_eq(store.getIdentities()[TEST_USER], undefined); - - // act like we're logged in to TEST_URL - store.setLoginState(TEST_URL, true, TEST_USER); - do_check_neq(store.getLoginState(TEST_URL), null); - do_check_true(store.getLoginState(TEST_URL).isLoggedIn); - do_check_eq(store.getLoginState(TEST_URL).email, TEST_USER); - - // log out - store.setLoginState(TEST_URL, false, TEST_USER); - do_check_neq(store.getLoginState(TEST_URL), null); - do_check_false(store.getLoginState(TEST_URL).isLoggedIn); - - // email is still set - do_check_eq(store.getLoginState(TEST_URL).email, TEST_USER); - - // not logged into other site - do_check_null(store.getLoginState(TEST_URL2)); - - // clear login state - store.clearLoginState(TEST_URL); - do_check_null(store.getLoginState(TEST_URL)); - do_check_null(store.getLoginState(TEST_URL2)); - - run_next_test(); -} - -var TESTS = [test_id_store, ]; - -TESTS.forEach(add_test); - -function run_test() { - run_next_test(); -} diff --git a/toolkit/identity/tests/unit/test_well-known.js b/toolkit/identity/tests/unit/test_well-known.js deleted file mode 100644 index 5e86f5ae48..0000000000 --- a/toolkit/identity/tests/unit/test_well-known.js +++ /dev/null @@ -1,90 +0,0 @@ -/* Any copyright is dedicated to the Public Domain. - http://creativecommons.org/publicdomain/zero/1.0/ */ - -Cu.import("resource://gre/modules/XPCOMUtils.jsm"); -Cu.import("resource://gre/modules/Services.jsm"); - -XPCOMUtils.defineLazyModuleGetter(this, "IDService", - "resource://gre/modules/identity/Identity.jsm", - "IdentityService"); - -const WELL_KNOWN_PATH = "/.well-known/browserid"; - -var SERVER_PORT = 8080; - -// valid IDP -function test_well_known_1() { - do_test_pending(); - - let server = new HttpServer(); - server.registerFile(WELL_KNOWN_PATH, do_get_file("data/idp_1" + WELL_KNOWN_PATH)); - server.start(SERVER_PORT); - let hostPort = "localhost:" + SERVER_PORT; - - function check_well_known(aErr, aCallbackObj) { - do_check_null(aErr); - do_check_eq(aCallbackObj.domain, hostPort); - let idpParams = aCallbackObj.idpParams; - do_check_eq(idpParams['public-key'].algorithm, "RS"); - do_check_eq(idpParams.authentication, "/browserid/sign_in.html"); - do_check_eq(idpParams.provisioning, "/browserid/provision.html"); - - do_test_finished(); - server.stop(run_next_test); - } - - IDService._fetchWellKnownFile(hostPort, check_well_known, "http"); -} - -// valid domain, non-exixtent browserid file -function test_well_known_404() { - do_test_pending(); - - let server = new HttpServer(); - // Don't register the well-known file - // Change ports to avoid HTTP caching - SERVER_PORT++; - server.start(SERVER_PORT); - - let hostPort = "localhost:" + SERVER_PORT; - - function check_well_known_404(aErr, aCallbackObj) { - do_check_eq("Error", aErr); - do_check_eq(undefined, aCallbackObj); - do_test_finished(); - server.stop(run_next_test); - } - - IDService._fetchWellKnownFile(hostPort, check_well_known_404, "http"); -} - -// valid domain, invalid browserid file (no "provisioning" member) -function test_well_known_invalid_1() { - do_test_pending(); - - let server = new HttpServer(); - server.registerFile(WELL_KNOWN_PATH, do_get_file("data/idp_invalid_1" + WELL_KNOWN_PATH)); - // Change ports to avoid HTTP caching - SERVER_PORT++; - server.start(SERVER_PORT); - - let hostPort = "localhost:" + SERVER_PORT; - - function check_well_known_invalid_1(aErr, aCallbackObj) { - // check for an error message - do_check_true(aErr && aErr.length > 0); - do_check_eq(undefined, aCallbackObj); - do_test_finished(); - server.stop(run_next_test); - } - - IDService._fetchWellKnownFile(hostPort, check_well_known_invalid_1, "http"); -} - -var TESTS = [test_well_known_1, test_well_known_404, test_well_known_invalid_1]; - -TESTS.forEach(add_test); - -function run_test() { - run_next_test(); -} diff --git a/toolkit/identity/tests/unit/xpcshell.ini b/toolkit/identity/tests/unit/xpcshell.ini deleted file mode 100644 index 309e4791c9..0000000000 --- a/toolkit/identity/tests/unit/xpcshell.ini +++ /dev/null @@ -1,23 +0,0 @@ -[DEFAULT] -head = head_identity.js -tail = tail_identity.js -skip-if = true -support-files = - data/idp_1/.well-known/browserid - data/idp_invalid_1/.well-known/browserid - -# Test load modules first so syntax failures are caught early. -[test_load_modules.js] -[test_minimalidentity.js] - -[test_identity_utils.js] -[test_log_utils.js] -[test_authentication.js] -[test_crypto_service.js] -[test_identity.js] -[test_jwcrypto.js] -[test_observer_topics.js] -[test_provisioning.js] -[test_relying_party.js] -[test_store.js] -[test_well-known.js] |