michael@0: var assert = require('assert'), michael@0: spdy = require('../../'), michael@0: Buffer = require('buffer').Buffer; michael@0: michael@0: suite('A Parser of SPDY module', function() { michael@0: var parser; michael@0: michael@0: [2,3].forEach(function(version) { michael@0: suite('version ' + version, function() { michael@0: setup(function() { michael@0: var deflate = spdy.utils.createDeflate(version), michael@0: inflate = spdy.utils.createInflate(version); michael@0: michael@0: parser = new spdy.parser.create({ michael@0: socket: { michael@0: setNoDelay: function() {} michael@0: }, michael@0: write: function() {} michael@0: }, deflate, inflate); michael@0: michael@0: parser.createFramer(version); michael@0: }); michael@0: michael@0: test('should wait for headers initially', function() { michael@0: assert.equal(parser.waiting, 8); michael@0: }); michael@0: michael@0: test('should update buffered property once given < 8 bytes', function() { michael@0: parser.write(new Buffer(5)); michael@0: assert.equal(parser.buffered, 5); michael@0: }); michael@0: michael@0: test('given SYN_STREAM header should start waiting for body', function() { michael@0: parser.write(new Buffer([ michael@0: 0x80, 0x02, 0x00, 0x01, // Control frame, version, type (SYN_STREAM) michael@0: 0x00, 0x00, 0x12, 0x34 michael@0: ])); michael@0: michael@0: assert.equal(parser.waiting, 0x1234); michael@0: assert.equal(parser.state.type, 'frame-body'); michael@0: assert.ok(parser.state.header.control); michael@0: assert.equal(parser.state.header.flags, 0); michael@0: assert.equal(parser.state.header.length, 0x1234); michael@0: }); michael@0: michael@0: test('given DATA header should start waiting for body', function() { michael@0: parser.write(new Buffer([ michael@0: 0x00, 0x00, 0x00, 0x01, // Data frame, stream ID michael@0: 0x00, 0x00, 0x12, 0x34 michael@0: ])); michael@0: michael@0: assert.equal(parser.waiting, 0x1234); michael@0: assert.equal(parser.state.type, 'frame-body'); michael@0: assert.ok(!parser.state.header.control); michael@0: assert.equal(parser.state.header.id, 1); michael@0: assert.equal(parser.state.header.flags, 0); michael@0: assert.equal(parser.state.header.length, 0x1234); michael@0: }); michael@0: michael@0: test('given chunked header should not fail', function() { michael@0: parser.write(new Buffer([ michael@0: 0x80, 0x02, 0x00, 0x01 // Control frame, version, type (SYN_STREAM) michael@0: ])); michael@0: assert.equal(parser.buffered, 4); michael@0: michael@0: parser.write(new Buffer([ michael@0: 0x00, 0x00, 0x12, 0x34 michael@0: ])); michael@0: assert.equal(parser.buffered, 0); michael@0: michael@0: assert.equal(parser.waiting, 0x1234); michael@0: assert.equal(parser.state.type, 'frame-body'); michael@0: assert.ok(parser.state.header.control); michael@0: assert.equal(parser.state.header.flags, 0); michael@0: assert.equal(parser.state.header.length, 0x1234); michael@0: }); michael@0: michael@0: test('given header and body should emit `frame`', function(done) { michael@0: parser.on('frame', function(frame) { michael@0: assert.ok(frame.type === 'DATA'); michael@0: assert.equal(frame.id, 1); michael@0: assert.equal(frame.data.length, 4); michael@0: assert.equal(frame.data[0], 0x01); michael@0: assert.equal(frame.data[1], 0x02); michael@0: assert.equal(frame.data[2], 0x03); michael@0: assert.equal(frame.data[3], 0x04); michael@0: done(); michael@0: }); michael@0: michael@0: parser.write(new Buffer([ michael@0: 0x00, 0x00, 0x00, 0x01, // Data frame, stream ID michael@0: 0x00, 0x00, 0x00, 0x04, michael@0: 0x01, 0x02, 0x03, 0x04 // Body michael@0: ])); michael@0: michael@0: // Waits for next frame michael@0: assert.equal(parser.waiting, 8); michael@0: assert.equal(parser.state.type, 'frame-head'); michael@0: }); michael@0: }); michael@0: }); michael@0: });