You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
136 lines
3.7 KiB
136 lines
3.7 KiB
var assert = require('assert'); |
|
var hpack = require('../'); |
|
var fixtures = require('./fixtures'); |
|
|
|
describe('hpack/compressor', function() { |
|
var comp; |
|
|
|
beforeEach(function() { |
|
comp = hpack.compressor.create({ |
|
table: { |
|
maxSize: 1024 |
|
} |
|
}); |
|
}); |
|
|
|
function expect(arr, enc) { |
|
function isNumber(num) { |
|
return typeof num === 'number'; |
|
} |
|
|
|
var out = comp.read().toString('hex'); |
|
if (Array.isArray(arr) && !arr.every(isNumber)) { |
|
arr = arr.map(function(item) { |
|
return new Buffer(item, enc); |
|
}); |
|
arr = Buffer.concat(arr); |
|
} else { |
|
arr = new Buffer(arr, enc); |
|
} |
|
var actual = arr.toString('hex'); |
|
assert.equal(out, actual); |
|
} |
|
|
|
describe('indexed field', function() { |
|
it('should lookup entry from static table', function() { |
|
comp.write([{ name: ':method', value: 'GET' }]); |
|
expect([ 0b10000000 | 2 ]); |
|
}); |
|
|
|
it('should fetch entry from the end of the static table', function() { |
|
comp.write([{ name: 'www-authenticate', value: '' }]); |
|
expect([ 0b10000000 | 61 ]); |
|
}); |
|
}); |
|
|
|
describe('literal field', function() { |
|
it('should lookup name in the table (incremental)', function() { |
|
comp.write([{ name: 'host', value: 'localhost' }]); |
|
expect('6686a0e41d139d09', 'hex'); |
|
|
|
comp.write([{ name: 'host', value: 'localhost' }]); |
|
expect([ 0b10000000 | 62 ]); |
|
}); |
|
|
|
it('should lookup name in the table (not-incremental)', function() { |
|
comp.write([{ name: 'host', value: 'localhost', incremental: false }]); |
|
expect('0f1786a0e41d139d09', 'hex'); |
|
|
|
// Should not use the table |
|
comp.write([{ name: 'host', value: 'localhost' }]); |
|
expect('6686a0e41d139d09', 'hex'); |
|
}); |
|
|
|
it('should evict header field from the table', function() { |
|
for (var i = 0; i < 1000; i++) { |
|
comp.write([{ name: 'host', value: 'localhost' + i }]); |
|
comp.read(); |
|
} |
|
|
|
assert(comp._table.size < comp._table.maxSize); |
|
assert.equal(comp._table.dynamic.length, 21); |
|
}); |
|
}); |
|
|
|
describe('update size', function() { |
|
it('should evict header field from the table', function() { |
|
comp.write([{ name: 'host', value: 'localhost' }]); |
|
expect('6686a0e41d139d09', 'hex'); |
|
|
|
comp.reset(); |
|
|
|
// update=0, update=maxSize |
|
expect('203fe107', 'hex'); |
|
|
|
comp.write([{ name: 'host', value: 'localhost' }]); |
|
expect('6686a0e41d139d09', 'hex'); |
|
}); |
|
|
|
it('should send dynamic update if size >= protocolMaxSize', function() { |
|
comp.updateTableSize(Infinity); |
|
|
|
// update=maxSize |
|
expect('3fe107', 'hex'); |
|
}); |
|
}); |
|
|
|
describe('spec examples', function() { |
|
beforeEach(function() { |
|
comp = hpack.compressor.create({ |
|
table: { |
|
maxSize: 256 |
|
} |
|
}); |
|
}); |
|
|
|
var tests = fixtures.specExamples; |
|
|
|
tests.forEach(function(test, i) { |
|
var prev = tests[i - 1]; |
|
it('should give expected output on ' + test.id, function() { |
|
var startFrom = test.continuation ? prev.comp : comp; |
|
if (!startFrom) |
|
throw new Error('Previous test failed'); |
|
comp = startFrom; |
|
|
|
comp.write(test.output.map(function(pair) { |
|
return { name: pair[0], value: pair[1], huffman: test.huffman }; |
|
})); |
|
expect(test.input.replace(/ /g, ''), 'hex'); |
|
|
|
// Verify table contents |
|
assert.deepEqual(comp._table.dynamic.map(function(header) { |
|
return [ header.name, header.value, header.totalSize ]; |
|
}).reverse(), test.table); |
|
|
|
// Verify table size |
|
var expectedSize = test.table.reduce(function(acc, item) { |
|
return acc + item[2]; |
|
}, 0); |
|
assert.equal(comp._table.size, expectedSize); |
|
|
|
test.comp = comp; |
|
}); |
|
}); |
|
}); |
|
});
|
|
|