summaryrefslogtreecommitdiffstats
path: root/dom/cache/test/mochitest/driver.js
diff options
context:
space:
mode:
Diffstat (limited to 'dom/cache/test/mochitest/driver.js')
-rw-r--r--dom/cache/test/mochitest/driver.js132
1 files changed, 132 insertions, 0 deletions
diff --git a/dom/cache/test/mochitest/driver.js b/dom/cache/test/mochitest/driver.js
new file mode 100644
index 000000000..108e32deb
--- /dev/null
+++ b/dom/cache/test/mochitest/driver.js
@@ -0,0 +1,132 @@
+// Any copyright is dedicated to the Public Domain.
+// http://creativecommons.org/publicdomain/zero/1.0/
+//
+// This helper script exposes a runTests function that takes the name of a
+// test script as its input argument and runs the test in three different
+// contexts:
+// 1. Regular Worker context
+// 2. Service Worker context
+// 3. Window context
+// The function returns a promise which will get resolved once all tests
+// finish. The testFile argument is the name of the test file to be run
+// in the different contexts, and the optional order argument can be set
+// to either "parallel" or "sequential" depending on how the caller wants
+// the tests to be run. If this argument is not provided, the default is
+// "both", which runs the tests in both modes.
+// The caller of this function is responsible to call SimpleTest.finish
+// when the returned promise is resolved.
+
+function runTests(testFile, order) {
+ function setupPrefs() {
+ return new Promise(function(resolve, reject) {
+ SpecialPowers.pushPrefEnv({
+ "set": [["dom.caches.enabled", true],
+ ["dom.caches.testing.enabled", true],
+ ["dom.serviceWorkers.enabled", true],
+ ["dom.serviceWorkers.testing.enabled", true],
+ ["dom.serviceWorkers.exemptFromPerDomainMax", true]]
+ }, function() {
+ resolve();
+ });
+ });
+ }
+
+ // adapted from dom/indexedDB/test/helpers.js
+ function clearStorage() {
+ return new Promise(function(resolve, reject) {
+ var qms = SpecialPowers.Services.qms;
+ var principal = SpecialPowers.wrap(document).nodePrincipal;
+ var request = qms.clearStoragesForPrincipal(principal);
+ var cb = SpecialPowers.wrapCallback(resolve);
+ request.callback = cb;
+ });
+ }
+
+ function loadScript(script) {
+ return new Promise(function(resolve, reject) {
+ var s = document.createElement("script");
+ s.src = script;
+ s.onerror = reject;
+ s.onload = resolve;
+ document.body.appendChild(s);
+ });
+ }
+
+ function importDrivers() {
+ return Promise.all([loadScript("worker_driver.js"),
+ loadScript("serviceworker_driver.js")]);
+ }
+
+ function runWorkerTest() {
+ return workerTestExec(testFile);
+ }
+
+ function runServiceWorkerTest() {
+ return serviceWorkerTestExec(testFile);
+ }
+
+ function runFrameTest() {
+ return new Promise(function(resolve, reject) {
+ var iframe = document.createElement("iframe");
+ iframe.src = "frame.html";
+ iframe.onload = function() {
+ var doc = iframe.contentDocument;
+ var s = doc.createElement("script");
+ s.src = testFile;
+ window.addEventListener("message", function onMessage(event) {
+ if (event.data.context != "Window") {
+ return;
+ }
+ if (event.data.type == 'finish') {
+ window.removeEventListener("message", onMessage);
+ resolve();
+ } else if (event.data.type == 'status') {
+ ok(event.data.status, event.data.context + ": " + event.data.msg);
+ }
+ }, false);
+ doc.body.appendChild(s);
+ };
+ document.body.appendChild(iframe);
+ });
+ }
+
+ SimpleTest.waitForExplicitFinish();
+
+ if (typeof order == "undefined") {
+ order = "sequential"; // sequential by default, see bug 1143222.
+ // TODO: Make this "both" again.
+ }
+
+ ok(order == "parallel" || order == "sequential" || order == "both",
+ "order argument should be valid");
+
+ if (order == "both") {
+ info("Running tests in both modes; first: sequential");
+ return runTests(testFile, "sequential")
+ .then(function() {
+ info("Running tests in parallel mode");
+ return runTests(testFile, "parallel");
+ });
+ }
+ if (order == "sequential") {
+ return setupPrefs()
+ .then(importDrivers)
+ .then(runWorkerTest)
+ .then(clearStorage)
+ .then(runServiceWorkerTest)
+ .then(clearStorage)
+ .then(runFrameTest)
+ .then(clearStorage)
+ .catch(function(e) {
+ ok(false, "A promise was rejected during test execution: " + e);
+ });
+ }
+ return setupPrefs()
+ .then(importDrivers)
+ .then(() => Promise.all([runWorkerTest(), runServiceWorkerTest(), runFrameTest()]))
+ .then(clearStorage)
+ .catch(function(e) {
+ ok(false, "A promise was rejected during test execution: " + e);
+ });
+}
+