| // Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. | |
| // | |
| // Use of this source code is governed by a BSD-style license | |
| // that can be found in the LICENSE file in the root of the source | |
| // tree. An additional intellectual property rights grant can be found | |
| // in the file PATENTS. All contributing project authors may | |
| // be found in the AUTHORS file in the root of the source tree. | |
| // | |
| // This script loads all the test/* files into a very small context that | |
| // only exposes a minimal set of functions that allows to register tests. | |
| // | |
| // Once all files are loaded it runs the specific test on the command line. | |
| // If no arguments are given it lists all the registered tests. | |
| // | |
| // Note: the small context where the scripts are loaded is intended to keep | |
| // nodejs-isms away from the test code and isolate implementation details away | |
| // from them. | |
| var fs = require('fs'); | |
| var vm = require('vm'); | |
| var Test = require('./test.js'); | |
| var testSuites = {}; | |
| function registerTest(name, func) { | |
| testSuites[name] = func; | |
| } | |
| function registerBotTest(name, func, bots) { | |
| registerTest(name, bootstrap); | |
| function bootstrap(test) { | |
| var callbacks = []; | |
| for (var i = 0; i != bots.length; ++i) | |
| callbacks.push(test.spawnBot.bind(test, "", bots[i])); | |
| test.wait(callbacks, func.bind(test, test)); | |
| } | |
| } | |
| function loadTestFile(filename, doneCallback) { | |
| var loadTestContext = { | |
| setTimeout: setTimeout, | |
| registerTest: registerTest, | |
| registerBotTest: registerBotTest | |
| }; | |
| var script = vm.createScript(fs.readFileSync(filename), filename); | |
| script.runInNewContext(loadTestContext); | |
| doneCallback(); | |
| } | |
| function iterateOverTestFiles(foreachCallback, doneCallback) { | |
| fs.readdir('test', function (error, list) { | |
| function iterateNextFile() { | |
| if (list.length === 0) { | |
| doneCallback(); | |
| } else { | |
| var filename = list.pop(); | |
| if (filename[0] === '.' || filename.slice(-3) !== '.js') { | |
| // Skip hidden and non .js files on that directory. | |
| iterateNextFile(); | |
| } else { | |
| foreachCallback('test/' + filename, iterateNextFile); | |
| } | |
| } | |
| } | |
| if (error !== null) { | |
| throw error; | |
| } | |
| iterateNextFile(); | |
| }); | |
| } | |
| function runTest(testname) { | |
| if (testname in testSuites) { | |
| console.log("Running test: " + testname); | |
| var test = new Test(); | |
| testSuites[testname](test); | |
| } else { | |
| console.log("Unknown test: " + testname); | |
| } | |
| } | |
| function printUsage() { | |
| console.log('Run as:\n $ ' | |
| + process.argv[0] + ' ' + process.argv[1] | |
| + ' <testname>'); | |
| console.log('These are the existent ones:'); | |
| for (var testname in testSuites) | |
| console.log(' ' + testname); | |
| } | |
| function main() { | |
| // TODO(andresp): support multiple tests. | |
| var testList = process.argv.slice(2); | |
| if (testList.length === 1) | |
| runTest(testList[0]); | |
| else | |
| printUsage(); | |
| } | |
| iterateOverTestFiles(loadTestFile, main); |