Files
socket.io/test/jsonp.js
Tony Kovanen dbe140c117 Binary support
2014-02-01 01:20:51 +02:00

195 lines
5.8 KiB
JavaScript

/**
* Module dependencies.
*/
var http = require('http');
var eioc = require('engine.io-client');
var listen = require('./common').listen;
var expect = require('expect.js');
var request = require('superagent');
var WebSocket = require('ws');
describe('JSONP', function () {
before(function () {
// we have to override the browser's functionality for JSONP
document = {
body: {
appendChild: function(){},
removeChild: function(){}
}
};
document.createElement = function (name) {
var self = this;
if('script' == name) {
var script = {};
script.__defineGetter__('parentNode', function () {
return document.body;
});
script.__defineSetter__('src', function (uri) {
request.get(uri).end(function(res) {
eval(res.text);
});
});
return script;
} else if ('form' == name) {
var form = {
style: {},
action: '',
parentNode: { removeChild: function(){} },
removeChild: function(){},
setAttribute: function(){},
appendChild: function(){},
submit: function(){
request
.post(this.action)
.type('form')
.send({ d: self.areaValue })
.end(function(){});
}
};
return form;
} else if ('textarea' == name) {
var textarea = {};
//a hack to be able to access the area data when form is sent
textarea.__defineSetter__('value', function (data) {
self.areaValue = data;
});
return textarea;
} else {
return {};
}
}
document.getElementsByTagName = function (name) {
return [{
parentNode: {
insertBefore: function () {}
}
}]
}
});
after(function () {
delete document.getElementsByTagName
, document.createElement
, document;
});
describe('handshake', function () {
it('should open with polling JSONP when requested', function (done) {
var engine = listen( { allowUpgrades: false, transports: ['polling'] }, function (port) {
var socket = new eioc.Socket('ws://localhost:' + port
, { transports: ['polling'], forceJSONP: true, upgrade: false });
engine.on('connection', function (socket) {
expect(socket.transport.name).to.be('polling');
expect(socket.transport.head).to.be('___eio[0](');
done();
});
});
});
});
describe('messages', function () {
it('should arrive from client to server and back (pollingJSONP)', function (done) {
var engine = listen( { allowUpgrades: false, transports: ['polling'] }, function (port) {
var socket = new eioc.Socket('ws://localhost:' + port
, { transports: ['polling'], forceJSONP: true, upgrade: false });
engine.on('connection', function (conn) {
conn.on('message', function (msg) {
conn.send('a');
});
});
socket.on('open', function () {
socket.send('a');
socket.on('message', function (msg) {
expect(socket.transport.query.j).to.not.be(undefined);
expect(msg).to.be('a');
done();
});
});
});
});
it('should arrive from server to client and back with binary data (pollingJSONP)', function(done) {
var binaryData = new Buffer(5);
for (var i = 0; i < 5; i++) binaryData[i] = i;
var engine = listen( { allowUpgrades: false, transports: ['polling'] }, function (port) {
var socket = new eioc.Socket('ws://localhost:' + port, { transports: ['polling'], forceJSONP: true, upgrade: false});
engine.on('connection', function (conn) {
conn.on('message', function (msg) {
conn.send(msg);
});
});
socket.on('open', function() {
socket.send(binaryData);
socket.on('message', function (msg) {
for (var i = 0; i < msg.length; i++) expect(msg[i]).to.be(i);
done();
});
});
});
});
});
describe('close', function () {
it('should trigger when server closes a client', function (done) {
var engine = listen( { allowUpgrades: false, transports: ['polling'] }, function (port) {
var socket = new eioc.Socket('ws://localhost:' + port
, { transports: ['polling'], forceJSONP: true, upgrade: false })
, total = 2;
engine.on('connection', function (conn) {
conn.on('close', function (reason) {
expect(reason).to.be('forced close');
--total || done();
});
setTimeout(function () {
conn.close();
}, 10);
});
socket.on('open', function () {
socket.on('close', function (reason) {
expect(reason).to.be('transport close');
--total || done();
});
});
});
});
it('should trigger when client closes', function (done) {
var engine = listen( { allowUpgrades: false, transports: ['polling'] }, function (port) {
var socket = new eioc.Socket('ws://localhost:' + port
, { transports: ['polling'], forceJSONP: true, upgrade: false })
, total = 2;
engine.on('connection', function (conn) {
conn.on('close', function (reason) {
expect(reason).to.be('transport close');
--total || done();
});
});
socket.on('open', function () {
socket.send('a');
socket.on('close', function (reason) {
expect(reason).to.be('forced close');
--total || done();
});
setTimeout(function () {
socket.close();
}, 10);
});
});
});
});
});