diff --git a/.travis.yml b/.travis.yml index 615d3e6..be58e33 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,6 +2,11 @@ language: node_js node_js: - 0.6 - 0.8 + - 0.10 notifications: - irc: "irc.freenode.org#socket.io" + irc: "irc.freenode.org##socket.io" +env: + global: + - secure: v76/Y3hGIGsANoFAW0US3X8cuDFY7g8stMFrwGUxiQnm4HN3j83w+FfoZay0mESKhNIpqk4nCJQwMCd1gJnLL7ybjGOt5LeEuQVlLDXkRVrXSViy2XwAW+mLj7H/++/LTHWo/Ma6pOa1YC2o4SbSsiK1NdhdAK5ZGluonPBIG18= + - secure: P2zFTMeI9duoPBXhAZZLddqeJS+dUI27Q02tTdr+AjvUkr8f7Zga57SZxP6Jbn8bxUPI3ZQzAm1KMsyUo4IAegXLJ4j9VCF6ab65NkE1k8UH99kXXS30Ha27NS1aQafCbaOTxxQfqQHmnjt2HJtvk04nqCEDhoZCdDUZNVSGCOc= diff --git a/.zuul.yml b/.zuul.yml new file mode 100644 index 0000000..38bc342 --- /dev/null +++ b/.zuul.yml @@ -0,0 +1,16 @@ +ui: mocha-bdd +browsers: + - name: chrome + version: 29..latest + - name: firefox + version: latest + - name: safari + version: latest + - name: ie + version: 10 + platform: Windows 2012 + - name: ie + version: 9 + version: [6..9, latest] + - name: iphone + version: oldest..latest diff --git a/Makefile b/Makefile index a31c14c..ee0a3b2 100644 --- a/Makefile +++ b/Makefile @@ -4,6 +4,8 @@ REPORTER = dot test: @./node_modules/.bin/mocha \ --reporter $(REPORTER) \ - --bail + --bail \ + test/index.js + @./node_modules/.bin/zuul -- test/index.js .PHONY: test diff --git a/package.json b/package.json index 76bdc4b..8351003 100644 --- a/package.json +++ b/package.json @@ -19,11 +19,15 @@ }, "devDependencies": { "mocha": "1.16.2", - "expect.js": "0.2.0" + "expect.js": "0.2.0", + "zuul": "1.5.4" }, "component": { "scripts": [ "index.js" ] + }, + "scripts": { + "test": "make test" } } diff --git a/test/arraybuffer.js b/test/arraybuffer.js new file mode 100644 index 0000000..83b3514 --- /dev/null +++ b/test/arraybuffer.js @@ -0,0 +1,37 @@ +var parser = require('../index.js'); +var expect = require('expect.js'); +var helpers = require('./helpers.js'); +var encode = parser.encode; +var decode = parser.decode; + +describe('parser', function() { + it('encodes an ArrayBuffer', function() { + var packet = { + type: parser.BINARY_EVENT, + data: new ArrayBuffer(2), + id: 0, + nsp: '/' + }; + parser.encode(packet, function(encodedData) { + var decodedPacket = parser.decode(encodedData); + helpers.testPacketMetadata(packet, decodedPacket); + helpers.testArrayBuffers(packet.data, decodedPacket.data); + }); + }); + + it('encodes an ArrayBuffer deep in JSON', function() { + var packet = { + type: parser.BINARY_EVENT, + data: {a: 'hi', b: {why: new ArrayBuffer(3)}, c:'bye'}, + id: 999, + nsp: '/deep' + }; + parser.encode(packet, function(encodedData) { + var decodedPacket = parser.decode(encodedData); + helpers.testPacketMetadata(packet, decodedPacket); + expect(packet.data.a).to.eql(decodedPacket.data.a); + expect(packet.data.c).to.eql(decodedPacket.data.c); + helpers.testArrayBuffers(packet.data.b.why, decodedPacket.data.b.why); + }); + }); +}); diff --git a/test/blob.js b/test/blob.js new file mode 100644 index 0000000..cecc590 --- /dev/null +++ b/test/blob.js @@ -0,0 +1,57 @@ +var parser = require('../index.js'); +var expect = require('expect.js'); +var helpers = require('./helpers.js'); +var encode = parser.encode; +var decode = parser.decode; + +var BlobBuilder = global.BlobBuilder || global.WebKitBlobBuilder || global.MSBlobBuilder || global.MozBlobBuilder; + +describe('parser', function() { + it('encodes a Blob', function() { + var data; + if (BlobBuilder) { + var bb = new BlobBuilder(); + bb.append(new ArrayBuffer(2)); + data = bb.getBlob(); + } else { + data = new Blob([new ArrayBuffer(2)]); + } + var packet = { + type: parser.BINARY_EVENT, + data: data, + id: 0, + nsp: '/' + }; + parser.encode(packet, function(encodedData) { + var decodedPacket = parser.decode(encodedData); + helpers.testPacketMetadata(packet, decodedPacket); + helpers.testArrayBuffers(packet.data, decodedPacket.data); + }); + }); + + it('encodes an Blob deep in JSON', function() { + var data; + if (BlobBuilder) { + var bb = new BlobBuilder(); + bb.append(new ArrayBuffer(2)); + data = bb.getBlob(); + } else { + data = new Blob([new ArrayBuffer(2)]); + } + + var packet = { + type: parser.BINARY_EVENT, + data: {a: 'hi', b: { why: data }, c:'bye'}, + id: 999, + nsp: '/deep' + }; + parser.encode(packet, function(encodedData) { + var decodedPacket = parser.decode(encodedData); + helpers.testPacketMetadata(packet, decodedPacket); + expect(packet.data.a).to.eql(decodedPacket.data.a); + expect(packet.data.c).to.eql(decodedPacket.data.c); + helpers.testArrayBuffers(packet.data.b.why, decodedPacket.data.b.why); + }); + }); + +}); diff --git a/test/buffer.js b/test/buffer.js new file mode 100644 index 0000000..17ea858 --- /dev/null +++ b/test/buffer.js @@ -0,0 +1,16 @@ +var parser = require('../index.js'); +var expect = require('expect.js'); +var helpers = require('./helpers.js'); +var encode = parser.encode; +var decode = parser.decode; + +describe('parser', function() { + it('encodes a Buffer', function() { + helpers.test({ + type: parser.BINARY_EVENT, + data: new Buffer('abc', 'utf8'), + id: 23, + nsp: '/cool' + }); + }); +}); diff --git a/test/helpers.js b/test/helpers.js new file mode 100644 index 0000000..a47c7e7 --- /dev/null +++ b/test/helpers.js @@ -0,0 +1,25 @@ +var parser = require('../index.js'); +var expect = require('expect.js'); +var encode = parser.encode; +var decode = parser.decode; + +// tests encoding and decoding a packet +module.exports.test = function(obj){ + encode(obj, function(encodedPacket) { + expect(decode(encodedPacket)).to.eql(obj); + }); +} + +// array buffer's slice is native code that is not transported across +// socket.io via msgpack, so regular .eql fails +module.exports.testArrayBuffers = function(buf1, buf2) { + buf1.slice = undefined; + buf2.slice = undefined; + expect(buf1).to.eql(buf2); +} + +module.exports.testPacketMetadata = function(p1, p2) { + expect(p1.type).to.eql(p2.type); + expect(p1.id).to.eql(p2.id); + expect(p1.nsp).to.eql(p2.nsp); +} diff --git a/test/index.js b/test/index.js new file mode 100644 index 0000000..ba6ce75 --- /dev/null +++ b/test/index.js @@ -0,0 +1,30 @@ +var env = require('./support/env.js'); + +var blobSupported = (function() { + try { + new Blob(['hi']); + return true; + } catch(e) {} + return false; +})(); + +/** + * Create a blob builder even when vendor prefixes exist + */ + +var BlobBuilder = global.BlobBuilder || global.WebKitBlobBuilder || global.MSBlobBuilder || global.MozBlobBuilder; +var blobBuilderSupported = !!BlobBuilder && !!BlobBuilder.prototype.append && !!BlobBuilder.prototype.getBlob; + +require('./parser.js'); + +if (!env.browser) { + require('./buffer.js'); +} + +if (global.ArrayBuffer) { + require('./arraybuffer.js'); +} + +if (blobSupported || blobBuilderSupported) { + require('./blob.js'); +} diff --git a/test/parser.js b/test/parser.js new file mode 100644 index 0000000..88e28c8 --- /dev/null +++ b/test/parser.js @@ -0,0 +1,53 @@ +var parser = require('../index.js'); +var expect = require('expect.js'); +var helpers = require('./helpers.js'); +var encode = parser.encode; +var decode = parser.decode; + +describe('parser', function(){ + + it('exposes types', function(){ + expect(parser.CONNECT).to.be.a('number'); + expect(parser.DISCONNECT).to.be.a('number'); + expect(parser.EVENT).to.be.a('number'); + expect(parser.ACK).to.be.a('number'); + expect(parser.ERROR).to.be.a('number'); + }); + + it('encodes connection', function(){ + helpers.test({ + type: parser.CONNECT, + nsp: '/woot' + }); + }); + + it('encodes disconnection', function(){ + helpers.test({ + type: parser.DISCONNECT, + nsp: '/woot' + }); + }); + + it('encodes an event', function(){ + helpers.test({ + type: parser.EVENT, + data: ['a', 1, {}], + nsp: '/' + }); + helpers.test({ + type: parser.EVENT, + data: ['a', 1, {}], + id: 1, + nsp: '/test' + }); + }); + + it('encodes an ack', function(){ + helpers.test({ + type: parser.ACK, + data: ['a', 1, {}], + id: 123, + nsp: '/' + }); + }); +}); diff --git a/test/support/env.js b/test/support/env.js new file mode 100644 index 0000000..c1d494e --- /dev/null +++ b/test/support/env.js @@ -0,0 +1,5 @@ +// WARNING this is bad practice +// we only do this in our tests because we need to test engine.io-client +// support in browsers and in node.js +// some tests do not yet work in both +module.exports.browser = !!global.window; diff --git a/test/test.js b/test/test.js deleted file mode 100644 index 4e86dd1..0000000 --- a/test/test.js +++ /dev/null @@ -1,115 +0,0 @@ - -var parser = require('..'); -var expect = require('expect.js'); -var encode = parser.encode; -var decode = parser.decode; - -// tests encoding and decoding a packet - -function test(obj){ - encode(obj, function(encodedPacket) { - expect(decode(encodedPacket)).to.eql(obj); - }); -} - -// array buffer's slice is native code that is not transported across -// socket.io via msgpack, so regular .eql fails -function testArrayBuffers(buf1, buf2) { - buf1.slice = undefined; - buf2.slice = undefined; - expect(buf1).to.eql(buf2); -} - -function testPacketMetadata(p1, p2) { - expect(p1.type).to.eql(p2.type); - expect(p1.id).to.eql(p2.id); - expect(p1.nsp).to.eql(p2.nsp); -} - -describe('parser', function(){ - - it('exposes types', function(){ - expect(parser.CONNECT).to.be.a('number'); - expect(parser.DISCONNECT).to.be.a('number'); - expect(parser.EVENT).to.be.a('number'); - expect(parser.ACK).to.be.a('number'); - expect(parser.ERROR).to.be.a('number'); - }); - - it('encodes connection', function(){ - test({ - type: parser.CONNECT, - nsp: '/woot' - }); - }); - - it('encodes disconnection', function(){ - test({ - type: parser.DISCONNECT, - nsp: '/woot' - }); - }); - - it('encodes an event', function(){ - test({ - type: parser.EVENT, - data: ['a', 1, {}], - nsp: '/' - }); - test({ - type: parser.EVENT, - data: ['a', 1, {}], - id: 1, - nsp: '/test' - }); - }); - - it('encodes an ack', function(){ - test({ - type: parser.ACK, - data: ['a', 1, {}], - id: 123, - nsp: '/' - }); - }); - - it('encodes a Buffer', function() { - test({ - type: parser.BINARY_EVENT, - data: new Buffer('abc', 'utf8'), - id: 23, - nsp: '/cool' - }); - }); - - it('encodes an ArrayBuffer', function() { - var packet = { - type: parser.BINARY_EVENT, - data: new ArrayBuffer(2), - id: 0, - nsp: '/' - }; - parser.encode(packet, function(encodedData) { - var decodedPacket = parser.decode(encodedData); - testPacketMetadata(packet, decodedPacket); - testArrayBuffers(packet.data, decodedPacket.data); - }); - }); - - it('encodes an ArrayBuffer deep in JSON', function() { - var packet = { - type: parser.BINARY_EVENT, - data: {a: 'hi', b: {why: new ArrayBuffer(3)}, c:'bye'}, - id: 999, - nsp: '/deep' - }; - parser.encode(packet, function(encodedData) { - var decodedPacket = parser.decode(encodedData); - testPacketMetadata(packet, decodedPacket); - expect(packet.data.a).to.eql(decodedPacket.data.a); - expect(packet.data.c).to.eql(decodedPacket.data.c); - testArrayBuffers(packet.data.b.why, decodedPacket.data.b.why); - }); - }); - -});