blob: 665f6e88e8c7697f5d0b23bb5a447c48b1350c93 [file] [log] [blame]
// 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);