hapi
Version:
HTTP Server framework
185 lines (125 loc) • 4.45 kB
JavaScript
// Load modules
var Lab = require('lab');
var Http = require('http');
var Stream = require('stream');
var Hapi = require('../..');
// Declare internals
var internals = {};
// Test shortcuts
var expect = Lab.expect;
var before = Lab.before;
var after = Lab.after;
var describe = Lab.experiment;
var it = Lab.test;
describe('Client Timeout', function () {
var fastHandler = function (request) {
request.reply('Fast');
};
var streamHandler = function (request) {
var TestStream = function () {
Stream.Readable.call(this);
};
Hapi.utils.inherits(TestStream, Stream.Readable);
TestStream.prototype._read = function (size) {
var self = this;
if (this.isDone) {
return;
}
this.isDone = true;
setTimeout(function () {
self.push('Hello');
}, 60);
setTimeout(function () {
self.push(null);
}, 70);
};
request.reply(new TestStream());
};
describe('with timeout set', function () {
var _server = new Hapi.Server('127.0.0.1', 0, { timeout: { client: 50 } });
_server.route([
{ method: 'POST', path: '/fast', config: { handler: fastHandler } },
{ method: 'GET', path: '/stream', config: { handler: streamHandler } }
]);
before(function (done) {
_server.start(done);
});
it('returns client error message when client request taking too long', function (done) {
var timer = new Hapi.utils.Timer();
var options = {
hostname: '127.0.0.1',
port: _server.info.port,
path: '/fast',
method: 'POST'
};
var req = Http.request(options, function (res) {
expect(res.statusCode).to.equal(408);
expect(timer.elapsed()).to.be.at.least(49);
done();
});
req.on('error', function (err) { // Will error out, so don't allow error to escape test
});
req.write('\n');
setTimeout(function () {
req.end();
}, 100);
});
it('doesn\'t return a client error message when client request is fast', function (done) {
var options = {
hostname: '127.0.0.1',
port: _server.info.port,
path: '/fast',
method: 'POST'
};
var req = Http.request(options, function (res) {
expect(res.statusCode).to.equal(200);
done();
});
req.end();
});
it('doesn\'t return a client error message when response is taking a long time to send', function (done) {
var timer = new Hapi.utils.Timer();
var options = {
hostname: '127.0.0.1',
port: _server.info.port,
path: '/stream',
method: 'GET'
};
var req = Http.request(options, function (res) {
expect(timer.elapsed()).to.be.at.least(59);
expect(res.statusCode).to.equal(200);
done();
});
req.once('error', function (err) {
done();
});
req.end();
});
});
describe('with timeout disabled', function () {
var _server = new Hapi.Server('127.0.0.1', 0, { timeout: { client: false } });
_server.route([
{ method: 'POST', path: '/fast', config: { handler: fastHandler } }
]);
before(function (done) {
_server.start(done);
});
it('client doesn\'t return an error', function (done) {
var timer = new Hapi.utils.Timer();
var options = {
hostname: '127.0.0.1',
port: _server.info.port,
path: '/fast',
method: 'POST'
};
var req = Http.request(options, function (res) {
expect(res.statusCode).to.equal(200);
expect(timer.elapsed()).to.be.at.least(99);
done();
});
setTimeout(function () {
req.end();
}, 100);
});
});
});