Skip to content

Commit

Permalink
test callback error handling
Browse files Browse the repository at this point in the history
  • Loading branch information
technoweenie committed Jul 20, 2010
1 parent ea4a3b6 commit ceefd3c
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 18 deletions.
16 changes: 8 additions & 8 deletions lib/index.js
Expand Up @@ -44,10 +44,10 @@ ChainGang.prototype.shift = function() {
};
}
};
ChainGang.prototype.finish = function(name) {
ChainGang.prototype.finish = function(name, err) {
delete this.index[name];
this.emit(name);
return this.emit('finished', name);
this.emit(name, err);
return this.emit('finished', name, err);
};
ChainGang.prototype.emit = function(event) {
var args;
Expand Down Expand Up @@ -101,13 +101,13 @@ Worker.prototype.perform = function() {
try {
return data.callback(this);
} catch (err) {
sys.puts(sys.inspect(err));
this.chain.emit('error', err, data.name);
return finish(data.name);
this.chain.emit(("error-" + data.name), err);
this.chain.emit("error", err, data.name);
return this.finish(data.name, err);
}
};
Worker.prototype.finish = function() {
this.chain.finish(this.performing);
Worker.prototype.finish = function(err) {
this.chain.finish(this.performing, err);
this.performing = false;
return this.perform();
};
Expand Down
22 changes: 12 additions & 10 deletions src/index.coffee
Expand Up @@ -31,12 +31,14 @@ class ChainGang
# Emits ('add', name)
add: (task, name, callback) ->
name: or @default_name_for task

if callback then @events.addListener name, callback
if @index[name] != undefined then return

@queue.push name
@index[name]: task
@events.emit 'add', name

if @active then @perform()

# Public: Attempts to find an idle worker to perform a job.
Expand All @@ -63,12 +65,12 @@ class ChainGang
# name - The unique String job identifier.
#
# Returns nothing.
# Emits (name)
# Emits ('finished', name)
finish: (name) ->
# Emits (name, err)
# Emits ('finished', name, err)
finish: (name, err) ->
delete @index[name]
@emit name
@emit 'finished', name
@emit name, err
@emit 'finished', name, err

emit: (event, args...) ->
@events.emit event, args...
Expand Down Expand Up @@ -118,15 +120,15 @@ class Worker
try
data.callback this
catch err
sys.puts sys.inspect(err)
@chain.emit 'error', err, data.name
finish data.name
@chain.emit "error-$data.name", err
@chain.emit "error", err, data.name
@finish data.name, err

# Finishes the current job, and looks for another.
#
# Returns nothing.
finish: ->
@chain.finish @performing
finish: (err) ->
@chain.finish @performing, err
@performing: false
@perform()

Expand Down
39 changes: 39 additions & 0 deletions test/error_test.coffee
@@ -0,0 +1,39 @@
sys: require('sys')
assert: require('assert')
chainGang: require('../src')

chain: chainGang.create({workers: 2})
assert.equal(2, chain.workers.length)

called_finished: false
called_named: false
called_error: false
called_custom_error: false

chain.addListener 'finished', (name, err) ->
assert.ok err
assert.equal 'foo', name
called_finished: true

chain.addListener 'foo', (err) ->
assert.ok err
called_named: true

chain.addListener 'error', (err, name) ->
assert.ok err
assert.equal 'foo', name
called_error: true

chain.addListener 'error-foo', (err) ->
assert.ok err
called_custom_error: true

chain.add ->
a.b == c
, 'foo'

process.addListener 'exit', ->
assert.ok called_error
assert.ok called_custom_error
assert.ok called_finished
assert.ok called_named

0 comments on commit ceefd3c

Please sign in to comment.