103 lines
2.9 KiB
JavaScript
103 lines
2.9 KiB
JavaScript
|
// 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);
|