diff options
Diffstat (limited to 'tools/addon-sdk-1.3/packages/api-utils/tests/test-e10s.js')
-rw-r--r-- | tools/addon-sdk-1.3/packages/api-utils/tests/test-e10s.js | 268 |
1 files changed, 268 insertions, 0 deletions
diff --git a/tools/addon-sdk-1.3/packages/api-utils/tests/test-e10s.js b/tools/addon-sdk-1.3/packages/api-utils/tests/test-e10s.js new file mode 100644 index 0000000..537fb2d --- /dev/null +++ b/tools/addon-sdk-1.3/packages/api-utils/tests/test-e10s.js @@ -0,0 +1,268 @@ +var xulApp = require("xul-app"); +var timer = require('timer'); + +// If the "jetpack/service" XPCOM component is not present, then the host app +// does not support e10s, so we can't run any e10s tests, so we check for E10S +// support here and then return early in test functions without it. +var hasE10S = + typeof require("chrome").Cc["@mozilla.org/jetpack/service;1"] != "undefined"; + +function makeConsoleTest(options) { + return function(test) { + if (!hasE10S) { + test.pass("This application does not support e10s."); + return; + } + + if (xulApp.is("Firefox") && + xulApp.versionInRange(xulApp.version, "4.0b7", "4.0b8pre")) { + test.pass("Due to bug 609066, Firefox 4.0b7 will never pass this test, " + + "so we'll skip it."); + return; + } + + var actions = []; + + if (options.setup) + options.setup(test); + + function addAction(action) { + if (options.expect.length == actions.length) { + test.fail("Didn't expect another action: " + JSON.stringify(action)); + return; + } + actions.push(action); + var expected = options.expect[actions.length-1]; + if (typeof(expected) == "function") + expected(test, action); + else + test.assertEqual(JSON.stringify(action), JSON.stringify(expected)); + if (options.expect.length == actions.length && + action[0] == "exception") { + process.destroy(); + test.done(); + } + } + + function msg(name, args) { + var action = [name]; + for (var i = 0; i < args.length; i++) + action.push(args[i]); + addAction(action); + } + + var fakeConsole = { + exception: function(ex) { + addAction(["exception", ex.toString()]); + } + }; + + ["log", "warn", "debug", "error", "info"].forEach(function(name) { + fakeConsole[name] = function() { msg(name, arguments); }; + }); + + var process = require('e10s').AddonProcess({ + console: fakeConsole, + quit: function(status) { + addAction(["quit", status]); + process.destroy(); + test.done(); + } + }); + process.send("startMain", options.main); + test.waitUntilDone(); + }; +} + +exports.testStartMain = makeConsoleTest({ + main: "e10s-samples/hello-world", + expect: [ + ["log", "hello", "world"], + ["info", "sup", "dogg"], + ["warn", "how", "r", "u"], + ["debug", "gud"], + ["error", "NO U"], + ["exception", "Error: o snap"], + ["log", "<toString() error>"], + function testConsoleTrace(test, action) { + test.assertEqual(action[0], "log", + "remote console.trace() issues " + + "local console.log()"); + test.assertMatches(action[1], /^Traceback /, + "remote console.trace logs traceback"); + }, + ["quit", "OK"] + ] +}); + +exports.testStartMainWithNonexistentModule = makeConsoleTest({ + main: "nonexistent-module", + expect: [ + ["log", "An exception occurred in the child Jetpack process."], + ["exception", "Error: Unknown module 'nonexistent-module'."] + ] +}); + +exports.testRemoteSyntaxError = makeConsoleTest({ + main: "e10s-samples/syntax-error", + expect: [ + ["log", "An exception occurred in the child Jetpack process."], + ["exception", "Error: uncaught exception: SyntaxError: missing ;" + + " before statement"] + ] +}); + +exports.testRemoteException = makeConsoleTest({ + main: "e10s-samples/thrown-exception", + expect: [ + ["log", "An exception occurred in the child Jetpack process."], + ["exception", "Error: uncaught exception: Error: alas"] + ] +}); + +exports.testE10sAdapter = makeConsoleTest({ + main: "e10s-samples/superpower-client", + setup: function(test) { + require("e10s-samples/superpower").setDelegate(function(a, b) { + test.assertEqual(JSON.stringify([a, b]), + JSON.stringify(["hello", "there"])); + return "thanks dude"; + }); + }, + expect: [ + ["log", "superpower.use returned", "thanks dude"], + ["quit", "OK"] + ] +}); + +exports.testAccessDeniedToLoadModule = makeConsoleTest({ + main: "e10s-samples/chrome-only-module-client", + expect: [ + ["log", "An exception occurred in the child Jetpack process."], + ["exception", + "Error: Module 'e10s-samples/chrome-only-module' requires " + + "chrome privileges and has no e10s adapter."] + ] +}); + +exports.testAdapterOnlyModule = makeConsoleTest({ + main: "e10s-samples/adapter-only-client", + expect: [ + ["log", "An exception occurred in the child Jetpack process."], + ["exception", "Error: Unknown module 'e10s-samples/adapter-only'."] + ] +}); + +exports.testSyncCallReturnValueArrivesAfterAsyncMsgSends = makeConsoleTest({ + main: "e10s-samples/bug-617499-main", + expect: [ + ["log", "about to send sync message to firefox"], + ["log", "i am an async message from firefox"], + ["log", "returned from sync message to firefox"], + ["quit", "OK"] + ] +}); + +exports.testCommonJSCompliance = function(test) { + if (!hasE10S) { + test.pass("This application does not support e10s."); + return; + } + + if (xulApp.is("Firefox") && + xulApp.versionInRange(xulApp.version, "4.0b7", "4.0b8pre")) { + test.pass("Due to bug 609066, Firefox 4.0b7 will never pass this test, " + + "so we'll skip it."); + return; + } + + let {Cc, Ci} = require("chrome"); + + var url = require("url"); + var path = url.URL("interoperablejs-read-only/compliance/", + __url__).toString(); + path = url.toFilename(path); + + var rootDir = Cc['@mozilla.org/file/local;1'] + .createInstance(Ci.nsILocalFile); + rootDir.initWithPath(path); + + var testDirs = []; + var enumer = rootDir.directoryEntries; + while (enumer.hasMoreElements()) { + var testDir = enumer.getNext().QueryInterface(Ci.nsIFile); + if (testDir.isDirectory() && + testDir.leafName.charAt(0) != '.') + testDirs.push(testDir); + } + + var sm = require("securable-module"); + + function runComplianceTest(testDir) { + console.info("running compliance test '" + testDir.leafName + "'"); + var loader = new sm.Loader({ + rootPath: testDir + }); + var interceptingConsole = { + log: function(msg, type) { + switch (type) { + case "fail": + test.fail(msg); + break; + case "pass": + test.pass(msg); + break; + case "info": + console.info(msg); + if (msg == "DONE") { + console.info("Running next test."); + process.destroy(); + runNextComplianceTest(); + } + } + }, + __proto__: console + }; + var process = require("e10s").AddonProcess({ + loader: loader, + packaging: { + getModuleInfo: function(url) { + return { + 'e10s-adapter': null, + needsChrome: false + }; + } + }, + console: interceptingConsole + }); + + function injectSysPrint(globalScope) { + globalScope.sys = { + // The CommonJS compliance tests use this + // to report test pass/fail. + print: function(msg, type) { + // This ultimately gets intercepted by our + // interceptingConsole. + console.log(msg, type); + } + }; + } + + process.send("addInjectedSandboxScript", { + filename: "<string>", + contents: "(" + uneval(injectSysPrint) + ")(this);" + }); + + process.send("startMain", "program"); + } + + function runNextComplianceTest() { + if (testDirs.length) + runComplianceTest(testDirs.pop()); + else + test.done(); + } + + runNextComplianceTest(); + test.waitUntilDone(); +}; |