|
@@ -1,14 +1,13 @@
|
|
|
// ---------------------------------------------------------------------------
|
|
|
// Customizable parameters:
|
|
|
|
|
|
-// How frequently in ms to run tests
|
|
|
-//var RUN_TEST_EVERY = (60 * 5 * 1000);
|
|
|
-var RUN_TEST_EVERY = 1000;
|
|
|
+// Maximum test duration in milliseconds
|
|
|
+var TEST_DURATION = (30 * 1000);
|
|
|
|
|
|
-// Maximum test duration in milliseconds (must be less than RUN_TEST_EVERY)
|
|
|
-var TEST_DURATION = (60 * 1000);
|
|
|
+// Interval between tests (should be several times longer than TEST_DURATION)
|
|
|
+var TEST_INTERVAL = (60 * 2 * 1000);
|
|
|
|
|
|
-// Where should I contact to register and query a list of other nodes?
|
|
|
+// Where should I contact to register and query a list of other test agents?
|
|
|
var SERVER_HOST = '174.136.102.178';
|
|
|
var SERVER_PORT = 18080;
|
|
|
|
|
@@ -71,8 +70,29 @@ for(var xx=0;xx<PAYLOAD_SIZE;++xx) {
|
|
|
payload.writeUInt8(Math.round(Math.random() * 255.0),xx);
|
|
|
}
|
|
|
|
|
|
-// Incremented for each test
|
|
|
-var testCounter = 0;
|
|
|
+// Incremented with each test
|
|
|
+var testNumber = 0;
|
|
|
+
|
|
|
+function agentIdToIp(agentId)
|
|
|
+{
|
|
|
+ var ip = '';
|
|
|
+ ip += agentId.substr(0,4);
|
|
|
+ ip += ':';
|
|
|
+ ip += agentId.substr(4,4);
|
|
|
+ ip += ':';
|
|
|
+ ip += agentId.substr(8,4);
|
|
|
+ ip += ':';
|
|
|
+ ip += agentId.substr(12,4);
|
|
|
+ ip += ':';
|
|
|
+ ip += agentId.substr(16,4);
|
|
|
+ ip += ':';
|
|
|
+ ip += agentId.substr(20,4);
|
|
|
+ ip += ':';
|
|
|
+ ip += agentId.substr(24,4);
|
|
|
+ ip += ':';
|
|
|
+ ip += agentId.substr(28,4);
|
|
|
+ return ip;
|
|
|
+};
|
|
|
|
|
|
function registerAndGetPeers(callback)
|
|
|
{
|
|
@@ -84,13 +104,15 @@ function registerAndGetPeers(callback)
|
|
|
var body = '';
|
|
|
res.on('data',function(chunk) { body += chunk.toString(); });
|
|
|
res.on('end',function() {
|
|
|
+ if (!body)
|
|
|
+ return callback(null,[]);
|
|
|
try {
|
|
|
var peers = JSON.parse(body);
|
|
|
if (Array.isArray(peers))
|
|
|
return callback(null,peers);
|
|
|
else return callback(new Error('invalid JSON response from server'),null);
|
|
|
} catch (e) {
|
|
|
- return callback(new Error('invalid JSON response from server'),null);
|
|
|
+ return callback(new Error('invalid JSON response from server: '+e.toString()),null);
|
|
|
}
|
|
|
});
|
|
|
}).on('error',function(e) {
|
|
@@ -101,12 +123,13 @@ function registerAndGetPeers(callback)
|
|
|
function performTestOnAllPeers(peers,callback)
|
|
|
{
|
|
|
var allResults = {};
|
|
|
+ var allRequests = [];
|
|
|
var timedOut = false;
|
|
|
var endOfTestTimer = setTimeout(function() {
|
|
|
timedOut = true;
|
|
|
- return callback(allResults);
|
|
|
+ for(var x=0;x<allRequests.length;++x)
|
|
|
+ allRequests[x].abort();
|
|
|
},TEST_DURATION);
|
|
|
- var testStartTime = Date.now();
|
|
|
|
|
|
async.each(peers,function(peer,next) {
|
|
|
if (timedOut)
|
|
@@ -116,33 +139,15 @@ function performTestOnAllPeers(peers,callback)
|
|
|
|
|
|
var connectionStartTime = Date.now();
|
|
|
allResults[peer] = {
|
|
|
- testStart: testStartTime,
|
|
|
start: connectionStartTime,
|
|
|
- end: null,
|
|
|
+ end: 0,
|
|
|
error: null,
|
|
|
- bytes: 0,
|
|
|
- test: testCounter
|
|
|
+ timedOut: false,
|
|
|
+ bytes: 0
|
|
|
};
|
|
|
|
|
|
- var peerHost = '';
|
|
|
- peerHost += peer.substr(0,4);
|
|
|
- peerHost += ':';
|
|
|
- peerHost += peer.substr(4,4);
|
|
|
- peerHost += ':';
|
|
|
- peerHost += peer.substr(8,4);
|
|
|
- peerHost += ':';
|
|
|
- peerHost += peer.substr(12,4);
|
|
|
- peerHost += ':';
|
|
|
- peerHost += peer.substr(16,4);
|
|
|
- peerHost += ':';
|
|
|
- peerHost += peer.substr(20,4);
|
|
|
- peerHost += ':';
|
|
|
- peerHost += peer.substr(24,4);
|
|
|
- peerHost += ':';
|
|
|
- peerHost += peer.substr(28,4);
|
|
|
-
|
|
|
- http.get({
|
|
|
- host: peerHost,
|
|
|
+ allRequests.push(http.get({
|
|
|
+ host: agentIdToIp(peer),
|
|
|
port: AGENT_PORT,
|
|
|
path: '/'
|
|
|
},function(res) {
|
|
@@ -151,76 +156,67 @@ function performTestOnAllPeers(peers,callback)
|
|
|
bytes += chunk.length;
|
|
|
});
|
|
|
res.on('end',function() {
|
|
|
- if (timedOut)
|
|
|
- return next(null);
|
|
|
allResults[peer] = {
|
|
|
- testStart: testStartTime,
|
|
|
start: connectionStartTime,
|
|
|
end: Date.now(),
|
|
|
error: null,
|
|
|
- bytes: bytes,
|
|
|
- test: testCounter
|
|
|
+ timedOut: timedOut,
|
|
|
+ bytes: bytes
|
|
|
};
|
|
|
return next(null);
|
|
|
});
|
|
|
}).on('error',function(e) {
|
|
|
- if (timedOut)
|
|
|
- return next(null);
|
|
|
allResults[peer] = {
|
|
|
- testStart: testStartTime,
|
|
|
start: connectionStartTime,
|
|
|
end: Date.now(),
|
|
|
error: e.toString(),
|
|
|
- bytes: 0,
|
|
|
- test: testCounter
|
|
|
+ timedOut: timedOut,
|
|
|
+ bytes: 0
|
|
|
};
|
|
|
return next(null);
|
|
|
- });
|
|
|
+ }));
|
|
|
},function(err) {
|
|
|
- if (!timedOut) {
|
|
|
+ if (!timedOut)
|
|
|
clearTimeout(endOfTestTimer);
|
|
|
- return callback(allResults);
|
|
|
- }
|
|
|
+ return callback(allResults);
|
|
|
});
|
|
|
};
|
|
|
|
|
|
+function doTestsAndReport()
|
|
|
+{
|
|
|
+ registerAndGetPeers(function(err,peers) {
|
|
|
+ if (err) {
|
|
|
+ console.error('WARNING: skipping test: unable to contact or query server: '+err.toString());
|
|
|
+ } else {
|
|
|
+ performTestOnAllPeers(peers,function(results) {
|
|
|
+ ++testNumber;
|
|
|
+ var submit = http.request({
|
|
|
+ host: SERVER_HOST,
|
|
|
+ port: SERVER_PORT,
|
|
|
+ path: '/'+testNumber+'/'+thisAgentId,
|
|
|
+ method: 'POST'
|
|
|
+ },function(res) {
|
|
|
+ }).on('error',function(e) {
|
|
|
+ console.error('WARNING: unable to submit results to server: '+err.toString());
|
|
|
+ });
|
|
|
+ submit.write(JSON.stringify(results));
|
|
|
+ submit.end();
|
|
|
+ });
|
|
|
+ }
|
|
|
+ });
|
|
|
+}
|
|
|
+
|
|
|
// Agents just serve up a test payload
|
|
|
app.get('/',function(req,res) {
|
|
|
return res.status(200).send(payload);
|
|
|
});
|
|
|
|
|
|
-var expressServer = app.listen(AGENT_PORT,function () {
|
|
|
+var expressServer = app.listen(AGENT_PORT,agentIdToIp(thisAgentId),function () {
|
|
|
registerAndGetPeers(function(err,peers) {
|
|
|
if (err) {
|
|
|
console.error('FATAL: unable to contact or query server: '+err.toString());
|
|
|
process.exit(1);
|
|
|
}
|
|
|
-
|
|
|
- setInterval(function() {
|
|
|
- ++testCounter;
|
|
|
-
|
|
|
- registerAndGetPeers(function(err,peers) {
|
|
|
- if (err) {
|
|
|
- console.error('WARNING: unable to contact or query server, test aborted: '+err.toString());
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- performTestOnAllPeers(peers,function(results) {
|
|
|
- //console.log(results);
|
|
|
-
|
|
|
- var submit = http.request({
|
|
|
- host: SERVER_HOST,
|
|
|
- port: SERVER_PORT,
|
|
|
- path: '/'+thisAgentId,
|
|
|
- method: 'POST'
|
|
|
- },function(res) {
|
|
|
- }).on('error',function(e) {
|
|
|
- console.error('WARNING: unable to submit results to server: '+err.toString());
|
|
|
- });
|
|
|
- submit.write(JSON.stringify(results));
|
|
|
- submit.end();
|
|
|
- });
|
|
|
- });
|
|
|
- },RUN_TEST_EVERY);
|
|
|
+ setInterval(doTestsAndReport,TEST_INTERVAL);
|
|
|
});
|
|
|
});
|