blob: 9dbbace6807e743af55f3d5413461f333569ec67 [file] [log] [blame]
// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
var service = require('../integration/get-service');
var serve = require('../integration/serve');
var Stress = require('../vdl-out/v.io/x/js.core/stress').Stress;
var test = require('prova');
test.timeout(60 * 5 * 1000);
var PAYLOAD_SIZE = 1000;
var DURATION = 1 * 60 * 1000;
test('load test echo', function(assert) {
service('/localhost:8141', function(err, ctx, echoer, end, rt) {
assert.error(err);
var payload = new Uint8Array(PAYLOAD_SIZE);
for (var i = 0; i < PAYLOAD_SIZE; i++) {
payload[i] = i && 0xff;
}
var iterations = 0;
var start = Date.now();
callEcho();
function callEcho() {
iterations++;
if ((iterations % 500) === 0) {
assert.ok(true, 'done with ' + iterations);
}
if ((Date.now() - start) > DURATION) {
return finish();
}
echoer.echo(ctx, payload).then(callEcho).catch(finish);
}
function finish(err) {
assert.error(err);
var duration = (Date.now() - start) / 1000;
var data = {
qps: iterations/duration,
iterations: iterations,
};
data.msecsPerRPC = 1000/data.qps;
assert.ok(true, JSON.stringify(data));
end(assert);
}
});
});
function Echoer() {}
Echoer.prototype._serviceDescription = Stress.prototype._serviceDescription;
Echoer.prototype.echo = function(ctx, serverCall, bytes) {
return Promise.resolve(bytes);
};
var echoer = new Echoer();
function alwaysAuth(ctx, call) {
return Promise.resolve();
}
function dispatcher(suffix) {
return {
service: echoer,
authorizer: alwaysAuth
};
}
/*
* The setup of this test is to have a JS server running under the name load
* and then ask the Go stressd server to create a go client and run the
* performance test against our server for DURATION milliseconds and return
* the results
*/
test('load test echo server', function(assert) {
var opts = {
name: 'load',
dispatcher: dispatcher,
autoBind: false,
};
serve(opts, function(err, res) {
assert.error(err);
if (err) {
res.end(assert);
}
// In order to run a performance test where we have a go client send
// a bunch of tests to the server, we tell the stressd server to run
// a peformance test against the server we just started.
var client = res.runtime.newClient();
var ctx = res.runtime.getContext();
client.bindTo(ctx, '/localhost:8141').then(function(stub) {
ctx = ctx.withTimeout(DURATION * 2);
return stub.serverEcho(ctx, { seconds: DURATION / 1000 }, 'load');
}).then(function(result) {
result.iterations = result.iterations.toNativeNumberApprox();
assert.ok(true, JSON.stringify(result));
res.end(assert);
}).catch(function(err) {
res.end(assert, err);
});
});
});