From a41cfa9aaea788d6af878bbc44faf848cd40c3dd Mon Sep 17 00:00:00 2001 From: Ruben Bridgewater Date: Wed, 1 Jun 2016 14:04:25 +0200 Subject: [PATCH] Add good stack traces tests and fix stack traces in debug mode --- lib/command.js | 3 +- test/good_traces.spec.js | 59 ++++++++++++++++++++++++++++++++++++++++ test/lib/good-traces.js | 20 ++++++++++++++ test/node_redis.spec.js | 2 +- 4 files changed, 81 insertions(+), 3 deletions(-) create mode 100644 test/good_traces.spec.js create mode 100644 test/lib/good-traces.js diff --git a/lib/command.js b/lib/command.js index 1c14b2d41f..717115c82e 100644 --- a/lib/command.js +++ b/lib/command.js @@ -1,7 +1,6 @@ 'use strict'; -var debug_mode = require('../').debug_mode; -var betterStackTraces = process.env.NODE_ENV && process.env.NODE_ENV.toUpperCase() === 'DEVELOPMENT' || debug_mode; +var betterStackTraces = /development/i.test(process.env.NODE_ENV) || /\bredis\b/i.test(process.env.NODE_DEBUG); function Command (command, args, callback, call_on_write) { this.command = command; diff --git a/test/good_traces.spec.js b/test/good_traces.spec.js new file mode 100644 index 0000000000..d8759b0f9a --- /dev/null +++ b/test/good_traces.spec.js @@ -0,0 +1,59 @@ +'use strict'; + +var assert = require('assert'); +var config = require('./lib/config'); +var fork = require('child_process').fork; +var redis = config.redis; + +describe('stack traces', function () { + + it('should return good traces with NODE_ENV=development set', function (done) { + var external = fork('./test/lib/good-traces.js', { + env: { + NODE_ENV: 'development' + } + }); + + var id = setTimeout(function () { + external.kill(); + done(new Error('Timeout')); + }, 6000); + + external.on('close', function (code) { + clearTimeout(id); + assert.strictEqual(code, 0); + done(); + }); + }); + + it('should return good traces with NODE_DEBUG=redis env set', function (done) { + var external = fork('./test/lib/good-traces.js', { + env: { + NODE_DEBUG: 'redis' + }, + silent: true + }); + + var id = setTimeout(function () { + external.kill(); + done(new Error('Timeout')); + }, 6000); + + external.on('close', function (code) { + clearTimeout(id); + assert.strictEqual(code, 0); + done(); + }); + }); + + // This is always going to return good stack traces + it('should always return good stack traces for rejected offline commands', function (done) { + var client = redis.createClient({ + enable_offline_queue: false + }); + client.set('foo', function (err, res) { + assert(/good_traces.spec.js/.test(err.stack)); + client.quit(done); + }); + }); +}); diff --git a/test/lib/good-traces.js b/test/lib/good-traces.js new file mode 100644 index 0000000000..c583da2ae2 --- /dev/null +++ b/test/lib/good-traces.js @@ -0,0 +1,20 @@ +// Spawned by the good_stacks.spec.js tests +'use strict'; + +var assert = require('assert'); +var redis = require('../../index'); +var client = redis.createClient(); + +// Both error cases would normally return bad stack traces +client.set('foo', function (err, res) { + assert(/good-traces.js:9:8/.test(err.stack)); + client.set('foo', 'bar', function (err, res) { + assert(/good-traces.js:11:12/.test(err.stack)); + client.quit(function () { + process.exit(0); + }); + }); + process.nextTick(function () { + client.stream.destroy(); + }); +}); diff --git a/test/node_redis.spec.js b/test/node_redis.spec.js index d9d0667234..6c3376c7f3 100644 --- a/test/node_redis.spec.js +++ b/test/node_redis.spec.js @@ -851,7 +851,7 @@ describe('The node_redis client', function () { var id = setTimeout(function () { external.kill(); - done(Error('unref subprocess timed out')); + done(new Error('unref subprocess timed out')); }, 8000); external.on('close', function (code) {