191 lines
5.7 KiB
JavaScript
191 lines
5.7 KiB
JavaScript
var assert = require('assert'),
|
|
spdy = require('../../'),
|
|
Buffer = require('buffer').Buffer,
|
|
Stream = require('stream').Stream;
|
|
|
|
suite('A Framer of SPDY module', function() {
|
|
var inflate,
|
|
deflate,
|
|
framer;
|
|
|
|
setup(function() {
|
|
inflate = spdy.utils.zwrap(spdy.utils.createInflate());
|
|
deflate = spdy.utils.zwrap(spdy.utils.createDeflate());
|
|
framer = new spdy.protocol[2].Framer(deflate, inflate);
|
|
});
|
|
|
|
/*
|
|
deflate.on('data', function(b) {console.log(b)});
|
|
deflate.write(new Buffer([
|
|
0x00, 0x02, // Number of name+value
|
|
0, 0x04, // Name length
|
|
0x68, 0x6f, 0x73, 0x74, // 'host'
|
|
0, 0x09, // Value length
|
|
0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x68, 0x6f, 0x73, 0x74, // 'localhost'
|
|
0, 0x06,
|
|
0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, // 'custom',
|
|
0, 0x1,
|
|
0x31 // '1'
|
|
]));
|
|
deflate.flush();
|
|
*/
|
|
|
|
suite('frame parsing', function() {
|
|
test('given a SYN_STREAM should return correct frame', function(done) {
|
|
var body = new Buffer([
|
|
0x00, 0x00, 0x00, 0x01, // Stream ID
|
|
0x00, 0x00, 0x00, 0x00, // Associated Stream ID
|
|
0x00, 0x00, // Priority + Unused
|
|
0x78, 0xbb, 0xdf, 0xa2, 0x51, 0xb2, // Deflated Name/Value pairs
|
|
0x62, 0x60, 0x62, 0x60, 0x01, 0xe5, 0x12,
|
|
0x06, 0x4e, 0x50, 0x50, 0xe6, 0x80, 0x99,
|
|
0x6c, 0xc9, 0xa5, 0xc5, 0x25, 0xf9, 0xb9,
|
|
0x0c, 0x8c, 0x86, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff
|
|
]);
|
|
framer.execute({
|
|
control: true,
|
|
type: 1,
|
|
length: body.length
|
|
}, body, function(err, frame) {
|
|
assert.ok(!err);
|
|
assert.equal(frame.type, 'SYN_STREAM');
|
|
assert.equal(frame.id, 1);
|
|
assert.equal(frame.associated, 0);
|
|
assert.equal(frame.headers.host, 'localhost');
|
|
assert.equal(frame.headers.custom, '1');
|
|
done();
|
|
});
|
|
});
|
|
|
|
test('given a SYN_REPLY should return correct frame', function(done) {
|
|
var body = new Buffer([
|
|
0x00, 0x00, 0x00, 0x01, // Stream ID
|
|
0x00, 0x00, // Unused
|
|
0x78, 0xbb, 0xdf, 0xa2, 0x51, 0xb2, // Deflated Name/Value pairs
|
|
0x62, 0x60, 0x62, 0x60, 0x01, 0xe5, 0x12,
|
|
0x06, 0x4e, 0x50, 0x50, 0xe6, 0x80, 0x99,
|
|
0x6c, 0xc9, 0xa5, 0xc5, 0x25, 0xf9, 0xb9,
|
|
0x0c, 0x8c, 0x86, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff
|
|
]);
|
|
framer.execute({
|
|
control: true,
|
|
type: 2,
|
|
length: body.length
|
|
}, body, function(err, frame) {
|
|
assert.ok(!err);
|
|
assert.equal(frame.type, 'SYN_REPLY');
|
|
assert.equal(frame.id, 1);
|
|
assert.equal(frame.headers.host, 'localhost');
|
|
assert.equal(frame.headers.custom, '1');
|
|
done();
|
|
});
|
|
});
|
|
|
|
test('given a RST_STREAM should return correct frame', function(done) {
|
|
var body = new Buffer([0, 0, 0, 1, 0, 0, 0, 2]);
|
|
framer.execute({
|
|
control: true,
|
|
type: 3,
|
|
length: body.length
|
|
}, body, function(err, frame) {
|
|
assert.ok(!err);
|
|
assert.equal(frame.type, 'RST_STREAM');
|
|
assert.equal(frame.id, 1);
|
|
assert.equal(frame.status, 2);
|
|
done();
|
|
});
|
|
});
|
|
|
|
test('given a NOOP frame should return correct frame', function(done) {
|
|
framer.execute({
|
|
control: true,
|
|
type: 5,
|
|
length: 0
|
|
}, new Buffer(0), function(err, frame) {
|
|
assert.ok(!err);
|
|
assert.equal(frame.type, 'NOOP');
|
|
done();
|
|
});
|
|
});
|
|
|
|
test('given a PING frame should return correct frame', function(done) {
|
|
framer.execute({
|
|
control: true,
|
|
type: 6,
|
|
length: 0
|
|
}, new Buffer(0), function(err, frame) {
|
|
assert.ok(!err);
|
|
assert.equal(frame.type, 'PING');
|
|
done();
|
|
});
|
|
});
|
|
|
|
test('given a GOAWAY frame should return correct frame', function(done) {
|
|
var body = new Buffer([0, 0, 0, 1]);
|
|
framer.execute({
|
|
control: true,
|
|
type: 7,
|
|
length: body.length
|
|
}, body, function(err, frame) {
|
|
assert.ok(!err);
|
|
assert.equal(frame.type, 'GOAWAY');
|
|
assert.equal(frame.lastId, 1);
|
|
done();
|
|
});
|
|
});
|
|
});
|
|
|
|
suite('frame generation', function() {
|
|
test('.replyFrame() should generate correct frame', function(done) {
|
|
framer.replyFrame(1, 200, 'ok', {}, function(err, chunks) {
|
|
assert.equal(err, null);
|
|
assert.ok(chunks.length > 1);
|
|
done();
|
|
});
|
|
});
|
|
|
|
test('.streamFrame() should generate correct frame', function(done) {
|
|
framer.streamFrame(2, 1, { url : '/' }, {}, function(err, chunks) {
|
|
assert.equal(err, null);
|
|
assert.ok(chunks.length > 1);
|
|
done();
|
|
});
|
|
});
|
|
|
|
test('.dataFrame() w/o fin should generate correct frame', function() {
|
|
var frame = framer.dataFrame(1, false, new Buffer(123));
|
|
assert.equal(frame[4], 0);
|
|
assert.ok(frame.length > 8);
|
|
});
|
|
|
|
test('.dataFrame() with fin should generate correct frame', function() {
|
|
var frame = framer.dataFrame(1, true, new Buffer(123));
|
|
assert.equal(frame[4], 1);
|
|
assert.ok(frame.length > 8);
|
|
});
|
|
|
|
test('.pingFrame() should generate correct frame', function() {
|
|
var frame = framer.pingFrame(new Buffer([0, 1, 2, 3]));
|
|
assert.ok(frame.length > 0);
|
|
});
|
|
|
|
test('.rstFrame() should generate correct frame', function() {
|
|
var frame = framer.rstFrame(1, 2);
|
|
assert.ok(frame.length > 0);
|
|
|
|
// Verify that cache works
|
|
var frame = framer.rstFrame(1, 2);
|
|
assert.ok(frame.length > 0);
|
|
});
|
|
|
|
test('.maxStreamsFrame() should generate correct frame', function() {
|
|
var frame = framer.maxStreamsFrame(13);
|
|
assert.ok(frame.length > 0);
|
|
|
|
// Verify that cache works
|
|
var frame = framer.maxStreamsFrame(13);
|
|
assert.ok(frame.length > 0);
|
|
});
|
|
});
|
|
});
|