1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/testing/xpcshell/node-spdy/test/unit/parser-test.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,102 @@ 1.4 +var assert = require('assert'), 1.5 + spdy = require('../../'), 1.6 + Buffer = require('buffer').Buffer; 1.7 + 1.8 +suite('A Parser of SPDY module', function() { 1.9 + var parser; 1.10 + 1.11 + [2,3].forEach(function(version) { 1.12 + suite('version ' + version, function() { 1.13 + setup(function() { 1.14 + var deflate = spdy.utils.createDeflate(version), 1.15 + inflate = spdy.utils.createInflate(version); 1.16 + 1.17 + parser = new spdy.parser.create({ 1.18 + socket: { 1.19 + setNoDelay: function() {} 1.20 + }, 1.21 + write: function() {} 1.22 + }, deflate, inflate); 1.23 + 1.24 + parser.createFramer(version); 1.25 + }); 1.26 + 1.27 + test('should wait for headers initially', function() { 1.28 + assert.equal(parser.waiting, 8); 1.29 + }); 1.30 + 1.31 + test('should update buffered property once given < 8 bytes', function() { 1.32 + parser.write(new Buffer(5)); 1.33 + assert.equal(parser.buffered, 5); 1.34 + }); 1.35 + 1.36 + test('given SYN_STREAM header should start waiting for body', function() { 1.37 + parser.write(new Buffer([ 1.38 + 0x80, 0x02, 0x00, 0x01, // Control frame, version, type (SYN_STREAM) 1.39 + 0x00, 0x00, 0x12, 0x34 1.40 + ])); 1.41 + 1.42 + assert.equal(parser.waiting, 0x1234); 1.43 + assert.equal(parser.state.type, 'frame-body'); 1.44 + assert.ok(parser.state.header.control); 1.45 + assert.equal(parser.state.header.flags, 0); 1.46 + assert.equal(parser.state.header.length, 0x1234); 1.47 + }); 1.48 + 1.49 + test('given DATA header should start waiting for body', function() { 1.50 + parser.write(new Buffer([ 1.51 + 0x00, 0x00, 0x00, 0x01, // Data frame, stream ID 1.52 + 0x00, 0x00, 0x12, 0x34 1.53 + ])); 1.54 + 1.55 + assert.equal(parser.waiting, 0x1234); 1.56 + assert.equal(parser.state.type, 'frame-body'); 1.57 + assert.ok(!parser.state.header.control); 1.58 + assert.equal(parser.state.header.id, 1); 1.59 + assert.equal(parser.state.header.flags, 0); 1.60 + assert.equal(parser.state.header.length, 0x1234); 1.61 + }); 1.62 + 1.63 + test('given chunked header should not fail', function() { 1.64 + parser.write(new Buffer([ 1.65 + 0x80, 0x02, 0x00, 0x01 // Control frame, version, type (SYN_STREAM) 1.66 + ])); 1.67 + assert.equal(parser.buffered, 4); 1.68 + 1.69 + parser.write(new Buffer([ 1.70 + 0x00, 0x00, 0x12, 0x34 1.71 + ])); 1.72 + assert.equal(parser.buffered, 0); 1.73 + 1.74 + assert.equal(parser.waiting, 0x1234); 1.75 + assert.equal(parser.state.type, 'frame-body'); 1.76 + assert.ok(parser.state.header.control); 1.77 + assert.equal(parser.state.header.flags, 0); 1.78 + assert.equal(parser.state.header.length, 0x1234); 1.79 + }); 1.80 + 1.81 + test('given header and body should emit `frame`', function(done) { 1.82 + parser.on('frame', function(frame) { 1.83 + assert.ok(frame.type === 'DATA'); 1.84 + assert.equal(frame.id, 1); 1.85 + assert.equal(frame.data.length, 4); 1.86 + assert.equal(frame.data[0], 0x01); 1.87 + assert.equal(frame.data[1], 0x02); 1.88 + assert.equal(frame.data[2], 0x03); 1.89 + assert.equal(frame.data[3], 0x04); 1.90 + done(); 1.91 + }); 1.92 + 1.93 + parser.write(new Buffer([ 1.94 + 0x00, 0x00, 0x00, 0x01, // Data frame, stream ID 1.95 + 0x00, 0x00, 0x00, 0x04, 1.96 + 0x01, 0x02, 0x03, 0x04 // Body 1.97 + ])); 1.98 + 1.99 + // Waits for next frame 1.100 + assert.equal(parser.waiting, 8); 1.101 + assert.equal(parser.state.type, 'frame-head'); 1.102 + }); 1.103 + }); 1.104 + }); 1.105 +});