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 // 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=56
78', | |
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; | |
OLD | NEW |