[Groonga-commit] groonga/express-kotoumi [master] test: Test behavior of socket.io api with multiple clients around messages from the backend

アーカイブの一覧に戻る

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����������������������������...
ダウンロード 



More information about the Groonga-commit mailing list
アーカイブの一覧に戻る