From 0cba67e10bbbf83612069680c956fb63865f9989 Mon Sep 17 00:00:00 2001 From: Chris Boulton Date: Sun, 5 Sep 2010 18:12:02 +1000 Subject: [PATCH] Fix alignment, add in unit tests for worker exit/close events --- README.md | 5 +++++ example/example.js | 4 ++++ lib/worker.js | 2 +- test/fixtures/worker.js | 5 +++++ test/test-worker.js | 39 +++++++++++++++++++++++++++++++-------- 5 files changed, 46 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index c97c3f3..f8fe2e7 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,11 @@ http://www.whatwg.org/specs/web-workers/current-work/ worker.terminate(); }); + // Optional, if you want to be notified when a worker child exits + worker.addListener('close', function(code) { + sys.puts('Worker exited with exit code ' + code); + }); + ## Example Worker File var worker = require("worker").worker; diff --git a/example/example.js b/example/example.js index 911f193..753e2df 100644 --- a/example/example.js +++ b/example/example.js @@ -15,4 +15,8 @@ worker.onmessage = function (msg) { worker.addListener("message", function (msg) { sys.puts(msg.hello); worker.terminate(); +}); + +worker.addListener('close', function(code) { + sys.puts('Worker exited with exit code ' + code); }); \ No newline at end of file diff --git a/lib/worker.js b/lib/worker.js index 04606e2..2e351cd 100644 --- a/lib/worker.js +++ b/lib/worker.js @@ -73,7 +73,7 @@ function WorkerChild (eventDest, filename) { this.child.addListener("exit", function (code) { debug(self.child.pid + ": exit "+code); - self.eventDest.emit("close", code); + self.eventDest.emit("close", code); }); this.buffer = ""; diff --git a/test/fixtures/worker.js b/test/fixtures/worker.js index 4f152e7..1ab5b98 100644 --- a/test/fixtures/worker.js +++ b/test/fixtures/worker.js @@ -20,6 +20,11 @@ worker.onmessage = function (msg) { if(msg.error) { throw("ErrorMarker"); } + + if(msg.exitCode) { + process.exit(msg.exitCode); + return; + } msg.output = msg.input * 3; setTimeout(function () { diff --git a/test/test-worker.js b/test/test-worker.js index 5f5f830..c730392 100644 --- a/test/test-worker.js +++ b/test/test-worker.js @@ -1,18 +1,18 @@ var common = require("./common"); var sys = require("sys"); var assert = require('assert'); - + var Worker = require("../lib/worker").Worker; - + process.ENV["NODE_PATH"] = common.libDir; - + function makeWorker (filename) { return new Worker(__dirname+"/fixtures/"+filename); } // basic test var worker = makeWorker("worker.js"); - + worker.onmessage = function (msg) { if (msg.input) { assert.ok(msg.output == msg.input * 3, "We can multiply asyncly"); @@ -21,7 +21,7 @@ worker.onmessage = function (msg) { } } }; - + worker.postMessage({ input: 1 }); @@ -38,7 +38,7 @@ worker.postMessage({ // error handling setTimeout(function () { setTimeout(function () { - + var w2 = makeWorker("worker.js"); w2.postMessage({ error: true @@ -51,7 +51,7 @@ setTimeout(function () { assert.ok(false, "Wanted an error, but got a message"); w2.terminate(); }); - + var w3 = makeWorker("worker.js"); w3.postMessage({ error: true @@ -64,7 +64,7 @@ setTimeout(function () { assert.ok(false, "Wanted an error, but got a message"); w3.terminate(); }); - + }, 10); }, 10); @@ -112,4 +112,27 @@ waitWorker.postMessage({ waitWorker.addListener("message", function () { assert.ok(true, "Worker response can be async.") waitWorker.terminate(); +}); + +// Test workers raise "close" event when they exit +var workersClosed = 0; +var exitWorker = makeWorker('worker.js'); +exitWorker.postMessage({ + exitCode: 1, +}); +exitWorker.addListener('close', function(code) { + assert.ok(code === 1, 'Exited worker returns exit code'); + ++workersClosed; +}); + +// Test that when a worker raises a syntax error, it raises a close event +var exitWorker = makeWorker('syntax-error-worker.js'); +exitWorker.onerror = function() { }; +exitWorker.addListener('close', function(code) { + assert.ok(true, 'Worker with syntax error raises close event'); + ++workersClosed; +}); + +process.addListener('exit', function () { + assert.ok(workersClosed == 2, "Exited workers raise 'close' event"); }); \ No newline at end of file