mirror of
https://github.com/socketio/socket.io.git
synced 2026-04-30 03:00:39 -04:00
195 lines
5.8 KiB
JavaScript
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;
|
|
delete global.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);
|
|
});
|
|
});
|
|
});
|
|
});
|
|
});
|