andresp@webrtc.org | 458c2c3 | 2014-10-16 07:36:37 +0000 | [diff] [blame] | 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); |