blob: 665f6e88e8c7697f5d0b23bb5a447c48b1350c93 [file] [log] [blame]
andresp@webrtc.org458c2c32014-10-16 07:36:37 +00001// 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.
18var fs = require('fs');
19var vm = require('vm');
20var Test = require('./test.js');
21
22var testSuites = {};
23
24function registerTest(name, func) {
25 testSuites[name] = func;
26}
27
28function 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
40function 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
51function 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
74function 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
84function 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
93function 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
102iterateOverTestFiles(loadTestFile, main);