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