Files
tubestation/testing/xpcshell/node-spdy/test/unit/framer-test.js

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);
});
});
});