YUKI Hiroshi
null+****@clear*****
Fri Oct 17 15:34:55 JST 2014
YUKI Hiroshi 2014-10-17 15:34:55 +0900 (Fri, 17 Oct 2014) New Revision: ef4e37a4ab2b0e2fb3c7926b1c6629eefd9bd154 https://github.com/droonga/express-droonga/commit/ef4e37a4ab2b0e2fb3c7926b1c6629eefd9bd154 Message: Migrate from JSDeferred to Q. Because we should use standard (well-known) APIs instead of cusom one. Q includes ES6 Promise-compatible API, so it is easy to migrate Q to ES6 Promise finally. Modified files: package.json test/adapter/api/groonga/basic.test.js test/adapter/api/groonga/load.test.js test/adapter/http.test.js test/adapter/socket.io.test.js test/droonga-protocol/connection.test.js test/droonga-protocol/receiver.test.js test/express-adapter.test.js test/test-utils.js Modified: package.json (+0 -1) =================================================================== --- package.json 2014-10-17 15:31:35 +0900 (40f7109) +++ package.json 2014-10-17 15:34:55 +0900 (18b392e) @@ -39,7 +39,6 @@ "devDependencies": { "express": ">=4.9", "chai": "*", - "jsdeferred": "*", "mocha": "*", "nodemock": "*", "socket.io-client": ">=1.0", Modified: test/adapter/api/groonga/basic.test.js (+6 -11) =================================================================== --- test/adapter/api/groonga/basic.test.js 2014-10-17 15:31:35 +0900 (13c5718) +++ test/adapter/api/groonga/basic.test.js 2014-10-17 15:34:55 +0900 (59fe280) @@ -1,6 +1,5 @@ var assert = require('chai').assert; var nodemock = require('nodemock'); -var Deferred = require('jsdeferred').Deferred; var utils = require('../../../test-utils'); var groongaUtils = require('./utils'); @@ -17,7 +16,7 @@ suite('adapter/api/groonga: basic commands', function() { setup(function(done) { utils.setupApplication() - .next(function(result) { + .then(function(result) { backend = result.backend; server = result.server; connection = result.connection; @@ -29,7 +28,7 @@ suite('adapter/api/groonga: basic commands', function() { }); done(); }) - .error(function(error) { + .catch(function(error) { done(error); }); }); @@ -48,13 +47,11 @@ suite('adapter/api/groonga: basic commands', function() { var body = [ ] utils.get('/d/table_create?name=Users', JSON.stringify(body)) - .next(function(response) { + .then(function(response) { assert.deepEqual(response.statusCode, 200); done(); }) - .error(function(error) { - done(error); - }); + .catch(done); }); test('.json', function(done) { @@ -62,13 +59,11 @@ suite('adapter/api/groonga: basic commands', function() { var body = [ ] utils.get('/d/table_create.json?name=Users', JSON.stringify(body)) - .next(function(response) { + .then(function(response) { assert.deepEqual(response.statusCode, 200); done(); }) - .error(function(error) { - done(error); - }); + .catch(done); }); }); }); Modified: test/adapter/api/groonga/load.test.js (+33 -61) =================================================================== --- test/adapter/api/groonga/load.test.js 2014-10-17 15:31:35 +0900 (16517a4) +++ test/adapter/api/groonga/load.test.js 2014-10-17 15:34:55 +0900 (255df68) @@ -1,6 +1,5 @@ var assert = require('chai').assert; var nodemock = require('nodemock'); -var Deferred = require('jsdeferred').Deferred; var utils = require('../../../test-utils'); var groongaUtils = require('./utils'); @@ -19,7 +18,7 @@ suite('adapter/api/groonga: load', function() { setup(function(done) { utils.setupApplication() - .next(function(result) { + .then(function(result) { backend = result.backend; server = result.server; connection = result.connection; @@ -30,7 +29,8 @@ suite('adapter/api/groonga: load', function() { plugins: [groongaAPI] }); done(); - }); + }) + .catch(done); }); teardown(function() { @@ -48,13 +48,11 @@ suite('adapter/api/groonga: load', function() { var body = [ ] utils.post('/d/load?table=Users', JSON.stringify(body)) - .next(function(response) { + .then(function(response) { assert.deepEqual(response.statusCode, 200); done(); }) - .error(function(error) { - done(error); - }); + .catch(done); }); test('.json', function(done) { @@ -62,13 +60,11 @@ suite('adapter/api/groonga: load', function() { var body = [ ] utils.post('/d/load.json?table=Users', JSON.stringify(body)) - .next(function(response) { + .then(function(response) { assert.deepEqual(response.statusCode, 200); done(); }) - .error(function(error) { - done(error); - }); + .catch(done); }); }); @@ -78,13 +74,11 @@ suite('adapter/api/groonga: load', function() { var body = [ ] utils.post('/d/load?table=Users', JSON.stringify(body)) - .next(function(response) { + .then(function(response) { assert.deepEqual(response.statusCode, 200); done(); }) - .error(function(error) { - done(error); - }); + .catch(done); }); }); @@ -94,14 +88,12 @@ suite('adapter/api/groonga: load', function() { var body = [ ] utils.post('/d/load?table=Users', JSON.stringify(body)) - .next(function(response) { + .then(function(response) { var responseBody = groongaUtils.groongaResponseBody(response); assert.deepEqual(responseBody, [0]); done(); }) - .error(function(error) { - done(error); - }); + .catch(done); }); test('one', function(done) { @@ -112,14 +104,12 @@ suite('adapter/api/groonga: load', function() { } ] utils.post('/d/load?table=Users', JSON.stringify(body)) - .next(function(response) { + .then(function(response) { var responseBody = groongaUtils.groongaResponseBody(response); assert.deepEqual(responseBody, [1]); done(); }) - .error(function(error) { - done(error); - }); + .catch(done); }); test('multiple', function(done) { @@ -134,14 +124,12 @@ suite('adapter/api/groonga: load', function() { } ] utils.post('/d/load?table=Users', JSON.stringify(body)) - .next(function(response) { + .then(function(response) { var responseBody = groongaUtils.groongaResponseBody(response); assert.deepEqual(responseBody, [2]); done(); }) - .error(function(error) { - done(error); - }); + .catch(done); }); }); @@ -165,7 +153,7 @@ suite('adapter/api/groonga: load', function() { } return utils.post(path, JSON.stringify(body)) - .next(function(request) { + .then(function(request) { return requestBody; }); } @@ -179,7 +167,7 @@ suite('adapter/api/groonga: load', function() { } ] post(body) - .next(function(requestBody) { + .then(function(requestBody) { assert.deepEqual(requestBody, { table: 'Memos', @@ -190,9 +178,7 @@ suite('adapter/api/groonga: load', function() { }); done(); }) - .error(function(error) { - done(error); - }); + .catch(done); }); test('with columns', function(done) { @@ -204,7 +190,7 @@ suite('adapter/api/groonga: load', function() { } ] post(body) - .next(function(requestBody) { + .then(function(requestBody) { assert.deepEqual(requestBody, { table: 'Memos', @@ -216,9 +202,7 @@ suite('adapter/api/groonga: load', function() { }); done(); }) - .error(function(error) { - done(error); - }); + .catch(done); }); }); @@ -235,7 +219,7 @@ suite('adapter/api/groonga: load', function() { ] ] post(body) - .next(function(requestBody) { + .then(function(requestBody) { assert.deepEqual(requestBody, { table: 'Memos', @@ -246,9 +230,7 @@ suite('adapter/api/groonga: load', function() { }); done(); }) - .error(function(error) { - done(error); - }); + .catch(done); }); test('with columns', function(done) { @@ -265,7 +247,7 @@ suite('adapter/api/groonga: load', function() { ] ] post(body) - .next(function(requestBody) { + .then(function(requestBody) { assert.deepEqual(requestBody, { table: 'Memos', @@ -277,9 +259,7 @@ suite('adapter/api/groonga: load', function() { }); done(); }) - .error(function(error) { - done(error); - }); + .catch(done); }); test('with columns query parameter', function(done) { @@ -294,7 +274,7 @@ suite('adapter/api/groonga: load', function() { ] ] post(body, query) - .next(function(requestBody) { + .then(function(requestBody) { assert.deepEqual(requestBody, { table: 'Memos', @@ -306,9 +286,7 @@ suite('adapter/api/groonga: load', function() { }); done(); }) - .error(function(error) { - done(error); - }); + .catch(done); }); }); }); @@ -330,7 +308,7 @@ suite('adapter/api/groonga: load', function() { }; return utils.get(path) - .next(function(response) { + .then(function(response) { return requestBody; }); }; @@ -344,7 +322,7 @@ suite('adapter/api/groonga: load', function() { } ]; get(values) - .next(function(requestBody) { + .then(function(requestBody) { assert.deepEqual(requestBody, { table: 'Users', @@ -356,9 +334,7 @@ suite('adapter/api/groonga: load', function() { }); done(); }) - .error(function(error) { - done(error); - }); + .catch(done); }); test('array style', function(done) { @@ -375,7 +351,7 @@ suite('adapter/api/groonga: load', function() { ] ]; get(values) - .next(function(requestBody) { + .then(function(requestBody) { assert.deepEqual(requestBody, { table: 'Users', @@ -387,9 +363,7 @@ suite('adapter/api/groonga: load', function() { }); done(); }) - .error(function(error) { - done(error); - }); + .catch(done); }); }); }); @@ -402,7 +376,7 @@ suite('adapter/api/groonga: load', function() { } ]; utils.post('/d/load', JSON.stringify(body)) - .next(function(responseMessage) { + .then(function(responseMessage) { var actual = { httpStatusCode: responseMessage.statusCode, groongaStatusCode: groongaUtils.groongaResponseHeader(responseMessage)[0], @@ -418,9 +392,7 @@ suite('adapter/api/groonga: load', function() { }); done(); }) - .error(function(error) { - done(error); - }); + .catch(done); }); }); }); Modified: test/adapter/http.test.js (+15 -23) =================================================================== --- test/adapter/http.test.js 2014-10-17 15:31:35 +0900 (1bfd984) +++ test/adapter/http.test.js 2014-10-17 15:34:55 +0900 (ad80a6a) @@ -1,6 +1,5 @@ var assert = require('chai').assert; var nodemock = require('nodemock'); -var Deferred = require('jsdeferred').Deferred; var utils = require('../test-utils'); @@ -67,13 +66,14 @@ suite('HTTP Adapter', function() { setup(function(done) { utils.setupApplication() - .next(function(result) { + .then(function(result) { backend = result.backend; server = result.server; connection = result.connection; application = result.application; done(); - }); + }) + .catch(done); }); teardown(function() { @@ -104,7 +104,7 @@ suite('HTTP Adapter', function() { }); utils.get('/path/to/adapter') - .next(function(response) { + .then(function(response) { backend.assertReceived([{ type: 'adapter', body: 'adapter requested' }]); assert.deepEqual(response, @@ -112,9 +112,7 @@ suite('HTTP Adapter', function() { body: JSON.stringify('adapter OK') }); done(); }) - .error(function(error) { - done(error); - }); + .catch(done); }); test('under specified path', function(done) { @@ -139,7 +137,7 @@ suite('HTTP Adapter', function() { }); utils.get('/path/to/droonga/path/to/adapter') - .next(function(response) { + .then(function(response) { backend.assertReceived([{ type: 'adapter', body: 'adapter requested' }]); assert.deepEqual(response, @@ -147,9 +145,7 @@ suite('HTTP Adapter', function() { body: JSON.stringify('adapter OK') }); done(); }) - .error(function(error) { - done(error); - }); + .catch(done); }); }); @@ -178,12 +174,12 @@ suite('HTTP Adapter', function() { ] }); utils.setupServer(application) - .next(function(newServer) { + .then(function(newServer) { server = newServer; utils.get('/tables/Store?query=NY'); }) - .wait(0.1) - .next(function() { + .then(utils.waitCb(0.1)) + .then(function() { assert.equal(1, connection.emitMessageCalledArguments.length); var args = connection.emitMessageCalledArguments[0]; assert.equal(args.type, 'search'); @@ -206,9 +202,7 @@ suite('HTTP Adapter', function() { done(); }) - .error(function(error) { - done(error); - }); + .catch(done); }); test('droonga', function(done) { @@ -230,12 +224,12 @@ suite('HTTP Adapter', function() { condition: { query: '検索', matchTo: ['body'] } }; utils.setupServer(application) - .next(function(newServer) { + .then(function(newServer) { server = newServer; utils.post('/droonga/search', JSON.stringify({ queries: searchQueries })); }) - .wait(0.1) - .next(function() { + .then(utils.waitCb(0.1)) + .then(function() { assert.equal(1, connection.emitMessageCalledArguments.length); var args = connection.emitMessageCalledArguments[0]; assert.equal(args.type, 'search'); @@ -249,9 +243,7 @@ suite('HTTP Adapter', function() { done(); }) - .error(function(error) { - done(error); - }); + .catch(done); }); }); }); Modified: test/adapter/socket.io.test.js (+69 -82) =================================================================== --- test/adapter/socket.io.test.js 2014-10-17 15:31:35 +0900 (77778a8) +++ test/adapter/socket.io.test.js 2014-10-17 15:34:55 +0900 (818c88e) @@ -1,6 +1,5 @@ var assert = require('chai').assert; var nodemock = require('nodemock'); -var Deferred = require('jsdeferred').Deferred; var express = require('express'); var utils = require('../test-utils'); @@ -108,7 +107,7 @@ suite('Socket.IO Adapter', function() { var application = express(); utils.setupServer(application) - .next(function(newServer) { + .then(function(newServer) { server = newServer; connection = utils.createStubbedBackendConnection(); var registeredCommands = socketIoAdapter.register(application, server, { @@ -144,9 +143,7 @@ suite('Socket.IO Adapter', function() { definition: overridingPlugin.deleteCommand }]); done(); }) - .error(function(error) { - done(error); - }); + .catch(done); }); test('initialization', function(done) { @@ -159,7 +156,7 @@ suite('Socket.IO Adapter', function() { }); utils.setupServer(application) - .next(function(newServer) { + .then(function(newServer) { server = newServer; connection = utils.createStubbedBackendConnection(); socketIoAdapter.register(application, server, { @@ -175,17 +172,15 @@ suite('Socket.IO Adapter', function() { return utils.createClient(); }) - .next(function(newClient) { + .then(function(newClient) { clientSockets.push(newClient.socket); }) - .wait(0.01) - .next(function() { + .then(utils.waitCb(0.01)) + .then(function() { mockedListener.assertThrows(); done(); }) - .error(function(error) { - done(error); - }); + .catch(done); }); }); @@ -193,7 +188,7 @@ suite('Socket.IO Adapter', function() { test(description, function(done) { var mockedReceiver; utils.setupApplication() - .next(function(result) { + .then(function(result) { server = result.server; connection = result.connection; backend = result.backend; @@ -209,13 +204,13 @@ suite('Socket.IO Adapter', function() { ] }); }) - .createClient() - .next(function(newClient) { + .then(utils.createClientCb()) + .then(function(newClient) { clientSockets.push(newClient.socket); clientSockets[0].emit(params.clientCommand, params.clientBody); }) - .wait(0.01) - .next(function() { + .then(utils.waitCb(0.01)) + .then(function() { backend.assertReceived([{ type: params.expectedClientCommand, body: params.expectedClientBody }]); @@ -230,14 +225,12 @@ suite('Socket.IO Adapter', function() { params.backendCommand, params.backendBody); }) - .wait(0.01) - .next(function() { + .then(utils.waitCb(0.01)) + .then(function() { mockedReceiver.assertThrows(); done(); }) - .error(function(error) { - done(error); - }); + .catch(done); }); } @@ -289,7 +282,7 @@ suite('Socket.IO Adapter', function() { ]; var clientReceiver; utils.setupApplication() - .next(function(result) { + .then(function(result) { server = result.server; connection = result.connection; backend = result.backend; @@ -305,21 +298,21 @@ suite('Socket.IO Adapter', function() { ] }); }) - .createClients(3) - .next(function(newClients) { + .then(utils.createClientsCb(3)) + .then(function(newClients) { clientSockets = clientSockets.concat(newClients.map(function(client) { return client.socket; })); clientSockets[0].emit('reqrep', messages[0]); - }).wait(0.01).next(function() { + }).then(utils.waitCb(0.01)).then(function() { clientSockets[1].emit('reqrep', messages[1]); - }).wait(0.01).next(function() { + }).then(utils.waitCb(0.01)).then(function() { clientSockets[2].emit('reqrep', messages[2]); - }).wait(0.01).next(function() { + }).then(utils.waitCb(0.01)).then(function() { clientSockets[0].emit('reqrep', messages[3]); - }).wait(0.01).next(function() { + }).then(utils.waitCb(0.01)).then(function() { clientSockets[1].emit('reqrep', messages[4]); - }).wait(0.01).next(function() { + }).then(utils.waitCb(0.01)).then(function() { clientSockets[2].emit('reqrep', messages[5]); - }).wait(0.01).next(function() { + }).then(utils.waitCb(0.01)).then(function() { assert.deepEqual(backend.getBodies(), messages); var responses = backend.getMessages().map(function(envelope) { @@ -343,33 +336,31 @@ suite('Socket.IO Adapter', function() { clientReceiver.receive('2:' + data); }); - return utils - .sendPacketTo(utils.createPacket(responses[0]), utils.testReceivePort) - .wait(0.01) - .sendPacketTo(utils.createPacket(responses[1]), utils.testReceivePort) - .wait(0.01) - .sendPacketTo(utils.createPacket(responses[2]), utils.testReceivePort) - .wait(0.01) - .sendPacketTo(utils.createPacket(responses[3]), utils.testReceivePort) - .wait(0.01) - .sendPacketTo(utils.createPacket(responses[4]), utils.testReceivePort) - .wait(0.01) - .sendPacketTo(utils.createPacket(responses[5]), utils.testReceivePort); + return utils.wait(0) + .then(utils.sendPacketToCb(utils.createPacket(responses[0]), utils.testReceivePort)) + .then(utils.waitCb(0.01)) + .then(utils.sendPacketToCb(utils.createPacket(responses[1]), utils.testReceivePort)) + .then(utils.waitCb(0.01)) + .then(utils.sendPacketToCb(utils.createPacket(responses[2]), utils.testReceivePort)) + .then(utils.waitCb(0.01)) + .then(utils.sendPacketToCb(utils.createPacket(responses[3]), utils.testReceivePort)) + .then(utils.waitCb(0.01)) + .then(utils.sendPacketToCb(utils.createPacket(responses[4]), utils.testReceivePort)) + .then(utils.waitCb(0.01)) + .then(utils.sendPacketToCb(utils.createPacket(responses[5]), utils.testReceivePort)); }) - .wait(0.01) - .next(function() { + .then(utils.waitCb(0.01)) + .then(function() { clientReceiver.assertThrows(); done(); }) - .error(function(error) { - done(error); - }); + .catch(done); }); test('event with options', function(done) { var clientReceiver; utils.setupApplication() - .next(function(result) { + .then(function(result) { server = result.server; connection = result.connection; backend = result.backend; @@ -385,14 +376,14 @@ suite('Socket.IO Adapter', function() { ] }); }) - .createClients(1) - .next(function(newClients) { + .then(utils.createClientsCb(1)) + .then(function(newClients) { clientSockets = clientSockets.concat(newClients.map(function(client) { return client.socket; })); clientSockets[0].emit('reqrep', 'message1', { responseEvent: 'reqrep.extra.name' }); clientSockets[0].emit('reqrep-mod-event', 'message2', { responseEvent: 'reqrep-mod-event.extra.name' }); - }).wait(0.01).next(function() { + }).then(utils.waitCb(0.01)).then(function() { assert.deepEqual(backend.getBodies(), ['message1', 'message2']); var responses = backend.getMessages().map(function(envelope) { @@ -409,21 +400,19 @@ suite('Socket.IO Adapter', function() { clientReceiver.receive(data); }); - return utils - .sendPacketTo(utils.createPacket(responses[0]), utils.testReceivePort) - .next(function() { + return utils.wait(0) + .then(utils.sendPacketToCb(utils.createPacket(responses[0]), utils.testReceivePort)) + .then(function() { return utils .sendPacketTo(utils.createPacket(responses[1]), utils.testReceivePort) }); }) - .wait(0.01) - .next(function() { + .then(utils.waitCb(0.01)) + .then(function() { clientReceiver.assertThrows(); done(); }) - .error(function(error) { - done(error); - }); + .catch(done); }); }); @@ -469,7 +458,7 @@ suite('Socket.IO Adapter', function() { var subscriberId; // step 0: setup utils.setupApplication() - .next(function(result) { + .then(function(result) { server = result.server; connection = result.connection; backend = result.backend; @@ -485,8 +474,8 @@ suite('Socket.IO Adapter', function() { ] }); }) - .createClient() - .next(function(newClient) { + .then(utils.createClientCb()) + .then(function(newClient) { clientSockets.push(newClient.socket); subscriberId = newClient.subscriber; clientSockets[0].on('pubsub.subscribe.response', function(data) { @@ -506,16 +495,16 @@ suite('Socket.IO Adapter', function() { 'never published', { to: subscriberId }); }) - .wait(0.01) - .next(function() { + .then(utils.waitCb(0.01)) + .then(function() { mockedReceiver.receive('nothing'); mockedReceiver.assertThrows(); // step 2: subscribe clientSockets[0].emit('pubsub.subscribe', 'subscribe!'); }) - .wait(0.01) - .next(function() { + .then(utils.waitCb(0.01)) + .then(function() { backend.assertReceived([{ type: 'pubsub.subscribe', body: 'subscribe!' }]); @@ -526,8 +515,8 @@ suite('Socket.IO Adapter', function() { 'pubsub.subscribe.response', 'subscribed!'); }) - .wait(0.01) - .next(function() { + .then(utils.waitCb(0.01)) + .then(function() { mockedReceiver.assertThrows(); // step 3: published messages while subscribing @@ -539,26 +528,26 @@ suite('Socket.IO Adapter', function() { 'published 1', { to: subscriberId }); }) - .next(function() { + .then(function() { return backend.sendMessage('pubsub.publish', 'published 2', { to: subscriberId }); }) - .next(function() { + .then(function() { return backend.sendMessage('pubsub.publish', 'published 3', { to: subscriberId }); }) - .wait(0.01) - .next(function() { + .then(utils.waitCb(0.01)) + .then(function() { mockedReceiver.assertThrows(); // step 4: unsubscribe backend.clearMessages(); clientSockets[0].emit('pubsub.unsubscribe', 'unsubscribe!'); }) - .wait(0.01) - .next(function() { + .then(utils.waitCb(0.01)) + .then(function() { backend.assertReceived([{ type: 'pubsub.unsubscribe', body: 'unsubscribe!' }]); @@ -569,8 +558,8 @@ suite('Socket.IO Adapter', function() { 'pubsub.unsubscribe.response', 'unsubscribed!'); }) - .wait(0.01) - .next(function() { + .then(utils.waitCb(0.01)) + .then(function() { mockedReceiver.assertThrows(); // step 5: published message after unsubscribing @@ -579,16 +568,14 @@ suite('Socket.IO Adapter', function() { return backend.sendMessage('pubsub.publish', 'never published'); }) - .wait(0.01) - .next(function() { + .then(utils.waitCb(0.01)) + .then(function() { mockedReceiver.receive('nothing'); mockedReceiver.assertThrows(); done(); }) - .error(function(error) { - done(error); - }); + .catch(done); }); }); }); Modified: test/droonga-protocol/connection.test.js (+81 -125) =================================================================== --- test/droonga-protocol/connection.test.js 2014-10-17 15:31:35 +0900 (d016d2e) +++ test/droonga-protocol/connection.test.js 2014-10-17 15:34:55 +0900 (8581865) @@ -1,6 +1,5 @@ var assert = require('chai').assert; var nodemock = require('nodemock'); -var Deferred = require('jsdeferred').Deferred; var utils = require('../test-utils'); var TypeOf = utils.TypeOf; @@ -40,17 +39,14 @@ suite('Connection', function() { undefined, 'should be not-initialized'); - Deferred - .wait(0.01) - .next(function() { + utils.wait(0.01) + .then(function() { assert.notEqual(connection.receivePort, undefined, 'should be initialized'); done(); }) - .error(function(error) { - done(error); - }); + .catch(done); }); }); @@ -60,7 +56,7 @@ suite('Connection', function() { function setupEnvironment(done) { utils.createBackend() - .next(function(newBackend) { + .then(function(newBackend) { backend = newBackend; connection = new Connection({ tag: 'test', @@ -72,7 +68,8 @@ suite('Connection', function() { retryDelay: 1 }); done(); - }); + }) + .catch(done); } function teardownEnvironment() { @@ -135,9 +132,8 @@ suite('Connection', function() { 'another', { dataset: 'another' })); - Deferred - .wait(0.01) - .next(function() { + utils.wait(0.01) + .then(function() { assert.deepEqual(getBackendReceivedMessages(), [objectMessage, stringMessage, @@ -145,9 +141,7 @@ suite('Connection', function() { messageForAnotherDataset]); done(); }) - .error(function(error) { - done(error); - }); + .catch(done) }); test('from front to back, with callback', function(done) { @@ -181,9 +175,8 @@ suite('Connection', function() { { dataset: 'another', requireReply: true })); - Deferred - .wait(0.01) - .next(function() { + utils.wait(0.01) + .then(function() { assert.deepEqual(getBackendReceivedMessages(), [objectMessage, stringMessage, @@ -191,9 +184,7 @@ suite('Connection', function() { messageForAnotherDataset]); done(); }) - .error(function(error) { - done(error); - }); + .catch(done); }); test('from back to front', function(done) { @@ -211,18 +202,16 @@ suite('Connection', function() { .takes(numericMessage) .takes(objectMessage); - utils - .sendPacketTo(utils.createPacket(stringMessage), utils.testReceivePort) - .sendPacketTo(utils.createPacket(numericMessage), utils.testReceivePort) - .sendPacketTo(utils.createPacket(objectMessage), utils.testReceivePort) - .sendPacketTo(utils.createPacket({}, 'unknown, ignored'), utils.testReceivePort) - .next(function() { + utils.wait(0) + .then(utils.sendPacketToCb(utils.createPacket(stringMessage), utils.testReceivePort)) + .then(utils.sendPacketToCb(utils.createPacket(numericMessage), utils.testReceivePort)) + .then(utils.sendPacketToCb(utils.createPacket(objectMessage), utils.testReceivePort)) + .then(utils.sendPacketToCb(utils.createPacket({}, 'unknown, ignored'), utils.testReceivePort)) + .then(function() { callback.assert(); done(); }) - .error(function(error) { - done(error); - }); + .catch(done); }); }); @@ -247,9 +236,8 @@ suite('Connection', function() { callback .takes(null, responses[0]) .takes(null, responses[1]); - Deferred - .wait(0.01) - .next(function() { + utils.wait(0.01) + .then(function() { assert.deepEqual(getBackendReceivedMessages(), messages); assert.deepEqual( [connection.listeners('reply:' + messages[0].id).length, @@ -258,10 +246,10 @@ suite('Connection', function() { 'response listeners should be registered' ); }) - .sendPacketTo(utils.createPacket(responses[0]), utils.testReceivePort) - .sendPacketTo(utils.createPacket(responses[1]), utils.testReceivePort) - .wait(0.01) - .next(function() { + .then(utils.sendPacketToCb(utils.createPacket(responses[0]), utils.testReceivePort)) + .then(utils.sendPacketToCb(utils.createPacket(responses[1]), utils.testReceivePort)) + .then(utils.waitCb(0.01)) + .then(function() { callback.assert(); assert.deepEqual( [connection.listeners('reply:' + messages[0].id).length, @@ -271,9 +259,7 @@ suite('Connection', function() { ); done(); }) - .error(function(error) { - done(error); - }); + .catch(done); }); test('error', function(done) { @@ -296,9 +282,8 @@ suite('Connection', function() { callback .takes(responses[0].statusCode, responses[0]) .takes(responses[1].statusCode, responses[1]); - Deferred - .wait(0.01) - .next(function() { + utils.wait(0.01) + .then(function() { assert.deepEqual(getBackendReceivedMessages(), messages); assert.deepEqual( [connection.listeners('reply:' + messages[0].id).length, @@ -307,10 +292,10 @@ suite('Connection', function() { 'response listeners should be registered' ); }) - .sendPacketTo(utils.createPacket(responses[0]), utils.testReceivePort) - .sendPacketTo(utils.createPacket(responses[1]), utils.testReceivePort) - .wait(0.01) - .next(function() { + .then(utils.sendPacketToCb(utils.createPacket(responses[0]), utils.testReceivePort)) + .then(utils.sendPacketToCb(utils.createPacket(responses[1]), utils.testReceivePort)) + .then(utils.waitCb(0.01)) + .then(function() { callback.assert(); assert.deepEqual( [connection.listeners('reply:' + messages[0].id).length, @@ -320,9 +305,7 @@ suite('Connection', function() { ); done(); }) - .error(function(error) { - done(error); - }); + .catch(done); }); test('duplicated', function(done) { @@ -345,9 +328,8 @@ suite('Connection', function() { callback .takes(null, responses[0]) .takes(responses[1].statusCode, responses[1]); - Deferred - .wait(0.01) - .next(function() { + utils.wait(0.01) + .then(function() { assert.deepEqual(getBackendReceivedMessages(), messages); assert.deepEqual( [connection.listeners('reply:' + messages[0].id).length, @@ -356,12 +338,12 @@ suite('Connection', function() { 'response listeners should be registered' ); }) - .sendPacketTo(utils.createPacket(responses[0]), utils.testReceivePort) - .sendPacketTo(utils.createPacket(responses[1]), utils.testReceivePort) - .sendPacketTo(utils.createPacket(responses[2]), utils.testReceivePort) - .sendPacketTo(utils.createPacket(responses[3]), utils.testReceivePort) - .wait(0.01) - .next(function() { + .then(utils.sendPacketToCb(utils.createPacket(responses[0]), utils.testReceivePort)) + .then(utils.sendPacketToCb(utils.createPacket(responses[1]), utils.testReceivePort)) + .then(utils.sendPacketToCb(utils.createPacket(responses[2]), utils.testReceivePort)) + .then(utils.sendPacketToCb(utils.createPacket(responses[3]), utils.testReceivePort)) + .then(utils.waitCb(0.01)) + .then(function() { callback.assert(); assert.deepEqual( [connection.listeners('reply:' + messages[0].id).length, @@ -371,9 +353,7 @@ suite('Connection', function() { ); done(); }) - .error(function(error) { - done(error); - }); + .catch(done); }); test('timeout', function(done) { @@ -406,9 +386,8 @@ suite('Connection', function() { callback .takes(Connection.ERROR_GATEWAY_TIMEOUT, null) .takes(null, responses.notTimedOut) - Deferred - .wait(0.01) - .next(function() { + utils.wait(0.01) + .then(function() { assert.deepEqual(getBackendReceivedMessages(), [messages.notTimedOut, messages.timedOut, @@ -424,11 +403,11 @@ suite('Connection', function() { 'response listeners should be registered' ); }) - .wait(0.02) - .sendPacketTo(utils.createPacket(responses.notTimedOut), utils.testReceivePort) - .sendPacketTo(utils.createPacket(responses.timedOut), utils.testReceivePort) - .wait(0.01) - .next(function() { + .then(utils.waitCb(0.02)) + .then(utils.sendPacketToCb(utils.createPacket(responses.notTimedOut), utils.testReceivePort)) + .then(utils.sendPacketToCb(utils.createPacket(responses.timedOut), utils.testReceivePort)) + .then(utils.waitCb(0.01)) + .then(function() { callback.assert(); assert.deepEqual( { notTimedOut: @@ -442,9 +421,7 @@ suite('Connection', function() { ); done(); }) - .error(function(error) { - done(error); - }); + .catch(done); }); }); }); @@ -457,7 +434,7 @@ suite('Connection', function() { setup(function(done) { restartedBackend = undefined; utils.createBackend() - .next(function(newBackend) { + .then(function(newBackend) { backend = newBackend; connection = new Connection({ tag: utils.testTag, @@ -467,7 +444,8 @@ suite('Connection', function() { retryDelay: 1 }); done(); - }); + }) + .catch(done); }); teardown(function() { @@ -486,60 +464,44 @@ suite('Connection', function() { }); test('normal messaging', function(done) { - var deferred = new Deferred(); - connection.emitMessage('type', { message: true }); - backend.once('receive', function() { - deferred.call(); - }); - deferred - .next(function() { + function trigger() { + connection.emitMessage('type', { message: true }); + } + backend.thennableOnce('receive') + .then(function() { assert.deepEqual(backend.getEvents(), ['type']); done(); }) - .error(function(error) { - done(error); - }); + .catch(done); + + trigger(); }); test('disconnected suddenly', function(done) { + function trigger() { + connection.emitMessage('type1', { message: true }); + } + var lastError = null; - Deferred - .next(function() { - var deferred = new Deferred(); - connection.emitMessage('type1', { message: true }); - backend.once('receive', function() { - deferred.call(); - }); - return deferred; - }) - .next(function() { + backend.thennableOnce('receive') + .then(function() { assert.deepEqual(backend.getEvents(), ['type1']); - var deferred = new Deferred(); - backend.close(function() { - deferred.call(); - }); - return deferred; + return backend.thennableClose(); }) - .next(function() { - var deferred = new Deferred(); - - var callback = function(errorCode, response) { - lastError = response.body.detail; - deferred.call(); - }; - - connection.emitMessage('type2', { message: true }, callback); - - return deferred; + .then(function() { + return connection.thennableEmitMessage('type2', { message: true }) + .then(function(args) { + lastError = args.response.body.detail; + }); }) - .next(function() { + .then(function() { assert.isNotNull(lastError); assert.equal(lastError.code, 'ECONNREFUSED'); }) - .createBackend() - .next(function(newBackend) { + .then(utils.createBackendCb()) + .then(function(newBackend) { restartedBackend = newBackend; assert.deepEqual(backend.getEvents(), ['type1']); @@ -548,24 +510,18 @@ suite('Connection', function() { connection.emitMessage('type3', { message: true }); - var deferred = new Deferred(); - restartedBackend.once('receive', function() { - restartedBackend.once('receive', function() { - deferred.call(); - }); - }); - return deferred; + return utils.wait(0.1); }) - .next(function() { + .then(function() { assert.deepEqual(backend.getEvents(), ['type1']); assert.deepEqual(restartedBackend.getEvents(), ['type2', 'type3']); done(); }) - .error(function(error) { - done(error); - }); + .catch(done); + + trigger(); }); }); }); Modified: test/droonga-protocol/receiver.test.js (+13 -23) =================================================================== --- test/droonga-protocol/receiver.test.js 2014-10-17 15:31:35 +0900 (000ebd7) +++ test/droonga-protocol/receiver.test.js 2014-10-17 15:34:55 +0900 (fae888b) @@ -1,6 +1,5 @@ var assert = require('chai').assert; var nodemock = require('nodemock'); -var Deferred = require('jsdeferred').Deferred; var utils = require('../test-utils'); @@ -30,21 +29,18 @@ suite('FluentReceiver', function() { mockedReceiver.start(); }); - Deferred - .wait(0.01) - .next(function() { + utils.wait(0.01) + .then(function() { assert.notEqual(receiver.port, undefined); var rawPacket = ['droonga.message', Date.now(), { message: true }]; return utils.sendPacketTo(rawPacket, receiver.port); }) - .next(function() { + .then(function() { mockedReceiver.assertThrows(); done(); }) - .error(function(error) { - done(error); - }); + .catch(done); }); test('receiving packed message (Forward type)', function(done) { @@ -63,22 +59,19 @@ suite('FluentReceiver', function() { mockedReceiver.start(); }); - Deferred - .wait(0.01) - .next(function() { + utils.wait(0.01) + .then(function() { assert.notEqual(receiver.port, undefined); var rawPacket = ['droonga.message', [[Date.now(), { message1: true }], [Date.now(), { message2: true }]]]; return utils.sendPacketTo(rawPacket, receiver.port); }) - .next(function() { + .then(function() { mockedReceiver.assertThrows(); done(); }) - .error(function(error) { - done(error); - }); + .catch(done); }); test('re-connecting', function(done) { @@ -97,25 +90,22 @@ suite('FluentReceiver', function() { mockedReceiver.start(); }); - Deferred - .wait(0.01) - .next(function() { + utils.wait(0.01) + .then(function() { assert.notEqual(receiver.port, undefined); var rawPacket = ['droonga.message', Date.now(), { message1: true }]; return utils.sendPacketTo(rawPacket, receiver.port); }) - .next(function() { + .then(function() { var rawPacket = ['droonga.message', Date.now(), { message2: true }]; return utils.sendPacketTo(rawPacket, receiver.port); }) - .next(function() { + .then(function() { mockedReceiver.assertThrows(); done(); }) - .error(function(error) { - done(error); - }); + .catch(done); }); }); Modified: test/express-adapter.test.js (+18 -30) =================================================================== --- test/express-adapter.test.js 2014-10-17 15:31:35 +0900 (d3df592) +++ test/express-adapter.test.js 2014-10-17 15:34:55 +0900 (08cb508) @@ -1,6 +1,5 @@ var assert = require('chai').assert; var nodemock = require('nodemock'); -var Deferred = require('jsdeferred').Deferred; var express = require('express'); var utils = require('./test-utils'); @@ -39,16 +38,14 @@ suite('Adaption for express application', function() { setup(function(done) { utils.setupApplication() - .next(function(result) { + .then(function(result) { backend = result.backend; server = result.server; connection = result.connection; application = result.application; done(); }) - .error(function(error) { - done(error); - }); + .catch(done); }); teardown(function() { @@ -73,15 +70,13 @@ suite('Adaption for express application', function() { }); utils.get('/path/to/api') - .next(function(response) { + .then(function(response) { assert.deepEqual(response, { statusCode: 200, body: JSON.stringify('api OK') }); done(); }) - .error(function(error) { - done(error); - }); + .catch(done); }); test('under specified path', function(done) { @@ -93,13 +88,12 @@ suite('Adaption for express application', function() { var responseBody; utils.get('/path/to/droonga/path/to/api') - .next(function(response) { + .then(function(response) { responseBody = response.body; }); - Deferred - .wait(0.01) - .next(function() { + utils.wait(0.01) + .then(function() { backend.assertReceived([{ type: 'api', body: 'api requested' }]); @@ -107,14 +101,12 @@ suite('Adaption for express application', function() { 'api.result', 'api OK?'); }) - .wait(0.01) - .next(function() { + .then(utils.waitCb(0.01)) + .then(function() { assert.equal(responseBody, JSON.stringify('api OK')); done(); }) - .error(function(error) { - done(error); - }); + .catch(done); }); }); @@ -127,16 +119,14 @@ suite('Adaption for express application', function() { setup(function(done) { utils.setupApplication() - .next(function(result) { + .then(function(result) { backend = result.backend; server = result.server; connection = result.connection; application = result.application; done(); }) - .error(function(error) { - done(error); - }); + .catch(done); }); teardown(function() { @@ -158,12 +148,12 @@ suite('Adaption for express application', function() { var mockedReceiver; utils.createClient() - .next(function(newClient) { + .then(function(newClient) { clientSocket = newClient.socket; clientSocket.emit('api', 'request'); }) - .wait(0.01) - .next(function() { + .then(utils.waitCb(0.01)) + .then(function() { backend.assertReceived([{ type: 'api', body: 'api requested' }]); @@ -178,14 +168,12 @@ suite('Adaption for express application', function() { 'api.response', 'api OK?'); }) - .wait(0.01) - .next(function() { + .then(utils.waitCb(0.01)) + .then(function() { mockedReceiver.assertThrows(); done(); }) - .error(function(error) { - done(error); - }); + .catch(done); }); }); }); Modified: test/test-utils.js (+157 -148) =================================================================== --- test/test-utils.js 2014-10-17 15:31:35 +0900 (1183f88) +++ test/test-utils.js 2014-10-17 15:34:55 +0900 (e17acbc) @@ -3,7 +3,7 @@ var nodemock = require('nodemock'); var net = require('net'); var msgpack = require('msgpack'); var http = require('http'); -var Deferred = require('jsdeferred').Deferred; +var Q = require('q'); var socketIoClient = require('socket.io-client'); var express = require('express'); var url = require('url'); @@ -21,36 +21,53 @@ var testReceivePort = exports.testReceivePort = 3334; var testServerPort = exports.testServerPort = 3335; var testTag = exports.testTag = 'test'; +function registerCallbackGenerator(name) { + exports[name + 'Cb'] = (function() { + var givenArgs = arguments; + return (function() { + return exports[name].apply(exports, givenArgs); + }); + }); +} -function connectTo(port) { - var deferred = new Deferred(); - var clientSocket = new net.Socket(); - clientSocket.on('error', function(error){ - clientSocket.destroy(); - deferred.fail(error); + +function wait(seconds) { + return Q.Promise(function(resolve, reject, notify) { + setTimeout(resolve, seconds * 1000); }); - clientSocket.connect(port, '127.0.0.1', function(){ - deferred.call(clientSocket); +} +exports.wait = wait; +registerCallbackGenerator('wait'); + +function connectTo(port) { + return Q.Promise(function(resolve, reject, notify) { + var clientSocket = new net.Socket(); + clientSocket.on('error', function(error){ + clientSocket.destroy(); + reject(error); + }); + clientSocket.connect(port, '127.0.0.1', function(){ + resolve(clientSocket); + }); }); - return deferred; } exports.connectTo = connectTo; -Deferred.register('connectTo', connectTo); +registerCallbackGenerator('connectTo'); function sendPacketTo(packet, port) { var clientSocket; return connectTo(port) - .next(function(newSocket) { + .then(function(newSocket) { clientSocket = newSocket; var packedPacket = msgpack.pack(packet); clientSocket.write(new Buffer(packedPacket)); }) - .wait(0.01) - .next(function() { + .then(exports.waitCb(0.01)) + .then(function() { clientSocket.destroy(); clientSocket = undefined; }) - .error(function(error) { + .catch(function(error) { if (clientSocket) { clientSocket.destroy(); clientSocket = undefined; @@ -59,24 +76,24 @@ function sendPacketTo(packet, port) { }); } exports.sendPacketTo = sendPacketTo; -Deferred.register('sendPacketTo', sendPacketTo); +registerCallbackGenerator('sendPacketTo'); function setupServer(handlerOrServer) { - var deferred = new Deferred(); - var server; - if ('close' in handlerOrServer) { // it is a server - server = handlerOrServer; - } else { // it is a handler - server = http.createServer(handlerOrServer); - } - server.listen(testServerPort, function() { - deferred.call(server); + return Q.Promise(function(resolve, reject, notify) { + var server; + if ('close' in handlerOrServer) { // it is a server + server = handlerOrServer; + } else { // it is a handler + server = http.createServer(handlerOrServer); + } + server.listen(testServerPort, function() { + resolve(server); + }); }); - return deferred; } exports.setupServer = setupServer; -Deferred.register('setupServer', setupServer); +registerCallbackGenerator('setupServer'); function normalizePath(path) { if (typeof path != 'string') { @@ -86,101 +103,95 @@ function normalizePath(path) { } function sendRequest(method, path, postData, headers) { - var deferred = new Deferred(); - - path = normalizePath(path); - var options = { - host: '127.0.0.1', - port: testServerPort, - path: path, - method: method, - headers: {} - }; - - if (headers) { - for (var header in headers) { - if (headers.hasOwnProperty(header)) - options.headers[header] = headers[header]; + return Q.Promise(function(resolve, reject, notify) { + path = normalizePath(path); + var options = { + host: '127.0.0.1', + port: testServerPort, + path: path, + method: method, + headers: {} + }; + + if (headers) { + for (var header in headers) { + if (headers.hasOwnProperty(header)) + options.headers[header] = headers[header]; + } } - } - Deferred.next(function() { var request = http.request(options, function(response) { var body = ''; response.on('data', function(data) { body += data; }); response.on('end', function() { - deferred.call({ + resolve({ statusCode: response.statusCode, body: body }); }); }); request.on('error', function(error) { - deferred.fail(error); + reject(error); }); if (postData) request.write(postData); request.end(); }); - - return deferred; } function get(path, headers) { return sendRequest('GET', path, null, headers); } exports.get = get; -Deferred.register('get', function() { return get.apply(this, arguments); }); +registerCallbackGenerator('get'); function post(path, body, headers) { return sendRequest('POST', path, body, headers); } exports.post = post; -Deferred.register('post', function() { return post.apply(this, arguments); }); +registerCallbackGenerator('post'); function createClient() { - var deferred = new Deferred(); - var endpoint = 'http://127.0.0.1:' + testServerPort; - var options = { - 'transports': ['websocket', 'polling'], - 'force new connection': true - }; - var socket = socketIoClient(endpoint, options); - var newClientSocket; -// socket.on('connect', function() { -// deferred.call(socket); -// }); - socket.on('connected', function(client) { - client.socket = socket; - deferred.call(client); - }); - socket.on('error', function(error) { - deferred.fail(new Error(JSON.stringify(error))); + return Q.Promise(function(resolve, reject, notify) { + var endpoint = 'http://127.0.0.1:' + testServerPort; + var options = { + 'transports': ['websocket', 'polling'], + 'force new connection': true + }; + var socket = socketIoClient(endpoint, options); + var newClientSocket; +// socket.on('connect', function() { +// resolve(socket); +// }); + socket.on('connected', function(client) { + client.socket = socket; + resolve(client); + }); + socket.on('error', function(error) { + reject(new Error(JSON.stringify(error))); + }); }); - return deferred; } exports.createClient = createClient; -Deferred.register('createClient', createClient); +registerCallbackGenerator('createClient'); function createClients(count) { - var clients = []; - return Deferred.next(function loop() { - if (clients.length < count) { - return createClient() - .next(function(client) { - clients.push(client); - }) - .next(loop); - } else { - return clients; + return Q.Promise(function(resolve, reject, notify) { + var clients = []; + for (var i = 0; i < count; i++) { + createClient().then(function(client) { + clients.push(client); + if (clients.length == count) + resolve(clients); + }); } }); } exports.createClients = createClients; -Deferred.register('createClients', createClients); +registerCallbackGenerator('createClients'); function createStubbedBackendConnection() { return { @@ -211,11 +222,11 @@ function setupApplication() { var server; var backend; return setupServer(application) - .next(function(newServer) { + .then(function(newServer) { server = newServer; }) - .createBackend() - .next(function(newBackend) { + .then(exports.createBackendCb()) + .then(function(newBackend) { backend = newBackend; var connection = new Connection({ tag: testTag, @@ -235,7 +246,7 @@ function setupApplication() { }); } exports.setupApplication = setupApplication; -Deferred.register('setupApplication', setupApplication); +registerCallbackGenerator('setupApplication'); function teardownApplication(params) { params = params || {}; @@ -256,79 +267,77 @@ function teardownApplication(params) { } } exports.teardownApplication = teardownApplication; -Deferred.register('teardownApplication', teardownApplication); function createBackend() { - var deferred = new Deferred(); - var backend = new FluentReceiver(testSendPort); - - backend.clearMessages = function() { - this.received = []; - }; - - backend.clearMessages(); - backend.on('receive', function(data) { - logger.debug('test-utils.createBackend.receive %d', backend._id); - backend.received.push(data); - if (backend.reservedResponses.length > 0) { - var response = backend.reservedResponses.shift(); - if (typeof response == 'function') - response = response(data); - sendPacketTo(response, testReceivePort); - } - }); - - backend.reservedResponses = []; - backend.reserveResponse = function(response) { - backend.reservedResponses.push(response); - }; - - backend.assertReceived = function(expectedMessages) { - assert.deepEqual(this.getMessages().map(function(message) { - return { type: message.type, - body: message.body }; - }), - expectedMessages); - }; - - backend.getMessages = function() { - return this.received.map(function(packet) { - return packet[2]; - }); - }; - backend.getEvents = function() { - return this.getMessages().map(function(envelope) { - return envelope.type; - }); - }; - backend.getBodies = function() { - return this.getMessages().map(function(envelope) { - return envelope.body; + return Q.Promise(function(resolve, reject, notify) { + var backend = new FluentReceiver(testSendPort); + + backend.clearMessages = function() { + this.received = []; + }; + + backend.clearMessages(); + backend.on('receive', function(data) { + logger.debug('test-utils.createBackend.receive %d', backend._id); + backend.received.push(data); + if (backend.reservedResponses.length > 0) { + var response = backend.reservedResponses.shift(); + if (typeof response == 'function') + response = response(data); + sendPacketTo(response, testReceivePort); + } }); - }; - backend.sendMessage = function(type, body, options) { - var response = createEnvelope(type, body); - if (options && typeof options == 'object') { - Object.keys(options).forEach(function(key) { - response[key] = options[key]; + backend.reservedResponses = []; + backend.reserveResponse = function(response) { + backend.reservedResponses.push(response); + }; + + backend.assertReceived = function(expectedMessages) { + assert.deepEqual(this.getMessages().map(function(message) { + return { type: message.type, + body: message.body }; + }), + expectedMessages); + }; + + backend.getMessages = function() { + return this.received.map(function(packet) { + return packet[2]; }); - } - return sendPacketTo(createPacket(response), testReceivePort) - }; - backend.sendResponse = function(request, type, body) { - var response = createReplyEnvelope(request, type, body); - return sendPacketTo(createPacket(response), testReceivePort) - }; + }; + backend.getEvents = function() { + return this.getMessages().map(function(envelope) { + return envelope.type; + }); + }; + backend.getBodies = function() { + return this.getMessages().map(function(envelope) { + return envelope.body; + }); + }; - backend.listen(function() { - return deferred.call(backend); + backend.sendMessage = function(type, body, options) { + var response = createEnvelope(type, body); + if (options && typeof options == 'object') { + Object.keys(options).forEach(function(key) { + response[key] = options[key]; + }); + } + return sendPacketTo(createPacket(response), testReceivePort) + }; + backend.sendResponse = function(request, type, body) { + var response = createReplyEnvelope(request, type, body); + return sendPacketTo(createPacket(response), testReceivePort) + }; + + backend.listen(function() { + return resolve(backend); + }); }); - - return deferred; } exports.createBackend = createBackend; -Deferred.register('createBackend', createBackend); +registerCallbackGenerator('createBackend'); function createEnvelope(type, body, options) {