); nock.restore(); await polly.stop(); });
test('does not retry ECONNREFUSED if maxRetries is 0', function (t) { t.plan(2) nock.restore() let retries = 0 lento({ maxRetries: 0, port: 9999 }) .on('retry', () => { retries++ }) .createRowStream('select 1') .on('data', noop) .on('error', function (err) { t.is(err.code, 'ECONNREFUSED') t.is(retries, 0) nock.activate() }) })
test('ETIMEDOUT (after headers were received)', function (t) { t.plan(2) nock.restore() http.createServer().listen(0, 'localhost', function () { this.on('request', (req, res) => { // Ensure we're not testing server-side timeouts req.setTimeout(0) res.writeHead(200, { 'content-type': 'application/json' }) res.write('{') }) lento({ port: this.address().port, maxRetries: 1, socketTimeout: '100ms' }) .createRowStream('select 1') .on('error', (err) => { t.is(err.code, 'ETIMEDOUT') this.close((err) => { t.ifError(err, 'no close error') nock.activate() }) }).resume() }) })
test('broken content encoding (deflate)', function (t) { t.plan(3) nock.restore() http.createServer().listen(0, 'localhost', function () { this.on('request', (req, res) => { res.writeHead(200, { 'content-encoding': 'deflate' }) res.write('111') }) lento({ port: this.address().port, maxRetries: 1 }) .createRowStream('select 1') .on('error', (err) => { t.is(err && err.code, 'Z_DATA_ERROR') t.is(err && err.message, 'Unable to decode deflate content: incorrect header check') this.close((err) => { t.ifError(err, 'no close error') nock.activate() }) }).resume() }) })
nock.restore(); nock.cleanAll(); done();
test('ETIMEDOUT (after redirect)', function (t) { t.plan(6) nock.restore()
test('ETIMEDOUT after user destroy', function (t) { t.plan(3) nock.restore() http.createServer().listen(0, 'localhost', function () { const stream = lento({ port: this.address().port, socketTimeout: '500ms' }) .createRowStream('select 1') .on('error', (err) => { t.is(err && err.message, 'user error') this.close((err) => { t.ifError(err, 'no close error') nock.activate() }) }).resume() this.on('request', (req, res) => { // Ensure we're not testing server-side timeouts req.setTimeout(0) t.pass('server got request') stream.destroy(new Error('user error')) }) }) })
test('ETIMEDOUT (before anything was received)', function (t) { t.plan(3) nock.restore() http.createServer().listen(0, 'localhost', function () { this.on('request', (req, res) => { // Ensure we're not testing server-side timeouts req.setTimeout(0) t.pass('server got request') }) lento({ port: this.address().port, socketTimeout: '100ms' }) .createRowStream('select 1') .on('error', (err) => { t.is(err.code, 'ETIMEDOUT') this.close((err) => { t.ifError(err, 'no close error') nock.activate() }) }).resume() }) })
); nock.restore(); await polly.stop(); });
test('retries ECONNREFUSED', function (t) { t.plan(2) nock.restore() let retries = 0 lento({ maxRetries: 1, port: 9999 }) .on('retry', () => { retries++ }) .createRowStream('select 1') .on('data', noop) .on('error', function (err) { t.is(err.code, 'ECONNREFUSED') t.is(retries, 1) nock.activate() }) })
test('broken content encoding (gzip)', function (t) { t.plan(3) nock.restore() http.createServer().listen(0, 'localhost', function () { this.on('request', (req, res) => { res.writeHead(200, { 'content-encoding': 'gzip' }) // Write invalid 10-byte gzip header. Don't end, client should. res.write('0000000000') }) lento({ port: this.address().port, maxRetries: 1 }) .createRowStream('select 1') .on('error', (err) => { t.is(err && err.code, 'Z_DATA_ERROR') t.is(err && err.message, 'Unable to decode gzip content: incorrect header check') this.close((err) => { t.ifError(err, 'no close error') nock.activate() }) }).resume() }) })