1 // Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. 2 // 3 // Use of this source code is governed by a BSD-style license 4 // that can be found in the LICENSE file in the root of the source 5 // tree. An additional intellectual property rights grant can be found 6 // in the file PATENTS. All contributing project authors may 7 // be found in the AUTHORS file in the root of the source tree. 8 // 9 // This script loads all the test/* files into a very small context that 10 // only exposes a minimal set of functions that allows to register tests. 11 // 12 // Once all files are loaded it runs the specific test on the command line. 13 // If no arguments are given it lists all the registered tests. 14 // 15 // Note: the small context where the scripts are loaded is intended to keep 16 // nodejs-isms away from the test code and isolate implementation details away 17 // from them. 18 var fs = require('fs'); 19 var vm = require('vm'); 20 var Test = require('./test.js'); 21 22 var testSuites = {}; 23 24 function registerTest(name, func) { 25 testSuites[name] = func; 26 } 27 28 function registerBotTest(name, func, bots) { 29 registerTest(name, bootstrap); 30 31 function bootstrap(test) { 32 var callbacks = []; 33 for (var i = 0; i != bots.length; ++i) 34 callbacks.push(test.spawnBot.bind(test, "", bots[i])); 35 36 test.wait(callbacks, func.bind(test, test)); 37 } 38 } 39 40 function loadTestFile(filename, doneCallback) { 41 var loadTestContext = { 42 setTimeout: setTimeout, 43 registerTest: registerTest, 44 registerBotTest: registerBotTest 45 }; 46 var script = vm.createScript(fs.readFileSync(filename), filename); 47 script.runInNewContext(loadTestContext); 48 doneCallback(); 49 } 50 51 function iterateOverTestFiles(foreachCallback, doneCallback) { 52 fs.readdir('test', function (error, list) { 53 function iterateNextFile() { 54 if (list.length === 0) { 55 doneCallback(); 56 } else { 57 var filename = list.pop(); 58 if (filename[0] === '.' || filename.slice(-3) !== '.js') { 59 // Skip hidden and non .js files on that directory. 60 iterateNextFile(); 61 } else { 62 foreachCallback('test/' + filename, iterateNextFile); 63 } 64 } 65 } 66 67 if (error !== null) { 68 throw error; 69 } 70 iterateNextFile(); 71 }); 72 } 73 74 function runTest(testname) { 75 if (testname in testSuites) { 76 console.log("Running test: " + testname); 77 var test = new Test(); 78 testSuites[testname](test); 79 } else { 80 console.log("Unknown test: " + testname); 81 } 82 } 83 84 function printUsage() { 85 console.log('Run as:\n $ ' 86 + process.argv[0] + ' ' + process.argv[1] 87 + ' <testname>'); 88 console.log('These are the existent ones:'); 89 for (var testname in testSuites) 90 console.log(' ' + testname); 91 } 92 93 function main() { 94 // TODO(andresp): support multiple tests. 95 var testList = process.argv.slice(2); 96 if (testList.length === 1) 97 runTest(testList[0]); 98 else 99 printUsage(); 100 } 101 102 iterateOverTestFiles(loadTestFile, main); 103