// 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] + ' '); 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);