illyria
Version:
The next generation Illyria RPC SDK for node.js.
216 lines (185 loc) • 5.63 kB
JavaScript
#! /usr/bin/env node
/**
* XadillaX created at 2015-03-11 14:42:39
*
* Copyright (c) 2015 Huaban.com, all rights
* reserved
*/
/* istanbul ignore next */
(function() {
var async = require("async");
var illyria2 = require("../");
var Scarlet = require("scarlet-task");
var block;
function countValidator(min, max, name) {
return function(count) {
var _count = parseInt(count);
if(count.toString() !== _count.toString()) {
return name + " must be an integer";
}
if(_count <= min || _count >= max) {
return name + " must be greater than 0 and smaller than 2147483648";
}
};
}
var opts = require("nomnom")
.option("n", {
abbr: "n",
default: 1,
help: "times of testing",
callback: countValidator(0, 2147483648, "n")
})
.option("complicating", {
abbr: "c",
default: 1,
help: "complicating of dummy users",
callback: countValidator(0, 2147483648, "c")
})
.option("size", {
abbr: "s",
default: 512,
help: "data size for each request",
callback: countValidator(0, 2147483648, "size")
})
.option("port", {
abbr: "p",
default: 8742,
help: "port for test server",
callback: countValidator(999, 65536, "port")
})
.option("complicating-mode", {
abbr: "m",
default: "clients",
help: "mode of complicating (client or clients)",
callback: function(mode) {
if(mode !== "client" && mode !== "clients") {
return "complicating mode must be client or clients";
}
}
})
.option("hide-per", {
flag: true,
help: "hide per case's result"
})
.script("./benchmark/index")
.parse();
var clients = [];
var server;
var SERVER_PORT = opts.port;
async.waterfall([
/**
* step 1.
* create server
*/
function(callback) {
server = illyria2.createServer();
server.expose("benchmark", {
echo: function(req, resp) {
resp.send(req.params());
}
});
server.listen(SERVER_PORT, function() {
callback();
});
},
/**
* step 2.
* create clients and connect to server
*/
function(callback) {
var scarlet = new Scarlet(Math.min(opts.n, 100));
function connect(taskObject) {
var client = taskObject.task.client;
var i = taskObject.task.idx;
client.connect(function() {
scarlet.taskDone(taskObject);
});
client.on("error", function(err) {
console.log(err + ": Client " + i);
});
}
console.time("Connect");
// if mode is `clients`, we create (opts.complicating) clients,
// otherwise we create only one.
var max = opts["complicating-mode"] === "clients" ? opts.complicating : 1;
for(var i = 0; i < max; i++) {
var client = illyria2.createClient("127.0.0.1", SERVER_PORT, {
runTimeout: 10000,
retryInterval: 1000,
reconnect: true
});
scarlet.push({ idx: i, client: client }, connect);
clients.push(client);
}
scarlet.afterFinish(max, function() {
console.timeEnd("Connect");
callback();
}, false);
},
/**
* step 3.
* start testing
*/
function(callback) {
block = "";
for(var i = 0; i < opts.size; i++) block + ".";
testAbility(callback);
}
], function() {
console.log(
"done on " + opts.n +
" times, " + opts.complicating +
" complicating, block size is " + opts.size +
" and inconsistent is " + inconsistent + ".");
process.exit(0);
});
var inconsistent = 0;
/**
* test benchmark for per time (per opts.n)
* @param {TaskObject} taskObject the task object of scarlet-task
*/
function testPerAbility(taskObject) {
var idx = taskObject.task.idx;
var scarlet = new Scarlet(opts.complicating);
function test(taskObject) {
taskObject.task.client.send("benchmark", "echo", { block: block }, function(err, data) {
if(data.block !== block) {
inconsistent++;
}
scarlet.taskDone(taskObject);
});
}
/**
* create opts.complicating tasks, each task is to send and receive data
*/
var useI = opts["complicating-mode"] === "clients";
for(var i = opts.complicating - 1; i >= 0; i--) {
// if mode is `clients`, we use (opts.complicating) clients,
// otherwise, we use only 1
scarlet.push({ client: clients[useI ? i : 0] }, test);
}
scarlet.afterFinish(opts.complicating, function() {
if(!opts["hide-per"]) console.timeEnd("# Case " + idx);
taskObject.task.scarlet.taskDone(taskObject);
}, false);
if(!opts["hide-per"]) console.time("# Case " + idx);
}
/**
* test benchmark for total opts.n times
* @param {Function} callback the callback function
*/
function testAbility(callback) {
var scarlet = new Scarlet(1);
/**
* create opts.n tasks, each task is to call `testPerAbility`
*/
for(var i = opts.n - 1; i >= 0; i--) {
scarlet.push({ idx: opts.n - i, scarlet: scarlet }, testPerAbility);
}
scarlet.afterFinish(opts.n, function() {
console.timeEnd("Process");
callback();
}, false);
console.time("Process");
}
})();