smileham
smileham

Reputation: 1460

How to connect multiple sockets to sails in test

I have a messaging controller setup in sails.js and want to test it with multiple clients to see if the pub/sub code works. I set up a test file

var socketIOClient = require('socket.io-client');
var sailsIOClient = require('sails.io.js');
var socket1 = socketIOClient;
var client1 = sailsIOClient(socket1);
var socket2 = socketIOClient;
var client2 = sailsIOClient(socket2);
var socket3 = socketIOClient('http://localhost:1337', {'force new connection': true});
var client3 = sailsIOClient(socket2);
...

So I want to test that a client can receive the notification when a new message is posted. However, when I post from either client1 or client2, it posts from both. Essentially, they are linked to the same socket object or something like that, but I don't know where. So I want to connect multiple sockets, and I've tried variations like socket3 and client3, but get the following problem:

Example of hang up:

sails.log('posting...');
client3.socket.post('/v1.0/messaging', data, function(body, JWR){
  sails.log('posted');
  done();
});

Only posting... is logged in this way, but posted is logged if using client1 or client2.


My question: How can I connect multiple clients to my sails api to test if my pub/sub controller works?

Upvotes: 3

Views: 604

Answers (2)

Alexis N-o
Alexis N-o

Reputation: 3993

I can't test it right now, but you could try this

var socketIOClient = require('socket.io-client');
var sailsIOClient = require('sails.io.js');

// Instantiate the socket client (`io`)
var io = sailsIOClient(socketIOClient);
// prevents socket to connect with it's default origin
io.sails.autoConnect = false


// Ask the client to create two socket connections
var socket1 = io.sails.connect('http://localhost:1337');
var socket2 = io.sails.connect('http://localhost:1337');

// Test it
socket1.get(url, data, cb)
socket1.post(url, data, cb)
socket2.get(url, data, cb)
socket2.post(url, data, cb)

// If you want to configure and use the "eager" instance
io.sails.url = 'http://localhost:1337'; 
io.socket.get(url, data, cb)

This way, you would create several SailsSocket instance instead of using the "eager" instance.

When you use sails.io.js in a browser, io.socket contains the socket instance (called "eager instance" in the comments) which will automatically try to connect using the host that the js file was served from. io.sails.connect() allows you to create other instances.

Upvotes: 4

galethil
galethil

Reputation: 1016

The correct syntax for actual version of socket.io should be

//first socket
var socket1 = socketIOClient('http://localhost:1337', {'forceNew: true});
//second socket
var socket2 = socketIOClient('http://localhost:1337', {'forceNew: true});

See socket.io docs http://socket.io/blog/socket-io-1-2-0/#

Upvotes: 1

Related Questions