YUKI Hiroshi
null+****@clear*****
Wed Feb 13 17:26:21 JST 2013
YUKI Hiroshi 2013-02-13 17:26:21 +0900 (Wed, 13 Feb 2013) New Revision: 084e7fef13acb6be8f773030d1df1507384c0af8 https://github.com/groonga/express-kotoumi/commit/084e7fef13acb6be8f773030d1df1507384c0af8 Log: test: Test behavior of socket.io api with multiple clients around messages from the backend Modified files: test/backend-connection.test.js test/frontend-socket.io-adaptor.test.js test/test-utils.js Modified: test/backend-connection.test.js (+29 -76) =================================================================== --- test/backend-connection.test.js 2013-02-13 16:23:02 +0900 (7b04ba5) +++ test/backend-connection.test.js 2013-02-13 17:26:21 +0900 (2fcf758) @@ -7,20 +7,6 @@ var TypeOf = utils.TypeOf; var InstanceOf = utils.InstanceOf; var Connection = require('../lib/backend/connection').Connection; -var FluentReceiver = require('../lib/backend/receiver').FluentReceiver; - -function createBackend() { - var deferred = new Deferred(); - var backend = new FluentReceiver(utils.testSendPort); - backend.received = []; - backend.on('receive', function(data) { - backend.received.push(data); - }); - backend.listen(function() { - return deferred.call(backend); - }); - return deferred; -} suite('Connection, initialization', function() { var connection; @@ -72,7 +58,7 @@ suite('Connection, simple communication', function() { var backend; setup(function(done) { - createBackend() + utils.createBackend() .next(function(newBackend) { backend = newBackend; connection = new Connection({ @@ -98,37 +84,6 @@ suite('Connection, simple communication', function() { } }); - function createEnvelope(type, body) { - var now = new Date(); - var envelope = { - id: now.getTime(), - date: now.toISOString(), - replyTo: 'localhost:' + utils.testReceivePort, - statusCode: 200, - type: type, - body: body - }; - return envelope; - } - - function createExpectedEnvelope(type, body) { - var envelope = createEnvelope(type, body); - envelope.id = TypeOf('string'); - envelope.date = InstanceOf(Date); - return envelope; - } - - function createReplyEnvelopeFor(message, type, body) { - var response = createEnvelope(type, body); - response.inReplyTo = message.id; - return response; - } - - function createPacket(message, tag) { - tag = tag || 'test.message'; - return [tag, Date.now(), message]; - } - function createMockedMessageCallback() { var mockedCallback = nodemock; var callback = function() { @@ -149,16 +104,16 @@ suite('Connection, simple communication', function() { test('one way message from front to back', function(done) { var objectMessage = connection.emitMessage('object', { command: 'foobar' }); assert.envelopeEqual(objectMessage, - createExpectedEnvelope('object', + utils.createExpectedEnvelope('object', { command: 'foobar' })); var stringMessage = connection.emitMessage('string', 'string'); assert.envelopeEqual(stringMessage, - createExpectedEnvelope('string', 'string')); + utils.createExpectedEnvelope('string', 'string')); var numericMessage = connection.emitMessage('numeric', 1234); assert.envelopeEqual(numericMessage, - createExpectedEnvelope('numeric', 1234)); + utils.createExpectedEnvelope('numeric', 1234)); Deferred .wait(0.01) @@ -181,19 +136,19 @@ suite('Connection, simple communication', function() { var callback = createMockedMessageCallback(); connection.on('message', callback); - var stringMessage = createEnvelope('string', 'string'); - var numericMessage = createEnvelope('numeric', 1234); - var objectMessage = createEnvelope('object', { value: true }); + var stringMessage = utils.createEnvelope('string', 'string'); + var numericMessage = utils.createEnvelope('numeric', 1234); + var objectMessage = utils.createEnvelope('object', { value: true }); callback .takes(stringMessage) .takes(numericMessage) .takes(objectMessage); utils - .sendPacketTo(createPacket(stringMessage), utils.testReceivePort) - .sendPacketTo(createPacket(numericMessage), utils.testReceivePort) - .sendPacketTo(createPacket(objectMessage), utils.testReceivePort) - .sendPacketTo(createPacket({}, 'unknown, ignored'), utils.testReceivePort) + .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() { callback.assert(); done(); @@ -211,12 +166,12 @@ suite('Connection, simple communication', function() { connection.emitMessage('third request', Math.random(), callback) ]; var responses = [ - createReplyEnvelopeFor(messages[1], 'second response', Math.random()), - createReplyEnvelopeFor(messages[0], 'first response', Math.random()), - createReplyEnvelopeFor(messages[2], 'third response', Math.random()), - createReplyEnvelopeFor(messages[0], 'duplicated, ignored', 0), - createReplyEnvelopeFor(messages[1], 'duplicated, ignored', 0), - createReplyEnvelopeFor(messages[2], 'duplicated, ignored', 0) + utils.createReplyEnvelopeFor(messages[1], 'second response', Math.random()), + utils.createReplyEnvelopeFor(messages[0], 'first response', Math.random()), + utils.createReplyEnvelopeFor(messages[2], 'third response', Math.random()), + utils.createReplyEnvelopeFor(messages[0], 'duplicated, ignored', 0), + utils.createReplyEnvelopeFor(messages[1], 'duplicated, ignored', 0), + utils.createReplyEnvelopeFor(messages[2], 'duplicated, ignored', 0) ]; responses[2].statusCode = 503; // make it as an error response callback @@ -235,12 +190,12 @@ suite('Connection, simple communication', function() { 'response listeners should be registered' ); }) - .sendPacketTo(createPacket(responses[0]), utils.testReceivePort) - .sendPacketTo(createPacket(responses[1]), utils.testReceivePort) - .sendPacketTo(createPacket(responses[2]), utils.testReceivePort) - .sendPacketTo(createPacket(responses[3]), utils.testReceivePort) - .sendPacketTo(createPacket(responses[4]), utils.testReceivePort) - .sendPacketTo(createPacket(responses[5]), utils.testReceivePort) + .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) + .sendPacketTo(utils.createPacket(responses[4]), utils.testReceivePort) + .sendPacketTo(utils.createPacket(responses[5]), utils.testReceivePort) .wait(0.01) .next(function() { callback.assert(); @@ -281,9 +236,9 @@ suite('Connection, simple communication', function() { }; var responses = { notTimedOut: - createReplyEnvelopeFor(messages.notTimedOut, 'ok', Math.random()), + utils.createReplyEnvelopeFor(messages.notTimedOut, 'ok', Math.random()), timedOut: - createReplyEnvelopeFor(messages.timedOut, 'ignored', Math.random()) + utils.createReplyEnvelopeFor(messages.timedOut, 'ignored', Math.random()) }; callback .takes(Connection.ERROR_GATEWAY_TIMEOUT, null) @@ -304,8 +259,8 @@ suite('Connection, simple communication', function() { ); }) .wait(0.02) - .sendPacketTo(createPacket(responses.notTimedOut), utils.testReceivePort) - .sendPacketTo(createPacket(responses.timedOut), utils.testReceivePort) + .sendPacketTo(utils.createPacket(responses.notTimedOut), utils.testReceivePort) + .sendPacketTo(utils.createPacket(responses.timedOut), utils.testReceivePort) .wait(0.01) .next(function() { callback.assert(); @@ -332,7 +287,7 @@ suite('Connection, to backend', function() { var backend; setup(function(done) { - createBackend() + utils.createBackend() .next(function(newBackend) { backend = newBackend; connection = new Connection({ @@ -388,9 +343,7 @@ suite('Connection, to backend', function() { backend.close(); }) .wait(0.01) - .next(function() { - return createBackend(); - }) + .createBackend() .next(function(newBackend) { restartedBackend = newBackend; Modified: test/frontend-socket.io-adaptor.test.js (+93 -64) =================================================================== --- test/frontend-socket.io-adaptor.test.js 2013-02-13 16:23:02 +0900 (ed8aa88) +++ test/frontend-socket.io-adaptor.test.js 2013-02-13 17:26:21 +0900 (327e95b) @@ -14,6 +14,7 @@ suite('Socket.IO API', function() { var connection; var server; var clientSockets; + var backend; var testPlugin = { 'request-response': new model.SocketRequestResponse(), @@ -34,8 +35,16 @@ suite('Socket.IO API', function() { }); teardown(function() { + if (backend) { + backend.close(); + backend = undefined; + } if (connection) { - utils.readyToDestroyMockedConnection(connection, clientSockets.length); + if (typeof connection.close == 'function') { // real connection + connection.close(); + } else { // mocked connection + utils.readyToDestroyMockedConnection(connection, clientSockets.length); + } connection = undefined; } if (clientSockets.length) { @@ -99,19 +108,6 @@ suite('Socket.IO API', function() { }); }); - function createEnvelope(type, body) { - var now = new Date(); - var envelope = { - id: now.getTime(), - date: now.toISOString(), - replyTo: 'localhost:' + utils.testReceivePort, - statusCode: 200, - type: type, - body: body - }; - return envelope; - } - test('initialization', function(done) { var mockedListener = nodemock .mock('connected'); @@ -201,29 +197,40 @@ suite('Socket.IO API', function() { }); test('one way, back to front', function(done) { - connection = utils.createMockedBackendConnection(testPlugin, 3); - var messages = [ Math.random(), - Math.random(), - Math.random(), - Math.random(), - Math.random(), Math.random() ]; var clientReceiver = nodemock - .mock('receive').takes(0, messages[0]) - .mock('receive').takes(1, messages[1]) - .mock('receive').takes(2, messages[2]) - .mock('receive').takes(0, messages[3]) - .mock('receive').takes(1, messages[4]) - .mock('receive').takes(2, messages[5]); + .mock('receive').takes('0' + messages[0]) + .mock('receive').takes('1' + messages[0]) + .mock('receive').takes('2' + messages[0]) + .mock('receive').takes('0' + messages[1]) + .mock('receive').takes('1' + messages[1]) + .mock('receive').takes('2' + messages[1]); + var packets = messages.map(function(message) { + var envelope = utils.createEnvelope('publish-subscribe', message); + return utils.createPacket(envelope); + }); var application = express(); utils.setupServer(application) .next(function(newServer) { server = newServer; + }) + .createBackend() + .next(function(newBackend) { + backend = newBackend; + connection = new Connection({ + tag: 'test', + hostName: 'localhost', + port: utils.testSendPort, + receivePort: utils.testReceivePort, + maxRetyrCount: 3, + retryDelay: 1 + }); socketIoAdaptor.register(application, server, { + tag: 'test', connection: connection, plugins: [testPlugin] }); @@ -231,31 +238,20 @@ suite('Socket.IO API', function() { }) .next(function(newClientSockets) { clientSockets = clientSockets.concat(newClientSockets); - connection.assertThrows(); clientSockets[0].on('publish-subscribe', function(data) { - clientReceiver.receive(0, data); + clientReceiver.receive('0' + data); }); clientSockets[1].on('publish-subscribe', function(data) { - clientReceiver.receive(1, data); + clientReceiver.receive('1' + data); }); clientSockets[2].on('publish-subscribe', function(data) { - clientReceiver.receive(2, data); + clientReceiver.receive('2' + data); }); - - connection.controllers[0]['publish-subscribe'] - .trigger(createEnvelope('publish-subscribe', messages[0])); - connection.controllers[1]['publish-subscribe'] - .trigger(createEnvelope('publish-subscribe', messages[1])); - connection.controllers[2]['publish-subscribe'] - .trigger(createEnvelope('publish-subscribe', messages[2])); - connection.controllers[0]['publish-subscribe'] - .trigger(createEnvelope('publish-subscribe', messages[3])); - connection.controllers[1]['publish-subscribe'] - .trigger(createEnvelope('publish-subscribe', messages[4])); - connection.controllers[2]['publish-subscribe'] - .trigger(createEnvelope('publish-subscribe', messages[5])); }) + .sendPacketTo(packets[0], utils.testReceivePort) + .wait(0.01) + .sendPacketTo(packets[1], utils.testReceivePort) .wait(0.01) .next(function() { clientReceiver.assertThrows(); @@ -267,8 +263,6 @@ suite('Socket.IO API', function() { }); test('request-response style message', function(done) { - connection = utils.createMockedBackendConnection(testPlugin, 3); - var onReceived = [{}, {}, {}, {}, {}, {}]; var messages = [ Math.random(), Math.random(), @@ -283,7 +277,20 @@ suite('Socket.IO API', function() { utils.setupServer(application) .next(function(newServer) { server = newServer; + }) + .createBackend() + .next(function(newBackend) { + backend = newBackend; + connection = new Connection({ + tag: 'test', + hostName: 'localhost', + port: utils.testSendPort, + receivePort: utils.testReceivePort, + maxRetyrCount: 3, + retryDelay: 1 + }); socketIoAdaptor.register(application, server, { + tag: 'test', connection: connection, plugins: [testPlugin] }); @@ -291,33 +298,52 @@ suite('Socket.IO API', function() { }) .next(function(newClientSockets) { clientSockets = clientSockets.concat(newClientSockets); - connection.assertThrows(); - - for (var i = 0, maxi = messages.length; i < maxi; i++) { - connection = connection - .mock('emitMessage') - .takes('request-response', messages[i], function() {}, {}) - .ctrl(2, onReceived[i]); - } clientSockets[0].emit('request-response', messages[0]); + }) + .wait(0.01) + .next(function() { clientSockets[1].emit('request-response', messages[1]); + }) + .wait(0.01) + .next(function() { clientSockets[2].emit('request-response', messages[2]); + }) + .wait(0.01) + .next(function() { clientSockets[0].emit('request-response', messages[3]); + }) + .wait(0.01) + .next(function() { clientSockets[1].emit('request-response', messages[4]); + }) + .wait(0.01) + .next(function() { clientSockets[2].emit('request-response', messages[5]); }) .wait(0.01) .next(function() { - connection.assertThrows(); + assert.equal(backend.received.length, 6); + assert.deepEqual([backend.received[0][2].body, + backend.received[1][2].body, + backend.received[2][2].body, + backend.received[3][2].body, + backend.received[4][2].body, + backend.received[5][2].body], + messages); + + var responses = backend.received.map(function(receivedPacket) { + var original = receivedPacket[2]; + return utils.createReplyEnvelopeFor(original, 'request-response', Math.random()); + }); clientReceiver = nodemock - .mock('receive').takes(0, messages[0]) - .mock('receive').takes(1, messages[1]) - .mock('receive').takes(2, messages[2]) - .mock('receive').takes(0, messages[3]) - .mock('receive').takes(1, messages[4]) - .mock('receive').takes(2, messages[5]); + .mock('receive').takes(0, responses[0].body) + .mock('receive').takes(1, responses[1].body) + .mock('receive').takes(2, responses[2].body) + .mock('receive').takes(0, responses[3].body) + .mock('receive').takes(1, responses[4].body) + .mock('receive').takes(2, responses[5].body); clientSockets[0].on('request-response', function(data) { clientReceiver.receive(0, data); }); @@ -328,10 +354,13 @@ suite('Socket.IO API', function() { clientReceiver.receive(2, data); }); - for (var i = 0, maxi = messages.length; i < maxi; i++) { - onReceived[i].trigger(null, - createEnvelope('request-response', messages[i])); - } + return utils + .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) + .sendPacketTo(utils.createPacket(responses[4]), utils.testReceivePort) + .sendPacketTo(utils.createPacket(responses[5]), utils.testReceivePort); }) .wait(0.01) .next(function() { Modified: test/test-utils.js (+56 -4) =================================================================== --- test/test-utils.js 2013-02-13 16:23:02 +0900 (759ffca) +++ test/test-utils.js 2013-02-13 17:26:21 +0900 (3223032) @@ -10,6 +10,7 @@ var socketIoDefaultCommandsModule = exports.socketIoDefaultCommandsModule = require('../lib/frontend/default-commands/socket.io'); var model = require('../lib/model'); +var FluentReceiver = require('../lib/backend/receiver').FluentReceiver; var testSendPort = exports.testSendPort = 3333; var testReceivePort = exports.testReceivePort = 3334; @@ -29,7 +30,7 @@ function connectTo(port) { return deferred; } exports.connectTo = connectTo; -Deferred.register('connectTo', function() { return connectTo.apply(this, arguments); }); +Deferred.register('connectTo', connectTo); function sendPacketTo(packet, port) { var clientSocket; @@ -53,7 +54,7 @@ function sendPacketTo(packet, port) { }); } exports.sendPacketTo = sendPacketTo; -Deferred.register('sendPacketTo', function() { return sendPacketTo.apply(this, arguments); }); +Deferred.register('sendPacketTo', sendPacketTo); function setupServer(handlerOrServer) { @@ -137,7 +138,7 @@ function createClientSocket() { return deferred; } exports.createClientSocket = createClientSocket; -Deferred.register('createClientSocket', function() { return createClientSocket.apply(this, arguments); }); +Deferred.register('createClientSocket', createClientSocket); function createClientSockets(count) { var sockets = []; @@ -154,7 +155,7 @@ function createClientSockets(count) { }); } exports.createClientSockets = createClientSockets; -Deferred.register('createClientSockets', function() { return createClientSockets.apply(this, arguments); }); +Deferred.register('createClientSockets', createClientSockets); function createMockedBackendConnection(socketCommands, clientCount) { socketCommands = socketCommands || {}; @@ -218,6 +219,57 @@ function readyToDestroyMockedConnection(connection, clientCount) { } exports.readyToDestroyMockedConnection = readyToDestroyMockedConnection; +function createBackend() { + var deferred = new Deferred(); + var backend = new FluentReceiver(testSendPort); + backend.received = []; + backend.on('receive', function(data) { + backend.received.push(data); + }); + backend.listen(function() { + return deferred.call(backend); + }); + return deferred; +} +exports.createBackend = createBackend; +Deferred.register('createBackend', createBackend); + + +function createEnvelope(type, body) { + var now = new Date(); + var envelope = { + id: now.getTime(), + date: now.toISOString(), + replyTo: 'localhost:' + testReceivePort, + statusCode: 200, + type: type, + body: body + }; + return envelope; +} +exports.createEnvelope = createEnvelope; + +function createExpectedEnvelope(type, body) { + var envelope = createEnvelope(type, body); + envelope.id = TypeOf('string'); + envelope.date = InstanceOf(Date); + return envelope; +} +exports.createExpectedEnvelope = createExpectedEnvelope; + +function createReplyEnvelopeFor(message, type, body) { + var response = createEnvelope(type, body); + response.inReplyTo = message.id; + return response; +} +exports.createReplyEnvelopeFor = createReplyEnvelopeFor; + +function createPacket(message, tag) { + tag = tag || 'test.message'; + return [tag, Date.now(), message]; +} +exports.createPacket = createPacket; + function TypeOf(typeString) { if (!(this instanceof TypeOf)) -------------- next part -------------- HTML����������������������������...ダウンロード