summaryrefslogtreecommitdiffstats
path: root/testing/mochitest/manifestLibrary.js
diff options
context:
space:
mode:
Diffstat (limited to 'testing/mochitest/manifestLibrary.js')
-rw-r--r--testing/mochitest/manifestLibrary.js159
1 files changed, 159 insertions, 0 deletions
diff --git a/testing/mochitest/manifestLibrary.js b/testing/mochitest/manifestLibrary.js
new file mode 100644
index 000000000..51b35a4d2
--- /dev/null
+++ b/testing/mochitest/manifestLibrary.js
@@ -0,0 +1,159 @@
+/* -*- 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) {
+ var links = {};
+ var 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 (var obj of testManifest['tests']) {
+ var 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) {
+ name = params.baseurl + '/' + params.testRoot + '/' + path;
+ links[name] = {'test': {'url': name, 'expected': obj['expected']}};
+ } else {
+ name = params.testPrefix + path;
+ paths.push({'test': {'url': name, 'expected': obj['expected']}});
+ }
+ }
+ if (paths.length > 0) {
+ callback(paths);
+ } else {
+ callback(links);
+ }
+}
+
+function getTestManifest(url, params, callback) {
+ var 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: setup.js | error parsing " + url + " (" + e + ")\n");
+ throw e;
+ }
+ } else {
+ dump("TEST-UNEXPECTED-FAIL: setup.js | error loading " + url + "\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) {
+
+ var filteredTests = [];
+ var removedTests = [];
+ var runtests = {};
+ var 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;
+ }
+ }
+
+ var testRoot = config.testRoot || "tests";
+ // Start with testList, and put everything that's in 'runtests' in
+ // filteredTests.
+ if (Object.keys(runtests).length) {
+ for (var i = 0; i < testList.length; i++) {
+ if ((testList[i] instanceof Object) && ('test' in testList[i])) {
+ var testpath = testList[i]['test']['url'];
+ } else {
+ var testpath = testList[i];
+ }
+ var tmppath = testpath.replace(/^\//, '');
+ for (var f in runtests) {
+ // Remove leading /tests/ if exists
+ 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;
+ }
+
+ var refilteredTests = [];
+ for (var i = 0; i < filteredTests.length; i++) {
+ var found = false;
+ if ((filteredTests[i] instanceof Object) && ('test' in filteredTests[i])) {
+ var testpath = filteredTests[i]['test']['url'];
+ } else {
+ var testpath = filteredTests[i];
+ }
+ var tmppath = testpath.replace(/^\//, '');
+ for (var f in excludetests) {
+ // Remove leading /tests/ if exists
+ 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;
+}