michael@0: /* Any copyright is dedicated to the Public Domain. michael@0: http://creativecommons.org/publicdomain/zero/1.0/ */ michael@0: michael@0: "use strict"; michael@0: michael@0: Cu.import("resource://gre/modules/identity/IdentityProvider.jsm"); michael@0: michael@0: function check_provision_flow_done(provId) { michael@0: do_check_null(IdentityProvider._provisionFlows[provId]); michael@0: } michael@0: michael@0: function test_begin_provisioning() { michael@0: do_test_pending(); michael@0: michael@0: setup_provisioning( michael@0: TEST_USER, michael@0: function(caller) { michael@0: // call .beginProvisioning() michael@0: IdentityProvider.beginProvisioning(caller); michael@0: }, function() {}, michael@0: { michael@0: beginProvisioningCallback: function(email, duration_s) { michael@0: do_check_eq(email, TEST_USER); michael@0: do_check_true(duration_s > 0); michael@0: do_check_true(duration_s <= (24 * 3600)); michael@0: michael@0: do_test_finished(); michael@0: run_next_test(); michael@0: } michael@0: }); michael@0: } michael@0: michael@0: function test_raise_provisioning_failure() { michael@0: do_test_pending(); michael@0: let _callerId = null; michael@0: michael@0: setup_provisioning( michael@0: TEST_USER, michael@0: function(caller) { michael@0: // call .beginProvisioning() michael@0: _callerId = caller.id; michael@0: IdentityProvider.beginProvisioning(caller); michael@0: }, function(err) { michael@0: // this should be invoked with a populated error michael@0: do_check_neq(err, null); michael@0: do_check_true(err.indexOf("can't authenticate this email") > -1); michael@0: michael@0: do_test_finished(); michael@0: run_next_test(); michael@0: }, michael@0: { michael@0: beginProvisioningCallback: function(email, duration_s) { michael@0: // raise the failure as if we can't provision this email michael@0: IdentityProvider.raiseProvisioningFailure(_callerId, "can't authenticate this email"); michael@0: } michael@0: }); michael@0: } michael@0: michael@0: function test_genkeypair_before_begin_provisioning() { michael@0: do_test_pending(); michael@0: michael@0: setup_provisioning( michael@0: TEST_USER, michael@0: function(caller) { michael@0: // call genKeyPair without beginProvisioning michael@0: IdentityProvider.genKeyPair(caller.id); michael@0: }, michael@0: // expect this to be called with an error michael@0: function(err) { michael@0: do_check_neq(err, null); michael@0: michael@0: do_test_finished(); michael@0: run_next_test(); michael@0: }, michael@0: { michael@0: // this should not be called at all! michael@0: genKeyPairCallback: function(pk) { michael@0: // a test that will surely fail because we shouldn't be here. michael@0: do_check_true(false); michael@0: michael@0: do_test_finished(); michael@0: run_next_test(); michael@0: } michael@0: } michael@0: ); michael@0: } michael@0: michael@0: function test_genkeypair() { michael@0: do_test_pending(); michael@0: let _callerId = null; michael@0: michael@0: setup_provisioning( michael@0: TEST_USER, michael@0: function(caller) { michael@0: _callerId = caller.id; michael@0: IdentityProvider.beginProvisioning(caller); michael@0: }, michael@0: function(err) { michael@0: // should not be called! michael@0: do_check_true(false); michael@0: michael@0: do_test_finished(); michael@0: run_next_test(); michael@0: }, michael@0: { michael@0: beginProvisioningCallback: function(email, time_s) { michael@0: IdentityProvider.genKeyPair(_callerId); michael@0: }, michael@0: genKeyPairCallback: function(kp) { michael@0: do_check_neq(kp, null); michael@0: michael@0: // yay! michael@0: do_test_finished(); michael@0: run_next_test(); michael@0: } michael@0: } michael@0: ); michael@0: } michael@0: michael@0: // we've already ensured that genkeypair can't be called michael@0: // before beginProvisioning, so this test should be enough michael@0: // to ensure full sequential call of the 3 APIs. michael@0: function test_register_certificate_before_genkeypair() { michael@0: do_test_pending(); michael@0: let _callerID = null; michael@0: michael@0: setup_provisioning( michael@0: TEST_USER, michael@0: function(caller) { michael@0: // do the right thing for beginProvisioning michael@0: _callerID = caller.id; michael@0: IdentityProvider.beginProvisioning(caller); michael@0: }, michael@0: // expect this to be called with an error michael@0: function(err) { michael@0: do_check_neq(err, null); michael@0: michael@0: do_test_finished(); michael@0: run_next_test(); michael@0: }, michael@0: { michael@0: beginProvisioningCallback: function(email, duration_s) { michael@0: // now we try to register cert but no keygen has been done michael@0: IdentityProvider.registerCertificate(_callerID, "fake-cert"); michael@0: } michael@0: } michael@0: ); michael@0: } michael@0: michael@0: function test_register_certificate() { michael@0: do_test_pending(); michael@0: let _callerId = null; michael@0: michael@0: setup_provisioning( michael@0: TEST_USER, michael@0: function(caller) { michael@0: _callerId = caller.id; michael@0: IdentityProvider.beginProvisioning(caller); michael@0: }, michael@0: function(err) { michael@0: // we should be cool! michael@0: do_check_null(err); michael@0: michael@0: // check that the cert is there michael@0: let identity = get_idstore().fetchIdentity(TEST_USER); michael@0: do_check_neq(identity,null); michael@0: do_check_eq(identity.cert, "fake-cert-42"); michael@0: michael@0: do_execute_soon(function check_done() { michael@0: // cleanup will happen after the callback is called michael@0: check_provision_flow_done(_callerId); michael@0: michael@0: do_test_finished(); michael@0: run_next_test(); michael@0: }); michael@0: }, michael@0: { michael@0: beginProvisioningCallback: function(email, duration_s) { michael@0: IdentityProvider.genKeyPair(_callerId); michael@0: }, michael@0: genKeyPairCallback: function(pk) { michael@0: IdentityProvider.registerCertificate(_callerId, "fake-cert-42"); michael@0: } michael@0: } michael@0: ); michael@0: } michael@0: michael@0: michael@0: function test_get_assertion_after_provision() { michael@0: do_test_pending(); michael@0: let _callerId = null; michael@0: michael@0: setup_provisioning( michael@0: TEST_USER, michael@0: function(caller) { michael@0: _callerId = caller.id; michael@0: IdentityProvider.beginProvisioning(caller); michael@0: }, michael@0: function(err) { michael@0: // we should be cool! michael@0: do_check_null(err); michael@0: michael@0: // check that the cert is there michael@0: let identity = get_idstore().fetchIdentity(TEST_USER); michael@0: do_check_neq(identity,null); michael@0: do_check_eq(identity.cert, "fake-cert-42"); michael@0: michael@0: do_execute_soon(function check_done() { michael@0: // cleanup will happen after the callback is called michael@0: check_provision_flow_done(_callerId); michael@0: michael@0: do_test_finished(); michael@0: run_next_test(); michael@0: }); michael@0: }, michael@0: { michael@0: beginProvisioningCallback: function(email, duration_s) { michael@0: IdentityProvider.genKeyPair(_callerId); michael@0: }, michael@0: genKeyPairCallback: function(pk) { michael@0: IdentityProvider.registerCertificate(_callerId, "fake-cert-42"); michael@0: } michael@0: } michael@0: ); michael@0: michael@0: } michael@0: michael@0: let TESTS = []; michael@0: michael@0: TESTS.push(test_begin_provisioning); michael@0: TESTS.push(test_raise_provisioning_failure); michael@0: TESTS.push(test_genkeypair_before_begin_provisioning); michael@0: TESTS.push(test_genkeypair); michael@0: TESTS.push(test_register_certificate_before_genkeypair); michael@0: TESTS.push(test_register_certificate); michael@0: TESTS.push(test_get_assertion_after_provision); michael@0: michael@0: TESTS.forEach(add_test); michael@0: michael@0: function run_test() { michael@0: run_next_test(); michael@0: }