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 // Provides a Test class that exposes api to the tests. 10 // Read test.prototype to see what methods are exposed. 11 var fs = require('fs'); 12 var request = require('request'); 13 var BotManager = require('./botmanager.js'); 14 15 function Test() { 16 this.timeout_ = setTimeout( 17 this.fail.bind(this, "Test timeout!"), 18 100000); 19 } 20 21 Test.prototype = { 22 log: function () { 23 console.log.apply(console.log, arguments); 24 }, 25 26 abort: function (error) { 27 var error = new Error(error || "Test aborted"); 28 console.log(error.stack); 29 process.exit(1); 30 }, 31 32 assert: function (value, message) { 33 if (value !== true) { 34 this.abort(message || "Assert failed."); 35 } 36 }, 37 38 fail: function () { 39 this.assert(false, "Test failed."); 40 }, 41 42 done: function () { 43 clearTimeout(this.timeout_); 44 console.log("Test succeeded"); 45 process.exit(0); 46 }, 47 48 // Utility method to wait for multiple callbacks to be executed. 49 // functions - array of functions to call with a callback. 50 // doneCallback - called when all callbacks on the array have completed. 51 wait: function (functions, doneCallback) { 52 var result = new Array(functions.length); 53 var missingResult = functions.length; 54 for (var i = 0; i != functions.length; ++i) 55 functions[i](complete.bind(this, i)); 56 57 function complete(index, value) { 58 missingResult--; 59 result[index] = value; 60 if (missingResult == 0) 61 doneCallback.apply(null, result); 62 } 63 }, 64 65 spawnBot: function (name, botType, doneCallback) { 66 // Lazy initialization of botmanager. 67 if (!this.botManager_) 68 this.botManager_ = new BotManager(); 69 this.botManager_.spawnNewBot(name, botType, doneCallback); 70 }, 71 72 createStatisticsReport: function (outputFileName) { 73 return new StatisticsReport(outputFileName); 74 }, 75 76 // Ask computeengineondemand to give us TURN server credentials and URIs. 77 createTurnConfig: function (onSuccess, onError) { 78 request('https://computeengineondemand.appspot.com/turn?username=1234&key=5678', 79 function (error, response, body) { 80 if (error || response.statusCode != 200) { 81 onError('TURN request failed'); 82 return; 83 } 84 85 var response = JSON.parse(body); 86 var iceServer = { 87 'username': response.username, 88 'credential': response.password, 89 'urls': response.uris 90 }; 91 onSuccess({ 'iceServers': [ iceServer ] }); 92 } 93 ); 94 }, 95 } 96 97 StatisticsReport = function (outputFileName) { 98 this.output_ = []; 99 this.output_.push("Version: 1"); 100 this.outputFileName_ = outputFileName; 101 } 102 103 StatisticsReport.prototype = { 104 collectStatsFromPeerConnection: function (prefix, pc) { 105 setInterval(this.addPeerConnectionStats.bind(this, prefix, pc), 100); 106 }, 107 108 addPeerConnectionStats: function (prefix, pc) { 109 pc.getStats(onStatsReady.bind(this)); 110 111 function onStatsReady(reports) { 112 for (index in reports) { 113 var stats = {}; 114 stats[reports[index].id] = collectStats(reports[index].stats); 115 116 var data = {}; 117 data[prefix] = stats; 118 119 this.output_.push({ 120 type: "UpdateCounters", 121 startTime: (new Date()).getTime(), 122 data: data, 123 }); 124 } 125 }; 126 127 function collectStats(stats) { 128 var outputStats = {}; 129 for (index in stats) { 130 var statValue = parseFloat(stats[index].stat); 131 outputStats[stats[index].name] = isNaN(statValue)? 132 stats[index].stat : statValue; 133 } 134 return outputStats; 135 }; 136 }, 137 138 finish: function (doneCallback) { 139 fs.exists("test/reports/", function (exists) { 140 if(exists) { 141 writeFile.bind(this)(); 142 } else { 143 fs.mkdir("test/reports/", 0777, writeFile.bind(this)); 144 } 145 }.bind(this)); 146 147 function writeFile () { 148 fs.writeFile("test/reports/" + this.outputFileName_ + "_" + 149 (new Date()).getTime() +".json", JSON.stringify(this.output_), 150 doneCallback); 151 } 152 }, 153 }; 154 155 module.exports = Test; 156