OLD | NEW |
| (Empty) |
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); | |
OLD | NEW |