123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- // 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);
- });
- }
|