summaryrefslogtreecommitdiffstats
path: root/b2g/components/test/unit/head_identity.js
diff options
context:
space:
mode:
Diffstat (limited to 'b2g/components/test/unit/head_identity.js')
-rw-r--r--b2g/components/test/unit/head_identity.js159
1 files changed, 159 insertions, 0 deletions
diff --git a/b2g/components/test/unit/head_identity.js b/b2g/components/test/unit/head_identity.js
new file mode 100644
index 000000000..604a77284
--- /dev/null
+++ b/b2g/components/test/unit/head_identity.js
@@ -0,0 +1,159 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+var Ci = Components.interfaces;
+var Cu = Components.utils;
+
+// 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, "MinimalIDService",
+ "resource://gre/modules/identity/MinimalIdentity.jsm",
+ "IdentityService");
+
+XPCOMUtils.defineLazyModuleGetter(this,
+ "Logger",
+ "resource://gre/modules/identity/LogUtils.jsm");
+
+XPCOMUtils.defineLazyServiceGetter(this,
+ "uuidGenerator",
+ "@mozilla.org/uuid-generator;1",
+ "nsIUUIDGenerator");
+
+const TEST_URL = "https://myfavoriteflan.com";
+const TEST_USER = "uumellmahaye1969@hotmail.com";
+const TEST_PRIVKEY = "i-am-a-secret";
+const TEST_CERT = "i~like~pie";
+
+// The following are utility functions for Identity testing
+
+function log(...aMessageArgs) {
+ Logger.log.apply(Logger, ["test"].concat(aMessageArgs));
+}
+
+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();
+}
+
+// create a mock "doc" object, which the Identity Service
+// uses as a pointer back into the doc object
+function mockDoc(aParams, aDoFunc) {
+ let mockedDoc = {};
+ mockedDoc.id = uuid();
+
+ // Properties of aParams may include loggedInUser
+ Object.keys(aParams).forEach(function(param) {
+ mockedDoc[param] = aParams[param];
+ });
+
+ // the origin is set inside nsDOMIdentity by looking at the
+ // document.nodePrincipal.origin. Here we, we must satisfy
+ // ourselves with pretending.
+ mockedDoc.origin = "https://jedp.gov";
+
+ mockedDoc['do'] = aDoFunc;
+ 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');
+
+ return mockedDoc;
+}
+
+// create a mock "pipe" object that would normally communicate
+// messages up to gaia (either the trusty ui or the hidden iframe),
+// and convey messages back down from gaia to the controller through
+// the message callback.
+
+// The mock receiving pipe simulates gaia which, after receiving messages
+// through the pipe, will call back with instructions to invoke
+// certain methods. It mocks what comes back from the other end of
+// the pipe.
+function mockReceivingPipe() {
+ let MockedPipe = {
+ communicate: function(aRpOptions, aGaiaOptions, aMessageCallback) {
+ switch (aGaiaOptions.message) {
+ case "identity-delegate-watch":
+ aMessageCallback({json: {method: "ready"}});
+ break;
+ case "identity-delegate-request":
+ aMessageCallback({json: {method: "login", assertion: TEST_CERT}});
+ break;
+ case "identity-delegate-logout":
+ aMessageCallback({json: {method: "logout"}});
+ break;
+ default:
+ throw("what the what?? " + aGaiaOptions.message);
+ break;
+ }
+ }
+ };
+ return MockedPipe;
+}
+
+// The mock sending pipe lets us test what's actually getting put in the
+// pipe.
+function mockSendingPipe(aMessageCallback) {
+ let MockedPipe = {
+ communicate: function(aRpOptions, aGaiaOptions, aDummyCallback) {
+ aMessageCallback(aRpOptions, aGaiaOptions);
+ }
+ };
+ return MockedPipe;
+}
+
+// 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) {
+ Services.obs.removeObserver(observer, aObserveTopic);
+ aObserveFunc(aSubject, aTopic, aData);
+ }
+ }
+ };
+
+ Services.obs.addObserver(observer, aObserveTopic, false);
+}
+
+// a hook to set up the ID service with an identity with keypair and all
+// when ready, invoke callback with the identity. It's there if we need it.
+function setup_test_identity(identity, cert, cb) {
+ cb();
+}
+
+// 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;
+ };
+}