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