Home | History | Annotate | Download | only in rtcbot
      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