From 2410077e26d5429ac45533438f008706dcb989f7 Mon Sep 17 00:00:00 2001 From: Mickael van der Beek Date: Tue, 18 Nov 2014 21:20:56 +0100 Subject: [PATCH 1/2] Fixes caolan/async#263 and other dependency issues by detecting dead-locks and throwing an Error. --- lib/async.js | 11 +++++++++++ test/test-async.js | 27 +++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/lib/async.js b/lib/async.js index a13f83520..50f7a2806 100755 --- a/lib/async.js +++ b/lib/async.js @@ -478,6 +478,17 @@ } }; var requires = task.slice(0, Math.abs(task.length - 1)) || []; + // prevent dead-locks + var len = requires.length; + var dep; + while (len--) { + if (!(dep = tasks[requires[len]])) { + throw new Error('Has inexistant dependency'); + } + if (_isArray(dep) && !!~dep.indexOf(k)) { + throw new Error('Has cyclic dependencies'); + } + } var ready = function () { return _reduce(requires, function (a, x) { return (a && results.hasOwnProperty(x)); diff --git a/test/test-async.js b/test/test-async.js index 6a3560694..8ee2bd903 100755 --- a/test/test-async.js +++ b/test/test-async.js @@ -580,6 +580,33 @@ exports['auto modifying results causes final callback to run early'] = function( }); }; +// Issue 263 on github: https://github.com/caolan/async/issues/263 +exports['auto prevent dead-locks due to inexistant dependencies'] = function(test) { + test.throws(function () { + async.auto({ + task1: ['noexist', function(callback, results){ + callback(null, 'task1'); + }] + }); + }, Error); + test.done(); +}; + +// Issue 263 on github: https://github.com/caolan/async/issues/263 +exports['auto prevent dead-locks due to cyclic dependencies'] = function(test) { + test.throws(function () { + async.auto({ + task3: ['task4', function(callback, results){ + callback(null, 'task3'); + }], + task4: ['task3', function(callback, results){ + callback(null, 'task4'); + }] + }); + }, Error); + test.done(); +}; + // Issue 306 on github: https://github.com/caolan/async/issues/306 exports['retry when attempt succeeds'] = function(test) { var failed = 3 From 74819d24051d1457c73ab301d697ec8b467115f8 Mon Sep 17 00:00:00 2001 From: Mickael van der Beek Date: Tue, 18 Nov 2014 21:24:02 +0100 Subject: [PATCH 2/2] Corrected task name typo for consistency with other tests. --- test/test-async.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/test-async.js b/test/test-async.js index 8ee2bd903..a84cb4907 100755 --- a/test/test-async.js +++ b/test/test-async.js @@ -596,11 +596,11 @@ exports['auto prevent dead-locks due to inexistant dependencies'] = function(tes exports['auto prevent dead-locks due to cyclic dependencies'] = function(test) { test.throws(function () { async.auto({ - task3: ['task4', function(callback, results){ - callback(null, 'task3'); + task1: ['task2', function(callback, results){ + callback(null, 'task1'); }], - task4: ['task3', function(callback, results){ - callback(null, 'task4'); + task2: ['task1', function(callback, results){ + callback(null, 'task2'); }] }); }, Error);