michael@0: /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ michael@0: /* vim:set ts=2 sw=2 sts=2 et: */ michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: function parseTestManifest(testManifest, params, callback) { michael@0: var links = {}; michael@0: var paths = []; michael@0: michael@0: // Support --test-manifest format for mobile/b2g michael@0: if ("runtests" in testManifest || "excludetests" in testManifest) { michael@0: callback(testManifest); michael@0: return; michael@0: } michael@0: michael@0: // For mochitest-chrome and mochitest-browser-chrome harnesses, we michael@0: // define tests as links[testname] = true. michael@0: // For mochitest-plain, we define lists as an array of testnames. michael@0: for (var obj of testManifest['tests']) { michael@0: var path = obj['path']; michael@0: // Note that obj.disabled may be "". We still want to skip in that case. michael@0: if ("disabled" in obj) { michael@0: dump("TEST-SKIPPED | " + path + " | " + obj.disabled + "\n"); michael@0: continue; michael@0: } michael@0: if (params.testRoot != 'tests' && params.testRoot !== undefined) { michael@0: links[params.baseurl + '/' + params.testRoot + '/' + path] = true michael@0: } else { michael@0: paths.push(params.testPrefix + path); michael@0: } michael@0: } michael@0: if (paths.length > 0) { michael@0: callback(paths); michael@0: } else { michael@0: callback(links); michael@0: } michael@0: } michael@0: michael@0: function getTestManifest(url, params, callback) { michael@0: var req = new XMLHttpRequest(); michael@0: req.open("GET", url); michael@0: req.onload = function() { michael@0: if (req.readyState == 4) { michael@0: if (req.status == 200) { michael@0: try { michael@0: parseTestManifest(JSON.parse(req.responseText), params, callback); michael@0: } catch (e) { michael@0: dump("TEST-UNEXPECTED-FAIL: setup.js | error parsing " + url + " (" + e + ")\n"); michael@0: throw e; michael@0: } michael@0: } else { michael@0: dump("TEST-UNEXPECTED-FAIL: setup.js | error loading " + url + "\n"); michael@0: callback({}); michael@0: } michael@0: } michael@0: } michael@0: req.send(); michael@0: } michael@0: michael@0: // Test Filtering Code michael@0: michael@0: /* michael@0: Open the file referenced by runOnly|exclude and use that to compare against michael@0: testList michael@0: parameters: michael@0: filter = json object of runtests | excludetests michael@0: testList = array of test names to run michael@0: runOnly = use runtests vs excludetests in case both are defined michael@0: returns: michael@0: filtered version of testList michael@0: */ michael@0: function filterTests(filter, testList, runOnly) { michael@0: michael@0: var filteredTests = []; michael@0: var removedTests = []; michael@0: var runtests = {}; michael@0: var excludetests = {}; michael@0: michael@0: if (filter == null) { michael@0: return testList; michael@0: } michael@0: michael@0: if ('runtests' in filter) { michael@0: runtests = filter.runtests; michael@0: } michael@0: if ('excludetests' in filter) { michael@0: excludetests = filter.excludetests; michael@0: } michael@0: if (!('runtests' in filter) && !('excludetests' in filter)) { michael@0: if (runOnly == 'true') { michael@0: runtests = filter; michael@0: } else { michael@0: excludetests = filter; michael@0: } michael@0: } michael@0: michael@0: var testRoot = config.testRoot || "tests"; michael@0: // Start with testList, and put everything that's in 'runtests' in michael@0: // filteredTests. michael@0: if (Object.keys(runtests).length) { michael@0: for (var i = 0; i < testList.length; i++) { michael@0: var testpath = testList[i]; michael@0: var tmppath = testpath.replace(/^\//, ''); michael@0: for (var f in runtests) { michael@0: // Remove leading /tests/ if exists michael@0: file = f.replace(/^\//, '') michael@0: file = file.replace(/^tests\//, '') michael@0: michael@0: // Match directory or filename, testList has / michael@0: if (tmppath.match(testRoot + "/" + file) != null) { michael@0: filteredTests.push(testpath); michael@0: break; michael@0: } michael@0: } michael@0: } michael@0: } else { michael@0: filteredTests = testList.slice(0); michael@0: } michael@0: michael@0: // Continue with filteredTests, and deselect everything that's in michael@0: // excludedtests. michael@0: if (!Object.keys(excludetests).length) { michael@0: return filteredTests; michael@0: } michael@0: michael@0: var refilteredTests = []; michael@0: for (var i = 0; i < filteredTests.length; i++) { michael@0: var found = false; michael@0: var testpath = filteredTests[i]; michael@0: var tmppath = testpath.replace(/^\//, ''); michael@0: for (var f in excludetests) { michael@0: // Remove leading /tests/ if exists michael@0: file = f.replace(/^\//, '') michael@0: file = file.replace(/^tests\//, '') michael@0: michael@0: // Match directory or filename, testList has / michael@0: if (tmppath.match(testRoot + "/" + file) != null) { michael@0: found = true; michael@0: break; michael@0: } michael@0: } michael@0: if (!found) { michael@0: refilteredTests.push(testpath); michael@0: } michael@0: } michael@0: return refilteredTests; michael@0: }