test stuff

This commit is contained in:
Adam Ierymenko 2015-10-28 14:16:58 -07:00
parent 1cae7327ae
commit 07c1b4ddee
4 changed files with 83 additions and 80 deletions

View file

@ -17,7 +17,7 @@ ADD zerotier-one /
RUN chmod a+x /zerotier-one RUN chmod a+x /zerotier-one
ADD agent.js / ADD agent.js /
ADD main.sh / ADD docker-main.sh /
RUN chmod a+x /docker-main.sh RUN chmod a+x /docker-main.sh
CMD ["./docker-main.sh"] CMD ["./docker-main.sh"]

View file

@ -1,14 +1,13 @@
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
// Customizable parameters: // Customizable parameters:
// How frequently in ms to run tests // Maximum test duration in milliseconds
//var RUN_TEST_EVERY = (60 * 5 * 1000); var TEST_DURATION = (30 * 1000);
var RUN_TEST_EVERY = 1000;
// Maximum test duration in milliseconds (must be less than RUN_TEST_EVERY) // Interval between tests (should be several times longer than TEST_DURATION)
var TEST_DURATION = (60 * 1000); 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_HOST = '174.136.102.178';
var SERVER_PORT = 18080; 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); payload.writeUInt8(Math.round(Math.random() * 255.0),xx);
} }
// Incremented for each test // Incremented with each test
var testCounter = 0; 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) function registerAndGetPeers(callback)
{ {
@ -84,13 +104,15 @@ function registerAndGetPeers(callback)
var body = ''; var body = '';
res.on('data',function(chunk) { body += chunk.toString(); }); res.on('data',function(chunk) { body += chunk.toString(); });
res.on('end',function() { res.on('end',function() {
if (!body)
return callback(null,[]);
try { try {
var peers = JSON.parse(body); var peers = JSON.parse(body);
if (Array.isArray(peers)) if (Array.isArray(peers))
return callback(null,peers); return callback(null,peers);
else return callback(new Error('invalid JSON response from server'),null); else return callback(new Error('invalid JSON response from server'),null);
} catch (e) { } 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) { }).on('error',function(e) {
@ -101,12 +123,13 @@ function registerAndGetPeers(callback)
function performTestOnAllPeers(peers,callback) function performTestOnAllPeers(peers,callback)
{ {
var allResults = {}; var allResults = {};
var allRequests = [];
var timedOut = false; var timedOut = false;
var endOfTestTimer = setTimeout(function() { var endOfTestTimer = setTimeout(function() {
timedOut = true; timedOut = true;
return callback(allResults); for(var x=0;x<allRequests.length;++x)
allRequests[x].abort();
},TEST_DURATION); },TEST_DURATION);
var testStartTime = Date.now();
async.each(peers,function(peer,next) { async.each(peers,function(peer,next) {
if (timedOut) if (timedOut)
@ -116,33 +139,15 @@ function performTestOnAllPeers(peers,callback)
var connectionStartTime = Date.now(); var connectionStartTime = Date.now();
allResults[peer] = { allResults[peer] = {
testStart: testStartTime,
start: connectionStartTime, start: connectionStartTime,
end: null, end: 0,
error: null, error: null,
bytes: 0, timedOut: false,
test: testCounter bytes: 0
}; };
var peerHost = ''; allRequests.push(http.get({
peerHost += peer.substr(0,4); host: agentIdToIp(peer),
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,
port: AGENT_PORT, port: AGENT_PORT,
path: '/' path: '/'
},function(res) { },function(res) {
@ -151,76 +156,67 @@ function performTestOnAllPeers(peers,callback)
bytes += chunk.length; bytes += chunk.length;
}); });
res.on('end',function() { res.on('end',function() {
if (timedOut)
return next(null);
allResults[peer] = { allResults[peer] = {
testStart: testStartTime,
start: connectionStartTime, start: connectionStartTime,
end: Date.now(), end: Date.now(),
error: null, error: null,
bytes: bytes, timedOut: timedOut,
test: testCounter bytes: bytes
}; };
return next(null); return next(null);
}); });
}).on('error',function(e) { }).on('error',function(e) {
if (timedOut)
return next(null);
allResults[peer] = { allResults[peer] = {
testStart: testStartTime,
start: connectionStartTime, start: connectionStartTime,
end: Date.now(), end: Date.now(),
error: e.toString(), error: e.toString(),
bytes: 0, timedOut: timedOut,
test: testCounter bytes: 0
}; };
return next(null); return next(null);
}); }));
},function(err) { },function(err) {
if (!timedOut) { if (!timedOut)
clearTimeout(endOfTestTimer); 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 // Agents just serve up a test payload
app.get('/',function(req,res) { app.get('/',function(req,res) {
return res.status(200).send(payload); 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) { registerAndGetPeers(function(err,peers) {
if (err) { if (err) {
console.error('FATAL: unable to contact or query server: '+err.toString()); console.error('FATAL: unable to contact or query server: '+err.toString());
process.exit(1); process.exit(1);
} }
setInterval(doTestsAndReport,TEST_INTERVAL);
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);
}); });
}); });

7
tests/http/docker-main.sh Normal file → Executable file
View file

@ -3,4 +3,9 @@
export PATH=/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin export PATH=/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin
/zerotier-one -d /zerotier-one -d
exec node --harmony /agent.js
while [ ! -d "/proc/sys/net/ipv6/conf/zt0" ]; do
sleep 0.25
done
exec node --harmony /agent.js >>agent.out 2>&1

View file

@ -26,7 +26,8 @@ app.get('/:agentId',function(req,res) {
return res.status(200).send(JSON.stringify(Object.keys(knownAgents))); return res.status(200).send(JSON.stringify(Object.keys(knownAgents)));
}); });
app.post('/:agentId',function(req,res) { app.post('/:testNumber/:agentId',function(req,res) {
var testNumber = req.params.testNumber;
var agentId = req.params.agentId; var agentId = req.params.agentId;
if ((!agentId)||(agentId.length !== 32)) if ((!agentId)||(agentId.length !== 32))
return res.status(404).send(''); return res.status(404).send('');
@ -40,8 +41,9 @@ app.post('/:agentId',function(req,res) {
} }
result = { result = {
agentId: agentId, agentId: agentId,
testNumber: testNumber,
receiveTime: receiveTime, receiveTime: receiveTime,
result: resultData results: resultData
}; };
var nows = receiveTime.toString(16); var nows = receiveTime.toString(16);