diff options
Diffstat (limited to '')
-rw-r--r-- | testing/mochitest/manifestLibrary.js | 189 |
1 files changed, 189 insertions, 0 deletions
diff --git a/testing/mochitest/manifestLibrary.js b/testing/mochitest/manifestLibrary.js new file mode 100644 index 0000000000..c9417f03d1 --- /dev/null +++ b/testing/mochitest/manifestLibrary.js @@ -0,0 +1,189 @@ +/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* vim:set ts=2 sw=2 sts=2 et: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +function parseTestManifest(testManifest, params, callback) { + let links = {}; + let paths = []; + + // Support --test-manifest format for mobile + if ("runtests" in testManifest || "excludetests" in testManifest) { + callback(testManifest); + return; + } + + // For mochitest-chrome and mochitest-browser-chrome harnesses, we + // define tests as links[testname] = true. + // For mochitest-plain, we define lists as an array of testnames. + for (let obj of testManifest.tests) { + let path = obj.path; + // Note that obj.disabled may be "". We still want to skip in that case. + if ("disabled" in obj) { + dump("TEST-SKIPPED | " + path + " | " + obj.disabled + "\n"); + continue; + } + if (params.testRoot != "tests" && params.testRoot !== undefined) { + let name = params.baseurl + "/" + params.testRoot + "/" + path; + links[name] = { + test: { + url: name, + expected: obj.expected, + https_first_disabled: obj.https_first_disabled, + allow_xul_xbl: obj.allow_xul_xbl, + }, + }; + } else { + let name = params.testPrefix + path; + if (params.xOriginTests && obj.scheme == "https") { + name = params.httpsBaseUrl + path; + } + paths.push({ + test: { + url: name, + expected: obj.expected, + https_first_disabled: obj.https_first_disabled, + allow_xul_xbl: obj.allow_xul_xbl, + }, + }); + } + } + if (paths.length) { + callback(paths); + } else { + callback(links); + } +} + +function getTestManifest(url, params, callback) { + let req = new XMLHttpRequest(); + req.open("GET", url); + req.onload = function() { + if (req.readyState == 4) { + if (req.status == 200) { + try { + parseTestManifest(JSON.parse(req.responseText), params, callback); + } catch (e) { + dump( + "TEST-UNEXPECTED-FAIL: manifestLibrary.js | error parsing " + + url + + " (" + + e + + ")\n" + ); + throw e; + } + } else { + dump( + "TEST-UNEXPECTED-FAIL: manifestLibrary.js | error loading " + + url + + " (HTTP " + + req.status + + ")\n" + ); + callback({}); + } + } + }; + req.send(); +} + +// Test Filtering Code +// TODO Only used by ipc tests, remove once those are implemented sanely + +/* + Open the file referenced by runOnly|exclude and use that to compare against + testList + parameters: + filter = json object of runtests | excludetests + testList = array of test names to run + runOnly = use runtests vs excludetests in case both are defined + returns: + filtered version of testList +*/ +function filterTests(filter, testList, runOnly) { + let filteredTests = []; + let runtests = {}; + let excludetests = {}; + + if (filter == null) { + return testList; + } + + if ("runtests" in filter) { + runtests = filter.runtests; + } + if ("excludetests" in filter) { + excludetests = filter.excludetests; + } + if (!("runtests" in filter) && !("excludetests" in filter)) { + if (runOnly == "true") { + runtests = filter; + } else { + excludetests = filter; + } + } + + // eslint-disable-next-line no-undef + let testRoot = config.testRoot || "tests"; + // Start with testList, and put everything that's in 'runtests' in + // filteredTests. + if (Object.keys(runtests).length) { + for (let i = 0; i < testList.length; i++) { + let testpath; + if (testList[i] instanceof Object && "test" in testList[i]) { + testpath = testList[i].test.url; + } else { + testpath = testList[i]; + } + let tmppath = testpath.replace(/^\//, ""); + for (let f in runtests) { + // Remove leading /tests/ if exists + let file = f.replace(/^\//, ""); + file = file.replace(/^tests\//, ""); + + // Match directory or filename, testList has <testroot>/<path> + if (tmppath.match(testRoot + "/" + file) != null) { + filteredTests.push(testpath); + break; + } + } + } + } else { + filteredTests = testList.slice(0); + } + + // Continue with filteredTests, and deselect everything that's in + // excludedtests. + if (!Object.keys(excludetests).length) { + return filteredTests; + } + + let refilteredTests = []; + for (let i = 0; i < filteredTests.length; i++) { + let found = false; + let testpath; + if (filteredTests[i] instanceof Object && "test" in filteredTests[i]) { + testpath = filteredTests[i].test.url; + } else { + testpath = filteredTests[i]; + } + let tmppath = testpath.replace(/^\//, ""); + for (let f in excludetests) { + // Remove leading /tests/ if exists + let file = f.replace(/^\//, ""); + file = file.replace(/^tests\//, ""); + + // Match directory or filename, testList has <testroot>/<path> + if (tmppath.match(testRoot + "/" + file) != null) { + found = true; + break; + } + } + if (!found) { + refilteredTests.push(testpath); + } + } + return refilteredTests; +} |